From b9b623e3e67ac8dc30fd6a80103e24a7084b3278 Mon Sep 17 00:00:00 2001 From: wartana Date: Sat, 31 Jan 2026 18:07:38 +0800 Subject: [PATCH] build: Install Python dependencies and initialize the virtual environment. --- audit_report.txt | 610 ++ audit_users.py | 92 + config.example.json | 27 + config.json | 50 + config.json.bak | 25 + not_used/test_billing_tools.py | 80 + requirements.txt | 4 + run_server.sh | 5 + src/__pycache__/billing.cpython-311.pyc | Bin 0 -> 21533 bytes src/__pycache__/server.cpython-311.pyc | Bin 0 -> 13124 bytes src/billing.py | 385 + src/server.py | 317 + test_billing_real.py | 112 + venv/bin/Activate.ps1 | 247 + venv/bin/activate | 69 + venv/bin/activate.csh | 26 + venv/bin/activate.fish | 69 + venv/bin/dotenv | 8 + venv/bin/httpx | 8 + venv/bin/jsonschema | 8 + venv/bin/mcp | 8 + venv/bin/normalizer | 8 + venv/bin/pip | 8 + venv/bin/pip3 | 8 + venv/bin/pip3.11 | 8 + venv/bin/python | 1 + venv/bin/python3 | 1 + venv/bin/python3.11 | 1 + venv/bin/uvicorn | 8 + .../PyJWT-2.10.1.dist-info/AUTHORS.rst | 7 + .../PyJWT-2.10.1.dist-info/INSTALLER | 1 + .../PyJWT-2.10.1.dist-info/LICENSE | 21 + .../PyJWT-2.10.1.dist-info/METADATA | 106 + .../PyJWT-2.10.1.dist-info/RECORD | 32 + .../PyJWT-2.10.1.dist-info/WHEEL | 5 + .../PyJWT-2.10.1.dist-info/top_level.txt | 1 + .../typing_extensions.cpython-311.pyc | Bin 0 -> 179469 bytes ...fi_backend.cpython-311-x86_64-linux-gnu.so | Bin 0 -> 332440 bytes .../site-packages/_distutils_hack/__init__.py | 222 + .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 11167 bytes .../__pycache__/override.cpython-311.pyc | Bin 0 -> 324 bytes .../site-packages/_distutils_hack/override.py | 1 + .../annotated_types-0.7.0.dist-info/INSTALLER | 1 + .../annotated_types-0.7.0.dist-info/METADATA | 295 + .../annotated_types-0.7.0.dist-info/RECORD | 10 + .../annotated_types-0.7.0.dist-info/WHEEL | 4 + .../licenses/LICENSE | 21 + .../site-packages/annotated_types/__init__.py | 432 + .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 20569 bytes .../__pycache__/test_cases.cpython-311.pyc | Bin 0 -> 15460 bytes .../site-packages/annotated_types/py.typed | 0 .../annotated_types/test_cases.py | 151 + .../anyio-4.12.1.dist-info/INSTALLER | 1 + .../anyio-4.12.1.dist-info/METADATA | 96 + .../anyio-4.12.1.dist-info/RECORD | 92 + .../anyio-4.12.1.dist-info/WHEEL | 5 + .../anyio-4.12.1.dist-info/entry_points.txt | 2 + .../anyio-4.12.1.dist-info/licenses/LICENSE | 20 + .../anyio-4.12.1.dist-info/top_level.txt | 1 + .../site-packages/anyio/__init__.py | 111 + .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 6049 bytes .../__pycache__/from_thread.cpython-311.pyc | Bin 0 -> 27964 bytes .../__pycache__/functools.cpython-311.pyc | Bin 0 -> 17204 bytes .../__pycache__/lowlevel.cpython-311.pyc | Bin 0 -> 8803 bytes .../__pycache__/pytest_plugin.cpython-311.pyc | Bin 0 -> 16343 bytes .../to_interpreter.cpython-311.pyc | Bin 0 -> 11443 bytes .../__pycache__/to_process.cpython-311.pyc | Bin 0 -> 13822 bytes .../__pycache__/to_thread.cpython-311.pyc | Bin 0 -> 3454 bytes .../site-packages/anyio/_backends/__init__.py | 0 .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 202 bytes .../__pycache__/_asyncio.cpython-311.pyc | Bin 0 -> 152947 bytes .../__pycache__/_trio.cpython-311.pyc | Bin 0 -> 79242 bytes .../site-packages/anyio/_backends/_asyncio.py | 2980 ++++++ .../site-packages/anyio/_backends/_trio.py | 1346 +++ .../site-packages/anyio/_core/__init__.py | 0 .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 198 bytes .../_asyncio_selector_thread.cpython-311.pyc | Bin 0 -> 9096 bytes .../_contextmanagers.cpython-311.pyc | Bin 0 -> 9682 bytes .../__pycache__/_eventloop.cpython-311.pyc | Bin 0 -> 9133 bytes .../__pycache__/_exceptions.cpython-311.pyc | Bin 0 -> 8857 bytes .../_core/__pycache__/_fileio.cpython-311.pyc | Bin 0 -> 44062 bytes .../__pycache__/_resources.cpython-311.pyc | Bin 0 -> 1122 bytes .../__pycache__/_signals.cpython-311.pyc | Bin 0 -> 1478 bytes .../__pycache__/_sockets.cpython-311.pyc | Bin 0 -> 42663 bytes .../__pycache__/_streams.cpython-311.pyc | Bin 0 -> 2664 bytes .../__pycache__/_subprocesses.cpython-311.pyc | Bin 0 -> 9829 bytes .../_synchronization.cpython-311.pyc | Bin 0 -> 36579 bytes .../_core/__pycache__/_tasks.cpython-311.pyc | Bin 0 -> 8422 bytes .../__pycache__/_tempfile.cpython-311.pyc | Bin 0 -> 28603 bytes .../__pycache__/_testing.cpython-311.pyc | Bin 0 -> 4100 bytes .../__pycache__/_typedattr.cpython-311.pyc | Bin 0 -> 4420 bytes .../anyio/_core/_asyncio_selector_thread.py | 167 + .../anyio/_core/_contextmanagers.py | 200 + .../site-packages/anyio/_core/_eventloop.py | 234 + .../site-packages/anyio/_core/_exceptions.py | 156 + .../site-packages/anyio/_core/_fileio.py | 797 ++ .../site-packages/anyio/_core/_resources.py | 18 + .../site-packages/anyio/_core/_signals.py | 29 + .../site-packages/anyio/_core/_sockets.py | 1003 ++ .../site-packages/anyio/_core/_streams.py | 52 + .../anyio/_core/_subprocesses.py | 202 + .../anyio/_core/_synchronization.py | 753 ++ .../site-packages/anyio/_core/_tasks.py | 173 + .../site-packages/anyio/_core/_tempfile.py | 616 ++ .../site-packages/anyio/_core/_testing.py | 82 + .../site-packages/anyio/_core/_typedattr.py | 81 + .../site-packages/anyio/abc/__init__.py | 58 + .../abc/__pycache__/__init__.cpython-311.pyc | Bin 0 -> 3084 bytes .../__pycache__/_eventloop.cpython-311.pyc | Bin 0 -> 18254 bytes .../__pycache__/_resources.cpython-311.pyc | Bin 0 -> 1830 bytes .../abc/__pycache__/_sockets.cpython-311.pyc | Bin 0 -> 20272 bytes .../abc/__pycache__/_streams.cpython-311.pyc | Bin 0 -> 11336 bytes .../__pycache__/_subprocesses.cpython-311.pyc | Bin 0 -> 3677 bytes .../abc/__pycache__/_tasks.cpython-311.pyc | Bin 0 -> 5643 bytes .../abc/__pycache__/_testing.cpython-311.pyc | Bin 0 -> 3038 bytes .../site-packages/anyio/abc/_eventloop.py | 414 + .../site-packages/anyio/abc/_resources.py | 33 + .../site-packages/anyio/abc/_sockets.py | 405 + .../site-packages/anyio/abc/_streams.py | 239 + .../site-packages/anyio/abc/_subprocesses.py | 79 + .../site-packages/anyio/abc/_tasks.py | 117 + .../site-packages/anyio/abc/_testing.py | 65 + .../site-packages/anyio/from_thread.py | 578 ++ .../site-packages/anyio/functools.py | 375 + .../site-packages/anyio/lowlevel.py | 196 + .../python3.11/site-packages/anyio/py.typed | 0 .../site-packages/anyio/pytest_plugin.py | 302 + .../site-packages/anyio/streams/__init__.py | 0 .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 200 bytes .../__pycache__/buffered.cpython-311.pyc | Bin 0 -> 9893 bytes .../streams/__pycache__/file.cpython-311.pyc | Bin 0 -> 8180 bytes .../__pycache__/memory.cpython-311.pyc | Bin 0 -> 16048 bytes .../__pycache__/stapled.cpython-311.pyc | Bin 0 -> 8306 bytes .../streams/__pycache__/text.cpython-311.pyc | Bin 0 -> 10227 bytes .../streams/__pycache__/tls.cpython-311.pyc | Bin 0 -> 21234 bytes .../site-packages/anyio/streams/buffered.py | 188 + .../site-packages/anyio/streams/file.py | 154 + .../site-packages/anyio/streams/memory.py | 325 + .../site-packages/anyio/streams/stapled.py | 147 + .../site-packages/anyio/streams/text.py | 176 + .../site-packages/anyio/streams/tls.py | 424 + .../site-packages/anyio/to_interpreter.py | 246 + .../site-packages/anyio/to_process.py | 266 + .../site-packages/anyio/to_thread.py | 78 + .../python3.11/site-packages/attr/__init__.py | 104 + .../site-packages/attr/__init__.pyi | 389 + .../attr/__pycache__/__init__.cpython-311.pyc | Bin 0 -> 3116 bytes .../attr/__pycache__/_cmp.cpython-311.pyc | Bin 0 -> 5371 bytes .../attr/__pycache__/_compat.cpython-311.pyc | Bin 0 -> 3739 bytes .../attr/__pycache__/_config.cpython-311.pyc | Bin 0 -> 1180 bytes .../attr/__pycache__/_funcs.cpython-311.pyc | Bin 0 -> 15796 bytes .../attr/__pycache__/_make.cpython-311.pyc | Bin 0 -> 117331 bytes .../__pycache__/_next_gen.cpython-311.pyc | Bin 0 -> 26978 bytes .../__pycache__/_version_info.cpython-311.pyc | Bin 0 -> 3898 bytes .../__pycache__/converters.cpython-311.pyc | Bin 0 -> 5040 bytes .../__pycache__/exceptions.cpython-311.pyc | Bin 0 -> 4162 bytes .../attr/__pycache__/filters.cpython-311.pyc | Bin 0 -> 3194 bytes .../attr/__pycache__/setters.cpython-311.pyc | Bin 0 -> 2079 bytes .../__pycache__/validators.cpython-311.pyc | Bin 0 -> 29858 bytes .../lib/python3.11/site-packages/attr/_cmp.py | 160 + .../python3.11/site-packages/attr/_cmp.pyi | 13 + .../python3.11/site-packages/attr/_compat.py | 99 + .../python3.11/site-packages/attr/_config.py | 31 + .../python3.11/site-packages/attr/_funcs.py | 497 + .../python3.11/site-packages/attr/_make.py | 3362 +++++++ .../site-packages/attr/_next_gen.py | 674 ++ .../site-packages/attr/_typing_compat.pyi | 15 + .../site-packages/attr/_version_info.py | 89 + .../site-packages/attr/_version_info.pyi | 9 + .../site-packages/attr/converters.py | 162 + .../site-packages/attr/converters.pyi | 19 + .../site-packages/attr/exceptions.py | 95 + .../site-packages/attr/exceptions.pyi | 17 + .../python3.11/site-packages/attr/filters.py | 72 + .../python3.11/site-packages/attr/filters.pyi | 6 + .../python3.11/site-packages/attr/py.typed | 0 .../python3.11/site-packages/attr/setters.py | 79 + .../python3.11/site-packages/attr/setters.pyi | 20 + .../site-packages/attr/validators.py | 748 ++ .../site-packages/attr/validators.pyi | 140 + .../attrs-25.4.0.dist-info/INSTALLER | 1 + .../attrs-25.4.0.dist-info/METADATA | 235 + .../attrs-25.4.0.dist-info/RECORD | 55 + .../attrs-25.4.0.dist-info/WHEEL | 4 + .../attrs-25.4.0.dist-info/licenses/LICENSE | 21 + .../site-packages/attrs/__init__.py | 72 + .../site-packages/attrs/__init__.pyi | 314 + .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 1505 bytes .../__pycache__/converters.cpython-311.pyc | Bin 0 -> 236 bytes .../__pycache__/exceptions.cpython-311.pyc | Bin 0 -> 236 bytes .../attrs/__pycache__/filters.cpython-311.pyc | Bin 0 -> 230 bytes .../attrs/__pycache__/setters.cpython-311.pyc | Bin 0 -> 230 bytes .../__pycache__/validators.cpython-311.pyc | Bin 0 -> 236 bytes .../site-packages/attrs/converters.py | 3 + .../site-packages/attrs/exceptions.py | 3 + .../python3.11/site-packages/attrs/filters.py | 3 + .../python3.11/site-packages/attrs/py.typed | 0 .../python3.11/site-packages/attrs/setters.py | 3 + .../site-packages/attrs/validators.py | 3 + .../certifi-2026.1.4.dist-info/INSTALLER | 1 + .../certifi-2026.1.4.dist-info/METADATA | 78 + .../certifi-2026.1.4.dist-info/RECORD | 14 + .../certifi-2026.1.4.dist-info/WHEEL | 5 + .../licenses/LICENSE | 20 + .../certifi-2026.1.4.dist-info/top_level.txt | 1 + .../site-packages/certifi/__init__.py | 4 + .../site-packages/certifi/__main__.py | 12 + .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 336 bytes .../__pycache__/__main__.cpython-311.pyc | Bin 0 -> 725 bytes .../certifi/__pycache__/core.cpython-311.pyc | Bin 0 -> 2395 bytes .../site-packages/certifi/cacert.pem | 4468 +++++++++ .../python3.11/site-packages/certifi/core.py | 83 + .../python3.11/site-packages/certifi/py.typed | 0 .../cffi-2.0.0.dist-info/INSTALLER | 1 + .../cffi-2.0.0.dist-info/METADATA | 68 + .../site-packages/cffi-2.0.0.dist-info/RECORD | 49 + .../site-packages/cffi-2.0.0.dist-info/WHEEL | 6 + .../cffi-2.0.0.dist-info/entry_points.txt | 2 + .../cffi-2.0.0.dist-info/licenses/AUTHORS | 8 + .../cffi-2.0.0.dist-info/licenses/LICENSE | 23 + .../cffi-2.0.0.dist-info/top_level.txt | 2 + .../python3.11/site-packages/cffi/__init__.py | 14 + .../cffi/__pycache__/__init__.cpython-311.pyc | Bin 0 -> 625 bytes .../_imp_emulation.cpython-311.pyc | Bin 0 -> 4711 bytes .../_shimmed_dist_utils.cpython-311.pyc | Bin 0 -> 2317 bytes .../cffi/__pycache__/api.cpython-311.pyc | Bin 0 -> 55621 bytes .../backend_ctypes.cpython-311.pyc | Bin 0 -> 71906 bytes .../__pycache__/cffi_opcode.cpython-311.pyc | Bin 0 -> 7139 bytes .../__pycache__/commontypes.cpython-311.pyc | Bin 0 -> 3301 bytes .../cffi/__pycache__/cparser.cpython-311.pyc | Bin 0 -> 50052 bytes .../cffi/__pycache__/error.cpython-311.pyc | Bin 0 -> 2124 bytes .../__pycache__/ffiplatform.cpython-311.pyc | Bin 0 -> 6619 bytes .../cffi/__pycache__/lock.cpython-311.pyc | Bin 0 -> 636 bytes .../cffi/__pycache__/model.cpython-311.pyc | Bin 0 -> 33881 bytes .../__pycache__/pkgconfig.cpython-311.pyc | Bin 0 -> 8131 bytes .../__pycache__/recompiler.cpython-311.pyc | Bin 0 -> 90458 bytes .../setuptools_ext.cpython-311.pyc | Bin 0 -> 13239 bytes .../__pycache__/vengine_cpy.cpython-311.pyc | Bin 0 -> 57445 bytes .../__pycache__/vengine_gen.cpython-311.pyc | Bin 0 -> 38354 bytes .../cffi/__pycache__/verifier.cpython-311.pyc | Bin 0 -> 18088 bytes .../site-packages/cffi/_cffi_errors.h | 149 + .../site-packages/cffi/_cffi_include.h | 389 + .../site-packages/cffi/_embedding.h | 550 + .../site-packages/cffi/_imp_emulation.py | 83 + .../site-packages/cffi/_shimmed_dist_utils.py | 45 + venv/lib/python3.11/site-packages/cffi/api.py | 967 ++ .../site-packages/cffi/backend_ctypes.py | 1121 +++ .../site-packages/cffi/cffi_opcode.py | 187 + .../site-packages/cffi/commontypes.py | 82 + .../python3.11/site-packages/cffi/cparser.py | 1015 ++ .../python3.11/site-packages/cffi/error.py | 31 + .../site-packages/cffi/ffiplatform.py | 113 + .../lib/python3.11/site-packages/cffi/lock.py | 30 + .../python3.11/site-packages/cffi/model.py | 618 ++ .../site-packages/cffi/parse_c_type.h | 181 + .../site-packages/cffi/pkgconfig.py | 121 + .../site-packages/cffi/recompiler.py | 1598 +++ .../site-packages/cffi/setuptools_ext.py | 229 + .../site-packages/cffi/vengine_cpy.py | 1087 ++ .../site-packages/cffi/vengine_gen.py | 679 ++ .../python3.11/site-packages/cffi/verifier.py | 306 + .../INSTALLER | 1 + .../METADATA | 764 ++ .../charset_normalizer-3.4.4.dist-info/RECORD | 35 + .../charset_normalizer-3.4.4.dist-info/WHEEL | 7 + .../entry_points.txt | 2 + .../licenses/LICENSE | 21 + .../top_level.txt | 1 + .../charset_normalizer/__init__.py | 48 + .../charset_normalizer/__main__.py | 6 + .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 1917 bytes .../__pycache__/__main__.cpython-311.pyc | Bin 0 -> 408 bytes .../__pycache__/api.cpython-311.pyc | Bin 0 -> 20799 bytes .../__pycache__/cd.cpython-311.pyc | Bin 0 -> 15882 bytes .../__pycache__/constant.cpython-311.pyc | Bin 0 -> 45733 bytes .../__pycache__/legacy.cpython-311.pyc | Bin 0 -> 3359 bytes .../__pycache__/md.cpython-311.pyc | Bin 0 -> 27553 bytes .../__pycache__/models.cpython-311.pyc | Bin 0 -> 18572 bytes .../__pycache__/utils.cpython-311.pyc | Bin 0 -> 15665 bytes .../__pycache__/version.cpython-311.pyc | Bin 0 -> 414 bytes .../site-packages/charset_normalizer/api.py | 669 ++ .../site-packages/charset_normalizer/cd.py | 395 + .../charset_normalizer/cli/__init__.py | 8 + .../charset_normalizer/cli/__main__.py | 381 + .../cli/__pycache__/__init__.cpython-311.pyc | Bin 0 -> 380 bytes .../cli/__pycache__/__main__.cpython-311.pyc | Bin 0 -> 15998 bytes .../charset_normalizer/constant.py | 2015 ++++ .../charset_normalizer/legacy.py | 80 + .../md.cpython-311-x86_64-linux-gnu.so | Bin 0 -> 15912 bytes .../site-packages/charset_normalizer/md.py | 635 ++ .../md__mypyc.cpython-311-x86_64-linux-gnu.so | Bin 0 -> 282232 bytes .../charset_normalizer/models.py | 360 + .../site-packages/charset_normalizer/py.typed | 0 .../site-packages/charset_normalizer/utils.py | 414 + .../charset_normalizer/version.py | 8 + .../click-8.3.1.dist-info/INSTALLER | 1 + .../click-8.3.1.dist-info/METADATA | 84 + .../click-8.3.1.dist-info/RECORD | 40 + .../site-packages/click-8.3.1.dist-info/WHEEL | 4 + .../licenses/LICENSE.txt | 28 + .../site-packages/click/__init__.py | 123 + .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 5238 bytes .../click/__pycache__/_compat.cpython-311.pyc | Bin 0 -> 26145 bytes .../__pycache__/_termui_impl.cpython-311.pyc | Bin 0 -> 34608 bytes .../__pycache__/_textwrap.cpython-311.pyc | Bin 0 -> 2651 bytes .../click/__pycache__/_utils.cpython-311.pyc | Bin 0 -> 1251 bytes .../__pycache__/_winconsole.cpython-311.pyc | Bin 0 -> 13656 bytes .../click/__pycache__/core.cpython-311.pyc | Bin 0 -> 143417 bytes .../__pycache__/decorators.cpython-311.pyc | Bin 0 -> 23768 bytes .../__pycache__/exceptions.cpython-311.pyc | Bin 0 -> 16729 bytes .../__pycache__/formatting.cpython-311.pyc | Bin 0 -> 15324 bytes .../click/__pycache__/globals.cpython-311.pyc | Bin 0 -> 3273 bytes .../click/__pycache__/parser.cpython-311.pyc | Bin 0 -> 22534 bytes .../shell_completion.cpython-311.pyc | Bin 0 -> 25223 bytes .../click/__pycache__/termui.cpython-311.pyc | Bin 0 -> 35749 bytes .../click/__pycache__/testing.cpython-311.pyc | Bin 0 -> 29516 bytes .../click/__pycache__/types.cpython-311.pyc | Bin 0 -> 55401 bytes .../click/__pycache__/utils.cpython-311.pyc | Bin 0 -> 26877 bytes .../python3.11/site-packages/click/_compat.py | 622 ++ .../site-packages/click/_termui_impl.py | 852 ++ .../site-packages/click/_textwrap.py | 51 + .../python3.11/site-packages/click/_utils.py | 36 + .../site-packages/click/_winconsole.py | 296 + .../python3.11/site-packages/click/core.py | 3415 +++++++ .../site-packages/click/decorators.py | 551 + .../site-packages/click/exceptions.py | 308 + .../site-packages/click/formatting.py | 301 + .../python3.11/site-packages/click/globals.py | 67 + .../python3.11/site-packages/click/parser.py | 532 + .../python3.11/site-packages/click/py.typed | 0 .../site-packages/click/shell_completion.py | 667 ++ .../python3.11/site-packages/click/termui.py | 883 ++ .../python3.11/site-packages/click/testing.py | 577 ++ .../python3.11/site-packages/click/types.py | 1209 +++ .../python3.11/site-packages/click/utils.py | 627 ++ .../cryptography-46.0.3.dist-info/INSTALLER | 1 + .../cryptography-46.0.3.dist-info/METADATA | 139 + .../cryptography-46.0.3.dist-info/RECORD | 180 + .../cryptography-46.0.3.dist-info/WHEEL | 5 + .../licenses/LICENSE | 3 + .../licenses/LICENSE.APACHE | 202 + .../licenses/LICENSE.BSD | 27 + .../site-packages/cryptography/__about__.py | 17 + .../site-packages/cryptography/__init__.py | 13 + .../__pycache__/__about__.cpython-311.pyc | Bin 0 -> 491 bytes .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 424 bytes .../__pycache__/exceptions.cpython-311.pyc | Bin 0 -> 2968 bytes .../__pycache__/fernet.cpython-311.pyc | Bin 0 -> 12353 bytes .../__pycache__/utils.cpython-311.pyc | Bin 0 -> 7389 bytes .../site-packages/cryptography/exceptions.py | 52 + .../site-packages/cryptography/fernet.py | 224 + .../cryptography/hazmat/__init__.py | 13 + .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 272 bytes .../hazmat/__pycache__/_oid.cpython-311.pyc | Bin 0 -> 21664 bytes .../site-packages/cryptography/hazmat/_oid.py | 356 + .../cryptography/hazmat/asn1/__init__.py | 10 + .../asn1/__pycache__/__init__.cpython-311.pyc | Bin 0 -> 356 bytes .../asn1/__pycache__/asn1.cpython-311.pyc | Bin 0 -> 3865 bytes .../cryptography/hazmat/asn1/asn1.py | 116 + .../cryptography/hazmat/backends/__init__.py | 13 + .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 582 bytes .../hazmat/backends/openssl/__init__.py | 9 + .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 402 bytes .../__pycache__/backend.cpython-311.pyc | Bin 0 -> 13826 bytes .../hazmat/backends/openssl/backend.py | 302 + .../cryptography/hazmat/bindings/__init__.py | 3 + .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 215 bytes .../hazmat/bindings/_rust.abi3.so | Bin 0 -> 12955672 bytes .../hazmat/bindings/_rust/__init__.pyi | 37 + .../hazmat/bindings/_rust/_openssl.pyi | 8 + .../hazmat/bindings/_rust/asn1.pyi | 7 + .../bindings/_rust/declarative_asn1.pyi | 32 + .../hazmat/bindings/_rust/exceptions.pyi | 17 + .../hazmat/bindings/_rust/ocsp.pyi | 117 + .../bindings/_rust/openssl/__init__.pyi | 75 + .../hazmat/bindings/_rust/openssl/aead.pyi | 107 + .../hazmat/bindings/_rust/openssl/ciphers.pyi | 38 + .../hazmat/bindings/_rust/openssl/cmac.pyi | 18 + .../hazmat/bindings/_rust/openssl/dh.pyi | 51 + .../hazmat/bindings/_rust/openssl/dsa.pyi | 41 + .../hazmat/bindings/_rust/openssl/ec.pyi | 52 + .../hazmat/bindings/_rust/openssl/ed25519.pyi | 13 + .../hazmat/bindings/_rust/openssl/ed448.pyi | 13 + .../hazmat/bindings/_rust/openssl/hashes.pyi | 28 + .../hazmat/bindings/_rust/openssl/hmac.pyi | 22 + .../hazmat/bindings/_rust/openssl/kdf.pyi | 72 + .../hazmat/bindings/_rust/openssl/keys.pyi | 34 + .../bindings/_rust/openssl/poly1305.pyi | 15 + .../hazmat/bindings/_rust/openssl/rsa.pyi | 55 + .../hazmat/bindings/_rust/openssl/x25519.pyi | 13 + .../hazmat/bindings/_rust/openssl/x448.pyi | 13 + .../hazmat/bindings/_rust/pkcs12.pyi | 52 + .../hazmat/bindings/_rust/pkcs7.pyi | 50 + .../hazmat/bindings/_rust/test_support.pyi | 23 + .../hazmat/bindings/_rust/x509.pyi | 301 + .../hazmat/bindings/openssl/__init__.py | 3 + .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 223 bytes .../__pycache__/_conditional.cpython-311.pyc | Bin 0 -> 6195 bytes .../__pycache__/binding.cpython-311.pyc | Bin 0 -> 6255 bytes .../hazmat/bindings/openssl/_conditional.py | 207 + .../hazmat/bindings/openssl/binding.py | 137 + .../cryptography/hazmat/decrepit/__init__.py | 5 + .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 277 bytes .../hazmat/decrepit/ciphers/__init__.py | 5 + .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 285 bytes .../__pycache__/algorithms.cpython-311.pyc | Bin 0 -> 5895 bytes .../hazmat/decrepit/ciphers/algorithms.py | 112 + .../hazmat/primitives/__init__.py | 3 + .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 217 bytes .../__pycache__/_asymmetric.cpython-311.pyc | Bin 0 -> 923 bytes .../_cipheralgorithm.cpython-311.pyc | Bin 0 -> 2764 bytes .../_serialization.cpython-311.pyc | Bin 0 -> 7717 bytes .../__pycache__/cmac.cpython-311.pyc | Bin 0 -> 443 bytes .../__pycache__/constant_time.cpython-311.pyc | Bin 0 -> 789 bytes .../__pycache__/hashes.cpython-311.pyc | Bin 0 -> 9616 bytes .../__pycache__/hmac.cpython-311.pyc | Bin 0 -> 620 bytes .../__pycache__/keywrap.cpython-311.pyc | Bin 0 -> 9146 bytes .../__pycache__/padding.cpython-311.pyc | Bin 0 -> 3818 bytes .../__pycache__/poly1305.cpython-311.pyc | Bin 0 -> 455 bytes .../hazmat/primitives/_asymmetric.py | 19 + .../hazmat/primitives/_cipheralgorithm.py | 60 + .../hazmat/primitives/_serialization.py | 168 + .../hazmat/primitives/asymmetric/__init__.py | 3 + .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 228 bytes .../asymmetric/__pycache__/dh.cpython-311.pyc | Bin 0 -> 6329 bytes .../__pycache__/dsa.cpython-311.pyc | Bin 0 -> 7239 bytes .../asymmetric/__pycache__/ec.cpython-311.pyc | Bin 0 -> 19839 bytes .../__pycache__/ed25519.cpython-311.pyc | Bin 0 -> 6043 bytes .../__pycache__/ed448.cpython-311.pyc | Bin 0 -> 6128 bytes .../__pycache__/padding.cpython-311.pyc | Bin 0 -> 5563 bytes .../__pycache__/rsa.cpython-311.pyc | Bin 0 -> 11135 bytes .../__pycache__/types.cpython-311.pyc | Bin 0 -> 2816 bytes .../__pycache__/utils.cpython-311.pyc | Bin 0 -> 1469 bytes .../__pycache__/x25519.cpython-311.pyc | Bin 0 -> 5822 bytes .../__pycache__/x448.cpython-311.pyc | Bin 0 -> 5902 bytes .../hazmat/primitives/asymmetric/dh.py | 147 + .../hazmat/primitives/asymmetric/dsa.py | 167 + .../hazmat/primitives/asymmetric/ec.py | 447 + .../hazmat/primitives/asymmetric/ed25519.py | 129 + .../hazmat/primitives/asymmetric/ed448.py | 131 + .../hazmat/primitives/asymmetric/padding.py | 111 + .../hazmat/primitives/asymmetric/rsa.py | 285 + .../hazmat/primitives/asymmetric/types.py | 111 + .../hazmat/primitives/asymmetric/utils.py | 24 + .../hazmat/primitives/asymmetric/x25519.py | 122 + .../hazmat/primitives/asymmetric/x448.py | 125 + .../hazmat/primitives/ciphers/__init__.py | 27 + .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 770 bytes .../ciphers/__pycache__/aead.cpython-311.pyc | Bin 0 -> 724 bytes .../__pycache__/algorithms.cpython-311.pyc | Bin 0 -> 5882 bytes .../ciphers/__pycache__/base.cpython-311.pyc | Bin 0 -> 7474 bytes .../ciphers/__pycache__/modes.cpython-311.pyc | Bin 0 -> 13249 bytes .../hazmat/primitives/ciphers/aead.py | 23 + .../hazmat/primitives/ciphers/algorithms.py | 136 + .../hazmat/primitives/ciphers/base.py | 146 + .../hazmat/primitives/ciphers/modes.py | 268 + .../cryptography/hazmat/primitives/cmac.py | 10 + .../hazmat/primitives/constant_time.py | 14 + .../cryptography/hazmat/primitives/hashes.py | 246 + .../cryptography/hazmat/primitives/hmac.py | 13 + .../hazmat/primitives/kdf/__init__.py | 23 + .../kdf/__pycache__/__init__.cpython-311.pyc | Bin 0 -> 1379 bytes .../kdf/__pycache__/argon2.cpython-311.pyc | Bin 0 -> 610 bytes .../kdf/__pycache__/concatkdf.cpython-311.pyc | Bin 0 -> 6145 bytes .../kdf/__pycache__/hkdf.cpython-311.pyc | Bin 0 -> 713 bytes .../kdf/__pycache__/kbkdf.cpython-311.pyc | Bin 0 -> 12211 bytes .../kdf/__pycache__/pbkdf2.cpython-311.pyc | Bin 0 -> 3019 bytes .../kdf/__pycache__/scrypt.cpython-311.pyc | Bin 0 -> 690 bytes .../kdf/__pycache__/x963kdf.cpython-311.pyc | Bin 0 -> 3471 bytes .../hazmat/primitives/kdf/argon2.py | 13 + .../hazmat/primitives/kdf/concatkdf.py | 125 + .../hazmat/primitives/kdf/hkdf.py | 16 + .../hazmat/primitives/kdf/kbkdf.py | 303 + .../hazmat/primitives/kdf/pbkdf2.py | 62 + .../hazmat/primitives/kdf/scrypt.py | 19 + .../hazmat/primitives/kdf/x963kdf.py | 61 + .../cryptography/hazmat/primitives/keywrap.py | 177 + .../cryptography/hazmat/primitives/padding.py | 69 + .../hazmat/primitives/poly1305.py | 11 + .../primitives/serialization/__init__.py | 65 + .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 1680 bytes .../__pycache__/base.cpython-311.pyc | Bin 0 -> 718 bytes .../__pycache__/pkcs12.cpython-311.pyc | Bin 0 -> 6887 bytes .../__pycache__/pkcs7.cpython-311.pyc | Bin 0 -> 18228 bytes .../__pycache__/ssh.cpython-311.pyc | Bin 0 -> 73175 bytes .../hazmat/primitives/serialization/base.py | 14 + .../hazmat/primitives/serialization/pkcs12.py | 176 + .../hazmat/primitives/serialization/pkcs7.py | 411 + .../hazmat/primitives/serialization/ssh.py | 1619 +++ .../hazmat/primitives/twofactor/__init__.py | 9 + .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 533 bytes .../__pycache__/hotp.cpython-311.pyc | Bin 0 -> 5711 bytes .../__pycache__/totp.cpython-311.pyc | Bin 0 -> 2838 bytes .../hazmat/primitives/twofactor/hotp.py | 101 + .../hazmat/primitives/twofactor/totp.py | 56 + .../site-packages/cryptography/py.typed | 0 .../site-packages/cryptography/utils.py | 137 + .../cryptography/x509/__init__.py | 270 + .../x509/__pycache__/__init__.cpython-311.pyc | Bin 0 -> 8451 bytes .../x509/__pycache__/base.cpython-311.pyc | Bin 0 -> 34867 bytes .../certificate_transparency.cpython-311.pyc | Bin 0 -> 1573 bytes .../__pycache__/extensions.cpython-311.pyc | Bin 0 -> 122069 bytes .../__pycache__/general_name.cpython-311.pyc | Bin 0 -> 14629 bytes .../x509/__pycache__/name.cpython-311.pyc | Bin 0 -> 25831 bytes .../x509/__pycache__/ocsp.cpython-311.pyc | Bin 0 -> 15513 bytes .../x509/__pycache__/oid.cpython-311.pyc | Bin 0 -> 927 bytes .../__pycache__/verification.cpython-311.pyc | Bin 0 -> 965 bytes .../site-packages/cryptography/x509/base.py | 848 ++ .../x509/certificate_transparency.py | 35 + .../cryptography/x509/extensions.py | 2528 +++++ .../cryptography/x509/general_name.py | 281 + .../site-packages/cryptography/x509/name.py | 476 + .../site-packages/cryptography/x509/ocsp.py | 379 + .../site-packages/cryptography/x509/oid.py | 37 + .../cryptography/x509/verification.py | 34 + .../site-packages/distutils-precedence.pth | 1 + .../site-packages/dotenv/__init__.py | 51 + .../site-packages/dotenv/__main__.py | 6 + .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 2004 bytes .../__pycache__/__main__.cpython-311.pyc | Bin 0 -> 400 bytes .../dotenv/__pycache__/cli.cpython-311.pyc | Bin 0 -> 11400 bytes .../__pycache__/ipython.cpython-311.pyc | Bin 0 -> 2320 bytes .../dotenv/__pycache__/main.cpython-311.pyc | Bin 0 -> 20055 bytes .../dotenv/__pycache__/parser.cpython-311.pyc | Bin 0 -> 11347 bytes .../__pycache__/variables.cpython-311.pyc | Bin 0 -> 5534 bytes .../__pycache__/version.cpython-311.pyc | Bin 0 -> 212 bytes .../python3.11/site-packages/dotenv/cli.py | 218 + .../site-packages/dotenv/ipython.py | 50 + .../python3.11/site-packages/dotenv/main.py | 435 + .../python3.11/site-packages/dotenv/parser.py | 182 + .../python3.11/site-packages/dotenv/py.typed | 1 + .../site-packages/dotenv/variables.py | 86 + .../site-packages/dotenv/version.py | 1 + .../h11-0.16.0.dist-info/INSTALLER | 1 + .../h11-0.16.0.dist-info/METADATA | 202 + .../site-packages/h11-0.16.0.dist-info/RECORD | 29 + .../site-packages/h11-0.16.0.dist-info/WHEEL | 5 + .../h11-0.16.0.dist-info/licenses/LICENSE.txt | 22 + .../h11-0.16.0.dist-info/top_level.txt | 1 + .../python3.11/site-packages/h11/__init__.py | 62 + .../h11/__pycache__/__init__.cpython-311.pyc | Bin 0 -> 1323 bytes .../h11/__pycache__/_abnf.cpython-311.pyc | Bin 0 -> 1828 bytes .../__pycache__/_connection.cpython-311.pyc | Bin 0 -> 24957 bytes .../h11/__pycache__/_events.cpython-311.pyc | Bin 0 -> 15118 bytes .../h11/__pycache__/_headers.cpython-311.pyc | Bin 0 -> 9279 bytes .../h11/__pycache__/_readers.cpython-311.pyc | Bin 0 -> 11067 bytes .../_receivebuffer.cpython-311.pyc | Bin 0 -> 5155 bytes .../h11/__pycache__/_state.cpython-311.pyc | Bin 0 -> 9697 bytes .../h11/__pycache__/_util.cpython-311.pyc | Bin 0 -> 5376 bytes .../h11/__pycache__/_version.cpython-311.pyc | Bin 0 -> 213 bytes .../h11/__pycache__/_writers.cpython-311.pyc | Bin 0 -> 7313 bytes .../lib/python3.11/site-packages/h11/_abnf.py | 132 + .../site-packages/h11/_connection.py | 659 ++ .../python3.11/site-packages/h11/_events.py | 369 + .../python3.11/site-packages/h11/_headers.py | 282 + .../python3.11/site-packages/h11/_readers.py | 250 + .../site-packages/h11/_receivebuffer.py | 153 + .../python3.11/site-packages/h11/_state.py | 365 + .../lib/python3.11/site-packages/h11/_util.py | 135 + .../python3.11/site-packages/h11/_version.py | 16 + .../python3.11/site-packages/h11/_writers.py | 145 + .../lib/python3.11/site-packages/h11/py.typed | 1 + .../httpcore-1.0.9.dist-info/INSTALLER | 1 + .../httpcore-1.0.9.dist-info/METADATA | 625 ++ .../httpcore-1.0.9.dist-info/RECORD | 68 + .../httpcore-1.0.9.dist-info/WHEEL | 4 + .../licenses/LICENSE.md | 27 + .../site-packages/httpcore/__init__.py | 141 + .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 3934 bytes .../httpcore/__pycache__/_api.cpython-311.pyc | Bin 0 -> 4097 bytes .../__pycache__/_exceptions.cpython-311.pyc | Bin 0 -> 3813 bytes .../__pycache__/_models.cpython-311.pyc | Bin 0 -> 24547 bytes .../httpcore/__pycache__/_ssl.cpython-311.pyc | Bin 0 -> 641 bytes .../_synchronization.cpython-311.pyc | Bin 0 -> 15831 bytes .../__pycache__/_trace.cpython-311.pyc | Bin 0 -> 5901 bytes .../__pycache__/_utils.cpython-311.pyc | Bin 0 -> 1423 bytes .../python3.11/site-packages/httpcore/_api.py | 94 + .../site-packages/httpcore/_async/__init__.py | 39 + .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 1927 bytes .../__pycache__/connection.cpython-311.pyc | Bin 0 -> 12322 bytes .../connection_pool.cpython-311.pyc | Bin 0 -> 21623 bytes .../_async/__pycache__/http11.cpython-311.pyc | Bin 0 -> 21503 bytes .../_async/__pycache__/http2.cpython-311.pyc | Bin 0 -> 32795 bytes .../__pycache__/http_proxy.cpython-311.pyc | Bin 0 -> 18754 bytes .../__pycache__/interfaces.cpython-311.pyc | Bin 0 -> 6325 bytes .../__pycache__/socks_proxy.cpython-311.pyc | Bin 0 -> 17308 bytes .../httpcore/_async/connection.py | 222 + .../httpcore/_async/connection_pool.py | 420 + .../site-packages/httpcore/_async/http11.py | 379 + .../site-packages/httpcore/_async/http2.py | 592 ++ .../httpcore/_async/http_proxy.py | 367 + .../httpcore/_async/interfaces.py | 137 + .../httpcore/_async/socks_proxy.py | 341 + .../httpcore/_backends/__init__.py | 0 .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 205 bytes .../__pycache__/anyio.cpython-311.pyc | Bin 0 -> 9575 bytes .../__pycache__/auto.cpython-311.pyc | Bin 0 -> 2883 bytes .../__pycache__/base.cpython-311.pyc | Bin 0 -> 5321 bytes .../__pycache__/mock.cpython-311.pyc | Bin 0 -> 8030 bytes .../__pycache__/sync.cpython-311.pyc | Bin 0 -> 12723 bytes .../__pycache__/trio.cpython-311.pyc | Bin 0 -> 10095 bytes .../site-packages/httpcore/_backends/anyio.py | 146 + .../site-packages/httpcore/_backends/auto.py | 52 + .../site-packages/httpcore/_backends/base.py | 101 + .../site-packages/httpcore/_backends/mock.py | 143 + .../site-packages/httpcore/_backends/sync.py | 241 + .../site-packages/httpcore/_backends/trio.py | 159 + .../site-packages/httpcore/_exceptions.py | 81 + .../site-packages/httpcore/_models.py | 516 + .../python3.11/site-packages/httpcore/_ssl.py | 9 + .../site-packages/httpcore/_sync/__init__.py | 39 + .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 1881 bytes .../__pycache__/connection.cpython-311.pyc | Bin 0 -> 11123 bytes .../connection_pool.cpython-311.pyc | Bin 0 -> 20931 bytes .../_sync/__pycache__/http11.cpython-311.pyc | Bin 0 -> 19439 bytes .../_sync/__pycache__/http2.cpython-311.pyc | Bin 0 -> 29472 bytes .../__pycache__/http_proxy.cpython-311.pyc | Bin 0 -> 18048 bytes .../__pycache__/interfaces.cpython-311.pyc | Bin 0 -> 5983 bytes .../__pycache__/socks_proxy.cpython-311.pyc | Bin 0 -> 16285 bytes .../httpcore/_sync/connection.py | 222 + .../httpcore/_sync/connection_pool.py | 420 + .../site-packages/httpcore/_sync/http11.py | 379 + .../site-packages/httpcore/_sync/http2.py | 592 ++ .../httpcore/_sync/http_proxy.py | 367 + .../httpcore/_sync/interfaces.py | 137 + .../httpcore/_sync/socks_proxy.py | 341 + .../httpcore/_synchronization.py | 318 + .../site-packages/httpcore/_trace.py | 107 + .../site-packages/httpcore/_utils.py | 37 + .../site-packages/httpcore/py.typed | 0 .../httpx-0.28.1.dist-info/INSTALLER | 1 + .../httpx-0.28.1.dist-info/METADATA | 203 + .../httpx-0.28.1.dist-info/RECORD | 54 + .../httpx-0.28.1.dist-info/WHEEL | 4 + .../httpx-0.28.1.dist-info/entry_points.txt | 2 + .../licenses/LICENSE.md | 12 + .../site-packages/httpx/__init__.py | 105 + .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 2383 bytes .../__pycache__/__version__.cpython-311.pyc | Bin 0 -> 315 bytes .../httpx/__pycache__/_api.cpython-311.pyc | Bin 0 -> 9713 bytes .../httpx/__pycache__/_auth.cpython-311.pyc | Bin 0 -> 17055 bytes .../httpx/__pycache__/_client.cpython-311.pyc | Bin 0 -> 65538 bytes .../httpx/__pycache__/_config.cpython-311.pyc | Bin 0 -> 11512 bytes .../__pycache__/_content.cpython-311.pyc | Bin 0 -> 11949 bytes .../__pycache__/_decoders.cpython-311.pyc | Bin 0 -> 18913 bytes .../__pycache__/_exceptions.cpython-311.pyc | Bin 0 -> 14487 bytes .../httpx/__pycache__/_main.cpython-311.pyc | Bin 0 -> 23057 bytes .../httpx/__pycache__/_models.cpython-311.pyc | Bin 0 -> 66378 bytes .../__pycache__/_multipart.cpython-311.pyc | Bin 0 -> 15624 bytes .../__pycache__/_status_codes.cpython-311.pyc | Bin 0 -> 7558 bytes .../httpx/__pycache__/_types.cpython-311.pyc | Bin 0 -> 4662 bytes .../__pycache__/_urlparse.cpython-311.pyc | Bin 0 -> 20286 bytes .../httpx/__pycache__/_urls.cpython-311.pyc | Bin 0 -> 30757 bytes .../httpx/__pycache__/_utils.cpython-311.pyc | Bin 0 -> 10384 bytes .../site-packages/httpx/__version__.py | 3 + .../python3.11/site-packages/httpx/_api.py | 438 + .../python3.11/site-packages/httpx/_auth.py | 348 + .../python3.11/site-packages/httpx/_client.py | 2019 ++++ .../python3.11/site-packages/httpx/_config.py | 248 + .../site-packages/httpx/_content.py | 240 + .../site-packages/httpx/_decoders.py | 393 + .../site-packages/httpx/_exceptions.py | 379 + .../python3.11/site-packages/httpx/_main.py | 506 + .../python3.11/site-packages/httpx/_models.py | 1277 +++ .../site-packages/httpx/_multipart.py | 300 + .../site-packages/httpx/_status_codes.py | 162 + .../httpx/_transports/__init__.py | 15 + .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 489 bytes .../__pycache__/asgi.cpython-311.pyc | Bin 0 -> 8132 bytes .../__pycache__/base.cpython-311.pyc | Bin 0 -> 4216 bytes .../__pycache__/default.cpython-311.pyc | Bin 0 -> 17513 bytes .../__pycache__/mock.cpython-311.pyc | Bin 0 -> 2135 bytes .../__pycache__/wsgi.cpython-311.pyc | Bin 0 -> 7399 bytes .../site-packages/httpx/_transports/asgi.py | 187 + .../site-packages/httpx/_transports/base.py | 86 + .../httpx/_transports/default.py | 406 + .../site-packages/httpx/_transports/mock.py | 43 + .../site-packages/httpx/_transports/wsgi.py | 149 + .../python3.11/site-packages/httpx/_types.py | 114 + .../site-packages/httpx/_urlparse.py | 527 + .../python3.11/site-packages/httpx/_urls.py | 641 ++ .../python3.11/site-packages/httpx/_utils.py | 242 + .../python3.11/site-packages/httpx/py.typed | 0 .../httpx_sse-0.4.3.dist-info/INSTALLER | 1 + .../httpx_sse-0.4.3.dist-info/METADATA | 351 + .../httpx_sse-0.4.3.dist-info/RECORD | 17 + .../httpx_sse-0.4.3.dist-info/WHEEL | 5 + .../licenses/LICENSE | 21 + .../httpx_sse-0.4.3.dist-info/top_level.txt | 1 + .../site-packages/httpx_sse/__init__.py | 14 + .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 523 bytes .../__pycache__/_api.cpython-311.pyc | Bin 0 -> 6238 bytes .../__pycache__/_decoders.cpython-311.pyc | Bin 0 -> 5011 bytes .../__pycache__/_exceptions.cpython-311.pyc | Bin 0 -> 479 bytes .../__pycache__/_models.cpython-311.pyc | Bin 0 -> 2824 bytes .../site-packages/httpx_sse/_api.py | 93 + .../site-packages/httpx_sse/_decoders.py | 139 + .../site-packages/httpx_sse/_exceptions.py | 5 + .../site-packages/httpx_sse/_models.py | 54 + .../site-packages/httpx_sse/py.typed | 0 .../idna-3.11.dist-info/INSTALLER | 1 + .../idna-3.11.dist-info/METADATA | 209 + .../site-packages/idna-3.11.dist-info/RECORD | 22 + .../site-packages/idna-3.11.dist-info/WHEEL | 4 + .../idna-3.11.dist-info/licenses/LICENSE.md | 31 + .../python3.11/site-packages/idna/__init__.py | 45 + .../idna/__pycache__/__init__.cpython-311.pyc | Bin 0 -> 1098 bytes .../idna/__pycache__/codec.cpython-311.pyc | Bin 0 -> 5780 bytes .../idna/__pycache__/compat.cpython-311.pyc | Bin 0 -> 1020 bytes .../idna/__pycache__/core.cpython-311.pyc | Bin 0 -> 19299 bytes .../idna/__pycache__/idnadata.cpython-311.pyc | Bin 0 -> 103014 bytes .../__pycache__/intranges.cpython-311.pyc | Bin 0 -> 2978 bytes .../__pycache__/package_data.cpython-311.pyc | Bin 0 -> 214 bytes .../__pycache__/uts46data.cpython-311.pyc | Bin 0 -> 166267 bytes .../python3.11/site-packages/idna/codec.py | 122 + .../python3.11/site-packages/idna/compat.py | 15 + .../lib/python3.11/site-packages/idna/core.py | 437 + .../python3.11/site-packages/idna/idnadata.py | 4309 ++++++++ .../site-packages/idna/intranges.py | 57 + .../site-packages/idna/package_data.py | 1 + .../python3.11/site-packages/idna/py.typed | 0 .../site-packages/idna/uts46data.py | 8841 +++++++++++++++++ .../jsonschema-4.26.0.dist-info/INSTALLER | 1 + .../jsonschema-4.26.0.dist-info/METADATA | 170 + .../jsonschema-4.26.0.dist-info/RECORD | 82 + .../jsonschema-4.26.0.dist-info/WHEEL | 4 + .../entry_points.txt | 2 + .../licenses/COPYING | 19 + .../site-packages/jsonschema/__init__.py | 120 + .../site-packages/jsonschema/__main__.py | 6 + .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 4179 bytes .../__pycache__/__main__.cpython-311.pyc | Bin 0 -> 378 bytes .../__pycache__/_format.cpython-311.pyc | Bin 0 -> 22069 bytes .../__pycache__/_keywords.cpython-311.pyc | Bin 0 -> 23399 bytes .../_legacy_keywords.cpython-311.pyc | Bin 0 -> 19690 bytes .../__pycache__/_types.cpython-311.pyc | Bin 0 -> 7852 bytes .../__pycache__/_typing.cpython-311.pyc | Bin 0 -> 1421 bytes .../__pycache__/_utils.cpython-311.pyc | Bin 0 -> 16107 bytes .../__pycache__/cli.cpython-311.pyc | Bin 0 -> 13680 bytes .../__pycache__/exceptions.cpython-311.pyc | Bin 0 -> 23486 bytes .../__pycache__/protocols.cpython-311.pyc | Bin 0 -> 7245 bytes .../__pycache__/validators.cpython-311.pyc | Bin 0 -> 53810 bytes .../site-packages/jsonschema/_format.py | 546 + .../site-packages/jsonschema/_keywords.py | 449 + .../jsonschema/_legacy_keywords.py | 449 + .../site-packages/jsonschema/_types.py | 204 + .../site-packages/jsonschema/_typing.py | 29 + .../site-packages/jsonschema/_utils.py | 355 + .../jsonschema/benchmarks/__init__.py | 5 + .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 293 bytes .../__pycache__/const_vs_enum.cpython-311.pyc | Bin 0 -> 2198 bytes .../__pycache__/contains.cpython-311.pyc | Bin 0 -> 2161 bytes .../import_benchmark.cpython-311.pyc | Bin 0 -> 1478 bytes .../__pycache__/issue232.cpython-311.pyc | Bin 0 -> 1037 bytes .../json_schema_test_suite.cpython-311.pyc | Bin 0 -> 733 bytes .../nested_schemas.cpython-311.pyc | Bin 0 -> 2750 bytes .../__pycache__/subcomponents.cpython-311.pyc | Bin 0 -> 2614 bytes .../unused_registry.cpython-311.pyc | Bin 0 -> 1802 bytes ...useless_applicator_schemas.cpython-311.pyc | Bin 0 -> 4054 bytes .../useless_keywords.cpython-311.pyc | Bin 0 -> 2377 bytes .../validator_creation.cpython-311.pyc | Bin 0 -> 643 bytes .../jsonschema/benchmarks/const_vs_enum.py | 30 + .../jsonschema/benchmarks/contains.py | 28 + .../jsonschema/benchmarks/import_benchmark.py | 31 + .../jsonschema/benchmarks/issue232.py | 25 + .../jsonschema/benchmarks/issue232/issue.json | 2653 +++++ .../benchmarks/json_schema_test_suite.py | 12 + .../jsonschema/benchmarks/nested_schemas.py | 56 + .../jsonschema/benchmarks/subcomponents.py | 42 + .../jsonschema/benchmarks/unused_registry.py | 35 + .../benchmarks/useless_applicator_schemas.py | 106 + .../jsonschema/benchmarks/useless_keywords.py | 32 + .../benchmarks/validator_creation.py | 14 + .../site-packages/jsonschema/cli.py | 292 + .../site-packages/jsonschema/exceptions.py | 490 + .../site-packages/jsonschema/protocols.py | 230 + .../jsonschema/tests/__init__.py | 0 .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 203 bytes .../tests/__pycache__/_suite.cpython-311.pyc | Bin 0 -> 15065 bytes .../__pycache__/fuzz_validate.cpython-311.pyc | Bin 0 -> 2411 bytes .../__pycache__/test_cli.cpython-311.pyc | Bin 0 -> 38769 bytes .../test_deprecations.cpython-311.pyc | Bin 0 -> 29608 bytes .../test_exceptions.cpython-311.pyc | Bin 0 -> 37071 bytes .../__pycache__/test_format.cpython-311.pyc | Bin 0 -> 7783 bytes ...test_jsonschema_test_suite.cpython-311.pyc | Bin 0 -> 11765 bytes .../__pycache__/test_types.cpython-311.pyc | Bin 0 -> 14502 bytes .../__pycache__/test_utils.cpython-311.pyc | Bin 0 -> 9407 bytes .../test_validators.cpython-311.pyc | Bin 0 -> 148471 bytes .../site-packages/jsonschema/tests/_suite.py | 285 + .../jsonschema/tests/fuzz_validate.py | 50 + .../jsonschema/tests/test_cli.py | 904 ++ .../jsonschema/tests/test_deprecations.py | 432 + .../jsonschema/tests/test_exceptions.py | 759 ++ .../jsonschema/tests/test_format.py | 91 + .../tests/test_jsonschema_test_suite.py | 262 + .../jsonschema/tests/test_types.py | 221 + .../jsonschema/tests/test_utils.py | 138 + .../jsonschema/tests/test_validators.py | 2573 +++++ .../jsonschema/tests/typing/__init__.py | 0 .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 210 bytes ..._validators_match_protocol.cpython-311.pyc | Bin 0 -> 1115 bytes ..._all_concrete_validators_match_protocol.py | 38 + .../site-packages/jsonschema/validators.py | 1410 +++ .../INSTALLER | 1 + .../METADATA | 54 + .../RECORD | 33 + .../WHEEL | 4 + .../licenses/COPYING | 19 + .../jsonschema_specifications/__init__.py | 12 + .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 617 bytes .../__pycache__/_core.cpython-311.pyc | Bin 0 -> 1684 bytes .../jsonschema_specifications/_core.py | 38 + .../schemas/draft201909/metaschema.json | 42 + .../draft201909/vocabularies/applicator | 56 + .../schemas/draft201909/vocabularies/content | 17 + .../schemas/draft201909/vocabularies/core | 57 + .../schemas/draft201909/vocabularies/format | 14 + .../draft201909/vocabularies/meta-data | 37 + .../draft201909/vocabularies/validation | 98 + .../schemas/draft202012/metaschema.json | 58 + .../draft202012/vocabularies/applicator | 48 + .../schemas/draft202012/vocabularies/content | 17 + .../schemas/draft202012/vocabularies/core | 51 + .../vocabularies/format-annotation | 14 + .../draft202012/vocabularies/format-assertion | 14 + .../draft202012/vocabularies/meta-data | 37 + .../draft202012/vocabularies/unevaluated | 15 + .../draft202012/vocabularies/validation | 98 + .../schemas/draft3/metaschema.json | 172 + .../schemas/draft4/metaschema.json | 149 + .../schemas/draft6/metaschema.json | 153 + .../schemas/draft7/metaschema.json | 166 + .../tests/__init__.py | 0 .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 218 bytes ..._jsonschema_specifications.cpython-311.pyc | Bin 0 -> 2180 bytes .../tests/test_jsonschema_specifications.py | 41 + .../python3.11/site-packages/jwt/__init__.py | 75 + .../jwt/__pycache__/__init__.cpython-311.pyc | Bin 0 -> 1941 bytes .../__pycache__/algorithms.cpython-311.pyc | Bin 0 -> 40258 bytes .../jwt/__pycache__/api_jwk.cpython-311.pyc | Bin 0 -> 7631 bytes .../jwt/__pycache__/api_jws.cpython-311.pyc | Bin 0 -> 14941 bytes .../jwt/__pycache__/api_jwt.cpython-311.pyc | Bin 0 -> 16445 bytes .../__pycache__/exceptions.cpython-311.pyc | Bin 0 -> 4400 bytes .../jwt/__pycache__/help.cpython-311.pyc | Bin 0 -> 2369 bytes .../__pycache__/jwk_set_cache.cpython-311.pyc | Bin 0 -> 1916 bytes .../__pycache__/jwks_client.cpython-311.pyc | Bin 0 -> 6429 bytes .../jwt/__pycache__/types.cpython-311.pyc | Bin 0 -> 374 bytes .../jwt/__pycache__/utils.cpython-311.pyc | Bin 0 -> 6321 bytes .../jwt/__pycache__/warnings.cpython-311.pyc | Bin 0 -> 447 bytes .../site-packages/jwt/algorithms.py | 875 ++ .../python3.11/site-packages/jwt/api_jwk.py | 144 + .../python3.11/site-packages/jwt/api_jws.py | 346 + .../python3.11/site-packages/jwt/api_jwt.py | 433 + .../site-packages/jwt/exceptions.py | 82 + venv/lib/python3.11/site-packages/jwt/help.py | 67 + .../site-packages/jwt/jwk_set_cache.py | 31 + .../site-packages/jwt/jwks_client.py | 126 + .../lib/python3.11/site-packages/jwt/py.typed | 0 .../lib/python3.11/site-packages/jwt/types.py | 5 + .../lib/python3.11/site-packages/jwt/utils.py | 142 + .../python3.11/site-packages/jwt/warnings.py | 2 + .../mcp-1.26.0.dist-info/INSTALLER | 1 + .../mcp-1.26.0.dist-info/METADATA | 2606 +++++ .../site-packages/mcp-1.26.0.dist-info/RECORD | 227 + .../mcp-1.26.0.dist-info/REQUESTED | 0 .../site-packages/mcp-1.26.0.dist-info/WHEEL | 4 + .../mcp-1.26.0.dist-info/entry_points.txt | 2 + .../mcp-1.26.0.dist-info/licenses/LICENSE | 21 + .../python3.11/site-packages/mcp/__init__.py | 135 + .../mcp/__pycache__/__init__.cpython-311.pyc | Bin 0 -> 3245 bytes .../mcp/__pycache__/types.cpython-311.pyc | Bin 0 -> 80156 bytes .../site-packages/mcp/cli/__init__.py | 6 + .../cli/__pycache__/__init__.cpython-311.pyc | Bin 0 -> 364 bytes .../cli/__pycache__/claude.cpython-311.pyc | Bin 0 -> 6391 bytes .../mcp/cli/__pycache__/cli.cpython-311.pyc | Bin 0 -> 19267 bytes .../site-packages/mcp/cli/claude.py | 148 + .../python3.11/site-packages/mcp/cli/cli.py | 488 + .../site-packages/mcp/client/__init__.py | 0 .../site-packages/mcp/client/__main__.py | 85 + .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 197 bytes .../__pycache__/__main__.cpython-311.pyc | Bin 0 -> 5342 bytes .../__pycache__/session.cpython-311.pyc | Bin 0 -> 32445 bytes .../__pycache__/session_group.cpython-311.pyc | Bin 0 -> 20685 bytes .../client/__pycache__/sse.cpython-311.pyc | Bin 0 -> 11063 bytes .../streamable_http.cpython-311.pyc | Bin 0 -> 36468 bytes .../__pycache__/websocket.cpython-311.pyc | Bin 0 -> 5352 bytes .../site-packages/mcp/client/auth/__init__.py | 21 + .../auth/__pycache__/__init__.cpython-311.pyc | Bin 0 -> 730 bytes .../__pycache__/exceptions.cpython-311.pyc | Bin 0 -> 1005 bytes .../auth/__pycache__/oauth2.cpython-311.pyc | Bin 0 -> 31858 bytes .../auth/__pycache__/utils.cpython-311.pyc | Bin 0 -> 13534 bytes .../mcp/client/auth/exceptions.py | 10 + .../mcp/client/auth/extensions/__init__.py | 0 .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 213 bytes .../client_credentials.cpython-311.pyc | Bin 0 -> 24429 bytes .../auth/extensions/client_credentials.py | 487 + .../site-packages/mcp/client/auth/oauth2.py | 616 ++ .../site-packages/mcp/client/auth/utils.py | 336 + .../mcp/client/experimental/__init__.py | 9 + .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 458 bytes .../__pycache__/task_handlers.cpython-311.pyc | Bin 0 -> 15013 bytes .../__pycache__/tasks.cpython-311.pyc | Bin 0 -> 9379 bytes .../mcp/client/experimental/task_handlers.py | 290 + .../mcp/client/experimental/tasks.py | 224 + .../site-packages/mcp/client/session.py | 615 ++ .../site-packages/mcp/client/session_group.py | 447 + .../site-packages/mcp/client/sse.py | 164 + .../mcp/client/stdio/__init__.py | 278 + .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 13692 bytes .../mcp/client/streamable_http.py | 722 ++ .../site-packages/mcp/client/websocket.py | 86 + .../site-packages/mcp/os/__init__.py | 1 + .../os/__pycache__/__init__.cpython-311.pyc | Bin 0 -> 243 bytes .../site-packages/mcp/os/posix/__init__.py | 1 + .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 246 bytes .../__pycache__/utilities.cpython-311.pyc | Bin 0 -> 3576 bytes .../site-packages/mcp/os/posix/utilities.py | 60 + .../site-packages/mcp/os/win32/__init__.py | 1 + .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 248 bytes .../__pycache__/utilities.cpython-311.pyc | Bin 0 -> 14736 bytes .../site-packages/mcp/os/win32/utilities.py | 338 + .../lib/python3.11/site-packages/mcp/py.typed | 0 .../site-packages/mcp/server/__init__.py | 5 + .../site-packages/mcp/server/__main__.py | 50 + .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 457 bytes .../__pycache__/__main__.cpython-311.pyc | Bin 0 -> 3235 bytes .../__pycache__/elicitation.cpython-311.pyc | Bin 0 -> 8627 bytes .../server/__pycache__/models.cpython-311.pyc | Bin 0 -> 1054 bytes .../__pycache__/session.cpython-311.pyc | Bin 0 -> 32035 bytes .../server/__pycache__/sse.cpython-311.pyc | Bin 0 -> 14773 bytes .../server/__pycache__/stdio.cpython-311.pyc | Bin 0 -> 5538 bytes .../streamable_http.cpython-311.pyc | Bin 0 -> 54414 bytes .../streamable_http_manager.cpython-311.pyc | Bin 0 -> 15107 bytes .../transport_security.cpython-311.pyc | Bin 0 -> 5962 bytes .../__pycache__/validation.cpython-311.pyc | Bin 0 -> 5296 bytes .../__pycache__/websocket.cpython-311.pyc | Bin 0 -> 4804 bytes .../site-packages/mcp/server/auth/__init__.py | 3 + .../auth/__pycache__/__init__.cpython-311.pyc | Bin 0 -> 268 bytes .../auth/__pycache__/errors.cpython-311.pyc | Bin 0 -> 1191 bytes .../__pycache__/json_response.cpython-311.pyc | Bin 0 -> 954 bytes .../auth/__pycache__/provider.cpython-311.pyc | Bin 0 -> 14537 bytes .../auth/__pycache__/routes.cpython-311.pyc | Bin 0 -> 9567 bytes .../auth/__pycache__/settings.cpython-311.pyc | Bin 0 -> 2134 bytes .../site-packages/mcp/server/auth/errors.py | 5 + .../mcp/server/auth/handlers/__init__.py | 3 + .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 284 bytes .../__pycache__/authorize.cpython-311.pyc | Bin 0 -> 9522 bytes .../__pycache__/metadata.cpython-311.pyc | Bin 0 -> 1816 bytes .../__pycache__/register.cpython-311.pyc | Bin 0 -> 6316 bytes .../__pycache__/revoke.cpython-311.pyc | Bin 0 -> 4535 bytes .../__pycache__/token.cpython-311.pyc | Bin 0 -> 10582 bytes .../mcp/server/auth/handlers/authorize.py | 224 + .../mcp/server/auth/handlers/metadata.py | 29 + .../mcp/server/auth/handlers/register.py | 136 + .../mcp/server/auth/handlers/revoke.py | 91 + .../mcp/server/auth/handlers/token.py | 241 + .../mcp/server/auth/json_response.py | 10 + .../mcp/server/auth/middleware/__init__.py | 3 + .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 270 bytes .../__pycache__/auth_context.cpython-311.pyc | Bin 0 -> 2855 bytes .../__pycache__/bearer_auth.cpython-311.pyc | Bin 0 -> 7195 bytes .../__pycache__/client_auth.cpython-311.pyc | Bin 0 -> 5709 bytes .../server/auth/middleware/auth_context.py | 48 + .../mcp/server/auth/middleware/bearer_auth.py | 128 + .../mcp/server/auth/middleware/client_auth.py | 115 + .../site-packages/mcp/server/auth/provider.py | 301 + .../site-packages/mcp/server/auth/routes.py | 253 + .../site-packages/mcp/server/auth/settings.py | 30 + .../site-packages/mcp/server/elicitation.py | 190 + .../mcp/server/experimental/__init__.py | 11 + .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 601 bytes .../request_context.cpython-311.pyc | Bin 0 -> 10570 bytes .../session_features.cpython-311.pyc | Bin 0 -> 10429 bytes .../__pycache__/task_context.cpython-311.pyc | Bin 0 -> 25827 bytes .../task_result_handler.cpython-311.pyc | Bin 0 -> 10987 bytes .../__pycache__/task_support.cpython-311.pyc | Bin 0 -> 5651 bytes .../server/experimental/request_context.py | 238 + .../server/experimental/session_features.py | 220 + .../mcp/server/experimental/task_context.py | 612 ++ .../experimental/task_result_handler.py | 235 + .../mcp/server/experimental/task_support.py | 115 + .../mcp/server/fastmcp/__init__.py | 11 + .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 669 bytes .../__pycache__/exceptions.cpython-311.pyc | Bin 0 -> 1518 bytes .../__pycache__/server.cpython-311.pyc | Bin 0 -> 59305 bytes .../mcp/server/fastmcp/exceptions.py | 21 + .../mcp/server/fastmcp/prompts/__init__.py | 4 + .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 358 bytes .../prompts/__pycache__/base.cpython-311.pyc | Bin 0 -> 10088 bytes .../__pycache__/manager.cpython-311.pyc | Bin 0 -> 3314 bytes .../mcp/server/fastmcp/prompts/base.py | 183 + .../mcp/server/fastmcp/prompts/manager.py | 60 + .../mcp/server/fastmcp/resources/__init__.py | 23 + .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 729 bytes .../__pycache__/base.cpython-311.pyc | Bin 0 -> 3355 bytes .../resource_manager.cpython-311.pyc | Bin 0 -> 6024 bytes .../__pycache__/templates.cpython-311.pyc | Bin 0 -> 6272 bytes .../__pycache__/types.cpython-311.pyc | Bin 0 -> 12854 bytes .../mcp/server/fastmcp/resources/base.py | 50 + .../fastmcp/resources/resource_manager.py | 115 + .../mcp/server/fastmcp/resources/templates.py | 122 + .../mcp/server/fastmcp/resources/types.py | 203 + .../mcp/server/fastmcp/server.py | 1349 +++ .../mcp/server/fastmcp/tools/__init__.py | 4 + .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 357 bytes .../tools/__pycache__/base.cpython-311.pyc | Bin 0 -> 6382 bytes .../__pycache__/tool_manager.cpython-311.pyc | Bin 0 -> 4628 bytes .../mcp/server/fastmcp/tools/base.py | 126 + .../mcp/server/fastmcp/tools/tool_manager.py | 93 + .../mcp/server/fastmcp/utilities/__init__.py | 1 + .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 253 bytes .../context_injection.cpython-311.pyc | Bin 0 -> 2549 bytes .../__pycache__/func_metadata.cpython-311.pyc | Bin 0 -> 23720 bytes .../__pycache__/logging.cpython-311.pyc | Bin 0 -> 1829 bytes .../__pycache__/types.cpython-311.pyc | Bin 0 -> 5348 bytes .../fastmcp/utilities/context_injection.py | 68 + .../server/fastmcp/utilities/func_metadata.py | 533 + .../mcp/server/fastmcp/utilities/logging.py | 43 + .../mcp/server/fastmcp/utilities/types.py | 101 + .../mcp/server/lowlevel/__init__.py | 3 + .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 329 bytes .../__pycache__/experimental.cpython-311.pyc | Bin 0 -> 14228 bytes .../func_inspection.cpython-311.pyc | Bin 0 -> 3871 bytes .../__pycache__/helper_types.cpython-311.pyc | Bin 0 -> 867 bytes .../__pycache__/server.cpython-311.pyc | Bin 0 -> 41701 bytes .../mcp/server/lowlevel/experimental.py | 288 + .../mcp/server/lowlevel/func_inspection.py | 54 + .../mcp/server/lowlevel/helper_types.py | 11 + .../mcp/server/lowlevel/server.py | 803 ++ .../site-packages/mcp/server/models.py | 20 + .../site-packages/mcp/server/session.py | 691 ++ .../site-packages/mcp/server/sse.py | 249 + .../site-packages/mcp/server/stdio.py | 88 + .../mcp/server/streamable_http.py | 1067 ++ .../mcp/server/streamable_http_manager.py | 297 + .../mcp/server/transport_security.py | 127 + .../site-packages/mcp/server/validation.py | 104 + .../site-packages/mcp/server/websocket.py | 62 + .../site-packages/mcp/shared/__init__.py | 0 .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 197 bytes .../__pycache__/_httpx_utils.cpython-311.pyc | Bin 0 -> 3471 bytes .../shared/__pycache__/auth.cpython-311.pyc | Bin 0 -> 9712 bytes .../__pycache__/auth_utils.cpython-311.pyc | Bin 0 -> 3698 bytes .../__pycache__/context.cpython-311.pyc | Bin 0 -> 1775 bytes .../__pycache__/exceptions.cpython-311.pyc | Bin 0 -> 4668 bytes .../shared/__pycache__/memory.cpython-311.pyc | Bin 0 -> 6581 bytes .../__pycache__/message.cpython-311.pyc | Bin 0 -> 2454 bytes .../metadata_utils.cpython-311.pyc | Bin 0 -> 2103 bytes .../__pycache__/progress.cpython-311.pyc | Bin 0 -> 3136 bytes .../response_router.cpython-311.pyc | Bin 0 -> 2812 bytes .../__pycache__/session.cpython-311.pyc | Bin 0 -> 28675 bytes .../tool_name_validation.cpython-311.pyc | Bin 0 -> 6422 bytes .../__pycache__/version.cpython-311.pyc | Bin 0 -> 435 bytes .../site-packages/mcp/shared/_httpx_utils.py | 87 + .../site-packages/mcp/shared/auth.py | 159 + .../site-packages/mcp/shared/auth_utils.py | 85 + .../site-packages/mcp/shared/context.py | 32 + .../site-packages/mcp/shared/exceptions.py | 71 + .../mcp/shared/experimental/__init__.py | 7 + .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 434 bytes .../mcp/shared/experimental/tasks/__init__.py | 12 + .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 667 bytes .../__pycache__/capabilities.cpython-311.pyc | Bin 0 -> 4081 bytes .../tasks/__pycache__/context.cpython-311.pyc | Bin 0 -> 4704 bytes .../tasks/__pycache__/helpers.cpython-311.pyc | Bin 0 -> 6848 bytes .../in_memory_task_store.cpython-311.pyc | Bin 0 -> 11791 bytes .../__pycache__/message_queue.cpython-311.pyc | Bin 0 -> 11022 bytes .../tasks/__pycache__/polling.cpython-311.pyc | Bin 0 -> 1989 bytes .../__pycache__/resolver.cpython-311.pyc | Bin 0 -> 3218 bytes .../tasks/__pycache__/store.cpython-311.pyc | Bin 0 -> 5486 bytes .../shared/experimental/tasks/capabilities.py | 115 + .../mcp/shared/experimental/tasks/context.py | 101 + .../mcp/shared/experimental/tasks/helpers.py | 181 + .../tasks/in_memory_task_store.py | 219 + .../experimental/tasks/message_queue.py | 241 + .../mcp/shared/experimental/tasks/polling.py | 45 + .../mcp/shared/experimental/tasks/resolver.py | 60 + .../mcp/shared/experimental/tasks/store.py | 156 + .../site-packages/mcp/shared/memory.py | 98 + .../site-packages/mcp/shared/message.py | 50 + .../mcp/shared/metadata_utils.py | 45 + .../site-packages/mcp/shared/progress.py | 58 + .../mcp/shared/response_router.py | 63 + .../site-packages/mcp/shared/session.py | 550 + .../mcp/shared/tool_name_validation.py | 129 + .../site-packages/mcp/shared/version.py | 3 + .../lib/python3.11/site-packages/mcp/types.py | 1999 ++++ .../site-packages/multipart/__init__.py | 24 + .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 1548 bytes .../__pycache__/decoders.cpython-311.pyc | Bin 0 -> 246 bytes .../__pycache__/exceptions.cpython-311.pyc | Bin 0 -> 250 bytes .../__pycache__/multipart.cpython-311.pyc | Bin 0 -> 248 bytes .../site-packages/multipart/decoders.py | 1 + .../site-packages/multipart/exceptions.py | 1 + .../site-packages/multipart/multipart.py | 1 + .../pip-23.0.1.dist-info/INSTALLER | 1 + .../pip-23.0.1.dist-info/LICENSE.txt | 20 + .../pip-23.0.1.dist-info/METADATA | 88 + .../site-packages/pip-23.0.1.dist-info/RECORD | 996 ++ .../pip-23.0.1.dist-info/REQUESTED | 0 .../site-packages/pip-23.0.1.dist-info/WHEEL | 5 + .../pip-23.0.1.dist-info/entry_points.txt | 4 + .../pip-23.0.1.dist-info/top_level.txt | 1 + .../python3.11/site-packages/pip/__init__.py | 13 + .../python3.11/site-packages/pip/__main__.py | 31 + .../site-packages/pip/__pip-runner__.py | 50 + .../pip/__pycache__/__init__.cpython-311.pyc | Bin 0 -> 779 bytes .../pip/__pycache__/__main__.cpython-311.pyc | Bin 0 -> 1088 bytes .../__pip-runner__.cpython-311.pyc | Bin 0 -> 2516 bytes .../site-packages/pip/_internal/__init__.py | 19 + .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 962 bytes .../__pycache__/build_env.cpython-311.pyc | Bin 0 -> 16082 bytes .../__pycache__/cache.cpython-311.pyc | Bin 0 -> 14707 bytes .../__pycache__/configuration.cpython-311.pyc | Bin 0 -> 19238 bytes .../__pycache__/exceptions.cpython-311.pyc | Bin 0 -> 38367 bytes .../__pycache__/main.cpython-311.pyc | Bin 0 -> 762 bytes .../__pycache__/pyproject.cpython-311.pyc | Bin 0 -> 5530 bytes .../self_outdated_check.cpython-311.pyc | Bin 0 -> 11332 bytes .../__pycache__/wheel_builder.cpython-311.pyc | Bin 0 -> 16002 bytes .../site-packages/pip/_internal/build_env.py | 311 + .../site-packages/pip/_internal/cache.py | 293 + .../pip/_internal/cli/__init__.py | 4 + .../cli/__pycache__/__init__.cpython-311.pyc | Bin 0 -> 297 bytes .../autocompletion.cpython-311.pyc | Bin 0 -> 10087 bytes .../__pycache__/base_command.cpython-311.pyc | Bin 0 -> 11085 bytes .../__pycache__/cmdoptions.cpython-311.pyc | Bin 0 -> 32984 bytes .../command_context.cpython-311.pyc | Bin 0 -> 2119 bytes .../cli/__pycache__/main.cpython-311.pyc | Bin 0 -> 2374 bytes .../__pycache__/main_parser.cpython-311.pyc | Bin 0 -> 5533 bytes .../cli/__pycache__/parser.cpython-311.pyc | Bin 0 -> 17034 bytes .../__pycache__/progress_bars.cpython-311.pyc | Bin 0 -> 3181 bytes .../__pycache__/req_command.cpython-311.pyc | Bin 0 -> 20146 bytes .../cli/__pycache__/spinners.cpython-311.pyc | Bin 0 -> 8846 bytes .../__pycache__/status_codes.cpython-311.pyc | Bin 0 -> 385 bytes .../pip/_internal/cli/autocompletion.py | 171 + .../pip/_internal/cli/base_command.py | 216 + .../pip/_internal/cli/cmdoptions.py | 1055 ++ .../pip/_internal/cli/command_context.py | 27 + .../site-packages/pip/_internal/cli/main.py | 70 + .../pip/_internal/cli/main_parser.py | 134 + .../site-packages/pip/_internal/cli/parser.py | 294 + .../pip/_internal/cli/progress_bars.py | 68 + .../pip/_internal/cli/req_command.py | 502 + .../pip/_internal/cli/spinners.py | 159 + .../pip/_internal/cli/status_codes.py | 6 + .../pip/_internal/commands/__init__.py | 132 + .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 4465 bytes .../__pycache__/cache.cpython-311.pyc | Bin 0 -> 10564 bytes .../__pycache__/check.cpython-311.pyc | Bin 0 -> 2315 bytes .../__pycache__/completion.cpython-311.pyc | Bin 0 -> 5477 bytes .../__pycache__/configuration.cpython-311.pyc | Bin 0 -> 14906 bytes .../__pycache__/debug.cpython-311.pyc | Bin 0 -> 12014 bytes .../__pycache__/download.cpython-311.pyc | Bin 0 -> 7821 bytes .../__pycache__/freeze.cpython-311.pyc | Bin 0 -> 4166 bytes .../commands/__pycache__/hash.cpython-311.pyc | Bin 0 -> 3367 bytes .../commands/__pycache__/help.cpython-311.pyc | Bin 0 -> 1979 bytes .../__pycache__/index.cpython-311.pyc | Bin 0 -> 7802 bytes .../__pycache__/inspect.cpython-311.pyc | Bin 0 -> 4455 bytes .../__pycache__/install.cpython-311.pyc | Bin 0 -> 35384 bytes .../commands/__pycache__/list.cpython-311.pyc | Bin 0 -> 17516 bytes .../__pycache__/search.cpython-311.pyc | Bin 0 -> 8961 bytes .../commands/__pycache__/show.cpython-311.pyc | Bin 0 -> 11304 bytes .../__pycache__/uninstall.cpython-311.pyc | Bin 0 -> 5155 bytes .../__pycache__/wheel.cpython-311.pyc | Bin 0 -> 9961 bytes .../pip/_internal/commands/cache.py | 223 + .../pip/_internal/commands/check.py | 53 + .../pip/_internal/commands/completion.py | 126 + .../pip/_internal/commands/configuration.py | 282 + .../pip/_internal/commands/debug.py | 199 + .../pip/_internal/commands/download.py | 149 + .../pip/_internal/commands/freeze.py | 97 + .../pip/_internal/commands/hash.py | 59 + .../pip/_internal/commands/help.py | 41 + .../pip/_internal/commands/index.py | 139 + .../pip/_internal/commands/inspect.py | 92 + .../pip/_internal/commands/install.py | 873 ++ .../pip/_internal/commands/list.py | 367 + .../pip/_internal/commands/search.py | 174 + .../pip/_internal/commands/show.py | 189 + .../pip/_internal/commands/uninstall.py | 113 + .../pip/_internal/commands/wheel.py | 203 + .../pip/_internal/configuration.py | 374 + .../pip/_internal/distributions/__init__.py | 21 + .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 1047 bytes .../__pycache__/base.cpython-311.pyc | Bin 0 -> 2419 bytes .../__pycache__/installed.cpython-311.pyc | Bin 0 -> 1556 bytes .../__pycache__/sdist.cpython-311.pyc | Bin 0 -> 8958 bytes .../__pycache__/wheel.cpython-311.pyc | Bin 0 -> 2150 bytes .../pip/_internal/distributions/base.py | 39 + .../pip/_internal/distributions/installed.py | 23 + .../pip/_internal/distributions/sdist.py | 150 + .../pip/_internal/distributions/wheel.py | 34 + .../site-packages/pip/_internal/exceptions.py | 747 ++ .../pip/_internal/index/__init__.py | 2 + .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 251 bytes .../__pycache__/collector.cpython-311.pyc | Bin 0 -> 24557 bytes .../package_finder.cpython-311.pyc | Bin 0 -> 44229 bytes .../index/__pycache__/sources.cpython-311.pyc | Bin 0 -> 11033 bytes .../pip/_internal/index/collector.py | 505 + .../pip/_internal/index/package_finder.py | 1029 ++ .../pip/_internal/index/sources.py | 224 + .../pip/_internal/locations/__init__.py | 467 + .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 18189 bytes .../__pycache__/_distutils.cpython-311.pyc | Bin 0 -> 7598 bytes .../__pycache__/_sysconfig.cpython-311.pyc | Bin 0 -> 8893 bytes .../__pycache__/base.cpython-311.pyc | Bin 0 -> 4014 bytes .../pip/_internal/locations/_distutils.py | 173 + .../pip/_internal/locations/_sysconfig.py | 213 + .../pip/_internal/locations/base.py | 81 + .../site-packages/pip/_internal/main.py | 12 + .../pip/_internal/metadata/__init__.py | 127 + .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 6422 bytes .../__pycache__/_json.cpython-311.pyc | Bin 0 -> 3576 bytes .../metadata/__pycache__/base.cpython-311.pyc | Bin 0 -> 38021 bytes .../__pycache__/pkg_resources.cpython-311.pyc | Bin 0 -> 16869 bytes .../pip/_internal/metadata/_json.py | 84 + .../pip/_internal/metadata/base.py | 688 ++ .../_internal/metadata/importlib/__init__.py | 4 + .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 368 bytes .../__pycache__/_compat.cpython-311.pyc | Bin 0 -> 3575 bytes .../__pycache__/_dists.cpython-311.pyc | Bin 0 -> 14591 bytes .../__pycache__/_envs.cpython-311.pyc | Bin 0 -> 12429 bytes .../_internal/metadata/importlib/_compat.py | 55 + .../_internal/metadata/importlib/_dists.py | 224 + .../pip/_internal/metadata/importlib/_envs.py | 188 + .../pip/_internal/metadata/pkg_resources.py | 270 + .../pip/_internal/models/__init__.py | 2 + .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 285 bytes .../__pycache__/candidate.cpython-311.pyc | Bin 0 -> 2104 bytes .../__pycache__/direct_url.cpython-311.pyc | Bin 0 -> 12267 bytes .../format_control.cpython-311.pyc | Bin 0 -> 4668 bytes .../models/__pycache__/index.cpython-311.pyc | Bin 0 -> 1910 bytes .../installation_report.cpython-311.pyc | Bin 0 -> 2624 bytes .../models/__pycache__/link.cpython-311.pyc | Bin 0 -> 26456 bytes .../models/__pycache__/scheme.cpython-311.pyc | Bin 0 -> 1276 bytes .../__pycache__/search_scope.cpython-311.pyc | Bin 0 -> 5839 bytes .../selection_prefs.cpython-311.pyc | Bin 0 -> 2007 bytes .../__pycache__/target_python.cpython-311.pyc | Bin 0 -> 4769 bytes .../models/__pycache__/wheel.cpython-311.pyc | Bin 0 -> 6432 bytes .../pip/_internal/models/candidate.py | 34 + .../pip/_internal/models/direct_url.py | 228 + .../pip/_internal/models/format_control.py | 80 + .../pip/_internal/models/index.py | 28 + .../_internal/models/installation_report.py | 53 + .../pip/_internal/models/link.py | 524 + .../pip/_internal/models/scheme.py | 31 + .../pip/_internal/models/search_scope.py | 133 + .../pip/_internal/models/selection_prefs.py | 51 + .../pip/_internal/models/target_python.py | 110 + .../pip/_internal/models/wheel.py | 92 + .../pip/_internal/network/__init__.py | 2 + .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 273 bytes .../network/__pycache__/auth.cpython-311.pyc | Bin 0 -> 19077 bytes .../network/__pycache__/cache.cpython-311.pyc | Bin 0 -> 5196 bytes .../__pycache__/download.cpython-311.pyc | Bin 0 -> 9588 bytes .../__pycache__/lazy_wheel.cpython-311.pyc | Bin 0 -> 13034 bytes .../__pycache__/session.cpython-311.pyc | Bin 0 -> 21301 bytes .../network/__pycache__/utils.cpython-311.pyc | Bin 0 -> 2422 bytes .../__pycache__/xmlrpc.cpython-311.pyc | Bin 0 -> 3201 bytes .../pip/_internal/network/auth.py | 446 + .../pip/_internal/network/cache.py | 69 + .../pip/_internal/network/download.py | 186 + .../pip/_internal/network/lazy_wheel.py | 210 + .../pip/_internal/network/session.py | 518 + .../pip/_internal/network/utils.py | 96 + .../pip/_internal/network/xmlrpc.py | 60 + .../pip/_internal/operations/__init__.py | 0 .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 211 bytes .../__pycache__/check.cpython-311.pyc | Bin 0 -> 6644 bytes .../__pycache__/freeze.cpython-311.pyc | Bin 0 -> 11607 bytes .../__pycache__/prepare.cpython-311.pyc | Bin 0 -> 26391 bytes .../_internal/operations/build/__init__.py | 0 .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 217 bytes .../__pycache__/build_tracker.cpython-311.pyc | Bin 0 -> 8140 bytes .../__pycache__/metadata.cpython-311.pyc | Bin 0 -> 2288 bytes .../metadata_editable.cpython-311.pyc | Bin 0 -> 2324 bytes .../metadata_legacy.cpython-311.pyc | Bin 0 -> 3724 bytes .../build/__pycache__/wheel.cpython-311.pyc | Bin 0 -> 1954 bytes .../wheel_editable.cpython-311.pyc | Bin 0 -> 2398 bytes .../__pycache__/wheel_legacy.cpython-311.pyc | Bin 0 -> 4505 bytes .../operations/build/build_tracker.py | 124 + .../_internal/operations/build/metadata.py | 39 + .../operations/build/metadata_editable.py | 41 + .../operations/build/metadata_legacy.py | 74 + .../pip/_internal/operations/build/wheel.py | 37 + .../operations/build/wheel_editable.py | 46 + .../operations/build/wheel_legacy.py | 102 + .../pip/_internal/operations/check.py | 149 + .../pip/_internal/operations/freeze.py | 254 + .../_internal/operations/install/__init__.py | 2 + .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 285 bytes .../editable_legacy.cpython-311.pyc | Bin 0 -> 2281 bytes .../__pycache__/legacy.cpython-311.pyc | Bin 0 -> 6121 bytes .../install/__pycache__/wheel.cpython-311.pyc | Bin 0 -> 40007 bytes .../operations/install/editable_legacy.py | 47 + .../_internal/operations/install/legacy.py | 120 + .../pip/_internal/operations/install/wheel.py | 738 ++ .../pip/_internal/operations/prepare.py | 667 ++ .../site-packages/pip/_internal/pyproject.py | 174 + .../pip/_internal/req/__init__.py | 94 + .../req/__pycache__/__init__.cpython-311.pyc | Bin 0 -> 4457 bytes .../__pycache__/constructors.cpython-311.pyc | Bin 0 -> 20716 bytes .../req/__pycache__/req_file.cpython-311.pyc | Bin 0 -> 22445 bytes .../__pycache__/req_install.cpython-311.pyc | Bin 0 -> 40357 bytes .../req/__pycache__/req_set.cpython-311.pyc | Bin 0 -> 6013 bytes .../__pycache__/req_uninstall.cpython-311.pyc | Bin 0 -> 37011 bytes .../pip/_internal/req/constructors.py | 501 + .../pip/_internal/req/req_file.py | 544 + .../pip/_internal/req/req_install.py | 946 ++ .../pip/_internal/req/req_set.py | 82 + .../pip/_internal/req/req_uninstall.py | 640 ++ .../pip/_internal/resolution/__init__.py | 0 .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 211 bytes .../__pycache__/base.cpython-311.pyc | Bin 0 -> 1382 bytes .../pip/_internal/resolution/base.py | 20 + .../_internal/resolution/legacy/__init__.py | 0 .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 218 bytes .../__pycache__/resolver.cpython-311.pyc | Bin 0 -> 23804 bytes .../_internal/resolution/legacy/resolver.py | 600 ++ .../resolution/resolvelib/__init__.py | 0 .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 222 bytes .../__pycache__/base.cpython-311.pyc | Bin 0 -> 9635 bytes .../__pycache__/candidates.cpython-311.pyc | Bin 0 -> 28845 bytes .../__pycache__/factory.cpython-311.pyc | Bin 0 -> 31989 bytes .../found_candidates.cpython-311.pyc | Bin 0 -> 6770 bytes .../__pycache__/provider.cpython-311.pyc | Bin 0 -> 11064 bytes .../__pycache__/reporter.cpython-311.pyc | Bin 0 -> 4667 bytes .../__pycache__/requirements.cpython-311.pyc | Bin 0 -> 11132 bytes .../__pycache__/resolver.cpython-311.pyc | Bin 0 -> 12319 bytes .../_internal/resolution/resolvelib/base.py | 141 + .../resolution/resolvelib/candidates.py | 556 ++ .../resolution/resolvelib/factory.py | 731 ++ .../resolution/resolvelib/found_candidates.py | 155 + .../resolution/resolvelib/provider.py | 248 + .../resolution/resolvelib/reporter.py | 68 + .../resolution/resolvelib/requirements.py | 166 + .../resolution/resolvelib/resolver.py | 296 + .../pip/_internal/self_outdated_check.py | 242 + .../pip/_internal/utils/__init__.py | 0 .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 206 bytes .../utils/__pycache__/_log.cpython-311.pyc | Bin 0 -> 2027 bytes .../utils/__pycache__/appdirs.cpython-311.pyc | Bin 0 -> 2565 bytes .../utils/__pycache__/compat.cpython-311.pyc | Bin 0 -> 2273 bytes .../compatibility_tags.cpython-311.pyc | Bin 0 -> 6765 bytes .../__pycache__/datetime.cpython-311.pyc | Bin 0 -> 723 bytes .../__pycache__/deprecation.cpython-311.pyc | Bin 0 -> 7096 bytes .../direct_url_helpers.cpython-311.pyc | Bin 0 -> 3729 bytes .../distutils_args.cpython-311.pyc | Bin 0 -> 1473 bytes .../__pycache__/egg_link.cpython-311.pyc | Bin 0 -> 3244 bytes .../__pycache__/encoding.cpython-311.pyc | Bin 0 -> 2329 bytes .../__pycache__/entrypoints.cpython-311.pyc | Bin 0 -> 4251 bytes .../__pycache__/filesystem.cpython-311.pyc | Bin 0 -> 8236 bytes .../__pycache__/filetypes.cpython-311.pyc | Bin 0 -> 1322 bytes .../utils/__pycache__/glibc.cpython-311.pyc | Bin 0 -> 2565 bytes .../utils/__pycache__/hashes.cpython-311.pyc | Bin 0 -> 8343 bytes .../inject_securetransport.cpython-311.pyc | Bin 0 -> 1340 bytes .../utils/__pycache__/logging.cpython-311.pyc | Bin 0 -> 15465 bytes .../utils/__pycache__/misc.cpython-311.pyc | Bin 0 -> 37707 bytes .../utils/__pycache__/models.cpython-311.pyc | Bin 0 -> 2946 bytes .../__pycache__/packaging.cpython-311.pyc | Bin 0 -> 2813 bytes .../setuptools_build.cpython-311.pyc | Bin 0 -> 6110 bytes .../__pycache__/subprocess.cpython-311.pyc | Bin 0 -> 9900 bytes .../__pycache__/temp_dir.cpython-311.pyc | Bin 0 -> 11427 bytes .../__pycache__/unpacking.cpython-311.pyc | Bin 0 -> 12902 bytes .../utils/__pycache__/urls.cpython-311.pyc | Bin 0 -> 2699 bytes .../__pycache__/virtualenv.cpython-311.pyc | Bin 0 -> 4946 bytes .../utils/__pycache__/wheel.cpython-311.pyc | Bin 0 -> 7116 bytes .../site-packages/pip/_internal/utils/_log.py | 38 + .../pip/_internal/utils/appdirs.py | 52 + .../pip/_internal/utils/compat.py | 63 + .../pip/_internal/utils/compatibility_tags.py | 165 + .../pip/_internal/utils/datetime.py | 11 + .../pip/_internal/utils/deprecation.py | 188 + .../pip/_internal/utils/direct_url_helpers.py | 87 + .../pip/_internal/utils/distutils_args.py | 43 + .../pip/_internal/utils/egg_link.py | 72 + .../pip/_internal/utils/encoding.py | 36 + .../pip/_internal/utils/entrypoints.py | 84 + .../pip/_internal/utils/filesystem.py | 153 + .../pip/_internal/utils/filetypes.py | 27 + .../pip/_internal/utils/glibc.py | 88 + .../pip/_internal/utils/hashes.py | 144 + .../_internal/utils/inject_securetransport.py | 35 + .../pip/_internal/utils/logging.py | 348 + .../site-packages/pip/_internal/utils/misc.py | 763 ++ .../pip/_internal/utils/models.py | 39 + .../pip/_internal/utils/packaging.py | 57 + .../pip/_internal/utils/setuptools_build.py | 195 + .../pip/_internal/utils/subprocess.py | 260 + .../pip/_internal/utils/temp_dir.py | 246 + .../pip/_internal/utils/unpacking.py | 257 + .../site-packages/pip/_internal/utils/urls.py | 62 + .../pip/_internal/utils/virtualenv.py | 104 + .../pip/_internal/utils/wheel.py | 136 + .../pip/_internal/vcs/__init__.py | 15 + .../vcs/__pycache__/__init__.cpython-311.pyc | Bin 0 -> 641 bytes .../vcs/__pycache__/bazaar.cpython-311.pyc | Bin 0 -> 5866 bytes .../vcs/__pycache__/git.cpython-311.pyc | Bin 0 -> 21530 bytes .../vcs/__pycache__/mercurial.cpython-311.pyc | Bin 0 -> 8712 bytes .../__pycache__/subversion.cpython-311.pyc | Bin 0 -> 14609 bytes .../versioncontrol.cpython-311.pyc | Bin 0 -> 31878 bytes .../site-packages/pip/_internal/vcs/bazaar.py | 112 + .../site-packages/pip/_internal/vcs/git.py | 526 + .../pip/_internal/vcs/mercurial.py | 163 + .../pip/_internal/vcs/subversion.py | 324 + .../pip/_internal/vcs/versioncontrol.py | 705 ++ .../pip/_internal/wheel_builder.py | 382 + .../site-packages/pip/_vendor/__init__.py | 120 + .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 5619 bytes .../_vendor/__pycache__/six.cpython-311.pyc | Bin 0 -> 46421 bytes .../typing_extensions.cpython-311.pyc | Bin 0 -> 97451 bytes .../pip/_vendor/cachecontrol/__init__.py | 18 + .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 848 bytes .../__pycache__/_cmd.cpython-311.pyc | Bin 0 -> 2703 bytes .../__pycache__/adapter.cpython-311.pyc | Bin 0 -> 5510 bytes .../__pycache__/cache.cpython-311.pyc | Bin 0 -> 3784 bytes .../__pycache__/compat.cpython-311.pyc | Bin 0 -> 1141 bytes .../__pycache__/controller.cpython-311.pyc | Bin 0 -> 16456 bytes .../__pycache__/filewrapper.cpython-311.pyc | Bin 0 -> 4243 bytes .../__pycache__/heuristics.cpython-311.pyc | Bin 0 -> 6688 bytes .../__pycache__/serialize.cpython-311.pyc | Bin 0 -> 8403 bytes .../__pycache__/wrapper.cpython-311.pyc | Bin 0 -> 969 bytes .../pip/_vendor/cachecontrol/_cmd.py | 61 + .../pip/_vendor/cachecontrol/adapter.py | 137 + .../pip/_vendor/cachecontrol/cache.py | 65 + .../_vendor/cachecontrol/caches/__init__.py | 9 + .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 423 bytes .../__pycache__/file_cache.cpython-311.pyc | Bin 0 -> 8406 bytes .../__pycache__/redis_cache.cpython-311.pyc | Bin 0 -> 2503 bytes .../_vendor/cachecontrol/caches/file_cache.py | 188 + .../cachecontrol/caches/redis_cache.py | 39 + .../pip/_vendor/cachecontrol/compat.py | 32 + .../pip/_vendor/cachecontrol/controller.py | 439 + .../pip/_vendor/cachecontrol/filewrapper.py | 111 + .../pip/_vendor/cachecontrol/heuristics.py | 139 + .../pip/_vendor/cachecontrol/serialize.py | 190 + .../pip/_vendor/cachecontrol/wrapper.py | 33 + .../pip/_vendor/certifi/__init__.py | 4 + .../pip/_vendor/certifi/__main__.py | 12 + .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 348 bytes .../__pycache__/__main__.cpython-311.pyc | Bin 0 -> 749 bytes .../certifi/__pycache__/core.cpython-311.pyc | Bin 0 -> 3991 bytes .../pip/_vendor/certifi/cacert.pem | 4527 +++++++++ .../site-packages/pip/_vendor/certifi/core.py | 119 + .../pip/_vendor/chardet/__init__.py | 115 + .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 5080 bytes .../__pycache__/big5freq.cpython-311.pyc | Bin 0 -> 27210 bytes .../__pycache__/big5prober.cpython-311.pyc | Bin 0 -> 1685 bytes .../chardistribution.cpython-311.pyc | Bin 0 -> 11277 bytes .../charsetgroupprober.cpython-311.pyc | Bin 0 -> 4307 bytes .../__pycache__/charsetprober.cpython-311.pyc | Bin 0 -> 5553 bytes .../codingstatemachine.cpython-311.pyc | Bin 0 -> 4004 bytes .../codingstatemachinedict.cpython-311.pyc | Bin 0 -> 960 bytes .../__pycache__/cp949prober.cpython-311.pyc | Bin 0 -> 1694 bytes .../chardet/__pycache__/enums.cpython-311.pyc | Bin 0 -> 3395 bytes .../__pycache__/escprober.cpython-311.pyc | Bin 0 -> 4911 bytes .../chardet/__pycache__/escsm.cpython-311.pyc | Bin 0 -> 12650 bytes .../__pycache__/eucjpprober.cpython-311.pyc | Bin 0 -> 4737 bytes .../__pycache__/euckrfreq.cpython-311.pyc | Bin 0 -> 12093 bytes .../__pycache__/euckrprober.cpython-311.pyc | Bin 0 -> 1686 bytes .../__pycache__/euctwfreq.cpython-311.pyc | Bin 0 -> 27215 bytes .../__pycache__/euctwprober.cpython-311.pyc | Bin 0 -> 1686 bytes .../__pycache__/gb2312freq.cpython-311.pyc | Bin 0 -> 19137 bytes .../__pycache__/gb2312prober.cpython-311.pyc | Bin 0 -> 1701 bytes .../__pycache__/hebrewprober.cpython-311.pyc | Bin 0 -> 5690 bytes .../__pycache__/jisfreq.cpython-311.pyc | Bin 0 -> 22166 bytes .../__pycache__/johabfreq.cpython-311.pyc | Bin 0 -> 84670 bytes .../__pycache__/johabprober.cpython-311.pyc | Bin 0 -> 1692 bytes .../__pycache__/jpcntx.cpython-311.pyc | Bin 0 -> 40174 bytes .../langbulgarianmodel.cpython-311.pyc | Bin 0 -> 85844 bytes .../langgreekmodel.cpython-311.pyc | Bin 0 -> 79266 bytes .../langhebrewmodel.cpython-311.pyc | Bin 0 -> 80028 bytes .../langhungarianmodel.cpython-311.pyc | Bin 0 -> 85798 bytes .../langrussianmodel.cpython-311.pyc | Bin 0 -> 108745 bytes .../__pycache__/langthaimodel.cpython-311.pyc | Bin 0 -> 80206 bytes .../langturkishmodel.cpython-311.pyc | Bin 0 -> 80045 bytes .../__pycache__/latin1prober.cpython-311.pyc | Bin 0 -> 7341 bytes .../macromanprober.cpython-311.pyc | Bin 0 -> 7508 bytes .../mbcharsetprober.cpython-311.pyc | Bin 0 -> 4129 bytes .../mbcsgroupprober.cpython-311.pyc | Bin 0 -> 1999 bytes .../__pycache__/mbcssm.cpython-311.pyc | Bin 0 -> 31739 bytes .../__pycache__/resultdict.cpython-311.pyc | Bin 0 -> 778 bytes .../sbcharsetprober.cpython-311.pyc | Bin 0 -> 6404 bytes .../sbcsgroupprober.cpython-311.pyc | Bin 0 -> 2949 bytes .../__pycache__/sjisprober.cpython-311.pyc | Bin 0 -> 4842 bytes .../universaldetector.cpython-311.pyc | Bin 0 -> 12470 bytes .../__pycache__/utf1632prober.cpython-311.pyc | Bin 0 -> 10590 bytes .../__pycache__/utf8prober.cpython-311.pyc | Bin 0 -> 3477 bytes .../__pycache__/version.cpython-311.pyc | Bin 0 -> 513 bytes .../pip/_vendor/chardet/big5freq.py | 386 + .../pip/_vendor/chardet/big5prober.py | 47 + .../pip/_vendor/chardet/chardistribution.py | 261 + .../pip/_vendor/chardet/charsetgroupprober.py | 106 + .../pip/_vendor/chardet/charsetprober.py | 147 + .../pip/_vendor/chardet/cli/__init__.py | 0 .../cli/__pycache__/__init__.cpython-311.pyc | Bin 0 -> 210 bytes .../__pycache__/chardetect.cpython-311.pyc | Bin 0 -> 4349 bytes .../pip/_vendor/chardet/cli/chardetect.py | 112 + .../pip/_vendor/chardet/codingstatemachine.py | 90 + .../_vendor/chardet/codingstatemachinedict.py | 19 + .../pip/_vendor/chardet/cp949prober.py | 49 + .../pip/_vendor/chardet/enums.py | 85 + .../pip/_vendor/chardet/escprober.py | 102 + .../pip/_vendor/chardet/escsm.py | 261 + .../pip/_vendor/chardet/eucjpprober.py | 102 + .../pip/_vendor/chardet/euckrfreq.py | 196 + .../pip/_vendor/chardet/euckrprober.py | 47 + .../pip/_vendor/chardet/euctwfreq.py | 388 + .../pip/_vendor/chardet/euctwprober.py | 47 + .../pip/_vendor/chardet/gb2312freq.py | 284 + .../pip/_vendor/chardet/gb2312prober.py | 47 + .../pip/_vendor/chardet/hebrewprober.py | 316 + .../pip/_vendor/chardet/jisfreq.py | 325 + .../pip/_vendor/chardet/johabfreq.py | 2382 +++++ .../pip/_vendor/chardet/johabprober.py | 47 + .../pip/_vendor/chardet/jpcntx.py | 238 + .../pip/_vendor/chardet/langbulgarianmodel.py | 4649 +++++++++ .../pip/_vendor/chardet/langgreekmodel.py | 4397 ++++++++ .../pip/_vendor/chardet/langhebrewmodel.py | 4380 ++++++++ .../pip/_vendor/chardet/langhungarianmodel.py | 4649 +++++++++ .../pip/_vendor/chardet/langrussianmodel.py | 5725 +++++++++++ .../pip/_vendor/chardet/langthaimodel.py | 4380 ++++++++ .../pip/_vendor/chardet/langturkishmodel.py | 4380 ++++++++ .../pip/_vendor/chardet/latin1prober.py | 147 + .../pip/_vendor/chardet/macromanprober.py | 162 + .../pip/_vendor/chardet/mbcharsetprober.py | 95 + .../pip/_vendor/chardet/mbcsgroupprober.py | 57 + .../pip/_vendor/chardet/mbcssm.py | 661 ++ .../pip/_vendor/chardet/metadata/__init__.py | 0 .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 215 bytes .../__pycache__/languages.cpython-311.pyc | Bin 0 -> 10815 bytes .../pip/_vendor/chardet/metadata/languages.py | 352 + .../pip/_vendor/chardet/resultdict.py | 16 + .../pip/_vendor/chardet/sbcharsetprober.py | 162 + .../pip/_vendor/chardet/sbcsgroupprober.py | 88 + .../pip/_vendor/chardet/sjisprober.py | 105 + .../pip/_vendor/chardet/universaldetector.py | 362 + .../pip/_vendor/chardet/utf1632prober.py | 225 + .../pip/_vendor/chardet/utf8prober.py | 82 + .../pip/_vendor/chardet/version.py | 9 + .../pip/_vendor/colorama/__init__.py | 7 + .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 582 bytes .../colorama/__pycache__/ansi.cpython-311.pyc | Bin 0 -> 4580 bytes .../__pycache__/ansitowin32.cpython-311.pyc | Bin 0 -> 16226 bytes .../__pycache__/initialise.cpython-311.pyc | Bin 0 -> 3943 bytes .../__pycache__/win32.cpython-311.pyc | Bin 0 -> 7931 bytes .../__pycache__/winterm.cpython-311.pyc | Bin 0 -> 9157 bytes .../pip/_vendor/colorama/ansi.py | 102 + .../pip/_vendor/colorama/ansitowin32.py | 277 + .../pip/_vendor/colorama/initialise.py | 121 + .../pip/_vendor/colorama/tests/__init__.py | 1 + .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 213 bytes .../__pycache__/ansi_test.cpython-311.pyc | Bin 0 -> 5858 bytes .../ansitowin32_test.cpython-311.pyc | Bin 0 -> 21525 bytes .../initialise_test.cpython-311.pyc | Bin 0 -> 14152 bytes .../__pycache__/isatty_test.cpython-311.pyc | Bin 0 -> 6717 bytes .../tests/__pycache__/utils.cpython-311.pyc | Bin 0 -> 2892 bytes .../__pycache__/winterm_test.cpython-311.pyc | Bin 0 -> 7245 bytes .../pip/_vendor/colorama/tests/ansi_test.py | 76 + .../colorama/tests/ansitowin32_test.py | 294 + .../_vendor/colorama/tests/initialise_test.py | 189 + .../pip/_vendor/colorama/tests/isatty_test.py | 57 + .../pip/_vendor/colorama/tests/utils.py | 49 + .../_vendor/colorama/tests/winterm_test.py | 131 + .../pip/_vendor/colorama/win32.py | 180 + .../pip/_vendor/colorama/winterm.py | 195 + .../pip/_vendor/distlib/__init__.py | 23 + .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 1451 bytes .../__pycache__/compat.cpython-311.pyc | Bin 0 -> 52317 bytes .../__pycache__/database.cpython-311.pyc | Bin 0 -> 72105 bytes .../distlib/__pycache__/index.cpython-311.pyc | Bin 0 -> 26694 bytes .../__pycache__/locators.cpython-311.pyc | Bin 0 -> 65870 bytes .../__pycache__/manifest.cpython-311.pyc | Bin 0 -> 17037 bytes .../__pycache__/markers.cpython-311.pyc | Bin 0 -> 8173 bytes .../__pycache__/metadata.cpython-311.pyc | Bin 0 -> 47121 bytes .../__pycache__/resources.cpython-311.pyc | Bin 0 -> 19000 bytes .../__pycache__/scripts.cpython-311.pyc | Bin 0 -> 21276 bytes .../distlib/__pycache__/util.cpython-311.pyc | Bin 0 -> 97455 bytes .../__pycache__/version.cpython-311.pyc | Bin 0 -> 34582 bytes .../distlib/__pycache__/wheel.cpython-311.pyc | Bin 0 -> 60386 bytes .../pip/_vendor/distlib/compat.py | 1116 +++ .../pip/_vendor/distlib/database.py | 1350 +++ .../pip/_vendor/distlib/index.py | 508 + .../pip/_vendor/distlib/locators.py | 1300 +++ .../pip/_vendor/distlib/manifest.py | 393 + .../pip/_vendor/distlib/markers.py | 152 + .../pip/_vendor/distlib/metadata.py | 1076 ++ .../pip/_vendor/distlib/resources.py | 358 + .../pip/_vendor/distlib/scripts.py | 437 + .../site-packages/pip/_vendor/distlib/util.py | 1932 ++++ .../pip/_vendor/distlib/version.py | 739 ++ .../pip/_vendor/distlib/wheel.py | 1082 ++ .../pip/_vendor/distro/__init__.py | 54 + .../pip/_vendor/distro/__main__.py | 4 + .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 1204 bytes .../__pycache__/__main__.cpython-311.pyc | Bin 0 -> 338 bytes .../distro/__pycache__/distro.cpython-311.pyc | Bin 0 -> 57737 bytes .../pip/_vendor/distro/distro.py | 1399 +++ .../pip/_vendor/idna/__init__.py | 44 + .../idna/__pycache__/__init__.cpython-311.pyc | Bin 0 -> 1105 bytes .../idna/__pycache__/codec.cpython-311.pyc | Bin 0 -> 5396 bytes .../idna/__pycache__/compat.cpython-311.pyc | Bin 0 -> 1022 bytes .../idna/__pycache__/core.cpython-311.pyc | Bin 0 -> 19457 bytes .../idna/__pycache__/idnadata.cpython-311.pyc | Bin 0 -> 38981 bytes .../__pycache__/intranges.cpython-311.pyc | Bin 0 -> 2990 bytes .../__pycache__/package_data.cpython-311.pyc | Bin 0 -> 225 bytes .../__pycache__/uts46data.cpython-311.pyc | Bin 0 -> 163205 bytes .../site-packages/pip/_vendor/idna/codec.py | 112 + .../site-packages/pip/_vendor/idna/compat.py | 13 + .../site-packages/pip/_vendor/idna/core.py | 400 + .../pip/_vendor/idna/idnadata.py | 2151 ++++ .../pip/_vendor/idna/intranges.py | 54 + .../pip/_vendor/idna/package_data.py | 2 + .../pip/_vendor/idna/uts46data.py | 8600 ++++++++++++++++ .../pip/_vendor/msgpack/__init__.py | 57 + .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 2084 bytes .../__pycache__/exceptions.cpython-311.pyc | Bin 0 -> 2385 bytes .../msgpack/__pycache__/ext.cpython-311.pyc | Bin 0 -> 9171 bytes .../__pycache__/fallback.cpython-311.pyc | Bin 0 -> 47198 bytes .../pip/_vendor/msgpack/exceptions.py | 48 + .../site-packages/pip/_vendor/msgpack/ext.py | 193 + .../pip/_vendor/msgpack/fallback.py | 1010 ++ .../pip/_vendor/packaging/__about__.py | 26 + .../pip/_vendor/packaging/__init__.py | 25 + .../__pycache__/__about__.cpython-311.pyc | Bin 0 -> 649 bytes .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 570 bytes .../__pycache__/_manylinux.cpython-311.pyc | Bin 0 -> 13236 bytes .../__pycache__/_musllinux.cpython-311.pyc | Bin 0 -> 8004 bytes .../__pycache__/_structures.cpython-311.pyc | Bin 0 -> 3692 bytes .../__pycache__/markers.cpython-311.pyc | Bin 0 -> 16532 bytes .../__pycache__/requirements.cpython-311.pyc | Bin 0 -> 7647 bytes .../__pycache__/specifiers.cpython-311.pyc | Bin 0 -> 34370 bytes .../__pycache__/tags.cpython-311.pyc | Bin 0 -> 21355 bytes .../__pycache__/utils.cpython-311.pyc | Bin 0 -> 6690 bytes .../__pycache__/version.cpython-311.pyc | Bin 0 -> 21882 bytes .../pip/_vendor/packaging/_manylinux.py | 301 + .../pip/_vendor/packaging/_musllinux.py | 136 + .../pip/_vendor/packaging/_structures.py | 61 + .../pip/_vendor/packaging/markers.py | 304 + .../pip/_vendor/packaging/requirements.py | 146 + .../pip/_vendor/packaging/specifiers.py | 802 ++ .../pip/_vendor/packaging/tags.py | 487 + .../pip/_vendor/packaging/utils.py | 136 + .../pip/_vendor/packaging/version.py | 504 + .../pip/_vendor/pkg_resources/__init__.py | 3296 ++++++ .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 158238 bytes .../__pycache__/py31compat.cpython-311.pyc | Bin 0 -> 991 bytes .../pip/_vendor/pkg_resources/py31compat.py | 23 + .../pip/_vendor/platformdirs/__init__.py | 342 + .../pip/_vendor/platformdirs/__main__.py | 46 + .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 12937 bytes .../__pycache__/__main__.cpython-311.pyc | Bin 0 -> 2134 bytes .../__pycache__/android.cpython-311.pyc | Bin 0 -> 6364 bytes .../__pycache__/api.cpython-311.pyc | Bin 0 -> 7191 bytes .../__pycache__/macos.cpython-311.pyc | Bin 0 -> 4601 bytes .../__pycache__/unix.cpython-311.pyc | Bin 0 -> 11033 bytes .../__pycache__/version.cpython-311.pyc | Bin 0 -> 320 bytes .../__pycache__/windows.cpython-311.pyc | Bin 0 -> 9969 bytes .../pip/_vendor/platformdirs/android.py | 120 + .../pip/_vendor/platformdirs/api.py | 156 + .../pip/_vendor/platformdirs/macos.py | 64 + .../pip/_vendor/platformdirs/unix.py | 181 + .../pip/_vendor/platformdirs/version.py | 4 + .../pip/_vendor/platformdirs/windows.py | 184 + .../pip/_vendor/pygments/__init__.py | 82 + .../pip/_vendor/pygments/__main__.py | 17 + .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 3852 bytes .../__pycache__/__main__.cpython-311.pyc | Bin 0 -> 788 bytes .../__pycache__/cmdline.cpython-311.pyc | Bin 0 -> 30299 bytes .../__pycache__/console.cpython-311.pyc | Bin 0 -> 3051 bytes .../__pycache__/filter.cpython-311.pyc | Bin 0 -> 3512 bytes .../__pycache__/formatter.cpython-311.pyc | Bin 0 -> 3878 bytes .../__pycache__/lexer.cpython-311.pyc | Bin 0 -> 40406 bytes .../__pycache__/modeline.cpython-311.pyc | Bin 0 -> 1731 bytes .../__pycache__/plugin.cpython-311.pyc | Bin 0 -> 3744 bytes .../__pycache__/regexopt.cpython-311.pyc | Bin 0 -> 5038 bytes .../__pycache__/scanner.cpython-311.pyc | Bin 0 -> 4893 bytes .../__pycache__/sphinxext.cpython-311.pyc | Bin 0 -> 8324 bytes .../__pycache__/style.cpython-311.pyc | Bin 0 -> 7432 bytes .../__pycache__/token.cpython-311.pyc | Bin 0 -> 7472 bytes .../__pycache__/unistring.cpython-311.pyc | Bin 0 -> 33806 bytes .../pygments/__pycache__/util.cpython-311.pyc | Bin 0 -> 14599 bytes .../pip/_vendor/pygments/cmdline.py | 668 ++ .../pip/_vendor/pygments/console.py | 70 + .../pip/_vendor/pygments/filter.py | 71 + .../pip/_vendor/pygments/filters/__init__.py | 940 ++ .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 40112 bytes .../pip/_vendor/pygments/formatter.py | 94 + .../_vendor/pygments/formatters/__init__.py | 143 + .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 6878 bytes .../__pycache__/_mapping.cpython-311.pyc | Bin 0 -> 4160 bytes .../__pycache__/bbcode.cpython-311.pyc | Bin 0 -> 4486 bytes .../__pycache__/groff.cpython-311.pyc | Bin 0 -> 7819 bytes .../__pycache__/html.cpython-311.pyc | Bin 0 -> 42604 bytes .../__pycache__/img.cpython-311.pyc | Bin 0 -> 28576 bytes .../__pycache__/irc.cpython-311.pyc | Bin 0 -> 7679 bytes .../__pycache__/latex.cpython-311.pyc | Bin 0 -> 21812 bytes .../__pycache__/other.cpython-311.pyc | Bin 0 -> 7640 bytes .../__pycache__/pangomarkup.cpython-311.pyc | Bin 0 -> 3184 bytes .../__pycache__/rtf.cpython-311.pyc | Bin 0 -> 6851 bytes .../__pycache__/svg.cpython-311.pyc | Bin 0 -> 9671 bytes .../__pycache__/terminal.cpython-311.pyc | Bin 0 -> 6050 bytes .../__pycache__/terminal256.cpython-311.pyc | Bin 0 -> 16416 bytes .../_vendor/pygments/formatters/_mapping.py | 23 + .../pip/_vendor/pygments/formatters/bbcode.py | 108 + .../pip/_vendor/pygments/formatters/groff.py | 170 + .../pip/_vendor/pygments/formatters/html.py | 989 ++ .../pip/_vendor/pygments/formatters/img.py | 645 ++ .../pip/_vendor/pygments/formatters/irc.py | 179 + .../pip/_vendor/pygments/formatters/latex.py | 521 + .../pip/_vendor/pygments/formatters/other.py | 161 + .../pygments/formatters/pangomarkup.py | 83 + .../pip/_vendor/pygments/formatters/rtf.py | 146 + .../pip/_vendor/pygments/formatters/svg.py | 188 + .../_vendor/pygments/formatters/terminal.py | 127 + .../pygments/formatters/terminal256.py | 338 + .../pip/_vendor/pygments/lexer.py | 882 ++ .../pip/_vendor/pygments/lexers/__init__.py | 335 + .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 15155 bytes .../__pycache__/_mapping.cpython-311.pyc | Bin 0 -> 62786 bytes .../lexers/__pycache__/python.cpython-311.pyc | Bin 0 -> 43987 bytes .../pip/_vendor/pygments/lexers/_mapping.py | 541 + .../pip/_vendor/pygments/lexers/python.py | 1204 +++ .../pip/_vendor/pygments/modeline.py | 43 + .../pip/_vendor/pygments/plugin.py | 88 + .../pip/_vendor/pygments/regexopt.py | 91 + .../pip/_vendor/pygments/scanner.py | 104 + .../pip/_vendor/pygments/sphinxext.py | 155 + .../pip/_vendor/pygments/style.py | 197 + .../pip/_vendor/pygments/styles/__init__.py | 97 + .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 4465 bytes .../pip/_vendor/pygments/token.py | 213 + .../pip/_vendor/pygments/unistring.py | 153 + .../pip/_vendor/pygments/util.py | 308 + .../pip/_vendor/pyparsing/__init__.py | 331 + .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 8355 bytes .../__pycache__/actions.cpython-311.pyc | Bin 0 -> 8469 bytes .../__pycache__/common.cpython-311.pyc | Bin 0 -> 14791 bytes .../__pycache__/core.cpython-311.pyc | Bin 0 -> 277677 bytes .../__pycache__/exceptions.cpython-311.pyc | Bin 0 -> 12933 bytes .../__pycache__/helpers.cpython-311.pyc | Bin 0 -> 53634 bytes .../__pycache__/results.cpython-311.pyc | Bin 0 -> 36317 bytes .../__pycache__/testing.cpython-311.pyc | Bin 0 -> 19513 bytes .../__pycache__/unicode.cpython-311.pyc | Bin 0 -> 15371 bytes .../__pycache__/util.cpython-311.pyc | Bin 0 -> 14270 bytes .../pip/_vendor/pyparsing/actions.py | 207 + .../pip/_vendor/pyparsing/common.py | 424 + .../pip/_vendor/pyparsing/core.py | 5814 +++++++++++ .../pip/_vendor/pyparsing/diagram/__init__.py | 642 ++ .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 28036 bytes .../pip/_vendor/pyparsing/exceptions.py | 267 + .../pip/_vendor/pyparsing/helpers.py | 1088 ++ .../pip/_vendor/pyparsing/results.py | 760 ++ .../pip/_vendor/pyparsing/testing.py | 331 + .../pip/_vendor/pyparsing/unicode.py | 352 + .../pip/_vendor/pyparsing/util.py | 235 + .../pip/_vendor/pyproject_hooks/__init__.py | 23 + .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 713 bytes .../__pycache__/_compat.cpython-311.pyc | Bin 0 -> 411 bytes .../__pycache__/_impl.cpython-311.pyc | Bin 0 -> 16677 bytes .../pip/_vendor/pyproject_hooks/_compat.py | 8 + .../pip/_vendor/pyproject_hooks/_impl.py | 330 + .../pyproject_hooks/_in_process/__init__.py | 18 + .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 1173 bytes .../__pycache__/_in_process.cpython-311.pyc | Bin 0 -> 16495 bytes .../_in_process/_in_process.py | 353 + .../pip/_vendor/requests/__init__.py | 182 + .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 6457 bytes .../__pycache__/__version__.cpython-311.pyc | Bin 0 -> 594 bytes .../_internal_utils.cpython-311.pyc | Bin 0 -> 2091 bytes .../__pycache__/adapters.cpython-311.pyc | Bin 0 -> 24894 bytes .../requests/__pycache__/api.cpython-311.pyc | Bin 0 -> 7439 bytes .../requests/__pycache__/auth.cpython-311.pyc | Bin 0 -> 14638 bytes .../__pycache__/certs.cpython-311.pyc | Bin 0 -> 990 bytes .../__pycache__/compat.cpython-311.pyc | Bin 0 -> 1816 bytes .../__pycache__/cookies.cpython-311.pyc | Bin 0 -> 27118 bytes .../__pycache__/exceptions.cpython-311.pyc | Bin 0 -> 8533 bytes .../requests/__pycache__/help.cpython-311.pyc | Bin 0 -> 4528 bytes .../__pycache__/hooks.cpython-311.pyc | Bin 0 -> 1258 bytes .../__pycache__/models.cpython-311.pyc | Bin 0 -> 38789 bytes .../__pycache__/packages.cpython-311.pyc | Bin 0 -> 838 bytes .../__pycache__/sessions.cpython-311.pyc | Bin 0 -> 29627 bytes .../__pycache__/status_codes.cpython-311.pyc | Bin 0 -> 6245 bytes .../__pycache__/structures.cpython-311.pyc | Bin 0 -> 6230 bytes .../__pycache__/utils.cpython-311.pyc | Bin 0 -> 40144 bytes .../pip/_vendor/requests/__version__.py | 14 + .../pip/_vendor/requests/_internal_utils.py | 48 + .../pip/_vendor/requests/adapters.py | 584 ++ .../site-packages/pip/_vendor/requests/api.py | 157 + .../pip/_vendor/requests/auth.py | 315 + .../pip/_vendor/requests/certs.py | 24 + .../pip/_vendor/requests/compat.py | 67 + .../pip/_vendor/requests/cookies.py | 561 ++ .../pip/_vendor/requests/exceptions.py | 141 + .../pip/_vendor/requests/help.py | 131 + .../pip/_vendor/requests/hooks.py | 33 + .../pip/_vendor/requests/models.py | 1034 ++ .../pip/_vendor/requests/packages.py | 16 + .../pip/_vendor/requests/sessions.py | 831 ++ .../pip/_vendor/requests/status_codes.py | 128 + .../pip/_vendor/requests/structures.py | 99 + .../pip/_vendor/requests/utils.py | 1086 ++ .../pip/_vendor/resolvelib/__init__.py | 26 + .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 761 bytes .../__pycache__/providers.cpython-311.pyc | Bin 0 -> 7080 bytes .../__pycache__/reporters.cpython-311.pyc | Bin 0 -> 2810 bytes .../__pycache__/resolvers.cpython-311.pyc | Bin 0 -> 25256 bytes .../__pycache__/structs.cpython-311.pyc | Bin 0 -> 11338 bytes .../pip/_vendor/resolvelib/compat/__init__.py | 0 .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 216 bytes .../collections_abc.cpython-311.pyc | Bin 0 -> 491 bytes .../resolvelib/compat/collections_abc.py | 6 + .../pip/_vendor/resolvelib/providers.py | 133 + .../pip/_vendor/resolvelib/reporters.py | 43 + .../pip/_vendor/resolvelib/resolvers.py | 482 + .../pip/_vendor/resolvelib/structs.py | 165 + .../pip/_vendor/rich/__init__.py | 177 + .../pip/_vendor/rich/__main__.py | 274 + .../rich/__pycache__/__init__.cpython-311.pyc | Bin 0 -> 7504 bytes .../rich/__pycache__/__main__.cpython-311.pyc | Bin 0 -> 11582 bytes .../__pycache__/_cell_widths.cpython-311.pyc | Bin 0 -> 7843 bytes .../__pycache__/_emoji_codes.cpython-311.pyc | Bin 0 -> 208530 bytes .../_emoji_replace.cpython-311.pyc | Bin 0 -> 1942 bytes .../_export_format.cpython-311.pyc | Bin 0 -> 2347 bytes .../__pycache__/_extension.cpython-311.pyc | Bin 0 -> 643 bytes .../rich/__pycache__/_inspect.cpython-311.pyc | Bin 0 -> 14195 bytes .../__pycache__/_log_render.cpython-311.pyc | Bin 0 -> 4777 bytes .../rich/__pycache__/_loop.cpython-311.pyc | Bin 0 -> 2123 bytes .../__pycache__/_null_file.cpython-311.pyc | Bin 0 -> 4688 bytes .../__pycache__/_palettes.cpython-311.pyc | Bin 0 -> 5259 bytes .../rich/__pycache__/_pick.cpython-311.pyc | Bin 0 -> 804 bytes .../rich/__pycache__/_ratio.cpython-311.pyc | Bin 0 -> 7942 bytes .../__pycache__/_spinners.cpython-311.pyc | Bin 0 -> 13692 bytes .../rich/__pycache__/_stack.cpython-311.pyc | Bin 0 -> 1138 bytes .../rich/__pycache__/_timer.cpython-311.pyc | Bin 0 -> 991 bytes .../_win32_console.cpython-311.pyc | Bin 0 -> 30179 bytes .../rich/__pycache__/_windows.cpython-311.pyc | Bin 0 -> 2838 bytes .../_windows_renderer.cpython-311.pyc | Bin 0 -> 4029 bytes .../rich/__pycache__/_wrap.cpython-311.pyc | Bin 0 -> 2794 bytes .../rich/__pycache__/abc.cpython-311.pyc | Bin 0 -> 1935 bytes .../rich/__pycache__/align.cpython-311.pyc | Bin 0 -> 13484 bytes .../rich/__pycache__/ansi.cpython-311.pyc | Bin 0 -> 10460 bytes .../rich/__pycache__/bar.cpython-311.pyc | Bin 0 -> 4557 bytes .../rich/__pycache__/box.cpython-311.pyc | Bin 0 -> 12999 bytes .../rich/__pycache__/cells.cpython-311.pyc | Bin 0 -> 6449 bytes .../rich/__pycache__/color.cpython-311.pyc | Bin 0 -> 27580 bytes .../__pycache__/color_triplet.cpython-311.pyc | Bin 0 -> 1883 bytes .../rich/__pycache__/columns.cpython-311.pyc | Bin 0 -> 10654 bytes .../rich/__pycache__/console.cpython-311.pyc | Bin 0 -> 123170 bytes .../__pycache__/constrain.cpython-311.pyc | Bin 0 -> 2475 bytes .../__pycache__/containers.cpython-311.pyc | Bin 0 -> 10816 bytes .../rich/__pycache__/control.cpython-311.pyc | Bin 0 -> 11907 bytes .../default_styles.cpython-311.pyc | Bin 0 -> 12507 bytes .../rich/__pycache__/diagnose.cpython-311.pyc | Bin 0 -> 1830 bytes .../rich/__pycache__/emoji.cpython-311.pyc | Bin 0 -> 4808 bytes .../rich/__pycache__/errors.cpython-311.pyc | Bin 0 -> 2339 bytes .../__pycache__/file_proxy.cpython-311.pyc | Bin 0 -> 3787 bytes .../rich/__pycache__/filesize.cpython-311.pyc | Bin 0 -> 3311 bytes .../__pycache__/highlighter.cpython-311.pyc | Bin 0 -> 10998 bytes .../rich/__pycache__/json.cpython-311.pyc | Bin 0 -> 6691 bytes .../rich/__pycache__/jupyter.cpython-311.pyc | Bin 0 -> 6414 bytes .../rich/__pycache__/layout.cpython-311.pyc | Bin 0 -> 23321 bytes .../rich/__pycache__/live.cpython-311.pyc | Bin 0 -> 21142 bytes .../__pycache__/live_render.cpython-311.pyc | Bin 0 -> 5155 bytes .../rich/__pycache__/logging.cpython-311.pyc | Bin 0 -> 14526 bytes .../rich/__pycache__/markup.cpython-311.pyc | Bin 0 -> 10448 bytes .../rich/__pycache__/measure.cpython-311.pyc | Bin 0 -> 7281 bytes .../rich/__pycache__/padding.cpython-311.pyc | Bin 0 -> 7497 bytes .../rich/__pycache__/pager.cpython-311.pyc | Bin 0 -> 2255 bytes .../rich/__pycache__/palette.cpython-311.pyc | Bin 0 -> 5988 bytes .../rich/__pycache__/panel.cpython-311.pyc | Bin 0 -> 12744 bytes .../rich/__pycache__/pretty.cpython-311.pyc | Bin 0 -> 44837 bytes .../rich/__pycache__/progress.cpython-311.pyc | Bin 0 -> 82716 bytes .../__pycache__/progress_bar.cpython-311.pyc | Bin 0 -> 11022 bytes .../rich/__pycache__/prompt.cpython-311.pyc | Bin 0 -> 16388 bytes .../rich/__pycache__/protocol.cpython-311.pyc | Bin 0 -> 2106 bytes .../rich/__pycache__/region.cpython-311.pyc | Bin 0 -> 669 bytes .../rich/__pycache__/repr.cpython-311.pyc | Bin 0 -> 7668 bytes .../rich/__pycache__/rule.cpython-311.pyc | Bin 0 -> 7707 bytes .../rich/__pycache__/scope.cpython-311.pyc | Bin 0 -> 4361 bytes .../rich/__pycache__/screen.cpython-311.pyc | Bin 0 -> 2784 bytes .../rich/__pycache__/segment.cpython-311.pyc | Bin 0 -> 31551 bytes .../rich/__pycache__/spinner.cpython-311.pyc | Bin 0 -> 6900 bytes .../rich/__pycache__/status.cpython-311.pyc | Bin 0 -> 6768 bytes .../rich/__pycache__/style.cpython-311.pyc | Bin 0 -> 34341 bytes .../rich/__pycache__/styled.cpython-311.pyc | Bin 0 -> 2449 bytes .../rich/__pycache__/syntax.cpython-311.pyc | Bin 0 -> 42543 bytes .../rich/__pycache__/table.cpython-311.pyc | Bin 0 -> 48810 bytes .../terminal_theme.cpython-311.pyc | Bin 0 -> 3715 bytes .../rich/__pycache__/text.cpython-311.pyc | Bin 0 -> 65226 bytes .../rich/__pycache__/theme.cpython-311.pyc | Bin 0 -> 7153 bytes .../rich/__pycache__/themes.cpython-311.pyc | Bin 0 -> 365 bytes .../__pycache__/traceback.cpython-311.pyc | Bin 0 -> 31679 bytes .../rich/__pycache__/tree.cpython-311.pyc | Bin 0 -> 12536 bytes .../pip/_vendor/rich/_cell_widths.py | 451 + .../pip/_vendor/rich/_emoji_codes.py | 3610 +++++++ .../pip/_vendor/rich/_emoji_replace.py | 32 + .../pip/_vendor/rich/_export_format.py | 78 + .../pip/_vendor/rich/_extension.py | 10 + .../pip/_vendor/rich/_inspect.py | 270 + .../pip/_vendor/rich/_log_render.py | 94 + .../site-packages/pip/_vendor/rich/_loop.py | 43 + .../pip/_vendor/rich/_null_file.py | 83 + .../pip/_vendor/rich/_palettes.py | 309 + .../site-packages/pip/_vendor/rich/_pick.py | 17 + .../site-packages/pip/_vendor/rich/_ratio.py | 160 + .../pip/_vendor/rich/_spinners.py | 482 + .../site-packages/pip/_vendor/rich/_stack.py | 16 + .../site-packages/pip/_vendor/rich/_timer.py | 19 + .../pip/_vendor/rich/_win32_console.py | 662 ++ .../pip/_vendor/rich/_windows.py | 72 + .../pip/_vendor/rich/_windows_renderer.py | 56 + .../site-packages/pip/_vendor/rich/_wrap.py | 56 + .../site-packages/pip/_vendor/rich/abc.py | 33 + .../site-packages/pip/_vendor/rich/align.py | 311 + .../site-packages/pip/_vendor/rich/ansi.py | 237 + .../site-packages/pip/_vendor/rich/bar.py | 94 + .../site-packages/pip/_vendor/rich/box.py | 517 + .../site-packages/pip/_vendor/rich/cells.py | 154 + .../site-packages/pip/_vendor/rich/color.py | 618 ++ .../pip/_vendor/rich/color_triplet.py | 38 + .../site-packages/pip/_vendor/rich/columns.py | 187 + .../site-packages/pip/_vendor/rich/console.py | 2612 +++++ .../pip/_vendor/rich/constrain.py | 37 + .../pip/_vendor/rich/containers.py | 167 + .../site-packages/pip/_vendor/rich/control.py | 225 + .../pip/_vendor/rich/default_styles.py | 188 + .../pip/_vendor/rich/diagnose.py | 37 + .../site-packages/pip/_vendor/rich/emoji.py | 96 + .../site-packages/pip/_vendor/rich/errors.py | 34 + .../pip/_vendor/rich/file_proxy.py | 54 + .../pip/_vendor/rich/filesize.py | 89 + .../pip/_vendor/rich/highlighter.py | 232 + .../site-packages/pip/_vendor/rich/json.py | 140 + .../site-packages/pip/_vendor/rich/jupyter.py | 101 + .../site-packages/pip/_vendor/rich/layout.py | 443 + .../site-packages/pip/_vendor/rich/live.py | 373 + .../pip/_vendor/rich/live_render.py | 113 + .../site-packages/pip/_vendor/rich/logging.py | 289 + .../site-packages/pip/_vendor/rich/markup.py | 246 + .../site-packages/pip/_vendor/rich/measure.py | 151 + .../site-packages/pip/_vendor/rich/padding.py | 141 + .../site-packages/pip/_vendor/rich/pager.py | 34 + .../site-packages/pip/_vendor/rich/palette.py | 100 + .../site-packages/pip/_vendor/rich/panel.py | 308 + .../site-packages/pip/_vendor/rich/pretty.py | 1029 ++ .../pip/_vendor/rich/progress.py | 1707 ++++ .../pip/_vendor/rich/progress_bar.py | 224 + .../site-packages/pip/_vendor/rich/prompt.py | 376 + .../pip/_vendor/rich/protocol.py | 42 + .../site-packages/pip/_vendor/rich/region.py | 10 + .../site-packages/pip/_vendor/rich/repr.py | 149 + .../site-packages/pip/_vendor/rich/rule.py | 134 + .../site-packages/pip/_vendor/rich/scope.py | 86 + .../site-packages/pip/_vendor/rich/screen.py | 54 + .../site-packages/pip/_vendor/rich/segment.py | 739 ++ .../site-packages/pip/_vendor/rich/spinner.py | 136 + .../site-packages/pip/_vendor/rich/status.py | 132 + .../site-packages/pip/_vendor/rich/style.py | 773 ++ .../site-packages/pip/_vendor/rich/styled.py | 42 + .../site-packages/pip/_vendor/rich/syntax.py | 945 ++ .../site-packages/pip/_vendor/rich/table.py | 1002 ++ .../pip/_vendor/rich/terminal_theme.py | 153 + .../site-packages/pip/_vendor/rich/text.py | 1311 +++ .../site-packages/pip/_vendor/rich/theme.py | 112 + .../site-packages/pip/_vendor/rich/themes.py | 5 + .../pip/_vendor/rich/traceback.py | 677 ++ .../site-packages/pip/_vendor/rich/tree.py | 251 + .../site-packages/pip/_vendor/six.py | 998 ++ .../pip/_vendor/tenacity/__init__.py | 519 + .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 27803 bytes .../__pycache__/_asyncio.cpython-311.pyc | Bin 0 -> 4810 bytes .../__pycache__/_utils.cpython-311.pyc | Bin 0 -> 2075 bytes .../__pycache__/after.cpython-311.pyc | Bin 0 -> 1702 bytes .../__pycache__/before.cpython-311.pyc | Bin 0 -> 1536 bytes .../__pycache__/before_sleep.cpython-311.pyc | Bin 0 -> 2113 bytes .../tenacity/__pycache__/nap.cpython-311.pyc | Bin 0 -> 1575 bytes .../__pycache__/retry.cpython-311.pyc | Bin 0 -> 15049 bytes .../tenacity/__pycache__/stop.cpython-311.pyc | Bin 0 -> 5903 bytes .../__pycache__/tornadoweb.cpython-311.pyc | Bin 0 -> 2921 bytes .../tenacity/__pycache__/wait.cpython-311.pyc | Bin 0 -> 13375 bytes .../pip/_vendor/tenacity/_asyncio.py | 92 + .../pip/_vendor/tenacity/_utils.py | 68 + .../pip/_vendor/tenacity/after.py | 46 + .../pip/_vendor/tenacity/before.py | 41 + .../pip/_vendor/tenacity/before_sleep.py | 58 + .../site-packages/pip/_vendor/tenacity/nap.py | 43 + .../pip/_vendor/tenacity/retry.py | 240 + .../pip/_vendor/tenacity/stop.py | 96 + .../pip/_vendor/tenacity/tornadoweb.py | 59 + .../pip/_vendor/tenacity/wait.py | 232 + .../pip/_vendor/tomli/__init__.py | 11 + .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 420 bytes .../tomli/__pycache__/_parser.cpython-311.pyc | Bin 0 -> 30859 bytes .../tomli/__pycache__/_re.cpython-311.pyc | Bin 0 -> 4499 bytes .../tomli/__pycache__/_types.cpython-311.pyc | Bin 0 -> 412 bytes .../pip/_vendor/tomli/_parser.py | 691 ++ .../site-packages/pip/_vendor/tomli/_re.py | 107 + .../site-packages/pip/_vendor/tomli/_types.py | 10 + .../pip/_vendor/typing_extensions.py | 2209 ++++ .../pip/_vendor/urllib3/__init__.py | 102 + .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 3718 bytes .../__pycache__/_collections.cpython-311.pyc | Bin 0 -> 18306 bytes .../__pycache__/_version.cpython-311.pyc | Bin 0 -> 228 bytes .../__pycache__/connection.cpython-311.pyc | Bin 0 -> 21902 bytes .../connectionpool.cpython-311.pyc | Bin 0 -> 37645 bytes .../__pycache__/exceptions.cpython-311.pyc | Bin 0 -> 16132 bytes .../__pycache__/fields.cpython-311.pyc | Bin 0 -> 11425 bytes .../__pycache__/filepost.cpython-311.pyc | Bin 0 -> 4506 bytes .../__pycache__/poolmanager.cpython-311.pyc | Bin 0 -> 21829 bytes .../__pycache__/request.cpython-311.pyc | Bin 0 -> 6669 bytes .../__pycache__/response.cpython-311.pyc | Bin 0 -> 36552 bytes .../pip/_vendor/urllib3/_collections.py | 337 + .../pip/_vendor/urllib3/_version.py | 2 + .../pip/_vendor/urllib3/connection.py | 567 ++ .../pip/_vendor/urllib3/connectionpool.py | 1110 +++ .../pip/_vendor/urllib3/contrib/__init__.py | 0 .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 214 bytes .../_appengine_environ.cpython-311.pyc | Bin 0 -> 1953 bytes .../__pycache__/appengine.cpython-311.pyc | Bin 0 -> 12160 bytes .../__pycache__/ntlmpool.cpython-311.pyc | Bin 0 -> 6237 bytes .../__pycache__/pyopenssl.cpython-311.pyc | Bin 0 -> 25746 bytes .../securetransport.cpython-311.pyc | Bin 0 -> 36853 bytes .../contrib/__pycache__/socks.cpython-311.pyc | Bin 0 -> 8098 bytes .../urllib3/contrib/_appengine_environ.py | 36 + .../contrib/_securetransport/__init__.py | 0 .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 231 bytes .../__pycache__/bindings.cpython-311.pyc | Bin 0 -> 16978 bytes .../__pycache__/low_level.cpython-311.pyc | Bin 0 -> 15615 bytes .../contrib/_securetransport/bindings.py | 519 + .../contrib/_securetransport/low_level.py | 397 + .../pip/_vendor/urllib3/contrib/appengine.py | 314 + .../pip/_vendor/urllib3/contrib/ntlmpool.py | 130 + .../pip/_vendor/urllib3/contrib/pyopenssl.py | 518 + .../urllib3/contrib/securetransport.py | 921 ++ .../pip/_vendor/urllib3/contrib/socks.py | 216 + .../pip/_vendor/urllib3/exceptions.py | 323 + .../pip/_vendor/urllib3/fields.py | 274 + .../pip/_vendor/urllib3/filepost.py | 98 + .../pip/_vendor/urllib3/packages/__init__.py | 0 .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 215 bytes .../packages/__pycache__/six.cpython-311.pyc | Bin 0 -> 46457 bytes .../urllib3/packages/backports/__init__.py | 0 .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 225 bytes .../__pycache__/makefile.cpython-311.pyc | Bin 0 -> 1972 bytes .../urllib3/packages/backports/makefile.py | 51 + .../pip/_vendor/urllib3/packages/six.py | 1076 ++ .../pip/_vendor/urllib3/poolmanager.py | 537 + .../pip/_vendor/urllib3/request.py | 170 + .../pip/_vendor/urllib3/response.py | 879 ++ .../pip/_vendor/urllib3/util/__init__.py | 49 + .../util/__pycache__/__init__.cpython-311.pyc | Bin 0 -> 1417 bytes .../__pycache__/connection.cpython-311.pyc | Bin 0 -> 5144 bytes .../util/__pycache__/proxy.cpython-311.pyc | Bin 0 -> 1726 bytes .../util/__pycache__/queue.cpython-311.pyc | Bin 0 -> 1509 bytes .../util/__pycache__/request.cpython-311.pyc | Bin 0 -> 4629 bytes .../util/__pycache__/response.cpython-311.pyc | Bin 0 -> 3498 bytes .../util/__pycache__/retry.cpython-311.pyc | Bin 0 -> 22766 bytes .../util/__pycache__/ssl_.cpython-311.pyc | Bin 0 -> 16829 bytes .../ssl_match_hostname.cpython-311.pyc | Bin 0 -> 5808 bytes .../__pycache__/ssltransport.cpython-311.pyc | Bin 0 -> 11637 bytes .../util/__pycache__/timeout.cpython-311.pyc | Bin 0 -> 11045 bytes .../util/__pycache__/url.cpython-311.pyc | Bin 0 -> 17569 bytes .../util/__pycache__/wait.cpython-311.pyc | Bin 0 -> 5011 bytes .../pip/_vendor/urllib3/util/connection.py | 149 + .../pip/_vendor/urllib3/util/proxy.py | 57 + .../pip/_vendor/urllib3/util/queue.py | 22 + .../pip/_vendor/urllib3/util/request.py | 137 + .../pip/_vendor/urllib3/util/response.py | 107 + .../pip/_vendor/urllib3/util/retry.py | 620 ++ .../pip/_vendor/urllib3/util/ssl_.py | 495 + .../urllib3/util/ssl_match_hostname.py | 159 + .../pip/_vendor/urllib3/util/ssltransport.py | 221 + .../pip/_vendor/urllib3/util/timeout.py | 268 + .../pip/_vendor/urllib3/util/url.py | 435 + .../pip/_vendor/urllib3/util/wait.py | 152 + .../site-packages/pip/_vendor/vendor.txt | 23 + .../pip/_vendor/webencodings/__init__.py | 342 + .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 12891 bytes .../__pycache__/labels.cpython-311.pyc | Bin 0 -> 7291 bytes .../__pycache__/mklabels.cpython-311.pyc | Bin 0 -> 3219 bytes .../__pycache__/tests.cpython-311.pyc | Bin 0 -> 11197 bytes .../x_user_defined.cpython-311.pyc | Bin 0 -> 3571 bytes .../pip/_vendor/webencodings/labels.py | 231 + .../pip/_vendor/webencodings/mklabels.py | 59 + .../pip/_vendor/webencodings/tests.py | 153 + .../_vendor/webencodings/x_user_defined.py | 325 + .../lib/python3.11/site-packages/pip/py.typed | 4 + .../site-packages/pkg_resources/__init__.py | 3282 ++++++ .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 156122 bytes .../pkg_resources/_vendor/__init__.py | 0 .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 208 bytes .../typing_extensions.cpython-311.pyc | Bin 0 -> 97425 bytes .../_vendor/__pycache__/zipp.cpython-311.pyc | Bin 0 -> 16001 bytes .../_vendor/importlib_resources/__init__.py | 36 + .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 842 bytes .../__pycache__/_adapters.cpython-311.pyc | Bin 0 -> 10759 bytes .../__pycache__/_common.cpython-311.pyc | Bin 0 -> 4286 bytes .../__pycache__/_compat.cpython-311.pyc | Bin 0 -> 5571 bytes .../__pycache__/_itertools.cpython-311.pyc | Bin 0 -> 1404 bytes .../__pycache__/_legacy.cpython-311.pyc | Bin 0 -> 6502 bytes .../__pycache__/abc.cpython-311.pyc | Bin 0 -> 7503 bytes .../__pycache__/readers.cpython-311.pyc | Bin 0 -> 8377 bytes .../__pycache__/simple.cpython-311.pyc | Bin 0 -> 6399 bytes .../_vendor/importlib_resources/_adapters.py | 170 + .../_vendor/importlib_resources/_common.py | 104 + .../_vendor/importlib_resources/_compat.py | 98 + .../_vendor/importlib_resources/_itertools.py | 35 + .../_vendor/importlib_resources/_legacy.py | 121 + .../_vendor/importlib_resources/abc.py | 137 + .../_vendor/importlib_resources/readers.py | 122 + .../_vendor/importlib_resources/simple.py | 116 + .../pkg_resources/_vendor/jaraco/__init__.py | 0 .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 215 bytes .../__pycache__/context.cpython-311.pyc | Bin 0 -> 10990 bytes .../__pycache__/functools.cpython-311.pyc | Bin 0 -> 20301 bytes .../pkg_resources/_vendor/jaraco/context.py | 253 + .../pkg_resources/_vendor/jaraco/functools.py | 525 + .../_vendor/jaraco/text/__init__.py | 599 ++ .../text/__pycache__/__init__.cpython-311.pyc | Bin 0 -> 26618 bytes .../_vendor/more_itertools/__init__.py | 6 + .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 387 bytes .../__pycache__/more.cpython-311.pyc | Bin 0 -> 169509 bytes .../__pycache__/recipes.cpython-311.pyc | Bin 0 -> 33529 bytes .../_vendor/more_itertools/more.py | 4346 ++++++++ .../_vendor/more_itertools/recipes.py | 841 ++ .../_vendor/packaging/__about__.py | 26 + .../_vendor/packaging/__init__.py | 25 + .../__pycache__/__about__.cpython-311.pyc | Bin 0 -> 659 bytes .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 580 bytes .../__pycache__/_manylinux.cpython-311.pyc | Bin 0 -> 13246 bytes .../__pycache__/_musllinux.cpython-311.pyc | Bin 0 -> 8014 bytes .../__pycache__/_structures.cpython-311.pyc | Bin 0 -> 3702 bytes .../__pycache__/markers.cpython-311.pyc | Bin 0 -> 16551 bytes .../__pycache__/requirements.cpython-311.pyc | Bin 0 -> 7666 bytes .../__pycache__/specifiers.cpython-311.pyc | Bin 0 -> 34380 bytes .../__pycache__/tags.cpython-311.pyc | Bin 0 -> 21365 bytes .../__pycache__/utils.cpython-311.pyc | Bin 0 -> 6700 bytes .../__pycache__/version.cpython-311.pyc | Bin 0 -> 21892 bytes .../_vendor/packaging/_manylinux.py | 301 + .../_vendor/packaging/_musllinux.py | 136 + .../_vendor/packaging/_structures.py | 61 + .../_vendor/packaging/markers.py | 304 + .../_vendor/packaging/requirements.py | 146 + .../_vendor/packaging/specifiers.py | 802 ++ .../pkg_resources/_vendor/packaging/tags.py | 487 + .../pkg_resources/_vendor/packaging/utils.py | 136 + .../_vendor/packaging/version.py | 504 + .../_vendor/platformdirs/__init__.py | 342 + .../_vendor/platformdirs/__main__.py | 46 + .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 12840 bytes .../__pycache__/__main__.cpython-311.pyc | Bin 0 -> 2132 bytes .../__pycache__/android.cpython-311.pyc | Bin 0 -> 6374 bytes .../__pycache__/api.cpython-311.pyc | Bin 0 -> 7201 bytes .../__pycache__/macos.cpython-311.pyc | Bin 0 -> 4611 bytes .../__pycache__/unix.cpython-311.pyc | Bin 0 -> 11043 bytes .../__pycache__/version.cpython-311.pyc | Bin 0 -> 330 bytes .../__pycache__/windows.cpython-311.pyc | Bin 0 -> 9979 bytes .../_vendor/platformdirs/android.py | 120 + .../pkg_resources/_vendor/platformdirs/api.py | 156 + .../_vendor/platformdirs/macos.py | 64 + .../_vendor/platformdirs/unix.py | 181 + .../_vendor/platformdirs/version.py | 4 + .../_vendor/platformdirs/windows.py | 184 + .../_vendor/pyparsing/__init__.py | 331 + .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 8353 bytes .../__pycache__/actions.cpython-311.pyc | Bin 0 -> 8479 bytes .../__pycache__/common.cpython-311.pyc | Bin 0 -> 14801 bytes .../__pycache__/core.cpython-311.pyc | Bin 0 -> 277653 bytes .../__pycache__/exceptions.cpython-311.pyc | Bin 0 -> 12943 bytes .../__pycache__/helpers.cpython-311.pyc | Bin 0 -> 53644 bytes .../__pycache__/results.cpython-311.pyc | Bin 0 -> 36327 bytes .../__pycache__/testing.cpython-311.pyc | Bin 0 -> 19523 bytes .../__pycache__/unicode.cpython-311.pyc | Bin 0 -> 15381 bytes .../__pycache__/util.cpython-311.pyc | Bin 0 -> 14280 bytes .../_vendor/pyparsing/actions.py | 207 + .../pkg_resources/_vendor/pyparsing/common.py | 424 + .../pkg_resources/_vendor/pyparsing/core.py | 5814 +++++++++++ .../_vendor/pyparsing/diagram/__init__.py | 642 ++ .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 28016 bytes .../_vendor/pyparsing/exceptions.py | 267 + .../_vendor/pyparsing/helpers.py | 1088 ++ .../_vendor/pyparsing/results.py | 760 ++ .../_vendor/pyparsing/testing.py | 331 + .../_vendor/pyparsing/unicode.py | 352 + .../pkg_resources/_vendor/pyparsing/util.py | 235 + .../_vendor/typing_extensions.py | 2209 ++++ .../pkg_resources/_vendor/zipp.py | 329 + .../pkg_resources/extern/__init__.py | 81 + .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 4331 bytes .../pycparser-3.0.dist-info/INSTALLER | 1 + .../pycparser-3.0.dist-info/METADATA | 244 + .../pycparser-3.0.dist-info/RECORD | 21 + .../pycparser-3.0.dist-info/WHEEL | 5 + .../pycparser-3.0.dist-info/licenses/LICENSE | 27 + .../pycparser-3.0.dist-info/top_level.txt | 1 + .../site-packages/pycparser/__init__.py | 99 + .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 3236 bytes .../__pycache__/_ast_gen.cpython-311.pyc | Bin 0 -> 14699 bytes .../ast_transforms.cpython-311.pyc | Bin 0 -> 6067 bytes .../__pycache__/c_ast.cpython-311.pyc | Bin 0 -> 54152 bytes .../__pycache__/c_generator.cpython-311.pyc | Bin 0 -> 35596 bytes .../__pycache__/c_lexer.cpython-311.pyc | Bin 0 -> 24982 bytes .../__pycache__/c_parser.cpython-311.pyc | Bin 0 -> 108236 bytes .../site-packages/pycparser/_ast_gen.py | 355 + .../site-packages/pycparser/_c_ast.cfg | 195 + .../site-packages/pycparser/ast_transforms.py | 174 + .../site-packages/pycparser/c_ast.py | 1341 +++ .../site-packages/pycparser/c_generator.py | 573 ++ .../site-packages/pycparser/c_lexer.py | 706 ++ .../site-packages/pycparser/c_parser.py | 2376 +++++ .../pydantic-2.12.5.dist-info/INSTALLER | 1 + .../pydantic-2.12.5.dist-info/METADATA | 1029 ++ .../pydantic-2.12.5.dist-info/RECORD | 217 + .../pydantic-2.12.5.dist-info/WHEEL | 4 + .../licenses/LICENSE | 21 + .../site-packages/pydantic/__init__.py | 456 + .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 13695 bytes .../__pycache__/_migration.cpython-311.pyc | Bin 0 -> 11561 bytes .../alias_generators.cpython-311.pyc | Bin 0 -> 3531 bytes .../__pycache__/aliases.cpython-311.pyc | Bin 0 -> 7219 bytes .../annotated_handlers.cpython-311.pyc | Bin 0 -> 5855 bytes .../class_validators.cpython-311.pyc | Bin 0 -> 404 bytes .../__pycache__/color.cpython-311.pyc | Bin 0 -> 32492 bytes .../__pycache__/config.cpython-311.pyc | Bin 0 -> 8473 bytes .../__pycache__/dataclasses.cpython-311.pyc | Bin 0 -> 18099 bytes .../datetime_parse.cpython-311.pyc | Bin 0 -> 404 bytes .../__pycache__/decorator.cpython-311.pyc | Bin 0 -> 394 bytes .../__pycache__/env_settings.cpython-311.pyc | Bin 0 -> 400 bytes .../error_wrappers.cpython-311.pyc | Bin 0 -> 404 bytes .../__pycache__/errors.cpython-311.pyc | Bin 0 -> 8843 bytes .../__pycache__/fields.cpython-311.pyc | Bin 0 -> 73421 bytes .../functional_serializers.cpython-311.pyc | Bin 0 -> 18709 bytes .../functional_validators.cpython-311.pyc | Bin 0 -> 37272 bytes .../__pycache__/generics.cpython-311.pyc | Bin 0 -> 392 bytes .../pydantic/__pycache__/json.cpython-311.pyc | Bin 0 -> 384 bytes .../__pycache__/json_schema.cpython-311.pyc | Bin 0 -> 134576 bytes .../pydantic/__pycache__/main.cpython-311.pyc | Bin 0 -> 81812 bytes .../pydantic/__pycache__/mypy.cpython-311.pyc | Bin 0 -> 65645 bytes .../__pycache__/networks.cpython-311.pyc | Bin 0 -> 54289 bytes .../__pycache__/parse.cpython-311.pyc | Bin 0 -> 386 bytes .../__pycache__/root_model.cpython-311.pyc | Bin 0 -> 8626 bytes .../__pycache__/schema.cpython-311.pyc | Bin 0 -> 388 bytes .../__pycache__/tools.cpython-311.pyc | Bin 0 -> 386 bytes .../__pycache__/type_adapter.cpython-311.pyc | Bin 0 -> 35890 bytes .../__pycache__/types.cpython-311.pyc | Bin 0 -> 104129 bytes .../__pycache__/typing.cpython-311.pyc | Bin 0 -> 384 bytes .../__pycache__/utils.cpython-311.pyc | Bin 0 -> 386 bytes .../validate_call_decorator.cpython-311.pyc | Bin 0 -> 6050 bytes .../__pycache__/validators.cpython-311.pyc | Bin 0 -> 396 bytes .../__pycache__/version.cpython-311.pyc | Bin 0 -> 5365 bytes .../__pycache__/warnings.cpython-311.pyc | Bin 0 -> 8494 bytes .../pydantic/_internal/__init__.py | 0 .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 205 bytes .../__pycache__/_config.cpython-311.pyc | Bin 0 -> 18351 bytes .../_core_metadata.cpython-311.pyc | Bin 0 -> 5072 bytes .../__pycache__/_core_utils.cpython-311.pyc | Bin 0 -> 8590 bytes .../__pycache__/_dataclasses.cpython-311.pyc | Bin 0 -> 14336 bytes .../__pycache__/_decorators.cpython-311.pyc | Bin 0 -> 41631 bytes .../_decorators_v1.cpython-311.pyc | Bin 0 -> 9927 bytes .../_discriminated_union.cpython-311.pyc | Bin 0 -> 23304 bytes .../_docs_extraction.cpython-311.pyc | Bin 0 -> 5782 bytes .../__pycache__/_fields.cpython-311.pyc | Bin 0 -> 26203 bytes .../__pycache__/_forward_ref.cpython-311.pyc | Bin 0 -> 1479 bytes .../_generate_schema.cpython-311.pyc | Bin 0 -> 144256 bytes .../__pycache__/_generics.cpython-311.pyc | Bin 0 -> 27122 bytes .../__pycache__/_git.cpython-311.pyc | Bin 0 -> 1718 bytes .../__pycache__/_import_utils.cpython-311.pyc | Bin 0 -> 976 bytes .../_internal_dataclass.cpython-311.pyc | Bin 0 -> 352 bytes .../_known_annotated_metadata.cpython-311.pyc | Bin 0 -> 15930 bytes .../__pycache__/_mock_val_ser.cpython-311.pyc | Bin 0 -> 12352 bytes .../_model_construction.cpython-311.pyc | Bin 0 -> 39470 bytes .../_namespace_utils.cpython-311.pyc | Bin 0 -> 13482 bytes .../__pycache__/_repr.cpython-311.pyc | Bin 0 -> 9066 bytes .../_schema_gather.cpython-311.pyc | Bin 0 -> 9274 bytes .../_schema_generation_shared.cpython-311.pyc | Bin 0 -> 6780 bytes .../__pycache__/_serializers.cpython-311.pyc | Bin 0 -> 2116 bytes .../__pycache__/_signature.cpython-311.pyc | Bin 0 -> 7402 bytes .../__pycache__/_typing_extra.cpython-311.pyc | Bin 0 -> 29705 bytes .../__pycache__/_utils.cpython-311.pyc | Bin 0 -> 22721 bytes .../_validate_call.cpython-311.pyc | Bin 0 -> 7214 bytes .../__pycache__/_validators.cpython-311.pyc | Bin 0 -> 25753 bytes .../pydantic/_internal/_config.py | 383 + .../pydantic/_internal/_core_metadata.py | 97 + .../pydantic/_internal/_core_utils.py | 174 + .../pydantic/_internal/_dataclasses.py | 315 + .../pydantic/_internal/_decorators.py | 858 ++ .../pydantic/_internal/_decorators_v1.py | 174 + .../_internal/_discriminated_union.py | 479 + .../pydantic/_internal/_docs_extraction.py | 113 + .../pydantic/_internal/_fields.py | 635 ++ .../pydantic/_internal/_forward_ref.py | 23 + .../pydantic/_internal/_generate_schema.py | 2867 ++++++ .../pydantic/_internal/_generics.py | 543 + .../site-packages/pydantic/_internal/_git.py | 27 + .../pydantic/_internal/_import_utils.py | 20 + .../pydantic/_internal/_internal_dataclass.py | 7 + .../_internal/_known_annotated_metadata.py | 401 + .../pydantic/_internal/_mock_val_ser.py | 228 + .../pydantic/_internal/_model_construction.py | 848 ++ .../pydantic/_internal/_namespace_utils.py | 293 + .../site-packages/pydantic/_internal/_repr.py | 124 + .../pydantic/_internal/_schema_gather.py | 209 + .../_internal/_schema_generation_shared.py | 125 + .../pydantic/_internal/_serializers.py | 53 + .../pydantic/_internal/_signature.py | 188 + .../pydantic/_internal/_typing_extra.py | 760 ++ .../pydantic/_internal/_utils.py | 446 + .../pydantic/_internal/_validate_call.py | 140 + .../pydantic/_internal/_validators.py | 533 + .../site-packages/pydantic/_migration.py | 316 + .../pydantic/alias_generators.py | 62 + .../site-packages/pydantic/aliases.py | 135 + .../pydantic/annotated_handlers.py | 122 + .../pydantic/class_validators.py | 5 + .../site-packages/pydantic/color.py | 604 ++ .../site-packages/pydantic/config.py | 1288 +++ .../site-packages/pydantic/dataclasses.py | 413 + .../site-packages/pydantic/datetime_parse.py | 5 + .../site-packages/pydantic/decorator.py | 5 + .../pydantic/deprecated/__init__.py | 0 .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 206 bytes .../class_validators.cpython-311.pyc | Bin 0 -> 12876 bytes .../__pycache__/config.cpython-311.pyc | Bin 0 -> 4872 bytes .../copy_internals.cpython-311.pyc | Bin 0 -> 9517 bytes .../__pycache__/decorator.cpython-311.pyc | Bin 0 -> 15640 bytes .../__pycache__/json.cpython-311.pyc | Bin 0 -> 6830 bytes .../__pycache__/parse.cpython-311.pyc | Bin 0 -> 3674 bytes .../__pycache__/tools.cpython-311.pyc | Bin 0 -> 3903 bytes .../pydantic/deprecated/class_validators.py | 256 + .../pydantic/deprecated/config.py | 72 + .../pydantic/deprecated/copy_internals.py | 224 + .../pydantic/deprecated/decorator.py | 284 + .../site-packages/pydantic/deprecated/json.py | 141 + .../pydantic/deprecated/parse.py | 80 + .../pydantic/deprecated/tools.py | 103 + .../site-packages/pydantic/env_settings.py | 5 + .../site-packages/pydantic/error_wrappers.py | 5 + .../site-packages/pydantic/errors.py | 189 + .../pydantic/experimental/__init__.py | 1 + .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 319 bytes .../arguments_schema.cpython-311.pyc | Bin 0 -> 2572 bytes .../missing_sentinel.cpython-311.pyc | Bin 0 -> 373 bytes .../__pycache__/pipeline.cpython-311.pyc | Bin 0 -> 38459 bytes .../pydantic/experimental/arguments_schema.py | 44 + .../pydantic/experimental/missing_sentinel.py | 5 + .../pydantic/experimental/pipeline.py | 654 ++ .../site-packages/pydantic/fields.py | 1834 ++++ .../pydantic/functional_serializers.py | 451 + .../pydantic/functional_validators.py | 893 ++ .../site-packages/pydantic/generics.py | 5 + .../python3.11/site-packages/pydantic/json.py | 5 + .../site-packages/pydantic/json_schema.py | 2854 ++++++ .../python3.11/site-packages/pydantic/main.py | 1819 ++++ .../python3.11/site-packages/pydantic/mypy.py | 1374 +++ .../site-packages/pydantic/networks.py | 1331 +++ .../site-packages/pydantic/parse.py | 5 + .../site-packages/pydantic/plugin/__init__.py | 193 + .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 9520 bytes .../__pycache__/_loader.cpython-311.pyc | Bin 0 -> 2587 bytes .../_schema_validator.cpython-311.pyc | Bin 0 -> 7661 bytes .../site-packages/pydantic/plugin/_loader.py | 58 + .../pydantic/plugin/_schema_validator.py | 140 + .../site-packages/pydantic/py.typed | 0 .../site-packages/pydantic/root_model.py | 155 + .../site-packages/pydantic/schema.py | 5 + .../site-packages/pydantic/tools.py | 5 + .../site-packages/pydantic/type_adapter.py | 795 ++ .../site-packages/pydantic/types.py | 3295 ++++++ .../site-packages/pydantic/typing.py | 5 + .../site-packages/pydantic/utils.py | 5 + .../site-packages/pydantic/v1/__init__.py | 142 + .../v1/__pycache__/__init__.cpython-311.pyc | Bin 0 -> 2778 bytes .../_hypothesis_plugin.cpython-311.pyc | Bin 0 -> 20257 bytes .../annotated_types.cpython-311.pyc | Bin 0 -> 4703 bytes .../class_validators.cpython-311.pyc | Bin 0 -> 22816 bytes .../v1/__pycache__/color.cpython-311.pyc | Bin 0 -> 28235 bytes .../v1/__pycache__/config.cpython-311.pyc | Bin 0 -> 10063 bytes .../__pycache__/dataclasses.cpython-311.pyc | Bin 0 -> 25834 bytes .../datetime_parse.cpython-311.pyc | Bin 0 -> 11994 bytes .../v1/__pycache__/decorator.cpython-311.pyc | Bin 0 -> 15697 bytes .../__pycache__/env_settings.cpython-311.pyc | Bin 0 -> 20048 bytes .../error_wrappers.cpython-311.pyc | Bin 0 -> 10065 bytes .../v1/__pycache__/errors.cpython-311.pyc | Bin 0 -> 36557 bytes .../v1/__pycache__/fields.cpython-311.pyc | Bin 0 -> 62998 bytes .../v1/__pycache__/generics.cpython-311.pyc | Bin 0 -> 19736 bytes .../v1/__pycache__/json.cpython-311.pyc | Bin 0 -> 5705 bytes .../v1/__pycache__/main.cpython-311.pyc | Bin 0 -> 55099 bytes .../v1/__pycache__/mypy.cpython-311.pyc | Bin 0 -> 50427 bytes .../v1/__pycache__/networks.cpython-311.pyc | Bin 0 -> 34196 bytes .../v1/__pycache__/parse.cpython-311.pyc | Bin 0 -> 3053 bytes .../v1/__pycache__/schema.cpython-311.pyc | Bin 0 -> 54652 bytes .../v1/__pycache__/tools.cpython-311.pyc | Bin 0 -> 4480 bytes .../v1/__pycache__/types.cpython-311.pyc | Bin 0 -> 55112 bytes .../v1/__pycache__/typing.cpython-311.pyc | Bin 0 -> 25704 bytes .../v1/__pycache__/utils.cpython-311.pyc | Bin 0 -> 40788 bytes .../v1/__pycache__/validators.cpython-311.pyc | Bin 0 -> 34991 bytes .../v1/__pycache__/version.cpython-311.pyc | Bin 0 -> 2215 bytes .../pydantic/v1/_hypothesis_plugin.py | 391 + .../pydantic/v1/annotated_types.py | 72 + .../pydantic/v1/class_validators.py | 361 + .../site-packages/pydantic/v1/color.py | 494 + .../site-packages/pydantic/v1/config.py | 191 + .../site-packages/pydantic/v1/dataclasses.py | 500 + .../pydantic/v1/datetime_parse.py | 248 + .../site-packages/pydantic/v1/decorator.py | 264 + .../site-packages/pydantic/v1/env_settings.py | 350 + .../pydantic/v1/error_wrappers.py | 161 + .../site-packages/pydantic/v1/errors.py | 646 ++ .../site-packages/pydantic/v1/fields.py | 1253 +++ .../site-packages/pydantic/v1/generics.py | 400 + .../site-packages/pydantic/v1/json.py | 112 + .../site-packages/pydantic/v1/main.py | 1113 +++ .../site-packages/pydantic/v1/mypy.py | 949 ++ .../site-packages/pydantic/v1/networks.py | 747 ++ .../site-packages/pydantic/v1/parse.py | 66 + .../site-packages/pydantic/v1/py.typed | 0 .../site-packages/pydantic/v1/schema.py | 1163 +++ .../site-packages/pydantic/v1/tools.py | 92 + .../site-packages/pydantic/v1/types.py | 1205 +++ .../site-packages/pydantic/v1/typing.py | 614 ++ .../site-packages/pydantic/v1/utils.py | 806 ++ .../site-packages/pydantic/v1/validators.py | 768 ++ .../site-packages/pydantic/v1/version.py | 38 + .../pydantic/validate_call_decorator.py | 116 + .../site-packages/pydantic/validators.py | 5 + .../site-packages/pydantic/version.py | 113 + .../site-packages/pydantic/warnings.py | 122 + .../pydantic_core-2.41.5.dist-info/INSTALLER | 1 + .../pydantic_core-2.41.5.dist-info/METADATA | 180 + .../pydantic_core-2.41.5.dist-info/RECORD | 12 + .../pydantic_core-2.41.5.dist-info/WHEEL | 4 + .../licenses/LICENSE | 21 + .../site-packages/pydantic_core/__init__.py | 171 + .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 3839 bytes .../__pycache__/core_schema.cpython-311.pyc | Bin 0 -> 161366 bytes ...antic_core.cpython-311-x86_64-linux-gnu.so | Bin 0 -> 4858472 bytes .../pydantic_core/_pydantic_core.pyi | 1046 ++ .../pydantic_core/core_schema.py | 4435 +++++++++ .../site-packages/pydantic_core/py.typed | 0 .../INSTALLER | 1 + .../METADATA | 63 + .../pydantic_settings-2.12.0.dist-info/RECORD | 50 + .../pydantic_settings-2.12.0.dist-info/WHEEL | 4 + .../licenses/LICENSE | 21 + .../pydantic_settings/__init__.py | 65 + .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 1693 bytes .../__pycache__/exceptions.cpython-311.pyc | Bin 0 -> 509 bytes .../__pycache__/main.cpython-311.pyc | Bin 0 -> 30735 bytes .../__pycache__/utils.cpython-311.pyc | Bin 0 -> 1858 bytes .../__pycache__/version.cpython-311.pyc | Bin 0 -> 220 bytes .../pydantic_settings/exceptions.py | 4 + .../site-packages/pydantic_settings/main.py | 717 ++ .../site-packages/pydantic_settings/py.typed | 0 .../pydantic_settings/sources/__init__.py | 70 + .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 2328 bytes .../sources/__pycache__/base.cpython-311.pyc | Bin 0 -> 27367 bytes .../sources/__pycache__/types.cpython-311.pyc | Bin 0 -> 2840 bytes .../sources/__pycache__/utils.cpython-311.pyc | Bin 0 -> 12000 bytes .../pydantic_settings/sources/base.py | 541 + .../sources/providers/__init__.py | 41 + .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 1421 bytes .../providers/__pycache__/aws.cpython-311.pyc | Bin 0 -> 3602 bytes .../__pycache__/azure.cpython-311.pyc | Bin 0 -> 8791 bytes .../providers/__pycache__/cli.cpython-311.pyc | Bin 0 -> 77161 bytes .../__pycache__/dotenv.cpython-311.pyc | Bin 0 -> 7415 bytes .../providers/__pycache__/env.cpython-311.pyc | Bin 0 -> 13844 bytes .../providers/__pycache__/gcp.cpython-311.pyc | Bin 0 -> 7850 bytes .../__pycache__/json.cpython-311.pyc | Bin 0 -> 2887 bytes .../nested_secrets.cpython-311.pyc | Bin 0 -> 9234 bytes .../__pycache__/pyproject.cpython-311.pyc | Bin 0 -> 3303 bytes .../__pycache__/secrets.cpython-311.pyc | Bin 0 -> 6524 bytes .../__pycache__/toml.cpython-311.pyc | Bin 0 -> 3609 bytes .../__pycache__/yaml.cpython-311.pyc | Bin 0 -> 3891 bytes .../sources/providers/aws.py | 79 + .../sources/providers/azure.py | 145 + .../sources/providers/cli.py | 1357 +++ .../sources/providers/dotenv.py | 168 + .../sources/providers/env.py | 294 + .../sources/providers/gcp.py | 152 + .../sources/providers/json.py | 47 + .../sources/providers/nested_secrets.py | 166 + .../sources/providers/pyproject.py | 62 + .../sources/providers/secrets.py | 125 + .../sources/providers/toml.py | 66 + .../sources/providers/yaml.py | 75 + .../pydantic_settings/sources/types.py | 78 + .../pydantic_settings/sources/utils.py | 214 + .../site-packages/pydantic_settings/utils.py | 42 + .../pydantic_settings/version.py | 1 + .../pymysql-1.1.2.dist-info/INSTALLER | 1 + .../pymysql-1.1.2.dist-info/METADATA | 131 + .../pymysql-1.1.2.dist-info/RECORD | 43 + .../pymysql-1.1.2.dist-info/REQUESTED | 0 .../pymysql-1.1.2.dist-info/WHEEL | 5 + .../pymysql-1.1.2.dist-info/licenses/LICENSE | 19 + .../pymysql-1.1.2.dist-info/top_level.txt | 1 + .../site-packages/pymysql/__init__.py | 183 + .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 5352 bytes .../pymysql/__pycache__/_auth.cpython-311.pyc | Bin 0 -> 11336 bytes .../__pycache__/charset.cpython-311.pyc | Bin 0 -> 20530 bytes .../__pycache__/connections.cpython-311.pyc | Bin 0 -> 63083 bytes .../__pycache__/converters.cpython-311.pyc | Bin 0 -> 15099 bytes .../__pycache__/cursors.cpython-311.pyc | Bin 0 -> 24680 bytes .../pymysql/__pycache__/err.cpython-311.pyc | Bin 0 -> 6933 bytes .../__pycache__/optionfile.cpython-311.pyc | Bin 0 -> 1785 bytes .../__pycache__/protocol.cpython-311.pyc | Bin 0 -> 20121 bytes .../pymysql/__pycache__/times.cpython-311.pyc | Bin 0 -> 1084 bytes .../python3.11/site-packages/pymysql/_auth.py | 272 + .../site-packages/pymysql/charset.py | 217 + .../site-packages/pymysql/connections.py | 1435 +++ .../site-packages/pymysql/constants/CLIENT.py | 38 + .../pymysql/constants/COMMAND.py | 32 + .../site-packages/pymysql/constants/CR.py | 79 + .../site-packages/pymysql/constants/ER.py | 477 + .../pymysql/constants/FIELD_TYPE.py | 31 + .../site-packages/pymysql/constants/FLAG.py | 15 + .../pymysql/constants/SERVER_STATUS.py | 10 + .../pymysql/constants/__init__.py | 0 .../__pycache__/CLIENT.cpython-311.pyc | Bin 0 -> 1042 bytes .../__pycache__/COMMAND.cpython-311.pyc | Bin 0 -> 1137 bytes .../constants/__pycache__/CR.cpython-311.pyc | Bin 0 -> 3139 bytes .../constants/__pycache__/ER.cpython-311.pyc | Bin 0 -> 17441 bytes .../__pycache__/FIELD_TYPE.cpython-311.pyc | Bin 0 -> 851 bytes .../__pycache__/FLAG.cpython-311.pyc | Bin 0 -> 543 bytes .../__pycache__/SERVER_STATUS.cpython-311.pyc | Bin 0 -> 643 bytes .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 204 bytes .../site-packages/pymysql/converters.py | 363 + .../site-packages/pymysql/cursors.py | 531 + .../python3.11/site-packages/pymysql/err.py | 150 + .../site-packages/pymysql/optionfile.py | 21 + .../site-packages/pymysql/protocol.py | 356 + .../python3.11/site-packages/pymysql/times.py | 20 + .../python_dotenv-1.2.1.dist-info/INSTALLER | 1 + .../python_dotenv-1.2.1.dist-info/METADATA | 749 ++ .../python_dotenv-1.2.1.dist-info/RECORD | 26 + .../python_dotenv-1.2.1.dist-info/REQUESTED | 0 .../python_dotenv-1.2.1.dist-info/WHEEL | 5 + .../entry_points.txt | 2 + .../licenses/LICENSE | 27 + .../top_level.txt | 1 + .../INSTALLER | 1 + .../METADATA | 40 + .../python_multipart-0.0.22.dist-info/RECORD | 22 + .../python_multipart-0.0.22.dist-info/WHEEL | 4 + .../licenses/LICENSE.txt | 14 + .../python_multipart/__init__.py | 25 + .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 664 bytes .../__pycache__/decoders.cpython-311.pyc | Bin 0 -> 9004 bytes .../__pycache__/exceptions.cpython-311.pyc | Bin 0 -> 2066 bytes .../__pycache__/multipart.cpython-311.pyc | Bin 0 -> 73806 bytes .../python_multipart/decoders.py | 185 + .../python_multipart/exceptions.py | 34 + .../python_multipart/multipart.py | 1874 ++++ .../site-packages/python_multipart/py.typed | 0 .../referencing-0.37.0.dist-info/INSTALLER | 1 + .../referencing-0.37.0.dist-info/METADATA | 64 + .../referencing-0.37.0.dist-info/RECORD | 33 + .../referencing-0.37.0.dist-info/WHEEL | 4 + .../licenses/COPYING | 19 + .../site-packages/referencing/__init__.py | 7 + .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 458 bytes .../__pycache__/_attrs.cpython-311.pyc | Bin 0 -> 1700 bytes .../__pycache__/_core.cpython-311.pyc | Bin 0 -> 33099 bytes .../__pycache__/exceptions.cpython-311.pyc | Bin 0 -> 7770 bytes .../__pycache__/jsonschema.cpython-311.pyc | Bin 0 -> 19772 bytes .../__pycache__/retrieval.cpython-311.pyc | Bin 0 -> 3785 bytes .../__pycache__/typing.cpython-311.pyc | Bin 0 -> 2638 bytes .../site-packages/referencing/_attrs.py | 31 + .../site-packages/referencing/_attrs.pyi | 21 + .../site-packages/referencing/_core.py | 739 ++ .../site-packages/referencing/exceptions.py | 165 + .../site-packages/referencing/jsonschema.py | 642 ++ .../site-packages/referencing/py.typed | 0 .../site-packages/referencing/retrieval.py | 94 + .../referencing/tests/__init__.py | 0 .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 204 bytes .../__pycache__/test_core.cpython-311.pyc | Bin 0 -> 69538 bytes .../test_exceptions.cpython-311.pyc | Bin 0 -> 2962 bytes .../test_jsonschema.cpython-311.pyc | Bin 0 -> 13947 bytes .../test_referencing_suite.cpython-311.pyc | Bin 0 -> 5184 bytes .../test_retrieval.cpython-311.pyc | Bin 0 -> 6811 bytes .../referencing/tests/test_core.py | 1057 ++ .../referencing/tests/test_exceptions.py | 34 + .../referencing/tests/test_jsonschema.py | 382 + .../tests/test_referencing_suite.py | 66 + .../referencing/tests/test_retrieval.py | 106 + .../site-packages/referencing/typing.py | 61 + .../requests-2.32.5.dist-info/INSTALLER | 1 + .../requests-2.32.5.dist-info/METADATA | 133 + .../requests-2.32.5.dist-info/RECORD | 43 + .../requests-2.32.5.dist-info/REQUESTED | 0 .../requests-2.32.5.dist-info/WHEEL | 5 + .../licenses/LICENSE | 175 + .../requests-2.32.5.dist-info/top_level.txt | 1 + .../site-packages/requests/__init__.py | 184 + .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 6379 bytes .../__pycache__/__version__.cpython-311.pyc | Bin 0 -> 582 bytes .../_internal_utils.cpython-311.pyc | Bin 0 -> 2146 bytes .../__pycache__/adapters.cpython-311.pyc | Bin 0 -> 30031 bytes .../requests/__pycache__/api.cpython-311.pyc | Bin 0 -> 7499 bytes .../requests/__pycache__/auth.cpython-311.pyc | Bin 0 -> 14626 bytes .../__pycache__/certs.cpython-311.pyc | Bin 0 -> 716 bytes .../__pycache__/compat.cpython-311.pyc | Bin 0 -> 2803 bytes .../__pycache__/cookies.cpython-311.pyc | Bin 0 -> 27136 bytes .../__pycache__/exceptions.cpython-311.pyc | Bin 0 -> 9067 bytes .../requests/__pycache__/help.cpython-311.pyc | Bin 0 -> 4533 bytes .../__pycache__/hooks.cpython-311.pyc | Bin 0 -> 1246 bytes .../__pycache__/models.cpython-311.pyc | Bin 0 -> 38828 bytes .../__pycache__/packages.cpython-311.pyc | Bin 0 -> 1169 bytes .../__pycache__/sessions.cpython-311.pyc | Bin 0 -> 29822 bytes .../__pycache__/status_codes.cpython-311.pyc | Bin 0 -> 6305 bytes .../__pycache__/structures.cpython-311.pyc | Bin 0 -> 6218 bytes .../__pycache__/utils.cpython-311.pyc | Bin 0 -> 40274 bytes .../site-packages/requests/__version__.py | 14 + .../site-packages/requests/_internal_utils.py | 50 + .../site-packages/requests/adapters.py | 696 ++ .../python3.11/site-packages/requests/api.py | 157 + .../python3.11/site-packages/requests/auth.py | 314 + .../site-packages/requests/certs.py | 17 + .../site-packages/requests/compat.py | 106 + .../site-packages/requests/cookies.py | 561 ++ .../site-packages/requests/exceptions.py | 151 + .../python3.11/site-packages/requests/help.py | 134 + .../site-packages/requests/hooks.py | 33 + .../site-packages/requests/models.py | 1039 ++ .../site-packages/requests/packages.py | 23 + .../site-packages/requests/sessions.py | 831 ++ .../site-packages/requests/status_codes.py | 128 + .../site-packages/requests/structures.py | 99 + .../site-packages/requests/utils.py | 1086 ++ .../python3.11/site-packages/rpds/__init__.py | 5 + .../site-packages/rpds/__init__.pyi | 79 + .../rpds/__pycache__/__init__.cpython-311.pyc | Bin 0 -> 350 bytes .../python3.11/site-packages/rpds/py.typed | 0 .../rpds/rpds.cpython-311-x86_64-linux-gnu.so | Bin 0 -> 1054384 bytes .../rpds_py-0.30.0.dist-info/INSTALLER | 1 + .../rpds_py-0.30.0.dist-info/METADATA | 99 + .../rpds_py-0.30.0.dist-info/RECORD | 10 + .../rpds_py-0.30.0.dist-info/WHEEL | 5 + .../rpds_py-0.30.0.dist-info/licenses/LICENSE | 19 + .../setuptools-66.1.1.dist-info/INSTALLER | 1 + .../setuptools-66.1.1.dist-info/LICENSE | 19 + .../setuptools-66.1.1.dist-info/METADATA | 137 + .../setuptools-66.1.1.dist-info/RECORD | 484 + .../setuptools-66.1.1.dist-info/REQUESTED | 0 .../setuptools-66.1.1.dist-info/WHEEL | 5 + .../entry_points.txt | 57 + .../setuptools-66.1.1.dist-info/top_level.txt | 4 + .../site-packages/setuptools/__init__.py | 268 + .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 13936 bytes .../_deprecation_warning.cpython-311.pyc | Bin 0 -> 652 bytes .../__pycache__/_entry_points.cpython-311.pyc | Bin 0 -> 5209 bytes .../__pycache__/_imp.cpython-311.pyc | Bin 0 -> 3665 bytes .../__pycache__/_importlib.cpython-311.pyc | Bin 0 -> 1965 bytes .../__pycache__/_itertools.cpython-311.pyc | Bin 0 -> 1164 bytes .../__pycache__/_path.cpython-311.pyc | Bin 0 -> 1485 bytes .../__pycache__/_reqs.cpython-311.pyc | Bin 0 -> 1146 bytes .../__pycache__/archive_util.cpython-311.pyc | Bin 0 -> 10174 bytes .../__pycache__/build_meta.cpython-311.pyc | Bin 0 -> 28157 bytes .../__pycache__/dep_util.cpython-311.pyc | Bin 0 -> 1300 bytes .../__pycache__/depends.cpython-311.pyc | Bin 0 -> 7985 bytes .../__pycache__/discovery.cpython-311.pyc | Bin 0 -> 31138 bytes .../__pycache__/dist.cpython-311.pyc | Bin 0 -> 63805 bytes .../__pycache__/errors.cpython-311.pyc | Bin 0 -> 2961 bytes .../__pycache__/extension.cpython-311.pyc | Bin 0 -> 6817 bytes .../__pycache__/glob.cpython-311.pyc | Bin 0 -> 6574 bytes .../__pycache__/installer.cpython-311.pyc | Bin 0 -> 5624 bytes .../__pycache__/launch.cpython-311.pyc | Bin 0 -> 1540 bytes .../__pycache__/logging.cpython-311.pyc | Bin 0 -> 2107 bytes .../__pycache__/monkey.cpython-311.pyc | Bin 0 -> 7017 bytes .../__pycache__/msvc.cpython-311.pyc | Bin 0 -> 64190 bytes .../__pycache__/namespaces.cpython-311.pyc | Bin 0 -> 5672 bytes .../__pycache__/package_index.cpython-311.pyc | Bin 0 -> 62136 bytes .../__pycache__/py34compat.cpython-311.pyc | Bin 0 -> 727 bytes .../__pycache__/sandbox.cpython-311.pyc | Bin 0 -> 27343 bytes .../__pycache__/unicode_utils.cpython-311.pyc | Bin 0 -> 1829 bytes .../__pycache__/version.cpython-311.pyc | Bin 0 -> 447 bytes .../__pycache__/wheel.cpython-311.pyc | Bin 0 -> 15503 bytes .../windows_support.cpython-311.pyc | Bin 0 -> 1444 bytes .../setuptools/_deprecation_warning.py | 7 + .../setuptools/_distutils/__init__.py | 14 + .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 571 bytes .../__pycache__/_collections.cpython-311.pyc | Bin 0 -> 8541 bytes .../__pycache__/_functools.cpython-311.pyc | Bin 0 -> 873 bytes .../__pycache__/_log.cpython-311.pyc | Bin 0 -> 290 bytes .../__pycache__/_macos_compat.cpython-311.pyc | Bin 0 -> 582 bytes .../__pycache__/_msvccompiler.cpython-311.pyc | Bin 0 -> 25084 bytes .../__pycache__/archive_util.cpython-311.pyc | Bin 0 -> 10632 bytes .../__pycache__/bcppcompiler.cpython-311.pyc | Bin 0 -> 13458 bytes .../__pycache__/ccompiler.cpython-311.pyc | Bin 0 -> 46327 bytes .../__pycache__/cmd.cpython-311.pyc | Bin 0 -> 18851 bytes .../__pycache__/config.cpython-311.pyc | Bin 0 -> 6052 bytes .../__pycache__/core.cpython-311.pyc | Bin 0 -> 9942 bytes .../cygwinccompiler.cpython-311.pyc | Bin 0 -> 13636 bytes .../__pycache__/debug.cpython-311.pyc | Bin 0 -> 334 bytes .../__pycache__/dep_util.cpython-311.pyc | Bin 0 -> 3996 bytes .../__pycache__/dir_util.cpython-311.pyc | Bin 0 -> 10377 bytes .../__pycache__/dist.cpython-311.pyc | Bin 0 -> 55500 bytes .../__pycache__/errors.cpython-311.pyc | Bin 0 -> 6807 bytes .../__pycache__/extension.cpython-311.pyc | Bin 0 -> 10188 bytes .../__pycache__/fancy_getopt.cpython-311.pyc | Bin 0 -> 17247 bytes .../__pycache__/file_util.cpython-311.pyc | Bin 0 -> 10681 bytes .../__pycache__/filelist.cpython-311.pyc | Bin 0 -> 17621 bytes .../__pycache__/log.cpython-311.pyc | Bin 0 -> 2705 bytes .../__pycache__/msvc9compiler.cpython-311.pyc | Bin 0 -> 33570 bytes .../__pycache__/msvccompiler.cpython-311.pyc | Bin 0 -> 26982 bytes .../__pycache__/py38compat.cpython-311.pyc | Bin 0 -> 634 bytes .../__pycache__/py39compat.cpython-311.pyc | Bin 0 -> 1002 bytes .../__pycache__/spawn.cpython-311.pyc | Bin 0 -> 4446 bytes .../__pycache__/sysconfig.cpython-311.pyc | Bin 0 -> 22083 bytes .../__pycache__/text_file.cpython-311.pyc | Bin 0 -> 11283 bytes .../__pycache__/unixccompiler.cpython-311.pyc | Bin 0 -> 16506 bytes .../__pycache__/util.cpython-311.pyc | Bin 0 -> 20857 bytes .../__pycache__/version.cpython-311.pyc | Bin 0 -> 11359 bytes .../versionpredicate.cpython-311.pyc | Bin 0 -> 7636 bytes .../setuptools/_distutils/_collections.py | 194 + .../setuptools/_distutils/_functools.py | 20 + .../setuptools/_distutils/_log.py | 4 + .../setuptools/_distutils/_macos_compat.py | 12 + .../setuptools/_distutils/_msvccompiler.py | 572 ++ .../setuptools/_distutils/archive_util.py | 280 + .../setuptools/_distutils/bcppcompiler.py | 408 + .../setuptools/_distutils/ccompiler.py | 1220 +++ .../setuptools/_distutils/cmd.py | 435 + .../setuptools/_distutils/command/__init__.py | 25 + .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 554 bytes .../_framework_compat.cpython-311.pyc | Bin 0 -> 2795 bytes .../command/__pycache__/bdist.cpython-311.pyc | Bin 0 -> 6013 bytes .../__pycache__/bdist_dumb.cpython-311.pyc | Bin 0 -> 5733 bytes .../__pycache__/bdist_rpm.cpython-311.pyc | Bin 0 -> 23267 bytes .../command/__pycache__/build.cpython-311.pyc | Bin 0 -> 6068 bytes .../__pycache__/build_clib.cpython-311.pyc | Bin 0 -> 7776 bytes .../__pycache__/build_ext.cpython-311.pyc | Bin 0 -> 30286 bytes .../__pycache__/build_py.cpython-311.pyc | Bin 0 -> 17612 bytes .../__pycache__/build_scripts.cpython-311.pyc | Bin 0 -> 7866 bytes .../command/__pycache__/check.cpython-311.pyc | Bin 0 -> 7522 bytes .../command/__pycache__/clean.cpython-311.pyc | Bin 0 -> 3198 bytes .../__pycache__/config.cpython-311.pyc | Bin 0 -> 16235 bytes .../__pycache__/install.cpython-311.pyc | Bin 0 -> 29387 bytes .../__pycache__/install_data.cpython-311.pyc | Bin 0 -> 3775 bytes .../install_egg_info.cpython-311.pyc | Bin 0 -> 5230 bytes .../install_headers.cpython-311.pyc | Bin 0 -> 2363 bytes .../__pycache__/install_lib.cpython-311.pyc | Bin 0 -> 8684 bytes .../install_scripts.cpython-311.pyc | Bin 0 -> 3170 bytes .../__pycache__/py37compat.cpython-311.pyc | Bin 0 -> 1551 bytes .../__pycache__/register.cpython-311.pyc | Bin 0 -> 15569 bytes .../command/__pycache__/sdist.cpython-311.pyc | Bin 0 -> 23781 bytes .../__pycache__/upload.cpython-311.pyc | Bin 0 -> 10435 bytes .../_distutils/command/_framework_compat.py | 55 + .../setuptools/_distutils/command/bdist.py | 157 + .../_distutils/command/bdist_dumb.py | 144 + .../_distutils/command/bdist_rpm.py | 615 ++ .../setuptools/_distutils/command/build.py | 153 + .../_distutils/command/build_clib.py | 208 + .../_distutils/command/build_ext.py | 789 ++ .../setuptools/_distutils/command/build_py.py | 407 + .../_distutils/command/build_scripts.py | 173 + .../setuptools/_distutils/command/check.py | 151 + .../setuptools/_distutils/command/clean.py | 76 + .../setuptools/_distutils/command/config.py | 377 + .../setuptools/_distutils/command/install.py | 814 ++ .../_distutils/command/install_data.py | 84 + .../_distutils/command/install_egg_info.py | 92 + .../_distutils/command/install_headers.py | 45 + .../_distutils/command/install_lib.py | 238 + .../_distutils/command/install_scripts.py | 61 + .../_distutils/command/py37compat.py | 31 + .../setuptools/_distutils/command/register.py | 321 + .../setuptools/_distutils/command/sdist.py | 531 + .../setuptools/_distutils/command/upload.py | 207 + .../setuptools/_distutils/config.py | 139 + .../setuptools/_distutils/core.py | 291 + .../setuptools/_distutils/cygwinccompiler.py | 358 + .../setuptools/_distutils/debug.py | 5 + .../setuptools/_distutils/dep_util.py | 96 + .../setuptools/_distutils/dir_util.py | 243 + .../setuptools/_distutils/dist.py | 1287 +++ .../setuptools/_distutils/errors.py | 127 + .../setuptools/_distutils/extension.py | 248 + .../setuptools/_distutils/fancy_getopt.py | 470 + .../setuptools/_distutils/file_util.py | 249 + .../setuptools/_distutils/filelist.py | 371 + .../setuptools/_distutils/log.py | 57 + .../setuptools/_distutils/msvc9compiler.py | 832 ++ .../setuptools/_distutils/msvccompiler.py | 695 ++ .../setuptools/_distutils/py38compat.py | 8 + .../setuptools/_distutils/py39compat.py | 22 + .../setuptools/_distutils/spawn.py | 109 + .../setuptools/_distutils/sysconfig.py | 552 + .../setuptools/_distutils/text_file.py | 287 + .../setuptools/_distutils/unixccompiler.py | 401 + .../setuptools/_distutils/util.py | 513 + .../setuptools/_distutils/version.py | 358 + .../setuptools/_distutils/versionpredicate.py | 175 + .../site-packages/setuptools/_entry_points.py | 94 + .../site-packages/setuptools/_imp.py | 82 + .../site-packages/setuptools/_importlib.py | 47 + .../site-packages/setuptools/_itertools.py | 23 + .../site-packages/setuptools/_path.py | 29 + .../site-packages/setuptools/_reqs.py | 19 + .../setuptools/_vendor/__init__.py | 0 .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 205 bytes .../__pycache__/ordered_set.cpython-311.pyc | Bin 0 -> 21791 bytes .../typing_extensions.cpython-311.pyc | Bin 0 -> 107622 bytes .../_vendor/__pycache__/zipp.cpython-311.pyc | Bin 0 -> 15998 bytes .../_vendor/importlib_metadata/__init__.py | 1047 ++ .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 58244 bytes .../__pycache__/_adapters.cpython-311.pyc | Bin 0 -> 3857 bytes .../__pycache__/_collections.cpython-311.pyc | Bin 0 -> 2204 bytes .../__pycache__/_compat.cpython-311.pyc | Bin 0 -> 2726 bytes .../__pycache__/_functools.cpython-311.pyc | Bin 0 -> 3644 bytes .../__pycache__/_itertools.cpython-311.pyc | Bin 0 -> 2607 bytes .../__pycache__/_meta.cpython-311.pyc | Bin 0 -> 3011 bytes .../__pycache__/_text.cpython-311.pyc | Bin 0 -> 4402 bytes .../_vendor/importlib_metadata/_adapters.py | 68 + .../importlib_metadata/_collections.py | 30 + .../_vendor/importlib_metadata/_compat.py | 71 + .../_vendor/importlib_metadata/_functools.py | 104 + .../_vendor/importlib_metadata/_itertools.py | 73 + .../_vendor/importlib_metadata/_meta.py | 48 + .../_vendor/importlib_metadata/_text.py | 99 + .../_vendor/importlib_resources/__init__.py | 36 + .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 839 bytes .../__pycache__/_adapters.cpython-311.pyc | Bin 0 -> 10756 bytes .../__pycache__/_common.cpython-311.pyc | Bin 0 -> 4283 bytes .../__pycache__/_compat.cpython-311.pyc | Bin 0 -> 5568 bytes .../__pycache__/_itertools.cpython-311.pyc | Bin 0 -> 1401 bytes .../__pycache__/_legacy.cpython-311.pyc | Bin 0 -> 6499 bytes .../__pycache__/abc.cpython-311.pyc | Bin 0 -> 7500 bytes .../__pycache__/readers.cpython-311.pyc | Bin 0 -> 8374 bytes .../__pycache__/simple.cpython-311.pyc | Bin 0 -> 6396 bytes .../_vendor/importlib_resources/_adapters.py | 170 + .../_vendor/importlib_resources/_common.py | 104 + .../_vendor/importlib_resources/_compat.py | 98 + .../_vendor/importlib_resources/_itertools.py | 35 + .../_vendor/importlib_resources/_legacy.py | 121 + .../_vendor/importlib_resources/abc.py | 137 + .../_vendor/importlib_resources/readers.py | 122 + .../_vendor/importlib_resources/simple.py | 116 + .../setuptools/_vendor/jaraco/__init__.py | 0 .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 212 bytes .../__pycache__/context.cpython-311.pyc | Bin 0 -> 10987 bytes .../__pycache__/functools.cpython-311.pyc | Bin 0 -> 20292 bytes .../setuptools/_vendor/jaraco/context.py | 253 + .../setuptools/_vendor/jaraco/functools.py | 525 + .../_vendor/jaraco/text/__init__.py | 599 ++ .../text/__pycache__/__init__.cpython-311.pyc | Bin 0 -> 26606 bytes .../_vendor/more_itertools/__init__.py | 4 + .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 305 bytes .../__pycache__/more.cpython-311.pyc | Bin 0 -> 149192 bytes .../__pycache__/recipes.cpython-311.pyc | Bin 0 -> 23774 bytes .../setuptools/_vendor/more_itertools/more.py | 3824 +++++++ .../_vendor/more_itertools/recipes.py | 620 ++ .../setuptools/_vendor/ordered_set.py | 488 + .../setuptools/_vendor/packaging/__about__.py | 26 + .../setuptools/_vendor/packaging/__init__.py | 25 + .../__pycache__/__about__.cpython-311.pyc | Bin 0 -> 656 bytes .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 577 bytes .../__pycache__/_manylinux.cpython-311.pyc | Bin 0 -> 13243 bytes .../__pycache__/_musllinux.cpython-311.pyc | Bin 0 -> 8011 bytes .../__pycache__/_structures.cpython-311.pyc | Bin 0 -> 3699 bytes .../__pycache__/markers.cpython-311.pyc | Bin 0 -> 16545 bytes .../__pycache__/requirements.cpython-311.pyc | Bin 0 -> 7660 bytes .../__pycache__/specifiers.cpython-311.pyc | Bin 0 -> 34377 bytes .../__pycache__/tags.cpython-311.pyc | Bin 0 -> 21362 bytes .../__pycache__/utils.cpython-311.pyc | Bin 0 -> 6697 bytes .../__pycache__/version.cpython-311.pyc | Bin 0 -> 21889 bytes .../_vendor/packaging/_manylinux.py | 301 + .../_vendor/packaging/_musllinux.py | 136 + .../_vendor/packaging/_structures.py | 61 + .../setuptools/_vendor/packaging/markers.py | 304 + .../_vendor/packaging/requirements.py | 146 + .../_vendor/packaging/specifiers.py | 802 ++ .../setuptools/_vendor/packaging/tags.py | 487 + .../setuptools/_vendor/packaging/utils.py | 136 + .../setuptools/_vendor/packaging/version.py | 504 + .../setuptools/_vendor/pyparsing/__init__.py | 331 + .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 8350 bytes .../__pycache__/actions.cpython-311.pyc | Bin 0 -> 8476 bytes .../__pycache__/common.cpython-311.pyc | Bin 0 -> 14798 bytes .../__pycache__/core.cpython-311.pyc | Bin 0 -> 277650 bytes .../__pycache__/exceptions.cpython-311.pyc | Bin 0 -> 12940 bytes .../__pycache__/helpers.cpython-311.pyc | Bin 0 -> 53641 bytes .../__pycache__/results.cpython-311.pyc | Bin 0 -> 36324 bytes .../__pycache__/testing.cpython-311.pyc | Bin 0 -> 19520 bytes .../__pycache__/unicode.cpython-311.pyc | Bin 0 -> 15378 bytes .../__pycache__/util.cpython-311.pyc | Bin 0 -> 14277 bytes .../setuptools/_vendor/pyparsing/actions.py | 207 + .../setuptools/_vendor/pyparsing/common.py | 424 + .../setuptools/_vendor/pyparsing/core.py | 5814 +++++++++++ .../_vendor/pyparsing/diagram/__init__.py | 642 ++ .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 28013 bytes .../_vendor/pyparsing/exceptions.py | 267 + .../setuptools/_vendor/pyparsing/helpers.py | 1088 ++ .../setuptools/_vendor/pyparsing/results.py | 760 ++ .../setuptools/_vendor/pyparsing/testing.py | 331 + .../setuptools/_vendor/pyparsing/unicode.py | 352 + .../setuptools/_vendor/pyparsing/util.py | 235 + .../setuptools/_vendor/tomli/__init__.py | 11 + .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 427 bytes .../tomli/__pycache__/_parser.cpython-311.pyc | Bin 0 -> 30866 bytes .../tomli/__pycache__/_re.cpython-311.pyc | Bin 0 -> 4506 bytes .../tomli/__pycache__/_types.cpython-311.pyc | Bin 0 -> 419 bytes .../setuptools/_vendor/tomli/_parser.py | 691 ++ .../setuptools/_vendor/tomli/_re.py | 107 + .../setuptools/_vendor/tomli/_types.py | 10 + .../setuptools/_vendor/typing_extensions.py | 2296 +++++ .../site-packages/setuptools/_vendor/zipp.py | 329 + .../site-packages/setuptools/archive_util.py | 213 + .../site-packages/setuptools/build_meta.py | 512 + .../site-packages/setuptools/cli-32.exe | Bin 0 -> 65536 bytes .../site-packages/setuptools/cli-64.exe | Bin 0 -> 74752 bytes .../site-packages/setuptools/cli-arm64.exe | Bin 0 -> 137216 bytes .../site-packages/setuptools/cli.exe | Bin 0 -> 65536 bytes .../setuptools/command/__init__.py | 12 + .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 646 bytes .../command/__pycache__/alias.cpython-311.pyc | Bin 0 -> 3913 bytes .../__pycache__/bdist_egg.cpython-311.pyc | Bin 0 -> 25595 bytes .../__pycache__/bdist_rpm.cpython-311.pyc | Bin 0 -> 2201 bytes .../command/__pycache__/build.cpython-311.pyc | Bin 0 -> 7001 bytes .../__pycache__/build_clib.cpython-311.pyc | Bin 0 -> 4176 bytes .../__pycache__/build_ext.cpython-311.pyc | Bin 0 -> 22021 bytes .../__pycache__/build_py.cpython-311.pyc | Bin 0 -> 23187 bytes .../__pycache__/develop.cpython-311.pyc | Bin 0 -> 10929 bytes .../__pycache__/dist_info.cpython-311.pyc | Bin 0 -> 7991 bytes .../__pycache__/easy_install.cpython-311.pyc | Bin 0 -> 121511 bytes .../editable_wheel.cpython-311.pyc | Bin 0 -> 51424 bytes .../__pycache__/egg_info.cpython-311.pyc | Bin 0 -> 40849 bytes .../__pycache__/install.cpython-311.pyc | Bin 0 -> 6826 bytes .../install_egg_info.cpython-311.pyc | Bin 0 -> 5352 bytes .../__pycache__/install_lib.cpython-311.pyc | Bin 0 -> 8423 bytes .../install_scripts.cpython-311.pyc | Bin 0 -> 4290 bytes .../__pycache__/py36compat.cpython-311.pyc | Bin 0 -> 8047 bytes .../__pycache__/register.cpython-311.pyc | Bin 0 -> 1137 bytes .../__pycache__/rotate.cpython-311.pyc | Bin 0 -> 4197 bytes .../__pycache__/saveopts.cpython-311.pyc | Bin 0 -> 1377 bytes .../command/__pycache__/sdist.cpython-311.pyc | Bin 0 -> 13449 bytes .../__pycache__/setopt.cpython-311.pyc | Bin 0 -> 7689 bytes .../command/__pycache__/test.cpython-311.pyc | Bin 0 -> 14630 bytes .../__pycache__/upload.cpython-311.pyc | Bin 0 -> 1101 bytes .../__pycache__/upload_docs.cpython-311.pyc | Bin 0 -> 11952 bytes .../site-packages/setuptools/command/alias.py | 78 + .../setuptools/command/bdist_egg.py | 457 + .../setuptools/command/bdist_rpm.py | 40 + .../site-packages/setuptools/command/build.py | 146 + .../setuptools/command/build_clib.py | 101 + .../setuptools/command/build_ext.py | 383 + .../setuptools/command/build_py.py | 368 + .../setuptools/command/develop.py | 193 + .../setuptools/command/dist_info.py | 142 + .../setuptools/command/easy_install.py | 2366 +++++ .../setuptools/command/editable_wheel.py | 844 ++ .../setuptools/command/egg_info.py | 775 ++ .../setuptools/command/install.py | 139 + .../setuptools/command/install_egg_info.py | 83 + .../setuptools/command/install_lib.py | 148 + .../setuptools/command/install_scripts.py | 70 + .../setuptools/command/launcher manifest.xml | 15 + .../setuptools/command/py36compat.py | 134 + .../setuptools/command/register.py | 18 + .../setuptools/command/rotate.py | 64 + .../setuptools/command/saveopts.py | 22 + .../site-packages/setuptools/command/sdist.py | 210 + .../setuptools/command/setopt.py | 149 + .../site-packages/setuptools/command/test.py | 251 + .../setuptools/command/upload.py | 17 + .../setuptools/command/upload_docs.py | 212 + .../setuptools/config/__init__.py | 35 + .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 2041 bytes .../_apply_pyprojecttoml.cpython-311.pyc | Bin 0 -> 22850 bytes .../config/__pycache__/expand.cpython-311.pyc | Bin 0 -> 28255 bytes .../__pycache__/pyprojecttoml.cpython-311.pyc | Bin 0 -> 27886 bytes .../__pycache__/setupcfg.cpython-311.pyc | Bin 0 -> 33295 bytes .../setuptools/config/_apply_pyprojecttoml.py | 384 + .../config/_validate_pyproject/__init__.py | 34 + .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 2329 bytes .../error_reporting.cpython-311.pyc | Bin 0 -> 20220 bytes .../extra_validations.cpython-311.pyc | Bin 0 -> 1878 bytes .../fastjsonschema_exceptions.cpython-311.pyc | Bin 0 -> 3253 bytes ...fastjsonschema_validations.cpython-311.pyc | Bin 0 -> 192651 bytes .../__pycache__/formats.cpython-311.pyc | Bin 0 -> 14368 bytes .../_validate_pyproject/error_reporting.py | 318 + .../_validate_pyproject/extra_validations.py | 36 + .../fastjsonschema_exceptions.py | 51 + .../fastjsonschema_validations.py | 1035 ++ .../config/_validate_pyproject/formats.py | 259 + .../site-packages/setuptools/config/expand.py | 462 + .../setuptools/config/pyprojecttoml.py | 498 + .../setuptools/config/setupcfg.py | 769 ++ .../site-packages/setuptools/dep_util.py | 25 + .../site-packages/setuptools/depends.py | 176 + .../site-packages/setuptools/discovery.py | 601 ++ .../site-packages/setuptools/dist.py | 1218 +++ .../site-packages/setuptools/errors.py | 58 + .../site-packages/setuptools/extension.py | 148 + .../setuptools/extern/__init__.py | 76 + .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 4405 bytes .../site-packages/setuptools/glob.py | 167 + .../site-packages/setuptools/gui-32.exe | Bin 0 -> 65536 bytes .../site-packages/setuptools/gui-64.exe | Bin 0 -> 75264 bytes .../site-packages/setuptools/gui-arm64.exe | Bin 0 -> 137728 bytes .../site-packages/setuptools/gui.exe | Bin 0 -> 65536 bytes .../site-packages/setuptools/installer.py | 104 + .../site-packages/setuptools/launch.py | 36 + .../site-packages/setuptools/logging.py | 37 + .../site-packages/setuptools/monkey.py | 165 + .../site-packages/setuptools/msvc.py | 1703 ++++ .../site-packages/setuptools/namespaces.py | 107 + .../site-packages/setuptools/package_index.py | 1181 +++ .../site-packages/setuptools/py34compat.py | 13 + .../site-packages/setuptools/sandbox.py | 530 + .../setuptools/script (dev).tmpl | 6 + .../site-packages/setuptools/script.tmpl | 3 + .../site-packages/setuptools/unicode_utils.py | 42 + .../site-packages/setuptools/version.py | 6 + .../site-packages/setuptools/wheel.py | 222 + .../setuptools/windows_support.py | 29 + .../sse_starlette-3.2.0.dist-info/INSTALLER | 1 + .../sse_starlette-3.2.0.dist-info/METADATA | 428 + .../sse_starlette-3.2.0.dist-info/RECORD | 14 + .../sse_starlette-3.2.0.dist-info/WHEEL | 5 + .../licenses/AUTHORS | 10 + .../licenses/LICENSE | 27 + .../top_level.txt | 1 + .../site-packages/sse_starlette/__init__.py | 5 + .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 458 bytes .../__pycache__/event.cpython-311.pyc | Bin 0 -> 4986 bytes .../__pycache__/sse.cpython-311.pyc | Bin 0 -> 19577 bytes .../site-packages/sse_starlette/event.py | 96 + .../site-packages/sse_starlette/py.typed | 0 .../site-packages/sse_starlette/sse.py | 383 + .../starlette-0.52.1.dist-info/INSTALLER | 1 + .../starlette-0.52.1.dist-info/METADATA | 177 + .../starlette-0.52.1.dist-info/RECORD | 74 + .../starlette-0.52.1.dist-info/WHEEL | 4 + .../licenses/LICENSE.md | 27 + .../site-packages/starlette/__init__.py | 1 + .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 217 bytes .../_exception_handler.cpython-311.pyc | Bin 0 -> 3629 bytes .../__pycache__/_utils.cpython-311.pyc | Bin 0 -> 5924 bytes .../__pycache__/applications.cpython-311.pyc | Bin 0 -> 13760 bytes .../authentication.cpython-311.pyc | Bin 0 -> 9098 bytes .../__pycache__/background.cpython-311.pyc | Bin 0 -> 2893 bytes .../__pycache__/concurrency.cpython-311.pyc | Bin 0 -> 3678 bytes .../__pycache__/config.cpython-311.pyc | Bin 0 -> 8387 bytes .../__pycache__/convertors.cpython-311.pyc | Bin 0 -> 5821 bytes .../datastructures.cpython-311.pyc | Bin 0 -> 47113 bytes .../__pycache__/endpoints.cpython-311.pyc | Bin 0 -> 8861 bytes .../__pycache__/exceptions.cpython-311.pyc | Bin 0 -> 2620 bytes .../__pycache__/formparsers.cpython-311.pyc | Bin 0 -> 15133 bytes .../__pycache__/requests.cpython-311.pyc | Bin 0 -> 18431 bytes .../__pycache__/responses.cpython-311.pyc | Bin 0 -> 33647 bytes .../__pycache__/routing.cpython-311.pyc | Bin 0 -> 48561 bytes .../__pycache__/schemas.cpython-311.pyc | Bin 0 -> 8126 bytes .../__pycache__/staticfiles.cpython-311.pyc | Bin 0 -> 12641 bytes .../__pycache__/status.cpython-311.pyc | Bin 0 -> 5398 bytes .../__pycache__/templating.cpython-311.pyc | Bin 0 -> 11163 bytes .../__pycache__/testclient.cpython-311.pyc | Bin 0 -> 35958 bytes .../__pycache__/types.cpython-311.pyc | Bin 0 -> 1562 bytes .../__pycache__/websockets.cpython-311.pyc | Bin 0 -> 13035 bytes .../starlette/_exception_handler.py | 65 + .../site-packages/starlette/_utils.py | 105 + .../site-packages/starlette/applications.py | 244 + .../site-packages/starlette/authentication.py | 142 + .../site-packages/starlette/background.py | 36 + .../site-packages/starlette/concurrency.py | 57 + .../site-packages/starlette/config.py | 140 + .../site-packages/starlette/convertors.py | 89 + .../site-packages/starlette/datastructures.py | 706 ++ .../site-packages/starlette/endpoints.py | 123 + .../site-packages/starlette/exceptions.py | 33 + .../site-packages/starlette/formparsers.py | 276 + .../starlette/middleware/__init__.py | 37 + .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 3135 bytes .../authentication.cpython-311.pyc | Bin 0 -> 3293 bytes .../__pycache__/base.cpython-311.pyc | Bin 0 -> 13545 bytes .../__pycache__/cors.cpython-311.pyc | Bin 0 -> 8886 bytes .../__pycache__/errors.cpython-311.pyc | Bin 0 -> 10644 bytes .../__pycache__/exceptions.cpython-311.pyc | Bin 0 -> 4519 bytes .../__pycache__/gzip.cpython-311.pyc | Bin 0 -> 9626 bytes .../__pycache__/httpsredirect.cpython-311.pyc | Bin 0 -> 1960 bytes .../__pycache__/sessions.cpython-311.pyc | Bin 0 -> 5065 bytes .../__pycache__/trustedhost.cpython-311.pyc | Bin 0 -> 3583 bytes .../__pycache__/wsgi.cpython-311.pyc | Bin 0 -> 9799 bytes .../starlette/middleware/authentication.py | 52 + .../starlette/middleware/base.py | 244 + .../starlette/middleware/cors.py | 181 + .../starlette/middleware/errors.py | 259 + .../starlette/middleware/exceptions.py | 73 + .../starlette/middleware/gzip.py | 145 + .../starlette/middleware/httpsredirect.py | 19 + .../starlette/middleware/sessions.py | 85 + .../starlette/middleware/trustedhost.py | 60 + .../starlette/middleware/wsgi.py | 154 + .../site-packages/starlette/py.typed | 0 .../site-packages/starlette/requests.py | 332 + .../site-packages/starlette/responses.py | 566 ++ .../site-packages/starlette/routing.py | 876 ++ .../site-packages/starlette/schemas.py | 148 + .../site-packages/starlette/staticfiles.py | 217 + .../site-packages/starlette/status.py | 209 + .../site-packages/starlette/templating.py | 217 + .../site-packages/starlette/testclient.py | 739 ++ .../site-packages/starlette/types.py | 26 + .../site-packages/starlette/websockets.py | 196 + .../INSTALLER | 1 + .../METADATA | 72 + .../typing_extensions-4.15.0.dist-info/RECORD | 7 + .../typing_extensions-4.15.0.dist-info/WHEEL | 4 + .../licenses/LICENSE | 279 + .../site-packages/typing_extensions.py | 4317 ++++++++ .../INSTALLER | 1 + .../METADATA | 49 + .../typing_inspection-0.4.2.dist-info/RECORD | 13 + .../typing_inspection-0.4.2.dist-info/WHEEL | 4 + .../licenses/LICENSE | 21 + .../typing_inspection/__init__.py | 0 .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 204 bytes .../__pycache__/introspection.cpython-311.pyc | Bin 0 -> 19110 bytes .../typing_objects.cpython-311.pyc | Bin 0 -> 17236 bytes .../typing_inspection/introspection.py | 587 ++ .../site-packages/typing_inspection/py.typed | 0 .../typing_inspection/typing_objects.py | 607 ++ .../typing_inspection/typing_objects.pyi | 417 + .../urllib3-2.6.3.dist-info/INSTALLER | 1 + .../urllib3-2.6.3.dist-info/METADATA | 164 + .../urllib3-2.6.3.dist-info/RECORD | 79 + .../urllib3-2.6.3.dist-info/WHEEL | 4 + .../licenses/LICENSE.txt | 21 + .../site-packages/urllib3/__init__.py | 211 + .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 7677 bytes .../_base_connection.cpython-311.pyc | Bin 0 -> 7111 bytes .../__pycache__/_collections.cpython-311.pyc | Bin 0 -> 26520 bytes .../_request_methods.cpython-311.pyc | Bin 0 -> 10724 bytes .../__pycache__/_version.cpython-311.pyc | Bin 0 -> 895 bytes .../__pycache__/connection.cpython-311.pyc | Bin 0 -> 41037 bytes .../connectionpool.cpython-311.pyc | Bin 0 -> 41276 bytes .../__pycache__/exceptions.cpython-311.pyc | Bin 0 -> 20103 bytes .../__pycache__/fields.cpython-311.pyc | Bin 0 -> 12721 bytes .../__pycache__/filepost.cpython-311.pyc | Bin 0 -> 3880 bytes .../__pycache__/poolmanager.cpython-311.pyc | Bin 0 -> 25820 bytes .../__pycache__/response.cpython-311.pyc | Bin 0 -> 61635 bytes .../site-packages/urllib3/_base_connection.py | 165 + .../site-packages/urllib3/_collections.py | 487 + .../site-packages/urllib3/_request_methods.py | 278 + .../site-packages/urllib3/_version.py | 34 + .../site-packages/urllib3/connection.py | 1099 ++ .../site-packages/urllib3/connectionpool.py | 1178 +++ .../site-packages/urllib3/contrib/__init__.py | 0 .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 202 bytes .../__pycache__/pyopenssl.cpython-311.pyc | Bin 0 -> 29506 bytes .../contrib/__pycache__/socks.cpython-311.pyc | Bin 0 -> 8739 bytes .../urllib3/contrib/emscripten/__init__.py | 17 + .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 1084 bytes .../__pycache__/connection.cpython-311.pyc | Bin 0 -> 10761 bytes .../__pycache__/fetch.cpython-311.pyc | Bin 0 -> 31300 bytes .../__pycache__/request.cpython-311.pyc | Bin 0 -> 1660 bytes .../__pycache__/response.cpython-311.pyc | Bin 0 -> 12982 bytes .../urllib3/contrib/emscripten/connection.py | 260 + .../emscripten/emscripten_fetch_worker.js | 110 + .../urllib3/contrib/emscripten/fetch.py | 726 ++ .../urllib3/contrib/emscripten/request.py | 22 + .../urllib3/contrib/emscripten/response.py | 277 + .../urllib3/contrib/pyopenssl.py | 564 ++ .../site-packages/urllib3/contrib/socks.py | 228 + .../site-packages/urllib3/exceptions.py | 335 + .../site-packages/urllib3/fields.py | 341 + .../site-packages/urllib3/filepost.py | 89 + .../site-packages/urllib3/http2/__init__.py | 53 + .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 2027 bytes .../__pycache__/connection.cpython-311.pyc | Bin 0 -> 19048 bytes .../http2/__pycache__/probe.cpython-311.pyc | Bin 0 -> 4347 bytes .../site-packages/urllib3/http2/connection.py | 356 + .../site-packages/urllib3/http2/probe.py | 87 + .../site-packages/urllib3/poolmanager.py | 651 ++ .../python3.11/site-packages/urllib3/py.typed | 2 + .../site-packages/urllib3/response.py | 1480 +++ .../site-packages/urllib3/util/__init__.py | 42 + .../util/__pycache__/__init__.cpython-311.pyc | Bin 0 -> 1235 bytes .../__pycache__/connection.cpython-311.pyc | Bin 0 -> 5058 bytes .../util/__pycache__/proxy.cpython-311.pyc | Bin 0 -> 1293 bytes .../util/__pycache__/request.cpython-311.pyc | Bin 0 -> 9232 bytes .../util/__pycache__/response.cpython-311.pyc | Bin 0 -> 3367 bytes .../util/__pycache__/retry.cpython-311.pyc | Bin 0 -> 21686 bytes .../util/__pycache__/ssl_.cpython-311.pyc | Bin 0 -> 18238 bytes .../ssl_match_hostname.cpython-311.pyc | Bin 0 -> 6262 bytes .../__pycache__/ssltransport.cpython-311.pyc | Bin 0 -> 14326 bytes .../util/__pycache__/timeout.cpython-311.pyc | Bin 0 -> 12080 bytes .../util/__pycache__/url.cpython-311.pyc | Bin 0 -> 17779 bytes .../util/__pycache__/util.cpython-311.pyc | Bin 0 -> 2183 bytes .../util/__pycache__/wait.cpython-311.pyc | Bin 0 -> 3754 bytes .../site-packages/urllib3/util/connection.py | 137 + .../site-packages/urllib3/util/proxy.py | 43 + .../site-packages/urllib3/util/request.py | 263 + .../site-packages/urllib3/util/response.py | 101 + .../site-packages/urllib3/util/retry.py | 549 + .../site-packages/urllib3/util/ssl_.py | 527 + .../urllib3/util/ssl_match_hostname.py | 159 + .../urllib3/util/ssltransport.py | 271 + .../site-packages/urllib3/util/timeout.py | 275 + .../site-packages/urllib3/util/url.py | 469 + .../site-packages/urllib3/util/util.py | 42 + .../site-packages/urllib3/util/wait.py | 124 + .../uvicorn-0.40.0.dist-info/INSTALLER | 1 + .../uvicorn-0.40.0.dist-info/METADATA | 191 + .../uvicorn-0.40.0.dist-info/RECORD | 88 + .../uvicorn-0.40.0.dist-info/WHEEL | 4 + .../uvicorn-0.40.0.dist-info/entry_points.txt | 2 + .../licenses/LICENSE.md | 27 + .../site-packages/uvicorn/__init__.py | 5 + .../site-packages/uvicorn/__main__.py | 4 + .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 431 bytes .../__pycache__/__main__.cpython-311.pyc | Bin 0 -> 320 bytes .../__pycache__/_compat.cpython-311.pyc | Bin 0 -> 4601 bytes .../__pycache__/_subprocess.cpython-311.pyc | Bin 0 -> 3117 bytes .../__pycache__/_types.cpython-311.pyc | Bin 0 -> 13634 bytes .../__pycache__/config.cpython-311.pyc | Bin 0 -> 27371 bytes .../__pycache__/importer.cpython-311.pyc | Bin 0 -> 2036 bytes .../__pycache__/logging.cpython-311.pyc | Bin 0 -> 8609 bytes .../uvicorn/__pycache__/main.cpython-311.pyc | Bin 0 -> 21528 bytes .../__pycache__/server.cpython-311.pyc | Bin 0 -> 17199 bytes .../__pycache__/workers.cpython-311.pyc | Bin 0 -> 6609 bytes .../site-packages/uvicorn/_compat.py | 91 + .../site-packages/uvicorn/_subprocess.py | 84 + .../site-packages/uvicorn/_types.py | 274 + .../site-packages/uvicorn/config.py | 549 + .../site-packages/uvicorn/importer.py | 34 + .../uvicorn/lifespan/__init__.py | 0 .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 203 bytes .../lifespan/__pycache__/off.cpython-311.pyc | Bin 0 -> 1158 bytes .../lifespan/__pycache__/on.cpython-311.pyc | Bin 0 -> 8355 bytes .../site-packages/uvicorn/lifespan/off.py | 17 + .../site-packages/uvicorn/lifespan/on.py | 137 + .../site-packages/uvicorn/logging.py | 117 + .../site-packages/uvicorn/loops/__init__.py | 0 .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 200 bytes .../loops/__pycache__/asyncio.cpython-311.pyc | Bin 0 -> 791 bytes .../loops/__pycache__/auto.cpython-311.pyc | Bin 0 -> 1000 bytes .../loops/__pycache__/uvloop.cpython-311.pyc | Bin 0 -> 661 bytes .../site-packages/uvicorn/loops/asyncio.py | 11 + .../site-packages/uvicorn/loops/auto.py | 17 + .../site-packages/uvicorn/loops/uvloop.py | 10 + .../python3.11/site-packages/uvicorn/main.py | 618 ++ .../uvicorn/middleware/__init__.py | 0 .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 205 bytes .../__pycache__/asgi2.cpython-311.pyc | Bin 0 -> 1222 bytes .../message_logger.cpython-311.pyc | Bin 0 -> 4908 bytes .../__pycache__/proxy_headers.cpython-311.pyc | Bin 0 -> 6695 bytes .../__pycache__/wsgi.cpython-311.pyc | Bin 0 -> 10912 bytes .../site-packages/uvicorn/middleware/asgi2.py | 15 + .../uvicorn/middleware/message_logger.py | 87 + .../uvicorn/middleware/proxy_headers.py | 142 + .../site-packages/uvicorn/middleware/wsgi.py | 199 + .../uvicorn/protocols/__init__.py | 0 .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 204 bytes .../__pycache__/utils.cpython-311.pyc | Bin 0 -> 3573 bytes .../uvicorn/protocols/http/__init__.py | 0 .../http/__pycache__/__init__.cpython-311.pyc | Bin 0 -> 209 bytes .../http/__pycache__/auto.cpython-311.pyc | Bin 0 -> 708 bytes .../__pycache__/flow_control.cpython-311.pyc | Bin 0 -> 3305 bytes .../http/__pycache__/h11_impl.cpython-311.pyc | Bin 0 -> 27978 bytes .../httptools_impl.cpython-311.pyc | Bin 0 -> 30514 bytes .../uvicorn/protocols/http/auto.py | 15 + .../uvicorn/protocols/http/flow_control.py | 54 + .../uvicorn/protocols/http/h11_impl.py | 550 + .../uvicorn/protocols/http/httptools_impl.py | 577 ++ .../site-packages/uvicorn/protocols/utils.py | 56 + .../uvicorn/protocols/websockets/__init__.py | 0 .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 215 bytes .../__pycache__/auto.cpython-311.pyc | Bin 0 -> 959 bytes .../websockets_impl.cpython-311.pyc | Bin 0 -> 22206 bytes .../websockets_sansio_impl.cpython-311.pyc | Bin 0 -> 26096 bytes .../__pycache__/wsproto_impl.cpython-311.pyc | Bin 0 -> 22191 bytes .../uvicorn/protocols/websockets/auto.py | 21 + .../protocols/websockets/websockets_impl.py | 384 + .../websockets/websockets_sansio_impl.py | 415 + .../protocols/websockets/wsproto_impl.py | 375 + .../python3.11/site-packages/uvicorn/py.typed | 1 + .../site-packages/uvicorn/server.py | 338 + .../uvicorn/supervisors/__init__.py | 16 + .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 894 bytes .../__pycache__/basereload.cpython-311.pyc | Bin 0 -> 7532 bytes .../__pycache__/multiprocess.cpython-311.pyc | Bin 0 -> 14765 bytes .../__pycache__/statreload.cpython-311.pyc | Bin 0 -> 3250 bytes .../watchfilesreload.cpython-311.pyc | Bin 0 -> 5294 bytes .../uvicorn/supervisors/basereload.py | 125 + .../uvicorn/supervisors/multiprocess.py | 223 + .../uvicorn/supervisors/statreload.py | 52 + .../uvicorn/supervisors/watchfilesreload.py | 85 + .../site-packages/uvicorn/workers.py | 111 + venv/lib64 | 1 + venv/pyvenv.cfg | 5 + 3293 files changed, 535145 insertions(+) create mode 100644 audit_report.txt create mode 100644 audit_users.py create mode 100644 config.example.json create mode 100644 config.json create mode 100644 config.json.bak create mode 100644 not_used/test_billing_tools.py create mode 100644 requirements.txt create mode 100755 run_server.sh create mode 100644 src/__pycache__/billing.cpython-311.pyc create mode 100644 src/__pycache__/server.cpython-311.pyc create mode 100644 src/billing.py create mode 100644 src/server.py create mode 100644 test_billing_real.py create mode 100644 venv/bin/Activate.ps1 create mode 100644 venv/bin/activate create mode 100644 venv/bin/activate.csh create mode 100644 venv/bin/activate.fish create mode 100755 venv/bin/dotenv create mode 100755 venv/bin/httpx create mode 100755 venv/bin/jsonschema create mode 100755 venv/bin/mcp create mode 100755 venv/bin/normalizer create mode 100755 venv/bin/pip create mode 100755 venv/bin/pip3 create mode 100755 venv/bin/pip3.11 create mode 120000 venv/bin/python create mode 120000 venv/bin/python3 create mode 120000 venv/bin/python3.11 create mode 100755 venv/bin/uvicorn create mode 100644 venv/lib/python3.11/site-packages/PyJWT-2.10.1.dist-info/AUTHORS.rst create mode 100644 venv/lib/python3.11/site-packages/PyJWT-2.10.1.dist-info/INSTALLER create mode 100644 venv/lib/python3.11/site-packages/PyJWT-2.10.1.dist-info/LICENSE create mode 100644 venv/lib/python3.11/site-packages/PyJWT-2.10.1.dist-info/METADATA create mode 100644 venv/lib/python3.11/site-packages/PyJWT-2.10.1.dist-info/RECORD create mode 100644 venv/lib/python3.11/site-packages/PyJWT-2.10.1.dist-info/WHEEL create mode 100644 venv/lib/python3.11/site-packages/PyJWT-2.10.1.dist-info/top_level.txt create mode 100644 venv/lib/python3.11/site-packages/__pycache__/typing_extensions.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/_cffi_backend.cpython-311-x86_64-linux-gnu.so create mode 100644 venv/lib/python3.11/site-packages/_distutils_hack/__init__.py create mode 100644 venv/lib/python3.11/site-packages/_distutils_hack/__pycache__/__init__.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/_distutils_hack/__pycache__/override.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/_distutils_hack/override.py create mode 100644 venv/lib/python3.11/site-packages/annotated_types-0.7.0.dist-info/INSTALLER create mode 100644 venv/lib/python3.11/site-packages/annotated_types-0.7.0.dist-info/METADATA create mode 100644 venv/lib/python3.11/site-packages/annotated_types-0.7.0.dist-info/RECORD create mode 100644 venv/lib/python3.11/site-packages/annotated_types-0.7.0.dist-info/WHEEL create mode 100644 venv/lib/python3.11/site-packages/annotated_types-0.7.0.dist-info/licenses/LICENSE create mode 100644 venv/lib/python3.11/site-packages/annotated_types/__init__.py create mode 100644 venv/lib/python3.11/site-packages/annotated_types/__pycache__/__init__.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/annotated_types/__pycache__/test_cases.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/annotated_types/py.typed create mode 100644 venv/lib/python3.11/site-packages/annotated_types/test_cases.py create mode 100644 venv/lib/python3.11/site-packages/anyio-4.12.1.dist-info/INSTALLER create mode 100644 venv/lib/python3.11/site-packages/anyio-4.12.1.dist-info/METADATA create mode 100644 venv/lib/python3.11/site-packages/anyio-4.12.1.dist-info/RECORD create mode 100644 venv/lib/python3.11/site-packages/anyio-4.12.1.dist-info/WHEEL create mode 100644 venv/lib/python3.11/site-packages/anyio-4.12.1.dist-info/entry_points.txt create mode 100644 venv/lib/python3.11/site-packages/anyio-4.12.1.dist-info/licenses/LICENSE create mode 100644 venv/lib/python3.11/site-packages/anyio-4.12.1.dist-info/top_level.txt create mode 100644 venv/lib/python3.11/site-packages/anyio/__init__.py create mode 100644 venv/lib/python3.11/site-packages/anyio/__pycache__/__init__.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/anyio/__pycache__/from_thread.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/anyio/__pycache__/functools.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/anyio/__pycache__/lowlevel.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/anyio/__pycache__/pytest_plugin.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/anyio/__pycache__/to_interpreter.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/anyio/__pycache__/to_process.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/anyio/__pycache__/to_thread.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/anyio/_backends/__init__.py create mode 100644 venv/lib/python3.11/site-packages/anyio/_backends/__pycache__/__init__.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/anyio/_backends/__pycache__/_asyncio.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/anyio/_backends/__pycache__/_trio.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/anyio/_backends/_asyncio.py create mode 100644 venv/lib/python3.11/site-packages/anyio/_backends/_trio.py create mode 100644 venv/lib/python3.11/site-packages/anyio/_core/__init__.py create mode 100644 venv/lib/python3.11/site-packages/anyio/_core/__pycache__/__init__.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/anyio/_core/__pycache__/_asyncio_selector_thread.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/anyio/_core/__pycache__/_contextmanagers.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/anyio/_core/__pycache__/_eventloop.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/anyio/_core/__pycache__/_exceptions.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/anyio/_core/__pycache__/_fileio.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/anyio/_core/__pycache__/_resources.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/anyio/_core/__pycache__/_signals.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/anyio/_core/__pycache__/_sockets.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/anyio/_core/__pycache__/_streams.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/anyio/_core/__pycache__/_subprocesses.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/anyio/_core/__pycache__/_synchronization.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/anyio/_core/__pycache__/_tasks.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/anyio/_core/__pycache__/_tempfile.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/anyio/_core/__pycache__/_testing.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/anyio/_core/__pycache__/_typedattr.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/anyio/_core/_asyncio_selector_thread.py create mode 100644 venv/lib/python3.11/site-packages/anyio/_core/_contextmanagers.py create mode 100644 venv/lib/python3.11/site-packages/anyio/_core/_eventloop.py create mode 100644 venv/lib/python3.11/site-packages/anyio/_core/_exceptions.py create mode 100644 venv/lib/python3.11/site-packages/anyio/_core/_fileio.py create mode 100644 venv/lib/python3.11/site-packages/anyio/_core/_resources.py create mode 100644 venv/lib/python3.11/site-packages/anyio/_core/_signals.py create mode 100644 venv/lib/python3.11/site-packages/anyio/_core/_sockets.py create mode 100644 venv/lib/python3.11/site-packages/anyio/_core/_streams.py create mode 100644 venv/lib/python3.11/site-packages/anyio/_core/_subprocesses.py create mode 100644 venv/lib/python3.11/site-packages/anyio/_core/_synchronization.py create mode 100644 venv/lib/python3.11/site-packages/anyio/_core/_tasks.py create mode 100644 venv/lib/python3.11/site-packages/anyio/_core/_tempfile.py create mode 100644 venv/lib/python3.11/site-packages/anyio/_core/_testing.py create mode 100644 venv/lib/python3.11/site-packages/anyio/_core/_typedattr.py create mode 100644 venv/lib/python3.11/site-packages/anyio/abc/__init__.py create mode 100644 venv/lib/python3.11/site-packages/anyio/abc/__pycache__/__init__.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/anyio/abc/__pycache__/_eventloop.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/anyio/abc/__pycache__/_resources.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/anyio/abc/__pycache__/_sockets.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/anyio/abc/__pycache__/_streams.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/anyio/abc/__pycache__/_subprocesses.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/anyio/abc/__pycache__/_tasks.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/anyio/abc/__pycache__/_testing.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/anyio/abc/_eventloop.py create mode 100644 venv/lib/python3.11/site-packages/anyio/abc/_resources.py create mode 100644 venv/lib/python3.11/site-packages/anyio/abc/_sockets.py create mode 100644 venv/lib/python3.11/site-packages/anyio/abc/_streams.py create mode 100644 venv/lib/python3.11/site-packages/anyio/abc/_subprocesses.py create mode 100644 venv/lib/python3.11/site-packages/anyio/abc/_tasks.py create mode 100644 venv/lib/python3.11/site-packages/anyio/abc/_testing.py create mode 100644 venv/lib/python3.11/site-packages/anyio/from_thread.py create mode 100644 venv/lib/python3.11/site-packages/anyio/functools.py create mode 100644 venv/lib/python3.11/site-packages/anyio/lowlevel.py create mode 100644 venv/lib/python3.11/site-packages/anyio/py.typed create mode 100644 venv/lib/python3.11/site-packages/anyio/pytest_plugin.py create mode 100644 venv/lib/python3.11/site-packages/anyio/streams/__init__.py create mode 100644 venv/lib/python3.11/site-packages/anyio/streams/__pycache__/__init__.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/anyio/streams/__pycache__/buffered.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/anyio/streams/__pycache__/file.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/anyio/streams/__pycache__/memory.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/anyio/streams/__pycache__/stapled.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/anyio/streams/__pycache__/text.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/anyio/streams/__pycache__/tls.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/anyio/streams/buffered.py create mode 100644 venv/lib/python3.11/site-packages/anyio/streams/file.py create mode 100644 venv/lib/python3.11/site-packages/anyio/streams/memory.py create mode 100644 venv/lib/python3.11/site-packages/anyio/streams/stapled.py create mode 100644 venv/lib/python3.11/site-packages/anyio/streams/text.py create mode 100644 venv/lib/python3.11/site-packages/anyio/streams/tls.py create mode 100644 venv/lib/python3.11/site-packages/anyio/to_interpreter.py create mode 100644 venv/lib/python3.11/site-packages/anyio/to_process.py create mode 100644 venv/lib/python3.11/site-packages/anyio/to_thread.py create mode 100644 venv/lib/python3.11/site-packages/attr/__init__.py create mode 100644 venv/lib/python3.11/site-packages/attr/__init__.pyi create mode 100644 venv/lib/python3.11/site-packages/attr/__pycache__/__init__.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/attr/__pycache__/_cmp.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/attr/__pycache__/_compat.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/attr/__pycache__/_config.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/attr/__pycache__/_funcs.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/attr/__pycache__/_make.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/attr/__pycache__/_next_gen.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/attr/__pycache__/_version_info.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/attr/__pycache__/converters.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/attr/__pycache__/exceptions.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/attr/__pycache__/filters.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/attr/__pycache__/setters.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/attr/__pycache__/validators.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/attr/_cmp.py create mode 100644 venv/lib/python3.11/site-packages/attr/_cmp.pyi create mode 100644 venv/lib/python3.11/site-packages/attr/_compat.py create mode 100644 venv/lib/python3.11/site-packages/attr/_config.py create mode 100644 venv/lib/python3.11/site-packages/attr/_funcs.py create mode 100644 venv/lib/python3.11/site-packages/attr/_make.py create mode 100644 venv/lib/python3.11/site-packages/attr/_next_gen.py create mode 100644 venv/lib/python3.11/site-packages/attr/_typing_compat.pyi create mode 100644 venv/lib/python3.11/site-packages/attr/_version_info.py create mode 100644 venv/lib/python3.11/site-packages/attr/_version_info.pyi create mode 100644 venv/lib/python3.11/site-packages/attr/converters.py create mode 100644 venv/lib/python3.11/site-packages/attr/converters.pyi create mode 100644 venv/lib/python3.11/site-packages/attr/exceptions.py create mode 100644 venv/lib/python3.11/site-packages/attr/exceptions.pyi create mode 100644 venv/lib/python3.11/site-packages/attr/filters.py create mode 100644 venv/lib/python3.11/site-packages/attr/filters.pyi create mode 100644 venv/lib/python3.11/site-packages/attr/py.typed create mode 100644 venv/lib/python3.11/site-packages/attr/setters.py create mode 100644 venv/lib/python3.11/site-packages/attr/setters.pyi create mode 100644 venv/lib/python3.11/site-packages/attr/validators.py create mode 100644 venv/lib/python3.11/site-packages/attr/validators.pyi create mode 100644 venv/lib/python3.11/site-packages/attrs-25.4.0.dist-info/INSTALLER create mode 100644 venv/lib/python3.11/site-packages/attrs-25.4.0.dist-info/METADATA create mode 100644 venv/lib/python3.11/site-packages/attrs-25.4.0.dist-info/RECORD create mode 100644 venv/lib/python3.11/site-packages/attrs-25.4.0.dist-info/WHEEL create mode 100644 venv/lib/python3.11/site-packages/attrs-25.4.0.dist-info/licenses/LICENSE create mode 100644 venv/lib/python3.11/site-packages/attrs/__init__.py create mode 100644 venv/lib/python3.11/site-packages/attrs/__init__.pyi create mode 100644 venv/lib/python3.11/site-packages/attrs/__pycache__/__init__.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/attrs/__pycache__/converters.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/attrs/__pycache__/exceptions.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/attrs/__pycache__/filters.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/attrs/__pycache__/setters.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/attrs/__pycache__/validators.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/attrs/converters.py create mode 100644 venv/lib/python3.11/site-packages/attrs/exceptions.py create mode 100644 venv/lib/python3.11/site-packages/attrs/filters.py create mode 100644 venv/lib/python3.11/site-packages/attrs/py.typed create mode 100644 venv/lib/python3.11/site-packages/attrs/setters.py create mode 100644 venv/lib/python3.11/site-packages/attrs/validators.py create mode 100644 venv/lib/python3.11/site-packages/certifi-2026.1.4.dist-info/INSTALLER create mode 100644 venv/lib/python3.11/site-packages/certifi-2026.1.4.dist-info/METADATA create mode 100644 venv/lib/python3.11/site-packages/certifi-2026.1.4.dist-info/RECORD create mode 100644 venv/lib/python3.11/site-packages/certifi-2026.1.4.dist-info/WHEEL create mode 100644 venv/lib/python3.11/site-packages/certifi-2026.1.4.dist-info/licenses/LICENSE create mode 100644 venv/lib/python3.11/site-packages/certifi-2026.1.4.dist-info/top_level.txt create mode 100644 venv/lib/python3.11/site-packages/certifi/__init__.py create mode 100644 venv/lib/python3.11/site-packages/certifi/__main__.py create mode 100644 venv/lib/python3.11/site-packages/certifi/__pycache__/__init__.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/certifi/__pycache__/__main__.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/certifi/__pycache__/core.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/certifi/cacert.pem create mode 100644 venv/lib/python3.11/site-packages/certifi/core.py create mode 100644 venv/lib/python3.11/site-packages/certifi/py.typed create mode 100644 venv/lib/python3.11/site-packages/cffi-2.0.0.dist-info/INSTALLER create mode 100644 venv/lib/python3.11/site-packages/cffi-2.0.0.dist-info/METADATA create mode 100644 venv/lib/python3.11/site-packages/cffi-2.0.0.dist-info/RECORD create mode 100644 venv/lib/python3.11/site-packages/cffi-2.0.0.dist-info/WHEEL create mode 100644 venv/lib/python3.11/site-packages/cffi-2.0.0.dist-info/entry_points.txt create mode 100644 venv/lib/python3.11/site-packages/cffi-2.0.0.dist-info/licenses/AUTHORS create mode 100644 venv/lib/python3.11/site-packages/cffi-2.0.0.dist-info/licenses/LICENSE create mode 100644 venv/lib/python3.11/site-packages/cffi-2.0.0.dist-info/top_level.txt create mode 100644 venv/lib/python3.11/site-packages/cffi/__init__.py create mode 100644 venv/lib/python3.11/site-packages/cffi/__pycache__/__init__.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/cffi/__pycache__/_imp_emulation.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/cffi/__pycache__/_shimmed_dist_utils.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/cffi/__pycache__/api.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/cffi/__pycache__/backend_ctypes.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/cffi/__pycache__/cffi_opcode.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/cffi/__pycache__/commontypes.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/cffi/__pycache__/cparser.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/cffi/__pycache__/error.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/cffi/__pycache__/ffiplatform.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/cffi/__pycache__/lock.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/cffi/__pycache__/model.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/cffi/__pycache__/pkgconfig.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/cffi/__pycache__/recompiler.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/cffi/__pycache__/setuptools_ext.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/cffi/__pycache__/vengine_cpy.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/cffi/__pycache__/vengine_gen.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/cffi/__pycache__/verifier.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/cffi/_cffi_errors.h create mode 100644 venv/lib/python3.11/site-packages/cffi/_cffi_include.h create mode 100644 venv/lib/python3.11/site-packages/cffi/_embedding.h create mode 100644 venv/lib/python3.11/site-packages/cffi/_imp_emulation.py create mode 100644 venv/lib/python3.11/site-packages/cffi/_shimmed_dist_utils.py create mode 100644 venv/lib/python3.11/site-packages/cffi/api.py create mode 100644 venv/lib/python3.11/site-packages/cffi/backend_ctypes.py create mode 100644 venv/lib/python3.11/site-packages/cffi/cffi_opcode.py create mode 100644 venv/lib/python3.11/site-packages/cffi/commontypes.py create mode 100644 venv/lib/python3.11/site-packages/cffi/cparser.py create mode 100644 venv/lib/python3.11/site-packages/cffi/error.py create mode 100644 venv/lib/python3.11/site-packages/cffi/ffiplatform.py create mode 100644 venv/lib/python3.11/site-packages/cffi/lock.py create mode 100644 venv/lib/python3.11/site-packages/cffi/model.py create mode 100644 venv/lib/python3.11/site-packages/cffi/parse_c_type.h create mode 100644 venv/lib/python3.11/site-packages/cffi/pkgconfig.py create mode 100644 venv/lib/python3.11/site-packages/cffi/recompiler.py create mode 100644 venv/lib/python3.11/site-packages/cffi/setuptools_ext.py create mode 100644 venv/lib/python3.11/site-packages/cffi/vengine_cpy.py create mode 100644 venv/lib/python3.11/site-packages/cffi/vengine_gen.py create mode 100644 venv/lib/python3.11/site-packages/cffi/verifier.py create mode 100644 venv/lib/python3.11/site-packages/charset_normalizer-3.4.4.dist-info/INSTALLER create mode 100644 venv/lib/python3.11/site-packages/charset_normalizer-3.4.4.dist-info/METADATA create mode 100644 venv/lib/python3.11/site-packages/charset_normalizer-3.4.4.dist-info/RECORD create mode 100644 venv/lib/python3.11/site-packages/charset_normalizer-3.4.4.dist-info/WHEEL create mode 100644 venv/lib/python3.11/site-packages/charset_normalizer-3.4.4.dist-info/entry_points.txt create mode 100644 venv/lib/python3.11/site-packages/charset_normalizer-3.4.4.dist-info/licenses/LICENSE create mode 100644 venv/lib/python3.11/site-packages/charset_normalizer-3.4.4.dist-info/top_level.txt create mode 100644 venv/lib/python3.11/site-packages/charset_normalizer/__init__.py create mode 100644 venv/lib/python3.11/site-packages/charset_normalizer/__main__.py create mode 100644 venv/lib/python3.11/site-packages/charset_normalizer/__pycache__/__init__.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/charset_normalizer/__pycache__/__main__.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/charset_normalizer/__pycache__/api.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/charset_normalizer/__pycache__/cd.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/charset_normalizer/__pycache__/constant.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/charset_normalizer/__pycache__/legacy.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/charset_normalizer/__pycache__/md.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/charset_normalizer/__pycache__/models.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/charset_normalizer/__pycache__/utils.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/charset_normalizer/__pycache__/version.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/charset_normalizer/api.py create mode 100644 venv/lib/python3.11/site-packages/charset_normalizer/cd.py create mode 100644 venv/lib/python3.11/site-packages/charset_normalizer/cli/__init__.py create mode 100644 venv/lib/python3.11/site-packages/charset_normalizer/cli/__main__.py create mode 100644 venv/lib/python3.11/site-packages/charset_normalizer/cli/__pycache__/__init__.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/charset_normalizer/cli/__pycache__/__main__.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/charset_normalizer/constant.py create mode 100644 venv/lib/python3.11/site-packages/charset_normalizer/legacy.py create mode 100755 venv/lib/python3.11/site-packages/charset_normalizer/md.cpython-311-x86_64-linux-gnu.so create mode 100644 venv/lib/python3.11/site-packages/charset_normalizer/md.py create mode 100755 venv/lib/python3.11/site-packages/charset_normalizer/md__mypyc.cpython-311-x86_64-linux-gnu.so create mode 100644 venv/lib/python3.11/site-packages/charset_normalizer/models.py create mode 100644 venv/lib/python3.11/site-packages/charset_normalizer/py.typed create mode 100644 venv/lib/python3.11/site-packages/charset_normalizer/utils.py create mode 100644 venv/lib/python3.11/site-packages/charset_normalizer/version.py create mode 100644 venv/lib/python3.11/site-packages/click-8.3.1.dist-info/INSTALLER create mode 100644 venv/lib/python3.11/site-packages/click-8.3.1.dist-info/METADATA create mode 100644 venv/lib/python3.11/site-packages/click-8.3.1.dist-info/RECORD create mode 100644 venv/lib/python3.11/site-packages/click-8.3.1.dist-info/WHEEL create mode 100644 venv/lib/python3.11/site-packages/click-8.3.1.dist-info/licenses/LICENSE.txt create mode 100644 venv/lib/python3.11/site-packages/click/__init__.py create mode 100644 venv/lib/python3.11/site-packages/click/__pycache__/__init__.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/click/__pycache__/_compat.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/click/__pycache__/_termui_impl.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/click/__pycache__/_textwrap.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/click/__pycache__/_utils.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/click/__pycache__/_winconsole.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/click/__pycache__/core.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/click/__pycache__/decorators.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/click/__pycache__/exceptions.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/click/__pycache__/formatting.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/click/__pycache__/globals.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/click/__pycache__/parser.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/click/__pycache__/shell_completion.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/click/__pycache__/termui.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/click/__pycache__/testing.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/click/__pycache__/types.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/click/__pycache__/utils.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/click/_compat.py create mode 100644 venv/lib/python3.11/site-packages/click/_termui_impl.py create mode 100644 venv/lib/python3.11/site-packages/click/_textwrap.py create mode 100644 venv/lib/python3.11/site-packages/click/_utils.py create mode 100644 venv/lib/python3.11/site-packages/click/_winconsole.py create mode 100644 venv/lib/python3.11/site-packages/click/core.py create mode 100644 venv/lib/python3.11/site-packages/click/decorators.py create mode 100644 venv/lib/python3.11/site-packages/click/exceptions.py create mode 100644 venv/lib/python3.11/site-packages/click/formatting.py create mode 100644 venv/lib/python3.11/site-packages/click/globals.py create mode 100644 venv/lib/python3.11/site-packages/click/parser.py create mode 100644 venv/lib/python3.11/site-packages/click/py.typed create mode 100644 venv/lib/python3.11/site-packages/click/shell_completion.py create mode 100644 venv/lib/python3.11/site-packages/click/termui.py create mode 100644 venv/lib/python3.11/site-packages/click/testing.py create mode 100644 venv/lib/python3.11/site-packages/click/types.py create mode 100644 venv/lib/python3.11/site-packages/click/utils.py create mode 100644 venv/lib/python3.11/site-packages/cryptography-46.0.3.dist-info/INSTALLER create mode 100644 venv/lib/python3.11/site-packages/cryptography-46.0.3.dist-info/METADATA create mode 100644 venv/lib/python3.11/site-packages/cryptography-46.0.3.dist-info/RECORD create mode 100644 venv/lib/python3.11/site-packages/cryptography-46.0.3.dist-info/WHEEL create mode 100644 venv/lib/python3.11/site-packages/cryptography-46.0.3.dist-info/licenses/LICENSE create mode 100644 venv/lib/python3.11/site-packages/cryptography-46.0.3.dist-info/licenses/LICENSE.APACHE create mode 100644 venv/lib/python3.11/site-packages/cryptography-46.0.3.dist-info/licenses/LICENSE.BSD create mode 100644 venv/lib/python3.11/site-packages/cryptography/__about__.py create mode 100644 venv/lib/python3.11/site-packages/cryptography/__init__.py create mode 100644 venv/lib/python3.11/site-packages/cryptography/__pycache__/__about__.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/cryptography/__pycache__/__init__.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/cryptography/__pycache__/exceptions.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/cryptography/__pycache__/fernet.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/cryptography/__pycache__/utils.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/cryptography/exceptions.py create mode 100644 venv/lib/python3.11/site-packages/cryptography/fernet.py create mode 100644 venv/lib/python3.11/site-packages/cryptography/hazmat/__init__.py create mode 100644 venv/lib/python3.11/site-packages/cryptography/hazmat/__pycache__/__init__.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/cryptography/hazmat/__pycache__/_oid.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/cryptography/hazmat/_oid.py create mode 100644 venv/lib/python3.11/site-packages/cryptography/hazmat/asn1/__init__.py create mode 100644 venv/lib/python3.11/site-packages/cryptography/hazmat/asn1/__pycache__/__init__.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/cryptography/hazmat/asn1/__pycache__/asn1.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/cryptography/hazmat/asn1/asn1.py create mode 100644 venv/lib/python3.11/site-packages/cryptography/hazmat/backends/__init__.py create mode 100644 venv/lib/python3.11/site-packages/cryptography/hazmat/backends/__pycache__/__init__.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/cryptography/hazmat/backends/openssl/__init__.py create mode 100644 venv/lib/python3.11/site-packages/cryptography/hazmat/backends/openssl/__pycache__/__init__.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/cryptography/hazmat/backends/openssl/__pycache__/backend.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/cryptography/hazmat/backends/openssl/backend.py create mode 100644 venv/lib/python3.11/site-packages/cryptography/hazmat/bindings/__init__.py create mode 100644 venv/lib/python3.11/site-packages/cryptography/hazmat/bindings/__pycache__/__init__.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/cryptography/hazmat/bindings/_rust.abi3.so create mode 100644 venv/lib/python3.11/site-packages/cryptography/hazmat/bindings/_rust/__init__.pyi create mode 100644 venv/lib/python3.11/site-packages/cryptography/hazmat/bindings/_rust/_openssl.pyi create mode 100644 venv/lib/python3.11/site-packages/cryptography/hazmat/bindings/_rust/asn1.pyi create mode 100644 venv/lib/python3.11/site-packages/cryptography/hazmat/bindings/_rust/declarative_asn1.pyi create mode 100644 venv/lib/python3.11/site-packages/cryptography/hazmat/bindings/_rust/exceptions.pyi create mode 100644 venv/lib/python3.11/site-packages/cryptography/hazmat/bindings/_rust/ocsp.pyi create mode 100644 venv/lib/python3.11/site-packages/cryptography/hazmat/bindings/_rust/openssl/__init__.pyi create mode 100644 venv/lib/python3.11/site-packages/cryptography/hazmat/bindings/_rust/openssl/aead.pyi create mode 100644 venv/lib/python3.11/site-packages/cryptography/hazmat/bindings/_rust/openssl/ciphers.pyi create mode 100644 venv/lib/python3.11/site-packages/cryptography/hazmat/bindings/_rust/openssl/cmac.pyi create mode 100644 venv/lib/python3.11/site-packages/cryptography/hazmat/bindings/_rust/openssl/dh.pyi create mode 100644 venv/lib/python3.11/site-packages/cryptography/hazmat/bindings/_rust/openssl/dsa.pyi create mode 100644 venv/lib/python3.11/site-packages/cryptography/hazmat/bindings/_rust/openssl/ec.pyi create mode 100644 venv/lib/python3.11/site-packages/cryptography/hazmat/bindings/_rust/openssl/ed25519.pyi create mode 100644 venv/lib/python3.11/site-packages/cryptography/hazmat/bindings/_rust/openssl/ed448.pyi create mode 100644 venv/lib/python3.11/site-packages/cryptography/hazmat/bindings/_rust/openssl/hashes.pyi create mode 100644 venv/lib/python3.11/site-packages/cryptography/hazmat/bindings/_rust/openssl/hmac.pyi create mode 100644 venv/lib/python3.11/site-packages/cryptography/hazmat/bindings/_rust/openssl/kdf.pyi create mode 100644 venv/lib/python3.11/site-packages/cryptography/hazmat/bindings/_rust/openssl/keys.pyi create mode 100644 venv/lib/python3.11/site-packages/cryptography/hazmat/bindings/_rust/openssl/poly1305.pyi create mode 100644 venv/lib/python3.11/site-packages/cryptography/hazmat/bindings/_rust/openssl/rsa.pyi create mode 100644 venv/lib/python3.11/site-packages/cryptography/hazmat/bindings/_rust/openssl/x25519.pyi create mode 100644 venv/lib/python3.11/site-packages/cryptography/hazmat/bindings/_rust/openssl/x448.pyi create mode 100644 venv/lib/python3.11/site-packages/cryptography/hazmat/bindings/_rust/pkcs12.pyi create mode 100644 venv/lib/python3.11/site-packages/cryptography/hazmat/bindings/_rust/pkcs7.pyi create mode 100644 venv/lib/python3.11/site-packages/cryptography/hazmat/bindings/_rust/test_support.pyi create mode 100644 venv/lib/python3.11/site-packages/cryptography/hazmat/bindings/_rust/x509.pyi create mode 100644 venv/lib/python3.11/site-packages/cryptography/hazmat/bindings/openssl/__init__.py create mode 100644 venv/lib/python3.11/site-packages/cryptography/hazmat/bindings/openssl/__pycache__/__init__.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/cryptography/hazmat/bindings/openssl/__pycache__/_conditional.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/cryptography/hazmat/bindings/openssl/__pycache__/binding.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/cryptography/hazmat/bindings/openssl/_conditional.py create mode 100644 venv/lib/python3.11/site-packages/cryptography/hazmat/bindings/openssl/binding.py create mode 100644 venv/lib/python3.11/site-packages/cryptography/hazmat/decrepit/__init__.py create mode 100644 venv/lib/python3.11/site-packages/cryptography/hazmat/decrepit/__pycache__/__init__.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/cryptography/hazmat/decrepit/ciphers/__init__.py create mode 100644 venv/lib/python3.11/site-packages/cryptography/hazmat/decrepit/ciphers/__pycache__/__init__.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/cryptography/hazmat/decrepit/ciphers/__pycache__/algorithms.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/cryptography/hazmat/decrepit/ciphers/algorithms.py create mode 100644 venv/lib/python3.11/site-packages/cryptography/hazmat/primitives/__init__.py create mode 100644 venv/lib/python3.11/site-packages/cryptography/hazmat/primitives/__pycache__/__init__.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/cryptography/hazmat/primitives/__pycache__/_asymmetric.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/cryptography/hazmat/primitives/__pycache__/_cipheralgorithm.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/cryptography/hazmat/primitives/__pycache__/_serialization.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/cryptography/hazmat/primitives/__pycache__/cmac.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/cryptography/hazmat/primitives/__pycache__/constant_time.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/cryptography/hazmat/primitives/__pycache__/hashes.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/cryptography/hazmat/primitives/__pycache__/hmac.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/cryptography/hazmat/primitives/__pycache__/keywrap.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/cryptography/hazmat/primitives/__pycache__/padding.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/cryptography/hazmat/primitives/__pycache__/poly1305.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/cryptography/hazmat/primitives/_asymmetric.py create mode 100644 venv/lib/python3.11/site-packages/cryptography/hazmat/primitives/_cipheralgorithm.py create mode 100644 venv/lib/python3.11/site-packages/cryptography/hazmat/primitives/_serialization.py create mode 100644 venv/lib/python3.11/site-packages/cryptography/hazmat/primitives/asymmetric/__init__.py create mode 100644 venv/lib/python3.11/site-packages/cryptography/hazmat/primitives/asymmetric/__pycache__/__init__.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/cryptography/hazmat/primitives/asymmetric/__pycache__/dh.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/cryptography/hazmat/primitives/asymmetric/__pycache__/dsa.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/cryptography/hazmat/primitives/asymmetric/__pycache__/ec.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/cryptography/hazmat/primitives/asymmetric/__pycache__/ed25519.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/cryptography/hazmat/primitives/asymmetric/__pycache__/ed448.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/cryptography/hazmat/primitives/asymmetric/__pycache__/padding.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/cryptography/hazmat/primitives/asymmetric/__pycache__/rsa.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/cryptography/hazmat/primitives/asymmetric/__pycache__/types.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/cryptography/hazmat/primitives/asymmetric/__pycache__/utils.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/cryptography/hazmat/primitives/asymmetric/__pycache__/x25519.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/cryptography/hazmat/primitives/asymmetric/__pycache__/x448.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/cryptography/hazmat/primitives/asymmetric/dh.py create mode 100644 venv/lib/python3.11/site-packages/cryptography/hazmat/primitives/asymmetric/dsa.py create mode 100644 venv/lib/python3.11/site-packages/cryptography/hazmat/primitives/asymmetric/ec.py create mode 100644 venv/lib/python3.11/site-packages/cryptography/hazmat/primitives/asymmetric/ed25519.py create mode 100644 venv/lib/python3.11/site-packages/cryptography/hazmat/primitives/asymmetric/ed448.py create mode 100644 venv/lib/python3.11/site-packages/cryptography/hazmat/primitives/asymmetric/padding.py create mode 100644 venv/lib/python3.11/site-packages/cryptography/hazmat/primitives/asymmetric/rsa.py create mode 100644 venv/lib/python3.11/site-packages/cryptography/hazmat/primitives/asymmetric/types.py create mode 100644 venv/lib/python3.11/site-packages/cryptography/hazmat/primitives/asymmetric/utils.py create mode 100644 venv/lib/python3.11/site-packages/cryptography/hazmat/primitives/asymmetric/x25519.py create mode 100644 venv/lib/python3.11/site-packages/cryptography/hazmat/primitives/asymmetric/x448.py create mode 100644 venv/lib/python3.11/site-packages/cryptography/hazmat/primitives/ciphers/__init__.py create mode 100644 venv/lib/python3.11/site-packages/cryptography/hazmat/primitives/ciphers/__pycache__/__init__.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/cryptography/hazmat/primitives/ciphers/__pycache__/aead.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/cryptography/hazmat/primitives/ciphers/__pycache__/algorithms.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/cryptography/hazmat/primitives/ciphers/__pycache__/base.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/cryptography/hazmat/primitives/ciphers/__pycache__/modes.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/cryptography/hazmat/primitives/ciphers/aead.py create mode 100644 venv/lib/python3.11/site-packages/cryptography/hazmat/primitives/ciphers/algorithms.py create mode 100644 venv/lib/python3.11/site-packages/cryptography/hazmat/primitives/ciphers/base.py create mode 100644 venv/lib/python3.11/site-packages/cryptography/hazmat/primitives/ciphers/modes.py create mode 100644 venv/lib/python3.11/site-packages/cryptography/hazmat/primitives/cmac.py create mode 100644 venv/lib/python3.11/site-packages/cryptography/hazmat/primitives/constant_time.py create mode 100644 venv/lib/python3.11/site-packages/cryptography/hazmat/primitives/hashes.py create mode 100644 venv/lib/python3.11/site-packages/cryptography/hazmat/primitives/hmac.py create mode 100644 venv/lib/python3.11/site-packages/cryptography/hazmat/primitives/kdf/__init__.py create mode 100644 venv/lib/python3.11/site-packages/cryptography/hazmat/primitives/kdf/__pycache__/__init__.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/cryptography/hazmat/primitives/kdf/__pycache__/argon2.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/cryptography/hazmat/primitives/kdf/__pycache__/concatkdf.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/cryptography/hazmat/primitives/kdf/__pycache__/hkdf.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/cryptography/hazmat/primitives/kdf/__pycache__/kbkdf.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/cryptography/hazmat/primitives/kdf/__pycache__/pbkdf2.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/cryptography/hazmat/primitives/kdf/__pycache__/scrypt.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/cryptography/hazmat/primitives/kdf/__pycache__/x963kdf.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/cryptography/hazmat/primitives/kdf/argon2.py create mode 100644 venv/lib/python3.11/site-packages/cryptography/hazmat/primitives/kdf/concatkdf.py create mode 100644 venv/lib/python3.11/site-packages/cryptography/hazmat/primitives/kdf/hkdf.py create mode 100644 venv/lib/python3.11/site-packages/cryptography/hazmat/primitives/kdf/kbkdf.py create mode 100644 venv/lib/python3.11/site-packages/cryptography/hazmat/primitives/kdf/pbkdf2.py create mode 100644 venv/lib/python3.11/site-packages/cryptography/hazmat/primitives/kdf/scrypt.py create mode 100644 venv/lib/python3.11/site-packages/cryptography/hazmat/primitives/kdf/x963kdf.py create mode 100644 venv/lib/python3.11/site-packages/cryptography/hazmat/primitives/keywrap.py create mode 100644 venv/lib/python3.11/site-packages/cryptography/hazmat/primitives/padding.py create mode 100644 venv/lib/python3.11/site-packages/cryptography/hazmat/primitives/poly1305.py create mode 100644 venv/lib/python3.11/site-packages/cryptography/hazmat/primitives/serialization/__init__.py create mode 100644 venv/lib/python3.11/site-packages/cryptography/hazmat/primitives/serialization/__pycache__/__init__.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/cryptography/hazmat/primitives/serialization/__pycache__/base.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/cryptography/hazmat/primitives/serialization/__pycache__/pkcs12.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/cryptography/hazmat/primitives/serialization/__pycache__/pkcs7.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/cryptography/hazmat/primitives/serialization/__pycache__/ssh.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/cryptography/hazmat/primitives/serialization/base.py create mode 100644 venv/lib/python3.11/site-packages/cryptography/hazmat/primitives/serialization/pkcs12.py create mode 100644 venv/lib/python3.11/site-packages/cryptography/hazmat/primitives/serialization/pkcs7.py create mode 100644 venv/lib/python3.11/site-packages/cryptography/hazmat/primitives/serialization/ssh.py create mode 100644 venv/lib/python3.11/site-packages/cryptography/hazmat/primitives/twofactor/__init__.py create mode 100644 venv/lib/python3.11/site-packages/cryptography/hazmat/primitives/twofactor/__pycache__/__init__.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/cryptography/hazmat/primitives/twofactor/__pycache__/hotp.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/cryptography/hazmat/primitives/twofactor/__pycache__/totp.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/cryptography/hazmat/primitives/twofactor/hotp.py create mode 100644 venv/lib/python3.11/site-packages/cryptography/hazmat/primitives/twofactor/totp.py create mode 100644 venv/lib/python3.11/site-packages/cryptography/py.typed create mode 100644 venv/lib/python3.11/site-packages/cryptography/utils.py create mode 100644 venv/lib/python3.11/site-packages/cryptography/x509/__init__.py create mode 100644 venv/lib/python3.11/site-packages/cryptography/x509/__pycache__/__init__.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/cryptography/x509/__pycache__/base.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/cryptography/x509/__pycache__/certificate_transparency.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/cryptography/x509/__pycache__/extensions.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/cryptography/x509/__pycache__/general_name.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/cryptography/x509/__pycache__/name.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/cryptography/x509/__pycache__/ocsp.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/cryptography/x509/__pycache__/oid.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/cryptography/x509/__pycache__/verification.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/cryptography/x509/base.py create mode 100644 venv/lib/python3.11/site-packages/cryptography/x509/certificate_transparency.py create mode 100644 venv/lib/python3.11/site-packages/cryptography/x509/extensions.py create mode 100644 venv/lib/python3.11/site-packages/cryptography/x509/general_name.py create mode 100644 venv/lib/python3.11/site-packages/cryptography/x509/name.py create mode 100644 venv/lib/python3.11/site-packages/cryptography/x509/ocsp.py create mode 100644 venv/lib/python3.11/site-packages/cryptography/x509/oid.py create mode 100644 venv/lib/python3.11/site-packages/cryptography/x509/verification.py create mode 100644 venv/lib/python3.11/site-packages/distutils-precedence.pth create mode 100644 venv/lib/python3.11/site-packages/dotenv/__init__.py create mode 100644 venv/lib/python3.11/site-packages/dotenv/__main__.py create mode 100644 venv/lib/python3.11/site-packages/dotenv/__pycache__/__init__.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/dotenv/__pycache__/__main__.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/dotenv/__pycache__/cli.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/dotenv/__pycache__/ipython.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/dotenv/__pycache__/main.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/dotenv/__pycache__/parser.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/dotenv/__pycache__/variables.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/dotenv/__pycache__/version.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/dotenv/cli.py create mode 100644 venv/lib/python3.11/site-packages/dotenv/ipython.py create mode 100644 venv/lib/python3.11/site-packages/dotenv/main.py create mode 100644 venv/lib/python3.11/site-packages/dotenv/parser.py create mode 100644 venv/lib/python3.11/site-packages/dotenv/py.typed create mode 100644 venv/lib/python3.11/site-packages/dotenv/variables.py create mode 100644 venv/lib/python3.11/site-packages/dotenv/version.py create mode 100644 venv/lib/python3.11/site-packages/h11-0.16.0.dist-info/INSTALLER create mode 100644 venv/lib/python3.11/site-packages/h11-0.16.0.dist-info/METADATA create mode 100644 venv/lib/python3.11/site-packages/h11-0.16.0.dist-info/RECORD create mode 100644 venv/lib/python3.11/site-packages/h11-0.16.0.dist-info/WHEEL create mode 100644 venv/lib/python3.11/site-packages/h11-0.16.0.dist-info/licenses/LICENSE.txt create mode 100644 venv/lib/python3.11/site-packages/h11-0.16.0.dist-info/top_level.txt create mode 100644 venv/lib/python3.11/site-packages/h11/__init__.py create mode 100644 venv/lib/python3.11/site-packages/h11/__pycache__/__init__.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/h11/__pycache__/_abnf.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/h11/__pycache__/_connection.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/h11/__pycache__/_events.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/h11/__pycache__/_headers.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/h11/__pycache__/_readers.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/h11/__pycache__/_receivebuffer.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/h11/__pycache__/_state.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/h11/__pycache__/_util.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/h11/__pycache__/_version.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/h11/__pycache__/_writers.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/h11/_abnf.py create mode 100644 venv/lib/python3.11/site-packages/h11/_connection.py create mode 100644 venv/lib/python3.11/site-packages/h11/_events.py create mode 100644 venv/lib/python3.11/site-packages/h11/_headers.py create mode 100644 venv/lib/python3.11/site-packages/h11/_readers.py create mode 100644 venv/lib/python3.11/site-packages/h11/_receivebuffer.py create mode 100644 venv/lib/python3.11/site-packages/h11/_state.py create mode 100644 venv/lib/python3.11/site-packages/h11/_util.py create mode 100644 venv/lib/python3.11/site-packages/h11/_version.py create mode 100644 venv/lib/python3.11/site-packages/h11/_writers.py create mode 100644 venv/lib/python3.11/site-packages/h11/py.typed create mode 100644 venv/lib/python3.11/site-packages/httpcore-1.0.9.dist-info/INSTALLER create mode 100644 venv/lib/python3.11/site-packages/httpcore-1.0.9.dist-info/METADATA create mode 100644 venv/lib/python3.11/site-packages/httpcore-1.0.9.dist-info/RECORD create mode 100644 venv/lib/python3.11/site-packages/httpcore-1.0.9.dist-info/WHEEL create mode 100644 venv/lib/python3.11/site-packages/httpcore-1.0.9.dist-info/licenses/LICENSE.md create mode 100644 venv/lib/python3.11/site-packages/httpcore/__init__.py create mode 100644 venv/lib/python3.11/site-packages/httpcore/__pycache__/__init__.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/httpcore/__pycache__/_api.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/httpcore/__pycache__/_exceptions.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/httpcore/__pycache__/_models.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/httpcore/__pycache__/_ssl.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/httpcore/__pycache__/_synchronization.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/httpcore/__pycache__/_trace.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/httpcore/__pycache__/_utils.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/httpcore/_api.py create mode 100644 venv/lib/python3.11/site-packages/httpcore/_async/__init__.py create mode 100644 venv/lib/python3.11/site-packages/httpcore/_async/__pycache__/__init__.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/httpcore/_async/__pycache__/connection.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/httpcore/_async/__pycache__/connection_pool.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/httpcore/_async/__pycache__/http11.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/httpcore/_async/__pycache__/http2.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/httpcore/_async/__pycache__/http_proxy.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/httpcore/_async/__pycache__/interfaces.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/httpcore/_async/__pycache__/socks_proxy.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/httpcore/_async/connection.py create mode 100644 venv/lib/python3.11/site-packages/httpcore/_async/connection_pool.py create mode 100644 venv/lib/python3.11/site-packages/httpcore/_async/http11.py create mode 100644 venv/lib/python3.11/site-packages/httpcore/_async/http2.py create mode 100644 venv/lib/python3.11/site-packages/httpcore/_async/http_proxy.py create mode 100644 venv/lib/python3.11/site-packages/httpcore/_async/interfaces.py create mode 100644 venv/lib/python3.11/site-packages/httpcore/_async/socks_proxy.py create mode 100644 venv/lib/python3.11/site-packages/httpcore/_backends/__init__.py create mode 100644 venv/lib/python3.11/site-packages/httpcore/_backends/__pycache__/__init__.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/httpcore/_backends/__pycache__/anyio.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/httpcore/_backends/__pycache__/auto.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/httpcore/_backends/__pycache__/base.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/httpcore/_backends/__pycache__/mock.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/httpcore/_backends/__pycache__/sync.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/httpcore/_backends/__pycache__/trio.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/httpcore/_backends/anyio.py create mode 100644 venv/lib/python3.11/site-packages/httpcore/_backends/auto.py create mode 100644 venv/lib/python3.11/site-packages/httpcore/_backends/base.py create mode 100644 venv/lib/python3.11/site-packages/httpcore/_backends/mock.py create mode 100644 venv/lib/python3.11/site-packages/httpcore/_backends/sync.py create mode 100644 venv/lib/python3.11/site-packages/httpcore/_backends/trio.py create mode 100644 venv/lib/python3.11/site-packages/httpcore/_exceptions.py create mode 100644 venv/lib/python3.11/site-packages/httpcore/_models.py create mode 100644 venv/lib/python3.11/site-packages/httpcore/_ssl.py create mode 100644 venv/lib/python3.11/site-packages/httpcore/_sync/__init__.py create mode 100644 venv/lib/python3.11/site-packages/httpcore/_sync/__pycache__/__init__.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/httpcore/_sync/__pycache__/connection.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/httpcore/_sync/__pycache__/connection_pool.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/httpcore/_sync/__pycache__/http11.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/httpcore/_sync/__pycache__/http2.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/httpcore/_sync/__pycache__/http_proxy.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/httpcore/_sync/__pycache__/interfaces.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/httpcore/_sync/__pycache__/socks_proxy.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/httpcore/_sync/connection.py create mode 100644 venv/lib/python3.11/site-packages/httpcore/_sync/connection_pool.py create mode 100644 venv/lib/python3.11/site-packages/httpcore/_sync/http11.py create mode 100644 venv/lib/python3.11/site-packages/httpcore/_sync/http2.py create mode 100644 venv/lib/python3.11/site-packages/httpcore/_sync/http_proxy.py create mode 100644 venv/lib/python3.11/site-packages/httpcore/_sync/interfaces.py create mode 100644 venv/lib/python3.11/site-packages/httpcore/_sync/socks_proxy.py create mode 100644 venv/lib/python3.11/site-packages/httpcore/_synchronization.py create mode 100644 venv/lib/python3.11/site-packages/httpcore/_trace.py create mode 100644 venv/lib/python3.11/site-packages/httpcore/_utils.py create mode 100644 venv/lib/python3.11/site-packages/httpcore/py.typed create mode 100644 venv/lib/python3.11/site-packages/httpx-0.28.1.dist-info/INSTALLER create mode 100644 venv/lib/python3.11/site-packages/httpx-0.28.1.dist-info/METADATA create mode 100644 venv/lib/python3.11/site-packages/httpx-0.28.1.dist-info/RECORD create mode 100644 venv/lib/python3.11/site-packages/httpx-0.28.1.dist-info/WHEEL create mode 100644 venv/lib/python3.11/site-packages/httpx-0.28.1.dist-info/entry_points.txt create mode 100644 venv/lib/python3.11/site-packages/httpx-0.28.1.dist-info/licenses/LICENSE.md create mode 100644 venv/lib/python3.11/site-packages/httpx/__init__.py create mode 100644 venv/lib/python3.11/site-packages/httpx/__pycache__/__init__.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/httpx/__pycache__/__version__.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/httpx/__pycache__/_api.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/httpx/__pycache__/_auth.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/httpx/__pycache__/_client.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/httpx/__pycache__/_config.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/httpx/__pycache__/_content.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/httpx/__pycache__/_decoders.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/httpx/__pycache__/_exceptions.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/httpx/__pycache__/_main.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/httpx/__pycache__/_models.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/httpx/__pycache__/_multipart.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/httpx/__pycache__/_status_codes.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/httpx/__pycache__/_types.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/httpx/__pycache__/_urlparse.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/httpx/__pycache__/_urls.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/httpx/__pycache__/_utils.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/httpx/__version__.py create mode 100644 venv/lib/python3.11/site-packages/httpx/_api.py create mode 100644 venv/lib/python3.11/site-packages/httpx/_auth.py create mode 100644 venv/lib/python3.11/site-packages/httpx/_client.py create mode 100644 venv/lib/python3.11/site-packages/httpx/_config.py create mode 100644 venv/lib/python3.11/site-packages/httpx/_content.py create mode 100644 venv/lib/python3.11/site-packages/httpx/_decoders.py create mode 100644 venv/lib/python3.11/site-packages/httpx/_exceptions.py create mode 100644 venv/lib/python3.11/site-packages/httpx/_main.py create mode 100644 venv/lib/python3.11/site-packages/httpx/_models.py create mode 100644 venv/lib/python3.11/site-packages/httpx/_multipart.py create mode 100644 venv/lib/python3.11/site-packages/httpx/_status_codes.py create mode 100644 venv/lib/python3.11/site-packages/httpx/_transports/__init__.py create mode 100644 venv/lib/python3.11/site-packages/httpx/_transports/__pycache__/__init__.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/httpx/_transports/__pycache__/asgi.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/httpx/_transports/__pycache__/base.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/httpx/_transports/__pycache__/default.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/httpx/_transports/__pycache__/mock.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/httpx/_transports/__pycache__/wsgi.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/httpx/_transports/asgi.py create mode 100644 venv/lib/python3.11/site-packages/httpx/_transports/base.py create mode 100644 venv/lib/python3.11/site-packages/httpx/_transports/default.py create mode 100644 venv/lib/python3.11/site-packages/httpx/_transports/mock.py create mode 100644 venv/lib/python3.11/site-packages/httpx/_transports/wsgi.py create mode 100644 venv/lib/python3.11/site-packages/httpx/_types.py create mode 100644 venv/lib/python3.11/site-packages/httpx/_urlparse.py create mode 100644 venv/lib/python3.11/site-packages/httpx/_urls.py create mode 100644 venv/lib/python3.11/site-packages/httpx/_utils.py create mode 100644 venv/lib/python3.11/site-packages/httpx/py.typed create mode 100644 venv/lib/python3.11/site-packages/httpx_sse-0.4.3.dist-info/INSTALLER create mode 100644 venv/lib/python3.11/site-packages/httpx_sse-0.4.3.dist-info/METADATA create mode 100644 venv/lib/python3.11/site-packages/httpx_sse-0.4.3.dist-info/RECORD create mode 100644 venv/lib/python3.11/site-packages/httpx_sse-0.4.3.dist-info/WHEEL create mode 100644 venv/lib/python3.11/site-packages/httpx_sse-0.4.3.dist-info/licenses/LICENSE create mode 100644 venv/lib/python3.11/site-packages/httpx_sse-0.4.3.dist-info/top_level.txt create mode 100644 venv/lib/python3.11/site-packages/httpx_sse/__init__.py create mode 100644 venv/lib/python3.11/site-packages/httpx_sse/__pycache__/__init__.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/httpx_sse/__pycache__/_api.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/httpx_sse/__pycache__/_decoders.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/httpx_sse/__pycache__/_exceptions.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/httpx_sse/__pycache__/_models.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/httpx_sse/_api.py create mode 100644 venv/lib/python3.11/site-packages/httpx_sse/_decoders.py create mode 100644 venv/lib/python3.11/site-packages/httpx_sse/_exceptions.py create mode 100644 venv/lib/python3.11/site-packages/httpx_sse/_models.py create mode 100644 venv/lib/python3.11/site-packages/httpx_sse/py.typed create mode 100644 venv/lib/python3.11/site-packages/idna-3.11.dist-info/INSTALLER create mode 100644 venv/lib/python3.11/site-packages/idna-3.11.dist-info/METADATA create mode 100644 venv/lib/python3.11/site-packages/idna-3.11.dist-info/RECORD create mode 100644 venv/lib/python3.11/site-packages/idna-3.11.dist-info/WHEEL create mode 100644 venv/lib/python3.11/site-packages/idna-3.11.dist-info/licenses/LICENSE.md create mode 100644 venv/lib/python3.11/site-packages/idna/__init__.py create mode 100644 venv/lib/python3.11/site-packages/idna/__pycache__/__init__.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/idna/__pycache__/codec.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/idna/__pycache__/compat.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/idna/__pycache__/core.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/idna/__pycache__/idnadata.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/idna/__pycache__/intranges.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/idna/__pycache__/package_data.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/idna/__pycache__/uts46data.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/idna/codec.py create mode 100644 venv/lib/python3.11/site-packages/idna/compat.py create mode 100644 venv/lib/python3.11/site-packages/idna/core.py create mode 100644 venv/lib/python3.11/site-packages/idna/idnadata.py create mode 100644 venv/lib/python3.11/site-packages/idna/intranges.py create mode 100644 venv/lib/python3.11/site-packages/idna/package_data.py create mode 100644 venv/lib/python3.11/site-packages/idna/py.typed create mode 100644 venv/lib/python3.11/site-packages/idna/uts46data.py create mode 100644 venv/lib/python3.11/site-packages/jsonschema-4.26.0.dist-info/INSTALLER create mode 100644 venv/lib/python3.11/site-packages/jsonschema-4.26.0.dist-info/METADATA create mode 100644 venv/lib/python3.11/site-packages/jsonschema-4.26.0.dist-info/RECORD create mode 100644 venv/lib/python3.11/site-packages/jsonschema-4.26.0.dist-info/WHEEL create mode 100644 venv/lib/python3.11/site-packages/jsonschema-4.26.0.dist-info/entry_points.txt create mode 100644 venv/lib/python3.11/site-packages/jsonschema-4.26.0.dist-info/licenses/COPYING create mode 100644 venv/lib/python3.11/site-packages/jsonschema/__init__.py create mode 100644 venv/lib/python3.11/site-packages/jsonschema/__main__.py create mode 100644 venv/lib/python3.11/site-packages/jsonschema/__pycache__/__init__.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/jsonschema/__pycache__/__main__.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/jsonschema/__pycache__/_format.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/jsonschema/__pycache__/_keywords.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/jsonschema/__pycache__/_legacy_keywords.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/jsonschema/__pycache__/_types.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/jsonschema/__pycache__/_typing.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/jsonschema/__pycache__/_utils.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/jsonschema/__pycache__/cli.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/jsonschema/__pycache__/exceptions.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/jsonschema/__pycache__/protocols.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/jsonschema/__pycache__/validators.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/jsonschema/_format.py create mode 100644 venv/lib/python3.11/site-packages/jsonschema/_keywords.py create mode 100644 venv/lib/python3.11/site-packages/jsonschema/_legacy_keywords.py create mode 100644 venv/lib/python3.11/site-packages/jsonschema/_types.py create mode 100644 venv/lib/python3.11/site-packages/jsonschema/_typing.py create mode 100644 venv/lib/python3.11/site-packages/jsonschema/_utils.py create mode 100644 venv/lib/python3.11/site-packages/jsonschema/benchmarks/__init__.py create mode 100644 venv/lib/python3.11/site-packages/jsonschema/benchmarks/__pycache__/__init__.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/jsonschema/benchmarks/__pycache__/const_vs_enum.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/jsonschema/benchmarks/__pycache__/contains.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/jsonschema/benchmarks/__pycache__/import_benchmark.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/jsonschema/benchmarks/__pycache__/issue232.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/jsonschema/benchmarks/__pycache__/json_schema_test_suite.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/jsonschema/benchmarks/__pycache__/nested_schemas.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/jsonschema/benchmarks/__pycache__/subcomponents.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/jsonschema/benchmarks/__pycache__/unused_registry.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/jsonschema/benchmarks/__pycache__/useless_applicator_schemas.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/jsonschema/benchmarks/__pycache__/useless_keywords.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/jsonschema/benchmarks/__pycache__/validator_creation.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/jsonschema/benchmarks/const_vs_enum.py create mode 100644 venv/lib/python3.11/site-packages/jsonschema/benchmarks/contains.py create mode 100644 venv/lib/python3.11/site-packages/jsonschema/benchmarks/import_benchmark.py create mode 100644 venv/lib/python3.11/site-packages/jsonschema/benchmarks/issue232.py create mode 100644 venv/lib/python3.11/site-packages/jsonschema/benchmarks/issue232/issue.json create mode 100644 venv/lib/python3.11/site-packages/jsonschema/benchmarks/json_schema_test_suite.py create mode 100644 venv/lib/python3.11/site-packages/jsonschema/benchmarks/nested_schemas.py create mode 100644 venv/lib/python3.11/site-packages/jsonschema/benchmarks/subcomponents.py create mode 100644 venv/lib/python3.11/site-packages/jsonschema/benchmarks/unused_registry.py create mode 100644 venv/lib/python3.11/site-packages/jsonschema/benchmarks/useless_applicator_schemas.py create mode 100644 venv/lib/python3.11/site-packages/jsonschema/benchmarks/useless_keywords.py create mode 100644 venv/lib/python3.11/site-packages/jsonschema/benchmarks/validator_creation.py create mode 100644 venv/lib/python3.11/site-packages/jsonschema/cli.py create mode 100644 venv/lib/python3.11/site-packages/jsonschema/exceptions.py create mode 100644 venv/lib/python3.11/site-packages/jsonschema/protocols.py create mode 100644 venv/lib/python3.11/site-packages/jsonschema/tests/__init__.py create mode 100644 venv/lib/python3.11/site-packages/jsonschema/tests/__pycache__/__init__.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/jsonschema/tests/__pycache__/_suite.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/jsonschema/tests/__pycache__/fuzz_validate.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/jsonschema/tests/__pycache__/test_cli.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/jsonschema/tests/__pycache__/test_deprecations.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/jsonschema/tests/__pycache__/test_exceptions.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/jsonschema/tests/__pycache__/test_format.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/jsonschema/tests/__pycache__/test_jsonschema_test_suite.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/jsonschema/tests/__pycache__/test_types.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/jsonschema/tests/__pycache__/test_utils.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/jsonschema/tests/__pycache__/test_validators.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/jsonschema/tests/_suite.py create mode 100644 venv/lib/python3.11/site-packages/jsonschema/tests/fuzz_validate.py create mode 100644 venv/lib/python3.11/site-packages/jsonschema/tests/test_cli.py create mode 100644 venv/lib/python3.11/site-packages/jsonschema/tests/test_deprecations.py create mode 100644 venv/lib/python3.11/site-packages/jsonschema/tests/test_exceptions.py create mode 100644 venv/lib/python3.11/site-packages/jsonschema/tests/test_format.py create mode 100644 venv/lib/python3.11/site-packages/jsonschema/tests/test_jsonschema_test_suite.py create mode 100644 venv/lib/python3.11/site-packages/jsonschema/tests/test_types.py create mode 100644 venv/lib/python3.11/site-packages/jsonschema/tests/test_utils.py create mode 100644 venv/lib/python3.11/site-packages/jsonschema/tests/test_validators.py create mode 100644 venv/lib/python3.11/site-packages/jsonschema/tests/typing/__init__.py create mode 100644 venv/lib/python3.11/site-packages/jsonschema/tests/typing/__pycache__/__init__.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/jsonschema/tests/typing/__pycache__/test_all_concrete_validators_match_protocol.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/jsonschema/tests/typing/test_all_concrete_validators_match_protocol.py create mode 100644 venv/lib/python3.11/site-packages/jsonschema/validators.py create mode 100644 venv/lib/python3.11/site-packages/jsonschema_specifications-2025.9.1.dist-info/INSTALLER create mode 100644 venv/lib/python3.11/site-packages/jsonschema_specifications-2025.9.1.dist-info/METADATA create mode 100644 venv/lib/python3.11/site-packages/jsonschema_specifications-2025.9.1.dist-info/RECORD create mode 100644 venv/lib/python3.11/site-packages/jsonschema_specifications-2025.9.1.dist-info/WHEEL create mode 100644 venv/lib/python3.11/site-packages/jsonschema_specifications-2025.9.1.dist-info/licenses/COPYING create mode 100644 venv/lib/python3.11/site-packages/jsonschema_specifications/__init__.py create mode 100644 venv/lib/python3.11/site-packages/jsonschema_specifications/__pycache__/__init__.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/jsonschema_specifications/__pycache__/_core.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/jsonschema_specifications/_core.py create mode 100644 venv/lib/python3.11/site-packages/jsonschema_specifications/schemas/draft201909/metaschema.json create mode 100644 venv/lib/python3.11/site-packages/jsonschema_specifications/schemas/draft201909/vocabularies/applicator create mode 100644 venv/lib/python3.11/site-packages/jsonschema_specifications/schemas/draft201909/vocabularies/content create mode 100644 venv/lib/python3.11/site-packages/jsonschema_specifications/schemas/draft201909/vocabularies/core create mode 100644 venv/lib/python3.11/site-packages/jsonschema_specifications/schemas/draft201909/vocabularies/format create mode 100644 venv/lib/python3.11/site-packages/jsonschema_specifications/schemas/draft201909/vocabularies/meta-data create mode 100644 venv/lib/python3.11/site-packages/jsonschema_specifications/schemas/draft201909/vocabularies/validation create mode 100644 venv/lib/python3.11/site-packages/jsonschema_specifications/schemas/draft202012/metaschema.json create mode 100644 venv/lib/python3.11/site-packages/jsonschema_specifications/schemas/draft202012/vocabularies/applicator create mode 100644 venv/lib/python3.11/site-packages/jsonschema_specifications/schemas/draft202012/vocabularies/content create mode 100644 venv/lib/python3.11/site-packages/jsonschema_specifications/schemas/draft202012/vocabularies/core create mode 100644 venv/lib/python3.11/site-packages/jsonschema_specifications/schemas/draft202012/vocabularies/format-annotation create mode 100644 venv/lib/python3.11/site-packages/jsonschema_specifications/schemas/draft202012/vocabularies/format-assertion create mode 100644 venv/lib/python3.11/site-packages/jsonschema_specifications/schemas/draft202012/vocabularies/meta-data create mode 100644 venv/lib/python3.11/site-packages/jsonschema_specifications/schemas/draft202012/vocabularies/unevaluated create mode 100644 venv/lib/python3.11/site-packages/jsonschema_specifications/schemas/draft202012/vocabularies/validation create mode 100644 venv/lib/python3.11/site-packages/jsonschema_specifications/schemas/draft3/metaschema.json create mode 100644 venv/lib/python3.11/site-packages/jsonschema_specifications/schemas/draft4/metaschema.json create mode 100644 venv/lib/python3.11/site-packages/jsonschema_specifications/schemas/draft6/metaschema.json create mode 100644 venv/lib/python3.11/site-packages/jsonschema_specifications/schemas/draft7/metaschema.json create mode 100644 venv/lib/python3.11/site-packages/jsonschema_specifications/tests/__init__.py create mode 100644 venv/lib/python3.11/site-packages/jsonschema_specifications/tests/__pycache__/__init__.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/jsonschema_specifications/tests/__pycache__/test_jsonschema_specifications.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/jsonschema_specifications/tests/test_jsonschema_specifications.py create mode 100644 venv/lib/python3.11/site-packages/jwt/__init__.py create mode 100644 venv/lib/python3.11/site-packages/jwt/__pycache__/__init__.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/jwt/__pycache__/algorithms.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/jwt/__pycache__/api_jwk.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/jwt/__pycache__/api_jws.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/jwt/__pycache__/api_jwt.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/jwt/__pycache__/exceptions.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/jwt/__pycache__/help.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/jwt/__pycache__/jwk_set_cache.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/jwt/__pycache__/jwks_client.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/jwt/__pycache__/types.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/jwt/__pycache__/utils.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/jwt/__pycache__/warnings.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/jwt/algorithms.py create mode 100644 venv/lib/python3.11/site-packages/jwt/api_jwk.py create mode 100644 venv/lib/python3.11/site-packages/jwt/api_jws.py create mode 100644 venv/lib/python3.11/site-packages/jwt/api_jwt.py create mode 100644 venv/lib/python3.11/site-packages/jwt/exceptions.py create mode 100644 venv/lib/python3.11/site-packages/jwt/help.py create mode 100644 venv/lib/python3.11/site-packages/jwt/jwk_set_cache.py create mode 100644 venv/lib/python3.11/site-packages/jwt/jwks_client.py create mode 100644 venv/lib/python3.11/site-packages/jwt/py.typed create mode 100644 venv/lib/python3.11/site-packages/jwt/types.py create mode 100644 venv/lib/python3.11/site-packages/jwt/utils.py create mode 100644 venv/lib/python3.11/site-packages/jwt/warnings.py create mode 100644 venv/lib/python3.11/site-packages/mcp-1.26.0.dist-info/INSTALLER create mode 100644 venv/lib/python3.11/site-packages/mcp-1.26.0.dist-info/METADATA create mode 100644 venv/lib/python3.11/site-packages/mcp-1.26.0.dist-info/RECORD create mode 100644 venv/lib/python3.11/site-packages/mcp-1.26.0.dist-info/REQUESTED create mode 100644 venv/lib/python3.11/site-packages/mcp-1.26.0.dist-info/WHEEL create mode 100644 venv/lib/python3.11/site-packages/mcp-1.26.0.dist-info/entry_points.txt create mode 100644 venv/lib/python3.11/site-packages/mcp-1.26.0.dist-info/licenses/LICENSE create mode 100644 venv/lib/python3.11/site-packages/mcp/__init__.py create mode 100644 venv/lib/python3.11/site-packages/mcp/__pycache__/__init__.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/mcp/__pycache__/types.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/mcp/cli/__init__.py create mode 100644 venv/lib/python3.11/site-packages/mcp/cli/__pycache__/__init__.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/mcp/cli/__pycache__/claude.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/mcp/cli/__pycache__/cli.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/mcp/cli/claude.py create mode 100644 venv/lib/python3.11/site-packages/mcp/cli/cli.py create mode 100644 venv/lib/python3.11/site-packages/mcp/client/__init__.py create mode 100644 venv/lib/python3.11/site-packages/mcp/client/__main__.py create mode 100644 venv/lib/python3.11/site-packages/mcp/client/__pycache__/__init__.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/mcp/client/__pycache__/__main__.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/mcp/client/__pycache__/session.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/mcp/client/__pycache__/session_group.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/mcp/client/__pycache__/sse.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/mcp/client/__pycache__/streamable_http.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/mcp/client/__pycache__/websocket.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/mcp/client/auth/__init__.py create mode 100644 venv/lib/python3.11/site-packages/mcp/client/auth/__pycache__/__init__.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/mcp/client/auth/__pycache__/exceptions.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/mcp/client/auth/__pycache__/oauth2.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/mcp/client/auth/__pycache__/utils.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/mcp/client/auth/exceptions.py create mode 100644 venv/lib/python3.11/site-packages/mcp/client/auth/extensions/__init__.py create mode 100644 venv/lib/python3.11/site-packages/mcp/client/auth/extensions/__pycache__/__init__.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/mcp/client/auth/extensions/__pycache__/client_credentials.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/mcp/client/auth/extensions/client_credentials.py create mode 100644 venv/lib/python3.11/site-packages/mcp/client/auth/oauth2.py create mode 100644 venv/lib/python3.11/site-packages/mcp/client/auth/utils.py create mode 100644 venv/lib/python3.11/site-packages/mcp/client/experimental/__init__.py create mode 100644 venv/lib/python3.11/site-packages/mcp/client/experimental/__pycache__/__init__.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/mcp/client/experimental/__pycache__/task_handlers.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/mcp/client/experimental/__pycache__/tasks.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/mcp/client/experimental/task_handlers.py create mode 100644 venv/lib/python3.11/site-packages/mcp/client/experimental/tasks.py create mode 100644 venv/lib/python3.11/site-packages/mcp/client/session.py create mode 100644 venv/lib/python3.11/site-packages/mcp/client/session_group.py create mode 100644 venv/lib/python3.11/site-packages/mcp/client/sse.py create mode 100644 venv/lib/python3.11/site-packages/mcp/client/stdio/__init__.py create mode 100644 venv/lib/python3.11/site-packages/mcp/client/stdio/__pycache__/__init__.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/mcp/client/streamable_http.py create mode 100644 venv/lib/python3.11/site-packages/mcp/client/websocket.py create mode 100644 venv/lib/python3.11/site-packages/mcp/os/__init__.py create mode 100644 venv/lib/python3.11/site-packages/mcp/os/__pycache__/__init__.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/mcp/os/posix/__init__.py create mode 100644 venv/lib/python3.11/site-packages/mcp/os/posix/__pycache__/__init__.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/mcp/os/posix/__pycache__/utilities.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/mcp/os/posix/utilities.py create mode 100644 venv/lib/python3.11/site-packages/mcp/os/win32/__init__.py create mode 100644 venv/lib/python3.11/site-packages/mcp/os/win32/__pycache__/__init__.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/mcp/os/win32/__pycache__/utilities.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/mcp/os/win32/utilities.py create mode 100644 venv/lib/python3.11/site-packages/mcp/py.typed create mode 100644 venv/lib/python3.11/site-packages/mcp/server/__init__.py create mode 100644 venv/lib/python3.11/site-packages/mcp/server/__main__.py create mode 100644 venv/lib/python3.11/site-packages/mcp/server/__pycache__/__init__.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/mcp/server/__pycache__/__main__.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/mcp/server/__pycache__/elicitation.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/mcp/server/__pycache__/models.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/mcp/server/__pycache__/session.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/mcp/server/__pycache__/sse.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/mcp/server/__pycache__/stdio.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/mcp/server/__pycache__/streamable_http.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/mcp/server/__pycache__/streamable_http_manager.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/mcp/server/__pycache__/transport_security.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/mcp/server/__pycache__/validation.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/mcp/server/__pycache__/websocket.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/mcp/server/auth/__init__.py create mode 100644 venv/lib/python3.11/site-packages/mcp/server/auth/__pycache__/__init__.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/mcp/server/auth/__pycache__/errors.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/mcp/server/auth/__pycache__/json_response.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/mcp/server/auth/__pycache__/provider.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/mcp/server/auth/__pycache__/routes.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/mcp/server/auth/__pycache__/settings.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/mcp/server/auth/errors.py create mode 100644 venv/lib/python3.11/site-packages/mcp/server/auth/handlers/__init__.py create mode 100644 venv/lib/python3.11/site-packages/mcp/server/auth/handlers/__pycache__/__init__.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/mcp/server/auth/handlers/__pycache__/authorize.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/mcp/server/auth/handlers/__pycache__/metadata.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/mcp/server/auth/handlers/__pycache__/register.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/mcp/server/auth/handlers/__pycache__/revoke.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/mcp/server/auth/handlers/__pycache__/token.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/mcp/server/auth/handlers/authorize.py create mode 100644 venv/lib/python3.11/site-packages/mcp/server/auth/handlers/metadata.py create mode 100644 venv/lib/python3.11/site-packages/mcp/server/auth/handlers/register.py create mode 100644 venv/lib/python3.11/site-packages/mcp/server/auth/handlers/revoke.py create mode 100644 venv/lib/python3.11/site-packages/mcp/server/auth/handlers/token.py create mode 100644 venv/lib/python3.11/site-packages/mcp/server/auth/json_response.py create mode 100644 venv/lib/python3.11/site-packages/mcp/server/auth/middleware/__init__.py create mode 100644 venv/lib/python3.11/site-packages/mcp/server/auth/middleware/__pycache__/__init__.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/mcp/server/auth/middleware/__pycache__/auth_context.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/mcp/server/auth/middleware/__pycache__/bearer_auth.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/mcp/server/auth/middleware/__pycache__/client_auth.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/mcp/server/auth/middleware/auth_context.py create mode 100644 venv/lib/python3.11/site-packages/mcp/server/auth/middleware/bearer_auth.py create mode 100644 venv/lib/python3.11/site-packages/mcp/server/auth/middleware/client_auth.py create mode 100644 venv/lib/python3.11/site-packages/mcp/server/auth/provider.py create mode 100644 venv/lib/python3.11/site-packages/mcp/server/auth/routes.py create mode 100644 venv/lib/python3.11/site-packages/mcp/server/auth/settings.py create mode 100644 venv/lib/python3.11/site-packages/mcp/server/elicitation.py create mode 100644 venv/lib/python3.11/site-packages/mcp/server/experimental/__init__.py create mode 100644 venv/lib/python3.11/site-packages/mcp/server/experimental/__pycache__/__init__.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/mcp/server/experimental/__pycache__/request_context.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/mcp/server/experimental/__pycache__/session_features.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/mcp/server/experimental/__pycache__/task_context.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/mcp/server/experimental/__pycache__/task_result_handler.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/mcp/server/experimental/__pycache__/task_support.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/mcp/server/experimental/request_context.py create mode 100644 venv/lib/python3.11/site-packages/mcp/server/experimental/session_features.py create mode 100644 venv/lib/python3.11/site-packages/mcp/server/experimental/task_context.py create mode 100644 venv/lib/python3.11/site-packages/mcp/server/experimental/task_result_handler.py create mode 100644 venv/lib/python3.11/site-packages/mcp/server/experimental/task_support.py create mode 100644 venv/lib/python3.11/site-packages/mcp/server/fastmcp/__init__.py create mode 100644 venv/lib/python3.11/site-packages/mcp/server/fastmcp/__pycache__/__init__.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/mcp/server/fastmcp/__pycache__/exceptions.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/mcp/server/fastmcp/__pycache__/server.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/mcp/server/fastmcp/exceptions.py create mode 100644 venv/lib/python3.11/site-packages/mcp/server/fastmcp/prompts/__init__.py create mode 100644 venv/lib/python3.11/site-packages/mcp/server/fastmcp/prompts/__pycache__/__init__.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/mcp/server/fastmcp/prompts/__pycache__/base.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/mcp/server/fastmcp/prompts/__pycache__/manager.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/mcp/server/fastmcp/prompts/base.py create mode 100644 venv/lib/python3.11/site-packages/mcp/server/fastmcp/prompts/manager.py create mode 100644 venv/lib/python3.11/site-packages/mcp/server/fastmcp/resources/__init__.py create mode 100644 venv/lib/python3.11/site-packages/mcp/server/fastmcp/resources/__pycache__/__init__.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/mcp/server/fastmcp/resources/__pycache__/base.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/mcp/server/fastmcp/resources/__pycache__/resource_manager.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/mcp/server/fastmcp/resources/__pycache__/templates.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/mcp/server/fastmcp/resources/__pycache__/types.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/mcp/server/fastmcp/resources/base.py create mode 100644 venv/lib/python3.11/site-packages/mcp/server/fastmcp/resources/resource_manager.py create mode 100644 venv/lib/python3.11/site-packages/mcp/server/fastmcp/resources/templates.py create mode 100644 venv/lib/python3.11/site-packages/mcp/server/fastmcp/resources/types.py create mode 100644 venv/lib/python3.11/site-packages/mcp/server/fastmcp/server.py create mode 100644 venv/lib/python3.11/site-packages/mcp/server/fastmcp/tools/__init__.py create mode 100644 venv/lib/python3.11/site-packages/mcp/server/fastmcp/tools/__pycache__/__init__.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/mcp/server/fastmcp/tools/__pycache__/base.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/mcp/server/fastmcp/tools/__pycache__/tool_manager.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/mcp/server/fastmcp/tools/base.py create mode 100644 venv/lib/python3.11/site-packages/mcp/server/fastmcp/tools/tool_manager.py create mode 100644 venv/lib/python3.11/site-packages/mcp/server/fastmcp/utilities/__init__.py create mode 100644 venv/lib/python3.11/site-packages/mcp/server/fastmcp/utilities/__pycache__/__init__.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/mcp/server/fastmcp/utilities/__pycache__/context_injection.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/mcp/server/fastmcp/utilities/__pycache__/func_metadata.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/mcp/server/fastmcp/utilities/__pycache__/logging.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/mcp/server/fastmcp/utilities/__pycache__/types.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/mcp/server/fastmcp/utilities/context_injection.py create mode 100644 venv/lib/python3.11/site-packages/mcp/server/fastmcp/utilities/func_metadata.py create mode 100644 venv/lib/python3.11/site-packages/mcp/server/fastmcp/utilities/logging.py create mode 100644 venv/lib/python3.11/site-packages/mcp/server/fastmcp/utilities/types.py create mode 100644 venv/lib/python3.11/site-packages/mcp/server/lowlevel/__init__.py create mode 100644 venv/lib/python3.11/site-packages/mcp/server/lowlevel/__pycache__/__init__.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/mcp/server/lowlevel/__pycache__/experimental.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/mcp/server/lowlevel/__pycache__/func_inspection.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/mcp/server/lowlevel/__pycache__/helper_types.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/mcp/server/lowlevel/__pycache__/server.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/mcp/server/lowlevel/experimental.py create mode 100644 venv/lib/python3.11/site-packages/mcp/server/lowlevel/func_inspection.py create mode 100644 venv/lib/python3.11/site-packages/mcp/server/lowlevel/helper_types.py create mode 100644 venv/lib/python3.11/site-packages/mcp/server/lowlevel/server.py create mode 100644 venv/lib/python3.11/site-packages/mcp/server/models.py create mode 100644 venv/lib/python3.11/site-packages/mcp/server/session.py create mode 100644 venv/lib/python3.11/site-packages/mcp/server/sse.py create mode 100644 venv/lib/python3.11/site-packages/mcp/server/stdio.py create mode 100644 venv/lib/python3.11/site-packages/mcp/server/streamable_http.py create mode 100644 venv/lib/python3.11/site-packages/mcp/server/streamable_http_manager.py create mode 100644 venv/lib/python3.11/site-packages/mcp/server/transport_security.py create mode 100644 venv/lib/python3.11/site-packages/mcp/server/validation.py create mode 100644 venv/lib/python3.11/site-packages/mcp/server/websocket.py create mode 100644 venv/lib/python3.11/site-packages/mcp/shared/__init__.py create mode 100644 venv/lib/python3.11/site-packages/mcp/shared/__pycache__/__init__.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/mcp/shared/__pycache__/_httpx_utils.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/mcp/shared/__pycache__/auth.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/mcp/shared/__pycache__/auth_utils.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/mcp/shared/__pycache__/context.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/mcp/shared/__pycache__/exceptions.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/mcp/shared/__pycache__/memory.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/mcp/shared/__pycache__/message.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/mcp/shared/__pycache__/metadata_utils.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/mcp/shared/__pycache__/progress.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/mcp/shared/__pycache__/response_router.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/mcp/shared/__pycache__/session.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/mcp/shared/__pycache__/tool_name_validation.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/mcp/shared/__pycache__/version.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/mcp/shared/_httpx_utils.py create mode 100644 venv/lib/python3.11/site-packages/mcp/shared/auth.py create mode 100644 venv/lib/python3.11/site-packages/mcp/shared/auth_utils.py create mode 100644 venv/lib/python3.11/site-packages/mcp/shared/context.py create mode 100644 venv/lib/python3.11/site-packages/mcp/shared/exceptions.py create mode 100644 venv/lib/python3.11/site-packages/mcp/shared/experimental/__init__.py create mode 100644 venv/lib/python3.11/site-packages/mcp/shared/experimental/__pycache__/__init__.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/mcp/shared/experimental/tasks/__init__.py create mode 100644 venv/lib/python3.11/site-packages/mcp/shared/experimental/tasks/__pycache__/__init__.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/mcp/shared/experimental/tasks/__pycache__/capabilities.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/mcp/shared/experimental/tasks/__pycache__/context.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/mcp/shared/experimental/tasks/__pycache__/helpers.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/mcp/shared/experimental/tasks/__pycache__/in_memory_task_store.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/mcp/shared/experimental/tasks/__pycache__/message_queue.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/mcp/shared/experimental/tasks/__pycache__/polling.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/mcp/shared/experimental/tasks/__pycache__/resolver.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/mcp/shared/experimental/tasks/__pycache__/store.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/mcp/shared/experimental/tasks/capabilities.py create mode 100644 venv/lib/python3.11/site-packages/mcp/shared/experimental/tasks/context.py create mode 100644 venv/lib/python3.11/site-packages/mcp/shared/experimental/tasks/helpers.py create mode 100644 venv/lib/python3.11/site-packages/mcp/shared/experimental/tasks/in_memory_task_store.py create mode 100644 venv/lib/python3.11/site-packages/mcp/shared/experimental/tasks/message_queue.py create mode 100644 venv/lib/python3.11/site-packages/mcp/shared/experimental/tasks/polling.py create mode 100644 venv/lib/python3.11/site-packages/mcp/shared/experimental/tasks/resolver.py create mode 100644 venv/lib/python3.11/site-packages/mcp/shared/experimental/tasks/store.py create mode 100644 venv/lib/python3.11/site-packages/mcp/shared/memory.py create mode 100644 venv/lib/python3.11/site-packages/mcp/shared/message.py create mode 100644 venv/lib/python3.11/site-packages/mcp/shared/metadata_utils.py create mode 100644 venv/lib/python3.11/site-packages/mcp/shared/progress.py create mode 100644 venv/lib/python3.11/site-packages/mcp/shared/response_router.py create mode 100644 venv/lib/python3.11/site-packages/mcp/shared/session.py create mode 100644 venv/lib/python3.11/site-packages/mcp/shared/tool_name_validation.py create mode 100644 venv/lib/python3.11/site-packages/mcp/shared/version.py create mode 100644 venv/lib/python3.11/site-packages/mcp/types.py create mode 100644 venv/lib/python3.11/site-packages/multipart/__init__.py create mode 100644 venv/lib/python3.11/site-packages/multipart/__pycache__/__init__.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/multipart/__pycache__/decoders.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/multipart/__pycache__/exceptions.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/multipart/__pycache__/multipart.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/multipart/decoders.py create mode 100644 venv/lib/python3.11/site-packages/multipart/exceptions.py create mode 100644 venv/lib/python3.11/site-packages/multipart/multipart.py create mode 100644 venv/lib/python3.11/site-packages/pip-23.0.1.dist-info/INSTALLER create mode 100644 venv/lib/python3.11/site-packages/pip-23.0.1.dist-info/LICENSE.txt create mode 100644 venv/lib/python3.11/site-packages/pip-23.0.1.dist-info/METADATA create mode 100644 venv/lib/python3.11/site-packages/pip-23.0.1.dist-info/RECORD create mode 100644 venv/lib/python3.11/site-packages/pip-23.0.1.dist-info/REQUESTED create mode 100644 venv/lib/python3.11/site-packages/pip-23.0.1.dist-info/WHEEL create mode 100644 venv/lib/python3.11/site-packages/pip-23.0.1.dist-info/entry_points.txt create mode 100644 venv/lib/python3.11/site-packages/pip-23.0.1.dist-info/top_level.txt create mode 100644 venv/lib/python3.11/site-packages/pip/__init__.py create mode 100644 venv/lib/python3.11/site-packages/pip/__main__.py create mode 100644 venv/lib/python3.11/site-packages/pip/__pip-runner__.py create mode 100644 venv/lib/python3.11/site-packages/pip/__pycache__/__init__.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pip/__pycache__/__main__.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pip/__pycache__/__pip-runner__.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pip/_internal/__init__.py create mode 100644 venv/lib/python3.11/site-packages/pip/_internal/__pycache__/__init__.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pip/_internal/__pycache__/build_env.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pip/_internal/__pycache__/cache.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pip/_internal/__pycache__/configuration.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pip/_internal/__pycache__/exceptions.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pip/_internal/__pycache__/main.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pip/_internal/__pycache__/pyproject.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pip/_internal/__pycache__/self_outdated_check.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pip/_internal/__pycache__/wheel_builder.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pip/_internal/build_env.py create mode 100644 venv/lib/python3.11/site-packages/pip/_internal/cache.py create mode 100644 venv/lib/python3.11/site-packages/pip/_internal/cli/__init__.py create mode 100644 venv/lib/python3.11/site-packages/pip/_internal/cli/__pycache__/__init__.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pip/_internal/cli/__pycache__/autocompletion.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pip/_internal/cli/__pycache__/base_command.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pip/_internal/cli/__pycache__/cmdoptions.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pip/_internal/cli/__pycache__/command_context.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pip/_internal/cli/__pycache__/main.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pip/_internal/cli/__pycache__/main_parser.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pip/_internal/cli/__pycache__/parser.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pip/_internal/cli/__pycache__/progress_bars.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pip/_internal/cli/__pycache__/req_command.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pip/_internal/cli/__pycache__/spinners.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pip/_internal/cli/__pycache__/status_codes.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pip/_internal/cli/autocompletion.py create mode 100644 venv/lib/python3.11/site-packages/pip/_internal/cli/base_command.py create mode 100644 venv/lib/python3.11/site-packages/pip/_internal/cli/cmdoptions.py create mode 100644 venv/lib/python3.11/site-packages/pip/_internal/cli/command_context.py create mode 100644 venv/lib/python3.11/site-packages/pip/_internal/cli/main.py create mode 100644 venv/lib/python3.11/site-packages/pip/_internal/cli/main_parser.py create mode 100644 venv/lib/python3.11/site-packages/pip/_internal/cli/parser.py create mode 100644 venv/lib/python3.11/site-packages/pip/_internal/cli/progress_bars.py create mode 100644 venv/lib/python3.11/site-packages/pip/_internal/cli/req_command.py create mode 100644 venv/lib/python3.11/site-packages/pip/_internal/cli/spinners.py create mode 100644 venv/lib/python3.11/site-packages/pip/_internal/cli/status_codes.py create mode 100644 venv/lib/python3.11/site-packages/pip/_internal/commands/__init__.py create mode 100644 venv/lib/python3.11/site-packages/pip/_internal/commands/__pycache__/__init__.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pip/_internal/commands/__pycache__/cache.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pip/_internal/commands/__pycache__/check.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pip/_internal/commands/__pycache__/completion.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pip/_internal/commands/__pycache__/configuration.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pip/_internal/commands/__pycache__/debug.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pip/_internal/commands/__pycache__/download.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pip/_internal/commands/__pycache__/freeze.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pip/_internal/commands/__pycache__/hash.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pip/_internal/commands/__pycache__/help.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pip/_internal/commands/__pycache__/index.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pip/_internal/commands/__pycache__/inspect.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pip/_internal/commands/__pycache__/install.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pip/_internal/commands/__pycache__/list.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pip/_internal/commands/__pycache__/search.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pip/_internal/commands/__pycache__/show.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pip/_internal/commands/__pycache__/uninstall.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pip/_internal/commands/__pycache__/wheel.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pip/_internal/commands/cache.py create mode 100644 venv/lib/python3.11/site-packages/pip/_internal/commands/check.py create mode 100644 venv/lib/python3.11/site-packages/pip/_internal/commands/completion.py create mode 100644 venv/lib/python3.11/site-packages/pip/_internal/commands/configuration.py create mode 100644 venv/lib/python3.11/site-packages/pip/_internal/commands/debug.py create mode 100644 venv/lib/python3.11/site-packages/pip/_internal/commands/download.py create mode 100644 venv/lib/python3.11/site-packages/pip/_internal/commands/freeze.py create mode 100644 venv/lib/python3.11/site-packages/pip/_internal/commands/hash.py create mode 100644 venv/lib/python3.11/site-packages/pip/_internal/commands/help.py create mode 100644 venv/lib/python3.11/site-packages/pip/_internal/commands/index.py create mode 100644 venv/lib/python3.11/site-packages/pip/_internal/commands/inspect.py create mode 100644 venv/lib/python3.11/site-packages/pip/_internal/commands/install.py create mode 100644 venv/lib/python3.11/site-packages/pip/_internal/commands/list.py create mode 100644 venv/lib/python3.11/site-packages/pip/_internal/commands/search.py create mode 100644 venv/lib/python3.11/site-packages/pip/_internal/commands/show.py create mode 100644 venv/lib/python3.11/site-packages/pip/_internal/commands/uninstall.py create mode 100644 venv/lib/python3.11/site-packages/pip/_internal/commands/wheel.py create mode 100644 venv/lib/python3.11/site-packages/pip/_internal/configuration.py create mode 100644 venv/lib/python3.11/site-packages/pip/_internal/distributions/__init__.py create mode 100644 venv/lib/python3.11/site-packages/pip/_internal/distributions/__pycache__/__init__.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pip/_internal/distributions/__pycache__/base.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pip/_internal/distributions/__pycache__/installed.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pip/_internal/distributions/__pycache__/sdist.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pip/_internal/distributions/__pycache__/wheel.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pip/_internal/distributions/base.py create mode 100644 venv/lib/python3.11/site-packages/pip/_internal/distributions/installed.py create mode 100644 venv/lib/python3.11/site-packages/pip/_internal/distributions/sdist.py create mode 100644 venv/lib/python3.11/site-packages/pip/_internal/distributions/wheel.py create mode 100644 venv/lib/python3.11/site-packages/pip/_internal/exceptions.py create mode 100644 venv/lib/python3.11/site-packages/pip/_internal/index/__init__.py create mode 100644 venv/lib/python3.11/site-packages/pip/_internal/index/__pycache__/__init__.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pip/_internal/index/__pycache__/collector.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pip/_internal/index/__pycache__/package_finder.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pip/_internal/index/__pycache__/sources.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pip/_internal/index/collector.py create mode 100644 venv/lib/python3.11/site-packages/pip/_internal/index/package_finder.py create mode 100644 venv/lib/python3.11/site-packages/pip/_internal/index/sources.py create mode 100644 venv/lib/python3.11/site-packages/pip/_internal/locations/__init__.py create mode 100644 venv/lib/python3.11/site-packages/pip/_internal/locations/__pycache__/__init__.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pip/_internal/locations/__pycache__/_distutils.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pip/_internal/locations/__pycache__/_sysconfig.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pip/_internal/locations/__pycache__/base.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pip/_internal/locations/_distutils.py create mode 100644 venv/lib/python3.11/site-packages/pip/_internal/locations/_sysconfig.py create mode 100644 venv/lib/python3.11/site-packages/pip/_internal/locations/base.py create mode 100644 venv/lib/python3.11/site-packages/pip/_internal/main.py create mode 100644 venv/lib/python3.11/site-packages/pip/_internal/metadata/__init__.py create mode 100644 venv/lib/python3.11/site-packages/pip/_internal/metadata/__pycache__/__init__.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pip/_internal/metadata/__pycache__/_json.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pip/_internal/metadata/__pycache__/base.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pip/_internal/metadata/__pycache__/pkg_resources.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pip/_internal/metadata/_json.py create mode 100644 venv/lib/python3.11/site-packages/pip/_internal/metadata/base.py create mode 100644 venv/lib/python3.11/site-packages/pip/_internal/metadata/importlib/__init__.py create mode 100644 venv/lib/python3.11/site-packages/pip/_internal/metadata/importlib/__pycache__/__init__.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pip/_internal/metadata/importlib/__pycache__/_compat.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pip/_internal/metadata/importlib/__pycache__/_dists.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pip/_internal/metadata/importlib/__pycache__/_envs.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pip/_internal/metadata/importlib/_compat.py create mode 100644 venv/lib/python3.11/site-packages/pip/_internal/metadata/importlib/_dists.py create mode 100644 venv/lib/python3.11/site-packages/pip/_internal/metadata/importlib/_envs.py create mode 100644 venv/lib/python3.11/site-packages/pip/_internal/metadata/pkg_resources.py create mode 100644 venv/lib/python3.11/site-packages/pip/_internal/models/__init__.py create mode 100644 venv/lib/python3.11/site-packages/pip/_internal/models/__pycache__/__init__.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pip/_internal/models/__pycache__/candidate.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pip/_internal/models/__pycache__/direct_url.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pip/_internal/models/__pycache__/format_control.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pip/_internal/models/__pycache__/index.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pip/_internal/models/__pycache__/installation_report.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pip/_internal/models/__pycache__/link.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pip/_internal/models/__pycache__/scheme.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pip/_internal/models/__pycache__/search_scope.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pip/_internal/models/__pycache__/selection_prefs.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pip/_internal/models/__pycache__/target_python.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pip/_internal/models/__pycache__/wheel.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pip/_internal/models/candidate.py create mode 100644 venv/lib/python3.11/site-packages/pip/_internal/models/direct_url.py create mode 100644 venv/lib/python3.11/site-packages/pip/_internal/models/format_control.py create mode 100644 venv/lib/python3.11/site-packages/pip/_internal/models/index.py create mode 100644 venv/lib/python3.11/site-packages/pip/_internal/models/installation_report.py create mode 100644 venv/lib/python3.11/site-packages/pip/_internal/models/link.py create mode 100644 venv/lib/python3.11/site-packages/pip/_internal/models/scheme.py create mode 100644 venv/lib/python3.11/site-packages/pip/_internal/models/search_scope.py create mode 100644 venv/lib/python3.11/site-packages/pip/_internal/models/selection_prefs.py create mode 100644 venv/lib/python3.11/site-packages/pip/_internal/models/target_python.py create mode 100644 venv/lib/python3.11/site-packages/pip/_internal/models/wheel.py create mode 100644 venv/lib/python3.11/site-packages/pip/_internal/network/__init__.py create mode 100644 venv/lib/python3.11/site-packages/pip/_internal/network/__pycache__/__init__.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pip/_internal/network/__pycache__/auth.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pip/_internal/network/__pycache__/cache.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pip/_internal/network/__pycache__/download.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pip/_internal/network/__pycache__/lazy_wheel.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pip/_internal/network/__pycache__/session.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pip/_internal/network/__pycache__/utils.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pip/_internal/network/__pycache__/xmlrpc.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pip/_internal/network/auth.py create mode 100644 venv/lib/python3.11/site-packages/pip/_internal/network/cache.py create mode 100644 venv/lib/python3.11/site-packages/pip/_internal/network/download.py create mode 100644 venv/lib/python3.11/site-packages/pip/_internal/network/lazy_wheel.py create mode 100644 venv/lib/python3.11/site-packages/pip/_internal/network/session.py create mode 100644 venv/lib/python3.11/site-packages/pip/_internal/network/utils.py create mode 100644 venv/lib/python3.11/site-packages/pip/_internal/network/xmlrpc.py create mode 100644 venv/lib/python3.11/site-packages/pip/_internal/operations/__init__.py create mode 100644 venv/lib/python3.11/site-packages/pip/_internal/operations/__pycache__/__init__.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pip/_internal/operations/__pycache__/check.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pip/_internal/operations/__pycache__/freeze.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pip/_internal/operations/__pycache__/prepare.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pip/_internal/operations/build/__init__.py create mode 100644 venv/lib/python3.11/site-packages/pip/_internal/operations/build/__pycache__/__init__.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pip/_internal/operations/build/__pycache__/build_tracker.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pip/_internal/operations/build/__pycache__/metadata.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pip/_internal/operations/build/__pycache__/metadata_editable.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pip/_internal/operations/build/__pycache__/metadata_legacy.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pip/_internal/operations/build/__pycache__/wheel.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pip/_internal/operations/build/__pycache__/wheel_editable.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pip/_internal/operations/build/__pycache__/wheel_legacy.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pip/_internal/operations/build/build_tracker.py create mode 100644 venv/lib/python3.11/site-packages/pip/_internal/operations/build/metadata.py create mode 100644 venv/lib/python3.11/site-packages/pip/_internal/operations/build/metadata_editable.py create mode 100644 venv/lib/python3.11/site-packages/pip/_internal/operations/build/metadata_legacy.py create mode 100644 venv/lib/python3.11/site-packages/pip/_internal/operations/build/wheel.py create mode 100644 venv/lib/python3.11/site-packages/pip/_internal/operations/build/wheel_editable.py create mode 100644 venv/lib/python3.11/site-packages/pip/_internal/operations/build/wheel_legacy.py create mode 100644 venv/lib/python3.11/site-packages/pip/_internal/operations/check.py create mode 100644 venv/lib/python3.11/site-packages/pip/_internal/operations/freeze.py create mode 100644 venv/lib/python3.11/site-packages/pip/_internal/operations/install/__init__.py create mode 100644 venv/lib/python3.11/site-packages/pip/_internal/operations/install/__pycache__/__init__.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pip/_internal/operations/install/__pycache__/editable_legacy.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pip/_internal/operations/install/__pycache__/legacy.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pip/_internal/operations/install/__pycache__/wheel.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pip/_internal/operations/install/editable_legacy.py create mode 100644 venv/lib/python3.11/site-packages/pip/_internal/operations/install/legacy.py create mode 100644 venv/lib/python3.11/site-packages/pip/_internal/operations/install/wheel.py create mode 100644 venv/lib/python3.11/site-packages/pip/_internal/operations/prepare.py create mode 100644 venv/lib/python3.11/site-packages/pip/_internal/pyproject.py create mode 100644 venv/lib/python3.11/site-packages/pip/_internal/req/__init__.py create mode 100644 venv/lib/python3.11/site-packages/pip/_internal/req/__pycache__/__init__.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pip/_internal/req/__pycache__/constructors.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pip/_internal/req/__pycache__/req_file.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pip/_internal/req/__pycache__/req_install.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pip/_internal/req/__pycache__/req_set.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pip/_internal/req/__pycache__/req_uninstall.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pip/_internal/req/constructors.py create mode 100644 venv/lib/python3.11/site-packages/pip/_internal/req/req_file.py create mode 100644 venv/lib/python3.11/site-packages/pip/_internal/req/req_install.py create mode 100644 venv/lib/python3.11/site-packages/pip/_internal/req/req_set.py create mode 100644 venv/lib/python3.11/site-packages/pip/_internal/req/req_uninstall.py create mode 100644 venv/lib/python3.11/site-packages/pip/_internal/resolution/__init__.py create mode 100644 venv/lib/python3.11/site-packages/pip/_internal/resolution/__pycache__/__init__.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pip/_internal/resolution/__pycache__/base.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pip/_internal/resolution/base.py create mode 100644 venv/lib/python3.11/site-packages/pip/_internal/resolution/legacy/__init__.py create mode 100644 venv/lib/python3.11/site-packages/pip/_internal/resolution/legacy/__pycache__/__init__.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pip/_internal/resolution/legacy/__pycache__/resolver.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pip/_internal/resolution/legacy/resolver.py create mode 100644 venv/lib/python3.11/site-packages/pip/_internal/resolution/resolvelib/__init__.py create mode 100644 venv/lib/python3.11/site-packages/pip/_internal/resolution/resolvelib/__pycache__/__init__.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pip/_internal/resolution/resolvelib/__pycache__/base.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pip/_internal/resolution/resolvelib/__pycache__/candidates.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pip/_internal/resolution/resolvelib/__pycache__/factory.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pip/_internal/resolution/resolvelib/__pycache__/found_candidates.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pip/_internal/resolution/resolvelib/__pycache__/provider.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pip/_internal/resolution/resolvelib/__pycache__/reporter.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pip/_internal/resolution/resolvelib/__pycache__/requirements.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pip/_internal/resolution/resolvelib/__pycache__/resolver.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pip/_internal/resolution/resolvelib/base.py create mode 100644 venv/lib/python3.11/site-packages/pip/_internal/resolution/resolvelib/candidates.py create mode 100644 venv/lib/python3.11/site-packages/pip/_internal/resolution/resolvelib/factory.py create mode 100644 venv/lib/python3.11/site-packages/pip/_internal/resolution/resolvelib/found_candidates.py create mode 100644 venv/lib/python3.11/site-packages/pip/_internal/resolution/resolvelib/provider.py create mode 100644 venv/lib/python3.11/site-packages/pip/_internal/resolution/resolvelib/reporter.py create mode 100644 venv/lib/python3.11/site-packages/pip/_internal/resolution/resolvelib/requirements.py create mode 100644 venv/lib/python3.11/site-packages/pip/_internal/resolution/resolvelib/resolver.py create mode 100644 venv/lib/python3.11/site-packages/pip/_internal/self_outdated_check.py create mode 100644 venv/lib/python3.11/site-packages/pip/_internal/utils/__init__.py create mode 100644 venv/lib/python3.11/site-packages/pip/_internal/utils/__pycache__/__init__.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pip/_internal/utils/__pycache__/_log.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pip/_internal/utils/__pycache__/appdirs.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pip/_internal/utils/__pycache__/compat.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pip/_internal/utils/__pycache__/compatibility_tags.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pip/_internal/utils/__pycache__/datetime.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pip/_internal/utils/__pycache__/deprecation.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pip/_internal/utils/__pycache__/direct_url_helpers.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pip/_internal/utils/__pycache__/distutils_args.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pip/_internal/utils/__pycache__/egg_link.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pip/_internal/utils/__pycache__/encoding.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pip/_internal/utils/__pycache__/entrypoints.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pip/_internal/utils/__pycache__/filesystem.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pip/_internal/utils/__pycache__/filetypes.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pip/_internal/utils/__pycache__/glibc.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pip/_internal/utils/__pycache__/hashes.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pip/_internal/utils/__pycache__/inject_securetransport.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pip/_internal/utils/__pycache__/logging.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pip/_internal/utils/__pycache__/misc.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pip/_internal/utils/__pycache__/models.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pip/_internal/utils/__pycache__/packaging.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pip/_internal/utils/__pycache__/setuptools_build.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pip/_internal/utils/__pycache__/subprocess.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pip/_internal/utils/__pycache__/temp_dir.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pip/_internal/utils/__pycache__/unpacking.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pip/_internal/utils/__pycache__/urls.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pip/_internal/utils/__pycache__/virtualenv.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pip/_internal/utils/__pycache__/wheel.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pip/_internal/utils/_log.py create mode 100644 venv/lib/python3.11/site-packages/pip/_internal/utils/appdirs.py create mode 100644 venv/lib/python3.11/site-packages/pip/_internal/utils/compat.py create mode 100644 venv/lib/python3.11/site-packages/pip/_internal/utils/compatibility_tags.py create mode 100644 venv/lib/python3.11/site-packages/pip/_internal/utils/datetime.py create mode 100644 venv/lib/python3.11/site-packages/pip/_internal/utils/deprecation.py create mode 100644 venv/lib/python3.11/site-packages/pip/_internal/utils/direct_url_helpers.py create mode 100644 venv/lib/python3.11/site-packages/pip/_internal/utils/distutils_args.py create mode 100644 venv/lib/python3.11/site-packages/pip/_internal/utils/egg_link.py create mode 100644 venv/lib/python3.11/site-packages/pip/_internal/utils/encoding.py create mode 100644 venv/lib/python3.11/site-packages/pip/_internal/utils/entrypoints.py create mode 100644 venv/lib/python3.11/site-packages/pip/_internal/utils/filesystem.py create mode 100644 venv/lib/python3.11/site-packages/pip/_internal/utils/filetypes.py create mode 100644 venv/lib/python3.11/site-packages/pip/_internal/utils/glibc.py create mode 100644 venv/lib/python3.11/site-packages/pip/_internal/utils/hashes.py create mode 100644 venv/lib/python3.11/site-packages/pip/_internal/utils/inject_securetransport.py create mode 100644 venv/lib/python3.11/site-packages/pip/_internal/utils/logging.py create mode 100644 venv/lib/python3.11/site-packages/pip/_internal/utils/misc.py create mode 100644 venv/lib/python3.11/site-packages/pip/_internal/utils/models.py create mode 100644 venv/lib/python3.11/site-packages/pip/_internal/utils/packaging.py create mode 100644 venv/lib/python3.11/site-packages/pip/_internal/utils/setuptools_build.py create mode 100644 venv/lib/python3.11/site-packages/pip/_internal/utils/subprocess.py create mode 100644 venv/lib/python3.11/site-packages/pip/_internal/utils/temp_dir.py create mode 100644 venv/lib/python3.11/site-packages/pip/_internal/utils/unpacking.py create mode 100644 venv/lib/python3.11/site-packages/pip/_internal/utils/urls.py create mode 100644 venv/lib/python3.11/site-packages/pip/_internal/utils/virtualenv.py create mode 100644 venv/lib/python3.11/site-packages/pip/_internal/utils/wheel.py create mode 100644 venv/lib/python3.11/site-packages/pip/_internal/vcs/__init__.py create mode 100644 venv/lib/python3.11/site-packages/pip/_internal/vcs/__pycache__/__init__.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pip/_internal/vcs/__pycache__/bazaar.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pip/_internal/vcs/__pycache__/git.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pip/_internal/vcs/__pycache__/mercurial.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pip/_internal/vcs/__pycache__/subversion.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pip/_internal/vcs/__pycache__/versioncontrol.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pip/_internal/vcs/bazaar.py create mode 100644 venv/lib/python3.11/site-packages/pip/_internal/vcs/git.py create mode 100644 venv/lib/python3.11/site-packages/pip/_internal/vcs/mercurial.py create mode 100644 venv/lib/python3.11/site-packages/pip/_internal/vcs/subversion.py create mode 100644 venv/lib/python3.11/site-packages/pip/_internal/vcs/versioncontrol.py create mode 100644 venv/lib/python3.11/site-packages/pip/_internal/wheel_builder.py create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/__init__.py create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/__pycache__/__init__.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/__pycache__/six.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/__pycache__/typing_extensions.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/cachecontrol/__init__.py create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/cachecontrol/__pycache__/__init__.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/cachecontrol/__pycache__/_cmd.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/cachecontrol/__pycache__/adapter.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/cachecontrol/__pycache__/cache.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/cachecontrol/__pycache__/compat.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/cachecontrol/__pycache__/controller.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/cachecontrol/__pycache__/filewrapper.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/cachecontrol/__pycache__/heuristics.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/cachecontrol/__pycache__/serialize.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/cachecontrol/__pycache__/wrapper.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/cachecontrol/_cmd.py create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/cachecontrol/adapter.py create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/cachecontrol/cache.py create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/cachecontrol/caches/__init__.py create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/cachecontrol/caches/__pycache__/__init__.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/cachecontrol/caches/__pycache__/file_cache.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/cachecontrol/caches/__pycache__/redis_cache.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/cachecontrol/caches/file_cache.py create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/cachecontrol/caches/redis_cache.py create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/cachecontrol/compat.py create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/cachecontrol/controller.py create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/cachecontrol/filewrapper.py create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/cachecontrol/heuristics.py create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/cachecontrol/serialize.py create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/cachecontrol/wrapper.py create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/certifi/__init__.py create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/certifi/__main__.py create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/certifi/__pycache__/__init__.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/certifi/__pycache__/__main__.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/certifi/__pycache__/core.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/certifi/cacert.pem create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/certifi/core.py create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/chardet/__init__.py create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/chardet/__pycache__/__init__.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/chardet/__pycache__/big5freq.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/chardet/__pycache__/big5prober.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/chardet/__pycache__/chardistribution.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/chardet/__pycache__/charsetgroupprober.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/chardet/__pycache__/charsetprober.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/chardet/__pycache__/codingstatemachine.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/chardet/__pycache__/codingstatemachinedict.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/chardet/__pycache__/cp949prober.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/chardet/__pycache__/enums.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/chardet/__pycache__/escprober.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/chardet/__pycache__/escsm.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/chardet/__pycache__/eucjpprober.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/chardet/__pycache__/euckrfreq.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/chardet/__pycache__/euckrprober.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/chardet/__pycache__/euctwfreq.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/chardet/__pycache__/euctwprober.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/chardet/__pycache__/gb2312freq.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/chardet/__pycache__/gb2312prober.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/chardet/__pycache__/hebrewprober.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/chardet/__pycache__/jisfreq.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/chardet/__pycache__/johabfreq.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/chardet/__pycache__/johabprober.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/chardet/__pycache__/jpcntx.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/chardet/__pycache__/langbulgarianmodel.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/chardet/__pycache__/langgreekmodel.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/chardet/__pycache__/langhebrewmodel.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/chardet/__pycache__/langhungarianmodel.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/chardet/__pycache__/langrussianmodel.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/chardet/__pycache__/langthaimodel.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/chardet/__pycache__/langturkishmodel.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/chardet/__pycache__/latin1prober.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/chardet/__pycache__/macromanprober.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/chardet/__pycache__/mbcharsetprober.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/chardet/__pycache__/mbcsgroupprober.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/chardet/__pycache__/mbcssm.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/chardet/__pycache__/resultdict.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/chardet/__pycache__/sbcharsetprober.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/chardet/__pycache__/sbcsgroupprober.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/chardet/__pycache__/sjisprober.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/chardet/__pycache__/universaldetector.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/chardet/__pycache__/utf1632prober.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/chardet/__pycache__/utf8prober.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/chardet/__pycache__/version.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/chardet/big5freq.py create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/chardet/big5prober.py create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/chardet/chardistribution.py create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/chardet/charsetgroupprober.py create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/chardet/charsetprober.py create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/chardet/cli/__init__.py create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/chardet/cli/__pycache__/__init__.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/chardet/cli/__pycache__/chardetect.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/chardet/cli/chardetect.py create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/chardet/codingstatemachine.py create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/chardet/codingstatemachinedict.py create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/chardet/cp949prober.py create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/chardet/enums.py create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/chardet/escprober.py create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/chardet/escsm.py create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/chardet/eucjpprober.py create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/chardet/euckrfreq.py create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/chardet/euckrprober.py create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/chardet/euctwfreq.py create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/chardet/euctwprober.py create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/chardet/gb2312freq.py create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/chardet/gb2312prober.py create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/chardet/hebrewprober.py create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/chardet/jisfreq.py create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/chardet/johabfreq.py create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/chardet/johabprober.py create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/chardet/jpcntx.py create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/chardet/langbulgarianmodel.py create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/chardet/langgreekmodel.py create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/chardet/langhebrewmodel.py create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/chardet/langhungarianmodel.py create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/chardet/langrussianmodel.py create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/chardet/langthaimodel.py create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/chardet/langturkishmodel.py create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/chardet/latin1prober.py create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/chardet/macromanprober.py create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/chardet/mbcharsetprober.py create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/chardet/mbcsgroupprober.py create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/chardet/mbcssm.py create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/chardet/metadata/__init__.py create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/chardet/metadata/__pycache__/__init__.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/chardet/metadata/__pycache__/languages.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/chardet/metadata/languages.py create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/chardet/resultdict.py create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/chardet/sbcharsetprober.py create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/chardet/sbcsgroupprober.py create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/chardet/sjisprober.py create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/chardet/universaldetector.py create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/chardet/utf1632prober.py create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/chardet/utf8prober.py create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/chardet/version.py create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/colorama/__init__.py create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/colorama/__pycache__/__init__.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/colorama/__pycache__/ansi.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/colorama/__pycache__/ansitowin32.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/colorama/__pycache__/initialise.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/colorama/__pycache__/win32.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/colorama/__pycache__/winterm.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/colorama/ansi.py create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/colorama/ansitowin32.py create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/colorama/initialise.py create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/colorama/tests/__init__.py create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/colorama/tests/__pycache__/__init__.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/colorama/tests/__pycache__/ansi_test.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/colorama/tests/__pycache__/ansitowin32_test.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/colorama/tests/__pycache__/initialise_test.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/colorama/tests/__pycache__/isatty_test.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/colorama/tests/__pycache__/utils.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/colorama/tests/__pycache__/winterm_test.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/colorama/tests/ansi_test.py create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/colorama/tests/ansitowin32_test.py create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/colorama/tests/initialise_test.py create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/colorama/tests/isatty_test.py create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/colorama/tests/utils.py create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/colorama/tests/winterm_test.py create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/colorama/win32.py create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/colorama/winterm.py create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/distlib/__init__.py create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/distlib/__pycache__/__init__.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/distlib/__pycache__/compat.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/distlib/__pycache__/database.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/distlib/__pycache__/index.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/distlib/__pycache__/locators.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/distlib/__pycache__/manifest.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/distlib/__pycache__/markers.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/distlib/__pycache__/metadata.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/distlib/__pycache__/resources.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/distlib/__pycache__/scripts.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/distlib/__pycache__/util.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/distlib/__pycache__/version.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/distlib/__pycache__/wheel.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/distlib/compat.py create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/distlib/database.py create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/distlib/index.py create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/distlib/locators.py create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/distlib/manifest.py create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/distlib/markers.py create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/distlib/metadata.py create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/distlib/resources.py create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/distlib/scripts.py create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/distlib/util.py create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/distlib/version.py create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/distlib/wheel.py create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/distro/__init__.py create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/distro/__main__.py create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/distro/__pycache__/__init__.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/distro/__pycache__/__main__.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/distro/__pycache__/distro.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/distro/distro.py create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/idna/__init__.py create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/idna/__pycache__/__init__.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/idna/__pycache__/codec.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/idna/__pycache__/compat.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/idna/__pycache__/core.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/idna/__pycache__/idnadata.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/idna/__pycache__/intranges.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/idna/__pycache__/package_data.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/idna/__pycache__/uts46data.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/idna/codec.py create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/idna/compat.py create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/idna/core.py create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/idna/idnadata.py create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/idna/intranges.py create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/idna/package_data.py create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/idna/uts46data.py create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/msgpack/__init__.py create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/msgpack/__pycache__/__init__.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/msgpack/__pycache__/exceptions.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/msgpack/__pycache__/ext.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/msgpack/__pycache__/fallback.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/msgpack/exceptions.py create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/msgpack/ext.py create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/msgpack/fallback.py create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/packaging/__about__.py create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/packaging/__init__.py create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/packaging/__pycache__/__about__.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/packaging/__pycache__/__init__.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/packaging/__pycache__/_manylinux.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/packaging/__pycache__/_musllinux.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/packaging/__pycache__/_structures.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/packaging/__pycache__/markers.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/packaging/__pycache__/requirements.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/packaging/__pycache__/specifiers.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/packaging/__pycache__/tags.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/packaging/__pycache__/utils.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/packaging/__pycache__/version.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/packaging/_manylinux.py create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/packaging/_musllinux.py create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/packaging/_structures.py create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/packaging/markers.py create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/packaging/requirements.py create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/packaging/specifiers.py create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/packaging/tags.py create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/packaging/utils.py create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/packaging/version.py create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/pkg_resources/__init__.py create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/pkg_resources/__pycache__/__init__.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/pkg_resources/__pycache__/py31compat.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/pkg_resources/py31compat.py create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/platformdirs/__init__.py create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/platformdirs/__main__.py create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/platformdirs/__pycache__/__init__.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/platformdirs/__pycache__/__main__.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/platformdirs/__pycache__/android.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/platformdirs/__pycache__/api.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/platformdirs/__pycache__/macos.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/platformdirs/__pycache__/unix.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/platformdirs/__pycache__/version.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/platformdirs/__pycache__/windows.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/platformdirs/android.py create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/platformdirs/api.py create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/platformdirs/macos.py create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/platformdirs/unix.py create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/platformdirs/version.py create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/platformdirs/windows.py create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/pygments/__init__.py create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/pygments/__main__.py create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/pygments/__pycache__/__init__.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/pygments/__pycache__/__main__.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/pygments/__pycache__/cmdline.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/pygments/__pycache__/console.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/pygments/__pycache__/filter.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/pygments/__pycache__/formatter.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/pygments/__pycache__/lexer.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/pygments/__pycache__/modeline.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/pygments/__pycache__/plugin.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/pygments/__pycache__/regexopt.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/pygments/__pycache__/scanner.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/pygments/__pycache__/sphinxext.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/pygments/__pycache__/style.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/pygments/__pycache__/token.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/pygments/__pycache__/unistring.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/pygments/__pycache__/util.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/pygments/cmdline.py create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/pygments/console.py create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/pygments/filter.py create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/pygments/filters/__init__.py create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/pygments/filters/__pycache__/__init__.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/pygments/formatter.py create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/pygments/formatters/__init__.py create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/pygments/formatters/__pycache__/__init__.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/pygments/formatters/__pycache__/_mapping.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/pygments/formatters/__pycache__/bbcode.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/pygments/formatters/__pycache__/groff.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/pygments/formatters/__pycache__/html.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/pygments/formatters/__pycache__/img.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/pygments/formatters/__pycache__/irc.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/pygments/formatters/__pycache__/latex.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/pygments/formatters/__pycache__/other.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/pygments/formatters/__pycache__/pangomarkup.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/pygments/formatters/__pycache__/rtf.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/pygments/formatters/__pycache__/svg.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/pygments/formatters/__pycache__/terminal.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/pygments/formatters/__pycache__/terminal256.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/pygments/formatters/_mapping.py create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/pygments/formatters/bbcode.py create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/pygments/formatters/groff.py create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/pygments/formatters/html.py create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/pygments/formatters/img.py create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/pygments/formatters/irc.py create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/pygments/formatters/latex.py create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/pygments/formatters/other.py create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/pygments/formatters/pangomarkup.py create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/pygments/formatters/rtf.py create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/pygments/formatters/svg.py create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/pygments/formatters/terminal.py create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/pygments/formatters/terminal256.py create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/pygments/lexer.py create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/pygments/lexers/__init__.py create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/pygments/lexers/__pycache__/__init__.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/pygments/lexers/__pycache__/_mapping.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/pygments/lexers/__pycache__/python.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/pygments/lexers/_mapping.py create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/pygments/lexers/python.py create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/pygments/modeline.py create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/pygments/plugin.py create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/pygments/regexopt.py create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/pygments/scanner.py create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/pygments/sphinxext.py create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/pygments/style.py create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/pygments/styles/__init__.py create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/pygments/styles/__pycache__/__init__.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/pygments/token.py create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/pygments/unistring.py create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/pygments/util.py create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/pyparsing/__init__.py create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/pyparsing/__pycache__/__init__.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/pyparsing/__pycache__/actions.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/pyparsing/__pycache__/common.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/pyparsing/__pycache__/core.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/pyparsing/__pycache__/exceptions.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/pyparsing/__pycache__/helpers.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/pyparsing/__pycache__/results.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/pyparsing/__pycache__/testing.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/pyparsing/__pycache__/unicode.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/pyparsing/__pycache__/util.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/pyparsing/actions.py create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/pyparsing/common.py create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/pyparsing/core.py create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/pyparsing/diagram/__init__.py create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/pyparsing/diagram/__pycache__/__init__.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/pyparsing/exceptions.py create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/pyparsing/helpers.py create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/pyparsing/results.py create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/pyparsing/testing.py create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/pyparsing/unicode.py create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/pyparsing/util.py create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/pyproject_hooks/__init__.py create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/pyproject_hooks/__pycache__/__init__.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/pyproject_hooks/__pycache__/_compat.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/pyproject_hooks/__pycache__/_impl.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/pyproject_hooks/_compat.py create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/pyproject_hooks/_impl.py create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/pyproject_hooks/_in_process/__init__.py create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/pyproject_hooks/_in_process/__pycache__/__init__.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/pyproject_hooks/_in_process/__pycache__/_in_process.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/pyproject_hooks/_in_process/_in_process.py create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/requests/__init__.py create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/requests/__pycache__/__init__.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/requests/__pycache__/__version__.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/requests/__pycache__/_internal_utils.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/requests/__pycache__/adapters.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/requests/__pycache__/api.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/requests/__pycache__/auth.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/requests/__pycache__/certs.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/requests/__pycache__/compat.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/requests/__pycache__/cookies.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/requests/__pycache__/exceptions.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/requests/__pycache__/help.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/requests/__pycache__/hooks.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/requests/__pycache__/models.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/requests/__pycache__/packages.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/requests/__pycache__/sessions.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/requests/__pycache__/status_codes.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/requests/__pycache__/structures.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/requests/__pycache__/utils.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/requests/__version__.py create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/requests/_internal_utils.py create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/requests/adapters.py create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/requests/api.py create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/requests/auth.py create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/requests/certs.py create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/requests/compat.py create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/requests/cookies.py create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/requests/exceptions.py create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/requests/help.py create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/requests/hooks.py create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/requests/models.py create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/requests/packages.py create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/requests/sessions.py create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/requests/status_codes.py create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/requests/structures.py create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/requests/utils.py create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/resolvelib/__init__.py create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/resolvelib/__pycache__/__init__.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/resolvelib/__pycache__/providers.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/resolvelib/__pycache__/reporters.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/resolvelib/__pycache__/resolvers.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/resolvelib/__pycache__/structs.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/resolvelib/compat/__init__.py create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/resolvelib/compat/__pycache__/__init__.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/resolvelib/compat/__pycache__/collections_abc.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/resolvelib/compat/collections_abc.py create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/resolvelib/providers.py create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/resolvelib/reporters.py create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/resolvelib/resolvers.py create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/resolvelib/structs.py create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/rich/__init__.py create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/rich/__main__.py create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/__init__.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/__main__.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/_cell_widths.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/_emoji_codes.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/_emoji_replace.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/_export_format.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/_extension.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/_inspect.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/_log_render.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/_loop.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/_null_file.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/_palettes.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/_pick.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/_ratio.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/_spinners.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/_stack.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/_timer.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/_win32_console.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/_windows.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/_windows_renderer.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/_wrap.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/abc.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/align.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/ansi.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/bar.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/box.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/cells.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/color.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/color_triplet.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/columns.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/console.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/constrain.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/containers.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/control.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/default_styles.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/diagnose.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/emoji.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/errors.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/file_proxy.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/filesize.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/highlighter.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/json.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/jupyter.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/layout.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/live.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/live_render.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/logging.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/markup.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/measure.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/padding.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/pager.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/palette.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/panel.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/pretty.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/progress.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/progress_bar.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/prompt.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/protocol.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/region.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/repr.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/rule.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/scope.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/screen.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/segment.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/spinner.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/status.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/style.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/styled.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/syntax.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/table.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/terminal_theme.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/text.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/theme.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/themes.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/traceback.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/tree.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/rich/_cell_widths.py create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/rich/_emoji_codes.py create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/rich/_emoji_replace.py create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/rich/_export_format.py create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/rich/_extension.py create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/rich/_inspect.py create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/rich/_log_render.py create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/rich/_loop.py create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/rich/_null_file.py create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/rich/_palettes.py create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/rich/_pick.py create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/rich/_ratio.py create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/rich/_spinners.py create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/rich/_stack.py create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/rich/_timer.py create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/rich/_win32_console.py create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/rich/_windows.py create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/rich/_windows_renderer.py create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/rich/_wrap.py create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/rich/abc.py create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/rich/align.py create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/rich/ansi.py create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/rich/bar.py create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/rich/box.py create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/rich/cells.py create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/rich/color.py create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/rich/color_triplet.py create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/rich/columns.py create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/rich/console.py create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/rich/constrain.py create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/rich/containers.py create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/rich/control.py create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/rich/default_styles.py create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/rich/diagnose.py create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/rich/emoji.py create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/rich/errors.py create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/rich/file_proxy.py create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/rich/filesize.py create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/rich/highlighter.py create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/rich/json.py create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/rich/jupyter.py create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/rich/layout.py create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/rich/live.py create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/rich/live_render.py create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/rich/logging.py create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/rich/markup.py create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/rich/measure.py create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/rich/padding.py create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/rich/pager.py create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/rich/palette.py create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/rich/panel.py create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/rich/pretty.py create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/rich/progress.py create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/rich/progress_bar.py create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/rich/prompt.py create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/rich/protocol.py create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/rich/region.py create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/rich/repr.py create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/rich/rule.py create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/rich/scope.py create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/rich/screen.py create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/rich/segment.py create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/rich/spinner.py create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/rich/status.py create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/rich/style.py create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/rich/styled.py create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/rich/syntax.py create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/rich/table.py create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/rich/terminal_theme.py create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/rich/text.py create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/rich/theme.py create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/rich/themes.py create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/rich/traceback.py create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/rich/tree.py create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/six.py create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/tenacity/__init__.py create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/tenacity/__pycache__/__init__.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/tenacity/__pycache__/_asyncio.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/tenacity/__pycache__/_utils.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/tenacity/__pycache__/after.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/tenacity/__pycache__/before.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/tenacity/__pycache__/before_sleep.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/tenacity/__pycache__/nap.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/tenacity/__pycache__/retry.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/tenacity/__pycache__/stop.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/tenacity/__pycache__/tornadoweb.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/tenacity/__pycache__/wait.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/tenacity/_asyncio.py create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/tenacity/_utils.py create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/tenacity/after.py create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/tenacity/before.py create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/tenacity/before_sleep.py create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/tenacity/nap.py create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/tenacity/retry.py create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/tenacity/stop.py create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/tenacity/tornadoweb.py create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/tenacity/wait.py create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/tomli/__init__.py create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/tomli/__pycache__/__init__.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/tomli/__pycache__/_parser.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/tomli/__pycache__/_re.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/tomli/__pycache__/_types.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/tomli/_parser.py create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/tomli/_re.py create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/tomli/_types.py create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/typing_extensions.py create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/urllib3/__init__.py create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/urllib3/__pycache__/__init__.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/urllib3/__pycache__/_collections.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/urllib3/__pycache__/_version.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/urllib3/__pycache__/connection.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/urllib3/__pycache__/connectionpool.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/urllib3/__pycache__/exceptions.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/urllib3/__pycache__/fields.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/urllib3/__pycache__/filepost.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/urllib3/__pycache__/poolmanager.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/urllib3/__pycache__/request.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/urllib3/__pycache__/response.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/urllib3/_collections.py create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/urllib3/_version.py create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/urllib3/connection.py create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/urllib3/connectionpool.py create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/urllib3/contrib/__init__.py create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/urllib3/contrib/__pycache__/__init__.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/urllib3/contrib/__pycache__/_appengine_environ.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/urllib3/contrib/__pycache__/appengine.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/urllib3/contrib/__pycache__/ntlmpool.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/urllib3/contrib/__pycache__/pyopenssl.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/urllib3/contrib/__pycache__/securetransport.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/urllib3/contrib/__pycache__/socks.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/urllib3/contrib/_appengine_environ.py create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/urllib3/contrib/_securetransport/__init__.py create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/urllib3/contrib/_securetransport/__pycache__/__init__.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/urllib3/contrib/_securetransport/__pycache__/bindings.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/urllib3/contrib/_securetransport/__pycache__/low_level.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/urllib3/contrib/_securetransport/bindings.py create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/urllib3/contrib/_securetransport/low_level.py create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/urllib3/contrib/appengine.py create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/urllib3/contrib/ntlmpool.py create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/urllib3/contrib/pyopenssl.py create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/urllib3/contrib/securetransport.py create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/urllib3/contrib/socks.py create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/urllib3/exceptions.py create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/urllib3/fields.py create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/urllib3/filepost.py create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/urllib3/packages/__init__.py create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/urllib3/packages/__pycache__/__init__.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/urllib3/packages/__pycache__/six.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/urllib3/packages/backports/__init__.py create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/urllib3/packages/backports/__pycache__/__init__.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/urllib3/packages/backports/__pycache__/makefile.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/urllib3/packages/backports/makefile.py create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/urllib3/packages/six.py create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/urllib3/poolmanager.py create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/urllib3/request.py create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/urllib3/response.py create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/urllib3/util/__init__.py create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/urllib3/util/__pycache__/__init__.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/urllib3/util/__pycache__/connection.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/urllib3/util/__pycache__/proxy.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/urllib3/util/__pycache__/queue.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/urllib3/util/__pycache__/request.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/urllib3/util/__pycache__/response.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/urllib3/util/__pycache__/retry.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/urllib3/util/__pycache__/ssl_.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/urllib3/util/__pycache__/ssl_match_hostname.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/urllib3/util/__pycache__/ssltransport.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/urllib3/util/__pycache__/timeout.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/urllib3/util/__pycache__/url.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/urllib3/util/__pycache__/wait.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/urllib3/util/connection.py create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/urllib3/util/proxy.py create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/urllib3/util/queue.py create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/urllib3/util/request.py create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/urllib3/util/response.py create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/urllib3/util/retry.py create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/urllib3/util/ssl_.py create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/urllib3/util/ssl_match_hostname.py create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/urllib3/util/ssltransport.py create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/urllib3/util/timeout.py create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/urllib3/util/url.py create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/urllib3/util/wait.py create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/vendor.txt create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/webencodings/__init__.py create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/webencodings/__pycache__/__init__.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/webencodings/__pycache__/labels.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/webencodings/__pycache__/mklabels.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/webencodings/__pycache__/tests.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/webencodings/__pycache__/x_user_defined.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/webencodings/labels.py create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/webencodings/mklabels.py create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/webencodings/tests.py create mode 100644 venv/lib/python3.11/site-packages/pip/_vendor/webencodings/x_user_defined.py create mode 100644 venv/lib/python3.11/site-packages/pip/py.typed create mode 100644 venv/lib/python3.11/site-packages/pkg_resources/__init__.py create mode 100644 venv/lib/python3.11/site-packages/pkg_resources/__pycache__/__init__.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pkg_resources/_vendor/__init__.py create mode 100644 venv/lib/python3.11/site-packages/pkg_resources/_vendor/__pycache__/__init__.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pkg_resources/_vendor/__pycache__/typing_extensions.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pkg_resources/_vendor/__pycache__/zipp.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pkg_resources/_vendor/importlib_resources/__init__.py create mode 100644 venv/lib/python3.11/site-packages/pkg_resources/_vendor/importlib_resources/__pycache__/__init__.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pkg_resources/_vendor/importlib_resources/__pycache__/_adapters.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pkg_resources/_vendor/importlib_resources/__pycache__/_common.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pkg_resources/_vendor/importlib_resources/__pycache__/_compat.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pkg_resources/_vendor/importlib_resources/__pycache__/_itertools.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pkg_resources/_vendor/importlib_resources/__pycache__/_legacy.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pkg_resources/_vendor/importlib_resources/__pycache__/abc.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pkg_resources/_vendor/importlib_resources/__pycache__/readers.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pkg_resources/_vendor/importlib_resources/__pycache__/simple.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pkg_resources/_vendor/importlib_resources/_adapters.py create mode 100644 venv/lib/python3.11/site-packages/pkg_resources/_vendor/importlib_resources/_common.py create mode 100644 venv/lib/python3.11/site-packages/pkg_resources/_vendor/importlib_resources/_compat.py create mode 100644 venv/lib/python3.11/site-packages/pkg_resources/_vendor/importlib_resources/_itertools.py create mode 100644 venv/lib/python3.11/site-packages/pkg_resources/_vendor/importlib_resources/_legacy.py create mode 100644 venv/lib/python3.11/site-packages/pkg_resources/_vendor/importlib_resources/abc.py create mode 100644 venv/lib/python3.11/site-packages/pkg_resources/_vendor/importlib_resources/readers.py create mode 100644 venv/lib/python3.11/site-packages/pkg_resources/_vendor/importlib_resources/simple.py create mode 100644 venv/lib/python3.11/site-packages/pkg_resources/_vendor/jaraco/__init__.py create mode 100644 venv/lib/python3.11/site-packages/pkg_resources/_vendor/jaraco/__pycache__/__init__.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pkg_resources/_vendor/jaraco/__pycache__/context.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pkg_resources/_vendor/jaraco/__pycache__/functools.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pkg_resources/_vendor/jaraco/context.py create mode 100644 venv/lib/python3.11/site-packages/pkg_resources/_vendor/jaraco/functools.py create mode 100644 venv/lib/python3.11/site-packages/pkg_resources/_vendor/jaraco/text/__init__.py create mode 100644 venv/lib/python3.11/site-packages/pkg_resources/_vendor/jaraco/text/__pycache__/__init__.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pkg_resources/_vendor/more_itertools/__init__.py create mode 100644 venv/lib/python3.11/site-packages/pkg_resources/_vendor/more_itertools/__pycache__/__init__.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pkg_resources/_vendor/more_itertools/__pycache__/more.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pkg_resources/_vendor/more_itertools/__pycache__/recipes.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pkg_resources/_vendor/more_itertools/more.py create mode 100644 venv/lib/python3.11/site-packages/pkg_resources/_vendor/more_itertools/recipes.py create mode 100644 venv/lib/python3.11/site-packages/pkg_resources/_vendor/packaging/__about__.py create mode 100644 venv/lib/python3.11/site-packages/pkg_resources/_vendor/packaging/__init__.py create mode 100644 venv/lib/python3.11/site-packages/pkg_resources/_vendor/packaging/__pycache__/__about__.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pkg_resources/_vendor/packaging/__pycache__/__init__.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pkg_resources/_vendor/packaging/__pycache__/_manylinux.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pkg_resources/_vendor/packaging/__pycache__/_musllinux.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pkg_resources/_vendor/packaging/__pycache__/_structures.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pkg_resources/_vendor/packaging/__pycache__/markers.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pkg_resources/_vendor/packaging/__pycache__/requirements.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pkg_resources/_vendor/packaging/__pycache__/specifiers.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pkg_resources/_vendor/packaging/__pycache__/tags.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pkg_resources/_vendor/packaging/__pycache__/utils.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pkg_resources/_vendor/packaging/__pycache__/version.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pkg_resources/_vendor/packaging/_manylinux.py create mode 100644 venv/lib/python3.11/site-packages/pkg_resources/_vendor/packaging/_musllinux.py create mode 100644 venv/lib/python3.11/site-packages/pkg_resources/_vendor/packaging/_structures.py create mode 100644 venv/lib/python3.11/site-packages/pkg_resources/_vendor/packaging/markers.py create mode 100644 venv/lib/python3.11/site-packages/pkg_resources/_vendor/packaging/requirements.py create mode 100644 venv/lib/python3.11/site-packages/pkg_resources/_vendor/packaging/specifiers.py create mode 100644 venv/lib/python3.11/site-packages/pkg_resources/_vendor/packaging/tags.py create mode 100644 venv/lib/python3.11/site-packages/pkg_resources/_vendor/packaging/utils.py create mode 100644 venv/lib/python3.11/site-packages/pkg_resources/_vendor/packaging/version.py create mode 100644 venv/lib/python3.11/site-packages/pkg_resources/_vendor/platformdirs/__init__.py create mode 100644 venv/lib/python3.11/site-packages/pkg_resources/_vendor/platformdirs/__main__.py create mode 100644 venv/lib/python3.11/site-packages/pkg_resources/_vendor/platformdirs/__pycache__/__init__.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pkg_resources/_vendor/platformdirs/__pycache__/__main__.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pkg_resources/_vendor/platformdirs/__pycache__/android.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pkg_resources/_vendor/platformdirs/__pycache__/api.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pkg_resources/_vendor/platformdirs/__pycache__/macos.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pkg_resources/_vendor/platformdirs/__pycache__/unix.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pkg_resources/_vendor/platformdirs/__pycache__/version.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pkg_resources/_vendor/platformdirs/__pycache__/windows.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pkg_resources/_vendor/platformdirs/android.py create mode 100644 venv/lib/python3.11/site-packages/pkg_resources/_vendor/platformdirs/api.py create mode 100644 venv/lib/python3.11/site-packages/pkg_resources/_vendor/platformdirs/macos.py create mode 100644 venv/lib/python3.11/site-packages/pkg_resources/_vendor/platformdirs/unix.py create mode 100644 venv/lib/python3.11/site-packages/pkg_resources/_vendor/platformdirs/version.py create mode 100644 venv/lib/python3.11/site-packages/pkg_resources/_vendor/platformdirs/windows.py create mode 100644 venv/lib/python3.11/site-packages/pkg_resources/_vendor/pyparsing/__init__.py create mode 100644 venv/lib/python3.11/site-packages/pkg_resources/_vendor/pyparsing/__pycache__/__init__.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pkg_resources/_vendor/pyparsing/__pycache__/actions.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pkg_resources/_vendor/pyparsing/__pycache__/common.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pkg_resources/_vendor/pyparsing/__pycache__/core.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pkg_resources/_vendor/pyparsing/__pycache__/exceptions.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pkg_resources/_vendor/pyparsing/__pycache__/helpers.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pkg_resources/_vendor/pyparsing/__pycache__/results.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pkg_resources/_vendor/pyparsing/__pycache__/testing.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pkg_resources/_vendor/pyparsing/__pycache__/unicode.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pkg_resources/_vendor/pyparsing/__pycache__/util.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pkg_resources/_vendor/pyparsing/actions.py create mode 100644 venv/lib/python3.11/site-packages/pkg_resources/_vendor/pyparsing/common.py create mode 100644 venv/lib/python3.11/site-packages/pkg_resources/_vendor/pyparsing/core.py create mode 100644 venv/lib/python3.11/site-packages/pkg_resources/_vendor/pyparsing/diagram/__init__.py create mode 100644 venv/lib/python3.11/site-packages/pkg_resources/_vendor/pyparsing/diagram/__pycache__/__init__.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pkg_resources/_vendor/pyparsing/exceptions.py create mode 100644 venv/lib/python3.11/site-packages/pkg_resources/_vendor/pyparsing/helpers.py create mode 100644 venv/lib/python3.11/site-packages/pkg_resources/_vendor/pyparsing/results.py create mode 100644 venv/lib/python3.11/site-packages/pkg_resources/_vendor/pyparsing/testing.py create mode 100644 venv/lib/python3.11/site-packages/pkg_resources/_vendor/pyparsing/unicode.py create mode 100644 venv/lib/python3.11/site-packages/pkg_resources/_vendor/pyparsing/util.py create mode 100644 venv/lib/python3.11/site-packages/pkg_resources/_vendor/typing_extensions.py create mode 100644 venv/lib/python3.11/site-packages/pkg_resources/_vendor/zipp.py create mode 100644 venv/lib/python3.11/site-packages/pkg_resources/extern/__init__.py create mode 100644 venv/lib/python3.11/site-packages/pkg_resources/extern/__pycache__/__init__.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pycparser-3.0.dist-info/INSTALLER create mode 100644 venv/lib/python3.11/site-packages/pycparser-3.0.dist-info/METADATA create mode 100644 venv/lib/python3.11/site-packages/pycparser-3.0.dist-info/RECORD create mode 100644 venv/lib/python3.11/site-packages/pycparser-3.0.dist-info/WHEEL create mode 100644 venv/lib/python3.11/site-packages/pycparser-3.0.dist-info/licenses/LICENSE create mode 100644 venv/lib/python3.11/site-packages/pycparser-3.0.dist-info/top_level.txt create mode 100644 venv/lib/python3.11/site-packages/pycparser/__init__.py create mode 100644 venv/lib/python3.11/site-packages/pycparser/__pycache__/__init__.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pycparser/__pycache__/_ast_gen.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pycparser/__pycache__/ast_transforms.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pycparser/__pycache__/c_ast.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pycparser/__pycache__/c_generator.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pycparser/__pycache__/c_lexer.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pycparser/__pycache__/c_parser.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pycparser/_ast_gen.py create mode 100644 venv/lib/python3.11/site-packages/pycparser/_c_ast.cfg create mode 100644 venv/lib/python3.11/site-packages/pycparser/ast_transforms.py create mode 100644 venv/lib/python3.11/site-packages/pycparser/c_ast.py create mode 100644 venv/lib/python3.11/site-packages/pycparser/c_generator.py create mode 100644 venv/lib/python3.11/site-packages/pycparser/c_lexer.py create mode 100644 venv/lib/python3.11/site-packages/pycparser/c_parser.py create mode 100644 venv/lib/python3.11/site-packages/pydantic-2.12.5.dist-info/INSTALLER create mode 100644 venv/lib/python3.11/site-packages/pydantic-2.12.5.dist-info/METADATA create mode 100644 venv/lib/python3.11/site-packages/pydantic-2.12.5.dist-info/RECORD create mode 100644 venv/lib/python3.11/site-packages/pydantic-2.12.5.dist-info/WHEEL create mode 100644 venv/lib/python3.11/site-packages/pydantic-2.12.5.dist-info/licenses/LICENSE create mode 100644 venv/lib/python3.11/site-packages/pydantic/__init__.py create mode 100644 venv/lib/python3.11/site-packages/pydantic/__pycache__/__init__.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pydantic/__pycache__/_migration.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pydantic/__pycache__/alias_generators.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pydantic/__pycache__/aliases.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pydantic/__pycache__/annotated_handlers.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pydantic/__pycache__/class_validators.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pydantic/__pycache__/color.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pydantic/__pycache__/config.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pydantic/__pycache__/dataclasses.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pydantic/__pycache__/datetime_parse.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pydantic/__pycache__/decorator.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pydantic/__pycache__/env_settings.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pydantic/__pycache__/error_wrappers.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pydantic/__pycache__/errors.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pydantic/__pycache__/fields.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pydantic/__pycache__/functional_serializers.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pydantic/__pycache__/functional_validators.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pydantic/__pycache__/generics.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pydantic/__pycache__/json.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pydantic/__pycache__/json_schema.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pydantic/__pycache__/main.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pydantic/__pycache__/mypy.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pydantic/__pycache__/networks.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pydantic/__pycache__/parse.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pydantic/__pycache__/root_model.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pydantic/__pycache__/schema.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pydantic/__pycache__/tools.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pydantic/__pycache__/type_adapter.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pydantic/__pycache__/types.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pydantic/__pycache__/typing.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pydantic/__pycache__/utils.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pydantic/__pycache__/validate_call_decorator.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pydantic/__pycache__/validators.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pydantic/__pycache__/version.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pydantic/__pycache__/warnings.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pydantic/_internal/__init__.py create mode 100644 venv/lib/python3.11/site-packages/pydantic/_internal/__pycache__/__init__.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pydantic/_internal/__pycache__/_config.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pydantic/_internal/__pycache__/_core_metadata.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pydantic/_internal/__pycache__/_core_utils.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pydantic/_internal/__pycache__/_dataclasses.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pydantic/_internal/__pycache__/_decorators.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pydantic/_internal/__pycache__/_decorators_v1.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pydantic/_internal/__pycache__/_discriminated_union.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pydantic/_internal/__pycache__/_docs_extraction.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pydantic/_internal/__pycache__/_fields.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pydantic/_internal/__pycache__/_forward_ref.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pydantic/_internal/__pycache__/_generate_schema.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pydantic/_internal/__pycache__/_generics.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pydantic/_internal/__pycache__/_git.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pydantic/_internal/__pycache__/_import_utils.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pydantic/_internal/__pycache__/_internal_dataclass.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pydantic/_internal/__pycache__/_known_annotated_metadata.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pydantic/_internal/__pycache__/_mock_val_ser.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pydantic/_internal/__pycache__/_model_construction.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pydantic/_internal/__pycache__/_namespace_utils.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pydantic/_internal/__pycache__/_repr.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pydantic/_internal/__pycache__/_schema_gather.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pydantic/_internal/__pycache__/_schema_generation_shared.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pydantic/_internal/__pycache__/_serializers.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pydantic/_internal/__pycache__/_signature.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pydantic/_internal/__pycache__/_typing_extra.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pydantic/_internal/__pycache__/_utils.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pydantic/_internal/__pycache__/_validate_call.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pydantic/_internal/__pycache__/_validators.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pydantic/_internal/_config.py create mode 100644 venv/lib/python3.11/site-packages/pydantic/_internal/_core_metadata.py create mode 100644 venv/lib/python3.11/site-packages/pydantic/_internal/_core_utils.py create mode 100644 venv/lib/python3.11/site-packages/pydantic/_internal/_dataclasses.py create mode 100644 venv/lib/python3.11/site-packages/pydantic/_internal/_decorators.py create mode 100644 venv/lib/python3.11/site-packages/pydantic/_internal/_decorators_v1.py create mode 100644 venv/lib/python3.11/site-packages/pydantic/_internal/_discriminated_union.py create mode 100644 venv/lib/python3.11/site-packages/pydantic/_internal/_docs_extraction.py create mode 100644 venv/lib/python3.11/site-packages/pydantic/_internal/_fields.py create mode 100644 venv/lib/python3.11/site-packages/pydantic/_internal/_forward_ref.py create mode 100644 venv/lib/python3.11/site-packages/pydantic/_internal/_generate_schema.py create mode 100644 venv/lib/python3.11/site-packages/pydantic/_internal/_generics.py create mode 100644 venv/lib/python3.11/site-packages/pydantic/_internal/_git.py create mode 100644 venv/lib/python3.11/site-packages/pydantic/_internal/_import_utils.py create mode 100644 venv/lib/python3.11/site-packages/pydantic/_internal/_internal_dataclass.py create mode 100644 venv/lib/python3.11/site-packages/pydantic/_internal/_known_annotated_metadata.py create mode 100644 venv/lib/python3.11/site-packages/pydantic/_internal/_mock_val_ser.py create mode 100644 venv/lib/python3.11/site-packages/pydantic/_internal/_model_construction.py create mode 100644 venv/lib/python3.11/site-packages/pydantic/_internal/_namespace_utils.py create mode 100644 venv/lib/python3.11/site-packages/pydantic/_internal/_repr.py create mode 100644 venv/lib/python3.11/site-packages/pydantic/_internal/_schema_gather.py create mode 100644 venv/lib/python3.11/site-packages/pydantic/_internal/_schema_generation_shared.py create mode 100644 venv/lib/python3.11/site-packages/pydantic/_internal/_serializers.py create mode 100644 venv/lib/python3.11/site-packages/pydantic/_internal/_signature.py create mode 100644 venv/lib/python3.11/site-packages/pydantic/_internal/_typing_extra.py create mode 100644 venv/lib/python3.11/site-packages/pydantic/_internal/_utils.py create mode 100644 venv/lib/python3.11/site-packages/pydantic/_internal/_validate_call.py create mode 100644 venv/lib/python3.11/site-packages/pydantic/_internal/_validators.py create mode 100644 venv/lib/python3.11/site-packages/pydantic/_migration.py create mode 100644 venv/lib/python3.11/site-packages/pydantic/alias_generators.py create mode 100644 venv/lib/python3.11/site-packages/pydantic/aliases.py create mode 100644 venv/lib/python3.11/site-packages/pydantic/annotated_handlers.py create mode 100644 venv/lib/python3.11/site-packages/pydantic/class_validators.py create mode 100644 venv/lib/python3.11/site-packages/pydantic/color.py create mode 100644 venv/lib/python3.11/site-packages/pydantic/config.py create mode 100644 venv/lib/python3.11/site-packages/pydantic/dataclasses.py create mode 100644 venv/lib/python3.11/site-packages/pydantic/datetime_parse.py create mode 100644 venv/lib/python3.11/site-packages/pydantic/decorator.py create mode 100644 venv/lib/python3.11/site-packages/pydantic/deprecated/__init__.py create mode 100644 venv/lib/python3.11/site-packages/pydantic/deprecated/__pycache__/__init__.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pydantic/deprecated/__pycache__/class_validators.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pydantic/deprecated/__pycache__/config.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pydantic/deprecated/__pycache__/copy_internals.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pydantic/deprecated/__pycache__/decorator.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pydantic/deprecated/__pycache__/json.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pydantic/deprecated/__pycache__/parse.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pydantic/deprecated/__pycache__/tools.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pydantic/deprecated/class_validators.py create mode 100644 venv/lib/python3.11/site-packages/pydantic/deprecated/config.py create mode 100644 venv/lib/python3.11/site-packages/pydantic/deprecated/copy_internals.py create mode 100644 venv/lib/python3.11/site-packages/pydantic/deprecated/decorator.py create mode 100644 venv/lib/python3.11/site-packages/pydantic/deprecated/json.py create mode 100644 venv/lib/python3.11/site-packages/pydantic/deprecated/parse.py create mode 100644 venv/lib/python3.11/site-packages/pydantic/deprecated/tools.py create mode 100644 venv/lib/python3.11/site-packages/pydantic/env_settings.py create mode 100644 venv/lib/python3.11/site-packages/pydantic/error_wrappers.py create mode 100644 venv/lib/python3.11/site-packages/pydantic/errors.py create mode 100644 venv/lib/python3.11/site-packages/pydantic/experimental/__init__.py create mode 100644 venv/lib/python3.11/site-packages/pydantic/experimental/__pycache__/__init__.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pydantic/experimental/__pycache__/arguments_schema.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pydantic/experimental/__pycache__/missing_sentinel.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pydantic/experimental/__pycache__/pipeline.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pydantic/experimental/arguments_schema.py create mode 100644 venv/lib/python3.11/site-packages/pydantic/experimental/missing_sentinel.py create mode 100644 venv/lib/python3.11/site-packages/pydantic/experimental/pipeline.py create mode 100644 venv/lib/python3.11/site-packages/pydantic/fields.py create mode 100644 venv/lib/python3.11/site-packages/pydantic/functional_serializers.py create mode 100644 venv/lib/python3.11/site-packages/pydantic/functional_validators.py create mode 100644 venv/lib/python3.11/site-packages/pydantic/generics.py create mode 100644 venv/lib/python3.11/site-packages/pydantic/json.py create mode 100644 venv/lib/python3.11/site-packages/pydantic/json_schema.py create mode 100644 venv/lib/python3.11/site-packages/pydantic/main.py create mode 100644 venv/lib/python3.11/site-packages/pydantic/mypy.py create mode 100644 venv/lib/python3.11/site-packages/pydantic/networks.py create mode 100644 venv/lib/python3.11/site-packages/pydantic/parse.py create mode 100644 venv/lib/python3.11/site-packages/pydantic/plugin/__init__.py create mode 100644 venv/lib/python3.11/site-packages/pydantic/plugin/__pycache__/__init__.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pydantic/plugin/__pycache__/_loader.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pydantic/plugin/__pycache__/_schema_validator.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pydantic/plugin/_loader.py create mode 100644 venv/lib/python3.11/site-packages/pydantic/plugin/_schema_validator.py create mode 100644 venv/lib/python3.11/site-packages/pydantic/py.typed create mode 100644 venv/lib/python3.11/site-packages/pydantic/root_model.py create mode 100644 venv/lib/python3.11/site-packages/pydantic/schema.py create mode 100644 venv/lib/python3.11/site-packages/pydantic/tools.py create mode 100644 venv/lib/python3.11/site-packages/pydantic/type_adapter.py create mode 100644 venv/lib/python3.11/site-packages/pydantic/types.py create mode 100644 venv/lib/python3.11/site-packages/pydantic/typing.py create mode 100644 venv/lib/python3.11/site-packages/pydantic/utils.py create mode 100644 venv/lib/python3.11/site-packages/pydantic/v1/__init__.py create mode 100644 venv/lib/python3.11/site-packages/pydantic/v1/__pycache__/__init__.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pydantic/v1/__pycache__/_hypothesis_plugin.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pydantic/v1/__pycache__/annotated_types.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pydantic/v1/__pycache__/class_validators.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pydantic/v1/__pycache__/color.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pydantic/v1/__pycache__/config.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pydantic/v1/__pycache__/dataclasses.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pydantic/v1/__pycache__/datetime_parse.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pydantic/v1/__pycache__/decorator.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pydantic/v1/__pycache__/env_settings.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pydantic/v1/__pycache__/error_wrappers.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pydantic/v1/__pycache__/errors.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pydantic/v1/__pycache__/fields.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pydantic/v1/__pycache__/generics.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pydantic/v1/__pycache__/json.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pydantic/v1/__pycache__/main.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pydantic/v1/__pycache__/mypy.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pydantic/v1/__pycache__/networks.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pydantic/v1/__pycache__/parse.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pydantic/v1/__pycache__/schema.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pydantic/v1/__pycache__/tools.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pydantic/v1/__pycache__/types.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pydantic/v1/__pycache__/typing.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pydantic/v1/__pycache__/utils.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pydantic/v1/__pycache__/validators.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pydantic/v1/__pycache__/version.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pydantic/v1/_hypothesis_plugin.py create mode 100644 venv/lib/python3.11/site-packages/pydantic/v1/annotated_types.py create mode 100644 venv/lib/python3.11/site-packages/pydantic/v1/class_validators.py create mode 100644 venv/lib/python3.11/site-packages/pydantic/v1/color.py create mode 100644 venv/lib/python3.11/site-packages/pydantic/v1/config.py create mode 100644 venv/lib/python3.11/site-packages/pydantic/v1/dataclasses.py create mode 100644 venv/lib/python3.11/site-packages/pydantic/v1/datetime_parse.py create mode 100644 venv/lib/python3.11/site-packages/pydantic/v1/decorator.py create mode 100644 venv/lib/python3.11/site-packages/pydantic/v1/env_settings.py create mode 100644 venv/lib/python3.11/site-packages/pydantic/v1/error_wrappers.py create mode 100644 venv/lib/python3.11/site-packages/pydantic/v1/errors.py create mode 100644 venv/lib/python3.11/site-packages/pydantic/v1/fields.py create mode 100644 venv/lib/python3.11/site-packages/pydantic/v1/generics.py create mode 100644 venv/lib/python3.11/site-packages/pydantic/v1/json.py create mode 100644 venv/lib/python3.11/site-packages/pydantic/v1/main.py create mode 100644 venv/lib/python3.11/site-packages/pydantic/v1/mypy.py create mode 100644 venv/lib/python3.11/site-packages/pydantic/v1/networks.py create mode 100644 venv/lib/python3.11/site-packages/pydantic/v1/parse.py create mode 100644 venv/lib/python3.11/site-packages/pydantic/v1/py.typed create mode 100644 venv/lib/python3.11/site-packages/pydantic/v1/schema.py create mode 100644 venv/lib/python3.11/site-packages/pydantic/v1/tools.py create mode 100644 venv/lib/python3.11/site-packages/pydantic/v1/types.py create mode 100644 venv/lib/python3.11/site-packages/pydantic/v1/typing.py create mode 100644 venv/lib/python3.11/site-packages/pydantic/v1/utils.py create mode 100644 venv/lib/python3.11/site-packages/pydantic/v1/validators.py create mode 100644 venv/lib/python3.11/site-packages/pydantic/v1/version.py create mode 100644 venv/lib/python3.11/site-packages/pydantic/validate_call_decorator.py create mode 100644 venv/lib/python3.11/site-packages/pydantic/validators.py create mode 100644 venv/lib/python3.11/site-packages/pydantic/version.py create mode 100644 venv/lib/python3.11/site-packages/pydantic/warnings.py create mode 100644 venv/lib/python3.11/site-packages/pydantic_core-2.41.5.dist-info/INSTALLER create mode 100644 venv/lib/python3.11/site-packages/pydantic_core-2.41.5.dist-info/METADATA create mode 100644 venv/lib/python3.11/site-packages/pydantic_core-2.41.5.dist-info/RECORD create mode 100644 venv/lib/python3.11/site-packages/pydantic_core-2.41.5.dist-info/WHEEL create mode 100644 venv/lib/python3.11/site-packages/pydantic_core-2.41.5.dist-info/licenses/LICENSE create mode 100644 venv/lib/python3.11/site-packages/pydantic_core/__init__.py create mode 100644 venv/lib/python3.11/site-packages/pydantic_core/__pycache__/__init__.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pydantic_core/__pycache__/core_schema.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/pydantic_core/_pydantic_core.cpython-311-x86_64-linux-gnu.so create mode 100644 venv/lib/python3.11/site-packages/pydantic_core/_pydantic_core.pyi create mode 100644 venv/lib/python3.11/site-packages/pydantic_core/core_schema.py create mode 100644 venv/lib/python3.11/site-packages/pydantic_core/py.typed create mode 100644 venv/lib/python3.11/site-packages/pydantic_settings-2.12.0.dist-info/INSTALLER create mode 100644 venv/lib/python3.11/site-packages/pydantic_settings-2.12.0.dist-info/METADATA create mode 100644 venv/lib/python3.11/site-packages/pydantic_settings-2.12.0.dist-info/RECORD create mode 100644 venv/lib/python3.11/site-packages/pydantic_settings-2.12.0.dist-info/WHEEL create mode 100644 venv/lib/python3.11/site-packages/pydantic_settings-2.12.0.dist-info/licenses/LICENSE create mode 100644 venv/lib/python3.11/site-packages/pydantic_settings/__init__.py create mode 100644 venv/lib/python3.11/site-packages/pydantic_settings/__pycache__/__init__.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pydantic_settings/__pycache__/exceptions.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pydantic_settings/__pycache__/main.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pydantic_settings/__pycache__/utils.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pydantic_settings/__pycache__/version.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pydantic_settings/exceptions.py create mode 100644 venv/lib/python3.11/site-packages/pydantic_settings/main.py create mode 100644 venv/lib/python3.11/site-packages/pydantic_settings/py.typed create mode 100644 venv/lib/python3.11/site-packages/pydantic_settings/sources/__init__.py create mode 100644 venv/lib/python3.11/site-packages/pydantic_settings/sources/__pycache__/__init__.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pydantic_settings/sources/__pycache__/base.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pydantic_settings/sources/__pycache__/types.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pydantic_settings/sources/__pycache__/utils.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pydantic_settings/sources/base.py create mode 100644 venv/lib/python3.11/site-packages/pydantic_settings/sources/providers/__init__.py create mode 100644 venv/lib/python3.11/site-packages/pydantic_settings/sources/providers/__pycache__/__init__.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pydantic_settings/sources/providers/__pycache__/aws.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pydantic_settings/sources/providers/__pycache__/azure.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pydantic_settings/sources/providers/__pycache__/cli.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pydantic_settings/sources/providers/__pycache__/dotenv.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pydantic_settings/sources/providers/__pycache__/env.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pydantic_settings/sources/providers/__pycache__/gcp.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pydantic_settings/sources/providers/__pycache__/json.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pydantic_settings/sources/providers/__pycache__/nested_secrets.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pydantic_settings/sources/providers/__pycache__/pyproject.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pydantic_settings/sources/providers/__pycache__/secrets.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pydantic_settings/sources/providers/__pycache__/toml.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pydantic_settings/sources/providers/__pycache__/yaml.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pydantic_settings/sources/providers/aws.py create mode 100644 venv/lib/python3.11/site-packages/pydantic_settings/sources/providers/azure.py create mode 100644 venv/lib/python3.11/site-packages/pydantic_settings/sources/providers/cli.py create mode 100644 venv/lib/python3.11/site-packages/pydantic_settings/sources/providers/dotenv.py create mode 100644 venv/lib/python3.11/site-packages/pydantic_settings/sources/providers/env.py create mode 100644 venv/lib/python3.11/site-packages/pydantic_settings/sources/providers/gcp.py create mode 100644 venv/lib/python3.11/site-packages/pydantic_settings/sources/providers/json.py create mode 100644 venv/lib/python3.11/site-packages/pydantic_settings/sources/providers/nested_secrets.py create mode 100644 venv/lib/python3.11/site-packages/pydantic_settings/sources/providers/pyproject.py create mode 100644 venv/lib/python3.11/site-packages/pydantic_settings/sources/providers/secrets.py create mode 100644 venv/lib/python3.11/site-packages/pydantic_settings/sources/providers/toml.py create mode 100644 venv/lib/python3.11/site-packages/pydantic_settings/sources/providers/yaml.py create mode 100644 venv/lib/python3.11/site-packages/pydantic_settings/sources/types.py create mode 100644 venv/lib/python3.11/site-packages/pydantic_settings/sources/utils.py create mode 100644 venv/lib/python3.11/site-packages/pydantic_settings/utils.py create mode 100644 venv/lib/python3.11/site-packages/pydantic_settings/version.py create mode 100644 venv/lib/python3.11/site-packages/pymysql-1.1.2.dist-info/INSTALLER create mode 100644 venv/lib/python3.11/site-packages/pymysql-1.1.2.dist-info/METADATA create mode 100644 venv/lib/python3.11/site-packages/pymysql-1.1.2.dist-info/RECORD create mode 100644 venv/lib/python3.11/site-packages/pymysql-1.1.2.dist-info/REQUESTED create mode 100644 venv/lib/python3.11/site-packages/pymysql-1.1.2.dist-info/WHEEL create mode 100644 venv/lib/python3.11/site-packages/pymysql-1.1.2.dist-info/licenses/LICENSE create mode 100644 venv/lib/python3.11/site-packages/pymysql-1.1.2.dist-info/top_level.txt create mode 100644 venv/lib/python3.11/site-packages/pymysql/__init__.py create mode 100644 venv/lib/python3.11/site-packages/pymysql/__pycache__/__init__.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pymysql/__pycache__/_auth.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pymysql/__pycache__/charset.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pymysql/__pycache__/connections.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pymysql/__pycache__/converters.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pymysql/__pycache__/cursors.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pymysql/__pycache__/err.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pymysql/__pycache__/optionfile.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pymysql/__pycache__/protocol.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pymysql/__pycache__/times.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pymysql/_auth.py create mode 100644 venv/lib/python3.11/site-packages/pymysql/charset.py create mode 100644 venv/lib/python3.11/site-packages/pymysql/connections.py create mode 100644 venv/lib/python3.11/site-packages/pymysql/constants/CLIENT.py create mode 100644 venv/lib/python3.11/site-packages/pymysql/constants/COMMAND.py create mode 100644 venv/lib/python3.11/site-packages/pymysql/constants/CR.py create mode 100644 venv/lib/python3.11/site-packages/pymysql/constants/ER.py create mode 100644 venv/lib/python3.11/site-packages/pymysql/constants/FIELD_TYPE.py create mode 100644 venv/lib/python3.11/site-packages/pymysql/constants/FLAG.py create mode 100644 venv/lib/python3.11/site-packages/pymysql/constants/SERVER_STATUS.py create mode 100644 venv/lib/python3.11/site-packages/pymysql/constants/__init__.py create mode 100644 venv/lib/python3.11/site-packages/pymysql/constants/__pycache__/CLIENT.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pymysql/constants/__pycache__/COMMAND.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pymysql/constants/__pycache__/CR.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pymysql/constants/__pycache__/ER.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pymysql/constants/__pycache__/FIELD_TYPE.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pymysql/constants/__pycache__/FLAG.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pymysql/constants/__pycache__/SERVER_STATUS.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pymysql/constants/__pycache__/__init__.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/pymysql/converters.py create mode 100644 venv/lib/python3.11/site-packages/pymysql/cursors.py create mode 100644 venv/lib/python3.11/site-packages/pymysql/err.py create mode 100644 venv/lib/python3.11/site-packages/pymysql/optionfile.py create mode 100644 venv/lib/python3.11/site-packages/pymysql/protocol.py create mode 100644 venv/lib/python3.11/site-packages/pymysql/times.py create mode 100644 venv/lib/python3.11/site-packages/python_dotenv-1.2.1.dist-info/INSTALLER create mode 100644 venv/lib/python3.11/site-packages/python_dotenv-1.2.1.dist-info/METADATA create mode 100644 venv/lib/python3.11/site-packages/python_dotenv-1.2.1.dist-info/RECORD create mode 100644 venv/lib/python3.11/site-packages/python_dotenv-1.2.1.dist-info/REQUESTED create mode 100644 venv/lib/python3.11/site-packages/python_dotenv-1.2.1.dist-info/WHEEL create mode 100644 venv/lib/python3.11/site-packages/python_dotenv-1.2.1.dist-info/entry_points.txt create mode 100644 venv/lib/python3.11/site-packages/python_dotenv-1.2.1.dist-info/licenses/LICENSE create mode 100644 venv/lib/python3.11/site-packages/python_dotenv-1.2.1.dist-info/top_level.txt create mode 100644 venv/lib/python3.11/site-packages/python_multipart-0.0.22.dist-info/INSTALLER create mode 100644 venv/lib/python3.11/site-packages/python_multipart-0.0.22.dist-info/METADATA create mode 100644 venv/lib/python3.11/site-packages/python_multipart-0.0.22.dist-info/RECORD create mode 100644 venv/lib/python3.11/site-packages/python_multipart-0.0.22.dist-info/WHEEL create mode 100644 venv/lib/python3.11/site-packages/python_multipart-0.0.22.dist-info/licenses/LICENSE.txt create mode 100644 venv/lib/python3.11/site-packages/python_multipart/__init__.py create mode 100644 venv/lib/python3.11/site-packages/python_multipart/__pycache__/__init__.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/python_multipart/__pycache__/decoders.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/python_multipart/__pycache__/exceptions.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/python_multipart/__pycache__/multipart.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/python_multipart/decoders.py create mode 100644 venv/lib/python3.11/site-packages/python_multipart/exceptions.py create mode 100644 venv/lib/python3.11/site-packages/python_multipart/multipart.py create mode 100644 venv/lib/python3.11/site-packages/python_multipart/py.typed create mode 100644 venv/lib/python3.11/site-packages/referencing-0.37.0.dist-info/INSTALLER create mode 100644 venv/lib/python3.11/site-packages/referencing-0.37.0.dist-info/METADATA create mode 100644 venv/lib/python3.11/site-packages/referencing-0.37.0.dist-info/RECORD create mode 100644 venv/lib/python3.11/site-packages/referencing-0.37.0.dist-info/WHEEL create mode 100644 venv/lib/python3.11/site-packages/referencing-0.37.0.dist-info/licenses/COPYING create mode 100644 venv/lib/python3.11/site-packages/referencing/__init__.py create mode 100644 venv/lib/python3.11/site-packages/referencing/__pycache__/__init__.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/referencing/__pycache__/_attrs.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/referencing/__pycache__/_core.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/referencing/__pycache__/exceptions.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/referencing/__pycache__/jsonschema.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/referencing/__pycache__/retrieval.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/referencing/__pycache__/typing.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/referencing/_attrs.py create mode 100644 venv/lib/python3.11/site-packages/referencing/_attrs.pyi create mode 100644 venv/lib/python3.11/site-packages/referencing/_core.py create mode 100644 venv/lib/python3.11/site-packages/referencing/exceptions.py create mode 100644 venv/lib/python3.11/site-packages/referencing/jsonschema.py create mode 100644 venv/lib/python3.11/site-packages/referencing/py.typed create mode 100644 venv/lib/python3.11/site-packages/referencing/retrieval.py create mode 100644 venv/lib/python3.11/site-packages/referencing/tests/__init__.py create mode 100644 venv/lib/python3.11/site-packages/referencing/tests/__pycache__/__init__.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/referencing/tests/__pycache__/test_core.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/referencing/tests/__pycache__/test_exceptions.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/referencing/tests/__pycache__/test_jsonschema.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/referencing/tests/__pycache__/test_referencing_suite.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/referencing/tests/__pycache__/test_retrieval.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/referencing/tests/test_core.py create mode 100644 venv/lib/python3.11/site-packages/referencing/tests/test_exceptions.py create mode 100644 venv/lib/python3.11/site-packages/referencing/tests/test_jsonschema.py create mode 100644 venv/lib/python3.11/site-packages/referencing/tests/test_referencing_suite.py create mode 100644 venv/lib/python3.11/site-packages/referencing/tests/test_retrieval.py create mode 100644 venv/lib/python3.11/site-packages/referencing/typing.py create mode 100644 venv/lib/python3.11/site-packages/requests-2.32.5.dist-info/INSTALLER create mode 100644 venv/lib/python3.11/site-packages/requests-2.32.5.dist-info/METADATA create mode 100644 venv/lib/python3.11/site-packages/requests-2.32.5.dist-info/RECORD create mode 100644 venv/lib/python3.11/site-packages/requests-2.32.5.dist-info/REQUESTED create mode 100644 venv/lib/python3.11/site-packages/requests-2.32.5.dist-info/WHEEL create mode 100644 venv/lib/python3.11/site-packages/requests-2.32.5.dist-info/licenses/LICENSE create mode 100644 venv/lib/python3.11/site-packages/requests-2.32.5.dist-info/top_level.txt create mode 100644 venv/lib/python3.11/site-packages/requests/__init__.py create mode 100644 venv/lib/python3.11/site-packages/requests/__pycache__/__init__.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/requests/__pycache__/__version__.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/requests/__pycache__/_internal_utils.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/requests/__pycache__/adapters.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/requests/__pycache__/api.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/requests/__pycache__/auth.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/requests/__pycache__/certs.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/requests/__pycache__/compat.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/requests/__pycache__/cookies.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/requests/__pycache__/exceptions.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/requests/__pycache__/help.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/requests/__pycache__/hooks.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/requests/__pycache__/models.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/requests/__pycache__/packages.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/requests/__pycache__/sessions.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/requests/__pycache__/status_codes.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/requests/__pycache__/structures.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/requests/__pycache__/utils.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/requests/__version__.py create mode 100644 venv/lib/python3.11/site-packages/requests/_internal_utils.py create mode 100644 venv/lib/python3.11/site-packages/requests/adapters.py create mode 100644 venv/lib/python3.11/site-packages/requests/api.py create mode 100644 venv/lib/python3.11/site-packages/requests/auth.py create mode 100644 venv/lib/python3.11/site-packages/requests/certs.py create mode 100644 venv/lib/python3.11/site-packages/requests/compat.py create mode 100644 venv/lib/python3.11/site-packages/requests/cookies.py create mode 100644 venv/lib/python3.11/site-packages/requests/exceptions.py create mode 100644 venv/lib/python3.11/site-packages/requests/help.py create mode 100644 venv/lib/python3.11/site-packages/requests/hooks.py create mode 100644 venv/lib/python3.11/site-packages/requests/models.py create mode 100644 venv/lib/python3.11/site-packages/requests/packages.py create mode 100644 venv/lib/python3.11/site-packages/requests/sessions.py create mode 100644 venv/lib/python3.11/site-packages/requests/status_codes.py create mode 100644 venv/lib/python3.11/site-packages/requests/structures.py create mode 100644 venv/lib/python3.11/site-packages/requests/utils.py create mode 100644 venv/lib/python3.11/site-packages/rpds/__init__.py create mode 100644 venv/lib/python3.11/site-packages/rpds/__init__.pyi create mode 100644 venv/lib/python3.11/site-packages/rpds/__pycache__/__init__.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/rpds/py.typed create mode 100755 venv/lib/python3.11/site-packages/rpds/rpds.cpython-311-x86_64-linux-gnu.so create mode 100644 venv/lib/python3.11/site-packages/rpds_py-0.30.0.dist-info/INSTALLER create mode 100644 venv/lib/python3.11/site-packages/rpds_py-0.30.0.dist-info/METADATA create mode 100644 venv/lib/python3.11/site-packages/rpds_py-0.30.0.dist-info/RECORD create mode 100644 venv/lib/python3.11/site-packages/rpds_py-0.30.0.dist-info/WHEEL create mode 100644 venv/lib/python3.11/site-packages/rpds_py-0.30.0.dist-info/licenses/LICENSE create mode 100644 venv/lib/python3.11/site-packages/setuptools-66.1.1.dist-info/INSTALLER create mode 100644 venv/lib/python3.11/site-packages/setuptools-66.1.1.dist-info/LICENSE create mode 100644 venv/lib/python3.11/site-packages/setuptools-66.1.1.dist-info/METADATA create mode 100644 venv/lib/python3.11/site-packages/setuptools-66.1.1.dist-info/RECORD create mode 100644 venv/lib/python3.11/site-packages/setuptools-66.1.1.dist-info/REQUESTED create mode 100644 venv/lib/python3.11/site-packages/setuptools-66.1.1.dist-info/WHEEL create mode 100644 venv/lib/python3.11/site-packages/setuptools-66.1.1.dist-info/entry_points.txt create mode 100644 venv/lib/python3.11/site-packages/setuptools-66.1.1.dist-info/top_level.txt create mode 100644 venv/lib/python3.11/site-packages/setuptools/__init__.py create mode 100644 venv/lib/python3.11/site-packages/setuptools/__pycache__/__init__.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/setuptools/__pycache__/_deprecation_warning.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/setuptools/__pycache__/_entry_points.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/setuptools/__pycache__/_imp.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/setuptools/__pycache__/_importlib.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/setuptools/__pycache__/_itertools.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/setuptools/__pycache__/_path.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/setuptools/__pycache__/_reqs.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/setuptools/__pycache__/archive_util.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/setuptools/__pycache__/build_meta.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/setuptools/__pycache__/dep_util.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/setuptools/__pycache__/depends.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/setuptools/__pycache__/discovery.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/setuptools/__pycache__/dist.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/setuptools/__pycache__/errors.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/setuptools/__pycache__/extension.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/setuptools/__pycache__/glob.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/setuptools/__pycache__/installer.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/setuptools/__pycache__/launch.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/setuptools/__pycache__/logging.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/setuptools/__pycache__/monkey.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/setuptools/__pycache__/msvc.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/setuptools/__pycache__/namespaces.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/setuptools/__pycache__/package_index.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/setuptools/__pycache__/py34compat.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/setuptools/__pycache__/sandbox.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/setuptools/__pycache__/unicode_utils.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/setuptools/__pycache__/version.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/setuptools/__pycache__/wheel.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/setuptools/__pycache__/windows_support.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/setuptools/_deprecation_warning.py create mode 100644 venv/lib/python3.11/site-packages/setuptools/_distutils/__init__.py create mode 100644 venv/lib/python3.11/site-packages/setuptools/_distutils/__pycache__/__init__.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/setuptools/_distutils/__pycache__/_collections.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/setuptools/_distutils/__pycache__/_functools.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/setuptools/_distutils/__pycache__/_log.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/setuptools/_distutils/__pycache__/_macos_compat.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/setuptools/_distutils/__pycache__/_msvccompiler.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/setuptools/_distutils/__pycache__/archive_util.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/setuptools/_distutils/__pycache__/bcppcompiler.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/setuptools/_distutils/__pycache__/ccompiler.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/setuptools/_distutils/__pycache__/cmd.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/setuptools/_distutils/__pycache__/config.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/setuptools/_distutils/__pycache__/core.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/setuptools/_distutils/__pycache__/cygwinccompiler.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/setuptools/_distutils/__pycache__/debug.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/setuptools/_distutils/__pycache__/dep_util.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/setuptools/_distutils/__pycache__/dir_util.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/setuptools/_distutils/__pycache__/dist.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/setuptools/_distutils/__pycache__/errors.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/setuptools/_distutils/__pycache__/extension.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/setuptools/_distutils/__pycache__/fancy_getopt.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/setuptools/_distutils/__pycache__/file_util.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/setuptools/_distutils/__pycache__/filelist.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/setuptools/_distutils/__pycache__/log.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/setuptools/_distutils/__pycache__/msvc9compiler.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/setuptools/_distutils/__pycache__/msvccompiler.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/setuptools/_distutils/__pycache__/py38compat.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/setuptools/_distutils/__pycache__/py39compat.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/setuptools/_distutils/__pycache__/spawn.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/setuptools/_distutils/__pycache__/sysconfig.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/setuptools/_distutils/__pycache__/text_file.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/setuptools/_distutils/__pycache__/unixccompiler.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/setuptools/_distutils/__pycache__/util.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/setuptools/_distutils/__pycache__/version.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/setuptools/_distutils/__pycache__/versionpredicate.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/setuptools/_distutils/_collections.py create mode 100644 venv/lib/python3.11/site-packages/setuptools/_distutils/_functools.py create mode 100644 venv/lib/python3.11/site-packages/setuptools/_distutils/_log.py create mode 100644 venv/lib/python3.11/site-packages/setuptools/_distutils/_macos_compat.py create mode 100644 venv/lib/python3.11/site-packages/setuptools/_distutils/_msvccompiler.py create mode 100644 venv/lib/python3.11/site-packages/setuptools/_distutils/archive_util.py create mode 100644 venv/lib/python3.11/site-packages/setuptools/_distutils/bcppcompiler.py create mode 100644 venv/lib/python3.11/site-packages/setuptools/_distutils/ccompiler.py create mode 100644 venv/lib/python3.11/site-packages/setuptools/_distutils/cmd.py create mode 100644 venv/lib/python3.11/site-packages/setuptools/_distutils/command/__init__.py create mode 100644 venv/lib/python3.11/site-packages/setuptools/_distutils/command/__pycache__/__init__.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/setuptools/_distutils/command/__pycache__/_framework_compat.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/setuptools/_distutils/command/__pycache__/bdist.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/setuptools/_distutils/command/__pycache__/bdist_dumb.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/setuptools/_distutils/command/__pycache__/bdist_rpm.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/setuptools/_distutils/command/__pycache__/build.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/setuptools/_distutils/command/__pycache__/build_clib.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/setuptools/_distutils/command/__pycache__/build_ext.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/setuptools/_distutils/command/__pycache__/build_py.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/setuptools/_distutils/command/__pycache__/build_scripts.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/setuptools/_distutils/command/__pycache__/check.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/setuptools/_distutils/command/__pycache__/clean.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/setuptools/_distutils/command/__pycache__/config.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/setuptools/_distutils/command/__pycache__/install.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/setuptools/_distutils/command/__pycache__/install_data.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/setuptools/_distutils/command/__pycache__/install_egg_info.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/setuptools/_distutils/command/__pycache__/install_headers.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/setuptools/_distutils/command/__pycache__/install_lib.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/setuptools/_distutils/command/__pycache__/install_scripts.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/setuptools/_distutils/command/__pycache__/py37compat.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/setuptools/_distutils/command/__pycache__/register.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/setuptools/_distutils/command/__pycache__/sdist.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/setuptools/_distutils/command/__pycache__/upload.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/setuptools/_distutils/command/_framework_compat.py create mode 100644 venv/lib/python3.11/site-packages/setuptools/_distutils/command/bdist.py create mode 100644 venv/lib/python3.11/site-packages/setuptools/_distutils/command/bdist_dumb.py create mode 100644 venv/lib/python3.11/site-packages/setuptools/_distutils/command/bdist_rpm.py create mode 100644 venv/lib/python3.11/site-packages/setuptools/_distutils/command/build.py create mode 100644 venv/lib/python3.11/site-packages/setuptools/_distutils/command/build_clib.py create mode 100644 venv/lib/python3.11/site-packages/setuptools/_distutils/command/build_ext.py create mode 100644 venv/lib/python3.11/site-packages/setuptools/_distutils/command/build_py.py create mode 100644 venv/lib/python3.11/site-packages/setuptools/_distutils/command/build_scripts.py create mode 100644 venv/lib/python3.11/site-packages/setuptools/_distutils/command/check.py create mode 100644 venv/lib/python3.11/site-packages/setuptools/_distutils/command/clean.py create mode 100644 venv/lib/python3.11/site-packages/setuptools/_distutils/command/config.py create mode 100644 venv/lib/python3.11/site-packages/setuptools/_distutils/command/install.py create mode 100644 venv/lib/python3.11/site-packages/setuptools/_distutils/command/install_data.py create mode 100644 venv/lib/python3.11/site-packages/setuptools/_distutils/command/install_egg_info.py create mode 100644 venv/lib/python3.11/site-packages/setuptools/_distutils/command/install_headers.py create mode 100644 venv/lib/python3.11/site-packages/setuptools/_distutils/command/install_lib.py create mode 100644 venv/lib/python3.11/site-packages/setuptools/_distutils/command/install_scripts.py create mode 100644 venv/lib/python3.11/site-packages/setuptools/_distutils/command/py37compat.py create mode 100644 venv/lib/python3.11/site-packages/setuptools/_distutils/command/register.py create mode 100644 venv/lib/python3.11/site-packages/setuptools/_distutils/command/sdist.py create mode 100644 venv/lib/python3.11/site-packages/setuptools/_distutils/command/upload.py create mode 100644 venv/lib/python3.11/site-packages/setuptools/_distutils/config.py create mode 100644 venv/lib/python3.11/site-packages/setuptools/_distutils/core.py create mode 100644 venv/lib/python3.11/site-packages/setuptools/_distutils/cygwinccompiler.py create mode 100644 venv/lib/python3.11/site-packages/setuptools/_distutils/debug.py create mode 100644 venv/lib/python3.11/site-packages/setuptools/_distutils/dep_util.py create mode 100644 venv/lib/python3.11/site-packages/setuptools/_distutils/dir_util.py create mode 100644 venv/lib/python3.11/site-packages/setuptools/_distutils/dist.py create mode 100644 venv/lib/python3.11/site-packages/setuptools/_distutils/errors.py create mode 100644 venv/lib/python3.11/site-packages/setuptools/_distutils/extension.py create mode 100644 venv/lib/python3.11/site-packages/setuptools/_distutils/fancy_getopt.py create mode 100644 venv/lib/python3.11/site-packages/setuptools/_distutils/file_util.py create mode 100644 venv/lib/python3.11/site-packages/setuptools/_distutils/filelist.py create mode 100644 venv/lib/python3.11/site-packages/setuptools/_distutils/log.py create mode 100644 venv/lib/python3.11/site-packages/setuptools/_distutils/msvc9compiler.py create mode 100644 venv/lib/python3.11/site-packages/setuptools/_distutils/msvccompiler.py create mode 100644 venv/lib/python3.11/site-packages/setuptools/_distutils/py38compat.py create mode 100644 venv/lib/python3.11/site-packages/setuptools/_distutils/py39compat.py create mode 100644 venv/lib/python3.11/site-packages/setuptools/_distutils/spawn.py create mode 100644 venv/lib/python3.11/site-packages/setuptools/_distutils/sysconfig.py create mode 100644 venv/lib/python3.11/site-packages/setuptools/_distutils/text_file.py create mode 100644 venv/lib/python3.11/site-packages/setuptools/_distutils/unixccompiler.py create mode 100644 venv/lib/python3.11/site-packages/setuptools/_distutils/util.py create mode 100644 venv/lib/python3.11/site-packages/setuptools/_distutils/version.py create mode 100644 venv/lib/python3.11/site-packages/setuptools/_distutils/versionpredicate.py create mode 100644 venv/lib/python3.11/site-packages/setuptools/_entry_points.py create mode 100644 venv/lib/python3.11/site-packages/setuptools/_imp.py create mode 100644 venv/lib/python3.11/site-packages/setuptools/_importlib.py create mode 100644 venv/lib/python3.11/site-packages/setuptools/_itertools.py create mode 100644 venv/lib/python3.11/site-packages/setuptools/_path.py create mode 100644 venv/lib/python3.11/site-packages/setuptools/_reqs.py create mode 100644 venv/lib/python3.11/site-packages/setuptools/_vendor/__init__.py create mode 100644 venv/lib/python3.11/site-packages/setuptools/_vendor/__pycache__/__init__.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/setuptools/_vendor/__pycache__/ordered_set.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/setuptools/_vendor/__pycache__/typing_extensions.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/setuptools/_vendor/__pycache__/zipp.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/setuptools/_vendor/importlib_metadata/__init__.py create mode 100644 venv/lib/python3.11/site-packages/setuptools/_vendor/importlib_metadata/__pycache__/__init__.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/setuptools/_vendor/importlib_metadata/__pycache__/_adapters.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/setuptools/_vendor/importlib_metadata/__pycache__/_collections.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/setuptools/_vendor/importlib_metadata/__pycache__/_compat.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/setuptools/_vendor/importlib_metadata/__pycache__/_functools.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/setuptools/_vendor/importlib_metadata/__pycache__/_itertools.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/setuptools/_vendor/importlib_metadata/__pycache__/_meta.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/setuptools/_vendor/importlib_metadata/__pycache__/_text.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/setuptools/_vendor/importlib_metadata/_adapters.py create mode 100644 venv/lib/python3.11/site-packages/setuptools/_vendor/importlib_metadata/_collections.py create mode 100644 venv/lib/python3.11/site-packages/setuptools/_vendor/importlib_metadata/_compat.py create mode 100644 venv/lib/python3.11/site-packages/setuptools/_vendor/importlib_metadata/_functools.py create mode 100644 venv/lib/python3.11/site-packages/setuptools/_vendor/importlib_metadata/_itertools.py create mode 100644 venv/lib/python3.11/site-packages/setuptools/_vendor/importlib_metadata/_meta.py create mode 100644 venv/lib/python3.11/site-packages/setuptools/_vendor/importlib_metadata/_text.py create mode 100644 venv/lib/python3.11/site-packages/setuptools/_vendor/importlib_resources/__init__.py create mode 100644 venv/lib/python3.11/site-packages/setuptools/_vendor/importlib_resources/__pycache__/__init__.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/setuptools/_vendor/importlib_resources/__pycache__/_adapters.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/setuptools/_vendor/importlib_resources/__pycache__/_common.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/setuptools/_vendor/importlib_resources/__pycache__/_compat.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/setuptools/_vendor/importlib_resources/__pycache__/_itertools.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/setuptools/_vendor/importlib_resources/__pycache__/_legacy.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/setuptools/_vendor/importlib_resources/__pycache__/abc.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/setuptools/_vendor/importlib_resources/__pycache__/readers.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/setuptools/_vendor/importlib_resources/__pycache__/simple.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/setuptools/_vendor/importlib_resources/_adapters.py create mode 100644 venv/lib/python3.11/site-packages/setuptools/_vendor/importlib_resources/_common.py create mode 100644 venv/lib/python3.11/site-packages/setuptools/_vendor/importlib_resources/_compat.py create mode 100644 venv/lib/python3.11/site-packages/setuptools/_vendor/importlib_resources/_itertools.py create mode 100644 venv/lib/python3.11/site-packages/setuptools/_vendor/importlib_resources/_legacy.py create mode 100644 venv/lib/python3.11/site-packages/setuptools/_vendor/importlib_resources/abc.py create mode 100644 venv/lib/python3.11/site-packages/setuptools/_vendor/importlib_resources/readers.py create mode 100644 venv/lib/python3.11/site-packages/setuptools/_vendor/importlib_resources/simple.py create mode 100644 venv/lib/python3.11/site-packages/setuptools/_vendor/jaraco/__init__.py create mode 100644 venv/lib/python3.11/site-packages/setuptools/_vendor/jaraco/__pycache__/__init__.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/setuptools/_vendor/jaraco/__pycache__/context.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/setuptools/_vendor/jaraco/__pycache__/functools.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/setuptools/_vendor/jaraco/context.py create mode 100644 venv/lib/python3.11/site-packages/setuptools/_vendor/jaraco/functools.py create mode 100644 venv/lib/python3.11/site-packages/setuptools/_vendor/jaraco/text/__init__.py create mode 100644 venv/lib/python3.11/site-packages/setuptools/_vendor/jaraco/text/__pycache__/__init__.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/setuptools/_vendor/more_itertools/__init__.py create mode 100644 venv/lib/python3.11/site-packages/setuptools/_vendor/more_itertools/__pycache__/__init__.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/setuptools/_vendor/more_itertools/__pycache__/more.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/setuptools/_vendor/more_itertools/__pycache__/recipes.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/setuptools/_vendor/more_itertools/more.py create mode 100644 venv/lib/python3.11/site-packages/setuptools/_vendor/more_itertools/recipes.py create mode 100644 venv/lib/python3.11/site-packages/setuptools/_vendor/ordered_set.py create mode 100644 venv/lib/python3.11/site-packages/setuptools/_vendor/packaging/__about__.py create mode 100644 venv/lib/python3.11/site-packages/setuptools/_vendor/packaging/__init__.py create mode 100644 venv/lib/python3.11/site-packages/setuptools/_vendor/packaging/__pycache__/__about__.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/setuptools/_vendor/packaging/__pycache__/__init__.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/setuptools/_vendor/packaging/__pycache__/_manylinux.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/setuptools/_vendor/packaging/__pycache__/_musllinux.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/setuptools/_vendor/packaging/__pycache__/_structures.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/setuptools/_vendor/packaging/__pycache__/markers.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/setuptools/_vendor/packaging/__pycache__/requirements.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/setuptools/_vendor/packaging/__pycache__/specifiers.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/setuptools/_vendor/packaging/__pycache__/tags.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/setuptools/_vendor/packaging/__pycache__/utils.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/setuptools/_vendor/packaging/__pycache__/version.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/setuptools/_vendor/packaging/_manylinux.py create mode 100644 venv/lib/python3.11/site-packages/setuptools/_vendor/packaging/_musllinux.py create mode 100644 venv/lib/python3.11/site-packages/setuptools/_vendor/packaging/_structures.py create mode 100644 venv/lib/python3.11/site-packages/setuptools/_vendor/packaging/markers.py create mode 100644 venv/lib/python3.11/site-packages/setuptools/_vendor/packaging/requirements.py create mode 100644 venv/lib/python3.11/site-packages/setuptools/_vendor/packaging/specifiers.py create mode 100644 venv/lib/python3.11/site-packages/setuptools/_vendor/packaging/tags.py create mode 100644 venv/lib/python3.11/site-packages/setuptools/_vendor/packaging/utils.py create mode 100644 venv/lib/python3.11/site-packages/setuptools/_vendor/packaging/version.py create mode 100644 venv/lib/python3.11/site-packages/setuptools/_vendor/pyparsing/__init__.py create mode 100644 venv/lib/python3.11/site-packages/setuptools/_vendor/pyparsing/__pycache__/__init__.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/setuptools/_vendor/pyparsing/__pycache__/actions.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/setuptools/_vendor/pyparsing/__pycache__/common.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/setuptools/_vendor/pyparsing/__pycache__/core.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/setuptools/_vendor/pyparsing/__pycache__/exceptions.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/setuptools/_vendor/pyparsing/__pycache__/helpers.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/setuptools/_vendor/pyparsing/__pycache__/results.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/setuptools/_vendor/pyparsing/__pycache__/testing.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/setuptools/_vendor/pyparsing/__pycache__/unicode.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/setuptools/_vendor/pyparsing/__pycache__/util.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/setuptools/_vendor/pyparsing/actions.py create mode 100644 venv/lib/python3.11/site-packages/setuptools/_vendor/pyparsing/common.py create mode 100644 venv/lib/python3.11/site-packages/setuptools/_vendor/pyparsing/core.py create mode 100644 venv/lib/python3.11/site-packages/setuptools/_vendor/pyparsing/diagram/__init__.py create mode 100644 venv/lib/python3.11/site-packages/setuptools/_vendor/pyparsing/diagram/__pycache__/__init__.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/setuptools/_vendor/pyparsing/exceptions.py create mode 100644 venv/lib/python3.11/site-packages/setuptools/_vendor/pyparsing/helpers.py create mode 100644 venv/lib/python3.11/site-packages/setuptools/_vendor/pyparsing/results.py create mode 100644 venv/lib/python3.11/site-packages/setuptools/_vendor/pyparsing/testing.py create mode 100644 venv/lib/python3.11/site-packages/setuptools/_vendor/pyparsing/unicode.py create mode 100644 venv/lib/python3.11/site-packages/setuptools/_vendor/pyparsing/util.py create mode 100644 venv/lib/python3.11/site-packages/setuptools/_vendor/tomli/__init__.py create mode 100644 venv/lib/python3.11/site-packages/setuptools/_vendor/tomli/__pycache__/__init__.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/setuptools/_vendor/tomli/__pycache__/_parser.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/setuptools/_vendor/tomli/__pycache__/_re.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/setuptools/_vendor/tomli/__pycache__/_types.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/setuptools/_vendor/tomli/_parser.py create mode 100644 venv/lib/python3.11/site-packages/setuptools/_vendor/tomli/_re.py create mode 100644 venv/lib/python3.11/site-packages/setuptools/_vendor/tomli/_types.py create mode 100644 venv/lib/python3.11/site-packages/setuptools/_vendor/typing_extensions.py create mode 100644 venv/lib/python3.11/site-packages/setuptools/_vendor/zipp.py create mode 100644 venv/lib/python3.11/site-packages/setuptools/archive_util.py create mode 100644 venv/lib/python3.11/site-packages/setuptools/build_meta.py create mode 100644 venv/lib/python3.11/site-packages/setuptools/cli-32.exe create mode 100644 venv/lib/python3.11/site-packages/setuptools/cli-64.exe create mode 100644 venv/lib/python3.11/site-packages/setuptools/cli-arm64.exe create mode 100644 venv/lib/python3.11/site-packages/setuptools/cli.exe create mode 100644 venv/lib/python3.11/site-packages/setuptools/command/__init__.py create mode 100644 venv/lib/python3.11/site-packages/setuptools/command/__pycache__/__init__.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/setuptools/command/__pycache__/alias.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/setuptools/command/__pycache__/bdist_egg.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/setuptools/command/__pycache__/bdist_rpm.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/setuptools/command/__pycache__/build.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/setuptools/command/__pycache__/build_clib.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/setuptools/command/__pycache__/build_ext.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/setuptools/command/__pycache__/build_py.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/setuptools/command/__pycache__/develop.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/setuptools/command/__pycache__/dist_info.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/setuptools/command/__pycache__/easy_install.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/setuptools/command/__pycache__/editable_wheel.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/setuptools/command/__pycache__/egg_info.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/setuptools/command/__pycache__/install.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/setuptools/command/__pycache__/install_egg_info.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/setuptools/command/__pycache__/install_lib.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/setuptools/command/__pycache__/install_scripts.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/setuptools/command/__pycache__/py36compat.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/setuptools/command/__pycache__/register.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/setuptools/command/__pycache__/rotate.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/setuptools/command/__pycache__/saveopts.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/setuptools/command/__pycache__/sdist.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/setuptools/command/__pycache__/setopt.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/setuptools/command/__pycache__/test.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/setuptools/command/__pycache__/upload.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/setuptools/command/__pycache__/upload_docs.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/setuptools/command/alias.py create mode 100644 venv/lib/python3.11/site-packages/setuptools/command/bdist_egg.py create mode 100644 venv/lib/python3.11/site-packages/setuptools/command/bdist_rpm.py create mode 100644 venv/lib/python3.11/site-packages/setuptools/command/build.py create mode 100644 venv/lib/python3.11/site-packages/setuptools/command/build_clib.py create mode 100644 venv/lib/python3.11/site-packages/setuptools/command/build_ext.py create mode 100644 venv/lib/python3.11/site-packages/setuptools/command/build_py.py create mode 100644 venv/lib/python3.11/site-packages/setuptools/command/develop.py create mode 100644 venv/lib/python3.11/site-packages/setuptools/command/dist_info.py create mode 100644 venv/lib/python3.11/site-packages/setuptools/command/easy_install.py create mode 100644 venv/lib/python3.11/site-packages/setuptools/command/editable_wheel.py create mode 100644 venv/lib/python3.11/site-packages/setuptools/command/egg_info.py create mode 100644 venv/lib/python3.11/site-packages/setuptools/command/install.py create mode 100644 venv/lib/python3.11/site-packages/setuptools/command/install_egg_info.py create mode 100644 venv/lib/python3.11/site-packages/setuptools/command/install_lib.py create mode 100644 venv/lib/python3.11/site-packages/setuptools/command/install_scripts.py create mode 100644 venv/lib/python3.11/site-packages/setuptools/command/launcher manifest.xml create mode 100644 venv/lib/python3.11/site-packages/setuptools/command/py36compat.py create mode 100644 venv/lib/python3.11/site-packages/setuptools/command/register.py create mode 100644 venv/lib/python3.11/site-packages/setuptools/command/rotate.py create mode 100644 venv/lib/python3.11/site-packages/setuptools/command/saveopts.py create mode 100644 venv/lib/python3.11/site-packages/setuptools/command/sdist.py create mode 100644 venv/lib/python3.11/site-packages/setuptools/command/setopt.py create mode 100644 venv/lib/python3.11/site-packages/setuptools/command/test.py create mode 100644 venv/lib/python3.11/site-packages/setuptools/command/upload.py create mode 100644 venv/lib/python3.11/site-packages/setuptools/command/upload_docs.py create mode 100644 venv/lib/python3.11/site-packages/setuptools/config/__init__.py create mode 100644 venv/lib/python3.11/site-packages/setuptools/config/__pycache__/__init__.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/setuptools/config/__pycache__/_apply_pyprojecttoml.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/setuptools/config/__pycache__/expand.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/setuptools/config/__pycache__/pyprojecttoml.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/setuptools/config/__pycache__/setupcfg.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/setuptools/config/_apply_pyprojecttoml.py create mode 100644 venv/lib/python3.11/site-packages/setuptools/config/_validate_pyproject/__init__.py create mode 100644 venv/lib/python3.11/site-packages/setuptools/config/_validate_pyproject/__pycache__/__init__.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/setuptools/config/_validate_pyproject/__pycache__/error_reporting.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/setuptools/config/_validate_pyproject/__pycache__/extra_validations.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/setuptools/config/_validate_pyproject/__pycache__/fastjsonschema_exceptions.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/setuptools/config/_validate_pyproject/__pycache__/fastjsonschema_validations.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/setuptools/config/_validate_pyproject/__pycache__/formats.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/setuptools/config/_validate_pyproject/error_reporting.py create mode 100644 venv/lib/python3.11/site-packages/setuptools/config/_validate_pyproject/extra_validations.py create mode 100644 venv/lib/python3.11/site-packages/setuptools/config/_validate_pyproject/fastjsonschema_exceptions.py create mode 100644 venv/lib/python3.11/site-packages/setuptools/config/_validate_pyproject/fastjsonschema_validations.py create mode 100644 venv/lib/python3.11/site-packages/setuptools/config/_validate_pyproject/formats.py create mode 100644 venv/lib/python3.11/site-packages/setuptools/config/expand.py create mode 100644 venv/lib/python3.11/site-packages/setuptools/config/pyprojecttoml.py create mode 100644 venv/lib/python3.11/site-packages/setuptools/config/setupcfg.py create mode 100644 venv/lib/python3.11/site-packages/setuptools/dep_util.py create mode 100644 venv/lib/python3.11/site-packages/setuptools/depends.py create mode 100644 venv/lib/python3.11/site-packages/setuptools/discovery.py create mode 100644 venv/lib/python3.11/site-packages/setuptools/dist.py create mode 100644 venv/lib/python3.11/site-packages/setuptools/errors.py create mode 100644 venv/lib/python3.11/site-packages/setuptools/extension.py create mode 100644 venv/lib/python3.11/site-packages/setuptools/extern/__init__.py create mode 100644 venv/lib/python3.11/site-packages/setuptools/extern/__pycache__/__init__.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/setuptools/glob.py create mode 100644 venv/lib/python3.11/site-packages/setuptools/gui-32.exe create mode 100644 venv/lib/python3.11/site-packages/setuptools/gui-64.exe create mode 100644 venv/lib/python3.11/site-packages/setuptools/gui-arm64.exe create mode 100644 venv/lib/python3.11/site-packages/setuptools/gui.exe create mode 100644 venv/lib/python3.11/site-packages/setuptools/installer.py create mode 100644 venv/lib/python3.11/site-packages/setuptools/launch.py create mode 100644 venv/lib/python3.11/site-packages/setuptools/logging.py create mode 100644 venv/lib/python3.11/site-packages/setuptools/monkey.py create mode 100644 venv/lib/python3.11/site-packages/setuptools/msvc.py create mode 100644 venv/lib/python3.11/site-packages/setuptools/namespaces.py create mode 100644 venv/lib/python3.11/site-packages/setuptools/package_index.py create mode 100644 venv/lib/python3.11/site-packages/setuptools/py34compat.py create mode 100644 venv/lib/python3.11/site-packages/setuptools/sandbox.py create mode 100644 venv/lib/python3.11/site-packages/setuptools/script (dev).tmpl create mode 100644 venv/lib/python3.11/site-packages/setuptools/script.tmpl create mode 100644 venv/lib/python3.11/site-packages/setuptools/unicode_utils.py create mode 100644 venv/lib/python3.11/site-packages/setuptools/version.py create mode 100644 venv/lib/python3.11/site-packages/setuptools/wheel.py create mode 100644 venv/lib/python3.11/site-packages/setuptools/windows_support.py create mode 100644 venv/lib/python3.11/site-packages/sse_starlette-3.2.0.dist-info/INSTALLER create mode 100644 venv/lib/python3.11/site-packages/sse_starlette-3.2.0.dist-info/METADATA create mode 100644 venv/lib/python3.11/site-packages/sse_starlette-3.2.0.dist-info/RECORD create mode 100644 venv/lib/python3.11/site-packages/sse_starlette-3.2.0.dist-info/WHEEL create mode 100644 venv/lib/python3.11/site-packages/sse_starlette-3.2.0.dist-info/licenses/AUTHORS create mode 100644 venv/lib/python3.11/site-packages/sse_starlette-3.2.0.dist-info/licenses/LICENSE create mode 100644 venv/lib/python3.11/site-packages/sse_starlette-3.2.0.dist-info/top_level.txt create mode 100644 venv/lib/python3.11/site-packages/sse_starlette/__init__.py create mode 100644 venv/lib/python3.11/site-packages/sse_starlette/__pycache__/__init__.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/sse_starlette/__pycache__/event.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/sse_starlette/__pycache__/sse.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/sse_starlette/event.py create mode 100644 venv/lib/python3.11/site-packages/sse_starlette/py.typed create mode 100644 venv/lib/python3.11/site-packages/sse_starlette/sse.py create mode 100644 venv/lib/python3.11/site-packages/starlette-0.52.1.dist-info/INSTALLER create mode 100644 venv/lib/python3.11/site-packages/starlette-0.52.1.dist-info/METADATA create mode 100644 venv/lib/python3.11/site-packages/starlette-0.52.1.dist-info/RECORD create mode 100644 venv/lib/python3.11/site-packages/starlette-0.52.1.dist-info/WHEEL create mode 100644 venv/lib/python3.11/site-packages/starlette-0.52.1.dist-info/licenses/LICENSE.md create mode 100644 venv/lib/python3.11/site-packages/starlette/__init__.py create mode 100644 venv/lib/python3.11/site-packages/starlette/__pycache__/__init__.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/starlette/__pycache__/_exception_handler.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/starlette/__pycache__/_utils.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/starlette/__pycache__/applications.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/starlette/__pycache__/authentication.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/starlette/__pycache__/background.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/starlette/__pycache__/concurrency.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/starlette/__pycache__/config.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/starlette/__pycache__/convertors.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/starlette/__pycache__/datastructures.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/starlette/__pycache__/endpoints.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/starlette/__pycache__/exceptions.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/starlette/__pycache__/formparsers.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/starlette/__pycache__/requests.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/starlette/__pycache__/responses.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/starlette/__pycache__/routing.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/starlette/__pycache__/schemas.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/starlette/__pycache__/staticfiles.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/starlette/__pycache__/status.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/starlette/__pycache__/templating.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/starlette/__pycache__/testclient.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/starlette/__pycache__/types.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/starlette/__pycache__/websockets.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/starlette/_exception_handler.py create mode 100644 venv/lib/python3.11/site-packages/starlette/_utils.py create mode 100644 venv/lib/python3.11/site-packages/starlette/applications.py create mode 100644 venv/lib/python3.11/site-packages/starlette/authentication.py create mode 100644 venv/lib/python3.11/site-packages/starlette/background.py create mode 100644 venv/lib/python3.11/site-packages/starlette/concurrency.py create mode 100644 venv/lib/python3.11/site-packages/starlette/config.py create mode 100644 venv/lib/python3.11/site-packages/starlette/convertors.py create mode 100644 venv/lib/python3.11/site-packages/starlette/datastructures.py create mode 100644 venv/lib/python3.11/site-packages/starlette/endpoints.py create mode 100644 venv/lib/python3.11/site-packages/starlette/exceptions.py create mode 100644 venv/lib/python3.11/site-packages/starlette/formparsers.py create mode 100644 venv/lib/python3.11/site-packages/starlette/middleware/__init__.py create mode 100644 venv/lib/python3.11/site-packages/starlette/middleware/__pycache__/__init__.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/starlette/middleware/__pycache__/authentication.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/starlette/middleware/__pycache__/base.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/starlette/middleware/__pycache__/cors.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/starlette/middleware/__pycache__/errors.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/starlette/middleware/__pycache__/exceptions.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/starlette/middleware/__pycache__/gzip.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/starlette/middleware/__pycache__/httpsredirect.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/starlette/middleware/__pycache__/sessions.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/starlette/middleware/__pycache__/trustedhost.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/starlette/middleware/__pycache__/wsgi.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/starlette/middleware/authentication.py create mode 100644 venv/lib/python3.11/site-packages/starlette/middleware/base.py create mode 100644 venv/lib/python3.11/site-packages/starlette/middleware/cors.py create mode 100644 venv/lib/python3.11/site-packages/starlette/middleware/errors.py create mode 100644 venv/lib/python3.11/site-packages/starlette/middleware/exceptions.py create mode 100644 venv/lib/python3.11/site-packages/starlette/middleware/gzip.py create mode 100644 venv/lib/python3.11/site-packages/starlette/middleware/httpsredirect.py create mode 100644 venv/lib/python3.11/site-packages/starlette/middleware/sessions.py create mode 100644 venv/lib/python3.11/site-packages/starlette/middleware/trustedhost.py create mode 100644 venv/lib/python3.11/site-packages/starlette/middleware/wsgi.py create mode 100644 venv/lib/python3.11/site-packages/starlette/py.typed create mode 100644 venv/lib/python3.11/site-packages/starlette/requests.py create mode 100644 venv/lib/python3.11/site-packages/starlette/responses.py create mode 100644 venv/lib/python3.11/site-packages/starlette/routing.py create mode 100644 venv/lib/python3.11/site-packages/starlette/schemas.py create mode 100644 venv/lib/python3.11/site-packages/starlette/staticfiles.py create mode 100644 venv/lib/python3.11/site-packages/starlette/status.py create mode 100644 venv/lib/python3.11/site-packages/starlette/templating.py create mode 100644 venv/lib/python3.11/site-packages/starlette/testclient.py create mode 100644 venv/lib/python3.11/site-packages/starlette/types.py create mode 100644 venv/lib/python3.11/site-packages/starlette/websockets.py create mode 100644 venv/lib/python3.11/site-packages/typing_extensions-4.15.0.dist-info/INSTALLER create mode 100644 venv/lib/python3.11/site-packages/typing_extensions-4.15.0.dist-info/METADATA create mode 100644 venv/lib/python3.11/site-packages/typing_extensions-4.15.0.dist-info/RECORD create mode 100644 venv/lib/python3.11/site-packages/typing_extensions-4.15.0.dist-info/WHEEL create mode 100644 venv/lib/python3.11/site-packages/typing_extensions-4.15.0.dist-info/licenses/LICENSE create mode 100644 venv/lib/python3.11/site-packages/typing_extensions.py create mode 100644 venv/lib/python3.11/site-packages/typing_inspection-0.4.2.dist-info/INSTALLER create mode 100644 venv/lib/python3.11/site-packages/typing_inspection-0.4.2.dist-info/METADATA create mode 100644 venv/lib/python3.11/site-packages/typing_inspection-0.4.2.dist-info/RECORD create mode 100644 venv/lib/python3.11/site-packages/typing_inspection-0.4.2.dist-info/WHEEL create mode 100644 venv/lib/python3.11/site-packages/typing_inspection-0.4.2.dist-info/licenses/LICENSE create mode 100644 venv/lib/python3.11/site-packages/typing_inspection/__init__.py create mode 100644 venv/lib/python3.11/site-packages/typing_inspection/__pycache__/__init__.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/typing_inspection/__pycache__/introspection.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/typing_inspection/__pycache__/typing_objects.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/typing_inspection/introspection.py create mode 100644 venv/lib/python3.11/site-packages/typing_inspection/py.typed create mode 100644 venv/lib/python3.11/site-packages/typing_inspection/typing_objects.py create mode 100644 venv/lib/python3.11/site-packages/typing_inspection/typing_objects.pyi create mode 100644 venv/lib/python3.11/site-packages/urllib3-2.6.3.dist-info/INSTALLER create mode 100644 venv/lib/python3.11/site-packages/urllib3-2.6.3.dist-info/METADATA create mode 100644 venv/lib/python3.11/site-packages/urllib3-2.6.3.dist-info/RECORD create mode 100644 venv/lib/python3.11/site-packages/urllib3-2.6.3.dist-info/WHEEL create mode 100644 venv/lib/python3.11/site-packages/urllib3-2.6.3.dist-info/licenses/LICENSE.txt create mode 100644 venv/lib/python3.11/site-packages/urllib3/__init__.py create mode 100644 venv/lib/python3.11/site-packages/urllib3/__pycache__/__init__.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/urllib3/__pycache__/_base_connection.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/urllib3/__pycache__/_collections.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/urllib3/__pycache__/_request_methods.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/urllib3/__pycache__/_version.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/urllib3/__pycache__/connection.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/urllib3/__pycache__/connectionpool.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/urllib3/__pycache__/exceptions.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/urllib3/__pycache__/fields.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/urllib3/__pycache__/filepost.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/urllib3/__pycache__/poolmanager.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/urllib3/__pycache__/response.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/urllib3/_base_connection.py create mode 100644 venv/lib/python3.11/site-packages/urllib3/_collections.py create mode 100644 venv/lib/python3.11/site-packages/urllib3/_request_methods.py create mode 100644 venv/lib/python3.11/site-packages/urllib3/_version.py create mode 100644 venv/lib/python3.11/site-packages/urllib3/connection.py create mode 100644 venv/lib/python3.11/site-packages/urllib3/connectionpool.py create mode 100644 venv/lib/python3.11/site-packages/urllib3/contrib/__init__.py create mode 100644 venv/lib/python3.11/site-packages/urllib3/contrib/__pycache__/__init__.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/urllib3/contrib/__pycache__/pyopenssl.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/urllib3/contrib/__pycache__/socks.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/urllib3/contrib/emscripten/__init__.py create mode 100644 venv/lib/python3.11/site-packages/urllib3/contrib/emscripten/__pycache__/__init__.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/urllib3/contrib/emscripten/__pycache__/connection.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/urllib3/contrib/emscripten/__pycache__/fetch.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/urllib3/contrib/emscripten/__pycache__/request.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/urllib3/contrib/emscripten/__pycache__/response.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/urllib3/contrib/emscripten/connection.py create mode 100644 venv/lib/python3.11/site-packages/urllib3/contrib/emscripten/emscripten_fetch_worker.js create mode 100644 venv/lib/python3.11/site-packages/urllib3/contrib/emscripten/fetch.py create mode 100644 venv/lib/python3.11/site-packages/urllib3/contrib/emscripten/request.py create mode 100644 venv/lib/python3.11/site-packages/urllib3/contrib/emscripten/response.py create mode 100644 venv/lib/python3.11/site-packages/urllib3/contrib/pyopenssl.py create mode 100644 venv/lib/python3.11/site-packages/urllib3/contrib/socks.py create mode 100644 venv/lib/python3.11/site-packages/urllib3/exceptions.py create mode 100644 venv/lib/python3.11/site-packages/urllib3/fields.py create mode 100644 venv/lib/python3.11/site-packages/urllib3/filepost.py create mode 100644 venv/lib/python3.11/site-packages/urllib3/http2/__init__.py create mode 100644 venv/lib/python3.11/site-packages/urllib3/http2/__pycache__/__init__.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/urllib3/http2/__pycache__/connection.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/urllib3/http2/__pycache__/probe.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/urllib3/http2/connection.py create mode 100644 venv/lib/python3.11/site-packages/urllib3/http2/probe.py create mode 100644 venv/lib/python3.11/site-packages/urllib3/poolmanager.py create mode 100644 venv/lib/python3.11/site-packages/urllib3/py.typed create mode 100644 venv/lib/python3.11/site-packages/urllib3/response.py create mode 100644 venv/lib/python3.11/site-packages/urllib3/util/__init__.py create mode 100644 venv/lib/python3.11/site-packages/urllib3/util/__pycache__/__init__.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/urllib3/util/__pycache__/connection.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/urllib3/util/__pycache__/proxy.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/urllib3/util/__pycache__/request.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/urllib3/util/__pycache__/response.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/urllib3/util/__pycache__/retry.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/urllib3/util/__pycache__/ssl_.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/urllib3/util/__pycache__/ssl_match_hostname.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/urllib3/util/__pycache__/ssltransport.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/urllib3/util/__pycache__/timeout.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/urllib3/util/__pycache__/url.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/urllib3/util/__pycache__/util.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/urllib3/util/__pycache__/wait.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/urllib3/util/connection.py create mode 100644 venv/lib/python3.11/site-packages/urllib3/util/proxy.py create mode 100644 venv/lib/python3.11/site-packages/urllib3/util/request.py create mode 100644 venv/lib/python3.11/site-packages/urllib3/util/response.py create mode 100644 venv/lib/python3.11/site-packages/urllib3/util/retry.py create mode 100644 venv/lib/python3.11/site-packages/urllib3/util/ssl_.py create mode 100644 venv/lib/python3.11/site-packages/urllib3/util/ssl_match_hostname.py create mode 100644 venv/lib/python3.11/site-packages/urllib3/util/ssltransport.py create mode 100644 venv/lib/python3.11/site-packages/urllib3/util/timeout.py create mode 100644 venv/lib/python3.11/site-packages/urllib3/util/url.py create mode 100644 venv/lib/python3.11/site-packages/urllib3/util/util.py create mode 100644 venv/lib/python3.11/site-packages/urllib3/util/wait.py create mode 100644 venv/lib/python3.11/site-packages/uvicorn-0.40.0.dist-info/INSTALLER create mode 100644 venv/lib/python3.11/site-packages/uvicorn-0.40.0.dist-info/METADATA create mode 100644 venv/lib/python3.11/site-packages/uvicorn-0.40.0.dist-info/RECORD create mode 100644 venv/lib/python3.11/site-packages/uvicorn-0.40.0.dist-info/WHEEL create mode 100644 venv/lib/python3.11/site-packages/uvicorn-0.40.0.dist-info/entry_points.txt create mode 100644 venv/lib/python3.11/site-packages/uvicorn-0.40.0.dist-info/licenses/LICENSE.md create mode 100644 venv/lib/python3.11/site-packages/uvicorn/__init__.py create mode 100644 venv/lib/python3.11/site-packages/uvicorn/__main__.py create mode 100644 venv/lib/python3.11/site-packages/uvicorn/__pycache__/__init__.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/uvicorn/__pycache__/__main__.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/uvicorn/__pycache__/_compat.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/uvicorn/__pycache__/_subprocess.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/uvicorn/__pycache__/_types.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/uvicorn/__pycache__/config.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/uvicorn/__pycache__/importer.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/uvicorn/__pycache__/logging.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/uvicorn/__pycache__/main.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/uvicorn/__pycache__/server.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/uvicorn/__pycache__/workers.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/uvicorn/_compat.py create mode 100644 venv/lib/python3.11/site-packages/uvicorn/_subprocess.py create mode 100644 venv/lib/python3.11/site-packages/uvicorn/_types.py create mode 100644 venv/lib/python3.11/site-packages/uvicorn/config.py create mode 100644 venv/lib/python3.11/site-packages/uvicorn/importer.py create mode 100644 venv/lib/python3.11/site-packages/uvicorn/lifespan/__init__.py create mode 100644 venv/lib/python3.11/site-packages/uvicorn/lifespan/__pycache__/__init__.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/uvicorn/lifespan/__pycache__/off.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/uvicorn/lifespan/__pycache__/on.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/uvicorn/lifespan/off.py create mode 100644 venv/lib/python3.11/site-packages/uvicorn/lifespan/on.py create mode 100644 venv/lib/python3.11/site-packages/uvicorn/logging.py create mode 100644 venv/lib/python3.11/site-packages/uvicorn/loops/__init__.py create mode 100644 venv/lib/python3.11/site-packages/uvicorn/loops/__pycache__/__init__.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/uvicorn/loops/__pycache__/asyncio.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/uvicorn/loops/__pycache__/auto.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/uvicorn/loops/__pycache__/uvloop.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/uvicorn/loops/asyncio.py create mode 100644 venv/lib/python3.11/site-packages/uvicorn/loops/auto.py create mode 100644 venv/lib/python3.11/site-packages/uvicorn/loops/uvloop.py create mode 100644 venv/lib/python3.11/site-packages/uvicorn/main.py create mode 100644 venv/lib/python3.11/site-packages/uvicorn/middleware/__init__.py create mode 100644 venv/lib/python3.11/site-packages/uvicorn/middleware/__pycache__/__init__.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/uvicorn/middleware/__pycache__/asgi2.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/uvicorn/middleware/__pycache__/message_logger.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/uvicorn/middleware/__pycache__/proxy_headers.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/uvicorn/middleware/__pycache__/wsgi.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/uvicorn/middleware/asgi2.py create mode 100644 venv/lib/python3.11/site-packages/uvicorn/middleware/message_logger.py create mode 100644 venv/lib/python3.11/site-packages/uvicorn/middleware/proxy_headers.py create mode 100644 venv/lib/python3.11/site-packages/uvicorn/middleware/wsgi.py create mode 100644 venv/lib/python3.11/site-packages/uvicorn/protocols/__init__.py create mode 100644 venv/lib/python3.11/site-packages/uvicorn/protocols/__pycache__/__init__.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/uvicorn/protocols/__pycache__/utils.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/uvicorn/protocols/http/__init__.py create mode 100644 venv/lib/python3.11/site-packages/uvicorn/protocols/http/__pycache__/__init__.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/uvicorn/protocols/http/__pycache__/auto.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/uvicorn/protocols/http/__pycache__/flow_control.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/uvicorn/protocols/http/__pycache__/h11_impl.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/uvicorn/protocols/http/__pycache__/httptools_impl.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/uvicorn/protocols/http/auto.py create mode 100644 venv/lib/python3.11/site-packages/uvicorn/protocols/http/flow_control.py create mode 100644 venv/lib/python3.11/site-packages/uvicorn/protocols/http/h11_impl.py create mode 100644 venv/lib/python3.11/site-packages/uvicorn/protocols/http/httptools_impl.py create mode 100644 venv/lib/python3.11/site-packages/uvicorn/protocols/utils.py create mode 100644 venv/lib/python3.11/site-packages/uvicorn/protocols/websockets/__init__.py create mode 100644 venv/lib/python3.11/site-packages/uvicorn/protocols/websockets/__pycache__/__init__.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/uvicorn/protocols/websockets/__pycache__/auto.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/uvicorn/protocols/websockets/__pycache__/websockets_impl.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/uvicorn/protocols/websockets/__pycache__/websockets_sansio_impl.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/uvicorn/protocols/websockets/__pycache__/wsproto_impl.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/uvicorn/protocols/websockets/auto.py create mode 100644 venv/lib/python3.11/site-packages/uvicorn/protocols/websockets/websockets_impl.py create mode 100644 venv/lib/python3.11/site-packages/uvicorn/protocols/websockets/websockets_sansio_impl.py create mode 100644 venv/lib/python3.11/site-packages/uvicorn/protocols/websockets/wsproto_impl.py create mode 100644 venv/lib/python3.11/site-packages/uvicorn/py.typed create mode 100644 venv/lib/python3.11/site-packages/uvicorn/server.py create mode 100644 venv/lib/python3.11/site-packages/uvicorn/supervisors/__init__.py create mode 100644 venv/lib/python3.11/site-packages/uvicorn/supervisors/__pycache__/__init__.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/uvicorn/supervisors/__pycache__/basereload.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/uvicorn/supervisors/__pycache__/multiprocess.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/uvicorn/supervisors/__pycache__/statreload.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/uvicorn/supervisors/__pycache__/watchfilesreload.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/uvicorn/supervisors/basereload.py create mode 100644 venv/lib/python3.11/site-packages/uvicorn/supervisors/multiprocess.py create mode 100644 venv/lib/python3.11/site-packages/uvicorn/supervisors/statreload.py create mode 100644 venv/lib/python3.11/site-packages/uvicorn/supervisors/watchfilesreload.py create mode 100644 venv/lib/python3.11/site-packages/uvicorn/workers.py create mode 120000 venv/lib64 create mode 100644 venv/pyvenv.cfg diff --git a/audit_report.txt b/audit_report.txt new file mode 100644 index 0000000..5feac81 --- /dev/null +++ b/audit_report.txt @@ -0,0 +1,610 @@ +--- Loading Billing Data --- +Loaded 1151 users from Billing. + +--- Auditing router-dimensi-dell (103.138.63.178) --- +Connecting to 103.138.63.178... +Found 1450 PPP secrets on router. +⚠️ FOUND 451 UNREGISTERED USERS (Exist on Router but NOT in Billing): + - 101100057014_dudiasaduddin (Profile: star_100) + - 1800006 (Profile: EXPIRED) + - 2000035 (Profile: EXPIRED) + - 2000037 (Profile: default) + - 2000134 (Profile: EXPIRED) + - 2000135 (Profile: EXPIRED) + - 2000136 (Profile: EXPIRED) + - 2000157 (Profile: EXPIRED) + - 220404165721 (Profile: star_10) + - 220404165722 (Profile: star_10) + - 220404165723 (Profile: star_10) + - 220430172116 (Profile: star_20) + - 220612165038 (Profile: EXPIRED) + - 220728201823 (Profile: EXPIRED) + - 220728201827 (Profile: gold_10) + - 220728201836 (Profile: EXPIRED) + - 220728201837 (Profile: EXPIRED) + - 221001182831 (Profile: EXPIRED) + - 221128130251 (Profile: EXPIRED) + - 221128130276 (Profile: EXPIRED) + - 221128130277 (Profile: EXPIRED) + - 221128130291 (Profile: EXPIRED) + - 230220191151 (Profile: EXPIRED) + - 230220191157 (Profile: EXPIRED) + - 230308162057 (Profile: EXPIRED) + - 600002 (Profile: star_10) + - Test2 (Profile: EXPIRED) + - abingglp (Profile: EXPIRED) + - adiokta (Profile: star_10) + - agusbudikbl (Profile: star_10) + - agusgm@dms.net (Profile: star_30) + - agusnovaglp@dms.net (Profile: star_10) + - aguspurnamadlp (Profile: star_10) + - akang@dms.net (Profile: bali_10) + - alifpnd (Profile: EXPIRED) + - ambaraglp (Profile: star_10) + - anbksmkn3 (Profile: star_200) + - ancigpnd@dms.net (Profile: star_10) + - andika (Profile: bali_10) + - andriani (Profile: gold_50) + - apeldlt (Profile: star_30) + - arbatech (Profile: bali_10) + - ardanaglp (Profile: bali_10) + - ardibiu (Profile: star_10) + - arikdlt (Profile: star_20) + - arnataglp (Profile: bali_10) + - asacemenggon (Profile: star_20) + - atenk (Profile: bali_10) + - awd (Profile: star_10) + - bagasdlp (Profile: bali_10) + - baglugbiu (Profile: bali_10) + - baharidlp (Profile: star_10) + - bajink (Profile: bali_10) + - balikreketglp (Profile: star_30) + - bantas@dms.net (Profile: bali_10) + - bazar (Profile: star_50) + - bellys@dms.net (Profile: bali_10) + - benikbiu (Profile: bali_10) + - betok (Profile: star_10) + - binbinbbk@dms.net (Profile: EXPIRED) + - bintangglp@dms.net (Profile: bali_10) + - biu (Profile: star_20) + - bms (Profile: star_200) + - brdlodtangluk (Profile: star_30) + - brdlp (Profile: bale_banjar) + - brgelulung (Profile: bali_20) + - brglp@dms.net (Profile: bali_50) + - brpekuwudan (Profile: bale_banjar) + - brpinda (Profile: bale_banjar) + - brtlb (Profile: star_20) + - bukanikbtn@dms.net (Profile: bali_20) + - bukidatlb (Profile: star_10) + - bulis@dms.net (Profile: hemat) + - bulustlb (Profile: star_10) + - bunitaglp (Profile: EXPIRED) + - butuhtbn@dms.net (Profile: bali_10) + - cakratlb (Profile: star_10) + - candysalon (Profile: star_20) + - capunkglp (Profile: star_10) + - caraka@dms.net (Profile: star_10) + - cctv@dms.net (Profile: EXPIRED) + - cctvtelabah (Profile: gold_20) + - cdataepon (Profile: star_100) + - cdatagpon (Profile: star_100) + - ceraki@dms.net (Profile: bali_20) + - china (Profile: lb_50) + - crazy (Profile: bali_10) + - dadap@dms.net (Profile: bali_10) + - danisglp@dms.net (Profile: bali_10) + - darmapnd (Profile: star_10) + - darmika (Profile: bali_10) + - dayuwikaglp (Profile: star_30) + - dedesound (Profile: star_20) + - dedokdlp@dms.net (Profile: bali_10) + - dekamaglp (Profile: bali_10) + - dekaryaplk@dms.net (Profile: bali_10) + - dekbongolpnd (Profile: hemat) + - dekcungvilla@dms.net (Profile: EXPIRED) + - dekdang@dms.net (Profile: bali_10) + - dekkhantreng@dms.net (Profile: EXPIRED) + - dekkungtlb (Profile: star_10) + - deklittlb@dms.net (Profile: EXPIRED) + - deknyong@dms.net (Profile: bali_10) + - dekpit@dms.net (Profile: EXPIRED) + - dektengkbl (Profile: star_10) + - denikpnd@dms.net (Profile: bali_10) + - desawisatasukawati (Profile: bali_50) + - devaglp (Profile: star_20) + - devibdil (Profile: lb_10) + - dewaastanaplk (Profile: bali_10) + - dewadlt@dms.net (Profile: bali_10) + - dewarakagrogak (Profile: star_20) + - dewatut (Profile: bali_10) + - diarmandlp (Profile: star_10) + - dimensi (Profile: bali_20) + - dinamo (Profile: bali_10) + - dipaglp (Profile: star_20) + - dmslive (Profile: star_150) + - doglesplk@dms.net (Profile: star_10) + - durus@dms.net (Profile: bali_10) + - duryaglp@dms.net (Profile: star_10) + - dwayubbn (Profile: star_20) + - dwcahyanigrokgak (Profile: star_10) + - dwipayanabiu (Profile: bali_10) + - ediputraglp (Profile: star_10) + - edo (Profile: free1) + - ega (Profile: gold_20) + - ega2 (Profile: bali_10) + - ekabubun (Profile: bali_10) + - ekaputrapnd@dms.net (Profile: star_20) + - ekayenikdlp (Profile: bali_10) + - elangglp (Profile: star_10) + - endopurnama (Profile: star_20) + - esaplk (Profile: EXPIRED) + - esterplk (Profile: star_20) + - fuller-duma (Profile: star_100) + - fuller2 (Profile: star_150) + - gajahglp (Profile: star_10) + - galuhplk (Profile: star_10) + - gap (Profile: bali_10) + - gedearibtnglp (Profile: star_10) + - genta (Profile: star_20) + - gilinkglp (Profile: star_10) + - gilinkglp@dms.net (Profile: bali_10) + - gpon (Profile: gold_10) + - gryakebon (Profile: bali_20) + - grykarangmas (Profile: star_10) + - gstpartaglp (Profile: star_10) + - gudigglp (Profile: star_10) + - gungdeskwti (Profile: star_30) + - gusajidwijanatlb (Profile: bali_20) + - gusajiputra (Profile: star_20) + - gusbaskara (Profile: hemat) + - gusdekawaglp2@dms.net (Profile: bali_10) + - guskoyiktlb (Profile: star_10) + - gusmanadyanta@dms.net (Profile: star_20) + - gusmanrai@dms.net (Profile: bali_20) + - gussantikaglp (Profile: star_30) + - gussasglp (Profile: star_20) + - gussucikatlb@dms.net (Profile: star_10) + - gussulasi (Profile: hemat) + - gussupartika (Profile: star_20) + - gussuryatlb (Profile: star_10) + - gustuanomtlb (Profile: star_10) + - gustut (Profile: bali_10) + - gusyusglp@dms.net (Profile: EXPIRED) + - hendrabiu (Profile: gold_10) + - hendrakbl (Profile: star_10) + - hsgq (Profile: star_200) + - huawei2 (Profile: star_20) + - huawei3 (Profile: star_20) + - iasantiniglp@dms.net (Profile: star_10) + - ibadyatmaja (Profile: star_20) + - ibukceluk@dms.net (Profile: bali_10) + - indahpratiwipnd (Profile: star_10) + - irmaglp@dms.net (Profile: bali_10) + - januadipnd (Profile: bali_10) + - jayen@dms.net (Profile: bali_10) + - jering@dms.net (Profile: bali_10) + - jikbatuh@dms.net (Profile: bali_20) + - jrokarin (Profile: star_20) + - jrosudita@dms.net (Profile: bali_10) + - kaderpnd (Profile: bali_10) + - kadusglp (Profile: bali_10) + - kalpagudang (Profile: bali_10) + - kalpawarung (Profile: star_20) + - kanpar (Profile: bali_20) + - kardana (Profile: gold_10) + - karglp (Profile: star_10) + - karianaglp (Profile: star_10) + - karibtn (Profile: star_10) + - kdaldidlp (Profile: bali_10) + - kdcahyanigll (Profile: star_20) + - kdmuliastraglp (Profile: bali_10) + - kelokplk (Profile: star_20) + - kembanggirang@dms.net (Profile: EXPIRED) + - kembarglp (Profile: star_10) + - kenanfree (Profile: free1) + - keniten@dms.net (Profile: star_30) + - keri@dms.net (Profile: star_10) + - ketutdarsa@dms.net (Profile: star_10) + - ketutsedana@dms.net (Profile: star_20) + - kmarimuliawantlb (Profile: star_10) + - kmgdeglp (Profile: bali_10) + - kmlasbtnbnd (Profile: star_20) + - kmmantepbnd (Profile: hemat) + - kmngsuparta@dms.net (Profile: bali_10) + - kmsrinadidlp (Profile: star_10) + - koliglp@dms.net (Profile: bali_10) + - komangratih@dms.net (Profile: star_10) + - komeng (Profile: star_10) + - korwilskwt (Profile: star_10) + - kost2tuadhi@kebalian (Profile: star_20) + - krishnatlb@dms.net (Profile: star_10) + - ksppermata (Profile: star_30) + - ksu-peninjoan (Profile: star_30) + - ksuglp (Profile: bali_10) + - ktmutikaglp@dms.net (Profile: bali_10) + - kubukayana (Profile: EXPIRED) + - kumaralilawati (Profile: star_20) + - kumpul (Profile: star_10) + - kuncungpnd (Profile: hemat) + - kunyukglp@dms.net (Profile: bali_10) + - kuwinktlb (Profile: star_20) + - laksanatlb (Profile: star_20) + - lazan@dms.net (Profile: star_20) + - lelutplk (Profile: star_10) + - lengotdlp (Profile: bali_20) + - liongbkl@dms.net (Profile: bali_10) + - liongdlp (Profile: bali_10) + - lionkglp (Profile: star_20) + - loletbiu (Profile: star_10) + - lpd@pinda (Profile: star_20) + - lpdbnd (Profile: bale_banjar) + - lpdsukawati (Profile: star_100) + - luhanaglp@dms.net (Profile: bali_10) + - lupuspnd (Profile: star_20) + - made (Profile: star_10) + - madebakat@dms.net (Profile: bali_10) + - mandoro (Profile: gold_10) + - mangatikplk@dms.net (Profile: bali_10) + - mangbayu@dms.net (Profile: bali_10) + - mangbracukglp (Profile: EXPIRED) + - mangcuk@dms.net (Profile: EXPIRED) + - mangcukglp@dms.net (Profile: bali_10) + - manggulik@dms.net (Profile: EXPIRED) + - mangnikpkwd (Profile: star_10) + - manlet@dms.net (Profile: bali_10) + - mannettlb@dms.net (Profile: star_20) + - mardawaglp (Profile: star_10) + - markunceluk (Profile: lb_10) + - mayundlp@dms.net (Profile: bali_10) + - mdbagiartapkwd (Profile: star_10) + - mdgriadlp (Profile: star_10) + - mdsangutbnd (Profile: star_10) + - mdtresnakbl@dms.net (Profile: bali_10) + - mdwidastrasanga (Profile: star_10) + - meranakbl (Profile: star_10) + - mira (Profile: star_30) + - mkbagiastraglp@dms.net (Profile: bali_10) + - mkbije-free-mawang (Profile: star_50) + - mkmerta@dms.net (Profile: star_20) + - mksanggra@dms.net (Profile: bali_20) + - mokbalikmecutan (Profile: bali_10) + - molenglp (Profile: star_10) + - mologkos@sanga (Profile: star_100) + - moyoglp@dms.net (Profile: star_20) + - mundrapnd@dms.net (Profile: star_10) + - murjapnd (Profile: bali_10) + - murjaya (Profile: bali_10) + - musahendrianbtn (Profile: EXPIRED) + - mustiari-warung-bonbiu (Profile: hemat) + - narkaglp (Profile: EXPIRED) + - ngurahokabiu (Profile: bali_10) + - ngurahokabiu@dms.net (Profile: bali_10) + - nogita-koroh-sakah (Profile: EXPIRED) + - nurananyoktlb (Profile: star_10) + - nuranikglp (Profile: bali_10) + - nuriantoglp@dms.net (Profile: bali_10) + - nvr (Profile: star_20) + - nyangkring (Profile: bali_10) + - nymsukrawanglp (Profile: star_20) + - nyomanmuliartabiu@dms.net (Profile: hemat) + - ogik@dms.net (Profile: star_10) + - okikglp (Profile: bali_10) + - openglp (Profile: bali_10) + - padmabali (Profile: star_30) + - pakbudi3 (Profile: star_50) + - pakgedeeka (Profile: star_30) + - pakirglp@dms.net (Profile: bali_10) + - pakjendradlp (Profile: star_10) + - pakkiuttlb@dms.net (Profile: bali_10) + - pakkurglp@dms.net (Profile: star_20) + - pakmandya@dms.net (Profile: star_10) + - pakmetabtn (Profile: EXPIRED) + - pakrinaglp@dms.net (Profile: bali_10) + - pakslametmecutan (Profile: bali_20) + - paktapamecutan (Profile: star_10) + - pakteja (Profile: bali_20) + - pakwayah (Profile: gold_10) + - pakyanpejeng (Profile: star_20) + - panderestudlp (Profile: star_20) + - pangalihgll (Profile: bali_20) + - panterglp (Profile: star_10) + - pantomin (Profile: bali_10) + - paramarthaglp@dms.net (Profile: star_20) + - pelaspnd@dms.net (Profile: EXPIRED) + - percobaanbnd@dms.net (Profile: hemat) + - petruktbn (Profile: star_10) + - pkbalikspd (Profile: free1) + - ponixglp (Profile: star_10) + - pranata-karang-bonbiu (Profile: star_20) + - prayoga (Profile: gold_10) + - ptsumaryantopkwd (Profile: star_10) + - puradesa@banda (Profile: hemat) + - purapandedlp (Profile: star_20) + - purauluncariksanga (Profile: bale_banjar) + - purnayasa@dms.net (Profile: bali_10) + - purwati@ppurnama (Profile: bali_10) + - puspaaman (Profile: bali_20) + - puspayudadlp (Profile: bali_10) + - putraadnyanadlp (Profile: gold_10) + - putraaluminium (Profile: star_20) + - putrawaringin (Profile: EXPIRED) + - putuadhi@dms.net (Profile: star_10) + - putuadhibbk2 (Profile: gold_10) + - putuadhisakura (Profile: gold_10) + - putuarix (Profile: bali_10) + - putumahendra2 (Profile: star_20) + - putumahendraglp@dms.net (Profile: bali_10) + - rahbegok (Profile: star_20) + - raiglp (Profile: star_10) + - raras (Profile: star_20) + - rastapnd@dms.net (Profile: bali_10) + - rb750 (Profile: star_100) + - renahome (Profile: bali_10) + - renaskubu2 (Profile: star_50) + - reniawatipnd (Profile: star_10) + - rianpnd@dms.net (Profile: star_10) + - richapnd (Profile: hemat) + - robot (Profile: bali_50) + - rosiantotlb (Profile: gold_10) + - ruditatlb (Profile: star_10) + - rugihpnd@dms.net (Profile: hemat) + - sadarpnd@dms.net (Profile: bali_10) + - salonlaksmi (Profile: star_20) + - sambukglp (Profile: gold_10) + - sanjayakbl (Profile: star_30) + - santikaglp (Profile: star_20) + - saris@dms.net (Profile: star_10) + - sarwagatah (Profile: star_50) + - sdn3 (Profile: star_100) + - sedanayoga (Profile: bali_10) + - semadiasaglp (Profile: star_20) + - seni (Profile: star_20) + - server (Profile: star_10) + - sinsinbatuan (Profile: bali_10) + - sinsindlp (Profile: bali_20) + - sman1sukawati (Profile: bali_150) + - smartmedia (Profile: star_20) + - smc (Profile: star_500) + - smctest (Profile: star_50) + - smkn3sukawati (Profile: star_500) + - sotongbnd (Profile: star_20) + - srisedana2 (Profile: star_20) + - storing@dms.net (Profile: star_20) + - suaja (Profile: bali_10) + - suardanadlp (Profile: star_10) + - suardanadlp@dms.net (Profile: bali_10) + - suartejapnd@dms.net (Profile: bali_10) + - sudadlp (Profile: bali_10) + - sudanapnd@dms.net (Profile: star_10) + - sudantapnd (Profile: lb_10) + - sudarsana2 (Profile: gold_10) + - sudarsanadlt@dms.net (Profile: bali_10) + - sudawadlp (Profile: star_10) + - sudiarsasaingkbl (Profile: EXPIRED) + - sudiartakbl (Profile: bali_10) + - sudibyapnd (Profile: lb_20) + - sudirmantlb (Profile: star_10) + - sujaglp@dms.net (Profile: bali_10) + - sukarma (Profile: free1) + - sukarmaplkfree (Profile: hemat) + - sukaryaplk (Profile: star_20) + - sukawanbbk (Profile: star_20) + - sukerta@dms.net (Profile: star_10) + - sukertapnd@dms.net (Profile: star_20) + - sukmadewaglp (Profile: bali_10) + - sukmajaya (Profile: star_10) + - sukmajaya2 (Profile: star_20) + - sulasdlp@dms.net (Profile: star_20) + - sunarsapnd@dms.net (Profile: bali_10) + - sunartidlp (Profile: star_10) + - sundentlb (Profile: star_10) + - suratakbl@dms.net (Profile: bali_10) + - suryapnd@dms.net (Profile: hemat) + - suta@dms.net (Profile: star_10) + - sutamakbl@dms.net (Profile: bali_10) + - suwandikatlb@dms.net (Profile: EXPIRED) + - tabig (Profile: bali_20) + - tahtaglp (Profile: star_10) + - tanpa-vlan (Profile: star_50) + - tarkapinda (Profile: bali_10) + - test (Profile: star_50) + - testhsgq (Profile: bali_20) + - tikdlp (Profile: star_10) + - tinkglp (Profile: bali_10) + - tisentlb (Profile: hemat) + - tomblosglp (Profile: star_10) + - tomiglp@dms.net (Profile: hemat) + - tudedlp (Profile: bali_10) + - tusuar@dms.net (Profile: bali_10) + - tutbar@dms.net (Profile: EXPIRED) + - tutbuhglp@dms.net (Profile: star_10) + - tutjaglp (Profile: bali_10) + - tutnix (Profile: bali_20) + - udimecutan (Profile: bali_10) + - ulambanten (Profile: star_20) + - vega (Profile: star_50) + - viana (Profile: star_50) + - wahyuglp (Profile: bali_10) + - wahyupkwd (Profile: star_20) + - wajibglp (Profile: star_10) + - wajibpnd (Profile: star_10) + - warplk@dms.net (Profile: bali_10) + - warungabyan (Profile: hemat) + - wawanglp (Profile: star_10) + - widhati (Profile: gold_50) + - widiastradlp@dms.net (Profile: bali_10) + - widiastratlb@dms.net (Profile: lb_10) + - wiguna (Profile: star_20) + - win10 (Profile: star_20) + - wira@dms.net (Profile: bali_10) + - wiskbl (Profile: star_10) + - wizglp (Profile: bali_10) + - wrbagas (Profile: star_10) + - wyrukapurnama (Profile: star_30) + - wysutakbl (Profile: star_10) + - xpon (Profile: star_100) + - yanbug@dms.net (Profile: star_10) + - yancandraglp (Profile: gold_10) + - yandiglp@dms.net (Profile: bali_10) + - yanjawa@dms.net (Profile: star_10) + - yanraka@dms.net (Profile: EXPIRED) + - yantih (Profile: star_20) + - yogaprasetya@dms.net (Profile: EXPIRED) + - yogatrijataglp@dms.net (Profile: bali_10) + - yogik (Profile: star_100) + - youngkypnd@dms.net (Profile: bali_10) + - yudapustaka (Profile: EXPIRED) + - yuliaripnd (Profile: star_20) + +--- Auditing ccr1036 (103.138.63.184) --- +Connecting to 103.138.63.184... +Found 300 PPP secrets on router. +⚠️ FOUND 147 UNREGISTERED USERS (Exist on Router but NOT in Billing): + - 220430172111 (Profile: star_20) + - abingglp (Profile: star_20) + - agusgm@dms.net (Profile: star_30) + - akang@dms.net (Profile: star_10) + - ancigpnd@dms.net (Profile: star_10) + - andika (Profile: star_10) + - andriani (Profile: star_50) + - arbatech (Profile: star_10) + - asacemenggon (Profile: star_20) + - astika-glp (Profile: star_20) + - atenk (Profile: star_10) + - balikreketglp (Profile: star_10) + - bellys@dms.net (Profile: star_10) + - bintangglp@dms.net (Profile: star_10) + - brpinda (Profile: bale_banjar) + - brtlb (Profile: star_20) + - bukanikbtn@dms.net (Profile: star_20) + - bukidatlb (Profile: star_10) + - bulis@dms.net (Profile: hemat) + - bulustlb (Profile: star_10) + - bupda-sukawati (Profile: star_20) + - cakratlb (Profile: star_10) + - caraka@dms.net (Profile: star_20) + - chandra-adnyana-glp (Profile: hemat) + - crazy (Profile: star_10) + - dadap@dms.net (Profile: star_10) + - darmapnd (Profile: star_10) + - darmika (Profile: star_10) + - dekbongolpnd (Profile: hemat) + - dekdang@dms.net (Profile: star_10) + - dekkungtlb (Profile: star_10) + - denikpnd@dms.net (Profile: star_10) + - dewadlt@dms.net (Profile: star_10) + - dewatut (Profile: star_10) + - dextra-free-mawangkelod-888 (Profile: star_20) + - dinamo (Profile: star_10) + - dipaglp (Profile: star_20) + - doglesplk@dms.net (Profile: star_10) + - edo (Profile: free1) + - ekaputrapnd@dms.net (Profile: star_20) + - gajahglp (Profile: star_10) + - gedearibtnglp (Profile: star_10) + - grykarangmas (Profile: star_10) + - gudigglp (Profile: star_10) + - gungdeskwti (Profile: star_30) + - gusajiputra (Profile: star_20) + - guskoyiktlb (Profile: star_10) + - gusmanadyanta@dms.net (Profile: star_20) + - gusmanrai@dms.net (Profile: star_20) + - iasantiniglp@dms.net (Profile: star_10) + - indahpratiwipnd (Profile: star_10) + - irmaglp@dms.net (Profile: star_10) + - januadipnd (Profile: star_10) + - jayen@dms.net (Profile: star_10) + - jikbatuh@dms.net (Profile: star_20) + - jrosudita@dms.net (Profile: star_10) + - kaderpnd (Profile: star_20) + - kanpar (Profile: star_20) + - karibtn (Profile: star_10) + - kembarglp (Profile: star_10) + - keniten@dms.net (Profile: star_10) + - keri@dms.net (Profile: star_10) + - ketutsedana@dms.net (Profile: star_20) + - kmgdeglp (Profile: star_10) + - kmngsuparta@dms.net (Profile: star_10) + - komeng (Profile: star_10) + - krishnatlb@dms.net (Profile: star_10) + - ksuglp (Profile: star_10) + - ktmutikaglp@dms.net (Profile: star_10) + - kuncungpnd (Profile: hemat) + - kunyukglp@dms.net (Profile: star_10) + - lpd@pinda (Profile: star_20) + - lupuspnd (Profile: star_20) + - madebakat@dms.net (Profile: star_10) + - mangbayu@dms.net (Profile: star_10) + - mangcukglp@dms.net (Profile: star_10) + - mannettlb@dms.net (Profile: star_20) + - mdtresnakbl@dms.net (Profile: star_20) + - mira (Profile: star_30) + - mkbagiastraglp@dms.net (Profile: star_10) + - mksanggra@dms.net (Profile: star_20) + - moyoglp@dms.net (Profile: star_20) + - mundrapnd@dms.net (Profile: star_10) + - murjapnd (Profile: star_10) + - murjaya (Profile: star_10) + - openglp (Profile: star_10) + - padmabali (Profile: star_30) + - pakirglp@dms.net (Profile: star_10) + - pakkiuttlb@dms.net (Profile: star_10) + - panterglp (Profile: star_10) + - pantomin (Profile: star_10) + - paramarthaglp@dms.net (Profile: star_20) + - pelaspnd@dms.net (Profile: star_20) + - prayoga (Profile: star_10) + - putraaluminium (Profile: star_20) + - putuadhi@dms.net (Profile: star_10) + - putuadhibbk2 (Profile: star_10) + - putuarix (Profile: star_10) + - putumahendraglp@dms.net (Profile: star_10) + - raiglp (Profile: star_10) + - rastapnd@dms.net (Profile: star_10) + - reniawatipnd (Profile: star_10) + - rianpnd@dms.net (Profile: star_10) + - richapnd (Profile: hemat) + - rikiglp@dms.net (Profile: star_10) + - rosiantotlb (Profile: star_10) + - rugihpnd@dms.net (Profile: hemat) + - rustawan-gll (Profile: star_20) + - sadarpnd@dms.net (Profile: star_10) + - salonlaksmi (Profile: star_30) + - sambukglp (Profile: star_10) + - saris@dms.net (Profile: star_10) + - semadiasaglp (Profile: star_20) + - smctest (Profile: star_20) + - storing@dms.net (Profile: star_20) + - suartejapnd@dms.net (Profile: star_10) + - sudanapnd@dms.net (Profile: star_10) + - sudantapnd (Profile: star_10) + - sudarsanadlt@dms.net (Profile: star_10) + - sudibyapnd (Profile: star_20) + - sudirmantlb (Profile: star_10) + - sukerta@dms.net (Profile: star_10) + - sukertapnd@dms.net (Profile: star_20) + - sunarsapnd@dms.net (Profile: star_10) + - sundentlb (Profile: star_10) + - suryapnd@dms.net (Profile: hemat) + - tahtaglp (Profile: star_10) + - tarkapinda (Profile: star_10) + - tisentlb (Profile: hemat) + - tusuar@dms.net (Profile: star_10) + - tutbar@dms.net (Profile: star_20) + - tutjaglp (Profile: star_10) + - tutnix (Profile: star_20) + - udimecutan (Profile: star_10) + - viana (Profile: star_50) + - wajibpnd (Profile: star_10) + - warplk@dms.net (Profile: EXPIRED) + - widhati (Profile: star_50) + - widiastratlb@dms.net (Profile: star_10) + - wira@dms.net (Profile: star_10) + - wirayasa-glp (Profile: hemat) + - yancandraglp (Profile: star_10) + - yandiglp@dms.net (Profile: star_10) + - yogatrijataglp@dms.net (Profile: star_10) + - youngkypnd@dms.net (Profile: star_10) + - yuda-hendrawan-banda (Profile: hemat) + - yuliaripnd (Profile: star_20) diff --git a/audit_users.py b/audit_users.py new file mode 100644 index 0000000..694fc0d --- /dev/null +++ b/audit_users.py @@ -0,0 +1,92 @@ +#!/usr/bin/env python3 +import sys +import os +import json +import requests +from requests.auth import HTTPBasicAuth + +# Add src to path to import BillingDatabase +sys.path.insert(0, os.path.dirname(os.path.abspath(__file__))) +from src.billing import BillingDatabase + +# Connection helper +def fetch_router_secrets(host, port, user, password): + url = f"http://{host}:{port}/rest/ppp/secret" + try: + print(f"Connecting to {host}...") + resp = requests.get(url, auth=HTTPBasicAuth(user, password), timeout=10) + resp.raise_for_status() + data = resp.json() + # Ensure list + return data if isinstance(data, list) else [data] if data else [] + except Exception as e: + print(f"Error fetching from {host}: {e}") + return [] + +def audit(): + # 1. Load Billing Data + print("--- Loading Billing Data ---") + config_path = os.path.join(os.path.dirname(__file__), 'config.json') + with open(config_path, 'r') as f: + config = json.load(f) + + billing = BillingDatabase(config['billing_databases']) + # Force refresh or just load? Let's use search with empty query to get all from cache + # If cache is old, audit might be wrong. But user didn't ask to refresh. + # However, for safety, let's try to get all from current snapshot server. + # Assuming 'dimensi' is the main one. + + # We need to know which billing server to compare against. Assuming ALL users in billing are valid. + # So we get all users from the default/active snapshot. + res = billing.search_customers("", limit=10000) # Get all + if not res['success']: + print(f"Failed to load billing data: {res.get('error')}") + return + + billing_users = {c.get('user_mikrotik') for c in res['customers'] if c.get('user_mikrotik')} + print(f"Loaded {len(billing_users)} users from Billing.") + + # 2. Define Routers + routers = [ + { + "name": "router-dimensi-dell", + "host": "103.138.63.178", + "port": 80, + "user": "chatbot", + "pass": "K0s0ng11@2026" + }, + { + "name": "ccr1036", + "host": "103.138.63.184", + "port": 80, + "user": "chatbot", + "pass": "K0s0ng11@2026" + } + ] + + # 3. Audit Each Router + for r in routers: + print(f"\n--- Auditing {r['name']} ({r['host']}) ---") + secrets = fetch_router_secrets(r['host'], r['port'], r['user'], r['pass']) + print(f"Found {len(secrets)} PPP secrets on router.") + + unregistered = [] + for s in secrets: + name = s.get('name') + # Ignore auto-generated or system users if any? usually simple check + if name and name not in billing_users: + unregistered.append(name) + + if unregistered: + print(f"⚠️ FOUND {len(unregistered)} UNREGISTERED USERS (Exist on Router but NOT in Billing):") + for u in sorted(unregistered): + # Maybe print profile too to see if it's a real user + # finding the secret object again for detail + sec_obj = next((x for x in secrets if x['name'] == u), {}) + profile = sec_obj.get('profile', '?') + print(f" - {u} (Profile: {profile})") + else: + print("✅ All users on this router are registered in billing.") + +if __name__ == "__main__": + audit() diff --git a/config.example.json b/config.example.json new file mode 100644 index 0000000..854d818 --- /dev/null +++ b/config.example.json @@ -0,0 +1,27 @@ +{ + "vultr": { + "api_key": "your_vultr_api_key_here" + }, + "server": { + "host": "127.0.0.1", + "port": 8000, + "log_level": "info" + }, + "billing_databases": { + "1": { + "alias": "Primary Server", + "host": "localhost", + "user": "root", + "pass": "password", + "name": "billing_db", + "port": 3306 + }, + "2": { + "alias": "Backup Server", + "host": "remote.host.com", + "user": "backup_user", + "pass": "backup_pass", + "name": "billing_backup" + } + } +} \ No newline at end of file diff --git a/config.json b/config.json new file mode 100644 index 0000000..8d9c2b1 --- /dev/null +++ b/config.json @@ -0,0 +1,50 @@ +{ + "isps": { + "dimensi": { + "alias": "Dimensi Media Solusi", + "billing": { + "host": "103.138.63.188", + "user": "chatbot", + "pass": "afSXzFn_tLlve(@H", + "name": "billinggold" + }, + "routers": { + "router-dimensi-dell": { + "host": "103.138.63.178", + "port": 80, + "user": "chatbot", + "pass": "K0s0ng11@2026" + }, + "ccr1036": { + "host": "103.138.63.184", + "port": 80, + "user": "chatbot", + "pass": "K0s0ng11@2026" + } + } + }, + "smc": { + "alias": "SMC", + "billing": { + "host": "139.180.190.239", + "user": "chatbot", + "pass": "afSXzFn_tLlve(@H", + "name": "smc" + }, + "routers": { + "router-smc": { + "host": "103.138.63.183", + "port": 81, + "user": "chatbot", + "pass": "K0s0ng11@2026" + }, + "router-smc-lb": { + "host": "103.138.63.183", + "port": 80, + "user": "chatbot", + "pass": "K0s0ng11@2026" + } + } + } + } +} \ No newline at end of file diff --git a/config.json.bak b/config.json.bak new file mode 100644 index 0000000..896fdfc --- /dev/null +++ b/config.json.bak @@ -0,0 +1,25 @@ +{ + "billing_databases": { + "dimensi": { + "alias": "Dimensi Media Solusi", + "host": "103.138.63.188", + "user": "chatbot", + "pass": "afSXzFn_tLlve(@H", + "name": "billinggold" + } + }, + "routers": { + "router-dimensi-dell": { + "host": "103.138.63.178", + "port": 80, + "user": "chatbot", + "pass": "K0s0ng11@2026" + }, + "ccr1036": { + "host": "103.138.63.184", + "port": 80, + "user": "chatbot", + "pass": "K0s0ng11@2026" + } + } +} \ No newline at end of file diff --git a/not_used/test_billing_tools.py b/not_used/test_billing_tools.py new file mode 100644 index 0000000..de449d3 --- /dev/null +++ b/not_used/test_billing_tools.py @@ -0,0 +1,80 @@ +#!/usr/bin/env python3 +""" +Test Billing Tools +""" + +import sys +import os +from dotenv import load_dotenv + +# Add src to path +sys.path.insert(0, os.path.dirname(os.path.abspath(__file__))) + +# Set dummy environment variables for testing +os.environ['BILLING_DB_1_HOST'] = 'localhost' +os.environ['BILLING_DB_1_USER'] = 'test' +os.environ['BILLING_DB_1_PASS'] = 'test' +os.environ['BILLING_DB_1_NAME'] = 'testdb' + +# Also test legacy format +os.environ['BILLING_DB_HOST'] = 'legacyhost' +os.environ['BILLING_DB_USER'] = 'legacyuser' +os.environ['BILLING_DB_PASS'] = 'legacypass' +os.environ['BILLING_DB_NAME'] = 'legacydb' + +from src.vultr_mcp.billing import BillingDatabase + +def test_billing_module(): + print("Testing BillingDatabase module...") + + try: + # Create instance + billing = BillingDatabase() + + # Test server loading + servers = billing.list_servers() + print(f"Loaded servers: {len(servers)}") + for server in servers: + print(f" Server {server['server_id']}: {server['host']} ({server['database']})") + + # Test get_server_config + config1 = billing.get_server_config('1') + print(f"\nServer 1 config: {config1['host'] if config1 else 'None'}") + + # Test server 2 (should not exist) + config2 = billing.get_server_config('2') + print(f"Server 2 config: {'Exists' if config2 else 'None'}") + + # Test check_connection (will fail but should handle gracefully) + print("\nTesting connection check (will fail due to dummy credentials):") + result = billing.check_connection('1') + print(f"Success: {result.get('success', False)}") + if not result.get('success'): + print(f"Error: {result.get('error', 'Unknown')}") + if result.get('hint'): + print(f"Hint: {result['hint']}") + + # Test search customers (should fail gracefully) + print("\nTesting search customers (will fail):") + search_result = billing.search_customers('test', '1', 5, 0) + print(f"Success: {search_result.get('success', False)}") + + # Test normalize phone number + print("\nTesting phone normalization:") + test_numbers = ['62812345678', '0812345678', '62812345678@c.us'] + for num in test_numbers: + normalized = billing._normalize_phone_number(num) + print(f" {num} -> {normalized}") + + print("\n✅ Billing module tests completed (expected failures due to dummy credentials)") + return True + + except Exception as e: + print(f"❌ Error testing billing module: {e}") + import traceback + traceback.print_exc() + return False + +if __name__ == '__main__': + success = test_billing_module() + sys.exit(0 if success else 1) \ No newline at end of file diff --git a/requirements.txt b/requirements.txt new file mode 100644 index 0000000..4c0d350 --- /dev/null +++ b/requirements.txt @@ -0,0 +1,4 @@ +mcp +pymysql +requests +python-dotenv diff --git a/run_server.sh b/run_server.sh new file mode 100755 index 0000000..b3de949 --- /dev/null +++ b/run_server.sh @@ -0,0 +1,5 @@ +#!/bin/bash +cd "$(dirname "$0")" +source venv/bin/activate +export PYTHONPATH=$PYTHONPATH:$(pwd) +python3 src/server.py diff --git a/src/__pycache__/billing.cpython-311.pyc b/src/__pycache__/billing.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..ab1e4943a2bc0d042e71b74f6d225fc4b95f8982 GIT binary patch literal 21533 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 BP+|Z8 literal 0 HcmV?d00001 diff --git a/src/billing.py b/src/billing.py new file mode 100644 index 0000000..de21965 --- /dev/null +++ b/src/billing.py @@ -0,0 +1,385 @@ +""" +Billing Database Module for MCP Server (with Snapshot Caching) +Provides tools to query customer billing databases with multi-server support. +Data is read from a local snapshot for performance; use refresh_snapshot() to update. +""" + +import json +import os +import re +from datetime import datetime +import pymysql +from pymysql import MySQLError +from typing import Dict, List, Any, Optional, Union + +# --- Constants --- +# Place cache in a dedicated, git-ignored directory +CACHE_DIR = os.path.join(os.path.dirname(__file__), '..', '..', '.cache') +CACHE_FILE_PREFIX = "billing_snapshot_" + +# Ensure cache directory exists +os.makedirs(CACHE_DIR, exist_ok=True) + + +class BillingDatabase: + """Billing database client with multi-server support and snapshot caching.""" + + def __init__(self, db_configs: Dict[str, Dict[str, str]]): + """ + Initialize with database configurations. + + Args: + db_configs: Dictionary of server configurations from config.json. + """ + self.servers = self._load_servers_from_config(db_configs) + + def _get_cache_path(self, server_id: str) -> str: + """Get the file path for a server's cache.""" + return os.path.join(CACHE_DIR, f"{CACHE_FILE_PREFIX}{server_id}.json") + + def _load_servers_from_config(self, db_configs: Dict) -> Dict[str, Dict[str, Any]]: + """Load and validate server configurations from a dictionary.""" + servers = {} + if not isinstance(db_configs, dict): + return {} + + for server_id, config in db_configs.items(): + required_keys = ['host', 'user', 'pass', 'name'] + if not all(key in config for key in required_keys): + print(f"Warning: Skipping server '{server_id}' due to missing configuration.") + continue + + servers[server_id] = { + 'host': config['host'], + 'user': config['user'], + 'password': config['pass'], + 'database': config['name'], + 'alias': config.get('alias', f"Server {server_id}"), + 'connect_timeout': config.get('connect_timeout', 10), + 'port': config.get('port', 3306) + } + return servers + + def _resolve_server_id(self, server_id: str) -> str: + """ + Resolve the server ID. + If 'server_id' exists, return it. + If 'server_id' is not found, but we only have one server configured, return that one. + This provides a robust fallback for single-server setups. + """ + if server_id in self.servers: + return server_id + + # If requested ID not found, and we have exactly one server, assume that's the one + if len(self.servers) == 1: + return list(self.servers.keys())[0] + + # If default "1" requested but not found (and we have multiple providers), return first + if server_id == "1" and self.servers: + return list(self.servers.keys())[0] + + return server_id + + def get_server_config(self, server_id: str = "1") -> Optional[Dict[str, Any]]: + """Get configuration for a specific server.""" + resolved_id = self._resolve_server_id(server_id) + return self.servers.get(resolved_id) + + def list_servers(self) -> List[Dict[str, Any]]: + """List all configured database servers and their cache status.""" + result = [] + for server_id, config in self.servers.items(): + cache_path = self._get_cache_path(server_id) + cache_status = "Not created" + last_updated = "N/A" + if os.path.exists(cache_path): + try: + with open(cache_path, 'r', encoding='utf-8') as f: + cache_data = json.load(f) + record_count = len(cache_data.get('customers', [])) + timestamp = cache_data.get('meta', {}).get('timestamp', 0) + last_updated = datetime.fromtimestamp(timestamp).strftime('%Y-%m-%d %H:%M:%S') + cache_status = f"Ready ({record_count} records)" + except (json.JSONDecodeError, KeyError): + cache_status = "Corrupted" + + result.append({ + 'server_id': server_id, + 'alias': config.get('alias', f"Server {server_id}"), + 'host': config['host'], + 'database': config['database'], + 'cache_status': cache_status, + 'cache_last_updated': last_updated + }) + return result + + def _get_connection(self, server_id: str = "1"): + """Create database connection.""" + resolved_id = self._resolve_server_id(server_id) + config = self.get_server_config(resolved_id) + if not config: + available = list(self.servers.keys()) + raise ValueError(f"Server '{server_id}' not found. Available servers: {available}") + + return pymysql.connect( + host=config['host'], + user=config['user'], + password=config['password'], + database=config['database'], + port=config.get('port', 3306), + connect_timeout=config.get('connect_timeout', 10), + charset='utf8mb4', + cursorclass=pymysql.cursors.DictCursor + ) + + def refresh_snapshot(self, server_id: str = "1") -> Dict[str, Any]: + """ + Fetch all customer data from the database and save it to a local snapshot. + This is a potentially long-running operation. + + Args: + server_id: The ID of the server to snapshot. + + Returns: + A dictionary with the result of the operation. + """ + resolved_id = self._resolve_server_id(server_id) + try: + connection = self._get_connection(resolved_id) + try: + with connection.cursor() as cursor: + # Comprehensive query to get all necessary data in one go + sql = """ + SELECT + c.*, + pi.name as package_name, + pi.price as package_price, + pi.description as package_description + FROM customer c + LEFT JOIN services s ON c.no_services = s.no_services + LEFT JOIN package_item pi ON s.item_id = pi.p_item_id + """ + cursor.execute(sql) + customers = cursor.fetchall() + + # Create snapshot data structure + snapshot_data = { + "meta": { + "server_id": server_id, + "timestamp": datetime.now().timestamp(), + "customer_count": len(customers) + }, + "customers": customers + } + + # Save to cache file + cache_path = self._get_cache_path(resolved_id) + with open(cache_path, 'w', encoding='utf-8') as f: + json.dump(snapshot_data, f, indent=2, default=str) # Use default=str for dates + + return { + "success": True, + "message": f"Snapshot for server '{resolved_id}' refreshed successfully.", + "customer_count": len(customers) + } + finally: + connection.close() + except (MySQLError, ValueError, IOError) as e: + return {"success": False, "error": str(e)} + + def _load_snapshot(self, server_id: str) -> List[Dict[str, Any]]: + """Load customer data from the local snapshot.""" + resolved_id = self._resolve_server_id(server_id) + cache_path = self._get_cache_path(resolved_id) + if not os.path.exists(cache_path): + raise FileNotFoundError(f"Snapshot for server '{server_id}' not found. " + f"Please run 'billing_refresh_snapshot' first.") + + with open(cache_path, 'r', encoding='utf-8') as f: + data = json.load(f) + return data.get('customers', []) + + def search_customers( + self, + search_query: str = "", + server_id: str = "1", + limit: int = 50, + offset: int = 0 + ) -> Dict[str, Any]: + """Search customers from the local snapshot.""" + resolved_id = self._resolve_server_id(server_id) + try: + customers = self._load_snapshot(resolved_id) + + filtered_customers = [] + if search_query: + # 1. Preprocess: Handle "natural" separation like "router 1" -> "router:1" + # We target specific known keys to avoid breaking names + search_query_proc = search_query + natural_keys = r'(router|mitra|status|profile|type|action)' + search_query_proc = re.sub(f'{natural_keys}\s+([a-zA-Z0-9_]+)', r'\1:\2', search_query_proc, flags=re.IGNORECASE) + + # 2. Preprocess: Remove common stopwords that might break "AND" search + # e.g. "Budi di router 1" -> "Budi router:1" (removing "di") + stopwords = r'\b(di|pada|in|at|with|by)\b' + search_query_proc = re.sub(stopwords, '', search_query_proc, flags=re.IGNORECASE) + + # Split query into tokens by space + tokens = search_query_proc.split() + + for cust in customers: + match_all = True + + for token in tokens: + if ':' in token: + # Handle field:value syntax + key, val = [p.strip() for p in token.split(':', 1)] + val_lower = val.lower() + field_val = str(cust.get(key, '')).lower() + + # Strict match for field:value + if field_val != val_lower: + match_all = False + break + else: + # Handle generic text search + token_lower = token.lower() + # Check multiple fields + if not (token_lower in str(cust.get('name', '')).lower() or + token_lower in str(cust.get('no_wa', '')).lower() or + token_lower in str(cust.get('address', '')).lower() or + token_lower in str(cust.get('user_profile', '')).lower()): + match_all = False + break + + if match_all: + filtered_customers.append(cust) + else: + filtered_customers = customers + + total = len(filtered_customers) + paginated_results = filtered_customers[offset : offset + limit] + + return { + 'success': True, + 'source': 'snapshot', + 'server_id': resolved_id, + 'search_query': search_query, + 'total': total, + 'limit': limit, + 'offset': offset, + 'customers': paginated_results + } + except (FileNotFoundError, json.JSONDecodeError, KeyError) as e: + return {'success': False, 'error': str(e)} + + def get_customer_details( + self, + customer_id: Optional[str] = None, + phone_number: Optional[str] = None, + server_id: str = "1" + ) -> Dict[str, Any]: + """Get detailed customer information from the local snapshot.""" + resolved_id = self._resolve_server_id(server_id) + if not customer_id and not phone_number: + return {'success': False, 'error': 'Either customer_id or phone_number must be provided'} + + try: + customers = self._load_snapshot(resolved_id) + + if customer_id: + for cust in customers: + if str(cust.get('no_services')) == customer_id: + return {'success': True, 'source': 'snapshot', 'customer': cust} + + elif phone_number: + search_numbers = self._normalize_phone_number(phone_number) + for cust in customers: + if cust.get('no_wa') in search_numbers: + return {'success': True, 'source': 'snapshot', 'customer': cust} + + return {'success': False, 'error': 'Customer not found in snapshot'} + except (FileNotFoundError, json.JSONDecodeError, KeyError) as e: + return {'success': False, 'error': str(e)} + + def _normalize_phone_number(self, phone_number: Optional[str]) -> List[str]: + """Normalize phone number for search with Indonesian format variations.""" + if not phone_number: + return [] + + p = phone_number.replace('@c.us', '') + search_numbers = [p] + if p.startswith('62'): + search_numbers.append('0' + p[2:]) + elif p.startswith('0'): + search_numbers.append('62' + p[1:]) + + return list(dict.fromkeys(search_numbers)) # Unique list + + def get_customer_summary(self, server_id: str = "1") -> Dict[str, Any]: + """Get customer statistics summary from the local snapshot.""" + resolved_id = self._resolve_server_id(server_id) + try: + customers = self._load_snapshot(resolved_id) + + total = len(customers) + status_distribution = {} + recent_count = 0 + thirty_days_ago = datetime.now().timestamp() - (30 * 24 * 3600) + + for cust in customers: + # Status distribution + status = cust.get('c_status', 'Unknown') + status_distribution[status] = status_distribution.get(status, 0) + 1 + + # Recent customers - assuming due_date is just the day of the month + # This logic is likely flawed without a full date. Let's assume a different logic + # For this example, we'll assume a 'created_at' field if it exists, otherwise skip + # Let's use `due_date` as day and assume current month/year for a rough idea. + # A proper implementation needs a full timestamp field. + + # Formatting status distribution with percentage + status_dist_list = [] + for status, count in sorted(status_distribution.items(), key=lambda item: item[1], reverse=True): + percentage = round((count / total) * 100, 2) if total > 0 else 0 + status_dist_list.append({'c_status': status, 'count': count, 'percentage': percentage}) + + return { + 'success': True, + 'source': 'snapshot', + 'server_id': resolved_id, + 'total_customers': total, + 'status_distribution': status_dist_list + } + except (FileNotFoundError, json.JSONDecodeError, KeyError) as e: + return {'success': False, 'error': str(e)} + + def check_connection(self, server_id: str = "1") -> Dict[str, Any]: + """ + Perform a LIVE check of the database connection, bypassing the cache. + """ + resolved_id = self._resolve_server_id(server_id) + try: + config = self.get_server_config(resolved_id) + if not config: + return {'success': False, 'error': f"Server '{resolved_id}' (requested: '{server_id}') not configured"} + + connection = self._get_connection(resolved_id) + try: + with connection.cursor() as cursor: + cursor.execute('SELECT VERSION() as version') + version_info = cursor.fetchone() + cursor.execute('SELECT COUNT(*) as customer_count FROM customer') + count_info = cursor.fetchone() + return { + 'success': True, + 'message': 'Live connection to database was successful.', + 'host': config['host'], + 'database': config['database'], + 'version': version_info['version'] if version_info else 'N/A', + 'customer_count': count_info['customer_count'] if count_info else 0 + } + finally: + connection.close() + except MySQLError as e: + return {'success': False, 'error': f"Live connection failed: {e}"} diff --git a/src/server.py b/src/server.py new file mode 100644 index 0000000..9a747b3 --- /dev/null +++ b/src/server.py @@ -0,0 +1,317 @@ +import asyncio +import os +import json +import traceback +from typing import Any, Dict, List, Optional +import requests +from requests.auth import HTTPBasicAuth + +from mcp.server import Server +from mcp.server.stdio import stdio_server +from mcp.types import Tool, TextContent, ImageContent, EmbeddedResource +from dotenv import load_dotenv + +# Add current directory to path to ensure imports work if run from everywhere +import sys +sys.path.insert(0, os.path.dirname(os.path.dirname(os.path.abspath(__file__)))) + +from src.billing import BillingDatabase + +# Load environment variables +load_dotenv() + +# Initialize Server +app = Server("billing-mcp") + +# Global instance +billing_db: Optional[BillingDatabase] = None +config: Dict[str, Any] = {} + +# Map to store which router belongs to which ISP (Billing DB Server ID) +# Format: { "router_host_or_name": "isp_server_id" } +router_isp_map: Dict[str, str] = {} +# Map to store resolved router config +# Format: { "router_host_or_name": { "host": "...", "port": ..., "user": "...", "pass": "..." } } +resolved_router_configs: Dict[str, Dict] = {} + +def load_config(): + global config, router_isp_map, resolved_router_configs + config_path = os.path.join(os.path.dirname(os.path.dirname(os.path.abspath(__file__))), 'config.json') + if os.path.exists(config_path): + with open(config_path, 'r') as f: + config = json.load(f) + + # Parse ISP configs to build router map + if 'isps' in config: + for isp_id, isp_data in config['isps'].items(): + routers = isp_data.get('routers', {}) + for r_name, r_conf in routers.items(): + # Map Name -> ISP ID + router_isp_map[r_name] = isp_id + # Map IP -> ISP ID + if 'host' in r_conf: + router_isp_map[r_conf['host']] = isp_id + + # Store resolved config for easy lookup + resolved_router_configs[r_name] = r_conf + if 'host' in r_conf: + resolved_router_configs[r_conf['host']] = r_conf + else: + print(f"Warning: Config file not found at {config_path}", file=sys.stderr) + +def get_billing_db() -> BillingDatabase: + global billing_db + if billing_db is None: + load_config() + + # Prepare configs for BillingDatabase + db_configs = {} + + if 'isps' in config: + # Flatten ISP structure for BillingDatabase + # BillingDatabase expects { "server_id": { config... } } + for isp_id, isp_data in config['isps'].items(): + if 'billing' in isp_data: + # Provide default alias if missing + billing_conf = isp_data['billing'] + if 'alias' not in billing_conf and 'alias' in isp_data: + billing_conf['alias'] = isp_data['alias'] + db_configs[isp_id] = billing_conf + elif 'billing_databases' in config: + # Legacy fallback + db_configs = config['billing_databases'] + + billing_db = BillingDatabase(db_configs) + + return billing_db + +@app.list_tools() +async def list_tools() -> List[Tool]: + return [ + Tool( + name="search_customers", + description="Search for customers in the billing database. Returns specific customer details only.", + inputSchema={ + "type": "object", + "properties": { + "query": { + "type": "string", + "description": "Search query (User ID, Name, or IP address). Leave empty to list all (use with limit)." + }, + "limit": { + "type": "integer", + "description": "Maximum number of results to return. Default is 5.", + "default": 5 + }, + "isp_name": { + "type": "string", + "description": "Optional: Specific ISP/Provider name to search (e.g. 'dimensi'). If omitted, defaults to first available." + } + }, + "required": ["query"] + } + ), + Tool( + name="refresh_billing_snapshot", + description="Force refresh of the local billing snapshot from the MySQL database.", + inputSchema={ + "type": "object", + "properties": { + "isp_name": { + "type": "string", + "description": "Optional: Specific ISP/Provider name to refresh. If omitted, refreshes default." + } + }, + } + ), + Tool( + name="audit_router_users", + description="Audit a MikroTik router to find users that are NOT in the billing database. Credentials will be auto-loaded from config if not provided.", + inputSchema={ + "type": "object", + "properties": { + "router_host": { + "type": "string", + "description": "IP address or Name of the router (e.g. 'ccr1036')" + }, + "router_port": { + "type": "integer", + "description": "Port of the router API (default 80)", + "default": 80 + }, + "router_user": { + "type": "string", + "description": "Username for router (optional if configured)" + }, + "router_pass": { + "type": "string", + "description": "Password for router (optional if configured)" + } + }, + "required": ["router_host"] + } + ) + ), + Tool( + name="list_system_info", + description="List all configured ISPs and their associated Routers.", + inputSchema={ + "type": "object", + "properties": {}, + } + ) + ] + +@app.call_tool() +async def call_tool(name: str, arguments: Any) -> List[TextContent | ImageContent | EmbeddedResource]: + db = get_billing_db() + + if name == "search_customers": + query = arguments.get("query", "") + limit = arguments.get("limit", 5) + isp_name = arguments.get("isp_name", "1") # Default logic in simple mode + + # If isp_name is not provided, BillingDatabase likely handles "1" as default fallback + # or we might want to iterate all if query is global? + # For now, let's stick to single server/default behavior unless specified. + + result = db.search_customers(query, server_id=isp_name, limit=limit) + + if not result['success']: + return [TextContent(type="text", text=f"Error searching ({isp_name}): {result.get('error')}")] + + customers = result.get('customers', []) + if not customers: + return [TextContent(type="text", text=f"No customers found matching '{query}'.")] + + # Format output + output_lines = [f"Found {len(customers)} customers (ISP: {result.get('server_id')}):"] + for c in customers: + # Format key details + details = [ + f"User: {c.get('user_mikrotik', 'N/A')}", + f"Name: {c.get('name', 'N/A')}", + f"Status: {c.get('c_status', 'N/A')}", + f"Address: {c.get('address', 'N/A')}", + f"Packet: {c.get('user_profile', 'N/A')}" + ] + output_lines.append(" | ".join(details)) + + return [TextContent(type="text", text="\n".join(output_lines))] + + elif name == "refresh_billing_snapshot": + isp_name = arguments.get("isp_name", "1") + success = db.refresh_snapshot(server_id=isp_name) + if success: + return [TextContent(type="text", text=f"Billing snapshot for '{isp_name}' refreshed successfully.")] + else: + return [TextContent(type="text", text="Failed to refresh billing snapshot. Check logs.")] + + elif name == "audit_router_users": + host_arg = arguments.get("router_host") + port = arguments.get("router_port", 80) + user = arguments.get("router_user") + password = arguments.get("router_pass") + + # 0. Identify ISP/Provider context + target_host = host_arg + isp_context = "1" # Default + + # Lookup in map + if host_arg in router_isp_map: + isp_context = router_isp_map[host_arg] + + # Auto-lookup credentials + if not user or not password: + found_config = resolved_router_configs.get(host_arg) + + # Fallback check internal routers config (legacy) + if not found_config and 'routers' in config: + if host_arg in config['routers']: + found_config = config['routers'][host_arg] + else: + for k, v in config['routers'].items(): + if v.get('host') == host_arg: + found_config = v + break + + if found_config: + user = found_config.get('user') + password = found_config.get('pass') + target_host = found_config.get('host', target_host) + port = found_config.get('port', port) + else: + return [TextContent(type="text", text=f"Error: Credentials not provided and router '{host_arg}' not found in config.")] + + # 1. Fetch router secrets + url = f"http://{target_host}:{port}/rest/ppp/secret" + try: + resp = requests.get(url, auth=HTTPBasicAuth(user, password), timeout=10) + resp.raise_for_status() + secrets_data = resp.json() + router_secrets = secrets_data if isinstance(secrets_data, list) else [secrets_data] if secrets_data else [] + except Exception as e: + return [TextContent(type="text", text=f"Error connecting to router {target_host}: {str(e)}")] + + # 2. Get Billing Users (FROM SPECIFIC ISP CONTEXT) + # We assume strict isolation: Only compare against the ISP's billing DB. + res = db.search_customers("", server_id=isp_context, limit=10000) + + if not res['success']: + return [TextContent(type="text", text=f"Error loading billing data for ISP '{isp_context}': {res.get('error')}")] + + billing_users = {c.get('user_mikrotik') for c in res['customers'] if c.get('user_mikrotik')} + + # 3. Compare + unregistered = [] + for s in router_secrets: + s_name = s.get('name') + if s_name and s_name not in billing_users: + unregistered.append(f"{s_name} (Profile: {s.get('profile', '?')})") + + if unregistered: + return [TextContent(type="text", text=f"Found {len(unregistered)} Unregistered Users on {target_host} (ISP: {isp_context}):\n" + "\n".join(sorted(unregistered)))] + else: + return [TextContent(type="text", text=f"All {len(router_secrets)} users on router {target_host} (ISP: {isp_context}) are valid.")] + + elif name == "list_system_info": + if 'isps' not in config: + return [TextContent(type="text", text="No ISPs configured (Legacy mode or empty config).")] + + output = ["Computed System Configuration:", ""] + + for isp_id, data in config['isps'].items(): + alias = data.get('alias', isp_id) + billing_host = data.get('billing', {}).get('host', 'N/A') + billing_db_name = data.get('billing', {}).get('name', 'N/A') + + output.append(f"🌐 ISP: {alias} (ID: {isp_id})") + output.append(f" Using Billing DB: {billing_db_name} @ {billing_host}") + + routers = data.get('routers', {}) + if routers: + output.append(" 📡 Registered Routers:") + for r_name, r_conf in routers.items(): + host = r_conf.get('host', 'N/A') + port = r_conf.get('port', 80) + output.append(f" - {r_name} ({host}:{port})") + else: + output.append(" ⚠️ No routers configured.") + + output.append("") # Empty line separator + + return [TextContent(type="text", text="\n".join(output))] + + raise ValueError(f"Unknown tool: {name}") + +async def main(): + # Run the server using stdin/stdout + async with stdio_server() as (read_stream, write_stream): + await app.run( + read_stream, + write_stream, + app.create_initialization_options() + ) + +if __name__ == "__main__": + asyncio.run(main()) diff --git a/test_billing_real.py b/test_billing_real.py new file mode 100644 index 0000000..80167f4 --- /dev/null +++ b/test_billing_real.py @@ -0,0 +1,112 @@ +#!/usr/bin/env python3 +""" +Test Billing Tools with real configuration from config.json +""" + +import sys +import os +import json + +# Add src to path +sys.path.insert(0, os.path.dirname(os.path.abspath(__file__))) + +from src.billing import BillingDatabase + +def load_real_config(): + config_path = os.path.join(os.path.dirname(__file__), 'config.json') + if not os.path.exists(config_path): + return None + with open(config_path, 'r') as f: + return json.load(f) + +def test_billing_with_real_config(): + print("Testing BillingDatabase with real configuration...") + + try: + config = load_real_config() + if not config: + print("❌ config.json not found") + return False + + db_configs = {} + if 'isps' in config: + for isp_id, isp_data in config['isps'].items(): + if 'billing' in isp_data: + conf = isp_data['billing'] + if 'alias' not in conf: + conf['alias'] = isp_data.get('alias', isp_id) + db_configs[isp_id] = conf + elif 'billing_databases' in config: + db_configs = config.get("billing_databases", {}) + + if not db_configs: + print("❌ No billing configuration (isps or billing_databases) found in config.json") + return False + + # Create instance + billing = BillingDatabase(db_configs) + + # Test server loading + servers = billing.list_servers() + print(f"Loaded servers: {len(servers)}") + for server in servers: + print(f" Server {server['server_id']}: {server['host']} ({server['database']})") + + if not servers: + print("❌ No servers configured") + return False + + # Test connection to first server + server_id = servers[0]['server_id'] + print(f"\nTesting connection to server {server_id}...") + + result = billing.check_connection(server_id) + + if result.get('success'): + print(f"✅ Connection successful!") + print(f" Host: {result.get('host')}") + print(f" Database: {result.get('database')}") + print(f" Version: {result.get('version')}") + print(f" Customer count: {result.get('customer_count')}") + + # Test search if connection successful + print("\nTesting search customers (first 5)...") + # Note: Search uses snapshot, so we might need to refresh first if no snapshot exists + # For test purposes, we will try to refresh snapshot first briefly + print(" Refusing snapshot first (may take a moment)...") + billing.refresh_snapshot(server_id) + + search_result = billing.search_customers('', server_id, 5, 0) + if search_result.get('success'): + print(f"✅ Search successful: {len(search_result.get('customers', []))} customers") + for i, customer in enumerate(search_result.get('customers', [])[:3]): # Show first 3 + print(f" {i+1}. {customer.get('name', 'N/A')} - {customer.get('no_wa', 'N/A')}") + else: + print(f"❌ Search failed: {search_result.get('error', 'Unknown error')}") + + # Test summary + print("\nTesting customer summary...") + summary_result = billing.get_customer_summary(server_id) + if summary_result.get('success'): + print(f"✅ Summary successful:") + print(f" Total customers: {summary_result.get('total_customers', 0)}") + if summary_result.get('status_distribution'): + for status in summary_result.get('status_distribution', [])[:5]: + print(f" - {status.get('c_status', 'N/A')}: {status.get('count', 0)} ({status.get('percentage', 0)}%)") + else: + print(f"❌ Summary failed: {summary_result.get('error', 'Unknown error')}") + + else: + print(f"❌ Connection failed: {result.get('error', 'Unknown error')}") + + return result.get('success', False) + + except Exception as e: + print(f"❌ Error testing billing module: {e}") + import traceback + traceback.print_exc() + return False + +if __name__ == '__main__': + success = test_billing_with_real_config() + sys.exit(0 if success else 1) \ No newline at end of file diff --git a/venv/bin/Activate.ps1 b/venv/bin/Activate.ps1 new file mode 100644 index 0000000..b49d77b --- /dev/null +++ b/venv/bin/Activate.ps1 @@ -0,0 +1,247 @@ +<# +.Synopsis +Activate a Python virtual environment for the current PowerShell session. + +.Description +Pushes the python executable for a virtual environment to the front of the +$Env:PATH environment variable and sets the prompt to signify that you are +in a Python virtual environment. Makes use of the command line switches as +well as the `pyvenv.cfg` file values present in the virtual environment. + +.Parameter VenvDir +Path to the directory that contains the virtual environment to activate. The +default value for this is the parent of the directory that the Activate.ps1 +script is located within. + +.Parameter Prompt +The prompt prefix to display when this virtual environment is activated. By +default, this prompt is the name of the virtual environment folder (VenvDir) +surrounded by parentheses and followed by a single space (ie. '(.venv) '). + +.Example +Activate.ps1 +Activates the Python virtual environment that contains the Activate.ps1 script. + +.Example +Activate.ps1 -Verbose +Activates the Python virtual environment that contains the Activate.ps1 script, +and shows extra information about the activation as it executes. + +.Example +Activate.ps1 -VenvDir C:\Users\MyUser\Common\.venv +Activates the Python virtual environment located in the specified location. + +.Example +Activate.ps1 -Prompt "MyPython" +Activates the Python virtual environment that contains the Activate.ps1 script, +and prefixes the current prompt with the specified string (surrounded in +parentheses) while the virtual environment is active. + +.Notes +On Windows, it may be required to enable this Activate.ps1 script by setting the +execution policy for the user. You can do this by issuing the following PowerShell +command: + +PS C:\> Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Scope CurrentUser + +For more information on Execution Policies: +https://go.microsoft.com/fwlink/?LinkID=135170 + +#> +Param( + [Parameter(Mandatory = $false)] + [String] + $VenvDir, + [Parameter(Mandatory = $false)] + [String] + $Prompt +) + +<# Function declarations --------------------------------------------------- #> + +<# +.Synopsis +Remove all shell session elements added by the Activate script, including the +addition of the virtual environment's Python executable from the beginning of +the PATH variable. + +.Parameter NonDestructive +If present, do not remove this function from the global namespace for the +session. + +#> +function global:deactivate ([switch]$NonDestructive) { + # Revert to original values + + # The prior prompt: + if (Test-Path -Path Function:_OLD_VIRTUAL_PROMPT) { + Copy-Item -Path Function:_OLD_VIRTUAL_PROMPT -Destination Function:prompt + Remove-Item -Path Function:_OLD_VIRTUAL_PROMPT + } + + # The prior PYTHONHOME: + if (Test-Path -Path Env:_OLD_VIRTUAL_PYTHONHOME) { + Copy-Item -Path Env:_OLD_VIRTUAL_PYTHONHOME -Destination Env:PYTHONHOME + Remove-Item -Path Env:_OLD_VIRTUAL_PYTHONHOME + } + + # The prior PATH: + if (Test-Path -Path Env:_OLD_VIRTUAL_PATH) { + Copy-Item -Path Env:_OLD_VIRTUAL_PATH -Destination Env:PATH + Remove-Item -Path Env:_OLD_VIRTUAL_PATH + } + + # Just remove the VIRTUAL_ENV altogether: + if (Test-Path -Path Env:VIRTUAL_ENV) { + Remove-Item -Path env:VIRTUAL_ENV + } + + # Just remove VIRTUAL_ENV_PROMPT altogether. + if (Test-Path -Path Env:VIRTUAL_ENV_PROMPT) { + Remove-Item -Path env:VIRTUAL_ENV_PROMPT + } + + # Just remove the _PYTHON_VENV_PROMPT_PREFIX altogether: + if (Get-Variable -Name "_PYTHON_VENV_PROMPT_PREFIX" -ErrorAction SilentlyContinue) { + Remove-Variable -Name _PYTHON_VENV_PROMPT_PREFIX -Scope Global -Force + } + + # Leave deactivate function in the global namespace if requested: + if (-not $NonDestructive) { + Remove-Item -Path function:deactivate + } +} + +<# +.Description +Get-PyVenvConfig parses the values from the pyvenv.cfg file located in the +given folder, and returns them in a map. + +For each line in the pyvenv.cfg file, if that line can be parsed into exactly +two strings separated by `=` (with any amount of whitespace surrounding the =) +then it is considered a `key = value` line. The left hand string is the key, +the right hand is the value. + +If the value starts with a `'` or a `"` then the first and last character is +stripped from the value before being captured. + +.Parameter ConfigDir +Path to the directory that contains the `pyvenv.cfg` file. +#> +function Get-PyVenvConfig( + [String] + $ConfigDir +) { + Write-Verbose "Given ConfigDir=$ConfigDir, obtain values in pyvenv.cfg" + + # Ensure the file exists, and issue a warning if it doesn't (but still allow the function to continue). + $pyvenvConfigPath = Join-Path -Resolve -Path $ConfigDir -ChildPath 'pyvenv.cfg' -ErrorAction Continue + + # An empty map will be returned if no config file is found. + $pyvenvConfig = @{ } + + if ($pyvenvConfigPath) { + + Write-Verbose "File exists, parse `key = value` lines" + $pyvenvConfigContent = Get-Content -Path $pyvenvConfigPath + + $pyvenvConfigContent | ForEach-Object { + $keyval = $PSItem -split "\s*=\s*", 2 + if ($keyval[0] -and $keyval[1]) { + $val = $keyval[1] + + # Remove extraneous quotations around a string value. + if ("'""".Contains($val.Substring(0, 1))) { + $val = $val.Substring(1, $val.Length - 2) + } + + $pyvenvConfig[$keyval[0]] = $val + Write-Verbose "Adding Key: '$($keyval[0])'='$val'" + } + } + } + return $pyvenvConfig +} + + +<# Begin Activate script --------------------------------------------------- #> + +# Determine the containing directory of this script +$VenvExecPath = Split-Path -Parent $MyInvocation.MyCommand.Definition +$VenvExecDir = Get-Item -Path $VenvExecPath + +Write-Verbose "Activation script is located in path: '$VenvExecPath'" +Write-Verbose "VenvExecDir Fullname: '$($VenvExecDir.FullName)" +Write-Verbose "VenvExecDir Name: '$($VenvExecDir.Name)" + +# Set values required in priority: CmdLine, ConfigFile, Default +# First, get the location of the virtual environment, it might not be +# VenvExecDir if specified on the command line. +if ($VenvDir) { + Write-Verbose "VenvDir given as parameter, using '$VenvDir' to determine values" +} +else { + Write-Verbose "VenvDir not given as a parameter, using parent directory name as VenvDir." + $VenvDir = $VenvExecDir.Parent.FullName.TrimEnd("\\/") + Write-Verbose "VenvDir=$VenvDir" +} + +# Next, read the `pyvenv.cfg` file to determine any required value such +# as `prompt`. +$pyvenvCfg = Get-PyVenvConfig -ConfigDir $VenvDir + +# Next, set the prompt from the command line, or the config file, or +# just use the name of the virtual environment folder. +if ($Prompt) { + Write-Verbose "Prompt specified as argument, using '$Prompt'" +} +else { + Write-Verbose "Prompt not specified as argument to script, checking pyvenv.cfg value" + if ($pyvenvCfg -and $pyvenvCfg['prompt']) { + Write-Verbose " Setting based on value in pyvenv.cfg='$($pyvenvCfg['prompt'])'" + $Prompt = $pyvenvCfg['prompt']; + } + else { + Write-Verbose " Setting prompt based on parent's directory's name. (Is the directory name passed to venv module when creating the virtual environment)" + Write-Verbose " Got leaf-name of $VenvDir='$(Split-Path -Path $venvDir -Leaf)'" + $Prompt = Split-Path -Path $venvDir -Leaf + } +} + +Write-Verbose "Prompt = '$Prompt'" +Write-Verbose "VenvDir='$VenvDir'" + +# Deactivate any currently active virtual environment, but leave the +# deactivate function in place. +deactivate -nondestructive + +# Now set the environment variable VIRTUAL_ENV, used by many tools to determine +# that there is an activated venv. +$env:VIRTUAL_ENV = $VenvDir + +if (-not $Env:VIRTUAL_ENV_DISABLE_PROMPT) { + + Write-Verbose "Setting prompt to '$Prompt'" + + # Set the prompt to include the env name + # Make sure _OLD_VIRTUAL_PROMPT is global + function global:_OLD_VIRTUAL_PROMPT { "" } + Copy-Item -Path function:prompt -Destination function:_OLD_VIRTUAL_PROMPT + New-Variable -Name _PYTHON_VENV_PROMPT_PREFIX -Description "Python virtual environment prompt prefix" -Scope Global -Option ReadOnly -Visibility Public -Value $Prompt + + function global:prompt { + Write-Host -NoNewline -ForegroundColor Green "($_PYTHON_VENV_PROMPT_PREFIX) " + _OLD_VIRTUAL_PROMPT + } + $env:VIRTUAL_ENV_PROMPT = $Prompt +} + +# Clear PYTHONHOME +if (Test-Path -Path Env:PYTHONHOME) { + Copy-Item -Path Env:PYTHONHOME -Destination Env:_OLD_VIRTUAL_PYTHONHOME + Remove-Item -Path Env:PYTHONHOME +} + +# Add the venv to the PATH +Copy-Item -Path Env:PATH -Destination Env:_OLD_VIRTUAL_PATH +$Env:PATH = "$VenvExecDir$([System.IO.Path]::PathSeparator)$Env:PATH" diff --git a/venv/bin/activate b/venv/bin/activate new file mode 100644 index 0000000..281b2c0 --- /dev/null +++ b/venv/bin/activate @@ -0,0 +1,69 @@ +# This file must be used with "source bin/activate" *from bash* +# you cannot run it directly + +deactivate () { + # reset old environment variables + if [ -n "${_OLD_VIRTUAL_PATH:-}" ] ; then + PATH="${_OLD_VIRTUAL_PATH:-}" + export PATH + unset _OLD_VIRTUAL_PATH + fi + if [ -n "${_OLD_VIRTUAL_PYTHONHOME:-}" ] ; then + PYTHONHOME="${_OLD_VIRTUAL_PYTHONHOME:-}" + export PYTHONHOME + unset _OLD_VIRTUAL_PYTHONHOME + fi + + # This should detect bash and zsh, which have a hash command that must + # be called to get it to forget past commands. Without forgetting + # past commands the $PATH changes we made may not be respected + if [ -n "${BASH:-}" -o -n "${ZSH_VERSION:-}" ] ; then + hash -r 2> /dev/null + fi + + if [ -n "${_OLD_VIRTUAL_PS1:-}" ] ; then + PS1="${_OLD_VIRTUAL_PS1:-}" + export PS1 + unset _OLD_VIRTUAL_PS1 + fi + + unset VIRTUAL_ENV + unset VIRTUAL_ENV_PROMPT + if [ ! "${1:-}" = "nondestructive" ] ; then + # Self destruct! + unset -f deactivate + fi +} + +# unset irrelevant variables +deactivate nondestructive + +VIRTUAL_ENV=/home/wartana/myApp/billing-mcp/venv +export VIRTUAL_ENV + +_OLD_VIRTUAL_PATH="$PATH" +PATH="$VIRTUAL_ENV/"bin":$PATH" +export PATH + +# unset PYTHONHOME if set +# this will fail if PYTHONHOME is set to the empty string (which is bad anyway) +# could use `if (set -u; : $PYTHONHOME) ;` in bash +if [ -n "${PYTHONHOME:-}" ] ; then + _OLD_VIRTUAL_PYTHONHOME="${PYTHONHOME:-}" + unset PYTHONHOME +fi + +if [ -z "${VIRTUAL_ENV_DISABLE_PROMPT:-}" ] ; then + _OLD_VIRTUAL_PS1="${PS1:-}" + PS1='(venv) '"${PS1:-}" + export PS1 + VIRTUAL_ENV_PROMPT='(venv) ' + export VIRTUAL_ENV_PROMPT +fi + +# This should detect bash and zsh, which have a hash command that must +# be called to get it to forget past commands. Without forgetting +# past commands the $PATH changes we made may not be respected +if [ -n "${BASH:-}" -o -n "${ZSH_VERSION:-}" ] ; then + hash -r 2> /dev/null +fi diff --git a/venv/bin/activate.csh b/venv/bin/activate.csh new file mode 100644 index 0000000..cf23c46 --- /dev/null +++ b/venv/bin/activate.csh @@ -0,0 +1,26 @@ +# This file must be used with "source bin/activate.csh" *from csh*. +# You cannot run it directly. +# Created by Davide Di Blasi . +# Ported to Python 3.3 venv by Andrew Svetlov + +alias deactivate 'test $?_OLD_VIRTUAL_PATH != 0 && setenv PATH "$_OLD_VIRTUAL_PATH" && unset _OLD_VIRTUAL_PATH; rehash; test $?_OLD_VIRTUAL_PROMPT != 0 && set prompt="$_OLD_VIRTUAL_PROMPT" && unset _OLD_VIRTUAL_PROMPT; unsetenv VIRTUAL_ENV; unsetenv VIRTUAL_ENV_PROMPT; test "\!:*" != "nondestructive" && unalias deactivate' + +# Unset irrelevant variables. +deactivate nondestructive + +setenv VIRTUAL_ENV /home/wartana/myApp/billing-mcp/venv + +set _OLD_VIRTUAL_PATH="$PATH" +setenv PATH "$VIRTUAL_ENV/"bin":$PATH" + + +set _OLD_VIRTUAL_PROMPT="$prompt" + +if (! "$?VIRTUAL_ENV_DISABLE_PROMPT") then + set prompt = '(venv) '"$prompt" + setenv VIRTUAL_ENV_PROMPT '(venv) ' +endif + +alias pydoc python -m pydoc + +rehash diff --git a/venv/bin/activate.fish b/venv/bin/activate.fish new file mode 100644 index 0000000..13acb6b --- /dev/null +++ b/venv/bin/activate.fish @@ -0,0 +1,69 @@ +# This file must be used with "source /bin/activate.fish" *from fish* +# (https://fishshell.com/); you cannot run it directly. + +function deactivate -d "Exit virtual environment and return to normal shell environment" + # reset old environment variables + if test -n "$_OLD_VIRTUAL_PATH" + set -gx PATH $_OLD_VIRTUAL_PATH + set -e _OLD_VIRTUAL_PATH + end + if test -n "$_OLD_VIRTUAL_PYTHONHOME" + set -gx PYTHONHOME $_OLD_VIRTUAL_PYTHONHOME + set -e _OLD_VIRTUAL_PYTHONHOME + end + + if test -n "$_OLD_FISH_PROMPT_OVERRIDE" + set -e _OLD_FISH_PROMPT_OVERRIDE + # prevents error when using nested fish instances (Issue #93858) + if functions -q _old_fish_prompt + functions -e fish_prompt + functions -c _old_fish_prompt fish_prompt + functions -e _old_fish_prompt + end + end + + set -e VIRTUAL_ENV + set -e VIRTUAL_ENV_PROMPT + if test "$argv[1]" != "nondestructive" + # Self-destruct! + functions -e deactivate + end +end + +# Unset irrelevant variables. +deactivate nondestructive + +set -gx VIRTUAL_ENV /home/wartana/myApp/billing-mcp/venv + +set -gx _OLD_VIRTUAL_PATH $PATH +set -gx PATH "$VIRTUAL_ENV/"bin $PATH + +# Unset PYTHONHOME if set. +if set -q PYTHONHOME + set -gx _OLD_VIRTUAL_PYTHONHOME $PYTHONHOME + set -e PYTHONHOME +end + +if test -z "$VIRTUAL_ENV_DISABLE_PROMPT" + # fish uses a function instead of an env var to generate the prompt. + + # Save the current fish_prompt function as the function _old_fish_prompt. + functions -c fish_prompt _old_fish_prompt + + # With the original prompt function renamed, we can override with our own. + function fish_prompt + # Save the return status of the last command. + 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) ' (set_color normal) + + # Restore the return status of the previous command. + echo "exit $old_status" | . + # Output the original/"old" prompt. + _old_fish_prompt + end + + set -gx _OLD_FISH_PROMPT_OVERRIDE "$VIRTUAL_ENV" + set -gx VIRTUAL_ENV_PROMPT '(venv) ' +end diff --git a/venv/bin/dotenv b/venv/bin/dotenv new file mode 100755 index 0000000..8e3b993 --- /dev/null +++ b/venv/bin/dotenv @@ -0,0 +1,8 @@ +#!/home/wartana/myApp/billing-mcp/venv/bin/python3 +# -*- coding: utf-8 -*- +import re +import sys +from dotenv.__main__ import cli +if __name__ == '__main__': + sys.argv[0] = re.sub(r'(-script\.pyw|\.exe)?$', '', sys.argv[0]) + sys.exit(cli()) diff --git a/venv/bin/httpx b/venv/bin/httpx new file mode 100755 index 0000000..a950a38 --- /dev/null +++ b/venv/bin/httpx @@ -0,0 +1,8 @@ +#!/home/wartana/myApp/billing-mcp/venv/bin/python3 +# -*- coding: utf-8 -*- +import re +import sys +from httpx import main +if __name__ == '__main__': + sys.argv[0] = re.sub(r'(-script\.pyw|\.exe)?$', '', sys.argv[0]) + sys.exit(main()) diff --git a/venv/bin/jsonschema b/venv/bin/jsonschema new file mode 100755 index 0000000..68c0cf0 --- /dev/null +++ b/venv/bin/jsonschema @@ -0,0 +1,8 @@ +#!/home/wartana/myApp/billing-mcp/venv/bin/python3 +# -*- coding: utf-8 -*- +import re +import sys +from jsonschema.cli import main +if __name__ == '__main__': + sys.argv[0] = re.sub(r'(-script\.pyw|\.exe)?$', '', sys.argv[0]) + sys.exit(main()) diff --git a/venv/bin/mcp b/venv/bin/mcp new file mode 100755 index 0000000..c51c873 --- /dev/null +++ b/venv/bin/mcp @@ -0,0 +1,8 @@ +#!/home/wartana/myApp/billing-mcp/venv/bin/python3 +# -*- coding: utf-8 -*- +import re +import sys +from mcp.cli import app +if __name__ == '__main__': + sys.argv[0] = re.sub(r'(-script\.pyw|\.exe)?$', '', sys.argv[0]) + sys.exit(app()) diff --git a/venv/bin/normalizer b/venv/bin/normalizer new file mode 100755 index 0000000..f68d2e6 --- /dev/null +++ b/venv/bin/normalizer @@ -0,0 +1,8 @@ +#!/home/wartana/myApp/billing-mcp/venv/bin/python3 +# -*- coding: utf-8 -*- +import re +import sys +from charset_normalizer.cli import cli_detect +if __name__ == '__main__': + sys.argv[0] = re.sub(r'(-script\.pyw|\.exe)?$', '', sys.argv[0]) + sys.exit(cli_detect()) diff --git a/venv/bin/pip b/venv/bin/pip new file mode 100755 index 0000000..9a3e9c8 --- /dev/null +++ b/venv/bin/pip @@ -0,0 +1,8 @@ +#!/home/wartana/myApp/billing-mcp/venv/bin/python3 +# -*- coding: utf-8 -*- +import re +import sys +from pip._internal.cli.main import main +if __name__ == '__main__': + sys.argv[0] = re.sub(r'(-script\.pyw|\.exe)?$', '', sys.argv[0]) + sys.exit(main()) diff --git a/venv/bin/pip3 b/venv/bin/pip3 new file mode 100755 index 0000000..9a3e9c8 --- /dev/null +++ b/venv/bin/pip3 @@ -0,0 +1,8 @@ +#!/home/wartana/myApp/billing-mcp/venv/bin/python3 +# -*- coding: utf-8 -*- +import re +import sys +from pip._internal.cli.main import main +if __name__ == '__main__': + sys.argv[0] = re.sub(r'(-script\.pyw|\.exe)?$', '', sys.argv[0]) + sys.exit(main()) diff --git a/venv/bin/pip3.11 b/venv/bin/pip3.11 new file mode 100755 index 0000000..9a3e9c8 --- /dev/null +++ b/venv/bin/pip3.11 @@ -0,0 +1,8 @@ +#!/home/wartana/myApp/billing-mcp/venv/bin/python3 +# -*- coding: utf-8 -*- +import re +import sys +from pip._internal.cli.main import main +if __name__ == '__main__': + sys.argv[0] = re.sub(r'(-script\.pyw|\.exe)?$', '', sys.argv[0]) + sys.exit(main()) diff --git a/venv/bin/python b/venv/bin/python new file mode 120000 index 0000000..b8a0adb --- /dev/null +++ b/venv/bin/python @@ -0,0 +1 @@ +python3 \ No newline at end of file diff --git a/venv/bin/python3 b/venv/bin/python3 new file mode 120000 index 0000000..ae65fda --- /dev/null +++ b/venv/bin/python3 @@ -0,0 +1 @@ +/usr/bin/python3 \ No newline at end of file diff --git a/venv/bin/python3.11 b/venv/bin/python3.11 new file mode 120000 index 0000000..b8a0adb --- /dev/null +++ b/venv/bin/python3.11 @@ -0,0 +1 @@ +python3 \ No newline at end of file diff --git a/venv/bin/uvicorn b/venv/bin/uvicorn new file mode 100755 index 0000000..0dce429 --- /dev/null +++ b/venv/bin/uvicorn @@ -0,0 +1,8 @@ +#!/home/wartana/myApp/billing-mcp/venv/bin/python3 +# -*- coding: utf-8 -*- +import re +import sys +from uvicorn.main import main +if __name__ == '__main__': + sys.argv[0] = re.sub(r'(-script\.pyw|\.exe)?$', '', sys.argv[0]) + sys.exit(main()) diff --git a/venv/lib/python3.11/site-packages/PyJWT-2.10.1.dist-info/AUTHORS.rst b/venv/lib/python3.11/site-packages/PyJWT-2.10.1.dist-info/AUTHORS.rst new file mode 100644 index 0000000..88e2b6a --- /dev/null +++ b/venv/lib/python3.11/site-packages/PyJWT-2.10.1.dist-info/AUTHORS.rst @@ -0,0 +1,7 @@ +Authors +======= + +``pyjwt`` is currently written and maintained by `Jose Padilla `_. +Originally written and maintained by `Jeff Lindsay `_. + +A full list of contributors can be found on GitHub’s `overview `_. diff --git a/venv/lib/python3.11/site-packages/PyJWT-2.10.1.dist-info/INSTALLER b/venv/lib/python3.11/site-packages/PyJWT-2.10.1.dist-info/INSTALLER new file mode 100644 index 0000000..a1b589e --- /dev/null +++ b/venv/lib/python3.11/site-packages/PyJWT-2.10.1.dist-info/INSTALLER @@ -0,0 +1 @@ +pip diff --git a/venv/lib/python3.11/site-packages/PyJWT-2.10.1.dist-info/LICENSE b/venv/lib/python3.11/site-packages/PyJWT-2.10.1.dist-info/LICENSE new file mode 100644 index 0000000..fd0ecbc --- /dev/null +++ b/venv/lib/python3.11/site-packages/PyJWT-2.10.1.dist-info/LICENSE @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) 2015-2022 José Padilla + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/venv/lib/python3.11/site-packages/PyJWT-2.10.1.dist-info/METADATA b/venv/lib/python3.11/site-packages/PyJWT-2.10.1.dist-info/METADATA new file mode 100644 index 0000000..f31b700 --- /dev/null +++ b/venv/lib/python3.11/site-packages/PyJWT-2.10.1.dist-info/METADATA @@ -0,0 +1,106 @@ +Metadata-Version: 2.1 +Name: PyJWT +Version: 2.10.1 +Summary: JSON Web Token implementation in Python +Author-email: Jose Padilla +License: MIT +Project-URL: Homepage, https://github.com/jpadilla/pyjwt +Keywords: json,jwt,security,signing,token,web +Classifier: Development Status :: 5 - Production/Stable +Classifier: Intended Audience :: Developers +Classifier: License :: OSI Approved :: MIT License +Classifier: Natural Language :: English +Classifier: Programming Language :: Python +Classifier: Programming Language :: Python :: 3 +Classifier: Programming Language :: Python :: 3 :: Only +Classifier: Programming Language :: Python :: 3.9 +Classifier: Programming Language :: Python :: 3.10 +Classifier: Programming Language :: Python :: 3.11 +Classifier: Programming Language :: Python :: 3.12 +Classifier: Programming Language :: Python :: 3.13 +Classifier: Topic :: Utilities +Requires-Python: >=3.9 +Description-Content-Type: text/x-rst +License-File: LICENSE +License-File: AUTHORS.rst +Provides-Extra: crypto +Requires-Dist: cryptography>=3.4.0; extra == "crypto" +Provides-Extra: dev +Requires-Dist: coverage[toml]==5.0.4; extra == "dev" +Requires-Dist: cryptography>=3.4.0; extra == "dev" +Requires-Dist: pre-commit; extra == "dev" +Requires-Dist: pytest<7.0.0,>=6.0.0; extra == "dev" +Requires-Dist: sphinx; extra == "dev" +Requires-Dist: sphinx-rtd-theme; extra == "dev" +Requires-Dist: zope.interface; extra == "dev" +Provides-Extra: docs +Requires-Dist: sphinx; extra == "docs" +Requires-Dist: sphinx-rtd-theme; extra == "docs" +Requires-Dist: zope.interface; extra == "docs" +Provides-Extra: tests +Requires-Dist: coverage[toml]==5.0.4; extra == "tests" +Requires-Dist: pytest<7.0.0,>=6.0.0; extra == "tests" + +PyJWT +===== + +.. image:: https://github.com/jpadilla/pyjwt/workflows/CI/badge.svg + :target: https://github.com/jpadilla/pyjwt/actions?query=workflow%3ACI + +.. image:: https://img.shields.io/pypi/v/pyjwt.svg + :target: https://pypi.python.org/pypi/pyjwt + +.. image:: https://codecov.io/gh/jpadilla/pyjwt/branch/master/graph/badge.svg + :target: https://codecov.io/gh/jpadilla/pyjwt + +.. image:: https://readthedocs.org/projects/pyjwt/badge/?version=stable + :target: https://pyjwt.readthedocs.io/en/stable/ + +A Python implementation of `RFC 7519 `_. Original implementation was written by `@progrium `_. + +Sponsor +------- + +.. |auth0-logo| image:: https://github.com/user-attachments/assets/ee98379e-ee76-4bcb-943a-e25c4ea6d174 + :width: 160px + ++--------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ +| |auth0-logo| | If you want to quickly add secure token-based authentication to Python projects, feel free to check Auth0's Python SDK and free plan at `auth0.com/signup `_. | ++--------------+-----------------------------------------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + +Installing +---------- + +Install with **pip**: + +.. code-block:: console + + $ pip install PyJWT + + +Usage +----- + +.. code-block:: pycon + + >>> import jwt + >>> encoded = jwt.encode({"some": "payload"}, "secret", algorithm="HS256") + >>> print(encoded) + eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzb21lIjoicGF5bG9hZCJ9.4twFt5NiznN84AWoo1d7KO1T_yoc0Z6XOpOVswacPZg + >>> jwt.decode(encoded, "secret", algorithms=["HS256"]) + {'some': 'payload'} + +Documentation +------------- + +View the full docs online at https://pyjwt.readthedocs.io/en/stable/ + + +Tests +----- + +You can run tests from the project root after cloning with: + +.. code-block:: console + + $ tox diff --git a/venv/lib/python3.11/site-packages/PyJWT-2.10.1.dist-info/RECORD b/venv/lib/python3.11/site-packages/PyJWT-2.10.1.dist-info/RECORD new file mode 100644 index 0000000..bbf59b0 --- /dev/null +++ b/venv/lib/python3.11/site-packages/PyJWT-2.10.1.dist-info/RECORD @@ -0,0 +1,32 @@ +PyJWT-2.10.1.dist-info/AUTHORS.rst,sha256=klzkNGECnu2_VY7At89_xLBF3vUSDruXk3xwgUBxzwc,322 +PyJWT-2.10.1.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 +PyJWT-2.10.1.dist-info/LICENSE,sha256=eXp6ICMdTEM-nxkR2xcx0GtYKLmPSZgZoDT3wPVvXOU,1085 +PyJWT-2.10.1.dist-info/METADATA,sha256=EkewF6D6KU8SGaaQzVYfxUUU1P_gs_dp1pYTkoYvAx8,3990 +PyJWT-2.10.1.dist-info/RECORD,, +PyJWT-2.10.1.dist-info/WHEEL,sha256=PZUExdf71Ui_so67QXpySuHtCi3-J3wvF4ORK6k_S8U,91 +PyJWT-2.10.1.dist-info/top_level.txt,sha256=RP5DHNyJbMq2ka0FmfTgoSaQzh7e3r5XuCWCO8a00k8,4 +jwt/__init__.py,sha256=VB2vFKuboTjcDGeZ8r-UqK_dz3NsQSQEqySSICby8Xg,1711 +jwt/__pycache__/__init__.cpython-311.pyc,, +jwt/__pycache__/algorithms.cpython-311.pyc,, +jwt/__pycache__/api_jwk.cpython-311.pyc,, +jwt/__pycache__/api_jws.cpython-311.pyc,, +jwt/__pycache__/api_jwt.cpython-311.pyc,, +jwt/__pycache__/exceptions.cpython-311.pyc,, +jwt/__pycache__/help.cpython-311.pyc,, +jwt/__pycache__/jwk_set_cache.cpython-311.pyc,, +jwt/__pycache__/jwks_client.cpython-311.pyc,, +jwt/__pycache__/types.cpython-311.pyc,, +jwt/__pycache__/utils.cpython-311.pyc,, +jwt/__pycache__/warnings.cpython-311.pyc,, +jwt/algorithms.py,sha256=cKr-XEioe0mBtqJMCaHEswqVOA1Z8Purt5Sb3Bi-5BE,30409 +jwt/api_jwk.py,sha256=6F1r7rmm8V5qEnBKA_xMjS9R7VoANe1_BL1oD2FrAjE,4451 +jwt/api_jws.py,sha256=aM8vzqQf6mRrAw7bRy-Moj_pjWsKSVQyYK896AfMjJU,11762 +jwt/api_jwt.py,sha256=OGT4hok1l5A6FH_KdcrU5g6u6EQ8B7em0r9kGM9SYgA,14512 +jwt/exceptions.py,sha256=bUIOJ-v9tjopTLS-FYOTc3kFx5WP5IZt7ksN_HE1G9Q,1211 +jwt/help.py,sha256=vFdNzjQoAch04XCMYpCkyB2blaqHAGAqQrtf9nSPkdk,1808 +jwt/jwk_set_cache.py,sha256=hBKmN-giU7-G37L_XKgc_OZu2ah4wdbj1ZNG_GkoSE8,959 +jwt/jwks_client.py,sha256=p9b-IbQqo2tEge9Zit3oSPBFNePqwho96VLbnUrHUWs,4259 +jwt/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +jwt/types.py,sha256=VnhGv_VFu5a7_mrPoSCB7HaNLrJdhM8Sq1sSfEg0gLU,99 +jwt/utils.py,sha256=hxOjvDBheBYhz-RIPiEz7Q88dSUSTMzEdKE_Ww2VdJw,3640 +jwt/warnings.py,sha256=50XWOnyNsIaqzUJTk6XHNiIDykiL763GYA92MjTKmok,59 diff --git a/venv/lib/python3.11/site-packages/PyJWT-2.10.1.dist-info/WHEEL b/venv/lib/python3.11/site-packages/PyJWT-2.10.1.dist-info/WHEEL new file mode 100644 index 0000000..ae527e7 --- /dev/null +++ b/venv/lib/python3.11/site-packages/PyJWT-2.10.1.dist-info/WHEEL @@ -0,0 +1,5 @@ +Wheel-Version: 1.0 +Generator: setuptools (75.6.0) +Root-Is-Purelib: true +Tag: py3-none-any + diff --git a/venv/lib/python3.11/site-packages/PyJWT-2.10.1.dist-info/top_level.txt b/venv/lib/python3.11/site-packages/PyJWT-2.10.1.dist-info/top_level.txt new file mode 100644 index 0000000..27ccc9b --- /dev/null +++ b/venv/lib/python3.11/site-packages/PyJWT-2.10.1.dist-info/top_level.txt @@ -0,0 +1 @@ +jwt diff --git a/venv/lib/python3.11/site-packages/__pycache__/typing_extensions.cpython-311.pyc b/venv/lib/python3.11/site-packages/__pycache__/typing_extensions.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..d5b0b6a13eb1b63449f4ebed8f96c73f6d9b128d GIT binary patch literal 179469 zcmdqK349yZbuWya00|N#0qz^Ph$1D5+NoWZL{hRgN)~B5hT}jGXDCr30eS#R76Ur6 zt;Ce0rnDp1Od>Um<3&p3MoH{eZS2-ro3u>}u;U0t%T{Tlw(jyuS4p4hwqM`>+*vRK zfRdc&e!t)M4Tl$VXYPK_J@?#m&OP_l{QO)4uD8mL556Xt41Yr&180B5WH5Xc|I+2FG#U8HSK#@o^2*?=(xvZEOOt!r z;HwUrxjgzsUNuS-Uky?zI9jXtIp-@zq=v{eb(s+9MiM@UA`6;vIZe*5wb;jpCx1~zAsX~`xa%b zjU8bYt6>(Szv|Fmi_to5d;#axw}?QYm#CqaAap%KFX0;Cw(HVwlv|5pELCGH4X)vu z5Ox{20Pb>DlV;RpAwsQCLS?DRN*1yOAzS&@EZbqCh&oVv{2uCf$sMzV-IlRlaYk0SB_wXLy9*mG*z zKo71&YCTG7S^BaEZR+8SY3;QSZ+pfY8!%m7oi@VuWW?E}#_2!| zV@8Z!EQaOi{!}=QAmBd5&mX8z9u0`UHf?O~mgDy-fw&HC-3N%j6S#Z*i$-n(xACxv z+jQ8-Z9Z@I^&!>!k;(%~s`|D$V&LxivT-cOVDLT2Z9!XqWYWkvxz5u@-$S~->e7r! zpOTi(7u|XTPPUP=F{%Rb3{%NiLG2YMZI&DasB@VLG zb|bYtNGYJ?&VLMeQIFqz^OpIL63cf8m}f7_c!)pb>(_@$e0( zz5)0StG>hV9Z`Kp;2TtZgYc;U=sOyGg+IhA7LN3L)gP|*as2zBX+U zWsx%nu6%41W5N8<#;n1hc2f=HQT8*H92N87L4QX$Ns%bwer+pY{AIXw7sAFD8OZ(A>1=P#KldcxavC|3~>YnIY&<@@9_OG+-kP8hO(s0l?H-Z!&XDL346a~H|%S`nN{u5j{1Jmj1$d3+~e5bewQadiU z`KTTeSerkgl*#u5Fxzp2enJj?B1`Be)zD7{tGLGy`YB-W0`4R*_>+j2W%lI85b88S zxwwxb)F*W~Q=!>iXzx#{X@3g7r&Zt6K^qrE8lU3E;XW;w?(r<8n^5CS1oJ?xeIlcU zCb&~b;|%u%+-F!DKZ!PeN}rbR)9lM>eEDQXf1c$_1){@01&X8AR|_h`#X>)g&=dUG zj8RZ4m-mc54}og@D{6Uv1-{RyzRv_(S(?uv%}?v&`F@psIg2l6_+QoIL*K8kZ@+?X zpUL?48M)lQigHi-CQ)vM(w@}kAQZAxo<%B?S?V(>*Y`R0{aOCgY4AHK*Y~sfRKrSc z=hEIg02zhcAou)vBll~k&A#V?IcSUL)V6qzmF5NHHpM@iR^QJCiF*I68uqg~*m6rq zS}0*De2%4{37utBeU^p%JVJg!UrOIO?mQsodF1wMN^abR4Cs0xEq`fsOzV&-C6;fB zLFTV##GR7c?Th-H*%9r%UeDTps3!XN z4SfGi#J}CD_*MQD?zb|^^AdNJ^5K3P?nN2j{0{KVCEq3Bn?-V6zm?XS625s8xqd4P zzPS{XD3!O^_fMx`fJ<_kznhjOjk&L=_5VuH&ix)=$Gy$h4OqBupSJkEBFFnqmUv%P z<9#(~;=b$qsvP!vS;Agc!(K)n-{-%GJidrLetc-AK-q3|3AS0AL9Ry5dJrm@Ob{3=2=~{<9(CzK1Da;?G@!M_hW6C0aGfJ_L=*! z&iBXKIH;K>J-+U+5v{3Br-1vD(>C90a%;u1wAR;^()hj}Y(qFLCoZl{eg4v3p3$f4 z`vzM58z|d1(CUARR{y%L)kSsP={ovNHTQ24?@X8bJ9-+=_c|L1KLN~LOUv(@y7V3L z9An`UfcZB-LH!y1%59Ja>0ujRHDKhDpn`rAA^#j9f0Hi_=kOS9{@+wehq@dXFmZo@ zy8IST@O>53^0&a1&~f;Vn0&u2hnz*o-;s0tOMPjDd^WrO6>|I*|1IS5EhU$rle>=m z-(>l}i7#&|Uv%};uG`;ILipYa_8{FN?x#richQc&r+#@G<+vYQfxrH8Iv3^JtVRC@ zE&8(zn(90A(#YT8Ze*d6zsvnC%Kkmpntz8fyv2Wyf6M=Ur4+0!H2fNFQ+liDxH&&i z;`x3MJito%_bBBi-f;Byl`s0X_x*tX!SoN6Z`xn}M|wCi8s-i82X`Iv57R@k`sH)) zrq#;M=O6ter8K@j0)+hoTIr8;{i$%02@CyL4g2F@KCAaXqTc_cPu2HhU3`V(Px1d) zjsM5NJ-SfJEM(#S8724=l;nTWuP%%-a)=vF5c4k?5EEl%nnRi1LvFX5jp8iizar$# zw9@}EYpVk8=lb`I`kqnCKZErDRQ3HSRyM!DN`}Uvh5I**t{K^1a8y)6@$YCbsD=CA z2=%9OUboWnqPF^p63_P&xvl>lrA-Uz`w3FG%I9Lv%{21E@WXh zkni8>^PT=XC5HAF;qy)#_#0hm{L75i*YGfX0l=0jN%NJ#_xDPgzQ5;;y@r-zqrvbl zz3aJTdY1%5?-symJ&`nT4W3NeJBI?{@B;xMnb#Q#_6H(-5dTT*_Q7CaD4D-!Fv1Ig zq27ov7(ASG><Qr?|G4qw%zb_O-y4xoTs(sqCkApfN8L4i61O%@D>BIqbC=|uPO zLc|~BkK;q0?2AylyZVRtfZz||12W{oNjDdW1p2AN{ShG$3=f2a;bbnyj|e>VJeSPp z2E#`~gTaXZP$0}F&0V4Xq=!Eq7#hWAKZ2ukIlsUUB=ZmR5lzb00R}I&?MM+-bJ5p; zRK~$jFr2ir7X%o&ETS-YcrchOPCW;PSeD_Whu)0{p-8AdG~@@P@(?eClLhpaD&;?d z(uI>YG!g^a!LS-Q>4b;Ea2$1CjtslWoF4uJ^;pubw1o5|403q4U(PCN@8yF8TSLh_ z0d0u_u|~`h03n0Je6mP>@b@3#`;Rejwe$hnk_;TS4h;qX0hAAWlrkijnnVh-V-&5I zw9(6*6!xM0-TuydyE}L9?AeiYMDQ9-I|5+rVSQ=u2_4`gqe3ugr|#bu9Kvut05}~4 zASUyALJ`&D=n2V?n{@Vsx*tRDVh|07lX-wkc={u~d?abZfX7Hq+P9&zgp)h>VPph` zhFDc{J3~W5e18PJMdK_O!H5AoS)`GGI#ACaK*u|_3!yPSNa;CJ<1dFj4)!PQ_Xfg8 zSc)d3?_i~PV30qNw6jr7!&rKv@onGDpA56FmOX=EbQ#9z2qBt0`GI}2?hQoxk0cBB zjxr>ngmKCKUK+W-|A$job$S{=8hw{s4-Z9}G#b$RHtErt|tazCXm!S6{0|un@k@hXa1K z!H~2Z;v<2i$FB}0K&&(#{r&i^UO?IGy6M5s3kKdm`W?{eFk)sgbEaNHt2ycLD*)TC z1gALkOj!P=4Gz>qFa@-ldd6}$hGp>He93Uhn6!j}pTiW``~CwcoEo- z_Tz(L8u9HT09HSPXTN`}SS@S2^6nzC4(Gr*Wk|THCZad-h$+fKv4TLnet$C8?;j3v zqeJxU^!pzj4Gc+N1mX<~Pmx0$U*S{aJfS$R;vw7!=al+4XEIu==M0&S6rZAAGD)44 zi)USfQaiE+dd)K#;Ep#gVV07UfCzmT?B@%Ya!=Y4oCZdRlGC z+`;f*FpLfXWZR_XP3HUMVJ2Z48-v1d(y4pvU|>r~2Hk9oNPWzjC|TzZ9|?^Paekmy z8tnc7AvEkCp-G*`7zqo+XQVZHxE0PR!>p?!;mm*DCKfimJRml&d#gj-usi13^PbsM znEP`BoH>KZk;@uU*Je~Z)@D6;_`hkh0aJSG2$M*%)haxTAAz{U0wPrs^*Yh_x%;*eGS!I&OzNBe4{vYTA4TI)t zH6|VXq2mEzFo4H4FaRLwy?l)t1XqN<%NIy! z0B=g!=}BWm1w%s`(K)S&r^GiHqG>5exTPa=^rN)ientRz5Aoj7Fwc2U3`UN4Q$XF) z3iL?rBh8K7f`AFZ8Xg_NtW)IoE3nT{tl!^i7CuQ~&7ng_f%z1q8KzQty{9A$a0#BV zN~NWMY0?t;Lwpafgma5!pq0epx;ba|WcR+F`!~AIOsEX#IhQr3F z@kQeS!=NE*ddc`1nQ*GqqcW+5BZIVDk`b6d1P2?1$sEuw{0Tt5C28&-!YY`pg>A>! znphePL=FHzWRyjd?N}c5lpOOf@glqx4jYrj&-YJ^O^h)dwJ~10Ni5wIE8LWDH$1NcWXe`O&#H`(ULaa-n`uVU)E%f(YR^C{N8GWmturcj&`5IJ!Za z<8aOy$SE{C*3qcE8%G+IlqgN5fN5zRntg~;Piv`OqIp62S~xRYD`$ag1JA|)EoN|Q zpu?O4*TLE0<}&U}9+!(}C)5AU2Tz3Hhh3aALuOUTgUt1X&DiGBG zniT6#5WK^>>6cInn*qA;fXUYwHTYRBW^PSkJ|e(BQBap@$&lSV8*HdFPb z8qth_%236?#fgBibZ9ifv*}-{qlH>pSHV0#bpRG}n6<{r)9R>xc@JrZo8X|Dd9Ijy zX)KTKguCqA`k1rkMnUydU%a3}ENFM|&j2rpj(DGf7Q-R3YT0zxOS@vOWpvw@WtNPRWUX9?2clTDfW!uXK(v97mOm{9 z!S)#K$6|1-EUmee5C4UTH*?`I`tIyl%wCaM01Lje`Q(Fjvs>>{TzK66fNu;Up zI-Zl3V<)(eZ9t1?ySL*a7c1|;9WPiT7OaWc*JOgKIw}_-Q-CU5 z<KSZO=oz~X$(o98mBR;L9O3p^7x~3OQ z?G{}vF?-7|TUbD7mcj~uid+N{j;?T+#IRgI={#wrV{dKg#p|A4HGlC49_AVL81xuA z*@u1o9oIJ!bjURMSJJA$h~}}{wBjrDo4o3ApdvTbkw1lDzfHR11)X9+XUyK2+1ej+ zbrh`D(#opSDp%*5Y1N@6n-Wwmd`9KczB^Gl;m?uIZR*gD&x9kU@tb)?F&$-R4;a}L zsz7&cio>CUB578k$p(;=Wmb{CxCojEjh-@Gce#Ic{F(8ozUlRGSG(wHkJ;N<>3dp> z(iTOuNDU8#BEas#?;^7B9ddr399oSDB&QYPF8R@g?B7piVy|)=`PSILIjJc&0bm@C$gRNBehP{?5 zOw|P4XvL@xMf%}UFLVyOZpSGt^@AfW^CdMjo^F+K+X-_FSpa+f2tQdTCuwr5%btzO z@hm4mqM3(gr^adSrK9oG9N8nBq14m*_;2YQIb{^Lk;PSdnVL@9V`xOlD>WI#($&y{ z7iRq5+z#gj17yiMdNo+qsN-fvD7<_Pm@=itQM5>_DR2u7*LMVqT$Sxjcu`&NVIeCo zn6b7D=@*P_IjXJ!X}u|@fd#O%=+&TD65T*x!|}m3th+f)P)2mA$)uQ03cBIBb}vYJ zFaKD8#Bl3#)v&Zqmq@m4Ako(A-qW`&OsJLdn&St&Tqwx55DUH4yJWMs2fobcltg=b zY6(t$DZAd$LoJkLYi6W*68Cx=y^Kcog5-j{5lwVRVj*}Ly5)t8VrI)eOO2!w?coCh znT5$-`h7$zv`~!J^}j^9C{eYreMkyyi!hi33hzLw5b;;QctBQR@F9c{*n$zz%I#jn zP&z-9s&tqK0|SA*2MuKtW$nb)v%4pD-mzOY)V=c+X8r-b zMTx@X%W4*>!Pq5>yqB*>p5br`HYvzm$6k>wwlubs3|6)%Ps`i9%Hs-*ABlFx&wTx<<))zN0C^M7#PQbp%X(qcbKR4=j4j8jzX)3Fis+XSuiOD9%KYbWxM=!M^mKz&;yqSC5UHjRSEPV=Df8947! z33P+ZiWjViSMl(I;jm#GQ)-vtksaeEotV(16%*Cvnvow zGeIMJ`HH6TC=mAENS^XFs|3e5wrgt;(=Y>A>OLZtP~nb-b093C>xilLe5j>?Gon z1SwD?F@qdo{UQ7UG0-%h#Ers@MCz; zvrM&ePp$j~y+$$ErSGTP`4qfvNm`CT!6@l~j0##vx^~WB83M~tV60v0AUR(()kIZ>p>EjSQAn|4~NZQmKw)(8WHKD41Apzk=zb=$4w4{ zZVpbHqsPq=QW2A{s9B$u?ps>SV=RvF04NVj)P(t_W850GM$Hh>EQ?yEHKkQj2iml9 z#tPM|&&z0tny2mRN6kajnjZ4(ny6XG-GvyhAROr&NEft92!P}(YSG6VHwFvAXdseH zzA{-0krL$_A^A)mAAuQlWNV(J1w;Z8Mgb%(Lr^1>Fs~8apEM8gLE+!3wv!tOkikS(kkz#@Pm!0 z2W44Y=l4HN&`i8U2|XWuZ9&|h-be z^@-}%Yt_qUs+V2y#H%~R>W)}-$E`$NTgA3XM@NdXX~4%ACK2}i1i(lyKde3 zMTNlwYQvOYl5(yWdL}J%R=mRk_7~L#Ps>Hi#iMceI?=r@=3K|9?{8aOoq2}u=H+&l zo4;FTgbNk8G!%? zGaU)tQi6eJ0Bo$EvpZWQwia8(-YxG-UDstvk|jioUFeYte0U@TjT6w=jOK${2(8Jb zXPE{bI_V{)V7vqMaodEkv_rDsrW}XrGnb;;Z^t0ZQb6dstyfk653hQ}yUDvMwNT9x zz7LraL94E9q0$a%6LcFndGWsxNiHNdkgiIkaud33g^;k+6ss6h5KJVA!N6W>R;^hI zB@few!H#-FVO2nbM$0usxzm|bw<`@>xwD=EzhmGeJ*i!(A`hx0)Ulz;if)rT@^*=m zL)2e7MlMucjDIzOgn2(7|` z?yUvcuq#DGZ-k%WcVbYGrUyQ zgi;%9XAo@|j*K4i4h#RR)504H71TS>DSv$A3f&a}=2{ob@ z`WtF015hjm;}q;Z)?i>$4Jzv*#z8>C5jN1j^va52i@^6=q$Y*InBvg>|F!uQ#H5Fk zG`T=ydV3uXf#XWZDTQ{aRTb!zfIOg%9L6q0a|&3M4np~m17BR_ZI43DoDfxNFo0x9 z?d)l3Rg+0EzKMTBLk4=ecBYX;eD-9q8Vi~lhlvn7nOY!G6yiOC*KglFdYVl)V|Y(O=074lNL)yO=?UnyF?cz6?a-?qM*3yrKjojG(6$#u?}f(5>qE- z_!VHK2f#(te~X}@N;q2Hq|+{t6cn^w1x;a0g}9QQNGnVr>Nsg*cruJ7BuwiVSobIG z*aiYNbALp~4P-MQbAE=9;loG*kYLMzghZb6?8bNMmdEnwPPj`ZcFwvNOb1>X65T5& z?DTo_ba^bV6}R-&<(|BE>b~9%$Y) z%e?gMYsCD_TD7T@w(PM+O*JMaC7Q96LDk*^&LFi~(#kgYrBlMB zG$D}lFVrl=wmW6GVXwSq_s-b8aeISkC;d0+W;FqWs+{7KkwXh^Apl1Q(^NNBzX$Lz zzeYy-4ug;fx*J*RpB|Di50WNe6jL%6q#?Fc63$QB!5n5!#KtEyqhaGiCk*?iI7Uqh zt;i-9-4I@Y5;Fa-U;V^0pO}ioT}`5^DdyUE(et&Muhd+L#9KFtts7(ZjhVe@K~%bK z_Q28Wh;t^+jLpK*?hNbcT<|_g_0)om&9n|=7Y8*|eZTs0*d7i$YG(&aTvk5Nvc&s( zSocAaXdzNhm_tfQI|dYOLk;&+o6|+Vln?8JgLoiCXe~okpKtayhk`2Dm{H4Rquyi_ zR{hp2tQ$aaK<~F#X__RaZIiu;b27 z(b*Yub|z{TfH%}Lfj_BlmDWT26kq5(JTDkvaKQLwBRDS_=uGGLge_<>;-%DTspNU2 zHQ-Y~_JSN!MtCu*343d}FkpTvFg9;^a5pwnAZWWVh+v#FyI*P9r6@4ij|A>Xn}dO1;nUqNyzZMO7yaBjhN|mQX0x}@dKmEZqONqh^lnqOF|;OU_@u^= z4{d_b^E%T<2Iviwt`uyf2~l0^csa8+jIKQM*AJy3{p4|T(4*s-YDSK}MaFfxgo}0j zQc~cwWGZlK!*JHLy08%{m^fPyW*`vX&eT91Q4^kXqh^%Ot}nrpX!m(|t!eF!c_6Q6 zY|(yo$0bSW50e#xL1{Nl*gHHLX4_?GtsidJO~TaGEAfAG8=U8jikR_{3Un4mta53j z-`zK{#W2Gu=gpTBMhzJxy8A^NGFPW33_GL`&m^2TE59@Z>z39y8n zXyAPZmM$QX&_?fd(C$@tJd#+&4Y|TGlyx}REvOT-|-0tb7 zmzKLk)%mK4UDq)e^qqfX#^u!nU#On6rp1gPR-Wzq8B3{}QuUjtGEuXwMQC4+s z9F;EGZk(-boQ}krx}-Z^*)3Lf$2{HG9|aa~$yVdE?@H6_OJ)|_6I*c4RL4}u+xKHJ zhxd}3XkIjDPI<4_wPJ0je!bqYS?hhzY$+@Lxd9IJ2a1ZJdF3g8Ve@mFr<>#MR?*!W zbG9;wY;~mZsU;RQO`(#W{ofFT{FI!mo2?d8KyqN^&JaFGm#4B`pd- z4ia%H5p=X(fcWKMdf_H#fE-$a2_(D``pFq3=Mi!~N{&Ddtvi#Yid70SGy#eii?Q9FF zouB5@6kWlYKyw<;I(0K9)*mnxjCnRiUyhqG>zh&(CFXw|zHxx`PF6!6Xvw~^=h7r{ z;o7JrqT$zqcTfWDA`R85*4U6P&4b=b$Jv8XTDw|%-u-V}(oU~Kh$3{s0bfUJ2L>%{ z^`q0kHxi6!5!#JNd!78!7$T+sF^XuZk9W=Fb@{tL(z)mUuI?`X*1o<2y-9O`NVieYX2lccRdJ zE^n%H>cCVdbb#gzHml@JSg^P3?50@t%2*!V38!bav}THnHLboP#7ozUrRyj15}p;4 z+_~YHXT|g}IJjx_A^|uPT?t^4eb4Qi-Vyh-fyF@h+98*ot zy3V;KUAKt;y?C;`%J7BU7W1pd7W3t$TdNJ3=8 zMz|mZsoRBdI65>(9n3(g2@iTS7fk~o+8auYoUt2QB{6`!(VGe9BxP78B$KExQmCeF z_2CEy+zoLJnR?Oe0wa0QFZ1T>-05a?qm7~575?iU83x{AHn5T+5%21TfBp#tL? z@P?(*8_*kQKmB90@@qcJG0Gl5`CUwSuH?+y-6PL5P2b14ve~g+x+QW|B%% zz|GVwJwQm9g&b-LF>w+^U>_wB;#zi9wVy4z!5!~EhMFp-f21Z61cW|GU{s1!!N`QF zciH6Vna9sQ9;@FFb8U#(vnXIu3D{=FJ$LM!)Up6pLD;GhQE;Vm;+{0hsyt)f{YsrR z0#d1c(8zi^BMrujxEO7;;LBn=6LZvV(~pO=RKsVxP|FRZ80)zsDo94U93N5N2^H@E<7afxsa2uKTc7VmQJ(IN&{q#l=B&Ekc^KB--w0I@t$lRdp~0g+cE@ z4J0CBn|GrES({rAYDCtM#|?+D%<0F}7H$Ir7=mNmP+=Jy7{ppd-u?kjnF81hj{N?V zn5L5qm63D@;<&(JOcu}t5AywhJlL_ph&e&FfV|kHb^`Le6DYWLj7U(~rWQRM!l-~q zE)-k{<$PYiI*N=$phzqvk|vO*Ab~^S&=B@?BL`;0A`;S63tDFo*$acA(XgcA4lRVp z5mfL<=mgotNM(qWPQcg>t&pMUHwsxUlcq1CJQvAvq17FR{V8e~$PiHl1SVEF4P~|D z&}&Czfgge)yI`cv3*%gPL#dIlSE3jp+FZi$(Et|W!09ADmeNi&=U9WTfzWy05|d6^pmVoLh-R*hY&SxYD3NRP{ny?2=^@>Bhu}i=EA|0&j=@ zU=H*LVORl3-2vk+3O?9N<{N0NDHoB#dHBEiYbZR#1F#YxY0C;8Edi3QoR0J3SPFtM z_-oqHsU<*CXzPehk2gInYBnLvl;B242`-{hW7DOlqQ1Mx(Q@1nzBj62@ka`jDjN** zDasvHg>HupdOU;F>UGL(X-aiqUXct&zQ8`SW-~f)_R&a6dS^JQstz7i%SK9b#Ofcg zz?O+cwq;`JVHCO0gN7Pgt#qZl&jYpvfwwR$^c!^))P(VQ7<+PBT@pj23ni2mw?xDX ztI0V;@1B8^EcEX`u&-~Qf9sw-`ySl0v$sz;LIFNa0ch`&q=Og2yJXJRZJh*6%oqub zo>_)rHAPxx{(zElu#FqAGRLz?L?G4EFaevFT@pLx>+nN`RH+fA2dv2Ku)zAiAxwLW znLucAY{pd|bJf4xe{sQ=j=psC%JLV3)4@ccXSTTV!uIp~VnuDQg|Do>GiRi@qX@fT;Y@a2FRy;N^tIB_A_`Sk*RXHdH@ggq*Uj1zR|4+7gWmF{#ziGN7jI zJ+ry4^5+IP;FMHU-ui_d%6;cHh;Br`*mq_1)z+B12lv~@rQeuS7ImOu)QcdT5e1}$ zte*u_qbarA%(Q%COcPqbhHjc@Lnzg2;_DX@5GJXkjED(^L?>LZ9l~Ggdx5mBC0+@W z1qaC62j`NRt?igSg-p_c#TYA1?`_Ha35f&3#A{&dxU;)Or+3;Nb9R7d9Ylw!`Zb=7_jyo7t$23p~y_abNNbP*Sqh**4!R}!8~NYppX>Z zRHU7Fx&;y`l7QhIM6n4rcdgSFw%)Y$sK=lxZcy$QTLJ z-%s9$$)R}wk_J{}Kb0|Q3$xA45_eri3m~G1y(8_IDI|uRRBBmRNn;K8U&8*B?O0tp zK2T^X)=qx^HwiH`Aa|Mvil09+@rj8~%$8MMD_b&Cw&Y^}mDTaGbz<4NSm8PnLz<^P zcJY2mJUM6fO?cE`)MiDlcsb}cHM^(?zm68EeT zJ!@i~HDFW&xmTl@aX3&8D@1ZxS2CGQL zpxNqm_rvdwD6mG0FwzjHD?(GKd}SiQ|GTn5x(K_TTC@qC?HaaEgt+PQbriBt>0-JC z=o6eoBVUk@7J*YoyaM?Grw*Ht9x}l2zDF_bA2pxKW718Pze}272w^_EmP)`(3EN~O zC47>`=%?WHwdQLE_9bK>4QzFQGG>J|x@pQz=3vcBGBjqVo9Q7)76KW&O&|mS4Ftxq zwJWP*#-SC~;ZvIO0cDptpp|Iyfc`NJ=w?I)zYThM?#v;*HeR+-EZZ0>+&Js5oLV_u zaK##TcZlu|ER*uPj5o?E&wcz_*{YecRabhiw#3Ui#j?&=VJGOalIp3>SpAx-7|r*H z9&jA2`CB12TNd}M5W&c`k{9Er4D4KE{TAbU24mS)0(( z?w5M31Ew3NN8_#~qHD<&Pt3I%H|v^&yYxcKJ=3Fa*j{(V782Kq(R{Rrh|IC; zI8Ic0h8#Qapl`KllqvH{=b0)y8%+|+z>Y}5|3Wkk!+`B8%%pjx&5LA!B}~*5XkK^O z3!9$XH0{S(vm>B5Z|^poRNL5{zGIosUXL3pv3@PmCfYmRK@R zBe|7EI5iey3CQw1M({}!1FiIhgK*M>c)}U_K+b;+V|Z=U92ZJVwN@!D--?Y7Ch8=l&!kH5D2@;<21GuFA~e4ieRW{1M)7Zob0}JgKf{o4sG1GV4Hd(A}uo&0Ha^j zmt9Q#N2{I6n^RJ@)LtAIN;SevstHC?%|1J`DsF*QaR<{#&80q+=6D+DecN?NO=Tdg zLOYYDDNN|%NxAftQfhLD8Wq#I&?wbtculJ#M@fNxvy8b$?Shtgl1N2mB-~yz4=e|D zn&B+k+(Gd;wPOS!)lq_QYAm51K6UY`U7)7kVp1#A(p*SOjiE3)7_-AF(^R@HJ+4e!R5D03fpUyK`~ zEP)^q$fAXXvV@zFq^yM1yeHPY=W5aPqp#gNJ&wn;Tf(!ng|*cwSvrQ@m$Y0`C;$v^ zXkNhp9*O1203HF4G;k>iY2u;!FzJu*4Lm6{;3;XgIZrjJoWDkuRD9xg+`@v+x!_m2 zNikS-E?|rv4U31-M&~wObCVhK>7FayDT@eujkAr-QZ=vkzd4Mjc=H|+ZsQ)YaS!o+ zNa$YJaM69aTA~kT7p|b!P4wE$)LV`DEz_MZ?Rn!~aaDJ$iSF6Dg_GuU&Pn_c&!`1R zD8EJe#M%&;@)@c)V}`O#4@A~T1MxTM>95IQ?Zv2ZYKZK5L#+MC@labFzysPs`AZa+ zpIa&xw@&0FJf#y3;Ij#5qOJ+1OXe*34wUNd9I4wW6CE7W@F7^fDWY_G{-S(S>-dm9@kEd zdSr+E@|2iB7wWPKBtbuIsEp9|3Hj335i${*UVSH>dlfZ>E0Ly}{z{ z$+yg)V*7byK9u@RBjM{Eh2(rhmK>AdSkJ;rm(c5ZPO8u@i<}jff`&-)2^n92v9eN` z(2-UtK^?P4$VBaI>k->*xCD9vw3`%LEJm^Y7N&z_xg}(dC%s{)5zr1t&30p$^n*40 z!Tw{gf**wCIocYkAz(=L44Z{fRkX)WvPA^zTAEfMIj3TAFwNv(CKFGsHAyujHelya zC`?JVC`d4EPauVaRtiFg!m=eoX*Z}YEi?=4=Ans|<#P)R=>=OBE)COxKeT6dAvSX= zd9|jt6FwLaf{+}qmn6I=a2Al3g`Y<#$AkPigt7Vml$+0b&O``x1%U1&d`o1R#ISHs>k&kJyyh{U-3JLV=?azL>^DZOniq|U9OD3=xr#&GvICAs5u`VQ+SR9U`ZsTmjqSw}3S$WlRm5VR# z6c=~K8@j}XuF2hV1%_(UV=C!3ve@gdm2aLY-+VO^FYgk|yJF>C*n;UYl-H9wE^JIF zj?4&M@^%D~E2!AAqv3ek4AnJrIp&fYuuE>unGuzKi!qH);~ z*o1{hVytCr&#;T&EH zUm@oyq$QCOpQ0zKFLNG6Mqz^AQ|jM!JMFJzM9X!DQ*=~;i|#0r*Z|m=i)ZGLGIO=^ zHT7D`gwpTFzj`4Xc6}I~wE!uNExL1O4bTyfA69pPl$O&QD^og*ogs-XlRta{l@z{8 ztv!Jf-m$lY%hY977FqaOmQJF23aqk7_-1-1t&Q2&W^~eMsw3{)NtE>eSSK}6C$-(V zljvX`9L)J)brZJXsVRlA_pD|^+C2lc{dc4cU6`OLf}#S!65ybUvpIb&wYk$7|hE$}~-`2vka z{F9u4UA+?t!zG& z&cx);@=i_uTMrS`vzITWbz{cvCjG3><`Lo73C?~mOJ7o>2;^L#zU;w6sxRj(COSxp z956x4^!?iRLHd<4(DkbgFX&>N(mPORcFw}*a8_tLS~%Nj>nn&xj3w!U?qd!uhlLjS z#{wUqcX3cPth4@d{cA#I$sAbyIt)M%7^z3Elnd=VKdIL$AJFk_gwiqzi5(}GDK&)I z;nL`N`NP-reGd(G$~IGalnn$Jwa4J#yIJ6Xnvb>NMS=q#e0K*23<{>15UA*i=Yzlm z%dwTRT?FTU7&<7QFTKqGz`#=<9l&paSAjP@JI&@$*9PSbbPdz&i+mv?Kc=48I2G(gbxg}9Tqaa z8H{L(M@)vD1KvfH*&@PHvWhg%;Sh$1q@S*Qq$9h$Eo|~z3R~lJ<}{YStys{2cW@|W zU5L`87D-i!-pE!kWZ?ZlI`CR3##kQJgBRM#^KAeUTkA-GBvZXmNy?CQ-X24UYmt+y!&+8HA#J}bq_qluE^_QA<)oG@N=WvN6Wz8T09GnfPD~G}V{J?pF9Vq`{0%y`fkaoAQxs#n}?_ET37Aflcq0vZo=p;r{ zaFjIHXv+?r&jZai)Bq;Q+w~yyhv^_>Wi=ghviyX0=9@wP3O^zUAUZ6IoID%sOe3g7 zz5F-}>=3qLP5vW-ok!r)V!C-?$LRQ|aq0-6w~rbx_DjE7Hw8NsLiKnYnT`~nV)Y|}dcn^wCKc3n zlf+8Owl#ysbuzyv)Fqh-qTNViO??;}jKPYArE#Ku2FF$IV~KgB;~Sy;QZLI|KT2uv zT2BfQ3oP?W-#j)_p;Z}}rqna8Obr+uMJNyqYw-xhe;kyDOhvcWxciim8gbmx%5qF?ZJ+rN34CjoP=(@#S6O@~)Uu;&ADj zg(^#hSJ-K6BJCNgLIa~QHT%ok)gnl=`DsMbaN4Akp-R<2ayg}Q6aR$@YDWYJG2P2z z?%SP~NTZRCae+YiCn#L@%>D?0#>z7@la5XNSISP}>m}T^lhSU&o=X`EwG`50E&ntU zm5wWWik?z~K%{bz^LLc+K733Kf`olV%)a6}E!XBOMlg#BX{oNw=vYoKWCvc@3d(e( zyeNl$B(7fYv+IKnn8KbA&H)nwkk$-`sUyY~W{#Oui2rX48^Zd+HR_41BLu*Zs*!e( z7%b>BqH#!VEHy}KC8N|a_l`HV|5nd8dfr|cU$sMArCPqfn?X{WZIGl&ksWji%El_P zlvWxlW-6{SRB-0;N(LKuDvj`0)G!QePa}QpxMV}6DrKXj@ehM10l`4KOi6WI#dTvT+1x3gac3DYMngKfe(Br7Z? zXDvB>1;!80F&h|2wBbX;2C-qoqzgxe zlj)txMDyw^0kL`QlOr^+FZdb+ZjWT5<^7PH01(hZV-t zOv0ud0nX<@l19|54HjMq#c^FQA4248Uk@xmn*9X4QSJkcvE4yJbg|=Nu)mY^=OguoPNs3Go`^2v~;oZ zUHi*9^?mkC>6y|e8g%KpmGEauBQ44^^npv1=Q9zK@|n zoA&`zEP{gB?NfAqz!Zz`m}341OwoPE6bn9Jik>^Ac=qq2R^i0F{l~gWILwutDTh{k z|C#c6uw9A1f5wZna1>di>G2|cNWE{oI6}mOd_{|qr+z*t)rZF>)b&beDF0=KFG~*} zEgE;t2aRXS^`VUh)c3B&_9OrBQNY%?`$MdEDIi>_JsGV~8g<@v>?Ki) z@Ii7bx%;#un>FR8-dP+inD(aLrJkZ0wTkB7Z4J)8ja2Wlt&r+n=707d=N%P{2`v;) zm@o^JPLxfQV=l09<)`iAo~Q>ir#hzvbE3KMHz@Ut>`M7Sp9t1evH{DyF( z9>OkNxcrRtnzM#0$OyMk2^X~>b#;b}TH&KrFuS5I_=that}_*&DJudyf#5qKafpEP z%%5N!Hpo&yVake{k_qNCp$U`gNP19AxC<3NXdto!R#gg>$x~#TR1m1BG9eO&KzTGX zu%yE&Sze-ZkRgvb5jd%fmr7g}BOzLG>cQW_vJp z;X&PlQLDG0izOtGopQ~m#V+sCs7vkAFbiKoUK$0_&%>*g!U}AwMyr0AqVO%VY}42a z8aUjJg2>x6inqjyw_LgJ`SnwQmrGw#m^JJzKB%|EFL(;^*#0cGy@1SL(i&9VltGJ~ zWIb6#lvk;|ABQRq`-PBW1CS<~6ZURYv-B>S(?6R<48c3W(wPWm)*x?~lk{WQU( zDKf%r^(J#7Bhpb51StU7Q__}{_j5PWpeG%y&0~x1*nw(TQb!JVAt~(6zzTdZtjQ|Q zPs?kjj8iMH53Hp0`Qu_)>&1qP{Z|)?>-WUU_QuQhie-D}%t~MuOF6s10irNeuE|c>h5f;{-JZ z>Dt_7W5ml=h-GM?%toMdrxlHJ|1tg~9VLucA*Mo&v;0!8NLWmQb>$VTWXM7%6KKgcGY-g#?_+B}P_&*z3dBoeJ$eg``@D^M zbliBx1`fnFvJ$IZVS`5oE3vQui;&WVJ*ehW#Y#EW2FOyc`AjZiy0oUd z()p(_m@{7+ry0hOva!~Y3D?0?qUWyL6#(Kqa)BZ;02OvCvClb z2X^-CNLm?3Fj!_nNMVkT99O}>V?f&Os2vQs0Lf922OZW0bLp&3LZ|D(FjytM^np;wSADD`zH0$N<>31C8}$|Blf}sg}nsQIymh7 z(3jUt-7|GhqPi*3(k8a7o61jAwXowvn`RfR!12*IKlEb9RS&j6Hs1sL7|r)!OG)!R zQ@Pj6Yrg3GymQ(YFJC5>FN?7|QPvnMTRL027<;G_)h!pBujU|P-Bz-!0T)r>PMNP) z)xZ3}OOMP{t%y~vfV~VYETrJ*`jTZ|d*~|(N+aSFD2WMD1$&cB6Lr zmF9TuI?(w$v|`KV#$`nyJ$lVG59KVGn3a{ zz=x!HBs9Y8-a%mol!c^raF$>)2bLX3PePcZ1ZXdj@FF=jU^C%8dOAW*4tWWP1+qH^ z^Nf94cX#*t_wMVue^0lNOJ9u?j&04ilb2)&8nMMAO0$o-O*Fb*!+b=0k!}$p zEH+dSBFx_oAvw8|78vrFvOK%~-1?V422m&OtCsI?|6WgQ?E&1h;mKfJ&`ramYC8=N zxOh{t-FWM|s|5B9r;oi=9c%8!je`+jqws1e87gFVytGd&?TZ!m-Eb94%Y~~8@Eb4Q zBEofT5nWrT5Dl~5=9da$b<1cY^YyxVI5l-&eBkpBkd^aDyk?_VvvHz_jNnwgF!bEe z%bTyPkKNPvb~T(IN8r%?z(?Yx4~eA@P3%b2HBMl6c6Gv4D!Lk{VTBRau$LzmE}qQ6 zcIq22&$A}hv?}giExK2uBKb=bt?l%w`Fdsb#BSJDoY<3a)x=z_iH2n)jhZd;h(-0& z56%>|!DJ)E*B3U$7VV9@dqj5+Z46sK+qg_@JP_->Ki>F&*!aNYp2Y#pwd2K( zi|z5obz7doEUdT}M{c;7<(^{TAuUOdwv)Zr>z7@t@0h9Yh}W+b>(>GoEiMKwT8twl;KT|S z;-1S@LVtjGX!IKI=eo~#%zZ&gThm+E)fo_4b^LGP0$epw#s=ep; zPC9P5OGWI5KQZHOkGb0up1NzE<{3}(^vPGpUmTCE-u^>VeBo|!;qJI+kLcMG^S~y3 z&9%a&nZl;&hhBZ;#YbW*DaeA|;)31r!aZW)o><|B7Nq)GVdG3;xaNJoVQ+3uZhEri0Q^gfY)*+_NR#>0Pms zcHHxXNR*Hv(IV`q%bLLTEUz`~k??r0d0J+0Vs~xavsU!1jd`%`Yo3%4v}wlEH2tx- zXO-w#74xiOL0e}$tr&Bjb)siojNQyU7VIZXubE*7!_1i~i|XeLAH-Q}Xj#RON35{v z`l8kJxNx>*`IRN{mMvn-7Q!|Q?&x2*>`HZf;bw8+W(wZ~Du;e+67>t|w>Ht-LBEX& zccpTk93}zvqSXui-}J&sSC7=ME1opsOt-OBD#Ijm4XLoz80$)F2U7SRQWu`ZWTayw zF{6jxj0r~BqAVLpo299SB#t;hhzv#_h!^*Y#l10SuS7d%?CoI02~A!?In8%*dP*6H zdWyUg*}qvi#~PXDSG@_eA}H%nh_MBFXQ~2D~Bj)B06%7!0IShtuB*X3jXC0~xnz z92Roe8DADMGr?IeSRwVMlfP^iOi}w766SKqg?yWOT)t9lr>H}#@xs|JJM=4Ttm!OV zE@b%m_|3zwBWigfCu)h>IOj&B#u;#0i_Ty*!Z>jzqm9d_?^<(dFl}ucHwKHMHpq=s zX*beH<9TDnX%jYR&(260Y~@_C6kDG{VLH@iuPs+}r`mGG5rR7TN;gh#mvh+R=9R@db{@2?=M0N{3$%J~S)BzWbs*wypF7eei3hzl>oS2{uj>&5q5 z_9Gz0IS9+B{6Vt(K#I0mLK+W_<$E`!INB{^Hn2y>TMv$%C$>LM6~P%0Sc8JY4KBC5 zMFM>DFjlOvgU^`q`%gxW;Gl|??aNn#+aL1wOF{@OpIpKe%(Uw=oXkz-g|S#xE0jxF z@X`?*jP;N6(OFG{UVeBaax%rIKZ!HY+7GvTg$bg1Nr?=6UOI)9&Z#)g4{h&D(eGnh zQg|#9I0j}I57V+x$PY+T5r{58M4t!=sGD-=S{t1a&X{Jz>KBHQ0rZs>RUNOCOfZxg zaqLyn&^&g6G^Lgh2@eAvsuUyDykrT3tP#;7Ijwym-AFYgSkg*c3pf;pPQuoGUx{rk z=np#fgE)MLV0ssu9C1>0C?p-YaAZ*6mH;5oc(kmLY+@ilJ6kioOSnjQl-iKE%Mvs7 zAK-1x$Bz49SX1GJq#czZ(;DHVg`SedT{1AB@UqnnX_3g5i>bvQ!^m{7h=h3SDFa#` zB5gaBg&6kWJ}@9i7UB)^Afv;BK{{qTeG&Esq9+SeaOjU5LHJ~jY_cTjQa+(nejEWP z)Y61NOmuL{xiBft=oUb1N&p8|0#c^^#x&T3jfi&x?GpYv;$pE=YH$`m|6nYy8uzqq zx**{yxlk5!d2wI&+za+k5p>JEL{0S=iJU6!o@$AecH_QMF8#ut*m2#BMUbh8tPW~i zoc3M*p2JdCj`&rz^i(^s50)wNOU~|{TKdl7O+SP+xIJ;_9?`i64_GZt-5+x`;GRBy zr7yN{9qy|GvCaDvjjfZm$;Y7mmZ+$iv|V>qzT6gbwc}2-ti+e`c;SNC+C`IjiIS=b zoUfP2chmH>M6s!XrJ2r*MjrNA=Q;|o=+e+VY;m?dUb;gp-4QF?G3)f4-HT)FiZ*~i zDr!trRnO(w@(bQG!1*~jID-mKp#ds>p6P)vRlign%Wt1B%@&no^%SeyF!kuvqgU%= zMH}Nq8^xlH6ShQNQ7o?pD<5z3#I}iO+*y4iziR5<=|dMAu5`cMjH-aoQm`6@Em)0Z zWWnkQ(~X+usXY@W(O!{o6-_wU%-fI7RxgE-nx=fso1y3fD^5I)l3*%&W|*IY`WYFZ zW2$*2DPl!tlfy#JFitSW#mkDjn1Gq_+C~1ti{)8?)Yd4OdZA?` z5|gyT&=TqggJFO+0!WtOz=cs!sqlS-(NT)Oj~8PLQXw>rj|$M)Yd95?1hszuI;sb; zwxJU4sh!*ub7De(7ftsJel#}AmQ(vNVv&)El!t`uD7e&cbPk+AP9vpyAKsr*|1df| zRdYFRY?E;s++{cz63g$oBJvxuIE#!9EDtgri7cc%bjCjkeh7|kJ`N`xezbC3y#VY^ zX8>ufd12?1k%KZSXV#Ktmo0iS1aNN+JPMH7O7^8_Hz?t0&Z~-6+r3*OUd56Y4&DG| zK(Zukc0!*>X0Aqt=-3|OTWK^5)b5sP0wP{02yk@(#;hn8$ut$)TrP=Qm8nXa0Hxze z>6m#{eLz`)fTjsa=k^4=ICdjK`P1Gl>?$Im8Xb*A$La6^n7$(U*kD*q0>niKCwdWC z!)OwPq(W4rg}He!jE#Dz844&XFh~UnP|?+7& zq5UD4wpr2DqP9{N%UO@D$HX5|b5y3Xli6Rx{1X3v*n1b~D9`jvuu3XPC8>~v?m_}e z5<(Y*xPt+MEs(exfkF5JO(da`u&|KuUy=c}aMRsRTR5IX?%-J6!4q{abjxisArm_x z8FvoZlkDl4o!+S;f1j?S9qo|pcyf~2bCw>`la9CN>^{%?{r4)#xVw`~_RLT5>94>3 z@BV)8_kQnna2t(fZOdI|>Dd-GDg&+e`TC3X+rpqQ>M!B%di<4axUWA0@}d56I9wY( ze9%?rX?Fo*co`&!o$+*!tPFZ!ez;zs# z{rO=WEa2nI9;e|j$Wu)lh%oFG-axpoD5cW6gqYSO49uV0EW-*7)>X3klME!ybP~r?uxD3SbIhyH4fb#@=twPl@hj~0yiWu+0 zjGRm~WXvf>44s9Gy+Ob~dO-E4PHhxEveW@gtV2hugk zzl=2-&i+Qi4OWNTBiU%R+{9HtrH=le#KJjc)p1GH!BIfj24L7Y=NNR=jMZ{D;? zPUGi>vERUTpP)XRh^;mdT{tSS71zeLS^#+xI!LD&9FC#xc%UQRGIl3r7b{rG0+g}B z$JL3+UZguawI@Mjz+dv4pePh;?AyE}T`6Rc>2%`*JatiD)qIV~r z6*mL%{5m}!qSf^5JRBSn1qVGA$>2K|R3}2=M5rLKv^r5(3QB1Xl+vQCf}9`uko*mk z2fnQA97Q~mU^K4)Zqo7Ju%mG*P`RD7y2&6AE&iSi6ttVc0~y|suxbg&xPlz`OX=d- zQwN&f;q}sl1^!jbXV1Xkxdk`ok%5uHKDE_4bMyXEUyr8tXBV*Hh&#effO|~?%Wou{ z?bs;`e*QO)4}s)3IS7iRnH&2lGnXJ3D;p-3bB@qDozEX>Z)@AXyHoCtL8FXHQBI4( zC-9=iM1TZylIg z9%+brLCb;olc8;Zi_ig^Sn2~Jmt7Xy6Q&yw;;Nrm$!LSxu*796+Tle}K*HfO&`TX@ zAVDm1-WXoJ6DxYCZ<{p(CKNc^!}n#@WYUIhv^oFFz(4Y`bM#c4M;mw@#JFs^N~u-t z7(zK&NCIpjxHuU)15`pB1fEu(b^&ogtyY^#Vq~h=Xi3gU04WANnN3GiT)2WDp)vV2 z!VeXXz%E%LJ}MQ=P*U$w2(p&=7$C=U((yS@IyS4?z1R_*5yunrf;R`2D3_ZNi&$h1 zRx<-Vd&=45%X45buxE-G?Yc(thWtgGkCsW_?~Htt!%c4f4vNE_vkreiXp5Jwh-F{NbB;TX(}5S zmmPo1lc(L)JMdhb?fuz%=k#Q4*X^8V^wZV)1^VeROwu9?^wTo7bC<3iaP>3m7uL^e zbA(|ox7fTNSz+GcsU@sP?y=zM;Mk61;Gvw4hFjG}N&iUmQ7Os=Q%~4|ptZ*U(_&x8vkTA0!mc+R zDtuJexp-dN`5oYdi+wh~%YwGn!GWHr_7r;}pj5%TPP}BB zr)xjv*I#Gyw@eNa!FX=1o=erH?6oug_d|%Vy8Q=7o{K&9e5`>Vm21gN>y4%HqBVNanpkMf zoLT(pcy5cH+d{89Ept`X3Igx6eslnL@#?)g(yG0B)!vCiiTtW*|BW1_d5|b8pA067 zir?P;)$LQ44gWBq)o9RLo2PchbDQ*BM2!h#xA||4-KqZWGy0Ar@ik8)%9eWgS!-!ZFp0MkFj7dIhc>z1pa!V&-bX>RN6 z%YoDupbC&^JdoPLLY!S>y&J4G>DczJ*8cS&zM2 zo3L9aknyNQ=~9F;2rv+`Yz4gP8*tj668EpV1alzo=ZZI&wKLv9t8a`|oDxAczm}e}jFoQK= z(DUG4fdv3^oJ29tUgX4*6uC@T&3_aF?$Ko5)$87=mO;S1qDoGTj|rNF+6 zeZ9DaWdFs+mM~|{>T?uFbBF^V^QWK7sHz*wj_hXe9(n3C+uCI9>6q&vI0vz2j`Dm3t-`}Osn>=S-2vtuyn%>7!bSy@ZlMheKsJmK5D;g z15l&W`jUf(yr_gt5jLGLjSOa^jB6AFfY!4Lg;Z>nF2tz7XgC^&77Ihv7y$xBN`PP` z-r?b@ca0Cn!5keWF_N|s!HE^6Q3)r^(FCK-_EA^He&oV}gOAQxJZEdrQkC2680NuC z_Hh@%IA((;OwMK*06ClI#w6M|fze%*AvquU;s)U;wFWe6{V ziq?Hm$QPHh9c9x}Ljy>11-fLbaFDzlcQN<-KS|H5M1!vQV);AN=iR`Je`ejJ|E(R< zi{nML*lDewWP3$e2Qf9I+LEoo51Orau&-yxvQrZ+eJ~ck!`Gf8)%HA-6G&zQ(jabx z!q!k?RVk0jzha{_+j;FyLihclnXIh92LNiX@jih70 z4~&s7j0GMID}ElBz0I;$p28{t=Fo=rXpB|On4-eG70S7=OWxj#GYta#DB_vqF-#k{ z&vpVDw72oy!QGp!g!g{1kh@OzL8FGOF_6HffJ!@!Zv7=EWD9bE>dmj1s($Aged*?S z{uVud3x~BL!8ok_u-&YKmn+$MbFsUzMWN7B43L3V?%cgFp&V{?qUdt}|? zi7^6$!e#Zw`H{xsg?GyMu| zJQ3SDVBU=^cjR%8!Xx!7K^PS`U*_tV20H&*mHw3RiH3 z7+T5MJHnSFI#d^mg@z94DA{IIowX~ zP!#0HY@wBb)r?XBBT7&<+2Q!Bc8^nR7Ly+lS^WS-g2fCWQwcFt(K|WQ8*T;S<*W5_ zhEd8cN`wk0_Q;{NekMI$)T|dZPXrVBu)HvTOjK0q70nZQuzmZj?O)&iwH?5-@ORyS6h{wE8|&rk1XnY15ak zo9MVtTc5hQ>ZVC3%vDUa+^RJrSrslSM4nht?OYk+H{X0&uSb;ct$Nv3$iNsks&?g# z$ESi*!TaIbsf>@8)lK)!oQf~ot}kQk?TXEb6^*d%n`-}YIzzX*fBU$$X=c;y)prZy zwQYKB+f*=7wruhXiJGRVte+%GswTS<%T`YA{kVEnqPS*mMaxX|!#xQ47+(Qv!9B6? z9@zKP(7vaJ_B}O)lX=*2YZ~#)@%m}hsd>-^w)J|`@wNh`|7BAnfmv4WNjmJ=* zTE1>FV>0q)?%zFl+K(}p(NEr>$>o;~nodH0mJM3Vaw>geYXR(-mwO|!w-A@fG>JO7 zoM_#N#{0dz@GK`Eo7{GnL?g#6ZxrT_seb`8LEQHCP~C4Y4$dUkM~7e}LDwhesitH^ zXyf5Yo$DL~xG)DStrEjtQMd{?aPG!gn?c!{!=0nh>}po@M|1corKivw-ZL=NGsw_- zILbWZI1li2(Q0yuTfzpfLXP(&;@LdWV?pCcmExe$ezAwjV^OdCj7Ul?{05`elN;AV zj)@b3@!fF(z!}MYU4&tHjkV7Aj@fXL+)JV6llgKO`wSE5_-%W5o)=m2g&$1h`$z0>ck)R(M{=dROp zv6}taOXrHJV9G~U=jnGg>y;Zmd`922Z?3Z8)*5K7n?}i?y26FZNqLORW z+)U&ydaLx>vRLkNe1OA&W<%8uLesH+eIy42J9Ogd&x9QcuvRSs^9&_s79smhICNYP zUs%M5Q*LQAHWkPJ;>O#UwzTERhB)DCWk(nNvComdIV52MP4 z0S6FZgL5v102yAR)LH=gfhoiQ!jDp`6z*YrMSqf}AHW(=6qDs43YQY>6#0ayVwY(W z1`gC>KH^`Z3ND6*HXMOZf`Mr+JuIOH^Q&9s$I2qOh40PtyIRb6%Rrf2qg>ZY3&UQj z4e|;q`}A_Gwa#)*vAw_&Y=RV_el=TtYM$aue17sITGHu284Y}Zg6w=EsOykpr4s1p zdr<^sFm#&)tDzpowSaZJ2wrRyA;K6gf9*H$t~Si%B)-lD+Xn|BNF0c2`FIAY3$;vU z)4|7b$y&t!Fq3wokL$P*U6T~(V-w=OT{{#j+Bm)I#$o*7C$!PRCTl({r3?He?eW|_ zdhQ;I8p;xd#n)ER#JOUs=ISeNymGVh#&W%SYb>81#1XCjsQ>%>VmmwWnJXh70d7mD z)35J)^Ob9_Oh;$d-?$JfT{D@UC@P&eKq~@G=n?GzTIo{MCW;WWL*9xP?ZEoZ|4y2F zfzgh#XC(&YnBkvCnbcr7!7|wV%=_8P)v2D{I^d^ zNDGi{ZIL`AS(HiXf54c#K#J2NbJRtUVi;?HRJkv|d}?E?e6#w*^S0=DTVla2io(R6 zW?j6O$!x;SYj8w0;ip9iocj291X9;k>lHcUd=h+ou;<+ANY74~Z9rOLp5q*hJ>&Ob_LF<{Pp-8dXnX z>5iEBxpF`cEJ-X~A%A0mCHN#0?i^AX);8R@*N8~s(E0bQ0p*4RsT<$-!NxRcuw}pl z9b(|8%+!t|FOZCwmHi5GvFGgF%RSoQz>9seS?G5cWH?Sp!EmsPO0uJU2|bLmhZ~U{ ztgpP1sn%HDvUuJyJ#X2Sy@{;6SYh40th!iMU81^SB3BPCi^&J3Ucr@ks`|_(o0r+2 zhtz&?dH^?L>%yo=xPLgQw<(3|LjxBFhQ^l5ACdNPv4QM<3Z39$?in3~*0`YSj%0I| z-$OmxUohc(X@A7KFEbIffUofGRsO(ajD4ji&MVfxM4&MiXuMxgcx8Vgzw*jH{!>|* zp%?F3SHQS?$P%1ggKKlxP9csHf;qx+N@xaZ9opTXL-W}s-Y1O92s=#(9qoWiW^JrY zV5eCsa~;`8qM76D@k4AH78$CKWpL5b`{Maw;dnY=17P#JC|7$8eRP6{_AZ`|)p#2U zX{y;$!Ju7TU*<@b;ANN_VXJAH?$uYe#`AaS`MYAlT{3_jV57gzN(h_U8%&T1tZ`yY zsmMD|U*SA4`4UUtiI?qpLMY*k-Ts*kpsMlrHUlr<@4~480w@r6WMq}Orjw1~l_IdP zGfpRs;Akv_U|sNDf1QSLY4BMejAUW5!3P9^m@S2m<#ECx`_%@BsarbsG-k|ZoMtFN z?YB^m_6;V)c$A_*+T10tV)m_#mDDt;W75wL!+7(xY&Y6)o|TgrniZ){zQ_Hb>9a`5 zlSN4OEp6|9)&F|-(1u6LL90N%52N&=@pKsE2VlN#(fBZ5Pl_Eio_RI9%Umxm{llx- z;~8$|q2K3ZJbT@``F#`F*o!jYycUdQlxo#`H5)^p*`Xc8V8MFu4FZon&i@Qw;WEkzO9?1qrqD?lqv}xQWU*E!`_pHa-X6J&P zM$3|~s~&R6Ilf+xw6O`gPO2zMQq2Ft_^UV6%ubbR~m?U z*(JE~&6dL#ma?>V^$KJ{j>8j{8-is0Y6Py?TpGn890kr7QSCSIM0*Q~*kD@cu_qPl z_IJ>tv3$>9O>#W^XeP#kURBE8dU@&#O4A(n#)}^RcuDwr%M9XXrd96q-_BKkReE<* zV#DL#JCt|~tV{mt{B1I8G7B8X%4(I_UwKk8^DnR^QX@0@59TBF!(`U|BHC&$KH;Cf zr2gJMr2ft=SrMyyF23Y>eaZ8&;^z~qx6^A&)5oFmsj}(%c&JGa!DUg?T&Qd+D;^5# zp)j}@4+5Es;AkmDQs7&=+fV;2&9;9QwFP20tjpqTtj8la9*nqr{NlKgmK;n2ZWuqw zBrJ#P#~NCU!LK)|YRK_v33q;kxSB_DrJS$DxhlNTn6BgDScN@*bXUM7ASx_fUAH)s zRcItOL%M2t_U3a))F)o}oL=}`EcBef>APvt&G~{A+TeSY@bnCd6en{U8{pk71(QyLb3J z3=>iW#A6$TYQm794OH+IRH(-8RXlX?@n(aJ>VEzboW>T}Edef55C0X)c*xy`0p1{0 zm%h8Ug9U2?iS^6KJR5+{(y)`pB6A_q*LU8iy3AFz{lg!jdhHto0}`?e629C~v>Qym zj91kheT8@boX?p2J_?KOz#|ht(5GN)EZ8c6LVl4Q_FB1_WQ%6K*%~2O)Z>VsaPdc3DgIfMR+5_7RLfdh7m9j zrBIupVeUCD2*p&X^-wHRBd1E-sf#B{Ssk#4BG(JZi4d!;#k~_?KZb1Sdd`X z_qj^QF9$>|TQSl0#^DM4Q)`9m!@R7Pgz}#CgT&@q#DRZnO6Wef;vv%#=YCX`IO^L zH}x8Ig^Hr2%jTtz`|W#0vzf=UfZ{rG6=*&Tlj@|7udaa);HR--ZwLEc>gxJ4c8}Z| zMgUwo)prv*$s6<{9*-8SoGYt~71RM~U3+4>PhYwDUeV@QXtQ*=MyvtpsQUQe!L0OwWcgO>&~90%cm42{#W{ z;L#%@6oOz6W%xuW%IDC}i&BhI7CvO3WavjPl4ddof&`4H`8b<9smiH=hC1H>h?NB)6FH_-= zEwLi`gi`QP17_>~0da`PDnAW}*vQ)&YGRSU_F|DP+mGvlSVX(U(ezLo(h??#&xj=+ zBbG3d1+jz(X2HwJMJ1BB=n&K@*CR4?grzedLx(jO07~z1CX;}IieW@6--F;2o`WIJ zgmOBxHejA#NIwd^euA6Vg6@6AxvL~`bC%4|*=mat0|xKmd>3ANVvJ72~=Zbc=VurwM{j69AtE!Pii#IUByKL2T$5 zich2c8b@goi8V?rk9`on%HIHilds|=4;VOM+T0S1+SQ+{9=;O;C^*&Q=HZ(xzZ#gf z`s^(5Tln&x^+3x-fJ6T`{fJRwjo6!h@K+YDL*@f!Gmf!>&nw?=`jQ1=uC{vkKan(p z%d^tS9kV6tZh5tPE~24vFf3L6XxafE0~jDAq<`pu+qL7kL*ngJ*>h7k+8T~S1V%ni z={W*FlKpF3AS@kaxm)ult#H91AH%y5pSz5s2EVE?(D6xW=kRd2A5ogHr;bwir_Kc0 zkC0EqwovEzD#7R1nF#la>@8tosnGMHADl={1;-~*u}rU6 zJ(-y(ULvmOE8@kg^x{>Meps}C?w(ylLQj}^DWYxLyHZ*IS~eY*M{^xcbU zZ|%{WTko#8`_iA($D0r6%?I!dZtJG~U*9|>|KM(VYRhEXWZTCj%cld=Pv6M8RU9vA z(Mw>d=U=?XpQvn~>YT2bUN>EH{kd3W`_0jr&fC@RKl_bWZoGo8cLH~wzPtDjj^BCa z&NCl{@Bkkd%Pz~ovg2aW-sZ$u>^W@;U%^@zImHA1J|Du>{*W2}0Ermhn+G8$?`?6? zZ2gpb)EzY!DY$PtKd!3LtD0vz@029AJekGPz@mv~0FUDi>}?pc`S$Hym-*JKSr1TG6n&ya@e1_$nHJUdR9p zBdJhH{fN^r^yr7R6qq@R@nP{n+zb#gYP%%LQlfDIt__M1+fEj9-gE>kd=v4s;#8o7 zxt*wliuV+78R-+(da5Zue_kGj`s9ZLBW_@0i6hKH>Gg- zY8%QTmjxZh_^~wuLoj1%Xd)W{?gWM9)f{eWQfF2^QFqd=&ZMTWAfvh#j(9_V{pb5h zkH8SRtLri%OhyHY`y%dPG8$kQ=!W}M1MG@jW6GD6C9i6&jRf$+laAqZ_Rkz?m?<{E zUt|B^a1WFQ;a5!Vq&sq#)FqBC29f5CL!;+T)34FUFccKA##&O0q0z95;Z@;FcEdg$ z+nDezBH!L&C5ayq!)PpJt0%M%)_PpO8jjCQ9E0f}q=KeZ2F;^g*{s66ivXAaQYZM= zbNkyC6ef5<8Lgx1;5{4BIir2&z(OAAbsJh=qJF$Mq(gJybr6pF!j>bpb?aqW8a~*( zJn#k3Jz+LJBAVERmqI#iqJ;*!b&$4ZLQ7B&=UlX1I|-MM&T%AGNKw_6$<@;^8<9G z4(ndDL@pOYiU&#le;7vMKHhs3noZ^}!UN#lBwiGcBx893y2o(d5L|GAG!n&aP|kwm zjpBIGN;sj2g;pkW#(t)T2+QVGl<#DUeaMCs*bPxA=$D*LshLK^p9a0CAr@+orgZGl zeiuZVb*kqnIDr2$G~+mZVQBExyi%X%;ay*p& zo`+9>_vDn$7hUgp!ujDnlTw53j8-{fc{hSzA?oSKH4eJXePTvF%jeWk7EaEN?@q1u zc}F3c^HOHk=JQa4x`M5R%Vs zmKF(62goUhBIiYTaI?No{Hs3kul~gU3PQxndHXK%Yk$myGj9s5GocaFKXB2-vwsc0 zkGUp7aml%Yq6hFJm>T&-dj3k-^DSDMsHlXi{mjJT5`8iJ0%hkH`N z!(!sB$j+zP>n;|ViZ5SeKy4LntObC#Omt0%F6Jcm4yl>+N7q&#q*!{*-`C1 zB(uTu8eLtDTv8l8Ze2=k#ujMGREt!T-BodszRWucmlTe%_yP@RMf88e^DEZB2Wice zZ!-BMzpte7TE|58{p`iiN6iKlBl%IfFQ@R0a`hk+_q=Q5PmPYB8o>ctwdPLU_eNpJ zdVA}G^nz@7r%I8m$mS1L0-35ROA34dnJQJZ%*69G=tslwt2a?yC2j>)=dqcn9OjcF zu&FM>6bxVJ5+Vs!%RIJ4EpX-xbE_0^{;#+pcwNbNY9nLw!&~q1O}St$#>Plc7S9eWgA&rzd3h8TTPGX$gAz%TH#O7l=?1mb5NTIl46?1!U${Vg5vWx{dz zE7Apj#pPl=(0+&}{S{$f`&)Dx_*cTT1i{0WlQmRje##%kj!_KPBX~_k6s2hfin+uG z%%%MRWw}?Jjwc$EUngLXBLj3V^9v_FPuriiH^;7x#R{saz+L-JG@f6J0FOk~o&Gr$ zWAM_wqP4N2wR4qq)4gAN;`$S@;-(b8++GPjbi8t_Ubz)9;>5apra$(?(OB8Bc-b+% z>{zVenAj6341z{j7g{FQ!*2X}4bWw>!urx}csP+Ufsh$AN1-k@7+1pnf(~{7_t{`~ zWh61fawD1eEd(YQ7+({-9m-&=xISR|M`Y6E(l#&uuC>5RR z`FaP$uC#T&MKD;6oRC1wg%)4k`^MfMhN|v`s-`+E7PO(pV~|f1hb9iGc|-NqMF^G= zn#2tahMdH`ZJY4AKg~z8A)82X;|l8gMAD|6V{cUoqQ^w7@%Je9`fV z|KulWa9rkWGY4z~{y%I%@|NH7$(etdtwc}|cWH(%&H`(8Wb4Lydy@0OMF;&w!KEaF zT*}g#xZ~Woz-%bW$yS$soV)?L==>L)pjBw#PfQ=32V>O-Z}(0&O*hRP`^K6ZYw*?c zk?Hxwe+sfKA;$lLi(bqa17{IVL!3t%gq_CU6y;%vM_xl+V+#R}YU+DzSA^{X;8ZNv zE1F;)SXMnbHofA;nt0iIy=*-;o)U(1Vwxzg`mOA*XFD5ur}Lvz_-=&nEI+81AA}0B zmBY%t=!icV-Z*yxZ#0{9uSdX#HOo#&gXuAzJNG4_O)!C(oIq=NrKSQG8WBYl-sXtV zVwf6OWmCo1m(Q$te|4<s%HyT@54Ns|QhGH^SS z1`Y@no0~m&3okC9Pgwg|BaPCC17tmY4mZ|ns`q-hbt*a7c)+=LdyT|@yLQ}ftiA?o z^#KdY9w-nl^dI+bfVC_~ap%s>#B`P-D{$KaE6`#O!6G8XI{X99?o%jGEkh{SS0KI- zl0;d>t+RIuzuW)O(Dw&oJD!WTJg>JPx;=j?D3rhU%bq)#9yD2exDvG|!5-z?WA%^N z?B8b_*P|FRhoG=)HF0V6^;6Ok$RH~aehdljih0KnR%xliRasQt80Ofs!rVso9A@Kk z(^FcdQWS{z-9mmS4>*kUZ5W_Q5)P~{I(Jw1yG|%^`VsR&j8^g}H7jQZ?iwO#qtK&V zpanbwrR*(2PLX?NToDf|3Mv=AY0OXZg(XKqT&`r7)bGN=lRnQ{J~;&TFhc)OCT5GS zhQki}#Ss|8sTD2UY8o|wVC^#u(pw-%m*w;Ci6sQ|ER_h6|0x9u5*C6P-!)W$sUhJy zs2)VyU?1pcg_DYE5uJAO)c=UE`6tK?>d(Y9Dcc~GtyuJrj;k0$+E9+bZvYtZZ!+=X~n9DLqoIGxOU={ZB4s=?FtjFED?O!wK(`O7Gj z4wX9Cc)IO1PSn8`u2mS#o>|YFM;*+;ia~&gusi$Q7P1SJYG;%W&@qPRxl@x1$B_K8WfVR2k+|9fRMv z{R_?cuExmoRn3FR}*VjWGxDjdO8U0lO9HqVY_md5kgrjz)pLd$FniZg~^x}HlOZ!c*HhGLnA3i zXs9gpb7%kUJ|$5;&G2Gr?G=~d@ez>hpi3q~;G7iU6rJP6?`}vywC?QjT<7dQIt*bI zJ`HNe;UCkS0nDPKE#scm;%)&B7{wi9b-R^aw&nB$KAaIcJ925Y^#l@Itqo*|>oCG0 zki*DE+*pT^&l+w6s^w&sf%=hC#owVU7xg2jiY@a}KX6vr2RBfC=TaUi?vW&FLXqal zzBN|e>W;p_C(e%$9-;`Tv|N9W)Z33xgy_R+?HC1Z50kx2_A%MdrdS%@0@@Z{MzRg5b ziiI}ju?z#I#!Gx?DKDU0?hd8nXZV$N^V;t-5jtAPY6kh9O&=RLuL$g)@;&m*#XE#z z&HOsPf^7uuuBt_;z+U4^oGuCM(YQ$Q`##_U65z8LasrsmGR)MqJFF0uigr!3B}yvv zk_H6tt^grlzKHs^OeZtumQ+vI#Ts|t?Tjxupf5QvnFSm3SkcNvWzEzU$ZLz^l`VQ@ zi>cV0ar08VWSw5J?nl0&#RtH+TJ~F^uZO0O$IDmg<*O!J@0VA+b8Nc!YtLVQ{_A;D zd2>~@)9o`mzS|hDYSXLQzP~?KbsV4j%ePJ!$B>M|t113Y1rVL&o!!%cukF9S|EsS| zzB0G0KGv}JZZQ&k;>-5w%jnVIqi&jYxnAF z_u@ffd3d_@>n~5qzeIS&)Py*F8wjEIHtZ-GB9}nT@yo z?{E3R#;4-pLwfkogKYi+XQSZ*e#pm9Pro#M`bK$d`Tkp*ZWrI~`Jn9Go$v3&*E?-@ z7vFvQk4x^B-Yxy;DLlYuD)4vI8y|Ud>$R;DZD9Q?6>^Mze$nK}>*EvSJV&MZOSVjR z&a{2=E+V~n zdgG3G#ZJ9q=Y#ZM$r1nD?nB?}{o^P8 zuiYIFx9Q=w2ifvG$5-7jlRooHcaF!yyY=wy2f6aNz_+|%W<#u@Lw(}Q4(rPf$I1`? zgnIVrA6M4g+zge3%58e(HZXBYp7g)9M|I%il1ja#@z!R2)y`P)6F7p%|=R>TTc;0DW%n`qdU{=X6UgKAh zzs7m@XT+C+Z^=f`h<3DFO#THD5yTq^Nzf^iZxG-7OZ*CaWB!966$4S+Fp>QrkWN8p ziX7P)^Y-%HSDpboc91xp?#QL-O665I0SV^W0*y z2cTtB_6Krl%&C1+p0-rK?3}5>3Tl6iY%ppN(!*xP$ug3O{xR}9cylxS%5?(?#xL`p zq=Bq8H(~Xt9J(-RsCy^_ON)51fBNY4v$r;WSOWd1qQ~?i+G8%>lBnD~_006{>7&!T zub+%nZl2kEyXO6ExZ$UGvz-ynt@p=^4(LS(;D&PX6N#m*Q!h{VPHWS>*FPUy+B);h z?OpGm&{sc+dweGMOzuf636m>0lO9{L3LgaNT6wqdqozL{h_5-KuQ`H8Fl9m`>UM%j zSNQ~(bd}&7`b(bpxU7ot86LkAiI?rx%Xa^;?9jckL*MIig)%hGeL5ldeA zpU`3N8u=EUy@&tmn#K?(UtVs~1$;Djoo=Xu-2>2`c{xv; zlzx*7=g$4B9>=-RS)f<4bho(X7jr^_tBC(fxHV2lQ)uNc?u67#kZeGa#tCV|)3FUt z-|hMEz@3+V=gP zW>0GDo~&t&t!cg8bK8$Uo{!p2GnM53&yhu81d$QFgGOn8!|^tB0OU--XaZ{Cb523b z8#(~Y{Agr+6Pp*s>suaATrfBoeRfca?sm|Tmgun4MtvY&Jy(?b1Td&+5E8d+btC|d%{e7KX z{S_u}FnLsppo&eWw_OKCaKEB@;=qGIaM3f^^XEy61B+n6^=OF#E7W0K7;(8C=HZX6 zrJ`Ka!@-*A__uBJ+__6s_VM)Y%g83BDt)sIoS-x&>)9KYX%aW;uX>d)q{d<&pgoW| zxa4Zw1GN<+(oB`uqFpPRUvX+VnNv#frby-HDJSrv?8I&iMIOIXI_C@>(4Q8`ct7)7 z0Mz#gta2efOMw%^rH~PTzu=S^I@iX20tTzQG=NQsGKnRCJw7BOq$ z4?AM3cHx80H#8>X)_lNs)SJ>p$ZBmRKbaAs2Q8%shyDN$Qve-N4ZDxJ#VMgVJ1$kg z*@}7RPg{f`*v#fH0bT)PCu{L!&8x3W6~(fu@VQx}SFgLh|6cWuSoMzkC0n5LBU0OI zUx<}#xs`_mpNX8gtQ znaG{U#mTvB4PT3w?$S$lP2?Iizw=A6tX23V@|VPdOFpi|dDe!G#OlZN)ve$i0A4^C zA_Zlr?yKY;>6L?ep!{Rip!$1R)v>JV`%>0iHTh81aNk~~uYXECKv8&%qLAXgM(&Za zsAczaOJjjjnH(2FwvJxS7`WHc6iPM(b#5hDkLU>p3yisW0Z=XE=v9(61-3wl4i5{F zfT%6F%5eTZKRF7u1#>e)^%0N7%a{C-%-7S-_$JaIHpqh50BFJ;HNlJUzKLb#tl8K; z9EYG}^bX=Q*df%{*h+)nKhgtV&pj^f1{nOp4;uN?aQ-Yh5!!zSxR0%IC?A{zZ&L+G z-4^caK@>}T4|{A}T*!hmCiLMh+&Gxp6>ha9d+Vf+RX0IzppYdt9k~M|sy%_keG(IC zK|NKi%@t|N2U1|n=eYiexlNXK(Y{#GzT4}_{6W;=nc8@9i(U*LW_;}YD3p<*nAsK| zTOAy^uz?=rxOg9BYpr%86{}^oI92T&>03wIC?LuES6O^msb`me=?re zs^`&xAcGN{y;&E}ZP0TYu#_@t6Q$wFQxiD}#52&|=$Pt7=n{Nxp17TJXZ;6xf0`Yy zJD}Gcz$27|3>DPD$fpiQK6Nm%x8Kj%eq}e9iiInj-Mo`?cf;LXcQ<^LkEijXeR|P8 zyj{2=QM_zQyVe1GP`E-KTsiP@?h3FYx5aZe>$#g_0pATeUM%cCx!IG(ocV5zg7I<|pjP+nq3*%KGdUW!xzw;CPpsq2_tIf3qu1h zjUpnK5w&I^*9;snM*7sw!KDCli-Q2Hhh7A0R=wk}A+9bIpb;vCE(5r%V3unGH_Uv_ zV2L5N24i#6iu?kG?|2juwqfh*ZX{)#5m;m}`bQ4}d0iSq%dLq3I*v$i5X`MrmMmHX z9UQ!bSHajQY2@% zMj9?qQRA4BV^$9My|^F~2s>mn{N=u(0U{9$C)3FFfptA@Ngz}?;DOZtr-lH6-_Jq&SAFS0!b5S`g)7Po!rGZ5k(*K!$qcnJF9iDTZoCRWKo`}zP%zxxjdpc+C)L8t0G*`geS^`yyZDd}DN30UD^^Bf2r-Cre{`4V`7(l0&P|a#k8d}FlM~tX2qHrR+ zavpB+2Tmgt{m3OurB&z!4Oo}Rl^vIEOAUgNP!2lP*Dsij6%wyG=F)+aP_4MEVI+HO zaSU}Yh4(s1?^STqqk!E|3b^gx^60J*Q%TS5G(H zE{?SvQ=fQ#r=H(A5tz#_fn6Smq>VH6@%;6AKHO6&A*|Mc?Ei>l(uK^wA2P|nF<3_i znT2T~9+yGLadrkVP=R(hbg#J)emfA9vmn}83 zt>z0STZb;4I+aYe7?dK60kMY)vDO@}@9L6*ySkjd??|T5A6CDUqLZ_>T?xLPQr^dK zmt2|9ZK`Y@@mbJ3L>po!f*cotfuir+btHNAf{D<4L|IZ%Xqv;Np93TRf_CIB8`p;$ zI?S`COscWPtL5g{l(nLC?6<{CN|3nsSZ<55H@@%KW1spN_gG3Xdhy@7Ojd$;1aZm& zVQUVzER?*%%K}>rFg(ZqvPGNR3}#1*O{W=*GAo9u!VlGE@r#RVLdB`EQde>Gm<5us ztLy(j_e{STjMpiwzz)cYJ<>;(p^Bg2-B*~DbLg1-?;N9AJi222qn8P?=8_VrKyv*f zQXTYi&}zlU=*Rei>NMDE=II^l1BX31EE>dhxL+GSC-?;M5eG+wX=Tx-Kt#p?**?GX z@Cd3@mDD%HbH6&^Ib9plapE9C(a?t&aFtac@sWd{p4bFSBo zvR;3@(pONb=YQs7Lk@Dg7H|L$fC_vMS0Zt9S1pbz@YZ`K>Vrpda7k%|anxLS05tIH zw9^CNRBJfy!VE$KhYjaWfRkfB+AsDX?scErr>9z*Di&McMevHq1jM2693xkTpHgM< zKo35iVoY;)ecNj6YU%9uOZG8A2m30 z+ui-N`86l?7>clSg$+NlNBc%bwV^0~^iCWn8|n|yz6RFb9A<3pZ9thLeNma~RC%~o zQ!%0}ho&sbZpA_q!BLf=Erw{*oQP!$PQ=r{kcsGdA2890(LX&rGQuqkNC*3gnhZgJ zM#Lz@8Kb*Y$6Uw;M*b97Q?h9QH)0qS7v4NuDhR|8_x@VW)PBsBUW%|y8lcCl1D zB=0IRIO<-{VPm(QZ$)=7t3B?VCQh%EsA!vWeGQ=dw}s_RnP2)?^1?(I5D|?g7X$>1 zcwE9nl~V9MJWgD+KuJlJ%la3PH~87%K1e}qb|72L3j#1DcusB|f5!d*w(}4WMC#x9 z4!mCDg&K(+j_Jaenq)%VDh&O2Xbbva$@ytQL2iF?%_|iAYixI|7TpQJAh8Ld z3`TgAjOJkxzG0cbqc6t>OLTaoXK;tOvlYrL(gu#SwX`5r(fVE*9e_ZnMOc>RiPauT znR57mh=vahzdX>_(22D#g@99Tmz@HzV1ZrSQ1{2zNmYepXJXKs_ly>Nr7)$>$s(RrOC9q<-rWK?>^>Hq;7*I)MtywI{Ng z+U#vlIX^5NMd620_GiMCq*~66A|7X77gTkCq0enoxN`wQz;9PmR#>TrfDbcRo{{?X;PoW~0G<~Ofu%0##L>?nV zGI_}Xk>Q^aB76Ql4xOCcu(E^>(~WD-$S}oz?B_^|pKvgH(O|;#zAyl_7QTciQRM7I zp)N7q1s~{NNdxnR*Nl)SL$>U;mf6`O&sZ*S|cI^7#pBS1P zeA{Xnr?4|>N4SutA8sSP*a zU@#=wEZv<^QSSh)!ZDCFmpVJ6GGj-Dz71Mf3wfL|cHPiZQ#xxSn6+-zZE2E>B==bk zV>kjjr*{Oq0JCJQqE*OgTts&1la~e3WX=adm|o7Urx6f5(FcQ zCR>70Fze1BOw6bTog`vHQwc;`tj5wqIT{F%5kj`{a3Jk>QG!tW;MiE_L$E|Kb6~b1 zBu8?viq+vJmepi}ShyR7iV`GBt_?S_XvdG3HBsIm;_M$DZZP{rMHjlMI4RAwh7Q}f z!N$d$C~8oozq0z0h(aDn*mQHSTi~U4B!_2B%)B|VW-dXwRG7OYnj6CYR6N)edPh7} zb9_^36@-;G!Dhi9a=&$bOHMC#JL|$0@8f^*J?cKQc>NkXZFDWS;jp*citJh;5}0Xx z2Y;N7%W0A)c6lEVGZ*1k<#w(1>KEXmVP!18Ar@3|8hY`Ybs?8r59#*FX^U+6+l3u6 zeCN`qYT9gJmzp9&F%rX}1RF*n(m(0rX*~Hw*jOUqB=!jN`c#j(v$YK$ z0{=`+?AKYHZP~_ZQk%K2#Bga$?y#cAR7Iv3=0RE-9gII(q69N6su!hLmo>pdc;uX5 zr+ejy-!OK{>dQC_jSh94$m$Ey-1J-c`kwia?v{foVvpqrz##VLiCh7g5CA3vu2dAj zv3HvRs0B*?7-{o@ z*#$YP#$|VXguFiUDcG*+O7gt40^z;QAAL?AcCfI@cLv9dBpH7=1A|*3I>fQhSd)PV z!L~eQSu)5*VQdjPWzGb?)##T9J6w73xm;YzN^cPSYtOpp0{APcwsM-3^m&nMq z%kiQ*y{K+x@x7v^nE8Rr0-F6+fLQTXJnYR#1zQCO68`Z~-2X3Ra5m;cp=M`vE)` zm^pwjl4iTuaspqH4tjcr?dJ(T;OCv^#pr_9i|lNzH8Yl@A-I1c$UsX@O=#EH+SGG7 ze~#~SLieJ+&pM$rC5~J_H`A&wYxyt~FWR9O?TCeTsEILA6w0-CkmvA)I|#hs@wr^E z#e}HbX*T6XP1DYj%uF=q0Fb|j|LQV??bsPw00OqrwYgP%fY(xN6@QM$W96O^vz&eX z8AoOnUco*gAyDYzW>FQq)J*2i6_vla<=U1X7OlKjv~qeRUev5(8HAeEX0gaCs<#dQ zWCe@OAJMP!ozl!UOT*cq)SF5Z-(m7yw(5(jRpzFW$j#GpE2qxf%dLy$*4-~(c0F%m zzeKYLX2XLp63h1q9~4V8i}dWBbc?dn`iT$VVP!R+K1!l?C$=dyYwOc&IzE+=>u{Ga zAN#gLm@UwakZ~1lO=0NCa3!md2u@{^;3%%c4V)}f5mSV%DcN}ls4%^88Y-GidVW(Z z*t7uRp{1&q3UtzaUUZ;5m!~PzE-hYx!Awa3&au60xIqEFGak=x*7KWVK?QQX_{qAs z+jHz5&LDZ)2gj3e`P$|?^_1IUh7qnJUKg*3wf)7K@pLVRv7K$K7D>m3T{`Zc$Bl-^ zX)7F1Zo#{$m#$~q#Jh)x0uU=&lZ7BQfmpZ|Sl!y+paNfsR&UpGGKLzWFmd85aBUm%b&Pg9539X z7w(zJO5_&Ca+l4NA-VnRoueO|yt_NLX)ivBP|>e-yxuXjB_66pFsYb)?i&v`#6!#V z(DImkP{frEg#-MWAaN$H$uS4z;d=by)H6yIB=$OtFcI+8h=~!Qzo1MhcdWP*cpv9r zXlc_aw4nbM?Gj4279+;b$FTuS`5t}+$!h^ObUNiKZhZQBz)6=~4Zv?LO14d}K*Kv0 zr#E0bg2o5>Vd;;c@c^f*0Xux#RXKBXSWQHue3&K`C0;{Az1zbAQR4I6O-5B|fLZ?- zigU*!2jn+ic6DexFux@&+=a45#uY(Gk5n<<-)M3=aPe+Omor?ydLaIC=6Jd|sZAdP zp^6qGy&R1AE@$I^j?)2xw_Nn3?{k=l%ej|B&IuY1If+~MR7DRuogIybBI!wMe$n_M z?J-x27rDna5>Vu~RyV#V;&AI5$%J!?%JJ+k=DWr$%bgoe({nFpBd5cu@#UO1`jM}G zgr{2LLX^8~ciS&#xqc6hXN+gtW9E4`IJ5#K1UdiX87~s>(Kc7RvPJ79XFLOf!`$&q zHS(C<%%t{ap{5{fGWy+kH9xhxYB#Z>l{g&}U(G)oGP>q*<#Rc2Xb~JFTeUddC|}M~ z&OFAmoKInoopZ)No<5$%R*m71g(rD%q|B$8s;%m`aR*cx@4*$bdc(agl;ixykfKS) z8V(JE6$1$zL;LoL@XTbQQbPmWAn5*(Po>aw2hp?O>aor4oTG+kQd@6mHJGAjXwo6v zNT6>qden#tHF17Q_oidT&D5;}QwsbVD1gDV243>vHj~~El%vi!nL*I%w|Q59T(jAI zV1|;%+^0e+aodtXi1==+}5K@p%wq^@mq%%07eHXRAnkGwo0 zu|By)IWFbhXSUK!z(YL_W8K#!u2sjj63LsBfP)$RfjYukERgl5-2A?T#*lWcSf*F3 zMl8O%Rp0*HH$Qi~HeR<`uiG3es7WlXjjh;xXK{SRw%Cg8_`v-Z{d_HvWU`$>pXzQ^ z#mhG9W$@6SUa|xZFB4TAcSmDY9r*kxJ#G0C_YYrK5ZWJaQ9m+$| z&t&UlRH9Vf+8D1~t5>c?1htZNb2W`KwXrpaV^1HC*F2-wJOh`9l{E-YSh4PAbY{yp z#&3+@e(4?@cGf?3=h?eQKRWrn-LV~q@kuOii7nqYw{i{4(Cha2;hwU-2JR{AkvF}% z=0VW6X6@AB#LCq(JvYuy?fprjsD_8o%4Jg{(_Qh(O?u^~$+o$w<9%_%4Y862!_8Tz|ITro8|pgg3j}Fm%?4Pt+h6w| ziXD0SUza^|7M*nccsA_&bN=%{%nw9r!v| z(=ro%{|oV&C-j;pCJ#;?ykCPe$xP?%_IE!QtKX{EY@0mzAdp#J$QIU3ZJesRb`qXN z%M0(9Et?#O)o!{Ih}S+IFNHG?JftJW@PjPg1%2hqCkNn?wC)>^!((Ud=GfMQ@!Esm z>xtJMj+Y*R4^q68<11Yw{cA_NioXp(2NjAV#uyU*U2gaEcFP z#5ej~uI2|!UL;m|5`=*E1d=G3NnA6^tAX}A_^K!$@1poy!n@%=YOb(cFRYu6#0yvH zg{#1D2$fG2O`VB{R_Y-J*_{iOO{K>}ReGo@7OHv>ShWbPO_7}N`D4lq_n7<_4tpnVu2}yP!J1gG=6+3s4*$Wy<@cN51ZV?Q&Qm03{r>Dd1o4!q zw6_<9TNhd;*TWj9;>nSz2?{y@3Obw7#3A+)*R~i|DIYsbk_n>oiT6Yj!x#38E_pbLjZ|#-4PBQZFx-_t0!NLI zcJx4u1IguTY`B!{;wu<@v*{+3s)1Z?(Q~ZecjX(2V`T9rv9%jmflU1QX1A$GS@#$VL8P)rc~B5 zz-qy?YFf`FON!`}$8n5#byCbn2`FT3$LZ92vLkc}q&kSvc%dJC*f5`eOP&FlWKmn=w7JTlAEu+jVzKuQ-1f z`V@D#NfA*^GBmE53?fQIn)cM8&j1(Al96pgOEEYwsh07uI zKtCJu0!*8uP}YWYmsY;e_(9fGvtSII5{x>nxB>E%-D@P|ARe|L!ZFn07oZ^lQC_p- z*QR4H^qlXbeSwnZSxp;-xN_JgM#a$tdal}}80kadCQDttDeRV$+c{n8w9a`{qw9v{ zo}o($4q!a47Av3tnXm_;i4Zp15G^8BSW^#<(yTRLQtPW4#(0kE+(k=msI_5VA1U;PjgPHG zyw+z2A|o#}Y~HxG(XDNJ5!N5X9w*h?#*5U~QAkBfb7#4PAA3$m8!n30@cyBG=n7MP zo*)C1nyNT!`Z!=?$bT`s3jamBLX9D0K)iXB{1;p7QIjSxqn%&jEq8b95$bi4D!i}7 z|A$pbOm})`aj!1r{mSxv1#dqONCv!$Umg6&*&qN02QA2qN{kgCQ%KROJnka#L30M> zATUu_suvpkGQ~ARD%<)3oT?khPM2$t46C*wb#hVXVJpJvkDDRj=25v1>f}p7rkKtO zv@9H}eKwEEDZm-`*(^}J1Ij>M94OFp+EEN^W0oSQUgdy^RCtgi)32~-;Wu+6!M+sP zoK56@5l^E5yu>M0tV@wxCk^b-z(`luX%6gRyp7{rRT!e_LqAKf`j5jn7u*Oq%&I)}z;OD?cvO;X!tsci(Q zdCkLW_OMdSHvOAaZ3?1eNo`VbKF_mF|Etv|+*lXyrA>H6M&JghdyiRzDnl;dFrL>cU99h;>XPMGwtL(f+% zUwcTqjtumwebq8KfN}1q_!S8EfXbq=8c9f}k!GWlR;N=f@Z-XLFil9^0yfKJK6)u9 z5C=FyVY^=E+Q6N)U36G69334R;#nni(;NC)&a{xCJ$LE+rS9%VFjUbZZ1~2}#;QUZ z41HZLUMf_=;*ccw01iv+ZM_;#2gOlydURkAW)9I7w6><+F_Ntg$8qeaNlq#&BpTJi zBN4_EF3Z$7i&~w1o-_wWXidZX3mV(dO~WLc}L*TGwg`;Hj(@dcAkA7Vr9iq7mOTF0XWEge4i*i*m0O!i%cQ3#^l; zA4#LE0%bZxX%PhSOeJq>4D_tSF48J)AP5?qP9a0h-$lBx!ch>~+BlypyG}>ej!)8Y zTo`L=Hw7yK7l0qyj@qEn96k-qb7pvCTevYW8z9-HRL_n8-e>a^*rAqono2^?>=Kr= z#()J*Ju|hwxXAuF*K!ALu$CKqi%TYty_tP2dm>{lH*aF}>b5tw{h)l)z1&T)+)at% zirA9Jeo*-sQoVTVo%VQf>qPrpUR7-A)8DH@f=@i}sGfH;7Cb5|9T+ADlod|ZJ@BqJ zyJ%PgUa`LBzj&dGs>IfVJeU!T^$l6y3!r5`80iweD{i%@_6)kHJ1M?%5QALE*?QDD9!vpc@P?hnf*Tr0%g?KYc_rMN z0kN;(L4udLxNUsRr(#Y4jDfPcl8y1LQoAgdwC?O(o!A=m2beaalQi(y@cFN)DZG%AA;ccQ<))8xv_e`v1uP8d~w9z`ok(Nnx zunt#IFQ9TmO2C)!qs2cL!A3L+4FGX!;c#&PK>%F5(jrV*YSY)&2wyi$mz7%{EJ2(s z=#|o3zHEqVPg$TX@}8$TRzYF9udy5Ub2P`Zr!CMR& z<{oc|zIebKgojfuT{?Jz4;lcCv0NRq28c1YErXmhy&Q#wb^sUOaYXCxw$>lkqP)<6 zW2u7#OQPQFMFQJ7fDq&@u*0$!lVA+{V8-=m)nRYXU0vuRebfzrbOW3#>7r3KcjD7$ zp-SUuhvl*6v32u!tmy?oXI(s$P&w=23M6l3zU{l}znXb9a5epE+SQDR|2m@G+x%H! z0i<<6IdMK}N{A_(63gc4Ok>t;Hg;zoJ^F`KDI~%aIVOY|sWG9`qHJ3Did@1toz1p} zbZljcp|ayLSnp+mjEj;~g?`NaWethymPGCPM9td7ij4?h_h3=hI>d}bGO=F|t$tA8 zD+a%`N-x%Ee(X{MrM6&uUNwKe> zA{H!Htzu!bX45G5YWN}^K76PLwc^K7djybRIYipaI0lv7>iv~O$atTv+YEJ#_TBX%Gkd}6@jFx zBHNwwVeW>V=loN+Ni5sAgjhWet5r~<}N>pn4$y~v*o7u5^1l3)iDX5B{XyvBWS+>4I;Cv2wmBckaSY7kFemN1uHvf@`|$nK!|5C(dUW- z%|6g`W@tD{LId0JXtd{yu;K`Eb}N!M=2R%}NjpPB4NlhKUBIZ(5jeB(xP4OitJNl? z&6S&s>XOQYyQh?85~ud3@-0E zg~2Cet5O@JYd&*Gz=$M(IeG!0@9yRvNQENcOtaT`p4>6JAP!Iy1TnoY4g%2+HUVZK z(`RrOIf999xJ{KN7b?Lv)Df$@oBC1>3h;$b2ek}-GjdstcQ;Ai7l#tYsmwfOCk^#> zswfTEPPb5win}DtR7a`(qZ&%p!lUP+_T9AEpt+*8H6Vp&vy7qE`qQzs@sWs3 zl@$`c`S_o#UHt5O_)R1pDUjc(e&SX#iLP+k;Xu}7ZG6eW!EG7pZ$i47WOG8AoJ?l9 zV9VrCHxUIDt7Jp@WNf{~)CWbSCR!E@m6L!6WsvHPzQdy%fw?iLj15acPbli*r>IWp zubkoNSVLqgthk@1QdlW6p&C1^$vHYl(uDS(5CGutv~23k&8Qi3IIyS?B7dmhm#m*F ztDM^V=H+Xb^|IAafG=53ZTI!i%P%X0UVa(WveOq+3%#nA&KMF^E2#LASk{0)hbQn) z9epT_5Q{R-BQI+%UqF|@q|bgW=e69|La!}ytFyeG14CpIR&u=#>mXbH{raM-*;lf! z=3MpjB&V*cG*mW;AUwM2ax~zE3oTCD%E8Rbw6RPZ%sK~CI6rcnwer6nN@K`b90ZNh zLvDze@K0n<r$WT{yz?XlcB(LSq9Lv@c_OGa`n;~CDf zuI60yJ7;V>;FvwweL22yE|=Rayy`J1*S;e2S8y4k9BUqZgNrX`d0OkqXUrPMBr~bC z!ST$q)CiMn+F|)-J|j%IM@m~i(qR93w#2-TWEmlw7o$B{XG_iJ<3V@+%fX?=&RWk} zP%|FvvhI_{EohI_ILPmjb!PcKUnF?dp9+69W_O4|7kE55hlCA4X;ClNm$}BcE;;58 z{}Yn8AT%5IU4>n-w#2D}WUt7p8DKYMMZ}^LS|?bC?^$aRYbn#or}+PfdlTrmuJcT= z3WWktC;(N3D(qVkAc%zkxbK@F65K?B3!r@gK@=!LA_4jV)B=GHEUE3HL#H8!j$t<$ zmu<<0Y`L30ZKvtDNAP_ z9{zgEeRp5}`>)TLZ!UTjjI7HbPeC)zOC7fnjI%erzkwFV2&3w@qwA4o67mr$EVwD@`#tRF-MJSUB zG%FnwHgQsiQkm2;`vPb1FCzjH$e_hFG&4CfxlkFuR-78Taq#EW>LZW-LA_e}Si15t zt@1HkWGb4zxA~pjYQ;93nTFM~Q*(ROhVC0H0pxjem3~>-y;xOyt@eB6?=+}YTXEh@ z0NgqQKsB%p@9b1td*zv~Kc>|mQ!9@x${5oPYqf^8YUNrn^$#I`=3(}(gLw3%d#XAc z1Wd|aWcMnxV(t`sj92!Uw+)LOY`?d2tcH3!Pihj1rm$L}+-wDhT8?ZF=1?|=l=l?s zJY65t8jg4d2ELAVxw{Dwpppq9j7x~G|9alIhiz#Q`&$5os7fCrkNr#jonUxG56uV&k@i+OTbP!C* zp^>pJY==NI$ZHX&zDikA}au#xWE{W`B-4VZ6%iFB!wlg zvMzEtpRZ>}bhKNGb}xA%k=>cjy;|oH zHP*gZwsPk2s{?BDj&#{ht!yVOqLm$>uG?iRJ4dQ@xPk=X#{=@nXdt=2QoY%8~9TU}c+G3#K^5HWEpl5QjxBleeHGw>>AknfivM;t-{)4X{{N zx#Z_fp{Jtm>R9T`o6p~9(N=BO%6BXU`Mk(eRV%+K@syM)g8a z0XymKf-dzN2q103g;>w1KacXKY!f#h;a~9~!5^`XyAY0I`K2>M$w~CbaN+eQGDV>; zHD8ZifBBc~52}&9(Dtt{gtmWuAtlqL+^wUa%$_JH8{I7E`oCX6?dmud_I}3iF23>_ zlEzYf&+?1zc+X1ESP9#ll@QP?;ZC@0Askx>S1p8F7vP#Fyap=n#U=0g1FR1K@@@6{ zVEK)Mdt6Z;R{)(fC2N=CmN8bIw^NkRF^JvhhgE)O>6H`r+N(JCBZe78W!nUYq<&ym zWTs)a`7{wWLU=r`^s1)3*dN(;u#j`MS&MR}Iu6zl_Fg&TrFQd)!WK(z_C9JVXTsdg zdOX;V?V7N7MI1b?mWTS5E&rb^jZaovu$INqqaSW*Z>o?@<>)G8znsbeMdtqbybOu} zcc5ln?{itQi2K7-!91@=y5_InU?v69v>9P!0XUYK@>HDze_0OA)7X z&_R=dH5n_ziGqoGJz@Mf_uBS1*j{IC>CHfn#XuqhOCM zSmMJ9JQtcw0KqAz^Kx?9M@NRhMWV2@N#}=DkMJ1-HjYdTeiMY;yv2@?lmg7io?eAs zxP;{!#|+DM6+$^&WN6uK%JXy-{RV-J!`)ABM5erNH)X>=Z3%e&92ZTubfL?M-dd3Rl!_;=S3DHe^q>MITs{3c#e?It=T|eE0o7qA0 zxmXpmO0fYS-+chU&_#W^%3Y3oQ{APu>Xm9z!W~BR*oU$Tr#y)2nOt$tQn8#bT~K!C zqEJF6NGh+YP5n4;b-#6Z?o&VPNUz+Zt=uD@*`ZwXX<*1vL=JLM#N+lNu5cGI;aK-w z!;T$6KQ4OpA~z;L#sVFJ3HIW*irqwLzPX$9la@NlraXysWT}DfwH*UCPMF!f=L4Uo zecg@7jiW!?mTo($wH;kpyA5bz`*wS{dtJ-A*~=_`0SU|pOp=$fh38@?Yt z@`Gp6&HJ?Ged5tVILb}Ps&u$T3%AUzyDc_!3*qY74O$IM6~QXf58Kk=omzM&R3{^y zi{a`eKYpDW3gwr(jOPl5RsN0a*(X$#RC*aZtQv*T**4tb_acWR|O z)uNr5VCYL*l6#VS7NST-jjv5d*J)Ag5WU6S-kVWv8;tex5`3H#Uhk1-y8HpH`~fxm z0IdLzYZYzjXuB3|Pwra)R=J%v%agf?d1mA1cP4jYPn$fv5JEt;wj&+t)I!jrEHB=e z5h@>ZQLSwUW{`B<39aq~_POyUIp{!mZ0b)p^=p9fel6ZVQ=EydNOj+iHLJ1axqUbG z-Q1Plc<^?|LAB#xCRRPOAKSQCEn*8L7F7RqI2Q0&#k zD)f)H?kU_yDPJJ?yRLTISb*O!3n11e=Q5-mL}S`kpnSQOh?RzGiCk{1b@z*i4BO6s ziJmN1wcljy!i3;eUi}t;P5|fHAn6-i3dDM_f;b0FDME%1!gw)^)qBp$pLiOL-fJ5D z|9dXH^YL@u-*=W4m@CFQC#rcdJp^l!3O-an^3!ZMN+acWmZ7m0}E8hudmG z!l&;FAr9%}Io{)Y7k3*d$#)liEXdSY(#4FK4Ph&xPoH|buP!)SD4~K*@8!7U3Re#_XZIJ1ku6AYMkVb zgpEAlOl<-UVjM3}86dZJzqNM-JDYSgY5Qg?uRhOdQ%s;_5zR*j`X4{u^GNr}{)dkr z=@B=5&?){)h9aZQ(MhVvtuZXhIt-pF-$37Zntg+IA7Sk5#-Bt3q_%s+{=fq9GZ=MzIVx&6IgerC_EFJ8N6C? z`RJ9SzpPuU7Oh>%&-LetwGMuA&@<10Rv*Drw;z0Wh_#n#yGXkXWaq4*NMOSz*-M=Sf$ z&d7-k$$H88-actKLyiwYtR?{CFar>SIA}+aKyJ#lPd_dMi>xpGxag(+vjQRvOw5?1 z9iT_9yptev$v0XClk-tWxICC?&Pn87cbS%d)q6RRvY~%Qdf7rou>WKu8@WZ0lorIp z{bJUU48V4I!Rs(KZ3#}f(NX7kfC>9QcGYdQ6|J*wm332onDOocQOhnMmH(_u@CRXP zE)`4_h;}HuXPI3{Byv)FWzCHDN{yXBcRAq9FGg%&@^|;j?o1s9X-NWIS{jWs{Ow8E zQ?ha)nhdruO*M|4F)3bWMigk%k<$&+j-x}v@z!$?^Bfv`7QEiGpqPmd+8i3FZmTQV zW2&{azXLAc$0wfbgEhvd+uGv0VBZbT`Ya9c-u?Z80P@j#iWu3HL8S>mFu%p_9JB%vsoMr3*n?-_sA30b6;@28l5^6IIm|{W5%NcW#c*FCc%MMn4V$DA(HlT1nFkA85>JK=13$xw`D%X6NmVznZF?u` zM;i0y5&<Q&x%G*eo7PdTs>O!FN+L81l((*d<0o~dtA3u=HFtXfSYwvqBBPfcLsdj!eug;48UBpq6{x!* zBJ0H>>ophI7#3M{8{?Sr+a&~DleqUvl`AaM)(=I z7Ie;Z`jK$S9>d#10T2?uxv1O2-g8mEXL()d0?PX*_g&UO)d640&fWAUpjhTCmsnhZ zo_tJQyZl11uCcV1J5Vv#vW=y+aPn98Tw1{!g06_kVlq_JA(cgIu3Tk7BDZV=*;ZZX zo`0g%)?!Fe7wI0Rl&Nx}OvKHV#mvySSbq2F(qB&=cP_!lttEK>eAx6xCVUk@2#nMq ziE+Ne^ErO?Mg==k+p`hN1d5y zZ1%7kU4=7Kfk(w;ssiWW$p6Dyo!`_>NSXMfP(*hH6)p|s%T91fT3lOC8hIeDl zpxLJe)3H`9)~d!@KfDv|m^+bskQCKBBJNc;j@sYMWNYngSPt zV5U1$QJE@KE81~pDjVOeY`a~FB{f~yp;dOMl^q|x=SMKq6c&vq(xJE(ierhF%Le!2 z#$hfSSMcP^kj`0-oqZ{nHs!O~+*mYhOOUn4gTu015`y3HeG6%Q*Gvz)BL7Qp*)o8x zDG!L}qbJJ4{#5L%m&Y+H5n9JE^PfUQm%Q+kL@qC6^(B}0HH3Iu$1guZ2F1v5Iuj7s z<%)sxaK1e-dR~|kUJkMRGY%0VwZJPQtK|8W+*$AJx|tQ`gY31KqfX$%2Sr{XSL=DY z!OH7BDlI30Dh9ROi)|muWo=%6Gv`Vi6_PWVCroU_C#x}&LZeBlMw&`$Vk4vMVu62v zN_7_azu__1!1pLHtj$RN_peys1ERp_hZRtvHo*T<(*Qhg5W}ak>iR0J8vRvW`^e1* zfIQRHk80JAS|5ljQ8!@Kb~0DL0)T4OZ{cUYkgE3yQSr)SeEEGO3hK!cegsY}Ld)+q zqc)UN{3>r0+{g>(q!A1`uSs@ev7=sq#1L zwH13Zp|WJLDDZCfX`6r`3pj*F=7D>0+>PPKu1yYq44{3Wv3>KQfnHXT*tkKbWN^qF zM)-!CcP4UoCorYY`9M&^jd8%XE$B#xJ-|kCu-dl*%geRDzvxx!@WdR19vhVx??U!9 z-c1vJ)qADQj?0OO0jW6gOXrpwBpu&n-wPfka2doJOYY{9f3z|IxpcfKh3K4}X4`L{O?{;6*H7d|N)1_sQ`^kYyfllrK-n&g46ANEhytFg$AIBnrUM z3Sf*DCW0v&(b1@R;Ha)|m-Dc7Wx!7C0T0i=JWkGpQ z&z1kxcz@+TEZ>7fFOE$Wq-^9xD<0=~@_MM<*H+d$xqfu1#Ikk%g_{8e|&YB;(&S3 z2Oei%B4M#=i#$`^vyHPSt~HwvWaa!if+@d)(#)5ed_5tzg}VuOh&VrKIKZNkKb^`9 z+dG(LIbgD0Seg}jNT3;S*RP!7#faG=5pUGbfDVmmEU7sS^{E% zeko{`f`}=YQ2!h2oam8K$gAIGV+zjxB%l3+*^dkiIP#6%Z6$)i$~1VCXGcyW;|Y-+ ziM|a;!*I$ilz+Zj8keOaritI_0p|0KkXxAO-!M4L{#a$3FQyHu9>b`w#Gg!QwfTa< z1d<(_7@jZE4RDKU5;{sC>i$bs|0b5{-|>o#uW-ER1X_dc%506#7m7TKJSsO?=3+;Q z=Y7u)zpQLyp$m-sDV)`mZh&zvPC!0S;oms)tu(xjz&c(|1 z*__$kT4nnjJQQ~70TwH(5vsNx^y2y^P-ctwB00jD!c4R-RjNjta6$&{-B|1GSnFJM zI<`@ZZB)gXDFay`H?r3&d;$8JAN1ZjjMCv(!aH5-Zgi%*9?-fTxV7$f*FLptUurxx z{`1BqzZD4E<<^dGzx<7tZ`7q*_Gm48mh!Ea?|FPRdx4M>BF-{E9}|QZ#`302xN^4n zYpcJy`YWB+Iy1)D#h9I|14vhG(WiXafoTXRTTb4a{jtgZjr!LJ_t%HeCMklNxs0=!W$ z7phy;wi9aqqv^Is)76h@)sLyM$1-J=zl?8J%XmTqE4Av)F12DU&V|Z`RNkC#?&J;M zJCDM@q*l2}t=zPfQ(m@bp{Zrg_w{XWZqu5!%@!;bM5^|{oW$(GRNvexIK-^otkr_5 z!Slm~2GG(&RmhSFa=k0|d4CqWHT09JpH^wzedus_AYrCs4faOX?Up_ETkI9<;vd93 z@g}Wd&5bR$8@9s(WhTDj+lAjKoZImA(3_!DC=+kKvugc~4e3=|v{hSfo>1evsR_8$ zfb@CsLC{mnU1%A`hXLS7b2b+VmDMq1&{MwSgUt|Uu-YjTE`K-NdOO^j4!3K9OOc6I zC65Y!_P@U(cBn1q_cs?G%+2|EZsDO-{-2k0M-Q#=|G^4BZvLRH@X%)eA8hgh_F}Ut zL_x&VeudKtcd3%dAY{Nk%iDj=nUml@bA-3z(X{!ul(WwpfP>KGpoYCf-w4ZyCQ0?ToViXv>{ zf=9GYx>|o&dMVL;m4s`OpH>U%M6R=Jj&MhM_Xn6B$^3WhHt8ifM}h9KWb2O}A=5jN zD`W!wfH{f0>;6mr1Uv#0-%bcG#$f4hg%CkAz6{y94T)@>hTtcPEs_HrW?zsVT;>*Arwn!(#o=#I5FmCq#LQi zNV`r?Cqtpj%6w~!5d@}yo^0U@T(pcNTAsEUqU?wLCS`aWqV2@GWPu>01zHH_aT*!5*NtIYB4lddD)%DRSmveAh))VR^wlND;~or983tZMuCXE2=2LMFl6#mudtApoaXcdYe|?SJPmt;BjaG=z_p@~;W+*> zEN_m+Ur~n71M$ApMO*#CmX~PZP8$A%sW8iQovj|Efxs?hHId0qfXNc{F)OdFlX>V* zPq&?#{QBQFQ~hJQt@F5J+bMgY5baniI|{s-h>BrrXEj|1I>Wf^vF9&Lyev#U!?8FV z@__V@xw&`psl9SfCc;TWd9*~v*jgka-(q9Yal9L8klertZ)@{P>S5So`M8Ji7W*6JzuW<{$ zn$U9*JDv4>x`7}>u#rG)a>RB=_@xu;;u1g1mwN?4TK*yCSY<1NZztFWFrPCzkws-z z#ODOtxJ-^B9HodQ=V8;sgnJ$x~9?m}z0xPQqIwI^eQ~oi-B;4tzw9M>a5?_X~i zbtEAL@r{qbGKm=v#?5`RPU66Yi&lhmfFt~@(3-J57NPWLIvW_&>&c8;P7tn=!{((G zhb_lqE;cMua$=#?M)|F<*eFe%81=?QX58ZXqeT3~m6RmN>1oJ9aB4zGvk>skD@CKk z+CO-DsOv$|jHgb;yC2+Zq$bMAb;aL7GBw}mdia_0b+tM zXRR2>)wtzm*+FxJJ{>%(KDZZ?wwy%q=^#+0i>ER5o`dOCIK!SWT$x#M;4wT;i-Ib{ z&q9Dux|^mkXc?dGO9$8ojBm*XfZ5g4unmmw%)%q@=qvaFfn;TO%I0CGGd`o6Tl#^8 z%}N-->0}?(o6C$xtXf2H4hg3dNaD=Ja|k^GqckHRv$CF~H5}N`U+5gzaCuO!S3wllCbFAw>eair3zoJ+ww1Yr@6{ZG{tb_4waE6# z;fafiG%G5qyk$JzXxQLt6ei|rxf~9XxWJwtON^YMR}td&G&l<1q}J{aBhxm|>0Xqw zTrAuCC~@L}7YReYw8J2bo1K7Io-O<`ewXY^zSw%~1JZ1bFh<~TyhOiCd}tgJIodxq zX1YX&%xt#RWEt$iL8TQzpTuPQGz@0LLiWUc!cMjldwCKAX}K7Co`n^72O`+WM~y%R zTN?-QLqr!?Z{ulP69cv(z07>yg~9Xq-Yj!#BcCAbEBIPCRqBZ2Td_yFWZR+eTU~rf z7>hNG-Vui#hXsF_f2P2&yO@qjyWjVd@_V!B9nSi`_opnq{MOc{pY&svU6*v`{*#^H z6DQ1y7G>7$m0M{lMDr#a?Pg-7iRmF}mmEn+M6(yT;FAa|lzJpV{1(Qx+d}OBg=aQ0 zio&TxfZyf>bOv|81>60BN|5lb?tC}ebQ{D`i0%yi;Cwo|PmAtTi}roE5F(j3P-y`m zTAA=eKkUER^!>+w@VK_=fEs=XC(O-6fi3|oMk^oyT3iXqr$8m>T|%Vm)rLmTH`aES z`i79Mc^H$@UFyWUks(MHm1Vq|34Po`+%h_~fuM zW_CrxZ2);8XJOgBE3QY^I*Q#L3^HG!!$9okN5|njgX;~J!HcIEtFZHX!Hfx0nZA~Y zmtsKy1*0q8Z7r0`L@sSFTZqSCJaO^-`IiOPh1TD&kYlA4WqMgR)C?I#o39#fBnO`z z#^#vA(m1fWR1PILImp^+ZIMs(-LE4ocoJg6K5+WwfssTjmPrM_+qpqS9Kw`4CJ$%) zOvmlxO@?o6VFWF0Mo#FKZvWs2EO%J-;z*tqttY*4{om;`Jz;!}&zs`M9&*Nik&~Pr zW>XtH!LJi}YZ4i9`i^su6S?e)MVTup$%#5)Q{n*gc<5k)rtx4htk*Y~pVF}0A7NN3 z)rdxJ8W^8(@LI$_hYQAUcL;;!-3w8G8VKbwA6bW6AjWR`hYVlDWsF0pljF`z*^UM{ z$#udbyP-H4faILb7&aNh{HHNhZsC2{`9g&hpb@U?f?N$Fe*?nZ3fmpb zJJTb(Vb)sgrvGn7^BH7yJQtC$VI&WWw#n?ZDNJw<+~y>A3a?-$D-KK4@S#p~S&8H; z$yZ>g@5{gT#a~N}rz=)#6|3hS)GF41fh9e)XI8*`wN_NWP+s@O$kmbL0XV-_t2=Lp zI@M5Trm<}%my-9`;KK8D7am!}Wh5pJW>2)%W?WFz$&R9Z-k0M!;1QxR@H**Mt%qP> z4$0zezTP1jnS@3I-L1wwxy!?zC%g&I6FEr_WNZ+Tv3vYzmDQ~r$dV;2xR0}jgK}?5 z|LxObw`UksT(d)f){PDWX(G^>K?R3%DO~4XcS*Uw>TUD)P9D(dHkbn?J_D+xeLXYs z89$EsloZF8$1cWSBsza?Z0vdNcz|?okDr8dEhNV-vsfq`GKXFZGr!4}OlHow_1^AH(^ zIXP92dKV#f>*obUZE?GCkK?xIr2STgdC!+yQw};q4YXHs%gRM}T4qbZJcBp#@6i@w zQI|?b^M28q%Aex#pD|w)r$N4qzonc!YQ@|S$bH5lB2fMa-OLzr{|*r;;;BfIeHtT9 zSJ?S|+)Y;8qXPew`8Xi+0d8pBifc!cN0)N*i;uHrt8O;l(O=mg z`7fNEIfoaeQPF!*S@M818!brX$f*du#^Q{3tmonwm zSI5-o4xDqjTI)7>sTS>!Q-GN!;^DQ(VHg+A92z_?c>cmW#hr^k#KXx_t7?Hrz}xu1 zz+W&QWLcrpMJu%EO0{UEY`QPtp+mRTte$qfaWdkpiXl7ZjLis~v10u(zELy)$BOkQ zcraOFfYOT^BKWU znEKanVGKZ^*f~M&?Fp*AfeMf$4Ukt50HfFhv64V7Xt4%}djnwDn;_2{Xy&aB3Oq$2 zEm$-A;_cunHMnZ2z*{T~{^%gjc?&YA{vzZlYC(9}bC_etz$(B4(Mar-?6$)82gE^6E_iizE}bvo~X};m0bu9%8A zvO`J%3IBY2pu4~S*2?(Z4c*K?%jKzIM4W4!}CkL^A3a38Mvq%VShi)f@87V8h| z-9O=jR$M#ga|VM2p=HYtj0dzDvWnqofQ`HvfyJux%NnkII2USGyj#3-NM6ZJR3<{N zd!Hytgh7)CB_e>~L@8h-5d|zw!~mm?Z_9LX<-$Zc-o+9XfMrR~OWr5S`{1`;{7Ow^ zI{ae%6u*UAUi1XXXu`y5KWe!69sKHGG#v)INT-(QwE|0 zlmsSc#Bz%*PLllv+wZ&xd3%a+IV1D!2D4z zo*N#w^`lNOe<)lcG-s7(;fxzbUWHpawoRMm1c4N4ZV=BwuvZy8*JY+CV{oQx?l}#$ zvyt;qQW`<8244pR;*n=ZB|m=<)hkVEnDNDpx;A~Uc9B?ZYU)BH=dtW=__$6_Z($ve zj0z{O7UzoualUAItRwz-_Q#LuA48YdUVW{NW~_EIwgM4_51-(K)wzZ2!4M_}ad06t zkqjlML^OhE}OOmsXyN3nPkaw0E3#4&4Yg#Fv@~4PVWgYHv zLOXsAVXoLl7Y&#+@J@ z7WPgyIYxk-pp8L1sLuhDHMX8_n<0dr=KjeVi<=@RYcat>`VF!PLIZxXmd;iTl@P{d zt)TIi$#{!CWpR>|W@?;a`XynrRPHk@M}0zDJ}^L&v=^~^hi;@aL?zcB;I1sY!XitX z|9^#%X;YtnpD+H3K;XD0K~(Hqp;9lfx+T7+wG`zqFxuy<42=PqrrjpXB12wc64bGm zL{t*}xY&xrMoBGq)Ve|b8aPg@>?#tYE&Q#UFZAv{%yGD!G z3oui7r?N4%{fGHKuKn4|>Y5Yj%9C2<$t7PN46;B|9PirG6`gcP7!Z$&JT)uTmB(+j z1K>+uN^|TsOA8LivaN)K2R2;^|**^%B+PJK_?6T-1j=t(JfkZ3lP@G`b?}| zSDt@P8unFV>u@eE|9GLXWv(#YxIt^&z=~#{E zS$Tbz+g{R+9kU6x_^vsmY|4|e%{TZ+KisD1ASYm(E1jb~Wu$I=EPgT0UA9iVl2riu z9Lc#LK2o&@`bf&)$oTMpDX%&ptg|a*e<+)gIfF`R4FT>M$5~YLXGt3s0Vk{6-5I#3 z+}m7ak3NJiKrf|f0Bpe>#*>ePxb^z_rpzmY|@ugL#2F1YhT9z@Kd-&JhZBUO>fNW;JXpkiBHG6hgQOfsUFTWH*~$f$tsN z!;P3W{}Q*8K{E{I^9?P;=vpv`1ApvtbPc=_9>fK5M%gtgyphN>x%R%{;W1i>AK8-m z$lC%^{VnF`uaO0Ndx^%JT!jtS{ z3hJW?&m>+r6M!0NEfVnxwbr-2w97-Wv;hiQpVN1_m?IxR;tD-a&IjN(tMr7$kC$<-;dW3*UfmT!qKvzP8d1~H4G$JKUOAQNxGB3rlO-P(<}Yd7BLyV-WD z`$wzOwfnW&{Z=S(C3?U|#eEk~j}Iv$7lb~;M-l9+p+y1WZ+uW-Z>GZ};VVfHaCftW zV(IY73G%Pe5Q+!0fnfQail36G&Hsx&G`ZqqOZZP&n%`h)P@KhRoijUyFF%^5 z-Iak&k&Sn-$Pd5OFYV=XymZaIe6#yIpPu_PhM&CxtU_j5U}+BTfIrlB0eujm%DV1U z)WPsRR4LVlV{;SlT*8k$F&-_zAt1h5cBr_&BIo}bNY}wz-~_z^|FZ9UO{H@<61kj{!i(&~y)0%q5>fsi zG^=4a=O>6jc5coWCKe#vi3rn^CM}{%A1xNO#n!V8&GWCZEA$|y4-HovzBeL9&dd|F5?ElV7HUYf+zz#=p|*tzu;a4ZbTQrzec!rL=ysBjP zh?HVu602IaJb9iKtD##^1x^S6c>dxl#;cgrGLYQ_Q#kV_9yKH&hTtwW& zuGOM2^yV#IovCk~eHuIHkm%G~Zim{{P&+vFT1ETZ#v9e?ik(`;PBpx90V?#{)0LaG z%FW3`aP;zS)tcK?Yi<;#t9EErJK**uCd0>eYO$Tk9*pU5nHFkFy?i^gRt>Gqw5*-+ zYvGkxACpJ2r#bZ6zZ2ppkNkk)lTom0i2uN>>&cdkjWm= z7jzuoCiLyz9_VCs@CBrrp^&+xAhYO9%1@D;@*0ZkG-D=Yjog#afXhwvkJ-c(hyXiL ziq}4BNz-EeFD}WhR+f_gpSYCOtV$@`Fq8~Oa9J9ePk|J;CN(QwD z?I0Jtm++~<2Hk;dI5uN{f|rvqcPFD5$se$UtMMA1pYlAF&8df_tRO~KqhYA zJ>LFv0MSh!kcj<5d`Pg7MR^0CVIepEmU5~ndqc3v3&)h}v;|6&}@Jl?eN2j-ew*qQ?--b9^7f1!m-WPjSVJa($!Wi_cfwz7Vc}J)qvXo^*J< z7UpiOxP38Pdc9Q*(>_meJMflB^!lo6n8ey3j%0WMW>Wm;VfMqH;>O(%ots>ET{C+Q zZCikUx185C6N_dTx3ISob8yvcG$m(RSOd9P)DMT-7ne4k`@1&Z;6Fv-Y+84qev<+U zb>7pISU_(XA^V$h2>+e>H1)n9Y9d_)>FGLp$Uko9UM@TCUJfO|$>C8{RqHD)gS5MG zy2Y;4c9Oga)E8G&Y50ulp@v`uHIE_bz&!=2$i{Gm_zedTkI7Q<|M}9YbEO~c1YtbU z-M@{dmNw4v@l?E026^Qk96K10;4e5h61c$NsP%+vX4lh!Bd7FjKqzMwwRVd<)1_Or z(yeOI)`ei{4E)ZoP6s=*AWSHE0~;5jwX-L+y7lSk1}(ZlE!waUs{CbD$K1(u)mp7; zt@JaX7Oayv-g=}qgn#qM)vxXz#)Vtt3W8LypaVfFKZK=V#a;+b<>5LH*ZH8q=HnU) zT*Cp}7b0AMLRIv21&YVZsuhJB*DiU~O}HY5Z@q;@E}v?LMQ?F>t^6Q@pfOVh){ ziBqQ_3^N8LVzViPlnr~ouA%^;w~^BqCx)SFY?!JL%Hg^OxJ5ST&^4^2NRCZ8S_C%) zNt`lQhWw5$Pji}m2nzB-4`%ROrH?I5=Y<#TTHg zC3Zo&c#_2eId#gBl~c>8>i+H5NwXb0;`_#itTx1u;vB-2@9an`tnI|jkkp42p<5dt zJqtzsvH1Al%Ls+5M(DW4J9o!n5)!t3>>6tG#g5D?lBJ67=ixsO{`&B*OP31q1wI#t z$+~;nt3)v<47{Azj@`%aA^2nwiefU^E3t7MCx-=F{S|^WUauDMyw3)(62WN(-OiH1 zYLp}N9zgfVMFOoKdE1mSq`y3WM$d!f%G59qPZIXhmIZ7TUHr7p6-U{%>s2?!d&JGOJGjF=eL9}8v7uNsM(bZaXwOX`V z&Pu;T9vnMQL@b-?iR|3nhfjoED8JMX;TMo)6vvd;+J{O`lA+U)E5$%KUnyb>D$1qd z*3s~}ELfpz_~B0t46Iz+Uqem=Mt zYGaTgHxuOj6<+FKg%nT zOM+dj>Ly%RRh+yLe} zVMxdvoy@q2)BZNDKIbL>)GFE#!iO@Rt>zux$A?ppkLYRus!F8b#^p^wRcoDO!-r`eV~z+6+p>{46;y*Zg#%|x-?RHaX`S^HUAy{Y5lto&iWNRHg2Dx;Vq6B#? zHS>sG@)G1Z@ejM~qoorq#v6S%7|8a)J(V{Nj{w-sIeQaTdiBGZBKDZJ5hM1Ph0Db{ zE@GYXjqh-JO?WP5#EY?8p9sPsN?yt)xoW(1+ii4P>qm~M0I45t=}@eV!O!%;BD~r9 zsDWUj*jW~(U@B;{3m=3>E_*Em?RMawBT6HVW#XV29dTR=UfGeAYJuyEe57jD@1^|9 zkQSNB|2!DZ)45ZH7rY~$&*!*$NC`X#IC=Ls80g}r z!XWH-$Zd_Vp9Nz&SSqbe=y8g^Lx!F^eC{03_l5CmypAgJ{iSU*OsKD zDv%h)oPqkpt+g$~P|nj$Rv-v9N<;x*#|w7ECPvO%o3N1ym;qv*hZ8%*ugDjSQNB1b z1Z@YY`XD6mWwBwS13D8jZUnMSbiiB?^f0J3fIXaD!-Oe2H#OM4a0lbid^rVGfeUaM z+vO?B_+L158LdJ>H8k&$c!ciVe|3a$Z2H|#Y4>^=a#n2+OBxtuxwFxSaTcW z*mH<>hQ+mEn|cIE2WKZHE{tzqvj&03yDkVjkzHfTvuif2(UV?dl;P~e`EyOijjKSG zwvE^Wn%Y0GS1#?QwWFJzADn16i5lo86AF6J5O#hrUvj+XczpB5ZM4>9HRHrt1!a_9 zLTN-QiXc2FA(lmu_PD^6wrBNj(o1BM@{{q-5!gc!xkEFN0E^w-APk*yn`>5C92;6T zBR8?21JDMFFg(fdr-#oDzCc4#=s&Rfh0BZMMvLh7Vr?Xu_W1r|Cm-!Tx$k7p{_RHB zvh`(|BNBrRi*~R@hCYTZ(>a*If)$DR};1eWTy6yDKDaroWw3w7c>;rXPLv3 zlnju{XoQc|Y>QE^aHI#DY*5@8jh`DFefA=(xxgM7uJBAyouIWux)Npqqft4gP#?Cq zFs?DcI$|MxQh_OZ64ehSprt9`A!{V()=_)SND=51I-m8@-2M zYND+{?8q6vVFS#T&GE5|a7YTHIL|^$N-8l~jcS#XEkGM#sIde@#fBz?Qw-b4wz3(I zcauy)AGpfcOEB$510;w!t3J>VVPE#Z4jBVZW&e*1M?j!07 zTQZ{#MI&oF1~Gh;>AS|Z*aL@c>p{eL4GCgz`38O@5#fux`V|Td;j0H&3%~FIP|?6C zcdpH()_`eq-dWL+in>L32$-gM(u zt#PYb^~h}5Y}t>`XuFT8#~)7beni{-2-rLNXCfA{GwxRs$f%UrVL=>q%B`@Fyp;q1 zQKxXu0#XiM$YaWjS}>in2wNyQve1+%br5hqadH0*i(8BM;f}yw@OC~QY=eoB!E;JI!*U8~D^b3~&?MrBnp7H?Sz3XfFTlh&!0|Hg z!|X91r4*E$s_@8al-aON(x!HOg@B^A)d!5;F&Pn|+r z8HbdfAfZf9%X-)%=P|e``24|Pucx$fHt&u4tM$pe49q7#qLpn>gFF{XYcpZ^b1|&_ z3Hc-#fi8-X)c3e|Ht(%7Z=O>t;p%!l!m4$Trb{2wN*_~;9=j7Pn;8PrHW=4}@g>j7 zz)|lVm<$+C9X3n`BoAgnu#n;}uDO07b#QJtUAs}M1uYN{GUfGOKKI3QYSYFWiFEl6 zt$fFfkHpfUw>E1{yVKD=# zt#nIrZ>GBLS_hJ^s^h0s@>A5v<)^PaO<9nmRB4M=yS|dyzl01{@6f7unBVJ3$7cG} z>ecDu4y_o2C>N1rO3Sp;W+VrNw4#m4hX7{VQ!k`mxC2JuxLW&=JkzB|w9+GL(UHYq zNpeRfT9!O?2M%(Zu1};xE42_+NCN$^s$HA%sdXpinJ(?qO8eBJzQquvSG<98@!2Aq zEH41_YGv2UuhmJ%GqBj8Ptc32+P*#VjghZE|K{`H!&g#n)-5etIqQ34+f|5<)xuP_ z8mwE&fh8!ou9@AO+GXev=0xf;bxm5`nwkBXSS?%r%v&RHz>+HK=9HsrAYI(2J>Q zOf{)3TW>a|t9NPDyVT&WBrLsn1IN4>F@4{x!K|Gw>(R=3ex8>u>xJW;T*nM#O=OGp zE50`J)se3}e+}hEnD;ovQKY{kSwtDiTEi*2LMdn!lm|RS| zPDx-TAG9faE)URa9CRbd#dw@Fjn8xnyTM379+m+Tcr}51?tt;a15e~0I;E1w6zJpd zbZ4W@uJkBAujg^kXs%)D7aBPcSNcA8`dD~#oPJ6`$IW$z`piaqJa%1gOZxa8v{BD< zCUpt1Vp_E*zX`uP9U9%s%5&bbq2?T#-(EYt)|rZOz@B%A?&oL42d!^Vd~Mp=A6qKs z$x#-16a~fC-rD)gm2dQjE8ixC4W1HB9dKvdPEB}}V3~RYX~yQa&@IX7%9$5*UspdA zHBT?8kl3EyhF_m6pXEl+%i;nwPWe(;v$Btg71lF%j+{s@{3+&6!+YdsoHgi$2YPot z;g9w+^$uFJ3xP%na$%vM=o0Ao^j`X$Nh#im>|BA=ndNWu66o|PlQwJR)=h_1p0#_z zw5X?UpQ7V^Q!v2^ZA%*B444E`SWOsx25;ym70~tO#Kama<%zY{HDY)4G06Sf`q%wJ zV&36YrXTKHfBq0G2z@wlMfslHD!hRK}=k=I~ z;d+lL(tZm_jpGu<6w<7#h{Oq;awD(AHcDWeL@_1KDA2_M=Awl`h*AocA`Ju>DMFG6 zStuHz9bu3aKtoXG^L0-o^MR3Z{Zgt*7o5I0LjOPG^MPJiNfAWa`LGokeGee_E0J1T za6V|H0gE-uEjZGgKnJr%^imPpbV7kJmk|jAga!tQU#WEy9uS*s?xbZ4DBXzQebFmoi$HiPl3yK`mNK38WpVLg-fq*J;6ZSZlfN*JUc3;1FJ`+&<$6TDfW4 zOc2V~nYEkv+nK4TohhP=wHUSTi{ZP(0MOT-p^LTRGP+nR@)SjqyB47K|ByiLVmq|h z4xzhH97`UftY8pYv^O`V!w+cT2h{M9JLPo?;po-imqT9+rGi>~_pRJ?xJL{3+?rJT zD2`u2*mUI`5vu&50MF=6$?P2n%|10L#wpVswGdLc=tkm zb82|*DI`_@fL8y&Oc3P<`bh+{E`IIFuMK>4VD3r8QnyE|+XLjK0`|7OWm)LwZ2pG} zk(${aV!IpDkxg1;6Oq{6L=T(istxRRCVwV>A%Z--(Qvham7@o!yO}F78hCAy`OlPB zCJzAJA_7zaB-WX6s*i-rzg+yqVxYX6h{KqU=@x_KYOp@F379zWRUk~wYTNdk`_k3j zT6K5wA^1rts!)S)_)R)YO7!j5l?8t_e}Cq@=~S}JBMpQ=@l|I zn?F-OQ=frHLEp6^K3j-XUaw4TNJm=W7M(TK4C`dqUz&?bdl725^G-PezcG4sR1L3$ z5eF^0Cb@4RRyiA+eQ_=?9b2Qt*1!>E$J%62D`?BKcJjA56N)8^ggecz7wz)=xUjp> z_mhAZ5K;rn;BRtA7lzu3P`-U(cmOn8C1Ij9+_NkJ2V z=pmdugjkAsH`lCqO=Q)QbCK;>s0PL-fv+l|E@WmU&M@W$2NNydZi>gXn1t*u;HF%LgI#R$e7hMRS3GSKq>t#wR6cFG zIhT*mkoBJ9KqrJ^*c6NqOu-@hJN|Eh&h}l>+Qfmy%Z6-N%=bjz^WweI3DZ5RA>t5n zFhhM#lwuStMX03_6(}PrU^xiK0_|1cb{p+rdn%BF@{dV*h25x*#U`JU;q@L zWJtb~|1C_w-^IT?P__o+8VH}sXxC$ak)vhfaP$?hCkqDucSPBvFOzXW$>$miu7qH_ z4S`lpo*HPs!;rBX%@Q^Q{Szc($P6l^Fq2YBP9N$2`%UIZm$3|keJG_aEz?=#xLh2S zWN_iAZWxZzK*%;eF;`Gz2%nR#Z6iy!$4?r=5ENkJ8$mdBmV#8;aWWLRqUkI?TbYdY zkMTVRh6DId!-_EF23m}`cL)HZx<+(Ee5?}()9IvSAA#m?RGH4lF>=RxqJW~#*FvcA zF5dU!%3^GQ|01dN{CYUvZqd=f!2?I4UGfFmb!xet6G~2>z>`pA?Uwx{r>SmR>%`jy zj@1rc&Kao`VKt8>*UDVT%0Px741IR&oX%Oa5ya&y2G#Rm^&^uT0d5NvFA_q50**;8 z4xN=<%t3e8lM-xhLu%LN$p@8hu{TCW=_red3f9~OFz--lQaTpdFl~=tydVQ~#oKk_ zn_iWY*4A$35S%E{(a3Xy|19vLM#zHF^+m?OdmMWKc$`R5#w40VL}SZ?tufgbbfbao zWEo&UU4)FT;1#i(SVG9M2FW=^FC8Bm!%KLH8a4B#_abAEWmU7zVKpN(+h5Ogg4XxO zEvAR16Gjg$ikReF41$P9OFkuUv`Ompr!X#hFwdl7+Bw1RB18(J)#FCX= z1VT>G;<}LhBKI5IPuaBI&FzBJl^J2u0c8)PxEJ=Jh)j}WGoL#_+BNYFV+zxCY(y#q zRahFv85TJE175lbeB|oWw}Xwq=LFi`r51H%g5?_2y4ts^L7sRH`Q#<2x0Nr%R%XH= z)YbqG10I`!E&O0!8Eqh!0eJ=>{rxA=PyKCKqS;NTGx8RpINc)<|^bj#{5zxAAmNSOORh_YWum{ z!B#ccI`<^NV)JUXY{QrOXIH)P)YYeEp1M(*+>eb5iQ&+c0}%euukM=5Q=?rtfk)2l zpWS$ES31`A;X<&4rn~j{7NS+K=FZH7D}Zxn;%jd_q-{K=ZaAKfABUn6GXwy;$;^;n zWGGhc_ym>i{A!tE2&DDR*f!6PYP+j^KdHz8972}c9*C$tQJg3OED;tgN|YXaJo#UB z6SsqgtDbT0i${mgIpv_*Iit2oFO;akHp zsLr@=r*OPn^~gJh6bA4P!+k5b%~+zaddTQ5K$IqeK`jqqUD4P3 zk$2}u-rW$G{#`tt_hXB4LBTZkPjF|Y>16T>eT7J$UiYTb!YiCKTJRkv4LHfHPUc=I z%+#$=>pExpXZmmKxG{l${PB4bf7$F#=1r7_n5mPpZAjL8m4`UXy^a8O?ZD6Be$t*L z7Gq%GHAJNR0`Ejx*|umnMU!}_t18(AqMd4ePVC;ovzJ%*qcwpF1M$JK!)7+*0p9kx z{c~MJv7Hs1c9(`94-8yp1vlcI(6+xmk=pl_$!n8Z!+N#$s65l9y;^CnS_Cf_2zDR! z`*ysB063s=SUXJa6PHn`SN<45@8J<5Wa|vnn*R;vG>Y)ZX|(F<&J=9qftnJfi9Fft z=1v8H%uamYT-`(CefeBv5bb2xmMfv<{)RhS{?vpsTjuD%_nZhtZ#;qvr?h;+;S0wt zkL>6k(7$nZ9(cupHcrW2fqTR+j0`;woNh8-?=DL3GTnQ=NSI<5Cb$O%Cd+K)f~bZ5 z_$mw6jI5&0ODfdL1K*3yCEl)nry8mvxRYnP+7?dDt|)2>Q+uN=dbZfbUrR0V%nB~x%)XDO`Cu4N#ifT(h5-SS=GLjpXUeX z7GSX?vgGGYo+ngxWo&jxD`~XeiXak%y?(H8O_1j)2x|Eivn{vtSE%_bmY`#D%!~IH zEYL%2xt-sr<~PDjSAaZ01K&m|pqqeRU}LSg zyE!NU{=r6!n7w185C;=ltkPq-Ttcz9nnHf#7o`nFu{u&H%aqU5Mb#u;?~sne#L1J? z^#s;cK~gw7d=BCma*d@5q}=)FQe0x$b;KuRGZWUXj}x)nRSeO0FV}xA)g)=lm<;(t z?A)*}OF37Dur>EOd!@L`Zc1G_=Vq^+y%x?i)3S{R~(W<0QWt$dXl-G!6dX7KjFOSNcM zCK#UCo7|b)Nke#>7GROG=khC8UQr9G#gJ%gQXXSI9w(r#o$@5XQv^>FJVS7bV2B_= zFidcU;8}vR1S15`5s>hvPzFvpPr!mHV+0onK1HAqj1zE8Q!Wy`K=2~LO9U?yOcK08 zFhy_@%aCKBf@mh^d}d1*x9W5nVzUd{fv<=dES~besDOPfa|n7IHY?m=A#BxU30ny< zBq3!-{u0nJY`Y`^mL+heP`v70Ht_~z5&~tp{qjup|M=OTo%wkpy}M7_-G^t>{a@Jf zrOmUtq>UL)wo{I<8L6CRa$cd}hIOfTKX8{`sgmiHVt{|Hj4>;s2mcnX=0h%b)yfGz z&E>XPp`4TQ1>WaC=6ZWB?)p(fa_jmcx~=prBMQ2nFTTMK@^Ceu4=G7vIrI4tavs>U zd9Co)GauAlvK)oE-uc)7-)-KudEn5|<41aq_Vo7m>{G-x`B$h5*bCN4UIUQd9yr+D zH?a3ecVD0K8N5{1F}<(w>LdXw(4+h_f@=iV34WU(MZg(Td5eHuVm@zR{|Mwsl^^lR zehe1a}DvS=2g$2YI`ZpbKC=sLQld*h^_;or(Q@ zHG^{gRiXr>N-NabQDOvj1oZ@Qf?9%Vf?Y_T=;Vu? z1au;+oF;ghU>l!pB{)p*X+C?E;B|t}5>UKDp@fC<+q@0(D#X+@-u@|ppA}Y2@E`a# z%&P)k9VO@`ASS9*@z#_T*Rbww>U8CKTa|{RGGPtb=c8nD}KJ2U<*IbKQubg!^uvFlWyR1LBZ?c)p3R>rj374TcyiMNir0? z{?!cf8bOlavj86z?36_8-O2?dhD>_KH(^|Zh3)lbJcZNZFXIVKi@%JgR5i|wr(8A8 zj3=TRXT}qp7JnH}ST)X!r(|0EWjujt@n?HtMs6l&kGXhS{F!+GUY?t;`Jyu~-uBh2 zzWPjVrD~i@xqEYhIZGZ3PUkNj$@K(7)A^Z_(&^x0MYUGZqORU`yJDB>i6O4)wKq0v z8}?}%dey346lkdk)^kBT%L0&`^VWj>s{uk4vFz~}zx^#0d-XEvmBE418-X>SG(9(nzlnSE)0mFBOS&dGj|UpD>1 z>z|%EGncF8cc$|@wfxTM+)S`4x%tZO+4dXz)Zn&saGMs~CK7PfS+$z$K9}+Weo6~u zftii(@#*{4tMVfMHVBJmfm!UR@bo=`_pSH!MmY;xy%0>z1~Z#Mq|6m>-s9`{tuRk{ zbG#&GW`SAAx~{#6kMN3ZvyN?}hb;62LRX5W{aJkl^?hWzXS!#pu+AS@@|XblPHu2| zOLFtfp0uw?^MQt1>5XPU;f%FTADxEd&@z8?$zy`GUN2;aO;Dsa|Kx4o3e~qFQxdx} zI(=aJz*263A2I|ch~@Cs1O);ALG*~_;p_`q!-ks>JLYRPz(II?umvrz^}||PHc%@% zX%GP~-XnP53bNA^s!5(h3&l}QMWOX*rqFscQ)oSMTJHe`xU_XT#5!|T#U5`HXyaFY zZTg^5BboAAt-NFU*z_?Dp>?x0u*{Pws7eO3f~wioTJ^dc8`A|_wSuj*t(%9Ism@b# z%a;mP`5_Ntg5%zRe+vt!gYq0diPr`w@)VT3{>pSNhDUK!E2^CiWQt1VZy2r)S56m$ zQZ0WAO4!_}cdaBo9W;Ln!&ka6@`DkMvP^z4V>7-n#;jV=cH7sc`r0zN538TxT*~$O zcX3~?1C$A-3bO&*Z~Lv4;?;Y6|GpInm`U)jl!#i(}yzQl@R~P6hyCtw1O3> zbvFVxx2bD-pjHscL)VV50wa0Thfvq$?P^(@9&**3_r~Kljv!b$gOxK_dERud6|9s( zBL#sB%c+5nKo zj^?226$QK)l?HgPGT;sK)(+~OGp*h)rw_iD>-X;jXTkwWa{LcqfZ1R{iT^=7vB6cR zy`1ruhqJl(d*s?cy0TNN?0ipzdfy)Qpbu`1mvYMeu_X@xTtDPRUVlZ6pb$g-o@QS1P=q&SjlC$S;dNt~o^&<1D_1gYy3 zMLxDcfau@@8yLt2@PUUMc+?>W9eU8Aha7i<0m|O=C+wp91NwVI?($>l76`cb&GNl@ zvmZ0>&3iLDyFq}pyV|@jI4-f&1iO^9pLNh}EU56p*8K5~iECg|N3%A5XQqNd(RKgERFXwgi^ z{%#!o#a41$$vIM)z0J(K=H12{&757_z{}A(v{r2L@jYX=n;5&I1}8MAOAzWgv-+gu z5~oejJ6+0K7N;B0-iB_BM#wMo#JnrmZGpWagh)XO$B)M9Av0?0RjyYp72AIEmF6qQ zyC*m8)qTFYZ!Pa*X&sv)co(2S$UihCW?maWWk1wBcUWrR5| z8?VATs^iqV1fhXpRZz(*nI*5Jo2eirO7+;^C!b8h0_#&}N<=sSS8ZjED|1x%G?wA; z)S_`<98lq)1)%{&29*k*qr$tH3R1dirRMF_0#7X%2Q58!rew)u$ly@WS$u3kN(<6M zjjdw{I+5jZTt;gu&!=j}&Auatq^Y7+KHnJQ<@3jjd}G@#?{L~)v(m4TYm$O4!i038 z_Ip`dbMQftQD~-J!D;vNU(=*y=DWhT1@oikA5S(;KCu(mc;cF|=cq4fNk{VGGnUmV zjueE(`0=)&yTokwa%@PUyd%FvelUO0FPtU@tHovg4S1mQ|s8MYlk5_t7 z@T&WYtyH*z11I2;bo)vB?|xFRm?1^>z+GR~uEOIS zfIEZzGCmhicHILvy`i0Vq(S%yp5s6`f{IMc8GC-mM91xP4x)!}){}HkeOUEQ+i%oy zcB!vXhon#eAMe(%xClUZu)sCkQ=$}Ph7WQ35K$Rk*5$*5N});+@Y;V0WPC>g{WB`dHwp?U2dN*s+=0ZYV)YV()><%=5HxGUIoHM2zbUgsOD$W04c=EMX52kG ztiNSz6;29sh`df{MSBZ3Wi(nPs4THuf$d zH(Q$K;;*Bp8Lq^KbxGDaYC?`OGztK;Nly9{7?1%)?z1#q9o!@x-0auEO~g&zXvx># z^Xx)Ee^=>F0eZ4TdCza|mu#iL6{zb9gk!14_l;d+ms%2Zf01MXJz1i_RCN#R+q)8E zJ7Jn}!wIPxu004=ZtWQN5e(P?Eeku~+m0em?k%z1Jz*h-!&c}L1a z&WqlKT$bbjz8n!QdUF0vS@Lg6uj@D?1Dc=<1(1Blq!MLO-0}(H0eU>5_$TETp7skj zZiqtTBnapU5@m5|QZ=Fu)@Kj4uuer&KuIrI8~|O>Xu&`LtfCkb00S|TwuJA!cv< z8vL9f)F1Ke%JD_Pa*5yWW!jWNIY*W?7ytmBbdIAr2#U_AJRfwOrC@PAfRmbYq+2rE zLmx121-3J7T-d;OY^};QM8OA?)d_8B^eM~HXjRa=63Z3X4rcp|?RN&zo}JV`cO}7X zcM_+Y;H?GSHtf3-=>c~_O=u|-1{O&JHXF$>EO$$=QX95%fh(wLg)O(LHD0}8sTFKz z)g>VGwtFbwmz-g@S)WU%X0_YQgf*tL@#juD0xu0U7<|EK<|2Y`iobQKP;QmxTjhn; zY!&}vlTPY3)9_GZ56{v$2S)%AUymp_V`5jAW=c+2>_+fmBqu6%F#=F|x++x6%skCE z4u5zPV>-u+KR$OlfBNX3e?5JUZ@ghmzrn|Ex5g)FiBr6-DEWvJ6XJ;Qr=QfEDe)&G zVc=!fte7eDw`PWi%T89%`_8O;mLK}H;_K8RYQ?i+XW{Ho=5fhX8@oT;I=+6A`Nz!h zEneNW!aH_&hlh8JYmQpcQuPOpgrp&hWEc)Sz4M0W64N|UHTH}>zkEAfK=k9eZJq zFYH;FeM?F?A)SR9kVG;JIlu8Q*~&6kFtYI>W0zfdO~dgA0sUI#0-a3JQj3ndNj{Jd zALEH$8avf4w-zoPg}6TF#D|)B*M&CrTsYteYX%`HEv)eBCKRnzsWqmpmEUwWyK;|L z?!g^()E)6u&S*5Nu0))+K&OK@Whs^YZuQ$$^ULG$lLx1Bc5;U&cMxT$vW8H?2VGi# z`}#7qkwL(e-P~nkkK^!N_1}8@vU$T+7PtaMpJDk{Ecf_b9-9|kyPDL-DGC^ddg=)} zX3*i_c+8rlMZdZA)vfxTt3C%YD7?8wbc?1iHr6qJGMH*#n?W@*rM0AQht>c zS+0ekYkC8tu{0p7&XA|<0}X=@_&~jZ>=!BY34%+sc8`IeZmhrcT%@tVsGP}}(sjV5;jq8qDq#@}bxI}CB7^viU z_UKc3FGcfxd-4LGykLx5rHni`zo^Bl-V5Msm%PmQ#V?Ai;<43dvQ>nx zz|MXbw_(YJy5OzXwo>Ct&5=Hk*~CC~>eB3dbNeLy(?wS~VA>S?8lWq%v){!BvNV~( zYTyB5oi!t!E5##BTC-6X(>If%EJZjAjc{B`(WQv7Er{%`R#PxC&W*0I$) zT)l(&8zxim4;cc?dM3o23T9+tB_ra^$k3$jpJ>kiKQF0Rn%K^359gKk90UFr)bC;& literal 0 HcmV?d00001 diff --git a/venv/lib/python3.11/site-packages/_cffi_backend.cpython-311-x86_64-linux-gnu.so b/venv/lib/python3.11/site-packages/_cffi_backend.cpython-311-x86_64-linux-gnu.so new file mode 100755 index 0000000000000000000000000000000000000000..d940aac0d8f7d2a8e6f88a33606a7a320692043c GIT binary patch literal 332440 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 literal 0 HcmV?d00001 diff --git a/venv/lib/python3.11/site-packages/_distutils_hack/__pycache__/override.cpython-311.pyc b/venv/lib/python3.11/site-packages/_distutils_hack/__pycache__/override.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..632d86e54936a6db3c5cdb0ccee71e7fff066b05 GIT binary patch literal 324 zcmZ3^%ge<81P$V4nL0rFF^B^L%uvQ>2OwiQ0~13kLkhz(Mh1q}Knwv3;4GL3h+YQ7 ztKkBS3@MDk44O>0_~TPDi%UvNGINUKGZK@t{eWUz@$s3t1^GoK@$t8~Q}W~U%TkMq zGE-7lGJFOZ@GDk7BR@A)zdW(1Brz{hKey7cpg=z=g#t>kOKg7&I?3XkTH_z5qi-Y(T{T#d=e* literal 0 HcmV?d00001 diff --git a/venv/lib/python3.11/site-packages/_distutils_hack/override.py b/venv/lib/python3.11/site-packages/_distutils_hack/override.py new file mode 100644 index 0000000..2cc433a --- /dev/null +++ b/venv/lib/python3.11/site-packages/_distutils_hack/override.py @@ -0,0 +1 @@ +__import__('_distutils_hack').do_override() diff --git a/venv/lib/python3.11/site-packages/annotated_types-0.7.0.dist-info/INSTALLER b/venv/lib/python3.11/site-packages/annotated_types-0.7.0.dist-info/INSTALLER new file mode 100644 index 0000000..a1b589e --- /dev/null +++ b/venv/lib/python3.11/site-packages/annotated_types-0.7.0.dist-info/INSTALLER @@ -0,0 +1 @@ +pip diff --git a/venv/lib/python3.11/site-packages/annotated_types-0.7.0.dist-info/METADATA b/venv/lib/python3.11/site-packages/annotated_types-0.7.0.dist-info/METADATA new file mode 100644 index 0000000..3ac05cf --- /dev/null +++ b/venv/lib/python3.11/site-packages/annotated_types-0.7.0.dist-info/METADATA @@ -0,0 +1,295 @@ +Metadata-Version: 2.3 +Name: annotated-types +Version: 0.7.0 +Summary: Reusable constraint types to use with typing.Annotated +Project-URL: Homepage, https://github.com/annotated-types/annotated-types +Project-URL: Source, https://github.com/annotated-types/annotated-types +Project-URL: Changelog, https://github.com/annotated-types/annotated-types/releases +Author-email: Adrian Garcia Badaracco <1755071+adriangb@users.noreply.github.com>, Samuel Colvin , Zac Hatfield-Dodds +License-File: LICENSE +Classifier: Development Status :: 4 - Beta +Classifier: Environment :: Console +Classifier: Environment :: MacOS X +Classifier: Intended Audience :: Developers +Classifier: Intended Audience :: Information Technology +Classifier: License :: OSI Approved :: MIT License +Classifier: Operating System :: POSIX :: Linux +Classifier: Operating System :: Unix +Classifier: Programming Language :: Python :: 3 :: Only +Classifier: Programming Language :: Python :: 3.8 +Classifier: Programming Language :: Python :: 3.9 +Classifier: Programming Language :: Python :: 3.10 +Classifier: Programming Language :: Python :: 3.11 +Classifier: Programming Language :: Python :: 3.12 +Classifier: Topic :: Software Development :: Libraries :: Python Modules +Classifier: Typing :: Typed +Requires-Python: >=3.8 +Requires-Dist: typing-extensions>=4.0.0; python_version < '3.9' +Description-Content-Type: text/markdown + +# annotated-types + +[![CI](https://github.com/annotated-types/annotated-types/workflows/CI/badge.svg?event=push)](https://github.com/annotated-types/annotated-types/actions?query=event%3Apush+branch%3Amain+workflow%3ACI) +[![pypi](https://img.shields.io/pypi/v/annotated-types.svg)](https://pypi.python.org/pypi/annotated-types) +[![versions](https://img.shields.io/pypi/pyversions/annotated-types.svg)](https://github.com/annotated-types/annotated-types) +[![license](https://img.shields.io/github/license/annotated-types/annotated-types.svg)](https://github.com/annotated-types/annotated-types/blob/main/LICENSE) + +[PEP-593](https://peps.python.org/pep-0593/) added `typing.Annotated` as a way of +adding context-specific metadata to existing types, and specifies that +`Annotated[T, x]` _should_ be treated as `T` by any tool or library without special +logic for `x`. + +This package provides metadata objects which can be used to represent common +constraints such as upper and lower bounds on scalar values and collection sizes, +a `Predicate` marker for runtime checks, and +descriptions of how we intend these metadata to be interpreted. In some cases, +we also note alternative representations which do not require this package. + +## Install + +```bash +pip install annotated-types +``` + +## Examples + +```python +from typing import Annotated +from annotated_types import Gt, Len, Predicate + +class MyClass: + age: Annotated[int, Gt(18)] # Valid: 19, 20, ... + # Invalid: 17, 18, "19", 19.0, ... + factors: list[Annotated[int, Predicate(is_prime)]] # Valid: 2, 3, 5, 7, 11, ... + # Invalid: 4, 8, -2, 5.0, "prime", ... + + my_list: Annotated[list[int], Len(0, 10)] # Valid: [], [10, 20, 30, 40, 50] + # Invalid: (1, 2), ["abc"], [0] * 20 +``` + +## Documentation + +_While `annotated-types` avoids runtime checks for performance, users should not +construct invalid combinations such as `MultipleOf("non-numeric")` or `Annotated[int, Len(3)]`. +Downstream implementors may choose to raise an error, emit a warning, silently ignore +a metadata item, etc., if the metadata objects described below are used with an +incompatible type - or for any other reason!_ + +### Gt, Ge, Lt, Le + +Express inclusive and/or exclusive bounds on orderable values - which may be numbers, +dates, times, strings, sets, etc. Note that the boundary value need not be of the +same type that was annotated, so long as they can be compared: `Annotated[int, Gt(1.5)]` +is fine, for example, and implies that the value is an integer x such that `x > 1.5`. + +We suggest that implementors may also interpret `functools.partial(operator.le, 1.5)` +as being equivalent to `Gt(1.5)`, for users who wish to avoid a runtime dependency on +the `annotated-types` package. + +To be explicit, these types have the following meanings: + +* `Gt(x)` - value must be "Greater Than" `x` - equivalent to exclusive minimum +* `Ge(x)` - value must be "Greater than or Equal" to `x` - equivalent to inclusive minimum +* `Lt(x)` - value must be "Less Than" `x` - equivalent to exclusive maximum +* `Le(x)` - value must be "Less than or Equal" to `x` - equivalent to inclusive maximum + +### Interval + +`Interval(gt, ge, lt, le)` allows you to specify an upper and lower bound with a single +metadata object. `None` attributes should be ignored, and non-`None` attributes +treated as per the single bounds above. + +### MultipleOf + +`MultipleOf(multiple_of=x)` might be interpreted in two ways: + +1. Python semantics, implying `value % multiple_of == 0`, or +2. [JSONschema semantics](https://json-schema.org/draft/2020-12/json-schema-validation.html#rfc.section.6.2.1), + where `int(value / multiple_of) == value / multiple_of`. + +We encourage users to be aware of these two common interpretations and their +distinct behaviours, especially since very large or non-integer numbers make +it easy to cause silent data corruption due to floating-point imprecision. + +We encourage libraries to carefully document which interpretation they implement. + +### MinLen, MaxLen, Len + +`Len()` implies that `min_length <= len(value) <= max_length` - lower and upper bounds are inclusive. + +As well as `Len()` which can optionally include upper and lower bounds, we also +provide `MinLen(x)` and `MaxLen(y)` which are equivalent to `Len(min_length=x)` +and `Len(max_length=y)` respectively. + +`Len`, `MinLen`, and `MaxLen` may be used with any type which supports `len(value)`. + +Examples of usage: + +* `Annotated[list, MaxLen(10)]` (or `Annotated[list, Len(max_length=10))`) - list must have a length of 10 or less +* `Annotated[str, MaxLen(10)]` - string must have a length of 10 or less +* `Annotated[list, MinLen(3))` (or `Annotated[list, Len(min_length=3))`) - list must have a length of 3 or more +* `Annotated[list, Len(4, 6)]` - list must have a length of 4, 5, or 6 +* `Annotated[list, Len(8, 8)]` - list must have a length of exactly 8 + +#### Changed in v0.4.0 + +* `min_inclusive` has been renamed to `min_length`, no change in meaning +* `max_exclusive` has been renamed to `max_length`, upper bound is now **inclusive** instead of **exclusive** +* The recommendation that slices are interpreted as `Len` has been removed due to ambiguity and different semantic + meaning of the upper bound in slices vs. `Len` + +See [issue #23](https://github.com/annotated-types/annotated-types/issues/23) for discussion. + +### Timezone + +`Timezone` can be used with a `datetime` or a `time` to express which timezones +are allowed. `Annotated[datetime, Timezone(None)]` must be a naive datetime. +`Timezone[...]` ([literal ellipsis](https://docs.python.org/3/library/constants.html#Ellipsis)) +expresses that any timezone-aware datetime is allowed. You may also pass a specific +timezone string or [`tzinfo`](https://docs.python.org/3/library/datetime.html#tzinfo-objects) +object such as `Timezone(timezone.utc)` or `Timezone("Africa/Abidjan")` to express that you only +allow a specific timezone, though we note that this is often a symptom of fragile design. + +#### Changed in v0.x.x + +* `Timezone` accepts [`tzinfo`](https://docs.python.org/3/library/datetime.html#tzinfo-objects) objects instead of + `timezone`, extending compatibility to [`zoneinfo`](https://docs.python.org/3/library/zoneinfo.html) and third party libraries. + +### Unit + +`Unit(unit: str)` expresses that the annotated numeric value is the magnitude of +a quantity with the specified unit. For example, `Annotated[float, Unit("m/s")]` +would be a float representing a velocity in meters per second. + +Please note that `annotated_types` itself makes no attempt to parse or validate +the unit string in any way. That is left entirely to downstream libraries, +such as [`pint`](https://pint.readthedocs.io) or +[`astropy.units`](https://docs.astropy.org/en/stable/units/). + +An example of how a library might use this metadata: + +```python +from annotated_types import Unit +from typing import Annotated, TypeVar, Callable, Any, get_origin, get_args + +# given a type annotated with a unit: +Meters = Annotated[float, Unit("m")] + + +# you can cast the annotation to a specific unit type with any +# callable that accepts a string and returns the desired type +T = TypeVar("T") +def cast_unit(tp: Any, unit_cls: Callable[[str], T]) -> T | None: + if get_origin(tp) is Annotated: + for arg in get_args(tp): + if isinstance(arg, Unit): + return unit_cls(arg.unit) + return None + + +# using `pint` +import pint +pint_unit = cast_unit(Meters, pint.Unit) + + +# using `astropy.units` +import astropy.units as u +astropy_unit = cast_unit(Meters, u.Unit) +``` + +### Predicate + +`Predicate(func: Callable)` expresses that `func(value)` is truthy for valid values. +Users should prefer the statically inspectable metadata above, but if you need +the full power and flexibility of arbitrary runtime predicates... here it is. + +For some common constraints, we provide generic types: + +* `IsLower = Annotated[T, Predicate(str.islower)]` +* `IsUpper = Annotated[T, Predicate(str.isupper)]` +* `IsDigit = Annotated[T, Predicate(str.isdigit)]` +* `IsFinite = Annotated[T, Predicate(math.isfinite)]` +* `IsNotFinite = Annotated[T, Predicate(Not(math.isfinite))]` +* `IsNan = Annotated[T, Predicate(math.isnan)]` +* `IsNotNan = Annotated[T, Predicate(Not(math.isnan))]` +* `IsInfinite = Annotated[T, Predicate(math.isinf)]` +* `IsNotInfinite = Annotated[T, Predicate(Not(math.isinf))]` + +so that you can write e.g. `x: IsFinite[float] = 2.0` instead of the longer +(but exactly equivalent) `x: Annotated[float, Predicate(math.isfinite)] = 2.0`. + +Some libraries might have special logic to handle known or understandable predicates, +for example by checking for `str.isdigit` and using its presence to both call custom +logic to enforce digit-only strings, and customise some generated external schema. +Users are therefore encouraged to avoid indirection like `lambda s: s.lower()`, in +favor of introspectable methods such as `str.lower` or `re.compile("pattern").search`. + +To enable basic negation of commonly used predicates like `math.isnan` without introducing introspection that makes it impossible for implementers to introspect the predicate we provide a `Not` wrapper that simply negates the predicate in an introspectable manner. Several of the predicates listed above are created in this manner. + +We do not specify what behaviour should be expected for predicates that raise +an exception. For example `Annotated[int, Predicate(str.isdigit)]` might silently +skip invalid constraints, or statically raise an error; or it might try calling it +and then propagate or discard the resulting +`TypeError: descriptor 'isdigit' for 'str' objects doesn't apply to a 'int' object` +exception. We encourage libraries to document the behaviour they choose. + +### Doc + +`doc()` can be used to add documentation information in `Annotated`, for function and method parameters, variables, class attributes, return types, and any place where `Annotated` can be used. + +It expects a value that can be statically analyzed, as the main use case is for static analysis, editors, documentation generators, and similar tools. + +It returns a `DocInfo` class with a single attribute `documentation` containing the value passed to `doc()`. + +This is the early adopter's alternative form of the [`typing-doc` proposal](https://github.com/tiangolo/fastapi/blob/typing-doc/typing_doc.md). + +### Integrating downstream types with `GroupedMetadata` + +Implementers may choose to provide a convenience wrapper that groups multiple pieces of metadata. +This can help reduce verbosity and cognitive overhead for users. +For example, an implementer like Pydantic might provide a `Field` or `Meta` type that accepts keyword arguments and transforms these into low-level metadata: + +```python +from dataclasses import dataclass +from typing import Iterator +from annotated_types import GroupedMetadata, Ge + +@dataclass +class Field(GroupedMetadata): + ge: int | None = None + description: str | None = None + + def __iter__(self) -> Iterator[object]: + # Iterating over a GroupedMetadata object should yield annotated-types + # constraint metadata objects which describe it as fully as possible, + # and may include other unknown objects too. + if self.ge is not None: + yield Ge(self.ge) + if self.description is not None: + yield Description(self.description) +``` + +Libraries consuming annotated-types constraints should check for `GroupedMetadata` and unpack it by iterating over the object and treating the results as if they had been "unpacked" in the `Annotated` type. The same logic should be applied to the [PEP 646 `Unpack` type](https://peps.python.org/pep-0646/), so that `Annotated[T, Field(...)]`, `Annotated[T, Unpack[Field(...)]]` and `Annotated[T, *Field(...)]` are all treated consistently. + +Libraries consuming annotated-types should also ignore any metadata they do not recongize that came from unpacking a `GroupedMetadata`, just like they ignore unrecognized metadata in `Annotated` itself. + +Our own `annotated_types.Interval` class is a `GroupedMetadata` which unpacks itself into `Gt`, `Lt`, etc., so this is not an abstract concern. Similarly, `annotated_types.Len` is a `GroupedMetadata` which unpacks itself into `MinLen` (optionally) and `MaxLen`. + +### Consuming metadata + +We intend to not be prescriptive as to _how_ the metadata and constraints are used, but as an example of how one might parse constraints from types annotations see our [implementation in `test_main.py`](https://github.com/annotated-types/annotated-types/blob/f59cf6d1b5255a0fe359b93896759a180bec30ae/tests/test_main.py#L94-L103). + +It is up to the implementer to determine how this metadata is used. +You could use the metadata for runtime type checking, for generating schemas or to generate example data, amongst other use cases. + +## Design & History + +This package was designed at the PyCon 2022 sprints by the maintainers of Pydantic +and Hypothesis, with the goal of making it as easy as possible for end-users to +provide more informative annotations for use by runtime libraries. + +It is deliberately minimal, and following PEP-593 allows considerable downstream +discretion in what (if anything!) they choose to support. Nonetheless, we expect +that staying simple and covering _only_ the most common use-cases will give users +and maintainers the best experience we can. If you'd like more constraints for your +types - follow our lead, by defining them and documenting them downstream! diff --git a/venv/lib/python3.11/site-packages/annotated_types-0.7.0.dist-info/RECORD b/venv/lib/python3.11/site-packages/annotated_types-0.7.0.dist-info/RECORD new file mode 100644 index 0000000..cb983b0 --- /dev/null +++ b/venv/lib/python3.11/site-packages/annotated_types-0.7.0.dist-info/RECORD @@ -0,0 +1,10 @@ +annotated_types-0.7.0.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 +annotated_types-0.7.0.dist-info/METADATA,sha256=7ltqxksJJ0wCYFGBNIQCWTlWQGeAH0hRFdnK3CB895E,15046 +annotated_types-0.7.0.dist-info/RECORD,, +annotated_types-0.7.0.dist-info/WHEEL,sha256=zEMcRr9Kr03x1ozGwg5v9NQBKn3kndp6LSoSlVg-jhU,87 +annotated_types-0.7.0.dist-info/licenses/LICENSE,sha256=_hBJiEsaDZNCkB6I4H8ykl0ksxIdmXK2poBfuYJLCV0,1083 +annotated_types/__init__.py,sha256=RynLsRKUEGI0KimXydlD1fZEfEzWwDo0Uon3zOKhG1Q,13819 +annotated_types/__pycache__/__init__.cpython-311.pyc,, +annotated_types/__pycache__/test_cases.cpython-311.pyc,, +annotated_types/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +annotated_types/test_cases.py,sha256=zHFX6EpcMbGJ8FzBYDbO56bPwx_DYIVSKbZM-4B3_lg,6421 diff --git a/venv/lib/python3.11/site-packages/annotated_types-0.7.0.dist-info/WHEEL b/venv/lib/python3.11/site-packages/annotated_types-0.7.0.dist-info/WHEEL new file mode 100644 index 0000000..516596c --- /dev/null +++ b/venv/lib/python3.11/site-packages/annotated_types-0.7.0.dist-info/WHEEL @@ -0,0 +1,4 @@ +Wheel-Version: 1.0 +Generator: hatchling 1.24.2 +Root-Is-Purelib: true +Tag: py3-none-any diff --git a/venv/lib/python3.11/site-packages/annotated_types-0.7.0.dist-info/licenses/LICENSE b/venv/lib/python3.11/site-packages/annotated_types-0.7.0.dist-info/licenses/LICENSE new file mode 100644 index 0000000..d99323a --- /dev/null +++ b/venv/lib/python3.11/site-packages/annotated_types-0.7.0.dist-info/licenses/LICENSE @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) 2022 the contributors + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/venv/lib/python3.11/site-packages/annotated_types/__init__.py b/venv/lib/python3.11/site-packages/annotated_types/__init__.py new file mode 100644 index 0000000..74e0dee --- /dev/null +++ b/venv/lib/python3.11/site-packages/annotated_types/__init__.py @@ -0,0 +1,432 @@ +import math +import sys +import types +from dataclasses import dataclass +from datetime import tzinfo +from typing import TYPE_CHECKING, Any, Callable, Iterator, Optional, SupportsFloat, SupportsIndex, TypeVar, Union + +if sys.version_info < (3, 8): + from typing_extensions import Protocol, runtime_checkable +else: + from typing import Protocol, runtime_checkable + +if sys.version_info < (3, 9): + from typing_extensions import Annotated, Literal +else: + from typing import Annotated, Literal + +if sys.version_info < (3, 10): + EllipsisType = type(Ellipsis) + KW_ONLY = {} + SLOTS = {} +else: + from types import EllipsisType + + KW_ONLY = {"kw_only": True} + SLOTS = {"slots": True} + + +__all__ = ( + 'BaseMetadata', + 'GroupedMetadata', + 'Gt', + 'Ge', + 'Lt', + 'Le', + 'Interval', + 'MultipleOf', + 'MinLen', + 'MaxLen', + 'Len', + 'Timezone', + 'Predicate', + 'LowerCase', + 'UpperCase', + 'IsDigits', + 'IsFinite', + 'IsNotFinite', + 'IsNan', + 'IsNotNan', + 'IsInfinite', + 'IsNotInfinite', + 'doc', + 'DocInfo', + '__version__', +) + +__version__ = '0.7.0' + + +T = TypeVar('T') + + +# arguments that start with __ are considered +# positional only +# see https://peps.python.org/pep-0484/#positional-only-arguments + + +class SupportsGt(Protocol): + def __gt__(self: T, __other: T) -> bool: + ... + + +class SupportsGe(Protocol): + def __ge__(self: T, __other: T) -> bool: + ... + + +class SupportsLt(Protocol): + def __lt__(self: T, __other: T) -> bool: + ... + + +class SupportsLe(Protocol): + def __le__(self: T, __other: T) -> bool: + ... + + +class SupportsMod(Protocol): + def __mod__(self: T, __other: T) -> T: + ... + + +class SupportsDiv(Protocol): + def __div__(self: T, __other: T) -> T: + ... + + +class BaseMetadata: + """Base class for all metadata. + + This exists mainly so that implementers + can do `isinstance(..., BaseMetadata)` while traversing field annotations. + """ + + __slots__ = () + + +@dataclass(frozen=True, **SLOTS) +class Gt(BaseMetadata): + """Gt(gt=x) implies that the value must be greater than x. + + It can be used with any type that supports the ``>`` operator, + including numbers, dates and times, strings, sets, and so on. + """ + + gt: SupportsGt + + +@dataclass(frozen=True, **SLOTS) +class Ge(BaseMetadata): + """Ge(ge=x) implies that the value must be greater than or equal to x. + + It can be used with any type that supports the ``>=`` operator, + including numbers, dates and times, strings, sets, and so on. + """ + + ge: SupportsGe + + +@dataclass(frozen=True, **SLOTS) +class Lt(BaseMetadata): + """Lt(lt=x) implies that the value must be less than x. + + It can be used with any type that supports the ``<`` operator, + including numbers, dates and times, strings, sets, and so on. + """ + + lt: SupportsLt + + +@dataclass(frozen=True, **SLOTS) +class Le(BaseMetadata): + """Le(le=x) implies that the value must be less than or equal to x. + + It can be used with any type that supports the ``<=`` operator, + including numbers, dates and times, strings, sets, and so on. + """ + + le: SupportsLe + + +@runtime_checkable +class GroupedMetadata(Protocol): + """A grouping of multiple objects, like typing.Unpack. + + `GroupedMetadata` on its own is not metadata and has no meaning. + All of the constraints and metadata should be fully expressable + in terms of the `BaseMetadata`'s returned by `GroupedMetadata.__iter__()`. + + Concrete implementations should override `GroupedMetadata.__iter__()` + to add their own metadata. + For example: + + >>> @dataclass + >>> class Field(GroupedMetadata): + >>> gt: float | None = None + >>> description: str | None = None + ... + >>> def __iter__(self) -> Iterable[object]: + >>> if self.gt is not None: + >>> yield Gt(self.gt) + >>> if self.description is not None: + >>> yield Description(self.gt) + + Also see the implementation of `Interval` below for an example. + + Parsers should recognize this and unpack it so that it can be used + both with and without unpacking: + + - `Annotated[int, Field(...)]` (parser must unpack Field) + - `Annotated[int, *Field(...)]` (PEP-646) + """ # noqa: trailing-whitespace + + @property + def __is_annotated_types_grouped_metadata__(self) -> Literal[True]: + return True + + def __iter__(self) -> Iterator[object]: + ... + + if not TYPE_CHECKING: + __slots__ = () # allow subclasses to use slots + + def __init_subclass__(cls, *args: Any, **kwargs: Any) -> None: + # Basic ABC like functionality without the complexity of an ABC + super().__init_subclass__(*args, **kwargs) + if cls.__iter__ is GroupedMetadata.__iter__: + raise TypeError("Can't subclass GroupedMetadata without implementing __iter__") + + def __iter__(self) -> Iterator[object]: # noqa: F811 + raise NotImplementedError # more helpful than "None has no attribute..." type errors + + +@dataclass(frozen=True, **KW_ONLY, **SLOTS) +class Interval(GroupedMetadata): + """Interval can express inclusive or exclusive bounds with a single object. + + It accepts keyword arguments ``gt``, ``ge``, ``lt``, and/or ``le``, which + are interpreted the same way as the single-bound constraints. + """ + + gt: Union[SupportsGt, None] = None + ge: Union[SupportsGe, None] = None + lt: Union[SupportsLt, None] = None + le: Union[SupportsLe, None] = None + + def __iter__(self) -> Iterator[BaseMetadata]: + """Unpack an Interval into zero or more single-bounds.""" + if self.gt is not None: + yield Gt(self.gt) + if self.ge is not None: + yield Ge(self.ge) + if self.lt is not None: + yield Lt(self.lt) + if self.le is not None: + yield Le(self.le) + + +@dataclass(frozen=True, **SLOTS) +class MultipleOf(BaseMetadata): + """MultipleOf(multiple_of=x) might be interpreted in two ways: + + 1. Python semantics, implying ``value % multiple_of == 0``, or + 2. JSONschema semantics, where ``int(value / multiple_of) == value / multiple_of`` + + We encourage users to be aware of these two common interpretations, + and libraries to carefully document which they implement. + """ + + multiple_of: Union[SupportsDiv, SupportsMod] + + +@dataclass(frozen=True, **SLOTS) +class MinLen(BaseMetadata): + """ + MinLen() implies minimum inclusive length, + e.g. ``len(value) >= min_length``. + """ + + min_length: Annotated[int, Ge(0)] + + +@dataclass(frozen=True, **SLOTS) +class MaxLen(BaseMetadata): + """ + MaxLen() implies maximum inclusive length, + e.g. ``len(value) <= max_length``. + """ + + max_length: Annotated[int, Ge(0)] + + +@dataclass(frozen=True, **SLOTS) +class Len(GroupedMetadata): + """ + Len() implies that ``min_length <= len(value) <= max_length``. + + Upper bound may be omitted or ``None`` to indicate no upper length bound. + """ + + min_length: Annotated[int, Ge(0)] = 0 + max_length: Optional[Annotated[int, Ge(0)]] = None + + def __iter__(self) -> Iterator[BaseMetadata]: + """Unpack a Len into zone or more single-bounds.""" + if self.min_length > 0: + yield MinLen(self.min_length) + if self.max_length is not None: + yield MaxLen(self.max_length) + + +@dataclass(frozen=True, **SLOTS) +class Timezone(BaseMetadata): + """Timezone(tz=...) requires a datetime to be aware (or ``tz=None``, naive). + + ``Annotated[datetime, Timezone(None)]`` must be a naive datetime. + ``Timezone[...]`` (the ellipsis literal) expresses that the datetime must be + tz-aware but any timezone is allowed. + + You may also pass a specific timezone string or tzinfo object such as + ``Timezone(timezone.utc)`` or ``Timezone("Africa/Abidjan")`` to express that + you only allow a specific timezone, though we note that this is often + a symptom of poor design. + """ + + tz: Union[str, tzinfo, EllipsisType, None] + + +@dataclass(frozen=True, **SLOTS) +class Unit(BaseMetadata): + """Indicates that the value is a physical quantity with the specified unit. + + It is intended for usage with numeric types, where the value represents the + magnitude of the quantity. For example, ``distance: Annotated[float, Unit('m')]`` + or ``speed: Annotated[float, Unit('m/s')]``. + + Interpretation of the unit string is left to the discretion of the consumer. + It is suggested to follow conventions established by python libraries that work + with physical quantities, such as + + - ``pint`` : + - ``astropy.units``: + + For indicating a quantity with a certain dimensionality but without a specific unit + it is recommended to use square brackets, e.g. `Annotated[float, Unit('[time]')]`. + Note, however, ``annotated_types`` itself makes no use of the unit string. + """ + + unit: str + + +@dataclass(frozen=True, **SLOTS) +class Predicate(BaseMetadata): + """``Predicate(func: Callable)`` implies `func(value)` is truthy for valid values. + + Users should prefer statically inspectable metadata, but if you need the full + power and flexibility of arbitrary runtime predicates... here it is. + + We provide a few predefined predicates for common string constraints: + ``IsLower = Predicate(str.islower)``, ``IsUpper = Predicate(str.isupper)``, and + ``IsDigits = Predicate(str.isdigit)``. Users are encouraged to use methods which + can be given special handling, and avoid indirection like ``lambda s: s.lower()``. + + Some libraries might have special logic to handle certain predicates, e.g. by + checking for `str.isdigit` and using its presence to both call custom logic to + enforce digit-only strings, and customise some generated external schema. + + We do not specify what behaviour should be expected for predicates that raise + an exception. For example `Annotated[int, Predicate(str.isdigit)]` might silently + skip invalid constraints, or statically raise an error; or it might try calling it + and then propagate or discard the resulting exception. + """ + + func: Callable[[Any], bool] + + def __repr__(self) -> str: + if getattr(self.func, "__name__", "") == "": + return f"{self.__class__.__name__}({self.func!r})" + if isinstance(self.func, (types.MethodType, types.BuiltinMethodType)) and ( + namespace := getattr(self.func.__self__, "__name__", None) + ): + return f"{self.__class__.__name__}({namespace}.{self.func.__name__})" + if isinstance(self.func, type(str.isascii)): # method descriptor + return f"{self.__class__.__name__}({self.func.__qualname__})" + return f"{self.__class__.__name__}({self.func.__name__})" + + +@dataclass +class Not: + func: Callable[[Any], bool] + + def __call__(self, __v: Any) -> bool: + return not self.func(__v) + + +_StrType = TypeVar("_StrType", bound=str) + +LowerCase = Annotated[_StrType, Predicate(str.islower)] +""" +Return True if the string is a lowercase string, False otherwise. + +A string is lowercase if all cased characters in the string are lowercase and there is at least one cased character in the string. +""" # noqa: E501 +UpperCase = Annotated[_StrType, Predicate(str.isupper)] +""" +Return True if the string is an uppercase string, False otherwise. + +A string is uppercase if all cased characters in the string are uppercase and there is at least one cased character in the string. +""" # noqa: E501 +IsDigit = Annotated[_StrType, Predicate(str.isdigit)] +IsDigits = IsDigit # type: ignore # plural for backwards compatibility, see #63 +""" +Return True if the string is a digit string, False otherwise. + +A string is a digit string if all characters in the string are digits and there is at least one character in the string. +""" # noqa: E501 +IsAscii = Annotated[_StrType, Predicate(str.isascii)] +""" +Return True if all characters in the string are ASCII, False otherwise. + +ASCII characters have code points in the range U+0000-U+007F. Empty string is ASCII too. +""" + +_NumericType = TypeVar('_NumericType', bound=Union[SupportsFloat, SupportsIndex]) +IsFinite = Annotated[_NumericType, Predicate(math.isfinite)] +"""Return True if x is neither an infinity nor a NaN, and False otherwise.""" +IsNotFinite = Annotated[_NumericType, Predicate(Not(math.isfinite))] +"""Return True if x is one of infinity or NaN, and False otherwise""" +IsNan = Annotated[_NumericType, Predicate(math.isnan)] +"""Return True if x is a NaN (not a number), and False otherwise.""" +IsNotNan = Annotated[_NumericType, Predicate(Not(math.isnan))] +"""Return True if x is anything but NaN (not a number), and False otherwise.""" +IsInfinite = Annotated[_NumericType, Predicate(math.isinf)] +"""Return True if x is a positive or negative infinity, and False otherwise.""" +IsNotInfinite = Annotated[_NumericType, Predicate(Not(math.isinf))] +"""Return True if x is neither a positive or negative infinity, and False otherwise.""" + +try: + from typing_extensions import DocInfo, doc # type: ignore [attr-defined] +except ImportError: + + @dataclass(frozen=True, **SLOTS) + class DocInfo: # type: ignore [no-redef] + """ " + The return value of doc(), mainly to be used by tools that want to extract the + Annotated documentation at runtime. + """ + + documentation: str + """The documentation string passed to doc().""" + + def doc( + documentation: str, + ) -> DocInfo: + """ + Add documentation to a type annotation inside of Annotated. + + For example: + + >>> def hi(name: Annotated[int, doc("The name of the user")]) -> None: ... + """ + return DocInfo(documentation) diff --git a/venv/lib/python3.11/site-packages/annotated_types/__pycache__/__init__.cpython-311.pyc b/venv/lib/python3.11/site-packages/annotated_types/__pycache__/__init__.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..c325b80e9f87f8017ea54d076599a2bd8922afb0 GIT binary patch literal 20569 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 literal 0 HcmV?d00001 diff --git a/venv/lib/python3.11/site-packages/annotated_types/__pycache__/test_cases.cpython-311.pyc b/venv/lib/python3.11/site-packages/annotated_types/__pycache__/test_cases.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..196d55410d9c162d408013999490564cb81abee3 GIT binary patch literal 15460 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 literal 0 HcmV?d00001 diff --git a/venv/lib/python3.11/site-packages/annotated_types/py.typed b/venv/lib/python3.11/site-packages/annotated_types/py.typed new file mode 100644 index 0000000..e69de29 diff --git a/venv/lib/python3.11/site-packages/annotated_types/test_cases.py b/venv/lib/python3.11/site-packages/annotated_types/test_cases.py new file mode 100644 index 0000000..d9164d6 --- /dev/null +++ b/venv/lib/python3.11/site-packages/annotated_types/test_cases.py @@ -0,0 +1,151 @@ +import math +import sys +from datetime import date, datetime, timedelta, timezone +from decimal import Decimal +from typing import Any, Dict, Iterable, Iterator, List, NamedTuple, Set, Tuple + +if sys.version_info < (3, 9): + from typing_extensions import Annotated +else: + from typing import Annotated + +import annotated_types as at + + +class Case(NamedTuple): + """ + A test case for `annotated_types`. + """ + + annotation: Any + valid_cases: Iterable[Any] + invalid_cases: Iterable[Any] + + +def cases() -> Iterable[Case]: + # Gt, Ge, Lt, Le + yield Case(Annotated[int, at.Gt(4)], (5, 6, 1000), (4, 0, -1)) + yield Case(Annotated[float, at.Gt(0.5)], (0.6, 0.7, 0.8, 0.9), (0.5, 0.0, -0.1)) + yield Case( + Annotated[datetime, at.Gt(datetime(2000, 1, 1))], + [datetime(2000, 1, 2), datetime(2000, 1, 3)], + [datetime(2000, 1, 1), datetime(1999, 12, 31)], + ) + yield Case( + Annotated[datetime, at.Gt(date(2000, 1, 1))], + [date(2000, 1, 2), date(2000, 1, 3)], + [date(2000, 1, 1), date(1999, 12, 31)], + ) + yield Case( + Annotated[datetime, at.Gt(Decimal('1.123'))], + [Decimal('1.1231'), Decimal('123')], + [Decimal('1.123'), Decimal('0')], + ) + + yield Case(Annotated[int, at.Ge(4)], (4, 5, 6, 1000, 4), (0, -1)) + yield Case(Annotated[float, at.Ge(0.5)], (0.5, 0.6, 0.7, 0.8, 0.9), (0.4, 0.0, -0.1)) + yield Case( + Annotated[datetime, at.Ge(datetime(2000, 1, 1))], + [datetime(2000, 1, 2), datetime(2000, 1, 3)], + [datetime(1998, 1, 1), datetime(1999, 12, 31)], + ) + + yield Case(Annotated[int, at.Lt(4)], (0, -1), (4, 5, 6, 1000, 4)) + yield Case(Annotated[float, at.Lt(0.5)], (0.4, 0.0, -0.1), (0.5, 0.6, 0.7, 0.8, 0.9)) + yield Case( + Annotated[datetime, at.Lt(datetime(2000, 1, 1))], + [datetime(1999, 12, 31), datetime(1999, 12, 31)], + [datetime(2000, 1, 2), datetime(2000, 1, 3)], + ) + + yield Case(Annotated[int, at.Le(4)], (4, 0, -1), (5, 6, 1000)) + yield Case(Annotated[float, at.Le(0.5)], (0.5, 0.0, -0.1), (0.6, 0.7, 0.8, 0.9)) + yield Case( + Annotated[datetime, at.Le(datetime(2000, 1, 1))], + [datetime(2000, 1, 1), datetime(1999, 12, 31)], + [datetime(2000, 1, 2), datetime(2000, 1, 3)], + ) + + # Interval + yield Case(Annotated[int, at.Interval(gt=4)], (5, 6, 1000), (4, 0, -1)) + yield Case(Annotated[int, at.Interval(gt=4, lt=10)], (5, 6), (4, 10, 1000, 0, -1)) + yield Case(Annotated[float, at.Interval(ge=0.5, le=1)], (0.5, 0.9, 1), (0.49, 1.1)) + yield Case( + Annotated[datetime, at.Interval(gt=datetime(2000, 1, 1), le=datetime(2000, 1, 3))], + [datetime(2000, 1, 2), datetime(2000, 1, 3)], + [datetime(2000, 1, 1), datetime(2000, 1, 4)], + ) + + yield Case(Annotated[int, at.MultipleOf(multiple_of=3)], (0, 3, 9), (1, 2, 4)) + yield Case(Annotated[float, at.MultipleOf(multiple_of=0.5)], (0, 0.5, 1, 1.5), (0.4, 1.1)) + + # lengths + + yield Case(Annotated[str, at.MinLen(3)], ('123', '1234', 'x' * 10), ('', '1', '12')) + yield Case(Annotated[str, at.Len(3)], ('123', '1234', 'x' * 10), ('', '1', '12')) + yield Case(Annotated[List[int], at.MinLen(3)], ([1, 2, 3], [1, 2, 3, 4], [1] * 10), ([], [1], [1, 2])) + yield Case(Annotated[List[int], at.Len(3)], ([1, 2, 3], [1, 2, 3, 4], [1] * 10), ([], [1], [1, 2])) + + yield Case(Annotated[str, at.MaxLen(4)], ('', '1234'), ('12345', 'x' * 10)) + yield Case(Annotated[str, at.Len(0, 4)], ('', '1234'), ('12345', 'x' * 10)) + yield Case(Annotated[List[str], at.MaxLen(4)], ([], ['a', 'bcdef'], ['a', 'b', 'c']), (['a'] * 5, ['b'] * 10)) + yield Case(Annotated[List[str], at.Len(0, 4)], ([], ['a', 'bcdef'], ['a', 'b', 'c']), (['a'] * 5, ['b'] * 10)) + + yield Case(Annotated[str, at.Len(3, 5)], ('123', '12345'), ('', '1', '12', '123456', 'x' * 10)) + yield Case(Annotated[str, at.Len(3, 3)], ('123',), ('12', '1234')) + + yield Case(Annotated[Dict[int, int], at.Len(2, 3)], [{1: 1, 2: 2}], [{}, {1: 1}, {1: 1, 2: 2, 3: 3, 4: 4}]) + yield Case(Annotated[Set[int], at.Len(2, 3)], ({1, 2}, {1, 2, 3}), (set(), {1}, {1, 2, 3, 4})) + yield Case(Annotated[Tuple[int, ...], at.Len(2, 3)], ((1, 2), (1, 2, 3)), ((), (1,), (1, 2, 3, 4))) + + # Timezone + + yield Case( + Annotated[datetime, at.Timezone(None)], [datetime(2000, 1, 1)], [datetime(2000, 1, 1, tzinfo=timezone.utc)] + ) + yield Case( + Annotated[datetime, at.Timezone(...)], [datetime(2000, 1, 1, tzinfo=timezone.utc)], [datetime(2000, 1, 1)] + ) + yield Case( + Annotated[datetime, at.Timezone(timezone.utc)], + [datetime(2000, 1, 1, tzinfo=timezone.utc)], + [datetime(2000, 1, 1), datetime(2000, 1, 1, tzinfo=timezone(timedelta(hours=6)))], + ) + yield Case( + Annotated[datetime, at.Timezone('Europe/London')], + [datetime(2000, 1, 1, tzinfo=timezone(timedelta(0), name='Europe/London'))], + [datetime(2000, 1, 1), datetime(2000, 1, 1, tzinfo=timezone(timedelta(hours=6)))], + ) + + # Quantity + + yield Case(Annotated[float, at.Unit(unit='m')], (5, 4.2), ('5m', '4.2m')) + + # predicate types + + yield Case(at.LowerCase[str], ['abc', 'foobar'], ['', 'A', 'Boom']) + yield Case(at.UpperCase[str], ['ABC', 'DEFO'], ['', 'a', 'abc', 'AbC']) + yield Case(at.IsDigit[str], ['123'], ['', 'ab', 'a1b2']) + yield Case(at.IsAscii[str], ['123', 'foo bar'], ['£100', '😊', 'whatever 👀']) + + yield Case(Annotated[int, at.Predicate(lambda x: x % 2 == 0)], [0, 2, 4], [1, 3, 5]) + + yield Case(at.IsFinite[float], [1.23], [math.nan, math.inf, -math.inf]) + yield Case(at.IsNotFinite[float], [math.nan, math.inf], [1.23]) + yield Case(at.IsNan[float], [math.nan], [1.23, math.inf]) + yield Case(at.IsNotNan[float], [1.23, math.inf], [math.nan]) + yield Case(at.IsInfinite[float], [math.inf], [math.nan, 1.23]) + yield Case(at.IsNotInfinite[float], [math.nan, 1.23], [math.inf]) + + # check stacked predicates + yield Case(at.IsInfinite[Annotated[float, at.Predicate(lambda x: x > 0)]], [math.inf], [-math.inf, 1.23, math.nan]) + + # doc + yield Case(Annotated[int, at.doc("A number")], [1, 2], []) + + # custom GroupedMetadata + class MyCustomGroupedMetadata(at.GroupedMetadata): + def __iter__(self) -> Iterator[at.Predicate]: + yield at.Predicate(lambda x: float(x).is_integer()) + + yield Case(Annotated[float, MyCustomGroupedMetadata()], [0, 2.0], [0.01, 1.5]) diff --git a/venv/lib/python3.11/site-packages/anyio-4.12.1.dist-info/INSTALLER b/venv/lib/python3.11/site-packages/anyio-4.12.1.dist-info/INSTALLER new file mode 100644 index 0000000..a1b589e --- /dev/null +++ b/venv/lib/python3.11/site-packages/anyio-4.12.1.dist-info/INSTALLER @@ -0,0 +1 @@ +pip diff --git a/venv/lib/python3.11/site-packages/anyio-4.12.1.dist-info/METADATA b/venv/lib/python3.11/site-packages/anyio-4.12.1.dist-info/METADATA new file mode 100644 index 0000000..dbeb198 --- /dev/null +++ b/venv/lib/python3.11/site-packages/anyio-4.12.1.dist-info/METADATA @@ -0,0 +1,96 @@ +Metadata-Version: 2.4 +Name: anyio +Version: 4.12.1 +Summary: High-level concurrency and networking framework on top of asyncio or Trio +Author-email: Alex Grönholm +License-Expression: MIT +Project-URL: Documentation, https://anyio.readthedocs.io/en/latest/ +Project-URL: Changelog, https://anyio.readthedocs.io/en/stable/versionhistory.html +Project-URL: Source code, https://github.com/agronholm/anyio +Project-URL: Issue tracker, https://github.com/agronholm/anyio/issues +Classifier: Development Status :: 5 - Production/Stable +Classifier: Intended Audience :: Developers +Classifier: Framework :: AnyIO +Classifier: Typing :: Typed +Classifier: Programming Language :: Python +Classifier: Programming Language :: Python :: 3 +Classifier: Programming Language :: Python :: 3.9 +Classifier: Programming Language :: Python :: 3.10 +Classifier: Programming Language :: Python :: 3.11 +Classifier: Programming Language :: Python :: 3.12 +Classifier: Programming Language :: Python :: 3.13 +Classifier: Programming Language :: Python :: 3.14 +Requires-Python: >=3.9 +Description-Content-Type: text/x-rst +License-File: LICENSE +Requires-Dist: exceptiongroup>=1.0.2; python_version < "3.11" +Requires-Dist: idna>=2.8 +Requires-Dist: typing_extensions>=4.5; python_version < "3.13" +Provides-Extra: trio +Requires-Dist: trio>=0.32.0; python_version >= "3.10" and extra == "trio" +Requires-Dist: trio>=0.31.0; python_version < "3.10" and extra == "trio" +Dynamic: license-file + +.. image:: https://github.com/agronholm/anyio/actions/workflows/test.yml/badge.svg + :target: https://github.com/agronholm/anyio/actions/workflows/test.yml + :alt: Build Status +.. image:: https://coveralls.io/repos/github/agronholm/anyio/badge.svg?branch=master + :target: https://coveralls.io/github/agronholm/anyio?branch=master + :alt: Code Coverage +.. image:: https://readthedocs.org/projects/anyio/badge/?version=latest + :target: https://anyio.readthedocs.io/en/latest/?badge=latest + :alt: Documentation +.. image:: https://badges.gitter.im/gitterHQ/gitter.svg + :target: https://gitter.im/python-trio/AnyIO + :alt: Gitter chat + +AnyIO is an asynchronous networking and concurrency library that works on top of either asyncio_ or +Trio_. It implements Trio-like `structured concurrency`_ (SC) on top of asyncio and works in harmony +with the native SC of Trio itself. + +Applications and libraries written against AnyIO's API will run unmodified on either asyncio_ or +Trio_. AnyIO can also be adopted into a library or application incrementally – bit by bit, no full +refactoring necessary. It will blend in with the native libraries of your chosen backend. + +To find out why you might want to use AnyIO's APIs instead of asyncio's, you can read about it +`here `_. + +Documentation +------------- + +View full documentation at: https://anyio.readthedocs.io/ + +Features +-------- + +AnyIO offers the following functionality: + +* Task groups (nurseries_ in trio terminology) +* High-level networking (TCP, UDP and UNIX sockets) + + * `Happy eyeballs`_ algorithm for TCP connections (more robust than that of asyncio on Python + 3.8) + * async/await style UDP sockets (unlike asyncio where you still have to use Transports and + Protocols) + +* A versatile API for byte streams and object streams +* Inter-task synchronization and communication (locks, conditions, events, semaphores, object + streams) +* Worker threads +* Subprocesses +* Subinterpreter support for code parallelization (on Python 3.13 and later) +* Asynchronous file I/O (using worker threads) +* Signal handling +* Asynchronous version of the functools_ module + +AnyIO also comes with its own pytest_ plugin which also supports asynchronous fixtures. +It even works with the popular Hypothesis_ library. + +.. _asyncio: https://docs.python.org/3/library/asyncio.html +.. _Trio: https://github.com/python-trio/trio +.. _structured concurrency: https://en.wikipedia.org/wiki/Structured_concurrency +.. _nurseries: https://trio.readthedocs.io/en/stable/reference-core.html#nurseries-and-spawning +.. _Happy eyeballs: https://en.wikipedia.org/wiki/Happy_Eyeballs +.. _pytest: https://docs.pytest.org/en/latest/ +.. _functools: https://docs.python.org/3/library/functools.html +.. _Hypothesis: https://hypothesis.works/ diff --git a/venv/lib/python3.11/site-packages/anyio-4.12.1.dist-info/RECORD b/venv/lib/python3.11/site-packages/anyio-4.12.1.dist-info/RECORD new file mode 100644 index 0000000..85f5c76 --- /dev/null +++ b/venv/lib/python3.11/site-packages/anyio-4.12.1.dist-info/RECORD @@ -0,0 +1,92 @@ +anyio-4.12.1.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 +anyio-4.12.1.dist-info/METADATA,sha256=DfiDab9Tmmcfy802lOLTMEHJQShkOSbopCwqCYbLuJk,4277 +anyio-4.12.1.dist-info/RECORD,, +anyio-4.12.1.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91 +anyio-4.12.1.dist-info/entry_points.txt,sha256=_d6Yu6uiaZmNe0CydowirE9Cmg7zUL2g08tQpoS3Qvc,39 +anyio-4.12.1.dist-info/licenses/LICENSE,sha256=U2GsncWPLvX9LpsJxoKXwX8ElQkJu8gCO9uC6s8iwrA,1081 +anyio-4.12.1.dist-info/top_level.txt,sha256=QglSMiWX8_5dpoVAEIHdEYzvqFMdSYWmCj6tYw2ITkQ,6 +anyio/__init__.py,sha256=7iDVqMUprUuKNY91FuoKqayAhR-OY136YDPI6P78HHk,6170 +anyio/__pycache__/__init__.cpython-311.pyc,, +anyio/__pycache__/from_thread.cpython-311.pyc,, +anyio/__pycache__/functools.cpython-311.pyc,, +anyio/__pycache__/lowlevel.cpython-311.pyc,, +anyio/__pycache__/pytest_plugin.cpython-311.pyc,, +anyio/__pycache__/to_interpreter.cpython-311.pyc,, +anyio/__pycache__/to_process.cpython-311.pyc,, +anyio/__pycache__/to_thread.cpython-311.pyc,, +anyio/_backends/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +anyio/_backends/__pycache__/__init__.cpython-311.pyc,, +anyio/_backends/__pycache__/_asyncio.cpython-311.pyc,, +anyio/_backends/__pycache__/_trio.cpython-311.pyc,, +anyio/_backends/_asyncio.py,sha256=xG6qv60mgGnL0mK82dxjH2b8hlkMlJ-x2BqIq3qv70Y,98863 +anyio/_backends/_trio.py,sha256=30Rctb7lm8g63ZHljVPVnj5aH-uK6oQvphjwUBoAzuI,41456 +anyio/_core/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +anyio/_core/__pycache__/__init__.cpython-311.pyc,, +anyio/_core/__pycache__/_asyncio_selector_thread.cpython-311.pyc,, +anyio/_core/__pycache__/_contextmanagers.cpython-311.pyc,, +anyio/_core/__pycache__/_eventloop.cpython-311.pyc,, +anyio/_core/__pycache__/_exceptions.cpython-311.pyc,, +anyio/_core/__pycache__/_fileio.cpython-311.pyc,, +anyio/_core/__pycache__/_resources.cpython-311.pyc,, +anyio/_core/__pycache__/_signals.cpython-311.pyc,, +anyio/_core/__pycache__/_sockets.cpython-311.pyc,, +anyio/_core/__pycache__/_streams.cpython-311.pyc,, +anyio/_core/__pycache__/_subprocesses.cpython-311.pyc,, +anyio/_core/__pycache__/_synchronization.cpython-311.pyc,, +anyio/_core/__pycache__/_tasks.cpython-311.pyc,, +anyio/_core/__pycache__/_tempfile.cpython-311.pyc,, +anyio/_core/__pycache__/_testing.cpython-311.pyc,, +anyio/_core/__pycache__/_typedattr.cpython-311.pyc,, +anyio/_core/_asyncio_selector_thread.py,sha256=2PdxFM3cs02Kp6BSppbvmRT7q7asreTW5FgBxEsflBo,5626 +anyio/_core/_contextmanagers.py,sha256=YInBCabiEeS-UaP_Jdxa1CaFC71ETPW8HZTHIM8Rsc8,7215 +anyio/_core/_eventloop.py,sha256=c2EdcBX-xnKwxPcC4Pjn3_qG9I-x4IWFO2R9RqCGjM4,6448 +anyio/_core/_exceptions.py,sha256=Y3aq-Wxd7Q2HqwSg7nZPvRsHEuGazv_qeet6gqEBdPk,4407 +anyio/_core/_fileio.py,sha256=uc7t10Vb-If7GbdWM_zFf-ajUe6uek63fSt7IBLlZW0,25731 +anyio/_core/_resources.py,sha256=NbmU5O5UX3xEyACnkmYX28Fmwdl-f-ny0tHym26e0w0,435 +anyio/_core/_signals.py,sha256=mjTBB2hTKNPRlU0IhnijeQedpWOGERDiMjSlJQsFrug,1016 +anyio/_core/_sockets.py,sha256=RBXHcUqZt5gg_-OOfgHVv8uq2FSKk1uVUzTdpjBoI1o,34977 +anyio/_core/_streams.py,sha256=FczFwIgDpnkK0bODWJXMpsUJYdvAD04kaUaGzJU8DK0,1806 +anyio/_core/_subprocesses.py,sha256=EXm5igL7dj55iYkPlbYVAqtbqxJxjU-6OndSTIx9SRg,8047 +anyio/_core/_synchronization.py,sha256=MgVVqFzvt580tHC31LiOcq1G6aryut--xRG4Ff8KwxQ,20869 +anyio/_core/_tasks.py,sha256=pVB7K6AAulzUM8YgXAeqNZG44nSyZ1bYJjH8GznC00I,5435 +anyio/_core/_tempfile.py,sha256=lHb7CW4FyIlpkf5ADAf4VmLHCKwEHF9nxqNyBCFFUiA,19697 +anyio/_core/_testing.py,sha256=u7MPqGXwpTxqI7hclSdNA30z2GH1Nw258uwKvy_RfBg,2340 +anyio/_core/_typedattr.py,sha256=P4ozZikn3-DbpoYcvyghS_FOYAgbmUxeoU8-L_07pZM,2508 +anyio/abc/__init__.py,sha256=6mWhcl_pGXhrgZVHP_TCfMvIXIOp9mroEFM90fYCU_U,2869 +anyio/abc/__pycache__/__init__.cpython-311.pyc,, +anyio/abc/__pycache__/_eventloop.cpython-311.pyc,, +anyio/abc/__pycache__/_resources.cpython-311.pyc,, +anyio/abc/__pycache__/_sockets.cpython-311.pyc,, +anyio/abc/__pycache__/_streams.cpython-311.pyc,, +anyio/abc/__pycache__/_subprocesses.cpython-311.pyc,, +anyio/abc/__pycache__/_tasks.cpython-311.pyc,, +anyio/abc/__pycache__/_testing.cpython-311.pyc,, +anyio/abc/_eventloop.py,sha256=GlzgB3UJGgG6Kr7olpjOZ-o00PghecXuofVDQ_5611Q,10749 +anyio/abc/_resources.py,sha256=DrYvkNN1hH6Uvv5_5uKySvDsnknGVDe8FCKfko0VtN8,783 +anyio/abc/_sockets.py,sha256=ECTY0jLEF18gryANHR3vFzXzGdZ-xPwELq1QdgOb0Jo,13258 +anyio/abc/_streams.py,sha256=005GKSCXGprxnhucILboSqc2JFovECZk9m3p-qqxXVc,7640 +anyio/abc/_subprocesses.py,sha256=cumAPJTktOQtw63IqG0lDpyZqu_l1EElvQHMiwJgL08,2067 +anyio/abc/_tasks.py,sha256=KC7wrciE48AINOI-AhPutnFhe1ewfP7QnamFlDzqesQ,3721 +anyio/abc/_testing.py,sha256=tBJUzkSfOXJw23fe8qSJ03kJlShOYjjaEyFB6k6MYT8,1821 +anyio/from_thread.py,sha256=L-0w1HxJ6BSb-KuVi57k5Tkc3yzQrx3QK5tAxMPcY-0,19141 +anyio/functools.py,sha256=HWj7GBEmc0Z-mZg3uok7Z7ZJn0rEC_0Pzbt0nYUDaTQ,10973 +anyio/lowlevel.py,sha256=AyKLVK3LaWSoK39LkCKxE4_GDMLKZBNqTrLUgk63y80,5158 +anyio/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +anyio/pytest_plugin.py,sha256=3jAFQn0jv_pyoWE2GBBlHaj9sqXj4e8vob0_hgrsXE8,10244 +anyio/streams/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +anyio/streams/__pycache__/__init__.cpython-311.pyc,, +anyio/streams/__pycache__/buffered.cpython-311.pyc,, +anyio/streams/__pycache__/file.cpython-311.pyc,, +anyio/streams/__pycache__/memory.cpython-311.pyc,, +anyio/streams/__pycache__/stapled.cpython-311.pyc,, +anyio/streams/__pycache__/text.cpython-311.pyc,, +anyio/streams/__pycache__/tls.cpython-311.pyc,, +anyio/streams/buffered.py,sha256=2R3PeJhe4EXrdYqz44Y6-Eg9R6DrmlsYrP36Ir43-po,6263 +anyio/streams/file.py,sha256=4WZ7XGz5WNu39FQHvqbe__TQ0HDP9OOhgO1mk9iVpVU,4470 +anyio/streams/memory.py,sha256=F0zwzvFJKAhX_LRZGoKzzqDC2oMM-f-yyTBrEYEGOaU,10740 +anyio/streams/stapled.py,sha256=T8Xqwf8K6EgURPxbt1N4i7A8BAk-gScv-GRhjLXIf_o,4390 +anyio/streams/text.py,sha256=BcVAGJw1VRvtIqnv-o0Rb0pwH7p8vwlvl21xHq522ag,5765 +anyio/streams/tls.py,sha256=Jpxy0Mfbcp1BxHCwE-YjSSFaLnIBbnnwur-excYThs4,15368 +anyio/to_interpreter.py,sha256=_mLngrMy97TMR6VbW4Y6YzDUk9ZuPcQMPlkuyRh3C9k,7100 +anyio/to_process.py,sha256=J7gAA_YOuoHqnpDAf5fm1Qu6kOmTzdFbiDNvnV755vk,9798 +anyio/to_thread.py,sha256=menEgXYmUV7Fjg_9WqCV95P9MAtQS8BzPGGcWB_QnfQ,2687 diff --git a/venv/lib/python3.11/site-packages/anyio-4.12.1.dist-info/WHEEL b/venv/lib/python3.11/site-packages/anyio-4.12.1.dist-info/WHEEL new file mode 100644 index 0000000..e7fa31b --- /dev/null +++ b/venv/lib/python3.11/site-packages/anyio-4.12.1.dist-info/WHEEL @@ -0,0 +1,5 @@ +Wheel-Version: 1.0 +Generator: setuptools (80.9.0) +Root-Is-Purelib: true +Tag: py3-none-any + diff --git a/venv/lib/python3.11/site-packages/anyio-4.12.1.dist-info/entry_points.txt b/venv/lib/python3.11/site-packages/anyio-4.12.1.dist-info/entry_points.txt new file mode 100644 index 0000000..44dd9bd --- /dev/null +++ b/venv/lib/python3.11/site-packages/anyio-4.12.1.dist-info/entry_points.txt @@ -0,0 +1,2 @@ +[pytest11] +anyio = anyio.pytest_plugin diff --git a/venv/lib/python3.11/site-packages/anyio-4.12.1.dist-info/licenses/LICENSE b/venv/lib/python3.11/site-packages/anyio-4.12.1.dist-info/licenses/LICENSE new file mode 100644 index 0000000..104eebf --- /dev/null +++ b/venv/lib/python3.11/site-packages/anyio-4.12.1.dist-info/licenses/LICENSE @@ -0,0 +1,20 @@ +The MIT License (MIT) + +Copyright (c) 2018 Alex Grönholm + +Permission is hereby granted, free of charge, to any person obtaining a copy of +this software and associated documentation files (the "Software"), to deal in +the Software without restriction, including without limitation the rights to +use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of +the Software, and to permit persons to whom the Software is furnished to do so, +subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS +FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR +COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER +IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/venv/lib/python3.11/site-packages/anyio-4.12.1.dist-info/top_level.txt b/venv/lib/python3.11/site-packages/anyio-4.12.1.dist-info/top_level.txt new file mode 100644 index 0000000..c77c069 --- /dev/null +++ b/venv/lib/python3.11/site-packages/anyio-4.12.1.dist-info/top_level.txt @@ -0,0 +1 @@ +anyio diff --git a/venv/lib/python3.11/site-packages/anyio/__init__.py b/venv/lib/python3.11/site-packages/anyio/__init__.py new file mode 100644 index 0000000..d23c5a5 --- /dev/null +++ b/venv/lib/python3.11/site-packages/anyio/__init__.py @@ -0,0 +1,111 @@ +from __future__ import annotations + +from ._core._contextmanagers import AsyncContextManagerMixin as AsyncContextManagerMixin +from ._core._contextmanagers import ContextManagerMixin as ContextManagerMixin +from ._core._eventloop import current_time as current_time +from ._core._eventloop import get_all_backends as get_all_backends +from ._core._eventloop import get_available_backends as get_available_backends +from ._core._eventloop import get_cancelled_exc_class as get_cancelled_exc_class +from ._core._eventloop import run as run +from ._core._eventloop import sleep as sleep +from ._core._eventloop import sleep_forever as sleep_forever +from ._core._eventloop import sleep_until as sleep_until +from ._core._exceptions import BrokenResourceError as BrokenResourceError +from ._core._exceptions import BrokenWorkerInterpreter as BrokenWorkerInterpreter +from ._core._exceptions import BrokenWorkerProcess as BrokenWorkerProcess +from ._core._exceptions import BusyResourceError as BusyResourceError +from ._core._exceptions import ClosedResourceError as ClosedResourceError +from ._core._exceptions import ConnectionFailed as ConnectionFailed +from ._core._exceptions import DelimiterNotFound as DelimiterNotFound +from ._core._exceptions import EndOfStream as EndOfStream +from ._core._exceptions import IncompleteRead as IncompleteRead +from ._core._exceptions import NoEventLoopError as NoEventLoopError +from ._core._exceptions import RunFinishedError as RunFinishedError +from ._core._exceptions import TypedAttributeLookupError as TypedAttributeLookupError +from ._core._exceptions import WouldBlock as WouldBlock +from ._core._fileio import AsyncFile as AsyncFile +from ._core._fileio import Path as Path +from ._core._fileio import open_file as open_file +from ._core._fileio import wrap_file as wrap_file +from ._core._resources import aclose_forcefully as aclose_forcefully +from ._core._signals import open_signal_receiver as open_signal_receiver +from ._core._sockets import TCPConnectable as TCPConnectable +from ._core._sockets import UNIXConnectable as UNIXConnectable +from ._core._sockets import as_connectable as as_connectable +from ._core._sockets import connect_tcp as connect_tcp +from ._core._sockets import connect_unix as connect_unix +from ._core._sockets import create_connected_udp_socket as create_connected_udp_socket +from ._core._sockets import ( + create_connected_unix_datagram_socket as create_connected_unix_datagram_socket, +) +from ._core._sockets import create_tcp_listener as create_tcp_listener +from ._core._sockets import create_udp_socket as create_udp_socket +from ._core._sockets import create_unix_datagram_socket as create_unix_datagram_socket +from ._core._sockets import create_unix_listener as create_unix_listener +from ._core._sockets import getaddrinfo as getaddrinfo +from ._core._sockets import getnameinfo as getnameinfo +from ._core._sockets import notify_closing as notify_closing +from ._core._sockets import wait_readable as wait_readable +from ._core._sockets import wait_socket_readable as wait_socket_readable +from ._core._sockets import wait_socket_writable as wait_socket_writable +from ._core._sockets import wait_writable as wait_writable +from ._core._streams import create_memory_object_stream as create_memory_object_stream +from ._core._subprocesses import open_process as open_process +from ._core._subprocesses import run_process as run_process +from ._core._synchronization import CapacityLimiter as CapacityLimiter +from ._core._synchronization import ( + CapacityLimiterStatistics as CapacityLimiterStatistics, +) +from ._core._synchronization import Condition as Condition +from ._core._synchronization import ConditionStatistics as ConditionStatistics +from ._core._synchronization import Event as Event +from ._core._synchronization import EventStatistics as EventStatistics +from ._core._synchronization import Lock as Lock +from ._core._synchronization import LockStatistics as LockStatistics +from ._core._synchronization import ResourceGuard as ResourceGuard +from ._core._synchronization import Semaphore as Semaphore +from ._core._synchronization import SemaphoreStatistics as SemaphoreStatistics +from ._core._tasks import TASK_STATUS_IGNORED as TASK_STATUS_IGNORED +from ._core._tasks import CancelScope as CancelScope +from ._core._tasks import create_task_group as create_task_group +from ._core._tasks import current_effective_deadline as current_effective_deadline +from ._core._tasks import fail_after as fail_after +from ._core._tasks import move_on_after as move_on_after +from ._core._tempfile import NamedTemporaryFile as NamedTemporaryFile +from ._core._tempfile import SpooledTemporaryFile as SpooledTemporaryFile +from ._core._tempfile import TemporaryDirectory as TemporaryDirectory +from ._core._tempfile import TemporaryFile as TemporaryFile +from ._core._tempfile import gettempdir as gettempdir +from ._core._tempfile import gettempdirb as gettempdirb +from ._core._tempfile import mkdtemp as mkdtemp +from ._core._tempfile import mkstemp as mkstemp +from ._core._testing import TaskInfo as TaskInfo +from ._core._testing import get_current_task as get_current_task +from ._core._testing import get_running_tasks as get_running_tasks +from ._core._testing import wait_all_tasks_blocked as wait_all_tasks_blocked +from ._core._typedattr import TypedAttributeProvider as TypedAttributeProvider +from ._core._typedattr import TypedAttributeSet as TypedAttributeSet +from ._core._typedattr import typed_attribute as typed_attribute + +# Re-export imports so they look like they live directly in this package +for __value in list(locals().values()): + if getattr(__value, "__module__", "").startswith("anyio."): + __value.__module__ = __name__ + + +del __value + + +def __getattr__(attr: str) -> type[BrokenWorkerInterpreter]: + """Support deprecated aliases.""" + if attr == "BrokenWorkerIntepreter": + import warnings + + warnings.warn( + "The 'BrokenWorkerIntepreter' alias is deprecated, use 'BrokenWorkerInterpreter' instead.", + DeprecationWarning, + stacklevel=2, + ) + return BrokenWorkerInterpreter + + raise AttributeError(f"module {__name__!r} has no attribute {attr!r}") diff --git a/venv/lib/python3.11/site-packages/anyio/__pycache__/__init__.cpython-311.pyc b/venv/lib/python3.11/site-packages/anyio/__pycache__/__init__.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..6f4d0e6f5895fa7db0bd4a408aa641c93862a265 GIT binary patch literal 6049 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 ZcwN=~Z)mroZm+T~b}zQa{+rU(^dD1`K7;@O literal 0 HcmV?d00001 diff --git a/venv/lib/python3.11/site-packages/anyio/__pycache__/from_thread.cpython-311.pyc b/venv/lib/python3.11/site-packages/anyio/__pycache__/from_thread.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..b4b860abdd8113a2494b16f027e6890e926e1a38 GIT binary patch literal 27964 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 mdtI{c5!wE1=X*D>_!ycnRyuL79v`2PScD;3QE literal 0 HcmV?d00001 diff --git a/venv/lib/python3.11/site-packages/anyio/__pycache__/functools.cpython-311.pyc b/venv/lib/python3.11/site-packages/anyio/__pycache__/functools.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..71967bdec3e0621d46e1e8dc84ffe1a4ab7dd5be GIT binary patch literal 17204 zcmcILZEzdcad)@_a3DYeB)~863;Ym2B#IP8S(d4Ff~?tSj=dvAB&zIT6FUS3AQ^$)dggqF8Z)W73P?&8z{{kW5% zsGHPF6i@MVn2OLonx=S@&jjyGnDH^>$@*A$vSD+?;HlHn0<|~WX zefEgM=ZKX1%1OE<%tR`D6(np8J0mWii-fswWu(ei6>CX z&Q}+y_tlepw(zD%gRcR?WxPGy7-{k~k+37&9BJ{jM7%yPO$qF4tvQ1D@~dVHi&ns{ z0$OSFwb4}6Lf+cdHxnh)@Xiltiuw@#>gDSov96-n%@EthR~E%~LTn3PRTSIByM=DP zYA;l1qK;9#=NiRVe_(=E;IFmP10{PtfR_(*QIu~BUk&AI^m4UOu1@fL06p>{{MF01 zmDE`eX`6)VqO@L;)&OaZf?MdQ&lRGI@@*69NX{n6*$g>5g^qF4dbx|R>?0*xprm)h zHu{Bn{y4w+8e3F;JH(&hyG!Hwll<0etPj(B$#2^&h9BW~Ub7U{FhFX4rlbapKf&)R zjki(!DgIf0H~g^9QGU-gs}FOZ<`0(S-U0Dv_~A9;w~W*L3;grf%)T8wbC&9P@pI&F z53Se((P%6lh=*cPsmG#J9F(S`!NY;z72$YvJf?W^?`HyHAR@#CQPN^ZUVMpUJSPSw zCInG22eFu93yYI}HE0n9eljSGVmqfrUVzu(P%sYdl#_aoLv4XeVJLHODiDg3Aa^(r z4y%!eV`6MF9*PPI_k2LQq9*6cK%Etn6MP^p_@`6^AjTb%g1JKDlhGiO)x#;w!RWMN zJtjm2F%(qFMu84~Y;pn{9-E#}ky5M}d^sR0Y%n0j74vu~8VD;~>@tBhXUbKAxR2FFC)3VUPSzYH=$)AHI2ri!Ued3fU$mQLWX`^0Z}(8f%4Hj1)`OP z!DLe0Yt%j3!zi5J9|dOn{YshNABpjkVGKL`{?{i1VKwCr^%xsj9qYdmiwONw0Wltk z2Kpn@2PY=_FNMNkKy_OrIMM%x5PhRR9JO^DHtv7$Wv zploP?;Y}#`NQfaJ7UIl$oP~s}z$s2-A)~^;xKP+Dp}3@2urWbeErTfN2IReBjRfA5 zLNhSzgOj3&q0u|6*n^0I?xV!5SclW^FPOT1zu1dOgql7KVM7EQfPnNYfIQ`MRE8~| zJ3e>(t>YQiId^jIFb{%)Vu@XPO$f$=+5iM} zP&HE&ywi`{AaIjP&yNuuBtM|^c*DErc+Th`whac$!1(Zd6 zQjC%@8`SZKB09A=UVvKaHF&C5vM^sRk}~Stvy?atNj)a<2s}VEqm}}c$76SB@fbu& zScyuEcoKp$jV0XZ%NKe9OVj`WN}TTNUwi26e&Fm*Ik%*pTV!ra!FVdf?RQIqOGRfw z*T~`sVpTxLDALik9v%6DVggs3B#}At8+bpj$Y{^@@jF+XJpG#dV~)4mo#g z{eWz5%hY!*dTuo@dF1-t_i6y(?Jl_;yH~2)7shV9njC)rv|N4U9uGjhKN;78&LeWs z%^e{;AMIgP@$nUCp2!gK5QOfS#N!yj7KD-Wx%kr%?y;yuV}B9KNzbX}u-ibV8a1Q% zJm$oSEaEH>aqx&QAt=(2`!NmynLJ;Ez?}ZenoQ>QEM){7ZQh!tjKD&h2QaP>K-^}G zD+CtSe3Z^o8$nfcAVNX->lX@Jxah~ou>w`pL{t#NH}iI)idy(`qKdq{lc=Irz8X~# zEFjwWcD@lze~zyKwbUV6pdy7uJ888(XKkN9114n72tPk|;Q~?2s*2tN`NbgwsLO-c zL%9ok4iKat--ST2CgM>q>2rjFnf5~xXz4%feGcY1#*${dfN#G z(vT2xC0KaVYl~Or;-Oy9j>dXb;d93{Dk3sHHpQOPgFM)#W5X&1}IQXg_03F)3laBpes-u64I*x z=BR81)d(sy&DCW#HGmE+%QQB@!;#s#L*BaoHnVsv`NDh7Th2x2r^66mo@s7@M@6Ov zGutz5gIKm@nX6fdFOH?Swlvo!=WcZj>XXtS6Or4buW?%4q~dzdB9{wfA@y3mm#NpZ z;Y;%9efa@|KGffGs=%xot!T=K7ZF@SfRvYL1fr)~*5p`TRZCD(Y6dVzEjybQ`CG3o zb=>X!g#EknPviH$mU6zFcD^igFRL_Tml()J^a!~qHjHM+dgSu-EnHliM(;31Jq{6s z7#`{p1q4Ls6l?6w8&H&2+HXL4sTIH+wNl$~V>VM=f8%_nb#uCPch<_f%0SEzU@KEe zLovEGX^W5oJqa*(t!+{9l+jQ0COu1w+Y)qA@9A85d?r8#mdrW&O_T=uXdrLMVsb%> zKC{s@Am+gZNCN5K2@i$2EW{ONA~qrBM+XiJut)E9i?Um zPhTYr7r~`x7=vq?AG07L-=y=CkvGkh!$2_k^-fE`XidGt^{CYVP2C3m7tD`deCq{A!CfDqfYZCrMn;`FAyBta;WP-Q7;baebg&9k5=f zsd(N)S%k~1+0X{?tMp2kjr^dguToKVih7gzDm6vhsDwE|u=$$*07lNNb(V|nEUCW>>eu_2qT(o?voEyS5{<)>E5RCDqH)gXn24S@+Kt*}?8QPO z9_ZSd%LR0yGSIGs)i~Z^E^#}lcff4PEdZcJ1OIqB&r9IBwUA?zlo)`rkfLoK)B<1Xa_NOn-g=iS=1kN@+ScpSxva-LrNm))D&LdQq2FEKJ#8<{GGOtN zpRsq|fo-6CzeFqBsR61mPGYA_>U_f4MZ*uJV~gok=mk|5eRAC(+)3%SXEFF*{jGZSy$}+u^?M*vd>xPgb&W=u z!n^@k7LX`TLhP3(?z>Q`khp4VxWjuF~L3(i(Q?Z zI3kKMQEX7lg5AQwo`D*N8boYDKx{y?WfXe^wix{Jm|uwUB8q4cXDx9_5ZhO=g4u(u z_t=Vj0E(GlpfFd3X<`8>nioZg#>HvHK`de3uV!LlXk3+0sl&2Ey@>ygEREM)e5m8< zZ73!E2iR`vAX)*>!M??V5A02{y(zP4%VI}*)0U-SdDEVIM*-mNDZb~AWE`&fk?SLi z2UCtF3}oDO^CMXcgZkK;hCx%OapWerrm=n$Kd?ojI$b6;^mOj<-YBd zYkNLAq7I2q-}u$+&u4%3_4{9k_te0-G{D|->E3gx+H)z_xdkT6vbHYWC`@^J(w?6A zBlAbTSaxngT)XmM*|Rz2=}LRL=8r5p8Xh`Y9ynT(=9Hr|?dX(qH`;|=UwrXJmSb$Y zGMieG?5(ZyC+AN>eYJq1ZC4&FcMskvzgsRlo|!+nxH-wbw{;PISq3tZ3OL)2Ol$Ab z*>vkb%F#SOve>cMp;lwD?Z{F&@EZ$N>0Netl6<;zpWL=jcI{8O_NQI@vu3KH1$fU< z-rl7#xn%&FVN#ApncUfOr~un>QP5+1R{)&2eqyop-P8EYIBFj{+8;RDlZR7|?zE#@ zc65UuH0|s}KDRH|c)t_A5tdzTrT2fjYj4wwdsFW2v>S`9xPfq|t?wzoig)YM;k0-A zy~?zAP<9P2IR4%#JCDJgad{RTHylYiE^zBtlWIy6AJ*m>x%CMbEds} zsUx{(!M=DnV>i!Ws8CDIPsZrH9T~6J#cj`F)3GX+SMz&dY9`OZ@-Xq zr0TY%>$WYJW!JWBi-84?kRwl?k}XfcxwW!j=dRU48|A8=cSyMU|Andka3l4L#vQ|z z%zYP)u$migrtUX44ew{}@1p_!(qunULH)9#@5lk>m-}geziK_S=R`mA>;AG6&sl%H zmj*bR_x35~*c9x*uG&%8X?tC(o)WJvIG+rg9k@s&>+mxWD0Vv(J9lQ8xW2@Mg($3m z^6MX?J)r7$)zQijHz4uah$#HQTS-=x2O%uZBRBv+LQGI{s{0;RzaJK*;BsAaCkGri zB=sM$AR3T!6wF6=M{;st(gAhOk#vr82B$BE%iSSVG~udZuq+y6vgGs@Jg~ zn#JmRw+}zAywg+7}_7CHBl(sv#Za)WE9i@W(u~l5l{t+)J+F9h%4Nfrx@3}#a z8?a*DHHj_hgIx7Y))(WcdnNxFGHV{TOdWa|%Zt2>GS>pP%3U1JtL=pjXZ?VOeuM!x zKQEB6y1HpCQy1OTARmyV99cAkiG0A`y9t)R=1wGI5_S^EOvbhi1}AO^%&bM2YVo8o zzYPGmTP;*)Px36GVb!IhukF;Xw&c$n`19vDv|V15WlxQ(_@`eI$$vE$PLnY*3R;4Y zh6`79_77nQ{VznRz=0E@esKM$>W=R~C>MJ}kNqBmK$0M-B6^e6yzgPGWla^b2{YmB zE7lp`!Z-x~1b^vm00lb3#F%%Y%r69Gl%)dq>3V>A4Lo8X?%FGAET^S|foU?Updh_3 z%W>v2pmR2Ys^B7+t-%elN=EU6*T!OqCfqFCp+{FQS+so)fycV2Y1^E1tF00qBYU5| z84)$@nvMK7CSa4W?|XdYGqs5VDWT2(LXoh(;1IEU4Op=dK_)v6r<)*}3;iEFeb;21 zT#2IX1ek2h%y-LB?Hu$5V^KKj6@oRaSGp1tKVHdlDu%ouL#}%o@u-y#-g!F$t%E`A6CRzeLR+{RG+`AyvY)JE)5)%F+JK=N89cYdvLeOWWI$J5%=Vw7pwqyGhUXiC3_) z^`_ryb+Nid?U+A}hvIOWP%?Dp#+4TjF~S%GW+*2n zA@Dn^(GE4{2JNXcpQ$SN^EqhZ=;}UQb*(>63rBN)fa5S(9sB?2IjDE-E<(;}+@o~; zcON2g`*5zYa8kt4EYPm{TmVmUnG%fg#PeAyUa9i?3x zw_4l|PSL=h0deXqjT$EvoRO8_M65S9UOJ=l6IPp=$H%<^Z{d_Avk!~Ie4PluaY!DH ztirs-6L5S$11k;5T@_u}a_A;4=*4w21MZ^=gekT*0A z5@bxA1j*6s6@ZRuZxDQ`C>sz3)rF=SK8WEI97y$E5(p+Jt}ai)8LVhrfEJ;|bVvyE zD8S-kOs@he1z8i0#U{J~cnaWX^v2+1pDL&N`n+)dS{NDvTMQNgKtL4eMOU3SAPU|H zoQ1s%l|$13FC4PoR#4lefE1E60!L@s5#8~S2(^R%crt>GMke9y5>lZasfHs7M3=c? z2*BY|Eml1QtvV>%AqCVqQFcT?t+z1Hr@a#=X#k3W=4PdiffV`=*_nLS42ielAH=_*`q*sM0|vf%t!ulFn*gEpLGfy0#AIrG)# z<67waSv>Sigg`+Q@jK)uCQjsc(6^6HTh+I3TwB1ItRF*?_!9(w1;8kCQKgFr`jA7o zucvxXvkuDUm}dwzMW~Mzqh5gUSSiA5EG{-i*px@uV3+EsK3jxpSpllGV<`7Z&ycSk zFtERbhC(U4X8)`n(7S*TslTn!M{985tm-bxbsNfE!iE2V7_HlAa0_8~YFC0Tl)gr{ zkof)ePBnZ0r9aG7ft%Wnzu};`_H08Faj99_8@*r%v zR^%&yE!|4knyk#n!1g=P_@PcGZ+hF5+ag{UFH>y5jp=to6-);DQk%NhD3{}qw=ZoE2=d-3WEwuFnhduV;`#%l{|vKqNyY*pi9 z!M5n{jgQu0>O#$z;9hOiY3R+OE&sRa1S5IkxT&OF>yI69ZJI$}TLRb_s=h8%w;L&I z^@E+9{i~_XoS+@@20*!K-{jspiS zND)nkN(;6&<6a>w5S2A9#v-I#NR!m0kcLPu4iEujLCfHUwE?m4^%z4D^_vbA7fp3| z)%LqV_iLYesP=}cJ#(0VErZzU&4eT!|4A@WpiMPhZ9uKFM^)-aM`yOHob2vFn@EUE z#HYOyEIkBJ{OYyQr7Q&B^r)Wt@F@pJItIRK5=9^L>fbioG@i`~g*mby}# zcBD7$kUhmWY?(H<&7Yn>4f}P?or|x){y~{%;rZKFQns!%?mxPK1Iy*Wly_gf{_4DG zP1=9RCSUvu?tLy**ORX6(P;GM$s?gJPh)L;p1k>EUxpN5%5ONzStr+>O;wDgE5>AQ z3_Mqk2DAzrmMiMs4POt-+@{id#qOFLk#P6?lWhk(sh@Q=9HN<@H&_lmYx+f3+i)3m zzpP<+Gb7%D9O7*NIYagb7;zi{@k?>*F1^+56q56O%sz~jl&RM69gJ9S&0bLOM_7g< z_Mp1mLgvUlEKLl>zs3-0q8)Qu)H(FAp8iu~x>nQQU@WQW6FukO8gmZfH+JKb@C^-o zV<$3@sK6E#ITs@SIleK{v;-#vV&O1+PXsev6463YoCPs`flEOmK12srjz+79Mu+G` zfI@+6lA#eU!6%Gy;u2LXu%QQE>8S_vJ(vkqyNHM2L{!bH?7{V>h~7WNItAZRio&>h zM54wIIz{O7=TuZ^MinvG(FzxiO@(326Bh9tFF78eI5Y)DzTpwuFk7XHfgdE55XF_K z`bme_frU0B=tQs^K{tYa1S|qvTdUiDXrZa=BjTGQD;yif88^39xxMO_jQhn0kc#$} z^e0di?9bD5hH8^b?ksDyo93+G8KNs?%B9{Js%(z@GE}>4yt5`NZOT%=JK&<|%`(+d zcxR|C*?4D7Hf;6x3p^CvDN}$<{$8QFW#gSOzUrwfj3v#u7p5LC%`(%RVZCz6y~1vl zjrR&`pF1{x_^pv^BXe}d_yXTR&IjKby*4^W!>Y_|pF1ks8&hmknr+J3DcS{lhIDft zJR+|ynzn(gDglo$?nyp@qq_IVT|=p^z3HyKb55DstKKPUZ`Q)nRd7nX1T6R-VeFH9 zQUyb!GAaR!&ppD}C;22t6^&n*tPK~fN%~gVBa-^0FwYjsWX+mFGz}Z1Ys1B7lLN^> za_6mmk4TOu1cE2sWW83c6@7)NqtTbXHe8rmeEr7EBa-^0FwZW^R0h6!8WpAnu->w3 zb!u!GgfrBLOl~a&-m?}P4NiX}sDr#KP2PLVXHu3i(V*f=K|$r-ELQ&88$Tmccse8WY>VO*f=ms4`u6Z4>-X`Ylf?Th(D+ne&I1F=9l7z?IDu~0f33#Z#+ZRz${ zyBPPSBI%A;2ikruklK;%jCG23Fx8drj&)1S#q_Wi`W!p>5W> zcL=j~w2TdF{rZSD@CM!$a}Q$fA>Dm(v^Lr2Zp@6IU1B>0)-bR}^q}4|P#a(^c#6Oq z1>VkY#oML1&#>s&pJ<+_WQEjBCTpr@GMh1?KCAuYWj$lgWwW`3>?J*8g-+))msM^* zc=2#nR zXDOM%vp;)T=c%l!VU8Ui>FTBT^wkr|1bv&zSN}xPK_eG*Gp-t|nM9nH&@+S{o~4ds z_Om4|Skej0%XKr)GnPD`&FG0b-O(WF_$6b~!?S3-$0W$US(iQ5A`Q2jMjDeirQ(;+ zo4;|NWw+daCqud=aLBdxKS2fMIMG^J%5tSjTfr+u&1j06N@Z6Rb6Hmm5Le5mbgr0L z#aKz2iDhc3VC^z>s>Y?spqTFDC;8-MH3i}m!o*_URMJ_lEBew>GLaPB%W5V%Gh?IE z4%8JjX(|o&Iruyg71K812?=-_+kq-@Cnpu~$sn$15R91_WqR@l_RxIP#d|;`?gO~P z9umE_&rB_6)B4nk%1t$+PNi38bGfO-WGa=+TsW9c_mQ_Pp z)b&hFoOG=!84JrvL(#Ijp+IWBgKQ~Ua%o8?HEx!#@4{R^2*!sA5a~EsJ}&wQMDc6p zM`sg1Ub-86sTh2v6nv#1KePU&`0>AjAG6;_ClyjZXzOwoccEa!u2x-tw&v!tCdi+J z9aw#?7Sl4yaiN@NNDwA$!+dyw=k@4JU5T3%xo+gYkKzW1nJv5(eFR==;cc_7y?QtJ zYB4xd3eFVdXI8=6g}0(E%e%z0Yj999*K^#VeQqp*B0Zb{yv1}DlQb4{Avlo`h`4lF zbCdJcWVAe@<%PNRaT%R!s?EfVlFg}~~GFnZBbXB~v z$6sLt!pyU`An!pf%6rOke?in@tzm01&F0_(b$}Pr!zDDn%|Tve>+HKY$*Yp-!Bo|< z&ekPoNCqxSYyT&Rd|G&J@Ja+24lcrr!u~0FL)VCZ2`G<}$ZEQh%m}kt4NaQ3szB7z zV%oYtUFN!4vzs$qO&YM8^VxdrbdvKdpCLn>fjiFUa#?O-IT3U$^K2%YH=5^%-R1dA zhIHTFgjkG(rM4MUEch(5^)tFTANBGVfXvAbaB?e_tY`9ROIGt{)(X%6D1LT!?!%Mu zGba~XRfFij3268kLjVocD0dCtc=6_IpT2(c^^G~YZ22ebr+>#jj5NMOSfMV>i}XO& zy0rlA9<4{DAzrN$GTh5a%I~->nP_8q0r5dZEnU;~G(u}P`nLmBiY}bDJOX2T&w{e9 zRAb|FO@x?i{?hXa=w!VRt??{9q}|_wMy<1WeQ@1{r+VCHC=ilOF(xcd` zp{JJkYk1(V0~oXjIyX~yGg-PklXFVcz0TJI%#!KQJ!yKhsz9w;9^hFhpS zFp69ICN7)Cl>BVBH_dTw;e4XLLkv<|e2*6md=GYcN17Mhy(95A(P z*jP`~q}W)sJ4Y{2D7wMQk*>{<*oEcSuO#AR#J2~9DLL{n6G*K6JJPAEmb6-pyOoA-41mwP;`bT>=7=Xau+2 zqT=AGk;<9|+}#mEJwf1o0xdxaDVfl;Wi*Tr0h&~t>|8~5dv;cs69gqscZE5D*XtRr zux9{UaA~mwe)U59M3EkT0oX7OwIC%X>z<1w!=l8znp^j2GSNx*E=k%j%!ViC*8|#! z7QQC87{j0*(njf=qoqHL{+(oKp6I7J6|D<%hH-My3zO8QjcEh8w`;q#LEIzS5EOo# z)1Fiu+%Vy6=8~6mMO9`*)H3tazfEMJPFGAa>66Fp_F0wx^ne0khkDo6@lStt z^Jk^L>CJG(B?pG@bq#O*q|~*q5Z?FrUZk(WT!G;RC?A?Ggr_&(`St4U;bPxpxoc?i zM|4#@Kzsc7u@T0szYdSF-}N7M|EqM^&HK@@?IDkUB2o9s=p%9p!V|S_HH^OP16{UE z2yvjdYWCfYGqJT`RT|K~g|V9Bo7n$_+va>9dcV!x);)}EYmd_;w4Z9INs&eKBL7I^ zRqxtAv}G@{z2^kJ>A4!@_-3-M;+y{yjaw|>aF6S(MU0xL1u;4#A?j%sp^KQwE_sQ| z>yj->aJY5Rd?t3F8Owg}W0sL?VrYhHGb4UNG}SQhzrkVoXKts%{)H5E&#zIi1A|nx zRAXzq#>4>*(hA#3(J>$%s^&u>f9~Vwunzy2011IGHvBYNRtN{Xm-0Cw^qd5h|22Rk zA82LLXN2%60GR}DU{ATLuhg~YwpQxeUkLBFMOhB)L84d%8Y5DG@5&UKg% z7?9gdQUdg9S$7zrhD12?Q0LQCH==4p(!wy|=-oC(9-B!b2qBU;I8}?sD2%qk&F01O zh-|hcG;@RJb*)1CE4*jW%ZOR~hDv?W&G5aBp{*0Q4}3HB!@FZY{KJd?)?0dQt~mC7 zY3%)C$9$<{e$!JP8QTosSSb1j%aQKQu&wS(v@eRX9AqRl5M=x#8sv}~k?1;u%0!w; zsY$Iu4g5N3TX0=Z!L75!^kcbdxkzLaC65gXbtgd=Wt|;nnVs+!?X@1ppyqCgK^41d zs)$|GXKq$Rn@t*6){^ST^J`IYKx!W-)Q?FQ^;8yVI}Q>|IzF{6=$g`mO6RR=ip~pG z?Q>T;d00S*D`N2ASxW9~g``7h{t5xg#%#5%t1{wa;m(OE4uzdV$6B~*x<8Xd9>7dv=BZ@BX4~6 zdTD67fDAu0U2(bFddl7XrS84A%|iD9)W`R_hVX7%PXm-Yx^Ku8H~OH!2p=X6{(gP) zL@7MFWfsHZ_XkHeJ=Y_fxQtHh?Q6GxHq5>b2WJP|U-wIZ4$nf|5mH8e4sMLhC0cg* zjf>1B;!zmLwm0lgS16b|ye+*Mm2As)9Jo#1hmue_Dnzc=h>Yo(4KuL=Tq!xfCqA5qx@)3H0L2gwzW;;Ro3H4Uf8giXA43*GC3L`LN+g=ey zQwk(=p?*i}y&~PI&PKb4cC@5Ed>`S?6KKfKetM)t$nxhnPJOw#YFi%S0T-6%0<}nr zc#6Ou4DG`xaDcTospx4hadgvmN6br|!QzTY7nZW3C|2+qEdqLl)kX zK9VYK*`v^b;u9duyzLd2*Moql1|GQ4ckQq2-VU_O^8SLT)e$`3_q3Jep@OLO-XW}Z zRGPzTZ65fEr+`t}1F3a_aD-AlCm54FQ7q@Hka4c$nH=v~eQH+wj22nDGdK4gxy}5C<*a3jXHA zfi&-;r;d06|K&}_MMgyj(&8-8a;u98PGLP4LPjcO|NlicmD9nzI4QK_<4JlXv9aWn zI4!efN%$!t3QqCZ_P=4DLchsZ@CpTc#sus;%zz}7*;wI;T9N%B*M_gs&7|-~h^{i* zRdCia+gWhdGCNlIKDEsD6rA-wn<_YKnT-^j^}Zb1czg5s&*!eqZAj(jhl)2W?XNH= z7!63TR+tm?ho#pEuNjOom#-`ZHwJEuZ+%#hb{D1HC24oX<(CF3>`Cx|`W_L0P`k!~ zN_XG29*_=i^tMSaLarS^fyjR#6^{J4c;s~H$mxwhft|K%k)5u1B?-d)B)BntGx~t~ yA2kO3J0zTCJPB^Ru(j*vz6Uh&s4+b8jwC@no(?xZy79sF*aI>8=ovUdjs73&&;k_z literal 0 HcmV?d00001 diff --git a/venv/lib/python3.11/site-packages/anyio/__pycache__/pytest_plugin.cpython-311.pyc b/venv/lib/python3.11/site-packages/anyio/__pycache__/pytest_plugin.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..3f4cb756ffe5302684f92146570ca404b32e8d55 GIT binary patch literal 16343 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 M_+f}*J0{Wo4<@_t0ssI2 literal 0 HcmV?d00001 diff --git a/venv/lib/python3.11/site-packages/anyio/__pycache__/to_interpreter.cpython-311.pyc b/venv/lib/python3.11/site-packages/anyio/__pycache__/to_interpreter.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..dedac243d662beb84d899d475c67d26990e00e82 GIT binary patch literal 11443 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 literal 0 HcmV?d00001 diff --git a/venv/lib/python3.11/site-packages/anyio/__pycache__/to_process.cpython-311.pyc b/venv/lib/python3.11/site-packages/anyio/__pycache__/to_process.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..d2e72beec43c793eca2314b478dd6a1438192ea6 GIT binary patch literal 13822 zcmc&*X>1(Fm9Cziqvzrr9CCQGd2=Wp7D=6yB~uhhozz8H_9*grG~JX&nk(HsqNNNS z#dg+|*VxdB3=@fraIuNQtmRz=uz@VF*>w~rF?Iu|n`wiC1_ltY2oV2SP_Vra{A*wJ z96e1^Ya0l#J;mzR)vu~vy{dZk>g(dqoK72p>)-uXqZ6G7{TF^HUSysiKK+b9=nZrR zF^C~zC{6?k0x^c50iMYi86?%aF=$lprl3i^n}cS!8)KF@6{LV4F{YR`ZVTE}+8ndT z9YIIj8FZ@8mRLpH6?DbjK{q^8j5X$odxPG1Ww0{t3;NVFTdXQx9jsPqd(0oN3D&5z zBUT%)3)ZQ$GgcpO2sXqUgN^EQMXV{_9Bhu$K|0t+3DcYvB=>@J-NEj7AQ&J}f>Kj@v=pW?xW#~27vp;iH1#(8<*#5b zq;@k^>r(q5wT-D>m)g(x*#V|{4`fx}*Q|U07*h-HYfA6y*1g}#)WiEa{GMrGNT%_& zf$3wqUNQ#R;foPjE_r zQ0(DEA}NH0XfnYENToTF<~TMXgcx=voQ?^h6qk&!JRgch<57X-l!{`)Y?8YI&lHzV zg!pTT$P^T2V%Tq{Ss4;?sWu>SfQ%-j^$1_8mb4m`tW--ZSr=ublVI7#Y(`jya=H%n6zF)9yvY zn7>6niQXXp#z-KcV0?iMT~?MECc(>xio-dsYSDy>Ald`ox|ZMZhp`ZP)yXVG)y(`c5+7*bB5R?DO>aTvWwl=p7N zyg+ah8S|1;%b`*Fyx)NSe8oFwx#_)J((wXu!zDCpIRsjxfv==_{djn#Qo!T9aOv`Q z7E=*|{J!FoKEGaruXuzlMZWc8d5*e>=Bybr$7QIDnXzh$VQd6EE(HUjmD!#@@U>WdF-y7hF*xS%n#2aS~`7ubK zr=czaEf9%cKB}!Zy?W_DHW-U{CxqRaG?$x-G~;9{guTTlgf1HA9KxvfoN);IwWrIi zMSAnpJFd6DR=r)aSLN+|#S6CT|9?bJ7Fz(e)~(kR?#G*+rFM-&qZp5#x4dO@∾d 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 sP67);*tGZ?J@3(BzN^Z)<= literal 0 HcmV?d00001 diff --git a/venv/lib/python3.11/site-packages/anyio/__pycache__/to_thread.cpython-311.pyc b/venv/lib/python3.11/site-packages/anyio/__pycache__/to_thread.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..d4bba145ee6c4291321b4bd1ea0a8bf3930aeda1 GIT binary patch literal 3454 zcmcguUvC@75#QsTNQy^UqU=~v{>Y2Sam+RmZM0|rCbsJ)F%UFyi$rw+8pd&Xw-PTp z?h<=m!ubx#N1zP>Ar2^DASh71F>vytr_AgfX;OCbnB#J9 zc5ilecIG!T`|r8A5`pK-rEUKcpuWMu=&@45csKy!Ht~pO1f*j$41;*NMh?biU^Yy6 zTY=S?Y0SVp@n(X2r_d;9Iv*4}vyEAx3tllOb?k<%>Di#%nQP1$gqt568*S&6wq}r4 zvmnI=Df5l_&O&3sAfl*eDvxGzgcrQ>9fOd&@K2w{BFxTvb4O;6d&fKze)In{y%q1- zoB75G@09oaO{?*gXTDFW^Z=Jvjl^a`$cRP06k#=&6jdyouqWJP#f_EXB62*w!Qvot zqPF79a{|BPM_gTnwZ%7B5U^IjfiA4~y8IebKw3LYi38LS29-@7ISeH_E#_`<;lbqm z8?4J*KkB`c3ajQ0Okh8-aZN5MXR_AgZorfLp9C;(CB=2;JsxedASwP)hL_c5xPGN- zCKc9V!jr;*<}%^(AhFZ8RxK%H3MbY^EZoC0Bb~2bPvu@83A=IQWjfm8Mq)A8;Bet6 zk6Hv36RRa>+r;R`2UR%ZwQEl&MSAr&7TsNQ9Yb+k$9aAr4)3cWb{hG?qOt_TOj>TV5g?*YJ>FH^Wf6iS@Ijv30E0Z10h-O%Qdh}su9WZbvHT}8qa9ij zV66SfA-jd(9}dHCgn`VBSuUxAmC^)8vl+B?448tKo=IH-i4{EEkzftfG(B91P7&au zu~KJYe+gL?j+H_;OSxm=;1&?>Ra3iYXoiq+-hx1k-jTBVmQqsH@fbqVFz$Ax(k8;R z+g4J@7=j9!X#m{l4!zK%Tf7Gl0C#4211;Eu0QBWrB(s{c2HNVP)I`-MFcA8X@9AaH zd;1Uc*K6n3&b_9c@Hik~BVU9OuNVFX1b0ILMmoX+Yxdsi)01cqes%?xP( z?>|F119vIBGbGC+T^wIHDR?t2t262;;7Da*ZO{VM5>O##XAD7lxL#|^4zEFpjF@1x zPVaKJTWdjff*oGzxZN7KX}cEqty;GiwWavg+WGS}$Qt|=EP`y4hc#`T+9T_9dkXWn z?v`=4o6!9qetTqCC&lCa!ph*em-@x!{}#)`oH6&V@xSuQVCm`M?96QGTLRs8*bTA! z{uo(Yy;nKCUpf7C<>LLy#X+%r%j=(c^{b_!Nfs}COLB|(@30$^T=^%vnfyc0gD5QO zE>fchJpe_?c=$UYZj;GEccgSpl)%wqLZ*43NEyrmMh#ZDAV7)LhNy$r@|93hzZpKI(Nb?g}_4;-wNsVH%$cjtd2N&Cyv6lUf>`CN9Q3lQLxf z5adCaLV?BWwwlNJN-EUhA4XgtL#Xvt738q6L*uCzu^Zd(u=sjMdU3!ns&nuGVHuu- zerOtoF(5DWr`ymn?c82rSR#hKSHj3uzu5jQhQ)8-g@=(dJ2TS;=o?I_4+?b_w3budv&ikER$2G e2d7pCXMQoX&l(W$Kh|9{O2%)EA^E9ZTl5FmspE?P literal 0 HcmV?d00001 diff --git a/venv/lib/python3.11/site-packages/anyio/_backends/__init__.py b/venv/lib/python3.11/site-packages/anyio/_backends/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/venv/lib/python3.11/site-packages/anyio/_backends/__pycache__/__init__.cpython-311.pyc b/venv/lib/python3.11/site-packages/anyio/_backends/__pycache__/__init__.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..b37baf7812a7f9f80d4db710a194ca3f8695f02f GIT binary patch literal 202 zcmZ3^%ge<81pCFyGC}lX5CH>>P{wCAAY(d13PUi1CZpdxp?+~@Nvdu^ zVsdt3dTOzLVqRrtzJ7cXke`~DQmh{zpP83g5+AQuQ2C3)CO1E&G$+-rh!toX$UVjU TK;i>4BO~Jn1{hJq3={(ZQ6Dr$ literal 0 HcmV?d00001 diff --git a/venv/lib/python3.11/site-packages/anyio/_backends/__pycache__/_asyncio.cpython-311.pyc b/venv/lib/python3.11/site-packages/anyio/_backends/__pycache__/_asyncio.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..4659c140800c1aa143614981f18fe8e02027a3fc GIT binary patch literal 152947 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
    T(c!BoAYCsCXTO%)+L#`7bIj}3a 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 literal 0 HcmV?d00001 diff --git a/venv/lib/python3.11/site-packages/anyio/_backends/__pycache__/_trio.cpython-311.pyc b/venv/lib/python3.11/site-packages/anyio/_backends/__pycache__/_trio.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..d08882d2e21632a17184bd7ea1042c412b5fc06e GIT binary patch literal 79242 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 literal 0 HcmV?d00001 diff --git a/venv/lib/python3.11/site-packages/anyio/_backends/_asyncio.py b/venv/lib/python3.11/site-packages/anyio/_backends/_asyncio.py new file mode 100644 index 0000000..8ff009e --- /dev/null +++ b/venv/lib/python3.11/site-packages/anyio/_backends/_asyncio.py @@ -0,0 +1,2980 @@ +from __future__ import annotations + +import array +import asyncio +import concurrent.futures +import contextvars +import math +import os +import socket +import sys +import threading +import weakref +from asyncio import ( + AbstractEventLoop, + CancelledError, + all_tasks, + create_task, + current_task, + get_running_loop, + sleep, +) +from asyncio.base_events import _run_until_complete_cb # type: ignore[attr-defined] +from collections import OrderedDict, deque +from collections.abc import ( + AsyncGenerator, + AsyncIterator, + Awaitable, + Callable, + Collection, + Coroutine, + Iterable, + Sequence, +) +from concurrent.futures import Future +from contextlib import AbstractContextManager, suppress +from contextvars import Context, copy_context +from dataclasses import dataclass, field +from functools import partial, wraps +from inspect import ( + CORO_RUNNING, + CORO_SUSPENDED, + getcoroutinestate, + iscoroutine, +) +from io import IOBase +from os import PathLike +from queue import Queue +from signal import Signals +from socket import AddressFamily, SocketKind +from threading import Thread +from types import CodeType, TracebackType +from typing import ( + IO, + TYPE_CHECKING, + Any, + Optional, + TypeVar, + cast, +) +from weakref import WeakKeyDictionary + +from .. import ( + CapacityLimiterStatistics, + EventStatistics, + LockStatistics, + TaskInfo, + abc, +) +from .._core._eventloop import ( + claim_worker_thread, + set_current_async_library, + threadlocals, +) +from .._core._exceptions import ( + BrokenResourceError, + BusyResourceError, + ClosedResourceError, + EndOfStream, + RunFinishedError, + WouldBlock, + iterate_exceptions, +) +from .._core._sockets import convert_ipv6_sockaddr +from .._core._streams import create_memory_object_stream +from .._core._synchronization import ( + CapacityLimiter as BaseCapacityLimiter, +) +from .._core._synchronization import Event as BaseEvent +from .._core._synchronization import Lock as BaseLock +from .._core._synchronization import ( + ResourceGuard, + SemaphoreStatistics, +) +from .._core._synchronization import Semaphore as BaseSemaphore +from .._core._tasks import CancelScope as BaseCancelScope +from ..abc import ( + AsyncBackend, + IPSockAddrType, + SocketListener, + UDPPacketType, + UNIXDatagramPacketType, +) +from ..abc._eventloop import StrOrBytesPath +from ..lowlevel import RunVar +from ..streams.memory import MemoryObjectReceiveStream, MemoryObjectSendStream + +if TYPE_CHECKING: + from _typeshed import FileDescriptorLike +else: + FileDescriptorLike = object + +if sys.version_info >= (3, 10): + from typing import ParamSpec +else: + from typing_extensions import ParamSpec + +if sys.version_info >= (3, 11): + from asyncio import Runner + from typing import TypeVarTuple, Unpack +else: + import contextvars + import enum + import signal + from asyncio import coroutines, events, exceptions, tasks + + from exceptiongroup import BaseExceptionGroup + from typing_extensions import TypeVarTuple, Unpack + + class _State(enum.Enum): + CREATED = "created" + INITIALIZED = "initialized" + CLOSED = "closed" + + class Runner: + # Copied from CPython 3.11 + def __init__( + self, + *, + debug: bool | None = None, + loop_factory: Callable[[], AbstractEventLoop] | None = None, + ): + self._state = _State.CREATED + self._debug = debug + self._loop_factory = loop_factory + self._loop: AbstractEventLoop | None = None + self._context = None + self._interrupt_count = 0 + self._set_event_loop = False + + def __enter__(self) -> Runner: + self._lazy_init() + return self + + def __exit__( + self, + exc_type: type[BaseException] | None, + exc_val: BaseException | None, + exc_tb: TracebackType | None, + ) -> None: + self.close() + + def close(self) -> None: + """Shutdown and close event loop.""" + loop = self._loop + if self._state is not _State.INITIALIZED or loop is None: + return + try: + _cancel_all_tasks(loop) + loop.run_until_complete(loop.shutdown_asyncgens()) + if hasattr(loop, "shutdown_default_executor"): + loop.run_until_complete(loop.shutdown_default_executor()) + else: + loop.run_until_complete(_shutdown_default_executor(loop)) + finally: + if self._set_event_loop: + events.set_event_loop(None) + loop.close() + self._loop = None + self._state = _State.CLOSED + + def get_loop(self) -> AbstractEventLoop: + """Return embedded event loop.""" + self._lazy_init() + return self._loop + + def run(self, coro: Coroutine[T_Retval], *, context=None) -> T_Retval: + """Run a coroutine inside the embedded event loop.""" + if not coroutines.iscoroutine(coro): + raise ValueError(f"a coroutine was expected, got {coro!r}") + + if events._get_running_loop() is not None: + # fail fast with short traceback + raise RuntimeError( + "Runner.run() cannot be called from a running event loop" + ) + + self._lazy_init() + + if context is None: + context = self._context + task = context.run(self._loop.create_task, coro) + + if ( + threading.current_thread() is threading.main_thread() + and signal.getsignal(signal.SIGINT) is signal.default_int_handler + ): + sigint_handler = partial(self._on_sigint, main_task=task) + try: + signal.signal(signal.SIGINT, sigint_handler) + except ValueError: + # `signal.signal` may throw if `threading.main_thread` does + # not support signals (e.g. embedded interpreter with signals + # not registered - see gh-91880) + sigint_handler = None + else: + sigint_handler = None + + self._interrupt_count = 0 + try: + return self._loop.run_until_complete(task) + except exceptions.CancelledError: + if self._interrupt_count > 0: + uncancel = getattr(task, "uncancel", None) + if uncancel is not None and uncancel() == 0: + raise KeyboardInterrupt # noqa: B904 + raise # CancelledError + finally: + if ( + sigint_handler is not None + and signal.getsignal(signal.SIGINT) is sigint_handler + ): + signal.signal(signal.SIGINT, signal.default_int_handler) + + def _lazy_init(self) -> None: + if self._state is _State.CLOSED: + raise RuntimeError("Runner is closed") + if self._state is _State.INITIALIZED: + return + if self._loop_factory is None: + self._loop = events.new_event_loop() + if not self._set_event_loop: + # Call set_event_loop only once to avoid calling + # attach_loop multiple times on child watchers + events.set_event_loop(self._loop) + self._set_event_loop = True + else: + self._loop = self._loop_factory() + if self._debug is not None: + self._loop.set_debug(self._debug) + self._context = contextvars.copy_context() + self._state = _State.INITIALIZED + + def _on_sigint(self, signum, frame, main_task: asyncio.Task) -> None: + self._interrupt_count += 1 + if self._interrupt_count == 1 and not main_task.done(): + main_task.cancel() + # wakeup loop if it is blocked by select() with long timeout + self._loop.call_soon_threadsafe(lambda: None) + return + raise KeyboardInterrupt() + + def _cancel_all_tasks(loop: AbstractEventLoop) -> None: + to_cancel = tasks.all_tasks(loop) + if not to_cancel: + return + + for task in to_cancel: + task.cancel() + + loop.run_until_complete(tasks.gather(*to_cancel, return_exceptions=True)) + + for task in to_cancel: + if task.cancelled(): + continue + if task.exception() is not None: + loop.call_exception_handler( + { + "message": "unhandled exception during asyncio.run() shutdown", + "exception": task.exception(), + "task": task, + } + ) + + async def _shutdown_default_executor(loop: AbstractEventLoop) -> None: + """Schedule the shutdown of the default executor.""" + + def _do_shutdown(future: asyncio.futures.Future) -> None: + try: + loop._default_executor.shutdown(wait=True) # type: ignore[attr-defined] + loop.call_soon_threadsafe(future.set_result, None) + except Exception as ex: + loop.call_soon_threadsafe(future.set_exception, ex) + + loop._executor_shutdown_called = True + if loop._default_executor is None: + return + future = loop.create_future() + thread = threading.Thread(target=_do_shutdown, args=(future,)) + thread.start() + try: + await future + finally: + thread.join() + + +T_Retval = TypeVar("T_Retval") +T_contra = TypeVar("T_contra", contravariant=True) +PosArgsT = TypeVarTuple("PosArgsT") +P = ParamSpec("P") + +_root_task: RunVar[asyncio.Task | None] = RunVar("_root_task") + + +def find_root_task() -> asyncio.Task: + root_task = _root_task.get(None) + if root_task is not None and not root_task.done(): + return root_task + + # Look for a task that has been started via run_until_complete() + for task in all_tasks(): + if task._callbacks and not task.done(): + callbacks = [cb for cb, context in task._callbacks] + for cb in callbacks: + if ( + cb is _run_until_complete_cb + or getattr(cb, "__module__", None) == "uvloop.loop" + ): + _root_task.set(task) + return task + + # Look up the topmost task in the AnyIO task tree, if possible + task = cast(asyncio.Task, current_task()) + state = _task_states.get(task) + if state: + cancel_scope = state.cancel_scope + while cancel_scope and cancel_scope._parent_scope is not None: + cancel_scope = cancel_scope._parent_scope + + if cancel_scope is not None: + return cast(asyncio.Task, cancel_scope._host_task) + + return task + + +def get_callable_name(func: Callable) -> str: + module = getattr(func, "__module__", None) + qualname = getattr(func, "__qualname__", None) + return ".".join([x for x in (module, qualname) if x]) + + +# +# Event loop +# + +_run_vars: WeakKeyDictionary[asyncio.AbstractEventLoop, Any] = WeakKeyDictionary() + + +def _task_started(task: asyncio.Task) -> bool: + """Return ``True`` if the task has been started and has not finished.""" + # The task coro should never be None here, as we never add finished tasks to the + # task list + coro = task.get_coro() + assert coro is not None + try: + return getcoroutinestate(coro) in (CORO_RUNNING, CORO_SUSPENDED) + except AttributeError: + # task coro is async_genenerator_asend https://bugs.python.org/issue37771 + raise Exception(f"Cannot determine if task {task} has started or not") from None + + +# +# Timeouts and cancellation +# + + +def is_anyio_cancellation(exc: CancelledError) -> bool: + # Sometimes third party frameworks catch a CancelledError and raise a new one, so as + # a workaround we have to look at the previous ones in __context__ too for a + # matching cancel message + while True: + if ( + exc.args + and isinstance(exc.args[0], str) + and exc.args[0].startswith("Cancelled via cancel scope ") + ): + return True + + if isinstance(exc.__context__, CancelledError): + exc = exc.__context__ + continue + + return False + + +class CancelScope(BaseCancelScope): + def __new__( + cls, *, deadline: float = math.inf, shield: bool = False + ) -> CancelScope: + return object.__new__(cls) + + def __init__(self, deadline: float = math.inf, shield: bool = False): + self._deadline = deadline + self._shield = shield + self._parent_scope: CancelScope | None = None + self._child_scopes: set[CancelScope] = set() + self._cancel_called = False + self._cancel_reason: str | None = None + self._cancelled_caught = False + self._active = False + self._timeout_handle: asyncio.TimerHandle | None = None + self._cancel_handle: asyncio.Handle | None = None + self._tasks: set[asyncio.Task] = set() + self._host_task: asyncio.Task | None = None + if sys.version_info >= (3, 11): + self._pending_uncancellations: int | None = 0 + else: + self._pending_uncancellations = None + + def __enter__(self) -> CancelScope: + if self._active: + raise RuntimeError( + "Each CancelScope may only be used for a single 'with' block" + ) + + self._host_task = host_task = cast(asyncio.Task, current_task()) + self._tasks.add(host_task) + try: + task_state = _task_states[host_task] + except KeyError: + task_state = TaskState(None, self) + _task_states[host_task] = task_state + else: + self._parent_scope = task_state.cancel_scope + task_state.cancel_scope = self + if self._parent_scope is not None: + # If using an eager task factory, the parent scope may not even contain + # the host task + self._parent_scope._child_scopes.add(self) + self._parent_scope._tasks.discard(host_task) + + self._timeout() + self._active = True + + # Start cancelling the host task if the scope was cancelled before entering + if self._cancel_called: + self._deliver_cancellation(self) + + return self + + def __exit__( + self, + exc_type: type[BaseException] | None, + exc_val: BaseException | None, + exc_tb: TracebackType | None, + ) -> bool: + del exc_tb + + if not self._active: + raise RuntimeError("This cancel scope is not active") + if current_task() is not self._host_task: + raise RuntimeError( + "Attempted to exit cancel scope in a different task than it was " + "entered in" + ) + + assert self._host_task is not None + host_task_state = _task_states.get(self._host_task) + if host_task_state is None or host_task_state.cancel_scope is not self: + raise RuntimeError( + "Attempted to exit a cancel scope that isn't the current tasks's " + "current cancel scope" + ) + + try: + self._active = False + if self._timeout_handle: + self._timeout_handle.cancel() + self._timeout_handle = None + + self._tasks.remove(self._host_task) + if self._parent_scope is not None: + self._parent_scope._child_scopes.remove(self) + self._parent_scope._tasks.add(self._host_task) + + host_task_state.cancel_scope = self._parent_scope + + # Restart the cancellation effort in the closest visible, cancelled parent + # scope if necessary + self._restart_cancellation_in_parent() + + # We only swallow the exception iff it was an AnyIO CancelledError, either + # directly as exc_val or inside an exception group and there are no cancelled + # parent cancel scopes visible to us here + if self._cancel_called and not self._parent_cancellation_is_visible_to_us: + # For each level-cancel() call made on the host task, call uncancel() + while self._pending_uncancellations: + self._host_task.uncancel() + self._pending_uncancellations -= 1 + + # Update cancelled_caught and check for exceptions we must not swallow + cannot_swallow_exc_val = False + if exc_val is not None: + for exc in iterate_exceptions(exc_val): + if isinstance(exc, CancelledError) and is_anyio_cancellation( + exc + ): + self._cancelled_caught = True + else: + cannot_swallow_exc_val = True + + return self._cancelled_caught and not cannot_swallow_exc_val + else: + if self._pending_uncancellations: + assert self._parent_scope is not None + assert self._parent_scope._pending_uncancellations is not None + self._parent_scope._pending_uncancellations += ( + self._pending_uncancellations + ) + self._pending_uncancellations = 0 + + return False + finally: + self._host_task = None + del exc_val + + @property + def _effectively_cancelled(self) -> bool: + cancel_scope: CancelScope | None = self + while cancel_scope is not None: + if cancel_scope._cancel_called: + return True + + if cancel_scope.shield: + return False + + cancel_scope = cancel_scope._parent_scope + + return False + + @property + def _parent_cancellation_is_visible_to_us(self) -> bool: + return ( + self._parent_scope is not None + and not self.shield + and self._parent_scope._effectively_cancelled + ) + + def _timeout(self) -> None: + if self._deadline != math.inf: + loop = get_running_loop() + if loop.time() >= self._deadline: + self.cancel("deadline exceeded") + else: + self._timeout_handle = loop.call_at(self._deadline, self._timeout) + + def _deliver_cancellation(self, origin: CancelScope) -> bool: + """ + Deliver cancellation to directly contained tasks and nested cancel scopes. + + Schedule another run at the end if we still have tasks eligible for + cancellation. + + :param origin: the cancel scope that originated the cancellation + :return: ``True`` if the delivery needs to be retried on the next cycle + + """ + should_retry = False + current = current_task() + for task in self._tasks: + should_retry = True + if task._must_cancel: # type: ignore[attr-defined] + continue + + # The task is eligible for cancellation if it has started + if task is not current and (task is self._host_task or _task_started(task)): + waiter = task._fut_waiter # type: ignore[attr-defined] + if not isinstance(waiter, asyncio.Future) or not waiter.done(): + task.cancel(origin._cancel_reason) + if ( + task is origin._host_task + and origin._pending_uncancellations is not None + ): + origin._pending_uncancellations += 1 + + # Deliver cancellation to child scopes that aren't shielded or running their own + # cancellation callbacks + for scope in self._child_scopes: + if not scope._shield and not scope.cancel_called: + should_retry = scope._deliver_cancellation(origin) or should_retry + + # Schedule another callback if there are still tasks left + if origin is self: + if should_retry: + self._cancel_handle = get_running_loop().call_soon( + self._deliver_cancellation, origin + ) + else: + self._cancel_handle = None + + return should_retry + + def _restart_cancellation_in_parent(self) -> None: + """ + Restart the cancellation effort in the closest directly cancelled parent scope. + + """ + scope = self._parent_scope + while scope is not None: + if scope._cancel_called: + if scope._cancel_handle is None: + scope._deliver_cancellation(scope) + + break + + # No point in looking beyond any shielded scope + if scope._shield: + break + + scope = scope._parent_scope + + def cancel(self, reason: str | None = None) -> None: + if not self._cancel_called: + if self._timeout_handle: + self._timeout_handle.cancel() + self._timeout_handle = None + + self._cancel_called = True + self._cancel_reason = f"Cancelled via cancel scope {id(self):x}" + if task := current_task(): + self._cancel_reason += f" by {task}" + + if reason: + self._cancel_reason += f"; reason: {reason}" + + if self._host_task is not None: + self._deliver_cancellation(self) + + @property + def deadline(self) -> float: + return self._deadline + + @deadline.setter + def deadline(self, value: float) -> None: + self._deadline = float(value) + if self._timeout_handle is not None: + self._timeout_handle.cancel() + self._timeout_handle = None + + if self._active and not self._cancel_called: + self._timeout() + + @property + def cancel_called(self) -> bool: + return self._cancel_called + + @property + def cancelled_caught(self) -> bool: + return self._cancelled_caught + + @property + def shield(self) -> bool: + return self._shield + + @shield.setter + def shield(self, value: bool) -> None: + if self._shield != value: + self._shield = value + if not value: + self._restart_cancellation_in_parent() + + +# +# Task states +# + + +class TaskState: + """ + Encapsulates auxiliary task information that cannot be added to the Task instance + itself because there are no guarantees about its implementation. + """ + + __slots__ = "parent_id", "cancel_scope", "__weakref__" + + def __init__(self, parent_id: int | None, cancel_scope: CancelScope | None): + self.parent_id = parent_id + self.cancel_scope = cancel_scope + + +_task_states: WeakKeyDictionary[asyncio.Task, TaskState] = WeakKeyDictionary() + + +# +# Task groups +# + + +class _AsyncioTaskStatus(abc.TaskStatus): + def __init__(self, future: asyncio.Future, parent_id: int): + self._future = future + self._parent_id = parent_id + + def started(self, value: T_contra | None = None) -> None: + try: + self._future.set_result(value) + except asyncio.InvalidStateError: + if not self._future.cancelled(): + raise RuntimeError( + "called 'started' twice on the same task status" + ) from None + + task = cast(asyncio.Task, current_task()) + _task_states[task].parent_id = self._parent_id + + +if sys.version_info >= (3, 12): + _eager_task_factory_code: CodeType | None = asyncio.eager_task_factory.__code__ +else: + _eager_task_factory_code = None + + +class TaskGroup(abc.TaskGroup): + def __init__(self) -> None: + self.cancel_scope: CancelScope = CancelScope() + self._active = False + self._exceptions: list[BaseException] = [] + self._tasks: set[asyncio.Task] = set() + self._on_completed_fut: asyncio.Future[None] | None = None + + async def __aenter__(self) -> TaskGroup: + self.cancel_scope.__enter__() + self._active = True + return self + + async def __aexit__( + self, + exc_type: type[BaseException] | None, + exc_val: BaseException | None, + exc_tb: TracebackType | None, + ) -> bool: + try: + if exc_val is not None: + self.cancel_scope.cancel() + if not isinstance(exc_val, CancelledError): + self._exceptions.append(exc_val) + + loop = get_running_loop() + try: + if self._tasks: + with CancelScope() as wait_scope: + while self._tasks: + self._on_completed_fut = loop.create_future() + + try: + await self._on_completed_fut + except CancelledError as exc: + # Shield the scope against further cancellation attempts, + # as they're not productive (#695) + wait_scope.shield = True + self.cancel_scope.cancel() + + # Set exc_val from the cancellation exception if it was + # previously unset. However, we should not replace a native + # cancellation exception with one raise by a cancel scope. + if exc_val is None or ( + isinstance(exc_val, CancelledError) + and not is_anyio_cancellation(exc) + ): + exc_val = exc + + self._on_completed_fut = None + else: + # If there are no child tasks to wait on, run at least one checkpoint + # anyway + await AsyncIOBackend.cancel_shielded_checkpoint() + + self._active = False + if self._exceptions: + # The exception that got us here should already have been + # added to self._exceptions so it's ok to break exception + # chaining and avoid adding a "During handling of above..." + # for each nesting level. + raise BaseExceptionGroup( + "unhandled errors in a TaskGroup", self._exceptions + ) from None + elif exc_val: + raise exc_val + except BaseException as exc: + if self.cancel_scope.__exit__(type(exc), exc, exc.__traceback__): + return True + + raise + + return self.cancel_scope.__exit__(exc_type, exc_val, exc_tb) + finally: + del exc_val, exc_tb, self._exceptions + + def _spawn( + self, + func: Callable[[Unpack[PosArgsT]], Awaitable[Any]], + args: tuple[Unpack[PosArgsT]], + name: object, + task_status_future: asyncio.Future | None = None, + ) -> asyncio.Task: + def task_done(_task: asyncio.Task) -> None: + if sys.version_info >= (3, 14) and self.cancel_scope._host_task is not None: + asyncio.future_discard_from_awaited_by( + _task, self.cancel_scope._host_task + ) + + task_state = _task_states[_task] + assert task_state.cancel_scope is not None + assert _task in task_state.cancel_scope._tasks + task_state.cancel_scope._tasks.remove(_task) + self._tasks.remove(task) + del _task_states[_task] + + if self._on_completed_fut is not None and not self._tasks: + try: + self._on_completed_fut.set_result(None) + except asyncio.InvalidStateError: + pass + + try: + exc = _task.exception() + except CancelledError as e: + while isinstance(e.__context__, CancelledError): + e = e.__context__ + + exc = e + + if exc is not None: + # The future can only be in the cancelled state if the host task was + # cancelled, so return immediately instead of adding one more + # CancelledError to the exceptions list + if task_status_future is not None and task_status_future.cancelled(): + return + + if task_status_future is None or task_status_future.done(): + if not isinstance(exc, CancelledError): + self._exceptions.append(exc) + + if not self.cancel_scope._effectively_cancelled: + self.cancel_scope.cancel() + else: + task_status_future.set_exception(exc) + elif task_status_future is not None and not task_status_future.done(): + task_status_future.set_exception( + RuntimeError("Child exited without calling task_status.started()") + ) + + if not self._active: + raise RuntimeError( + "This task group is not active; no new tasks can be started." + ) + + kwargs = {} + if task_status_future: + parent_id = id(current_task()) + kwargs["task_status"] = _AsyncioTaskStatus( + task_status_future, id(self.cancel_scope._host_task) + ) + else: + parent_id = id(self.cancel_scope._host_task) + + coro = func(*args, **kwargs) + if not iscoroutine(coro): + prefix = f"{func.__module__}." if hasattr(func, "__module__") else "" + raise TypeError( + f"Expected {prefix}{func.__qualname__}() to return a coroutine, but " + f"the return value ({coro!r}) is not a coroutine object" + ) + + name = get_callable_name(func) if name is None else str(name) + loop = asyncio.get_running_loop() + if ( + (factory := loop.get_task_factory()) + and getattr(factory, "__code__", None) is _eager_task_factory_code + and (closure := getattr(factory, "__closure__", None)) + ): + custom_task_constructor = closure[0].cell_contents + task = custom_task_constructor(coro, loop=loop, name=name) + else: + task = create_task(coro, name=name) + + # Make the spawned task inherit the task group's cancel scope + _task_states[task] = TaskState( + parent_id=parent_id, cancel_scope=self.cancel_scope + ) + self.cancel_scope._tasks.add(task) + self._tasks.add(task) + if sys.version_info >= (3, 14) and self.cancel_scope._host_task is not None: + asyncio.future_add_to_awaited_by(task, self.cancel_scope._host_task) + + task.add_done_callback(task_done) + return task + + def start_soon( + self, + func: Callable[[Unpack[PosArgsT]], Awaitable[Any]], + *args: Unpack[PosArgsT], + name: object = None, + ) -> None: + self._spawn(func, args, name) + + async def start( + self, func: Callable[..., Awaitable[Any]], *args: object, name: object = None + ) -> Any: + future: asyncio.Future = asyncio.Future() + task = self._spawn(func, args, name, future) + + # If the task raises an exception after sending a start value without a switch + # point between, the task group is cancelled and this method never proceeds to + # process the completed future. That's why we have to have a shielded cancel + # scope here. + try: + return await future + except CancelledError: + # Cancel the task and wait for it to exit before returning + task.cancel() + with CancelScope(shield=True), suppress(CancelledError): + await task + + raise + + +# +# Threads +# + +_Retval_Queue_Type = tuple[Optional[T_Retval], Optional[BaseException]] + + +class WorkerThread(Thread): + MAX_IDLE_TIME = 10 # seconds + + def __init__( + self, + root_task: asyncio.Task, + workers: set[WorkerThread], + idle_workers: deque[WorkerThread], + ): + super().__init__(name="AnyIO worker thread") + self.root_task = root_task + self.workers = workers + self.idle_workers = idle_workers + self.loop = root_task._loop + self.queue: Queue[ + tuple[Context, Callable, tuple, asyncio.Future, CancelScope] | None + ] = Queue(2) + self.idle_since = AsyncIOBackend.current_time() + self.stopping = False + + def _report_result( + self, future: asyncio.Future, result: Any, exc: BaseException | None + ) -> None: + self.idle_since = AsyncIOBackend.current_time() + if not self.stopping: + self.idle_workers.append(self) + + if not future.cancelled(): + if exc is not None: + if isinstance(exc, StopIteration): + new_exc = RuntimeError("coroutine raised StopIteration") + new_exc.__cause__ = exc + exc = new_exc + + future.set_exception(exc) + else: + future.set_result(result) + + def run(self) -> None: + with claim_worker_thread(AsyncIOBackend, self.loop): + while True: + item = self.queue.get() + if item is None: + # Shutdown command received + return + + context, func, args, future, cancel_scope = item + if not future.cancelled(): + result = None + exception: BaseException | None = None + threadlocals.current_cancel_scope = cancel_scope + try: + result = context.run(func, *args) + except BaseException as exc: + exception = exc + finally: + del threadlocals.current_cancel_scope + + if not self.loop.is_closed(): + self.loop.call_soon_threadsafe( + self._report_result, future, result, exception + ) + + del result, exception + + self.queue.task_done() + del item, context, func, args, future, cancel_scope + + def stop(self, f: asyncio.Task | None = None) -> None: + self.stopping = True + self.queue.put_nowait(None) + self.workers.discard(self) + try: + self.idle_workers.remove(self) + except ValueError: + pass + + +_threadpool_idle_workers: RunVar[deque[WorkerThread]] = RunVar( + "_threadpool_idle_workers" +) +_threadpool_workers: RunVar[set[WorkerThread]] = RunVar("_threadpool_workers") + + +# +# Subprocesses +# + + +@dataclass(eq=False) +class StreamReaderWrapper(abc.ByteReceiveStream): + _stream: asyncio.StreamReader + + async def receive(self, max_bytes: int = 65536) -> bytes: + data = await self._stream.read(max_bytes) + if data: + return data + else: + raise EndOfStream + + async def aclose(self) -> None: + self._stream.set_exception(ClosedResourceError()) + await AsyncIOBackend.checkpoint() + + +@dataclass(eq=False) +class StreamWriterWrapper(abc.ByteSendStream): + _stream: asyncio.StreamWriter + _closed: bool = field(init=False, default=False) + + async def send(self, item: bytes) -> None: + await AsyncIOBackend.checkpoint_if_cancelled() + stream_paused = self._stream._protocol._paused # type: ignore[attr-defined] + try: + self._stream.write(item) + await self._stream.drain() + except (ConnectionResetError, BrokenPipeError, RuntimeError) as exc: + # If closed by us and/or the peer: + # * on stdlib, drain() raises ConnectionResetError or BrokenPipeError + # * on uvloop and Winloop, write() eventually starts raising RuntimeError + if self._closed: + raise ClosedResourceError from exc + elif self._stream.is_closing(): + raise BrokenResourceError from exc + + raise + + if not stream_paused: + await AsyncIOBackend.cancel_shielded_checkpoint() + + async def aclose(self) -> None: + self._closed = True + self._stream.close() + await AsyncIOBackend.checkpoint() + + +@dataclass(eq=False) +class Process(abc.Process): + _process: asyncio.subprocess.Process + _stdin: StreamWriterWrapper | None + _stdout: StreamReaderWrapper | None + _stderr: StreamReaderWrapper | None + + async def aclose(self) -> None: + with CancelScope(shield=True) as scope: + if self._stdin: + await self._stdin.aclose() + if self._stdout: + await self._stdout.aclose() + if self._stderr: + await self._stderr.aclose() + + scope.shield = False + try: + await self.wait() + except BaseException: + scope.shield = True + self.kill() + await self.wait() + raise + + async def wait(self) -> int: + return await self._process.wait() + + def terminate(self) -> None: + self._process.terminate() + + def kill(self) -> None: + self._process.kill() + + def send_signal(self, signal: int) -> None: + self._process.send_signal(signal) + + @property + def pid(self) -> int: + return self._process.pid + + @property + def returncode(self) -> int | None: + return self._process.returncode + + @property + def stdin(self) -> abc.ByteSendStream | None: + return self._stdin + + @property + def stdout(self) -> abc.ByteReceiveStream | None: + return self._stdout + + @property + def stderr(self) -> abc.ByteReceiveStream | None: + return self._stderr + + +def _forcibly_shutdown_process_pool_on_exit( + workers: set[Process], _task: object +) -> None: + """ + Forcibly shuts down worker processes belonging to this event loop.""" + child_watcher: asyncio.AbstractChildWatcher | None = None # type: ignore[name-defined] + if sys.version_info < (3, 12): + try: + child_watcher = asyncio.get_event_loop_policy().get_child_watcher() + except NotImplementedError: + pass + + # Close as much as possible (w/o async/await) to avoid warnings + for process in workers.copy(): + if process.returncode is None: + continue + + process._stdin._stream._transport.close() # type: ignore[union-attr] + process._stdout._stream._transport.close() # type: ignore[union-attr] + process._stderr._stream._transport.close() # type: ignore[union-attr] + process.kill() + if child_watcher: + child_watcher.remove_child_handler(process.pid) + + +async def _shutdown_process_pool_on_exit(workers: set[abc.Process]) -> None: + """ + Shuts down worker processes belonging to this event loop. + + NOTE: this only works when the event loop was started using asyncio.run() or + anyio.run(). + + """ + process: abc.Process + try: + await sleep(math.inf) + except asyncio.CancelledError: + workers = workers.copy() + for process in workers: + if process.returncode is None: + process.kill() + + for process in workers: + await process.aclose() + + +# +# Sockets and networking +# + + +class StreamProtocol(asyncio.Protocol): + read_queue: deque[bytes] + read_event: asyncio.Event + write_event: asyncio.Event + exception: Exception | None = None + is_at_eof: bool = False + + def connection_made(self, transport: asyncio.BaseTransport) -> None: + self.read_queue = deque() + self.read_event = asyncio.Event() + self.write_event = asyncio.Event() + self.write_event.set() + cast(asyncio.Transport, transport).set_write_buffer_limits(0) + + def connection_lost(self, exc: Exception | None) -> None: + if exc: + self.exception = BrokenResourceError() + self.exception.__cause__ = exc + + self.read_event.set() + self.write_event.set() + + def data_received(self, data: bytes) -> None: + # ProactorEventloop sometimes sends bytearray instead of bytes + self.read_queue.append(bytes(data)) + self.read_event.set() + + def eof_received(self) -> bool | None: + self.is_at_eof = True + self.read_event.set() + return True + + def pause_writing(self) -> None: + self.write_event = asyncio.Event() + + def resume_writing(self) -> None: + self.write_event.set() + + +class DatagramProtocol(asyncio.DatagramProtocol): + read_queue: deque[tuple[bytes, IPSockAddrType]] + read_event: asyncio.Event + write_event: asyncio.Event + exception: Exception | None = None + + def connection_made(self, transport: asyncio.BaseTransport) -> None: + self.read_queue = deque(maxlen=100) # arbitrary value + self.read_event = asyncio.Event() + self.write_event = asyncio.Event() + self.write_event.set() + + def connection_lost(self, exc: Exception | None) -> None: + self.read_event.set() + self.write_event.set() + + def datagram_received(self, data: bytes, addr: IPSockAddrType) -> None: + addr = convert_ipv6_sockaddr(addr) + self.read_queue.append((data, addr)) + self.read_event.set() + + def error_received(self, exc: Exception) -> None: + self.exception = exc + + def pause_writing(self) -> None: + self.write_event.clear() + + def resume_writing(self) -> None: + self.write_event.set() + + +class SocketStream(abc.SocketStream): + def __init__(self, transport: asyncio.Transport, protocol: StreamProtocol): + self._transport = transport + self._protocol = protocol + self._receive_guard = ResourceGuard("reading from") + self._send_guard = ResourceGuard("writing to") + self._closed = False + + @property + def _raw_socket(self) -> socket.socket: + return self._transport.get_extra_info("socket") + + async def receive(self, max_bytes: int = 65536) -> bytes: + with self._receive_guard: + if ( + not self._protocol.read_event.is_set() + and not self._transport.is_closing() + and not self._protocol.is_at_eof + ): + self._transport.resume_reading() + await self._protocol.read_event.wait() + self._transport.pause_reading() + else: + await AsyncIOBackend.checkpoint() + + try: + chunk = self._protocol.read_queue.popleft() + except IndexError: + if self._closed: + raise ClosedResourceError from None + elif self._protocol.exception: + raise self._protocol.exception from None + else: + raise EndOfStream from None + + if len(chunk) > max_bytes: + # Split the oversized chunk + chunk, leftover = chunk[:max_bytes], chunk[max_bytes:] + self._protocol.read_queue.appendleft(leftover) + + # If the read queue is empty, clear the flag so that the next call will + # block until data is available + if not self._protocol.read_queue: + self._protocol.read_event.clear() + + return chunk + + async def send(self, item: bytes) -> None: + with self._send_guard: + await AsyncIOBackend.checkpoint() + + if self._closed: + raise ClosedResourceError + elif self._protocol.exception is not None: + raise self._protocol.exception + + try: + self._transport.write(item) + except RuntimeError as exc: + if self._transport.is_closing(): + raise BrokenResourceError from exc + else: + raise + + await self._protocol.write_event.wait() + + async def send_eof(self) -> None: + try: + self._transport.write_eof() + except OSError: + pass + + async def aclose(self) -> None: + self._closed = True + if not self._transport.is_closing(): + try: + self._transport.write_eof() + except OSError: + pass + + self._transport.close() + await sleep(0) + self._transport.abort() + + +class _RawSocketMixin: + _receive_future: asyncio.Future | None = None + _send_future: asyncio.Future | None = None + _closing = False + + def __init__(self, raw_socket: socket.socket): + self.__raw_socket = raw_socket + self._receive_guard = ResourceGuard("reading from") + self._send_guard = ResourceGuard("writing to") + + @property + def _raw_socket(self) -> socket.socket: + return self.__raw_socket + + def _wait_until_readable(self, loop: asyncio.AbstractEventLoop) -> asyncio.Future: + def callback(f: object) -> None: + del self._receive_future + loop.remove_reader(self.__raw_socket) + + f = self._receive_future = asyncio.Future() + loop.add_reader(self.__raw_socket, f.set_result, None) + f.add_done_callback(callback) + return f + + def _wait_until_writable(self, loop: asyncio.AbstractEventLoop) -> asyncio.Future: + def callback(f: object) -> None: + del self._send_future + loop.remove_writer(self.__raw_socket) + + f = self._send_future = asyncio.Future() + loop.add_writer(self.__raw_socket, f.set_result, None) + f.add_done_callback(callback) + return f + + async def aclose(self) -> None: + if not self._closing: + self._closing = True + if self.__raw_socket.fileno() != -1: + self.__raw_socket.close() + + if self._receive_future: + self._receive_future.set_result(None) + if self._send_future: + self._send_future.set_result(None) + + +class UNIXSocketStream(_RawSocketMixin, abc.UNIXSocketStream): + async def send_eof(self) -> None: + with self._send_guard: + self._raw_socket.shutdown(socket.SHUT_WR) + + async def receive(self, max_bytes: int = 65536) -> bytes: + loop = get_running_loop() + await AsyncIOBackend.checkpoint() + with self._receive_guard: + while True: + try: + data = self._raw_socket.recv(max_bytes) + except BlockingIOError: + await self._wait_until_readable(loop) + except OSError as exc: + if self._closing: + raise ClosedResourceError from None + else: + raise BrokenResourceError from exc + else: + if not data: + raise EndOfStream + + return data + + async def send(self, item: bytes) -> None: + loop = get_running_loop() + await AsyncIOBackend.checkpoint() + with self._send_guard: + view = memoryview(item) + while view: + try: + bytes_sent = self._raw_socket.send(view) + except BlockingIOError: + await self._wait_until_writable(loop) + except OSError as exc: + if self._closing: + raise ClosedResourceError from None + else: + raise BrokenResourceError from exc + else: + view = view[bytes_sent:] + + async def receive_fds(self, msglen: int, maxfds: int) -> tuple[bytes, list[int]]: + if not isinstance(msglen, int) or msglen < 0: + raise ValueError("msglen must be a non-negative integer") + if not isinstance(maxfds, int) or maxfds < 1: + raise ValueError("maxfds must be a positive integer") + + loop = get_running_loop() + fds = array.array("i") + await AsyncIOBackend.checkpoint() + with self._receive_guard: + while True: + try: + message, ancdata, flags, addr = self._raw_socket.recvmsg( + msglen, socket.CMSG_LEN(maxfds * fds.itemsize) + ) + except BlockingIOError: + await self._wait_until_readable(loop) + except OSError as exc: + if self._closing: + raise ClosedResourceError from None + else: + raise BrokenResourceError from exc + else: + if not message and not ancdata: + raise EndOfStream + + break + + for cmsg_level, cmsg_type, cmsg_data in ancdata: + if cmsg_level != socket.SOL_SOCKET or cmsg_type != socket.SCM_RIGHTS: + raise RuntimeError( + f"Received unexpected ancillary data; message = {message!r}, " + f"cmsg_level = {cmsg_level}, cmsg_type = {cmsg_type}" + ) + + fds.frombytes(cmsg_data[: len(cmsg_data) - (len(cmsg_data) % fds.itemsize)]) + + return message, list(fds) + + async def send_fds(self, message: bytes, fds: Collection[int | IOBase]) -> None: + if not message: + raise ValueError("message must not be empty") + if not fds: + raise ValueError("fds must not be empty") + + loop = get_running_loop() + filenos: list[int] = [] + for fd in fds: + if isinstance(fd, int): + filenos.append(fd) + elif isinstance(fd, IOBase): + filenos.append(fd.fileno()) + + fdarray = array.array("i", filenos) + await AsyncIOBackend.checkpoint() + with self._send_guard: + while True: + try: + # The ignore can be removed after mypy picks up + # https://github.com/python/typeshed/pull/5545 + self._raw_socket.sendmsg( + [message], [(socket.SOL_SOCKET, socket.SCM_RIGHTS, fdarray)] + ) + break + except BlockingIOError: + await self._wait_until_writable(loop) + except OSError as exc: + if self._closing: + raise ClosedResourceError from None + else: + raise BrokenResourceError from exc + + +class TCPSocketListener(abc.SocketListener): + _accept_scope: CancelScope | None = None + _closed = False + + def __init__(self, raw_socket: socket.socket): + self.__raw_socket = raw_socket + self._loop = cast(asyncio.BaseEventLoop, get_running_loop()) + self._accept_guard = ResourceGuard("accepting connections from") + + @property + def _raw_socket(self) -> socket.socket: + return self.__raw_socket + + async def accept(self) -> abc.SocketStream: + if self._closed: + raise ClosedResourceError + + with self._accept_guard: + await AsyncIOBackend.checkpoint() + with CancelScope() as self._accept_scope: + try: + client_sock, _addr = await self._loop.sock_accept(self._raw_socket) + except asyncio.CancelledError: + # Workaround for https://bugs.python.org/issue41317 + try: + self._loop.remove_reader(self._raw_socket) + except (ValueError, NotImplementedError): + pass + + if self._closed: + raise ClosedResourceError from None + + raise + finally: + self._accept_scope = None + + client_sock.setsockopt(socket.IPPROTO_TCP, socket.TCP_NODELAY, 1) + transport, protocol = await self._loop.connect_accepted_socket( + StreamProtocol, client_sock + ) + return SocketStream(transport, protocol) + + async def aclose(self) -> None: + if self._closed: + return + + self._closed = True + if self._accept_scope: + # Workaround for https://bugs.python.org/issue41317 + try: + self._loop.remove_reader(self._raw_socket) + except (ValueError, NotImplementedError): + pass + + self._accept_scope.cancel() + await sleep(0) + + self._raw_socket.close() + + +class UNIXSocketListener(abc.SocketListener): + def __init__(self, raw_socket: socket.socket): + self.__raw_socket = raw_socket + self._loop = get_running_loop() + self._accept_guard = ResourceGuard("accepting connections from") + self._closed = False + + async def accept(self) -> abc.SocketStream: + await AsyncIOBackend.checkpoint() + with self._accept_guard: + while True: + try: + client_sock, _ = self.__raw_socket.accept() + client_sock.setblocking(False) + return UNIXSocketStream(client_sock) + except BlockingIOError: + f: asyncio.Future = asyncio.Future() + self._loop.add_reader(self.__raw_socket, f.set_result, None) + f.add_done_callback( + lambda _: self._loop.remove_reader(self.__raw_socket) + ) + await f + except OSError as exc: + if self._closed: + raise ClosedResourceError from None + else: + raise BrokenResourceError from exc + + async def aclose(self) -> None: + self._closed = True + self.__raw_socket.close() + + @property + def _raw_socket(self) -> socket.socket: + return self.__raw_socket + + +class UDPSocket(abc.UDPSocket): + def __init__( + self, transport: asyncio.DatagramTransport, protocol: DatagramProtocol + ): + self._transport = transport + self._protocol = protocol + self._receive_guard = ResourceGuard("reading from") + self._send_guard = ResourceGuard("writing to") + self._closed = False + + @property + def _raw_socket(self) -> socket.socket: + return self._transport.get_extra_info("socket") + + async def aclose(self) -> None: + self._closed = True + if not self._transport.is_closing(): + self._transport.close() + + async def receive(self) -> tuple[bytes, IPSockAddrType]: + with self._receive_guard: + await AsyncIOBackend.checkpoint() + + # If the buffer is empty, ask for more data + if not self._protocol.read_queue and not self._transport.is_closing(): + self._protocol.read_event.clear() + await self._protocol.read_event.wait() + + try: + return self._protocol.read_queue.popleft() + except IndexError: + if self._closed: + raise ClosedResourceError from None + else: + raise BrokenResourceError from None + + async def send(self, item: UDPPacketType) -> None: + with self._send_guard: + await AsyncIOBackend.checkpoint() + await self._protocol.write_event.wait() + if self._closed: + raise ClosedResourceError + elif self._transport.is_closing(): + raise BrokenResourceError + else: + self._transport.sendto(*item) + + +class ConnectedUDPSocket(abc.ConnectedUDPSocket): + def __init__( + self, transport: asyncio.DatagramTransport, protocol: DatagramProtocol + ): + self._transport = transport + self._protocol = protocol + self._receive_guard = ResourceGuard("reading from") + self._send_guard = ResourceGuard("writing to") + self._closed = False + + @property + def _raw_socket(self) -> socket.socket: + return self._transport.get_extra_info("socket") + + async def aclose(self) -> None: + self._closed = True + if not self._transport.is_closing(): + self._transport.close() + + async def receive(self) -> bytes: + with self._receive_guard: + await AsyncIOBackend.checkpoint() + + # If the buffer is empty, ask for more data + if not self._protocol.read_queue and not self._transport.is_closing(): + self._protocol.read_event.clear() + await self._protocol.read_event.wait() + + try: + packet = self._protocol.read_queue.popleft() + except IndexError: + if self._closed: + raise ClosedResourceError from None + else: + raise BrokenResourceError from None + + return packet[0] + + async def send(self, item: bytes) -> None: + with self._send_guard: + await AsyncIOBackend.checkpoint() + await self._protocol.write_event.wait() + if self._closed: + raise ClosedResourceError + elif self._transport.is_closing(): + raise BrokenResourceError + else: + self._transport.sendto(item) + + +class UNIXDatagramSocket(_RawSocketMixin, abc.UNIXDatagramSocket): + async def receive(self) -> UNIXDatagramPacketType: + loop = get_running_loop() + await AsyncIOBackend.checkpoint() + with self._receive_guard: + while True: + try: + data = self._raw_socket.recvfrom(65536) + except BlockingIOError: + await self._wait_until_readable(loop) + except OSError as exc: + if self._closing: + raise ClosedResourceError from None + else: + raise BrokenResourceError from exc + else: + return data + + async def send(self, item: UNIXDatagramPacketType) -> None: + loop = get_running_loop() + await AsyncIOBackend.checkpoint() + with self._send_guard: + while True: + try: + self._raw_socket.sendto(*item) + except BlockingIOError: + await self._wait_until_writable(loop) + except OSError as exc: + if self._closing: + raise ClosedResourceError from None + else: + raise BrokenResourceError from exc + else: + return + + +class ConnectedUNIXDatagramSocket(_RawSocketMixin, abc.ConnectedUNIXDatagramSocket): + async def receive(self) -> bytes: + loop = get_running_loop() + await AsyncIOBackend.checkpoint() + with self._receive_guard: + while True: + try: + data = self._raw_socket.recv(65536) + except BlockingIOError: + await self._wait_until_readable(loop) + except OSError as exc: + if self._closing: + raise ClosedResourceError from None + else: + raise BrokenResourceError from exc + else: + return data + + async def send(self, item: bytes) -> None: + loop = get_running_loop() + await AsyncIOBackend.checkpoint() + with self._send_guard: + while True: + try: + self._raw_socket.send(item) + except BlockingIOError: + await self._wait_until_writable(loop) + except OSError as exc: + if self._closing: + raise ClosedResourceError from None + else: + raise BrokenResourceError from exc + else: + return + + +_read_events: RunVar[dict[int, asyncio.Future[bool]]] = RunVar("read_events") +_write_events: RunVar[dict[int, asyncio.Future[bool]]] = RunVar("write_events") + + +# +# Synchronization +# + + +class Event(BaseEvent): + def __new__(cls) -> Event: + return object.__new__(cls) + + def __init__(self) -> None: + self._event = asyncio.Event() + + def set(self) -> None: + self._event.set() + + def is_set(self) -> bool: + return self._event.is_set() + + async def wait(self) -> None: + if self.is_set(): + await AsyncIOBackend.checkpoint() + else: + await self._event.wait() + + def statistics(self) -> EventStatistics: + return EventStatistics(len(self._event._waiters)) + + +class Lock(BaseLock): + def __new__(cls, *, fast_acquire: bool = False) -> Lock: + return object.__new__(cls) + + def __init__(self, *, fast_acquire: bool = False) -> None: + self._fast_acquire = fast_acquire + self._owner_task: asyncio.Task | None = None + self._waiters: deque[tuple[asyncio.Task, asyncio.Future]] = deque() + + async def acquire(self) -> None: + task = cast(asyncio.Task, current_task()) + if self._owner_task is None and not self._waiters: + await AsyncIOBackend.checkpoint_if_cancelled() + self._owner_task = task + + # Unless on the "fast path", yield control of the event loop so that other + # tasks can run too + if not self._fast_acquire: + try: + await AsyncIOBackend.cancel_shielded_checkpoint() + except CancelledError: + self.release() + raise + + return + + if self._owner_task == task: + raise RuntimeError("Attempted to acquire an already held Lock") + + fut: asyncio.Future[None] = asyncio.Future() + item = task, fut + self._waiters.append(item) + try: + await fut + except CancelledError: + self._waiters.remove(item) + if self._owner_task is task: + self.release() + + raise + + self._waiters.remove(item) + + def acquire_nowait(self) -> None: + task = cast(asyncio.Task, current_task()) + if self._owner_task is None and not self._waiters: + self._owner_task = task + return + + if self._owner_task is task: + raise RuntimeError("Attempted to acquire an already held Lock") + + raise WouldBlock + + def locked(self) -> bool: + return self._owner_task is not None + + def release(self) -> None: + if self._owner_task != current_task(): + raise RuntimeError("The current task is not holding this lock") + + for task, fut in self._waiters: + if not fut.cancelled(): + self._owner_task = task + fut.set_result(None) + return + + self._owner_task = None + + def statistics(self) -> LockStatistics: + task_info = AsyncIOTaskInfo(self._owner_task) if self._owner_task else None + return LockStatistics(self.locked(), task_info, len(self._waiters)) + + +class Semaphore(BaseSemaphore): + def __new__( + cls, + initial_value: int, + *, + max_value: int | None = None, + fast_acquire: bool = False, + ) -> Semaphore: + return object.__new__(cls) + + def __init__( + self, + initial_value: int, + *, + max_value: int | None = None, + fast_acquire: bool = False, + ): + super().__init__(initial_value, max_value=max_value) + self._value = initial_value + self._max_value = max_value + self._fast_acquire = fast_acquire + self._waiters: deque[asyncio.Future[None]] = deque() + + async def acquire(self) -> None: + if self._value > 0 and not self._waiters: + await AsyncIOBackend.checkpoint_if_cancelled() + self._value -= 1 + + # Unless on the "fast path", yield control of the event loop so that other + # tasks can run too + if not self._fast_acquire: + try: + await AsyncIOBackend.cancel_shielded_checkpoint() + except CancelledError: + self.release() + raise + + return + + fut: asyncio.Future[None] = asyncio.Future() + self._waiters.append(fut) + try: + await fut + except CancelledError: + try: + self._waiters.remove(fut) + except ValueError: + self.release() + + raise + + def acquire_nowait(self) -> None: + if self._value == 0: + raise WouldBlock + + self._value -= 1 + + def release(self) -> None: + if self._max_value is not None and self._value == self._max_value: + raise ValueError("semaphore released too many times") + + for fut in self._waiters: + if not fut.cancelled(): + fut.set_result(None) + self._waiters.remove(fut) + return + + self._value += 1 + + @property + def value(self) -> int: + return self._value + + @property + def max_value(self) -> int | None: + return self._max_value + + def statistics(self) -> SemaphoreStatistics: + return SemaphoreStatistics(len(self._waiters)) + + +class CapacityLimiter(BaseCapacityLimiter): + _total_tokens: float = 0 + + def __new__(cls, total_tokens: float) -> CapacityLimiter: + return object.__new__(cls) + + def __init__(self, total_tokens: float): + self._borrowers: set[Any] = set() + self._wait_queue: OrderedDict[Any, asyncio.Event] = OrderedDict() + self.total_tokens = total_tokens + + async def __aenter__(self) -> None: + await self.acquire() + + async def __aexit__( + self, + exc_type: type[BaseException] | None, + exc_val: BaseException | None, + exc_tb: TracebackType | None, + ) -> None: + self.release() + + @property + def total_tokens(self) -> float: + return self._total_tokens + + @total_tokens.setter + def total_tokens(self, value: float) -> None: + if not isinstance(value, int) and not math.isinf(value): + raise TypeError("total_tokens must be an int or math.inf") + + if value < 0: + raise ValueError("total_tokens must be >= 0") + + waiters_to_notify = max(value - self._total_tokens, 0) + self._total_tokens = value + + # Notify waiting tasks that they have acquired the limiter + while self._wait_queue and waiters_to_notify: + event = self._wait_queue.popitem(last=False)[1] + event.set() + waiters_to_notify -= 1 + + @property + def borrowed_tokens(self) -> int: + return len(self._borrowers) + + @property + def available_tokens(self) -> float: + return self._total_tokens - len(self._borrowers) + + def _notify_next_waiter(self) -> None: + """Notify the next task in line if this limiter has free capacity now.""" + if self._wait_queue and len(self._borrowers) < self._total_tokens: + event = self._wait_queue.popitem(last=False)[1] + event.set() + + def acquire_nowait(self) -> None: + self.acquire_on_behalf_of_nowait(current_task()) + + def acquire_on_behalf_of_nowait(self, borrower: object) -> None: + if borrower in self._borrowers: + raise RuntimeError( + "this borrower is already holding one of this CapacityLimiter's tokens" + ) + + if self._wait_queue or len(self._borrowers) >= self._total_tokens: + raise WouldBlock + + self._borrowers.add(borrower) + + async def acquire(self) -> None: + return await self.acquire_on_behalf_of(current_task()) + + async def acquire_on_behalf_of(self, borrower: object) -> None: + await AsyncIOBackend.checkpoint_if_cancelled() + try: + self.acquire_on_behalf_of_nowait(borrower) + except WouldBlock: + event = asyncio.Event() + self._wait_queue[borrower] = event + try: + await event.wait() + except BaseException: + self._wait_queue.pop(borrower, None) + if event.is_set(): + self._notify_next_waiter() + + raise + + self._borrowers.add(borrower) + else: + try: + await AsyncIOBackend.cancel_shielded_checkpoint() + except BaseException: + self.release() + raise + + def release(self) -> None: + self.release_on_behalf_of(current_task()) + + def release_on_behalf_of(self, borrower: object) -> None: + try: + self._borrowers.remove(borrower) + except KeyError: + raise RuntimeError( + "this borrower isn't holding any of this CapacityLimiter's tokens" + ) from None + + self._notify_next_waiter() + + def statistics(self) -> CapacityLimiterStatistics: + return CapacityLimiterStatistics( + self.borrowed_tokens, + self.total_tokens, + tuple(self._borrowers), + len(self._wait_queue), + ) + + +_default_thread_limiter: RunVar[CapacityLimiter] = RunVar("_default_thread_limiter") + + +# +# Operating system signals +# + + +class _SignalReceiver: + def __init__(self, signals: tuple[Signals, ...]): + self._signals = signals + self._loop = get_running_loop() + self._signal_queue: deque[Signals] = deque() + self._future: asyncio.Future = asyncio.Future() + self._handled_signals: set[Signals] = set() + + def _deliver(self, signum: Signals) -> None: + self._signal_queue.append(signum) + if not self._future.done(): + self._future.set_result(None) + + def __enter__(self) -> _SignalReceiver: + for sig in set(self._signals): + self._loop.add_signal_handler(sig, self._deliver, sig) + self._handled_signals.add(sig) + + return self + + def __exit__( + self, + exc_type: type[BaseException] | None, + exc_val: BaseException | None, + exc_tb: TracebackType | None, + ) -> None: + for sig in self._handled_signals: + self._loop.remove_signal_handler(sig) + + def __aiter__(self) -> _SignalReceiver: + return self + + async def __anext__(self) -> Signals: + await AsyncIOBackend.checkpoint() + if not self._signal_queue: + self._future = asyncio.Future() + await self._future + + return self._signal_queue.popleft() + + +# +# Testing and debugging +# + + +class AsyncIOTaskInfo(TaskInfo): + def __init__(self, task: asyncio.Task): + task_state = _task_states.get(task) + if task_state is None: + parent_id = None + else: + parent_id = task_state.parent_id + + coro = task.get_coro() + assert coro is not None, "created TaskInfo from a completed Task" + super().__init__(id(task), parent_id, task.get_name(), coro) + self._task = weakref.ref(task) + + def has_pending_cancellation(self) -> bool: + if not (task := self._task()): + # If the task isn't around anymore, it won't have a pending cancellation + return False + + if task._must_cancel: # type: ignore[attr-defined] + return True + elif ( + isinstance(task._fut_waiter, asyncio.Future) # type: ignore[attr-defined] + and task._fut_waiter.cancelled() # type: ignore[attr-defined] + ): + return True + + if task_state := _task_states.get(task): + if cancel_scope := task_state.cancel_scope: + return cancel_scope._effectively_cancelled + + return False + + +class TestRunner(abc.TestRunner): + _send_stream: MemoryObjectSendStream[tuple[Awaitable[Any], asyncio.Future[Any]]] + + def __init__( + self, + *, + debug: bool | None = None, + use_uvloop: bool = False, + loop_factory: Callable[[], AbstractEventLoop] | None = None, + ) -> None: + if use_uvloop and loop_factory is None: + if sys.platform != "win32": + import uvloop + + loop_factory = uvloop.new_event_loop + else: + import winloop + + loop_factory = winloop.new_event_loop + + self._runner = Runner(debug=debug, loop_factory=loop_factory) + self._exceptions: list[BaseException] = [] + self._runner_task: asyncio.Task | None = None + + def __enter__(self) -> TestRunner: + self._runner.__enter__() + self.get_loop().set_exception_handler(self._exception_handler) + return self + + def __exit__( + self, + exc_type: type[BaseException] | None, + exc_val: BaseException | None, + exc_tb: TracebackType | None, + ) -> None: + self._runner.__exit__(exc_type, exc_val, exc_tb) + + def get_loop(self) -> AbstractEventLoop: + return self._runner.get_loop() + + def _exception_handler( + self, loop: asyncio.AbstractEventLoop, context: dict[str, Any] + ) -> None: + if isinstance(context.get("exception"), Exception): + self._exceptions.append(context["exception"]) + else: + loop.default_exception_handler(context) + + def _raise_async_exceptions(self) -> None: + # Re-raise any exceptions raised in asynchronous callbacks + if self._exceptions: + exceptions, self._exceptions = self._exceptions, [] + if len(exceptions) == 1: + raise exceptions[0] + elif exceptions: + raise BaseExceptionGroup( + "Multiple exceptions occurred in asynchronous callbacks", exceptions + ) + + async def _run_tests_and_fixtures( + self, + receive_stream: MemoryObjectReceiveStream[ + tuple[Awaitable[T_Retval], asyncio.Future[T_Retval]] + ], + ) -> None: + from _pytest.outcomes import OutcomeException + + with receive_stream, self._send_stream: + async for coro, future in receive_stream: + try: + retval = await coro + except CancelledError as exc: + if not future.cancelled(): + future.cancel(*exc.args) + + raise + except BaseException as exc: + if not future.cancelled(): + future.set_exception(exc) + + if not isinstance(exc, (Exception, OutcomeException)): + raise + else: + if not future.cancelled(): + future.set_result(retval) + + async def _call_in_runner_task( + self, + func: Callable[P, Awaitable[T_Retval]], + *args: P.args, + **kwargs: P.kwargs, + ) -> T_Retval: + if not self._runner_task: + self._send_stream, receive_stream = create_memory_object_stream[ + tuple[Awaitable[Any], asyncio.Future] + ](1) + self._runner_task = self.get_loop().create_task( + self._run_tests_and_fixtures(receive_stream) + ) + + coro = func(*args, **kwargs) + future: asyncio.Future[T_Retval] = self.get_loop().create_future() + self._send_stream.send_nowait((coro, future)) + return await future + + def run_asyncgen_fixture( + self, + fixture_func: Callable[..., AsyncGenerator[T_Retval, Any]], + kwargs: dict[str, Any], + ) -> Iterable[T_Retval]: + asyncgen = fixture_func(**kwargs) + fixturevalue: T_Retval = self.get_loop().run_until_complete( + self._call_in_runner_task(asyncgen.asend, None) + ) + self._raise_async_exceptions() + + yield fixturevalue + + try: + self.get_loop().run_until_complete( + self._call_in_runner_task(asyncgen.asend, None) + ) + except StopAsyncIteration: + self._raise_async_exceptions() + else: + self.get_loop().run_until_complete(asyncgen.aclose()) + raise RuntimeError("Async generator fixture did not stop") + + def run_fixture( + self, + fixture_func: Callable[..., Coroutine[Any, Any, T_Retval]], + kwargs: dict[str, Any], + ) -> T_Retval: + retval = self.get_loop().run_until_complete( + self._call_in_runner_task(fixture_func, **kwargs) + ) + self._raise_async_exceptions() + return retval + + def run_test( + self, test_func: Callable[..., Coroutine[Any, Any, Any]], kwargs: dict[str, Any] + ) -> None: + try: + self.get_loop().run_until_complete( + self._call_in_runner_task(test_func, **kwargs) + ) + except Exception as exc: + self._exceptions.append(exc) + + self._raise_async_exceptions() + + +class AsyncIOBackend(AsyncBackend): + @classmethod + def run( + cls, + func: Callable[[Unpack[PosArgsT]], Awaitable[T_Retval]], + args: tuple[Unpack[PosArgsT]], + kwargs: dict[str, Any], + options: dict[str, Any], + ) -> T_Retval: + @wraps(func) + async def wrapper() -> T_Retval: + task = cast(asyncio.Task, current_task()) + task.set_name(get_callable_name(func)) + _task_states[task] = TaskState(None, None) + + try: + return await func(*args) + finally: + del _task_states[task] + + debug = options.get("debug", None) + loop_factory = options.get("loop_factory", None) + if loop_factory is None and options.get("use_uvloop", False): + if sys.platform != "win32": + import uvloop + + loop_factory = uvloop.new_event_loop + else: + import winloop + + loop_factory = winloop.new_event_loop + + with Runner(debug=debug, loop_factory=loop_factory) as runner: + return runner.run(wrapper()) + + @classmethod + def current_token(cls) -> object: + return get_running_loop() + + @classmethod + def current_time(cls) -> float: + return get_running_loop().time() + + @classmethod + def cancelled_exception_class(cls) -> type[BaseException]: + return CancelledError + + @classmethod + async def checkpoint(cls) -> None: + await sleep(0) + + @classmethod + async def checkpoint_if_cancelled(cls) -> None: + task = current_task() + if task is None: + return + + try: + cancel_scope = _task_states[task].cancel_scope + except KeyError: + return + + while cancel_scope: + if cancel_scope.cancel_called: + await sleep(0) + elif cancel_scope.shield: + break + else: + cancel_scope = cancel_scope._parent_scope + + @classmethod + async def cancel_shielded_checkpoint(cls) -> None: + with CancelScope(shield=True): + await sleep(0) + + @classmethod + async def sleep(cls, delay: float) -> None: + await sleep(delay) + + @classmethod + def create_cancel_scope( + cls, *, deadline: float = math.inf, shield: bool = False + ) -> CancelScope: + return CancelScope(deadline=deadline, shield=shield) + + @classmethod + def current_effective_deadline(cls) -> float: + if (task := current_task()) is None: + return math.inf + + try: + cancel_scope = _task_states[task].cancel_scope + except KeyError: + return math.inf + + deadline = math.inf + while cancel_scope: + deadline = min(deadline, cancel_scope.deadline) + if cancel_scope._cancel_called: + deadline = -math.inf + break + elif cancel_scope.shield: + break + else: + cancel_scope = cancel_scope._parent_scope + + return deadline + + @classmethod + def create_task_group(cls) -> abc.TaskGroup: + return TaskGroup() + + @classmethod + def create_event(cls) -> abc.Event: + return Event() + + @classmethod + def create_lock(cls, *, fast_acquire: bool) -> abc.Lock: + return Lock(fast_acquire=fast_acquire) + + @classmethod + def create_semaphore( + cls, + initial_value: int, + *, + max_value: int | None = None, + fast_acquire: bool = False, + ) -> abc.Semaphore: + return Semaphore(initial_value, max_value=max_value, fast_acquire=fast_acquire) + + @classmethod + def create_capacity_limiter(cls, total_tokens: float) -> abc.CapacityLimiter: + return CapacityLimiter(total_tokens) + + @classmethod + async def run_sync_in_worker_thread( # type: ignore[return] + cls, + func: Callable[[Unpack[PosArgsT]], T_Retval], + args: tuple[Unpack[PosArgsT]], + abandon_on_cancel: bool = False, + limiter: abc.CapacityLimiter | None = None, + ) -> T_Retval: + await cls.checkpoint() + + # If this is the first run in this event loop thread, set up the necessary + # variables + try: + idle_workers = _threadpool_idle_workers.get() + workers = _threadpool_workers.get() + except LookupError: + idle_workers = deque() + workers = set() + _threadpool_idle_workers.set(idle_workers) + _threadpool_workers.set(workers) + + async with limiter or cls.current_default_thread_limiter(): + with CancelScope(shield=not abandon_on_cancel) as scope: + future = asyncio.Future[T_Retval]() + root_task = find_root_task() + if not idle_workers: + worker = WorkerThread(root_task, workers, idle_workers) + worker.start() + workers.add(worker) + root_task.add_done_callback( + worker.stop, context=contextvars.Context() + ) + else: + worker = idle_workers.pop() + + # Prune any other workers that have been idle for MAX_IDLE_TIME + # seconds or longer + now = cls.current_time() + while idle_workers: + if ( + now - idle_workers[0].idle_since + < WorkerThread.MAX_IDLE_TIME + ): + break + + expired_worker = idle_workers.popleft() + expired_worker.root_task.remove_done_callback( + expired_worker.stop + ) + expired_worker.stop() + + context = copy_context() + context.run(set_current_async_library, None) + if abandon_on_cancel or scope._parent_scope is None: + worker_scope = scope + else: + worker_scope = scope._parent_scope + + worker.queue.put_nowait((context, func, args, future, worker_scope)) + return await future + + @classmethod + def check_cancelled(cls) -> None: + scope: CancelScope | None = threadlocals.current_cancel_scope + while scope is not None: + if scope.cancel_called: + raise CancelledError(f"Cancelled by cancel scope {id(scope):x}") + + if scope.shield: + return + + scope = scope._parent_scope + + @classmethod + def run_async_from_thread( + cls, + func: Callable[[Unpack[PosArgsT]], Awaitable[T_Retval]], + args: tuple[Unpack[PosArgsT]], + token: object, + ) -> T_Retval: + async def task_wrapper() -> T_Retval: + __tracebackhide__ = True + if scope is not None: + task = cast(asyncio.Task, current_task()) + _task_states[task] = TaskState(None, scope) + scope._tasks.add(task) + try: + return await func(*args) + except CancelledError as exc: + raise concurrent.futures.CancelledError(str(exc)) from None + finally: + if scope is not None: + scope._tasks.discard(task) + + loop = cast( + "AbstractEventLoop", token or threadlocals.current_token.native_token + ) + if loop.is_closed(): + raise RunFinishedError + + context = copy_context() + context.run(set_current_async_library, "asyncio") + scope = getattr(threadlocals, "current_cancel_scope", None) + f: concurrent.futures.Future[T_Retval] = context.run( + asyncio.run_coroutine_threadsafe, task_wrapper(), loop=loop + ) + return f.result() + + @classmethod + def run_sync_from_thread( + cls, + func: Callable[[Unpack[PosArgsT]], T_Retval], + args: tuple[Unpack[PosArgsT]], + token: object, + ) -> T_Retval: + @wraps(func) + def wrapper() -> None: + try: + set_current_async_library("asyncio") + f.set_result(func(*args)) + except BaseException as exc: + f.set_exception(exc) + if not isinstance(exc, Exception): + raise + + loop = cast( + "AbstractEventLoop", token or threadlocals.current_token.native_token + ) + if loop.is_closed(): + raise RunFinishedError + + f: concurrent.futures.Future[T_Retval] = Future() + loop.call_soon_threadsafe(wrapper) + return f.result() + + @classmethod + async def open_process( + cls, + command: StrOrBytesPath | Sequence[StrOrBytesPath], + *, + stdin: int | IO[Any] | None, + stdout: int | IO[Any] | None, + stderr: int | IO[Any] | None, + **kwargs: Any, + ) -> Process: + await cls.checkpoint() + if isinstance(command, PathLike): + command = os.fspath(command) + + if isinstance(command, (str, bytes)): + process = await asyncio.create_subprocess_shell( + command, + stdin=stdin, + stdout=stdout, + stderr=stderr, + **kwargs, + ) + else: + process = await asyncio.create_subprocess_exec( + *command, + stdin=stdin, + stdout=stdout, + stderr=stderr, + **kwargs, + ) + + stdin_stream = StreamWriterWrapper(process.stdin) if process.stdin else None + stdout_stream = StreamReaderWrapper(process.stdout) if process.stdout else None + stderr_stream = StreamReaderWrapper(process.stderr) if process.stderr else None + return Process(process, stdin_stream, stdout_stream, stderr_stream) + + @classmethod + def setup_process_pool_exit_at_shutdown(cls, workers: set[abc.Process]) -> None: + create_task( + _shutdown_process_pool_on_exit(workers), + name="AnyIO process pool shutdown task", + ) + find_root_task().add_done_callback( + partial(_forcibly_shutdown_process_pool_on_exit, workers) # type:ignore[arg-type] + ) + + @classmethod + async def connect_tcp( + cls, host: str, port: int, local_address: IPSockAddrType | None = None + ) -> abc.SocketStream: + transport, protocol = cast( + tuple[asyncio.Transport, StreamProtocol], + await get_running_loop().create_connection( + StreamProtocol, host, port, local_addr=local_address + ), + ) + transport.pause_reading() + return SocketStream(transport, protocol) + + @classmethod + async def connect_unix(cls, path: str | bytes) -> abc.UNIXSocketStream: + await cls.checkpoint() + loop = get_running_loop() + raw_socket = socket.socket(socket.AF_UNIX) + raw_socket.setblocking(False) + while True: + try: + raw_socket.connect(path) + except BlockingIOError: + f: asyncio.Future = asyncio.Future() + loop.add_writer(raw_socket, f.set_result, None) + f.add_done_callback(lambda _: loop.remove_writer(raw_socket)) + await f + except BaseException: + raw_socket.close() + raise + else: + return UNIXSocketStream(raw_socket) + + @classmethod + def create_tcp_listener(cls, sock: socket.socket) -> SocketListener: + return TCPSocketListener(sock) + + @classmethod + def create_unix_listener(cls, sock: socket.socket) -> SocketListener: + return UNIXSocketListener(sock) + + @classmethod + async def create_udp_socket( + cls, + family: AddressFamily, + local_address: IPSockAddrType | None, + remote_address: IPSockAddrType | None, + reuse_port: bool, + ) -> UDPSocket | ConnectedUDPSocket: + transport, protocol = await get_running_loop().create_datagram_endpoint( + DatagramProtocol, + local_addr=local_address, + remote_addr=remote_address, + family=family, + reuse_port=reuse_port, + ) + if protocol.exception: + transport.close() + raise protocol.exception + + if not remote_address: + return UDPSocket(transport, protocol) + else: + return ConnectedUDPSocket(transport, protocol) + + @classmethod + async def create_unix_datagram_socket( # type: ignore[override] + cls, raw_socket: socket.socket, remote_path: str | bytes | None + ) -> abc.UNIXDatagramSocket | abc.ConnectedUNIXDatagramSocket: + await cls.checkpoint() + loop = get_running_loop() + + if remote_path: + while True: + try: + raw_socket.connect(remote_path) + except BlockingIOError: + f: asyncio.Future = asyncio.Future() + loop.add_writer(raw_socket, f.set_result, None) + f.add_done_callback(lambda _: loop.remove_writer(raw_socket)) + await f + except BaseException: + raw_socket.close() + raise + else: + return ConnectedUNIXDatagramSocket(raw_socket) + else: + return UNIXDatagramSocket(raw_socket) + + @classmethod + async def getaddrinfo( + cls, + host: bytes | str | None, + port: str | int | None, + *, + family: int | AddressFamily = 0, + type: int | SocketKind = 0, + proto: int = 0, + flags: int = 0, + ) -> Sequence[ + tuple[ + AddressFamily, + SocketKind, + int, + str, + tuple[str, int] | tuple[str, int, int, int] | tuple[int, bytes], + ] + ]: + return await get_running_loop().getaddrinfo( + host, port, family=family, type=type, proto=proto, flags=flags + ) + + @classmethod + async def getnameinfo( + cls, sockaddr: IPSockAddrType, flags: int = 0 + ) -> tuple[str, str]: + return await get_running_loop().getnameinfo(sockaddr, flags) + + @classmethod + async def wait_readable(cls, obj: FileDescriptorLike) -> None: + try: + read_events = _read_events.get() + except LookupError: + read_events = {} + _read_events.set(read_events) + + fd = obj if isinstance(obj, int) else obj.fileno() + if read_events.get(fd): + raise BusyResourceError("reading from") + + loop = get_running_loop() + fut: asyncio.Future[bool] = loop.create_future() + + def cb() -> None: + try: + del read_events[fd] + except KeyError: + pass + else: + remove_reader(fd) + + try: + fut.set_result(True) + except asyncio.InvalidStateError: + pass + + try: + loop.add_reader(fd, cb) + except NotImplementedError: + from anyio._core._asyncio_selector_thread import get_selector + + selector = get_selector() + selector.add_reader(fd, cb) + remove_reader = selector.remove_reader + else: + remove_reader = loop.remove_reader + + read_events[fd] = fut + try: + success = await fut + finally: + try: + del read_events[fd] + except KeyError: + pass + else: + remove_reader(fd) + + if not success: + raise ClosedResourceError + + @classmethod + async def wait_writable(cls, obj: FileDescriptorLike) -> None: + try: + write_events = _write_events.get() + except LookupError: + write_events = {} + _write_events.set(write_events) + + fd = obj if isinstance(obj, int) else obj.fileno() + if write_events.get(fd): + raise BusyResourceError("writing to") + + loop = get_running_loop() + fut: asyncio.Future[bool] = loop.create_future() + + def cb() -> None: + try: + del write_events[fd] + except KeyError: + pass + else: + remove_writer(fd) + + try: + fut.set_result(True) + except asyncio.InvalidStateError: + pass + + try: + loop.add_writer(fd, cb) + except NotImplementedError: + from anyio._core._asyncio_selector_thread import get_selector + + selector = get_selector() + selector.add_writer(fd, cb) + remove_writer = selector.remove_writer + else: + remove_writer = loop.remove_writer + + write_events[fd] = fut + try: + success = await fut + finally: + try: + del write_events[fd] + except KeyError: + pass + else: + remove_writer(fd) + + if not success: + raise ClosedResourceError + + @classmethod + def notify_closing(cls, obj: FileDescriptorLike) -> None: + fd = obj if isinstance(obj, int) else obj.fileno() + loop = get_running_loop() + + try: + write_events = _write_events.get() + except LookupError: + pass + else: + try: + fut = write_events.pop(fd) + except KeyError: + pass + else: + try: + fut.set_result(False) + except asyncio.InvalidStateError: + pass + + try: + loop.remove_writer(fd) + except NotImplementedError: + from anyio._core._asyncio_selector_thread import get_selector + + get_selector().remove_writer(fd) + + try: + read_events = _read_events.get() + except LookupError: + pass + else: + try: + fut = read_events.pop(fd) + except KeyError: + pass + else: + try: + fut.set_result(False) + except asyncio.InvalidStateError: + pass + + try: + loop.remove_reader(fd) + except NotImplementedError: + from anyio._core._asyncio_selector_thread import get_selector + + get_selector().remove_reader(fd) + + @classmethod + async def wrap_listener_socket(cls, sock: socket.socket) -> SocketListener: + return TCPSocketListener(sock) + + @classmethod + async def wrap_stream_socket(cls, sock: socket.socket) -> SocketStream: + transport, protocol = await get_running_loop().create_connection( + StreamProtocol, sock=sock + ) + return SocketStream(transport, protocol) + + @classmethod + async def wrap_unix_stream_socket(cls, sock: socket.socket) -> UNIXSocketStream: + return UNIXSocketStream(sock) + + @classmethod + async def wrap_udp_socket(cls, sock: socket.socket) -> UDPSocket: + transport, protocol = await get_running_loop().create_datagram_endpoint( + DatagramProtocol, sock=sock + ) + return UDPSocket(transport, protocol) + + @classmethod + async def wrap_connected_udp_socket(cls, sock: socket.socket) -> ConnectedUDPSocket: + transport, protocol = await get_running_loop().create_datagram_endpoint( + DatagramProtocol, sock=sock + ) + return ConnectedUDPSocket(transport, protocol) + + @classmethod + async def wrap_unix_datagram_socket(cls, sock: socket.socket) -> UNIXDatagramSocket: + return UNIXDatagramSocket(sock) + + @classmethod + async def wrap_connected_unix_datagram_socket( + cls, sock: socket.socket + ) -> ConnectedUNIXDatagramSocket: + return ConnectedUNIXDatagramSocket(sock) + + @classmethod + def current_default_thread_limiter(cls) -> CapacityLimiter: + try: + return _default_thread_limiter.get() + except LookupError: + limiter = CapacityLimiter(40) + _default_thread_limiter.set(limiter) + return limiter + + @classmethod + def open_signal_receiver( + cls, *signals: Signals + ) -> AbstractContextManager[AsyncIterator[Signals]]: + return _SignalReceiver(signals) + + @classmethod + def get_current_task(cls) -> TaskInfo: + return AsyncIOTaskInfo(current_task()) # type: ignore[arg-type] + + @classmethod + def get_running_tasks(cls) -> Sequence[TaskInfo]: + return [AsyncIOTaskInfo(task) for task in all_tasks() if not task.done()] + + @classmethod + async def wait_all_tasks_blocked(cls) -> None: + await cls.checkpoint() + this_task = current_task() + while True: + for task in all_tasks(): + if task is this_task: + continue + + waiter = task._fut_waiter # type: ignore[attr-defined] + if waiter is None or waiter.done(): + await sleep(0.1) + break + else: + return + + @classmethod + def create_test_runner(cls, options: dict[str, Any]) -> TestRunner: + return TestRunner(**options) + + +backend_class = AsyncIOBackend diff --git a/venv/lib/python3.11/site-packages/anyio/_backends/_trio.py b/venv/lib/python3.11/site-packages/anyio/_backends/_trio.py new file mode 100644 index 0000000..f460a7f --- /dev/null +++ b/venv/lib/python3.11/site-packages/anyio/_backends/_trio.py @@ -0,0 +1,1346 @@ +from __future__ import annotations + +import array +import math +import os +import socket +import sys +import types +import weakref +from collections.abc import ( + AsyncGenerator, + AsyncIterator, + Awaitable, + Callable, + Collection, + Coroutine, + Iterable, + Sequence, +) +from contextlib import AbstractContextManager +from dataclasses import dataclass +from io import IOBase +from os import PathLike +from signal import Signals +from socket import AddressFamily, SocketKind +from types import TracebackType +from typing import ( + IO, + TYPE_CHECKING, + Any, + Generic, + NoReturn, + TypeVar, + cast, + overload, +) + +import trio.from_thread +import trio.lowlevel +from outcome import Error, Outcome, Value +from trio.lowlevel import ( + current_root_task, + current_task, + notify_closing, + wait_readable, + wait_writable, +) +from trio.socket import SocketType as TrioSocketType +from trio.to_thread import run_sync + +from .. import ( + CapacityLimiterStatistics, + EventStatistics, + LockStatistics, + RunFinishedError, + TaskInfo, + WouldBlock, + abc, +) +from .._core._eventloop import claim_worker_thread +from .._core._exceptions import ( + BrokenResourceError, + BusyResourceError, + ClosedResourceError, + EndOfStream, +) +from .._core._sockets import convert_ipv6_sockaddr +from .._core._streams import create_memory_object_stream +from .._core._synchronization import ( + CapacityLimiter as BaseCapacityLimiter, +) +from .._core._synchronization import Event as BaseEvent +from .._core._synchronization import Lock as BaseLock +from .._core._synchronization import ( + ResourceGuard, + SemaphoreStatistics, +) +from .._core._synchronization import Semaphore as BaseSemaphore +from .._core._tasks import CancelScope as BaseCancelScope +from ..abc import IPSockAddrType, UDPPacketType, UNIXDatagramPacketType +from ..abc._eventloop import AsyncBackend, StrOrBytesPath +from ..streams.memory import MemoryObjectSendStream + +if TYPE_CHECKING: + from _typeshed import FileDescriptorLike + +if sys.version_info >= (3, 10): + from typing import ParamSpec +else: + from typing_extensions import ParamSpec + +if sys.version_info >= (3, 11): + from typing import TypeVarTuple, Unpack +else: + from exceptiongroup import BaseExceptionGroup + from typing_extensions import TypeVarTuple, Unpack + +T = TypeVar("T") +T_Retval = TypeVar("T_Retval") +T_SockAddr = TypeVar("T_SockAddr", str, IPSockAddrType) +PosArgsT = TypeVarTuple("PosArgsT") +P = ParamSpec("P") + + +# +# Event loop +# + +RunVar = trio.lowlevel.RunVar + + +# +# Timeouts and cancellation +# + + +class CancelScope(BaseCancelScope): + def __new__( + cls, original: trio.CancelScope | None = None, **kwargs: object + ) -> CancelScope: + return object.__new__(cls) + + def __init__(self, original: trio.CancelScope | None = None, **kwargs: Any) -> None: + self.__original = original or trio.CancelScope(**kwargs) + + def __enter__(self) -> CancelScope: + self.__original.__enter__() + return self + + def __exit__( + self, + exc_type: type[BaseException] | None, + exc_val: BaseException | None, + exc_tb: TracebackType | None, + ) -> bool: + return self.__original.__exit__(exc_type, exc_val, exc_tb) + + def cancel(self, reason: str | None = None) -> None: + self.__original.cancel(reason) + + @property + def deadline(self) -> float: + return self.__original.deadline + + @deadline.setter + def deadline(self, value: float) -> None: + self.__original.deadline = value + + @property + def cancel_called(self) -> bool: + return self.__original.cancel_called + + @property + def cancelled_caught(self) -> bool: + return self.__original.cancelled_caught + + @property + def shield(self) -> bool: + return self.__original.shield + + @shield.setter + def shield(self, value: bool) -> None: + self.__original.shield = value + + +# +# Task groups +# + + +class TaskGroup(abc.TaskGroup): + def __init__(self) -> None: + self._active = False + self._nursery_manager = trio.open_nursery(strict_exception_groups=True) + self.cancel_scope = None # type: ignore[assignment] + + async def __aenter__(self) -> TaskGroup: + self._active = True + self._nursery = await self._nursery_manager.__aenter__() + self.cancel_scope = CancelScope(self._nursery.cancel_scope) + return self + + async def __aexit__( + self, + exc_type: type[BaseException] | None, + exc_val: BaseException | None, + exc_tb: TracebackType | None, + ) -> bool: + try: + # trio.Nursery.__exit__ returns bool; .open_nursery has wrong type + return await self._nursery_manager.__aexit__(exc_type, exc_val, exc_tb) # type: ignore[return-value] + except BaseExceptionGroup as exc: + if not exc.split(trio.Cancelled)[1]: + raise trio.Cancelled._create() from exc + + raise + finally: + del exc_val, exc_tb + self._active = False + + def start_soon( + self, + func: Callable[[Unpack[PosArgsT]], Awaitable[Any]], + *args: Unpack[PosArgsT], + name: object = None, + ) -> None: + if not self._active: + raise RuntimeError( + "This task group is not active; no new tasks can be started." + ) + + self._nursery.start_soon(func, *args, name=name) + + async def start( + self, func: Callable[..., Awaitable[Any]], *args: object, name: object = None + ) -> Any: + if not self._active: + raise RuntimeError( + "This task group is not active; no new tasks can be started." + ) + + return await self._nursery.start(func, *args, name=name) + + +# +# Subprocesses +# + + +@dataclass(eq=False) +class ReceiveStreamWrapper(abc.ByteReceiveStream): + _stream: trio.abc.ReceiveStream + + async def receive(self, max_bytes: int | None = None) -> bytes: + try: + data = await self._stream.receive_some(max_bytes) + except trio.ClosedResourceError as exc: + raise ClosedResourceError from exc.__cause__ + except trio.BrokenResourceError as exc: + raise BrokenResourceError from exc.__cause__ + + if data: + return bytes(data) + else: + raise EndOfStream + + async def aclose(self) -> None: + await self._stream.aclose() + + +@dataclass(eq=False) +class SendStreamWrapper(abc.ByteSendStream): + _stream: trio.abc.SendStream + + async def send(self, item: bytes) -> None: + try: + await self._stream.send_all(item) + except trio.ClosedResourceError as exc: + raise ClosedResourceError from exc.__cause__ + except trio.BrokenResourceError as exc: + raise BrokenResourceError from exc.__cause__ + + async def aclose(self) -> None: + await self._stream.aclose() + + +@dataclass(eq=False) +class Process(abc.Process): + _process: trio.Process + _stdin: abc.ByteSendStream | None + _stdout: abc.ByteReceiveStream | None + _stderr: abc.ByteReceiveStream | None + + async def aclose(self) -> None: + with CancelScope(shield=True): + if self._stdin: + await self._stdin.aclose() + if self._stdout: + await self._stdout.aclose() + if self._stderr: + await self._stderr.aclose() + + try: + await self.wait() + except BaseException: + self.kill() + with CancelScope(shield=True): + await self.wait() + raise + + async def wait(self) -> int: + return await self._process.wait() + + def terminate(self) -> None: + self._process.terminate() + + def kill(self) -> None: + self._process.kill() + + def send_signal(self, signal: Signals) -> None: + self._process.send_signal(signal) + + @property + def pid(self) -> int: + return self._process.pid + + @property + def returncode(self) -> int | None: + return self._process.returncode + + @property + def stdin(self) -> abc.ByteSendStream | None: + return self._stdin + + @property + def stdout(self) -> abc.ByteReceiveStream | None: + return self._stdout + + @property + def stderr(self) -> abc.ByteReceiveStream | None: + return self._stderr + + +class _ProcessPoolShutdownInstrument(trio.abc.Instrument): + def after_run(self) -> None: + super().after_run() + + +current_default_worker_process_limiter: trio.lowlevel.RunVar = RunVar( + "current_default_worker_process_limiter" +) + + +async def _shutdown_process_pool(workers: set[abc.Process]) -> None: + try: + await trio.sleep(math.inf) + except trio.Cancelled: + for process in workers: + if process.returncode is None: + process.kill() + + with CancelScope(shield=True): + for process in workers: + await process.aclose() + + +# +# Sockets and networking +# + + +class _TrioSocketMixin(Generic[T_SockAddr]): + def __init__(self, trio_socket: TrioSocketType) -> None: + self._trio_socket = trio_socket + self._closed = False + + def _check_closed(self) -> None: + if self._closed: + raise ClosedResourceError + if self._trio_socket.fileno() < 0: + raise BrokenResourceError + + @property + def _raw_socket(self) -> socket.socket: + return self._trio_socket._sock # type: ignore[attr-defined] + + async def aclose(self) -> None: + if self._trio_socket.fileno() >= 0: + self._closed = True + self._trio_socket.close() + + def _convert_socket_error(self, exc: BaseException) -> NoReturn: + if isinstance(exc, trio.ClosedResourceError): + raise ClosedResourceError from exc + elif self._trio_socket.fileno() < 0 and self._closed: + raise ClosedResourceError from None + elif isinstance(exc, OSError): + raise BrokenResourceError from exc + else: + raise exc + + +class SocketStream(_TrioSocketMixin, abc.SocketStream): + def __init__(self, trio_socket: TrioSocketType) -> None: + super().__init__(trio_socket) + self._receive_guard = ResourceGuard("reading from") + self._send_guard = ResourceGuard("writing to") + + async def receive(self, max_bytes: int = 65536) -> bytes: + with self._receive_guard: + try: + data = await self._trio_socket.recv(max_bytes) + except BaseException as exc: + self._convert_socket_error(exc) + + if data: + return data + else: + raise EndOfStream + + async def send(self, item: bytes) -> None: + with self._send_guard: + view = memoryview(item) + while view: + try: + bytes_sent = await self._trio_socket.send(view) + except BaseException as exc: + self._convert_socket_error(exc) + + view = view[bytes_sent:] + + async def send_eof(self) -> None: + self._trio_socket.shutdown(socket.SHUT_WR) + + +class UNIXSocketStream(SocketStream, abc.UNIXSocketStream): + async def receive_fds(self, msglen: int, maxfds: int) -> tuple[bytes, list[int]]: + if not isinstance(msglen, int) or msglen < 0: + raise ValueError("msglen must be a non-negative integer") + if not isinstance(maxfds, int) or maxfds < 1: + raise ValueError("maxfds must be a positive integer") + + fds = array.array("i") + await trio.lowlevel.checkpoint() + with self._receive_guard: + while True: + try: + message, ancdata, flags, addr = await self._trio_socket.recvmsg( + msglen, socket.CMSG_LEN(maxfds * fds.itemsize) + ) + except BaseException as exc: + self._convert_socket_error(exc) + else: + if not message and not ancdata: + raise EndOfStream + + break + + for cmsg_level, cmsg_type, cmsg_data in ancdata: + if cmsg_level != socket.SOL_SOCKET or cmsg_type != socket.SCM_RIGHTS: + raise RuntimeError( + f"Received unexpected ancillary data; message = {message!r}, " + f"cmsg_level = {cmsg_level}, cmsg_type = {cmsg_type}" + ) + + fds.frombytes(cmsg_data[: len(cmsg_data) - (len(cmsg_data) % fds.itemsize)]) + + return message, list(fds) + + async def send_fds(self, message: bytes, fds: Collection[int | IOBase]) -> None: + if not message: + raise ValueError("message must not be empty") + if not fds: + raise ValueError("fds must not be empty") + + filenos: list[int] = [] + for fd in fds: + if isinstance(fd, int): + filenos.append(fd) + elif isinstance(fd, IOBase): + filenos.append(fd.fileno()) + + fdarray = array.array("i", filenos) + await trio.lowlevel.checkpoint() + with self._send_guard: + while True: + try: + await self._trio_socket.sendmsg( + [message], + [ + ( + socket.SOL_SOCKET, + socket.SCM_RIGHTS, + fdarray, + ) + ], + ) + break + except BaseException as exc: + self._convert_socket_error(exc) + + +class TCPSocketListener(_TrioSocketMixin, abc.SocketListener): + def __init__(self, raw_socket: socket.socket): + super().__init__(trio.socket.from_stdlib_socket(raw_socket)) + self._accept_guard = ResourceGuard("accepting connections from") + + async def accept(self) -> SocketStream: + with self._accept_guard: + try: + trio_socket, _addr = await self._trio_socket.accept() + except BaseException as exc: + self._convert_socket_error(exc) + + trio_socket.setsockopt(socket.IPPROTO_TCP, socket.TCP_NODELAY, 1) + return SocketStream(trio_socket) + + +class UNIXSocketListener(_TrioSocketMixin, abc.SocketListener): + def __init__(self, raw_socket: socket.socket): + super().__init__(trio.socket.from_stdlib_socket(raw_socket)) + self._accept_guard = ResourceGuard("accepting connections from") + + async def accept(self) -> UNIXSocketStream: + with self._accept_guard: + try: + trio_socket, _addr = await self._trio_socket.accept() + except BaseException as exc: + self._convert_socket_error(exc) + + return UNIXSocketStream(trio_socket) + + +class UDPSocket(_TrioSocketMixin[IPSockAddrType], abc.UDPSocket): + def __init__(self, trio_socket: TrioSocketType) -> None: + super().__init__(trio_socket) + self._receive_guard = ResourceGuard("reading from") + self._send_guard = ResourceGuard("writing to") + + async def receive(self) -> tuple[bytes, IPSockAddrType]: + with self._receive_guard: + try: + data, addr = await self._trio_socket.recvfrom(65536) + return data, convert_ipv6_sockaddr(addr) + except BaseException as exc: + self._convert_socket_error(exc) + + async def send(self, item: UDPPacketType) -> None: + with self._send_guard: + try: + await self._trio_socket.sendto(*item) + except BaseException as exc: + self._convert_socket_error(exc) + + +class ConnectedUDPSocket(_TrioSocketMixin[IPSockAddrType], abc.ConnectedUDPSocket): + def __init__(self, trio_socket: TrioSocketType) -> None: + super().__init__(trio_socket) + self._receive_guard = ResourceGuard("reading from") + self._send_guard = ResourceGuard("writing to") + + async def receive(self) -> bytes: + with self._receive_guard: + try: + return await self._trio_socket.recv(65536) + except BaseException as exc: + self._convert_socket_error(exc) + + async def send(self, item: bytes) -> None: + with self._send_guard: + try: + await self._trio_socket.send(item) + except BaseException as exc: + self._convert_socket_error(exc) + + +class UNIXDatagramSocket(_TrioSocketMixin[str], abc.UNIXDatagramSocket): + def __init__(self, trio_socket: TrioSocketType) -> None: + super().__init__(trio_socket) + self._receive_guard = ResourceGuard("reading from") + self._send_guard = ResourceGuard("writing to") + + async def receive(self) -> UNIXDatagramPacketType: + with self._receive_guard: + try: + data, addr = await self._trio_socket.recvfrom(65536) + return data, addr + except BaseException as exc: + self._convert_socket_error(exc) + + async def send(self, item: UNIXDatagramPacketType) -> None: + with self._send_guard: + try: + await self._trio_socket.sendto(*item) + except BaseException as exc: + self._convert_socket_error(exc) + + +class ConnectedUNIXDatagramSocket( + _TrioSocketMixin[str], abc.ConnectedUNIXDatagramSocket +): + def __init__(self, trio_socket: TrioSocketType) -> None: + super().__init__(trio_socket) + self._receive_guard = ResourceGuard("reading from") + self._send_guard = ResourceGuard("writing to") + + async def receive(self) -> bytes: + with self._receive_guard: + try: + return await self._trio_socket.recv(65536) + except BaseException as exc: + self._convert_socket_error(exc) + + async def send(self, item: bytes) -> None: + with self._send_guard: + try: + await self._trio_socket.send(item) + except BaseException as exc: + self._convert_socket_error(exc) + + +# +# Synchronization +# + + +class Event(BaseEvent): + def __new__(cls) -> Event: + return object.__new__(cls) + + def __init__(self) -> None: + self.__original = trio.Event() + + def is_set(self) -> bool: + return self.__original.is_set() + + async def wait(self) -> None: + return await self.__original.wait() + + def statistics(self) -> EventStatistics: + orig_statistics = self.__original.statistics() + return EventStatistics(tasks_waiting=orig_statistics.tasks_waiting) + + def set(self) -> None: + self.__original.set() + + +class Lock(BaseLock): + def __new__(cls, *, fast_acquire: bool = False) -> Lock: + return object.__new__(cls) + + def __init__(self, *, fast_acquire: bool = False) -> None: + self._fast_acquire = fast_acquire + self.__original = trio.Lock() + + @staticmethod + def _convert_runtime_error_msg(exc: RuntimeError) -> None: + if exc.args == ("attempt to re-acquire an already held Lock",): + exc.args = ("Attempted to acquire an already held Lock",) + + async def acquire(self) -> None: + if not self._fast_acquire: + try: + await self.__original.acquire() + except RuntimeError as exc: + self._convert_runtime_error_msg(exc) + raise + + return + + # This is the "fast path" where we don't let other tasks run + await trio.lowlevel.checkpoint_if_cancelled() + try: + self.__original.acquire_nowait() + except trio.WouldBlock: + await self.__original._lot.park() + except RuntimeError as exc: + self._convert_runtime_error_msg(exc) + raise + + def acquire_nowait(self) -> None: + try: + self.__original.acquire_nowait() + except trio.WouldBlock: + raise WouldBlock from None + except RuntimeError as exc: + self._convert_runtime_error_msg(exc) + raise + + def locked(self) -> bool: + return self.__original.locked() + + def release(self) -> None: + self.__original.release() + + def statistics(self) -> LockStatistics: + orig_statistics = self.__original.statistics() + owner = TrioTaskInfo(orig_statistics.owner) if orig_statistics.owner else None + return LockStatistics( + orig_statistics.locked, owner, orig_statistics.tasks_waiting + ) + + +class Semaphore(BaseSemaphore): + def __new__( + cls, + initial_value: int, + *, + max_value: int | None = None, + fast_acquire: bool = False, + ) -> Semaphore: + return object.__new__(cls) + + def __init__( + self, + initial_value: int, + *, + max_value: int | None = None, + fast_acquire: bool = False, + ) -> None: + super().__init__(initial_value, max_value=max_value, fast_acquire=fast_acquire) + self.__original = trio.Semaphore(initial_value, max_value=max_value) + + async def acquire(self) -> None: + if not self._fast_acquire: + await self.__original.acquire() + return + + # This is the "fast path" where we don't let other tasks run + await trio.lowlevel.checkpoint_if_cancelled() + try: + self.__original.acquire_nowait() + except trio.WouldBlock: + await self.__original._lot.park() + + def acquire_nowait(self) -> None: + try: + self.__original.acquire_nowait() + except trio.WouldBlock: + raise WouldBlock from None + + @property + def max_value(self) -> int | None: + return self.__original.max_value + + @property + def value(self) -> int: + return self.__original.value + + def release(self) -> None: + self.__original.release() + + def statistics(self) -> SemaphoreStatistics: + orig_statistics = self.__original.statistics() + return SemaphoreStatistics(orig_statistics.tasks_waiting) + + +class CapacityLimiter(BaseCapacityLimiter): + def __new__( + cls, + total_tokens: float | None = None, + *, + original: trio.CapacityLimiter | None = None, + ) -> CapacityLimiter: + return object.__new__(cls) + + def __init__( + self, + total_tokens: float | None = None, + *, + original: trio.CapacityLimiter | None = None, + ) -> None: + if original is not None: + self.__original = original + else: + assert total_tokens is not None + self.__original = trio.CapacityLimiter(total_tokens) + + async def __aenter__(self) -> None: + return await self.__original.__aenter__() + + async def __aexit__( + self, + exc_type: type[BaseException] | None, + exc_val: BaseException | None, + exc_tb: TracebackType | None, + ) -> None: + await self.__original.__aexit__(exc_type, exc_val, exc_tb) + + @property + def total_tokens(self) -> float: + return self.__original.total_tokens + + @total_tokens.setter + def total_tokens(self, value: float) -> None: + self.__original.total_tokens = value + + @property + def borrowed_tokens(self) -> int: + return self.__original.borrowed_tokens + + @property + def available_tokens(self) -> float: + return self.__original.available_tokens + + def acquire_nowait(self) -> None: + self.__original.acquire_nowait() + + def acquire_on_behalf_of_nowait(self, borrower: object) -> None: + self.__original.acquire_on_behalf_of_nowait(borrower) + + async def acquire(self) -> None: + await self.__original.acquire() + + async def acquire_on_behalf_of(self, borrower: object) -> None: + await self.__original.acquire_on_behalf_of(borrower) + + def release(self) -> None: + return self.__original.release() + + def release_on_behalf_of(self, borrower: object) -> None: + return self.__original.release_on_behalf_of(borrower) + + def statistics(self) -> CapacityLimiterStatistics: + orig = self.__original.statistics() + return CapacityLimiterStatistics( + borrowed_tokens=orig.borrowed_tokens, + total_tokens=orig.total_tokens, + borrowers=tuple(orig.borrowers), + tasks_waiting=orig.tasks_waiting, + ) + + +_capacity_limiter_wrapper: trio.lowlevel.RunVar = RunVar("_capacity_limiter_wrapper") + + +# +# Signal handling +# + + +class _SignalReceiver: + _iterator: AsyncIterator[int] + + def __init__(self, signals: tuple[Signals, ...]): + self._signals = signals + + def __enter__(self) -> _SignalReceiver: + self._cm = trio.open_signal_receiver(*self._signals) + self._iterator = self._cm.__enter__() + return self + + def __exit__( + self, + exc_type: type[BaseException] | None, + exc_val: BaseException | None, + exc_tb: TracebackType | None, + ) -> bool | None: + return self._cm.__exit__(exc_type, exc_val, exc_tb) + + def __aiter__(self) -> _SignalReceiver: + return self + + async def __anext__(self) -> Signals: + signum = await self._iterator.__anext__() + return Signals(signum) + + +# +# Testing and debugging +# + + +class TestRunner(abc.TestRunner): + def __init__(self, **options: Any) -> None: + from queue import Queue + + self._call_queue: Queue[Callable[[], object]] = Queue() + self._send_stream: MemoryObjectSendStream | None = None + self._options = options + + def __exit__( + self, + exc_type: type[BaseException] | None, + exc_val: BaseException | None, + exc_tb: types.TracebackType | None, + ) -> None: + if self._send_stream: + self._send_stream.close() + while self._send_stream is not None: + self._call_queue.get()() + + async def _run_tests_and_fixtures(self) -> None: + self._send_stream, receive_stream = create_memory_object_stream(1) + with receive_stream: + async for coro, outcome_holder in receive_stream: + try: + retval = await coro + except BaseException as exc: + outcome_holder.append(Error(exc)) + else: + outcome_holder.append(Value(retval)) + + def _main_task_finished(self, outcome: object) -> None: + self._send_stream = None + + def _call_in_runner_task( + self, + func: Callable[P, Awaitable[T_Retval]], + *args: P.args, + **kwargs: P.kwargs, + ) -> T_Retval: + if self._send_stream is None: + trio.lowlevel.start_guest_run( + self._run_tests_and_fixtures, + run_sync_soon_threadsafe=self._call_queue.put, + done_callback=self._main_task_finished, + **self._options, + ) + while self._send_stream is None: + self._call_queue.get()() + + outcome_holder: list[Outcome] = [] + self._send_stream.send_nowait((func(*args, **kwargs), outcome_holder)) + while not outcome_holder: + self._call_queue.get()() + + return outcome_holder[0].unwrap() + + def run_asyncgen_fixture( + self, + fixture_func: Callable[..., AsyncGenerator[T_Retval, Any]], + kwargs: dict[str, Any], + ) -> Iterable[T_Retval]: + asyncgen = fixture_func(**kwargs) + fixturevalue: T_Retval = self._call_in_runner_task(asyncgen.asend, None) + + yield fixturevalue + + try: + self._call_in_runner_task(asyncgen.asend, None) + except StopAsyncIteration: + pass + else: + self._call_in_runner_task(asyncgen.aclose) + raise RuntimeError("Async generator fixture did not stop") + + def run_fixture( + self, + fixture_func: Callable[..., Coroutine[Any, Any, T_Retval]], + kwargs: dict[str, Any], + ) -> T_Retval: + return self._call_in_runner_task(fixture_func, **kwargs) + + def run_test( + self, test_func: Callable[..., Coroutine[Any, Any, Any]], kwargs: dict[str, Any] + ) -> None: + self._call_in_runner_task(test_func, **kwargs) + + +class TrioTaskInfo(TaskInfo): + def __init__(self, task: trio.lowlevel.Task): + parent_id = None + if task.parent_nursery and task.parent_nursery.parent_task: + parent_id = id(task.parent_nursery.parent_task) + + super().__init__(id(task), parent_id, task.name, task.coro) + self._task = weakref.proxy(task) + + def has_pending_cancellation(self) -> bool: + try: + return self._task._cancel_status.effectively_cancelled + except ReferenceError: + # If the task is no longer around, it surely doesn't have a cancellation + # pending + return False + + +class TrioBackend(AsyncBackend): + @classmethod + def run( + cls, + func: Callable[[Unpack[PosArgsT]], Awaitable[T_Retval]], + args: tuple[Unpack[PosArgsT]], + kwargs: dict[str, Any], + options: dict[str, Any], + ) -> T_Retval: + return trio.run(func, *args) + + @classmethod + def current_token(cls) -> object: + return trio.lowlevel.current_trio_token() + + @classmethod + def current_time(cls) -> float: + return trio.current_time() + + @classmethod + def cancelled_exception_class(cls) -> type[BaseException]: + return trio.Cancelled + + @classmethod + async def checkpoint(cls) -> None: + await trio.lowlevel.checkpoint() + + @classmethod + async def checkpoint_if_cancelled(cls) -> None: + await trio.lowlevel.checkpoint_if_cancelled() + + @classmethod + async def cancel_shielded_checkpoint(cls) -> None: + await trio.lowlevel.cancel_shielded_checkpoint() + + @classmethod + async def sleep(cls, delay: float) -> None: + await trio.sleep(delay) + + @classmethod + def create_cancel_scope( + cls, *, deadline: float = math.inf, shield: bool = False + ) -> abc.CancelScope: + return CancelScope(deadline=deadline, shield=shield) + + @classmethod + def current_effective_deadline(cls) -> float: + return trio.current_effective_deadline() + + @classmethod + def create_task_group(cls) -> abc.TaskGroup: + return TaskGroup() + + @classmethod + def create_event(cls) -> abc.Event: + return Event() + + @classmethod + def create_lock(cls, *, fast_acquire: bool) -> Lock: + return Lock(fast_acquire=fast_acquire) + + @classmethod + def create_semaphore( + cls, + initial_value: int, + *, + max_value: int | None = None, + fast_acquire: bool = False, + ) -> abc.Semaphore: + return Semaphore(initial_value, max_value=max_value, fast_acquire=fast_acquire) + + @classmethod + def create_capacity_limiter(cls, total_tokens: float) -> CapacityLimiter: + return CapacityLimiter(total_tokens) + + @classmethod + async def run_sync_in_worker_thread( + cls, + func: Callable[[Unpack[PosArgsT]], T_Retval], + args: tuple[Unpack[PosArgsT]], + abandon_on_cancel: bool = False, + limiter: abc.CapacityLimiter | None = None, + ) -> T_Retval: + def wrapper() -> T_Retval: + with claim_worker_thread(TrioBackend, token): + return func(*args) + + token = TrioBackend.current_token() + return await run_sync( + wrapper, + abandon_on_cancel=abandon_on_cancel, + limiter=cast(trio.CapacityLimiter, limiter), + ) + + @classmethod + def check_cancelled(cls) -> None: + trio.from_thread.check_cancelled() + + @classmethod + def run_async_from_thread( + cls, + func: Callable[[Unpack[PosArgsT]], Awaitable[T_Retval]], + args: tuple[Unpack[PosArgsT]], + token: object, + ) -> T_Retval: + trio_token = cast("trio.lowlevel.TrioToken | None", token) + try: + return trio.from_thread.run(func, *args, trio_token=trio_token) + except trio.RunFinishedError: + raise RunFinishedError from None + + @classmethod + def run_sync_from_thread( + cls, + func: Callable[[Unpack[PosArgsT]], T_Retval], + args: tuple[Unpack[PosArgsT]], + token: object, + ) -> T_Retval: + trio_token = cast("trio.lowlevel.TrioToken | None", token) + try: + return trio.from_thread.run_sync(func, *args, trio_token=trio_token) + except trio.RunFinishedError: + raise RunFinishedError from None + + @classmethod + async def open_process( + cls, + command: StrOrBytesPath | Sequence[StrOrBytesPath], + *, + stdin: int | IO[Any] | None, + stdout: int | IO[Any] | None, + stderr: int | IO[Any] | None, + **kwargs: Any, + ) -> Process: + def convert_item(item: StrOrBytesPath) -> str: + str_or_bytes = os.fspath(item) + if isinstance(str_or_bytes, str): + return str_or_bytes + else: + return os.fsdecode(str_or_bytes) + + if isinstance(command, (str, bytes, PathLike)): + process = await trio.lowlevel.open_process( + convert_item(command), + stdin=stdin, + stdout=stdout, + stderr=stderr, + shell=True, + **kwargs, + ) + else: + process = await trio.lowlevel.open_process( + [convert_item(item) for item in command], + stdin=stdin, + stdout=stdout, + stderr=stderr, + shell=False, + **kwargs, + ) + + stdin_stream = SendStreamWrapper(process.stdin) if process.stdin else None + stdout_stream = ReceiveStreamWrapper(process.stdout) if process.stdout else None + stderr_stream = ReceiveStreamWrapper(process.stderr) if process.stderr else None + return Process(process, stdin_stream, stdout_stream, stderr_stream) + + @classmethod + def setup_process_pool_exit_at_shutdown(cls, workers: set[abc.Process]) -> None: + trio.lowlevel.spawn_system_task(_shutdown_process_pool, workers) + + @classmethod + async def connect_tcp( + cls, host: str, port: int, local_address: IPSockAddrType | None = None + ) -> SocketStream: + family = socket.AF_INET6 if ":" in host else socket.AF_INET + trio_socket = trio.socket.socket(family) + trio_socket.setsockopt(socket.IPPROTO_TCP, socket.TCP_NODELAY, 1) + if local_address: + await trio_socket.bind(local_address) + + try: + await trio_socket.connect((host, port)) + except BaseException: + trio_socket.close() + raise + + return SocketStream(trio_socket) + + @classmethod + async def connect_unix(cls, path: str | bytes) -> abc.UNIXSocketStream: + trio_socket = trio.socket.socket(socket.AF_UNIX) + try: + await trio_socket.connect(path) + except BaseException: + trio_socket.close() + raise + + return UNIXSocketStream(trio_socket) + + @classmethod + def create_tcp_listener(cls, sock: socket.socket) -> abc.SocketListener: + return TCPSocketListener(sock) + + @classmethod + def create_unix_listener(cls, sock: socket.socket) -> abc.SocketListener: + return UNIXSocketListener(sock) + + @classmethod + async def create_udp_socket( + cls, + family: socket.AddressFamily, + local_address: IPSockAddrType | None, + remote_address: IPSockAddrType | None, + reuse_port: bool, + ) -> UDPSocket | ConnectedUDPSocket: + trio_socket = trio.socket.socket(family=family, type=socket.SOCK_DGRAM) + + if reuse_port: + trio_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEPORT, 1) + + if local_address: + await trio_socket.bind(local_address) + + if remote_address: + await trio_socket.connect(remote_address) + return ConnectedUDPSocket(trio_socket) + else: + return UDPSocket(trio_socket) + + @classmethod + @overload + async def create_unix_datagram_socket( + cls, raw_socket: socket.socket, remote_path: None + ) -> abc.UNIXDatagramSocket: ... + + @classmethod + @overload + async def create_unix_datagram_socket( + cls, raw_socket: socket.socket, remote_path: str | bytes + ) -> abc.ConnectedUNIXDatagramSocket: ... + + @classmethod + async def create_unix_datagram_socket( + cls, raw_socket: socket.socket, remote_path: str | bytes | None + ) -> abc.UNIXDatagramSocket | abc.ConnectedUNIXDatagramSocket: + trio_socket = trio.socket.from_stdlib_socket(raw_socket) + + if remote_path: + await trio_socket.connect(remote_path) + return ConnectedUNIXDatagramSocket(trio_socket) + else: + return UNIXDatagramSocket(trio_socket) + + @classmethod + async def getaddrinfo( + cls, + host: bytes | str | None, + port: str | int | None, + *, + family: int | AddressFamily = 0, + type: int | SocketKind = 0, + proto: int = 0, + flags: int = 0, + ) -> Sequence[ + tuple[ + AddressFamily, + SocketKind, + int, + str, + tuple[str, int] | tuple[str, int, int, int] | tuple[int, bytes], + ] + ]: + return await trio.socket.getaddrinfo(host, port, family, type, proto, flags) + + @classmethod + async def getnameinfo( + cls, sockaddr: IPSockAddrType, flags: int = 0 + ) -> tuple[str, str]: + return await trio.socket.getnameinfo(sockaddr, flags) + + @classmethod + async def wait_readable(cls, obj: FileDescriptorLike) -> None: + try: + await wait_readable(obj) + except trio.ClosedResourceError as exc: + raise ClosedResourceError().with_traceback(exc.__traceback__) from None + except trio.BusyResourceError: + raise BusyResourceError("reading from") from None + + @classmethod + async def wait_writable(cls, obj: FileDescriptorLike) -> None: + try: + await wait_writable(obj) + except trio.ClosedResourceError as exc: + raise ClosedResourceError().with_traceback(exc.__traceback__) from None + except trio.BusyResourceError: + raise BusyResourceError("writing to") from None + + @classmethod + def notify_closing(cls, obj: FileDescriptorLike) -> None: + notify_closing(obj) + + @classmethod + async def wrap_listener_socket(cls, sock: socket.socket) -> abc.SocketListener: + return TCPSocketListener(sock) + + @classmethod + async def wrap_stream_socket(cls, sock: socket.socket) -> SocketStream: + trio_sock = trio.socket.from_stdlib_socket(sock) + return SocketStream(trio_sock) + + @classmethod + async def wrap_unix_stream_socket(cls, sock: socket.socket) -> UNIXSocketStream: + trio_sock = trio.socket.from_stdlib_socket(sock) + return UNIXSocketStream(trio_sock) + + @classmethod + async def wrap_udp_socket(cls, sock: socket.socket) -> UDPSocket: + trio_sock = trio.socket.from_stdlib_socket(sock) + return UDPSocket(trio_sock) + + @classmethod + async def wrap_connected_udp_socket(cls, sock: socket.socket) -> ConnectedUDPSocket: + trio_sock = trio.socket.from_stdlib_socket(sock) + return ConnectedUDPSocket(trio_sock) + + @classmethod + async def wrap_unix_datagram_socket(cls, sock: socket.socket) -> UNIXDatagramSocket: + trio_sock = trio.socket.from_stdlib_socket(sock) + return UNIXDatagramSocket(trio_sock) + + @classmethod + async def wrap_connected_unix_datagram_socket( + cls, sock: socket.socket + ) -> ConnectedUNIXDatagramSocket: + trio_sock = trio.socket.from_stdlib_socket(sock) + return ConnectedUNIXDatagramSocket(trio_sock) + + @classmethod + def current_default_thread_limiter(cls) -> CapacityLimiter: + try: + return _capacity_limiter_wrapper.get() + except LookupError: + limiter = CapacityLimiter( + original=trio.to_thread.current_default_thread_limiter() + ) + _capacity_limiter_wrapper.set(limiter) + return limiter + + @classmethod + def open_signal_receiver( + cls, *signals: Signals + ) -> AbstractContextManager[AsyncIterator[Signals]]: + return _SignalReceiver(signals) + + @classmethod + def get_current_task(cls) -> TaskInfo: + task = current_task() + return TrioTaskInfo(task) + + @classmethod + def get_running_tasks(cls) -> Sequence[TaskInfo]: + root_task = current_root_task() + assert root_task + task_infos = [TrioTaskInfo(root_task)] + nurseries = root_task.child_nurseries + while nurseries: + new_nurseries: list[trio.Nursery] = [] + for nursery in nurseries: + for task in nursery.child_tasks: + task_infos.append(TrioTaskInfo(task)) + new_nurseries.extend(task.child_nurseries) + + nurseries = new_nurseries + + return task_infos + + @classmethod + async def wait_all_tasks_blocked(cls) -> None: + from trio.testing import wait_all_tasks_blocked + + await wait_all_tasks_blocked() + + @classmethod + def create_test_runner(cls, options: dict[str, Any]) -> TestRunner: + return TestRunner(**options) + + +backend_class = TrioBackend diff --git a/venv/lib/python3.11/site-packages/anyio/_core/__init__.py b/venv/lib/python3.11/site-packages/anyio/_core/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/venv/lib/python3.11/site-packages/anyio/_core/__pycache__/__init__.cpython-311.pyc b/venv/lib/python3.11/site-packages/anyio/_core/__pycache__/__init__.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..b9b39971b4921ad66a80dc817a7a34ee4e41723f GIT binary patch literal 198 zcmZ3^%ge<81pCFyGC}lX5CH>>P{wCAAY(d13PUi1CZpdxp?+~@Nvdu^ zVsdt3dTOzLVqRrtzJ7dieo?A^e0*kJW=VX!UP0wA4x8Nkl+v73yCPPgO(3@v^8<+w Q%#4hT9~fXn5i?K>09(;AumAu6 literal 0 HcmV?d00001 diff --git a/venv/lib/python3.11/site-packages/anyio/_core/__pycache__/_asyncio_selector_thread.cpython-311.pyc b/venv/lib/python3.11/site-packages/anyio/_core/__pycache__/_asyncio_selector_thread.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..cd618dfe6f9cc347abb2a759e6c1a7baacfa39b6 GIT binary patch literal 9096 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 O4>`;LZS4annf@<>NiLHB literal 0 HcmV?d00001 diff --git a/venv/lib/python3.11/site-packages/anyio/_core/__pycache__/_contextmanagers.cpython-311.pyc b/venv/lib/python3.11/site-packages/anyio/_core/__pycache__/_contextmanagers.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..ebd73ed5586ee75e4085df8dac2bdcbec556195e GIT binary patch literal 9682 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 Jasy?@>p$LtzpwxR literal 0 HcmV?d00001 diff --git a/venv/lib/python3.11/site-packages/anyio/_core/__pycache__/_eventloop.cpython-311.pyc b/venv/lib/python3.11/site-packages/anyio/_core/__pycache__/_eventloop.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..265e3653b2f9ee3dcdfce62c0f00adff49bd4820 GIT binary patch literal 9133 zcmc&(eQX;?cAw=g$)!k%U$QL8w!F4vOO!0ql9Sj`oLnedv2(H2G*PZKeFnYeu58*% zQkY#@mMZmlN!sd)1jym;5CeAy2x#jjO^Y*%7Pz7X4!%DNv>**0Oe~L)rX4$1-hJloSm=G!revGBGFoq=&a==uVDa3a=`VH;67|3kpH%cFa2`nJ zXr5#Sl{j$JjT|Za6pzyL6OZzWB7Nw~3@K-op$~=3G38a|82lesUQ>qQe^~j3G6Mf2 z%InG~{3qal4E{%zv@#C=V`_&ot(^K$*!H#)$~on{^3sRi%(yb6oQ9T3sd(NciHlz$hY8LM%Ee;Ikd1t)sLv*NGmu`C^M-swQ%&)ltZ6J4xS$qQDjOvV zJ-TwGqM_b13UX1tsbYzDu5?E&LZ&lcSSV2=TPP`IO@+}q=dQdxlRbBF=GT}D7lzh&(svGo#WB^}R+ef%|%?xWLSy7ej4QouD_E=2$?E*7wXR@UQCPP!0FBfy0 z6OQbzUbPs$>b&vVwG&cH##bGV;8lVQ3~ffXH>U@1raW*+4?=Ep-xk9l&1=$%G+Qcy zT&QZ4X))(0D@w!%x1SL1>kO2BN(`qCirs2+k6RUJ+(4<@m%^b2cVC z`&WcY*ud4cuN`mn2gr(Nfya#@a9az%n;VY2 zOJE+)ZQ*d4@Rt7>#N8pm^-j4c8MjpFW*$^p%9UuTY~+iogi3+>A?1sb3<>q}7A+M^ zWnEHH`y~z3KiRbjl#?9EqndCRKiExxVygF*>F?R9d&83 zL=`vJIj~)fE1Ojq3gk7Cu*bqzZsThaIFLq^QjSesRir7Z&QDzju2ku)Gm5>-U%Q^L z#9{5aDfT8SFM)k2w`8(Y1MGfsURQNg7b9O#nc16?^7GHp4JohhSb0z;<5pg83DHs( z*Bij9-YHvlmAwF!6BkX9oGHP$s95u*a#6ALZ#k0Qree!sR9t))5Y)cq=xj;S%eh<5 zFjLZOLNxc;YMW)NnAP$(s7#m4Q2RX1=uOqI8`wOU!8e)XU~({nZ9JQOIyByWR2~-8 zJV4bwTO>q!2(~!0pv-vE!|-T!GUkA{EDFMYbS%8dtM_uI*FcY^i_jc31+UGksavIj znp%{p0iG{aSV}J}q;BLj4ff!8A-9l%ZG1Nc!=@INj9aDRspP~&3bvFwjt&c4rJj{H&ykgDyvPxd1tweuKwzQ zOP>{hSgF=^x!!fTDqe01ymy-0=uLb!TLu5~`!2=-vdX|A1aboEvHPk(k3 z2&7uqnR?fmpXaJ#`WakJ9-CvvM>?aGnTEf+>Oc5fABm2_$dSoBqd!sY zPkr{zTDTED_#`Yn4omCZ>&9pAJUme*+wDWKPDc{}J&(0hG= z-fj*uZxQaf9&f$P7h-4YS|M&P@Bx6|Kj6PbKIQ*d0MO)F&a=Jswp`X#w&hz^TGsEt z4x+43Ur=-T`8;efr3|16OsZ|yZF9@!VVMl4!3o@6x(dij(XBl=oAA(K;L7ysnyM}& zI64VWI33Busn_ z{YVapbG77n5lVK-(LiKjU${RVXL2(I>}K-N z?{h*=!*rNT%}zFE7RHC&Nht#MZ^Nx8f!NZGkznLU!Vksor9Mhkg}%KK8`KmPu$5pS z+?t9Qg=s2<%uWeEfYLAEwyssK9hbSV7g^z!;V7qY4`3a>*n2HJjt=9|2iAgL{@4F` zEw)e$dZ_IhY|YA2V)=$%(#i(x2xy3iVNt%LO63JfHlz_b2i8tOm;x0zW*!a?6hH>! z01ayaP>@k7=5ta`E9LGuXkrV}B&@Z2&azURJDy%bj;BCYtd-^q@;%r~uR;rxFP0W{ zY%5uN$P8NR&9skBL&Yt)^%)@cYIl?1{_iC}N>Hu{vChHe%G0PGg#Zgs+5js8~=DbnPYsNUt%*Hl)63)2d zbo$&|GqdO4-8Ka?!myC0Iq*ZL7vPQW!>z-~4d(M@FkbncoqB{vFvjWMLgrI)ldL}H zcz2#$JF|)hH|XJ9+mBHYM~T3JM{w#1frA^*kt^h*!_Glxg{-%Yu+?(sSRcLIe&E~g zR+%h6XUjgP!nwwAobp{c4*`d~mN%AAoI6En=>!0CrtRC7VS96ia}ltD9a=;b4|p}F z>iT?H)0PnZGdU%NB*XV>$xUHhuEK0z?=9CZaMypdn_nuBoksG()xm zFqG-CIz4RBt;x3apqF9nKY?3c1yUi+7&!)}rDvmeq}DrH?;ULtpZ6pqYoVrx5A53r z9lEd8LSyyNSe2z`8{vMyd4YXfq!H>~y9kgju+Kttfdfy(Bag)+>nCbrsxGFgEPWY_ zRHK8n;7~m{R27Ew5ODCr@Q~-vJ0`pjxe4!PoJB{bWnG=Qms44+!@YO@?=9Ou?q%7S zWs&T|#TH_)j+X%6E%v~=$-3UMZvQW4%j|2RnQV)(EMsiDCD@Nj;c9KS`(0RypP*LQ z1}@TO;Lbb_o~Z?=>cOe1FvYBd+3Bbqd&_2QXH<)xgwaf2>Bem}XKePjVtZF1o^*mm zlPr2IhimFwXc-34b8UeZg@br7#D-Tr9PvPS1;Q-bph&wt$+m00?Kp`APp|A>9fM*?XJP{F~d;%4{+<~ z+$+R7e{b}TTd{z(PB?5gi4f@8h#hTuxaeiBF+TCLD}Qz6SEn!3PQO_{{bp_aoAvQ; zg3*UM@B~1A!}Ia3{~|z|gzxNXM!epkjqt$z)p~fmDvm>xAPyDYp)Ilz9jG3je)uX7 zNVVv>di30yuaQXA6R&<8zTa6Bk2k{m>fynvXs4zh1^_3c$AIle-cUM59>pf7{roR| z9MBw;wl3V`Oo9IiGH#?*83Xks8n+5xZvb)Zs-|w$w2n1^UVN?bTj-@Y?x+OdpSDB) z?Ut2skHu7VYZ!9773_BK(AIY&v{z`CkVWgmfRDzVyanxSrORTRhaSf|R28!?jRD|G zR(K55^bHKYF*SjMK7L|oKj<^%Lh>(I@uxs4WW(Q8`OZ_ZXRQl=5R3^#8=?4<(9q-1 zP%U)4&a6x$e(;l*0TLWQG!We)jZkFmJVJsfg9Lmax)JZM$4}PcllAyyH8cr*dg@_- z8qe!SV3Zeh46uFNJxKnn<0Stx?j-+rv9zB&@`uxX{G(nD=w^sn>D{atT3)6EXpy%m z0eob9*9E|Dw-#@AmDmX~Kj+{`$QH!xcYFYY4o+M$o4YGh__U%LAa&f5?NT3wXNu%0 zRty3GFpg4hgyU<*m%$jEDxL%<9tS5Lj@N>(*MqNDh1V^h-r^KGwdQyU9?(*M_elG( z;(t3UP<42XHJ5qf!Y8ew?C5kRUptN0FecXfKe2z=Brv zRI3!DRAByC3ziqy!F-Pv*w1NwzAZnCd7tIS--W#8%;zx2Mt%=-OgsWxR{HH$6*hN< z#8O}p<f6!UG&PM96p?0gx{9%?pAab@YtKtO|*bTeRq1&DN*;amygSL}O_ zo|JFosDMq;kWe4C@36n1B7#NlW(Ms7P)D7jmoo#_@dR6--!Odu<6vltPLzH7q#@RE z3svft{|VWluPlVNN;Hbi(HxsmYXE3(KwukUW4am6X4^jg!i?hBFn*bRymc8RlgC-$ zw|M#n5?ox0?%nhDkj+AqXYp|w2|K%Az}#gd2xu9mvb-HLZ)~?QJ$0Y) zH^sA-mwb&bLpR)6dJXI?STBxikfYTd=_v_T*sno4D(u%Fk*bp#WU9J%YLH`9cWRJB zRd;HT!KynoNV2+jdP)*icY4bE>U{i@#mD?Wl^FqdIH=q4r-C#@KE+40C+6ujdB2ub|E7XF481!a@@Nj`mO)~ literal 0 HcmV?d00001 diff --git a/venv/lib/python3.11/site-packages/anyio/_core/__pycache__/_exceptions.cpython-311.pyc b/venv/lib/python3.11/site-packages/anyio/_core/__pycache__/_exceptions.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..d3263bb902bf6a50d1dba9c942ee4890f6db2f69 GIT binary patch literal 8857 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 literal 0 HcmV?d00001 diff --git a/venv/lib/python3.11/site-packages/anyio/_core/__pycache__/_fileio.cpython-311.pyc b/venv/lib/python3.11/site-packages/anyio/_core/__pycache__/_fileio.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..59d4c3658f664e07a1ff43185270a4c6038283fa GIT binary patch literal 44062 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 IF#^^90m^X}ZU6uP literal 0 HcmV?d00001 diff --git a/venv/lib/python3.11/site-packages/anyio/_core/__pycache__/_signals.cpython-311.pyc b/venv/lib/python3.11/site-packages/anyio/_core/__pycache__/_signals.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..7857697e18733193308310dca1fd9d8a0db9c4de GIT binary patch literal 1478 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 Os}4~1pXo3P@c##bRyN82 literal 0 HcmV?d00001 diff --git a/venv/lib/python3.11/site-packages/anyio/_core/__pycache__/_streams.cpython-311.pyc b/venv/lib/python3.11/site-packages/anyio/_core/__pycache__/_streams.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..996b9b93cbcc44a9239ecf89bdf362846082aba6 GIT binary patch literal 2664 zcmb7GO>7fK6rQ!$j{lN4X(15)Ml_-^B5M$|2dhF#pe=|tfhM8C2yHgI<9NybxU=J= zj#4SDIB@KZ9$E?YKvhvBj=iU+BzCr%3$WBX-(-pu>n zoA15JcfGwC0_~@vC9|)GkUw#-)ly+c+Pn*$JH#M{WD#2`OA_{DR;(O@zi}&W%Vjy3 zldXiEEGMC#Fp^e}ohqm7bUAHj${C5o2$PMTdlDh{;TN`YHb&kjM(P$Z(k#c)EW3Ye ziLlhpQ6;v$axV^Nz%M$Z*N9D%Lgon$3zDDJ9LE)!FkQ!+gmKSIqsFdk9J=zd#+@fI z)QkK3KV-Jc8&mT)nJzwJIy0BpwBSs${k=PvrkP_z^ZV4Ug+O^4Off$>qh1uu)y--Qs%NgS5_RhKJmb`@1a>`IWtKrrhYElcD$=?mOpDIV zc@Wmo!rUA{)wu8iAn4(|>U0@F5rXB{M;_{9aFe<`%JYm#unMZ*&RUEkv9d{ZRr|6kN7*K?zDAZsz&UCmV zqg0}2l#`vqD4q2fxb(6BUUTal8G>ZIF{&sEx^6n2V49(XzH%n&+$q83ih9jr=;A0w zDZ0!P6s#jjqj3a|Bb_Jx{#|$BCn}b!2|wM5ou3TJ;wM8x&o2aKu6I$o!}YBjKS6h{ zccsae$_+hYdO-UGNEl0-Z$p;fA*+%IrbBVFllhCm9zG&aKWdmtA1->yij zyYPG#7q4yWt?t4g_Pltlg0-w?a^9e3qbrOwj!`fbhtq^zEHQBBWP9gK#w^)*p3MtC4_QP3Ap}hOz-fV zu50Oqu!-59Uc ziu0yr!HHwGUMns!XQ^nJ^Tk?2R9)w^a_UskgNTjQ0K2xpyrSkbOt+}&E@#E4QhQ3R z;rFPj!PQmc; z;KAmhnf1Zh*5GV2H@lG?{_4u3?BQniaIiAIJ~+`DoM`4IHnOibv-EK;-;PNGlhR-L zqZvaL&ZnL1Po&xe#Rxe&A+_WA#1*Mc{$GX$ z@a#e#!m8Av=mIQ`^@w9)`bl_ckXAAdQur?ejJ%M3ebGasgzs;_wUBik68edtu7>zW z@YIe^&r|P&VK~c=!vYpV?{^UGxFks%Z(Ek7Sev|x z$dSyz?V&ICt*3`u>EX3xJ2@g@6#rXp$mwQ=-rd{Ej5d#-`}w`r@k`CjrI!4`(>QK; K_JVDJ_x}JCgwH7e literal 0 HcmV?d00001 diff --git a/venv/lib/python3.11/site-packages/anyio/_core/__pycache__/_subprocesses.cpython-311.pyc b/venv/lib/python3.11/site-packages/anyio/_core/__pycache__/_subprocesses.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..ef7d89568b7de8a0fe42fea223324590b1ea3424 GIT binary patch literal 9829 zcmeG?TWlQHb$9kn?u*OEQq+SSl9J4|DKe5`r(Qd9C`&TbC=?Y^j=iqB9PZpD$DEzn z+?gdsb!o^^(8@vDIEh>9!zhR#Rum`&`q_^HO#lbT=h9%&!2kvb6agaiXAS$q&`)~K zot@z>Uvgr@^+$)7XYTu+d+xdCHT#Qryq&=FAH7S8K0wHSW5InooQ&|%8G(?u$yFi~ zSx`wy$O!`GeX1|#gSTJxmjby!DVPhELb*^WoD1{zfEp>a<=S{YsJ54)xhT(v)L1E= zidtjTeMD|kdrIkC8uIOORP8Mt$Q|JMnA%r5 zm^&yC>U;H&i?AGD3}T*z0jmVecsO@hAXT1oRm9?fj)O2$%%4`4$7U+ zLXGT`eKbzvau?>{kI3C}Pa~g}d*4aQPs>k!Ka?B7UeIs1UQfLfm$UL;K(ArhH%&6n zJixUwf*qAKO*bV|(KTZ-6R_hG#)?+BXi_H4snm{mx$w87a#_*l?Z`C!ZiQ+E3Zuhk zS4?VLybRgMlw>YkQWj~(ZwIC>PMx@iXFVF0UCCoAQ|QZpMzhxG5i6XIpUj|r)FM49P@KhVUcPwRu&kQOqw?(V=+I^ z^h!D7d*Fuw50IOnL)*+snNFyRWZa0mc)nto?Anc_SDeGGTw@1dgq@f+*=5EzhwU>L zen}qu5uQxa4k}u?V%kB&loibm!AplCzA0mNu&_W2i?+Y8EZcsnE!k1Sl$coo$`y4x z&hdmj7FB89uv5G(uhHea0TjZ$N6M06PUUidE4)qE}j5uCc?gyN5BpRp>UUYm^|FobOf8k~Xz9u)z2^9@5YOCUH3!1lwU>=+i019%wsu!j0; z>@lqCfZ;H?gB?eA1p8;O?V!t>xRBGyTj_D=V22nrD@=RXyPfG?an8DcJcUmZ{!zNz zB1HJ83XJo2J>Mh($QU_(yQe6~;qS**JF33dQ&r*hr0I@=0dm`2DBbsJz9*Q-c8#Y> zssam}0k=$uCRBY@e>G4IRm0UtwXND-jaFmTcr{T?{;K^hkmf#;hd;MK-u#XKMe?@) zZv$T?w}h=y8(B?(EQ-wge$Zov-Ts8!h3tK=*g9slvzmIUzqF0*)evk9Qmb1<)0vlekzXnt3PR$4dHhvT(1zO8wj zn{TDg_R(ux@3?*4_kLsW1mwtFkW=?jR`KVSZ|jsm(x-;WNzz&C177Z` zcHadKy6y9}=HzlM$0t2**@O-LSW$d_#k1EKpS)6?N#L!Mcvx6!l`GyTKR7trT?4loX9m z0psX(TBw+)V?|9WQJkO*nuhO0F%3~-^OX|SOlN`yQe5?9MMr!i7F71|Fo6aVlYum# zo)7_!okt>$M`IeUy0Rh&f9#i)B~xl425Rrw(OnwOoquui>ZMDwqu#D0v8br@gbI3J z)aPEM1(VZa7De^!Gve$lM`w0c)R#a#Dl!GaEhsIUax~}{fX+4&06w43qB{vVJ#+5z z)fph+zT|1fhno#qQ7Hn+W>|&J!eAyT1{JgPI`MQb*R}n6m zEW${I=^EY;Z-FI=DR`j_vB>li9{_h5dWa2jG%wv`mSy?X)u0B9T7Dx6D%`D>D=|GY z@$H$bQx_*MT%LuQB@i$`wK*z+l_q-_fJ`vTw4fAM+$BK_aPto?H%Jw*dzm4Qd`Hn_ zec6BusIFw1k!mpyvm&<=cdUlAMq$EqmG99V)VT8=GFu!Yj)3SBvpaV+rI)ETE5ecS znH=1eg3*H14kNX}rY2`oXCO5VMIOnB#)@H55T0Q81H%CT3Y8>aH4xa%{8?B~RN13Z znJI{YBTyZ|2)6J}88#-4OkJM7_|i_oxmI%)guLUN;Aj+0B8Z##!6zU>J@U1nNR7SMMmrtUM6n20L0RG)!8ZeUz?s|CQE>88E9L_1?9A82 z(_>GMihJya+x*Q_@(Lu-pFd}_0|8X3ltDY;9m1a5i)SURRwOc!xxinWjKboSByyI8g z(N8E*7&Tz)t}1p-1&<;5x>+uM4RL?T+qer{e1n#QeYx_RYjVz8&iQ+rq1RErH^i}~ zYd0u^gXNwI7t4+rf*vI}wWWvMEe?6Zb3rdurq|giu)Ww*0PFyY>4Im7LKT{6KShV; zpCI#(g5%IMJ1?!q?W(UzPLb0PNO7HxRe#mD=D9X7iT70ft){p@et6_50==8p_j{(R@ zxo4aiYwmIdFf%j&pZtORf!rh?qz?SJ@2$SuA?wg!od|8>{@~4HR;=?!mws^RPS1L5 zU?VnAJas#HC%7KzukmEy;lC9+>6^T99JP#V>v7A^ zu`#)si1$!c^<^smGR^}5Y|G^zgelk%f?)(l5qQoz_s*H;i!=1M8J<4t0+0zghnK|) zJi#qSWq9_P4!iwDJY^>+6hnFJ(vhJf#(EGSE_S=4e+*sMoKOVDE9?MVVA&2y1ywhw z9YEXPZg(ybnl=pmABHZyvvLe_nKXL>E70B9zE=_J{`3u>gJE{K!2q_;oVP;|48rhG z2&_xcIP5I+Fwy{!J$F3cV9(2K}TxWsRTy*O`0j?c@htN7uWKZ*(26 zlV}?Z-w)gyvXbc^z6N(C{+!j(`F8v#@jL3h7k)MQZxibsXEr*{)H=>=eySd;b>fSk zSnJ_0D}Cgx(to8#-cOI*>se2aZ=}a-9lNAPzsKKCKfazG-AIqtI(A8$oqcbQ{$%vW zV{eVsV&cwJ?`_%Qhq&X9_ucmXMEMl0pM3JkuDym^&gw%vx{p7_`F(~i9Fvw+9fo<9 zq>sHmdGo^U3syJ==No)kc(ZpSHN5uS_fsRa)W`=3@!jrs3-`XZ@x<5H2hVH_p80k7 zcj?-d@2n?Y+DN=qi@fyv=%G6=ygTzR!}pdq#wXT~o!vNg_SYAFcVRs`y%C+R1*VO! z!EO3YN8kCd|2LVlnR7>j?{#)U;k~2n=f>LJ8}noSq=5NTnE!3K{d_9?+in3MI}c-7 zCjc*27>5G>-$K>;&yaBxt3p;2)%Mqe5YbD>J`{4*D3qd5^7B%xQ3~)8ON{T|&jUxu#NTM8mr>&a!x$qAHM79K1g@cNXNCOZU!F4pH*Vx836%4KJDZ+KRG(GWdK#412{9c3<}YGP1D?M({0U zmv91_#yjH(V30U*2H6cIH2gtrzL~Z>Z~zesc%#kT8b5&OU#Vi4=zB_D9D)1nGA$~a z6HD;Uvni4wHboE`E-`$YaoyDB^zKQ;_@5G&2U#OJYWqThvIACLPGPK!uM|6ys_0Ib@D$` zL+h!d8<H{rTJhF=(7XtQRH+U@y#u>v2#X+F=upM-Dj5Tdn{ z1s#5w0pUvc(Z`rHS6~<}U>HSVAq4m()%HP9mWO71y20>^D!Ag_=Oo8V=Uz7Y)^^BT z!5@b(w2U1ZBeQZ3-1g%Nh!0>xA^u{jx?bkj#18SFY#7|#w`1^$2!8~T$KOggzr#p5 z)8^4&)v(Qg4VVxJ;-A16e$lj(`FzuFSYV&%K|5FCAm(NeJP+VuGYtK#9hNdA5 zSN@krlHQV3NtIL5oIEAVlsrtF#R1j`OtxYw|g{DGq*QxcX@LXgn!rZ}B<6P5J(_C~a%6>Pbn&&o5ZD8(D zs%5Tqs&%eys!f(WQZlH9zbi}9_wnV|R6BeXHS%tw=hpbk`So2q zzHj`HraD$h-Hg;5R!!ZxO6nG*Ze2BX*D9&okh*=<)ZMG3?m+6!Ra5sc{B$8+w-|4# zmxc5oq&M07T`#bOFTbW@EG&kwzKT?RETkVH1IfOMRQ)V$5Me_VsRmfcFhVv~gbcEf z5rm8;2P^U$Vqu#Qwz(qJFbf$&$d=@AMXHS~Y#d=*D^iW9p2wxpZGTIZ9F@!UiTU|- zHj$l8&u1p_+pi{HSV+R5>`$apiQ_49*Q$wZVmg(`WbmWmsFs*c9#2d^fArib3az2% zlL_r_iR|#Zb$TW_{rsu)?0hypdm=uan4eCjQc3l1iHs56cruxdCo<>er{k1Ma$X(v zlp7yh$eepDnMp5b)5!yxme$IV$@GEK$@%P&bovzYLE8HLEVsv}(|EO~tQ<{bo+ve%By;k zKGl0KLR23RAs#0jWwNu=ncQP_FzJ2@F%xpHfS*V`MXa>YTO#?_nScM`jbiqV03T=kY5yBm#=$Z_WE!a2FVaL+dpX zyEhUw#cGX&=JK=V3cyvvT-1aLbJd~=>&or>6R65;_S})#In+zD8Z+??5M@Ps9#4b( z&Lq`%HVxv;2rbHdVmh6r&c%$lvE%1>bKCMdkxC~(9q3&tGb{GXMk0yRiCNam5RYDF zOP*agl}Z{f&`=CU9kDb>D?393cKo^IbT(rv%uG6^qD}RzjHGG|U0{x7Omv%_na#vf z91pg)t&5P&%uIr=K=62C`h|sAEqM&ZU327kdOm(UIg?18h^J5RexbFX@ylTY%Q_m% zeumm|(2m<&6GPZD94%w9@$vCz%e8t+Eu*y}r%A1iXpOo(r@9!q`VG(pM`jX0BwmGx zmq4@RZ_oSMa2I@SB_9Zx?t-ti408Euf&UDGs%=neFtx0^gU{O z^}0yX;;n=flm1wCWgnrU9N=}l9X2a-K1L-h`&p$Jt*t^PBWNa#z&O5{2LMDe@e`R4 z2uc3N#UqPHzI3GI>&Uaa;OnSH7nGwrT~Nr{=mOMGQ;zOWqj_l{w@4!QgZ1I_xIqTC zvC7QWHeT_;Pp1t+xb;fb{_%`CTu#I+Hyac|A`A0sQcIl!9hyWj!Ndz18!015eVAHqLObQ&+dZZ;2eT7a&MkB2@lc7lXHnv zGZ;554CSWQ*C=iRgqf{H=`7Pb5%G3ZMBsLHJOgS-t;MrOtpoLj%YG&jl>=HbyP(Zan=>Bd z>BHA6N%G1fdqJ&~wS|f^oGZ2vMAk1c&g0U6l%+iNYf#b}Whq-@{FWp!{2c|d zbk_T{bVj}^PmcPuAR?E8(^@i-O~#WXq-r7N#cHunO`L+1aaAsRr&E~>l_{phC>*ld zeDX{@o@?L|p#Jl5gk^pWU{Si^@z(ZViw+i|!^PEQ0Z@=_U+wSxJK)%mg_7SfW5K9GPh>gJU zmXrlFt_$+0oEv^T3Hb&6l?IP7;@7h$sME$UGk^$@$tE!tWX4g?=wv#3cnNJ`rsgA|)7T%M%L`j0*?A%;ZodvXT!u*e z7x*knA4a5bzu8_S{X1~78e#3x+sigGB#x&SII-!%H5)dPe8fP-lGMqnG+CXMPcEVp zmpT4CkHT3^H+j{g-9qro5ysCwe~@c8Us9&_d(Wf0+~?-7@6^r$Iidp2ZHmG zs5X0C(kSUwPdUJ+4ZLyhfuD^fFwa~wBP^Y@kL!$^UdcNCqI501;k7Tm`o+uBg>Zk7 zI!C_^?e<}b#!FV}ci?zSIxjtkC%+aCWc5a&-y&+S=;N#&Rey+a&P#DK82OrcY3=s6 zT=AKaYz{FeStyr|r%}K5C{nP|Puoqd&kP~1lV7NzU; z;bMJnzJBAifx8L=cNYilULM%LG_b!gaG*GF;NnBYV5}65UOJBfuVHg3(p-!TE=NX| zA|r*!reb7MKC$BKnGnKqNJ< zN<>krtDecD5DOS~7*3u>L1>Z65VcQM$VH*V)}WLB4oQBmC*RL-m{t19B~Yc14eP=VK0PsRfGA`e^JGrm~S z@VpCug(A|l#$L;4>znuHgT1^Rm&2Qu!kY@=v0`{EuZ+3Z? zqcWRkjp}X7^m%Mh+lxRuBFHn>Dj>odeP5%1myt0j9V^klTX>ia;9M&EtaD)J{i_wP4v6ywZZVG3;j)vy4a!P}8Sj(Q{ z&G{gOu0B$;_YpXSZ{`O8i?&Z`aAfh(yl;fx1>Z=ixqb0a-Un3>-34F!4WH~E0EZGl zKnjFzcmn>x8%c&>mG7FA~& zU-Kfu!X>X91++$cRaQN3%W5koX8}ys+SussQ`^-rMr%KQ)2JQ5vk}i4Je%-T)DAU@ zXRX?)ZosonZNaGCRrb-`{U8MY;E6;AI)1JM)Dn0j8_UHZoVuzHUqvMt zD_3>{$NVlT&hMOQD&}~eN$nWQV@&kw^@$#-ANV}4o+@fg^E}!FBC}d%s4vC%WRHst zL5gXJ3vVGbLrjLx^CoQbyd6u?9X|@@qdN-GM~cx$^1(-p$=(D__Bgl}?Rn=&K6+0f zdQUNWPd=#MH0PV3IbRrAU+5c@zTL4;_P#I4fST)o_!1EUO@9mydIfIhC31@@d=t%G zW3=>MKL zs?+Tbg3mmd$RrP(olc%2?box0JXu4rPA5{gn}u*AIKVPFe!E#%&(cGui7<_e8kJ#; zIQ@DshDBWn2VBMkmb7FliIQIRY5S0oMq;-%Pk`|qdLzx#v=|)aTEg7f*(?yp)Vv@e z{r43Fuh5)?;|*%8+J@JHuLfTUT?$=fABH4B2%@gWYS0Xa`y};t<38S9*{qXD-F>#D z%_55&Cu_agNswI$0`L;qrt*$Lu)ZEaRHwS(_8D{PTUnB^*qK?(a4|t-3QDLTY%|yi zEis!(W@5TF@~QMfN_~*ZKcOq0V>BGFrK;E&3gnqs6K(e?a7eFQd_K)4!%;@QqUXC* z@j3v^h(op+@w%$r_!uXPJK>$?8am!}Li$7aSX0}zzx1k{+oaFHNnc{1iEzer2z(V4 zt6QX5oPie~z z5*;w0R0EJWx=G@&gFwLFN`j0XL|k+ZN)72IM9}0G&&@ADX{!J()li+L@ii~-6T0M; zR{<@l#;L1ON5@l$-z>K1M^rEk*bmZA>qX)v2 zahVvS{!%f08naKI#MXA7{$e^s`LU}~%CuM8KJCJAKaB)n5U=3DRV6C9E)m!ZV3&{l zaUz6VqfmA7`nMF3V(TiBo_ziAwf>!j{$0iXUCaIZmiqUVy8DXVTW@%!fd}QAl4l@v zivX!idSPY(Rf$arRb2@D)Thy4Xs@B%oL5l|Z1vTMmE~H5+L{7liQF1V1v87O~ z5b7_6NTXKm=ERUf23j??>n_kuB8ef;QQ7$QrA~W`y7x4Zez>4#k-vwxKI760$TZ^v zFoiqD%ySzm(ZHm=|3IHaaP3qcmYRJW}3Eh&8k zWuT~#Vv^tPZS!eVVG-}9bq!VpMsj=MW3K{v=7c8ECCHlySm^=)n^A&P@{T2?qo8yZ zZBwvSN=}5je&mBkUO+;l$V`mc3lDpd$urkv$9f8EF{yqC|CJU1lo*QP+;TX!6pmHs z+)0=csKpNthH4cKvA~Os_F+NwKq2B4jVV8lrgYSon>8iQUy?v;=0ACm>+rms>rm~v zShyE1J5mqhx5$1iS@$0(F105kW1Z;?UyJr#8G5Jrofitx?ZxQ!d~iEc-}Nttw=9LX z6vA7J;jMXPD!g4z-$ohrf?<-|2Dav zCBTTCSoZoPV=567&HfUOOe;i(Mcb#;KfE}Z_YL#A;2XY9!m_B>tN0m^w(X)Qo2mmt z69^SyfK-G4HcjBbjfl$&0yUJQ2p~rzwFn?@L%}El#DnNA0<0rC)7JU7-H@sP)}jnk zB+i%@IuTuWl(z@eL1+~HkhO=HnMXh!W}3tr{3cDJf+uMbYw;vaVjZ5%c-E^MnUoz= zN7PZZ135GxgyiZFo?Uo`)lF&)&xpEN?Z>l`$=hS)TGLKxQrnComh0optcx21`-ppJ z7vVomL!xn+((IG)0bh_$HB>h)u`d;6iKFP3C<-8!jwDzR8`>Xq4U&>M)%xIq+)G*o z%u>-Om}LCB@D-$UqV-&pSt}@jxJX@(Rtd#G%DLu!uzRJR=b;Y$qeNLXUj`M(HGL zP3CqUg&l}t7C~0PruC#@@GIEVF$+AbpxLiA))x7vUg6zk;Xp68kyGn{ibh?|cO}eMowC|BIg5b=!Bm=$&uE zdZJ>z9rmJrS$bN+oF5&5Sg$tykA8e3j};f=O8+aR^pa&U1UOjH|M zN^Ma(`$!c zJ^aeUmma=|&y5Bn>kReq@3rrfJ@3nP`y&4L!!n>i(bU3>GTw$`?UVt14yws7P(sU# z@_E@^=jUjzR(skjHVQNHt2ET&bTR75wd*ZR*0N;DX<5t?U!xbXhGlJ7_D^GNP{Wj% zHRbOi&@K#?>v&_uk(XVdvV8BSW+Zi%TQfpVeDhhf2{j?W#RH{aqrC}e?%%MibS^2K z1*N;FbmxuRIS5ftc!}hlZ-Be#ONl0KD{&!?(dfsvn8-)JDsf(Ym_obRbh1}`Mh^C8 zWzQ#5wzc(5a0mHHz@C@k7E37BYW_a(hma9dlE5Ff;hpjo8_%#p#hfx7LVaqjc$Ujq zp9?0}fxW~AE2ips*DKmW>;jiU?TOJkF0mwHouCB4N8CBe>3Trg4sGTc54VQre9#E_ zRhH!ptoYqZV(?=qVA`I-3@dg5JCPFHcAf2gO3#nORu3CPGc&VT-W&~TbwCa8j?85D zTliTHBu<^e##Fw}M#f*|2EmAcSrpN3g}F4A8pD(W$%EP-0oXe(GY`&%tbvebeFv$p zegt5wmk$*}8;hZhdBx=}DZxsn9NF+j&6_nB{RpCNOC0<16Q;TmzLq(_4NqkVU*F02UFHd&w)ZF}q9uii_$3y7VM!TR#ehULiMQe^PT6NSj; zVq|kZviW+j@kTAu5oh;G4ZTtiYAYW%7rlMes2_c;^H*7@)yjjg%u$fZ`y(9>dZizGI{#$G88!nx9BA!9e4II`2AKc~IQyPr?vBxiYJ8W#=e&(5H$6`mH)tc~9LCkWQgn7WYM81yqo-qSV%=Zze_%i@vAe3>&iywGDH~mqFN5sLm z?Ajm0?+e5`ovy9U)b^B`THYG{>gXGr-`s3k3fmp% zsLn)?%OWj?(r6qn5acdXBF`cOwmT?=aS2kl&3alKiG*>^b=(%oP8@qcFmle?!@Pcl zy4mD5LUOj5-An|=?u3Q1H7=ARbJj!QtcOz3M2T3o;6qno>_RI8> z6y_i&8rC66lHAYt{n0d!nU=tp=u7)^0?d~>zoCAodW|+!s@j>lsGAZnExV;#r-pGg zJ^6hK_+tXhX8L_{G5qw9iz)VEWhx5LT{4V%5(s2Rfq`-Cn zMKnrbHY!ytQ=XJ5hYF~8DNhm9DdZ;t?50_p2EEn~iP{CU1jw#e1d)gz!^2$F3w2WaO%6U}p+a4Ia)WhJ#YyKv)mjHHV_Oh)y ze%;U|0D~4Xbg99U3|$mF$IbELmqRz%~!XEjN&Mdlq|txL*tWw0{L~yN>pO^DRQwN)opurU8sDdYT-H zSN`Kz5})^+_rlHtXtYj&aoH`3ZT9xvqA-E+z!V>4u+H5P?TJTWWdD~a;#HZ|2%R&C zU*(8yR-7@m2y@%wh>0h|z}UwPjDLzmECYrHaemK@jT_CRhQ+Z)JuZcWr2F#Mepa@b z9PeI=?k+{T-)a9*7e<8UJuo6^CL@yO5V}r7=%WuYBE)Dw`7FrMg4d!0S04G3r}NQ6 zh3KJT^iV#i-(-gTS((Hel7}x03`^hb+~@PY@09^f!Gqe0_&=~Lul!#)#L?uuoHbe% zVIo#DchHxg2cgrN0?-t;w-6R|frjtn%dZP)u`k_YAH&Xj*8EnVGq3Zq>s$Sfm|p0j zsqXAz+Wo*}4yQ8M2tPKrkb#+N5+@?i;W9~Rf7s$~uERar{rAPTvoV?`iA(VJ~W!WlSqvzgg>jA}T^hmADlS~~NGsi4YrPf{o5 z>ZnVo8OVDd9@?tp$``lnYMZRG3cW%&mxEDmSU80 zXg~*O>CMLu7FrG!TMp$Thf3kL%l9pXNAls3Yb~)-^CLICp4KMxf>un0JdI5-rRv#K zX?G@wMntYJ5i#Enhq07#1#agha!yFgwtYzFjkUtnmeTA9GnUf6Mkw2imvM;@dyrPO zqsMl-i}ic}A-+)6V2W=XFsT($&5G{8kM&d(`T?_Yt1rEY^6L^lqR@b^&FmG1tC>xPExzo265|5(Ksu&-(I`5B#g99Al@ z$=SJuIepf+wodnOKPDWN4IHtvH`Z08PcrMVP-)FWSD*E`6CGDo8=kTH-$ItuP7)%V3YuxihKYU7C2Uo2}QUWmm3K^j8uj%RLg&(hC-Pk=;D*GUYOS|jiRs+{QoSTsL4Ev0X$)ZKrhKIkW5 zX;nCA#Ep`PPc^W~<8P)Jj2$SV{XM1#tv5cA5kA|ZC|Kf~hDqeB+$p?@tv*d&^xf}- zuxWhFOCM0=mG|KFTeew>!(?A(X8Im%MQmV3`^N8%i_!@h+Y>{~bib3#iNtXgGnOvh zxTs4vF6!dOMKJa6CS(4J_(8S>0CS!S{|4Q}KXg$#D^G=?gotT>jbcycEE(Of?T=cv z{bsK_$fW+&3Eer7!Fa*P3{n7yV}|?kNtII#xY7T=K_+ff1#4)rOzzpyG(RQsrVhp> zuol-t4VXQVA*a*Rk1reONT&FjEXwpETB}q7GP!g1Me8V#nTxG1gI#lX+1`VHmvthiL4vxWle_D>ElJ?AkZD^-d^BnC&9IHE#uW&18sY zx|to4_OJ09*!vqi_{N5xk?X$`_#XuJ0@y5MfONAfL;PjSnwve3%{mFz`s+bco?C%>ImELFsN^Mpyd;%L_`>Q zi3Ie|!ePj*R^8m`QN*e!s+-d6s7L#s$kTnV0}U}Y3CQOF zJeXGoSE)nUf!`1h6Y%uXoDApka>4cuI2Cx z6SY?;C&wlBY1HZ;AqvzLe}e}r4DZc{>E~VmJJQM1g^5{`@IO#3w;`5(_61{N(c$+# zpO5Y?M0XdXyYs=_tOb_Cqf6n@LU?mAyg9FIX1G|JfRP z*8!Yn_6!5v6mAL2OeVJ28{-J9Pl<9eHu~{_lMZ=~$FVH&3*^I4x0jEfRB9$SeLyI> z2LL0b^(l>QV+W}M(p~UvyAd=*{As1xAFIphTi~Y-sBNv@0R^^e4h@?aPq*39%GdB4uJO?Lg+NU=A~1+ zyh3v-o8rHh9lhv z&Ds!(rwtOI*`cXZrb7Gh1s>#;m*IFz`Z)T3QD5t#`ERP!{EI0>tv@^V!O-=$>bm}E zy+U#Q1ZJ-CZ>gxKq4?KN7NJ@TMkUlqbFCGL43)nOE|~coVnF4O!zB0EH2(K5MeqNU z^M&Y+~CF^_LP*gg*dbXXG%gjXO@X_NNaT53QSFG=b7^}%E?%P&I!el z_x9t)af$~_A+fe`5@xM9CX{lVway3Ub#h&xpT?rZNykYJG)E)k7}eq1BF@C9l4K1s zZWh;4dRaNaKx2m)!N`hhBB!wgf@43Zs4#J+^^tA1V!4wqb<$i{CHdMi8rP~NfGx&u z!n^IC4*0qF%=%^~aoXIiLMPq1WMrdj@y76Y$mM%xk=z7U=vC5)X#u)qfW&fc`qxF{c+*%BaP57?~iyedc zvKBMn{mVkL!4SOYzIKLC?lk7;_P-s$=j#}uOxn%7xBeARq~SA z&J~qhYkfWiN;8YVtB(yUB0)5}5kziqEtK#G@L@j+`r{samAh&d(!L{#^ETsuAu372 z-u3izzwCP(%_F~r-I8>`Hg-ywY~ARO?2l2HgkqM24dQ$8t zl{Dm~j^Z}Dqmz8kEY0e8IXR0nv5iV;w&EJ>#T7FKt72!0e+pP}l9rAE;qP3Wq~#Xt zn1D2`9|&I8IG?g%j{Zi#{?`+CI$+${>Xy)GKSs=ag*#C&J&|J;W2uSgbYW}do;CuB zb6RZ$m9|Vh!O`y`51R8{_36*5sDf&Cew*%YXn^4H3$x3GK!OMnjjp@)4k=8gi_*4zhpcFpq1%is&$`MJp9L zin>uh-hG6xtRmhhsdy?BKlRD_=V+?VE_D;xlR9G5-~b2Ml~(vSupFIMrXjqUtBS^$ ziYS8LJxo5L{uG9`|xa5x2OYnZeZ4@H54;q zw-kg-!YO0mpUMjD|3PkcVU3$|R?5c4@{xW*+ZkdbN0E{@J23*GhzRCIY=#5c{A$Ov zG43;}&m*bILP>rb9*%jLRT94bnWG*~Lm3p`T_d!**`8;&jUv(i&CA3dji2H|!{X*o zval&C#TbVt#Z!)*hj;RWJY_hYSOJrxpXXj67REk`?Yiw9`Zy&AG@`%Cht$mb={w4H; zRv^zM0#_C*B$Q!|WfN z&2M@DH?zS$P-r?>Y&w_^9xOF9z5e-EpT77sv%ua{Xu7A^Lx`Vg$CFEtd6!yGwvbupN5eMBUm=AsH_fo=7y?OM^F&{zST7PR_MVcWw4+O7nR|>adQGQ zXGa1bLUnkRXtWlo>4^wiIF^W)nr#)=k%vkCx@^wuoN07gocVC zl7Fh*yq-jf#zjrY>bX8~K$I2jqJV9)0(b~(Qa0apG%5M!Ds`uZFyN+M`vKM4k_+h1 zVjv`KTMBJ^udNW8D268TO4ZxFg;9HX_8a{Gsr3P2izX(z?Gu~vM8`_8K6Xg; zc&VeS)YE&T*54euDFNIffIrJ^2;szBHs@ImZ(9m)D};C0@;*Si3%Yt%;c*_Lv{W64Z-4k>~1xrju5b1d=yf46L zgZ;I340|_E(%BevawLw&NU&V#JV<@b-~jzY56=pTD_?eIW|keSL3S3&)3fP?jJb3` ze^7&$;FO(nFq2@`9a(MmB#OvhF@b;BnK<^~Lgt)NGqy|gnEqP*AP*dW1~U@Aa?0Jb zSbdUk5KEj)(7w~y$Z2dqrSm;z$)Y3~tCq8=oabkK@UoEYN^<<FyM1LH~lR`bjN}N>7{sqFfHiqUadox*0kT}uZ z`N%+w7bAnHm!n@u#xIgA@xOuxwaxG{RCJW9Fuh|cx)uY!jB;R)#5HsOg_uh-asylL z?8CIHzSP#emeXO0lJS*SNT?FWFRj@=e%VJaQKZ7@rDEO4!u$)!4(Fe2K_#>XxEYcv z2OZjpVf<%QYh}gsfS*&%HX;W$;9R;7UAh*Bj}BaU=-Uq$nzj|2w&jD{uD5lGm0i1% z$!sRV-dj*7*tLmFBJ-*^4aMkhE%bkHa_sd8D3*d^ui$pI%TPBsxX5w*vfX7Zsxr+eFF`Q?`$hC?52o$IcC*ZYc zer|Z`=^wxebV!Xui-+kj4jg6S0u&z|k|Bbic;p4fAloq*ya@E-(NX$muoDYdqf4T= zL~a`Gs4Le`r}6*Aj3Hz+AH2(9o6mUS__XFH-+DEXO|b1c$&5zQR@qN~1eVcAQ&SGW zOd{d8KZj*FQIY{4{=bx&vazGR(3;s~ zhAi5&2*TKzy6iM1Z3F%6Con=_oB(Y?WdHli{^XXQ`I|JZ)ywh%<)}<=_N2$?p~cD+h|z@64f&a&Us1 z^10dA7tEdo{!6syIVLx9TQ1UJd=76B^())RtO5+Z1GXGol&>7Dj8MgLL@cOx%Uu+yl8K1p>zCS+OiJi1{({$rBiLXiQG=YdZp^%284J{@#rhl%4^ZIt|+hlL| znB9wG%Ppqz1CK=@g$Ew;0Hp!M3om^`l|bSFq;q7{=%h-O5QrinU6mqLdE)oY?5_75 z$0{xV)_0%hX1@7m=9};T{xTemf($-xN+eHR(FM8nFt5X)jnwyG^%EmwbWU z&?axN8;N$x5)SmNR#_UTutD;m(zD z+nO0~Eci9oIX3p#W8{hn-yQ$k~GBF5HO37V{e(D$?uub;1vz3Zt)On@S&Q~gR*KFFt@QHo?f6d(G{4^%p>K zuQ_;Ef3NHxx~sp)i?Nj+fp%@&OVQj1-Aa}F%>Cv=_}_2lA)*J`h0}&p<@SZD+u+7D zL@ux6c|jNrPdD_YWBIx}tIxaQvhLRmU#}XDKEw68VRGH$4Fh_|?FH%v72BAx`B+|( zn4qz`ZgRtf4Dtzms>XHSs&jp`YP;3Tx>SRbK40SwNL!xn(H?X(0%F|Mji&F`q3Kn_ zwin`Ly_&^sb3&h^Z80;aq#rISd9gpyMgKL1z2YP$gqJutNkNu{Uh)6AHUgu{H@vF zU2XLrU+sT!t^dVV_C=|ulVltX&vowPJzwZcxFQ&OG9a7VNwP2C31IlVrj@kCSEK7t zo9dFbdYzk=l;J>b>DmI>Rf|tR59-|WU?U;TUR78#bkihe3PGQBh5Q-FtrD$h(HmNO zaMJb9)f+aiLm0Rz#S2{CiEWBefWU|=9%dAo#qDtxsy|^~St?VAjs7ORG z#OUI2DcbFOu;csD&OWt9##r_OTn!n9>1ip%qX#T!_CN`Wsg#Hm-);JO&G3K)jrX`8 zn=KAv(>FB95swa_r5iE$IUUdzj4~%I&a!Vg%0&3q{Ro~T88!JbG6W@Exbd#kN&=fM2U3M1Mx5^t7u<7t8mQT@(F3qkP6M`vn z0{Hj~4Q254CXs?=uhuvm1{j49Mfsw6$dLtI5~A6FMjg^g1!1c>9LOvwW3*T0RR~`( z1-#PDCR~wA8;SfAq>{868jZ!wG3l+OhtlUE*@yI+I}eL54n=fb2X0RaeBgo9y5TC) z2mDCbp*@n>@}7>JGqNoda1{KZ{& zO9BoZjD8^|3_CxeFf9Hg+U-3g0k^0e8%}+1_ZvIg3pLB;keYxu>(dXB#LyKGlW;v% zZe0oeyDgdQsTII9&oaa4gRJuS!Ol?29XRg*2%{)XsJ?G$P=DKTOIQWYSCH67YRtZlGcD2rj7>*>;j-r%XF*A znNkRlYwaZbtvEoVloPeH4S`@<_zUu^2s61)#_}_SK;BCooIHbglE8*6OY(sL^?T=W zYs=AJC()D6b{K&nw)en~N8kEvCz(vYq;=SqFyE6Np=o!4?JUzrL}LRVB+<9>qUxpb zl?o+yzz6|h>|ikL&4l|}-(e?{ zp#|>&R3b_&KHE;4+%^{O^vcL740F3B^Ug?Al=J*FCOb{k`ll=B4HnSCcQXdEmW-lWA-zmZOW|O?IEUMEsD?Wtq*3 zoKMx0;CT&eUBH@1g_6dhL=fqmMlj%$QwmB-NP1;W2`Q^pt*Q8hlH`f1ZFt_q^puKm zWppp&UeiTdNp5S_axAZgfJOREiiHE$7bVHK{|V5)YSo){9RVGp4MaXNTSiLhacsf# zN{Ba*Yas7H#v0}zFuf|Yq8KRVmnm05_>C~fv^>hoW$Y2e;Sw)cT)Dr0Qz|WMS(Gtt zM#NbH`v^$OtE1KKor(!dDJ{;?uvGc4P)p$` zE~&)ZBe5ml7i8M`S;Mj`#w=O&^B9`N*ZVubU-5_ZaD)x*TOHiLMxSHL&)zzCq;>G* z>%Fh{ey{Hbeb;xa4(x9Y?Emc}zZqSA`rX{{YHrtBZr3}xBR6wLZf$$u`u(%-`BkOtUg z3CaE>$rAnyjcW|{ZSNM=Dzbz?j-G$X7ACf!zPT-=qRa+cC@s;iuo)?0>y}7XRe~sa z-tueEr7$Cgexp9euQn{?V7inHsq%9Om>poj#C$rdL%~*Pbwc%?p;F%endOP`=znPt z($XLZsn6YZpp=a1yACPqE}|9d?iF5foj|*v1Hx;B^fiEG)){7xKhgT!xj(LJZRuvN zw3<7(mOJ<+U(FqB<&OQq|NT{{aJq;>Tkk`wh23j~-R~5R-Ygt_>*?P;-zpqkEljNy zrdp{f6^Bp|Tg5ke-~*M?Jc-6up~Ll$p)e3;&G=;~%+E<5Aw|>S24vM=7h$9BA_<58 zlf!W@fr9JoEZ&z;_7~OLRCQHeGQF<|#aq2mkzQ!M(yX#Xs@knrZVv=S1X&lBsH3PO zY*NCKOOWx!eE46aw~TJ(4|E;PzjH|F>jcHvA5{oo6ICbj6GnETdr>4Gsp>po2$*(?l=1W3ulR_dvmQzZjkj$c7R*4*y z5AI}7s@INBh;QO2nK91-M2Mkjx7bLl`|}E!OpUkBzl9``lus zR`;iqNoaV9c{ljs@b$B64;(~LrWFyCg-CgJU#Ycobam&WYdarpvB6H}tD1(qb94BC z?Ef%6Y9?4>;Jwkqo#g!*VyiBIEIBc-vb&R@-sAn+*OBDk13psJPIg!~&~w_c4!Z}C GSMg8YwI(?L literal 0 HcmV?d00001 diff --git a/venv/lib/python3.11/site-packages/anyio/_core/__pycache__/_tempfile.cpython-311.pyc b/venv/lib/python3.11/site-packages/anyio/_core/__pycache__/_tempfile.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..ffc0b40a85c1eedac6d5a2889cece30e007b4c2f GIT binary patch literal 28603 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�Ag`T_hPGj9%%9>l zH!f*X?k>Ez(7kGr{}&bT-y@!;C*N)9xOzIv0Il@ptDJrCXarbv|E#8Xm;4i%vHgqt z(tg?||7ESuyo0{C|N2{t``+6Iuk0^-hBG}|vfk}!{f4t-FF8y0lCxxcWk9Tj{nstM za9z9M{H!iB^6YY8S0=D4U0-s0c5w#Wjk+k$5!gfEc>;S0>;o{yGlT`=fw!rvoI;?~ z$@|xW<|ToG(I5SpQnRbz)J@Qng-|qyt+)o&<)S$!9RKf?eE9#0|2x?Z9!Nk zz!?aGK*<`~GRQfQF>6ZV(K1ar^dL=Hd1zR(5v#Pxx5TUUKcie1I?6PlmcW6@O{Kn4 zaC$E^-qO_X9?J|)EH^!!X?i;Ct$5QJ5k~vmbkHekUe4Hm0?d3aW1&HMWTB#omrcRO z?0Zu)6ELm*Af@?N0C18nr)ksNrtBi{5&^1k@pf_=+Y|zSN}Yw2YO}^$M;b4IK4HTk zwqWDTuzYpBYqt#t;|*`34chhWNmv#3RruOhObu6GsIzzk{xc*|odAaTkgJNHrn9o< zl-qdip&nC*fWdIB9q&b0saL#wZ!158ccsx(GJcNlgOyELE-4Bt0RxRC#c1#P$iW+r zde};{b|CtXwriC@);>6d~pssig@tw=9qj&j`1^?p=RK#eu^2x%GC-MWQUv^r-^d~ z>Nt^(on5Ap@i;>vpOYi=I9!<>1oc={9=7!N5IRozbWEvv-q6~hl@$&ury8+CwK3q?VvVx3~L&Yz9za`WZg$3^)-xjOz0nao8vewHKIi4;3jCH z1v_F+Qxhj)*er-G+tG1&&t0uYcTkW1HllLI`q_|x8LYAY_x5K7p89;|k7j-n`A<(R zHy+9~9!l4i+|EP1>oYN&W+nYva|BTS1EQ*wL{}Gx-zCQH{|#@q6fs&2PH0`^ZZitm ziX)Ghn?ji|u&pGgx`xF)d}OILv9KjaLzp46>%($ziTGmm9{6Pa{9DjnO-vlcfdg~l z)U4TTvI>*3w*N&jX`z4*!Ktex#-|DK&?DL(bncr1uTq22>Kw71#@(iKDU6a-W;oWb zN;-F;yX~UxM#{d%Z(<3*EjPZHX?!tVTXH*JWW6$i#KuKz@HR=+lL$O`M=TNkEM4%z zUzeLdv^j!Wh={4TmeDqaQ~Ip~rn;_a=!su2 zNtvisnVz);dY&jI=v^Wx0Xnb00ztPeH*U`~Zco>i+|KQcpg5~~zv59(^XK%5N!={O(y&lbnv5w;MQx`j&0i4ipHf248U-W?U!gf&k6E!; zEGApK)o@lU42${S3Gsg+#G04;%wcSoq*6;ES{cm=OiseWCH)r{ zW9&Z#0WvbmQuiLWDBk8s7 zy!(4L86E(Ll{`0{n(^YeDWUURp-JBz!eBiq=LuXfowur6r^ zSSYmDTx!eP>1_ig=cVVf!o5l9qUa{dE^73$#xiqju z+F(Jj00T3<^_h!8u|Z7>FvV^_!S!OyAR&AT0cVz)%s{adW C{xkFd literal 0 HcmV?d00001 diff --git a/venv/lib/python3.11/site-packages/anyio/_core/__pycache__/_testing.cpython-311.pyc b/venv/lib/python3.11/site-packages/anyio/_core/__pycache__/_testing.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..852788fa03bb945fe3197fd3187a5b0d5a32534c GIT binary patch literal 4100 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 Tz@!8Qdzn1Lx#zD~;D-ATETU?S literal 0 HcmV?d00001 diff --git a/venv/lib/python3.11/site-packages/anyio/_core/_asyncio_selector_thread.py b/venv/lib/python3.11/site-packages/anyio/_core/_asyncio_selector_thread.py new file mode 100644 index 0000000..9f35bae --- /dev/null +++ b/venv/lib/python3.11/site-packages/anyio/_core/_asyncio_selector_thread.py @@ -0,0 +1,167 @@ +from __future__ import annotations + +import asyncio +import socket +import threading +from collections.abc import Callable +from selectors import EVENT_READ, EVENT_WRITE, DefaultSelector +from typing import TYPE_CHECKING, Any + +if TYPE_CHECKING: + from _typeshed import FileDescriptorLike + +_selector_lock = threading.Lock() +_selector: Selector | None = None + + +class Selector: + def __init__(self) -> None: + self._thread = threading.Thread(target=self.run, name="AnyIO socket selector") + self._selector = DefaultSelector() + self._send, self._receive = socket.socketpair() + self._send.setblocking(False) + self._receive.setblocking(False) + # This somewhat reduces the amount of memory wasted queueing up data + # for wakeups. With these settings, maximum number of 1-byte sends + # before getting BlockingIOError: + # Linux 4.8: 6 + # macOS (darwin 15.5): 1 + # Windows 10: 525347 + # Windows you're weird. (And on Windows setting SNDBUF to 0 makes send + # blocking, even on non-blocking sockets, so don't do that.) + self._receive.setsockopt(socket.SOL_SOCKET, socket.SO_RCVBUF, 1) + self._send.setsockopt(socket.SOL_SOCKET, socket.SO_SNDBUF, 1) + # On Windows this is a TCP socket so this might matter. On other + # platforms this fails b/c AF_UNIX sockets aren't actually TCP. + try: + self._send.setsockopt(socket.IPPROTO_TCP, socket.TCP_NODELAY, 1) + except OSError: + pass + + self._selector.register(self._receive, EVENT_READ) + self._closed = False + + def start(self) -> None: + self._thread.start() + threading._register_atexit(self._stop) # type: ignore[attr-defined] + + def _stop(self) -> None: + global _selector + self._closed = True + self._notify_self() + self._send.close() + self._thread.join() + self._selector.unregister(self._receive) + self._receive.close() + self._selector.close() + _selector = None + assert not self._selector.get_map(), ( + "selector still has registered file descriptors after shutdown" + ) + + def _notify_self(self) -> None: + try: + self._send.send(b"\x00") + except BlockingIOError: + pass + + def add_reader(self, fd: FileDescriptorLike, callback: Callable[[], Any]) -> None: + loop = asyncio.get_running_loop() + try: + key = self._selector.get_key(fd) + except KeyError: + self._selector.register(fd, EVENT_READ, {EVENT_READ: (loop, callback)}) + else: + if EVENT_READ in key.data: + raise ValueError( + "this file descriptor is already registered for reading" + ) + + key.data[EVENT_READ] = loop, callback + self._selector.modify(fd, key.events | EVENT_READ, key.data) + + self._notify_self() + + def add_writer(self, fd: FileDescriptorLike, callback: Callable[[], Any]) -> None: + loop = asyncio.get_running_loop() + try: + key = self._selector.get_key(fd) + except KeyError: + self._selector.register(fd, EVENT_WRITE, {EVENT_WRITE: (loop, callback)}) + else: + if EVENT_WRITE in key.data: + raise ValueError( + "this file descriptor is already registered for writing" + ) + + key.data[EVENT_WRITE] = loop, callback + self._selector.modify(fd, key.events | EVENT_WRITE, key.data) + + self._notify_self() + + def remove_reader(self, fd: FileDescriptorLike) -> bool: + try: + key = self._selector.get_key(fd) + except KeyError: + return False + + if new_events := key.events ^ EVENT_READ: + del key.data[EVENT_READ] + self._selector.modify(fd, new_events, key.data) + else: + self._selector.unregister(fd) + + return True + + def remove_writer(self, fd: FileDescriptorLike) -> bool: + try: + key = self._selector.get_key(fd) + except KeyError: + return False + + if new_events := key.events ^ EVENT_WRITE: + del key.data[EVENT_WRITE] + self._selector.modify(fd, new_events, key.data) + else: + self._selector.unregister(fd) + + return True + + def run(self) -> None: + while not self._closed: + for key, events in self._selector.select(): + if key.fileobj is self._receive: + try: + while self._receive.recv(4096): + pass + except BlockingIOError: + pass + + continue + + if events & EVENT_READ: + loop, callback = key.data[EVENT_READ] + self.remove_reader(key.fd) + try: + loop.call_soon_threadsafe(callback) + except RuntimeError: + pass # the loop was already closed + + if events & EVENT_WRITE: + loop, callback = key.data[EVENT_WRITE] + self.remove_writer(key.fd) + try: + loop.call_soon_threadsafe(callback) + except RuntimeError: + pass # the loop was already closed + + +def get_selector() -> Selector: + global _selector + + with _selector_lock: + if _selector is None: + _selector = Selector() + _selector.start() + + return _selector diff --git a/venv/lib/python3.11/site-packages/anyio/_core/_contextmanagers.py b/venv/lib/python3.11/site-packages/anyio/_core/_contextmanagers.py new file mode 100644 index 0000000..302f32b --- /dev/null +++ b/venv/lib/python3.11/site-packages/anyio/_core/_contextmanagers.py @@ -0,0 +1,200 @@ +from __future__ import annotations + +from abc import abstractmethod +from contextlib import AbstractAsyncContextManager, AbstractContextManager +from inspect import isasyncgen, iscoroutine, isgenerator +from types import TracebackType +from typing import Protocol, TypeVar, cast, final + +_T_co = TypeVar("_T_co", covariant=True) +_ExitT_co = TypeVar("_ExitT_co", covariant=True, bound="bool | None") + + +class _SupportsCtxMgr(Protocol[_T_co, _ExitT_co]): + def __contextmanager__(self) -> AbstractContextManager[_T_co, _ExitT_co]: ... + + +class _SupportsAsyncCtxMgr(Protocol[_T_co, _ExitT_co]): + def __asynccontextmanager__( + self, + ) -> AbstractAsyncContextManager[_T_co, _ExitT_co]: ... + + +class ContextManagerMixin: + """ + Mixin class providing context manager functionality via a generator-based + implementation. + + This class allows you to implement a context manager via :meth:`__contextmanager__` + which should return a generator. The mechanics are meant to mirror those of + :func:`@contextmanager `. + + .. note:: Classes using this mix-in are not reentrant as context managers, meaning + that once you enter it, you can't re-enter before first exiting it. + + .. seealso:: :doc:`contextmanagers` + """ + + __cm: AbstractContextManager[object, bool | None] | None = None + + @final + def __enter__(self: _SupportsCtxMgr[_T_co, bool | None]) -> _T_co: + # Needed for mypy to assume self still has the __cm member + assert isinstance(self, ContextManagerMixin) + if self.__cm is not None: + raise RuntimeError( + f"this {self.__class__.__qualname__} has already been entered" + ) + + cm = self.__contextmanager__() + if not isinstance(cm, AbstractContextManager): + if isgenerator(cm): + raise TypeError( + "__contextmanager__() returned a generator object instead of " + "a context manager. Did you forget to add the @contextmanager " + "decorator?" + ) + + raise TypeError( + f"__contextmanager__() did not return a context manager object, " + f"but {cm.__class__!r}" + ) + + if cm is self: + raise TypeError( + f"{self.__class__.__qualname__}.__contextmanager__() returned " + f"self. Did you forget to add the @contextmanager decorator and a " + f"'yield' statement?" + ) + + value = cm.__enter__() + self.__cm = cm + return value + + @final + def __exit__( + self: _SupportsCtxMgr[object, _ExitT_co], + exc_type: type[BaseException] | None, + exc_val: BaseException | None, + exc_tb: TracebackType | None, + ) -> _ExitT_co: + # Needed for mypy to assume self still has the __cm member + assert isinstance(self, ContextManagerMixin) + if self.__cm is None: + raise RuntimeError( + f"this {self.__class__.__qualname__} has not been entered yet" + ) + + # Prevent circular references + cm = self.__cm + del self.__cm + + return cast(_ExitT_co, cm.__exit__(exc_type, exc_val, exc_tb)) + + @abstractmethod + def __contextmanager__(self) -> AbstractContextManager[object, bool | None]: + """ + Implement your context manager logic here. + + This method **must** be decorated with + :func:`@contextmanager `. + + .. note:: Remember that the ``yield`` will raise any exception raised in the + enclosed context block, so use a ``finally:`` block to clean up resources! + + :return: a context manager object + """ + + +class AsyncContextManagerMixin: + """ + Mixin class providing async context manager functionality via a generator-based + implementation. + + This class allows you to implement a context manager via + :meth:`__asynccontextmanager__`. The mechanics are meant to mirror those of + :func:`@asynccontextmanager `. + + .. note:: Classes using this mix-in are not reentrant as context managers, meaning + that once you enter it, you can't re-enter before first exiting it. + + .. seealso:: :doc:`contextmanagers` + """ + + __cm: AbstractAsyncContextManager[object, bool | None] | None = None + + @final + async def __aenter__(self: _SupportsAsyncCtxMgr[_T_co, bool | None]) -> _T_co: + # Needed for mypy to assume self still has the __cm member + assert isinstance(self, AsyncContextManagerMixin) + if self.__cm is not None: + raise RuntimeError( + f"this {self.__class__.__qualname__} has already been entered" + ) + + cm = self.__asynccontextmanager__() + if not isinstance(cm, AbstractAsyncContextManager): + if isasyncgen(cm): + raise TypeError( + "__asynccontextmanager__() returned an async generator instead of " + "an async context manager. Did you forget to add the " + "@asynccontextmanager decorator?" + ) + elif iscoroutine(cm): + cm.close() + raise TypeError( + "__asynccontextmanager__() returned a coroutine object instead of " + "an async context manager. Did you forget to add the " + "@asynccontextmanager decorator and a 'yield' statement?" + ) + + raise TypeError( + f"__asynccontextmanager__() did not return an async context manager, " + f"but {cm.__class__!r}" + ) + + if cm is self: + raise TypeError( + f"{self.__class__.__qualname__}.__asynccontextmanager__() returned " + f"self. Did you forget to add the @asynccontextmanager decorator and a " + f"'yield' statement?" + ) + + value = await cm.__aenter__() + self.__cm = cm + return value + + @final + async def __aexit__( + self: _SupportsAsyncCtxMgr[object, _ExitT_co], + exc_type: type[BaseException] | None, + exc_val: BaseException | None, + exc_tb: TracebackType | None, + ) -> _ExitT_co: + assert isinstance(self, AsyncContextManagerMixin) + if self.__cm is None: + raise RuntimeError( + f"this {self.__class__.__qualname__} has not been entered yet" + ) + + # Prevent circular references + cm = self.__cm + del self.__cm + + return cast(_ExitT_co, await cm.__aexit__(exc_type, exc_val, exc_tb)) + + @abstractmethod + def __asynccontextmanager__( + self, + ) -> AbstractAsyncContextManager[object, bool | None]: + """ + Implement your async context manager logic here. + + This method **must** be decorated with + :func:`@asynccontextmanager `. + + .. note:: Remember that the ``yield`` will raise any exception raised in the + enclosed context block, so use a ``finally:`` block to clean up resources! + + :return: an async context manager object + """ diff --git a/venv/lib/python3.11/site-packages/anyio/_core/_eventloop.py b/venv/lib/python3.11/site-packages/anyio/_core/_eventloop.py new file mode 100644 index 0000000..59a69cc --- /dev/null +++ b/venv/lib/python3.11/site-packages/anyio/_core/_eventloop.py @@ -0,0 +1,234 @@ +from __future__ import annotations + +import math +import sys +import threading +from collections.abc import Awaitable, Callable, Generator +from contextlib import contextmanager +from contextvars import Token +from importlib import import_module +from typing import TYPE_CHECKING, Any, TypeVar + +from ._exceptions import NoEventLoopError + +if sys.version_info >= (3, 11): + from typing import TypeVarTuple, Unpack +else: + from typing_extensions import TypeVarTuple, Unpack + +sniffio: Any +try: + import sniffio +except ModuleNotFoundError: + sniffio = None + +if TYPE_CHECKING: + from ..abc import AsyncBackend + +# This must be updated when new backends are introduced +BACKENDS = "asyncio", "trio" + +T_Retval = TypeVar("T_Retval") +PosArgsT = TypeVarTuple("PosArgsT") + +threadlocals = threading.local() +loaded_backends: dict[str, type[AsyncBackend]] = {} + + +def run( + func: Callable[[Unpack[PosArgsT]], Awaitable[T_Retval]], + *args: Unpack[PosArgsT], + backend: str = "asyncio", + backend_options: dict[str, Any] | None = None, +) -> T_Retval: + """ + Run the given coroutine function in an asynchronous event loop. + + The current thread must not be already running an event loop. + + :param func: a coroutine function + :param args: positional arguments to ``func`` + :param backend: name of the asynchronous event loop implementation – currently + either ``asyncio`` or ``trio`` + :param backend_options: keyword arguments to call the backend ``run()`` + implementation with (documented :ref:`here `) + :return: the return value of the coroutine function + :raises RuntimeError: if an asynchronous event loop is already running in this + thread + :raises LookupError: if the named backend is not found + + """ + if asynclib_name := current_async_library(): + raise RuntimeError(f"Already running {asynclib_name} in this thread") + + try: + async_backend = get_async_backend(backend) + except ImportError as exc: + raise LookupError(f"No such backend: {backend}") from exc + + token = None + if asynclib_name is None: + # Since we're in control of the event loop, we can cache the name of the async + # library + token = set_current_async_library(backend) + + try: + backend_options = backend_options or {} + return async_backend.run(func, args, {}, backend_options) + finally: + reset_current_async_library(token) + + +async def sleep(delay: float) -> None: + """ + Pause the current task for the specified duration. + + :param delay: the duration, in seconds + + """ + return await get_async_backend().sleep(delay) + + +async def sleep_forever() -> None: + """ + Pause the current task until it's cancelled. + + This is a shortcut for ``sleep(math.inf)``. + + .. versionadded:: 3.1 + + """ + await sleep(math.inf) + + +async def sleep_until(deadline: float) -> None: + """ + Pause the current task until the given time. + + :param deadline: the absolute time to wake up at (according to the internal + monotonic clock of the event loop) + + .. versionadded:: 3.1 + + """ + now = current_time() + await sleep(max(deadline - now, 0)) + + +def current_time() -> float: + """ + Return the current value of the event loop's internal clock. + + :return: the clock value (seconds) + :raises NoEventLoopError: if no supported asynchronous event loop is running in the + current thread + + """ + return get_async_backend().current_time() + + +def get_all_backends() -> tuple[str, ...]: + """Return a tuple of the names of all built-in backends.""" + return BACKENDS + + +def get_available_backends() -> tuple[str, ...]: + """ + Test for the availability of built-in backends. + + :return a tuple of the built-in backend names that were successfully imported + + .. versionadded:: 4.12 + + """ + available_backends: list[str] = [] + for backend_name in get_all_backends(): + try: + get_async_backend(backend_name) + except ImportError: + continue + + available_backends.append(backend_name) + + return tuple(available_backends) + + +def get_cancelled_exc_class() -> type[BaseException]: + """ + Return the current async library's cancellation exception class. + + :raises NoEventLoopError: if no supported asynchronous event loop is running in the + current thread + + """ + return get_async_backend().cancelled_exception_class() + + +# +# Private API +# + + +@contextmanager +def claim_worker_thread( + backend_class: type[AsyncBackend], token: object +) -> Generator[Any, None, None]: + from ..lowlevel import EventLoopToken + + threadlocals.current_token = EventLoopToken(backend_class, token) + try: + yield + finally: + del threadlocals.current_token + + +def get_async_backend(asynclib_name: str | None = None) -> type[AsyncBackend]: + if asynclib_name is None: + asynclib_name = current_async_library() + if not asynclib_name: + raise NoEventLoopError( + f"Not currently running on any asynchronous event loop. " + f"Available async backends: {', '.join(get_all_backends())}" + ) + + # We use our own dict instead of sys.modules to get the already imported back-end + # class because the appropriate modules in sys.modules could potentially be only + # partially initialized + try: + return loaded_backends[asynclib_name] + except KeyError: + module = import_module(f"anyio._backends._{asynclib_name}") + loaded_backends[asynclib_name] = module.backend_class + return module.backend_class + + +def current_async_library() -> str | None: + if sniffio is None: + # If sniffio is not installed, we assume we're either running asyncio or nothing + import asyncio + + try: + asyncio.get_running_loop() + return "asyncio" + except RuntimeError: + pass + else: + try: + return sniffio.current_async_library() + except sniffio.AsyncLibraryNotFoundError: + pass + + return None + + +def set_current_async_library(asynclib_name: str | None) -> Token | None: + # no-op if sniffio is not installed + if sniffio is None: + return None + + return sniffio.current_async_library_cvar.set(asynclib_name) + + +def reset_current_async_library(token: Token | None) -> None: + if token is not None: + sniffio.current_async_library_cvar.reset(token) diff --git a/venv/lib/python3.11/site-packages/anyio/_core/_exceptions.py b/venv/lib/python3.11/site-packages/anyio/_core/_exceptions.py new file mode 100644 index 0000000..3776bed --- /dev/null +++ b/venv/lib/python3.11/site-packages/anyio/_core/_exceptions.py @@ -0,0 +1,156 @@ +from __future__ import annotations + +import sys +from collections.abc import Generator +from textwrap import dedent +from typing import Any + +if sys.version_info < (3, 11): + from exceptiongroup import BaseExceptionGroup + + +class BrokenResourceError(Exception): + """ + Raised when trying to use a resource that has been rendered unusable due to external + causes (e.g. a send stream whose peer has disconnected). + """ + + +class BrokenWorkerProcess(Exception): + """ + Raised by :meth:`~anyio.to_process.run_sync` if the worker process terminates abruptly or + otherwise misbehaves. + """ + + +class BrokenWorkerInterpreter(Exception): + """ + Raised by :meth:`~anyio.to_interpreter.run_sync` if an unexpected exception is + raised in the subinterpreter. + """ + + def __init__(self, excinfo: Any): + # This was adapted from concurrent.futures.interpreter.ExecutionFailed + msg = excinfo.formatted + if not msg: + if excinfo.type and excinfo.msg: + msg = f"{excinfo.type.__name__}: {excinfo.msg}" + else: + msg = excinfo.type.__name__ or excinfo.msg + + super().__init__(msg) + self.excinfo = excinfo + + def __str__(self) -> str: + try: + formatted = self.excinfo.errdisplay + except Exception: + return super().__str__() + else: + return dedent( + f""" + {super().__str__()} + + Uncaught in the interpreter: + + {formatted} + """.strip() + ) + + +class BusyResourceError(Exception): + """ + Raised when two tasks are trying to read from or write to the same resource + concurrently. + """ + + def __init__(self, action: str): + super().__init__(f"Another task is already {action} this resource") + + +class ClosedResourceError(Exception): + """Raised when trying to use a resource that has been closed.""" + + +class ConnectionFailed(OSError): + """ + Raised when a connection attempt fails. + + .. note:: This class inherits from :exc:`OSError` for backwards compatibility. + """ + + +def iterate_exceptions( + exception: BaseException, +) -> Generator[BaseException, None, None]: + if isinstance(exception, BaseExceptionGroup): + for exc in exception.exceptions: + yield from iterate_exceptions(exc) + else: + yield exception + + +class DelimiterNotFound(Exception): + """ + Raised during + :meth:`~anyio.streams.buffered.BufferedByteReceiveStream.receive_until` if the + maximum number of bytes has been read without the delimiter being found. + """ + + def __init__(self, max_bytes: int) -> None: + super().__init__( + f"The delimiter was not found among the first {max_bytes} bytes" + ) + + +class EndOfStream(Exception): + """ + Raised when trying to read from a stream that has been closed from the other end. + """ + + +class IncompleteRead(Exception): + """ + Raised during + :meth:`~anyio.streams.buffered.BufferedByteReceiveStream.receive_exactly` or + :meth:`~anyio.streams.buffered.BufferedByteReceiveStream.receive_until` if the + connection is closed before the requested amount of bytes has been read. + """ + + def __init__(self) -> None: + super().__init__( + "The stream was closed before the read operation could be completed" + ) + + +class TypedAttributeLookupError(LookupError): + """ + Raised by :meth:`~anyio.TypedAttributeProvider.extra` when the given typed attribute + is not found and no default value has been given. + """ + + +class WouldBlock(Exception): + """Raised by ``X_nowait`` functions if ``X()`` would block.""" + + +class NoEventLoopError(RuntimeError): + """ + Raised by several functions that require an event loop to be running in the current + thread when there is no running event loop. + + This is also raised by :func:`.from_thread.run` and :func:`.from_thread.run_sync` + if not calling from an AnyIO worker thread, and no ``token`` was passed. + """ + + +class RunFinishedError(RuntimeError): + """ + Raised by :func:`.from_thread.run` and :func:`.from_thread.run_sync` if the event + loop associated with the explicitly passed token has already finished. + """ + + def __init__(self) -> None: + super().__init__( + "The event loop associated with the given token has already finished" + ) diff --git a/venv/lib/python3.11/site-packages/anyio/_core/_fileio.py b/venv/lib/python3.11/site-packages/anyio/_core/_fileio.py new file mode 100644 index 0000000..061f0d7 --- /dev/null +++ b/venv/lib/python3.11/site-packages/anyio/_core/_fileio.py @@ -0,0 +1,797 @@ +from __future__ import annotations + +import os +import pathlib +import sys +from collections.abc import ( + AsyncIterator, + Callable, + Iterable, + Iterator, + Sequence, +) +from dataclasses import dataclass +from functools import partial +from os import PathLike +from typing import ( + IO, + TYPE_CHECKING, + Any, + AnyStr, + ClassVar, + Final, + Generic, + overload, +) + +from .. import to_thread +from ..abc import AsyncResource + +if TYPE_CHECKING: + from types import ModuleType + + from _typeshed import OpenBinaryMode, OpenTextMode, ReadableBuffer, WriteableBuffer +else: + ReadableBuffer = OpenBinaryMode = OpenTextMode = WriteableBuffer = object + + +class AsyncFile(AsyncResource, Generic[AnyStr]): + """ + An asynchronous file object. + + This class wraps a standard file object and provides async friendly versions of the + following blocking methods (where available on the original file object): + + * read + * read1 + * readline + * readlines + * readinto + * readinto1 + * write + * writelines + * truncate + * seek + * tell + * flush + + All other methods are directly passed through. + + This class supports the asynchronous context manager protocol which closes the + underlying file at the end of the context block. + + This class also supports asynchronous iteration:: + + async with await open_file(...) as f: + async for line in f: + print(line) + """ + + def __init__(self, fp: IO[AnyStr]) -> None: + self._fp: Any = fp + + def __getattr__(self, name: str) -> object: + return getattr(self._fp, name) + + @property + def wrapped(self) -> IO[AnyStr]: + """The wrapped file object.""" + return self._fp + + async def __aiter__(self) -> AsyncIterator[AnyStr]: + while True: + line = await self.readline() + if line: + yield line + else: + break + + async def aclose(self) -> None: + return await to_thread.run_sync(self._fp.close) + + async def read(self, size: int = -1) -> AnyStr: + return await to_thread.run_sync(self._fp.read, size) + + async def read1(self: AsyncFile[bytes], size: int = -1) -> bytes: + return await to_thread.run_sync(self._fp.read1, size) + + async def readline(self) -> AnyStr: + return await to_thread.run_sync(self._fp.readline) + + async def readlines(self) -> list[AnyStr]: + return await to_thread.run_sync(self._fp.readlines) + + async def readinto(self: AsyncFile[bytes], b: WriteableBuffer) -> int: + return await to_thread.run_sync(self._fp.readinto, b) + + async def readinto1(self: AsyncFile[bytes], b: WriteableBuffer) -> int: + return await to_thread.run_sync(self._fp.readinto1, b) + + @overload + async def write(self: AsyncFile[bytes], b: ReadableBuffer) -> int: ... + + @overload + async def write(self: AsyncFile[str], b: str) -> int: ... + + async def write(self, b: ReadableBuffer | str) -> int: + return await to_thread.run_sync(self._fp.write, b) + + @overload + async def writelines( + self: AsyncFile[bytes], lines: Iterable[ReadableBuffer] + ) -> None: ... + + @overload + async def writelines(self: AsyncFile[str], lines: Iterable[str]) -> None: ... + + async def writelines(self, lines: Iterable[ReadableBuffer] | Iterable[str]) -> None: + return await to_thread.run_sync(self._fp.writelines, lines) + + async def truncate(self, size: int | None = None) -> int: + return await to_thread.run_sync(self._fp.truncate, size) + + async def seek(self, offset: int, whence: int | None = os.SEEK_SET) -> int: + return await to_thread.run_sync(self._fp.seek, offset, whence) + + async def tell(self) -> int: + return await to_thread.run_sync(self._fp.tell) + + async def flush(self) -> None: + return await to_thread.run_sync(self._fp.flush) + + +@overload +async def open_file( + file: str | PathLike[str] | int, + mode: OpenBinaryMode, + buffering: int = ..., + encoding: str | None = ..., + errors: str | None = ..., + newline: str | None = ..., + closefd: bool = ..., + opener: Callable[[str, int], int] | None = ..., +) -> AsyncFile[bytes]: ... + + +@overload +async def open_file( + file: str | PathLike[str] | int, + mode: OpenTextMode = ..., + buffering: int = ..., + encoding: str | None = ..., + errors: str | None = ..., + newline: str | None = ..., + closefd: bool = ..., + opener: Callable[[str, int], int] | None = ..., +) -> AsyncFile[str]: ... + + +async def open_file( + file: str | PathLike[str] | int, + mode: str = "r", + buffering: int = -1, + encoding: str | None = None, + errors: str | None = None, + newline: str | None = None, + closefd: bool = True, + opener: Callable[[str, int], int] | None = None, +) -> AsyncFile[Any]: + """ + Open a file asynchronously. + + The arguments are exactly the same as for the builtin :func:`open`. + + :return: an asynchronous file object + + """ + fp = await to_thread.run_sync( + open, file, mode, buffering, encoding, errors, newline, closefd, opener + ) + return AsyncFile(fp) + + +def wrap_file(file: IO[AnyStr]) -> AsyncFile[AnyStr]: + """ + Wrap an existing file as an asynchronous file. + + :param file: an existing file-like object + :return: an asynchronous file object + + """ + return AsyncFile(file) + + +@dataclass(eq=False) +class _PathIterator(AsyncIterator["Path"]): + iterator: Iterator[PathLike[str]] + + async def __anext__(self) -> Path: + nextval = await to_thread.run_sync( + next, self.iterator, None, abandon_on_cancel=True + ) + if nextval is None: + raise StopAsyncIteration from None + + return Path(nextval) + + +class Path: + """ + An asynchronous version of :class:`pathlib.Path`. + + This class cannot be substituted for :class:`pathlib.Path` or + :class:`pathlib.PurePath`, but it is compatible with the :class:`os.PathLike` + interface. + + It implements the Python 3.10 version of :class:`pathlib.Path` interface, except for + the deprecated :meth:`~pathlib.Path.link_to` method. + + Some methods may be unavailable or have limited functionality, based on the Python + version: + + * :meth:`~pathlib.Path.copy` (available on Python 3.14 or later) + * :meth:`~pathlib.Path.copy_into` (available on Python 3.14 or later) + * :meth:`~pathlib.Path.from_uri` (available on Python 3.13 or later) + * :meth:`~pathlib.PurePath.full_match` (available on Python 3.13 or later) + * :attr:`~pathlib.Path.info` (available on Python 3.14 or later) + * :meth:`~pathlib.Path.is_junction` (available on Python 3.12 or later) + * :meth:`~pathlib.PurePath.match` (the ``case_sensitive`` parameter is only + available on Python 3.13 or later) + * :meth:`~pathlib.Path.move` (available on Python 3.14 or later) + * :meth:`~pathlib.Path.move_into` (available on Python 3.14 or later) + * :meth:`~pathlib.PurePath.relative_to` (the ``walk_up`` parameter is only available + on Python 3.12 or later) + * :meth:`~pathlib.Path.walk` (available on Python 3.12 or later) + + Any methods that do disk I/O need to be awaited on. These methods are: + + * :meth:`~pathlib.Path.absolute` + * :meth:`~pathlib.Path.chmod` + * :meth:`~pathlib.Path.cwd` + * :meth:`~pathlib.Path.exists` + * :meth:`~pathlib.Path.expanduser` + * :meth:`~pathlib.Path.group` + * :meth:`~pathlib.Path.hardlink_to` + * :meth:`~pathlib.Path.home` + * :meth:`~pathlib.Path.is_block_device` + * :meth:`~pathlib.Path.is_char_device` + * :meth:`~pathlib.Path.is_dir` + * :meth:`~pathlib.Path.is_fifo` + * :meth:`~pathlib.Path.is_file` + * :meth:`~pathlib.Path.is_junction` + * :meth:`~pathlib.Path.is_mount` + * :meth:`~pathlib.Path.is_socket` + * :meth:`~pathlib.Path.is_symlink` + * :meth:`~pathlib.Path.lchmod` + * :meth:`~pathlib.Path.lstat` + * :meth:`~pathlib.Path.mkdir` + * :meth:`~pathlib.Path.open` + * :meth:`~pathlib.Path.owner` + * :meth:`~pathlib.Path.read_bytes` + * :meth:`~pathlib.Path.read_text` + * :meth:`~pathlib.Path.readlink` + * :meth:`~pathlib.Path.rename` + * :meth:`~pathlib.Path.replace` + * :meth:`~pathlib.Path.resolve` + * :meth:`~pathlib.Path.rmdir` + * :meth:`~pathlib.Path.samefile` + * :meth:`~pathlib.Path.stat` + * :meth:`~pathlib.Path.symlink_to` + * :meth:`~pathlib.Path.touch` + * :meth:`~pathlib.Path.unlink` + * :meth:`~pathlib.Path.walk` + * :meth:`~pathlib.Path.write_bytes` + * :meth:`~pathlib.Path.write_text` + + Additionally, the following methods return an async iterator yielding + :class:`~.Path` objects: + + * :meth:`~pathlib.Path.glob` + * :meth:`~pathlib.Path.iterdir` + * :meth:`~pathlib.Path.rglob` + """ + + __slots__ = "_path", "__weakref__" + + __weakref__: Any + + def __init__(self, *args: str | PathLike[str]) -> None: + self._path: Final[pathlib.Path] = pathlib.Path(*args) + + def __fspath__(self) -> str: + return self._path.__fspath__() + + def __str__(self) -> str: + return self._path.__str__() + + def __repr__(self) -> str: + return f"{self.__class__.__name__}({self.as_posix()!r})" + + def __bytes__(self) -> bytes: + return self._path.__bytes__() + + def __hash__(self) -> int: + return self._path.__hash__() + + def __eq__(self, other: object) -> bool: + target = other._path if isinstance(other, Path) else other + return self._path.__eq__(target) + + def __lt__(self, other: pathlib.PurePath | Path) -> bool: + target = other._path if isinstance(other, Path) else other + return self._path.__lt__(target) + + def __le__(self, other: pathlib.PurePath | Path) -> bool: + target = other._path if isinstance(other, Path) else other + return self._path.__le__(target) + + def __gt__(self, other: pathlib.PurePath | Path) -> bool: + target = other._path if isinstance(other, Path) else other + return self._path.__gt__(target) + + def __ge__(self, other: pathlib.PurePath | Path) -> bool: + target = other._path if isinstance(other, Path) else other + return self._path.__ge__(target) + + def __truediv__(self, other: str | PathLike[str]) -> Path: + return Path(self._path / other) + + def __rtruediv__(self, other: str | PathLike[str]) -> Path: + return Path(other) / self + + @property + def parts(self) -> tuple[str, ...]: + return self._path.parts + + @property + def drive(self) -> str: + return self._path.drive + + @property + def root(self) -> str: + return self._path.root + + @property + def anchor(self) -> str: + return self._path.anchor + + @property + def parents(self) -> Sequence[Path]: + return tuple(Path(p) for p in self._path.parents) + + @property + def parent(self) -> Path: + return Path(self._path.parent) + + @property + def name(self) -> str: + return self._path.name + + @property + def suffix(self) -> str: + return self._path.suffix + + @property + def suffixes(self) -> list[str]: + return self._path.suffixes + + @property + def stem(self) -> str: + return self._path.stem + + async def absolute(self) -> Path: + path = await to_thread.run_sync(self._path.absolute) + return Path(path) + + def as_posix(self) -> str: + return self._path.as_posix() + + def as_uri(self) -> str: + return self._path.as_uri() + + if sys.version_info >= (3, 13): + parser: ClassVar[ModuleType] = pathlib.Path.parser + + @classmethod + def from_uri(cls, uri: str) -> Path: + return Path(pathlib.Path.from_uri(uri)) + + def full_match( + self, path_pattern: str, *, case_sensitive: bool | None = None + ) -> bool: + return self._path.full_match(path_pattern, case_sensitive=case_sensitive) + + def match( + self, path_pattern: str, *, case_sensitive: bool | None = None + ) -> bool: + return self._path.match(path_pattern, case_sensitive=case_sensitive) + else: + + def match(self, path_pattern: str) -> bool: + return self._path.match(path_pattern) + + if sys.version_info >= (3, 14): + + @property + def info(self) -> Any: # TODO: add return type annotation when Typeshed gets it + return self._path.info + + async def copy( + self, + target: str | os.PathLike[str], + *, + follow_symlinks: bool = True, + preserve_metadata: bool = False, + ) -> Path: + func = partial( + self._path.copy, + follow_symlinks=follow_symlinks, + preserve_metadata=preserve_metadata, + ) + return Path(await to_thread.run_sync(func, pathlib.Path(target))) + + async def copy_into( + self, + target_dir: str | os.PathLike[str], + *, + follow_symlinks: bool = True, + preserve_metadata: bool = False, + ) -> Path: + func = partial( + self._path.copy_into, + follow_symlinks=follow_symlinks, + preserve_metadata=preserve_metadata, + ) + return Path(await to_thread.run_sync(func, pathlib.Path(target_dir))) + + async def move(self, target: str | os.PathLike[str]) -> Path: + # Upstream does not handle anyio.Path properly as a PathLike + target = pathlib.Path(target) + return Path(await to_thread.run_sync(self._path.move, target)) + + async def move_into( + self, + target_dir: str | os.PathLike[str], + ) -> Path: + return Path(await to_thread.run_sync(self._path.move_into, target_dir)) + + def is_relative_to(self, other: str | PathLike[str]) -> bool: + try: + self.relative_to(other) + return True + except ValueError: + return False + + async def chmod(self, mode: int, *, follow_symlinks: bool = True) -> None: + func = partial(os.chmod, follow_symlinks=follow_symlinks) + return await to_thread.run_sync(func, self._path, mode) + + @classmethod + async def cwd(cls) -> Path: + path = await to_thread.run_sync(pathlib.Path.cwd) + return cls(path) + + async def exists(self) -> bool: + return await to_thread.run_sync(self._path.exists, abandon_on_cancel=True) + + async def expanduser(self) -> Path: + return Path( + await to_thread.run_sync(self._path.expanduser, abandon_on_cancel=True) + ) + + if sys.version_info < (3, 12): + # Python 3.11 and earlier + def glob(self, pattern: str) -> AsyncIterator[Path]: + gen = self._path.glob(pattern) + return _PathIterator(gen) + elif (3, 12) <= sys.version_info < (3, 13): + # changed in Python 3.12: + # - The case_sensitive parameter was added. + def glob( + self, + pattern: str, + *, + case_sensitive: bool | None = None, + ) -> AsyncIterator[Path]: + gen = self._path.glob(pattern, case_sensitive=case_sensitive) + return _PathIterator(gen) + elif sys.version_info >= (3, 13): + # Changed in Python 3.13: + # - The recurse_symlinks parameter was added. + # - The pattern parameter accepts a path-like object. + def glob( # type: ignore[misc] # mypy doesn't allow for differing signatures in a conditional block + self, + pattern: str | PathLike[str], + *, + case_sensitive: bool | None = None, + recurse_symlinks: bool = False, + ) -> AsyncIterator[Path]: + gen = self._path.glob( + pattern, # type: ignore[arg-type] + case_sensitive=case_sensitive, + recurse_symlinks=recurse_symlinks, + ) + return _PathIterator(gen) + + async def group(self) -> str: + return await to_thread.run_sync(self._path.group, abandon_on_cancel=True) + + async def hardlink_to( + self, target: str | bytes | PathLike[str] | PathLike[bytes] + ) -> None: + if isinstance(target, Path): + target = target._path + + await to_thread.run_sync(os.link, target, self) + + @classmethod + async def home(cls) -> Path: + home_path = await to_thread.run_sync(pathlib.Path.home) + return cls(home_path) + + def is_absolute(self) -> bool: + return self._path.is_absolute() + + async def is_block_device(self) -> bool: + return await to_thread.run_sync( + self._path.is_block_device, abandon_on_cancel=True + ) + + async def is_char_device(self) -> bool: + return await to_thread.run_sync( + self._path.is_char_device, abandon_on_cancel=True + ) + + async def is_dir(self) -> bool: + return await to_thread.run_sync(self._path.is_dir, abandon_on_cancel=True) + + async def is_fifo(self) -> bool: + return await to_thread.run_sync(self._path.is_fifo, abandon_on_cancel=True) + + async def is_file(self) -> bool: + return await to_thread.run_sync(self._path.is_file, abandon_on_cancel=True) + + if sys.version_info >= (3, 12): + + async def is_junction(self) -> bool: + return await to_thread.run_sync(self._path.is_junction) + + async def is_mount(self) -> bool: + return await to_thread.run_sync( + os.path.ismount, self._path, abandon_on_cancel=True + ) + + def is_reserved(self) -> bool: + return self._path.is_reserved() + + async def is_socket(self) -> bool: + return await to_thread.run_sync(self._path.is_socket, abandon_on_cancel=True) + + async def is_symlink(self) -> bool: + return await to_thread.run_sync(self._path.is_symlink, abandon_on_cancel=True) + + async def iterdir(self) -> AsyncIterator[Path]: + gen = ( + self._path.iterdir() + if sys.version_info < (3, 13) + else await to_thread.run_sync(self._path.iterdir, abandon_on_cancel=True) + ) + async for path in _PathIterator(gen): + yield path + + def joinpath(self, *args: str | PathLike[str]) -> Path: + return Path(self._path.joinpath(*args)) + + async def lchmod(self, mode: int) -> None: + await to_thread.run_sync(self._path.lchmod, mode) + + async def lstat(self) -> os.stat_result: + return await to_thread.run_sync(self._path.lstat, abandon_on_cancel=True) + + async def mkdir( + self, mode: int = 0o777, parents: bool = False, exist_ok: bool = False + ) -> None: + await to_thread.run_sync(self._path.mkdir, mode, parents, exist_ok) + + @overload + async def open( + self, + mode: OpenBinaryMode, + buffering: int = ..., + encoding: str | None = ..., + errors: str | None = ..., + newline: str | None = ..., + ) -> AsyncFile[bytes]: ... + + @overload + async def open( + self, + mode: OpenTextMode = ..., + buffering: int = ..., + encoding: str | None = ..., + errors: str | None = ..., + newline: str | None = ..., + ) -> AsyncFile[str]: ... + + async def open( + self, + mode: str = "r", + buffering: int = -1, + encoding: str | None = None, + errors: str | None = None, + newline: str | None = None, + ) -> AsyncFile[Any]: + fp = await to_thread.run_sync( + self._path.open, mode, buffering, encoding, errors, newline + ) + return AsyncFile(fp) + + async def owner(self) -> str: + return await to_thread.run_sync(self._path.owner, abandon_on_cancel=True) + + async def read_bytes(self) -> bytes: + return await to_thread.run_sync(self._path.read_bytes) + + async def read_text( + self, encoding: str | None = None, errors: str | None = None + ) -> str: + return await to_thread.run_sync(self._path.read_text, encoding, errors) + + if sys.version_info >= (3, 12): + + def relative_to( + self, *other: str | PathLike[str], walk_up: bool = False + ) -> Path: + # relative_to() should work with any PathLike but it doesn't + others = [pathlib.Path(other) for other in other] + return Path(self._path.relative_to(*others, walk_up=walk_up)) + + else: + + def relative_to(self, *other: str | PathLike[str]) -> Path: + return Path(self._path.relative_to(*other)) + + async def readlink(self) -> Path: + target = await to_thread.run_sync(os.readlink, self._path) + return Path(target) + + async def rename(self, target: str | pathlib.PurePath | Path) -> Path: + if isinstance(target, Path): + target = target._path + + await to_thread.run_sync(self._path.rename, target) + return Path(target) + + async def replace(self, target: str | pathlib.PurePath | Path) -> Path: + if isinstance(target, Path): + target = target._path + + await to_thread.run_sync(self._path.replace, target) + return Path(target) + + async def resolve(self, strict: bool = False) -> Path: + func = partial(self._path.resolve, strict=strict) + return Path(await to_thread.run_sync(func, abandon_on_cancel=True)) + + if sys.version_info < (3, 12): + # Pre Python 3.12 + def rglob(self, pattern: str) -> AsyncIterator[Path]: + gen = self._path.rglob(pattern) + return _PathIterator(gen) + elif (3, 12) <= sys.version_info < (3, 13): + # Changed in Python 3.12: + # - The case_sensitive parameter was added. + def rglob( + self, pattern: str, *, case_sensitive: bool | None = None + ) -> AsyncIterator[Path]: + gen = self._path.rglob(pattern, case_sensitive=case_sensitive) + return _PathIterator(gen) + elif sys.version_info >= (3, 13): + # Changed in Python 3.13: + # - The recurse_symlinks parameter was added. + # - The pattern parameter accepts a path-like object. + def rglob( # type: ignore[misc] # mypy doesn't allow for differing signatures in a conditional block + self, + pattern: str | PathLike[str], + *, + case_sensitive: bool | None = None, + recurse_symlinks: bool = False, + ) -> AsyncIterator[Path]: + gen = self._path.rglob( + pattern, # type: ignore[arg-type] + case_sensitive=case_sensitive, + recurse_symlinks=recurse_symlinks, + ) + return _PathIterator(gen) + + async def rmdir(self) -> None: + await to_thread.run_sync(self._path.rmdir) + + async def samefile(self, other_path: str | PathLike[str]) -> bool: + if isinstance(other_path, Path): + other_path = other_path._path + + return await to_thread.run_sync( + self._path.samefile, other_path, abandon_on_cancel=True + ) + + async def stat(self, *, follow_symlinks: bool = True) -> os.stat_result: + func = partial(os.stat, follow_symlinks=follow_symlinks) + return await to_thread.run_sync(func, self._path, abandon_on_cancel=True) + + async def symlink_to( + self, + target: str | bytes | PathLike[str] | PathLike[bytes], + target_is_directory: bool = False, + ) -> None: + if isinstance(target, Path): + target = target._path + + await to_thread.run_sync(self._path.symlink_to, target, target_is_directory) + + async def touch(self, mode: int = 0o666, exist_ok: bool = True) -> None: + await to_thread.run_sync(self._path.touch, mode, exist_ok) + + async def unlink(self, missing_ok: bool = False) -> None: + try: + await to_thread.run_sync(self._path.unlink) + except FileNotFoundError: + if not missing_ok: + raise + + if sys.version_info >= (3, 12): + + async def walk( + self, + top_down: bool = True, + on_error: Callable[[OSError], object] | None = None, + follow_symlinks: bool = False, + ) -> AsyncIterator[tuple[Path, list[str], list[str]]]: + def get_next_value() -> tuple[pathlib.Path, list[str], list[str]] | None: + try: + return next(gen) + except StopIteration: + return None + + gen = self._path.walk(top_down, on_error, follow_symlinks) + while True: + value = await to_thread.run_sync(get_next_value) + if value is None: + return + + root, dirs, paths = value + yield Path(root), dirs, paths + + def with_name(self, name: str) -> Path: + return Path(self._path.with_name(name)) + + def with_stem(self, stem: str) -> Path: + return Path(self._path.with_name(stem + self._path.suffix)) + + def with_suffix(self, suffix: str) -> Path: + return Path(self._path.with_suffix(suffix)) + + def with_segments(self, *pathsegments: str | PathLike[str]) -> Path: + return Path(*pathsegments) + + async def write_bytes(self, data: bytes) -> int: + return await to_thread.run_sync(self._path.write_bytes, data) + + async def write_text( + self, + data: str, + encoding: str | None = None, + errors: str | None = None, + newline: str | None = None, + ) -> int: + # Path.write_text() does not support the "newline" parameter before Python 3.10 + def sync_write_text() -> int: + with self._path.open( + "w", encoding=encoding, errors=errors, newline=newline + ) as fp: + return fp.write(data) + + return await to_thread.run_sync(sync_write_text) + + +PathLike.register(Path) diff --git a/venv/lib/python3.11/site-packages/anyio/_core/_resources.py b/venv/lib/python3.11/site-packages/anyio/_core/_resources.py new file mode 100644 index 0000000..b9a5344 --- /dev/null +++ b/venv/lib/python3.11/site-packages/anyio/_core/_resources.py @@ -0,0 +1,18 @@ +from __future__ import annotations + +from ..abc import AsyncResource +from ._tasks import CancelScope + + +async def aclose_forcefully(resource: AsyncResource) -> None: + """ + Close an asynchronous resource in a cancelled scope. + + Doing this closes the resource without waiting on anything. + + :param resource: the resource to close + + """ + with CancelScope() as scope: + scope.cancel() + await resource.aclose() diff --git a/venv/lib/python3.11/site-packages/anyio/_core/_signals.py b/venv/lib/python3.11/site-packages/anyio/_core/_signals.py new file mode 100644 index 0000000..e24c79e --- /dev/null +++ b/venv/lib/python3.11/site-packages/anyio/_core/_signals.py @@ -0,0 +1,29 @@ +from __future__ import annotations + +from collections.abc import AsyncIterator +from contextlib import AbstractContextManager +from signal import Signals + +from ._eventloop import get_async_backend + + +def open_signal_receiver( + *signals: Signals, +) -> AbstractContextManager[AsyncIterator[Signals]]: + """ + Start receiving operating system signals. + + :param signals: signals to receive (e.g. ``signal.SIGINT``) + :return: an asynchronous context manager for an asynchronous iterator which yields + signal numbers + :raises NoEventLoopError: if no supported asynchronous event loop is running in the + current thread + + .. warning:: Windows does not support signals natively so it is best to avoid + relying on this in cross-platform applications. + + .. warning:: On asyncio, this permanently replaces any previous signal handler for + the given signals, as set via :meth:`~asyncio.loop.add_signal_handler`. + + """ + return get_async_backend().open_signal_receiver(*signals) diff --git a/venv/lib/python3.11/site-packages/anyio/_core/_sockets.py b/venv/lib/python3.11/site-packages/anyio/_core/_sockets.py new file mode 100644 index 0000000..6c99b3a --- /dev/null +++ b/venv/lib/python3.11/site-packages/anyio/_core/_sockets.py @@ -0,0 +1,1003 @@ +from __future__ import annotations + +import errno +import os +import socket +import ssl +import stat +import sys +from collections.abc import Awaitable +from dataclasses import dataclass +from ipaddress import IPv4Address, IPv6Address, ip_address +from os import PathLike, chmod +from socket import AddressFamily, SocketKind +from typing import TYPE_CHECKING, Any, Literal, cast, overload + +from .. import ConnectionFailed, to_thread +from ..abc import ( + ByteStreamConnectable, + ConnectedUDPSocket, + ConnectedUNIXDatagramSocket, + IPAddressType, + IPSockAddrType, + SocketListener, + SocketStream, + UDPSocket, + UNIXDatagramSocket, + UNIXSocketStream, +) +from ..streams.stapled import MultiListener +from ..streams.tls import TLSConnectable, TLSStream +from ._eventloop import get_async_backend +from ._resources import aclose_forcefully +from ._synchronization import Event +from ._tasks import create_task_group, move_on_after + +if TYPE_CHECKING: + from _typeshed import FileDescriptorLike +else: + FileDescriptorLike = object + +if sys.version_info < (3, 11): + from exceptiongroup import ExceptionGroup + +if sys.version_info >= (3, 12): + from typing import override +else: + from typing_extensions import override + +if sys.version_info < (3, 13): + from typing_extensions import deprecated +else: + from warnings import deprecated + +IPPROTO_IPV6 = getattr(socket, "IPPROTO_IPV6", 41) # https://bugs.python.org/issue29515 + +AnyIPAddressFamily = Literal[ + AddressFamily.AF_UNSPEC, AddressFamily.AF_INET, AddressFamily.AF_INET6 +] +IPAddressFamily = Literal[AddressFamily.AF_INET, AddressFamily.AF_INET6] + + +# tls_hostname given +@overload +async def connect_tcp( + remote_host: IPAddressType, + remote_port: int, + *, + local_host: IPAddressType | None = ..., + ssl_context: ssl.SSLContext | None = ..., + tls_standard_compatible: bool = ..., + tls_hostname: str, + happy_eyeballs_delay: float = ..., +) -> TLSStream: ... + + +# ssl_context given +@overload +async def connect_tcp( + remote_host: IPAddressType, + remote_port: int, + *, + local_host: IPAddressType | None = ..., + ssl_context: ssl.SSLContext, + tls_standard_compatible: bool = ..., + tls_hostname: str | None = ..., + happy_eyeballs_delay: float = ..., +) -> TLSStream: ... + + +# tls=True +@overload +async def connect_tcp( + remote_host: IPAddressType, + remote_port: int, + *, + local_host: IPAddressType | None = ..., + tls: Literal[True], + ssl_context: ssl.SSLContext | None = ..., + tls_standard_compatible: bool = ..., + tls_hostname: str | None = ..., + happy_eyeballs_delay: float = ..., +) -> TLSStream: ... + + +# tls=False +@overload +async def connect_tcp( + remote_host: IPAddressType, + remote_port: int, + *, + local_host: IPAddressType | None = ..., + tls: Literal[False], + ssl_context: ssl.SSLContext | None = ..., + tls_standard_compatible: bool = ..., + tls_hostname: str | None = ..., + happy_eyeballs_delay: float = ..., +) -> SocketStream: ... + + +# No TLS arguments +@overload +async def connect_tcp( + remote_host: IPAddressType, + remote_port: int, + *, + local_host: IPAddressType | None = ..., + happy_eyeballs_delay: float = ..., +) -> SocketStream: ... + + +async def connect_tcp( + remote_host: IPAddressType, + remote_port: int, + *, + local_host: IPAddressType | None = None, + tls: bool = False, + ssl_context: ssl.SSLContext | None = None, + tls_standard_compatible: bool = True, + tls_hostname: str | None = None, + happy_eyeballs_delay: float = 0.25, +) -> SocketStream | TLSStream: + """ + Connect to a host using the TCP protocol. + + This function implements the stateless version of the Happy Eyeballs algorithm (RFC + 6555). If ``remote_host`` is a host name that resolves to multiple IP addresses, + each one is tried until one connection attempt succeeds. If the first attempt does + not connected within 250 milliseconds, a second attempt is started using the next + address in the list, and so on. On IPv6 enabled systems, an IPv6 address (if + available) is tried first. + + When the connection has been established, a TLS handshake will be done if either + ``ssl_context`` or ``tls_hostname`` is not ``None``, or if ``tls`` is ``True``. + + :param remote_host: the IP address or host name to connect to + :param remote_port: port on the target host to connect to + :param local_host: the interface address or name to bind the socket to before + connecting + :param tls: ``True`` to do a TLS handshake with the connected stream and return a + :class:`~anyio.streams.tls.TLSStream` instead + :param ssl_context: the SSL context object to use (if omitted, a default context is + created) + :param tls_standard_compatible: If ``True``, performs the TLS shutdown handshake + before closing the stream and requires that the server does this as well. + Otherwise, :exc:`~ssl.SSLEOFError` may be raised during reads from the stream. + Some protocols, such as HTTP, require this option to be ``False``. + See :meth:`~ssl.SSLContext.wrap_socket` for details. + :param tls_hostname: host name to check the server certificate against (defaults to + the value of ``remote_host``) + :param happy_eyeballs_delay: delay (in seconds) before starting the next connection + attempt + :return: a socket stream object if no TLS handshake was done, otherwise a TLS stream + :raises ConnectionFailed: if the connection fails + + """ + # Placed here due to https://github.com/python/mypy/issues/7057 + connected_stream: SocketStream | None = None + + async def try_connect(remote_host: str, event: Event) -> None: + nonlocal connected_stream + try: + stream = await asynclib.connect_tcp(remote_host, remote_port, local_address) + except OSError as exc: + oserrors.append(exc) + return + else: + if connected_stream is None: + connected_stream = stream + tg.cancel_scope.cancel() + else: + await stream.aclose() + finally: + event.set() + + asynclib = get_async_backend() + local_address: IPSockAddrType | None = None + family = socket.AF_UNSPEC + if local_host: + gai_res = await getaddrinfo(str(local_host), None) + family, *_, local_address = gai_res[0] + + target_host = str(remote_host) + try: + addr_obj = ip_address(remote_host) + except ValueError: + addr_obj = None + + if addr_obj is not None: + if isinstance(addr_obj, IPv6Address): + target_addrs = [(socket.AF_INET6, addr_obj.compressed)] + else: + target_addrs = [(socket.AF_INET, addr_obj.compressed)] + else: + # getaddrinfo() will raise an exception if name resolution fails + gai_res = await getaddrinfo( + target_host, remote_port, family=family, type=socket.SOCK_STREAM + ) + + # Organize the list so that the first address is an IPv6 address (if available) + # and the second one is an IPv4 addresses. The rest can be in whatever order. + v6_found = v4_found = False + target_addrs = [] + for af, *_, sa in gai_res: + if af == socket.AF_INET6 and not v6_found: + v6_found = True + target_addrs.insert(0, (af, sa[0])) + elif af == socket.AF_INET and not v4_found and v6_found: + v4_found = True + target_addrs.insert(1, (af, sa[0])) + else: + target_addrs.append((af, sa[0])) + + oserrors: list[OSError] = [] + try: + async with create_task_group() as tg: + for _af, addr in target_addrs: + event = Event() + tg.start_soon(try_connect, addr, event) + with move_on_after(happy_eyeballs_delay): + await event.wait() + + if connected_stream is None: + cause = ( + oserrors[0] + if len(oserrors) == 1 + else ExceptionGroup("multiple connection attempts failed", oserrors) + ) + raise OSError("All connection attempts failed") from cause + finally: + oserrors.clear() + + if tls or tls_hostname or ssl_context: + try: + return await TLSStream.wrap( + connected_stream, + server_side=False, + hostname=tls_hostname or str(remote_host), + ssl_context=ssl_context, + standard_compatible=tls_standard_compatible, + ) + except BaseException: + await aclose_forcefully(connected_stream) + raise + + return connected_stream + + +async def connect_unix(path: str | bytes | PathLike[Any]) -> UNIXSocketStream: + """ + Connect to the given UNIX socket. + + Not available on Windows. + + :param path: path to the socket + :return: a socket stream object + :raises ConnectionFailed: if the connection fails + + """ + path = os.fspath(path) + return await get_async_backend().connect_unix(path) + + +async def create_tcp_listener( + *, + local_host: IPAddressType | None = None, + local_port: int = 0, + family: AnyIPAddressFamily = socket.AddressFamily.AF_UNSPEC, + backlog: int = 65536, + reuse_port: bool = False, +) -> MultiListener[SocketStream]: + """ + Create a TCP socket listener. + + :param local_port: port number to listen on + :param local_host: IP address of the interface to listen on. If omitted, listen on + all IPv4 and IPv6 interfaces. To listen on all interfaces on a specific address + family, use ``0.0.0.0`` for IPv4 or ``::`` for IPv6. + :param family: address family (used if ``local_host`` was omitted) + :param backlog: maximum number of queued incoming connections (up to a maximum of + 2**16, or 65536) + :param reuse_port: ``True`` to allow multiple sockets to bind to the same + address/port (not supported on Windows) + :return: a multi-listener object containing one or more socket listeners + :raises OSError: if there's an error creating a socket, or binding to one or more + interfaces failed + + """ + asynclib = get_async_backend() + backlog = min(backlog, 65536) + local_host = str(local_host) if local_host is not None else None + + def setup_raw_socket( + fam: AddressFamily, + bind_addr: tuple[str, int] | tuple[str, int, int, int], + *, + v6only: bool = True, + ) -> socket.socket: + sock = socket.socket(fam) + try: + sock.setblocking(False) + + if fam == AddressFamily.AF_INET6: + sock.setsockopt(IPPROTO_IPV6, socket.IPV6_V6ONLY, v6only) + + # For Windows, enable exclusive address use. For others, enable address + # reuse. + if sys.platform == "win32": + sock.setsockopt(socket.SOL_SOCKET, socket.SO_EXCLUSIVEADDRUSE, 1) + else: + sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) + + if reuse_port: + sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEPORT, 1) + + # Workaround for #554 + if fam == socket.AF_INET6 and "%" in bind_addr[0]: + addr, scope_id = bind_addr[0].split("%", 1) + bind_addr = (addr, bind_addr[1], 0, int(scope_id)) + + sock.bind(bind_addr) + sock.listen(backlog) + except BaseException: + sock.close() + raise + + return sock + + # We passing type=0 on non-Windows platforms as a workaround for a uvloop bug + # where we don't get the correct scope ID for IPv6 link-local addresses when passing + # type=socket.SOCK_STREAM to getaddrinfo(): + # https://github.com/MagicStack/uvloop/issues/539 + gai_res = await getaddrinfo( + local_host, + local_port, + family=family, + type=socket.SOCK_STREAM if sys.platform == "win32" else 0, + flags=socket.AI_PASSIVE | socket.AI_ADDRCONFIG, + ) + + # The set comprehension is here to work around a glibc bug: + # https://sourceware.org/bugzilla/show_bug.cgi?id=14969 + sockaddrs = sorted({res for res in gai_res if res[1] == SocketKind.SOCK_STREAM}) + + # Special case for dual-stack binding on the "any" interface + if ( + local_host is None + and family == AddressFamily.AF_UNSPEC + and socket.has_dualstack_ipv6() + and any(fam == AddressFamily.AF_INET6 for fam, *_ in gai_res) + ): + raw_socket = setup_raw_socket( + AddressFamily.AF_INET6, ("::", local_port), v6only=False + ) + listener = asynclib.create_tcp_listener(raw_socket) + return MultiListener([listener]) + + errors: list[OSError] = [] + try: + for _ in range(len(sockaddrs)): + listeners: list[SocketListener] = [] + bound_ephemeral_port = local_port + try: + for fam, *_, sockaddr in sockaddrs: + sockaddr = sockaddr[0], bound_ephemeral_port, *sockaddr[2:] + raw_socket = setup_raw_socket(fam, sockaddr) + + # Store the assigned port if an ephemeral port was requested, so + # we'll bind to the same port on all interfaces + if local_port == 0 and len(gai_res) > 1: + bound_ephemeral_port = raw_socket.getsockname()[1] + + listeners.append(asynclib.create_tcp_listener(raw_socket)) + except BaseException as exc: + for listener in listeners: + await listener.aclose() + + # If an ephemeral port was requested but binding the assigned port + # failed for another interface, rotate the address list and try again + if ( + isinstance(exc, OSError) + and exc.errno == errno.EADDRINUSE + and local_port == 0 + and bound_ephemeral_port + ): + errors.append(exc) + sockaddrs.append(sockaddrs.pop(0)) + continue + + raise + + return MultiListener(listeners) + + raise OSError( + f"Could not create {len(sockaddrs)} listeners with a consistent port" + ) from ExceptionGroup("Several bind attempts failed", errors) + finally: + del errors # Prevent reference cycles + + +async def create_unix_listener( + path: str | bytes | PathLike[Any], + *, + mode: int | None = None, + backlog: int = 65536, +) -> SocketListener: + """ + Create a UNIX socket listener. + + Not available on Windows. + + :param path: path of the socket + :param mode: permissions to set on the socket + :param backlog: maximum number of queued incoming connections (up to a maximum of + 2**16, or 65536) + :return: a listener object + + .. versionchanged:: 3.0 + If a socket already exists on the file system in the given path, it will be + removed first. + + """ + backlog = min(backlog, 65536) + raw_socket = await setup_unix_local_socket(path, mode, socket.SOCK_STREAM) + try: + raw_socket.listen(backlog) + return get_async_backend().create_unix_listener(raw_socket) + except BaseException: + raw_socket.close() + raise + + +async def create_udp_socket( + family: AnyIPAddressFamily = AddressFamily.AF_UNSPEC, + *, + local_host: IPAddressType | None = None, + local_port: int = 0, + reuse_port: bool = False, +) -> UDPSocket: + """ + Create a UDP socket. + + If ``port`` has been given, the socket will be bound to this port on the local + machine, making this socket suitable for providing UDP based services. + + :param family: address family (``AF_INET`` or ``AF_INET6``) – automatically + determined from ``local_host`` if omitted + :param local_host: IP address or host name of the local interface to bind to + :param local_port: local port to bind to + :param reuse_port: ``True`` to allow multiple sockets to bind to the same + address/port (not supported on Windows) + :return: a UDP socket + + """ + if family is AddressFamily.AF_UNSPEC and not local_host: + raise ValueError('Either "family" or "local_host" must be given') + + if local_host: + gai_res = await getaddrinfo( + str(local_host), + local_port, + family=family, + type=socket.SOCK_DGRAM, + flags=socket.AI_PASSIVE | socket.AI_ADDRCONFIG, + ) + family = cast(AnyIPAddressFamily, gai_res[0][0]) + local_address = gai_res[0][-1] + elif family is AddressFamily.AF_INET6: + local_address = ("::", 0) + else: + local_address = ("0.0.0.0", 0) + + sock = await get_async_backend().create_udp_socket( + family, local_address, None, reuse_port + ) + return cast(UDPSocket, sock) + + +async def create_connected_udp_socket( + remote_host: IPAddressType, + remote_port: int, + *, + family: AnyIPAddressFamily = AddressFamily.AF_UNSPEC, + local_host: IPAddressType | None = None, + local_port: int = 0, + reuse_port: bool = False, +) -> ConnectedUDPSocket: + """ + Create a connected UDP socket. + + Connected UDP sockets can only communicate with the specified remote host/port, an + any packets sent from other sources are dropped. + + :param remote_host: remote host to set as the default target + :param remote_port: port on the remote host to set as the default target + :param family: address family (``AF_INET`` or ``AF_INET6``) – automatically + determined from ``local_host`` or ``remote_host`` if omitted + :param local_host: IP address or host name of the local interface to bind to + :param local_port: local port to bind to + :param reuse_port: ``True`` to allow multiple sockets to bind to the same + address/port (not supported on Windows) + :return: a connected UDP socket + + """ + local_address = None + if local_host: + gai_res = await getaddrinfo( + str(local_host), + local_port, + family=family, + type=socket.SOCK_DGRAM, + flags=socket.AI_PASSIVE | socket.AI_ADDRCONFIG, + ) + family = cast(AnyIPAddressFamily, gai_res[0][0]) + local_address = gai_res[0][-1] + + gai_res = await getaddrinfo( + str(remote_host), remote_port, family=family, type=socket.SOCK_DGRAM + ) + family = cast(AnyIPAddressFamily, gai_res[0][0]) + remote_address = gai_res[0][-1] + + sock = await get_async_backend().create_udp_socket( + family, local_address, remote_address, reuse_port + ) + return cast(ConnectedUDPSocket, sock) + + +async def create_unix_datagram_socket( + *, + local_path: None | str | bytes | PathLike[Any] = None, + local_mode: int | None = None, +) -> UNIXDatagramSocket: + """ + Create a UNIX datagram socket. + + Not available on Windows. + + If ``local_path`` has been given, the socket will be bound to this path, making this + socket suitable for receiving datagrams from other processes. Other processes can + send datagrams to this socket only if ``local_path`` is set. + + If a socket already exists on the file system in the ``local_path``, it will be + removed first. + + :param local_path: the path on which to bind to + :param local_mode: permissions to set on the local socket + :return: a UNIX datagram socket + + """ + raw_socket = await setup_unix_local_socket( + local_path, local_mode, socket.SOCK_DGRAM + ) + return await get_async_backend().create_unix_datagram_socket(raw_socket, None) + + +async def create_connected_unix_datagram_socket( + remote_path: str | bytes | PathLike[Any], + *, + local_path: None | str | bytes | PathLike[Any] = None, + local_mode: int | None = None, +) -> ConnectedUNIXDatagramSocket: + """ + Create a connected UNIX datagram socket. + + Connected datagram sockets can only communicate with the specified remote path. + + If ``local_path`` has been given, the socket will be bound to this path, making + this socket suitable for receiving datagrams from other processes. Other processes + can send datagrams to this socket only if ``local_path`` is set. + + If a socket already exists on the file system in the ``local_path``, it will be + removed first. + + :param remote_path: the path to set as the default target + :param local_path: the path on which to bind to + :param local_mode: permissions to set on the local socket + :return: a connected UNIX datagram socket + + """ + remote_path = os.fspath(remote_path) + raw_socket = await setup_unix_local_socket( + local_path, local_mode, socket.SOCK_DGRAM + ) + return await get_async_backend().create_unix_datagram_socket( + raw_socket, remote_path + ) + + +async def getaddrinfo( + host: bytes | str | None, + port: str | int | None, + *, + family: int | AddressFamily = 0, + type: int | SocketKind = 0, + proto: int = 0, + flags: int = 0, +) -> list[tuple[AddressFamily, SocketKind, int, str, tuple[str, int]]]: + """ + Look up a numeric IP address given a host name. + + Internationalized domain names are translated according to the (non-transitional) + IDNA 2008 standard. + + .. note:: 4-tuple IPv6 socket addresses are automatically converted to 2-tuples of + (host, port), unlike what :func:`socket.getaddrinfo` does. + + :param host: host name + :param port: port number + :param family: socket family (`'AF_INET``, ...) + :param type: socket type (``SOCK_STREAM``, ...) + :param proto: protocol number + :param flags: flags to pass to upstream ``getaddrinfo()`` + :return: list of tuples containing (family, type, proto, canonname, sockaddr) + + .. seealso:: :func:`socket.getaddrinfo` + + """ + # Handle unicode hostnames + if isinstance(host, str): + try: + encoded_host: bytes | None = host.encode("ascii") + except UnicodeEncodeError: + import idna + + encoded_host = idna.encode(host, uts46=True) + else: + encoded_host = host + + gai_res = await get_async_backend().getaddrinfo( + encoded_host, port, family=family, type=type, proto=proto, flags=flags + ) + return [ + (family, type, proto, canonname, convert_ipv6_sockaddr(sockaddr)) + for family, type, proto, canonname, sockaddr in gai_res + # filter out IPv6 results when IPv6 is disabled + if not isinstance(sockaddr[0], int) + ] + + +def getnameinfo(sockaddr: IPSockAddrType, flags: int = 0) -> Awaitable[tuple[str, str]]: + """ + Look up the host name of an IP address. + + :param sockaddr: socket address (e.g. (ipaddress, port) for IPv4) + :param flags: flags to pass to upstream ``getnameinfo()`` + :return: a tuple of (host name, service name) + :raises NoEventLoopError: if no supported asynchronous event loop is running in the + current thread + + .. seealso:: :func:`socket.getnameinfo` + + """ + return get_async_backend().getnameinfo(sockaddr, flags) + + +@deprecated("This function is deprecated; use `wait_readable` instead") +def wait_socket_readable(sock: socket.socket) -> Awaitable[None]: + """ + .. deprecated:: 4.7.0 + Use :func:`wait_readable` instead. + + Wait until the given socket has data to be read. + + .. warning:: Only use this on raw sockets that have not been wrapped by any higher + level constructs like socket streams! + + :param sock: a socket object + :raises ~anyio.ClosedResourceError: if the socket was closed while waiting for the + socket to become readable + :raises ~anyio.BusyResourceError: if another task is already waiting for the socket + to become readable + :raises NoEventLoopError: if no supported asynchronous event loop is running in the + current thread + + """ + return get_async_backend().wait_readable(sock.fileno()) + + +@deprecated("This function is deprecated; use `wait_writable` instead") +def wait_socket_writable(sock: socket.socket) -> Awaitable[None]: + """ + .. deprecated:: 4.7.0 + Use :func:`wait_writable` instead. + + Wait until the given socket can be written to. + + This does **NOT** work on Windows when using the asyncio backend with a proactor + event loop (default on py3.8+). + + .. warning:: Only use this on raw sockets that have not been wrapped by any higher + level constructs like socket streams! + + :param sock: a socket object + :raises ~anyio.ClosedResourceError: if the socket was closed while waiting for the + socket to become writable + :raises ~anyio.BusyResourceError: if another task is already waiting for the socket + to become writable + :raises NoEventLoopError: if no supported asynchronous event loop is running in the + current thread + + """ + return get_async_backend().wait_writable(sock.fileno()) + + +def wait_readable(obj: FileDescriptorLike) -> Awaitable[None]: + """ + Wait until the given object has data to be read. + + On Unix systems, ``obj`` must either be an integer file descriptor, or else an + object with a ``.fileno()`` method which returns an integer file descriptor. Any + kind of file descriptor can be passed, though the exact semantics will depend on + your kernel. For example, this probably won't do anything useful for on-disk files. + + On Windows systems, ``obj`` must either be an integer ``SOCKET`` handle, or else an + object with a ``.fileno()`` method which returns an integer ``SOCKET`` handle. File + descriptors aren't supported, and neither are handles that refer to anything besides + a ``SOCKET``. + + On backends where this functionality is not natively provided (asyncio + ``ProactorEventLoop`` on Windows), it is provided using a separate selector thread + which is set to shut down when the interpreter shuts down. + + .. warning:: Don't use this on raw sockets that have been wrapped by any higher + level constructs like socket streams! + + :param obj: an object with a ``.fileno()`` method or an integer handle + :raises ~anyio.ClosedResourceError: if the object was closed while waiting for the + object to become readable + :raises ~anyio.BusyResourceError: if another task is already waiting for the object + to become readable + :raises NoEventLoopError: if no supported asynchronous event loop is running in the + current thread + + """ + return get_async_backend().wait_readable(obj) + + +def wait_writable(obj: FileDescriptorLike) -> Awaitable[None]: + """ + Wait until the given object can be written to. + + :param obj: an object with a ``.fileno()`` method or an integer handle + :raises ~anyio.ClosedResourceError: if the object was closed while waiting for the + object to become writable + :raises ~anyio.BusyResourceError: if another task is already waiting for the object + to become writable + :raises NoEventLoopError: if no supported asynchronous event loop is running in the + current thread + + .. seealso:: See the documentation of :func:`wait_readable` for the definition of + ``obj`` and notes on backend compatibility. + + .. warning:: Don't use this on raw sockets that have been wrapped by any higher + level constructs like socket streams! + + """ + return get_async_backend().wait_writable(obj) + + +def notify_closing(obj: FileDescriptorLike) -> None: + """ + Call this before closing a file descriptor (on Unix) or socket (on + Windows). This will cause any `wait_readable` or `wait_writable` + calls on the given object to immediately wake up and raise + `~anyio.ClosedResourceError`. + + This doesn't actually close the object – you still have to do that + yourself afterwards. Also, you want to be careful to make sure no + new tasks start waiting on the object in between when you call this + and when it's actually closed. So to close something properly, you + usually want to do these steps in order: + + 1. Explicitly mark the object as closed, so that any new attempts + to use it will abort before they start. + 2. Call `notify_closing` to wake up any already-existing users. + 3. Actually close the object. + + It's also possible to do them in a different order if that's more + convenient, *but only if* you make sure not to have any checkpoints in + between the steps. This way they all happen in a single atomic + step, so other tasks won't be able to tell what order they happened + in anyway. + + :param obj: an object with a ``.fileno()`` method or an integer handle + :raises NoEventLoopError: if no supported asynchronous event loop is running in the + current thread + + """ + get_async_backend().notify_closing(obj) + + +# +# Private API +# + + +def convert_ipv6_sockaddr( + sockaddr: tuple[str, int, int, int] | tuple[str, int], +) -> tuple[str, int]: + """ + Convert a 4-tuple IPv6 socket address to a 2-tuple (address, port) format. + + If the scope ID is nonzero, it is added to the address, separated with ``%``. + Otherwise the flow id and scope id are simply cut off from the tuple. + Any other kinds of socket addresses are returned as-is. + + :param sockaddr: the result of :meth:`~socket.socket.getsockname` + :return: the converted socket address + + """ + # This is more complicated than it should be because of MyPy + if isinstance(sockaddr, tuple) and len(sockaddr) == 4: + host, port, flowinfo, scope_id = sockaddr + if scope_id: + # PyPy (as of v7.3.11) leaves the interface name in the result, so + # we discard it and only get the scope ID from the end + # (https://foss.heptapod.net/pypy/pypy/-/issues/3938) + host = host.split("%")[0] + + # Add scope_id to the address + return f"{host}%{scope_id}", port + else: + return host, port + else: + return sockaddr + + +async def setup_unix_local_socket( + path: None | str | bytes | PathLike[Any], + mode: int | None, + socktype: int, +) -> socket.socket: + """ + Create a UNIX local socket object, deleting the socket at the given path if it + exists. + + Not available on Windows. + + :param path: path of the socket + :param mode: permissions to set on the socket + :param socktype: socket.SOCK_STREAM or socket.SOCK_DGRAM + + """ + path_str: str | None + if path is not None: + path_str = os.fsdecode(path) + + # Linux abstract namespace sockets aren't backed by a concrete file so skip stat call + if not path_str.startswith("\0"): + # Copied from pathlib... + try: + stat_result = os.stat(path) + except OSError as e: + if e.errno not in ( + errno.ENOENT, + errno.ENOTDIR, + errno.EBADF, + errno.ELOOP, + ): + raise + else: + if stat.S_ISSOCK(stat_result.st_mode): + os.unlink(path) + else: + path_str = None + + raw_socket = socket.socket(socket.AF_UNIX, socktype) + raw_socket.setblocking(False) + + if path_str is not None: + try: + await to_thread.run_sync(raw_socket.bind, path_str, abandon_on_cancel=True) + if mode is not None: + await to_thread.run_sync(chmod, path_str, mode, abandon_on_cancel=True) + except BaseException: + raw_socket.close() + raise + + return raw_socket + + +@dataclass +class TCPConnectable(ByteStreamConnectable): + """ + Connects to a TCP server at the given host and port. + + :param host: host name or IP address of the server + :param port: TCP port number of the server + """ + + host: str | IPv4Address | IPv6Address + port: int + + def __post_init__(self) -> None: + if self.port < 1 or self.port > 65535: + raise ValueError("TCP port number out of range") + + @override + async def connect(self) -> SocketStream: + try: + return await connect_tcp(self.host, self.port) + except OSError as exc: + raise ConnectionFailed( + f"error connecting to {self.host}:{self.port}: {exc}" + ) from exc + + +@dataclass +class UNIXConnectable(ByteStreamConnectable): + """ + Connects to a UNIX domain socket at the given path. + + :param path: the file system path of the socket + """ + + path: str | bytes | PathLike[str] | PathLike[bytes] + + @override + async def connect(self) -> UNIXSocketStream: + try: + return await connect_unix(self.path) + except OSError as exc: + raise ConnectionFailed(f"error connecting to {self.path!r}: {exc}") from exc + + +def as_connectable( + remote: ByteStreamConnectable + | tuple[str | IPv4Address | IPv6Address, int] + | str + | bytes + | PathLike[str], + /, + *, + tls: bool = False, + ssl_context: ssl.SSLContext | None = None, + tls_hostname: str | None = None, + tls_standard_compatible: bool = True, +) -> ByteStreamConnectable: + """ + Return a byte stream connectable from the given object. + + If a bytestream connectable is given, it is returned unchanged. + If a tuple of (host, port) is given, a TCP connectable is returned. + If a string or bytes path is given, a UNIX connectable is returned. + + If ``tls=True``, the connectable will be wrapped in a + :class:`~.streams.tls.TLSConnectable`. + + :param remote: a connectable, a tuple of (host, port) or a path to a UNIX socket + :param tls: if ``True``, wrap the plaintext connectable in a + :class:`~.streams.tls.TLSConnectable`, using the provided TLS settings) + :param ssl_context: if ``tls=True``, the SSLContext object to use (if not provided, + a secure default will be created) + :param tls_hostname: if ``tls=True``, host name of the server to use for checking + the server certificate (defaults to the host portion of the address for TCP + connectables) + :param tls_standard_compatible: if ``False`` and ``tls=True``, makes the TLS stream + skip the closing handshake when closing the connection, so it won't raise an + exception if the server does the same + + """ + connectable: TCPConnectable | UNIXConnectable | TLSConnectable + if isinstance(remote, ByteStreamConnectable): + return remote + elif isinstance(remote, tuple) and len(remote) == 2: + connectable = TCPConnectable(*remote) + elif isinstance(remote, (str, bytes, PathLike)): + connectable = UNIXConnectable(remote) + else: + raise TypeError(f"cannot convert {remote!r} to a connectable") + + if tls: + if not tls_hostname and isinstance(connectable, TCPConnectable): + tls_hostname = str(connectable.host) + + connectable = TLSConnectable( + connectable, + ssl_context=ssl_context, + hostname=tls_hostname, + standard_compatible=tls_standard_compatible, + ) + + return connectable diff --git a/venv/lib/python3.11/site-packages/anyio/_core/_streams.py b/venv/lib/python3.11/site-packages/anyio/_core/_streams.py new file mode 100644 index 0000000..2b9c7df --- /dev/null +++ b/venv/lib/python3.11/site-packages/anyio/_core/_streams.py @@ -0,0 +1,52 @@ +from __future__ import annotations + +import math +from typing import TypeVar +from warnings import warn + +from ..streams.memory import ( + MemoryObjectReceiveStream, + MemoryObjectSendStream, + _MemoryObjectStreamState, +) + +T_Item = TypeVar("T_Item") + + +class create_memory_object_stream( + tuple[MemoryObjectSendStream[T_Item], MemoryObjectReceiveStream[T_Item]], +): + """ + Create a memory object stream. + + The stream's item type can be annotated like + :func:`create_memory_object_stream[T_Item]`. + + :param max_buffer_size: number of items held in the buffer until ``send()`` starts + blocking + :param item_type: old way of marking the streams with the right generic type for + static typing (does nothing on AnyIO 4) + + .. deprecated:: 4.0 + Use ``create_memory_object_stream[YourItemType](...)`` instead. + :return: a tuple of (send stream, receive stream) + + """ + + def __new__( # type: ignore[misc] + cls, max_buffer_size: float = 0, item_type: object = None + ) -> tuple[MemoryObjectSendStream[T_Item], MemoryObjectReceiveStream[T_Item]]: + if max_buffer_size != math.inf and not isinstance(max_buffer_size, int): + raise ValueError("max_buffer_size must be either an integer or math.inf") + if max_buffer_size < 0: + raise ValueError("max_buffer_size cannot be negative") + if item_type is not None: + warn( + "The item_type argument has been deprecated in AnyIO 4.0. " + "Use create_memory_object_stream[YourItemType](...) instead.", + DeprecationWarning, + stacklevel=2, + ) + + state = _MemoryObjectStreamState[T_Item](max_buffer_size) + return (MemoryObjectSendStream(state), MemoryObjectReceiveStream(state)) diff --git a/venv/lib/python3.11/site-packages/anyio/_core/_subprocesses.py b/venv/lib/python3.11/site-packages/anyio/_core/_subprocesses.py new file mode 100644 index 0000000..36d9b30 --- /dev/null +++ b/venv/lib/python3.11/site-packages/anyio/_core/_subprocesses.py @@ -0,0 +1,202 @@ +from __future__ import annotations + +import sys +from collections.abc import AsyncIterable, Iterable, Mapping, Sequence +from io import BytesIO +from os import PathLike +from subprocess import PIPE, CalledProcessError, CompletedProcess +from typing import IO, Any, Union, cast + +from ..abc import Process +from ._eventloop import get_async_backend +from ._tasks import create_task_group + +if sys.version_info >= (3, 10): + from typing import TypeAlias +else: + from typing_extensions import TypeAlias + +StrOrBytesPath: TypeAlias = Union[str, bytes, "PathLike[str]", "PathLike[bytes]"] + + +async def run_process( + command: StrOrBytesPath | Sequence[StrOrBytesPath], + *, + input: bytes | None = None, + stdin: int | IO[Any] | None = None, + stdout: int | IO[Any] | None = PIPE, + stderr: int | IO[Any] | None = PIPE, + check: bool = True, + cwd: StrOrBytesPath | None = None, + env: Mapping[str, str] | None = None, + startupinfo: Any = None, + creationflags: int = 0, + start_new_session: bool = False, + pass_fds: Sequence[int] = (), + user: str | int | None = None, + group: str | int | None = None, + extra_groups: Iterable[str | int] | None = None, + umask: int = -1, +) -> CompletedProcess[bytes]: + """ + Run an external command in a subprocess and wait until it completes. + + .. seealso:: :func:`subprocess.run` + + :param command: either a string to pass to the shell, or an iterable of strings + containing the executable name or path and its arguments + :param input: bytes passed to the standard input of the subprocess + :param stdin: one of :data:`subprocess.PIPE`, :data:`subprocess.DEVNULL`, + a file-like object, or `None`; ``input`` overrides this + :param stdout: one of :data:`subprocess.PIPE`, :data:`subprocess.DEVNULL`, + a file-like object, or `None` + :param stderr: one of :data:`subprocess.PIPE`, :data:`subprocess.DEVNULL`, + :data:`subprocess.STDOUT`, a file-like object, or `None` + :param check: if ``True``, raise :exc:`~subprocess.CalledProcessError` if the + process terminates with a return code other than 0 + :param cwd: If not ``None``, change the working directory to this before running the + command + :param env: if not ``None``, this mapping replaces the inherited environment + variables from the parent process + :param startupinfo: an instance of :class:`subprocess.STARTUPINFO` that can be used + to specify process startup parameters (Windows only) + :param creationflags: flags that can be used to control the creation of the + subprocess (see :class:`subprocess.Popen` for the specifics) + :param start_new_session: if ``true`` the setsid() system call will be made in the + child process prior to the execution of the subprocess. (POSIX only) + :param pass_fds: sequence of file descriptors to keep open between the parent and + child processes. (POSIX only) + :param user: effective user to run the process as (Python >= 3.9, POSIX only) + :param group: effective group to run the process as (Python >= 3.9, POSIX only) + :param extra_groups: supplementary groups to set in the subprocess (Python >= 3.9, + POSIX only) + :param umask: if not negative, this umask is applied in the child process before + running the given command (Python >= 3.9, POSIX only) + :return: an object representing the completed process + :raises ~subprocess.CalledProcessError: if ``check`` is ``True`` and the process + exits with a nonzero return code + + """ + + async def drain_stream(stream: AsyncIterable[bytes], index: int) -> None: + buffer = BytesIO() + async for chunk in stream: + buffer.write(chunk) + + stream_contents[index] = buffer.getvalue() + + if stdin is not None and input is not None: + raise ValueError("only one of stdin and input is allowed") + + async with await open_process( + command, + stdin=PIPE if input else stdin, + stdout=stdout, + stderr=stderr, + cwd=cwd, + env=env, + startupinfo=startupinfo, + creationflags=creationflags, + start_new_session=start_new_session, + pass_fds=pass_fds, + user=user, + group=group, + extra_groups=extra_groups, + umask=umask, + ) as process: + stream_contents: list[bytes | None] = [None, None] + async with create_task_group() as tg: + if process.stdout: + tg.start_soon(drain_stream, process.stdout, 0) + + if process.stderr: + tg.start_soon(drain_stream, process.stderr, 1) + + if process.stdin and input: + await process.stdin.send(input) + await process.stdin.aclose() + + await process.wait() + + output, errors = stream_contents + if check and process.returncode != 0: + raise CalledProcessError(cast(int, process.returncode), command, output, errors) + + return CompletedProcess(command, cast(int, process.returncode), output, errors) + + +async def open_process( + command: StrOrBytesPath | Sequence[StrOrBytesPath], + *, + stdin: int | IO[Any] | None = PIPE, + stdout: int | IO[Any] | None = PIPE, + stderr: int | IO[Any] | None = PIPE, + cwd: StrOrBytesPath | None = None, + env: Mapping[str, str] | None = None, + startupinfo: Any = None, + creationflags: int = 0, + start_new_session: bool = False, + pass_fds: Sequence[int] = (), + user: str | int | None = None, + group: str | int | None = None, + extra_groups: Iterable[str | int] | None = None, + umask: int = -1, +) -> Process: + """ + Start an external command in a subprocess. + + .. seealso:: :class:`subprocess.Popen` + + :param command: either a string to pass to the shell, or an iterable of strings + containing the executable name or path and its arguments + :param stdin: one of :data:`subprocess.PIPE`, :data:`subprocess.DEVNULL`, a + file-like object, or ``None`` + :param stdout: one of :data:`subprocess.PIPE`, :data:`subprocess.DEVNULL`, + a file-like object, or ``None`` + :param stderr: one of :data:`subprocess.PIPE`, :data:`subprocess.DEVNULL`, + :data:`subprocess.STDOUT`, a file-like object, or ``None`` + :param cwd: If not ``None``, the working directory is changed before executing + :param env: If env is not ``None``, it must be a mapping that defines the + environment variables for the new process + :param creationflags: flags that can be used to control the creation of the + subprocess (see :class:`subprocess.Popen` for the specifics) + :param startupinfo: an instance of :class:`subprocess.STARTUPINFO` that can be used + to specify process startup parameters (Windows only) + :param start_new_session: if ``true`` the setsid() system call will be made in the + child process prior to the execution of the subprocess. (POSIX only) + :param pass_fds: sequence of file descriptors to keep open between the parent and + child processes. (POSIX only) + :param user: effective user to run the process as (POSIX only) + :param group: effective group to run the process as (POSIX only) + :param extra_groups: supplementary groups to set in the subprocess (POSIX only) + :param umask: if not negative, this umask is applied in the child process before + running the given command (POSIX only) + :return: an asynchronous process object + + """ + kwargs: dict[str, Any] = {} + if user is not None: + kwargs["user"] = user + + if group is not None: + kwargs["group"] = group + + if extra_groups is not None: + kwargs["extra_groups"] = group + + if umask >= 0: + kwargs["umask"] = umask + + return await get_async_backend().open_process( + command, + stdin=stdin, + stdout=stdout, + stderr=stderr, + cwd=cwd, + env=env, + startupinfo=startupinfo, + creationflags=creationflags, + start_new_session=start_new_session, + pass_fds=pass_fds, + **kwargs, + ) diff --git a/venv/lib/python3.11/site-packages/anyio/_core/_synchronization.py b/venv/lib/python3.11/site-packages/anyio/_core/_synchronization.py new file mode 100644 index 0000000..c0ef27a --- /dev/null +++ b/venv/lib/python3.11/site-packages/anyio/_core/_synchronization.py @@ -0,0 +1,753 @@ +from __future__ import annotations + +import math +from collections import deque +from collections.abc import Callable +from dataclasses import dataclass +from types import TracebackType +from typing import TypeVar + +from ..lowlevel import checkpoint_if_cancelled +from ._eventloop import get_async_backend +from ._exceptions import BusyResourceError, NoEventLoopError +from ._tasks import CancelScope +from ._testing import TaskInfo, get_current_task + +T = TypeVar("T") + + +@dataclass(frozen=True) +class EventStatistics: + """ + :ivar int tasks_waiting: number of tasks waiting on :meth:`~.Event.wait` + """ + + tasks_waiting: int + + +@dataclass(frozen=True) +class CapacityLimiterStatistics: + """ + :ivar int borrowed_tokens: number of tokens currently borrowed by tasks + :ivar float total_tokens: total number of available tokens + :ivar tuple borrowers: tasks or other objects currently holding tokens borrowed from + this limiter + :ivar int tasks_waiting: number of tasks waiting on + :meth:`~.CapacityLimiter.acquire` or + :meth:`~.CapacityLimiter.acquire_on_behalf_of` + """ + + borrowed_tokens: int + total_tokens: float + borrowers: tuple[object, ...] + tasks_waiting: int + + +@dataclass(frozen=True) +class LockStatistics: + """ + :ivar bool locked: flag indicating if this lock is locked or not + :ivar ~anyio.TaskInfo owner: task currently holding the lock (or ``None`` if the + lock is not held by any task) + :ivar int tasks_waiting: number of tasks waiting on :meth:`~.Lock.acquire` + """ + + locked: bool + owner: TaskInfo | None + tasks_waiting: int + + +@dataclass(frozen=True) +class ConditionStatistics: + """ + :ivar int tasks_waiting: number of tasks blocked on :meth:`~.Condition.wait` + :ivar ~anyio.LockStatistics lock_statistics: statistics of the underlying + :class:`~.Lock` + """ + + tasks_waiting: int + lock_statistics: LockStatistics + + +@dataclass(frozen=True) +class SemaphoreStatistics: + """ + :ivar int tasks_waiting: number of tasks waiting on :meth:`~.Semaphore.acquire` + + """ + + tasks_waiting: int + + +class Event: + def __new__(cls) -> Event: + try: + return get_async_backend().create_event() + except NoEventLoopError: + return EventAdapter() + + def set(self) -> None: + """Set the flag, notifying all listeners.""" + raise NotImplementedError + + def is_set(self) -> bool: + """Return ``True`` if the flag is set, ``False`` if not.""" + raise NotImplementedError + + async def wait(self) -> None: + """ + Wait until the flag has been set. + + If the flag has already been set when this method is called, it returns + immediately. + + """ + raise NotImplementedError + + def statistics(self) -> EventStatistics: + """Return statistics about the current state of this event.""" + raise NotImplementedError + + +class EventAdapter(Event): + _internal_event: Event | None = None + _is_set: bool = False + + def __new__(cls) -> EventAdapter: + return object.__new__(cls) + + @property + def _event(self) -> Event: + if self._internal_event is None: + self._internal_event = get_async_backend().create_event() + if self._is_set: + self._internal_event.set() + + return self._internal_event + + def set(self) -> None: + if self._internal_event is None: + self._is_set = True + else: + self._event.set() + + def is_set(self) -> bool: + if self._internal_event is None: + return self._is_set + + return self._internal_event.is_set() + + async def wait(self) -> None: + await self._event.wait() + + def statistics(self) -> EventStatistics: + if self._internal_event is None: + return EventStatistics(tasks_waiting=0) + + return self._internal_event.statistics() + + +class Lock: + def __new__(cls, *, fast_acquire: bool = False) -> Lock: + try: + return get_async_backend().create_lock(fast_acquire=fast_acquire) + except NoEventLoopError: + return LockAdapter(fast_acquire=fast_acquire) + + async def __aenter__(self) -> None: + await self.acquire() + + async def __aexit__( + self, + exc_type: type[BaseException] | None, + exc_val: BaseException | None, + exc_tb: TracebackType | None, + ) -> None: + self.release() + + async def acquire(self) -> None: + """Acquire the lock.""" + raise NotImplementedError + + def acquire_nowait(self) -> None: + """ + Acquire the lock, without blocking. + + :raises ~anyio.WouldBlock: if the operation would block + + """ + raise NotImplementedError + + def release(self) -> None: + """Release the lock.""" + raise NotImplementedError + + def locked(self) -> bool: + """Return True if the lock is currently held.""" + raise NotImplementedError + + def statistics(self) -> LockStatistics: + """ + Return statistics about the current state of this lock. + + .. versionadded:: 3.0 + """ + raise NotImplementedError + + +class LockAdapter(Lock): + _internal_lock: Lock | None = None + + def __new__(cls, *, fast_acquire: bool = False) -> LockAdapter: + return object.__new__(cls) + + def __init__(self, *, fast_acquire: bool = False): + self._fast_acquire = fast_acquire + + @property + def _lock(self) -> Lock: + if self._internal_lock is None: + self._internal_lock = get_async_backend().create_lock( + fast_acquire=self._fast_acquire + ) + + return self._internal_lock + + async def __aenter__(self) -> None: + await self._lock.acquire() + + async def __aexit__( + self, + exc_type: type[BaseException] | None, + exc_val: BaseException | None, + exc_tb: TracebackType | None, + ) -> None: + if self._internal_lock is not None: + self._internal_lock.release() + + async def acquire(self) -> None: + """Acquire the lock.""" + await self._lock.acquire() + + def acquire_nowait(self) -> None: + """ + Acquire the lock, without blocking. + + :raises ~anyio.WouldBlock: if the operation would block + + """ + self._lock.acquire_nowait() + + def release(self) -> None: + """Release the lock.""" + self._lock.release() + + def locked(self) -> bool: + """Return True if the lock is currently held.""" + return self._lock.locked() + + def statistics(self) -> LockStatistics: + """ + Return statistics about the current state of this lock. + + .. versionadded:: 3.0 + + """ + if self._internal_lock is None: + return LockStatistics(False, None, 0) + + return self._internal_lock.statistics() + + +class Condition: + _owner_task: TaskInfo | None = None + + def __init__(self, lock: Lock | None = None): + self._lock = lock or Lock() + self._waiters: deque[Event] = deque() + + async def __aenter__(self) -> None: + await self.acquire() + + async def __aexit__( + self, + exc_type: type[BaseException] | None, + exc_val: BaseException | None, + exc_tb: TracebackType | None, + ) -> None: + self.release() + + def _check_acquired(self) -> None: + if self._owner_task != get_current_task(): + raise RuntimeError("The current task is not holding the underlying lock") + + async def acquire(self) -> None: + """Acquire the underlying lock.""" + await self._lock.acquire() + self._owner_task = get_current_task() + + def acquire_nowait(self) -> None: + """ + Acquire the underlying lock, without blocking. + + :raises ~anyio.WouldBlock: if the operation would block + + """ + self._lock.acquire_nowait() + self._owner_task = get_current_task() + + def release(self) -> None: + """Release the underlying lock.""" + self._lock.release() + + def locked(self) -> bool: + """Return True if the lock is set.""" + return self._lock.locked() + + def notify(self, n: int = 1) -> None: + """Notify exactly n listeners.""" + self._check_acquired() + for _ in range(n): + try: + event = self._waiters.popleft() + except IndexError: + break + + event.set() + + def notify_all(self) -> None: + """Notify all the listeners.""" + self._check_acquired() + for event in self._waiters: + event.set() + + self._waiters.clear() + + async def wait(self) -> None: + """Wait for a notification.""" + await checkpoint_if_cancelled() + self._check_acquired() + event = Event() + self._waiters.append(event) + self.release() + try: + await event.wait() + except BaseException: + if not event.is_set(): + self._waiters.remove(event) + + raise + finally: + with CancelScope(shield=True): + await self.acquire() + + async def wait_for(self, predicate: Callable[[], T]) -> T: + """ + Wait until a predicate becomes true. + + :param predicate: a callable that returns a truthy value when the condition is + met + :return: the result of the predicate + + .. versionadded:: 4.11.0 + + """ + while not (result := predicate()): + await self.wait() + + return result + + def statistics(self) -> ConditionStatistics: + """ + Return statistics about the current state of this condition. + + .. versionadded:: 3.0 + """ + return ConditionStatistics(len(self._waiters), self._lock.statistics()) + + +class Semaphore: + def __new__( + cls, + initial_value: int, + *, + max_value: int | None = None, + fast_acquire: bool = False, + ) -> Semaphore: + try: + return get_async_backend().create_semaphore( + initial_value, max_value=max_value, fast_acquire=fast_acquire + ) + except NoEventLoopError: + return SemaphoreAdapter(initial_value, max_value=max_value) + + def __init__( + self, + initial_value: int, + *, + max_value: int | None = None, + fast_acquire: bool = False, + ): + if not isinstance(initial_value, int): + raise TypeError("initial_value must be an integer") + if initial_value < 0: + raise ValueError("initial_value must be >= 0") + if max_value is not None: + if not isinstance(max_value, int): + raise TypeError("max_value must be an integer or None") + if max_value < initial_value: + raise ValueError( + "max_value must be equal to or higher than initial_value" + ) + + self._fast_acquire = fast_acquire + + async def __aenter__(self) -> Semaphore: + await self.acquire() + return self + + async def __aexit__( + self, + exc_type: type[BaseException] | None, + exc_val: BaseException | None, + exc_tb: TracebackType | None, + ) -> None: + self.release() + + async def acquire(self) -> None: + """Decrement the semaphore value, blocking if necessary.""" + raise NotImplementedError + + def acquire_nowait(self) -> None: + """ + Acquire the underlying lock, without blocking. + + :raises ~anyio.WouldBlock: if the operation would block + + """ + raise NotImplementedError + + def release(self) -> None: + """Increment the semaphore value.""" + raise NotImplementedError + + @property + def value(self) -> int: + """The current value of the semaphore.""" + raise NotImplementedError + + @property + def max_value(self) -> int | None: + """The maximum value of the semaphore.""" + raise NotImplementedError + + def statistics(self) -> SemaphoreStatistics: + """ + Return statistics about the current state of this semaphore. + + .. versionadded:: 3.0 + """ + raise NotImplementedError + + +class SemaphoreAdapter(Semaphore): + _internal_semaphore: Semaphore | None = None + + def __new__( + cls, + initial_value: int, + *, + max_value: int | None = None, + fast_acquire: bool = False, + ) -> SemaphoreAdapter: + return object.__new__(cls) + + def __init__( + self, + initial_value: int, + *, + max_value: int | None = None, + fast_acquire: bool = False, + ) -> None: + super().__init__(initial_value, max_value=max_value, fast_acquire=fast_acquire) + self._initial_value = initial_value + self._max_value = max_value + + @property + def _semaphore(self) -> Semaphore: + if self._internal_semaphore is None: + self._internal_semaphore = get_async_backend().create_semaphore( + self._initial_value, max_value=self._max_value + ) + + return self._internal_semaphore + + async def acquire(self) -> None: + await self._semaphore.acquire() + + def acquire_nowait(self) -> None: + self._semaphore.acquire_nowait() + + def release(self) -> None: + self._semaphore.release() + + @property + def value(self) -> int: + if self._internal_semaphore is None: + return self._initial_value + + return self._semaphore.value + + @property + def max_value(self) -> int | None: + return self._max_value + + def statistics(self) -> SemaphoreStatistics: + if self._internal_semaphore is None: + return SemaphoreStatistics(tasks_waiting=0) + + return self._semaphore.statistics() + + +class CapacityLimiter: + def __new__(cls, total_tokens: float) -> CapacityLimiter: + try: + return get_async_backend().create_capacity_limiter(total_tokens) + except NoEventLoopError: + return CapacityLimiterAdapter(total_tokens) + + async def __aenter__(self) -> None: + raise NotImplementedError + + async def __aexit__( + self, + exc_type: type[BaseException] | None, + exc_val: BaseException | None, + exc_tb: TracebackType | None, + ) -> None: + raise NotImplementedError + + @property + def total_tokens(self) -> float: + """ + The total number of tokens available for borrowing. + + This is a read-write property. If the total number of tokens is increased, the + proportionate number of tasks waiting on this limiter will be granted their + tokens. + + .. versionchanged:: 3.0 + The property is now writable. + .. versionchanged:: 4.12 + The value can now be set to 0. + + """ + raise NotImplementedError + + @total_tokens.setter + def total_tokens(self, value: float) -> None: + raise NotImplementedError + + @property + def borrowed_tokens(self) -> int: + """The number of tokens that have currently been borrowed.""" + raise NotImplementedError + + @property + def available_tokens(self) -> float: + """The number of tokens currently available to be borrowed""" + raise NotImplementedError + + def acquire_nowait(self) -> None: + """ + Acquire a token for the current task without waiting for one to become + available. + + :raises ~anyio.WouldBlock: if there are no tokens available for borrowing + + """ + raise NotImplementedError + + def acquire_on_behalf_of_nowait(self, borrower: object) -> None: + """ + Acquire a token without waiting for one to become available. + + :param borrower: the entity borrowing a token + :raises ~anyio.WouldBlock: if there are no tokens available for borrowing + + """ + raise NotImplementedError + + async def acquire(self) -> None: + """ + Acquire a token for the current task, waiting if necessary for one to become + available. + + """ + raise NotImplementedError + + async def acquire_on_behalf_of(self, borrower: object) -> None: + """ + Acquire a token, waiting if necessary for one to become available. + + :param borrower: the entity borrowing a token + + """ + raise NotImplementedError + + def release(self) -> None: + """ + Release the token held by the current task. + + :raises RuntimeError: if the current task has not borrowed a token from this + limiter. + + """ + raise NotImplementedError + + def release_on_behalf_of(self, borrower: object) -> None: + """ + Release the token held by the given borrower. + + :raises RuntimeError: if the borrower has not borrowed a token from this + limiter. + + """ + raise NotImplementedError + + def statistics(self) -> CapacityLimiterStatistics: + """ + Return statistics about the current state of this limiter. + + .. versionadded:: 3.0 + + """ + raise NotImplementedError + + +class CapacityLimiterAdapter(CapacityLimiter): + _internal_limiter: CapacityLimiter | None = None + + def __new__(cls, total_tokens: float) -> CapacityLimiterAdapter: + return object.__new__(cls) + + def __init__(self, total_tokens: float) -> None: + self.total_tokens = total_tokens + + @property + def _limiter(self) -> CapacityLimiter: + if self._internal_limiter is None: + self._internal_limiter = get_async_backend().create_capacity_limiter( + self._total_tokens + ) + + return self._internal_limiter + + async def __aenter__(self) -> None: + await self._limiter.__aenter__() + + async def __aexit__( + self, + exc_type: type[BaseException] | None, + exc_val: BaseException | None, + exc_tb: TracebackType | None, + ) -> None: + return await self._limiter.__aexit__(exc_type, exc_val, exc_tb) + + @property + def total_tokens(self) -> float: + if self._internal_limiter is None: + return self._total_tokens + + return self._internal_limiter.total_tokens + + @total_tokens.setter + def total_tokens(self, value: float) -> None: + if not isinstance(value, int) and value is not math.inf: + raise TypeError("total_tokens must be an int or math.inf") + elif value < 1: + raise ValueError("total_tokens must be >= 1") + + if self._internal_limiter is None: + self._total_tokens = value + return + + self._limiter.total_tokens = value + + @property + def borrowed_tokens(self) -> int: + if self._internal_limiter is None: + return 0 + + return self._internal_limiter.borrowed_tokens + + @property + def available_tokens(self) -> float: + if self._internal_limiter is None: + return self._total_tokens + + return self._internal_limiter.available_tokens + + def acquire_nowait(self) -> None: + self._limiter.acquire_nowait() + + def acquire_on_behalf_of_nowait(self, borrower: object) -> None: + self._limiter.acquire_on_behalf_of_nowait(borrower) + + async def acquire(self) -> None: + await self._limiter.acquire() + + async def acquire_on_behalf_of(self, borrower: object) -> None: + await self._limiter.acquire_on_behalf_of(borrower) + + def release(self) -> None: + self._limiter.release() + + def release_on_behalf_of(self, borrower: object) -> None: + self._limiter.release_on_behalf_of(borrower) + + def statistics(self) -> CapacityLimiterStatistics: + if self._internal_limiter is None: + return CapacityLimiterStatistics( + borrowed_tokens=0, + total_tokens=self.total_tokens, + borrowers=(), + tasks_waiting=0, + ) + + return self._internal_limiter.statistics() + + +class ResourceGuard: + """ + A context manager for ensuring that a resource is only used by a single task at a + time. + + Entering this context manager while the previous has not exited it yet will trigger + :exc:`BusyResourceError`. + + :param action: the action to guard against (visible in the :exc:`BusyResourceError` + when triggered, e.g. "Another task is already {action} this resource") + + .. versionadded:: 4.1 + """ + + __slots__ = "action", "_guarded" + + def __init__(self, action: str = "using"): + self.action: str = action + self._guarded = False + + def __enter__(self) -> None: + if self._guarded: + raise BusyResourceError(self.action) + + self._guarded = True + + def __exit__( + self, + exc_type: type[BaseException] | None, + exc_val: BaseException | None, + exc_tb: TracebackType | None, + ) -> None: + self._guarded = False diff --git a/venv/lib/python3.11/site-packages/anyio/_core/_tasks.py b/venv/lib/python3.11/site-packages/anyio/_core/_tasks.py new file mode 100644 index 0000000..0688bfe --- /dev/null +++ b/venv/lib/python3.11/site-packages/anyio/_core/_tasks.py @@ -0,0 +1,173 @@ +from __future__ import annotations + +import math +from collections.abc import Generator +from contextlib import contextmanager +from types import TracebackType + +from ..abc._tasks import TaskGroup, TaskStatus +from ._eventloop import get_async_backend + + +class _IgnoredTaskStatus(TaskStatus[object]): + def started(self, value: object = None) -> None: + pass + + +TASK_STATUS_IGNORED = _IgnoredTaskStatus() + + +class CancelScope: + """ + Wraps a unit of work that can be made separately cancellable. + + :param deadline: The time (clock value) when this scope is cancelled automatically + :param shield: ``True`` to shield the cancel scope from external cancellation + :raises NoEventLoopError: if no supported asynchronous event loop is running in the + current thread + """ + + def __new__( + cls, *, deadline: float = math.inf, shield: bool = False + ) -> CancelScope: + return get_async_backend().create_cancel_scope(shield=shield, deadline=deadline) + + def cancel(self, reason: str | None = None) -> None: + """ + Cancel this scope immediately. + + :param reason: a message describing the reason for the cancellation + + """ + raise NotImplementedError + + @property + def deadline(self) -> float: + """ + The time (clock value) when this scope is cancelled automatically. + + Will be ``float('inf')`` if no timeout has been set. + + """ + raise NotImplementedError + + @deadline.setter + def deadline(self, value: float) -> None: + raise NotImplementedError + + @property + def cancel_called(self) -> bool: + """``True`` if :meth:`cancel` has been called.""" + raise NotImplementedError + + @property + def cancelled_caught(self) -> bool: + """ + ``True`` if this scope suppressed a cancellation exception it itself raised. + + This is typically used to check if any work was interrupted, or to see if the + scope was cancelled due to its deadline being reached. The value will, however, + only be ``True`` if the cancellation was triggered by the scope itself (and not + an outer scope). + + """ + raise NotImplementedError + + @property + def shield(self) -> bool: + """ + ``True`` if this scope is shielded from external cancellation. + + While a scope is shielded, it will not receive cancellations from outside. + + """ + raise NotImplementedError + + @shield.setter + def shield(self, value: bool) -> None: + raise NotImplementedError + + def __enter__(self) -> CancelScope: + raise NotImplementedError + + def __exit__( + self, + exc_type: type[BaseException] | None, + exc_val: BaseException | None, + exc_tb: TracebackType | None, + ) -> bool: + raise NotImplementedError + + +@contextmanager +def fail_after( + delay: float | None, shield: bool = False +) -> Generator[CancelScope, None, None]: + """ + Create a context manager which raises a :class:`TimeoutError` if does not finish in + time. + + :param delay: maximum allowed time (in seconds) before raising the exception, or + ``None`` to disable the timeout + :param shield: ``True`` to shield the cancel scope from external cancellation + :return: a context manager that yields a cancel scope + :rtype: :class:`~typing.ContextManager`\\[:class:`~anyio.CancelScope`\\] + :raises NoEventLoopError: if no supported asynchronous event loop is running in the + current thread + + """ + current_time = get_async_backend().current_time + deadline = (current_time() + delay) if delay is not None else math.inf + with get_async_backend().create_cancel_scope( + deadline=deadline, shield=shield + ) as cancel_scope: + yield cancel_scope + + if cancel_scope.cancelled_caught and current_time() >= cancel_scope.deadline: + raise TimeoutError + + +def move_on_after(delay: float | None, shield: bool = False) -> CancelScope: + """ + Create a cancel scope with a deadline that expires after the given delay. + + :param delay: maximum allowed time (in seconds) before exiting the context block, or + ``None`` to disable the timeout + :param shield: ``True`` to shield the cancel scope from external cancellation + :return: a cancel scope + :raises NoEventLoopError: if no supported asynchronous event loop is running in the + current thread + + """ + deadline = ( + (get_async_backend().current_time() + delay) if delay is not None else math.inf + ) + return get_async_backend().create_cancel_scope(deadline=deadline, shield=shield) + + +def current_effective_deadline() -> float: + """ + Return the nearest deadline among all the cancel scopes effective for the current + task. + + :return: a clock value from the event loop's internal clock (or ``float('inf')`` if + there is no deadline in effect, or ``float('-inf')`` if the current scope has + been cancelled) + :rtype: float + :raises NoEventLoopError: if no supported asynchronous event loop is running in the + current thread + + """ + return get_async_backend().current_effective_deadline() + + +def create_task_group() -> TaskGroup: + """ + Create a task group. + + :return: a task group + :raises NoEventLoopError: if no supported asynchronous event loop is running in the + current thread + + """ + return get_async_backend().create_task_group() diff --git a/venv/lib/python3.11/site-packages/anyio/_core/_tempfile.py b/venv/lib/python3.11/site-packages/anyio/_core/_tempfile.py new file mode 100644 index 0000000..fbb6b14 --- /dev/null +++ b/venv/lib/python3.11/site-packages/anyio/_core/_tempfile.py @@ -0,0 +1,616 @@ +from __future__ import annotations + +import os +import sys +import tempfile +from collections.abc import Iterable +from io import BytesIO, TextIOWrapper +from types import TracebackType +from typing import ( + TYPE_CHECKING, + Any, + AnyStr, + Generic, + overload, +) + +from .. import to_thread +from .._core._fileio import AsyncFile +from ..lowlevel import checkpoint_if_cancelled + +if TYPE_CHECKING: + from _typeshed import OpenBinaryMode, OpenTextMode, ReadableBuffer, WriteableBuffer + + +class TemporaryFile(Generic[AnyStr]): + """ + An asynchronous temporary file that is automatically created and cleaned up. + + This class provides an asynchronous context manager interface to a temporary file. + The file is created using Python's standard `tempfile.TemporaryFile` function in a + background thread, and is wrapped as an asynchronous file using `AsyncFile`. + + :param mode: The mode in which the file is opened. Defaults to "w+b". + :param buffering: The buffering policy (-1 means the default buffering). + :param encoding: The encoding used to decode or encode the file. Only applicable in + text mode. + :param newline: Controls how universal newlines mode works (only applicable in text + mode). + :param suffix: The suffix for the temporary file name. + :param prefix: The prefix for the temporary file name. + :param dir: The directory in which the temporary file is created. + :param errors: The error handling scheme used for encoding/decoding errors. + """ + + _async_file: AsyncFile[AnyStr] + + @overload + def __init__( + self: TemporaryFile[bytes], + mode: OpenBinaryMode = ..., + buffering: int = ..., + encoding: str | None = ..., + newline: str | None = ..., + suffix: str | None = ..., + prefix: str | None = ..., + dir: str | None = ..., + *, + errors: str | None = ..., + ): ... + @overload + def __init__( + self: TemporaryFile[str], + mode: OpenTextMode, + buffering: int = ..., + encoding: str | None = ..., + newline: str | None = ..., + suffix: str | None = ..., + prefix: str | None = ..., + dir: str | None = ..., + *, + errors: str | None = ..., + ): ... + + def __init__( + self, + mode: OpenTextMode | OpenBinaryMode = "w+b", + buffering: int = -1, + encoding: str | None = None, + newline: str | None = None, + suffix: str | None = None, + prefix: str | None = None, + dir: str | None = None, + *, + errors: str | None = None, + ) -> None: + self.mode = mode + self.buffering = buffering + self.encoding = encoding + self.newline = newline + self.suffix: str | None = suffix + self.prefix: str | None = prefix + self.dir: str | None = dir + self.errors = errors + + async def __aenter__(self) -> AsyncFile[AnyStr]: + fp = await to_thread.run_sync( + lambda: tempfile.TemporaryFile( + self.mode, + self.buffering, + self.encoding, + self.newline, + self.suffix, + self.prefix, + self.dir, + errors=self.errors, + ) + ) + self._async_file = AsyncFile(fp) + return self._async_file + + async def __aexit__( + self, + exc_type: type[BaseException] | None, + exc_value: BaseException | None, + traceback: TracebackType | None, + ) -> None: + await self._async_file.aclose() + + +class NamedTemporaryFile(Generic[AnyStr]): + """ + An asynchronous named temporary file that is automatically created and cleaned up. + + This class provides an asynchronous context manager for a temporary file with a + visible name in the file system. It uses Python's standard + :func:`~tempfile.NamedTemporaryFile` function and wraps the file object with + :class:`AsyncFile` for asynchronous operations. + + :param mode: The mode in which the file is opened. Defaults to "w+b". + :param buffering: The buffering policy (-1 means the default buffering). + :param encoding: The encoding used to decode or encode the file. Only applicable in + text mode. + :param newline: Controls how universal newlines mode works (only applicable in text + mode). + :param suffix: The suffix for the temporary file name. + :param prefix: The prefix for the temporary file name. + :param dir: The directory in which the temporary file is created. + :param delete: Whether to delete the file when it is closed. + :param errors: The error handling scheme used for encoding/decoding errors. + :param delete_on_close: (Python 3.12+) Whether to delete the file on close. + """ + + _async_file: AsyncFile[AnyStr] + + @overload + def __init__( + self: NamedTemporaryFile[bytes], + mode: OpenBinaryMode = ..., + buffering: int = ..., + encoding: str | None = ..., + newline: str | None = ..., + suffix: str | None = ..., + prefix: str | None = ..., + dir: str | None = ..., + delete: bool = ..., + *, + errors: str | None = ..., + delete_on_close: bool = ..., + ): ... + @overload + def __init__( + self: NamedTemporaryFile[str], + mode: OpenTextMode, + buffering: int = ..., + encoding: str | None = ..., + newline: str | None = ..., + suffix: str | None = ..., + prefix: str | None = ..., + dir: str | None = ..., + delete: bool = ..., + *, + errors: str | None = ..., + delete_on_close: bool = ..., + ): ... + + def __init__( + self, + mode: OpenBinaryMode | OpenTextMode = "w+b", + buffering: int = -1, + encoding: str | None = None, + newline: str | None = None, + suffix: str | None = None, + prefix: str | None = None, + dir: str | None = None, + delete: bool = True, + *, + errors: str | None = None, + delete_on_close: bool = True, + ) -> None: + self._params: dict[str, Any] = { + "mode": mode, + "buffering": buffering, + "encoding": encoding, + "newline": newline, + "suffix": suffix, + "prefix": prefix, + "dir": dir, + "delete": delete, + "errors": errors, + } + if sys.version_info >= (3, 12): + self._params["delete_on_close"] = delete_on_close + + async def __aenter__(self) -> AsyncFile[AnyStr]: + fp = await to_thread.run_sync( + lambda: tempfile.NamedTemporaryFile(**self._params) + ) + self._async_file = AsyncFile(fp) + return self._async_file + + async def __aexit__( + self, + exc_type: type[BaseException] | None, + exc_value: BaseException | None, + traceback: TracebackType | None, + ) -> None: + await self._async_file.aclose() + + +class SpooledTemporaryFile(AsyncFile[AnyStr]): + """ + An asynchronous spooled temporary file that starts in memory and is spooled to disk. + + This class provides an asynchronous interface to a spooled temporary file, much like + Python's standard :class:`~tempfile.SpooledTemporaryFile`. It supports asynchronous + write operations and provides a method to force a rollover to disk. + + :param max_size: Maximum size in bytes before the file is rolled over to disk. + :param mode: The mode in which the file is opened. Defaults to "w+b". + :param buffering: The buffering policy (-1 means the default buffering). + :param encoding: The encoding used to decode or encode the file (text mode only). + :param newline: Controls how universal newlines mode works (text mode only). + :param suffix: The suffix for the temporary file name. + :param prefix: The prefix for the temporary file name. + :param dir: The directory in which the temporary file is created. + :param errors: The error handling scheme used for encoding/decoding errors. + """ + + _rolled: bool = False + + @overload + def __init__( + self: SpooledTemporaryFile[bytes], + max_size: int = ..., + mode: OpenBinaryMode = ..., + buffering: int = ..., + encoding: str | None = ..., + newline: str | None = ..., + suffix: str | None = ..., + prefix: str | None = ..., + dir: str | None = ..., + *, + errors: str | None = ..., + ): ... + @overload + def __init__( + self: SpooledTemporaryFile[str], + max_size: int = ..., + mode: OpenTextMode = ..., + buffering: int = ..., + encoding: str | None = ..., + newline: str | None = ..., + suffix: str | None = ..., + prefix: str | None = ..., + dir: str | None = ..., + *, + errors: str | None = ..., + ): ... + + def __init__( + self, + max_size: int = 0, + mode: OpenBinaryMode | OpenTextMode = "w+b", + buffering: int = -1, + encoding: str | None = None, + newline: str | None = None, + suffix: str | None = None, + prefix: str | None = None, + dir: str | None = None, + *, + errors: str | None = None, + ) -> None: + self._tempfile_params: dict[str, Any] = { + "mode": mode, + "buffering": buffering, + "encoding": encoding, + "newline": newline, + "suffix": suffix, + "prefix": prefix, + "dir": dir, + "errors": errors, + } + self._max_size = max_size + if "b" in mode: + super().__init__(BytesIO()) # type: ignore[arg-type] + else: + super().__init__( + TextIOWrapper( # type: ignore[arg-type] + BytesIO(), + encoding=encoding, + errors=errors, + newline=newline, + write_through=True, + ) + ) + + async def aclose(self) -> None: + if not self._rolled: + self._fp.close() + return + + await super().aclose() + + async def _check(self) -> None: + if self._rolled or self._fp.tell() <= self._max_size: + return + + await self.rollover() + + async def rollover(self) -> None: + if self._rolled: + return + + self._rolled = True + buffer = self._fp + buffer.seek(0) + self._fp = await to_thread.run_sync( + lambda: tempfile.TemporaryFile(**self._tempfile_params) + ) + await self.write(buffer.read()) + buffer.close() + + @property + def closed(self) -> bool: + return self._fp.closed + + async def read(self, size: int = -1) -> AnyStr: + if not self._rolled: + await checkpoint_if_cancelled() + return self._fp.read(size) + + return await super().read(size) # type: ignore[return-value] + + async def read1(self: SpooledTemporaryFile[bytes], size: int = -1) -> bytes: + if not self._rolled: + await checkpoint_if_cancelled() + return self._fp.read1(size) + + return await super().read1(size) + + async def readline(self) -> AnyStr: + if not self._rolled: + await checkpoint_if_cancelled() + return self._fp.readline() + + return await super().readline() # type: ignore[return-value] + + async def readlines(self) -> list[AnyStr]: + if not self._rolled: + await checkpoint_if_cancelled() + return self._fp.readlines() + + return await super().readlines() # type: ignore[return-value] + + async def readinto(self: SpooledTemporaryFile[bytes], b: WriteableBuffer) -> int: + if not self._rolled: + await checkpoint_if_cancelled() + self._fp.readinto(b) + + return await super().readinto(b) + + async def readinto1(self: SpooledTemporaryFile[bytes], b: WriteableBuffer) -> int: + if not self._rolled: + await checkpoint_if_cancelled() + self._fp.readinto(b) + + return await super().readinto1(b) + + async def seek(self, offset: int, whence: int | None = os.SEEK_SET) -> int: + if not self._rolled: + await checkpoint_if_cancelled() + return self._fp.seek(offset, whence) + + return await super().seek(offset, whence) + + async def tell(self) -> int: + if not self._rolled: + await checkpoint_if_cancelled() + return self._fp.tell() + + return await super().tell() + + async def truncate(self, size: int | None = None) -> int: + if not self._rolled: + await checkpoint_if_cancelled() + return self._fp.truncate(size) + + return await super().truncate(size) + + @overload + async def write(self: SpooledTemporaryFile[bytes], b: ReadableBuffer) -> int: ... + @overload + async def write(self: SpooledTemporaryFile[str], b: str) -> int: ... + + async def write(self, b: ReadableBuffer | str) -> int: + """ + Asynchronously write data to the spooled temporary file. + + If the file has not yet been rolled over, the data is written synchronously, + and a rollover is triggered if the size exceeds the maximum size. + + :param s: The data to write. + :return: The number of bytes written. + :raises RuntimeError: If the underlying file is not initialized. + + """ + if not self._rolled: + await checkpoint_if_cancelled() + result = self._fp.write(b) + await self._check() + return result + + return await super().write(b) # type: ignore[misc] + + @overload + async def writelines( + self: SpooledTemporaryFile[bytes], lines: Iterable[ReadableBuffer] + ) -> None: ... + @overload + async def writelines( + self: SpooledTemporaryFile[str], lines: Iterable[str] + ) -> None: ... + + async def writelines(self, lines: Iterable[str] | Iterable[ReadableBuffer]) -> None: + """ + Asynchronously write a list of lines to the spooled temporary file. + + If the file has not yet been rolled over, the lines are written synchronously, + and a rollover is triggered if the size exceeds the maximum size. + + :param lines: An iterable of lines to write. + :raises RuntimeError: If the underlying file is not initialized. + + """ + if not self._rolled: + await checkpoint_if_cancelled() + result = self._fp.writelines(lines) + await self._check() + return result + + return await super().writelines(lines) # type: ignore[misc] + + +class TemporaryDirectory(Generic[AnyStr]): + """ + An asynchronous temporary directory that is created and cleaned up automatically. + + This class provides an asynchronous context manager for creating a temporary + directory. It wraps Python's standard :class:`~tempfile.TemporaryDirectory` to + perform directory creation and cleanup operations in a background thread. + + :param suffix: Suffix to be added to the temporary directory name. + :param prefix: Prefix to be added to the temporary directory name. + :param dir: The parent directory where the temporary directory is created. + :param ignore_cleanup_errors: Whether to ignore errors during cleanup + (Python 3.10+). + :param delete: Whether to delete the directory upon closing (Python 3.12+). + """ + + def __init__( + self, + suffix: AnyStr | None = None, + prefix: AnyStr | None = None, + dir: AnyStr | None = None, + *, + ignore_cleanup_errors: bool = False, + delete: bool = True, + ) -> None: + self.suffix: AnyStr | None = suffix + self.prefix: AnyStr | None = prefix + self.dir: AnyStr | None = dir + self.ignore_cleanup_errors = ignore_cleanup_errors + self.delete = delete + + self._tempdir: tempfile.TemporaryDirectory | None = None + + async def __aenter__(self) -> str: + params: dict[str, Any] = { + "suffix": self.suffix, + "prefix": self.prefix, + "dir": self.dir, + } + if sys.version_info >= (3, 10): + params["ignore_cleanup_errors"] = self.ignore_cleanup_errors + + if sys.version_info >= (3, 12): + params["delete"] = self.delete + + self._tempdir = await to_thread.run_sync( + lambda: tempfile.TemporaryDirectory(**params) + ) + return await to_thread.run_sync(self._tempdir.__enter__) + + async def __aexit__( + self, + exc_type: type[BaseException] | None, + exc_value: BaseException | None, + traceback: TracebackType | None, + ) -> None: + if self._tempdir is not None: + await to_thread.run_sync( + self._tempdir.__exit__, exc_type, exc_value, traceback + ) + + async def cleanup(self) -> None: + if self._tempdir is not None: + await to_thread.run_sync(self._tempdir.cleanup) + + +@overload +async def mkstemp( + suffix: str | None = None, + prefix: str | None = None, + dir: str | None = None, + text: bool = False, +) -> tuple[int, str]: ... + + +@overload +async def mkstemp( + suffix: bytes | None = None, + prefix: bytes | None = None, + dir: bytes | None = None, + text: bool = False, +) -> tuple[int, bytes]: ... + + +async def mkstemp( + suffix: AnyStr | None = None, + prefix: AnyStr | None = None, + dir: AnyStr | None = None, + text: bool = False, +) -> tuple[int, str | bytes]: + """ + Asynchronously create a temporary file and return an OS-level handle and the file + name. + + This function wraps `tempfile.mkstemp` and executes it in a background thread. + + :param suffix: Suffix to be added to the file name. + :param prefix: Prefix to be added to the file name. + :param dir: Directory in which the temporary file is created. + :param text: Whether the file is opened in text mode. + :return: A tuple containing the file descriptor and the file name. + + """ + return await to_thread.run_sync(tempfile.mkstemp, suffix, prefix, dir, text) + + +@overload +async def mkdtemp( + suffix: str | None = None, + prefix: str | None = None, + dir: str | None = None, +) -> str: ... + + +@overload +async def mkdtemp( + suffix: bytes | None = None, + prefix: bytes | None = None, + dir: bytes | None = None, +) -> bytes: ... + + +async def mkdtemp( + suffix: AnyStr | None = None, + prefix: AnyStr | None = None, + dir: AnyStr | None = None, +) -> str | bytes: + """ + Asynchronously create a temporary directory and return its path. + + This function wraps `tempfile.mkdtemp` and executes it in a background thread. + + :param suffix: Suffix to be added to the directory name. + :param prefix: Prefix to be added to the directory name. + :param dir: Parent directory where the temporary directory is created. + :return: The path of the created temporary directory. + + """ + return await to_thread.run_sync(tempfile.mkdtemp, suffix, prefix, dir) + + +async def gettempdir() -> str: + """ + Asynchronously return the name of the directory used for temporary files. + + This function wraps `tempfile.gettempdir` and executes it in a background thread. + + :return: The path of the temporary directory as a string. + + """ + return await to_thread.run_sync(tempfile.gettempdir) + + +async def gettempdirb() -> bytes: + """ + Asynchronously return the name of the directory used for temporary files in bytes. + + This function wraps `tempfile.gettempdirb` and executes it in a background thread. + + :return: The path of the temporary directory as bytes. + + """ + return await to_thread.run_sync(tempfile.gettempdirb) diff --git a/venv/lib/python3.11/site-packages/anyio/_core/_testing.py b/venv/lib/python3.11/site-packages/anyio/_core/_testing.py new file mode 100644 index 0000000..369e65c --- /dev/null +++ b/venv/lib/python3.11/site-packages/anyio/_core/_testing.py @@ -0,0 +1,82 @@ +from __future__ import annotations + +from collections.abc import Awaitable, Generator +from typing import Any, cast + +from ._eventloop import get_async_backend + + +class TaskInfo: + """ + Represents an asynchronous task. + + :ivar int id: the unique identifier of the task + :ivar parent_id: the identifier of the parent task, if any + :vartype parent_id: Optional[int] + :ivar str name: the description of the task (if any) + :ivar ~collections.abc.Coroutine coro: the coroutine object of the task + """ + + __slots__ = "_name", "id", "parent_id", "name", "coro" + + def __init__( + self, + id: int, + parent_id: int | None, + name: str | None, + coro: Generator[Any, Any, Any] | Awaitable[Any], + ): + func = get_current_task + self._name = f"{func.__module__}.{func.__qualname__}" + self.id: int = id + self.parent_id: int | None = parent_id + self.name: str | None = name + self.coro: Generator[Any, Any, Any] | Awaitable[Any] = coro + + def __eq__(self, other: object) -> bool: + if isinstance(other, TaskInfo): + return self.id == other.id + + return NotImplemented + + def __hash__(self) -> int: + return hash(self.id) + + def __repr__(self) -> str: + return f"{self.__class__.__name__}(id={self.id!r}, name={self.name!r})" + + def has_pending_cancellation(self) -> bool: + """ + Return ``True`` if the task has a cancellation pending, ``False`` otherwise. + + """ + return False + + +def get_current_task() -> TaskInfo: + """ + Return the current task. + + :return: a representation of the current task + :raises NoEventLoopError: if no supported asynchronous event loop is running in the + current thread + + """ + return get_async_backend().get_current_task() + + +def get_running_tasks() -> list[TaskInfo]: + """ + Return a list of running tasks in the current event loop. + + :return: a list of task info objects + :raises NoEventLoopError: if no supported asynchronous event loop is running in the + current thread + + """ + return cast("list[TaskInfo]", get_async_backend().get_running_tasks()) + + +async def wait_all_tasks_blocked() -> None: + """Wait until all other tasks are waiting for something.""" + await get_async_backend().wait_all_tasks_blocked() diff --git a/venv/lib/python3.11/site-packages/anyio/_core/_typedattr.py b/venv/lib/python3.11/site-packages/anyio/_core/_typedattr.py new file mode 100644 index 0000000..f358a44 --- /dev/null +++ b/venv/lib/python3.11/site-packages/anyio/_core/_typedattr.py @@ -0,0 +1,81 @@ +from __future__ import annotations + +from collections.abc import Callable, Mapping +from typing import Any, TypeVar, final, overload + +from ._exceptions import TypedAttributeLookupError + +T_Attr = TypeVar("T_Attr") +T_Default = TypeVar("T_Default") +undefined = object() + + +def typed_attribute() -> Any: + """Return a unique object, used to mark typed attributes.""" + return object() + + +class TypedAttributeSet: + """ + Superclass for typed attribute collections. + + Checks that every public attribute of every subclass has a type annotation. + """ + + def __init_subclass__(cls) -> None: + annotations: dict[str, Any] = getattr(cls, "__annotations__", {}) + for attrname in dir(cls): + if not attrname.startswith("_") and attrname not in annotations: + raise TypeError( + f"Attribute {attrname!r} is missing its type annotation" + ) + + super().__init_subclass__() + + +class TypedAttributeProvider: + """Base class for classes that wish to provide typed extra attributes.""" + + @property + def extra_attributes(self) -> Mapping[T_Attr, Callable[[], T_Attr]]: + """ + A mapping of the extra attributes to callables that return the corresponding + values. + + If the provider wraps another provider, the attributes from that wrapper should + also be included in the returned mapping (but the wrapper may override the + callables from the wrapped instance). + + """ + return {} + + @overload + def extra(self, attribute: T_Attr) -> T_Attr: ... + + @overload + def extra(self, attribute: T_Attr, default: T_Default) -> T_Attr | T_Default: ... + + @final + def extra(self, attribute: Any, default: object = undefined) -> object: + """ + extra(attribute, default=undefined) + + Return the value of the given typed extra attribute. + + :param attribute: the attribute (member of a :class:`~TypedAttributeSet`) to + look for + :param default: the value that should be returned if no value is found for the + attribute + :raises ~anyio.TypedAttributeLookupError: if the search failed and no default + value was given + + """ + try: + getter = self.extra_attributes[attribute] + except KeyError: + if default is undefined: + raise TypedAttributeLookupError("Attribute not found") from None + else: + return default + + return getter() diff --git a/venv/lib/python3.11/site-packages/anyio/abc/__init__.py b/venv/lib/python3.11/site-packages/anyio/abc/__init__.py new file mode 100644 index 0000000..d560ce3 --- /dev/null +++ b/venv/lib/python3.11/site-packages/anyio/abc/__init__.py @@ -0,0 +1,58 @@ +from __future__ import annotations + +from ._eventloop import AsyncBackend as AsyncBackend +from ._resources import AsyncResource as AsyncResource +from ._sockets import ConnectedUDPSocket as ConnectedUDPSocket +from ._sockets import ConnectedUNIXDatagramSocket as ConnectedUNIXDatagramSocket +from ._sockets import IPAddressType as IPAddressType +from ._sockets import IPSockAddrType as IPSockAddrType +from ._sockets import SocketAttribute as SocketAttribute +from ._sockets import SocketListener as SocketListener +from ._sockets import SocketStream as SocketStream +from ._sockets import UDPPacketType as UDPPacketType +from ._sockets import UDPSocket as UDPSocket +from ._sockets import UNIXDatagramPacketType as UNIXDatagramPacketType +from ._sockets import UNIXDatagramSocket as UNIXDatagramSocket +from ._sockets import UNIXSocketStream as UNIXSocketStream +from ._streams import AnyByteReceiveStream as AnyByteReceiveStream +from ._streams import AnyByteSendStream as AnyByteSendStream +from ._streams import AnyByteStream as AnyByteStream +from ._streams import AnyByteStreamConnectable as AnyByteStreamConnectable +from ._streams import AnyUnreliableByteReceiveStream as AnyUnreliableByteReceiveStream +from ._streams import AnyUnreliableByteSendStream as AnyUnreliableByteSendStream +from ._streams import AnyUnreliableByteStream as AnyUnreliableByteStream +from ._streams import ByteReceiveStream as ByteReceiveStream +from ._streams import ByteSendStream as ByteSendStream +from ._streams import ByteStream as ByteStream +from ._streams import ByteStreamConnectable as ByteStreamConnectable +from ._streams import Listener as Listener +from ._streams import ObjectReceiveStream as ObjectReceiveStream +from ._streams import ObjectSendStream as ObjectSendStream +from ._streams import ObjectStream as ObjectStream +from ._streams import ObjectStreamConnectable as ObjectStreamConnectable +from ._streams import UnreliableObjectReceiveStream as UnreliableObjectReceiveStream +from ._streams import UnreliableObjectSendStream as UnreliableObjectSendStream +from ._streams import UnreliableObjectStream as UnreliableObjectStream +from ._subprocesses import Process as Process +from ._tasks import TaskGroup as TaskGroup +from ._tasks import TaskStatus as TaskStatus +from ._testing import TestRunner as TestRunner + +# Re-exported here, for backwards compatibility +# isort: off +from .._core._synchronization import ( + CapacityLimiter as CapacityLimiter, + Condition as Condition, + Event as Event, + Lock as Lock, + Semaphore as Semaphore, +) +from .._core._tasks import CancelScope as CancelScope +from ..from_thread import BlockingPortal as BlockingPortal + +# Re-export imports so they look like they live directly in this package +for __value in list(locals().values()): + if getattr(__value, "__module__", "").startswith("anyio.abc."): + __value.__module__ = __name__ + +del __value diff --git a/venv/lib/python3.11/site-packages/anyio/abc/__pycache__/__init__.cpython-311.pyc b/venv/lib/python3.11/site-packages/anyio/abc/__pycache__/__init__.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..296684d2973a8b79f8d0d5200135a35be7d5c075 GIT binary patch literal 3084 zcmbuANpIUm6vu~NMD3DodEeJqUL@PGlQd4#*m2{y2ofW9+G5&*pu~yIhKn$yY$)i# z#~gY{ivsB}=pjYXOTR(C0$ms=!Bc>qax;)ikyGD{EJqXTR^sWe-@F;V8NPW#{+dWc z5nO+EALuJFg#KZT+7+sT^!Aq~gkB&GX_A3V2}=^vnzUx4$!x~WoLh_*vlX{;ZZ$%t zjAhOt;4ltzmVqNU!Z{2a#Zk@?;24f^jsnMVoO28~ffJnLz)76soB&SY6z3#x8mBp@ zfZK2z=QMCTZs*))beI{O;oJ_~i90!W0C(Xo&Kclt+|9WYxCi%e?gH+`y_~y&`*0uU z9^ii5&$$c@TI6k8mCW9>t@ahk?iN80Qh-aXij> z6nFwpa2^Am#FL!Ifv4~k=LzGIIgO_|Pa0Ws2G4Mw0-nXQoG%%3<~*JUp4PHP&dlSy zxquhUMZ9P(;U)7jzRde(jAe5LuW+6DKl9b9mfu0y zg*VKVm4cXRS+=XXx@|dc*xcZYuQ?T~xULqT5KDu0g0~+M$1c+%0Z037+pgyAxa6Ynn!hX=4n(I=%P9Z1u;Gf{Ka*4HCA&T^y{4EA(G(D%rq#L$_e(H#93MhLTYU+k{U z+tw&tk~xJ4QSPbT)cL+8t~6Y?104?v-@@*Hn2vPSEkuu>`D*dI>)YZCgYOg3IDX%U z1B98nF7(#sl((r}gtCKtM|M@`$tJbSC1^xhV+U%#%(|kx#Bm>%p|0s0c!#5GYmmCF zmeiu|R_^Jh?h+bAV8xow&Pvew=>f6apyeJ^e-POrrdry!DcjT7ZPh9gW2b0Wt9;#n zA-c7;XmML^ncGST^*gS@9muPF% z0Vjx`Lx-}DP7qccegGXRLz9M?M3}IT6@~8YMY9?4{r^PE;3Jx0WXyx1lyw;P7pd!jWTfpSy4Cz@*aWOaA^>AT$Q@cq3-U( z!W2t2+4d|!h~Lm#Q1tGL{Jw3H{2>feEj4de)=H&(K{pI|f_bx8%EKNWPt-l)51l}ZBH~`3<5D5#kuAo!5WQO@{nMSBF}k9FdyCVL~FF> z>mCx!N9&$wKDyzF)@b(6JS3QpKKDdxl%KmE60Ff&7c-ypkYGOA@I>>`j3=6pZh4~l z;)6pTd@;$8b6;E@tky@no@hS0?}^qZ^Yb1OtkDXE?StL)#m9uFJ`IPYrc?BPC5a@+ z>Po#`%*JU5r8Cdm=Xajp`Qh$QcV9gC@xgIs@+32PoSHgGO`W19sVYaCzMMQde0KPA y{AJ--&YsBGzvbn>b|wNCkilh5RnaNobLTVh9>N1JpLPT_wJs*}h7 literal 0 HcmV?d00001 diff --git a/venv/lib/python3.11/site-packages/anyio/abc/__pycache__/_eventloop.cpython-311.pyc b/venv/lib/python3.11/site-packages/anyio/abc/__pycache__/_eventloop.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..1a2ada70a9f46fa7dd66d53c87fa0a0efd284014 GIT binary patch literal 18254 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 literal 0 HcmV?d00001 diff --git a/venv/lib/python3.11/site-packages/anyio/abc/__pycache__/_resources.cpython-311.pyc b/venv/lib/python3.11/site-packages/anyio/abc/__pycache__/_resources.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..c18eb3b1b4df179316032b07212939368ed25305 GIT binary patch literal 1830 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 literal 0 HcmV?d00001 diff --git a/venv/lib/python3.11/site-packages/anyio/abc/__pycache__/_subprocesses.cpython-311.pyc b/venv/lib/python3.11/site-packages/anyio/abc/__pycache__/_subprocesses.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..ab76e5f3eaa08f0131445cf4b11069e10572a063 GIT binary patch literal 3677 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 literal 0 HcmV?d00001 diff --git a/venv/lib/python3.11/site-packages/anyio/abc/__pycache__/_testing.cpython-311.pyc b/venv/lib/python3.11/site-packages/anyio/abc/__pycache__/_testing.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..94cea807a07b99c53dd8121f770512ff04ce0281 GIT binary patch literal 3038 zcmd5;&2QX96d&)W_ah0VOFz<<30FdEWcI_r|}> z%~c6pf1KWNE|dxR3m?*}7!S0gA7Jo^*u>Uc;%SDa;W+2!j2!&t-Mm*Y3SQADD!ky9 zys}aDbVK(lM#ZZdRfQMbnpZdK-kdR~ksRT3cImN3$W!=_FJnGOZW6n^Pi&nReyu#t zgBJc1?Sh@VLz>mU@v*5zHRk(4$U-OZigi>o~Tl|Zul1K$-c`%E-9k|bdJA8`40C(>IOltMQ`kI zF`yQNfO^d4G~9*|Y;D7@BWck6mRljc?|`;1QOT8E$vpnD6$M5m!Nb1rtqFzTDvlvS z+EEDxkH`aZhdj~No*-of$=ywf6X^JEdpq!W`#uvP^I6*)toC~CF1!}Dd&RSQZP@Wn z+jY9_-T-LyKW<&U+Llhpuk@I8k8N?;X8ynl+N^7}P4E^-+-mg(QN=XDS1wF*ukj*0 ztqFPpUN0fj$&ef_oP1b2f+2}?zH6Bw5I$Z+xp9q2eq-0-Jk}}ebO~}?dBq8s@ZZVOPIpbP42;AhsD&V`5>sZ`uh?~H@iZ?+t3*sb>Pop@C z;v5Kx>ydTQfI*~#kGoC?j-Sjru0Wh3Dx+wxr!N>fX7+g~n zKgq`wQ;3zg2ts1?ASyAr4Jc((S%AQpNl5mVULtzdg!5oR72*(R9}>m*agHY~a094S zG+w4aUPshn@vAA^`*Y$*hQI$SYe-PcV8TjHK{WNaKb}EAHOWOBVW$*W2=UAdFlv?r zMc^G2xC8Mn3T5d%7^V8=3_Vr_=+)-0%+R+`U&UtZ!b zvT53ZWt!qGw1Zz;VhP1EiVsnIgaQu$l|HHyC|8xJ0WN<75f?YgQ7&K9M+8MxD>g2+M6iplyEP^#D+MVb~>;6sgB zE|aqP21aYMug)V=U;~Vbcpl3r59honU?eb3(SjAYE_|ur*Ix@&__ZPMSQk19Jm{hl zEQOvd@C#R9v{Xxr1DFl!SpOpC=u7cA%)_%-{tjZ4*EH>rTs+9$&q#f!{tn6V!L0j` u+&XyGeMpuLX5G(<_2J!z>)&_wJHy= (3, 11): + from typing import TypeVarTuple, Unpack +else: + from typing_extensions import TypeVarTuple, Unpack + +if sys.version_info >= (3, 10): + from typing import TypeAlias +else: + from typing_extensions import TypeAlias + +if TYPE_CHECKING: + from _typeshed import FileDescriptorLike + + from .._core._synchronization import CapacityLimiter, Event, Lock, Semaphore + from .._core._tasks import CancelScope + from .._core._testing import TaskInfo + from ._sockets import ( + ConnectedUDPSocket, + ConnectedUNIXDatagramSocket, + IPSockAddrType, + SocketListener, + SocketStream, + UDPSocket, + UNIXDatagramSocket, + UNIXSocketStream, + ) + from ._subprocesses import Process + from ._tasks import TaskGroup + from ._testing import TestRunner + +T_Retval = TypeVar("T_Retval") +PosArgsT = TypeVarTuple("PosArgsT") +StrOrBytesPath: TypeAlias = Union[str, bytes, "PathLike[str]", "PathLike[bytes]"] + + +class AsyncBackend(metaclass=ABCMeta): + @classmethod + @abstractmethod + def run( + cls, + func: Callable[[Unpack[PosArgsT]], Awaitable[T_Retval]], + args: tuple[Unpack[PosArgsT]], + kwargs: dict[str, Any], + options: dict[str, Any], + ) -> T_Retval: + """ + Run the given coroutine function in an asynchronous event loop. + + The current thread must not be already running an event loop. + + :param func: a coroutine function + :param args: positional arguments to ``func`` + :param kwargs: positional arguments to ``func`` + :param options: keyword arguments to call the backend ``run()`` implementation + with + :return: the return value of the coroutine function + """ + + @classmethod + @abstractmethod + def current_token(cls) -> object: + """ + Return an object that allows other threads to run code inside the event loop. + + :return: a token object, specific to the event loop running in the current + thread + """ + + @classmethod + @abstractmethod + def current_time(cls) -> float: + """ + Return the current value of the event loop's internal clock. + + :return: the clock value (seconds) + """ + + @classmethod + @abstractmethod + def cancelled_exception_class(cls) -> type[BaseException]: + """Return the exception class that is raised in a task if it's cancelled.""" + + @classmethod + @abstractmethod + async def checkpoint(cls) -> None: + """ + Check if the task has been cancelled, and allow rescheduling of other tasks. + + This is effectively the same as running :meth:`checkpoint_if_cancelled` and then + :meth:`cancel_shielded_checkpoint`. + """ + + @classmethod + async def checkpoint_if_cancelled(cls) -> None: + """ + Check if the current task group has been cancelled. + + This will check if the task has been cancelled, but will not allow other tasks + to be scheduled if not. + + """ + if cls.current_effective_deadline() == -math.inf: + await cls.checkpoint() + + @classmethod + async def cancel_shielded_checkpoint(cls) -> None: + """ + Allow the rescheduling of other tasks. + + This will give other tasks the opportunity to run, but without checking if the + current task group has been cancelled, unlike with :meth:`checkpoint`. + + """ + with cls.create_cancel_scope(shield=True): + await cls.sleep(0) + + @classmethod + @abstractmethod + async def sleep(cls, delay: float) -> None: + """ + Pause the current task for the specified duration. + + :param delay: the duration, in seconds + """ + + @classmethod + @abstractmethod + def create_cancel_scope( + cls, *, deadline: float = math.inf, shield: bool = False + ) -> CancelScope: + pass + + @classmethod + @abstractmethod + def current_effective_deadline(cls) -> float: + """ + Return the nearest deadline among all the cancel scopes effective for the + current task. + + :return: + - a clock value from the event loop's internal clock + - ``inf`` if there is no deadline in effect + - ``-inf`` if the current scope has been cancelled + :rtype: float + """ + + @classmethod + @abstractmethod + def create_task_group(cls) -> TaskGroup: + pass + + @classmethod + @abstractmethod + def create_event(cls) -> Event: + pass + + @classmethod + @abstractmethod + def create_lock(cls, *, fast_acquire: bool) -> Lock: + pass + + @classmethod + @abstractmethod + def create_semaphore( + cls, + initial_value: int, + *, + max_value: int | None = None, + fast_acquire: bool = False, + ) -> Semaphore: + pass + + @classmethod + @abstractmethod + def create_capacity_limiter(cls, total_tokens: float) -> CapacityLimiter: + pass + + @classmethod + @abstractmethod + async def run_sync_in_worker_thread( + cls, + func: Callable[[Unpack[PosArgsT]], T_Retval], + args: tuple[Unpack[PosArgsT]], + abandon_on_cancel: bool = False, + limiter: CapacityLimiter | None = None, + ) -> T_Retval: + pass + + @classmethod + @abstractmethod + def check_cancelled(cls) -> None: + pass + + @classmethod + @abstractmethod + def run_async_from_thread( + cls, + func: Callable[[Unpack[PosArgsT]], Awaitable[T_Retval]], + args: tuple[Unpack[PosArgsT]], + token: object, + ) -> T_Retval: + pass + + @classmethod + @abstractmethod + def run_sync_from_thread( + cls, + func: Callable[[Unpack[PosArgsT]], T_Retval], + args: tuple[Unpack[PosArgsT]], + token: object, + ) -> T_Retval: + pass + + @classmethod + @abstractmethod + async def open_process( + cls, + command: StrOrBytesPath | Sequence[StrOrBytesPath], + *, + stdin: int | IO[Any] | None, + stdout: int | IO[Any] | None, + stderr: int | IO[Any] | None, + **kwargs: Any, + ) -> Process: + pass + + @classmethod + @abstractmethod + def setup_process_pool_exit_at_shutdown(cls, workers: set[Process]) -> None: + pass + + @classmethod + @abstractmethod + async def connect_tcp( + cls, host: str, port: int, local_address: IPSockAddrType | None = None + ) -> SocketStream: + pass + + @classmethod + @abstractmethod + async def connect_unix(cls, path: str | bytes) -> UNIXSocketStream: + pass + + @classmethod + @abstractmethod + def create_tcp_listener(cls, sock: socket) -> SocketListener: + pass + + @classmethod + @abstractmethod + def create_unix_listener(cls, sock: socket) -> SocketListener: + pass + + @classmethod + @abstractmethod + async def create_udp_socket( + cls, + family: AddressFamily, + local_address: IPSockAddrType | None, + remote_address: IPSockAddrType | None, + reuse_port: bool, + ) -> UDPSocket | ConnectedUDPSocket: + pass + + @classmethod + @overload + async def create_unix_datagram_socket( + cls, raw_socket: socket, remote_path: None + ) -> UNIXDatagramSocket: ... + + @classmethod + @overload + async def create_unix_datagram_socket( + cls, raw_socket: socket, remote_path: str | bytes + ) -> ConnectedUNIXDatagramSocket: ... + + @classmethod + @abstractmethod + async def create_unix_datagram_socket( + cls, raw_socket: socket, remote_path: str | bytes | None + ) -> UNIXDatagramSocket | ConnectedUNIXDatagramSocket: + pass + + @classmethod + @abstractmethod + async def getaddrinfo( + cls, + host: bytes | str | None, + port: str | int | None, + *, + family: int | AddressFamily = 0, + type: int | SocketKind = 0, + proto: int = 0, + flags: int = 0, + ) -> Sequence[ + tuple[ + AddressFamily, + SocketKind, + int, + str, + tuple[str, int] | tuple[str, int, int, int] | tuple[int, bytes], + ] + ]: + pass + + @classmethod + @abstractmethod + async def getnameinfo( + cls, sockaddr: IPSockAddrType, flags: int = 0 + ) -> tuple[str, str]: + pass + + @classmethod + @abstractmethod + async def wait_readable(cls, obj: FileDescriptorLike) -> None: + pass + + @classmethod + @abstractmethod + async def wait_writable(cls, obj: FileDescriptorLike) -> None: + pass + + @classmethod + @abstractmethod + def notify_closing(cls, obj: FileDescriptorLike) -> None: + pass + + @classmethod + @abstractmethod + async def wrap_listener_socket(cls, sock: socket) -> SocketListener: + pass + + @classmethod + @abstractmethod + async def wrap_stream_socket(cls, sock: socket) -> SocketStream: + pass + + @classmethod + @abstractmethod + async def wrap_unix_stream_socket(cls, sock: socket) -> UNIXSocketStream: + pass + + @classmethod + @abstractmethod + async def wrap_udp_socket(cls, sock: socket) -> UDPSocket: + pass + + @classmethod + @abstractmethod + async def wrap_connected_udp_socket(cls, sock: socket) -> ConnectedUDPSocket: + pass + + @classmethod + @abstractmethod + async def wrap_unix_datagram_socket(cls, sock: socket) -> UNIXDatagramSocket: + pass + + @classmethod + @abstractmethod + async def wrap_connected_unix_datagram_socket( + cls, sock: socket + ) -> ConnectedUNIXDatagramSocket: + pass + + @classmethod + @abstractmethod + def current_default_thread_limiter(cls) -> CapacityLimiter: + pass + + @classmethod + @abstractmethod + def open_signal_receiver( + cls, *signals: Signals + ) -> AbstractContextManager[AsyncIterator[Signals]]: + pass + + @classmethod + @abstractmethod + def get_current_task(cls) -> TaskInfo: + pass + + @classmethod + @abstractmethod + def get_running_tasks(cls) -> Sequence[TaskInfo]: + pass + + @classmethod + @abstractmethod + async def wait_all_tasks_blocked(cls) -> None: + pass + + @classmethod + @abstractmethod + def create_test_runner(cls, options: dict[str, Any]) -> TestRunner: + pass diff --git a/venv/lib/python3.11/site-packages/anyio/abc/_resources.py b/venv/lib/python3.11/site-packages/anyio/abc/_resources.py new file mode 100644 index 0000000..10df115 --- /dev/null +++ b/venv/lib/python3.11/site-packages/anyio/abc/_resources.py @@ -0,0 +1,33 @@ +from __future__ import annotations + +from abc import ABCMeta, abstractmethod +from types import TracebackType +from typing import TypeVar + +T = TypeVar("T") + + +class AsyncResource(metaclass=ABCMeta): + """ + Abstract base class for all closeable asynchronous resources. + + Works as an asynchronous context manager which returns the instance itself on enter, + and calls :meth:`aclose` on exit. + """ + + __slots__ = () + + async def __aenter__(self: T) -> T: + return self + + async def __aexit__( + self, + exc_type: type[BaseException] | None, + exc_val: BaseException | None, + exc_tb: TracebackType | None, + ) -> None: + await self.aclose() + + @abstractmethod + async def aclose(self) -> None: + """Close the resource.""" diff --git a/venv/lib/python3.11/site-packages/anyio/abc/_sockets.py b/venv/lib/python3.11/site-packages/anyio/abc/_sockets.py new file mode 100644 index 0000000..3ff60d4 --- /dev/null +++ b/venv/lib/python3.11/site-packages/anyio/abc/_sockets.py @@ -0,0 +1,405 @@ +from __future__ import annotations + +import errno +import socket +import sys +from abc import abstractmethod +from collections.abc import Callable, Collection, Mapping +from contextlib import AsyncExitStack +from io import IOBase +from ipaddress import IPv4Address, IPv6Address +from socket import AddressFamily +from typing import Any, TypeVar, Union + +from .._core._eventloop import get_async_backend +from .._core._typedattr import ( + TypedAttributeProvider, + TypedAttributeSet, + typed_attribute, +) +from ._streams import ByteStream, Listener, UnreliableObjectStream +from ._tasks import TaskGroup + +if sys.version_info >= (3, 10): + from typing import TypeAlias +else: + from typing_extensions import TypeAlias + +IPAddressType: TypeAlias = Union[str, IPv4Address, IPv6Address] +IPSockAddrType: TypeAlias = tuple[str, int] +SockAddrType: TypeAlias = Union[IPSockAddrType, str] +UDPPacketType: TypeAlias = tuple[bytes, IPSockAddrType] +UNIXDatagramPacketType: TypeAlias = tuple[bytes, str] +T_Retval = TypeVar("T_Retval") + + +def _validate_socket( + sock_or_fd: socket.socket | int, + sock_type: socket.SocketKind, + addr_family: socket.AddressFamily = socket.AF_UNSPEC, + *, + require_connected: bool = False, + require_bound: bool = False, +) -> socket.socket: + if isinstance(sock_or_fd, int): + try: + sock = socket.socket(fileno=sock_or_fd) + except OSError as exc: + if exc.errno == errno.ENOTSOCK: + raise ValueError( + "the file descriptor does not refer to a socket" + ) from exc + elif require_connected: + raise ValueError("the socket must be connected") from exc + elif require_bound: + raise ValueError("the socket must be bound to a local address") from exc + else: + raise + elif isinstance(sock_or_fd, socket.socket): + sock = sock_or_fd + else: + raise TypeError( + f"expected an int or socket, got {type(sock_or_fd).__qualname__} instead" + ) + + try: + if require_connected: + try: + sock.getpeername() + except OSError as exc: + raise ValueError("the socket must be connected") from exc + + if require_bound: + try: + if sock.family in (socket.AF_INET, socket.AF_INET6): + bound_addr = sock.getsockname()[1] + else: + bound_addr = sock.getsockname() + except OSError: + bound_addr = None + + if not bound_addr: + raise ValueError("the socket must be bound to a local address") + + if addr_family != socket.AF_UNSPEC and sock.family != addr_family: + raise ValueError( + f"address family mismatch: expected {addr_family.name}, got " + f"{sock.family.name}" + ) + + if sock.type != sock_type: + raise ValueError( + f"socket type mismatch: expected {sock_type.name}, got {sock.type.name}" + ) + except BaseException: + # Avoid ResourceWarning from the locally constructed socket object + if isinstance(sock_or_fd, int): + sock.detach() + + raise + + sock.setblocking(False) + return sock + + +class SocketAttribute(TypedAttributeSet): + """ + .. attribute:: family + :type: socket.AddressFamily + + the address family of the underlying socket + + .. attribute:: local_address + :type: tuple[str, int] | str + + the local address the underlying socket is connected to + + .. attribute:: local_port + :type: int + + for IP based sockets, the local port the underlying socket is bound to + + .. attribute:: raw_socket + :type: socket.socket + + the underlying stdlib socket object + + .. attribute:: remote_address + :type: tuple[str, int] | str + + the remote address the underlying socket is connected to + + .. attribute:: remote_port + :type: int + + for IP based sockets, the remote port the underlying socket is connected to + """ + + family: AddressFamily = typed_attribute() + local_address: SockAddrType = typed_attribute() + local_port: int = typed_attribute() + raw_socket: socket.socket = typed_attribute() + remote_address: SockAddrType = typed_attribute() + remote_port: int = typed_attribute() + + +class _SocketProvider(TypedAttributeProvider): + @property + def extra_attributes(self) -> Mapping[Any, Callable[[], Any]]: + from .._core._sockets import convert_ipv6_sockaddr as convert + + attributes: dict[Any, Callable[[], Any]] = { + SocketAttribute.family: lambda: self._raw_socket.family, + SocketAttribute.local_address: lambda: convert( + self._raw_socket.getsockname() + ), + SocketAttribute.raw_socket: lambda: self._raw_socket, + } + try: + peername: tuple[str, int] | None = convert(self._raw_socket.getpeername()) + except OSError: + peername = None + + # Provide the remote address for connected sockets + if peername is not None: + attributes[SocketAttribute.remote_address] = lambda: peername + + # Provide local and remote ports for IP based sockets + if self._raw_socket.family in (AddressFamily.AF_INET, AddressFamily.AF_INET6): + attributes[SocketAttribute.local_port] = ( + lambda: self._raw_socket.getsockname()[1] + ) + if peername is not None: + remote_port = peername[1] + attributes[SocketAttribute.remote_port] = lambda: remote_port + + return attributes + + @property + @abstractmethod + def _raw_socket(self) -> socket.socket: + pass + + +class SocketStream(ByteStream, _SocketProvider): + """ + Transports bytes over a socket. + + Supports all relevant extra attributes from :class:`~SocketAttribute`. + """ + + @classmethod + async def from_socket(cls, sock_or_fd: socket.socket | int) -> SocketStream: + """ + Wrap an existing socket object or file descriptor as a socket stream. + + The newly created socket wrapper takes ownership of the socket being passed in. + The existing socket must already be connected. + + :param sock_or_fd: a socket object or file descriptor + :return: a socket stream + + """ + sock = _validate_socket(sock_or_fd, socket.SOCK_STREAM, require_connected=True) + return await get_async_backend().wrap_stream_socket(sock) + + +class UNIXSocketStream(SocketStream): + @classmethod + async def from_socket(cls, sock_or_fd: socket.socket | int) -> UNIXSocketStream: + """ + Wrap an existing socket object or file descriptor as a UNIX socket stream. + + The newly created socket wrapper takes ownership of the socket being passed in. + The existing socket must already be connected. + + :param sock_or_fd: a socket object or file descriptor + :return: a UNIX socket stream + + """ + sock = _validate_socket( + sock_or_fd, socket.SOCK_STREAM, socket.AF_UNIX, require_connected=True + ) + return await get_async_backend().wrap_unix_stream_socket(sock) + + @abstractmethod + async def send_fds(self, message: bytes, fds: Collection[int | IOBase]) -> None: + """ + Send file descriptors along with a message to the peer. + + :param message: a non-empty bytestring + :param fds: a collection of files (either numeric file descriptors or open file + or socket objects) + """ + + @abstractmethod + async def receive_fds(self, msglen: int, maxfds: int) -> tuple[bytes, list[int]]: + """ + Receive file descriptors along with a message from the peer. + + :param msglen: length of the message to expect from the peer + :param maxfds: maximum number of file descriptors to expect from the peer + :return: a tuple of (message, file descriptors) + """ + + +class SocketListener(Listener[SocketStream], _SocketProvider): + """ + Listens to incoming socket connections. + + Supports all relevant extra attributes from :class:`~SocketAttribute`. + """ + + @classmethod + async def from_socket( + cls, + sock_or_fd: socket.socket | int, + ) -> SocketListener: + """ + Wrap an existing socket object or file descriptor as a socket listener. + + The newly created listener takes ownership of the socket being passed in. + + :param sock_or_fd: a socket object or file descriptor + :return: a socket listener + + """ + sock = _validate_socket(sock_or_fd, socket.SOCK_STREAM, require_bound=True) + return await get_async_backend().wrap_listener_socket(sock) + + @abstractmethod + async def accept(self) -> SocketStream: + """Accept an incoming connection.""" + + async def serve( + self, + handler: Callable[[SocketStream], Any], + task_group: TaskGroup | None = None, + ) -> None: + from .. import create_task_group + + async with AsyncExitStack() as stack: + if task_group is None: + task_group = await stack.enter_async_context(create_task_group()) + + while True: + stream = await self.accept() + task_group.start_soon(handler, stream) + + +class UDPSocket(UnreliableObjectStream[UDPPacketType], _SocketProvider): + """ + Represents an unconnected UDP socket. + + Supports all relevant extra attributes from :class:`~SocketAttribute`. + """ + + @classmethod + async def from_socket(cls, sock_or_fd: socket.socket | int) -> UDPSocket: + """ + Wrap an existing socket object or file descriptor as a UDP socket. + + The newly created socket wrapper takes ownership of the socket being passed in. + The existing socket must be bound to a local address. + + :param sock_or_fd: a socket object or file descriptor + :return: a UDP socket + + """ + sock = _validate_socket(sock_or_fd, socket.SOCK_DGRAM, require_bound=True) + return await get_async_backend().wrap_udp_socket(sock) + + async def sendto(self, data: bytes, host: str, port: int) -> None: + """ + Alias for :meth:`~.UnreliableObjectSendStream.send` ((data, (host, port))). + + """ + return await self.send((data, (host, port))) + + +class ConnectedUDPSocket(UnreliableObjectStream[bytes], _SocketProvider): + """ + Represents an connected UDP socket. + + Supports all relevant extra attributes from :class:`~SocketAttribute`. + """ + + @classmethod + async def from_socket(cls, sock_or_fd: socket.socket | int) -> ConnectedUDPSocket: + """ + Wrap an existing socket object or file descriptor as a connected UDP socket. + + The newly created socket wrapper takes ownership of the socket being passed in. + The existing socket must already be connected. + + :param sock_or_fd: a socket object or file descriptor + :return: a connected UDP socket + + """ + sock = _validate_socket( + sock_or_fd, + socket.SOCK_DGRAM, + require_connected=True, + ) + return await get_async_backend().wrap_connected_udp_socket(sock) + + +class UNIXDatagramSocket( + UnreliableObjectStream[UNIXDatagramPacketType], _SocketProvider +): + """ + Represents an unconnected Unix datagram socket. + + Supports all relevant extra attributes from :class:`~SocketAttribute`. + """ + + @classmethod + async def from_socket( + cls, + sock_or_fd: socket.socket | int, + ) -> UNIXDatagramSocket: + """ + Wrap an existing socket object or file descriptor as a UNIX datagram + socket. + + The newly created socket wrapper takes ownership of the socket being passed in. + + :param sock_or_fd: a socket object or file descriptor + :return: a UNIX datagram socket + + """ + sock = _validate_socket(sock_or_fd, socket.SOCK_DGRAM, socket.AF_UNIX) + return await get_async_backend().wrap_unix_datagram_socket(sock) + + async def sendto(self, data: bytes, path: str) -> None: + """Alias for :meth:`~.UnreliableObjectSendStream.send` ((data, path)).""" + return await self.send((data, path)) + + +class ConnectedUNIXDatagramSocket(UnreliableObjectStream[bytes], _SocketProvider): + """ + Represents a connected Unix datagram socket. + + Supports all relevant extra attributes from :class:`~SocketAttribute`. + """ + + @classmethod + async def from_socket( + cls, + sock_or_fd: socket.socket | int, + ) -> ConnectedUNIXDatagramSocket: + """ + Wrap an existing socket object or file descriptor as a connected UNIX datagram + socket. + + The newly created socket wrapper takes ownership of the socket being passed in. + The existing socket must already be connected. + + :param sock_or_fd: a socket object or file descriptor + :return: a connected UNIX datagram socket + + """ + sock = _validate_socket( + sock_or_fd, socket.SOCK_DGRAM, socket.AF_UNIX, require_connected=True + ) + return await get_async_backend().wrap_connected_unix_datagram_socket(sock) diff --git a/venv/lib/python3.11/site-packages/anyio/abc/_streams.py b/venv/lib/python3.11/site-packages/anyio/abc/_streams.py new file mode 100644 index 0000000..369df3f --- /dev/null +++ b/venv/lib/python3.11/site-packages/anyio/abc/_streams.py @@ -0,0 +1,239 @@ +from __future__ import annotations + +import sys +from abc import ABCMeta, abstractmethod +from collections.abc import Callable +from typing import Any, Generic, TypeVar, Union + +from .._core._exceptions import EndOfStream +from .._core._typedattr import TypedAttributeProvider +from ._resources import AsyncResource +from ._tasks import TaskGroup + +if sys.version_info >= (3, 10): + from typing import TypeAlias +else: + from typing_extensions import TypeAlias + +T_Item = TypeVar("T_Item") +T_co = TypeVar("T_co", covariant=True) +T_contra = TypeVar("T_contra", contravariant=True) + + +class UnreliableObjectReceiveStream( + Generic[T_co], AsyncResource, TypedAttributeProvider +): + """ + An interface for receiving objects. + + This interface makes no guarantees that the received messages arrive in the order in + which they were sent, or that no messages are missed. + + Asynchronously iterating over objects of this type will yield objects matching the + given type parameter. + """ + + def __aiter__(self) -> UnreliableObjectReceiveStream[T_co]: + return self + + async def __anext__(self) -> T_co: + try: + return await self.receive() + except EndOfStream: + raise StopAsyncIteration from None + + @abstractmethod + async def receive(self) -> T_co: + """ + Receive the next item. + + :raises ~anyio.ClosedResourceError: if the receive stream has been explicitly + closed + :raises ~anyio.EndOfStream: if this stream has been closed from the other end + :raises ~anyio.BrokenResourceError: if this stream has been rendered unusable + due to external causes + """ + + +class UnreliableObjectSendStream( + Generic[T_contra], AsyncResource, TypedAttributeProvider +): + """ + An interface for sending objects. + + This interface makes no guarantees that the messages sent will reach the + recipient(s) in the same order in which they were sent, or at all. + """ + + @abstractmethod + async def send(self, item: T_contra) -> None: + """ + Send an item to the peer(s). + + :param item: the item to send + :raises ~anyio.ClosedResourceError: if the send stream has been explicitly + closed + :raises ~anyio.BrokenResourceError: if this stream has been rendered unusable + due to external causes + """ + + +class UnreliableObjectStream( + UnreliableObjectReceiveStream[T_Item], UnreliableObjectSendStream[T_Item] +): + """ + A bidirectional message stream which does not guarantee the order or reliability of + message delivery. + """ + + +class ObjectReceiveStream(UnreliableObjectReceiveStream[T_co]): + """ + A receive message stream which guarantees that messages are received in the same + order in which they were sent, and that no messages are missed. + """ + + +class ObjectSendStream(UnreliableObjectSendStream[T_contra]): + """ + A send message stream which guarantees that messages are delivered in the same order + in which they were sent, without missing any messages in the middle. + """ + + +class ObjectStream( + ObjectReceiveStream[T_Item], + ObjectSendStream[T_Item], + UnreliableObjectStream[T_Item], +): + """ + A bidirectional message stream which guarantees the order and reliability of message + delivery. + """ + + @abstractmethod + async def send_eof(self) -> None: + """ + Send an end-of-file indication to the peer. + + You should not try to send any further data to this stream after calling this + method. This method is idempotent (does nothing on successive calls). + """ + + +class ByteReceiveStream(AsyncResource, TypedAttributeProvider): + """ + An interface for receiving bytes from a single peer. + + Iterating this byte stream will yield a byte string of arbitrary length, but no more + than 65536 bytes. + """ + + def __aiter__(self) -> ByteReceiveStream: + return self + + async def __anext__(self) -> bytes: + try: + return await self.receive() + except EndOfStream: + raise StopAsyncIteration from None + + @abstractmethod + async def receive(self, max_bytes: int = 65536) -> bytes: + """ + Receive at most ``max_bytes`` bytes from the peer. + + .. note:: Implementers of this interface should not return an empty + :class:`bytes` object, and users should ignore them. + + :param max_bytes: maximum number of bytes to receive + :return: the received bytes + :raises ~anyio.EndOfStream: if this stream has been closed from the other end + """ + + +class ByteSendStream(AsyncResource, TypedAttributeProvider): + """An interface for sending bytes to a single peer.""" + + @abstractmethod + async def send(self, item: bytes) -> None: + """ + Send the given bytes to the peer. + + :param item: the bytes to send + """ + + +class ByteStream(ByteReceiveStream, ByteSendStream): + """A bidirectional byte stream.""" + + @abstractmethod + async def send_eof(self) -> None: + """ + Send an end-of-file indication to the peer. + + You should not try to send any further data to this stream after calling this + method. This method is idempotent (does nothing on successive calls). + """ + + +#: Type alias for all unreliable bytes-oriented receive streams. +AnyUnreliableByteReceiveStream: TypeAlias = Union[ + UnreliableObjectReceiveStream[bytes], ByteReceiveStream +] +#: Type alias for all unreliable bytes-oriented send streams. +AnyUnreliableByteSendStream: TypeAlias = Union[ + UnreliableObjectSendStream[bytes], ByteSendStream +] +#: Type alias for all unreliable bytes-oriented streams. +AnyUnreliableByteStream: TypeAlias = Union[UnreliableObjectStream[bytes], ByteStream] +#: Type alias for all bytes-oriented receive streams. +AnyByteReceiveStream: TypeAlias = Union[ObjectReceiveStream[bytes], ByteReceiveStream] +#: Type alias for all bytes-oriented send streams. +AnyByteSendStream: TypeAlias = Union[ObjectSendStream[bytes], ByteSendStream] +#: Type alias for all bytes-oriented streams. +AnyByteStream: TypeAlias = Union[ObjectStream[bytes], ByteStream] + + +class Listener(Generic[T_co], AsyncResource, TypedAttributeProvider): + """An interface for objects that let you accept incoming connections.""" + + @abstractmethod + async def serve( + self, handler: Callable[[T_co], Any], task_group: TaskGroup | None = None + ) -> None: + """ + Accept incoming connections as they come in and start tasks to handle them. + + :param handler: a callable that will be used to handle each accepted connection + :param task_group: the task group that will be used to start tasks for handling + each accepted connection (if omitted, an ad-hoc task group will be created) + """ + + +class ObjectStreamConnectable(Generic[T_co], metaclass=ABCMeta): + @abstractmethod + async def connect(self) -> ObjectStream[T_co]: + """ + Connect to the remote endpoint. + + :return: an object stream connected to the remote end + :raises ConnectionFailed: if the connection fails + """ + + +class ByteStreamConnectable(metaclass=ABCMeta): + @abstractmethod + async def connect(self) -> ByteStream: + """ + Connect to the remote endpoint. + + :return: a bytestream connected to the remote end + :raises ConnectionFailed: if the connection fails + """ + + +#: Type alias for all connectables returning bytestreams or bytes-oriented object streams +AnyByteStreamConnectable: TypeAlias = Union[ + ObjectStreamConnectable[bytes], ByteStreamConnectable +] diff --git a/venv/lib/python3.11/site-packages/anyio/abc/_subprocesses.py b/venv/lib/python3.11/site-packages/anyio/abc/_subprocesses.py new file mode 100644 index 0000000..ce0564c --- /dev/null +++ b/venv/lib/python3.11/site-packages/anyio/abc/_subprocesses.py @@ -0,0 +1,79 @@ +from __future__ import annotations + +from abc import abstractmethod +from signal import Signals + +from ._resources import AsyncResource +from ._streams import ByteReceiveStream, ByteSendStream + + +class Process(AsyncResource): + """An asynchronous version of :class:`subprocess.Popen`.""" + + @abstractmethod + async def wait(self) -> int: + """ + Wait until the process exits. + + :return: the exit code of the process + """ + + @abstractmethod + def terminate(self) -> None: + """ + Terminates the process, gracefully if possible. + + On Windows, this calls ``TerminateProcess()``. + On POSIX systems, this sends ``SIGTERM`` to the process. + + .. seealso:: :meth:`subprocess.Popen.terminate` + """ + + @abstractmethod + def kill(self) -> None: + """ + Kills the process. + + On Windows, this calls ``TerminateProcess()``. + On POSIX systems, this sends ``SIGKILL`` to the process. + + .. seealso:: :meth:`subprocess.Popen.kill` + """ + + @abstractmethod + def send_signal(self, signal: Signals) -> None: + """ + Send a signal to the subprocess. + + .. seealso:: :meth:`subprocess.Popen.send_signal` + + :param signal: the signal number (e.g. :data:`signal.SIGHUP`) + """ + + @property + @abstractmethod + def pid(self) -> int: + """The process ID of the process.""" + + @property + @abstractmethod + def returncode(self) -> int | None: + """ + The return code of the process. If the process has not yet terminated, this will + be ``None``. + """ + + @property + @abstractmethod + def stdin(self) -> ByteSendStream | None: + """The stream for the standard input of the process.""" + + @property + @abstractmethod + def stdout(self) -> ByteReceiveStream | None: + """The stream for the standard output of the process.""" + + @property + @abstractmethod + def stderr(self) -> ByteReceiveStream | None: + """The stream for the standard error output of the process.""" diff --git a/venv/lib/python3.11/site-packages/anyio/abc/_tasks.py b/venv/lib/python3.11/site-packages/anyio/abc/_tasks.py new file mode 100644 index 0000000..516b3ec --- /dev/null +++ b/venv/lib/python3.11/site-packages/anyio/abc/_tasks.py @@ -0,0 +1,117 @@ +from __future__ import annotations + +import sys +from abc import ABCMeta, abstractmethod +from collections.abc import Awaitable, Callable +from types import TracebackType +from typing import TYPE_CHECKING, Any, Protocol, overload + +if sys.version_info >= (3, 13): + from typing import TypeVar +else: + from typing_extensions import TypeVar + +if sys.version_info >= (3, 11): + from typing import TypeVarTuple, Unpack +else: + from typing_extensions import TypeVarTuple, Unpack + +if TYPE_CHECKING: + from .._core._tasks import CancelScope + +T_Retval = TypeVar("T_Retval") +T_contra = TypeVar("T_contra", contravariant=True, default=None) +PosArgsT = TypeVarTuple("PosArgsT") + + +class TaskStatus(Protocol[T_contra]): + @overload + def started(self: TaskStatus[None]) -> None: ... + + @overload + def started(self, value: T_contra) -> None: ... + + def started(self, value: T_contra | None = None) -> None: + """ + Signal that the task has started. + + :param value: object passed back to the starter of the task + """ + + +class TaskGroup(metaclass=ABCMeta): + """ + Groups several asynchronous tasks together. + + :ivar cancel_scope: the cancel scope inherited by all child tasks + :vartype cancel_scope: CancelScope + + .. note:: On asyncio, support for eager task factories is considered to be + **experimental**. In particular, they don't follow the usual semantics of new + tasks being scheduled on the next iteration of the event loop, and may thus + cause unexpected behavior in code that wasn't written with such semantics in + mind. + """ + + cancel_scope: CancelScope + + @abstractmethod + def start_soon( + self, + func: Callable[[Unpack[PosArgsT]], Awaitable[Any]], + *args: Unpack[PosArgsT], + name: object = None, + ) -> None: + """ + Start a new task in this task group. + + :param func: a coroutine function + :param args: positional arguments to call the function with + :param name: name of the task, for the purposes of introspection and debugging + + .. versionadded:: 3.0 + """ + + @abstractmethod + async def start( + self, + func: Callable[..., Awaitable[Any]], + *args: object, + name: object = None, + ) -> Any: + """ + Start a new task and wait until it signals for readiness. + + The target callable must accept a keyword argument ``task_status`` (of type + :class:`TaskStatus`). Awaiting on this method will return whatever was passed to + ``task_status.started()`` (``None`` by default). + + .. note:: The :class:`TaskStatus` class is generic, and the type argument should + indicate the type of the value that will be passed to + ``task_status.started()``. + + :param func: a coroutine function that accepts the ``task_status`` keyword + argument + :param args: positional arguments to call the function with + :param name: an optional name for the task, for introspection and debugging + :return: the value passed to ``task_status.started()`` + :raises RuntimeError: if the task finishes without calling + ``task_status.started()`` + + .. seealso:: :ref:`start_initialize` + + .. versionadded:: 3.0 + """ + + @abstractmethod + async def __aenter__(self) -> TaskGroup: + """Enter the task group context and allow starting new tasks.""" + + @abstractmethod + async def __aexit__( + self, + exc_type: type[BaseException] | None, + exc_val: BaseException | None, + exc_tb: TracebackType | None, + ) -> bool: + """Exit the task group context waiting for all tasks to finish.""" diff --git a/venv/lib/python3.11/site-packages/anyio/abc/_testing.py b/venv/lib/python3.11/site-packages/anyio/abc/_testing.py new file mode 100644 index 0000000..7c50ed7 --- /dev/null +++ b/venv/lib/python3.11/site-packages/anyio/abc/_testing.py @@ -0,0 +1,65 @@ +from __future__ import annotations + +import types +from abc import ABCMeta, abstractmethod +from collections.abc import AsyncGenerator, Callable, Coroutine, Iterable +from typing import Any, TypeVar + +_T = TypeVar("_T") + + +class TestRunner(metaclass=ABCMeta): + """ + Encapsulates a running event loop. Every call made through this object will use the + same event loop. + """ + + def __enter__(self) -> TestRunner: + return self + + @abstractmethod + def __exit__( + self, + exc_type: type[BaseException] | None, + exc_val: BaseException | None, + exc_tb: types.TracebackType | None, + ) -> bool | None: ... + + @abstractmethod + def run_asyncgen_fixture( + self, + fixture_func: Callable[..., AsyncGenerator[_T, Any]], + kwargs: dict[str, Any], + ) -> Iterable[_T]: + """ + Run an async generator fixture. + + :param fixture_func: the fixture function + :param kwargs: keyword arguments to call the fixture function with + :return: an iterator yielding the value yielded from the async generator + """ + + @abstractmethod + def run_fixture( + self, + fixture_func: Callable[..., Coroutine[Any, Any, _T]], + kwargs: dict[str, Any], + ) -> _T: + """ + Run an async fixture. + + :param fixture_func: the fixture function + :param kwargs: keyword arguments to call the fixture function with + :return: the return value of the fixture function + """ + + @abstractmethod + def run_test( + self, test_func: Callable[..., Coroutine[Any, Any, Any]], kwargs: dict[str, Any] + ) -> None: + """ + Run an async test function. + + :param test_func: the test function + :param kwargs: keyword arguments to call the test function with + """ diff --git a/venv/lib/python3.11/site-packages/anyio/from_thread.py b/venv/lib/python3.11/site-packages/anyio/from_thread.py new file mode 100644 index 0000000..837de5e --- /dev/null +++ b/venv/lib/python3.11/site-packages/anyio/from_thread.py @@ -0,0 +1,578 @@ +from __future__ import annotations + +__all__ = ( + "BlockingPortal", + "BlockingPortalProvider", + "check_cancelled", + "run", + "run_sync", + "start_blocking_portal", +) + +import sys +from collections.abc import Awaitable, Callable, Generator +from concurrent.futures import Future +from contextlib import ( + AbstractAsyncContextManager, + AbstractContextManager, + contextmanager, +) +from dataclasses import dataclass, field +from functools import partial +from inspect import isawaitable +from threading import Lock, Thread, current_thread, get_ident +from types import TracebackType +from typing import ( + Any, + Generic, + TypeVar, + cast, + overload, +) + +from ._core._eventloop import ( + get_cancelled_exc_class, + threadlocals, +) +from ._core._eventloop import run as run_eventloop +from ._core._exceptions import NoEventLoopError +from ._core._synchronization import Event +from ._core._tasks import CancelScope, create_task_group +from .abc._tasks import TaskStatus +from .lowlevel import EventLoopToken, current_token + +if sys.version_info >= (3, 11): + from typing import TypeVarTuple, Unpack +else: + from typing_extensions import TypeVarTuple, Unpack + +T_Retval = TypeVar("T_Retval") +T_co = TypeVar("T_co", covariant=True) +PosArgsT = TypeVarTuple("PosArgsT") + + +def _token_or_error(token: EventLoopToken | None) -> EventLoopToken: + if token is not None: + return token + + try: + return threadlocals.current_token + except AttributeError: + raise NoEventLoopError( + "Not running inside an AnyIO worker thread, and no event loop token was " + "provided" + ) from None + + +def run( + func: Callable[[Unpack[PosArgsT]], Awaitable[T_Retval]], + *args: Unpack[PosArgsT], + token: EventLoopToken | None = None, +) -> T_Retval: + """ + Call a coroutine function from a worker thread. + + :param func: a coroutine function + :param args: positional arguments for the callable + :param token: an event loop token to use to get back to the event loop thread + (required if calling this function from outside an AnyIO worker thread) + :return: the return value of the coroutine function + :raises MissingTokenError: if no token was provided and called from outside an + AnyIO worker thread + :raises RunFinishedError: if the event loop tied to ``token`` is no longer running + + .. versionchanged:: 4.11.0 + Added the ``token`` parameter. + + """ + explicit_token = token is not None + token = _token_or_error(token) + return token.backend_class.run_async_from_thread( + func, args, token=token.native_token if explicit_token else None + ) + + +def run_sync( + func: Callable[[Unpack[PosArgsT]], T_Retval], + *args: Unpack[PosArgsT], + token: EventLoopToken | None = None, +) -> T_Retval: + """ + Call a function in the event loop thread from a worker thread. + + :param func: a callable + :param args: positional arguments for the callable + :param token: an event loop token to use to get back to the event loop thread + (required if calling this function from outside an AnyIO worker thread) + :return: the return value of the callable + :raises MissingTokenError: if no token was provided and called from outside an + AnyIO worker thread + :raises RunFinishedError: if the event loop tied to ``token`` is no longer running + + .. versionchanged:: 4.11.0 + Added the ``token`` parameter. + + """ + explicit_token = token is not None + token = _token_or_error(token) + return token.backend_class.run_sync_from_thread( + func, args, token=token.native_token if explicit_token else None + ) + + +class _BlockingAsyncContextManager(Generic[T_co], AbstractContextManager): + _enter_future: Future[T_co] + _exit_future: Future[bool | None] + _exit_event: Event + _exit_exc_info: tuple[ + type[BaseException] | None, BaseException | None, TracebackType | None + ] = (None, None, None) + + def __init__( + self, async_cm: AbstractAsyncContextManager[T_co], portal: BlockingPortal + ): + self._async_cm = async_cm + self._portal = portal + + async def run_async_cm(self) -> bool | None: + try: + self._exit_event = Event() + value = await self._async_cm.__aenter__() + except BaseException as exc: + self._enter_future.set_exception(exc) + raise + else: + self._enter_future.set_result(value) + + try: + # Wait for the sync context manager to exit. + # This next statement can raise `get_cancelled_exc_class()` if + # something went wrong in a task group in this async context + # manager. + await self._exit_event.wait() + finally: + # In case of cancellation, it could be that we end up here before + # `_BlockingAsyncContextManager.__exit__` is called, and an + # `_exit_exc_info` has been set. + result = await self._async_cm.__aexit__(*self._exit_exc_info) + + return result + + def __enter__(self) -> T_co: + self._enter_future = Future() + self._exit_future = self._portal.start_task_soon(self.run_async_cm) + return self._enter_future.result() + + def __exit__( + self, + __exc_type: type[BaseException] | None, + __exc_value: BaseException | None, + __traceback: TracebackType | None, + ) -> bool | None: + self._exit_exc_info = __exc_type, __exc_value, __traceback + self._portal.call(self._exit_event.set) + return self._exit_future.result() + + +class _BlockingPortalTaskStatus(TaskStatus): + def __init__(self, future: Future): + self._future = future + + def started(self, value: object = None) -> None: + self._future.set_result(value) + + +class BlockingPortal: + """ + An object that lets external threads run code in an asynchronous event loop. + + :raises NoEventLoopError: if no supported asynchronous event loop is running in the + current thread + """ + + def __init__(self) -> None: + self._token = current_token() + self._event_loop_thread_id: int | None = get_ident() + self._stop_event = Event() + self._task_group = create_task_group() + + async def __aenter__(self) -> BlockingPortal: + await self._task_group.__aenter__() + return self + + async def __aexit__( + self, + exc_type: type[BaseException] | None, + exc_val: BaseException | None, + exc_tb: TracebackType | None, + ) -> bool: + await self.stop() + return await self._task_group.__aexit__(exc_type, exc_val, exc_tb) + + def _check_running(self) -> None: + if self._event_loop_thread_id is None: + raise RuntimeError("This portal is not running") + if self._event_loop_thread_id == get_ident(): + raise RuntimeError( + "This method cannot be called from the event loop thread" + ) + + async def sleep_until_stopped(self) -> None: + """Sleep until :meth:`stop` is called.""" + await self._stop_event.wait() + + async def stop(self, cancel_remaining: bool = False) -> None: + """ + Signal the portal to shut down. + + This marks the portal as no longer accepting new calls and exits from + :meth:`sleep_until_stopped`. + + :param cancel_remaining: ``True`` to cancel all the remaining tasks, ``False`` + to let them finish before returning + + """ + self._event_loop_thread_id = None + self._stop_event.set() + if cancel_remaining: + self._task_group.cancel_scope.cancel("the blocking portal is shutting down") + + async def _call_func( + self, + func: Callable[[Unpack[PosArgsT]], Awaitable[T_Retval] | T_Retval], + args: tuple[Unpack[PosArgsT]], + kwargs: dict[str, Any], + future: Future[T_Retval], + ) -> None: + def callback(f: Future[T_Retval]) -> None: + if f.cancelled(): + if self._event_loop_thread_id == get_ident(): + scope.cancel("the future was cancelled") + elif self._event_loop_thread_id is not None: + self.call(scope.cancel, "the future was cancelled") + + try: + retval_or_awaitable = func(*args, **kwargs) + if isawaitable(retval_or_awaitable): + with CancelScope() as scope: + future.add_done_callback(callback) + retval = await retval_or_awaitable + else: + retval = retval_or_awaitable + except get_cancelled_exc_class(): + future.cancel() + future.set_running_or_notify_cancel() + except BaseException as exc: + if not future.cancelled(): + future.set_exception(exc) + + # Let base exceptions fall through + if not isinstance(exc, Exception): + raise + else: + if not future.cancelled(): + future.set_result(retval) + finally: + scope = None # type: ignore[assignment] + + def _spawn_task_from_thread( + self, + func: Callable[[Unpack[PosArgsT]], Awaitable[T_Retval] | T_Retval], + args: tuple[Unpack[PosArgsT]], + kwargs: dict[str, Any], + name: object, + future: Future[T_Retval], + ) -> None: + """ + Spawn a new task using the given callable. + + :param func: a callable + :param args: positional arguments to be passed to the callable + :param kwargs: keyword arguments to be passed to the callable + :param name: name of the task (will be coerced to a string if not ``None``) + :param future: a future that will resolve to the return value of the callable, + or the exception raised during its execution + + """ + run_sync( + partial(self._task_group.start_soon, name=name), + self._call_func, + func, + args, + kwargs, + future, + token=self._token, + ) + + @overload + def call( + self, + func: Callable[[Unpack[PosArgsT]], Awaitable[T_Retval]], + *args: Unpack[PosArgsT], + ) -> T_Retval: ... + + @overload + def call( + self, func: Callable[[Unpack[PosArgsT]], T_Retval], *args: Unpack[PosArgsT] + ) -> T_Retval: ... + + def call( + self, + func: Callable[[Unpack[PosArgsT]], Awaitable[T_Retval] | T_Retval], + *args: Unpack[PosArgsT], + ) -> T_Retval: + """ + Call the given function in the event loop thread. + + If the callable returns a coroutine object, it is awaited on. + + :param func: any callable + :raises RuntimeError: if the portal is not running or if this method is called + from within the event loop thread + + """ + return cast(T_Retval, self.start_task_soon(func, *args).result()) + + @overload + def start_task_soon( + self, + func: Callable[[Unpack[PosArgsT]], Awaitable[T_Retval]], + *args: Unpack[PosArgsT], + name: object = None, + ) -> Future[T_Retval]: ... + + @overload + def start_task_soon( + self, + func: Callable[[Unpack[PosArgsT]], T_Retval], + *args: Unpack[PosArgsT], + name: object = None, + ) -> Future[T_Retval]: ... + + def start_task_soon( + self, + func: Callable[[Unpack[PosArgsT]], Awaitable[T_Retval] | T_Retval], + *args: Unpack[PosArgsT], + name: object = None, + ) -> Future[T_Retval]: + """ + Start a task in the portal's task group. + + The task will be run inside a cancel scope which can be cancelled by cancelling + the returned future. + + :param func: the target function + :param args: positional arguments passed to ``func`` + :param name: name of the task (will be coerced to a string if not ``None``) + :return: a future that resolves with the return value of the callable if the + task completes successfully, or with the exception raised in the task + :raises RuntimeError: if the portal is not running or if this method is called + from within the event loop thread + :rtype: concurrent.futures.Future[T_Retval] + + .. versionadded:: 3.0 + + """ + self._check_running() + f: Future[T_Retval] = Future() + self._spawn_task_from_thread(func, args, {}, name, f) + return f + + def start_task( + self, + func: Callable[..., Awaitable[T_Retval]], + *args: object, + name: object = None, + ) -> tuple[Future[T_Retval], Any]: + """ + Start a task in the portal's task group and wait until it signals for readiness. + + This method works the same way as :meth:`.abc.TaskGroup.start`. + + :param func: the target function + :param args: positional arguments passed to ``func`` + :param name: name of the task (will be coerced to a string if not ``None``) + :return: a tuple of (future, task_status_value) where the ``task_status_value`` + is the value passed to ``task_status.started()`` from within the target + function + :rtype: tuple[concurrent.futures.Future[T_Retval], Any] + + .. versionadded:: 3.0 + + """ + + def task_done(future: Future[T_Retval]) -> None: + if not task_status_future.done(): + if future.cancelled(): + task_status_future.cancel() + elif future.exception(): + task_status_future.set_exception(future.exception()) + else: + exc = RuntimeError( + "Task exited without calling task_status.started()" + ) + task_status_future.set_exception(exc) + + self._check_running() + task_status_future: Future = Future() + task_status = _BlockingPortalTaskStatus(task_status_future) + f: Future = Future() + f.add_done_callback(task_done) + self._spawn_task_from_thread(func, args, {"task_status": task_status}, name, f) + return f, task_status_future.result() + + def wrap_async_context_manager( + self, cm: AbstractAsyncContextManager[T_co] + ) -> AbstractContextManager[T_co]: + """ + Wrap an async context manager as a synchronous context manager via this portal. + + Spawns a task that will call both ``__aenter__()`` and ``__aexit__()``, stopping + in the middle until the synchronous context manager exits. + + :param cm: an asynchronous context manager + :return: a synchronous context manager + + .. versionadded:: 2.1 + + """ + return _BlockingAsyncContextManager(cm, self) + + +@dataclass +class BlockingPortalProvider: + """ + A manager for a blocking portal. Used as a context manager. The first thread to + enter this context manager causes a blocking portal to be started with the specific + parameters, and the last thread to exit causes the portal to be shut down. Thus, + there will be exactly one blocking portal running in this context as long as at + least one thread has entered this context manager. + + The parameters are the same as for :func:`~anyio.run`. + + :param backend: name of the backend + :param backend_options: backend options + + .. versionadded:: 4.4 + """ + + backend: str = "asyncio" + backend_options: dict[str, Any] | None = None + _lock: Lock = field(init=False, default_factory=Lock) + _leases: int = field(init=False, default=0) + _portal: BlockingPortal = field(init=False) + _portal_cm: AbstractContextManager[BlockingPortal] | None = field( + init=False, default=None + ) + + def __enter__(self) -> BlockingPortal: + with self._lock: + if self._portal_cm is None: + self._portal_cm = start_blocking_portal( + self.backend, self.backend_options + ) + self._portal = self._portal_cm.__enter__() + + self._leases += 1 + return self._portal + + def __exit__( + self, + exc_type: type[BaseException] | None, + exc_val: BaseException | None, + exc_tb: TracebackType | None, + ) -> None: + portal_cm: AbstractContextManager[BlockingPortal] | None = None + with self._lock: + assert self._portal_cm + assert self._leases > 0 + self._leases -= 1 + if not self._leases: + portal_cm = self._portal_cm + self._portal_cm = None + del self._portal + + if portal_cm: + portal_cm.__exit__(None, None, None) + + +@contextmanager +def start_blocking_portal( + backend: str = "asyncio", + backend_options: dict[str, Any] | None = None, + *, + name: str | None = None, +) -> Generator[BlockingPortal, Any, None]: + """ + Start a new event loop in a new thread and run a blocking portal in its main task. + + The parameters are the same as for :func:`~anyio.run`. + + :param backend: name of the backend + :param backend_options: backend options + :param name: name of the thread + :return: a context manager that yields a blocking portal + + .. versionchanged:: 3.0 + Usage as a context manager is now required. + + """ + + async def run_portal() -> None: + async with BlockingPortal() as portal_: + if name is None: + current_thread().name = f"{backend}-portal-{id(portal_):x}" + + future.set_result(portal_) + await portal_.sleep_until_stopped() + + def run_blocking_portal() -> None: + if future.set_running_or_notify_cancel(): + try: + run_eventloop( + run_portal, backend=backend, backend_options=backend_options + ) + except BaseException as exc: + if not future.done(): + future.set_exception(exc) + + future: Future[BlockingPortal] = Future() + thread = Thread(target=run_blocking_portal, daemon=True, name=name) + thread.start() + try: + cancel_remaining_tasks = False + portal = future.result() + try: + yield portal + except BaseException: + cancel_remaining_tasks = True + raise + finally: + try: + portal.call(portal.stop, cancel_remaining_tasks) + except RuntimeError: + pass + finally: + thread.join() + + +def check_cancelled() -> None: + """ + Check if the cancel scope of the host task's running the current worker thread has + been cancelled. + + If the host task's current cancel scope has indeed been cancelled, the + backend-specific cancellation exception will be raised. + + :raises RuntimeError: if the current thread was not spawned by + :func:`.to_thread.run_sync` + + """ + try: + token: EventLoopToken = threadlocals.current_token + except AttributeError: + raise NoEventLoopError( + "This function can only be called inside an AnyIO worker thread" + ) from None + + token.backend_class.check_cancelled() diff --git a/venv/lib/python3.11/site-packages/anyio/functools.py b/venv/lib/python3.11/site-packages/anyio/functools.py new file mode 100644 index 0000000..b80afe6 --- /dev/null +++ b/venv/lib/python3.11/site-packages/anyio/functools.py @@ -0,0 +1,375 @@ +from __future__ import annotations + +__all__ = ( + "AsyncCacheInfo", + "AsyncCacheParameters", + "AsyncLRUCacheWrapper", + "cache", + "lru_cache", + "reduce", +) + +import functools +import sys +from collections import OrderedDict +from collections.abc import ( + AsyncIterable, + Awaitable, + Callable, + Coroutine, + Hashable, + Iterable, +) +from functools import update_wrapper +from inspect import iscoroutinefunction +from typing import ( + Any, + Generic, + NamedTuple, + TypedDict, + TypeVar, + cast, + final, + overload, +) +from weakref import WeakKeyDictionary + +from ._core._synchronization import Lock +from .lowlevel import RunVar, checkpoint + +if sys.version_info >= (3, 11): + from typing import ParamSpec +else: + from typing_extensions import ParamSpec + +T = TypeVar("T") +S = TypeVar("S") +P = ParamSpec("P") +lru_cache_items: RunVar[ + WeakKeyDictionary[ + AsyncLRUCacheWrapper[Any, Any], + OrderedDict[Hashable, tuple[_InitialMissingType, Lock] | tuple[Any, None]], + ] +] = RunVar("lru_cache_items") + + +class _InitialMissingType: + pass + + +initial_missing: _InitialMissingType = _InitialMissingType() + + +class AsyncCacheInfo(NamedTuple): + hits: int + misses: int + maxsize: int | None + currsize: int + + +class AsyncCacheParameters(TypedDict): + maxsize: int | None + typed: bool + always_checkpoint: bool + + +class _LRUMethodWrapper(Generic[T]): + def __init__(self, wrapper: AsyncLRUCacheWrapper[..., T], instance: object): + self.__wrapper = wrapper + self.__instance = instance + + def cache_info(self) -> AsyncCacheInfo: + return self.__wrapper.cache_info() + + def cache_parameters(self) -> AsyncCacheParameters: + return self.__wrapper.cache_parameters() + + def cache_clear(self) -> None: + self.__wrapper.cache_clear() + + async def __call__(self, *args: Any, **kwargs: Any) -> T: + if self.__instance is None: + return await self.__wrapper(*args, **kwargs) + + return await self.__wrapper(self.__instance, *args, **kwargs) + + +@final +class AsyncLRUCacheWrapper(Generic[P, T]): + def __init__( + self, + func: Callable[P, Awaitable[T]], + maxsize: int | None, + typed: bool, + always_checkpoint: bool, + ): + self.__wrapped__ = func + self._hits: int = 0 + self._misses: int = 0 + self._maxsize = max(maxsize, 0) if maxsize is not None else None + self._currsize: int = 0 + self._typed = typed + self._always_checkpoint = always_checkpoint + update_wrapper(self, func) + + def cache_info(self) -> AsyncCacheInfo: + return AsyncCacheInfo(self._hits, self._misses, self._maxsize, self._currsize) + + def cache_parameters(self) -> AsyncCacheParameters: + return { + "maxsize": self._maxsize, + "typed": self._typed, + "always_checkpoint": self._always_checkpoint, + } + + def cache_clear(self) -> None: + if cache := lru_cache_items.get(None): + cache.pop(self, None) + self._hits = self._misses = self._currsize = 0 + + async def __call__(self, *args: P.args, **kwargs: P.kwargs) -> T: + # Easy case first: if maxsize == 0, no caching is done + if self._maxsize == 0: + value = await self.__wrapped__(*args, **kwargs) + self._misses += 1 + return value + + # The key is constructed as a flat tuple to avoid memory overhead + key: tuple[Any, ...] = args + if kwargs: + # initial_missing is used as a separator + key += (initial_missing,) + sum(kwargs.items(), ()) + + if self._typed: + key += tuple(type(arg) for arg in args) + if kwargs: + key += (initial_missing,) + tuple(type(val) for val in kwargs.values()) + + try: + cache = lru_cache_items.get() + except LookupError: + cache = WeakKeyDictionary() + lru_cache_items.set(cache) + + try: + cache_entry = cache[self] + except KeyError: + cache_entry = cache[self] = OrderedDict() + + cached_value: T | _InitialMissingType + try: + cached_value, lock = cache_entry[key] + except KeyError: + # We're the first task to call this function + cached_value, lock = ( + initial_missing, + Lock(fast_acquire=not self._always_checkpoint), + ) + cache_entry[key] = cached_value, lock + + if lock is None: + # The value was already cached + self._hits += 1 + cache_entry.move_to_end(key) + if self._always_checkpoint: + await checkpoint() + + return cast(T, cached_value) + + async with lock: + # Check if another task filled the cache while we acquired the lock + if (cached_value := cache_entry[key][0]) is initial_missing: + self._misses += 1 + if self._maxsize is not None and self._currsize >= self._maxsize: + cache_entry.popitem(last=False) + else: + self._currsize += 1 + + value = await self.__wrapped__(*args, **kwargs) + cache_entry[key] = value, None + else: + # Another task filled the cache while we were waiting for the lock + self._hits += 1 + cache_entry.move_to_end(key) + value = cast(T, cached_value) + + return value + + def __get__( + self, instance: object, owner: type | None = None + ) -> _LRUMethodWrapper[T]: + wrapper = _LRUMethodWrapper(self, instance) + update_wrapper(wrapper, self.__wrapped__) + return wrapper + + +class _LRUCacheWrapper(Generic[T]): + def __init__(self, maxsize: int | None, typed: bool, always_checkpoint: bool): + self._maxsize = maxsize + self._typed = typed + self._always_checkpoint = always_checkpoint + + @overload + def __call__( # type: ignore[overload-overlap] + self, func: Callable[P, Coroutine[Any, Any, T]], / + ) -> AsyncLRUCacheWrapper[P, T]: ... + + @overload + def __call__( + self, func: Callable[..., T], / + ) -> functools._lru_cache_wrapper[T]: ... + + def __call__( + self, f: Callable[P, Coroutine[Any, Any, T]] | Callable[..., T], / + ) -> AsyncLRUCacheWrapper[P, T] | functools._lru_cache_wrapper[T]: + if iscoroutinefunction(f): + return AsyncLRUCacheWrapper( + f, self._maxsize, self._typed, self._always_checkpoint + ) + + return functools.lru_cache(maxsize=self._maxsize, typed=self._typed)(f) # type: ignore[arg-type] + + +@overload +def cache( # type: ignore[overload-overlap] + func: Callable[P, Coroutine[Any, Any, T]], / +) -> AsyncLRUCacheWrapper[P, T]: ... + + +@overload +def cache(func: Callable[..., T], /) -> functools._lru_cache_wrapper[T]: ... + + +def cache( + func: Callable[..., T] | Callable[P, Coroutine[Any, Any, T]], / +) -> AsyncLRUCacheWrapper[P, T] | functools._lru_cache_wrapper[T]: + """ + A convenient shortcut for :func:`lru_cache` with ``maxsize=None``. + + This is the asynchronous equivalent to :func:`functools.cache`. + + """ + return lru_cache(maxsize=None)(func) + + +@overload +def lru_cache( + *, maxsize: int | None = ..., typed: bool = ..., always_checkpoint: bool = ... +) -> _LRUCacheWrapper[Any]: ... + + +@overload +def lru_cache( # type: ignore[overload-overlap] + func: Callable[P, Coroutine[Any, Any, T]], / +) -> AsyncLRUCacheWrapper[P, T]: ... + + +@overload +def lru_cache(func: Callable[..., T], /) -> functools._lru_cache_wrapper[T]: ... + + +def lru_cache( + func: Callable[P, Coroutine[Any, Any, T]] | Callable[..., T] | None = None, + /, + *, + maxsize: int | None = 128, + typed: bool = False, + always_checkpoint: bool = False, +) -> ( + AsyncLRUCacheWrapper[P, T] | functools._lru_cache_wrapper[T] | _LRUCacheWrapper[Any] +): + """ + An asynchronous version of :func:`functools.lru_cache`. + + If a synchronous function is passed, the standard library + :func:`functools.lru_cache` is applied instead. + + :param always_checkpoint: if ``True``, every call to the cached function will be + guaranteed to yield control to the event loop at least once + + .. note:: Caches and locks are managed on a per-event loop basis. + + """ + if func is None: + return _LRUCacheWrapper[Any](maxsize, typed, always_checkpoint) + + if not callable(func): + raise TypeError("the first argument must be callable") + + return _LRUCacheWrapper[T](maxsize, typed, always_checkpoint)(func) + + +@overload +async def reduce( + function: Callable[[T, S], Awaitable[T]], + iterable: Iterable[S] | AsyncIterable[S], + /, + initial: T, +) -> T: ... + + +@overload +async def reduce( + function: Callable[[T, T], Awaitable[T]], + iterable: Iterable[T] | AsyncIterable[T], + /, +) -> T: ... + + +async def reduce( # type: ignore[misc] + function: Callable[[T, T], Awaitable[T]] | Callable[[T, S], Awaitable[T]], + iterable: Iterable[T] | Iterable[S] | AsyncIterable[T] | AsyncIterable[S], + /, + initial: T | _InitialMissingType = initial_missing, +) -> T: + """ + Asynchronous version of :func:`functools.reduce`. + + :param function: a coroutine function that takes two arguments: the accumulated + value and the next element from the iterable + :param iterable: an iterable or async iterable + :param initial: the initial value (if missing, the first element of the iterable is + used as the initial value) + + """ + element: Any + function_called = False + if isinstance(iterable, AsyncIterable): + async_it = iterable.__aiter__() + if initial is initial_missing: + try: + value = cast(T, await async_it.__anext__()) + except StopAsyncIteration: + raise TypeError( + "reduce() of empty sequence with no initial value" + ) from None + else: + value = cast(T, initial) + + async for element in async_it: + value = await function(value, element) + function_called = True + elif isinstance(iterable, Iterable): + it = iter(iterable) + if initial is initial_missing: + try: + value = cast(T, next(it)) + except StopIteration: + raise TypeError( + "reduce() of empty sequence with no initial value" + ) from None + else: + value = cast(T, initial) + + for element in it: + value = await function(value, element) + function_called = True + else: + raise TypeError("reduce() argument 2 must be an iterable or async iterable") + + # Make sure there is at least one checkpoint, even if an empty iterable and an + # initial value were given + if not function_called: + await checkpoint() + + return value diff --git a/venv/lib/python3.11/site-packages/anyio/lowlevel.py b/venv/lib/python3.11/site-packages/anyio/lowlevel.py new file mode 100644 index 0000000..ffbb75a --- /dev/null +++ b/venv/lib/python3.11/site-packages/anyio/lowlevel.py @@ -0,0 +1,196 @@ +from __future__ import annotations + +__all__ = ( + "EventLoopToken", + "RunvarToken", + "RunVar", + "checkpoint", + "checkpoint_if_cancelled", + "cancel_shielded_checkpoint", + "current_token", +) + +import enum +from dataclasses import dataclass +from types import TracebackType +from typing import Any, Generic, Literal, TypeVar, final, overload +from weakref import WeakKeyDictionary + +from ._core._eventloop import get_async_backend +from .abc import AsyncBackend + +T = TypeVar("T") +D = TypeVar("D") + + +async def checkpoint() -> None: + """ + Check for cancellation and allow the scheduler to switch to another task. + + Equivalent to (but more efficient than):: + + await checkpoint_if_cancelled() + await cancel_shielded_checkpoint() + + .. versionadded:: 3.0 + + """ + await get_async_backend().checkpoint() + + +async def checkpoint_if_cancelled() -> None: + """ + Enter a checkpoint if the enclosing cancel scope has been cancelled. + + This does not allow the scheduler to switch to a different task. + + .. versionadded:: 3.0 + + """ + await get_async_backend().checkpoint_if_cancelled() + + +async def cancel_shielded_checkpoint() -> None: + """ + Allow the scheduler to switch to another task but without checking for cancellation. + + Equivalent to (but potentially more efficient than):: + + with CancelScope(shield=True): + await checkpoint() + + .. versionadded:: 3.0 + + """ + await get_async_backend().cancel_shielded_checkpoint() + + +@final +@dataclass(frozen=True, repr=False) +class EventLoopToken: + """ + An opaque object that holds a reference to an event loop. + + .. versionadded:: 4.11.0 + """ + + backend_class: type[AsyncBackend] + native_token: object + + +def current_token() -> EventLoopToken: + """ + Return a token object that can be used to call code in the current event loop from + another thread. + + :raises NoEventLoopError: if no supported asynchronous event loop is running in the + current thread + + .. versionadded:: 4.11.0 + + """ + backend_class = get_async_backend() + raw_token = backend_class.current_token() + return EventLoopToken(backend_class, raw_token) + + +_run_vars: WeakKeyDictionary[object, dict[RunVar[Any], Any]] = WeakKeyDictionary() + + +class _NoValueSet(enum.Enum): + NO_VALUE_SET = enum.auto() + + +class RunvarToken(Generic[T]): + __slots__ = "_var", "_value", "_redeemed" + + def __init__(self, var: RunVar[T], value: T | Literal[_NoValueSet.NO_VALUE_SET]): + self._var = var + self._value: T | Literal[_NoValueSet.NO_VALUE_SET] = value + self._redeemed = False + + def __enter__(self) -> RunvarToken[T]: + return self + + def __exit__( + self, + exc_type: type[BaseException] | None, + exc_val: BaseException | None, + exc_tb: TracebackType | None, + ) -> None: + self._var.reset(self) + + +class RunVar(Generic[T]): + """ + Like a :class:`~contextvars.ContextVar`, except scoped to the running event loop. + + Can be used as a context manager, Just like :class:`~contextvars.ContextVar`, that + will reset the variable to its previous value when the context block is exited. + """ + + __slots__ = "_name", "_default" + + NO_VALUE_SET: Literal[_NoValueSet.NO_VALUE_SET] = _NoValueSet.NO_VALUE_SET + + def __init__( + self, name: str, default: T | Literal[_NoValueSet.NO_VALUE_SET] = NO_VALUE_SET + ): + self._name = name + self._default = default + + @property + def _current_vars(self) -> dict[RunVar[T], T]: + native_token = current_token().native_token + try: + return _run_vars[native_token] + except KeyError: + run_vars = _run_vars[native_token] = {} + return run_vars + + @overload + def get(self, default: D) -> T | D: ... + + @overload + def get(self) -> T: ... + + def get( + self, default: D | Literal[_NoValueSet.NO_VALUE_SET] = NO_VALUE_SET + ) -> T | D: + try: + return self._current_vars[self] + except KeyError: + if default is not RunVar.NO_VALUE_SET: + return default + elif self._default is not RunVar.NO_VALUE_SET: + return self._default + + raise LookupError( + f'Run variable "{self._name}" has no value and no default set' + ) + + def set(self, value: T) -> RunvarToken[T]: + current_vars = self._current_vars + token = RunvarToken(self, current_vars.get(self, RunVar.NO_VALUE_SET)) + current_vars[self] = value + return token + + def reset(self, token: RunvarToken[T]) -> None: + if token._var is not self: + raise ValueError("This token does not belong to this RunVar") + + if token._redeemed: + raise ValueError("This token has already been used") + + if token._value is _NoValueSet.NO_VALUE_SET: + try: + del self._current_vars[self] + except KeyError: + pass + else: + self._current_vars[self] = token._value + + token._redeemed = True + + def __repr__(self) -> str: + return f"" diff --git a/venv/lib/python3.11/site-packages/anyio/py.typed b/venv/lib/python3.11/site-packages/anyio/py.typed new file mode 100644 index 0000000..e69de29 diff --git a/venv/lib/python3.11/site-packages/anyio/pytest_plugin.py b/venv/lib/python3.11/site-packages/anyio/pytest_plugin.py new file mode 100644 index 0000000..4222816 --- /dev/null +++ b/venv/lib/python3.11/site-packages/anyio/pytest_plugin.py @@ -0,0 +1,302 @@ +from __future__ import annotations + +import socket +import sys +from collections.abc import Callable, Generator, Iterator +from contextlib import ExitStack, contextmanager +from inspect import isasyncgenfunction, iscoroutinefunction, ismethod +from typing import Any, cast + +import pytest +from _pytest.fixtures import SubRequest +from _pytest.outcomes import Exit + +from . import get_available_backends +from ._core._eventloop import ( + current_async_library, + get_async_backend, + reset_current_async_library, + set_current_async_library, +) +from ._core._exceptions import iterate_exceptions +from .abc import TestRunner + +if sys.version_info < (3, 11): + from exceptiongroup import ExceptionGroup + +_current_runner: TestRunner | None = None +_runner_stack: ExitStack | None = None +_runner_leases = 0 + + +def extract_backend_and_options(backend: object) -> tuple[str, dict[str, Any]]: + if isinstance(backend, str): + return backend, {} + elif isinstance(backend, tuple) and len(backend) == 2: + if isinstance(backend[0], str) and isinstance(backend[1], dict): + return cast(tuple[str, dict[str, Any]], backend) + + raise TypeError("anyio_backend must be either a string or tuple of (string, dict)") + + +@contextmanager +def get_runner( + backend_name: str, backend_options: dict[str, Any] +) -> Iterator[TestRunner]: + global _current_runner, _runner_leases, _runner_stack + if _current_runner is None: + asynclib = get_async_backend(backend_name) + _runner_stack = ExitStack() + if current_async_library() is None: + # Since we're in control of the event loop, we can cache the name of the + # async library + token = set_current_async_library(backend_name) + _runner_stack.callback(reset_current_async_library, token) + + backend_options = backend_options or {} + _current_runner = _runner_stack.enter_context( + asynclib.create_test_runner(backend_options) + ) + + _runner_leases += 1 + try: + yield _current_runner + finally: + _runner_leases -= 1 + if not _runner_leases: + assert _runner_stack is not None + _runner_stack.close() + _runner_stack = _current_runner = None + + +def pytest_addoption(parser: pytest.Parser) -> None: + parser.addini( + "anyio_mode", + default="strict", + help='AnyIO plugin mode (either "strict" or "auto")', + ) + + +def pytest_configure(config: pytest.Config) -> None: + config.addinivalue_line( + "markers", + "anyio: mark the (coroutine function) test to be run asynchronously via anyio.", + ) + if ( + config.getini("anyio_mode") == "auto" + and config.pluginmanager.has_plugin("asyncio") + and config.getini("asyncio_mode") == "auto" + ): + config.issue_config_time_warning( + pytest.PytestConfigWarning( + "AnyIO auto mode has been enabled together with pytest-asyncio auto " + "mode. This may cause unexpected behavior." + ), + 1, + ) + + +@pytest.hookimpl(hookwrapper=True) +def pytest_fixture_setup(fixturedef: Any, request: Any) -> Generator[Any]: + def wrapper(anyio_backend: Any, request: SubRequest, **kwargs: Any) -> Any: + # Rebind any fixture methods to the request instance + if ( + request.instance + and ismethod(func) + and type(func.__self__) is type(request.instance) + ): + local_func = func.__func__.__get__(request.instance) + else: + local_func = func + + backend_name, backend_options = extract_backend_and_options(anyio_backend) + if has_backend_arg: + kwargs["anyio_backend"] = anyio_backend + + if has_request_arg: + kwargs["request"] = request + + with get_runner(backend_name, backend_options) as runner: + if isasyncgenfunction(local_func): + yield from runner.run_asyncgen_fixture(local_func, kwargs) + else: + yield runner.run_fixture(local_func, kwargs) + + # Only apply this to coroutine functions and async generator functions in requests + # that involve the anyio_backend fixture + func = fixturedef.func + if isasyncgenfunction(func) or iscoroutinefunction(func): + if "anyio_backend" in request.fixturenames: + fixturedef.func = wrapper + original_argname = fixturedef.argnames + + if not (has_backend_arg := "anyio_backend" in fixturedef.argnames): + fixturedef.argnames += ("anyio_backend",) + + if not (has_request_arg := "request" in fixturedef.argnames): + fixturedef.argnames += ("request",) + + try: + return (yield) + finally: + fixturedef.func = func + fixturedef.argnames = original_argname + + return (yield) + + +@pytest.hookimpl(tryfirst=True) +def pytest_pycollect_makeitem( + collector: pytest.Module | pytest.Class, name: str, obj: object +) -> None: + if collector.istestfunction(obj, name): + inner_func = obj.hypothesis.inner_test if hasattr(obj, "hypothesis") else obj + if iscoroutinefunction(inner_func): + anyio_auto_mode = collector.config.getini("anyio_mode") == "auto" + marker = collector.get_closest_marker("anyio") + own_markers = getattr(obj, "pytestmark", ()) + if ( + anyio_auto_mode + or marker + or any(marker.name == "anyio" for marker in own_markers) + ): + pytest.mark.usefixtures("anyio_backend")(obj) + + +@pytest.hookimpl(tryfirst=True) +def pytest_pyfunc_call(pyfuncitem: Any) -> bool | None: + def run_with_hypothesis(**kwargs: Any) -> None: + with get_runner(backend_name, backend_options) as runner: + runner.run_test(original_func, kwargs) + + backend = pyfuncitem.funcargs.get("anyio_backend") + if backend: + backend_name, backend_options = extract_backend_and_options(backend) + + if hasattr(pyfuncitem.obj, "hypothesis"): + # Wrap the inner test function unless it's already wrapped + original_func = pyfuncitem.obj.hypothesis.inner_test + if original_func.__qualname__ != run_with_hypothesis.__qualname__: + if iscoroutinefunction(original_func): + pyfuncitem.obj.hypothesis.inner_test = run_with_hypothesis + + return None + + if iscoroutinefunction(pyfuncitem.obj): + funcargs = pyfuncitem.funcargs + testargs = {arg: funcargs[arg] for arg in pyfuncitem._fixtureinfo.argnames} + with get_runner(backend_name, backend_options) as runner: + try: + runner.run_test(pyfuncitem.obj, testargs) + except ExceptionGroup as excgrp: + for exc in iterate_exceptions(excgrp): + if isinstance(exc, (Exit, KeyboardInterrupt, SystemExit)): + raise exc from excgrp + + raise + + return True + + return None + + +@pytest.fixture(scope="module", params=get_available_backends()) +def anyio_backend(request: Any) -> Any: + return request.param + + +@pytest.fixture +def anyio_backend_name(anyio_backend: Any) -> str: + if isinstance(anyio_backend, str): + return anyio_backend + else: + return anyio_backend[0] + + +@pytest.fixture +def anyio_backend_options(anyio_backend: Any) -> dict[str, Any]: + if isinstance(anyio_backend, str): + return {} + else: + return anyio_backend[1] + + +class FreePortFactory: + """ + Manages port generation based on specified socket kind, ensuring no duplicate + ports are generated. + + This class provides functionality for generating available free ports on the + system. It is initialized with a specific socket kind and can generate ports + for given address families while avoiding reuse of previously generated ports. + + Users should not instantiate this class directly, but use the + ``free_tcp_port_factory`` and ``free_udp_port_factory`` fixtures instead. For simple + uses cases, ``free_tcp_port`` and ``free_udp_port`` can be used instead. + """ + + def __init__(self, kind: socket.SocketKind) -> None: + self._kind = kind + self._generated = set[int]() + + @property + def kind(self) -> socket.SocketKind: + """ + The type of socket connection (e.g., :data:`~socket.SOCK_STREAM` or + :data:`~socket.SOCK_DGRAM`) used to bind for checking port availability + + """ + return self._kind + + def __call__(self, family: socket.AddressFamily | None = None) -> int: + """ + Return an unbound port for the given address family. + + :param family: if omitted, both IPv4 and IPv6 addresses will be tried + :return: a port number + + """ + if family is not None: + families = [family] + else: + families = [socket.AF_INET] + if socket.has_ipv6: + families.append(socket.AF_INET6) + + while True: + port = 0 + with ExitStack() as stack: + for family in families: + sock = stack.enter_context(socket.socket(family, self._kind)) + addr = "::1" if family == socket.AF_INET6 else "127.0.0.1" + try: + sock.bind((addr, port)) + except OSError: + break + + if not port: + port = sock.getsockname()[1] + else: + if port not in self._generated: + self._generated.add(port) + return port + + +@pytest.fixture(scope="session") +def free_tcp_port_factory() -> FreePortFactory: + return FreePortFactory(socket.SOCK_STREAM) + + +@pytest.fixture(scope="session") +def free_udp_port_factory() -> FreePortFactory: + return FreePortFactory(socket.SOCK_DGRAM) + + +@pytest.fixture +def free_tcp_port(free_tcp_port_factory: Callable[[], int]) -> int: + return free_tcp_port_factory() + + +@pytest.fixture +def free_udp_port(free_udp_port_factory: Callable[[], int]) -> int: + return free_udp_port_factory() diff --git a/venv/lib/python3.11/site-packages/anyio/streams/__init__.py b/venv/lib/python3.11/site-packages/anyio/streams/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/venv/lib/python3.11/site-packages/anyio/streams/__pycache__/__init__.cpython-311.pyc b/venv/lib/python3.11/site-packages/anyio/streams/__pycache__/__init__.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..5d68fcbc6b86370be433550accb7a219307d56c7 GIT binary patch literal 200 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 literal 0 HcmV?d00001 diff --git a/venv/lib/python3.11/site-packages/anyio/streams/__pycache__/memory.cpython-311.pyc b/venv/lib/python3.11/site-packages/anyio/streams/__pycache__/memory.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..e3ed014f4b2ed8ffd86c042535e1c742cbcbb2e6 GIT binary patch literal 16048 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 literal 0 HcmV?d00001 diff --git a/venv/lib/python3.11/site-packages/anyio/streams/__pycache__/stapled.cpython-311.pyc b/venv/lib/python3.11/site-packages/anyio/streams/__pycache__/stapled.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..7471e43fd7726c802d6ef8d98d036f31d2d5c2ee GIT binary patch literal 8306 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 literal 0 HcmV?d00001 diff --git a/venv/lib/python3.11/site-packages/anyio/streams/__pycache__/text.cpython-311.pyc b/venv/lib/python3.11/site-packages/anyio/streams/__pycache__/text.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..55d59a01aeddcf3e80118ceae05c5e1a5d920f67 GIT binary patch literal 10227 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 literal 0 HcmV?d00001 diff --git a/venv/lib/python3.11/site-packages/anyio/streams/__pycache__/tls.cpython-311.pyc b/venv/lib/python3.11/site-packages/anyio/streams/__pycache__/tls.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..e395e9aa5d4dbeda22966f0b0d304b5b35f777c1 GIT binary patch literal 21234 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 (3, 12): + from typing import override +else: + from typing_extensions import override + + +@dataclass(eq=False) +class BufferedByteReceiveStream(ByteReceiveStream): + """ + Wraps any bytes-based receive stream and uses a buffer to provide sophisticated + receiving capabilities in the form of a byte stream. + """ + + receive_stream: AnyByteReceiveStream + _buffer: bytearray = field(init=False, default_factory=bytearray) + _closed: bool = field(init=False, default=False) + + async def aclose(self) -> None: + await self.receive_stream.aclose() + self._closed = True + + @property + def buffer(self) -> bytes: + """The bytes currently in the buffer.""" + return bytes(self._buffer) + + @property + def extra_attributes(self) -> Mapping[Any, Callable[[], Any]]: + return self.receive_stream.extra_attributes + + def feed_data(self, data: Iterable[SupportsIndex], /) -> None: + """ + Append data directly into the buffer. + + Any data in the buffer will be consumed by receive operations before receiving + anything from the wrapped stream. + + :param data: the data to append to the buffer (can be bytes or anything else + that supports ``__index__()``) + + """ + self._buffer.extend(data) + + async def receive(self, max_bytes: int = 65536) -> bytes: + if self._closed: + raise ClosedResourceError + + if self._buffer: + chunk = bytes(self._buffer[:max_bytes]) + del self._buffer[:max_bytes] + return chunk + elif isinstance(self.receive_stream, ByteReceiveStream): + return await self.receive_stream.receive(max_bytes) + else: + # With a bytes-oriented object stream, we need to handle any surplus bytes + # we get from the receive() call + chunk = await self.receive_stream.receive() + if len(chunk) > max_bytes: + # Save the surplus bytes in the buffer + self._buffer.extend(chunk[max_bytes:]) + return chunk[:max_bytes] + else: + return chunk + + async def receive_exactly(self, nbytes: int) -> bytes: + """ + Read exactly the given amount of bytes from the stream. + + :param nbytes: the number of bytes to read + :return: the bytes read + :raises ~anyio.IncompleteRead: if the stream was closed before the requested + amount of bytes could be read from the stream + + """ + while True: + remaining = nbytes - len(self._buffer) + if remaining <= 0: + retval = self._buffer[:nbytes] + del self._buffer[:nbytes] + return bytes(retval) + + try: + if isinstance(self.receive_stream, ByteReceiveStream): + chunk = await self.receive_stream.receive(remaining) + else: + chunk = await self.receive_stream.receive() + except EndOfStream as exc: + raise IncompleteRead from exc + + self._buffer.extend(chunk) + + async def receive_until(self, delimiter: bytes, max_bytes: int) -> bytes: + """ + Read from the stream until the delimiter is found or max_bytes have been read. + + :param delimiter: the marker to look for in the stream + :param max_bytes: maximum number of bytes that will be read before raising + :exc:`~anyio.DelimiterNotFound` + :return: the bytes read (not including the delimiter) + :raises ~anyio.IncompleteRead: if the stream was closed before the delimiter + was found + :raises ~anyio.DelimiterNotFound: if the delimiter is not found within the + bytes read up to the maximum allowed + + """ + delimiter_size = len(delimiter) + offset = 0 + while True: + # Check if the delimiter can be found in the current buffer + index = self._buffer.find(delimiter, offset) + if index >= 0: + found = self._buffer[:index] + del self._buffer[: index + len(delimiter) :] + return bytes(found) + + # Check if the buffer is already at or over the limit + if len(self._buffer) >= max_bytes: + raise DelimiterNotFound(max_bytes) + + # Read more data into the buffer from the socket + try: + data = await self.receive_stream.receive() + except EndOfStream as exc: + raise IncompleteRead from exc + + # Move the offset forward and add the new data to the buffer + offset = max(len(self._buffer) - delimiter_size + 1, 0) + self._buffer.extend(data) + + +class BufferedByteStream(BufferedByteReceiveStream, ByteStream): + """ + A full-duplex variant of :class:`BufferedByteReceiveStream`. All writes are passed + through to the wrapped stream as-is. + """ + + def __init__(self, stream: AnyByteStream): + """ + :param stream: the stream to be wrapped + + """ + super().__init__(stream) + self._stream = stream + + @override + async def send_eof(self) -> None: + await self._stream.send_eof() + + @override + async def send(self, item: bytes) -> None: + await self._stream.send(item) + + +class BufferedConnectable(ByteStreamConnectable): + def __init__(self, connectable: AnyByteStreamConnectable): + """ + :param connectable: the connectable to wrap + + """ + self.connectable = connectable + + @override + async def connect(self) -> BufferedByteStream: + stream = await self.connectable.connect() + return BufferedByteStream(stream) diff --git a/venv/lib/python3.11/site-packages/anyio/streams/file.py b/venv/lib/python3.11/site-packages/anyio/streams/file.py new file mode 100644 index 0000000..82d2da8 --- /dev/null +++ b/venv/lib/python3.11/site-packages/anyio/streams/file.py @@ -0,0 +1,154 @@ +from __future__ import annotations + +__all__ = ( + "FileReadStream", + "FileStreamAttribute", + "FileWriteStream", +) + +from collections.abc import Callable, Mapping +from io import SEEK_SET, UnsupportedOperation +from os import PathLike +from pathlib import Path +from typing import Any, BinaryIO, cast + +from .. import ( + BrokenResourceError, + ClosedResourceError, + EndOfStream, + TypedAttributeSet, + to_thread, + typed_attribute, +) +from ..abc import ByteReceiveStream, ByteSendStream + + +class FileStreamAttribute(TypedAttributeSet): + #: the open file descriptor + file: BinaryIO = typed_attribute() + #: the path of the file on the file system, if available (file must be a real file) + path: Path = typed_attribute() + #: the file number, if available (file must be a real file or a TTY) + fileno: int = typed_attribute() + + +class _BaseFileStream: + def __init__(self, file: BinaryIO): + self._file = file + + async def aclose(self) -> None: + await to_thread.run_sync(self._file.close) + + @property + def extra_attributes(self) -> Mapping[Any, Callable[[], Any]]: + attributes: dict[Any, Callable[[], Any]] = { + FileStreamAttribute.file: lambda: self._file, + } + + if hasattr(self._file, "name"): + attributes[FileStreamAttribute.path] = lambda: Path(self._file.name) + + try: + self._file.fileno() + except UnsupportedOperation: + pass + else: + attributes[FileStreamAttribute.fileno] = lambda: self._file.fileno() + + return attributes + + +class FileReadStream(_BaseFileStream, ByteReceiveStream): + """ + A byte stream that reads from a file in the file system. + + :param file: a file that has been opened for reading in binary mode + + .. versionadded:: 3.0 + """ + + @classmethod + async def from_path(cls, path: str | PathLike[str]) -> FileReadStream: + """ + Create a file read stream by opening the given file. + + :param path: path of the file to read from + + """ + file = await to_thread.run_sync(Path(path).open, "rb") + return cls(cast(BinaryIO, file)) + + async def receive(self, max_bytes: int = 65536) -> bytes: + try: + data = await to_thread.run_sync(self._file.read, max_bytes) + except ValueError: + raise ClosedResourceError from None + except OSError as exc: + raise BrokenResourceError from exc + + if data: + return data + else: + raise EndOfStream + + async def seek(self, position: int, whence: int = SEEK_SET) -> int: + """ + Seek the file to the given position. + + .. seealso:: :meth:`io.IOBase.seek` + + .. note:: Not all file descriptors are seekable. + + :param position: position to seek the file to + :param whence: controls how ``position`` is interpreted + :return: the new absolute position + :raises OSError: if the file is not seekable + + """ + return await to_thread.run_sync(self._file.seek, position, whence) + + async def tell(self) -> int: + """ + Return the current stream position. + + .. note:: Not all file descriptors are seekable. + + :return: the current absolute position + :raises OSError: if the file is not seekable + + """ + return await to_thread.run_sync(self._file.tell) + + +class FileWriteStream(_BaseFileStream, ByteSendStream): + """ + A byte stream that writes to a file in the file system. + + :param file: a file that has been opened for writing in binary mode + + .. versionadded:: 3.0 + """ + + @classmethod + async def from_path( + cls, path: str | PathLike[str], append: bool = False + ) -> FileWriteStream: + """ + Create a file write stream by opening the given file for writing. + + :param path: path of the file to write to + :param append: if ``True``, open the file for appending; if ``False``, any + existing file at the given path will be truncated + + """ + mode = "ab" if append else "wb" + file = await to_thread.run_sync(Path(path).open, mode) + return cls(cast(BinaryIO, file)) + + async def send(self, item: bytes) -> None: + try: + await to_thread.run_sync(self._file.write, item) + except ValueError: + raise ClosedResourceError from None + except OSError as exc: + raise BrokenResourceError from exc diff --git a/venv/lib/python3.11/site-packages/anyio/streams/memory.py b/venv/lib/python3.11/site-packages/anyio/streams/memory.py new file mode 100644 index 0000000..a3fa0c3 --- /dev/null +++ b/venv/lib/python3.11/site-packages/anyio/streams/memory.py @@ -0,0 +1,325 @@ +from __future__ import annotations + +__all__ = ( + "MemoryObjectReceiveStream", + "MemoryObjectSendStream", + "MemoryObjectStreamStatistics", +) + +import warnings +from collections import OrderedDict, deque +from dataclasses import dataclass, field +from types import TracebackType +from typing import Generic, NamedTuple, TypeVar + +from .. import ( + BrokenResourceError, + ClosedResourceError, + EndOfStream, + WouldBlock, +) +from .._core._testing import TaskInfo, get_current_task +from ..abc import Event, ObjectReceiveStream, ObjectSendStream +from ..lowlevel import checkpoint + +T_Item = TypeVar("T_Item") +T_co = TypeVar("T_co", covariant=True) +T_contra = TypeVar("T_contra", contravariant=True) + + +class MemoryObjectStreamStatistics(NamedTuple): + current_buffer_used: int #: number of items stored in the buffer + #: maximum number of items that can be stored on this stream (or :data:`math.inf`) + max_buffer_size: float + open_send_streams: int #: number of unclosed clones of the send stream + open_receive_streams: int #: number of unclosed clones of the receive stream + #: number of tasks blocked on :meth:`MemoryObjectSendStream.send` + tasks_waiting_send: int + #: number of tasks blocked on :meth:`MemoryObjectReceiveStream.receive` + tasks_waiting_receive: int + + +@dataclass(eq=False) +class _MemoryObjectItemReceiver(Generic[T_Item]): + task_info: TaskInfo = field(init=False, default_factory=get_current_task) + item: T_Item = field(init=False) + + def __repr__(self) -> str: + # When item is not defined, we get following error with default __repr__: + # AttributeError: 'MemoryObjectItemReceiver' object has no attribute 'item' + item = getattr(self, "item", None) + return f"{self.__class__.__name__}(task_info={self.task_info}, item={item!r})" + + +@dataclass(eq=False) +class _MemoryObjectStreamState(Generic[T_Item]): + max_buffer_size: float = field() + buffer: deque[T_Item] = field(init=False, default_factory=deque) + open_send_channels: int = field(init=False, default=0) + open_receive_channels: int = field(init=False, default=0) + waiting_receivers: OrderedDict[Event, _MemoryObjectItemReceiver[T_Item]] = field( + init=False, default_factory=OrderedDict + ) + waiting_senders: OrderedDict[Event, T_Item] = field( + init=False, default_factory=OrderedDict + ) + + def statistics(self) -> MemoryObjectStreamStatistics: + return MemoryObjectStreamStatistics( + len(self.buffer), + self.max_buffer_size, + self.open_send_channels, + self.open_receive_channels, + len(self.waiting_senders), + len(self.waiting_receivers), + ) + + +@dataclass(eq=False) +class MemoryObjectReceiveStream(Generic[T_co], ObjectReceiveStream[T_co]): + _state: _MemoryObjectStreamState[T_co] + _closed: bool = field(init=False, default=False) + + def __post_init__(self) -> None: + self._state.open_receive_channels += 1 + + def receive_nowait(self) -> T_co: + """ + Receive the next item if it can be done without waiting. + + :return: the received item + :raises ~anyio.ClosedResourceError: if this send stream has been closed + :raises ~anyio.EndOfStream: if the buffer is empty and this stream has been + closed from the sending end + :raises ~anyio.WouldBlock: if there are no items in the buffer and no tasks + waiting to send + + """ + if self._closed: + raise ClosedResourceError + + if self._state.waiting_senders: + # Get the item from the next sender + send_event, item = self._state.waiting_senders.popitem(last=False) + self._state.buffer.append(item) + send_event.set() + + if self._state.buffer: + return self._state.buffer.popleft() + elif not self._state.open_send_channels: + raise EndOfStream + + raise WouldBlock + + async def receive(self) -> T_co: + await checkpoint() + try: + return self.receive_nowait() + except WouldBlock: + # Add ourselves in the queue + receive_event = Event() + receiver = _MemoryObjectItemReceiver[T_co]() + self._state.waiting_receivers[receive_event] = receiver + + try: + await receive_event.wait() + finally: + self._state.waiting_receivers.pop(receive_event, None) + + try: + return receiver.item + except AttributeError: + raise EndOfStream from None + + def clone(self) -> MemoryObjectReceiveStream[T_co]: + """ + Create a clone of this receive stream. + + Each clone can be closed separately. Only when all clones have been closed will + the receiving end of the memory stream be considered closed by the sending ends. + + :return: the cloned stream + + """ + if self._closed: + raise ClosedResourceError + + return MemoryObjectReceiveStream(_state=self._state) + + def close(self) -> None: + """ + Close the stream. + + This works the exact same way as :meth:`aclose`, but is provided as a special + case for the benefit of synchronous callbacks. + + """ + if not self._closed: + self._closed = True + self._state.open_receive_channels -= 1 + if self._state.open_receive_channels == 0: + send_events = list(self._state.waiting_senders.keys()) + for event in send_events: + event.set() + + async def aclose(self) -> None: + self.close() + + def statistics(self) -> MemoryObjectStreamStatistics: + """ + Return statistics about the current state of this stream. + + .. versionadded:: 3.0 + """ + return self._state.statistics() + + def __enter__(self) -> MemoryObjectReceiveStream[T_co]: + return self + + def __exit__( + self, + exc_type: type[BaseException] | None, + exc_val: BaseException | None, + exc_tb: TracebackType | None, + ) -> None: + self.close() + + def __del__(self) -> None: + if not self._closed: + warnings.warn( + f"Unclosed <{self.__class__.__name__} at {id(self):x}>", + ResourceWarning, + stacklevel=1, + source=self, + ) + + +@dataclass(eq=False) +class MemoryObjectSendStream(Generic[T_contra], ObjectSendStream[T_contra]): + _state: _MemoryObjectStreamState[T_contra] + _closed: bool = field(init=False, default=False) + + def __post_init__(self) -> None: + self._state.open_send_channels += 1 + + def send_nowait(self, item: T_contra) -> None: + """ + Send an item immediately if it can be done without waiting. + + :param item: the item to send + :raises ~anyio.ClosedResourceError: if this send stream has been closed + :raises ~anyio.BrokenResourceError: if the stream has been closed from the + receiving end + :raises ~anyio.WouldBlock: if the buffer is full and there are no tasks waiting + to receive + + """ + if self._closed: + raise ClosedResourceError + if not self._state.open_receive_channels: + raise BrokenResourceError + + while self._state.waiting_receivers: + receive_event, receiver = self._state.waiting_receivers.popitem(last=False) + if not receiver.task_info.has_pending_cancellation(): + receiver.item = item + receive_event.set() + return + + if len(self._state.buffer) < self._state.max_buffer_size: + self._state.buffer.append(item) + else: + raise WouldBlock + + async def send(self, item: T_contra) -> None: + """ + Send an item to the stream. + + If the buffer is full, this method blocks until there is again room in the + buffer or the item can be sent directly to a receiver. + + :param item: the item to send + :raises ~anyio.ClosedResourceError: if this send stream has been closed + :raises ~anyio.BrokenResourceError: if the stream has been closed from the + receiving end + + """ + await checkpoint() + try: + self.send_nowait(item) + except WouldBlock: + # Wait until there's someone on the receiving end + send_event = Event() + self._state.waiting_senders[send_event] = item + try: + await send_event.wait() + except BaseException: + self._state.waiting_senders.pop(send_event, None) + raise + + if send_event in self._state.waiting_senders: + del self._state.waiting_senders[send_event] + raise BrokenResourceError from None + + def clone(self) -> MemoryObjectSendStream[T_contra]: + """ + Create a clone of this send stream. + + Each clone can be closed separately. Only when all clones have been closed will + the sending end of the memory stream be considered closed by the receiving ends. + + :return: the cloned stream + + """ + if self._closed: + raise ClosedResourceError + + return MemoryObjectSendStream(_state=self._state) + + def close(self) -> None: + """ + Close the stream. + + This works the exact same way as :meth:`aclose`, but is provided as a special + case for the benefit of synchronous callbacks. + + """ + if not self._closed: + self._closed = True + self._state.open_send_channels -= 1 + if self._state.open_send_channels == 0: + receive_events = list(self._state.waiting_receivers.keys()) + self._state.waiting_receivers.clear() + for event in receive_events: + event.set() + + async def aclose(self) -> None: + self.close() + + def statistics(self) -> MemoryObjectStreamStatistics: + """ + Return statistics about the current state of this stream. + + .. versionadded:: 3.0 + """ + return self._state.statistics() + + def __enter__(self) -> MemoryObjectSendStream[T_contra]: + return self + + def __exit__( + self, + exc_type: type[BaseException] | None, + exc_val: BaseException | None, + exc_tb: TracebackType | None, + ) -> None: + self.close() + + def __del__(self) -> None: + if not self._closed: + warnings.warn( + f"Unclosed <{self.__class__.__name__} at {id(self):x}>", + ResourceWarning, + stacklevel=1, + source=self, + ) diff --git a/venv/lib/python3.11/site-packages/anyio/streams/stapled.py b/venv/lib/python3.11/site-packages/anyio/streams/stapled.py new file mode 100644 index 0000000..9248b68 --- /dev/null +++ b/venv/lib/python3.11/site-packages/anyio/streams/stapled.py @@ -0,0 +1,147 @@ +from __future__ import annotations + +__all__ = ( + "MultiListener", + "StapledByteStream", + "StapledObjectStream", +) + +from collections.abc import Callable, Mapping, Sequence +from dataclasses import dataclass +from typing import Any, Generic, TypeVar + +from ..abc import ( + ByteReceiveStream, + ByteSendStream, + ByteStream, + Listener, + ObjectReceiveStream, + ObjectSendStream, + ObjectStream, + TaskGroup, +) + +T_Item = TypeVar("T_Item") +T_Stream = TypeVar("T_Stream") + + +@dataclass(eq=False) +class StapledByteStream(ByteStream): + """ + Combines two byte streams into a single, bidirectional byte stream. + + Extra attributes will be provided from both streams, with the receive stream + providing the values in case of a conflict. + + :param ByteSendStream send_stream: the sending byte stream + :param ByteReceiveStream receive_stream: the receiving byte stream + """ + + send_stream: ByteSendStream + receive_stream: ByteReceiveStream + + async def receive(self, max_bytes: int = 65536) -> bytes: + return await self.receive_stream.receive(max_bytes) + + async def send(self, item: bytes) -> None: + await self.send_stream.send(item) + + async def send_eof(self) -> None: + await self.send_stream.aclose() + + async def aclose(self) -> None: + await self.send_stream.aclose() + await self.receive_stream.aclose() + + @property + def extra_attributes(self) -> Mapping[Any, Callable[[], Any]]: + return { + **self.send_stream.extra_attributes, + **self.receive_stream.extra_attributes, + } + + +@dataclass(eq=False) +class StapledObjectStream(Generic[T_Item], ObjectStream[T_Item]): + """ + Combines two object streams into a single, bidirectional object stream. + + Extra attributes will be provided from both streams, with the receive stream + providing the values in case of a conflict. + + :param ObjectSendStream send_stream: the sending object stream + :param ObjectReceiveStream receive_stream: the receiving object stream + """ + + send_stream: ObjectSendStream[T_Item] + receive_stream: ObjectReceiveStream[T_Item] + + async def receive(self) -> T_Item: + return await self.receive_stream.receive() + + async def send(self, item: T_Item) -> None: + await self.send_stream.send(item) + + async def send_eof(self) -> None: + await self.send_stream.aclose() + + async def aclose(self) -> None: + await self.send_stream.aclose() + await self.receive_stream.aclose() + + @property + def extra_attributes(self) -> Mapping[Any, Callable[[], Any]]: + return { + **self.send_stream.extra_attributes, + **self.receive_stream.extra_attributes, + } + + +@dataclass(eq=False) +class MultiListener(Generic[T_Stream], Listener[T_Stream]): + """ + Combines multiple listeners into one, serving connections from all of them at once. + + Any MultiListeners in the given collection of listeners will have their listeners + moved into this one. + + Extra attributes are provided from each listener, with each successive listener + overriding any conflicting attributes from the previous one. + + :param listeners: listeners to serve + :type listeners: Sequence[Listener[T_Stream]] + """ + + listeners: Sequence[Listener[T_Stream]] + + def __post_init__(self) -> None: + listeners: list[Listener[T_Stream]] = [] + for listener in self.listeners: + if isinstance(listener, MultiListener): + listeners.extend(listener.listeners) + del listener.listeners[:] # type: ignore[attr-defined] + else: + listeners.append(listener) + + self.listeners = listeners + + async def serve( + self, handler: Callable[[T_Stream], Any], task_group: TaskGroup | None = None + ) -> None: + from .. import create_task_group + + async with create_task_group() as tg: + for listener in self.listeners: + tg.start_soon(listener.serve, handler, task_group) + + async def aclose(self) -> None: + for listener in self.listeners: + await listener.aclose() + + @property + def extra_attributes(self) -> Mapping[Any, Callable[[], Any]]: + attributes: dict = {} + for listener in self.listeners: + attributes.update(listener.extra_attributes) + + return attributes diff --git a/venv/lib/python3.11/site-packages/anyio/streams/text.py b/venv/lib/python3.11/site-packages/anyio/streams/text.py new file mode 100644 index 0000000..296cd25 --- /dev/null +++ b/venv/lib/python3.11/site-packages/anyio/streams/text.py @@ -0,0 +1,176 @@ +from __future__ import annotations + +__all__ = ( + "TextConnectable", + "TextReceiveStream", + "TextSendStream", + "TextStream", +) + +import codecs +import sys +from collections.abc import Callable, Mapping +from dataclasses import InitVar, dataclass, field +from typing import Any + +from ..abc import ( + AnyByteReceiveStream, + AnyByteSendStream, + AnyByteStream, + AnyByteStreamConnectable, + ObjectReceiveStream, + ObjectSendStream, + ObjectStream, + ObjectStreamConnectable, +) + +if sys.version_info >= (3, 12): + from typing import override +else: + from typing_extensions import override + + +@dataclass(eq=False) +class TextReceiveStream(ObjectReceiveStream[str]): + """ + Stream wrapper that decodes bytes to strings using the given encoding. + + Decoding is done using :class:`~codecs.IncrementalDecoder` which returns any + completely received unicode characters as soon as they come in. + + :param transport_stream: any bytes-based receive stream + :param encoding: character encoding to use for decoding bytes to strings (defaults + to ``utf-8``) + :param errors: handling scheme for decoding errors (defaults to ``strict``; see the + `codecs module documentation`_ for a comprehensive list of options) + + .. _codecs module documentation: + https://docs.python.org/3/library/codecs.html#codec-objects + """ + + transport_stream: AnyByteReceiveStream + encoding: InitVar[str] = "utf-8" + errors: InitVar[str] = "strict" + _decoder: codecs.IncrementalDecoder = field(init=False) + + def __post_init__(self, encoding: str, errors: str) -> None: + decoder_class = codecs.getincrementaldecoder(encoding) + self._decoder = decoder_class(errors=errors) + + async def receive(self) -> str: + while True: + chunk = await self.transport_stream.receive() + decoded = self._decoder.decode(chunk) + if decoded: + return decoded + + async def aclose(self) -> None: + await self.transport_stream.aclose() + self._decoder.reset() + + @property + def extra_attributes(self) -> Mapping[Any, Callable[[], Any]]: + return self.transport_stream.extra_attributes + + +@dataclass(eq=False) +class TextSendStream(ObjectSendStream[str]): + """ + Sends strings to the wrapped stream as bytes using the given encoding. + + :param AnyByteSendStream transport_stream: any bytes-based send stream + :param str encoding: character encoding to use for encoding strings to bytes + (defaults to ``utf-8``) + :param str errors: handling scheme for encoding errors (defaults to ``strict``; see + the `codecs module documentation`_ for a comprehensive list of options) + + .. _codecs module documentation: + https://docs.python.org/3/library/codecs.html#codec-objects + """ + + transport_stream: AnyByteSendStream + encoding: InitVar[str] = "utf-8" + errors: str = "strict" + _encoder: Callable[..., tuple[bytes, int]] = field(init=False) + + def __post_init__(self, encoding: str) -> None: + self._encoder = codecs.getencoder(encoding) + + async def send(self, item: str) -> None: + encoded = self._encoder(item, self.errors)[0] + await self.transport_stream.send(encoded) + + async def aclose(self) -> None: + await self.transport_stream.aclose() + + @property + def extra_attributes(self) -> Mapping[Any, Callable[[], Any]]: + return self.transport_stream.extra_attributes + + +@dataclass(eq=False) +class TextStream(ObjectStream[str]): + """ + A bidirectional stream that decodes bytes to strings on receive and encodes strings + to bytes on send. + + Extra attributes will be provided from both streams, with the receive stream + providing the values in case of a conflict. + + :param AnyByteStream transport_stream: any bytes-based stream + :param str encoding: character encoding to use for encoding/decoding strings to/from + bytes (defaults to ``utf-8``) + :param str errors: handling scheme for encoding errors (defaults to ``strict``; see + the `codecs module documentation`_ for a comprehensive list of options) + + .. _codecs module documentation: + https://docs.python.org/3/library/codecs.html#codec-objects + """ + + transport_stream: AnyByteStream + encoding: InitVar[str] = "utf-8" + errors: InitVar[str] = "strict" + _receive_stream: TextReceiveStream = field(init=False) + _send_stream: TextSendStream = field(init=False) + + def __post_init__(self, encoding: str, errors: str) -> None: + self._receive_stream = TextReceiveStream( + self.transport_stream, encoding=encoding, errors=errors + ) + self._send_stream = TextSendStream( + self.transport_stream, encoding=encoding, errors=errors + ) + + async def receive(self) -> str: + return await self._receive_stream.receive() + + async def send(self, item: str) -> None: + await self._send_stream.send(item) + + async def send_eof(self) -> None: + await self.transport_stream.send_eof() + + async def aclose(self) -> None: + await self._send_stream.aclose() + await self._receive_stream.aclose() + + @property + def extra_attributes(self) -> Mapping[Any, Callable[[], Any]]: + return { + **self._send_stream.extra_attributes, + **self._receive_stream.extra_attributes, + } + + +class TextConnectable(ObjectStreamConnectable[str]): + def __init__(self, connectable: AnyByteStreamConnectable): + """ + :param connectable: the bytestream endpoint to wrap + + """ + self.connectable = connectable + + @override + async def connect(self) -> TextStream: + stream = await self.connectable.connect() + return TextStream(stream) diff --git a/venv/lib/python3.11/site-packages/anyio/streams/tls.py b/venv/lib/python3.11/site-packages/anyio/streams/tls.py new file mode 100644 index 0000000..b507488 --- /dev/null +++ b/venv/lib/python3.11/site-packages/anyio/streams/tls.py @@ -0,0 +1,424 @@ +from __future__ import annotations + +__all__ = ( + "TLSAttribute", + "TLSConnectable", + "TLSListener", + "TLSStream", +) + +import logging +import re +import ssl +import sys +from collections.abc import Callable, Mapping +from dataclasses import dataclass +from functools import wraps +from ssl import SSLContext +from typing import Any, TypeVar + +from .. import ( + BrokenResourceError, + EndOfStream, + aclose_forcefully, + get_cancelled_exc_class, + to_thread, +) +from .._core._typedattr import TypedAttributeSet, typed_attribute +from ..abc import ( + AnyByteStream, + AnyByteStreamConnectable, + ByteStream, + ByteStreamConnectable, + Listener, + TaskGroup, +) + +if sys.version_info >= (3, 10): + from typing import TypeAlias +else: + from typing_extensions import TypeAlias + +if sys.version_info >= (3, 11): + from typing import TypeVarTuple, Unpack +else: + from typing_extensions import TypeVarTuple, Unpack + +if sys.version_info >= (3, 12): + from typing import override +else: + from typing_extensions import override + +T_Retval = TypeVar("T_Retval") +PosArgsT = TypeVarTuple("PosArgsT") +_PCTRTT: TypeAlias = tuple[tuple[str, str], ...] +_PCTRTTT: TypeAlias = tuple[_PCTRTT, ...] + + +class TLSAttribute(TypedAttributeSet): + """Contains Transport Layer Security related attributes.""" + + #: the selected ALPN protocol + alpn_protocol: str | None = typed_attribute() + #: the channel binding for type ``tls-unique`` + channel_binding_tls_unique: bytes = typed_attribute() + #: the selected cipher + cipher: tuple[str, str, int] = typed_attribute() + #: the peer certificate in dictionary form (see :meth:`ssl.SSLSocket.getpeercert` + # for more information) + peer_certificate: None | (dict[str, str | _PCTRTTT | _PCTRTT]) = typed_attribute() + #: the peer certificate in binary form + peer_certificate_binary: bytes | None = typed_attribute() + #: ``True`` if this is the server side of the connection + server_side: bool = typed_attribute() + #: ciphers shared by the client during the TLS handshake (``None`` if this is the + #: client side) + shared_ciphers: list[tuple[str, str, int]] | None = typed_attribute() + #: the :class:`~ssl.SSLObject` used for encryption + ssl_object: ssl.SSLObject = typed_attribute() + #: ``True`` if this stream does (and expects) a closing TLS handshake when the + #: stream is being closed + standard_compatible: bool = typed_attribute() + #: the TLS protocol version (e.g. ``TLSv1.2``) + tls_version: str = typed_attribute() + + +@dataclass(eq=False) +class TLSStream(ByteStream): + """ + A stream wrapper that encrypts all sent data and decrypts received data. + + This class has no public initializer; use :meth:`wrap` instead. + All extra attributes from :class:`~TLSAttribute` are supported. + + :var AnyByteStream transport_stream: the wrapped stream + + """ + + transport_stream: AnyByteStream + standard_compatible: bool + _ssl_object: ssl.SSLObject + _read_bio: ssl.MemoryBIO + _write_bio: ssl.MemoryBIO + + @classmethod + async def wrap( + cls, + transport_stream: AnyByteStream, + *, + server_side: bool | None = None, + hostname: str | None = None, + ssl_context: ssl.SSLContext | None = None, + standard_compatible: bool = True, + ) -> TLSStream: + """ + Wrap an existing stream with Transport Layer Security. + + This performs a TLS handshake with the peer. + + :param transport_stream: a bytes-transporting stream to wrap + :param server_side: ``True`` if this is the server side of the connection, + ``False`` if this is the client side (if omitted, will be set to ``False`` + if ``hostname`` has been provided, ``False`` otherwise). Used only to create + a default context when an explicit context has not been provided. + :param hostname: host name of the peer (if host name checking is desired) + :param ssl_context: the SSLContext object to use (if not provided, a secure + default will be created) + :param standard_compatible: if ``False``, skip the closing handshake when + closing the connection, and don't raise an exception if the peer does the + same + :raises ~ssl.SSLError: if the TLS handshake fails + + """ + if server_side is None: + server_side = not hostname + + if not ssl_context: + purpose = ( + ssl.Purpose.CLIENT_AUTH if server_side else ssl.Purpose.SERVER_AUTH + ) + ssl_context = ssl.create_default_context(purpose) + + # Re-enable detection of unexpected EOFs if it was disabled by Python + if hasattr(ssl, "OP_IGNORE_UNEXPECTED_EOF"): + ssl_context.options &= ~ssl.OP_IGNORE_UNEXPECTED_EOF + + bio_in = ssl.MemoryBIO() + bio_out = ssl.MemoryBIO() + + # External SSLContext implementations may do blocking I/O in wrap_bio(), + # but the standard library implementation won't + if type(ssl_context) is ssl.SSLContext: + ssl_object = ssl_context.wrap_bio( + bio_in, bio_out, server_side=server_side, server_hostname=hostname + ) + else: + ssl_object = await to_thread.run_sync( + ssl_context.wrap_bio, + bio_in, + bio_out, + server_side, + hostname, + None, + ) + + wrapper = cls( + transport_stream=transport_stream, + standard_compatible=standard_compatible, + _ssl_object=ssl_object, + _read_bio=bio_in, + _write_bio=bio_out, + ) + await wrapper._call_sslobject_method(ssl_object.do_handshake) + return wrapper + + async def _call_sslobject_method( + self, func: Callable[[Unpack[PosArgsT]], T_Retval], *args: Unpack[PosArgsT] + ) -> T_Retval: + while True: + try: + result = func(*args) + except ssl.SSLWantReadError: + try: + # Flush any pending writes first + if self._write_bio.pending: + await self.transport_stream.send(self._write_bio.read()) + + data = await self.transport_stream.receive() + except EndOfStream: + self._read_bio.write_eof() + except OSError as exc: + self._read_bio.write_eof() + self._write_bio.write_eof() + raise BrokenResourceError from exc + else: + self._read_bio.write(data) + except ssl.SSLWantWriteError: + await self.transport_stream.send(self._write_bio.read()) + except ssl.SSLSyscallError as exc: + self._read_bio.write_eof() + self._write_bio.write_eof() + raise BrokenResourceError from exc + except ssl.SSLError as exc: + self._read_bio.write_eof() + self._write_bio.write_eof() + if isinstance(exc, ssl.SSLEOFError) or ( + exc.strerror and "UNEXPECTED_EOF_WHILE_READING" in exc.strerror + ): + if self.standard_compatible: + raise BrokenResourceError from exc + else: + raise EndOfStream from None + + raise + else: + # Flush any pending writes first + if self._write_bio.pending: + await self.transport_stream.send(self._write_bio.read()) + + return result + + async def unwrap(self) -> tuple[AnyByteStream, bytes]: + """ + Does the TLS closing handshake. + + :return: a tuple of (wrapped byte stream, bytes left in the read buffer) + + """ + await self._call_sslobject_method(self._ssl_object.unwrap) + self._read_bio.write_eof() + self._write_bio.write_eof() + return self.transport_stream, self._read_bio.read() + + async def aclose(self) -> None: + if self.standard_compatible: + try: + await self.unwrap() + except BaseException: + await aclose_forcefully(self.transport_stream) + raise + + await self.transport_stream.aclose() + + async def receive(self, max_bytes: int = 65536) -> bytes: + data = await self._call_sslobject_method(self._ssl_object.read, max_bytes) + if not data: + raise EndOfStream + + return data + + async def send(self, item: bytes) -> None: + await self._call_sslobject_method(self._ssl_object.write, item) + + async def send_eof(self) -> None: + tls_version = self.extra(TLSAttribute.tls_version) + match = re.match(r"TLSv(\d+)(?:\.(\d+))?", tls_version) + if match: + major, minor = int(match.group(1)), int(match.group(2) or 0) + if (major, minor) < (1, 3): + raise NotImplementedError( + f"send_eof() requires at least TLSv1.3; current " + f"session uses {tls_version}" + ) + + raise NotImplementedError( + "send_eof() has not yet been implemented for TLS streams" + ) + + @property + def extra_attributes(self) -> Mapping[Any, Callable[[], Any]]: + return { + **self.transport_stream.extra_attributes, + TLSAttribute.alpn_protocol: self._ssl_object.selected_alpn_protocol, + TLSAttribute.channel_binding_tls_unique: ( + self._ssl_object.get_channel_binding + ), + TLSAttribute.cipher: self._ssl_object.cipher, + TLSAttribute.peer_certificate: lambda: self._ssl_object.getpeercert(False), + TLSAttribute.peer_certificate_binary: lambda: self._ssl_object.getpeercert( + True + ), + TLSAttribute.server_side: lambda: self._ssl_object.server_side, + TLSAttribute.shared_ciphers: lambda: self._ssl_object.shared_ciphers() + if self._ssl_object.server_side + else None, + TLSAttribute.standard_compatible: lambda: self.standard_compatible, + TLSAttribute.ssl_object: lambda: self._ssl_object, + TLSAttribute.tls_version: self._ssl_object.version, + } + + +@dataclass(eq=False) +class TLSListener(Listener[TLSStream]): + """ + A convenience listener that wraps another listener and auto-negotiates a TLS session + on every accepted connection. + + If the TLS handshake times out or raises an exception, + :meth:`handle_handshake_error` is called to do whatever post-mortem processing is + deemed necessary. + + Supports only the :attr:`~TLSAttribute.standard_compatible` extra attribute. + + :param Listener listener: the listener to wrap + :param ssl_context: the SSL context object + :param standard_compatible: a flag passed through to :meth:`TLSStream.wrap` + :param handshake_timeout: time limit for the TLS handshake + (passed to :func:`~anyio.fail_after`) + """ + + listener: Listener[Any] + ssl_context: ssl.SSLContext + standard_compatible: bool = True + handshake_timeout: float = 30 + + @staticmethod + async def handle_handshake_error(exc: BaseException, stream: AnyByteStream) -> None: + """ + Handle an exception raised during the TLS handshake. + + This method does 3 things: + + #. Forcefully closes the original stream + #. Logs the exception (unless it was a cancellation exception) using the + ``anyio.streams.tls`` logger + #. Reraises the exception if it was a base exception or a cancellation exception + + :param exc: the exception + :param stream: the original stream + + """ + await aclose_forcefully(stream) + + # Log all except cancellation exceptions + if not isinstance(exc, get_cancelled_exc_class()): + # CPython (as of 3.11.5) returns incorrect `sys.exc_info()` here when using + # any asyncio implementation, so we explicitly pass the exception to log + # (https://github.com/python/cpython/issues/108668). Trio does not have this + # issue because it works around the CPython bug. + logging.getLogger(__name__).exception( + "Error during TLS handshake", exc_info=exc + ) + + # Only reraise base exceptions and cancellation exceptions + if not isinstance(exc, Exception) or isinstance(exc, get_cancelled_exc_class()): + raise + + async def serve( + self, + handler: Callable[[TLSStream], Any], + task_group: TaskGroup | None = None, + ) -> None: + @wraps(handler) + async def handler_wrapper(stream: AnyByteStream) -> None: + from .. import fail_after + + try: + with fail_after(self.handshake_timeout): + wrapped_stream = await TLSStream.wrap( + stream, + ssl_context=self.ssl_context, + standard_compatible=self.standard_compatible, + ) + except BaseException as exc: + await self.handle_handshake_error(exc, stream) + else: + await handler(wrapped_stream) + + await self.listener.serve(handler_wrapper, task_group) + + async def aclose(self) -> None: + await self.listener.aclose() + + @property + def extra_attributes(self) -> Mapping[Any, Callable[[], Any]]: + return { + TLSAttribute.standard_compatible: lambda: self.standard_compatible, + } + + +class TLSConnectable(ByteStreamConnectable): + """ + Wraps another connectable and does TLS negotiation after a successful connection. + + :param connectable: the connectable to wrap + :param hostname: host name of the server (if host name checking is desired) + :param ssl_context: the SSLContext object to use (if not provided, a secure default + will be created) + :param standard_compatible: if ``False``, skip the closing handshake when closing + the connection, and don't raise an exception if the server does the same + """ + + def __init__( + self, + connectable: AnyByteStreamConnectable, + *, + hostname: str | None = None, + ssl_context: ssl.SSLContext | None = None, + standard_compatible: bool = True, + ) -> None: + self.connectable = connectable + self.ssl_context: SSLContext = ssl_context or ssl.create_default_context( + ssl.Purpose.SERVER_AUTH + ) + if not isinstance(self.ssl_context, ssl.SSLContext): + raise TypeError( + "ssl_context must be an instance of ssl.SSLContext, not " + f"{type(self.ssl_context).__name__}" + ) + self.hostname = hostname + self.standard_compatible = standard_compatible + + @override + async def connect(self) -> TLSStream: + stream = await self.connectable.connect() + try: + return await TLSStream.wrap( + stream, + hostname=self.hostname, + ssl_context=self.ssl_context, + standard_compatible=self.standard_compatible, + ) + except BaseException: + await aclose_forcefully(stream) + raise diff --git a/venv/lib/python3.11/site-packages/anyio/to_interpreter.py b/venv/lib/python3.11/site-packages/anyio/to_interpreter.py new file mode 100644 index 0000000..694dbe7 --- /dev/null +++ b/venv/lib/python3.11/site-packages/anyio/to_interpreter.py @@ -0,0 +1,246 @@ +from __future__ import annotations + +__all__ = ( + "run_sync", + "current_default_interpreter_limiter", +) + +import atexit +import os +import sys +from collections import deque +from collections.abc import Callable +from typing import Any, Final, TypeVar + +from . import current_time, to_thread +from ._core._exceptions import BrokenWorkerInterpreter +from ._core._synchronization import CapacityLimiter +from .lowlevel import RunVar + +if sys.version_info >= (3, 11): + from typing import TypeVarTuple, Unpack +else: + from typing_extensions import TypeVarTuple, Unpack + +if sys.version_info >= (3, 14): + from concurrent.interpreters import ExecutionFailed, create + + def _interp_call( + func: Callable[..., Any], args: tuple[Any, ...] + ) -> tuple[Any, bool]: + try: + retval = func(*args) + except BaseException as exc: + return exc, True + else: + return retval, False + + class _Worker: + last_used: float = 0 + + def __init__(self) -> None: + self._interpreter = create() + + def destroy(self) -> None: + self._interpreter.close() + + def call( + self, + func: Callable[..., T_Retval], + args: tuple[Any, ...], + ) -> T_Retval: + try: + res, is_exception = self._interpreter.call(_interp_call, func, args) + except ExecutionFailed as exc: + raise BrokenWorkerInterpreter(exc.excinfo) from exc + + if is_exception: + raise res + + return res +elif sys.version_info >= (3, 13): + import _interpqueues + import _interpreters + + UNBOUND: Final = 2 # I have no clue how this works, but it was used in the stdlib + FMT_UNPICKLED: Final = 0 + FMT_PICKLED: Final = 1 + QUEUE_PICKLE_ARGS: Final = (FMT_PICKLED, UNBOUND) + QUEUE_UNPICKLE_ARGS: Final = (FMT_UNPICKLED, UNBOUND) + + _run_func = compile( + """ +import _interpqueues +from _interpreters import NotShareableError +from pickle import loads, dumps, HIGHEST_PROTOCOL + +QUEUE_PICKLE_ARGS = (1, 2) +QUEUE_UNPICKLE_ARGS = (0, 2) + +item = _interpqueues.get(queue_id)[0] +try: + func, args = loads(item) + retval = func(*args) +except BaseException as exc: + is_exception = True + retval = exc +else: + is_exception = False + +try: + _interpqueues.put(queue_id, (retval, is_exception), *QUEUE_UNPICKLE_ARGS) +except NotShareableError: + retval = dumps(retval, HIGHEST_PROTOCOL) + _interpqueues.put(queue_id, (retval, is_exception), *QUEUE_PICKLE_ARGS) + """, + "", + "exec", + ) + + class _Worker: + last_used: float = 0 + + def __init__(self) -> None: + self._interpreter_id = _interpreters.create() + self._queue_id = _interpqueues.create(1, *QUEUE_UNPICKLE_ARGS) + _interpreters.set___main___attrs( + self._interpreter_id, {"queue_id": self._queue_id} + ) + + def destroy(self) -> None: + _interpqueues.destroy(self._queue_id) + _interpreters.destroy(self._interpreter_id) + + def call( + self, + func: Callable[..., T_Retval], + args: tuple[Any, ...], + ) -> T_Retval: + import pickle + + item = pickle.dumps((func, args), pickle.HIGHEST_PROTOCOL) + _interpqueues.put(self._queue_id, item, *QUEUE_PICKLE_ARGS) + exc_info = _interpreters.exec(self._interpreter_id, _run_func) + if exc_info: + raise BrokenWorkerInterpreter(exc_info) + + res = _interpqueues.get(self._queue_id) + (res, is_exception), fmt = res[:2] + if fmt == FMT_PICKLED: + res = pickle.loads(res) + + if is_exception: + raise res + + return res +else: + + class _Worker: + last_used: float = 0 + + def __init__(self) -> None: + raise RuntimeError("subinterpreters require at least Python 3.13") + + def call( + self, + func: Callable[..., T_Retval], + args: tuple[Any, ...], + ) -> T_Retval: + raise NotImplementedError + + def destroy(self) -> None: + pass + + +DEFAULT_CPU_COUNT: Final = 8 # this is just an arbitrarily selected value +MAX_WORKER_IDLE_TIME = ( + 30 # seconds a subinterpreter can be idle before becoming eligible for pruning +) + +T_Retval = TypeVar("T_Retval") +PosArgsT = TypeVarTuple("PosArgsT") + +_idle_workers = RunVar[deque[_Worker]]("_available_workers") +_default_interpreter_limiter = RunVar[CapacityLimiter]("_default_interpreter_limiter") + + +def _stop_workers(workers: deque[_Worker]) -> None: + for worker in workers: + worker.destroy() + + workers.clear() + + +async def run_sync( + func: Callable[[Unpack[PosArgsT]], T_Retval], + *args: Unpack[PosArgsT], + limiter: CapacityLimiter | None = None, +) -> T_Retval: + """ + Call the given function with the given arguments in a subinterpreter. + + .. warning:: On Python 3.13, the :mod:`concurrent.interpreters` module was not yet + available, so the code path for that Python version relies on an undocumented, + private API. As such, it is recommended to not rely on this function for anything + mission-critical on Python 3.13. + + :param func: a callable + :param args: the positional arguments for the callable + :param limiter: capacity limiter to use to limit the total number of subinterpreters + running (if omitted, the default limiter is used) + :return: the result of the call + :raises BrokenWorkerInterpreter: if there's an internal error in a subinterpreter + + """ + if limiter is None: + limiter = current_default_interpreter_limiter() + + try: + idle_workers = _idle_workers.get() + except LookupError: + idle_workers = deque() + _idle_workers.set(idle_workers) + atexit.register(_stop_workers, idle_workers) + + async with limiter: + try: + worker = idle_workers.pop() + except IndexError: + worker = _Worker() + + try: + return await to_thread.run_sync( + worker.call, + func, + args, + limiter=limiter, + ) + finally: + # Prune workers that have been idle for too long + now = current_time() + while idle_workers: + if now - idle_workers[0].last_used <= MAX_WORKER_IDLE_TIME: + break + + await to_thread.run_sync(idle_workers.popleft().destroy, limiter=limiter) + + worker.last_used = current_time() + idle_workers.append(worker) + + +def current_default_interpreter_limiter() -> CapacityLimiter: + """ + Return the capacity limiter used by default to limit the number of concurrently + running subinterpreters. + + Defaults to the number of CPU cores. + + :return: a capacity limiter object + + """ + try: + return _default_interpreter_limiter.get() + except LookupError: + limiter = CapacityLimiter(os.cpu_count() or DEFAULT_CPU_COUNT) + _default_interpreter_limiter.set(limiter) + return limiter diff --git a/venv/lib/python3.11/site-packages/anyio/to_process.py b/venv/lib/python3.11/site-packages/anyio/to_process.py new file mode 100644 index 0000000..b289234 --- /dev/null +++ b/venv/lib/python3.11/site-packages/anyio/to_process.py @@ -0,0 +1,266 @@ +from __future__ import annotations + +__all__ = ( + "current_default_process_limiter", + "process_worker", + "run_sync", +) + +import os +import pickle +import subprocess +import sys +from collections import deque +from collections.abc import Callable +from importlib.util import module_from_spec, spec_from_file_location +from typing import TypeVar, cast + +from ._core._eventloop import current_time, get_async_backend, get_cancelled_exc_class +from ._core._exceptions import BrokenWorkerProcess +from ._core._subprocesses import open_process +from ._core._synchronization import CapacityLimiter +from ._core._tasks import CancelScope, fail_after +from .abc import ByteReceiveStream, ByteSendStream, Process +from .lowlevel import RunVar, checkpoint_if_cancelled +from .streams.buffered import BufferedByteReceiveStream + +if sys.version_info >= (3, 11): + from typing import TypeVarTuple, Unpack +else: + from typing_extensions import TypeVarTuple, Unpack + +WORKER_MAX_IDLE_TIME = 300 # 5 minutes + +T_Retval = TypeVar("T_Retval") +PosArgsT = TypeVarTuple("PosArgsT") + +_process_pool_workers: RunVar[set[Process]] = RunVar("_process_pool_workers") +_process_pool_idle_workers: RunVar[deque[tuple[Process, float]]] = RunVar( + "_process_pool_idle_workers" +) +_default_process_limiter: RunVar[CapacityLimiter] = RunVar("_default_process_limiter") + + +async def run_sync( # type: ignore[return] + func: Callable[[Unpack[PosArgsT]], T_Retval], + *args: Unpack[PosArgsT], + cancellable: bool = False, + limiter: CapacityLimiter | None = None, +) -> T_Retval: + """ + Call the given function with the given arguments in a worker process. + + If the ``cancellable`` option is enabled and the task waiting for its completion is + cancelled, the worker process running it will be abruptly terminated using SIGKILL + (or ``terminateProcess()`` on Windows). + + :param func: a callable + :param args: positional arguments for the callable + :param cancellable: ``True`` to allow cancellation of the operation while it's + running + :param limiter: capacity limiter to use to limit the total amount of processes + running (if omitted, the default limiter is used) + :raises NoEventLoopError: if no supported asynchronous event loop is running in the + current thread + :return: an awaitable that yields the return value of the function. + + """ + + async def send_raw_command(pickled_cmd: bytes) -> object: + try: + await stdin.send(pickled_cmd) + response = await buffered.receive_until(b"\n", 50) + status, length = response.split(b" ") + if status not in (b"RETURN", b"EXCEPTION"): + raise RuntimeError( + f"Worker process returned unexpected response: {response!r}" + ) + + pickled_response = await buffered.receive_exactly(int(length)) + except BaseException as exc: + workers.discard(process) + try: + process.kill() + with CancelScope(shield=True): + await process.aclose() + except ProcessLookupError: + pass + + if isinstance(exc, get_cancelled_exc_class()): + raise + else: + raise BrokenWorkerProcess from exc + + retval = pickle.loads(pickled_response) + if status == b"EXCEPTION": + assert isinstance(retval, BaseException) + raise retval + else: + return retval + + # First pickle the request before trying to reserve a worker process + await checkpoint_if_cancelled() + request = pickle.dumps(("run", func, args), protocol=pickle.HIGHEST_PROTOCOL) + + # If this is the first run in this event loop thread, set up the necessary variables + try: + workers = _process_pool_workers.get() + idle_workers = _process_pool_idle_workers.get() + except LookupError: + workers = set() + idle_workers = deque() + _process_pool_workers.set(workers) + _process_pool_idle_workers.set(idle_workers) + get_async_backend().setup_process_pool_exit_at_shutdown(workers) + + async with limiter or current_default_process_limiter(): + # Pop processes from the pool (starting from the most recently used) until we + # find one that hasn't exited yet + process: Process + while idle_workers: + process, idle_since = idle_workers.pop() + if process.returncode is None: + stdin = cast(ByteSendStream, process.stdin) + buffered = BufferedByteReceiveStream( + cast(ByteReceiveStream, process.stdout) + ) + + # Prune any other workers that have been idle for WORKER_MAX_IDLE_TIME + # seconds or longer + now = current_time() + killed_processes: list[Process] = [] + while idle_workers: + if now - idle_workers[0][1] < WORKER_MAX_IDLE_TIME: + break + + process_to_kill, idle_since = idle_workers.popleft() + process_to_kill.kill() + workers.remove(process_to_kill) + killed_processes.append(process_to_kill) + + with CancelScope(shield=True): + for killed_process in killed_processes: + await killed_process.aclose() + + break + + workers.remove(process) + else: + command = [sys.executable, "-u", "-m", __name__] + process = await open_process( + command, stdin=subprocess.PIPE, stdout=subprocess.PIPE + ) + try: + stdin = cast(ByteSendStream, process.stdin) + buffered = BufferedByteReceiveStream( + cast(ByteReceiveStream, process.stdout) + ) + with fail_after(20): + message = await buffered.receive(6) + + if message != b"READY\n": + raise BrokenWorkerProcess( + f"Worker process returned unexpected response: {message!r}" + ) + + main_module_path = getattr(sys.modules["__main__"], "__file__", None) + pickled = pickle.dumps( + ("init", sys.path, main_module_path), + protocol=pickle.HIGHEST_PROTOCOL, + ) + await send_raw_command(pickled) + except (BrokenWorkerProcess, get_cancelled_exc_class()): + raise + except BaseException as exc: + process.kill() + raise BrokenWorkerProcess( + "Error during worker process initialization" + ) from exc + + workers.add(process) + + with CancelScope(shield=not cancellable): + try: + return cast(T_Retval, await send_raw_command(request)) + finally: + if process in workers: + idle_workers.append((process, current_time())) + + +def current_default_process_limiter() -> CapacityLimiter: + """ + Return the capacity limiter that is used by default to limit the number of worker + processes. + + :return: a capacity limiter object + + """ + try: + return _default_process_limiter.get() + except LookupError: + limiter = CapacityLimiter(os.cpu_count() or 2) + _default_process_limiter.set(limiter) + return limiter + + +def process_worker() -> None: + # Redirect standard streams to os.devnull so that user code won't interfere with the + # parent-worker communication + stdin = sys.stdin + stdout = sys.stdout + sys.stdin = open(os.devnull) + sys.stdout = open(os.devnull, "w") + + stdout.buffer.write(b"READY\n") + while True: + retval = exception = None + try: + command, *args = pickle.load(stdin.buffer) + except EOFError: + return + except BaseException as exc: + exception = exc + else: + if command == "run": + func, args = args + try: + retval = func(*args) + except BaseException as exc: + exception = exc + elif command == "init": + main_module_path: str | None + sys.path, main_module_path = args + del sys.modules["__main__"] + if main_module_path and os.path.isfile(main_module_path): + # Load the parent's main module but as __mp_main__ instead of + # __main__ (like multiprocessing does) to avoid infinite recursion + try: + spec = spec_from_file_location("__mp_main__", main_module_path) + if spec and spec.loader: + main = module_from_spec(spec) + spec.loader.exec_module(main) + sys.modules["__main__"] = main + except BaseException as exc: + exception = exc + try: + if exception is not None: + status = b"EXCEPTION" + pickled = pickle.dumps(exception, pickle.HIGHEST_PROTOCOL) + else: + status = b"RETURN" + pickled = pickle.dumps(retval, pickle.HIGHEST_PROTOCOL) + except BaseException as exc: + exception = exc + status = b"EXCEPTION" + pickled = pickle.dumps(exc, pickle.HIGHEST_PROTOCOL) + + stdout.buffer.write(b"%s %d\n" % (status, len(pickled))) + stdout.buffer.write(pickled) + + # Respect SIGTERM + if isinstance(exception, SystemExit): + raise exception + + +if __name__ == "__main__": + process_worker() diff --git a/venv/lib/python3.11/site-packages/anyio/to_thread.py b/venv/lib/python3.11/site-packages/anyio/to_thread.py new file mode 100644 index 0000000..4be5b71 --- /dev/null +++ b/venv/lib/python3.11/site-packages/anyio/to_thread.py @@ -0,0 +1,78 @@ +from __future__ import annotations + +__all__ = ( + "run_sync", + "current_default_thread_limiter", +) + +import sys +from collections.abc import Callable +from typing import TypeVar +from warnings import warn + +from ._core._eventloop import get_async_backend +from .abc import CapacityLimiter + +if sys.version_info >= (3, 11): + from typing import TypeVarTuple, Unpack +else: + from typing_extensions import TypeVarTuple, Unpack + +T_Retval = TypeVar("T_Retval") +PosArgsT = TypeVarTuple("PosArgsT") + + +async def run_sync( + func: Callable[[Unpack[PosArgsT]], T_Retval], + *args: Unpack[PosArgsT], + abandon_on_cancel: bool = False, + cancellable: bool | None = None, + limiter: CapacityLimiter | None = None, +) -> T_Retval: + """ + Call the given function with the given arguments in a worker thread. + + If the ``cancellable`` option is enabled and the task waiting for its completion is + cancelled, the thread will still run its course but its return value (or any raised + exception) will be ignored. + + :param func: a callable + :param args: positional arguments for the callable + :param abandon_on_cancel: ``True`` to abandon the thread (leaving it to run + unchecked on own) if the host task is cancelled, ``False`` to ignore + cancellations in the host task until the operation has completed in the worker + thread + :param cancellable: deprecated alias of ``abandon_on_cancel``; will override + ``abandon_on_cancel`` if both parameters are passed + :param limiter: capacity limiter to use to limit the total amount of threads running + (if omitted, the default limiter is used) + :raises NoEventLoopError: if no supported asynchronous event loop is running in the + current thread + :return: an awaitable that yields the return value of the function. + + """ + if cancellable is not None: + abandon_on_cancel = cancellable + warn( + "The `cancellable=` keyword argument to `anyio.to_thread.run_sync` is " + "deprecated since AnyIO 4.1.0; use `abandon_on_cancel=` instead", + DeprecationWarning, + stacklevel=2, + ) + + return await get_async_backend().run_sync_in_worker_thread( + func, args, abandon_on_cancel=abandon_on_cancel, limiter=limiter + ) + + +def current_default_thread_limiter() -> CapacityLimiter: + """ + Return the capacity limiter that is used by default to limit the number of + concurrent threads. + + :return: a capacity limiter object + :raises NoEventLoopError: if no supported asynchronous event loop is running in the + current thread + + """ + return get_async_backend().current_default_thread_limiter() diff --git a/venv/lib/python3.11/site-packages/attr/__init__.py b/venv/lib/python3.11/site-packages/attr/__init__.py new file mode 100644 index 0000000..5c6e065 --- /dev/null +++ b/venv/lib/python3.11/site-packages/attr/__init__.py @@ -0,0 +1,104 @@ +# SPDX-License-Identifier: MIT + +""" +Classes Without Boilerplate +""" + +from functools import partial +from typing import Callable, Literal, Protocol + +from . import converters, exceptions, filters, setters, validators +from ._cmp import cmp_using +from ._config import get_run_validators, set_run_validators +from ._funcs import asdict, assoc, astuple, has, resolve_types +from ._make import ( + NOTHING, + Attribute, + Converter, + Factory, + _Nothing, + attrib, + attrs, + evolve, + fields, + fields_dict, + make_class, + validate, +) +from ._next_gen import define, field, frozen, mutable +from ._version_info import VersionInfo + + +s = attributes = attrs +ib = attr = attrib +dataclass = partial(attrs, auto_attribs=True) # happy Easter ;) + + +class AttrsInstance(Protocol): + pass + + +NothingType = Literal[_Nothing.NOTHING] + +__all__ = [ + "NOTHING", + "Attribute", + "AttrsInstance", + "Converter", + "Factory", + "NothingType", + "asdict", + "assoc", + "astuple", + "attr", + "attrib", + "attributes", + "attrs", + "cmp_using", + "converters", + "define", + "evolve", + "exceptions", + "field", + "fields", + "fields_dict", + "filters", + "frozen", + "get_run_validators", + "has", + "ib", + "make_class", + "mutable", + "resolve_types", + "s", + "set_run_validators", + "setters", + "validate", + "validators", +] + + +def _make_getattr(mod_name: str) -> Callable: + """ + Create a metadata proxy for packaging information that uses *mod_name* in + its warnings and errors. + """ + + def __getattr__(name: str) -> str: + if name not in ("__version__", "__version_info__"): + msg = f"module {mod_name} has no attribute {name}" + raise AttributeError(msg) + + from importlib.metadata import metadata + + meta = metadata("attrs") + + if name == "__version_info__": + return VersionInfo._from_version_string(meta["version"]) + + return meta["version"] + + return __getattr__ + + +__getattr__ = _make_getattr(__name__) diff --git a/venv/lib/python3.11/site-packages/attr/__init__.pyi b/venv/lib/python3.11/site-packages/attr/__init__.pyi new file mode 100644 index 0000000..8d78fa1 --- /dev/null +++ b/venv/lib/python3.11/site-packages/attr/__init__.pyi @@ -0,0 +1,389 @@ +import enum +import sys + +from typing import ( + Any, + Callable, + Generic, + Literal, + Mapping, + Protocol, + Sequence, + TypeVar, + overload, +) + +# `import X as X` is required to make these public +from . import converters as converters +from . import exceptions as exceptions +from . import filters as filters +from . import setters as setters +from . import validators as validators +from ._cmp import cmp_using as cmp_using +from ._typing_compat import AttrsInstance_ +from ._version_info import VersionInfo +from attrs import ( + define as define, + field as field, + mutable as mutable, + frozen as frozen, + _EqOrderType, + _ValidatorType, + _ConverterType, + _ReprArgType, + _OnSetAttrType, + _OnSetAttrArgType, + _FieldTransformer, + _ValidatorArgType, +) + +if sys.version_info >= (3, 10): + from typing import TypeGuard, TypeAlias +else: + from typing_extensions import TypeGuard, TypeAlias + +if sys.version_info >= (3, 11): + from typing import dataclass_transform +else: + from typing_extensions import dataclass_transform + +__version__: str +__version_info__: VersionInfo +__title__: str +__description__: str +__url__: str +__uri__: str +__author__: str +__email__: str +__license__: str +__copyright__: str + +_T = TypeVar("_T") +_C = TypeVar("_C", bound=type) + +_FilterType = Callable[["Attribute[_T]", _T], bool] + +# We subclass this here to keep the protocol's qualified name clean. +class AttrsInstance(AttrsInstance_, Protocol): + pass + +_A = TypeVar("_A", bound=type[AttrsInstance]) + +class _Nothing(enum.Enum): + NOTHING = enum.auto() + +NOTHING = _Nothing.NOTHING +NothingType: TypeAlias = Literal[_Nothing.NOTHING] + +# NOTE: Factory lies about its return type to make this possible: +# `x: List[int] # = Factory(list)` +# Work around mypy issue #4554 in the common case by using an overload. + +@overload +def Factory(factory: Callable[[], _T]) -> _T: ... +@overload +def Factory( + factory: Callable[[Any], _T], + takes_self: Literal[True], +) -> _T: ... +@overload +def Factory( + factory: Callable[[], _T], + takes_self: Literal[False], +) -> _T: ... + +In = TypeVar("In") +Out = TypeVar("Out") + +class Converter(Generic[In, Out]): + @overload + def __init__(self, converter: Callable[[In], Out]) -> None: ... + @overload + def __init__( + self, + converter: Callable[[In, AttrsInstance, Attribute], Out], + *, + takes_self: Literal[True], + takes_field: Literal[True], + ) -> None: ... + @overload + def __init__( + self, + converter: Callable[[In, Attribute], Out], + *, + takes_field: Literal[True], + ) -> None: ... + @overload + def __init__( + self, + converter: Callable[[In, AttrsInstance], Out], + *, + takes_self: Literal[True], + ) -> None: ... + +class Attribute(Generic[_T]): + name: str + default: _T | None + validator: _ValidatorType[_T] | None + repr: _ReprArgType + cmp: _EqOrderType + eq: _EqOrderType + order: _EqOrderType + hash: bool | None + init: bool + converter: Converter | None + metadata: dict[Any, Any] + type: type[_T] | None + kw_only: bool + on_setattr: _OnSetAttrType + alias: str | None + + def evolve(self, **changes: Any) -> "Attribute[Any]": ... + +# NOTE: We had several choices for the annotation to use for type arg: +# 1) Type[_T] +# - Pros: Handles simple cases correctly +# - Cons: Might produce less informative errors in the case of conflicting +# TypeVars e.g. `attr.ib(default='bad', type=int)` +# 2) Callable[..., _T] +# - Pros: Better error messages than #1 for conflicting TypeVars +# - Cons: Terrible error messages for validator checks. +# e.g. attr.ib(type=int, validator=validate_str) +# -> error: Cannot infer function type argument +# 3) type (and do all of the work in the mypy plugin) +# - Pros: Simple here, and we could customize the plugin with our own errors. +# - Cons: Would need to write mypy plugin code to handle all the cases. +# We chose option #1. + +# `attr` lies about its return type to make the following possible: +# attr() -> Any +# attr(8) -> int +# attr(validator=) -> Whatever the callable expects. +# This makes this type of assignments possible: +# x: int = attr(8) +# +# This form catches explicit None or no default but with no other arguments +# returns Any. +@overload +def attrib( + default: None = ..., + validator: None = ..., + repr: _ReprArgType = ..., + cmp: _EqOrderType | None = ..., + hash: bool | None = ..., + init: bool = ..., + metadata: Mapping[Any, Any] | None = ..., + type: None = ..., + converter: None = ..., + factory: None = ..., + kw_only: bool | None = ..., + eq: _EqOrderType | None = ..., + order: _EqOrderType | None = ..., + on_setattr: _OnSetAttrArgType | None = ..., + alias: str | None = ..., +) -> Any: ... + +# This form catches an explicit None or no default and infers the type from the +# other arguments. +@overload +def attrib( + default: None = ..., + validator: _ValidatorArgType[_T] | None = ..., + repr: _ReprArgType = ..., + cmp: _EqOrderType | None = ..., + hash: bool | None = ..., + init: bool = ..., + metadata: Mapping[Any, Any] | None = ..., + type: type[_T] | None = ..., + converter: _ConverterType + | list[_ConverterType] + | tuple[_ConverterType] + | None = ..., + factory: Callable[[], _T] | None = ..., + kw_only: bool | None = ..., + eq: _EqOrderType | None = ..., + order: _EqOrderType | None = ..., + on_setattr: _OnSetAttrArgType | None = ..., + alias: str | None = ..., +) -> _T: ... + +# This form catches an explicit default argument. +@overload +def attrib( + default: _T, + validator: _ValidatorArgType[_T] | None = ..., + repr: _ReprArgType = ..., + cmp: _EqOrderType | None = ..., + hash: bool | None = ..., + init: bool = ..., + metadata: Mapping[Any, Any] | None = ..., + type: type[_T] | None = ..., + converter: _ConverterType + | list[_ConverterType] + | tuple[_ConverterType] + | None = ..., + factory: Callable[[], _T] | None = ..., + kw_only: bool | None = ..., + eq: _EqOrderType | None = ..., + order: _EqOrderType | None = ..., + on_setattr: _OnSetAttrArgType | None = ..., + alias: str | None = ..., +) -> _T: ... + +# This form covers type=non-Type: e.g. forward references (str), Any +@overload +def attrib( + default: _T | None = ..., + validator: _ValidatorArgType[_T] | None = ..., + repr: _ReprArgType = ..., + cmp: _EqOrderType | None = ..., + hash: bool | None = ..., + init: bool = ..., + metadata: Mapping[Any, Any] | None = ..., + type: object = ..., + converter: _ConverterType + | list[_ConverterType] + | tuple[_ConverterType] + | None = ..., + factory: Callable[[], _T] | None = ..., + kw_only: bool | None = ..., + eq: _EqOrderType | None = ..., + order: _EqOrderType | None = ..., + on_setattr: _OnSetAttrArgType | None = ..., + alias: str | None = ..., +) -> Any: ... +@overload +@dataclass_transform(order_default=True, field_specifiers=(attrib, field)) +def attrs( + maybe_cls: _C, + these: dict[str, Any] | None = ..., + repr_ns: str | None = ..., + repr: bool = ..., + cmp: _EqOrderType | None = ..., + hash: bool | None = ..., + init: bool = ..., + slots: bool = ..., + frozen: bool = ..., + weakref_slot: bool = ..., + str: bool = ..., + auto_attribs: bool = ..., + kw_only: bool = ..., + cache_hash: bool = ..., + auto_exc: bool = ..., + eq: _EqOrderType | None = ..., + order: _EqOrderType | None = ..., + auto_detect: bool = ..., + collect_by_mro: bool = ..., + getstate_setstate: bool | None = ..., + on_setattr: _OnSetAttrArgType | None = ..., + field_transformer: _FieldTransformer | None = ..., + match_args: bool = ..., + unsafe_hash: bool | None = ..., +) -> _C: ... +@overload +@dataclass_transform(order_default=True, field_specifiers=(attrib, field)) +def attrs( + maybe_cls: None = ..., + these: dict[str, Any] | None = ..., + repr_ns: str | None = ..., + repr: bool = ..., + cmp: _EqOrderType | None = ..., + hash: bool | None = ..., + init: bool = ..., + slots: bool = ..., + frozen: bool = ..., + weakref_slot: bool = ..., + str: bool = ..., + auto_attribs: bool = ..., + kw_only: bool = ..., + cache_hash: bool = ..., + auto_exc: bool = ..., + eq: _EqOrderType | None = ..., + order: _EqOrderType | None = ..., + auto_detect: bool = ..., + collect_by_mro: bool = ..., + getstate_setstate: bool | None = ..., + on_setattr: _OnSetAttrArgType | None = ..., + field_transformer: _FieldTransformer | None = ..., + match_args: bool = ..., + unsafe_hash: bool | None = ..., +) -> Callable[[_C], _C]: ... +def fields(cls: type[AttrsInstance]) -> Any: ... +def fields_dict(cls: type[AttrsInstance]) -> dict[str, Attribute[Any]]: ... +def validate(inst: AttrsInstance) -> None: ... +def resolve_types( + cls: _A, + globalns: dict[str, Any] | None = ..., + localns: dict[str, Any] | None = ..., + attribs: list[Attribute[Any]] | None = ..., + include_extras: bool = ..., +) -> _A: ... + +# TODO: add support for returning a proper attrs class from the mypy plugin +# we use Any instead of _CountingAttr so that e.g. `make_class('Foo', +# [attr.ib()])` is valid +def make_class( + name: str, + attrs: list[str] | tuple[str, ...] | dict[str, Any], + bases: tuple[type, ...] = ..., + class_body: dict[str, Any] | None = ..., + repr_ns: str | None = ..., + repr: bool = ..., + cmp: _EqOrderType | None = ..., + hash: bool | None = ..., + init: bool = ..., + slots: bool = ..., + frozen: bool = ..., + weakref_slot: bool = ..., + str: bool = ..., + auto_attribs: bool = ..., + kw_only: bool = ..., + cache_hash: bool = ..., + auto_exc: bool = ..., + eq: _EqOrderType | None = ..., + order: _EqOrderType | None = ..., + collect_by_mro: bool = ..., + on_setattr: _OnSetAttrArgType | None = ..., + field_transformer: _FieldTransformer | None = ..., +) -> type: ... + +# _funcs -- + +# TODO: add support for returning TypedDict from the mypy plugin +# FIXME: asdict/astuple do not honor their factory args. Waiting on one of +# these: +# https://github.com/python/mypy/issues/4236 +# https://github.com/python/typing/issues/253 +# XXX: remember to fix attrs.asdict/astuple too! +def asdict( + inst: AttrsInstance, + recurse: bool = ..., + filter: _FilterType[Any] | None = ..., + dict_factory: type[Mapping[Any, Any]] = ..., + retain_collection_types: bool = ..., + value_serializer: Callable[[type, Attribute[Any], Any], Any] | None = ..., + tuple_keys: bool | None = ..., +) -> dict[str, Any]: ... + +# TODO: add support for returning NamedTuple from the mypy plugin +def astuple( + inst: AttrsInstance, + recurse: bool = ..., + filter: _FilterType[Any] | None = ..., + tuple_factory: type[Sequence[Any]] = ..., + retain_collection_types: bool = ..., +) -> tuple[Any, ...]: ... +def has(cls: type) -> TypeGuard[type[AttrsInstance]]: ... +def assoc(inst: _T, **changes: Any) -> _T: ... +def evolve(inst: _T, **changes: Any) -> _T: ... + +# _config -- + +def set_run_validators(run: bool) -> None: ... +def get_run_validators() -> bool: ... + +# aliases -- + +s = attributes = attrs +ib = attr = attrib +dataclass = attrs # Technically, partial(attrs, auto_attribs=True) ;) diff --git a/venv/lib/python3.11/site-packages/attr/__pycache__/__init__.cpython-311.pyc b/venv/lib/python3.11/site-packages/attr/__pycache__/__init__.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..5d5a71eb519b4e316837dfad0f00462a0a31759c GIT binary patch literal 3116 zcmd5;%WoUU8J}G)-;^kmvKZTXtR>SnorsL%I4P1qfGwq#i$G}`qXFi!U2%uf#yh+0 z>{68kxg`n%Re>ISDQqAJ5EQ7}B02QXLr(o0R)r44009K_lp726P~_C_8;W{3X^~@> zv%h(K^Z4d_{FZ+l8OafN{#My=vl&AEft}%#JZc=SYlJ){4xz-+9Np8nPIV322`|A7 zYVagY@)S+MnBgS7G|$is&(bW<(HzgyJTK6KlBK*6K1xSbJM9(u7#-v1=sDHTcqLw@ zWj;>F`FVPtPtXZop%o>|dN1({^a8&~FY-(D5}%}#e2Px-X*$hk=nOZh$uHB(e3s7g zIXcI$&?{8 zeB`-K$Y<~l9{Q?I?h$A7F>#74^*jMGc#mW^S&~hCbYa*(ZV>v~8ga&cuhCo1Irh3! zVn)kw%8w0t8_v1S-gpjn{S4ltecp7&KOnX9+f%tk&kjQtnjgB+deDi?yMgO5(e~_! z<-Wq%HBF}5wuoHYt0iP+(e^xh)nhXKo*OY?douGw5kx^V@V>(RYe|`F2L1*UAPr@X zZ8ljuasxk<>6YuM!F0%?fpo+6T*rEi|%OPQC*JUwZi*;7}@!o|N;zj?C} zLLAJu?dC&!jfD-=xM5kY??#qYZ*Pg~u(5(FG{Pc4_xRT{GTkLHKb%pU73Z-%F&q#T zY`p{^^GEJ@0Dcr>ID8JFgfasU6&JCY8(0jy8j4FeVFUr_hKS1ulL%RaS%fKsX$0gZ zF^7O=6=eXayQ^Xbdsh&~aYzdVUP0s$OoRe}%z#~$m1Rn>s3ZL5&`TgC2E3TVhpz(s z8u?9&pf!9P{dBKo?2;Dn-Q&U|Z3lg7Y`1eJJd1)sQku5OS!6@f*k)S4_Q?dhB+0aDA(SKunOq|3H`IvlSJkp|5*Wc03lFzR+McqK{kAT{BvZFhx zvojvSK2G|fqC{~qN)HW1$VX^O_3R{^%nALSUH<_&D+MEFS0Fd?mIb_oSq2F(cG5wc zS=M%XkR0ZA$pq>!{lGj9CR3m?kd~RD@dwfM7L3aD(Wbyfqjw+@6{)<7=9DFuw*wJD z#?+4&z71;xCW9QefCu=oP9ZD>?n{a{QJCQ2n!vfzz@_4KXomQm#8~KxI!fR|K$EB? zs6T5d@;Mr)zvBf>+Y1-!r{;W!d;9|6-(Awn7vsuXaUM&rwD4>>E-gU$!Wh)Mi(i(^ zPs@9y>VByj7pe!DMtrs$6f3)%&(eEEbH8Zr8V9gnx%&5fHO^PREKl#3Z~bNIiwl2! zf3Li>UtWp}O9#dBll#B@Wt^E-84t!xz>RCVx|z6(s-cm8Y7Xu;a^^Z>2}D1_IcOYE zzh5XMXFi$h6R7?$s8st~VUiRou`!{}U8#LfrY*|}nh*rpR>udv54=!dg31(pCcp;* z!%U#DMGA+H7)0@gA_|rMD)S8szFLZ9U|0C?wcNDyWLW^tWjvMVSaIgT$y4H$Uh7Q#)0 z*AS4FWELq!eYpmd-M~RG6nyV3ODy6%^ns`$ptr;;2#UNh7{AWEGsvF>fqp^)2;ol- z=_fQz>!)0Xh$wXJ{{-9SV#iZ2LyAOJW^6tGS@BYb%3-f!0`TfFt zH``BXTDDKV2~U>)iKG8I5oJhm;>r5{#MS-LYu$X`n9GBihR{v--_ypm%Cp5jf$Gy` aRlNvxQk>l7&zAQ_tNWwXZXSOsp#B411~6&> literal 0 HcmV?d00001 diff --git a/venv/lib/python3.11/site-packages/attr/__pycache__/_cmp.cpython-311.pyc b/venv/lib/python3.11/site-packages/attr/__pycache__/_cmp.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..d51d47f0ea02580658378ba6878a7ebe6b5e52be GIT binary patch literal 5371 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 M#KA9LC(IQ82QvF{Y5)KL literal 0 HcmV?d00001 diff --git a/venv/lib/python3.11/site-packages/attr/__pycache__/_config.cpython-311.pyc b/venv/lib/python3.11/site-packages/attr/__pycache__/_config.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..1d7b816e8e9707bf1bd3ea8f289b0d7cacc0b1ff GIT binary patch literal 1180 zcmd5*&1(}u6rbHq+nA;wMrg6s^29?8w7acU4@DFO4Ym+S?&kK}$3WVBVJ;$ht6Y!0do1-=3r$oOPHMy0FD!a&6k@eQa{s8T{! zDiG0-%Y=H|hNqIlq1`^N*Vdh7zNFQFvn%CFpU;n^;*{B$Ve{N9?r9dnhE#x6RpU6Y zAC_}z!IwIaMjlUd+M1qOZ6*Ak5V1(d{y4_6nOaDbTA{2-eFgvrkDYoPa%Y1IB%w~& zx|1YM6&v73wfWFXoFrM1F>f|r%O`LB(($7BT z5Klu-^gLwqHI53-SI>?sPKL3$m$m5$R}B&U!*Kjp6QJ+gUnih!2;I(4L=kK7 literal 0 HcmV?d00001 diff --git a/venv/lib/python3.11/site-packages/attr/__pycache__/_funcs.cpython-311.pyc b/venv/lib/python3.11/site-packages/attr/__pycache__/_funcs.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..472a10e1f34cbe097b087a5af7f7630c1ac0f910 GIT binary patch literal 15796 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 literal 0 HcmV?d00001 diff --git a/venv/lib/python3.11/site-packages/attr/__pycache__/exceptions.cpython-311.pyc b/venv/lib/python3.11/site-packages/attr/__pycache__/exceptions.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..8fe85b18cdf10000fe675998053261ed175a0547 GIT binary patch literal 4162 zcmbVO&2JM&6rc51HqIwW2;b=fqN#(h32A{+S`k5MxuhQnNHx&)dUqUeS?`*e-GoFz z$^ogVL?sTb$T24h;?Q$1{To7sRJ2m1NddP?P3)zv@-+}H!LP=IKNH%g6*v&?bNETR}ma=gpN)txxJd82o@Q#GvahW;u z)c%+;ht2taLKxyx?e^kW*E<`bzlUshGzt*ZJ-RRxTmh3!sNz3pjM zXlYYb!_h$9>Flo;p9ZnG z=~Icwak)ZJ43G|G@#2dk$5wVPURsU49ekfv8?2|gP(!dm;^HH%_kpYjTM%jxR#Cq{ z2&*e$+yvouqanQNK~>cFmSLncg;1+AM^D$BIq@XM5G`v*f#rvFpy);+VDw@OcPzvn zXsi!`s54WE#E_Q;5lqEdJ7i!WV4yK9=WjMrfUc|N(wlOyDWE4ZBTB)ubqq;GcRb6$Oe>g>wwkCHA#S&* zxgyU!PNBB&TTnv^4%;?;!Q-dG^xYcmUc`rD7#nr8sM;ag0l+tI3&^4-1Tcg8Gp^W< zeWHp~lp&~xp%2SYlmLfmLp21n)lpSG-W=S1#DpT#2o6;{1UGnz7BtUt$1O%RV{VeV z0lfQRgc^al4hpN}Y!Qk*SWLTGo}t29=u$w-n~wp7QJ5swtJiab>JHP~SGo91J*l@0 z=z|Cz#Todu$aV9!0fTJts_d?cR z)GP}xK7p_AguV`(7@))W*AzV**OVm~4Vp5eSzgEp_z|JQtZC`V)uUdOD@4j#D~6#ETl1@as(QUL@tnTY9k*(>uIewN!T$Mo{IQUxDpCf zDT(0<9LFdEi4Rvlu&V0(-Yw7w%hxyqQ3IBqz6bCAaQ3^q_wTOC2gN>9ZCl=AkRX-@ z;dg}`>eRAS6?SkO*TWrL2)I0oLs5Kz1{AalV&QRoh1OC0P1W#dKXrF=fPkAK84R*(|@GssF*lB7z4NJm%6kODw*;}&Djv+Op>|^nlL)T=02_?Z=>Px# literal 0 HcmV?d00001 diff --git a/venv/lib/python3.11/site-packages/attr/__pycache__/filters.cpython-311.pyc b/venv/lib/python3.11/site-packages/attr/__pycache__/filters.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..736150c65db82af82189e6e9a886bf48012ad9c5 GIT binary patch literal 3194 zcmds3&2JM&6rcTaY~wVzBqdOw1GJR2V9kfr0|FZQ+J&>jQER;KO45r7y%b31ussRFw?^D zU3n{z&3U*7RS=&d0djAn8}Hu{#xrUQ{_w+r*Avj6CeJ_YZwp_bM}mMJ95T^0v@Kjw z#UN`j%VECm7$lJWHIHnIfvBAcB*SKm$71~Qv*L=|AjMUkf}dV&td%{lxMbP3wbthkqb3D*hD?POW6Ff(57{9_CIUyv_fd`ql3*)fHVV#3L zV{JsIVV-jvyAGm*o@Y_!-KaGlPs9Iiey#^HJ=aUm{hH241?84fH(%<3OqY7;QfT2j z;g)JQU+sZRS9|Gde?rcs`bbt%QT<_&Wbg{{b{Ncq*bq0Q4S6?9wb5=yx(*TdrTg-I zaZ}usHs!hmJeIyAv;|-iQQv?ZLpG>TqWc86B!Ut4p#V4}THUtYRfY?^Bn2%SdY9=k zyAW!eh`0rxv@Pa;#W8*gL#v(&`G#o;&E8N)0X*nS9^|{&atym^5)D^$2QTp*MDNhC zqc`AP!0TX0$SdAJ%zdL*R$!a@l1)Z4e33E+yod8qLPoTP$63+jtM5KCJ`R~O$&0@s zafl8O@F+wTDqx*1Hygz9<1J|#Zox@pxsI`-JIlnpZ~>nKveM4rvSAR<=Vbv-V|dl_ zSD?@+*X22QpiAQ>2{L@3ZG$g54<{1xEEvmFu=Ie=|sJsjz3Xt{lM^J zB}6(joq!Ogfq2nD&vN+(SGU+s?pPm*lgECUntkx~Uqp9$W_T;sq@J{0KVm;p1v| zR_)EIU3sQc*_?T(^kqfK_R%ZFJ195Zx%&1YxAjWMnJygHg@WVy1?Vsiy|;!ua{K>{ zyz?XEjldRz5bF$>$7}itibK>J|A@hJ&|GhZ!Q2pqbU(z>gCPEfs<`}ss^N!7P&G7_ zc^v;)_9m#>3ynU67R3-e1lC8OzYbXO%9P`oQx84H1^*dvMNI`0wVLS~KqpGAq2D6W zdCgD55Qt&WcH|x6^kw>D!!?^WDbWHrakgR$Ao`LZ2>p~O$UqPv(nvVGgAR>f{Zv|j XGcXbF%?i_fl!#9fZ8XQVaHoF)dOr%i literal 0 HcmV?d00001 diff --git a/venv/lib/python3.11/site-packages/attr/__pycache__/setters.cpython-311.pyc b/venv/lib/python3.11/site-packages/attr/__pycache__/setters.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..986d130f19e67cfd1e948c559c851496e4a4d900 GIT binary patch literal 2079 zcma)7&1)M+6rb5$tyZ$*wH?PFrE#XN6C+ct?DkTE2{>s(4#i1oD8$fi*4mN1_G(w1 zS;@7LiwJ=#kb?^?_R%M|!T&@51{r)Xdoq+BdJ~vJ$*FHfA6O(5k9L0=&DVSLe!uth z+qG+H1nrNpiuY7U=uh#Z)0B4SVhK9?$VDs2#jfJxqOzi3(N}%7sI6$w*IuHPgqr}= zT^%s#CIJlv(bN&_KJJ`}R?@Dqj54X6+vx{ku^0yaHYs!JlJzj$krPGC zO8<>vX9mYfJ0AuGZ|x0^M;@|phX#u<@2!?2`Xyr_%XbYxM>w8@_hJ~}Cvd%v3fRRj zja^*DU|iWLqzSaI%K>qGpUi@}h%!D)oWLcFMr9U|Xq|St6~`}A5*Fl`@9+p*q*hv< zVOgXCTfH!FT$j3c?~+gFta)orPUcl`pwl3{=sLU?a{#~MeNxl*#Cq#4ak70U zF3gI{lG@v+x%IF}b6XCBBb;1ud$Cl?t$M!i1#8)2zLcxbppx^w)m&*iS`UNItoivI z_ad4tIr&Xzjq;o@nrk0zmA2#lE#{O;)U``qiSB$L&|2`ryyNqG*5x@t1)m4_w}#HH zjnT}v-W zrL!>@ya_KCxmrX2^rOC84Q=vW_Y*KL-TwwUz3y*_tI6i#GGaeF&y9goW4yL_*4Gb;OiZ*#wM1>Pw!Wtyq)xP{Q*ElDO`Z3RG_;Zb3BFJb zWH;V`?^YARWmczn?n1$gM15*E2)A|wL>za?;C+$=~Qg$>p!f}CDzfJ#A) zy7S}vsDa7}B?<~0$!2@$5CdV*LsxGFl*cj3%YJkvMT;9iwN5?gn9OK#s%t+^*hOcP zvPoDKr#;@OWtqe~Z06-6E(9$oZF8DzAH_a~@z3Gq&jCcHqm|=yFRivzxV9tg?Nv~ zGJWtTWV>M=QWdoXnx;SGX(@u*&zbO4Rv?+JQghPFSPxe>Xg-P)OONfxPh=gF+L0;# z)>wdwQTFLQmVpBV)%*oOQ^goJbp>lpB)~v;w1IA1e$LP*jozoJn|Qp5x-hNdTTuQw eFl^!*Vzv#_L!#FO3nEz8Um35BT0(rJkN*Ln!TJ*b literal 0 HcmV?d00001 diff --git a/venv/lib/python3.11/site-packages/attr/__pycache__/validators.cpython-311.pyc b/venv/lib/python3.11/site-packages/attr/__pycache__/validators.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..1a5dd30e0d4ab3cd706cef53debfe62bfae8083c GIT binary patch literal 29858 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", "ge": ">="} + + +def cmp_using( + eq=None, + lt=None, + le=None, + gt=None, + ge=None, + require_same_type=True, + class_name="Comparable", +): + """ + Create a class that can be passed into `attrs.field`'s ``eq``, ``order``, + and ``cmp`` arguments to customize field comparison. + + The resulting class will have a full set of ordering methods if at least + one of ``{lt, le, gt, ge}`` and ``eq`` are provided. + + Args: + eq (typing.Callable | None): + Callable used to evaluate equality of two objects. + + lt (typing.Callable | None): + Callable used to evaluate whether one object is less than another + object. + + le (typing.Callable | None): + Callable used to evaluate whether one object is less than or equal + to another object. + + gt (typing.Callable | None): + Callable used to evaluate whether one object is greater than + another object. + + ge (typing.Callable | None): + Callable used to evaluate whether one object is greater than or + equal to another object. + + require_same_type (bool): + When `True`, equality and ordering methods will return + `NotImplemented` if objects are not of the same type. + + class_name (str | None): Name of class. Defaults to "Comparable". + + See `comparison` for more details. + + .. versionadded:: 21.1.0 + """ + + body = { + "__slots__": ["value"], + "__init__": _make_init(), + "_requirements": [], + "_is_comparable_to": _is_comparable_to, + } + + # Add operations. + num_order_functions = 0 + has_eq_function = False + + if eq is not None: + has_eq_function = True + body["__eq__"] = _make_operator("eq", eq) + body["__ne__"] = __ne__ + + if lt is not None: + num_order_functions += 1 + body["__lt__"] = _make_operator("lt", lt) + + if le is not None: + num_order_functions += 1 + body["__le__"] = _make_operator("le", le) + + if gt is not None: + num_order_functions += 1 + body["__gt__"] = _make_operator("gt", gt) + + if ge is not None: + num_order_functions += 1 + body["__ge__"] = _make_operator("ge", ge) + + type_ = types.new_class( + class_name, (object,), {}, lambda ns: ns.update(body) + ) + + # Add same type requirement. + if require_same_type: + type_._requirements.append(_check_same_type) + + # Add total ordering if at least one operation was defined. + if 0 < num_order_functions < 4: + if not has_eq_function: + # functools.total_ordering requires __eq__ to be defined, + # so raise early error here to keep a nice stack. + msg = "eq must be define is order to complete ordering from lt, le, gt, ge." + raise ValueError(msg) + type_ = functools.total_ordering(type_) + + return type_ + + +def _make_init(): + """ + Create __init__ method. + """ + + def __init__(self, value): + """ + Initialize object with *value*. + """ + self.value = value + + return __init__ + + +def _make_operator(name, func): + """ + Create operator method. + """ + + def method(self, other): + if not self._is_comparable_to(other): + return NotImplemented + + result = func(self.value, other.value) + if result is NotImplemented: + return NotImplemented + + return result + + method.__name__ = f"__{name}__" + method.__doc__ = ( + f"Return a {_operation_names[name]} b. Computed by attrs." + ) + + return method + + +def _is_comparable_to(self, other): + """ + Check whether `other` is comparable to `self`. + """ + return all(func(self, other) for func in self._requirements) + + +def _check_same_type(self, other): + """ + Return True if *self* and *other* are of the same type, False otherwise. + """ + return other.value.__class__ is self.value.__class__ diff --git a/venv/lib/python3.11/site-packages/attr/_cmp.pyi b/venv/lib/python3.11/site-packages/attr/_cmp.pyi new file mode 100644 index 0000000..cc7893b --- /dev/null +++ b/venv/lib/python3.11/site-packages/attr/_cmp.pyi @@ -0,0 +1,13 @@ +from typing import Any, Callable + +_CompareWithType = Callable[[Any, Any], bool] + +def cmp_using( + eq: _CompareWithType | None = ..., + lt: _CompareWithType | None = ..., + le: _CompareWithType | None = ..., + gt: _CompareWithType | None = ..., + ge: _CompareWithType | None = ..., + require_same_type: bool = ..., + class_name: str = ..., +) -> type: ... diff --git a/venv/lib/python3.11/site-packages/attr/_compat.py b/venv/lib/python3.11/site-packages/attr/_compat.py new file mode 100644 index 0000000..bc68ed9 --- /dev/null +++ b/venv/lib/python3.11/site-packages/attr/_compat.py @@ -0,0 +1,99 @@ +# SPDX-License-Identifier: MIT + +import inspect +import platform +import sys +import threading + +from collections.abc import Mapping, Sequence # noqa: F401 +from typing import _GenericAlias + + +PYPY = platform.python_implementation() == "PyPy" +PY_3_10_PLUS = sys.version_info[:2] >= (3, 10) +PY_3_11_PLUS = sys.version_info[:2] >= (3, 11) +PY_3_12_PLUS = sys.version_info[:2] >= (3, 12) +PY_3_13_PLUS = sys.version_info[:2] >= (3, 13) +PY_3_14_PLUS = sys.version_info[:2] >= (3, 14) + + +if PY_3_14_PLUS: + import annotationlib + + # We request forward-ref annotations to not break in the presence of + # forward references. + + def _get_annotations(cls): + return annotationlib.get_annotations( + cls, format=annotationlib.Format.FORWARDREF + ) + +else: + + def _get_annotations(cls): + """ + Get annotations for *cls*. + """ + return cls.__dict__.get("__annotations__", {}) + + +class _AnnotationExtractor: + """ + Extract type annotations from a callable, returning None whenever there + is none. + """ + + __slots__ = ["sig"] + + def __init__(self, callable): + try: + self.sig = inspect.signature(callable) + except (ValueError, TypeError): # inspect failed + self.sig = None + + def get_first_param_type(self): + """ + Return the type annotation of the first argument if it's not empty. + """ + if not self.sig: + return None + + params = list(self.sig.parameters.values()) + if params and params[0].annotation is not inspect.Parameter.empty: + return params[0].annotation + + return None + + def get_return_type(self): + """ + Return the return type if it's not empty. + """ + if ( + self.sig + and self.sig.return_annotation is not inspect.Signature.empty + ): + return self.sig.return_annotation + + return None + + +# Thread-local global to track attrs instances which are already being repr'd. +# This is needed because there is no other (thread-safe) way to pass info +# about the instances that are already being repr'd through the call stack +# in order to ensure we don't perform infinite recursion. +# +# For instance, if an instance contains a dict which contains that instance, +# we need to know that we're already repr'ing the outside instance from within +# the dict's repr() call. +# +# This lives here rather than in _make.py so that the functions in _make.py +# don't have a direct reference to the thread-local in their globals dict. +# If they have such a reference, it breaks cloudpickle. +repr_context = threading.local() + + +def get_generic_base(cl): + """If this is a generic class (A[str]), return the generic base for it.""" + if cl.__class__ is _GenericAlias: + return cl.__origin__ + return None diff --git a/venv/lib/python3.11/site-packages/attr/_config.py b/venv/lib/python3.11/site-packages/attr/_config.py new file mode 100644 index 0000000..4b25772 --- /dev/null +++ b/venv/lib/python3.11/site-packages/attr/_config.py @@ -0,0 +1,31 @@ +# SPDX-License-Identifier: MIT + +__all__ = ["get_run_validators", "set_run_validators"] + +_run_validators = True + + +def set_run_validators(run): + """ + Set whether or not validators are run. By default, they are run. + + .. deprecated:: 21.3.0 It will not be removed, but it also will not be + moved to new ``attrs`` namespace. Use `attrs.validators.set_disabled()` + instead. + """ + if not isinstance(run, bool): + msg = "'run' must be bool." + raise TypeError(msg) + global _run_validators + _run_validators = run + + +def get_run_validators(): + """ + Return whether or not validators are run. + + .. deprecated:: 21.3.0 It will not be removed, but it also will not be + moved to new ``attrs`` namespace. Use `attrs.validators.get_disabled()` + instead. + """ + return _run_validators diff --git a/venv/lib/python3.11/site-packages/attr/_funcs.py b/venv/lib/python3.11/site-packages/attr/_funcs.py new file mode 100644 index 0000000..1adb500 --- /dev/null +++ b/venv/lib/python3.11/site-packages/attr/_funcs.py @@ -0,0 +1,497 @@ +# SPDX-License-Identifier: MIT + + +import copy + +from ._compat import get_generic_base +from ._make import _OBJ_SETATTR, NOTHING, fields +from .exceptions import AttrsAttributeNotFoundError + + +_ATOMIC_TYPES = frozenset( + { + type(None), + bool, + int, + float, + str, + complex, + bytes, + type(...), + type, + range, + property, + } +) + + +def asdict( + inst, + recurse=True, + filter=None, + dict_factory=dict, + retain_collection_types=False, + value_serializer=None, +): + """ + Return the *attrs* attribute values of *inst* as a dict. + + Optionally recurse into other *attrs*-decorated classes. + + Args: + inst: Instance of an *attrs*-decorated class. + + recurse (bool): Recurse into classes that are also *attrs*-decorated. + + filter (~typing.Callable): + A callable whose return code determines whether an attribute or + element is included (`True`) or dropped (`False`). Is called with + the `attrs.Attribute` as the first argument and the value as the + second argument. + + dict_factory (~typing.Callable): + A callable to produce dictionaries from. For example, to produce + ordered dictionaries instead of normal Python dictionaries, pass in + ``collections.OrderedDict``. + + retain_collection_types (bool): + Do not convert to `list` when encountering an attribute whose type + is `tuple` or `set`. Only meaningful if *recurse* is `True`. + + value_serializer (typing.Callable | None): + A hook that is called for every attribute or dict key/value. It + receives the current instance, field and value and must return the + (updated) value. The hook is run *after* the optional *filter* has + been applied. + + Returns: + Return type of *dict_factory*. + + Raises: + attrs.exceptions.NotAnAttrsClassError: + If *cls* is not an *attrs* class. + + .. versionadded:: 16.0.0 *dict_factory* + .. versionadded:: 16.1.0 *retain_collection_types* + .. versionadded:: 20.3.0 *value_serializer* + .. versionadded:: 21.3.0 + If a dict has a collection for a key, it is serialized as a tuple. + """ + attrs = fields(inst.__class__) + rv = dict_factory() + for a in attrs: + v = getattr(inst, a.name) + if filter is not None and not filter(a, v): + continue + + if value_serializer is not None: + v = value_serializer(inst, a, v) + + if recurse is True: + value_type = type(v) + if value_type in _ATOMIC_TYPES: + rv[a.name] = v + elif has(value_type): + rv[a.name] = asdict( + v, + recurse=True, + filter=filter, + dict_factory=dict_factory, + retain_collection_types=retain_collection_types, + value_serializer=value_serializer, + ) + elif issubclass(value_type, (tuple, list, set, frozenset)): + cf = value_type if retain_collection_types is True else list + items = [ + _asdict_anything( + i, + is_key=False, + filter=filter, + dict_factory=dict_factory, + retain_collection_types=retain_collection_types, + value_serializer=value_serializer, + ) + for i in v + ] + try: + rv[a.name] = cf(items) + except TypeError: + if not issubclass(cf, tuple): + raise + # Workaround for TypeError: cf.__new__() missing 1 required + # positional argument (which appears, for a namedturle) + rv[a.name] = cf(*items) + elif issubclass(value_type, dict): + df = dict_factory + rv[a.name] = df( + ( + _asdict_anything( + kk, + is_key=True, + filter=filter, + dict_factory=df, + retain_collection_types=retain_collection_types, + value_serializer=value_serializer, + ), + _asdict_anything( + vv, + is_key=False, + filter=filter, + dict_factory=df, + retain_collection_types=retain_collection_types, + value_serializer=value_serializer, + ), + ) + for kk, vv in v.items() + ) + else: + rv[a.name] = v + else: + rv[a.name] = v + return rv + + +def _asdict_anything( + val, + is_key, + filter, + dict_factory, + retain_collection_types, + value_serializer, +): + """ + ``asdict`` only works on attrs instances, this works on anything. + """ + val_type = type(val) + if val_type in _ATOMIC_TYPES: + rv = val + if value_serializer is not None: + rv = value_serializer(None, None, rv) + elif getattr(val_type, "__attrs_attrs__", None) is not None: + # Attrs class. + rv = asdict( + val, + recurse=True, + filter=filter, + dict_factory=dict_factory, + retain_collection_types=retain_collection_types, + value_serializer=value_serializer, + ) + elif issubclass(val_type, (tuple, list, set, frozenset)): + if retain_collection_types is True: + cf = val.__class__ + elif is_key: + cf = tuple + else: + cf = list + + rv = cf( + [ + _asdict_anything( + i, + is_key=False, + filter=filter, + dict_factory=dict_factory, + retain_collection_types=retain_collection_types, + value_serializer=value_serializer, + ) + for i in val + ] + ) + elif issubclass(val_type, dict): + df = dict_factory + rv = df( + ( + _asdict_anything( + kk, + is_key=True, + filter=filter, + dict_factory=df, + retain_collection_types=retain_collection_types, + value_serializer=value_serializer, + ), + _asdict_anything( + vv, + is_key=False, + filter=filter, + dict_factory=df, + retain_collection_types=retain_collection_types, + value_serializer=value_serializer, + ), + ) + for kk, vv in val.items() + ) + else: + rv = val + if value_serializer is not None: + rv = value_serializer(None, None, rv) + + return rv + + +def astuple( + inst, + recurse=True, + filter=None, + tuple_factory=tuple, + retain_collection_types=False, +): + """ + Return the *attrs* attribute values of *inst* as a tuple. + + Optionally recurse into other *attrs*-decorated classes. + + Args: + inst: Instance of an *attrs*-decorated class. + + recurse (bool): + Recurse into classes that are also *attrs*-decorated. + + filter (~typing.Callable): + A callable whose return code determines whether an attribute or + element is included (`True`) or dropped (`False`). Is called with + the `attrs.Attribute` as the first argument and the value as the + second argument. + + tuple_factory (~typing.Callable): + A callable to produce tuples from. For example, to produce lists + instead of tuples. + + retain_collection_types (bool): + Do not convert to `list` or `dict` when encountering an attribute + which type is `tuple`, `dict` or `set`. Only meaningful if + *recurse* is `True`. + + Returns: + Return type of *tuple_factory* + + Raises: + attrs.exceptions.NotAnAttrsClassError: + If *cls* is not an *attrs* class. + + .. versionadded:: 16.2.0 + """ + attrs = fields(inst.__class__) + rv = [] + retain = retain_collection_types # Very long. :/ + for a in attrs: + v = getattr(inst, a.name) + if filter is not None and not filter(a, v): + continue + value_type = type(v) + if recurse is True: + if value_type in _ATOMIC_TYPES: + rv.append(v) + elif has(value_type): + rv.append( + astuple( + v, + recurse=True, + filter=filter, + tuple_factory=tuple_factory, + retain_collection_types=retain, + ) + ) + elif issubclass(value_type, (tuple, list, set, frozenset)): + cf = v.__class__ if retain is True else list + items = [ + ( + astuple( + j, + recurse=True, + filter=filter, + tuple_factory=tuple_factory, + retain_collection_types=retain, + ) + if has(j.__class__) + else j + ) + for j in v + ] + try: + rv.append(cf(items)) + except TypeError: + if not issubclass(cf, tuple): + raise + # Workaround for TypeError: cf.__new__() missing 1 required + # positional argument (which appears, for a namedturle) + rv.append(cf(*items)) + elif issubclass(value_type, dict): + df = value_type if retain is True else dict + rv.append( + df( + ( + ( + astuple( + kk, + tuple_factory=tuple_factory, + retain_collection_types=retain, + ) + if has(kk.__class__) + else kk + ), + ( + astuple( + vv, + tuple_factory=tuple_factory, + retain_collection_types=retain, + ) + if has(vv.__class__) + else vv + ), + ) + for kk, vv in v.items() + ) + ) + else: + rv.append(v) + else: + rv.append(v) + + return rv if tuple_factory is list else tuple_factory(rv) + + +def has(cls): + """ + Check whether *cls* is a class with *attrs* attributes. + + Args: + cls (type): Class to introspect. + + Raises: + TypeError: If *cls* is not a class. + + Returns: + bool: + """ + attrs = getattr(cls, "__attrs_attrs__", None) + if attrs is not None: + return True + + # No attrs, maybe it's a specialized generic (A[str])? + generic_base = get_generic_base(cls) + if generic_base is not None: + generic_attrs = getattr(generic_base, "__attrs_attrs__", None) + if generic_attrs is not None: + # Stick it on here for speed next time. + cls.__attrs_attrs__ = generic_attrs + return generic_attrs is not None + return False + + +def assoc(inst, **changes): + """ + Copy *inst* and apply *changes*. + + This is different from `evolve` that applies the changes to the arguments + that create the new instance. + + `evolve`'s behavior is preferable, but there are `edge cases`_ where it + doesn't work. Therefore `assoc` is deprecated, but will not be removed. + + .. _`edge cases`: https://github.com/python-attrs/attrs/issues/251 + + Args: + inst: Instance of a class with *attrs* attributes. + + changes: Keyword changes in the new copy. + + Returns: + A copy of inst with *changes* incorporated. + + Raises: + attrs.exceptions.AttrsAttributeNotFoundError: + If *attr_name* couldn't be found on *cls*. + + attrs.exceptions.NotAnAttrsClassError: + If *cls* is not an *attrs* class. + + .. deprecated:: 17.1.0 + Use `attrs.evolve` instead if you can. This function will not be + removed du to the slightly different approach compared to + `attrs.evolve`, though. + """ + new = copy.copy(inst) + attrs = fields(inst.__class__) + for k, v in changes.items(): + a = getattr(attrs, k, NOTHING) + if a is NOTHING: + msg = f"{k} is not an attrs attribute on {new.__class__}." + raise AttrsAttributeNotFoundError(msg) + _OBJ_SETATTR(new, k, v) + return new + + +def resolve_types( + cls, globalns=None, localns=None, attribs=None, include_extras=True +): + """ + Resolve any strings and forward annotations in type annotations. + + This is only required if you need concrete types in :class:`Attribute`'s + *type* field. In other words, you don't need to resolve your types if you + only use them for static type checking. + + With no arguments, names will be looked up in the module in which the class + was created. If this is not what you want, for example, if the name only + exists inside a method, you may pass *globalns* or *localns* to specify + other dictionaries in which to look up these names. See the docs of + `typing.get_type_hints` for more details. + + Args: + cls (type): Class to resolve. + + globalns (dict | None): Dictionary containing global variables. + + localns (dict | None): Dictionary containing local variables. + + attribs (list | None): + List of attribs for the given class. This is necessary when calling + from inside a ``field_transformer`` since *cls* is not an *attrs* + class yet. + + include_extras (bool): + Resolve more accurately, if possible. Pass ``include_extras`` to + ``typing.get_hints``, if supported by the typing module. On + supported Python versions (3.9+), this resolves the types more + accurately. + + Raises: + TypeError: If *cls* is not a class. + + attrs.exceptions.NotAnAttrsClassError: + If *cls* is not an *attrs* class and you didn't pass any attribs. + + NameError: If types cannot be resolved because of missing variables. + + Returns: + *cls* so you can use this function also as a class decorator. Please + note that you have to apply it **after** `attrs.define`. That means the + decorator has to come in the line **before** `attrs.define`. + + .. versionadded:: 20.1.0 + .. versionadded:: 21.1.0 *attribs* + .. versionadded:: 23.1.0 *include_extras* + """ + # Since calling get_type_hints is expensive we cache whether we've + # done it already. + if getattr(cls, "__attrs_types_resolved__", None) != cls: + import typing + + kwargs = { + "globalns": globalns, + "localns": localns, + "include_extras": include_extras, + } + + hints = typing.get_type_hints(cls, **kwargs) + for field in fields(cls) if attribs is None else attribs: + if field.name in hints: + # Since fields have been frozen we must work around it. + _OBJ_SETATTR(field, "type", hints[field.name]) + # We store the class we resolved so that subclasses know they haven't + # been resolved. + cls.__attrs_types_resolved__ = cls + + # Return the class so you can use it as a decorator too. + return cls diff --git a/venv/lib/python3.11/site-packages/attr/_make.py b/venv/lib/python3.11/site-packages/attr/_make.py new file mode 100644 index 0000000..d24d9ba --- /dev/null +++ b/venv/lib/python3.11/site-packages/attr/_make.py @@ -0,0 +1,3362 @@ +# SPDX-License-Identifier: MIT + +from __future__ import annotations + +import abc +import contextlib +import copy +import enum +import inspect +import itertools +import linecache +import sys +import types +import unicodedata +import weakref + +from collections.abc import Callable, Mapping +from functools import cached_property +from typing import Any, NamedTuple, TypeVar + +# We need to import _compat itself in addition to the _compat members to avoid +# having the thread-local in the globals here. +from . import _compat, _config, setters +from ._compat import ( + PY_3_10_PLUS, + PY_3_11_PLUS, + PY_3_13_PLUS, + _AnnotationExtractor, + _get_annotations, + get_generic_base, +) +from .exceptions import ( + DefaultAlreadySetError, + FrozenInstanceError, + NotAnAttrsClassError, + UnannotatedAttributeError, +) + + +# This is used at least twice, so cache it here. +_OBJ_SETATTR = object.__setattr__ +_INIT_FACTORY_PAT = "__attr_factory_%s" +_CLASSVAR_PREFIXES = ( + "typing.ClassVar", + "t.ClassVar", + "ClassVar", + "typing_extensions.ClassVar", +) +# we don't use a double-underscore prefix because that triggers +# name mangling when trying to create a slot for the field +# (when slots=True) +_HASH_CACHE_FIELD = "_attrs_cached_hash" + +_EMPTY_METADATA_SINGLETON = types.MappingProxyType({}) + +# Unique object for unequivocal getattr() defaults. +_SENTINEL = object() + +_DEFAULT_ON_SETATTR = setters.pipe(setters.convert, setters.validate) + + +class _Nothing(enum.Enum): + """ + Sentinel to indicate the lack of a value when `None` is ambiguous. + + If extending attrs, you can use ``typing.Literal[NOTHING]`` to show + that a value may be ``NOTHING``. + + .. versionchanged:: 21.1.0 ``bool(NOTHING)`` is now False. + .. versionchanged:: 22.2.0 ``NOTHING`` is now an ``enum.Enum`` variant. + """ + + NOTHING = enum.auto() + + def __repr__(self): + return "NOTHING" + + def __bool__(self): + return False + + +NOTHING = _Nothing.NOTHING +""" +Sentinel to indicate the lack of a value when `None` is ambiguous. + +When using in 3rd party code, use `attrs.NothingType` for type annotations. +""" + + +class _CacheHashWrapper(int): + """ + An integer subclass that pickles / copies as None + + This is used for non-slots classes with ``cache_hash=True``, to avoid + serializing a potentially (even likely) invalid hash value. Since `None` + is the default value for uncalculated hashes, whenever this is copied, + the copy's value for the hash should automatically reset. + + See GH #613 for more details. + """ + + def __reduce__(self, _none_constructor=type(None), _args=()): # noqa: B008 + return _none_constructor, _args + + +def attrib( + default=NOTHING, + validator=None, + repr=True, + cmp=None, + hash=None, + init=True, + metadata=None, + type=None, + converter=None, + factory=None, + kw_only=None, + eq=None, + order=None, + on_setattr=None, + alias=None, +): + """ + Create a new field / attribute on a class. + + Identical to `attrs.field`, except it's not keyword-only. + + Consider using `attrs.field` in new code (``attr.ib`` will *never* go away, + though). + + .. warning:: + + Does **nothing** unless the class is also decorated with + `attr.s` (or similar)! + + + .. versionadded:: 15.2.0 *convert* + .. versionadded:: 16.3.0 *metadata* + .. versionchanged:: 17.1.0 *validator* can be a ``list`` now. + .. versionchanged:: 17.1.0 + *hash* is `None` and therefore mirrors *eq* by default. + .. versionadded:: 17.3.0 *type* + .. deprecated:: 17.4.0 *convert* + .. versionadded:: 17.4.0 + *converter* as a replacement for the deprecated *convert* to achieve + consistency with other noun-based arguments. + .. versionadded:: 18.1.0 + ``factory=f`` is syntactic sugar for ``default=attr.Factory(f)``. + .. versionadded:: 18.2.0 *kw_only* + .. versionchanged:: 19.2.0 *convert* keyword argument removed. + .. versionchanged:: 19.2.0 *repr* also accepts a custom callable. + .. deprecated:: 19.2.0 *cmp* Removal on or after 2021-06-01. + .. versionadded:: 19.2.0 *eq* and *order* + .. versionadded:: 20.1.0 *on_setattr* + .. versionchanged:: 20.3.0 *kw_only* backported to Python 2 + .. versionchanged:: 21.1.0 + *eq*, *order*, and *cmp* also accept a custom callable + .. versionchanged:: 21.1.0 *cmp* undeprecated + .. versionadded:: 22.2.0 *alias* + .. versionchanged:: 25.4.0 + *kw_only* can now be None, and its default is also changed from False to + None. + """ + eq, eq_key, order, order_key = _determine_attrib_eq_order( + cmp, eq, order, True + ) + + if hash is not None and hash is not True and hash is not False: + msg = "Invalid value for hash. Must be True, False, or None." + raise TypeError(msg) + + if factory is not None: + if default is not NOTHING: + msg = ( + "The `default` and `factory` arguments are mutually exclusive." + ) + raise ValueError(msg) + if not callable(factory): + msg = "The `factory` argument must be a callable." + raise ValueError(msg) + default = Factory(factory) + + if metadata is None: + metadata = {} + + # Apply syntactic sugar by auto-wrapping. + if isinstance(on_setattr, (list, tuple)): + on_setattr = setters.pipe(*on_setattr) + + if validator and isinstance(validator, (list, tuple)): + validator = and_(*validator) + + if converter and isinstance(converter, (list, tuple)): + converter = pipe(*converter) + + return _CountingAttr( + default=default, + validator=validator, + repr=repr, + cmp=None, + hash=hash, + init=init, + converter=converter, + metadata=metadata, + type=type, + kw_only=kw_only, + eq=eq, + eq_key=eq_key, + order=order, + order_key=order_key, + on_setattr=on_setattr, + alias=alias, + ) + + +def _compile_and_eval( + script: str, + globs: dict[str, Any] | None, + locs: Mapping[str, object] | None = None, + filename: str = "", +) -> None: + """ + Evaluate the script with the given global (globs) and local (locs) + variables. + """ + bytecode = compile(script, filename, "exec") + eval(bytecode, globs, locs) + + +def _linecache_and_compile( + script: str, + filename: str, + globs: dict[str, Any] | None, + locals: Mapping[str, object] | None = None, +) -> dict[str, Any]: + """ + Cache the script with _linecache_, compile it and return the _locals_. + """ + + locs = {} if locals is None else locals + + # In order of debuggers like PDB being able to step through the code, + # we add a fake linecache entry. + count = 1 + base_filename = filename + while True: + linecache_tuple = ( + len(script), + None, + script.splitlines(True), + filename, + ) + old_val = linecache.cache.setdefault(filename, linecache_tuple) + if old_val == linecache_tuple: + break + + filename = f"{base_filename[:-1]}-{count}>" + count += 1 + + _compile_and_eval(script, globs, locs, filename) + + return locs + + +def _make_attr_tuple_class(cls_name: str, attr_names: list[str]) -> type: + """ + Create a tuple subclass to hold `Attribute`s for an `attrs` class. + + The subclass is a bare tuple with properties for names. + + class MyClassAttributes(tuple): + __slots__ = () + x = property(itemgetter(0)) + """ + attr_class_name = f"{cls_name}Attributes" + body = {} + for i, attr_name in enumerate(attr_names): + + def getter(self, i=i): + return self[i] + + body[attr_name] = property(getter) + return type(attr_class_name, (tuple,), body) + + +# Tuple class for extracted attributes from a class definition. +# `base_attrs` is a subset of `attrs`. +class _Attributes(NamedTuple): + attrs: type + base_attrs: list[Attribute] + base_attrs_map: dict[str, type] + + +def _is_class_var(annot): + """ + Check whether *annot* is a typing.ClassVar. + + The string comparison hack is used to avoid evaluating all string + annotations which would put attrs-based classes at a performance + disadvantage compared to plain old classes. + """ + annot = str(annot) + + # Annotation can be quoted. + if annot.startswith(("'", '"')) and annot.endswith(("'", '"')): + annot = annot[1:-1] + + return annot.startswith(_CLASSVAR_PREFIXES) + + +def _has_own_attribute(cls, attrib_name): + """ + Check whether *cls* defines *attrib_name* (and doesn't just inherit it). + """ + return attrib_name in cls.__dict__ + + +def _collect_base_attrs( + cls, taken_attr_names +) -> tuple[list[Attribute], dict[str, type]]: + """ + Collect attr.ibs from base classes of *cls*, except *taken_attr_names*. + """ + base_attrs = [] + base_attr_map = {} # A dictionary of base attrs to their classes. + + # Traverse the MRO and collect attributes. + for base_cls in reversed(cls.__mro__[1:-1]): + for a in getattr(base_cls, "__attrs_attrs__", []): + if a.inherited or a.name in taken_attr_names: + continue + + a = a.evolve(inherited=True) # noqa: PLW2901 + base_attrs.append(a) + base_attr_map[a.name] = base_cls + + # For each name, only keep the freshest definition i.e. the furthest at the + # back. base_attr_map is fine because it gets overwritten with every new + # instance. + filtered = [] + seen = set() + for a in reversed(base_attrs): + if a.name in seen: + continue + filtered.insert(0, a) + seen.add(a.name) + + return filtered, base_attr_map + + +def _collect_base_attrs_broken(cls, taken_attr_names): + """ + Collect attr.ibs from base classes of *cls*, except *taken_attr_names*. + + N.B. *taken_attr_names* will be mutated. + + Adhere to the old incorrect behavior. + + Notably it collects from the front and considers inherited attributes which + leads to the buggy behavior reported in #428. + """ + base_attrs = [] + base_attr_map = {} # A dictionary of base attrs to their classes. + + # Traverse the MRO and collect attributes. + for base_cls in cls.__mro__[1:-1]: + for a in getattr(base_cls, "__attrs_attrs__", []): + if a.name in taken_attr_names: + continue + + a = a.evolve(inherited=True) # noqa: PLW2901 + taken_attr_names.add(a.name) + base_attrs.append(a) + base_attr_map[a.name] = base_cls + + return base_attrs, base_attr_map + + +def _transform_attrs( + cls, + these, + auto_attribs, + kw_only, + collect_by_mro, + field_transformer, +) -> _Attributes: + """ + Transform all `_CountingAttr`s on a class into `Attribute`s. + + If *these* is passed, use that and don't look for them on the class. + + If *collect_by_mro* is True, collect them in the correct MRO order, + otherwise use the old -- incorrect -- order. See #428. + + Return an `_Attributes`. + """ + cd = cls.__dict__ + anns = _get_annotations(cls) + + if these is not None: + ca_list = list(these.items()) + elif auto_attribs is True: + ca_names = { + name + for name, attr in cd.items() + if attr.__class__ is _CountingAttr + } + ca_list = [] + annot_names = set() + for attr_name, type in anns.items(): + if _is_class_var(type): + continue + annot_names.add(attr_name) + a = cd.get(attr_name, NOTHING) + + if a.__class__ is not _CountingAttr: + a = attrib(a) + ca_list.append((attr_name, a)) + + unannotated = ca_names - annot_names + if unannotated: + raise UnannotatedAttributeError( + "The following `attr.ib`s lack a type annotation: " + + ", ".join( + sorted(unannotated, key=lambda n: cd.get(n).counter) + ) + + "." + ) + else: + ca_list = sorted( + ( + (name, attr) + for name, attr in cd.items() + if attr.__class__ is _CountingAttr + ), + key=lambda e: e[1].counter, + ) + + fca = Attribute.from_counting_attr + no = ClassProps.KeywordOnly.NO + own_attrs = [ + fca( + attr_name, + ca, + kw_only is not no, + anns.get(attr_name), + ) + for attr_name, ca in ca_list + ] + + if collect_by_mro: + base_attrs, base_attr_map = _collect_base_attrs( + cls, {a.name for a in own_attrs} + ) + else: + base_attrs, base_attr_map = _collect_base_attrs_broken( + cls, {a.name for a in own_attrs} + ) + + if kw_only is ClassProps.KeywordOnly.FORCE: + own_attrs = [a.evolve(kw_only=True) for a in own_attrs] + base_attrs = [a.evolve(kw_only=True) for a in base_attrs] + + attrs = base_attrs + own_attrs + + if field_transformer is not None: + attrs = tuple(field_transformer(cls, attrs)) + + # Check attr order after executing the field_transformer. + # Mandatory vs non-mandatory attr order only matters when they are part of + # the __init__ signature and when they aren't kw_only (which are moved to + # the end and can be mandatory or non-mandatory in any order, as they will + # be specified as keyword args anyway). Check the order of those attrs: + had_default = False + for a in (a for a in attrs if a.init is not False and a.kw_only is False): + if had_default is True and a.default is NOTHING: + msg = f"No mandatory attributes allowed after an attribute with a default value or factory. Attribute in question: {a!r}" + raise ValueError(msg) + + if had_default is False and a.default is not NOTHING: + had_default = True + + # Resolve default field alias after executing field_transformer. + # This allows field_transformer to differentiate between explicit vs + # default aliases and supply their own defaults. + for a in attrs: + if not a.alias: + # Evolve is very slow, so we hold our nose and do it dirty. + _OBJ_SETATTR.__get__(a)("alias", _default_init_alias_for(a.name)) + + # Create AttrsClass *after* applying the field_transformer since it may + # add or remove attributes! + attr_names = [a.name for a in attrs] + AttrsClass = _make_attr_tuple_class(cls.__name__, attr_names) + + return _Attributes(AttrsClass(attrs), base_attrs, base_attr_map) + + +def _make_cached_property_getattr(cached_properties, original_getattr, cls): + lines = [ + # Wrapped to get `__class__` into closure cell for super() + # (It will be replaced with the newly constructed class after construction). + "def wrapper(_cls):", + " __class__ = _cls", + " def __getattr__(self, item, cached_properties=cached_properties, original_getattr=original_getattr, _cached_setattr_get=_cached_setattr_get):", + " func = cached_properties.get(item)", + " if func is not None:", + " result = func(self)", + " _setter = _cached_setattr_get(self)", + " _setter(item, result)", + " return result", + ] + if original_getattr is not None: + lines.append( + " return original_getattr(self, item)", + ) + else: + lines.extend( + [ + " try:", + " return super().__getattribute__(item)", + " except AttributeError:", + " if not hasattr(super(), '__getattr__'):", + " raise", + " return super().__getattr__(item)", + " original_error = f\"'{self.__class__.__name__}' object has no attribute '{item}'\"", + " raise AttributeError(original_error)", + ] + ) + + lines.extend( + [ + " return __getattr__", + "__getattr__ = wrapper(_cls)", + ] + ) + + unique_filename = _generate_unique_filename(cls, "getattr") + + glob = { + "cached_properties": cached_properties, + "_cached_setattr_get": _OBJ_SETATTR.__get__, + "original_getattr": original_getattr, + } + + return _linecache_and_compile( + "\n".join(lines), unique_filename, glob, locals={"_cls": cls} + )["__getattr__"] + + +def _frozen_setattrs(self, name, value): + """ + Attached to frozen classes as __setattr__. + """ + if isinstance(self, BaseException) and name in ( + "__cause__", + "__context__", + "__traceback__", + "__suppress_context__", + "__notes__", + ): + BaseException.__setattr__(self, name, value) + return + + raise FrozenInstanceError + + +def _frozen_delattrs(self, name): + """ + Attached to frozen classes as __delattr__. + """ + if isinstance(self, BaseException) and name in ("__notes__",): + BaseException.__delattr__(self, name) + return + + raise FrozenInstanceError + + +def evolve(*args, **changes): + """ + Create a new instance, based on the first positional argument with + *changes* applied. + + .. tip:: + + On Python 3.13 and later, you can also use `copy.replace` instead. + + Args: + + inst: + Instance of a class with *attrs* attributes. *inst* must be passed + as a positional argument. + + changes: + Keyword changes in the new copy. + + Returns: + A copy of inst with *changes* incorporated. + + Raises: + TypeError: + If *attr_name* couldn't be found in the class ``__init__``. + + attrs.exceptions.NotAnAttrsClassError: + If *cls* is not an *attrs* class. + + .. versionadded:: 17.1.0 + .. deprecated:: 23.1.0 + It is now deprecated to pass the instance using the keyword argument + *inst*. It will raise a warning until at least April 2024, after which + it will become an error. Always pass the instance as a positional + argument. + .. versionchanged:: 24.1.0 + *inst* can't be passed as a keyword argument anymore. + """ + try: + (inst,) = args + except ValueError: + msg = ( + f"evolve() takes 1 positional argument, but {len(args)} were given" + ) + raise TypeError(msg) from None + + cls = inst.__class__ + attrs = fields(cls) + for a in attrs: + if not a.init: + continue + attr_name = a.name # To deal with private attributes. + init_name = a.alias + if init_name not in changes: + changes[init_name] = getattr(inst, attr_name) + + return cls(**changes) + + +class _ClassBuilder: + """ + Iteratively build *one* class. + """ + + __slots__ = ( + "_add_method_dunders", + "_attr_names", + "_attrs", + "_base_attr_map", + "_base_names", + "_cache_hash", + "_cls", + "_cls_dict", + "_delete_attribs", + "_frozen", + "_has_custom_setattr", + "_has_post_init", + "_has_pre_init", + "_is_exc", + "_on_setattr", + "_pre_init_has_args", + "_repr_added", + "_script_snippets", + "_slots", + "_weakref_slot", + "_wrote_own_setattr", + ) + + def __init__( + self, + cls: type, + these, + auto_attribs: bool, + props: ClassProps, + has_custom_setattr: bool, + ): + attrs, base_attrs, base_map = _transform_attrs( + cls, + these, + auto_attribs, + props.kw_only, + props.collected_fields_by_mro, + props.field_transformer, + ) + + self._cls = cls + self._cls_dict = dict(cls.__dict__) if props.is_slotted else {} + self._attrs = attrs + self._base_names = {a.name for a in base_attrs} + self._base_attr_map = base_map + self._attr_names = tuple(a.name for a in attrs) + self._slots = props.is_slotted + self._frozen = props.is_frozen + self._weakref_slot = props.has_weakref_slot + self._cache_hash = ( + props.hashability is ClassProps.Hashability.HASHABLE_CACHED + ) + self._has_pre_init = bool(getattr(cls, "__attrs_pre_init__", False)) + self._pre_init_has_args = False + if self._has_pre_init: + # Check if the pre init method has more arguments than just `self` + # We want to pass arguments if pre init expects arguments + pre_init_func = cls.__attrs_pre_init__ + pre_init_signature = inspect.signature(pre_init_func) + self._pre_init_has_args = len(pre_init_signature.parameters) > 1 + self._has_post_init = bool(getattr(cls, "__attrs_post_init__", False)) + self._delete_attribs = not bool(these) + self._is_exc = props.is_exception + self._on_setattr = props.on_setattr_hook + + self._has_custom_setattr = has_custom_setattr + self._wrote_own_setattr = False + + self._cls_dict["__attrs_attrs__"] = self._attrs + self._cls_dict["__attrs_props__"] = props + + if props.is_frozen: + self._cls_dict["__setattr__"] = _frozen_setattrs + self._cls_dict["__delattr__"] = _frozen_delattrs + + self._wrote_own_setattr = True + elif self._on_setattr in ( + _DEFAULT_ON_SETATTR, + setters.validate, + setters.convert, + ): + has_validator = has_converter = False + for a in attrs: + if a.validator is not None: + has_validator = True + if a.converter is not None: + has_converter = True + + if has_validator and has_converter: + break + if ( + ( + self._on_setattr == _DEFAULT_ON_SETATTR + and not (has_validator or has_converter) + ) + or (self._on_setattr == setters.validate and not has_validator) + or (self._on_setattr == setters.convert and not has_converter) + ): + # If class-level on_setattr is set to convert + validate, but + # there's no field to convert or validate, pretend like there's + # no on_setattr. + self._on_setattr = None + + if props.added_pickling: + ( + self._cls_dict["__getstate__"], + self._cls_dict["__setstate__"], + ) = self._make_getstate_setstate() + + # tuples of script, globs, hook + self._script_snippets: list[ + tuple[str, dict, Callable[[dict, dict], Any]] + ] = [] + self._repr_added = False + + # We want to only do this check once; in 99.9% of cases these + # exist. + if not hasattr(self._cls, "__module__") or not hasattr( + self._cls, "__qualname__" + ): + self._add_method_dunders = self._add_method_dunders_safe + else: + self._add_method_dunders = self._add_method_dunders_unsafe + + def __repr__(self): + return f"<_ClassBuilder(cls={self._cls.__name__})>" + + def _eval_snippets(self) -> None: + """ + Evaluate any registered snippets in one go. + """ + script = "\n".join([snippet[0] for snippet in self._script_snippets]) + globs = {} + for _, snippet_globs, _ in self._script_snippets: + globs.update(snippet_globs) + + locs = _linecache_and_compile( + script, + _generate_unique_filename(self._cls, "methods"), + globs, + ) + + for _, _, hook in self._script_snippets: + hook(self._cls_dict, locs) + + def build_class(self): + """ + Finalize class based on the accumulated configuration. + + Builder cannot be used after calling this method. + """ + self._eval_snippets() + if self._slots is True: + cls = self._create_slots_class() + self._cls.__attrs_base_of_slotted__ = weakref.ref(cls) + else: + cls = self._patch_original_class() + if PY_3_10_PLUS: + cls = abc.update_abstractmethods(cls) + + # The method gets only called if it's not inherited from a base class. + # _has_own_attribute does NOT work properly for classmethods. + if ( + getattr(cls, "__attrs_init_subclass__", None) + and "__attrs_init_subclass__" not in cls.__dict__ + ): + cls.__attrs_init_subclass__() + + return cls + + def _patch_original_class(self): + """ + Apply accumulated methods and return the class. + """ + cls = self._cls + base_names = self._base_names + + # Clean class of attribute definitions (`attr.ib()`s). + if self._delete_attribs: + for name in self._attr_names: + if ( + name not in base_names + and getattr(cls, name, _SENTINEL) is not _SENTINEL + ): + # An AttributeError can happen if a base class defines a + # class variable and we want to set an attribute with the + # same name by using only a type annotation. + with contextlib.suppress(AttributeError): + delattr(cls, name) + + # Attach our dunder methods. + for name, value in self._cls_dict.items(): + setattr(cls, name, value) + + # If we've inherited an attrs __setattr__ and don't write our own, + # reset it to object's. + if not self._wrote_own_setattr and getattr( + cls, "__attrs_own_setattr__", False + ): + cls.__attrs_own_setattr__ = False + + if not self._has_custom_setattr: + cls.__setattr__ = _OBJ_SETATTR + + return cls + + def _create_slots_class(self): + """ + Build and return a new class with a `__slots__` attribute. + """ + cd = { + k: v + for k, v in self._cls_dict.items() + if k not in (*tuple(self._attr_names), "__dict__", "__weakref__") + } + + # 3.14.0rc2+ + if hasattr(sys, "_clear_type_descriptors"): + sys._clear_type_descriptors(self._cls) + + # If our class doesn't have its own implementation of __setattr__ + # (either from the user or by us), check the bases, if one of them has + # an attrs-made __setattr__, that needs to be reset. We don't walk the + # MRO because we only care about our immediate base classes. + # XXX: This can be confused by subclassing a slotted attrs class with + # XXX: a non-attrs class and subclass the resulting class with an attrs + # XXX: class. See `test_slotted_confused` for details. For now that's + # XXX: OK with us. + if not self._wrote_own_setattr: + cd["__attrs_own_setattr__"] = False + + if not self._has_custom_setattr: + for base_cls in self._cls.__bases__: + if base_cls.__dict__.get("__attrs_own_setattr__", False): + cd["__setattr__"] = _OBJ_SETATTR + break + + # Traverse the MRO to collect existing slots + # and check for an existing __weakref__. + existing_slots = {} + weakref_inherited = False + for base_cls in self._cls.__mro__[1:-1]: + if base_cls.__dict__.get("__weakref__", None) is not None: + weakref_inherited = True + existing_slots.update( + { + name: getattr(base_cls, name) + for name in getattr(base_cls, "__slots__", []) + } + ) + + base_names = set(self._base_names) + + names = self._attr_names + if ( + self._weakref_slot + and "__weakref__" not in getattr(self._cls, "__slots__", ()) + and "__weakref__" not in names + and not weakref_inherited + ): + names += ("__weakref__",) + + cached_properties = { + name: cached_prop.func + for name, cached_prop in cd.items() + if isinstance(cached_prop, cached_property) + } + + # Collect methods with a `__class__` reference that are shadowed in the new class. + # To know to update them. + additional_closure_functions_to_update = [] + if cached_properties: + class_annotations = _get_annotations(self._cls) + for name, func in cached_properties.items(): + # Add cached properties to names for slotting. + names += (name,) + # Clear out function from class to avoid clashing. + del cd[name] + additional_closure_functions_to_update.append(func) + annotation = inspect.signature(func).return_annotation + if annotation is not inspect.Parameter.empty: + class_annotations[name] = annotation + + original_getattr = cd.get("__getattr__") + if original_getattr is not None: + additional_closure_functions_to_update.append(original_getattr) + + cd["__getattr__"] = _make_cached_property_getattr( + cached_properties, original_getattr, self._cls + ) + + # We only add the names of attributes that aren't inherited. + # Setting __slots__ to inherited attributes wastes memory. + slot_names = [name for name in names if name not in base_names] + + # There are slots for attributes from current class + # that are defined in parent classes. + # As their descriptors may be overridden by a child class, + # we collect them here and update the class dict + reused_slots = { + slot: slot_descriptor + for slot, slot_descriptor in existing_slots.items() + if slot in slot_names + } + slot_names = [name for name in slot_names if name not in reused_slots] + cd.update(reused_slots) + if self._cache_hash: + slot_names.append(_HASH_CACHE_FIELD) + + cd["__slots__"] = tuple(slot_names) + + cd["__qualname__"] = self._cls.__qualname__ + + # Create new class based on old class and our methods. + cls = type(self._cls)(self._cls.__name__, self._cls.__bases__, cd) + + # The following is a fix for + # . + # If a method mentions `__class__` or uses the no-arg super(), the + # compiler will bake a reference to the class in the method itself + # as `method.__closure__`. Since we replace the class with a + # clone, we rewrite these references so it keeps working. + for item in itertools.chain( + cls.__dict__.values(), additional_closure_functions_to_update + ): + if isinstance(item, (classmethod, staticmethod)): + # Class- and staticmethods hide their functions inside. + # These might need to be rewritten as well. + closure_cells = getattr(item.__func__, "__closure__", None) + elif isinstance(item, property): + # Workaround for property `super()` shortcut (PY3-only). + # There is no universal way for other descriptors. + closure_cells = getattr(item.fget, "__closure__", None) + else: + closure_cells = getattr(item, "__closure__", None) + + if not closure_cells: # Catch None or the empty list. + continue + for cell in closure_cells: + try: + match = cell.cell_contents is self._cls + except ValueError: # noqa: PERF203 + # ValueError: Cell is empty + pass + else: + if match: + cell.cell_contents = cls + return cls + + def add_repr(self, ns): + script, globs = _make_repr_script(self._attrs, ns) + + def _attach_repr(cls_dict, globs): + cls_dict["__repr__"] = self._add_method_dunders(globs["__repr__"]) + + self._script_snippets.append((script, globs, _attach_repr)) + self._repr_added = True + return self + + def add_str(self): + if not self._repr_added: + msg = "__str__ can only be generated if a __repr__ exists." + raise ValueError(msg) + + def __str__(self): + return self.__repr__() + + self._cls_dict["__str__"] = self._add_method_dunders(__str__) + return self + + def _make_getstate_setstate(self): + """ + Create custom __setstate__ and __getstate__ methods. + """ + # __weakref__ is not writable. + state_attr_names = tuple( + an for an in self._attr_names if an != "__weakref__" + ) + + def slots_getstate(self): + """ + Automatically created by attrs. + """ + return {name: getattr(self, name) for name in state_attr_names} + + hash_caching_enabled = self._cache_hash + + def slots_setstate(self, state): + """ + Automatically created by attrs. + """ + __bound_setattr = _OBJ_SETATTR.__get__(self) + if isinstance(state, tuple): + # Backward compatibility with attrs instances pickled with + # attrs versions before v22.2.0 which stored tuples. + for name, value in zip(state_attr_names, state): + __bound_setattr(name, value) + else: + for name in state_attr_names: + if name in state: + __bound_setattr(name, state[name]) + + # The hash code cache is not included when the object is + # serialized, but it still needs to be initialized to None to + # indicate that the first call to __hash__ should be a cache + # miss. + if hash_caching_enabled: + __bound_setattr(_HASH_CACHE_FIELD, None) + + return slots_getstate, slots_setstate + + def make_unhashable(self): + self._cls_dict["__hash__"] = None + return self + + def add_hash(self): + script, globs = _make_hash_script( + self._cls, + self._attrs, + frozen=self._frozen, + cache_hash=self._cache_hash, + ) + + def attach_hash(cls_dict: dict, locs: dict) -> None: + cls_dict["__hash__"] = self._add_method_dunders(locs["__hash__"]) + + self._script_snippets.append((script, globs, attach_hash)) + + return self + + def add_init(self): + script, globs, annotations = _make_init_script( + self._cls, + self._attrs, + self._has_pre_init, + self._pre_init_has_args, + self._has_post_init, + self._frozen, + self._slots, + self._cache_hash, + self._base_attr_map, + self._is_exc, + self._on_setattr, + attrs_init=False, + ) + + def _attach_init(cls_dict, globs): + init = globs["__init__"] + init.__annotations__ = annotations + cls_dict["__init__"] = self._add_method_dunders(init) + + self._script_snippets.append((script, globs, _attach_init)) + + return self + + def add_replace(self): + self._cls_dict["__replace__"] = self._add_method_dunders( + lambda self, **changes: evolve(self, **changes) + ) + return self + + def add_match_args(self): + self._cls_dict["__match_args__"] = tuple( + field.name + for field in self._attrs + if field.init and not field.kw_only + ) + + def add_attrs_init(self): + script, globs, annotations = _make_init_script( + self._cls, + self._attrs, + self._has_pre_init, + self._pre_init_has_args, + self._has_post_init, + self._frozen, + self._slots, + self._cache_hash, + self._base_attr_map, + self._is_exc, + self._on_setattr, + attrs_init=True, + ) + + def _attach_attrs_init(cls_dict, globs): + init = globs["__attrs_init__"] + init.__annotations__ = annotations + cls_dict["__attrs_init__"] = self._add_method_dunders(init) + + self._script_snippets.append((script, globs, _attach_attrs_init)) + + return self + + def add_eq(self): + cd = self._cls_dict + + script, globs = _make_eq_script(self._attrs) + + def _attach_eq(cls_dict, globs): + cls_dict["__eq__"] = self._add_method_dunders(globs["__eq__"]) + + self._script_snippets.append((script, globs, _attach_eq)) + + cd["__ne__"] = __ne__ + + return self + + def add_order(self): + cd = self._cls_dict + + cd["__lt__"], cd["__le__"], cd["__gt__"], cd["__ge__"] = ( + self._add_method_dunders(meth) + for meth in _make_order(self._cls, self._attrs) + ) + + return self + + def add_setattr(self): + sa_attrs = {} + for a in self._attrs: + on_setattr = a.on_setattr or self._on_setattr + if on_setattr and on_setattr is not setters.NO_OP: + sa_attrs[a.name] = a, on_setattr + + if not sa_attrs: + return self + + if self._has_custom_setattr: + # We need to write a __setattr__ but there already is one! + msg = "Can't combine custom __setattr__ with on_setattr hooks." + raise ValueError(msg) + + # docstring comes from _add_method_dunders + def __setattr__(self, name, val): + try: + a, hook = sa_attrs[name] + except KeyError: + nval = val + else: + nval = hook(self, a, val) + + _OBJ_SETATTR(self, name, nval) + + self._cls_dict["__attrs_own_setattr__"] = True + self._cls_dict["__setattr__"] = self._add_method_dunders(__setattr__) + self._wrote_own_setattr = True + + return self + + def _add_method_dunders_unsafe(self, method: Callable) -> Callable: + """ + Add __module__ and __qualname__ to a *method*. + """ + method.__module__ = self._cls.__module__ + + method.__qualname__ = f"{self._cls.__qualname__}.{method.__name__}" + + method.__doc__ = ( + f"Method generated by attrs for class {self._cls.__qualname__}." + ) + + return method + + def _add_method_dunders_safe(self, method: Callable) -> Callable: + """ + Add __module__ and __qualname__ to a *method* if possible. + """ + with contextlib.suppress(AttributeError): + method.__module__ = self._cls.__module__ + + with contextlib.suppress(AttributeError): + method.__qualname__ = f"{self._cls.__qualname__}.{method.__name__}" + + with contextlib.suppress(AttributeError): + method.__doc__ = f"Method generated by attrs for class {self._cls.__qualname__}." + + return method + + +def _determine_attrs_eq_order(cmp, eq, order, default_eq): + """ + Validate the combination of *cmp*, *eq*, and *order*. Derive the effective + values of eq and order. If *eq* is None, set it to *default_eq*. + """ + if cmp is not None and any((eq is not None, order is not None)): + msg = "Don't mix `cmp` with `eq' and `order`." + raise ValueError(msg) + + # cmp takes precedence due to bw-compatibility. + if cmp is not None: + return cmp, cmp + + # If left None, equality is set to the specified default and ordering + # mirrors equality. + if eq is None: + eq = default_eq + + if order is None: + order = eq + + if eq is False and order is True: + msg = "`order` can only be True if `eq` is True too." + raise ValueError(msg) + + return eq, order + + +def _determine_attrib_eq_order(cmp, eq, order, default_eq): + """ + Validate the combination of *cmp*, *eq*, and *order*. Derive the effective + values of eq and order. If *eq* is None, set it to *default_eq*. + """ + if cmp is not None and any((eq is not None, order is not None)): + msg = "Don't mix `cmp` with `eq' and `order`." + raise ValueError(msg) + + def decide_callable_or_boolean(value): + """ + Decide whether a key function is used. + """ + if callable(value): + value, key = True, value + else: + key = None + return value, key + + # cmp takes precedence due to bw-compatibility. + if cmp is not None: + cmp, cmp_key = decide_callable_or_boolean(cmp) + return cmp, cmp_key, cmp, cmp_key + + # If left None, equality is set to the specified default and ordering + # mirrors equality. + if eq is None: + eq, eq_key = default_eq, None + else: + eq, eq_key = decide_callable_or_boolean(eq) + + if order is None: + order, order_key = eq, eq_key + else: + order, order_key = decide_callable_or_boolean(order) + + if eq is False and order is True: + msg = "`order` can only be True if `eq` is True too." + raise ValueError(msg) + + return eq, eq_key, order, order_key + + +def _determine_whether_to_implement( + cls, flag, auto_detect, dunders, default=True +): + """ + Check whether we should implement a set of methods for *cls*. + + *flag* is the argument passed into @attr.s like 'init', *auto_detect* the + same as passed into @attr.s and *dunders* is a tuple of attribute names + whose presence signal that the user has implemented it themselves. + + Return *default* if no reason for either for or against is found. + """ + if flag is True or flag is False: + return flag + + if flag is None and auto_detect is False: + return default + + # Logically, flag is None and auto_detect is True here. + for dunder in dunders: + if _has_own_attribute(cls, dunder): + return False + + return default + + +def attrs( + maybe_cls=None, + these=None, + repr_ns=None, + repr=None, + cmp=None, + hash=None, + init=None, + slots=False, + frozen=False, + weakref_slot=True, + str=False, + auto_attribs=False, + kw_only=False, + cache_hash=False, + auto_exc=False, + eq=None, + order=None, + auto_detect=False, + collect_by_mro=False, + getstate_setstate=None, + on_setattr=None, + field_transformer=None, + match_args=True, + unsafe_hash=None, + force_kw_only=True, +): + r""" + A class decorator that adds :term:`dunder methods` according to the + specified attributes using `attr.ib` or the *these* argument. + + Consider using `attrs.define` / `attrs.frozen` in new code (``attr.s`` will + *never* go away, though). + + Args: + repr_ns (str): + When using nested classes, there was no way in Python 2 to + automatically detect that. This argument allows to set a custom + name for a more meaningful ``repr`` output. This argument is + pointless in Python 3 and is therefore deprecated. + + .. caution:: + Refer to `attrs.define` for the rest of the parameters, but note that they + can have different defaults. + + Notably, leaving *on_setattr* as `None` will **not** add any hooks. + + .. versionadded:: 16.0.0 *slots* + .. versionadded:: 16.1.0 *frozen* + .. versionadded:: 16.3.0 *str* + .. versionadded:: 16.3.0 Support for ``__attrs_post_init__``. + .. versionchanged:: 17.1.0 + *hash* supports `None` as value which is also the default now. + .. versionadded:: 17.3.0 *auto_attribs* + .. versionchanged:: 18.1.0 + If *these* is passed, no attributes are deleted from the class body. + .. versionchanged:: 18.1.0 If *these* is ordered, the order is retained. + .. versionadded:: 18.2.0 *weakref_slot* + .. deprecated:: 18.2.0 + ``__lt__``, ``__le__``, ``__gt__``, and ``__ge__`` now raise a + `DeprecationWarning` if the classes compared are subclasses of + each other. ``__eq`` and ``__ne__`` never tried to compared subclasses + to each other. + .. versionchanged:: 19.2.0 + ``__lt__``, ``__le__``, ``__gt__``, and ``__ge__`` now do not consider + subclasses comparable anymore. + .. versionadded:: 18.2.0 *kw_only* + .. versionadded:: 18.2.0 *cache_hash* + .. versionadded:: 19.1.0 *auto_exc* + .. deprecated:: 19.2.0 *cmp* Removal on or after 2021-06-01. + .. versionadded:: 19.2.0 *eq* and *order* + .. versionadded:: 20.1.0 *auto_detect* + .. versionadded:: 20.1.0 *collect_by_mro* + .. versionadded:: 20.1.0 *getstate_setstate* + .. versionadded:: 20.1.0 *on_setattr* + .. versionadded:: 20.3.0 *field_transformer* + .. versionchanged:: 21.1.0 + ``init=False`` injects ``__attrs_init__`` + .. versionchanged:: 21.1.0 Support for ``__attrs_pre_init__`` + .. versionchanged:: 21.1.0 *cmp* undeprecated + .. versionadded:: 21.3.0 *match_args* + .. versionadded:: 22.2.0 + *unsafe_hash* as an alias for *hash* (for :pep:`681` compliance). + .. deprecated:: 24.1.0 *repr_ns* + .. versionchanged:: 24.1.0 + Instances are not compared as tuples of attributes anymore, but using a + big ``and`` condition. This is faster and has more correct behavior for + uncomparable values like `math.nan`. + .. versionadded:: 24.1.0 + If a class has an *inherited* classmethod called + ``__attrs_init_subclass__``, it is executed after the class is created. + .. deprecated:: 24.1.0 *hash* is deprecated in favor of *unsafe_hash*. + .. versionchanged:: 25.4.0 + *kw_only* now only applies to attributes defined in the current class, + and respects attribute-level ``kw_only=False`` settings. + .. versionadded:: 25.4.0 *force_kw_only* + """ + if repr_ns is not None: + import warnings + + warnings.warn( + DeprecationWarning( + "The `repr_ns` argument is deprecated and will be removed in or after August 2025." + ), + stacklevel=2, + ) + + eq_, order_ = _determine_attrs_eq_order(cmp, eq, order, None) + + # unsafe_hash takes precedence due to PEP 681. + if unsafe_hash is not None: + hash = unsafe_hash + + if isinstance(on_setattr, (list, tuple)): + on_setattr = setters.pipe(*on_setattr) + + def wrap(cls): + nonlocal hash + is_frozen = frozen or _has_frozen_base_class(cls) + is_exc = auto_exc is True and issubclass(cls, BaseException) + has_own_setattr = auto_detect and _has_own_attribute( + cls, "__setattr__" + ) + + if has_own_setattr and is_frozen: + msg = "Can't freeze a class with a custom __setattr__." + raise ValueError(msg) + + eq = not is_exc and _determine_whether_to_implement( + cls, eq_, auto_detect, ("__eq__", "__ne__") + ) + + Hashability = ClassProps.Hashability + + if is_exc: + hashability = Hashability.LEAVE_ALONE + elif hash is True: + hashability = ( + Hashability.HASHABLE_CACHED + if cache_hash + else Hashability.HASHABLE + ) + elif hash is False: + hashability = Hashability.LEAVE_ALONE + elif hash is None: + if auto_detect is True and _has_own_attribute(cls, "__hash__"): + hashability = Hashability.LEAVE_ALONE + elif eq is True and is_frozen is True: + hashability = ( + Hashability.HASHABLE_CACHED + if cache_hash + else Hashability.HASHABLE + ) + elif eq is False: + hashability = Hashability.LEAVE_ALONE + else: + hashability = Hashability.UNHASHABLE + else: + msg = "Invalid value for hash. Must be True, False, or None." + raise TypeError(msg) + + KeywordOnly = ClassProps.KeywordOnly + if kw_only: + kwo = KeywordOnly.FORCE if force_kw_only else KeywordOnly.YES + else: + kwo = KeywordOnly.NO + + props = ClassProps( + is_exception=is_exc, + is_frozen=is_frozen, + is_slotted=slots, + collected_fields_by_mro=collect_by_mro, + added_init=_determine_whether_to_implement( + cls, init, auto_detect, ("__init__",) + ), + added_repr=_determine_whether_to_implement( + cls, repr, auto_detect, ("__repr__",) + ), + added_eq=eq, + added_ordering=not is_exc + and _determine_whether_to_implement( + cls, + order_, + auto_detect, + ("__lt__", "__le__", "__gt__", "__ge__"), + ), + hashability=hashability, + added_match_args=match_args, + kw_only=kwo, + has_weakref_slot=weakref_slot, + added_str=str, + added_pickling=_determine_whether_to_implement( + cls, + getstate_setstate, + auto_detect, + ("__getstate__", "__setstate__"), + default=slots, + ), + on_setattr_hook=on_setattr, + field_transformer=field_transformer, + ) + + if not props.is_hashable and cache_hash: + msg = "Invalid value for cache_hash. To use hash caching, hashing must be either explicitly or implicitly enabled." + raise TypeError(msg) + + builder = _ClassBuilder( + cls, + these, + auto_attribs=auto_attribs, + props=props, + has_custom_setattr=has_own_setattr, + ) + + if props.added_repr: + builder.add_repr(repr_ns) + + if props.added_str: + builder.add_str() + + if props.added_eq: + builder.add_eq() + if props.added_ordering: + builder.add_order() + + if not frozen: + builder.add_setattr() + + if props.is_hashable: + builder.add_hash() + elif props.hashability is Hashability.UNHASHABLE: + builder.make_unhashable() + + if props.added_init: + builder.add_init() + else: + builder.add_attrs_init() + if cache_hash: + msg = "Invalid value for cache_hash. To use hash caching, init must be True." + raise TypeError(msg) + + if PY_3_13_PLUS and not _has_own_attribute(cls, "__replace__"): + builder.add_replace() + + if ( + PY_3_10_PLUS + and match_args + and not _has_own_attribute(cls, "__match_args__") + ): + builder.add_match_args() + + return builder.build_class() + + # maybe_cls's type depends on the usage of the decorator. It's a class + # if it's used as `@attrs` but `None` if used as `@attrs()`. + if maybe_cls is None: + return wrap + + return wrap(maybe_cls) + + +_attrs = attrs +""" +Internal alias so we can use it in functions that take an argument called +*attrs*. +""" + + +def _has_frozen_base_class(cls): + """ + Check whether *cls* has a frozen ancestor by looking at its + __setattr__. + """ + return cls.__setattr__ is _frozen_setattrs + + +def _generate_unique_filename(cls: type, func_name: str) -> str: + """ + Create a "filename" suitable for a function being generated. + """ + return ( + f"" + ) + + +def _make_hash_script( + cls: type, attrs: list[Attribute], frozen: bool, cache_hash: bool +) -> tuple[str, dict]: + attrs = tuple( + a for a in attrs if a.hash is True or (a.hash is None and a.eq is True) + ) + + tab = " " + + type_hash = hash(_generate_unique_filename(cls, "hash")) + # If eq is custom generated, we need to include the functions in globs + globs = {} + + hash_def = "def __hash__(self" + hash_func = "hash((" + closing_braces = "))" + if not cache_hash: + hash_def += "):" + else: + hash_def += ", *" + + hash_def += ", _cache_wrapper=__import__('attr._make')._make._CacheHashWrapper):" + hash_func = "_cache_wrapper(" + hash_func + closing_braces += ")" + + method_lines = [hash_def] + + def append_hash_computation_lines(prefix, indent): + """ + Generate the code for actually computing the hash code. + Below this will either be returned directly or used to compute + a value which is then cached, depending on the value of cache_hash + """ + + method_lines.extend( + [ + indent + prefix + hash_func, + indent + f" {type_hash},", + ] + ) + + for a in attrs: + if a.eq_key: + cmp_name = f"_{a.name}_key" + globs[cmp_name] = a.eq_key + method_lines.append( + indent + f" {cmp_name}(self.{a.name})," + ) + else: + method_lines.append(indent + f" self.{a.name},") + + method_lines.append(indent + " " + closing_braces) + + if cache_hash: + method_lines.append(tab + f"if self.{_HASH_CACHE_FIELD} is None:") + if frozen: + append_hash_computation_lines( + f"object.__setattr__(self, '{_HASH_CACHE_FIELD}', ", tab * 2 + ) + method_lines.append(tab * 2 + ")") # close __setattr__ + else: + append_hash_computation_lines( + f"self.{_HASH_CACHE_FIELD} = ", tab * 2 + ) + method_lines.append(tab + f"return self.{_HASH_CACHE_FIELD}") + else: + append_hash_computation_lines("return ", tab) + + script = "\n".join(method_lines) + return script, globs + + +def _add_hash(cls: type, attrs: list[Attribute]): + """ + Add a hash method to *cls*. + """ + script, globs = _make_hash_script( + cls, attrs, frozen=False, cache_hash=False + ) + _compile_and_eval( + script, globs, filename=_generate_unique_filename(cls, "__hash__") + ) + cls.__hash__ = globs["__hash__"] + return cls + + +def __ne__(self, other): + """ + Check equality and either forward a NotImplemented or + return the result negated. + """ + result = self.__eq__(other) + if result is NotImplemented: + return NotImplemented + + return not result + + +def _make_eq_script(attrs: list) -> tuple[str, dict]: + """ + Create __eq__ method for *cls* with *attrs*. + """ + attrs = [a for a in attrs if a.eq] + + lines = [ + "def __eq__(self, other):", + " if other.__class__ is not self.__class__:", + " return NotImplemented", + ] + + globs = {} + if attrs: + lines.append(" return (") + for a in attrs: + if a.eq_key: + cmp_name = f"_{a.name}_key" + # Add the key function to the global namespace + # of the evaluated function. + globs[cmp_name] = a.eq_key + lines.append( + f" {cmp_name}(self.{a.name}) == {cmp_name}(other.{a.name})" + ) + else: + lines.append(f" self.{a.name} == other.{a.name}") + if a is not attrs[-1]: + lines[-1] = f"{lines[-1]} and" + lines.append(" )") + else: + lines.append(" return True") + + script = "\n".join(lines) + + return script, globs + + +def _make_order(cls, attrs): + """ + Create ordering methods for *cls* with *attrs*. + """ + attrs = [a for a in attrs if a.order] + + def attrs_to_tuple(obj): + """ + Save us some typing. + """ + return tuple( + key(value) if key else value + for value, key in ( + (getattr(obj, a.name), a.order_key) for a in attrs + ) + ) + + def __lt__(self, other): + """ + Automatically created by attrs. + """ + if other.__class__ is self.__class__: + return attrs_to_tuple(self) < attrs_to_tuple(other) + + return NotImplemented + + def __le__(self, other): + """ + Automatically created by attrs. + """ + if other.__class__ is self.__class__: + return attrs_to_tuple(self) <= attrs_to_tuple(other) + + return NotImplemented + + def __gt__(self, other): + """ + Automatically created by attrs. + """ + if other.__class__ is self.__class__: + return attrs_to_tuple(self) > attrs_to_tuple(other) + + return NotImplemented + + def __ge__(self, other): + """ + Automatically created by attrs. + """ + if other.__class__ is self.__class__: + return attrs_to_tuple(self) >= attrs_to_tuple(other) + + return NotImplemented + + return __lt__, __le__, __gt__, __ge__ + + +def _add_eq(cls, attrs=None): + """ + Add equality methods to *cls* with *attrs*. + """ + if attrs is None: + attrs = cls.__attrs_attrs__ + + script, globs = _make_eq_script(attrs) + _compile_and_eval( + script, globs, filename=_generate_unique_filename(cls, "__eq__") + ) + cls.__eq__ = globs["__eq__"] + cls.__ne__ = __ne__ + + return cls + + +def _make_repr_script(attrs, ns) -> tuple[str, dict]: + """ + Create the source and globs for a __repr__ and return it. + """ + # Figure out which attributes to include, and which function to use to + # format them. The a.repr value can be either bool or a custom + # callable. + attr_names_with_reprs = tuple( + (a.name, (repr if a.repr is True else a.repr), a.init) + for a in attrs + if a.repr is not False + ) + globs = { + name + "_repr": r for name, r, _ in attr_names_with_reprs if r != repr + } + globs["_compat"] = _compat + globs["AttributeError"] = AttributeError + globs["NOTHING"] = NOTHING + attribute_fragments = [] + for name, r, i in attr_names_with_reprs: + accessor = ( + "self." + name if i else 'getattr(self, "' + name + '", NOTHING)' + ) + fragment = ( + "%s={%s!r}" % (name, accessor) + if r == repr + else "%s={%s_repr(%s)}" % (name, name, accessor) + ) + attribute_fragments.append(fragment) + repr_fragment = ", ".join(attribute_fragments) + + if ns is None: + cls_name_fragment = '{self.__class__.__qualname__.rsplit(">.", 1)[-1]}' + else: + cls_name_fragment = ns + ".{self.__class__.__name__}" + + lines = [ + "def __repr__(self):", + " try:", + " already_repring = _compat.repr_context.already_repring", + " except AttributeError:", + " already_repring = {id(self),}", + " _compat.repr_context.already_repring = already_repring", + " else:", + " if id(self) in already_repring:", + " return '...'", + " else:", + " already_repring.add(id(self))", + " try:", + f" return f'{cls_name_fragment}({repr_fragment})'", + " finally:", + " already_repring.remove(id(self))", + ] + + return "\n".join(lines), globs + + +def _add_repr(cls, ns=None, attrs=None): + """ + Add a repr method to *cls*. + """ + if attrs is None: + attrs = cls.__attrs_attrs__ + + script, globs = _make_repr_script(attrs, ns) + _compile_and_eval( + script, globs, filename=_generate_unique_filename(cls, "__repr__") + ) + cls.__repr__ = globs["__repr__"] + return cls + + +def fields(cls): + """ + Return the tuple of *attrs* attributes for a class. + + The tuple also allows accessing the fields by their names (see below for + examples). + + Args: + cls (type): Class to introspect. + + Raises: + TypeError: If *cls* is not a class. + + attrs.exceptions.NotAnAttrsClassError: + If *cls* is not an *attrs* class. + + Returns: + tuple (with name accessors) of `attrs.Attribute` + + .. versionchanged:: 16.2.0 Returned tuple allows accessing the fields + by name. + .. versionchanged:: 23.1.0 Add support for generic classes. + """ + generic_base = get_generic_base(cls) + + if generic_base is None and not isinstance(cls, type): + msg = "Passed object must be a class." + raise TypeError(msg) + + attrs = getattr(cls, "__attrs_attrs__", None) + + if attrs is None: + if generic_base is not None: + attrs = getattr(generic_base, "__attrs_attrs__", None) + if attrs is not None: + # Even though this is global state, stick it on here to speed + # it up. We rely on `cls` being cached for this to be + # efficient. + cls.__attrs_attrs__ = attrs + return attrs + msg = f"{cls!r} is not an attrs-decorated class." + raise NotAnAttrsClassError(msg) + + return attrs + + +def fields_dict(cls): + """ + Return an ordered dictionary of *attrs* attributes for a class, whose keys + are the attribute names. + + Args: + cls (type): Class to introspect. + + Raises: + TypeError: If *cls* is not a class. + + attrs.exceptions.NotAnAttrsClassError: + If *cls* is not an *attrs* class. + + Returns: + dict[str, attrs.Attribute]: Dict of attribute name to definition + + .. versionadded:: 18.1.0 + """ + if not isinstance(cls, type): + msg = "Passed object must be a class." + raise TypeError(msg) + attrs = getattr(cls, "__attrs_attrs__", None) + if attrs is None: + msg = f"{cls!r} is not an attrs-decorated class." + raise NotAnAttrsClassError(msg) + return {a.name: a for a in attrs} + + +def validate(inst): + """ + Validate all attributes on *inst* that have a validator. + + Leaves all exceptions through. + + Args: + inst: Instance of a class with *attrs* attributes. + """ + if _config._run_validators is False: + return + + for a in fields(inst.__class__): + v = a.validator + if v is not None: + v(inst, a, getattr(inst, a.name)) + + +def _is_slot_attr(a_name, base_attr_map): + """ + Check if the attribute name comes from a slot class. + """ + cls = base_attr_map.get(a_name) + return cls and "__slots__" in cls.__dict__ + + +def _make_init_script( + cls, + attrs, + pre_init, + pre_init_has_args, + post_init, + frozen, + slots, + cache_hash, + base_attr_map, + is_exc, + cls_on_setattr, + attrs_init, +) -> tuple[str, dict, dict]: + has_cls_on_setattr = ( + cls_on_setattr is not None and cls_on_setattr is not setters.NO_OP + ) + + if frozen and has_cls_on_setattr: + msg = "Frozen classes can't use on_setattr." + raise ValueError(msg) + + needs_cached_setattr = cache_hash or frozen + filtered_attrs = [] + attr_dict = {} + for a in attrs: + if not a.init and a.default is NOTHING: + continue + + filtered_attrs.append(a) + attr_dict[a.name] = a + + if a.on_setattr is not None: + if frozen is True: + msg = "Frozen classes can't use on_setattr." + raise ValueError(msg) + + needs_cached_setattr = True + elif has_cls_on_setattr and a.on_setattr is not setters.NO_OP: + needs_cached_setattr = True + + script, globs, annotations = _attrs_to_init_script( + filtered_attrs, + frozen, + slots, + pre_init, + pre_init_has_args, + post_init, + cache_hash, + base_attr_map, + is_exc, + needs_cached_setattr, + has_cls_on_setattr, + "__attrs_init__" if attrs_init else "__init__", + ) + if cls.__module__ in sys.modules: + # This makes typing.get_type_hints(CLS.__init__) resolve string types. + globs.update(sys.modules[cls.__module__].__dict__) + + globs.update({"NOTHING": NOTHING, "attr_dict": attr_dict}) + + if needs_cached_setattr: + # Save the lookup overhead in __init__ if we need to circumvent + # setattr hooks. + globs["_cached_setattr_get"] = _OBJ_SETATTR.__get__ + + return script, globs, annotations + + +def _setattr(attr_name: str, value_var: str, has_on_setattr: bool) -> str: + """ + Use the cached object.setattr to set *attr_name* to *value_var*. + """ + return f"_setattr('{attr_name}', {value_var})" + + +def _setattr_with_converter( + attr_name: str, value_var: str, has_on_setattr: bool, converter: Converter +) -> str: + """ + Use the cached object.setattr to set *attr_name* to *value_var*, but run + its converter first. + """ + return f"_setattr('{attr_name}', {converter._fmt_converter_call(attr_name, value_var)})" + + +def _assign(attr_name: str, value: str, has_on_setattr: bool) -> str: + """ + Unless *attr_name* has an on_setattr hook, use normal assignment. Otherwise + relegate to _setattr. + """ + if has_on_setattr: + return _setattr(attr_name, value, True) + + return f"self.{attr_name} = {value}" + + +def _assign_with_converter( + attr_name: str, value_var: str, has_on_setattr: bool, converter: Converter +) -> str: + """ + Unless *attr_name* has an on_setattr hook, use normal assignment after + conversion. Otherwise relegate to _setattr_with_converter. + """ + if has_on_setattr: + return _setattr_with_converter(attr_name, value_var, True, converter) + + return f"self.{attr_name} = {converter._fmt_converter_call(attr_name, value_var)}" + + +def _determine_setters( + frozen: bool, slots: bool, base_attr_map: dict[str, type] +): + """ + Determine the correct setter functions based on whether a class is frozen + and/or slotted. + """ + if frozen is True: + if slots is True: + return (), _setattr, _setattr_with_converter + + # Dict frozen classes assign directly to __dict__. + # But only if the attribute doesn't come from an ancestor slot + # class. + # Note _inst_dict will be used again below if cache_hash is True + + def fmt_setter( + attr_name: str, value_var: str, has_on_setattr: bool + ) -> str: + if _is_slot_attr(attr_name, base_attr_map): + return _setattr(attr_name, value_var, has_on_setattr) + + return f"_inst_dict['{attr_name}'] = {value_var}" + + def fmt_setter_with_converter( + attr_name: str, + value_var: str, + has_on_setattr: bool, + converter: Converter, + ) -> str: + if has_on_setattr or _is_slot_attr(attr_name, base_attr_map): + return _setattr_with_converter( + attr_name, value_var, has_on_setattr, converter + ) + + return f"_inst_dict['{attr_name}'] = {converter._fmt_converter_call(attr_name, value_var)}" + + return ( + ("_inst_dict = self.__dict__",), + fmt_setter, + fmt_setter_with_converter, + ) + + # Not frozen -- we can just assign directly. + return (), _assign, _assign_with_converter + + +def _attrs_to_init_script( + attrs: list[Attribute], + is_frozen: bool, + is_slotted: bool, + call_pre_init: bool, + pre_init_has_args: bool, + call_post_init: bool, + does_cache_hash: bool, + base_attr_map: dict[str, type], + is_exc: bool, + needs_cached_setattr: bool, + has_cls_on_setattr: bool, + method_name: str, +) -> tuple[str, dict, dict]: + """ + Return a script of an initializer for *attrs*, a dict of globals, and + annotations for the initializer. + + The globals are required by the generated script. + """ + lines = ["self.__attrs_pre_init__()"] if call_pre_init else [] + + if needs_cached_setattr: + lines.append( + # Circumvent the __setattr__ descriptor to save one lookup per + # assignment. Note _setattr will be used again below if + # does_cache_hash is True. + "_setattr = _cached_setattr_get(self)" + ) + + extra_lines, fmt_setter, fmt_setter_with_converter = _determine_setters( + is_frozen, is_slotted, base_attr_map + ) + lines.extend(extra_lines) + + args = [] # Parameters in the definition of __init__ + pre_init_args = [] # Parameters in the call to __attrs_pre_init__ + kw_only_args = [] # Used for both 'args' and 'pre_init_args' above + attrs_to_validate = [] + + # This is a dictionary of names to validator and converter callables. + # Injecting this into __init__ globals lets us avoid lookups. + names_for_globals = {} + annotations = {"return": None} + + for a in attrs: + if a.validator: + attrs_to_validate.append(a) + + attr_name = a.name + has_on_setattr = a.on_setattr is not None or ( + a.on_setattr is not setters.NO_OP and has_cls_on_setattr + ) + # a.alias is set to maybe-mangled attr_name in _ClassBuilder if not + # explicitly provided + arg_name = a.alias + + has_factory = isinstance(a.default, Factory) + maybe_self = "self" if has_factory and a.default.takes_self else "" + + if a.converter is not None and not isinstance(a.converter, Converter): + converter = Converter(a.converter) + else: + converter = a.converter + + if a.init is False: + if has_factory: + init_factory_name = _INIT_FACTORY_PAT % (a.name,) + if converter is not None: + lines.append( + fmt_setter_with_converter( + attr_name, + init_factory_name + f"({maybe_self})", + has_on_setattr, + converter, + ) + ) + names_for_globals[converter._get_global_name(a.name)] = ( + converter.converter + ) + else: + lines.append( + fmt_setter( + attr_name, + init_factory_name + f"({maybe_self})", + has_on_setattr, + ) + ) + names_for_globals[init_factory_name] = a.default.factory + elif converter is not None: + lines.append( + fmt_setter_with_converter( + attr_name, + f"attr_dict['{attr_name}'].default", + has_on_setattr, + converter, + ) + ) + names_for_globals[converter._get_global_name(a.name)] = ( + converter.converter + ) + else: + lines.append( + fmt_setter( + attr_name, + f"attr_dict['{attr_name}'].default", + has_on_setattr, + ) + ) + elif a.default is not NOTHING and not has_factory: + arg = f"{arg_name}=attr_dict['{attr_name}'].default" + if a.kw_only: + kw_only_args.append(arg) + else: + args.append(arg) + pre_init_args.append(arg_name) + + if converter is not None: + lines.append( + fmt_setter_with_converter( + attr_name, arg_name, has_on_setattr, converter + ) + ) + names_for_globals[converter._get_global_name(a.name)] = ( + converter.converter + ) + else: + lines.append(fmt_setter(attr_name, arg_name, has_on_setattr)) + + elif has_factory: + arg = f"{arg_name}=NOTHING" + if a.kw_only: + kw_only_args.append(arg) + else: + args.append(arg) + pre_init_args.append(arg_name) + lines.append(f"if {arg_name} is not NOTHING:") + + init_factory_name = _INIT_FACTORY_PAT % (a.name,) + if converter is not None: + lines.append( + " " + + fmt_setter_with_converter( + attr_name, arg_name, has_on_setattr, converter + ) + ) + lines.append("else:") + lines.append( + " " + + fmt_setter_with_converter( + attr_name, + init_factory_name + "(" + maybe_self + ")", + has_on_setattr, + converter, + ) + ) + names_for_globals[converter._get_global_name(a.name)] = ( + converter.converter + ) + else: + lines.append( + " " + fmt_setter(attr_name, arg_name, has_on_setattr) + ) + lines.append("else:") + lines.append( + " " + + fmt_setter( + attr_name, + init_factory_name + "(" + maybe_self + ")", + has_on_setattr, + ) + ) + names_for_globals[init_factory_name] = a.default.factory + else: + if a.kw_only: + kw_only_args.append(arg_name) + else: + args.append(arg_name) + pre_init_args.append(arg_name) + + if converter is not None: + lines.append( + fmt_setter_with_converter( + attr_name, arg_name, has_on_setattr, converter + ) + ) + names_for_globals[converter._get_global_name(a.name)] = ( + converter.converter + ) + else: + lines.append(fmt_setter(attr_name, arg_name, has_on_setattr)) + + if a.init is True: + if a.type is not None and converter is None: + annotations[arg_name] = a.type + elif converter is not None and converter._first_param_type: + # Use the type from the converter if present. + annotations[arg_name] = converter._first_param_type + + if attrs_to_validate: # we can skip this if there are no validators. + names_for_globals["_config"] = _config + lines.append("if _config._run_validators is True:") + for a in attrs_to_validate: + val_name = "__attr_validator_" + a.name + attr_name = "__attr_" + a.name + lines.append(f" {val_name}(self, {attr_name}, self.{a.name})") + names_for_globals[val_name] = a.validator + names_for_globals[attr_name] = a + + if call_post_init: + lines.append("self.__attrs_post_init__()") + + # Because this is set only after __attrs_post_init__ is called, a crash + # will result if post-init tries to access the hash code. This seemed + # preferable to setting this beforehand, in which case alteration to field + # values during post-init combined with post-init accessing the hash code + # would result in silent bugs. + if does_cache_hash: + if is_frozen: + if is_slotted: + init_hash_cache = f"_setattr('{_HASH_CACHE_FIELD}', None)" + else: + init_hash_cache = f"_inst_dict['{_HASH_CACHE_FIELD}'] = None" + else: + init_hash_cache = f"self.{_HASH_CACHE_FIELD} = None" + lines.append(init_hash_cache) + + # For exceptions we rely on BaseException.__init__ for proper + # initialization. + if is_exc: + vals = ",".join(f"self.{a.name}" for a in attrs if a.init) + + lines.append(f"BaseException.__init__(self, {vals})") + + args = ", ".join(args) + pre_init_args = ", ".join(pre_init_args) + if kw_only_args: + # leading comma & kw_only args + args += f"{', ' if args else ''}*, {', '.join(kw_only_args)}" + pre_init_kw_only_args = ", ".join( + [ + f"{kw_arg_name}={kw_arg_name}" + # We need to remove the defaults from the kw_only_args. + for kw_arg_name in (kwa.split("=")[0] for kwa in kw_only_args) + ] + ) + pre_init_args += ", " if pre_init_args else "" + pre_init_args += pre_init_kw_only_args + + if call_pre_init and pre_init_has_args: + # If pre init method has arguments, pass the values given to __init__. + lines[0] = f"self.__attrs_pre_init__({pre_init_args})" + + # Python <3.12 doesn't allow backslashes in f-strings. + NL = "\n " + return ( + f"""def {method_name}(self, {args}): + {NL.join(lines) if lines else "pass"} +""", + names_for_globals, + annotations, + ) + + +def _default_init_alias_for(name: str) -> str: + """ + The default __init__ parameter name for a field. + + This performs private-name adjustment via leading-unscore stripping, + and is the default value of Attribute.alias if not provided. + """ + + return name.lstrip("_") + + +class Attribute: + """ + *Read-only* representation of an attribute. + + .. warning:: + + You should never instantiate this class yourself. + + The class has *all* arguments of `attr.ib` (except for ``factory`` which is + only syntactic sugar for ``default=Factory(...)`` plus the following: + + - ``name`` (`str`): The name of the attribute. + - ``alias`` (`str`): The __init__ parameter name of the attribute, after + any explicit overrides and default private-attribute-name handling. + - ``inherited`` (`bool`): Whether or not that attribute has been inherited + from a base class. + - ``eq_key`` and ``order_key`` (`typing.Callable` or `None`): The + callables that are used for comparing and ordering objects by this + attribute, respectively. These are set by passing a callable to + `attr.ib`'s ``eq``, ``order``, or ``cmp`` arguments. See also + :ref:`comparison customization `. + + Instances of this class are frequently used for introspection purposes + like: + + - `fields` returns a tuple of them. + - Validators get them passed as the first argument. + - The :ref:`field transformer ` hook receives a list of + them. + - The ``alias`` property exposes the __init__ parameter name of the field, + with any overrides and default private-attribute handling applied. + + + .. versionadded:: 20.1.0 *inherited* + .. versionadded:: 20.1.0 *on_setattr* + .. versionchanged:: 20.2.0 *inherited* is not taken into account for + equality checks and hashing anymore. + .. versionadded:: 21.1.0 *eq_key* and *order_key* + .. versionadded:: 22.2.0 *alias* + + For the full version history of the fields, see `attr.ib`. + """ + + # These slots must NOT be reordered because we use them later for + # instantiation. + __slots__ = ( # noqa: RUF023 + "name", + "default", + "validator", + "repr", + "eq", + "eq_key", + "order", + "order_key", + "hash", + "init", + "metadata", + "type", + "converter", + "kw_only", + "inherited", + "on_setattr", + "alias", + ) + + def __init__( + self, + name, + default, + validator, + repr, + cmp, # XXX: unused, remove along with other cmp code. + hash, + init, + inherited, + metadata=None, + type=None, + converter=None, + kw_only=False, + eq=None, + eq_key=None, + order=None, + order_key=None, + on_setattr=None, + alias=None, + ): + eq, eq_key, order, order_key = _determine_attrib_eq_order( + cmp, eq_key or eq, order_key or order, True + ) + + # Cache this descriptor here to speed things up later. + bound_setattr = _OBJ_SETATTR.__get__(self) + + # Despite the big red warning, people *do* instantiate `Attribute` + # themselves. + bound_setattr("name", name) + bound_setattr("default", default) + bound_setattr("validator", validator) + bound_setattr("repr", repr) + bound_setattr("eq", eq) + bound_setattr("eq_key", eq_key) + bound_setattr("order", order) + bound_setattr("order_key", order_key) + bound_setattr("hash", hash) + bound_setattr("init", init) + bound_setattr("converter", converter) + bound_setattr( + "metadata", + ( + types.MappingProxyType(dict(metadata)) # Shallow copy + if metadata + else _EMPTY_METADATA_SINGLETON + ), + ) + bound_setattr("type", type) + bound_setattr("kw_only", kw_only) + bound_setattr("inherited", inherited) + bound_setattr("on_setattr", on_setattr) + bound_setattr("alias", alias) + + def __setattr__(self, name, value): + raise FrozenInstanceError + + @classmethod + def from_counting_attr( + cls, name: str, ca: _CountingAttr, kw_only: bool, type=None + ): + # The 'kw_only' argument is the class-level setting, and is used if the + # attribute itself does not explicitly set 'kw_only'. + # type holds the annotated value. deal with conflicts: + if type is None: + type = ca.type + elif ca.type is not None: + msg = f"Type annotation and type argument cannot both be present for '{name}'." + raise ValueError(msg) + return cls( + name, + ca._default, + ca._validator, + ca.repr, + None, + ca.hash, + ca.init, + False, + ca.metadata, + type, + ca.converter, + kw_only if ca.kw_only is None else ca.kw_only, + ca.eq, + ca.eq_key, + ca.order, + ca.order_key, + ca.on_setattr, + ca.alias, + ) + + # Don't use attrs.evolve since fields(Attribute) doesn't work + def evolve(self, **changes): + """ + Copy *self* and apply *changes*. + + This works similarly to `attrs.evolve` but that function does not work + with :class:`attrs.Attribute`. + + It is mainly meant to be used for `transform-fields`. + + .. versionadded:: 20.3.0 + """ + new = copy.copy(self) + + new._setattrs(changes.items()) + + return new + + # Don't use _add_pickle since fields(Attribute) doesn't work + def __getstate__(self): + """ + Play nice with pickle. + """ + return tuple( + getattr(self, name) if name != "metadata" else dict(self.metadata) + for name in self.__slots__ + ) + + def __setstate__(self, state): + """ + Play nice with pickle. + """ + self._setattrs(zip(self.__slots__, state)) + + def _setattrs(self, name_values_pairs): + bound_setattr = _OBJ_SETATTR.__get__(self) + for name, value in name_values_pairs: + if name != "metadata": + bound_setattr(name, value) + else: + bound_setattr( + name, + ( + types.MappingProxyType(dict(value)) + if value + else _EMPTY_METADATA_SINGLETON + ), + ) + + +_a = [ + Attribute( + name=name, + default=NOTHING, + validator=None, + repr=True, + cmp=None, + eq=True, + order=False, + hash=(name != "metadata"), + init=True, + inherited=False, + alias=_default_init_alias_for(name), + ) + for name in Attribute.__slots__ +] + +Attribute = _add_hash( + _add_eq( + _add_repr(Attribute, attrs=_a), + attrs=[a for a in _a if a.name != "inherited"], + ), + attrs=[a for a in _a if a.hash and a.name != "inherited"], +) + + +class _CountingAttr: + """ + Intermediate representation of attributes that uses a counter to preserve + the order in which the attributes have been defined. + + *Internal* data structure of the attrs library. Running into is most + likely the result of a bug like a forgotten `@attr.s` decorator. + """ + + __slots__ = ( + "_default", + "_validator", + "alias", + "converter", + "counter", + "eq", + "eq_key", + "hash", + "init", + "kw_only", + "metadata", + "on_setattr", + "order", + "order_key", + "repr", + "type", + ) + __attrs_attrs__ = ( + *tuple( + Attribute( + name=name, + alias=_default_init_alias_for(name), + default=NOTHING, + validator=None, + repr=True, + cmp=None, + hash=True, + init=True, + kw_only=False, + eq=True, + eq_key=None, + order=False, + order_key=None, + inherited=False, + on_setattr=None, + ) + for name in ( + "counter", + "_default", + "repr", + "eq", + "order", + "hash", + "init", + "on_setattr", + "alias", + ) + ), + Attribute( + name="metadata", + alias="metadata", + default=None, + validator=None, + repr=True, + cmp=None, + hash=False, + init=True, + kw_only=False, + eq=True, + eq_key=None, + order=False, + order_key=None, + inherited=False, + on_setattr=None, + ), + ) + cls_counter = 0 + + def __init__( + self, + default, + validator, + repr, + cmp, + hash, + init, + converter, + metadata, + type, + kw_only, + eq, + eq_key, + order, + order_key, + on_setattr, + alias, + ): + _CountingAttr.cls_counter += 1 + self.counter = _CountingAttr.cls_counter + self._default = default + self._validator = validator + self.converter = converter + self.repr = repr + self.eq = eq + self.eq_key = eq_key + self.order = order + self.order_key = order_key + self.hash = hash + self.init = init + self.metadata = metadata + self.type = type + self.kw_only = kw_only + self.on_setattr = on_setattr + self.alias = alias + + def validator(self, meth): + """ + Decorator that adds *meth* to the list of validators. + + Returns *meth* unchanged. + + .. versionadded:: 17.1.0 + """ + if self._validator is None: + self._validator = meth + else: + self._validator = and_(self._validator, meth) + return meth + + def default(self, meth): + """ + Decorator that allows to set the default for an attribute. + + Returns *meth* unchanged. + + Raises: + DefaultAlreadySetError: If default has been set before. + + .. versionadded:: 17.1.0 + """ + if self._default is not NOTHING: + raise DefaultAlreadySetError + + self._default = Factory(meth, takes_self=True) + + return meth + + +_CountingAttr = _add_eq(_add_repr(_CountingAttr)) + + +class ClassProps: + """ + Effective class properties as derived from parameters to `attr.s()` or + `define()` decorators. + + This is the same data structure that *attrs* uses internally to decide how + to construct the final class. + + Warning: + + This feature is currently **experimental** and is not covered by our + strict backwards-compatibility guarantees. + + + Attributes: + is_exception (bool): + Whether the class is treated as an exception class. + + is_slotted (bool): + Whether the class is `slotted `. + + has_weakref_slot (bool): + Whether the class has a slot for weak references. + + is_frozen (bool): + Whether the class is frozen. + + kw_only (KeywordOnly): + Whether / how the class enforces keyword-only arguments on the + ``__init__`` method. + + collected_fields_by_mro (bool): + Whether the class fields were collected by method resolution order. + That is, correctly but unlike `dataclasses`. + + added_init (bool): + Whether the class has an *attrs*-generated ``__init__`` method. + + added_repr (bool): + Whether the class has an *attrs*-generated ``__repr__`` method. + + added_eq (bool): + Whether the class has *attrs*-generated equality methods. + + added_ordering (bool): + Whether the class has *attrs*-generated ordering methods. + + hashability (Hashability): How `hashable ` the class is. + + added_match_args (bool): + Whether the class supports positional `match ` over its + fields. + + added_str (bool): + Whether the class has an *attrs*-generated ``__str__`` method. + + added_pickling (bool): + Whether the class has *attrs*-generated ``__getstate__`` and + ``__setstate__`` methods for `pickle`. + + on_setattr_hook (Callable[[Any, Attribute[Any], Any], Any] | None): + The class's ``__setattr__`` hook. + + field_transformer (Callable[[Attribute[Any]], Attribute[Any]] | None): + The class's `field transformers `. + + .. versionadded:: 25.4.0 + """ + + class Hashability(enum.Enum): + """ + The hashability of a class. + + .. versionadded:: 25.4.0 + """ + + HASHABLE = "hashable" + """Write a ``__hash__``.""" + HASHABLE_CACHED = "hashable_cache" + """Write a ``__hash__`` and cache the hash.""" + UNHASHABLE = "unhashable" + """Set ``__hash__`` to ``None``.""" + LEAVE_ALONE = "leave_alone" + """Don't touch ``__hash__``.""" + + class KeywordOnly(enum.Enum): + """ + How attributes should be treated regarding keyword-only parameters. + + .. versionadded:: 25.4.0 + """ + + NO = "no" + """Attributes are not keyword-only.""" + YES = "yes" + """Attributes in current class without kw_only=False are keyword-only.""" + FORCE = "force" + """All attributes are keyword-only.""" + + __slots__ = ( # noqa: RUF023 -- order matters for __init__ + "is_exception", + "is_slotted", + "has_weakref_slot", + "is_frozen", + "kw_only", + "collected_fields_by_mro", + "added_init", + "added_repr", + "added_eq", + "added_ordering", + "hashability", + "added_match_args", + "added_str", + "added_pickling", + "on_setattr_hook", + "field_transformer", + ) + + def __init__( + self, + is_exception, + is_slotted, + has_weakref_slot, + is_frozen, + kw_only, + collected_fields_by_mro, + added_init, + added_repr, + added_eq, + added_ordering, + hashability, + added_match_args, + added_str, + added_pickling, + on_setattr_hook, + field_transformer, + ): + self.is_exception = is_exception + self.is_slotted = is_slotted + self.has_weakref_slot = has_weakref_slot + self.is_frozen = is_frozen + self.kw_only = kw_only + self.collected_fields_by_mro = collected_fields_by_mro + self.added_init = added_init + self.added_repr = added_repr + self.added_eq = added_eq + self.added_ordering = added_ordering + self.hashability = hashability + self.added_match_args = added_match_args + self.added_str = added_str + self.added_pickling = added_pickling + self.on_setattr_hook = on_setattr_hook + self.field_transformer = field_transformer + + @property + def is_hashable(self): + return ( + self.hashability is ClassProps.Hashability.HASHABLE + or self.hashability is ClassProps.Hashability.HASHABLE_CACHED + ) + + +_cas = [ + Attribute( + name=name, + default=NOTHING, + validator=None, + repr=True, + cmp=None, + eq=True, + order=False, + hash=True, + init=True, + inherited=False, + alias=_default_init_alias_for(name), + ) + for name in ClassProps.__slots__ +] + +ClassProps = _add_eq(_add_repr(ClassProps, attrs=_cas), attrs=_cas) + + +class Factory: + """ + Stores a factory callable. + + If passed as the default value to `attrs.field`, the factory is used to + generate a new value. + + Args: + factory (typing.Callable): + A callable that takes either none or exactly one mandatory + positional argument depending on *takes_self*. + + takes_self (bool): + Pass the partially initialized instance that is being initialized + as a positional argument. + + .. versionadded:: 17.1.0 *takes_self* + """ + + __slots__ = ("factory", "takes_self") + + def __init__(self, factory, takes_self=False): + self.factory = factory + self.takes_self = takes_self + + def __getstate__(self): + """ + Play nice with pickle. + """ + return tuple(getattr(self, name) for name in self.__slots__) + + def __setstate__(self, state): + """ + Play nice with pickle. + """ + for name, value in zip(self.__slots__, state): + setattr(self, name, value) + + +_f = [ + Attribute( + name=name, + default=NOTHING, + validator=None, + repr=True, + cmp=None, + eq=True, + order=False, + hash=True, + init=True, + inherited=False, + ) + for name in Factory.__slots__ +] + +Factory = _add_hash(_add_eq(_add_repr(Factory, attrs=_f), attrs=_f), attrs=_f) + + +class Converter: + """ + Stores a converter callable. + + Allows for the wrapped converter to take additional arguments. The + arguments are passed in the order they are documented. + + Args: + converter (Callable): A callable that converts the passed value. + + takes_self (bool): + Pass the partially initialized instance that is being initialized + as a positional argument. (default: `False`) + + takes_field (bool): + Pass the field definition (an :class:`Attribute`) into the + converter as a positional argument. (default: `False`) + + .. versionadded:: 24.1.0 + """ + + __slots__ = ( + "__call__", + "_first_param_type", + "_global_name", + "converter", + "takes_field", + "takes_self", + ) + + def __init__(self, converter, *, takes_self=False, takes_field=False): + self.converter = converter + self.takes_self = takes_self + self.takes_field = takes_field + + ex = _AnnotationExtractor(converter) + self._first_param_type = ex.get_first_param_type() + + if not (self.takes_self or self.takes_field): + self.__call__ = lambda value, _, __: self.converter(value) + elif self.takes_self and not self.takes_field: + self.__call__ = lambda value, instance, __: self.converter( + value, instance + ) + elif not self.takes_self and self.takes_field: + self.__call__ = lambda value, __, field: self.converter( + value, field + ) + else: + self.__call__ = lambda value, instance, field: self.converter( + value, instance, field + ) + + rt = ex.get_return_type() + if rt is not None: + self.__call__.__annotations__["return"] = rt + + @staticmethod + def _get_global_name(attr_name: str) -> str: + """ + Return the name that a converter for an attribute name *attr_name* + would have. + """ + return f"__attr_converter_{attr_name}" + + def _fmt_converter_call(self, attr_name: str, value_var: str) -> str: + """ + Return a string that calls the converter for an attribute name + *attr_name* and the value in variable named *value_var* according to + `self.takes_self` and `self.takes_field`. + """ + if not (self.takes_self or self.takes_field): + return f"{self._get_global_name(attr_name)}({value_var})" + + if self.takes_self and self.takes_field: + return f"{self._get_global_name(attr_name)}({value_var}, self, attr_dict['{attr_name}'])" + + if self.takes_self: + return f"{self._get_global_name(attr_name)}({value_var}, self)" + + return f"{self._get_global_name(attr_name)}({value_var}, attr_dict['{attr_name}'])" + + def __getstate__(self): + """ + Return a dict containing only converter and takes_self -- the rest gets + computed when loading. + """ + return { + "converter": self.converter, + "takes_self": self.takes_self, + "takes_field": self.takes_field, + } + + def __setstate__(self, state): + """ + Load instance from state. + """ + self.__init__(**state) + + +_f = [ + Attribute( + name=name, + default=NOTHING, + validator=None, + repr=True, + cmp=None, + eq=True, + order=False, + hash=True, + init=True, + inherited=False, + ) + for name in ("converter", "takes_self", "takes_field") +] + +Converter = _add_hash( + _add_eq(_add_repr(Converter, attrs=_f), attrs=_f), attrs=_f +) + + +def make_class( + name, attrs, bases=(object,), class_body=None, **attributes_arguments +): + r""" + A quick way to create a new class called *name* with *attrs*. + + .. note:: + + ``make_class()`` is a thin wrapper around `attr.s`, not `attrs.define` + which means that it doesn't come with some of the improved defaults. + + For example, if you want the same ``on_setattr`` behavior as in + `attrs.define`, you have to pass the hooks yourself: ``make_class(..., + on_setattr=setters.pipe(setters.convert, setters.validate)`` + + .. warning:: + + It is *your* duty to ensure that the class name and the attribute names + are valid identifiers. ``make_class()`` will *not* validate them for + you. + + Args: + name (str): The name for the new class. + + attrs (list | dict): + A list of names or a dictionary of mappings of names to `attr.ib`\ + s / `attrs.field`\ s. + + The order is deduced from the order of the names or attributes + inside *attrs*. Otherwise the order of the definition of the + attributes is used. + + bases (tuple[type, ...]): Classes that the new class will subclass. + + class_body (dict): + An optional dictionary of class attributes for the new class. + + attributes_arguments: Passed unmodified to `attr.s`. + + Returns: + type: A new class with *attrs*. + + .. versionadded:: 17.1.0 *bases* + .. versionchanged:: 18.1.0 If *attrs* is ordered, the order is retained. + .. versionchanged:: 23.2.0 *class_body* + .. versionchanged:: 25.2.0 Class names can now be unicode. + """ + # Class identifiers are converted into the normal form NFKC while parsing + name = unicodedata.normalize("NFKC", name) + + if isinstance(attrs, dict): + cls_dict = attrs + elif isinstance(attrs, (list, tuple)): + cls_dict = {a: attrib() for a in attrs} + else: + msg = "attrs argument must be a dict or a list." + raise TypeError(msg) + + pre_init = cls_dict.pop("__attrs_pre_init__", None) + post_init = cls_dict.pop("__attrs_post_init__", None) + user_init = cls_dict.pop("__init__", None) + + body = {} + if class_body is not None: + body.update(class_body) + if pre_init is not None: + body["__attrs_pre_init__"] = pre_init + if post_init is not None: + body["__attrs_post_init__"] = post_init + if user_init is not None: + body["__init__"] = user_init + + type_ = types.new_class(name, bases, {}, lambda ns: ns.update(body)) + + # For pickling to work, the __module__ variable needs to be set to the + # frame where the class is created. Bypass this step in environments where + # sys._getframe is not defined (Jython for example) or sys._getframe is not + # defined for arguments greater than 0 (IronPython). + with contextlib.suppress(AttributeError, ValueError): + type_.__module__ = sys._getframe(1).f_globals.get( + "__name__", "__main__" + ) + + # We do it here for proper warnings with meaningful stacklevel. + cmp = attributes_arguments.pop("cmp", None) + ( + attributes_arguments["eq"], + attributes_arguments["order"], + ) = _determine_attrs_eq_order( + cmp, + attributes_arguments.get("eq"), + attributes_arguments.get("order"), + True, + ) + + cls = _attrs(these=cls_dict, **attributes_arguments)(type_) + # Only add type annotations now or "_attrs()" will complain: + cls.__annotations__ = { + k: v.type for k, v in cls_dict.items() if v.type is not None + } + return cls + + +# These are required by within this module so we define them here and merely +# import into .validators / .converters. + + +@attrs(slots=True, unsafe_hash=True) +class _AndValidator: + """ + Compose many validators to a single one. + """ + + _validators = attrib() + + def __call__(self, inst, attr, value): + for v in self._validators: + v(inst, attr, value) + + +def and_(*validators): + """ + A validator that composes multiple validators into one. + + When called on a value, it runs all wrapped validators. + + Args: + validators (~collections.abc.Iterable[typing.Callable]): + Arbitrary number of validators. + + .. versionadded:: 17.1.0 + """ + vals = [] + for validator in validators: + vals.extend( + validator._validators + if isinstance(validator, _AndValidator) + else [validator] + ) + + return _AndValidator(tuple(vals)) + + +def pipe(*converters): + """ + A converter that composes multiple converters into one. + + When called on a value, it runs all wrapped converters, returning the + *last* value. + + Type annotations will be inferred from the wrapped converters', if they + have any. + + converters (~collections.abc.Iterable[typing.Callable]): + Arbitrary number of converters. + + .. versionadded:: 20.1.0 + """ + + return_instance = any(isinstance(c, Converter) for c in converters) + + if return_instance: + + def pipe_converter(val, inst, field): + for c in converters: + val = ( + c(val, inst, field) if isinstance(c, Converter) else c(val) + ) + + return val + + else: + + def pipe_converter(val): + for c in converters: + val = c(val) + + return val + + if not converters: + # If the converter list is empty, pipe_converter is the identity. + A = TypeVar("A") + pipe_converter.__annotations__.update({"val": A, "return": A}) + else: + # Get parameter type from first converter. + t = _AnnotationExtractor(converters[0]).get_first_param_type() + if t: + pipe_converter.__annotations__["val"] = t + + last = converters[-1] + if not PY_3_11_PLUS and isinstance(last, Converter): + last = last.__call__ + + # Get return type from last converter. + rt = _AnnotationExtractor(last).get_return_type() + if rt: + pipe_converter.__annotations__["return"] = rt + + if return_instance: + return Converter(pipe_converter, takes_self=True, takes_field=True) + return pipe_converter diff --git a/venv/lib/python3.11/site-packages/attr/_next_gen.py b/venv/lib/python3.11/site-packages/attr/_next_gen.py new file mode 100644 index 0000000..4ccd0da --- /dev/null +++ b/venv/lib/python3.11/site-packages/attr/_next_gen.py @@ -0,0 +1,674 @@ +# SPDX-License-Identifier: MIT + +""" +These are keyword-only APIs that call `attr.s` and `attr.ib` with different +default values. +""" + +from functools import partial + +from . import setters +from ._funcs import asdict as _asdict +from ._funcs import astuple as _astuple +from ._make import ( + _DEFAULT_ON_SETATTR, + NOTHING, + _frozen_setattrs, + attrib, + attrs, +) +from .exceptions import NotAnAttrsClassError, UnannotatedAttributeError + + +def define( + maybe_cls=None, + *, + these=None, + repr=None, + unsafe_hash=None, + hash=None, + init=None, + slots=True, + frozen=False, + weakref_slot=True, + str=False, + auto_attribs=None, + kw_only=False, + cache_hash=False, + auto_exc=True, + eq=None, + order=False, + auto_detect=True, + getstate_setstate=None, + on_setattr=None, + field_transformer=None, + match_args=True, + force_kw_only=False, +): + r""" + A class decorator that adds :term:`dunder methods` according to + :term:`fields ` specified using :doc:`type annotations `, + `field()` calls, or the *these* argument. + + Since *attrs* patches or replaces an existing class, you cannot use + `object.__init_subclass__` with *attrs* classes, because it runs too early. + As a replacement, you can define ``__attrs_init_subclass__`` on your class. + It will be called by *attrs* classes that subclass it after they're + created. See also :ref:`init-subclass`. + + Args: + slots (bool): + Create a :term:`slotted class ` that's more + memory-efficient. Slotted classes are generally superior to the + default dict classes, but have some gotchas you should know about, + so we encourage you to read the :term:`glossary entry `. + + auto_detect (bool): + Instead of setting the *init*, *repr*, *eq*, and *hash* arguments + explicitly, assume they are set to True **unless any** of the + involved methods for one of the arguments is implemented in the + *current* class (meaning, it is *not* inherited from some base + class). + + So, for example by implementing ``__eq__`` on a class yourself, + *attrs* will deduce ``eq=False`` and will create *neither* + ``__eq__`` *nor* ``__ne__`` (but Python classes come with a + sensible ``__ne__`` by default, so it *should* be enough to only + implement ``__eq__`` in most cases). + + Passing :data:`True` or :data:`False` to *init*, *repr*, *eq*, or *hash* + overrides whatever *auto_detect* would determine. + + auto_exc (bool): + If the class subclasses `BaseException` (which implicitly includes + any subclass of any exception), the following happens to behave + like a well-behaved Python exception class: + + - the values for *eq*, *order*, and *hash* are ignored and the + instances compare and hash by the instance's ids [#]_ , + - all attributes that are either passed into ``__init__`` or have a + default value are additionally available as a tuple in the + ``args`` attribute, + - the value of *str* is ignored leaving ``__str__`` to base + classes. + + .. [#] + Note that *attrs* will *not* remove existing implementations of + ``__hash__`` or the equality methods. It just won't add own + ones. + + on_setattr (~typing.Callable | list[~typing.Callable] | None | ~typing.Literal[attrs.setters.NO_OP]): + A callable that is run whenever the user attempts to set an + attribute (either by assignment like ``i.x = 42`` or by using + `setattr` like ``setattr(i, "x", 42)``). It receives the same + arguments as validators: the instance, the attribute that is being + modified, and the new value. + + If no exception is raised, the attribute is set to the return value + of the callable. + + If a list of callables is passed, they're automatically wrapped in + an `attrs.setters.pipe`. + + If left None, the default behavior is to run converters and + validators whenever an attribute is set. + + init (bool): + Create a ``__init__`` method that initializes the *attrs* + attributes. Leading underscores are stripped for the argument name, + unless an alias is set on the attribute. + + .. seealso:: + `init` shows advanced ways to customize the generated + ``__init__`` method, including executing code before and after. + + repr(bool): + Create a ``__repr__`` method with a human readable representation + of *attrs* attributes. + + str (bool): + Create a ``__str__`` method that is identical to ``__repr__``. This + is usually not necessary except for `Exception`\ s. + + eq (bool | None): + If True or None (default), add ``__eq__`` and ``__ne__`` methods + that check two instances for equality. + + .. seealso:: + `comparison` describes how to customize the comparison behavior + going as far comparing NumPy arrays. + + order (bool | None): + If True, add ``__lt__``, ``__le__``, ``__gt__``, and ``__ge__`` + methods that behave like *eq* above and allow instances to be + ordered. + + They compare the instances as if they were tuples of their *attrs* + attributes if and only if the types of both classes are + *identical*. + + If `None` mirror value of *eq*. + + .. seealso:: `comparison` + + unsafe_hash (bool | None): + If None (default), the ``__hash__`` method is generated according + how *eq* and *frozen* are set. + + 1. If *both* are True, *attrs* will generate a ``__hash__`` for + you. + 2. If *eq* is True and *frozen* is False, ``__hash__`` will be set + to None, marking it unhashable (which it is). + 3. If *eq* is False, ``__hash__`` will be left untouched meaning + the ``__hash__`` method of the base class will be used. If the + base class is `object`, this means it will fall back to id-based + hashing. + + Although not recommended, you can decide for yourself and force + *attrs* to create one (for example, if the class is immutable even + though you didn't freeze it programmatically) by passing True or + not. Both of these cases are rather special and should be used + carefully. + + .. seealso:: + + - Our documentation on `hashing`, + - Python's documentation on `object.__hash__`, + - and the `GitHub issue that led to the default \ behavior + `_ for more + details. + + hash (bool | None): + Deprecated alias for *unsafe_hash*. *unsafe_hash* takes precedence. + + cache_hash (bool): + Ensure that the object's hash code is computed only once and stored + on the object. If this is set to True, hashing must be either + explicitly or implicitly enabled for this class. If the hash code + is cached, avoid any reassignments of fields involved in hash code + computation or mutations of the objects those fields point to after + object creation. If such changes occur, the behavior of the + object's hash code is undefined. + + frozen (bool): + Make instances immutable after initialization. If someone attempts + to modify a frozen instance, `attrs.exceptions.FrozenInstanceError` + is raised. + + .. note:: + + 1. This is achieved by installing a custom ``__setattr__`` + method on your class, so you can't implement your own. + + 2. True immutability is impossible in Python. + + 3. This *does* have a minor a runtime performance `impact + ` when initializing new instances. In other + words: ``__init__`` is slightly slower with ``frozen=True``. + + 4. If a class is frozen, you cannot modify ``self`` in + ``__attrs_post_init__`` or a self-written ``__init__``. You + can circumvent that limitation by using + ``object.__setattr__(self, "attribute_name", value)``. + + 5. Subclasses of a frozen class are frozen too. + + kw_only (bool): + Make attributes keyword-only in the generated ``__init__`` (if + *init* is False, this parameter is ignored). Attributes that + explicitly set ``kw_only=False`` are not affected; base class + attributes are also not affected. + + Also see *force_kw_only*. + + weakref_slot (bool): + Make instances weak-referenceable. This has no effect unless + *slots* is True. + + field_transformer (~typing.Callable | None): + A function that is called with the original class object and all + fields right before *attrs* finalizes the class. You can use this, + for example, to automatically add converters or validators to + fields based on their types. + + .. seealso:: `transform-fields` + + match_args (bool): + If True (default), set ``__match_args__`` on the class to support + :pep:`634` (*Structural Pattern Matching*). It is a tuple of all + non-keyword-only ``__init__`` parameter names on Python 3.10 and + later. Ignored on older Python versions. + + collect_by_mro (bool): + If True, *attrs* collects attributes from base classes correctly + according to the `method resolution order + `_. If False, *attrs* + will mimic the (wrong) behavior of `dataclasses` and :pep:`681`. + + See also `issue #428 + `_. + + force_kw_only (bool): + A back-compat flag for restoring pre-25.4.0 behavior. If True and + ``kw_only=True``, all attributes are made keyword-only, including + base class attributes, and those set to ``kw_only=False`` at the + attribute level. Defaults to False. + + See also `issue #980 + `_. + + getstate_setstate (bool | None): + .. note:: + + This is usually only interesting for slotted classes and you + should probably just set *auto_detect* to True. + + If True, ``__getstate__`` and ``__setstate__`` are generated and + attached to the class. This is necessary for slotted classes to be + pickleable. If left None, it's True by default for slotted classes + and False for dict classes. + + If *auto_detect* is True, and *getstate_setstate* is left None, and + **either** ``__getstate__`` or ``__setstate__`` is detected + directly on the class (meaning: not inherited), it is set to False + (this is usually what you want). + + auto_attribs (bool | None): + If True, look at type annotations to determine which attributes to + use, like `dataclasses`. If False, it will only look for explicit + :func:`field` class attributes, like classic *attrs*. + + If left None, it will guess: + + 1. If any attributes are annotated and no unannotated + `attrs.field`\ s are found, it assumes *auto_attribs=True*. + 2. Otherwise it assumes *auto_attribs=False* and tries to collect + `attrs.field`\ s. + + If *attrs* decides to look at type annotations, **all** fields + **must** be annotated. If *attrs* encounters a field that is set to + a :func:`field` / `attr.ib` but lacks a type annotation, an + `attrs.exceptions.UnannotatedAttributeError` is raised. Use + ``field_name: typing.Any = field(...)`` if you don't want to set a + type. + + .. warning:: + + For features that use the attribute name to create decorators + (for example, :ref:`validators `), you still *must* + assign :func:`field` / `attr.ib` to them. Otherwise Python will + either not find the name or try to use the default value to + call, for example, ``validator`` on it. + + Attributes annotated as `typing.ClassVar`, and attributes that are + neither annotated nor set to an `field()` are **ignored**. + + these (dict[str, object]): + A dictionary of name to the (private) return value of `field()` + mappings. This is useful to avoid the definition of your attributes + within the class body because you can't (for example, if you want + to add ``__repr__`` methods to Django models) or don't want to. + + If *these* is not `None`, *attrs* will *not* search the class body + for attributes and will *not* remove any attributes from it. + + The order is deduced from the order of the attributes inside + *these*. + + Arguably, this is a rather obscure feature. + + .. versionadded:: 20.1.0 + .. versionchanged:: 21.3.0 Converters are also run ``on_setattr``. + .. versionadded:: 22.2.0 + *unsafe_hash* as an alias for *hash* (for :pep:`681` compliance). + .. versionchanged:: 24.1.0 + Instances are not compared as tuples of attributes anymore, but using a + big ``and`` condition. This is faster and has more correct behavior for + uncomparable values like `math.nan`. + .. versionadded:: 24.1.0 + If a class has an *inherited* classmethod called + ``__attrs_init_subclass__``, it is executed after the class is created. + .. deprecated:: 24.1.0 *hash* is deprecated in favor of *unsafe_hash*. + .. versionadded:: 24.3.0 + Unless already present, a ``__replace__`` method is automatically + created for `copy.replace` (Python 3.13+ only). + .. versionchanged:: 25.4.0 + *kw_only* now only applies to attributes defined in the current class, + and respects attribute-level ``kw_only=False`` settings. + .. versionadded:: 25.4.0 + Added *force_kw_only* to go back to the previous *kw_only* behavior. + + .. note:: + + The main differences to the classic `attr.s` are: + + - Automatically detect whether or not *auto_attribs* should be `True` + (c.f. *auto_attribs* parameter). + - Converters and validators run when attributes are set by default -- + if *frozen* is `False`. + - *slots=True* + + Usually, this has only upsides and few visible effects in everyday + programming. But it *can* lead to some surprising behaviors, so + please make sure to read :term:`slotted classes`. + + - *auto_exc=True* + - *auto_detect=True* + - *order=False* + - *force_kw_only=False* + - Some options that were only relevant on Python 2 or were kept around + for backwards-compatibility have been removed. + + """ + + def do_it(cls, auto_attribs): + return attrs( + maybe_cls=cls, + these=these, + repr=repr, + hash=hash, + unsafe_hash=unsafe_hash, + init=init, + slots=slots, + frozen=frozen, + weakref_slot=weakref_slot, + str=str, + auto_attribs=auto_attribs, + kw_only=kw_only, + cache_hash=cache_hash, + auto_exc=auto_exc, + eq=eq, + order=order, + auto_detect=auto_detect, + collect_by_mro=True, + getstate_setstate=getstate_setstate, + on_setattr=on_setattr, + field_transformer=field_transformer, + match_args=match_args, + force_kw_only=force_kw_only, + ) + + def wrap(cls): + """ + Making this a wrapper ensures this code runs during class creation. + + We also ensure that frozen-ness of classes is inherited. + """ + nonlocal frozen, on_setattr + + had_on_setattr = on_setattr not in (None, setters.NO_OP) + + # By default, mutable classes convert & validate on setattr. + if frozen is False and on_setattr is None: + on_setattr = _DEFAULT_ON_SETATTR + + # However, if we subclass a frozen class, we inherit the immutability + # and disable on_setattr. + for base_cls in cls.__bases__: + if base_cls.__setattr__ is _frozen_setattrs: + if had_on_setattr: + msg = "Frozen classes can't use on_setattr (frozen-ness was inherited)." + raise ValueError(msg) + + on_setattr = setters.NO_OP + break + + if auto_attribs is not None: + return do_it(cls, auto_attribs) + + try: + return do_it(cls, True) + except UnannotatedAttributeError: + return do_it(cls, False) + + # maybe_cls's type depends on the usage of the decorator. It's a class + # if it's used as `@attrs` but `None` if used as `@attrs()`. + if maybe_cls is None: + return wrap + + return wrap(maybe_cls) + + +mutable = define +frozen = partial(define, frozen=True, on_setattr=None) + + +def field( + *, + default=NOTHING, + validator=None, + repr=True, + hash=None, + init=True, + metadata=None, + type=None, + converter=None, + factory=None, + kw_only=None, + eq=None, + order=None, + on_setattr=None, + alias=None, +): + """ + Create a new :term:`field` / :term:`attribute` on a class. + + .. warning:: + + Does **nothing** unless the class is also decorated with + `attrs.define` (or similar)! + + Args: + default: + A value that is used if an *attrs*-generated ``__init__`` is used + and no value is passed while instantiating or the attribute is + excluded using ``init=False``. + + If the value is an instance of `attrs.Factory`, its callable will + be used to construct a new value (useful for mutable data types + like lists or dicts). + + If a default is not set (or set manually to `attrs.NOTHING`), a + value *must* be supplied when instantiating; otherwise a + `TypeError` will be raised. + + .. seealso:: `defaults` + + factory (~typing.Callable): + Syntactic sugar for ``default=attr.Factory(factory)``. + + validator (~typing.Callable | list[~typing.Callable]): + Callable that is called by *attrs*-generated ``__init__`` methods + after the instance has been initialized. They receive the + initialized instance, the :func:`~attrs.Attribute`, and the passed + value. + + The return value is *not* inspected so the validator has to throw + an exception itself. + + If a `list` is passed, its items are treated as validators and must + all pass. + + Validators can be globally disabled and re-enabled using + `attrs.validators.get_disabled` / `attrs.validators.set_disabled`. + + The validator can also be set using decorator notation as shown + below. + + .. seealso:: :ref:`validators` + + repr (bool | ~typing.Callable): + Include this attribute in the generated ``__repr__`` method. If + True, include the attribute; if False, omit it. By default, the + built-in ``repr()`` function is used. To override how the attribute + value is formatted, pass a ``callable`` that takes a single value + and returns a string. Note that the resulting string is used as-is, + which means it will be used directly *instead* of calling + ``repr()`` (the default). + + eq (bool | ~typing.Callable): + If True (default), include this attribute in the generated + ``__eq__`` and ``__ne__`` methods that check two instances for + equality. To override how the attribute value is compared, pass a + callable that takes a single value and returns the value to be + compared. + + .. seealso:: `comparison` + + order (bool | ~typing.Callable): + If True (default), include this attributes in the generated + ``__lt__``, ``__le__``, ``__gt__`` and ``__ge__`` methods. To + override how the attribute value is ordered, pass a callable that + takes a single value and returns the value to be ordered. + + .. seealso:: `comparison` + + hash (bool | None): + Include this attribute in the generated ``__hash__`` method. If + None (default), mirror *eq*'s value. This is the correct behavior + according the Python spec. Setting this value to anything else + than None is *discouraged*. + + .. seealso:: `hashing` + + init (bool): + Include this attribute in the generated ``__init__`` method. + + It is possible to set this to False and set a default value. In + that case this attributed is unconditionally initialized with the + specified default value or factory. + + .. seealso:: `init` + + converter (typing.Callable | Converter): + A callable that is called by *attrs*-generated ``__init__`` methods + to convert attribute's value to the desired format. + + If a vanilla callable is passed, it is given the passed-in value as + the only positional argument. It is possible to receive additional + arguments by wrapping the callable in a `Converter`. + + Either way, the returned value will be used as the new value of the + attribute. The value is converted before being passed to the + validator, if any. + + .. seealso:: :ref:`converters` + + metadata (dict | None): + An arbitrary mapping, to be used by third-party code. + + .. seealso:: `extending-metadata`. + + type (type): + The type of the attribute. Nowadays, the preferred method to + specify the type is using a variable annotation (see :pep:`526`). + This argument is provided for backwards-compatibility and for usage + with `make_class`. Regardless of the approach used, the type will + be stored on ``Attribute.type``. + + Please note that *attrs* doesn't do anything with this metadata by + itself. You can use it as part of your own code or for `static type + checking `. + + kw_only (bool | None): + Make this attribute keyword-only in the generated ``__init__`` (if + *init* is False, this parameter is ignored). If None (default), + mirror the setting from `attrs.define`. + + on_setattr (~typing.Callable | list[~typing.Callable] | None | ~typing.Literal[attrs.setters.NO_OP]): + Allows to overwrite the *on_setattr* setting from `attr.s`. If left + None, the *on_setattr* value from `attr.s` is used. Set to + `attrs.setters.NO_OP` to run **no** `setattr` hooks for this + attribute -- regardless of the setting in `define()`. + + alias (str | None): + Override this attribute's parameter name in the generated + ``__init__`` method. If left None, default to ``name`` stripped + of leading underscores. See `private-attributes`. + + .. versionadded:: 20.1.0 + .. versionchanged:: 21.1.0 + *eq*, *order*, and *cmp* also accept a custom callable + .. versionadded:: 22.2.0 *alias* + .. versionadded:: 23.1.0 + The *type* parameter has been re-added; mostly for `attrs.make_class`. + Please note that type checkers ignore this metadata. + .. versionchanged:: 25.4.0 + *kw_only* can now be None, and its default is also changed from False to + None. + + .. seealso:: + + `attr.ib` + """ + return attrib( + default=default, + validator=validator, + repr=repr, + hash=hash, + init=init, + metadata=metadata, + type=type, + converter=converter, + factory=factory, + kw_only=kw_only, + eq=eq, + order=order, + on_setattr=on_setattr, + alias=alias, + ) + + +def asdict(inst, *, recurse=True, filter=None, value_serializer=None): + """ + Same as `attr.asdict`, except that collections types are always retained + and dict is always used as *dict_factory*. + + .. versionadded:: 21.3.0 + """ + return _asdict( + inst=inst, + recurse=recurse, + filter=filter, + value_serializer=value_serializer, + retain_collection_types=True, + ) + + +def astuple(inst, *, recurse=True, filter=None): + """ + Same as `attr.astuple`, except that collections types are always retained + and `tuple` is always used as the *tuple_factory*. + + .. versionadded:: 21.3.0 + """ + return _astuple( + inst=inst, recurse=recurse, filter=filter, retain_collection_types=True + ) + + +def inspect(cls): + """ + Inspect the class and return its effective build parameters. + + Warning: + This feature is currently **experimental** and is not covered by our + strict backwards-compatibility guarantees. + + Args: + cls: The *attrs*-decorated class to inspect. + + Returns: + The effective build parameters of the class. + + Raises: + NotAnAttrsClassError: If the class is not an *attrs*-decorated class. + + .. versionadded:: 25.4.0 + """ + try: + return cls.__dict__["__attrs_props__"] + except KeyError: + msg = f"{cls!r} is not an attrs-decorated class." + raise NotAnAttrsClassError(msg) from None diff --git a/venv/lib/python3.11/site-packages/attr/_typing_compat.pyi b/venv/lib/python3.11/site-packages/attr/_typing_compat.pyi new file mode 100644 index 0000000..ca7b71e --- /dev/null +++ b/venv/lib/python3.11/site-packages/attr/_typing_compat.pyi @@ -0,0 +1,15 @@ +from typing import Any, ClassVar, Protocol + +# MYPY is a special constant in mypy which works the same way as `TYPE_CHECKING`. +MYPY = False + +if MYPY: + # A protocol to be able to statically accept an attrs class. + class AttrsInstance_(Protocol): + __attrs_attrs__: ClassVar[Any] + +else: + # For type checkers without plug-in support use an empty protocol that + # will (hopefully) be combined into a union. + class AttrsInstance_(Protocol): + pass diff --git a/venv/lib/python3.11/site-packages/attr/_version_info.py b/venv/lib/python3.11/site-packages/attr/_version_info.py new file mode 100644 index 0000000..27f1888 --- /dev/null +++ b/venv/lib/python3.11/site-packages/attr/_version_info.py @@ -0,0 +1,89 @@ +# SPDX-License-Identifier: MIT + + +from functools import total_ordering + +from ._funcs import astuple +from ._make import attrib, attrs + + +@total_ordering +@attrs(eq=False, order=False, slots=True, frozen=True) +class VersionInfo: + """ + A version object that can be compared to tuple of length 1--4: + + >>> attr.VersionInfo(19, 1, 0, "final") <= (19, 2) + True + >>> attr.VersionInfo(19, 1, 0, "final") < (19, 1, 1) + True + >>> vi = attr.VersionInfo(19, 2, 0, "final") + >>> vi < (19, 1, 1) + False + >>> vi < (19,) + False + >>> vi == (19, 2,) + True + >>> vi == (19, 2, 1) + False + + .. versionadded:: 19.2 + """ + + year = attrib(type=int) + minor = attrib(type=int) + micro = attrib(type=int) + releaselevel = attrib(type=str) + + @classmethod + def _from_version_string(cls, s): + """ + Parse *s* and return a _VersionInfo. + """ + v = s.split(".") + if len(v) == 3: + v.append("final") + + return cls( + year=int(v[0]), minor=int(v[1]), micro=int(v[2]), releaselevel=v[3] + ) + + def _ensure_tuple(self, other): + """ + Ensure *other* is a tuple of a valid length. + + Returns a possibly transformed *other* and ourselves as a tuple of + the same length as *other*. + """ + + if self.__class__ is other.__class__: + other = astuple(other) + + if not isinstance(other, tuple): + raise NotImplementedError + + if not (1 <= len(other) <= 4): + raise NotImplementedError + + return astuple(self)[: len(other)], other + + def __eq__(self, other): + try: + us, them = self._ensure_tuple(other) + except NotImplementedError: + return NotImplemented + + return us == them + + def __lt__(self, other): + try: + us, them = self._ensure_tuple(other) + except NotImplementedError: + return NotImplemented + + # Since alphabetically "dev0" < "final" < "post1" < "post2", we don't + # have to do anything special with releaselevel for now. + return us < them + + def __hash__(self): + return hash((self.year, self.minor, self.micro, self.releaselevel)) diff --git a/venv/lib/python3.11/site-packages/attr/_version_info.pyi b/venv/lib/python3.11/site-packages/attr/_version_info.pyi new file mode 100644 index 0000000..45ced08 --- /dev/null +++ b/venv/lib/python3.11/site-packages/attr/_version_info.pyi @@ -0,0 +1,9 @@ +class VersionInfo: + @property + def year(self) -> int: ... + @property + def minor(self) -> int: ... + @property + def micro(self) -> int: ... + @property + def releaselevel(self) -> str: ... diff --git a/venv/lib/python3.11/site-packages/attr/converters.py b/venv/lib/python3.11/site-packages/attr/converters.py new file mode 100644 index 0000000..0a79dee --- /dev/null +++ b/venv/lib/python3.11/site-packages/attr/converters.py @@ -0,0 +1,162 @@ +# SPDX-License-Identifier: MIT + +""" +Commonly useful converters. +""" + +import typing + +from ._compat import _AnnotationExtractor +from ._make import NOTHING, Converter, Factory, pipe + + +__all__ = [ + "default_if_none", + "optional", + "pipe", + "to_bool", +] + + +def optional(converter): + """ + A converter that allows an attribute to be optional. An optional attribute + is one which can be set to `None`. + + Type annotations will be inferred from the wrapped converter's, if it has + any. + + Args: + converter (typing.Callable): + the converter that is used for non-`None` values. + + .. versionadded:: 17.1.0 + """ + + if isinstance(converter, Converter): + + def optional_converter(val, inst, field): + if val is None: + return None + return converter(val, inst, field) + + else: + + def optional_converter(val): + if val is None: + return None + return converter(val) + + xtr = _AnnotationExtractor(converter) + + t = xtr.get_first_param_type() + if t: + optional_converter.__annotations__["val"] = typing.Optional[t] + + rt = xtr.get_return_type() + if rt: + optional_converter.__annotations__["return"] = typing.Optional[rt] + + if isinstance(converter, Converter): + return Converter(optional_converter, takes_self=True, takes_field=True) + + return optional_converter + + +def default_if_none(default=NOTHING, factory=None): + """ + A converter that allows to replace `None` values by *default* or the result + of *factory*. + + Args: + default: + Value to be used if `None` is passed. Passing an instance of + `attrs.Factory` is supported, however the ``takes_self`` option is + *not*. + + factory (typing.Callable): + A callable that takes no parameters whose result is used if `None` + is passed. + + Raises: + TypeError: If **neither** *default* or *factory* is passed. + + TypeError: If **both** *default* and *factory* are passed. + + ValueError: + If an instance of `attrs.Factory` is passed with + ``takes_self=True``. + + .. versionadded:: 18.2.0 + """ + if default is NOTHING and factory is None: + msg = "Must pass either `default` or `factory`." + raise TypeError(msg) + + if default is not NOTHING and factory is not None: + msg = "Must pass either `default` or `factory` but not both." + raise TypeError(msg) + + if factory is not None: + default = Factory(factory) + + if isinstance(default, Factory): + if default.takes_self: + msg = "`takes_self` is not supported by default_if_none." + raise ValueError(msg) + + def default_if_none_converter(val): + if val is not None: + return val + + return default.factory() + + else: + + def default_if_none_converter(val): + if val is not None: + return val + + return default + + return default_if_none_converter + + +def to_bool(val): + """ + Convert "boolean" strings (for example, from environment variables) to real + booleans. + + Values mapping to `True`: + + - ``True`` + - ``"true"`` / ``"t"`` + - ``"yes"`` / ``"y"`` + - ``"on"`` + - ``"1"`` + - ``1`` + + Values mapping to `False`: + + - ``False`` + - ``"false"`` / ``"f"`` + - ``"no"`` / ``"n"`` + - ``"off"`` + - ``"0"`` + - ``0`` + + Raises: + ValueError: For any other value. + + .. versionadded:: 21.3.0 + """ + if isinstance(val, str): + val = val.lower() + + if val in (True, "true", "t", "yes", "y", "on", "1", 1): + return True + if val in (False, "false", "f", "no", "n", "off", "0", 0): + return False + + msg = f"Cannot convert value to bool: {val!r}" + raise ValueError(msg) diff --git a/venv/lib/python3.11/site-packages/attr/converters.pyi b/venv/lib/python3.11/site-packages/attr/converters.pyi new file mode 100644 index 0000000..12bd0c4 --- /dev/null +++ b/venv/lib/python3.11/site-packages/attr/converters.pyi @@ -0,0 +1,19 @@ +from typing import Callable, Any, overload + +from attrs import _ConverterType, _CallableConverterType + +@overload +def pipe(*validators: _CallableConverterType) -> _CallableConverterType: ... +@overload +def pipe(*validators: _ConverterType) -> _ConverterType: ... +@overload +def optional(converter: _CallableConverterType) -> _CallableConverterType: ... +@overload +def optional(converter: _ConverterType) -> _ConverterType: ... +@overload +def default_if_none(default: Any) -> _CallableConverterType: ... +@overload +def default_if_none( + *, factory: Callable[[], Any] +) -> _CallableConverterType: ... +def to_bool(val: str | int | bool) -> bool: ... diff --git a/venv/lib/python3.11/site-packages/attr/exceptions.py b/venv/lib/python3.11/site-packages/attr/exceptions.py new file mode 100644 index 0000000..3b7abb8 --- /dev/null +++ b/venv/lib/python3.11/site-packages/attr/exceptions.py @@ -0,0 +1,95 @@ +# SPDX-License-Identifier: MIT + +from __future__ import annotations + +from typing import ClassVar + + +class FrozenError(AttributeError): + """ + A frozen/immutable instance or attribute have been attempted to be + modified. + + It mirrors the behavior of ``namedtuples`` by using the same error message + and subclassing `AttributeError`. + + .. versionadded:: 20.1.0 + """ + + msg = "can't set attribute" + args: ClassVar[tuple[str]] = [msg] + + +class FrozenInstanceError(FrozenError): + """ + A frozen instance has been attempted to be modified. + + .. versionadded:: 16.1.0 + """ + + +class FrozenAttributeError(FrozenError): + """ + A frozen attribute has been attempted to be modified. + + .. versionadded:: 20.1.0 + """ + + +class AttrsAttributeNotFoundError(ValueError): + """ + An *attrs* function couldn't find an attribute that the user asked for. + + .. versionadded:: 16.2.0 + """ + + +class NotAnAttrsClassError(ValueError): + """ + A non-*attrs* class has been passed into an *attrs* function. + + .. versionadded:: 16.2.0 + """ + + +class DefaultAlreadySetError(RuntimeError): + """ + A default has been set when defining the field and is attempted to be reset + using the decorator. + + .. versionadded:: 17.1.0 + """ + + +class UnannotatedAttributeError(RuntimeError): + """ + A class with ``auto_attribs=True`` has a field without a type annotation. + + .. versionadded:: 17.3.0 + """ + + +class PythonTooOldError(RuntimeError): + """ + It was attempted to use an *attrs* feature that requires a newer Python + version. + + .. versionadded:: 18.2.0 + """ + + +class NotCallableError(TypeError): + """ + A field requiring a callable has been set with a value that is not + callable. + + .. versionadded:: 19.2.0 + """ + + def __init__(self, msg, value): + super(TypeError, self).__init__(msg, value) + self.msg = msg + self.value = value + + def __str__(self): + return str(self.msg) diff --git a/venv/lib/python3.11/site-packages/attr/exceptions.pyi b/venv/lib/python3.11/site-packages/attr/exceptions.pyi new file mode 100644 index 0000000..f268011 --- /dev/null +++ b/venv/lib/python3.11/site-packages/attr/exceptions.pyi @@ -0,0 +1,17 @@ +from typing import Any + +class FrozenError(AttributeError): + msg: str = ... + +class FrozenInstanceError(FrozenError): ... +class FrozenAttributeError(FrozenError): ... +class AttrsAttributeNotFoundError(ValueError): ... +class NotAnAttrsClassError(ValueError): ... +class DefaultAlreadySetError(RuntimeError): ... +class UnannotatedAttributeError(RuntimeError): ... +class PythonTooOldError(RuntimeError): ... + +class NotCallableError(TypeError): + msg: str = ... + value: Any = ... + def __init__(self, msg: str, value: Any) -> None: ... diff --git a/venv/lib/python3.11/site-packages/attr/filters.py b/venv/lib/python3.11/site-packages/attr/filters.py new file mode 100644 index 0000000..689b170 --- /dev/null +++ b/venv/lib/python3.11/site-packages/attr/filters.py @@ -0,0 +1,72 @@ +# SPDX-License-Identifier: MIT + +""" +Commonly useful filters for `attrs.asdict` and `attrs.astuple`. +""" + +from ._make import Attribute + + +def _split_what(what): + """ + Returns a tuple of `frozenset`s of classes and attributes. + """ + return ( + frozenset(cls for cls in what if isinstance(cls, type)), + frozenset(cls for cls in what if isinstance(cls, str)), + frozenset(cls for cls in what if isinstance(cls, Attribute)), + ) + + +def include(*what): + """ + Create a filter that only allows *what*. + + Args: + what (list[type, str, attrs.Attribute]): + What to include. Can be a type, a name, or an attribute. + + Returns: + Callable: + A callable that can be passed to `attrs.asdict`'s and + `attrs.astuple`'s *filter* argument. + + .. versionchanged:: 23.1.0 Accept strings with field names. + """ + cls, names, attrs = _split_what(what) + + def include_(attribute, value): + return ( + value.__class__ in cls + or attribute.name in names + or attribute in attrs + ) + + return include_ + + +def exclude(*what): + """ + Create a filter that does **not** allow *what*. + + Args: + what (list[type, str, attrs.Attribute]): + What to exclude. Can be a type, a name, or an attribute. + + Returns: + Callable: + A callable that can be passed to `attrs.asdict`'s and + `attrs.astuple`'s *filter* argument. + + .. versionchanged:: 23.3.0 Accept field name string as input argument + """ + cls, names, attrs = _split_what(what) + + def exclude_(attribute, value): + return not ( + value.__class__ in cls + or attribute.name in names + or attribute in attrs + ) + + return exclude_ diff --git a/venv/lib/python3.11/site-packages/attr/filters.pyi b/venv/lib/python3.11/site-packages/attr/filters.pyi new file mode 100644 index 0000000..974abdc --- /dev/null +++ b/venv/lib/python3.11/site-packages/attr/filters.pyi @@ -0,0 +1,6 @@ +from typing import Any + +from . import Attribute, _FilterType + +def include(*what: type | str | Attribute[Any]) -> _FilterType[Any]: ... +def exclude(*what: type | str | Attribute[Any]) -> _FilterType[Any]: ... diff --git a/venv/lib/python3.11/site-packages/attr/py.typed b/venv/lib/python3.11/site-packages/attr/py.typed new file mode 100644 index 0000000..e69de29 diff --git a/venv/lib/python3.11/site-packages/attr/setters.py b/venv/lib/python3.11/site-packages/attr/setters.py new file mode 100644 index 0000000..78b0839 --- /dev/null +++ b/venv/lib/python3.11/site-packages/attr/setters.py @@ -0,0 +1,79 @@ +# SPDX-License-Identifier: MIT + +""" +Commonly used hooks for on_setattr. +""" + +from . import _config +from .exceptions import FrozenAttributeError + + +def pipe(*setters): + """ + Run all *setters* and return the return value of the last one. + + .. versionadded:: 20.1.0 + """ + + def wrapped_pipe(instance, attrib, new_value): + rv = new_value + + for setter in setters: + rv = setter(instance, attrib, rv) + + return rv + + return wrapped_pipe + + +def frozen(_, __, ___): + """ + Prevent an attribute to be modified. + + .. versionadded:: 20.1.0 + """ + raise FrozenAttributeError + + +def validate(instance, attrib, new_value): + """ + Run *attrib*'s validator on *new_value* if it has one. + + .. versionadded:: 20.1.0 + """ + if _config._run_validators is False: + return new_value + + v = attrib.validator + if not v: + return new_value + + v(instance, attrib, new_value) + + return new_value + + +def convert(instance, attrib, new_value): + """ + Run *attrib*'s converter -- if it has one -- on *new_value* and return the + result. + + .. versionadded:: 20.1.0 + """ + c = attrib.converter + if c: + # This can be removed once we drop 3.8 and use attrs.Converter instead. + from ._make import Converter + + if not isinstance(c, Converter): + return c(new_value) + + return c(new_value, instance, attrib) + + return new_value + + +# Sentinel for disabling class-wide *on_setattr* hooks for certain attributes. +# Sphinx's autodata stopped working, so the docstring is inlined in the API +# docs. +NO_OP = object() diff --git a/venv/lib/python3.11/site-packages/attr/setters.pyi b/venv/lib/python3.11/site-packages/attr/setters.pyi new file mode 100644 index 0000000..73abf36 --- /dev/null +++ b/venv/lib/python3.11/site-packages/attr/setters.pyi @@ -0,0 +1,20 @@ +from typing import Any, NewType, NoReturn, TypeVar + +from . import Attribute +from attrs import _OnSetAttrType + +_T = TypeVar("_T") + +def frozen( + instance: Any, attribute: Attribute[Any], new_value: Any +) -> NoReturn: ... +def pipe(*setters: _OnSetAttrType) -> _OnSetAttrType: ... +def validate(instance: Any, attribute: Attribute[_T], new_value: _T) -> _T: ... + +# convert is allowed to return Any, because they can be chained using pipe. +def convert( + instance: Any, attribute: Attribute[Any], new_value: Any +) -> Any: ... + +_NoOpType = NewType("_NoOpType", object) +NO_OP: _NoOpType diff --git a/venv/lib/python3.11/site-packages/attr/validators.py b/venv/lib/python3.11/site-packages/attr/validators.py new file mode 100644 index 0000000..837e003 --- /dev/null +++ b/venv/lib/python3.11/site-packages/attr/validators.py @@ -0,0 +1,748 @@ +# SPDX-License-Identifier: MIT + +""" +Commonly useful validators. +""" + +import operator +import re + +from contextlib import contextmanager +from re import Pattern + +from ._config import get_run_validators, set_run_validators +from ._make import _AndValidator, and_, attrib, attrs +from .converters import default_if_none +from .exceptions import NotCallableError + + +__all__ = [ + "and_", + "deep_iterable", + "deep_mapping", + "disabled", + "ge", + "get_disabled", + "gt", + "in_", + "instance_of", + "is_callable", + "le", + "lt", + "matches_re", + "max_len", + "min_len", + "not_", + "optional", + "or_", + "set_disabled", +] + + +def set_disabled(disabled): + """ + Globally disable or enable running validators. + + By default, they are run. + + Args: + disabled (bool): If `True`, disable running all validators. + + .. warning:: + + This function is not thread-safe! + + .. versionadded:: 21.3.0 + """ + set_run_validators(not disabled) + + +def get_disabled(): + """ + Return a bool indicating whether validators are currently disabled or not. + + Returns: + bool:`True` if validators are currently disabled. + + .. versionadded:: 21.3.0 + """ + return not get_run_validators() + + +@contextmanager +def disabled(): + """ + Context manager that disables running validators within its context. + + .. warning:: + + This context manager is not thread-safe! + + .. versionadded:: 21.3.0 + """ + set_run_validators(False) + try: + yield + finally: + set_run_validators(True) + + +@attrs(repr=False, slots=True, unsafe_hash=True) +class _InstanceOfValidator: + type = attrib() + + def __call__(self, inst, attr, value): + """ + We use a callable class to be able to change the ``__repr__``. + """ + if not isinstance(value, self.type): + msg = f"'{attr.name}' must be {self.type!r} (got {value!r} that is a {value.__class__!r})." + raise TypeError( + msg, + attr, + self.type, + value, + ) + + def __repr__(self): + return f"" + + +def instance_of(type): + """ + A validator that raises a `TypeError` if the initializer is called with a + wrong type for this particular attribute (checks are performed using + `isinstance` therefore it's also valid to pass a tuple of types). + + Args: + type (type | tuple[type]): The type to check for. + + Raises: + TypeError: + With a human readable error message, the attribute (of type + `attrs.Attribute`), the expected type, and the value it got. + """ + return _InstanceOfValidator(type) + + +@attrs(repr=False, frozen=True, slots=True) +class _MatchesReValidator: + pattern = attrib() + match_func = attrib() + + def __call__(self, inst, attr, value): + """ + We use a callable class to be able to change the ``__repr__``. + """ + if not self.match_func(value): + msg = f"'{attr.name}' must match regex {self.pattern.pattern!r} ({value!r} doesn't)" + raise ValueError( + msg, + attr, + self.pattern, + value, + ) + + def __repr__(self): + return f"" + + +def matches_re(regex, flags=0, func=None): + r""" + A validator that raises `ValueError` if the initializer is called with a + string that doesn't match *regex*. + + Args: + regex (str, re.Pattern): + A regex string or precompiled pattern to match against + + flags (int): + Flags that will be passed to the underlying re function (default 0) + + func (typing.Callable): + Which underlying `re` function to call. Valid options are + `re.fullmatch`, `re.search`, and `re.match`; the default `None` + means `re.fullmatch`. For performance reasons, the pattern is + always precompiled using `re.compile`. + + .. versionadded:: 19.2.0 + .. versionchanged:: 21.3.0 *regex* can be a pre-compiled pattern. + """ + valid_funcs = (re.fullmatch, None, re.search, re.match) + if func not in valid_funcs: + msg = "'func' must be one of {}.".format( + ", ".join( + sorted((e and e.__name__) or "None" for e in set(valid_funcs)) + ) + ) + raise ValueError(msg) + + if isinstance(regex, Pattern): + if flags: + msg = "'flags' can only be used with a string pattern; pass flags to re.compile() instead" + raise TypeError(msg) + pattern = regex + else: + pattern = re.compile(regex, flags) + + if func is re.match: + match_func = pattern.match + elif func is re.search: + match_func = pattern.search + else: + match_func = pattern.fullmatch + + return _MatchesReValidator(pattern, match_func) + + +@attrs(repr=False, slots=True, unsafe_hash=True) +class _OptionalValidator: + validator = attrib() + + def __call__(self, inst, attr, value): + if value is None: + return + + self.validator(inst, attr, value) + + def __repr__(self): + return f"" + + +def optional(validator): + """ + A validator that makes an attribute optional. An optional attribute is one + which can be set to `None` in addition to satisfying the requirements of + the sub-validator. + + Args: + validator + (typing.Callable | tuple[typing.Callable] | list[typing.Callable]): + A validator (or validators) that is used for non-`None` values. + + .. versionadded:: 15.1.0 + .. versionchanged:: 17.1.0 *validator* can be a list of validators. + .. versionchanged:: 23.1.0 *validator* can also be a tuple of validators. + """ + if isinstance(validator, (list, tuple)): + return _OptionalValidator(_AndValidator(validator)) + + return _OptionalValidator(validator) + + +@attrs(repr=False, slots=True, unsafe_hash=True) +class _InValidator: + options = attrib() + _original_options = attrib(hash=False) + + def __call__(self, inst, attr, value): + try: + in_options = value in self.options + except TypeError: # e.g. `1 in "abc"` + in_options = False + + if not in_options: + msg = f"'{attr.name}' must be in {self._original_options!r} (got {value!r})" + raise ValueError( + msg, + attr, + self._original_options, + value, + ) + + def __repr__(self): + return f"" + + +def in_(options): + """ + A validator that raises a `ValueError` if the initializer is called with a + value that does not belong in the *options* provided. + + The check is performed using ``value in options``, so *options* has to + support that operation. + + To keep the validator hashable, dicts, lists, and sets are transparently + transformed into a `tuple`. + + Args: + options: Allowed options. + + Raises: + ValueError: + With a human readable error message, the attribute (of type + `attrs.Attribute`), the expected options, and the value it got. + + .. versionadded:: 17.1.0 + .. versionchanged:: 22.1.0 + The ValueError was incomplete until now and only contained the human + readable error message. Now it contains all the information that has + been promised since 17.1.0. + .. versionchanged:: 24.1.0 + *options* that are a list, dict, or a set are now transformed into a + tuple to keep the validator hashable. + """ + repr_options = options + if isinstance(options, (list, dict, set)): + options = tuple(options) + + return _InValidator(options, repr_options) + + +@attrs(repr=False, slots=False, unsafe_hash=True) +class _IsCallableValidator: + def __call__(self, inst, attr, value): + """ + We use a callable class to be able to change the ``__repr__``. + """ + if not callable(value): + message = ( + "'{name}' must be callable " + "(got {value!r} that is a {actual!r})." + ) + raise NotCallableError( + msg=message.format( + name=attr.name, value=value, actual=value.__class__ + ), + value=value, + ) + + def __repr__(self): + return "" + + +def is_callable(): + """ + A validator that raises a `attrs.exceptions.NotCallableError` if the + initializer is called with a value for this particular attribute that is + not callable. + + .. versionadded:: 19.1.0 + + Raises: + attrs.exceptions.NotCallableError: + With a human readable error message containing the attribute + (`attrs.Attribute`) name, and the value it got. + """ + return _IsCallableValidator() + + +@attrs(repr=False, slots=True, unsafe_hash=True) +class _DeepIterable: + member_validator = attrib(validator=is_callable()) + iterable_validator = attrib( + default=None, validator=optional(is_callable()) + ) + + def __call__(self, inst, attr, value): + """ + We use a callable class to be able to change the ``__repr__``. + """ + if self.iterable_validator is not None: + self.iterable_validator(inst, attr, value) + + for member in value: + self.member_validator(inst, attr, member) + + def __repr__(self): + iterable_identifier = ( + "" + if self.iterable_validator is None + else f" {self.iterable_validator!r}" + ) + return ( + f"" + ) + + +def deep_iterable(member_validator, iterable_validator=None): + """ + A validator that performs deep validation of an iterable. + + Args: + member_validator: Validator(s) to apply to iterable members. + + iterable_validator: + Validator(s) to apply to iterable itself (optional). + + Raises + TypeError: if any sub-validators fail + + .. versionadded:: 19.1.0 + + .. versionchanged:: 25.4.0 + *member_validator* and *iterable_validator* can now be a list or tuple + of validators. + """ + if isinstance(member_validator, (list, tuple)): + member_validator = and_(*member_validator) + if isinstance(iterable_validator, (list, tuple)): + iterable_validator = and_(*iterable_validator) + return _DeepIterable(member_validator, iterable_validator) + + +@attrs(repr=False, slots=True, unsafe_hash=True) +class _DeepMapping: + key_validator = attrib(validator=optional(is_callable())) + value_validator = attrib(validator=optional(is_callable())) + mapping_validator = attrib(validator=optional(is_callable())) + + def __call__(self, inst, attr, value): + """ + We use a callable class to be able to change the ``__repr__``. + """ + if self.mapping_validator is not None: + self.mapping_validator(inst, attr, value) + + for key in value: + if self.key_validator is not None: + self.key_validator(inst, attr, key) + if self.value_validator is not None: + self.value_validator(inst, attr, value[key]) + + def __repr__(self): + return f"" + + +def deep_mapping( + key_validator=None, value_validator=None, mapping_validator=None +): + """ + A validator that performs deep validation of a dictionary. + + All validators are optional, but at least one of *key_validator* or + *value_validator* must be provided. + + Args: + key_validator: Validator(s) to apply to dictionary keys. + + value_validator: Validator(s) to apply to dictionary values. + + mapping_validator: + Validator(s) to apply to top-level mapping attribute. + + .. versionadded:: 19.1.0 + + .. versionchanged:: 25.4.0 + *key_validator* and *value_validator* are now optional, but at least one + of them must be provided. + + .. versionchanged:: 25.4.0 + *key_validator*, *value_validator*, and *mapping_validator* can now be a + list or tuple of validators. + + Raises: + TypeError: If any sub-validator fails on validation. + + ValueError: + If neither *key_validator* nor *value_validator* is provided on + instantiation. + """ + if key_validator is None and value_validator is None: + msg = ( + "At least one of key_validator or value_validator must be provided" + ) + raise ValueError(msg) + + if isinstance(key_validator, (list, tuple)): + key_validator = and_(*key_validator) + if isinstance(value_validator, (list, tuple)): + value_validator = and_(*value_validator) + if isinstance(mapping_validator, (list, tuple)): + mapping_validator = and_(*mapping_validator) + + return _DeepMapping(key_validator, value_validator, mapping_validator) + + +@attrs(repr=False, frozen=True, slots=True) +class _NumberValidator: + bound = attrib() + compare_op = attrib() + compare_func = attrib() + + def __call__(self, inst, attr, value): + """ + We use a callable class to be able to change the ``__repr__``. + """ + if not self.compare_func(value, self.bound): + msg = f"'{attr.name}' must be {self.compare_op} {self.bound}: {value}" + raise ValueError(msg) + + def __repr__(self): + return f"" + + +def lt(val): + """ + A validator that raises `ValueError` if the initializer is called with a + number larger or equal to *val*. + + The validator uses `operator.lt` to compare the values. + + Args: + val: Exclusive upper bound for values. + + .. versionadded:: 21.3.0 + """ + return _NumberValidator(val, "<", operator.lt) + + +def le(val): + """ + A validator that raises `ValueError` if the initializer is called with a + number greater than *val*. + + The validator uses `operator.le` to compare the values. + + Args: + val: Inclusive upper bound for values. + + .. versionadded:: 21.3.0 + """ + return _NumberValidator(val, "<=", operator.le) + + +def ge(val): + """ + A validator that raises `ValueError` if the initializer is called with a + number smaller than *val*. + + The validator uses `operator.ge` to compare the values. + + Args: + val: Inclusive lower bound for values + + .. versionadded:: 21.3.0 + """ + return _NumberValidator(val, ">=", operator.ge) + + +def gt(val): + """ + A validator that raises `ValueError` if the initializer is called with a + number smaller or equal to *val*. + + The validator uses `operator.gt` to compare the values. + + Args: + val: Exclusive lower bound for values + + .. versionadded:: 21.3.0 + """ + return _NumberValidator(val, ">", operator.gt) + + +@attrs(repr=False, frozen=True, slots=True) +class _MaxLengthValidator: + max_length = attrib() + + def __call__(self, inst, attr, value): + """ + We use a callable class to be able to change the ``__repr__``. + """ + if len(value) > self.max_length: + msg = f"Length of '{attr.name}' must be <= {self.max_length}: {len(value)}" + raise ValueError(msg) + + def __repr__(self): + return f"" + + +def max_len(length): + """ + A validator that raises `ValueError` if the initializer is called + with a string or iterable that is longer than *length*. + + Args: + length (int): Maximum length of the string or iterable + + .. versionadded:: 21.3.0 + """ + return _MaxLengthValidator(length) + + +@attrs(repr=False, frozen=True, slots=True) +class _MinLengthValidator: + min_length = attrib() + + def __call__(self, inst, attr, value): + """ + We use a callable class to be able to change the ``__repr__``. + """ + if len(value) < self.min_length: + msg = f"Length of '{attr.name}' must be >= {self.min_length}: {len(value)}" + raise ValueError(msg) + + def __repr__(self): + return f"" + + +def min_len(length): + """ + A validator that raises `ValueError` if the initializer is called + with a string or iterable that is shorter than *length*. + + Args: + length (int): Minimum length of the string or iterable + + .. versionadded:: 22.1.0 + """ + return _MinLengthValidator(length) + + +@attrs(repr=False, slots=True, unsafe_hash=True) +class _SubclassOfValidator: + type = attrib() + + def __call__(self, inst, attr, value): + """ + We use a callable class to be able to change the ``__repr__``. + """ + if not issubclass(value, self.type): + msg = f"'{attr.name}' must be a subclass of {self.type!r} (got {value!r})." + raise TypeError( + msg, + attr, + self.type, + value, + ) + + def __repr__(self): + return f"" + + +def _subclass_of(type): + """ + A validator that raises a `TypeError` if the initializer is called with a + wrong type for this particular attribute (checks are performed using + `issubclass` therefore it's also valid to pass a tuple of types). + + Args: + type (type | tuple[type, ...]): The type(s) to check for. + + Raises: + TypeError: + With a human readable error message, the attribute (of type + `attrs.Attribute`), the expected type, and the value it got. + """ + return _SubclassOfValidator(type) + + +@attrs(repr=False, slots=True, unsafe_hash=True) +class _NotValidator: + validator = attrib() + msg = attrib( + converter=default_if_none( + "not_ validator child '{validator!r}' " + "did not raise a captured error" + ) + ) + exc_types = attrib( + validator=deep_iterable( + member_validator=_subclass_of(Exception), + iterable_validator=instance_of(tuple), + ), + ) + + def __call__(self, inst, attr, value): + try: + self.validator(inst, attr, value) + except self.exc_types: + pass # suppress error to invert validity + else: + raise ValueError( + self.msg.format( + validator=self.validator, + exc_types=self.exc_types, + ), + attr, + self.validator, + value, + self.exc_types, + ) + + def __repr__(self): + return f"" + + +def not_(validator, *, msg=None, exc_types=(ValueError, TypeError)): + """ + A validator that wraps and logically 'inverts' the validator passed to it. + It will raise a `ValueError` if the provided validator *doesn't* raise a + `ValueError` or `TypeError` (by default), and will suppress the exception + if the provided validator *does*. + + Intended to be used with existing validators to compose logic without + needing to create inverted variants, for example, ``not_(in_(...))``. + + Args: + validator: A validator to be logically inverted. + + msg (str): + Message to raise if validator fails. Formatted with keys + ``exc_types`` and ``validator``. + + exc_types (tuple[type, ...]): + Exception type(s) to capture. Other types raised by child + validators will not be intercepted and pass through. + + Raises: + ValueError: + With a human readable error message, the attribute (of type + `attrs.Attribute`), the validator that failed to raise an + exception, the value it got, and the expected exception types. + + .. versionadded:: 22.2.0 + """ + try: + exc_types = tuple(exc_types) + except TypeError: + exc_types = (exc_types,) + return _NotValidator(validator, msg, exc_types) + + +@attrs(repr=False, slots=True, unsafe_hash=True) +class _OrValidator: + validators = attrib() + + def __call__(self, inst, attr, value): + for v in self.validators: + try: + v(inst, attr, value) + except Exception: # noqa: BLE001, PERF203, S112 + continue + else: + return + + msg = f"None of {self.validators!r} satisfied for value {value!r}" + raise ValueError(msg) + + def __repr__(self): + return f"" + + +def or_(*validators): + """ + A validator that composes multiple validators into one. + + When called on a value, it runs all wrapped validators until one of them is + satisfied. + + Args: + validators (~collections.abc.Iterable[typing.Callable]): + Arbitrary number of validators. + + Raises: + ValueError: + If no validator is satisfied. Raised with a human-readable error + message listing all the wrapped validators and the value that + failed all of them. + + .. versionadded:: 24.1.0 + """ + vals = [] + for v in validators: + vals.extend(v.validators if isinstance(v, _OrValidator) else [v]) + + return _OrValidator(tuple(vals)) diff --git a/venv/lib/python3.11/site-packages/attr/validators.pyi b/venv/lib/python3.11/site-packages/attr/validators.pyi new file mode 100644 index 0000000..36a7e80 --- /dev/null +++ b/venv/lib/python3.11/site-packages/attr/validators.pyi @@ -0,0 +1,140 @@ +from types import UnionType +from typing import ( + Any, + AnyStr, + Callable, + Container, + ContextManager, + Iterable, + Mapping, + Match, + Pattern, + TypeVar, + overload, +) + +from attrs import _ValidatorType +from attrs import _ValidatorArgType + +_T = TypeVar("_T") +_T1 = TypeVar("_T1") +_T2 = TypeVar("_T2") +_T3 = TypeVar("_T3") +_T4 = TypeVar("_T4") +_T5 = TypeVar("_T5") +_T6 = TypeVar("_T6") +_I = TypeVar("_I", bound=Iterable) +_K = TypeVar("_K") +_V = TypeVar("_V") +_M = TypeVar("_M", bound=Mapping) + +def set_disabled(run: bool) -> None: ... +def get_disabled() -> bool: ... +def disabled() -> ContextManager[None]: ... + +# To be more precise on instance_of use some overloads. +# If there are more than 3 items in the tuple then we fall back to Any +@overload +def instance_of(type: type[_T]) -> _ValidatorType[_T]: ... +@overload +def instance_of(type: tuple[type[_T]]) -> _ValidatorType[_T]: ... +@overload +def instance_of( + type: tuple[type[_T1], type[_T2]], +) -> _ValidatorType[_T1 | _T2]: ... +@overload +def instance_of( + type: tuple[type[_T1], type[_T2], type[_T3]], +) -> _ValidatorType[_T1 | _T2 | _T3]: ... +@overload +def instance_of(type: tuple[type, ...]) -> _ValidatorType[Any]: ... +@overload +def instance_of(type: UnionType) -> _ValidatorType[Any]: ... +def optional( + validator: ( + _ValidatorType[_T] + | list[_ValidatorType[_T]] + | tuple[_ValidatorType[_T]] + ), +) -> _ValidatorType[_T | None]: ... +def in_(options: Container[_T]) -> _ValidatorType[_T]: ... +def and_(*validators: _ValidatorType[_T]) -> _ValidatorType[_T]: ... +def matches_re( + regex: Pattern[AnyStr] | AnyStr, + flags: int = ..., + func: Callable[[AnyStr, AnyStr, int], Match[AnyStr] | None] | None = ..., +) -> _ValidatorType[AnyStr]: ... +def deep_iterable( + member_validator: _ValidatorArgType[_T], + iterable_validator: _ValidatorArgType[_I] | None = ..., +) -> _ValidatorType[_I]: ... +@overload +def deep_mapping( + key_validator: _ValidatorArgType[_K], + value_validator: _ValidatorArgType[_V] | None = ..., + mapping_validator: _ValidatorArgType[_M] | None = ..., +) -> _ValidatorType[_M]: ... +@overload +def deep_mapping( + key_validator: _ValidatorArgType[_K] | None = ..., + value_validator: _ValidatorArgType[_V] = ..., + mapping_validator: _ValidatorArgType[_M] | None = ..., +) -> _ValidatorType[_M]: ... +def is_callable() -> _ValidatorType[_T]: ... +def lt(val: _T) -> _ValidatorType[_T]: ... +def le(val: _T) -> _ValidatorType[_T]: ... +def ge(val: _T) -> _ValidatorType[_T]: ... +def gt(val: _T) -> _ValidatorType[_T]: ... +def max_len(length: int) -> _ValidatorType[_T]: ... +def min_len(length: int) -> _ValidatorType[_T]: ... +def not_( + validator: _ValidatorType[_T], + *, + msg: str | None = None, + exc_types: type[Exception] | Iterable[type[Exception]] = ..., +) -> _ValidatorType[_T]: ... +@overload +def or_( + __v1: _ValidatorType[_T1], + __v2: _ValidatorType[_T2], +) -> _ValidatorType[_T1 | _T2]: ... +@overload +def or_( + __v1: _ValidatorType[_T1], + __v2: _ValidatorType[_T2], + __v3: _ValidatorType[_T3], +) -> _ValidatorType[_T1 | _T2 | _T3]: ... +@overload +def or_( + __v1: _ValidatorType[_T1], + __v2: _ValidatorType[_T2], + __v3: _ValidatorType[_T3], + __v4: _ValidatorType[_T4], +) -> _ValidatorType[_T1 | _T2 | _T3 | _T4]: ... +@overload +def or_( + __v1: _ValidatorType[_T1], + __v2: _ValidatorType[_T2], + __v3: _ValidatorType[_T3], + __v4: _ValidatorType[_T4], + __v5: _ValidatorType[_T5], +) -> _ValidatorType[_T1 | _T2 | _T3 | _T4 | _T5]: ... +@overload +def or_( + __v1: _ValidatorType[_T1], + __v2: _ValidatorType[_T2], + __v3: _ValidatorType[_T3], + __v4: _ValidatorType[_T4], + __v5: _ValidatorType[_T5], + __v6: _ValidatorType[_T6], +) -> _ValidatorType[_T1 | _T2 | _T3 | _T4 | _T5 | _T6]: ... +@overload +def or_( + __v1: _ValidatorType[Any], + __v2: _ValidatorType[Any], + __v3: _ValidatorType[Any], + __v4: _ValidatorType[Any], + __v5: _ValidatorType[Any], + __v6: _ValidatorType[Any], + *validators: _ValidatorType[Any], +) -> _ValidatorType[Any]: ... diff --git a/venv/lib/python3.11/site-packages/attrs-25.4.0.dist-info/INSTALLER b/venv/lib/python3.11/site-packages/attrs-25.4.0.dist-info/INSTALLER new file mode 100644 index 0000000..a1b589e --- /dev/null +++ b/venv/lib/python3.11/site-packages/attrs-25.4.0.dist-info/INSTALLER @@ -0,0 +1 @@ +pip diff --git a/venv/lib/python3.11/site-packages/attrs-25.4.0.dist-info/METADATA b/venv/lib/python3.11/site-packages/attrs-25.4.0.dist-info/METADATA new file mode 100644 index 0000000..51128bb --- /dev/null +++ b/venv/lib/python3.11/site-packages/attrs-25.4.0.dist-info/METADATA @@ -0,0 +1,235 @@ +Metadata-Version: 2.4 +Name: attrs +Version: 25.4.0 +Summary: Classes Without Boilerplate +Project-URL: Documentation, https://www.attrs.org/ +Project-URL: Changelog, https://www.attrs.org/en/stable/changelog.html +Project-URL: GitHub, https://github.com/python-attrs/attrs +Project-URL: Funding, https://github.com/sponsors/hynek +Project-URL: Tidelift, https://tidelift.com/subscription/pkg/pypi-attrs?utm_source=pypi-attrs&utm_medium=pypi +Author-email: Hynek Schlawack +License-Expression: MIT +License-File: LICENSE +Keywords: attribute,boilerplate,class +Classifier: Development Status :: 5 - Production/Stable +Classifier: Programming Language :: Python :: 3.9 +Classifier: Programming Language :: Python :: 3.10 +Classifier: Programming Language :: Python :: 3.11 +Classifier: Programming Language :: Python :: 3.12 +Classifier: Programming Language :: Python :: 3.13 +Classifier: Programming Language :: Python :: 3.14 +Classifier: Programming Language :: Python :: Implementation :: CPython +Classifier: Programming Language :: Python :: Implementation :: PyPy +Classifier: Typing :: Typed +Requires-Python: >=3.9 +Description-Content-Type: text/markdown + +

    + + attrs + +

    + + +*attrs* is the Python package that will bring back the **joy** of **writing classes** by relieving you from the drudgery of implementing object protocols (aka [dunder methods](https://www.attrs.org/en/latest/glossary.html#term-dunder-methods)). +Trusted by NASA for [Mars missions since 2020](https://github.com/readme/featured/nasa-ingenuity-helicopter)! + +Its main goal is to help you to write **concise** and **correct** software without slowing down your code. + + +## Sponsors + +*attrs* would not be possible without our [amazing sponsors](https://github.com/sponsors/hynek). +Especially those generously supporting us at the *The Organization* tier and higher: + + + +

    + + + + + + + + + +

    + + + +

    + Please consider joining them to help make attrs’s maintenance more sustainable! +

    + + + +## Example + +*attrs* gives you a class decorator and a way to declaratively define the attributes on that class: + + + +```pycon +>>> from attrs import asdict, define, make_class, Factory + +>>> @define +... class SomeClass: +... a_number: int = 42 +... list_of_numbers: list[int] = Factory(list) +... +... def hard_math(self, another_number): +... return self.a_number + sum(self.list_of_numbers) * another_number + + +>>> sc = SomeClass(1, [1, 2, 3]) +>>> sc +SomeClass(a_number=1, list_of_numbers=[1, 2, 3]) + +>>> sc.hard_math(3) +19 +>>> sc == SomeClass(1, [1, 2, 3]) +True +>>> sc != SomeClass(2, [3, 2, 1]) +True + +>>> asdict(sc) +{'a_number': 1, 'list_of_numbers': [1, 2, 3]} + +>>> SomeClass() +SomeClass(a_number=42, list_of_numbers=[]) + +>>> C = make_class("C", ["a", "b"]) +>>> C("foo", "bar") +C(a='foo', b='bar') +``` + +After *declaring* your attributes, *attrs* gives you: + +- a concise and explicit overview of the class's attributes, +- a nice human-readable `__repr__`, +- equality-checking methods, +- an initializer, +- and much more, + +*without* writing dull boilerplate code again and again and *without* runtime performance penalties. + +--- + +This example uses *attrs*'s modern APIs that have been introduced in version 20.1.0, and the *attrs* package import name that has been added in version 21.3.0. +The classic APIs (`@attr.s`, `attr.ib`, plus their serious-business aliases) and the `attr` package import name will remain **indefinitely**. + +Check out [*On The Core API Names*](https://www.attrs.org/en/latest/names.html) for an in-depth explanation! + + +### Hate Type Annotations!? + +No problem! +Types are entirely **optional** with *attrs*. +Simply assign `attrs.field()` to the attributes instead of annotating them with types: + +```python +from attrs import define, field + +@define +class SomeClass: + a_number = field(default=42) + list_of_numbers = field(factory=list) +``` + + +## Data Classes + +On the tin, *attrs* might remind you of `dataclasses` (and indeed, `dataclasses` [are a descendant](https://hynek.me/articles/import-attrs/) of *attrs*). +In practice it does a lot more and is more flexible. +For instance, it allows you to define [special handling of NumPy arrays for equality checks](https://www.attrs.org/en/stable/comparison.html#customization), allows more ways to [plug into the initialization process](https://www.attrs.org/en/stable/init.html#hooking-yourself-into-initialization), has a replacement for `__init_subclass__`, and allows for stepping through the generated methods using a debugger. + +For more details, please refer to our [comparison page](https://www.attrs.org/en/stable/why.html#data-classes), but generally speaking, we are more likely to commit crimes against nature to make things work that one would expect to work, but that are quite complicated in practice. + + +## Project Information + +- [**Changelog**](https://www.attrs.org/en/stable/changelog.html) +- [**Documentation**](https://www.attrs.org/) +- [**PyPI**](https://pypi.org/project/attrs/) +- [**Source Code**](https://github.com/python-attrs/attrs) +- [**Contributing**](https://github.com/python-attrs/attrs/blob/main/.github/CONTRIBUTING.md) +- [**Third-party Extensions**](https://github.com/python-attrs/attrs/wiki/Extensions-to-attrs) +- **Get Help**: use the `python-attrs` tag on [Stack Overflow](https://stackoverflow.com/questions/tagged/python-attrs) + + +### *attrs* for Enterprise + +Available as part of the [Tidelift Subscription](https://tidelift.com/?utm_source=lifter&utm_medium=referral&utm_campaign=hynek). + +The maintainers of *attrs* and thousands of other packages are working with Tidelift to deliver commercial support and maintenance for the open source packages you use to build your applications. +Save time, reduce risk, and improve code health, while paying the maintainers of the exact packages you use. + +## Release Information + +### Backwards-incompatible Changes + +- Class-level `kw_only=True` behavior is now consistent with `dataclasses`. + + Previously, a class that sets `kw_only=True` makes all attributes keyword-only, including those from base classes. + If an attribute sets `kw_only=False`, that setting is ignored, and it is still made keyword-only. + + Now, only the attributes defined in that class that doesn't explicitly set `kw_only=False` are made keyword-only. + + This shouldn't be a problem for most users, unless you have a pattern like this: + + ```python + @attrs.define(kw_only=True) + class Base: + a: int + b: int = attrs.field(default=1, kw_only=False) + + @attrs.define + class Subclass(Base): + c: int + ``` + + Here, we have a `kw_only=True` *attrs* class (`Base`) with an attribute that sets `kw_only=False` and has a default (`Base.b`), and then create a subclass (`Subclass`) with required arguments (`Subclass.c`). + Previously this would work, since it would make `Base.b` keyword-only, but now this fails since `Base.b` is positional, and we have a required positional argument (`Subclass.c`) following another argument with defaults. + [#1457](https://github.com/python-attrs/attrs/issues/1457) + + +### Changes + +- Values passed to the `__init__()` method of `attrs` classes are now correctly passed to `__attrs_pre_init__()` instead of their default values (in cases where *kw_only* was not specified). + [#1427](https://github.com/python-attrs/attrs/issues/1427) +- Added support for Python 3.14 and [PEP 749](https://peps.python.org/pep-0749/). + [#1446](https://github.com/python-attrs/attrs/issues/1446), + [#1451](https://github.com/python-attrs/attrs/issues/1451) +- `attrs.validators.deep_mapping()` now allows to leave out either *key_validator* xor *value_validator*. + [#1448](https://github.com/python-attrs/attrs/issues/1448) +- `attrs.validators.deep_iterator()` and `attrs.validators.deep_mapping()` now accept lists and tuples for all validators and wrap them into a `attrs.validators.and_()`. + [#1449](https://github.com/python-attrs/attrs/issues/1449) +- Added a new **experimental** way to inspect classes: + + `attrs.inspect(cls)` returns the _effective_ class-wide parameters that were used by *attrs* to construct the class. + + The returned class is the same data structure that *attrs* uses internally to decide how to construct the final class. + [#1454](https://github.com/python-attrs/attrs/issues/1454) +- Fixed annotations for `attrs.field(converter=...)`. + Previously, a `tuple` of converters was only accepted if it had exactly one element. + [#1461](https://github.com/python-attrs/attrs/issues/1461) +- The performance of `attrs.asdict()` has been improved by 45–260%. + [#1463](https://github.com/python-attrs/attrs/issues/1463) +- The performance of `attrs.astuple()` has been improved by 49–270%. + [#1469](https://github.com/python-attrs/attrs/issues/1469) +- The type annotation for `attrs.validators.or_()` now allows for different types of validators. + + This was only an issue on Pyright. + [#1474](https://github.com/python-attrs/attrs/issues/1474) + + + +--- + +[Full changelog →](https://www.attrs.org/en/stable/changelog.html) diff --git a/venv/lib/python3.11/site-packages/attrs-25.4.0.dist-info/RECORD b/venv/lib/python3.11/site-packages/attrs-25.4.0.dist-info/RECORD new file mode 100644 index 0000000..b4287f6 --- /dev/null +++ b/venv/lib/python3.11/site-packages/attrs-25.4.0.dist-info/RECORD @@ -0,0 +1,55 @@ +attr/__init__.py,sha256=fOYIvt1eGSqQre4uCS3sJWKZ0mwAuC8UD6qba5OS9_U,2057 +attr/__init__.pyi,sha256=IZkzIjvtbRqDWGkDBIF9dd12FgDa379JYq3GHnVOvFQ,11309 +attr/__pycache__/__init__.cpython-311.pyc,, +attr/__pycache__/_cmp.cpython-311.pyc,, +attr/__pycache__/_compat.cpython-311.pyc,, +attr/__pycache__/_config.cpython-311.pyc,, +attr/__pycache__/_funcs.cpython-311.pyc,, +attr/__pycache__/_make.cpython-311.pyc,, +attr/__pycache__/_next_gen.cpython-311.pyc,, +attr/__pycache__/_version_info.cpython-311.pyc,, +attr/__pycache__/converters.cpython-311.pyc,, +attr/__pycache__/exceptions.cpython-311.pyc,, +attr/__pycache__/filters.cpython-311.pyc,, +attr/__pycache__/setters.cpython-311.pyc,, +attr/__pycache__/validators.cpython-311.pyc,, +attr/_cmp.py,sha256=3Nn1TjxllUYiX_nJoVnEkXoDk0hM1DYKj5DE7GZe4i0,4117 +attr/_cmp.pyi,sha256=U-_RU_UZOyPUEQzXE6RMYQQcjkZRY25wTH99sN0s7MM,368 +attr/_compat.py,sha256=x0g7iEUOnBVJC72zyFCgb1eKqyxS-7f2LGnNyZ_r95s,2829 +attr/_config.py,sha256=dGq3xR6fgZEF6UBt_L0T-eUHIB4i43kRmH0P28sJVw8,843 +attr/_funcs.py,sha256=Ix5IETTfz5F01F-12MF_CSFomIn2h8b67EVVz2gCtBE,16479 +attr/_make.py,sha256=NRJDGS8syg2h3YNflVNoK2FwR3CpdSZxx8M6lacwljA,104141 +attr/_next_gen.py,sha256=BQtCUlzwg2gWHTYXBQvrEYBnzBUrDvO57u0Py6UCPhc,26274 +attr/_typing_compat.pyi,sha256=XDP54TUn-ZKhD62TOQebmzrwFyomhUCoGRpclb6alRA,469 +attr/_version_info.py,sha256=w4R-FYC3NK_kMkGUWJlYP4cVAlH9HRaC-um3fcjYkHM,2222 +attr/_version_info.pyi,sha256=x_M3L3WuB7r_ULXAWjx959udKQ4HLB8l-hsc1FDGNvk,209 +attr/converters.py,sha256=GlDeOzPeTFgeBBLbj9G57Ez5lAk68uhSALRYJ_exe84,3861 +attr/converters.pyi,sha256=orU2bff-VjQa2kMDyvnMQV73oJT2WRyQuw4ZR1ym1bE,643 +attr/exceptions.py,sha256=HRFq4iybmv7-DcZwyjl6M1euM2YeJVK_hFxuaBGAngI,1977 +attr/exceptions.pyi,sha256=zZq8bCUnKAy9mDtBEw42ZhPhAUIHoTKedDQInJD883M,539 +attr/filters.py,sha256=ZBiKWLp3R0LfCZsq7X11pn9WX8NslS2wXM4jsnLOGc8,1795 +attr/filters.pyi,sha256=3J5BG-dTxltBk1_-RuNRUHrv2qu1v8v4aDNAQ7_mifA,208 +attr/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +attr/setters.py,sha256=5-dcT63GQK35ONEzSgfXCkbB7pPkaR-qv15mm4PVSzQ,1617 +attr/setters.pyi,sha256=NnVkaFU1BB4JB8E4JuXyrzTUgvtMpj8p3wBdJY7uix4,584 +attr/validators.py,sha256=1BnYGTuYvSucGEI4ju-RPNJteVzG0ZlfWpJiWoSFHQ8,21458 +attr/validators.pyi,sha256=ftmW3m4KJ3pQcIXAj-BejT7BY4ZfqrC1G-5W7XvoPds,4082 +attrs-25.4.0.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 +attrs-25.4.0.dist-info/METADATA,sha256=2Rerxj7agcMRxiwdkt6lC2guqHAmkGKCH13nWWK7ZoQ,10473 +attrs-25.4.0.dist-info/RECORD,, +attrs-25.4.0.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87 +attrs-25.4.0.dist-info/licenses/LICENSE,sha256=iCEVyV38KvHutnFPjsbVy8q_Znyv-HKfQkINpj9xTp8,1109 +attrs/__init__.py,sha256=RxaAZNwYiEh-fcvHLZNpQ_DWKni73M_jxEPEftiq1Zc,1183 +attrs/__init__.pyi,sha256=2gV79g9UxJppGSM48hAZJ6h_MHb70dZoJL31ZNJeZYI,9416 +attrs/__pycache__/__init__.cpython-311.pyc,, +attrs/__pycache__/converters.cpython-311.pyc,, +attrs/__pycache__/exceptions.cpython-311.pyc,, +attrs/__pycache__/filters.cpython-311.pyc,, +attrs/__pycache__/setters.cpython-311.pyc,, +attrs/__pycache__/validators.cpython-311.pyc,, +attrs/converters.py,sha256=8kQljrVwfSTRu8INwEk8SI0eGrzmWftsT7rM0EqyohM,76 +attrs/exceptions.py,sha256=ACCCmg19-vDFaDPY9vFl199SPXCQMN_bENs4DALjzms,76 +attrs/filters.py,sha256=VOUMZug9uEU6dUuA0dF1jInUK0PL3fLgP0VBS5d-CDE,73 +attrs/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +attrs/setters.py,sha256=eL1YidYQV3T2h9_SYIZSZR1FAcHGb1TuCTy0E0Lv2SU,73 +attrs/validators.py,sha256=xcy6wD5TtTkdCG1f4XWbocPSO0faBjk5IfVJfP6SUj0,76 diff --git a/venv/lib/python3.11/site-packages/attrs-25.4.0.dist-info/WHEEL b/venv/lib/python3.11/site-packages/attrs-25.4.0.dist-info/WHEEL new file mode 100644 index 0000000..12228d4 --- /dev/null +++ b/venv/lib/python3.11/site-packages/attrs-25.4.0.dist-info/WHEEL @@ -0,0 +1,4 @@ +Wheel-Version: 1.0 +Generator: hatchling 1.27.0 +Root-Is-Purelib: true +Tag: py3-none-any diff --git a/venv/lib/python3.11/site-packages/attrs-25.4.0.dist-info/licenses/LICENSE b/venv/lib/python3.11/site-packages/attrs-25.4.0.dist-info/licenses/LICENSE new file mode 100644 index 0000000..2bd6453 --- /dev/null +++ b/venv/lib/python3.11/site-packages/attrs-25.4.0.dist-info/licenses/LICENSE @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) 2015 Hynek Schlawack and the attrs contributors + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/venv/lib/python3.11/site-packages/attrs/__init__.py b/venv/lib/python3.11/site-packages/attrs/__init__.py new file mode 100644 index 0000000..dc1ce4b --- /dev/null +++ b/venv/lib/python3.11/site-packages/attrs/__init__.py @@ -0,0 +1,72 @@ +# SPDX-License-Identifier: MIT + +from attr import ( + NOTHING, + Attribute, + AttrsInstance, + Converter, + Factory, + NothingType, + _make_getattr, + assoc, + cmp_using, + define, + evolve, + field, + fields, + fields_dict, + frozen, + has, + make_class, + mutable, + resolve_types, + validate, +) +from attr._make import ClassProps +from attr._next_gen import asdict, astuple, inspect + +from . import converters, exceptions, filters, setters, validators + + +__all__ = [ + "NOTHING", + "Attribute", + "AttrsInstance", + "ClassProps", + "Converter", + "Factory", + "NothingType", + "__author__", + "__copyright__", + "__description__", + "__doc__", + "__email__", + "__license__", + "__title__", + "__url__", + "__version__", + "__version_info__", + "asdict", + "assoc", + "astuple", + "cmp_using", + "converters", + "define", + "evolve", + "exceptions", + "field", + "fields", + "fields_dict", + "filters", + "frozen", + "has", + "inspect", + "make_class", + "mutable", + "resolve_types", + "setters", + "validate", + "validators", +] + +__getattr__ = _make_getattr(__name__) diff --git a/venv/lib/python3.11/site-packages/attrs/__init__.pyi b/venv/lib/python3.11/site-packages/attrs/__init__.pyi new file mode 100644 index 0000000..6364bac --- /dev/null +++ b/venv/lib/python3.11/site-packages/attrs/__init__.pyi @@ -0,0 +1,314 @@ +import sys + +from typing import ( + Any, + Callable, + Mapping, + Sequence, + overload, + TypeVar, +) + +# Because we need to type our own stuff, we have to make everything from +# attr explicitly public too. +from attr import __author__ as __author__ +from attr import __copyright__ as __copyright__ +from attr import __description__ as __description__ +from attr import __email__ as __email__ +from attr import __license__ as __license__ +from attr import __title__ as __title__ +from attr import __url__ as __url__ +from attr import __version__ as __version__ +from attr import __version_info__ as __version_info__ +from attr import assoc as assoc +from attr import Attribute as Attribute +from attr import AttrsInstance as AttrsInstance +from attr import cmp_using as cmp_using +from attr import converters as converters +from attr import Converter as Converter +from attr import evolve as evolve +from attr import exceptions as exceptions +from attr import Factory as Factory +from attr import fields as fields +from attr import fields_dict as fields_dict +from attr import filters as filters +from attr import has as has +from attr import make_class as make_class +from attr import NOTHING as NOTHING +from attr import resolve_types as resolve_types +from attr import setters as setters +from attr import validate as validate +from attr import validators as validators +from attr import attrib, asdict as asdict, astuple as astuple +from attr import NothingType as NothingType + +if sys.version_info >= (3, 11): + from typing import dataclass_transform +else: + from typing_extensions import dataclass_transform + +_T = TypeVar("_T") +_C = TypeVar("_C", bound=type) + +_EqOrderType = bool | Callable[[Any], Any] +_ValidatorType = Callable[[Any, "Attribute[_T]", _T], Any] +_CallableConverterType = Callable[[Any], Any] +_ConverterType = _CallableConverterType | Converter[Any, Any] +_ReprType = Callable[[Any], str] +_ReprArgType = bool | _ReprType +_OnSetAttrType = Callable[[Any, "Attribute[Any]", Any], Any] +_OnSetAttrArgType = _OnSetAttrType | list[_OnSetAttrType] | setters._NoOpType +_FieldTransformer = Callable[ + [type, list["Attribute[Any]"]], list["Attribute[Any]"] +] +# FIXME: in reality, if multiple validators are passed they must be in a list +# or tuple, but those are invariant and so would prevent subtypes of +# _ValidatorType from working when passed in a list or tuple. +_ValidatorArgType = _ValidatorType[_T] | Sequence[_ValidatorType[_T]] + +@overload +def field( + *, + default: None = ..., + validator: None = ..., + repr: _ReprArgType = ..., + hash: bool | None = ..., + init: bool = ..., + metadata: Mapping[Any, Any] | None = ..., + converter: None = ..., + factory: None = ..., + kw_only: bool | None = ..., + eq: bool | None = ..., + order: bool | None = ..., + on_setattr: _OnSetAttrArgType | None = ..., + alias: str | None = ..., + type: type | None = ..., +) -> Any: ... + +# This form catches an explicit None or no default and infers the type from the +# other arguments. +@overload +def field( + *, + default: None = ..., + validator: _ValidatorArgType[_T] | None = ..., + repr: _ReprArgType = ..., + hash: bool | None = ..., + init: bool = ..., + metadata: Mapping[Any, Any] | None = ..., + converter: _ConverterType + | list[_ConverterType] + | tuple[_ConverterType, ...] + | None = ..., + factory: Callable[[], _T] | None = ..., + kw_only: bool | None = ..., + eq: _EqOrderType | None = ..., + order: _EqOrderType | None = ..., + on_setattr: _OnSetAttrArgType | None = ..., + alias: str | None = ..., + type: type | None = ..., +) -> _T: ... + +# This form catches an explicit default argument. +@overload +def field( + *, + default: _T, + validator: _ValidatorArgType[_T] | None = ..., + repr: _ReprArgType = ..., + hash: bool | None = ..., + init: bool = ..., + metadata: Mapping[Any, Any] | None = ..., + converter: _ConverterType + | list[_ConverterType] + | tuple[_ConverterType, ...] + | None = ..., + factory: Callable[[], _T] | None = ..., + kw_only: bool | None = ..., + eq: _EqOrderType | None = ..., + order: _EqOrderType | None = ..., + on_setattr: _OnSetAttrArgType | None = ..., + alias: str | None = ..., + type: type | None = ..., +) -> _T: ... + +# This form covers type=non-Type: e.g. forward references (str), Any +@overload +def field( + *, + default: _T | None = ..., + validator: _ValidatorArgType[_T] | None = ..., + repr: _ReprArgType = ..., + hash: bool | None = ..., + init: bool = ..., + metadata: Mapping[Any, Any] | None = ..., + converter: _ConverterType + | list[_ConverterType] + | tuple[_ConverterType, ...] + | None = ..., + factory: Callable[[], _T] | None = ..., + kw_only: bool | None = ..., + eq: _EqOrderType | None = ..., + order: _EqOrderType | None = ..., + on_setattr: _OnSetAttrArgType | None = ..., + alias: str | None = ..., + type: type | None = ..., +) -> Any: ... +@overload +@dataclass_transform(field_specifiers=(attrib, field)) +def define( + maybe_cls: _C, + *, + these: dict[str, Any] | None = ..., + repr: bool = ..., + unsafe_hash: bool | None = ..., + hash: bool | None = ..., + init: bool = ..., + slots: bool = ..., + frozen: bool = ..., + weakref_slot: bool = ..., + str: bool = ..., + auto_attribs: bool = ..., + kw_only: bool = ..., + cache_hash: bool = ..., + auto_exc: bool = ..., + eq: bool | None = ..., + order: bool | None = ..., + auto_detect: bool = ..., + getstate_setstate: bool | None = ..., + on_setattr: _OnSetAttrArgType | None = ..., + field_transformer: _FieldTransformer | None = ..., + match_args: bool = ..., +) -> _C: ... +@overload +@dataclass_transform(field_specifiers=(attrib, field)) +def define( + maybe_cls: None = ..., + *, + these: dict[str, Any] | None = ..., + repr: bool = ..., + unsafe_hash: bool | None = ..., + hash: bool | None = ..., + init: bool = ..., + slots: bool = ..., + frozen: bool = ..., + weakref_slot: bool = ..., + str: bool = ..., + auto_attribs: bool = ..., + kw_only: bool = ..., + cache_hash: bool = ..., + auto_exc: bool = ..., + eq: bool | None = ..., + order: bool | None = ..., + auto_detect: bool = ..., + getstate_setstate: bool | None = ..., + on_setattr: _OnSetAttrArgType | None = ..., + field_transformer: _FieldTransformer | None = ..., + match_args: bool = ..., +) -> Callable[[_C], _C]: ... + +mutable = define + +@overload +@dataclass_transform(frozen_default=True, field_specifiers=(attrib, field)) +def frozen( + maybe_cls: _C, + *, + these: dict[str, Any] | None = ..., + repr: bool = ..., + unsafe_hash: bool | None = ..., + hash: bool | None = ..., + init: bool = ..., + slots: bool = ..., + frozen: bool = ..., + weakref_slot: bool = ..., + str: bool = ..., + auto_attribs: bool = ..., + kw_only: bool = ..., + cache_hash: bool = ..., + auto_exc: bool = ..., + eq: bool | None = ..., + order: bool | None = ..., + auto_detect: bool = ..., + getstate_setstate: bool | None = ..., + on_setattr: _OnSetAttrArgType | None = ..., + field_transformer: _FieldTransformer | None = ..., + match_args: bool = ..., +) -> _C: ... +@overload +@dataclass_transform(frozen_default=True, field_specifiers=(attrib, field)) +def frozen( + maybe_cls: None = ..., + *, + these: dict[str, Any] | None = ..., + repr: bool = ..., + unsafe_hash: bool | None = ..., + hash: bool | None = ..., + init: bool = ..., + slots: bool = ..., + frozen: bool = ..., + weakref_slot: bool = ..., + str: bool = ..., + auto_attribs: bool = ..., + kw_only: bool = ..., + cache_hash: bool = ..., + auto_exc: bool = ..., + eq: bool | None = ..., + order: bool | None = ..., + auto_detect: bool = ..., + getstate_setstate: bool | None = ..., + on_setattr: _OnSetAttrArgType | None = ..., + field_transformer: _FieldTransformer | None = ..., + match_args: bool = ..., +) -> Callable[[_C], _C]: ... + +class ClassProps: + # XXX: somehow when defining/using enums Mypy starts looking at our own + # (untyped) code and causes tons of errors. + Hashability: Any + KeywordOnly: Any + + is_exception: bool + is_slotted: bool + has_weakref_slot: bool + is_frozen: bool + # kw_only: ClassProps.KeywordOnly + kw_only: Any + collected_fields_by_mro: bool + added_init: bool + added_repr: bool + added_eq: bool + added_ordering: bool + # hashability: ClassProps.Hashability + hashability: Any + added_match_args: bool + added_str: bool + added_pickling: bool + on_setattr_hook: _OnSetAttrType | None + field_transformer: Callable[[Attribute[Any]], Attribute[Any]] | None + + def __init__( + self, + is_exception: bool, + is_slotted: bool, + has_weakref_slot: bool, + is_frozen: bool, + # kw_only: ClassProps.KeywordOnly + kw_only: Any, + collected_fields_by_mro: bool, + added_init: bool, + added_repr: bool, + added_eq: bool, + added_ordering: bool, + # hashability: ClassProps.Hashability + hashability: Any, + added_match_args: bool, + added_str: bool, + added_pickling: bool, + on_setattr_hook: _OnSetAttrType, + field_transformer: Callable[[Attribute[Any]], Attribute[Any]], + ) -> None: ... + @property + def is_hashable(self) -> bool: ... + +def inspect(cls: type) -> ClassProps: ... diff --git a/venv/lib/python3.11/site-packages/attrs/__pycache__/__init__.cpython-311.pyc b/venv/lib/python3.11/site-packages/attrs/__pycache__/__init__.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..ab8a38a49ad8e5ba0c66f7ca9b44a5bb3b85afad GIT binary patch literal 1505 zcmds$OOG5i5P;qD=$^;U%)VdjD+vLOM79;JxFMtv36jf#NKU?3-fr)Vm9FlV?HMwh za^xSt4T%E?@dr5Z8y1NJ@(GDkZX@NE6IDI43ao_08Mo)_a&_7DaLo_BUWeiMWoN3t zZ7}vHEv`p>DZKg_g|Au4(ja3H@BnJO26bMC25&%4p~E}S6)mpWHIRMR4xD&M@+DocG>y{zvp-XhhBL!~LcRJpH@ zrS+Za;3UHneFPIHFEVszl%->YL+94FrZUs1bZQv*&O^)_o{#bz~&1o0PaS z(zz{F;$BiYhE3l|t}{bd>Up9{r;8k2UFr<~gi zL}(#=M+iA_I}uM5SdO?Zq-8X zw980D+lg5k;H6lM7qzQGTrYHfSqNcvDH7^pvq$I>4hSoR9^sJCCkzOygd@TlVV$r~ z*dS~Ywg|_BZNdrSeE7C+(6!$z%0KI2+O(mHrwZjw6gL8R9lIMs_MSK zP~_^l!~V+`X;&Fj=zf`Vm1&h)75oW(!a~Z73fU4Omq4|}nlF1;h#%Q2v|_KH#Nz@~ z{Dn05XOJ<>9+YK#p|cG8`W_@@JXQHL&h$lG&hWbPv(x+cW2>FISIXp>94Q-9h&C2N z=Nhm7w4A+eeE>x|$<&ADee^-iXjA089t6QW+zM)Q_W#6tEVzBeZvB1!&d#p>eg45d oy83T(9=_Yfx?ST%H2*wcgM+W&n@7L)@BY@m`=U#aIm2rI1tYkaE&u=k literal 0 HcmV?d00001 diff --git a/venv/lib/python3.11/site-packages/attrs/__pycache__/converters.cpython-311.pyc b/venv/lib/python3.11/site-packages/attrs/__pycache__/converters.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..c3539ae7228135573b87a1327e80aefbcc3837df GIT binary patch literal 236 zcmZ3^%ge<81pCCxGJSybV-N=hn4pZ$d_cx@h7^Vr#vFzah7_h?22JLdAW2QeTZ~$M zK$1VPq@+kMIX|x~wWuVusCXsAXOR4_Q2mVj+*JMY#G;bKyhQ!nO2>i%{iMvCoXos* z-Q45?{j$`&GX0#)B>jTQl8pR3V?9Gd{o>4$RNaEaRtuXrWHXOR4_Q2mVj+*JMY#G;bKyhQ!nO2>i%{iMvCoXos* z-Q45?{j$`&GX0#)B>jTQl8pR3V?9Gd{o>4$RNaEauOR)5{M=Oi^2DN&#JoiP+)BrS0{x`SoSe+Oblu$K z0{yboyfXcq%q0DS%94!yJYzjWL;d2+l2qM-#N_P6^weT~kg>)3P;>PPDt~d<zAn}2jk&*EO8v~>C1qLZ(RKy091ptf@J&OPU literal 0 HcmV?d00001 diff --git a/venv/lib/python3.11/site-packages/attrs/__pycache__/setters.cpython-311.pyc b/venv/lib/python3.11/site-packages/attrs/__pycache__/setters.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..83169f30b4d3bcf434169b568a4fe36b1892c6d4 GIT binary patch literal 230 zcmZ3^%ge<81pCCxGChIxV-N=hn4pZ$d_cx@h7^Vr#vFzah7_h?22JLdAW2QeTZ~$M zK$0i1q@+l%IJKlCwWxR{!)K7>uOR)5{M=Oi^2DN&#JoiP+)BrS0{x`SoSe+Oblu$K z0{yboyfXcq%q0DS%94!yJYzjWL;d2+l2qM-#N_P6^weT~kg>)3P;>PPDt~d<zAn}2jk&*EO8v~>C1qLZ(RKy091pt~+J*@x$ literal 0 HcmV?d00001 diff --git a/venv/lib/python3.11/site-packages/attrs/__pycache__/validators.cpython-311.pyc b/venv/lib/python3.11/site-packages/attrs/__pycache__/validators.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..e194e60309703d11ef7aae9f4c85e5a29d85b3e1 GIT binary patch literal 236 zcmZ3^%ge<81pCCxGJSybV-N=hn4pZ$d_cx@h7^Vr#vFzah7_h?22JLdAW2QeTZ~$M zK$1VPq@+l%EHNiDC9x#GsCXsAXOR4_Q2mVj+*JMY#G;bKyhQ!nO2>i%{iMvCoXos* z-Q45?{j$`&GX0#)B>jTQl8pR3V?9Gd{o>4$RNaEa=3.7 +License-File: LICENSE +Dynamic: author +Dynamic: author-email +Dynamic: classifier +Dynamic: description +Dynamic: home-page +Dynamic: license +Dynamic: license-file +Dynamic: project-url +Dynamic: requires-python +Dynamic: summary + +Certifi: Python SSL Certificates +================================ + +Certifi provides Mozilla's carefully curated collection of Root Certificates for +validating the trustworthiness of SSL certificates while verifying the identity +of TLS hosts. It has been extracted from the `Requests`_ project. + +Installation +------------ + +``certifi`` is available on PyPI. Simply install it with ``pip``:: + + $ pip install certifi + +Usage +----- + +To reference the installed certificate authority (CA) bundle, you can use the +built-in function:: + + >>> import certifi + + >>> certifi.where() + '/usr/local/lib/python3.7/site-packages/certifi/cacert.pem' + +Or from the command line:: + + $ python -m certifi + /usr/local/lib/python3.7/site-packages/certifi/cacert.pem + +Enjoy! + +.. _`Requests`: https://requests.readthedocs.io/en/master/ + +Addition/Removal of Certificates +-------------------------------- + +Certifi does not support any addition/removal or other modification of the +CA trust store content. This project is intended to provide a reliable and +highly portable root of trust to python deployments. Look to upstream projects +for methods to use alternate trust. diff --git a/venv/lib/python3.11/site-packages/certifi-2026.1.4.dist-info/RECORD b/venv/lib/python3.11/site-packages/certifi-2026.1.4.dist-info/RECORD new file mode 100644 index 0000000..33b9c77 --- /dev/null +++ b/venv/lib/python3.11/site-packages/certifi-2026.1.4.dist-info/RECORD @@ -0,0 +1,14 @@ +certifi-2026.1.4.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 +certifi-2026.1.4.dist-info/METADATA,sha256=FSfJEfKuMo6bJlofUrtRpn4PFTYtbYyXpHN_A3ZFpIY,2473 +certifi-2026.1.4.dist-info/RECORD,, +certifi-2026.1.4.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91 +certifi-2026.1.4.dist-info/licenses/LICENSE,sha256=6TcW2mucDVpKHfYP5pWzcPBpVgPSH2-D8FPkLPwQyvc,989 +certifi-2026.1.4.dist-info/top_level.txt,sha256=KMu4vUCfsjLrkPbSNdgdekS-pVJzBAJFO__nI8NF6-U,8 +certifi/__init__.py,sha256=969deMMS7Uchipr0oO4dbRBUvRi0uNYCn07VmG1aTrg,94 +certifi/__main__.py,sha256=xBBoj905TUWBLRGANOcf7oi6e-3dMP4cEoG9OyMs11g,243 +certifi/__pycache__/__init__.cpython-311.pyc,, +certifi/__pycache__/__main__.cpython-311.pyc,, +certifi/__pycache__/core.cpython-311.pyc,, +certifi/cacert.pem,sha256=Tzl1_zCrvzVEO0hgZK6Ly0Hf9wf_31dsdtKS-0WKoKk,270954 +certifi/core.py,sha256=XFXycndG5pf37ayeF8N32HUuDafsyhkVMbO4BAPWHa0,3394 +certifi/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 diff --git a/venv/lib/python3.11/site-packages/certifi-2026.1.4.dist-info/WHEEL b/venv/lib/python3.11/site-packages/certifi-2026.1.4.dist-info/WHEEL new file mode 100644 index 0000000..e7fa31b --- /dev/null +++ b/venv/lib/python3.11/site-packages/certifi-2026.1.4.dist-info/WHEEL @@ -0,0 +1,5 @@ +Wheel-Version: 1.0 +Generator: setuptools (80.9.0) +Root-Is-Purelib: true +Tag: py3-none-any + diff --git a/venv/lib/python3.11/site-packages/certifi-2026.1.4.dist-info/licenses/LICENSE b/venv/lib/python3.11/site-packages/certifi-2026.1.4.dist-info/licenses/LICENSE new file mode 100644 index 0000000..62b076c --- /dev/null +++ b/venv/lib/python3.11/site-packages/certifi-2026.1.4.dist-info/licenses/LICENSE @@ -0,0 +1,20 @@ +This package contains a modified version of ca-bundle.crt: + +ca-bundle.crt -- Bundle of CA Root Certificates + +This is a bundle of X.509 certificates of public Certificate Authorities +(CA). These were automatically extracted from Mozilla's root certificates +file (certdata.txt). This file can be found in the mozilla source tree: +https://hg.mozilla.org/mozilla-central/file/tip/security/nss/lib/ckfw/builtins/certdata.txt +It contains the certificates in PEM format and therefore +can be directly used with curl / libcurl / php_curl, or with +an Apache+mod_ssl webserver for SSL client authentication. +Just configure this file as the SSLCACertificateFile.# + +***** BEGIN LICENSE BLOCK ***** +This Source Code Form is subject to the terms of the Mozilla Public License, +v. 2.0. If a copy of the MPL was not distributed with this file, You can obtain +one at http://mozilla.org/MPL/2.0/. + +***** END LICENSE BLOCK ***** +@(#) $RCSfile: certdata.txt,v $ $Revision: 1.80 $ $Date: 2011/11/03 15:11:58 $ diff --git a/venv/lib/python3.11/site-packages/certifi-2026.1.4.dist-info/top_level.txt b/venv/lib/python3.11/site-packages/certifi-2026.1.4.dist-info/top_level.txt new file mode 100644 index 0000000..963eac5 --- /dev/null +++ b/venv/lib/python3.11/site-packages/certifi-2026.1.4.dist-info/top_level.txt @@ -0,0 +1 @@ +certifi diff --git a/venv/lib/python3.11/site-packages/certifi/__init__.py b/venv/lib/python3.11/site-packages/certifi/__init__.py new file mode 100644 index 0000000..090fd58 --- /dev/null +++ b/venv/lib/python3.11/site-packages/certifi/__init__.py @@ -0,0 +1,4 @@ +from .core import contents, where + +__all__ = ["contents", "where"] +__version__ = "2026.01.04" diff --git a/venv/lib/python3.11/site-packages/certifi/__main__.py b/venv/lib/python3.11/site-packages/certifi/__main__.py new file mode 100644 index 0000000..8945b5d --- /dev/null +++ b/venv/lib/python3.11/site-packages/certifi/__main__.py @@ -0,0 +1,12 @@ +import argparse + +from certifi import contents, where + +parser = argparse.ArgumentParser() +parser.add_argument("-c", "--contents", action="store_true") +args = parser.parse_args() + +if args.contents: + print(contents()) +else: + print(where()) diff --git a/venv/lib/python3.11/site-packages/certifi/__pycache__/__init__.cpython-311.pyc b/venv/lib/python3.11/site-packages/certifi/__pycache__/__init__.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..19cd4924e98887348db74eb2279ea166d6abe7ae GIT binary patch literal 336 zcmZusy-LJD5Z=v?cP5;j2sWZ!ipwUaSc%{Z*oaLEmt1yD7B`z^vnIsq9^pD4L3|0H z;mRYGU}Yy}A4BnL)(_d781f7VAdrI+Ca|;; z3j$&hJGT;>IEh2t8xZV#LbDiH{WznMu@8(IC#| zNOroY#Az7EsAif@Wtu&tIjvDfm1g%0Vax>67>BakjxWlJJaT%ed~;=Zp^glE*$~1t aI9~l1@BaR>U3o`~(R%N2;Sa8Mjp!SM-de)| literal 0 HcmV?d00001 diff --git a/venv/lib/python3.11/site-packages/certifi/__pycache__/__main__.cpython-311.pyc b/venv/lib/python3.11/site-packages/certifi/__pycache__/__main__.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..1460b41e365eb18f10f3ba331dbaf56ed7a76e69 GIT binary patch literal 725 zcmah`&1(}u6o0edyBIBoVCbn-N}J+#DPE&c&}$IHOD@ZFcTBeK7qgp`6b~!(kU|gM z^rok%=-=Sqkd%dnJq0{@EB4ltGuv*dBKT(By!V^;dvD&%e5%z9VDkOm&^u@L2M3kN zSI+q_=DY(JT;xNSTfs+x&=mr)DcHj*@=#7^mev{0d7C-tJRWfU5wy%^Jk6skjL>b>+Rzboa> zRovd8y+OdrKI05pC?%5?x3KHlEU}CgM!CyzQb^@0$J7hcFTg(xE?!vuC?M88rYR1w z6^wS`*xL1c-wS(Y;KbIDghR{scCC1n_M`CO*7mlQcquVs?7YG~l2})*S+*TuFSPBg zcyyt)gUB8DQrh7f)+TmK6JI&9q|O}EgTxjmr^472jo!ooTF{6M6?o8q^bvQmQXI7`etn}wv#BAKJUDFJ3DVa ze((35|Al9l~X-MF3&l=C+|@sD*p?g_hN2~ z@3^VH2R>$#QJCc~`bz%1zZA#^IHY=H0a{S?;?Rai4S;93Z3|#WRL>gQAqYOv{FRcJ z7hm%Ub@_xlKI!O>IHX`gwGAy(-V6QgN+`5m(9C4XP`8UXNif|ex|yT}oYZua%Eh8g zHA7Dp4W(rm8%afGD`m>Klr%_Eqh?Yubc%IqWwUENzI>N5(g?4@$)MG?D zRt{2x-0ZXxi&feFGMNQwlQBum;9jxzUi`xBcd5;zh{Z{7Y&8(?We4{KY z59Cd3X4`;e6@y?v%@&;#I}!VQ-M)eT)Zw|s28t_PF+M0q7Io_ekykeSRT80R=ei8 zD+A4XXZ60xJY~mg3uVV{OV!`8y8ARq-2 z?MPgNF1eQu*^v$bzFAoRnm}?Qas`wvY#EwfmT7@7WNfcVi5&!f07;1?*?yU_K-vPq zo0;q`LhF(AoKF=7BIo&8rbhcGk*Y8L9Yf-BvuP2UJavo>h}+ig7wstm6|$9 z%{5YU&z9<`yH@IMeRRb8<;hAt zGHFF7Ymv!+#duAKJDc}VfCZ1Wa~%{=zzr*cD$ontTT-Ym(A7@Gg7q#%_5R8Ct_HCC zmdSfCg|I-`KG{?>EzQ{i))hmA6iRy?tjQ4j93)s)B|w$-qbPJr14+Qd3^X$f3UWmp z+W)>TCM+>=B2F~KiKDT)IAe)3C*piVoPYjtO`NZbtCqN06IR=)WAjc>$67Y5lwS=`$~*-CAxcG;aVgxWewxt*5ey)=N zn3fjEAau5{iK*nWm@pEOVWviyiZR7%PaonAVIB1;d^8t9b+I;v;vZB$J1W*k=d97W z|AC=yk@^TW>Sw6xahL_6xh&voh{R!PnjQw^b1D1Dif4AWsuX)E`@>8`pJuj~gSMI$S9H}fd`4QjP z{;ej0u3t@YzBO)NfjyvqhYlg%JXhntc>U?#E7sZzx+dyX)12>4d#^jrUT@b<`2GXV COy~gs literal 0 HcmV?d00001 diff --git a/venv/lib/python3.11/site-packages/certifi/cacert.pem b/venv/lib/python3.11/site-packages/certifi/cacert.pem new file mode 100644 index 0000000..132db0d --- /dev/null +++ b/venv/lib/python3.11/site-packages/certifi/cacert.pem @@ -0,0 +1,4468 @@ + +# Issuer: CN=QuoVadis Root CA 2 O=QuoVadis Limited +# Subject: CN=QuoVadis Root CA 2 O=QuoVadis Limited +# Label: "QuoVadis Root CA 2" +# Serial: 1289 +# MD5 Fingerprint: 5e:39:7b:dd:f8:ba:ec:82:e9:ac:62:ba:0c:54:00:2b +# SHA1 Fingerprint: ca:3a:fb:cf:12:40:36:4b:44:b2:16:20:88:80:48:39:19:93:7c:f7 +# SHA256 Fingerprint: 85:a0:dd:7d:d7:20:ad:b7:ff:05:f8:3d:54:2b:20:9d:c7:ff:45:28:f7:d6:77:b1:83:89:fe:a5:e5:c4:9e:86 +-----BEGIN CERTIFICATE----- +MIIFtzCCA5+gAwIBAgICBQkwDQYJKoZIhvcNAQEFBQAwRTELMAkGA1UEBhMCQk0x +GTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxGzAZBgNVBAMTElF1b1ZhZGlzIFJv +b3QgQ0EgMjAeFw0wNjExMjQxODI3MDBaFw0zMTExMjQxODIzMzNaMEUxCzAJBgNV +BAYTAkJNMRkwFwYDVQQKExBRdW9WYWRpcyBMaW1pdGVkMRswGQYDVQQDExJRdW9W +YWRpcyBSb290IENBIDIwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCa +GMpLlA0ALa8DKYrwD4HIrkwZhR0In6spRIXzL4GtMh6QRr+jhiYaHv5+HBg6XJxg +Fyo6dIMzMH1hVBHL7avg5tKifvVrbxi3Cgst/ek+7wrGsxDp3MJGF/hd/aTa/55J +WpzmM+Yklvc/ulsrHHo1wtZn/qtmUIttKGAr79dgw8eTvI02kfN/+NsRE8Scd3bB +rrcCaoF6qUWD4gXmuVbBlDePSHFjIuwXZQeVikvfj8ZaCuWw419eaxGrDPmF60Tp ++ARz8un+XJiM9XOva7R+zdRcAitMOeGylZUtQofX1bOQQ7dsE/He3fbE+Ik/0XX1 +ksOR1YqI0JDs3G3eicJlcZaLDQP9nL9bFqyS2+r+eXyt66/3FsvbzSUr5R/7mp/i +Ucw6UwxI5g69ybR2BlLmEROFcmMDBOAENisgGQLodKcftslWZvB1JdxnwQ5hYIiz +PtGo/KPaHbDRsSNU30R2be1B2MGyIrZTHN81Hdyhdyox5C315eXbyOD/5YDXC2Og +/zOhD7osFRXql7PSorW+8oyWHhqPHWykYTe5hnMz15eWniN9gqRMgeKh0bpnX5UH +oycR7hYQe7xFSkyyBNKr79X9DFHOUGoIMfmR2gyPZFwDwzqLID9ujWc9Otb+fVuI +yV77zGHcizN300QyNQliBJIWENieJ0f7OyHj+OsdWwIDAQABo4GwMIGtMA8GA1Ud +EwEB/wQFMAMBAf8wCwYDVR0PBAQDAgEGMB0GA1UdDgQWBBQahGK8SEwzJQTU7tD2 +A8QZRtGUazBuBgNVHSMEZzBlgBQahGK8SEwzJQTU7tD2A8QZRtGUa6FJpEcwRTEL +MAkGA1UEBhMCQk0xGTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxGzAZBgNVBAMT +ElF1b1ZhZGlzIFJvb3QgQ0EgMoICBQkwDQYJKoZIhvcNAQEFBQADggIBAD4KFk2f +BluornFdLwUvZ+YTRYPENvbzwCYMDbVHZF34tHLJRqUDGCdViXh9duqWNIAXINzn +g/iN/Ae42l9NLmeyhP3ZRPx3UIHmfLTJDQtyU/h2BwdBR5YM++CCJpNVjP4iH2Bl +fF/nJrP3MpCYUNQ3cVX2kiF495V5+vgtJodmVjB3pjd4M1IQWK4/YY7yarHvGH5K +WWPKjaJW1acvvFYfzznB4vsKqBUsfU16Y8Zsl0Q80m/DShcK+JDSV6IZUaUtl0Ha +B0+pUNqQjZRG4T7wlP0QADj1O+hA4bRuVhogzG9Yje0uRY/W6ZM/57Es3zrWIozc +hLsib9D45MY56QSIPMO661V6bYCZJPVsAfv4l7CUW+v90m/xd2gNNWQjrLhVoQPR +TUIZ3Ph1WVaj+ahJefivDrkRoHy3au000LYmYjgahwz46P0u05B/B5EqHdZ+XIWD +mbA4CD/pXvk1B+TJYm5Xf6dQlfe6yJvmjqIBxdZmv3lh8zwc4bmCXF2gw+nYSL0Z +ohEUGW6yhhtoPkg3Goi3XZZenMfvJ2II4pEZXNLxId26F0KCl3GBUzGpn/Z9Yr9y +4aOTHcyKJloJONDO1w2AFrR4pTqHTI2KpdVGl/IsELm8VCLAAVBpQ570su9t+Oza +8eOx79+Rj1QqCyXBJhnEUhAFZdWCEOrCMc0u +-----END CERTIFICATE----- + +# Issuer: CN=QuoVadis Root CA 3 O=QuoVadis Limited +# Subject: CN=QuoVadis Root CA 3 O=QuoVadis Limited +# Label: "QuoVadis Root CA 3" +# Serial: 1478 +# MD5 Fingerprint: 31:85:3c:62:94:97:63:b9:aa:fd:89:4e:af:6f:e0:cf +# SHA1 Fingerprint: 1f:49:14:f7:d8:74:95:1d:dd:ae:02:c0:be:fd:3a:2d:82:75:51:85 +# SHA256 Fingerprint: 18:f1:fc:7f:20:5d:f8:ad:dd:eb:7f:e0:07:dd:57:e3:af:37:5a:9c:4d:8d:73:54:6b:f4:f1:fe:d1:e1:8d:35 +-----BEGIN CERTIFICATE----- +MIIGnTCCBIWgAwIBAgICBcYwDQYJKoZIhvcNAQEFBQAwRTELMAkGA1UEBhMCQk0x +GTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxGzAZBgNVBAMTElF1b1ZhZGlzIFJv +b3QgQ0EgMzAeFw0wNjExMjQxOTExMjNaFw0zMTExMjQxOTA2NDRaMEUxCzAJBgNV +BAYTAkJNMRkwFwYDVQQKExBRdW9WYWRpcyBMaW1pdGVkMRswGQYDVQQDExJRdW9W +YWRpcyBSb290IENBIDMwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDM +V0IWVJzmmNPTTe7+7cefQzlKZbPoFog02w1ZkXTPkrgEQK0CSzGrvI2RaNggDhoB +4hp7Thdd4oq3P5kazethq8Jlph+3t723j/z9cI8LoGe+AaJZz3HmDyl2/7FWeUUr +H556VOijKTVopAFPD6QuN+8bv+OPEKhyq1hX51SGyMnzW9os2l2ObjyjPtr7guXd +8lyyBTNvijbO0BNO/79KDDRMpsMhvVAEVeuxu537RR5kFd5VAYwCdrXLoT9Cabwv +vWhDFlaJKjdhkf2mrk7AyxRllDdLkgbvBNDInIjbC3uBr7E9KsRlOni27tyAsdLT +mZw67mtaa7ONt9XOnMK+pUsvFrGeaDsGb659n/je7Mwpp5ijJUMv7/FfJuGITfhe +btfZFG4ZM2mnO4SJk8RTVROhUXhA+LjJou57ulJCg54U7QVSWllWp5f8nT8KKdjc +T5EOE7zelaTfi5m+rJsziO+1ga8bxiJTyPbH7pcUsMV8eFLI8M5ud2CEpukqdiDt +WAEXMJPpGovgc2PZapKUSU60rUqFxKMiMPwJ7Wgic6aIDFUhWMXhOp8q3crhkODZ +c6tsgLjoC2SToJyMGf+z0gzskSaHirOi4XCPLArlzW1oUevaPwV/izLmE1xr/l9A +4iLItLRkT9a6fUg+qGkM17uGcclzuD87nSVL2v9A6wIDAQABo4IBlTCCAZEwDwYD +VR0TAQH/BAUwAwEB/zCB4QYDVR0gBIHZMIHWMIHTBgkrBgEEAb5YAAMwgcUwgZMG +CCsGAQUFBwICMIGGGoGDQW55IHVzZSBvZiB0aGlzIENlcnRpZmljYXRlIGNvbnN0 +aXR1dGVzIGFjY2VwdGFuY2Ugb2YgdGhlIFF1b1ZhZGlzIFJvb3QgQ0EgMyBDZXJ0 +aWZpY2F0ZSBQb2xpY3kgLyBDZXJ0aWZpY2F0aW9uIFByYWN0aWNlIFN0YXRlbWVu +dC4wLQYIKwYBBQUHAgEWIWh0dHA6Ly93d3cucXVvdmFkaXNnbG9iYWwuY29tL2Nw +czALBgNVHQ8EBAMCAQYwHQYDVR0OBBYEFPLAE+CCQz777i9nMpY1XNu4ywLQMG4G +A1UdIwRnMGWAFPLAE+CCQz777i9nMpY1XNu4ywLQoUmkRzBFMQswCQYDVQQGEwJC +TTEZMBcGA1UEChMQUXVvVmFkaXMgTGltaXRlZDEbMBkGA1UEAxMSUXVvVmFkaXMg +Um9vdCBDQSAzggIFxjANBgkqhkiG9w0BAQUFAAOCAgEAT62gLEz6wPJv92ZVqyM0 +7ucp2sNbtrCD2dDQ4iH782CnO11gUyeim/YIIirnv6By5ZwkajGxkHon24QRiSem +d1o417+shvzuXYO8BsbRd2sPbSQvS3pspweWyuOEn62Iix2rFo1bZhfZFvSLgNLd ++LJ2w/w4E6oM3kJpK27zPOuAJ9v1pkQNn1pVWQvVDVJIxa6f8i+AxeoyUDUSly7B +4f/xI4hROJ/yZlZ25w9Rl6VSDE1JUZU2Pb+iSwwQHYaZTKrzchGT5Or2m9qoXadN +t54CrnMAyNojA+j56hl0YgCUyyIgvpSnWbWCar6ZeXqp8kokUvd0/bpO5qgdAm6x +DYBEwa7TIzdfu4V8K5Iu6H6li92Z4b8nby1dqnuH/grdS/yO9SbkbnBCbjPsMZ57 +k8HkyWkaPcBrTiJt7qtYTcbQQcEr6k8Sh17rRdhs9ZgC06DYVYoGmRmioHfRMJ6s +zHXug/WwYjnPbFfiTNKRCw51KBuav/0aQ/HKd/s7j2G4aSgWQgRecCocIdiP4b0j +Wy10QJLZYxkNc91pvGJHvOB0K7Lrfb5BG7XARsWhIstfTsEokt4YutUqKLsRixeT +mJlglFwjz1onl14LBQaTNx47aTbrqZ5hHY8y2o4M1nQ+ewkk2gF3R8Q7zTSMmfXK +4SVhM7JZG+Ju1zdXtg2pEto= +-----END CERTIFICATE----- + +# Issuer: CN=DigiCert Assured ID Root CA O=DigiCert Inc OU=www.digicert.com +# Subject: CN=DigiCert Assured ID Root CA O=DigiCert Inc OU=www.digicert.com +# Label: "DigiCert Assured ID Root CA" +# Serial: 17154717934120587862167794914071425081 +# MD5 Fingerprint: 87:ce:0b:7b:2a:0e:49:00:e1:58:71:9b:37:a8:93:72 +# SHA1 Fingerprint: 05:63:b8:63:0d:62:d7:5a:bb:c8:ab:1e:4b:df:b5:a8:99:b2:4d:43 +# SHA256 Fingerprint: 3e:90:99:b5:01:5e:8f:48:6c:00:bc:ea:9d:11:1e:e7:21:fa:ba:35:5a:89:bc:f1:df:69:56:1e:3d:c6:32:5c +-----BEGIN CERTIFICATE----- +MIIDtzCCAp+gAwIBAgIQDOfg5RfYRv6P5WD8G/AwOTANBgkqhkiG9w0BAQUFADBl +MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3 +d3cuZGlnaWNlcnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJv +b3QgQ0EwHhcNMDYxMTEwMDAwMDAwWhcNMzExMTEwMDAwMDAwWjBlMQswCQYDVQQG +EwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNl +cnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgQ0EwggEi +MA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCtDhXO5EOAXLGH87dg+XESpa7c +JpSIqvTO9SA5KFhgDPiA2qkVlTJhPLWxKISKityfCgyDF3qPkKyK53lTXDGEKvYP +mDI2dsze3Tyoou9q+yHyUmHfnyDXH+Kx2f4YZNISW1/5WBg1vEfNoTb5a3/UsDg+ +wRvDjDPZ2C8Y/igPs6eD1sNuRMBhNZYW/lmci3Zt1/GiSw0r/wty2p5g0I6QNcZ4 +VYcgoc/lbQrISXwxmDNsIumH0DJaoroTghHtORedmTpyoeb6pNnVFzF1roV9Iq4/ +AUaG9ih5yLHa5FcXxH4cDrC0kqZWs72yl+2qp/C3xag/lRbQ/6GW6whfGHdPAgMB +AAGjYzBhMA4GA1UdDwEB/wQEAwIBhjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQW +BBRF66Kv9JLLgjEtUYunpyGd823IDzAfBgNVHSMEGDAWgBRF66Kv9JLLgjEtUYun +pyGd823IDzANBgkqhkiG9w0BAQUFAAOCAQEAog683+Lt8ONyc3pklL/3cmbYMuRC +dWKuh+vy1dneVrOfzM4UKLkNl2BcEkxY5NM9g0lFWJc1aRqoR+pWxnmrEthngYTf +fwk8lOa4JiwgvT2zKIn3X/8i4peEH+ll74fg38FnSbNd67IJKusm7Xi+fT8r87cm +NW1fiQG2SVufAQWbqz0lwcy2f8Lxb4bG+mRo64EtlOtCt/qMHt1i8b5QZ7dsvfPx +H2sMNgcWfzd8qVttevESRmCD1ycEvkvOl77DZypoEd+A5wwzZr8TDRRu838fYxAe ++o0bJW1sj6W3YQGx0qMmoRBxna3iw/nDmVG3KwcIzi7mULKn+gpFL6Lw8g== +-----END CERTIFICATE----- + +# Issuer: CN=DigiCert Global Root CA O=DigiCert Inc OU=www.digicert.com +# Subject: CN=DigiCert Global Root CA O=DigiCert Inc OU=www.digicert.com +# Label: "DigiCert Global Root CA" +# Serial: 10944719598952040374951832963794454346 +# MD5 Fingerprint: 79:e4:a9:84:0d:7d:3a:96:d7:c0:4f:e2:43:4c:89:2e +# SHA1 Fingerprint: a8:98:5d:3a:65:e5:e5:c4:b2:d7:d6:6d:40:c6:dd:2f:b1:9c:54:36 +# SHA256 Fingerprint: 43:48:a0:e9:44:4c:78:cb:26:5e:05:8d:5e:89:44:b4:d8:4f:96:62:bd:26:db:25:7f:89:34:a4:43:c7:01:61 +-----BEGIN CERTIFICATE----- +MIIDrzCCApegAwIBAgIQCDvgVpBCRrGhdWrJWZHHSjANBgkqhkiG9w0BAQUFADBh +MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3 +d3cuZGlnaWNlcnQuY29tMSAwHgYDVQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBD +QTAeFw0wNjExMTAwMDAwMDBaFw0zMTExMTAwMDAwMDBaMGExCzAJBgNVBAYTAlVT +MRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3dy5kaWdpY2VydC5j +b20xIDAeBgNVBAMTF0RpZ2lDZXJ0IEdsb2JhbCBSb290IENBMIIBIjANBgkqhkiG +9w0BAQEFAAOCAQ8AMIIBCgKCAQEA4jvhEXLeqKTTo1eqUKKPC3eQyaKl7hLOllsB +CSDMAZOnTjC3U/dDxGkAV53ijSLdhwZAAIEJzs4bg7/fzTtxRuLWZscFs3YnFo97 +nh6Vfe63SKMI2tavegw5BmV/Sl0fvBf4q77uKNd0f3p4mVmFaG5cIzJLv07A6Fpt +43C/dxC//AH2hdmoRBBYMql1GNXRor5H4idq9Joz+EkIYIvUX7Q6hL+hqkpMfT7P +T19sdl6gSzeRntwi5m3OFBqOasv+zbMUZBfHWymeMr/y7vrTC0LUq7dBMtoM1O/4 +gdW7jVg/tRvoSSiicNoxBN33shbyTApOB6jtSj1etX+jkMOvJwIDAQABo2MwYTAO +BgNVHQ8BAf8EBAMCAYYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUA95QNVbR +TLtm8KPiGxvDl7I90VUwHwYDVR0jBBgwFoAUA95QNVbRTLtm8KPiGxvDl7I90VUw +DQYJKoZIhvcNAQEFBQADggEBAMucN6pIExIK+t1EnE9SsPTfrgT1eXkIoyQY/Esr +hMAtudXH/vTBH1jLuG2cenTnmCmrEbXjcKChzUyImZOMkXDiqw8cvpOp/2PV5Adg +06O/nVsJ8dWO41P0jmP6P6fbtGbfYmbW0W5BjfIttep3Sp+dWOIrWcBAI+0tKIJF +PnlUkiaY4IBIqDfv8NZ5YBberOgOzW6sRBc4L0na4UU+Krk2U886UAb3LujEV0ls +YSEY1QSteDwsOoBrp+uvFRTp2InBuThs4pFsiv9kuXclVzDAGySj4dzp30d8tbQk +CAUw7C29C79Fv1C5qfPrmAESrciIxpg0X40KPMbp1ZWVbd4= +-----END CERTIFICATE----- + +# Issuer: CN=DigiCert High Assurance EV Root CA O=DigiCert Inc OU=www.digicert.com +# Subject: CN=DigiCert High Assurance EV Root CA O=DigiCert Inc OU=www.digicert.com +# Label: "DigiCert High Assurance EV Root CA" +# Serial: 3553400076410547919724730734378100087 +# MD5 Fingerprint: d4:74:de:57:5c:39:b2:d3:9c:85:83:c5:c0:65:49:8a +# SHA1 Fingerprint: 5f:b7:ee:06:33:e2:59:db:ad:0c:4c:9a:e6:d3:8f:1a:61:c7:dc:25 +# SHA256 Fingerprint: 74:31:e5:f4:c3:c1:ce:46:90:77:4f:0b:61:e0:54:40:88:3b:a9:a0:1e:d0:0b:a6:ab:d7:80:6e:d3:b1:18:cf +-----BEGIN CERTIFICATE----- +MIIDxTCCAq2gAwIBAgIQAqxcJmoLQJuPC3nyrkYldzANBgkqhkiG9w0BAQUFADBs +MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3 +d3cuZGlnaWNlcnQuY29tMSswKQYDVQQDEyJEaWdpQ2VydCBIaWdoIEFzc3VyYW5j +ZSBFViBSb290IENBMB4XDTA2MTExMDAwMDAwMFoXDTMxMTExMDAwMDAwMFowbDEL +MAkGA1UEBhMCVVMxFTATBgNVBAoTDERpZ2lDZXJ0IEluYzEZMBcGA1UECxMQd3d3 +LmRpZ2ljZXJ0LmNvbTErMCkGA1UEAxMiRGlnaUNlcnQgSGlnaCBBc3N1cmFuY2Ug +RVYgUm9vdCBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMbM5XPm ++9S75S0tMqbf5YE/yc0lSbZxKsPVlDRnogocsF9ppkCxxLeyj9CYpKlBWTrT3JTW +PNt0OKRKzE0lgvdKpVMSOO7zSW1xkX5jtqumX8OkhPhPYlG++MXs2ziS4wblCJEM +xChBVfvLWokVfnHoNb9Ncgk9vjo4UFt3MRuNs8ckRZqnrG0AFFoEt7oT61EKmEFB +Ik5lYYeBQVCmeVyJ3hlKV9Uu5l0cUyx+mM0aBhakaHPQNAQTXKFx01p8VdteZOE3 +hzBWBOURtCmAEvF5OYiiAhF8J2a3iLd48soKqDirCmTCv2ZdlYTBoSUeh10aUAsg +EsxBu24LUTi4S8sCAwEAAaNjMGEwDgYDVR0PAQH/BAQDAgGGMA8GA1UdEwEB/wQF +MAMBAf8wHQYDVR0OBBYEFLE+w2kD+L9HAdSYJhoIAu9jZCvDMB8GA1UdIwQYMBaA +FLE+w2kD+L9HAdSYJhoIAu9jZCvDMA0GCSqGSIb3DQEBBQUAA4IBAQAcGgaX3Nec +nzyIZgYIVyHbIUf4KmeqvxgydkAQV8GK83rZEWWONfqe/EW1ntlMMUu4kehDLI6z +eM7b41N5cdblIZQB2lWHmiRk9opmzN6cN82oNLFpmyPInngiK3BD41VHMWEZ71jF +hS9OMPagMRYjyOfiZRYzy78aG6A9+MpeizGLYAiJLQwGXFK3xPkKmNEVX58Svnw2 +Yzi9RKR/5CYrCsSXaQ3pjOLAEFe4yHYSkVXySGnYvCoCWw9E1CAx2/S6cCZdkGCe +vEsXCS+0yx5DaMkHJ8HSXPfqIbloEpw8nL+e/IBcm2PN7EeqJSdnoDfzAIJ9VNep ++OkuE6N36B9K +-----END CERTIFICATE----- + +# Issuer: CN=SwissSign Gold CA - G2 O=SwissSign AG +# Subject: CN=SwissSign Gold CA - G2 O=SwissSign AG +# Label: "SwissSign Gold CA - G2" +# Serial: 13492815561806991280 +# MD5 Fingerprint: 24:77:d9:a8:91:d1:3b:fa:88:2d:c2:ff:f8:cd:33:93 +# SHA1 Fingerprint: d8:c5:38:8a:b7:30:1b:1b:6e:d4:7a:e6:45:25:3a:6f:9f:1a:27:61 +# SHA256 Fingerprint: 62:dd:0b:e9:b9:f5:0a:16:3e:a0:f8:e7:5c:05:3b:1e:ca:57:ea:55:c8:68:8f:64:7c:68:81:f2:c8:35:7b:95 +-----BEGIN CERTIFICATE----- +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 +-----END CERTIFICATE----- + +# Issuer: CN=SecureTrust CA O=SecureTrust Corporation +# Subject: CN=SecureTrust CA O=SecureTrust Corporation +# Label: "SecureTrust CA" +# Serial: 17199774589125277788362757014266862032 +# MD5 Fingerprint: dc:32:c3:a7:6d:25:57:c7:68:09:9d:ea:2d:a9:a2:d1 +# SHA1 Fingerprint: 87:82:c6:c3:04:35:3b:cf:d2:96:92:d2:59:3e:7d:44:d9:34:ff:11 +# SHA256 Fingerprint: f1:c1:b5:0a:e5:a2:0d:d8:03:0e:c9:f6:bc:24:82:3d:d3:67:b5:25:57:59:b4:e7:1b:61:fc:e9:f7:37:5d:73 +-----BEGIN CERTIFICATE----- +MIIDuDCCAqCgAwIBAgIQDPCOXAgWpa1Cf/DrJxhZ0DANBgkqhkiG9w0BAQUFADBI +MQswCQYDVQQGEwJVUzEgMB4GA1UEChMXU2VjdXJlVHJ1c3QgQ29ycG9yYXRpb24x +FzAVBgNVBAMTDlNlY3VyZVRydXN0IENBMB4XDTA2MTEwNzE5MzExOFoXDTI5MTIz +MTE5NDA1NVowSDELMAkGA1UEBhMCVVMxIDAeBgNVBAoTF1NlY3VyZVRydXN0IENv +cnBvcmF0aW9uMRcwFQYDVQQDEw5TZWN1cmVUcnVzdCBDQTCCASIwDQYJKoZIhvcN +AQEBBQADggEPADCCAQoCggEBAKukgeWVzfX2FI7CT8rU4niVWJxB4Q2ZQCQXOZEz +Zum+4YOvYlyJ0fwkW2Gz4BERQRwdbvC4u/jep4G6pkjGnx29vo6pQT64lO0pGtSO +0gMdA+9tDWccV9cGrcrI9f4Or2YlSASWC12juhbDCE/RRvgUXPLIXgGZbf2IzIao +wW8xQmxSPmjL8xk037uHGFaAJsTQ3MBv396gwpEWoGQRS0S8Hvbn+mPeZqx2pHGj +7DaUaHp3pLHnDi+BeuK1cobvomuL8A/b01k/unK8RCSc43Oz969XL0Imnal0ugBS +8kvNU3xHCzaFDmapCJcWNFfBZveA4+1wVMeT4C4oFVmHursCAwEAAaOBnTCBmjAT +BgkrBgEEAYI3FAIEBh4EAEMAQTALBgNVHQ8EBAMCAYYwDwYDVR0TAQH/BAUwAwEB +/zAdBgNVHQ4EFgQUQjK2FvoE/f5dS3rD/fdMQB1aQ68wNAYDVR0fBC0wKzApoCeg +JYYjaHR0cDovL2NybC5zZWN1cmV0cnVzdC5jb20vU1RDQS5jcmwwEAYJKwYBBAGC +NxUBBAMCAQAwDQYJKoZIhvcNAQEFBQADggEBADDtT0rhWDpSclu1pqNlGKa7UTt3 +6Z3q059c4EVlew3KW+JwULKUBRSuSceNQQcSc5R+DCMh/bwQf2AQWnL1mA6s7Ll/ +3XpvXdMc9P+IBWlCqQVxyLesJugutIxq/3HcuLHfmbx8IVQr5Fiiu1cprp6poxkm +D5kuCLDv/WnPmRoJjeOnnyvJNjR7JLN4TJUXpAYmHrZkUjZfYGfZnMUFdAvnZyPS +CPyI6a6Lf+Ew9Dd+/cYy2i2eRDAwbO4H3tI0/NL/QPZL9GZGBlSm8jIKYyYwa5vR +3ItHuuG51WLQoqD0ZwV4KWMabwTW+MZMo5qxN7SN5ShLHZ4swrhovO0C7jE= +-----END CERTIFICATE----- + +# Issuer: CN=Secure Global CA O=SecureTrust Corporation +# Subject: CN=Secure Global CA O=SecureTrust Corporation +# Label: "Secure Global CA" +# Serial: 9751836167731051554232119481456978597 +# MD5 Fingerprint: cf:f4:27:0d:d4:ed:dc:65:16:49:6d:3d:da:bf:6e:de +# SHA1 Fingerprint: 3a:44:73:5a:e5:81:90:1f:24:86:61:46:1e:3b:9c:c4:5f:f5:3a:1b +# SHA256 Fingerprint: 42:00:f5:04:3a:c8:59:0e:bb:52:7d:20:9e:d1:50:30:29:fb:cb:d4:1c:a1:b5:06:ec:27:f1:5a:de:7d:ac:69 +-----BEGIN CERTIFICATE----- +MIIDvDCCAqSgAwIBAgIQB1YipOjUiolN9BPI8PjqpTANBgkqhkiG9w0BAQUFADBK +MQswCQYDVQQGEwJVUzEgMB4GA1UEChMXU2VjdXJlVHJ1c3QgQ29ycG9yYXRpb24x +GTAXBgNVBAMTEFNlY3VyZSBHbG9iYWwgQ0EwHhcNMDYxMTA3MTk0MjI4WhcNMjkx +MjMxMTk1MjA2WjBKMQswCQYDVQQGEwJVUzEgMB4GA1UEChMXU2VjdXJlVHJ1c3Qg +Q29ycG9yYXRpb24xGTAXBgNVBAMTEFNlY3VyZSBHbG9iYWwgQ0EwggEiMA0GCSqG +SIb3DQEBAQUAA4IBDwAwggEKAoIBAQCvNS7YrGxVaQZx5RNoJLNP2MwhR/jxYDiJ +iQPpvepeRlMJ3Fz1Wuj3RSoC6zFh1ykzTM7HfAo3fg+6MpjhHZevj8fcyTiW89sa +/FHtaMbQbqR8JNGuQsiWUGMu4P51/pinX0kuleM5M2SOHqRfkNJnPLLZ/kG5VacJ +jnIFHovdRIWCQtBJwB1g8NEXLJXr9qXBkqPFwqcIYA1gBBCWeZ4WNOaptvolRTnI +HmX5k/Wq8VLcmZg9pYYaDDUz+kulBAYVHDGA76oYa8J719rO+TMg1fW9ajMtgQT7 +sFzUnKPiXB3jqUJ1XnvUd+85VLrJChgbEplJL4hL/VBi0XPnj3pDAgMBAAGjgZ0w +gZowEwYJKwYBBAGCNxQCBAYeBABDAEEwCwYDVR0PBAQDAgGGMA8GA1UdEwEB/wQF +MAMBAf8wHQYDVR0OBBYEFK9EBMJBfkiD2045AuzshHrmzsmkMDQGA1UdHwQtMCsw +KaAnoCWGI2h0dHA6Ly9jcmwuc2VjdXJldHJ1c3QuY29tL1NHQ0EuY3JsMBAGCSsG +AQQBgjcVAQQDAgEAMA0GCSqGSIb3DQEBBQUAA4IBAQBjGghAfaReUw132HquHw0L +URYD7xh8yOOvaliTFGCRsoTciE6+OYo68+aCiV0BN7OrJKQVDpI1WkpEXk5X+nXO +H0jOZvQ8QCaSmGwb7iRGDBezUqXbpZGRzzfTb+cnCDpOGR86p1hcF895P4vkp9Mm +I50mD1hp/Ed+stCNi5O/KU9DaXR2Z0vPB4zmAve14bRDtUstFJ/53CYNv6ZHdAbY +iNE6KTCEztI5gGIbqMdXSbxqVVFnFUq+NQfk1XWYN3kwFNspnWzFacxHVaIw98xc +f8LDmBxrThaA63p4ZUWiABqvDA1VZDRIuJK58bRQKfJPIx/abKwfROHdI3hRW8cW +-----END CERTIFICATE----- + +# Issuer: CN=COMODO Certification Authority O=COMODO CA Limited +# Subject: CN=COMODO Certification Authority O=COMODO CA Limited +# Label: "COMODO Certification Authority" +# Serial: 104350513648249232941998508985834464573 +# MD5 Fingerprint: 5c:48:dc:f7:42:72:ec:56:94:6d:1c:cc:71:35:80:75 +# SHA1 Fingerprint: 66:31:bf:9e:f7:4f:9e:b6:c9:d5:a6:0c:ba:6a:be:d1:f7:bd:ef:7b +# SHA256 Fingerprint: 0c:2c:d6:3d:f7:80:6f:a3:99:ed:e8:09:11:6b:57:5b:f8:79:89:f0:65:18:f9:80:8c:86:05:03:17:8b:af:66 +-----BEGIN CERTIFICATE----- +MIIEHTCCAwWgAwIBAgIQToEtioJl4AsC7j41AkblPTANBgkqhkiG9w0BAQUFADCB +gTELMAkGA1UEBhMCR0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4G +A1UEBxMHU2FsZm9yZDEaMBgGA1UEChMRQ09NT0RPIENBIExpbWl0ZWQxJzAlBgNV +BAMTHkNPTU9ETyBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0wNjEyMDEwMDAw +MDBaFw0yOTEyMzEyMzU5NTlaMIGBMQswCQYDVQQGEwJHQjEbMBkGA1UECBMSR3Jl +YXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHEwdTYWxmb3JkMRowGAYDVQQKExFDT01P +RE8gQ0EgTGltaXRlZDEnMCUGA1UEAxMeQ09NT0RPIENlcnRpZmljYXRpb24gQXV0 +aG9yaXR5MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA0ECLi3LjkRv3 +UcEbVASY06m/weaKXTuH+7uIzg3jLz8GlvCiKVCZrts7oVewdFFxze1CkU1B/qnI +2GqGd0S7WWaXUF601CxwRM/aN5VCaTwwxHGzUvAhTaHYujl8HJ6jJJ3ygxaYqhZ8 +Q5sVW7euNJH+1GImGEaaP+vB+fGQV+useg2L23IwambV4EajcNxo2f8ESIl33rXp ++2dtQem8Ob0y2WIC8bGoPW43nOIv4tOiJovGuFVDiOEjPqXSJDlqR6sA1KGzqSX+ +DT+nHbrTUcELpNqsOO9VUCQFZUaTNE8tja3G1CEZ0o7KBWFxB3NH5YoZEr0ETc5O +nKVIrLsm9wIDAQABo4GOMIGLMB0GA1UdDgQWBBQLWOWLxkwVN6RAqTCpIb5HNlpW +/zAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zBJBgNVHR8EQjBAMD6g +PKA6hjhodHRwOi8vY3JsLmNvbW9kb2NhLmNvbS9DT01PRE9DZXJ0aWZpY2F0aW9u +QXV0aG9yaXR5LmNybDANBgkqhkiG9w0BAQUFAAOCAQEAPpiem/Yb6dc5t3iuHXIY +SdOH5EOC6z/JqvWote9VfCFSZfnVDeFs9D6Mk3ORLgLETgdxb8CPOGEIqB6BCsAv +IC9Bi5HcSEW88cbeunZrM8gALTFGTO3nnc+IlP8zwFboJIYmuNg4ON8qa90SzMc/ +RxdMosIGlgnW2/4/PEZB31jiVg88O8EckzXZOFKs7sjsLjBOlDW0JB9LeGna8gI4 +zJVSk/BwJVmcIGfE7vmLV2H0knZ9P4SNVbfo5azV8fUZVqZa+5Acr5Pr5RzUZ5dd +BA6+C4OmF4O5MBKgxTMVBbkN+8cFduPYSo38NBejxiEovjBFMR7HeL5YYTisO+IB +ZQ== +-----END CERTIFICATE----- + +# Issuer: CN=COMODO ECC Certification Authority O=COMODO CA Limited +# Subject: CN=COMODO ECC Certification Authority O=COMODO CA Limited +# Label: "COMODO ECC Certification Authority" +# Serial: 41578283867086692638256921589707938090 +# MD5 Fingerprint: 7c:62:ff:74:9d:31:53:5e:68:4a:d5:78:aa:1e:bf:23 +# SHA1 Fingerprint: 9f:74:4e:9f:2b:4d:ba:ec:0f:31:2c:50:b6:56:3b:8e:2d:93:c3:11 +# SHA256 Fingerprint: 17:93:92:7a:06:14:54:97:89:ad:ce:2f:8f:34:f7:f0:b6:6d:0f:3a:e3:a3:b8:4d:21:ec:15:db:ba:4f:ad:c7 +-----BEGIN CERTIFICATE----- +MIICiTCCAg+gAwIBAgIQH0evqmIAcFBUTAGem2OZKjAKBggqhkjOPQQDAzCBhTEL +MAkGA1UEBhMCR0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UE +BxMHU2FsZm9yZDEaMBgGA1UEChMRQ09NT0RPIENBIExpbWl0ZWQxKzApBgNVBAMT +IkNPTU9ETyBFQ0MgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMDgwMzA2MDAw +MDAwWhcNMzgwMTE4MjM1OTU5WjCBhTELMAkGA1UEBhMCR0IxGzAZBgNVBAgTEkdy +ZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UEBxMHU2FsZm9yZDEaMBgGA1UEChMRQ09N +T0RPIENBIExpbWl0ZWQxKzApBgNVBAMTIkNPTU9ETyBFQ0MgQ2VydGlmaWNhdGlv +biBBdXRob3JpdHkwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAAQDR3svdcmCFYX7deSR +FtSrYpn1PlILBs5BAH+X4QokPB0BBO490o0JlwzgdeT6+3eKKvUDYEs2ixYjFq0J +cfRK9ChQtP6IHG4/bC8vCVlbpVsLM5niwz2J+Wos77LTBumjQjBAMB0GA1UdDgQW +BBR1cacZSBm8nZ3qQUfflMRId5nTeTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/ +BAUwAwEB/zAKBggqhkjOPQQDAwNoADBlAjEA7wNbeqy3eApyt4jf/7VGFAkK+qDm +fQjGGoe9GKhzvSbKYAydzpmfz1wPMOG+FDHqAjAU9JM8SaczepBGR7NjfRObTrdv +GDeAU/7dIOA1mjbRxwG55tzd8/8dLDoWV9mSOdY= +-----END CERTIFICATE----- + +# Issuer: CN=Certigna O=Dhimyotis +# Subject: CN=Certigna O=Dhimyotis +# Label: "Certigna" +# Serial: 18364802974209362175 +# MD5 Fingerprint: ab:57:a6:5b:7d:42:82:19:b5:d8:58:26:28:5e:fd:ff +# SHA1 Fingerprint: b1:2e:13:63:45:86:a4:6f:1a:b2:60:68:37:58:2d:c4:ac:fd:94:97 +# SHA256 Fingerprint: e3:b6:a2:db:2e:d7:ce:48:84:2f:7a:c5:32:41:c7:b7:1d:54:14:4b:fb:40:c1:1f:3f:1d:0b:42:f5:ee:a1:2d +-----BEGIN CERTIFICATE----- +MIIDqDCCApCgAwIBAgIJAP7c4wEPyUj/MA0GCSqGSIb3DQEBBQUAMDQxCzAJBgNV +BAYTAkZSMRIwEAYDVQQKDAlEaGlteW90aXMxETAPBgNVBAMMCENlcnRpZ25hMB4X +DTA3MDYyOTE1MTMwNVoXDTI3MDYyOTE1MTMwNVowNDELMAkGA1UEBhMCRlIxEjAQ +BgNVBAoMCURoaW15b3RpczERMA8GA1UEAwwIQ2VydGlnbmEwggEiMA0GCSqGSIb3 +DQEBAQUAA4IBDwAwggEKAoIBAQDIaPHJ1tazNHUmgh7stL7qXOEm7RFHYeGifBZ4 +QCHkYJ5ayGPhxLGWkv8YbWkj4Sti993iNi+RB7lIzw7sebYs5zRLcAglozyHGxny +gQcPOJAZ0xH+hrTy0V4eHpbNgGzOOzGTtvKg0KmVEn2lmsxryIRWijOp5yIVUxbw +zBfsV1/pogqYCd7jX5xv3EjjhQsVWqa6n6xI4wmy9/Qy3l40vhx4XUJbzg4ij02Q +130yGLMLLGq/jj8UEYkgDncUtT2UCIf3JR7VsmAA7G8qKCVuKj4YYxclPz5EIBb2 +JsglrgVKtOdjLPOMFlN+XPsRGgjBRmKfIrjxwo1p3Po6WAbfAgMBAAGjgbwwgbkw +DwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUGu3+QTmQtCRZvgHyUtVF9lo53BEw +ZAYDVR0jBF0wW4AUGu3+QTmQtCRZvgHyUtVF9lo53BGhOKQ2MDQxCzAJBgNVBAYT +AkZSMRIwEAYDVQQKDAlEaGlteW90aXMxETAPBgNVBAMMCENlcnRpZ25hggkA/tzj +AQ/JSP8wDgYDVR0PAQH/BAQDAgEGMBEGCWCGSAGG+EIBAQQEAwIABzANBgkqhkiG +9w0BAQUFAAOCAQEAhQMeknH2Qq/ho2Ge6/PAD/Kl1NqV5ta+aDY9fm4fTIrv0Q8h +bV6lUmPOEvjvKtpv6zf+EwLHyzs+ImvaYS5/1HI93TDhHkxAGYwP15zRgzB7mFnc +fca5DClMoTOi62c6ZYTTluLtdkVwj7Ur3vkj1kluPBS1xp81HlDQwY9qcEQCYsuu +HWhBp6pX6FOqB9IG9tUUBguRA3UsbHK1YZWaDYu5Def131TN3ubY1gkIl2PlwS6w +t0QmwCbAr1UwnjvVNioZBPRcHv/PLLf/0P2HQBHVESO7SMAhqaQoLf0V+LBOK/Qw +WyH8EZE0vkHve52Xdf+XlcCWWC/qu0bXu+TZLg== +-----END CERTIFICATE----- + +# Issuer: O=Chunghwa Telecom Co., Ltd. OU=ePKI Root Certification Authority +# Subject: O=Chunghwa Telecom Co., Ltd. OU=ePKI Root Certification Authority +# Label: "ePKI Root Certification Authority" +# Serial: 28956088682735189655030529057352760477 +# MD5 Fingerprint: 1b:2e:00:ca:26:06:90:3d:ad:fe:6f:15:68:d3:6b:b3 +# SHA1 Fingerprint: 67:65:0d:f1:7e:8e:7e:5b:82:40:a4:f4:56:4b:cf:e2:3d:69:c6:f0 +# SHA256 Fingerprint: c0:a6:f4:dc:63:a2:4b:fd:cf:54:ef:2a:6a:08:2a:0a:72:de:35:80:3e:2f:f5:ff:52:7a:e5:d8:72:06:df:d5 +-----BEGIN CERTIFICATE----- +MIIFsDCCA5igAwIBAgIQFci9ZUdcr7iXAF7kBtK8nTANBgkqhkiG9w0BAQUFADBe +MQswCQYDVQQGEwJUVzEjMCEGA1UECgwaQ2h1bmdod2EgVGVsZWNvbSBDby4sIEx0 +ZC4xKjAoBgNVBAsMIWVQS0kgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAe +Fw0wNDEyMjAwMjMxMjdaFw0zNDEyMjAwMjMxMjdaMF4xCzAJBgNVBAYTAlRXMSMw +IQYDVQQKDBpDaHVuZ2h3YSBUZWxlY29tIENvLiwgTHRkLjEqMCgGA1UECwwhZVBL +SSBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIICIjANBgkqhkiG9w0BAQEF +AAOCAg8AMIICCgKCAgEA4SUP7o3biDN1Z82tH306Tm2d0y8U82N0ywEhajfqhFAH +SyZbCUNsIZ5qyNUD9WBpj8zwIuQf5/dqIjG3LBXy4P4AakP/h2XGtRrBp0xtInAh +ijHyl3SJCRImHJ7K2RKilTza6We/CKBk49ZCt0Xvl/T29de1ShUCWH2YWEtgvM3X +DZoTM1PRYfl61dd4s5oz9wCGzh1NlDivqOx4UXCKXBCDUSH3ET00hl7lSM2XgYI1 +TBnsZfZrxQWh7kcT1rMhJ5QQCtkkO7q+RBNGMD+XPNjX12ruOzjjK9SXDrkb5wdJ +fzcq+Xd4z1TtW0ado4AOkUPB1ltfFLqfpo0kR0BZv3I4sjZsN/+Z0V0OWQqraffA +sgRFelQArr5T9rXn4fg8ozHSqf4hUmTFpmfwdQcGlBSBVcYn5AGPF8Fqcde+S/uU +WH1+ETOxQvdibBjWzwloPn9s9h6PYq2lY9sJpx8iQkEeb5mKPtf5P0B6ebClAZLS +nT0IFaUQAS2zMnaolQ2zepr7BxB4EW/hj8e6DyUadCrlHJhBmd8hh+iVBmoKs2pH +dmX2Os+PYhcZewoozRrSgx4hxyy/vv9haLdnG7t4TY3OZ+XkwY63I2binZB1NJip +NiuKmpS5nezMirH4JYlcWrYvjB9teSSnUmjDhDXiZo1jDiVN1Rmy5nk3pyKdVDEC +AwEAAaNqMGgwHQYDVR0OBBYEFB4M97Zn8uGSJglFwFU5Lnc/QkqiMAwGA1UdEwQF +MAMBAf8wOQYEZyoHAAQxMC8wLQIBADAJBgUrDgMCGgUAMAcGBWcqAwAABBRFsMLH +ClZ87lt4DJX5GFPBphzYEDANBgkqhkiG9w0BAQUFAAOCAgEACbODU1kBPpVJufGB +uvl2ICO1J2B01GqZNF5sAFPZn/KmsSQHRGoqxqWOeBLoR9lYGxMqXnmbnwoqZ6Yl +PwZpVnPDimZI+ymBV3QGypzqKOg4ZyYr8dW1P2WT+DZdjo2NQCCHGervJ8A9tDkP +JXtoUHRVnAxZfVo9QZQlUgjgRywVMRnVvwdVxrsStZf0X4OFunHB2WyBEXYKCrC/ +gpf36j36+uwtqSiUO1bd0lEursC9CBWMd1I0ltabrNMdjmEPNXubrjlpC2JgQCA2 +j6/7Nu4tCEoduL+bXPjqpRugc6bY+G7gMwRfaKonh+3ZwZCc7b3jajWvY9+rGNm6 +5ulK6lCKD2GTHuItGeIwlDWSXQ62B68ZgI9HkFFLLk3dheLSClIKF5r8GrBQAuUB +o2M3IUxExJtRmREOc5wGj1QupyheRDmHVi03vYVElOEMSyycw5KFNGHLD7ibSkNS +/jQ6fbjpKdx2qcgw+BRxgMYeNkh0IkFch4LoGHGLQYlE535YW6i4jRPpp2zDR+2z +Gp1iro2C6pSe3VkQw63d4k3jMdXH7OjysP6SHhYKGvzZ8/gntsm+HbRsZJB/9OTE +W9c3rkIO3aQab3yIVMUWbuF6aC74Or8NpDyJO3inTmODBCEIZ43ygknQW/2xzQ+D +hNQ+IIX3Sj0rnP0qCglN6oH4EZw= +-----END CERTIFICATE----- + +# Issuer: O=certSIGN OU=certSIGN ROOT CA +# Subject: O=certSIGN OU=certSIGN ROOT CA +# Label: "certSIGN ROOT CA" +# Serial: 35210227249154 +# MD5 Fingerprint: 18:98:c0:d6:e9:3a:fc:f9:b0:f5:0c:f7:4b:01:44:17 +# SHA1 Fingerprint: fa:b7:ee:36:97:26:62:fb:2d:b0:2a:f6:bf:03:fd:e8:7c:4b:2f:9b +# SHA256 Fingerprint: ea:a9:62:c4:fa:4a:6b:af:eb:e4:15:19:6d:35:1c:cd:88:8d:4f:53:f3:fa:8a:e6:d7:c4:66:a9:4e:60:42:bb +-----BEGIN CERTIFICATE----- +MIIDODCCAiCgAwIBAgIGIAYFFnACMA0GCSqGSIb3DQEBBQUAMDsxCzAJBgNVBAYT +AlJPMREwDwYDVQQKEwhjZXJ0U0lHTjEZMBcGA1UECxMQY2VydFNJR04gUk9PVCBD +QTAeFw0wNjA3MDQxNzIwMDRaFw0zMTA3MDQxNzIwMDRaMDsxCzAJBgNVBAYTAlJP +MREwDwYDVQQKEwhjZXJ0U0lHTjEZMBcGA1UECxMQY2VydFNJR04gUk9PVCBDQTCC +ASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALczuX7IJUqOtdu0KBuqV5Do +0SLTZLrTk+jUrIZhQGpgV2hUhE28alQCBf/fm5oqrl0Hj0rDKH/v+yv6efHHrfAQ +UySQi2bJqIirr1qjAOm+ukbuW3N7LBeCgV5iLKECZbO9xSsAfsT8AzNXDe3i+s5d +RdY4zTW2ssHQnIFKquSyAVwdj1+ZxLGt24gh65AIgoDzMKND5pCCrlUoSe1b16kQ +OA7+j0xbm0bqQfWwCHTD0IgztnzXdN/chNFDDnU5oSVAKOp4yw4sLjmdjItuFhwv +JoIQ4uNllAoEwF73XVv4EOLQunpL+943AAAaWyjj0pxzPjKHmKHJUS/X3qwzs08C +AwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAcYwHQYDVR0O +BBYEFOCMm9slSbPxfIbWskKHC9BroNnkMA0GCSqGSIb3DQEBBQUAA4IBAQA+0hyJ +LjX8+HXd5n9liPRyTMks1zJO890ZeUe9jjtbkw9QSSQTaxQGcu8J06Gh40CEyecY +MnQ8SG4Pn0vU9x7Tk4ZkVJdjclDVVc/6IJMCopvDI5NOFlV2oHB5bc0hH88vLbwZ +44gx+FkagQnIl6Z0x2DEW8xXjrJ1/RsCCdtZb3KTafcxQdaIOL+Hsr0Wefmq5L6I +Jd1hJyMctTEHBDa0GpC9oHRxUIltvBTjD4au8as+x6AJzKNI0eDbZOeStc+vckNw +i/nDhDwTqn6Sm1dTk/pwwpEOMfmbZ13pljheX7NzTogVZ96edhBiIL5VaZVDADlN +9u6wWk5JRFRYX0KD +-----END CERTIFICATE----- + +# Issuer: CN=NetLock Arany (Class Gold) F\u0151tan\xfas\xedtv\xe1ny O=NetLock Kft. OU=Tan\xfas\xedtv\xe1nykiad\xf3k (Certification Services) +# Subject: CN=NetLock Arany (Class Gold) F\u0151tan\xfas\xedtv\xe1ny O=NetLock Kft. OU=Tan\xfas\xedtv\xe1nykiad\xf3k (Certification Services) +# Label: "NetLock Arany (Class Gold) F\u0151tan\xfas\xedtv\xe1ny" +# Serial: 80544274841616 +# MD5 Fingerprint: c5:a1:b7:ff:73:dd:d6:d7:34:32:18:df:fc:3c:ad:88 +# SHA1 Fingerprint: 06:08:3f:59:3f:15:a1:04:a0:69:a4:6b:a9:03:d0:06:b7:97:09:91 +# SHA256 Fingerprint: 6c:61:da:c3:a2:de:f0:31:50:6b:e0:36:d2:a6:fe:40:19:94:fb:d1:3d:f9:c8:d4:66:59:92:74:c4:46:ec:98 +-----BEGIN CERTIFICATE----- +MIIEFTCCAv2gAwIBAgIGSUEs5AAQMA0GCSqGSIb3DQEBCwUAMIGnMQswCQYDVQQG +EwJIVTERMA8GA1UEBwwIQnVkYXBlc3QxFTATBgNVBAoMDE5ldExvY2sgS2Z0LjE3 +MDUGA1UECwwuVGFuw7pzw610dsOhbnlraWFkw7NrIChDZXJ0aWZpY2F0aW9uIFNl +cnZpY2VzKTE1MDMGA1UEAwwsTmV0TG9jayBBcmFueSAoQ2xhc3MgR29sZCkgRsWR +dGFuw7pzw610dsOhbnkwHhcNMDgxMjExMTUwODIxWhcNMjgxMjA2MTUwODIxWjCB +pzELMAkGA1UEBhMCSFUxETAPBgNVBAcMCEJ1ZGFwZXN0MRUwEwYDVQQKDAxOZXRM +b2NrIEtmdC4xNzA1BgNVBAsMLlRhbsO6c8OtdHbDoW55a2lhZMOzayAoQ2VydGlm +aWNhdGlvbiBTZXJ2aWNlcykxNTAzBgNVBAMMLE5ldExvY2sgQXJhbnkgKENsYXNz +IEdvbGQpIEbFkXRhbsO6c8OtdHbDoW55MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A +MIIBCgKCAQEAxCRec75LbRTDofTjl5Bu0jBFHjzuZ9lk4BqKf8owyoPjIMHj9DrT +lF8afFttvzBPhCf2nx9JvMaZCpDyD/V/Q4Q3Y1GLeqVw/HpYzY6b7cNGbIRwXdrz +AZAj/E4wqX7hJ2Pn7WQ8oLjJM2P+FpD/sLj916jAwJRDC7bVWaaeVtAkH3B5r9s5 +VA1lddkVQZQBr17s9o3x/61k/iCa11zr/qYfCGSji3ZVrR47KGAuhyXoqq8fxmRG +ILdwfzzeSNuWU7c5d+Qa4scWhHaXWy+7GRWF+GmF9ZmnqfI0p6m2pgP8b4Y9VHx2 +BJtr+UBdADTHLpl1neWIA6pN+APSQnbAGwIDAKiLo0UwQzASBgNVHRMBAf8ECDAG +AQH/AgEEMA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUzPpnk/C2uNClwB7zU/2M +U9+D15YwDQYJKoZIhvcNAQELBQADggEBAKt/7hwWqZw8UQCgwBEIBaeZ5m8BiFRh +bvG5GK1Krf6BQCOUL/t1fC8oS2IkgYIL9WHxHG64YTjrgfpioTtaYtOUZcTh5m2C ++C8lcLIhJsFyUR+MLMOEkMNaj7rP9KdlpeuY0fsFskZ1FSNqb4VjMIDw1Z4fKRzC +bLBQWV2QWzuoDTDPv31/zvGdg73JRm4gpvlhUbohL3u+pRVjodSVh/GeufOJ8z2F +uLjbvrW5KfnaNwUASZQDhETnv0Mxz3WLJdH0pmT1kvarBes96aULNmLazAZfNou2 +XjG4Kvte9nHfRCaexOYNkbQudZWAUWpLMKawYqGT8ZvYzsRjdT9ZR7E= +-----END CERTIFICATE----- + +# Issuer: CN=Microsec e-Szigno Root CA 2009 O=Microsec Ltd. +# Subject: CN=Microsec e-Szigno Root CA 2009 O=Microsec Ltd. +# Label: "Microsec e-Szigno Root CA 2009" +# Serial: 14014712776195784473 +# MD5 Fingerprint: f8:49:f4:03:bc:44:2d:83:be:48:69:7d:29:64:fc:b1 +# SHA1 Fingerprint: 89:df:74:fe:5c:f4:0f:4a:80:f9:e3:37:7d:54:da:91:e1:01:31:8e +# SHA256 Fingerprint: 3c:5f:81:fe:a5:fa:b8:2c:64:bf:a2:ea:ec:af:cd:e8:e0:77:fc:86:20:a7:ca:e5:37:16:3d:f3:6e:db:f3:78 +-----BEGIN CERTIFICATE----- +MIIECjCCAvKgAwIBAgIJAMJ+QwRORz8ZMA0GCSqGSIb3DQEBCwUAMIGCMQswCQYD +VQQGEwJIVTERMA8GA1UEBwwIQnVkYXBlc3QxFjAUBgNVBAoMDU1pY3Jvc2VjIEx0 +ZC4xJzAlBgNVBAMMHk1pY3Jvc2VjIGUtU3ppZ25vIFJvb3QgQ0EgMjAwOTEfMB0G +CSqGSIb3DQEJARYQaW5mb0BlLXN6aWduby5odTAeFw0wOTA2MTYxMTMwMThaFw0y +OTEyMzAxMTMwMThaMIGCMQswCQYDVQQGEwJIVTERMA8GA1UEBwwIQnVkYXBlc3Qx +FjAUBgNVBAoMDU1pY3Jvc2VjIEx0ZC4xJzAlBgNVBAMMHk1pY3Jvc2VjIGUtU3pp +Z25vIFJvb3QgQ0EgMjAwOTEfMB0GCSqGSIb3DQEJARYQaW5mb0BlLXN6aWduby5o +dTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAOn4j/NjrdqG2KfgQvvP +kd6mJviZpWNwrZuuyjNAfW2WbqEORO7hE52UQlKavXWFdCyoDh2Tthi3jCyoz/tc +cbna7P7ofo/kLx2yqHWH2Leh5TvPmUpG0IMZfcChEhyVbUr02MelTTMuhTlAdX4U +fIASmFDHQWe4oIBhVKZsTh/gnQ4H6cm6M+f+wFUoLAKApxn1ntxVUwOXewdI/5n7 +N4okxFnMUBBjjqqpGrCEGob5X7uxUG6k0QrM1XF+H6cbfPVTbiJfyyvm1HxdrtbC +xkzlBQHZ7Vf8wSN5/PrIJIOV87VqUQHQd9bpEqH5GoP7ghu5sJf0dgYzQ0mg/wu1 ++rUCAwEAAaOBgDB+MA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0G +A1UdDgQWBBTLD8bfQkPMPcu1SCOhGnqmKrs0aDAfBgNVHSMEGDAWgBTLD8bfQkPM +Pcu1SCOhGnqmKrs0aDAbBgNVHREEFDASgRBpbmZvQGUtc3ppZ25vLmh1MA0GCSqG +SIb3DQEBCwUAA4IBAQDJ0Q5eLtXMs3w+y/w9/w0olZMEyL/azXm4Q5DwpL7v8u8h +mLzU1F0G9u5C7DBsoKqpyvGvivo/C3NqPuouQH4frlRheesuCDfXI/OMn74dseGk +ddug4lQUsbocKaQY9hK6ohQU4zE1yED/t+AFdlfBHFny+L/k7SViXITwfn4fs775 +tyERzAMBVnCnEJIeGzSBHq2cGsMEPO0CYdYeBvNfOofyK/FFh+U9rNHHV4S9a67c +2Pm2G2JwCz02yULyMtd6YebS2z3PyKnJm9zbWETXbzivf3jTo60adbocwTZ8jx5t +HMN1Rq41Bab2XD0h7lbwyYIiLXpUq3DDfSJlgnCW +-----END CERTIFICATE----- + +# Issuer: CN=GlobalSign O=GlobalSign OU=GlobalSign Root CA - R3 +# Subject: CN=GlobalSign O=GlobalSign OU=GlobalSign Root CA - R3 +# Label: "GlobalSign Root CA - R3" +# Serial: 4835703278459759426209954 +# MD5 Fingerprint: c5:df:b8:49:ca:05:13:55:ee:2d:ba:1a:c3:3e:b0:28 +# SHA1 Fingerprint: d6:9b:56:11:48:f0:1c:77:c5:45:78:c1:09:26:df:5b:85:69:76:ad +# SHA256 Fingerprint: cb:b5:22:d7:b7:f1:27:ad:6a:01:13:86:5b:df:1c:d4:10:2e:7d:07:59:af:63:5a:7c:f4:72:0d:c9:63:c5:3b +-----BEGIN CERTIFICATE----- +MIIDXzCCAkegAwIBAgILBAAAAAABIVhTCKIwDQYJKoZIhvcNAQELBQAwTDEgMB4G +A1UECxMXR2xvYmFsU2lnbiBSb290IENBIC0gUjMxEzARBgNVBAoTCkdsb2JhbFNp +Z24xEzARBgNVBAMTCkdsb2JhbFNpZ24wHhcNMDkwMzE4MTAwMDAwWhcNMjkwMzE4 +MTAwMDAwWjBMMSAwHgYDVQQLExdHbG9iYWxTaWduIFJvb3QgQ0EgLSBSMzETMBEG +A1UEChMKR2xvYmFsU2lnbjETMBEGA1UEAxMKR2xvYmFsU2lnbjCCASIwDQYJKoZI +hvcNAQEBBQADggEPADCCAQoCggEBAMwldpB5BngiFvXAg7aEyiie/QV2EcWtiHL8 +RgJDx7KKnQRfJMsuS+FggkbhUqsMgUdwbN1k0ev1LKMPgj0MK66X17YUhhB5uzsT +gHeMCOFJ0mpiLx9e+pZo34knlTifBtc+ycsmWQ1z3rDI6SYOgxXG71uL0gRgykmm +KPZpO/bLyCiR5Z2KYVc3rHQU3HTgOu5yLy6c+9C7v/U9AOEGM+iCK65TpjoWc4zd +QQ4gOsC0p6Hpsk+QLjJg6VfLuQSSaGjlOCZgdbKfd/+RFO+uIEn8rUAVSNECMWEZ +XriX7613t2Saer9fwRPvm2L7DWzgVGkWqQPabumDk3F2xmmFghcCAwEAAaNCMEAw +DgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFI/wS3+o +LkUkrk1Q+mOai97i3Ru8MA0GCSqGSIb3DQEBCwUAA4IBAQBLQNvAUKr+yAzv95ZU +RUm7lgAJQayzE4aGKAczymvmdLm6AC2upArT9fHxD4q/c2dKg8dEe3jgr25sbwMp +jjM5RcOO5LlXbKr8EpbsU8Yt5CRsuZRj+9xTaGdWPoO4zzUhw8lo/s7awlOqzJCK +6fBdRoyV3XpYKBovHd7NADdBj+1EbddTKJd+82cEHhXXipa0095MJ6RMG3NzdvQX +mcIfeg7jLQitChws/zyrVQ4PkX4268NXSb7hLi18YIvDQVETI53O9zJrlAGomecs +Mx86OyXShkDOOyyGeMlhLxS67ttVb9+E7gUJTb0o2HLO02JQZR7rkpeDMdmztcpH +WD9f +-----END CERTIFICATE----- + +# Issuer: CN=Izenpe.com O=IZENPE S.A. +# Subject: CN=Izenpe.com O=IZENPE S.A. +# Label: "Izenpe.com" +# Serial: 917563065490389241595536686991402621 +# MD5 Fingerprint: a6:b0:cd:85:80:da:5c:50:34:a3:39:90:2f:55:67:73 +# SHA1 Fingerprint: 2f:78:3d:25:52:18:a7:4a:65:39:71:b5:2c:a2:9c:45:15:6f:e9:19 +# SHA256 Fingerprint: 25:30:cc:8e:98:32:15:02:ba:d9:6f:9b:1f:ba:1b:09:9e:2d:29:9e:0f:45:48:bb:91:4f:36:3b:c0:d4:53:1f +-----BEGIN CERTIFICATE----- +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 +-----END CERTIFICATE----- + +# Issuer: CN=Go Daddy Root Certificate Authority - G2 O=GoDaddy.com, Inc. +# Subject: CN=Go Daddy Root Certificate Authority - G2 O=GoDaddy.com, Inc. +# Label: "Go Daddy Root Certificate Authority - G2" +# Serial: 0 +# MD5 Fingerprint: 80:3a:bc:22:c1:e6:fb:8d:9b:3b:27:4a:32:1b:9a:01 +# SHA1 Fingerprint: 47:be:ab:c9:22:ea:e8:0e:78:78:34:62:a7:9f:45:c2:54:fd:e6:8b +# SHA256 Fingerprint: 45:14:0b:32:47:eb:9c:c8:c5:b4:f0:d7:b5:30:91:f7:32:92:08:9e:6e:5a:63:e2:74:9d:d3:ac:a9:19:8e:da +-----BEGIN CERTIFICATE----- +MIIDxTCCAq2gAwIBAgIBADANBgkqhkiG9w0BAQsFADCBgzELMAkGA1UEBhMCVVMx +EDAOBgNVBAgTB0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUxGjAYBgNVBAoT +EUdvRGFkZHkuY29tLCBJbmMuMTEwLwYDVQQDEyhHbyBEYWRkeSBSb290IENlcnRp +ZmljYXRlIEF1dGhvcml0eSAtIEcyMB4XDTA5MDkwMTAwMDAwMFoXDTM3MTIzMTIz +NTk1OVowgYMxCzAJBgNVBAYTAlVTMRAwDgYDVQQIEwdBcml6b25hMRMwEQYDVQQH +EwpTY290dHNkYWxlMRowGAYDVQQKExFHb0RhZGR5LmNvbSwgSW5jLjExMC8GA1UE +AxMoR28gRGFkZHkgUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkgLSBHMjCCASIw +DQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAL9xYgjx+lk09xvJGKP3gElY6SKD +E6bFIEMBO4Tx5oVJnyfq9oQbTqC023CYxzIBsQU+B07u9PpPL1kwIuerGVZr4oAH +/PMWdYA5UXvl+TW2dE6pjYIT5LY/qQOD+qK+ihVqf94Lw7YZFAXK6sOoBJQ7Rnwy +DfMAZiLIjWltNowRGLfTshxgtDj6AozO091GB94KPutdfMh8+7ArU6SSYmlRJQVh +GkSBjCypQ5Yj36w6gZoOKcUcqeldHraenjAKOc7xiID7S13MMuyFYkMlNAJWJwGR +tDtwKj9useiciAF9n9T521NtYJ2/LOdYq7hfRvzOxBsDPAnrSTFcaUaz4EcCAwEA +AaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYE +FDqahQcQZyi27/a9BUFuIMGU2g/eMA0GCSqGSIb3DQEBCwUAA4IBAQCZ21151fmX +WWcDYfF+OwYxdS2hII5PZYe096acvNjpL9DbWu7PdIxztDhC2gV7+AJ1uP2lsdeu +9tfeE8tTEH6KRtGX+rcuKxGrkLAngPnon1rpN5+r5N9ss4UXnT3ZJE95kTXWXwTr +gIOrmgIttRD02JDHBHNA7XIloKmf7J6raBKZV8aPEjoJpL1E/QYVN8Gb5DKj7Tjo +2GTzLH4U/ALqn83/B2gX2yKQOC16jdFU8WnjXzPKej17CuPKf1855eJ1usV2GDPO +LPAvTK33sefOT6jEm0pUBsV/fdUID+Ic/n4XuKxe9tQWskMJDE32p2u0mYRlynqI +4uJEvlz36hz1 +-----END CERTIFICATE----- + +# Issuer: CN=Starfield Root Certificate Authority - G2 O=Starfield Technologies, Inc. +# Subject: CN=Starfield Root Certificate Authority - G2 O=Starfield Technologies, Inc. +# Label: "Starfield Root Certificate Authority - G2" +# Serial: 0 +# MD5 Fingerprint: d6:39:81:c6:52:7e:96:69:fc:fc:ca:66:ed:05:f2:96 +# SHA1 Fingerprint: b5:1c:06:7c:ee:2b:0c:3d:f8:55:ab:2d:92:f4:fe:39:d4:e7:0f:0e +# SHA256 Fingerprint: 2c:e1:cb:0b:f9:d2:f9:e1:02:99:3f:be:21:51:52:c3:b2:dd:0c:ab:de:1c:68:e5:31:9b:83:91:54:db:b7:f5 +-----BEGIN CERTIFICATE----- +MIID3TCCAsWgAwIBAgIBADANBgkqhkiG9w0BAQsFADCBjzELMAkGA1UEBhMCVVMx +EDAOBgNVBAgTB0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUxJTAjBgNVBAoT +HFN0YXJmaWVsZCBUZWNobm9sb2dpZXMsIEluYy4xMjAwBgNVBAMTKVN0YXJmaWVs +ZCBSb290IENlcnRpZmljYXRlIEF1dGhvcml0eSAtIEcyMB4XDTA5MDkwMTAwMDAw +MFoXDTM3MTIzMTIzNTk1OVowgY8xCzAJBgNVBAYTAlVTMRAwDgYDVQQIEwdBcml6 +b25hMRMwEQYDVQQHEwpTY290dHNkYWxlMSUwIwYDVQQKExxTdGFyZmllbGQgVGVj +aG5vbG9naWVzLCBJbmMuMTIwMAYDVQQDEylTdGFyZmllbGQgUm9vdCBDZXJ0aWZp +Y2F0ZSBBdXRob3JpdHkgLSBHMjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC +ggEBAL3twQP89o/8ArFvW59I2Z154qK3A2FWGMNHttfKPTUuiUP3oWmb3ooa/RMg +nLRJdzIpVv257IzdIvpy3Cdhl+72WoTsbhm5iSzchFvVdPtrX8WJpRBSiUZV9Lh1 +HOZ/5FSuS/hVclcCGfgXcVnrHigHdMWdSL5stPSksPNkN3mSwOxGXn/hbVNMYq/N +Hwtjuzqd+/x5AJhhdM8mgkBj87JyahkNmcrUDnXMN/uLicFZ8WJ/X7NfZTD4p7dN +dloedl40wOiWVpmKs/B/pM293DIxfJHP4F8R+GuqSVzRmZTRouNjWwl2tVZi4Ut0 +HZbUJtQIBFnQmA4O5t78w+wfkPECAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAO +BgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFHwMMh+n2TB/xH1oo2Kooc6rB1snMA0G +CSqGSIb3DQEBCwUAA4IBAQARWfolTwNvlJk7mh+ChTnUdgWUXuEok21iXQnCoKjU +sHU48TRqneSfioYmUeYs0cYtbpUgSpIB7LiKZ3sx4mcujJUDJi5DnUox9g61DLu3 +4jd/IroAow57UvtruzvE03lRTs2Q9GcHGcg8RnoNAX3FWOdt5oUwF5okxBDgBPfg +8n/Uqgr/Qh037ZTlZFkSIHc40zI+OIF1lnP6aI+xy84fxez6nH7PfrHxBy22/L/K +pL/QlwVKvOoYKAKQvVR4CSFx09F9HdkWsKlhPdAKACL8x3vLCWRFCztAgfd9fDL1 +mMpYjn0q7pBZc2T5NnReJaH1ZgUufzkVqSr7UIuOhWn0 +-----END CERTIFICATE----- + +# Issuer: CN=Starfield Services Root Certificate Authority - G2 O=Starfield Technologies, Inc. +# Subject: CN=Starfield Services Root Certificate Authority - G2 O=Starfield Technologies, Inc. +# Label: "Starfield Services Root Certificate Authority - G2" +# Serial: 0 +# MD5 Fingerprint: 17:35:74:af:7b:61:1c:eb:f4:f9:3c:e2:ee:40:f9:a2 +# SHA1 Fingerprint: 92:5a:8f:8d:2c:6d:04:e0:66:5f:59:6a:ff:22:d8:63:e8:25:6f:3f +# SHA256 Fingerprint: 56:8d:69:05:a2:c8:87:08:a4:b3:02:51:90:ed:cf:ed:b1:97:4a:60:6a:13:c6:e5:29:0f:cb:2a:e6:3e:da:b5 +-----BEGIN CERTIFICATE----- +MIID7zCCAtegAwIBAgIBADANBgkqhkiG9w0BAQsFADCBmDELMAkGA1UEBhMCVVMx +EDAOBgNVBAgTB0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUxJTAjBgNVBAoT +HFN0YXJmaWVsZCBUZWNobm9sb2dpZXMsIEluYy4xOzA5BgNVBAMTMlN0YXJmaWVs +ZCBTZXJ2aWNlcyBSb290IENlcnRpZmljYXRlIEF1dGhvcml0eSAtIEcyMB4XDTA5 +MDkwMTAwMDAwMFoXDTM3MTIzMTIzNTk1OVowgZgxCzAJBgNVBAYTAlVTMRAwDgYD +VQQIEwdBcml6b25hMRMwEQYDVQQHEwpTY290dHNkYWxlMSUwIwYDVQQKExxTdGFy +ZmllbGQgVGVjaG5vbG9naWVzLCBJbmMuMTswOQYDVQQDEzJTdGFyZmllbGQgU2Vy +dmljZXMgUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkgLSBHMjCCASIwDQYJKoZI +hvcNAQEBBQADggEPADCCAQoCggEBANUMOsQq+U7i9b4Zl1+OiFOxHz/Lz58gE20p +OsgPfTz3a3Y4Y9k2YKibXlwAgLIvWX/2h/klQ4bnaRtSmpDhcePYLQ1Ob/bISdm2 +8xpWriu2dBTrz/sm4xq6HZYuajtYlIlHVv8loJNwU4PahHQUw2eeBGg6345AWh1K +Ts9DkTvnVtYAcMtS7nt9rjrnvDH5RfbCYM8TWQIrgMw0R9+53pBlbQLPLJGmpufe +hRhJfGZOozptqbXuNC66DQO4M99H67FrjSXZm86B0UVGMpZwh94CDklDhbZsc7tk +6mFBrMnUVN+HL8cisibMn1lUaJ/8viovxFUcdUBgF4UCVTmLfwUCAwEAAaNCMEAw +DwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFJxfAN+q +AdcwKziIorhtSpzyEZGDMA0GCSqGSIb3DQEBCwUAA4IBAQBLNqaEd2ndOxmfZyMI +bw5hyf2E3F/YNoHN2BtBLZ9g3ccaaNnRbobhiCPPE95Dz+I0swSdHynVv/heyNXB +ve6SbzJ08pGCL72CQnqtKrcgfU28elUSwhXqvfdqlS5sdJ/PHLTyxQGjhdByPq1z +qwubdQxtRbeOlKyWN7Wg0I8VRw7j6IPdj/3vQQF3zCepYoUz8jcI73HPdwbeyBkd +iEDPfUYd/x7H4c7/I9vG+o1VTqkC50cRRj70/b17KSa7qWFiNyi2LSr2EIZkyXCn +0q23KXB56jzaYyWf/Wi3MOxw+3WKt21gZ7IeyLnp2KhvAotnDU0mV3HaIPzBSlCN +sSi6 +-----END CERTIFICATE----- + +# Issuer: CN=Certum Trusted Network CA O=Unizeto Technologies S.A. OU=Certum Certification Authority +# Subject: CN=Certum Trusted Network CA O=Unizeto Technologies S.A. OU=Certum Certification Authority +# Label: "Certum Trusted Network CA" +# Serial: 279744 +# MD5 Fingerprint: d5:e9:81:40:c5:18:69:fc:46:2c:89:75:62:0f:aa:78 +# SHA1 Fingerprint: 07:e0:32:e0:20:b7:2c:3f:19:2f:06:28:a2:59:3a:19:a7:0f:06:9e +# SHA256 Fingerprint: 5c:58:46:8d:55:f5:8e:49:7e:74:39:82:d2:b5:00:10:b6:d1:65:37:4a:cf:83:a7:d4:a3:2d:b7:68:c4:40:8e +-----BEGIN CERTIFICATE----- +MIIDuzCCAqOgAwIBAgIDBETAMA0GCSqGSIb3DQEBBQUAMH4xCzAJBgNVBAYTAlBM +MSIwIAYDVQQKExlVbml6ZXRvIFRlY2hub2xvZ2llcyBTLkEuMScwJQYDVQQLEx5D +ZXJ0dW0gQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkxIjAgBgNVBAMTGUNlcnR1bSBU +cnVzdGVkIE5ldHdvcmsgQ0EwHhcNMDgxMDIyMTIwNzM3WhcNMjkxMjMxMTIwNzM3 +WjB+MQswCQYDVQQGEwJQTDEiMCAGA1UEChMZVW5pemV0byBUZWNobm9sb2dpZXMg +Uy5BLjEnMCUGA1UECxMeQ2VydHVtIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MSIw +IAYDVQQDExlDZXJ0dW0gVHJ1c3RlZCBOZXR3b3JrIENBMIIBIjANBgkqhkiG9w0B +AQEFAAOCAQ8AMIIBCgKCAQEA4/t9o3K6wvDJFIf1awFO4W5AB7ptJ11/91sts1rH +UV+rpDKmYYe2bg+G0jACl/jXaVehGDldamR5xgFZrDwxSjh80gTSSyjoIF87B6LM +TXPb865Px1bVWqeWifrzq2jUI4ZZJ88JJ7ysbnKDHDBy3+Ci6dLhdHUZvSqeexVU +BBvXQzmtVSjF4hq79MDkrjhJM8x2hZ85RdKknvISjFH4fOQtf/WsX+sWn7Et0brM +kUJ3TCXJkDhv2/DM+44el1k+1WBO5gUo7Ul5E0u6SNsv+XLTOcr+H9g0cvW0QM8x +AcPs3hEtF10fuFDRXhmnad4HMyjKUJX5p1TLVIZQRan5SQIDAQABo0IwQDAPBgNV +HRMBAf8EBTADAQH/MB0GA1UdDgQWBBQIds3LB/8k9sXN7buQvOKEN0Z19zAOBgNV +HQ8BAf8EBAMCAQYwDQYJKoZIhvcNAQEFBQADggEBAKaorSLOAT2mo/9i0Eidi15y +sHhE49wcrwn9I0j6vSrEuVUEtRCjjSfeC4Jj0O7eDDd5QVsisrCaQVymcODU0HfL +I9MA4GxWL+FpDQ3Zqr8hgVDZBqWo/5U30Kr+4rP1mS1FhIrlQgnXdAIv94nYmem8 +J9RHjboNRhx3zxSkHLmkMcScKHQDNP8zGSal6Q10tz6XxnboJ5ajZt3hrvJBW8qY +VoNzcOSGGtIxQbovvi0TWnZvTuhOgQ4/WwMioBK+ZlgRSssDxLQqKi2WF+A5VLxI +03YnnZotBqbJ7DnSq9ufmgsnAjUpsUCV5/nonFWIGUbWtzT1fs45mtk48VH3Tyw= +-----END CERTIFICATE----- + +# Issuer: CN=TWCA Root Certification Authority O=TAIWAN-CA OU=Root CA +# Subject: CN=TWCA Root Certification Authority O=TAIWAN-CA OU=Root CA +# Label: "TWCA Root Certification Authority" +# Serial: 1 +# MD5 Fingerprint: aa:08:8f:f6:f9:7b:b7:f2:b1:a7:1e:9b:ea:ea:bd:79 +# SHA1 Fingerprint: cf:9e:87:6d:d3:eb:fc:42:26:97:a3:b5:a3:7a:a0:76:a9:06:23:48 +# SHA256 Fingerprint: bf:d8:8f:e1:10:1c:41:ae:3e:80:1b:f8:be:56:35:0e:e9:ba:d1:a6:b9:bd:51:5e:dc:5c:6d:5b:87:11:ac:44 +-----BEGIN CERTIFICATE----- +MIIDezCCAmOgAwIBAgIBATANBgkqhkiG9w0BAQUFADBfMQswCQYDVQQGEwJUVzES +MBAGA1UECgwJVEFJV0FOLUNBMRAwDgYDVQQLDAdSb290IENBMSowKAYDVQQDDCFU +V0NBIFJvb3QgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMDgwODI4MDcyNDMz +WhcNMzAxMjMxMTU1OTU5WjBfMQswCQYDVQQGEwJUVzESMBAGA1UECgwJVEFJV0FO +LUNBMRAwDgYDVQQLDAdSb290IENBMSowKAYDVQQDDCFUV0NBIFJvb3QgQ2VydGlm +aWNhdGlvbiBBdXRob3JpdHkwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIB +AQCwfnK4pAOU5qfeCTiRShFAh6d8WWQUe7UREN3+v9XAu1bihSX0NXIP+FPQQeFE +AcK0HMMxQhZHhTMidrIKbw/lJVBPhYa+v5guEGcevhEFhgWQxFnQfHgQsIBct+HH +K3XLfJ+utdGdIzdjp9xCoi2SBBtQwXu4PhvJVgSLL1KbralW6cH/ralYhzC2gfeX +RfwZVzsrb+RH9JlF/h3x+JejiB03HFyP4HYlmlD4oFT/RJB2I9IyxsOrBr/8+7/z +rX2SYgJbKdM1o5OaQ2RgXbL6Mv87BK9NQGr5x+PvI/1ry+UPizgN7gr8/g+YnzAx +3WxSZfmLgb4i4RxYA7qRG4kHAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNV +HRMBAf8EBTADAQH/MB0GA1UdDgQWBBRqOFsmjd6LWvJPelSDGRjjCDWmujANBgkq +hkiG9w0BAQUFAAOCAQEAPNV3PdrfibqHDAhUaiBQkr6wQT25JmSDCi/oQMCXKCeC +MErJk/9q56YAf4lCmtYR5VPOL8zy2gXE/uJQxDqGfczafhAJO5I1KlOy/usrBdls +XebQ79NqZp4VKIV66IIArB6nCWlWQtNoURi+VJq/REG6Sb4gumlc7rh3zc5sH62D +lhh9DrUUOYTxKOkto557HnpyWoOzeW/vtPzQCqVYT0bf+215WfKEIlKuD8z7fDvn +aspHYcN6+NOSBB+4IIThNlQWx0DeO4pz3N/GCUzf7Nr/1FNCocnyYh0igzyXxfkZ +YiesZSLX0zzG5Y6yU8xJzrww/nsOM5D77dIUkR8Hrw== +-----END CERTIFICATE----- + +# Issuer: O=SECOM Trust Systems CO.,LTD. OU=Security Communication RootCA2 +# Subject: O=SECOM Trust Systems CO.,LTD. OU=Security Communication RootCA2 +# Label: "Security Communication RootCA2" +# Serial: 0 +# MD5 Fingerprint: 6c:39:7d:a4:0e:55:59:b2:3f:d6:41:b1:12:50:de:43 +# SHA1 Fingerprint: 5f:3b:8c:f2:f8:10:b3:7d:78:b4:ce:ec:19:19:c3:73:34:b9:c7:74 +# SHA256 Fingerprint: 51:3b:2c:ec:b8:10:d4:cd:e5:dd:85:39:1a:df:c6:c2:dd:60:d8:7b:b7:36:d2:b5:21:48:4a:a4:7a:0e:be:f6 +-----BEGIN CERTIFICATE----- +MIIDdzCCAl+gAwIBAgIBADANBgkqhkiG9w0BAQsFADBdMQswCQYDVQQGEwJKUDEl +MCMGA1UEChMcU0VDT00gVHJ1c3QgU3lzdGVtcyBDTy4sTFRELjEnMCUGA1UECxMe +U2VjdXJpdHkgQ29tbXVuaWNhdGlvbiBSb290Q0EyMB4XDTA5MDUyOTA1MDAzOVoX +DTI5MDUyOTA1MDAzOVowXTELMAkGA1UEBhMCSlAxJTAjBgNVBAoTHFNFQ09NIFRy +dXN0IFN5c3RlbXMgQ08uLExURC4xJzAlBgNVBAsTHlNlY3VyaXR5IENvbW11bmlj +YXRpb24gUm9vdENBMjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBANAV +OVKxUrO6xVmCxF1SrjpDZYBLx/KWvNs2l9amZIyoXvDjChz335c9S672XewhtUGr +zbl+dp+++T42NKA7wfYxEUV0kz1XgMX5iZnK5atq1LXaQZAQwdbWQonCv/Q4EpVM +VAX3NuRFg3sUZdbcDE3R3n4MqzvEFb46VqZab3ZpUql6ucjrappdUtAtCms1FgkQ +hNBqyjoGADdH5H5XTz+L62e4iKrFvlNVspHEfbmwhRkGeC7bYRr6hfVKkaHnFtWO +ojnflLhwHyg/i/xAXmODPIMqGplrz95Zajv8bxbXH/1KEOtOghY6rCcMU/Gt1SSw +awNQwS08Ft1ENCcadfsCAwEAAaNCMEAwHQYDVR0OBBYEFAqFqXdlBZh8QIH4D5cs +OPEK7DzPMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MA0GCSqGSIb3 +DQEBCwUAA4IBAQBMOqNErLlFsceTfsgLCkLfZOoc7llsCLqJX2rKSpWeeo8HxdpF +coJxDjrSzG+ntKEju/Ykn8sX/oymzsLS28yN/HH8AynBbF0zX2S2ZTuJbxh2ePXc +okgfGT+Ok+vx+hfuzU7jBBJV1uXk3fs+BXziHV7Gp7yXT2g69ekuCkO2r1dcYmh8 +t/2jioSgrGK+KwmHNPBqAbubKVY8/gA3zyNs8U6qtnRGEmyR7jTV7JqR50S+kDFy +1UkC9gLl9B/rfNmWVan/7Ir5mUf/NVoCqgTLiluHcSmRvaS0eg29mvVXIwAHIRc/ +SjnRBUkLp7Y3gaVdjKozXoEofKd9J+sAro03 +-----END CERTIFICATE----- + +# Issuer: CN=Actalis Authentication Root CA O=Actalis S.p.A./03358520967 +# Subject: CN=Actalis Authentication Root CA O=Actalis S.p.A./03358520967 +# Label: "Actalis Authentication Root CA" +# Serial: 6271844772424770508 +# MD5 Fingerprint: 69:c1:0d:4f:07:a3:1b:c3:fe:56:3d:04:bc:11:f6:a6 +# SHA1 Fingerprint: f3:73:b3:87:06:5a:28:84:8a:f2:f3:4a:ce:19:2b:dd:c7:8e:9c:ac +# SHA256 Fingerprint: 55:92:60:84:ec:96:3a:64:b9:6e:2a:be:01:ce:0b:a8:6a:64:fb:fe:bc:c7:aa:b5:af:c1:55:b3:7f:d7:60:66 +-----BEGIN CERTIFICATE----- +MIIFuzCCA6OgAwIBAgIIVwoRl0LE48wwDQYJKoZIhvcNAQELBQAwazELMAkGA1UE +BhMCSVQxDjAMBgNVBAcMBU1pbGFuMSMwIQYDVQQKDBpBY3RhbGlzIFMucC5BLi8w +MzM1ODUyMDk2NzEnMCUGA1UEAwweQWN0YWxpcyBBdXRoZW50aWNhdGlvbiBSb290 +IENBMB4XDTExMDkyMjExMjIwMloXDTMwMDkyMjExMjIwMlowazELMAkGA1UEBhMC +SVQxDjAMBgNVBAcMBU1pbGFuMSMwIQYDVQQKDBpBY3RhbGlzIFMucC5BLi8wMzM1 +ODUyMDk2NzEnMCUGA1UEAwweQWN0YWxpcyBBdXRoZW50aWNhdGlvbiBSb290IENB +MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAp8bEpSmkLO/lGMWwUKNv +UTufClrJwkg4CsIcoBh/kbWHuUA/3R1oHwiD1S0eiKD4j1aPbZkCkpAW1V8IbInX +4ay8IMKx4INRimlNAJZaby/ARH6jDuSRzVju3PvHHkVH3Se5CAGfpiEd9UEtL0z9 +KK3giq0itFZljoZUj5NDKd45RnijMCO6zfB9E1fAXdKDa0hMxKufgFpbOr3JpyI/ +gCczWw63igxdBzcIy2zSekciRDXFzMwujt0q7bd9Zg1fYVEiVRvjRuPjPdA1Yprb +rxTIW6HMiRvhMCb8oJsfgadHHwTrozmSBp+Z07/T6k9QnBn+locePGX2oxgkg4YQ +51Q+qDp2JE+BIcXjDwL4k5RHILv+1A7TaLndxHqEguNTVHnd25zS8gebLra8Pu2F +be8lEfKXGkJh90qX6IuxEAf6ZYGyojnP9zz/GPvG8VqLWeICrHuS0E4UT1lF9gxe +KF+w6D9Fz8+vm2/7hNN3WpVvrJSEnu68wEqPSpP4RCHiMUVhUE4Q2OM1fEwZtN4F +v6MGn8i1zeQf1xcGDXqVdFUNaBr8EBtiZJ1t4JWgw5QHVw0U5r0F+7if5t+L4sbn +fpb2U8WANFAoWPASUHEXMLrmeGO89LKtmyuy/uE5jF66CyCU3nuDuP/jVo23Eek7 +jPKxwV2dpAtMK9myGPW1n0sCAwEAAaNjMGEwHQYDVR0OBBYEFFLYiDrIn3hm7Ynz +ezhwlMkCAjbQMA8GA1UdEwEB/wQFMAMBAf8wHwYDVR0jBBgwFoAUUtiIOsifeGbt +ifN7OHCUyQICNtAwDgYDVR0PAQH/BAQDAgEGMA0GCSqGSIb3DQEBCwUAA4ICAQAL +e3KHwGCmSUyIWOYdiPcUZEim2FgKDk8TNd81HdTtBjHIgT5q1d07GjLukD0R0i70 +jsNjLiNmsGe+b7bAEzlgqqI0JZN1Ut6nna0Oh4lScWoWPBkdg/iaKWW+9D+a2fDz +WochcYBNy+A4mz+7+uAwTc+G02UQGRjRlwKxK3JCaKygvU5a2hi/a5iB0P2avl4V +SM0RFbnAKVy06Ij3Pjaut2L9HmLecHgQHEhb2rykOLpn7VU+Xlff1ANATIGk0k9j +pwlCCRT8AKnCgHNPLsBA2RF7SOp6AsDT6ygBJlh0wcBzIm2Tlf05fbsq4/aC4yyX +X04fkZT6/iyj2HYauE2yOE+b+h1IYHkm4vP9qdCa6HCPSXrW5b0KDtst842/6+Ok +fcvHlXHo2qN8xcL4dJIEG4aspCJTQLas/kx2z/uUMsA1n3Y/buWQbqCmJqK4LL7R +K4X9p2jIugErsWx0Hbhzlefut8cl8ABMALJ+tguLHPPAUJ4lueAI3jZm/zel0btU +ZCzJJ7VLkn5l/9Mt4blOvH+kQSGQQXemOR/qnuOf0GZvBeyqdn6/axag67XH/JJU +LysRJyU3eExRarDzzFhdFPFqSBX/wge2sY0PjlxQRrM9vwGYT7JZVEc+NHt4bVaT +LnPqZih4zR0Uv6CPLy64Lo7yFIrM6bV8+2ydDKXhlg== +-----END CERTIFICATE----- + +# Issuer: CN=Buypass Class 2 Root CA O=Buypass AS-983163327 +# Subject: CN=Buypass Class 2 Root CA O=Buypass AS-983163327 +# Label: "Buypass Class 2 Root CA" +# Serial: 2 +# MD5 Fingerprint: 46:a7:d2:fe:45:fb:64:5a:a8:59:90:9b:78:44:9b:29 +# SHA1 Fingerprint: 49:0a:75:74:de:87:0a:47:fe:58:ee:f6:c7:6b:eb:c6:0b:12:40:99 +# SHA256 Fingerprint: 9a:11:40:25:19:7c:5b:b9:5d:94:e6:3d:55:cd:43:79:08:47:b6:46:b2:3c:df:11:ad:a4:a0:0e:ff:15:fb:48 +-----BEGIN CERTIFICATE----- +MIIFWTCCA0GgAwIBAgIBAjANBgkqhkiG9w0BAQsFADBOMQswCQYDVQQGEwJOTzEd +MBsGA1UECgwUQnV5cGFzcyBBUy05ODMxNjMzMjcxIDAeBgNVBAMMF0J1eXBhc3Mg +Q2xhc3MgMiBSb290IENBMB4XDTEwMTAyNjA4MzgwM1oXDTQwMTAyNjA4MzgwM1ow +TjELMAkGA1UEBhMCTk8xHTAbBgNVBAoMFEJ1eXBhc3MgQVMtOTgzMTYzMzI3MSAw +HgYDVQQDDBdCdXlwYXNzIENsYXNzIDIgUm9vdCBDQTCCAiIwDQYJKoZIhvcNAQEB +BQADggIPADCCAgoCggIBANfHXvfBB9R3+0Mh9PT1aeTuMgHbo4Yf5FkNuud1g1Lr +6hxhFUi7HQfKjK6w3Jad6sNgkoaCKHOcVgb/S2TwDCo3SbXlzwx87vFKu3MwZfPV +L4O2fuPn9Z6rYPnT8Z2SdIrkHJasW4DptfQxh6NR/Md+oW+OU3fUl8FVM5I+GC91 +1K2GScuVr1QGbNgGE41b/+EmGVnAJLqBcXmQRFBoJJRfuLMR8SlBYaNByyM21cHx +MlAQTn/0hpPshNOOvEu/XAFOBz3cFIqUCqTqc/sLUegTBxj6DvEr0VQVfTzh97QZ +QmdiXnfgolXsttlpF9U6r0TtSsWe5HonfOV116rLJeffawrbD02TTqigzXsu8lkB +arcNuAeBfos4GzjmCleZPe4h6KP1DBbdi+w0jpwqHAAVF41og9JwnxgIzRFo1clr +Us3ERo/ctfPYV3Me6ZQ5BL/T3jjetFPsaRyifsSP5BtwrfKi+fv3FmRmaZ9JUaLi +FRhnBkp/1Wy1TbMz4GHrXb7pmA8y1x1LPC5aAVKRCfLf6o3YBkBjqhHk/sM3nhRS +P/TizPJhk9H9Z2vXUq6/aKtAQ6BXNVN48FP4YUIHZMbXb5tMOA1jrGKvNouicwoN +9SG9dKpN6nIDSdvHXx1iY8f93ZHsM+71bbRuMGjeyNYmsHVee7QHIJihdjK4TWxP +AgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFMmAd+BikoL1Rpzz +uvdMw964o605MA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQsFAAOCAgEAU18h +9bqwOlI5LJKwbADJ784g7wbylp7ppHR/ehb8t/W2+xUbP6umwHJdELFx7rxP462s +A20ucS6vxOOto70MEae0/0qyexAQH6dXQbLArvQsWdZHEIjzIVEpMMpghq9Gqx3t +OluwlN5E40EIosHsHdb9T7bWR9AUC8rmyrV7d35BH16Dx7aMOZawP5aBQW9gkOLo ++fsicdl9sz1Gv7SEr5AcD48Saq/v7h56rgJKihcrdv6sVIkkLE8/trKnToyokZf7 +KcZ7XC25y2a2t6hbElGFtQl+Ynhw/qlqYLYdDnkM/crqJIByw5c/8nerQyIKx+u2 +DISCLIBrQYoIwOula9+ZEsuK1V6ADJHgJgg2SMX6OBE1/yWDLfJ6v9r9jv6ly0Us +H8SIU653DtmadsWOLB2jutXsMq7Aqqz30XpN69QH4kj3Io6wpJ9qzo6ysmD0oyLQ +I+uUWnpp3Q+/QFesa1lQ2aOZ4W7+jQF5JyMV3pKdewlNWudLSDBaGOYKbeaP4NK7 +5t98biGCwWg5TbSYWGZizEqQXsP6JwSxeRV0mcy+rSDeJmAc61ZRpqPq5KM/p/9h +3PFaTWwyI0PurKju7koSCTxdccK+efrCh2gdC/1cacwG0Jp9VJkqyTkaGa9LKkPz +Y11aWOIv4x3kqdbQCtCev9eBCfHJxyYNrJgWVqA= +-----END CERTIFICATE----- + +# Issuer: CN=Buypass Class 3 Root CA O=Buypass AS-983163327 +# Subject: CN=Buypass Class 3 Root CA O=Buypass AS-983163327 +# Label: "Buypass Class 3 Root CA" +# Serial: 2 +# MD5 Fingerprint: 3d:3b:18:9e:2c:64:5a:e8:d5:88:ce:0e:f9:37:c2:ec +# SHA1 Fingerprint: da:fa:f7:fa:66:84:ec:06:8f:14:50:bd:c7:c2:81:a5:bc:a9:64:57 +# SHA256 Fingerprint: ed:f7:eb:bc:a2:7a:2a:38:4d:38:7b:7d:40:10:c6:66:e2:ed:b4:84:3e:4c:29:b4:ae:1d:5b:93:32:e6:b2:4d +-----BEGIN CERTIFICATE----- +MIIFWTCCA0GgAwIBAgIBAjANBgkqhkiG9w0BAQsFADBOMQswCQYDVQQGEwJOTzEd +MBsGA1UECgwUQnV5cGFzcyBBUy05ODMxNjMzMjcxIDAeBgNVBAMMF0J1eXBhc3Mg +Q2xhc3MgMyBSb290IENBMB4XDTEwMTAyNjA4Mjg1OFoXDTQwMTAyNjA4Mjg1OFow +TjELMAkGA1UEBhMCTk8xHTAbBgNVBAoMFEJ1eXBhc3MgQVMtOTgzMTYzMzI3MSAw +HgYDVQQDDBdCdXlwYXNzIENsYXNzIDMgUm9vdCBDQTCCAiIwDQYJKoZIhvcNAQEB +BQADggIPADCCAgoCggIBAKXaCpUWUOOV8l6ddjEGMnqb8RB2uACatVI2zSRHsJ8Y +ZLya9vrVediQYkwiL944PdbgqOkcLNt4EemOaFEVcsfzM4fkoF0LXOBXByow9c3E +N3coTRiR5r/VUv1xLXA+58bEiuPwKAv0dpihi4dVsjoT/Lc+JzeOIuOoTyrvYLs9 +tznDDgFHmV0ST9tD+leh7fmdvhFHJlsTmKtdFoqwNxxXnUX/iJY2v7vKB3tvh2PX +0DJq1l1sDPGzbjniazEuOQAnFN44wOwZZoYS6J1yFhNkUsepNxz9gjDthBgd9K5c +/3ATAOux9TN6S9ZV+AWNS2mw9bMoNlwUxFFzTWsL8TQH2xc519woe2v1n/MuwU8X +KhDzzMro6/1rqy6any2CbgTUUgGTLT2G/H783+9CHaZr77kgxve9oKeV/afmiSTY +zIw0bOIjL9kSGiG5VZFvC5F5GQytQIgLcOJ60g7YaEi7ghM5EFjp2CoHxhLbWNvS +O1UQRwUVZ2J+GGOmRj8JDlQyXr8NYnon74Do29lLBlo3WiXQCBJ31G8JUJc9yB3D +34xFMFbG02SrZvPAXpacw8Tvw3xrizp5f7NJzz3iiZ+gMEuFuZyUJHmPfWupRWgP +K9Dx2hzLabjKSWJtyNBjYt1gD1iqj6G8BaVmos8bdrKEZLFMOVLAMLrwjEsCsLa3 +AgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFEe4zf/lb+74suwv +Tg75JbCOPGvDMA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQsFAAOCAgEAACAj +QTUEkMJAYmDv4jVM1z+s4jSQuKFvdvoWFqRINyzpkMLyPPgKn9iB5btb2iUspKdV +cSQy9sgL8rxq+JOssgfCX5/bzMiKqr5qb+FJEMwx14C7u8jYog5kV+qi9cKpMRXS +IGrs/CIBKM+GuIAeqcwRpTzyFrNHnfzSgCHEy9BHcEGhyoMZCCxt8l13nIoUE9Q2 +HJLw5QY33KbmkJs4j1xrG0aGQ0JfPgEHU1RdZX33inOhmlRaHylDFCfChQ+1iHsa +O5S3HWCntZznKWlXWpuTekMwGwPXYshApqr8ZORK15FTAaggiG6cX0S5y2CBNOxv +033aSF/rtJC8LakcC6wc1aJoIIAE1vyxjy+7SjENSoYc6+I2KSb12tjE8nVhz36u +dmNKekBlk4f4HoCMhuWG1o8O/FMsYOgWYRqiPkN7zTlgVGr18okmAWiDSKIz6MkE +kbIRNBE+6tBDGR8Dk5AM/1E9V/RBbuHLoL7ryWPNbczk+DaqaJ3tvV2XcEQNtg41 +3OEMXbugUZTLfhbrES+jkkXITHHZvMmZUldGL1DPvTVp9D0VzgalLA8+9oG6lLvD +u79leNKGef9JOxqDDPDeeOzI8k1MGt6CKfjBWtrt7uYnXuhF0J0cUahoq0Tj0Itq +4/g7u9xN12TyUb7mqqta6THuBrxzvxNiCp/HuZc= +-----END CERTIFICATE----- + +# Issuer: CN=T-TeleSec GlobalRoot Class 3 O=T-Systems Enterprise Services GmbH OU=T-Systems Trust Center +# Subject: CN=T-TeleSec GlobalRoot Class 3 O=T-Systems Enterprise Services GmbH OU=T-Systems Trust Center +# Label: "T-TeleSec GlobalRoot Class 3" +# Serial: 1 +# MD5 Fingerprint: ca:fb:40:a8:4e:39:92:8a:1d:fe:8e:2f:c4:27:ea:ef +# SHA1 Fingerprint: 55:a6:72:3e:cb:f2:ec:cd:c3:23:74:70:19:9d:2a:be:11:e3:81:d1 +# SHA256 Fingerprint: fd:73:da:d3:1c:64:4f:f1:b4:3b:ef:0c:cd:da:96:71:0b:9c:d9:87:5e:ca:7e:31:70:7a:f3:e9:6d:52:2b:bd +-----BEGIN CERTIFICATE----- +MIIDwzCCAqugAwIBAgIBATANBgkqhkiG9w0BAQsFADCBgjELMAkGA1UEBhMCREUx +KzApBgNVBAoMIlQtU3lzdGVtcyBFbnRlcnByaXNlIFNlcnZpY2VzIEdtYkgxHzAd +BgNVBAsMFlQtU3lzdGVtcyBUcnVzdCBDZW50ZXIxJTAjBgNVBAMMHFQtVGVsZVNl +YyBHbG9iYWxSb290IENsYXNzIDMwHhcNMDgxMDAxMTAyOTU2WhcNMzMxMDAxMjM1 +OTU5WjCBgjELMAkGA1UEBhMCREUxKzApBgNVBAoMIlQtU3lzdGVtcyBFbnRlcnBy +aXNlIFNlcnZpY2VzIEdtYkgxHzAdBgNVBAsMFlQtU3lzdGVtcyBUcnVzdCBDZW50 +ZXIxJTAjBgNVBAMMHFQtVGVsZVNlYyBHbG9iYWxSb290IENsYXNzIDMwggEiMA0G +CSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQC9dZPwYiJvJK7genasfb3ZJNW4t/zN +8ELg63iIVl6bmlQdTQyK9tPPcPRStdiTBONGhnFBSivwKixVA9ZIw+A5OO3yXDw/ +RLyTPWGrTs0NvvAgJ1gORH8EGoel15YUNpDQSXuhdfsaa3Ox+M6pCSzyU9XDFES4 +hqX2iys52qMzVNn6chr3IhUciJFrf2blw2qAsCTz34ZFiP0Zf3WHHx+xGwpzJFu5 +ZeAsVMhg02YXP+HMVDNzkQI6pn97djmiH5a2OK61yJN0HZ65tOVgnS9W0eDrXltM +EnAMbEQgqxHY9Bn20pxSN+f6tsIxO0rUFJmtxxr1XV/6B7h8DR/Wgx6zAgMBAAGj +QjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBS1 +A/d2O2GCahKqGFPrAyGUv/7OyjANBgkqhkiG9w0BAQsFAAOCAQEAVj3vlNW92nOy +WL6ukK2YJ5f+AbGwUgC4TeQbIXQbfsDuXmkqJa9c1h3a0nnJ85cp4IaH3gRZD/FZ +1GSFS5mvJQQeyUapl96Cshtwn5z2r3Ex3XsFpSzTucpH9sry9uetuUg/vBa3wW30 +6gmv7PO15wWeph6KU1HWk4HMdJP2udqmJQV0eVp+QD6CSyYRMG7hP0HHRwA11fXT +91Q+gT3aSWqas+8QPebrb9HIIkfLzM8BMZLZGOMivgkeGj5asuRrDFR6fUNOuIml +e9eiPZaGzPImNC1qkp2aGtAw4l1OBLBfiyB+d8E9lYLRRpo7PHi4b6HQDWSieB4p +TpPDpFQUWw== +-----END CERTIFICATE----- + +# Issuer: CN=D-TRUST Root Class 3 CA 2 2009 O=D-Trust GmbH +# Subject: CN=D-TRUST Root Class 3 CA 2 2009 O=D-Trust GmbH +# Label: "D-TRUST Root Class 3 CA 2 2009" +# Serial: 623603 +# MD5 Fingerprint: cd:e0:25:69:8d:47:ac:9c:89:35:90:f7:fd:51:3d:2f +# SHA1 Fingerprint: 58:e8:ab:b0:36:15:33:fb:80:f7:9b:1b:6d:29:d3:ff:8d:5f:00:f0 +# SHA256 Fingerprint: 49:e7:a4:42:ac:f0:ea:62:87:05:00:54:b5:25:64:b6:50:e4:f4:9e:42:e3:48:d6:aa:38:e0:39:e9:57:b1:c1 +-----BEGIN CERTIFICATE----- +MIIEMzCCAxugAwIBAgIDCYPzMA0GCSqGSIb3DQEBCwUAME0xCzAJBgNVBAYTAkRF +MRUwEwYDVQQKDAxELVRydXN0IEdtYkgxJzAlBgNVBAMMHkQtVFJVU1QgUm9vdCBD +bGFzcyAzIENBIDIgMjAwOTAeFw0wOTExMDUwODM1NThaFw0yOTExMDUwODM1NTha +ME0xCzAJBgNVBAYTAkRFMRUwEwYDVQQKDAxELVRydXN0IEdtYkgxJzAlBgNVBAMM +HkQtVFJVU1QgUm9vdCBDbGFzcyAzIENBIDIgMjAwOTCCASIwDQYJKoZIhvcNAQEB +BQADggEPADCCAQoCggEBANOySs96R+91myP6Oi/WUEWJNTrGa9v+2wBoqOADER03 +UAifTUpolDWzU9GUY6cgVq/eUXjsKj3zSEhQPgrfRlWLJ23DEE0NkVJD2IfgXU42 +tSHKXzlABF9bfsyjxiupQB7ZNoTWSPOSHjRGICTBpFGOShrvUD9pXRl/RcPHAY9R +ySPocq60vFYJfxLLHLGvKZAKyVXMD9O0Gu1HNVpK7ZxzBCHQqr0ME7UAyiZsxGsM +lFqVlNpQmvH/pStmMaTJOKDfHR+4CS7zp+hnUquVH+BGPtikw8paxTGA6Eian5Rp +/hnd2HN8gcqW3o7tszIFZYQ05ub9VxC1X3a/L7AQDcUCAwEAAaOCARowggEWMA8G +A1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFP3aFMSfMN4hvR5COfyrYyNJ4PGEMA4G +A1UdDwEB/wQEAwIBBjCB0wYDVR0fBIHLMIHIMIGAoH6gfIZ6bGRhcDovL2RpcmVj +dG9yeS5kLXRydXN0Lm5ldC9DTj1ELVRSVVNUJTIwUm9vdCUyMENsYXNzJTIwMyUy +MENBJTIwMiUyMDIwMDksTz1ELVRydXN0JTIwR21iSCxDPURFP2NlcnRpZmljYXRl +cmV2b2NhdGlvbmxpc3QwQ6BBoD+GPWh0dHA6Ly93d3cuZC10cnVzdC5uZXQvY3Js +L2QtdHJ1c3Rfcm9vdF9jbGFzc18zX2NhXzJfMjAwOS5jcmwwDQYJKoZIhvcNAQEL +BQADggEBAH+X2zDI36ScfSF6gHDOFBJpiBSVYEQBrLLpME+bUMJm2H6NMLVwMeni +acfzcNsgFYbQDfC+rAF1hM5+n02/t2A7nPPKHeJeaNijnZflQGDSNiH+0LS4F9p0 +o3/U37CYAqxva2ssJSRyoWXuJVrl5jLn8t+rSfrzkGkj2wTZ51xY/GXUl77M/C4K +zCUqNQT4YJEVdT1B/yMfGchs64JTBKbkTCJNjYy6zltz7GRUUG3RnFX7acM2w4y8 +PIWmawomDeCTmGCufsYkl4phX5GOZpIJhzbNi5stPvZR1FDUWSi9g/LMKHtThm3Y +Johw1+qRzT65ysCQblrGXnRl11z+o+I= +-----END CERTIFICATE----- + +# Issuer: CN=D-TRUST Root Class 3 CA 2 EV 2009 O=D-Trust GmbH +# Subject: CN=D-TRUST Root Class 3 CA 2 EV 2009 O=D-Trust GmbH +# Label: "D-TRUST Root Class 3 CA 2 EV 2009" +# Serial: 623604 +# MD5 Fingerprint: aa:c6:43:2c:5e:2d:cd:c4:34:c0:50:4f:11:02:4f:b6 +# SHA1 Fingerprint: 96:c9:1b:0b:95:b4:10:98:42:fa:d0:d8:22:79:fe:60:fa:b9:16:83 +# SHA256 Fingerprint: ee:c5:49:6b:98:8c:e9:86:25:b9:34:09:2e:ec:29:08:be:d0:b0:f3:16:c2:d4:73:0c:84:ea:f1:f3:d3:48:81 +-----BEGIN CERTIFICATE----- +MIIEQzCCAyugAwIBAgIDCYP0MA0GCSqGSIb3DQEBCwUAMFAxCzAJBgNVBAYTAkRF +MRUwEwYDVQQKDAxELVRydXN0IEdtYkgxKjAoBgNVBAMMIUQtVFJVU1QgUm9vdCBD +bGFzcyAzIENBIDIgRVYgMjAwOTAeFw0wOTExMDUwODUwNDZaFw0yOTExMDUwODUw +NDZaMFAxCzAJBgNVBAYTAkRFMRUwEwYDVQQKDAxELVRydXN0IEdtYkgxKjAoBgNV +BAMMIUQtVFJVU1QgUm9vdCBDbGFzcyAzIENBIDIgRVYgMjAwOTCCASIwDQYJKoZI +hvcNAQEBBQADggEPADCCAQoCggEBAJnxhDRwui+3MKCOvXwEz75ivJn9gpfSegpn +ljgJ9hBOlSJzmY3aFS3nBfwZcyK3jpgAvDw9rKFs+9Z5JUut8Mxk2og+KbgPCdM0 +3TP1YtHhzRnp7hhPTFiu4h7WDFsVWtg6uMQYZB7jM7K1iXdODL/ZlGsTl28So/6Z +qQTMFexgaDbtCHu39b+T7WYxg4zGcTSHThfqr4uRjRxWQa4iN1438h3Z0S0NL2lR +p75mpoo6Kr3HGrHhFPC+Oh25z1uxav60sUYgovseO3Dvk5h9jHOW8sXvhXCtKSb8 +HgQ+HKDYD8tSg2J87otTlZCpV6LqYQXY+U3EJ/pure3511H3a6UCAwEAAaOCASQw +ggEgMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFNOUikxiEyoZLsyvcop9Ntea +HNxnMA4GA1UdDwEB/wQEAwIBBjCB3QYDVR0fBIHVMIHSMIGHoIGEoIGBhn9sZGFw +Oi8vZGlyZWN0b3J5LmQtdHJ1c3QubmV0L0NOPUQtVFJVU1QlMjBSb290JTIwQ2xh +c3MlMjAzJTIwQ0ElMjAyJTIwRVYlMjAyMDA5LE89RC1UcnVzdCUyMEdtYkgsQz1E +RT9jZXJ0aWZpY2F0ZXJldm9jYXRpb25saXN0MEagRKBChkBodHRwOi8vd3d3LmQt +dHJ1c3QubmV0L2NybC9kLXRydXN0X3Jvb3RfY2xhc3NfM19jYV8yX2V2XzIwMDku +Y3JsMA0GCSqGSIb3DQEBCwUAA4IBAQA07XtaPKSUiO8aEXUHL7P+PPoeUSbrh/Yp +3uDx1MYkCenBz1UbtDDZzhr+BlGmFaQt77JLvyAoJUnRpjZ3NOhk31KxEcdzes05 +nsKtjHEh8lprr988TlWvsoRlFIm5d8sqMb7Po23Pb0iUMkZv53GMoKaEGTcH8gNF +CSuGdXzfX2lXANtu2KZyIktQ1HWYVt+3GP9DQ1CuekR78HlR10M9p9OB0/DJT7na +xpeG0ILD5EJt/rDiZE4OJudANCa1CInXCGNjOCd1HjPqbqjdn5lPdE2BiYBL3ZqX +KVwvvoFBuYz/6n1gBp7N1z3TLqMVvKjmJuVvw9y4AyHqnxbxLFS1 +-----END CERTIFICATE----- + +# Issuer: CN=CA Disig Root R2 O=Disig a.s. +# Subject: CN=CA Disig Root R2 O=Disig a.s. +# Label: "CA Disig Root R2" +# Serial: 10572350602393338211 +# MD5 Fingerprint: 26:01:fb:d8:27:a7:17:9a:45:54:38:1a:43:01:3b:03 +# SHA1 Fingerprint: b5:61:eb:ea:a4:de:e4:25:4b:69:1a:98:a5:57:47:c2:34:c7:d9:71 +# SHA256 Fingerprint: e2:3d:4a:03:6d:7b:70:e9:f5:95:b1:42:20:79:d2:b9:1e:df:bb:1f:b6:51:a0:63:3e:aa:8a:9d:c5:f8:07:03 +-----BEGIN CERTIFICATE----- +MIIFaTCCA1GgAwIBAgIJAJK4iNuwisFjMA0GCSqGSIb3DQEBCwUAMFIxCzAJBgNV +BAYTAlNLMRMwEQYDVQQHEwpCcmF0aXNsYXZhMRMwEQYDVQQKEwpEaXNpZyBhLnMu +MRkwFwYDVQQDExBDQSBEaXNpZyBSb290IFIyMB4XDTEyMDcxOTA5MTUzMFoXDTQy +MDcxOTA5MTUzMFowUjELMAkGA1UEBhMCU0sxEzARBgNVBAcTCkJyYXRpc2xhdmEx +EzARBgNVBAoTCkRpc2lnIGEucy4xGTAXBgNVBAMTEENBIERpc2lnIFJvb3QgUjIw +ggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCio8QACdaFXS1tFPbCw3Oe +NcJxVX6B+6tGUODBfEl45qt5WDza/3wcn9iXAng+a0EE6UG9vgMsRfYvZNSrXaNH +PWSb6WiaxswbP7q+sos0Ai6YVRn8jG+qX9pMzk0DIaPY0jSTVpbLTAwAFjxfGs3I +x2ymrdMxp7zo5eFm1tL7A7RBZckQrg4FY8aAamkw/dLukO8NJ9+flXP04SXabBbe +QTg06ov80egEFGEtQX6sx3dOy1FU+16SGBsEWmjGycT6txOgmLcRK7fWV8x8nhfR +yyX+hk4kLlYMeE2eARKmK6cBZW58Yh2EhN/qwGu1pSqVg8NTEQxzHQuyRpDRQjrO +QG6Vrf/GlK1ul4SOfW+eioANSW1z4nuSHsPzwfPrLgVv2RvPN3YEyLRa5Beny912 +H9AZdugsBbPWnDTYltxhh5EF5EQIM8HauQhl1K6yNg3ruji6DOWbnuuNZt2Zz9aJ +QfYEkoopKW1rOhzndX0CcQ7zwOe9yxndnWCywmZgtrEE7snmhrmaZkCo5xHtgUUD +i/ZnWejBBhG93c+AAk9lQHhcR1DIm+YfgXvkRKhbhZri3lrVx/k6RGZL5DJUfORs +nLMOPReisjQS1n6yqEm70XooQL6iFh/f5DcfEXP7kAplQ6INfPgGAVUzfbANuPT1 +rqVCV3w2EYx7XsQDnYx5nQIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1Ud +DwEB/wQEAwIBBjAdBgNVHQ4EFgQUtZn4r7CU9eMg1gqtzk5WpC5uQu0wDQYJKoZI +hvcNAQELBQADggIBACYGXnDnZTPIgm7ZnBc6G3pmsgH2eDtpXi/q/075KMOYKmFM +tCQSin1tERT3nLXK5ryeJ45MGcipvXrA1zYObYVybqjGom32+nNjf7xueQgcnYqf +GopTpti72TVVsRHFqQOzVju5hJMiXn7B9hJSi+osZ7z+Nkz1uM/Rs0mSO9MpDpkb +lvdhuDvEK7Z4bLQjb/D907JedR+Zlais9trhxTF7+9FGs9K8Z7RiVLoJ92Owk6Ka ++elSLotgEqv89WBW7xBci8QaQtyDW2QOy7W81k/BfDxujRNt+3vrMNDcTa/F1bal +TFtxyegxvug4BkihGuLq0t4SOVga/4AOgnXmt8kHbA7v/zjxmHHEt38OFdAlab0i +nSvtBfZGR6ztwPDUO+Ls7pZbkBNOHlY667DvlruWIxG68kOGdGSVyCh13x01utI3 +gzhTODY7z2zp+WsO0PsE6E9312UBeIYMej4hYvF/Y3EMyZ9E26gnonW+boE+18Dr +G5gPcFw0sorMwIUY6256s/daoQe/qUKS82Ail+QUoQebTnbAjn39pCXHR+3/H3Os +zMOl6W8KjptlwlCFtaOgUxLMVYdh84GuEEZhvUQhuMI9dM9+JDX6HAcOmz0iyu8x +L4ysEr3vQCj8KWefshNPZiTEUxnpHikV7+ZtsH8tZ/3zbBt1RqPlShfppNcL +-----END CERTIFICATE----- + +# Issuer: CN=ACCVRAIZ1 O=ACCV OU=PKIACCV +# Subject: CN=ACCVRAIZ1 O=ACCV OU=PKIACCV +# Label: "ACCVRAIZ1" +# Serial: 6828503384748696800 +# MD5 Fingerprint: d0:a0:5a:ee:05:b6:09:94:21:a1:7d:f1:b2:29:82:02 +# SHA1 Fingerprint: 93:05:7a:88:15:c6:4f:ce:88:2f:fa:91:16:52:28:78:bc:53:64:17 +# SHA256 Fingerprint: 9a:6e:c0:12:e1:a7:da:9d:be:34:19:4d:47:8a:d7:c0:db:18:22:fb:07:1d:f1:29:81:49:6e:d1:04:38:41:13 +-----BEGIN CERTIFICATE----- +MIIH0zCCBbugAwIBAgIIXsO3pkN/pOAwDQYJKoZIhvcNAQEFBQAwQjESMBAGA1UE +AwwJQUNDVlJBSVoxMRAwDgYDVQQLDAdQS0lBQ0NWMQ0wCwYDVQQKDARBQ0NWMQsw +CQYDVQQGEwJFUzAeFw0xMTA1MDUwOTM3MzdaFw0zMDEyMzEwOTM3MzdaMEIxEjAQ +BgNVBAMMCUFDQ1ZSQUlaMTEQMA4GA1UECwwHUEtJQUNDVjENMAsGA1UECgwEQUND +VjELMAkGA1UEBhMCRVMwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCb +qau/YUqXry+XZpp0X9DZlv3P4uRm7x8fRzPCRKPfmt4ftVTdFXxpNRFvu8gMjmoY +HtiP2Ra8EEg2XPBjs5BaXCQ316PWywlxufEBcoSwfdtNgM3802/J+Nq2DoLSRYWo +G2ioPej0RGy9ocLLA76MPhMAhN9KSMDjIgro6TenGEyxCQ0jVn8ETdkXhBilyNpA +lHPrzg5XPAOBOp0KoVdDaaxXbXmQeOW1tDvYvEyNKKGno6e6Ak4l0Squ7a4DIrhr +IA8wKFSVf+DuzgpmndFALW4ir50awQUZ0m/A8p/4e7MCQvtQqR0tkw8jq8bBD5L/ +0KIV9VMJcRz/RROE5iZe+OCIHAr8Fraocwa48GOEAqDGWuzndN9wrqODJerWx5eH +k6fGioozl2A3ED6XPm4pFdahD9GILBKfb6qkxkLrQaLjlUPTAYVtjrs78yM2x/47 +4KElB0iryYl0/wiPgL/AlmXz7uxLaL2diMMxs0Dx6M/2OLuc5NF/1OVYm3z61PMO +m3WR5LpSLhl+0fXNWhn8ugb2+1KoS5kE3fj5tItQo05iifCHJPqDQsGH+tUtKSpa +cXpkatcnYGMN285J9Y0fkIkyF/hzQ7jSWpOGYdbhdQrqeWZ2iE9x6wQl1gpaepPl +uUsXQA+xtrn13k/c4LOsOxFwYIRKQ26ZIMApcQrAZQIDAQABo4ICyzCCAscwfQYI +KwYBBQUHAQEEcTBvMEwGCCsGAQUFBzAChkBodHRwOi8vd3d3LmFjY3YuZXMvZmls +ZWFkbWluL0FyY2hpdm9zL2NlcnRpZmljYWRvcy9yYWl6YWNjdjEuY3J0MB8GCCsG +AQUFBzABhhNodHRwOi8vb2NzcC5hY2N2LmVzMB0GA1UdDgQWBBTSh7Tj3zcnk1X2 +VuqB5TbMjB4/vTAPBgNVHRMBAf8EBTADAQH/MB8GA1UdIwQYMBaAFNKHtOPfNyeT +VfZW6oHlNsyMHj+9MIIBcwYDVR0gBIIBajCCAWYwggFiBgRVHSAAMIIBWDCCASIG +CCsGAQUFBwICMIIBFB6CARAAQQB1AHQAbwByAGkAZABhAGQAIABkAGUAIABDAGUA +cgB0AGkAZgBpAGMAYQBjAGkA8wBuACAAUgBhAO0AegAgAGQAZQAgAGwAYQAgAEEA +QwBDAFYAIAAoAEEAZwBlAG4AYwBpAGEAIABkAGUAIABUAGUAYwBuAG8AbABvAGcA +7QBhACAAeQAgAEMAZQByAHQAaQBmAGkAYwBhAGMAaQDzAG4AIABFAGwAZQBjAHQA +cgDzAG4AaQBjAGEALAAgAEMASQBGACAAUQA0ADYAMAAxADEANQA2AEUAKQAuACAA +QwBQAFMAIABlAG4AIABoAHQAdABwADoALwAvAHcAdwB3AC4AYQBjAGMAdgAuAGUA +czAwBggrBgEFBQcCARYkaHR0cDovL3d3dy5hY2N2LmVzL2xlZ2lzbGFjaW9uX2Mu +aHRtMFUGA1UdHwROMEwwSqBIoEaGRGh0dHA6Ly93d3cuYWNjdi5lcy9maWxlYWRt +aW4vQXJjaGl2b3MvY2VydGlmaWNhZG9zL3JhaXphY2N2MV9kZXIuY3JsMA4GA1Ud +DwEB/wQEAwIBBjAXBgNVHREEEDAOgQxhY2N2QGFjY3YuZXMwDQYJKoZIhvcNAQEF +BQADggIBAJcxAp/n/UNnSEQU5CmH7UwoZtCPNdpNYbdKl02125DgBS4OxnnQ8pdp +D70ER9m+27Up2pvZrqmZ1dM8MJP1jaGo/AaNRPTKFpV8M9xii6g3+CfYCS0b78gU +JyCpZET/LtZ1qmxNYEAZSUNUY9rizLpm5U9EelvZaoErQNV/+QEnWCzI7UiRfD+m +AM/EKXMRNt6GGT6d7hmKG9Ww7Y49nCrADdg9ZuM8Db3VlFzi4qc1GwQA9j9ajepD +vV+JHanBsMyZ4k0ACtrJJ1vnE5Bc5PUzolVt3OAJTS+xJlsndQAJxGJ3KQhfnlms +tn6tn1QwIgPBHnFk/vk4CpYY3QIUrCPLBhwepH2NDd4nQeit2hW3sCPdK6jT2iWH +7ehVRE2I9DZ+hJp4rPcOVkkO1jMl1oRQQmwgEh0q1b688nCBpHBgvgW1m54ERL5h +I6zppSSMEYCUWqKiuUnSwdzRp+0xESyeGabu4VXhwOrPDYTkF7eifKXeVSUG7szA +h1xA2syVP1XgNce4hL60Xc16gwFy7ofmXx2utYXGJt/mwZrpHgJHnyqobalbz+xF +d3+YJ5oyXSrjhO7FmGYvliAd3djDJ9ew+f7Zfc3Qn48LFFhRny+Lwzgt3uiP1o2H +pPVWQxaZLPSkVrQ0uGE3ycJYgBugl6H8WY3pEfbRD0tVNEYqi4Y7 +-----END CERTIFICATE----- + +# Issuer: CN=TWCA Global Root CA O=TAIWAN-CA OU=Root CA +# Subject: CN=TWCA Global Root CA O=TAIWAN-CA OU=Root CA +# Label: "TWCA Global Root CA" +# Serial: 3262 +# MD5 Fingerprint: f9:03:7e:cf:e6:9e:3c:73:7a:2a:90:07:69:ff:2b:96 +# SHA1 Fingerprint: 9c:bb:48:53:f6:a4:f6:d3:52:a4:e8:32:52:55:60:13:f5:ad:af:65 +# SHA256 Fingerprint: 59:76:90:07:f7:68:5d:0f:cd:50:87:2f:9f:95:d5:75:5a:5b:2b:45:7d:81:f3:69:2b:61:0a:98:67:2f:0e:1b +-----BEGIN CERTIFICATE----- +MIIFQTCCAymgAwIBAgICDL4wDQYJKoZIhvcNAQELBQAwUTELMAkGA1UEBhMCVFcx +EjAQBgNVBAoTCVRBSVdBTi1DQTEQMA4GA1UECxMHUm9vdCBDQTEcMBoGA1UEAxMT +VFdDQSBHbG9iYWwgUm9vdCBDQTAeFw0xMjA2MjcwNjI4MzNaFw0zMDEyMzExNTU5 +NTlaMFExCzAJBgNVBAYTAlRXMRIwEAYDVQQKEwlUQUlXQU4tQ0ExEDAOBgNVBAsT +B1Jvb3QgQ0ExHDAaBgNVBAMTE1RXQ0EgR2xvYmFsIFJvb3QgQ0EwggIiMA0GCSqG +SIb3DQEBAQUAA4ICDwAwggIKAoICAQCwBdvI64zEbooh745NnHEKH1Jw7W2CnJfF +10xORUnLQEK1EjRsGcJ0pDFfhQKX7EMzClPSnIyOt7h52yvVavKOZsTuKwEHktSz +0ALfUPZVr2YOy+BHYC8rMjk1Ujoog/h7FsYYuGLWRyWRzvAZEk2tY/XTP3VfKfCh +MBwqoJimFb3u/Rk28OKRQ4/6ytYQJ0lM793B8YVwm8rqqFpD/G2Gb3PpN0Wp8DbH +zIh1HrtsBv+baz4X7GGqcXzGHaL3SekVtTzWoWH1EfcFbx39Eb7QMAfCKbAJTibc +46KokWofwpFFiFzlmLhxpRUZyXx1EcxwdE8tmx2RRP1WKKD+u4ZqyPpcC1jcxkt2 +yKsi2XMPpfRaAok/T54igu6idFMqPVMnaR1sjjIsZAAmY2E2TqNGtz99sy2sbZCi +laLOz9qC5wc0GZbpuCGqKX6mOL6OKUohZnkfs8O1CWfe1tQHRvMq2uYiN2DLgbYP +oA/pyJV/v1WRBXrPPRXAb94JlAGD1zQbzECl8LibZ9WYkTunhHiVJqRaCPgrdLQA +BDzfuBSO6N+pjWxnkjMdwLfS7JLIvgm/LCkFbwJrnu+8vyq8W8BQj0FwcYeyTbcE +qYSjMq+u7msXi7Kx/mzhkIyIqJdIzshNy/MGz19qCkKxHh53L46g5pIOBvwFItIm +4TFRfTLcDwIDAQABoyMwITAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB +/zANBgkqhkiG9w0BAQsFAAOCAgEAXzSBdu+WHdXltdkCY4QWwa6gcFGn90xHNcgL +1yg9iXHZqjNB6hQbbCEAwGxCGX6faVsgQt+i0trEfJdLjbDorMjupWkEmQqSpqsn +LhpNgb+E1HAerUf+/UqdM+DyucRFCCEK2mlpc3INvjT+lIutwx4116KD7+U4x6WF +H6vPNOw/KP4M8VeGTslV9xzU2KV9Bnpv1d8Q34FOIWWxtuEXeZVFBs5fzNxGiWNo +RI2T9GRwoD2dKAXDOXC4Ynsg/eTb6QihuJ49CcdP+yz4k3ZB3lLg4VfSnQO8d57+ +nile98FRYB/e2guyLXW3Q0iT5/Z5xoRdgFlglPx4mI88k1HtQJAH32RjJMtOcQWh +15QaiDLxInQirqWm2BJpTGCjAu4r7NRjkgtevi92a6O2JryPA9gK8kxkRr05YuWW +6zRjESjMlfGt7+/cgFhI6Uu46mWs6fyAtbXIRfmswZ/ZuepiiI7E8UuDEq3mi4TW +nsLrgxifarsbJGAzcMzs9zLzXNl5fe+epP7JI8Mk7hWSsT2RTyaGvWZzJBPqpK5j +wa19hAM8EHiGG3njxPPyBJUgriOCxLM6AGK/5jYk4Ve6xx6QddVfP5VhK8E7zeWz +aGHQRiapIVJpLesux+t3zqY6tQMzT3bR51xUAV3LePTJDL/PEo4XLSNolOer/qmy +KwbQBM0= +-----END CERTIFICATE----- + +# Issuer: CN=TeliaSonera Root CA v1 O=TeliaSonera +# Subject: CN=TeliaSonera Root CA v1 O=TeliaSonera +# Label: "TeliaSonera Root CA v1" +# Serial: 199041966741090107964904287217786801558 +# MD5 Fingerprint: 37:41:49:1b:18:56:9a:26:f5:ad:c2:66:fb:40:a5:4c +# SHA1 Fingerprint: 43:13:bb:96:f1:d5:86:9b:c1:4e:6a:92:f6:cf:f6:34:69:87:82:37 +# SHA256 Fingerprint: dd:69:36:fe:21:f8:f0:77:c1:23:a1:a5:21:c1:22:24:f7:22:55:b7:3e:03:a7:26:06:93:e8:a2:4b:0f:a3:89 +-----BEGIN CERTIFICATE----- +MIIFODCCAyCgAwIBAgIRAJW+FqD3LkbxezmCcvqLzZYwDQYJKoZIhvcNAQEFBQAw +NzEUMBIGA1UECgwLVGVsaWFTb25lcmExHzAdBgNVBAMMFlRlbGlhU29uZXJhIFJv +b3QgQ0EgdjEwHhcNMDcxMDE4MTIwMDUwWhcNMzIxMDE4MTIwMDUwWjA3MRQwEgYD +VQQKDAtUZWxpYVNvbmVyYTEfMB0GA1UEAwwWVGVsaWFTb25lcmEgUm9vdCBDQSB2 +MTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAMK+6yfwIaPzaSZVfp3F +VRaRXP3vIb9TgHot0pGMYzHw7CTww6XScnwQbfQ3t+XmfHnqjLWCi65ItqwA3GV1 +7CpNX8GH9SBlK4GoRz6JI5UwFpB/6FcHSOcZrr9FZ7E3GwYq/t75rH2D+1665I+X +Z75Ljo1kB1c4VWk0Nj0TSO9P4tNmHqTPGrdeNjPUtAa9GAH9d4RQAEX1jF3oI7x+ +/jXh7VB7qTCNGdMJjmhnXb88lxhTuylixcpecsHHltTbLaC0H2kD7OriUPEMPPCs +81Mt8Bz17Ww5OXOAFshSsCPN4D7c3TxHoLs1iuKYaIu+5b9y7tL6pe0S7fyYGKkm +dtwoSxAgHNN/Fnct7W+A90m7UwW7XWjH1Mh1Fj+JWov3F0fUTPHSiXk+TT2YqGHe +Oh7S+F4D4MHJHIzTjU3TlTazN19jY5szFPAtJmtTfImMMsJu7D0hADnJoWjiUIMu +sDor8zagrC/kb2HCUQk5PotTubtn2txTuXZZNp1D5SDgPTJghSJRt8czu90VL6R4 +pgd7gUY2BIbdeTXHlSw7sKMXNeVzH7RcWe/a6hBle3rQf5+ztCo3O3CLm1u5K7fs +slESl1MpWtTwEhDcTwK7EpIvYtQ/aUN8Ddb8WHUBiJ1YFkveupD/RwGJBmr2X7KQ +arMCpgKIv7NHfirZ1fpoeDVNAgMBAAGjPzA9MA8GA1UdEwEB/wQFMAMBAf8wCwYD +VR0PBAQDAgEGMB0GA1UdDgQWBBTwj1k4ALP1j5qWDNXr+nuqF+gTEjANBgkqhkiG +9w0BAQUFAAOCAgEAvuRcYk4k9AwI//DTDGjkk0kiP0Qnb7tt3oNmzqjMDfz1mgbl +dxSR651Be5kqhOX//CHBXfDkH1e3damhXwIm/9fH907eT/j3HEbAek9ALCI18Bmx +0GtnLLCo4MBANzX2hFxc469CeP6nyQ1Q6g2EdvZR74NTxnr/DlZJLo961gzmJ1Tj +TQpgcmLNkQfWpb/ImWvtxBnmq0wROMVvMeJuScg/doAmAyYp4Db29iBT4xdwNBed +Y2gea+zDTYa4EzAvXUYNR0PVG6pZDrlcjQZIrXSHX8f8MVRBE+LHIQ6e4B4N4cB7 +Q4WQxYpYxmUKeFfyxiMPAdkgS94P+5KFdSpcc41teyWRyu5FrgZLAMzTsVlQ2jqI +OylDRl6XK1TOU2+NSueW+r9xDkKLfP0ooNBIytrEgUy7onOTJsjrDNYmiLbAJM+7 +vVvrdX3pCI6GMyx5dwlppYn8s3CQh3aP0yK7Qs69cwsgJirQmz1wHiRszYd2qReW +t88NkvuOGKmYSdGe/mBEciG5Ge3C9THxOUiIkCR1VBatzvT4aRRkOfujuLpwQMcn +HL/EVlP6Y2XQ8xwOFvVrhlhNGNTkDY6lnVuR3HYkUD/GKvvZt5y11ubQ2egZixVx +SK236thZiNSQvxaz2emsWWFUyBy6ysHK4bkgTI86k4mloMy/0/Z1pHWWbVY= +-----END CERTIFICATE----- + +# Issuer: CN=T-TeleSec GlobalRoot Class 2 O=T-Systems Enterprise Services GmbH OU=T-Systems Trust Center +# Subject: CN=T-TeleSec GlobalRoot Class 2 O=T-Systems Enterprise Services GmbH OU=T-Systems Trust Center +# Label: "T-TeleSec GlobalRoot Class 2" +# Serial: 1 +# MD5 Fingerprint: 2b:9b:9e:e4:7b:6c:1f:00:72:1a:cc:c1:77:79:df:6a +# SHA1 Fingerprint: 59:0d:2d:7d:88:4f:40:2e:61:7e:a5:62:32:17:65:cf:17:d8:94:e9 +# SHA256 Fingerprint: 91:e2:f5:78:8d:58:10:eb:a7:ba:58:73:7d:e1:54:8a:8e:ca:cd:01:45:98:bc:0b:14:3e:04:1b:17:05:25:52 +-----BEGIN CERTIFICATE----- +MIIDwzCCAqugAwIBAgIBATANBgkqhkiG9w0BAQsFADCBgjELMAkGA1UEBhMCREUx +KzApBgNVBAoMIlQtU3lzdGVtcyBFbnRlcnByaXNlIFNlcnZpY2VzIEdtYkgxHzAd +BgNVBAsMFlQtU3lzdGVtcyBUcnVzdCBDZW50ZXIxJTAjBgNVBAMMHFQtVGVsZVNl +YyBHbG9iYWxSb290IENsYXNzIDIwHhcNMDgxMDAxMTA0MDE0WhcNMzMxMDAxMjM1 +OTU5WjCBgjELMAkGA1UEBhMCREUxKzApBgNVBAoMIlQtU3lzdGVtcyBFbnRlcnBy +aXNlIFNlcnZpY2VzIEdtYkgxHzAdBgNVBAsMFlQtU3lzdGVtcyBUcnVzdCBDZW50 +ZXIxJTAjBgNVBAMMHFQtVGVsZVNlYyBHbG9iYWxSb290IENsYXNzIDIwggEiMA0G +CSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCqX9obX+hzkeXaXPSi5kfl82hVYAUd +AqSzm1nzHoqvNK38DcLZSBnuaY/JIPwhqgcZ7bBcrGXHX+0CfHt8LRvWurmAwhiC +FoT6ZrAIxlQjgeTNuUk/9k9uN0goOA/FvudocP05l03Sx5iRUKrERLMjfTlH6VJi +1hKTXrcxlkIF+3anHqP1wvzpesVsqXFP6st4vGCvx9702cu+fjOlbpSD8DT6Iavq +jnKgP6TeMFvvhk1qlVtDRKgQFRzlAVfFmPHmBiiRqiDFt1MmUUOyCxGVWOHAD3bZ +wI18gfNycJ5v/hqO2V81xrJvNHy+SE/iWjnX2J14np+GPgNeGYtEotXHAgMBAAGj +QjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBS/ +WSA2AHmgoCJrjNXyYdK4LMuCSjANBgkqhkiG9w0BAQsFAAOCAQEAMQOiYQsfdOhy +NsZt+U2e+iKo4YFWz827n+qrkRk4r6p8FU3ztqONpfSO9kSpp+ghla0+AGIWiPAC +uvxhI+YzmzB6azZie60EI4RYZeLbK4rnJVM3YlNfvNoBYimipidx5joifsFvHZVw +IEoHNN/q/xWA5brXethbdXwFeilHfkCoMRN3zUA7tFFHei4R40cR3p1m0IvVVGb6 +g1XqfMIpiRvpb7PO4gWEyS8+eIVibslfwXhjdFjASBgMmTnrpMwatXlajRWc2BQN +9noHV8cigwUtPJslJj0Ys6lDfMjIq2SPDqO/nBudMNva0Bkuqjzx+zOAduTNrRlP +BSeOE6Fuwg== +-----END CERTIFICATE----- + +# Issuer: CN=Atos TrustedRoot 2011 O=Atos +# Subject: CN=Atos TrustedRoot 2011 O=Atos +# Label: "Atos TrustedRoot 2011" +# Serial: 6643877497813316402 +# MD5 Fingerprint: ae:b9:c4:32:4b:ac:7f:5d:66:cc:77:94:bb:2a:77:56 +# SHA1 Fingerprint: 2b:b1:f5:3e:55:0c:1d:c5:f1:d4:e6:b7:6a:46:4b:55:06:02:ac:21 +# SHA256 Fingerprint: f3:56:be:a2:44:b7:a9:1e:b3:5d:53:ca:9a:d7:86:4a:ce:01:8e:2d:35:d5:f8:f9:6d:df:68:a6:f4:1a:a4:74 +-----BEGIN CERTIFICATE----- +MIIDdzCCAl+gAwIBAgIIXDPLYixfszIwDQYJKoZIhvcNAQELBQAwPDEeMBwGA1UE +AwwVQXRvcyBUcnVzdGVkUm9vdCAyMDExMQ0wCwYDVQQKDARBdG9zMQswCQYDVQQG +EwJERTAeFw0xMTA3MDcxNDU4MzBaFw0zMDEyMzEyMzU5NTlaMDwxHjAcBgNVBAMM +FUF0b3MgVHJ1c3RlZFJvb3QgMjAxMTENMAsGA1UECgwEQXRvczELMAkGA1UEBhMC +REUwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCVhTuXbyo7LjvPpvMp +Nb7PGKw+qtn4TaA+Gke5vJrf8v7MPkfoepbCJI419KkM/IL9bcFyYie96mvr54rM +VD6QUM+A1JX76LWC1BTFtqlVJVfbsVD2sGBkWXppzwO3bw2+yj5vdHLqqjAqc2K+ +SZFhyBH+DgMq92og3AIVDV4VavzjgsG1xZ1kCWyjWZgHJ8cblithdHFsQ/H3NYkQ +4J7sVaE3IqKHBAUsR320HLliKWYoyrfhk/WklAOZuXCFteZI6o1Q/NnezG8HDt0L +cp2AMBYHlT8oDv3FdU9T1nSatCQujgKRz3bFmx5VdJx4IbHwLfELn8LVlhgf8FQi +eowHAgMBAAGjfTB7MB0GA1UdDgQWBBSnpQaxLKYJYO7Rl+lwrrw7GWzbITAPBgNV +HRMBAf8EBTADAQH/MB8GA1UdIwQYMBaAFKelBrEspglg7tGX6XCuvDsZbNshMBgG +A1UdIAQRMA8wDQYLKwYBBAGwLQMEAQEwDgYDVR0PAQH/BAQDAgGGMA0GCSqGSIb3 +DQEBCwUAA4IBAQAmdzTblEiGKkGdLD4GkGDEjKwLVLgfuXvTBznk+j57sj1O7Z8j +vZfza1zv7v1Apt+hk6EKhqzvINB5Ab149xnYJDE0BAGmuhWawyfc2E8PzBhj/5kP +DpFrdRbhIfzYJsdHt6bPWHJxfrrhTZVHO8mvbaG0weyJ9rQPOLXiZNwlz6bb65pc +maHFCN795trV1lpFDMS3wrUU77QR/w4VtfX128a961qn8FYiqTxlVMYVqL2Gns2D +lmh6cYGJ4Qvh6hEbaAjMaZ7snkGeRDImeuKHCnE96+RapNLbxc3G3mB/ufNPRJLv +KrcYPqcZ2Qt9sTdBQrC6YB3y/gkRsPCHe6ed +-----END CERTIFICATE----- + +# Issuer: CN=QuoVadis Root CA 1 G3 O=QuoVadis Limited +# Subject: CN=QuoVadis Root CA 1 G3 O=QuoVadis Limited +# Label: "QuoVadis Root CA 1 G3" +# Serial: 687049649626669250736271037606554624078720034195 +# MD5 Fingerprint: a4:bc:5b:3f:fe:37:9a:fa:64:f0:e2:fa:05:3d:0b:ab +# SHA1 Fingerprint: 1b:8e:ea:57:96:29:1a:c9:39:ea:b8:0a:81:1a:73:73:c0:93:79:67 +# SHA256 Fingerprint: 8a:86:6f:d1:b2:76:b5:7e:57:8e:92:1c:65:82:8a:2b:ed:58:e9:f2:f2:88:05:41:34:b7:f1:f4:bf:c9:cc:74 +-----BEGIN CERTIFICATE----- +MIIFYDCCA0igAwIBAgIUeFhfLq0sGUvjNwc1NBMotZbUZZMwDQYJKoZIhvcNAQEL +BQAwSDELMAkGA1UEBhMCQk0xGTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxHjAc +BgNVBAMTFVF1b1ZhZGlzIFJvb3QgQ0EgMSBHMzAeFw0xMjAxMTIxNzI3NDRaFw00 +MjAxMTIxNzI3NDRaMEgxCzAJBgNVBAYTAkJNMRkwFwYDVQQKExBRdW9WYWRpcyBM +aW1pdGVkMR4wHAYDVQQDExVRdW9WYWRpcyBSb290IENBIDEgRzMwggIiMA0GCSqG +SIb3DQEBAQUAA4ICDwAwggIKAoICAQCgvlAQjunybEC0BJyFuTHK3C3kEakEPBtV +wedYMB0ktMPvhd6MLOHBPd+C5k+tR4ds7FtJwUrVu4/sh6x/gpqG7D0DmVIB0jWe +rNrwU8lmPNSsAgHaJNM7qAJGr6Qc4/hzWHa39g6QDbXwz8z6+cZM5cOGMAqNF341 +68Xfuw6cwI2H44g4hWf6Pser4BOcBRiYz5P1sZK0/CPTz9XEJ0ngnjybCKOLXSoh +4Pw5qlPafX7PGglTvF0FBM+hSo+LdoINofjSxxR3W5A2B4GbPgb6Ul5jxaYA/qXp +UhtStZI5cgMJYr2wYBZupt0lwgNm3fME0UDiTouG9G/lg6AnhF4EwfWQvTA9xO+o +abw4m6SkltFi2mnAAZauy8RRNOoMqv8hjlmPSlzkYZqn0ukqeI1RPToV7qJZjqlc +3sX5kCLliEVx3ZGZbHqfPT2YfF72vhZooF6uCyP8Wg+qInYtyaEQHeTTRCOQiJ/G +KubX9ZqzWB4vMIkIG1SitZgj7Ah3HJVdYdHLiZxfokqRmu8hqkkWCKi9YSgxyXSt +hfbZxbGL0eUQMk1fiyA6PEkfM4VZDdvLCXVDaXP7a3F98N/ETH3Goy7IlXnLc6KO +Tk0k+17kBL5yG6YnLUlamXrXXAkgt3+UuU/xDRxeiEIbEbfnkduebPRq34wGmAOt +zCjvpUfzUwIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIB +BjAdBgNVHQ4EFgQUo5fW816iEOGrRZ88F2Q87gFwnMwwDQYJKoZIhvcNAQELBQAD +ggIBABj6W3X8PnrHX3fHyt/PX8MSxEBd1DKquGrX1RUVRpgjpeaQWxiZTOOtQqOC +MTaIzen7xASWSIsBx40Bz1szBpZGZnQdT+3Btrm0DWHMY37XLneMlhwqI2hrhVd2 +cDMT/uFPpiN3GPoajOi9ZcnPP/TJF9zrx7zABC4tRi9pZsMbj/7sPtPKlL92CiUN +qXsCHKnQO18LwIE6PWThv6ctTr1NxNgpxiIY0MWscgKCP6o6ojoilzHdCGPDdRS5 +YCgtW2jgFqlmgiNR9etT2DGbe+m3nUvriBbP+V04ikkwj+3x6xn0dxoxGE1nVGwv +b2X52z3sIexe9PSLymBlVNFxZPT5pqOBMzYzcfCkeF9OrYMh3jRJjehZrJ3ydlo2 +8hP0r+AJx2EqbPfgna67hkooby7utHnNkDPDs3b69fBsnQGQ+p6Q9pxyz0fawx/k +NSBT8lTR32GDpgLiJTjehTItXnOQUl1CxM49S+H5GYQd1aJQzEH7QRTDvdbJWqNj +ZgKAvQU6O0ec7AAmTPWIUb+oI38YB7AL7YsmoWTTYUrrXJ/es69nA7Mf3W1daWhp +q1467HxpvMc7hU6eFbm0FU/DlXpY18ls6Wy58yljXrQs8C097Vpl4KlbQMJImYFt +nh8GKjwStIsPm6Ik8KaN1nrgS7ZklmOVhMJKzRwuJIczYOXD +-----END CERTIFICATE----- + +# Issuer: CN=QuoVadis Root CA 2 G3 O=QuoVadis Limited +# Subject: CN=QuoVadis Root CA 2 G3 O=QuoVadis Limited +# Label: "QuoVadis Root CA 2 G3" +# Serial: 390156079458959257446133169266079962026824725800 +# MD5 Fingerprint: af:0c:86:6e:bf:40:2d:7f:0b:3e:12:50:ba:12:3d:06 +# SHA1 Fingerprint: 09:3c:61:f3:8b:8b:dc:7d:55:df:75:38:02:05:00:e1:25:f5:c8:36 +# SHA256 Fingerprint: 8f:e4:fb:0a:f9:3a:4d:0d:67:db:0b:eb:b2:3e:37:c7:1b:f3:25:dc:bc:dd:24:0e:a0:4d:af:58:b4:7e:18:40 +-----BEGIN CERTIFICATE----- +MIIFYDCCA0igAwIBAgIURFc0JFuBiZs18s64KztbpybwdSgwDQYJKoZIhvcNAQEL +BQAwSDELMAkGA1UEBhMCQk0xGTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxHjAc +BgNVBAMTFVF1b1ZhZGlzIFJvb3QgQ0EgMiBHMzAeFw0xMjAxMTIxODU5MzJaFw00 +MjAxMTIxODU5MzJaMEgxCzAJBgNVBAYTAkJNMRkwFwYDVQQKExBRdW9WYWRpcyBM +aW1pdGVkMR4wHAYDVQQDExVRdW9WYWRpcyBSb290IENBIDIgRzMwggIiMA0GCSqG +SIb3DQEBAQUAA4ICDwAwggIKAoICAQChriWyARjcV4g/Ruv5r+LrI3HimtFhZiFf +qq8nUeVuGxbULX1QsFN3vXg6YOJkApt8hpvWGo6t/x8Vf9WVHhLL5hSEBMHfNrMW +n4rjyduYNM7YMxcoRvynyfDStNVNCXJJ+fKH46nafaF9a7I6JaltUkSs+L5u+9ym +c5GQYaYDFCDy54ejiK2toIz/pgslUiXnFgHVy7g1gQyjO/Dh4fxaXc6AcW34Sas+ +O7q414AB+6XrW7PFXmAqMaCvN+ggOp+oMiwMzAkd056OXbxMmO7FGmh77FOm6RQ1 +o9/NgJ8MSPsc9PG/Srj61YxxSscfrf5BmrODXfKEVu+lV0POKa2Mq1W/xPtbAd0j +IaFYAI7D0GoT7RPjEiuA3GfmlbLNHiJuKvhB1PLKFAeNilUSxmn1uIZoL1NesNKq +IcGY5jDjZ1XHm26sGahVpkUG0CM62+tlXSoREfA7T8pt9DTEceT/AFr2XK4jYIVz +8eQQsSWu1ZK7E8EM4DnatDlXtas1qnIhO4M15zHfeiFuuDIIfR0ykRVKYnLP43eh +vNURG3YBZwjgQQvD6xVu+KQZ2aKrr+InUlYrAoosFCT5v0ICvybIxo/gbjh9Uy3l +7ZizlWNof/k19N+IxWA1ksB8aRxhlRbQ694Lrz4EEEVlWFA4r0jyWbYW8jwNkALG +cC4BrTwV1wIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIB +BjAdBgNVHQ4EFgQU7edvdlq/YOxJW8ald7tyFnGbxD0wDQYJKoZIhvcNAQELBQAD +ggIBAJHfgD9DCX5xwvfrs4iP4VGyvD11+ShdyLyZm3tdquXK4Qr36LLTn91nMX66 +AarHakE7kNQIXLJgapDwyM4DYvmL7ftuKtwGTTwpD4kWilhMSA/ohGHqPHKmd+RC +roijQ1h5fq7KpVMNqT1wvSAZYaRsOPxDMuHBR//47PERIjKWnML2W2mWeyAMQ0Ga +W/ZZGYjeVYg3UQt4XAoeo0L9x52ID8DyeAIkVJOviYeIyUqAHerQbj5hLja7NQ4n +lv1mNDthcnPxFlxHBlRJAHpYErAK74X9sbgzdWqTHBLmYF5vHX/JHyPLhGGfHoJE ++V+tYlUkmlKY7VHnoX6XOuYvHxHaU4AshZ6rNRDbIl9qxV6XU/IyAgkwo1jwDQHV +csaxfGl7w/U2Rcxhbl5MlMVerugOXou/983g7aEOGzPuVBj+D77vfoRrQ+NwmNtd +dbINWQeFFSM51vHfqSYP1kjHs6Yi9TM3WpVHn3u6GBVv/9YUZINJ0gpnIdsPNWNg +KCLjsZWDzYWm3S8P52dSbrsvhXz1SnPnxT7AvSESBT/8twNJAlvIJebiVDj1eYeM +HVOyToV7BjjHLPj4sHKNJeV3UvQDHEimUF+IIDBu8oJDqz2XhOdT+yHBTw8imoa4 +WSr2Rz0ZiC3oheGe7IUIarFsNMkd7EgrO3jtZsSOeWmD3n+M +-----END CERTIFICATE----- + +# Issuer: CN=QuoVadis Root CA 3 G3 O=QuoVadis Limited +# Subject: CN=QuoVadis Root CA 3 G3 O=QuoVadis Limited +# Label: "QuoVadis Root CA 3 G3" +# Serial: 268090761170461462463995952157327242137089239581 +# MD5 Fingerprint: df:7d:b9:ad:54:6f:68:a1:df:89:57:03:97:43:b0:d7 +# SHA1 Fingerprint: 48:12:bd:92:3c:a8:c4:39:06:e7:30:6d:27:96:e6:a4:cf:22:2e:7d +# SHA256 Fingerprint: 88:ef:81:de:20:2e:b0:18:45:2e:43:f8:64:72:5c:ea:5f:bd:1f:c2:d9:d2:05:73:07:09:c5:d8:b8:69:0f:46 +-----BEGIN CERTIFICATE----- +MIIFYDCCA0igAwIBAgIULvWbAiin23r/1aOp7r0DoM8Sah0wDQYJKoZIhvcNAQEL +BQAwSDELMAkGA1UEBhMCQk0xGTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxHjAc +BgNVBAMTFVF1b1ZhZGlzIFJvb3QgQ0EgMyBHMzAeFw0xMjAxMTIyMDI2MzJaFw00 +MjAxMTIyMDI2MzJaMEgxCzAJBgNVBAYTAkJNMRkwFwYDVQQKExBRdW9WYWRpcyBM +aW1pdGVkMR4wHAYDVQQDExVRdW9WYWRpcyBSb290IENBIDMgRzMwggIiMA0GCSqG +SIb3DQEBAQUAA4ICDwAwggIKAoICAQCzyw4QZ47qFJenMioKVjZ/aEzHs286IxSR +/xl/pcqs7rN2nXrpixurazHb+gtTTK/FpRp5PIpM/6zfJd5O2YIyC0TeytuMrKNu +FoM7pmRLMon7FhY4futD4tN0SsJiCnMK3UmzV9KwCoWdcTzeo8vAMvMBOSBDGzXR +U7Ox7sWTaYI+FrUoRqHe6okJ7UO4BUaKhvVZR74bbwEhELn9qdIoyhA5CcoTNs+c +ra1AdHkrAj80//ogaX3T7mH1urPnMNA3I4ZyYUUpSFlob3emLoG+B01vr87ERROR +FHAGjx+f+IdpsQ7vw4kZ6+ocYfx6bIrc1gMLnia6Et3UVDmrJqMz6nWB2i3ND0/k +A9HvFZcba5DFApCTZgIhsUfei5pKgLlVj7WiL8DWM2fafsSntARE60f75li59wzw +eyuxwHApw0BiLTtIadwjPEjrewl5qW3aqDCYz4ByA4imW0aucnl8CAMhZa634Ryl +sSqiMd5mBPfAdOhx3v89WcyWJhKLhZVXGqtrdQtEPREoPHtht+KPZ0/l7DxMYIBp +VzgeAVuNVejH38DMdyM0SXV89pgR6y3e7UEuFAUCf+D+IOs15xGsIs5XPd7JMG0Q +A4XN8f+MFrXBsj6IbGB/kE+V9/YtrQE5BwT6dYB9v0lQ7e/JxHwc64B+27bQ3RP+ +ydOc17KXqQIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIB +BjAdBgNVHQ4EFgQUxhfQvKjqAkPyGwaZXSuQILnXnOQwDQYJKoZIhvcNAQELBQAD +ggIBADRh2Va1EodVTd2jNTFGu6QHcrxfYWLopfsLN7E8trP6KZ1/AvWkyaiTt3px +KGmPc+FSkNrVvjrlt3ZqVoAh313m6Tqe5T72omnHKgqwGEfcIHB9UqM+WXzBusnI +FUBhynLWcKzSt/Ac5IYp8M7vaGPQtSCKFWGafoaYtMnCdvvMujAWzKNhxnQT5Wvv +oxXqA/4Ti2Tk08HS6IT7SdEQTXlm66r99I0xHnAUrdzeZxNMgRVhvLfZkXdxGYFg +u/BYpbWcC/ePIlUnwEsBbTuZDdQdm2NnL9DuDcpmvJRPpq3t/O5jrFc/ZSXPsoaP +0Aj/uHYUbt7lJ+yreLVTubY/6CD50qi+YUbKh4yE8/nxoGibIh6BJpsQBJFxwAYf +3KDTuVan45gtf4Od34wrnDKOMpTwATwiKp9Dwi7DmDkHOHv8XgBCH/MyJnmDhPbl +8MFREsALHgQjDFSlTC9JxUrRtm5gDWv8a4uFJGS3iQ6rJUdbPM9+Sb3H6QrG2vd+ +DhcI00iX0HGS8A85PjRqHH3Y8iKuu2n0M7SmSFXRDw4m6Oy2Cy2nhTXN/VnIn9HN +PlopNLk9hM6xZdRZkZFWdSHBd575euFgndOtBBj0fOtek49TSiIp+EgrPk2GrFt/ +ywaZWWDYWGWVjUTR939+J399roD1B0y2PpxxVJkES/1Y+Zj0 +-----END CERTIFICATE----- + +# Issuer: CN=DigiCert Assured ID Root G2 O=DigiCert Inc OU=www.digicert.com +# Subject: CN=DigiCert Assured ID Root G2 O=DigiCert Inc OU=www.digicert.com +# Label: "DigiCert Assured ID Root G2" +# Serial: 15385348160840213938643033620894905419 +# MD5 Fingerprint: 92:38:b9:f8:63:24:82:65:2c:57:33:e6:fe:81:8f:9d +# SHA1 Fingerprint: a1:4b:48:d9:43:ee:0a:0e:40:90:4f:3c:e0:a4:c0:91:93:51:5d:3f +# SHA256 Fingerprint: 7d:05:eb:b6:82:33:9f:8c:94:51:ee:09:4e:eb:fe:fa:79:53:a1:14:ed:b2:f4:49:49:45:2f:ab:7d:2f:c1:85 +-----BEGIN CERTIFICATE----- +MIIDljCCAn6gAwIBAgIQC5McOtY5Z+pnI7/Dr5r0SzANBgkqhkiG9w0BAQsFADBl +MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3 +d3cuZGlnaWNlcnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJv +b3QgRzIwHhcNMTMwODAxMTIwMDAwWhcNMzgwMTE1MTIwMDAwWjBlMQswCQYDVQQG +EwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNl +cnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgRzIwggEi +MA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDZ5ygvUj82ckmIkzTz+GoeMVSA +n61UQbVH35ao1K+ALbkKz3X9iaV9JPrjIgwrvJUXCzO/GU1BBpAAvQxNEP4Htecc +biJVMWWXvdMX0h5i89vqbFCMP4QMls+3ywPgym2hFEwbid3tALBSfK+RbLE4E9Hp +EgjAALAcKxHad3A2m67OeYfcgnDmCXRwVWmvo2ifv922ebPynXApVfSr/5Vh88lA +bx3RvpO704gqu52/clpWcTs/1PPRCv4o76Pu2ZmvA9OPYLfykqGxvYmJHzDNw6Yu +YjOuFgJ3RFrngQo8p0Quebg/BLxcoIfhG69Rjs3sLPr4/m3wOnyqi+RnlTGNAgMB +AAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgGGMB0GA1UdDgQW +BBTOw0q5mVXyuNtgv6l+vVa1lzan1jANBgkqhkiG9w0BAQsFAAOCAQEAyqVVjOPI +QW5pJ6d1Ee88hjZv0p3GeDgdaZaikmkuOGybfQTUiaWxMTeKySHMq2zNixya1r9I +0jJmwYrA8y8678Dj1JGG0VDjA9tzd29KOVPt3ibHtX2vK0LRdWLjSisCx1BL4Gni +lmwORGYQRI+tBev4eaymG+g3NJ1TyWGqolKvSnAWhsI6yLETcDbYz+70CjTVW0z9 +B5yiutkBclzzTcHdDrEcDcRjvq30FPuJ7KJBDkzMyFdA0G4Dqs0MjomZmWzwPDCv +ON9vvKO+KSAnq3T/EyJ43pdSVR6DtVQgA+6uwE9W3jfMw3+qBCe703e4YtsXfJwo +IhNzbM8m9Yop5w== +-----END CERTIFICATE----- + +# Issuer: CN=DigiCert Assured ID Root G3 O=DigiCert Inc OU=www.digicert.com +# Subject: CN=DigiCert Assured ID Root G3 O=DigiCert Inc OU=www.digicert.com +# Label: "DigiCert Assured ID Root G3" +# Serial: 15459312981008553731928384953135426796 +# MD5 Fingerprint: 7c:7f:65:31:0c:81:df:8d:ba:3e:99:e2:5c:ad:6e:fb +# SHA1 Fingerprint: f5:17:a2:4f:9a:48:c6:c9:f8:a2:00:26:9f:dc:0f:48:2c:ab:30:89 +# SHA256 Fingerprint: 7e:37:cb:8b:4c:47:09:0c:ab:36:55:1b:a6:f4:5d:b8:40:68:0f:ba:16:6a:95:2d:b1:00:71:7f:43:05:3f:c2 +-----BEGIN CERTIFICATE----- +MIICRjCCAc2gAwIBAgIQC6Fa+h3foLVJRK/NJKBs7DAKBggqhkjOPQQDAzBlMQsw +CQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cu +ZGlnaWNlcnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3Qg +RzMwHhcNMTMwODAxMTIwMDAwWhcNMzgwMTE1MTIwMDAwWjBlMQswCQYDVQQGEwJV +UzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQu +Y29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgRzMwdjAQBgcq +hkjOPQIBBgUrgQQAIgNiAAQZ57ysRGXtzbg/WPuNsVepRC0FFfLvC/8QdJ+1YlJf +Zn4f5dwbRXkLzMZTCp2NXQLZqVneAlr2lSoOjThKiknGvMYDOAdfVdp+CW7if17Q +RSAPWXYQ1qAk8C3eNvJsKTmjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/ +BAQDAgGGMB0GA1UdDgQWBBTL0L2p4ZgFUaFNN6KDec6NHSrkhDAKBggqhkjOPQQD +AwNnADBkAjAlpIFFAmsSS3V0T8gj43DydXLefInwz5FyYZ5eEJJZVrmDxxDnOOlY +JjZ91eQ0hjkCMHw2U/Aw5WJjOpnitqM7mzT6HtoQknFekROn3aRukswy1vUhZscv +6pZjamVFkpUBtA== +-----END CERTIFICATE----- + +# Issuer: CN=DigiCert Global Root G2 O=DigiCert Inc OU=www.digicert.com +# Subject: CN=DigiCert Global Root G2 O=DigiCert Inc OU=www.digicert.com +# Label: "DigiCert Global Root G2" +# Serial: 4293743540046975378534879503202253541 +# MD5 Fingerprint: e4:a6:8a:c8:54:ac:52:42:46:0a:fd:72:48:1b:2a:44 +# SHA1 Fingerprint: df:3c:24:f9:bf:d6:66:76:1b:26:80:73:fe:06:d1:cc:8d:4f:82:a4 +# SHA256 Fingerprint: cb:3c:cb:b7:60:31:e5:e0:13:8f:8d:d3:9a:23:f9:de:47:ff:c3:5e:43:c1:14:4c:ea:27:d4:6a:5a:b1:cb:5f +-----BEGIN CERTIFICATE----- +MIIDjjCCAnagAwIBAgIQAzrx5qcRqaC7KGSxHQn65TANBgkqhkiG9w0BAQsFADBh +MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3 +d3cuZGlnaWNlcnQuY29tMSAwHgYDVQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBH +MjAeFw0xMzA4MDExMjAwMDBaFw0zODAxMTUxMjAwMDBaMGExCzAJBgNVBAYTAlVT +MRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3dy5kaWdpY2VydC5j +b20xIDAeBgNVBAMTF0RpZ2lDZXJ0IEdsb2JhbCBSb290IEcyMIIBIjANBgkqhkiG +9w0BAQEFAAOCAQ8AMIIBCgKCAQEAuzfNNNx7a8myaJCtSnX/RrohCgiN9RlUyfuI +2/Ou8jqJkTx65qsGGmvPrC3oXgkkRLpimn7Wo6h+4FR1IAWsULecYxpsMNzaHxmx +1x7e/dfgy5SDN67sH0NO3Xss0r0upS/kqbitOtSZpLYl6ZtrAGCSYP9PIUkY92eQ +q2EGnI/yuum06ZIya7XzV+hdG82MHauVBJVJ8zUtluNJbd134/tJS7SsVQepj5Wz +tCO7TG1F8PapspUwtP1MVYwnSlcUfIKdzXOS0xZKBgyMUNGPHgm+F6HmIcr9g+UQ +vIOlCsRnKPZzFBQ9RnbDhxSJITRNrw9FDKZJobq7nMWxM4MphQIDAQABo0IwQDAP +BgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBhjAdBgNVHQ4EFgQUTiJUIBiV +5uNu5g/6+rkS7QYXjzkwDQYJKoZIhvcNAQELBQADggEBAGBnKJRvDkhj6zHd6mcY +1Yl9PMWLSn/pvtsrF9+wX3N3KjITOYFnQoQj8kVnNeyIv/iPsGEMNKSuIEyExtv4 +NeF22d+mQrvHRAiGfzZ0JFrabA0UWTW98kndth/Jsw1HKj2ZL7tcu7XUIOGZX1NG +Fdtom/DzMNU+MeKNhJ7jitralj41E6Vf8PlwUHBHQRFXGU7Aj64GxJUTFy8bJZ91 +8rGOmaFvE7FBcf6IKshPECBV1/MUReXgRPTqh5Uykw7+U0b6LJ3/iyK5S9kJRaTe +pLiaWN0bfVKfjllDiIGknibVb63dDcY3fe0Dkhvld1927jyNxF1WW6LZZm6zNTfl +MrY= +-----END CERTIFICATE----- + +# Issuer: CN=DigiCert Global Root G3 O=DigiCert Inc OU=www.digicert.com +# Subject: CN=DigiCert Global Root G3 O=DigiCert Inc OU=www.digicert.com +# Label: "DigiCert Global Root G3" +# Serial: 7089244469030293291760083333884364146 +# MD5 Fingerprint: f5:5d:a4:50:a5:fb:28:7e:1e:0f:0d:cc:96:57:56:ca +# SHA1 Fingerprint: 7e:04:de:89:6a:3e:66:6d:00:e6:87:d3:3f:fa:d9:3b:e8:3d:34:9e +# SHA256 Fingerprint: 31:ad:66:48:f8:10:41:38:c7:38:f3:9e:a4:32:01:33:39:3e:3a:18:cc:02:29:6e:f9:7c:2a:c9:ef:67:31:d0 +-----BEGIN CERTIFICATE----- +MIICPzCCAcWgAwIBAgIQBVVWvPJepDU1w6QP1atFcjAKBggqhkjOPQQDAzBhMQsw +CQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cu +ZGlnaWNlcnQuY29tMSAwHgYDVQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBHMzAe +Fw0xMzA4MDExMjAwMDBaFw0zODAxMTUxMjAwMDBaMGExCzAJBgNVBAYTAlVTMRUw +EwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3dy5kaWdpY2VydC5jb20x +IDAeBgNVBAMTF0RpZ2lDZXJ0IEdsb2JhbCBSb290IEczMHYwEAYHKoZIzj0CAQYF +K4EEACIDYgAE3afZu4q4C/sLfyHS8L6+c/MzXRq8NOrexpu80JX28MzQC7phW1FG +fp4tn+6OYwwX7Adw9c+ELkCDnOg/QW07rdOkFFk2eJ0DQ+4QE2xy3q6Ip6FrtUPO +Z9wj/wMco+I+o0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBhjAd +BgNVHQ4EFgQUs9tIpPmhxdiuNkHMEWNpYim8S8YwCgYIKoZIzj0EAwMDaAAwZQIx +AK288mw/EkrRLTnDCgmXc/SINoyIJ7vmiI1Qhadj+Z4y3maTD/HMsQmP3Wyr+mt/ +oAIwOWZbwmSNuJ5Q3KjVSaLtx9zRSX8XAbjIho9OjIgrqJqpisXRAL34VOKa5Vt8 +sycX +-----END CERTIFICATE----- + +# Issuer: CN=DigiCert Trusted Root G4 O=DigiCert Inc OU=www.digicert.com +# Subject: CN=DigiCert Trusted Root G4 O=DigiCert Inc OU=www.digicert.com +# Label: "DigiCert Trusted Root G4" +# Serial: 7451500558977370777930084869016614236 +# MD5 Fingerprint: 78:f2:fc:aa:60:1f:2f:b4:eb:c9:37:ba:53:2e:75:49 +# SHA1 Fingerprint: dd:fb:16:cd:49:31:c9:73:a2:03:7d:3f:c8:3a:4d:7d:77:5d:05:e4 +# SHA256 Fingerprint: 55:2f:7b:dc:f1:a7:af:9e:6c:e6:72:01:7f:4f:12:ab:f7:72:40:c7:8e:76:1a:c2:03:d1:d9:d2:0a:c8:99:88 +-----BEGIN CERTIFICATE----- +MIIFkDCCA3igAwIBAgIQBZsbV56OITLiOQe9p3d1XDANBgkqhkiG9w0BAQwFADBi +MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3 +d3cuZGlnaWNlcnQuY29tMSEwHwYDVQQDExhEaWdpQ2VydCBUcnVzdGVkIFJvb3Qg +RzQwHhcNMTMwODAxMTIwMDAwWhcNMzgwMTE1MTIwMDAwWjBiMQswCQYDVQQGEwJV +UzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQu +Y29tMSEwHwYDVQQDExhEaWdpQ2VydCBUcnVzdGVkIFJvb3QgRzQwggIiMA0GCSqG +SIb3DQEBAQUAA4ICDwAwggIKAoICAQC/5pBzaN675F1KPDAiMGkz7MKnJS7JIT3y +ithZwuEppz1Yq3aaza57G4QNxDAf8xukOBbrVsaXbR2rsnnyyhHS5F/WBTxSD1If +xp4VpX6+n6lXFllVcq9ok3DCsrp1mWpzMpTREEQQLt+C8weE5nQ7bXHiLQwb7iDV +ySAdYyktzuxeTsiT+CFhmzTrBcZe7FsavOvJz82sNEBfsXpm7nfISKhmV1efVFiO +DCu3T6cw2Vbuyntd463JT17lNecxy9qTXtyOj4DatpGYQJB5w3jHtrHEtWoYOAMQ +jdjUN6QuBX2I9YI+EJFwq1WCQTLX2wRzKm6RAXwhTNS8rhsDdV14Ztk6MUSaM0C/ +CNdaSaTC5qmgZ92kJ7yhTzm1EVgX9yRcRo9k98FpiHaYdj1ZXUJ2h4mXaXpI8OCi +EhtmmnTK3kse5w5jrubU75KSOp493ADkRSWJtppEGSt+wJS00mFt6zPZxd9LBADM +fRyVw4/3IbKyEbe7f/LVjHAsQWCqsWMYRJUadmJ+9oCw++hkpjPRiQfhvbfmQ6QY +uKZ3AeEPlAwhHbJUKSWJbOUOUlFHdL4mrLZBdd56rF+NP8m800ERElvlEFDrMcXK +chYiCd98THU/Y+whX8QgUWtvsauGi0/C1kVfnSD8oR7FwI+isX4KJpn15GkvmB0t +9dmpsh3lGwIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIB +hjAdBgNVHQ4EFgQU7NfjgtJxXWRM3y5nP+e6mK4cD08wDQYJKoZIhvcNAQEMBQAD +ggIBALth2X2pbL4XxJEbw6GiAI3jZGgPVs93rnD5/ZpKmbnJeFwMDF/k5hQpVgs2 +SV1EY+CtnJYYZhsjDT156W1r1lT40jzBQ0CuHVD1UvyQO7uYmWlrx8GnqGikJ9yd ++SeuMIW59mdNOj6PWTkiU0TryF0Dyu1Qen1iIQqAyHNm0aAFYF/opbSnr6j3bTWc +fFqK1qI4mfN4i/RN0iAL3gTujJtHgXINwBQy7zBZLq7gcfJW5GqXb5JQbZaNaHqa +sjYUegbyJLkJEVDXCLG4iXqEI2FCKeWjzaIgQdfRnGTZ6iahixTXTBmyUEFxPT9N +cCOGDErcgdLMMpSEDQgJlxxPwO5rIHQw0uA5NBCFIRUBCOhVMt5xSdkoF1BN5r5N +0XWs0Mr7QbhDparTwwVETyw2m+L64kW4I1NsBm9nVX9GtUw/bihaeSbSpKhil9Ie +4u1Ki7wb/UdKDd9nZn6yW0HQO+T0O/QEY+nvwlQAUaCKKsnOeMzV6ocEGLPOr0mI +r/OSmbaz5mEP0oUA51Aa5BuVnRmhuZyxm7EAHu/QD09CbMkKvO5D+jpxpchNJqU1 +/YldvIViHTLSoCtU7ZpXwdv6EM8Zt4tKG48BtieVU+i2iW1bvGjUI+iLUaJW+fCm +gKDWHrO8Dw9TdSmq6hN35N6MgSGtBxBHEa2HPQfRdbzP82Z+ +-----END CERTIFICATE----- + +# Issuer: CN=COMODO RSA Certification Authority O=COMODO CA Limited +# Subject: CN=COMODO RSA Certification Authority O=COMODO CA Limited +# Label: "COMODO RSA Certification Authority" +# Serial: 101909084537582093308941363524873193117 +# MD5 Fingerprint: 1b:31:b0:71:40:36:cc:14:36:91:ad:c4:3e:fd:ec:18 +# SHA1 Fingerprint: af:e5:d2:44:a8:d1:19:42:30:ff:47:9f:e2:f8:97:bb:cd:7a:8c:b4 +# SHA256 Fingerprint: 52:f0:e1:c4:e5:8e:c6:29:29:1b:60:31:7f:07:46:71:b8:5d:7e:a8:0d:5b:07:27:34:63:53:4b:32:b4:02:34 +-----BEGIN CERTIFICATE----- +MIIF2DCCA8CgAwIBAgIQTKr5yttjb+Af907YWwOGnTANBgkqhkiG9w0BAQwFADCB +hTELMAkGA1UEBhMCR0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4G +A1UEBxMHU2FsZm9yZDEaMBgGA1UEChMRQ09NT0RPIENBIExpbWl0ZWQxKzApBgNV +BAMTIkNPTU9ETyBSU0EgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMTAwMTE5 +MDAwMDAwWhcNMzgwMTE4MjM1OTU5WjCBhTELMAkGA1UEBhMCR0IxGzAZBgNVBAgT +EkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UEBxMHU2FsZm9yZDEaMBgGA1UEChMR +Q09NT0RPIENBIExpbWl0ZWQxKzApBgNVBAMTIkNPTU9ETyBSU0EgQ2VydGlmaWNh +dGlvbiBBdXRob3JpdHkwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCR +6FSS0gpWsawNJN3Fz0RndJkrN6N9I3AAcbxT38T6KhKPS38QVr2fcHK3YX/JSw8X +pz3jsARh7v8Rl8f0hj4K+j5c+ZPmNHrZFGvnnLOFoIJ6dq9xkNfs/Q36nGz637CC +9BR++b7Epi9Pf5l/tfxnQ3K9DADWietrLNPtj5gcFKt+5eNu/Nio5JIk2kNrYrhV +/erBvGy2i/MOjZrkm2xpmfh4SDBF1a3hDTxFYPwyllEnvGfDyi62a+pGx8cgoLEf +Zd5ICLqkTqnyg0Y3hOvozIFIQ2dOciqbXL1MGyiKXCJ7tKuY2e7gUYPDCUZObT6Z ++pUX2nwzV0E8jVHtC7ZcryxjGt9XyD+86V3Em69FmeKjWiS0uqlWPc9vqv9JWL7w +qP/0uK3pN/u6uPQLOvnoQ0IeidiEyxPx2bvhiWC4jChWrBQdnArncevPDt09qZah +SL0896+1DSJMwBGB7FY79tOi4lu3sgQiUpWAk2nojkxl8ZEDLXB0AuqLZxUpaVIC +u9ffUGpVRr+goyhhf3DQw6KqLCGqR84onAZFdr+CGCe01a60y1Dma/RMhnEw6abf +Fobg2P9A3fvQQoh/ozM6LlweQRGBY84YcWsr7KaKtzFcOmpH4MN5WdYgGq/yapiq +crxXStJLnbsQ/LBMQeXtHT1eKJ2czL+zUdqnR+WEUwIDAQABo0IwQDAdBgNVHQ4E +FgQUu69+Aj36pvE8hI6t7jiY7NkyMtQwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB +/wQFMAMBAf8wDQYJKoZIhvcNAQEMBQADggIBAArx1UaEt65Ru2yyTUEUAJNMnMvl +wFTPoCWOAvn9sKIN9SCYPBMtrFaisNZ+EZLpLrqeLppysb0ZRGxhNaKatBYSaVqM +4dc+pBroLwP0rmEdEBsqpIt6xf4FpuHA1sj+nq6PK7o9mfjYcwlYRm6mnPTXJ9OV +2jeDchzTc+CiR5kDOF3VSXkAKRzH7JsgHAckaVd4sjn8OoSgtZx8jb8uk2Intzna +FxiuvTwJaP+EmzzV1gsD41eeFPfR60/IvYcjt7ZJQ3mFXLrrkguhxuhoqEwWsRqZ +CuhTLJK7oQkYdQxlqHvLI7cawiiFwxv/0Cti76R7CZGYZ4wUAc1oBmpjIXUDgIiK +boHGhfKppC3n9KUkEEeDys30jXlYsQab5xoq2Z0B15R97QNKyvDb6KkBPvVWmcke +jkk9u+UJueBPSZI9FoJAzMxZxuY67RIuaTxslbH9qh17f4a+Hg4yRvv7E491f0yL +S0Zj/gA0QHDBw7mh3aZw4gSzQbzpgJHqZJx64SIDqZxubw5lT2yHh17zbqD5daWb +QOhTsiedSrnAdyGN/4fy3ryM7xfft0kL0fJuMAsaDk527RH89elWsn2/x20Kk4yl +0MC2Hb46TpSi125sC8KKfPog88Tk5c0NqMuRkrF8hey1FGlmDoLnzc7ILaZRfyHB +NVOFBkpdn627G190 +-----END CERTIFICATE----- + +# Issuer: CN=USERTrust RSA Certification Authority O=The USERTRUST Network +# Subject: CN=USERTrust RSA Certification Authority O=The USERTRUST Network +# Label: "USERTrust RSA Certification Authority" +# Serial: 2645093764781058787591871645665788717 +# MD5 Fingerprint: 1b:fe:69:d1:91:b7:19:33:a3:72:a8:0f:e1:55:e5:b5 +# SHA1 Fingerprint: 2b:8f:1b:57:33:0d:bb:a2:d0:7a:6c:51:f7:0e:e9:0d:da:b9:ad:8e +# SHA256 Fingerprint: e7:93:c9:b0:2f:d8:aa:13:e2:1c:31:22:8a:cc:b0:81:19:64:3b:74:9c:89:89:64:b1:74:6d:46:c3:d4:cb:d2 +-----BEGIN CERTIFICATE----- +MIIF3jCCA8agAwIBAgIQAf1tMPyjylGoG7xkDjUDLTANBgkqhkiG9w0BAQwFADCB +iDELMAkGA1UEBhMCVVMxEzARBgNVBAgTCk5ldyBKZXJzZXkxFDASBgNVBAcTC0pl +cnNleSBDaXR5MR4wHAYDVQQKExVUaGUgVVNFUlRSVVNUIE5ldHdvcmsxLjAsBgNV +BAMTJVVTRVJUcnVzdCBSU0EgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMTAw +MjAxMDAwMDAwWhcNMzgwMTE4MjM1OTU5WjCBiDELMAkGA1UEBhMCVVMxEzARBgNV +BAgTCk5ldyBKZXJzZXkxFDASBgNVBAcTC0plcnNleSBDaXR5MR4wHAYDVQQKExVU +aGUgVVNFUlRSVVNUIE5ldHdvcmsxLjAsBgNVBAMTJVVTRVJUcnVzdCBSU0EgQ2Vy +dGlmaWNhdGlvbiBBdXRob3JpdHkwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIK +AoICAQCAEmUXNg7D2wiz0KxXDXbtzSfTTK1Qg2HiqiBNCS1kCdzOiZ/MPans9s/B +3PHTsdZ7NygRK0faOca8Ohm0X6a9fZ2jY0K2dvKpOyuR+OJv0OwWIJAJPuLodMkY +tJHUYmTbf6MG8YgYapAiPLz+E/CHFHv25B+O1ORRxhFnRghRy4YUVD+8M/5+bJz/ +Fp0YvVGONaanZshyZ9shZrHUm3gDwFA66Mzw3LyeTP6vBZY1H1dat//O+T23LLb2 +VN3I5xI6Ta5MirdcmrS3ID3KfyI0rn47aGYBROcBTkZTmzNg95S+UzeQc0PzMsNT +79uq/nROacdrjGCT3sTHDN/hMq7MkztReJVni+49Vv4M0GkPGw/zJSZrM233bkf6 +c0Plfg6lZrEpfDKEY1WJxA3Bk1QwGROs0303p+tdOmw1XNtB1xLaqUkL39iAigmT +Yo61Zs8liM2EuLE/pDkP2QKe6xJMlXzzawWpXhaDzLhn4ugTncxbgtNMs+1b/97l +c6wjOy0AvzVVdAlJ2ElYGn+SNuZRkg7zJn0cTRe8yexDJtC/QV9AqURE9JnnV4ee +UB9XVKg+/XRjL7FQZQnmWEIuQxpMtPAlR1n6BB6T1CZGSlCBst6+eLf8ZxXhyVeE +Hg9j1uliutZfVS7qXMYoCAQlObgOK6nyTJccBz8NUvXt7y+CDwIDAQABo0IwQDAd +BgNVHQ4EFgQUU3m/WqorSs9UgOHYm8Cd8rIDZsswDgYDVR0PAQH/BAQDAgEGMA8G +A1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEMBQADggIBAFzUfA3P9wF9QZllDHPF +Up/L+M+ZBn8b2kMVn54CVVeWFPFSPCeHlCjtHzoBN6J2/FNQwISbxmtOuowhT6KO +VWKR82kV2LyI48SqC/3vqOlLVSoGIG1VeCkZ7l8wXEskEVX/JJpuXior7gtNn3/3 +ATiUFJVDBwn7YKnuHKsSjKCaXqeYalltiz8I+8jRRa8YFWSQEg9zKC7F4iRO/Fjs +8PRF/iKz6y+O0tlFYQXBl2+odnKPi4w2r78NBc5xjeambx9spnFixdjQg3IM8WcR +iQycE0xyNN+81XHfqnHd4blsjDwSXWXavVcStkNr/+XeTWYRUc+ZruwXtuhxkYze +Sf7dNXGiFSeUHM9h4ya7b6NnJSFd5t0dCy5oGzuCr+yDZ4XUmFF0sbmZgIn/f3gZ +XHlKYC6SQK5MNyosycdiyA5d9zZbyuAlJQG03RoHnHcAP9Dc1ew91Pq7P8yF1m9/ +qS3fuQL39ZeatTXaw2ewh0qpKJ4jjv9cJ2vhsE/zB+4ALtRZh8tSQZXq9EfX7mRB +VXyNWQKV3WKdwrnuWih0hKWbt5DHDAff9Yk2dDLWKMGwsAvgnEzDHNb842m1R0aB +L6KCq9NjRHDEjf8tM7qtj3u1cIiuPhnPQCjY/MiQu12ZIvVS5ljFH4gxQ+6IHdfG +jjxDah2nGN59PRbxYvnKkKj9 +-----END CERTIFICATE----- + +# Issuer: CN=USERTrust ECC Certification Authority O=The USERTRUST Network +# Subject: CN=USERTrust ECC Certification Authority O=The USERTRUST Network +# Label: "USERTrust ECC Certification Authority" +# Serial: 123013823720199481456569720443997572134 +# MD5 Fingerprint: fa:68:bc:d9:b5:7f:ad:fd:c9:1d:06:83:28:cc:24:c1 +# SHA1 Fingerprint: d1:cb:ca:5d:b2:d5:2a:7f:69:3b:67:4d:e5:f0:5a:1d:0c:95:7d:f0 +# SHA256 Fingerprint: 4f:f4:60:d5:4b:9c:86:da:bf:bc:fc:57:12:e0:40:0d:2b:ed:3f:bc:4d:4f:bd:aa:86:e0:6a:dc:d2:a9:ad:7a +-----BEGIN CERTIFICATE----- +MIICjzCCAhWgAwIBAgIQXIuZxVqUxdJxVt7NiYDMJjAKBggqhkjOPQQDAzCBiDEL +MAkGA1UEBhMCVVMxEzARBgNVBAgTCk5ldyBKZXJzZXkxFDASBgNVBAcTC0plcnNl +eSBDaXR5MR4wHAYDVQQKExVUaGUgVVNFUlRSVVNUIE5ldHdvcmsxLjAsBgNVBAMT +JVVTRVJUcnVzdCBFQ0MgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMTAwMjAx +MDAwMDAwWhcNMzgwMTE4MjM1OTU5WjCBiDELMAkGA1UEBhMCVVMxEzARBgNVBAgT +Ck5ldyBKZXJzZXkxFDASBgNVBAcTC0plcnNleSBDaXR5MR4wHAYDVQQKExVUaGUg +VVNFUlRSVVNUIE5ldHdvcmsxLjAsBgNVBAMTJVVTRVJUcnVzdCBFQ0MgQ2VydGlm +aWNhdGlvbiBBdXRob3JpdHkwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAAQarFRaqflo +I+d61SRvU8Za2EurxtW20eZzca7dnNYMYf3boIkDuAUU7FfO7l0/4iGzzvfUinng +o4N+LZfQYcTxmdwlkWOrfzCjtHDix6EznPO/LlxTsV+zfTJ/ijTjeXmjQjBAMB0G +A1UdDgQWBBQ64QmG1M8ZwpZ2dEl23OA1xmNjmjAOBgNVHQ8BAf8EBAMCAQYwDwYD +VR0TAQH/BAUwAwEB/zAKBggqhkjOPQQDAwNoADBlAjA2Z6EWCNzklwBBHU6+4WMB +zzuqQhFkoJ2UOQIReVx7Hfpkue4WQrO/isIJxOzksU0CMQDpKmFHjFJKS04YcPbW +RNZu9YO6bVi9JNlWSOrvxKJGgYhqOkbRqZtNyWHa0V1Xahg= +-----END CERTIFICATE----- + +# Issuer: CN=GlobalSign O=GlobalSign OU=GlobalSign ECC Root CA - R5 +# Subject: CN=GlobalSign O=GlobalSign OU=GlobalSign ECC Root CA - R5 +# Label: "GlobalSign ECC Root CA - R5" +# Serial: 32785792099990507226680698011560947931244 +# MD5 Fingerprint: 9f:ad:3b:1c:02:1e:8a:ba:17:74:38:81:0c:a2:bc:08 +# SHA1 Fingerprint: 1f:24:c6:30:cd:a4:18:ef:20:69:ff:ad:4f:dd:5f:46:3a:1b:69:aa +# SHA256 Fingerprint: 17:9f:bc:14:8a:3d:d0:0f:d2:4e:a1:34:58:cc:43:bf:a7:f5:9c:81:82:d7:83:a5:13:f6:eb:ec:10:0c:89:24 +-----BEGIN CERTIFICATE----- +MIICHjCCAaSgAwIBAgIRYFlJ4CYuu1X5CneKcflK2GwwCgYIKoZIzj0EAwMwUDEk +MCIGA1UECxMbR2xvYmFsU2lnbiBFQ0MgUm9vdCBDQSAtIFI1MRMwEQYDVQQKEwpH +bG9iYWxTaWduMRMwEQYDVQQDEwpHbG9iYWxTaWduMB4XDTEyMTExMzAwMDAwMFoX +DTM4MDExOTAzMTQwN1owUDEkMCIGA1UECxMbR2xvYmFsU2lnbiBFQ0MgUm9vdCBD +QSAtIFI1MRMwEQYDVQQKEwpHbG9iYWxTaWduMRMwEQYDVQQDEwpHbG9iYWxTaWdu +MHYwEAYHKoZIzj0CAQYFK4EEACIDYgAER0UOlvt9Xb/pOdEh+J8LttV7HpI6SFkc +8GIxLcB6KP4ap1yztsyX50XUWPrRd21DosCHZTQKH3rd6zwzocWdTaRvQZU4f8ke +hOvRnkmSh5SHDDqFSmafnVmTTZdhBoZKo0IwQDAOBgNVHQ8BAf8EBAMCAQYwDwYD +VR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUPeYpSJvqB8ohREom3m7e0oPQn1kwCgYI +KoZIzj0EAwMDaAAwZQIxAOVpEslu28YxuglB4Zf4+/2a4n0Sye18ZNPLBSWLVtmg +515dTguDnFt2KaAJJiFqYgIwcdK1j1zqO+F4CYWodZI7yFz9SO8NdCKoCOJuxUnO +xwy8p2Fp8fc74SrL+SvzZpA3 +-----END CERTIFICATE----- + +# Issuer: CN=IdenTrust Commercial Root CA 1 O=IdenTrust +# Subject: CN=IdenTrust Commercial Root CA 1 O=IdenTrust +# Label: "IdenTrust Commercial Root CA 1" +# Serial: 13298821034946342390520003877796839426 +# MD5 Fingerprint: b3:3e:77:73:75:ee:a0:d3:e3:7e:49:63:49:59:bb:c7 +# SHA1 Fingerprint: df:71:7e:aa:4a:d9:4e:c9:55:84:99:60:2d:48:de:5f:bc:f0:3a:25 +# SHA256 Fingerprint: 5d:56:49:9b:e4:d2:e0:8b:cf:ca:d0:8a:3e:38:72:3d:50:50:3b:de:70:69:48:e4:2f:55:60:30:19:e5:28:ae +-----BEGIN CERTIFICATE----- +MIIFYDCCA0igAwIBAgIQCgFCgAAAAUUjyES1AAAAAjANBgkqhkiG9w0BAQsFADBK +MQswCQYDVQQGEwJVUzESMBAGA1UEChMJSWRlblRydXN0MScwJQYDVQQDEx5JZGVu +VHJ1c3QgQ29tbWVyY2lhbCBSb290IENBIDEwHhcNMTQwMTE2MTgxMjIzWhcNMzQw +MTE2MTgxMjIzWjBKMQswCQYDVQQGEwJVUzESMBAGA1UEChMJSWRlblRydXN0MScw +JQYDVQQDEx5JZGVuVHJ1c3QgQ29tbWVyY2lhbCBSb290IENBIDEwggIiMA0GCSqG +SIb3DQEBAQUAA4ICDwAwggIKAoICAQCnUBneP5k91DNG8W9RYYKyqU+PZ4ldhNlT +3Qwo2dfw/66VQ3KZ+bVdfIrBQuExUHTRgQ18zZshq0PirK1ehm7zCYofWjK9ouuU ++ehcCuz/mNKvcbO0U59Oh++SvL3sTzIwiEsXXlfEU8L2ApeN2WIrvyQfYo3fw7gp +S0l4PJNgiCL8mdo2yMKi1CxUAGc1bnO/AljwpN3lsKImesrgNqUZFvX9t++uP0D1 +bVoE/c40yiTcdCMbXTMTEl3EASX2MN0CXZ/g1Ue9tOsbobtJSdifWwLziuQkkORi +T0/Br4sOdBeo0XKIanoBScy0RnnGF7HamB4HWfp1IYVl3ZBWzvurpWCdxJ35UrCL +vYf5jysjCiN2O/cz4ckA82n5S6LgTrx+kzmEB/dEcH7+B1rlsazRGMzyNeVJSQjK +Vsk9+w8YfYs7wRPCTY/JTw436R+hDmrfYi7LNQZReSzIJTj0+kuniVyc0uMNOYZK +dHzVWYfCP04MXFL0PfdSgvHqo6z9STQaKPNBiDoT7uje/5kdX7rL6B7yuVBgwDHT +c+XvvqDtMwt0viAgxGds8AgDelWAf0ZOlqf0Hj7h9tgJ4TNkK2PXMl6f+cB7D3hv +l7yTmvmcEpB4eoCHFddydJxVdHixuuFucAS6T6C6aMN7/zHwcz09lCqxC0EOoP5N +iGVreTO01wIDAQABo0IwQDAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB +/zAdBgNVHQ4EFgQU7UQZwNPwBovupHu+QucmVMiONnYwDQYJKoZIhvcNAQELBQAD +ggIBAA2ukDL2pkt8RHYZYR4nKM1eVO8lvOMIkPkp165oCOGUAFjvLi5+U1KMtlwH +6oi6mYtQlNeCgN9hCQCTrQ0U5s7B8jeUeLBfnLOic7iPBZM4zY0+sLj7wM+x8uwt +LRvM7Kqas6pgghstO8OEPVeKlh6cdbjTMM1gCIOQ045U8U1mwF10A0Cj7oV+wh93 +nAbowacYXVKV7cndJZ5t+qntozo00Fl72u1Q8zW/7esUTTHHYPTa8Yec4kjixsU3 ++wYQ+nVZZjFHKdp2mhzpgq7vmrlR94gjmmmVYjzlVYA211QC//G5Xc7UI2/YRYRK +W2XviQzdFKcgyxilJbQN+QHwotL0AMh0jqEqSI5l2xPE4iUXfeu+h1sXIFRRk0pT +AwvsXcoz7WL9RccvW9xYoIA55vrX/hMUpu09lEpCdNTDd1lzzY9GvlU47/rokTLq +l1gEIt44w8y8bckzOmoKaT+gyOpyj4xjhiO9bTyWnpXgSUyqorkqG5w2gXjtw+hG +4iZZRHUe2XWJUc0QhJ1hYMtd+ZciTY6Y5uN/9lu7rs3KSoFrXgvzUeF0K+l+J6fZ +mUlO+KWA2yUPHGNiiskzZ2s8EIPGrd6ozRaOjfAHN3Gf8qv8QfXBi+wAN10J5U6A +7/qxXDgGpRtK4dw4LTzcqx+QGtVKnO7RcGzM7vRX+Bi6hG6H +-----END CERTIFICATE----- + +# Issuer: CN=IdenTrust Public Sector Root CA 1 O=IdenTrust +# Subject: CN=IdenTrust Public Sector Root CA 1 O=IdenTrust +# Label: "IdenTrust Public Sector Root CA 1" +# Serial: 13298821034946342390521976156843933698 +# MD5 Fingerprint: 37:06:a5:b0:fc:89:9d:ba:f4:6b:8c:1a:64:cd:d5:ba +# SHA1 Fingerprint: ba:29:41:60:77:98:3f:f4:f3:ef:f2:31:05:3b:2e:ea:6d:4d:45:fd +# SHA256 Fingerprint: 30:d0:89:5a:9a:44:8a:26:20:91:63:55:22:d1:f5:20:10:b5:86:7a:ca:e1:2c:78:ef:95:8f:d4:f4:38:9f:2f +-----BEGIN CERTIFICATE----- +MIIFZjCCA06gAwIBAgIQCgFCgAAAAUUjz0Z8AAAAAjANBgkqhkiG9w0BAQsFADBN +MQswCQYDVQQGEwJVUzESMBAGA1UEChMJSWRlblRydXN0MSowKAYDVQQDEyFJZGVu +VHJ1c3QgUHVibGljIFNlY3RvciBSb290IENBIDEwHhcNMTQwMTE2MTc1MzMyWhcN +MzQwMTE2MTc1MzMyWjBNMQswCQYDVQQGEwJVUzESMBAGA1UEChMJSWRlblRydXN0 +MSowKAYDVQQDEyFJZGVuVHJ1c3QgUHVibGljIFNlY3RvciBSb290IENBIDEwggIi +MA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQC2IpT8pEiv6EdrCvsnduTyP4o7 +ekosMSqMjbCpwzFrqHd2hCa2rIFCDQjrVVi7evi8ZX3yoG2LqEfpYnYeEe4IFNGy +RBb06tD6Hi9e28tzQa68ALBKK0CyrOE7S8ItneShm+waOh7wCLPQ5CQ1B5+ctMlS +bdsHyo+1W/CD80/HLaXIrcuVIKQxKFdYWuSNG5qrng0M8gozOSI5Cpcu81N3uURF +/YTLNiCBWS2ab21ISGHKTN9T0a9SvESfqy9rg3LvdYDaBjMbXcjaY8ZNzaxmMc3R +3j6HEDbhuaR672BQssvKplbgN6+rNBM5Jeg5ZuSYeqoSmJxZZoY+rfGwyj4GD3vw +EUs3oERte8uojHH01bWRNszwFcYr3lEXsZdMUD2xlVl8BX0tIdUAvwFnol57plzy +9yLxkA2T26pEUWbMfXYD62qoKjgZl3YNa4ph+bz27nb9cCvdKTz4Ch5bQhyLVi9V +GxyhLrXHFub4qjySjmm2AcG1hp2JDws4lFTo6tyePSW8Uybt1as5qsVATFSrsrTZ +2fjXctscvG29ZV/viDUqZi/u9rNl8DONfJhBaUYPQxxp+pu10GFqzcpL2UyQRqsV +WaFHVCkugyhfHMKiq3IXAAaOReyL4jM9f9oZRORicsPfIsbyVtTdX5Vy7W1f90gD +W/3FKqD2cyOEEBsB5wIDAQABo0IwQDAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/ +BAUwAwEB/zAdBgNVHQ4EFgQU43HgntinQtnbcZFrlJPrw6PRFKMwDQYJKoZIhvcN +AQELBQADggIBAEf63QqwEZE4rU1d9+UOl1QZgkiHVIyqZJnYWv6IAcVYpZmxI1Qj +t2odIFflAWJBF9MJ23XLblSQdf4an4EKwt3X9wnQW3IV5B4Jaj0z8yGa5hV+rVHV +DRDtfULAj+7AmgjVQdZcDiFpboBhDhXAuM/FSRJSzL46zNQuOAXeNf0fb7iAaJg9 +TaDKQGXSc3z1i9kKlT/YPyNtGtEqJBnZhbMX73huqVjRI9PHE+1yJX9dsXNw0H8G +lwmEKYBhHfpe/3OsoOOJuBxxFcbeMX8S3OFtm6/n6J91eEyrRjuazr8FGF1NFTwW +mhlQBJqymm9li1JfPFgEKCXAZmExfrngdbkaqIHWchezxQMxNRF4eKLg6TCMf4Df +WN88uieW4oA0beOY02QnrEh+KHdcxiVhJfiFDGX6xDIvpZgF5PgLZxYWxoK4Mhn5 ++bl53B/N66+rDt0b20XkeucC4pVd/GnwU2lhlXV5C15V5jgclKlZM57IcXR5f1GJ +tshquDDIajjDbp7hNxbqBWJMWxJH7ae0s1hWx0nzfxJoCTFx8G34Tkf71oXuxVhA +GaQdp/lLQzfcaFpPz+vCZHTetBXZ9FRUGi8c15dxVJCO2SCdUyt/q4/i6jC8UDfv +8Ue1fXwsBOxonbRJRBD0ckscZOf85muQ3Wl9af0AVqW3rLatt8o+Ae+c +-----END CERTIFICATE----- + +# Issuer: CN=CFCA EV ROOT O=China Financial Certification Authority +# Subject: CN=CFCA EV ROOT O=China Financial Certification Authority +# Label: "CFCA EV ROOT" +# Serial: 407555286 +# MD5 Fingerprint: 74:e1:b6:ed:26:7a:7a:44:30:33:94:ab:7b:27:81:30 +# SHA1 Fingerprint: e2:b8:29:4b:55:84:ab:6b:58:c2:90:46:6c:ac:3f:b8:39:8f:84:83 +# SHA256 Fingerprint: 5c:c3:d7:8e:4e:1d:5e:45:54:7a:04:e6:87:3e:64:f9:0c:f9:53:6d:1c:cc:2e:f8:00:f3:55:c4:c5:fd:70:fd +-----BEGIN CERTIFICATE----- +MIIFjTCCA3WgAwIBAgIEGErM1jANBgkqhkiG9w0BAQsFADBWMQswCQYDVQQGEwJD +TjEwMC4GA1UECgwnQ2hpbmEgRmluYW5jaWFsIENlcnRpZmljYXRpb24gQXV0aG9y +aXR5MRUwEwYDVQQDDAxDRkNBIEVWIFJPT1QwHhcNMTIwODA4MDMwNzAxWhcNMjkx +MjMxMDMwNzAxWjBWMQswCQYDVQQGEwJDTjEwMC4GA1UECgwnQ2hpbmEgRmluYW5j +aWFsIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MRUwEwYDVQQDDAxDRkNBIEVWIFJP +T1QwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDXXWvNED8fBVnVBU03 +sQ7smCuOFR36k0sXgiFxEFLXUWRwFsJVaU2OFW2fvwwbwuCjZ9YMrM8irq93VCpL +TIpTUnrD7i7es3ElweldPe6hL6P3KjzJIx1qqx2hp/Hz7KDVRM8Vz3IvHWOX6Jn5 +/ZOkVIBMUtRSqy5J35DNuF++P96hyk0g1CXohClTt7GIH//62pCfCqktQT+x8Rgp +7hZZLDRJGqgG16iI0gNyejLi6mhNbiyWZXvKWfry4t3uMCz7zEasxGPrb382KzRz +EpR/38wmnvFyXVBlWY9ps4deMm/DGIq1lY+wejfeWkU7xzbh72fROdOXW3NiGUgt +hxwG+3SYIElz8AXSG7Ggo7cbcNOIabla1jj0Ytwli3i/+Oh+uFzJlU9fpy25IGvP +a931DfSCt/SyZi4QKPaXWnuWFo8BGS1sbn85WAZkgwGDg8NNkt0yxoekN+kWzqot +aK8KgWU6cMGbrU1tVMoqLUuFG7OA5nBFDWteNfB/O7ic5ARwiRIlk9oKmSJgamNg +TnYGmE69g60dWIolhdLHZR4tjsbftsbhf4oEIRUpdPA+nJCdDC7xij5aqgwJHsfV +PKPtl8MeNPo4+QgO48BdK4PRVmrJtqhUUy54Mmc9gn900PvhtgVguXDbjgv5E1hv +cWAQUhC5wUEJ73IfZzF4/5YFjQIDAQABo2MwYTAfBgNVHSMEGDAWgBTj/i39KNAL +tbq2osS/BqoFjJP7LzAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAd +BgNVHQ4EFgQU4/4t/SjQC7W6tqLEvwaqBYyT+y8wDQYJKoZIhvcNAQELBQADggIB +ACXGumvrh8vegjmWPfBEp2uEcwPenStPuiB/vHiyz5ewG5zz13ku9Ui20vsXiObT +ej/tUxPQ4i9qecsAIyjmHjdXNYmEwnZPNDatZ8POQQaIxffu2Bq41gt/UP+TqhdL +jOztUmCypAbqTuv0axn96/Ua4CUqmtzHQTb3yHQFhDmVOdYLO6Qn+gjYXB74BGBS +ESgoA//vU2YApUo0FmZ8/Qmkrp5nGm9BC2sGE5uPhnEFtC+NiWYzKXZUmhH4J/qy +P5Hgzg0b8zAarb8iXRvTvyUFTeGSGn+ZnzxEk8rUQElsgIfXBDrDMlI1Dlb4pd19 +xIsNER9Tyx6yF7Zod1rg1MvIB671Oi6ON7fQAUtDKXeMOZePglr4UeWJoBjnaH9d +Ci77o0cOPaYjesYBx4/IXr9tgFa+iiS6M+qf4TIRnvHST4D2G0CvOJ4RUHlzEhLN +5mydLIhyPDCBBpEi6lmt2hkuIsKNuYyH4Ga8cyNfIWRjgEj1oDwYPZTISEEdQLpe +/v5WOaHIz16eGWRGENoXkbcFgKyLmZJ956LYBws2J+dIeWCKw9cTXPhyQN9Ky8+Z +AAoACxGV2lZFA4gKn2fQ1XmxqI1AbQ3CekD6819kR5LLU7m7Wc5P/dAVUwHY3+vZ +5nbv0CO7O6l5s9UCKc2Jo5YPSjXnTkLAdc0Hz+Ys63su +-----END CERTIFICATE----- + +# Issuer: CN=OISTE WISeKey Global Root GB CA O=WISeKey OU=OISTE Foundation Endorsed +# Subject: CN=OISTE WISeKey Global Root GB CA O=WISeKey OU=OISTE Foundation Endorsed +# Label: "OISTE WISeKey Global Root GB CA" +# Serial: 157768595616588414422159278966750757568 +# MD5 Fingerprint: a4:eb:b9:61:28:2e:b7:2f:98:b0:35:26:90:99:51:1d +# SHA1 Fingerprint: 0f:f9:40:76:18:d3:d7:6a:4b:98:f0:a8:35:9e:0c:fd:27:ac:cc:ed +# SHA256 Fingerprint: 6b:9c:08:e8:6e:b0:f7:67:cf:ad:65:cd:98:b6:21:49:e5:49:4a:67:f5:84:5e:7b:d1:ed:01:9f:27:b8:6b:d6 +-----BEGIN CERTIFICATE----- +MIIDtTCCAp2gAwIBAgIQdrEgUnTwhYdGs/gjGvbCwDANBgkqhkiG9w0BAQsFADBt +MQswCQYDVQQGEwJDSDEQMA4GA1UEChMHV0lTZUtleTEiMCAGA1UECxMZT0lTVEUg +Rm91bmRhdGlvbiBFbmRvcnNlZDEoMCYGA1UEAxMfT0lTVEUgV0lTZUtleSBHbG9i +YWwgUm9vdCBHQiBDQTAeFw0xNDEyMDExNTAwMzJaFw0zOTEyMDExNTEwMzFaMG0x +CzAJBgNVBAYTAkNIMRAwDgYDVQQKEwdXSVNlS2V5MSIwIAYDVQQLExlPSVNURSBG +b3VuZGF0aW9uIEVuZG9yc2VkMSgwJgYDVQQDEx9PSVNURSBXSVNlS2V5IEdsb2Jh +bCBSb290IEdCIENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA2Be3 +HEokKtaXscriHvt9OO+Y9bI5mE4nuBFde9IllIiCFSZqGzG7qFshISvYD06fWvGx +WuR51jIjK+FTzJlFXHtPrby/h0oLS5daqPZI7H17Dc0hBt+eFf1Biki3IPShehtX +1F1Q/7pn2COZH8g/497/b1t3sWtuuMlk9+HKQUYOKXHQuSP8yYFfTvdv37+ErXNk +u7dCjmn21HYdfp2nuFeKUWdy19SouJVUQHMD9ur06/4oQnc/nSMbsrY9gBQHTC5P +99UKFg29ZkM3fiNDecNAhvVMKdqOmq0NpQSHiB6F4+lT1ZvIiwNjeOvgGUpuuy9r +M2RYk61pv48b74JIxwIDAQABo1EwTzALBgNVHQ8EBAMCAYYwDwYDVR0TAQH/BAUw +AwEB/zAdBgNVHQ4EFgQUNQ/INmNe4qPs+TtmFc5RUuORmj0wEAYJKwYBBAGCNxUB +BAMCAQAwDQYJKoZIhvcNAQELBQADggEBAEBM+4eymYGQfp3FsLAmzYh7KzKNbrgh +cViXfa43FK8+5/ea4n32cZiZBKpDdHij40lhPnOMTZTg+XHEthYOU3gf1qKHLwI5 +gSk8rxWYITD+KJAAjNHhy/peyP34EEY7onhCkRd0VQreUGdNZtGn//3ZwLWoo4rO +ZvUPQ82nK1d7Y0Zqqi5S2PTt4W2tKZB4SLrhI6qjiey1q5bAtEuiHZeeevJuQHHf +aPFlTc58Bd9TZaml8LGXBHAVRgOY1NK/VLSgWH1Sb9pWJmLU2NuJMW8c8CLC02Ic +Nc1MaRVUGpCY3useX8p3x8uOPUNpnJpY0CQ73xtAln41rYHHTnG6iBM= +-----END CERTIFICATE----- + +# Issuer: CN=SZAFIR ROOT CA2 O=Krajowa Izba Rozliczeniowa S.A. +# Subject: CN=SZAFIR ROOT CA2 O=Krajowa Izba Rozliczeniowa S.A. +# Label: "SZAFIR ROOT CA2" +# Serial: 357043034767186914217277344587386743377558296292 +# MD5 Fingerprint: 11:64:c1:89:b0:24:b1:8c:b1:07:7e:89:9e:51:9e:99 +# SHA1 Fingerprint: e2:52:fa:95:3f:ed:db:24:60:bd:6e:28:f3:9c:cc:cf:5e:b3:3f:de +# SHA256 Fingerprint: a1:33:9d:33:28:1a:0b:56:e5:57:d3:d3:2b:1c:e7:f9:36:7e:b0:94:bd:5f:a7:2a:7e:50:04:c8:de:d7:ca:fe +-----BEGIN CERTIFICATE----- +MIIDcjCCAlqgAwIBAgIUPopdB+xV0jLVt+O2XwHrLdzk1uQwDQYJKoZIhvcNAQEL +BQAwUTELMAkGA1UEBhMCUEwxKDAmBgNVBAoMH0tyYWpvd2EgSXpiYSBSb3psaWN6 +ZW5pb3dhIFMuQS4xGDAWBgNVBAMMD1NaQUZJUiBST09UIENBMjAeFw0xNTEwMTkw +NzQzMzBaFw0zNTEwMTkwNzQzMzBaMFExCzAJBgNVBAYTAlBMMSgwJgYDVQQKDB9L +cmFqb3dhIEl6YmEgUm96bGljemVuaW93YSBTLkEuMRgwFgYDVQQDDA9TWkFGSVIg +Uk9PVCBDQTIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQC3vD5QqEvN +QLXOYeeWyrSh2gwisPq1e3YAd4wLz32ohswmUeQgPYUM1ljj5/QqGJ3a0a4m7utT +3PSQ1hNKDJA8w/Ta0o4NkjrcsbH/ON7Dui1fgLkCvUqdGw+0w8LBZwPd3BucPbOw +3gAeqDRHu5rr/gsUvTaE2g0gv/pby6kWIK05YO4vdbbnl5z5Pv1+TW9NL++IDWr6 +3fE9biCloBK0TXC5ztdyO4mTp4CEHCdJckm1/zuVnsHMyAHs6A6KCpbns6aH5db5 +BSsNl0BwPLqsdVqc1U2dAgrSS5tmS0YHF2Wtn2yIANwiieDhZNRnvDF5YTy7ykHN +XGoAyDw4jlivAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQD +AgEGMB0GA1UdDgQWBBQuFqlKGLXLzPVvUPMjX/hd56zwyDANBgkqhkiG9w0BAQsF +AAOCAQEAtXP4A9xZWx126aMqe5Aosk3AM0+qmrHUuOQn/6mWmc5G4G18TKI4pAZw +8PRBEew/R40/cof5O/2kbytTAOD/OblqBw7rHRz2onKQy4I9EYKL0rufKq8h5mOG +nXkZ7/e7DDWQw4rtTw/1zBLZpD67oPwglV9PJi8RI4NOdQcPv5vRtB3pEAT+ymCP +oky4rc/hkA/NrgrHXXu3UNLUYfrVFdvXn4dRVOul4+vJhaAlIDf7js4MNIThPIGy +d05DpYhfhmehPea0XGG2Ptv+tyjFogeutcrKjSoS75ftwjCkySp6+/NNIxuZMzSg +LvWpCz/UXeHPhJ/iGcJfitYgHuNztw== +-----END CERTIFICATE----- + +# Issuer: CN=Certum Trusted Network CA 2 O=Unizeto Technologies S.A. OU=Certum Certification Authority +# Subject: CN=Certum Trusted Network CA 2 O=Unizeto Technologies S.A. OU=Certum Certification Authority +# Label: "Certum Trusted Network CA 2" +# Serial: 44979900017204383099463764357512596969 +# MD5 Fingerprint: 6d:46:9e:d9:25:6d:08:23:5b:5e:74:7d:1e:27:db:f2 +# SHA1 Fingerprint: d3:dd:48:3e:2b:bf:4c:05:e8:af:10:f5:fa:76:26:cf:d3:dc:30:92 +# SHA256 Fingerprint: b6:76:f2:ed:da:e8:77:5c:d3:6c:b0:f6:3c:d1:d4:60:39:61:f4:9e:62:65:ba:01:3a:2f:03:07:b6:d0:b8:04 +-----BEGIN CERTIFICATE----- +MIIF0jCCA7qgAwIBAgIQIdbQSk8lD8kyN/yqXhKN6TANBgkqhkiG9w0BAQ0FADCB +gDELMAkGA1UEBhMCUEwxIjAgBgNVBAoTGVVuaXpldG8gVGVjaG5vbG9naWVzIFMu +QS4xJzAlBgNVBAsTHkNlcnR1bSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTEkMCIG +A1UEAxMbQ2VydHVtIFRydXN0ZWQgTmV0d29yayBDQSAyMCIYDzIwMTExMDA2MDgz +OTU2WhgPMjA0NjEwMDYwODM5NTZaMIGAMQswCQYDVQQGEwJQTDEiMCAGA1UEChMZ +VW5pemV0byBUZWNobm9sb2dpZXMgUy5BLjEnMCUGA1UECxMeQ2VydHVtIENlcnRp +ZmljYXRpb24gQXV0aG9yaXR5MSQwIgYDVQQDExtDZXJ0dW0gVHJ1c3RlZCBOZXR3 +b3JrIENBIDIwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQC9+Xj45tWA +DGSdhhuWZGc/IjoedQF97/tcZ4zJzFxrqZHmuULlIEub2pt7uZld2ZuAS9eEQCsn +0+i6MLs+CRqnSZXvK0AkwpfHp+6bJe+oCgCXhVqqndwpyeI1B+twTUrWwbNWuKFB +OJvR+zF/j+Bf4bE/D44WSWDXBo0Y+aomEKsq09DRZ40bRr5HMNUuctHFY9rnY3lE +fktjJImGLjQ/KUxSiyqnwOKRKIm5wFv5HdnnJ63/mgKXwcZQkpsCLL2puTRZCr+E +Sv/f/rOf69me4Jgj7KZrdxYq28ytOxykh9xGc14ZYmhFV+SQgkK7QtbwYeDBoz1m +o130GO6IyY0XRSmZMnUCMe4pJshrAua1YkV/NxVaI2iJ1D7eTiew8EAMvE0Xy02i +sx7QBlrd9pPPV3WZ9fqGGmd4s7+W/jTcvedSVuWz5XV710GRBdxdaeOVDUO5/IOW +OZV7bIBaTxNyxtd9KXpEulKkKtVBRgkg/iKgtlswjbyJDNXXcPiHUv3a76xRLgez +Tv7QCdpw75j6VuZt27VXS9zlLCUVyJ4ueE742pyehizKV/Ma5ciSixqClnrDvFAS +adgOWkaLOusm+iPJtrCBvkIApPjW/jAux9JG9uWOdf3yzLnQh1vMBhBgu4M1t15n +3kfsmUjxpKEV/q2MYo45VU85FrmxY53/twIDAQABo0IwQDAPBgNVHRMBAf8EBTAD +AQH/MB0GA1UdDgQWBBS2oVQ5AsOgP46KvPrU+Bym0ToO/TAOBgNVHQ8BAf8EBAMC +AQYwDQYJKoZIhvcNAQENBQADggIBAHGlDs7k6b8/ONWJWsQCYftMxRQXLYtPU2sQ +F/xlhMcQSZDe28cmk4gmb3DWAl45oPePq5a1pRNcgRRtDoGCERuKTsZPpd1iHkTf +CVn0W3cLN+mLIMb4Ck4uWBzrM9DPhmDJ2vuAL55MYIR4PSFk1vtBHxgP58l1cb29 +XN40hz5BsA72udY/CROWFC/emh1auVbONTqwX3BNXuMp8SMoclm2q8KMZiYcdywm +djWLKKdpoPk79SPdhRB0yZADVpHnr7pH1BKXESLjokmUbOe3lEu6LaTaM4tMpkT/ +WjzGHWTYtTHkpjx6qFcL2+1hGsvxznN3Y6SHb0xRONbkX8eftoEq5IVIeVheO/jb +AoJnwTnbw3RLPTYe+SmTiGhbqEQZIfCn6IENLOiTNrQ3ssqwGyZ6miUfmpqAnksq +P/ujmv5zMnHCnsZy4YpoJ/HkD7TETKVhk/iXEAcqMCWpuchxuO9ozC1+9eB+D4Ko +b7a6bINDd82Kkhehnlt4Fj1F4jNy3eFmypnTycUm/Q1oBEauttmbjL4ZvrHG8hnj +XALKLNhvSgfZyTXaQHXyxKcZb55CEJh15pWLYLztxRLXis7VmFxWlgPF7ncGNf/P +5O4/E2Hu29othfDNrp2yGAlFw5Khchf8R7agCyzxxN5DaAhqXzvwdmP7zAYspsbi +DrW5viSP +-----END CERTIFICATE----- + +# Issuer: CN=Hellenic Academic and Research Institutions RootCA 2015 O=Hellenic Academic and Research Institutions Cert. Authority +# Subject: CN=Hellenic Academic and Research Institutions RootCA 2015 O=Hellenic Academic and Research Institutions Cert. Authority +# Label: "Hellenic Academic and Research Institutions RootCA 2015" +# Serial: 0 +# MD5 Fingerprint: ca:ff:e2:db:03:d9:cb:4b:e9:0f:ad:84:fd:7b:18:ce +# SHA1 Fingerprint: 01:0c:06:95:a6:98:19:14:ff:bf:5f:c6:b0:b6:95:ea:29:e9:12:a6 +# SHA256 Fingerprint: a0:40:92:9a:02:ce:53:b4:ac:f4:f2:ff:c6:98:1c:e4:49:6f:75:5e:6d:45:fe:0b:2a:69:2b:cd:52:52:3f:36 +-----BEGIN CERTIFICATE----- +MIIGCzCCA/OgAwIBAgIBADANBgkqhkiG9w0BAQsFADCBpjELMAkGA1UEBhMCR1Ix +DzANBgNVBAcTBkF0aGVuczFEMEIGA1UEChM7SGVsbGVuaWMgQWNhZGVtaWMgYW5k +IFJlc2VhcmNoIEluc3RpdHV0aW9ucyBDZXJ0LiBBdXRob3JpdHkxQDA+BgNVBAMT +N0hlbGxlbmljIEFjYWRlbWljIGFuZCBSZXNlYXJjaCBJbnN0aXR1dGlvbnMgUm9v +dENBIDIwMTUwHhcNMTUwNzA3MTAxMTIxWhcNNDAwNjMwMTAxMTIxWjCBpjELMAkG +A1UEBhMCR1IxDzANBgNVBAcTBkF0aGVuczFEMEIGA1UEChM7SGVsbGVuaWMgQWNh +ZGVtaWMgYW5kIFJlc2VhcmNoIEluc3RpdHV0aW9ucyBDZXJ0LiBBdXRob3JpdHkx +QDA+BgNVBAMTN0hlbGxlbmljIEFjYWRlbWljIGFuZCBSZXNlYXJjaCBJbnN0aXR1 +dGlvbnMgUm9vdENBIDIwMTUwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoIC +AQDC+Kk/G4n8PDwEXT2QNrCROnk8ZlrvbTkBSRq0t89/TSNTt5AA4xMqKKYx8ZEA +4yjsriFBzh/a/X0SWwGDD7mwX5nh8hKDgE0GPt+sr+ehiGsxr/CL0BgzuNtFajT0 +AoAkKAoCFZVedioNmToUW/bLy1O8E00BiDeUJRtCvCLYjqOWXjrZMts+6PAQZe10 +4S+nfK8nNLspfZu2zwnI5dMK/IhlZXQK3HMcXM1AsRzUtoSMTFDPaI6oWa7CJ06C +ojXdFPQf/7J31Ycvqm59JCfnxssm5uX+Zwdj2EUN3TpZZTlYepKZcj2chF6IIbjV +9Cz82XBST3i4vTwri5WY9bPRaM8gFH5MXF/ni+X1NYEZN9cRCLdmvtNKzoNXADrD +gfgXy5I2XdGj2HUb4Ysn6npIQf1FGQatJ5lOwXBH3bWfgVMS5bGMSF0xQxfjjMZ6 +Y5ZLKTBOhE5iGV48zpeQpX8B653g+IuJ3SWYPZK2fu/Z8VFRfS0myGlZYeCsargq +NhEEelC9MoS+L9xy1dcdFkfkR2YgP/SWxa+OAXqlD3pk9Q0Yh9muiNX6hME6wGko +LfINaFGq46V3xqSQDqE3izEjR8EJCOtu93ib14L8hCCZSRm2Ekax+0VVFqmjZayc +Bw/qa9wfLgZy7IaIEuQt218FL+TwA9MmM+eAws1CoRc0CwIDAQABo0IwQDAPBgNV +HRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUcRVnyMjJvXVd +ctA4GGqd83EkVAswDQYJKoZIhvcNAQELBQADggIBAHW7bVRLqhBYRjTyYtcWNl0I +XtVsyIe9tC5G8jH4fOpCtZMWVdyhDBKg2mF+D1hYc2Ryx+hFjtyp8iY/xnmMsVMI +M4GwVhO+5lFc2JsKT0ucVlMC6U/2DWDqTUJV6HwbISHTGzrMd/K4kPFox/la/vot +9L/J9UUbzjgQKjeKeaO04wlshYaT/4mWJ3iBj2fjRnRUjtkNaeJK9E10A/+yd+2V +Z5fkscWrv2oj6NSU4kQoYsRL4vDY4ilrGnB+JGGTe08DMiUNRSQrlrRGar9KC/ea +j8GsGsVn82800vpzY4zvFrCopEYq+OsS7HK07/grfoxSwIuEVPkvPuNVqNxmsdnh +X9izjFk0WaSrT2y7HxjbdavYy5LNlDhhDgcGH0tGEPEVvo2FXDtKK4F5D7Rpn0lQ +l033DlZdwJVqwjbDG2jJ9SrcR5q+ss7FJej6A7na+RZukYT1HCjI/CbM1xyQVqdf +bzoEvM14iQuODy+jqk+iGxI9FghAD/FGTNeqewjBCvVtJ94Cj8rDtSvK6evIIVM4 +pcw72Hc3MKJP2W/R8kCtQXoXxdZKNYm3QdV8hn9VTYNKpXMgwDqvkPGaJI7ZjnHK +e7iG2rKPmT4dEw0SEe7Uq/DpFXYC5ODfqiAeW2GFZECpkJcNrVPSWh2HagCXZWK0 +vm9qp/UsQu0yrbYhnr68 +-----END CERTIFICATE----- + +# Issuer: CN=Hellenic Academic and Research Institutions ECC RootCA 2015 O=Hellenic Academic and Research Institutions Cert. Authority +# Subject: CN=Hellenic Academic and Research Institutions ECC RootCA 2015 O=Hellenic Academic and Research Institutions Cert. Authority +# Label: "Hellenic Academic and Research Institutions ECC RootCA 2015" +# Serial: 0 +# MD5 Fingerprint: 81:e5:b4:17:eb:c2:f5:e1:4b:0d:41:7b:49:92:fe:ef +# SHA1 Fingerprint: 9f:f1:71:8d:92:d5:9a:f3:7d:74:97:b4:bc:6f:84:68:0b:ba:b6:66 +# SHA256 Fingerprint: 44:b5:45:aa:8a:25:e6:5a:73:ca:15:dc:27:fc:36:d2:4c:1c:b9:95:3a:06:65:39:b1:15:82:dc:48:7b:48:33 +-----BEGIN CERTIFICATE----- +MIICwzCCAkqgAwIBAgIBADAKBggqhkjOPQQDAjCBqjELMAkGA1UEBhMCR1IxDzAN +BgNVBAcTBkF0aGVuczFEMEIGA1UEChM7SGVsbGVuaWMgQWNhZGVtaWMgYW5kIFJl +c2VhcmNoIEluc3RpdHV0aW9ucyBDZXJ0LiBBdXRob3JpdHkxRDBCBgNVBAMTO0hl +bGxlbmljIEFjYWRlbWljIGFuZCBSZXNlYXJjaCBJbnN0aXR1dGlvbnMgRUNDIFJv +b3RDQSAyMDE1MB4XDTE1MDcwNzEwMzcxMloXDTQwMDYzMDEwMzcxMlowgaoxCzAJ +BgNVBAYTAkdSMQ8wDQYDVQQHEwZBdGhlbnMxRDBCBgNVBAoTO0hlbGxlbmljIEFj +YWRlbWljIGFuZCBSZXNlYXJjaCBJbnN0aXR1dGlvbnMgQ2VydC4gQXV0aG9yaXR5 +MUQwQgYDVQQDEztIZWxsZW5pYyBBY2FkZW1pYyBhbmQgUmVzZWFyY2ggSW5zdGl0 +dXRpb25zIEVDQyBSb290Q0EgMjAxNTB2MBAGByqGSM49AgEGBSuBBAAiA2IABJKg +QehLgoRc4vgxEZmGZE4JJS+dQS8KrjVPdJWyUWRrjWvmP3CV8AVER6ZyOFB2lQJa +jq4onvktTpnvLEhvTCUp6NFxW98dwXU3tNf6e3pCnGoKVlp8aQuqgAkkbH7BRqNC +MEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFLQi +C4KZJAEOnLvkDv2/+5cgk5kqMAoGCCqGSM49BAMCA2cAMGQCMGfOFmI4oqxiRaep +lSTAGiecMjvAwNW6qef4BENThe5SId6d9SWDPp5YSy/XZxMOIQIwBeF1Ad5o7Sof +TUwJCA3sS61kFyjndc5FZXIhF8siQQ6ME5g4mlRtm8rifOoCWCKR +-----END CERTIFICATE----- + +# Issuer: CN=ISRG Root X1 O=Internet Security Research Group +# Subject: CN=ISRG Root X1 O=Internet Security Research Group +# Label: "ISRG Root X1" +# Serial: 172886928669790476064670243504169061120 +# MD5 Fingerprint: 0c:d2:f9:e0:da:17:73:e9:ed:86:4d:a5:e3:70:e7:4e +# SHA1 Fingerprint: ca:bd:2a:79:a1:07:6a:31:f2:1d:25:36:35:cb:03:9d:43:29:a5:e8 +# SHA256 Fingerprint: 96:bc:ec:06:26:49:76:f3:74:60:77:9a:cf:28:c5:a7:cf:e8:a3:c0:aa:e1:1a:8f:fc:ee:05:c0:bd:df:08:c6 +-----BEGIN CERTIFICATE----- +MIIFazCCA1OgAwIBAgIRAIIQz7DSQONZRGPgu2OCiwAwDQYJKoZIhvcNAQELBQAw +TzELMAkGA1UEBhMCVVMxKTAnBgNVBAoTIEludGVybmV0IFNlY3VyaXR5IFJlc2Vh +cmNoIEdyb3VwMRUwEwYDVQQDEwxJU1JHIFJvb3QgWDEwHhcNMTUwNjA0MTEwNDM4 +WhcNMzUwNjA0MTEwNDM4WjBPMQswCQYDVQQGEwJVUzEpMCcGA1UEChMgSW50ZXJu +ZXQgU2VjdXJpdHkgUmVzZWFyY2ggR3JvdXAxFTATBgNVBAMTDElTUkcgUm9vdCBY +MTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAK3oJHP0FDfzm54rVygc +h77ct984kIxuPOZXoHj3dcKi/vVqbvYATyjb3miGbESTtrFj/RQSa78f0uoxmyF+ +0TM8ukj13Xnfs7j/EvEhmkvBioZxaUpmZmyPfjxwv60pIgbz5MDmgK7iS4+3mX6U +A5/TR5d8mUgjU+g4rk8Kb4Mu0UlXjIB0ttov0DiNewNwIRt18jA8+o+u3dpjq+sW +T8KOEUt+zwvo/7V3LvSye0rgTBIlDHCNAymg4VMk7BPZ7hm/ELNKjD+Jo2FR3qyH +B5T0Y3HsLuJvW5iB4YlcNHlsdu87kGJ55tukmi8mxdAQ4Q7e2RCOFvu396j3x+UC +B5iPNgiV5+I3lg02dZ77DnKxHZu8A/lJBdiB3QW0KtZB6awBdpUKD9jf1b0SHzUv +KBds0pjBqAlkd25HN7rOrFleaJ1/ctaJxQZBKT5ZPt0m9STJEadao0xAH0ahmbWn +OlFuhjuefXKnEgV4We0+UXgVCwOPjdAvBbI+e0ocS3MFEvzG6uBQE3xDk3SzynTn +jh8BCNAw1FtxNrQHusEwMFxIt4I7mKZ9YIqioymCzLq9gwQbooMDQaHWBfEbwrbw +qHyGO0aoSCqI3Haadr8faqU9GY/rOPNk3sgrDQoo//fb4hVC1CLQJ13hef4Y53CI +rU7m2Ys6xt0nUW7/vGT1M0NPAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNV +HRMBAf8EBTADAQH/MB0GA1UdDgQWBBR5tFnme7bl5AFzgAiIyBpY9umbbjANBgkq +hkiG9w0BAQsFAAOCAgEAVR9YqbyyqFDQDLHYGmkgJykIrGF1XIpu+ILlaS/V9lZL +ubhzEFnTIZd+50xx+7LSYK05qAvqFyFWhfFQDlnrzuBZ6brJFe+GnY+EgPbk6ZGQ +3BebYhtF8GaV0nxvwuo77x/Py9auJ/GpsMiu/X1+mvoiBOv/2X/qkSsisRcOj/KK +NFtY2PwByVS5uCbMiogziUwthDyC3+6WVwW6LLv3xLfHTjuCvjHIInNzktHCgKQ5 +ORAzI4JMPJ+GslWYHb4phowim57iaztXOoJwTdwJx4nLCgdNbOhdjsnvzqvHu7Ur +TkXWStAmzOVyyghqpZXjFaH3pO3JLF+l+/+sKAIuvtd7u+Nxe5AW0wdeRlN8NwdC +jNPElpzVmbUq4JUagEiuTDkHzsxHpFKVK7q4+63SM1N95R1NbdWhscdCb+ZAJzVc +oyi3B43njTOQ5yOf+1CceWxG1bQVs5ZufpsMljq4Ui0/1lvh+wjChP4kqKOJ2qxq +4RgqsahDYVvTH9w7jXbyLeiNdd8XM2w9U/t7y0Ff/9yi0GE44Za4rF2LN9d11TPA +mRGunUHBcnWEvgJBQl9nJEiU0Zsnvgc/ubhPgXRR4Xq37Z0j4r7g1SgEEzwxA57d +emyPxgcYxn/eR44/KJ4EBs+lVDR3veyJm+kXQ99b21/+jh5Xos1AnX5iItreGCc= +-----END CERTIFICATE----- + +# Issuer: O=FNMT-RCM OU=AC RAIZ FNMT-RCM +# Subject: O=FNMT-RCM OU=AC RAIZ FNMT-RCM +# Label: "AC RAIZ FNMT-RCM" +# Serial: 485876308206448804701554682760554759 +# MD5 Fingerprint: e2:09:04:b4:d3:bd:d1:a0:14:fd:1a:d2:47:c4:57:1d +# SHA1 Fingerprint: ec:50:35:07:b2:15:c4:95:62:19:e2:a8:9a:5b:42:99:2c:4c:2c:20 +# SHA256 Fingerprint: eb:c5:57:0c:29:01:8c:4d:67:b1:aa:12:7b:af:12:f7:03:b4:61:1e:bc:17:b7:da:b5:57:38:94:17:9b:93:fa +-----BEGIN CERTIFICATE----- +MIIFgzCCA2ugAwIBAgIPXZONMGc2yAYdGsdUhGkHMA0GCSqGSIb3DQEBCwUAMDsx +CzAJBgNVBAYTAkVTMREwDwYDVQQKDAhGTk1ULVJDTTEZMBcGA1UECwwQQUMgUkFJ +WiBGTk1ULVJDTTAeFw0wODEwMjkxNTU5NTZaFw0zMDAxMDEwMDAwMDBaMDsxCzAJ +BgNVBAYTAkVTMREwDwYDVQQKDAhGTk1ULVJDTTEZMBcGA1UECwwQQUMgUkFJWiBG +Tk1ULVJDTTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBALpxgHpMhm5/ +yBNtwMZ9HACXjywMI7sQmkCpGreHiPibVmr75nuOi5KOpyVdWRHbNi63URcfqQgf +BBckWKo3Shjf5TnUV/3XwSyRAZHiItQDwFj8d0fsjz50Q7qsNI1NOHZnjrDIbzAz +WHFctPVrbtQBULgTfmxKo0nRIBnuvMApGGWn3v7v3QqQIecaZ5JCEJhfTzC8PhxF +tBDXaEAUwED653cXeuYLj2VbPNmaUtu1vZ5Gzz3rkQUCwJaydkxNEJY7kvqcfw+Z +374jNUUeAlz+taibmSXaXvMiwzn15Cou08YfxGyqxRxqAQVKL9LFwag0Jl1mpdIC +IfkYtwb1TplvqKtMUejPUBjFd8g5CSxJkjKZqLsXF3mwWsXmo8RZZUc1g16p6DUL +mbvkzSDGm0oGObVo/CK67lWMK07q87Hj/LaZmtVC+nFNCM+HHmpxffnTtOmlcYF7 +wk5HlqX2doWjKI/pgG6BU6VtX7hI+cL5NqYuSf+4lsKMB7ObiFj86xsc3i1w4peS +MKGJ47xVqCfWS+2QrYv6YyVZLag13cqXM7zlzced0ezvXg5KkAYmY6252TUtB7p2 +ZSysV4999AeU14ECll2jB0nVetBX+RvnU0Z1qrB5QstocQjpYL05ac70r8NWQMet +UqIJ5G+GR4of6ygnXYMgrwTJbFaai0b1AgMBAAGjgYMwgYAwDwYDVR0TAQH/BAUw +AwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFPd9xf3E6Jobd2Sn9R2gzL+H +YJptMD4GA1UdIAQ3MDUwMwYEVR0gADArMCkGCCsGAQUFBwIBFh1odHRwOi8vd3d3 +LmNlcnQuZm5tdC5lcy9kcGNzLzANBgkqhkiG9w0BAQsFAAOCAgEAB5BK3/MjTvDD +nFFlm5wioooMhfNzKWtN/gHiqQxjAb8EZ6WdmF/9ARP67Jpi6Yb+tmLSbkyU+8B1 +RXxlDPiyN8+sD8+Nb/kZ94/sHvJwnvDKuO+3/3Y3dlv2bojzr2IyIpMNOmqOFGYM +LVN0V2Ue1bLdI4E7pWYjJ2cJj+F3qkPNZVEI7VFY/uY5+ctHhKQV8Xa7pO6kO8Rf +77IzlhEYt8llvhjho6Tc+hj507wTmzl6NLrTQfv6MooqtyuGC2mDOL7Nii4LcK2N +JpLuHvUBKwrZ1pebbuCoGRw6IYsMHkCtA+fdZn71uSANA+iW+YJF1DngoABd15jm +fZ5nc8OaKveri6E6FO80vFIOiZiaBECEHX5FaZNXzuvO+FB8TxxuBEOb+dY7Ixjp +6o7RTUaN8Tvkasq6+yO3m/qZASlaWFot4/nUbQ4mrcFuNLwy+AwF+mWj2zs3gyLp +1txyM/1d8iC9djwj2ij3+RvrWWTV3F9yfiD8zYm1kGdNYno/Tq0dwzn+evQoFt9B +9kiABdcPUXmsEKvU7ANm5mqwujGSQkBqvjrTcuFqN1W8rB2Vt2lh8kORdOag0wok +RqEIr9baRRmW1FMdW4R58MD3R++Lj8UGrp1MYp3/RgT408m2ECVAdf4WqslKYIYv +uu8wd+RU4riEmViAqhOLUTpPSPaLtrM= +-----END CERTIFICATE----- + +# Issuer: CN=Amazon Root CA 1 O=Amazon +# Subject: CN=Amazon Root CA 1 O=Amazon +# Label: "Amazon Root CA 1" +# Serial: 143266978916655856878034712317230054538369994 +# MD5 Fingerprint: 43:c6:bf:ae:ec:fe:ad:2f:18:c6:88:68:30:fc:c8:e6 +# SHA1 Fingerprint: 8d:a7:f9:65:ec:5e:fc:37:91:0f:1c:6e:59:fd:c1:cc:6a:6e:de:16 +# SHA256 Fingerprint: 8e:cd:e6:88:4f:3d:87:b1:12:5b:a3:1a:c3:fc:b1:3d:70:16:de:7f:57:cc:90:4f:e1:cb:97:c6:ae:98:19:6e +-----BEGIN CERTIFICATE----- +MIIDQTCCAimgAwIBAgITBmyfz5m/jAo54vB4ikPmljZbyjANBgkqhkiG9w0BAQsF +ADA5MQswCQYDVQQGEwJVUzEPMA0GA1UEChMGQW1hem9uMRkwFwYDVQQDExBBbWF6 +b24gUm9vdCBDQSAxMB4XDTE1MDUyNjAwMDAwMFoXDTM4MDExNzAwMDAwMFowOTEL +MAkGA1UEBhMCVVMxDzANBgNVBAoTBkFtYXpvbjEZMBcGA1UEAxMQQW1hem9uIFJv +b3QgQ0EgMTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALJ4gHHKeNXj +ca9HgFB0fW7Y14h29Jlo91ghYPl0hAEvrAIthtOgQ3pOsqTQNroBvo3bSMgHFzZM +9O6II8c+6zf1tRn4SWiw3te5djgdYZ6k/oI2peVKVuRF4fn9tBb6dNqcmzU5L/qw +IFAGbHrQgLKm+a/sRxmPUDgH3KKHOVj4utWp+UhnMJbulHheb4mjUcAwhmahRWa6 +VOujw5H5SNz/0egwLX0tdHA114gk957EWW67c4cX8jJGKLhD+rcdqsq08p8kDi1L +93FcXmn/6pUCyziKrlA4b9v7LWIbxcceVOF34GfID5yHI9Y/QCB/IIDEgEw+OyQm +jgSubJrIqg0CAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMC +AYYwHQYDVR0OBBYEFIQYzIU07LwMlJQuCFmcx7IQTgoIMA0GCSqGSIb3DQEBCwUA +A4IBAQCY8jdaQZChGsV2USggNiMOruYou6r4lK5IpDB/G/wkjUu0yKGX9rbxenDI +U5PMCCjjmCXPI6T53iHTfIUJrU6adTrCC2qJeHZERxhlbI1Bjjt/msv0tadQ1wUs +N+gDS63pYaACbvXy8MWy7Vu33PqUXHeeE6V/Uq2V8viTO96LXFvKWlJbYK8U90vv +o/ufQJVtMVT8QtPHRh8jrdkPSHCa2XV4cdFyQzR1bldZwgJcJmApzyMZFo6IQ6XU +5MsI+yMRQ+hDKXJioaldXgjUkK642M4UwtBV8ob2xJNDd2ZhwLnoQdeXeGADbkpy +rqXRfboQnoZsG4q5WTP468SQvvG5 +-----END CERTIFICATE----- + +# Issuer: CN=Amazon Root CA 2 O=Amazon +# Subject: CN=Amazon Root CA 2 O=Amazon +# Label: "Amazon Root CA 2" +# Serial: 143266982885963551818349160658925006970653239 +# MD5 Fingerprint: c8:e5:8d:ce:a8:42:e2:7a:c0:2a:5c:7c:9e:26:bf:66 +# SHA1 Fingerprint: 5a:8c:ef:45:d7:a6:98:59:76:7a:8c:8b:44:96:b5:78:cf:47:4b:1a +# SHA256 Fingerprint: 1b:a5:b2:aa:8c:65:40:1a:82:96:01:18:f8:0b:ec:4f:62:30:4d:83:ce:c4:71:3a:19:c3:9c:01:1e:a4:6d:b4 +-----BEGIN CERTIFICATE----- +MIIFQTCCAymgAwIBAgITBmyf0pY1hp8KD+WGePhbJruKNzANBgkqhkiG9w0BAQwF +ADA5MQswCQYDVQQGEwJVUzEPMA0GA1UEChMGQW1hem9uMRkwFwYDVQQDExBBbWF6 +b24gUm9vdCBDQSAyMB4XDTE1MDUyNjAwMDAwMFoXDTQwMDUyNjAwMDAwMFowOTEL +MAkGA1UEBhMCVVMxDzANBgNVBAoTBkFtYXpvbjEZMBcGA1UEAxMQQW1hem9uIFJv +b3QgQ0EgMjCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAK2Wny2cSkxK +gXlRmeyKy2tgURO8TW0G/LAIjd0ZEGrHJgw12MBvIITplLGbhQPDW9tK6Mj4kHbZ +W0/jTOgGNk3Mmqw9DJArktQGGWCsN0R5hYGCrVo34A3MnaZMUnbqQ523BNFQ9lXg +1dKmSYXpN+nKfq5clU1Imj+uIFptiJXZNLhSGkOQsL9sBbm2eLfq0OQ6PBJTYv9K +8nu+NQWpEjTj82R0Yiw9AElaKP4yRLuH3WUnAnE72kr3H9rN9yFVkE8P7K6C4Z9r +2UXTu/Bfh+08LDmG2j/e7HJV63mjrdvdfLC6HM783k81ds8P+HgfajZRRidhW+me +z/CiVX18JYpvL7TFz4QuK/0NURBs+18bvBt+xa47mAExkv8LV/SasrlX6avvDXbR +8O70zoan4G7ptGmh32n2M8ZpLpcTnqWHsFcQgTfJU7O7f/aS0ZzQGPSSbtqDT6Zj +mUyl+17vIWR6IF9sZIUVyzfpYgwLKhbcAS4y2j5L9Z469hdAlO+ekQiG+r5jqFoz +7Mt0Q5X5bGlSNscpb/xVA1wf+5+9R+vnSUeVC06JIglJ4PVhHvG/LopyboBZ/1c6 ++XUyo05f7O0oYtlNc/LMgRdg7c3r3NunysV+Ar3yVAhU/bQtCSwXVEqY0VThUWcI +0u1ufm8/0i2BWSlmy5A5lREedCf+3euvAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMB +Af8wDgYDVR0PAQH/BAQDAgGGMB0GA1UdDgQWBBSwDPBMMPQFWAJI/TPlUq9LhONm +UjANBgkqhkiG9w0BAQwFAAOCAgEAqqiAjw54o+Ci1M3m9Zh6O+oAA7CXDpO8Wqj2 +LIxyh6mx/H9z/WNxeKWHWc8w4Q0QshNabYL1auaAn6AFC2jkR2vHat+2/XcycuUY ++gn0oJMsXdKMdYV2ZZAMA3m3MSNjrXiDCYZohMr/+c8mmpJ5581LxedhpxfL86kS +k5Nrp+gvU5LEYFiwzAJRGFuFjWJZY7attN6a+yb3ACfAXVU3dJnJUH/jWS5E4ywl +7uxMMne0nxrpS10gxdr9HIcWxkPo1LsmmkVwXqkLN1PiRnsn/eBG8om3zEK2yygm +btmlyTrIQRNg91CMFa6ybRoVGld45pIq2WWQgj9sAq+uEjonljYE1x2igGOpm/Hl +urR8FLBOybEfdF849lHqm/osohHUqS0nGkWxr7JOcQ3AWEbWaQbLU8uz/mtBzUF+ +fUwPfHJ5elnNXkoOrJupmHN5fLT0zLm4BwyydFy4x2+IoZCn9Kr5v2c69BoVYh63 +n749sSmvZ6ES8lgQGVMDMBu4Gon2nL2XA46jCfMdiyHxtN/kHNGfZQIG6lzWE7OE +76KlXIx3KadowGuuQNKotOrN8I1LOJwZmhsoVLiJkO/KdYE+HvJkJMcYr07/R54H +9jVlpNMKVv/1F2Rs76giJUmTtt8AF9pYfl3uxRuw0dFfIRDH+fO6AgonB8Xx1sfT +4PsJYGw= +-----END CERTIFICATE----- + +# Issuer: CN=Amazon Root CA 3 O=Amazon +# Subject: CN=Amazon Root CA 3 O=Amazon +# Label: "Amazon Root CA 3" +# Serial: 143266986699090766294700635381230934788665930 +# MD5 Fingerprint: a0:d4:ef:0b:f7:b5:d8:49:95:2a:ec:f5:c4:fc:81:87 +# SHA1 Fingerprint: 0d:44:dd:8c:3c:8c:1a:1a:58:75:64:81:e9:0f:2e:2a:ff:b3:d2:6e +# SHA256 Fingerprint: 18:ce:6c:fe:7b:f1:4e:60:b2:e3:47:b8:df:e8:68:cb:31:d0:2e:bb:3a:da:27:15:69:f5:03:43:b4:6d:b3:a4 +-----BEGIN CERTIFICATE----- +MIIBtjCCAVugAwIBAgITBmyf1XSXNmY/Owua2eiedgPySjAKBggqhkjOPQQDAjA5 +MQswCQYDVQQGEwJVUzEPMA0GA1UEChMGQW1hem9uMRkwFwYDVQQDExBBbWF6b24g +Um9vdCBDQSAzMB4XDTE1MDUyNjAwMDAwMFoXDTQwMDUyNjAwMDAwMFowOTELMAkG +A1UEBhMCVVMxDzANBgNVBAoTBkFtYXpvbjEZMBcGA1UEAxMQQW1hem9uIFJvb3Qg +Q0EgMzBZMBMGByqGSM49AgEGCCqGSM49AwEHA0IABCmXp8ZBf8ANm+gBG1bG8lKl +ui2yEujSLtf6ycXYqm0fc4E7O5hrOXwzpcVOho6AF2hiRVd9RFgdszflZwjrZt6j +QjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgGGMB0GA1UdDgQWBBSr +ttvXBp43rDCGB5Fwx5zEGbF4wDAKBggqhkjOPQQDAgNJADBGAiEA4IWSoxe3jfkr +BqWTrBqYaGFy+uGh0PsceGCmQ5nFuMQCIQCcAu/xlJyzlvnrxir4tiz+OpAUFteM +YyRIHN8wfdVoOw== +-----END CERTIFICATE----- + +# Issuer: CN=Amazon Root CA 4 O=Amazon +# Subject: CN=Amazon Root CA 4 O=Amazon +# Label: "Amazon Root CA 4" +# Serial: 143266989758080763974105200630763877849284878 +# MD5 Fingerprint: 89:bc:27:d5:eb:17:8d:06:6a:69:d5:fd:89:47:b4:cd +# SHA1 Fingerprint: f6:10:84:07:d6:f8:bb:67:98:0c:c2:e2:44:c2:eb:ae:1c:ef:63:be +# SHA256 Fingerprint: e3:5d:28:41:9e:d0:20:25:cf:a6:90:38:cd:62:39:62:45:8d:a5:c6:95:fb:de:a3:c2:2b:0b:fb:25:89:70:92 +-----BEGIN CERTIFICATE----- +MIIB8jCCAXigAwIBAgITBmyf18G7EEwpQ+Vxe3ssyBrBDjAKBggqhkjOPQQDAzA5 +MQswCQYDVQQGEwJVUzEPMA0GA1UEChMGQW1hem9uMRkwFwYDVQQDExBBbWF6b24g +Um9vdCBDQSA0MB4XDTE1MDUyNjAwMDAwMFoXDTQwMDUyNjAwMDAwMFowOTELMAkG +A1UEBhMCVVMxDzANBgNVBAoTBkFtYXpvbjEZMBcGA1UEAxMQQW1hem9uIFJvb3Qg +Q0EgNDB2MBAGByqGSM49AgEGBSuBBAAiA2IABNKrijdPo1MN/sGKe0uoe0ZLY7Bi +9i0b2whxIdIA6GO9mif78DluXeo9pcmBqqNbIJhFXRbb/egQbeOc4OO9X4Ri83Bk +M6DLJC9wuoihKqB1+IGuYgbEgds5bimwHvouXKNCMEAwDwYDVR0TAQH/BAUwAwEB +/zAOBgNVHQ8BAf8EBAMCAYYwHQYDVR0OBBYEFNPsxzplbszh2naaVvuc84ZtV+WB +MAoGCCqGSM49BAMDA2gAMGUCMDqLIfG9fhGt0O9Yli/W651+kI0rz2ZVwyzjKKlw +CkcO8DdZEv8tmZQoTipPNU0zWgIxAOp1AE47xDqUEpHJWEadIRNyp4iciuRMStuW +1KyLa2tJElMzrdfkviT8tQp21KW8EA== +-----END CERTIFICATE----- + +# Issuer: CN=TUBITAK Kamu SM SSL Kok Sertifikasi - Surum 1 O=Turkiye Bilimsel ve Teknolojik Arastirma Kurumu - TUBITAK OU=Kamu Sertifikasyon Merkezi - Kamu SM +# Subject: CN=TUBITAK Kamu SM SSL Kok Sertifikasi - Surum 1 O=Turkiye Bilimsel ve Teknolojik Arastirma Kurumu - TUBITAK OU=Kamu Sertifikasyon Merkezi - Kamu SM +# Label: "TUBITAK Kamu SM SSL Kok Sertifikasi - Surum 1" +# Serial: 1 +# MD5 Fingerprint: dc:00:81:dc:69:2f:3e:2f:b0:3b:f6:3d:5a:91:8e:49 +# SHA1 Fingerprint: 31:43:64:9b:ec:ce:27:ec:ed:3a:3f:0b:8f:0d:e4:e8:91:dd:ee:ca +# SHA256 Fingerprint: 46:ed:c3:68:90:46:d5:3a:45:3f:b3:10:4a:b8:0d:ca:ec:65:8b:26:60:ea:16:29:dd:7e:86:79:90:64:87:16 +-----BEGIN CERTIFICATE----- +MIIEYzCCA0ugAwIBAgIBATANBgkqhkiG9w0BAQsFADCB0jELMAkGA1UEBhMCVFIx +GDAWBgNVBAcTD0dlYnplIC0gS29jYWVsaTFCMEAGA1UEChM5VHVya2l5ZSBCaWxp +bXNlbCB2ZSBUZWtub2xvamlrIEFyYXN0aXJtYSBLdXJ1bXUgLSBUVUJJVEFLMS0w +KwYDVQQLEyRLYW11IFNlcnRpZmlrYXN5b24gTWVya2V6aSAtIEthbXUgU00xNjA0 +BgNVBAMTLVRVQklUQUsgS2FtdSBTTSBTU0wgS29rIFNlcnRpZmlrYXNpIC0gU3Vy +dW0gMTAeFw0xMzExMjUwODI1NTVaFw00MzEwMjUwODI1NTVaMIHSMQswCQYDVQQG +EwJUUjEYMBYGA1UEBxMPR2ViemUgLSBLb2NhZWxpMUIwQAYDVQQKEzlUdXJraXll +IEJpbGltc2VsIHZlIFRla25vbG9qaWsgQXJhc3Rpcm1hIEt1cnVtdSAtIFRVQklU +QUsxLTArBgNVBAsTJEthbXUgU2VydGlmaWthc3lvbiBNZXJrZXppIC0gS2FtdSBT +TTE2MDQGA1UEAxMtVFVCSVRBSyBLYW11IFNNIFNTTCBLb2sgU2VydGlmaWthc2kg +LSBTdXJ1bSAxMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAr3UwM6q7 +a9OZLBI3hNmNe5eA027n/5tQlT6QlVZC1xl8JoSNkvoBHToP4mQ4t4y86Ij5iySr +LqP1N+RAjhgleYN1Hzv/bKjFxlb4tO2KRKOrbEz8HdDc72i9z+SqzvBV96I01INr +N3wcwv61A+xXzry0tcXtAA9TNypN9E8Mg/uGz8v+jE69h/mniyFXnHrfA2eJLJ2X +YacQuFWQfw4tJzh03+f92k4S400VIgLI4OD8D62K18lUUMw7D8oWgITQUVbDjlZ/ +iSIzL+aFCr2lqBs23tPcLG07xxO9WSMs5uWk99gL7eqQQESolbuT1dCANLZGeA4f +AJNG4e7p+exPFwIDAQABo0IwQDAdBgNVHQ4EFgQUZT/HiobGPN08VFw1+DrtUgxH +V8gwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEL +BQADggEBACo/4fEyjq7hmFxLXs9rHmoJ0iKpEsdeV31zVmSAhHqT5Am5EM2fKifh +AHe+SMg1qIGf5LgsyX8OsNJLN13qudULXjS99HMpw+0mFZx+CFOKWI3QSyjfwbPf +IPP54+M638yclNhOT8NrF7f3cuitZjO1JVOr4PhMqZ398g26rrnZqsZr+ZO7rqu4 +lzwDGrpDxpa5RXI4s6ehlj2Re37AIVNMh+3yC1SVUZPVIqUNivGTDj5UDrDYyU7c +8jEyVupk+eq1nRZmQnLzf9OxMUP8pI4X8W0jq5Rm+K37DwhuJi1/FwcJsoz7UMCf +lo3Ptv0AnVoUmr8CRPXBwp8iXqIPoeM= +-----END CERTIFICATE----- + +# Issuer: CN=GDCA TrustAUTH R5 ROOT O=GUANG DONG CERTIFICATE AUTHORITY CO.,LTD. +# Subject: CN=GDCA TrustAUTH R5 ROOT O=GUANG DONG CERTIFICATE AUTHORITY CO.,LTD. +# Label: "GDCA TrustAUTH R5 ROOT" +# Serial: 9009899650740120186 +# MD5 Fingerprint: 63:cc:d9:3d:34:35:5c:6f:53:a3:e2:08:70:48:1f:b4 +# SHA1 Fingerprint: 0f:36:38:5b:81:1a:25:c3:9b:31:4e:83:ca:e9:34:66:70:cc:74:b4 +# SHA256 Fingerprint: bf:ff:8f:d0:44:33:48:7d:6a:8a:a6:0c:1a:29:76:7a:9f:c2:bb:b0:5e:42:0f:71:3a:13:b9:92:89:1d:38:93 +-----BEGIN CERTIFICATE----- +MIIFiDCCA3CgAwIBAgIIfQmX/vBH6nowDQYJKoZIhvcNAQELBQAwYjELMAkGA1UE +BhMCQ04xMjAwBgNVBAoMKUdVQU5HIERPTkcgQ0VSVElGSUNBVEUgQVVUSE9SSVRZ +IENPLixMVEQuMR8wHQYDVQQDDBZHRENBIFRydXN0QVVUSCBSNSBST09UMB4XDTE0 +MTEyNjA1MTMxNVoXDTQwMTIzMTE1NTk1OVowYjELMAkGA1UEBhMCQ04xMjAwBgNV +BAoMKUdVQU5HIERPTkcgQ0VSVElGSUNBVEUgQVVUSE9SSVRZIENPLixMVEQuMR8w +HQYDVQQDDBZHRENBIFRydXN0QVVUSCBSNSBST09UMIICIjANBgkqhkiG9w0BAQEF +AAOCAg8AMIICCgKCAgEA2aMW8Mh0dHeb7zMNOwZ+Vfy1YI92hhJCfVZmPoiC7XJj +Dp6L3TQsAlFRwxn9WVSEyfFrs0yw6ehGXTjGoqcuEVe6ghWinI9tsJlKCvLriXBj +TnnEt1u9ol2x8kECK62pOqPseQrsXzrj/e+APK00mxqriCZ7VqKChh/rNYmDf1+u +KU49tm7srsHwJ5uu4/Ts765/94Y9cnrrpftZTqfrlYwiOXnhLQiPzLyRuEH3FMEj +qcOtmkVEs7LXLM3GKeJQEK5cy4KOFxg2fZfmiJqwTTQJ9Cy5WmYqsBebnh52nUpm +MUHfP/vFBu8btn4aRjb3ZGM74zkYI+dndRTVdVeSN72+ahsmUPI2JgaQxXABZG12 +ZuGR224HwGGALrIuL4xwp9E7PLOR5G62xDtw8mySlwnNR30YwPO7ng/Wi64HtloP +zgsMR6flPri9fcebNaBhlzpBdRfMK5Z3KpIhHtmVdiBnaM8Nvd/WHwlqmuLMc3Gk +L30SgLdTMEZeS1SZD2fJpcjyIMGC7J0R38IC+xo70e0gmu9lZJIQDSri3nDxGGeC +jGHeuLzRL5z7D9Ar7Rt2ueQ5Vfj4oR24qoAATILnsn8JuLwwoC8N9VKejveSswoA +HQBUlwbgsQfZxw9cZX08bVlX5O2ljelAU58VS6Bx9hoh49pwBiFYFIeFd3mqgnkC +AwEAAaNCMEAwHQYDVR0OBBYEFOLJQJ9NzuiaoXzPDj9lxSmIahlRMA8GA1UdEwEB +/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgGGMA0GCSqGSIb3DQEBCwUAA4ICAQDRSVfg +p8xoWLoBDysZzY2wYUWsEe1jUGn4H3++Fo/9nesLqjJHdtJnJO29fDMylyrHBYZm +DRd9FBUb1Ov9H5r2XpdptxolpAqzkT9fNqyL7FeoPueBihhXOYV0GkLH6VsTX4/5 +COmSdI31R9KrO9b7eGZONn356ZLpBN79SWP8bfsUcZNnL0dKt7n/HipzcEYwv1ry +L3ml4Y0M2fmyYzeMN2WFcGpcWwlyua1jPLHd+PwyvzeG5LuOmCd+uh8W4XAR8gPf +JWIyJyYYMoSf/wA6E7qaTfRPuBRwIrHKK5DOKcFw9C+df/KQHtZa37dG/OaG+svg +IHZ6uqbL9XzeYqWxi+7egmaKTjowHz+Ay60nugxe19CxVsp3cbK1daFQqUBDF8Io +2c9Si1vIY9RCPqAzekYu9wogRlR+ak8x8YF+QnQ4ZXMn7sZ8uI7XpTrXmKGcjBBV +09tL7ECQ8s1uV9JiDnxXk7Gnbc2dg7sq5+W2O3FYrf3RRbxake5TFW/TRQl1brqQ +XR4EzzffHqhmsYzmIGrv/EhOdJhCrylvLmrH+33RZjEizIYAfmaDDEL0vTSSwxrq +T8p+ck0LcIymSLumoRT2+1hEmRSuqguTaaApJUqlyyvdimYHFngVV3Eb7PVHhPOe +MTd61X8kreS8/f3MboPoDKi3QWwH3b08hpcv0g== +-----END CERTIFICATE----- + +# Issuer: CN=SSL.com Root Certification Authority RSA O=SSL Corporation +# Subject: CN=SSL.com Root Certification Authority RSA O=SSL Corporation +# Label: "SSL.com Root Certification Authority RSA" +# Serial: 8875640296558310041 +# MD5 Fingerprint: 86:69:12:c0:70:f1:ec:ac:ac:c2:d5:bc:a5:5b:a1:29 +# SHA1 Fingerprint: b7:ab:33:08:d1:ea:44:77:ba:14:80:12:5a:6f:bd:a9:36:49:0c:bb +# SHA256 Fingerprint: 85:66:6a:56:2e:e0:be:5c:e9:25:c1:d8:89:0a:6f:76:a8:7e:c1:6d:4d:7d:5f:29:ea:74:19:cf:20:12:3b:69 +-----BEGIN CERTIFICATE----- +MIIF3TCCA8WgAwIBAgIIeyyb0xaAMpkwDQYJKoZIhvcNAQELBQAwfDELMAkGA1UE +BhMCVVMxDjAMBgNVBAgMBVRleGFzMRAwDgYDVQQHDAdIb3VzdG9uMRgwFgYDVQQK +DA9TU0wgQ29ycG9yYXRpb24xMTAvBgNVBAMMKFNTTC5jb20gUm9vdCBDZXJ0aWZp +Y2F0aW9uIEF1dGhvcml0eSBSU0EwHhcNMTYwMjEyMTczOTM5WhcNNDEwMjEyMTcz +OTM5WjB8MQswCQYDVQQGEwJVUzEOMAwGA1UECAwFVGV4YXMxEDAOBgNVBAcMB0hv +dXN0b24xGDAWBgNVBAoMD1NTTCBDb3Jwb3JhdGlvbjExMC8GA1UEAwwoU1NMLmNv +bSBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IFJTQTCCAiIwDQYJKoZIhvcN +AQEBBQADggIPADCCAgoCggIBAPkP3aMrfcvQKv7sZ4Wm5y4bunfh4/WvpOz6Sl2R +xFdHaxh3a3by/ZPkPQ/CFp4LZsNWlJ4Xg4XOVu/yFv0AYvUiCVToZRdOQbngT0aX +qhvIuG5iXmmxX9sqAn78bMrzQdjt0Oj8P2FI7bADFB0QDksZ4LtO7IZl/zbzXmcC +C52GVWH9ejjt/uIZALdvoVBidXQ8oPrIJZK0bnoix/geoeOy3ZExqysdBP+lSgQ3 +6YWkMyv94tZVNHwZpEpox7Ko07fKoZOI68GXvIz5HdkihCR0xwQ9aqkpk8zruFvh +/l8lqjRYyMEjVJ0bmBHDOJx+PYZspQ9AhnwC9FwCTyjLrnGfDzrIM/4RJTXq/LrF +YD3ZfBjVsqnTdXgDciLKOsMf7yzlLqn6niy2UUb9rwPW6mBo6oUWNmuF6R7As93E +JNyAKoFBbZQ+yODJgUEAnl6/f8UImKIYLEJAs/lvOCdLToD0PYFH4Ih86hzOtXVc +US4cK38acijnALXRdMbX5J+tB5O2UzU1/Dfkw/ZdFr4hc96SCvigY2q8lpJqPvi8 +ZVWb3vUNiSYE/CUapiVpy8JtynziWV+XrOvvLsi81xtZPCvM8hnIk2snYxnP/Okm ++Mpxm3+T/jRnhE6Z6/yzeAkzcLpmpnbtG3PrGqUNxCITIJRWCk4sbE6x/c+cCbqi +M+2HAgMBAAGjYzBhMB0GA1UdDgQWBBTdBAkHovV6fVJTEpKV7jiAJQ2mWTAPBgNV +HRMBAf8EBTADAQH/MB8GA1UdIwQYMBaAFN0ECQei9Xp9UlMSkpXuOIAlDaZZMA4G +A1UdDwEB/wQEAwIBhjANBgkqhkiG9w0BAQsFAAOCAgEAIBgRlCn7Jp0cHh5wYfGV +cpNxJK1ok1iOMq8bs3AD/CUrdIWQPXhq9LmLpZc7tRiRux6n+UBbkflVma8eEdBc +Hadm47GUBwwyOabqG7B52B2ccETjit3E+ZUfijhDPwGFpUenPUayvOUiaPd7nNgs +PgohyC0zrL/FgZkxdMF1ccW+sfAjRfSda/wZY52jvATGGAslu1OJD7OAUN5F7kR/ +q5R4ZJjT9ijdh9hwZXT7DrkT66cPYakylszeu+1jTBi7qUD3oFRuIIhxdRjqerQ0 +cuAjJ3dctpDqhiVAq+8zD8ufgr6iIPv2tS0a5sKFsXQP+8hlAqRSAUfdSSLBv9jr +a6x+3uxjMxW3IwiPxg+NQVrdjsW5j+VFP3jbutIbQLH+cU0/4IGiul607BXgk90I +H37hVZkLId6Tngr75qNJvTYw/ud3sqB1l7UtgYgXZSD32pAAn8lSzDLKNXz1PQ/Y +K9f1JmzJBjSWFupwWRoyeXkLtoh/D1JIPb9s2KJELtFOt3JY04kTlf5Eq/jXixtu +nLwsoFvVagCvXzfh1foQC5ichucmj87w7G6KVwuA406ywKBjYZC6VWg3dGq2ktuf +oYYitmUnDuy2n0Jg5GfCtdpBC8TTi2EbvPofkSvXRAdeuims2cXp71NIWuuA8ShY +Ic2wBlX7Jz9TkHCpBB5XJ7k= +-----END CERTIFICATE----- + +# Issuer: CN=SSL.com Root Certification Authority ECC O=SSL Corporation +# Subject: CN=SSL.com Root Certification Authority ECC O=SSL Corporation +# Label: "SSL.com Root Certification Authority ECC" +# Serial: 8495723813297216424 +# MD5 Fingerprint: 2e:da:e4:39:7f:9c:8f:37:d1:70:9f:26:17:51:3a:8e +# SHA1 Fingerprint: c3:19:7c:39:24:e6:54:af:1b:c4:ab:20:95:7a:e2:c3:0e:13:02:6a +# SHA256 Fingerprint: 34:17:bb:06:cc:60:07:da:1b:96:1c:92:0b:8a:b4:ce:3f:ad:82:0e:4a:a3:0b:9a:cb:c4:a7:4e:bd:ce:bc:65 +-----BEGIN CERTIFICATE----- +MIICjTCCAhSgAwIBAgIIdebfy8FoW6gwCgYIKoZIzj0EAwIwfDELMAkGA1UEBhMC +VVMxDjAMBgNVBAgMBVRleGFzMRAwDgYDVQQHDAdIb3VzdG9uMRgwFgYDVQQKDA9T +U0wgQ29ycG9yYXRpb24xMTAvBgNVBAMMKFNTTC5jb20gUm9vdCBDZXJ0aWZpY2F0 +aW9uIEF1dGhvcml0eSBFQ0MwHhcNMTYwMjEyMTgxNDAzWhcNNDEwMjEyMTgxNDAz +WjB8MQswCQYDVQQGEwJVUzEOMAwGA1UECAwFVGV4YXMxEDAOBgNVBAcMB0hvdXN0 +b24xGDAWBgNVBAoMD1NTTCBDb3Jwb3JhdGlvbjExMC8GA1UEAwwoU1NMLmNvbSBS +b290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IEVDQzB2MBAGByqGSM49AgEGBSuB +BAAiA2IABEVuqVDEpiM2nl8ojRfLliJkP9x6jh3MCLOicSS6jkm5BBtHllirLZXI +7Z4INcgn64mMU1jrYor+8FsPazFSY0E7ic3s7LaNGdM0B9y7xgZ/wkWV7Mt/qCPg +CemB+vNH06NjMGEwHQYDVR0OBBYEFILRhXMw5zUE044CkvvlpNHEIejNMA8GA1Ud +EwEB/wQFMAMBAf8wHwYDVR0jBBgwFoAUgtGFczDnNQTTjgKS++Wk0cQh6M0wDgYD +VR0PAQH/BAQDAgGGMAoGCCqGSM49BAMCA2cAMGQCMG/n61kRpGDPYbCWe+0F+S8T +kdzt5fxQaxFGRrMcIQBiu77D5+jNB5n5DQtdcj7EqgIwH7y6C+IwJPt8bYBVCpk+ +gA0z5Wajs6O7pdWLjwkspl1+4vAHCGht0nxpbl/f5Wpl +-----END CERTIFICATE----- + +# Issuer: CN=SSL.com EV Root Certification Authority RSA R2 O=SSL Corporation +# Subject: CN=SSL.com EV Root Certification Authority RSA R2 O=SSL Corporation +# Label: "SSL.com EV Root Certification Authority RSA R2" +# Serial: 6248227494352943350 +# MD5 Fingerprint: e1:1e:31:58:1a:ae:54:53:02:f6:17:6a:11:7b:4d:95 +# SHA1 Fingerprint: 74:3a:f0:52:9b:d0:32:a0:f4:4a:83:cd:d4:ba:a9:7b:7c:2e:c4:9a +# SHA256 Fingerprint: 2e:7b:f1:6c:c2:24:85:a7:bb:e2:aa:86:96:75:07:61:b0:ae:39:be:3b:2f:e9:d0:cc:6d:4e:f7:34:91:42:5c +-----BEGIN CERTIFICATE----- +MIIF6zCCA9OgAwIBAgIIVrYpzTS8ePYwDQYJKoZIhvcNAQELBQAwgYIxCzAJBgNV +BAYTAlVTMQ4wDAYDVQQIDAVUZXhhczEQMA4GA1UEBwwHSG91c3RvbjEYMBYGA1UE +CgwPU1NMIENvcnBvcmF0aW9uMTcwNQYDVQQDDC5TU0wuY29tIEVWIFJvb3QgQ2Vy +dGlmaWNhdGlvbiBBdXRob3JpdHkgUlNBIFIyMB4XDTE3MDUzMTE4MTQzN1oXDTQy +MDUzMDE4MTQzN1owgYIxCzAJBgNVBAYTAlVTMQ4wDAYDVQQIDAVUZXhhczEQMA4G +A1UEBwwHSG91c3RvbjEYMBYGA1UECgwPU1NMIENvcnBvcmF0aW9uMTcwNQYDVQQD +DC5TU0wuY29tIEVWIFJvb3QgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgUlNBIFIy +MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAjzZlQOHWTcDXtOlG2mvq +M0fNTPl9fb69LT3w23jhhqXZuglXaO1XPqDQCEGD5yhBJB/jchXQARr7XnAjssuf +OePPxU7Gkm0mxnu7s9onnQqG6YE3Bf7wcXHswxzpY6IXFJ3vG2fThVUCAtZJycxa +4bH3bzKfydQ7iEGonL3Lq9ttewkfokxykNorCPzPPFTOZw+oz12WGQvE43LrrdF9 +HSfvkusQv1vrO6/PgN3B0pYEW3p+pKk8OHakYo6gOV7qd89dAFmPZiw+B6KjBSYR +aZfqhbcPlgtLyEDhULouisv3D5oi53+aNxPN8k0TayHRwMwi8qFG9kRpnMphNQcA +b9ZhCBHqurj26bNg5U257J8UZslXWNvNh2n4ioYSA0e/ZhN2rHd9NCSFg83XqpyQ +Gp8hLH94t2S42Oim9HizVcuE0jLEeK6jj2HdzghTreyI/BXkmg3mnxp3zkyPuBQV +PWKchjgGAGYS5Fl2WlPAApiiECtoRHuOec4zSnaqW4EWG7WK2NAAe15itAnWhmMO +pgWVSbooi4iTsjQc2KRVbrcc0N6ZVTsj9CLg+SlmJuwgUHfbSguPvuUCYHBBXtSu +UDkiFCbLsjtzdFVHB3mBOagwE0TlBIqulhMlQg+5U8Sb/M3kHN48+qvWBkofZ6aY +MBzdLNvcGJVXZsb/XItW9XcCAwEAAaNjMGEwDwYDVR0TAQH/BAUwAwEB/zAfBgNV +HSMEGDAWgBT5YLvU49U09rj1BoAlp3PbRmmonjAdBgNVHQ4EFgQU+WC71OPVNPa4 +9QaAJadz20ZpqJ4wDgYDVR0PAQH/BAQDAgGGMA0GCSqGSIb3DQEBCwUAA4ICAQBW +s47LCp1Jjr+kxJG7ZhcFUZh1++VQLHqe8RT6q9OKPv+RKY9ji9i0qVQBDb6Thi/5 +Sm3HXvVX+cpVHBK+Rw82xd9qt9t1wkclf7nxY/hoLVUE0fKNsKTPvDxeH3jnpaAg +cLAExbf3cqfeIg29MyVGjGSSJuM+LmOW2puMPfgYCdcDzH2GguDKBAdRUNf/ktUM +79qGn5nX67evaOI5JpS6aLe/g9Pqemc9YmeuJeVy6OLk7K4S9ksrPJ/psEDzOFSz +/bdoyNrGj1E8svuR3Bznm53htw1yj+KkxKl4+esUrMZDBcJlOSgYAsOCsp0FvmXt +ll9ldDz7CTUue5wT/RsPXcdtgTpWD8w74a8CLyKsRspGPKAcTNZEtF4uXBVmCeEm +Kf7GUmG6sXP/wwyc5WxqlD8UykAWlYTzWamsX0xhk23RO8yilQwipmdnRC652dKK +QbNmC1r7fSOl8hqw/96bg5Qu0T/fkreRrwU7ZcegbLHNYhLDkBvjJc40vG93drEQ +w/cFGsDWr3RiSBd3kmmQYRzelYB0VI8YHMPzA9C/pEN1hlMYegouCRw2n5H9gooi +S9EOUCXdywMMF8mDAAhONU2Ki+3wApRmLER/y5UnlhetCTCstnEXbosX9hwJ1C07 +mKVx01QT2WDz9UtmT/rx7iASjbSsV7FFY6GsdqnC+w== +-----END CERTIFICATE----- + +# Issuer: CN=SSL.com EV Root Certification Authority ECC O=SSL Corporation +# Subject: CN=SSL.com EV Root Certification Authority ECC O=SSL Corporation +# Label: "SSL.com EV Root Certification Authority ECC" +# Serial: 3182246526754555285 +# MD5 Fingerprint: 59:53:22:65:83:42:01:54:c0:ce:42:b9:5a:7c:f2:90 +# SHA1 Fingerprint: 4c:dd:51:a3:d1:f5:20:32:14:b0:c6:c5:32:23:03:91:c7:46:42:6d +# SHA256 Fingerprint: 22:a2:c1:f7:bd:ed:70:4c:c1:e7:01:b5:f4:08:c3:10:88:0f:e9:56:b5:de:2a:4a:44:f9:9c:87:3a:25:a7:c8 +-----BEGIN CERTIFICATE----- +MIIClDCCAhqgAwIBAgIILCmcWxbtBZUwCgYIKoZIzj0EAwIwfzELMAkGA1UEBhMC +VVMxDjAMBgNVBAgMBVRleGFzMRAwDgYDVQQHDAdIb3VzdG9uMRgwFgYDVQQKDA9T +U0wgQ29ycG9yYXRpb24xNDAyBgNVBAMMK1NTTC5jb20gRVYgUm9vdCBDZXJ0aWZp +Y2F0aW9uIEF1dGhvcml0eSBFQ0MwHhcNMTYwMjEyMTgxNTIzWhcNNDEwMjEyMTgx +NTIzWjB/MQswCQYDVQQGEwJVUzEOMAwGA1UECAwFVGV4YXMxEDAOBgNVBAcMB0hv +dXN0b24xGDAWBgNVBAoMD1NTTCBDb3Jwb3JhdGlvbjE0MDIGA1UEAwwrU1NMLmNv +bSBFViBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IEVDQzB2MBAGByqGSM49 +AgEGBSuBBAAiA2IABKoSR5CYG/vvw0AHgyBO8TCCogbR8pKGYfL2IWjKAMTH6kMA +VIbc/R/fALhBYlzccBYy3h+Z1MzFB8gIH2EWB1E9fVwHU+M1OIzfzZ/ZLg1Kthku +WnBaBu2+8KGwytAJKaNjMGEwHQYDVR0OBBYEFFvKXuXe0oGqzagtZFG22XKbl+ZP +MA8GA1UdEwEB/wQFMAMBAf8wHwYDVR0jBBgwFoAUW8pe5d7SgarNqC1kUbbZcpuX +5k8wDgYDVR0PAQH/BAQDAgGGMAoGCCqGSM49BAMCA2gAMGUCMQCK5kCJN+vp1RPZ +ytRrJPOwPYdGWBrssd9v+1a6cGvHOMzosYxPD/fxZ3YOg9AeUY8CMD32IygmTMZg +h5Mmm7I1HrrW9zzRHM76JTymGoEVW/MSD2zuZYrJh6j5B+BimoxcSg== +-----END CERTIFICATE----- + +# Issuer: CN=GlobalSign O=GlobalSign OU=GlobalSign Root CA - R6 +# Subject: CN=GlobalSign O=GlobalSign OU=GlobalSign Root CA - R6 +# Label: "GlobalSign Root CA - R6" +# Serial: 1417766617973444989252670301619537 +# MD5 Fingerprint: 4f:dd:07:e4:d4:22:64:39:1e:0c:37:42:ea:d1:c6:ae +# SHA1 Fingerprint: 80:94:64:0e:b5:a7:a1:ca:11:9c:1f:dd:d5:9f:81:02:63:a7:fb:d1 +# SHA256 Fingerprint: 2c:ab:ea:fe:37:d0:6c:a2:2a:ba:73:91:c0:03:3d:25:98:29:52:c4:53:64:73:49:76:3a:3a:b5:ad:6c:cf:69 +-----BEGIN CERTIFICATE----- +MIIFgzCCA2ugAwIBAgIORea7A4Mzw4VlSOb/RVEwDQYJKoZIhvcNAQEMBQAwTDEg +MB4GA1UECxMXR2xvYmFsU2lnbiBSb290IENBIC0gUjYxEzARBgNVBAoTCkdsb2Jh +bFNpZ24xEzARBgNVBAMTCkdsb2JhbFNpZ24wHhcNMTQxMjEwMDAwMDAwWhcNMzQx +MjEwMDAwMDAwWjBMMSAwHgYDVQQLExdHbG9iYWxTaWduIFJvb3QgQ0EgLSBSNjET +MBEGA1UEChMKR2xvYmFsU2lnbjETMBEGA1UEAxMKR2xvYmFsU2lnbjCCAiIwDQYJ +KoZIhvcNAQEBBQADggIPADCCAgoCggIBAJUH6HPKZvnsFMp7PPcNCPG0RQssgrRI +xutbPK6DuEGSMxSkb3/pKszGsIhrxbaJ0cay/xTOURQh7ErdG1rG1ofuTToVBu1k +ZguSgMpE3nOUTvOniX9PeGMIyBJQbUJmL025eShNUhqKGoC3GYEOfsSKvGRMIRxD +aNc9PIrFsmbVkJq3MQbFvuJtMgamHvm566qjuL++gmNQ0PAYid/kD3n16qIfKtJw +LnvnvJO7bVPiSHyMEAc4/2ayd2F+4OqMPKq0pPbzlUoSB239jLKJz9CgYXfIWHSw +1CM69106yqLbnQneXUQtkPGBzVeS+n68UARjNN9rkxi+azayOeSsJDa38O+2HBNX +k7besvjihbdzorg1qkXy4J02oW9UivFyVm4uiMVRQkQVlO6jxTiWm05OWgtH8wY2 +SXcwvHE35absIQh1/OZhFj931dmRl4QKbNQCTXTAFO39OfuD8l4UoQSwC+n+7o/h +bguyCLNhZglqsQY6ZZZZwPA1/cnaKI0aEYdwgQqomnUdnjqGBQCe24DWJfncBZ4n +WUx2OVvq+aWh2IMP0f/fMBH5hc8zSPXKbWQULHpYT9NLCEnFlWQaYw55PfWzjMpY +rZxCRXluDocZXFSxZba/jJvcE+kNb7gu3GduyYsRtYQUigAZcIN5kZeR1Bonvzce +MgfYFGM8KEyvAgMBAAGjYzBhMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTAD +AQH/MB0GA1UdDgQWBBSubAWjkxPioufi1xzWx/B/yGdToDAfBgNVHSMEGDAWgBSu +bAWjkxPioufi1xzWx/B/yGdToDANBgkqhkiG9w0BAQwFAAOCAgEAgyXt6NH9lVLN +nsAEoJFp5lzQhN7craJP6Ed41mWYqVuoPId8AorRbrcWc+ZfwFSY1XS+wc3iEZGt +Ixg93eFyRJa0lV7Ae46ZeBZDE1ZXs6KzO7V33EByrKPrmzU+sQghoefEQzd5Mr61 +55wsTLxDKZmOMNOsIeDjHfrYBzN2VAAiKrlNIC5waNrlU/yDXNOd8v9EDERm8tLj +vUYAGm0CuiVdjaExUd1URhxN25mW7xocBFymFe944Hn+Xds+qkxV/ZoVqW/hpvvf +cDDpw+5CRu3CkwWJ+n1jez/QcYF8AOiYrg54NMMl+68KnyBr3TsTjxKM4kEaSHpz +oHdpx7Zcf4LIHv5YGygrqGytXm3ABdJ7t+uA/iU3/gKbaKxCXcPu9czc8FB10jZp +nOZ7BN9uBmm23goJSFmH63sUYHpkqmlD75HHTOwY3WzvUy2MmeFe8nI+z1TIvWfs +pA9MRf/TuTAjB0yPEL+GltmZWrSZVxykzLsViVO6LAUP5MSeGbEYNNVMnbrt9x+v +JJUEeKgDu+6B5dpffItKoZB0JaezPkvILFa9x8jvOOJckvB595yEunQtYQEgfn7R +8k8HWV+LLUNS60YMlOH1Zkd5d9VUWx+tJDfLRVpOoERIyNiwmcUVhAn21klJwGW4 +5hpxbqCo8YLoRT5s1gLXCmeDBVrJpBA= +-----END CERTIFICATE----- + +# Issuer: CN=OISTE WISeKey Global Root GC CA O=WISeKey OU=OISTE Foundation Endorsed +# Subject: CN=OISTE WISeKey Global Root GC CA O=WISeKey OU=OISTE Foundation Endorsed +# Label: "OISTE WISeKey Global Root GC CA" +# Serial: 44084345621038548146064804565436152554 +# MD5 Fingerprint: a9:d6:b9:2d:2f:93:64:f8:a5:69:ca:91:e9:68:07:23 +# SHA1 Fingerprint: e0:11:84:5e:34:de:be:88:81:b9:9c:f6:16:26:d1:96:1f:c3:b9:31 +# SHA256 Fingerprint: 85:60:f9:1c:36:24:da:ba:95:70:b5:fe:a0:db:e3:6f:f1:1a:83:23:be:94:86:85:4f:b3:f3:4a:55:71:19:8d +-----BEGIN CERTIFICATE----- +MIICaTCCAe+gAwIBAgIQISpWDK7aDKtARb8roi066jAKBggqhkjOPQQDAzBtMQsw +CQYDVQQGEwJDSDEQMA4GA1UEChMHV0lTZUtleTEiMCAGA1UECxMZT0lTVEUgRm91 +bmRhdGlvbiBFbmRvcnNlZDEoMCYGA1UEAxMfT0lTVEUgV0lTZUtleSBHbG9iYWwg +Um9vdCBHQyBDQTAeFw0xNzA1MDkwOTQ4MzRaFw00MjA1MDkwOTU4MzNaMG0xCzAJ +BgNVBAYTAkNIMRAwDgYDVQQKEwdXSVNlS2V5MSIwIAYDVQQLExlPSVNURSBGb3Vu +ZGF0aW9uIEVuZG9yc2VkMSgwJgYDVQQDEx9PSVNURSBXSVNlS2V5IEdsb2JhbCBS +b290IEdDIENBMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAETOlQwMYPchi82PG6s4ni +eUqjFqdrVCTbUf/q9Akkwwsin8tqJ4KBDdLArzHkdIJuyiXZjHWd8dvQmqJLIX4W +p2OQ0jnUsYd4XxiWD1AbNTcPasbc2RNNpI6QN+a9WzGRo1QwUjAOBgNVHQ8BAf8E +BAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUSIcUrOPDnpBgOtfKie7T +rYy0UGYwEAYJKwYBBAGCNxUBBAMCAQAwCgYIKoZIzj0EAwMDaAAwZQIwJsdpW9zV +57LnyAyMjMPdeYwbY9XJUpROTYJKcx6ygISpJcBMWm1JKWB4E+J+SOtkAjEA2zQg +Mgj/mkkCtojeFK9dbJlxjRo/i9fgojaGHAeCOnZT/cKi7e97sIBPWA9LUzm9 +-----END CERTIFICATE----- + +# Issuer: CN=UCA Global G2 Root O=UniTrust +# Subject: CN=UCA Global G2 Root O=UniTrust +# Label: "UCA Global G2 Root" +# Serial: 124779693093741543919145257850076631279 +# MD5 Fingerprint: 80:fe:f0:c4:4a:f0:5c:62:32:9f:1c:ba:78:a9:50:f8 +# SHA1 Fingerprint: 28:f9:78:16:19:7a:ff:18:25:18:aa:44:fe:c1:a0:ce:5c:b6:4c:8a +# SHA256 Fingerprint: 9b:ea:11:c9:76:fe:01:47:64:c1:be:56:a6:f9:14:b5:a5:60:31:7a:bd:99:88:39:33:82:e5:16:1a:a0:49:3c +-----BEGIN CERTIFICATE----- +MIIFRjCCAy6gAwIBAgIQXd+x2lqj7V2+WmUgZQOQ7zANBgkqhkiG9w0BAQsFADA9 +MQswCQYDVQQGEwJDTjERMA8GA1UECgwIVW5pVHJ1c3QxGzAZBgNVBAMMElVDQSBH +bG9iYWwgRzIgUm9vdDAeFw0xNjAzMTEwMDAwMDBaFw00MDEyMzEwMDAwMDBaMD0x +CzAJBgNVBAYTAkNOMREwDwYDVQQKDAhVbmlUcnVzdDEbMBkGA1UEAwwSVUNBIEds +b2JhbCBHMiBSb290MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAxeYr +b3zvJgUno4Ek2m/LAfmZmqkywiKHYUGRO8vDaBsGxUypK8FnFyIdK+35KYmToni9 +kmugow2ifsqTs6bRjDXVdfkX9s9FxeV67HeToI8jrg4aA3++1NDtLnurRiNb/yzm +VHqUwCoV8MmNsHo7JOHXaOIxPAYzRrZUEaalLyJUKlgNAQLx+hVRZ2zA+te2G3/R +VogvGjqNO7uCEeBHANBSh6v7hn4PJGtAnTRnvI3HLYZveT6OqTwXS3+wmeOwcWDc +C/Vkw85DvG1xudLeJ1uK6NjGruFZfc8oLTW4lVYa8bJYS7cSN8h8s+1LgOGN+jIj +tm+3SJUIsUROhYw6AlQgL9+/V087OpAh18EmNVQg7Mc/R+zvWr9LesGtOxdQXGLY +D0tK3Cv6brxzks3sx1DoQZbXqX5t2Okdj4q1uViSukqSKwxW/YDrCPBeKW4bHAyv +j5OJrdu9o54hyokZ7N+1wxrrFv54NkzWbtA+FxyQF2smuvt6L78RHBgOLXMDj6Dl +NaBa4kx1HXHhOThTeEDMg5PXCp6dW4+K5OXgSORIskfNTip1KnvyIvbJvgmRlld6 +iIis7nCs+dwp4wwcOxJORNanTrAmyPPZGpeRaOrvjUYG0lZFWJo8DA+DuAUlwznP +O6Q0ibd5Ei9Hxeepl2n8pndntd978XplFeRhVmUCAwEAAaNCMEAwDgYDVR0PAQH/ +BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFIHEjMz15DD/pQwIX4wV +ZyF0Ad/fMA0GCSqGSIb3DQEBCwUAA4ICAQATZSL1jiutROTL/7lo5sOASD0Ee/oj +L3rtNtqyzm325p7lX1iPyzcyochltq44PTUbPrw7tgTQvPlJ9Zv3hcU2tsu8+Mg5 +1eRfB70VVJd0ysrtT7q6ZHafgbiERUlMjW+i67HM0cOU2kTC5uLqGOiiHycFutfl +1qnN3e92mI0ADs0b+gO3joBYDic/UvuUospeZcnWhNq5NXHzJsBPd+aBJ9J3O5oU +b3n09tDh05S60FdRvScFDcH9yBIw7m+NESsIndTUv4BFFJqIRNow6rSn4+7vW4LV +PtateJLbXDzz2K36uGt/xDYotgIVilQsnLAXc47QN6MUPJiVAAwpBVueSUmxX8fj +y88nZY41F7dXyDDZQVu5FLbowg+UMaeUmMxq67XhJ/UQqAHojhJi6IjMtX9Gl8Cb +EGY4GjZGXyJoPd/JxhMnq1MGrKI8hgZlb7F+sSlEmqO6SWkoaY/X5V+tBIZkbxqg +DMUIYs6Ao9Dz7GjevjPHF1t/gMRMTLGmhIrDO7gJzRSBuhjjVFc2/tsvfEehOjPI ++Vg7RE+xygKJBJYoaMVLuCaJu9YzL1DV/pqJuhgyklTGW+Cd+V7lDSKb9triyCGy +YiGqhkCyLmTTX8jjfhFnRR8F/uOi77Oos/N9j/gMHyIfLXC0uAE0djAA5SN4p1bX +UB+K+wb1whnw0A== +-----END CERTIFICATE----- + +# Issuer: CN=UCA Extended Validation Root O=UniTrust +# Subject: CN=UCA Extended Validation Root O=UniTrust +# Label: "UCA Extended Validation Root" +# Serial: 106100277556486529736699587978573607008 +# MD5 Fingerprint: a1:f3:5f:43:c6:34:9b:da:bf:8c:7e:05:53:ad:96:e2 +# SHA1 Fingerprint: a3:a1:b0:6f:24:61:23:4a:e3:36:a5:c2:37:fc:a6:ff:dd:f0:d7:3a +# SHA256 Fingerprint: d4:3a:f9:b3:54:73:75:5c:96:84:fc:06:d7:d8:cb:70:ee:5c:28:e7:73:fb:29:4e:b4:1e:e7:17:22:92:4d:24 +-----BEGIN CERTIFICATE----- +MIIFWjCCA0KgAwIBAgIQT9Irj/VkyDOeTzRYZiNwYDANBgkqhkiG9w0BAQsFADBH +MQswCQYDVQQGEwJDTjERMA8GA1UECgwIVW5pVHJ1c3QxJTAjBgNVBAMMHFVDQSBF +eHRlbmRlZCBWYWxpZGF0aW9uIFJvb3QwHhcNMTUwMzEzMDAwMDAwWhcNMzgxMjMx +MDAwMDAwWjBHMQswCQYDVQQGEwJDTjERMA8GA1UECgwIVW5pVHJ1c3QxJTAjBgNV +BAMMHFVDQSBFeHRlbmRlZCBWYWxpZGF0aW9uIFJvb3QwggIiMA0GCSqGSIb3DQEB +AQUAA4ICDwAwggIKAoICAQCpCQcoEwKwmeBkqh5DFnpzsZGgdT6o+uM4AHrsiWog +D4vFsJszA1qGxliG1cGFu0/GnEBNyr7uaZa4rYEwmnySBesFK5pI0Lh2PpbIILvS +sPGP2KxFRv+qZ2C0d35qHzwaUnoEPQc8hQ2E0B92CvdqFN9y4zR8V05WAT558aop +O2z6+I9tTcg1367r3CTueUWnhbYFiN6IXSV8l2RnCdm/WhUFhvMJHuxYMjMR83dk +sHYf5BA1FxvyDrFspCqjc/wJHx4yGVMR59mzLC52LqGj3n5qiAno8geK+LLNEOfi +c0CTuwjRP+H8C5SzJe98ptfRr5//lpr1kXuYC3fUfugH0mK1lTnj8/FtDw5lhIpj +VMWAtuCeS31HJqcBCF3RiJ7XwzJE+oJKCmhUfzhTA8ykADNkUVkLo4KRel7sFsLz +KuZi2irbWWIQJUoqgQtHB0MGcIfS+pMRKXpITeuUx3BNr2fVUbGAIAEBtHoIppB/ +TuDvB0GHr2qlXov7z1CymlSvw4m6WC31MJixNnI5fkkE/SmnTHnkBVfblLkWU41G +sx2VYVdWf6/wFlthWG82UBEL2KwrlRYaDh8IzTY0ZRBiZtWAXxQgXy0MoHgKaNYs +1+lvK9JKBZP8nm9rZ/+I8U6laUpSNwXqxhaN0sSZ0YIrO7o1dfdRUVjzyAfd5LQD +fwIDAQABo0IwQDAdBgNVHQ4EFgQU2XQ65DA9DfcS3H5aBZ8eNJr34RQwDwYDVR0T +AQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAYYwDQYJKoZIhvcNAQELBQADggIBADaN +l8xCFWQpN5smLNb7rhVpLGsaGvdftvkHTFnq88nIua7Mui563MD1sC3AO6+fcAUR +ap8lTwEpcOPlDOHqWnzcSbvBHiqB9RZLcpHIojG5qtr8nR/zXUACE/xOHAbKsxSQ +VBcZEhrxH9cMaVr2cXj0lH2RC47skFSOvG+hTKv8dGT9cZr4QQehzZHkPJrgmzI5 +c6sq1WnIeJEmMX3ixzDx/BR4dxIOE/TdFpS/S2d7cFOFyrC78zhNLJA5wA3CXWvp +4uXViI3WLL+rG761KIcSF3Ru/H38j9CHJrAb+7lsq+KePRXBOy5nAliRn+/4Qh8s +t2j1da3Ptfb/EX3C8CSlrdP6oDyp+l3cpaDvRKS+1ujl5BOWF3sGPjLtx7dCvHaj +2GU4Kzg1USEODm8uNBNA4StnDG1KQTAYI1oyVZnJF+A83vbsea0rWBmirSwiGpWO +vpaQXUJXxPkUAzUrHC1RVwinOt4/5Mi0A3PCwSaAuwtCH60NryZy2sy+s6ODWA2C +xR9GUeOcGMyNm43sSet1UNWMKFnKdDTajAshqx7qG+XH/RU+wBeq+yNuJkbL+vmx +cmtpzyKEC2IPrNkZAJSidjzULZrtBJ4tBmIQN1IchXIbJ+XMxjHsN+xjWZsLHXbM +fjKaiJUINlK73nZfdklJrX+9ZSCyycErdhh2n1ax +-----END CERTIFICATE----- + +# Issuer: CN=Certigna Root CA O=Dhimyotis OU=0002 48146308100036 +# Subject: CN=Certigna Root CA O=Dhimyotis OU=0002 48146308100036 +# Label: "Certigna Root CA" +# Serial: 269714418870597844693661054334862075617 +# MD5 Fingerprint: 0e:5c:30:62:27:eb:5b:bc:d7:ae:62:ba:e9:d5:df:77 +# SHA1 Fingerprint: 2d:0d:52:14:ff:9e:ad:99:24:01:74:20:47:6e:6c:85:27:27:f5:43 +# SHA256 Fingerprint: d4:8d:3d:23:ee:db:50:a4:59:e5:51:97:60:1c:27:77:4b:9d:7b:18:c9:4d:5a:05:95:11:a1:02:50:b9:31:68 +-----BEGIN CERTIFICATE----- +MIIGWzCCBEOgAwIBAgIRAMrpG4nxVQMNo+ZBbcTjpuEwDQYJKoZIhvcNAQELBQAw +WjELMAkGA1UEBhMCRlIxEjAQBgNVBAoMCURoaW15b3RpczEcMBoGA1UECwwTMDAw +MiA0ODE0NjMwODEwMDAzNjEZMBcGA1UEAwwQQ2VydGlnbmEgUm9vdCBDQTAeFw0x +MzEwMDEwODMyMjdaFw0zMzEwMDEwODMyMjdaMFoxCzAJBgNVBAYTAkZSMRIwEAYD +VQQKDAlEaGlteW90aXMxHDAaBgNVBAsMEzAwMDIgNDgxNDYzMDgxMDAwMzYxGTAX +BgNVBAMMEENlcnRpZ25hIFJvb3QgQ0EwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAw +ggIKAoICAQDNGDllGlmx6mQWDoyUJJV8g9PFOSbcDO8WV43X2KyjQn+Cyu3NW9sO +ty3tRQgXstmzy9YXUnIo245Onoq2C/mehJpNdt4iKVzSs9IGPjA5qXSjklYcoW9M +CiBtnyN6tMbaLOQdLNyzKNAT8kxOAkmhVECe5uUFoC2EyP+YbNDrihqECB63aCPu +I9Vwzm1RaRDuoXrC0SIxwoKF0vJVdlB8JXrJhFwLrN1CTivngqIkicuQstDuI7pm +TLtipPlTWmR7fJj6o0ieD5Wupxj0auwuA0Wv8HT4Ks16XdG+RCYyKfHx9WzMfgIh +C59vpD++nVPiz32pLHxYGpfhPTc3GGYo0kDFUYqMwy3OU4gkWGQwFsWq4NYKpkDf +ePb1BHxpE4S80dGnBs8B92jAqFe7OmGtBIyT46388NtEbVncSVmurJqZNjBBe3Yz +IoejwpKGbvlw7q6Hh5UbxHq9MfPU0uWZ/75I7HX1eBYdpnDBfzwboZL7z8g81sWT +Co/1VTp2lc5ZmIoJlXcymoO6LAQ6l73UL77XbJuiyn1tJslV1c/DeVIICZkHJC1k +JWumIWmbat10TWuXekG9qxf5kBdIjzb5LdXF2+6qhUVB+s06RbFo5jZMm5BX7CO5 +hwjCxAnxl4YqKE3idMDaxIzb3+KhF1nOJFl0Mdp//TBt2dzhauH8XwIDAQABo4IB +GjCCARYwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYE +FBiHVuBud+4kNTxOc5of1uHieX4rMB8GA1UdIwQYMBaAFBiHVuBud+4kNTxOc5of +1uHieX4rMEQGA1UdIAQ9MDswOQYEVR0gADAxMC8GCCsGAQUFBwIBFiNodHRwczov +L3d3d3cuY2VydGlnbmEuZnIvYXV0b3JpdGVzLzBtBgNVHR8EZjBkMC+gLaArhilo +dHRwOi8vY3JsLmNlcnRpZ25hLmZyL2NlcnRpZ25hcm9vdGNhLmNybDAxoC+gLYYr +aHR0cDovL2NybC5kaGlteW90aXMuY29tL2NlcnRpZ25hcm9vdGNhLmNybDANBgkq +hkiG9w0BAQsFAAOCAgEAlLieT/DjlQgi581oQfccVdV8AOItOoldaDgvUSILSo3L +6btdPrtcPbEo/uRTVRPPoZAbAh1fZkYJMyjhDSSXcNMQH+pkV5a7XdrnxIxPTGRG +HVyH41neQtGbqH6mid2PHMkwgu07nM3A6RngatgCdTer9zQoKJHyBApPNeNgJgH6 +0BGM+RFq7q89w1DTj18zeTyGqHNFkIwgtnJzFyO+B2XleJINugHA64wcZr+shncB +lA2c5uk5jR+mUYyZDDl34bSb+hxnV29qao6pK0xXeXpXIs/NX2NGjVxZOob4Mkdi +o2cNGJHc+6Zr9UhhcyNZjgKnvETq9Emd8VRY+WCv2hikLyhF3HqgiIZd8zvn/yk1 +gPxkQ5Tm4xxvvq0OKmOZK8l+hfZx6AYDlf7ej0gcWtSS6Cvu5zHbugRqh5jnxV/v +faci9wHYTfmJ0A6aBVmknpjZbyvKcL5kwlWj9Omvw5Ip3IgWJJk8jSaYtlu3zM63 +Nwf9JtmYhST/WSMDmu2dnajkXjjO11INb9I/bbEFa0nOipFGc/T2L/Coc3cOZayh +jWZSaX5LaAzHHjcng6WMxwLkFM1JAbBzs/3GkDpv0mztO+7skb6iQ12LAEpmJURw +3kAP+HwV96LOPNdeE4yBFxgX0b3xdxA61GU5wSesVywlVP+i2k+KYTlerj1KjL0= +-----END CERTIFICATE----- + +# Issuer: CN=emSign Root CA - G1 O=eMudhra Technologies Limited OU=emSign PKI +# Subject: CN=emSign Root CA - G1 O=eMudhra Technologies Limited OU=emSign PKI +# Label: "emSign Root CA - G1" +# Serial: 235931866688319308814040 +# MD5 Fingerprint: 9c:42:84:57:dd:cb:0b:a7:2e:95:ad:b6:f3:da:bc:ac +# SHA1 Fingerprint: 8a:c7:ad:8f:73:ac:4e:c1:b5:75:4d:a5:40:f4:fc:cf:7c:b5:8e:8c +# SHA256 Fingerprint: 40:f6:af:03:46:a9:9a:a1:cd:1d:55:5a:4e:9c:ce:62:c7:f9:63:46:03:ee:40:66:15:83:3d:c8:c8:d0:03:67 +-----BEGIN CERTIFICATE----- +MIIDlDCCAnygAwIBAgIKMfXkYgxsWO3W2DANBgkqhkiG9w0BAQsFADBnMQswCQYD +VQQGEwJJTjETMBEGA1UECxMKZW1TaWduIFBLSTElMCMGA1UEChMcZU11ZGhyYSBU +ZWNobm9sb2dpZXMgTGltaXRlZDEcMBoGA1UEAxMTZW1TaWduIFJvb3QgQ0EgLSBH +MTAeFw0xODAyMTgxODMwMDBaFw00MzAyMTgxODMwMDBaMGcxCzAJBgNVBAYTAklO +MRMwEQYDVQQLEwplbVNpZ24gUEtJMSUwIwYDVQQKExxlTXVkaHJhIFRlY2hub2xv +Z2llcyBMaW1pdGVkMRwwGgYDVQQDExNlbVNpZ24gUm9vdCBDQSAtIEcxMIIBIjAN +BgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAk0u76WaK7p1b1TST0Bsew+eeuGQz +f2N4aLTNLnF115sgxk0pvLZoYIr3IZpWNVrzdr3YzZr/k1ZLpVkGoZM0Kd0WNHVO +8oG0x5ZOrRkVUkr+PHB1cM2vK6sVmjM8qrOLqs1D/fXqcP/tzxE7lM5OMhbTI0Aq +d7OvPAEsbO2ZLIvZTmmYsvePQbAyeGHWDV/D+qJAkh1cF+ZwPjXnorfCYuKrpDhM +tTk1b+oDafo6VGiFbdbyL0NVHpENDtjVaqSW0RM8LHhQ6DqS0hdW5TUaQBw+jSzt +Od9C4INBdN+jzcKGYEho42kLVACL5HZpIQ15TjQIXhTCzLG3rdd8cIrHhQIDAQAB +o0IwQDAdBgNVHQ4EFgQU++8Nhp6w492pufEhF38+/PB3KxowDgYDVR0PAQH/BAQD +AgEGMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQELBQADggEBAFn/8oz1h31x +PaOfG1vR2vjTnGs2vZupYeveFix0PZ7mddrXuqe8QhfnPZHr5X3dPpzxz5KsbEjM +wiI/aTvFthUvozXGaCocV685743QNcMYDHsAVhzNixl03r4PEuDQqqE/AjSxcM6d +GNYIAwlG7mDgfrbESQRRfXBgvKqy/3lyeqYdPV8q+Mri/Tm3R7nrft8EI6/6nAYH +6ftjk4BAtcZsCjEozgyfz7MjNYBBjWzEN3uBL4ChQEKF6dk4jeihU80Bv2noWgby +RQuQ+q7hv53yrlc8pa6yVvSLZUDp/TGBLPQ5Cdjua6e0ph0VpZj3AYHYhX3zUVxx +iN66zB+Afko= +-----END CERTIFICATE----- + +# Issuer: CN=emSign ECC Root CA - G3 O=eMudhra Technologies Limited OU=emSign PKI +# Subject: CN=emSign ECC Root CA - G3 O=eMudhra Technologies Limited OU=emSign PKI +# Label: "emSign ECC Root CA - G3" +# Serial: 287880440101571086945156 +# MD5 Fingerprint: ce:0b:72:d1:9f:88:8e:d0:50:03:e8:e3:b8:8b:67:40 +# SHA1 Fingerprint: 30:43:fa:4f:f2:57:dc:a0:c3:80:ee:2e:58:ea:78:b2:3f:e6:bb:c1 +# SHA256 Fingerprint: 86:a1:ec:ba:08:9c:4a:8d:3b:be:27:34:c6:12:ba:34:1d:81:3e:04:3c:f9:e8:a8:62:cd:5c:57:a3:6b:be:6b +-----BEGIN CERTIFICATE----- +MIICTjCCAdOgAwIBAgIKPPYHqWhwDtqLhDAKBggqhkjOPQQDAzBrMQswCQYDVQQG +EwJJTjETMBEGA1UECxMKZW1TaWduIFBLSTElMCMGA1UEChMcZU11ZGhyYSBUZWNo +bm9sb2dpZXMgTGltaXRlZDEgMB4GA1UEAxMXZW1TaWduIEVDQyBSb290IENBIC0g +RzMwHhcNMTgwMjE4MTgzMDAwWhcNNDMwMjE4MTgzMDAwWjBrMQswCQYDVQQGEwJJ +TjETMBEGA1UECxMKZW1TaWduIFBLSTElMCMGA1UEChMcZU11ZGhyYSBUZWNobm9s +b2dpZXMgTGltaXRlZDEgMB4GA1UEAxMXZW1TaWduIEVDQyBSb290IENBIC0gRzMw +djAQBgcqhkjOPQIBBgUrgQQAIgNiAAQjpQy4LRL1KPOxst3iAhKAnjlfSU2fySU0 +WXTsuwYc58Byr+iuL+FBVIcUqEqy6HyC5ltqtdyzdc6LBtCGI79G1Y4PPwT01xyS +fvalY8L1X44uT6EYGQIrMgqCZH0Wk9GjQjBAMB0GA1UdDgQWBBR8XQKEE9TMipuB +zhccLikenEhjQjAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAKBggq +hkjOPQQDAwNpADBmAjEAvvNhzwIQHWSVB7gYboiFBS+DCBeQyh+KTOgNG3qxrdWB +CUfvO6wIBHxcmbHtRwfSAjEAnbpV/KlK6O3t5nYBQnvI+GDZjVGLVTv7jHvrZQnD ++JbNR6iC8hZVdyR+EhCVBCyj +-----END CERTIFICATE----- + +# Issuer: CN=emSign Root CA - C1 O=eMudhra Inc OU=emSign PKI +# Subject: CN=emSign Root CA - C1 O=eMudhra Inc OU=emSign PKI +# Label: "emSign Root CA - C1" +# Serial: 825510296613316004955058 +# MD5 Fingerprint: d8:e3:5d:01:21:fa:78:5a:b0:df:ba:d2:ee:2a:5f:68 +# SHA1 Fingerprint: e7:2e:f1:df:fc:b2:09:28:cf:5d:d4:d5:67:37:b1:51:cb:86:4f:01 +# SHA256 Fingerprint: 12:56:09:aa:30:1d:a0:a2:49:b9:7a:82:39:cb:6a:34:21:6f:44:dc:ac:9f:39:54:b1:42:92:f2:e8:c8:60:8f +-----BEGIN CERTIFICATE----- +MIIDczCCAlugAwIBAgILAK7PALrEzzL4Q7IwDQYJKoZIhvcNAQELBQAwVjELMAkG +A1UEBhMCVVMxEzARBgNVBAsTCmVtU2lnbiBQS0kxFDASBgNVBAoTC2VNdWRocmEg +SW5jMRwwGgYDVQQDExNlbVNpZ24gUm9vdCBDQSAtIEMxMB4XDTE4MDIxODE4MzAw +MFoXDTQzMDIxODE4MzAwMFowVjELMAkGA1UEBhMCVVMxEzARBgNVBAsTCmVtU2ln +biBQS0kxFDASBgNVBAoTC2VNdWRocmEgSW5jMRwwGgYDVQQDExNlbVNpZ24gUm9v +dCBDQSAtIEMxMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAz+upufGZ +BczYKCFK83M0UYRWEPWgTywS4/oTmifQz/l5GnRfHXk5/Fv4cI7gklL35CX5VIPZ +HdPIWoU/Xse2B+4+wM6ar6xWQio5JXDWv7V7Nq2s9nPczdcdioOl+yuQFTdrHCZH +3DspVpNqs8FqOp099cGXOFgFixwR4+S0uF2FHYP+eF8LRWgYSKVGczQ7/g/IdrvH +GPMF0Ybzhe3nudkyrVWIzqa2kbBPrH4VI5b2P/AgNBbeCsbEBEV5f6f9vtKppa+c +xSMq9zwhbL2vj07FOrLzNBL834AaSaTUqZX3noleoomslMuoaJuvimUnzYnu3Yy1 +aylwQ6BpC+S5DwIDAQABo0IwQDAdBgNVHQ4EFgQU/qHgcB4qAzlSWkK+XJGFehiq +TbUwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEL +BQADggEBAMJKVvoVIXsoounlHfv4LcQ5lkFMOycsxGwYFYDGrK9HWS8mC+M2sO87 +/kOXSTKZEhVb3xEp/6tT+LvBeA+snFOvV71ojD1pM/CjoCNjO2RnIkSt1XHLVip4 +kqNPEjE2NuLe/gDEo2APJ62gsIq1NnpSob0n9CAnYuhNlCQT5AoE6TyrLshDCUrG +YQTlSTR+08TI9Q/Aqum6VF7zYytPT1DU/rl7mYw9wC68AivTxEDkigcxHpvOJpkT ++xHqmiIMERnHXhuBUDDIlhJu58tBf5E7oke3VIAb3ADMmpDqw8NQBmIMMMAVSKeo +WXzhriKi4gp6D/piq1JM4fHfyr6DDUI= +-----END CERTIFICATE----- + +# Issuer: CN=emSign ECC Root CA - C3 O=eMudhra Inc OU=emSign PKI +# Subject: CN=emSign ECC Root CA - C3 O=eMudhra Inc OU=emSign PKI +# Label: "emSign ECC Root CA - C3" +# Serial: 582948710642506000014504 +# MD5 Fingerprint: 3e:53:b3:a3:81:ee:d7:10:f8:d3:b0:1d:17:92:f5:d5 +# SHA1 Fingerprint: b6:af:43:c2:9b:81:53:7d:f6:ef:6b:c3:1f:1f:60:15:0c:ee:48:66 +# SHA256 Fingerprint: bc:4d:80:9b:15:18:9d:78:db:3e:1d:8c:f4:f9:72:6a:79:5d:a1:64:3c:a5:f1:35:8e:1d:db:0e:dc:0d:7e:b3 +-----BEGIN CERTIFICATE----- +MIICKzCCAbGgAwIBAgIKe3G2gla4EnycqDAKBggqhkjOPQQDAzBaMQswCQYDVQQG +EwJVUzETMBEGA1UECxMKZW1TaWduIFBLSTEUMBIGA1UEChMLZU11ZGhyYSBJbmMx +IDAeBgNVBAMTF2VtU2lnbiBFQ0MgUm9vdCBDQSAtIEMzMB4XDTE4MDIxODE4MzAw +MFoXDTQzMDIxODE4MzAwMFowWjELMAkGA1UEBhMCVVMxEzARBgNVBAsTCmVtU2ln +biBQS0kxFDASBgNVBAoTC2VNdWRocmEgSW5jMSAwHgYDVQQDExdlbVNpZ24gRUND +IFJvb3QgQ0EgLSBDMzB2MBAGByqGSM49AgEGBSuBBAAiA2IABP2lYa57JhAd6bci +MK4G9IGzsUJxlTm801Ljr6/58pc1kjZGDoeVjbk5Wum739D+yAdBPLtVb4Ojavti +sIGJAnB9SMVK4+kiVCJNk7tCDK93nCOmfddhEc5lx/h//vXyqaNCMEAwHQYDVR0O +BBYEFPtaSNCAIEDyqOkAB2kZd6fmw/TPMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMB +Af8EBTADAQH/MAoGCCqGSM49BAMDA2gAMGUCMQC02C8Cif22TGK6Q04ThHK1rt0c +3ta13FaPWEBaLd4gTCKDypOofu4SQMfWh0/434UCMBwUZOR8loMRnLDRWmFLpg9J +0wD8ofzkpf9/rdcw0Md3f76BB1UwUCAU9Vc4CqgxUQ== +-----END CERTIFICATE----- + +# Issuer: CN=Hongkong Post Root CA 3 O=Hongkong Post +# Subject: CN=Hongkong Post Root CA 3 O=Hongkong Post +# Label: "Hongkong Post Root CA 3" +# Serial: 46170865288971385588281144162979347873371282084 +# MD5 Fingerprint: 11:fc:9f:bd:73:30:02:8a:fd:3f:f3:58:b9:cb:20:f0 +# SHA1 Fingerprint: 58:a2:d0:ec:20:52:81:5b:c1:f3:f8:64:02:24:4e:c2:8e:02:4b:02 +# SHA256 Fingerprint: 5a:2f:c0:3f:0c:83:b0:90:bb:fa:40:60:4b:09:88:44:6c:76:36:18:3d:f9:84:6e:17:10:1a:44:7f:b8:ef:d6 +-----BEGIN CERTIFICATE----- +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 +mpv0 +-----END CERTIFICATE----- + +# Issuer: CN=Microsoft ECC Root Certificate Authority 2017 O=Microsoft Corporation +# Subject: CN=Microsoft ECC Root Certificate Authority 2017 O=Microsoft Corporation +# Label: "Microsoft ECC Root Certificate Authority 2017" +# Serial: 136839042543790627607696632466672567020 +# MD5 Fingerprint: dd:a1:03:e6:4a:93:10:d1:bf:f0:19:42:cb:fe:ed:67 +# SHA1 Fingerprint: 99:9a:64:c3:7f:f4:7d:9f:ab:95:f1:47:69:89:14:60:ee:c4:c3:c5 +# SHA256 Fingerprint: 35:8d:f3:9d:76:4a:f9:e1:b7:66:e9:c9:72:df:35:2e:e1:5c:fa:c2:27:af:6a:d1:d7:0e:8e:4a:6e:dc:ba:02 +-----BEGIN CERTIFICATE----- +MIICWTCCAd+gAwIBAgIQZvI9r4fei7FK6gxXMQHC7DAKBggqhkjOPQQDAzBlMQsw +CQYDVQQGEwJVUzEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9uMTYwNAYD +VQQDEy1NaWNyb3NvZnQgRUNDIFJvb3QgQ2VydGlmaWNhdGUgQXV0aG9yaXR5IDIw +MTcwHhcNMTkxMjE4MjMwNjQ1WhcNNDIwNzE4MjMxNjA0WjBlMQswCQYDVQQGEwJV +UzEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9uMTYwNAYDVQQDEy1NaWNy +b3NvZnQgRUNDIFJvb3QgQ2VydGlmaWNhdGUgQXV0aG9yaXR5IDIwMTcwdjAQBgcq +hkjOPQIBBgUrgQQAIgNiAATUvD0CQnVBEyPNgASGAlEvaqiBYgtlzPbKnR5vSmZR +ogPZnZH6thaxjG7efM3beaYvzrvOcS/lpaso7GMEZpn4+vKTEAXhgShC48Zo9OYb +hGBKia/teQ87zvH2RPUBeMCjVDBSMA4GA1UdDwEB/wQEAwIBhjAPBgNVHRMBAf8E +BTADAQH/MB0GA1UdDgQWBBTIy5lycFIM+Oa+sgRXKSrPQhDtNTAQBgkrBgEEAYI3 +FQEEAwIBADAKBggqhkjOPQQDAwNoADBlAjBY8k3qDPlfXu5gKcs68tvWMoQZP3zV +L8KxzJOuULsJMsbG7X7JNpQS5GiFBqIb0C8CMQCZ6Ra0DvpWSNSkMBaReNtUjGUB +iudQZsIxtzm6uBoiB078a1QWIP8rtedMDE2mT3M= +-----END CERTIFICATE----- + +# Issuer: CN=Microsoft RSA Root Certificate Authority 2017 O=Microsoft Corporation +# Subject: CN=Microsoft RSA Root Certificate Authority 2017 O=Microsoft Corporation +# Label: "Microsoft RSA Root Certificate Authority 2017" +# Serial: 40975477897264996090493496164228220339 +# MD5 Fingerprint: 10:ff:00:ff:cf:c9:f8:c7:7a:c0:ee:35:8e:c9:0f:47 +# SHA1 Fingerprint: 73:a5:e6:4a:3b:ff:83:16:ff:0e:dc:cc:61:8a:90:6e:4e:ae:4d:74 +# SHA256 Fingerprint: c7:41:f7:0f:4b:2a:8d:88:bf:2e:71:c1:41:22:ef:53:ef:10:eb:a0:cf:a5:e6:4c:fa:20:f4:18:85:30:73:e0 +-----BEGIN CERTIFICATE----- +MIIFqDCCA5CgAwIBAgIQHtOXCV/YtLNHcB6qvn9FszANBgkqhkiG9w0BAQwFADBl +MQswCQYDVQQGEwJVUzEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9uMTYw +NAYDVQQDEy1NaWNyb3NvZnQgUlNBIFJvb3QgQ2VydGlmaWNhdGUgQXV0aG9yaXR5 +IDIwMTcwHhcNMTkxMjE4MjI1MTIyWhcNNDIwNzE4MjMwMDIzWjBlMQswCQYDVQQG +EwJVUzEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9uMTYwNAYDVQQDEy1N +aWNyb3NvZnQgUlNBIFJvb3QgQ2VydGlmaWNhdGUgQXV0aG9yaXR5IDIwMTcwggIi +MA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDKW76UM4wplZEWCpW9R2LBifOZ +Nt9GkMml7Xhqb0eRaPgnZ1AzHaGm++DlQ6OEAlcBXZxIQIJTELy/xztokLaCLeX0 +ZdDMbRnMlfl7rEqUrQ7eS0MdhweSE5CAg2Q1OQT85elss7YfUJQ4ZVBcF0a5toW1 +HLUX6NZFndiyJrDKxHBKrmCk3bPZ7Pw71VdyvD/IybLeS2v4I2wDwAW9lcfNcztm +gGTjGqwu+UcF8ga2m3P1eDNbx6H7JyqhtJqRjJHTOoI+dkC0zVJhUXAoP8XFWvLJ +jEm7FFtNyP9nTUwSlq31/niol4fX/V4ggNyhSyL71Imtus5Hl0dVe49FyGcohJUc +aDDv70ngNXtk55iwlNpNhTs+VcQor1fznhPbRiefHqJeRIOkpcrVE7NLP8TjwuaG +YaRSMLl6IE9vDzhTyzMMEyuP1pq9KsgtsRx9S1HKR9FIJ3Jdh+vVReZIZZ2vUpC6 +W6IYZVcSn2i51BVrlMRpIpj0M+Dt+VGOQVDJNE92kKz8OMHY4Xu54+OU4UZpyw4K +UGsTuqwPN1q3ErWQgR5WrlcihtnJ0tHXUeOrO8ZV/R4O03QK0dqq6mm4lyiPSMQH ++FJDOvTKVTUssKZqwJz58oHhEmrARdlns87/I6KJClTUFLkqqNfs+avNJVgyeY+Q +W5g5xAgGwax/Dj0ApQIDAQABo1QwUjAOBgNVHQ8BAf8EBAMCAYYwDwYDVR0TAQH/ +BAUwAwEB/zAdBgNVHQ4EFgQUCctZf4aycI8awznjwNnpv7tNsiMwEAYJKwYBBAGC +NxUBBAMCAQAwDQYJKoZIhvcNAQEMBQADggIBAKyvPl3CEZaJjqPnktaXFbgToqZC +LgLNFgVZJ8og6Lq46BrsTaiXVq5lQ7GPAJtSzVXNUzltYkyLDVt8LkS/gxCP81OC +gMNPOsduET/m4xaRhPtthH80dK2Jp86519efhGSSvpWhrQlTM93uCupKUY5vVau6 +tZRGrox/2KJQJWVggEbbMwSubLWYdFQl3JPk+ONVFT24bcMKpBLBaYVu32TxU5nh +SnUgnZUP5NbcA/FZGOhHibJXWpS2qdgXKxdJ5XbLwVaZOjex/2kskZGT4d9Mozd2 +TaGf+G0eHdP67Pv0RR0Tbc/3WeUiJ3IrhvNXuzDtJE3cfVa7o7P4NHmJweDyAmH3 +pvwPuxwXC65B2Xy9J6P9LjrRk5Sxcx0ki69bIImtt2dmefU6xqaWM/5TkshGsRGR +xpl/j8nWZjEgQRCHLQzWwa80mMpkg/sTV9HB8Dx6jKXB/ZUhoHHBk2dxEuqPiApp +GWSZI1b7rCoucL5mxAyE7+WL85MB+GqQk2dLsmijtWKP6T+MejteD+eMuMZ87zf9 +dOLITzNy4ZQ5bb0Sr74MTnB8G2+NszKTc0QWbej09+CVgI+WXTik9KveCjCHk9hN +AHFiRSdLOkKEW39lt2c0Ui2cFmuqqNh7o0JMcccMyj6D5KbvtwEwXlGjefVwaaZB +RA+GsCyRxj3qrg+E +-----END CERTIFICATE----- + +# Issuer: CN=e-Szigno Root CA 2017 O=Microsec Ltd. +# Subject: CN=e-Szigno Root CA 2017 O=Microsec Ltd. +# Label: "e-Szigno Root CA 2017" +# Serial: 411379200276854331539784714 +# MD5 Fingerprint: de:1f:f6:9e:84:ae:a7:b4:21:ce:1e:58:7d:d1:84:98 +# SHA1 Fingerprint: 89:d4:83:03:4f:9e:9a:48:80:5f:72:37:d4:a9:a6:ef:cb:7c:1f:d1 +# SHA256 Fingerprint: be:b0:0b:30:83:9b:9b:c3:2c:32:e4:44:79:05:95:06:41:f2:64:21:b1:5e:d0:89:19:8b:51:8a:e2:ea:1b:99 +-----BEGIN CERTIFICATE----- +MIICQDCCAeWgAwIBAgIMAVRI7yH9l1kN9QQKMAoGCCqGSM49BAMCMHExCzAJBgNV +BAYTAkhVMREwDwYDVQQHDAhCdWRhcGVzdDEWMBQGA1UECgwNTWljcm9zZWMgTHRk +LjEXMBUGA1UEYQwOVkFUSFUtMjM1ODQ0OTcxHjAcBgNVBAMMFWUtU3ppZ25vIFJv +b3QgQ0EgMjAxNzAeFw0xNzA4MjIxMjA3MDZaFw00MjA4MjIxMjA3MDZaMHExCzAJ +BgNVBAYTAkhVMREwDwYDVQQHDAhCdWRhcGVzdDEWMBQGA1UECgwNTWljcm9zZWMg +THRkLjEXMBUGA1UEYQwOVkFUSFUtMjM1ODQ0OTcxHjAcBgNVBAMMFWUtU3ppZ25v +IFJvb3QgQ0EgMjAxNzBZMBMGByqGSM49AgEGCCqGSM49AwEHA0IABJbcPYrYsHtv +xie+RJCxs1YVe45DJH0ahFnuY2iyxl6H0BVIHqiQrb1TotreOpCmYF9oMrWGQd+H +Wyx7xf58etqjYzBhMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0G +A1UdDgQWBBSHERUI0arBeAyxr87GyZDvvzAEwDAfBgNVHSMEGDAWgBSHERUI0arB +eAyxr87GyZDvvzAEwDAKBggqhkjOPQQDAgNJADBGAiEAtVfd14pVCzbhhkT61Nlo +jbjcI4qKDdQvfepz7L9NbKgCIQDLpbQS+ue16M9+k/zzNY9vTlp8tLxOsvxyqltZ ++efcMQ== +-----END CERTIFICATE----- + +# Issuer: O=CERTSIGN SA OU=certSIGN ROOT CA G2 +# Subject: O=CERTSIGN SA OU=certSIGN ROOT CA G2 +# Label: "certSIGN Root CA G2" +# Serial: 313609486401300475190 +# MD5 Fingerprint: 8c:f1:75:8a:c6:19:cf:94:b7:f7:65:20:87:c3:97:c7 +# SHA1 Fingerprint: 26:f9:93:b4:ed:3d:28:27:b0:b9:4b:a7:e9:15:1d:a3:8d:92:e5:32 +# SHA256 Fingerprint: 65:7c:fe:2f:a7:3f:aa:38:46:25:71:f3:32:a2:36:3a:46:fc:e7:02:09:51:71:07:02:cd:fb:b6:ee:da:33:05 +-----BEGIN CERTIFICATE----- +MIIFRzCCAy+gAwIBAgIJEQA0tk7GNi02MA0GCSqGSIb3DQEBCwUAMEExCzAJBgNV +BAYTAlJPMRQwEgYDVQQKEwtDRVJUU0lHTiBTQTEcMBoGA1UECxMTY2VydFNJR04g +Uk9PVCBDQSBHMjAeFw0xNzAyMDYwOTI3MzVaFw00MjAyMDYwOTI3MzVaMEExCzAJ +BgNVBAYTAlJPMRQwEgYDVQQKEwtDRVJUU0lHTiBTQTEcMBoGA1UECxMTY2VydFNJ +R04gUk9PVCBDQSBHMjCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAMDF +dRmRfUR0dIf+DjuW3NgBFszuY5HnC2/OOwppGnzC46+CjobXXo9X69MhWf05N0Iw +vlDqtg+piNguLWkh59E3GE59kdUWX2tbAMI5Qw02hVK5U2UPHULlj88F0+7cDBrZ +uIt4ImfkabBoxTzkbFpG583H+u/E7Eu9aqSs/cwoUe+StCmrqzWaTOTECMYmzPhp +n+Sc8CnTXPnGFiWeI8MgwT0PPzhAsP6CRDiqWhqKa2NYOLQV07YRaXseVO6MGiKs +cpc/I1mbySKEwQdPzH/iV8oScLumZfNpdWO9lfsbl83kqK/20U6o2YpxJM02PbyW +xPFsqa7lzw1uKA2wDrXKUXt4FMMgL3/7FFXhEZn91QqhngLjYl/rNUssuHLoPj1P +rCy7Lobio3aP5ZMqz6WryFyNSwb/EkaseMsUBzXgqd+L6a8VTxaJW732jcZZroiF +DsGJ6x9nxUWO/203Nit4ZoORUSs9/1F3dmKh7Gc+PoGD4FapUB8fepmrY7+EF3fx +DTvf95xhszWYijqy7DwaNz9+j5LP2RIUZNoQAhVB/0/E6xyjyfqZ90bp4RjZsbgy +LcsUDFDYg2WD7rlcz8sFWkz6GZdr1l0T08JcVLwyc6B49fFtHsufpaafItzRUZ6C +eWRgKRM+o/1Pcmqr4tTluCRVLERLiohEnMqE0yo7AgMBAAGjQjBAMA8GA1UdEwEB +/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBSCIS1mxteg4BXrzkwJ +d8RgnlRuAzANBgkqhkiG9w0BAQsFAAOCAgEAYN4auOfyYILVAzOBywaK8SJJ6ejq +kX/GM15oGQOGO0MBzwdw5AgeZYWR5hEit/UCI46uuR59H35s5r0l1ZUa8gWmr4UC +b6741jH/JclKyMeKqdmfS0mbEVeZkkMR3rYzpMzXjWR91M08KCy0mpbqTfXERMQl +qiCA2ClV9+BB/AYm/7k29UMUA2Z44RGx2iBfRgB4ACGlHgAoYXhvqAEBj500mv/0 +OJD7uNGzcgbJceaBxXntC6Z58hMLnPddDnskk7RI24Zf3lCGeOdA5jGokHZwYa+c +NywRtYK3qq4kNFtyDGkNzVmf9nGvnAvRCjj5BiKDUyUM/FHE5r7iOZULJK2v0ZXk +ltd0ZGtxTgI8qoXzIKNDOXZbbFD+mpwUHmUUihW9o4JFWklWatKcsWMy5WHgUyIO +pwpJ6st+H6jiYoD2EEVSmAYY3qXNL3+q1Ok+CHLsIwMCPKaq2LxndD0UF/tUSxfj +03k9bWtJySgOLnRQvwzZRjoQhsmnP+mg7H/rpXdYaXHmgwo38oZJar55CJD2AhZk +PuXaTH4MNMn5X7azKFGnpyuqSfqNZSlO42sTp5SjLVFteAxEy9/eCG/Oo2Sr05WE +1LlSVHJ7liXMvGnjSG4N0MedJ5qq+BOS3R7fY581qRY27Iy4g/Q9iY/NtBde17MX +QRBdJ3NghVdJIgc= +-----END CERTIFICATE----- + +# Issuer: CN=Trustwave Global Certification Authority O=Trustwave Holdings, Inc. +# Subject: CN=Trustwave Global Certification Authority O=Trustwave Holdings, Inc. +# Label: "Trustwave Global Certification Authority" +# Serial: 1846098327275375458322922162 +# MD5 Fingerprint: f8:1c:18:2d:2f:ba:5f:6d:a1:6c:bc:c7:ab:91:c7:0e +# SHA1 Fingerprint: 2f:8f:36:4f:e1:58:97:44:21:59:87:a5:2a:9a:d0:69:95:26:7f:b5 +# SHA256 Fingerprint: 97:55:20:15:f5:dd:fc:3c:87:88:c0:06:94:45:55:40:88:94:45:00:84:f1:00:86:70:86:bc:1a:2b:b5:8d:c8 +-----BEGIN CERTIFICATE----- +MIIF2jCCA8KgAwIBAgIMBfcOhtpJ80Y1LrqyMA0GCSqGSIb3DQEBCwUAMIGIMQsw +CQYDVQQGEwJVUzERMA8GA1UECAwISWxsaW5vaXMxEDAOBgNVBAcMB0NoaWNhZ28x +ITAfBgNVBAoMGFRydXN0d2F2ZSBIb2xkaW5ncywgSW5jLjExMC8GA1UEAwwoVHJ1 +c3R3YXZlIEdsb2JhbCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0xNzA4MjMx +OTM0MTJaFw00MjA4MjMxOTM0MTJaMIGIMQswCQYDVQQGEwJVUzERMA8GA1UECAwI +SWxsaW5vaXMxEDAOBgNVBAcMB0NoaWNhZ28xITAfBgNVBAoMGFRydXN0d2F2ZSBI +b2xkaW5ncywgSW5jLjExMC8GA1UEAwwoVHJ1c3R3YXZlIEdsb2JhbCBDZXJ0aWZp +Y2F0aW9uIEF1dGhvcml0eTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIB +ALldUShLPDeS0YLOvR29zd24q88KPuFd5dyqCblXAj7mY2Hf8g+CY66j96xz0Xzn +swuvCAAJWX/NKSqIk4cXGIDtiLK0thAfLdZfVaITXdHG6wZWiYj+rDKd/VzDBcdu +7oaJuogDnXIhhpCujwOl3J+IKMujkkkP7NAP4m1ET4BqstTnoApTAbqOl5F2brz8 +1Ws25kCI1nsvXwXoLG0R8+eyvpJETNKXpP7ScoFDB5zpET71ixpZfR9oWN0EACyW +80OzfpgZdNmcc9kYvkHHNHnZ9GLCQ7mzJ7Aiy/k9UscwR7PJPrhq4ufogXBeQotP +JqX+OsIgbrv4Fo7NDKm0G2x2EOFYeUY+VM6AqFcJNykbmROPDMjWLBz7BegIlT1l +RtzuzWniTY+HKE40Cz7PFNm73bZQmq131BnW2hqIyE4bJ3XYsgjxroMwuREOzYfw +hI0Vcnyh78zyiGG69Gm7DIwLdVcEuE4qFC49DxweMqZiNu5m4iK4BUBjECLzMx10 +coos9TkpoNPnG4CELcU9402x/RpvumUHO1jsQkUm+9jaJXLE9gCxInm943xZYkqc +BW89zubWR2OZxiRvchLIrH+QtAuRcOi35hYQcRfO3gZPSEF9NUqjifLJS3tBEW1n +twiYTOURGa5CgNz7kAXU+FDKvuStx8KU1xad5hePrzb7AgMBAAGjQjBAMA8GA1Ud +EwEB/wQFMAMBAf8wHQYDVR0OBBYEFJngGWcNYtt2s9o9uFvo/ULSMQ6HMA4GA1Ud +DwEB/wQEAwIBBjANBgkqhkiG9w0BAQsFAAOCAgEAmHNw4rDT7TnsTGDZqRKGFx6W +0OhUKDtkLSGm+J1WE2pIPU/HPinbbViDVD2HfSMF1OQc3Og4ZYbFdada2zUFvXfe +uyk3QAUHw5RSn8pk3fEbK9xGChACMf1KaA0HZJDmHvUqoai7PF35owgLEQzxPy0Q +lG/+4jSHg9bP5Rs1bdID4bANqKCqRieCNqcVtgimQlRXtpla4gt5kNdXElE1GYhB +aCXUNxeEFfsBctyV3lImIJgm4nb1J2/6ADtKYdkNy1GTKv0WBpanI5ojSP5RvbbE +sLFUzt5sQa0WZ37b/TjNuThOssFgy50X31ieemKyJo90lZvkWx3SD92YHJtZuSPT +MaCm/zjdzyBP6VhWOmfD0faZmZ26NraAL4hHT4a/RDqA5Dccprrql5gR0IRiR2Qe +qu5AvzSxnI9O4fKSTx+O856X3vOmeWqJcU9LJxdI/uz0UA9PSX3MReO9ekDFQdxh +VicGaeVyQYHTtgGJoC86cnn+OjC/QezHYj6RS8fZMXZC+fc8Y+wmjHMMfRod6qh8 +h6jCJ3zhM0EPz8/8AKAigJ5Kp28AsEFFtyLKaEjFQqKu3R3y4G5OBVixwJAWKqQ9 +EEC+j2Jjg6mcgn0tAumDMHzLJ8n9HmYAsC7TIS+OMxZsmO0QqAfWzJPP29FpHOTK +yeC2nOnOcXHebD8WpHk= +-----END CERTIFICATE----- + +# Issuer: CN=Trustwave Global ECC P256 Certification Authority O=Trustwave Holdings, Inc. +# Subject: CN=Trustwave Global ECC P256 Certification Authority O=Trustwave Holdings, Inc. +# Label: "Trustwave Global ECC P256 Certification Authority" +# Serial: 4151900041497450638097112925 +# MD5 Fingerprint: 5b:44:e3:8d:5d:36:86:26:e8:0d:05:d2:59:a7:83:54 +# SHA1 Fingerprint: b4:90:82:dd:45:0c:be:8b:5b:b1:66:d3:e2:a4:08:26:cd:ed:42:cf +# SHA256 Fingerprint: 94:5b:bc:82:5e:a5:54:f4:89:d1:fd:51:a7:3d:df:2e:a6:24:ac:70:19:a0:52:05:22:5c:22:a7:8c:cf:a8:b4 +-----BEGIN CERTIFICATE----- +MIICYDCCAgegAwIBAgIMDWpfCD8oXD5Rld9dMAoGCCqGSM49BAMCMIGRMQswCQYD +VQQGEwJVUzERMA8GA1UECBMISWxsaW5vaXMxEDAOBgNVBAcTB0NoaWNhZ28xITAf +BgNVBAoTGFRydXN0d2F2ZSBIb2xkaW5ncywgSW5jLjE6MDgGA1UEAxMxVHJ1c3R3 +YXZlIEdsb2JhbCBFQ0MgUDI1NiBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0x +NzA4MjMxOTM1MTBaFw00MjA4MjMxOTM1MTBaMIGRMQswCQYDVQQGEwJVUzERMA8G +A1UECBMISWxsaW5vaXMxEDAOBgNVBAcTB0NoaWNhZ28xITAfBgNVBAoTGFRydXN0 +d2F2ZSBIb2xkaW5ncywgSW5jLjE6MDgGA1UEAxMxVHJ1c3R3YXZlIEdsb2JhbCBF +Q0MgUDI1NiBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTBZMBMGByqGSM49AgEGCCqG +SM49AwEHA0IABH77bOYj43MyCMpg5lOcunSNGLB4kFKA3TjASh3RqMyTpJcGOMoN +FWLGjgEqZZ2q3zSRLoHB5DOSMcT9CTqmP62jQzBBMA8GA1UdEwEB/wQFMAMBAf8w +DwYDVR0PAQH/BAUDAwcGADAdBgNVHQ4EFgQUo0EGrJBt0UrrdaVKEJmzsaGLSvcw +CgYIKoZIzj0EAwIDRwAwRAIgB+ZU2g6gWrKuEZ+Hxbb/ad4lvvigtwjzRM4q3wgh +DDcCIC0mA6AFvWvR9lz4ZcyGbbOcNEhjhAnFjXca4syc4XR7 +-----END CERTIFICATE----- + +# Issuer: CN=Trustwave Global ECC P384 Certification Authority O=Trustwave Holdings, Inc. +# Subject: CN=Trustwave Global ECC P384 Certification Authority O=Trustwave Holdings, Inc. +# Label: "Trustwave Global ECC P384 Certification Authority" +# Serial: 2704997926503831671788816187 +# MD5 Fingerprint: ea:cf:60:c4:3b:b9:15:29:40:a1:97:ed:78:27:93:d6 +# SHA1 Fingerprint: e7:f3:a3:c8:cf:6f:c3:04:2e:6d:0e:67:32:c5:9e:68:95:0d:5e:d2 +# SHA256 Fingerprint: 55:90:38:59:c8:c0:c3:eb:b8:75:9e:ce:4e:25:57:22:5f:f5:75:8b:bd:38:eb:d4:82:76:60:1e:1b:d5:80:97 +-----BEGIN CERTIFICATE----- +MIICnTCCAiSgAwIBAgIMCL2Fl2yZJ6SAaEc7MAoGCCqGSM49BAMDMIGRMQswCQYD +VQQGEwJVUzERMA8GA1UECBMISWxsaW5vaXMxEDAOBgNVBAcTB0NoaWNhZ28xITAf +BgNVBAoTGFRydXN0d2F2ZSBIb2xkaW5ncywgSW5jLjE6MDgGA1UEAxMxVHJ1c3R3 +YXZlIEdsb2JhbCBFQ0MgUDM4NCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0x +NzA4MjMxOTM2NDNaFw00MjA4MjMxOTM2NDNaMIGRMQswCQYDVQQGEwJVUzERMA8G +A1UECBMISWxsaW5vaXMxEDAOBgNVBAcTB0NoaWNhZ28xITAfBgNVBAoTGFRydXN0 +d2F2ZSBIb2xkaW5ncywgSW5jLjE6MDgGA1UEAxMxVHJ1c3R3YXZlIEdsb2JhbCBF +Q0MgUDM4NCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTB2MBAGByqGSM49AgEGBSuB +BAAiA2IABGvaDXU1CDFHBa5FmVXxERMuSvgQMSOjfoPTfygIOiYaOs+Xgh+AtycJ +j9GOMMQKmw6sWASr9zZ9lCOkmwqKi6vr/TklZvFe/oyujUF5nQlgziip04pt89ZF +1PKYhDhloKNDMEEwDwYDVR0TAQH/BAUwAwEB/zAPBgNVHQ8BAf8EBQMDBwYAMB0G +A1UdDgQWBBRVqYSJ0sEyvRjLbKYHTsjnnb6CkDAKBggqhkjOPQQDAwNnADBkAjA3 +AZKXRRJ+oPM+rRk6ct30UJMDEr5E0k9BpIycnR+j9sKS50gU/k6bpZFXrsY3crsC +MGclCrEMXu6pY5Jv5ZAL/mYiykf9ijH3g/56vxC+GCsej/YpHpRZ744hN8tRmKVu +Sw== +-----END CERTIFICATE----- + +# Issuer: CN=NAVER Global Root Certification Authority O=NAVER BUSINESS PLATFORM Corp. +# Subject: CN=NAVER Global Root Certification Authority O=NAVER BUSINESS PLATFORM Corp. +# Label: "NAVER Global Root Certification Authority" +# Serial: 9013692873798656336226253319739695165984492813 +# MD5 Fingerprint: c8:7e:41:f6:25:3b:f5:09:b3:17:e8:46:3d:bf:d0:9b +# SHA1 Fingerprint: 8f:6b:f2:a9:27:4a:da:14:a0:c4:f4:8e:61:27:f9:c0:1e:78:5d:d1 +# SHA256 Fingerprint: 88:f4:38:dc:f8:ff:d1:fa:8f:42:91:15:ff:e5:f8:2a:e1:e0:6e:0c:70:c3:75:fa:ad:71:7b:34:a4:9e:72:65 +-----BEGIN CERTIFICATE----- +MIIFojCCA4qgAwIBAgIUAZQwHqIL3fXFMyqxQ0Rx+NZQTQ0wDQYJKoZIhvcNAQEM +BQAwaTELMAkGA1UEBhMCS1IxJjAkBgNVBAoMHU5BVkVSIEJVU0lORVNTIFBMQVRG +T1JNIENvcnAuMTIwMAYDVQQDDClOQVZFUiBHbG9iYWwgUm9vdCBDZXJ0aWZpY2F0 +aW9uIEF1dGhvcml0eTAeFw0xNzA4MTgwODU4NDJaFw0zNzA4MTgyMzU5NTlaMGkx +CzAJBgNVBAYTAktSMSYwJAYDVQQKDB1OQVZFUiBCVVNJTkVTUyBQTEFURk9STSBD +b3JwLjEyMDAGA1UEAwwpTkFWRVIgR2xvYmFsIFJvb3QgQ2VydGlmaWNhdGlvbiBB +dXRob3JpdHkwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQC21PGTXLVA +iQqrDZBbUGOukJR0F0Vy1ntlWilLp1agS7gvQnXp2XskWjFlqxcX0TM62RHcQDaH +38dq6SZeWYp34+hInDEW+j6RscrJo+KfziFTowI2MMtSAuXaMl3Dxeb57hHHi8lE +HoSTGEq0n+USZGnQJoViAbbJAh2+g1G7XNr4rRVqmfeSVPc0W+m/6imBEtRTkZaz +kVrd/pBzKPswRrXKCAfHcXLJZtM0l/aM9BhK4dA9WkW2aacp+yPOiNgSnABIqKYP +szuSjXEOdMWLyEz59JuOuDxp7W87UC9Y7cSw0BwbagzivESq2M0UXZR4Yb8Obtoq +vC8MC3GmsxY/nOb5zJ9TNeIDoKAYv7vxvvTWjIcNQvcGufFt7QSUqP620wbGQGHf +nZ3zVHbOUzoBppJB7ASjjw2i1QnK1sua8e9DXcCrpUHPXFNwcMmIpi3Ua2FzUCaG +YQ5fG8Ir4ozVu53BA0K6lNpfqbDKzE0K70dpAy8i+/Eozr9dUGWokG2zdLAIx6yo +0es+nPxdGoMuK8u180SdOqcXYZaicdNwlhVNt0xz7hlcxVs+Qf6sdWA7G2POAN3a +CJBitOUt7kinaxeZVL6HSuOpXgRM6xBtVNbv8ejyYhbLgGvtPe31HzClrkvJE+2K +AQHJuFFYwGY6sWZLxNUxAmLpdIQM201GLQIDAQABo0IwQDAdBgNVHQ4EFgQU0p+I +36HNLL3s9TsBAZMzJ7LrYEswDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMB +Af8wDQYJKoZIhvcNAQEMBQADggIBADLKgLOdPVQG3dLSLvCkASELZ0jKbY7gyKoN +qo0hV4/GPnrK21HUUrPUloSlWGB/5QuOH/XcChWB5Tu2tyIvCZwTFrFsDDUIbatj +cu3cvuzHV+YwIHHW1xDBE1UBjCpD5EHxzzp6U5LOogMFDTjfArsQLtk70pt6wKGm ++LUx5vR1yblTmXVHIloUFcd4G7ad6Qz4G3bxhYTeodoS76TiEJd6eN4MUZeoIUCL +hr0N8F5OSza7OyAfikJW4Qsav3vQIkMsRIz75Sq0bBwcupTgE34h5prCy8VCZLQe +lHsIJchxzIdFV4XTnyliIoNRlwAYl3dqmJLJfGBs32x9SuRwTMKeuB330DTHD8z7 +p/8Dvq1wkNoL3chtl1+afwkyQf3NosxabUzyqkn+Zvjp2DXrDige7kgvOtB5CTh8 +piKCk5XQA76+AqAF3SAi428diDRgxuYKuQl1C/AH6GmWNcf7I4GOODm4RStDeKLR +LBT/DShycpWbXgnbiUSYqqFJu3FS8r/2/yehNq+4tneI3TqkbZs0kNwUXTC/t+sX +5Ie3cdCh13cV1ELX8vMxmV2b3RZtP+oGI/hGoiLtk/bdmuYqh7GYVPEi92tF4+KO +dh2ajcQGjTa3FPOdVGm3jjzVpG2Tgbet9r1ke8LJaDmgkpzNNIaRkPpkUZ3+/uul +9XXeifdy +-----END CERTIFICATE----- + +# Issuer: CN=AC RAIZ FNMT-RCM SERVIDORES SEGUROS O=FNMT-RCM OU=Ceres +# Subject: CN=AC RAIZ FNMT-RCM SERVIDORES SEGUROS O=FNMT-RCM OU=Ceres +# Label: "AC RAIZ FNMT-RCM SERVIDORES SEGUROS" +# Serial: 131542671362353147877283741781055151509 +# MD5 Fingerprint: 19:36:9c:52:03:2f:d2:d1:bb:23:cc:dd:1e:12:55:bb +# SHA1 Fingerprint: 62:ff:d9:9e:c0:65:0d:03:ce:75:93:d2:ed:3f:2d:32:c9:e3:e5:4a +# SHA256 Fingerprint: 55:41:53:b1:3d:2c:f9:dd:b7:53:bf:be:1a:4e:0a:e0:8d:0a:a4:18:70:58:fe:60:a2:b8:62:b2:e4:b8:7b:cb +-----BEGIN CERTIFICATE----- +MIICbjCCAfOgAwIBAgIQYvYybOXE42hcG2LdnC6dlTAKBggqhkjOPQQDAzB4MQsw +CQYDVQQGEwJFUzERMA8GA1UECgwIRk5NVC1SQ00xDjAMBgNVBAsMBUNlcmVzMRgw +FgYDVQRhDA9WQVRFUy1RMjgyNjAwNEoxLDAqBgNVBAMMI0FDIFJBSVogRk5NVC1S +Q00gU0VSVklET1JFUyBTRUdVUk9TMB4XDTE4MTIyMDA5MzczM1oXDTQzMTIyMDA5 +MzczM1oweDELMAkGA1UEBhMCRVMxETAPBgNVBAoMCEZOTVQtUkNNMQ4wDAYDVQQL +DAVDZXJlczEYMBYGA1UEYQwPVkFURVMtUTI4MjYwMDRKMSwwKgYDVQQDDCNBQyBS +QUlaIEZOTVQtUkNNIFNFUlZJRE9SRVMgU0VHVVJPUzB2MBAGByqGSM49AgEGBSuB +BAAiA2IABPa6V1PIyqvfNkpSIeSX0oNnnvBlUdBeh8dHsVnyV0ebAAKTRBdp20LH +sbI6GA60XYyzZl2hNPk2LEnb80b8s0RpRBNm/dfF/a82Tc4DTQdxz69qBdKiQ1oK +Um8BA06Oi6NCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYD +VR0OBBYEFAG5L++/EYZg8k/QQW6rcx/n0m5JMAoGCCqGSM49BAMDA2kAMGYCMQCu +SuMrQMN0EfKVrRYj3k4MGuZdpSRea0R7/DjiT8ucRRcRTBQnJlU5dUoDzBOQn5IC +MQD6SmxgiHPz7riYYqnOK8LZiqZwMR2vsJRM60/G49HzYqc8/5MuB1xJAWdpEgJy +v+c= +-----END CERTIFICATE----- + +# Issuer: CN=GlobalSign Root R46 O=GlobalSign nv-sa +# Subject: CN=GlobalSign Root R46 O=GlobalSign nv-sa +# Label: "GlobalSign Root R46" +# Serial: 1552617688466950547958867513931858518042577 +# MD5 Fingerprint: c4:14:30:e4:fa:66:43:94:2a:6a:1b:24:5f:19:d0:ef +# SHA1 Fingerprint: 53:a2:b0:4b:ca:6b:d6:45:e6:39:8a:8e:c4:0d:d2:bf:77:c3:a2:90 +# SHA256 Fingerprint: 4f:a3:12:6d:8d:3a:11:d1:c4:85:5a:4f:80:7c:ba:d6:cf:91:9d:3a:5a:88:b0:3b:ea:2c:63:72:d9:3c:40:c9 +-----BEGIN CERTIFICATE----- +MIIFWjCCA0KgAwIBAgISEdK7udcjGJ5AXwqdLdDfJWfRMA0GCSqGSIb3DQEBDAUA +MEYxCzAJBgNVBAYTAkJFMRkwFwYDVQQKExBHbG9iYWxTaWduIG52LXNhMRwwGgYD +VQQDExNHbG9iYWxTaWduIFJvb3QgUjQ2MB4XDTE5MDMyMDAwMDAwMFoXDTQ2MDMy +MDAwMDAwMFowRjELMAkGA1UEBhMCQkUxGTAXBgNVBAoTEEdsb2JhbFNpZ24gbnYt +c2ExHDAaBgNVBAMTE0dsb2JhbFNpZ24gUm9vdCBSNDYwggIiMA0GCSqGSIb3DQEB +AQUAA4ICDwAwggIKAoICAQCsrHQy6LNl5brtQyYdpokNRbopiLKkHWPd08EsCVeJ +OaFV6Wc0dwxu5FUdUiXSE2te4R2pt32JMl8Nnp8semNgQB+msLZ4j5lUlghYruQG +vGIFAha/r6gjA7aUD7xubMLL1aa7DOn2wQL7Id5m3RerdELv8HQvJfTqa1VbkNud +316HCkD7rRlr+/fKYIje2sGP1q7Vf9Q8g+7XFkyDRTNrJ9CG0Bwta/OrffGFqfUo +0q3v84RLHIf8E6M6cqJaESvWJ3En7YEtbWaBkoe0G1h6zD8K+kZPTXhc+CtI4wSE +y132tGqzZfxCnlEmIyDLPRT5ge1lFgBPGmSXZgjPjHvjK8Cd+RTyG/FWaha/LIWF +zXg4mutCagI0GIMXTpRW+LaCtfOW3T3zvn8gdz57GSNrLNRyc0NXfeD412lPFzYE ++cCQYDdF3uYM2HSNrpyibXRdQr4G9dlkbgIQrImwTDsHTUB+JMWKmIJ5jqSngiCN +I/onccnfxkF0oE32kRbcRoxfKWMxWXEM2G/CtjJ9++ZdU6Z+Ffy7dXxd7Pj2Fxzs +x2sZy/N78CsHpdlseVR2bJ0cpm4O6XkMqCNqo98bMDGfsVR7/mrLZqrcZdCinkqa +ByFrgY/bxFn63iLABJzjqls2k+g9vXqhnQt2sQvHnf3PmKgGwvgqo6GDoLclcqUC +4wIDAQABo0IwQDAOBgNVHQ8BAf8EBAMCAYYwDwYDVR0TAQH/BAUwAwEB/zAdBgNV +HQ4EFgQUA1yrc4GHqMywptWU4jaWSf8FmSwwDQYJKoZIhvcNAQEMBQADggIBAHx4 +7PYCLLtbfpIrXTncvtgdokIzTfnvpCo7RGkerNlFo048p9gkUbJUHJNOxO97k4Vg +JuoJSOD1u8fpaNK7ajFxzHmuEajwmf3lH7wvqMxX63bEIaZHU1VNaL8FpO7XJqti +2kM3S+LGteWygxk6x9PbTZ4IevPuzz5i+6zoYMzRx6Fcg0XERczzF2sUyQQCPtIk +pnnpHs6i58FZFZ8d4kuaPp92CC1r2LpXFNqD6v6MVenQTqnMdzGxRBF6XLE+0xRF +FRhiJBPSy03OXIPBNvIQtQ6IbbjhVp+J3pZmOUdkLG5NrmJ7v2B0GbhWrJKsFjLt +rWhV/pi60zTe9Mlhww6G9kuEYO4Ne7UyWHmRVSyBQ7N0H3qqJZ4d16GLuc1CLgSk +ZoNNiTW2bKg2SnkheCLQQrzRQDGQob4Ez8pn7fXwgNNgyYMqIgXQBztSvwyeqiv5 +u+YfjyW6hY0XHgL+XVAEV8/+LbzvXMAaq7afJMbfc2hIkCwU9D9SGuTSyxTDYWnP +4vkYxboznxSjBF25cfe1lNj2M8FawTSLfJvdkzrnE6JwYZ+vj+vYxXX4M2bUdGc6 +N3ec592kD3ZDZopD8p/7DEJ4Y9HiD2971KE9dJeFt0g5QdYg/NA6s/rob8SKunE3 +vouXsXgxT7PntgMTzlSdriVZzH81Xwj3QEUxeCp6 +-----END CERTIFICATE----- + +# Issuer: CN=GlobalSign Root E46 O=GlobalSign nv-sa +# Subject: CN=GlobalSign Root E46 O=GlobalSign nv-sa +# Label: "GlobalSign Root E46" +# Serial: 1552617690338932563915843282459653771421763 +# MD5 Fingerprint: b5:b8:66:ed:de:08:83:e3:c9:e2:01:34:06:ac:51:6f +# SHA1 Fingerprint: 39:b4:6c:d5:fe:80:06:eb:e2:2f:4a:bb:08:33:a0:af:db:b9:dd:84 +# SHA256 Fingerprint: cb:b9:c4:4d:84:b8:04:3e:10:50:ea:31:a6:9f:51:49:55:d7:bf:d2:e2:c6:b4:93:01:01:9a:d6:1d:9f:50:58 +-----BEGIN CERTIFICATE----- +MIICCzCCAZGgAwIBAgISEdK7ujNu1LzmJGjFDYQdmOhDMAoGCCqGSM49BAMDMEYx +CzAJBgNVBAYTAkJFMRkwFwYDVQQKExBHbG9iYWxTaWduIG52LXNhMRwwGgYDVQQD +ExNHbG9iYWxTaWduIFJvb3QgRTQ2MB4XDTE5MDMyMDAwMDAwMFoXDTQ2MDMyMDAw +MDAwMFowRjELMAkGA1UEBhMCQkUxGTAXBgNVBAoTEEdsb2JhbFNpZ24gbnYtc2Ex +HDAaBgNVBAMTE0dsb2JhbFNpZ24gUm9vdCBFNDYwdjAQBgcqhkjOPQIBBgUrgQQA +IgNiAAScDrHPt+ieUnd1NPqlRqetMhkytAepJ8qUuwzSChDH2omwlwxwEwkBjtjq +R+q+soArzfwoDdusvKSGN+1wCAB16pMLey5SnCNoIwZD7JIvU4Tb+0cUB+hflGdd +yXqBPCCjQjBAMA4GA1UdDwEB/wQEAwIBhjAPBgNVHRMBAf8EBTADAQH/MB0GA1Ud +DgQWBBQxCpCPtsad0kRLgLWi5h+xEk8blTAKBggqhkjOPQQDAwNoADBlAjEA31SQ +7Zvvi5QCkxeCmb6zniz2C5GMn0oUsfZkvLtoURMMA/cVi4RguYv/Uo7njLwcAjA8 ++RHUjE7AwWHCFUyqqx0LMV87HOIAl0Qx5v5zli/altP+CAezNIm8BZ/3Hobui3A= +-----END CERTIFICATE----- + +# Issuer: CN=ANF Secure Server Root CA O=ANF Autoridad de Certificacion OU=ANF CA Raiz +# Subject: CN=ANF Secure Server Root CA O=ANF Autoridad de Certificacion OU=ANF CA Raiz +# Label: "ANF Secure Server Root CA" +# Serial: 996390341000653745 +# MD5 Fingerprint: 26:a6:44:5a:d9:af:4e:2f:b2:1d:b6:65:b0:4e:e8:96 +# SHA1 Fingerprint: 5b:6e:68:d0:cc:15:b6:a0:5f:1e:c1:5f:ae:02:fc:6b:2f:5d:6f:74 +# SHA256 Fingerprint: fb:8f:ec:75:91:69:b9:10:6b:1e:51:16:44:c6:18:c5:13:04:37:3f:6c:06:43:08:8d:8b:ef:fd:1b:99:75:99 +-----BEGIN CERTIFICATE----- +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 +-----END CERTIFICATE----- + +# Issuer: CN=Certum EC-384 CA O=Asseco Data Systems S.A. OU=Certum Certification Authority +# Subject: CN=Certum EC-384 CA O=Asseco Data Systems S.A. OU=Certum Certification Authority +# Label: "Certum EC-384 CA" +# Serial: 160250656287871593594747141429395092468 +# MD5 Fingerprint: b6:65:b3:96:60:97:12:a1:ec:4e:e1:3d:a3:c6:c9:f1 +# SHA1 Fingerprint: f3:3e:78:3c:ac:df:f4:a2:cc:ac:67:55:69:56:d7:e5:16:3c:e1:ed +# SHA256 Fingerprint: 6b:32:80:85:62:53:18:aa:50:d1:73:c9:8d:8b:da:09:d5:7e:27:41:3d:11:4c:f7:87:a0:f5:d0:6c:03:0c:f6 +-----BEGIN CERTIFICATE----- +MIICZTCCAeugAwIBAgIQeI8nXIESUiClBNAt3bpz9DAKBggqhkjOPQQDAzB0MQsw +CQYDVQQGEwJQTDEhMB8GA1UEChMYQXNzZWNvIERhdGEgU3lzdGVtcyBTLkEuMScw +JQYDVQQLEx5DZXJ0dW0gQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkxGTAXBgNVBAMT +EENlcnR1bSBFQy0zODQgQ0EwHhcNMTgwMzI2MDcyNDU0WhcNNDMwMzI2MDcyNDU0 +WjB0MQswCQYDVQQGEwJQTDEhMB8GA1UEChMYQXNzZWNvIERhdGEgU3lzdGVtcyBT +LkEuMScwJQYDVQQLEx5DZXJ0dW0gQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkxGTAX +BgNVBAMTEENlcnR1bSBFQy0zODQgQ0EwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAATE +KI6rGFtqvm5kN2PkzeyrOvfMobgOgknXhimfoZTy42B4mIF4Bk3y7JoOV2CDn7Tm +Fy8as10CW4kjPMIRBSqniBMY81CE1700LCeJVf/OTOffph8oxPBUw7l8t1Ot68Kj +QjBAMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFI0GZnQkdjrzife81r1HfS+8 +EF9LMA4GA1UdDwEB/wQEAwIBBjAKBggqhkjOPQQDAwNoADBlAjADVS2m5hjEfO/J +UG7BJw+ch69u1RsIGL2SKcHvlJF40jocVYli5RsJHrpka/F2tNQCMQC0QoSZ/6vn +nvuRlydd3LBbMHHOXjgaatkl5+r3YZJW+OraNsKHZZYuciUvf9/DE8k= +-----END CERTIFICATE----- + +# Issuer: CN=Certum Trusted Root CA O=Asseco Data Systems S.A. OU=Certum Certification Authority +# Subject: CN=Certum Trusted Root CA O=Asseco Data Systems S.A. OU=Certum Certification Authority +# Label: "Certum Trusted Root CA" +# Serial: 40870380103424195783807378461123655149 +# MD5 Fingerprint: 51:e1:c2:e7:fe:4c:84:af:59:0e:2f:f4:54:6f:ea:29 +# SHA1 Fingerprint: c8:83:44:c0:18:ae:9f:cc:f1:87:b7:8f:22:d1:c5:d7:45:84:ba:e5 +# SHA256 Fingerprint: fe:76:96:57:38:55:77:3e:37:a9:5e:7a:d4:d9:cc:96:c3:01:57:c1:5d:31:76:5b:a9:b1:57:04:e1:ae:78:fd +-----BEGIN CERTIFICATE----- +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 +-----END CERTIFICATE----- + +# Issuer: CN=TunTrust Root CA O=Agence Nationale de Certification Electronique +# Subject: CN=TunTrust Root CA O=Agence Nationale de Certification Electronique +# Label: "TunTrust Root CA" +# Serial: 108534058042236574382096126452369648152337120275 +# MD5 Fingerprint: 85:13:b9:90:5b:36:5c:b6:5e:b8:5a:f8:e0:31:57:b4 +# SHA1 Fingerprint: cf:e9:70:84:0f:e0:73:0f:9d:f6:0c:7f:2c:4b:ee:20:46:34:9c:bb +# SHA256 Fingerprint: 2e:44:10:2a:b5:8c:b8:54:19:45:1c:8e:19:d9:ac:f3:66:2c:af:bc:61:4b:6a:53:96:0a:30:f7:d0:e2:eb:41 +-----BEGIN CERTIFICATE----- +MIIFszCCA5ugAwIBAgIUEwLV4kBMkkaGFmddtLu7sms+/BMwDQYJKoZIhvcNAQEL +BQAwYTELMAkGA1UEBhMCVE4xNzA1BgNVBAoMLkFnZW5jZSBOYXRpb25hbGUgZGUg +Q2VydGlmaWNhdGlvbiBFbGVjdHJvbmlxdWUxGTAXBgNVBAMMEFR1blRydXN0IFJv +b3QgQ0EwHhcNMTkwNDI2MDg1NzU2WhcNNDQwNDI2MDg1NzU2WjBhMQswCQYDVQQG +EwJUTjE3MDUGA1UECgwuQWdlbmNlIE5hdGlvbmFsZSBkZSBDZXJ0aWZpY2F0aW9u +IEVsZWN0cm9uaXF1ZTEZMBcGA1UEAwwQVHVuVHJ1c3QgUm9vdCBDQTCCAiIwDQYJ +KoZIhvcNAQEBBQADggIPADCCAgoCggIBAMPN0/y9BFPdDCA61YguBUtB9YOCfvdZ +n56eY+hz2vYGqU8ftPkLHzmMmiDQfgbU7DTZhrx1W4eI8NLZ1KMKsmwb60ksPqxd +2JQDoOw05TDENX37Jk0bbjBU2PWARZw5rZzJJQRNmpA+TkBuimvNKWfGzC3gdOgF +VwpIUPp6Q9p+7FuaDmJ2/uqdHYVy7BG7NegfJ7/Boce7SBbdVtfMTqDhuazb1YMZ +GoXRlJfXyqNlC/M4+QKu3fZnz8k/9YosRxqZbwUN/dAdgjH8KcwAWJeRTIAAHDOF +li/LQcKLEITDCSSJH7UP2dl3RxiSlGBcx5kDPP73lad9UKGAwqmDrViWVSHbhlnU +r8a83YFuB9tgYv7sEG7aaAH0gxupPqJbI9dkxt/con3YS7qC0lH4Zr8GRuR5KiY2 +eY8fTpkdso8MDhz/yV3A/ZAQprE38806JG60hZC/gLkMjNWb1sjxVj8agIl6qeIb +MlEsPvLfe/ZdeikZjuXIvTZxi11Mwh0/rViizz1wTaZQmCXcI/m4WEEIcb9PuISg +jwBUFfyRbVinljvrS5YnzWuioYasDXxU5mZMZl+QviGaAkYt5IPCgLnPSz7ofzwB +7I9ezX/SKEIBlYrilz0QIX32nRzFNKHsLA4KUiwSVXAkPcvCFDVDXSdOvsC9qnyW +5/yeYa1E0wCXAgMBAAGjYzBhMB0GA1UdDgQWBBQGmpsfU33x9aTI04Y+oXNZtPdE +ITAPBgNVHRMBAf8EBTADAQH/MB8GA1UdIwQYMBaAFAaamx9TffH1pMjThj6hc1m0 +90QhMA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQsFAAOCAgEAqgVutt0Vyb+z +xiD2BkewhpMl0425yAA/l/VSJ4hxyXT968pk21vvHl26v9Hr7lxpuhbI87mP0zYu +QEkHDVneixCwSQXi/5E/S7fdAo74gShczNxtr18UnH1YeA32gAm56Q6XKRm4t+v4 +FstVEuTGfbvE7Pi1HE4+Z7/FXxttbUcoqgRYYdZ2vyJ/0Adqp2RT8JeNnYA/u8EH +22Wv5psymsNUk8QcCMNE+3tjEUPRahphanltkE8pjkcFwRJpadbGNjHh/PqAulxP +xOu3Mqz4dWEX1xAZufHSCe96Qp1bWgvUxpVOKs7/B9dPfhgGiPEZtdmYu65xxBzn +dFlY7wyJz4sfdZMaBBSSSFCp61cpABbjNhzI+L/wM9VBD8TMPN3pM0MBkRArHtG5 +Xc0yGYuPjCB31yLEQtyEFpslbei0VXF/sHyz03FJuc9SpAQ/3D2gu68zngowYI7b +nV2UqL1g52KAdoGDDIzMMEZJ4gzSqK/rYXHv5yJiqfdcZGyfFoxnNidF9Ql7v/YQ +CvGwjVRDjAS6oz/v4jXH+XTgbzRB0L9zZVcg+ZtnemZoJE6AZb0QmQZZ8mWvuMZH +u/2QeItBcy6vVR/cO5JyboTT0GFMDcx2V+IthSIVNg3rAZ3r2OvEhJn7wAzMMujj +d9qDRIueVSjAi1jTkD5OGwDxFa2DK5o= +-----END CERTIFICATE----- + +# Issuer: CN=HARICA TLS RSA Root CA 2021 O=Hellenic Academic and Research Institutions CA +# Subject: CN=HARICA TLS RSA Root CA 2021 O=Hellenic Academic and Research Institutions CA +# Label: "HARICA TLS RSA Root CA 2021" +# Serial: 76817823531813593706434026085292783742 +# MD5 Fingerprint: 65:47:9b:58:86:dd:2c:f0:fc:a2:84:1f:1e:96:c4:91 +# SHA1 Fingerprint: 02:2d:05:82:fa:88:ce:14:0c:06:79:de:7f:14:10:e9:45:d7:a5:6d +# SHA256 Fingerprint: d9:5d:0e:8e:da:79:52:5b:f9:be:b1:1b:14:d2:10:0d:32:94:98:5f:0c:62:d9:fa:bd:9c:d9:99:ec:cb:7b:1d +-----BEGIN CERTIFICATE----- +MIIFpDCCA4ygAwIBAgIQOcqTHO9D88aOk8f0ZIk4fjANBgkqhkiG9w0BAQsFADBs +MQswCQYDVQQGEwJHUjE3MDUGA1UECgwuSGVsbGVuaWMgQWNhZGVtaWMgYW5kIFJl +c2VhcmNoIEluc3RpdHV0aW9ucyBDQTEkMCIGA1UEAwwbSEFSSUNBIFRMUyBSU0Eg +Um9vdCBDQSAyMDIxMB4XDTIxMDIxOTEwNTUzOFoXDTQ1MDIxMzEwNTUzN1owbDEL +MAkGA1UEBhMCR1IxNzA1BgNVBAoMLkhlbGxlbmljIEFjYWRlbWljIGFuZCBSZXNl +YXJjaCBJbnN0aXR1dGlvbnMgQ0ExJDAiBgNVBAMMG0hBUklDQSBUTFMgUlNBIFJv +b3QgQ0EgMjAyMTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAIvC569l +mwVnlskNJLnQDmT8zuIkGCyEf3dRywQRNrhe7Wlxp57kJQmXZ8FHws+RFjZiPTgE +4VGC/6zStGndLuwRo0Xua2s7TL+MjaQenRG56Tj5eg4MmOIjHdFOY9TnuEFE+2uv +a9of08WRiFukiZLRgeaMOVig1mlDqa2YUlhu2wr7a89o+uOkXjpFc5gH6l8Cct4M +pbOfrqkdtx2z/IpZ525yZa31MJQjB/OCFks1mJxTuy/K5FrZx40d/JiZ+yykgmvw +Kh+OC19xXFyuQnspiYHLA6OZyoieC0AJQTPb5lh6/a6ZcMBaD9YThnEvdmn8kN3b +LW7R8pv1GmuebxWMevBLKKAiOIAkbDakO/IwkfN4E8/BPzWr8R0RI7VDIp4BkrcY +AuUR0YLbFQDMYTfBKnya4dC6s1BG7oKsnTH4+yPiAwBIcKMJJnkVU2DzOFytOOqB +AGMUuTNe3QvboEUHGjMJ+E20pwKmafTCWQWIZYVWrkvL4N48fS0ayOn7H6NhStYq +E613TBoYm5EPWNgGVMWX+Ko/IIqmhaZ39qb8HOLubpQzKoNQhArlT4b4UEV4AIHr +W2jjJo3Me1xR9BQsQL4aYB16cmEdH2MtiKrOokWQCPxrvrNQKlr9qEgYRtaQQJKQ +CoReaDH46+0N0x3GfZkYVVYnZS6NRcUk7M7jAgMBAAGjQjBAMA8GA1UdEwEB/wQF +MAMBAf8wHQYDVR0OBBYEFApII6ZgpJIKM+qTW8VX6iVNvRLuMA4GA1UdDwEB/wQE +AwIBhjANBgkqhkiG9w0BAQsFAAOCAgEAPpBIqm5iFSVmewzVjIuJndftTgfvnNAU +X15QvWiWkKQUEapobQk1OUAJ2vQJLDSle1mESSmXdMgHHkdt8s4cUCbjnj1AUz/3 +f5Z2EMVGpdAgS1D0NTsY9FVqQRtHBmg8uwkIYtlfVUKqrFOFrJVWNlar5AWMxaja +H6NpvVMPxP/cyuN+8kyIhkdGGvMA9YCRotxDQpSbIPDRzbLrLFPCU3hKTwSUQZqP +JzLB5UkZv/HywouoCjkxKLR9YjYsTewfM7Z+d21+UPCfDtcRj88YxeMn/ibvBZ3P +zzfF0HvaO7AWhAw6k9a+F9sPPg4ZeAnHqQJyIkv3N3a6dcSFA1pj1bF1BcK5vZSt +jBWZp5N99sXzqnTPBIWUmAD04vnKJGW/4GKvyMX6ssmeVkjaef2WdhW+o45WxLM0 +/L5H9MG0qPzVMIho7suuyWPEdr6sOBjhXlzPrjoiUevRi7PzKzMHVIf6tLITe7pT +BGIBnfHAT+7hOtSLIBD6Alfm78ELt5BGnBkpjNxvoEppaZS3JGWg/6w/zgH7IS79 +aPib8qXPMThcFarmlwDB31qlpzmq6YR/PFGoOtmUW4y/Twhx5duoXNTSpv4Ao8YW +xw/ogM4cKGR0GQjTQuPOAF1/sdwTsOEFy9EgqoZ0njnnkf3/W9b3raYvAwtt41dU +63ZTGI0RmLo= +-----END CERTIFICATE----- + +# Issuer: CN=HARICA TLS ECC Root CA 2021 O=Hellenic Academic and Research Institutions CA +# Subject: CN=HARICA TLS ECC Root CA 2021 O=Hellenic Academic and Research Institutions CA +# Label: "HARICA TLS ECC Root CA 2021" +# Serial: 137515985548005187474074462014555733966 +# MD5 Fingerprint: ae:f7:4c:e5:66:35:d1:b7:9b:8c:22:93:74:d3:4b:b0 +# SHA1 Fingerprint: bc:b0:c1:9d:e9:98:92:70:19:38:57:e9:8d:a7:b4:5d:6e:ee:01:48 +# SHA256 Fingerprint: 3f:99:cc:47:4a:cf:ce:4d:fe:d5:87:94:66:5e:47:8d:15:47:73:9f:2e:78:0f:1b:b4:ca:9b:13:30:97:d4:01 +-----BEGIN CERTIFICATE----- +MIICVDCCAdugAwIBAgIQZ3SdjXfYO2rbIvT/WeK/zjAKBggqhkjOPQQDAzBsMQsw +CQYDVQQGEwJHUjE3MDUGA1UECgwuSGVsbGVuaWMgQWNhZGVtaWMgYW5kIFJlc2Vh +cmNoIEluc3RpdHV0aW9ucyBDQTEkMCIGA1UEAwwbSEFSSUNBIFRMUyBFQ0MgUm9v +dCBDQSAyMDIxMB4XDTIxMDIxOTExMDExMFoXDTQ1MDIxMzExMDEwOVowbDELMAkG +A1UEBhMCR1IxNzA1BgNVBAoMLkhlbGxlbmljIEFjYWRlbWljIGFuZCBSZXNlYXJj +aCBJbnN0aXR1dGlvbnMgQ0ExJDAiBgNVBAMMG0hBUklDQSBUTFMgRUNDIFJvb3Qg +Q0EgMjAyMTB2MBAGByqGSM49AgEGBSuBBAAiA2IABDgI/rGgltJ6rK9JOtDA4MM7 +KKrxcm1lAEeIhPyaJmuqS7psBAqIXhfyVYf8MLA04jRYVxqEU+kw2anylnTDUR9Y +STHMmE5gEYd103KUkE+bECUqqHgtvpBBWJAVcqeht6NCMEAwDwYDVR0TAQH/BAUw +AwEB/zAdBgNVHQ4EFgQUyRtTgRL+BNUW0aq8mm+3oJUZbsowDgYDVR0PAQH/BAQD +AgGGMAoGCCqGSM49BAMDA2cAMGQCMBHervjcToiwqfAircJRQO9gcS3ujwLEXQNw +SaSS6sUUiHCm0w2wqsosQJz76YJumgIwK0eaB8bRwoF8yguWGEEbo/QwCZ61IygN +nxS2PFOiTAZpffpskcYqSUXm7LcT4Tps +-----END CERTIFICATE----- + +# Issuer: CN=Autoridad de Certificacion Firmaprofesional CIF A62634068 +# Subject: CN=Autoridad de Certificacion Firmaprofesional CIF A62634068 +# Label: "Autoridad de Certificacion Firmaprofesional CIF A62634068" +# Serial: 1977337328857672817 +# MD5 Fingerprint: 4e:6e:9b:54:4c:ca:b7:fa:48:e4:90:b1:15:4b:1c:a3 +# SHA1 Fingerprint: 0b:be:c2:27:22:49:cb:39:aa:db:35:5c:53:e3:8c:ae:78:ff:b6:fe +# SHA256 Fingerprint: 57:de:05:83:ef:d2:b2:6e:03:61:da:99:da:9d:f4:64:8d:ef:7e:e8:44:1c:3b:72:8a:fa:9b:cd:e0:f9:b2:6a +-----BEGIN CERTIFICATE----- +MIIGFDCCA/ygAwIBAgIIG3Dp0v+ubHEwDQYJKoZIhvcNAQELBQAwUTELMAkGA1UE +BhMCRVMxQjBABgNVBAMMOUF1dG9yaWRhZCBkZSBDZXJ0aWZpY2FjaW9uIEZpcm1h +cHJvZmVzaW9uYWwgQ0lGIEE2MjYzNDA2ODAeFw0xNDA5MjMxNTIyMDdaFw0zNjA1 +MDUxNTIyMDdaMFExCzAJBgNVBAYTAkVTMUIwQAYDVQQDDDlBdXRvcmlkYWQgZGUg +Q2VydGlmaWNhY2lvbiBGaXJtYXByb2Zlc2lvbmFsIENJRiBBNjI2MzQwNjgwggIi +MA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDKlmuO6vj78aI14H9M2uDDUtd9 +thDIAl6zQyrET2qyyhxdKJp4ERppWVevtSBC5IsP5t9bpgOSL/UR5GLXMnE42QQM +cas9UX4PB99jBVzpv5RvwSmCwLTaUbDBPLutN0pcyvFLNg4kq7/DhHf9qFD0sefG +L9ItWY16Ck6WaVICqjaY7Pz6FIMMNx/Jkjd/14Et5cS54D40/mf0PmbR0/RAz15i +NA9wBj4gGFrO93IbJWyTdBSTo3OxDqqHECNZXyAFGUftaI6SEspd/NYrspI8IM/h +X68gvqB2f3bl7BqGYTM+53u0P6APjqK5am+5hyZvQWyIplD9amML9ZMWGxmPsu2b +m8mQ9QEM3xk9Dz44I8kvjwzRAv4bVdZO0I08r0+k8/6vKtMFnXkIoctXMbScyJCy +Z/QYFpM6/EfY0XiWMR+6KwxfXZmtY4laJCB22N/9q06mIqqdXuYnin1oKaPnirja +EbsXLZmdEyRG98Xi2J+Of8ePdG1asuhy9azuJBCtLxTa/y2aRnFHvkLfuwHb9H/T +KI8xWVvTyQKmtFLKbpf7Q8UIJm+K9Lv9nyiqDdVF8xM6HdjAeI9BZzwelGSuewvF +6NkBiDkal4ZkQdU7hwxu+g/GvUgUvzlN1J5Bto+WHWOWk9mVBngxaJ43BjuAiUVh +OSPHG0SjFeUc+JIwuwIDAQABo4HvMIHsMB0GA1UdDgQWBBRlzeurNR4APn7VdMAc +tHNHDhpkLzASBgNVHRMBAf8ECDAGAQH/AgEBMIGmBgNVHSAEgZ4wgZswgZgGBFUd +IAAwgY8wLwYIKwYBBQUHAgEWI2h0dHA6Ly93d3cuZmlybWFwcm9mZXNpb25hbC5j +b20vY3BzMFwGCCsGAQUFBwICMFAeTgBQAGEAcwBlAG8AIABkAGUAIABsAGEAIABC +AG8AbgBhAG4AbwB2AGEAIAA0ADcAIABCAGEAcgBjAGUAbABvAG4AYQAgADAAOAAw +ADEANzAOBgNVHQ8BAf8EBAMCAQYwDQYJKoZIhvcNAQELBQADggIBAHSHKAIrdx9m +iWTtj3QuRhy7qPj4Cx2Dtjqn6EWKB7fgPiDL4QjbEwj4KKE1soCzC1HA01aajTNF +Sa9J8OA9B3pFE1r/yJfY0xgsfZb43aJlQ3CTkBW6kN/oGbDbLIpgD7dvlAceHabJ +hfa9NPhAeGIQcDq+fUs5gakQ1JZBu/hfHAsdCPKxsIl68veg4MSPi3i1O1ilI45P +Vf42O+AMt8oqMEEgtIDNrvx2ZnOorm7hfNoD6JQg5iKj0B+QXSBTFCZX2lSX3xZE +EAEeiGaPcjiT3SC3NL7X8e5jjkd5KAb881lFJWAiMxujX6i6KtoaPc1A6ozuBRWV +1aUsIC+nmCjuRfzxuIgALI9C2lHVnOUTaHFFQ4ueCyE8S1wF3BqfmI7avSKecs2t +CsvMo2ebKHTEm9caPARYpoKdrcd7b/+Alun4jWq9GJAd/0kakFI3ky88Al2CdgtR +5xbHV/g4+afNmyJU72OwFW1TZQNKXkqgsqeOSQBZONXH9IBk9W6VULgRfhVwOEqw +f9DEMnDAGf/JOC0ULGb0QkTmVXYbgBVX/8Cnp6o5qtjTcNAuuuuUavpfNIbnYrX9 +ivAwhZTJryQCL2/W3Wf+47BVTwSYT6RBVuKT0Gro1vP7ZeDOdcQxWQzugsgMYDNK +GbqEZycPvEJdvSRUDewdcAZfpLz6IHxV +-----END CERTIFICATE----- + +# Issuer: CN=vTrus ECC Root CA O=iTrusChina Co.,Ltd. +# Subject: CN=vTrus ECC Root CA O=iTrusChina Co.,Ltd. +# Label: "vTrus ECC Root CA" +# Serial: 630369271402956006249506845124680065938238527194 +# MD5 Fingerprint: de:4b:c1:f5:52:8c:9b:43:e1:3e:8f:55:54:17:8d:85 +# SHA1 Fingerprint: f6:9c:db:b0:fc:f6:02:13:b6:52:32:a6:a3:91:3f:16:70:da:c3:e1 +# SHA256 Fingerprint: 30:fb:ba:2c:32:23:8e:2a:98:54:7a:f9:79:31:e5:50:42:8b:9b:3f:1c:8e:eb:66:33:dc:fa:86:c5:b2:7d:d3 +-----BEGIN CERTIFICATE----- +MIICDzCCAZWgAwIBAgIUbmq8WapTvpg5Z6LSa6Q75m0c1towCgYIKoZIzj0EAwMw +RzELMAkGA1UEBhMCQ04xHDAaBgNVBAoTE2lUcnVzQ2hpbmEgQ28uLEx0ZC4xGjAY +BgNVBAMTEXZUcnVzIEVDQyBSb290IENBMB4XDTE4MDczMTA3MjY0NFoXDTQzMDcz +MTA3MjY0NFowRzELMAkGA1UEBhMCQ04xHDAaBgNVBAoTE2lUcnVzQ2hpbmEgQ28u +LEx0ZC4xGjAYBgNVBAMTEXZUcnVzIEVDQyBSb290IENBMHYwEAYHKoZIzj0CAQYF +K4EEACIDYgAEZVBKrox5lkqqHAjDo6LN/llWQXf9JpRCux3NCNtzslt188+cToL0 +v/hhJoVs1oVbcnDS/dtitN9Ti72xRFhiQgnH+n9bEOf+QP3A2MMrMudwpremIFUd +e4BdS49nTPEQo0IwQDAdBgNVHQ4EFgQUmDnNvtiyjPeyq+GtJK97fKHbH88wDwYD +VR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwCgYIKoZIzj0EAwMDaAAwZQIw +V53dVvHH4+m4SVBrm2nDb+zDfSXkV5UTQJtS0zvzQBm8JsctBp61ezaf9SXUY2sA +AjEA6dPGnlaaKsyh2j/IZivTWJwghfqrkYpwcBE4YGQLYgmRWAD5Tfs0aNoJrSEG +GJTO +-----END CERTIFICATE----- + +# Issuer: CN=vTrus Root CA O=iTrusChina Co.,Ltd. +# Subject: CN=vTrus Root CA O=iTrusChina Co.,Ltd. +# Label: "vTrus Root CA" +# Serial: 387574501246983434957692974888460947164905180485 +# MD5 Fingerprint: b8:c9:37:df:fa:6b:31:84:64:c5:ea:11:6a:1b:75:fc +# SHA1 Fingerprint: 84:1a:69:fb:f5:cd:1a:25:34:13:3d:e3:f8:fc:b8:99:d0:c9:14:b7 +# SHA256 Fingerprint: 8a:71:de:65:59:33:6f:42:6c:26:e5:38:80:d0:0d:88:a1:8d:a4:c6:a9:1f:0d:cb:61:94:e2:06:c5:c9:63:87 +-----BEGIN CERTIFICATE----- +MIIFVjCCAz6gAwIBAgIUQ+NxE9izWRRdt86M/TX9b7wFjUUwDQYJKoZIhvcNAQEL +BQAwQzELMAkGA1UEBhMCQ04xHDAaBgNVBAoTE2lUcnVzQ2hpbmEgQ28uLEx0ZC4x +FjAUBgNVBAMTDXZUcnVzIFJvb3QgQ0EwHhcNMTgwNzMxMDcyNDA1WhcNNDMwNzMx +MDcyNDA1WjBDMQswCQYDVQQGEwJDTjEcMBoGA1UEChMTaVRydXNDaGluYSBDby4s +THRkLjEWMBQGA1UEAxMNdlRydXMgUm9vdCBDQTCCAiIwDQYJKoZIhvcNAQEBBQAD +ggIPADCCAgoCggIBAL1VfGHTuB0EYgWgrmy3cLRB6ksDXhA/kFocizuwZotsSKYc +IrrVQJLuM7IjWcmOvFjai57QGfIvWcaMY1q6n6MLsLOaXLoRuBLpDLvPbmyAhykU +AyyNJJrIZIO1aqwTLDPxn9wsYTwaP3BVm60AUn/PBLn+NvqcwBauYv6WTEN+VRS+ +GrPSbcKvdmaVayqwlHeFXgQPYh1jdfdr58tbmnDsPmcF8P4HCIDPKNsFxhQnL4Z9 +8Cfe/+Z+M0jnCx5Y0ScrUw5XSmXX+6KAYPxMvDVTAWqXcoKv8R1w6Jz1717CbMdH +flqUhSZNO7rrTOiwCcJlwp2dCZtOtZcFrPUGoPc2BX70kLJrxLT5ZOrpGgrIDajt +J8nU57O5q4IikCc9Kuh8kO+8T/3iCiSn3mUkpF3qwHYw03dQ+A0Em5Q2AXPKBlim +0zvc+gRGE1WKyURHuFE5Gi7oNOJ5y1lKCn+8pu8fA2dqWSslYpPZUxlmPCdiKYZN +pGvu/9ROutW04o5IWgAZCfEF2c6Rsffr6TlP9m8EQ5pV9T4FFL2/s1m02I4zhKOQ +UqqzApVg+QxMaPnu1RcN+HFXtSXkKe5lXa/R7jwXC1pDxaWG6iSe4gUH3DRCEpHW +OXSuTEGC2/KmSNGzm/MzqvOmwMVO9fSddmPmAsYiS8GVP1BkLFTltvA8Kc9XAgMB +AAGjQjBAMB0GA1UdDgQWBBRUYnBj8XWEQ1iO0RYgscasGrz2iTAPBgNVHRMBAf8E +BTADAQH/MA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQsFAAOCAgEAKbqSSaet +8PFww+SX8J+pJdVrnjT+5hpk9jprUrIQeBqfTNqK2uwcN1LgQkv7bHbKJAs5EhWd +nxEt/Hlk3ODg9d3gV8mlsnZwUKT+twpw1aA08XXXTUm6EdGz2OyC/+sOxL9kLX1j +bhd47F18iMjrjld22VkE+rxSH0Ws8HqA7Oxvdq6R2xCOBNyS36D25q5J08FsEhvM +Kar5CKXiNxTKsbhm7xqC5PD48acWabfbqWE8n/Uxy+QARsIvdLGx14HuqCaVvIiv +TDUHKgLKeBRtRytAVunLKmChZwOgzoy8sHJnxDHO2zTlJQNgJXtxmOTAGytfdELS +S8VZCAeHvsXDf+eW2eHcKJfWjwXj9ZtOyh1QRwVTsMo554WgicEFOwE30z9J4nfr +I8iIZjs9OXYhRvHsXyO466JmdXTBQPfYaJqT4i2pLr0cox7IdMakLXogqzu4sEb9 +b91fUlV1YvCXoHzXOP0l382gmxDPi7g4Xl7FtKYCNqEeXxzP4padKar9mK5S4fNB +UvupLnKWnyfjqnN9+BojZns7q2WwMgFLFT49ok8MKzWixtlnEjUwzXYuFrOZnk1P +Ti07NEPhmg4NpGaXutIcSkwsKouLgU9xGqndXHt7CMUADTdA43x7VF8vhV929ven +sBxXVsFy6K2ir40zSbofitzmdHxghm+Hl3s= +-----END CERTIFICATE----- + +# Issuer: CN=ISRG Root X2 O=Internet Security Research Group +# Subject: CN=ISRG Root X2 O=Internet Security Research Group +# Label: "ISRG Root X2" +# Serial: 87493402998870891108772069816698636114 +# MD5 Fingerprint: d3:9e:c4:1e:23:3c:a6:df:cf:a3:7e:6d:e0:14:e6:e5 +# SHA1 Fingerprint: bd:b1:b9:3c:d5:97:8d:45:c6:26:14:55:f8:db:95:c7:5a:d1:53:af +# SHA256 Fingerprint: 69:72:9b:8e:15:a8:6e:fc:17:7a:57:af:b7:17:1d:fc:64:ad:d2:8c:2f:ca:8c:f1:50:7e:34:45:3c:cb:14:70 +-----BEGIN CERTIFICATE----- +MIICGzCCAaGgAwIBAgIQQdKd0XLq7qeAwSxs6S+HUjAKBggqhkjOPQQDAzBPMQsw +CQYDVQQGEwJVUzEpMCcGA1UEChMgSW50ZXJuZXQgU2VjdXJpdHkgUmVzZWFyY2gg +R3JvdXAxFTATBgNVBAMTDElTUkcgUm9vdCBYMjAeFw0yMDA5MDQwMDAwMDBaFw00 +MDA5MTcxNjAwMDBaME8xCzAJBgNVBAYTAlVTMSkwJwYDVQQKEyBJbnRlcm5ldCBT +ZWN1cml0eSBSZXNlYXJjaCBHcm91cDEVMBMGA1UEAxMMSVNSRyBSb290IFgyMHYw +EAYHKoZIzj0CAQYFK4EEACIDYgAEzZvVn4CDCuwJSvMWSj5cz3es3mcFDR0HttwW ++1qLFNvicWDEukWVEYmO6gbf9yoWHKS5xcUy4APgHoIYOIvXRdgKam7mAHf7AlF9 +ItgKbppbd9/w+kHsOdx1ymgHDB/qo0IwQDAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0T +AQH/BAUwAwEB/zAdBgNVHQ4EFgQUfEKWrt5LSDv6kviejM9ti6lyN5UwCgYIKoZI +zj0EAwMDaAAwZQIwe3lORlCEwkSHRhtFcP9Ymd70/aTSVaYgLXTWNLxBo1BfASdW +tL4ndQavEi51mI38AjEAi/V3bNTIZargCyzuFJ0nN6T5U6VR5CmD1/iQMVtCnwr1 +/q4AaOeMSQ+2b1tbFfLn +-----END CERTIFICATE----- + +# Issuer: CN=HiPKI Root CA - G1 O=Chunghwa Telecom Co., Ltd. +# Subject: CN=HiPKI Root CA - G1 O=Chunghwa Telecom Co., Ltd. +# Label: "HiPKI Root CA - G1" +# Serial: 60966262342023497858655262305426234976 +# MD5 Fingerprint: 69:45:df:16:65:4b:e8:68:9a:8f:76:5f:ff:80:9e:d3 +# SHA1 Fingerprint: 6a:92:e4:a8:ee:1b:ec:96:45:37:e3:29:57:49:cd:96:e3:e5:d2:60 +# SHA256 Fingerprint: f0:15:ce:3c:c2:39:bf:ef:06:4b:e9:f1:d2:c4:17:e1:a0:26:4a:0a:94:be:1f:0c:8d:12:18:64:eb:69:49:cc +-----BEGIN CERTIFICATE----- +MIIFajCCA1KgAwIBAgIQLd2szmKXlKFD6LDNdmpeYDANBgkqhkiG9w0BAQsFADBP +MQswCQYDVQQGEwJUVzEjMCEGA1UECgwaQ2h1bmdod2EgVGVsZWNvbSBDby4sIEx0 +ZC4xGzAZBgNVBAMMEkhpUEtJIFJvb3QgQ0EgLSBHMTAeFw0xOTAyMjIwOTQ2MDRa +Fw0zNzEyMzExNTU5NTlaME8xCzAJBgNVBAYTAlRXMSMwIQYDVQQKDBpDaHVuZ2h3 +YSBUZWxlY29tIENvLiwgTHRkLjEbMBkGA1UEAwwSSGlQS0kgUm9vdCBDQSAtIEcx +MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEA9B5/UnMyDHPkvRN0o9Qw +qNCuS9i233VHZvR85zkEHmpwINJaR3JnVfSl6J3VHiGh8Ge6zCFovkRTv4354twv +Vcg3Px+kwJyz5HdcoEb+d/oaoDjq7Zpy3iu9lFc6uux55199QmQ5eiY29yTw1S+6 +lZgRZq2XNdZ1AYDgr/SEYYwNHl98h5ZeQa/rh+r4XfEuiAU+TCK72h8q3VJGZDnz +Qs7ZngyzsHeXZJzA9KMuH5UHsBffMNsAGJZMoYFL3QRtU6M9/Aes1MU3guvklQgZ +KILSQjqj2FPseYlgSGDIcpJQ3AOPgz+yQlda22rpEZfdhSi8MEyr48KxRURHH+CK +FgeW0iEPU8DtqX7UTuybCeyvQqww1r/REEXgphaypcXTT3OUM3ECoWqj1jOXTyFj +HluP2cFeRXF3D4FdXyGarYPM+l7WjSNfGz1BryB1ZlpK9p/7qxj3ccC2HTHsOyDr +y+K49a6SsvfhhEvyovKTmiKe0xRvNlS9H15ZFblzqMF8b3ti6RZsR1pl8w4Rm0bZ +/W3c1pzAtH2lsN0/Vm+h+fbkEkj9Bn8SV7apI09bA8PgcSojt/ewsTu8mL3WmKgM +a/aOEmem8rJY5AIJEzypuxC00jBF8ez3ABHfZfjcK0NVvxaXxA/VLGGEqnKG/uY6 +fsI/fe78LxQ+5oXdUG+3Se0CAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAdBgNV +HQ4EFgQU8ncX+l6o/vY9cdVouslGDDjYr7AwDgYDVR0PAQH/BAQDAgGGMA0GCSqG +SIb3DQEBCwUAA4ICAQBQUfB13HAE4/+qddRxosuej6ip0691x1TPOhwEmSKsxBHi +7zNKpiMdDg1H2DfHb680f0+BazVP6XKlMeJ45/dOlBhbQH3PayFUhuaVevvGyuqc +SE5XCV0vrPSltJczWNWseanMX/mF+lLFjfiRFOs6DRfQUsJ748JzjkZ4Bjgs6Fza +ZsT0pPBWGTMpWmWSBUdGSquEwx4noR8RkpkndZMPvDY7l1ePJlsMu5wP1G4wB9Tc +XzZoZjmDlicmisjEOf6aIW/Vcobpf2Lll07QJNBAsNB1CI69aO4I1258EHBGG3zg +iLKecoaZAeO/n0kZtCW+VmWuF2PlHt/o/0elv+EmBYTksMCv5wiZqAxeJoBF1Pho +L5aPruJKHJwWDBNvOIf2u8g0X5IDUXlwpt/L9ZlNec1OvFefQ05rLisY+GpzjLrF +Ne85akEez3GoorKGB1s6yeHvP2UEgEcyRHCVTjFnanRbEEV16rCf0OY1/k6fi8wr +kkVbbiVghUbN0aqwdmaTd5a+g744tiROJgvM7XpWGuDpWsZkrUx6AEhEL7lAuxM+ +vhV4nYWBSipX3tUZQ9rbyltHhoMLP7YNdnhzeSJesYAfz77RP1YQmCuVh6EfnWQU +YDksswBVLuT1sw5XxJFBAJw/6KXf6vb/yPCtbVKoF6ubYfwSUTXkJf2vqmqGOQ== +-----END CERTIFICATE----- + +# Issuer: CN=GlobalSign O=GlobalSign OU=GlobalSign ECC Root CA - R4 +# Subject: CN=GlobalSign O=GlobalSign OU=GlobalSign ECC Root CA - R4 +# Label: "GlobalSign ECC Root CA - R4" +# Serial: 159662223612894884239637590694 +# MD5 Fingerprint: 26:29:f8:6d:e1:88:bf:a2:65:7f:aa:c4:cd:0f:7f:fc +# SHA1 Fingerprint: 6b:a0:b0:98:e1:71:ef:5a:ad:fe:48:15:80:77:10:f4:bd:6f:0b:28 +# SHA256 Fingerprint: b0:85:d7:0b:96:4f:19:1a:73:e4:af:0d:54:ae:7a:0e:07:aa:fd:af:9b:71:dd:08:62:13:8a:b7:32:5a:24:a2 +-----BEGIN CERTIFICATE----- +MIIB3DCCAYOgAwIBAgINAgPlfvU/k/2lCSGypjAKBggqhkjOPQQDAjBQMSQwIgYD +VQQLExtHbG9iYWxTaWduIEVDQyBSb290IENBIC0gUjQxEzARBgNVBAoTCkdsb2Jh +bFNpZ24xEzARBgNVBAMTCkdsb2JhbFNpZ24wHhcNMTIxMTEzMDAwMDAwWhcNMzgw +MTE5MDMxNDA3WjBQMSQwIgYDVQQLExtHbG9iYWxTaWduIEVDQyBSb290IENBIC0g +UjQxEzARBgNVBAoTCkdsb2JhbFNpZ24xEzARBgNVBAMTCkdsb2JhbFNpZ24wWTAT +BgcqhkjOPQIBBggqhkjOPQMBBwNCAAS4xnnTj2wlDp8uORkcA6SumuU5BwkWymOx +uYb4ilfBV85C+nOh92VC/x7BALJucw7/xyHlGKSq2XE/qNS5zowdo0IwQDAOBgNV +HQ8BAf8EBAMCAYYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUVLB7rUW44kB/ ++wpu+74zyTyjhNUwCgYIKoZIzj0EAwIDRwAwRAIgIk90crlgr/HmnKAWBVBfw147 +bmF0774BxL4YSFlhgjICICadVGNA3jdgUM/I2O2dgq43mLyjj0xMqTQrbO/7lZsm +-----END CERTIFICATE----- + +# Issuer: CN=GTS Root R1 O=Google Trust Services LLC +# Subject: CN=GTS Root R1 O=Google Trust Services LLC +# Label: "GTS Root R1" +# Serial: 159662320309726417404178440727 +# MD5 Fingerprint: 05:fe:d0:bf:71:a8:a3:76:63:da:01:e0:d8:52:dc:40 +# SHA1 Fingerprint: e5:8c:1c:c4:91:3b:38:63:4b:e9:10:6e:e3:ad:8e:6b:9d:d9:81:4a +# SHA256 Fingerprint: d9:47:43:2a:bd:e7:b7:fa:90:fc:2e:6b:59:10:1b:12:80:e0:e1:c7:e4:e4:0f:a3:c6:88:7f:ff:57:a7:f4:cf +-----BEGIN CERTIFICATE----- +MIIFVzCCAz+gAwIBAgINAgPlk28xsBNJiGuiFzANBgkqhkiG9w0BAQwFADBHMQsw +CQYDVQQGEwJVUzEiMCAGA1UEChMZR29vZ2xlIFRydXN0IFNlcnZpY2VzIExMQzEU +MBIGA1UEAxMLR1RTIFJvb3QgUjEwHhcNMTYwNjIyMDAwMDAwWhcNMzYwNjIyMDAw +MDAwWjBHMQswCQYDVQQGEwJVUzEiMCAGA1UEChMZR29vZ2xlIFRydXN0IFNlcnZp +Y2VzIExMQzEUMBIGA1UEAxMLR1RTIFJvb3QgUjEwggIiMA0GCSqGSIb3DQEBAQUA +A4ICDwAwggIKAoICAQC2EQKLHuOhd5s73L+UPreVp0A8of2C+X0yBoJx9vaMf/vo +27xqLpeXo4xL+Sv2sfnOhB2x+cWX3u+58qPpvBKJXqeqUqv4IyfLpLGcY9vXmX7w +Cl7raKb0xlpHDU0QM+NOsROjyBhsS+z8CZDfnWQpJSMHobTSPS5g4M/SCYe7zUjw +TcLCeoiKu7rPWRnWr4+wB7CeMfGCwcDfLqZtbBkOtdh+JhpFAz2weaSUKK0Pfybl +qAj+lug8aJRT7oM6iCsVlgmy4HqMLnXWnOunVmSPlk9orj2XwoSPwLxAwAtcvfaH +szVsrBhQf4TgTM2S0yDpM7xSma8ytSmzJSq0SPly4cpk9+aCEI3oncKKiPo4Zor8 +Y/kB+Xj9e1x3+naH+uzfsQ55lVe0vSbv1gHR6xYKu44LtcXFilWr06zqkUspzBmk +MiVOKvFlRNACzqrOSbTqn3yDsEB750Orp2yjj32JgfpMpf/VjsPOS+C12LOORc92 +wO1AK/1TD7Cn1TsNsYqiA94xrcx36m97PtbfkSIS5r762DL8EGMUUXLeXdYWk70p +aDPvOmbsB4om3xPXV2V4J95eSRQAogB/mqghtqmxlbCluQ0WEdrHbEg8QOB+DVrN +VjzRlwW5y0vtOUucxD/SVRNuJLDWcfr0wbrM7Rv1/oFB2ACYPTrIrnqYNxgFlQID +AQABo0IwQDAOBgNVHQ8BAf8EBAMCAYYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4E +FgQU5K8rJnEaK0gnhS9SZizv8IkTcT4wDQYJKoZIhvcNAQEMBQADggIBAJ+qQibb +C5u+/x6Wki4+omVKapi6Ist9wTrYggoGxval3sBOh2Z5ofmmWJyq+bXmYOfg6LEe +QkEzCzc9zolwFcq1JKjPa7XSQCGYzyI0zzvFIoTgxQ6KfF2I5DUkzps+GlQebtuy +h6f88/qBVRRiClmpIgUxPoLW7ttXNLwzldMXG+gnoot7TiYaelpkttGsN/H9oPM4 +7HLwEXWdyzRSjeZ2axfG34arJ45JK3VmgRAhpuo+9K4l/3wV3s6MJT/KYnAK9y8J +ZgfIPxz88NtFMN9iiMG1D53Dn0reWVlHxYciNuaCp+0KueIHoI17eko8cdLiA6Ef +MgfdG+RCzgwARWGAtQsgWSl4vflVy2PFPEz0tv/bal8xa5meLMFrUKTX5hgUvYU/ +Z6tGn6D/Qqc6f1zLXbBwHSs09dR2CQzreExZBfMzQsNhFRAbd03OIozUhfJFfbdT +6u9AWpQKXCBfTkBdYiJ23//OYb2MI3jSNwLgjt7RETeJ9r/tSQdirpLsQBqvFAnZ +0E6yove+7u7Y/9waLd64NnHi/Hm3lCXRSHNboTXns5lndcEZOitHTtNCjv0xyBZm +2tIMPNuzjsmhDYAPexZ3FL//2wmUspO8IFgV6dtxQ/PeEMMA3KgqlbbC1j+Qa3bb +bP6MvPJwNQzcmRk13NfIRmPVNnGuV/u3gm3c +-----END CERTIFICATE----- + +# Issuer: CN=GTS Root R2 O=Google Trust Services LLC +# Subject: CN=GTS Root R2 O=Google Trust Services LLC +# Label: "GTS Root R2" +# Serial: 159662449406622349769042896298 +# MD5 Fingerprint: 1e:39:c0:53:e6:1e:29:82:0b:ca:52:55:36:5d:57:dc +# SHA1 Fingerprint: 9a:44:49:76:32:db:de:fa:d0:bc:fb:5a:7b:17:bd:9e:56:09:24:94 +# SHA256 Fingerprint: 8d:25:cd:97:22:9d:bf:70:35:6b:da:4e:b3:cc:73:40:31:e2:4c:f0:0f:af:cf:d3:2d:c7:6e:b5:84:1c:7e:a8 +-----BEGIN CERTIFICATE----- +MIIFVzCCAz+gAwIBAgINAgPlrsWNBCUaqxElqjANBgkqhkiG9w0BAQwFADBHMQsw +CQYDVQQGEwJVUzEiMCAGA1UEChMZR29vZ2xlIFRydXN0IFNlcnZpY2VzIExMQzEU +MBIGA1UEAxMLR1RTIFJvb3QgUjIwHhcNMTYwNjIyMDAwMDAwWhcNMzYwNjIyMDAw +MDAwWjBHMQswCQYDVQQGEwJVUzEiMCAGA1UEChMZR29vZ2xlIFRydXN0IFNlcnZp +Y2VzIExMQzEUMBIGA1UEAxMLR1RTIFJvb3QgUjIwggIiMA0GCSqGSIb3DQEBAQUA +A4ICDwAwggIKAoICAQDO3v2m++zsFDQ8BwZabFn3GTXd98GdVarTzTukk3LvCvpt +nfbwhYBboUhSnznFt+4orO/LdmgUud+tAWyZH8QiHZ/+cnfgLFuv5AS/T3KgGjSY +6Dlo7JUle3ah5mm5hRm9iYz+re026nO8/4Piy33B0s5Ks40FnotJk9/BW9BuXvAu +MC6C/Pq8tBcKSOWIm8Wba96wyrQD8Nr0kLhlZPdcTK3ofmZemde4wj7I0BOdre7k +RXuJVfeKH2JShBKzwkCX44ofR5GmdFrS+LFjKBC4swm4VndAoiaYecb+3yXuPuWg +f9RhD1FLPD+M2uFwdNjCaKH5wQzpoeJ/u1U8dgbuak7MkogwTZq9TwtImoS1mKPV ++3PBV2HdKFZ1E66HjucMUQkQdYhMvI35ezzUIkgfKtzra7tEscszcTJGr61K8Yzo +dDqs5xoic4DSMPclQsciOzsSrZYuxsN2B6ogtzVJV+mSSeh2FnIxZyuWfoqjx5RW +Ir9qS34BIbIjMt/kmkRtWVtd9QCgHJvGeJeNkP+byKq0rxFROV7Z+2et1VsRnTKa +G73VululycslaVNVJ1zgyjbLiGH7HrfQy+4W+9OmTN6SpdTi3/UGVN4unUu0kzCq +gc7dGtxRcw1PcOnlthYhGXmy5okLdWTK1au8CcEYof/UVKGFPP0UJAOyh9OktwID +AQABo0IwQDAOBgNVHQ8BAf8EBAMCAYYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4E +FgQUu//KjiOfT5nK2+JopqUVJxce2Q4wDQYJKoZIhvcNAQEMBQADggIBAB/Kzt3H +vqGf2SdMC9wXmBFqiN495nFWcrKeGk6c1SuYJF2ba3uwM4IJvd8lRuqYnrYb/oM8 +0mJhwQTtzuDFycgTE1XnqGOtjHsB/ncw4c5omwX4Eu55MaBBRTUoCnGkJE+M3DyC +B19m3H0Q/gxhswWV7uGugQ+o+MePTagjAiZrHYNSVc61LwDKgEDg4XSsYPWHgJ2u +NmSRXbBoGOqKYcl3qJfEycel/FVL8/B/uWU9J2jQzGv6U53hkRrJXRqWbTKH7QMg +yALOWr7Z6v2yTcQvG99fevX4i8buMTolUVVnjWQye+mew4K6Ki3pHrTgSAai/Gev +HyICc/sgCq+dVEuhzf9gR7A/Xe8bVr2XIZYtCtFenTgCR2y59PYjJbigapordwj6 +xLEokCZYCDzifqrXPW+6MYgKBesntaFJ7qBFVHvmJ2WZICGoo7z7GJa7Um8M7YNR +TOlZ4iBgxcJlkoKM8xAfDoqXvneCbT+PHV28SSe9zE8P4c52hgQjxcCMElv924Sg +JPFI/2R80L5cFtHvma3AH/vLrrw4IgYmZNralw4/KBVEqE8AyvCazM90arQ+POuV +7LXTWtiBmelDGDfrs7vRWGJB82bSj6p4lVQgw1oudCvV0b4YacCs1aTPObpRhANl +6WLAYv7YTVWW4tAR+kg0Eeye7QUd5MjWHYbL +-----END CERTIFICATE----- + +# Issuer: CN=GTS Root R3 O=Google Trust Services LLC +# Subject: CN=GTS Root R3 O=Google Trust Services LLC +# Label: "GTS Root R3" +# Serial: 159662495401136852707857743206 +# MD5 Fingerprint: 3e:e7:9d:58:02:94:46:51:94:e5:e0:22:4a:8b:e7:73 +# SHA1 Fingerprint: ed:e5:71:80:2b:c8:92:b9:5b:83:3c:d2:32:68:3f:09:cd:a0:1e:46 +# SHA256 Fingerprint: 34:d8:a7:3e:e2:08:d9:bc:db:0d:95:65:20:93:4b:4e:40:e6:94:82:59:6e:8b:6f:73:c8:42:6b:01:0a:6f:48 +-----BEGIN CERTIFICATE----- +MIICCTCCAY6gAwIBAgINAgPluILrIPglJ209ZjAKBggqhkjOPQQDAzBHMQswCQYD +VQQGEwJVUzEiMCAGA1UEChMZR29vZ2xlIFRydXN0IFNlcnZpY2VzIExMQzEUMBIG +A1UEAxMLR1RTIFJvb3QgUjMwHhcNMTYwNjIyMDAwMDAwWhcNMzYwNjIyMDAwMDAw +WjBHMQswCQYDVQQGEwJVUzEiMCAGA1UEChMZR29vZ2xlIFRydXN0IFNlcnZpY2Vz +IExMQzEUMBIGA1UEAxMLR1RTIFJvb3QgUjMwdjAQBgcqhkjOPQIBBgUrgQQAIgNi +AAQfTzOHMymKoYTey8chWEGJ6ladK0uFxh1MJ7x/JlFyb+Kf1qPKzEUURout736G +jOyxfi//qXGdGIRFBEFVbivqJn+7kAHjSxm65FSWRQmx1WyRRK2EE46ajA2ADDL2 +4CejQjBAMA4GA1UdDwEB/wQEAwIBhjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQW +BBTB8Sa6oC2uhYHP0/EqEr24Cmf9vDAKBggqhkjOPQQDAwNpADBmAjEA9uEglRR7 +VKOQFhG/hMjqb2sXnh5GmCCbn9MN2azTL818+FsuVbu/3ZL3pAzcMeGiAjEA/Jdm +ZuVDFhOD3cffL74UOO0BzrEXGhF16b0DjyZ+hOXJYKaV11RZt+cRLInUue4X +-----END CERTIFICATE----- + +# Issuer: CN=GTS Root R4 O=Google Trust Services LLC +# Subject: CN=GTS Root R4 O=Google Trust Services LLC +# Label: "GTS Root R4" +# Serial: 159662532700760215368942768210 +# MD5 Fingerprint: 43:96:83:77:19:4d:76:b3:9d:65:52:e4:1d:22:a5:e8 +# SHA1 Fingerprint: 77:d3:03:67:b5:e0:0c:15:f6:0c:38:61:df:7c:e1:3b:92:46:4d:47 +# SHA256 Fingerprint: 34:9d:fa:40:58:c5:e2:63:12:3b:39:8a:e7:95:57:3c:4e:13:13:c8:3f:e6:8f:93:55:6c:d5:e8:03:1b:3c:7d +-----BEGIN CERTIFICATE----- +MIICCTCCAY6gAwIBAgINAgPlwGjvYxqccpBQUjAKBggqhkjOPQQDAzBHMQswCQYD +VQQGEwJVUzEiMCAGA1UEChMZR29vZ2xlIFRydXN0IFNlcnZpY2VzIExMQzEUMBIG +A1UEAxMLR1RTIFJvb3QgUjQwHhcNMTYwNjIyMDAwMDAwWhcNMzYwNjIyMDAwMDAw +WjBHMQswCQYDVQQGEwJVUzEiMCAGA1UEChMZR29vZ2xlIFRydXN0IFNlcnZpY2Vz +IExMQzEUMBIGA1UEAxMLR1RTIFJvb3QgUjQwdjAQBgcqhkjOPQIBBgUrgQQAIgNi +AATzdHOnaItgrkO4NcWBMHtLSZ37wWHO5t5GvWvVYRg1rkDdc/eJkTBa6zzuhXyi +QHY7qca4R9gq55KRanPpsXI5nymfopjTX15YhmUPoYRlBtHci8nHc8iMai/lxKvR +HYqjQjBAMA4GA1UdDwEB/wQEAwIBhjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQW +BBSATNbrdP9JNqPV2Py1PsVq8JQdjDAKBggqhkjOPQQDAwNpADBmAjEA6ED/g94D +9J+uHXqnLrmvT/aDHQ4thQEd0dlq7A/Cr8deVl5c1RxYIigL9zC2L7F8AjEA8GE8 +p/SgguMh1YQdc4acLa/KNJvxn7kjNuK8YAOdgLOaVsjh4rsUecrNIdSUtUlD +-----END CERTIFICATE----- + +# Issuer: CN=Telia Root CA v2 O=Telia Finland Oyj +# Subject: CN=Telia Root CA v2 O=Telia Finland Oyj +# Label: "Telia Root CA v2" +# Serial: 7288924052977061235122729490515358 +# MD5 Fingerprint: 0e:8f:ac:aa:82:df:85:b1:f4:dc:10:1c:fc:99:d9:48 +# SHA1 Fingerprint: b9:99:cd:d1:73:50:8a:c4:47:05:08:9c:8c:88:fb:be:a0:2b:40:cd +# SHA256 Fingerprint: 24:2b:69:74:2f:cb:1e:5b:2a:bf:98:89:8b:94:57:21:87:54:4e:5b:4d:99:11:78:65:73:62:1f:6a:74:b8:2c +-----BEGIN CERTIFICATE----- +MIIFdDCCA1ygAwIBAgIPAWdfJ9b+euPkrL4JWwWeMA0GCSqGSIb3DQEBCwUAMEQx +CzAJBgNVBAYTAkZJMRowGAYDVQQKDBFUZWxpYSBGaW5sYW5kIE95ajEZMBcGA1UE +AwwQVGVsaWEgUm9vdCBDQSB2MjAeFw0xODExMjkxMTU1NTRaFw00MzExMjkxMTU1 +NTRaMEQxCzAJBgNVBAYTAkZJMRowGAYDVQQKDBFUZWxpYSBGaW5sYW5kIE95ajEZ +MBcGA1UEAwwQVGVsaWEgUm9vdCBDQSB2MjCCAiIwDQYJKoZIhvcNAQEBBQADggIP +ADCCAgoCggIBALLQPwe84nvQa5n44ndp586dpAO8gm2h/oFlH0wnrI4AuhZ76zBq +AMCzdGh+sq/H1WKzej9Qyow2RCRj0jbpDIX2Q3bVTKFgcmfiKDOlyzG4OiIjNLh9 +vVYiQJ3q9HsDrWj8soFPmNB06o3lfc1jw6P23pLCWBnglrvFxKk9pXSW/q/5iaq9 +lRdU2HhE8Qx3FZLgmEKnpNaqIJLNwaCzlrI6hEKNfdWV5Nbb6WLEWLN5xYzTNTOD +n3WhUidhOPFZPY5Q4L15POdslv5e2QJltI5c0BE0312/UqeBAMN/mUWZFdUXyApT +7GPzmX3MaRKGwhfwAZ6/hLzRUssbkmbOpFPlob/E2wnW5olWK8jjfN7j/4nlNW4o +6GwLI1GpJQXrSPjdscr6bAhR77cYbETKJuFzxokGgeWKrLDiKca5JLNrRBH0pUPC +TEPlcDaMtjNXepUugqD0XBCzYYP2AgWGLnwtbNwDRm41k9V6lS/eINhbfpSQBGq6 +WT0EBXWdN6IOLj3rwaRSg/7Qa9RmjtzG6RJOHSpXqhC8fF6CfaamyfItufUXJ63R +DolUK5X6wK0dmBR4M0KGCqlztft0DbcbMBnEWg4cJ7faGND/isgFuvGqHKI3t+ZI +pEYslOqodmJHixBTB0hXbOKSTbauBcvcwUpej6w9GU7C7WB1K9vBykLVAgMBAAGj +YzBhMB8GA1UdIwQYMBaAFHKs5DN5qkWH9v2sHZ7Wxy+G2CQ5MB0GA1UdDgQWBBRy +rOQzeapFh/b9rB2e1scvhtgkOTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUw +AwEB/zANBgkqhkiG9w0BAQsFAAOCAgEAoDtZpwmUPjaE0n4vOaWWl/oRrfxn83EJ +8rKJhGdEr7nv7ZbsnGTbMjBvZ5qsfl+yqwE2foH65IRe0qw24GtixX1LDoJt0nZi +0f6X+J8wfBj5tFJ3gh1229MdqfDBmgC9bXXYfef6xzijnHDoRnkDry5023X4blMM +A8iZGok1GTzTyVR8qPAs5m4HeW9q4ebqkYJpCh3DflminmtGFZhb069GHWLIzoBS +SRE/yQQSwxN8PzuKlts8oB4KtItUsiRnDe+Cy748fdHif64W1lZYudogsYMVoe+K +TTJvQS8TUoKU1xrBeKJR3Stwbbca+few4GeXVtt8YVMJAygCQMez2P2ccGrGKMOF +6eLtGpOg3kuYooQ+BXcBlj37tCAPnHICehIv1aO6UXivKitEZU61/Qrowc15h2Er +3oBXRb9n8ZuRXqWk7FlIEA04x7D6w0RtBPV4UBySllva9bguulvP5fBqnUsvWHMt +Ty3EHD70sz+rFQ47GUGKpMFXEmZxTPpT41frYpUJnlTd0cI8Vzy9OK2YZLe4A5pT +VmBds9hCG1xLEooc6+t9xnppxyd/pPiL8uSUZodL6ZQHCRJ5irLrdATczvREWeAW +ysUsWNc8e89ihmpQfTU2Zqf7N+cox9jQraVplI/owd8k+BsHMYeB2F326CjYSlKA +rBPuUBQemMc= +-----END CERTIFICATE----- + +# Issuer: CN=D-TRUST BR Root CA 1 2020 O=D-Trust GmbH +# Subject: CN=D-TRUST BR Root CA 1 2020 O=D-Trust GmbH +# Label: "D-TRUST BR Root CA 1 2020" +# Serial: 165870826978392376648679885835942448534 +# MD5 Fingerprint: b5:aa:4b:d5:ed:f7:e3:55:2e:8f:72:0a:f3:75:b8:ed +# SHA1 Fingerprint: 1f:5b:98:f0:e3:b5:f7:74:3c:ed:e6:b0:36:7d:32:cd:f4:09:41:67 +# SHA256 Fingerprint: e5:9a:aa:81:60:09:c2:2b:ff:5b:25:ba:d3:7d:f3:06:f0:49:79:7c:1f:81:d8:5a:b0:89:e6:57:bd:8f:00:44 +-----BEGIN CERTIFICATE----- +MIIC2zCCAmCgAwIBAgIQfMmPK4TX3+oPyWWa00tNljAKBggqhkjOPQQDAzBIMQsw +CQYDVQQGEwJERTEVMBMGA1UEChMMRC1UcnVzdCBHbWJIMSIwIAYDVQQDExlELVRS +VVNUIEJSIFJvb3QgQ0EgMSAyMDIwMB4XDTIwMDIxMTA5NDUwMFoXDTM1MDIxMTA5 +NDQ1OVowSDELMAkGA1UEBhMCREUxFTATBgNVBAoTDEQtVHJ1c3QgR21iSDEiMCAG +A1UEAxMZRC1UUlVTVCBCUiBSb290IENBIDEgMjAyMDB2MBAGByqGSM49AgEGBSuB +BAAiA2IABMbLxyjR+4T1mu9CFCDhQ2tuda38KwOE1HaTJddZO0Flax7mNCq7dPYS +zuht56vkPE4/RAiLzRZxy7+SmfSk1zxQVFKQhYN4lGdnoxwJGT11NIXe7WB9xwy0 +QVK5buXuQqOCAQ0wggEJMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFHOREKv/ +VbNafAkl1bK6CKBrqx9tMA4GA1UdDwEB/wQEAwIBBjCBxgYDVR0fBIG+MIG7MD6g +PKA6hjhodHRwOi8vY3JsLmQtdHJ1c3QubmV0L2NybC9kLXRydXN0X2JyX3Jvb3Rf +Y2FfMV8yMDIwLmNybDB5oHegdYZzbGRhcDovL2RpcmVjdG9yeS5kLXRydXN0Lm5l +dC9DTj1ELVRSVVNUJTIwQlIlMjBSb290JTIwQ0ElMjAxJTIwMjAyMCxPPUQtVHJ1 +c3QlMjBHbWJILEM9REU/Y2VydGlmaWNhdGVyZXZvY2F0aW9ubGlzdDAKBggqhkjO +PQQDAwNpADBmAjEAlJAtE/rhY/hhY+ithXhUkZy4kzg+GkHaQBZTQgjKL47xPoFW +wKrY7RjEsK70PvomAjEA8yjixtsrmfu3Ubgko6SUeho/5jbiA1czijDLgsfWFBHV +dWNbFJWcHwHP2NVypw87 +-----END CERTIFICATE----- + +# Issuer: CN=D-TRUST EV Root CA 1 2020 O=D-Trust GmbH +# Subject: CN=D-TRUST EV Root CA 1 2020 O=D-Trust GmbH +# Label: "D-TRUST EV Root CA 1 2020" +# Serial: 126288379621884218666039612629459926992 +# MD5 Fingerprint: 8c:2d:9d:70:9f:48:99:11:06:11:fb:e9:cb:30:c0:6e +# SHA1 Fingerprint: 61:db:8c:21:59:69:03:90:d8:7c:9c:12:86:54:cf:9d:3d:f4:dd:07 +# SHA256 Fingerprint: 08:17:0d:1a:a3:64:53:90:1a:2f:95:92:45:e3:47:db:0c:8d:37:ab:aa:bc:56:b8:1a:a1:00:dc:95:89:70:db +-----BEGIN CERTIFICATE----- +MIIC2zCCAmCgAwIBAgIQXwJB13qHfEwDo6yWjfv/0DAKBggqhkjOPQQDAzBIMQsw +CQYDVQQGEwJERTEVMBMGA1UEChMMRC1UcnVzdCBHbWJIMSIwIAYDVQQDExlELVRS +VVNUIEVWIFJvb3QgQ0EgMSAyMDIwMB4XDTIwMDIxMTEwMDAwMFoXDTM1MDIxMTA5 +NTk1OVowSDELMAkGA1UEBhMCREUxFTATBgNVBAoTDEQtVHJ1c3QgR21iSDEiMCAG +A1UEAxMZRC1UUlVTVCBFViBSb290IENBIDEgMjAyMDB2MBAGByqGSM49AgEGBSuB +BAAiA2IABPEL3YZDIBnfl4XoIkqbz52Yv7QFJsnL46bSj8WeeHsxiamJrSc8ZRCC +/N/DnU7wMyPE0jL1HLDfMxddxfCxivnvubcUyilKwg+pf3VlSSowZ/Rk99Yad9rD +wpdhQntJraOCAQ0wggEJMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFH8QARY3 +OqQo5FD4pPfsazK2/umLMA4GA1UdDwEB/wQEAwIBBjCBxgYDVR0fBIG+MIG7MD6g +PKA6hjhodHRwOi8vY3JsLmQtdHJ1c3QubmV0L2NybC9kLXRydXN0X2V2X3Jvb3Rf +Y2FfMV8yMDIwLmNybDB5oHegdYZzbGRhcDovL2RpcmVjdG9yeS5kLXRydXN0Lm5l +dC9DTj1ELVRSVVNUJTIwRVYlMjBSb290JTIwQ0ElMjAxJTIwMjAyMCxPPUQtVHJ1 +c3QlMjBHbWJILEM9REU/Y2VydGlmaWNhdGVyZXZvY2F0aW9ubGlzdDAKBggqhkjO +PQQDAwNpADBmAjEAyjzGKnXCXnViOTYAYFqLwZOZzNnbQTs7h5kXO9XMT8oi96CA +y/m0sRtW9XLS/BnRAjEAkfcwkz8QRitxpNA7RJvAKQIFskF3UfN5Wp6OFKBOQtJb +gfM0agPnIjhQW+0ZT0MW +-----END CERTIFICATE----- + +# Issuer: CN=DigiCert TLS ECC P384 Root G5 O=DigiCert, Inc. +# Subject: CN=DigiCert TLS ECC P384 Root G5 O=DigiCert, Inc. +# Label: "DigiCert TLS ECC P384 Root G5" +# Serial: 13129116028163249804115411775095713523 +# MD5 Fingerprint: d3:71:04:6a:43:1c:db:a6:59:e1:a8:a3:aa:c5:71:ed +# SHA1 Fingerprint: 17:f3:de:5e:9f:0f:19:e9:8e:f6:1f:32:26:6e:20:c4:07:ae:30:ee +# SHA256 Fingerprint: 01:8e:13:f0:77:25:32:cf:80:9b:d1:b1:72:81:86:72:83:fc:48:c6:e1:3b:e9:c6:98:12:85:4a:49:0c:1b:05 +-----BEGIN CERTIFICATE----- +MIICGTCCAZ+gAwIBAgIQCeCTZaz32ci5PhwLBCou8zAKBggqhkjOPQQDAzBOMQsw +CQYDVQQGEwJVUzEXMBUGA1UEChMORGlnaUNlcnQsIEluYy4xJjAkBgNVBAMTHURp +Z2lDZXJ0IFRMUyBFQ0MgUDM4NCBSb290IEc1MB4XDTIxMDExNTAwMDAwMFoXDTQ2 +MDExNDIzNTk1OVowTjELMAkGA1UEBhMCVVMxFzAVBgNVBAoTDkRpZ2lDZXJ0LCBJ +bmMuMSYwJAYDVQQDEx1EaWdpQ2VydCBUTFMgRUNDIFAzODQgUm9vdCBHNTB2MBAG +ByqGSM49AgEGBSuBBAAiA2IABMFEoc8Rl1Ca3iOCNQfN0MsYndLxf3c1TzvdlHJS +7cI7+Oz6e2tYIOyZrsn8aLN1udsJ7MgT9U7GCh1mMEy7H0cKPGEQQil8pQgO4CLp +0zVozptjn4S1mU1YoI71VOeVyaNCMEAwHQYDVR0OBBYEFMFRRVBZqz7nLFr6ICIS +B4CIfBFqMA4GA1UdDwEB/wQEAwIBhjAPBgNVHRMBAf8EBTADAQH/MAoGCCqGSM49 +BAMDA2gAMGUCMQCJao1H5+z8blUD2WdsJk6Dxv3J+ysTvLd6jLRl0mlpYxNjOyZQ +LgGheQaRnUi/wr4CMEfDFXuxoJGZSZOoPHzoRgaLLPIxAJSdYsiJvRmEFOml+wG4 +DXZDjC5Ty3zfDBeWUA== +-----END CERTIFICATE----- + +# Issuer: CN=DigiCert TLS RSA4096 Root G5 O=DigiCert, Inc. +# Subject: CN=DigiCert TLS RSA4096 Root G5 O=DigiCert, Inc. +# Label: "DigiCert TLS RSA4096 Root G5" +# Serial: 11930366277458970227240571539258396554 +# MD5 Fingerprint: ac:fe:f7:34:96:a9:f2:b3:b4:12:4b:e4:27:41:6f:e1 +# SHA1 Fingerprint: a7:88:49:dc:5d:7c:75:8c:8c:de:39:98:56:b3:aa:d0:b2:a5:71:35 +# SHA256 Fingerprint: 37:1a:00:dc:05:33:b3:72:1a:7e:eb:40:e8:41:9e:70:79:9d:2b:0a:0f:2c:1d:80:69:31:65:f7:ce:c4:ad:75 +-----BEGIN CERTIFICATE----- +MIIFZjCCA06gAwIBAgIQCPm0eKj6ftpqMzeJ3nzPijANBgkqhkiG9w0BAQwFADBN +MQswCQYDVQQGEwJVUzEXMBUGA1UEChMORGlnaUNlcnQsIEluYy4xJTAjBgNVBAMT +HERpZ2lDZXJ0IFRMUyBSU0E0MDk2IFJvb3QgRzUwHhcNMjEwMTE1MDAwMDAwWhcN +NDYwMTE0MjM1OTU5WjBNMQswCQYDVQQGEwJVUzEXMBUGA1UEChMORGlnaUNlcnQs +IEluYy4xJTAjBgNVBAMTHERpZ2lDZXJ0IFRMUyBSU0E0MDk2IFJvb3QgRzUwggIi +MA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCz0PTJeRGd/fxmgefM1eS87IE+ +ajWOLrfn3q/5B03PMJ3qCQuZvWxX2hhKuHisOjmopkisLnLlvevxGs3npAOpPxG0 +2C+JFvuUAT27L/gTBaF4HI4o4EXgg/RZG5Wzrn4DReW+wkL+7vI8toUTmDKdFqgp +wgscONyfMXdcvyej/Cestyu9dJsXLfKB2l2w4SMXPohKEiPQ6s+d3gMXsUJKoBZM +pG2T6T867jp8nVid9E6P/DsjyG244gXazOvswzH016cpVIDPRFtMbzCe88zdH5RD +nU1/cHAN1DrRN/BsnZvAFJNY781BOHW8EwOVfH/jXOnVDdXifBBiqmvwPXbzP6Po +sMH976pXTayGpxi0KcEsDr9kvimM2AItzVwv8n/vFfQMFawKsPHTDU9qTXeXAaDx +Zre3zu/O7Oyldcqs4+Fj97ihBMi8ez9dLRYiVu1ISf6nL3kwJZu6ay0/nTvEF+cd +Lvvyz6b84xQslpghjLSR6Rlgg/IwKwZzUNWYOwbpx4oMYIwo+FKbbuH2TbsGJJvX +KyY//SovcfXWJL5/MZ4PbeiPT02jP/816t9JXkGPhvnxd3lLG7SjXi/7RgLQZhNe +XoVPzthwiHvOAbWWl9fNff2C+MIkwcoBOU+NosEUQB+cZtUMCUbW8tDRSHZWOkPL +tgoRObqME2wGtZ7P6wIDAQABo0IwQDAdBgNVHQ4EFgQUUTMc7TZArxfTJc1paPKv +TiM+s0EwDgYDVR0PAQH/BAQDAgGGMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcN +AQEMBQADggIBAGCmr1tfV9qJ20tQqcQjNSH/0GEwhJG3PxDPJY7Jv0Y02cEhJhxw +GXIeo8mH/qlDZJY6yFMECrZBu8RHANmfGBg7sg7zNOok992vIGCukihfNudd5N7H +PNtQOa27PShNlnx2xlv0wdsUpasZYgcYQF+Xkdycx6u1UQ3maVNVzDl92sURVXLF +O4uJ+DQtpBflF+aZfTCIITfNMBc9uPK8qHWgQ9w+iUuQrm0D4ByjoJYJu32jtyoQ +REtGBzRj7TG5BO6jm5qu5jF49OokYTurWGT/u4cnYiWB39yhL/btp/96j1EuMPik +AdKFOV8BmZZvWltwGUb+hmA+rYAQCd05JS9Yf7vSdPD3Rh9GOUrYU9DzLjtxpdRv +/PNn5AeP3SYZ4Y1b+qOTEZvpyDrDVWiakuFSdjjo4bq9+0/V77PnSIMx8IIh47a+ +p6tv75/fTM8BuGJqIz3nCU2AG3swpMPdB380vqQmsvZB6Akd4yCYqjdP//fx4ilw +MUc/dNAUFvohigLVigmUdy7yWSiLfFCSCmZ4OIN1xLVaqBHG5cGdZlXPU8Sv13WF +qUITVuwhd4GTWgzqltlJyqEI8pc7bZsEGCREjnwB8twl2F6GmrE52/WRMmrRpnCK +ovfepEWFJqgejF0pW8hL2JpqA15w8oVPbEtoL8pU9ozaMv7Da4M/OMZ+ +-----END CERTIFICATE----- + +# Issuer: CN=Certainly Root R1 O=Certainly +# Subject: CN=Certainly Root R1 O=Certainly +# Label: "Certainly Root R1" +# Serial: 188833316161142517227353805653483829216 +# MD5 Fingerprint: 07:70:d4:3e:82:87:a0:fa:33:36:13:f4:fa:33:e7:12 +# SHA1 Fingerprint: a0:50:ee:0f:28:71:f4:27:b2:12:6d:6f:50:96:25:ba:cc:86:42:af +# SHA256 Fingerprint: 77:b8:2c:d8:64:4c:43:05:f7:ac:c5:cb:15:6b:45:67:50:04:03:3d:51:c6:0c:62:02:a8:e0:c3:34:67:d3:a0 +-----BEGIN CERTIFICATE----- +MIIFRzCCAy+gAwIBAgIRAI4P+UuQcWhlM1T01EQ5t+AwDQYJKoZIhvcNAQELBQAw +PTELMAkGA1UEBhMCVVMxEjAQBgNVBAoTCUNlcnRhaW5seTEaMBgGA1UEAxMRQ2Vy +dGFpbmx5IFJvb3QgUjEwHhcNMjEwNDAxMDAwMDAwWhcNNDYwNDAxMDAwMDAwWjA9 +MQswCQYDVQQGEwJVUzESMBAGA1UEChMJQ2VydGFpbmx5MRowGAYDVQQDExFDZXJ0 +YWlubHkgUm9vdCBSMTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBANA2 +1B/q3avk0bbm+yLA3RMNansiExyXPGhjZjKcA7WNpIGD2ngwEc/csiu+kr+O5MQT +vqRoTNoCaBZ0vrLdBORrKt03H2As2/X3oXyVtwxwhi7xOu9S98zTm/mLvg7fMbed +aFySpvXl8wo0tf97ouSHocavFwDvA5HtqRxOcT3Si2yJ9HiG5mpJoM610rCrm/b0 +1C7jcvk2xusVtyWMOvwlDbMicyF0yEqWYZL1LwsYpfSt4u5BvQF5+paMjRcCMLT5 +r3gajLQ2EBAHBXDQ9DGQilHFhiZ5shGIXsXwClTNSaa/ApzSRKft43jvRl5tcdF5 +cBxGX1HpyTfcX35pe0HfNEXgO4T0oYoKNp43zGJS4YkNKPl6I7ENPT2a/Z2B7yyQ +wHtETrtJ4A5KVpK8y7XdeReJkd5hiXSSqOMyhb5OhaRLWcsrxXiOcVTQAjeZjOVJ +6uBUcqQRBi8LjMFbvrWhsFNunLhgkR9Za/kt9JQKl7XsxXYDVBtlUrpMklZRNaBA +2CnbrlJ2Oy0wQJuK0EJWtLeIAaSHO1OWzaMWj/Nmqhexx2DgwUMFDO6bW2BvBlyH +Wyf5QBGenDPBt+U1VwV/J84XIIwc/PH72jEpSe31C4SnT8H2TsIonPru4K8H+zMR +eiFPCyEQtkA6qyI6BJyLm4SGcprSp6XEtHWRqSsjAgMBAAGjQjBAMA4GA1UdDwEB +/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBTgqj8ljZ9EXME66C6u +d0yEPmcM9DANBgkqhkiG9w0BAQsFAAOCAgEAuVevuBLaV4OPaAszHQNTVfSVcOQr +PbA56/qJYv331hgELyE03fFo8NWWWt7CgKPBjcZq91l3rhVkz1t5BXdm6ozTaw3d +8VkswTOlMIAVRQdFGjEitpIAq5lNOo93r6kiyi9jyhXWx8bwPWz8HA2YEGGeEaIi +1wrykXprOQ4vMMM2SZ/g6Q8CRFA3lFV96p/2O7qUpUzpvD5RtOjKkjZUbVwlKNrd +rRT90+7iIgXr0PK3aBLXWopBGsaSpVo7Y0VPv+E6dyIvXL9G+VoDhRNCX8reU9di +taY1BMJH/5n9hN9czulegChB8n3nHpDYT3Y+gjwN/KUD+nsa2UUeYNrEjvn8K8l7 +lcUq/6qJ34IxD3L/DCfXCh5WAFAeDJDBlrXYFIW7pw0WwfgHJBu6haEaBQmAupVj +yTrsJZ9/nbqkRxWbRHDxakvWOF5D8xh+UG7pWijmZeZ3Gzr9Hb4DJqPb1OG7fpYn +Kx3upPvaJVQTA945xsMfTZDsjxtK0hzthZU4UHlG1sGQUDGpXJpuHfUzVounmdLy +yCwzk5Iwx06MZTMQZBf9JBeW0Y3COmor6xOLRPIh80oat3df1+2IpHLlOR+Vnb5n +wXARPbv0+Em34yaXOp/SX3z7wJl8OSngex2/DaeP0ik0biQVy96QXr8axGbqwua6 +OV+KmalBWQewLK8= +-----END CERTIFICATE----- + +# Issuer: CN=Certainly Root E1 O=Certainly +# Subject: CN=Certainly Root E1 O=Certainly +# Label: "Certainly Root E1" +# Serial: 8168531406727139161245376702891150584 +# MD5 Fingerprint: 0a:9e:ca:cd:3e:52:50:c6:36:f3:4b:a3:ed:a7:53:e9 +# SHA1 Fingerprint: f9:e1:6d:dc:01:89:cf:d5:82:45:63:3e:c5:37:7d:c2:eb:93:6f:2b +# SHA256 Fingerprint: b4:58:5f:22:e4:ac:75:6a:4e:86:12:a1:36:1c:5d:9d:03:1a:93:fd:84:fe:bb:77:8f:a3:06:8b:0f:c4:2d:c2 +-----BEGIN CERTIFICATE----- +MIIB9zCCAX2gAwIBAgIQBiUzsUcDMydc+Y2aub/M+DAKBggqhkjOPQQDAzA9MQsw +CQYDVQQGEwJVUzESMBAGA1UEChMJQ2VydGFpbmx5MRowGAYDVQQDExFDZXJ0YWlu +bHkgUm9vdCBFMTAeFw0yMTA0MDEwMDAwMDBaFw00NjA0MDEwMDAwMDBaMD0xCzAJ +BgNVBAYTAlVTMRIwEAYDVQQKEwlDZXJ0YWlubHkxGjAYBgNVBAMTEUNlcnRhaW5s +eSBSb290IEUxMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAE3m/4fxzf7flHh4axpMCK ++IKXgOqPyEpeKn2IaKcBYhSRJHpcnqMXfYqGITQYUBsQ3tA3SybHGWCA6TS9YBk2 +QNYphwk8kXr2vBMj3VlOBF7PyAIcGFPBMdjaIOlEjeR2o0IwQDAOBgNVHQ8BAf8E +BAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQU8ygYy2R17ikq6+2uI1g4 +hevIIgcwCgYIKoZIzj0EAwMDaAAwZQIxALGOWiDDshliTd6wT99u0nCK8Z9+aozm +ut6Dacpps6kFtZaSF4fC0urQe87YQVt8rgIwRt7qy12a7DLCZRawTDBcMPPaTnOG +BtjOiQRINzf43TNRnXCve1XYAS59BWQOhriR +-----END CERTIFICATE----- + +# Issuer: CN=Security Communication ECC RootCA1 O=SECOM Trust Systems CO.,LTD. +# Subject: CN=Security Communication ECC RootCA1 O=SECOM Trust Systems CO.,LTD. +# Label: "Security Communication ECC RootCA1" +# Serial: 15446673492073852651 +# MD5 Fingerprint: 7e:43:b0:92:68:ec:05:43:4c:98:ab:5d:35:2e:7e:86 +# SHA1 Fingerprint: b8:0e:26:a9:bf:d2:b2:3b:c0:ef:46:c9:ba:c7:bb:f6:1d:0d:41:41 +# SHA256 Fingerprint: e7:4f:bd:a5:5b:d5:64:c4:73:a3:6b:44:1a:a7:99:c8:a6:8e:07:74:40:e8:28:8b:9f:a1:e5:0e:4b:ba:ca:11 +-----BEGIN CERTIFICATE----- +MIICODCCAb6gAwIBAgIJANZdm7N4gS7rMAoGCCqGSM49BAMDMGExCzAJBgNVBAYT +AkpQMSUwIwYDVQQKExxTRUNPTSBUcnVzdCBTeXN0ZW1zIENPLixMVEQuMSswKQYD +VQQDEyJTZWN1cml0eSBDb21tdW5pY2F0aW9uIEVDQyBSb290Q0ExMB4XDTE2MDYx +NjA1MTUyOFoXDTM4MDExODA1MTUyOFowYTELMAkGA1UEBhMCSlAxJTAjBgNVBAoT +HFNFQ09NIFRydXN0IFN5c3RlbXMgQ08uLExURC4xKzApBgNVBAMTIlNlY3VyaXR5 +IENvbW11bmljYXRpb24gRUNDIFJvb3RDQTEwdjAQBgcqhkjOPQIBBgUrgQQAIgNi +AASkpW9gAwPDvTH00xecK4R1rOX9PVdu12O/5gSJko6BnOPpR27KkBLIE+Cnnfdl +dB9sELLo5OnvbYUymUSxXv3MdhDYW72ixvnWQuRXdtyQwjWpS4g8EkdtXP9JTxpK +ULGjQjBAMB0GA1UdDgQWBBSGHOf+LaVKiwj+KBH6vqNm+GBZLzAOBgNVHQ8BAf8E +BAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAKBggqhkjOPQQDAwNoADBlAjAVXUI9/Lbu +9zuxNuie9sRGKEkz0FhDKmMpzE2xtHqiuQ04pV1IKv3LsnNdo4gIxwwCMQDAqy0O +be0YottT6SXbVQjgUMzfRGEWgqtJsLKB7HOHeLRMsmIbEvoWTSVLY70eN9k= +-----END CERTIFICATE----- + +# Issuer: CN=BJCA Global Root CA1 O=BEIJING CERTIFICATE AUTHORITY +# Subject: CN=BJCA Global Root CA1 O=BEIJING CERTIFICATE AUTHORITY +# Label: "BJCA Global Root CA1" +# Serial: 113562791157148395269083148143378328608 +# MD5 Fingerprint: 42:32:99:76:43:33:36:24:35:07:82:9b:28:f9:d0:90 +# SHA1 Fingerprint: d5:ec:8d:7b:4c:ba:79:f4:e7:e8:cb:9d:6b:ae:77:83:10:03:21:6a +# SHA256 Fingerprint: f3:89:6f:88:fe:7c:0a:88:27:66:a7:fa:6a:d2:74:9f:b5:7a:7f:3e:98:fb:76:9c:1f:a7:b0:9c:2c:44:d5:ae +-----BEGIN CERTIFICATE----- +MIIFdDCCA1ygAwIBAgIQVW9l47TZkGobCdFsPsBsIDANBgkqhkiG9w0BAQsFADBU +MQswCQYDVQQGEwJDTjEmMCQGA1UECgwdQkVJSklORyBDRVJUSUZJQ0FURSBBVVRI +T1JJVFkxHTAbBgNVBAMMFEJKQ0EgR2xvYmFsIFJvb3QgQ0ExMB4XDTE5MTIxOTAz +MTYxN1oXDTQ0MTIxMjAzMTYxN1owVDELMAkGA1UEBhMCQ04xJjAkBgNVBAoMHUJF +SUpJTkcgQ0VSVElGSUNBVEUgQVVUSE9SSVRZMR0wGwYDVQQDDBRCSkNBIEdsb2Jh +bCBSb290IENBMTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAPFmCL3Z +xRVhy4QEQaVpN3cdwbB7+sN3SJATcmTRuHyQNZ0YeYjjlwE8R4HyDqKYDZ4/N+AZ +spDyRhySsTphzvq3Rp4Dhtczbu33RYx2N95ulpH3134rhxfVizXuhJFyV9xgw8O5 +58dnJCNPYwpj9mZ9S1WnP3hkSWkSl+BMDdMJoDIwOvqfwPKcxRIqLhy1BDPapDgR +at7GGPZHOiJBhyL8xIkoVNiMpTAK+BcWyqw3/XmnkRd4OJmtWO2y3syJfQOcs4ll +5+M7sSKGjwZteAf9kRJ/sGsciQ35uMt0WwfCyPQ10WRjeulumijWML3mG90Vr4Tq +nMfK9Q7q8l0ph49pczm+LiRvRSGsxdRpJQaDrXpIhRMsDQa4bHlW/KNnMoH1V6XK +V0Jp6VwkYe/iMBhORJhVb3rCk9gZtt58R4oRTklH2yiUAguUSiz5EtBP6DF+bHq/ +pj+bOT0CFqMYs2esWz8sgytnOYFcuX6U1WTdno9uruh8W7TXakdI136z1C2OVnZO +z2nxbkRs1CTqjSShGL+9V/6pmTW12xB3uD1IutbB5/EjPtffhZ0nPNRAvQoMvfXn +jSXWgXSHRtQpdaJCbPdzied9v3pKH9MiyRVVz99vfFXQpIsHETdfg6YmV6YBW37+ +WGgHqel62bno/1Afq8K0wM7o6v0PvY1NuLxxAgMBAAGjQjBAMB0GA1UdDgQWBBTF +7+3M2I0hxkjk49cULqcWk+WYATAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQE +AwIBBjANBgkqhkiG9w0BAQsFAAOCAgEAUoKsITQfI/Ki2Pm4rzc2IInRNwPWaZ+4 +YRC6ojGYWUfo0Q0lHhVBDOAqVdVXUsv45Mdpox1NcQJeXyFFYEhcCY5JEMEE3Kli +awLwQ8hOnThJdMkycFRtwUf8jrQ2ntScvd0g1lPJGKm1Vrl2i5VnZu69mP6u775u ++2D2/VnGKhs/I0qUJDAnyIm860Qkmss9vk/Ves6OF8tiwdneHg56/0OGNFK8YT88 +X7vZdrRTvJez/opMEi4r89fO4aL/3Xtw+zuhTaRjAv04l5U/BXCga99igUOLtFkN +SoxUnMW7gZ/NfaXvCyUeOiDbHPwfmGcCCtRzRBPbUYQaVQNW4AB+dAb/OMRyHdOo +P2gxXdMJxy6MW2Pg6Nwe0uxhHvLe5e/2mXZgLR6UcnHGCyoyx5JO1UbXHfmpGQrI ++pXObSOYqgs4rZpWDW+N8TEAiMEXnM0ZNjX+VVOg4DwzX5Ze4jLp3zO7Bkqp2IRz +znfSxqxx4VyjHQy7Ct9f4qNx2No3WqB4K/TUfet27fJhcKVlmtOJNBir+3I+17Q9 +eVzYH6Eze9mCUAyTF6ps3MKCuwJXNq+YJyo5UOGwifUll35HaBC07HPKs5fRJNz2 +YqAo07WjuGS3iGJCz51TzZm+ZGiPTx4SSPfSKcOYKMryMguTjClPPGAyzQWWYezy +r/6zcCwupvI= +-----END CERTIFICATE----- + +# Issuer: CN=BJCA Global Root CA2 O=BEIJING CERTIFICATE AUTHORITY +# Subject: CN=BJCA Global Root CA2 O=BEIJING CERTIFICATE AUTHORITY +# Label: "BJCA Global Root CA2" +# Serial: 58605626836079930195615843123109055211 +# MD5 Fingerprint: 5e:0a:f6:47:5f:a6:14:e8:11:01:95:3f:4d:01:eb:3c +# SHA1 Fingerprint: f4:27:86:eb:6e:b8:6d:88:31:67:02:fb:ba:66:a4:53:00:aa:7a:a6 +# SHA256 Fingerprint: 57:4d:f6:93:1e:27:80:39:66:7b:72:0a:fd:c1:60:0f:c2:7e:b6:6d:d3:09:29:79:fb:73:85:64:87:21:28:82 +-----BEGIN CERTIFICATE----- +MIICJTCCAaugAwIBAgIQLBcIfWQqwP6FGFkGz7RK6zAKBggqhkjOPQQDAzBUMQsw +CQYDVQQGEwJDTjEmMCQGA1UECgwdQkVJSklORyBDRVJUSUZJQ0FURSBBVVRIT1JJ +VFkxHTAbBgNVBAMMFEJKQ0EgR2xvYmFsIFJvb3QgQ0EyMB4XDTE5MTIxOTAzMTgy +MVoXDTQ0MTIxMjAzMTgyMVowVDELMAkGA1UEBhMCQ04xJjAkBgNVBAoMHUJFSUpJ +TkcgQ0VSVElGSUNBVEUgQVVUSE9SSVRZMR0wGwYDVQQDDBRCSkNBIEdsb2JhbCBS +b290IENBMjB2MBAGByqGSM49AgEGBSuBBAAiA2IABJ3LgJGNU2e1uVCxA/jlSR9B +IgmwUVJY1is0j8USRhTFiy8shP8sbqjV8QnjAyEUxEM9fMEsxEtqSs3ph+B99iK+ ++kpRuDCK/eHeGBIK9ke35xe/J4rUQUyWPGCWwf0VHKNCMEAwHQYDVR0OBBYEFNJK +sVF/BvDRgh9Obl+rg/xI1LCRMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQD +AgEGMAoGCCqGSM49BAMDA2gAMGUCMBq8W9f+qdJUDkpd0m2xQNz0Q9XSSpkZElaA +94M04TVOSG0ED1cxMDAtsaqdAzjbBgIxAMvMh1PLet8gUXOQwKhbYdDFUDn9hf7B +43j4ptZLvZuHjw/l1lOWqzzIQNph91Oj9w== +-----END CERTIFICATE----- + +# Issuer: CN=Sectigo Public Server Authentication Root E46 O=Sectigo Limited +# Subject: CN=Sectigo Public Server Authentication Root E46 O=Sectigo Limited +# Label: "Sectigo Public Server Authentication Root E46" +# Serial: 88989738453351742415770396670917916916 +# MD5 Fingerprint: 28:23:f8:b2:98:5c:37:16:3b:3e:46:13:4e:b0:b3:01 +# SHA1 Fingerprint: ec:8a:39:6c:40:f0:2e:bc:42:75:d4:9f:ab:1c:1a:5b:67:be:d2:9a +# SHA256 Fingerprint: c9:0f:26:f0:fb:1b:40:18:b2:22:27:51:9b:5c:a2:b5:3e:2c:a5:b3:be:5c:f1:8e:fe:1b:ef:47:38:0c:53:83 +-----BEGIN CERTIFICATE----- +MIICOjCCAcGgAwIBAgIQQvLM2htpN0RfFf51KBC49DAKBggqhkjOPQQDAzBfMQsw +CQYDVQQGEwJHQjEYMBYGA1UEChMPU2VjdGlnbyBMaW1pdGVkMTYwNAYDVQQDEy1T +ZWN0aWdvIFB1YmxpYyBTZXJ2ZXIgQXV0aGVudGljYXRpb24gUm9vdCBFNDYwHhcN +MjEwMzIyMDAwMDAwWhcNNDYwMzIxMjM1OTU5WjBfMQswCQYDVQQGEwJHQjEYMBYG +A1UEChMPU2VjdGlnbyBMaW1pdGVkMTYwNAYDVQQDEy1TZWN0aWdvIFB1YmxpYyBT +ZXJ2ZXIgQXV0aGVudGljYXRpb24gUm9vdCBFNDYwdjAQBgcqhkjOPQIBBgUrgQQA +IgNiAAR2+pmpbiDt+dd34wc7qNs9Xzjoq1WmVk/WSOrsfy2qw7LFeeyZYX8QeccC +WvkEN/U0NSt3zn8gj1KjAIns1aeibVvjS5KToID1AZTc8GgHHs3u/iVStSBDHBv+ +6xnOQ6OjQjBAMB0GA1UdDgQWBBTRItpMWfFLXyY4qp3W7usNw/upYTAOBgNVHQ8B +Af8EBAMCAYYwDwYDVR0TAQH/BAUwAwEB/zAKBggqhkjOPQQDAwNnADBkAjAn7qRa +qCG76UeXlImldCBteU/IvZNeWBj7LRoAasm4PdCkT0RHlAFWovgzJQxC36oCMB3q +4S6ILuH5px0CMk7yn2xVdOOurvulGu7t0vzCAxHrRVxgED1cf5kDW21USAGKcw== +-----END CERTIFICATE----- + +# Issuer: CN=Sectigo Public Server Authentication Root R46 O=Sectigo Limited +# Subject: CN=Sectigo Public Server Authentication Root R46 O=Sectigo Limited +# Label: "Sectigo Public Server Authentication Root R46" +# Serial: 156256931880233212765902055439220583700 +# MD5 Fingerprint: 32:10:09:52:00:d5:7e:6c:43:df:15:c0:b1:16:93:e5 +# SHA1 Fingerprint: ad:98:f9:f3:e4:7d:75:3b:65:d4:82:b3:a4:52:17:bb:6e:f5:e4:38 +# SHA256 Fingerprint: 7b:b6:47:a6:2a:ee:ac:88:bf:25:7a:a5:22:d0:1f:fe:a3:95:e0:ab:45:c7:3f:93:f6:56:54:ec:38:f2:5a:06 +-----BEGIN CERTIFICATE----- +MIIFijCCA3KgAwIBAgIQdY39i658BwD6qSWn4cetFDANBgkqhkiG9w0BAQwFADBf +MQswCQYDVQQGEwJHQjEYMBYGA1UEChMPU2VjdGlnbyBMaW1pdGVkMTYwNAYDVQQD +Ey1TZWN0aWdvIFB1YmxpYyBTZXJ2ZXIgQXV0aGVudGljYXRpb24gUm9vdCBSNDYw +HhcNMjEwMzIyMDAwMDAwWhcNNDYwMzIxMjM1OTU5WjBfMQswCQYDVQQGEwJHQjEY +MBYGA1UEChMPU2VjdGlnbyBMaW1pdGVkMTYwNAYDVQQDEy1TZWN0aWdvIFB1Ymxp +YyBTZXJ2ZXIgQXV0aGVudGljYXRpb24gUm9vdCBSNDYwggIiMA0GCSqGSIb3DQEB +AQUAA4ICDwAwggIKAoICAQCTvtU2UnXYASOgHEdCSe5jtrch/cSV1UgrJnwUUxDa +ef0rty2k1Cz66jLdScK5vQ9IPXtamFSvnl0xdE8H/FAh3aTPaE8bEmNtJZlMKpnz +SDBh+oF8HqcIStw+KxwfGExxqjWMrfhu6DtK2eWUAtaJhBOqbchPM8xQljeSM9xf +iOefVNlI8JhD1mb9nxc4Q8UBUQvX4yMPFF1bFOdLvt30yNoDN9HWOaEhUTCDsG3X +ME6WW5HwcCSrv0WBZEMNvSE6Lzzpng3LILVCJ8zab5vuZDCQOc2TZYEhMbUjUDM3 +IuM47fgxMMxF/mL50V0yeUKH32rMVhlATc6qu/m1dkmU8Sf4kaWD5QazYw6A3OAS +VYCmO2a0OYctyPDQ0RTp5A1NDvZdV3LFOxxHVp3i1fuBYYzMTYCQNFu31xR13NgE +SJ/AwSiItOkcyqex8Va3e0lMWeUgFaiEAin6OJRpmkkGj80feRQXEgyDet4fsZfu ++Zd4KKTIRJLpfSYFplhym3kT2BFfrsU4YjRosoYwjviQYZ4ybPUHNs2iTG7sijbt +8uaZFURww3y8nDnAtOFr94MlI1fZEoDlSfB1D++N6xybVCi0ITz8fAr/73trdf+L +HaAZBav6+CuBQug4urv7qv094PPK306Xlynt8xhW6aWWrL3DkJiy4Pmi1KZHQ3xt +zwIDAQABo0IwQDAdBgNVHQ4EFgQUVnNYZJX5khqwEioEYnmhQBWIIUkwDgYDVR0P +AQH/BAQDAgGGMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEMBQADggIBAC9c +mTz8Bl6MlC5w6tIyMY208FHVvArzZJ8HXtXBc2hkeqK5Duj5XYUtqDdFqij0lgVQ +YKlJfp/imTYpE0RHap1VIDzYm/EDMrraQKFz6oOht0SmDpkBm+S8f74TlH7Kph52 +gDY9hAaLMyZlbcp+nv4fjFg4exqDsQ+8FxG75gbMY/qB8oFM2gsQa6H61SilzwZA +Fv97fRheORKkU55+MkIQpiGRqRxOF3yEvJ+M0ejf5lG5Nkc/kLnHvALcWxxPDkjB +JYOcCj+esQMzEhonrPcibCTRAUH4WAP+JWgiH5paPHxsnnVI84HxZmduTILA7rpX +DhjvLpr3Etiga+kFpaHpaPi8TD8SHkXoUsCjvxInebnMMTzD9joiFgOgyY9mpFui +TdaBJQbpdqQACj7LzTWb4OE4y2BThihCQRxEV+ioratF4yUQvNs+ZUH7G6aXD+u5 +dHn5HrwdVw1Hr8Mvn4dGp+smWg9WY7ViYG4A++MnESLn/pmPNPW56MORcr3Ywx65 +LvKRRFHQV80MNNVIIb/bE/FmJUNS0nAiNs2fxBx1IK1jcmMGDw4nztJqDby1ORrp +0XZ60Vzk50lJLVU3aPAaOpg+VBeHVOmmJ1CJeyAvP/+/oYtKR5j/K3tJPsMpRmAY +QqszKbrAKbkTidOIijlBO8n9pu0f9GBj39ItVQGL +-----END CERTIFICATE----- + +# Issuer: CN=SSL.com TLS RSA Root CA 2022 O=SSL Corporation +# Subject: CN=SSL.com TLS RSA Root CA 2022 O=SSL Corporation +# Label: "SSL.com TLS RSA Root CA 2022" +# Serial: 148535279242832292258835760425842727825 +# MD5 Fingerprint: d8:4e:c6:59:30:d8:fe:a0:d6:7a:5a:2c:2c:69:78:da +# SHA1 Fingerprint: ec:2c:83:40:72:af:26:95:10:ff:0e:f2:03:ee:31:70:f6:78:9d:ca +# SHA256 Fingerprint: 8f:af:7d:2e:2c:b4:70:9b:b8:e0:b3:36:66:bf:75:a5:dd:45:b5:de:48:0f:8e:a8:d4:bf:e6:be:bc:17:f2:ed +-----BEGIN CERTIFICATE----- +MIIFiTCCA3GgAwIBAgIQb77arXO9CEDii02+1PdbkTANBgkqhkiG9w0BAQsFADBO +MQswCQYDVQQGEwJVUzEYMBYGA1UECgwPU1NMIENvcnBvcmF0aW9uMSUwIwYDVQQD +DBxTU0wuY29tIFRMUyBSU0EgUm9vdCBDQSAyMDIyMB4XDTIyMDgyNTE2MzQyMloX +DTQ2MDgxOTE2MzQyMVowTjELMAkGA1UEBhMCVVMxGDAWBgNVBAoMD1NTTCBDb3Jw +b3JhdGlvbjElMCMGA1UEAwwcU1NMLmNvbSBUTFMgUlNBIFJvb3QgQ0EgMjAyMjCC +AiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBANCkCXJPQIgSYT41I57u9nTP +L3tYPc48DRAokC+X94xI2KDYJbFMsBFMF3NQ0CJKY7uB0ylu1bUJPiYYf7ISf5OY +t6/wNr/y7hienDtSxUcZXXTzZGbVXcdotL8bHAajvI9AI7YexoS9UcQbOcGV0ins +S657Lb85/bRi3pZ7QcacoOAGcvvwB5cJOYF0r/c0WRFXCsJbwST0MXMwgsadugL3 +PnxEX4MN8/HdIGkWCVDi1FW24IBydm5MR7d1VVm0U3TZlMZBrViKMWYPHqIbKUBO +L9975hYsLfy/7PO0+r4Y9ptJ1O4Fbtk085zx7AGL0SDGD6C1vBdOSHtRwvzpXGk3 +R2azaPgVKPC506QVzFpPulJwoxJF3ca6TvvC0PeoUidtbnm1jPx7jMEWTO6Af77w +dr5BUxIzrlo4QqvXDz5BjXYHMtWrifZOZ9mxQnUjbvPNQrL8VfVThxc7wDNY8VLS ++YCk8OjwO4s4zKTGkH8PnP2L0aPP2oOnaclQNtVcBdIKQXTbYxE3waWglksejBYS +d66UNHsef8JmAOSqg+qKkK3ONkRN0VHpvB/zagX9wHQfJRlAUW7qglFA35u5CCoG +AtUjHBPW6dvbxrB6y3snm/vg1UYk7RBLY0ulBY+6uB0rpvqR4pJSvezrZ5dtmi2f +gTIFZzL7SAg/2SW4BCUvAgMBAAGjYzBhMA8GA1UdEwEB/wQFMAMBAf8wHwYDVR0j +BBgwFoAU+y437uOEeicuzRk1sTN8/9REQrkwHQYDVR0OBBYEFPsuN+7jhHonLs0Z +NbEzfP/UREK5MA4GA1UdDwEB/wQEAwIBhjANBgkqhkiG9w0BAQsFAAOCAgEAjYlt +hEUY8U+zoO9opMAdrDC8Z2awms22qyIZZtM7QbUQnRC6cm4pJCAcAZli05bg4vsM +QtfhWsSWTVTNj8pDU/0quOr4ZcoBwq1gaAafORpR2eCNJvkLTqVTJXojpBzOCBvf +R4iyrT7gJ4eLSYwfqUdYe5byiB0YrrPRpgqU+tvT5TgKa3kSM/tKWTcWQA673vWJ +DPFs0/dRa1419dvAJuoSc06pkZCmF8NsLzjUo3KUQyxi4U5cMj29TH0ZR6LDSeeW +P4+a0zvkEdiLA9z2tmBVGKaBUfPhqBVq6+AL8BQx1rmMRTqoENjwuSfr98t67wVy +lrXEj5ZzxOhWc5y8aVFjvO9nHEMaX3cZHxj4HCUp+UmZKbaSPaKDN7EgkaibMOlq +bLQjk2UEqxHzDh1TJElTHaE/nUiSEeJ9DU/1172iWD54nR4fK/4huxoTtrEoZP2w +AgDHbICivRZQIA9ygV/MlP+7mea6kMvq+cYMwq7FGc4zoWtcu358NFcXrfA/rs3q +r5nsLFR+jM4uElZI7xc7P0peYNLcdDa8pUNjyw9bowJWCZ4kLOGGgYz+qxcs+sji +Mho6/4UIyYOf8kpIEFR3N+2ivEC+5BB09+Rbu7nzifmPQdjH5FCQNYA+HLhNkNPU +98OwoX6EyneSMSy4kLGCenROmxMmtNVQZlR4rmA= +-----END CERTIFICATE----- + +# Issuer: CN=SSL.com TLS ECC Root CA 2022 O=SSL Corporation +# Subject: CN=SSL.com TLS ECC Root CA 2022 O=SSL Corporation +# Label: "SSL.com TLS ECC Root CA 2022" +# Serial: 26605119622390491762507526719404364228 +# MD5 Fingerprint: 99:d7:5c:f1:51:36:cc:e9:ce:d9:19:2e:77:71:56:c5 +# SHA1 Fingerprint: 9f:5f:d9:1a:54:6d:f5:0c:71:f0:ee:7a:bd:17:49:98:84:73:e2:39 +# SHA256 Fingerprint: c3:2f:fd:9f:46:f9:36:d1:6c:36:73:99:09:59:43:4b:9a:d6:0a:af:bb:9e:7c:f3:36:54:f1:44:cc:1b:a1:43 +-----BEGIN CERTIFICATE----- +MIICOjCCAcCgAwIBAgIQFAP1q/s3ixdAW+JDsqXRxDAKBggqhkjOPQQDAzBOMQsw +CQYDVQQGEwJVUzEYMBYGA1UECgwPU1NMIENvcnBvcmF0aW9uMSUwIwYDVQQDDBxT +U0wuY29tIFRMUyBFQ0MgUm9vdCBDQSAyMDIyMB4XDTIyMDgyNTE2MzM0OFoXDTQ2 +MDgxOTE2MzM0N1owTjELMAkGA1UEBhMCVVMxGDAWBgNVBAoMD1NTTCBDb3Jwb3Jh +dGlvbjElMCMGA1UEAwwcU1NMLmNvbSBUTFMgRUNDIFJvb3QgQ0EgMjAyMjB2MBAG +ByqGSM49AgEGBSuBBAAiA2IABEUpNXP6wrgjzhR9qLFNoFs27iosU8NgCTWyJGYm +acCzldZdkkAZDsalE3D07xJRKF3nzL35PIXBz5SQySvOkkJYWWf9lCcQZIxPBLFN +SeR7T5v15wj4A4j3p8OSSxlUgaNjMGEwDwYDVR0TAQH/BAUwAwEB/zAfBgNVHSME +GDAWgBSJjy+j6CugFFR781a4Jl9nOAuc0DAdBgNVHQ4EFgQUiY8vo+groBRUe/NW +uCZfZzgLnNAwDgYDVR0PAQH/BAQDAgGGMAoGCCqGSM49BAMDA2gAMGUCMFXjIlbp +15IkWE8elDIPDAI2wv2sdDJO4fscgIijzPvX6yv/N33w7deedWo1dlJF4AIxAMeN +b0Igj762TVntd00pxCAgRWSGOlDGxK0tk/UYfXLtqc/ErFc2KAhl3zx5Zn6g6g== +-----END CERTIFICATE----- + +# Issuer: CN=Atos TrustedRoot Root CA ECC TLS 2021 O=Atos +# Subject: CN=Atos TrustedRoot Root CA ECC TLS 2021 O=Atos +# Label: "Atos TrustedRoot Root CA ECC TLS 2021" +# Serial: 81873346711060652204712539181482831616 +# MD5 Fingerprint: 16:9f:ad:f1:70:ad:79:d6:ed:29:b4:d1:c5:79:70:a8 +# SHA1 Fingerprint: 9e:bc:75:10:42:b3:02:f3:81:f4:f7:30:62:d4:8f:c3:a7:51:b2:dd +# SHA256 Fingerprint: b2:fa:e5:3e:14:cc:d7:ab:92:12:06:47:01:ae:27:9c:1d:89:88:fa:cb:77:5f:a8:a0:08:91:4e:66:39:88:a8 +-----BEGIN CERTIFICATE----- +MIICFTCCAZugAwIBAgIQPZg7pmY9kGP3fiZXOATvADAKBggqhkjOPQQDAzBMMS4w +LAYDVQQDDCVBdG9zIFRydXN0ZWRSb290IFJvb3QgQ0EgRUNDIFRMUyAyMDIxMQ0w +CwYDVQQKDARBdG9zMQswCQYDVQQGEwJERTAeFw0yMTA0MjIwOTI2MjNaFw00MTA0 +MTcwOTI2MjJaMEwxLjAsBgNVBAMMJUF0b3MgVHJ1c3RlZFJvb3QgUm9vdCBDQSBF +Q0MgVExTIDIwMjExDTALBgNVBAoMBEF0b3MxCzAJBgNVBAYTAkRFMHYwEAYHKoZI +zj0CAQYFK4EEACIDYgAEloZYKDcKZ9Cg3iQZGeHkBQcfl+3oZIK59sRxUM6KDP/X +tXa7oWyTbIOiaG6l2b4siJVBzV3dscqDY4PMwL502eCdpO5KTlbgmClBk1IQ1SQ4 +AjJn8ZQSb+/Xxd4u/RmAo0IwQDAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBR2 +KCXWfeBmmnoJsmo7jjPXNtNPojAOBgNVHQ8BAf8EBAMCAYYwCgYIKoZIzj0EAwMD +aAAwZQIwW5kp85wxtolrbNa9d+F851F+uDrNozZffPc8dz7kUK2o59JZDCaOMDtu +CCrCp1rIAjEAmeMM56PDr9NJLkaCI2ZdyQAUEv049OGYa3cpetskz2VAv9LcjBHo +9H1/IISpQuQo +-----END CERTIFICATE----- + +# Issuer: CN=Atos TrustedRoot Root CA RSA TLS 2021 O=Atos +# Subject: CN=Atos TrustedRoot Root CA RSA TLS 2021 O=Atos +# Label: "Atos TrustedRoot Root CA RSA TLS 2021" +# Serial: 111436099570196163832749341232207667876 +# MD5 Fingerprint: d4:d3:46:b8:9a:c0:9c:76:5d:9e:3a:c3:b9:99:31:d2 +# SHA1 Fingerprint: 18:52:3b:0d:06:37:e4:d6:3a:df:23:e4:98:fb:5b:16:fb:86:74:48 +# SHA256 Fingerprint: 81:a9:08:8e:a5:9f:b3:64:c5:48:a6:f8:55:59:09:9b:6f:04:05:ef:bf:18:e5:32:4e:c9:f4:57:ba:00:11:2f +-----BEGIN CERTIFICATE----- +MIIFZDCCA0ygAwIBAgIQU9XP5hmTC/srBRLYwiqipDANBgkqhkiG9w0BAQwFADBM +MS4wLAYDVQQDDCVBdG9zIFRydXN0ZWRSb290IFJvb3QgQ0EgUlNBIFRMUyAyMDIx +MQ0wCwYDVQQKDARBdG9zMQswCQYDVQQGEwJERTAeFw0yMTA0MjIwOTIxMTBaFw00 +MTA0MTcwOTIxMDlaMEwxLjAsBgNVBAMMJUF0b3MgVHJ1c3RlZFJvb3QgUm9vdCBD +QSBSU0EgVExTIDIwMjExDTALBgNVBAoMBEF0b3MxCzAJBgNVBAYTAkRFMIICIjAN +BgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAtoAOxHm9BYx9sKOdTSJNy/BBl01Z +4NH+VoyX8te9j2y3I49f1cTYQcvyAh5x5en2XssIKl4w8i1mx4QbZFc4nXUtVsYv +Ye+W/CBGvevUez8/fEc4BKkbqlLfEzfTFRVOvV98r61jx3ncCHvVoOX3W3WsgFWZ +kmGbzSoXfduP9LVq6hdKZChmFSlsAvFr1bqjM9xaZ6cF4r9lthawEO3NUDPJcFDs +GY6wx/J0W2tExn2WuZgIWWbeKQGb9Cpt0xU6kGpn8bRrZtkh68rZYnxGEFzedUln +nkL5/nWpo63/dgpnQOPF943HhZpZnmKaau1Fh5hnstVKPNe0OwANwI8f4UDErmwh +3El+fsqyjW22v5MvoVw+j8rtgI5Y4dtXz4U2OLJxpAmMkokIiEjxQGMYsluMWuPD +0xeqqxmjLBvk1cbiZnrXghmmOxYsL3GHX0WelXOTwkKBIROW1527k2gV+p2kHYzy +geBYBr3JtuP2iV2J+axEoctr+hbxx1A9JNr3w+SH1VbxT5Aw+kUJWdo0zuATHAR8 +ANSbhqRAvNncTFd+rrcztl524WWLZt+NyteYr842mIycg5kDcPOvdO3GDjbnvezB +c6eUWsuSZIKmAMFwoW4sKeFYV+xafJlrJaSQOoD0IJ2azsct+bJLKZWD6TWNp0lI +pw9MGZHQ9b8Q4HECAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQU +dEmZ0f+0emhFdcN+tNzMzjkz2ggwDgYDVR0PAQH/BAQDAgGGMA0GCSqGSIb3DQEB +DAUAA4ICAQAjQ1MkYlxt/T7Cz1UAbMVWiLkO3TriJQ2VSpfKgInuKs1l+NsW4AmS +4BjHeJi78+xCUvuppILXTdiK/ORO/auQxDh1MoSf/7OwKwIzNsAQkG8dnK/haZPs +o0UvFJ/1TCplQ3IM98P4lYsU84UgYt1UU90s3BiVaU+DR3BAM1h3Egyi61IxHkzJ +qM7F78PRreBrAwA0JrRUITWXAdxfG/F851X6LWh3e9NpzNMOa7pNdkTWwhWaJuyw +xfW70Xp0wmzNxbVe9kzmWy2B27O3Opee7c9GslA9hGCZcbUztVdF5kJHdWoOsAgM +rr3e97sPWD2PAzHoPYJQyi9eDF20l74gNAf0xBLh7tew2VktafcxBPTy+av5EzH4 +AXcOPUIjJsyacmdRIXrMPIWo6iFqO9taPKU0nprALN+AnCng33eU0aKAQv9qTFsR +0PXNor6uzFFcw9VUewyu1rkGd4Di7wcaaMxZUa1+XGdrudviB0JbuAEFWDlN5LuY +o7Ey7Nmj1m+UI/87tyll5gfp77YZ6ufCOB0yiJA8EytuzO+rdwY0d4RPcuSBhPm5 +dDTedk+SKlOxJTnbPP/lPqYO5Wue/9vsL3SD3460s6neFE3/MaNFcyT6lSnMEpcE +oji2jbDwN/zIIX8/syQbPYtuzE2wFg2WHYMfRsCbvUOZ58SWLs5fyQ== +-----END CERTIFICATE----- + +# Issuer: CN=TrustAsia Global Root CA G3 O=TrustAsia Technologies, Inc. +# Subject: CN=TrustAsia Global Root CA G3 O=TrustAsia Technologies, Inc. +# Label: "TrustAsia Global Root CA G3" +# Serial: 576386314500428537169965010905813481816650257167 +# MD5 Fingerprint: 30:42:1b:b7:bb:81:75:35:e4:16:4f:53:d2:94:de:04 +# SHA1 Fingerprint: 63:cf:b6:c1:27:2b:56:e4:88:8e:1c:23:9a:b6:2e:81:47:24:c3:c7 +# SHA256 Fingerprint: e0:d3:22:6a:eb:11:63:c2:e4:8f:f9:be:3b:50:b4:c6:43:1b:e7:bb:1e:ac:c5:c3:6b:5d:5e:c5:09:03:9a:08 +-----BEGIN CERTIFICATE----- +MIIFpTCCA42gAwIBAgIUZPYOZXdhaqs7tOqFhLuxibhxkw8wDQYJKoZIhvcNAQEM +BQAwWjELMAkGA1UEBhMCQ04xJTAjBgNVBAoMHFRydXN0QXNpYSBUZWNobm9sb2dp +ZXMsIEluYy4xJDAiBgNVBAMMG1RydXN0QXNpYSBHbG9iYWwgUm9vdCBDQSBHMzAe +Fw0yMTA1MjAwMjEwMTlaFw00NjA1MTkwMjEwMTlaMFoxCzAJBgNVBAYTAkNOMSUw +IwYDVQQKDBxUcnVzdEFzaWEgVGVjaG5vbG9naWVzLCBJbmMuMSQwIgYDVQQDDBtU +cnVzdEFzaWEgR2xvYmFsIFJvb3QgQ0EgRzMwggIiMA0GCSqGSIb3DQEBAQUAA4IC +DwAwggIKAoICAQDAMYJhkuSUGwoqZdC+BqmHO1ES6nBBruL7dOoKjbmzTNyPtxNS +T1QY4SxzlZHFZjtqz6xjbYdT8PfxObegQ2OwxANdV6nnRM7EoYNl9lA+sX4WuDqK +AtCWHwDNBSHvBm3dIZwZQ0WhxeiAysKtQGIXBsaqvPPW5vxQfmZCHzyLpnl5hkA1 +nyDvP+uLRx+PjsXUjrYsyUQE49RDdT/VP68czH5GX6zfZBCK70bwkPAPLfSIC7Ep +qq+FqklYqL9joDiR5rPmd2jE+SoZhLsO4fWvieylL1AgdB4SQXMeJNnKziyhWTXA +yB1GJ2Faj/lN03J5Zh6fFZAhLf3ti1ZwA0pJPn9pMRJpxx5cynoTi+jm9WAPzJMs +hH/x/Gr8m0ed262IPfN2dTPXS6TIi/n1Q1hPy8gDVI+lhXgEGvNz8teHHUGf59gX +zhqcD0r83ERoVGjiQTz+LISGNzzNPy+i2+f3VANfWdP3kXjHi3dqFuVJhZBFcnAv +kV34PmVACxmZySYgWmjBNb9Pp1Hx2BErW+Canig7CjoKH8GB5S7wprlppYiU5msT +f9FkPz2ccEblooV7WIQn3MSAPmeamseaMQ4w7OYXQJXZRe0Blqq/DPNL0WP3E1jA +uPP6Z92bfW1K/zJMtSU7/xxnD4UiWQWRkUF3gdCFTIcQcf+eQxuulXUtgQIDAQAB +o2MwYTAPBgNVHRMBAf8EBTADAQH/MB8GA1UdIwQYMBaAFEDk5PIj7zjKsK5Xf/Ih +MBY027ySMB0GA1UdDgQWBBRA5OTyI+84yrCuV3/yITAWNNu8kjAOBgNVHQ8BAf8E +BAMCAQYwDQYJKoZIhvcNAQEMBQADggIBACY7UeFNOPMyGLS0XuFlXsSUT9SnYaP4 +wM8zAQLpw6o1D/GUE3d3NZ4tVlFEbuHGLige/9rsR82XRBf34EzC4Xx8MnpmyFq2 +XFNFV1pF1AWZLy4jVe5jaN/TG3inEpQGAHUNcoTpLrxaatXeL1nHo+zSh2bbt1S1 +JKv0Q3jbSwTEb93mPmY+KfJLaHEih6D4sTNjduMNhXJEIlU/HHzp/LgV6FL6qj6j +ITk1dImmasI5+njPtqzn59ZW/yOSLlALqbUHM/Q4X6RJpstlcHboCoWASzY9M/eV +VHUl2qzEc4Jl6VL1XP04lQJqaTDFHApXB64ipCz5xUG3uOyfT0gA+QEEVcys+TIx +xHWVBqB/0Y0n3bOppHKH/lmLmnp0Ft0WpWIp6zqW3IunaFnT63eROfjXy9mPX1on +AX1daBli2MjN9LdyR75bl87yraKZk62Uy5P2EgmVtqvXO9A/EcswFi55gORngS1d +7XB4tmBZrOFdRWOPyN9yaFvqHbgB8X7754qz41SgOAngPN5C8sLtLpvzHzW2Ntjj +gKGLzZlkD8Kqq7HK9W+eQ42EVJmzbsASZthwEPEGNTNDqJwuuhQxzhB/HIbjj9LV ++Hfsm6vxL2PZQl/gZ4FkkfGXL/xuJvYz+NO1+MRiqzFRJQJ6+N1rZdVtTTDIZbpo +FGWsJwt0ivKH +-----END CERTIFICATE----- + +# Issuer: CN=TrustAsia Global Root CA G4 O=TrustAsia Technologies, Inc. +# Subject: CN=TrustAsia Global Root CA G4 O=TrustAsia Technologies, Inc. +# Label: "TrustAsia Global Root CA G4" +# Serial: 451799571007117016466790293371524403291602933463 +# MD5 Fingerprint: 54:dd:b2:d7:5f:d8:3e:ed:7c:e0:0b:2e:cc:ed:eb:eb +# SHA1 Fingerprint: 57:73:a5:61:5d:80:b2:e6:ac:38:82:fc:68:07:31:ac:9f:b5:92:5a +# SHA256 Fingerprint: be:4b:56:cb:50:56:c0:13:6a:52:6d:f4:44:50:8d:aa:36:a0:b5:4f:42:e4:ac:38:f7:2a:f4:70:e4:79:65:4c +-----BEGIN CERTIFICATE----- +MIICVTCCAdygAwIBAgIUTyNkuI6XY57GU4HBdk7LKnQV1tcwCgYIKoZIzj0EAwMw +WjELMAkGA1UEBhMCQ04xJTAjBgNVBAoMHFRydXN0QXNpYSBUZWNobm9sb2dpZXMs +IEluYy4xJDAiBgNVBAMMG1RydXN0QXNpYSBHbG9iYWwgUm9vdCBDQSBHNDAeFw0y +MTA1MjAwMjEwMjJaFw00NjA1MTkwMjEwMjJaMFoxCzAJBgNVBAYTAkNOMSUwIwYD +VQQKDBxUcnVzdEFzaWEgVGVjaG5vbG9naWVzLCBJbmMuMSQwIgYDVQQDDBtUcnVz +dEFzaWEgR2xvYmFsIFJvb3QgQ0EgRzQwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAATx +s8045CVD5d4ZCbuBeaIVXxVjAd7Cq92zphtnS4CDr5nLrBfbK5bKfFJV4hrhPVbw +LxYI+hW8m7tH5j/uqOFMjPXTNvk4XatwmkcN4oFBButJ+bAp3TPsUKV/eSm4IJij +YzBhMA8GA1UdEwEB/wQFMAMBAf8wHwYDVR0jBBgwFoAUpbtKl86zK3+kMd6Xg1mD +pm9xy94wHQYDVR0OBBYEFKW7SpfOsyt/pDHel4NZg6ZvccveMA4GA1UdDwEB/wQE +AwIBBjAKBggqhkjOPQQDAwNnADBkAjBe8usGzEkxn0AAbbd+NvBNEU/zy4k6LHiR +UKNbwMp1JvK/kF0LgoxgKJ/GcJpo5PECMFxYDlZ2z1jD1xCMuo6u47xkdUfFVZDj +/bpV6wfEU6s3qe4hsiFbYI89MvHVI5TWWA== +-----END CERTIFICATE----- + +# Issuer: CN=Telekom Security TLS ECC Root 2020 O=Deutsche Telekom Security GmbH +# Subject: CN=Telekom Security TLS ECC Root 2020 O=Deutsche Telekom Security GmbH +# Label: "Telekom Security TLS ECC Root 2020" +# Serial: 72082518505882327255703894282316633856 +# MD5 Fingerprint: c1:ab:fe:6a:10:2c:03:8d:bc:1c:22:32:c0:85:a7:fd +# SHA1 Fingerprint: c0:f8:96:c5:a9:3b:01:06:21:07:da:18:42:48:bc:e9:9d:88:d5:ec +# SHA256 Fingerprint: 57:8a:f4:de:d0:85:3f:4e:59:98:db:4a:ea:f9:cb:ea:8d:94:5f:60:b6:20:a3:8d:1a:3c:13:b2:bc:7b:a8:e1 +-----BEGIN CERTIFICATE----- +MIICQjCCAcmgAwIBAgIQNjqWjMlcsljN0AFdxeVXADAKBggqhkjOPQQDAzBjMQsw +CQYDVQQGEwJERTEnMCUGA1UECgweRGV1dHNjaGUgVGVsZWtvbSBTZWN1cml0eSBH +bWJIMSswKQYDVQQDDCJUZWxla29tIFNlY3VyaXR5IFRMUyBFQ0MgUm9vdCAyMDIw +MB4XDTIwMDgyNTA3NDgyMFoXDTQ1MDgyNTIzNTk1OVowYzELMAkGA1UEBhMCREUx +JzAlBgNVBAoMHkRldXRzY2hlIFRlbGVrb20gU2VjdXJpdHkgR21iSDErMCkGA1UE +AwwiVGVsZWtvbSBTZWN1cml0eSBUTFMgRUNDIFJvb3QgMjAyMDB2MBAGByqGSM49 +AgEGBSuBBAAiA2IABM6//leov9Wq9xCazbzREaK9Z0LMkOsVGJDZos0MKiXrPk/O +tdKPD/M12kOLAoC+b1EkHQ9rK8qfwm9QMuU3ILYg/4gND21Ju9sGpIeQkpT0CdDP +f8iAC8GXs7s1J8nCG6NCMEAwHQYDVR0OBBYEFONyzG6VmUex5rNhTNHLq+O6zd6f +MA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMAoGCCqGSM49BAMDA2cA +MGQCMHVSi7ekEE+uShCLsoRbQuHmKjYC2qBuGT8lv9pZMo7k+5Dck2TOrbRBR2Di +z6fLHgIwN0GMZt9Ba9aDAEH9L1r3ULRn0SyocddDypwnJJGDSA3PzfdUga/sf+Rn +27iQ7t0l +-----END CERTIFICATE----- + +# Issuer: CN=Telekom Security TLS RSA Root 2023 O=Deutsche Telekom Security GmbH +# Subject: CN=Telekom Security TLS RSA Root 2023 O=Deutsche Telekom Security GmbH +# Label: "Telekom Security TLS RSA Root 2023" +# Serial: 44676229530606711399881795178081572759 +# MD5 Fingerprint: bf:5b:eb:54:40:cd:48:71:c4:20:8d:7d:de:0a:42:f2 +# SHA1 Fingerprint: 54:d3:ac:b3:bd:57:56:f6:85:9d:ce:e5:c3:21:e2:d4:ad:83:d0:93 +# SHA256 Fingerprint: ef:c6:5c:ad:bb:59:ad:b6:ef:e8:4d:a2:23:11:b3:56:24:b7:1b:3b:1e:a0:da:8b:66:55:17:4e:c8:97:86:46 +-----BEGIN CERTIFICATE----- +MIIFszCCA5ugAwIBAgIQIZxULej27HF3+k7ow3BXlzANBgkqhkiG9w0BAQwFADBj +MQswCQYDVQQGEwJERTEnMCUGA1UECgweRGV1dHNjaGUgVGVsZWtvbSBTZWN1cml0 +eSBHbWJIMSswKQYDVQQDDCJUZWxla29tIFNlY3VyaXR5IFRMUyBSU0EgUm9vdCAy +MDIzMB4XDTIzMDMyODEyMTY0NVoXDTQ4MDMyNzIzNTk1OVowYzELMAkGA1UEBhMC +REUxJzAlBgNVBAoMHkRldXRzY2hlIFRlbGVrb20gU2VjdXJpdHkgR21iSDErMCkG +A1UEAwwiVGVsZWtvbSBTZWN1cml0eSBUTFMgUlNBIFJvb3QgMjAyMzCCAiIwDQYJ +KoZIhvcNAQEBBQADggIPADCCAgoCggIBAO01oYGA88tKaVvC+1GDrib94W7zgRJ9 +cUD/h3VCKSHtgVIs3xLBGYSJwb3FKNXVS2xE1kzbB5ZKVXrKNoIENqil/Cf2SfHV +cp6R+SPWcHu79ZvB7JPPGeplfohwoHP89v+1VmLhc2o0mD6CuKyVU/QBoCcHcqMA +U6DksquDOFczJZSfvkgdmOGjup5czQRxUX11eKvzWarE4GC+j4NSuHUaQTXtvPM6 +Y+mpFEXX5lLRbtLevOP1Czvm4MS9Q2QTps70mDdsipWol8hHD/BeEIvnHRz+sTug +BTNoBUGCwQMrAcjnj02r6LX2zWtEtefdi+zqJbQAIldNsLGyMcEWzv/9FIS3R/qy +8XDe24tsNlikfLMR0cN3f1+2JeANxdKz+bi4d9s3cXFH42AYTyS2dTd4uaNir73J +co4vzLuu2+QVUhkHM/tqty1LkCiCc/4YizWN26cEar7qwU02OxY2kTLvtkCJkUPg +8qKrBC7m8kwOFjQgrIfBLX7JZkcXFBGk8/ehJImr2BrIoVyxo/eMbcgByU/J7MT8 +rFEz0ciD0cmfHdRHNCk+y7AO+oMLKFjlKdw/fKifybYKu6boRhYPluV75Gp6SG12 +mAWl3G0eQh5C2hrgUve1g8Aae3g1LDj1H/1Joy7SWWO/gLCMk3PLNaaZlSJhZQNg ++y+TS/qanIA7AgMBAAGjYzBhMA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUtqeX +gj10hZv3PJ+TmpV5dVKMbUcwDwYDVR0TAQH/BAUwAwEB/zAfBgNVHSMEGDAWgBS2 +p5eCPXSFm/c8n5OalXl1UoxtRzANBgkqhkiG9w0BAQwFAAOCAgEAqMxhpr51nhVQ +pGv7qHBFfLp+sVr8WyP6Cnf4mHGCDG3gXkaqk/QeoMPhk9tLrbKmXauw1GLLXrtm +9S3ul0A8Yute1hTWjOKWi0FpkzXmuZlrYrShF2Y0pmtjxrlO8iLpWA1WQdH6DErw +M807u20hOq6OcrXDSvvpfeWxm4bu4uB9tPcy/SKE8YXJN3nptT+/XOR0so8RYgDd +GGah2XsjX/GO1WfoVNpbOms2b/mBsTNHM3dA+VKq3dSDz4V4mZqTuXNnQkYRIer+ +CqkbGmVps4+uFrb2S1ayLfmlyOw7YqPta9BO1UAJpB+Y1zqlklkg5LB9zVtzaL1t +xKITDmcZuI1CfmwMmm6gJC3VRRvcxAIU/oVbZZfKTpBQCHpCNfnqwmbU+AGuHrS+ +w6jv/naaoqYfRvaE7fzbzsQCzndILIyy7MMAo+wsVRjBfhnu4S/yrYObnqsZ38aK +L4x35bcF7DvB7L6Gs4a8wPfc5+pbrrLMtTWGS9DiP7bY+A4A7l3j941Y/8+LN+lj +X273CXE2whJdV/LItM3z7gLfEdxquVeEHVlNjM7IDiPCtyaaEBRx/pOyiriA8A4Q +ntOoUAw3gi/q4Iqd4Sw5/7W0cwDk90imc6y/st53BIe0o82bNSQ3+pCTE4FCxpgm +dTdmQRCsu/WU48IxK63nI1bMNSWSs1A= +-----END CERTIFICATE----- + +# Issuer: CN=FIRMAPROFESIONAL CA ROOT-A WEB O=Firmaprofesional SA +# Subject: CN=FIRMAPROFESIONAL CA ROOT-A WEB O=Firmaprofesional SA +# Label: "FIRMAPROFESIONAL CA ROOT-A WEB" +# Serial: 65916896770016886708751106294915943533 +# MD5 Fingerprint: 82:b2:ad:45:00:82:b0:66:63:f8:5f:c3:67:4e:ce:a3 +# SHA1 Fingerprint: a8:31:11:74:a6:14:15:0d:ca:77:dd:0e:e4:0c:5d:58:fc:a0:72:a5 +# SHA256 Fingerprint: be:f2:56:da:f2:6e:9c:69:bd:ec:16:02:35:97:98:f3:ca:f7:18:21:a0:3e:01:82:57:c5:3c:65:61:7f:3d:4a +-----BEGIN CERTIFICATE----- +MIICejCCAgCgAwIBAgIQMZch7a+JQn81QYehZ1ZMbTAKBggqhkjOPQQDAzBuMQsw +CQYDVQQGEwJFUzEcMBoGA1UECgwTRmlybWFwcm9mZXNpb25hbCBTQTEYMBYGA1UE +YQwPVkFURVMtQTYyNjM0MDY4MScwJQYDVQQDDB5GSVJNQVBST0ZFU0lPTkFMIENB +IFJPT1QtQSBXRUIwHhcNMjIwNDA2MDkwMTM2WhcNNDcwMzMxMDkwMTM2WjBuMQsw +CQYDVQQGEwJFUzEcMBoGA1UECgwTRmlybWFwcm9mZXNpb25hbCBTQTEYMBYGA1UE +YQwPVkFURVMtQTYyNjM0MDY4MScwJQYDVQQDDB5GSVJNQVBST0ZFU0lPTkFMIENB +IFJPT1QtQSBXRUIwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAARHU+osEaR3xyrq89Zf +e9MEkVz6iMYiuYMQYneEMy3pA4jU4DP37XcsSmDq5G+tbbT4TIqk5B/K6k84Si6C +cyvHZpsKjECcfIr28jlgst7L7Ljkb+qbXbdTkBgyVcUgt5SjYzBhMA8GA1UdEwEB +/wQFMAMBAf8wHwYDVR0jBBgwFoAUk+FDY1w8ndYn81LsF7Kpryz3dvgwHQYDVR0O +BBYEFJPhQ2NcPJ3WJ/NS7Beyqa8s93b4MA4GA1UdDwEB/wQEAwIBBjAKBggqhkjO +PQQDAwNoADBlAjAdfKR7w4l1M+E7qUW/Runpod3JIha3RxEL2Jq68cgLcFBTApFw +hVmpHqTm6iMxoAACMQD94vizrxa5HnPEluPBMBnYfubDl94cT7iJLzPrSA8Z94dG +XSaQpYXFuXqUPoeovQA= +-----END CERTIFICATE----- + +# Issuer: CN=TWCA CYBER Root CA O=TAIWAN-CA OU=Root CA +# Subject: CN=TWCA CYBER Root CA O=TAIWAN-CA OU=Root CA +# Label: "TWCA CYBER Root CA" +# Serial: 85076849864375384482682434040119489222 +# MD5 Fingerprint: 0b:33:a0:97:52:95:d4:a9:fd:bb:db:6e:a3:55:5b:51 +# SHA1 Fingerprint: f6:b1:1c:1a:83:38:e9:7b:db:b3:a8:c8:33:24:e0:2d:9c:7f:26:66 +# SHA256 Fingerprint: 3f:63:bb:28:14:be:17:4e:c8:b6:43:9c:f0:8d:6d:56:f0:b7:c4:05:88:3a:56:48:a3:34:42:4d:6b:3e:c5:58 +-----BEGIN CERTIFICATE----- +MIIFjTCCA3WgAwIBAgIQQAE0jMIAAAAAAAAAATzyxjANBgkqhkiG9w0BAQwFADBQ +MQswCQYDVQQGEwJUVzESMBAGA1UEChMJVEFJV0FOLUNBMRAwDgYDVQQLEwdSb290 +IENBMRswGQYDVQQDExJUV0NBIENZQkVSIFJvb3QgQ0EwHhcNMjIxMTIyMDY1NDI5 +WhcNNDcxMTIyMTU1OTU5WjBQMQswCQYDVQQGEwJUVzESMBAGA1UEChMJVEFJV0FO +LUNBMRAwDgYDVQQLEwdSb290IENBMRswGQYDVQQDExJUV0NBIENZQkVSIFJvb3Qg +Q0EwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDG+Moe2Qkgfh1sTs6P +40czRJzHyWmqOlt47nDSkvgEs1JSHWdyKKHfi12VCv7qze33Kc7wb3+szT3vsxxF +avcokPFhV8UMxKNQXd7UtcsZyoC5dc4pztKFIuwCY8xEMCDa6pFbVuYdHNWdZsc/ +34bKS1PE2Y2yHer43CdTo0fhYcx9tbD47nORxc5zb87uEB8aBs/pJ2DFTxnk684i +JkXXYJndzk834H/nY62wuFm40AZoNWDTNq5xQwTxaWV4fPMf88oon1oglWa0zbfu +j3ikRRjpJi+NmykosaS3Om251Bw4ckVYsV7r8Cibt4LK/c/WMw+f+5eesRycnupf +Xtuq3VTpMCEobY5583WSjCb+3MX2w7DfRFlDo7YDKPYIMKoNM+HvnKkHIuNZW0CP +2oi3aQiotyMuRAlZN1vH4xfyIutuOVLF3lSnmMlLIJXcRolftBL5hSmO68gnFSDA +S9TMfAxsNAwmmyYxpjyn9tnQS6Jk/zuZQXLB4HCX8SS7K8R0IrGsayIyJNN4KsDA +oS/xUgXJP+92ZuJF2A09rZXIx4kmyA+upwMu+8Ff+iDhcK2wZSA3M2Cw1a/XDBzC +kHDXShi8fgGwsOsVHkQGzaRP6AzRwyAQ4VRlnrZR0Bp2a0JaWHY06rc3Ga4udfmW +5cFZ95RXKSWNOkyrTZpB0F8mAwIDAQABo2MwYTAOBgNVHQ8BAf8EBAMCAQYwDwYD +VR0TAQH/BAUwAwEB/zAfBgNVHSMEGDAWgBSdhWEUfMFib5do5E83QOGt4A1WNzAd +BgNVHQ4EFgQUnYVhFHzBYm+XaORPN0DhreANVjcwDQYJKoZIhvcNAQEMBQADggIB +AGSPesRiDrWIzLjHhg6hShbNcAu3p4ULs3a2D6f/CIsLJc+o1IN1KriWiLb73y0t +tGlTITVX1olNc79pj3CjYcya2x6a4CD4bLubIp1dhDGaLIrdaqHXKGnK/nZVekZn +68xDiBaiA9a5F/gZbG0jAn/xX9AKKSM70aoK7akXJlQKTcKlTfjF/biBzysseKNn +TKkHmvPfXvt89YnNdJdhEGoHK4Fa0o635yDRIG4kqIQnoVesqlVYL9zZyvpoBJ7t +RCT5dEA7IzOrg1oYJkK2bVS1FmAwbLGg+LhBoF1JSdJlBTrq/p1hvIbZv97Tujqx +f36SNI7JAG7cmL3c7IAFrQI932XtCwP39xaEBDG6k5TY8hL4iuO/Qq+n1M0RFxbI +Qh0UqEL20kCGoE8jypZFVmAGzbdVAaYBlGX+bgUJurSkquLvWL69J1bY73NxW0Qz +8ppy6rBePm6pUlvscG21h483XjyMnM7k8M4MZ0HMzvaAq07MTFb1wWFZk7Q+ptq4 +NxKfKjLji7gh7MMrZQzvIt6IKTtM1/r+t+FHvpw+PoP7UV31aPcuIYXcv/Fa4nzX +xeSDwWrruoBa3lwtcHb4yOWHh8qgnaHlIhInD0Q9HWzq1MKLL295q39QpsQZp6F6 +t5b5wR9iWqJDB0BeJsas7a5wFsWqynKKTbDPAYsDP27X +-----END CERTIFICATE----- + +# Issuer: CN=SecureSign Root CA12 O=Cybertrust Japan Co., Ltd. +# Subject: CN=SecureSign Root CA12 O=Cybertrust Japan Co., Ltd. +# Label: "SecureSign Root CA12" +# Serial: 587887345431707215246142177076162061960426065942 +# MD5 Fingerprint: c6:89:ca:64:42:9b:62:08:49:0b:1e:7f:e9:07:3d:e8 +# SHA1 Fingerprint: 7a:22:1e:3d:de:1b:06:ac:9e:c8:47:70:16:8e:3c:e5:f7:6b:06:f4 +# SHA256 Fingerprint: 3f:03:4b:b5:70:4d:44:b2:d0:85:45:a0:20:57:de:93:eb:f3:90:5f:ce:72:1a:cb:c7:30:c0:6d:da:ee:90:4e +-----BEGIN CERTIFICATE----- +MIIDcjCCAlqgAwIBAgIUZvnHwa/swlG07VOX5uaCwysckBYwDQYJKoZIhvcNAQEL +BQAwUTELMAkGA1UEBhMCSlAxIzAhBgNVBAoTGkN5YmVydHJ1c3QgSmFwYW4gQ28u +LCBMdGQuMR0wGwYDVQQDExRTZWN1cmVTaWduIFJvb3QgQ0ExMjAeFw0yMDA0MDgw +NTM2NDZaFw00MDA0MDgwNTM2NDZaMFExCzAJBgNVBAYTAkpQMSMwIQYDVQQKExpD +eWJlcnRydXN0IEphcGFuIENvLiwgTHRkLjEdMBsGA1UEAxMUU2VjdXJlU2lnbiBS +b290IENBMTIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQC6OcE3emhF +KxS06+QT61d1I02PJC0W6K6OyX2kVzsqdiUzg2zqMoqUm048luT9Ub+ZyZN+v/mt +p7JIKwccJ/VMvHASd6SFVLX9kHrko+RRWAPNEHl57muTH2SOa2SroxPjcf59q5zd +J1M3s6oYwlkm7Fsf0uZlfO+TvdhYXAvA42VvPMfKWeP+bl+sg779XSVOKik71gur +FzJ4pOE+lEa+Ym6b3kaosRbnhW70CEBFEaCeVESE99g2zvVQR9wsMJvuwPWW0v4J +hscGWa5Pro4RmHvzC1KqYiaqId+OJTN5lxZJjfU+1UefNzFJM3IFTQy2VYzxV4+K +h9GtxRESOaCtAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQD +AgEGMB0GA1UdDgQWBBRXNPN0zwRL1SXm8UC2LEzZLemgrTANBgkqhkiG9w0BAQsF +AAOCAQEAPrvbFxbS8hQBICw4g0utvsqFepq2m2um4fylOqyttCg6r9cBg0krY6Ld +mmQOmFxv3Y67ilQiLUoT865AQ9tPkbeGGuwAtEGBpE/6aouIs3YIcipJQMPTw4WJ +mBClnW8Zt7vPemVV2zfrPIpyMpcemik+rY3moxtt9XUa5rBouVui7mlHJzWhhpmA +8zNL4WukJsPvdFlseqJkth5Ew1DgDzk9qTPxpfPSvWKErI4cqc1avTc7bgoitPQV +55FYxTpE05Uo2cBl6XLK0A+9H7MV2anjpEcJnuDLN/v9vZfVvhgaaaI5gdka9at/ +yOPiZwud9AzqVN/Ssq+xIvEg37xEHA== +-----END CERTIFICATE----- + +# Issuer: CN=SecureSign Root CA14 O=Cybertrust Japan Co., Ltd. +# Subject: CN=SecureSign Root CA14 O=Cybertrust Japan Co., Ltd. +# Label: "SecureSign Root CA14" +# Serial: 575790784512929437950770173562378038616896959179 +# MD5 Fingerprint: 71:0d:72:fa:92:19:65:5e:89:04:ac:16:33:f0:bc:d5 +# SHA1 Fingerprint: dd:50:c0:f7:79:b3:64:2e:74:a2:b8:9d:9f:d3:40:dd:bb:f0:f2:4f +# SHA256 Fingerprint: 4b:00:9c:10:34:49:4f:9a:b5:6b:ba:3b:a1:d6:27:31:fc:4d:20:d8:95:5a:dc:ec:10:a9:25:60:72:61:e3:38 +-----BEGIN CERTIFICATE----- +MIIFcjCCA1qgAwIBAgIUZNtaDCBO6Ncpd8hQJ6JaJ90t8sswDQYJKoZIhvcNAQEM +BQAwUTELMAkGA1UEBhMCSlAxIzAhBgNVBAoTGkN5YmVydHJ1c3QgSmFwYW4gQ28u +LCBMdGQuMR0wGwYDVQQDExRTZWN1cmVTaWduIFJvb3QgQ0ExNDAeFw0yMDA0MDgw +NzA2MTlaFw00NTA0MDgwNzA2MTlaMFExCzAJBgNVBAYTAkpQMSMwIQYDVQQKExpD +eWJlcnRydXN0IEphcGFuIENvLiwgTHRkLjEdMBsGA1UEAxMUU2VjdXJlU2lnbiBS +b290IENBMTQwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDF0nqh1oq/ +FjHQmNE6lPxauG4iwWL3pwon71D2LrGeaBLwbCRjOfHw3xDG3rdSINVSW0KZnvOg +vlIfX8xnbacuUKLBl422+JX1sLrcneC+y9/3OPJH9aaakpUqYllQC6KxNedlsmGy +6pJxaeQp8E+BgQQ8sqVb1MWoWWd7VRxJq3qdwudzTe/NCcLEVxLbAQ4jeQkHO6Lo +/IrPj8BGJJw4J+CDnRugv3gVEOuGTgpa/d/aLIJ+7sr2KeH6caH3iGicnPCNvg9J +kdjqOvn90Ghx2+m1K06Ckm9mH+Dw3EzsytHqunQG+bOEkJTRX45zGRBdAuVwpcAQ +0BB8b8VYSbSwbprafZX1zNoCr7gsfXmPvkPx+SgojQlD+Ajda8iLLCSxjVIHvXib +y8posqTdDEx5YMaZ0ZPxMBoH064iwurO8YQJzOAUbn8/ftKChazcqRZOhaBgy/ac +18izju3Gm5h1DVXoX+WViwKkrkMpKBGk5hIwAUt1ax5mnXkvpXYvHUC0bcl9eQjs +0Wq2XSqypWa9a4X0dFbD9ed1Uigspf9mR6XU/v6eVL9lfgHWMI+lNpyiUBzuOIAB +SMbHdPTGrMNASRZhdCyvjG817XsYAFs2PJxQDcqSMxDxJklt33UkN4Ii1+iW/RVL +ApY+B3KVfqs9TC7XyvDf4Fg/LS8EmjijAQIDAQABo0IwQDAPBgNVHRMBAf8EBTAD +AQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUBpOjCl4oaTeqYR3r6/wtbyPk +86AwDQYJKoZIhvcNAQEMBQADggIBAJaAcgkGfpzMkwQWu6A6jZJOtxEaCnFxEM0E +rX+lRVAQZk5KQaID2RFPeje5S+LGjzJmdSX7684/AykmjbgWHfYfM25I5uj4V7Ib +ed87hwriZLoAymzvftAj63iP/2SbNDefNWWipAA9EiOWWF3KY4fGoweITedpdopT +zfFP7ELyk+OZpDc8h7hi2/DsHzc/N19DzFGdtfCXwreFamgLRB7lUe6TzktuhsHS +DCRZNhqfLJGP4xjblJUK7ZGqDpncllPjYYPGFrojutzdfhrGe0K22VoF3Jpf1d+4 +2kd92jjbrDnVHmtsKheMYc2xbXIBw8MgAGJoFjHVdqqGuw6qnsb58Nn4DSEC5MUo +FlkRudlpcyqSeLiSV5sI8jrlL5WwWLdrIBRtFO8KvH7YVdiI2i/6GaX7i+B/OfVy +K4XELKzvGUWSTLNhB9xNH27SgRNcmvMSZ4PPmz+Ln52kuaiWA3rF7iDeM9ovnhp6 +dB7h7sxaOgTdsxoEqBRjrLdHEoOabPXm6RUVkRqEGQ6UROcSjiVbgGcZ3GOTEAtl +Lor6CZpO2oYofaphNdgOpygau1LgePhsumywbrmHXumZNTfxPWQrqaA0k89jL9WB +365jJ6UeTo3cKXhZ+PmhIIynJkBugnLNeLLIjzwec+fBH7/PzqUqm9tEZDKgu39c +JRNItX+S +-----END CERTIFICATE----- + +# Issuer: CN=SecureSign Root CA15 O=Cybertrust Japan Co., Ltd. +# Subject: CN=SecureSign Root CA15 O=Cybertrust Japan Co., Ltd. +# Label: "SecureSign Root CA15" +# Serial: 126083514594751269499665114766174399806381178503 +# MD5 Fingerprint: 13:30:fc:c4:62:a6:a9:de:b5:c1:68:af:b5:d2:31:47 +# SHA1 Fingerprint: cb:ba:83:c8:c1:5a:5d:f1:f9:73:6f:ca:d7:ef:28:13:06:4a:07:7d +# SHA256 Fingerprint: e7:78:f0:f0:95:fe:84:37:29:cd:1a:00:82:17:9e:53:14:a9:c2:91:44:28:05:e1:fb:1d:8f:b6:b8:88:6c:3a +-----BEGIN CERTIFICATE----- +MIICIzCCAamgAwIBAgIUFhXHw9hJp75pDIqI7fBw+d23PocwCgYIKoZIzj0EAwMw +UTELMAkGA1UEBhMCSlAxIzAhBgNVBAoTGkN5YmVydHJ1c3QgSmFwYW4gQ28uLCBM +dGQuMR0wGwYDVQQDExRTZWN1cmVTaWduIFJvb3QgQ0ExNTAeFw0yMDA0MDgwODMy +NTZaFw00NTA0MDgwODMyNTZaMFExCzAJBgNVBAYTAkpQMSMwIQYDVQQKExpDeWJl +cnRydXN0IEphcGFuIENvLiwgTHRkLjEdMBsGA1UEAxMUU2VjdXJlU2lnbiBSb290 +IENBMTUwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAAQLUHSNZDKZmbPSYAi4Io5GdCx4 +wCtELW1fHcmuS1Iggz24FG1Th2CeX2yF2wYUleDHKP+dX+Sq8bOLbe1PL0vJSpSR +ZHX+AezB2Ot6lHhWGENfa4HL9rzatAy2KZMIaY+jQjBAMA8GA1UdEwEB/wQFMAMB +Af8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBTrQciu/NWeUUj1vYv0hyCTQSvT +9DAKBggqhkjOPQQDAwNoADBlAjEA2S6Jfl5OpBEHvVnCB96rMjhTKkZEBhd6zlHp +4P9mLQlO4E/0BdGF9jVg3PVys0Z9AjBEmEYagoUeYWmJSwdLZrWeqrqgHkHZAXQ6 +bkU6iYAZezKYVWOr62Nuk22rGwlgMU4= +-----END CERTIFICATE----- + +# Issuer: CN=D-TRUST BR Root CA 2 2023 O=D-Trust GmbH +# Subject: CN=D-TRUST BR Root CA 2 2023 O=D-Trust GmbH +# Label: "D-TRUST BR Root CA 2 2023" +# Serial: 153168538924886464690566649552453098598 +# MD5 Fingerprint: e1:09:ed:d3:60:d4:56:1b:47:1f:b7:0c:5f:1b:5f:85 +# SHA1 Fingerprint: 2d:b0:70:ee:71:94:af:69:68:17:db:79:ce:58:9f:a0:6b:96:f7:87 +# SHA256 Fingerprint: 05:52:e6:f8:3f:df:65:e8:fa:96:70:e6:66:df:28:a4:e2:13:40:b5:10:cb:e5:25:66:f9:7c:4f:b9:4b:2b:d1 +-----BEGIN CERTIFICATE----- +MIIFqTCCA5GgAwIBAgIQczswBEhb2U14LnNLyaHcZjANBgkqhkiG9w0BAQ0FADBI +MQswCQYDVQQGEwJERTEVMBMGA1UEChMMRC1UcnVzdCBHbWJIMSIwIAYDVQQDExlE +LVRSVVNUIEJSIFJvb3QgQ0EgMiAyMDIzMB4XDTIzMDUwOTA4NTYzMVoXDTM4MDUw +OTA4NTYzMFowSDELMAkGA1UEBhMCREUxFTATBgNVBAoTDEQtVHJ1c3QgR21iSDEi +MCAGA1UEAxMZRC1UUlVTVCBCUiBSb290IENBIDIgMjAyMzCCAiIwDQYJKoZIhvcN +AQEBBQADggIPADCCAgoCggIBAK7/CVmRgApKaOYkP7in5Mg6CjoWzckjYaCTcfKr +i3OPoGdlYNJUa2NRb0kz4HIHE304zQaSBylSa053bATTlfrdTIzZXcFhfUvnKLNE +gXtRr90zsWh81k5M/itoucpmacTsXld/9w3HnDY25QdgrMBM6ghs7wZ8T1soegj8 +k12b9py0i4a6Ibn08OhZWiihNIQaJZG2tY/vsvmA+vk9PBFy2OMvhnbFeSzBqZCT +Rphny4NqoFAjpzv2gTng7fC5v2Xx2Mt6++9zA84A9H3X4F07ZrjcjrqDy4d2A/wl +2ecjbwb9Z/Pg/4S8R7+1FhhGaRTMBffb00msa8yr5LULQyReS2tNZ9/WtT5PeB+U +cSTq3nD88ZP+npNa5JRal1QMNXtfbO4AHyTsA7oC9Xb0n9Sa7YUsOCIvx9gvdhFP +/Wxc6PWOJ4d/GUohR5AdeY0cW/jPSoXk7bNbjb7EZChdQcRurDhaTyN0dKkSw/bS +uREVMweR2Ds3OmMwBtHFIjYoYiMQ4EbMl6zWK11kJNXuHA7e+whadSr2Y23OC0K+ +0bpwHJwh5Q8xaRfX/Aq03u2AnMuStIv13lmiWAmlY0cL4UEyNEHZmrHZqLAbWt4N +DfTisl01gLmB1IRpkQLLddCNxbU9CZEJjxShFHR5PtbJFR2kWVki3PaKRT08EtY+ +XTIvAgMBAAGjgY4wgYswDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUZ5Dw1t61 +GNVGKX5cq/ieCLxklRAwDgYDVR0PAQH/BAQDAgEGMEkGA1UdHwRCMEAwPqA8oDqG +OGh0dHA6Ly9jcmwuZC10cnVzdC5uZXQvY3JsL2QtdHJ1c3RfYnJfcm9vdF9jYV8y +XzIwMjMuY3JsMA0GCSqGSIb3DQEBDQUAA4ICAQA097N3U9swFrktpSHxQCF16+tI +FoE9c+CeJyrrd6kTpGoKWloUMz1oH4Guaf2Mn2VsNELZLdB/eBaxOqwjMa1ef67n +riv6uvw8l5VAk1/DLQOj7aRvU9f6QA4w9QAgLABMjDu0ox+2v5Eyq6+SmNMW5tTR +VFxDWy6u71cqqLRvpO8NVhTaIasgdp4D/Ca4nj8+AybmTNudX0KEPUUDAxxZiMrc +LmEkWqTqJwtzEr5SswrPMhfiHocaFpVIbVrg0M8JkiZmkdijYQ6qgYF/6FKC0ULn +4B0Y+qSFNueG4A3rvNTJ1jxD8V1Jbn6Bm2m1iWKPiFLY1/4nwSPFyysCu7Ff/vtD +hQNGvl3GyiEm/9cCnnRK3PgTFbGBVzbLZVzRHTF36SXDw7IyN9XxmAnkbWOACKsG +koHU6XCPpz+y7YaMgmo1yEJagtFSGkUPFaUA8JR7ZSdXOUPPfH/mvTWze/EZTN46 +ls/pdu4D58JDUjxqgejBWoC9EV2Ta/vH5mQ/u2kc6d0li690yVRAysuTEwrt+2aS +Ecr1wPrYg1UDfNPFIkZ1cGt5SAYqgpq/5usWDiJFAbzdNpQ0qTUmiteXue4Icr80 +knCDgKs4qllo3UCkGJCy89UDyibK79XH4I9TjvAA46jtn/mtd+ArY0+ew+43u3gJ +hJ65bvspmZDogNOfJA== +-----END CERTIFICATE----- + +# Issuer: CN=TrustAsia TLS ECC Root CA O=TrustAsia Technologies, Inc. +# Subject: CN=TrustAsia TLS ECC Root CA O=TrustAsia Technologies, Inc. +# Label: "TrustAsia TLS ECC Root CA" +# Serial: 310892014698942880364840003424242768478804666567 +# MD5 Fingerprint: 09:48:04:77:d2:fc:65:93:71:66:b1:11:95:4f:06:8c +# SHA1 Fingerprint: b5:ec:39:f3:a1:66:37:ae:c3:05:94:57:e2:be:11:be:b7:a1:7f:36 +# SHA256 Fingerprint: c0:07:6b:9e:f0:53:1f:b1:a6:56:d6:7c:4e:be:97:cd:5d:ba:a4:1e:f4:45:98:ac:c2:48:98:78:c9:2d:87:11 +-----BEGIN CERTIFICATE----- +MIICMTCCAbegAwIBAgIUNnThTXxlE8msg1UloD5Sfi9QaMcwCgYIKoZIzj0EAwMw +WDELMAkGA1UEBhMCQ04xJTAjBgNVBAoTHFRydXN0QXNpYSBUZWNobm9sb2dpZXMs +IEluYy4xIjAgBgNVBAMTGVRydXN0QXNpYSBUTFMgRUNDIFJvb3QgQ0EwHhcNMjQw +NTE1MDU0MTU2WhcNNDQwNTE1MDU0MTU1WjBYMQswCQYDVQQGEwJDTjElMCMGA1UE +ChMcVHJ1c3RBc2lhIFRlY2hub2xvZ2llcywgSW5jLjEiMCAGA1UEAxMZVHJ1c3RB +c2lhIFRMUyBFQ0MgUm9vdCBDQTB2MBAGByqGSM49AgEGBSuBBAAiA2IABLh/pVs/ +AT598IhtrimY4ZtcU5nb9wj/1WrgjstEpvDBjL1P1M7UiFPoXlfXTr4sP/MSpwDp +guMqWzJ8S5sUKZ74LYO1644xST0mYekdcouJtgq7nDM1D9rs3qlKH8kzsaNCMEAw +DwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQULIVTu7FDzTLqnqOH/qKYqKaT6RAw +DgYDVR0PAQH/BAQDAgEGMAoGCCqGSM49BAMDA2gAMGUCMFRH18MtYYZI9HlaVQ01 +L18N9mdsd0AaRuf4aFtOJx24mH1/k78ITcTaRTChD15KeAIxAKORh/IRM4PDwYqR +OkwrULG9IpRdNYlzg8WbGf60oenUoWa2AaU2+dhoYSi3dOGiMQ== +-----END CERTIFICATE----- + +# Issuer: CN=TrustAsia TLS RSA Root CA O=TrustAsia Technologies, Inc. +# Subject: CN=TrustAsia TLS RSA Root CA O=TrustAsia Technologies, Inc. +# Label: "TrustAsia TLS RSA Root CA" +# Serial: 160405846464868906657516898462547310235378010780 +# MD5 Fingerprint: 3b:9e:c3:86:0f:34:3c:6b:c5:46:c4:8e:1d:e7:19:12 +# SHA1 Fingerprint: a5:46:50:c5:62:ea:95:9a:1a:a7:04:6f:17:58:c7:29:53:3d:03:fa +# SHA256 Fingerprint: 06:c0:8d:7d:af:d8:76:97:1e:b1:12:4f:e6:7f:84:7e:c0:c7:a1:58:d3:ea:53:cb:e9:40:e2:ea:97:91:f4:c3 +-----BEGIN CERTIFICATE----- +MIIFgDCCA2igAwIBAgIUHBjYz+VTPyI1RlNUJDxsR9FcSpwwDQYJKoZIhvcNAQEM +BQAwWDELMAkGA1UEBhMCQ04xJTAjBgNVBAoTHFRydXN0QXNpYSBUZWNobm9sb2dp +ZXMsIEluYy4xIjAgBgNVBAMTGVRydXN0QXNpYSBUTFMgUlNBIFJvb3QgQ0EwHhcN +MjQwNTE1MDU0MTU3WhcNNDQwNTE1MDU0MTU2WjBYMQswCQYDVQQGEwJDTjElMCMG +A1UEChMcVHJ1c3RBc2lhIFRlY2hub2xvZ2llcywgSW5jLjEiMCAGA1UEAxMZVHJ1 +c3RBc2lhIFRMUyBSU0EgUm9vdCBDQTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCC +AgoCggIBAMMWuBtqpERz5dZO9LnPWwvB0ZqB9WOwj0PBuwhaGnrhB3YmH49pVr7+ +NmDQDIPNlOrnxS1cLwUWAp4KqC/lYCZUlviYQB2srp10Zy9U+5RjmOMmSoPGlbYJ +Q1DNDX3eRA5gEk9bNb2/mThtfWza4mhzH/kxpRkQcwUqwzIZheo0qt1CHjCNP561 +HmHVb70AcnKtEj+qpklz8oYVlQwQX1Fkzv93uMltrOXVmPGZLmzjyUT5tUMnCE32 +ft5EebuyjBza00tsLtbDeLdM1aTk2tyKjg7/D8OmYCYozza/+lcK7Fs/6TAWe8Tb +xNRkoDD75f0dcZLdKY9BWN4ArTr9PXwaqLEX8E40eFgl1oUh63kd0Nyrz2I8sMeX +i9bQn9P+PN7F4/w6g3CEIR0JwqH8uyghZVNgepBtljhb//HXeltt08lwSUq6HTrQ +UNoyIBnkiz/r1RYmNzz7dZ6wB3C4FGB33PYPXFIKvF1tjVEK2sUYyJtt3LCDs3+j +TnhMmCWr8n4uIF6CFabW2I+s5c0yhsj55NqJ4js+k8UTav/H9xj8Z7XvGCxUq0DT +bE3txci3OE9kxJRMT6DNrqXGJyV1J23G2pyOsAWZ1SgRxSHUuPzHlqtKZFlhaxP8 +S8ySpg+kUb8OWJDZgoM5pl+z+m6Ss80zDoWo8SnTq1mt1tve1CuBAgMBAAGjQjBA +MA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFLgHkXlcBvRG/XtZylomkadFK/hT +MA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQwFAAOCAgEAIZtqBSBdGBanEqT3 +Rz/NyjuujsCCztxIJXgXbODgcMTWltnZ9r96nBO7U5WS/8+S4PPFJzVXqDuiGev4 +iqME3mmL5Dw8veWv0BIb5Ylrc5tvJQJLkIKvQMKtuppgJFqBTQUYo+IzeXoLH5Pt +7DlK9RME7I10nYEKqG/odv6LTytpEoYKNDbdgptvT+Bz3Ul/KD7JO6NXBNiT2Twp +2xIQaOHEibgGIOcberyxk2GaGUARtWqFVwHxtlotJnMnlvm5P1vQiJ3koP26TpUJ +g3933FEFlJ0gcXax7PqJtZwuhfG5WyRasQmr2soaB82G39tp27RIGAAtvKLEiUUj +pQ7hRGU+isFqMB3iYPg6qocJQrmBktwliJiJ8Xw18WLK7nn4GS/+X/jbh87qqA8M +pugLoDzga5SYnH+tBuYc6kIQX+ImFTw3OffXvO645e8D7r0i+yiGNFjEWn9hongP +XvPKnbwbPKfILfanIhHKA9jnZwqKDss1jjQ52MjqjZ9k4DewbNfFj8GQYSbbJIwe +SsCI3zWQzj8C9GRh3sfIB5XeMhg6j6JCQCTl1jNdfK7vsU1P1FeQNWrcrgSXSYk0 +ly4wBOeY99sLAZDBHwo/+ML+TvrbmnNzFrwFuHnYWa8G5z9nODmxfKuU4CkUpijy +323imttUQ/hHWKNddBWcwauwxzQ= +-----END CERTIFICATE----- + +# Issuer: CN=D-TRUST EV Root CA 2 2023 O=D-Trust GmbH +# Subject: CN=D-TRUST EV Root CA 2 2023 O=D-Trust GmbH +# Label: "D-TRUST EV Root CA 2 2023" +# Serial: 139766439402180512324132425437959641711 +# MD5 Fingerprint: 96:b4:78:09:f0:09:cb:77:eb:bb:1b:4d:6f:36:bc:b6 +# SHA1 Fingerprint: a5:5b:d8:47:6c:8f:19:f7:4c:f4:6d:6b:b6:c2:79:82:22:df:54:8b +# SHA256 Fingerprint: 8e:82:21:b2:e7:d4:00:78:36:a1:67:2f:0d:cc:29:9c:33:bc:07:d3:16:f1:32:fa:1a:20:6d:58:71:50:f1:ce +-----BEGIN CERTIFICATE----- +MIIFqTCCA5GgAwIBAgIQaSYJfoBLTKCnjHhiU19abzANBgkqhkiG9w0BAQ0FADBI +MQswCQYDVQQGEwJERTEVMBMGA1UEChMMRC1UcnVzdCBHbWJIMSIwIAYDVQQDExlE +LVRSVVNUIEVWIFJvb3QgQ0EgMiAyMDIzMB4XDTIzMDUwOTA5MTAzM1oXDTM4MDUw +OTA5MTAzMlowSDELMAkGA1UEBhMCREUxFTATBgNVBAoTDEQtVHJ1c3QgR21iSDEi +MCAGA1UEAxMZRC1UUlVTVCBFViBSb290IENBIDIgMjAyMzCCAiIwDQYJKoZIhvcN +AQEBBQADggIPADCCAgoCggIBANiOo4mAC7JXUtypU0w3uX9jFxPvp1sjW2l1sJkK +F8GLxNuo4MwxusLyzV3pt/gdr2rElYfXR8mV2IIEUD2BCP/kPbOx1sWy/YgJ25yE +7CUXFId/MHibaljJtnMoPDT3mfd/06b4HEV8rSyMlD/YZxBTfiLNTiVR8CUkNRFe +EMbsh2aJgWi6zCudR3Mfvc2RpHJqnKIbGKBv7FD0fUDCqDDPvXPIEysQEx6Lmqg6 +lHPTGGkKSv/BAQP/eX+1SH977ugpbzZMlWGG2Pmic4ruri+W7mjNPU0oQvlFKzIb +RlUWaqZLKfm7lVa/Rh3sHZMdwGWyH6FDrlaeoLGPaxK3YG14C8qKXO0elg6DpkiV +jTujIcSuWMYAsoS0I6SWhjW42J7YrDRJmGOVxcttSEfi8i4YHtAxq9107PncjLgc +jmgjutDzUNzPZY9zOjLHfP7KgiJPvo5iR2blzYfi6NUPGJ/lBHJLRjwQ8kTCZFZx +TnXonMkmdMV9WdEKWw9t/p51HBjGGjp82A0EzM23RWV6sY+4roRIPrN6TagD4uJ+ +ARZZaBhDM7DS3LAaQzXupdqpRlyuhoFBAUp0JuyfBr/CBTdkdXgpaP3F9ev+R/nk +hbDhezGdpn9yo7nELC7MmVcOIQxFAZRl62UJxmMiCzNJkkg8/M3OsD6Onov4/knF +NXJHAgMBAAGjgY4wgYswDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUqvyREBuH +kV8Wub9PS5FeAByxMoAwDgYDVR0PAQH/BAQDAgEGMEkGA1UdHwRCMEAwPqA8oDqG +OGh0dHA6Ly9jcmwuZC10cnVzdC5uZXQvY3JsL2QtdHJ1c3RfZXZfcm9vdF9jYV8y +XzIwMjMuY3JsMA0GCSqGSIb3DQEBDQUAA4ICAQCTy6UfmRHsmg1fLBWTxj++EI14 +QvBukEdHjqOSMo1wj/Zbjb6JzkcBahsgIIlbyIIQbODnmaprxiqgYzWRaoUlrRc4 +pZt+UPJ26oUFKidBK7GB0aL2QHWpDsvxVUjY7NHss+jOFKE17MJeNRqrphYBBo7q +3C+jisosketSjl8MmxfPy3MHGcRqwnNU73xDUmPBEcrCRbH0O1P1aa4846XerOhU +t7KR/aypH/KH5BfGSah82ApB9PI+53c0BFLd6IHyTS9URZ0V4U/M5d40VxDJI3IX +cI1QcB9WbMy5/zpaT2N6w25lBx2Eof+pDGOJbbJAiDnXH3dotfyc1dZnaVuodNv8 +ifYbMvekJKZ2t0dT741Jj6m2g1qllpBFYfXeA08mD6iL8AOWsKwV0HFaanuU5nCT +2vFp4LJiTZ6P/4mdm13NRemUAiKN4DV/6PEEeXFsVIP4M7kFMhtYVRFP0OUnR3Hs +7dpn1mKmS00PaaLJvOwiS5THaJQXfuKOKD62xur1NGyfN4gHONuGcfrNlUhDbqNP +gofXNJhuS5N5YHVpD/Aa1VP6IQzCP+k/HxiMkl14p3ZnGbuy6n/pcAlWVqOwDAst +Nl7F6cTVg8uGF5csbBNvh1qvSaYd2804BC5f4ko1Di1L+KIkBI3Y4WNeApI02phh +XBxvWHZks/wCuPWdCg== +-----END CERTIFICATE----- + +# Issuer: CN=SwissSign RSA TLS Root CA 2022 - 1 O=SwissSign AG +# Subject: CN=SwissSign RSA TLS Root CA 2022 - 1 O=SwissSign AG +# Label: "SwissSign RSA TLS Root CA 2022 - 1" +# Serial: 388078645722908516278762308316089881486363258315 +# MD5 Fingerprint: 16:2e:e4:19:76:81:85:ba:8e:91:58:f1:15:ef:72:39 +# SHA1 Fingerprint: 81:34:0a:be:4c:cd:ce:cc:e7:7d:cc:8a:d4:57:e2:45:a0:77:5d:ce +# SHA256 Fingerprint: 19:31:44:f4:31:e0:fd:db:74:07:17:d4:de:92:6a:57:11:33:88:4b:43:60:d3:0e:27:29:13:cb:e6:60:ce:41 +-----BEGIN CERTIFICATE----- +MIIFkzCCA3ugAwIBAgIUQ/oMX04bgBhE79G0TzUfRPSA7cswDQYJKoZIhvcNAQEL +BQAwUTELMAkGA1UEBhMCQ0gxFTATBgNVBAoTDFN3aXNzU2lnbiBBRzErMCkGA1UE +AxMiU3dpc3NTaWduIFJTQSBUTFMgUm9vdCBDQSAyMDIyIC0gMTAeFw0yMjA2MDgx +MTA4MjJaFw00NzA2MDgxMTA4MjJaMFExCzAJBgNVBAYTAkNIMRUwEwYDVQQKEwxT +d2lzc1NpZ24gQUcxKzApBgNVBAMTIlN3aXNzU2lnbiBSU0EgVExTIFJvb3QgQ0Eg +MjAyMiAtIDEwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDLKmjiC8NX +vDVjvHClO/OMPE5Xlm7DTjak9gLKHqquuN6orx122ro10JFwB9+zBvKK8i5VUXu7 +LCTLf5ImgKO0lPaCoaTo+nUdWfMHamFk4saMla+ju45vVs9xzF6BYQ1t8qsCLqSX +5XH8irCRIFucdFJtrhUnWXjyCcplDn/L9Ovn3KlMd/YrFgSVrpxxpT8q2kFC5zyE +EPThPYxr4iuRR1VPuFa+Rd4iUU1OKNlfGUEGjw5NBuBwQCMBauTLE5tzrE0USJIt +/m2n+IdreXXhvhCxqohAWVTXz8TQm0SzOGlkjIHRI36qOTw7D59Ke4LKa2/KIj4x +0LDQKhySio/YGZxH5D4MucLNvkEM+KRHBdvBFzA4OmnczcNpI/2aDwLOEGrOyvi5 +KaM2iYauC8BPY7kGWUleDsFpswrzd34unYyzJ5jSmY0lpx+Gs6ZUcDj8fV3oT4MM +0ZPlEuRU2j7yrTrePjxF8CgPBrnh25d7mUWe3f6VWQQvdT/TromZhqwUtKiE+shd +OxtYk8EXlFXIC+OCeYSf8wCENO7cMdWP8vpPlkwGqnj73mSiI80fPsWMvDdUDrta +clXvyFu1cvh43zcgTFeRc5JzrBh3Q4IgaezprClG5QtO+DdziZaKHG29777YtvTK +wP1H8K4LWCDFyB02rpeNUIMmJCn3nTsPBQIDAQABo2MwYTAPBgNVHRMBAf8EBTAD +AQH/MA4GA1UdDwEB/wQEAwIBBjAfBgNVHSMEGDAWgBRvjmKLk0Ow4UD2p8P98Q+4 +DxU4pTAdBgNVHQ4EFgQUb45ii5NDsOFA9qfD/fEPuA8VOKUwDQYJKoZIhvcNAQEL +BQADggIBAKwsKUF9+lz1GpUYvyypiqkkVHX1uECry6gkUSsYP2OprphWKwVDIqO3 +10aewCoSPY6WlkDfDDOLazeROpW7OSltwAJsipQLBwJNGD77+3v1dj2b9l4wBlgz +Hqp41eZUBDqyggmNzhYzWUUo8aWjlw5DI/0LIICQ/+Mmz7hkkeUFjxOgdg3XNwwQ +iJb0Pr6VvfHDffCjw3lHC1ySFWPtUnWK50Zpy1FVCypM9fJkT6lc/2cyjlUtMoIc +gC9qkfjLvH4YoiaoLqNTKIftV+Vlek4ASltOU8liNr3CjlvrzG4ngRhZi0Rjn9UM +ZfQpZX+RLOV/fuiJz48gy20HQhFRJjKKLjpHE7iNvUcNCfAWpO2Whi4Z2L6MOuhF +LhG6rlrnub+xzI/goP+4s9GFe3lmozm1O2bYQL7Pt2eLSMkZJVX8vY3PXtpOpvJp +zv1/THfQwUY1mFwjmwJFQ5Ra3bxHrSL+ul4vkSkphnsh3m5kt8sNjzdbowhq6/Td +Ao9QAwKxuDdollDruF/UKIqlIgyKhPBZLtU30WHlQnNYKoH3dtvi4k0NX/a3vgW0 +rk4N3hY9A4GzJl5LuEsAz/+MF7psYC0nhzck5npgL7XTgwSqT0N1osGDsieYK7EO +gLrAhV5Cud+xYJHT6xh+cHiudoO+cVrQkOPKwRYlZ0rwtnu64ZzZ +-----END CERTIFICATE----- + +# Issuer: CN=OISTE Server Root ECC G1 O=OISTE Foundation +# Subject: CN=OISTE Server Root ECC G1 O=OISTE Foundation +# Label: "OISTE Server Root ECC G1" +# Serial: 47819833811561661340092227008453318557 +# MD5 Fingerprint: 42:a7:d2:35:ae:02:92:db:19:76:08:de:2f:05:b4:d4 +# SHA1 Fingerprint: 3b:f6:8b:09:ae:2a:92:7b:ba:e3:8d:3f:11:95:d9:e6:44:0c:45:e2 +# SHA256 Fingerprint: ee:c9:97:c0:c3:0f:21:6f:7e:3b:8b:30:7d:2b:ae:42:41:2d:75:3f:c8:21:9d:af:d1:52:0b:25:72:85:0f:49 +-----BEGIN CERTIFICATE----- +MIICNTCCAbqgAwIBAgIQI/nD1jWvjyhLH/BU6n6XnTAKBggqhkjOPQQDAzBLMQsw +CQYDVQQGEwJDSDEZMBcGA1UECgwQT0lTVEUgRm91bmRhdGlvbjEhMB8GA1UEAwwY +T0lTVEUgU2VydmVyIFJvb3QgRUNDIEcxMB4XDTIzMDUzMTE0NDIyOFoXDTQ4MDUy +NDE0NDIyN1owSzELMAkGA1UEBhMCQ0gxGTAXBgNVBAoMEE9JU1RFIEZvdW5kYXRp +b24xITAfBgNVBAMMGE9JU1RFIFNlcnZlciBSb290IEVDQyBHMTB2MBAGByqGSM49 +AgEGBSuBBAAiA2IABBcv+hK8rBjzCvRE1nZCnrPoH7d5qVi2+GXROiFPqOujvqQy +cvO2Ackr/XeFblPdreqqLiWStukhEaivtUwL85Zgmjvn6hp4LrQ95SjeHIC6XG4N +2xml4z+cKrhAS93mT6NjMGEwDwYDVR0TAQH/BAUwAwEB/zAfBgNVHSMEGDAWgBQ3 +TYhlz/w9itWj8UnATgwQb0K0nDAdBgNVHQ4EFgQUN02IZc/8PYrVo/FJwE4MEG9C +tJwwDgYDVR0PAQH/BAQDAgGGMAoGCCqGSM49BAMDA2kAMGYCMQCpKjAd0MKfkFFR +QD6VVCHNFmb3U2wIFjnQEnx/Yxvf4zgAOdktUyBFCxxgZzFDJe0CMQCSia7pXGKD +YmH5LVerVrkR3SW+ak5KGoJr3M/TvEqzPNcum9v4KGm8ay3sMaE641c= +-----END CERTIFICATE----- + +# Issuer: CN=OISTE Server Root RSA G1 O=OISTE Foundation +# Subject: CN=OISTE Server Root RSA G1 O=OISTE Foundation +# Label: " OISTE Server Root RSA G1" +# Serial: 113845518112613905024960613408179309848 +# MD5 Fingerprint: 23:a7:9e:d4:70:b8:b9:14:57:41:8a:7e:44:59:e2:68 +# SHA1 Fingerprint: f7:00:34:25:94:88:68:31:e4:34:87:3f:70:fe:86:b3:86:9f:f0:6e +# SHA256 Fingerprint: 9a:e3:62:32:a5:18:9f:fd:db:35:3d:fd:26:52:0c:01:53:95:d2:27:77:da:c5:9d:b5:7b:98:c0:89:a6:51:e6 +-----BEGIN CERTIFICATE----- +MIIFgzCCA2ugAwIBAgIQVaXZZ5Qoxu0M+ifdWwFNGDANBgkqhkiG9w0BAQwFADBL +MQswCQYDVQQGEwJDSDEZMBcGA1UECgwQT0lTVEUgRm91bmRhdGlvbjEhMB8GA1UE +AwwYT0lTVEUgU2VydmVyIFJvb3QgUlNBIEcxMB4XDTIzMDUzMTE0MzcxNloXDTQ4 +MDUyNDE0MzcxNVowSzELMAkGA1UEBhMCQ0gxGTAXBgNVBAoMEE9JU1RFIEZvdW5k +YXRpb24xITAfBgNVBAMMGE9JU1RFIFNlcnZlciBSb290IFJTQSBHMTCCAiIwDQYJ +KoZIhvcNAQEBBQADggIPADCCAgoCggIBAKqu9KuCz/vlNwvn1ZatkOhLKdxVYOPM +vLO8LZK55KN68YG0nnJyQ98/qwsmtO57Gmn7KNByXEptaZnwYx4M0rH/1ow00O7b +rEi56rAUjtgHqSSY3ekJvqgiG1k50SeH3BzN+Puz6+mTeO0Pzjd8JnduodgsIUzk +ik/HEzxux9UTl7Ko2yRpg1bTacuCErudG/L4NPKYKyqOBGf244ehHa1uzjZ0Dl4z +O8vbUZeUapU8zhhabkvG/AePLhq5SvdkNCncpo1Q4Y2LS+VIG24ugBA/5J8bZT8R +tOpXaZ+0AOuFJJkk9SGdl6r7NH8CaxWQrbueWhl/pIzY+m0o/DjH40ytas7ZTpOS +jswMZ78LS5bOZmdTaMsXEY5Z96ycG7mOaES3GK/m5Q9l3JUJsJMStR8+lKXHiHUh +sd4JJCpM4rzsTGdHwimIuQq6+cF0zowYJmXa92/GjHtoXAvuY8BeS/FOzJ8vD+Ho +mnqT8eDI278n5mUpezbgMxVz8p1rhAhoKzYHKyfMeNhqhw5HdPSqoBNdZH702xSu ++zrkL8Fl47l6QGzwBrd7KJvX4V84c5Ss2XCTLdyEr0YconosP4EmQufU2MVshGYR +i3drVByjtdgQ8K4p92cIiBdcuJd5z+orKu5YM+Vt6SmqZQENghPsJQtdLEByFSnT +kCz3GkPVavBpAgMBAAGjYzBhMA8GA1UdEwEB/wQFMAMBAf8wHwYDVR0jBBgwFoAU +8snBDw1jALvsRQ5KH7WxszbNDo0wHQYDVR0OBBYEFPLJwQ8NYwC77EUOSh+1sbM2 +zQ6NMA4GA1UdDwEB/wQEAwIBhjANBgkqhkiG9w0BAQwFAAOCAgEANGd5sjrG5T33 +I3K5Ce+SrScfoE4KsvXaFwyihdJ+klH9FWXXXGtkFu6KRcoMQzZENdl//nk6HOjG +5D1rd9QhEOP28yBOqb6J8xycqd+8MDoX0TJD0KqKchxRKEzdNsjkLWd9kYccnbz8 +qyiWXmFcuCIzGEgWUOrKL+mlSdx/PKQZvDatkuK59EvV6wit53j+F8Bdh3foZ3dP +AGav9LEDOr4SfEE15fSmG0eLy3n31r8Xbk5l8PjaV8GUgeV6Vg27Rn9vkf195hfk +gSe7BYhW3SCl95gtkRlpMV+bMPKZrXJAlszYd2abtNUOshD+FKrDgHGdPY3ofRRs +YWSGRqbXVMW215AWRqWFyp464+YTFrYVI8ypKVL9AMb2kI5Wj4kI3Zaq5tNqqYY1 +9tVFeEJKRvwDyF7YZvZFZSS0vod7VSCd9521Kvy5YhnLbDuv0204bKt7ph6N/Ome +/msVuduCmsuY33OhkKCgxeDoAaijFJzIwZqsFVAzje18KotzlUBDJvyBpCpfOZC3 +J8tRd/iWkx7P8nd9H0aTolkelUTFLXVksNb54Dxp6gS1HAviRkRNQzuXSXERvSS2 +wq1yVAb+axj5d9spLFKebXd7Yv0PTY6YMjAwcRLWJTXjn/hvnLXrahut6hDTlhZy +BiElxky8j3C7DOReIoMt0r7+hVu05L0= +-----END CERTIFICATE----- diff --git a/venv/lib/python3.11/site-packages/certifi/core.py b/venv/lib/python3.11/site-packages/certifi/core.py new file mode 100644 index 0000000..1c9661c --- /dev/null +++ b/venv/lib/python3.11/site-packages/certifi/core.py @@ -0,0 +1,83 @@ +""" +certifi.py +~~~~~~~~~~ + +This module returns the installation location of cacert.pem or its contents. +""" +import sys +import atexit + +def exit_cacert_ctx() -> None: + _CACERT_CTX.__exit__(None, None, None) # type: ignore[union-attr] + + +if sys.version_info >= (3, 11): + + from importlib.resources import as_file, files + + _CACERT_CTX = None + _CACERT_PATH = None + + def where() -> str: + # This is slightly terrible, but we want to delay extracting the file + # in cases where we're inside of a zipimport situation until someone + # actually calls where(), but we don't want to re-extract the file + # on every call of where(), so we'll do it once then store it in a + # global variable. + global _CACERT_CTX + global _CACERT_PATH + if _CACERT_PATH is None: + # This is slightly janky, the importlib.resources API wants you to + # manage the cleanup of this file, so it doesn't actually return a + # path, it returns a context manager that will give you the path + # when you enter it and will do any cleanup when you leave it. In + # the common case of not needing a temporary file, it will just + # return the file system location and the __exit__() is a no-op. + # + # We also have to hold onto the actual context manager, because + # it will do the cleanup whenever it gets garbage collected, so + # we will also store that at the global level as well. + _CACERT_CTX = as_file(files("certifi").joinpath("cacert.pem")) + _CACERT_PATH = str(_CACERT_CTX.__enter__()) + atexit.register(exit_cacert_ctx) + + return _CACERT_PATH + + def contents() -> str: + return files("certifi").joinpath("cacert.pem").read_text(encoding="ascii") + +else: + + from importlib.resources import path as get_path, read_text + + _CACERT_CTX = None + _CACERT_PATH = None + + def where() -> str: + # This is slightly terrible, but we want to delay extracting the + # file in cases where we're inside of a zipimport situation until + # someone actually calls where(), but we don't want to re-extract + # the file on every call of where(), so we'll do it once then store + # it in a global variable. + global _CACERT_CTX + global _CACERT_PATH + if _CACERT_PATH is None: + # This is slightly janky, the importlib.resources API wants you + # to manage the cleanup of this file, so it doesn't actually + # return a path, it returns a context manager that will give + # you the path when you enter it and will do any cleanup when + # you leave it. In the common case of not needing a temporary + # file, it will just return the file system location and the + # __exit__() is a no-op. + # + # We also have to hold onto the actual context manager, because + # it will do the cleanup whenever it gets garbage collected, so + # we will also store that at the global level as well. + _CACERT_CTX = get_path("certifi", "cacert.pem") + _CACERT_PATH = str(_CACERT_CTX.__enter__()) + atexit.register(exit_cacert_ctx) + + return _CACERT_PATH + + def contents() -> str: + return read_text("certifi", "cacert.pem", encoding="ascii") diff --git a/venv/lib/python3.11/site-packages/certifi/py.typed b/venv/lib/python3.11/site-packages/certifi/py.typed new file mode 100644 index 0000000..e69de29 diff --git a/venv/lib/python3.11/site-packages/cffi-2.0.0.dist-info/INSTALLER b/venv/lib/python3.11/site-packages/cffi-2.0.0.dist-info/INSTALLER new file mode 100644 index 0000000..a1b589e --- /dev/null +++ b/venv/lib/python3.11/site-packages/cffi-2.0.0.dist-info/INSTALLER @@ -0,0 +1 @@ +pip diff --git a/venv/lib/python3.11/site-packages/cffi-2.0.0.dist-info/METADATA b/venv/lib/python3.11/site-packages/cffi-2.0.0.dist-info/METADATA new file mode 100644 index 0000000..67508e5 --- /dev/null +++ b/venv/lib/python3.11/site-packages/cffi-2.0.0.dist-info/METADATA @@ -0,0 +1,68 @@ +Metadata-Version: 2.4 +Name: cffi +Version: 2.0.0 +Summary: Foreign Function Interface for Python calling C code. +Author: Armin Rigo, Maciej Fijalkowski +Maintainer: Matt Davis, Matt Clay, Matti Picus +License-Expression: MIT +Project-URL: Documentation, https://cffi.readthedocs.io/ +Project-URL: Changelog, https://cffi.readthedocs.io/en/latest/whatsnew.html +Project-URL: Downloads, https://github.com/python-cffi/cffi/releases +Project-URL: Contact, https://groups.google.com/forum/#!forum/python-cffi +Project-URL: Source Code, https://github.com/python-cffi/cffi +Project-URL: Issue Tracker, https://github.com/python-cffi/cffi/issues +Classifier: Programming Language :: Python +Classifier: Programming Language :: Python :: 3 +Classifier: Programming Language :: Python :: 3.9 +Classifier: Programming Language :: Python :: 3.10 +Classifier: Programming Language :: Python :: 3.11 +Classifier: Programming Language :: Python :: 3.12 +Classifier: Programming Language :: Python :: 3.13 +Classifier: Programming Language :: Python :: 3.14 +Classifier: Programming Language :: Python :: Free Threading :: 2 - Beta +Classifier: Programming Language :: Python :: Implementation :: CPython +Requires-Python: >=3.9 +Description-Content-Type: text/markdown +License-File: LICENSE +License-File: AUTHORS +Requires-Dist: pycparser; implementation_name != "PyPy" +Dynamic: license-file + +[![GitHub Actions Status](https://github.com/python-cffi/cffi/actions/workflows/ci.yaml/badge.svg?branch=main)](https://github.com/python-cffi/cffi/actions/workflows/ci.yaml?query=branch%3Amain++) +[![PyPI version](https://img.shields.io/pypi/v/cffi.svg)](https://pypi.org/project/cffi) +[![Read the Docs](https://img.shields.io/badge/docs-latest-blue.svg)][Documentation] + + +CFFI +==== + +Foreign Function Interface for Python calling C code. + +Please see the [Documentation] or uncompiled in the `doc/` subdirectory. + +Download +-------- + +[Download page](https://github.com/python-cffi/cffi/releases) + +Source Code +----------- + +Source code is publicly available on +[GitHub](https://github.com/python-cffi/cffi). + +Contact +------- + +[Mailing list](https://groups.google.com/forum/#!forum/python-cffi) + +Testing/development tips +------------------------ + +After `git clone` or `wget && tar`, we will get a directory called `cffi` or `cffi-x.x.x`. we call it `repo-directory`. To run tests under CPython, run the following in the `repo-directory`: + + pip install pytest + pip install -e . # editable install of CFFI for local development + pytest src/c/ testing/ + +[Documentation]: http://cffi.readthedocs.org/ diff --git a/venv/lib/python3.11/site-packages/cffi-2.0.0.dist-info/RECORD b/venv/lib/python3.11/site-packages/cffi-2.0.0.dist-info/RECORD new file mode 100644 index 0000000..7c8cbde --- /dev/null +++ b/venv/lib/python3.11/site-packages/cffi-2.0.0.dist-info/RECORD @@ -0,0 +1,49 @@ +_cffi_backend.cpython-311-x86_64-linux-gnu.so,sha256=gSEHv07vIWL26K3_tiw2e_rJzTGs31NW2-53K0J2X2c,332440 +cffi-2.0.0.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 +cffi-2.0.0.dist-info/METADATA,sha256=uYzn40F68Im8EtXHNBLZs7FoPM-OxzyYbDWsjJvhujk,2559 +cffi-2.0.0.dist-info/RECORD,, +cffi-2.0.0.dist-info/WHEEL,sha256=_CFvICYDmZlAYHt8L7Zn3n-BGLj8dkZLQPp22Piy5JE,151 +cffi-2.0.0.dist-info/entry_points.txt,sha256=y6jTxnyeuLnL-XJcDv8uML3n6wyYiGRg8MTp_QGJ9Ho,75 +cffi-2.0.0.dist-info/licenses/AUTHORS,sha256=KmemC7-zN1nWfWRf8TG45ta8TK_CMtdR_Kw-2k0xTMg,208 +cffi-2.0.0.dist-info/licenses/LICENSE,sha256=W6JN3FcGf5JJrdZEw6_EGl1tw34jQz73Wdld83Cwr2M,1123 +cffi-2.0.0.dist-info/top_level.txt,sha256=rE7WR3rZfNKxWI9-jn6hsHCAl7MDkB-FmuQbxWjFehQ,19 +cffi/__init__.py,sha256=-ksBQ7MfDzVvbBlV_ftYBWAmEqfA86ljIzMxzaZeAlI,511 +cffi/__pycache__/__init__.cpython-311.pyc,, +cffi/__pycache__/_imp_emulation.cpython-311.pyc,, +cffi/__pycache__/_shimmed_dist_utils.cpython-311.pyc,, +cffi/__pycache__/api.cpython-311.pyc,, +cffi/__pycache__/backend_ctypes.cpython-311.pyc,, +cffi/__pycache__/cffi_opcode.cpython-311.pyc,, +cffi/__pycache__/commontypes.cpython-311.pyc,, +cffi/__pycache__/cparser.cpython-311.pyc,, +cffi/__pycache__/error.cpython-311.pyc,, +cffi/__pycache__/ffiplatform.cpython-311.pyc,, +cffi/__pycache__/lock.cpython-311.pyc,, +cffi/__pycache__/model.cpython-311.pyc,, +cffi/__pycache__/pkgconfig.cpython-311.pyc,, +cffi/__pycache__/recompiler.cpython-311.pyc,, +cffi/__pycache__/setuptools_ext.cpython-311.pyc,, +cffi/__pycache__/vengine_cpy.cpython-311.pyc,, +cffi/__pycache__/vengine_gen.cpython-311.pyc,, +cffi/__pycache__/verifier.cpython-311.pyc,, +cffi/_cffi_errors.h,sha256=zQXt7uR_m8gUW-fI2hJg0KoSkJFwXv8RGUkEDZ177dQ,3908 +cffi/_cffi_include.h,sha256=Exhmgm9qzHWzWivjfTe0D7Xp4rPUkVxdNuwGhMTMzbw,15055 +cffi/_embedding.h,sha256=Ai33FHblE7XSpHOCp8kPcWwN5_9BV14OvN0JVa6ITpw,18786 +cffi/_imp_emulation.py,sha256=RxREG8zAbI2RPGBww90u_5fi8sWdahpdipOoPzkp7C0,2960 +cffi/_shimmed_dist_utils.py,sha256=Bjj2wm8yZbvFvWEx5AEfmqaqZyZFhYfoyLLQHkXZuao,2230 +cffi/api.py,sha256=alBv6hZQkjpmZplBphdaRn2lPO9-CORs_M7ixabvZWI,42169 +cffi/backend_ctypes.py,sha256=h5ZIzLc6BFVXnGyc9xPqZWUS7qGy7yFSDqXe68Sa8z4,42454 +cffi/cffi_opcode.py,sha256=JDV5l0R0_OadBX_uE7xPPTYtMdmpp8I9UYd6av7aiDU,5731 +cffi/commontypes.py,sha256=7N6zPtCFlvxXMWhHV08psUjdYIK2XgsN3yo5dgua_v4,2805 +cffi/cparser.py,sha256=QUTfmlL-aO-MYR8bFGlvAUHc36OQr7XYLe0WLkGFjRo,44790 +cffi/error.py,sha256=v6xTiS4U0kvDcy4h_BDRo5v39ZQuj-IMRYLv5ETddZs,877 +cffi/ffiplatform.py,sha256=avxFjdikYGJoEtmJO7ewVmwG_VEVl6EZ_WaNhZYCqv4,3584 +cffi/lock.py,sha256=l9TTdwMIMpi6jDkJGnQgE9cvTIR7CAntIJr8EGHt3pY,747 +cffi/model.py,sha256=W30UFQZE73jL5Mx5N81YT77us2W2iJjTm0XYfnwz1cg,21797 +cffi/parse_c_type.h,sha256=OdwQfwM9ktq6vlCB43exFQmxDBtj2MBNdK8LYl15tjw,5976 +cffi/pkgconfig.py,sha256=LP1w7vmWvmKwyqLaU1Z243FOWGNQMrgMUZrvgFuOlco,4374 +cffi/recompiler.py,sha256=78J6lMEEOygXNmjN9-fOFFO3j7eW-iFxSrxfvQb54bY,65509 +cffi/setuptools_ext.py,sha256=0rCwBJ1W7FHWtiMKfNXsSST88V8UXrui5oeXFlDNLG8,9411 +cffi/vengine_cpy.py,sha256=oyQKD23kpE0aChUKA8Jg0e723foPiYzLYEdb-J0MiNs,43881 +cffi/vengine_gen.py,sha256=DUlEIrDiVin1Pnhn1sfoamnS5NLqfJcOdhRoeSNeJRg,26939 +cffi/verifier.py,sha256=oX8jpaohg2Qm3aHcznidAdvrVm5N4sQYG0a3Eo5mIl4,11182 diff --git a/venv/lib/python3.11/site-packages/cffi-2.0.0.dist-info/WHEEL b/venv/lib/python3.11/site-packages/cffi-2.0.0.dist-info/WHEEL new file mode 100644 index 0000000..7cc1bea --- /dev/null +++ b/venv/lib/python3.11/site-packages/cffi-2.0.0.dist-info/WHEEL @@ -0,0 +1,6 @@ +Wheel-Version: 1.0 +Generator: setuptools (80.9.0) +Root-Is-Purelib: false +Tag: cp311-cp311-manylinux_2_17_x86_64 +Tag: cp311-cp311-manylinux2014_x86_64 + diff --git a/venv/lib/python3.11/site-packages/cffi-2.0.0.dist-info/entry_points.txt b/venv/lib/python3.11/site-packages/cffi-2.0.0.dist-info/entry_points.txt new file mode 100644 index 0000000..4b0274f --- /dev/null +++ b/venv/lib/python3.11/site-packages/cffi-2.0.0.dist-info/entry_points.txt @@ -0,0 +1,2 @@ +[distutils.setup_keywords] +cffi_modules = cffi.setuptools_ext:cffi_modules diff --git a/venv/lib/python3.11/site-packages/cffi-2.0.0.dist-info/licenses/AUTHORS b/venv/lib/python3.11/site-packages/cffi-2.0.0.dist-info/licenses/AUTHORS new file mode 100644 index 0000000..370a25d --- /dev/null +++ b/venv/lib/python3.11/site-packages/cffi-2.0.0.dist-info/licenses/AUTHORS @@ -0,0 +1,8 @@ +This package has been mostly done by Armin Rigo with help from +Maciej Fijałkowski. The idea is heavily based (although not directly +copied) from LuaJIT ffi by Mike Pall. + + +Other contributors: + + Google Inc. diff --git a/venv/lib/python3.11/site-packages/cffi-2.0.0.dist-info/licenses/LICENSE b/venv/lib/python3.11/site-packages/cffi-2.0.0.dist-info/licenses/LICENSE new file mode 100644 index 0000000..0a1dbfb --- /dev/null +++ b/venv/lib/python3.11/site-packages/cffi-2.0.0.dist-info/licenses/LICENSE @@ -0,0 +1,23 @@ + +Except when otherwise stated (look for LICENSE files in directories or +information at the beginning of each file) all software and +documentation is licensed as follows: + + MIT No Attribution + + Permission is hereby granted, free of charge, to any person + obtaining a copy of this software and associated documentation + files (the "Software"), to deal in the Software without + restriction, including without limitation the rights to use, + copy, modify, merge, publish, distribute, sublicense, and/or + sell copies of the Software, and to permit persons to whom the + Software is furnished to do so. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + DEALINGS IN THE SOFTWARE. + diff --git a/venv/lib/python3.11/site-packages/cffi-2.0.0.dist-info/top_level.txt b/venv/lib/python3.11/site-packages/cffi-2.0.0.dist-info/top_level.txt new file mode 100644 index 0000000..f645779 --- /dev/null +++ b/venv/lib/python3.11/site-packages/cffi-2.0.0.dist-info/top_level.txt @@ -0,0 +1,2 @@ +_cffi_backend +cffi diff --git a/venv/lib/python3.11/site-packages/cffi/__init__.py b/venv/lib/python3.11/site-packages/cffi/__init__.py new file mode 100644 index 0000000..c99ec3d --- /dev/null +++ b/venv/lib/python3.11/site-packages/cffi/__init__.py @@ -0,0 +1,14 @@ +__all__ = ['FFI', 'VerificationError', 'VerificationMissing', 'CDefError', + 'FFIError'] + +from .api import FFI +from .error import CDefError, FFIError, VerificationError, VerificationMissing +from .error import PkgConfigError + +__version__ = "2.0.0" +__version_info__ = (2, 0, 0) + +# The verifier module file names are based on the CRC32 of a string that +# contains the following version number. It may be older than __version__ +# if nothing is clearly incompatible. +__version_verifier_modules__ = "0.8.6" diff --git a/venv/lib/python3.11/site-packages/cffi/__pycache__/__init__.cpython-311.pyc b/venv/lib/python3.11/site-packages/cffi/__pycache__/__init__.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..3d863facaa27ccde56a3775d0362425f13cb00d2 GIT binary patch literal 625 zcmah_O=}cE5Url?-8CUG3AyB;Cz(U0Hxa~x2oen_7(~HCUz*8I&!owG(KA`uoboTc zdlCPHzhRC`p9D{P8^|pet=t~Q4)NBa1grM zK0JJ_*FOp+Q#pxSS(UGps+8WiOTCp%Bg;$=4ql4%`aD405-qS>2#GRHhK_P^Q=SR7 z365cjUVV3(9aLp1v!&+T-H*o6IJ6f=wZH|+jDPNqqo>i6qwt>gIgj(4b8W}9Tt2Q{ zVLJO)1r?xJk2s$S)!+yyTf0qUnO4Z`+%k9##}$efRdSY#hVyT5X}Y+2Pfw~s&`+^y z<1(hj>_uJEW0~hT{%$d;=~R?cn#*Ha&)So!d>rlV(MGmnw~i;LaV8o%NmEHVm!)hu zkLuY~@a($GbG3;j%y%_2482VV=`Awa?%^g}_`L^YtAowEK8K_3e?EtY-QWIWb?ag@ U-`MG3tslaJM;#zEuI^*?-wg7v7XSbN literal 0 HcmV?d00001 diff --git a/venv/lib/python3.11/site-packages/cffi/__pycache__/_imp_emulation.cpython-311.pyc b/venv/lib/python3.11/site-packages/cffi/__pycache__/_imp_emulation.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..f41cd9e62fb259a337df86d96f57034e3553f3d3 GIT binary patch literal 4711 zcmb^!TWlN0agTST`1I*WO0q;cq9yr3CnoFqRV#{JS)y&)5~)ZsY7tEdig&V4<|}t6 z+mgvZF!I3y{$L8DR*MEz3frM;yU<4q6BV>|_P)U76pEN`a8l6mZB#jZHhEoYs(i|~sxISTtSfHIgVU1X| zzb#^8QDg^eh|p|Dq?0v97}gZAv*w6{wM3k(HPXe}BHiqcNDoWDk0Lu+JKOm_5$T0L z1OL7`O{?qZ204eW6JEzNth|>{i346rwZ`J_F7W~vO{C*jRja@yxR_Y0nRzifzr-gb zKBbxfUl7tOTnbw1K|00)VoJv1SNIesEQg*E(CafD1|$a9M9=gX7%=F-z=(kfKpehC z!EJDp=RXB-7YzA6k{V2e7IDW~8AlJ`|EN|&C-*;3(6tU7C&zG0{SJFw&e?2Bhu~f{TTprD2{PTPw!KW@COvW?* zYh3D@Kf%xYGt1JIbn3A0&>_FbOWeUsEPge1nG^l-g$3Rp<&&8xmt0E3BtD(;WtP7* zk0f|eil>vAlPjLfoD>z8K=1}9`bJ>cV+rvjAa#k|ppEDUu!<^(=zgmS%6+a1iFWp` z4c)iM-ETA*8ulETpl@R(un!^NO*J(aoe5u@9t#LNu`X5f2rj?{H-P^R;fE^DhkY<}Gano-8Z=b71%q6I7UB-cZ)&_q(8SBn)#ZIi?iHRNh#od)LmC=z;Z1 zCHkOjJXl?z#-WA*u^-W#MV`VZPii@pStPYcJ^=htqb~X-d}eEfCDt2ee%NjONLo~>4zi&8ik7ze_z0Zaf1xGuD!tlyx4=KGj!SfN zgza+_Akx4?vZU16lv*Gc$QdMIe^)E7Xy>fUAXIDD-J~p9>p1q6>i9j1a1- zb27a|r$+-QM4&lDz|*cx zwj*nPY<>XNe$?<7IZM`(g`EUEV|9;vEuj_nzEmv9?eip;M9DMHd14+>65jBn(vs(9 zZe`EDOia4c|eDAd}cZv351}>Wl^QD@~SQk*kYPbX`x5hgCz~TxWFek)i!nE zY;-(09T=MpPtR#FLbU{wnY18PHKEcOE~Of!^i?j!uW%~Oau8~yXni88QQ%@Mq&l3} zD&XZ7hH?LTE+q-eDpSjFqAaAUaVZTXLp6tKvalXe%}yo_)pVwk5Y1FQo_!k!IOo9kLj^aaDnN_q2QEKQuS)zv&dZ>c*rjbp% zOLh zRhXj{M4CpP+Fyel%CrA(`+dJQJdrlWAFe!JDeWIt_78tS5{?lFrH&Dhu#Hp<$l947 z(NrkW{R-U=3fMg59@pCJ`st$XNl+dGqU`FIcYk+d`V;%_-;s}8kX;vKXWI+;1c*J|cle|C?!8w*1{>%Kpwu~7FsxB) zT-oheKlZap7@$6Gv1`Lrat|x+;g^isS9bOm0=VNoFelSnwlev^Q~Rzpw&;}YzLMRi z*nP6qx8>-8l*F>5z~)coPi-84*xm9k7%mosAz{R`{%=+bN%G!{nWX^j?ecJ0OJiu25g)Z;rjC%0NT^3=DiEw zhT0u?j%-bM78_|6NRnCNF|o~IQWAD6wUVXUoi*I9bRjRP9eUM(FP0oQuC%~k=2P`F z*Ab{Et7qWIPE=*gliKN=$#8K2-z>fQrsEJMfFOhcsFVl-BA%#r#A_)n9w*8!gEQdc z!YnYS;1iDnfb-4tDU7cuZOoRKVTBpa8#d{k3O!hKZY+E{E7Rvo^m&CopQkoyXJPio zH*epRjeXU$oCtYcDhU@b;S_YGQur<=K&FZWtbpcit1i|F3~-KcoAX8I(`gADcPyh# z1FqV2R@KqIiCdn)U=)CAoe7LikDZGKrl-Txf(O$FFu-w9yNFB&YPYA8n2e_+d=K+z z?UFJcsPk20aB?boE*!p~`D@L~X{LCHw8?0e`qDU3b%G~_A3-NL9TpD*gdI*073yt* zaBWdta{K#YtHWMFlfY|(W=PHz5?*r#r2RruZk5y1Rm?lU) e%<+}rq7EAZ&a;Sf(_54g- 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 I6zjbI3*+A|0{{R3 literal 0 HcmV?d00001 diff --git a/venv/lib/python3.11/site-packages/cffi/__pycache__/cffi_opcode.cpython-311.pyc b/venv/lib/python3.11/site-packages/cffi/__pycache__/cffi_opcode.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..adfbca0b7fe07b6c85cf22434fa48dced5fa2f56 GIT binary patch literal 7139 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 Bg`xle literal 0 HcmV?d00001 diff --git a/venv/lib/python3.11/site-packages/cffi/__pycache__/commontypes.cpython-311.pyc b/venv/lib/python3.11/site-packages/cffi/__pycache__/commontypes.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..9f0cda3dd1a40de7d65a822f0964f6053f90e780 GIT binary patch literal 3301 zcmbUj?@t@q@vV2)KfsHP9dH5$mXPFPPS_Xn^GHY=9B6zc1O>PX+LN_-pYg(a*WF!1 zu;7HElS-wl%7<1L^?DLI>C&sBO8J;i{nCHHMk{5t5>lkRD>{e|ON5VXHXR;BL&`zM*y8*_-f7Ab_jKq3+;87&~uCDJmLcP+Rm zf-^FmXBHR=Noaxf5iVAC=RFG^3b_#WVD>RcKY>we6jE9T5cZxy8cm^jq%dpf0X>h_ zDByN2`|5n6Tl743fh3Gt!>s7O0jTH&%;#V&fVDc9A25z!pu^b_ky&mfkhI(AljwpU z`**q8ycvpZ%{FQ*27TC1^nKp*OF!(aO$>a776M`rU=X9__PPeKeZ{d*>%;7Bs7`(N z3;PN_2EvmDv3WJ{A~oZTSm-6;nR-dQ6{Bo6uZma(#5*yO8rL*c1H3)GgpG7Y&F57m zZLAltZZi|9$#L78PTfm87@HnbRoP}13G7H`vRNsel~utJE6Dgk+9uk@cECFFMI0vvbT<{ zA}wOP6Cp=D8?NRvJJk6RXm=f+f7l4u^+1f$8`PJO8(-1Qat~oI8$T|=Iuh<5kwCle z?C)re<2L;Ye7i|+GEKgroA%tuhhtuHeT2X=dV|Tjnoo~pK#iVp&BF=Sb2a9f(#TQ1 z4e8hzDk@S2B6Uc?Sj1wfeKv>rUr36muIW69P`-4LmvmlLV=w#@cR&SF>Ac<$|1r&BEq0 zvhCKeUX%@+b>wxTnkVh;Tq39Dabiu-z(gUDU%yo-Bo-xEmXxKTe5R0C#mZ_zmKGC* zbt9)L7vmQ$By`EZLj@tTA}nFuIf}&5l6t(bZiit#RbF*UOTBVwJgnLcL%$5QV+&PX zoovs3pkrs*4D^@1{RjK4;VL@8_8fuzVDx#A-wX1)UEeNLg4fL8wQY7kaO%<7Z^D(p zSu=39irRcXv7-IE7k0+CC$=XnF7!uicE-%k(K1K+ezf0=CZ4jD=oK@1{%qvgNR_6dcc@p03a6+y4y+=IOHoxf3U)o3+Y6j72Tt#I_U`1W zUUYtVx3pWTdgzWzuV^N6`3(Y4MNIqUY76QacpkmF7rpunR=#OQZ~pe~_QcNkcVPRu zZ_b*hM=F8qX5f0+d)Td>f!(=BpZw0fU8;DyEbvNkd$a6~)_OGtZaFwO(1YNn`?hCtIynm) zvEB9W-Xjh2+EZBc>I2MMAx~|)(wtW_pHRRn#<+x0XIO?5xYkNUTUz3cSM$*nHUyh$_ZvpO^tg7X0 zcd;PCm7`rI48%0Yzi+)a;4N2_@l7oWG?I7vEI_C(6lI~7E$3&UaJji#sJq#}#zKiuBg8{%c$QGS^c)Ae!3%8Jl&?J8&+k{SiJ+={++psxBI|id@p>hTka|op`frgz>Q7{PPG9(K#b?J z8#`C`=&mx|Wii3$Ok|IVluw?AUO72vo*b+&@0-l~<$ABui0KAiom9L(w4Xzd**N_- HDo+0w%Bn%( literal 0 HcmV?d00001 diff --git a/venv/lib/python3.11/site-packages/cffi/__pycache__/cparser.cpython-311.pyc b/venv/lib/python3.11/site-packages/cffi/__pycache__/cparser.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..51ecd1cb29ed983e4807977e1686ced77dcbd32d GIT binary patch literal 50052 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 T=kstjA$>{6*`(*o7z2L;b<{s| literal 0 HcmV?d00001 diff --git a/venv/lib/python3.11/site-packages/cffi/__pycache__/error.cpython-311.pyc b/venv/lib/python3.11/site-packages/cffi/__pycache__/error.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..4b183b5b4fecba95ae5f2feee78aae8e403e1a72 GIT binary patch literal 2124 zcmbVM-Af!-6uW3IyyTuy?0h! zQIL{{eGGk3ND4lrZ9*yi4+8xUEcmbt6jJ(>w-tSmJoTIz*L8PO}g?UY@dS=Z*xlhx+ujx+AJST_f`Sq9TqF1Hrs?Gx4)zxZ! z+V|B3+i`5SGEp^rb%nYss$(yxemz+9+z(2VlPb3ZI^pZavR40La@56Qe_N|3S~=I(w1MLw+oD#U^)Rdo28f%}vd|!T{GZH~G{} zb4m%xEA(5;gtE>mJWLs$$IMW+Y=?$2w2X$Arh|al3$=j8Gm-nY?w^SH`>sjXB6Tqp z%A7h@*k{xjqi&#?)NsNqI>Pw~Gw95%Rl~H;sAaElEUSWxVVYq^(|Eu%ZGGUh6{QnZ z26$cv*di@4of~exGxp@;-LIeAX?)QvT;DGg_Y0-QXU(B&`$OaVLlcde=HS)c@n$H&JnN5*!BcHe$F@@(?y z=y`q8 zuDD)zRTg!wEKsPG>ACbwb(jM2_ZH#?>JYF$95Xyy2oVc`kS3Rh&t6@);|)r2>8s_+ zUC*`bO5Eg+5>>FE-_^KAN_=y3$XW51D-%Yv@&6KfA0lH2qbOWMh%Q@H%@)&P?%tX~ zeVnuSs*WZ;8i%M9(e~~`@j81aj^q=D2Lf*-{tp10K|yHAf`A7!0gd_rYL7ZpIxoP< yNy4Mt0cwvr)Ubr^lCT4opgrnPc^NH}uv0uh?NNv7OS+3b@o28s=c)IoaQ^}O3)vF@ literal 0 HcmV?d00001 diff --git a/venv/lib/python3.11/site-packages/cffi/__pycache__/ffiplatform.cpython-311.pyc b/venv/lib/python3.11/site-packages/cffi/__pycache__/ffiplatform.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..916e526c290793b297e816912371374ddf8cfad9 GIT binary patch literal 6619 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 h6NF+#2wL$RwhUkopko!5P+}M}E7ssa^R= zT}JLhPOTZ_1BEw8Rx%yOZ<-Nn2-h+648u6gX1k1sw(m7;ujOZ2)aJ~zxLhkM?z@4{ zqdm@jp3PdPt{XQ-c$OarrN;mJJNS}AziYJZyNvcs9+{p=-FP<$=#lL>ws*YlHUrva zUY9!d5e?#~?R%S*jSU*w5nB(;X2(2cA#Ju=HkA*p1o5}N?fTZK!*=+bpqD=zJ`2-F zLP!dQ^Wk|z?G@)QtruKQaJjFbN>ja@OwvJGT<8N)>7PmUN-{;o7?lnNgT97pHPww| sl8z~>l5%8HohDOMQdR|JxFXiL(w5++SjJmY#(QlG9*Vn&PYMzC2M0>AEC2ui literal 0 HcmV?d00001 diff --git a/venv/lib/python3.11/site-packages/cffi/__pycache__/model.cpython-311.pyc b/venv/lib/python3.11/site-packages/cffi/__pycache__/model.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..86f35f50d6670a9d273850e56950ad2cab79f5ed GIT binary patch literal 33881 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 Wdl_xQ)up75*hf?^qm@J&;XeWC3W6s9 literal 0 HcmV?d00001 diff --git a/venv/lib/python3.11/site-packages/cffi/__pycache__/recompiler.cpython-311.pyc b/venv/lib/python3.11/site-packages/cffi/__pycache__/recompiler.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..f0b4cbe6c269bb8dfb109b2c03b27e28322efc97 GIT binary patch literal 90458 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 literal 0 HcmV?d00001 diff --git a/venv/lib/python3.11/site-packages/cffi/__pycache__/setuptools_ext.cpython-311.pyc b/venv/lib/python3.11/site-packages/cffi/__pycache__/setuptools_ext.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..f7f7656c21897eea8de1b8715cb4dd774edbede7 GIT binary patch literal 13239 zcmbtaeQX@Zb>F?+yW9I9kDsDUQq+o~L>?&~Es~-IS&~DMa`Zt_iY0$Uk$XAaF3F>g zcbDCzDALE8G1Tfvuoj)#6`M%NwM|^QP7x+(Pyt1Yx=jnCK!II$0Uj10N}w>%{71tM zAn2d=z1h3HFDa3ex#i=2%)EIs^X9$ZyqUkQsBlw|{;A<+VNPdm)Pvh7n5*v zj}j<>j#5|6|MXRwJln3?T$ISrRIFk@C9-XlWTz?7ewFzq6=P?pTkwB|7Hqevs}6wy z>J(U@oL~p)5*$F?f)l7m;DCAs`ZDEr{R%4{4b$2B@gI}@`vQbSS%7Dhnxf}vnzB(z zI!S#9xj(i_yhHn$QOO2*{j^a#9Fdi2B@&e{i^_E3v?RqPzs=Yk9vh1Ug7QRUYDyG> z0%Qu3ToN`MGB8u}IJuXR5zjwf%Ek?TE)S!E&~>kAw{+#^R6u{#k8-w2J1au3$oBcm8fJRX&U;w>eRm^JJo3MFw+ zj|cwb13(t240~KHzB2ATs(a6BSaY}P?pBp;{Q@#lVU#bI9B_lZ^~HYxxko8hpHNh3 zFCC%gZAn|YAV-b~MSTdjA6t*}42(AXK7^V+wrYb>_w1(*Q!+baGe?@HzDd#WOELmI zS3yzpjAFN#z}qAx*ggd5K1K;inr9Vf?j9s$VJzw595mDmTEUDyrricB-V(!p)?nia zF=num7!nL;I6jq#L`BI9jQn4_&Sg*k$ zLo6WG!($cv$$tT4f%>(Va#yA%7F(8Eb|~83uzEOC>AO3&G`2XgJdt8{7Qgtb1<%-5O>TIK$ zyJT$aO8sHxXY3K@L;8rbNC{Aph!PBgE*DG}8%-4r2(6&HWK;3r%591(_l2SaMnT2Q zCKw`6n*4N|w7C4h_P|#B4Qlk|%E17al$@ts@Ggz=mL-8L=5!4dZ=RWFW3Brsr6!*p zj7~k&QXp-T{(()fmrGJ;l$5$Whe@k#Y3$arlw^t}k*^Ald3%ycgNm0Y!6|UXeJQx+ zAltm-E7j>Ju2b>~?xaItkyDaTXrt!=GjA_yIRkIKN&64z2PHDYG^&7US$W?!?^O2W zrG`oAES8q0U`(7z_BkulJQq6vecocdprFrpKcUZkNfzp_dQdWQXcqGBphyF`q^-Di z*$oDrD=|OZZzspeVtj=+{ z2D5P9HSeDH%zNRzrMr?p=}p(>auxnBX+M-o7wBs~XVP2TGBCaFg<7SnAP4kj()A>h zs&tp;O1hIC;0Uw%V{1ld&2PQsPMMcqK07xQlE$Z}#F)Y>alReBT5u{ZOh-leL?94o z=clG+g}*NHAzoG_J}$vc6dWucAHx@i_*h)wAJfO?4qG|li!vedV{vJUZ%>4jiJt4z zk*EOP@fdQy8ImHQ>rt`YpdQnK$8^tQ20qO-@g0&lBY}_Q3xzO+^nhhn^V3nT%T&7;{jxL}Z!41&jpd(0FJ;vIes2IpMI`1tinF|6=&b%f1Wd^#rZ zkr;0_cy13LG5G^)=oeXQ%6h)G7 zHb5h0A~7L8BL}Br5%i?!PXW5@3WgGi=xo{7%3w$kf{EFzUKkbRIh=j;R~RfJE`x(! z49W>HY_`rv2Hos?;=;Yz!6yS_Fo2f~mpS4J002@NR6{lx$Y*%WAu;nh%)U0N%>M|r z#F!k318lf4Bgit^ZUO{y!~_IB6uUr|q_06fw3qUy;C~R5HLJzfXP)|%i66T)PnYiL z+M#Urfi12gW#4Mro96!frslLHuhr^~ z=ygXP+O@h9Dc6>#B3sI@dD?VO8;IaKOvrZCbE`w|`O=59s(?x^5T*8TYUnerV*PFW zead{wsFfoccR}YasN99^=7Z}ORo^gN3um@iZz{Mtp|R~c+peVY-k)%h%t)U*^c*`nC0I*#03JJ7Ac`9>CmX6nbHp&UVADmGEkx=Gm)z z_97Om%T!jU!i(avm|~!x3qRWI=V`2N0)JZr#~$|mEb?~|ec+5rF0A<+srfvq`8=ul zJpCDhICXbtP9tdhIb`#20)J}d8I3!ub7xiVY^L{!-utq~_AH!V*`+?`U+d2}-MW(u zvp?gjy*s-!yZF}fTPZffc{aJ$4X!oauW=nZ*P(J9+s=xGKiuMWtthLP(_I=D(7Aw` zyFTOUSA^A}bko|HI`HzRtThHO3~FsX`sJsYQ6u=ESjZ2)eBvg!-tnJbTJ)h4mRF+DT#1*?Q^a7}b8x858An;)Hqme1_ z$pZL>2>N0)xO@bBzqRt^PoCg=2heqbC!LnX04Y5jCoVP=RYWQ0A&IMovJr(3MRCD5 zYkF|mEJD`wWHHSvp&Q`p!y!pToB<9uj-Jtk717W*ACK{u$ikfO1sov2!=>4Pn^ZiM z{SZ-PF$!`{#HXX+j8W=E&~R`NJk(p zjrT-kd0Ol}+W-7vzuBo5WBltTW;n#pM3f0W*UQIG@O^>)L(mh@ldLCINZ=uEM$&TR$*Qd z!_ds=EZ@=leDCvq>_z}=5@;(7dnA#-(Tm66J7{QM;0ScJC`O?#p`Fv?6EFmq<3ywx zu{|2)$0IjIqM9K81S+jGOLPk~y`&u|PqsUZg{hcmeEcKYa7$t?o?%oL&m^O& zbT~()MwpzxLUP6MU78Jk{p?6^`0VAuQzNH`=Z>7sO@U%QC$31-1ZneQk|=g76F94& z`6l3g*{Bf2u}Dk|PKCl!Tn1cR7aRg)8yvkD965X8?3L5Q!NE&sNBuPt8c^vJ5CDS! zz@%Y(4&XBbN@Mt5y?nZ`h~dr~0E3Cd6vGn?W=97=w<`g|5K&-CNgc?;1w6v>*jQxT zsDzdW&3jx57z{icY$P@oCp+cwM1&?DtPMg|#IXe?O}Yx1&cUDjD#Sq+sGU~I-mS8S3a<>iS1rD_x!q}2 z<=Wu-+t+__Sv@wQbzjiC!5z0{sv7mG&K-tw9oXicQ*+mjjdOKwwRf%^)4K*YyUuTP zo&R)5>$;?OT~fdCir#fuYrmqmUs1hn8DINa?}o2i^>t_b-7BnGe?Y4`_~_A=@3|d{ zbph712uB_4Obx5m`!sK>O0FFjd_-{MrMPO{xmV>6YtCNX*$buY?HP~n?$M>AYF(S= zIiPzEAi4tB==I$_vvfwSAJM!QbngY#dtrOu!4#`j?9sTEZKvnXt#@vzRlMfhr#tth zUsau*aP2rKSH)f5l5f?wR-GBPpU_Loc0}WftQuvB!fS{3|z#!bA@7V4zci21bJDxkn@IfUYz zVwb#A_N7Ylj*U8|oJ&5qw~y2F94xe-7>r8V(-!)GdaWclN^t<$uN2o}7Qgq6js!Z8ZK0w3l7zZ(O*HT52%7?2KoZ}GH z4O-!=!f#IwWi6Ir2`FQsm!}{VSJF|8*p>hQew|9WLB@(PMsVNe1ka+oILI*XO1cVp z3ob-hB$iug1{1*AxyhsnR}81Q zoI|t3;tEmvHsmQnsi-3uRQUo1nEHT&7&tuS(j>eyQyMUAc}h}?+@c4AY{e~}w=Fu- zsBL9Qpp&*asIzq3ZPcQ(G~y278Tz|k+_6|>7fUpOrWRdkwv0WzShRyoZU~gY*N?3n z^GuSF>z^uBSr|5HyG(t=jLtnbF2+R31QuwtvvCamfHYT=16b3EZYAC=gcQ+lm;4}t z)Ct63C*zTr^eWy~Oaa&mhO^-dzt?amQwbp=8P0?x2Bqnk;Rusuyy2WqAR|FKihN!~ zLX7br;2o-jX_imm-AN!MvW*saA)B&+dQu@Q@aOgxMG^wXqj89p$R`824DTS5KLhe; zf!eCBeZS#e^Y@xp$I>^{{$cIluvUFquRfh}z>?}Nx5TN{ht_Ut)kidLK<5TjZXm-| zrW~o8igy{*tF@YUkM7;0diP{%nm21YH)=Z9`qn)UU;F3R zw3-pUW+dgz_;#U*?6NGRU-NeA-cHrqneo-9DkQWc(wjiS@Moo*Zhe8#n-7?Klt|$o z+f`eN0y|)XSw`RHt}+6QqMv!}e@Y)%(+Rv9j1P2I(KZ_TYce&~vXv|{la>U9%O$~f zgG>*pQ^^Si`C$8oflVNIQ?P+UgQBxA(XHtOF@CtuZxa>Qfg`?Xd-7B&pDx5)u%@|? zf>2Z%2jXYRtT&v10x&`afiR2}1{HBCVKAV4unWW@kSDp#Fj+7hg(#e9#f3dcW3qRBt@G z;>_&xr+2Tl{iNsN3);RRec#Xu^S)%ZQAR&v&3K+W zm<^o)Q1S+Y-vJbC#wv;AU_B)eq@Z~?Y`Ml6HRXCCMIi&u5*g^9`NR(?I;)Q1+ zrZV3I4j;i*>!{ynH0P030D$ZiEVKev?L_TO)My!di5P>*{kP%{{Q-V33SK!fKCG}%*Vp~wZB+HnX;14Go@h*lNqN-U3BB9g;y><#8 zQ8P?|hT%@e#WMeGNCXjnjU-cD`Yj*`^J)X>~|r zd7b4|mfx1?msWjDuRgYLZpUV~gI+xwS-tu>=KM0B-AlFhFAU$l zu+pWmEh@Q)28Iia6lF!JQaN1cyu;mbnaHpJ6Jn$)hY8s%7Gwbzx~CjV9`bCDI;XfL zFO3!$v5qa}9kUCL+uRZ&8w(FUEgA*ehDC;O$w^R?Gvy-ooCDP4T6C6}Q;19z@)n$^ z(D25>c)tVYE5`!AU3zztEs>rh(sNnqJs`bzkt>njk#rPE??&l~5wEZ|kT}yEBxa>+ z@X>E8fCEGD;>ix{f8omq_IuPKlZLzU1SpJp3JPNt%QaC2ZtB@wP${Ydyk#M%g*pebx z^6D%Qrak1nT-7e3RRP zBg;1eNp52~6!bSBu4n0aL|i{dHt3^K`O08Zrt!dLW7kF_D3;dvyx#bH>U_rAuxd+P zOkG^QxH_$Q+wgYrV#d2WHS(b5e#8CdwD6;t`rOd^TR_Z9^A79YVKsM|{-toNuvZC) zeiv>&u-!xJ40mQS541?NDQ1jD#Ga&wOU_ckdOepJfp8&b>wT%d;0d>Usms)USV0!P z$(^+G+lr6PS)%g5`UCnNh2erX-SeOVi?$m?QGN;{zGqwZfZ0JPLx`U-Y=P$uddeI( z%m-$Jn2g8n;~3(`5ar3a(We=VvS|~*_+54*7B|-Aym86%`$wop?gj#*3-i4FWS*>j zBXg*Gy=mjnarMw~h?8~rGvpSY$N)h!z-=j!Oai4v)xnB^sArWNx(VA7`K%@YBf4Akv*_3coT#lN9|4IDZhQJe5vY2=h?+ zK$G;nMefPLrgCF1&`*ISc-+?ZM+Hux7?{98PU^|PL?}52hGC<$o znul#%p`b?d>=_0u7oAGMIk`!M6(l`HcD6L=SzHf5?JV%|+szFPDFy5#^zWtz;)uo? z&PdEWs6t$k0H2L|v@5V#5sF6UU|wezoQ4lyXAj-N$zCb%xBM<*2&5$}?aXE&RT-Xw z0)~qm|1poC;3*q3d=TuF@>2z88BbDf!Vod%0?)2)=+piS*vP*C0<#Gm)26q1!`r-i z1)}phiO$10faT;4<*XQ@w_E(1Ej=48J?o6t(yzDluXr+zdw$sQ{f_jDYx25nP1g7K zX^s7QV?V?jn)Yrs9oc9)vOcLb4eCvUD_o}K;AYFfM$5qZjMnm!-trQZZ*E_+-M_dd zYR!Esu1r<)iub`Q_h0|vweMeB>sp`H_6+KK2DPeFdetd4ckTF47*ixNOGhOcE2wca*d7`GL1|DFgL3HUBWGsk4kOhBn z@Igvq7K|xKD@ZWd;IAl+E)ZrUra-JyK8}!YexCO*urSXWnNftoAVM$Jf#k0+6E0Wt zA%qOuuNGgK;)ntS7|QdQMashoJFMLf*!dYrB~`P_TD>1zyQNhh)vJ%<>b=Siru*5* z>bcJ`=a>2Ht<=6=vU=~-*gZRS5K6fHw(4xjG&ZN$Wgi3*ZeQGF8#ma-)fe-pf*e%c z?)Oh@*0ycbwxz$d?$>IM>$S%hMs{p&J8H~VqpR0GCndftEVt_`MHSF_0_FpBXNE{+ z+d1kTy6Bv}t#HLzyo#2Xqz(3&;N1N%^=3`U`FJ=XU!0q!mTL(rw~ZQJ4A$quU@+JA zqw=&N`5F)aI2Z#nSP~Dl!(RThXm|>Xu<#kJl?iXs@FXGmZ}^ij7zftJ<6Ako;n}C= zt}SQv%7F)snzK!J!oe@vzB^OBYsHzeZ#OjKBd*5mT`A8N*Raa2-q5&Co$FM|1&g)p zXA_@Qm?n4xDw1A7f|47qQP{yDrwyfp_!76?$U%J4CKCN4K{hf;h`1(5Mbm4-QSP|8 zSUoBI7~Y}plK&G3R8P|x%C$g#8Opstei^Dt&0TQbjIM|9+QPYobB{94Du84(p0dl5 z?dm%G0!nX(S1>PkI2(<)El1pL8V+h%q_K-01$8W-SLrSqxLV{YeSq%Yp)B$SeGH#1 ba*KA*(4*yq?1;Q;tES#_HZk9)o0$IxK+8Cd literal 0 HcmV?d00001 diff --git a/venv/lib/python3.11/site-packages/cffi/__pycache__/vengine_cpy.cpython-311.pyc b/venv/lib/python3.11/site-packages/cffi/__pycache__/vengine_cpy.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..c852136b190632dadf5e49745866162fae2359fe GIT binary patch literal 57445 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 literal 0 HcmV?d00001 diff --git a/venv/lib/python3.11/site-packages/cffi/__pycache__/vengine_gen.cpython-311.pyc b/venv/lib/python3.11/site-packages/cffi/__pycache__/vengine_gen.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..843491a29149fd7250aecb43702e5a26053662fe GIT binary patch literal 38354 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 literal 0 HcmV?d00001 diff --git a/venv/lib/python3.11/site-packages/cffi/__pycache__/verifier.cpython-311.pyc b/venv/lib/python3.11/site-packages/cffi/__pycache__/verifier.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..9c64fdde013e740cfbb2edc83d680bbbacaf6382 GIT binary patch literal 18088 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 literal 0 HcmV?d00001 diff --git a/venv/lib/python3.11/site-packages/cffi/_cffi_errors.h b/venv/lib/python3.11/site-packages/cffi/_cffi_errors.h new file mode 100644 index 0000000..158e059 --- /dev/null +++ b/venv/lib/python3.11/site-packages/cffi/_cffi_errors.h @@ -0,0 +1,149 @@ +#ifndef CFFI_MESSAGEBOX +# ifdef _MSC_VER +# define CFFI_MESSAGEBOX 1 +# else +# define CFFI_MESSAGEBOX 0 +# endif +#endif + + +#if CFFI_MESSAGEBOX +/* Windows only: logic to take the Python-CFFI embedding logic + initialization errors and display them in a background thread + with MessageBox. The idea is that if the whole program closes + as a result of this problem, then likely it is already a console + program and you can read the stderr output in the console too. + If it is not a console program, then it will likely show its own + dialog to complain, or generally not abruptly close, and for this + case the background thread should stay alive. +*/ +static void *volatile _cffi_bootstrap_text; + +static PyObject *_cffi_start_error_capture(void) +{ + PyObject *result = NULL; + PyObject *x, *m, *bi; + + if (InterlockedCompareExchangePointer(&_cffi_bootstrap_text, + (void *)1, NULL) != NULL) + return (PyObject *)1; + + m = PyImport_AddModule("_cffi_error_capture"); + if (m == NULL) + goto error; + + result = PyModule_GetDict(m); + if (result == NULL) + goto error; + +#if PY_MAJOR_VERSION >= 3 + bi = PyImport_ImportModule("builtins"); +#else + bi = PyImport_ImportModule("__builtin__"); +#endif + if (bi == NULL) + goto error; + PyDict_SetItemString(result, "__builtins__", bi); + Py_DECREF(bi); + + x = PyRun_String( + "import sys\n" + "class FileLike:\n" + " def write(self, x):\n" + " try:\n" + " of.write(x)\n" + " except: pass\n" + " self.buf += x\n" + " def flush(self):\n" + " pass\n" + "fl = FileLike()\n" + "fl.buf = ''\n" + "of = sys.stderr\n" + "sys.stderr = fl\n" + "def done():\n" + " sys.stderr = of\n" + " return fl.buf\n", /* make sure the returned value stays alive */ + Py_file_input, + result, result); + Py_XDECREF(x); + + error: + if (PyErr_Occurred()) + { + PyErr_WriteUnraisable(Py_None); + PyErr_Clear(); + } + return result; +} + +#pragma comment(lib, "user32.lib") + +static DWORD WINAPI _cffi_bootstrap_dialog(LPVOID ignored) +{ + Sleep(666); /* may be interrupted if the whole process is closing */ +#if PY_MAJOR_VERSION >= 3 + MessageBoxW(NULL, (wchar_t *)_cffi_bootstrap_text, + L"Python-CFFI error", + MB_OK | MB_ICONERROR); +#else + MessageBoxA(NULL, (char *)_cffi_bootstrap_text, + "Python-CFFI error", + MB_OK | MB_ICONERROR); +#endif + _cffi_bootstrap_text = NULL; + return 0; +} + +static void _cffi_stop_error_capture(PyObject *ecap) +{ + PyObject *s; + void *text; + + if (ecap == (PyObject *)1) + return; + + if (ecap == NULL) + goto error; + + s = PyRun_String("done()", Py_eval_input, ecap, ecap); + if (s == NULL) + goto error; + + /* Show a dialog box, but in a background thread, and + never show multiple dialog boxes at once. */ +#if PY_MAJOR_VERSION >= 3 + text = PyUnicode_AsWideCharString(s, NULL); +#else + text = PyString_AsString(s); +#endif + + _cffi_bootstrap_text = text; + + if (text != NULL) + { + HANDLE h; + h = CreateThread(NULL, 0, _cffi_bootstrap_dialog, + NULL, 0, NULL); + if (h != NULL) + CloseHandle(h); + } + /* decref the string, but it should stay alive as 'fl.buf' + in the small module above. It will really be freed only if + we later get another similar error. So it's a leak of at + most one copy of the small module. That's fine for this + situation which is usually a "fatal error" anyway. */ + Py_DECREF(s); + PyErr_Clear(); + return; + + error: + _cffi_bootstrap_text = NULL; + PyErr_Clear(); +} + +#else + +static PyObject *_cffi_start_error_capture(void) { return NULL; } +static void _cffi_stop_error_capture(PyObject *ecap) { } + +#endif diff --git a/venv/lib/python3.11/site-packages/cffi/_cffi_include.h b/venv/lib/python3.11/site-packages/cffi/_cffi_include.h new file mode 100644 index 0000000..908a1d7 --- /dev/null +++ b/venv/lib/python3.11/site-packages/cffi/_cffi_include.h @@ -0,0 +1,389 @@ +#define _CFFI_ + +/* We try to define Py_LIMITED_API before including Python.h. + + Mess: we can only define it if Py_DEBUG, Py_TRACE_REFS and + Py_REF_DEBUG are not defined. This is a best-effort approximation: + we can learn about Py_DEBUG from pyconfig.h, but it is unclear if + the same works for the other two macros. Py_DEBUG implies them, + but not the other way around. + + The implementation is messy (issue #350): on Windows, with _MSC_VER, + we have to define Py_LIMITED_API even before including pyconfig.h. + In that case, we guess what pyconfig.h will do to the macros above, + and check our guess after the #include. + + Note that on Windows, with CPython 3.x, you need >= 3.5 and virtualenv + version >= 16.0.0. With older versions of either, you don't get a + copy of PYTHON3.DLL in the virtualenv. We can't check the version of + CPython *before* we even include pyconfig.h. ffi.set_source() puts + a ``#define _CFFI_NO_LIMITED_API'' at the start of this file if it is + running on Windows < 3.5, as an attempt at fixing it, but that's + arguably wrong because it may not be the target version of Python. + Still better than nothing I guess. As another workaround, you can + remove the definition of Py_LIMITED_API here. + + See also 'py_limited_api' in cffi/setuptools_ext.py. +*/ +#if !defined(_CFFI_USE_EMBEDDING) && !defined(Py_LIMITED_API) +# ifdef _MSC_VER +# if !defined(_DEBUG) && !defined(Py_DEBUG) && !defined(Py_TRACE_REFS) && !defined(Py_REF_DEBUG) && !defined(_CFFI_NO_LIMITED_API) +# define Py_LIMITED_API +# endif +# include + /* sanity-check: Py_LIMITED_API will cause crashes if any of these + are also defined. Normally, the Python file PC/pyconfig.h does not + cause any of these to be defined, with the exception that _DEBUG + causes Py_DEBUG. Double-check that. */ +# ifdef Py_LIMITED_API +# if defined(Py_DEBUG) +# error "pyconfig.h unexpectedly defines Py_DEBUG, but Py_LIMITED_API is set" +# endif +# if defined(Py_TRACE_REFS) +# error "pyconfig.h unexpectedly defines Py_TRACE_REFS, but Py_LIMITED_API is set" +# endif +# if defined(Py_REF_DEBUG) +# error "pyconfig.h unexpectedly defines Py_REF_DEBUG, but Py_LIMITED_API is set" +# endif +# endif +# else +# include +# if !defined(Py_DEBUG) && !defined(Py_TRACE_REFS) && !defined(Py_REF_DEBUG) && !defined(_CFFI_NO_LIMITED_API) +# define Py_LIMITED_API +# endif +# endif +#endif + +#include +#ifdef __cplusplus +extern "C" { +#endif +#include +#include "parse_c_type.h" + +/* this block of #ifs should be kept exactly identical between + c/_cffi_backend.c, cffi/vengine_cpy.py, cffi/vengine_gen.py + and cffi/_cffi_include.h */ +#if defined(_MSC_VER) +# include /* for alloca() */ +# if _MSC_VER < 1600 /* MSVC < 2010 */ + typedef __int8 int8_t; + typedef __int16 int16_t; + typedef __int32 int32_t; + typedef __int64 int64_t; + typedef unsigned __int8 uint8_t; + typedef unsigned __int16 uint16_t; + typedef unsigned __int32 uint32_t; + typedef unsigned __int64 uint64_t; + typedef __int8 int_least8_t; + typedef __int16 int_least16_t; + typedef __int32 int_least32_t; + typedef __int64 int_least64_t; + typedef unsigned __int8 uint_least8_t; + typedef unsigned __int16 uint_least16_t; + typedef unsigned __int32 uint_least32_t; + typedef unsigned __int64 uint_least64_t; + typedef __int8 int_fast8_t; + typedef __int16 int_fast16_t; + typedef __int32 int_fast32_t; + typedef __int64 int_fast64_t; + typedef unsigned __int8 uint_fast8_t; + typedef unsigned __int16 uint_fast16_t; + typedef unsigned __int32 uint_fast32_t; + typedef unsigned __int64 uint_fast64_t; + typedef __int64 intmax_t; + typedef unsigned __int64 uintmax_t; +# else +# include +# endif +# if _MSC_VER < 1800 /* MSVC < 2013 */ +# ifndef __cplusplus + typedef unsigned char _Bool; +# endif +# endif +# define _cffi_float_complex_t _Fcomplex /* include for it */ +# define _cffi_double_complex_t _Dcomplex /* include for it */ +#else +# include +# if (defined (__SVR4) && defined (__sun)) || defined(_AIX) || defined(__hpux) +# include +# endif +# define _cffi_float_complex_t float _Complex +# define _cffi_double_complex_t double _Complex +#endif + +#ifdef __GNUC__ +# define _CFFI_UNUSED_FN __attribute__((unused)) +#else +# define _CFFI_UNUSED_FN /* nothing */ +#endif + +#ifdef __cplusplus +# ifndef _Bool + typedef bool _Bool; /* semi-hackish: C++ has no _Bool; bool is builtin */ +# endif +#endif + +/********** CPython-specific section **********/ +#ifndef PYPY_VERSION + + +#if PY_MAJOR_VERSION >= 3 +# define PyInt_FromLong PyLong_FromLong +#endif + +#define _cffi_from_c_double PyFloat_FromDouble +#define _cffi_from_c_float PyFloat_FromDouble +#define _cffi_from_c_long PyInt_FromLong +#define _cffi_from_c_ulong PyLong_FromUnsignedLong +#define _cffi_from_c_longlong PyLong_FromLongLong +#define _cffi_from_c_ulonglong PyLong_FromUnsignedLongLong +#define _cffi_from_c__Bool PyBool_FromLong + +#define _cffi_to_c_double PyFloat_AsDouble +#define _cffi_to_c_float PyFloat_AsDouble + +#define _cffi_from_c_int(x, type) \ + (((type)-1) > 0 ? /* unsigned */ \ + (sizeof(type) < sizeof(long) ? \ + PyInt_FromLong((long)x) : \ + sizeof(type) == sizeof(long) ? \ + PyLong_FromUnsignedLong((unsigned long)x) : \ + PyLong_FromUnsignedLongLong((unsigned long long)x)) : \ + (sizeof(type) <= sizeof(long) ? \ + PyInt_FromLong((long)x) : \ + PyLong_FromLongLong((long long)x))) + +#define _cffi_to_c_int(o, type) \ + ((type)( \ + sizeof(type) == 1 ? (((type)-1) > 0 ? (type)_cffi_to_c_u8(o) \ + : (type)_cffi_to_c_i8(o)) : \ + sizeof(type) == 2 ? (((type)-1) > 0 ? (type)_cffi_to_c_u16(o) \ + : (type)_cffi_to_c_i16(o)) : \ + sizeof(type) == 4 ? (((type)-1) > 0 ? (type)_cffi_to_c_u32(o) \ + : (type)_cffi_to_c_i32(o)) : \ + sizeof(type) == 8 ? (((type)-1) > 0 ? (type)_cffi_to_c_u64(o) \ + : (type)_cffi_to_c_i64(o)) : \ + (Py_FatalError("unsupported size for type " #type), (type)0))) + +#define _cffi_to_c_i8 \ + ((int(*)(PyObject *))_cffi_exports[1]) +#define _cffi_to_c_u8 \ + ((int(*)(PyObject *))_cffi_exports[2]) +#define _cffi_to_c_i16 \ + ((int(*)(PyObject *))_cffi_exports[3]) +#define _cffi_to_c_u16 \ + ((int(*)(PyObject *))_cffi_exports[4]) +#define _cffi_to_c_i32 \ + ((int(*)(PyObject *))_cffi_exports[5]) +#define _cffi_to_c_u32 \ + ((unsigned int(*)(PyObject *))_cffi_exports[6]) +#define _cffi_to_c_i64 \ + ((long long(*)(PyObject *))_cffi_exports[7]) +#define _cffi_to_c_u64 \ + ((unsigned long long(*)(PyObject *))_cffi_exports[8]) +#define _cffi_to_c_char \ + ((int(*)(PyObject *))_cffi_exports[9]) +#define _cffi_from_c_pointer \ + ((PyObject *(*)(char *, struct _cffi_ctypedescr *))_cffi_exports[10]) +#define _cffi_to_c_pointer \ + ((char *(*)(PyObject *, struct _cffi_ctypedescr *))_cffi_exports[11]) +#define _cffi_get_struct_layout \ + not used any more +#define _cffi_restore_errno \ + ((void(*)(void))_cffi_exports[13]) +#define _cffi_save_errno \ + ((void(*)(void))_cffi_exports[14]) +#define _cffi_from_c_char \ + ((PyObject *(*)(char))_cffi_exports[15]) +#define _cffi_from_c_deref \ + ((PyObject *(*)(char *, struct _cffi_ctypedescr *))_cffi_exports[16]) +#define _cffi_to_c \ + ((int(*)(char *, struct _cffi_ctypedescr *, PyObject *))_cffi_exports[17]) +#define _cffi_from_c_struct \ + ((PyObject *(*)(char *, struct _cffi_ctypedescr *))_cffi_exports[18]) +#define _cffi_to_c_wchar_t \ + ((_cffi_wchar_t(*)(PyObject *))_cffi_exports[19]) +#define _cffi_from_c_wchar_t \ + ((PyObject *(*)(_cffi_wchar_t))_cffi_exports[20]) +#define _cffi_to_c_long_double \ + ((long double(*)(PyObject *))_cffi_exports[21]) +#define _cffi_to_c__Bool \ + ((_Bool(*)(PyObject *))_cffi_exports[22]) +#define _cffi_prepare_pointer_call_argument \ + ((Py_ssize_t(*)(struct _cffi_ctypedescr *, \ + PyObject *, char **))_cffi_exports[23]) +#define _cffi_convert_array_from_object \ + ((int(*)(char *, struct _cffi_ctypedescr *, PyObject *))_cffi_exports[24]) +#define _CFFI_CPIDX 25 +#define _cffi_call_python \ + ((void(*)(struct _cffi_externpy_s *, char *))_cffi_exports[_CFFI_CPIDX]) +#define _cffi_to_c_wchar3216_t \ + ((int(*)(PyObject *))_cffi_exports[26]) +#define _cffi_from_c_wchar3216_t \ + ((PyObject *(*)(int))_cffi_exports[27]) +#define _CFFI_NUM_EXPORTS 28 + +struct _cffi_ctypedescr; + +static void *_cffi_exports[_CFFI_NUM_EXPORTS]; + +#define _cffi_type(index) ( \ + assert((((uintptr_t)_cffi_types[index]) & 1) == 0), \ + (struct _cffi_ctypedescr *)_cffi_types[index]) + +static PyObject *_cffi_init(const char *module_name, Py_ssize_t version, + const struct _cffi_type_context_s *ctx) +{ + PyObject *module, *o_arg, *new_module; + void *raw[] = { + (void *)module_name, + (void *)version, + (void *)_cffi_exports, + (void *)ctx, + }; + + module = PyImport_ImportModule("_cffi_backend"); + if (module == NULL) + goto failure; + + o_arg = PyLong_FromVoidPtr((void *)raw); + if (o_arg == NULL) + goto failure; + + new_module = PyObject_CallMethod( + module, (char *)"_init_cffi_1_0_external_module", (char *)"O", o_arg); + + Py_DECREF(o_arg); + Py_DECREF(module); + return new_module; + + failure: + Py_XDECREF(module); + return NULL; +} + + +#ifdef HAVE_WCHAR_H +typedef wchar_t _cffi_wchar_t; +#else +typedef uint16_t _cffi_wchar_t; /* same random pick as _cffi_backend.c */ +#endif + +_CFFI_UNUSED_FN static uint16_t _cffi_to_c_char16_t(PyObject *o) +{ + if (sizeof(_cffi_wchar_t) == 2) + return (uint16_t)_cffi_to_c_wchar_t(o); + else + return (uint16_t)_cffi_to_c_wchar3216_t(o); +} + +_CFFI_UNUSED_FN static PyObject *_cffi_from_c_char16_t(uint16_t x) +{ + if (sizeof(_cffi_wchar_t) == 2) + return _cffi_from_c_wchar_t((_cffi_wchar_t)x); + else + return _cffi_from_c_wchar3216_t((int)x); +} + +_CFFI_UNUSED_FN static int _cffi_to_c_char32_t(PyObject *o) +{ + if (sizeof(_cffi_wchar_t) == 4) + return (int)_cffi_to_c_wchar_t(o); + else + return (int)_cffi_to_c_wchar3216_t(o); +} + +_CFFI_UNUSED_FN static PyObject *_cffi_from_c_char32_t(unsigned int x) +{ + if (sizeof(_cffi_wchar_t) == 4) + return _cffi_from_c_wchar_t((_cffi_wchar_t)x); + else + return _cffi_from_c_wchar3216_t((int)x); +} + +union _cffi_union_alignment_u { + unsigned char m_char; + unsigned short m_short; + unsigned int m_int; + unsigned long m_long; + unsigned long long m_longlong; + float m_float; + double m_double; + long double m_longdouble; +}; + +struct _cffi_freeme_s { + struct _cffi_freeme_s *next; + union _cffi_union_alignment_u alignment; +}; + +_CFFI_UNUSED_FN static int +_cffi_convert_array_argument(struct _cffi_ctypedescr *ctptr, PyObject *arg, + char **output_data, Py_ssize_t datasize, + struct _cffi_freeme_s **freeme) +{ + char *p; + if (datasize < 0) + return -1; + + p = *output_data; + if (p == NULL) { + struct _cffi_freeme_s *fp = (struct _cffi_freeme_s *)PyObject_Malloc( + offsetof(struct _cffi_freeme_s, alignment) + (size_t)datasize); + if (fp == NULL) + return -1; + fp->next = *freeme; + *freeme = fp; + p = *output_data = (char *)&fp->alignment; + } + memset((void *)p, 0, (size_t)datasize); + return _cffi_convert_array_from_object(p, ctptr, arg); +} + +_CFFI_UNUSED_FN static void +_cffi_free_array_arguments(struct _cffi_freeme_s *freeme) +{ + do { + void *p = (void *)freeme; + freeme = freeme->next; + PyObject_Free(p); + } while (freeme != NULL); +} + +/********** end CPython-specific section **********/ +#else +_CFFI_UNUSED_FN +static void (*_cffi_call_python_org)(struct _cffi_externpy_s *, char *); +# define _cffi_call_python _cffi_call_python_org +#endif + + +#define _cffi_array_len(array) (sizeof(array) / sizeof((array)[0])) + +#define _cffi_prim_int(size, sign) \ + ((size) == 1 ? ((sign) ? _CFFI_PRIM_INT8 : _CFFI_PRIM_UINT8) : \ + (size) == 2 ? ((sign) ? _CFFI_PRIM_INT16 : _CFFI_PRIM_UINT16) : \ + (size) == 4 ? ((sign) ? _CFFI_PRIM_INT32 : _CFFI_PRIM_UINT32) : \ + (size) == 8 ? ((sign) ? _CFFI_PRIM_INT64 : _CFFI_PRIM_UINT64) : \ + _CFFI__UNKNOWN_PRIM) + +#define _cffi_prim_float(size) \ + ((size) == sizeof(float) ? _CFFI_PRIM_FLOAT : \ + (size) == sizeof(double) ? _CFFI_PRIM_DOUBLE : \ + (size) == sizeof(long double) ? _CFFI__UNKNOWN_LONG_DOUBLE : \ + _CFFI__UNKNOWN_FLOAT_PRIM) + +#define _cffi_check_int(got, got_nonpos, expected) \ + ((got_nonpos) == (expected <= 0) && \ + (got) == (unsigned long long)expected) + +#ifdef MS_WIN32 +# define _cffi_stdcall __stdcall +#else +# define _cffi_stdcall /* nothing */ +#endif + +#ifdef __cplusplus +} +#endif diff --git a/venv/lib/python3.11/site-packages/cffi/_embedding.h b/venv/lib/python3.11/site-packages/cffi/_embedding.h new file mode 100644 index 0000000..64c04f6 --- /dev/null +++ b/venv/lib/python3.11/site-packages/cffi/_embedding.h @@ -0,0 +1,550 @@ + +/***** Support code for embedding *****/ + +#ifdef __cplusplus +extern "C" { +#endif + + +#if defined(_WIN32) +# define CFFI_DLLEXPORT __declspec(dllexport) +#elif defined(__GNUC__) +# define CFFI_DLLEXPORT __attribute__((visibility("default"))) +#else +# define CFFI_DLLEXPORT /* nothing */ +#endif + + +/* There are two global variables of type _cffi_call_python_fnptr: + + * _cffi_call_python, which we declare just below, is the one called + by ``extern "Python"`` implementations. + + * _cffi_call_python_org, which on CPython is actually part of the + _cffi_exports[] array, is the function pointer copied from + _cffi_backend. If _cffi_start_python() fails, then this is set + to NULL; otherwise, it should never be NULL. + + After initialization is complete, both are equal. However, the + first one remains equal to &_cffi_start_and_call_python until the + very end of initialization, when we are (or should be) sure that + concurrent threads also see a completely initialized world, and + only then is it changed. +*/ +#undef _cffi_call_python +typedef void (*_cffi_call_python_fnptr)(struct _cffi_externpy_s *, char *); +static void _cffi_start_and_call_python(struct _cffi_externpy_s *, char *); +static _cffi_call_python_fnptr _cffi_call_python = &_cffi_start_and_call_python; + + +#ifndef _MSC_VER + /* --- Assuming a GCC not infinitely old --- */ +# define cffi_compare_and_swap(l,o,n) __sync_bool_compare_and_swap(l,o,n) +# define cffi_write_barrier() __sync_synchronize() +# if !defined(__amd64__) && !defined(__x86_64__) && \ + !defined(__i386__) && !defined(__i386) +# define cffi_read_barrier() __sync_synchronize() +# else +# define cffi_read_barrier() (void)0 +# endif +#else + /* --- Windows threads version --- */ +# include +# define cffi_compare_and_swap(l,o,n) \ + (InterlockedCompareExchangePointer(l,n,o) == (o)) +# define cffi_write_barrier() InterlockedCompareExchange(&_cffi_dummy,0,0) +# define cffi_read_barrier() (void)0 +static volatile LONG _cffi_dummy; +#endif + +#ifdef WITH_THREAD +# ifndef _MSC_VER +# include + static pthread_mutex_t _cffi_embed_startup_lock; +# else + static CRITICAL_SECTION _cffi_embed_startup_lock; +# endif + static char _cffi_embed_startup_lock_ready = 0; +#endif + +static void _cffi_acquire_reentrant_mutex(void) +{ + static void *volatile lock = NULL; + + while (!cffi_compare_and_swap(&lock, NULL, (void *)1)) { + /* should ideally do a spin loop instruction here, but + hard to do it portably and doesn't really matter I + think: pthread_mutex_init() should be very fast, and + this is only run at start-up anyway. */ + } + +#ifdef WITH_THREAD + if (!_cffi_embed_startup_lock_ready) { +# ifndef _MSC_VER + pthread_mutexattr_t attr; + pthread_mutexattr_init(&attr); + pthread_mutexattr_settype(&attr, PTHREAD_MUTEX_RECURSIVE); + pthread_mutex_init(&_cffi_embed_startup_lock, &attr); +# else + InitializeCriticalSection(&_cffi_embed_startup_lock); +# endif + _cffi_embed_startup_lock_ready = 1; + } +#endif + + while (!cffi_compare_and_swap(&lock, (void *)1, NULL)) + ; + +#ifndef _MSC_VER + pthread_mutex_lock(&_cffi_embed_startup_lock); +#else + EnterCriticalSection(&_cffi_embed_startup_lock); +#endif +} + +static void _cffi_release_reentrant_mutex(void) +{ +#ifndef _MSC_VER + pthread_mutex_unlock(&_cffi_embed_startup_lock); +#else + LeaveCriticalSection(&_cffi_embed_startup_lock); +#endif +} + + +/********** CPython-specific section **********/ +#ifndef PYPY_VERSION + +#include "_cffi_errors.h" + + +#define _cffi_call_python_org _cffi_exports[_CFFI_CPIDX] + +PyMODINIT_FUNC _CFFI_PYTHON_STARTUP_FUNC(void); /* forward */ + +static void _cffi_py_initialize(void) +{ + /* XXX use initsigs=0, which "skips initialization registration of + signal handlers, which might be useful when Python is + embedded" according to the Python docs. But review and think + if it should be a user-controllable setting. + + XXX we should also give a way to write errors to a buffer + instead of to stderr. + + XXX if importing 'site' fails, CPython (any version) calls + exit(). Should we try to work around this behavior here? + */ + Py_InitializeEx(0); +} + +static int _cffi_initialize_python(void) +{ + /* This initializes Python, imports _cffi_backend, and then the + present .dll/.so is set up as a CPython C extension module. + */ + int result; + PyGILState_STATE state; + PyObject *pycode=NULL, *global_dict=NULL, *x; + PyObject *builtins; + + state = PyGILState_Ensure(); + + /* Call the initxxx() function from the present module. It will + create and initialize us as a CPython extension module, instead + of letting the startup Python code do it---it might reimport + the same .dll/.so and get maybe confused on some platforms. + It might also have troubles locating the .dll/.so again for all + I know. + */ + (void)_CFFI_PYTHON_STARTUP_FUNC(); + if (PyErr_Occurred()) + goto error; + + /* Now run the Python code provided to ffi.embedding_init_code(). + */ + pycode = Py_CompileString(_CFFI_PYTHON_STARTUP_CODE, + "", + Py_file_input); + if (pycode == NULL) + goto error; + global_dict = PyDict_New(); + if (global_dict == NULL) + goto error; + builtins = PyEval_GetBuiltins(); + if (builtins == NULL) + goto error; + if (PyDict_SetItemString(global_dict, "__builtins__", builtins) < 0) + goto error; + x = PyEval_EvalCode( +#if PY_MAJOR_VERSION < 3 + (PyCodeObject *) +#endif + pycode, global_dict, global_dict); + if (x == NULL) + goto error; + Py_DECREF(x); + + /* Done! Now if we've been called from + _cffi_start_and_call_python() in an ``extern "Python"``, we can + only hope that the Python code did correctly set up the + corresponding @ffi.def_extern() function. Otherwise, the + general logic of ``extern "Python"`` functions (inside the + _cffi_backend module) will find that the reference is still + missing and print an error. + */ + result = 0; + done: + Py_XDECREF(pycode); + Py_XDECREF(global_dict); + PyGILState_Release(state); + return result; + + error:; + { + /* Print as much information as potentially useful. + Debugging load-time failures with embedding is not fun + */ + PyObject *ecap; + PyObject *exception, *v, *tb, *f, *modules, *mod; + PyErr_Fetch(&exception, &v, &tb); + ecap = _cffi_start_error_capture(); + f = PySys_GetObject((char *)"stderr"); + if (f != NULL && f != Py_None) { + PyFile_WriteString( + "Failed to initialize the Python-CFFI embedding logic:\n\n", f); + } + + if (exception != NULL) { + PyErr_NormalizeException(&exception, &v, &tb); + PyErr_Display(exception, v, tb); + } + Py_XDECREF(exception); + Py_XDECREF(v); + Py_XDECREF(tb); + + if (f != NULL && f != Py_None) { + PyFile_WriteString("\nFrom: " _CFFI_MODULE_NAME + "\ncompiled with cffi version: 2.0.0" + "\n_cffi_backend module: ", f); + modules = PyImport_GetModuleDict(); + mod = PyDict_GetItemString(modules, "_cffi_backend"); + if (mod == NULL) { + PyFile_WriteString("not loaded", f); + } + else { + v = PyObject_GetAttrString(mod, "__file__"); + PyFile_WriteObject(v, f, 0); + Py_XDECREF(v); + } + PyFile_WriteString("\nsys.path: ", f); + PyFile_WriteObject(PySys_GetObject((char *)"path"), f, 0); + PyFile_WriteString("\n\n", f); + } + _cffi_stop_error_capture(ecap); + } + result = -1; + goto done; +} + +#if PY_VERSION_HEX < 0x03080000 +PyAPI_DATA(char *) _PyParser_TokenNames[]; /* from CPython */ +#endif + +static int _cffi_carefully_make_gil(void) +{ + /* This does the basic initialization of Python. It can be called + completely concurrently from unrelated threads. It assumes + that we don't hold the GIL before (if it exists), and we don't + hold it afterwards. + + (What it really does used to be completely different in Python 2 + and Python 3, with the Python 2 solution avoiding the spin-lock + around the Py_InitializeEx() call. However, after recent changes + to CPython 2.7 (issue #358) it no longer works. So we use the + Python 3 solution everywhere.) + + This initializes Python by calling Py_InitializeEx(). + Important: this must not be called concurrently at all. + So we use a global variable as a simple spin lock. This global + variable must be from 'libpythonX.Y.so', not from this + cffi-based extension module, because it must be shared from + different cffi-based extension modules. + + In Python < 3.8, we choose + _PyParser_TokenNames[0] as a completely arbitrary pointer value + that is never written to. The default is to point to the + string "ENDMARKER". We change it temporarily to point to the + next character in that string. (Yes, I know it's REALLY + obscure.) + + In Python >= 3.8, this string array is no longer writable, so + instead we pick PyCapsuleType.tp_version_tag. We can't change + Python < 3.8 because someone might use a mixture of cffi + embedded modules, some of which were compiled before this file + changed. + + In Python >= 3.12, this stopped working because that particular + tp_version_tag gets modified during interpreter startup. It's + arguably a bad idea before 3.12 too, but again we can't change + that because someone might use a mixture of cffi embedded + modules, and no-one reported a bug so far. In Python >= 3.12 + we go instead for PyCapsuleType.tp_as_buffer, which is supposed + to always be NULL. We write to it temporarily a pointer to + a struct full of NULLs, which is semantically the same. + */ + +#ifdef WITH_THREAD +# if PY_VERSION_HEX < 0x03080000 + char *volatile *lock = (char *volatile *)_PyParser_TokenNames; + char *old_value, *locked_value; + + while (1) { /* spin loop */ + old_value = *lock; + locked_value = old_value + 1; + if (old_value[0] == 'E') { + assert(old_value[1] == 'N'); + if (cffi_compare_and_swap(lock, old_value, locked_value)) + break; + } + else { + assert(old_value[0] == 'N'); + /* should ideally do a spin loop instruction here, but + hard to do it portably and doesn't really matter I + think: PyEval_InitThreads() should be very fast, and + this is only run at start-up anyway. */ + } + } +# else +# if PY_VERSION_HEX < 0x030C0000 + int volatile *lock = (int volatile *)&PyCapsule_Type.tp_version_tag; + int old_value, locked_value = -42; + assert(!(PyCapsule_Type.tp_flags & Py_TPFLAGS_HAVE_VERSION_TAG)); +# else + static struct ebp_s { PyBufferProcs buf; int mark; } empty_buffer_procs; + empty_buffer_procs.mark = -42; + PyBufferProcs *volatile *lock = (PyBufferProcs *volatile *) + &PyCapsule_Type.tp_as_buffer; + PyBufferProcs *old_value, *locked_value = &empty_buffer_procs.buf; +# endif + + while (1) { /* spin loop */ + old_value = *lock; + if (old_value == 0) { + if (cffi_compare_and_swap(lock, old_value, locked_value)) + break; + } + else { +# if PY_VERSION_HEX < 0x030C0000 + assert(old_value == locked_value); +# else + /* The pointer should point to a possibly different + empty_buffer_procs from another C extension module */ + assert(((struct ebp_s *)old_value)->mark == -42); +# endif + /* should ideally do a spin loop instruction here, but + hard to do it portably and doesn't really matter I + think: PyEval_InitThreads() should be very fast, and + this is only run at start-up anyway. */ + } + } +# endif +#endif + + /* call Py_InitializeEx() */ + if (!Py_IsInitialized()) { + _cffi_py_initialize(); +#if PY_VERSION_HEX < 0x03070000 + PyEval_InitThreads(); +#endif + PyEval_SaveThread(); /* release the GIL */ + /* the returned tstate must be the one that has been stored into the + autoTLSkey by _PyGILState_Init() called from Py_Initialize(). */ + } + else { +#if PY_VERSION_HEX < 0x03070000 + /* PyEval_InitThreads() is always a no-op from CPython 3.7 */ + PyGILState_STATE state = PyGILState_Ensure(); + PyEval_InitThreads(); + PyGILState_Release(state); +#endif + } + +#ifdef WITH_THREAD + /* release the lock */ + while (!cffi_compare_and_swap(lock, locked_value, old_value)) + ; +#endif + + return 0; +} + +/********** end CPython-specific section **********/ + + +#else + + +/********** PyPy-specific section **********/ + +PyMODINIT_FUNC _CFFI_PYTHON_STARTUP_FUNC(const void *[]); /* forward */ + +static struct _cffi_pypy_init_s { + const char *name; + void *func; /* function pointer */ + const char *code; +} _cffi_pypy_init = { + _CFFI_MODULE_NAME, + _CFFI_PYTHON_STARTUP_FUNC, + _CFFI_PYTHON_STARTUP_CODE, +}; + +extern int pypy_carefully_make_gil(const char *); +extern int pypy_init_embedded_cffi_module(int, struct _cffi_pypy_init_s *); + +static int _cffi_carefully_make_gil(void) +{ + return pypy_carefully_make_gil(_CFFI_MODULE_NAME); +} + +static int _cffi_initialize_python(void) +{ + return pypy_init_embedded_cffi_module(0xB011, &_cffi_pypy_init); +} + +/********** end PyPy-specific section **********/ + + +#endif + + +#ifdef __GNUC__ +__attribute__((noinline)) +#endif +static _cffi_call_python_fnptr _cffi_start_python(void) +{ + /* Delicate logic to initialize Python. This function can be + called multiple times concurrently, e.g. when the process calls + its first ``extern "Python"`` functions in multiple threads at + once. It can also be called recursively, in which case we must + ignore it. We also have to consider what occurs if several + different cffi-based extensions reach this code in parallel + threads---it is a different copy of the code, then, and we + can't have any shared global variable unless it comes from + 'libpythonX.Y.so'. + + Idea: + + * _cffi_carefully_make_gil(): "carefully" call + PyEval_InitThreads() (possibly with Py_InitializeEx() first). + + * then we use a (local) custom lock to make sure that a call to this + cffi-based extension will wait if another call to the *same* + extension is running the initialization in another thread. + It is reentrant, so that a recursive call will not block, but + only one from a different thread. + + * then we grab the GIL and (Python 2) we call Py_InitializeEx(). + At this point, concurrent calls to Py_InitializeEx() are not + possible: we have the GIL. + + * do the rest of the specific initialization, which may + temporarily release the GIL but not the custom lock. + Only release the custom lock when we are done. + */ + static char called = 0; + + if (_cffi_carefully_make_gil() != 0) + return NULL; + + _cffi_acquire_reentrant_mutex(); + + /* Here the GIL exists, but we don't have it. We're only protected + from concurrency by the reentrant mutex. */ + + /* This file only initializes the embedded module once, the first + time this is called, even if there are subinterpreters. */ + if (!called) { + called = 1; /* invoke _cffi_initialize_python() only once, + but don't set '_cffi_call_python' right now, + otherwise concurrent threads won't call + this function at all (we need them to wait) */ + if (_cffi_initialize_python() == 0) { + /* now initialization is finished. Switch to the fast-path. */ + + /* We would like nobody to see the new value of + '_cffi_call_python' without also seeing the rest of the + data initialized. However, this is not possible. But + the new value of '_cffi_call_python' is the function + 'cffi_call_python()' from _cffi_backend. So: */ + cffi_write_barrier(); + /* ^^^ we put a write barrier here, and a corresponding + read barrier at the start of cffi_call_python(). This + ensures that after that read barrier, we see everything + done here before the write barrier. + */ + + assert(_cffi_call_python_org != NULL); + _cffi_call_python = (_cffi_call_python_fnptr)_cffi_call_python_org; + } + else { + /* initialization failed. Reset this to NULL, even if it was + already set to some other value. Future calls to + _cffi_start_python() are still forced to occur, and will + always return NULL from now on. */ + _cffi_call_python_org = NULL; + } + } + + _cffi_release_reentrant_mutex(); + + return (_cffi_call_python_fnptr)_cffi_call_python_org; +} + +static +void _cffi_start_and_call_python(struct _cffi_externpy_s *externpy, char *args) +{ + _cffi_call_python_fnptr fnptr; + int current_err = errno; +#ifdef _MSC_VER + int current_lasterr = GetLastError(); +#endif + fnptr = _cffi_start_python(); + if (fnptr == NULL) { + fprintf(stderr, "function %s() called, but initialization code " + "failed. Returning 0.\n", externpy->name); + memset(args, 0, externpy->size_of_result); + } +#ifdef _MSC_VER + SetLastError(current_lasterr); +#endif + errno = current_err; + + if (fnptr != NULL) + fnptr(externpy, args); +} + + +/* The cffi_start_python() function makes sure Python is initialized + and our cffi module is set up. It can be called manually from the + user C code. The same effect is obtained automatically from any + dll-exported ``extern "Python"`` function. This function returns + -1 if initialization failed, 0 if all is OK. */ +_CFFI_UNUSED_FN +static int cffi_start_python(void) +{ + if (_cffi_call_python == &_cffi_start_and_call_python) { + if (_cffi_start_python() == NULL) + return -1; + } + cffi_read_barrier(); + return 0; +} + +#undef cffi_compare_and_swap +#undef cffi_write_barrier +#undef cffi_read_barrier + +#ifdef __cplusplus +} +#endif diff --git a/venv/lib/python3.11/site-packages/cffi/_imp_emulation.py b/venv/lib/python3.11/site-packages/cffi/_imp_emulation.py new file mode 100644 index 0000000..136abdd --- /dev/null +++ b/venv/lib/python3.11/site-packages/cffi/_imp_emulation.py @@ -0,0 +1,83 @@ + +try: + # this works on Python < 3.12 + from imp import * + +except ImportError: + # this is a limited emulation for Python >= 3.12. + # Note that this is used only for tests or for the old ffi.verify(). + # This is copied from the source code of Python 3.11. + + from _imp import (acquire_lock, release_lock, + is_builtin, is_frozen) + + from importlib._bootstrap import _load + + from importlib import machinery + import os + import sys + import tokenize + + SEARCH_ERROR = 0 + PY_SOURCE = 1 + PY_COMPILED = 2 + C_EXTENSION = 3 + PY_RESOURCE = 4 + PKG_DIRECTORY = 5 + C_BUILTIN = 6 + PY_FROZEN = 7 + PY_CODERESOURCE = 8 + IMP_HOOK = 9 + + def get_suffixes(): + extensions = [(s, 'rb', C_EXTENSION) + for s in machinery.EXTENSION_SUFFIXES] + source = [(s, 'r', PY_SOURCE) for s in machinery.SOURCE_SUFFIXES] + bytecode = [(s, 'rb', PY_COMPILED) for s in machinery.BYTECODE_SUFFIXES] + return extensions + source + bytecode + + def find_module(name, path=None): + if not isinstance(name, str): + raise TypeError("'name' must be a str, not {}".format(type(name))) + elif not isinstance(path, (type(None), list)): + # Backwards-compatibility + raise RuntimeError("'path' must be None or a list, " + "not {}".format(type(path))) + + if path is None: + if is_builtin(name): + return None, None, ('', '', C_BUILTIN) + elif is_frozen(name): + return None, None, ('', '', PY_FROZEN) + else: + path = sys.path + + for entry in path: + package_directory = os.path.join(entry, name) + for suffix in ['.py', machinery.BYTECODE_SUFFIXES[0]]: + package_file_name = '__init__' + suffix + file_path = os.path.join(package_directory, package_file_name) + if os.path.isfile(file_path): + return None, package_directory, ('', '', PKG_DIRECTORY) + for suffix, mode, type_ in get_suffixes(): + file_name = name + suffix + file_path = os.path.join(entry, file_name) + if os.path.isfile(file_path): + break + else: + continue + break # Break out of outer loop when breaking out of inner loop. + else: + raise ImportError(name, name=name) + + encoding = None + if 'b' not in mode: + with open(file_path, 'rb') as file: + encoding = tokenize.detect_encoding(file.readline)[0] + file = open(file_path, mode, encoding=encoding) + return file, file_path, (suffix, mode, type_) + + def load_dynamic(name, path, file=None): + loader = machinery.ExtensionFileLoader(name, path) + spec = machinery.ModuleSpec(name=name, loader=loader, origin=path) + return _load(spec) diff --git a/venv/lib/python3.11/site-packages/cffi/_shimmed_dist_utils.py b/venv/lib/python3.11/site-packages/cffi/_shimmed_dist_utils.py new file mode 100644 index 0000000..c3d2312 --- /dev/null +++ b/venv/lib/python3.11/site-packages/cffi/_shimmed_dist_utils.py @@ -0,0 +1,45 @@ +""" +Temporary shim module to indirect the bits of distutils we need from setuptools/distutils while providing useful +error messages beyond `No module named 'distutils' on Python >= 3.12, or when setuptools' vendored distutils is broken. + +This is a compromise to avoid a hard-dep on setuptools for Python >= 3.12, since many users don't need runtime compilation support from CFFI. +""" +import sys + +try: + # import setuptools first; this is the most robust way to ensure its embedded distutils is available + # (the .pth shim should usually work, but this is even more robust) + import setuptools +except Exception as ex: + if sys.version_info >= (3, 12): + # Python 3.12 has no built-in distutils to fall back on, so any import problem is fatal + raise Exception("This CFFI feature requires setuptools on Python >= 3.12. The setuptools module is missing or non-functional.") from ex + + # silently ignore on older Pythons (support fallback to stdlib distutils where available) +else: + del setuptools + +try: + # bring in just the bits of distutils we need, whether they really came from setuptools or stdlib-embedded distutils + from distutils import log, sysconfig + from distutils.ccompiler import CCompiler + from distutils.command.build_ext import build_ext + from distutils.core import Distribution, Extension + from distutils.dir_util import mkpath + from distutils.errors import DistutilsSetupError, CompileError, LinkError + from distutils.log import set_threshold, set_verbosity + + if sys.platform == 'win32': + try: + # FUTURE: msvc9compiler module was removed in setuptools 74; consider removing, as it's only used by an ancient patch in `recompiler` + from distutils.msvc9compiler import MSVCCompiler + except ImportError: + MSVCCompiler = None +except Exception as ex: + if sys.version_info >= (3, 12): + raise Exception("This CFFI feature requires setuptools on Python >= 3.12. Please install the setuptools package.") from ex + + # anything older, just let the underlying distutils import error fly + raise Exception("This CFFI feature requires distutils. Please install the distutils or setuptools package.") from ex + +del sys diff --git a/venv/lib/python3.11/site-packages/cffi/api.py b/venv/lib/python3.11/site-packages/cffi/api.py new file mode 100644 index 0000000..5a474f3 --- /dev/null +++ b/venv/lib/python3.11/site-packages/cffi/api.py @@ -0,0 +1,967 @@ +import sys, types +from .lock import allocate_lock +from .error import CDefError +from . import model + +try: + callable +except NameError: + # Python 3.1 + from collections import Callable + callable = lambda x: isinstance(x, Callable) + +try: + basestring +except NameError: + # Python 3.x + basestring = str + +_unspecified = object() + + + +class FFI(object): + r''' + The main top-level class that you instantiate once, or once per module. + + Example usage: + + ffi = FFI() + ffi.cdef(""" + int printf(const char *, ...); + """) + + C = ffi.dlopen(None) # standard library + -or- + C = ffi.verify() # use a C compiler: verify the decl above is right + + C.printf("hello, %s!\n", ffi.new("char[]", "world")) + ''' + + def __init__(self, backend=None): + """Create an FFI instance. The 'backend' argument is used to + select a non-default backend, mostly for tests. + """ + if backend is None: + # You need PyPy (>= 2.0 beta), or a CPython (>= 2.6) with + # _cffi_backend.so compiled. + import _cffi_backend as backend + from . import __version__ + if backend.__version__ != __version__: + # bad version! Try to be as explicit as possible. + if hasattr(backend, '__file__'): + # CPython + raise Exception("Version mismatch: this is the 'cffi' package version %s, located in %r. When we import the top-level '_cffi_backend' extension module, we get version %s, located in %r. The two versions should be equal; check your installation." % ( + __version__, __file__, + backend.__version__, backend.__file__)) + else: + # PyPy + raise Exception("Version mismatch: this is the 'cffi' package version %s, located in %r. This interpreter comes with a built-in '_cffi_backend' module, which is version %s. The two versions should be equal; check your installation." % ( + __version__, __file__, backend.__version__)) + # (If you insist you can also try to pass the option + # 'backend=backend_ctypes.CTypesBackend()', but don't + # rely on it! It's probably not going to work well.) + + from . import cparser + self._backend = backend + self._lock = allocate_lock() + self._parser = cparser.Parser() + self._cached_btypes = {} + self._parsed_types = types.ModuleType('parsed_types').__dict__ + self._new_types = types.ModuleType('new_types').__dict__ + self._function_caches = [] + self._libraries = [] + self._cdefsources = [] + self._included_ffis = [] + self._windows_unicode = None + self._init_once_cache = {} + self._cdef_version = None + self._embedding = None + self._typecache = model.get_typecache(backend) + if hasattr(backend, 'set_ffi'): + backend.set_ffi(self) + for name in list(backend.__dict__): + if name.startswith('RTLD_'): + setattr(self, name, getattr(backend, name)) + # + with self._lock: + self.BVoidP = self._get_cached_btype(model.voidp_type) + self.BCharA = self._get_cached_btype(model.char_array_type) + if isinstance(backend, types.ModuleType): + # _cffi_backend: attach these constants to the class + if not hasattr(FFI, 'NULL'): + FFI.NULL = self.cast(self.BVoidP, 0) + FFI.CData, FFI.CType = backend._get_types() + else: + # ctypes backend: attach these constants to the instance + self.NULL = self.cast(self.BVoidP, 0) + self.CData, self.CType = backend._get_types() + self.buffer = backend.buffer + + def cdef(self, csource, override=False, packed=False, pack=None): + """Parse the given C source. This registers all declared functions, + types, and global variables. The functions and global variables can + then be accessed via either 'ffi.dlopen()' or 'ffi.verify()'. + The types can be used in 'ffi.new()' and other functions. + If 'packed' is specified as True, all structs declared inside this + cdef are packed, i.e. laid out without any field alignment at all. + Alternatively, 'pack' can be a small integer, and requests for + alignment greater than that are ignored (pack=1 is equivalent to + packed=True). + """ + self._cdef(csource, override=override, packed=packed, pack=pack) + + def embedding_api(self, csource, packed=False, pack=None): + self._cdef(csource, packed=packed, pack=pack, dllexport=True) + if self._embedding is None: + self._embedding = '' + + def _cdef(self, csource, override=False, **options): + if not isinstance(csource, str): # unicode, on Python 2 + if not isinstance(csource, basestring): + raise TypeError("cdef() argument must be a string") + csource = csource.encode('ascii') + with self._lock: + self._cdef_version = object() + self._parser.parse(csource, override=override, **options) + self._cdefsources.append(csource) + if override: + for cache in self._function_caches: + cache.clear() + finishlist = self._parser._recomplete + if finishlist: + self._parser._recomplete = [] + for tp in finishlist: + tp.finish_backend_type(self, finishlist) + + def dlopen(self, name, flags=0): + """Load and return a dynamic library identified by 'name'. + The standard C library can be loaded by passing None. + Note that functions and types declared by 'ffi.cdef()' are not + linked to a particular library, just like C headers; in the + library we only look for the actual (untyped) symbols. + """ + if not (isinstance(name, basestring) or + name is None or + isinstance(name, self.CData)): + raise TypeError("dlopen(name): name must be a file name, None, " + "or an already-opened 'void *' handle") + with self._lock: + lib, function_cache = _make_ffi_library(self, name, flags) + self._function_caches.append(function_cache) + self._libraries.append(lib) + return lib + + def dlclose(self, lib): + """Close a library obtained with ffi.dlopen(). After this call, + access to functions or variables from the library will fail + (possibly with a segmentation fault). + """ + type(lib).__cffi_close__(lib) + + def _typeof_locked(self, cdecl): + # call me with the lock! + key = cdecl + if key in self._parsed_types: + return self._parsed_types[key] + # + if not isinstance(cdecl, str): # unicode, on Python 2 + cdecl = cdecl.encode('ascii') + # + type = self._parser.parse_type(cdecl) + really_a_function_type = type.is_raw_function + if really_a_function_type: + type = type.as_function_pointer() + btype = self._get_cached_btype(type) + result = btype, really_a_function_type + self._parsed_types[key] = result + return result + + def _typeof(self, cdecl, consider_function_as_funcptr=False): + # string -> ctype object + try: + result = self._parsed_types[cdecl] + except KeyError: + with self._lock: + result = self._typeof_locked(cdecl) + # + btype, really_a_function_type = result + if really_a_function_type and not consider_function_as_funcptr: + raise CDefError("the type %r is a function type, not a " + "pointer-to-function type" % (cdecl,)) + return btype + + def typeof(self, cdecl): + """Parse the C type given as a string and return the + corresponding object. + It can also be used on 'cdata' instance to get its C type. + """ + if isinstance(cdecl, basestring): + return self._typeof(cdecl) + if isinstance(cdecl, self.CData): + return self._backend.typeof(cdecl) + if isinstance(cdecl, types.BuiltinFunctionType): + res = _builtin_function_type(cdecl) + if res is not None: + return res + if (isinstance(cdecl, types.FunctionType) + and hasattr(cdecl, '_cffi_base_type')): + with self._lock: + return self._get_cached_btype(cdecl._cffi_base_type) + raise TypeError(type(cdecl)) + + def sizeof(self, cdecl): + """Return the size in bytes of the argument. It can be a + string naming a C type, or a 'cdata' instance. + """ + if isinstance(cdecl, basestring): + BType = self._typeof(cdecl) + return self._backend.sizeof(BType) + else: + return self._backend.sizeof(cdecl) + + def alignof(self, cdecl): + """Return the natural alignment size in bytes of the C type + given as a string. + """ + if isinstance(cdecl, basestring): + cdecl = self._typeof(cdecl) + return self._backend.alignof(cdecl) + + def offsetof(self, cdecl, *fields_or_indexes): + """Return the offset of the named field inside the given + structure or array, which must be given as a C type name. + You can give several field names in case of nested structures. + You can also give numeric values which correspond to array + items, in case of an array type. + """ + if isinstance(cdecl, basestring): + cdecl = self._typeof(cdecl) + return self._typeoffsetof(cdecl, *fields_or_indexes)[1] + + def new(self, cdecl, init=None): + """Allocate an instance according to the specified C type and + return a pointer to it. The specified C type must be either a + pointer or an array: ``new('X *')`` allocates an X and returns + a pointer to it, whereas ``new('X[n]')`` allocates an array of + n X'es and returns an array referencing it (which works + mostly like a pointer, like in C). You can also use + ``new('X[]', n)`` to allocate an array of a non-constant + length n. + + The memory is initialized following the rules of declaring a + global variable in C: by default it is zero-initialized, but + an explicit initializer can be given which can be used to + fill all or part of the memory. + + When the returned object goes out of scope, the memory + is freed. In other words the returned object has + ownership of the value of type 'cdecl' that it points to. This + means that the raw data can be used as long as this object is + kept alive, but must not be used for a longer time. Be careful + about that when copying the pointer to the memory somewhere + else, e.g. into another structure. + """ + if isinstance(cdecl, basestring): + cdecl = self._typeof(cdecl) + return self._backend.newp(cdecl, init) + + def new_allocator(self, alloc=None, free=None, + should_clear_after_alloc=True): + """Return a new allocator, i.e. a function that behaves like ffi.new() + but uses the provided low-level 'alloc' and 'free' functions. + + 'alloc' is called with the size as argument. If it returns NULL, a + MemoryError is raised. 'free' is called with the result of 'alloc' + as argument. Both can be either Python function or directly C + functions. If 'free' is None, then no free function is called. + If both 'alloc' and 'free' are None, the default is used. + + If 'should_clear_after_alloc' is set to False, then the memory + returned by 'alloc' is assumed to be already cleared (or you are + fine with garbage); otherwise CFFI will clear it. + """ + compiled_ffi = self._backend.FFI() + allocator = compiled_ffi.new_allocator(alloc, free, + should_clear_after_alloc) + def allocate(cdecl, init=None): + if isinstance(cdecl, basestring): + cdecl = self._typeof(cdecl) + return allocator(cdecl, init) + return allocate + + def cast(self, cdecl, source): + """Similar to a C cast: returns an instance of the named C + type initialized with the given 'source'. The source is + casted between integers or pointers of any type. + """ + if isinstance(cdecl, basestring): + cdecl = self._typeof(cdecl) + return self._backend.cast(cdecl, source) + + def string(self, cdata, maxlen=-1): + """Return a Python string (or unicode string) from the 'cdata'. + If 'cdata' is a pointer or array of characters or bytes, returns + the null-terminated string. The returned string extends until + the first null character, or at most 'maxlen' characters. If + 'cdata' is an array then 'maxlen' defaults to its length. + + If 'cdata' is a pointer or array of wchar_t, returns a unicode + string following the same rules. + + If 'cdata' is a single character or byte or a wchar_t, returns + it as a string or unicode string. + + If 'cdata' is an enum, returns the value of the enumerator as a + string, or 'NUMBER' if the value is out of range. + """ + return self._backend.string(cdata, maxlen) + + def unpack(self, cdata, length): + """Unpack an array of C data of the given length, + returning a Python string/unicode/list. + + If 'cdata' is a pointer to 'char', returns a byte string. + It does not stop at the first null. This is equivalent to: + ffi.buffer(cdata, length)[:] + + If 'cdata' is a pointer to 'wchar_t', returns a unicode string. + 'length' is measured in wchar_t's; it is not the size in bytes. + + If 'cdata' is a pointer to anything else, returns a list of + 'length' items. This is a faster equivalent to: + [cdata[i] for i in range(length)] + """ + return self._backend.unpack(cdata, length) + + #def buffer(self, cdata, size=-1): + # """Return a read-write buffer object that references the raw C data + # pointed to by the given 'cdata'. The 'cdata' must be a pointer or + # an array. Can be passed to functions expecting a buffer, or directly + # manipulated with: + # + # buf[:] get a copy of it in a regular string, or + # buf[idx] as a single character + # buf[:] = ... + # buf[idx] = ... change the content + # """ + # note that 'buffer' is a type, set on this instance by __init__ + + def from_buffer(self, cdecl, python_buffer=_unspecified, + require_writable=False): + """Return a cdata of the given type pointing to the data of the + given Python object, which must support the buffer interface. + Note that this is not meant to be used on the built-in types + str or unicode (you can build 'char[]' arrays explicitly) + but only on objects containing large quantities of raw data + in some other format, like 'array.array' or numpy arrays. + + The first argument is optional and default to 'char[]'. + """ + if python_buffer is _unspecified: + cdecl, python_buffer = self.BCharA, cdecl + elif isinstance(cdecl, basestring): + cdecl = self._typeof(cdecl) + return self._backend.from_buffer(cdecl, python_buffer, + require_writable) + + def memmove(self, dest, src, n): + """ffi.memmove(dest, src, n) copies n bytes of memory from src to dest. + + Like the C function memmove(), the memory areas may overlap; + apart from that it behaves like the C function memcpy(). + + 'src' can be any cdata ptr or array, or any Python buffer object. + 'dest' can be any cdata ptr or array, or a writable Python buffer + object. The size to copy, 'n', is always measured in bytes. + + Unlike other methods, this one supports all Python buffer including + byte strings and bytearrays---but it still does not support + non-contiguous buffers. + """ + return self._backend.memmove(dest, src, n) + + def callback(self, cdecl, python_callable=None, error=None, onerror=None): + """Return a callback object or a decorator making such a + callback object. 'cdecl' must name a C function pointer type. + The callback invokes the specified 'python_callable' (which may + be provided either directly or via a decorator). Important: the + callback object must be manually kept alive for as long as the + callback may be invoked from the C level. + """ + def callback_decorator_wrap(python_callable): + if not callable(python_callable): + raise TypeError("the 'python_callable' argument " + "is not callable") + return self._backend.callback(cdecl, python_callable, + error, onerror) + if isinstance(cdecl, basestring): + cdecl = self._typeof(cdecl, consider_function_as_funcptr=True) + if python_callable is None: + return callback_decorator_wrap # decorator mode + else: + return callback_decorator_wrap(python_callable) # direct mode + + def getctype(self, cdecl, replace_with=''): + """Return a string giving the C type 'cdecl', which may be itself + a string or a object. If 'replace_with' is given, it gives + extra text to append (or insert for more complicated C types), like + a variable name, or '*' to get actually the C type 'pointer-to-cdecl'. + """ + if isinstance(cdecl, basestring): + cdecl = self._typeof(cdecl) + replace_with = replace_with.strip() + if (replace_with.startswith('*') + and '&[' in self._backend.getcname(cdecl, '&')): + replace_with = '(%s)' % replace_with + elif replace_with and not replace_with[0] in '[(': + replace_with = ' ' + replace_with + return self._backend.getcname(cdecl, replace_with) + + def gc(self, cdata, destructor, size=0): + """Return a new cdata object that points to the same + data. Later, when this new cdata object is garbage-collected, + 'destructor(old_cdata_object)' will be called. + + The optional 'size' gives an estimate of the size, used to + trigger the garbage collection more eagerly. So far only used + on PyPy. It tells the GC that the returned object keeps alive + roughly 'size' bytes of external memory. + """ + return self._backend.gcp(cdata, destructor, size) + + def _get_cached_btype(self, type): + assert self._lock.acquire(False) is False + # call me with the lock! + try: + BType = self._cached_btypes[type] + except KeyError: + finishlist = [] + BType = type.get_cached_btype(self, finishlist) + for type in finishlist: + type.finish_backend_type(self, finishlist) + return BType + + def verify(self, source='', tmpdir=None, **kwargs): + """Verify that the current ffi signatures compile on this + machine, and return a dynamic library object. The dynamic + library can be used to call functions and access global + variables declared in this 'ffi'. The library is compiled + by the C compiler: it gives you C-level API compatibility + (including calling macros). This is unlike 'ffi.dlopen()', + which requires binary compatibility in the signatures. + """ + from .verifier import Verifier, _caller_dir_pycache + # + # If set_unicode(True) was called, insert the UNICODE and + # _UNICODE macro declarations + if self._windows_unicode: + self._apply_windows_unicode(kwargs) + # + # Set the tmpdir here, and not in Verifier.__init__: it picks + # up the caller's directory, which we want to be the caller of + # ffi.verify(), as opposed to the caller of Veritier(). + tmpdir = tmpdir or _caller_dir_pycache() + # + # Make a Verifier() and use it to load the library. + self.verifier = Verifier(self, source, tmpdir, **kwargs) + lib = self.verifier.load_library() + # + # Save the loaded library for keep-alive purposes, even + # if the caller doesn't keep it alive itself (it should). + self._libraries.append(lib) + return lib + + def _get_errno(self): + return self._backend.get_errno() + def _set_errno(self, errno): + self._backend.set_errno(errno) + errno = property(_get_errno, _set_errno, None, + "the value of 'errno' from/to the C calls") + + def getwinerror(self, code=-1): + return self._backend.getwinerror(code) + + def _pointer_to(self, ctype): + with self._lock: + return model.pointer_cache(self, ctype) + + def addressof(self, cdata, *fields_or_indexes): + """Return the address of a . + If 'fields_or_indexes' are given, returns the address of that + field or array item in the structure or array, recursively in + case of nested structures. + """ + try: + ctype = self._backend.typeof(cdata) + except TypeError: + if '__addressof__' in type(cdata).__dict__: + return type(cdata).__addressof__(cdata, *fields_or_indexes) + raise + if fields_or_indexes: + ctype, offset = self._typeoffsetof(ctype, *fields_or_indexes) + else: + if ctype.kind == "pointer": + raise TypeError("addressof(pointer)") + offset = 0 + ctypeptr = self._pointer_to(ctype) + return self._backend.rawaddressof(ctypeptr, cdata, offset) + + def _typeoffsetof(self, ctype, field_or_index, *fields_or_indexes): + ctype, offset = self._backend.typeoffsetof(ctype, field_or_index) + for field1 in fields_or_indexes: + ctype, offset1 = self._backend.typeoffsetof(ctype, field1, 1) + offset += offset1 + return ctype, offset + + def include(self, ffi_to_include): + """Includes the typedefs, structs, unions and enums defined + in another FFI instance. Usage is similar to a #include in C, + where a part of the program might include types defined in + another part for its own usage. Note that the include() + method has no effect on functions, constants and global + variables, which must anyway be accessed directly from the + lib object returned by the original FFI instance. + """ + if not isinstance(ffi_to_include, FFI): + raise TypeError("ffi.include() expects an argument that is also of" + " type cffi.FFI, not %r" % ( + type(ffi_to_include).__name__,)) + if ffi_to_include is self: + raise ValueError("self.include(self)") + with ffi_to_include._lock: + with self._lock: + self._parser.include(ffi_to_include._parser) + self._cdefsources.append('[') + self._cdefsources.extend(ffi_to_include._cdefsources) + self._cdefsources.append(']') + self._included_ffis.append(ffi_to_include) + + def new_handle(self, x): + return self._backend.newp_handle(self.BVoidP, x) + + def from_handle(self, x): + return self._backend.from_handle(x) + + def release(self, x): + self._backend.release(x) + + def set_unicode(self, enabled_flag): + """Windows: if 'enabled_flag' is True, enable the UNICODE and + _UNICODE defines in C, and declare the types like TCHAR and LPTCSTR + to be (pointers to) wchar_t. If 'enabled_flag' is False, + declare these types to be (pointers to) plain 8-bit characters. + This is mostly for backward compatibility; you usually want True. + """ + if self._windows_unicode is not None: + raise ValueError("set_unicode() can only be called once") + enabled_flag = bool(enabled_flag) + if enabled_flag: + self.cdef("typedef wchar_t TBYTE;" + "typedef wchar_t TCHAR;" + "typedef const wchar_t *LPCTSTR;" + "typedef const wchar_t *PCTSTR;" + "typedef wchar_t *LPTSTR;" + "typedef wchar_t *PTSTR;" + "typedef TBYTE *PTBYTE;" + "typedef TCHAR *PTCHAR;") + else: + self.cdef("typedef char TBYTE;" + "typedef char TCHAR;" + "typedef const char *LPCTSTR;" + "typedef const char *PCTSTR;" + "typedef char *LPTSTR;" + "typedef char *PTSTR;" + "typedef TBYTE *PTBYTE;" + "typedef TCHAR *PTCHAR;") + self._windows_unicode = enabled_flag + + def _apply_windows_unicode(self, kwds): + defmacros = kwds.get('define_macros', ()) + if not isinstance(defmacros, (list, tuple)): + raise TypeError("'define_macros' must be a list or tuple") + defmacros = list(defmacros) + [('UNICODE', '1'), + ('_UNICODE', '1')] + kwds['define_macros'] = defmacros + + def _apply_embedding_fix(self, kwds): + # must include an argument like "-lpython2.7" for the compiler + def ensure(key, value): + lst = kwds.setdefault(key, []) + if value not in lst: + lst.append(value) + # + if '__pypy__' in sys.builtin_module_names: + import os + if sys.platform == "win32": + # we need 'libpypy-c.lib'. Current distributions of + # pypy (>= 4.1) contain it as 'libs/python27.lib'. + pythonlib = "python{0[0]}{0[1]}".format(sys.version_info) + if hasattr(sys, 'prefix'): + ensure('library_dirs', os.path.join(sys.prefix, 'libs')) + else: + # we need 'libpypy-c.{so,dylib}', which should be by + # default located in 'sys.prefix/bin' for installed + # systems. + if sys.version_info < (3,): + pythonlib = "pypy-c" + else: + pythonlib = "pypy3-c" + if hasattr(sys, 'prefix'): + ensure('library_dirs', os.path.join(sys.prefix, 'bin')) + # On uninstalled pypy's, the libpypy-c is typically found in + # .../pypy/goal/. + if hasattr(sys, 'prefix'): + ensure('library_dirs', os.path.join(sys.prefix, 'pypy', 'goal')) + else: + if sys.platform == "win32": + template = "python%d%d" + if hasattr(sys, 'gettotalrefcount'): + template += '_d' + else: + try: + import sysconfig + except ImportError: # 2.6 + from cffi._shimmed_dist_utils import sysconfig + template = "python%d.%d" + if sysconfig.get_config_var('DEBUG_EXT'): + template += sysconfig.get_config_var('DEBUG_EXT') + pythonlib = (template % + (sys.hexversion >> 24, (sys.hexversion >> 16) & 0xff)) + if hasattr(sys, 'abiflags'): + pythonlib += sys.abiflags + ensure('libraries', pythonlib) + if sys.platform == "win32": + ensure('extra_link_args', '/MANIFEST') + + def set_source(self, module_name, source, source_extension='.c', **kwds): + import os + if hasattr(self, '_assigned_source'): + raise ValueError("set_source() cannot be called several times " + "per ffi object") + if not isinstance(module_name, basestring): + raise TypeError("'module_name' must be a string") + if os.sep in module_name or (os.altsep and os.altsep in module_name): + raise ValueError("'module_name' must not contain '/': use a dotted " + "name to make a 'package.module' location") + self._assigned_source = (str(module_name), source, + source_extension, kwds) + + def set_source_pkgconfig(self, module_name, pkgconfig_libs, source, + source_extension='.c', **kwds): + from . import pkgconfig + if not isinstance(pkgconfig_libs, list): + raise TypeError("the pkgconfig_libs argument must be a list " + "of package names") + kwds2 = pkgconfig.flags_from_pkgconfig(pkgconfig_libs) + pkgconfig.merge_flags(kwds, kwds2) + self.set_source(module_name, source, source_extension, **kwds) + + def distutils_extension(self, tmpdir='build', verbose=True): + from cffi._shimmed_dist_utils import mkpath + from .recompiler import recompile + # + if not hasattr(self, '_assigned_source'): + if hasattr(self, 'verifier'): # fallback, 'tmpdir' ignored + return self.verifier.get_extension() + raise ValueError("set_source() must be called before" + " distutils_extension()") + module_name, source, source_extension, kwds = self._assigned_source + if source is None: + raise TypeError("distutils_extension() is only for C extension " + "modules, not for dlopen()-style pure Python " + "modules") + mkpath(tmpdir) + ext, updated = recompile(self, module_name, + source, tmpdir=tmpdir, extradir=tmpdir, + source_extension=source_extension, + call_c_compiler=False, **kwds) + if verbose: + if updated: + sys.stderr.write("regenerated: %r\n" % (ext.sources[0],)) + else: + sys.stderr.write("not modified: %r\n" % (ext.sources[0],)) + return ext + + def emit_c_code(self, filename): + from .recompiler import recompile + # + if not hasattr(self, '_assigned_source'): + raise ValueError("set_source() must be called before emit_c_code()") + module_name, source, source_extension, kwds = self._assigned_source + if source is None: + raise TypeError("emit_c_code() is only for C extension modules, " + "not for dlopen()-style pure Python modules") + recompile(self, module_name, source, + c_file=filename, call_c_compiler=False, + uses_ffiplatform=False, **kwds) + + def emit_python_code(self, filename): + from .recompiler import recompile + # + if not hasattr(self, '_assigned_source'): + raise ValueError("set_source() must be called before emit_c_code()") + module_name, source, source_extension, kwds = self._assigned_source + if source is not None: + raise TypeError("emit_python_code() is only for dlopen()-style " + "pure Python modules, not for C extension modules") + recompile(self, module_name, source, + c_file=filename, call_c_compiler=False, + uses_ffiplatform=False, **kwds) + + def compile(self, tmpdir='.', verbose=0, target=None, debug=None): + """The 'target' argument gives the final file name of the + compiled DLL. Use '*' to force distutils' choice, suitable for + regular CPython C API modules. Use a file name ending in '.*' + to ask for the system's default extension for dynamic libraries + (.so/.dll/.dylib). + + The default is '*' when building a non-embedded C API extension, + and (module_name + '.*') when building an embedded library. + """ + from .recompiler import recompile + # + if not hasattr(self, '_assigned_source'): + raise ValueError("set_source() must be called before compile()") + module_name, source, source_extension, kwds = self._assigned_source + return recompile(self, module_name, source, tmpdir=tmpdir, + target=target, source_extension=source_extension, + compiler_verbose=verbose, debug=debug, **kwds) + + def init_once(self, func, tag): + # Read _init_once_cache[tag], which is either (False, lock) if + # we're calling the function now in some thread, or (True, result). + # Don't call setdefault() in most cases, to avoid allocating and + # immediately freeing a lock; but still use setdefaut() to avoid + # races. + try: + x = self._init_once_cache[tag] + except KeyError: + x = self._init_once_cache.setdefault(tag, (False, allocate_lock())) + # Common case: we got (True, result), so we return the result. + if x[0]: + return x[1] + # Else, it's a lock. Acquire it to serialize the following tests. + with x[1]: + # Read again from _init_once_cache the current status. + x = self._init_once_cache[tag] + if x[0]: + return x[1] + # Call the function and store the result back. + result = func() + self._init_once_cache[tag] = (True, result) + return result + + def embedding_init_code(self, pysource): + if self._embedding: + raise ValueError("embedding_init_code() can only be called once") + # fix 'pysource' before it gets dumped into the C file: + # - remove empty lines at the beginning, so it starts at "line 1" + # - dedent, if all non-empty lines are indented + # - check for SyntaxErrors + import re + match = re.match(r'\s*\n', pysource) + if match: + pysource = pysource[match.end():] + lines = pysource.splitlines() or [''] + prefix = re.match(r'\s*', lines[0]).group() + for i in range(1, len(lines)): + line = lines[i] + if line.rstrip(): + while not line.startswith(prefix): + prefix = prefix[:-1] + i = len(prefix) + lines = [line[i:]+'\n' for line in lines] + pysource = ''.join(lines) + # + compile(pysource, "cffi_init", "exec") + # + self._embedding = pysource + + def def_extern(self, *args, **kwds): + raise ValueError("ffi.def_extern() is only available on API-mode FFI " + "objects") + + def list_types(self): + """Returns the user type names known to this FFI instance. + This returns a tuple containing three lists of names: + (typedef_names, names_of_structs, names_of_unions) + """ + typedefs = [] + structs = [] + unions = [] + for key in self._parser._declarations: + if key.startswith('typedef '): + typedefs.append(key[8:]) + elif key.startswith('struct '): + structs.append(key[7:]) + elif key.startswith('union '): + unions.append(key[6:]) + typedefs.sort() + structs.sort() + unions.sort() + return (typedefs, structs, unions) + + +def _load_backend_lib(backend, name, flags): + import os + if not isinstance(name, basestring): + if sys.platform != "win32" or name is not None: + return backend.load_library(name, flags) + name = "c" # Windows: load_library(None) fails, but this works + # on Python 2 (backward compatibility hack only) + first_error = None + if '.' in name or '/' in name or os.sep in name: + try: + return backend.load_library(name, flags) + except OSError as e: + first_error = e + import ctypes.util + path = ctypes.util.find_library(name) + if path is None: + if name == "c" and sys.platform == "win32" and sys.version_info >= (3,): + raise OSError("dlopen(None) cannot work on Windows for Python 3 " + "(see http://bugs.python.org/issue23606)") + msg = ("ctypes.util.find_library() did not manage " + "to locate a library called %r" % (name,)) + if first_error is not None: + msg = "%s. Additionally, %s" % (first_error, msg) + raise OSError(msg) + return backend.load_library(path, flags) + +def _make_ffi_library(ffi, libname, flags): + backend = ffi._backend + backendlib = _load_backend_lib(backend, libname, flags) + # + def accessor_function(name): + key = 'function ' + name + tp, _ = ffi._parser._declarations[key] + BType = ffi._get_cached_btype(tp) + value = backendlib.load_function(BType, name) + library.__dict__[name] = value + # + def accessor_variable(name): + key = 'variable ' + name + tp, _ = ffi._parser._declarations[key] + BType = ffi._get_cached_btype(tp) + read_variable = backendlib.read_variable + write_variable = backendlib.write_variable + setattr(FFILibrary, name, property( + lambda self: read_variable(BType, name), + lambda self, value: write_variable(BType, name, value))) + # + def addressof_var(name): + try: + return addr_variables[name] + except KeyError: + with ffi._lock: + if name not in addr_variables: + key = 'variable ' + name + tp, _ = ffi._parser._declarations[key] + BType = ffi._get_cached_btype(tp) + if BType.kind != 'array': + BType = model.pointer_cache(ffi, BType) + p = backendlib.load_function(BType, name) + addr_variables[name] = p + return addr_variables[name] + # + def accessor_constant(name): + raise NotImplementedError("non-integer constant '%s' cannot be " + "accessed from a dlopen() library" % (name,)) + # + def accessor_int_constant(name): + library.__dict__[name] = ffi._parser._int_constants[name] + # + accessors = {} + accessors_version = [False] + addr_variables = {} + # + def update_accessors(): + if accessors_version[0] is ffi._cdef_version: + return + # + for key, (tp, _) in ffi._parser._declarations.items(): + if not isinstance(tp, model.EnumType): + tag, name = key.split(' ', 1) + if tag == 'function': + accessors[name] = accessor_function + elif tag == 'variable': + accessors[name] = accessor_variable + elif tag == 'constant': + accessors[name] = accessor_constant + else: + for i, enumname in enumerate(tp.enumerators): + def accessor_enum(name, tp=tp, i=i): + tp.check_not_partial() + library.__dict__[name] = tp.enumvalues[i] + accessors[enumname] = accessor_enum + for name in ffi._parser._int_constants: + accessors.setdefault(name, accessor_int_constant) + accessors_version[0] = ffi._cdef_version + # + def make_accessor(name): + with ffi._lock: + if name in library.__dict__ or name in FFILibrary.__dict__: + return # added by another thread while waiting for the lock + if name not in accessors: + update_accessors() + if name not in accessors: + raise AttributeError(name) + accessors[name](name) + # + class FFILibrary(object): + def __getattr__(self, name): + make_accessor(name) + return getattr(self, name) + def __setattr__(self, name, value): + try: + property = getattr(self.__class__, name) + except AttributeError: + make_accessor(name) + setattr(self, name, value) + else: + property.__set__(self, value) + def __dir__(self): + with ffi._lock: + update_accessors() + return accessors.keys() + def __addressof__(self, name): + if name in library.__dict__: + return library.__dict__[name] + if name in FFILibrary.__dict__: + return addressof_var(name) + make_accessor(name) + if name in library.__dict__: + return library.__dict__[name] + if name in FFILibrary.__dict__: + return addressof_var(name) + raise AttributeError("cffi library has no function or " + "global variable named '%s'" % (name,)) + def __cffi_close__(self): + backendlib.close_lib() + self.__dict__.clear() + # + if isinstance(libname, basestring): + try: + if not isinstance(libname, str): # unicode, on Python 2 + libname = libname.encode('utf-8') + FFILibrary.__name__ = 'FFILibrary_%s' % libname + except UnicodeError: + pass + library = FFILibrary() + return library, library.__dict__ + +def _builtin_function_type(func): + # a hack to make at least ffi.typeof(builtin_function) work, + # if the builtin function was obtained by 'vengine_cpy'. + import sys + try: + module = sys.modules[func.__module__] + ffi = module._cffi_original_ffi + types_of_builtin_funcs = module._cffi_types_of_builtin_funcs + tp = types_of_builtin_funcs[func] + except (KeyError, AttributeError, TypeError): + return None + else: + with ffi._lock: + return ffi._get_cached_btype(tp) diff --git a/venv/lib/python3.11/site-packages/cffi/backend_ctypes.py b/venv/lib/python3.11/site-packages/cffi/backend_ctypes.py new file mode 100644 index 0000000..e7956a7 --- /dev/null +++ b/venv/lib/python3.11/site-packages/cffi/backend_ctypes.py @@ -0,0 +1,1121 @@ +import ctypes, ctypes.util, operator, sys +from . import model + +if sys.version_info < (3,): + bytechr = chr +else: + unicode = str + long = int + xrange = range + bytechr = lambda num: bytes([num]) + +class CTypesType(type): + pass + +class CTypesData(object): + __metaclass__ = CTypesType + __slots__ = ['__weakref__'] + __name__ = '' + + def __init__(self, *args): + raise TypeError("cannot instantiate %r" % (self.__class__,)) + + @classmethod + def _newp(cls, init): + raise TypeError("expected a pointer or array ctype, got '%s'" + % (cls._get_c_name(),)) + + @staticmethod + def _to_ctypes(value): + raise TypeError + + @classmethod + def _arg_to_ctypes(cls, *value): + try: + ctype = cls._ctype + except AttributeError: + raise TypeError("cannot create an instance of %r" % (cls,)) + if value: + res = cls._to_ctypes(*value) + if not isinstance(res, ctype): + res = cls._ctype(res) + else: + res = cls._ctype() + return res + + @classmethod + def _create_ctype_obj(cls, init): + if init is None: + return cls._arg_to_ctypes() + else: + return cls._arg_to_ctypes(init) + + @staticmethod + def _from_ctypes(ctypes_value): + raise TypeError + + @classmethod + def _get_c_name(cls, replace_with=''): + return cls._reftypename.replace(' &', replace_with) + + @classmethod + def _fix_class(cls): + cls.__name__ = 'CData<%s>' % (cls._get_c_name(),) + cls.__qualname__ = 'CData<%s>' % (cls._get_c_name(),) + cls.__module__ = 'ffi' + + def _get_own_repr(self): + raise NotImplementedError + + def _addr_repr(self, address): + if address == 0: + return 'NULL' + else: + if address < 0: + address += 1 << (8*ctypes.sizeof(ctypes.c_void_p)) + return '0x%x' % address + + def __repr__(self, c_name=None): + own = self._get_own_repr() + return '' % (c_name or self._get_c_name(), own) + + def _convert_to_address(self, BClass): + if BClass is None: + raise TypeError("cannot convert %r to an address" % ( + self._get_c_name(),)) + else: + raise TypeError("cannot convert %r to %r" % ( + self._get_c_name(), BClass._get_c_name())) + + @classmethod + def _get_size(cls): + return ctypes.sizeof(cls._ctype) + + def _get_size_of_instance(self): + return ctypes.sizeof(self._ctype) + + @classmethod + def _cast_from(cls, source): + raise TypeError("cannot cast to %r" % (cls._get_c_name(),)) + + def _cast_to_integer(self): + return self._convert_to_address(None) + + @classmethod + def _alignment(cls): + return ctypes.alignment(cls._ctype) + + def __iter__(self): + raise TypeError("cdata %r does not support iteration" % ( + self._get_c_name()),) + + def _make_cmp(name): + cmpfunc = getattr(operator, name) + def cmp(self, other): + v_is_ptr = not isinstance(self, CTypesGenericPrimitive) + w_is_ptr = (isinstance(other, CTypesData) and + not isinstance(other, CTypesGenericPrimitive)) + if v_is_ptr and w_is_ptr: + return cmpfunc(self._convert_to_address(None), + other._convert_to_address(None)) + elif v_is_ptr or w_is_ptr: + return NotImplemented + else: + if isinstance(self, CTypesGenericPrimitive): + self = self._value + if isinstance(other, CTypesGenericPrimitive): + other = other._value + return cmpfunc(self, other) + cmp.func_name = name + return cmp + + __eq__ = _make_cmp('__eq__') + __ne__ = _make_cmp('__ne__') + __lt__ = _make_cmp('__lt__') + __le__ = _make_cmp('__le__') + __gt__ = _make_cmp('__gt__') + __ge__ = _make_cmp('__ge__') + + def __hash__(self): + return hash(self._convert_to_address(None)) + + def _to_string(self, maxlen): + raise TypeError("string(): %r" % (self,)) + + +class CTypesGenericPrimitive(CTypesData): + __slots__ = [] + + def __hash__(self): + return hash(self._value) + + def _get_own_repr(self): + return repr(self._from_ctypes(self._value)) + + +class CTypesGenericArray(CTypesData): + __slots__ = [] + + @classmethod + def _newp(cls, init): + return cls(init) + + def __iter__(self): + for i in xrange(len(self)): + yield self[i] + + def _get_own_repr(self): + return self._addr_repr(ctypes.addressof(self._blob)) + + +class CTypesGenericPtr(CTypesData): + __slots__ = ['_address', '_as_ctype_ptr'] + _automatic_casts = False + kind = "pointer" + + @classmethod + def _newp(cls, init): + return cls(init) + + @classmethod + def _cast_from(cls, source): + if source is None: + address = 0 + elif isinstance(source, CTypesData): + address = source._cast_to_integer() + elif isinstance(source, (int, long)): + address = source + else: + raise TypeError("bad type for cast to %r: %r" % + (cls, type(source).__name__)) + return cls._new_pointer_at(address) + + @classmethod + def _new_pointer_at(cls, address): + self = cls.__new__(cls) + self._address = address + self._as_ctype_ptr = ctypes.cast(address, cls._ctype) + return self + + def _get_own_repr(self): + try: + return self._addr_repr(self._address) + except AttributeError: + return '???' + + def _cast_to_integer(self): + return self._address + + def __nonzero__(self): + return bool(self._address) + __bool__ = __nonzero__ + + @classmethod + def _to_ctypes(cls, value): + if not isinstance(value, CTypesData): + raise TypeError("unexpected %s object" % type(value).__name__) + address = value._convert_to_address(cls) + return ctypes.cast(address, cls._ctype) + + @classmethod + def _from_ctypes(cls, ctypes_ptr): + address = ctypes.cast(ctypes_ptr, ctypes.c_void_p).value or 0 + return cls._new_pointer_at(address) + + @classmethod + def _initialize(cls, ctypes_ptr, value): + if value: + ctypes_ptr.contents = cls._to_ctypes(value).contents + + def _convert_to_address(self, BClass): + if (BClass in (self.__class__, None) or BClass._automatic_casts + or self._automatic_casts): + return self._address + else: + return CTypesData._convert_to_address(self, BClass) + + +class CTypesBaseStructOrUnion(CTypesData): + __slots__ = ['_blob'] + + @classmethod + def _create_ctype_obj(cls, init): + # may be overridden + raise TypeError("cannot instantiate opaque type %s" % (cls,)) + + def _get_own_repr(self): + return self._addr_repr(ctypes.addressof(self._blob)) + + @classmethod + def _offsetof(cls, fieldname): + return getattr(cls._ctype, fieldname).offset + + def _convert_to_address(self, BClass): + if getattr(BClass, '_BItem', None) is self.__class__: + return ctypes.addressof(self._blob) + else: + return CTypesData._convert_to_address(self, BClass) + + @classmethod + def _from_ctypes(cls, ctypes_struct_or_union): + self = cls.__new__(cls) + self._blob = ctypes_struct_or_union + return self + + @classmethod + def _to_ctypes(cls, value): + return value._blob + + def __repr__(self, c_name=None): + return CTypesData.__repr__(self, c_name or self._get_c_name(' &')) + + +class CTypesBackend(object): + + PRIMITIVE_TYPES = { + 'char': ctypes.c_char, + 'short': ctypes.c_short, + 'int': ctypes.c_int, + 'long': ctypes.c_long, + 'long long': ctypes.c_longlong, + 'signed char': ctypes.c_byte, + 'unsigned char': ctypes.c_ubyte, + 'unsigned short': ctypes.c_ushort, + 'unsigned int': ctypes.c_uint, + 'unsigned long': ctypes.c_ulong, + 'unsigned long long': ctypes.c_ulonglong, + 'float': ctypes.c_float, + 'double': ctypes.c_double, + '_Bool': ctypes.c_bool, + } + + for _name in ['unsigned long long', 'unsigned long', + 'unsigned int', 'unsigned short', 'unsigned char']: + _size = ctypes.sizeof(PRIMITIVE_TYPES[_name]) + PRIMITIVE_TYPES['uint%d_t' % (8*_size)] = PRIMITIVE_TYPES[_name] + if _size == ctypes.sizeof(ctypes.c_void_p): + PRIMITIVE_TYPES['uintptr_t'] = PRIMITIVE_TYPES[_name] + if _size == ctypes.sizeof(ctypes.c_size_t): + PRIMITIVE_TYPES['size_t'] = PRIMITIVE_TYPES[_name] + + for _name in ['long long', 'long', 'int', 'short', 'signed char']: + _size = ctypes.sizeof(PRIMITIVE_TYPES[_name]) + PRIMITIVE_TYPES['int%d_t' % (8*_size)] = PRIMITIVE_TYPES[_name] + if _size == ctypes.sizeof(ctypes.c_void_p): + PRIMITIVE_TYPES['intptr_t'] = PRIMITIVE_TYPES[_name] + PRIMITIVE_TYPES['ptrdiff_t'] = PRIMITIVE_TYPES[_name] + if _size == ctypes.sizeof(ctypes.c_size_t): + PRIMITIVE_TYPES['ssize_t'] = PRIMITIVE_TYPES[_name] + + + def __init__(self): + self.RTLD_LAZY = 0 # not supported anyway by ctypes + self.RTLD_NOW = 0 + self.RTLD_GLOBAL = ctypes.RTLD_GLOBAL + self.RTLD_LOCAL = ctypes.RTLD_LOCAL + + def set_ffi(self, ffi): + self.ffi = ffi + + def _get_types(self): + return CTypesData, CTypesType + + def load_library(self, path, flags=0): + cdll = ctypes.CDLL(path, flags) + return CTypesLibrary(self, cdll) + + def new_void_type(self): + class CTypesVoid(CTypesData): + __slots__ = [] + _reftypename = 'void &' + @staticmethod + def _from_ctypes(novalue): + return None + @staticmethod + def _to_ctypes(novalue): + if novalue is not None: + raise TypeError("None expected, got %s object" % + (type(novalue).__name__,)) + return None + CTypesVoid._fix_class() + return CTypesVoid + + def new_primitive_type(self, name): + if name == 'wchar_t': + raise NotImplementedError(name) + ctype = self.PRIMITIVE_TYPES[name] + if name == 'char': + kind = 'char' + elif name in ('float', 'double'): + kind = 'float' + else: + if name in ('signed char', 'unsigned char'): + kind = 'byte' + elif name == '_Bool': + kind = 'bool' + else: + kind = 'int' + is_signed = (ctype(-1).value == -1) + # + def _cast_source_to_int(source): + if isinstance(source, (int, long, float)): + source = int(source) + elif isinstance(source, CTypesData): + source = source._cast_to_integer() + elif isinstance(source, bytes): + source = ord(source) + elif source is None: + source = 0 + else: + raise TypeError("bad type for cast to %r: %r" % + (CTypesPrimitive, type(source).__name__)) + return source + # + kind1 = kind + class CTypesPrimitive(CTypesGenericPrimitive): + __slots__ = ['_value'] + _ctype = ctype + _reftypename = '%s &' % name + kind = kind1 + + def __init__(self, value): + self._value = value + + @staticmethod + def _create_ctype_obj(init): + if init is None: + return ctype() + return ctype(CTypesPrimitive._to_ctypes(init)) + + if kind == 'int' or kind == 'byte': + @classmethod + def _cast_from(cls, source): + source = _cast_source_to_int(source) + source = ctype(source).value # cast within range + return cls(source) + def __int__(self): + return self._value + + if kind == 'bool': + @classmethod + def _cast_from(cls, source): + if not isinstance(source, (int, long, float)): + source = _cast_source_to_int(source) + return cls(bool(source)) + def __int__(self): + return int(self._value) + + if kind == 'char': + @classmethod + def _cast_from(cls, source): + source = _cast_source_to_int(source) + source = bytechr(source & 0xFF) + return cls(source) + def __int__(self): + return ord(self._value) + + if kind == 'float': + @classmethod + def _cast_from(cls, source): + if isinstance(source, float): + pass + elif isinstance(source, CTypesGenericPrimitive): + if hasattr(source, '__float__'): + source = float(source) + else: + source = int(source) + else: + source = _cast_source_to_int(source) + source = ctype(source).value # fix precision + return cls(source) + def __int__(self): + return int(self._value) + def __float__(self): + return self._value + + _cast_to_integer = __int__ + + if kind == 'int' or kind == 'byte' or kind == 'bool': + @staticmethod + def _to_ctypes(x): + if not isinstance(x, (int, long)): + if isinstance(x, CTypesData): + x = int(x) + else: + raise TypeError("integer expected, got %s" % + type(x).__name__) + if ctype(x).value != x: + if not is_signed and x < 0: + raise OverflowError("%s: negative integer" % name) + else: + raise OverflowError("%s: integer out of bounds" + % name) + return x + + if kind == 'char': + @staticmethod + def _to_ctypes(x): + if isinstance(x, bytes) and len(x) == 1: + return x + if isinstance(x, CTypesPrimitive): # > + return x._value + raise TypeError("character expected, got %s" % + type(x).__name__) + def __nonzero__(self): + return ord(self._value) != 0 + else: + def __nonzero__(self): + return self._value != 0 + __bool__ = __nonzero__ + + if kind == 'float': + @staticmethod + def _to_ctypes(x): + if not isinstance(x, (int, long, float, CTypesData)): + raise TypeError("float expected, got %s" % + type(x).__name__) + return ctype(x).value + + @staticmethod + def _from_ctypes(value): + return getattr(value, 'value', value) + + @staticmethod + def _initialize(blob, init): + blob.value = CTypesPrimitive._to_ctypes(init) + + if kind == 'char': + def _to_string(self, maxlen): + return self._value + if kind == 'byte': + def _to_string(self, maxlen): + return chr(self._value & 0xff) + # + CTypesPrimitive._fix_class() + return CTypesPrimitive + + def new_pointer_type(self, BItem): + getbtype = self.ffi._get_cached_btype + if BItem is getbtype(model.PrimitiveType('char')): + kind = 'charp' + elif BItem in (getbtype(model.PrimitiveType('signed char')), + getbtype(model.PrimitiveType('unsigned char'))): + kind = 'bytep' + elif BItem is getbtype(model.void_type): + kind = 'voidp' + else: + kind = 'generic' + # + class CTypesPtr(CTypesGenericPtr): + __slots__ = ['_own'] + if kind == 'charp': + __slots__ += ['__as_strbuf'] + _BItem = BItem + if hasattr(BItem, '_ctype'): + _ctype = ctypes.POINTER(BItem._ctype) + _bitem_size = ctypes.sizeof(BItem._ctype) + else: + _ctype = ctypes.c_void_p + if issubclass(BItem, CTypesGenericArray): + _reftypename = BItem._get_c_name('(* &)') + else: + _reftypename = BItem._get_c_name(' * &') + + def __init__(self, init): + ctypeobj = BItem._create_ctype_obj(init) + if kind == 'charp': + self.__as_strbuf = ctypes.create_string_buffer( + ctypeobj.value + b'\x00') + self._as_ctype_ptr = ctypes.cast( + self.__as_strbuf, self._ctype) + else: + self._as_ctype_ptr = ctypes.pointer(ctypeobj) + self._address = ctypes.cast(self._as_ctype_ptr, + ctypes.c_void_p).value + self._own = True + + def __add__(self, other): + if isinstance(other, (int, long)): + return self._new_pointer_at(self._address + + other * self._bitem_size) + else: + return NotImplemented + + def __sub__(self, other): + if isinstance(other, (int, long)): + return self._new_pointer_at(self._address - + other * self._bitem_size) + elif type(self) is type(other): + return (self._address - other._address) // self._bitem_size + else: + return NotImplemented + + def __getitem__(self, index): + if getattr(self, '_own', False) and index != 0: + raise IndexError + return BItem._from_ctypes(self._as_ctype_ptr[index]) + + def __setitem__(self, index, value): + self._as_ctype_ptr[index] = BItem._to_ctypes(value) + + if kind == 'charp' or kind == 'voidp': + @classmethod + def _arg_to_ctypes(cls, *value): + if value and isinstance(value[0], bytes): + return ctypes.c_char_p(value[0]) + else: + return super(CTypesPtr, cls)._arg_to_ctypes(*value) + + if kind == 'charp' or kind == 'bytep': + def _to_string(self, maxlen): + if maxlen < 0: + maxlen = sys.maxsize + p = ctypes.cast(self._as_ctype_ptr, + ctypes.POINTER(ctypes.c_char)) + n = 0 + while n < maxlen and p[n] != b'\x00': + n += 1 + return b''.join([p[i] for i in range(n)]) + + def _get_own_repr(self): + if getattr(self, '_own', False): + return 'owning %d bytes' % ( + ctypes.sizeof(self._as_ctype_ptr.contents),) + return super(CTypesPtr, self)._get_own_repr() + # + if (BItem is self.ffi._get_cached_btype(model.void_type) or + BItem is self.ffi._get_cached_btype(model.PrimitiveType('char'))): + CTypesPtr._automatic_casts = True + # + CTypesPtr._fix_class() + return CTypesPtr + + def new_array_type(self, CTypesPtr, length): + if length is None: + brackets = ' &[]' + else: + brackets = ' &[%d]' % length + BItem = CTypesPtr._BItem + getbtype = self.ffi._get_cached_btype + if BItem is getbtype(model.PrimitiveType('char')): + kind = 'char' + elif BItem in (getbtype(model.PrimitiveType('signed char')), + getbtype(model.PrimitiveType('unsigned char'))): + kind = 'byte' + else: + kind = 'generic' + # + class CTypesArray(CTypesGenericArray): + __slots__ = ['_blob', '_own'] + if length is not None: + _ctype = BItem._ctype * length + else: + __slots__.append('_ctype') + _reftypename = BItem._get_c_name(brackets) + _declared_length = length + _CTPtr = CTypesPtr + + def __init__(self, init): + if length is None: + if isinstance(init, (int, long)): + len1 = init + init = None + elif kind == 'char' and isinstance(init, bytes): + len1 = len(init) + 1 # extra null + else: + init = tuple(init) + len1 = len(init) + self._ctype = BItem._ctype * len1 + self._blob = self._ctype() + self._own = True + if init is not None: + self._initialize(self._blob, init) + + @staticmethod + def _initialize(blob, init): + if isinstance(init, bytes): + init = [init[i:i+1] for i in range(len(init))] + else: + if isinstance(init, CTypesGenericArray): + if (len(init) != len(blob) or + not isinstance(init, CTypesArray)): + raise TypeError("length/type mismatch: %s" % (init,)) + init = tuple(init) + if len(init) > len(blob): + raise IndexError("too many initializers") + addr = ctypes.cast(blob, ctypes.c_void_p).value + PTR = ctypes.POINTER(BItem._ctype) + itemsize = ctypes.sizeof(BItem._ctype) + for i, value in enumerate(init): + p = ctypes.cast(addr + i * itemsize, PTR) + BItem._initialize(p.contents, value) + + def __len__(self): + return len(self._blob) + + def __getitem__(self, index): + if not (0 <= index < len(self._blob)): + raise IndexError + return BItem._from_ctypes(self._blob[index]) + + def __setitem__(self, index, value): + if not (0 <= index < len(self._blob)): + raise IndexError + self._blob[index] = BItem._to_ctypes(value) + + if kind == 'char' or kind == 'byte': + def _to_string(self, maxlen): + if maxlen < 0: + maxlen = len(self._blob) + p = ctypes.cast(self._blob, + ctypes.POINTER(ctypes.c_char)) + n = 0 + while n < maxlen and p[n] != b'\x00': + n += 1 + return b''.join([p[i] for i in range(n)]) + + def _get_own_repr(self): + if getattr(self, '_own', False): + return 'owning %d bytes' % (ctypes.sizeof(self._blob),) + return super(CTypesArray, self)._get_own_repr() + + def _convert_to_address(self, BClass): + if BClass in (CTypesPtr, None) or BClass._automatic_casts: + return ctypes.addressof(self._blob) + else: + return CTypesData._convert_to_address(self, BClass) + + @staticmethod + def _from_ctypes(ctypes_array): + self = CTypesArray.__new__(CTypesArray) + self._blob = ctypes_array + return self + + @staticmethod + def _arg_to_ctypes(value): + return CTypesPtr._arg_to_ctypes(value) + + def __add__(self, other): + if isinstance(other, (int, long)): + return CTypesPtr._new_pointer_at( + ctypes.addressof(self._blob) + + other * ctypes.sizeof(BItem._ctype)) + else: + return NotImplemented + + @classmethod + def _cast_from(cls, source): + raise NotImplementedError("casting to %r" % ( + cls._get_c_name(),)) + # + CTypesArray._fix_class() + return CTypesArray + + def _new_struct_or_union(self, kind, name, base_ctypes_class): + # + class struct_or_union(base_ctypes_class): + pass + struct_or_union.__name__ = '%s_%s' % (kind, name) + kind1 = kind + # + class CTypesStructOrUnion(CTypesBaseStructOrUnion): + __slots__ = ['_blob'] + _ctype = struct_or_union + _reftypename = '%s &' % (name,) + _kind = kind = kind1 + # + CTypesStructOrUnion._fix_class() + return CTypesStructOrUnion + + def new_struct_type(self, name): + return self._new_struct_or_union('struct', name, ctypes.Structure) + + def new_union_type(self, name): + return self._new_struct_or_union('union', name, ctypes.Union) + + def complete_struct_or_union(self, CTypesStructOrUnion, fields, tp, + totalsize=-1, totalalignment=-1, sflags=0, + pack=0): + if totalsize >= 0 or totalalignment >= 0: + raise NotImplementedError("the ctypes backend of CFFI does not support " + "structures completed by verify(); please " + "compile and install the _cffi_backend module.") + struct_or_union = CTypesStructOrUnion._ctype + fnames = [fname for (fname, BField, bitsize) in fields] + btypes = [BField for (fname, BField, bitsize) in fields] + bitfields = [bitsize for (fname, BField, bitsize) in fields] + # + bfield_types = {} + cfields = [] + for (fname, BField, bitsize) in fields: + if bitsize < 0: + cfields.append((fname, BField._ctype)) + bfield_types[fname] = BField + else: + cfields.append((fname, BField._ctype, bitsize)) + bfield_types[fname] = Ellipsis + if sflags & 8: + struct_or_union._pack_ = 1 + elif pack: + struct_or_union._pack_ = pack + struct_or_union._fields_ = cfields + CTypesStructOrUnion._bfield_types = bfield_types + # + @staticmethod + def _create_ctype_obj(init): + result = struct_or_union() + if init is not None: + initialize(result, init) + return result + CTypesStructOrUnion._create_ctype_obj = _create_ctype_obj + # + def initialize(blob, init): + if is_union: + if len(init) > 1: + raise ValueError("union initializer: %d items given, but " + "only one supported (use a dict if needed)" + % (len(init),)) + if not isinstance(init, dict): + if isinstance(init, (bytes, unicode)): + raise TypeError("union initializer: got a str") + init = tuple(init) + if len(init) > len(fnames): + raise ValueError("too many values for %s initializer" % + CTypesStructOrUnion._get_c_name()) + init = dict(zip(fnames, init)) + addr = ctypes.addressof(blob) + for fname, value in init.items(): + BField, bitsize = name2fieldtype[fname] + assert bitsize < 0, \ + "not implemented: initializer with bit fields" + offset = CTypesStructOrUnion._offsetof(fname) + PTR = ctypes.POINTER(BField._ctype) + p = ctypes.cast(addr + offset, PTR) + BField._initialize(p.contents, value) + is_union = CTypesStructOrUnion._kind == 'union' + name2fieldtype = dict(zip(fnames, zip(btypes, bitfields))) + # + for fname, BField, bitsize in fields: + if fname == '': + raise NotImplementedError("nested anonymous structs/unions") + if hasattr(CTypesStructOrUnion, fname): + raise ValueError("the field name %r conflicts in " + "the ctypes backend" % fname) + if bitsize < 0: + def getter(self, fname=fname, BField=BField, + offset=CTypesStructOrUnion._offsetof(fname), + PTR=ctypes.POINTER(BField._ctype)): + addr = ctypes.addressof(self._blob) + p = ctypes.cast(addr + offset, PTR) + return BField._from_ctypes(p.contents) + def setter(self, value, fname=fname, BField=BField): + setattr(self._blob, fname, BField._to_ctypes(value)) + # + if issubclass(BField, CTypesGenericArray): + setter = None + if BField._declared_length == 0: + def getter(self, fname=fname, BFieldPtr=BField._CTPtr, + offset=CTypesStructOrUnion._offsetof(fname), + PTR=ctypes.POINTER(BField._ctype)): + addr = ctypes.addressof(self._blob) + p = ctypes.cast(addr + offset, PTR) + return BFieldPtr._from_ctypes(p) + # + else: + def getter(self, fname=fname, BField=BField): + return BField._from_ctypes(getattr(self._blob, fname)) + def setter(self, value, fname=fname, BField=BField): + # xxx obscure workaround + value = BField._to_ctypes(value) + oldvalue = getattr(self._blob, fname) + setattr(self._blob, fname, value) + if value != getattr(self._blob, fname): + setattr(self._blob, fname, oldvalue) + raise OverflowError("value too large for bitfield") + setattr(CTypesStructOrUnion, fname, property(getter, setter)) + # + CTypesPtr = self.ffi._get_cached_btype(model.PointerType(tp)) + for fname in fnames: + if hasattr(CTypesPtr, fname): + raise ValueError("the field name %r conflicts in " + "the ctypes backend" % fname) + def getter(self, fname=fname): + return getattr(self[0], fname) + def setter(self, value, fname=fname): + setattr(self[0], fname, value) + setattr(CTypesPtr, fname, property(getter, setter)) + + def new_function_type(self, BArgs, BResult, has_varargs): + nameargs = [BArg._get_c_name() for BArg in BArgs] + if has_varargs: + nameargs.append('...') + nameargs = ', '.join(nameargs) + # + class CTypesFunctionPtr(CTypesGenericPtr): + __slots__ = ['_own_callback', '_name'] + _ctype = ctypes.CFUNCTYPE(getattr(BResult, '_ctype', None), + *[BArg._ctype for BArg in BArgs], + use_errno=True) + _reftypename = BResult._get_c_name('(* &)(%s)' % (nameargs,)) + + def __init__(self, init, error=None): + # create a callback to the Python callable init() + import traceback + assert not has_varargs, "varargs not supported for callbacks" + if getattr(BResult, '_ctype', None) is not None: + error = BResult._from_ctypes( + BResult._create_ctype_obj(error)) + else: + error = None + def callback(*args): + args2 = [] + for arg, BArg in zip(args, BArgs): + args2.append(BArg._from_ctypes(arg)) + try: + res2 = init(*args2) + res2 = BResult._to_ctypes(res2) + except: + traceback.print_exc() + res2 = error + if issubclass(BResult, CTypesGenericPtr): + if res2: + res2 = ctypes.cast(res2, ctypes.c_void_p).value + # .value: http://bugs.python.org/issue1574593 + else: + res2 = None + #print repr(res2) + return res2 + if issubclass(BResult, CTypesGenericPtr): + # The only pointers callbacks can return are void*s: + # http://bugs.python.org/issue5710 + callback_ctype = ctypes.CFUNCTYPE( + ctypes.c_void_p, + *[BArg._ctype for BArg in BArgs], + use_errno=True) + else: + callback_ctype = CTypesFunctionPtr._ctype + self._as_ctype_ptr = callback_ctype(callback) + self._address = ctypes.cast(self._as_ctype_ptr, + ctypes.c_void_p).value + self._own_callback = init + + @staticmethod + def _initialize(ctypes_ptr, value): + if value: + raise NotImplementedError("ctypes backend: not supported: " + "initializers for function pointers") + + def __repr__(self): + c_name = getattr(self, '_name', None) + if c_name: + i = self._reftypename.index('(* &)') + if self._reftypename[i-1] not in ' )*': + c_name = ' ' + c_name + c_name = self._reftypename.replace('(* &)', c_name) + return CTypesData.__repr__(self, c_name) + + def _get_own_repr(self): + if getattr(self, '_own_callback', None) is not None: + return 'calling %r' % (self._own_callback,) + return super(CTypesFunctionPtr, self)._get_own_repr() + + def __call__(self, *args): + if has_varargs: + assert len(args) >= len(BArgs) + extraargs = args[len(BArgs):] + args = args[:len(BArgs)] + else: + assert len(args) == len(BArgs) + ctypes_args = [] + for arg, BArg in zip(args, BArgs): + ctypes_args.append(BArg._arg_to_ctypes(arg)) + if has_varargs: + for i, arg in enumerate(extraargs): + if arg is None: + ctypes_args.append(ctypes.c_void_p(0)) # NULL + continue + if not isinstance(arg, CTypesData): + raise TypeError( + "argument %d passed in the variadic part " + "needs to be a cdata object (got %s)" % + (1 + len(BArgs) + i, type(arg).__name__)) + ctypes_args.append(arg._arg_to_ctypes(arg)) + result = self._as_ctype_ptr(*ctypes_args) + return BResult._from_ctypes(result) + # + CTypesFunctionPtr._fix_class() + return CTypesFunctionPtr + + def new_enum_type(self, name, enumerators, enumvalues, CTypesInt): + assert isinstance(name, str) + reverse_mapping = dict(zip(reversed(enumvalues), + reversed(enumerators))) + # + class CTypesEnum(CTypesInt): + __slots__ = [] + _reftypename = '%s &' % name + + def _get_own_repr(self): + value = self._value + try: + return '%d: %s' % (value, reverse_mapping[value]) + except KeyError: + return str(value) + + def _to_string(self, maxlen): + value = self._value + try: + return reverse_mapping[value] + except KeyError: + return str(value) + # + CTypesEnum._fix_class() + return CTypesEnum + + def get_errno(self): + return ctypes.get_errno() + + def set_errno(self, value): + ctypes.set_errno(value) + + def string(self, b, maxlen=-1): + return b._to_string(maxlen) + + def buffer(self, bptr, size=-1): + raise NotImplementedError("buffer() with ctypes backend") + + def sizeof(self, cdata_or_BType): + if isinstance(cdata_or_BType, CTypesData): + return cdata_or_BType._get_size_of_instance() + else: + assert issubclass(cdata_or_BType, CTypesData) + return cdata_or_BType._get_size() + + def alignof(self, BType): + assert issubclass(BType, CTypesData) + return BType._alignment() + + def newp(self, BType, source): + if not issubclass(BType, CTypesData): + raise TypeError + return BType._newp(source) + + def cast(self, BType, source): + return BType._cast_from(source) + + def callback(self, BType, source, error, onerror): + assert onerror is None # XXX not implemented + return BType(source, error) + + _weakref_cache_ref = None + + def gcp(self, cdata, destructor, size=0): + if self._weakref_cache_ref is None: + import weakref + class MyRef(weakref.ref): + def __eq__(self, other): + myref = self() + return self is other or ( + myref is not None and myref is other()) + def __ne__(self, other): + return not (self == other) + def __hash__(self): + try: + return self._hash + except AttributeError: + self._hash = hash(self()) + return self._hash + self._weakref_cache_ref = {}, MyRef + weak_cache, MyRef = self._weakref_cache_ref + + if destructor is None: + try: + del weak_cache[MyRef(cdata)] + except KeyError: + raise TypeError("Can remove destructor only on a object " + "previously returned by ffi.gc()") + return None + + def remove(k): + cdata, destructor = weak_cache.pop(k, (None, None)) + if destructor is not None: + destructor(cdata) + + new_cdata = self.cast(self.typeof(cdata), cdata) + assert new_cdata is not cdata + weak_cache[MyRef(new_cdata, remove)] = (cdata, destructor) + return new_cdata + + typeof = type + + def getcname(self, BType, replace_with): + return BType._get_c_name(replace_with) + + def typeoffsetof(self, BType, fieldname, num=0): + if isinstance(fieldname, str): + if num == 0 and issubclass(BType, CTypesGenericPtr): + BType = BType._BItem + if not issubclass(BType, CTypesBaseStructOrUnion): + raise TypeError("expected a struct or union ctype") + BField = BType._bfield_types[fieldname] + if BField is Ellipsis: + raise TypeError("not supported for bitfields") + return (BField, BType._offsetof(fieldname)) + elif isinstance(fieldname, (int, long)): + if issubclass(BType, CTypesGenericArray): + BType = BType._CTPtr + if not issubclass(BType, CTypesGenericPtr): + raise TypeError("expected an array or ptr ctype") + BItem = BType._BItem + offset = BItem._get_size() * fieldname + if offset > sys.maxsize: + raise OverflowError + return (BItem, offset) + else: + raise TypeError(type(fieldname)) + + def rawaddressof(self, BTypePtr, cdata, offset=None): + if isinstance(cdata, CTypesBaseStructOrUnion): + ptr = ctypes.pointer(type(cdata)._to_ctypes(cdata)) + elif isinstance(cdata, CTypesGenericPtr): + if offset is None or not issubclass(type(cdata)._BItem, + CTypesBaseStructOrUnion): + raise TypeError("unexpected cdata type") + ptr = type(cdata)._to_ctypes(cdata) + elif isinstance(cdata, CTypesGenericArray): + ptr = type(cdata)._to_ctypes(cdata) + else: + raise TypeError("expected a ") + if offset: + ptr = ctypes.cast( + ctypes.c_void_p( + ctypes.cast(ptr, ctypes.c_void_p).value + offset), + type(ptr)) + return BTypePtr._from_ctypes(ptr) + + +class CTypesLibrary(object): + + def __init__(self, backend, cdll): + self.backend = backend + self.cdll = cdll + + def load_function(self, BType, name): + c_func = getattr(self.cdll, name) + funcobj = BType._from_ctypes(c_func) + funcobj._name = name + return funcobj + + def read_variable(self, BType, name): + try: + ctypes_obj = BType._ctype.in_dll(self.cdll, name) + except AttributeError as e: + raise NotImplementedError(e) + return BType._from_ctypes(ctypes_obj) + + def write_variable(self, BType, name, value): + new_ctypes_obj = BType._to_ctypes(value) + ctypes_obj = BType._ctype.in_dll(self.cdll, name) + ctypes.memmove(ctypes.addressof(ctypes_obj), + ctypes.addressof(new_ctypes_obj), + ctypes.sizeof(BType._ctype)) diff --git a/venv/lib/python3.11/site-packages/cffi/cffi_opcode.py b/venv/lib/python3.11/site-packages/cffi/cffi_opcode.py new file mode 100644 index 0000000..6421df6 --- /dev/null +++ b/venv/lib/python3.11/site-packages/cffi/cffi_opcode.py @@ -0,0 +1,187 @@ +from .error import VerificationError + +class CffiOp(object): + def __init__(self, op, arg): + self.op = op + self.arg = arg + + def as_c_expr(self): + if self.op is None: + assert isinstance(self.arg, str) + return '(_cffi_opcode_t)(%s)' % (self.arg,) + classname = CLASS_NAME[self.op] + return '_CFFI_OP(_CFFI_OP_%s, %s)' % (classname, self.arg) + + def as_python_bytes(self): + if self.op is None and self.arg.isdigit(): + value = int(self.arg) # non-negative: '-' not in self.arg + if value >= 2**31: + raise OverflowError("cannot emit %r: limited to 2**31-1" + % (self.arg,)) + return format_four_bytes(value) + if isinstance(self.arg, str): + raise VerificationError("cannot emit to Python: %r" % (self.arg,)) + return format_four_bytes((self.arg << 8) | self.op) + + def __str__(self): + classname = CLASS_NAME.get(self.op, self.op) + return '(%s %s)' % (classname, self.arg) + +def format_four_bytes(num): + return '\\x%02X\\x%02X\\x%02X\\x%02X' % ( + (num >> 24) & 0xFF, + (num >> 16) & 0xFF, + (num >> 8) & 0xFF, + (num ) & 0xFF) + +OP_PRIMITIVE = 1 +OP_POINTER = 3 +OP_ARRAY = 5 +OP_OPEN_ARRAY = 7 +OP_STRUCT_UNION = 9 +OP_ENUM = 11 +OP_FUNCTION = 13 +OP_FUNCTION_END = 15 +OP_NOOP = 17 +OP_BITFIELD = 19 +OP_TYPENAME = 21 +OP_CPYTHON_BLTN_V = 23 # varargs +OP_CPYTHON_BLTN_N = 25 # noargs +OP_CPYTHON_BLTN_O = 27 # O (i.e. a single arg) +OP_CONSTANT = 29 +OP_CONSTANT_INT = 31 +OP_GLOBAL_VAR = 33 +OP_DLOPEN_FUNC = 35 +OP_DLOPEN_CONST = 37 +OP_GLOBAL_VAR_F = 39 +OP_EXTERN_PYTHON = 41 + +PRIM_VOID = 0 +PRIM_BOOL = 1 +PRIM_CHAR = 2 +PRIM_SCHAR = 3 +PRIM_UCHAR = 4 +PRIM_SHORT = 5 +PRIM_USHORT = 6 +PRIM_INT = 7 +PRIM_UINT = 8 +PRIM_LONG = 9 +PRIM_ULONG = 10 +PRIM_LONGLONG = 11 +PRIM_ULONGLONG = 12 +PRIM_FLOAT = 13 +PRIM_DOUBLE = 14 +PRIM_LONGDOUBLE = 15 + +PRIM_WCHAR = 16 +PRIM_INT8 = 17 +PRIM_UINT8 = 18 +PRIM_INT16 = 19 +PRIM_UINT16 = 20 +PRIM_INT32 = 21 +PRIM_UINT32 = 22 +PRIM_INT64 = 23 +PRIM_UINT64 = 24 +PRIM_INTPTR = 25 +PRIM_UINTPTR = 26 +PRIM_PTRDIFF = 27 +PRIM_SIZE = 28 +PRIM_SSIZE = 29 +PRIM_INT_LEAST8 = 30 +PRIM_UINT_LEAST8 = 31 +PRIM_INT_LEAST16 = 32 +PRIM_UINT_LEAST16 = 33 +PRIM_INT_LEAST32 = 34 +PRIM_UINT_LEAST32 = 35 +PRIM_INT_LEAST64 = 36 +PRIM_UINT_LEAST64 = 37 +PRIM_INT_FAST8 = 38 +PRIM_UINT_FAST8 = 39 +PRIM_INT_FAST16 = 40 +PRIM_UINT_FAST16 = 41 +PRIM_INT_FAST32 = 42 +PRIM_UINT_FAST32 = 43 +PRIM_INT_FAST64 = 44 +PRIM_UINT_FAST64 = 45 +PRIM_INTMAX = 46 +PRIM_UINTMAX = 47 +PRIM_FLOATCOMPLEX = 48 +PRIM_DOUBLECOMPLEX = 49 +PRIM_CHAR16 = 50 +PRIM_CHAR32 = 51 + +_NUM_PRIM = 52 +_UNKNOWN_PRIM = -1 +_UNKNOWN_FLOAT_PRIM = -2 +_UNKNOWN_LONG_DOUBLE = -3 + +_IO_FILE_STRUCT = -1 + +PRIMITIVE_TO_INDEX = { + 'char': PRIM_CHAR, + 'short': PRIM_SHORT, + 'int': PRIM_INT, + 'long': PRIM_LONG, + 'long long': PRIM_LONGLONG, + 'signed char': PRIM_SCHAR, + 'unsigned char': PRIM_UCHAR, + 'unsigned short': PRIM_USHORT, + 'unsigned int': PRIM_UINT, + 'unsigned long': PRIM_ULONG, + 'unsigned long long': PRIM_ULONGLONG, + 'float': PRIM_FLOAT, + 'double': PRIM_DOUBLE, + 'long double': PRIM_LONGDOUBLE, + '_cffi_float_complex_t': PRIM_FLOATCOMPLEX, + '_cffi_double_complex_t': PRIM_DOUBLECOMPLEX, + '_Bool': PRIM_BOOL, + 'wchar_t': PRIM_WCHAR, + 'char16_t': PRIM_CHAR16, + 'char32_t': PRIM_CHAR32, + 'int8_t': PRIM_INT8, + 'uint8_t': PRIM_UINT8, + 'int16_t': PRIM_INT16, + 'uint16_t': PRIM_UINT16, + 'int32_t': PRIM_INT32, + 'uint32_t': PRIM_UINT32, + 'int64_t': PRIM_INT64, + 'uint64_t': PRIM_UINT64, + 'intptr_t': PRIM_INTPTR, + 'uintptr_t': PRIM_UINTPTR, + 'ptrdiff_t': PRIM_PTRDIFF, + 'size_t': PRIM_SIZE, + 'ssize_t': PRIM_SSIZE, + 'int_least8_t': PRIM_INT_LEAST8, + 'uint_least8_t': PRIM_UINT_LEAST8, + 'int_least16_t': PRIM_INT_LEAST16, + 'uint_least16_t': PRIM_UINT_LEAST16, + 'int_least32_t': PRIM_INT_LEAST32, + 'uint_least32_t': PRIM_UINT_LEAST32, + 'int_least64_t': PRIM_INT_LEAST64, + 'uint_least64_t': PRIM_UINT_LEAST64, + 'int_fast8_t': PRIM_INT_FAST8, + 'uint_fast8_t': PRIM_UINT_FAST8, + 'int_fast16_t': PRIM_INT_FAST16, + 'uint_fast16_t': PRIM_UINT_FAST16, + 'int_fast32_t': PRIM_INT_FAST32, + 'uint_fast32_t': PRIM_UINT_FAST32, + 'int_fast64_t': PRIM_INT_FAST64, + 'uint_fast64_t': PRIM_UINT_FAST64, + 'intmax_t': PRIM_INTMAX, + 'uintmax_t': PRIM_UINTMAX, + } + +F_UNION = 0x01 +F_CHECK_FIELDS = 0x02 +F_PACKED = 0x04 +F_EXTERNAL = 0x08 +F_OPAQUE = 0x10 + +G_FLAGS = dict([('_CFFI_' + _key, globals()[_key]) + for _key in ['F_UNION', 'F_CHECK_FIELDS', 'F_PACKED', + 'F_EXTERNAL', 'F_OPAQUE']]) + +CLASS_NAME = {} +for _name, _value in list(globals().items()): + if _name.startswith('OP_') and isinstance(_value, int): + CLASS_NAME[_value] = _name[3:] diff --git a/venv/lib/python3.11/site-packages/cffi/commontypes.py b/venv/lib/python3.11/site-packages/cffi/commontypes.py new file mode 100644 index 0000000..d4dae35 --- /dev/null +++ b/venv/lib/python3.11/site-packages/cffi/commontypes.py @@ -0,0 +1,82 @@ +import sys +from . import model +from .error import FFIError + + +COMMON_TYPES = {} + +try: + # fetch "bool" and all simple Windows types + from _cffi_backend import _get_common_types + _get_common_types(COMMON_TYPES) +except ImportError: + pass + +COMMON_TYPES['FILE'] = model.unknown_type('FILE', '_IO_FILE') +COMMON_TYPES['bool'] = '_Bool' # in case we got ImportError above +COMMON_TYPES['float _Complex'] = '_cffi_float_complex_t' +COMMON_TYPES['double _Complex'] = '_cffi_double_complex_t' + +for _type in model.PrimitiveType.ALL_PRIMITIVE_TYPES: + if _type.endswith('_t'): + COMMON_TYPES[_type] = _type +del _type + +_CACHE = {} + +def resolve_common_type(parser, commontype): + try: + return _CACHE[commontype] + except KeyError: + cdecl = COMMON_TYPES.get(commontype, commontype) + if not isinstance(cdecl, str): + result, quals = cdecl, 0 # cdecl is already a BaseType + elif cdecl in model.PrimitiveType.ALL_PRIMITIVE_TYPES: + result, quals = model.PrimitiveType(cdecl), 0 + elif cdecl == 'set-unicode-needed': + raise FFIError("The Windows type %r is only available after " + "you call ffi.set_unicode()" % (commontype,)) + else: + if commontype == cdecl: + raise FFIError( + "Unsupported type: %r. Please look at " + "http://cffi.readthedocs.io/en/latest/cdef.html#ffi-cdef-limitations " + "and file an issue if you think this type should really " + "be supported." % (commontype,)) + result, quals = parser.parse_type_and_quals(cdecl) # recursive + + assert isinstance(result, model.BaseTypeByIdentity) + _CACHE[commontype] = result, quals + return result, quals + + +# ____________________________________________________________ +# extra types for Windows (most of them are in commontypes.c) + + +def win_common_types(): + return { + "UNICODE_STRING": model.StructType( + "_UNICODE_STRING", + ["Length", + "MaximumLength", + "Buffer"], + [model.PrimitiveType("unsigned short"), + model.PrimitiveType("unsigned short"), + model.PointerType(model.PrimitiveType("wchar_t"))], + [-1, -1, -1]), + "PUNICODE_STRING": "UNICODE_STRING *", + "PCUNICODE_STRING": "const UNICODE_STRING *", + + "TBYTE": "set-unicode-needed", + "TCHAR": "set-unicode-needed", + "LPCTSTR": "set-unicode-needed", + "PCTSTR": "set-unicode-needed", + "LPTSTR": "set-unicode-needed", + "PTSTR": "set-unicode-needed", + "PTBYTE": "set-unicode-needed", + "PTCHAR": "set-unicode-needed", + } + +if sys.platform == 'win32': + COMMON_TYPES.update(win_common_types()) diff --git a/venv/lib/python3.11/site-packages/cffi/cparser.py b/venv/lib/python3.11/site-packages/cffi/cparser.py new file mode 100644 index 0000000..dd590d8 --- /dev/null +++ b/venv/lib/python3.11/site-packages/cffi/cparser.py @@ -0,0 +1,1015 @@ +from . import model +from .commontypes import COMMON_TYPES, resolve_common_type +from .error import FFIError, CDefError +try: + from . import _pycparser as pycparser +except ImportError: + import pycparser +import weakref, re, sys + +try: + if sys.version_info < (3,): + import thread as _thread + else: + import _thread + lock = _thread.allocate_lock() +except ImportError: + lock = None + +def _workaround_for_static_import_finders(): + # Issue #392: packaging tools like cx_Freeze can not find these + # because pycparser uses exec dynamic import. This is an obscure + # workaround. This function is never called. + import pycparser.yacctab + import pycparser.lextab + +CDEF_SOURCE_STRING = "" +_r_comment = re.compile(r"/\*.*?\*/|//([^\n\\]|\\.)*?$", + re.DOTALL | re.MULTILINE) +_r_define = re.compile(r"^\s*#\s*define\s+([A-Za-z_][A-Za-z_0-9]*)" + r"\b((?:[^\n\\]|\\.)*?)$", + re.DOTALL | re.MULTILINE) +_r_line_directive = re.compile(r"^[ \t]*#[ \t]*(?:line|\d+)\b.*$", re.MULTILINE) +_r_partial_enum = re.compile(r"=\s*\.\.\.\s*[,}]|\.\.\.\s*\}") +_r_enum_dotdotdot = re.compile(r"__dotdotdot\d+__$") +_r_partial_array = re.compile(r"\[\s*\.\.\.\s*\]") +_r_words = re.compile(r"\w+|\S") +_parser_cache = None +_r_int_literal = re.compile(r"-?0?x?[0-9a-f]+[lu]*$", re.IGNORECASE) +_r_stdcall1 = re.compile(r"\b(__stdcall|WINAPI)\b") +_r_stdcall2 = re.compile(r"[(]\s*(__stdcall|WINAPI)\b") +_r_cdecl = re.compile(r"\b__cdecl\b") +_r_extern_python = re.compile(r'\bextern\s*"' + r'(Python|Python\s*\+\s*C|C\s*\+\s*Python)"\s*.') +_r_star_const_space = re.compile( # matches "* const " + r"[*]\s*((const|volatile|restrict)\b\s*)+") +_r_int_dotdotdot = re.compile(r"(\b(int|long|short|signed|unsigned|char)\s*)+" + r"\.\.\.") +_r_float_dotdotdot = re.compile(r"\b(double|float)\s*\.\.\.") + +def _get_parser(): + global _parser_cache + if _parser_cache is None: + _parser_cache = pycparser.CParser() + return _parser_cache + +def _workaround_for_old_pycparser(csource): + # Workaround for a pycparser issue (fixed between pycparser 2.10 and + # 2.14): "char*const***" gives us a wrong syntax tree, the same as + # for "char***(*const)". This means we can't tell the difference + # afterwards. But "char(*const(***))" gives us the right syntax + # tree. The issue only occurs if there are several stars in + # sequence with no parenthesis in between, just possibly qualifiers. + # Attempt to fix it by adding some parentheses in the source: each + # time we see "* const" or "* const *", we add an opening + # parenthesis before each star---the hard part is figuring out where + # to close them. + parts = [] + while True: + match = _r_star_const_space.search(csource) + if not match: + break + #print repr(''.join(parts)+csource), '=>', + parts.append(csource[:match.start()]) + parts.append('('); closing = ')' + parts.append(match.group()) # e.g. "* const " + endpos = match.end() + if csource.startswith('*', endpos): + parts.append('('); closing += ')' + level = 0 + i = endpos + while i < len(csource): + c = csource[i] + if c == '(': + level += 1 + elif c == ')': + if level == 0: + break + level -= 1 + elif c in ',;=': + if level == 0: + break + i += 1 + csource = csource[endpos:i] + closing + csource[i:] + #print repr(''.join(parts)+csource) + parts.append(csource) + return ''.join(parts) + +def _preprocess_extern_python(csource): + # input: `extern "Python" int foo(int);` or + # `extern "Python" { int foo(int); }` + # output: + # void __cffi_extern_python_start; + # int foo(int); + # void __cffi_extern_python_stop; + # + # input: `extern "Python+C" int foo(int);` + # output: + # void __cffi_extern_python_plus_c_start; + # int foo(int); + # void __cffi_extern_python_stop; + parts = [] + while True: + match = _r_extern_python.search(csource) + if not match: + break + endpos = match.end() - 1 + #print + #print ''.join(parts)+csource + #print '=>' + parts.append(csource[:match.start()]) + if 'C' in match.group(1): + parts.append('void __cffi_extern_python_plus_c_start; ') + else: + parts.append('void __cffi_extern_python_start; ') + if csource[endpos] == '{': + # grouping variant + closing = csource.find('}', endpos) + if closing < 0: + raise CDefError("'extern \"Python\" {': no '}' found") + if csource.find('{', endpos + 1, closing) >= 0: + raise NotImplementedError("cannot use { } inside a block " + "'extern \"Python\" { ... }'") + parts.append(csource[endpos+1:closing]) + csource = csource[closing+1:] + else: + # non-grouping variant + semicolon = csource.find(';', endpos) + if semicolon < 0: + raise CDefError("'extern \"Python\": no ';' found") + parts.append(csource[endpos:semicolon+1]) + csource = csource[semicolon+1:] + parts.append(' void __cffi_extern_python_stop;') + #print ''.join(parts)+csource + #print + parts.append(csource) + return ''.join(parts) + +def _warn_for_string_literal(csource): + if '"' not in csource: + return + for line in csource.splitlines(): + if '"' in line and not line.lstrip().startswith('#'): + import warnings + warnings.warn("String literal found in cdef() or type source. " + "String literals are ignored here, but you should " + "remove them anyway because some character sequences " + "confuse pre-parsing.") + break + +def _warn_for_non_extern_non_static_global_variable(decl): + if not decl.storage: + import warnings + warnings.warn("Global variable '%s' in cdef(): for consistency " + "with C it should have a storage class specifier " + "(usually 'extern')" % (decl.name,)) + +def _remove_line_directives(csource): + # _r_line_directive matches whole lines, without the final \n, if they + # start with '#line' with some spacing allowed, or '#NUMBER'. This + # function stores them away and replaces them with exactly the string + # '#line@N', where N is the index in the list 'line_directives'. + line_directives = [] + def replace(m): + i = len(line_directives) + line_directives.append(m.group()) + return '#line@%d' % i + csource = _r_line_directive.sub(replace, csource) + return csource, line_directives + +def _put_back_line_directives(csource, line_directives): + def replace(m): + s = m.group() + if not s.startswith('#line@'): + raise AssertionError("unexpected #line directive " + "(should have been processed and removed") + return line_directives[int(s[6:])] + return _r_line_directive.sub(replace, csource) + +def _preprocess(csource): + # First, remove the lines of the form '#line N "filename"' because + # the "filename" part could confuse the rest + csource, line_directives = _remove_line_directives(csource) + # Remove comments. NOTE: this only work because the cdef() section + # should not contain any string literals (except in line directives)! + def replace_keeping_newlines(m): + return ' ' + m.group().count('\n') * '\n' + csource = _r_comment.sub(replace_keeping_newlines, csource) + # Remove the "#define FOO x" lines + macros = {} + for match in _r_define.finditer(csource): + macroname, macrovalue = match.groups() + macrovalue = macrovalue.replace('\\\n', '').strip() + macros[macroname] = macrovalue + csource = _r_define.sub('', csource) + # + if pycparser.__version__ < '2.14': + csource = _workaround_for_old_pycparser(csource) + # + # BIG HACK: replace WINAPI or __stdcall with "volatile const". + # It doesn't make sense for the return type of a function to be + # "volatile volatile const", so we abuse it to detect __stdcall... + # Hack number 2 is that "int(volatile *fptr)();" is not valid C + # syntax, so we place the "volatile" before the opening parenthesis. + csource = _r_stdcall2.sub(' volatile volatile const(', csource) + csource = _r_stdcall1.sub(' volatile volatile const ', csource) + csource = _r_cdecl.sub(' ', csource) + # + # Replace `extern "Python"` with start/end markers + csource = _preprocess_extern_python(csource) + # + # Now there should not be any string literal left; warn if we get one + _warn_for_string_literal(csource) + # + # Replace "[...]" with "[__dotdotdotarray__]" + csource = _r_partial_array.sub('[__dotdotdotarray__]', csource) + # + # Replace "...}" with "__dotdotdotNUM__}". This construction should + # occur only at the end of enums; at the end of structs we have "...;}" + # and at the end of vararg functions "...);". Also replace "=...[,}]" + # with ",__dotdotdotNUM__[,}]": this occurs in the enums too, when + # giving an unknown value. + matches = list(_r_partial_enum.finditer(csource)) + for number, match in enumerate(reversed(matches)): + p = match.start() + if csource[p] == '=': + p2 = csource.find('...', p, match.end()) + assert p2 > p + csource = '%s,__dotdotdot%d__ %s' % (csource[:p], number, + csource[p2+3:]) + else: + assert csource[p:p+3] == '...' + csource = '%s __dotdotdot%d__ %s' % (csource[:p], number, + csource[p+3:]) + # Replace "int ..." or "unsigned long int..." with "__dotdotdotint__" + csource = _r_int_dotdotdot.sub(' __dotdotdotint__ ', csource) + # Replace "float ..." or "double..." with "__dotdotdotfloat__" + csource = _r_float_dotdotdot.sub(' __dotdotdotfloat__ ', csource) + # Replace all remaining "..." with the same name, "__dotdotdot__", + # which is declared with a typedef for the purpose of C parsing. + csource = csource.replace('...', ' __dotdotdot__ ') + # Finally, put back the line directives + csource = _put_back_line_directives(csource, line_directives) + return csource, macros + +def _common_type_names(csource): + # Look in the source for what looks like usages of types from the + # list of common types. A "usage" is approximated here as the + # appearance of the word, minus a "definition" of the type, which + # is the last word in a "typedef" statement. Approximative only + # but should be fine for all the common types. + look_for_words = set(COMMON_TYPES) + look_for_words.add(';') + look_for_words.add(',') + look_for_words.add('(') + look_for_words.add(')') + look_for_words.add('typedef') + words_used = set() + is_typedef = False + paren = 0 + previous_word = '' + for word in _r_words.findall(csource): + if word in look_for_words: + if word == ';': + if is_typedef: + words_used.discard(previous_word) + look_for_words.discard(previous_word) + is_typedef = False + elif word == 'typedef': + is_typedef = True + paren = 0 + elif word == '(': + paren += 1 + elif word == ')': + paren -= 1 + elif word == ',': + if is_typedef and paren == 0: + words_used.discard(previous_word) + look_for_words.discard(previous_word) + else: # word in COMMON_TYPES + words_used.add(word) + previous_word = word + return words_used + + +class Parser(object): + + def __init__(self): + self._declarations = {} + self._included_declarations = set() + self._anonymous_counter = 0 + self._structnode2type = weakref.WeakKeyDictionary() + self._options = {} + self._int_constants = {} + self._recomplete = [] + self._uses_new_feature = None + + def _parse(self, csource): + csource, macros = _preprocess(csource) + # XXX: for more efficiency we would need to poke into the + # internals of CParser... the following registers the + # typedefs, because their presence or absence influences the + # parsing itself (but what they are typedef'ed to plays no role) + ctn = _common_type_names(csource) + typenames = [] + for name in sorted(self._declarations): + if name.startswith('typedef '): + name = name[8:] + typenames.append(name) + ctn.discard(name) + typenames += sorted(ctn) + # + csourcelines = [] + csourcelines.append('# 1 ""') + for typename in typenames: + csourcelines.append('typedef int %s;' % typename) + csourcelines.append('typedef int __dotdotdotint__, __dotdotdotfloat__,' + ' __dotdotdot__;') + # this forces pycparser to consider the following in the file + # called from line 1 + csourcelines.append('# 1 "%s"' % (CDEF_SOURCE_STRING,)) + csourcelines.append(csource) + csourcelines.append('') # see test_missing_newline_bug + fullcsource = '\n'.join(csourcelines) + if lock is not None: + lock.acquire() # pycparser is not thread-safe... + try: + ast = _get_parser().parse(fullcsource) + except pycparser.c_parser.ParseError as e: + self.convert_pycparser_error(e, csource) + finally: + if lock is not None: + lock.release() + # csource will be used to find buggy source text + return ast, macros, csource + + def _convert_pycparser_error(self, e, csource): + # xxx look for ":NUM:" at the start of str(e) + # and interpret that as a line number. This will not work if + # the user gives explicit ``# NUM "FILE"`` directives. + line = None + msg = str(e) + match = re.match(r"%s:(\d+):" % (CDEF_SOURCE_STRING,), msg) + if match: + linenum = int(match.group(1), 10) + csourcelines = csource.splitlines() + if 1 <= linenum <= len(csourcelines): + line = csourcelines[linenum-1] + return line + + def convert_pycparser_error(self, e, csource): + line = self._convert_pycparser_error(e, csource) + + msg = str(e) + if line: + msg = 'cannot parse "%s"\n%s' % (line.strip(), msg) + else: + msg = 'parse error\n%s' % (msg,) + raise CDefError(msg) + + def parse(self, csource, override=False, packed=False, pack=None, + dllexport=False): + if packed: + if packed != True: + raise ValueError("'packed' should be False or True; use " + "'pack' to give another value") + if pack: + raise ValueError("cannot give both 'pack' and 'packed'") + pack = 1 + elif pack: + if pack & (pack - 1): + raise ValueError("'pack' must be a power of two, not %r" % + (pack,)) + else: + pack = 0 + prev_options = self._options + try: + self._options = {'override': override, + 'packed': pack, + 'dllexport': dllexport} + self._internal_parse(csource) + finally: + self._options = prev_options + + def _internal_parse(self, csource): + ast, macros, csource = self._parse(csource) + # add the macros + self._process_macros(macros) + # find the first "__dotdotdot__" and use that as a separator + # between the repeated typedefs and the real csource + iterator = iter(ast.ext) + for decl in iterator: + if decl.name == '__dotdotdot__': + break + else: + assert 0 + current_decl = None + # + try: + self._inside_extern_python = '__cffi_extern_python_stop' + for decl in iterator: + current_decl = decl + if isinstance(decl, pycparser.c_ast.Decl): + self._parse_decl(decl) + elif isinstance(decl, pycparser.c_ast.Typedef): + if not decl.name: + raise CDefError("typedef does not declare any name", + decl) + quals = 0 + if (isinstance(decl.type.type, pycparser.c_ast.IdentifierType) and + decl.type.type.names[-1].startswith('__dotdotdot')): + realtype = self._get_unknown_type(decl) + elif (isinstance(decl.type, pycparser.c_ast.PtrDecl) and + isinstance(decl.type.type, pycparser.c_ast.TypeDecl) and + isinstance(decl.type.type.type, + pycparser.c_ast.IdentifierType) and + decl.type.type.type.names[-1].startswith('__dotdotdot')): + realtype = self._get_unknown_ptr_type(decl) + else: + realtype, quals = self._get_type_and_quals( + decl.type, name=decl.name, partial_length_ok=True, + typedef_example="*(%s *)0" % (decl.name,)) + self._declare('typedef ' + decl.name, realtype, quals=quals) + elif decl.__class__.__name__ == 'Pragma': + # skip pragma, only in pycparser 2.15 + import warnings + warnings.warn( + "#pragma in cdef() are entirely ignored. " + "They should be removed for now, otherwise your " + "code might behave differently in a future version " + "of CFFI if #pragma support gets added. Note that " + "'#pragma pack' needs to be replaced with the " + "'packed' keyword argument to cdef().") + else: + raise CDefError("unexpected <%s>: this construct is valid " + "C but not valid in cdef()" % + decl.__class__.__name__, decl) + except CDefError as e: + if len(e.args) == 1: + e.args = e.args + (current_decl,) + raise + except FFIError as e: + msg = self._convert_pycparser_error(e, csource) + if msg: + e.args = (e.args[0] + "\n *** Err: %s" % msg,) + raise + + def _add_constants(self, key, val): + if key in self._int_constants: + if self._int_constants[key] == val: + return # ignore identical double declarations + raise FFIError( + "multiple declarations of constant: %s" % (key,)) + self._int_constants[key] = val + + def _add_integer_constant(self, name, int_str): + int_str = int_str.lower().rstrip("ul") + neg = int_str.startswith('-') + if neg: + int_str = int_str[1:] + # "010" is not valid oct in py3 + if (int_str.startswith("0") and int_str != '0' + and not int_str.startswith("0x")): + int_str = "0o" + int_str[1:] + pyvalue = int(int_str, 0) + if neg: + pyvalue = -pyvalue + self._add_constants(name, pyvalue) + self._declare('macro ' + name, pyvalue) + + def _process_macros(self, macros): + for key, value in macros.items(): + value = value.strip() + if _r_int_literal.match(value): + self._add_integer_constant(key, value) + elif value == '...': + self._declare('macro ' + key, value) + else: + raise CDefError( + 'only supports one of the following syntax:\n' + ' #define %s ... (literally dot-dot-dot)\n' + ' #define %s NUMBER (with NUMBER an integer' + ' constant, decimal/hex/octal)\n' + 'got:\n' + ' #define %s %s' + % (key, key, key, value)) + + def _declare_function(self, tp, quals, decl): + tp = self._get_type_pointer(tp, quals) + if self._options.get('dllexport'): + tag = 'dllexport_python ' + elif self._inside_extern_python == '__cffi_extern_python_start': + tag = 'extern_python ' + elif self._inside_extern_python == '__cffi_extern_python_plus_c_start': + tag = 'extern_python_plus_c ' + else: + tag = 'function ' + self._declare(tag + decl.name, tp) + + def _parse_decl(self, decl): + node = decl.type + if isinstance(node, pycparser.c_ast.FuncDecl): + tp, quals = self._get_type_and_quals(node, name=decl.name) + assert isinstance(tp, model.RawFunctionType) + self._declare_function(tp, quals, decl) + else: + if isinstance(node, pycparser.c_ast.Struct): + self._get_struct_union_enum_type('struct', node) + elif isinstance(node, pycparser.c_ast.Union): + self._get_struct_union_enum_type('union', node) + elif isinstance(node, pycparser.c_ast.Enum): + self._get_struct_union_enum_type('enum', node) + elif not decl.name: + raise CDefError("construct does not declare any variable", + decl) + # + if decl.name: + tp, quals = self._get_type_and_quals(node, + partial_length_ok=True) + if tp.is_raw_function: + self._declare_function(tp, quals, decl) + elif (tp.is_integer_type() and + hasattr(decl, 'init') and + hasattr(decl.init, 'value') and + _r_int_literal.match(decl.init.value)): + self._add_integer_constant(decl.name, decl.init.value) + elif (tp.is_integer_type() and + isinstance(decl.init, pycparser.c_ast.UnaryOp) and + decl.init.op == '-' and + hasattr(decl.init.expr, 'value') and + _r_int_literal.match(decl.init.expr.value)): + self._add_integer_constant(decl.name, + '-' + decl.init.expr.value) + elif (tp is model.void_type and + decl.name.startswith('__cffi_extern_python_')): + # hack: `extern "Python"` in the C source is replaced + # with "void __cffi_extern_python_start;" and + # "void __cffi_extern_python_stop;" + self._inside_extern_python = decl.name + else: + if self._inside_extern_python !='__cffi_extern_python_stop': + raise CDefError( + "cannot declare constants or " + "variables with 'extern \"Python\"'") + if (quals & model.Q_CONST) and not tp.is_array_type: + self._declare('constant ' + decl.name, tp, quals=quals) + else: + _warn_for_non_extern_non_static_global_variable(decl) + self._declare('variable ' + decl.name, tp, quals=quals) + + def parse_type(self, cdecl): + return self.parse_type_and_quals(cdecl)[0] + + def parse_type_and_quals(self, cdecl): + ast, macros = self._parse('void __dummy(\n%s\n);' % cdecl)[:2] + assert not macros + exprnode = ast.ext[-1].type.args.params[0] + if isinstance(exprnode, pycparser.c_ast.ID): + raise CDefError("unknown identifier '%s'" % (exprnode.name,)) + return self._get_type_and_quals(exprnode.type) + + def _declare(self, name, obj, included=False, quals=0): + if name in self._declarations: + prevobj, prevquals = self._declarations[name] + if prevobj is obj and prevquals == quals: + return + if not self._options.get('override'): + raise FFIError( + "multiple declarations of %s (for interactive usage, " + "try cdef(xx, override=True))" % (name,)) + assert '__dotdotdot__' not in name.split() + self._declarations[name] = (obj, quals) + if included: + self._included_declarations.add(obj) + + def _extract_quals(self, type): + quals = 0 + if isinstance(type, (pycparser.c_ast.TypeDecl, + pycparser.c_ast.PtrDecl)): + if 'const' in type.quals: + quals |= model.Q_CONST + if 'volatile' in type.quals: + quals |= model.Q_VOLATILE + if 'restrict' in type.quals: + quals |= model.Q_RESTRICT + return quals + + def _get_type_pointer(self, type, quals, declname=None): + if isinstance(type, model.RawFunctionType): + return type.as_function_pointer() + if (isinstance(type, model.StructOrUnionOrEnum) and + type.name.startswith('$') and type.name[1:].isdigit() and + type.forcename is None and declname is not None): + return model.NamedPointerType(type, declname, quals) + return model.PointerType(type, quals) + + def _get_type_and_quals(self, typenode, name=None, partial_length_ok=False, + typedef_example=None): + # first, dereference typedefs, if we have it already parsed, we're good + if (isinstance(typenode, pycparser.c_ast.TypeDecl) and + isinstance(typenode.type, pycparser.c_ast.IdentifierType) and + len(typenode.type.names) == 1 and + ('typedef ' + typenode.type.names[0]) in self._declarations): + tp, quals = self._declarations['typedef ' + typenode.type.names[0]] + quals |= self._extract_quals(typenode) + return tp, quals + # + if isinstance(typenode, pycparser.c_ast.ArrayDecl): + # array type + if typenode.dim is None: + length = None + else: + length = self._parse_constant( + typenode.dim, partial_length_ok=partial_length_ok) + # a hack: in 'typedef int foo_t[...][...];', don't use '...' as + # the length but use directly the C expression that would be + # generated by recompiler.py. This lets the typedef be used in + # many more places within recompiler.py + if typedef_example is not None: + if length == '...': + length = '_cffi_array_len(%s)' % (typedef_example,) + typedef_example = "*" + typedef_example + # + tp, quals = self._get_type_and_quals(typenode.type, + partial_length_ok=partial_length_ok, + typedef_example=typedef_example) + return model.ArrayType(tp, length), quals + # + if isinstance(typenode, pycparser.c_ast.PtrDecl): + # pointer type + itemtype, itemquals = self._get_type_and_quals(typenode.type) + tp = self._get_type_pointer(itemtype, itemquals, declname=name) + quals = self._extract_quals(typenode) + return tp, quals + # + if isinstance(typenode, pycparser.c_ast.TypeDecl): + quals = self._extract_quals(typenode) + type = typenode.type + if isinstance(type, pycparser.c_ast.IdentifierType): + # assume a primitive type. get it from .names, but reduce + # synonyms to a single chosen combination + names = list(type.names) + if names != ['signed', 'char']: # keep this unmodified + prefixes = {} + while names: + name = names[0] + if name in ('short', 'long', 'signed', 'unsigned'): + prefixes[name] = prefixes.get(name, 0) + 1 + del names[0] + else: + break + # ignore the 'signed' prefix below, and reorder the others + newnames = [] + for prefix in ('unsigned', 'short', 'long'): + for i in range(prefixes.get(prefix, 0)): + newnames.append(prefix) + if not names: + names = ['int'] # implicitly + if names == ['int']: # but kill it if 'short' or 'long' + if 'short' in prefixes or 'long' in prefixes: + names = [] + names = newnames + names + ident = ' '.join(names) + if ident == 'void': + return model.void_type, quals + if ident == '__dotdotdot__': + raise FFIError(':%d: bad usage of "..."' % + typenode.coord.line) + tp0, quals0 = resolve_common_type(self, ident) + return tp0, (quals | quals0) + # + if isinstance(type, pycparser.c_ast.Struct): + # 'struct foobar' + tp = self._get_struct_union_enum_type('struct', type, name) + return tp, quals + # + if isinstance(type, pycparser.c_ast.Union): + # 'union foobar' + tp = self._get_struct_union_enum_type('union', type, name) + return tp, quals + # + if isinstance(type, pycparser.c_ast.Enum): + # 'enum foobar' + tp = self._get_struct_union_enum_type('enum', type, name) + return tp, quals + # + if isinstance(typenode, pycparser.c_ast.FuncDecl): + # a function type + return self._parse_function_type(typenode, name), 0 + # + # nested anonymous structs or unions end up here + if isinstance(typenode, pycparser.c_ast.Struct): + return self._get_struct_union_enum_type('struct', typenode, name, + nested=True), 0 + if isinstance(typenode, pycparser.c_ast.Union): + return self._get_struct_union_enum_type('union', typenode, name, + nested=True), 0 + # + raise FFIError(":%d: bad or unsupported type declaration" % + typenode.coord.line) + + def _parse_function_type(self, typenode, funcname=None): + params = list(getattr(typenode.args, 'params', [])) + for i, arg in enumerate(params): + if not hasattr(arg, 'type'): + raise CDefError("%s arg %d: unknown type '%s'" + " (if you meant to use the old C syntax of giving" + " untyped arguments, it is not supported)" + % (funcname or 'in expression', i + 1, + getattr(arg, 'name', '?'))) + ellipsis = ( + len(params) > 0 and + isinstance(params[-1].type, pycparser.c_ast.TypeDecl) and + isinstance(params[-1].type.type, + pycparser.c_ast.IdentifierType) and + params[-1].type.type.names == ['__dotdotdot__']) + if ellipsis: + params.pop() + if not params: + raise CDefError( + "%s: a function with only '(...)' as argument" + " is not correct C" % (funcname or 'in expression')) + args = [self._as_func_arg(*self._get_type_and_quals(argdeclnode.type)) + for argdeclnode in params] + if not ellipsis and args == [model.void_type]: + args = [] + result, quals = self._get_type_and_quals(typenode.type) + # the 'quals' on the result type are ignored. HACK: we absure them + # to detect __stdcall functions: we textually replace "__stdcall" + # with "volatile volatile const" above. + abi = None + if hasattr(typenode.type, 'quals'): # else, probable syntax error anyway + if typenode.type.quals[-3:] == ['volatile', 'volatile', 'const']: + abi = '__stdcall' + return model.RawFunctionType(tuple(args), result, ellipsis, abi) + + def _as_func_arg(self, type, quals): + if isinstance(type, model.ArrayType): + return model.PointerType(type.item, quals) + elif isinstance(type, model.RawFunctionType): + return type.as_function_pointer() + else: + return type + + def _get_struct_union_enum_type(self, kind, type, name=None, nested=False): + # First, a level of caching on the exact 'type' node of the AST. + # This is obscure, but needed because pycparser "unrolls" declarations + # such as "typedef struct { } foo_t, *foo_p" and we end up with + # an AST that is not a tree, but a DAG, with the "type" node of the + # two branches foo_t and foo_p of the trees being the same node. + # It's a bit silly but detecting "DAG-ness" in the AST tree seems + # to be the only way to distinguish this case from two independent + # structs. See test_struct_with_two_usages. + try: + return self._structnode2type[type] + except KeyError: + pass + # + # Note that this must handle parsing "struct foo" any number of + # times and always return the same StructType object. Additionally, + # one of these times (not necessarily the first), the fields of + # the struct can be specified with "struct foo { ...fields... }". + # If no name is given, then we have to create a new anonymous struct + # with no caching; in this case, the fields are either specified + # right now or never. + # + force_name = name + name = type.name + # + # get the type or create it if needed + if name is None: + # 'force_name' is used to guess a more readable name for + # anonymous structs, for the common case "typedef struct { } foo". + if force_name is not None: + explicit_name = '$%s' % force_name + else: + self._anonymous_counter += 1 + explicit_name = '$%d' % self._anonymous_counter + tp = None + else: + explicit_name = name + key = '%s %s' % (kind, name) + tp, _ = self._declarations.get(key, (None, None)) + # + if tp is None: + if kind == 'struct': + tp = model.StructType(explicit_name, None, None, None) + elif kind == 'union': + tp = model.UnionType(explicit_name, None, None, None) + elif kind == 'enum': + if explicit_name == '__dotdotdot__': + raise CDefError("Enums cannot be declared with ...") + tp = self._build_enum_type(explicit_name, type.values) + else: + raise AssertionError("kind = %r" % (kind,)) + if name is not None: + self._declare(key, tp) + else: + if kind == 'enum' and type.values is not None: + raise NotImplementedError( + "enum %s: the '{}' declaration should appear on the first " + "time the enum is mentioned, not later" % explicit_name) + if not tp.forcename: + tp.force_the_name(force_name) + if tp.forcename and '$' in tp.name: + self._declare('anonymous %s' % tp.forcename, tp) + # + self._structnode2type[type] = tp + # + # enums: done here + if kind == 'enum': + return tp + # + # is there a 'type.decls'? If yes, then this is the place in the + # C sources that declare the fields. If no, then just return the + # existing type, possibly still incomplete. + if type.decls is None: + return tp + # + if tp.fldnames is not None: + raise CDefError("duplicate declaration of struct %s" % name) + fldnames = [] + fldtypes = [] + fldbitsize = [] + fldquals = [] + for decl in type.decls: + if (isinstance(decl.type, pycparser.c_ast.IdentifierType) and + ''.join(decl.type.names) == '__dotdotdot__'): + # XXX pycparser is inconsistent: 'names' should be a list + # of strings, but is sometimes just one string. Use + # str.join() as a way to cope with both. + self._make_partial(tp, nested) + continue + if decl.bitsize is None: + bitsize = -1 + else: + bitsize = self._parse_constant(decl.bitsize) + self._partial_length = False + type, fqual = self._get_type_and_quals(decl.type, + partial_length_ok=True) + if self._partial_length: + self._make_partial(tp, nested) + if isinstance(type, model.StructType) and type.partial: + self._make_partial(tp, nested) + fldnames.append(decl.name or '') + fldtypes.append(type) + fldbitsize.append(bitsize) + fldquals.append(fqual) + tp.fldnames = tuple(fldnames) + tp.fldtypes = tuple(fldtypes) + tp.fldbitsize = tuple(fldbitsize) + tp.fldquals = tuple(fldquals) + if fldbitsize != [-1] * len(fldbitsize): + if isinstance(tp, model.StructType) and tp.partial: + raise NotImplementedError("%s: using both bitfields and '...;'" + % (tp,)) + tp.packed = self._options.get('packed') + if tp.completed: # must be re-completed: it is not opaque any more + tp.completed = 0 + self._recomplete.append(tp) + return tp + + def _make_partial(self, tp, nested): + if not isinstance(tp, model.StructOrUnion): + raise CDefError("%s cannot be partial" % (tp,)) + if not tp.has_c_name() and not nested: + raise NotImplementedError("%s is partial but has no C name" %(tp,)) + tp.partial = True + + def _parse_constant(self, exprnode, partial_length_ok=False): + # for now, limited to expressions that are an immediate number + # or positive/negative number + if isinstance(exprnode, pycparser.c_ast.Constant): + s = exprnode.value + if '0' <= s[0] <= '9': + s = s.rstrip('uUlL') + try: + if s.startswith('0'): + return int(s, 8) + else: + return int(s, 10) + except ValueError: + if len(s) > 1: + if s.lower()[0:2] == '0x': + return int(s, 16) + elif s.lower()[0:2] == '0b': + return int(s, 2) + raise CDefError("invalid constant %r" % (s,)) + elif s[0] == "'" and s[-1] == "'" and ( + len(s) == 3 or (len(s) == 4 and s[1] == "\\")): + return ord(s[-2]) + else: + raise CDefError("invalid constant %r" % (s,)) + # + if (isinstance(exprnode, pycparser.c_ast.UnaryOp) and + exprnode.op == '+'): + return self._parse_constant(exprnode.expr) + # + if (isinstance(exprnode, pycparser.c_ast.UnaryOp) and + exprnode.op == '-'): + return -self._parse_constant(exprnode.expr) + # load previously defined int constant + if (isinstance(exprnode, pycparser.c_ast.ID) and + exprnode.name in self._int_constants): + return self._int_constants[exprnode.name] + # + if (isinstance(exprnode, pycparser.c_ast.ID) and + exprnode.name == '__dotdotdotarray__'): + if partial_length_ok: + self._partial_length = True + return '...' + raise FFIError(":%d: unsupported '[...]' here, cannot derive " + "the actual array length in this context" + % exprnode.coord.line) + # + if isinstance(exprnode, pycparser.c_ast.BinaryOp): + left = self._parse_constant(exprnode.left) + right = self._parse_constant(exprnode.right) + if exprnode.op == '+': + return left + right + elif exprnode.op == '-': + return left - right + elif exprnode.op == '*': + return left * right + elif exprnode.op == '/': + return self._c_div(left, right) + elif exprnode.op == '%': + return left - self._c_div(left, right) * right + elif exprnode.op == '<<': + return left << right + elif exprnode.op == '>>': + return left >> right + elif exprnode.op == '&': + return left & right + elif exprnode.op == '|': + return left | right + elif exprnode.op == '^': + return left ^ right + # + raise FFIError(":%d: unsupported expression: expected a " + "simple numeric constant" % exprnode.coord.line) + + def _c_div(self, a, b): + result = a // b + if ((a < 0) ^ (b < 0)) and (a % b) != 0: + result += 1 + return result + + def _build_enum_type(self, explicit_name, decls): + if decls is not None: + partial = False + enumerators = [] + enumvalues = [] + nextenumvalue = 0 + for enum in decls.enumerators: + if _r_enum_dotdotdot.match(enum.name): + partial = True + continue + if enum.value is not None: + nextenumvalue = self._parse_constant(enum.value) + enumerators.append(enum.name) + enumvalues.append(nextenumvalue) + self._add_constants(enum.name, nextenumvalue) + nextenumvalue += 1 + enumerators = tuple(enumerators) + enumvalues = tuple(enumvalues) + tp = model.EnumType(explicit_name, enumerators, enumvalues) + tp.partial = partial + else: # opaque enum + tp = model.EnumType(explicit_name, (), ()) + return tp + + def include(self, other): + for name, (tp, quals) in other._declarations.items(): + if name.startswith('anonymous $enum_$'): + continue # fix for test_anonymous_enum_include + kind = name.split(' ', 1)[0] + if kind in ('struct', 'union', 'enum', 'anonymous', 'typedef'): + self._declare(name, tp, included=True, quals=quals) + for k, v in other._int_constants.items(): + self._add_constants(k, v) + + def _get_unknown_type(self, decl): + typenames = decl.type.type.names + if typenames == ['__dotdotdot__']: + return model.unknown_type(decl.name) + + if typenames == ['__dotdotdotint__']: + if self._uses_new_feature is None: + self._uses_new_feature = "'typedef int... %s'" % decl.name + return model.UnknownIntegerType(decl.name) + + if typenames == ['__dotdotdotfloat__']: + # note: not for 'long double' so far + if self._uses_new_feature is None: + self._uses_new_feature = "'typedef float... %s'" % decl.name + return model.UnknownFloatType(decl.name) + + raise FFIError(':%d: unsupported usage of "..." in typedef' + % decl.coord.line) + + def _get_unknown_ptr_type(self, decl): + if decl.type.type.type.names == ['__dotdotdot__']: + return model.unknown_ptr_type(decl.name) + raise FFIError(':%d: unsupported usage of "..." in typedef' + % decl.coord.line) diff --git a/venv/lib/python3.11/site-packages/cffi/error.py b/venv/lib/python3.11/site-packages/cffi/error.py new file mode 100644 index 0000000..0a27247 --- /dev/null +++ b/venv/lib/python3.11/site-packages/cffi/error.py @@ -0,0 +1,31 @@ + +class FFIError(Exception): + __module__ = 'cffi' + +class CDefError(Exception): + __module__ = 'cffi' + def __str__(self): + try: + current_decl = self.args[1] + filename = current_decl.coord.file + linenum = current_decl.coord.line + prefix = '%s:%d: ' % (filename, linenum) + except (AttributeError, TypeError, IndexError): + prefix = '' + return '%s%s' % (prefix, self.args[0]) + +class VerificationError(Exception): + """ An error raised when verification fails + """ + __module__ = 'cffi' + +class VerificationMissing(Exception): + """ An error raised when incomplete structures are passed into + cdef, but no verification has been done + """ + __module__ = 'cffi' + +class PkgConfigError(Exception): + """ An error raised for missing modules in pkg-config + """ + __module__ = 'cffi' diff --git a/venv/lib/python3.11/site-packages/cffi/ffiplatform.py b/venv/lib/python3.11/site-packages/cffi/ffiplatform.py new file mode 100644 index 0000000..adca28f --- /dev/null +++ b/venv/lib/python3.11/site-packages/cffi/ffiplatform.py @@ -0,0 +1,113 @@ +import sys, os +from .error import VerificationError + + +LIST_OF_FILE_NAMES = ['sources', 'include_dirs', 'library_dirs', + 'extra_objects', 'depends'] + +def get_extension(srcfilename, modname, sources=(), **kwds): + from cffi._shimmed_dist_utils import Extension + allsources = [srcfilename] + for src in sources: + allsources.append(os.path.normpath(src)) + return Extension(name=modname, sources=allsources, **kwds) + +def compile(tmpdir, ext, compiler_verbose=0, debug=None): + """Compile a C extension module using distutils.""" + + saved_environ = os.environ.copy() + try: + outputfilename = _build(tmpdir, ext, compiler_verbose, debug) + outputfilename = os.path.abspath(outputfilename) + finally: + # workaround for a distutils bugs where some env vars can + # become longer and longer every time it is used + for key, value in saved_environ.items(): + if os.environ.get(key) != value: + os.environ[key] = value + return outputfilename + +def _build(tmpdir, ext, compiler_verbose=0, debug=None): + # XXX compact but horrible :-( + from cffi._shimmed_dist_utils import Distribution, CompileError, LinkError, set_threshold, set_verbosity + + dist = Distribution({'ext_modules': [ext]}) + dist.parse_config_files() + options = dist.get_option_dict('build_ext') + if debug is None: + debug = sys.flags.debug + options['debug'] = ('ffiplatform', debug) + options['force'] = ('ffiplatform', True) + options['build_lib'] = ('ffiplatform', tmpdir) + options['build_temp'] = ('ffiplatform', tmpdir) + # + try: + old_level = set_threshold(0) or 0 + try: + set_verbosity(compiler_verbose) + dist.run_command('build_ext') + cmd_obj = dist.get_command_obj('build_ext') + [soname] = cmd_obj.get_outputs() + finally: + set_threshold(old_level) + except (CompileError, LinkError) as e: + raise VerificationError('%s: %s' % (e.__class__.__name__, e)) + # + return soname + +try: + from os.path import samefile +except ImportError: + def samefile(f1, f2): + return os.path.abspath(f1) == os.path.abspath(f2) + +def maybe_relative_path(path): + if not os.path.isabs(path): + return path # already relative + dir = path + names = [] + while True: + prevdir = dir + dir, name = os.path.split(prevdir) + if dir == prevdir or not dir: + return path # failed to make it relative + names.append(name) + try: + if samefile(dir, os.curdir): + names.reverse() + return os.path.join(*names) + except OSError: + pass + +# ____________________________________________________________ + +try: + int_or_long = (int, long) + import cStringIO +except NameError: + int_or_long = int # Python 3 + import io as cStringIO + +def _flatten(x, f): + if isinstance(x, str): + f.write('%ds%s' % (len(x), x)) + elif isinstance(x, dict): + keys = sorted(x.keys()) + f.write('%dd' % len(keys)) + for key in keys: + _flatten(key, f) + _flatten(x[key], f) + elif isinstance(x, (list, tuple)): + f.write('%dl' % len(x)) + for value in x: + _flatten(value, f) + elif isinstance(x, int_or_long): + f.write('%di' % (x,)) + else: + raise TypeError( + "the keywords to verify() contains unsupported object %r" % (x,)) + +def flatten(x): + f = cStringIO.StringIO() + _flatten(x, f) + return f.getvalue() diff --git a/venv/lib/python3.11/site-packages/cffi/lock.py b/venv/lib/python3.11/site-packages/cffi/lock.py new file mode 100644 index 0000000..db91b71 --- /dev/null +++ b/venv/lib/python3.11/site-packages/cffi/lock.py @@ -0,0 +1,30 @@ +import sys + +if sys.version_info < (3,): + try: + from thread import allocate_lock + except ImportError: + from dummy_thread import allocate_lock +else: + try: + from _thread import allocate_lock + except ImportError: + from _dummy_thread import allocate_lock + + +##import sys +##l1 = allocate_lock + +##class allocate_lock(object): +## def __init__(self): +## self._real = l1() +## def __enter__(self): +## for i in range(4, 0, -1): +## print sys._getframe(i).f_code +## print +## return self._real.__enter__() +## def __exit__(self, *args): +## return self._real.__exit__(*args) +## def acquire(self, f): +## assert f is False +## return self._real.acquire(f) diff --git a/venv/lib/python3.11/site-packages/cffi/model.py b/venv/lib/python3.11/site-packages/cffi/model.py new file mode 100644 index 0000000..e5f4cae --- /dev/null +++ b/venv/lib/python3.11/site-packages/cffi/model.py @@ -0,0 +1,618 @@ +import types +import weakref + +from .lock import allocate_lock +from .error import CDefError, VerificationError, VerificationMissing + +# type qualifiers +Q_CONST = 0x01 +Q_RESTRICT = 0x02 +Q_VOLATILE = 0x04 + +def qualify(quals, replace_with): + if quals & Q_CONST: + replace_with = ' const ' + replace_with.lstrip() + if quals & Q_VOLATILE: + replace_with = ' volatile ' + replace_with.lstrip() + if quals & Q_RESTRICT: + # It seems that __restrict is supported by gcc and msvc. + # If you hit some different compiler, add a #define in + # _cffi_include.h for it (and in its copies, documented there) + replace_with = ' __restrict ' + replace_with.lstrip() + return replace_with + + +class BaseTypeByIdentity(object): + is_array_type = False + is_raw_function = False + + def get_c_name(self, replace_with='', context='a C file', quals=0): + result = self.c_name_with_marker + assert result.count('&') == 1 + # some logic duplication with ffi.getctype()... :-( + replace_with = replace_with.strip() + if replace_with: + if replace_with.startswith('*') and '&[' in result: + replace_with = '(%s)' % replace_with + elif not replace_with[0] in '[(': + replace_with = ' ' + replace_with + replace_with = qualify(quals, replace_with) + result = result.replace('&', replace_with) + if '$' in result: + raise VerificationError( + "cannot generate '%s' in %s: unknown type name" + % (self._get_c_name(), context)) + return result + + def _get_c_name(self): + return self.c_name_with_marker.replace('&', '') + + def has_c_name(self): + return '$' not in self._get_c_name() + + def is_integer_type(self): + return False + + def get_cached_btype(self, ffi, finishlist, can_delay=False): + try: + BType = ffi._cached_btypes[self] + except KeyError: + BType = self.build_backend_type(ffi, finishlist) + BType2 = ffi._cached_btypes.setdefault(self, BType) + assert BType2 is BType + return BType + + def __repr__(self): + return '<%s>' % (self._get_c_name(),) + + def _get_items(self): + return [(name, getattr(self, name)) for name in self._attrs_] + + +class BaseType(BaseTypeByIdentity): + + def __eq__(self, other): + return (self.__class__ == other.__class__ and + self._get_items() == other._get_items()) + + def __ne__(self, other): + return not self == other + + def __hash__(self): + return hash((self.__class__, tuple(self._get_items()))) + + +class VoidType(BaseType): + _attrs_ = () + + def __init__(self): + self.c_name_with_marker = 'void&' + + def build_backend_type(self, ffi, finishlist): + return global_cache(self, ffi, 'new_void_type') + +void_type = VoidType() + + +class BasePrimitiveType(BaseType): + def is_complex_type(self): + return False + + +class PrimitiveType(BasePrimitiveType): + _attrs_ = ('name',) + + ALL_PRIMITIVE_TYPES = { + 'char': 'c', + 'short': 'i', + 'int': 'i', + 'long': 'i', + 'long long': 'i', + 'signed char': 'i', + 'unsigned char': 'i', + 'unsigned short': 'i', + 'unsigned int': 'i', + 'unsigned long': 'i', + 'unsigned long long': 'i', + 'float': 'f', + 'double': 'f', + 'long double': 'f', + '_cffi_float_complex_t': 'j', + '_cffi_double_complex_t': 'j', + '_Bool': 'i', + # the following types are not primitive in the C sense + 'wchar_t': 'c', + 'char16_t': 'c', + 'char32_t': 'c', + 'int8_t': 'i', + 'uint8_t': 'i', + 'int16_t': 'i', + 'uint16_t': 'i', + 'int32_t': 'i', + 'uint32_t': 'i', + 'int64_t': 'i', + 'uint64_t': 'i', + 'int_least8_t': 'i', + 'uint_least8_t': 'i', + 'int_least16_t': 'i', + 'uint_least16_t': 'i', + 'int_least32_t': 'i', + 'uint_least32_t': 'i', + 'int_least64_t': 'i', + 'uint_least64_t': 'i', + 'int_fast8_t': 'i', + 'uint_fast8_t': 'i', + 'int_fast16_t': 'i', + 'uint_fast16_t': 'i', + 'int_fast32_t': 'i', + 'uint_fast32_t': 'i', + 'int_fast64_t': 'i', + 'uint_fast64_t': 'i', + 'intptr_t': 'i', + 'uintptr_t': 'i', + 'intmax_t': 'i', + 'uintmax_t': 'i', + 'ptrdiff_t': 'i', + 'size_t': 'i', + 'ssize_t': 'i', + } + + def __init__(self, name): + assert name in self.ALL_PRIMITIVE_TYPES + self.name = name + self.c_name_with_marker = name + '&' + + def is_char_type(self): + return self.ALL_PRIMITIVE_TYPES[self.name] == 'c' + def is_integer_type(self): + return self.ALL_PRIMITIVE_TYPES[self.name] == 'i' + def is_float_type(self): + return self.ALL_PRIMITIVE_TYPES[self.name] == 'f' + def is_complex_type(self): + return self.ALL_PRIMITIVE_TYPES[self.name] == 'j' + + def build_backend_type(self, ffi, finishlist): + return global_cache(self, ffi, 'new_primitive_type', self.name) + + +class UnknownIntegerType(BasePrimitiveType): + _attrs_ = ('name',) + + def __init__(self, name): + self.name = name + self.c_name_with_marker = name + '&' + + def is_integer_type(self): + return True + + def build_backend_type(self, ffi, finishlist): + raise NotImplementedError("integer type '%s' can only be used after " + "compilation" % self.name) + +class UnknownFloatType(BasePrimitiveType): + _attrs_ = ('name', ) + + def __init__(self, name): + self.name = name + self.c_name_with_marker = name + '&' + + def build_backend_type(self, ffi, finishlist): + raise NotImplementedError("float type '%s' can only be used after " + "compilation" % self.name) + + +class BaseFunctionType(BaseType): + _attrs_ = ('args', 'result', 'ellipsis', 'abi') + + def __init__(self, args, result, ellipsis, abi=None): + self.args = args + self.result = result + self.ellipsis = ellipsis + self.abi = abi + # + reprargs = [arg._get_c_name() for arg in self.args] + if self.ellipsis: + reprargs.append('...') + reprargs = reprargs or ['void'] + replace_with = self._base_pattern % (', '.join(reprargs),) + if abi is not None: + replace_with = replace_with[:1] + abi + ' ' + replace_with[1:] + self.c_name_with_marker = ( + self.result.c_name_with_marker.replace('&', replace_with)) + + +class RawFunctionType(BaseFunctionType): + # Corresponds to a C type like 'int(int)', which is the C type of + # a function, but not a pointer-to-function. The backend has no + # notion of such a type; it's used temporarily by parsing. + _base_pattern = '(&)(%s)' + is_raw_function = True + + def build_backend_type(self, ffi, finishlist): + raise CDefError("cannot render the type %r: it is a function " + "type, not a pointer-to-function type" % (self,)) + + def as_function_pointer(self): + return FunctionPtrType(self.args, self.result, self.ellipsis, self.abi) + + +class FunctionPtrType(BaseFunctionType): + _base_pattern = '(*&)(%s)' + + def build_backend_type(self, ffi, finishlist): + result = self.result.get_cached_btype(ffi, finishlist) + args = [] + for tp in self.args: + args.append(tp.get_cached_btype(ffi, finishlist)) + abi_args = () + if self.abi == "__stdcall": + if not self.ellipsis: # __stdcall ignored for variadic funcs + try: + abi_args = (ffi._backend.FFI_STDCALL,) + except AttributeError: + pass + return global_cache(self, ffi, 'new_function_type', + tuple(args), result, self.ellipsis, *abi_args) + + def as_raw_function(self): + return RawFunctionType(self.args, self.result, self.ellipsis, self.abi) + + +class PointerType(BaseType): + _attrs_ = ('totype', 'quals') + + def __init__(self, totype, quals=0): + self.totype = totype + self.quals = quals + extra = " *&" + if totype.is_array_type: + extra = "(%s)" % (extra.lstrip(),) + extra = qualify(quals, extra) + self.c_name_with_marker = totype.c_name_with_marker.replace('&', extra) + + def build_backend_type(self, ffi, finishlist): + BItem = self.totype.get_cached_btype(ffi, finishlist, can_delay=True) + return global_cache(self, ffi, 'new_pointer_type', BItem) + +voidp_type = PointerType(void_type) + +def ConstPointerType(totype): + return PointerType(totype, Q_CONST) + +const_voidp_type = ConstPointerType(void_type) + + +class NamedPointerType(PointerType): + _attrs_ = ('totype', 'name') + + def __init__(self, totype, name, quals=0): + PointerType.__init__(self, totype, quals) + self.name = name + self.c_name_with_marker = name + '&' + + +class ArrayType(BaseType): + _attrs_ = ('item', 'length') + is_array_type = True + + def __init__(self, item, length): + self.item = item + self.length = length + # + if length is None: + brackets = '&[]' + elif length == '...': + brackets = '&[/*...*/]' + else: + brackets = '&[%s]' % length + self.c_name_with_marker = ( + self.item.c_name_with_marker.replace('&', brackets)) + + def length_is_unknown(self): + return isinstance(self.length, str) + + def resolve_length(self, newlength): + return ArrayType(self.item, newlength) + + def build_backend_type(self, ffi, finishlist): + if self.length_is_unknown(): + raise CDefError("cannot render the type %r: unknown length" % + (self,)) + self.item.get_cached_btype(ffi, finishlist) # force the item BType + BPtrItem = PointerType(self.item).get_cached_btype(ffi, finishlist) + return global_cache(self, ffi, 'new_array_type', BPtrItem, self.length) + +char_array_type = ArrayType(PrimitiveType('char'), None) + + +class StructOrUnionOrEnum(BaseTypeByIdentity): + _attrs_ = ('name',) + forcename = None + + def build_c_name_with_marker(self): + name = self.forcename or '%s %s' % (self.kind, self.name) + self.c_name_with_marker = name + '&' + + def force_the_name(self, forcename): + self.forcename = forcename + self.build_c_name_with_marker() + + def get_official_name(self): + assert self.c_name_with_marker.endswith('&') + return self.c_name_with_marker[:-1] + + +class StructOrUnion(StructOrUnionOrEnum): + fixedlayout = None + completed = 0 + partial = False + packed = 0 + + def __init__(self, name, fldnames, fldtypes, fldbitsize, fldquals=None): + self.name = name + self.fldnames = fldnames + self.fldtypes = fldtypes + self.fldbitsize = fldbitsize + self.fldquals = fldquals + self.build_c_name_with_marker() + + def anonymous_struct_fields(self): + if self.fldtypes is not None: + for name, type in zip(self.fldnames, self.fldtypes): + if name == '' and isinstance(type, StructOrUnion): + yield type + + def enumfields(self, expand_anonymous_struct_union=True): + fldquals = self.fldquals + if fldquals is None: + fldquals = (0,) * len(self.fldnames) + for name, type, bitsize, quals in zip(self.fldnames, self.fldtypes, + self.fldbitsize, fldquals): + if (name == '' and isinstance(type, StructOrUnion) + and expand_anonymous_struct_union): + # nested anonymous struct/union + for result in type.enumfields(): + yield result + else: + yield (name, type, bitsize, quals) + + def force_flatten(self): + # force the struct or union to have a declaration that lists + # directly all fields returned by enumfields(), flattening + # nested anonymous structs/unions. + names = [] + types = [] + bitsizes = [] + fldquals = [] + for name, type, bitsize, quals in self.enumfields(): + names.append(name) + types.append(type) + bitsizes.append(bitsize) + fldquals.append(quals) + self.fldnames = tuple(names) + self.fldtypes = tuple(types) + self.fldbitsize = tuple(bitsizes) + self.fldquals = tuple(fldquals) + + def get_cached_btype(self, ffi, finishlist, can_delay=False): + BType = StructOrUnionOrEnum.get_cached_btype(self, ffi, finishlist, + can_delay) + if not can_delay: + self.finish_backend_type(ffi, finishlist) + return BType + + def finish_backend_type(self, ffi, finishlist): + if self.completed: + if self.completed != 2: + raise NotImplementedError("recursive structure declaration " + "for '%s'" % (self.name,)) + return + BType = ffi._cached_btypes[self] + # + self.completed = 1 + # + if self.fldtypes is None: + pass # not completing it: it's an opaque struct + # + elif self.fixedlayout is None: + fldtypes = [tp.get_cached_btype(ffi, finishlist) + for tp in self.fldtypes] + lst = list(zip(self.fldnames, fldtypes, self.fldbitsize)) + extra_flags = () + if self.packed: + if self.packed == 1: + extra_flags = (8,) # SF_PACKED + else: + extra_flags = (0, self.packed) + ffi._backend.complete_struct_or_union(BType, lst, self, + -1, -1, *extra_flags) + # + else: + fldtypes = [] + fieldofs, fieldsize, totalsize, totalalignment = self.fixedlayout + for i in range(len(self.fldnames)): + fsize = fieldsize[i] + ftype = self.fldtypes[i] + # + if isinstance(ftype, ArrayType) and ftype.length_is_unknown(): + # fix the length to match the total size + BItemType = ftype.item.get_cached_btype(ffi, finishlist) + nlen, nrest = divmod(fsize, ffi.sizeof(BItemType)) + if nrest != 0: + self._verification_error( + "field '%s.%s' has a bogus size?" % ( + self.name, self.fldnames[i] or '{}')) + ftype = ftype.resolve_length(nlen) + self.fldtypes = (self.fldtypes[:i] + (ftype,) + + self.fldtypes[i+1:]) + # + BFieldType = ftype.get_cached_btype(ffi, finishlist) + if isinstance(ftype, ArrayType) and ftype.length is None: + assert fsize == 0 + else: + bitemsize = ffi.sizeof(BFieldType) + if bitemsize != fsize: + self._verification_error( + "field '%s.%s' is declared as %d bytes, but is " + "really %d bytes" % (self.name, + self.fldnames[i] or '{}', + bitemsize, fsize)) + fldtypes.append(BFieldType) + # + lst = list(zip(self.fldnames, fldtypes, self.fldbitsize, fieldofs)) + ffi._backend.complete_struct_or_union(BType, lst, self, + totalsize, totalalignment) + self.completed = 2 + + def _verification_error(self, msg): + raise VerificationError(msg) + + def check_not_partial(self): + if self.partial and self.fixedlayout is None: + raise VerificationMissing(self._get_c_name()) + + def build_backend_type(self, ffi, finishlist): + self.check_not_partial() + finishlist.append(self) + # + return global_cache(self, ffi, 'new_%s_type' % self.kind, + self.get_official_name(), key=self) + + +class StructType(StructOrUnion): + kind = 'struct' + + +class UnionType(StructOrUnion): + kind = 'union' + + +class EnumType(StructOrUnionOrEnum): + kind = 'enum' + partial = False + partial_resolved = False + + def __init__(self, name, enumerators, enumvalues, baseinttype=None): + self.name = name + self.enumerators = enumerators + self.enumvalues = enumvalues + self.baseinttype = baseinttype + self.build_c_name_with_marker() + + def force_the_name(self, forcename): + StructOrUnionOrEnum.force_the_name(self, forcename) + if self.forcename is None: + name = self.get_official_name() + self.forcename = '$' + name.replace(' ', '_') + + def check_not_partial(self): + if self.partial and not self.partial_resolved: + raise VerificationMissing(self._get_c_name()) + + def build_backend_type(self, ffi, finishlist): + self.check_not_partial() + base_btype = self.build_baseinttype(ffi, finishlist) + return global_cache(self, ffi, 'new_enum_type', + self.get_official_name(), + self.enumerators, self.enumvalues, + base_btype, key=self) + + def build_baseinttype(self, ffi, finishlist): + if self.baseinttype is not None: + return self.baseinttype.get_cached_btype(ffi, finishlist) + # + if self.enumvalues: + smallest_value = min(self.enumvalues) + largest_value = max(self.enumvalues) + else: + import warnings + try: + # XXX! The goal is to ensure that the warnings.warn() + # will not suppress the warning. We want to get it + # several times if we reach this point several times. + __warningregistry__.clear() + except NameError: + pass + warnings.warn("%r has no values explicitly defined; " + "guessing that it is equivalent to 'unsigned int'" + % self._get_c_name()) + smallest_value = largest_value = 0 + if smallest_value < 0: # needs a signed type + sign = 1 + candidate1 = PrimitiveType("int") + candidate2 = PrimitiveType("long") + else: + sign = 0 + candidate1 = PrimitiveType("unsigned int") + candidate2 = PrimitiveType("unsigned long") + btype1 = candidate1.get_cached_btype(ffi, finishlist) + btype2 = candidate2.get_cached_btype(ffi, finishlist) + size1 = ffi.sizeof(btype1) + size2 = ffi.sizeof(btype2) + if (smallest_value >= ((-1) << (8*size1-1)) and + largest_value < (1 << (8*size1-sign))): + return btype1 + if (smallest_value >= ((-1) << (8*size2-1)) and + largest_value < (1 << (8*size2-sign))): + return btype2 + raise CDefError("%s values don't all fit into either 'long' " + "or 'unsigned long'" % self._get_c_name()) + +def unknown_type(name, structname=None): + if structname is None: + structname = '$%s' % name + tp = StructType(structname, None, None, None) + tp.force_the_name(name) + tp.origin = "unknown_type" + return tp + +def unknown_ptr_type(name, structname=None): + if structname is None: + structname = '$$%s' % name + tp = StructType(structname, None, None, None) + return NamedPointerType(tp, name) + + +global_lock = allocate_lock() +_typecache_cffi_backend = weakref.WeakValueDictionary() + +def get_typecache(backend): + # returns _typecache_cffi_backend if backend is the _cffi_backend + # module, or type(backend).__typecache if backend is an instance of + # CTypesBackend (or some FakeBackend class during tests) + if isinstance(backend, types.ModuleType): + return _typecache_cffi_backend + with global_lock: + if not hasattr(type(backend), '__typecache'): + type(backend).__typecache = weakref.WeakValueDictionary() + return type(backend).__typecache + +def global_cache(srctype, ffi, funcname, *args, **kwds): + key = kwds.pop('key', (funcname, args)) + assert not kwds + try: + return ffi._typecache[key] + except KeyError: + pass + try: + res = getattr(ffi._backend, funcname)(*args) + except NotImplementedError as e: + raise NotImplementedError("%s: %r: %s" % (funcname, srctype, e)) + # note that setdefault() on WeakValueDictionary is not atomic + # and contains a rare bug (http://bugs.python.org/issue19542); + # we have to use a lock and do it ourselves + cache = ffi._typecache + with global_lock: + res1 = cache.get(key) + if res1 is None: + cache[key] = res + return res + else: + return res1 + +def pointer_cache(ffi, BType): + return global_cache('?', ffi, 'new_pointer_type', BType) + +def attach_exception_info(e, name): + if e.args and type(e.args[0]) is str: + e.args = ('%s: %s' % (name, e.args[0]),) + e.args[1:] diff --git a/venv/lib/python3.11/site-packages/cffi/parse_c_type.h b/venv/lib/python3.11/site-packages/cffi/parse_c_type.h new file mode 100644 index 0000000..84e4ef8 --- /dev/null +++ b/venv/lib/python3.11/site-packages/cffi/parse_c_type.h @@ -0,0 +1,181 @@ + +/* This part is from file 'cffi/parse_c_type.h'. It is copied at the + beginning of C sources generated by CFFI's ffi.set_source(). */ + +typedef void *_cffi_opcode_t; + +#define _CFFI_OP(opcode, arg) (_cffi_opcode_t)(opcode | (((uintptr_t)(arg)) << 8)) +#define _CFFI_GETOP(cffi_opcode) ((unsigned char)(uintptr_t)cffi_opcode) +#define _CFFI_GETARG(cffi_opcode) (((intptr_t)cffi_opcode) >> 8) + +#define _CFFI_OP_PRIMITIVE 1 +#define _CFFI_OP_POINTER 3 +#define _CFFI_OP_ARRAY 5 +#define _CFFI_OP_OPEN_ARRAY 7 +#define _CFFI_OP_STRUCT_UNION 9 +#define _CFFI_OP_ENUM 11 +#define _CFFI_OP_FUNCTION 13 +#define _CFFI_OP_FUNCTION_END 15 +#define _CFFI_OP_NOOP 17 +#define _CFFI_OP_BITFIELD 19 +#define _CFFI_OP_TYPENAME 21 +#define _CFFI_OP_CPYTHON_BLTN_V 23 // varargs +#define _CFFI_OP_CPYTHON_BLTN_N 25 // noargs +#define _CFFI_OP_CPYTHON_BLTN_O 27 // O (i.e. a single arg) +#define _CFFI_OP_CONSTANT 29 +#define _CFFI_OP_CONSTANT_INT 31 +#define _CFFI_OP_GLOBAL_VAR 33 +#define _CFFI_OP_DLOPEN_FUNC 35 +#define _CFFI_OP_DLOPEN_CONST 37 +#define _CFFI_OP_GLOBAL_VAR_F 39 +#define _CFFI_OP_EXTERN_PYTHON 41 + +#define _CFFI_PRIM_VOID 0 +#define _CFFI_PRIM_BOOL 1 +#define _CFFI_PRIM_CHAR 2 +#define _CFFI_PRIM_SCHAR 3 +#define _CFFI_PRIM_UCHAR 4 +#define _CFFI_PRIM_SHORT 5 +#define _CFFI_PRIM_USHORT 6 +#define _CFFI_PRIM_INT 7 +#define _CFFI_PRIM_UINT 8 +#define _CFFI_PRIM_LONG 9 +#define _CFFI_PRIM_ULONG 10 +#define _CFFI_PRIM_LONGLONG 11 +#define _CFFI_PRIM_ULONGLONG 12 +#define _CFFI_PRIM_FLOAT 13 +#define _CFFI_PRIM_DOUBLE 14 +#define _CFFI_PRIM_LONGDOUBLE 15 + +#define _CFFI_PRIM_WCHAR 16 +#define _CFFI_PRIM_INT8 17 +#define _CFFI_PRIM_UINT8 18 +#define _CFFI_PRIM_INT16 19 +#define _CFFI_PRIM_UINT16 20 +#define _CFFI_PRIM_INT32 21 +#define _CFFI_PRIM_UINT32 22 +#define _CFFI_PRIM_INT64 23 +#define _CFFI_PRIM_UINT64 24 +#define _CFFI_PRIM_INTPTR 25 +#define _CFFI_PRIM_UINTPTR 26 +#define _CFFI_PRIM_PTRDIFF 27 +#define _CFFI_PRIM_SIZE 28 +#define _CFFI_PRIM_SSIZE 29 +#define _CFFI_PRIM_INT_LEAST8 30 +#define _CFFI_PRIM_UINT_LEAST8 31 +#define _CFFI_PRIM_INT_LEAST16 32 +#define _CFFI_PRIM_UINT_LEAST16 33 +#define _CFFI_PRIM_INT_LEAST32 34 +#define _CFFI_PRIM_UINT_LEAST32 35 +#define _CFFI_PRIM_INT_LEAST64 36 +#define _CFFI_PRIM_UINT_LEAST64 37 +#define _CFFI_PRIM_INT_FAST8 38 +#define _CFFI_PRIM_UINT_FAST8 39 +#define _CFFI_PRIM_INT_FAST16 40 +#define _CFFI_PRIM_UINT_FAST16 41 +#define _CFFI_PRIM_INT_FAST32 42 +#define _CFFI_PRIM_UINT_FAST32 43 +#define _CFFI_PRIM_INT_FAST64 44 +#define _CFFI_PRIM_UINT_FAST64 45 +#define _CFFI_PRIM_INTMAX 46 +#define _CFFI_PRIM_UINTMAX 47 +#define _CFFI_PRIM_FLOATCOMPLEX 48 +#define _CFFI_PRIM_DOUBLECOMPLEX 49 +#define _CFFI_PRIM_CHAR16 50 +#define _CFFI_PRIM_CHAR32 51 + +#define _CFFI__NUM_PRIM 52 +#define _CFFI__UNKNOWN_PRIM (-1) +#define _CFFI__UNKNOWN_FLOAT_PRIM (-2) +#define _CFFI__UNKNOWN_LONG_DOUBLE (-3) + +#define _CFFI__IO_FILE_STRUCT (-1) + + +struct _cffi_global_s { + const char *name; + void *address; + _cffi_opcode_t type_op; + void *size_or_direct_fn; // OP_GLOBAL_VAR: size, or 0 if unknown + // OP_CPYTHON_BLTN_*: addr of direct function +}; + +struct _cffi_getconst_s { + unsigned long long value; + const struct _cffi_type_context_s *ctx; + int gindex; +}; + +struct _cffi_struct_union_s { + const char *name; + int type_index; // -> _cffi_types, on a OP_STRUCT_UNION + int flags; // _CFFI_F_* flags below + size_t size; + int alignment; + int first_field_index; // -> _cffi_fields array + int num_fields; +}; +#define _CFFI_F_UNION 0x01 // is a union, not a struct +#define _CFFI_F_CHECK_FIELDS 0x02 // complain if fields are not in the + // "standard layout" or if some are missing +#define _CFFI_F_PACKED 0x04 // for CHECK_FIELDS, assume a packed struct +#define _CFFI_F_EXTERNAL 0x08 // in some other ffi.include() +#define _CFFI_F_OPAQUE 0x10 // opaque + +struct _cffi_field_s { + const char *name; + size_t field_offset; + size_t field_size; + _cffi_opcode_t field_type_op; +}; + +struct _cffi_enum_s { + const char *name; + int type_index; // -> _cffi_types, on a OP_ENUM + int type_prim; // _CFFI_PRIM_xxx + const char *enumerators; // comma-delimited string +}; + +struct _cffi_typename_s { + const char *name; + int type_index; /* if opaque, points to a possibly artificial + OP_STRUCT which is itself opaque */ +}; + +struct _cffi_type_context_s { + _cffi_opcode_t *types; + const struct _cffi_global_s *globals; + const struct _cffi_field_s *fields; + const struct _cffi_struct_union_s *struct_unions; + const struct _cffi_enum_s *enums; + const struct _cffi_typename_s *typenames; + int num_globals; + int num_struct_unions; + int num_enums; + int num_typenames; + const char *const *includes; + int num_types; + int flags; /* future extension */ +}; + +struct _cffi_parse_info_s { + const struct _cffi_type_context_s *ctx; + _cffi_opcode_t *output; + unsigned int output_size; + size_t error_location; + const char *error_message; +}; + +struct _cffi_externpy_s { + const char *name; + size_t size_of_result; + void *reserved1, *reserved2; +}; + +#ifdef _CFFI_INTERNAL +static int parse_c_type(struct _cffi_parse_info_s *info, const char *input); +static int search_in_globals(const struct _cffi_type_context_s *ctx, + const char *search, size_t search_len); +static int search_in_struct_unions(const struct _cffi_type_context_s *ctx, + const char *search, size_t search_len); +#endif diff --git a/venv/lib/python3.11/site-packages/cffi/pkgconfig.py b/venv/lib/python3.11/site-packages/cffi/pkgconfig.py new file mode 100644 index 0000000..5c93f15 --- /dev/null +++ b/venv/lib/python3.11/site-packages/cffi/pkgconfig.py @@ -0,0 +1,121 @@ +# pkg-config, https://www.freedesktop.org/wiki/Software/pkg-config/ integration for cffi +import sys, os, subprocess + +from .error import PkgConfigError + + +def merge_flags(cfg1, cfg2): + """Merge values from cffi config flags cfg2 to cf1 + + Example: + merge_flags({"libraries": ["one"]}, {"libraries": ["two"]}) + {"libraries": ["one", "two"]} + """ + for key, value in cfg2.items(): + if key not in cfg1: + cfg1[key] = value + else: + if not isinstance(cfg1[key], list): + raise TypeError("cfg1[%r] should be a list of strings" % (key,)) + if not isinstance(value, list): + raise TypeError("cfg2[%r] should be a list of strings" % (key,)) + cfg1[key].extend(value) + return cfg1 + + +def call(libname, flag, encoding=sys.getfilesystemencoding()): + """Calls pkg-config and returns the output if found + """ + a = ["pkg-config", "--print-errors"] + a.append(flag) + a.append(libname) + try: + pc = subprocess.Popen(a, stdout=subprocess.PIPE, stderr=subprocess.PIPE) + except EnvironmentError as e: + raise PkgConfigError("cannot run pkg-config: %s" % (str(e).strip(),)) + + bout, berr = pc.communicate() + if pc.returncode != 0: + try: + berr = berr.decode(encoding) + except Exception: + pass + raise PkgConfigError(berr.strip()) + + if sys.version_info >= (3,) and not isinstance(bout, str): # Python 3.x + try: + bout = bout.decode(encoding) + except UnicodeDecodeError: + raise PkgConfigError("pkg-config %s %s returned bytes that cannot " + "be decoded with encoding %r:\n%r" % + (flag, libname, encoding, bout)) + + if os.altsep != '\\' and '\\' in bout: + raise PkgConfigError("pkg-config %s %s returned an unsupported " + "backslash-escaped output:\n%r" % + (flag, libname, bout)) + return bout + + +def flags_from_pkgconfig(libs): + r"""Return compiler line flags for FFI.set_source based on pkg-config output + + Usage + ... + ffibuilder.set_source("_foo", pkgconfig = ["libfoo", "libbar >= 1.8.3"]) + + If pkg-config is installed on build machine, then arguments include_dirs, + library_dirs, libraries, define_macros, extra_compile_args and + extra_link_args are extended with an output of pkg-config for libfoo and + libbar. + + Raises PkgConfigError in case the pkg-config call fails. + """ + + def get_include_dirs(string): + return [x[2:] for x in string.split() if x.startswith("-I")] + + def get_library_dirs(string): + return [x[2:] for x in string.split() if x.startswith("-L")] + + def get_libraries(string): + return [x[2:] for x in string.split() if x.startswith("-l")] + + # convert -Dfoo=bar to list of tuples [("foo", "bar")] expected by distutils + def get_macros(string): + def _macro(x): + x = x[2:] # drop "-D" + if '=' in x: + return tuple(x.split("=", 1)) # "-Dfoo=bar" => ("foo", "bar") + else: + return (x, None) # "-Dfoo" => ("foo", None) + return [_macro(x) for x in string.split() if x.startswith("-D")] + + def get_other_cflags(string): + return [x for x in string.split() if not x.startswith("-I") and + not x.startswith("-D")] + + def get_other_libs(string): + return [x for x in string.split() if not x.startswith("-L") and + not x.startswith("-l")] + + # return kwargs for given libname + def kwargs(libname): + fse = sys.getfilesystemencoding() + all_cflags = call(libname, "--cflags") + all_libs = call(libname, "--libs") + return { + "include_dirs": get_include_dirs(all_cflags), + "library_dirs": get_library_dirs(all_libs), + "libraries": get_libraries(all_libs), + "define_macros": get_macros(all_cflags), + "extra_compile_args": get_other_cflags(all_cflags), + "extra_link_args": get_other_libs(all_libs), + } + + # merge all arguments together + ret = {} + for libname in libs: + lib_flags = kwargs(libname) + merge_flags(ret, lib_flags) + return ret diff --git a/venv/lib/python3.11/site-packages/cffi/recompiler.py b/venv/lib/python3.11/site-packages/cffi/recompiler.py new file mode 100644 index 0000000..7734a34 --- /dev/null +++ b/venv/lib/python3.11/site-packages/cffi/recompiler.py @@ -0,0 +1,1598 @@ +import io, os, sys, sysconfig +from . import ffiplatform, model +from .error import VerificationError +from .cffi_opcode import * + +VERSION_BASE = 0x2601 +VERSION_EMBEDDED = 0x2701 +VERSION_CHAR16CHAR32 = 0x2801 + +USE_LIMITED_API = ((sys.platform != 'win32' or sys.version_info < (3, 0) or + sys.version_info >= (3, 5)) and + not sysconfig.get_config_var("Py_GIL_DISABLED")) # free-threaded doesn't yet support limited API + +class GlobalExpr: + def __init__(self, name, address, type_op, size=0, check_value=0): + self.name = name + self.address = address + self.type_op = type_op + self.size = size + self.check_value = check_value + + def as_c_expr(self): + return ' { "%s", (void *)%s, %s, (void *)%s },' % ( + self.name, self.address, self.type_op.as_c_expr(), self.size) + + def as_python_expr(self): + return "b'%s%s',%d" % (self.type_op.as_python_bytes(), self.name, + self.check_value) + +class FieldExpr: + def __init__(self, name, field_offset, field_size, fbitsize, field_type_op): + self.name = name + self.field_offset = field_offset + self.field_size = field_size + self.fbitsize = fbitsize + self.field_type_op = field_type_op + + def as_c_expr(self): + spaces = " " * len(self.name) + return (' { "%s", %s,\n' % (self.name, self.field_offset) + + ' %s %s,\n' % (spaces, self.field_size) + + ' %s %s },' % (spaces, self.field_type_op.as_c_expr())) + + def as_python_expr(self): + raise NotImplementedError + + def as_field_python_expr(self): + if self.field_type_op.op == OP_NOOP: + size_expr = '' + elif self.field_type_op.op == OP_BITFIELD: + size_expr = format_four_bytes(self.fbitsize) + else: + raise NotImplementedError + return "b'%s%s%s'" % (self.field_type_op.as_python_bytes(), + size_expr, + self.name) + +class StructUnionExpr: + def __init__(self, name, type_index, flags, size, alignment, comment, + first_field_index, c_fields): + self.name = name + self.type_index = type_index + self.flags = flags + self.size = size + self.alignment = alignment + self.comment = comment + self.first_field_index = first_field_index + self.c_fields = c_fields + + def as_c_expr(self): + return (' { "%s", %d, %s,' % (self.name, self.type_index, self.flags) + + '\n %s, %s, ' % (self.size, self.alignment) + + '%d, %d ' % (self.first_field_index, len(self.c_fields)) + + ('/* %s */ ' % self.comment if self.comment else '') + + '},') + + def as_python_expr(self): + flags = eval(self.flags, G_FLAGS) + fields_expr = [c_field.as_field_python_expr() + for c_field in self.c_fields] + return "(b'%s%s%s',%s)" % ( + format_four_bytes(self.type_index), + format_four_bytes(flags), + self.name, + ','.join(fields_expr)) + +class EnumExpr: + def __init__(self, name, type_index, size, signed, allenums): + self.name = name + self.type_index = type_index + self.size = size + self.signed = signed + self.allenums = allenums + + def as_c_expr(self): + return (' { "%s", %d, _cffi_prim_int(%s, %s),\n' + ' "%s" },' % (self.name, self.type_index, + self.size, self.signed, self.allenums)) + + def as_python_expr(self): + prim_index = { + (1, 0): PRIM_UINT8, (1, 1): PRIM_INT8, + (2, 0): PRIM_UINT16, (2, 1): PRIM_INT16, + (4, 0): PRIM_UINT32, (4, 1): PRIM_INT32, + (8, 0): PRIM_UINT64, (8, 1): PRIM_INT64, + }[self.size, self.signed] + return "b'%s%s%s\\x00%s'" % (format_four_bytes(self.type_index), + format_four_bytes(prim_index), + self.name, self.allenums) + +class TypenameExpr: + def __init__(self, name, type_index): + self.name = name + self.type_index = type_index + + def as_c_expr(self): + return ' { "%s", %d },' % (self.name, self.type_index) + + def as_python_expr(self): + return "b'%s%s'" % (format_four_bytes(self.type_index), self.name) + + +# ____________________________________________________________ + + +class Recompiler: + _num_externpy = 0 + + def __init__(self, ffi, module_name, target_is_python=False): + self.ffi = ffi + self.module_name = module_name + self.target_is_python = target_is_python + self._version = VERSION_BASE + + def needs_version(self, ver): + self._version = max(self._version, ver) + + def collect_type_table(self): + self._typesdict = {} + self._generate("collecttype") + # + all_decls = sorted(self._typesdict, key=str) + # + # prepare all FUNCTION bytecode sequences first + self.cffi_types = [] + for tp in all_decls: + if tp.is_raw_function: + assert self._typesdict[tp] is None + self._typesdict[tp] = len(self.cffi_types) + self.cffi_types.append(tp) # placeholder + for tp1 in tp.args: + assert isinstance(tp1, (model.VoidType, + model.BasePrimitiveType, + model.PointerType, + model.StructOrUnionOrEnum, + model.FunctionPtrType)) + if self._typesdict[tp1] is None: + self._typesdict[tp1] = len(self.cffi_types) + self.cffi_types.append(tp1) # placeholder + self.cffi_types.append('END') # placeholder + # + # prepare all OTHER bytecode sequences + for tp in all_decls: + if not tp.is_raw_function and self._typesdict[tp] is None: + self._typesdict[tp] = len(self.cffi_types) + self.cffi_types.append(tp) # placeholder + if tp.is_array_type and tp.length is not None: + self.cffi_types.append('LEN') # placeholder + assert None not in self._typesdict.values() + # + # collect all structs and unions and enums + self._struct_unions = {} + self._enums = {} + for tp in all_decls: + if isinstance(tp, model.StructOrUnion): + self._struct_unions[tp] = None + elif isinstance(tp, model.EnumType): + self._enums[tp] = None + for i, tp in enumerate(sorted(self._struct_unions, + key=lambda tp: tp.name)): + self._struct_unions[tp] = i + for i, tp in enumerate(sorted(self._enums, + key=lambda tp: tp.name)): + self._enums[tp] = i + # + # emit all bytecode sequences now + for tp in all_decls: + method = getattr(self, '_emit_bytecode_' + tp.__class__.__name__) + method(tp, self._typesdict[tp]) + # + # consistency check + for op in self.cffi_types: + assert isinstance(op, CffiOp) + self.cffi_types = tuple(self.cffi_types) # don't change any more + + def _enum_fields(self, tp): + # When producing C, expand all anonymous struct/union fields. + # That's necessary to have C code checking the offsets of the + # individual fields contained in them. When producing Python, + # don't do it and instead write it like it is, with the + # corresponding fields having an empty name. Empty names are + # recognized at runtime when we import the generated Python + # file. + expand_anonymous_struct_union = not self.target_is_python + return tp.enumfields(expand_anonymous_struct_union) + + def _do_collect_type(self, tp): + if not isinstance(tp, model.BaseTypeByIdentity): + if isinstance(tp, tuple): + for x in tp: + self._do_collect_type(x) + return + if tp not in self._typesdict: + self._typesdict[tp] = None + if isinstance(tp, model.FunctionPtrType): + self._do_collect_type(tp.as_raw_function()) + elif isinstance(tp, model.StructOrUnion): + if tp.fldtypes is not None and ( + tp not in self.ffi._parser._included_declarations): + for name1, tp1, _, _ in self._enum_fields(tp): + self._do_collect_type(self._field_type(tp, name1, tp1)) + else: + for _, x in tp._get_items(): + self._do_collect_type(x) + + def _generate(self, step_name): + lst = self.ffi._parser._declarations.items() + for name, (tp, quals) in sorted(lst): + kind, realname = name.split(' ', 1) + try: + method = getattr(self, '_generate_cpy_%s_%s' % (kind, + step_name)) + except AttributeError: + raise VerificationError( + "not implemented in recompile(): %r" % name) + try: + self._current_quals = quals + method(tp, realname) + except Exception as e: + model.attach_exception_info(e, name) + raise + + # ---------- + + ALL_STEPS = ["global", "field", "struct_union", "enum", "typename"] + + def collect_step_tables(self): + # collect the declarations for '_cffi_globals', '_cffi_typenames', etc. + self._lsts = {} + for step_name in self.ALL_STEPS: + self._lsts[step_name] = [] + self._seen_struct_unions = set() + self._generate("ctx") + self._add_missing_struct_unions() + # + for step_name in self.ALL_STEPS: + lst = self._lsts[step_name] + if step_name != "field": + lst.sort(key=lambda entry: entry.name) + self._lsts[step_name] = tuple(lst) # don't change any more + # + # check for a possible internal inconsistency: _cffi_struct_unions + # should have been generated with exactly self._struct_unions + lst = self._lsts["struct_union"] + for tp, i in self._struct_unions.items(): + assert i < len(lst) + assert lst[i].name == tp.name + assert len(lst) == len(self._struct_unions) + # same with enums + lst = self._lsts["enum"] + for tp, i in self._enums.items(): + assert i < len(lst) + assert lst[i].name == tp.name + assert len(lst) == len(self._enums) + + # ---------- + + def _prnt(self, what=''): + self._f.write(what + '\n') + + def write_source_to_f(self, f, preamble): + if self.target_is_python: + assert preamble is None + self.write_py_source_to_f(f) + else: + assert preamble is not None + self.write_c_source_to_f(f, preamble) + + def _rel_readlines(self, filename): + g = open(os.path.join(os.path.dirname(__file__), filename), 'r') + lines = g.readlines() + g.close() + return lines + + def write_c_source_to_f(self, f, preamble): + self._f = f + prnt = self._prnt + if self.ffi._embedding is not None: + prnt('#define _CFFI_USE_EMBEDDING') + if not USE_LIMITED_API: + prnt('#define _CFFI_NO_LIMITED_API') + # + # first the '#include' (actually done by inlining the file's content) + lines = self._rel_readlines('_cffi_include.h') + i = lines.index('#include "parse_c_type.h"\n') + lines[i:i+1] = self._rel_readlines('parse_c_type.h') + prnt(''.join(lines)) + # + # if we have ffi._embedding != None, we give it here as a macro + # and include an extra file + base_module_name = self.module_name.split('.')[-1] + if self.ffi._embedding is not None: + prnt('#define _CFFI_MODULE_NAME "%s"' % (self.module_name,)) + prnt('static const char _CFFI_PYTHON_STARTUP_CODE[] = {') + self._print_string_literal_in_array(self.ffi._embedding) + prnt('0 };') + prnt('#ifdef PYPY_VERSION') + prnt('# define _CFFI_PYTHON_STARTUP_FUNC _cffi_pypyinit_%s' % ( + base_module_name,)) + prnt('#elif PY_MAJOR_VERSION >= 3') + prnt('# define _CFFI_PYTHON_STARTUP_FUNC PyInit_%s' % ( + base_module_name,)) + prnt('#else') + prnt('# define _CFFI_PYTHON_STARTUP_FUNC init%s' % ( + base_module_name,)) + prnt('#endif') + lines = self._rel_readlines('_embedding.h') + i = lines.index('#include "_cffi_errors.h"\n') + lines[i:i+1] = self._rel_readlines('_cffi_errors.h') + prnt(''.join(lines)) + self.needs_version(VERSION_EMBEDDED) + # + # then paste the C source given by the user, verbatim. + prnt('/************************************************************/') + prnt() + prnt(preamble) + prnt() + prnt('/************************************************************/') + prnt() + # + # the declaration of '_cffi_types' + prnt('static void *_cffi_types[] = {') + typeindex2type = dict([(i, tp) for (tp, i) in self._typesdict.items()]) + for i, op in enumerate(self.cffi_types): + comment = '' + if i in typeindex2type: + comment = ' // ' + typeindex2type[i]._get_c_name() + prnt('/* %2d */ %s,%s' % (i, op.as_c_expr(), comment)) + if not self.cffi_types: + prnt(' 0') + prnt('};') + prnt() + # + # call generate_cpy_xxx_decl(), for every xxx found from + # ffi._parser._declarations. This generates all the functions. + self._seen_constants = set() + self._generate("decl") + # + # the declaration of '_cffi_globals' and '_cffi_typenames' + nums = {} + for step_name in self.ALL_STEPS: + lst = self._lsts[step_name] + nums[step_name] = len(lst) + if nums[step_name] > 0: + prnt('static const struct _cffi_%s_s _cffi_%ss[] = {' % ( + step_name, step_name)) + for entry in lst: + prnt(entry.as_c_expr()) + prnt('};') + prnt() + # + # the declaration of '_cffi_includes' + if self.ffi._included_ffis: + prnt('static const char * const _cffi_includes[] = {') + for ffi_to_include in self.ffi._included_ffis: + try: + included_module_name, included_source = ( + ffi_to_include._assigned_source[:2]) + except AttributeError: + raise VerificationError( + "ffi object %r includes %r, but the latter has not " + "been prepared with set_source()" % ( + self.ffi, ffi_to_include,)) + if included_source is None: + raise VerificationError( + "not implemented yet: ffi.include() of a Python-based " + "ffi inside a C-based ffi") + prnt(' "%s",' % (included_module_name,)) + prnt(' NULL') + prnt('};') + prnt() + # + # the declaration of '_cffi_type_context' + prnt('static const struct _cffi_type_context_s _cffi_type_context = {') + prnt(' _cffi_types,') + for step_name in self.ALL_STEPS: + if nums[step_name] > 0: + prnt(' _cffi_%ss,' % step_name) + else: + prnt(' NULL, /* no %ss */' % step_name) + for step_name in self.ALL_STEPS: + if step_name != "field": + prnt(' %d, /* num_%ss */' % (nums[step_name], step_name)) + if self.ffi._included_ffis: + prnt(' _cffi_includes,') + else: + prnt(' NULL, /* no includes */') + prnt(' %d, /* num_types */' % (len(self.cffi_types),)) + flags = 0 + if self._num_externpy > 0 or self.ffi._embedding is not None: + flags |= 1 # set to mean that we use extern "Python" + prnt(' %d, /* flags */' % flags) + prnt('};') + prnt() + # + # the init function + prnt('#ifdef __GNUC__') + prnt('# pragma GCC visibility push(default) /* for -fvisibility= */') + prnt('#endif') + prnt() + prnt('#ifdef PYPY_VERSION') + prnt('PyMODINIT_FUNC') + prnt('_cffi_pypyinit_%s(const void *p[])' % (base_module_name,)) + prnt('{') + if flags & 1: + prnt(' if (((intptr_t)p[0]) >= 0x0A03) {') + prnt(' _cffi_call_python_org = ' + '(void(*)(struct _cffi_externpy_s *, char *))p[1];') + prnt(' }') + prnt(' p[0] = (const void *)0x%x;' % self._version) + prnt(' p[1] = &_cffi_type_context;') + prnt('#if PY_MAJOR_VERSION >= 3') + prnt(' return NULL;') + prnt('#endif') + prnt('}') + # on Windows, distutils insists on putting init_cffi_xyz in + # 'export_symbols', so instead of fighting it, just give up and + # give it one + prnt('# ifdef _MSC_VER') + prnt(' PyMODINIT_FUNC') + prnt('# if PY_MAJOR_VERSION >= 3') + prnt(' PyInit_%s(void) { return NULL; }' % (base_module_name,)) + prnt('# else') + prnt(' init%s(void) { }' % (base_module_name,)) + prnt('# endif') + prnt('# endif') + prnt('#elif PY_MAJOR_VERSION >= 3') + prnt('PyMODINIT_FUNC') + prnt('PyInit_%s(void)' % (base_module_name,)) + prnt('{') + prnt(' return _cffi_init("%s", 0x%x, &_cffi_type_context);' % ( + self.module_name, self._version)) + prnt('}') + prnt('#else') + prnt('PyMODINIT_FUNC') + prnt('init%s(void)' % (base_module_name,)) + prnt('{') + prnt(' _cffi_init("%s", 0x%x, &_cffi_type_context);' % ( + self.module_name, self._version)) + prnt('}') + prnt('#endif') + prnt() + prnt('#ifdef __GNUC__') + prnt('# pragma GCC visibility pop') + prnt('#endif') + self._version = None + + def _to_py(self, x): + if isinstance(x, str): + return "b'%s'" % (x,) + if isinstance(x, (list, tuple)): + rep = [self._to_py(item) for item in x] + if len(rep) == 1: + rep.append('') + return "(%s)" % (','.join(rep),) + return x.as_python_expr() # Py2: unicode unexpected; Py3: bytes unexp. + + def write_py_source_to_f(self, f): + self._f = f + prnt = self._prnt + # + # header + prnt("# auto-generated file") + prnt("import _cffi_backend") + # + # the 'import' of the included ffis + num_includes = len(self.ffi._included_ffis or ()) + for i in range(num_includes): + ffi_to_include = self.ffi._included_ffis[i] + try: + included_module_name, included_source = ( + ffi_to_include._assigned_source[:2]) + except AttributeError: + raise VerificationError( + "ffi object %r includes %r, but the latter has not " + "been prepared with set_source()" % ( + self.ffi, ffi_to_include,)) + if included_source is not None: + raise VerificationError( + "not implemented yet: ffi.include() of a C-based " + "ffi inside a Python-based ffi") + prnt('from %s import ffi as _ffi%d' % (included_module_name, i)) + prnt() + prnt("ffi = _cffi_backend.FFI('%s'," % (self.module_name,)) + prnt(" _version = 0x%x," % (self._version,)) + self._version = None + # + # the '_types' keyword argument + self.cffi_types = tuple(self.cffi_types) # don't change any more + types_lst = [op.as_python_bytes() for op in self.cffi_types] + prnt(' _types = %s,' % (self._to_py(''.join(types_lst)),)) + typeindex2type = dict([(i, tp) for (tp, i) in self._typesdict.items()]) + # + # the keyword arguments from ALL_STEPS + for step_name in self.ALL_STEPS: + lst = self._lsts[step_name] + if len(lst) > 0 and step_name != "field": + prnt(' _%ss = %s,' % (step_name, self._to_py(lst))) + # + # the '_includes' keyword argument + if num_includes > 0: + prnt(' _includes = (%s,),' % ( + ', '.join(['_ffi%d' % i for i in range(num_includes)]),)) + # + # the footer + prnt(')') + + # ---------- + + def _gettypenum(self, type): + # a KeyError here is a bug. please report it! :-) + return self._typesdict[type] + + def _convert_funcarg_to_c(self, tp, fromvar, tovar, errcode): + extraarg = '' + if isinstance(tp, model.BasePrimitiveType) and not tp.is_complex_type(): + if tp.is_integer_type() and tp.name != '_Bool': + converter = '_cffi_to_c_int' + extraarg = ', %s' % tp.name + elif isinstance(tp, model.UnknownFloatType): + # don't check with is_float_type(): it may be a 'long + # double' here, and _cffi_to_c_double would loose precision + converter = '(%s)_cffi_to_c_double' % (tp.get_c_name(''),) + else: + cname = tp.get_c_name('') + converter = '(%s)_cffi_to_c_%s' % (cname, + tp.name.replace(' ', '_')) + if cname in ('char16_t', 'char32_t'): + self.needs_version(VERSION_CHAR16CHAR32) + errvalue = '-1' + # + elif isinstance(tp, model.PointerType): + self._convert_funcarg_to_c_ptr_or_array(tp, fromvar, + tovar, errcode) + return + # + elif (isinstance(tp, model.StructOrUnionOrEnum) or + isinstance(tp, model.BasePrimitiveType)): + # a struct (not a struct pointer) as a function argument; + # or, a complex (the same code works) + self._prnt(' if (_cffi_to_c((char *)&%s, _cffi_type(%d), %s) < 0)' + % (tovar, self._gettypenum(tp), fromvar)) + self._prnt(' %s;' % errcode) + return + # + elif isinstance(tp, model.FunctionPtrType): + converter = '(%s)_cffi_to_c_pointer' % tp.get_c_name('') + extraarg = ', _cffi_type(%d)' % self._gettypenum(tp) + errvalue = 'NULL' + # + else: + raise NotImplementedError(tp) + # + self._prnt(' %s = %s(%s%s);' % (tovar, converter, fromvar, extraarg)) + self._prnt(' if (%s == (%s)%s && PyErr_Occurred())' % ( + tovar, tp.get_c_name(''), errvalue)) + self._prnt(' %s;' % errcode) + + def _extra_local_variables(self, tp, localvars, freelines): + if isinstance(tp, model.PointerType): + localvars.add('Py_ssize_t datasize') + localvars.add('struct _cffi_freeme_s *large_args_free = NULL') + freelines.add('if (large_args_free != NULL)' + ' _cffi_free_array_arguments(large_args_free);') + + def _convert_funcarg_to_c_ptr_or_array(self, tp, fromvar, tovar, errcode): + self._prnt(' datasize = _cffi_prepare_pointer_call_argument(') + self._prnt(' _cffi_type(%d), %s, (char **)&%s);' % ( + self._gettypenum(tp), fromvar, tovar)) + self._prnt(' if (datasize != 0) {') + self._prnt(' %s = ((size_t)datasize) <= 640 ? ' + '(%s)alloca((size_t)datasize) : NULL;' % ( + tovar, tp.get_c_name(''))) + self._prnt(' if (_cffi_convert_array_argument(_cffi_type(%d), %s, ' + '(char **)&%s,' % (self._gettypenum(tp), fromvar, tovar)) + self._prnt(' datasize, &large_args_free) < 0)') + self._prnt(' %s;' % errcode) + self._prnt(' }') + + def _convert_expr_from_c(self, tp, var, context): + if isinstance(tp, model.BasePrimitiveType): + if tp.is_integer_type() and tp.name != '_Bool': + return '_cffi_from_c_int(%s, %s)' % (var, tp.name) + elif isinstance(tp, model.UnknownFloatType): + return '_cffi_from_c_double(%s)' % (var,) + elif tp.name != 'long double' and not tp.is_complex_type(): + cname = tp.name.replace(' ', '_') + if cname in ('char16_t', 'char32_t'): + self.needs_version(VERSION_CHAR16CHAR32) + return '_cffi_from_c_%s(%s)' % (cname, var) + else: + return '_cffi_from_c_deref((char *)&%s, _cffi_type(%d))' % ( + var, self._gettypenum(tp)) + elif isinstance(tp, (model.PointerType, model.FunctionPtrType)): + return '_cffi_from_c_pointer((char *)%s, _cffi_type(%d))' % ( + var, self._gettypenum(tp)) + elif isinstance(tp, model.ArrayType): + return '_cffi_from_c_pointer((char *)%s, _cffi_type(%d))' % ( + var, self._gettypenum(model.PointerType(tp.item))) + elif isinstance(tp, model.StructOrUnion): + if tp.fldnames is None: + raise TypeError("'%s' is used as %s, but is opaque" % ( + tp._get_c_name(), context)) + return '_cffi_from_c_struct((char *)&%s, _cffi_type(%d))' % ( + var, self._gettypenum(tp)) + elif isinstance(tp, model.EnumType): + return '_cffi_from_c_deref((char *)&%s, _cffi_type(%d))' % ( + var, self._gettypenum(tp)) + else: + raise NotImplementedError(tp) + + # ---------- + # typedefs + + def _typedef_type(self, tp, name): + return self._global_type(tp, "(*(%s *)0)" % (name,)) + + def _generate_cpy_typedef_collecttype(self, tp, name): + self._do_collect_type(self._typedef_type(tp, name)) + + def _generate_cpy_typedef_decl(self, tp, name): + pass + + def _typedef_ctx(self, tp, name): + type_index = self._typesdict[tp] + self._lsts["typename"].append(TypenameExpr(name, type_index)) + + def _generate_cpy_typedef_ctx(self, tp, name): + tp = self._typedef_type(tp, name) + self._typedef_ctx(tp, name) + if getattr(tp, "origin", None) == "unknown_type": + self._struct_ctx(tp, tp.name, approxname=None) + elif isinstance(tp, model.NamedPointerType): + self._struct_ctx(tp.totype, tp.totype.name, approxname=tp.name, + named_ptr=tp) + + # ---------- + # function declarations + + def _generate_cpy_function_collecttype(self, tp, name): + self._do_collect_type(tp.as_raw_function()) + if tp.ellipsis and not self.target_is_python: + self._do_collect_type(tp) + + def _generate_cpy_function_decl(self, tp, name): + assert not self.target_is_python + assert isinstance(tp, model.FunctionPtrType) + if tp.ellipsis: + # cannot support vararg functions better than this: check for its + # exact type (including the fixed arguments), and build it as a + # constant function pointer (no CPython wrapper) + self._generate_cpy_constant_decl(tp, name) + return + prnt = self._prnt + numargs = len(tp.args) + if numargs == 0: + argname = 'noarg' + elif numargs == 1: + argname = 'arg0' + else: + argname = 'args' + # + # ------------------------------ + # the 'd' version of the function, only for addressof(lib, 'func') + arguments = [] + call_arguments = [] + context = 'argument of %s' % name + for i, type in enumerate(tp.args): + arguments.append(type.get_c_name(' x%d' % i, context)) + call_arguments.append('x%d' % i) + repr_arguments = ', '.join(arguments) + repr_arguments = repr_arguments or 'void' + if tp.abi: + abi = tp.abi + ' ' + else: + abi = '' + name_and_arguments = '%s_cffi_d_%s(%s)' % (abi, name, repr_arguments) + prnt('static %s' % (tp.result.get_c_name(name_and_arguments),)) + prnt('{') + call_arguments = ', '.join(call_arguments) + result_code = 'return ' + if isinstance(tp.result, model.VoidType): + result_code = '' + prnt(' %s%s(%s);' % (result_code, name, call_arguments)) + prnt('}') + # + prnt('#ifndef PYPY_VERSION') # ------------------------------ + # + prnt('static PyObject *') + prnt('_cffi_f_%s(PyObject *self, PyObject *%s)' % (name, argname)) + prnt('{') + # + context = 'argument of %s' % name + for i, type in enumerate(tp.args): + arg = type.get_c_name(' x%d' % i, context) + prnt(' %s;' % arg) + # + localvars = set() + freelines = set() + for type in tp.args: + self._extra_local_variables(type, localvars, freelines) + for decl in sorted(localvars): + prnt(' %s;' % (decl,)) + # + if not isinstance(tp.result, model.VoidType): + result_code = 'result = ' + context = 'result of %s' % name + result_decl = ' %s;' % tp.result.get_c_name(' result', context) + prnt(result_decl) + prnt(' PyObject *pyresult;') + else: + result_decl = None + result_code = '' + # + if len(tp.args) > 1: + rng = range(len(tp.args)) + for i in rng: + prnt(' PyObject *arg%d;' % i) + prnt() + prnt(' if (!PyArg_UnpackTuple(args, "%s", %d, %d, %s))' % ( + name, len(rng), len(rng), + ', '.join(['&arg%d' % i for i in rng]))) + prnt(' return NULL;') + prnt() + # + for i, type in enumerate(tp.args): + self._convert_funcarg_to_c(type, 'arg%d' % i, 'x%d' % i, + 'return NULL') + prnt() + # + prnt(' Py_BEGIN_ALLOW_THREADS') + prnt(' _cffi_restore_errno();') + call_arguments = ['x%d' % i for i in range(len(tp.args))] + call_arguments = ', '.join(call_arguments) + prnt(' { %s%s(%s); }' % (result_code, name, call_arguments)) + prnt(' _cffi_save_errno();') + prnt(' Py_END_ALLOW_THREADS') + prnt() + # + prnt(' (void)self; /* unused */') + if numargs == 0: + prnt(' (void)noarg; /* unused */') + if result_code: + prnt(' pyresult = %s;' % + self._convert_expr_from_c(tp.result, 'result', 'result type')) + for freeline in freelines: + prnt(' ' + freeline) + prnt(' return pyresult;') + else: + for freeline in freelines: + prnt(' ' + freeline) + prnt(' Py_INCREF(Py_None);') + prnt(' return Py_None;') + prnt('}') + # + prnt('#else') # ------------------------------ + # + # the PyPy version: need to replace struct/union arguments with + # pointers, and if the result is a struct/union, insert a first + # arg that is a pointer to the result. We also do that for + # complex args and return type. + def need_indirection(type): + return (isinstance(type, model.StructOrUnion) or + (isinstance(type, model.PrimitiveType) and + type.is_complex_type())) + difference = False + arguments = [] + call_arguments = [] + context = 'argument of %s' % name + for i, type in enumerate(tp.args): + indirection = '' + if need_indirection(type): + indirection = '*' + difference = True + arg = type.get_c_name(' %sx%d' % (indirection, i), context) + arguments.append(arg) + call_arguments.append('%sx%d' % (indirection, i)) + tp_result = tp.result + if need_indirection(tp_result): + context = 'result of %s' % name + arg = tp_result.get_c_name(' *result', context) + arguments.insert(0, arg) + tp_result = model.void_type + result_decl = None + result_code = '*result = ' + difference = True + if difference: + repr_arguments = ', '.join(arguments) + repr_arguments = repr_arguments or 'void' + name_and_arguments = '%s_cffi_f_%s(%s)' % (abi, name, + repr_arguments) + prnt('static %s' % (tp_result.get_c_name(name_and_arguments),)) + prnt('{') + if result_decl: + prnt(result_decl) + call_arguments = ', '.join(call_arguments) + prnt(' { %s%s(%s); }' % (result_code, name, call_arguments)) + if result_decl: + prnt(' return result;') + prnt('}') + else: + prnt('# define _cffi_f_%s _cffi_d_%s' % (name, name)) + # + prnt('#endif') # ------------------------------ + prnt() + + def _generate_cpy_function_ctx(self, tp, name): + if tp.ellipsis and not self.target_is_python: + self._generate_cpy_constant_ctx(tp, name) + return + type_index = self._typesdict[tp.as_raw_function()] + numargs = len(tp.args) + if self.target_is_python: + meth_kind = OP_DLOPEN_FUNC + elif numargs == 0: + meth_kind = OP_CPYTHON_BLTN_N # 'METH_NOARGS' + elif numargs == 1: + meth_kind = OP_CPYTHON_BLTN_O # 'METH_O' + else: + meth_kind = OP_CPYTHON_BLTN_V # 'METH_VARARGS' + self._lsts["global"].append( + GlobalExpr(name, '_cffi_f_%s' % name, + CffiOp(meth_kind, type_index), + size='_cffi_d_%s' % name)) + + # ---------- + # named structs or unions + + def _field_type(self, tp_struct, field_name, tp_field): + if isinstance(tp_field, model.ArrayType): + actual_length = tp_field.length + if actual_length == '...': + ptr_struct_name = tp_struct.get_c_name('*') + actual_length = '_cffi_array_len(((%s)0)->%s)' % ( + ptr_struct_name, field_name) + tp_item = self._field_type(tp_struct, '%s[0]' % field_name, + tp_field.item) + tp_field = model.ArrayType(tp_item, actual_length) + return tp_field + + def _struct_collecttype(self, tp): + self._do_collect_type(tp) + if self.target_is_python: + # also requires nested anon struct/unions in ABI mode, recursively + for fldtype in tp.anonymous_struct_fields(): + self._struct_collecttype(fldtype) + + def _struct_decl(self, tp, cname, approxname): + if tp.fldtypes is None: + return + prnt = self._prnt + checkfuncname = '_cffi_checkfld_%s' % (approxname,) + prnt('_CFFI_UNUSED_FN') + prnt('static void %s(%s *p)' % (checkfuncname, cname)) + prnt('{') + prnt(' /* only to generate compile-time warnings or errors */') + prnt(' (void)p;') + for fname, ftype, fbitsize, fqual in self._enum_fields(tp): + try: + if ftype.is_integer_type() or fbitsize >= 0: + # accept all integers, but complain on float or double + if fname != '': + prnt(" (void)((p->%s) | 0); /* check that '%s.%s' is " + "an integer */" % (fname, cname, fname)) + continue + # only accept exactly the type declared, except that '[]' + # is interpreted as a '*' and so will match any array length. + # (It would also match '*', but that's harder to detect...) + while (isinstance(ftype, model.ArrayType) + and (ftype.length is None or ftype.length == '...')): + ftype = ftype.item + fname = fname + '[0]' + prnt(' { %s = &p->%s; (void)tmp; }' % ( + ftype.get_c_name('*tmp', 'field %r'%fname, quals=fqual), + fname)) + except VerificationError as e: + prnt(' /* %s */' % str(e)) # cannot verify it, ignore + prnt('}') + prnt('struct _cffi_align_%s { char x; %s y; };' % (approxname, cname)) + prnt() + + def _struct_ctx(self, tp, cname, approxname, named_ptr=None): + type_index = self._typesdict[tp] + reason_for_not_expanding = None + flags = [] + if isinstance(tp, model.UnionType): + flags.append("_CFFI_F_UNION") + if tp.fldtypes is None: + flags.append("_CFFI_F_OPAQUE") + reason_for_not_expanding = "opaque" + if (tp not in self.ffi._parser._included_declarations and + (named_ptr is None or + named_ptr not in self.ffi._parser._included_declarations)): + if tp.fldtypes is None: + pass # opaque + elif tp.partial or any(tp.anonymous_struct_fields()): + pass # field layout obtained silently from the C compiler + else: + flags.append("_CFFI_F_CHECK_FIELDS") + if tp.packed: + if tp.packed > 1: + raise NotImplementedError( + "%r is declared with 'pack=%r'; only 0 or 1 are " + "supported in API mode (try to use \"...;\", which " + "does not require a 'pack' declaration)" % + (tp, tp.packed)) + flags.append("_CFFI_F_PACKED") + else: + flags.append("_CFFI_F_EXTERNAL") + reason_for_not_expanding = "external" + flags = '|'.join(flags) or '0' + c_fields = [] + if reason_for_not_expanding is None: + enumfields = list(self._enum_fields(tp)) + for fldname, fldtype, fbitsize, fqual in enumfields: + fldtype = self._field_type(tp, fldname, fldtype) + self._check_not_opaque(fldtype, + "field '%s.%s'" % (tp.name, fldname)) + # cname is None for _add_missing_struct_unions() only + op = OP_NOOP + if fbitsize >= 0: + op = OP_BITFIELD + size = '%d /* bits */' % fbitsize + elif cname is None or ( + isinstance(fldtype, model.ArrayType) and + fldtype.length is None): + size = '(size_t)-1' + else: + size = 'sizeof(((%s)0)->%s)' % ( + tp.get_c_name('*') if named_ptr is None + else named_ptr.name, + fldname) + if cname is None or fbitsize >= 0: + offset = '(size_t)-1' + elif named_ptr is not None: + offset = '(size_t)(((char *)&((%s)4096)->%s) - (char *)4096)' % ( + named_ptr.name, fldname) + else: + offset = 'offsetof(%s, %s)' % (tp.get_c_name(''), fldname) + c_fields.append( + FieldExpr(fldname, offset, size, fbitsize, + CffiOp(op, self._typesdict[fldtype]))) + first_field_index = len(self._lsts["field"]) + self._lsts["field"].extend(c_fields) + # + if cname is None: # unknown name, for _add_missing_struct_unions + size = '(size_t)-2' + align = -2 + comment = "unnamed" + else: + if named_ptr is not None: + size = 'sizeof(*(%s)0)' % (named_ptr.name,) + align = '-1 /* unknown alignment */' + else: + size = 'sizeof(%s)' % (cname,) + align = 'offsetof(struct _cffi_align_%s, y)' % (approxname,) + comment = None + else: + size = '(size_t)-1' + align = -1 + first_field_index = -1 + comment = reason_for_not_expanding + self._lsts["struct_union"].append( + StructUnionExpr(tp.name, type_index, flags, size, align, comment, + first_field_index, c_fields)) + self._seen_struct_unions.add(tp) + + def _check_not_opaque(self, tp, location): + while isinstance(tp, model.ArrayType): + tp = tp.item + if isinstance(tp, model.StructOrUnion) and tp.fldtypes is None: + raise TypeError( + "%s is of an opaque type (not declared in cdef())" % location) + + def _add_missing_struct_unions(self): + # not very nice, but some struct declarations might be missing + # because they don't have any known C name. Check that they are + # not partial (we can't complete or verify them!) and emit them + # anonymously. + lst = list(self._struct_unions.items()) + lst.sort(key=lambda tp_order: tp_order[1]) + for tp, order in lst: + if tp not in self._seen_struct_unions: + if tp.partial: + raise NotImplementedError("internal inconsistency: %r is " + "partial but was not seen at " + "this point" % (tp,)) + if tp.name.startswith('$') and tp.name[1:].isdigit(): + approxname = tp.name[1:] + elif tp.name == '_IO_FILE' and tp.forcename == 'FILE': + approxname = 'FILE' + self._typedef_ctx(tp, 'FILE') + else: + raise NotImplementedError("internal inconsistency: %r" % + (tp,)) + self._struct_ctx(tp, None, approxname) + + def _generate_cpy_struct_collecttype(self, tp, name): + self._struct_collecttype(tp) + _generate_cpy_union_collecttype = _generate_cpy_struct_collecttype + + def _struct_names(self, tp): + cname = tp.get_c_name('') + if ' ' in cname: + return cname, cname.replace(' ', '_') + else: + return cname, '_' + cname + + def _generate_cpy_struct_decl(self, tp, name): + self._struct_decl(tp, *self._struct_names(tp)) + _generate_cpy_union_decl = _generate_cpy_struct_decl + + def _generate_cpy_struct_ctx(self, tp, name): + self._struct_ctx(tp, *self._struct_names(tp)) + _generate_cpy_union_ctx = _generate_cpy_struct_ctx + + # ---------- + # 'anonymous' declarations. These are produced for anonymous structs + # or unions; the 'name' is obtained by a typedef. + + def _generate_cpy_anonymous_collecttype(self, tp, name): + if isinstance(tp, model.EnumType): + self._generate_cpy_enum_collecttype(tp, name) + else: + self._struct_collecttype(tp) + + def _generate_cpy_anonymous_decl(self, tp, name): + if isinstance(tp, model.EnumType): + self._generate_cpy_enum_decl(tp) + else: + self._struct_decl(tp, name, 'typedef_' + name) + + def _generate_cpy_anonymous_ctx(self, tp, name): + if isinstance(tp, model.EnumType): + self._enum_ctx(tp, name) + else: + self._struct_ctx(tp, name, 'typedef_' + name) + + # ---------- + # constants, declared with "static const ..." + + def _generate_cpy_const(self, is_int, name, tp=None, category='const', + check_value=None): + if (category, name) in self._seen_constants: + raise VerificationError( + "duplicate declaration of %s '%s'" % (category, name)) + self._seen_constants.add((category, name)) + # + prnt = self._prnt + funcname = '_cffi_%s_%s' % (category, name) + if is_int: + prnt('static int %s(unsigned long long *o)' % funcname) + prnt('{') + prnt(' int n = (%s) <= 0;' % (name,)) + prnt(' *o = (unsigned long long)((%s) | 0);' + ' /* check that %s is an integer */' % (name, name)) + if check_value is not None: + if check_value > 0: + check_value = '%dU' % (check_value,) + prnt(' if (!_cffi_check_int(*o, n, %s))' % (check_value,)) + prnt(' n |= 2;') + prnt(' return n;') + prnt('}') + else: + assert check_value is None + prnt('static void %s(char *o)' % funcname) + prnt('{') + prnt(' *(%s)o = %s;' % (tp.get_c_name('*'), name)) + prnt('}') + prnt() + + def _generate_cpy_constant_collecttype(self, tp, name): + is_int = tp.is_integer_type() + if not is_int or self.target_is_python: + self._do_collect_type(tp) + + def _generate_cpy_constant_decl(self, tp, name): + is_int = tp.is_integer_type() + self._generate_cpy_const(is_int, name, tp) + + def _generate_cpy_constant_ctx(self, tp, name): + if not self.target_is_python and tp.is_integer_type(): + type_op = CffiOp(OP_CONSTANT_INT, -1) + else: + if self.target_is_python: + const_kind = OP_DLOPEN_CONST + else: + const_kind = OP_CONSTANT + type_index = self._typesdict[tp] + type_op = CffiOp(const_kind, type_index) + self._lsts["global"].append( + GlobalExpr(name, '_cffi_const_%s' % name, type_op)) + + # ---------- + # enums + + def _generate_cpy_enum_collecttype(self, tp, name): + self._do_collect_type(tp) + + def _generate_cpy_enum_decl(self, tp, name=None): + for enumerator in tp.enumerators: + self._generate_cpy_const(True, enumerator) + + def _enum_ctx(self, tp, cname): + type_index = self._typesdict[tp] + type_op = CffiOp(OP_ENUM, -1) + if self.target_is_python: + tp.check_not_partial() + for enumerator, enumvalue in zip(tp.enumerators, tp.enumvalues): + self._lsts["global"].append( + GlobalExpr(enumerator, '_cffi_const_%s' % enumerator, type_op, + check_value=enumvalue)) + # + if cname is not None and '$' not in cname and not self.target_is_python: + size = "sizeof(%s)" % cname + signed = "((%s)-1) <= 0" % cname + else: + basetp = tp.build_baseinttype(self.ffi, []) + size = self.ffi.sizeof(basetp) + signed = int(int(self.ffi.cast(basetp, -1)) < 0) + allenums = ",".join(tp.enumerators) + self._lsts["enum"].append( + EnumExpr(tp.name, type_index, size, signed, allenums)) + + def _generate_cpy_enum_ctx(self, tp, name): + self._enum_ctx(tp, tp._get_c_name()) + + # ---------- + # macros: for now only for integers + + def _generate_cpy_macro_collecttype(self, tp, name): + pass + + def _generate_cpy_macro_decl(self, tp, name): + if tp == '...': + check_value = None + else: + check_value = tp # an integer + self._generate_cpy_const(True, name, check_value=check_value) + + def _generate_cpy_macro_ctx(self, tp, name): + if tp == '...': + if self.target_is_python: + raise VerificationError( + "cannot use the syntax '...' in '#define %s ...' when " + "using the ABI mode" % (name,)) + check_value = None + else: + check_value = tp # an integer + type_op = CffiOp(OP_CONSTANT_INT, -1) + self._lsts["global"].append( + GlobalExpr(name, '_cffi_const_%s' % name, type_op, + check_value=check_value)) + + # ---------- + # global variables + + def _global_type(self, tp, global_name): + if isinstance(tp, model.ArrayType): + actual_length = tp.length + if actual_length == '...': + actual_length = '_cffi_array_len(%s)' % (global_name,) + tp_item = self._global_type(tp.item, '%s[0]' % global_name) + tp = model.ArrayType(tp_item, actual_length) + return tp + + def _generate_cpy_variable_collecttype(self, tp, name): + self._do_collect_type(self._global_type(tp, name)) + + def _generate_cpy_variable_decl(self, tp, name): + prnt = self._prnt + tp = self._global_type(tp, name) + if isinstance(tp, model.ArrayType) and tp.length is None: + tp = tp.item + ampersand = '' + else: + ampersand = '&' + # This code assumes that casts from "tp *" to "void *" is a + # no-op, i.e. a function that returns a "tp *" can be called + # as if it returned a "void *". This should be generally true + # on any modern machine. The only exception to that rule (on + # uncommon architectures, and as far as I can tell) might be + # if 'tp' were a function type, but that is not possible here. + # (If 'tp' is a function _pointer_ type, then casts from "fn_t + # **" to "void *" are again no-ops, as far as I can tell.) + decl = '*_cffi_var_%s(void)' % (name,) + prnt('static ' + tp.get_c_name(decl, quals=self._current_quals)) + prnt('{') + prnt(' return %s(%s);' % (ampersand, name)) + prnt('}') + prnt() + + def _generate_cpy_variable_ctx(self, tp, name): + tp = self._global_type(tp, name) + type_index = self._typesdict[tp] + if self.target_is_python: + op = OP_GLOBAL_VAR + else: + op = OP_GLOBAL_VAR_F + self._lsts["global"].append( + GlobalExpr(name, '_cffi_var_%s' % name, CffiOp(op, type_index))) + + # ---------- + # extern "Python" + + def _generate_cpy_extern_python_collecttype(self, tp, name): + assert isinstance(tp, model.FunctionPtrType) + self._do_collect_type(tp) + _generate_cpy_dllexport_python_collecttype = \ + _generate_cpy_extern_python_plus_c_collecttype = \ + _generate_cpy_extern_python_collecttype + + def _extern_python_decl(self, tp, name, tag_and_space): + prnt = self._prnt + if isinstance(tp.result, model.VoidType): + size_of_result = '0' + else: + context = 'result of %s' % name + size_of_result = '(int)sizeof(%s)' % ( + tp.result.get_c_name('', context),) + prnt('static struct _cffi_externpy_s _cffi_externpy__%s =' % name) + prnt(' { "%s.%s", %s, 0, 0 };' % ( + self.module_name, name, size_of_result)) + prnt() + # + arguments = [] + context = 'argument of %s' % name + for i, type in enumerate(tp.args): + arg = type.get_c_name(' a%d' % i, context) + arguments.append(arg) + # + repr_arguments = ', '.join(arguments) + repr_arguments = repr_arguments or 'void' + name_and_arguments = '%s(%s)' % (name, repr_arguments) + if tp.abi == "__stdcall": + name_and_arguments = '_cffi_stdcall ' + name_and_arguments + # + def may_need_128_bits(tp): + return (isinstance(tp, model.PrimitiveType) and + tp.name == 'long double') + # + size_of_a = max(len(tp.args)*8, 8) + if may_need_128_bits(tp.result): + size_of_a = max(size_of_a, 16) + if isinstance(tp.result, model.StructOrUnion): + size_of_a = 'sizeof(%s) > %d ? sizeof(%s) : %d' % ( + tp.result.get_c_name(''), size_of_a, + tp.result.get_c_name(''), size_of_a) + prnt('%s%s' % (tag_and_space, tp.result.get_c_name(name_and_arguments))) + prnt('{') + prnt(' char a[%s];' % size_of_a) + prnt(' char *p = a;') + for i, type in enumerate(tp.args): + arg = 'a%d' % i + if (isinstance(type, model.StructOrUnion) or + may_need_128_bits(type)): + arg = '&' + arg + type = model.PointerType(type) + prnt(' *(%s)(p + %d) = %s;' % (type.get_c_name('*'), i*8, arg)) + prnt(' _cffi_call_python(&_cffi_externpy__%s, p);' % name) + if not isinstance(tp.result, model.VoidType): + prnt(' return *(%s)p;' % (tp.result.get_c_name('*'),)) + prnt('}') + prnt() + self._num_externpy += 1 + + def _generate_cpy_extern_python_decl(self, tp, name): + self._extern_python_decl(tp, name, 'static ') + + def _generate_cpy_dllexport_python_decl(self, tp, name): + self._extern_python_decl(tp, name, 'CFFI_DLLEXPORT ') + + def _generate_cpy_extern_python_plus_c_decl(self, tp, name): + self._extern_python_decl(tp, name, '') + + def _generate_cpy_extern_python_ctx(self, tp, name): + if self.target_is_python: + raise VerificationError( + "cannot use 'extern \"Python\"' in the ABI mode") + if tp.ellipsis: + raise NotImplementedError("a vararg function is extern \"Python\"") + type_index = self._typesdict[tp] + type_op = CffiOp(OP_EXTERN_PYTHON, type_index) + self._lsts["global"].append( + GlobalExpr(name, '&_cffi_externpy__%s' % name, type_op, name)) + + _generate_cpy_dllexport_python_ctx = \ + _generate_cpy_extern_python_plus_c_ctx = \ + _generate_cpy_extern_python_ctx + + def _print_string_literal_in_array(self, s): + prnt = self._prnt + prnt('// # NB. this is not a string because of a size limit in MSVC') + if not isinstance(s, bytes): # unicode + s = s.encode('utf-8') # -> bytes + else: + s.decode('utf-8') # got bytes, check for valid utf-8 + try: + s.decode('ascii') + except UnicodeDecodeError: + s = b'# -*- encoding: utf8 -*-\n' + s + for line in s.splitlines(True): + comment = line + if type('//') is bytes: # python2 + line = map(ord, line) # make a list of integers + else: # python3 + # type(line) is bytes, which enumerates like a list of integers + comment = ascii(comment)[1:-1] + prnt(('// ' + comment).rstrip()) + printed_line = '' + for c in line: + if len(printed_line) >= 76: + prnt(printed_line) + printed_line = '' + printed_line += '%d,' % (c,) + prnt(printed_line) + + # ---------- + # emitting the opcodes for individual types + + def _emit_bytecode_VoidType(self, tp, index): + self.cffi_types[index] = CffiOp(OP_PRIMITIVE, PRIM_VOID) + + def _emit_bytecode_PrimitiveType(self, tp, index): + prim_index = PRIMITIVE_TO_INDEX[tp.name] + self.cffi_types[index] = CffiOp(OP_PRIMITIVE, prim_index) + + def _emit_bytecode_UnknownIntegerType(self, tp, index): + s = ('_cffi_prim_int(sizeof(%s), (\n' + ' ((%s)-1) | 0 /* check that %s is an integer type */\n' + ' ) <= 0)' % (tp.name, tp.name, tp.name)) + self.cffi_types[index] = CffiOp(OP_PRIMITIVE, s) + + def _emit_bytecode_UnknownFloatType(self, tp, index): + s = ('_cffi_prim_float(sizeof(%s) *\n' + ' (((%s)1) / 2) * 2 /* integer => 0, float => 1 */\n' + ' )' % (tp.name, tp.name)) + self.cffi_types[index] = CffiOp(OP_PRIMITIVE, s) + + def _emit_bytecode_RawFunctionType(self, tp, index): + self.cffi_types[index] = CffiOp(OP_FUNCTION, self._typesdict[tp.result]) + index += 1 + for tp1 in tp.args: + realindex = self._typesdict[tp1] + if index != realindex: + if isinstance(tp1, model.PrimitiveType): + self._emit_bytecode_PrimitiveType(tp1, index) + else: + self.cffi_types[index] = CffiOp(OP_NOOP, realindex) + index += 1 + flags = int(tp.ellipsis) + if tp.abi is not None: + if tp.abi == '__stdcall': + flags |= 2 + else: + raise NotImplementedError("abi=%r" % (tp.abi,)) + self.cffi_types[index] = CffiOp(OP_FUNCTION_END, flags) + + def _emit_bytecode_PointerType(self, tp, index): + self.cffi_types[index] = CffiOp(OP_POINTER, self._typesdict[tp.totype]) + + _emit_bytecode_ConstPointerType = _emit_bytecode_PointerType + _emit_bytecode_NamedPointerType = _emit_bytecode_PointerType + + def _emit_bytecode_FunctionPtrType(self, tp, index): + raw = tp.as_raw_function() + self.cffi_types[index] = CffiOp(OP_POINTER, self._typesdict[raw]) + + def _emit_bytecode_ArrayType(self, tp, index): + item_index = self._typesdict[tp.item] + if tp.length is None: + self.cffi_types[index] = CffiOp(OP_OPEN_ARRAY, item_index) + elif tp.length == '...': + raise VerificationError( + "type %s badly placed: the '...' array length can only be " + "used on global arrays or on fields of structures" % ( + str(tp).replace('/*...*/', '...'),)) + else: + assert self.cffi_types[index + 1] == 'LEN' + self.cffi_types[index] = CffiOp(OP_ARRAY, item_index) + self.cffi_types[index + 1] = CffiOp(None, str(tp.length)) + + def _emit_bytecode_StructType(self, tp, index): + struct_index = self._struct_unions[tp] + self.cffi_types[index] = CffiOp(OP_STRUCT_UNION, struct_index) + _emit_bytecode_UnionType = _emit_bytecode_StructType + + def _emit_bytecode_EnumType(self, tp, index): + enum_index = self._enums[tp] + self.cffi_types[index] = CffiOp(OP_ENUM, enum_index) + + +if sys.version_info >= (3,): + NativeIO = io.StringIO +else: + class NativeIO(io.BytesIO): + def write(self, s): + if isinstance(s, unicode): + s = s.encode('ascii') + super(NativeIO, self).write(s) + +def _is_file_like(maybefile): + # compare to xml.etree.ElementTree._get_writer + return hasattr(maybefile, 'write') + +def _make_c_or_py_source(ffi, module_name, preamble, target_file, verbose): + if verbose: + print("generating %s" % (target_file,)) + recompiler = Recompiler(ffi, module_name, + target_is_python=(preamble is None)) + recompiler.collect_type_table() + recompiler.collect_step_tables() + if _is_file_like(target_file): + recompiler.write_source_to_f(target_file, preamble) + return True + f = NativeIO() + recompiler.write_source_to_f(f, preamble) + output = f.getvalue() + try: + with open(target_file, 'r') as f1: + if f1.read(len(output) + 1) != output: + raise IOError + if verbose: + print("(already up-to-date)") + return False # already up-to-date + except IOError: + tmp_file = '%s.~%d' % (target_file, os.getpid()) + with open(tmp_file, 'w') as f1: + f1.write(output) + try: + os.rename(tmp_file, target_file) + except OSError: + os.unlink(target_file) + os.rename(tmp_file, target_file) + return True + +def make_c_source(ffi, module_name, preamble, target_c_file, verbose=False): + assert preamble is not None + return _make_c_or_py_source(ffi, module_name, preamble, target_c_file, + verbose) + +def make_py_source(ffi, module_name, target_py_file, verbose=False): + return _make_c_or_py_source(ffi, module_name, None, target_py_file, + verbose) + +def _modname_to_file(outputdir, modname, extension): + parts = modname.split('.') + try: + os.makedirs(os.path.join(outputdir, *parts[:-1])) + except OSError: + pass + parts[-1] += extension + return os.path.join(outputdir, *parts), parts + + +# Aaargh. Distutils is not tested at all for the purpose of compiling +# DLLs that are not extension modules. Here are some hacks to work +# around that, in the _patch_for_*() functions... + +def _patch_meth(patchlist, cls, name, new_meth): + old = getattr(cls, name) + patchlist.append((cls, name, old)) + setattr(cls, name, new_meth) + return old + +def _unpatch_meths(patchlist): + for cls, name, old_meth in reversed(patchlist): + setattr(cls, name, old_meth) + +def _patch_for_embedding(patchlist): + if sys.platform == 'win32': + # we must not remove the manifest when building for embedding! + # FUTURE: this module was removed in setuptools 74; this is likely dead code and should be removed, + # since the toolchain it supports (VS2005-2008) is also long dead. + from cffi._shimmed_dist_utils import MSVCCompiler + if MSVCCompiler is not None: + _patch_meth(patchlist, MSVCCompiler, '_remove_visual_c_ref', + lambda self, manifest_file: manifest_file) + + if sys.platform == 'darwin': + # we must not make a '-bundle', but a '-dynamiclib' instead + from cffi._shimmed_dist_utils import CCompiler + def my_link_shared_object(self, *args, **kwds): + if '-bundle' in self.linker_so: + self.linker_so = list(self.linker_so) + i = self.linker_so.index('-bundle') + self.linker_so[i] = '-dynamiclib' + return old_link_shared_object(self, *args, **kwds) + old_link_shared_object = _patch_meth(patchlist, CCompiler, + 'link_shared_object', + my_link_shared_object) + +def _patch_for_target(patchlist, target): + from cffi._shimmed_dist_utils import build_ext + # if 'target' is different from '*', we need to patch some internal + # method to just return this 'target' value, instead of having it + # built from module_name + if target.endswith('.*'): + target = target[:-2] + if sys.platform == 'win32': + target += '.dll' + elif sys.platform == 'darwin': + target += '.dylib' + else: + target += '.so' + _patch_meth(patchlist, build_ext, 'get_ext_filename', + lambda self, ext_name: target) + + +def recompile(ffi, module_name, preamble, tmpdir='.', call_c_compiler=True, + c_file=None, source_extension='.c', extradir=None, + compiler_verbose=1, target=None, debug=None, + uses_ffiplatform=True, **kwds): + if not isinstance(module_name, str): + module_name = module_name.encode('ascii') + if ffi._windows_unicode: + ffi._apply_windows_unicode(kwds) + if preamble is not None: + if call_c_compiler and _is_file_like(c_file): + raise TypeError("Writing to file-like objects is not supported " + "with call_c_compiler=True") + embedding = (ffi._embedding is not None) + if embedding: + ffi._apply_embedding_fix(kwds) + if c_file is None: + c_file, parts = _modname_to_file(tmpdir, module_name, + source_extension) + if extradir: + parts = [extradir] + parts + ext_c_file = os.path.join(*parts) + else: + ext_c_file = c_file + # + if target is None: + if embedding: + target = '%s.*' % module_name + else: + target = '*' + # + if uses_ffiplatform: + ext = ffiplatform.get_extension(ext_c_file, module_name, **kwds) + else: + ext = None + updated = make_c_source(ffi, module_name, preamble, c_file, + verbose=compiler_verbose) + if call_c_compiler: + patchlist = [] + cwd = os.getcwd() + try: + if embedding: + _patch_for_embedding(patchlist) + if target != '*': + _patch_for_target(patchlist, target) + if compiler_verbose: + if tmpdir == '.': + msg = 'the current directory is' + else: + msg = 'setting the current directory to' + print('%s %r' % (msg, os.path.abspath(tmpdir))) + os.chdir(tmpdir) + outputfilename = ffiplatform.compile('.', ext, + compiler_verbose, debug) + finally: + os.chdir(cwd) + _unpatch_meths(patchlist) + return outputfilename + else: + return ext, updated + else: + if c_file is None: + c_file, _ = _modname_to_file(tmpdir, module_name, '.py') + updated = make_py_source(ffi, module_name, c_file, + verbose=compiler_verbose) + if call_c_compiler: + return c_file + else: + return None, updated + diff --git a/venv/lib/python3.11/site-packages/cffi/setuptools_ext.py b/venv/lib/python3.11/site-packages/cffi/setuptools_ext.py new file mode 100644 index 0000000..5cdd246 --- /dev/null +++ b/venv/lib/python3.11/site-packages/cffi/setuptools_ext.py @@ -0,0 +1,229 @@ +import os +import sys +import sysconfig + +try: + basestring +except NameError: + # Python 3.x + basestring = str + +def error(msg): + from cffi._shimmed_dist_utils import DistutilsSetupError + raise DistutilsSetupError(msg) + + +def execfile(filename, glob): + # We use execfile() (here rewritten for Python 3) instead of + # __import__() to load the build script. The problem with + # a normal import is that in some packages, the intermediate + # __init__.py files may already try to import the file that + # we are generating. + with open(filename) as f: + src = f.read() + src += '\n' # Python 2.6 compatibility + code = compile(src, filename, 'exec') + exec(code, glob, glob) + + +def add_cffi_module(dist, mod_spec): + from cffi.api import FFI + + if not isinstance(mod_spec, basestring): + error("argument to 'cffi_modules=...' must be a str or a list of str," + " not %r" % (type(mod_spec).__name__,)) + mod_spec = str(mod_spec) + try: + build_file_name, ffi_var_name = mod_spec.split(':') + except ValueError: + error("%r must be of the form 'path/build.py:ffi_variable'" % + (mod_spec,)) + if not os.path.exists(build_file_name): + ext = '' + rewritten = build_file_name.replace('.', '/') + '.py' + if os.path.exists(rewritten): + ext = ' (rewrite cffi_modules to [%r])' % ( + rewritten + ':' + ffi_var_name,) + error("%r does not name an existing file%s" % (build_file_name, ext)) + + mod_vars = {'__name__': '__cffi__', '__file__': build_file_name} + execfile(build_file_name, mod_vars) + + try: + ffi = mod_vars[ffi_var_name] + except KeyError: + error("%r: object %r not found in module" % (mod_spec, + ffi_var_name)) + if not isinstance(ffi, FFI): + ffi = ffi() # maybe it's a function instead of directly an ffi + if not isinstance(ffi, FFI): + error("%r is not an FFI instance (got %r)" % (mod_spec, + type(ffi).__name__)) + if not hasattr(ffi, '_assigned_source'): + error("%r: the set_source() method was not called" % (mod_spec,)) + module_name, source, source_extension, kwds = ffi._assigned_source + if ffi._windows_unicode: + kwds = kwds.copy() + ffi._apply_windows_unicode(kwds) + + if source is None: + _add_py_module(dist, ffi, module_name) + else: + _add_c_module(dist, ffi, module_name, source, source_extension, kwds) + +def _set_py_limited_api(Extension, kwds): + """ + Add py_limited_api to kwds if setuptools >= 26 is in use. + Do not alter the setting if it already exists. + Setuptools takes care of ignoring the flag on Python 2 and PyPy. + + CPython itself should ignore the flag in a debugging version + (by not listing .abi3.so in the extensions it supports), but + it doesn't so far, creating troubles. That's why we check + for "not hasattr(sys, 'gettotalrefcount')" (the 2.7 compatible equivalent + of 'd' not in sys.abiflags). (http://bugs.python.org/issue28401) + + On Windows, with CPython <= 3.4, it's better not to use py_limited_api + because virtualenv *still* doesn't copy PYTHON3.DLL on these versions. + Recently (2020) we started shipping only >= 3.5 wheels, though. So + we'll give it another try and set py_limited_api on Windows >= 3.5. + """ + from cffi._shimmed_dist_utils import log + from cffi import recompiler + + if ('py_limited_api' not in kwds and not hasattr(sys, 'gettotalrefcount') + and recompiler.USE_LIMITED_API): + import setuptools + try: + setuptools_major_version = int(setuptools.__version__.partition('.')[0]) + if setuptools_major_version >= 26: + kwds['py_limited_api'] = True + except ValueError: # certain development versions of setuptools + # If we don't know the version number of setuptools, we + # try to set 'py_limited_api' anyway. At worst, we get a + # warning. + kwds['py_limited_api'] = True + + if sysconfig.get_config_var("Py_GIL_DISABLED"): + if kwds.get('py_limited_api'): + log.info("Ignoring py_limited_api=True for free-threaded build.") + + kwds['py_limited_api'] = False + + if kwds.get('py_limited_api') is False: + # avoid setting Py_LIMITED_API if py_limited_api=False + # which _cffi_include.h does unless _CFFI_NO_LIMITED_API is defined + kwds.setdefault("define_macros", []).append(("_CFFI_NO_LIMITED_API", None)) + return kwds + +def _add_c_module(dist, ffi, module_name, source, source_extension, kwds): + # We are a setuptools extension. Need this build_ext for py_limited_api. + from setuptools.command.build_ext import build_ext + from cffi._shimmed_dist_utils import Extension, log, mkpath + from cffi import recompiler + + allsources = ['$PLACEHOLDER'] + allsources.extend(kwds.pop('sources', [])) + kwds = _set_py_limited_api(Extension, kwds) + ext = Extension(name=module_name, sources=allsources, **kwds) + + def make_mod(tmpdir, pre_run=None): + c_file = os.path.join(tmpdir, module_name + source_extension) + log.info("generating cffi module %r" % c_file) + mkpath(tmpdir) + # a setuptools-only, API-only hook: called with the "ext" and "ffi" + # arguments just before we turn the ffi into C code. To use it, + # subclass the 'distutils.command.build_ext.build_ext' class and + # add a method 'def pre_run(self, ext, ffi)'. + if pre_run is not None: + pre_run(ext, ffi) + updated = recompiler.make_c_source(ffi, module_name, source, c_file) + if not updated: + log.info("already up-to-date") + return c_file + + if dist.ext_modules is None: + dist.ext_modules = [] + dist.ext_modules.append(ext) + + base_class = dist.cmdclass.get('build_ext', build_ext) + class build_ext_make_mod(base_class): + def run(self): + if ext.sources[0] == '$PLACEHOLDER': + pre_run = getattr(self, 'pre_run', None) + ext.sources[0] = make_mod(self.build_temp, pre_run) + base_class.run(self) + dist.cmdclass['build_ext'] = build_ext_make_mod + # NB. multiple runs here will create multiple 'build_ext_make_mod' + # classes. Even in this case the 'build_ext' command should be + # run once; but just in case, the logic above does nothing if + # called again. + + +def _add_py_module(dist, ffi, module_name): + from setuptools.command.build_py import build_py + from setuptools.command.build_ext import build_ext + from cffi._shimmed_dist_utils import log, mkpath + from cffi import recompiler + + def generate_mod(py_file): + log.info("generating cffi module %r" % py_file) + mkpath(os.path.dirname(py_file)) + updated = recompiler.make_py_source(ffi, module_name, py_file) + if not updated: + log.info("already up-to-date") + + base_class = dist.cmdclass.get('build_py', build_py) + class build_py_make_mod(base_class): + def run(self): + base_class.run(self) + module_path = module_name.split('.') + module_path[-1] += '.py' + generate_mod(os.path.join(self.build_lib, *module_path)) + def get_source_files(self): + # This is called from 'setup.py sdist' only. Exclude + # the generate .py module in this case. + saved_py_modules = self.py_modules + try: + if saved_py_modules: + self.py_modules = [m for m in saved_py_modules + if m != module_name] + return base_class.get_source_files(self) + finally: + self.py_modules = saved_py_modules + dist.cmdclass['build_py'] = build_py_make_mod + + # distutils and setuptools have no notion I could find of a + # generated python module. If we don't add module_name to + # dist.py_modules, then things mostly work but there are some + # combination of options (--root and --record) that will miss + # the module. So we add it here, which gives a few apparently + # harmless warnings about not finding the file outside the + # build directory. + # Then we need to hack more in get_source_files(); see above. + if dist.py_modules is None: + dist.py_modules = [] + dist.py_modules.append(module_name) + + # the following is only for "build_ext -i" + base_class_2 = dist.cmdclass.get('build_ext', build_ext) + class build_ext_make_mod(base_class_2): + def run(self): + base_class_2.run(self) + if self.inplace: + # from get_ext_fullpath() in distutils/command/build_ext.py + module_path = module_name.split('.') + package = '.'.join(module_path[:-1]) + build_py = self.get_finalized_command('build_py') + package_dir = build_py.get_package_dir(package) + file_name = module_path[-1] + '.py' + generate_mod(os.path.join(package_dir, file_name)) + dist.cmdclass['build_ext'] = build_ext_make_mod + +def cffi_modules(dist, attr, value): + assert attr == 'cffi_modules' + if isinstance(value, basestring): + value = [value] + + for cffi_module in value: + add_cffi_module(dist, cffi_module) diff --git a/venv/lib/python3.11/site-packages/cffi/vengine_cpy.py b/venv/lib/python3.11/site-packages/cffi/vengine_cpy.py new file mode 100644 index 0000000..02e6a47 --- /dev/null +++ b/venv/lib/python3.11/site-packages/cffi/vengine_cpy.py @@ -0,0 +1,1087 @@ +# +# DEPRECATED: implementation for ffi.verify() +# +import sys +from . import model +from .error import VerificationError +from . import _imp_emulation as imp + + +class VCPythonEngine(object): + _class_key = 'x' + _gen_python_module = True + + def __init__(self, verifier): + self.verifier = verifier + self.ffi = verifier.ffi + self._struct_pending_verification = {} + self._types_of_builtin_functions = {} + + def patch_extension_kwds(self, kwds): + pass + + def find_module(self, module_name, path, so_suffixes): + try: + f, filename, descr = imp.find_module(module_name, path) + except ImportError: + return None + if f is not None: + f.close() + # Note that after a setuptools installation, there are both .py + # and .so files with the same basename. The code here relies on + # imp.find_module() locating the .so in priority. + if descr[0] not in so_suffixes: + return None + return filename + + def collect_types(self): + self._typesdict = {} + self._generate("collecttype") + + def _prnt(self, what=''): + self._f.write(what + '\n') + + def _gettypenum(self, type): + # a KeyError here is a bug. please report it! :-) + return self._typesdict[type] + + def _do_collect_type(self, tp): + if ((not isinstance(tp, model.PrimitiveType) + or tp.name == 'long double') + and tp not in self._typesdict): + num = len(self._typesdict) + self._typesdict[tp] = num + + def write_source_to_f(self): + self.collect_types() + # + # The new module will have a _cffi_setup() function that receives + # objects from the ffi world, and that calls some setup code in + # the module. This setup code is split in several independent + # functions, e.g. one per constant. The functions are "chained" + # by ending in a tail call to each other. + # + # This is further split in two chained lists, depending on if we + # can do it at import-time or if we must wait for _cffi_setup() to + # provide us with the objects. This is needed because we + # need the values of the enum constants in order to build the + # that we may have to pass to _cffi_setup(). + # + # The following two 'chained_list_constants' items contains + # the head of these two chained lists, as a string that gives the + # call to do, if any. + self._chained_list_constants = ['((void)lib,0)', '((void)lib,0)'] + # + prnt = self._prnt + # first paste some standard set of lines that are mostly '#define' + prnt(cffimod_header) + prnt() + # then paste the C source given by the user, verbatim. + prnt(self.verifier.preamble) + prnt() + # + # call generate_cpy_xxx_decl(), for every xxx found from + # ffi._parser._declarations. This generates all the functions. + self._generate("decl") + # + # implement the function _cffi_setup_custom() as calling the + # head of the chained list. + self._generate_setup_custom() + prnt() + # + # produce the method table, including the entries for the + # generated Python->C function wrappers, which are done + # by generate_cpy_function_method(). + prnt('static PyMethodDef _cffi_methods[] = {') + self._generate("method") + prnt(' {"_cffi_setup", _cffi_setup, METH_VARARGS, NULL},') + prnt(' {NULL, NULL, 0, NULL} /* Sentinel */') + prnt('};') + prnt() + # + # standard init. + modname = self.verifier.get_module_name() + constants = self._chained_list_constants[False] + prnt('#if PY_MAJOR_VERSION >= 3') + prnt() + prnt('static struct PyModuleDef _cffi_module_def = {') + prnt(' PyModuleDef_HEAD_INIT,') + prnt(' "%s",' % modname) + prnt(' NULL,') + prnt(' -1,') + prnt(' _cffi_methods,') + prnt(' NULL, NULL, NULL, NULL') + prnt('};') + prnt() + prnt('PyMODINIT_FUNC') + prnt('PyInit_%s(void)' % modname) + prnt('{') + prnt(' PyObject *lib;') + prnt(' lib = PyModule_Create(&_cffi_module_def);') + prnt(' if (lib == NULL)') + prnt(' return NULL;') + prnt(' if (%s < 0 || _cffi_init() < 0) {' % (constants,)) + prnt(' Py_DECREF(lib);') + prnt(' return NULL;') + prnt(' }') + prnt('#if Py_GIL_DISABLED') + prnt(' PyUnstable_Module_SetGIL(lib, Py_MOD_GIL_NOT_USED);') + prnt('#endif') + prnt(' return lib;') + prnt('}') + prnt() + prnt('#else') + prnt() + prnt('PyMODINIT_FUNC') + prnt('init%s(void)' % modname) + prnt('{') + prnt(' PyObject *lib;') + prnt(' lib = Py_InitModule("%s", _cffi_methods);' % modname) + prnt(' if (lib == NULL)') + prnt(' return;') + prnt(' if (%s < 0 || _cffi_init() < 0)' % (constants,)) + prnt(' return;') + prnt(' return;') + prnt('}') + prnt() + prnt('#endif') + + def load_library(self, flags=None): + # XXX review all usages of 'self' here! + # import it as a new extension module + imp.acquire_lock() + try: + if hasattr(sys, "getdlopenflags"): + previous_flags = sys.getdlopenflags() + try: + if hasattr(sys, "setdlopenflags") and flags is not None: + sys.setdlopenflags(flags) + module = imp.load_dynamic(self.verifier.get_module_name(), + self.verifier.modulefilename) + except ImportError as e: + error = "importing %r: %s" % (self.verifier.modulefilename, e) + raise VerificationError(error) + finally: + if hasattr(sys, "setdlopenflags"): + sys.setdlopenflags(previous_flags) + finally: + imp.release_lock() + # + # call loading_cpy_struct() to get the struct layout inferred by + # the C compiler + self._load(module, 'loading') + # + # the C code will need the objects. Collect them in + # order in a list. + revmapping = dict([(value, key) + for (key, value) in self._typesdict.items()]) + lst = [revmapping[i] for i in range(len(revmapping))] + lst = list(map(self.ffi._get_cached_btype, lst)) + # + # build the FFILibrary class and instance and call _cffi_setup(). + # this will set up some fields like '_cffi_types', and only then + # it will invoke the chained list of functions that will really + # build (notably) the constant objects, as if they are + # pointers, and store them as attributes on the 'library' object. + class FFILibrary(object): + _cffi_python_module = module + _cffi_ffi = self.ffi + _cffi_dir = [] + def __dir__(self): + return FFILibrary._cffi_dir + list(self.__dict__) + library = FFILibrary() + if module._cffi_setup(lst, VerificationError, library): + import warnings + warnings.warn("reimporting %r might overwrite older definitions" + % (self.verifier.get_module_name())) + # + # finally, call the loaded_cpy_xxx() functions. This will perform + # the final adjustments, like copying the Python->C wrapper + # functions from the module to the 'library' object, and setting + # up the FFILibrary class with properties for the global C variables. + self._load(module, 'loaded', library=library) + module._cffi_original_ffi = self.ffi + module._cffi_types_of_builtin_funcs = self._types_of_builtin_functions + return library + + def _get_declarations(self): + lst = [(key, tp) for (key, (tp, qual)) in + self.ffi._parser._declarations.items()] + lst.sort() + return lst + + def _generate(self, step_name): + for name, tp in self._get_declarations(): + kind, realname = name.split(' ', 1) + try: + method = getattr(self, '_generate_cpy_%s_%s' % (kind, + step_name)) + except AttributeError: + raise VerificationError( + "not implemented in verify(): %r" % name) + try: + method(tp, realname) + except Exception as e: + model.attach_exception_info(e, name) + raise + + def _load(self, module, step_name, **kwds): + for name, tp in self._get_declarations(): + kind, realname = name.split(' ', 1) + method = getattr(self, '_%s_cpy_%s' % (step_name, kind)) + try: + method(tp, realname, module, **kwds) + except Exception as e: + model.attach_exception_info(e, name) + raise + + def _generate_nothing(self, tp, name): + pass + + def _loaded_noop(self, tp, name, module, **kwds): + pass + + # ---------- + + def _convert_funcarg_to_c(self, tp, fromvar, tovar, errcode): + extraarg = '' + if isinstance(tp, model.PrimitiveType): + if tp.is_integer_type() and tp.name != '_Bool': + converter = '_cffi_to_c_int' + extraarg = ', %s' % tp.name + elif tp.is_complex_type(): + raise VerificationError( + "not implemented in verify(): complex types") + else: + converter = '(%s)_cffi_to_c_%s' % (tp.get_c_name(''), + tp.name.replace(' ', '_')) + errvalue = '-1' + # + elif isinstance(tp, model.PointerType): + self._convert_funcarg_to_c_ptr_or_array(tp, fromvar, + tovar, errcode) + return + # + elif isinstance(tp, (model.StructOrUnion, model.EnumType)): + # a struct (not a struct pointer) as a function argument + self._prnt(' if (_cffi_to_c((char *)&%s, _cffi_type(%d), %s) < 0)' + % (tovar, self._gettypenum(tp), fromvar)) + self._prnt(' %s;' % errcode) + return + # + elif isinstance(tp, model.FunctionPtrType): + converter = '(%s)_cffi_to_c_pointer' % tp.get_c_name('') + extraarg = ', _cffi_type(%d)' % self._gettypenum(tp) + errvalue = 'NULL' + # + else: + raise NotImplementedError(tp) + # + self._prnt(' %s = %s(%s%s);' % (tovar, converter, fromvar, extraarg)) + self._prnt(' if (%s == (%s)%s && PyErr_Occurred())' % ( + tovar, tp.get_c_name(''), errvalue)) + self._prnt(' %s;' % errcode) + + def _extra_local_variables(self, tp, localvars, freelines): + if isinstance(tp, model.PointerType): + localvars.add('Py_ssize_t datasize') + localvars.add('struct _cffi_freeme_s *large_args_free = NULL') + freelines.add('if (large_args_free != NULL)' + ' _cffi_free_array_arguments(large_args_free);') + + def _convert_funcarg_to_c_ptr_or_array(self, tp, fromvar, tovar, errcode): + self._prnt(' datasize = _cffi_prepare_pointer_call_argument(') + self._prnt(' _cffi_type(%d), %s, (char **)&%s);' % ( + self._gettypenum(tp), fromvar, tovar)) + self._prnt(' if (datasize != 0) {') + self._prnt(' %s = ((size_t)datasize) <= 640 ? ' + 'alloca((size_t)datasize) : NULL;' % (tovar,)) + self._prnt(' if (_cffi_convert_array_argument(_cffi_type(%d), %s, ' + '(char **)&%s,' % (self._gettypenum(tp), fromvar, tovar)) + self._prnt(' datasize, &large_args_free) < 0)') + self._prnt(' %s;' % errcode) + self._prnt(' }') + + def _convert_expr_from_c(self, tp, var, context): + if isinstance(tp, model.PrimitiveType): + if tp.is_integer_type() and tp.name != '_Bool': + return '_cffi_from_c_int(%s, %s)' % (var, tp.name) + elif tp.name != 'long double': + return '_cffi_from_c_%s(%s)' % (tp.name.replace(' ', '_'), var) + else: + return '_cffi_from_c_deref((char *)&%s, _cffi_type(%d))' % ( + var, self._gettypenum(tp)) + elif isinstance(tp, (model.PointerType, model.FunctionPtrType)): + return '_cffi_from_c_pointer((char *)%s, _cffi_type(%d))' % ( + var, self._gettypenum(tp)) + elif isinstance(tp, model.ArrayType): + return '_cffi_from_c_pointer((char *)%s, _cffi_type(%d))' % ( + var, self._gettypenum(model.PointerType(tp.item))) + elif isinstance(tp, model.StructOrUnion): + if tp.fldnames is None: + raise TypeError("'%s' is used as %s, but is opaque" % ( + tp._get_c_name(), context)) + return '_cffi_from_c_struct((char *)&%s, _cffi_type(%d))' % ( + var, self._gettypenum(tp)) + elif isinstance(tp, model.EnumType): + return '_cffi_from_c_deref((char *)&%s, _cffi_type(%d))' % ( + var, self._gettypenum(tp)) + else: + raise NotImplementedError(tp) + + # ---------- + # typedefs: generates no code so far + + _generate_cpy_typedef_collecttype = _generate_nothing + _generate_cpy_typedef_decl = _generate_nothing + _generate_cpy_typedef_method = _generate_nothing + _loading_cpy_typedef = _loaded_noop + _loaded_cpy_typedef = _loaded_noop + + # ---------- + # function declarations + + def _generate_cpy_function_collecttype(self, tp, name): + assert isinstance(tp, model.FunctionPtrType) + if tp.ellipsis: + self._do_collect_type(tp) + else: + # don't call _do_collect_type(tp) in this common case, + # otherwise test_autofilled_struct_as_argument fails + for type in tp.args: + self._do_collect_type(type) + self._do_collect_type(tp.result) + + def _generate_cpy_function_decl(self, tp, name): + assert isinstance(tp, model.FunctionPtrType) + if tp.ellipsis: + # cannot support vararg functions better than this: check for its + # exact type (including the fixed arguments), and build it as a + # constant function pointer (no CPython wrapper) + self._generate_cpy_const(False, name, tp) + return + prnt = self._prnt + numargs = len(tp.args) + if numargs == 0: + argname = 'noarg' + elif numargs == 1: + argname = 'arg0' + else: + argname = 'args' + prnt('static PyObject *') + prnt('_cffi_f_%s(PyObject *self, PyObject *%s)' % (name, argname)) + prnt('{') + # + context = 'argument of %s' % name + for i, type in enumerate(tp.args): + prnt(' %s;' % type.get_c_name(' x%d' % i, context)) + # + localvars = set() + freelines = set() + for type in tp.args: + self._extra_local_variables(type, localvars, freelines) + for decl in sorted(localvars): + prnt(' %s;' % (decl,)) + # + if not isinstance(tp.result, model.VoidType): + result_code = 'result = ' + context = 'result of %s' % name + prnt(' %s;' % tp.result.get_c_name(' result', context)) + prnt(' PyObject *pyresult;') + else: + result_code = '' + # + if len(tp.args) > 1: + rng = range(len(tp.args)) + for i in rng: + prnt(' PyObject *arg%d;' % i) + prnt() + prnt(' if (!PyArg_ParseTuple(args, "%s:%s", %s))' % ( + 'O' * numargs, name, ', '.join(['&arg%d' % i for i in rng]))) + prnt(' return NULL;') + prnt() + # + for i, type in enumerate(tp.args): + self._convert_funcarg_to_c(type, 'arg%d' % i, 'x%d' % i, + 'return NULL') + prnt() + # + prnt(' Py_BEGIN_ALLOW_THREADS') + prnt(' _cffi_restore_errno();') + prnt(' { %s%s(%s); }' % ( + result_code, name, + ', '.join(['x%d' % i for i in range(len(tp.args))]))) + prnt(' _cffi_save_errno();') + prnt(' Py_END_ALLOW_THREADS') + prnt() + # + prnt(' (void)self; /* unused */') + if numargs == 0: + prnt(' (void)noarg; /* unused */') + if result_code: + prnt(' pyresult = %s;' % + self._convert_expr_from_c(tp.result, 'result', 'result type')) + for freeline in freelines: + prnt(' ' + freeline) + prnt(' return pyresult;') + else: + for freeline in freelines: + prnt(' ' + freeline) + prnt(' Py_INCREF(Py_None);') + prnt(' return Py_None;') + prnt('}') + prnt() + + def _generate_cpy_function_method(self, tp, name): + if tp.ellipsis: + return + numargs = len(tp.args) + if numargs == 0: + meth = 'METH_NOARGS' + elif numargs == 1: + meth = 'METH_O' + else: + meth = 'METH_VARARGS' + self._prnt(' {"%s", _cffi_f_%s, %s, NULL},' % (name, name, meth)) + + _loading_cpy_function = _loaded_noop + + def _loaded_cpy_function(self, tp, name, module, library): + if tp.ellipsis: + return + func = getattr(module, name) + setattr(library, name, func) + self._types_of_builtin_functions[func] = tp + + # ---------- + # named structs + + _generate_cpy_struct_collecttype = _generate_nothing + def _generate_cpy_struct_decl(self, tp, name): + assert name == tp.name + self._generate_struct_or_union_decl(tp, 'struct', name) + def _generate_cpy_struct_method(self, tp, name): + self._generate_struct_or_union_method(tp, 'struct', name) + def _loading_cpy_struct(self, tp, name, module): + self._loading_struct_or_union(tp, 'struct', name, module) + def _loaded_cpy_struct(self, tp, name, module, **kwds): + self._loaded_struct_or_union(tp) + + _generate_cpy_union_collecttype = _generate_nothing + def _generate_cpy_union_decl(self, tp, name): + assert name == tp.name + self._generate_struct_or_union_decl(tp, 'union', name) + def _generate_cpy_union_method(self, tp, name): + self._generate_struct_or_union_method(tp, 'union', name) + def _loading_cpy_union(self, tp, name, module): + self._loading_struct_or_union(tp, 'union', name, module) + def _loaded_cpy_union(self, tp, name, module, **kwds): + self._loaded_struct_or_union(tp) + + def _generate_struct_or_union_decl(self, tp, prefix, name): + if tp.fldnames is None: + return # nothing to do with opaque structs + checkfuncname = '_cffi_check_%s_%s' % (prefix, name) + layoutfuncname = '_cffi_layout_%s_%s' % (prefix, name) + cname = ('%s %s' % (prefix, name)).strip() + # + prnt = self._prnt + prnt('static void %s(%s *p)' % (checkfuncname, cname)) + prnt('{') + prnt(' /* only to generate compile-time warnings or errors */') + prnt(' (void)p;') + for fname, ftype, fbitsize, fqual in tp.enumfields(): + if (isinstance(ftype, model.PrimitiveType) + and ftype.is_integer_type()) or fbitsize >= 0: + # accept all integers, but complain on float or double + prnt(' (void)((p->%s) << 1);' % fname) + else: + # only accept exactly the type declared. + try: + prnt(' { %s = &p->%s; (void)tmp; }' % ( + ftype.get_c_name('*tmp', 'field %r'%fname, quals=fqual), + fname)) + except VerificationError as e: + prnt(' /* %s */' % str(e)) # cannot verify it, ignore + prnt('}') + prnt('static PyObject *') + prnt('%s(PyObject *self, PyObject *noarg)' % (layoutfuncname,)) + prnt('{') + prnt(' struct _cffi_aligncheck { char x; %s y; };' % cname) + prnt(' static Py_ssize_t nums[] = {') + prnt(' sizeof(%s),' % cname) + prnt(' offsetof(struct _cffi_aligncheck, y),') + for fname, ftype, fbitsize, fqual in tp.enumfields(): + if fbitsize >= 0: + continue # xxx ignore fbitsize for now + prnt(' offsetof(%s, %s),' % (cname, fname)) + if isinstance(ftype, model.ArrayType) and ftype.length is None: + prnt(' 0, /* %s */' % ftype._get_c_name()) + else: + prnt(' sizeof(((%s *)0)->%s),' % (cname, fname)) + prnt(' -1') + prnt(' };') + prnt(' (void)self; /* unused */') + prnt(' (void)noarg; /* unused */') + prnt(' return _cffi_get_struct_layout(nums);') + prnt(' /* the next line is not executed, but compiled */') + prnt(' %s(0);' % (checkfuncname,)) + prnt('}') + prnt() + + def _generate_struct_or_union_method(self, tp, prefix, name): + if tp.fldnames is None: + return # nothing to do with opaque structs + layoutfuncname = '_cffi_layout_%s_%s' % (prefix, name) + self._prnt(' {"%s", %s, METH_NOARGS, NULL},' % (layoutfuncname, + layoutfuncname)) + + def _loading_struct_or_union(self, tp, prefix, name, module): + if tp.fldnames is None: + return # nothing to do with opaque structs + layoutfuncname = '_cffi_layout_%s_%s' % (prefix, name) + # + function = getattr(module, layoutfuncname) + layout = function() + if isinstance(tp, model.StructOrUnion) and tp.partial: + # use the function()'s sizes and offsets to guide the + # layout of the struct + totalsize = layout[0] + totalalignment = layout[1] + fieldofs = layout[2::2] + fieldsize = layout[3::2] + tp.force_flatten() + assert len(fieldofs) == len(fieldsize) == len(tp.fldnames) + tp.fixedlayout = fieldofs, fieldsize, totalsize, totalalignment + else: + cname = ('%s %s' % (prefix, name)).strip() + self._struct_pending_verification[tp] = layout, cname + + def _loaded_struct_or_union(self, tp): + if tp.fldnames is None: + return # nothing to do with opaque structs + self.ffi._get_cached_btype(tp) # force 'fixedlayout' to be considered + + if tp in self._struct_pending_verification: + # check that the layout sizes and offsets match the real ones + def check(realvalue, expectedvalue, msg): + if realvalue != expectedvalue: + raise VerificationError( + "%s (we have %d, but C compiler says %d)" + % (msg, expectedvalue, realvalue)) + ffi = self.ffi + BStruct = ffi._get_cached_btype(tp) + layout, cname = self._struct_pending_verification.pop(tp) + check(layout[0], ffi.sizeof(BStruct), "wrong total size") + check(layout[1], ffi.alignof(BStruct), "wrong total alignment") + i = 2 + for fname, ftype, fbitsize, fqual in tp.enumfields(): + if fbitsize >= 0: + continue # xxx ignore fbitsize for now + check(layout[i], ffi.offsetof(BStruct, fname), + "wrong offset for field %r" % (fname,)) + if layout[i+1] != 0: + BField = ffi._get_cached_btype(ftype) + check(layout[i+1], ffi.sizeof(BField), + "wrong size for field %r" % (fname,)) + i += 2 + assert i == len(layout) + + # ---------- + # 'anonymous' declarations. These are produced for anonymous structs + # or unions; the 'name' is obtained by a typedef. + + _generate_cpy_anonymous_collecttype = _generate_nothing + + def _generate_cpy_anonymous_decl(self, tp, name): + if isinstance(tp, model.EnumType): + self._generate_cpy_enum_decl(tp, name, '') + else: + self._generate_struct_or_union_decl(tp, '', name) + + def _generate_cpy_anonymous_method(self, tp, name): + if not isinstance(tp, model.EnumType): + self._generate_struct_or_union_method(tp, '', name) + + def _loading_cpy_anonymous(self, tp, name, module): + if isinstance(tp, model.EnumType): + self._loading_cpy_enum(tp, name, module) + else: + self._loading_struct_or_union(tp, '', name, module) + + def _loaded_cpy_anonymous(self, tp, name, module, **kwds): + if isinstance(tp, model.EnumType): + self._loaded_cpy_enum(tp, name, module, **kwds) + else: + self._loaded_struct_or_union(tp) + + # ---------- + # constants, likely declared with '#define' + + def _generate_cpy_const(self, is_int, name, tp=None, category='const', + vartp=None, delayed=True, size_too=False, + check_value=None): + prnt = self._prnt + funcname = '_cffi_%s_%s' % (category, name) + prnt('static int %s(PyObject *lib)' % funcname) + prnt('{') + prnt(' PyObject *o;') + prnt(' int res;') + if not is_int: + prnt(' %s;' % (vartp or tp).get_c_name(' i', name)) + else: + assert category == 'const' + # + if check_value is not None: + self._check_int_constant_value(name, check_value) + # + if not is_int: + if category == 'var': + realexpr = '&' + name + else: + realexpr = name + prnt(' i = (%s);' % (realexpr,)) + prnt(' o = %s;' % (self._convert_expr_from_c(tp, 'i', + 'variable type'),)) + assert delayed + else: + prnt(' o = _cffi_from_c_int_const(%s);' % name) + prnt(' if (o == NULL)') + prnt(' return -1;') + if size_too: + prnt(' {') + prnt(' PyObject *o1 = o;') + prnt(' o = Py_BuildValue("On", o1, (Py_ssize_t)sizeof(%s));' + % (name,)) + prnt(' Py_DECREF(o1);') + prnt(' if (o == NULL)') + prnt(' return -1;') + prnt(' }') + prnt(' res = PyObject_SetAttrString(lib, "%s", o);' % name) + prnt(' Py_DECREF(o);') + prnt(' if (res < 0)') + prnt(' return -1;') + prnt(' return %s;' % self._chained_list_constants[delayed]) + self._chained_list_constants[delayed] = funcname + '(lib)' + prnt('}') + prnt() + + def _generate_cpy_constant_collecttype(self, tp, name): + is_int = isinstance(tp, model.PrimitiveType) and tp.is_integer_type() + if not is_int: + self._do_collect_type(tp) + + def _generate_cpy_constant_decl(self, tp, name): + is_int = isinstance(tp, model.PrimitiveType) and tp.is_integer_type() + self._generate_cpy_const(is_int, name, tp) + + _generate_cpy_constant_method = _generate_nothing + _loading_cpy_constant = _loaded_noop + _loaded_cpy_constant = _loaded_noop + + # ---------- + # enums + + def _check_int_constant_value(self, name, value, err_prefix=''): + prnt = self._prnt + if value <= 0: + prnt(' if ((%s) > 0 || (long)(%s) != %dL) {' % ( + name, name, value)) + else: + prnt(' if ((%s) <= 0 || (unsigned long)(%s) != %dUL) {' % ( + name, name, value)) + prnt(' char buf[64];') + prnt(' if ((%s) <= 0)' % name) + prnt(' snprintf(buf, 63, "%%ld", (long)(%s));' % name) + prnt(' else') + prnt(' snprintf(buf, 63, "%%lu", (unsigned long)(%s));' % + name) + prnt(' PyErr_Format(_cffi_VerificationError,') + prnt(' "%s%s has the real value %s, not %s",') + prnt(' "%s", "%s", buf, "%d");' % ( + err_prefix, name, value)) + prnt(' return -1;') + prnt(' }') + + def _enum_funcname(self, prefix, name): + # "$enum_$1" => "___D_enum____D_1" + name = name.replace('$', '___D_') + return '_cffi_e_%s_%s' % (prefix, name) + + def _generate_cpy_enum_decl(self, tp, name, prefix='enum'): + if tp.partial: + for enumerator in tp.enumerators: + self._generate_cpy_const(True, enumerator, delayed=False) + return + # + funcname = self._enum_funcname(prefix, name) + prnt = self._prnt + prnt('static int %s(PyObject *lib)' % funcname) + prnt('{') + for enumerator, enumvalue in zip(tp.enumerators, tp.enumvalues): + self._check_int_constant_value(enumerator, enumvalue, + "enum %s: " % name) + prnt(' return %s;' % self._chained_list_constants[True]) + self._chained_list_constants[True] = funcname + '(lib)' + prnt('}') + prnt() + + _generate_cpy_enum_collecttype = _generate_nothing + _generate_cpy_enum_method = _generate_nothing + + def _loading_cpy_enum(self, tp, name, module): + if tp.partial: + enumvalues = [getattr(module, enumerator) + for enumerator in tp.enumerators] + tp.enumvalues = tuple(enumvalues) + tp.partial_resolved = True + + def _loaded_cpy_enum(self, tp, name, module, library): + for enumerator, enumvalue in zip(tp.enumerators, tp.enumvalues): + setattr(library, enumerator, enumvalue) + + # ---------- + # macros: for now only for integers + + def _generate_cpy_macro_decl(self, tp, name): + if tp == '...': + check_value = None + else: + check_value = tp # an integer + self._generate_cpy_const(True, name, check_value=check_value) + + _generate_cpy_macro_collecttype = _generate_nothing + _generate_cpy_macro_method = _generate_nothing + _loading_cpy_macro = _loaded_noop + _loaded_cpy_macro = _loaded_noop + + # ---------- + # global variables + + def _generate_cpy_variable_collecttype(self, tp, name): + if isinstance(tp, model.ArrayType): + tp_ptr = model.PointerType(tp.item) + else: + tp_ptr = model.PointerType(tp) + self._do_collect_type(tp_ptr) + + def _generate_cpy_variable_decl(self, tp, name): + if isinstance(tp, model.ArrayType): + tp_ptr = model.PointerType(tp.item) + self._generate_cpy_const(False, name, tp, vartp=tp_ptr, + size_too = tp.length_is_unknown()) + else: + tp_ptr = model.PointerType(tp) + self._generate_cpy_const(False, name, tp_ptr, category='var') + + _generate_cpy_variable_method = _generate_nothing + _loading_cpy_variable = _loaded_noop + + def _loaded_cpy_variable(self, tp, name, module, library): + value = getattr(library, name) + if isinstance(tp, model.ArrayType): # int a[5] is "constant" in the + # sense that "a=..." is forbidden + if tp.length_is_unknown(): + assert isinstance(value, tuple) + (value, size) = value + BItemType = self.ffi._get_cached_btype(tp.item) + length, rest = divmod(size, self.ffi.sizeof(BItemType)) + if rest != 0: + raise VerificationError( + "bad size: %r does not seem to be an array of %s" % + (name, tp.item)) + tp = tp.resolve_length(length) + # 'value' is a which we have to replace with + # a if the N is actually known + if tp.length is not None: + BArray = self.ffi._get_cached_btype(tp) + value = self.ffi.cast(BArray, value) + setattr(library, name, value) + return + # remove ptr= from the library instance, and replace + # it by a property on the class, which reads/writes into ptr[0]. + ptr = value + delattr(library, name) + def getter(library): + return ptr[0] + def setter(library, value): + ptr[0] = value + setattr(type(library), name, property(getter, setter)) + type(library)._cffi_dir.append(name) + + # ---------- + + def _generate_setup_custom(self): + prnt = self._prnt + prnt('static int _cffi_setup_custom(PyObject *lib)') + prnt('{') + prnt(' return %s;' % self._chained_list_constants[True]) + prnt('}') + +cffimod_header = r''' +#include +#include + +/* this block of #ifs should be kept exactly identical between + c/_cffi_backend.c, cffi/vengine_cpy.py, cffi/vengine_gen.py + and cffi/_cffi_include.h */ +#if defined(_MSC_VER) +# include /* for alloca() */ +# if _MSC_VER < 1600 /* MSVC < 2010 */ + typedef __int8 int8_t; + typedef __int16 int16_t; + typedef __int32 int32_t; + typedef __int64 int64_t; + typedef unsigned __int8 uint8_t; + typedef unsigned __int16 uint16_t; + typedef unsigned __int32 uint32_t; + typedef unsigned __int64 uint64_t; + typedef __int8 int_least8_t; + typedef __int16 int_least16_t; + typedef __int32 int_least32_t; + typedef __int64 int_least64_t; + typedef unsigned __int8 uint_least8_t; + typedef unsigned __int16 uint_least16_t; + typedef unsigned __int32 uint_least32_t; + typedef unsigned __int64 uint_least64_t; + typedef __int8 int_fast8_t; + typedef __int16 int_fast16_t; + typedef __int32 int_fast32_t; + typedef __int64 int_fast64_t; + typedef unsigned __int8 uint_fast8_t; + typedef unsigned __int16 uint_fast16_t; + typedef unsigned __int32 uint_fast32_t; + typedef unsigned __int64 uint_fast64_t; + typedef __int64 intmax_t; + typedef unsigned __int64 uintmax_t; +# else +# include +# endif +# if _MSC_VER < 1800 /* MSVC < 2013 */ +# ifndef __cplusplus + typedef unsigned char _Bool; +# endif +# endif +# define _cffi_float_complex_t _Fcomplex /* include for it */ +# define _cffi_double_complex_t _Dcomplex /* include for it */ +#else +# include +# if (defined (__SVR4) && defined (__sun)) || defined(_AIX) || defined(__hpux) +# include +# endif +# define _cffi_float_complex_t float _Complex +# define _cffi_double_complex_t double _Complex +#endif + +#if PY_MAJOR_VERSION < 3 +# undef PyCapsule_CheckExact +# undef PyCapsule_GetPointer +# define PyCapsule_CheckExact(capsule) (PyCObject_Check(capsule)) +# define PyCapsule_GetPointer(capsule, name) \ + (PyCObject_AsVoidPtr(capsule)) +#endif + +#if PY_MAJOR_VERSION >= 3 +# define PyInt_FromLong PyLong_FromLong +#endif + +#define _cffi_from_c_double PyFloat_FromDouble +#define _cffi_from_c_float PyFloat_FromDouble +#define _cffi_from_c_long PyInt_FromLong +#define _cffi_from_c_ulong PyLong_FromUnsignedLong +#define _cffi_from_c_longlong PyLong_FromLongLong +#define _cffi_from_c_ulonglong PyLong_FromUnsignedLongLong +#define _cffi_from_c__Bool PyBool_FromLong + +#define _cffi_to_c_double PyFloat_AsDouble +#define _cffi_to_c_float PyFloat_AsDouble + +#define _cffi_from_c_int_const(x) \ + (((x) > 0) ? \ + ((unsigned long long)(x) <= (unsigned long long)LONG_MAX) ? \ + PyInt_FromLong((long)(x)) : \ + PyLong_FromUnsignedLongLong((unsigned long long)(x)) : \ + ((long long)(x) >= (long long)LONG_MIN) ? \ + PyInt_FromLong((long)(x)) : \ + PyLong_FromLongLong((long long)(x))) + +#define _cffi_from_c_int(x, type) \ + (((type)-1) > 0 ? /* unsigned */ \ + (sizeof(type) < sizeof(long) ? \ + PyInt_FromLong((long)x) : \ + sizeof(type) == sizeof(long) ? \ + PyLong_FromUnsignedLong((unsigned long)x) : \ + PyLong_FromUnsignedLongLong((unsigned long long)x)) : \ + (sizeof(type) <= sizeof(long) ? \ + PyInt_FromLong((long)x) : \ + PyLong_FromLongLong((long long)x))) + +#define _cffi_to_c_int(o, type) \ + ((type)( \ + sizeof(type) == 1 ? (((type)-1) > 0 ? (type)_cffi_to_c_u8(o) \ + : (type)_cffi_to_c_i8(o)) : \ + sizeof(type) == 2 ? (((type)-1) > 0 ? (type)_cffi_to_c_u16(o) \ + : (type)_cffi_to_c_i16(o)) : \ + sizeof(type) == 4 ? (((type)-1) > 0 ? (type)_cffi_to_c_u32(o) \ + : (type)_cffi_to_c_i32(o)) : \ + sizeof(type) == 8 ? (((type)-1) > 0 ? (type)_cffi_to_c_u64(o) \ + : (type)_cffi_to_c_i64(o)) : \ + (Py_FatalError("unsupported size for type " #type), (type)0))) + +#define _cffi_to_c_i8 \ + ((int(*)(PyObject *))_cffi_exports[1]) +#define _cffi_to_c_u8 \ + ((int(*)(PyObject *))_cffi_exports[2]) +#define _cffi_to_c_i16 \ + ((int(*)(PyObject *))_cffi_exports[3]) +#define _cffi_to_c_u16 \ + ((int(*)(PyObject *))_cffi_exports[4]) +#define _cffi_to_c_i32 \ + ((int(*)(PyObject *))_cffi_exports[5]) +#define _cffi_to_c_u32 \ + ((unsigned int(*)(PyObject *))_cffi_exports[6]) +#define _cffi_to_c_i64 \ + ((long long(*)(PyObject *))_cffi_exports[7]) +#define _cffi_to_c_u64 \ + ((unsigned long long(*)(PyObject *))_cffi_exports[8]) +#define _cffi_to_c_char \ + ((int(*)(PyObject *))_cffi_exports[9]) +#define _cffi_from_c_pointer \ + ((PyObject *(*)(char *, CTypeDescrObject *))_cffi_exports[10]) +#define _cffi_to_c_pointer \ + ((char *(*)(PyObject *, CTypeDescrObject *))_cffi_exports[11]) +#define _cffi_get_struct_layout \ + ((PyObject *(*)(Py_ssize_t[]))_cffi_exports[12]) +#define _cffi_restore_errno \ + ((void(*)(void))_cffi_exports[13]) +#define _cffi_save_errno \ + ((void(*)(void))_cffi_exports[14]) +#define _cffi_from_c_char \ + ((PyObject *(*)(char))_cffi_exports[15]) +#define _cffi_from_c_deref \ + ((PyObject *(*)(char *, CTypeDescrObject *))_cffi_exports[16]) +#define _cffi_to_c \ + ((int(*)(char *, CTypeDescrObject *, PyObject *))_cffi_exports[17]) +#define _cffi_from_c_struct \ + ((PyObject *(*)(char *, CTypeDescrObject *))_cffi_exports[18]) +#define _cffi_to_c_wchar_t \ + ((wchar_t(*)(PyObject *))_cffi_exports[19]) +#define _cffi_from_c_wchar_t \ + ((PyObject *(*)(wchar_t))_cffi_exports[20]) +#define _cffi_to_c_long_double \ + ((long double(*)(PyObject *))_cffi_exports[21]) +#define _cffi_to_c__Bool \ + ((_Bool(*)(PyObject *))_cffi_exports[22]) +#define _cffi_prepare_pointer_call_argument \ + ((Py_ssize_t(*)(CTypeDescrObject *, PyObject *, char **))_cffi_exports[23]) +#define _cffi_convert_array_from_object \ + ((int(*)(char *, CTypeDescrObject *, PyObject *))_cffi_exports[24]) +#define _CFFI_NUM_EXPORTS 25 + +typedef struct _ctypedescr CTypeDescrObject; + +static void *_cffi_exports[_CFFI_NUM_EXPORTS]; +static PyObject *_cffi_types, *_cffi_VerificationError; + +static int _cffi_setup_custom(PyObject *lib); /* forward */ + +static PyObject *_cffi_setup(PyObject *self, PyObject *args) +{ + PyObject *library; + int was_alive = (_cffi_types != NULL); + (void)self; /* unused */ + if (!PyArg_ParseTuple(args, "OOO", &_cffi_types, &_cffi_VerificationError, + &library)) + return NULL; + Py_INCREF(_cffi_types); + Py_INCREF(_cffi_VerificationError); + if (_cffi_setup_custom(library) < 0) + return NULL; + return PyBool_FromLong(was_alive); +} + +union _cffi_union_alignment_u { + unsigned char m_char; + unsigned short m_short; + unsigned int m_int; + unsigned long m_long; + unsigned long long m_longlong; + float m_float; + double m_double; + long double m_longdouble; +}; + +struct _cffi_freeme_s { + struct _cffi_freeme_s *next; + union _cffi_union_alignment_u alignment; +}; + +#ifdef __GNUC__ + __attribute__((unused)) +#endif +static int _cffi_convert_array_argument(CTypeDescrObject *ctptr, PyObject *arg, + char **output_data, Py_ssize_t datasize, + struct _cffi_freeme_s **freeme) +{ + char *p; + if (datasize < 0) + return -1; + + p = *output_data; + if (p == NULL) { + struct _cffi_freeme_s *fp = (struct _cffi_freeme_s *)PyObject_Malloc( + offsetof(struct _cffi_freeme_s, alignment) + (size_t)datasize); + if (fp == NULL) + return -1; + fp->next = *freeme; + *freeme = fp; + p = *output_data = (char *)&fp->alignment; + } + memset((void *)p, 0, (size_t)datasize); + return _cffi_convert_array_from_object(p, ctptr, arg); +} + +#ifdef __GNUC__ + __attribute__((unused)) +#endif +static void _cffi_free_array_arguments(struct _cffi_freeme_s *freeme) +{ + do { + void *p = (void *)freeme; + freeme = freeme->next; + PyObject_Free(p); + } while (freeme != NULL); +} + +static int _cffi_init(void) +{ + PyObject *module, *c_api_object = NULL; + + module = PyImport_ImportModule("_cffi_backend"); + if (module == NULL) + goto failure; + + c_api_object = PyObject_GetAttrString(module, "_C_API"); + if (c_api_object == NULL) + goto failure; + if (!PyCapsule_CheckExact(c_api_object)) { + PyErr_SetNone(PyExc_ImportError); + goto failure; + } + memcpy(_cffi_exports, PyCapsule_GetPointer(c_api_object, "cffi"), + _CFFI_NUM_EXPORTS * sizeof(void *)); + + Py_DECREF(module); + Py_DECREF(c_api_object); + return 0; + + failure: + Py_XDECREF(module); + Py_XDECREF(c_api_object); + return -1; +} + +#define _cffi_type(num) ((CTypeDescrObject *)PyList_GET_ITEM(_cffi_types, num)) + +/**********/ +''' diff --git a/venv/lib/python3.11/site-packages/cffi/vengine_gen.py b/venv/lib/python3.11/site-packages/cffi/vengine_gen.py new file mode 100644 index 0000000..bffc821 --- /dev/null +++ b/venv/lib/python3.11/site-packages/cffi/vengine_gen.py @@ -0,0 +1,679 @@ +# +# DEPRECATED: implementation for ffi.verify() +# +import sys, os +import types + +from . import model +from .error import VerificationError + + +class VGenericEngine(object): + _class_key = 'g' + _gen_python_module = False + + def __init__(self, verifier): + self.verifier = verifier + self.ffi = verifier.ffi + self.export_symbols = [] + self._struct_pending_verification = {} + + def patch_extension_kwds(self, kwds): + # add 'export_symbols' to the dictionary. Note that we add the + # list before filling it. When we fill it, it will thus also show + # up in kwds['export_symbols']. + kwds.setdefault('export_symbols', self.export_symbols) + + def find_module(self, module_name, path, so_suffixes): + for so_suffix in so_suffixes: + basename = module_name + so_suffix + if path is None: + path = sys.path + for dirname in path: + filename = os.path.join(dirname, basename) + if os.path.isfile(filename): + return filename + + def collect_types(self): + pass # not needed in the generic engine + + def _prnt(self, what=''): + self._f.write(what + '\n') + + def write_source_to_f(self): + prnt = self._prnt + # first paste some standard set of lines that are mostly '#include' + prnt(cffimod_header) + # then paste the C source given by the user, verbatim. + prnt(self.verifier.preamble) + # + # call generate_gen_xxx_decl(), for every xxx found from + # ffi._parser._declarations. This generates all the functions. + self._generate('decl') + # + # on Windows, distutils insists on putting init_cffi_xyz in + # 'export_symbols', so instead of fighting it, just give up and + # give it one + if sys.platform == 'win32': + if sys.version_info >= (3,): + prefix = 'PyInit_' + else: + prefix = 'init' + modname = self.verifier.get_module_name() + prnt("void %s%s(void) { }\n" % (prefix, modname)) + + def load_library(self, flags=0): + # import it with the CFFI backend + backend = self.ffi._backend + # needs to make a path that contains '/', on Posix + filename = os.path.join(os.curdir, self.verifier.modulefilename) + module = backend.load_library(filename, flags) + # + # call loading_gen_struct() to get the struct layout inferred by + # the C compiler + self._load(module, 'loading') + + # build the FFILibrary class and instance, this is a module subclass + # because modules are expected to have usually-constant-attributes and + # in PyPy this means the JIT is able to treat attributes as constant, + # which we want. + class FFILibrary(types.ModuleType): + _cffi_generic_module = module + _cffi_ffi = self.ffi + _cffi_dir = [] + def __dir__(self): + return FFILibrary._cffi_dir + library = FFILibrary("") + # + # finally, call the loaded_gen_xxx() functions. This will set + # up the 'library' object. + self._load(module, 'loaded', library=library) + return library + + def _get_declarations(self): + lst = [(key, tp) for (key, (tp, qual)) in + self.ffi._parser._declarations.items()] + lst.sort() + return lst + + def _generate(self, step_name): + for name, tp in self._get_declarations(): + kind, realname = name.split(' ', 1) + try: + method = getattr(self, '_generate_gen_%s_%s' % (kind, + step_name)) + except AttributeError: + raise VerificationError( + "not implemented in verify(): %r" % name) + try: + method(tp, realname) + except Exception as e: + model.attach_exception_info(e, name) + raise + + def _load(self, module, step_name, **kwds): + for name, tp in self._get_declarations(): + kind, realname = name.split(' ', 1) + method = getattr(self, '_%s_gen_%s' % (step_name, kind)) + try: + method(tp, realname, module, **kwds) + except Exception as e: + model.attach_exception_info(e, name) + raise + + def _generate_nothing(self, tp, name): + pass + + def _loaded_noop(self, tp, name, module, **kwds): + pass + + # ---------- + # typedefs: generates no code so far + + _generate_gen_typedef_decl = _generate_nothing + _loading_gen_typedef = _loaded_noop + _loaded_gen_typedef = _loaded_noop + + # ---------- + # function declarations + + def _generate_gen_function_decl(self, tp, name): + assert isinstance(tp, model.FunctionPtrType) + if tp.ellipsis: + # cannot support vararg functions better than this: check for its + # exact type (including the fixed arguments), and build it as a + # constant function pointer (no _cffi_f_%s wrapper) + self._generate_gen_const(False, name, tp) + return + prnt = self._prnt + numargs = len(tp.args) + argnames = [] + for i, type in enumerate(tp.args): + indirection = '' + if isinstance(type, model.StructOrUnion): + indirection = '*' + argnames.append('%sx%d' % (indirection, i)) + context = 'argument of %s' % name + arglist = [type.get_c_name(' %s' % arg, context) + for type, arg in zip(tp.args, argnames)] + tpresult = tp.result + if isinstance(tpresult, model.StructOrUnion): + arglist.insert(0, tpresult.get_c_name(' *r', context)) + tpresult = model.void_type + arglist = ', '.join(arglist) or 'void' + wrappername = '_cffi_f_%s' % name + self.export_symbols.append(wrappername) + if tp.abi: + abi = tp.abi + ' ' + else: + abi = '' + funcdecl = ' %s%s(%s)' % (abi, wrappername, arglist) + context = 'result of %s' % name + prnt(tpresult.get_c_name(funcdecl, context)) + prnt('{') + # + if isinstance(tp.result, model.StructOrUnion): + result_code = '*r = ' + elif not isinstance(tp.result, model.VoidType): + result_code = 'return ' + else: + result_code = '' + prnt(' %s%s(%s);' % (result_code, name, ', '.join(argnames))) + prnt('}') + prnt() + + _loading_gen_function = _loaded_noop + + def _loaded_gen_function(self, tp, name, module, library): + assert isinstance(tp, model.FunctionPtrType) + if tp.ellipsis: + newfunction = self._load_constant(False, tp, name, module) + else: + indirections = [] + base_tp = tp + if (any(isinstance(typ, model.StructOrUnion) for typ in tp.args) + or isinstance(tp.result, model.StructOrUnion)): + indirect_args = [] + for i, typ in enumerate(tp.args): + if isinstance(typ, model.StructOrUnion): + typ = model.PointerType(typ) + indirections.append((i, typ)) + indirect_args.append(typ) + indirect_result = tp.result + if isinstance(indirect_result, model.StructOrUnion): + if indirect_result.fldtypes is None: + raise TypeError("'%s' is used as result type, " + "but is opaque" % ( + indirect_result._get_c_name(),)) + indirect_result = model.PointerType(indirect_result) + indirect_args.insert(0, indirect_result) + indirections.insert(0, ("result", indirect_result)) + indirect_result = model.void_type + tp = model.FunctionPtrType(tuple(indirect_args), + indirect_result, tp.ellipsis) + BFunc = self.ffi._get_cached_btype(tp) + wrappername = '_cffi_f_%s' % name + newfunction = module.load_function(BFunc, wrappername) + for i, typ in indirections: + newfunction = self._make_struct_wrapper(newfunction, i, typ, + base_tp) + setattr(library, name, newfunction) + type(library)._cffi_dir.append(name) + + def _make_struct_wrapper(self, oldfunc, i, tp, base_tp): + backend = self.ffi._backend + BType = self.ffi._get_cached_btype(tp) + if i == "result": + ffi = self.ffi + def newfunc(*args): + res = ffi.new(BType) + oldfunc(res, *args) + return res[0] + else: + def newfunc(*args): + args = args[:i] + (backend.newp(BType, args[i]),) + args[i+1:] + return oldfunc(*args) + newfunc._cffi_base_type = base_tp + return newfunc + + # ---------- + # named structs + + def _generate_gen_struct_decl(self, tp, name): + assert name == tp.name + self._generate_struct_or_union_decl(tp, 'struct', name) + + def _loading_gen_struct(self, tp, name, module): + self._loading_struct_or_union(tp, 'struct', name, module) + + def _loaded_gen_struct(self, tp, name, module, **kwds): + self._loaded_struct_or_union(tp) + + def _generate_gen_union_decl(self, tp, name): + assert name == tp.name + self._generate_struct_or_union_decl(tp, 'union', name) + + def _loading_gen_union(self, tp, name, module): + self._loading_struct_or_union(tp, 'union', name, module) + + def _loaded_gen_union(self, tp, name, module, **kwds): + self._loaded_struct_or_union(tp) + + def _generate_struct_or_union_decl(self, tp, prefix, name): + if tp.fldnames is None: + return # nothing to do with opaque structs + checkfuncname = '_cffi_check_%s_%s' % (prefix, name) + layoutfuncname = '_cffi_layout_%s_%s' % (prefix, name) + cname = ('%s %s' % (prefix, name)).strip() + # + prnt = self._prnt + prnt('static void %s(%s *p)' % (checkfuncname, cname)) + prnt('{') + prnt(' /* only to generate compile-time warnings or errors */') + prnt(' (void)p;') + for fname, ftype, fbitsize, fqual in tp.enumfields(): + if (isinstance(ftype, model.PrimitiveType) + and ftype.is_integer_type()) or fbitsize >= 0: + # accept all integers, but complain on float or double + prnt(' (void)((p->%s) << 1);' % fname) + else: + # only accept exactly the type declared. + try: + prnt(' { %s = &p->%s; (void)tmp; }' % ( + ftype.get_c_name('*tmp', 'field %r'%fname, quals=fqual), + fname)) + except VerificationError as e: + prnt(' /* %s */' % str(e)) # cannot verify it, ignore + prnt('}') + self.export_symbols.append(layoutfuncname) + prnt('intptr_t %s(intptr_t i)' % (layoutfuncname,)) + prnt('{') + prnt(' struct _cffi_aligncheck { char x; %s y; };' % cname) + prnt(' static intptr_t nums[] = {') + prnt(' sizeof(%s),' % cname) + prnt(' offsetof(struct _cffi_aligncheck, y),') + for fname, ftype, fbitsize, fqual in tp.enumfields(): + if fbitsize >= 0: + continue # xxx ignore fbitsize for now + prnt(' offsetof(%s, %s),' % (cname, fname)) + if isinstance(ftype, model.ArrayType) and ftype.length is None: + prnt(' 0, /* %s */' % ftype._get_c_name()) + else: + prnt(' sizeof(((%s *)0)->%s),' % (cname, fname)) + prnt(' -1') + prnt(' };') + prnt(' return nums[i];') + prnt(' /* the next line is not executed, but compiled */') + prnt(' %s(0);' % (checkfuncname,)) + prnt('}') + prnt() + + def _loading_struct_or_union(self, tp, prefix, name, module): + if tp.fldnames is None: + return # nothing to do with opaque structs + layoutfuncname = '_cffi_layout_%s_%s' % (prefix, name) + # + BFunc = self.ffi._typeof_locked("intptr_t(*)(intptr_t)")[0] + function = module.load_function(BFunc, layoutfuncname) + layout = [] + num = 0 + while True: + x = function(num) + if x < 0: break + layout.append(x) + num += 1 + if isinstance(tp, model.StructOrUnion) and tp.partial: + # use the function()'s sizes and offsets to guide the + # layout of the struct + totalsize = layout[0] + totalalignment = layout[1] + fieldofs = layout[2::2] + fieldsize = layout[3::2] + tp.force_flatten() + assert len(fieldofs) == len(fieldsize) == len(tp.fldnames) + tp.fixedlayout = fieldofs, fieldsize, totalsize, totalalignment + else: + cname = ('%s %s' % (prefix, name)).strip() + self._struct_pending_verification[tp] = layout, cname + + def _loaded_struct_or_union(self, tp): + if tp.fldnames is None: + return # nothing to do with opaque structs + self.ffi._get_cached_btype(tp) # force 'fixedlayout' to be considered + + if tp in self._struct_pending_verification: + # check that the layout sizes and offsets match the real ones + def check(realvalue, expectedvalue, msg): + if realvalue != expectedvalue: + raise VerificationError( + "%s (we have %d, but C compiler says %d)" + % (msg, expectedvalue, realvalue)) + ffi = self.ffi + BStruct = ffi._get_cached_btype(tp) + layout, cname = self._struct_pending_verification.pop(tp) + check(layout[0], ffi.sizeof(BStruct), "wrong total size") + check(layout[1], ffi.alignof(BStruct), "wrong total alignment") + i = 2 + for fname, ftype, fbitsize, fqual in tp.enumfields(): + if fbitsize >= 0: + continue # xxx ignore fbitsize for now + check(layout[i], ffi.offsetof(BStruct, fname), + "wrong offset for field %r" % (fname,)) + if layout[i+1] != 0: + BField = ffi._get_cached_btype(ftype) + check(layout[i+1], ffi.sizeof(BField), + "wrong size for field %r" % (fname,)) + i += 2 + assert i == len(layout) + + # ---------- + # 'anonymous' declarations. These are produced for anonymous structs + # or unions; the 'name' is obtained by a typedef. + + def _generate_gen_anonymous_decl(self, tp, name): + if isinstance(tp, model.EnumType): + self._generate_gen_enum_decl(tp, name, '') + else: + self._generate_struct_or_union_decl(tp, '', name) + + def _loading_gen_anonymous(self, tp, name, module): + if isinstance(tp, model.EnumType): + self._loading_gen_enum(tp, name, module, '') + else: + self._loading_struct_or_union(tp, '', name, module) + + def _loaded_gen_anonymous(self, tp, name, module, **kwds): + if isinstance(tp, model.EnumType): + self._loaded_gen_enum(tp, name, module, **kwds) + else: + self._loaded_struct_or_union(tp) + + # ---------- + # constants, likely declared with '#define' + + def _generate_gen_const(self, is_int, name, tp=None, category='const', + check_value=None): + prnt = self._prnt + funcname = '_cffi_%s_%s' % (category, name) + self.export_symbols.append(funcname) + if check_value is not None: + assert is_int + assert category == 'const' + prnt('int %s(char *out_error)' % funcname) + prnt('{') + self._check_int_constant_value(name, check_value) + prnt(' return 0;') + prnt('}') + elif is_int: + assert category == 'const' + prnt('int %s(long long *out_value)' % funcname) + prnt('{') + prnt(' *out_value = (long long)(%s);' % (name,)) + prnt(' return (%s) <= 0;' % (name,)) + prnt('}') + else: + assert tp is not None + assert check_value is None + if category == 'var': + ampersand = '&' + else: + ampersand = '' + extra = '' + if category == 'const' and isinstance(tp, model.StructOrUnion): + extra = 'const *' + ampersand = '&' + prnt(tp.get_c_name(' %s%s(void)' % (extra, funcname), name)) + prnt('{') + prnt(' return (%s%s);' % (ampersand, name)) + prnt('}') + prnt() + + def _generate_gen_constant_decl(self, tp, name): + is_int = isinstance(tp, model.PrimitiveType) and tp.is_integer_type() + self._generate_gen_const(is_int, name, tp) + + _loading_gen_constant = _loaded_noop + + def _load_constant(self, is_int, tp, name, module, check_value=None): + funcname = '_cffi_const_%s' % name + if check_value is not None: + assert is_int + self._load_known_int_constant(module, funcname) + value = check_value + elif is_int: + BType = self.ffi._typeof_locked("long long*")[0] + BFunc = self.ffi._typeof_locked("int(*)(long long*)")[0] + function = module.load_function(BFunc, funcname) + p = self.ffi.new(BType) + negative = function(p) + value = int(p[0]) + if value < 0 and not negative: + BLongLong = self.ffi._typeof_locked("long long")[0] + value += (1 << (8*self.ffi.sizeof(BLongLong))) + else: + assert check_value is None + fntypeextra = '(*)(void)' + if isinstance(tp, model.StructOrUnion): + fntypeextra = '*' + fntypeextra + BFunc = self.ffi._typeof_locked(tp.get_c_name(fntypeextra, name))[0] + function = module.load_function(BFunc, funcname) + value = function() + if isinstance(tp, model.StructOrUnion): + value = value[0] + return value + + def _loaded_gen_constant(self, tp, name, module, library): + is_int = isinstance(tp, model.PrimitiveType) and tp.is_integer_type() + value = self._load_constant(is_int, tp, name, module) + setattr(library, name, value) + type(library)._cffi_dir.append(name) + + # ---------- + # enums + + def _check_int_constant_value(self, name, value): + prnt = self._prnt + if value <= 0: + prnt(' if ((%s) > 0 || (long)(%s) != %dL) {' % ( + name, name, value)) + else: + prnt(' if ((%s) <= 0 || (unsigned long)(%s) != %dUL) {' % ( + name, name, value)) + prnt(' char buf[64];') + prnt(' if ((%s) <= 0)' % name) + prnt(' sprintf(buf, "%%ld", (long)(%s));' % name) + prnt(' else') + prnt(' sprintf(buf, "%%lu", (unsigned long)(%s));' % + name) + prnt(' sprintf(out_error, "%s has the real value %s, not %s",') + prnt(' "%s", buf, "%d");' % (name[:100], value)) + prnt(' return -1;') + prnt(' }') + + def _load_known_int_constant(self, module, funcname): + BType = self.ffi._typeof_locked("char[]")[0] + BFunc = self.ffi._typeof_locked("int(*)(char*)")[0] + function = module.load_function(BFunc, funcname) + p = self.ffi.new(BType, 256) + if function(p) < 0: + error = self.ffi.string(p) + if sys.version_info >= (3,): + error = str(error, 'utf-8') + raise VerificationError(error) + + def _enum_funcname(self, prefix, name): + # "$enum_$1" => "___D_enum____D_1" + name = name.replace('$', '___D_') + return '_cffi_e_%s_%s' % (prefix, name) + + def _generate_gen_enum_decl(self, tp, name, prefix='enum'): + if tp.partial: + for enumerator in tp.enumerators: + self._generate_gen_const(True, enumerator) + return + # + funcname = self._enum_funcname(prefix, name) + self.export_symbols.append(funcname) + prnt = self._prnt + prnt('int %s(char *out_error)' % funcname) + prnt('{') + for enumerator, enumvalue in zip(tp.enumerators, tp.enumvalues): + self._check_int_constant_value(enumerator, enumvalue) + prnt(' return 0;') + prnt('}') + prnt() + + def _loading_gen_enum(self, tp, name, module, prefix='enum'): + if tp.partial: + enumvalues = [self._load_constant(True, tp, enumerator, module) + for enumerator in tp.enumerators] + tp.enumvalues = tuple(enumvalues) + tp.partial_resolved = True + else: + funcname = self._enum_funcname(prefix, name) + self._load_known_int_constant(module, funcname) + + def _loaded_gen_enum(self, tp, name, module, library): + for enumerator, enumvalue in zip(tp.enumerators, tp.enumvalues): + setattr(library, enumerator, enumvalue) + type(library)._cffi_dir.append(enumerator) + + # ---------- + # macros: for now only for integers + + def _generate_gen_macro_decl(self, tp, name): + if tp == '...': + check_value = None + else: + check_value = tp # an integer + self._generate_gen_const(True, name, check_value=check_value) + + _loading_gen_macro = _loaded_noop + + def _loaded_gen_macro(self, tp, name, module, library): + if tp == '...': + check_value = None + else: + check_value = tp # an integer + value = self._load_constant(True, tp, name, module, + check_value=check_value) + setattr(library, name, value) + type(library)._cffi_dir.append(name) + + # ---------- + # global variables + + def _generate_gen_variable_decl(self, tp, name): + if isinstance(tp, model.ArrayType): + if tp.length_is_unknown(): + prnt = self._prnt + funcname = '_cffi_sizeof_%s' % (name,) + self.export_symbols.append(funcname) + prnt("size_t %s(void)" % funcname) + prnt("{") + prnt(" return sizeof(%s);" % (name,)) + prnt("}") + tp_ptr = model.PointerType(tp.item) + self._generate_gen_const(False, name, tp_ptr) + else: + tp_ptr = model.PointerType(tp) + self._generate_gen_const(False, name, tp_ptr, category='var') + + _loading_gen_variable = _loaded_noop + + def _loaded_gen_variable(self, tp, name, module, library): + if isinstance(tp, model.ArrayType): # int a[5] is "constant" in the + # sense that "a=..." is forbidden + if tp.length_is_unknown(): + funcname = '_cffi_sizeof_%s' % (name,) + BFunc = self.ffi._typeof_locked('size_t(*)(void)')[0] + function = module.load_function(BFunc, funcname) + size = function() + BItemType = self.ffi._get_cached_btype(tp.item) + length, rest = divmod(size, self.ffi.sizeof(BItemType)) + if rest != 0: + raise VerificationError( + "bad size: %r does not seem to be an array of %s" % + (name, tp.item)) + tp = tp.resolve_length(length) + tp_ptr = model.PointerType(tp.item) + value = self._load_constant(False, tp_ptr, name, module) + # 'value' is a which we have to replace with + # a if the N is actually known + if tp.length is not None: + BArray = self.ffi._get_cached_btype(tp) + value = self.ffi.cast(BArray, value) + setattr(library, name, value) + type(library)._cffi_dir.append(name) + return + # remove ptr= from the library instance, and replace + # it by a property on the class, which reads/writes into ptr[0]. + funcname = '_cffi_var_%s' % name + BFunc = self.ffi._typeof_locked(tp.get_c_name('*(*)(void)', name))[0] + function = module.load_function(BFunc, funcname) + ptr = function() + def getter(library): + return ptr[0] + def setter(library, value): + ptr[0] = value + setattr(type(library), name, property(getter, setter)) + type(library)._cffi_dir.append(name) + +cffimod_header = r''' +#include +#include +#include +#include +#include /* XXX for ssize_t on some platforms */ + +/* this block of #ifs should be kept exactly identical between + c/_cffi_backend.c, cffi/vengine_cpy.py, cffi/vengine_gen.py + and cffi/_cffi_include.h */ +#if defined(_MSC_VER) +# include /* for alloca() */ +# if _MSC_VER < 1600 /* MSVC < 2010 */ + typedef __int8 int8_t; + typedef __int16 int16_t; + typedef __int32 int32_t; + typedef __int64 int64_t; + typedef unsigned __int8 uint8_t; + typedef unsigned __int16 uint16_t; + typedef unsigned __int32 uint32_t; + typedef unsigned __int64 uint64_t; + typedef __int8 int_least8_t; + typedef __int16 int_least16_t; + typedef __int32 int_least32_t; + typedef __int64 int_least64_t; + typedef unsigned __int8 uint_least8_t; + typedef unsigned __int16 uint_least16_t; + typedef unsigned __int32 uint_least32_t; + typedef unsigned __int64 uint_least64_t; + typedef __int8 int_fast8_t; + typedef __int16 int_fast16_t; + typedef __int32 int_fast32_t; + typedef __int64 int_fast64_t; + typedef unsigned __int8 uint_fast8_t; + typedef unsigned __int16 uint_fast16_t; + typedef unsigned __int32 uint_fast32_t; + typedef unsigned __int64 uint_fast64_t; + typedef __int64 intmax_t; + typedef unsigned __int64 uintmax_t; +# else +# include +# endif +# if _MSC_VER < 1800 /* MSVC < 2013 */ +# ifndef __cplusplus + typedef unsigned char _Bool; +# endif +# endif +# define _cffi_float_complex_t _Fcomplex /* include for it */ +# define _cffi_double_complex_t _Dcomplex /* include for it */ +#else +# include +# if (defined (__SVR4) && defined (__sun)) || defined(_AIX) || defined(__hpux) +# include +# endif +# define _cffi_float_complex_t float _Complex +# define _cffi_double_complex_t double _Complex +#endif +''' diff --git a/venv/lib/python3.11/site-packages/cffi/verifier.py b/venv/lib/python3.11/site-packages/cffi/verifier.py new file mode 100644 index 0000000..e392a2b --- /dev/null +++ b/venv/lib/python3.11/site-packages/cffi/verifier.py @@ -0,0 +1,306 @@ +# +# DEPRECATED: implementation for ffi.verify() +# +import sys, os, binascii, shutil, io +from . import __version_verifier_modules__ +from . import ffiplatform +from .error import VerificationError + +if sys.version_info >= (3, 3): + import importlib.machinery + def _extension_suffixes(): + return importlib.machinery.EXTENSION_SUFFIXES[:] +else: + import imp + def _extension_suffixes(): + return [suffix for suffix, _, type in imp.get_suffixes() + if type == imp.C_EXTENSION] + + +if sys.version_info >= (3,): + NativeIO = io.StringIO +else: + class NativeIO(io.BytesIO): + def write(self, s): + if isinstance(s, unicode): + s = s.encode('ascii') + super(NativeIO, self).write(s) + + +class Verifier(object): + + def __init__(self, ffi, preamble, tmpdir=None, modulename=None, + ext_package=None, tag='', force_generic_engine=False, + source_extension='.c', flags=None, relative_to=None, **kwds): + if ffi._parser._uses_new_feature: + raise VerificationError( + "feature not supported with ffi.verify(), but only " + "with ffi.set_source(): %s" % (ffi._parser._uses_new_feature,)) + self.ffi = ffi + self.preamble = preamble + if not modulename: + flattened_kwds = ffiplatform.flatten(kwds) + vengine_class = _locate_engine_class(ffi, force_generic_engine) + self._vengine = vengine_class(self) + self._vengine.patch_extension_kwds(kwds) + self.flags = flags + self.kwds = self.make_relative_to(kwds, relative_to) + # + if modulename: + if tag: + raise TypeError("can't specify both 'modulename' and 'tag'") + else: + key = '\x00'.join(['%d.%d' % sys.version_info[:2], + __version_verifier_modules__, + preamble, flattened_kwds] + + ffi._cdefsources) + if sys.version_info >= (3,): + key = key.encode('utf-8') + k1 = hex(binascii.crc32(key[0::2]) & 0xffffffff) + k1 = k1.lstrip('0x').rstrip('L') + k2 = hex(binascii.crc32(key[1::2]) & 0xffffffff) + k2 = k2.lstrip('0').rstrip('L') + modulename = '_cffi_%s_%s%s%s' % (tag, self._vengine._class_key, + k1, k2) + suffix = _get_so_suffixes()[0] + self.tmpdir = tmpdir or _caller_dir_pycache() + self.sourcefilename = os.path.join(self.tmpdir, modulename + source_extension) + self.modulefilename = os.path.join(self.tmpdir, modulename + suffix) + self.ext_package = ext_package + self._has_source = False + self._has_module = False + + def write_source(self, file=None): + """Write the C source code. It is produced in 'self.sourcefilename', + which can be tweaked beforehand.""" + with self.ffi._lock: + if self._has_source and file is None: + raise VerificationError( + "source code already written") + self._write_source(file) + + def compile_module(self): + """Write the C source code (if not done already) and compile it. + This produces a dynamic link library in 'self.modulefilename'.""" + with self.ffi._lock: + if self._has_module: + raise VerificationError("module already compiled") + if not self._has_source: + self._write_source() + self._compile_module() + + def load_library(self): + """Get a C module from this Verifier instance. + Returns an instance of a FFILibrary class that behaves like the + objects returned by ffi.dlopen(), but that delegates all + operations to the C module. If necessary, the C code is written + and compiled first. + """ + with self.ffi._lock: + if not self._has_module: + self._locate_module() + if not self._has_module: + if not self._has_source: + self._write_source() + self._compile_module() + return self._load_library() + + def get_module_name(self): + basename = os.path.basename(self.modulefilename) + # kill both the .so extension and the other .'s, as introduced + # by Python 3: 'basename.cpython-33m.so' + basename = basename.split('.', 1)[0] + # and the _d added in Python 2 debug builds --- but try to be + # conservative and not kill a legitimate _d + if basename.endswith('_d') and hasattr(sys, 'gettotalrefcount'): + basename = basename[:-2] + return basename + + def get_extension(self): + if not self._has_source: + with self.ffi._lock: + if not self._has_source: + self._write_source() + sourcename = ffiplatform.maybe_relative_path(self.sourcefilename) + modname = self.get_module_name() + return ffiplatform.get_extension(sourcename, modname, **self.kwds) + + def generates_python_module(self): + return self._vengine._gen_python_module + + def make_relative_to(self, kwds, relative_to): + if relative_to and os.path.dirname(relative_to): + dirname = os.path.dirname(relative_to) + kwds = kwds.copy() + for key in ffiplatform.LIST_OF_FILE_NAMES: + if key in kwds: + lst = kwds[key] + if not isinstance(lst, (list, tuple)): + raise TypeError("keyword '%s' should be a list or tuple" + % (key,)) + lst = [os.path.join(dirname, fn) for fn in lst] + kwds[key] = lst + return kwds + + # ---------- + + def _locate_module(self): + if not os.path.isfile(self.modulefilename): + if self.ext_package: + try: + pkg = __import__(self.ext_package, None, None, ['__doc__']) + except ImportError: + return # cannot import the package itself, give up + # (e.g. it might be called differently before installation) + path = pkg.__path__ + else: + path = None + filename = self._vengine.find_module(self.get_module_name(), path, + _get_so_suffixes()) + if filename is None: + return + self.modulefilename = filename + self._vengine.collect_types() + self._has_module = True + + def _write_source_to(self, file): + self._vengine._f = file + try: + self._vengine.write_source_to_f() + finally: + del self._vengine._f + + def _write_source(self, file=None): + if file is not None: + self._write_source_to(file) + else: + # Write our source file to an in memory file. + f = NativeIO() + self._write_source_to(f) + source_data = f.getvalue() + + # Determine if this matches the current file + if os.path.exists(self.sourcefilename): + with open(self.sourcefilename, "r") as fp: + needs_written = not (fp.read() == source_data) + else: + needs_written = True + + # Actually write the file out if it doesn't match + if needs_written: + _ensure_dir(self.sourcefilename) + with open(self.sourcefilename, "w") as fp: + fp.write(source_data) + + # Set this flag + self._has_source = True + + def _compile_module(self): + # compile this C source + tmpdir = os.path.dirname(self.sourcefilename) + outputfilename = ffiplatform.compile(tmpdir, self.get_extension()) + try: + same = ffiplatform.samefile(outputfilename, self.modulefilename) + except OSError: + same = False + if not same: + _ensure_dir(self.modulefilename) + shutil.move(outputfilename, self.modulefilename) + self._has_module = True + + def _load_library(self): + assert self._has_module + if self.flags is not None: + return self._vengine.load_library(self.flags) + else: + return self._vengine.load_library() + +# ____________________________________________________________ + +_FORCE_GENERIC_ENGINE = False # for tests + +def _locate_engine_class(ffi, force_generic_engine): + if _FORCE_GENERIC_ENGINE: + force_generic_engine = True + if not force_generic_engine: + if '__pypy__' in sys.builtin_module_names: + force_generic_engine = True + else: + try: + import _cffi_backend + except ImportError: + _cffi_backend = '?' + if ffi._backend is not _cffi_backend: + force_generic_engine = True + if force_generic_engine: + from . import vengine_gen + return vengine_gen.VGenericEngine + else: + from . import vengine_cpy + return vengine_cpy.VCPythonEngine + +# ____________________________________________________________ + +_TMPDIR = None + +def _caller_dir_pycache(): + if _TMPDIR: + return _TMPDIR + result = os.environ.get('CFFI_TMPDIR') + if result: + return result + filename = sys._getframe(2).f_code.co_filename + return os.path.abspath(os.path.join(os.path.dirname(filename), + '__pycache__')) + +def set_tmpdir(dirname): + """Set the temporary directory to use instead of __pycache__.""" + global _TMPDIR + _TMPDIR = dirname + +def cleanup_tmpdir(tmpdir=None, keep_so=False): + """Clean up the temporary directory by removing all files in it + called `_cffi_*.{c,so}` as well as the `build` subdirectory.""" + tmpdir = tmpdir or _caller_dir_pycache() + try: + filelist = os.listdir(tmpdir) + except OSError: + return + if keep_so: + suffix = '.c' # only remove .c files + else: + suffix = _get_so_suffixes()[0].lower() + for fn in filelist: + if fn.lower().startswith('_cffi_') and ( + fn.lower().endswith(suffix) or fn.lower().endswith('.c')): + try: + os.unlink(os.path.join(tmpdir, fn)) + except OSError: + pass + clean_dir = [os.path.join(tmpdir, 'build')] + for dir in clean_dir: + try: + for fn in os.listdir(dir): + fn = os.path.join(dir, fn) + if os.path.isdir(fn): + clean_dir.append(fn) + else: + os.unlink(fn) + except OSError: + pass + +def _get_so_suffixes(): + suffixes = _extension_suffixes() + if not suffixes: + # bah, no C_EXTENSION available. Occurs on pypy without cpyext + if sys.platform == 'win32': + suffixes = [".pyd"] + else: + suffixes = [".so"] + + return suffixes + +def _ensure_dir(filename): + dirname = os.path.dirname(filename) + if dirname and not os.path.isdir(dirname): + os.makedirs(dirname) diff --git a/venv/lib/python3.11/site-packages/charset_normalizer-3.4.4.dist-info/INSTALLER b/venv/lib/python3.11/site-packages/charset_normalizer-3.4.4.dist-info/INSTALLER new file mode 100644 index 0000000..a1b589e --- /dev/null +++ b/venv/lib/python3.11/site-packages/charset_normalizer-3.4.4.dist-info/INSTALLER @@ -0,0 +1 @@ +pip diff --git a/venv/lib/python3.11/site-packages/charset_normalizer-3.4.4.dist-info/METADATA b/venv/lib/python3.11/site-packages/charset_normalizer-3.4.4.dist-info/METADATA new file mode 100644 index 0000000..8d32edc --- /dev/null +++ b/venv/lib/python3.11/site-packages/charset_normalizer-3.4.4.dist-info/METADATA @@ -0,0 +1,764 @@ +Metadata-Version: 2.4 +Name: charset-normalizer +Version: 3.4.4 +Summary: The Real First Universal Charset Detector. Open, modern and actively maintained alternative to Chardet. +Author-email: "Ahmed R. TAHRI" +Maintainer-email: "Ahmed R. TAHRI" +License: MIT +Project-URL: Changelog, https://github.com/jawah/charset_normalizer/blob/master/CHANGELOG.md +Project-URL: Documentation, https://charset-normalizer.readthedocs.io/ +Project-URL: Code, https://github.com/jawah/charset_normalizer +Project-URL: Issue tracker, https://github.com/jawah/charset_normalizer/issues +Keywords: encoding,charset,charset-detector,detector,normalization,unicode,chardet,detect +Classifier: Development Status :: 5 - Production/Stable +Classifier: Intended Audience :: Developers +Classifier: Operating System :: OS Independent +Classifier: Programming Language :: Python +Classifier: Programming Language :: Python :: 3 +Classifier: Programming Language :: Python :: 3.7 +Classifier: Programming Language :: Python :: 3.8 +Classifier: Programming Language :: Python :: 3.9 +Classifier: Programming Language :: Python :: 3.10 +Classifier: Programming Language :: Python :: 3.11 +Classifier: Programming Language :: Python :: 3.12 +Classifier: Programming Language :: Python :: 3.13 +Classifier: Programming Language :: Python :: 3.14 +Classifier: Programming Language :: Python :: 3 :: Only +Classifier: Programming Language :: Python :: Implementation :: CPython +Classifier: Programming Language :: Python :: Implementation :: PyPy +Classifier: Topic :: Text Processing :: Linguistic +Classifier: Topic :: Utilities +Classifier: Typing :: Typed +Requires-Python: >=3.7 +Description-Content-Type: text/markdown +License-File: LICENSE +Provides-Extra: unicode-backport +Dynamic: license-file + +

    Charset Detection, for Everyone 👋

    + +

    + The Real First Universal Charset Detector
    + + + + + Download Count Total + + + + +

    +

    + Featured Packages
    + + Static Badge + + + Static Badge + +

    +

    + In other language (unofficial port - by the community)
    + + Static Badge + +

    + +> A library that helps you read text from an unknown charset encoding.
    Motivated by `chardet`, +> I'm trying to resolve the issue by taking a new approach. +> All IANA character set names for which the Python core library provides codecs are supported. + +

    + >>>>> 👉 Try Me Online Now, Then Adopt Me 👈 <<<<< +

    + +This project offers you an alternative to **Universal Charset Encoding Detector**, also known as **Chardet**. + +| Feature | [Chardet](https://github.com/chardet/chardet) | Charset Normalizer | [cChardet](https://github.com/PyYoshi/cChardet) | +|--------------------------------------------------|:---------------------------------------------:|:--------------------------------------------------------------------------------------------------:|:-----------------------------------------------:| +| `Fast` | ❌ | ✅ | ✅ | +| `Universal**` | ❌ | ✅ | ❌ | +| `Reliable` **without** distinguishable standards | ❌ | ✅ | ✅ | +| `Reliable` **with** distinguishable standards | ✅ | ✅ | ✅ | +| `License` | LGPL-2.1
    _restrictive_ | MIT | MPL-1.1
    _restrictive_ | +| `Native Python` | ✅ | ✅ | ❌ | +| `Detect spoken language` | ❌ | ✅ | N/A | +| `UnicodeDecodeError Safety` | ❌ | ✅ | ❌ | +| `Whl Size (min)` | 193.6 kB | 42 kB | ~200 kB | +| `Supported Encoding` | 33 | 🎉 [99](https://charset-normalizer.readthedocs.io/en/latest/user/support.html#supported-encodings) | 40 | + +

    +Reading Normalized TextCat Reading Text +

    + +*\*\* : They are clearly using specific code for a specific encoding even if covering most of used one*
    + +## ⚡ Performance + +This package offer better performance than its counterpart Chardet. Here are some numbers. + +| Package | Accuracy | Mean per file (ms) | File per sec (est) | +|-----------------------------------------------|:--------:|:------------------:|:------------------:| +| [chardet](https://github.com/chardet/chardet) | 86 % | 63 ms | 16 file/sec | +| charset-normalizer | **98 %** | **10 ms** | 100 file/sec | + +| Package | 99th percentile | 95th percentile | 50th percentile | +|-----------------------------------------------|:---------------:|:---------------:|:---------------:| +| [chardet](https://github.com/chardet/chardet) | 265 ms | 71 ms | 7 ms | +| charset-normalizer | 100 ms | 50 ms | 5 ms | + +_updated as of december 2024 using CPython 3.12_ + +Chardet's performance on larger file (1MB+) are very poor. Expect huge difference on large payload. + +> Stats are generated using 400+ files using default parameters. More details on used files, see GHA workflows. +> And yes, these results might change at any time. The dataset can be updated to include more files. +> The actual delays heavily depends on your CPU capabilities. The factors should remain the same. +> Keep in mind that the stats are generous and that Chardet accuracy vs our is measured using Chardet initial capability +> (e.g. Supported Encoding) Challenge-them if you want. + +## ✨ Installation + +Using pip: + +```sh +pip install charset-normalizer -U +``` + +## 🚀 Basic Usage + +### CLI +This package comes with a CLI. + +``` +usage: normalizer [-h] [-v] [-a] [-n] [-m] [-r] [-f] [-t THRESHOLD] + file [file ...] + +The Real First Universal Charset Detector. Discover originating encoding used +on text file. Normalize text to unicode. + +positional arguments: + files File(s) to be analysed + +optional arguments: + -h, --help show this help message and exit + -v, --verbose Display complementary information about file if any. + Stdout will contain logs about the detection process. + -a, --with-alternative + Output complementary possibilities if any. Top-level + JSON WILL be a list. + -n, --normalize Permit to normalize input file. If not set, program + does not write anything. + -m, --minimal Only output the charset detected to STDOUT. Disabling + JSON output. + -r, --replace Replace file when trying to normalize it instead of + creating a new one. + -f, --force Replace file without asking if you are sure, use this + flag with caution. + -t THRESHOLD, --threshold THRESHOLD + Define a custom maximum amount of chaos allowed in + decoded content. 0. <= chaos <= 1. + --version Show version information and exit. +``` + +```bash +normalizer ./data/sample.1.fr.srt +``` + +or + +```bash +python -m charset_normalizer ./data/sample.1.fr.srt +``` + +🎉 Since version 1.4.0 the CLI produce easily usable stdout result in JSON format. + +```json +{ + "path": "/home/default/projects/charset_normalizer/data/sample.1.fr.srt", + "encoding": "cp1252", + "encoding_aliases": [ + "1252", + "windows_1252" + ], + "alternative_encodings": [ + "cp1254", + "cp1256", + "cp1258", + "iso8859_14", + "iso8859_15", + "iso8859_16", + "iso8859_3", + "iso8859_9", + "latin_1", + "mbcs" + ], + "language": "French", + "alphabets": [ + "Basic Latin", + "Latin-1 Supplement" + ], + "has_sig_or_bom": false, + "chaos": 0.149, + "coherence": 97.152, + "unicode_path": null, + "is_preferred": true +} +``` + +### Python +*Just print out normalized text* +```python +from charset_normalizer import from_path + +results = from_path('./my_subtitle.srt') + +print(str(results.best())) +``` + +*Upgrade your code without effort* +```python +from charset_normalizer import detect +``` + +The above code will behave the same as **chardet**. We ensure that we offer the best (reasonable) BC result possible. + +See the docs for advanced usage : [readthedocs.io](https://charset-normalizer.readthedocs.io/en/latest/) + +## 😇 Why + +When I started using Chardet, I noticed that it was not suited to my expectations, and I wanted to propose a +reliable alternative using a completely different method. Also! I never back down on a good challenge! + +I **don't care** about the **originating charset** encoding, because **two different tables** can +produce **two identical rendered string.** +What I want is to get readable text, the best I can. + +In a way, **I'm brute forcing text decoding.** How cool is that ? 😎 + +Don't confuse package **ftfy** with charset-normalizer or chardet. ftfy goal is to repair Unicode string whereas charset-normalizer to convert raw file in unknown encoding to unicode. + +## 🍰 How + + - Discard all charset encoding table that could not fit the binary content. + - Measure noise, or the mess once opened (by chunks) with a corresponding charset encoding. + - Extract matches with the lowest mess detected. + - Additionally, we measure coherence / probe for a language. + +**Wait a minute**, what is noise/mess and coherence according to **YOU ?** + +*Noise :* I opened hundred of text files, **written by humans**, with the wrong encoding table. **I observed**, then +**I established** some ground rules about **what is obvious** when **it seems like** a mess (aka. defining noise in rendered text). + I know that my interpretation of what is noise is probably incomplete, feel free to contribute in order to + improve or rewrite it. + +*Coherence :* For each language there is on earth, we have computed ranked letter appearance occurrences (the best we can). So I thought +that intel is worth something here. So I use those records against decoded text to check if I can detect intelligent design. + +## ⚡ Known limitations + + - Language detection is unreliable when text contains two or more languages sharing identical letters. (eg. HTML (english tags) + Turkish content (Sharing Latin characters)) + - Every charset detector heavily depends on sufficient content. In common cases, do not bother run detection on very tiny content. + +## ⚠️ About Python EOLs + +**If you are running:** + +- Python >=2.7,<3.5: Unsupported +- Python 3.5: charset-normalizer < 2.1 +- Python 3.6: charset-normalizer < 3.1 +- Python 3.7: charset-normalizer < 4.0 + +Upgrade your Python interpreter as soon as possible. + +## 👤 Contributing + +Contributions, issues and feature requests are very much welcome.
    +Feel free to check [issues page](https://github.com/ousret/charset_normalizer/issues) if you want to contribute. + +## 📝 License + +Copyright © [Ahmed TAHRI @Ousret](https://github.com/Ousret).
    +This project is [MIT](https://github.com/Ousret/charset_normalizer/blob/master/LICENSE) licensed. + +Characters frequencies used in this project © 2012 [Denny Vrandečić](http://simia.net/letters/) + +## 💼 For Enterprise + +Professional support for charset-normalizer is available as part of the [Tidelift +Subscription][1]. Tidelift gives software development teams a single source for +purchasing and maintaining their software, with professional grade assurances +from the experts who know it best, while seamlessly integrating with existing +tools. + +[1]: https://tidelift.com/subscription/pkg/pypi-charset-normalizer?utm_source=pypi-charset-normalizer&utm_medium=readme + +[![OpenSSF Best Practices](https://www.bestpractices.dev/projects/7297/badge)](https://www.bestpractices.dev/projects/7297) + +# Changelog +All notable changes to charset-normalizer will be documented in this file. This project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). +The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/). + +## [3.4.4](https://github.com/Ousret/charset_normalizer/compare/3.4.2...3.4.4) (2025-10-13) + +### Changed +- Bound `setuptools` to a specific constraint `setuptools>=68,<=81`. +- Raised upper bound of mypyc for the optional pre-built extension to v1.18.2 + +### Removed +- `setuptools-scm` as a build dependency. + +### Misc +- Enforced hashes in `dev-requirements.txt` and created `ci-requirements.txt` for security purposes. +- Additional pre-built wheels for riscv64, s390x, and armv7l architectures. +- Restore ` multiple.intoto.jsonl` in GitHub releases in addition to individual attestation file per wheel. + +## [3.4.3](https://github.com/Ousret/charset_normalizer/compare/3.4.2...3.4.3) (2025-08-09) + +### Changed +- mypy(c) is no longer a required dependency at build time if `CHARSET_NORMALIZER_USE_MYPYC` isn't set to `1`. (#595) (#583) +- automatically lower confidence on small bytes samples that are not Unicode in `detect` output legacy function. (#391) + +### Added +- Custom build backend to overcome inability to mark mypy as an optional dependency in the build phase. +- Support for Python 3.14 + +### Fixed +- sdist archive contained useless directories. +- automatically fallback on valid UTF-16 or UTF-32 even if the md says it's noisy. (#633) + +### Misc +- SBOM are automatically published to the relevant GitHub release to comply with regulatory changes. + Each published wheel comes with its SBOM. We choose CycloneDX as the format. +- Prebuilt optimized wheel are no longer distributed by default for CPython 3.7 due to a change in cibuildwheel. + +## [3.4.2](https://github.com/Ousret/charset_normalizer/compare/3.4.1...3.4.2) (2025-05-02) + +### Fixed +- Addressed the DeprecationWarning in our CLI regarding `argparse.FileType` by backporting the target class into the package. (#591) +- Improved the overall reliability of the detector with CJK Ideographs. (#605) (#587) + +### Changed +- Optional mypyc compilation upgraded to version 1.15 for Python >= 3.8 + +## [3.4.1](https://github.com/Ousret/charset_normalizer/compare/3.4.0...3.4.1) (2024-12-24) + +### Changed +- Project metadata are now stored using `pyproject.toml` instead of `setup.cfg` using setuptools as the build backend. +- Enforce annotation delayed loading for a simpler and consistent types in the project. +- Optional mypyc compilation upgraded to version 1.14 for Python >= 3.8 + +### Added +- pre-commit configuration. +- noxfile. + +### Removed +- `build-requirements.txt` as per using `pyproject.toml` native build configuration. +- `bin/integration.py` and `bin/serve.py` in favor of downstream integration test (see noxfile). +- `setup.cfg` in favor of `pyproject.toml` metadata configuration. +- Unused `utils.range_scan` function. + +### Fixed +- Converting content to Unicode bytes may insert `utf_8` instead of preferred `utf-8`. (#572) +- Deprecation warning "'count' is passed as positional argument" when converting to Unicode bytes on Python 3.13+ + +## [3.4.0](https://github.com/Ousret/charset_normalizer/compare/3.3.2...3.4.0) (2024-10-08) + +### Added +- Argument `--no-preemptive` in the CLI to prevent the detector to search for hints. +- Support for Python 3.13 (#512) + +### Fixed +- Relax the TypeError exception thrown when trying to compare a CharsetMatch with anything else than a CharsetMatch. +- Improved the general reliability of the detector based on user feedbacks. (#520) (#509) (#498) (#407) (#537) +- Declared charset in content (preemptive detection) not changed when converting to utf-8 bytes. (#381) + +## [3.3.2](https://github.com/Ousret/charset_normalizer/compare/3.3.1...3.3.2) (2023-10-31) + +### Fixed +- Unintentional memory usage regression when using large payload that match several encoding (#376) +- Regression on some detection case showcased in the documentation (#371) + +### Added +- Noise (md) probe that identify malformed arabic representation due to the presence of letters in isolated form (credit to my wife) + +## [3.3.1](https://github.com/Ousret/charset_normalizer/compare/3.3.0...3.3.1) (2023-10-22) + +### Changed +- Optional mypyc compilation upgraded to version 1.6.1 for Python >= 3.8 +- Improved the general detection reliability based on reports from the community + +## [3.3.0](https://github.com/Ousret/charset_normalizer/compare/3.2.0...3.3.0) (2023-09-30) + +### Added +- Allow to execute the CLI (e.g. normalizer) through `python -m charset_normalizer.cli` or `python -m charset_normalizer` +- Support for 9 forgotten encoding that are supported by Python but unlisted in `encoding.aliases` as they have no alias (#323) + +### Removed +- (internal) Redundant utils.is_ascii function and unused function is_private_use_only +- (internal) charset_normalizer.assets is moved inside charset_normalizer.constant + +### Changed +- (internal) Unicode code blocks in constants are updated using the latest v15.0.0 definition to improve detection +- Optional mypyc compilation upgraded to version 1.5.1 for Python >= 3.8 + +### Fixed +- Unable to properly sort CharsetMatch when both chaos/noise and coherence were close due to an unreachable condition in \_\_lt\_\_ (#350) + +## [3.2.0](https://github.com/Ousret/charset_normalizer/compare/3.1.0...3.2.0) (2023-06-07) + +### Changed +- Typehint for function `from_path` no longer enforce `PathLike` as its first argument +- Minor improvement over the global detection reliability + +### Added +- Introduce function `is_binary` that relies on main capabilities, and optimized to detect binaries +- Propagate `enable_fallback` argument throughout `from_bytes`, `from_path`, and `from_fp` that allow a deeper control over the detection (default True) +- Explicit support for Python 3.12 + +### Fixed +- Edge case detection failure where a file would contain 'very-long' camel cased word (Issue #289) + +## [3.1.0](https://github.com/Ousret/charset_normalizer/compare/3.0.1...3.1.0) (2023-03-06) + +### Added +- Argument `should_rename_legacy` for legacy function `detect` and disregard any new arguments without errors (PR #262) + +### Removed +- Support for Python 3.6 (PR #260) + +### Changed +- Optional speedup provided by mypy/c 1.0.1 + +## [3.0.1](https://github.com/Ousret/charset_normalizer/compare/3.0.0...3.0.1) (2022-11-18) + +### Fixed +- Multi-bytes cutter/chunk generator did not always cut correctly (PR #233) + +### Changed +- Speedup provided by mypy/c 0.990 on Python >= 3.7 + +## [3.0.0](https://github.com/Ousret/charset_normalizer/compare/2.1.1...3.0.0) (2022-10-20) + +### Added +- Extend the capability of explain=True when cp_isolation contains at most two entries (min one), will log in details of the Mess-detector results +- Support for alternative language frequency set in charset_normalizer.assets.FREQUENCIES +- Add parameter `language_threshold` in `from_bytes`, `from_path` and `from_fp` to adjust the minimum expected coherence ratio +- `normalizer --version` now specify if current version provide extra speedup (meaning mypyc compilation whl) + +### Changed +- Build with static metadata using 'build' frontend +- Make the language detection stricter +- Optional: Module `md.py` can be compiled using Mypyc to provide an extra speedup up to 4x faster than v2.1 + +### Fixed +- CLI with opt --normalize fail when using full path for files +- TooManyAccentuatedPlugin induce false positive on the mess detection when too few alpha character have been fed to it +- Sphinx warnings when generating the documentation + +### Removed +- Coherence detector no longer return 'Simple English' instead return 'English' +- Coherence detector no longer return 'Classical Chinese' instead return 'Chinese' +- Breaking: Method `first()` and `best()` from CharsetMatch +- UTF-7 will no longer appear as "detected" without a recognized SIG/mark (is unreliable/conflict with ASCII) +- Breaking: Class aliases CharsetDetector, CharsetDoctor, CharsetNormalizerMatch and CharsetNormalizerMatches +- Breaking: Top-level function `normalize` +- Breaking: Properties `chaos_secondary_pass`, `coherence_non_latin` and `w_counter` from CharsetMatch +- Support for the backport `unicodedata2` + +## [3.0.0rc1](https://github.com/Ousret/charset_normalizer/compare/3.0.0b2...3.0.0rc1) (2022-10-18) + +### Added +- Extend the capability of explain=True when cp_isolation contains at most two entries (min one), will log in details of the Mess-detector results +- Support for alternative language frequency set in charset_normalizer.assets.FREQUENCIES +- Add parameter `language_threshold` in `from_bytes`, `from_path` and `from_fp` to adjust the minimum expected coherence ratio + +### Changed +- Build with static metadata using 'build' frontend +- Make the language detection stricter + +### Fixed +- CLI with opt --normalize fail when using full path for files +- TooManyAccentuatedPlugin induce false positive on the mess detection when too few alpha character have been fed to it + +### Removed +- Coherence detector no longer return 'Simple English' instead return 'English' +- Coherence detector no longer return 'Classical Chinese' instead return 'Chinese' + +## [3.0.0b2](https://github.com/Ousret/charset_normalizer/compare/3.0.0b1...3.0.0b2) (2022-08-21) + +### Added +- `normalizer --version` now specify if current version provide extra speedup (meaning mypyc compilation whl) + +### Removed +- Breaking: Method `first()` and `best()` from CharsetMatch +- UTF-7 will no longer appear as "detected" without a recognized SIG/mark (is unreliable/conflict with ASCII) + +### Fixed +- Sphinx warnings when generating the documentation + +## [3.0.0b1](https://github.com/Ousret/charset_normalizer/compare/2.1.0...3.0.0b1) (2022-08-15) + +### Changed +- Optional: Module `md.py` can be compiled using Mypyc to provide an extra speedup up to 4x faster than v2.1 + +### Removed +- Breaking: Class aliases CharsetDetector, CharsetDoctor, CharsetNormalizerMatch and CharsetNormalizerMatches +- Breaking: Top-level function `normalize` +- Breaking: Properties `chaos_secondary_pass`, `coherence_non_latin` and `w_counter` from CharsetMatch +- Support for the backport `unicodedata2` + +## [2.1.1](https://github.com/Ousret/charset_normalizer/compare/2.1.0...2.1.1) (2022-08-19) + +### Deprecated +- Function `normalize` scheduled for removal in 3.0 + +### Changed +- Removed useless call to decode in fn is_unprintable (#206) + +### Fixed +- Third-party library (i18n xgettext) crashing not recognizing utf_8 (PEP 263) with underscore from [@aleksandernovikov](https://github.com/aleksandernovikov) (#204) + +## [2.1.0](https://github.com/Ousret/charset_normalizer/compare/2.0.12...2.1.0) (2022-06-19) + +### Added +- Output the Unicode table version when running the CLI with `--version` (PR #194) + +### Changed +- Re-use decoded buffer for single byte character sets from [@nijel](https://github.com/nijel) (PR #175) +- Fixing some performance bottlenecks from [@deedy5](https://github.com/deedy5) (PR #183) + +### Fixed +- Workaround potential bug in cpython with Zero Width No-Break Space located in Arabic Presentation Forms-B, Unicode 1.1 not acknowledged as space (PR #175) +- CLI default threshold aligned with the API threshold from [@oleksandr-kuzmenko](https://github.com/oleksandr-kuzmenko) (PR #181) + +### Removed +- Support for Python 3.5 (PR #192) + +### Deprecated +- Use of backport unicodedata from `unicodedata2` as Python is quickly catching up, scheduled for removal in 3.0 (PR #194) + +## [2.0.12](https://github.com/Ousret/charset_normalizer/compare/2.0.11...2.0.12) (2022-02-12) + +### Fixed +- ASCII miss-detection on rare cases (PR #170) + +## [2.0.11](https://github.com/Ousret/charset_normalizer/compare/2.0.10...2.0.11) (2022-01-30) + +### Added +- Explicit support for Python 3.11 (PR #164) + +### Changed +- The logging behavior have been completely reviewed, now using only TRACE and DEBUG levels (PR #163 #165) + +## [2.0.10](https://github.com/Ousret/charset_normalizer/compare/2.0.9...2.0.10) (2022-01-04) + +### Fixed +- Fallback match entries might lead to UnicodeDecodeError for large bytes sequence (PR #154) + +### Changed +- Skipping the language-detection (CD) on ASCII (PR #155) + +## [2.0.9](https://github.com/Ousret/charset_normalizer/compare/2.0.8...2.0.9) (2021-12-03) + +### Changed +- Moderating the logging impact (since 2.0.8) for specific environments (PR #147) + +### Fixed +- Wrong logging level applied when setting kwarg `explain` to True (PR #146) + +## [2.0.8](https://github.com/Ousret/charset_normalizer/compare/2.0.7...2.0.8) (2021-11-24) +### Changed +- Improvement over Vietnamese detection (PR #126) +- MD improvement on trailing data and long foreign (non-pure latin) data (PR #124) +- Efficiency improvements in cd/alphabet_languages from [@adbar](https://github.com/adbar) (PR #122) +- call sum() without an intermediary list following PEP 289 recommendations from [@adbar](https://github.com/adbar) (PR #129) +- Code style as refactored by Sourcery-AI (PR #131) +- Minor adjustment on the MD around european words (PR #133) +- Remove and replace SRTs from assets / tests (PR #139) +- Initialize the library logger with a `NullHandler` by default from [@nmaynes](https://github.com/nmaynes) (PR #135) +- Setting kwarg `explain` to True will add provisionally (bounded to function lifespan) a specific stream handler (PR #135) + +### Fixed +- Fix large (misleading) sequence giving UnicodeDecodeError (PR #137) +- Avoid using too insignificant chunk (PR #137) + +### Added +- Add and expose function `set_logging_handler` to configure a specific StreamHandler from [@nmaynes](https://github.com/nmaynes) (PR #135) +- Add `CHANGELOG.md` entries, format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/) (PR #141) + +## [2.0.7](https://github.com/Ousret/charset_normalizer/compare/2.0.6...2.0.7) (2021-10-11) +### Added +- Add support for Kazakh (Cyrillic) language detection (PR #109) + +### Changed +- Further, improve inferring the language from a given single-byte code page (PR #112) +- Vainly trying to leverage PEP263 when PEP3120 is not supported (PR #116) +- Refactoring for potential performance improvements in loops from [@adbar](https://github.com/adbar) (PR #113) +- Various detection improvement (MD+CD) (PR #117) + +### Removed +- Remove redundant logging entry about detected language(s) (PR #115) + +### Fixed +- Fix a minor inconsistency between Python 3.5 and other versions regarding language detection (PR #117 #102) + +## [2.0.6](https://github.com/Ousret/charset_normalizer/compare/2.0.5...2.0.6) (2021-09-18) +### Fixed +- Unforeseen regression with the loss of the backward-compatibility with some older minor of Python 3.5.x (PR #100) +- Fix CLI crash when using --minimal output in certain cases (PR #103) + +### Changed +- Minor improvement to the detection efficiency (less than 1%) (PR #106 #101) + +## [2.0.5](https://github.com/Ousret/charset_normalizer/compare/2.0.4...2.0.5) (2021-09-14) +### Changed +- The project now comply with: flake8, mypy, isort and black to ensure a better overall quality (PR #81) +- The BC-support with v1.x was improved, the old staticmethods are restored (PR #82) +- The Unicode detection is slightly improved (PR #93) +- Add syntax sugar \_\_bool\_\_ for results CharsetMatches list-container (PR #91) + +### Removed +- The project no longer raise warning on tiny content given for detection, will be simply logged as warning instead (PR #92) + +### Fixed +- In some rare case, the chunks extractor could cut in the middle of a multi-byte character and could mislead the mess detection (PR #95) +- Some rare 'space' characters could trip up the UnprintablePlugin/Mess detection (PR #96) +- The MANIFEST.in was not exhaustive (PR #78) + +## [2.0.4](https://github.com/Ousret/charset_normalizer/compare/2.0.3...2.0.4) (2021-07-30) +### Fixed +- The CLI no longer raise an unexpected exception when no encoding has been found (PR #70) +- Fix accessing the 'alphabets' property when the payload contains surrogate characters (PR #68) +- The logger could mislead (explain=True) on detected languages and the impact of one MBCS match (PR #72) +- Submatch factoring could be wrong in rare edge cases (PR #72) +- Multiple files given to the CLI were ignored when publishing results to STDOUT. (After the first path) (PR #72) +- Fix line endings from CRLF to LF for certain project files (PR #67) + +### Changed +- Adjust the MD to lower the sensitivity, thus improving the global detection reliability (PR #69 #76) +- Allow fallback on specified encoding if any (PR #71) + +## [2.0.3](https://github.com/Ousret/charset_normalizer/compare/2.0.2...2.0.3) (2021-07-16) +### Changed +- Part of the detection mechanism has been improved to be less sensitive, resulting in more accurate detection results. Especially ASCII. (PR #63) +- According to the community wishes, the detection will fall back on ASCII or UTF-8 in a last-resort case. (PR #64) + +## [2.0.2](https://github.com/Ousret/charset_normalizer/compare/2.0.1...2.0.2) (2021-07-15) +### Fixed +- Empty/Too small JSON payload miss-detection fixed. Report from [@tseaver](https://github.com/tseaver) (PR #59) + +### Changed +- Don't inject unicodedata2 into sys.modules from [@akx](https://github.com/akx) (PR #57) + +## [2.0.1](https://github.com/Ousret/charset_normalizer/compare/2.0.0...2.0.1) (2021-07-13) +### Fixed +- Make it work where there isn't a filesystem available, dropping assets frequencies.json. Report from [@sethmlarson](https://github.com/sethmlarson). (PR #55) +- Using explain=False permanently disable the verbose output in the current runtime (PR #47) +- One log entry (language target preemptive) was not show in logs when using explain=True (PR #47) +- Fix undesired exception (ValueError) on getitem of instance CharsetMatches (PR #52) + +### Changed +- Public function normalize default args values were not aligned with from_bytes (PR #53) + +### Added +- You may now use charset aliases in cp_isolation and cp_exclusion arguments (PR #47) + +## [2.0.0](https://github.com/Ousret/charset_normalizer/compare/1.4.1...2.0.0) (2021-07-02) +### Changed +- 4x to 5 times faster than the previous 1.4.0 release. At least 2x faster than Chardet. +- Accent has been made on UTF-8 detection, should perform rather instantaneous. +- The backward compatibility with Chardet has been greatly improved. The legacy detect function returns an identical charset name whenever possible. +- The detection mechanism has been slightly improved, now Turkish content is detected correctly (most of the time) +- The program has been rewritten to ease the readability and maintainability. (+Using static typing)+ +- utf_7 detection has been reinstated. + +### Removed +- This package no longer require anything when used with Python 3.5 (Dropped cached_property) +- Removed support for these languages: Catalan, Esperanto, Kazakh, Baque, Volapük, Azeri, Galician, Nynorsk, Macedonian, and Serbocroatian. +- The exception hook on UnicodeDecodeError has been removed. + +### Deprecated +- Methods coherence_non_latin, w_counter, chaos_secondary_pass of the class CharsetMatch are now deprecated and scheduled for removal in v3.0 + +### Fixed +- The CLI output used the relative path of the file(s). Should be absolute. + +## [1.4.1](https://github.com/Ousret/charset_normalizer/compare/1.4.0...1.4.1) (2021-05-28) +### Fixed +- Logger configuration/usage no longer conflict with others (PR #44) + +## [1.4.0](https://github.com/Ousret/charset_normalizer/compare/1.3.9...1.4.0) (2021-05-21) +### Removed +- Using standard logging instead of using the package loguru. +- Dropping nose test framework in favor of the maintained pytest. +- Choose to not use dragonmapper package to help with gibberish Chinese/CJK text. +- Require cached_property only for Python 3.5 due to constraint. Dropping for every other interpreter version. +- Stop support for UTF-7 that does not contain a SIG. +- Dropping PrettyTable, replaced with pure JSON output in CLI. + +### Fixed +- BOM marker in a CharsetNormalizerMatch instance could be False in rare cases even if obviously present. Due to the sub-match factoring process. +- Not searching properly for the BOM when trying utf32/16 parent codec. + +### Changed +- Improving the package final size by compressing frequencies.json. +- Huge improvement over the larges payload. + +### Added +- CLI now produces JSON consumable output. +- Return ASCII if given sequences fit. Given reasonable confidence. + +## [1.3.9](https://github.com/Ousret/charset_normalizer/compare/1.3.8...1.3.9) (2021-05-13) + +### Fixed +- In some very rare cases, you may end up getting encode/decode errors due to a bad bytes payload (PR #40) + +## [1.3.8](https://github.com/Ousret/charset_normalizer/compare/1.3.7...1.3.8) (2021-05-12) + +### Fixed +- Empty given payload for detection may cause an exception if trying to access the `alphabets` property. (PR #39) + +## [1.3.7](https://github.com/Ousret/charset_normalizer/compare/1.3.6...1.3.7) (2021-05-12) + +### Fixed +- The legacy detect function should return UTF-8-SIG if sig is present in the payload. (PR #38) + +## [1.3.6](https://github.com/Ousret/charset_normalizer/compare/1.3.5...1.3.6) (2021-02-09) + +### Changed +- Amend the previous release to allow prettytable 2.0 (PR #35) + +## [1.3.5](https://github.com/Ousret/charset_normalizer/compare/1.3.4...1.3.5) (2021-02-08) + +### Fixed +- Fix error while using the package with a python pre-release interpreter (PR #33) + +### Changed +- Dependencies refactoring, constraints revised. + +### Added +- Add python 3.9 and 3.10 to the supported interpreters + +MIT License + +Copyright (c) 2025 TAHRI Ahmed R. + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/venv/lib/python3.11/site-packages/charset_normalizer-3.4.4.dist-info/RECORD b/venv/lib/python3.11/site-packages/charset_normalizer-3.4.4.dist-info/RECORD new file mode 100644 index 0000000..56958c4 --- /dev/null +++ b/venv/lib/python3.11/site-packages/charset_normalizer-3.4.4.dist-info/RECORD @@ -0,0 +1,35 @@ +../../../bin/normalizer,sha256=mweArewxZ0E0nFye0GmcJC3yhinHb5HwMIyyk1vfSvc,265 +charset_normalizer-3.4.4.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 +charset_normalizer-3.4.4.dist-info/METADATA,sha256=jVuUFBti8dav19YLvWissTihVdF2ozUY4KKMw7jdkBQ,37303 +charset_normalizer-3.4.4.dist-info/RECORD,, +charset_normalizer-3.4.4.dist-info/WHEEL,sha256=BvA_i88wcFUl5ehXLgmhwyDL4XPGrCKn6CTUA9axFDE,190 +charset_normalizer-3.4.4.dist-info/entry_points.txt,sha256=ADSTKrkXZ3hhdOVFi6DcUEHQRS0xfxDIE_pEz4wLIXA,65 +charset_normalizer-3.4.4.dist-info/licenses/LICENSE,sha256=bQ1Bv-FwrGx9wkjJpj4lTQ-0WmDVCoJX0K-SxuJJuIc,1071 +charset_normalizer-3.4.4.dist-info/top_level.txt,sha256=7ASyzePr8_xuZWJsnqJjIBtyV8vhEo0wBCv1MPRRi3Q,19 +charset_normalizer/__init__.py,sha256=OKRxRv2Zhnqk00tqkN0c1BtJjm165fWXLydE52IKuHc,1590 +charset_normalizer/__main__.py,sha256=yzYxMR-IhKRHYwcSlavEv8oGdwxsR89mr2X09qXGdps,109 +charset_normalizer/__pycache__/__init__.cpython-311.pyc,, +charset_normalizer/__pycache__/__main__.cpython-311.pyc,, +charset_normalizer/__pycache__/api.cpython-311.pyc,, +charset_normalizer/__pycache__/cd.cpython-311.pyc,, +charset_normalizer/__pycache__/constant.cpython-311.pyc,, +charset_normalizer/__pycache__/legacy.cpython-311.pyc,, +charset_normalizer/__pycache__/md.cpython-311.pyc,, +charset_normalizer/__pycache__/models.cpython-311.pyc,, +charset_normalizer/__pycache__/utils.cpython-311.pyc,, +charset_normalizer/__pycache__/version.cpython-311.pyc,, +charset_normalizer/api.py,sha256=V07i8aVeCD8T2fSia3C-fn0i9t8qQguEBhsqszg32Ns,22668 +charset_normalizer/cd.py,sha256=WKTo1HDb-H9HfCDc3Bfwq5jzS25Ziy9SE2a74SgTq88,12522 +charset_normalizer/cli/__init__.py,sha256=D8I86lFk2-py45JvqxniTirSj_sFyE6sjaY_0-G1shc,136 +charset_normalizer/cli/__main__.py,sha256=dMaXG6IJXRvqq8z2tig7Qb83-BpWTln55ooiku5_uvg,12646 +charset_normalizer/cli/__pycache__/__init__.cpython-311.pyc,, +charset_normalizer/cli/__pycache__/__main__.cpython-311.pyc,, +charset_normalizer/constant.py,sha256=7UVY4ldYhmQMHUdgQ_sgZmzcQ0xxYxpBunqSZ-XJZ8U,42713 +charset_normalizer/legacy.py,sha256=sYBzSpzsRrg_wF4LP536pG64BItw7Tqtc3SMQAHvFLM,2731 +charset_normalizer/md.cpython-311-x86_64-linux-gnu.so,sha256=vmQPHNPc6Z0rbXxiiMeoCQxfjjh5z8umtRgKpBckk7E,15912 +charset_normalizer/md.py,sha256=-_oN3h3_X99nkFfqamD3yu45DC_wfk5odH0Tr_CQiXs,20145 +charset_normalizer/md__mypyc.cpython-311-x86_64-linux-gnu.so,sha256=83X9F2ayDPRojhPPi7Dpm2LS0plQBG4B12R1GSri2lw,282232 +charset_normalizer/models.py,sha256=lKXhOnIPtiakbK3i__J9wpOfzx3JDTKj7Dn3Rg0VaRI,12394 +charset_normalizer/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +charset_normalizer/utils.py,sha256=sTejPgrdlNsKNucZfJCxJ95lMTLA0ShHLLE3n5wpT9Q,12170 +charset_normalizer/version.py,sha256=nKE4qBNk5WA4LIJ_yIH_aSDfvtsyizkWMg-PUG-UZVk,115 diff --git a/venv/lib/python3.11/site-packages/charset_normalizer-3.4.4.dist-info/WHEEL b/venv/lib/python3.11/site-packages/charset_normalizer-3.4.4.dist-info/WHEEL new file mode 100644 index 0000000..35bcd5d --- /dev/null +++ b/venv/lib/python3.11/site-packages/charset_normalizer-3.4.4.dist-info/WHEEL @@ -0,0 +1,7 @@ +Wheel-Version: 1.0 +Generator: setuptools (80.9.0) +Root-Is-Purelib: false +Tag: cp311-cp311-manylinux_2_17_x86_64 +Tag: cp311-cp311-manylinux2014_x86_64 +Tag: cp311-cp311-manylinux_2_28_x86_64 + diff --git a/venv/lib/python3.11/site-packages/charset_normalizer-3.4.4.dist-info/entry_points.txt b/venv/lib/python3.11/site-packages/charset_normalizer-3.4.4.dist-info/entry_points.txt new file mode 100644 index 0000000..65619e7 --- /dev/null +++ b/venv/lib/python3.11/site-packages/charset_normalizer-3.4.4.dist-info/entry_points.txt @@ -0,0 +1,2 @@ +[console_scripts] +normalizer = charset_normalizer.cli:cli_detect diff --git a/venv/lib/python3.11/site-packages/charset_normalizer-3.4.4.dist-info/licenses/LICENSE b/venv/lib/python3.11/site-packages/charset_normalizer-3.4.4.dist-info/licenses/LICENSE new file mode 100644 index 0000000..9725772 --- /dev/null +++ b/venv/lib/python3.11/site-packages/charset_normalizer-3.4.4.dist-info/licenses/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2025 TAHRI Ahmed R. + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/venv/lib/python3.11/site-packages/charset_normalizer-3.4.4.dist-info/top_level.txt b/venv/lib/python3.11/site-packages/charset_normalizer-3.4.4.dist-info/top_level.txt new file mode 100644 index 0000000..66958f0 --- /dev/null +++ b/venv/lib/python3.11/site-packages/charset_normalizer-3.4.4.dist-info/top_level.txt @@ -0,0 +1 @@ +charset_normalizer diff --git a/venv/lib/python3.11/site-packages/charset_normalizer/__init__.py b/venv/lib/python3.11/site-packages/charset_normalizer/__init__.py new file mode 100644 index 0000000..0d3a379 --- /dev/null +++ b/venv/lib/python3.11/site-packages/charset_normalizer/__init__.py @@ -0,0 +1,48 @@ +""" +Charset-Normalizer +~~~~~~~~~~~~~~ +The Real First Universal Charset Detector. +A library that helps you read text from an unknown charset encoding. +Motivated by chardet, This package is trying to resolve the issue by taking a new approach. +All IANA character set names for which the Python core library provides codecs are supported. + +Basic usage: + >>> from charset_normalizer import from_bytes + >>> results = from_bytes('Bсеки човек има право на образование. Oбразованието!'.encode('utf_8')) + >>> best_guess = results.best() + >>> str(best_guess) + 'Bсеки човек има право на образование. Oбразованието!' + +Others methods and usages are available - see the full documentation +at . +:copyright: (c) 2021 by Ahmed TAHRI +:license: MIT, see LICENSE for more details. +""" + +from __future__ import annotations + +import logging + +from .api import from_bytes, from_fp, from_path, is_binary +from .legacy import detect +from .models import CharsetMatch, CharsetMatches +from .utils import set_logging_handler +from .version import VERSION, __version__ + +__all__ = ( + "from_fp", + "from_path", + "from_bytes", + "is_binary", + "detect", + "CharsetMatch", + "CharsetMatches", + "__version__", + "VERSION", + "set_logging_handler", +) + +# Attach a NullHandler to the top level logger by default +# https://docs.python.org/3.3/howto/logging.html#configuring-logging-for-a-library + +logging.getLogger("charset_normalizer").addHandler(logging.NullHandler()) diff --git a/venv/lib/python3.11/site-packages/charset_normalizer/__main__.py b/venv/lib/python3.11/site-packages/charset_normalizer/__main__.py new file mode 100644 index 0000000..e0e76f7 --- /dev/null +++ b/venv/lib/python3.11/site-packages/charset_normalizer/__main__.py @@ -0,0 +1,6 @@ +from __future__ import annotations + +from .cli import cli_detect + +if __name__ == "__main__": + cli_detect() diff --git a/venv/lib/python3.11/site-packages/charset_normalizer/__pycache__/__init__.cpython-311.pyc b/venv/lib/python3.11/site-packages/charset_normalizer/__pycache__/__init__.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..17690fb884b08f4f638b71c14c4b428b23cfbab9 GIT binary patch literal 1917 zcmcIk&1)n@6tDTnOr|Hvn#2zf#8P1=Bb(`bfXc82vTH&HHi;zBLtomO?#gtV>JO@_ zCyob+d+|^3>S;yx5{1Pe8vli!C1B{&E}r%l*xTa4SKTxDU<014sebcbRlRz@_f^#ePc_W`we1R2=f?c#nSkW6XM!b?y z^2$cp8#P8@zi5|O#nTKe<;$$k(hs6H0mFCe7dbqE(!&Ta(U zBh3Apa_yTdL)&pE-lBxzRhJ8iKl9x#-AlJ^DsSN(#}zmv z)*k6l46NimIE`fhcZ+~^DVS6nBBDx9l0CIeuuu0f2}2$b%K?Cl;nwoTa(XYZB;^>K z$3F3>z`Fs*`;Kcl=~bWhq!R$XfYWoY;F_*$!%@IWErAK_i6{&M4saWqc83Vp!jS-s zO$}qbw6v5tJn+)=&!dc8PpPHbX1gb;7%G525t9Ocd}(i{cBlVs{3!k{KEnO);^X)i zCE)ld{yjd#@t^&J_z>2Par}ppkK>=ym0#17hp>1QKWgC3>z4cXV2`er0JmHNv`TWV-c zD+qhs?KrZDXRJD2m|K`v1-I;YP_aA9Yg;X?$y|&2f;RDbYv)!9;9l$Q%EtCeT4SCn zDJW`yC>q)`)u#1aQYF40WVpn}Gu7?&Vxp;b$;u-sr~Gc1R8l4+(n%_=Fx##V9S1j* z;7(}7dOjH&wB|aImXl0emZ*S}(@^v#3pyR>5z~R#G0H)${Q1h(c58DZshXzhaR`xV z)-?`KBjRO6Mid!Uq@sv=J$Y4;2}Q;g83U3`y&Svx8%fzTA^xVBXr{Rv$%s?aLfcwN6kg9!~xic=<2B*^QC_ literal 0 HcmV?d00001 diff --git a/venv/lib/python3.11/site-packages/charset_normalizer/__pycache__/__main__.cpython-311.pyc b/venv/lib/python3.11/site-packages/charset_normalizer/__pycache__/__main__.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..f882fef1b7d5136d46a0ccfac81a14055f469989 GIT binary patch literal 408 zcmY+8F;4<96vx}^VF-vjy16kxC9cLqM5u!YC%t{p9Nw}!Jaw>I|NtJtPXyz@$tR!m4QBcBx+ zGhA859%_ZG#Mtw|51eGo5nwX{q$}hKILi$@e4#beX!AsSv61wJJI^hrW^|Jzw4=0E zwp%w*LWj~0sa74DjC?P)myKqVrpn8D!lOR#%9KVu?o#QQjh*3IjisaeX&T9BQ@k>< z7-)IzD)3=GdwLJYieQZA=zMmV3v@O+%mpdGkAFyYMym7hWODb~dTUL#Yei6a3brdl FzkjtmaIydZ literal 0 HcmV?d00001 diff --git a/venv/lib/python3.11/site-packages/charset_normalizer/__pycache__/api.cpython-311.pyc b/venv/lib/python3.11/site-packages/charset_normalizer/__pycache__/api.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..15b3e32f6799d47786a54ceac4250ed5edaa32f1 GIT binary patch literal 20799 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 literal 0 HcmV?d00001 diff --git a/venv/lib/python3.11/site-packages/charset_normalizer/__pycache__/cd.cpython-311.pyc b/venv/lib/python3.11/site-packages/charset_normalizer/__pycache__/cd.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..51701e4620362633fef6904d14293ed6f84cb303 GIT binary patch literal 15882 zcmd6Od2Ae4nqO7l%`UQ=6iM+CSvVvLo$`Yp; za|ha(@+er%WGChxMwrEVhF&`u?q()ok_})W0pk2uMbtvQg$N)L2#NC-9eV&nSRna* zuezIEO-ZxC{F7qwRn@ESy?W<&{JyV$QC?og;rRQ(+p+&O$Z`Lj9`c9Fy5Yb15zlcS zaS|u-aW276@I2i+;*JRiuFkkK;hJ!`v58)FtXC z>JtqU4S3fl1@E~g8l`@z64xdNC;NVmW`CCN15s4nbJ_DI_B@kr*ABX7qLV8=ul_kk z;4}PNhcqDV-a*^q=cGYtNNT$0o)D$|QVZJCDh*4mxVA|Lq)uGhrGruzt{qgbw70Zg z)Nn{TEcM=Vm$bK2a$MuWN4}!Zhj}v)NhVY2NII5Es^fUBx{!=2azaj~Bk?nGG$qLj za=oWhbICNj^~aUD$!H`xBY#Dm2)oU|+1JKieSK{F^o6l&rti|#$?;QHa94Nv)cCpA zPn{c^y!QGluUviY`q-Jt(^p>~ziw7tzj}4@+Lcq6FHc^xN{*SniSt%Dd`*n0lj@v0 z8;izLb87r99->iMRb#j1NhOlJA%iA#IyECJaxyAkiKNjO6%DCCxdA6T+mP{X> zj-_XE!d-jBF+(fbT%Uj|Ar z4eIA-fqw4r|Pz~aQeb)4benOSgV94pkD9Y;F2ot1IkC~0%a7hM^baw=U}RHC#^?u>hp ze{eLttBA&JuSN3DaY}Q>ecyYVSKJb=8TWCJ)Af$yj-$R%R4SV<=eVdd>R|6Z*7Jv+ z2eEWbfrwl3EP1CLQsAENzV{4g-zfGkW6KEhXUjw!ud#U-BdVH;#%P_1xrHLKwW*4+ zq!#LKL{2wIaXB96lwzWv>0i())vmZA22@#2S}#?VS|Eyxi%%y8W>N`x;Jt{F#&#M=+&wirJ1`ZC$1z-eiRkRWZ8>>+ zARe0AiYwjOGRWB0thBJ5MDS+y3OV)C;lA2Z$2nYrXGMI`c8O4^X9J|wh4 zMe*cGr5z7u?X!nL8N$m(Dsl`w={t1%H$KkSyd2ZL-G;Y&i{str`NtJCTJ2fA;+#=& zPV=36QnA~p=+wGK){Y{t z^+|cv!vo9JdU>-^-n_+?yE|F3#Aj=2KYHt@Z+$GUyt;Dwk8l3jO}!>;)P$GZn}N_4 zSLW}0+;e!{t@n%=JtIq3H-pVuuqzv?dlC$<4(P#SM)26WtOZZw%7kB?!S9{~Dz_ZANiUlI_Wmt5 z-hEB0;#*3-c6tQQw;Yl!&g1qdoixbhvq~%hiD4~v+s>n%1a8fL^C!5WeYe0DOM#mO ziD2hF;JXKY5Bqw-0q*O>Q}2SSSOR29cxQ&YMO=VWc4zn%d~fHGDUlI8$8$;kLEnRe z8J>3d{75lxizTPQT)>gykhXKQ>%=(~kMG6OGh)Qf?<}4cb}6*_OgFY_!dl0sCo(%L zC#A4kA--e!3zeC^{H5AHRBdsk0v1dnLJ zBiT^>qmZ}}5?AW

    &Jn(Lz1hP|ZU(wteX6cld}~G;Urj?-zK9 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 literal 0 HcmV?d00001 diff --git a/venv/lib/python3.11/site-packages/charset_normalizer/__pycache__/constant.cpython-311.pyc b/venv/lib/python3.11/site-packages/charset_normalizer/__pycache__/constant.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..64ab64d37b89c9b224e63d854cdd3b6568882915 GIT binary patch literal 45733 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

    e?xyCR3uW%6&${Z)biI4bee|&V(mDOX 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 literal 0 HcmV?d00001 diff --git a/venv/lib/python3.11/site-packages/charset_normalizer/__pycache__/legacy.cpython-311.pyc b/venv/lib/python3.11/site-packages/charset_normalizer/__pycache__/legacy.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..4e78d99d4f14254fde9826e9ea4e61ec9ee22142 GIT binary patch literal 3359 zcmaJDZEO_Bb@q1eZhhXf0fU2sO$SH`*Mcv^YC};PL(Dml1VgcD%SCjxz8#+z@5gy| z&gL#>$wd6PNc?c5NYJK8{0SkVl~7fw{n=Eh+Dff-Mvi)22??p{k4XJ-5y>CaAAK`> zA3g+~n|u4_&CGjm-h1=reUeNj5VZfkv}D}{>|cD)YS9pp9=!+1bz~w_vXLWYC5ht^ zJL1S$*-^5J7|V9liDhGeD`wP=J8D)Hc+Bo`64`{)o9&elk?D5W8@DwlnN3P4g5E%; zdKH;HBzap#=q~)jmhJ07=5}+3x$SB++iwm`qtxJ+d@3acy@u<0%wU%1`l(2eoVjo| zqfea7OuTh!>Wx4??v`MYvTRWIODWuun4_Mf&z2bB8wMv%9zS;?Gow$OId?8IefG@M ziOkeQCfGJ}=8Qgl`uN*#>(iMZo#!-Q)H72m5c7nUW4TbZ5H>ZH9*x5IIwB}5nJ61M z4^|?w8F>|`rVN-Ouqa?LfyLn@YLGZb{G!b`*K)#V6j$(+=aN7rZq73;Hy_AA4OH83 z^FJz5B9(4@cDifNvN#4knMhhjH1R(-*8&y6IO}hijs*tHX75 zM>SbZzMrhCxF-5~3!%@oxJ(8rccad&6BP~(w)^v5(KdBT#8E@hfimlPb`V>DgXMk7 zV>yUX!iv<*MPSfsJ%IEgBt6;y>UG3;z%*MWavMf>+Z38%?eGNWN@nENW=^ebh{f9| zszh!nolyt74d~tWuv<>|=pzWDn{qczLJV|nwF+Wd3rC3cb?~{!ZP4&;TTB02Y-?xM zRMAp+wtt#TboYSS=DW?6}ci`iC5%H?Q^@5 z8C_9;x(%p2(nK?33&LZRuWeIdZG0sPYZIml^tQdqkN^drSS5DlrAo}~Sr93Zey5_C zi6x2dht=(KnY~3sN4nzW2@5jZR0BQ>0;N&ls+A#_S7Jg}#Y`>;?@(wHUC*%k#t~ON8Qr=lg;OJ}~7m?71Di z1fQbo7YhZCGGc;m*kUOmY-Zl_@m$f(@y7uJZju5eIfE}VTyvA!MIT7a!;Y1wFpW!I z5u{S@61M{}e9JB!#E@ornih62y)7Vk&89W1)4{b~qi#)G$-NX`r}!dWZ|E~VVBCZS;V#i9ke!@>P=!J~YjnePvE@;x>! zpF+x~U}c&YX7cfikEMg~amoVi>84D9613d{4LgZEb0!pC4c zZWM!31H6&<*ik$c#Lv46E(A@0@?p$3#`Ayw8*l#^e~sU!AZqwI%L<}JHm4t%%>Ux& zy!~~YzQ89H-M8{7neuy2w{XC7Vrp9;!y#!*EV<-aZlKtf&jMwEl>8uJ`IhU$3z;K9 zPg^DWJYOvegbbw~4HT|BRRxb(0?us<38G*%&ky8T&!N2LqWtAa#VNnHbQcFB00N12 z_6Ws%{+cvhMtAZhvCw+-Wf<@T?tcnT)GGRB7^%J0?_YWM>bngjM-vZJt*-g^{NG*v z&E-ESfB5mA-}&P^pI!X?;`*`ajbqd6ugq+`GE>w1uzw{-dJ!a0irQc%1ouC$&?!Up2tua0K**PQ6S0{ zx|?JC)ki#PxY0P5HYUR%<-4=pYB8?BYT9Sba6DD_^5OfFZAm{C@&y$dV-0(cW5j ze~7+ads?rfp;~u;h<4SwdmSCCJ*|UDm8}gFllIh=@7B6|Ly@CshWtYbT=M^bIQstp3}$KC literal 0 HcmV?d00001 diff --git a/venv/lib/python3.11/site-packages/charset_normalizer/__pycache__/md.cpython-311.pyc b/venv/lib/python3.11/site-packages/charset_normalizer/__pycache__/md.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..eccd75d7a8600ff99cc54e47b8903dabfc0b1f1e GIT binary patch literal 27553 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 literal 0 HcmV?d00001 diff --git a/venv/lib/python3.11/site-packages/charset_normalizer/__pycache__/models.cpython-311.pyc b/venv/lib/python3.11/site-packages/charset_normalizer/__pycache__/models.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..31898b36dac1b88fdbdefd2d8845bdeb1a226725 GIT binary patch literal 18572 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

    33W7Y>=7%^`f?&Hcm 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 Z^s8K8%`?Cg8m$k%X6fH-kjs$l{{kYAOaK4? literal 0 HcmV?d00001 diff --git a/venv/lib/python3.11/site-packages/charset_normalizer/__pycache__/utils.cpython-311.pyc b/venv/lib/python3.11/site-packages/charset_normalizer/__pycache__/utils.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..0a2d5e5f187dad049e054db87b62c28ad3e7ea79 GIT binary patch literal 15665 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 literal 0 HcmV?d00001 diff --git a/venv/lib/python3.11/site-packages/charset_normalizer/__pycache__/version.cpython-311.pyc b/venv/lib/python3.11/site-packages/charset_normalizer/__pycache__/version.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..7d1eab86b04dbe45a7530e735af5a82bc311dde6 GIT binary patch literal 414 zcmYjMJx{|h5VezrR*s5TI(4aF>d=^~9T5mY2bLmHi6M*S#-@!(;>b<|?bLq(BNGVm zX8<9AG9fXsRq9qT;7}^{`FtPt-MhPoav1@QpWW0~+J5E13g*&*^JDGY00vyZATt6O z8m<8WGhLILcZF5@x@CoX2*8uROSl%ZdZ4~B*+QM`SSVggxm3Q0(086thnY>INF+4T zZ)#$-oVL?mK&M;Z$clt8;SrJ{LM}$hNOD4CK3irJ@=v3GEfoiTk`>Q8XT6it?jxAz z%nO2tBINjr%7jJ~hvUOI#(h5s{Akb!y%?uFN^#)#aXe0jB5FC!CRTpJ8!`1R>3}Qj z4XIQ-A(4#?RDDI&+oKm$dqcHpF+bAQ9KWGSa5ew{ literal 0 HcmV?d00001 diff --git a/venv/lib/python3.11/site-packages/charset_normalizer/api.py b/venv/lib/python3.11/site-packages/charset_normalizer/api.py new file mode 100644 index 0000000..ebd9639 --- /dev/null +++ b/venv/lib/python3.11/site-packages/charset_normalizer/api.py @@ -0,0 +1,669 @@ +from __future__ import annotations + +import logging +from os import PathLike +from typing import BinaryIO + +from .cd import ( + coherence_ratio, + encoding_languages, + mb_encoding_languages, + merge_coherence_ratios, +) +from .constant import IANA_SUPPORTED, TOO_BIG_SEQUENCE, TOO_SMALL_SEQUENCE, TRACE +from .md import mess_ratio +from .models import CharsetMatch, CharsetMatches +from .utils import ( + any_specified_encoding, + cut_sequence_chunks, + iana_name, + identify_sig_or_bom, + is_cp_similar, + is_multi_byte_encoding, + should_strip_sig_or_bom, +) + +logger = logging.getLogger("charset_normalizer") +explain_handler = logging.StreamHandler() +explain_handler.setFormatter( + logging.Formatter("%(asctime)s | %(levelname)s | %(message)s") +) + + +def from_bytes( + sequences: bytes | bytearray, + steps: int = 5, + chunk_size: int = 512, + threshold: float = 0.2, + cp_isolation: list[str] | None = None, + cp_exclusion: list[str] | None = None, + preemptive_behaviour: bool = True, + explain: bool = False, + language_threshold: float = 0.1, + enable_fallback: bool = True, +) -> CharsetMatches: + """ + Given a raw bytes sequence, return the best possibles charset usable to render str objects. + If there is no results, it is a strong indicator that the source is binary/not text. + By default, the process will extract 5 blocks of 512o each to assess the mess and coherence of a given sequence. + And will give up a particular code page after 20% of measured mess. Those criteria are customizable at will. + + The preemptive behavior DOES NOT replace the traditional detection workflow, it prioritize a particular code page + but never take it for granted. Can improve the performance. + + You may want to focus your attention to some code page or/and not others, use cp_isolation and cp_exclusion for that + purpose. + + This function will strip the SIG in the payload/sequence every time except on UTF-16, UTF-32. + By default the library does not setup any handler other than the NullHandler, if you choose to set the 'explain' + toggle to True it will alter the logger configuration to add a StreamHandler that is suitable for debugging. + Custom logging format and handler can be set manually. + """ + + if not isinstance(sequences, (bytearray, bytes)): + raise TypeError( + "Expected object of type bytes or bytearray, got: {}".format( + type(sequences) + ) + ) + + if explain: + previous_logger_level: int = logger.level + logger.addHandler(explain_handler) + logger.setLevel(TRACE) + + length: int = len(sequences) + + if length == 0: + logger.debug("Encoding detection on empty bytes, assuming utf_8 intention.") + if explain: # Defensive: ensure exit path clean handler + logger.removeHandler(explain_handler) + logger.setLevel(previous_logger_level or logging.WARNING) + return CharsetMatches([CharsetMatch(sequences, "utf_8", 0.0, False, [], "")]) + + if cp_isolation is not None: + logger.log( + TRACE, + "cp_isolation is set. use this flag for debugging purpose. " + "limited list of encoding allowed : %s.", + ", ".join(cp_isolation), + ) + cp_isolation = [iana_name(cp, False) for cp in cp_isolation] + else: + cp_isolation = [] + + if cp_exclusion is not None: + logger.log( + TRACE, + "cp_exclusion is set. use this flag for debugging purpose. " + "limited list of encoding excluded : %s.", + ", ".join(cp_exclusion), + ) + cp_exclusion = [iana_name(cp, False) for cp in cp_exclusion] + else: + cp_exclusion = [] + + if length <= (chunk_size * steps): + logger.log( + TRACE, + "override steps (%i) and chunk_size (%i) as content does not fit (%i byte(s) given) parameters.", + steps, + chunk_size, + length, + ) + steps = 1 + chunk_size = length + + if steps > 1 and length / steps < chunk_size: + chunk_size = int(length / steps) + + is_too_small_sequence: bool = len(sequences) < TOO_SMALL_SEQUENCE + is_too_large_sequence: bool = len(sequences) >= TOO_BIG_SEQUENCE + + if is_too_small_sequence: + logger.log( + TRACE, + "Trying to detect encoding from a tiny portion of ({}) byte(s).".format( + length + ), + ) + elif is_too_large_sequence: + logger.log( + TRACE, + "Using lazy str decoding because the payload is quite large, ({}) byte(s).".format( + length + ), + ) + + prioritized_encodings: list[str] = [] + + specified_encoding: str | None = ( + any_specified_encoding(sequences) if preemptive_behaviour else None + ) + + if specified_encoding is not None: + prioritized_encodings.append(specified_encoding) + logger.log( + TRACE, + "Detected declarative mark in sequence. Priority +1 given for %s.", + specified_encoding, + ) + + tested: set[str] = set() + tested_but_hard_failure: list[str] = [] + tested_but_soft_failure: list[str] = [] + + fallback_ascii: CharsetMatch | None = None + fallback_u8: CharsetMatch | None = None + fallback_specified: CharsetMatch | None = None + + results: CharsetMatches = CharsetMatches() + + early_stop_results: CharsetMatches = CharsetMatches() + + sig_encoding, sig_payload = identify_sig_or_bom(sequences) + + if sig_encoding is not None: + prioritized_encodings.append(sig_encoding) + logger.log( + TRACE, + "Detected a SIG or BOM mark on first %i byte(s). Priority +1 given for %s.", + len(sig_payload), + sig_encoding, + ) + + prioritized_encodings.append("ascii") + + if "utf_8" not in prioritized_encodings: + prioritized_encodings.append("utf_8") + + for encoding_iana in prioritized_encodings + IANA_SUPPORTED: + if cp_isolation and encoding_iana not in cp_isolation: + continue + + if cp_exclusion and encoding_iana in cp_exclusion: + continue + + if encoding_iana in tested: + continue + + tested.add(encoding_iana) + + decoded_payload: str | None = None + bom_or_sig_available: bool = sig_encoding == encoding_iana + strip_sig_or_bom: bool = bom_or_sig_available and should_strip_sig_or_bom( + encoding_iana + ) + + if encoding_iana in {"utf_16", "utf_32"} and not bom_or_sig_available: + logger.log( + TRACE, + "Encoding %s won't be tested as-is because it require a BOM. Will try some sub-encoder LE/BE.", + encoding_iana, + ) + continue + if encoding_iana in {"utf_7"} and not bom_or_sig_available: + logger.log( + TRACE, + "Encoding %s won't be tested as-is because detection is unreliable without BOM/SIG.", + encoding_iana, + ) + continue + + try: + is_multi_byte_decoder: bool = is_multi_byte_encoding(encoding_iana) + except (ModuleNotFoundError, ImportError): + logger.log( + TRACE, + "Encoding %s does not provide an IncrementalDecoder", + encoding_iana, + ) + continue + + try: + if is_too_large_sequence and is_multi_byte_decoder is False: + str( + ( + sequences[: int(50e4)] + if strip_sig_or_bom is False + else sequences[len(sig_payload) : int(50e4)] + ), + encoding=encoding_iana, + ) + else: + decoded_payload = str( + ( + sequences + if strip_sig_or_bom is False + else sequences[len(sig_payload) :] + ), + encoding=encoding_iana, + ) + except (UnicodeDecodeError, LookupError) as e: + if not isinstance(e, LookupError): + logger.log( + TRACE, + "Code page %s does not fit given bytes sequence at ALL. %s", + encoding_iana, + str(e), + ) + tested_but_hard_failure.append(encoding_iana) + continue + + similar_soft_failure_test: bool = False + + for encoding_soft_failed in tested_but_soft_failure: + if is_cp_similar(encoding_iana, encoding_soft_failed): + similar_soft_failure_test = True + break + + if similar_soft_failure_test: + logger.log( + TRACE, + "%s is deemed too similar to code page %s and was consider unsuited already. Continuing!", + encoding_iana, + encoding_soft_failed, + ) + continue + + r_ = range( + 0 if not bom_or_sig_available else len(sig_payload), + length, + int(length / steps), + ) + + multi_byte_bonus: bool = ( + is_multi_byte_decoder + and decoded_payload is not None + and len(decoded_payload) < length + ) + + if multi_byte_bonus: + logger.log( + TRACE, + "Code page %s is a multi byte encoding table and it appear that at least one character " + "was encoded using n-bytes.", + encoding_iana, + ) + + max_chunk_gave_up: int = int(len(r_) / 4) + + max_chunk_gave_up = max(max_chunk_gave_up, 2) + early_stop_count: int = 0 + lazy_str_hard_failure = False + + md_chunks: list[str] = [] + md_ratios = [] + + try: + for chunk in cut_sequence_chunks( + sequences, + encoding_iana, + r_, + chunk_size, + bom_or_sig_available, + strip_sig_or_bom, + sig_payload, + is_multi_byte_decoder, + decoded_payload, + ): + md_chunks.append(chunk) + + md_ratios.append( + mess_ratio( + chunk, + threshold, + explain is True and 1 <= len(cp_isolation) <= 2, + ) + ) + + if md_ratios[-1] >= threshold: + early_stop_count += 1 + + if (early_stop_count >= max_chunk_gave_up) or ( + bom_or_sig_available and strip_sig_or_bom is False + ): + break + except ( + UnicodeDecodeError + ) as e: # Lazy str loading may have missed something there + logger.log( + TRACE, + "LazyStr Loading: After MD chunk decode, code page %s does not fit given bytes sequence at ALL. %s", + encoding_iana, + str(e), + ) + early_stop_count = max_chunk_gave_up + lazy_str_hard_failure = True + + # We might want to check the sequence again with the whole content + # Only if initial MD tests passes + if ( + not lazy_str_hard_failure + and is_too_large_sequence + and not is_multi_byte_decoder + ): + try: + sequences[int(50e3) :].decode(encoding_iana, errors="strict") + except UnicodeDecodeError as e: + logger.log( + TRACE, + "LazyStr Loading: After final lookup, code page %s does not fit given bytes sequence at ALL. %s", + encoding_iana, + str(e), + ) + tested_but_hard_failure.append(encoding_iana) + continue + + mean_mess_ratio: float = sum(md_ratios) / len(md_ratios) if md_ratios else 0.0 + if mean_mess_ratio >= threshold or early_stop_count >= max_chunk_gave_up: + tested_but_soft_failure.append(encoding_iana) + logger.log( + TRACE, + "%s was excluded because of initial chaos probing. Gave up %i time(s). " + "Computed mean chaos is %f %%.", + encoding_iana, + early_stop_count, + round(mean_mess_ratio * 100, ndigits=3), + ) + # Preparing those fallbacks in case we got nothing. + if ( + enable_fallback + and encoding_iana + in ["ascii", "utf_8", specified_encoding, "utf_16", "utf_32"] + and not lazy_str_hard_failure + ): + fallback_entry = CharsetMatch( + sequences, + encoding_iana, + threshold, + bom_or_sig_available, + [], + decoded_payload, + preemptive_declaration=specified_encoding, + ) + if encoding_iana == specified_encoding: + fallback_specified = fallback_entry + elif encoding_iana == "ascii": + fallback_ascii = fallback_entry + else: + fallback_u8 = fallback_entry + continue + + logger.log( + TRACE, + "%s passed initial chaos probing. Mean measured chaos is %f %%", + encoding_iana, + round(mean_mess_ratio * 100, ndigits=3), + ) + + if not is_multi_byte_decoder: + target_languages: list[str] = encoding_languages(encoding_iana) + else: + target_languages = mb_encoding_languages(encoding_iana) + + if target_languages: + logger.log( + TRACE, + "{} should target any language(s) of {}".format( + encoding_iana, str(target_languages) + ), + ) + + cd_ratios = [] + + # We shall skip the CD when its about ASCII + # Most of the time its not relevant to run "language-detection" on it. + if encoding_iana != "ascii": + for chunk in md_chunks: + chunk_languages = coherence_ratio( + chunk, + language_threshold, + ",".join(target_languages) if target_languages else None, + ) + + cd_ratios.append(chunk_languages) + + cd_ratios_merged = merge_coherence_ratios(cd_ratios) + + if cd_ratios_merged: + logger.log( + TRACE, + "We detected language {} using {}".format( + cd_ratios_merged, encoding_iana + ), + ) + + current_match = CharsetMatch( + sequences, + encoding_iana, + mean_mess_ratio, + bom_or_sig_available, + cd_ratios_merged, + ( + decoded_payload + if ( + is_too_large_sequence is False + or encoding_iana in [specified_encoding, "ascii", "utf_8"] + ) + else None + ), + preemptive_declaration=specified_encoding, + ) + + results.append(current_match) + + if ( + encoding_iana in [specified_encoding, "ascii", "utf_8"] + and mean_mess_ratio < 0.1 + ): + # If md says nothing to worry about, then... stop immediately! + if mean_mess_ratio == 0.0: + logger.debug( + "Encoding detection: %s is most likely the one.", + current_match.encoding, + ) + if explain: # Defensive: ensure exit path clean handler + logger.removeHandler(explain_handler) + logger.setLevel(previous_logger_level) + return CharsetMatches([current_match]) + + early_stop_results.append(current_match) + + if ( + len(early_stop_results) + and (specified_encoding is None or specified_encoding in tested) + and "ascii" in tested + and "utf_8" in tested + ): + probable_result: CharsetMatch = early_stop_results.best() # type: ignore[assignment] + logger.debug( + "Encoding detection: %s is most likely the one.", + probable_result.encoding, + ) + if explain: # Defensive: ensure exit path clean handler + logger.removeHandler(explain_handler) + logger.setLevel(previous_logger_level) + + return CharsetMatches([probable_result]) + + if encoding_iana == sig_encoding: + logger.debug( + "Encoding detection: %s is most likely the one as we detected a BOM or SIG within " + "the beginning of the sequence.", + encoding_iana, + ) + if explain: # Defensive: ensure exit path clean handler + logger.removeHandler(explain_handler) + logger.setLevel(previous_logger_level) + return CharsetMatches([results[encoding_iana]]) + + if len(results) == 0: + if fallback_u8 or fallback_ascii or fallback_specified: + logger.log( + TRACE, + "Nothing got out of the detection process. Using ASCII/UTF-8/Specified fallback.", + ) + + if fallback_specified: + logger.debug( + "Encoding detection: %s will be used as a fallback match", + fallback_specified.encoding, + ) + results.append(fallback_specified) + elif ( + (fallback_u8 and fallback_ascii is None) + or ( + fallback_u8 + and fallback_ascii + and fallback_u8.fingerprint != fallback_ascii.fingerprint + ) + or (fallback_u8 is not None) + ): + logger.debug("Encoding detection: utf_8 will be used as a fallback match") + results.append(fallback_u8) + elif fallback_ascii: + logger.debug("Encoding detection: ascii will be used as a fallback match") + results.append(fallback_ascii) + + if results: + logger.debug( + "Encoding detection: Found %s as plausible (best-candidate) for content. With %i alternatives.", + results.best().encoding, # type: ignore + len(results) - 1, + ) + else: + logger.debug("Encoding detection: Unable to determine any suitable charset.") + + if explain: + logger.removeHandler(explain_handler) + logger.setLevel(previous_logger_level) + + return results + + +def from_fp( + fp: BinaryIO, + steps: int = 5, + chunk_size: int = 512, + threshold: float = 0.20, + cp_isolation: list[str] | None = None, + cp_exclusion: list[str] | None = None, + preemptive_behaviour: bool = True, + explain: bool = False, + language_threshold: float = 0.1, + enable_fallback: bool = True, +) -> CharsetMatches: + """ + Same thing than the function from_bytes but using a file pointer that is already ready. + Will not close the file pointer. + """ + return from_bytes( + fp.read(), + steps, + chunk_size, + threshold, + cp_isolation, + cp_exclusion, + preemptive_behaviour, + explain, + language_threshold, + enable_fallback, + ) + + +def from_path( + path: str | bytes | PathLike, # type: ignore[type-arg] + steps: int = 5, + chunk_size: int = 512, + threshold: float = 0.20, + cp_isolation: list[str] | None = None, + cp_exclusion: list[str] | None = None, + preemptive_behaviour: bool = True, + explain: bool = False, + language_threshold: float = 0.1, + enable_fallback: bool = True, +) -> CharsetMatches: + """ + Same thing than the function from_bytes but with one extra step. Opening and reading given file path in binary mode. + Can raise IOError. + """ + with open(path, "rb") as fp: + return from_fp( + fp, + steps, + chunk_size, + threshold, + cp_isolation, + cp_exclusion, + preemptive_behaviour, + explain, + language_threshold, + enable_fallback, + ) + + +def is_binary( + fp_or_path_or_payload: PathLike | str | BinaryIO | bytes, # type: ignore[type-arg] + steps: int = 5, + chunk_size: int = 512, + threshold: float = 0.20, + cp_isolation: list[str] | None = None, + cp_exclusion: list[str] | None = None, + preemptive_behaviour: bool = True, + explain: bool = False, + language_threshold: float = 0.1, + enable_fallback: bool = False, +) -> bool: + """ + Detect if the given input (file, bytes, or path) points to a binary file. aka. not a string. + Based on the same main heuristic algorithms and default kwargs at the sole exception that fallbacks match + are disabled to be stricter around ASCII-compatible but unlikely to be a string. + """ + if isinstance(fp_or_path_or_payload, (str, PathLike)): + guesses = from_path( + fp_or_path_or_payload, + steps=steps, + chunk_size=chunk_size, + threshold=threshold, + cp_isolation=cp_isolation, + cp_exclusion=cp_exclusion, + preemptive_behaviour=preemptive_behaviour, + explain=explain, + language_threshold=language_threshold, + enable_fallback=enable_fallback, + ) + elif isinstance( + fp_or_path_or_payload, + ( + bytes, + bytearray, + ), + ): + guesses = from_bytes( + fp_or_path_or_payload, + steps=steps, + chunk_size=chunk_size, + threshold=threshold, + cp_isolation=cp_isolation, + cp_exclusion=cp_exclusion, + preemptive_behaviour=preemptive_behaviour, + explain=explain, + language_threshold=language_threshold, + enable_fallback=enable_fallback, + ) + else: + guesses = from_fp( + fp_or_path_or_payload, + steps=steps, + chunk_size=chunk_size, + threshold=threshold, + cp_isolation=cp_isolation, + cp_exclusion=cp_exclusion, + preemptive_behaviour=preemptive_behaviour, + explain=explain, + language_threshold=language_threshold, + enable_fallback=enable_fallback, + ) + + return not guesses diff --git a/venv/lib/python3.11/site-packages/charset_normalizer/cd.py b/venv/lib/python3.11/site-packages/charset_normalizer/cd.py new file mode 100644 index 0000000..71a3ed5 --- /dev/null +++ b/venv/lib/python3.11/site-packages/charset_normalizer/cd.py @@ -0,0 +1,395 @@ +from __future__ import annotations + +import importlib +from codecs import IncrementalDecoder +from collections import Counter +from functools import lru_cache +from typing import Counter as TypeCounter + +from .constant import ( + FREQUENCIES, + KO_NAMES, + LANGUAGE_SUPPORTED_COUNT, + TOO_SMALL_SEQUENCE, + ZH_NAMES, +) +from .md import is_suspiciously_successive_range +from .models import CoherenceMatches +from .utils import ( + is_accentuated, + is_latin, + is_multi_byte_encoding, + is_unicode_range_secondary, + unicode_range, +) + + +def encoding_unicode_range(iana_name: str) -> list[str]: + """ + Return associated unicode ranges in a single byte code page. + """ + if is_multi_byte_encoding(iana_name): + raise OSError("Function not supported on multi-byte code page") + + decoder = importlib.import_module(f"encodings.{iana_name}").IncrementalDecoder + + p: IncrementalDecoder = decoder(errors="ignore") + seen_ranges: dict[str, int] = {} + character_count: int = 0 + + for i in range(0x40, 0xFF): + chunk: str = p.decode(bytes([i])) + + if chunk: + character_range: str | None = unicode_range(chunk) + + if character_range is None: + continue + + if is_unicode_range_secondary(character_range) is False: + if character_range not in seen_ranges: + seen_ranges[character_range] = 0 + seen_ranges[character_range] += 1 + character_count += 1 + + return sorted( + [ + character_range + for character_range in seen_ranges + if seen_ranges[character_range] / character_count >= 0.15 + ] + ) + + +def unicode_range_languages(primary_range: str) -> list[str]: + """ + Return inferred languages used with a unicode range. + """ + languages: list[str] = [] + + for language, characters in FREQUENCIES.items(): + for character in characters: + if unicode_range(character) == primary_range: + languages.append(language) + break + + return languages + + +@lru_cache() +def encoding_languages(iana_name: str) -> list[str]: + """ + Single-byte encoding language association. Some code page are heavily linked to particular language(s). + This function does the correspondence. + """ + unicode_ranges: list[str] = encoding_unicode_range(iana_name) + primary_range: str | None = None + + for specified_range in unicode_ranges: + if "Latin" not in specified_range: + primary_range = specified_range + break + + if primary_range is None: + return ["Latin Based"] + + return unicode_range_languages(primary_range) + + +@lru_cache() +def mb_encoding_languages(iana_name: str) -> list[str]: + """ + Multi-byte encoding language association. Some code page are heavily linked to particular language(s). + This function does the correspondence. + """ + if ( + iana_name.startswith("shift_") + or iana_name.startswith("iso2022_jp") + or iana_name.startswith("euc_j") + or iana_name == "cp932" + ): + return ["Japanese"] + if iana_name.startswith("gb") or iana_name in ZH_NAMES: + return ["Chinese"] + if iana_name.startswith("iso2022_kr") or iana_name in KO_NAMES: + return ["Korean"] + + return [] + + +@lru_cache(maxsize=LANGUAGE_SUPPORTED_COUNT) +def get_target_features(language: str) -> tuple[bool, bool]: + """ + Determine main aspects from a supported language if it contains accents and if is pure Latin. + """ + target_have_accents: bool = False + target_pure_latin: bool = True + + for character in FREQUENCIES[language]: + if not target_have_accents and is_accentuated(character): + target_have_accents = True + if target_pure_latin and is_latin(character) is False: + target_pure_latin = False + + return target_have_accents, target_pure_latin + + +def alphabet_languages( + characters: list[str], ignore_non_latin: bool = False +) -> list[str]: + """ + Return associated languages associated to given characters. + """ + languages: list[tuple[str, float]] = [] + + source_have_accents = any(is_accentuated(character) for character in characters) + + for language, language_characters in FREQUENCIES.items(): + target_have_accents, target_pure_latin = get_target_features(language) + + if ignore_non_latin and target_pure_latin is False: + continue + + if target_have_accents is False and source_have_accents: + continue + + character_count: int = len(language_characters) + + character_match_count: int = len( + [c for c in language_characters if c in characters] + ) + + ratio: float = character_match_count / character_count + + if ratio >= 0.2: + languages.append((language, ratio)) + + languages = sorted(languages, key=lambda x: x[1], reverse=True) + + return [compatible_language[0] for compatible_language in languages] + + +def characters_popularity_compare( + language: str, ordered_characters: list[str] +) -> float: + """ + Determine if a ordered characters list (by occurrence from most appearance to rarest) match a particular language. + The result is a ratio between 0. (absolutely no correspondence) and 1. (near perfect fit). + Beware that is function is not strict on the match in order to ease the detection. (Meaning close match is 1.) + """ + if language not in FREQUENCIES: + raise ValueError(f"{language} not available") + + character_approved_count: int = 0 + FREQUENCIES_language_set = set(FREQUENCIES[language]) + + ordered_characters_count: int = len(ordered_characters) + target_language_characters_count: int = len(FREQUENCIES[language]) + + large_alphabet: bool = target_language_characters_count > 26 + + for character, character_rank in zip( + ordered_characters, range(0, ordered_characters_count) + ): + if character not in FREQUENCIES_language_set: + continue + + character_rank_in_language: int = FREQUENCIES[language].index(character) + expected_projection_ratio: float = ( + target_language_characters_count / ordered_characters_count + ) + character_rank_projection: int = int(character_rank * expected_projection_ratio) + + if ( + large_alphabet is False + and abs(character_rank_projection - character_rank_in_language) > 4 + ): + continue + + if ( + large_alphabet is True + and abs(character_rank_projection - character_rank_in_language) + < target_language_characters_count / 3 + ): + character_approved_count += 1 + continue + + characters_before_source: list[str] = FREQUENCIES[language][ + 0:character_rank_in_language + ] + characters_after_source: list[str] = FREQUENCIES[language][ + character_rank_in_language: + ] + characters_before: list[str] = ordered_characters[0:character_rank] + characters_after: list[str] = ordered_characters[character_rank:] + + before_match_count: int = len( + set(characters_before) & set(characters_before_source) + ) + + after_match_count: int = len( + set(characters_after) & set(characters_after_source) + ) + + if len(characters_before_source) == 0 and before_match_count <= 4: + character_approved_count += 1 + continue + + if len(characters_after_source) == 0 and after_match_count <= 4: + character_approved_count += 1 + continue + + if ( + before_match_count / len(characters_before_source) >= 0.4 + or after_match_count / len(characters_after_source) >= 0.4 + ): + character_approved_count += 1 + continue + + return character_approved_count / len(ordered_characters) + + +def alpha_unicode_split(decoded_sequence: str) -> list[str]: + """ + Given a decoded text sequence, return a list of str. Unicode range / alphabet separation. + Ex. a text containing English/Latin with a bit a Hebrew will return two items in the resulting list; + One containing the latin letters and the other hebrew. + """ + layers: dict[str, str] = {} + + for character in decoded_sequence: + if character.isalpha() is False: + continue + + character_range: str | None = unicode_range(character) + + if character_range is None: + continue + + layer_target_range: str | None = None + + for discovered_range in layers: + if ( + is_suspiciously_successive_range(discovered_range, character_range) + is False + ): + layer_target_range = discovered_range + break + + if layer_target_range is None: + layer_target_range = character_range + + if layer_target_range not in layers: + layers[layer_target_range] = character.lower() + continue + + layers[layer_target_range] += character.lower() + + return list(layers.values()) + + +def merge_coherence_ratios(results: list[CoherenceMatches]) -> CoherenceMatches: + """ + This function merge results previously given by the function coherence_ratio. + The return type is the same as coherence_ratio. + """ + per_language_ratios: dict[str, list[float]] = {} + for result in results: + for sub_result in result: + language, ratio = sub_result + if language not in per_language_ratios: + per_language_ratios[language] = [ratio] + continue + per_language_ratios[language].append(ratio) + + merge = [ + ( + language, + round( + sum(per_language_ratios[language]) / len(per_language_ratios[language]), + 4, + ), + ) + for language in per_language_ratios + ] + + return sorted(merge, key=lambda x: x[1], reverse=True) + + +def filter_alt_coherence_matches(results: CoherenceMatches) -> CoherenceMatches: + """ + We shall NOT return "English—" in CoherenceMatches because it is an alternative + of "English". This function only keeps the best match and remove the em-dash in it. + """ + index_results: dict[str, list[float]] = dict() + + for result in results: + language, ratio = result + no_em_name: str = language.replace("—", "") + + if no_em_name not in index_results: + index_results[no_em_name] = [] + + index_results[no_em_name].append(ratio) + + if any(len(index_results[e]) > 1 for e in index_results): + filtered_results: CoherenceMatches = [] + + for language in index_results: + filtered_results.append((language, max(index_results[language]))) + + return filtered_results + + return results + + +@lru_cache(maxsize=2048) +def coherence_ratio( + decoded_sequence: str, threshold: float = 0.1, lg_inclusion: str | None = None +) -> CoherenceMatches: + """ + Detect ANY language that can be identified in given sequence. The sequence will be analysed by layers. + A layer = Character extraction by alphabets/ranges. + """ + + results: list[tuple[str, float]] = [] + ignore_non_latin: bool = False + + sufficient_match_count: int = 0 + + lg_inclusion_list = lg_inclusion.split(",") if lg_inclusion is not None else [] + if "Latin Based" in lg_inclusion_list: + ignore_non_latin = True + lg_inclusion_list.remove("Latin Based") + + for layer in alpha_unicode_split(decoded_sequence): + sequence_frequencies: TypeCounter[str] = Counter(layer) + most_common = sequence_frequencies.most_common() + + character_count: int = sum(o for c, o in most_common) + + if character_count <= TOO_SMALL_SEQUENCE: + continue + + popular_character_ordered: list[str] = [c for c, o in most_common] + + for language in lg_inclusion_list or alphabet_languages( + popular_character_ordered, ignore_non_latin + ): + ratio: float = characters_popularity_compare( + language, popular_character_ordered + ) + + if ratio < threshold: + continue + elif ratio >= 0.8: + sufficient_match_count += 1 + + results.append((language, round(ratio, 4))) + + if sufficient_match_count >= 3: + break + + return sorted( + filter_alt_coherence_matches(results), key=lambda x: x[1], reverse=True + ) diff --git a/venv/lib/python3.11/site-packages/charset_normalizer/cli/__init__.py b/venv/lib/python3.11/site-packages/charset_normalizer/cli/__init__.py new file mode 100644 index 0000000..543a5a4 --- /dev/null +++ b/venv/lib/python3.11/site-packages/charset_normalizer/cli/__init__.py @@ -0,0 +1,8 @@ +from __future__ import annotations + +from .__main__ import cli_detect, query_yes_no + +__all__ = ( + "cli_detect", + "query_yes_no", +) diff --git a/venv/lib/python3.11/site-packages/charset_normalizer/cli/__main__.py b/venv/lib/python3.11/site-packages/charset_normalizer/cli/__main__.py new file mode 100644 index 0000000..cb64156 --- /dev/null +++ b/venv/lib/python3.11/site-packages/charset_normalizer/cli/__main__.py @@ -0,0 +1,381 @@ +from __future__ import annotations + +import argparse +import sys +import typing +from json import dumps +from os.path import abspath, basename, dirname, join, realpath +from platform import python_version +from unicodedata import unidata_version + +import charset_normalizer.md as md_module +from charset_normalizer import from_fp +from charset_normalizer.models import CliDetectionResult +from charset_normalizer.version import __version__ + + +def query_yes_no(question: str, default: str = "yes") -> bool: + """Ask a yes/no question via input() and return their answer. + + "question" is a string that is presented to the user. + "default" is the presumed answer if the user just hits . + It must be "yes" (the default), "no" or None (meaning + an answer is required of the user). + + The "answer" return value is True for "yes" or False for "no". + + Credit goes to (c) https://stackoverflow.com/questions/3041986/apt-command-line-interface-like-yes-no-input + """ + valid = {"yes": True, "y": True, "ye": True, "no": False, "n": False} + if default is None: + prompt = " [y/n] " + elif default == "yes": + prompt = " [Y/n] " + elif default == "no": + prompt = " [y/N] " + else: + raise ValueError("invalid default answer: '%s'" % default) + + while True: + sys.stdout.write(question + prompt) + choice = input().lower() + if default is not None and choice == "": + return valid[default] + elif choice in valid: + return valid[choice] + else: + sys.stdout.write("Please respond with 'yes' or 'no' (or 'y' or 'n').\n") + + +class FileType: + """Factory for creating file object types + + Instances of FileType are typically passed as type= arguments to the + ArgumentParser add_argument() method. + + Keyword Arguments: + - mode -- A string indicating how the file is to be opened. Accepts the + same values as the builtin open() function. + - bufsize -- The file's desired buffer size. Accepts the same values as + the builtin open() function. + - encoding -- The file's encoding. Accepts the same values as the + builtin open() function. + - errors -- A string indicating how encoding and decoding errors are to + be handled. Accepts the same value as the builtin open() function. + + Backported from CPython 3.12 + """ + + def __init__( + self, + mode: str = "r", + bufsize: int = -1, + encoding: str | None = None, + errors: str | None = None, + ): + self._mode = mode + self._bufsize = bufsize + self._encoding = encoding + self._errors = errors + + def __call__(self, string: str) -> typing.IO: # type: ignore[type-arg] + # the special argument "-" means sys.std{in,out} + if string == "-": + if "r" in self._mode: + return sys.stdin.buffer if "b" in self._mode else sys.stdin + elif any(c in self._mode for c in "wax"): + return sys.stdout.buffer if "b" in self._mode else sys.stdout + else: + msg = f'argument "-" with mode {self._mode}' + raise ValueError(msg) + + # all other arguments are used as file names + try: + return open(string, self._mode, self._bufsize, self._encoding, self._errors) + except OSError as e: + message = f"can't open '{string}': {e}" + raise argparse.ArgumentTypeError(message) + + def __repr__(self) -> str: + args = self._mode, self._bufsize + kwargs = [("encoding", self._encoding), ("errors", self._errors)] + args_str = ", ".join( + [repr(arg) for arg in args if arg != -1] + + [f"{kw}={arg!r}" for kw, arg in kwargs if arg is not None] + ) + return f"{type(self).__name__}({args_str})" + + +def cli_detect(argv: list[str] | None = None) -> int: + """ + CLI assistant using ARGV and ArgumentParser + :param argv: + :return: 0 if everything is fine, anything else equal trouble + """ + parser = argparse.ArgumentParser( + description="The Real First Universal Charset Detector. " + "Discover originating encoding used on text file. " + "Normalize text to unicode." + ) + + parser.add_argument( + "files", type=FileType("rb"), nargs="+", help="File(s) to be analysed" + ) + parser.add_argument( + "-v", + "--verbose", + action="store_true", + default=False, + dest="verbose", + help="Display complementary information about file if any. " + "Stdout will contain logs about the detection process.", + ) + parser.add_argument( + "-a", + "--with-alternative", + action="store_true", + default=False, + dest="alternatives", + help="Output complementary possibilities if any. Top-level JSON WILL be a list.", + ) + parser.add_argument( + "-n", + "--normalize", + action="store_true", + default=False, + dest="normalize", + help="Permit to normalize input file. If not set, program does not write anything.", + ) + parser.add_argument( + "-m", + "--minimal", + action="store_true", + default=False, + dest="minimal", + help="Only output the charset detected to STDOUT. Disabling JSON output.", + ) + parser.add_argument( + "-r", + "--replace", + action="store_true", + default=False, + dest="replace", + help="Replace file when trying to normalize it instead of creating a new one.", + ) + parser.add_argument( + "-f", + "--force", + action="store_true", + default=False, + dest="force", + help="Replace file without asking if you are sure, use this flag with caution.", + ) + parser.add_argument( + "-i", + "--no-preemptive", + action="store_true", + default=False, + dest="no_preemptive", + help="Disable looking at a charset declaration to hint the detector.", + ) + parser.add_argument( + "-t", + "--threshold", + action="store", + default=0.2, + type=float, + dest="threshold", + help="Define a custom maximum amount of noise allowed in decoded content. 0. <= noise <= 1.", + ) + parser.add_argument( + "--version", + action="version", + version="Charset-Normalizer {} - Python {} - Unicode {} - SpeedUp {}".format( + __version__, + python_version(), + unidata_version, + "OFF" if md_module.__file__.lower().endswith(".py") else "ON", + ), + help="Show version information and exit.", + ) + + args = parser.parse_args(argv) + + if args.replace is True and args.normalize is False: + if args.files: + for my_file in args.files: + my_file.close() + print("Use --replace in addition of --normalize only.", file=sys.stderr) + return 1 + + if args.force is True and args.replace is False: + if args.files: + for my_file in args.files: + my_file.close() + print("Use --force in addition of --replace only.", file=sys.stderr) + return 1 + + if args.threshold < 0.0 or args.threshold > 1.0: + if args.files: + for my_file in args.files: + my_file.close() + print("--threshold VALUE should be between 0. AND 1.", file=sys.stderr) + return 1 + + x_ = [] + + for my_file in args.files: + matches = from_fp( + my_file, + threshold=args.threshold, + explain=args.verbose, + preemptive_behaviour=args.no_preemptive is False, + ) + + best_guess = matches.best() + + if best_guess is None: + print( + 'Unable to identify originating encoding for "{}". {}'.format( + my_file.name, + ( + "Maybe try increasing maximum amount of chaos." + if args.threshold < 1.0 + else "" + ), + ), + file=sys.stderr, + ) + x_.append( + CliDetectionResult( + abspath(my_file.name), + None, + [], + [], + "Unknown", + [], + False, + 1.0, + 0.0, + None, + True, + ) + ) + else: + x_.append( + CliDetectionResult( + abspath(my_file.name), + best_guess.encoding, + best_guess.encoding_aliases, + [ + cp + for cp in best_guess.could_be_from_charset + if cp != best_guess.encoding + ], + best_guess.language, + best_guess.alphabets, + best_guess.bom, + best_guess.percent_chaos, + best_guess.percent_coherence, + None, + True, + ) + ) + + if len(matches) > 1 and args.alternatives: + for el in matches: + if el != best_guess: + x_.append( + CliDetectionResult( + abspath(my_file.name), + el.encoding, + el.encoding_aliases, + [ + cp + for cp in el.could_be_from_charset + if cp != el.encoding + ], + el.language, + el.alphabets, + el.bom, + el.percent_chaos, + el.percent_coherence, + None, + False, + ) + ) + + if args.normalize is True: + if best_guess.encoding.startswith("utf") is True: + print( + '"{}" file does not need to be normalized, as it already came from unicode.'.format( + my_file.name + ), + file=sys.stderr, + ) + if my_file.closed is False: + my_file.close() + continue + + dir_path = dirname(realpath(my_file.name)) + file_name = basename(realpath(my_file.name)) + + o_: list[str] = file_name.split(".") + + if args.replace is False: + o_.insert(-1, best_guess.encoding) + if my_file.closed is False: + my_file.close() + elif ( + args.force is False + and query_yes_no( + 'Are you sure to normalize "{}" by replacing it ?'.format( + my_file.name + ), + "no", + ) + is False + ): + if my_file.closed is False: + my_file.close() + continue + + try: + x_[0].unicode_path = join(dir_path, ".".join(o_)) + + with open(x_[0].unicode_path, "wb") as fp: + fp.write(best_guess.output()) + except OSError as e: + print(str(e), file=sys.stderr) + if my_file.closed is False: + my_file.close() + return 2 + + if my_file.closed is False: + my_file.close() + + if args.minimal is False: + print( + dumps( + [el.__dict__ for el in x_] if len(x_) > 1 else x_[0].__dict__, + ensure_ascii=True, + indent=4, + ) + ) + else: + for my_file in args.files: + print( + ", ".join( + [ + el.encoding or "undefined" + for el in x_ + if el.path == abspath(my_file.name) + ] + ) + ) + + return 0 + + +if __name__ == "__main__": + cli_detect() diff --git a/venv/lib/python3.11/site-packages/charset_normalizer/cli/__pycache__/__init__.cpython-311.pyc b/venv/lib/python3.11/site-packages/charset_normalizer/cli/__pycache__/__init__.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..3ce3bdf87fc4db2b2363f29553b47a50df627c7c GIT binary patch literal 380 zcmZvXy-veG41n))>5m%v5)4QgnxkSv2#FV9VasA&b4PpP?h-DSqA)S?20Q}dZ91Y% zNKD--b*mU~gcy*pE!&@E%l7MZIw2@ur)&L;@w10tiGC8gKf&aMNFu2rmgbZa8A)a$ z%W`JpJVs{uK*l#D9c=rdly-@5t_&jR($!nq*P?Dx7!6VdRfO*7zEQq~R@LCj>vY&n z0B)Pmcm?1Y_IG0dE3`u#Ao^in8vzJo0N%(RksKsnl~(Zw;e&93+xDue_(B__-EwA& zim#PhbE6l$YQw5@XW4wtYaP_A62+ZZs+t!o;cFG}3U7tckIHjAlLKg{13*@_hw+6i nWn1(VwPscCE1Ubi6e&_1ncxWK+GlswkQr(ox>? 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 bb6wg}a^u_&2R", + "=", + ":", + "/", + "&", + ";", + "{", + "}", + "[", + "]", + ",", + "|", + '"', + "-", + "(", + ")", +} + +# Sample character sets — replace with full lists if needed +COMMON_CHINESE_CHARACTERS = "的一是在不了有和人这中大为上个国我以要他时来用们生到作地于出就分对成会可主发年动同工也能下过子说产种面而方后多定行学法所民得经十三之进着等部度家电力里如水化高自二理起小物现实加量都两体制机当使点从业本去把性好应开它合还因由其些然前外天政四日那社义事平形相全表间样与关各重新线内数正心反你明看原又么利比或但质气第向道命此变条只没结解问意建月公无系军很情者最立代想已通并提直题党程展五果料象员革位入常文总次品式活设及管特件长求老头基资边流路级少图山统接知较将组见计别她手角期根论运农指几九区强放决西被干做必战先回则任取据处队南给色光门即保治北造百规热领七海口东导器压志世金增争济阶油思术极交受联什认六共权收证改清己美再采转更单风切打白教速花带安场身车例真务具万每目至达走积示议声报斗完类八离华名确才科张信马节话米整空元况今集温传土许步群广石记需段研界拉林律叫且究观越织装影算低持音众书布复容儿须际商非验连断深难近矿千周委素技备半办青省列习响约支般史感劳便团往酸历市克何除消构府太准精值号率族维划选标写存候毛亲快效斯院查江型眼王按格养易置派层片始却专状育厂京识适属圆包火住调满县局照参红细引听该铁价严龙飞" + +COMMON_JAPANESE_CHARACTERS = "日一国年大十二本中長出三時行見月分後前生五間上東四今金九入学高円子外八六下来気小七山話女北午百書先名川千水半男西電校語土木聞食車何南万毎白天母火右読友左休父雨" + +COMMON_KOREAN_CHARACTERS = "一二三四五六七八九十百千萬上下左右中人女子大小山川日月火水木金土父母天地國名年時文校學生" + +# Combine all into a set +COMMON_CJK_CHARACTERS = set( + "".join( + [ + COMMON_CHINESE_CHARACTERS, + COMMON_JAPANESE_CHARACTERS, + COMMON_KOREAN_CHARACTERS, + ] + ) +) + +KO_NAMES: set[str] = {"johab", "cp949", "euc_kr"} +ZH_NAMES: set[str] = {"big5", "cp950", "big5hkscs", "hz"} + +# Logging LEVEL below DEBUG +TRACE: int = 5 + + +# Language label that contain the em dash "—" +# character are to be considered alternative seq to origin +FREQUENCIES: dict[str, list[str]] = { + "English": [ + "e", + "a", + "t", + "i", + "o", + "n", + "s", + "r", + "h", + "l", + "d", + "c", + "u", + "m", + "f", + "p", + "g", + "w", + "y", + "b", + "v", + "k", + "x", + "j", + "z", + "q", + ], + "English—": [ + "e", + "a", + "t", + "i", + "o", + "n", + "s", + "r", + "h", + "l", + "d", + "c", + "m", + "u", + "f", + "p", + "g", + "w", + "b", + "y", + "v", + "k", + "j", + "x", + "z", + "q", + ], + "German": [ + "e", + "n", + "i", + "r", + "s", + "t", + "a", + "d", + "h", + "u", + "l", + "g", + "o", + "c", + "m", + "b", + "f", + "k", + "w", + "z", + "p", + "v", + "ü", + "ä", + "ö", + "j", + ], + "French": [ + "e", + "a", + "s", + "n", + "i", + "t", + "r", + "l", + "u", + "o", + "d", + "c", + "p", + "m", + "é", + "v", + "g", + "f", + "b", + "h", + "q", + "à", + "x", + "è", + "y", + "j", + ], + "Dutch": [ + "e", + "n", + "a", + "i", + "r", + "t", + "o", + "d", + "s", + "l", + "g", + "h", + "v", + "m", + "u", + "k", + "c", + "p", + "b", + "w", + "j", + "z", + "f", + "y", + "x", + "ë", + ], + "Italian": [ + "e", + "i", + "a", + "o", + "n", + "l", + "t", + "r", + "s", + "c", + "d", + "u", + "p", + "m", + "g", + "v", + "f", + "b", + "z", + "h", + "q", + "è", + "à", + "k", + "y", + "ò", + ], + "Polish": [ + "a", + "i", + "o", + "e", + "n", + "r", + "z", + "w", + "s", + "c", + "t", + "k", + "y", + "d", + "p", + "m", + "u", + "l", + "j", + "ł", + "g", + "b", + "h", + "ą", + "ę", + "ó", + ], + "Spanish": [ + "e", + "a", + "o", + "n", + "s", + "r", + "i", + "l", + "d", + "t", + "c", + "u", + "m", + "p", + "b", + "g", + "v", + "f", + "y", + "ó", + "h", + "q", + "í", + "j", + "z", + "á", + ], + "Russian": [ + "о", + "а", + "е", + "и", + "н", + "с", + "т", + "р", + "в", + "л", + "к", + "м", + "д", + "п", + "у", + "г", + "я", + "ы", + "з", + "б", + "й", + "ь", + "ч", + "х", + "ж", + "ц", + ], + # Jap-Kanji + "Japanese": [ + "人", + "一", + "大", + "亅", + "丁", + "丨", + "竹", + "笑", + "口", + "日", + "今", + "二", + "彳", + "行", + "十", + "土", + "丶", + "寸", + "寺", + "時", + "乙", + "丿", + "乂", + "气", + "気", + "冂", + "巾", + "亠", + "市", + "目", + "儿", + "見", + "八", + "小", + "凵", + "県", + "月", + "彐", + "門", + "間", + "木", + "東", + "山", + "出", + "本", + "中", + "刀", + "分", + "耳", + "又", + "取", + "最", + "言", + "田", + "心", + "思", + "刂", + "前", + "京", + "尹", + "事", + "生", + "厶", + "云", + "会", + "未", + "来", + "白", + "冫", + "楽", + "灬", + "馬", + "尸", + "尺", + "駅", + "明", + "耂", + "者", + "了", + "阝", + "都", + "高", + "卜", + "占", + "厂", + "广", + "店", + "子", + "申", + "奄", + "亻", + "俺", + "上", + "方", + "冖", + "学", + "衣", + "艮", + "食", + "自", + ], + # Jap-Katakana + "Japanese—": [ + "ー", + "ン", + "ス", + "・", + "ル", + "ト", + "リ", + "イ", + "ア", + "ラ", + "ッ", + "ク", + "ド", + "シ", + "レ", + "ジ", + "タ", + "フ", + "ロ", + "カ", + "テ", + "マ", + "ィ", + "グ", + "バ", + "ム", + "プ", + "オ", + "コ", + "デ", + "ニ", + "ウ", + "メ", + "サ", + "ビ", + "ナ", + "ブ", + "ャ", + "エ", + "ュ", + "チ", + "キ", + "ズ", + "ダ", + "パ", + "ミ", + "ェ", + "ョ", + "ハ", + "セ", + "ベ", + "ガ", + "モ", + "ツ", + "ネ", + "ボ", + "ソ", + "ノ", + "ァ", + "ヴ", + "ワ", + "ポ", + "ペ", + "ピ", + "ケ", + "ゴ", + "ギ", + "ザ", + "ホ", + "ゲ", + "ォ", + "ヤ", + "ヒ", + "ユ", + "ヨ", + "ヘ", + "ゼ", + "ヌ", + "ゥ", + "ゾ", + "ヶ", + "ヂ", + "ヲ", + "ヅ", + "ヵ", + "ヱ", + "ヰ", + "ヮ", + "ヽ", + "゠", + "ヾ", + "ヷ", + "ヿ", + "ヸ", + "ヹ", + "ヺ", + ], + # Jap-Hiragana + "Japanese——": [ + "の", + "に", + "る", + "た", + "と", + "は", + "し", + "い", + "を", + "で", + "て", + "が", + "な", + "れ", + "か", + "ら", + "さ", + "っ", + "り", + "す", + "あ", + "も", + "こ", + "ま", + "う", + "く", + "よ", + "き", + "ん", + "め", + "お", + "け", + "そ", + "つ", + "だ", + "や", + "え", + "ど", + "わ", + "ち", + "み", + "せ", + "じ", + "ば", + "へ", + "び", + "ず", + "ろ", + "ほ", + "げ", + "む", + "べ", + "ひ", + "ょ", + "ゆ", + "ぶ", + "ご", + "ゃ", + "ね", + "ふ", + "ぐ", + "ぎ", + "ぼ", + "ゅ", + "づ", + "ざ", + "ぞ", + "ぬ", + "ぜ", + "ぱ", + "ぽ", + "ぷ", + "ぴ", + "ぃ", + "ぁ", + "ぇ", + "ぺ", + "ゞ", + "ぢ", + "ぉ", + "ぅ", + "ゐ", + "ゝ", + "ゑ", + "゛", + "゜", + "ゎ", + "ゔ", + "゚", + "ゟ", + "゙", + "ゕ", + "ゖ", + ], + "Portuguese": [ + "a", + "e", + "o", + "s", + "i", + "r", + "d", + "n", + "t", + "m", + "u", + "c", + "l", + "p", + "g", + "v", + "b", + "f", + "h", + "ã", + "q", + "é", + "ç", + "á", + "z", + "í", + ], + "Swedish": [ + "e", + "a", + "n", + "r", + "t", + "s", + "i", + "l", + "d", + "o", + "m", + "k", + "g", + "v", + "h", + "f", + "u", + "p", + "ä", + "c", + "b", + "ö", + "å", + "y", + "j", + "x", + ], + "Chinese": [ + "的", + "一", + "是", + "不", + "了", + "在", + "人", + "有", + "我", + "他", + "这", + "个", + "们", + "中", + "来", + "上", + "大", + "为", + "和", + "国", + "地", + "到", + "以", + "说", + "时", + "要", + "就", + "出", + "会", + "可", + "也", + "你", + "对", + "生", + "能", + "而", + "子", + "那", + "得", + "于", + "着", + "下", + "自", + "之", + "年", + "过", + "发", + "后", + "作", + "里", + "用", + "道", + "行", + "所", + "然", + "家", + "种", + "事", + "成", + "方", + "多", + "经", + "么", + "去", + "法", + "学", + "如", + "都", + "同", + "现", + "当", + "没", + "动", + "面", + "起", + "看", + "定", + "天", + "分", + "还", + "进", + "好", + "小", + "部", + "其", + "些", + "主", + "样", + "理", + "心", + "她", + "本", + "前", + "开", + "但", + "因", + "只", + "从", + "想", + "实", + ], + "Ukrainian": [ + "о", + "а", + "н", + "і", + "и", + "р", + "в", + "т", + "е", + "с", + "к", + "л", + "у", + "д", + "м", + "п", + "з", + "я", + "ь", + "б", + "г", + "й", + "ч", + "х", + "ц", + "ї", + ], + "Norwegian": [ + "e", + "r", + "n", + "t", + "a", + "s", + "i", + "o", + "l", + "d", + "g", + "k", + "m", + "v", + "f", + "p", + "u", + "b", + "h", + "å", + "y", + "j", + "ø", + "c", + "æ", + "w", + ], + "Finnish": [ + "a", + "i", + "n", + "t", + "e", + "s", + "l", + "o", + "u", + "k", + "ä", + "m", + "r", + "v", + "j", + "h", + "p", + "y", + "d", + "ö", + "g", + "c", + "b", + "f", + "w", + "z", + ], + "Vietnamese": [ + "n", + "h", + "t", + "i", + "c", + "g", + "a", + "o", + "u", + "m", + "l", + "r", + "à", + "đ", + "s", + "e", + "v", + "p", + "b", + "y", + "ư", + "d", + "á", + "k", + "ộ", + "ế", + ], + "Czech": [ + "o", + "e", + "a", + "n", + "t", + "s", + "i", + "l", + "v", + "r", + "k", + "d", + "u", + "m", + "p", + "í", + "c", + "h", + "z", + "á", + "y", + "j", + "b", + "ě", + "é", + "ř", + ], + "Hungarian": [ + "e", + "a", + "t", + "l", + "s", + "n", + "k", + "r", + "i", + "o", + "z", + "á", + "é", + "g", + "m", + "b", + "y", + "v", + "d", + "h", + "u", + "p", + "j", + "ö", + "f", + "c", + ], + "Korean": [ + "이", + "다", + "에", + "의", + "는", + "로", + "하", + "을", + "가", + "고", + "지", + "서", + "한", + "은", + "기", + "으", + "년", + "대", + "사", + "시", + "를", + "리", + "도", + "인", + "스", + "일", + ], + "Indonesian": [ + "a", + "n", + "e", + "i", + "r", + "t", + "u", + "s", + "d", + "k", + "m", + "l", + "g", + "p", + "b", + "o", + "h", + "y", + "j", + "c", + "w", + "f", + "v", + "z", + "x", + "q", + ], + "Turkish": [ + "a", + "e", + "i", + "n", + "r", + "l", + "ı", + "k", + "d", + "t", + "s", + "m", + "y", + "u", + "o", + "b", + "ü", + "ş", + "v", + "g", + "z", + "h", + "c", + "p", + "ç", + "ğ", + ], + "Romanian": [ + "e", + "i", + "a", + "r", + "n", + "t", + "u", + "l", + "o", + "c", + "s", + "d", + "p", + "m", + "ă", + "f", + "v", + "î", + "g", + "b", + "ș", + "ț", + "z", + "h", + "â", + "j", + ], + "Farsi": [ + "ا", + "ی", + "ر", + "د", + "ن", + "ه", + "و", + "م", + "ت", + "ب", + "س", + "ل", + "ک", + "ش", + "ز", + "ف", + "گ", + "ع", + "خ", + "ق", + "ج", + "آ", + "پ", + "ح", + "ط", + "ص", + ], + "Arabic": [ + "ا", + "ل", + "ي", + "م", + "و", + "ن", + "ر", + "ت", + "ب", + "ة", + "ع", + "د", + "س", + "ف", + "ه", + "ك", + "ق", + "أ", + "ح", + "ج", + "ش", + "ط", + "ص", + "ى", + "خ", + "إ", + ], + "Danish": [ + "e", + "r", + "n", + "t", + "a", + "i", + "s", + "d", + "l", + "o", + "g", + "m", + "k", + "f", + "v", + "u", + "b", + "h", + "p", + "å", + "y", + "ø", + "æ", + "c", + "j", + "w", + ], + "Serbian": [ + "а", + "и", + "о", + "е", + "н", + "р", + "с", + "у", + "т", + "к", + "ј", + "в", + "д", + "м", + "п", + "л", + "г", + "з", + "б", + "a", + "i", + "e", + "o", + "n", + "ц", + "ш", + ], + "Lithuanian": [ + "i", + "a", + "s", + "o", + "r", + "e", + "t", + "n", + "u", + "k", + "m", + "l", + "p", + "v", + "d", + "j", + "g", + "ė", + "b", + "y", + "ų", + "š", + "ž", + "c", + "ą", + "į", + ], + "Slovene": [ + "e", + "a", + "i", + "o", + "n", + "r", + "s", + "l", + "t", + "j", + "v", + "k", + "d", + "p", + "m", + "u", + "z", + "b", + "g", + "h", + "č", + "c", + "š", + "ž", + "f", + "y", + ], + "Slovak": [ + "o", + "a", + "e", + "n", + "i", + "r", + "v", + "t", + "s", + "l", + "k", + "d", + "m", + "p", + "u", + "c", + "h", + "j", + "b", + "z", + "á", + "y", + "ý", + "í", + "č", + "é", + ], + "Hebrew": [ + "י", + "ו", + "ה", + "ל", + "ר", + "ב", + "ת", + "מ", + "א", + "ש", + "נ", + "ע", + "ם", + "ד", + "ק", + "ח", + "פ", + "ס", + "כ", + "ג", + "ט", + "צ", + "ן", + "ז", + "ך", + ], + "Bulgarian": [ + "а", + "и", + "о", + "е", + "н", + "т", + "р", + "с", + "в", + "л", + "к", + "д", + "п", + "м", + "з", + "г", + "я", + "ъ", + "у", + "б", + "ч", + "ц", + "й", + "ж", + "щ", + "х", + ], + "Croatian": [ + "a", + "i", + "o", + "e", + "n", + "r", + "j", + "s", + "t", + "u", + "k", + "l", + "v", + "d", + "m", + "p", + "g", + "z", + "b", + "c", + "č", + "h", + "š", + "ž", + "ć", + "f", + ], + "Hindi": [ + "क", + "र", + "स", + "न", + "त", + "म", + "ह", + "प", + "य", + "ल", + "व", + "ज", + "द", + "ग", + "ब", + "श", + "ट", + "अ", + "ए", + "थ", + "भ", + "ड", + "च", + "ध", + "ष", + "इ", + ], + "Estonian": [ + "a", + "i", + "e", + "s", + "t", + "l", + "u", + "n", + "o", + "k", + "r", + "d", + "m", + "v", + "g", + "p", + "j", + "h", + "ä", + "b", + "õ", + "ü", + "f", + "c", + "ö", + "y", + ], + "Thai": [ + "า", + "น", + "ร", + "อ", + "ก", + "เ", + "ง", + "ม", + "ย", + "ล", + "ว", + "ด", + "ท", + "ส", + "ต", + "ะ", + "ป", + "บ", + "ค", + "ห", + "แ", + "จ", + "พ", + "ช", + "ข", + "ใ", + ], + "Greek": [ + "α", + "τ", + "ο", + "ι", + "ε", + "ν", + "ρ", + "σ", + "κ", + "η", + "π", + "ς", + "υ", + "μ", + "λ", + "ί", + "ό", + "ά", + "γ", + "έ", + "δ", + "ή", + "ω", + "χ", + "θ", + "ύ", + ], + "Tamil": [ + "க", + "த", + "ப", + "ட", + "ர", + "ம", + "ல", + "ன", + "வ", + "ற", + "ய", + "ள", + "ச", + "ந", + "இ", + "ண", + "அ", + "ஆ", + "ழ", + "ங", + "எ", + "உ", + "ஒ", + "ஸ", + ], + "Kazakh": [ + "а", + "ы", + "е", + "н", + "т", + "р", + "л", + "і", + "д", + "с", + "м", + "қ", + "к", + "о", + "б", + "и", + "у", + "ғ", + "ж", + "ң", + "з", + "ш", + "й", + "п", + "г", + "ө", + ], +} + +LANGUAGE_SUPPORTED_COUNT: int = len(FREQUENCIES) diff --git a/venv/lib/python3.11/site-packages/charset_normalizer/legacy.py b/venv/lib/python3.11/site-packages/charset_normalizer/legacy.py new file mode 100644 index 0000000..360a310 --- /dev/null +++ b/venv/lib/python3.11/site-packages/charset_normalizer/legacy.py @@ -0,0 +1,80 @@ +from __future__ import annotations + +from typing import TYPE_CHECKING, Any +from warnings import warn + +from .api import from_bytes +from .constant import CHARDET_CORRESPONDENCE, TOO_SMALL_SEQUENCE + +# TODO: remove this check when dropping Python 3.7 support +if TYPE_CHECKING: + from typing_extensions import TypedDict + + class ResultDict(TypedDict): + encoding: str | None + language: str + confidence: float | None + + +def detect( + byte_str: bytes, should_rename_legacy: bool = False, **kwargs: Any +) -> ResultDict: + """ + chardet legacy method + Detect the encoding of the given byte string. It should be mostly backward-compatible. + Encoding name will match Chardet own writing whenever possible. (Not on encoding name unsupported by it) + This function is deprecated and should be used to migrate your project easily, consult the documentation for + further information. Not planned for removal. + + :param byte_str: The byte sequence to examine. + :param should_rename_legacy: Should we rename legacy encodings + to their more modern equivalents? + """ + if len(kwargs): + warn( + f"charset-normalizer disregard arguments '{','.join(list(kwargs.keys()))}' in legacy function detect()" + ) + + if not isinstance(byte_str, (bytearray, bytes)): + raise TypeError( # pragma: nocover + f"Expected object of type bytes or bytearray, got: {type(byte_str)}" + ) + + if isinstance(byte_str, bytearray): + byte_str = bytes(byte_str) + + r = from_bytes(byte_str).best() + + encoding = r.encoding if r is not None else None + language = r.language if r is not None and r.language != "Unknown" else "" + confidence = 1.0 - r.chaos if r is not None else None + + # automatically lower confidence + # on small bytes samples. + # https://github.com/jawah/charset_normalizer/issues/391 + if ( + confidence is not None + and confidence >= 0.9 + and encoding + not in { + "utf_8", + "ascii", + } + and r.bom is False # type: ignore[union-attr] + and len(byte_str) < TOO_SMALL_SEQUENCE + ): + confidence -= 0.2 + + # Note: CharsetNormalizer does not return 'UTF-8-SIG' as the sig get stripped in the detection/normalization process + # but chardet does return 'utf-8-sig' and it is a valid codec name. + if r is not None and encoding == "utf_8" and r.bom: + encoding += "_sig" + + if should_rename_legacy is False and encoding in CHARDET_CORRESPONDENCE: + encoding = CHARDET_CORRESPONDENCE[encoding] + + return { + "encoding": encoding, + "language": language, + "confidence": confidence, + } diff --git a/venv/lib/python3.11/site-packages/charset_normalizer/md.cpython-311-x86_64-linux-gnu.so b/venv/lib/python3.11/site-packages/charset_normalizer/md.cpython-311-x86_64-linux-gnu.so new file mode 100755 index 0000000000000000000000000000000000000000..f71a5afcc365d22b97b203a2781f515882b92ed1 GIT binary patch literal 15912 zcmeHOZ)_aZ5r5|-;QZ;?v?Qc4B3qP5Ng;=ANC>4N=lI_m*@>GthzOze`u3bVbbqY7 zb%@injpPR5mPl44P^tPMt@se3w4!{VQY$2fP(Y}qsZ@!mRaHw>&{-4`N>hbO&2{Fz z`JLCBbKpZ&RbpRsJ2StTc{4lvcJtQz-gmnDdm3Ufg|_G z*kI&Gg~E?T_PZ*6SH%zXyu<@-G~MVNInV9VUzlzXJ5YU2gbiNwJ?4*E#vn{#4+_6; zkRRvySsTi}SK=*J7fbR7mDAPdcPj;3LciYK`;|5M&Y9=`?p`>%^at-gche(YrSI7p z&V}8V(~td3eo5lu8e2i!$IrZ4{rSaLdWo&uI8UpNW}GmbLs0$WMR1O91r3FFh}P@p znMLrs3AgAMZaoCt83sw-Prom!m1^)7qx_!O{8aE+!R0nl%5e_niv_3byCvUol+!mf z;CSg$`e3%~r%OWvow;HmJ>-t$(neQby!lJ<*=n$_0om_}8E%QyA9#mRMYq@pV}m zJ`L(!qgJ?Yai1lneigYdfh)l;hj7Sm?KB~zr+$k;pgk_%c z&P|hSpV;v{0rrVyCz(8O)n84i-N8Jiw!AvqwEh^`s&higKCA7wjxgDL&7Qh!pZ##B zefH`SJNAbC`)mHK)WHV{(?Mf(cC=}I*StTU|FIn#$ybfvwcnoH@itj1d+MUUin@M> zUiT^oD6NV|hc}k}o0PG~DRwPB`_DZ|O37zGd7X|cwU3Kh`S2Q@5#@cro;qir*m{N( z_SBn|Uobp*SInOJwZGdw{(=7hDPPvgOO-!rWnPi?oZoC8|C8Usm&2aA@Yv(kS$pbI zs-6CY#p_z0#OB`3Pcr%DiBp5 zsz6kMr~*+1q6$P6_`Fmgm2peuwC@y(rM&)FSW4tQ$H`BOO{A3mtarVILwZjNbiH=o zKk+I4v6dwdTGS8!ao~kZ)#}%Y{^4@9%6)quRjWTD%HNo|#g6P%vBS-=mQ^=5PSal- zHV}3@{f5bJj1A(=J@K^1hwET3 z>o56TjT`h=u2qXH56j|6ykkwvqDZW1d|LD?*qGX14WSjarmYn!ZmJ^dF~vnwGvm>)Bud@EWnLXM?eLS;k~N8^q|lfz3tHf!6B>I?#GH z$hGALIV0CA5;J@~AoDm{sy^aR_X`@|mkl)fab8f;;sK4%NNnI=5ghkFaNf=lQ)^Uf z(jXYOof^MIVLi3cD)j_09Jls75yc^G-&|Xl4f|(_sh9s^=k-I~Pm{Wv6Ara{{hTJ7 z26{?i48Y}Q#KdUDJ=S>x|CPqSq{8>X>)Ie*+iwATUT+>#t84WE&d(pl@tgtv2{8@4 zt07c>zJL~t0Z!OZ#Ny6*JJwv$u z16$ynG@B~hVlO&A$hCk+Mp!{46HtDVg z*~IZ23I3QDfvyotQ1=vdI0cv08rw?qDzKY;EJ zT`>5g+wX?_@&7I;-Vb2UwGKA^_QE0B0b0TcJpx=P>W8#W63#rX-%-mLf^INk?HG=K ziZnt0Qf7-x9%|!EJJEX_=EnLG(msN zpDN;S*E|gaKhXCGW*+%t-rCx_(B4QU7I>!b(~skeIYYX^pP#S6#OZajTl@e3 literal 0 HcmV?d00001 diff --git a/venv/lib/python3.11/site-packages/charset_normalizer/md.py b/venv/lib/python3.11/site-packages/charset_normalizer/md.py new file mode 100644 index 0000000..12ce024 --- /dev/null +++ b/venv/lib/python3.11/site-packages/charset_normalizer/md.py @@ -0,0 +1,635 @@ +from __future__ import annotations + +from functools import lru_cache +from logging import getLogger + +from .constant import ( + COMMON_SAFE_ASCII_CHARACTERS, + TRACE, + UNICODE_SECONDARY_RANGE_KEYWORD, +) +from .utils import ( + is_accentuated, + is_arabic, + is_arabic_isolated_form, + is_case_variable, + is_cjk, + is_emoticon, + is_hangul, + is_hiragana, + is_katakana, + is_latin, + is_punctuation, + is_separator, + is_symbol, + is_thai, + is_unprintable, + remove_accent, + unicode_range, + is_cjk_uncommon, +) + + +class MessDetectorPlugin: + """ + Base abstract class used for mess detection plugins. + All detectors MUST extend and implement given methods. + """ + + def eligible(self, character: str) -> bool: + """ + Determine if given character should be fed in. + """ + raise NotImplementedError # pragma: nocover + + def feed(self, character: str) -> None: + """ + The main routine to be executed upon character. + Insert the logic in witch the text would be considered chaotic. + """ + raise NotImplementedError # pragma: nocover + + def reset(self) -> None: # pragma: no cover + """ + Permit to reset the plugin to the initial state. + """ + raise NotImplementedError + + @property + def ratio(self) -> float: + """ + Compute the chaos ratio based on what your feed() has seen. + Must NOT be lower than 0.; No restriction gt 0. + """ + raise NotImplementedError # pragma: nocover + + +class TooManySymbolOrPunctuationPlugin(MessDetectorPlugin): + def __init__(self) -> None: + self._punctuation_count: int = 0 + self._symbol_count: int = 0 + self._character_count: int = 0 + + self._last_printable_char: str | None = None + self._frenzy_symbol_in_word: bool = False + + def eligible(self, character: str) -> bool: + return character.isprintable() + + def feed(self, character: str) -> None: + self._character_count += 1 + + if ( + character != self._last_printable_char + and character not in COMMON_SAFE_ASCII_CHARACTERS + ): + if is_punctuation(character): + self._punctuation_count += 1 + elif ( + character.isdigit() is False + and is_symbol(character) + and is_emoticon(character) is False + ): + self._symbol_count += 2 + + self._last_printable_char = character + + def reset(self) -> None: # Abstract + self._punctuation_count = 0 + self._character_count = 0 + self._symbol_count = 0 + + @property + def ratio(self) -> float: + if self._character_count == 0: + return 0.0 + + ratio_of_punctuation: float = ( + self._punctuation_count + self._symbol_count + ) / self._character_count + + return ratio_of_punctuation if ratio_of_punctuation >= 0.3 else 0.0 + + +class TooManyAccentuatedPlugin(MessDetectorPlugin): + def __init__(self) -> None: + self._character_count: int = 0 + self._accentuated_count: int = 0 + + def eligible(self, character: str) -> bool: + return character.isalpha() + + def feed(self, character: str) -> None: + self._character_count += 1 + + if is_accentuated(character): + self._accentuated_count += 1 + + def reset(self) -> None: # Abstract + self._character_count = 0 + self._accentuated_count = 0 + + @property + def ratio(self) -> float: + if self._character_count < 8: + return 0.0 + + ratio_of_accentuation: float = self._accentuated_count / self._character_count + return ratio_of_accentuation if ratio_of_accentuation >= 0.35 else 0.0 + + +class UnprintablePlugin(MessDetectorPlugin): + def __init__(self) -> None: + self._unprintable_count: int = 0 + self._character_count: int = 0 + + def eligible(self, character: str) -> bool: + return True + + def feed(self, character: str) -> None: + if is_unprintable(character): + self._unprintable_count += 1 + self._character_count += 1 + + def reset(self) -> None: # Abstract + self._unprintable_count = 0 + + @property + def ratio(self) -> float: + if self._character_count == 0: + return 0.0 + + return (self._unprintable_count * 8) / self._character_count + + +class SuspiciousDuplicateAccentPlugin(MessDetectorPlugin): + def __init__(self) -> None: + self._successive_count: int = 0 + self._character_count: int = 0 + + self._last_latin_character: str | None = None + + def eligible(self, character: str) -> bool: + return character.isalpha() and is_latin(character) + + def feed(self, character: str) -> None: + self._character_count += 1 + if ( + self._last_latin_character is not None + and is_accentuated(character) + and is_accentuated(self._last_latin_character) + ): + if character.isupper() and self._last_latin_character.isupper(): + self._successive_count += 1 + # Worse if its the same char duplicated with different accent. + if remove_accent(character) == remove_accent(self._last_latin_character): + self._successive_count += 1 + self._last_latin_character = character + + def reset(self) -> None: # Abstract + self._successive_count = 0 + self._character_count = 0 + self._last_latin_character = None + + @property + def ratio(self) -> float: + if self._character_count == 0: + return 0.0 + + return (self._successive_count * 2) / self._character_count + + +class SuspiciousRange(MessDetectorPlugin): + def __init__(self) -> None: + self._suspicious_successive_range_count: int = 0 + self._character_count: int = 0 + self._last_printable_seen: str | None = None + + def eligible(self, character: str) -> bool: + return character.isprintable() + + def feed(self, character: str) -> None: + self._character_count += 1 + + if ( + character.isspace() + or is_punctuation(character) + or character in COMMON_SAFE_ASCII_CHARACTERS + ): + self._last_printable_seen = None + return + + if self._last_printable_seen is None: + self._last_printable_seen = character + return + + unicode_range_a: str | None = unicode_range(self._last_printable_seen) + unicode_range_b: str | None = unicode_range(character) + + if is_suspiciously_successive_range(unicode_range_a, unicode_range_b): + self._suspicious_successive_range_count += 1 + + self._last_printable_seen = character + + def reset(self) -> None: # Abstract + self._character_count = 0 + self._suspicious_successive_range_count = 0 + self._last_printable_seen = None + + @property + def ratio(self) -> float: + if self._character_count <= 13: + return 0.0 + + ratio_of_suspicious_range_usage: float = ( + self._suspicious_successive_range_count * 2 + ) / self._character_count + + return ratio_of_suspicious_range_usage + + +class SuperWeirdWordPlugin(MessDetectorPlugin): + def __init__(self) -> None: + self._word_count: int = 0 + self._bad_word_count: int = 0 + self._foreign_long_count: int = 0 + + self._is_current_word_bad: bool = False + self._foreign_long_watch: bool = False + + self._character_count: int = 0 + self._bad_character_count: int = 0 + + self._buffer: str = "" + self._buffer_accent_count: int = 0 + self._buffer_glyph_count: int = 0 + + def eligible(self, character: str) -> bool: + return True + + def feed(self, character: str) -> None: + if character.isalpha(): + self._buffer += character + if is_accentuated(character): + self._buffer_accent_count += 1 + if ( + self._foreign_long_watch is False + and (is_latin(character) is False or is_accentuated(character)) + and is_cjk(character) is False + and is_hangul(character) is False + and is_katakana(character) is False + and is_hiragana(character) is False + and is_thai(character) is False + ): + self._foreign_long_watch = True + if ( + is_cjk(character) + or is_hangul(character) + or is_katakana(character) + or is_hiragana(character) + or is_thai(character) + ): + self._buffer_glyph_count += 1 + return + if not self._buffer: + return + if ( + character.isspace() or is_punctuation(character) or is_separator(character) + ) and self._buffer: + self._word_count += 1 + buffer_length: int = len(self._buffer) + + self._character_count += buffer_length + + if buffer_length >= 4: + if self._buffer_accent_count / buffer_length >= 0.5: + self._is_current_word_bad = True + # Word/Buffer ending with an upper case accentuated letter are so rare, + # that we will consider them all as suspicious. Same weight as foreign_long suspicious. + elif ( + is_accentuated(self._buffer[-1]) + and self._buffer[-1].isupper() + and all(_.isupper() for _ in self._buffer) is False + ): + self._foreign_long_count += 1 + self._is_current_word_bad = True + elif self._buffer_glyph_count == 1: + self._is_current_word_bad = True + self._foreign_long_count += 1 + if buffer_length >= 24 and self._foreign_long_watch: + camel_case_dst = [ + i + for c, i in zip(self._buffer, range(0, buffer_length)) + if c.isupper() + ] + probable_camel_cased: bool = False + + if camel_case_dst and (len(camel_case_dst) / buffer_length <= 0.3): + probable_camel_cased = True + + if not probable_camel_cased: + self._foreign_long_count += 1 + self._is_current_word_bad = True + + if self._is_current_word_bad: + self._bad_word_count += 1 + self._bad_character_count += len(self._buffer) + self._is_current_word_bad = False + + self._foreign_long_watch = False + self._buffer = "" + self._buffer_accent_count = 0 + self._buffer_glyph_count = 0 + elif ( + character not in {"<", ">", "-", "=", "~", "|", "_"} + and character.isdigit() is False + and is_symbol(character) + ): + self._is_current_word_bad = True + self._buffer += character + + def reset(self) -> None: # Abstract + self._buffer = "" + self._is_current_word_bad = False + self._foreign_long_watch = False + self._bad_word_count = 0 + self._word_count = 0 + self._character_count = 0 + self._bad_character_count = 0 + self._foreign_long_count = 0 + + @property + def ratio(self) -> float: + if self._word_count <= 10 and self._foreign_long_count == 0: + return 0.0 + + return self._bad_character_count / self._character_count + + +class CjkUncommonPlugin(MessDetectorPlugin): + """ + Detect messy CJK text that probably means nothing. + """ + + def __init__(self) -> None: + self._character_count: int = 0 + self._uncommon_count: int = 0 + + def eligible(self, character: str) -> bool: + return is_cjk(character) + + def feed(self, character: str) -> None: + self._character_count += 1 + + if is_cjk_uncommon(character): + self._uncommon_count += 1 + return + + def reset(self) -> None: # Abstract + self._character_count = 0 + self._uncommon_count = 0 + + @property + def ratio(self) -> float: + if self._character_count < 8: + return 0.0 + + uncommon_form_usage: float = self._uncommon_count / self._character_count + + # we can be pretty sure it's garbage when uncommon characters are widely + # used. otherwise it could just be traditional chinese for example. + return uncommon_form_usage / 10 if uncommon_form_usage > 0.5 else 0.0 + + +class ArchaicUpperLowerPlugin(MessDetectorPlugin): + def __init__(self) -> None: + self._buf: bool = False + + self._character_count_since_last_sep: int = 0 + + self._successive_upper_lower_count: int = 0 + self._successive_upper_lower_count_final: int = 0 + + self._character_count: int = 0 + + self._last_alpha_seen: str | None = None + self._current_ascii_only: bool = True + + def eligible(self, character: str) -> bool: + return True + + def feed(self, character: str) -> None: + is_concerned = character.isalpha() and is_case_variable(character) + chunk_sep = is_concerned is False + + if chunk_sep and self._character_count_since_last_sep > 0: + if ( + self._character_count_since_last_sep <= 64 + and character.isdigit() is False + and self._current_ascii_only is False + ): + self._successive_upper_lower_count_final += ( + self._successive_upper_lower_count + ) + + self._successive_upper_lower_count = 0 + self._character_count_since_last_sep = 0 + self._last_alpha_seen = None + self._buf = False + self._character_count += 1 + self._current_ascii_only = True + + return + + if self._current_ascii_only is True and character.isascii() is False: + self._current_ascii_only = False + + if self._last_alpha_seen is not None: + if (character.isupper() and self._last_alpha_seen.islower()) or ( + character.islower() and self._last_alpha_seen.isupper() + ): + if self._buf is True: + self._successive_upper_lower_count += 2 + self._buf = False + else: + self._buf = True + else: + self._buf = False + + self._character_count += 1 + self._character_count_since_last_sep += 1 + self._last_alpha_seen = character + + def reset(self) -> None: # Abstract + self._character_count = 0 + self._character_count_since_last_sep = 0 + self._successive_upper_lower_count = 0 + self._successive_upper_lower_count_final = 0 + self._last_alpha_seen = None + self._buf = False + self._current_ascii_only = True + + @property + def ratio(self) -> float: + if self._character_count == 0: + return 0.0 + + return self._successive_upper_lower_count_final / self._character_count + + +class ArabicIsolatedFormPlugin(MessDetectorPlugin): + def __init__(self) -> None: + self._character_count: int = 0 + self._isolated_form_count: int = 0 + + def reset(self) -> None: # Abstract + self._character_count = 0 + self._isolated_form_count = 0 + + def eligible(self, character: str) -> bool: + return is_arabic(character) + + def feed(self, character: str) -> None: + self._character_count += 1 + + if is_arabic_isolated_form(character): + self._isolated_form_count += 1 + + @property + def ratio(self) -> float: + if self._character_count < 8: + return 0.0 + + isolated_form_usage: float = self._isolated_form_count / self._character_count + + return isolated_form_usage + + +@lru_cache(maxsize=1024) +def is_suspiciously_successive_range( + unicode_range_a: str | None, unicode_range_b: str | None +) -> bool: + """ + Determine if two Unicode range seen next to each other can be considered as suspicious. + """ + if unicode_range_a is None or unicode_range_b is None: + return True + + if unicode_range_a == unicode_range_b: + return False + + if "Latin" in unicode_range_a and "Latin" in unicode_range_b: + return False + + if "Emoticons" in unicode_range_a or "Emoticons" in unicode_range_b: + return False + + # Latin characters can be accompanied with a combining diacritical mark + # eg. Vietnamese. + if ("Latin" in unicode_range_a or "Latin" in unicode_range_b) and ( + "Combining" in unicode_range_a or "Combining" in unicode_range_b + ): + return False + + keywords_range_a, keywords_range_b = ( + unicode_range_a.split(" "), + unicode_range_b.split(" "), + ) + + for el in keywords_range_a: + if el in UNICODE_SECONDARY_RANGE_KEYWORD: + continue + if el in keywords_range_b: + return False + + # Japanese Exception + range_a_jp_chars, range_b_jp_chars = ( + unicode_range_a + in ( + "Hiragana", + "Katakana", + ), + unicode_range_b in ("Hiragana", "Katakana"), + ) + if (range_a_jp_chars or range_b_jp_chars) and ( + "CJK" in unicode_range_a or "CJK" in unicode_range_b + ): + return False + if range_a_jp_chars and range_b_jp_chars: + return False + + if "Hangul" in unicode_range_a or "Hangul" in unicode_range_b: + if "CJK" in unicode_range_a or "CJK" in unicode_range_b: + return False + if unicode_range_a == "Basic Latin" or unicode_range_b == "Basic Latin": + return False + + # Chinese/Japanese use dedicated range for punctuation and/or separators. + if ("CJK" in unicode_range_a or "CJK" in unicode_range_b) or ( + unicode_range_a in ["Katakana", "Hiragana"] + and unicode_range_b in ["Katakana", "Hiragana"] + ): + if "Punctuation" in unicode_range_a or "Punctuation" in unicode_range_b: + return False + if "Forms" in unicode_range_a or "Forms" in unicode_range_b: + return False + if unicode_range_a == "Basic Latin" or unicode_range_b == "Basic Latin": + return False + + return True + + +@lru_cache(maxsize=2048) +def mess_ratio( + decoded_sequence: str, maximum_threshold: float = 0.2, debug: bool = False +) -> float: + """ + Compute a mess ratio given a decoded bytes sequence. The maximum threshold does stop the computation earlier. + """ + + detectors: list[MessDetectorPlugin] = [ + md_class() for md_class in MessDetectorPlugin.__subclasses__() + ] + + length: int = len(decoded_sequence) + 1 + + mean_mess_ratio: float = 0.0 + + if length < 512: + intermediary_mean_mess_ratio_calc: int = 32 + elif length <= 1024: + intermediary_mean_mess_ratio_calc = 64 + else: + intermediary_mean_mess_ratio_calc = 128 + + for character, index in zip(decoded_sequence + "\n", range(length)): + for detector in detectors: + if detector.eligible(character): + detector.feed(character) + + if ( + index > 0 and index % intermediary_mean_mess_ratio_calc == 0 + ) or index == length - 1: + mean_mess_ratio = sum(dt.ratio for dt in detectors) + + if mean_mess_ratio >= maximum_threshold: + break + + if debug: + logger = getLogger("charset_normalizer") + + logger.log( + TRACE, + "Mess-detector extended-analysis start. " + f"intermediary_mean_mess_ratio_calc={intermediary_mean_mess_ratio_calc} mean_mess_ratio={mean_mess_ratio} " + f"maximum_threshold={maximum_threshold}", + ) + + if len(decoded_sequence) > 16: + logger.log(TRACE, f"Starting with: {decoded_sequence[:16]}") + logger.log(TRACE, f"Ending with: {decoded_sequence[-16::]}") + + for dt in detectors: + logger.log(TRACE, f"{dt.__class__}: {dt.ratio}") + + return round(mean_mess_ratio, 3) diff --git a/venv/lib/python3.11/site-packages/charset_normalizer/md__mypyc.cpython-311-x86_64-linux-gnu.so b/venv/lib/python3.11/site-packages/charset_normalizer/md__mypyc.cpython-311-x86_64-linux-gnu.so new file mode 100755 index 0000000000000000000000000000000000000000..7ce82fbb96a7f3b07230265061574cece6a70273 GIT binary patch literal 282232 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

    ?4fx_b8%_zsc-ljPv&^ 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 Ov2gm@0>Z*$@BaV>7|TTf literal 0 HcmV?d00001 diff --git a/venv/lib/python3.11/site-packages/charset_normalizer/models.py b/venv/lib/python3.11/site-packages/charset_normalizer/models.py new file mode 100644 index 0000000..1042758 --- /dev/null +++ b/venv/lib/python3.11/site-packages/charset_normalizer/models.py @@ -0,0 +1,360 @@ +from __future__ import annotations + +from encodings.aliases import aliases +from hashlib import sha256 +from json import dumps +from re import sub +from typing import Any, Iterator, List, Tuple + +from .constant import RE_POSSIBLE_ENCODING_INDICATION, TOO_BIG_SEQUENCE +from .utils import iana_name, is_multi_byte_encoding, unicode_range + + +class CharsetMatch: + def __init__( + self, + payload: bytes, + guessed_encoding: str, + mean_mess_ratio: float, + has_sig_or_bom: bool, + languages: CoherenceMatches, + decoded_payload: str | None = None, + preemptive_declaration: str | None = None, + ): + self._payload: bytes = payload + + self._encoding: str = guessed_encoding + self._mean_mess_ratio: float = mean_mess_ratio + self._languages: CoherenceMatches = languages + self._has_sig_or_bom: bool = has_sig_or_bom + self._unicode_ranges: list[str] | None = None + + self._leaves: list[CharsetMatch] = [] + self._mean_coherence_ratio: float = 0.0 + + self._output_payload: bytes | None = None + self._output_encoding: str | None = None + + self._string: str | None = decoded_payload + + self._preemptive_declaration: str | None = preemptive_declaration + + def __eq__(self, other: object) -> bool: + if not isinstance(other, CharsetMatch): + if isinstance(other, str): + return iana_name(other) == self.encoding + return False + return self.encoding == other.encoding and self.fingerprint == other.fingerprint + + def __lt__(self, other: object) -> bool: + """ + Implemented to make sorted available upon CharsetMatches items. + """ + if not isinstance(other, CharsetMatch): + raise ValueError + + chaos_difference: float = abs(self.chaos - other.chaos) + coherence_difference: float = abs(self.coherence - other.coherence) + + # Below 1% difference --> Use Coherence + if chaos_difference < 0.01 and coherence_difference > 0.02: + return self.coherence > other.coherence + elif chaos_difference < 0.01 and coherence_difference <= 0.02: + # When having a difficult decision, use the result that decoded as many multi-byte as possible. + # preserve RAM usage! + if len(self._payload) >= TOO_BIG_SEQUENCE: + return self.chaos < other.chaos + return self.multi_byte_usage > other.multi_byte_usage + + return self.chaos < other.chaos + + @property + def multi_byte_usage(self) -> float: + return 1.0 - (len(str(self)) / len(self.raw)) + + def __str__(self) -> str: + # Lazy Str Loading + if self._string is None: + self._string = str(self._payload, self._encoding, "strict") + return self._string + + def __repr__(self) -> str: + return f"" + + def add_submatch(self, other: CharsetMatch) -> None: + if not isinstance(other, CharsetMatch) or other == self: + raise ValueError( + "Unable to add instance <{}> as a submatch of a CharsetMatch".format( + other.__class__ + ) + ) + + other._string = None # Unload RAM usage; dirty trick. + self._leaves.append(other) + + @property + def encoding(self) -> str: + return self._encoding + + @property + def encoding_aliases(self) -> list[str]: + """ + Encoding name are known by many name, using this could help when searching for IBM855 when it's listed as CP855. + """ + also_known_as: list[str] = [] + for u, p in aliases.items(): + if self.encoding == u: + also_known_as.append(p) + elif self.encoding == p: + also_known_as.append(u) + return also_known_as + + @property + def bom(self) -> bool: + return self._has_sig_or_bom + + @property + def byte_order_mark(self) -> bool: + return self._has_sig_or_bom + + @property + def languages(self) -> list[str]: + """ + Return the complete list of possible languages found in decoded sequence. + Usually not really useful. Returned list may be empty even if 'language' property return something != 'Unknown'. + """ + return [e[0] for e in self._languages] + + @property + def language(self) -> str: + """ + Most probable language found in decoded sequence. If none were detected or inferred, the property will return + "Unknown". + """ + if not self._languages: + # Trying to infer the language based on the given encoding + # Its either English or we should not pronounce ourselves in certain cases. + if "ascii" in self.could_be_from_charset: + return "English" + + # doing it there to avoid circular import + from charset_normalizer.cd import encoding_languages, mb_encoding_languages + + languages = ( + mb_encoding_languages(self.encoding) + if is_multi_byte_encoding(self.encoding) + else encoding_languages(self.encoding) + ) + + if len(languages) == 0 or "Latin Based" in languages: + return "Unknown" + + return languages[0] + + return self._languages[0][0] + + @property + def chaos(self) -> float: + return self._mean_mess_ratio + + @property + def coherence(self) -> float: + if not self._languages: + return 0.0 + return self._languages[0][1] + + @property + def percent_chaos(self) -> float: + return round(self.chaos * 100, ndigits=3) + + @property + def percent_coherence(self) -> float: + return round(self.coherence * 100, ndigits=3) + + @property + def raw(self) -> bytes: + """ + Original untouched bytes. + """ + return self._payload + + @property + def submatch(self) -> list[CharsetMatch]: + return self._leaves + + @property + def has_submatch(self) -> bool: + return len(self._leaves) > 0 + + @property + def alphabets(self) -> list[str]: + if self._unicode_ranges is not None: + return self._unicode_ranges + # list detected ranges + detected_ranges: list[str | None] = [unicode_range(char) for char in str(self)] + # filter and sort + self._unicode_ranges = sorted(list({r for r in detected_ranges if r})) + return self._unicode_ranges + + @property + def could_be_from_charset(self) -> list[str]: + """ + The complete list of encoding that output the exact SAME str result and therefore could be the originating + encoding. + This list does include the encoding available in property 'encoding'. + """ + return [self._encoding] + [m.encoding for m in self._leaves] + + def output(self, encoding: str = "utf_8") -> bytes: + """ + Method to get re-encoded bytes payload using given target encoding. Default to UTF-8. + Any errors will be simply ignored by the encoder NOT replaced. + """ + if self._output_encoding is None or self._output_encoding != encoding: + self._output_encoding = encoding + decoded_string = str(self) + if ( + self._preemptive_declaration is not None + and self._preemptive_declaration.lower() + not in ["utf-8", "utf8", "utf_8"] + ): + patched_header = sub( + RE_POSSIBLE_ENCODING_INDICATION, + lambda m: m.string[m.span()[0] : m.span()[1]].replace( + m.groups()[0], + iana_name(self._output_encoding).replace("_", "-"), # type: ignore[arg-type] + ), + decoded_string[:8192], + count=1, + ) + + decoded_string = patched_header + decoded_string[8192:] + + self._output_payload = decoded_string.encode(encoding, "replace") + + return self._output_payload # type: ignore + + @property + def fingerprint(self) -> str: + """ + Retrieve the unique SHA256 computed using the transformed (re-encoded) payload. Not the original one. + """ + return sha256(self.output()).hexdigest() + + +class CharsetMatches: + """ + Container with every CharsetMatch items ordered by default from most probable to the less one. + Act like a list(iterable) but does not implements all related methods. + """ + + def __init__(self, results: list[CharsetMatch] | None = None): + self._results: list[CharsetMatch] = sorted(results) if results else [] + + def __iter__(self) -> Iterator[CharsetMatch]: + yield from self._results + + def __getitem__(self, item: int | str) -> CharsetMatch: + """ + Retrieve a single item either by its position or encoding name (alias may be used here). + Raise KeyError upon invalid index or encoding not present in results. + """ + if isinstance(item, int): + return self._results[item] + if isinstance(item, str): + item = iana_name(item, False) + for result in self._results: + if item in result.could_be_from_charset: + return result + raise KeyError + + def __len__(self) -> int: + return len(self._results) + + def __bool__(self) -> bool: + return len(self._results) > 0 + + def append(self, item: CharsetMatch) -> None: + """ + Insert a single match. Will be inserted accordingly to preserve sort. + Can be inserted as a submatch. + """ + if not isinstance(item, CharsetMatch): + raise ValueError( + "Cannot append instance '{}' to CharsetMatches".format( + str(item.__class__) + ) + ) + # We should disable the submatch factoring when the input file is too heavy (conserve RAM usage) + if len(item.raw) < TOO_BIG_SEQUENCE: + for match in self._results: + if match.fingerprint == item.fingerprint and match.chaos == item.chaos: + match.add_submatch(item) + return + self._results.append(item) + self._results = sorted(self._results) + + def best(self) -> CharsetMatch | None: + """ + Simply return the first match. Strict equivalent to matches[0]. + """ + if not self._results: + return None + return self._results[0] + + def first(self) -> CharsetMatch | None: + """ + Redundant method, call the method best(). Kept for BC reasons. + """ + return self.best() + + +CoherenceMatch = Tuple[str, float] +CoherenceMatches = List[CoherenceMatch] + + +class CliDetectionResult: + def __init__( + self, + path: str, + encoding: str | None, + encoding_aliases: list[str], + alternative_encodings: list[str], + language: str, + alphabets: list[str], + has_sig_or_bom: bool, + chaos: float, + coherence: float, + unicode_path: str | None, + is_preferred: bool, + ): + self.path: str = path + self.unicode_path: str | None = unicode_path + self.encoding: str | None = encoding + self.encoding_aliases: list[str] = encoding_aliases + self.alternative_encodings: list[str] = alternative_encodings + self.language: str = language + self.alphabets: list[str] = alphabets + self.has_sig_or_bom: bool = has_sig_or_bom + self.chaos: float = chaos + self.coherence: float = coherence + self.is_preferred: bool = is_preferred + + @property + def __dict__(self) -> dict[str, Any]: # type: ignore + return { + "path": self.path, + "encoding": self.encoding, + "encoding_aliases": self.encoding_aliases, + "alternative_encodings": self.alternative_encodings, + "language": self.language, + "alphabets": self.alphabets, + "has_sig_or_bom": self.has_sig_or_bom, + "chaos": self.chaos, + "coherence": self.coherence, + "unicode_path": self.unicode_path, + "is_preferred": self.is_preferred, + } + + def to_json(self) -> str: + return dumps(self.__dict__, ensure_ascii=True, indent=4) diff --git a/venv/lib/python3.11/site-packages/charset_normalizer/py.typed b/venv/lib/python3.11/site-packages/charset_normalizer/py.typed new file mode 100644 index 0000000..e69de29 diff --git a/venv/lib/python3.11/site-packages/charset_normalizer/utils.py b/venv/lib/python3.11/site-packages/charset_normalizer/utils.py new file mode 100644 index 0000000..6bf0384 --- /dev/null +++ b/venv/lib/python3.11/site-packages/charset_normalizer/utils.py @@ -0,0 +1,414 @@ +from __future__ import annotations + +import importlib +import logging +import unicodedata +from codecs import IncrementalDecoder +from encodings.aliases import aliases +from functools import lru_cache +from re import findall +from typing import Generator + +from _multibytecodec import ( # type: ignore[import-not-found,import] + MultibyteIncrementalDecoder, +) + +from .constant import ( + ENCODING_MARKS, + IANA_SUPPORTED_SIMILAR, + RE_POSSIBLE_ENCODING_INDICATION, + UNICODE_RANGES_COMBINED, + UNICODE_SECONDARY_RANGE_KEYWORD, + UTF8_MAXIMAL_ALLOCATION, + COMMON_CJK_CHARACTERS, +) + + +@lru_cache(maxsize=UTF8_MAXIMAL_ALLOCATION) +def is_accentuated(character: str) -> bool: + try: + description: str = unicodedata.name(character) + except ValueError: # Defensive: unicode database outdated? + return False + return ( + "WITH GRAVE" in description + or "WITH ACUTE" in description + or "WITH CEDILLA" in description + or "WITH DIAERESIS" in description + or "WITH CIRCUMFLEX" in description + or "WITH TILDE" in description + or "WITH MACRON" in description + or "WITH RING ABOVE" in description + ) + + +@lru_cache(maxsize=UTF8_MAXIMAL_ALLOCATION) +def remove_accent(character: str) -> str: + decomposed: str = unicodedata.decomposition(character) + if not decomposed: + return character + + codes: list[str] = decomposed.split(" ") + + return chr(int(codes[0], 16)) + + +@lru_cache(maxsize=UTF8_MAXIMAL_ALLOCATION) +def unicode_range(character: str) -> str | None: + """ + Retrieve the Unicode range official name from a single character. + """ + character_ord: int = ord(character) + + for range_name, ord_range in UNICODE_RANGES_COMBINED.items(): + if character_ord in ord_range: + return range_name + + return None + + +@lru_cache(maxsize=UTF8_MAXIMAL_ALLOCATION) +def is_latin(character: str) -> bool: + try: + description: str = unicodedata.name(character) + except ValueError: # Defensive: unicode database outdated? + return False + return "LATIN" in description + + +@lru_cache(maxsize=UTF8_MAXIMAL_ALLOCATION) +def is_punctuation(character: str) -> bool: + character_category: str = unicodedata.category(character) + + if "P" in character_category: + return True + + character_range: str | None = unicode_range(character) + + if character_range is None: + return False + + return "Punctuation" in character_range + + +@lru_cache(maxsize=UTF8_MAXIMAL_ALLOCATION) +def is_symbol(character: str) -> bool: + character_category: str = unicodedata.category(character) + + if "S" in character_category or "N" in character_category: + return True + + character_range: str | None = unicode_range(character) + + if character_range is None: + return False + + return "Forms" in character_range and character_category != "Lo" + + +@lru_cache(maxsize=UTF8_MAXIMAL_ALLOCATION) +def is_emoticon(character: str) -> bool: + character_range: str | None = unicode_range(character) + + if character_range is None: + return False + + return "Emoticons" in character_range or "Pictographs" in character_range + + +@lru_cache(maxsize=UTF8_MAXIMAL_ALLOCATION) +def is_separator(character: str) -> bool: + if character.isspace() or character in {"|", "+", "<", ">"}: + return True + + character_category: str = unicodedata.category(character) + + return "Z" in character_category or character_category in {"Po", "Pd", "Pc"} + + +@lru_cache(maxsize=UTF8_MAXIMAL_ALLOCATION) +def is_case_variable(character: str) -> bool: + return character.islower() != character.isupper() + + +@lru_cache(maxsize=UTF8_MAXIMAL_ALLOCATION) +def is_cjk(character: str) -> bool: + try: + character_name = unicodedata.name(character) + except ValueError: # Defensive: unicode database outdated? + return False + + return "CJK" in character_name + + +@lru_cache(maxsize=UTF8_MAXIMAL_ALLOCATION) +def is_hiragana(character: str) -> bool: + try: + character_name = unicodedata.name(character) + except ValueError: # Defensive: unicode database outdated? + return False + + return "HIRAGANA" in character_name + + +@lru_cache(maxsize=UTF8_MAXIMAL_ALLOCATION) +def is_katakana(character: str) -> bool: + try: + character_name = unicodedata.name(character) + except ValueError: # Defensive: unicode database outdated? + return False + + return "KATAKANA" in character_name + + +@lru_cache(maxsize=UTF8_MAXIMAL_ALLOCATION) +def is_hangul(character: str) -> bool: + try: + character_name = unicodedata.name(character) + except ValueError: # Defensive: unicode database outdated? + return False + + return "HANGUL" in character_name + + +@lru_cache(maxsize=UTF8_MAXIMAL_ALLOCATION) +def is_thai(character: str) -> bool: + try: + character_name = unicodedata.name(character) + except ValueError: # Defensive: unicode database outdated? + return False + + return "THAI" in character_name + + +@lru_cache(maxsize=UTF8_MAXIMAL_ALLOCATION) +def is_arabic(character: str) -> bool: + try: + character_name = unicodedata.name(character) + except ValueError: # Defensive: unicode database outdated? + return False + + return "ARABIC" in character_name + + +@lru_cache(maxsize=UTF8_MAXIMAL_ALLOCATION) +def is_arabic_isolated_form(character: str) -> bool: + try: + character_name = unicodedata.name(character) + except ValueError: # Defensive: unicode database outdated? + return False + + return "ARABIC" in character_name and "ISOLATED FORM" in character_name + + +@lru_cache(maxsize=UTF8_MAXIMAL_ALLOCATION) +def is_cjk_uncommon(character: str) -> bool: + return character not in COMMON_CJK_CHARACTERS + + +@lru_cache(maxsize=len(UNICODE_RANGES_COMBINED)) +def is_unicode_range_secondary(range_name: str) -> bool: + return any(keyword in range_name for keyword in UNICODE_SECONDARY_RANGE_KEYWORD) + + +@lru_cache(maxsize=UTF8_MAXIMAL_ALLOCATION) +def is_unprintable(character: str) -> bool: + return ( + character.isspace() is False # includes \n \t \r \v + and character.isprintable() is False + and character != "\x1a" # Why? Its the ASCII substitute character. + and character != "\ufeff" # bug discovered in Python, + # Zero Width No-Break Space located in Arabic Presentation Forms-B, Unicode 1.1 not acknowledged as space. + ) + + +def any_specified_encoding(sequence: bytes, search_zone: int = 8192) -> str | None: + """ + Extract using ASCII-only decoder any specified encoding in the first n-bytes. + """ + if not isinstance(sequence, bytes): + raise TypeError + + seq_len: int = len(sequence) + + results: list[str] = findall( + RE_POSSIBLE_ENCODING_INDICATION, + sequence[: min(seq_len, search_zone)].decode("ascii", errors="ignore"), + ) + + if len(results) == 0: + return None + + for specified_encoding in results: + specified_encoding = specified_encoding.lower().replace("-", "_") + + encoding_alias: str + encoding_iana: str + + for encoding_alias, encoding_iana in aliases.items(): + if encoding_alias == specified_encoding: + return encoding_iana + if encoding_iana == specified_encoding: + return encoding_iana + + return None + + +@lru_cache(maxsize=128) +def is_multi_byte_encoding(name: str) -> bool: + """ + Verify is a specific encoding is a multi byte one based on it IANA name + """ + return name in { + "utf_8", + "utf_8_sig", + "utf_16", + "utf_16_be", + "utf_16_le", + "utf_32", + "utf_32_le", + "utf_32_be", + "utf_7", + } or issubclass( + importlib.import_module(f"encodings.{name}").IncrementalDecoder, + MultibyteIncrementalDecoder, + ) + + +def identify_sig_or_bom(sequence: bytes) -> tuple[str | None, bytes]: + """ + Identify and extract SIG/BOM in given sequence. + """ + + for iana_encoding in ENCODING_MARKS: + marks: bytes | list[bytes] = ENCODING_MARKS[iana_encoding] + + if isinstance(marks, bytes): + marks = [marks] + + for mark in marks: + if sequence.startswith(mark): + return iana_encoding, mark + + return None, b"" + + +def should_strip_sig_or_bom(iana_encoding: str) -> bool: + return iana_encoding not in {"utf_16", "utf_32"} + + +def iana_name(cp_name: str, strict: bool = True) -> str: + """Returns the Python normalized encoding name (Not the IANA official name).""" + cp_name = cp_name.lower().replace("-", "_") + + encoding_alias: str + encoding_iana: str + + for encoding_alias, encoding_iana in aliases.items(): + if cp_name in [encoding_alias, encoding_iana]: + return encoding_iana + + if strict: + raise ValueError(f"Unable to retrieve IANA for '{cp_name}'") + + return cp_name + + +def cp_similarity(iana_name_a: str, iana_name_b: str) -> float: + if is_multi_byte_encoding(iana_name_a) or is_multi_byte_encoding(iana_name_b): + return 0.0 + + decoder_a = importlib.import_module(f"encodings.{iana_name_a}").IncrementalDecoder + decoder_b = importlib.import_module(f"encodings.{iana_name_b}").IncrementalDecoder + + id_a: IncrementalDecoder = decoder_a(errors="ignore") + id_b: IncrementalDecoder = decoder_b(errors="ignore") + + character_match_count: int = 0 + + for i in range(255): + to_be_decoded: bytes = bytes([i]) + if id_a.decode(to_be_decoded) == id_b.decode(to_be_decoded): + character_match_count += 1 + + return character_match_count / 254 + + +def is_cp_similar(iana_name_a: str, iana_name_b: str) -> bool: + """ + Determine if two code page are at least 80% similar. IANA_SUPPORTED_SIMILAR dict was generated using + the function cp_similarity. + """ + return ( + iana_name_a in IANA_SUPPORTED_SIMILAR + and iana_name_b in IANA_SUPPORTED_SIMILAR[iana_name_a] + ) + + +def set_logging_handler( + name: str = "charset_normalizer", + level: int = logging.INFO, + format_string: str = "%(asctime)s | %(levelname)s | %(message)s", +) -> None: + logger = logging.getLogger(name) + logger.setLevel(level) + + handler = logging.StreamHandler() + handler.setFormatter(logging.Formatter(format_string)) + logger.addHandler(handler) + + +def cut_sequence_chunks( + sequences: bytes, + encoding_iana: str, + offsets: range, + chunk_size: int, + bom_or_sig_available: bool, + strip_sig_or_bom: bool, + sig_payload: bytes, + is_multi_byte_decoder: bool, + decoded_payload: str | None = None, +) -> Generator[str, None, None]: + if decoded_payload and is_multi_byte_decoder is False: + for i in offsets: + chunk = decoded_payload[i : i + chunk_size] + if not chunk: + break + yield chunk + else: + for i in offsets: + chunk_end = i + chunk_size + if chunk_end > len(sequences) + 8: + continue + + cut_sequence = sequences[i : i + chunk_size] + + if bom_or_sig_available and strip_sig_or_bom is False: + cut_sequence = sig_payload + cut_sequence + + chunk = cut_sequence.decode( + encoding_iana, + errors="ignore" if is_multi_byte_decoder else "strict", + ) + + # multi-byte bad cutting detector and adjustment + # not the cleanest way to perform that fix but clever enough for now. + if is_multi_byte_decoder and i > 0: + chunk_partial_size_chk: int = min(chunk_size, 16) + + if ( + decoded_payload + and chunk[:chunk_partial_size_chk] not in decoded_payload + ): + for j in range(i, i - 4, -1): + cut_sequence = sequences[j:chunk_end] + + if bom_or_sig_available and strip_sig_or_bom is False: + cut_sequence = sig_payload + cut_sequence + + chunk = cut_sequence.decode(encoding_iana, errors="ignore") + + if chunk[:chunk_partial_size_chk] in decoded_payload: + break + + yield chunk diff --git a/venv/lib/python3.11/site-packages/charset_normalizer/version.py b/venv/lib/python3.11/site-packages/charset_normalizer/version.py new file mode 100644 index 0000000..c843e53 --- /dev/null +++ b/venv/lib/python3.11/site-packages/charset_normalizer/version.py @@ -0,0 +1,8 @@ +""" +Expose version +""" + +from __future__ import annotations + +__version__ = "3.4.4" +VERSION = __version__.split(".") diff --git a/venv/lib/python3.11/site-packages/click-8.3.1.dist-info/INSTALLER b/venv/lib/python3.11/site-packages/click-8.3.1.dist-info/INSTALLER new file mode 100644 index 0000000..a1b589e --- /dev/null +++ b/venv/lib/python3.11/site-packages/click-8.3.1.dist-info/INSTALLER @@ -0,0 +1 @@ +pip diff --git a/venv/lib/python3.11/site-packages/click-8.3.1.dist-info/METADATA b/venv/lib/python3.11/site-packages/click-8.3.1.dist-info/METADATA new file mode 100644 index 0000000..3f433af --- /dev/null +++ b/venv/lib/python3.11/site-packages/click-8.3.1.dist-info/METADATA @@ -0,0 +1,84 @@ +Metadata-Version: 2.4 +Name: click +Version: 8.3.1 +Summary: Composable command line interface toolkit +Maintainer-email: Pallets +Requires-Python: >=3.10 +Description-Content-Type: text/markdown +License-Expression: BSD-3-Clause +Classifier: Development Status :: 5 - Production/Stable +Classifier: Intended Audience :: Developers +Classifier: Operating System :: OS Independent +Classifier: Programming Language :: Python +Classifier: Typing :: Typed +License-File: LICENSE.txt +Requires-Dist: colorama; platform_system == 'Windows' +Project-URL: Changes, https://click.palletsprojects.com/page/changes/ +Project-URL: Chat, https://discord.gg/pallets +Project-URL: Documentation, https://click.palletsprojects.com/ +Project-URL: Donate, https://palletsprojects.com/donate +Project-URL: Source, https://github.com/pallets/click/ + +

    + +# Click + +Click is a Python package for creating beautiful command line interfaces +in a composable way with as little code as necessary. It's the "Command +Line Interface Creation Kit". It's highly configurable but comes with +sensible defaults out of the box. + +It aims to make the process of writing command line tools quick and fun +while also preventing any frustration caused by the inability to +implement an intended CLI API. + +Click in three points: + +- Arbitrary nesting of commands +- Automatic help page generation +- Supports lazy loading of subcommands at runtime + + +## A Simple Example + +```python +import click + +@click.command() +@click.option("--count", default=1, help="Number of greetings.") +@click.option("--name", prompt="Your name", help="The person to greet.") +def hello(count, name): + """Simple program that greets NAME for a total of COUNT times.""" + for _ in range(count): + click.echo(f"Hello, {name}!") + +if __name__ == '__main__': + hello() +``` + +``` +$ python hello.py --count=3 +Your name: Click +Hello, Click! +Hello, Click! +Hello, Click! +``` + + +## Donate + +The Pallets organization develops and supports Click and other popular +packages. In order to grow the community of contributors and users, and +allow the maintainers to devote more time to the projects, [please +donate today][]. + +[please donate today]: https://palletsprojects.com/donate + +## Contributing + +See our [detailed contributing documentation][contrib] for many ways to +contribute, including reporting issues, requesting features, asking or answering +questions, and making PRs. + +[contrib]: https://palletsprojects.com/contributing/ + diff --git a/venv/lib/python3.11/site-packages/click-8.3.1.dist-info/RECORD b/venv/lib/python3.11/site-packages/click-8.3.1.dist-info/RECORD new file mode 100644 index 0000000..d17bfe7 --- /dev/null +++ b/venv/lib/python3.11/site-packages/click-8.3.1.dist-info/RECORD @@ -0,0 +1,40 @@ +click-8.3.1.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 +click-8.3.1.dist-info/METADATA,sha256=XZeBrMAE0ghTE88SjfrSDuSyNCpBPplxJR1tbwD9oZg,2621 +click-8.3.1.dist-info/RECORD,, +click-8.3.1.dist-info/WHEEL,sha256=G2gURzTEtmeR8nrdXUJfNiB3VYVxigPQ-bEQujpNiNs,82 +click-8.3.1.dist-info/licenses/LICENSE.txt,sha256=morRBqOU6FO_4h9C9OctWSgZoigF2ZG18ydQKSkrZY0,1475 +click/__init__.py,sha256=6YyS1aeyknZ0LYweWozNZy0A9nZ_11wmYIhv3cbQrYo,4473 +click/__pycache__/__init__.cpython-311.pyc,, +click/__pycache__/_compat.cpython-311.pyc,, +click/__pycache__/_termui_impl.cpython-311.pyc,, +click/__pycache__/_textwrap.cpython-311.pyc,, +click/__pycache__/_utils.cpython-311.pyc,, +click/__pycache__/_winconsole.cpython-311.pyc,, +click/__pycache__/core.cpython-311.pyc,, +click/__pycache__/decorators.cpython-311.pyc,, +click/__pycache__/exceptions.cpython-311.pyc,, +click/__pycache__/formatting.cpython-311.pyc,, +click/__pycache__/globals.cpython-311.pyc,, +click/__pycache__/parser.cpython-311.pyc,, +click/__pycache__/shell_completion.cpython-311.pyc,, +click/__pycache__/termui.cpython-311.pyc,, +click/__pycache__/testing.cpython-311.pyc,, +click/__pycache__/types.cpython-311.pyc,, +click/__pycache__/utils.cpython-311.pyc,, +click/_compat.py,sha256=v3xBZkFbvA1BXPRkFfBJc6-pIwPI7345m-kQEnpVAs4,18693 +click/_termui_impl.py,sha256=rgCb3On8X5A4200rA5L6i13u5iapmFer7sru57Jy6zA,27093 +click/_textwrap.py,sha256=BOae0RQ6vg3FkNgSJyOoGzG1meGMxJ_ukWVZKx_v-0o,1400 +click/_utils.py,sha256=kZwtTf5gMuCilJJceS2iTCvRvCY-0aN5rJq8gKw7p8g,943 +click/_winconsole.py,sha256=_vxUuUaxwBhoR0vUWCNuHY8VUefiMdCIyU2SXPqoF-A,8465 +click/core.py,sha256=U6Bfxt8GkjNDqyJ0HqXvluJHtyZ4sY5USAvM1Cdq7mQ,132105 +click/decorators.py,sha256=5P7abhJtAQYp_KHgjUvhMv464ERwOzrv2enNknlwHyQ,18461 +click/exceptions.py,sha256=8utf8w6V5hJXMnO_ic1FNrtbwuEn1NUu1aDwV8UqnG4,9954 +click/formatting.py,sha256=RVfwwr0rwWNpgGr8NaHodPzkIr7_tUyVh_nDdanLMNc,9730 +click/globals.py,sha256=gM-Nh6A4M0HB_SgkaF5M4ncGGMDHc_flHXu9_oh4GEU,1923 +click/parser.py,sha256=Q31pH0FlQZEq-UXE_ABRzlygEfvxPTuZbWNh4xfXmzw,19010 +click/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +click/shell_completion.py,sha256=Cc4GQUFuWpfQBa9sF5qXeeYI7n3tI_1k6ZdSn4BZbT0,20994 +click/termui.py,sha256=hqCEjNndU-nzW08nRAkBaVgfZp_FdCA9KxfIWlKYaMc,31037 +click/testing.py,sha256=EERbzcl1br0mW0qBS9EqkknfNfXB9WQEW0ELIpkvuSs,19102 +click/types.py,sha256=ek54BNSFwPKsqtfT7jsqcc4WHui8AIFVMKM4oVZIXhc,39927 +click/utils.py,sha256=gCUoewdAhA-QLBUUHxrLh4uj6m7T1WjZZMNPvR0I7YA,20257 diff --git a/venv/lib/python3.11/site-packages/click-8.3.1.dist-info/WHEEL b/venv/lib/python3.11/site-packages/click-8.3.1.dist-info/WHEEL new file mode 100644 index 0000000..d8b9936 --- /dev/null +++ b/venv/lib/python3.11/site-packages/click-8.3.1.dist-info/WHEEL @@ -0,0 +1,4 @@ +Wheel-Version: 1.0 +Generator: flit 3.12.0 +Root-Is-Purelib: true +Tag: py3-none-any diff --git a/venv/lib/python3.11/site-packages/click-8.3.1.dist-info/licenses/LICENSE.txt b/venv/lib/python3.11/site-packages/click-8.3.1.dist-info/licenses/LICENSE.txt new file mode 100644 index 0000000..d12a849 --- /dev/null +++ b/venv/lib/python3.11/site-packages/click-8.3.1.dist-info/licenses/LICENSE.txt @@ -0,0 +1,28 @@ +Copyright 2014 Pallets + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + +1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + +2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + +3. Neither the name of the copyright holder nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A +PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED +TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF +LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING +NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/venv/lib/python3.11/site-packages/click/__init__.py b/venv/lib/python3.11/site-packages/click/__init__.py new file mode 100644 index 0000000..1aa547c --- /dev/null +++ b/venv/lib/python3.11/site-packages/click/__init__.py @@ -0,0 +1,123 @@ +""" +Click is a simple Python module inspired by the stdlib optparse to make +writing command line scripts fun. Unlike other modules, it's based +around a simple API that does not come with too much magic and is +composable. +""" + +from __future__ import annotations + +from .core import Argument as Argument +from .core import Command as Command +from .core import CommandCollection as CommandCollection +from .core import Context as Context +from .core import Group as Group +from .core import Option as Option +from .core import Parameter as Parameter +from .decorators import argument as argument +from .decorators import command as command +from .decorators import confirmation_option as confirmation_option +from .decorators import group as group +from .decorators import help_option as help_option +from .decorators import make_pass_decorator as make_pass_decorator +from .decorators import option as option +from .decorators import pass_context as pass_context +from .decorators import pass_obj as pass_obj +from .decorators import password_option as password_option +from .decorators import version_option as version_option +from .exceptions import Abort as Abort +from .exceptions import BadArgumentUsage as BadArgumentUsage +from .exceptions import BadOptionUsage as BadOptionUsage +from .exceptions import BadParameter as BadParameter +from .exceptions import ClickException as ClickException +from .exceptions import FileError as FileError +from .exceptions import MissingParameter as MissingParameter +from .exceptions import NoSuchOption as NoSuchOption +from .exceptions import UsageError as UsageError +from .formatting import HelpFormatter as HelpFormatter +from .formatting import wrap_text as wrap_text +from .globals import get_current_context as get_current_context +from .termui import clear as clear +from .termui import confirm as confirm +from .termui import echo_via_pager as echo_via_pager +from .termui import edit as edit +from .termui import getchar as getchar +from .termui import launch as launch +from .termui import pause as pause +from .termui import progressbar as progressbar +from .termui import prompt as prompt +from .termui import secho as secho +from .termui import style as style +from .termui import unstyle as unstyle +from .types import BOOL as BOOL +from .types import Choice as Choice +from .types import DateTime as DateTime +from .types import File as File +from .types import FLOAT as FLOAT +from .types import FloatRange as FloatRange +from .types import INT as INT +from .types import IntRange as IntRange +from .types import ParamType as ParamType +from .types import Path as Path +from .types import STRING as STRING +from .types import Tuple as Tuple +from .types import UNPROCESSED as UNPROCESSED +from .types import UUID as UUID +from .utils import echo as echo +from .utils import format_filename as format_filename +from .utils import get_app_dir as get_app_dir +from .utils import get_binary_stream as get_binary_stream +from .utils import get_text_stream as get_text_stream +from .utils import open_file as open_file + + +def __getattr__(name: str) -> object: + import warnings + + if name == "BaseCommand": + from .core import _BaseCommand + + warnings.warn( + "'BaseCommand' is deprecated and will be removed in Click 9.0. Use" + " 'Command' instead.", + DeprecationWarning, + stacklevel=2, + ) + return _BaseCommand + + if name == "MultiCommand": + from .core import _MultiCommand + + warnings.warn( + "'MultiCommand' is deprecated and will be removed in Click 9.0. Use" + " 'Group' instead.", + DeprecationWarning, + stacklevel=2, + ) + return _MultiCommand + + if name == "OptionParser": + from .parser import _OptionParser + + warnings.warn( + "'OptionParser' is deprecated and will be removed in Click 9.0. The" + " old parser is available in 'optparse'.", + DeprecationWarning, + stacklevel=2, + ) + return _OptionParser + + if name == "__version__": + import importlib.metadata + import warnings + + warnings.warn( + "The '__version__' attribute is deprecated and will be removed in" + " Click 9.1. Use feature detection or" + " 'importlib.metadata.version(\"click\")' instead.", + DeprecationWarning, + stacklevel=2, + ) + return importlib.metadata.version("click") + + raise AttributeError(name) diff --git a/venv/lib/python3.11/site-packages/click/__pycache__/__init__.cpython-311.pyc b/venv/lib/python3.11/site-packages/click/__pycache__/__init__.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..6c8bf1c79be8a6916dd6e3747162087f5b5ec6e4 GIT binary patch literal 5238 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 P1ekHJn7Ld4W553w36`^- literal 0 HcmV?d00001 diff --git a/venv/lib/python3.11/site-packages/click/__pycache__/_termui_impl.cpython-311.pyc b/venv/lib/python3.11/site-packages/click/__pycache__/_termui_impl.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..4450b4dc2d329b9a9858762cf8bc1854b8d437c4 GIT binary patch literal 34608 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 literal 0 HcmV?d00001 diff --git a/venv/lib/python3.11/site-packages/click/__pycache__/_utils.cpython-311.pyc b/venv/lib/python3.11/site-packages/click/__pycache__/_utils.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..e04c272302773c9df690ec3baae505f56603917d GIT binary patch literal 1251 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 literal 0 HcmV?d00001 diff --git a/venv/lib/python3.11/site-packages/click/__pycache__/core.cpython-311.pyc b/venv/lib/python3.11/site-packages/click/__pycache__/core.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..68db090d6274f91b7d8ea9bb7b29d294a83f1ef3 GIT binary patch literal 143417 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 literal 0 HcmV?d00001 diff --git a/venv/lib/python3.11/site-packages/click/__pycache__/exceptions.cpython-311.pyc b/venv/lib/python3.11/site-packages/click/__pycache__/exceptions.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..ad199eb22ccc4e7b82a2dce044a4ad1927c7430d GIT binary patch literal 16729 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 Cul~*e literal 0 HcmV?d00001 diff --git a/venv/lib/python3.11/site-packages/click/__pycache__/globals.cpython-311.pyc b/venv/lib/python3.11/site-packages/click/__pycache__/globals.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..eff3e3cbf2796549f0afabec75ef4ede8f7374ca GIT binary patch literal 3273 zcmb7GO>7&-6`ox#DT?}`tjLz*A9>QcaA`YatfWmr6iqF`Zj}UTVC!NP1vT6mifb=- z7qdfBGL%+vbx;8xdUG!Yd}y7d=^@A|mjdanN6HXjVSxYwiX41X;Y*-P``#>LxlVjJ4vx(!g%%-5Dy3^+;B<5ST+o#P1jsb z!9V3%jr4NbAR=`;lPr}PZt=7`)W|Mp4Pp|JegspWCDUYi7`U}&9O5VWt9)eZD9^|M z&nbSI=U?Q3wWs;SR(g4apW&};S<9pRET4k^7@y(i_%zInbMq!C(5I-XU_>L#^L)jW z<9p#E^wX|yGxwPCSUB_E}yjAUxuvHP3Y}c{xlvZ883OgzW>(MK#LRIXhl(6H9 z9h)HYpl%fPqVi3$cYWb2`x%g=7+F={cMr$A#?lSC=zHRS*&;_^twf1(44T*+IgWi) zrJD(y=<0iC?#oc(z<}U13}`2P0mK6`OjMr>Z}(_!sBQoP8@UZD;=;{W6OueKA*kSs z%T4lKqOwVk5Y-DXLTcuDBF}tiY>;q5;pV%AryhaE&w5%njChawCi`OPla~9U!-)Y?u6849<2)63Q%NI#qs- zLSeQo!Xq-`v!j0Xwy+hgNxwmvx8AM`DH4$&mC=ST1$7z$M1rGYX)Z*m2Z7xZpg`}e zTx)uEc_mV#TQAe{!2j=PS#t~Fg+^ChhdHxM$UVbiXo zAzjhJuKO#rU3Xx#;jGpb7^{UiaE+u06`1XK)UGpc72=yZDg=%?YdIjZ%FrvIc)*LX z2Z}i@X33{PGpxUi<1#HbgsPWUx=~yVZ9fnz{T}ZMDHdr9_6{a8&IK=*=?{u;#PZ7l zldM7GyI!VFjfO&@`&O1@6NKT;;_FUZ%x!|pL%M>OWd(UXKRIr_Sv=Feg6Gs?j?1cU ze0BnSUt>)doz!&!@PIPOoKR5qG9hKL1}Au<=_#inu1V?3m7?a;@bmQFQ0~6AgyDf( zgAFk_ONfBMU|cK=MTUwjn}sUMR5av8=}-ZnMB`VLl1{a$V)0RK!Q*00tBOYZ6&Fkm zW04_3ymXWvx%*Qv7;ZzeNe*VL^n1qF`HB0j-#dRk@uxGNRCiyyvXh_P&ChnSv)_I_ zdg_nwc1A875EJnrLxw)Om`Q6F+e;n(KzI%|u;dt`J_FE_iDU^mp zmW)npzZK$+?w!9tK0bDJD)r^$)qLvj`81GG%2sQU^#bT2;%IDgfp|a^v`Kl6Ob>gA zlg#0t8>>g~=wT1D`uR4WY>CL_%D|q1Yjdg_QP%c1)BC{2)$Kn0$1QMk6rRv-tuHUx6&wFt%$YAsm3YqD>YoDffNYSD%neBW{dtX> ze?5|EAQu@Q4Q&|D+z(+nWGL3`TxU59wm{PC_urZ+c>JNk0Vu z8T1R_```ee@fU|(A5KKaAszT`OTaOJJ1bpFyF7D)+{mO^haQiXh!t5j-Dcm#?{MdI;C8MPijev>D# zGpy=TFphl-`(sPDKDbty|M|7~_ZAj^1}F@xen>p-sIdt=D0C&Kwi?kVH!UI*dJ(e TrZJ6U{Y`ER1^l;0N5FpoeG(~P literal 0 HcmV?d00001 diff --git a/venv/lib/python3.11/site-packages/click/__pycache__/parser.cpython-311.pyc b/venv/lib/python3.11/site-packages/click/__pycache__/parser.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..dae7dcc52dc5722556b913bc6665ce3ad55abeba GIT binary patch literal 22534 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 literal 0 HcmV?d00001 diff --git a/venv/lib/python3.11/site-packages/click/__pycache__/utils.cpython-311.pyc b/venv/lib/python3.11/site-packages/click/__pycache__/utils.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..9c402fffd15b4aebf97933882b22e62ab3125657 GIT binary patch literal 26877 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 NmI2&7c_#()3^%)bX9I5&EN5HQGp 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 a62OVJz8U8YqP1&*r$tcRzcXM`&i?_R1pv1I literal 0 HcmV?d00001 diff --git a/venv/lib/python3.11/site-packages/click/_compat.py b/venv/lib/python3.11/site-packages/click/_compat.py new file mode 100644 index 0000000..f2726b9 --- /dev/null +++ b/venv/lib/python3.11/site-packages/click/_compat.py @@ -0,0 +1,622 @@ +from __future__ import annotations + +import codecs +import collections.abc as cabc +import io +import os +import re +import sys +import typing as t +from types import TracebackType +from weakref import WeakKeyDictionary + +CYGWIN = sys.platform.startswith("cygwin") +WIN = sys.platform.startswith("win") +auto_wrap_for_ansi: t.Callable[[t.TextIO], t.TextIO] | None = None +_ansi_re = re.compile(r"\033\[[;?0-9]*[a-zA-Z]") + + +def _make_text_stream( + stream: t.BinaryIO, + encoding: str | None, + errors: str | None, + force_readable: bool = False, + force_writable: bool = False, +) -> t.TextIO: + if encoding is None: + encoding = get_best_encoding(stream) + if errors is None: + errors = "replace" + return _NonClosingTextIOWrapper( + stream, + encoding, + errors, + line_buffering=True, + force_readable=force_readable, + force_writable=force_writable, + ) + + +def is_ascii_encoding(encoding: str) -> bool: + """Checks if a given encoding is ascii.""" + try: + return codecs.lookup(encoding).name == "ascii" + except LookupError: + return False + + +def get_best_encoding(stream: t.IO[t.Any]) -> str: + """Returns the default stream encoding if not found.""" + rv = getattr(stream, "encoding", None) or sys.getdefaultencoding() + if is_ascii_encoding(rv): + return "utf-8" + return rv + + +class _NonClosingTextIOWrapper(io.TextIOWrapper): + def __init__( + self, + stream: t.BinaryIO, + encoding: str | None, + errors: str | None, + force_readable: bool = False, + force_writable: bool = False, + **extra: t.Any, + ) -> None: + self._stream = stream = t.cast( + t.BinaryIO, _FixupStream(stream, force_readable, force_writable) + ) + super().__init__(stream, encoding, errors, **extra) + + def __del__(self) -> None: + try: + self.detach() + except Exception: + pass + + def isatty(self) -> bool: + # https://bitbucket.org/pypy/pypy/issue/1803 + return self._stream.isatty() + + +class _FixupStream: + """The new io interface needs more from streams than streams + traditionally implement. As such, this fix-up code is necessary in + some circumstances. + + The forcing of readable and writable flags are there because some tools + put badly patched objects on sys (one such offender are certain version + of jupyter notebook). + """ + + def __init__( + self, + stream: t.BinaryIO, + force_readable: bool = False, + force_writable: bool = False, + ): + self._stream = stream + self._force_readable = force_readable + self._force_writable = force_writable + + def __getattr__(self, name: str) -> t.Any: + return getattr(self._stream, name) + + def read1(self, size: int) -> bytes: + f = getattr(self._stream, "read1", None) + + if f is not None: + return t.cast(bytes, f(size)) + + return self._stream.read(size) + + def readable(self) -> bool: + if self._force_readable: + return True + x = getattr(self._stream, "readable", None) + if x is not None: + return t.cast(bool, x()) + try: + self._stream.read(0) + except Exception: + return False + return True + + def writable(self) -> bool: + if self._force_writable: + return True + x = getattr(self._stream, "writable", None) + if x is not None: + return t.cast(bool, x()) + try: + self._stream.write(b"") + except Exception: + try: + self._stream.write(b"") + except Exception: + return False + return True + + def seekable(self) -> bool: + x = getattr(self._stream, "seekable", None) + if x is not None: + return t.cast(bool, x()) + try: + self._stream.seek(self._stream.tell()) + except Exception: + return False + return True + + +def _is_binary_reader(stream: t.IO[t.Any], default: bool = False) -> bool: + try: + return isinstance(stream.read(0), bytes) + except Exception: + return default + # This happens in some cases where the stream was already + # closed. In this case, we assume the default. + + +def _is_binary_writer(stream: t.IO[t.Any], default: bool = False) -> bool: + try: + stream.write(b"") + except Exception: + try: + stream.write("") + return False + except Exception: + pass + return default + return True + + +def _find_binary_reader(stream: t.IO[t.Any]) -> t.BinaryIO | None: + # We need to figure out if the given stream is already binary. + # This can happen because the official docs recommend detaching + # the streams to get binary streams. Some code might do this, so + # we need to deal with this case explicitly. + if _is_binary_reader(stream, False): + return t.cast(t.BinaryIO, stream) + + buf = getattr(stream, "buffer", None) + + # Same situation here; this time we assume that the buffer is + # actually binary in case it's closed. + if buf is not None and _is_binary_reader(buf, True): + return t.cast(t.BinaryIO, buf) + + return None + + +def _find_binary_writer(stream: t.IO[t.Any]) -> t.BinaryIO | None: + # We need to figure out if the given stream is already binary. + # This can happen because the official docs recommend detaching + # the streams to get binary streams. Some code might do this, so + # we need to deal with this case explicitly. + if _is_binary_writer(stream, False): + return t.cast(t.BinaryIO, stream) + + buf = getattr(stream, "buffer", None) + + # Same situation here; this time we assume that the buffer is + # actually binary in case it's closed. + if buf is not None and _is_binary_writer(buf, True): + return t.cast(t.BinaryIO, buf) + + return None + + +def _stream_is_misconfigured(stream: t.TextIO) -> bool: + """A stream is misconfigured if its encoding is ASCII.""" + # If the stream does not have an encoding set, we assume it's set + # to ASCII. This appears to happen in certain unittest + # environments. It's not quite clear what the correct behavior is + # but this at least will force Click to recover somehow. + return is_ascii_encoding(getattr(stream, "encoding", None) or "ascii") + + +def _is_compat_stream_attr(stream: t.TextIO, attr: str, value: str | None) -> bool: + """A stream attribute is compatible if it is equal to the + desired value or the desired value is unset and the attribute + has a value. + """ + stream_value = getattr(stream, attr, None) + return stream_value == value or (value is None and stream_value is not None) + + +def _is_compatible_text_stream( + stream: t.TextIO, encoding: str | None, errors: str | None +) -> bool: + """Check if a stream's encoding and errors attributes are + compatible with the desired values. + """ + return _is_compat_stream_attr( + stream, "encoding", encoding + ) and _is_compat_stream_attr(stream, "errors", errors) + + +def _force_correct_text_stream( + text_stream: t.IO[t.Any], + encoding: str | None, + errors: str | None, + is_binary: t.Callable[[t.IO[t.Any], bool], bool], + find_binary: t.Callable[[t.IO[t.Any]], t.BinaryIO | None], + force_readable: bool = False, + force_writable: bool = False, +) -> t.TextIO: + if is_binary(text_stream, False): + binary_reader = t.cast(t.BinaryIO, text_stream) + else: + text_stream = t.cast(t.TextIO, text_stream) + # If the stream looks compatible, and won't default to a + # misconfigured ascii encoding, return it as-is. + if _is_compatible_text_stream(text_stream, encoding, errors) and not ( + encoding is None and _stream_is_misconfigured(text_stream) + ): + return text_stream + + # Otherwise, get the underlying binary reader. + possible_binary_reader = find_binary(text_stream) + + # If that's not possible, silently use the original reader + # and get mojibake instead of exceptions. + if possible_binary_reader is None: + return text_stream + + binary_reader = possible_binary_reader + + # Default errors to replace instead of strict in order to get + # something that works. + if errors is None: + errors = "replace" + + # Wrap the binary stream in a text stream with the correct + # encoding parameters. + return _make_text_stream( + binary_reader, + encoding, + errors, + force_readable=force_readable, + force_writable=force_writable, + ) + + +def _force_correct_text_reader( + text_reader: t.IO[t.Any], + encoding: str | None, + errors: str | None, + force_readable: bool = False, +) -> t.TextIO: + return _force_correct_text_stream( + text_reader, + encoding, + errors, + _is_binary_reader, + _find_binary_reader, + force_readable=force_readable, + ) + + +def _force_correct_text_writer( + text_writer: t.IO[t.Any], + encoding: str | None, + errors: str | None, + force_writable: bool = False, +) -> t.TextIO: + return _force_correct_text_stream( + text_writer, + encoding, + errors, + _is_binary_writer, + _find_binary_writer, + force_writable=force_writable, + ) + + +def get_binary_stdin() -> t.BinaryIO: + reader = _find_binary_reader(sys.stdin) + if reader is None: + raise RuntimeError("Was not able to determine binary stream for sys.stdin.") + return reader + + +def get_binary_stdout() -> t.BinaryIO: + writer = _find_binary_writer(sys.stdout) + if writer is None: + raise RuntimeError("Was not able to determine binary stream for sys.stdout.") + return writer + + +def get_binary_stderr() -> t.BinaryIO: + writer = _find_binary_writer(sys.stderr) + if writer is None: + raise RuntimeError("Was not able to determine binary stream for sys.stderr.") + return writer + + +def get_text_stdin(encoding: str | None = None, errors: str | None = None) -> t.TextIO: + rv = _get_windows_console_stream(sys.stdin, encoding, errors) + if rv is not None: + return rv + return _force_correct_text_reader(sys.stdin, encoding, errors, force_readable=True) + + +def get_text_stdout(encoding: str | None = None, errors: str | None = None) -> t.TextIO: + rv = _get_windows_console_stream(sys.stdout, encoding, errors) + if rv is not None: + return rv + return _force_correct_text_writer(sys.stdout, encoding, errors, force_writable=True) + + +def get_text_stderr(encoding: str | None = None, errors: str | None = None) -> t.TextIO: + rv = _get_windows_console_stream(sys.stderr, encoding, errors) + if rv is not None: + return rv + return _force_correct_text_writer(sys.stderr, encoding, errors, force_writable=True) + + +def _wrap_io_open( + file: str | os.PathLike[str] | int, + mode: str, + encoding: str | None, + errors: str | None, +) -> t.IO[t.Any]: + """Handles not passing ``encoding`` and ``errors`` in binary mode.""" + if "b" in mode: + return open(file, mode) + + return open(file, mode, encoding=encoding, errors=errors) + + +def open_stream( + filename: str | os.PathLike[str], + mode: str = "r", + encoding: str | None = None, + errors: str | None = "strict", + atomic: bool = False, +) -> tuple[t.IO[t.Any], bool]: + binary = "b" in mode + filename = os.fspath(filename) + + # Standard streams first. These are simple because they ignore the + # atomic flag. Use fsdecode to handle Path("-"). + if os.fsdecode(filename) == "-": + if any(m in mode for m in ["w", "a", "x"]): + if binary: + return get_binary_stdout(), False + return get_text_stdout(encoding=encoding, errors=errors), False + if binary: + return get_binary_stdin(), False + return get_text_stdin(encoding=encoding, errors=errors), False + + # Non-atomic writes directly go out through the regular open functions. + if not atomic: + return _wrap_io_open(filename, mode, encoding, errors), True + + # Some usability stuff for atomic writes + if "a" in mode: + raise ValueError( + "Appending to an existing file is not supported, because that" + " would involve an expensive `copy`-operation to a temporary" + " file. Open the file in normal `w`-mode and copy explicitly" + " if that's what you're after." + ) + if "x" in mode: + raise ValueError("Use the `overwrite`-parameter instead.") + if "w" not in mode: + raise ValueError("Atomic writes only make sense with `w`-mode.") + + # Atomic writes are more complicated. They work by opening a file + # as a proxy in the same folder and then using the fdopen + # functionality to wrap it in a Python file. Then we wrap it in an + # atomic file that moves the file over on close. + import errno + import random + + try: + perm: int | None = os.stat(filename).st_mode + except OSError: + perm = None + + flags = os.O_RDWR | os.O_CREAT | os.O_EXCL + + if binary: + flags |= getattr(os, "O_BINARY", 0) + + while True: + tmp_filename = os.path.join( + os.path.dirname(filename), + f".__atomic-write{random.randrange(1 << 32):08x}", + ) + try: + fd = os.open(tmp_filename, flags, 0o666 if perm is None else perm) + break + except OSError as e: + if e.errno == errno.EEXIST or ( + os.name == "nt" + and e.errno == errno.EACCES + and os.path.isdir(e.filename) + and os.access(e.filename, os.W_OK) + ): + continue + raise + + if perm is not None: + os.chmod(tmp_filename, perm) # in case perm includes bits in umask + + f = _wrap_io_open(fd, mode, encoding, errors) + af = _AtomicFile(f, tmp_filename, os.path.realpath(filename)) + return t.cast(t.IO[t.Any], af), True + + +class _AtomicFile: + def __init__(self, f: t.IO[t.Any], tmp_filename: str, real_filename: str) -> None: + self._f = f + self._tmp_filename = tmp_filename + self._real_filename = real_filename + self.closed = False + + @property + def name(self) -> str: + return self._real_filename + + def close(self, delete: bool = False) -> None: + if self.closed: + return + self._f.close() + os.replace(self._tmp_filename, self._real_filename) + self.closed = True + + def __getattr__(self, name: str) -> t.Any: + return getattr(self._f, name) + + def __enter__(self) -> _AtomicFile: + return self + + def __exit__( + self, + exc_type: type[BaseException] | None, + exc_value: BaseException | None, + tb: TracebackType | None, + ) -> None: + self.close(delete=exc_type is not None) + + def __repr__(self) -> str: + return repr(self._f) + + +def strip_ansi(value: str) -> str: + return _ansi_re.sub("", value) + + +def _is_jupyter_kernel_output(stream: t.IO[t.Any]) -> bool: + while isinstance(stream, (_FixupStream, _NonClosingTextIOWrapper)): + stream = stream._stream + + return stream.__class__.__module__.startswith("ipykernel.") + + +def should_strip_ansi( + stream: t.IO[t.Any] | None = None, color: bool | None = None +) -> bool: + if color is None: + if stream is None: + stream = sys.stdin + return not isatty(stream) and not _is_jupyter_kernel_output(stream) + return not color + + +# On Windows, wrap the output streams with colorama to support ANSI +# color codes. +# NOTE: double check is needed so mypy does not analyze this on Linux +if sys.platform.startswith("win") and WIN: + from ._winconsole import _get_windows_console_stream + + def _get_argv_encoding() -> str: + import locale + + return locale.getpreferredencoding() + + _ansi_stream_wrappers: cabc.MutableMapping[t.TextIO, t.TextIO] = WeakKeyDictionary() + + def auto_wrap_for_ansi(stream: t.TextIO, color: bool | None = None) -> t.TextIO: + """Support ANSI color and style codes on Windows by wrapping a + stream with colorama. + """ + try: + cached = _ansi_stream_wrappers.get(stream) + except Exception: + cached = None + + if cached is not None: + return cached + + import colorama + + strip = should_strip_ansi(stream, color) + ansi_wrapper = colorama.AnsiToWin32(stream, strip=strip) + rv = t.cast(t.TextIO, ansi_wrapper.stream) + _write = rv.write + + def _safe_write(s: str) -> int: + try: + return _write(s) + except BaseException: + ansi_wrapper.reset_all() + raise + + rv.write = _safe_write # type: ignore[method-assign] + + try: + _ansi_stream_wrappers[stream] = rv + except Exception: + pass + + return rv + +else: + + def _get_argv_encoding() -> str: + return getattr(sys.stdin, "encoding", None) or sys.getfilesystemencoding() + + def _get_windows_console_stream( + f: t.TextIO, encoding: str | None, errors: str | None + ) -> t.TextIO | None: + return None + + +def term_len(x: str) -> int: + return len(strip_ansi(x)) + + +def isatty(stream: t.IO[t.Any]) -> bool: + try: + return stream.isatty() + except Exception: + return False + + +def _make_cached_stream_func( + src_func: t.Callable[[], t.TextIO | None], + wrapper_func: t.Callable[[], t.TextIO], +) -> t.Callable[[], t.TextIO | None]: + cache: cabc.MutableMapping[t.TextIO, t.TextIO] = WeakKeyDictionary() + + def func() -> t.TextIO | None: + stream = src_func() + + if stream is None: + return None + + try: + rv = cache.get(stream) + except Exception: + rv = None + if rv is not None: + return rv + rv = wrapper_func() + try: + cache[stream] = rv + except Exception: + pass + return rv + + return func + + +_default_text_stdin = _make_cached_stream_func(lambda: sys.stdin, get_text_stdin) +_default_text_stdout = _make_cached_stream_func(lambda: sys.stdout, get_text_stdout) +_default_text_stderr = _make_cached_stream_func(lambda: sys.stderr, get_text_stderr) + + +binary_streams: cabc.Mapping[str, t.Callable[[], t.BinaryIO]] = { + "stdin": get_binary_stdin, + "stdout": get_binary_stdout, + "stderr": get_binary_stderr, +} + +text_streams: cabc.Mapping[str, t.Callable[[str | None, str | None], t.TextIO]] = { + "stdin": get_text_stdin, + "stdout": get_text_stdout, + "stderr": get_text_stderr, +} diff --git a/venv/lib/python3.11/site-packages/click/_termui_impl.py b/venv/lib/python3.11/site-packages/click/_termui_impl.py new file mode 100644 index 0000000..ee8225c --- /dev/null +++ b/venv/lib/python3.11/site-packages/click/_termui_impl.py @@ -0,0 +1,852 @@ +""" +This module contains implementations for the termui module. To keep the +import time of Click down, some infrequently used functionality is +placed in this module and only imported as needed. +""" + +from __future__ import annotations + +import collections.abc as cabc +import contextlib +import math +import os +import shlex +import sys +import time +import typing as t +from gettext import gettext as _ +from io import StringIO +from pathlib import Path +from types import TracebackType + +from ._compat import _default_text_stdout +from ._compat import CYGWIN +from ._compat import get_best_encoding +from ._compat import isatty +from ._compat import open_stream +from ._compat import strip_ansi +from ._compat import term_len +from ._compat import WIN +from .exceptions import ClickException +from .utils import echo + +V = t.TypeVar("V") + +if os.name == "nt": + BEFORE_BAR = "\r" + AFTER_BAR = "\n" +else: + BEFORE_BAR = "\r\033[?25l" + AFTER_BAR = "\033[?25h\n" + + +class ProgressBar(t.Generic[V]): + def __init__( + self, + iterable: cabc.Iterable[V] | None, + length: int | None = None, + fill_char: str = "#", + empty_char: str = " ", + bar_template: str = "%(bar)s", + info_sep: str = " ", + hidden: bool = False, + show_eta: bool = True, + show_percent: bool | None = None, + show_pos: bool = False, + item_show_func: t.Callable[[V | None], str | None] | None = None, + label: str | None = None, + file: t.TextIO | None = None, + color: bool | None = None, + update_min_steps: int = 1, + width: int = 30, + ) -> None: + self.fill_char = fill_char + self.empty_char = empty_char + self.bar_template = bar_template + self.info_sep = info_sep + self.hidden = hidden + self.show_eta = show_eta + self.show_percent = show_percent + self.show_pos = show_pos + self.item_show_func = item_show_func + self.label: str = label or "" + + if file is None: + file = _default_text_stdout() + + # There are no standard streams attached to write to. For example, + # pythonw on Windows. + if file is None: + file = StringIO() + + self.file = file + self.color = color + self.update_min_steps = update_min_steps + self._completed_intervals = 0 + self.width: int = width + self.autowidth: bool = width == 0 + + if length is None: + from operator import length_hint + + length = length_hint(iterable, -1) + + if length == -1: + length = None + if iterable is None: + if length is None: + raise TypeError("iterable or length is required") + iterable = t.cast("cabc.Iterable[V]", range(length)) + self.iter: cabc.Iterable[V] = iter(iterable) + self.length = length + self.pos: int = 0 + self.avg: list[float] = [] + self.last_eta: float + self.start: float + self.start = self.last_eta = time.time() + self.eta_known: bool = False + self.finished: bool = False + self.max_width: int | None = None + self.entered: bool = False + self.current_item: V | None = None + self._is_atty = isatty(self.file) + self._last_line: str | None = None + + def __enter__(self) -> ProgressBar[V]: + self.entered = True + self.render_progress() + return self + + def __exit__( + self, + exc_type: type[BaseException] | None, + exc_value: BaseException | None, + tb: TracebackType | None, + ) -> None: + self.render_finish() + + def __iter__(self) -> cabc.Iterator[V]: + if not self.entered: + raise RuntimeError("You need to use progress bars in a with block.") + self.render_progress() + return self.generator() + + def __next__(self) -> V: + # Iteration is defined in terms of a generator function, + # returned by iter(self); use that to define next(). This works + # because `self.iter` is an iterable consumed by that generator, + # so it is re-entry safe. Calling `next(self.generator())` + # twice works and does "what you want". + return next(iter(self)) + + def render_finish(self) -> None: + if self.hidden or not self._is_atty: + return + self.file.write(AFTER_BAR) + self.file.flush() + + @property + def pct(self) -> float: + if self.finished: + return 1.0 + return min(self.pos / (float(self.length or 1) or 1), 1.0) + + @property + def time_per_iteration(self) -> float: + if not self.avg: + return 0.0 + return sum(self.avg) / float(len(self.avg)) + + @property + def eta(self) -> float: + if self.length is not None and not self.finished: + return self.time_per_iteration * (self.length - self.pos) + return 0.0 + + def format_eta(self) -> str: + if self.eta_known: + t = int(self.eta) + seconds = t % 60 + t //= 60 + minutes = t % 60 + t //= 60 + hours = t % 24 + t //= 24 + if t > 0: + return f"{t}d {hours:02}:{minutes:02}:{seconds:02}" + else: + return f"{hours:02}:{minutes:02}:{seconds:02}" + return "" + + def format_pos(self) -> str: + pos = str(self.pos) + if self.length is not None: + pos += f"/{self.length}" + return pos + + def format_pct(self) -> str: + return f"{int(self.pct * 100): 4}%"[1:] + + def format_bar(self) -> str: + if self.length is not None: + bar_length = int(self.pct * self.width) + bar = self.fill_char * bar_length + bar += self.empty_char * (self.width - bar_length) + elif self.finished: + bar = self.fill_char * self.width + else: + chars = list(self.empty_char * (self.width or 1)) + if self.time_per_iteration != 0: + chars[ + int( + (math.cos(self.pos * self.time_per_iteration) / 2.0 + 0.5) + * self.width + ) + ] = self.fill_char + bar = "".join(chars) + return bar + + def format_progress_line(self) -> str: + show_percent = self.show_percent + + info_bits = [] + if self.length is not None and show_percent is None: + show_percent = not self.show_pos + + if self.show_pos: + info_bits.append(self.format_pos()) + if show_percent: + info_bits.append(self.format_pct()) + if self.show_eta and self.eta_known and not self.finished: + info_bits.append(self.format_eta()) + if self.item_show_func is not None: + item_info = self.item_show_func(self.current_item) + if item_info is not None: + info_bits.append(item_info) + + return ( + self.bar_template + % { + "label": self.label, + "bar": self.format_bar(), + "info": self.info_sep.join(info_bits), + } + ).rstrip() + + def render_progress(self) -> None: + if self.hidden: + return + + if not self._is_atty: + # Only output the label once if the output is not a TTY. + if self._last_line != self.label: + self._last_line = self.label + echo(self.label, file=self.file, color=self.color) + return + + buf = [] + # Update width in case the terminal has been resized + if self.autowidth: + import shutil + + old_width = self.width + self.width = 0 + clutter_length = term_len(self.format_progress_line()) + new_width = max(0, shutil.get_terminal_size().columns - clutter_length) + if new_width < old_width and self.max_width is not None: + buf.append(BEFORE_BAR) + buf.append(" " * self.max_width) + self.max_width = new_width + self.width = new_width + + clear_width = self.width + if self.max_width is not None: + clear_width = self.max_width + + buf.append(BEFORE_BAR) + line = self.format_progress_line() + line_len = term_len(line) + if self.max_width is None or self.max_width < line_len: + self.max_width = line_len + + buf.append(line) + buf.append(" " * (clear_width - line_len)) + line = "".join(buf) + # Render the line only if it changed. + + if line != self._last_line: + self._last_line = line + echo(line, file=self.file, color=self.color, nl=False) + self.file.flush() + + def make_step(self, n_steps: int) -> None: + self.pos += n_steps + if self.length is not None and self.pos >= self.length: + self.finished = True + + if (time.time() - self.last_eta) < 1.0: + return + + self.last_eta = time.time() + + # self.avg is a rolling list of length <= 7 of steps where steps are + # defined as time elapsed divided by the total progress through + # self.length. + if self.pos: + step = (time.time() - self.start) / self.pos + else: + step = time.time() - self.start + + self.avg = self.avg[-6:] + [step] + + self.eta_known = self.length is not None + + def update(self, n_steps: int, current_item: V | None = None) -> None: + """Update the progress bar by advancing a specified number of + steps, and optionally set the ``current_item`` for this new + position. + + :param n_steps: Number of steps to advance. + :param current_item: Optional item to set as ``current_item`` + for the updated position. + + .. versionchanged:: 8.0 + Added the ``current_item`` optional parameter. + + .. versionchanged:: 8.0 + Only render when the number of steps meets the + ``update_min_steps`` threshold. + """ + if current_item is not None: + self.current_item = current_item + + self._completed_intervals += n_steps + + if self._completed_intervals >= self.update_min_steps: + self.make_step(self._completed_intervals) + self.render_progress() + self._completed_intervals = 0 + + def finish(self) -> None: + self.eta_known = False + self.current_item = None + self.finished = True + + def generator(self) -> cabc.Iterator[V]: + """Return a generator which yields the items added to the bar + during construction, and updates the progress bar *after* the + yielded block returns. + """ + # WARNING: the iterator interface for `ProgressBar` relies on + # this and only works because this is a simple generator which + # doesn't create or manage additional state. If this function + # changes, the impact should be evaluated both against + # `iter(bar)` and `next(bar)`. `next()` in particular may call + # `self.generator()` repeatedly, and this must remain safe in + # order for that interface to work. + if not self.entered: + raise RuntimeError("You need to use progress bars in a with block.") + + if not self._is_atty: + yield from self.iter + else: + for rv in self.iter: + self.current_item = rv + + # This allows show_item_func to be updated before the + # item is processed. Only trigger at the beginning of + # the update interval. + if self._completed_intervals == 0: + self.render_progress() + + yield rv + self.update(1) + + self.finish() + self.render_progress() + + +def pager(generator: cabc.Iterable[str], color: bool | None = None) -> None: + """Decide what method to use for paging through text.""" + stdout = _default_text_stdout() + + # There are no standard streams attached to write to. For example, + # pythonw on Windows. + if stdout is None: + stdout = StringIO() + + if not isatty(sys.stdin) or not isatty(stdout): + return _nullpager(stdout, generator, color) + + # Split and normalize the pager command into parts. + pager_cmd_parts = shlex.split(os.environ.get("PAGER", ""), posix=False) + if pager_cmd_parts: + if WIN: + if _tempfilepager(generator, pager_cmd_parts, color): + return + elif _pipepager(generator, pager_cmd_parts, color): + return + + if os.environ.get("TERM") in ("dumb", "emacs"): + return _nullpager(stdout, generator, color) + if (WIN or sys.platform.startswith("os2")) and _tempfilepager( + generator, ["more"], color + ): + return + if _pipepager(generator, ["less"], color): + return + + import tempfile + + fd, filename = tempfile.mkstemp() + os.close(fd) + try: + if _pipepager(generator, ["more"], color): + return + return _nullpager(stdout, generator, color) + finally: + os.unlink(filename) + + +def _pipepager( + generator: cabc.Iterable[str], cmd_parts: list[str], color: bool | None +) -> bool: + """Page through text by feeding it to another program. Invoking a + pager through this might support colors. + + Returns `True` if the command was found, `False` otherwise and thus another + pager should be attempted. + """ + # Split the command into the invoked CLI and its parameters. + if not cmd_parts: + return False + + import shutil + + cmd = cmd_parts[0] + cmd_params = cmd_parts[1:] + + cmd_filepath = shutil.which(cmd) + if not cmd_filepath: + return False + + # Produces a normalized absolute path string. + # multi-call binaries such as busybox derive their identity from the symlink + # less -> busybox. resolve() causes them to misbehave. (eg. less becomes busybox) + cmd_path = Path(cmd_filepath).absolute() + cmd_name = cmd_path.name + + import subprocess + + # Make a local copy of the environment to not affect the global one. + env = dict(os.environ) + + # If we're piping to less and the user hasn't decided on colors, we enable + # them by default we find the -R flag in the command line arguments. + if color is None and cmd_name == "less": + less_flags = f"{os.environ.get('LESS', '')}{' '.join(cmd_params)}" + if not less_flags: + env["LESS"] = "-R" + color = True + elif "r" in less_flags or "R" in less_flags: + color = True + + c = subprocess.Popen( + [str(cmd_path)] + cmd_params, + shell=False, + stdin=subprocess.PIPE, + env=env, + errors="replace", + text=True, + ) + assert c.stdin is not None + try: + for text in generator: + if not color: + text = strip_ansi(text) + + c.stdin.write(text) + except BrokenPipeError: + # In case the pager exited unexpectedly, ignore the broken pipe error. + pass + except Exception as e: + # In case there is an exception we want to close the pager immediately + # and let the caller handle it. + # Otherwise the pager will keep running, and the user may not notice + # the error message, or worse yet it may leave the terminal in a broken state. + c.terminate() + raise e + finally: + # We must close stdin and wait for the pager to exit before we continue + try: + c.stdin.close() + # Close implies flush, so it might throw a BrokenPipeError if the pager + # process exited already. + except BrokenPipeError: + pass + + # Less doesn't respect ^C, but catches it for its own UI purposes (aborting + # search or other commands inside less). + # + # That means when the user hits ^C, the parent process (click) terminates, + # but less is still alive, paging the output and messing up the terminal. + # + # If the user wants to make the pager exit on ^C, they should set + # `LESS='-K'`. It's not our decision to make. + while True: + try: + c.wait() + except KeyboardInterrupt: + pass + else: + break + + return True + + +def _tempfilepager( + generator: cabc.Iterable[str], cmd_parts: list[str], color: bool | None +) -> bool: + """Page through text by invoking a program on a temporary file. + + Returns `True` if the command was found, `False` otherwise and thus another + pager should be attempted. + """ + # Split the command into the invoked CLI and its parameters. + if not cmd_parts: + return False + + import shutil + + cmd = cmd_parts[0] + + cmd_filepath = shutil.which(cmd) + if not cmd_filepath: + return False + # Produces a normalized absolute path string. + # multi-call binaries such as busybox derive their identity from the symlink + # less -> busybox. resolve() causes them to misbehave. (eg. less becomes busybox) + cmd_path = Path(cmd_filepath).absolute() + + import subprocess + import tempfile + + fd, filename = tempfile.mkstemp() + # TODO: This never terminates if the passed generator never terminates. + text = "".join(generator) + if not color: + text = strip_ansi(text) + encoding = get_best_encoding(sys.stdout) + with open_stream(filename, "wb")[0] as f: + f.write(text.encode(encoding)) + try: + subprocess.call([str(cmd_path), filename]) + except OSError: + # Command not found + pass + finally: + os.close(fd) + os.unlink(filename) + + return True + + +def _nullpager( + stream: t.TextIO, generator: cabc.Iterable[str], color: bool | None +) -> None: + """Simply print unformatted text. This is the ultimate fallback.""" + for text in generator: + if not color: + text = strip_ansi(text) + stream.write(text) + + +class Editor: + def __init__( + self, + editor: str | None = None, + env: cabc.Mapping[str, str] | None = None, + require_save: bool = True, + extension: str = ".txt", + ) -> None: + self.editor = editor + self.env = env + self.require_save = require_save + self.extension = extension + + def get_editor(self) -> str: + if self.editor is not None: + return self.editor + for key in "VISUAL", "EDITOR": + rv = os.environ.get(key) + if rv: + return rv + if WIN: + return "notepad" + + from shutil import which + + for editor in "sensible-editor", "vim", "nano": + if which(editor) is not None: + return editor + return "vi" + + def edit_files(self, filenames: cabc.Iterable[str]) -> None: + import subprocess + + editor = self.get_editor() + environ: dict[str, str] | None = None + + if self.env: + environ = os.environ.copy() + environ.update(self.env) + + exc_filename = " ".join(f'"{filename}"' for filename in filenames) + + try: + c = subprocess.Popen( + args=f"{editor} {exc_filename}", env=environ, shell=True + ) + exit_code = c.wait() + if exit_code != 0: + raise ClickException( + _("{editor}: Editing failed").format(editor=editor) + ) + except OSError as e: + raise ClickException( + _("{editor}: Editing failed: {e}").format(editor=editor, e=e) + ) from e + + @t.overload + def edit(self, text: bytes | bytearray) -> bytes | None: ... + + # We cannot know whether or not the type expected is str or bytes when None + # is passed, so str is returned as that was what was done before. + @t.overload + def edit(self, text: str | None) -> str | None: ... + + def edit(self, text: str | bytes | bytearray | None) -> str | bytes | None: + import tempfile + + if text is None: + data: bytes | bytearray = b"" + elif isinstance(text, (bytes, bytearray)): + data = text + else: + if text and not text.endswith("\n"): + text += "\n" + + if WIN: + data = text.replace("\n", "\r\n").encode("utf-8-sig") + else: + data = text.encode("utf-8") + + fd, name = tempfile.mkstemp(prefix="editor-", suffix=self.extension) + f: t.BinaryIO + + try: + with os.fdopen(fd, "wb") as f: + f.write(data) + + # If the filesystem resolution is 1 second, like Mac OS + # 10.12 Extended, or 2 seconds, like FAT32, and the editor + # closes very fast, require_save can fail. Set the modified + # time to be 2 seconds in the past to work around this. + os.utime(name, (os.path.getatime(name), os.path.getmtime(name) - 2)) + # Depending on the resolution, the exact value might not be + # recorded, so get the new recorded value. + timestamp = os.path.getmtime(name) + + self.edit_files((name,)) + + if self.require_save and os.path.getmtime(name) == timestamp: + return None + + with open(name, "rb") as f: + rv = f.read() + + if isinstance(text, (bytes, bytearray)): + return rv + + return rv.decode("utf-8-sig").replace("\r\n", "\n") + finally: + os.unlink(name) + + +def open_url(url: str, wait: bool = False, locate: bool = False) -> int: + import subprocess + + def _unquote_file(url: str) -> str: + from urllib.parse import unquote + + if url.startswith("file://"): + url = unquote(url[7:]) + + return url + + if sys.platform == "darwin": + args = ["open"] + if wait: + args.append("-W") + if locate: + args.append("-R") + args.append(_unquote_file(url)) + null = open("/dev/null", "w") + try: + return subprocess.Popen(args, stderr=null).wait() + finally: + null.close() + elif WIN: + if locate: + url = _unquote_file(url) + args = ["explorer", f"/select,{url}"] + else: + args = ["start"] + if wait: + args.append("/WAIT") + args.append("") + args.append(url) + try: + return subprocess.call(args) + except OSError: + # Command not found + return 127 + elif CYGWIN: + if locate: + url = _unquote_file(url) + args = ["cygstart", os.path.dirname(url)] + else: + args = ["cygstart"] + if wait: + args.append("-w") + args.append(url) + try: + return subprocess.call(args) + except OSError: + # Command not found + return 127 + + try: + if locate: + url = os.path.dirname(_unquote_file(url)) or "." + else: + url = _unquote_file(url) + c = subprocess.Popen(["xdg-open", url]) + if wait: + return c.wait() + return 0 + except OSError: + if url.startswith(("http://", "https://")) and not locate and not wait: + import webbrowser + + webbrowser.open(url) + return 0 + return 1 + + +def _translate_ch_to_exc(ch: str) -> None: + if ch == "\x03": + raise KeyboardInterrupt() + + if ch == "\x04" and not WIN: # Unix-like, Ctrl+D + raise EOFError() + + if ch == "\x1a" and WIN: # Windows, Ctrl+Z + raise EOFError() + + return None + + +if sys.platform == "win32": + import msvcrt + + @contextlib.contextmanager + def raw_terminal() -> cabc.Iterator[int]: + yield -1 + + def getchar(echo: bool) -> str: + # The function `getch` will return a bytes object corresponding to + # the pressed character. Since Windows 10 build 1803, it will also + # return \x00 when called a second time after pressing a regular key. + # + # `getwch` does not share this probably-bugged behavior. Moreover, it + # returns a Unicode object by default, which is what we want. + # + # Either of these functions will return \x00 or \xe0 to indicate + # a special key, and you need to call the same function again to get + # the "rest" of the code. The fun part is that \u00e0 is + # "latin small letter a with grave", so if you type that on a French + # keyboard, you _also_ get a \xe0. + # E.g., consider the Up arrow. This returns \xe0 and then \x48. The + # resulting Unicode string reads as "a with grave" + "capital H". + # This is indistinguishable from when the user actually types + # "a with grave" and then "capital H". + # + # When \xe0 is returned, we assume it's part of a special-key sequence + # and call `getwch` again, but that means that when the user types + # the \u00e0 character, `getchar` doesn't return until a second + # character is typed. + # The alternative is returning immediately, but that would mess up + # cross-platform handling of arrow keys and others that start with + # \xe0. Another option is using `getch`, but then we can't reliably + # read non-ASCII characters, because return values of `getch` are + # limited to the current 8-bit codepage. + # + # Anyway, Click doesn't claim to do this Right(tm), and using `getwch` + # is doing the right thing in more situations than with `getch`. + + if echo: + func = t.cast(t.Callable[[], str], msvcrt.getwche) + else: + func = t.cast(t.Callable[[], str], msvcrt.getwch) + + rv = func() + + if rv in ("\x00", "\xe0"): + # \x00 and \xe0 are control characters that indicate special key, + # see above. + rv += func() + + _translate_ch_to_exc(rv) + return rv + +else: + import termios + import tty + + @contextlib.contextmanager + def raw_terminal() -> cabc.Iterator[int]: + f: t.TextIO | None + fd: int + + if not isatty(sys.stdin): + f = open("/dev/tty") + fd = f.fileno() + else: + fd = sys.stdin.fileno() + f = None + + try: + old_settings = termios.tcgetattr(fd) + + try: + tty.setraw(fd) + yield fd + finally: + termios.tcsetattr(fd, termios.TCSADRAIN, old_settings) + sys.stdout.flush() + + if f is not None: + f.close() + except termios.error: + pass + + def getchar(echo: bool) -> str: + with raw_terminal() as fd: + ch = os.read(fd, 32).decode(get_best_encoding(sys.stdin), "replace") + + if echo and isatty(sys.stdout): + sys.stdout.write(ch) + + _translate_ch_to_exc(ch) + return ch diff --git a/venv/lib/python3.11/site-packages/click/_textwrap.py b/venv/lib/python3.11/site-packages/click/_textwrap.py new file mode 100644 index 0000000..97fbee3 --- /dev/null +++ b/venv/lib/python3.11/site-packages/click/_textwrap.py @@ -0,0 +1,51 @@ +from __future__ import annotations + +import collections.abc as cabc +import textwrap +from contextlib import contextmanager + + +class TextWrapper(textwrap.TextWrapper): + def _handle_long_word( + self, + reversed_chunks: list[str], + cur_line: list[str], + cur_len: int, + width: int, + ) -> None: + space_left = max(width - cur_len, 1) + + if self.break_long_words: + last = reversed_chunks[-1] + cut = last[:space_left] + res = last[space_left:] + cur_line.append(cut) + reversed_chunks[-1] = res + elif not cur_line: + cur_line.append(reversed_chunks.pop()) + + @contextmanager + def extra_indent(self, indent: str) -> cabc.Iterator[None]: + old_initial_indent = self.initial_indent + old_subsequent_indent = self.subsequent_indent + self.initial_indent += indent + self.subsequent_indent += indent + + try: + yield + finally: + self.initial_indent = old_initial_indent + self.subsequent_indent = old_subsequent_indent + + def indent_only(self, text: str) -> str: + rv = [] + + for idx, line in enumerate(text.splitlines()): + indent = self.initial_indent + + if idx > 0: + indent = self.subsequent_indent + + rv.append(f"{indent}{line}") + + return "\n".join(rv) diff --git a/venv/lib/python3.11/site-packages/click/_utils.py b/venv/lib/python3.11/site-packages/click/_utils.py new file mode 100644 index 0000000..09fb008 --- /dev/null +++ b/venv/lib/python3.11/site-packages/click/_utils.py @@ -0,0 +1,36 @@ +from __future__ import annotations + +import enum +import typing as t + + +class Sentinel(enum.Enum): + """Enum used to define sentinel values. + + .. seealso:: + + `PEP 661 - Sentinel Values `_. + """ + + UNSET = object() + FLAG_NEEDS_VALUE = object() + + def __repr__(self) -> str: + return f"{self.__class__.__name__}.{self.name}" + + +UNSET = Sentinel.UNSET +"""Sentinel used to indicate that a value is not set.""" + +FLAG_NEEDS_VALUE = Sentinel.FLAG_NEEDS_VALUE +"""Sentinel used to indicate an option was passed as a flag without a +value but is not a flag option. + +``Option.consume_value`` uses this to prompt or use the ``flag_value``. +""" + +T_UNSET = t.Literal[UNSET] # type: ignore[valid-type] +"""Type hint for the :data:`UNSET` sentinel value.""" + +T_FLAG_NEEDS_VALUE = t.Literal[FLAG_NEEDS_VALUE] # type: ignore[valid-type] +"""Type hint for the :data:`FLAG_NEEDS_VALUE` sentinel value.""" diff --git a/venv/lib/python3.11/site-packages/click/_winconsole.py b/venv/lib/python3.11/site-packages/click/_winconsole.py new file mode 100644 index 0000000..e56c7c6 --- /dev/null +++ b/venv/lib/python3.11/site-packages/click/_winconsole.py @@ -0,0 +1,296 @@ +# This module is based on the excellent work by Adam Bartoš who +# provided a lot of what went into the implementation here in +# the discussion to issue1602 in the Python bug tracker. +# +# There are some general differences in regards to how this works +# compared to the original patches as we do not need to patch +# the entire interpreter but just work in our little world of +# echo and prompt. +from __future__ import annotations + +import collections.abc as cabc +import io +import sys +import time +import typing as t +from ctypes import Array +from ctypes import byref +from ctypes import c_char +from ctypes import c_char_p +from ctypes import c_int +from ctypes import c_ssize_t +from ctypes import c_ulong +from ctypes import c_void_p +from ctypes import POINTER +from ctypes import py_object +from ctypes import Structure +from ctypes.wintypes import DWORD +from ctypes.wintypes import HANDLE +from ctypes.wintypes import LPCWSTR +from ctypes.wintypes import LPWSTR + +from ._compat import _NonClosingTextIOWrapper + +assert sys.platform == "win32" +import msvcrt # noqa: E402 +from ctypes import windll # noqa: E402 +from ctypes import WINFUNCTYPE # noqa: E402 + +c_ssize_p = POINTER(c_ssize_t) + +kernel32 = windll.kernel32 +GetStdHandle = kernel32.GetStdHandle +ReadConsoleW = kernel32.ReadConsoleW +WriteConsoleW = kernel32.WriteConsoleW +GetConsoleMode = kernel32.GetConsoleMode +GetLastError = kernel32.GetLastError +GetCommandLineW = WINFUNCTYPE(LPWSTR)(("GetCommandLineW", windll.kernel32)) +CommandLineToArgvW = WINFUNCTYPE(POINTER(LPWSTR), LPCWSTR, POINTER(c_int))( + ("CommandLineToArgvW", windll.shell32) +) +LocalFree = WINFUNCTYPE(c_void_p, c_void_p)(("LocalFree", windll.kernel32)) + +STDIN_HANDLE = GetStdHandle(-10) +STDOUT_HANDLE = GetStdHandle(-11) +STDERR_HANDLE = GetStdHandle(-12) + +PyBUF_SIMPLE = 0 +PyBUF_WRITABLE = 1 + +ERROR_SUCCESS = 0 +ERROR_NOT_ENOUGH_MEMORY = 8 +ERROR_OPERATION_ABORTED = 995 + +STDIN_FILENO = 0 +STDOUT_FILENO = 1 +STDERR_FILENO = 2 + +EOF = b"\x1a" +MAX_BYTES_WRITTEN = 32767 + +if t.TYPE_CHECKING: + try: + # Using `typing_extensions.Buffer` instead of `collections.abc` + # on Windows for some reason does not have `Sized` implemented. + from collections.abc import Buffer # type: ignore + except ImportError: + from typing_extensions import Buffer + +try: + from ctypes import pythonapi +except ImportError: + # On PyPy we cannot get buffers so our ability to operate here is + # severely limited. + get_buffer = None +else: + + class Py_buffer(Structure): + _fields_ = [ # noqa: RUF012 + ("buf", c_void_p), + ("obj", py_object), + ("len", c_ssize_t), + ("itemsize", c_ssize_t), + ("readonly", c_int), + ("ndim", c_int), + ("format", c_char_p), + ("shape", c_ssize_p), + ("strides", c_ssize_p), + ("suboffsets", c_ssize_p), + ("internal", c_void_p), + ] + + PyObject_GetBuffer = pythonapi.PyObject_GetBuffer + PyBuffer_Release = pythonapi.PyBuffer_Release + + def get_buffer(obj: Buffer, writable: bool = False) -> Array[c_char]: + buf = Py_buffer() + flags: int = PyBUF_WRITABLE if writable else PyBUF_SIMPLE + PyObject_GetBuffer(py_object(obj), byref(buf), flags) + + try: + buffer_type = c_char * buf.len + out: Array[c_char] = buffer_type.from_address(buf.buf) + return out + finally: + PyBuffer_Release(byref(buf)) + + +class _WindowsConsoleRawIOBase(io.RawIOBase): + def __init__(self, handle: int | None) -> None: + self.handle = handle + + def isatty(self) -> t.Literal[True]: + super().isatty() + return True + + +class _WindowsConsoleReader(_WindowsConsoleRawIOBase): + def readable(self) -> t.Literal[True]: + return True + + def readinto(self, b: Buffer) -> int: + bytes_to_be_read = len(b) + if not bytes_to_be_read: + return 0 + elif bytes_to_be_read % 2: + raise ValueError( + "cannot read odd number of bytes from UTF-16-LE encoded console" + ) + + buffer = get_buffer(b, writable=True) + code_units_to_be_read = bytes_to_be_read // 2 + code_units_read = c_ulong() + + rv = ReadConsoleW( + HANDLE(self.handle), + buffer, + code_units_to_be_read, + byref(code_units_read), + None, + ) + if GetLastError() == ERROR_OPERATION_ABORTED: + # wait for KeyboardInterrupt + time.sleep(0.1) + if not rv: + raise OSError(f"Windows error: {GetLastError()}") + + if buffer[0] == EOF: + return 0 + return 2 * code_units_read.value + + +class _WindowsConsoleWriter(_WindowsConsoleRawIOBase): + def writable(self) -> t.Literal[True]: + return True + + @staticmethod + def _get_error_message(errno: int) -> str: + if errno == ERROR_SUCCESS: + return "ERROR_SUCCESS" + elif errno == ERROR_NOT_ENOUGH_MEMORY: + return "ERROR_NOT_ENOUGH_MEMORY" + return f"Windows error {errno}" + + def write(self, b: Buffer) -> int: + bytes_to_be_written = len(b) + buf = get_buffer(b) + code_units_to_be_written = min(bytes_to_be_written, MAX_BYTES_WRITTEN) // 2 + code_units_written = c_ulong() + + WriteConsoleW( + HANDLE(self.handle), + buf, + code_units_to_be_written, + byref(code_units_written), + None, + ) + bytes_written = 2 * code_units_written.value + + if bytes_written == 0 and bytes_to_be_written > 0: + raise OSError(self._get_error_message(GetLastError())) + return bytes_written + + +class ConsoleStream: + def __init__(self, text_stream: t.TextIO, byte_stream: t.BinaryIO) -> None: + self._text_stream = text_stream + self.buffer = byte_stream + + @property + def name(self) -> str: + return self.buffer.name + + def write(self, x: t.AnyStr) -> int: + if isinstance(x, str): + return self._text_stream.write(x) + try: + self.flush() + except Exception: + pass + return self.buffer.write(x) + + def writelines(self, lines: cabc.Iterable[t.AnyStr]) -> None: + for line in lines: + self.write(line) + + def __getattr__(self, name: str) -> t.Any: + return getattr(self._text_stream, name) + + def isatty(self) -> bool: + return self.buffer.isatty() + + def __repr__(self) -> str: + return f"" + + +def _get_text_stdin(buffer_stream: t.BinaryIO) -> t.TextIO: + text_stream = _NonClosingTextIOWrapper( + io.BufferedReader(_WindowsConsoleReader(STDIN_HANDLE)), + "utf-16-le", + "strict", + line_buffering=True, + ) + return t.cast(t.TextIO, ConsoleStream(text_stream, buffer_stream)) + + +def _get_text_stdout(buffer_stream: t.BinaryIO) -> t.TextIO: + text_stream = _NonClosingTextIOWrapper( + io.BufferedWriter(_WindowsConsoleWriter(STDOUT_HANDLE)), + "utf-16-le", + "strict", + line_buffering=True, + ) + return t.cast(t.TextIO, ConsoleStream(text_stream, buffer_stream)) + + +def _get_text_stderr(buffer_stream: t.BinaryIO) -> t.TextIO: + text_stream = _NonClosingTextIOWrapper( + io.BufferedWriter(_WindowsConsoleWriter(STDERR_HANDLE)), + "utf-16-le", + "strict", + line_buffering=True, + ) + return t.cast(t.TextIO, ConsoleStream(text_stream, buffer_stream)) + + +_stream_factories: cabc.Mapping[int, t.Callable[[t.BinaryIO], t.TextIO]] = { + 0: _get_text_stdin, + 1: _get_text_stdout, + 2: _get_text_stderr, +} + + +def _is_console(f: t.TextIO) -> bool: + if not hasattr(f, "fileno"): + return False + + try: + fileno = f.fileno() + except (OSError, io.UnsupportedOperation): + return False + + handle = msvcrt.get_osfhandle(fileno) + return bool(GetConsoleMode(handle, byref(DWORD()))) + + +def _get_windows_console_stream( + f: t.TextIO, encoding: str | None, errors: str | None +) -> t.TextIO | None: + if ( + get_buffer is None + or encoding not in {"utf-16-le", None} + or errors not in {"strict", None} + or not _is_console(f) + ): + return None + + func = _stream_factories.get(f.fileno()) + if func is None: + return None + + b = getattr(f, "buffer", None) + + if b is None: + return None + + return func(b) diff --git a/venv/lib/python3.11/site-packages/click/core.py b/venv/lib/python3.11/site-packages/click/core.py new file mode 100644 index 0000000..57f549c --- /dev/null +++ b/venv/lib/python3.11/site-packages/click/core.py @@ -0,0 +1,3415 @@ +from __future__ import annotations + +import collections.abc as cabc +import enum +import errno +import inspect +import os +import sys +import typing as t +from collections import abc +from collections import Counter +from contextlib import AbstractContextManager +from contextlib import contextmanager +from contextlib import ExitStack +from functools import update_wrapper +from gettext import gettext as _ +from gettext import ngettext +from itertools import repeat +from types import TracebackType + +from . import types +from ._utils import FLAG_NEEDS_VALUE +from ._utils import UNSET +from .exceptions import Abort +from .exceptions import BadParameter +from .exceptions import ClickException +from .exceptions import Exit +from .exceptions import MissingParameter +from .exceptions import NoArgsIsHelpError +from .exceptions import UsageError +from .formatting import HelpFormatter +from .formatting import join_options +from .globals import pop_context +from .globals import push_context +from .parser import _OptionParser +from .parser import _split_opt +from .termui import confirm +from .termui import prompt +from .termui import style +from .utils import _detect_program_name +from .utils import _expand_args +from .utils import echo +from .utils import make_default_short_help +from .utils import make_str +from .utils import PacifyFlushWrapper + +if t.TYPE_CHECKING: + from .shell_completion import CompletionItem + +F = t.TypeVar("F", bound="t.Callable[..., t.Any]") +V = t.TypeVar("V") + + +def _complete_visible_commands( + ctx: Context, incomplete: str +) -> cabc.Iterator[tuple[str, Command]]: + """List all the subcommands of a group that start with the + incomplete value and aren't hidden. + + :param ctx: Invocation context for the group. + :param incomplete: Value being completed. May be empty. + """ + multi = t.cast(Group, ctx.command) + + for name in multi.list_commands(ctx): + if name.startswith(incomplete): + command = multi.get_command(ctx, name) + + if command is not None and not command.hidden: + yield name, command + + +def _check_nested_chain( + base_command: Group, cmd_name: str, cmd: Command, register: bool = False +) -> None: + if not base_command.chain or not isinstance(cmd, Group): + return + + if register: + message = ( + f"It is not possible to add the group {cmd_name!r} to another" + f" group {base_command.name!r} that is in chain mode." + ) + else: + message = ( + f"Found the group {cmd_name!r} as subcommand to another group " + f" {base_command.name!r} that is in chain mode. This is not supported." + ) + + raise RuntimeError(message) + + +def batch(iterable: cabc.Iterable[V], batch_size: int) -> list[tuple[V, ...]]: + return list(zip(*repeat(iter(iterable), batch_size), strict=False)) + + +@contextmanager +def augment_usage_errors( + ctx: Context, param: Parameter | None = None +) -> cabc.Iterator[None]: + """Context manager that attaches extra information to exceptions.""" + try: + yield + except BadParameter as e: + if e.ctx is None: + e.ctx = ctx + if param is not None and e.param is None: + e.param = param + raise + except UsageError as e: + if e.ctx is None: + e.ctx = ctx + raise + + +def iter_params_for_processing( + invocation_order: cabc.Sequence[Parameter], + declaration_order: cabc.Sequence[Parameter], +) -> list[Parameter]: + """Returns all declared parameters in the order they should be processed. + + The declared parameters are re-shuffled depending on the order in which + they were invoked, as well as the eagerness of each parameters. + + The invocation order takes precedence over the declaration order. I.e. the + order in which the user provided them to the CLI is respected. + + This behavior and its effect on callback evaluation is detailed at: + https://click.palletsprojects.com/en/stable/advanced/#callback-evaluation-order + """ + + def sort_key(item: Parameter) -> tuple[bool, float]: + try: + idx: float = invocation_order.index(item) + except ValueError: + idx = float("inf") + + return not item.is_eager, idx + + return sorted(declaration_order, key=sort_key) + + +class ParameterSource(enum.Enum): + """This is an :class:`~enum.Enum` that indicates the source of a + parameter's value. + + Use :meth:`click.Context.get_parameter_source` to get the + source for a parameter by name. + + .. versionchanged:: 8.0 + Use :class:`~enum.Enum` and drop the ``validate`` method. + + .. versionchanged:: 8.0 + Added the ``PROMPT`` value. + """ + + COMMANDLINE = enum.auto() + """The value was provided by the command line args.""" + ENVIRONMENT = enum.auto() + """The value was provided with an environment variable.""" + DEFAULT = enum.auto() + """Used the default specified by the parameter.""" + DEFAULT_MAP = enum.auto() + """Used a default provided by :attr:`Context.default_map`.""" + PROMPT = enum.auto() + """Used a prompt to confirm a default or provide a value.""" + + +class Context: + """The context is a special internal object that holds state relevant + for the script execution at every single level. It's normally invisible + to commands unless they opt-in to getting access to it. + + The context is useful as it can pass internal objects around and can + control special execution features such as reading data from + environment variables. + + A context can be used as context manager in which case it will call + :meth:`close` on teardown. + + :param command: the command class for this context. + :param parent: the parent context. + :param info_name: the info name for this invocation. Generally this + is the most descriptive name for the script or + command. For the toplevel script it is usually + the name of the script, for commands below it it's + the name of the script. + :param obj: an arbitrary object of user data. + :param auto_envvar_prefix: the prefix to use for automatic environment + variables. If this is `None` then reading + from environment variables is disabled. This + does not affect manually set environment + variables which are always read. + :param default_map: a dictionary (like object) with default values + for parameters. + :param terminal_width: the width of the terminal. The default is + inherit from parent context. If no context + defines the terminal width then auto + detection will be applied. + :param max_content_width: the maximum width for content rendered by + Click (this currently only affects help + pages). This defaults to 80 characters if + not overridden. In other words: even if the + terminal is larger than that, Click will not + format things wider than 80 characters by + default. In addition to that, formatters might + add some safety mapping on the right. + :param resilient_parsing: if this flag is enabled then Click will + parse without any interactivity or callback + invocation. Default values will also be + ignored. This is useful for implementing + things such as completion support. + :param allow_extra_args: if this is set to `True` then extra arguments + at the end will not raise an error and will be + kept on the context. The default is to inherit + from the command. + :param allow_interspersed_args: if this is set to `False` then options + and arguments cannot be mixed. The + default is to inherit from the command. + :param ignore_unknown_options: instructs click to ignore options it does + not know and keeps them for later + processing. + :param help_option_names: optionally a list of strings that define how + the default help parameter is named. The + default is ``['--help']``. + :param token_normalize_func: an optional function that is used to + normalize tokens (options, choices, + etc.). This for instance can be used to + implement case insensitive behavior. + :param color: controls if the terminal supports ANSI colors or not. The + default is autodetection. This is only needed if ANSI + codes are used in texts that Click prints which is by + default not the case. This for instance would affect + help output. + :param show_default: Show the default value for commands. If this + value is not set, it defaults to the value from the parent + context. ``Command.show_default`` overrides this default for the + specific command. + + .. versionchanged:: 8.2 + The ``protected_args`` attribute is deprecated and will be removed in + Click 9.0. ``args`` will contain remaining unparsed tokens. + + .. versionchanged:: 8.1 + The ``show_default`` parameter is overridden by + ``Command.show_default``, instead of the other way around. + + .. versionchanged:: 8.0 + The ``show_default`` parameter defaults to the value from the + parent context. + + .. versionchanged:: 7.1 + Added the ``show_default`` parameter. + + .. versionchanged:: 4.0 + Added the ``color``, ``ignore_unknown_options``, and + ``max_content_width`` parameters. + + .. versionchanged:: 3.0 + Added the ``allow_extra_args`` and ``allow_interspersed_args`` + parameters. + + .. versionchanged:: 2.0 + Added the ``resilient_parsing``, ``help_option_names``, and + ``token_normalize_func`` parameters. + """ + + #: The formatter class to create with :meth:`make_formatter`. + #: + #: .. versionadded:: 8.0 + formatter_class: type[HelpFormatter] = HelpFormatter + + def __init__( + self, + command: Command, + parent: Context | None = None, + info_name: str | None = None, + obj: t.Any | None = None, + auto_envvar_prefix: str | None = None, + default_map: cabc.MutableMapping[str, t.Any] | None = None, + terminal_width: int | None = None, + max_content_width: int | None = None, + resilient_parsing: bool = False, + allow_extra_args: bool | None = None, + allow_interspersed_args: bool | None = None, + ignore_unknown_options: bool | None = None, + help_option_names: list[str] | None = None, + token_normalize_func: t.Callable[[str], str] | None = None, + color: bool | None = None, + show_default: bool | None = None, + ) -> None: + #: the parent context or `None` if none exists. + self.parent = parent + #: the :class:`Command` for this context. + self.command = command + #: the descriptive information name + self.info_name = info_name + #: Map of parameter names to their parsed values. Parameters + #: with ``expose_value=False`` are not stored. + self.params: dict[str, t.Any] = {} + #: the leftover arguments. + self.args: list[str] = [] + #: protected arguments. These are arguments that are prepended + #: to `args` when certain parsing scenarios are encountered but + #: must be never propagated to another arguments. This is used + #: to implement nested parsing. + self._protected_args: list[str] = [] + #: the collected prefixes of the command's options. + self._opt_prefixes: set[str] = set(parent._opt_prefixes) if parent else set() + + if obj is None and parent is not None: + obj = parent.obj + + #: the user object stored. + self.obj: t.Any = obj + self._meta: dict[str, t.Any] = getattr(parent, "meta", {}) + + #: A dictionary (-like object) with defaults for parameters. + if ( + default_map is None + and info_name is not None + and parent is not None + and parent.default_map is not None + ): + default_map = parent.default_map.get(info_name) + + self.default_map: cabc.MutableMapping[str, t.Any] | None = default_map + + #: This flag indicates if a subcommand is going to be executed. A + #: group callback can use this information to figure out if it's + #: being executed directly or because the execution flow passes + #: onwards to a subcommand. By default it's None, but it can be + #: the name of the subcommand to execute. + #: + #: If chaining is enabled this will be set to ``'*'`` in case + #: any commands are executed. It is however not possible to + #: figure out which ones. If you require this knowledge you + #: should use a :func:`result_callback`. + self.invoked_subcommand: str | None = None + + if terminal_width is None and parent is not None: + terminal_width = parent.terminal_width + + #: The width of the terminal (None is autodetection). + self.terminal_width: int | None = terminal_width + + if max_content_width is None and parent is not None: + max_content_width = parent.max_content_width + + #: The maximum width of formatted content (None implies a sensible + #: default which is 80 for most things). + self.max_content_width: int | None = max_content_width + + if allow_extra_args is None: + allow_extra_args = command.allow_extra_args + + #: Indicates if the context allows extra args or if it should + #: fail on parsing. + #: + #: .. versionadded:: 3.0 + self.allow_extra_args = allow_extra_args + + if allow_interspersed_args is None: + allow_interspersed_args = command.allow_interspersed_args + + #: Indicates if the context allows mixing of arguments and + #: options or not. + #: + #: .. versionadded:: 3.0 + self.allow_interspersed_args: bool = allow_interspersed_args + + if ignore_unknown_options is None: + ignore_unknown_options = command.ignore_unknown_options + + #: Instructs click to ignore options that a command does not + #: understand and will store it on the context for later + #: processing. This is primarily useful for situations where you + #: want to call into external programs. Generally this pattern is + #: strongly discouraged because it's not possibly to losslessly + #: forward all arguments. + #: + #: .. versionadded:: 4.0 + self.ignore_unknown_options: bool = ignore_unknown_options + + if help_option_names is None: + if parent is not None: + help_option_names = parent.help_option_names + else: + help_option_names = ["--help"] + + #: The names for the help options. + self.help_option_names: list[str] = help_option_names + + if token_normalize_func is None and parent is not None: + token_normalize_func = parent.token_normalize_func + + #: An optional normalization function for tokens. This is + #: options, choices, commands etc. + self.token_normalize_func: t.Callable[[str], str] | None = token_normalize_func + + #: Indicates if resilient parsing is enabled. In that case Click + #: will do its best to not cause any failures and default values + #: will be ignored. Useful for completion. + self.resilient_parsing: bool = resilient_parsing + + # If there is no envvar prefix yet, but the parent has one and + # the command on this level has a name, we can expand the envvar + # prefix automatically. + if auto_envvar_prefix is None: + if ( + parent is not None + and parent.auto_envvar_prefix is not None + and self.info_name is not None + ): + auto_envvar_prefix = ( + f"{parent.auto_envvar_prefix}_{self.info_name.upper()}" + ) + else: + auto_envvar_prefix = auto_envvar_prefix.upper() + + if auto_envvar_prefix is not None: + auto_envvar_prefix = auto_envvar_prefix.replace("-", "_") + + self.auto_envvar_prefix: str | None = auto_envvar_prefix + + if color is None and parent is not None: + color = parent.color + + #: Controls if styling output is wanted or not. + self.color: bool | None = color + + if show_default is None and parent is not None: + show_default = parent.show_default + + #: Show option default values when formatting help text. + self.show_default: bool | None = show_default + + self._close_callbacks: list[t.Callable[[], t.Any]] = [] + self._depth = 0 + self._parameter_source: dict[str, ParameterSource] = {} + self._exit_stack = ExitStack() + + @property + def protected_args(self) -> list[str]: + import warnings + + warnings.warn( + "'protected_args' is deprecated and will be removed in Click 9.0." + " 'args' will contain remaining unparsed tokens.", + DeprecationWarning, + stacklevel=2, + ) + return self._protected_args + + def to_info_dict(self) -> dict[str, t.Any]: + """Gather information that could be useful for a tool generating + user-facing documentation. This traverses the entire CLI + structure. + + .. code-block:: python + + with Context(cli) as ctx: + info = ctx.to_info_dict() + + .. versionadded:: 8.0 + """ + return { + "command": self.command.to_info_dict(self), + "info_name": self.info_name, + "allow_extra_args": self.allow_extra_args, + "allow_interspersed_args": self.allow_interspersed_args, + "ignore_unknown_options": self.ignore_unknown_options, + "auto_envvar_prefix": self.auto_envvar_prefix, + } + + def __enter__(self) -> Context: + self._depth += 1 + push_context(self) + return self + + def __exit__( + self, + exc_type: type[BaseException] | None, + exc_value: BaseException | None, + tb: TracebackType | None, + ) -> bool | None: + self._depth -= 1 + exit_result: bool | None = None + if self._depth == 0: + exit_result = self._close_with_exception_info(exc_type, exc_value, tb) + pop_context() + + return exit_result + + @contextmanager + def scope(self, cleanup: bool = True) -> cabc.Iterator[Context]: + """This helper method can be used with the context object to promote + it to the current thread local (see :func:`get_current_context`). + The default behavior of this is to invoke the cleanup functions which + can be disabled by setting `cleanup` to `False`. The cleanup + functions are typically used for things such as closing file handles. + + If the cleanup is intended the context object can also be directly + used as a context manager. + + Example usage:: + + with ctx.scope(): + assert get_current_context() is ctx + + This is equivalent:: + + with ctx: + assert get_current_context() is ctx + + .. versionadded:: 5.0 + + :param cleanup: controls if the cleanup functions should be run or + not. The default is to run these functions. In + some situations the context only wants to be + temporarily pushed in which case this can be disabled. + Nested pushes automatically defer the cleanup. + """ + if not cleanup: + self._depth += 1 + try: + with self as rv: + yield rv + finally: + if not cleanup: + self._depth -= 1 + + @property + def meta(self) -> dict[str, t.Any]: + """This is a dictionary which is shared with all the contexts + that are nested. It exists so that click utilities can store some + state here if they need to. It is however the responsibility of + that code to manage this dictionary well. + + The keys are supposed to be unique dotted strings. For instance + module paths are a good choice for it. What is stored in there is + irrelevant for the operation of click. However what is important is + that code that places data here adheres to the general semantics of + the system. + + Example usage:: + + LANG_KEY = f'{__name__}.lang' + + def set_language(value): + ctx = get_current_context() + ctx.meta[LANG_KEY] = value + + def get_language(): + return get_current_context().meta.get(LANG_KEY, 'en_US') + + .. versionadded:: 5.0 + """ + return self._meta + + def make_formatter(self) -> HelpFormatter: + """Creates the :class:`~click.HelpFormatter` for the help and + usage output. + + To quickly customize the formatter class used without overriding + this method, set the :attr:`formatter_class` attribute. + + .. versionchanged:: 8.0 + Added the :attr:`formatter_class` attribute. + """ + return self.formatter_class( + width=self.terminal_width, max_width=self.max_content_width + ) + + def with_resource(self, context_manager: AbstractContextManager[V]) -> V: + """Register a resource as if it were used in a ``with`` + statement. The resource will be cleaned up when the context is + popped. + + Uses :meth:`contextlib.ExitStack.enter_context`. It calls the + resource's ``__enter__()`` method and returns the result. When + the context is popped, it closes the stack, which calls the + resource's ``__exit__()`` method. + + To register a cleanup function for something that isn't a + context manager, use :meth:`call_on_close`. Or use something + from :mod:`contextlib` to turn it into a context manager first. + + .. code-block:: python + + @click.group() + @click.option("--name") + @click.pass_context + def cli(ctx): + ctx.obj = ctx.with_resource(connect_db(name)) + + :param context_manager: The context manager to enter. + :return: Whatever ``context_manager.__enter__()`` returns. + + .. versionadded:: 8.0 + """ + return self._exit_stack.enter_context(context_manager) + + def call_on_close(self, f: t.Callable[..., t.Any]) -> t.Callable[..., t.Any]: + """Register a function to be called when the context tears down. + + This can be used to close resources opened during the script + execution. Resources that support Python's context manager + protocol which would be used in a ``with`` statement should be + registered with :meth:`with_resource` instead. + + :param f: The function to execute on teardown. + """ + return self._exit_stack.callback(f) + + def close(self) -> None: + """Invoke all close callbacks registered with + :meth:`call_on_close`, and exit all context managers entered + with :meth:`with_resource`. + """ + self._close_with_exception_info(None, None, None) + + def _close_with_exception_info( + self, + exc_type: type[BaseException] | None, + exc_value: BaseException | None, + tb: TracebackType | None, + ) -> bool | None: + """Unwind the exit stack by calling its :meth:`__exit__` providing the exception + information to allow for exception handling by the various resources registered + using :meth;`with_resource` + + :return: Whatever ``exit_stack.__exit__()`` returns. + """ + exit_result = self._exit_stack.__exit__(exc_type, exc_value, tb) + # In case the context is reused, create a new exit stack. + self._exit_stack = ExitStack() + + return exit_result + + @property + def command_path(self) -> str: + """The computed command path. This is used for the ``usage`` + information on the help page. It's automatically created by + combining the info names of the chain of contexts to the root. + """ + rv = "" + if self.info_name is not None: + rv = self.info_name + if self.parent is not None: + parent_command_path = [self.parent.command_path] + + if isinstance(self.parent.command, Command): + for param in self.parent.command.get_params(self): + parent_command_path.extend(param.get_usage_pieces(self)) + + rv = f"{' '.join(parent_command_path)} {rv}" + return rv.lstrip() + + def find_root(self) -> Context: + """Finds the outermost context.""" + node = self + while node.parent is not None: + node = node.parent + return node + + def find_object(self, object_type: type[V]) -> V | None: + """Finds the closest object of a given type.""" + node: Context | None = self + + while node is not None: + if isinstance(node.obj, object_type): + return node.obj + + node = node.parent + + return None + + def ensure_object(self, object_type: type[V]) -> V: + """Like :meth:`find_object` but sets the innermost object to a + new instance of `object_type` if it does not exist. + """ + rv = self.find_object(object_type) + if rv is None: + self.obj = rv = object_type() + return rv + + @t.overload + def lookup_default( + self, name: str, call: t.Literal[True] = True + ) -> t.Any | None: ... + + @t.overload + def lookup_default( + self, name: str, call: t.Literal[False] = ... + ) -> t.Any | t.Callable[[], t.Any] | None: ... + + def lookup_default(self, name: str, call: bool = True) -> t.Any | None: + """Get the default for a parameter from :attr:`default_map`. + + :param name: Name of the parameter. + :param call: If the default is a callable, call it. Disable to + return the callable instead. + + .. versionchanged:: 8.0 + Added the ``call`` parameter. + """ + if self.default_map is not None: + value = self.default_map.get(name, UNSET) + + if call and callable(value): + return value() + + return value + + return UNSET + + def fail(self, message: str) -> t.NoReturn: + """Aborts the execution of the program with a specific error + message. + + :param message: the error message to fail with. + """ + raise UsageError(message, self) + + def abort(self) -> t.NoReturn: + """Aborts the script.""" + raise Abort() + + def exit(self, code: int = 0) -> t.NoReturn: + """Exits the application with a given exit code. + + .. versionchanged:: 8.2 + Callbacks and context managers registered with :meth:`call_on_close` + and :meth:`with_resource` are closed before exiting. + """ + self.close() + raise Exit(code) + + def get_usage(self) -> str: + """Helper method to get formatted usage string for the current + context and command. + """ + return self.command.get_usage(self) + + def get_help(self) -> str: + """Helper method to get formatted help page for the current + context and command. + """ + return self.command.get_help(self) + + def _make_sub_context(self, command: Command) -> Context: + """Create a new context of the same type as this context, but + for a new command. + + :meta private: + """ + return type(self)(command, info_name=command.name, parent=self) + + @t.overload + def invoke( + self, callback: t.Callable[..., V], /, *args: t.Any, **kwargs: t.Any + ) -> V: ... + + @t.overload + def invoke(self, callback: Command, /, *args: t.Any, **kwargs: t.Any) -> t.Any: ... + + def invoke( + self, callback: Command | t.Callable[..., V], /, *args: t.Any, **kwargs: t.Any + ) -> t.Any | V: + """Invokes a command callback in exactly the way it expects. There + are two ways to invoke this method: + + 1. the first argument can be a callback and all other arguments and + keyword arguments are forwarded directly to the function. + 2. the first argument is a click command object. In that case all + arguments are forwarded as well but proper click parameters + (options and click arguments) must be keyword arguments and Click + will fill in defaults. + + .. versionchanged:: 8.0 + All ``kwargs`` are tracked in :attr:`params` so they will be + passed if :meth:`forward` is called at multiple levels. + + .. versionchanged:: 3.2 + A new context is created, and missing arguments use default values. + """ + if isinstance(callback, Command): + other_cmd = callback + + if other_cmd.callback is None: + raise TypeError( + "The given command does not have a callback that can be invoked." + ) + else: + callback = t.cast("t.Callable[..., V]", other_cmd.callback) + + ctx = self._make_sub_context(other_cmd) + + for param in other_cmd.params: + if param.name not in kwargs and param.expose_value: + default_value = param.get_default(ctx) + # We explicitly hide the :attr:`UNSET` value to the user, as we + # choose to make it an implementation detail. And because ``invoke`` + # has been designed as part of Click public API, we return ``None`` + # instead. Refs: + # https://github.com/pallets/click/issues/3066 + # https://github.com/pallets/click/issues/3065 + # https://github.com/pallets/click/pull/3068 + if default_value is UNSET: + default_value = None + kwargs[param.name] = param.type_cast_value( # type: ignore + ctx, default_value + ) + + # Track all kwargs as params, so that forward() will pass + # them on in subsequent calls. + ctx.params.update(kwargs) + else: + ctx = self + + with augment_usage_errors(self): + with ctx: + return callback(*args, **kwargs) + + def forward(self, cmd: Command, /, *args: t.Any, **kwargs: t.Any) -> t.Any: + """Similar to :meth:`invoke` but fills in default keyword + arguments from the current context if the other command expects + it. This cannot invoke callbacks directly, only other commands. + + .. versionchanged:: 8.0 + All ``kwargs`` are tracked in :attr:`params` so they will be + passed if ``forward`` is called at multiple levels. + """ + # Can only forward to other commands, not direct callbacks. + if not isinstance(cmd, Command): + raise TypeError("Callback is not a command.") + + for param in self.params: + if param not in kwargs: + kwargs[param] = self.params[param] + + return self.invoke(cmd, *args, **kwargs) + + def set_parameter_source(self, name: str, source: ParameterSource) -> None: + """Set the source of a parameter. This indicates the location + from which the value of the parameter was obtained. + + :param name: The name of the parameter. + :param source: A member of :class:`~click.core.ParameterSource`. + """ + self._parameter_source[name] = source + + def get_parameter_source(self, name: str) -> ParameterSource | None: + """Get the source of a parameter. This indicates the location + from which the value of the parameter was obtained. + + This can be useful for determining when a user specified a value + on the command line that is the same as the default value. It + will be :attr:`~click.core.ParameterSource.DEFAULT` only if the + value was actually taken from the default. + + :param name: The name of the parameter. + :rtype: ParameterSource + + .. versionchanged:: 8.0 + Returns ``None`` if the parameter was not provided from any + source. + """ + return self._parameter_source.get(name) + + +class Command: + """Commands are the basic building block of command line interfaces in + Click. A basic command handles command line parsing and might dispatch + more parsing to commands nested below it. + + :param name: the name of the command to use unless a group overrides it. + :param context_settings: an optional dictionary with defaults that are + passed to the context object. + :param callback: the callback to invoke. This is optional. + :param params: the parameters to register with this command. This can + be either :class:`Option` or :class:`Argument` objects. + :param help: the help string to use for this command. + :param epilog: like the help string but it's printed at the end of the + help page after everything else. + :param short_help: the short help to use for this command. This is + shown on the command listing of the parent command. + :param add_help_option: by default each command registers a ``--help`` + option. This can be disabled by this parameter. + :param no_args_is_help: this controls what happens if no arguments are + provided. This option is disabled by default. + If enabled this will add ``--help`` as argument + if no arguments are passed + :param hidden: hide this command from help outputs. + :param deprecated: If ``True`` or non-empty string, issues a message + indicating that the command is deprecated and highlights + its deprecation in --help. The message can be customized + by using a string as the value. + + .. versionchanged:: 8.2 + This is the base class for all commands, not ``BaseCommand``. + ``deprecated`` can be set to a string as well to customize the + deprecation message. + + .. versionchanged:: 8.1 + ``help``, ``epilog``, and ``short_help`` are stored unprocessed, + all formatting is done when outputting help text, not at init, + and is done even if not using the ``@command`` decorator. + + .. versionchanged:: 8.0 + Added a ``repr`` showing the command name. + + .. versionchanged:: 7.1 + Added the ``no_args_is_help`` parameter. + + .. versionchanged:: 2.0 + Added the ``context_settings`` parameter. + """ + + #: The context class to create with :meth:`make_context`. + #: + #: .. versionadded:: 8.0 + context_class: type[Context] = Context + + #: the default for the :attr:`Context.allow_extra_args` flag. + allow_extra_args = False + + #: the default for the :attr:`Context.allow_interspersed_args` flag. + allow_interspersed_args = True + + #: the default for the :attr:`Context.ignore_unknown_options` flag. + ignore_unknown_options = False + + def __init__( + self, + name: str | None, + context_settings: cabc.MutableMapping[str, t.Any] | None = None, + callback: t.Callable[..., t.Any] | None = None, + params: list[Parameter] | None = None, + help: str | None = None, + epilog: str | None = None, + short_help: str | None = None, + options_metavar: str | None = "[OPTIONS]", + add_help_option: bool = True, + no_args_is_help: bool = False, + hidden: bool = False, + deprecated: bool | str = False, + ) -> None: + #: the name the command thinks it has. Upon registering a command + #: on a :class:`Group` the group will default the command name + #: with this information. You should instead use the + #: :class:`Context`\'s :attr:`~Context.info_name` attribute. + self.name = name + + if context_settings is None: + context_settings = {} + + #: an optional dictionary with defaults passed to the context. + self.context_settings: cabc.MutableMapping[str, t.Any] = context_settings + + #: the callback to execute when the command fires. This might be + #: `None` in which case nothing happens. + self.callback = callback + #: the list of parameters for this command in the order they + #: should show up in the help page and execute. Eager parameters + #: will automatically be handled before non eager ones. + self.params: list[Parameter] = params or [] + self.help = help + self.epilog = epilog + self.options_metavar = options_metavar + self.short_help = short_help + self.add_help_option = add_help_option + self._help_option = None + self.no_args_is_help = no_args_is_help + self.hidden = hidden + self.deprecated = deprecated + + def to_info_dict(self, ctx: Context) -> dict[str, t.Any]: + return { + "name": self.name, + "params": [param.to_info_dict() for param in self.get_params(ctx)], + "help": self.help, + "epilog": self.epilog, + "short_help": self.short_help, + "hidden": self.hidden, + "deprecated": self.deprecated, + } + + def __repr__(self) -> str: + return f"<{self.__class__.__name__} {self.name}>" + + def get_usage(self, ctx: Context) -> str: + """Formats the usage line into a string and returns it. + + Calls :meth:`format_usage` internally. + """ + formatter = ctx.make_formatter() + self.format_usage(ctx, formatter) + return formatter.getvalue().rstrip("\n") + + def get_params(self, ctx: Context) -> list[Parameter]: + params = self.params + help_option = self.get_help_option(ctx) + + if help_option is not None: + params = [*params, help_option] + + if __debug__: + import warnings + + opts = [opt for param in params for opt in param.opts] + opts_counter = Counter(opts) + duplicate_opts = (opt for opt, count in opts_counter.items() if count > 1) + + for duplicate_opt in duplicate_opts: + warnings.warn( + ( + f"The parameter {duplicate_opt} is used more than once. " + "Remove its duplicate as parameters should be unique." + ), + stacklevel=3, + ) + + return params + + def format_usage(self, ctx: Context, formatter: HelpFormatter) -> None: + """Writes the usage line into the formatter. + + This is a low-level method called by :meth:`get_usage`. + """ + pieces = self.collect_usage_pieces(ctx) + formatter.write_usage(ctx.command_path, " ".join(pieces)) + + def collect_usage_pieces(self, ctx: Context) -> list[str]: + """Returns all the pieces that go into the usage line and returns + it as a list of strings. + """ + rv = [self.options_metavar] if self.options_metavar else [] + + for param in self.get_params(ctx): + rv.extend(param.get_usage_pieces(ctx)) + + return rv + + def get_help_option_names(self, ctx: Context) -> list[str]: + """Returns the names for the help option.""" + all_names = set(ctx.help_option_names) + for param in self.params: + all_names.difference_update(param.opts) + all_names.difference_update(param.secondary_opts) + return list(all_names) + + def get_help_option(self, ctx: Context) -> Option | None: + """Returns the help option object. + + Skipped if :attr:`add_help_option` is ``False``. + + .. versionchanged:: 8.1.8 + The help option is now cached to avoid creating it multiple times. + """ + help_option_names = self.get_help_option_names(ctx) + + if not help_option_names or not self.add_help_option: + return None + + # Cache the help option object in private _help_option attribute to + # avoid creating it multiple times. Not doing this will break the + # callback odering by iter_params_for_processing(), which relies on + # object comparison. + if self._help_option is None: + # Avoid circular import. + from .decorators import help_option + + # Apply help_option decorator and pop resulting option + help_option(*help_option_names)(self) + self._help_option = self.params.pop() # type: ignore[assignment] + + return self._help_option + + def make_parser(self, ctx: Context) -> _OptionParser: + """Creates the underlying option parser for this command.""" + parser = _OptionParser(ctx) + for param in self.get_params(ctx): + param.add_to_parser(parser, ctx) + return parser + + def get_help(self, ctx: Context) -> str: + """Formats the help into a string and returns it. + + Calls :meth:`format_help` internally. + """ + formatter = ctx.make_formatter() + self.format_help(ctx, formatter) + return formatter.getvalue().rstrip("\n") + + def get_short_help_str(self, limit: int = 45) -> str: + """Gets short help for the command or makes it by shortening the + long help string. + """ + if self.short_help: + text = inspect.cleandoc(self.short_help) + elif self.help: + text = make_default_short_help(self.help, limit) + else: + text = "" + + if self.deprecated: + deprecated_message = ( + f"(DEPRECATED: {self.deprecated})" + if isinstance(self.deprecated, str) + else "(DEPRECATED)" + ) + text = _("{text} {deprecated_message}").format( + text=text, deprecated_message=deprecated_message + ) + + return text.strip() + + def format_help(self, ctx: Context, formatter: HelpFormatter) -> None: + """Writes the help into the formatter if it exists. + + This is a low-level method called by :meth:`get_help`. + + This calls the following methods: + + - :meth:`format_usage` + - :meth:`format_help_text` + - :meth:`format_options` + - :meth:`format_epilog` + """ + self.format_usage(ctx, formatter) + self.format_help_text(ctx, formatter) + self.format_options(ctx, formatter) + self.format_epilog(ctx, formatter) + + def format_help_text(self, ctx: Context, formatter: HelpFormatter) -> None: + """Writes the help text to the formatter if it exists.""" + if self.help is not None: + # truncate the help text to the first form feed + text = inspect.cleandoc(self.help).partition("\f")[0] + else: + text = "" + + if self.deprecated: + deprecated_message = ( + f"(DEPRECATED: {self.deprecated})" + if isinstance(self.deprecated, str) + else "(DEPRECATED)" + ) + text = _("{text} {deprecated_message}").format( + text=text, deprecated_message=deprecated_message + ) + + if text: + formatter.write_paragraph() + + with formatter.indentation(): + formatter.write_text(text) + + def format_options(self, ctx: Context, formatter: HelpFormatter) -> None: + """Writes all the options into the formatter if they exist.""" + opts = [] + for param in self.get_params(ctx): + rv = param.get_help_record(ctx) + if rv is not None: + opts.append(rv) + + if opts: + with formatter.section(_("Options")): + formatter.write_dl(opts) + + def format_epilog(self, ctx: Context, formatter: HelpFormatter) -> None: + """Writes the epilog into the formatter if it exists.""" + if self.epilog: + epilog = inspect.cleandoc(self.epilog) + formatter.write_paragraph() + + with formatter.indentation(): + formatter.write_text(epilog) + + def make_context( + self, + info_name: str | None, + args: list[str], + parent: Context | None = None, + **extra: t.Any, + ) -> Context: + """This function when given an info name and arguments will kick + off the parsing and create a new :class:`Context`. It does not + invoke the actual command callback though. + + To quickly customize the context class used without overriding + this method, set the :attr:`context_class` attribute. + + :param info_name: the info name for this invocation. Generally this + is the most descriptive name for the script or + command. For the toplevel script it's usually + the name of the script, for commands below it's + the name of the command. + :param args: the arguments to parse as list of strings. + :param parent: the parent context if available. + :param extra: extra keyword arguments forwarded to the context + constructor. + + .. versionchanged:: 8.0 + Added the :attr:`context_class` attribute. + """ + for key, value in self.context_settings.items(): + if key not in extra: + extra[key] = value + + ctx = self.context_class(self, info_name=info_name, parent=parent, **extra) + + with ctx.scope(cleanup=False): + self.parse_args(ctx, args) + return ctx + + def parse_args(self, ctx: Context, args: list[str]) -> list[str]: + if not args and self.no_args_is_help and not ctx.resilient_parsing: + raise NoArgsIsHelpError(ctx) + + parser = self.make_parser(ctx) + opts, args, param_order = parser.parse_args(args=args) + + for param in iter_params_for_processing(param_order, self.get_params(ctx)): + _, args = param.handle_parse_result(ctx, opts, args) + + # We now have all parameters' values into `ctx.params`, but the data may contain + # the `UNSET` sentinel. + # Convert `UNSET` to `None` to ensure that the user doesn't see `UNSET`. + # + # Waiting until after the initial parse to convert allows us to treat `UNSET` + # more like a missing value when multiple params use the same name. + # Refs: + # https://github.com/pallets/click/issues/3071 + # https://github.com/pallets/click/pull/3079 + for name, value in ctx.params.items(): + if value is UNSET: + ctx.params[name] = None + + if args and not ctx.allow_extra_args and not ctx.resilient_parsing: + ctx.fail( + ngettext( + "Got unexpected extra argument ({args})", + "Got unexpected extra arguments ({args})", + len(args), + ).format(args=" ".join(map(str, args))) + ) + + ctx.args = args + ctx._opt_prefixes.update(parser._opt_prefixes) + return args + + def invoke(self, ctx: Context) -> t.Any: + """Given a context, this invokes the attached callback (if it exists) + in the right way. + """ + if self.deprecated: + extra_message = ( + f" {self.deprecated}" if isinstance(self.deprecated, str) else "" + ) + message = _( + "DeprecationWarning: The command {name!r} is deprecated.{extra_message}" + ).format(name=self.name, extra_message=extra_message) + echo(style(message, fg="red"), err=True) + + if self.callback is not None: + return ctx.invoke(self.callback, **ctx.params) + + def shell_complete(self, ctx: Context, incomplete: str) -> list[CompletionItem]: + """Return a list of completions for the incomplete value. Looks + at the names of options and chained multi-commands. + + Any command could be part of a chained multi-command, so sibling + commands are valid at any point during command completion. + + :param ctx: Invocation context for this command. + :param incomplete: Value being completed. May be empty. + + .. versionadded:: 8.0 + """ + from click.shell_completion import CompletionItem + + results: list[CompletionItem] = [] + + if incomplete and not incomplete[0].isalnum(): + for param in self.get_params(ctx): + if ( + not isinstance(param, Option) + or param.hidden + or ( + not param.multiple + and ctx.get_parameter_source(param.name) # type: ignore + is ParameterSource.COMMANDLINE + ) + ): + continue + + results.extend( + CompletionItem(name, help=param.help) + for name in [*param.opts, *param.secondary_opts] + if name.startswith(incomplete) + ) + + while ctx.parent is not None: + ctx = ctx.parent + + if isinstance(ctx.command, Group) and ctx.command.chain: + results.extend( + CompletionItem(name, help=command.get_short_help_str()) + for name, command in _complete_visible_commands(ctx, incomplete) + if name not in ctx._protected_args + ) + + return results + + @t.overload + def main( + self, + args: cabc.Sequence[str] | None = None, + prog_name: str | None = None, + complete_var: str | None = None, + standalone_mode: t.Literal[True] = True, + **extra: t.Any, + ) -> t.NoReturn: ... + + @t.overload + def main( + self, + args: cabc.Sequence[str] | None = None, + prog_name: str | None = None, + complete_var: str | None = None, + standalone_mode: bool = ..., + **extra: t.Any, + ) -> t.Any: ... + + def main( + self, + args: cabc.Sequence[str] | None = None, + prog_name: str | None = None, + complete_var: str | None = None, + standalone_mode: bool = True, + windows_expand_args: bool = True, + **extra: t.Any, + ) -> t.Any: + """This is the way to invoke a script with all the bells and + whistles as a command line application. This will always terminate + the application after a call. If this is not wanted, ``SystemExit`` + needs to be caught. + + This method is also available by directly calling the instance of + a :class:`Command`. + + :param args: the arguments that should be used for parsing. If not + provided, ``sys.argv[1:]`` is used. + :param prog_name: the program name that should be used. By default + the program name is constructed by taking the file + name from ``sys.argv[0]``. + :param complete_var: the environment variable that controls the + bash completion support. The default is + ``"__COMPLETE"`` with prog_name in + uppercase. + :param standalone_mode: the default behavior is to invoke the script + in standalone mode. Click will then + handle exceptions and convert them into + error messages and the function will never + return but shut down the interpreter. If + this is set to `False` they will be + propagated to the caller and the return + value of this function is the return value + of :meth:`invoke`. + :param windows_expand_args: Expand glob patterns, user dir, and + env vars in command line args on Windows. + :param extra: extra keyword arguments are forwarded to the context + constructor. See :class:`Context` for more information. + + .. versionchanged:: 8.0.1 + Added the ``windows_expand_args`` parameter to allow + disabling command line arg expansion on Windows. + + .. versionchanged:: 8.0 + When taking arguments from ``sys.argv`` on Windows, glob + patterns, user dir, and env vars are expanded. + + .. versionchanged:: 3.0 + Added the ``standalone_mode`` parameter. + """ + if args is None: + args = sys.argv[1:] + + if os.name == "nt" and windows_expand_args: + args = _expand_args(args) + else: + args = list(args) + + if prog_name is None: + prog_name = _detect_program_name() + + # Process shell completion requests and exit early. + self._main_shell_completion(extra, prog_name, complete_var) + + try: + try: + with self.make_context(prog_name, args, **extra) as ctx: + rv = self.invoke(ctx) + if not standalone_mode: + return rv + # it's not safe to `ctx.exit(rv)` here! + # note that `rv` may actually contain data like "1" which + # has obvious effects + # more subtle case: `rv=[None, None]` can come out of + # chained commands which all returned `None` -- so it's not + # even always obvious that `rv` indicates success/failure + # by its truthiness/falsiness + ctx.exit() + except (EOFError, KeyboardInterrupt) as e: + echo(file=sys.stderr) + raise Abort() from e + except ClickException as e: + if not standalone_mode: + raise + e.show() + sys.exit(e.exit_code) + except OSError as e: + if e.errno == errno.EPIPE: + sys.stdout = t.cast(t.TextIO, PacifyFlushWrapper(sys.stdout)) + sys.stderr = t.cast(t.TextIO, PacifyFlushWrapper(sys.stderr)) + sys.exit(1) + else: + raise + except Exit as e: + if standalone_mode: + sys.exit(e.exit_code) + else: + # in non-standalone mode, return the exit code + # note that this is only reached if `self.invoke` above raises + # an Exit explicitly -- thus bypassing the check there which + # would return its result + # the results of non-standalone execution may therefore be + # somewhat ambiguous: if there are codepaths which lead to + # `ctx.exit(1)` and to `return 1`, the caller won't be able to + # tell the difference between the two + return e.exit_code + except Abort: + if not standalone_mode: + raise + echo(_("Aborted!"), file=sys.stderr) + sys.exit(1) + + def _main_shell_completion( + self, + ctx_args: cabc.MutableMapping[str, t.Any], + prog_name: str, + complete_var: str | None = None, + ) -> None: + """Check if the shell is asking for tab completion, process + that, then exit early. Called from :meth:`main` before the + program is invoked. + + :param prog_name: Name of the executable in the shell. + :param complete_var: Name of the environment variable that holds + the completion instruction. Defaults to + ``_{PROG_NAME}_COMPLETE``. + + .. versionchanged:: 8.2.0 + Dots (``.``) in ``prog_name`` are replaced with underscores (``_``). + """ + if complete_var is None: + complete_name = prog_name.replace("-", "_").replace(".", "_") + complete_var = f"_{complete_name}_COMPLETE".upper() + + instruction = os.environ.get(complete_var) + + if not instruction: + return + + from .shell_completion import shell_complete + + rv = shell_complete(self, ctx_args, prog_name, complete_var, instruction) + sys.exit(rv) + + def __call__(self, *args: t.Any, **kwargs: t.Any) -> t.Any: + """Alias for :meth:`main`.""" + return self.main(*args, **kwargs) + + +class _FakeSubclassCheck(type): + def __subclasscheck__(cls, subclass: type) -> bool: + return issubclass(subclass, cls.__bases__[0]) + + def __instancecheck__(cls, instance: t.Any) -> bool: + return isinstance(instance, cls.__bases__[0]) + + +class _BaseCommand(Command, metaclass=_FakeSubclassCheck): + """ + .. deprecated:: 8.2 + Will be removed in Click 9.0. Use ``Command`` instead. + """ + + +class Group(Command): + """A group is a command that nests other commands (or more groups). + + :param name: The name of the group command. + :param commands: Map names to :class:`Command` objects. Can be a list, which + will use :attr:`Command.name` as the keys. + :param invoke_without_command: Invoke the group's callback even if a + subcommand is not given. + :param no_args_is_help: If no arguments are given, show the group's help and + exit. Defaults to the opposite of ``invoke_without_command``. + :param subcommand_metavar: How to represent the subcommand argument in help. + The default will represent whether ``chain`` is set or not. + :param chain: Allow passing more than one subcommand argument. After parsing + a command's arguments, if any arguments remain another command will be + matched, and so on. + :param result_callback: A function to call after the group's and + subcommand's callbacks. The value returned by the subcommand is passed. + If ``chain`` is enabled, the value will be a list of values returned by + all the commands. If ``invoke_without_command`` is enabled, the value + will be the value returned by the group's callback, or an empty list if + ``chain`` is enabled. + :param kwargs: Other arguments passed to :class:`Command`. + + .. versionchanged:: 8.0 + The ``commands`` argument can be a list of command objects. + + .. versionchanged:: 8.2 + Merged with and replaces the ``MultiCommand`` base class. + """ + + allow_extra_args = True + allow_interspersed_args = False + + #: If set, this is used by the group's :meth:`command` decorator + #: as the default :class:`Command` class. This is useful to make all + #: subcommands use a custom command class. + #: + #: .. versionadded:: 8.0 + command_class: type[Command] | None = None + + #: If set, this is used by the group's :meth:`group` decorator + #: as the default :class:`Group` class. This is useful to make all + #: subgroups use a custom group class. + #: + #: If set to the special value :class:`type` (literally + #: ``group_class = type``), this group's class will be used as the + #: default class. This makes a custom group class continue to make + #: custom groups. + #: + #: .. versionadded:: 8.0 + group_class: type[Group] | type[type] | None = None + # Literal[type] isn't valid, so use Type[type] + + def __init__( + self, + name: str | None = None, + commands: cabc.MutableMapping[str, Command] + | cabc.Sequence[Command] + | None = None, + invoke_without_command: bool = False, + no_args_is_help: bool | None = None, + subcommand_metavar: str | None = None, + chain: bool = False, + result_callback: t.Callable[..., t.Any] | None = None, + **kwargs: t.Any, + ) -> None: + super().__init__(name, **kwargs) + + if commands is None: + commands = {} + elif isinstance(commands, abc.Sequence): + commands = {c.name: c for c in commands if c.name is not None} + + #: The registered subcommands by their exported names. + self.commands: cabc.MutableMapping[str, Command] = commands + + if no_args_is_help is None: + no_args_is_help = not invoke_without_command + + self.no_args_is_help = no_args_is_help + self.invoke_without_command = invoke_without_command + + if subcommand_metavar is None: + if chain: + subcommand_metavar = "COMMAND1 [ARGS]... [COMMAND2 [ARGS]...]..." + else: + subcommand_metavar = "COMMAND [ARGS]..." + + self.subcommand_metavar = subcommand_metavar + self.chain = chain + # The result callback that is stored. This can be set or + # overridden with the :func:`result_callback` decorator. + self._result_callback = result_callback + + if self.chain: + for param in self.params: + if isinstance(param, Argument) and not param.required: + raise RuntimeError( + "A group in chain mode cannot have optional arguments." + ) + + def to_info_dict(self, ctx: Context) -> dict[str, t.Any]: + info_dict = super().to_info_dict(ctx) + commands = {} + + for name in self.list_commands(ctx): + command = self.get_command(ctx, name) + + if command is None: + continue + + sub_ctx = ctx._make_sub_context(command) + + with sub_ctx.scope(cleanup=False): + commands[name] = command.to_info_dict(sub_ctx) + + info_dict.update(commands=commands, chain=self.chain) + return info_dict + + def add_command(self, cmd: Command, name: str | None = None) -> None: + """Registers another :class:`Command` with this group. If the name + is not provided, the name of the command is used. + """ + name = name or cmd.name + if name is None: + raise TypeError("Command has no name.") + _check_nested_chain(self, name, cmd, register=True) + self.commands[name] = cmd + + @t.overload + def command(self, __func: t.Callable[..., t.Any]) -> Command: ... + + @t.overload + def command( + self, *args: t.Any, **kwargs: t.Any + ) -> t.Callable[[t.Callable[..., t.Any]], Command]: ... + + def command( + self, *args: t.Any, **kwargs: t.Any + ) -> t.Callable[[t.Callable[..., t.Any]], Command] | Command: + """A shortcut decorator for declaring and attaching a command to + the group. This takes the same arguments as :func:`command` and + immediately registers the created command with this group by + calling :meth:`add_command`. + + To customize the command class used, set the + :attr:`command_class` attribute. + + .. versionchanged:: 8.1 + This decorator can be applied without parentheses. + + .. versionchanged:: 8.0 + Added the :attr:`command_class` attribute. + """ + from .decorators import command + + func: t.Callable[..., t.Any] | None = None + + if args and callable(args[0]): + assert len(args) == 1 and not kwargs, ( + "Use 'command(**kwargs)(callable)' to provide arguments." + ) + (func,) = args + args = () + + if self.command_class and kwargs.get("cls") is None: + kwargs["cls"] = self.command_class + + def decorator(f: t.Callable[..., t.Any]) -> Command: + cmd: Command = command(*args, **kwargs)(f) + self.add_command(cmd) + return cmd + + if func is not None: + return decorator(func) + + return decorator + + @t.overload + def group(self, __func: t.Callable[..., t.Any]) -> Group: ... + + @t.overload + def group( + self, *args: t.Any, **kwargs: t.Any + ) -> t.Callable[[t.Callable[..., t.Any]], Group]: ... + + def group( + self, *args: t.Any, **kwargs: t.Any + ) -> t.Callable[[t.Callable[..., t.Any]], Group] | Group: + """A shortcut decorator for declaring and attaching a group to + the group. This takes the same arguments as :func:`group` and + immediately registers the created group with this group by + calling :meth:`add_command`. + + To customize the group class used, set the :attr:`group_class` + attribute. + + .. versionchanged:: 8.1 + This decorator can be applied without parentheses. + + .. versionchanged:: 8.0 + Added the :attr:`group_class` attribute. + """ + from .decorators import group + + func: t.Callable[..., t.Any] | None = None + + if args and callable(args[0]): + assert len(args) == 1 and not kwargs, ( + "Use 'group(**kwargs)(callable)' to provide arguments." + ) + (func,) = args + args = () + + if self.group_class is not None and kwargs.get("cls") is None: + if self.group_class is type: + kwargs["cls"] = type(self) + else: + kwargs["cls"] = self.group_class + + def decorator(f: t.Callable[..., t.Any]) -> Group: + cmd: Group = group(*args, **kwargs)(f) + self.add_command(cmd) + return cmd + + if func is not None: + return decorator(func) + + return decorator + + def result_callback(self, replace: bool = False) -> t.Callable[[F], F]: + """Adds a result callback to the command. By default if a + result callback is already registered this will chain them but + this can be disabled with the `replace` parameter. The result + callback is invoked with the return value of the subcommand + (or the list of return values from all subcommands if chaining + is enabled) as well as the parameters as they would be passed + to the main callback. + + Example:: + + @click.group() + @click.option('-i', '--input', default=23) + def cli(input): + return 42 + + @cli.result_callback() + def process_result(result, input): + return result + input + + :param replace: if set to `True` an already existing result + callback will be removed. + + .. versionchanged:: 8.0 + Renamed from ``resultcallback``. + + .. versionadded:: 3.0 + """ + + def decorator(f: F) -> F: + old_callback = self._result_callback + + if old_callback is None or replace: + self._result_callback = f + return f + + def function(value: t.Any, /, *args: t.Any, **kwargs: t.Any) -> t.Any: + inner = old_callback(value, *args, **kwargs) + return f(inner, *args, **kwargs) + + self._result_callback = rv = update_wrapper(t.cast(F, function), f) + return rv # type: ignore[return-value] + + return decorator + + def get_command(self, ctx: Context, cmd_name: str) -> Command | None: + """Given a context and a command name, this returns a :class:`Command` + object if it exists or returns ``None``. + """ + return self.commands.get(cmd_name) + + def list_commands(self, ctx: Context) -> list[str]: + """Returns a list of subcommand names in the order they should appear.""" + return sorted(self.commands) + + def collect_usage_pieces(self, ctx: Context) -> list[str]: + rv = super().collect_usage_pieces(ctx) + rv.append(self.subcommand_metavar) + return rv + + def format_options(self, ctx: Context, formatter: HelpFormatter) -> None: + super().format_options(ctx, formatter) + self.format_commands(ctx, formatter) + + def format_commands(self, ctx: Context, formatter: HelpFormatter) -> None: + """Extra format methods for multi methods that adds all the commands + after the options. + """ + commands = [] + for subcommand in self.list_commands(ctx): + cmd = self.get_command(ctx, subcommand) + # What is this, the tool lied about a command. Ignore it + if cmd is None: + continue + if cmd.hidden: + continue + + commands.append((subcommand, cmd)) + + # allow for 3 times the default spacing + if len(commands): + limit = formatter.width - 6 - max(len(cmd[0]) for cmd in commands) + + rows = [] + for subcommand, cmd in commands: + help = cmd.get_short_help_str(limit) + rows.append((subcommand, help)) + + if rows: + with formatter.section(_("Commands")): + formatter.write_dl(rows) + + def parse_args(self, ctx: Context, args: list[str]) -> list[str]: + if not args and self.no_args_is_help and not ctx.resilient_parsing: + raise NoArgsIsHelpError(ctx) + + rest = super().parse_args(ctx, args) + + if self.chain: + ctx._protected_args = rest + ctx.args = [] + elif rest: + ctx._protected_args, ctx.args = rest[:1], rest[1:] + + return ctx.args + + def invoke(self, ctx: Context) -> t.Any: + def _process_result(value: t.Any) -> t.Any: + if self._result_callback is not None: + value = ctx.invoke(self._result_callback, value, **ctx.params) + return value + + if not ctx._protected_args: + if self.invoke_without_command: + # No subcommand was invoked, so the result callback is + # invoked with the group return value for regular + # groups, or an empty list for chained groups. + with ctx: + rv = super().invoke(ctx) + return _process_result([] if self.chain else rv) + ctx.fail(_("Missing command.")) + + # Fetch args back out + args = [*ctx._protected_args, *ctx.args] + ctx.args = [] + ctx._protected_args = [] + + # If we're not in chain mode, we only allow the invocation of a + # single command but we also inform the current context about the + # name of the command to invoke. + if not self.chain: + # Make sure the context is entered so we do not clean up + # resources until the result processor has worked. + with ctx: + cmd_name, cmd, args = self.resolve_command(ctx, args) + assert cmd is not None + ctx.invoked_subcommand = cmd_name + super().invoke(ctx) + sub_ctx = cmd.make_context(cmd_name, args, parent=ctx) + with sub_ctx: + return _process_result(sub_ctx.command.invoke(sub_ctx)) + + # In chain mode we create the contexts step by step, but after the + # base command has been invoked. Because at that point we do not + # know the subcommands yet, the invoked subcommand attribute is + # set to ``*`` to inform the command that subcommands are executed + # but nothing else. + with ctx: + ctx.invoked_subcommand = "*" if args else None + super().invoke(ctx) + + # Otherwise we make every single context and invoke them in a + # chain. In that case the return value to the result processor + # is the list of all invoked subcommand's results. + contexts = [] + while args: + cmd_name, cmd, args = self.resolve_command(ctx, args) + assert cmd is not None + sub_ctx = cmd.make_context( + cmd_name, + args, + parent=ctx, + allow_extra_args=True, + allow_interspersed_args=False, + ) + contexts.append(sub_ctx) + args, sub_ctx.args = sub_ctx.args, [] + + rv = [] + for sub_ctx in contexts: + with sub_ctx: + rv.append(sub_ctx.command.invoke(sub_ctx)) + return _process_result(rv) + + def resolve_command( + self, ctx: Context, args: list[str] + ) -> tuple[str | None, Command | None, list[str]]: + cmd_name = make_str(args[0]) + original_cmd_name = cmd_name + + # Get the command + cmd = self.get_command(ctx, cmd_name) + + # If we can't find the command but there is a normalization + # function available, we try with that one. + if cmd is None and ctx.token_normalize_func is not None: + cmd_name = ctx.token_normalize_func(cmd_name) + cmd = self.get_command(ctx, cmd_name) + + # If we don't find the command we want to show an error message + # to the user that it was not provided. However, there is + # something else we should do: if the first argument looks like + # an option we want to kick off parsing again for arguments to + # resolve things like --help which now should go to the main + # place. + if cmd is None and not ctx.resilient_parsing: + if _split_opt(cmd_name)[0]: + self.parse_args(ctx, args) + ctx.fail(_("No such command {name!r}.").format(name=original_cmd_name)) + return cmd_name if cmd else None, cmd, args[1:] + + def shell_complete(self, ctx: Context, incomplete: str) -> list[CompletionItem]: + """Return a list of completions for the incomplete value. Looks + at the names of options, subcommands, and chained + multi-commands. + + :param ctx: Invocation context for this command. + :param incomplete: Value being completed. May be empty. + + .. versionadded:: 8.0 + """ + from click.shell_completion import CompletionItem + + results = [ + CompletionItem(name, help=command.get_short_help_str()) + for name, command in _complete_visible_commands(ctx, incomplete) + ] + results.extend(super().shell_complete(ctx, incomplete)) + return results + + +class _MultiCommand(Group, metaclass=_FakeSubclassCheck): + """ + .. deprecated:: 8.2 + Will be removed in Click 9.0. Use ``Group`` instead. + """ + + +class CommandCollection(Group): + """A :class:`Group` that looks up subcommands on other groups. If a command + is not found on this group, each registered source is checked in order. + Parameters on a source are not added to this group, and a source's callback + is not invoked when invoking its commands. In other words, this "flattens" + commands in many groups into this one group. + + :param name: The name of the group command. + :param sources: A list of :class:`Group` objects to look up commands from. + :param kwargs: Other arguments passed to :class:`Group`. + + .. versionchanged:: 8.2 + This is a subclass of ``Group``. Commands are looked up first on this + group, then each of its sources. + """ + + def __init__( + self, + name: str | None = None, + sources: list[Group] | None = None, + **kwargs: t.Any, + ) -> None: + super().__init__(name, **kwargs) + #: The list of registered groups. + self.sources: list[Group] = sources or [] + + def add_source(self, group: Group) -> None: + """Add a group as a source of commands.""" + self.sources.append(group) + + def get_command(self, ctx: Context, cmd_name: str) -> Command | None: + rv = super().get_command(ctx, cmd_name) + + if rv is not None: + return rv + + for source in self.sources: + rv = source.get_command(ctx, cmd_name) + + if rv is not None: + if self.chain: + _check_nested_chain(self, cmd_name, rv) + + return rv + + return None + + def list_commands(self, ctx: Context) -> list[str]: + rv: set[str] = set(super().list_commands(ctx)) + + for source in self.sources: + rv.update(source.list_commands(ctx)) + + return sorted(rv) + + +def _check_iter(value: t.Any) -> cabc.Iterator[t.Any]: + """Check if the value is iterable but not a string. Raises a type + error, or return an iterator over the value. + """ + if isinstance(value, str): + raise TypeError + + return iter(value) + + +class Parameter: + r"""A parameter to a command comes in two versions: they are either + :class:`Option`\s or :class:`Argument`\s. Other subclasses are currently + not supported by design as some of the internals for parsing are + intentionally not finalized. + + Some settings are supported by both options and arguments. + + :param param_decls: the parameter declarations for this option or + argument. This is a list of flags or argument + names. + :param type: the type that should be used. Either a :class:`ParamType` + or a Python type. The latter is converted into the former + automatically if supported. + :param required: controls if this is optional or not. + :param default: the default value if omitted. This can also be a callable, + in which case it's invoked when the default is needed + without any arguments. + :param callback: A function to further process or validate the value + after type conversion. It is called as ``f(ctx, param, value)`` + and must return the value. It is called for all sources, + including prompts. + :param nargs: the number of arguments to match. If not ``1`` the return + value is a tuple instead of single value. The default for + nargs is ``1`` (except if the type is a tuple, then it's + the arity of the tuple). If ``nargs=-1``, all remaining + parameters are collected. + :param metavar: how the value is represented in the help page. + :param expose_value: if this is `True` then the value is passed onwards + to the command callback and stored on the context, + otherwise it's skipped. + :param is_eager: eager values are processed before non eager ones. This + should not be set for arguments or it will inverse the + order of processing. + :param envvar: environment variable(s) that are used to provide a default value for + this parameter. This can be a string or a sequence of strings. If a sequence is + given, only the first non-empty environment variable is used for the parameter. + :param shell_complete: A function that returns custom shell + completions. Used instead of the param's type completion if + given. Takes ``ctx, param, incomplete`` and must return a list + of :class:`~click.shell_completion.CompletionItem` or a list of + strings. + :param deprecated: If ``True`` or non-empty string, issues a message + indicating that the argument is deprecated and highlights + its deprecation in --help. The message can be customized + by using a string as the value. A deprecated parameter + cannot be required, a ValueError will be raised otherwise. + + .. versionchanged:: 8.2.0 + Introduction of ``deprecated``. + + .. versionchanged:: 8.2 + Adding duplicate parameter names to a :class:`~click.core.Command` will + result in a ``UserWarning`` being shown. + + .. versionchanged:: 8.2 + Adding duplicate parameter names to a :class:`~click.core.Command` will + result in a ``UserWarning`` being shown. + + .. versionchanged:: 8.0 + ``process_value`` validates required parameters and bounded + ``nargs``, and invokes the parameter callback before returning + the value. This allows the callback to validate prompts. + ``full_process_value`` is removed. + + .. versionchanged:: 8.0 + ``autocompletion`` is renamed to ``shell_complete`` and has new + semantics described above. The old name is deprecated and will + be removed in 8.1, until then it will be wrapped to match the + new requirements. + + .. versionchanged:: 8.0 + For ``multiple=True, nargs>1``, the default must be a list of + tuples. + + .. versionchanged:: 8.0 + Setting a default is no longer required for ``nargs>1``, it will + default to ``None``. ``multiple=True`` or ``nargs=-1`` will + default to ``()``. + + .. versionchanged:: 7.1 + Empty environment variables are ignored rather than taking the + empty string value. This makes it possible for scripts to clear + variables if they can't unset them. + + .. versionchanged:: 2.0 + Changed signature for parameter callback to also be passed the + parameter. The old callback format will still work, but it will + raise a warning to give you a chance to migrate the code easier. + """ + + param_type_name = "parameter" + + def __init__( + self, + param_decls: cabc.Sequence[str] | None = None, + type: types.ParamType | t.Any | None = None, + required: bool = False, + # XXX The default historically embed two concepts: + # - the declaration of a Parameter object carrying the default (handy to + # arbitrage the default value of coupled Parameters sharing the same + # self.name, like flag options), + # - and the actual value of the default. + # It is confusing and is the source of many issues discussed in: + # https://github.com/pallets/click/pull/3030 + # In the future, we might think of splitting it in two, not unlike + # Option.is_flag and Option.flag_value: we could have something like + # Parameter.is_default and Parameter.default_value. + default: t.Any | t.Callable[[], t.Any] | None = UNSET, + callback: t.Callable[[Context, Parameter, t.Any], t.Any] | None = None, + nargs: int | None = None, + multiple: bool = False, + metavar: str | None = None, + expose_value: bool = True, + is_eager: bool = False, + envvar: str | cabc.Sequence[str] | None = None, + shell_complete: t.Callable[ + [Context, Parameter, str], list[CompletionItem] | list[str] + ] + | None = None, + deprecated: bool | str = False, + ) -> None: + self.name: str | None + self.opts: list[str] + self.secondary_opts: list[str] + self.name, self.opts, self.secondary_opts = self._parse_decls( + param_decls or (), expose_value + ) + self.type: types.ParamType = types.convert_type(type, default) + + # Default nargs to what the type tells us if we have that + # information available. + if nargs is None: + if self.type.is_composite: + nargs = self.type.arity + else: + nargs = 1 + + self.required = required + self.callback = callback + self.nargs = nargs + self.multiple = multiple + self.expose_value = expose_value + self.default: t.Any | t.Callable[[], t.Any] | None = default + self.is_eager = is_eager + self.metavar = metavar + self.envvar = envvar + self._custom_shell_complete = shell_complete + self.deprecated = deprecated + + if __debug__: + if self.type.is_composite and nargs != self.type.arity: + raise ValueError( + f"'nargs' must be {self.type.arity} (or None) for" + f" type {self.type!r}, but it was {nargs}." + ) + + if required and deprecated: + raise ValueError( + f"The {self.param_type_name} '{self.human_readable_name}' " + "is deprecated and still required. A deprecated " + f"{self.param_type_name} cannot be required." + ) + + def to_info_dict(self) -> dict[str, t.Any]: + """Gather information that could be useful for a tool generating + user-facing documentation. + + Use :meth:`click.Context.to_info_dict` to traverse the entire + CLI structure. + + .. versionchanged:: 8.3.0 + Returns ``None`` for the :attr:`default` if it was not set. + + .. versionadded:: 8.0 + """ + return { + "name": self.name, + "param_type_name": self.param_type_name, + "opts": self.opts, + "secondary_opts": self.secondary_opts, + "type": self.type.to_info_dict(), + "required": self.required, + "nargs": self.nargs, + "multiple": self.multiple, + # We explicitly hide the :attr:`UNSET` value to the user, as we choose to + # make it an implementation detail. And because ``to_info_dict`` has been + # designed for documentation purposes, we return ``None`` instead. + "default": self.default if self.default is not UNSET else None, + "envvar": self.envvar, + } + + def __repr__(self) -> str: + return f"<{self.__class__.__name__} {self.name}>" + + def _parse_decls( + self, decls: cabc.Sequence[str], expose_value: bool + ) -> tuple[str | None, list[str], list[str]]: + raise NotImplementedError() + + @property + def human_readable_name(self) -> str: + """Returns the human readable name of this parameter. This is the + same as the name for options, but the metavar for arguments. + """ + return self.name # type: ignore + + def make_metavar(self, ctx: Context) -> str: + if self.metavar is not None: + return self.metavar + + metavar = self.type.get_metavar(param=self, ctx=ctx) + + if metavar is None: + metavar = self.type.name.upper() + + if self.nargs != 1: + metavar += "..." + + return metavar + + @t.overload + def get_default( + self, ctx: Context, call: t.Literal[True] = True + ) -> t.Any | None: ... + + @t.overload + def get_default( + self, ctx: Context, call: bool = ... + ) -> t.Any | t.Callable[[], t.Any] | None: ... + + def get_default( + self, ctx: Context, call: bool = True + ) -> t.Any | t.Callable[[], t.Any] | None: + """Get the default for the parameter. Tries + :meth:`Context.lookup_default` first, then the local default. + + :param ctx: Current context. + :param call: If the default is a callable, call it. Disable to + return the callable instead. + + .. versionchanged:: 8.0.2 + Type casting is no longer performed when getting a default. + + .. versionchanged:: 8.0.1 + Type casting can fail in resilient parsing mode. Invalid + defaults will not prevent showing help text. + + .. versionchanged:: 8.0 + Looks at ``ctx.default_map`` first. + + .. versionchanged:: 8.0 + Added the ``call`` parameter. + """ + value = ctx.lookup_default(self.name, call=False) # type: ignore + + if value is UNSET: + value = self.default + + if call and callable(value): + value = value() + + return value + + def add_to_parser(self, parser: _OptionParser, ctx: Context) -> None: + raise NotImplementedError() + + def consume_value( + self, ctx: Context, opts: cabc.Mapping[str, t.Any] + ) -> tuple[t.Any, ParameterSource]: + """Returns the parameter value produced by the parser. + + If the parser did not produce a value from user input, the value is either + sourced from the environment variable, the default map, or the parameter's + default value. In that order of precedence. + + If no value is found, an internal sentinel value is returned. + + :meta private: + """ + # Collect from the parse the value passed by the user to the CLI. + value = opts.get(self.name, UNSET) # type: ignore + # If the value is set, it means it was sourced from the command line by the + # parser, otherwise it left unset by default. + source = ( + ParameterSource.COMMANDLINE + if value is not UNSET + else ParameterSource.DEFAULT + ) + + if value is UNSET: + envvar_value = self.value_from_envvar(ctx) + if envvar_value is not None: + value = envvar_value + source = ParameterSource.ENVIRONMENT + + if value is UNSET: + default_map_value = ctx.lookup_default(self.name) # type: ignore + if default_map_value is not UNSET: + value = default_map_value + source = ParameterSource.DEFAULT_MAP + + if value is UNSET: + default_value = self.get_default(ctx) + if default_value is not UNSET: + value = default_value + source = ParameterSource.DEFAULT + + return value, source + + def type_cast_value(self, ctx: Context, value: t.Any) -> t.Any: + """Convert and validate a value against the parameter's + :attr:`type`, :attr:`multiple`, and :attr:`nargs`. + """ + if value is None: + if self.multiple or self.nargs == -1: + return () + else: + return value + + def check_iter(value: t.Any) -> cabc.Iterator[t.Any]: + try: + return _check_iter(value) + except TypeError: + # This should only happen when passing in args manually, + # the parser should construct an iterable when parsing + # the command line. + raise BadParameter( + _("Value must be an iterable."), ctx=ctx, param=self + ) from None + + # Define the conversion function based on nargs and type. + + if self.nargs == 1 or self.type.is_composite: + + def convert(value: t.Any) -> t.Any: + return self.type(value, param=self, ctx=ctx) + + elif self.nargs == -1: + + def convert(value: t.Any) -> t.Any: # tuple[t.Any, ...] + return tuple(self.type(x, self, ctx) for x in check_iter(value)) + + else: # nargs > 1 + + def convert(value: t.Any) -> t.Any: # tuple[t.Any, ...] + value = tuple(check_iter(value)) + + if len(value) != self.nargs: + raise BadParameter( + ngettext( + "Takes {nargs} values but 1 was given.", + "Takes {nargs} values but {len} were given.", + len(value), + ).format(nargs=self.nargs, len=len(value)), + ctx=ctx, + param=self, + ) + + return tuple(self.type(x, self, ctx) for x in value) + + if self.multiple: + return tuple(convert(x) for x in check_iter(value)) + + return convert(value) + + def value_is_missing(self, value: t.Any) -> bool: + """A value is considered missing if: + + - it is :attr:`UNSET`, + - or if it is an empty sequence while the parameter is suppose to have + non-single value (i.e. :attr:`nargs` is not ``1`` or :attr:`multiple` is + set). + + :meta private: + """ + if value is UNSET: + return True + + if (self.nargs != 1 or self.multiple) and value == (): + return True + + return False + + def process_value(self, ctx: Context, value: t.Any) -> t.Any: + """Process the value of this parameter: + + 1. Type cast the value using :meth:`type_cast_value`. + 2. Check if the value is missing (see: :meth:`value_is_missing`), and raise + :exc:`MissingParameter` if it is required. + 3. If a :attr:`callback` is set, call it to have the value replaced by the + result of the callback. If the value was not set, the callback receive + ``None``. This keep the legacy behavior as it was before the introduction of + the :attr:`UNSET` sentinel. + + :meta private: + """ + # shelter `type_cast_value` from ever seeing an `UNSET` value by handling the + # cases in which `UNSET` gets special treatment explicitly at this layer + # + # Refs: + # https://github.com/pallets/click/issues/3069 + if value is UNSET: + if self.multiple or self.nargs == -1: + value = () + else: + value = self.type_cast_value(ctx, value) + + if self.required and self.value_is_missing(value): + raise MissingParameter(ctx=ctx, param=self) + + if self.callback is not None: + # Legacy case: UNSET is not exposed directly to the callback, but converted + # to None. + if value is UNSET: + value = None + + # Search for parameters with UNSET values in the context. + unset_keys = {k: None for k, v in ctx.params.items() if v is UNSET} + # No UNSET values, call the callback as usual. + if not unset_keys: + value = self.callback(ctx, self, value) + + # Legacy case: provide a temporarily manipulated context to the callback + # to hide UNSET values as None. + # + # Refs: + # https://github.com/pallets/click/issues/3136 + # https://github.com/pallets/click/pull/3137 + else: + # Add another layer to the context stack to clearly hint that the + # context is temporarily modified. + with ctx: + # Update the context parameters to replace UNSET with None. + ctx.params.update(unset_keys) + # Feed these fake context parameters to the callback. + value = self.callback(ctx, self, value) + # Restore the UNSET values in the context parameters. + ctx.params.update( + { + k: UNSET + for k in unset_keys + # Only restore keys that are present and still None, in case + # the callback modified other parameters. + if k in ctx.params and ctx.params[k] is None + } + ) + + return value + + def resolve_envvar_value(self, ctx: Context) -> str | None: + """Returns the value found in the environment variable(s) attached to this + parameter. + + Environment variables values are `always returned as strings + `_. + + This method returns ``None`` if: + + - the :attr:`envvar` property is not set on the :class:`Parameter`, + - the environment variable is not found in the environment, + - the variable is found in the environment but its value is empty (i.e. the + environment variable is present but has an empty string). + + If :attr:`envvar` is setup with multiple environment variables, + then only the first non-empty value is returned. + + .. caution:: + + The raw value extracted from the environment is not normalized and is + returned as-is. Any normalization or reconciliation is performed later by + the :class:`Parameter`'s :attr:`type`. + + :meta private: + """ + if not self.envvar: + return None + + if isinstance(self.envvar, str): + rv = os.environ.get(self.envvar) + + if rv: + return rv + else: + for envvar in self.envvar: + rv = os.environ.get(envvar) + + # Return the first non-empty value of the list of environment variables. + if rv: + return rv + # Else, absence of value is interpreted as an environment variable that + # is not set, so proceed to the next one. + + return None + + def value_from_envvar(self, ctx: Context) -> str | cabc.Sequence[str] | None: + """Process the raw environment variable string for this parameter. + + Returns the string as-is or splits it into a sequence of strings if the + parameter is expecting multiple values (i.e. its :attr:`nargs` property is set + to a value other than ``1``). + + :meta private: + """ + rv = self.resolve_envvar_value(ctx) + + if rv is not None and self.nargs != 1: + return self.type.split_envvar_value(rv) + + return rv + + def handle_parse_result( + self, ctx: Context, opts: cabc.Mapping[str, t.Any], args: list[str] + ) -> tuple[t.Any, list[str]]: + """Process the value produced by the parser from user input. + + Always process the value through the Parameter's :attr:`type`, wherever it + comes from. + + If the parameter is deprecated, this method warn the user about it. But only if + the value has been explicitly set by the user (and as such, is not coming from + a default). + + :meta private: + """ + with augment_usage_errors(ctx, param=self): + value, source = self.consume_value(ctx, opts) + + ctx.set_parameter_source(self.name, source) # type: ignore + + # Display a deprecation warning if necessary. + if ( + self.deprecated + and value is not UNSET + and source not in (ParameterSource.DEFAULT, ParameterSource.DEFAULT_MAP) + ): + extra_message = ( + f" {self.deprecated}" if isinstance(self.deprecated, str) else "" + ) + message = _( + "DeprecationWarning: The {param_type} {name!r} is deprecated." + "{extra_message}" + ).format( + param_type=self.param_type_name, + name=self.human_readable_name, + extra_message=extra_message, + ) + echo(style(message, fg="red"), err=True) + + # Process the value through the parameter's type. + try: + value = self.process_value(ctx, value) + except Exception: + if not ctx.resilient_parsing: + raise + # In resilient parsing mode, we do not want to fail the command if the + # value is incompatible with the parameter type, so we reset the value + # to UNSET, which will be interpreted as a missing value. + value = UNSET + + # Add parameter's value to the context. + if ( + self.expose_value + # We skip adding the value if it was previously set by another parameter + # targeting the same variable name. This prevents parameters competing for + # the same name to override each other. + and (self.name not in ctx.params or ctx.params[self.name] is UNSET) + ): + # Click is logically enforcing that the name is None if the parameter is + # not to be exposed. We still assert it here to please the type checker. + assert self.name is not None, ( + f"{self!r} parameter's name should not be None when exposing value." + ) + ctx.params[self.name] = value + + return value, args + + def get_help_record(self, ctx: Context) -> tuple[str, str] | None: + pass + + def get_usage_pieces(self, ctx: Context) -> list[str]: + return [] + + def get_error_hint(self, ctx: Context) -> str: + """Get a stringified version of the param for use in error messages to + indicate which param caused the error. + """ + hint_list = self.opts or [self.human_readable_name] + return " / ".join(f"'{x}'" for x in hint_list) + + def shell_complete(self, ctx: Context, incomplete: str) -> list[CompletionItem]: + """Return a list of completions for the incomplete value. If a + ``shell_complete`` function was given during init, it is used. + Otherwise, the :attr:`type` + :meth:`~click.types.ParamType.shell_complete` function is used. + + :param ctx: Invocation context for this command. + :param incomplete: Value being completed. May be empty. + + .. versionadded:: 8.0 + """ + if self._custom_shell_complete is not None: + results = self._custom_shell_complete(ctx, self, incomplete) + + if results and isinstance(results[0], str): + from click.shell_completion import CompletionItem + + results = [CompletionItem(c) for c in results] + + return t.cast("list[CompletionItem]", results) + + return self.type.shell_complete(ctx, self, incomplete) + + +class Option(Parameter): + """Options are usually optional values on the command line and + have some extra features that arguments don't have. + + All other parameters are passed onwards to the parameter constructor. + + :param show_default: Show the default value for this option in its + help text. Values are not shown by default, unless + :attr:`Context.show_default` is ``True``. If this value is a + string, it shows that string in parentheses instead of the + actual value. This is particularly useful for dynamic options. + For single option boolean flags, the default remains hidden if + its value is ``False``. + :param show_envvar: Controls if an environment variable should be + shown on the help page and error messages. + Normally, environment variables are not shown. + :param prompt: If set to ``True`` or a non empty string then the + user will be prompted for input. If set to ``True`` the prompt + will be the option name capitalized. A deprecated option cannot be + prompted. + :param confirmation_prompt: Prompt a second time to confirm the + value if it was prompted for. Can be set to a string instead of + ``True`` to customize the message. + :param prompt_required: If set to ``False``, the user will be + prompted for input only when the option was specified as a flag + without a value. + :param hide_input: If this is ``True`` then the input on the prompt + will be hidden from the user. This is useful for password input. + :param is_flag: forces this option to act as a flag. The default is + auto detection. + :param flag_value: which value should be used for this flag if it's + enabled. This is set to a boolean automatically if + the option string contains a slash to mark two options. + :param multiple: if this is set to `True` then the argument is accepted + multiple times and recorded. This is similar to ``nargs`` + in how it works but supports arbitrary number of + arguments. + :param count: this flag makes an option increment an integer. + :param allow_from_autoenv: if this is enabled then the value of this + parameter will be pulled from an environment + variable in case a prefix is defined on the + context. + :param help: the help string. + :param hidden: hide this option from help outputs. + :param attrs: Other command arguments described in :class:`Parameter`. + + .. versionchanged:: 8.2 + ``envvar`` used with ``flag_value`` will always use the ``flag_value``, + previously it would use the value of the environment variable. + + .. versionchanged:: 8.1 + Help text indentation is cleaned here instead of only in the + ``@option`` decorator. + + .. versionchanged:: 8.1 + The ``show_default`` parameter overrides + ``Context.show_default``. + + .. versionchanged:: 8.1 + The default of a single option boolean flag is not shown if the + default value is ``False``. + + .. versionchanged:: 8.0.1 + ``type`` is detected from ``flag_value`` if given. + """ + + param_type_name = "option" + + def __init__( + self, + param_decls: cabc.Sequence[str] | None = None, + show_default: bool | str | None = None, + prompt: bool | str = False, + confirmation_prompt: bool | str = False, + prompt_required: bool = True, + hide_input: bool = False, + is_flag: bool | None = None, + flag_value: t.Any = UNSET, + multiple: bool = False, + count: bool = False, + allow_from_autoenv: bool = True, + type: types.ParamType | t.Any | None = None, + help: str | None = None, + hidden: bool = False, + show_choices: bool = True, + show_envvar: bool = False, + deprecated: bool | str = False, + **attrs: t.Any, + ) -> None: + if help: + help = inspect.cleandoc(help) + + super().__init__( + param_decls, type=type, multiple=multiple, deprecated=deprecated, **attrs + ) + + if prompt is True: + if self.name is None: + raise TypeError("'name' is required with 'prompt=True'.") + + prompt_text: str | None = self.name.replace("_", " ").capitalize() + elif prompt is False: + prompt_text = None + else: + prompt_text = prompt + + if deprecated: + deprecated_message = ( + f"(DEPRECATED: {deprecated})" + if isinstance(deprecated, str) + else "(DEPRECATED)" + ) + help = help + deprecated_message if help is not None else deprecated_message + + self.prompt = prompt_text + self.confirmation_prompt = confirmation_prompt + self.prompt_required = prompt_required + self.hide_input = hide_input + self.hidden = hidden + + # The _flag_needs_value property tells the parser that this option is a flag + # that cannot be used standalone and needs a value. With this information, the + # parser can determine whether to consider the next user-provided argument in + # the CLI as a value for this flag or as a new option. + # If prompt is enabled but not required, then it opens the possibility for the + # option to gets its value from the user. + self._flag_needs_value = self.prompt is not None and not self.prompt_required + + # Auto-detect if this is a flag or not. + if is_flag is None: + # Implicitly a flag because flag_value was set. + if flag_value is not UNSET: + is_flag = True + # Not a flag, but when used as a flag it shows a prompt. + elif self._flag_needs_value: + is_flag = False + # Implicitly a flag because secondary options names were given. + elif self.secondary_opts: + is_flag = True + # The option is explicitly not a flag. But we do not know yet if it needs a + # value or not. So we look at the default value to determine it. + elif is_flag is False and not self._flag_needs_value: + self._flag_needs_value = self.default is UNSET + + if is_flag: + # Set missing default for flags if not explicitly required or prompted. + if self.default is UNSET and not self.required and not self.prompt: + if multiple: + self.default = () + + # Auto-detect the type of the flag based on the flag_value. + if type is None: + # A flag without a flag_value is a boolean flag. + if flag_value is UNSET: + self.type: types.ParamType = types.BoolParamType() + # If the flag value is a boolean, use BoolParamType. + elif isinstance(flag_value, bool): + self.type = types.BoolParamType() + # Otherwise, guess the type from the flag value. + else: + self.type = types.convert_type(None, flag_value) + + self.is_flag: bool = bool(is_flag) + self.is_bool_flag: bool = bool( + is_flag and isinstance(self.type, types.BoolParamType) + ) + self.flag_value: t.Any = flag_value + + # Set boolean flag default to False if unset and not required. + if self.is_bool_flag: + if self.default is UNSET and not self.required: + self.default = False + + # Support the special case of aligning the default value with the flag_value + # for flags whose default is explicitly set to True. Note that as long as we + # have this condition, there is no way a flag can have a default set to True, + # and a flag_value set to something else. Refs: + # https://github.com/pallets/click/issues/3024#issuecomment-3146199461 + # https://github.com/pallets/click/pull/3030/commits/06847da + if self.default is True and self.flag_value is not UNSET: + self.default = self.flag_value + + # Set the default flag_value if it is not set. + if self.flag_value is UNSET: + if self.is_flag: + self.flag_value = True + else: + self.flag_value = None + + # Counting. + self.count = count + if count: + if type is None: + self.type = types.IntRange(min=0) + if self.default is UNSET: + self.default = 0 + + self.allow_from_autoenv = allow_from_autoenv + self.help = help + self.show_default = show_default + self.show_choices = show_choices + self.show_envvar = show_envvar + + if __debug__: + if deprecated and prompt: + raise ValueError("`deprecated` options cannot use `prompt`.") + + if self.nargs == -1: + raise TypeError("nargs=-1 is not supported for options.") + + if not self.is_bool_flag and self.secondary_opts: + raise TypeError("Secondary flag is not valid for non-boolean flag.") + + if self.is_bool_flag and self.hide_input and self.prompt is not None: + raise TypeError( + "'prompt' with 'hide_input' is not valid for boolean flag." + ) + + if self.count: + if self.multiple: + raise TypeError("'count' is not valid with 'multiple'.") + + if self.is_flag: + raise TypeError("'count' is not valid with 'is_flag'.") + + def to_info_dict(self) -> dict[str, t.Any]: + """ + .. versionchanged:: 8.3.0 + Returns ``None`` for the :attr:`flag_value` if it was not set. + """ + info_dict = super().to_info_dict() + info_dict.update( + help=self.help, + prompt=self.prompt, + is_flag=self.is_flag, + # We explicitly hide the :attr:`UNSET` value to the user, as we choose to + # make it an implementation detail. And because ``to_info_dict`` has been + # designed for documentation purposes, we return ``None`` instead. + flag_value=self.flag_value if self.flag_value is not UNSET else None, + count=self.count, + hidden=self.hidden, + ) + return info_dict + + def get_error_hint(self, ctx: Context) -> str: + result = super().get_error_hint(ctx) + if self.show_envvar and self.envvar is not None: + result += f" (env var: '{self.envvar}')" + return result + + def _parse_decls( + self, decls: cabc.Sequence[str], expose_value: bool + ) -> tuple[str | None, list[str], list[str]]: + opts = [] + secondary_opts = [] + name = None + possible_names = [] + + for decl in decls: + if decl.isidentifier(): + if name is not None: + raise TypeError(f"Name '{name}' defined twice") + name = decl + else: + split_char = ";" if decl[:1] == "/" else "/" + if split_char in decl: + first, second = decl.split(split_char, 1) + first = first.rstrip() + if first: + possible_names.append(_split_opt(first)) + opts.append(first) + second = second.lstrip() + if second: + secondary_opts.append(second.lstrip()) + if first == second: + raise ValueError( + f"Boolean option {decl!r} cannot use the" + " same flag for true/false." + ) + else: + possible_names.append(_split_opt(decl)) + opts.append(decl) + + if name is None and possible_names: + possible_names.sort(key=lambda x: -len(x[0])) # group long options first + name = possible_names[0][1].replace("-", "_").lower() + if not name.isidentifier(): + name = None + + if name is None: + if not expose_value: + return None, opts, secondary_opts + raise TypeError( + f"Could not determine name for option with declarations {decls!r}" + ) + + if not opts and not secondary_opts: + raise TypeError( + f"No options defined but a name was passed ({name})." + " Did you mean to declare an argument instead? Did" + f" you mean to pass '--{name}'?" + ) + + return name, opts, secondary_opts + + def add_to_parser(self, parser: _OptionParser, ctx: Context) -> None: + if self.multiple: + action = "append" + elif self.count: + action = "count" + else: + action = "store" + + if self.is_flag: + action = f"{action}_const" + + if self.is_bool_flag and self.secondary_opts: + parser.add_option( + obj=self, opts=self.opts, dest=self.name, action=action, const=True + ) + parser.add_option( + obj=self, + opts=self.secondary_opts, + dest=self.name, + action=action, + const=False, + ) + else: + parser.add_option( + obj=self, + opts=self.opts, + dest=self.name, + action=action, + const=self.flag_value, + ) + else: + parser.add_option( + obj=self, + opts=self.opts, + dest=self.name, + action=action, + nargs=self.nargs, + ) + + def get_help_record(self, ctx: Context) -> tuple[str, str] | None: + if self.hidden: + return None + + any_prefix_is_slash = False + + def _write_opts(opts: cabc.Sequence[str]) -> str: + nonlocal any_prefix_is_slash + + rv, any_slashes = join_options(opts) + + if any_slashes: + any_prefix_is_slash = True + + if not self.is_flag and not self.count: + rv += f" {self.make_metavar(ctx=ctx)}" + + return rv + + rv = [_write_opts(self.opts)] + + if self.secondary_opts: + rv.append(_write_opts(self.secondary_opts)) + + help = self.help or "" + + extra = self.get_help_extra(ctx) + extra_items = [] + if "envvars" in extra: + extra_items.append( + _("env var: {var}").format(var=", ".join(extra["envvars"])) + ) + if "default" in extra: + extra_items.append(_("default: {default}").format(default=extra["default"])) + if "range" in extra: + extra_items.append(extra["range"]) + if "required" in extra: + extra_items.append(_(extra["required"])) + + if extra_items: + extra_str = "; ".join(extra_items) + help = f"{help} [{extra_str}]" if help else f"[{extra_str}]" + + return ("; " if any_prefix_is_slash else " / ").join(rv), help + + def get_help_extra(self, ctx: Context) -> types.OptionHelpExtra: + extra: types.OptionHelpExtra = {} + + if self.show_envvar: + envvar = self.envvar + + if envvar is None: + if ( + self.allow_from_autoenv + and ctx.auto_envvar_prefix is not None + and self.name is not None + ): + envvar = f"{ctx.auto_envvar_prefix}_{self.name.upper()}" + + if envvar is not None: + if isinstance(envvar, str): + extra["envvars"] = (envvar,) + else: + extra["envvars"] = tuple(str(d) for d in envvar) + + # Temporarily enable resilient parsing to avoid type casting + # failing for the default. Might be possible to extend this to + # help formatting in general. + resilient = ctx.resilient_parsing + ctx.resilient_parsing = True + + try: + default_value = self.get_default(ctx, call=False) + finally: + ctx.resilient_parsing = resilient + + show_default = False + show_default_is_str = False + + if self.show_default is not None: + if isinstance(self.show_default, str): + show_default_is_str = show_default = True + else: + show_default = self.show_default + elif ctx.show_default is not None: + show_default = ctx.show_default + + if show_default_is_str or ( + show_default and (default_value not in (None, UNSET)) + ): + if show_default_is_str: + default_string = f"({self.show_default})" + elif isinstance(default_value, (list, tuple)): + default_string = ", ".join(str(d) for d in default_value) + elif isinstance(default_value, enum.Enum): + default_string = default_value.name + elif inspect.isfunction(default_value): + default_string = _("(dynamic)") + elif self.is_bool_flag and self.secondary_opts: + # For boolean flags that have distinct True/False opts, + # use the opt without prefix instead of the value. + default_string = _split_opt( + (self.opts if default_value else self.secondary_opts)[0] + )[1] + elif self.is_bool_flag and not self.secondary_opts and not default_value: + default_string = "" + elif default_value == "": + default_string = '""' + else: + default_string = str(default_value) + + if default_string: + extra["default"] = default_string + + if ( + isinstance(self.type, types._NumberRangeBase) + # skip count with default range type + and not (self.count and self.type.min == 0 and self.type.max is None) + ): + range_str = self.type._describe_range() + + if range_str: + extra["range"] = range_str + + if self.required: + extra["required"] = "required" + + return extra + + def prompt_for_value(self, ctx: Context) -> t.Any: + """This is an alternative flow that can be activated in the full + value processing if a value does not exist. It will prompt the + user until a valid value exists and then returns the processed + value as result. + """ + assert self.prompt is not None + + # Calculate the default before prompting anything to lock in the value before + # attempting any user interaction. + default = self.get_default(ctx) + + # A boolean flag can use a simplified [y/n] confirmation prompt. + if self.is_bool_flag: + # If we have no boolean default, we force the user to explicitly provide + # one. + if default in (UNSET, None): + default = None + # Nothing prevent you to declare an option that is simultaneously: + # 1) auto-detected as a boolean flag, + # 2) allowed to prompt, and + # 3) still declare a non-boolean default. + # This forced casting into a boolean is necessary to align any non-boolean + # default to the prompt, which is going to be a [y/n]-style confirmation + # because the option is still a boolean flag. That way, instead of [y/n], + # we get [Y/n] or [y/N] depending on the truthy value of the default. + # Refs: https://github.com/pallets/click/pull/3030#discussion_r2289180249 + else: + default = bool(default) + return confirm(self.prompt, default) + + # If show_default is set to True/False, provide this to `prompt` as well. For + # non-bool values of `show_default`, we use `prompt`'s default behavior + prompt_kwargs: t.Any = {} + if isinstance(self.show_default, bool): + prompt_kwargs["show_default"] = self.show_default + + return prompt( + self.prompt, + # Use ``None`` to inform the prompt() function to reiterate until a valid + # value is provided by the user if we have no default. + default=None if default is UNSET else default, + type=self.type, + hide_input=self.hide_input, + show_choices=self.show_choices, + confirmation_prompt=self.confirmation_prompt, + value_proc=lambda x: self.process_value(ctx, x), + **prompt_kwargs, + ) + + def resolve_envvar_value(self, ctx: Context) -> str | None: + """:class:`Option` resolves its environment variable the same way as + :func:`Parameter.resolve_envvar_value`, but it also supports + :attr:`Context.auto_envvar_prefix`. If we could not find an environment from + the :attr:`envvar` property, we fallback on :attr:`Context.auto_envvar_prefix` + to build dynamiccaly the environment variable name using the + :python:`{ctx.auto_envvar_prefix}_{self.name.upper()}` template. + + :meta private: + """ + rv = super().resolve_envvar_value(ctx) + + if rv is not None: + return rv + + if ( + self.allow_from_autoenv + and ctx.auto_envvar_prefix is not None + and self.name is not None + ): + envvar = f"{ctx.auto_envvar_prefix}_{self.name.upper()}" + rv = os.environ.get(envvar) + + if rv: + return rv + + return None + + def value_from_envvar(self, ctx: Context) -> t.Any: + """For :class:`Option`, this method processes the raw environment variable + string the same way as :func:`Parameter.value_from_envvar` does. + + But in the case of non-boolean flags, the value is analyzed to determine if the + flag is activated or not, and returns a boolean of its activation, or the + :attr:`flag_value` if the latter is set. + + This method also takes care of repeated options (i.e. options with + :attr:`multiple` set to ``True``). + + :meta private: + """ + rv = self.resolve_envvar_value(ctx) + + # Absent environment variable or an empty string is interpreted as unset. + if rv is None: + return None + + # Non-boolean flags are more liberal in what they accept. But a flag being a + # flag, its envvar value still needs to be analyzed to determine if the flag is + # activated or not. + if self.is_flag and not self.is_bool_flag: + # If the flag_value is set and match the envvar value, return it + # directly. + if self.flag_value is not UNSET and rv == self.flag_value: + return self.flag_value + # Analyze the envvar value as a boolean to know if the flag is + # activated or not. + return types.BoolParamType.str_to_bool(rv) + + # Split the envvar value if it is allowed to be repeated. + value_depth = (self.nargs != 1) + bool(self.multiple) + if value_depth > 0: + multi_rv = self.type.split_envvar_value(rv) + if self.multiple and self.nargs != 1: + multi_rv = batch(multi_rv, self.nargs) # type: ignore[assignment] + + return multi_rv + + return rv + + def consume_value( + self, ctx: Context, opts: cabc.Mapping[str, Parameter] + ) -> tuple[t.Any, ParameterSource]: + """For :class:`Option`, the value can be collected from an interactive prompt + if the option is a flag that needs a value (and the :attr:`prompt` property is + set). + + Additionally, this method handles flag option that are activated without a + value, in which case the :attr:`flag_value` is returned. + + :meta private: + """ + value, source = super().consume_value(ctx, opts) + + # The parser will emit a sentinel value if the option is allowed to as a flag + # without a value. + if value is FLAG_NEEDS_VALUE: + # If the option allows for a prompt, we start an interaction with the user. + if self.prompt is not None and not ctx.resilient_parsing: + value = self.prompt_for_value(ctx) + source = ParameterSource.PROMPT + # Else the flag takes its flag_value as value. + else: + value = self.flag_value + source = ParameterSource.COMMANDLINE + + # A flag which is activated always returns the flag value, unless the value + # comes from the explicitly sets default. + elif ( + self.is_flag + and value is True + and not self.is_bool_flag + and source not in (ParameterSource.DEFAULT, ParameterSource.DEFAULT_MAP) + ): + value = self.flag_value + + # Re-interpret a multiple option which has been sent as-is by the parser. + # Here we replace each occurrence of value-less flags (marked by the + # FLAG_NEEDS_VALUE sentinel) with the flag_value. + elif ( + self.multiple + and value is not UNSET + and source not in (ParameterSource.DEFAULT, ParameterSource.DEFAULT_MAP) + and any(v is FLAG_NEEDS_VALUE for v in value) + ): + value = [self.flag_value if v is FLAG_NEEDS_VALUE else v for v in value] + source = ParameterSource.COMMANDLINE + + # The value wasn't set, or used the param's default, prompt for one to the user + # if prompting is enabled. + elif ( + ( + value is UNSET + or source in (ParameterSource.DEFAULT, ParameterSource.DEFAULT_MAP) + ) + and self.prompt is not None + and (self.required or self.prompt_required) + and not ctx.resilient_parsing + ): + value = self.prompt_for_value(ctx) + source = ParameterSource.PROMPT + + return value, source + + def process_value(self, ctx: Context, value: t.Any) -> t.Any: + # process_value has to be overridden on Options in order to capture + # `value == UNSET` cases before `type_cast_value()` gets called. + # + # Refs: + # https://github.com/pallets/click/issues/3069 + if self.is_flag and not self.required and self.is_bool_flag and value is UNSET: + value = False + + if self.callback is not None: + value = self.callback(ctx, self, value) + + return value + + # in the normal case, rely on Parameter.process_value + return super().process_value(ctx, value) + + +class Argument(Parameter): + """Arguments are positional parameters to a command. They generally + provide fewer features than options but can have infinite ``nargs`` + and are required by default. + + All parameters are passed onwards to the constructor of :class:`Parameter`. + """ + + param_type_name = "argument" + + def __init__( + self, + param_decls: cabc.Sequence[str], + required: bool | None = None, + **attrs: t.Any, + ) -> None: + # Auto-detect the requirement status of the argument if not explicitly set. + if required is None: + # The argument gets automatically required if it has no explicit default + # value set and is setup to match at least one value. + if attrs.get("default", UNSET) is UNSET: + required = attrs.get("nargs", 1) > 0 + # If the argument has a default value, it is not required. + else: + required = False + + if "multiple" in attrs: + raise TypeError("__init__() got an unexpected keyword argument 'multiple'.") + + super().__init__(param_decls, required=required, **attrs) + + @property + def human_readable_name(self) -> str: + if self.metavar is not None: + return self.metavar + return self.name.upper() # type: ignore + + def make_metavar(self, ctx: Context) -> str: + if self.metavar is not None: + return self.metavar + var = self.type.get_metavar(param=self, ctx=ctx) + if not var: + var = self.name.upper() # type: ignore + if self.deprecated: + var += "!" + if not self.required: + var = f"[{var}]" + if self.nargs != 1: + var += "..." + return var + + def _parse_decls( + self, decls: cabc.Sequence[str], expose_value: bool + ) -> tuple[str | None, list[str], list[str]]: + if not decls: + if not expose_value: + return None, [], [] + raise TypeError("Argument is marked as exposed, but does not have a name.") + if len(decls) == 1: + name = arg = decls[0] + name = name.replace("-", "_").lower() + else: + raise TypeError( + "Arguments take exactly one parameter declaration, got" + f" {len(decls)}: {decls}." + ) + return name, [arg], [] + + def get_usage_pieces(self, ctx: Context) -> list[str]: + return [self.make_metavar(ctx)] + + def get_error_hint(self, ctx: Context) -> str: + return f"'{self.make_metavar(ctx)}'" + + def add_to_parser(self, parser: _OptionParser, ctx: Context) -> None: + parser.add_argument(dest=self.name, nargs=self.nargs, obj=self) + + +def __getattr__(name: str) -> object: + import warnings + + if name == "BaseCommand": + warnings.warn( + "'BaseCommand' is deprecated and will be removed in Click 9.0. Use" + " 'Command' instead.", + DeprecationWarning, + stacklevel=2, + ) + return _BaseCommand + + if name == "MultiCommand": + warnings.warn( + "'MultiCommand' is deprecated and will be removed in Click 9.0. Use" + " 'Group' instead.", + DeprecationWarning, + stacklevel=2, + ) + return _MultiCommand + + raise AttributeError(name) diff --git a/venv/lib/python3.11/site-packages/click/decorators.py b/venv/lib/python3.11/site-packages/click/decorators.py new file mode 100644 index 0000000..21f4c34 --- /dev/null +++ b/venv/lib/python3.11/site-packages/click/decorators.py @@ -0,0 +1,551 @@ +from __future__ import annotations + +import inspect +import typing as t +from functools import update_wrapper +from gettext import gettext as _ + +from .core import Argument +from .core import Command +from .core import Context +from .core import Group +from .core import Option +from .core import Parameter +from .globals import get_current_context +from .utils import echo + +if t.TYPE_CHECKING: + import typing_extensions as te + + P = te.ParamSpec("P") + +R = t.TypeVar("R") +T = t.TypeVar("T") +_AnyCallable = t.Callable[..., t.Any] +FC = t.TypeVar("FC", bound="_AnyCallable | Command") + + +def pass_context(f: t.Callable[te.Concatenate[Context, P], R]) -> t.Callable[P, R]: + """Marks a callback as wanting to receive the current context + object as first argument. + """ + + def new_func(*args: P.args, **kwargs: P.kwargs) -> R: + return f(get_current_context(), *args, **kwargs) + + return update_wrapper(new_func, f) + + +def pass_obj(f: t.Callable[te.Concatenate[T, P], R]) -> t.Callable[P, R]: + """Similar to :func:`pass_context`, but only pass the object on the + context onwards (:attr:`Context.obj`). This is useful if that object + represents the state of a nested system. + """ + + def new_func(*args: P.args, **kwargs: P.kwargs) -> R: + return f(get_current_context().obj, *args, **kwargs) + + return update_wrapper(new_func, f) + + +def make_pass_decorator( + object_type: type[T], ensure: bool = False +) -> t.Callable[[t.Callable[te.Concatenate[T, P], R]], t.Callable[P, R]]: + """Given an object type this creates a decorator that will work + similar to :func:`pass_obj` but instead of passing the object of the + current context, it will find the innermost context of type + :func:`object_type`. + + This generates a decorator that works roughly like this:: + + from functools import update_wrapper + + def decorator(f): + @pass_context + def new_func(ctx, *args, **kwargs): + obj = ctx.find_object(object_type) + return ctx.invoke(f, obj, *args, **kwargs) + return update_wrapper(new_func, f) + return decorator + + :param object_type: the type of the object to pass. + :param ensure: if set to `True`, a new object will be created and + remembered on the context if it's not there yet. + """ + + def decorator(f: t.Callable[te.Concatenate[T, P], R]) -> t.Callable[P, R]: + def new_func(*args: P.args, **kwargs: P.kwargs) -> R: + ctx = get_current_context() + + obj: T | None + if ensure: + obj = ctx.ensure_object(object_type) + else: + obj = ctx.find_object(object_type) + + if obj is None: + raise RuntimeError( + "Managed to invoke callback without a context" + f" object of type {object_type.__name__!r}" + " existing." + ) + + return ctx.invoke(f, obj, *args, **kwargs) + + return update_wrapper(new_func, f) + + return decorator + + +def pass_meta_key( + key: str, *, doc_description: str | None = None +) -> t.Callable[[t.Callable[te.Concatenate[T, P], R]], t.Callable[P, R]]: + """Create a decorator that passes a key from + :attr:`click.Context.meta` as the first argument to the decorated + function. + + :param key: Key in ``Context.meta`` to pass. + :param doc_description: Description of the object being passed, + inserted into the decorator's docstring. Defaults to "the 'key' + key from Context.meta". + + .. versionadded:: 8.0 + """ + + def decorator(f: t.Callable[te.Concatenate[T, P], R]) -> t.Callable[P, R]: + def new_func(*args: P.args, **kwargs: P.kwargs) -> R: + ctx = get_current_context() + obj = ctx.meta[key] + return ctx.invoke(f, obj, *args, **kwargs) + + return update_wrapper(new_func, f) + + if doc_description is None: + doc_description = f"the {key!r} key from :attr:`click.Context.meta`" + + decorator.__doc__ = ( + f"Decorator that passes {doc_description} as the first argument" + " to the decorated function." + ) + return decorator + + +CmdType = t.TypeVar("CmdType", bound=Command) + + +# variant: no call, directly as decorator for a function. +@t.overload +def command(name: _AnyCallable) -> Command: ... + + +# variant: with positional name and with positional or keyword cls argument: +# @command(namearg, CommandCls, ...) or @command(namearg, cls=CommandCls, ...) +@t.overload +def command( + name: str | None, + cls: type[CmdType], + **attrs: t.Any, +) -> t.Callable[[_AnyCallable], CmdType]: ... + + +# variant: name omitted, cls _must_ be a keyword argument, @command(cls=CommandCls, ...) +@t.overload +def command( + name: None = None, + *, + cls: type[CmdType], + **attrs: t.Any, +) -> t.Callable[[_AnyCallable], CmdType]: ... + + +# variant: with optional string name, no cls argument provided. +@t.overload +def command( + name: str | None = ..., cls: None = None, **attrs: t.Any +) -> t.Callable[[_AnyCallable], Command]: ... + + +def command( + name: str | _AnyCallable | None = None, + cls: type[CmdType] | None = None, + **attrs: t.Any, +) -> Command | t.Callable[[_AnyCallable], Command | CmdType]: + r"""Creates a new :class:`Command` and uses the decorated function as + callback. This will also automatically attach all decorated + :func:`option`\s and :func:`argument`\s as parameters to the command. + + The name of the command defaults to the name of the function, converted to + lowercase, with underscores ``_`` replaced by dashes ``-``, and the suffixes + ``_command``, ``_cmd``, ``_group``, and ``_grp`` are removed. For example, + ``init_data_command`` becomes ``init-data``. + + All keyword arguments are forwarded to the underlying command class. + For the ``params`` argument, any decorated params are appended to + the end of the list. + + Once decorated the function turns into a :class:`Command` instance + that can be invoked as a command line utility or be attached to a + command :class:`Group`. + + :param name: The name of the command. Defaults to modifying the function's + name as described above. + :param cls: The command class to create. Defaults to :class:`Command`. + + .. versionchanged:: 8.2 + The suffixes ``_command``, ``_cmd``, ``_group``, and ``_grp`` are + removed when generating the name. + + .. versionchanged:: 8.1 + This decorator can be applied without parentheses. + + .. versionchanged:: 8.1 + The ``params`` argument can be used. Decorated params are + appended to the end of the list. + """ + + func: t.Callable[[_AnyCallable], t.Any] | None = None + + if callable(name): + func = name + name = None + assert cls is None, "Use 'command(cls=cls)(callable)' to specify a class." + assert not attrs, "Use 'command(**kwargs)(callable)' to provide arguments." + + if cls is None: + cls = t.cast("type[CmdType]", Command) + + def decorator(f: _AnyCallable) -> CmdType: + if isinstance(f, Command): + raise TypeError("Attempted to convert a callback into a command twice.") + + attr_params = attrs.pop("params", None) + params = attr_params if attr_params is not None else [] + + try: + decorator_params = f.__click_params__ # type: ignore + except AttributeError: + pass + else: + del f.__click_params__ # type: ignore + params.extend(reversed(decorator_params)) + + if attrs.get("help") is None: + attrs["help"] = f.__doc__ + + if t.TYPE_CHECKING: + assert cls is not None + assert not callable(name) + + if name is not None: + cmd_name = name + else: + cmd_name = f.__name__.lower().replace("_", "-") + cmd_left, sep, suffix = cmd_name.rpartition("-") + + if sep and suffix in {"command", "cmd", "group", "grp"}: + cmd_name = cmd_left + + cmd = cls(name=cmd_name, callback=f, params=params, **attrs) + cmd.__doc__ = f.__doc__ + return cmd + + if func is not None: + return decorator(func) + + return decorator + + +GrpType = t.TypeVar("GrpType", bound=Group) + + +# variant: no call, directly as decorator for a function. +@t.overload +def group(name: _AnyCallable) -> Group: ... + + +# variant: with positional name and with positional or keyword cls argument: +# @group(namearg, GroupCls, ...) or @group(namearg, cls=GroupCls, ...) +@t.overload +def group( + name: str | None, + cls: type[GrpType], + **attrs: t.Any, +) -> t.Callable[[_AnyCallable], GrpType]: ... + + +# variant: name omitted, cls _must_ be a keyword argument, @group(cmd=GroupCls, ...) +@t.overload +def group( + name: None = None, + *, + cls: type[GrpType], + **attrs: t.Any, +) -> t.Callable[[_AnyCallable], GrpType]: ... + + +# variant: with optional string name, no cls argument provided. +@t.overload +def group( + name: str | None = ..., cls: None = None, **attrs: t.Any +) -> t.Callable[[_AnyCallable], Group]: ... + + +def group( + name: str | _AnyCallable | None = None, + cls: type[GrpType] | None = None, + **attrs: t.Any, +) -> Group | t.Callable[[_AnyCallable], Group | GrpType]: + """Creates a new :class:`Group` with a function as callback. This + works otherwise the same as :func:`command` just that the `cls` + parameter is set to :class:`Group`. + + .. versionchanged:: 8.1 + This decorator can be applied without parentheses. + """ + if cls is None: + cls = t.cast("type[GrpType]", Group) + + if callable(name): + return command(cls=cls, **attrs)(name) + + return command(name, cls, **attrs) + + +def _param_memo(f: t.Callable[..., t.Any], param: Parameter) -> None: + if isinstance(f, Command): + f.params.append(param) + else: + if not hasattr(f, "__click_params__"): + f.__click_params__ = [] # type: ignore + + f.__click_params__.append(param) # type: ignore + + +def argument( + *param_decls: str, cls: type[Argument] | None = None, **attrs: t.Any +) -> t.Callable[[FC], FC]: + """Attaches an argument to the command. All positional arguments are + passed as parameter declarations to :class:`Argument`; all keyword + arguments are forwarded unchanged (except ``cls``). + This is equivalent to creating an :class:`Argument` instance manually + and attaching it to the :attr:`Command.params` list. + + For the default argument class, refer to :class:`Argument` and + :class:`Parameter` for descriptions of parameters. + + :param cls: the argument class to instantiate. This defaults to + :class:`Argument`. + :param param_decls: Passed as positional arguments to the constructor of + ``cls``. + :param attrs: Passed as keyword arguments to the constructor of ``cls``. + """ + if cls is None: + cls = Argument + + def decorator(f: FC) -> FC: + _param_memo(f, cls(param_decls, **attrs)) + return f + + return decorator + + +def option( + *param_decls: str, cls: type[Option] | None = None, **attrs: t.Any +) -> t.Callable[[FC], FC]: + """Attaches an option to the command. All positional arguments are + passed as parameter declarations to :class:`Option`; all keyword + arguments are forwarded unchanged (except ``cls``). + This is equivalent to creating an :class:`Option` instance manually + and attaching it to the :attr:`Command.params` list. + + For the default option class, refer to :class:`Option` and + :class:`Parameter` for descriptions of parameters. + + :param cls: the option class to instantiate. This defaults to + :class:`Option`. + :param param_decls: Passed as positional arguments to the constructor of + ``cls``. + :param attrs: Passed as keyword arguments to the constructor of ``cls``. + """ + if cls is None: + cls = Option + + def decorator(f: FC) -> FC: + _param_memo(f, cls(param_decls, **attrs)) + return f + + return decorator + + +def confirmation_option(*param_decls: str, **kwargs: t.Any) -> t.Callable[[FC], FC]: + """Add a ``--yes`` option which shows a prompt before continuing if + not passed. If the prompt is declined, the program will exit. + + :param param_decls: One or more option names. Defaults to the single + value ``"--yes"``. + :param kwargs: Extra arguments are passed to :func:`option`. + """ + + def callback(ctx: Context, param: Parameter, value: bool) -> None: + if not value: + ctx.abort() + + if not param_decls: + param_decls = ("--yes",) + + kwargs.setdefault("is_flag", True) + kwargs.setdefault("callback", callback) + kwargs.setdefault("expose_value", False) + kwargs.setdefault("prompt", "Do you want to continue?") + kwargs.setdefault("help", "Confirm the action without prompting.") + return option(*param_decls, **kwargs) + + +def password_option(*param_decls: str, **kwargs: t.Any) -> t.Callable[[FC], FC]: + """Add a ``--password`` option which prompts for a password, hiding + input and asking to enter the value again for confirmation. + + :param param_decls: One or more option names. Defaults to the single + value ``"--password"``. + :param kwargs: Extra arguments are passed to :func:`option`. + """ + if not param_decls: + param_decls = ("--password",) + + kwargs.setdefault("prompt", True) + kwargs.setdefault("confirmation_prompt", True) + kwargs.setdefault("hide_input", True) + return option(*param_decls, **kwargs) + + +def version_option( + version: str | None = None, + *param_decls: str, + package_name: str | None = None, + prog_name: str | None = None, + message: str | None = None, + **kwargs: t.Any, +) -> t.Callable[[FC], FC]: + """Add a ``--version`` option which immediately prints the version + number and exits the program. + + If ``version`` is not provided, Click will try to detect it using + :func:`importlib.metadata.version` to get the version for the + ``package_name``. + + If ``package_name`` is not provided, Click will try to detect it by + inspecting the stack frames. This will be used to detect the + version, so it must match the name of the installed package. + + :param version: The version number to show. If not provided, Click + will try to detect it. + :param param_decls: One or more option names. Defaults to the single + value ``"--version"``. + :param package_name: The package name to detect the version from. If + not provided, Click will try to detect it. + :param prog_name: The name of the CLI to show in the message. If not + provided, it will be detected from the command. + :param message: The message to show. The values ``%(prog)s``, + ``%(package)s``, and ``%(version)s`` are available. Defaults to + ``"%(prog)s, version %(version)s"``. + :param kwargs: Extra arguments are passed to :func:`option`. + :raise RuntimeError: ``version`` could not be detected. + + .. versionchanged:: 8.0 + Add the ``package_name`` parameter, and the ``%(package)s`` + value for messages. + + .. versionchanged:: 8.0 + Use :mod:`importlib.metadata` instead of ``pkg_resources``. The + version is detected based on the package name, not the entry + point name. The Python package name must match the installed + package name, or be passed with ``package_name=``. + """ + if message is None: + message = _("%(prog)s, version %(version)s") + + if version is None and package_name is None: + frame = inspect.currentframe() + f_back = frame.f_back if frame is not None else None + f_globals = f_back.f_globals if f_back is not None else None + # break reference cycle + # https://docs.python.org/3/library/inspect.html#the-interpreter-stack + del frame + + if f_globals is not None: + package_name = f_globals.get("__name__") + + if package_name == "__main__": + package_name = f_globals.get("__package__") + + if package_name: + package_name = package_name.partition(".")[0] + + def callback(ctx: Context, param: Parameter, value: bool) -> None: + if not value or ctx.resilient_parsing: + return + + nonlocal prog_name + nonlocal version + + if prog_name is None: + prog_name = ctx.find_root().info_name + + if version is None and package_name is not None: + import importlib.metadata + + try: + version = importlib.metadata.version(package_name) + except importlib.metadata.PackageNotFoundError: + raise RuntimeError( + f"{package_name!r} is not installed. Try passing" + " 'package_name' instead." + ) from None + + if version is None: + raise RuntimeError( + f"Could not determine the version for {package_name!r} automatically." + ) + + echo( + message % {"prog": prog_name, "package": package_name, "version": version}, + color=ctx.color, + ) + ctx.exit() + + if not param_decls: + param_decls = ("--version",) + + kwargs.setdefault("is_flag", True) + kwargs.setdefault("expose_value", False) + kwargs.setdefault("is_eager", True) + kwargs.setdefault("help", _("Show the version and exit.")) + kwargs["callback"] = callback + return option(*param_decls, **kwargs) + + +def help_option(*param_decls: str, **kwargs: t.Any) -> t.Callable[[FC], FC]: + """Pre-configured ``--help`` option which immediately prints the help page + and exits the program. + + :param param_decls: One or more option names. Defaults to the single + value ``"--help"``. + :param kwargs: Extra arguments are passed to :func:`option`. + """ + + def show_help(ctx: Context, param: Parameter, value: bool) -> None: + """Callback that print the help page on ```` and exits.""" + if value and not ctx.resilient_parsing: + echo(ctx.get_help(), color=ctx.color) + ctx.exit() + + if not param_decls: + param_decls = ("--help",) + + kwargs.setdefault("is_flag", True) + kwargs.setdefault("expose_value", False) + kwargs.setdefault("is_eager", True) + kwargs.setdefault("help", _("Show this message and exit.")) + kwargs.setdefault("callback", show_help) + + return option(*param_decls, **kwargs) diff --git a/venv/lib/python3.11/site-packages/click/exceptions.py b/venv/lib/python3.11/site-packages/click/exceptions.py new file mode 100644 index 0000000..4d782ee --- /dev/null +++ b/venv/lib/python3.11/site-packages/click/exceptions.py @@ -0,0 +1,308 @@ +from __future__ import annotations + +import collections.abc as cabc +import typing as t +from gettext import gettext as _ +from gettext import ngettext + +from ._compat import get_text_stderr +from .globals import resolve_color_default +from .utils import echo +from .utils import format_filename + +if t.TYPE_CHECKING: + from .core import Command + from .core import Context + from .core import Parameter + + +def _join_param_hints(param_hint: cabc.Sequence[str] | str | None) -> str | None: + if param_hint is not None and not isinstance(param_hint, str): + return " / ".join(repr(x) for x in param_hint) + + return param_hint + + +class ClickException(Exception): + """An exception that Click can handle and show to the user.""" + + #: The exit code for this exception. + exit_code = 1 + + def __init__(self, message: str) -> None: + super().__init__(message) + # The context will be removed by the time we print the message, so cache + # the color settings here to be used later on (in `show`) + self.show_color: bool | None = resolve_color_default() + self.message = message + + def format_message(self) -> str: + return self.message + + def __str__(self) -> str: + return self.message + + def show(self, file: t.IO[t.Any] | None = None) -> None: + if file is None: + file = get_text_stderr() + + echo( + _("Error: {message}").format(message=self.format_message()), + file=file, + color=self.show_color, + ) + + +class UsageError(ClickException): + """An internal exception that signals a usage error. This typically + aborts any further handling. + + :param message: the error message to display. + :param ctx: optionally the context that caused this error. Click will + fill in the context automatically in some situations. + """ + + exit_code = 2 + + def __init__(self, message: str, ctx: Context | None = None) -> None: + super().__init__(message) + self.ctx = ctx + self.cmd: Command | None = self.ctx.command if self.ctx else None + + def show(self, file: t.IO[t.Any] | None = None) -> None: + if file is None: + file = get_text_stderr() + color = None + hint = "" + if ( + self.ctx is not None + and self.ctx.command.get_help_option(self.ctx) is not None + ): + hint = _("Try '{command} {option}' for help.").format( + command=self.ctx.command_path, option=self.ctx.help_option_names[0] + ) + hint = f"{hint}\n" + if self.ctx is not None: + color = self.ctx.color + echo(f"{self.ctx.get_usage()}\n{hint}", file=file, color=color) + echo( + _("Error: {message}").format(message=self.format_message()), + file=file, + color=color, + ) + + +class BadParameter(UsageError): + """An exception that formats out a standardized error message for a + bad parameter. This is useful when thrown from a callback or type as + Click will attach contextual information to it (for instance, which + parameter it is). + + .. versionadded:: 2.0 + + :param param: the parameter object that caused this error. This can + be left out, and Click will attach this info itself + if possible. + :param param_hint: a string that shows up as parameter name. This + can be used as alternative to `param` in cases + where custom validation should happen. If it is + a string it's used as such, if it's a list then + each item is quoted and separated. + """ + + def __init__( + self, + message: str, + ctx: Context | None = None, + param: Parameter | None = None, + param_hint: cabc.Sequence[str] | str | None = None, + ) -> None: + super().__init__(message, ctx) + self.param = param + self.param_hint = param_hint + + def format_message(self) -> str: + if self.param_hint is not None: + param_hint = self.param_hint + elif self.param is not None: + param_hint = self.param.get_error_hint(self.ctx) # type: ignore + else: + return _("Invalid value: {message}").format(message=self.message) + + return _("Invalid value for {param_hint}: {message}").format( + param_hint=_join_param_hints(param_hint), message=self.message + ) + + +class MissingParameter(BadParameter): + """Raised if click required an option or argument but it was not + provided when invoking the script. + + .. versionadded:: 4.0 + + :param param_type: a string that indicates the type of the parameter. + The default is to inherit the parameter type from + the given `param`. Valid values are ``'parameter'``, + ``'option'`` or ``'argument'``. + """ + + def __init__( + self, + message: str | None = None, + ctx: Context | None = None, + param: Parameter | None = None, + param_hint: cabc.Sequence[str] | str | None = None, + param_type: str | None = None, + ) -> None: + super().__init__(message or "", ctx, param, param_hint) + self.param_type = param_type + + def format_message(self) -> str: + if self.param_hint is not None: + param_hint: cabc.Sequence[str] | str | None = self.param_hint + elif self.param is not None: + param_hint = self.param.get_error_hint(self.ctx) # type: ignore + else: + param_hint = None + + param_hint = _join_param_hints(param_hint) + param_hint = f" {param_hint}" if param_hint else "" + + param_type = self.param_type + if param_type is None and self.param is not None: + param_type = self.param.param_type_name + + msg = self.message + if self.param is not None: + msg_extra = self.param.type.get_missing_message( + param=self.param, ctx=self.ctx + ) + if msg_extra: + if msg: + msg += f". {msg_extra}" + else: + msg = msg_extra + + msg = f" {msg}" if msg else "" + + # Translate param_type for known types. + if param_type == "argument": + missing = _("Missing argument") + elif param_type == "option": + missing = _("Missing option") + elif param_type == "parameter": + missing = _("Missing parameter") + else: + missing = _("Missing {param_type}").format(param_type=param_type) + + return f"{missing}{param_hint}.{msg}" + + def __str__(self) -> str: + if not self.message: + param_name = self.param.name if self.param else None + return _("Missing parameter: {param_name}").format(param_name=param_name) + else: + return self.message + + +class NoSuchOption(UsageError): + """Raised if click attempted to handle an option that does not + exist. + + .. versionadded:: 4.0 + """ + + def __init__( + self, + option_name: str, + message: str | None = None, + possibilities: cabc.Sequence[str] | None = None, + ctx: Context | None = None, + ) -> None: + if message is None: + message = _("No such option: {name}").format(name=option_name) + + super().__init__(message, ctx) + self.option_name = option_name + self.possibilities = possibilities + + def format_message(self) -> str: + if not self.possibilities: + return self.message + + possibility_str = ", ".join(sorted(self.possibilities)) + suggest = ngettext( + "Did you mean {possibility}?", + "(Possible options: {possibilities})", + len(self.possibilities), + ).format(possibility=possibility_str, possibilities=possibility_str) + return f"{self.message} {suggest}" + + +class BadOptionUsage(UsageError): + """Raised if an option is generally supplied but the use of the option + was incorrect. This is for instance raised if the number of arguments + for an option is not correct. + + .. versionadded:: 4.0 + + :param option_name: the name of the option being used incorrectly. + """ + + def __init__( + self, option_name: str, message: str, ctx: Context | None = None + ) -> None: + super().__init__(message, ctx) + self.option_name = option_name + + +class BadArgumentUsage(UsageError): + """Raised if an argument is generally supplied but the use of the argument + was incorrect. This is for instance raised if the number of values + for an argument is not correct. + + .. versionadded:: 6.0 + """ + + +class NoArgsIsHelpError(UsageError): + def __init__(self, ctx: Context) -> None: + self.ctx: Context + super().__init__(ctx.get_help(), ctx=ctx) + + def show(self, file: t.IO[t.Any] | None = None) -> None: + echo(self.format_message(), file=file, err=True, color=self.ctx.color) + + +class FileError(ClickException): + """Raised if a file cannot be opened.""" + + def __init__(self, filename: str, hint: str | None = None) -> None: + if hint is None: + hint = _("unknown error") + + super().__init__(hint) + self.ui_filename: str = format_filename(filename) + self.filename = filename + + def format_message(self) -> str: + return _("Could not open file {filename!r}: {message}").format( + filename=self.ui_filename, message=self.message + ) + + +class Abort(RuntimeError): + """An internal signalling exception that signals Click to abort.""" + + +class Exit(RuntimeError): + """An exception that indicates that the application should exit with some + status code. + + :param code: the status code to exit with. + """ + + __slots__ = ("exit_code",) + + def __init__(self, code: int = 0) -> None: + self.exit_code: int = code diff --git a/venv/lib/python3.11/site-packages/click/formatting.py b/venv/lib/python3.11/site-packages/click/formatting.py new file mode 100644 index 0000000..0b64f83 --- /dev/null +++ b/venv/lib/python3.11/site-packages/click/formatting.py @@ -0,0 +1,301 @@ +from __future__ import annotations + +import collections.abc as cabc +from contextlib import contextmanager +from gettext import gettext as _ + +from ._compat import term_len +from .parser import _split_opt + +# Can force a width. This is used by the test system +FORCED_WIDTH: int | None = None + + +def measure_table(rows: cabc.Iterable[tuple[str, str]]) -> tuple[int, ...]: + widths: dict[int, int] = {} + + for row in rows: + for idx, col in enumerate(row): + widths[idx] = max(widths.get(idx, 0), term_len(col)) + + return tuple(y for x, y in sorted(widths.items())) + + +def iter_rows( + rows: cabc.Iterable[tuple[str, str]], col_count: int +) -> cabc.Iterator[tuple[str, ...]]: + for row in rows: + yield row + ("",) * (col_count - len(row)) + + +def wrap_text( + text: str, + width: int = 78, + initial_indent: str = "", + subsequent_indent: str = "", + preserve_paragraphs: bool = False, +) -> str: + """A helper function that intelligently wraps text. By default, it + assumes that it operates on a single paragraph of text but if the + `preserve_paragraphs` parameter is provided it will intelligently + handle paragraphs (defined by two empty lines). + + If paragraphs are handled, a paragraph can be prefixed with an empty + line containing the ``\\b`` character (``\\x08``) to indicate that + no rewrapping should happen in that block. + + :param text: the text that should be rewrapped. + :param width: the maximum width for the text. + :param initial_indent: the initial indent that should be placed on the + first line as a string. + :param subsequent_indent: the indent string that should be placed on + each consecutive line. + :param preserve_paragraphs: if this flag is set then the wrapping will + intelligently handle paragraphs. + """ + from ._textwrap import TextWrapper + + text = text.expandtabs() + wrapper = TextWrapper( + width, + initial_indent=initial_indent, + subsequent_indent=subsequent_indent, + replace_whitespace=False, + ) + if not preserve_paragraphs: + return wrapper.fill(text) + + p: list[tuple[int, bool, str]] = [] + buf: list[str] = [] + indent = None + + def _flush_par() -> None: + if not buf: + return + if buf[0].strip() == "\b": + p.append((indent or 0, True, "\n".join(buf[1:]))) + else: + p.append((indent or 0, False, " ".join(buf))) + del buf[:] + + for line in text.splitlines(): + if not line: + _flush_par() + indent = None + else: + if indent is None: + orig_len = term_len(line) + line = line.lstrip() + indent = orig_len - term_len(line) + buf.append(line) + _flush_par() + + rv = [] + for indent, raw, text in p: + with wrapper.extra_indent(" " * indent): + if raw: + rv.append(wrapper.indent_only(text)) + else: + rv.append(wrapper.fill(text)) + + return "\n\n".join(rv) + + +class HelpFormatter: + """This class helps with formatting text-based help pages. It's + usually just needed for very special internal cases, but it's also + exposed so that developers can write their own fancy outputs. + + At present, it always writes into memory. + + :param indent_increment: the additional increment for each level. + :param width: the width for the text. This defaults to the terminal + width clamped to a maximum of 78. + """ + + def __init__( + self, + indent_increment: int = 2, + width: int | None = None, + max_width: int | None = None, + ) -> None: + self.indent_increment = indent_increment + if max_width is None: + max_width = 80 + if width is None: + import shutil + + width = FORCED_WIDTH + if width is None: + width = max(min(shutil.get_terminal_size().columns, max_width) - 2, 50) + self.width = width + self.current_indent: int = 0 + self.buffer: list[str] = [] + + def write(self, string: str) -> None: + """Writes a unicode string into the internal buffer.""" + self.buffer.append(string) + + def indent(self) -> None: + """Increases the indentation.""" + self.current_indent += self.indent_increment + + def dedent(self) -> None: + """Decreases the indentation.""" + self.current_indent -= self.indent_increment + + def write_usage(self, prog: str, args: str = "", prefix: str | None = None) -> None: + """Writes a usage line into the buffer. + + :param prog: the program name. + :param args: whitespace separated list of arguments. + :param prefix: The prefix for the first line. Defaults to + ``"Usage: "``. + """ + if prefix is None: + prefix = f"{_('Usage:')} " + + usage_prefix = f"{prefix:>{self.current_indent}}{prog} " + text_width = self.width - self.current_indent + + if text_width >= (term_len(usage_prefix) + 20): + # The arguments will fit to the right of the prefix. + indent = " " * term_len(usage_prefix) + self.write( + wrap_text( + args, + text_width, + initial_indent=usage_prefix, + subsequent_indent=indent, + ) + ) + else: + # The prefix is too long, put the arguments on the next line. + self.write(usage_prefix) + self.write("\n") + indent = " " * (max(self.current_indent, term_len(prefix)) + 4) + self.write( + wrap_text( + args, text_width, initial_indent=indent, subsequent_indent=indent + ) + ) + + self.write("\n") + + def write_heading(self, heading: str) -> None: + """Writes a heading into the buffer.""" + self.write(f"{'':>{self.current_indent}}{heading}:\n") + + def write_paragraph(self) -> None: + """Writes a paragraph into the buffer.""" + if self.buffer: + self.write("\n") + + def write_text(self, text: str) -> None: + """Writes re-indented text into the buffer. This rewraps and + preserves paragraphs. + """ + indent = " " * self.current_indent + self.write( + wrap_text( + text, + self.width, + initial_indent=indent, + subsequent_indent=indent, + preserve_paragraphs=True, + ) + ) + self.write("\n") + + def write_dl( + self, + rows: cabc.Sequence[tuple[str, str]], + col_max: int = 30, + col_spacing: int = 2, + ) -> None: + """Writes a definition list into the buffer. This is how options + and commands are usually formatted. + + :param rows: a list of two item tuples for the terms and values. + :param col_max: the maximum width of the first column. + :param col_spacing: the number of spaces between the first and + second column. + """ + rows = list(rows) + widths = measure_table(rows) + if len(widths) != 2: + raise TypeError("Expected two columns for definition list") + + first_col = min(widths[0], col_max) + col_spacing + + for first, second in iter_rows(rows, len(widths)): + self.write(f"{'':>{self.current_indent}}{first}") + if not second: + self.write("\n") + continue + if term_len(first) <= first_col - col_spacing: + self.write(" " * (first_col - term_len(first))) + else: + self.write("\n") + self.write(" " * (first_col + self.current_indent)) + + text_width = max(self.width - first_col - 2, 10) + wrapped_text = wrap_text(second, text_width, preserve_paragraphs=True) + lines = wrapped_text.splitlines() + + if lines: + self.write(f"{lines[0]}\n") + + for line in lines[1:]: + self.write(f"{'':>{first_col + self.current_indent}}{line}\n") + else: + self.write("\n") + + @contextmanager + def section(self, name: str) -> cabc.Iterator[None]: + """Helpful context manager that writes a paragraph, a heading, + and the indents. + + :param name: the section name that is written as heading. + """ + self.write_paragraph() + self.write_heading(name) + self.indent() + try: + yield + finally: + self.dedent() + + @contextmanager + def indentation(self) -> cabc.Iterator[None]: + """A context manager that increases the indentation.""" + self.indent() + try: + yield + finally: + self.dedent() + + def getvalue(self) -> str: + """Returns the buffer contents.""" + return "".join(self.buffer) + + +def join_options(options: cabc.Sequence[str]) -> tuple[str, bool]: + """Given a list of option strings this joins them in the most appropriate + way and returns them in the form ``(formatted_string, + any_prefix_is_slash)`` where the second item in the tuple is a flag that + indicates if any of the option prefixes was a slash. + """ + rv = [] + any_prefix_is_slash = False + + for opt in options: + prefix = _split_opt(opt)[0] + + if prefix == "/": + any_prefix_is_slash = True + + rv.append((len(prefix), opt)) + + rv.sort(key=lambda x: x[0]) + return ", ".join(x[1] for x in rv), any_prefix_is_slash diff --git a/venv/lib/python3.11/site-packages/click/globals.py b/venv/lib/python3.11/site-packages/click/globals.py new file mode 100644 index 0000000..a2f9172 --- /dev/null +++ b/venv/lib/python3.11/site-packages/click/globals.py @@ -0,0 +1,67 @@ +from __future__ import annotations + +import typing as t +from threading import local + +if t.TYPE_CHECKING: + from .core import Context + +_local = local() + + +@t.overload +def get_current_context(silent: t.Literal[False] = False) -> Context: ... + + +@t.overload +def get_current_context(silent: bool = ...) -> Context | None: ... + + +def get_current_context(silent: bool = False) -> Context | None: + """Returns the current click context. This can be used as a way to + access the current context object from anywhere. This is a more implicit + alternative to the :func:`pass_context` decorator. This function is + primarily useful for helpers such as :func:`echo` which might be + interested in changing its behavior based on the current context. + + To push the current context, :meth:`Context.scope` can be used. + + .. versionadded:: 5.0 + + :param silent: if set to `True` the return value is `None` if no context + is available. The default behavior is to raise a + :exc:`RuntimeError`. + """ + try: + return t.cast("Context", _local.stack[-1]) + except (AttributeError, IndexError) as e: + if not silent: + raise RuntimeError("There is no active click context.") from e + + return None + + +def push_context(ctx: Context) -> None: + """Pushes a new context to the current stack.""" + _local.__dict__.setdefault("stack", []).append(ctx) + + +def pop_context() -> None: + """Removes the top level from the stack.""" + _local.stack.pop() + + +def resolve_color_default(color: bool | None = None) -> bool | None: + """Internal helper to get the default value of the color flag. If a + value is passed it's returned unchanged, otherwise it's looked up from + the current context. + """ + if color is not None: + return color + + ctx = get_current_context(silent=True) + + if ctx is not None: + return ctx.color + + return None diff --git a/venv/lib/python3.11/site-packages/click/parser.py b/venv/lib/python3.11/site-packages/click/parser.py new file mode 100644 index 0000000..1ea1f71 --- /dev/null +++ b/venv/lib/python3.11/site-packages/click/parser.py @@ -0,0 +1,532 @@ +""" +This module started out as largely a copy paste from the stdlib's +optparse module with the features removed that we do not need from +optparse because we implement them in Click on a higher level (for +instance type handling, help formatting and a lot more). + +The plan is to remove more and more from here over time. + +The reason this is a different module and not optparse from the stdlib +is that there are differences in 2.x and 3.x about the error messages +generated and optparse in the stdlib uses gettext for no good reason +and might cause us issues. + +Click uses parts of optparse written by Gregory P. Ward and maintained +by the Python Software Foundation. This is limited to code in parser.py. + +Copyright 2001-2006 Gregory P. Ward. All rights reserved. +Copyright 2002-2006 Python Software Foundation. All rights reserved. +""" + +# This code uses parts of optparse written by Gregory P. Ward and +# maintained by the Python Software Foundation. +# Copyright 2001-2006 Gregory P. Ward +# Copyright 2002-2006 Python Software Foundation +from __future__ import annotations + +import collections.abc as cabc +import typing as t +from collections import deque +from gettext import gettext as _ +from gettext import ngettext + +from ._utils import FLAG_NEEDS_VALUE +from ._utils import UNSET +from .exceptions import BadArgumentUsage +from .exceptions import BadOptionUsage +from .exceptions import NoSuchOption +from .exceptions import UsageError + +if t.TYPE_CHECKING: + from ._utils import T_FLAG_NEEDS_VALUE + from ._utils import T_UNSET + from .core import Argument as CoreArgument + from .core import Context + from .core import Option as CoreOption + from .core import Parameter as CoreParameter + +V = t.TypeVar("V") + + +def _unpack_args( + args: cabc.Sequence[str], nargs_spec: cabc.Sequence[int] +) -> tuple[cabc.Sequence[str | cabc.Sequence[str | None] | None], list[str]]: + """Given an iterable of arguments and an iterable of nargs specifications, + it returns a tuple with all the unpacked arguments at the first index + and all remaining arguments as the second. + + The nargs specification is the number of arguments that should be consumed + or `-1` to indicate that this position should eat up all the remainders. + + Missing items are filled with ``UNSET``. + """ + args = deque(args) + nargs_spec = deque(nargs_spec) + rv: list[str | tuple[str | T_UNSET, ...] | T_UNSET] = [] + spos: int | None = None + + def _fetch(c: deque[V]) -> V | T_UNSET: + try: + if spos is None: + return c.popleft() + else: + return c.pop() + except IndexError: + return UNSET + + while nargs_spec: + nargs = _fetch(nargs_spec) + + if nargs is None: + continue + + if nargs == 1: + rv.append(_fetch(args)) # type: ignore[arg-type] + elif nargs > 1: + x = [_fetch(args) for _ in range(nargs)] + + # If we're reversed, we're pulling in the arguments in reverse, + # so we need to turn them around. + if spos is not None: + x.reverse() + + rv.append(tuple(x)) + elif nargs < 0: + if spos is not None: + raise TypeError("Cannot have two nargs < 0") + + spos = len(rv) + rv.append(UNSET) + + # spos is the position of the wildcard (star). If it's not `None`, + # we fill it with the remainder. + if spos is not None: + rv[spos] = tuple(args) + args = [] + rv[spos + 1 :] = reversed(rv[spos + 1 :]) + + return tuple(rv), list(args) + + +def _split_opt(opt: str) -> tuple[str, str]: + first = opt[:1] + if first.isalnum(): + return "", opt + if opt[1:2] == first: + return opt[:2], opt[2:] + return first, opt[1:] + + +def _normalize_opt(opt: str, ctx: Context | None) -> str: + if ctx is None or ctx.token_normalize_func is None: + return opt + prefix, opt = _split_opt(opt) + return f"{prefix}{ctx.token_normalize_func(opt)}" + + +class _Option: + def __init__( + self, + obj: CoreOption, + opts: cabc.Sequence[str], + dest: str | None, + action: str | None = None, + nargs: int = 1, + const: t.Any | None = None, + ): + self._short_opts = [] + self._long_opts = [] + self.prefixes: set[str] = set() + + for opt in opts: + prefix, value = _split_opt(opt) + if not prefix: + raise ValueError(f"Invalid start character for option ({opt})") + self.prefixes.add(prefix[0]) + if len(prefix) == 1 and len(value) == 1: + self._short_opts.append(opt) + else: + self._long_opts.append(opt) + self.prefixes.add(prefix) + + if action is None: + action = "store" + + self.dest = dest + self.action = action + self.nargs = nargs + self.const = const + self.obj = obj + + @property + def takes_value(self) -> bool: + return self.action in ("store", "append") + + def process(self, value: t.Any, state: _ParsingState) -> None: + if self.action == "store": + state.opts[self.dest] = value # type: ignore + elif self.action == "store_const": + state.opts[self.dest] = self.const # type: ignore + elif self.action == "append": + state.opts.setdefault(self.dest, []).append(value) # type: ignore + elif self.action == "append_const": + state.opts.setdefault(self.dest, []).append(self.const) # type: ignore + elif self.action == "count": + state.opts[self.dest] = state.opts.get(self.dest, 0) + 1 # type: ignore + else: + raise ValueError(f"unknown action '{self.action}'") + state.order.append(self.obj) + + +class _Argument: + def __init__(self, obj: CoreArgument, dest: str | None, nargs: int = 1): + self.dest = dest + self.nargs = nargs + self.obj = obj + + def process( + self, + value: str | cabc.Sequence[str | None] | None | T_UNSET, + state: _ParsingState, + ) -> None: + if self.nargs > 1: + assert isinstance(value, cabc.Sequence) + holes = sum(1 for x in value if x is UNSET) + if holes == len(value): + value = UNSET + elif holes != 0: + raise BadArgumentUsage( + _("Argument {name!r} takes {nargs} values.").format( + name=self.dest, nargs=self.nargs + ) + ) + + # We failed to collect any argument value so we consider the argument as unset. + if value == (): + value = UNSET + + state.opts[self.dest] = value # type: ignore + state.order.append(self.obj) + + +class _ParsingState: + def __init__(self, rargs: list[str]) -> None: + self.opts: dict[str, t.Any] = {} + self.largs: list[str] = [] + self.rargs = rargs + self.order: list[CoreParameter] = [] + + +class _OptionParser: + """The option parser is an internal class that is ultimately used to + parse options and arguments. It's modelled after optparse and brings + a similar but vastly simplified API. It should generally not be used + directly as the high level Click classes wrap it for you. + + It's not nearly as extensible as optparse or argparse as it does not + implement features that are implemented on a higher level (such as + types or defaults). + + :param ctx: optionally the :class:`~click.Context` where this parser + should go with. + + .. deprecated:: 8.2 + Will be removed in Click 9.0. + """ + + def __init__(self, ctx: Context | None = None) -> None: + #: The :class:`~click.Context` for this parser. This might be + #: `None` for some advanced use cases. + self.ctx = ctx + #: This controls how the parser deals with interspersed arguments. + #: If this is set to `False`, the parser will stop on the first + #: non-option. Click uses this to implement nested subcommands + #: safely. + self.allow_interspersed_args: bool = True + #: This tells the parser how to deal with unknown options. By + #: default it will error out (which is sensible), but there is a + #: second mode where it will ignore it and continue processing + #: after shifting all the unknown options into the resulting args. + self.ignore_unknown_options: bool = False + + if ctx is not None: + self.allow_interspersed_args = ctx.allow_interspersed_args + self.ignore_unknown_options = ctx.ignore_unknown_options + + self._short_opt: dict[str, _Option] = {} + self._long_opt: dict[str, _Option] = {} + self._opt_prefixes = {"-", "--"} + self._args: list[_Argument] = [] + + def add_option( + self, + obj: CoreOption, + opts: cabc.Sequence[str], + dest: str | None, + action: str | None = None, + nargs: int = 1, + const: t.Any | None = None, + ) -> None: + """Adds a new option named `dest` to the parser. The destination + is not inferred (unlike with optparse) and needs to be explicitly + provided. Action can be any of ``store``, ``store_const``, + ``append``, ``append_const`` or ``count``. + + The `obj` can be used to identify the option in the order list + that is returned from the parser. + """ + opts = [_normalize_opt(opt, self.ctx) for opt in opts] + option = _Option(obj, opts, dest, action=action, nargs=nargs, const=const) + self._opt_prefixes.update(option.prefixes) + for opt in option._short_opts: + self._short_opt[opt] = option + for opt in option._long_opts: + self._long_opt[opt] = option + + def add_argument(self, obj: CoreArgument, dest: str | None, nargs: int = 1) -> None: + """Adds a positional argument named `dest` to the parser. + + The `obj` can be used to identify the option in the order list + that is returned from the parser. + """ + self._args.append(_Argument(obj, dest=dest, nargs=nargs)) + + def parse_args( + self, args: list[str] + ) -> tuple[dict[str, t.Any], list[str], list[CoreParameter]]: + """Parses positional arguments and returns ``(values, args, order)`` + for the parsed options and arguments as well as the leftover + arguments if there are any. The order is a list of objects as they + appear on the command line. If arguments appear multiple times they + will be memorized multiple times as well. + """ + state = _ParsingState(args) + try: + self._process_args_for_options(state) + self._process_args_for_args(state) + except UsageError: + if self.ctx is None or not self.ctx.resilient_parsing: + raise + return state.opts, state.largs, state.order + + def _process_args_for_args(self, state: _ParsingState) -> None: + pargs, args = _unpack_args( + state.largs + state.rargs, [x.nargs for x in self._args] + ) + + for idx, arg in enumerate(self._args): + arg.process(pargs[idx], state) + + state.largs = args + state.rargs = [] + + def _process_args_for_options(self, state: _ParsingState) -> None: + while state.rargs: + arg = state.rargs.pop(0) + arglen = len(arg) + # Double dashes always handled explicitly regardless of what + # prefixes are valid. + if arg == "--": + return + elif arg[:1] in self._opt_prefixes and arglen > 1: + self._process_opts(arg, state) + elif self.allow_interspersed_args: + state.largs.append(arg) + else: + state.rargs.insert(0, arg) + return + + # Say this is the original argument list: + # [arg0, arg1, ..., arg(i-1), arg(i), arg(i+1), ..., arg(N-1)] + # ^ + # (we are about to process arg(i)). + # + # Then rargs is [arg(i), ..., arg(N-1)] and largs is a *subset* of + # [arg0, ..., arg(i-1)] (any options and their arguments will have + # been removed from largs). + # + # The while loop will usually consume 1 or more arguments per pass. + # If it consumes 1 (eg. arg is an option that takes no arguments), + # then after _process_arg() is done the situation is: + # + # largs = subset of [arg0, ..., arg(i)] + # rargs = [arg(i+1), ..., arg(N-1)] + # + # If allow_interspersed_args is false, largs will always be + # *empty* -- still a subset of [arg0, ..., arg(i-1)], but + # not a very interesting subset! + + def _match_long_opt( + self, opt: str, explicit_value: str | None, state: _ParsingState + ) -> None: + if opt not in self._long_opt: + from difflib import get_close_matches + + possibilities = get_close_matches(opt, self._long_opt) + raise NoSuchOption(opt, possibilities=possibilities, ctx=self.ctx) + + option = self._long_opt[opt] + if option.takes_value: + # At this point it's safe to modify rargs by injecting the + # explicit value, because no exception is raised in this + # branch. This means that the inserted value will be fully + # consumed. + if explicit_value is not None: + state.rargs.insert(0, explicit_value) + + value = self._get_value_from_state(opt, option, state) + + elif explicit_value is not None: + raise BadOptionUsage( + opt, _("Option {name!r} does not take a value.").format(name=opt) + ) + + else: + value = UNSET + + option.process(value, state) + + def _match_short_opt(self, arg: str, state: _ParsingState) -> None: + stop = False + i = 1 + prefix = arg[0] + unknown_options = [] + + for ch in arg[1:]: + opt = _normalize_opt(f"{prefix}{ch}", self.ctx) + option = self._short_opt.get(opt) + i += 1 + + if not option: + if self.ignore_unknown_options: + unknown_options.append(ch) + continue + raise NoSuchOption(opt, ctx=self.ctx) + if option.takes_value: + # Any characters left in arg? Pretend they're the + # next arg, and stop consuming characters of arg. + if i < len(arg): + state.rargs.insert(0, arg[i:]) + stop = True + + value = self._get_value_from_state(opt, option, state) + + else: + value = UNSET + + option.process(value, state) + + if stop: + break + + # If we got any unknown options we recombine the string of the + # remaining options and re-attach the prefix, then report that + # to the state as new larg. This way there is basic combinatorics + # that can be achieved while still ignoring unknown arguments. + if self.ignore_unknown_options and unknown_options: + state.largs.append(f"{prefix}{''.join(unknown_options)}") + + def _get_value_from_state( + self, option_name: str, option: _Option, state: _ParsingState + ) -> str | cabc.Sequence[str] | T_FLAG_NEEDS_VALUE: + nargs = option.nargs + + value: str | cabc.Sequence[str] | T_FLAG_NEEDS_VALUE + + if len(state.rargs) < nargs: + if option.obj._flag_needs_value: + # Option allows omitting the value. + value = FLAG_NEEDS_VALUE + else: + raise BadOptionUsage( + option_name, + ngettext( + "Option {name!r} requires an argument.", + "Option {name!r} requires {nargs} arguments.", + nargs, + ).format(name=option_name, nargs=nargs), + ) + elif nargs == 1: + next_rarg = state.rargs[0] + + if ( + option.obj._flag_needs_value + and isinstance(next_rarg, str) + and next_rarg[:1] in self._opt_prefixes + and len(next_rarg) > 1 + ): + # The next arg looks like the start of an option, don't + # use it as the value if omitting the value is allowed. + value = FLAG_NEEDS_VALUE + else: + value = state.rargs.pop(0) + else: + value = tuple(state.rargs[:nargs]) + del state.rargs[:nargs] + + return value + + def _process_opts(self, arg: str, state: _ParsingState) -> None: + explicit_value = None + # Long option handling happens in two parts. The first part is + # supporting explicitly attached values. In any case, we will try + # to long match the option first. + if "=" in arg: + long_opt, explicit_value = arg.split("=", 1) + else: + long_opt = arg + norm_long_opt = _normalize_opt(long_opt, self.ctx) + + # At this point we will match the (assumed) long option through + # the long option matching code. Note that this allows options + # like "-foo" to be matched as long options. + try: + self._match_long_opt(norm_long_opt, explicit_value, state) + except NoSuchOption: + # At this point the long option matching failed, and we need + # to try with short options. However there is a special rule + # which says, that if we have a two character options prefix + # (applies to "--foo" for instance), we do not dispatch to the + # short option code and will instead raise the no option + # error. + if arg[:2] not in self._opt_prefixes: + self._match_short_opt(arg, state) + return + + if not self.ignore_unknown_options: + raise + + state.largs.append(arg) + + +def __getattr__(name: str) -> object: + import warnings + + if name in { + "OptionParser", + "Argument", + "Option", + "split_opt", + "normalize_opt", + "ParsingState", + }: + warnings.warn( + f"'parser.{name}' is deprecated and will be removed in Click 9.0." + " The old parser is available in 'optparse'.", + DeprecationWarning, + stacklevel=2, + ) + return globals()[f"_{name}"] + + if name == "split_arg_string": + from .shell_completion import split_arg_string + + warnings.warn( + "Importing 'parser.split_arg_string' is deprecated, it will only be" + " available in 'shell_completion' in Click 9.0.", + DeprecationWarning, + stacklevel=2, + ) + return split_arg_string + + raise AttributeError(name) diff --git a/venv/lib/python3.11/site-packages/click/py.typed b/venv/lib/python3.11/site-packages/click/py.typed new file mode 100644 index 0000000..e69de29 diff --git a/venv/lib/python3.11/site-packages/click/shell_completion.py b/venv/lib/python3.11/site-packages/click/shell_completion.py new file mode 100644 index 0000000..8f1564c --- /dev/null +++ b/venv/lib/python3.11/site-packages/click/shell_completion.py @@ -0,0 +1,667 @@ +from __future__ import annotations + +import collections.abc as cabc +import os +import re +import typing as t +from gettext import gettext as _ + +from .core import Argument +from .core import Command +from .core import Context +from .core import Group +from .core import Option +from .core import Parameter +from .core import ParameterSource +from .utils import echo + + +def shell_complete( + cli: Command, + ctx_args: cabc.MutableMapping[str, t.Any], + prog_name: str, + complete_var: str, + instruction: str, +) -> int: + """Perform shell completion for the given CLI program. + + :param cli: Command being called. + :param ctx_args: Extra arguments to pass to + ``cli.make_context``. + :param prog_name: Name of the executable in the shell. + :param complete_var: Name of the environment variable that holds + the completion instruction. + :param instruction: Value of ``complete_var`` with the completion + instruction and shell, in the form ``instruction_shell``. + :return: Status code to exit with. + """ + shell, _, instruction = instruction.partition("_") + comp_cls = get_completion_class(shell) + + if comp_cls is None: + return 1 + + comp = comp_cls(cli, ctx_args, prog_name, complete_var) + + if instruction == "source": + echo(comp.source()) + return 0 + + if instruction == "complete": + echo(comp.complete()) + return 0 + + return 1 + + +class CompletionItem: + """Represents a completion value and metadata about the value. The + default metadata is ``type`` to indicate special shell handling, + and ``help`` if a shell supports showing a help string next to the + value. + + Arbitrary parameters can be passed when creating the object, and + accessed using ``item.attr``. If an attribute wasn't passed, + accessing it returns ``None``. + + :param value: The completion suggestion. + :param type: Tells the shell script to provide special completion + support for the type. Click uses ``"dir"`` and ``"file"``. + :param help: String shown next to the value if supported. + :param kwargs: Arbitrary metadata. The built-in implementations + don't use this, but custom type completions paired with custom + shell support could use it. + """ + + __slots__ = ("value", "type", "help", "_info") + + def __init__( + self, + value: t.Any, + type: str = "plain", + help: str | None = None, + **kwargs: t.Any, + ) -> None: + self.value: t.Any = value + self.type: str = type + self.help: str | None = help + self._info = kwargs + + def __getattr__(self, name: str) -> t.Any: + return self._info.get(name) + + +# Only Bash >= 4.4 has the nosort option. +_SOURCE_BASH = """\ +%(complete_func)s() { + local IFS=$'\\n' + local response + + response=$(env COMP_WORDS="${COMP_WORDS[*]}" COMP_CWORD=$COMP_CWORD \ +%(complete_var)s=bash_complete $1) + + for completion in $response; do + IFS=',' read type value <<< "$completion" + + if [[ $type == 'dir' ]]; then + COMPREPLY=() + compopt -o dirnames + elif [[ $type == 'file' ]]; then + COMPREPLY=() + compopt -o default + elif [[ $type == 'plain' ]]; then + COMPREPLY+=($value) + fi + done + + return 0 +} + +%(complete_func)s_setup() { + complete -o nosort -F %(complete_func)s %(prog_name)s +} + +%(complete_func)s_setup; +""" + +# See ZshComplete.format_completion below, and issue #2703, before +# changing this script. +# +# (TL;DR: _describe is picky about the format, but this Zsh script snippet +# is already widely deployed. So freeze this script, and use clever-ish +# handling of colons in ZshComplet.format_completion.) +_SOURCE_ZSH = """\ +#compdef %(prog_name)s + +%(complete_func)s() { + local -a completions + local -a completions_with_descriptions + local -a response + (( ! $+commands[%(prog_name)s] )) && return 1 + + response=("${(@f)$(env COMP_WORDS="${words[*]}" COMP_CWORD=$((CURRENT-1)) \ +%(complete_var)s=zsh_complete %(prog_name)s)}") + + for type key descr in ${response}; do + if [[ "$type" == "plain" ]]; then + if [[ "$descr" == "_" ]]; then + completions+=("$key") + else + completions_with_descriptions+=("$key":"$descr") + fi + elif [[ "$type" == "dir" ]]; then + _path_files -/ + elif [[ "$type" == "file" ]]; then + _path_files -f + fi + done + + if [ -n "$completions_with_descriptions" ]; then + _describe -V unsorted completions_with_descriptions -U + fi + + if [ -n "$completions" ]; then + compadd -U -V unsorted -a completions + fi +} + +if [[ $zsh_eval_context[-1] == loadautofunc ]]; then + # autoload from fpath, call function directly + %(complete_func)s "$@" +else + # eval/source/. command, register function for later + compdef %(complete_func)s %(prog_name)s +fi +""" + +_SOURCE_FISH = """\ +function %(complete_func)s; + set -l response (env %(complete_var)s=fish_complete COMP_WORDS=(commandline -cp) \ +COMP_CWORD=(commandline -t) %(prog_name)s); + + for completion in $response; + set -l metadata (string split "," $completion); + + if test $metadata[1] = "dir"; + __fish_complete_directories $metadata[2]; + else if test $metadata[1] = "file"; + __fish_complete_path $metadata[2]; + else if test $metadata[1] = "plain"; + echo $metadata[2]; + end; + end; +end; + +complete --no-files --command %(prog_name)s --arguments \ +"(%(complete_func)s)"; +""" + + +class ShellComplete: + """Base class for providing shell completion support. A subclass for + a given shell will override attributes and methods to implement the + completion instructions (``source`` and ``complete``). + + :param cli: Command being called. + :param prog_name: Name of the executable in the shell. + :param complete_var: Name of the environment variable that holds + the completion instruction. + + .. versionadded:: 8.0 + """ + + name: t.ClassVar[str] + """Name to register the shell as with :func:`add_completion_class`. + This is used in completion instructions (``{name}_source`` and + ``{name}_complete``). + """ + + source_template: t.ClassVar[str] + """Completion script template formatted by :meth:`source`. This must + be provided by subclasses. + """ + + def __init__( + self, + cli: Command, + ctx_args: cabc.MutableMapping[str, t.Any], + prog_name: str, + complete_var: str, + ) -> None: + self.cli = cli + self.ctx_args = ctx_args + self.prog_name = prog_name + self.complete_var = complete_var + + @property + def func_name(self) -> str: + """The name of the shell function defined by the completion + script. + """ + safe_name = re.sub(r"\W*", "", self.prog_name.replace("-", "_"), flags=re.ASCII) + return f"_{safe_name}_completion" + + def source_vars(self) -> dict[str, t.Any]: + """Vars for formatting :attr:`source_template`. + + By default this provides ``complete_func``, ``complete_var``, + and ``prog_name``. + """ + return { + "complete_func": self.func_name, + "complete_var": self.complete_var, + "prog_name": self.prog_name, + } + + def source(self) -> str: + """Produce the shell script that defines the completion + function. By default this ``%``-style formats + :attr:`source_template` with the dict returned by + :meth:`source_vars`. + """ + return self.source_template % self.source_vars() + + def get_completion_args(self) -> tuple[list[str], str]: + """Use the env vars defined by the shell script to return a + tuple of ``args, incomplete``. This must be implemented by + subclasses. + """ + raise NotImplementedError + + def get_completions(self, args: list[str], incomplete: str) -> list[CompletionItem]: + """Determine the context and last complete command or parameter + from the complete args. Call that object's ``shell_complete`` + method to get the completions for the incomplete value. + + :param args: List of complete args before the incomplete value. + :param incomplete: Value being completed. May be empty. + """ + ctx = _resolve_context(self.cli, self.ctx_args, self.prog_name, args) + obj, incomplete = _resolve_incomplete(ctx, args, incomplete) + return obj.shell_complete(ctx, incomplete) + + def format_completion(self, item: CompletionItem) -> str: + """Format a completion item into the form recognized by the + shell script. This must be implemented by subclasses. + + :param item: Completion item to format. + """ + raise NotImplementedError + + def complete(self) -> str: + """Produce the completion data to send back to the shell. + + By default this calls :meth:`get_completion_args`, gets the + completions, then calls :meth:`format_completion` for each + completion. + """ + args, incomplete = self.get_completion_args() + completions = self.get_completions(args, incomplete) + out = [self.format_completion(item) for item in completions] + return "\n".join(out) + + +class BashComplete(ShellComplete): + """Shell completion for Bash.""" + + name = "bash" + source_template = _SOURCE_BASH + + @staticmethod + def _check_version() -> None: + import shutil + import subprocess + + bash_exe = shutil.which("bash") + + if bash_exe is None: + match = None + else: + output = subprocess.run( + [bash_exe, "--norc", "-c", 'echo "${BASH_VERSION}"'], + stdout=subprocess.PIPE, + ) + match = re.search(r"^(\d+)\.(\d+)\.\d+", output.stdout.decode()) + + if match is not None: + major, minor = match.groups() + + if major < "4" or major == "4" and minor < "4": + echo( + _( + "Shell completion is not supported for Bash" + " versions older than 4.4." + ), + err=True, + ) + else: + echo( + _("Couldn't detect Bash version, shell completion is not supported."), + err=True, + ) + + def source(self) -> str: + self._check_version() + return super().source() + + def get_completion_args(self) -> tuple[list[str], str]: + cwords = split_arg_string(os.environ["COMP_WORDS"]) + cword = int(os.environ["COMP_CWORD"]) + args = cwords[1:cword] + + try: + incomplete = cwords[cword] + except IndexError: + incomplete = "" + + return args, incomplete + + def format_completion(self, item: CompletionItem) -> str: + return f"{item.type},{item.value}" + + +class ZshComplete(ShellComplete): + """Shell completion for Zsh.""" + + name = "zsh" + source_template = _SOURCE_ZSH + + def get_completion_args(self) -> tuple[list[str], str]: + cwords = split_arg_string(os.environ["COMP_WORDS"]) + cword = int(os.environ["COMP_CWORD"]) + args = cwords[1:cword] + + try: + incomplete = cwords[cword] + except IndexError: + incomplete = "" + + return args, incomplete + + def format_completion(self, item: CompletionItem) -> str: + help_ = item.help or "_" + # The zsh completion script uses `_describe` on items with help + # texts (which splits the item help from the item value at the + # first unescaped colon) and `compadd` on items without help + # text (which uses the item value as-is and does not support + # colon escaping). So escape colons in the item value if and + # only if the item help is not the sentinel "_" value, as used + # by the completion script. + # + # (The zsh completion script is potentially widely deployed, and + # thus harder to fix than this method.) + # + # See issue #1812 and issue #2703 for further context. + value = item.value.replace(":", r"\:") if help_ != "_" else item.value + return f"{item.type}\n{value}\n{help_}" + + +class FishComplete(ShellComplete): + """Shell completion for Fish.""" + + name = "fish" + source_template = _SOURCE_FISH + + def get_completion_args(self) -> tuple[list[str], str]: + cwords = split_arg_string(os.environ["COMP_WORDS"]) + incomplete = os.environ["COMP_CWORD"] + if incomplete: + incomplete = split_arg_string(incomplete)[0] + args = cwords[1:] + + # Fish stores the partial word in both COMP_WORDS and + # COMP_CWORD, remove it from complete args. + if incomplete and args and args[-1] == incomplete: + args.pop() + + return args, incomplete + + def format_completion(self, item: CompletionItem) -> str: + if item.help: + return f"{item.type},{item.value}\t{item.help}" + + return f"{item.type},{item.value}" + + +ShellCompleteType = t.TypeVar("ShellCompleteType", bound="type[ShellComplete]") + + +_available_shells: dict[str, type[ShellComplete]] = { + "bash": BashComplete, + "fish": FishComplete, + "zsh": ZshComplete, +} + + +def add_completion_class( + cls: ShellCompleteType, name: str | None = None +) -> ShellCompleteType: + """Register a :class:`ShellComplete` subclass under the given name. + The name will be provided by the completion instruction environment + variable during completion. + + :param cls: The completion class that will handle completion for the + shell. + :param name: Name to register the class under. Defaults to the + class's ``name`` attribute. + """ + if name is None: + name = cls.name + + _available_shells[name] = cls + + return cls + + +def get_completion_class(shell: str) -> type[ShellComplete] | None: + """Look up a registered :class:`ShellComplete` subclass by the name + provided by the completion instruction environment variable. If the + name isn't registered, returns ``None``. + + :param shell: Name the class is registered under. + """ + return _available_shells.get(shell) + + +def split_arg_string(string: str) -> list[str]: + """Split an argument string as with :func:`shlex.split`, but don't + fail if the string is incomplete. Ignores a missing closing quote or + incomplete escape sequence and uses the partial token as-is. + + .. code-block:: python + + split_arg_string("example 'my file") + ["example", "my file"] + + split_arg_string("example my\\") + ["example", "my"] + + :param string: String to split. + + .. versionchanged:: 8.2 + Moved to ``shell_completion`` from ``parser``. + """ + import shlex + + lex = shlex.shlex(string, posix=True) + lex.whitespace_split = True + lex.commenters = "" + out = [] + + try: + for token in lex: + out.append(token) + except ValueError: + # Raised when end-of-string is reached in an invalid state. Use + # the partial token as-is. The quote or escape character is in + # lex.state, not lex.token. + out.append(lex.token) + + return out + + +def _is_incomplete_argument(ctx: Context, param: Parameter) -> bool: + """Determine if the given parameter is an argument that can still + accept values. + + :param ctx: Invocation context for the command represented by the + parsed complete args. + :param param: Argument object being checked. + """ + if not isinstance(param, Argument): + return False + + assert param.name is not None + # Will be None if expose_value is False. + value = ctx.params.get(param.name) + return ( + param.nargs == -1 + or ctx.get_parameter_source(param.name) is not ParameterSource.COMMANDLINE + or ( + param.nargs > 1 + and isinstance(value, (tuple, list)) + and len(value) < param.nargs + ) + ) + + +def _start_of_option(ctx: Context, value: str) -> bool: + """Check if the value looks like the start of an option.""" + if not value: + return False + + c = value[0] + return c in ctx._opt_prefixes + + +def _is_incomplete_option(ctx: Context, args: list[str], param: Parameter) -> bool: + """Determine if the given parameter is an option that needs a value. + + :param args: List of complete args before the incomplete value. + :param param: Option object being checked. + """ + if not isinstance(param, Option): + return False + + if param.is_flag or param.count: + return False + + last_option = None + + for index, arg in enumerate(reversed(args)): + if index + 1 > param.nargs: + break + + if _start_of_option(ctx, arg): + last_option = arg + break + + return last_option is not None and last_option in param.opts + + +def _resolve_context( + cli: Command, + ctx_args: cabc.MutableMapping[str, t.Any], + prog_name: str, + args: list[str], +) -> Context: + """Produce the context hierarchy starting with the command and + traversing the complete arguments. This only follows the commands, + it doesn't trigger input prompts or callbacks. + + :param cli: Command being called. + :param prog_name: Name of the executable in the shell. + :param args: List of complete args before the incomplete value. + """ + ctx_args["resilient_parsing"] = True + with cli.make_context(prog_name, args.copy(), **ctx_args) as ctx: + args = ctx._protected_args + ctx.args + + while args: + command = ctx.command + + if isinstance(command, Group): + if not command.chain: + name, cmd, args = command.resolve_command(ctx, args) + + if cmd is None: + return ctx + + with cmd.make_context( + name, args, parent=ctx, resilient_parsing=True + ) as sub_ctx: + ctx = sub_ctx + args = ctx._protected_args + ctx.args + else: + sub_ctx = ctx + + while args: + name, cmd, args = command.resolve_command(ctx, args) + + if cmd is None: + return ctx + + with cmd.make_context( + name, + args, + parent=ctx, + allow_extra_args=True, + allow_interspersed_args=False, + resilient_parsing=True, + ) as sub_sub_ctx: + sub_ctx = sub_sub_ctx + args = sub_ctx.args + + ctx = sub_ctx + args = [*sub_ctx._protected_args, *sub_ctx.args] + else: + break + + return ctx + + +def _resolve_incomplete( + ctx: Context, args: list[str], incomplete: str +) -> tuple[Command | Parameter, str]: + """Find the Click object that will handle the completion of the + incomplete value. Return the object and the incomplete value. + + :param ctx: Invocation context for the command represented by + the parsed complete args. + :param args: List of complete args before the incomplete value. + :param incomplete: Value being completed. May be empty. + """ + # Different shells treat an "=" between a long option name and + # value differently. Might keep the value joined, return the "=" + # as a separate item, or return the split name and value. Always + # split and discard the "=" to make completion easier. + if incomplete == "=": + incomplete = "" + elif "=" in incomplete and _start_of_option(ctx, incomplete): + name, _, incomplete = incomplete.partition("=") + args.append(name) + + # The "--" marker tells Click to stop treating values as options + # even if they start with the option character. If it hasn't been + # given and the incomplete arg looks like an option, the current + # command will provide option name completions. + if "--" not in args and _start_of_option(ctx, incomplete): + return ctx.command, incomplete + + params = ctx.command.get_params(ctx) + + # If the last complete arg is an option name with an incomplete + # value, the option will provide value completions. + for param in params: + if _is_incomplete_option(ctx, args, param): + return param, incomplete + + # It's not an option name or value. The first argument without a + # parsed value will provide value completions. + for param in params: + if _is_incomplete_argument(ctx, param): + return param, incomplete + + # There were no unparsed arguments, the command may be a group that + # will provide command name completions. + return ctx.command, incomplete diff --git a/venv/lib/python3.11/site-packages/click/termui.py b/venv/lib/python3.11/site-packages/click/termui.py new file mode 100644 index 0000000..2e98a07 --- /dev/null +++ b/venv/lib/python3.11/site-packages/click/termui.py @@ -0,0 +1,883 @@ +from __future__ import annotations + +import collections.abc as cabc +import inspect +import io +import itertools +import sys +import typing as t +from contextlib import AbstractContextManager +from gettext import gettext as _ + +from ._compat import isatty +from ._compat import strip_ansi +from .exceptions import Abort +from .exceptions import UsageError +from .globals import resolve_color_default +from .types import Choice +from .types import convert_type +from .types import ParamType +from .utils import echo +from .utils import LazyFile + +if t.TYPE_CHECKING: + from ._termui_impl import ProgressBar + +V = t.TypeVar("V") + +# The prompt functions to use. The doc tools currently override these +# functions to customize how they work. +visible_prompt_func: t.Callable[[str], str] = input + +_ansi_colors = { + "black": 30, + "red": 31, + "green": 32, + "yellow": 33, + "blue": 34, + "magenta": 35, + "cyan": 36, + "white": 37, + "reset": 39, + "bright_black": 90, + "bright_red": 91, + "bright_green": 92, + "bright_yellow": 93, + "bright_blue": 94, + "bright_magenta": 95, + "bright_cyan": 96, + "bright_white": 97, +} +_ansi_reset_all = "\033[0m" + + +def hidden_prompt_func(prompt: str) -> str: + import getpass + + return getpass.getpass(prompt) + + +def _build_prompt( + text: str, + suffix: str, + show_default: bool = False, + default: t.Any | None = None, + show_choices: bool = True, + type: ParamType | None = None, +) -> str: + prompt = text + if type is not None and show_choices and isinstance(type, Choice): + prompt += f" ({', '.join(map(str, type.choices))})" + if default is not None and show_default: + prompt = f"{prompt} [{_format_default(default)}]" + return f"{prompt}{suffix}" + + +def _format_default(default: t.Any) -> t.Any: + if isinstance(default, (io.IOBase, LazyFile)) and hasattr(default, "name"): + return default.name + + return default + + +def prompt( + text: str, + default: t.Any | None = None, + hide_input: bool = False, + confirmation_prompt: bool | str = False, + type: ParamType | t.Any | None = None, + value_proc: t.Callable[[str], t.Any] | None = None, + prompt_suffix: str = ": ", + show_default: bool = True, + err: bool = False, + show_choices: bool = True, +) -> t.Any: + """Prompts a user for input. This is a convenience function that can + be used to prompt a user for input later. + + If the user aborts the input by sending an interrupt signal, this + function will catch it and raise a :exc:`Abort` exception. + + :param text: the text to show for the prompt. + :param default: the default value to use if no input happens. If this + is not given it will prompt until it's aborted. + :param hide_input: if this is set to true then the input value will + be hidden. + :param confirmation_prompt: Prompt a second time to confirm the + value. Can be set to a string instead of ``True`` to customize + the message. + :param type: the type to use to check the value against. + :param value_proc: if this parameter is provided it's a function that + is invoked instead of the type conversion to + convert a value. + :param prompt_suffix: a suffix that should be added to the prompt. + :param show_default: shows or hides the default value in the prompt. + :param err: if set to true the file defaults to ``stderr`` instead of + ``stdout``, the same as with echo. + :param show_choices: Show or hide choices if the passed type is a Choice. + For example if type is a Choice of either day or week, + show_choices is true and text is "Group by" then the + prompt will be "Group by (day, week): ". + + .. versionchanged:: 8.3.1 + A space is no longer appended to the prompt. + + .. versionadded:: 8.0 + ``confirmation_prompt`` can be a custom string. + + .. versionadded:: 7.0 + Added the ``show_choices`` parameter. + + .. versionadded:: 6.0 + Added unicode support for cmd.exe on Windows. + + .. versionadded:: 4.0 + Added the `err` parameter. + + """ + + def prompt_func(text: str) -> str: + f = hidden_prompt_func if hide_input else visible_prompt_func + try: + # Write the prompt separately so that we get nice + # coloring through colorama on Windows + echo(text[:-1], nl=False, err=err) + # Echo the last character to stdout to work around an issue where + # readline causes backspace to clear the whole line. + return f(text[-1:]) + except (KeyboardInterrupt, EOFError): + # getpass doesn't print a newline if the user aborts input with ^C. + # Allegedly this behavior is inherited from getpass(3). + # A doc bug has been filed at https://bugs.python.org/issue24711 + if hide_input: + echo(None, err=err) + raise Abort() from None + + if value_proc is None: + value_proc = convert_type(type, default) + + prompt = _build_prompt( + text, prompt_suffix, show_default, default, show_choices, type + ) + + if confirmation_prompt: + if confirmation_prompt is True: + confirmation_prompt = _("Repeat for confirmation") + + confirmation_prompt = _build_prompt(confirmation_prompt, prompt_suffix) + + while True: + while True: + value = prompt_func(prompt) + if value: + break + elif default is not None: + value = default + break + try: + result = value_proc(value) + except UsageError as e: + if hide_input: + echo(_("Error: The value you entered was invalid."), err=err) + else: + echo(_("Error: {e.message}").format(e=e), err=err) + continue + if not confirmation_prompt: + return result + while True: + value2 = prompt_func(confirmation_prompt) + is_empty = not value and not value2 + if value2 or is_empty: + break + if value == value2: + return result + echo(_("Error: The two entered values do not match."), err=err) + + +def confirm( + text: str, + default: bool | None = False, + abort: bool = False, + prompt_suffix: str = ": ", + show_default: bool = True, + err: bool = False, +) -> bool: + """Prompts for confirmation (yes/no question). + + If the user aborts the input by sending a interrupt signal this + function will catch it and raise a :exc:`Abort` exception. + + :param text: the question to ask. + :param default: The default value to use when no input is given. If + ``None``, repeat until input is given. + :param abort: if this is set to `True` a negative answer aborts the + exception by raising :exc:`Abort`. + :param prompt_suffix: a suffix that should be added to the prompt. + :param show_default: shows or hides the default value in the prompt. + :param err: if set to true the file defaults to ``stderr`` instead of + ``stdout``, the same as with echo. + + .. versionchanged:: 8.3.1 + A space is no longer appended to the prompt. + + .. versionchanged:: 8.0 + Repeat until input is given if ``default`` is ``None``. + + .. versionadded:: 4.0 + Added the ``err`` parameter. + """ + prompt = _build_prompt( + text, + prompt_suffix, + show_default, + "y/n" if default is None else ("Y/n" if default else "y/N"), + ) + + while True: + try: + # Write the prompt separately so that we get nice + # coloring through colorama on Windows + echo(prompt[:-1], nl=False, err=err) + # Echo the last character to stdout to work around an issue where + # readline causes backspace to clear the whole line. + value = visible_prompt_func(prompt[-1:]).lower().strip() + except (KeyboardInterrupt, EOFError): + raise Abort() from None + if value in ("y", "yes"): + rv = True + elif value in ("n", "no"): + rv = False + elif default is not None and value == "": + rv = default + else: + echo(_("Error: invalid input"), err=err) + continue + break + if abort and not rv: + raise Abort() + return rv + + +def echo_via_pager( + text_or_generator: cabc.Iterable[str] | t.Callable[[], cabc.Iterable[str]] | str, + color: bool | None = None, +) -> None: + """This function takes a text and shows it via an environment specific + pager on stdout. + + .. versionchanged:: 3.0 + Added the `color` flag. + + :param text_or_generator: the text to page, or alternatively, a + generator emitting the text to page. + :param color: controls if the pager supports ANSI colors or not. The + default is autodetection. + """ + color = resolve_color_default(color) + + if inspect.isgeneratorfunction(text_or_generator): + i = t.cast("t.Callable[[], cabc.Iterable[str]]", text_or_generator)() + elif isinstance(text_or_generator, str): + i = [text_or_generator] + else: + i = iter(t.cast("cabc.Iterable[str]", text_or_generator)) + + # convert every element of i to a text type if necessary + text_generator = (el if isinstance(el, str) else str(el) for el in i) + + from ._termui_impl import pager + + return pager(itertools.chain(text_generator, "\n"), color) + + +@t.overload +def progressbar( + *, + length: int, + label: str | None = None, + hidden: bool = False, + show_eta: bool = True, + show_percent: bool | None = None, + show_pos: bool = False, + fill_char: str = "#", + empty_char: str = "-", + bar_template: str = "%(label)s [%(bar)s] %(info)s", + info_sep: str = " ", + width: int = 36, + file: t.TextIO | None = None, + color: bool | None = None, + update_min_steps: int = 1, +) -> ProgressBar[int]: ... + + +@t.overload +def progressbar( + iterable: cabc.Iterable[V] | None = None, + length: int | None = None, + label: str | None = None, + hidden: bool = False, + show_eta: bool = True, + show_percent: bool | None = None, + show_pos: bool = False, + item_show_func: t.Callable[[V | None], str | None] | None = None, + fill_char: str = "#", + empty_char: str = "-", + bar_template: str = "%(label)s [%(bar)s] %(info)s", + info_sep: str = " ", + width: int = 36, + file: t.TextIO | None = None, + color: bool | None = None, + update_min_steps: int = 1, +) -> ProgressBar[V]: ... + + +def progressbar( + iterable: cabc.Iterable[V] | None = None, + length: int | None = None, + label: str | None = None, + hidden: bool = False, + show_eta: bool = True, + show_percent: bool | None = None, + show_pos: bool = False, + item_show_func: t.Callable[[V | None], str | None] | None = None, + fill_char: str = "#", + empty_char: str = "-", + bar_template: str = "%(label)s [%(bar)s] %(info)s", + info_sep: str = " ", + width: int = 36, + file: t.TextIO | None = None, + color: bool | None = None, + update_min_steps: int = 1, +) -> ProgressBar[V]: + """This function creates an iterable context manager that can be used + to iterate over something while showing a progress bar. It will + either iterate over the `iterable` or `length` items (that are counted + up). While iteration happens, this function will print a rendered + progress bar to the given `file` (defaults to stdout) and will attempt + to calculate remaining time and more. By default, this progress bar + will not be rendered if the file is not a terminal. + + The context manager creates the progress bar. When the context + manager is entered the progress bar is already created. With every + iteration over the progress bar, the iterable passed to the bar is + advanced and the bar is updated. When the context manager exits, + a newline is printed and the progress bar is finalized on screen. + + Note: The progress bar is currently designed for use cases where the + total progress can be expected to take at least several seconds. + Because of this, the ProgressBar class object won't display + progress that is considered too fast, and progress where the time + between steps is less than a second. + + No printing must happen or the progress bar will be unintentionally + destroyed. + + Example usage:: + + with progressbar(items) as bar: + for item in bar: + do_something_with(item) + + Alternatively, if no iterable is specified, one can manually update the + progress bar through the `update()` method instead of directly + iterating over the progress bar. The update method accepts the number + of steps to increment the bar with:: + + with progressbar(length=chunks.total_bytes) as bar: + for chunk in chunks: + process_chunk(chunk) + bar.update(chunks.bytes) + + The ``update()`` method also takes an optional value specifying the + ``current_item`` at the new position. This is useful when used + together with ``item_show_func`` to customize the output for each + manual step:: + + with click.progressbar( + length=total_size, + label='Unzipping archive', + item_show_func=lambda a: a.filename + ) as bar: + for archive in zip_file: + archive.extract() + bar.update(archive.size, archive) + + :param iterable: an iterable to iterate over. If not provided the length + is required. + :param length: the number of items to iterate over. By default the + progressbar will attempt to ask the iterator about its + length, which might or might not work. If an iterable is + also provided this parameter can be used to override the + length. If an iterable is not provided the progress bar + will iterate over a range of that length. + :param label: the label to show next to the progress bar. + :param hidden: hide the progressbar. Defaults to ``False``. When no tty is + detected, it will only print the progressbar label. Setting this to + ``False`` also disables that. + :param show_eta: enables or disables the estimated time display. This is + automatically disabled if the length cannot be + determined. + :param show_percent: enables or disables the percentage display. The + default is `True` if the iterable has a length or + `False` if not. + :param show_pos: enables or disables the absolute position display. The + default is `False`. + :param item_show_func: A function called with the current item which + can return a string to show next to the progress bar. If the + function returns ``None`` nothing is shown. The current item can + be ``None``, such as when entering and exiting the bar. + :param fill_char: the character to use to show the filled part of the + progress bar. + :param empty_char: the character to use to show the non-filled part of + the progress bar. + :param bar_template: the format string to use as template for the bar. + The parameters in it are ``label`` for the label, + ``bar`` for the progress bar and ``info`` for the + info section. + :param info_sep: the separator between multiple info items (eta etc.) + :param width: the width of the progress bar in characters, 0 means full + terminal width + :param file: The file to write to. If this is not a terminal then + only the label is printed. + :param color: controls if the terminal supports ANSI colors or not. The + default is autodetection. This is only needed if ANSI + codes are included anywhere in the progress bar output + which is not the case by default. + :param update_min_steps: Render only when this many updates have + completed. This allows tuning for very fast iterators. + + .. versionadded:: 8.2 + The ``hidden`` argument. + + .. versionchanged:: 8.0 + Output is shown even if execution time is less than 0.5 seconds. + + .. versionchanged:: 8.0 + ``item_show_func`` shows the current item, not the previous one. + + .. versionchanged:: 8.0 + Labels are echoed if the output is not a TTY. Reverts a change + in 7.0 that removed all output. + + .. versionadded:: 8.0 + The ``update_min_steps`` parameter. + + .. versionadded:: 4.0 + The ``color`` parameter and ``update`` method. + + .. versionadded:: 2.0 + """ + from ._termui_impl import ProgressBar + + color = resolve_color_default(color) + return ProgressBar( + iterable=iterable, + length=length, + hidden=hidden, + show_eta=show_eta, + show_percent=show_percent, + show_pos=show_pos, + item_show_func=item_show_func, + fill_char=fill_char, + empty_char=empty_char, + bar_template=bar_template, + info_sep=info_sep, + file=file, + label=label, + width=width, + color=color, + update_min_steps=update_min_steps, + ) + + +def clear() -> None: + """Clears the terminal screen. This will have the effect of clearing + the whole visible space of the terminal and moving the cursor to the + top left. This does not do anything if not connected to a terminal. + + .. versionadded:: 2.0 + """ + if not isatty(sys.stdout): + return + + # ANSI escape \033[2J clears the screen, \033[1;1H moves the cursor + echo("\033[2J\033[1;1H", nl=False) + + +def _interpret_color(color: int | tuple[int, int, int] | str, offset: int = 0) -> str: + if isinstance(color, int): + return f"{38 + offset};5;{color:d}" + + if isinstance(color, (tuple, list)): + r, g, b = color + return f"{38 + offset};2;{r:d};{g:d};{b:d}" + + return str(_ansi_colors[color] + offset) + + +def style( + text: t.Any, + fg: int | tuple[int, int, int] | str | None = None, + bg: int | tuple[int, int, int] | str | None = None, + bold: bool | None = None, + dim: bool | None = None, + underline: bool | None = None, + overline: bool | None = None, + italic: bool | None = None, + blink: bool | None = None, + reverse: bool | None = None, + strikethrough: bool | None = None, + reset: bool = True, +) -> str: + """Styles a text with ANSI styles and returns the new string. By + default the styling is self contained which means that at the end + of the string a reset code is issued. This can be prevented by + passing ``reset=False``. + + Examples:: + + click.echo(click.style('Hello World!', fg='green')) + click.echo(click.style('ATTENTION!', blink=True)) + click.echo(click.style('Some things', reverse=True, fg='cyan')) + click.echo(click.style('More colors', fg=(255, 12, 128), bg=117)) + + Supported color names: + + * ``black`` (might be a gray) + * ``red`` + * ``green`` + * ``yellow`` (might be an orange) + * ``blue`` + * ``magenta`` + * ``cyan`` + * ``white`` (might be light gray) + * ``bright_black`` + * ``bright_red`` + * ``bright_green`` + * ``bright_yellow`` + * ``bright_blue`` + * ``bright_magenta`` + * ``bright_cyan`` + * ``bright_white`` + * ``reset`` (reset the color code only) + + If the terminal supports it, color may also be specified as: + + - An integer in the interval [0, 255]. The terminal must support + 8-bit/256-color mode. + - An RGB tuple of three integers in [0, 255]. The terminal must + support 24-bit/true-color mode. + + See https://en.wikipedia.org/wiki/ANSI_color and + https://gist.github.com/XVilka/8346728 for more information. + + :param text: the string to style with ansi codes. + :param fg: if provided this will become the foreground color. + :param bg: if provided this will become the background color. + :param bold: if provided this will enable or disable bold mode. + :param dim: if provided this will enable or disable dim mode. This is + badly supported. + :param underline: if provided this will enable or disable underline. + :param overline: if provided this will enable or disable overline. + :param italic: if provided this will enable or disable italic. + :param blink: if provided this will enable or disable blinking. + :param reverse: if provided this will enable or disable inverse + rendering (foreground becomes background and the + other way round). + :param strikethrough: if provided this will enable or disable + striking through text. + :param reset: by default a reset-all code is added at the end of the + string which means that styles do not carry over. This + can be disabled to compose styles. + + .. versionchanged:: 8.0 + A non-string ``message`` is converted to a string. + + .. versionchanged:: 8.0 + Added support for 256 and RGB color codes. + + .. versionchanged:: 8.0 + Added the ``strikethrough``, ``italic``, and ``overline`` + parameters. + + .. versionchanged:: 7.0 + Added support for bright colors. + + .. versionadded:: 2.0 + """ + if not isinstance(text, str): + text = str(text) + + bits = [] + + if fg: + try: + bits.append(f"\033[{_interpret_color(fg)}m") + except KeyError: + raise TypeError(f"Unknown color {fg!r}") from None + + if bg: + try: + bits.append(f"\033[{_interpret_color(bg, 10)}m") + except KeyError: + raise TypeError(f"Unknown color {bg!r}") from None + + if bold is not None: + bits.append(f"\033[{1 if bold else 22}m") + if dim is not None: + bits.append(f"\033[{2 if dim else 22}m") + if underline is not None: + bits.append(f"\033[{4 if underline else 24}m") + if overline is not None: + bits.append(f"\033[{53 if overline else 55}m") + if italic is not None: + bits.append(f"\033[{3 if italic else 23}m") + if blink is not None: + bits.append(f"\033[{5 if blink else 25}m") + if reverse is not None: + bits.append(f"\033[{7 if reverse else 27}m") + if strikethrough is not None: + bits.append(f"\033[{9 if strikethrough else 29}m") + bits.append(text) + if reset: + bits.append(_ansi_reset_all) + return "".join(bits) + + +def unstyle(text: str) -> str: + """Removes ANSI styling information from a string. Usually it's not + necessary to use this function as Click's echo function will + automatically remove styling if necessary. + + .. versionadded:: 2.0 + + :param text: the text to remove style information from. + """ + return strip_ansi(text) + + +def secho( + message: t.Any | None = None, + file: t.IO[t.AnyStr] | None = None, + nl: bool = True, + err: bool = False, + color: bool | None = None, + **styles: t.Any, +) -> None: + """This function combines :func:`echo` and :func:`style` into one + call. As such the following two calls are the same:: + + click.secho('Hello World!', fg='green') + click.echo(click.style('Hello World!', fg='green')) + + All keyword arguments are forwarded to the underlying functions + depending on which one they go with. + + Non-string types will be converted to :class:`str`. However, + :class:`bytes` are passed directly to :meth:`echo` without applying + style. If you want to style bytes that represent text, call + :meth:`bytes.decode` first. + + .. versionchanged:: 8.0 + A non-string ``message`` is converted to a string. Bytes are + passed through without style applied. + + .. versionadded:: 2.0 + """ + if message is not None and not isinstance(message, (bytes, bytearray)): + message = style(message, **styles) + + return echo(message, file=file, nl=nl, err=err, color=color) + + +@t.overload +def edit( + text: bytes | bytearray, + editor: str | None = None, + env: cabc.Mapping[str, str] | None = None, + require_save: bool = False, + extension: str = ".txt", +) -> bytes | None: ... + + +@t.overload +def edit( + text: str, + editor: str | None = None, + env: cabc.Mapping[str, str] | None = None, + require_save: bool = True, + extension: str = ".txt", +) -> str | None: ... + + +@t.overload +def edit( + text: None = None, + editor: str | None = None, + env: cabc.Mapping[str, str] | None = None, + require_save: bool = True, + extension: str = ".txt", + filename: str | cabc.Iterable[str] | None = None, +) -> None: ... + + +def edit( + text: str | bytes | bytearray | None = None, + editor: str | None = None, + env: cabc.Mapping[str, str] | None = None, + require_save: bool = True, + extension: str = ".txt", + filename: str | cabc.Iterable[str] | None = None, +) -> str | bytes | bytearray | None: + r"""Edits the given text in the defined editor. If an editor is given + (should be the full path to the executable but the regular operating + system search path is used for finding the executable) it overrides + the detected editor. Optionally, some environment variables can be + used. If the editor is closed without changes, `None` is returned. In + case a file is edited directly the return value is always `None` and + `require_save` and `extension` are ignored. + + If the editor cannot be opened a :exc:`UsageError` is raised. + + Note for Windows: to simplify cross-platform usage, the newlines are + automatically converted from POSIX to Windows and vice versa. As such, + the message here will have ``\n`` as newline markers. + + :param text: the text to edit. + :param editor: optionally the editor to use. Defaults to automatic + detection. + :param env: environment variables to forward to the editor. + :param require_save: if this is true, then not saving in the editor + will make the return value become `None`. + :param extension: the extension to tell the editor about. This defaults + to `.txt` but changing this might change syntax + highlighting. + :param filename: if provided it will edit this file instead of the + provided text contents. It will not use a temporary + file as an indirection in that case. If the editor supports + editing multiple files at once, a sequence of files may be + passed as well. Invoke `click.file` once per file instead + if multiple files cannot be managed at once or editing the + files serially is desired. + + .. versionchanged:: 8.2.0 + ``filename`` now accepts any ``Iterable[str]`` in addition to a ``str`` + if the ``editor`` supports editing multiple files at once. + + """ + from ._termui_impl import Editor + + ed = Editor(editor=editor, env=env, require_save=require_save, extension=extension) + + if filename is None: + return ed.edit(text) + + if isinstance(filename, str): + filename = (filename,) + + ed.edit_files(filenames=filename) + return None + + +def launch(url: str, wait: bool = False, locate: bool = False) -> int: + """This function launches the given URL (or filename) in the default + viewer application for this file type. If this is an executable, it + might launch the executable in a new session. The return value is + the exit code of the launched application. Usually, ``0`` indicates + success. + + Examples:: + + click.launch('https://click.palletsprojects.com/') + click.launch('/my/downloaded/file', locate=True) + + .. versionadded:: 2.0 + + :param url: URL or filename of the thing to launch. + :param wait: Wait for the program to exit before returning. This + only works if the launched program blocks. In particular, + ``xdg-open`` on Linux does not block. + :param locate: if this is set to `True` then instead of launching the + application associated with the URL it will attempt to + launch a file manager with the file located. This + might have weird effects if the URL does not point to + the filesystem. + """ + from ._termui_impl import open_url + + return open_url(url, wait=wait, locate=locate) + + +# If this is provided, getchar() calls into this instead. This is used +# for unittesting purposes. +_getchar: t.Callable[[bool], str] | None = None + + +def getchar(echo: bool = False) -> str: + """Fetches a single character from the terminal and returns it. This + will always return a unicode character and under certain rare + circumstances this might return more than one character. The + situations which more than one character is returned is when for + whatever reason multiple characters end up in the terminal buffer or + standard input was not actually a terminal. + + Note that this will always read from the terminal, even if something + is piped into the standard input. + + Note for Windows: in rare cases when typing non-ASCII characters, this + function might wait for a second character and then return both at once. + This is because certain Unicode characters look like special-key markers. + + .. versionadded:: 2.0 + + :param echo: if set to `True`, the character read will also show up on + the terminal. The default is to not show it. + """ + global _getchar + + if _getchar is None: + from ._termui_impl import getchar as f + + _getchar = f + + return _getchar(echo) + + +def raw_terminal() -> AbstractContextManager[int]: + from ._termui_impl import raw_terminal as f + + return f() + + +def pause(info: str | None = None, err: bool = False) -> None: + """This command stops execution and waits for the user to press any + key to continue. This is similar to the Windows batch "pause" + command. If the program is not run through a terminal, this command + will instead do nothing. + + .. versionadded:: 2.0 + + .. versionadded:: 4.0 + Added the `err` parameter. + + :param info: The message to print before pausing. Defaults to + ``"Press any key to continue..."``. + :param err: if set to message goes to ``stderr`` instead of + ``stdout``, the same as with echo. + """ + if not isatty(sys.stdin) or not isatty(sys.stdout): + return + + if info is None: + info = _("Press any key to continue...") + + try: + if info: + echo(info, nl=False, err=err) + try: + getchar() + except (KeyboardInterrupt, EOFError): + pass + finally: + if info: + echo(err=err) diff --git a/venv/lib/python3.11/site-packages/click/testing.py b/venv/lib/python3.11/site-packages/click/testing.py new file mode 100644 index 0000000..f6f60b8 --- /dev/null +++ b/venv/lib/python3.11/site-packages/click/testing.py @@ -0,0 +1,577 @@ +from __future__ import annotations + +import collections.abc as cabc +import contextlib +import io +import os +import shlex +import sys +import tempfile +import typing as t +from types import TracebackType + +from . import _compat +from . import formatting +from . import termui +from . import utils +from ._compat import _find_binary_reader + +if t.TYPE_CHECKING: + from _typeshed import ReadableBuffer + + from .core import Command + + +class EchoingStdin: + def __init__(self, input: t.BinaryIO, output: t.BinaryIO) -> None: + self._input = input + self._output = output + self._paused = False + + def __getattr__(self, x: str) -> t.Any: + return getattr(self._input, x) + + def _echo(self, rv: bytes) -> bytes: + if not self._paused: + self._output.write(rv) + + return rv + + def read(self, n: int = -1) -> bytes: + return self._echo(self._input.read(n)) + + def read1(self, n: int = -1) -> bytes: + return self._echo(self._input.read1(n)) # type: ignore + + def readline(self, n: int = -1) -> bytes: + return self._echo(self._input.readline(n)) + + def readlines(self) -> list[bytes]: + return [self._echo(x) for x in self._input.readlines()] + + def __iter__(self) -> cabc.Iterator[bytes]: + return iter(self._echo(x) for x in self._input) + + def __repr__(self) -> str: + return repr(self._input) + + +@contextlib.contextmanager +def _pause_echo(stream: EchoingStdin | None) -> cabc.Iterator[None]: + if stream is None: + yield + else: + stream._paused = True + yield + stream._paused = False + + +class BytesIOCopy(io.BytesIO): + """Patch ``io.BytesIO`` to let the written stream be copied to another. + + .. versionadded:: 8.2 + """ + + def __init__(self, copy_to: io.BytesIO) -> None: + super().__init__() + self.copy_to = copy_to + + def flush(self) -> None: + super().flush() + self.copy_to.flush() + + def write(self, b: ReadableBuffer) -> int: + self.copy_to.write(b) + return super().write(b) + + +class StreamMixer: + """Mixes `` and `` streams. + + The result is available in the ``output`` attribute. + + .. versionadded:: 8.2 + """ + + def __init__(self) -> None: + self.output: io.BytesIO = io.BytesIO() + self.stdout: io.BytesIO = BytesIOCopy(copy_to=self.output) + self.stderr: io.BytesIO = BytesIOCopy(copy_to=self.output) + + def __del__(self) -> None: + """ + Guarantee that embedded file-like objects are closed in a + predictable order, protecting against races between + self.output being closed and other streams being flushed on close + + .. versionadded:: 8.2.2 + """ + self.stderr.close() + self.stdout.close() + self.output.close() + + +class _NamedTextIOWrapper(io.TextIOWrapper): + def __init__( + self, buffer: t.BinaryIO, name: str, mode: str, **kwargs: t.Any + ) -> None: + super().__init__(buffer, **kwargs) + self._name = name + self._mode = mode + + @property + def name(self) -> str: + return self._name + + @property + def mode(self) -> str: + return self._mode + + +def make_input_stream( + input: str | bytes | t.IO[t.Any] | None, charset: str +) -> t.BinaryIO: + # Is already an input stream. + if hasattr(input, "read"): + rv = _find_binary_reader(t.cast("t.IO[t.Any]", input)) + + if rv is not None: + return rv + + raise TypeError("Could not find binary reader for input stream.") + + if input is None: + input = b"" + elif isinstance(input, str): + input = input.encode(charset) + + return io.BytesIO(input) + + +class Result: + """Holds the captured result of an invoked CLI script. + + :param runner: The runner that created the result + :param stdout_bytes: The standard output as bytes. + :param stderr_bytes: The standard error as bytes. + :param output_bytes: A mix of ``stdout_bytes`` and ``stderr_bytes``, as the + user would see it in its terminal. + :param return_value: The value returned from the invoked command. + :param exit_code: The exit code as integer. + :param exception: The exception that happened if one did. + :param exc_info: Exception information (exception type, exception instance, + traceback type). + + .. versionchanged:: 8.2 + ``stderr_bytes`` no longer optional, ``output_bytes`` introduced and + ``mix_stderr`` has been removed. + + .. versionadded:: 8.0 + Added ``return_value``. + """ + + def __init__( + self, + runner: CliRunner, + stdout_bytes: bytes, + stderr_bytes: bytes, + output_bytes: bytes, + return_value: t.Any, + exit_code: int, + exception: BaseException | None, + exc_info: tuple[type[BaseException], BaseException, TracebackType] + | None = None, + ): + self.runner = runner + self.stdout_bytes = stdout_bytes + self.stderr_bytes = stderr_bytes + self.output_bytes = output_bytes + self.return_value = return_value + self.exit_code = exit_code + self.exception = exception + self.exc_info = exc_info + + @property + def output(self) -> str: + """The terminal output as unicode string, as the user would see it. + + .. versionchanged:: 8.2 + No longer a proxy for ``self.stdout``. Now has its own independent stream + that is mixing `` and ``, in the order they were written. + """ + return self.output_bytes.decode(self.runner.charset, "replace").replace( + "\r\n", "\n" + ) + + @property + def stdout(self) -> str: + """The standard output as unicode string.""" + return self.stdout_bytes.decode(self.runner.charset, "replace").replace( + "\r\n", "\n" + ) + + @property + def stderr(self) -> str: + """The standard error as unicode string. + + .. versionchanged:: 8.2 + No longer raise an exception, always returns the `` string. + """ + return self.stderr_bytes.decode(self.runner.charset, "replace").replace( + "\r\n", "\n" + ) + + def __repr__(self) -> str: + exc_str = repr(self.exception) if self.exception else "okay" + return f"<{type(self).__name__} {exc_str}>" + + +class CliRunner: + """The CLI runner provides functionality to invoke a Click command line + script for unittesting purposes in a isolated environment. This only + works in single-threaded systems without any concurrency as it changes the + global interpreter state. + + :param charset: the character set for the input and output data. + :param env: a dictionary with environment variables for overriding. + :param echo_stdin: if this is set to `True`, then reading from `` writes + to ``. This is useful for showing examples in + some circumstances. Note that regular prompts + will automatically echo the input. + :param catch_exceptions: Whether to catch any exceptions other than + ``SystemExit`` when running :meth:`~CliRunner.invoke`. + + .. versionchanged:: 8.2 + Added the ``catch_exceptions`` parameter. + + .. versionchanged:: 8.2 + ``mix_stderr`` parameter has been removed. + """ + + def __init__( + self, + charset: str = "utf-8", + env: cabc.Mapping[str, str | None] | None = None, + echo_stdin: bool = False, + catch_exceptions: bool = True, + ) -> None: + self.charset = charset + self.env: cabc.Mapping[str, str | None] = env or {} + self.echo_stdin = echo_stdin + self.catch_exceptions = catch_exceptions + + def get_default_prog_name(self, cli: Command) -> str: + """Given a command object it will return the default program name + for it. The default is the `name` attribute or ``"root"`` if not + set. + """ + return cli.name or "root" + + def make_env( + self, overrides: cabc.Mapping[str, str | None] | None = None + ) -> cabc.Mapping[str, str | None]: + """Returns the environment overrides for invoking a script.""" + rv = dict(self.env) + if overrides: + rv.update(overrides) + return rv + + @contextlib.contextmanager + def isolation( + self, + input: str | bytes | t.IO[t.Any] | None = None, + env: cabc.Mapping[str, str | None] | None = None, + color: bool = False, + ) -> cabc.Iterator[tuple[io.BytesIO, io.BytesIO, io.BytesIO]]: + """A context manager that sets up the isolation for invoking of a + command line tool. This sets up `` with the given input data + and `os.environ` with the overrides from the given dictionary. + This also rebinds some internals in Click to be mocked (like the + prompt functionality). + + This is automatically done in the :meth:`invoke` method. + + :param input: the input stream to put into `sys.stdin`. + :param env: the environment overrides as dictionary. + :param color: whether the output should contain color codes. The + application can still override this explicitly. + + .. versionadded:: 8.2 + An additional output stream is returned, which is a mix of + `` and `` streams. + + .. versionchanged:: 8.2 + Always returns the `` stream. + + .. versionchanged:: 8.0 + `` is opened with ``errors="backslashreplace"`` + instead of the default ``"strict"``. + + .. versionchanged:: 4.0 + Added the ``color`` parameter. + """ + bytes_input = make_input_stream(input, self.charset) + echo_input = None + + old_stdin = sys.stdin + old_stdout = sys.stdout + old_stderr = sys.stderr + old_forced_width = formatting.FORCED_WIDTH + formatting.FORCED_WIDTH = 80 + + env = self.make_env(env) + + stream_mixer = StreamMixer() + + if self.echo_stdin: + bytes_input = echo_input = t.cast( + t.BinaryIO, EchoingStdin(bytes_input, stream_mixer.stdout) + ) + + sys.stdin = text_input = _NamedTextIOWrapper( + bytes_input, encoding=self.charset, name="", mode="r" + ) + + if self.echo_stdin: + # Force unbuffered reads, otherwise TextIOWrapper reads a + # large chunk which is echoed early. + text_input._CHUNK_SIZE = 1 # type: ignore + + sys.stdout = _NamedTextIOWrapper( + stream_mixer.stdout, encoding=self.charset, name="", mode="w" + ) + + sys.stderr = _NamedTextIOWrapper( + stream_mixer.stderr, + encoding=self.charset, + name="", + mode="w", + errors="backslashreplace", + ) + + @_pause_echo(echo_input) # type: ignore + def visible_input(prompt: str | None = None) -> str: + sys.stdout.write(prompt or "") + try: + val = next(text_input).rstrip("\r\n") + except StopIteration as e: + raise EOFError() from e + sys.stdout.write(f"{val}\n") + sys.stdout.flush() + return val + + @_pause_echo(echo_input) # type: ignore + def hidden_input(prompt: str | None = None) -> str: + sys.stdout.write(f"{prompt or ''}\n") + sys.stdout.flush() + try: + return next(text_input).rstrip("\r\n") + except StopIteration as e: + raise EOFError() from e + + @_pause_echo(echo_input) # type: ignore + def _getchar(echo: bool) -> str: + char = sys.stdin.read(1) + + if echo: + sys.stdout.write(char) + + sys.stdout.flush() + return char + + default_color = color + + def should_strip_ansi( + stream: t.IO[t.Any] | None = None, color: bool | None = None + ) -> bool: + if color is None: + return not default_color + return not color + + old_visible_prompt_func = termui.visible_prompt_func + old_hidden_prompt_func = termui.hidden_prompt_func + old__getchar_func = termui._getchar + old_should_strip_ansi = utils.should_strip_ansi # type: ignore + old__compat_should_strip_ansi = _compat.should_strip_ansi + termui.visible_prompt_func = visible_input + termui.hidden_prompt_func = hidden_input + termui._getchar = _getchar + utils.should_strip_ansi = should_strip_ansi # type: ignore + _compat.should_strip_ansi = should_strip_ansi + + old_env = {} + try: + for key, value in env.items(): + old_env[key] = os.environ.get(key) + if value is None: + try: + del os.environ[key] + except Exception: + pass + else: + os.environ[key] = value + yield (stream_mixer.stdout, stream_mixer.stderr, stream_mixer.output) + finally: + for key, value in old_env.items(): + if value is None: + try: + del os.environ[key] + except Exception: + pass + else: + os.environ[key] = value + sys.stdout = old_stdout + sys.stderr = old_stderr + sys.stdin = old_stdin + termui.visible_prompt_func = old_visible_prompt_func + termui.hidden_prompt_func = old_hidden_prompt_func + termui._getchar = old__getchar_func + utils.should_strip_ansi = old_should_strip_ansi # type: ignore + _compat.should_strip_ansi = old__compat_should_strip_ansi + formatting.FORCED_WIDTH = old_forced_width + + def invoke( + self, + cli: Command, + args: str | cabc.Sequence[str] | None = None, + input: str | bytes | t.IO[t.Any] | None = None, + env: cabc.Mapping[str, str | None] | None = None, + catch_exceptions: bool | None = None, + color: bool = False, + **extra: t.Any, + ) -> Result: + """Invokes a command in an isolated environment. The arguments are + forwarded directly to the command line script, the `extra` keyword + arguments are passed to the :meth:`~clickpkg.Command.main` function of + the command. + + This returns a :class:`Result` object. + + :param cli: the command to invoke + :param args: the arguments to invoke. It may be given as an iterable + or a string. When given as string it will be interpreted + as a Unix shell command. More details at + :func:`shlex.split`. + :param input: the input data for `sys.stdin`. + :param env: the environment overrides. + :param catch_exceptions: Whether to catch any other exceptions than + ``SystemExit``. If :data:`None`, the value + from :class:`CliRunner` is used. + :param extra: the keyword arguments to pass to :meth:`main`. + :param color: whether the output should contain color codes. The + application can still override this explicitly. + + .. versionadded:: 8.2 + The result object has the ``output_bytes`` attribute with + the mix of ``stdout_bytes`` and ``stderr_bytes``, as the user would + see it in its terminal. + + .. versionchanged:: 8.2 + The result object always returns the ``stderr_bytes`` stream. + + .. versionchanged:: 8.0 + The result object has the ``return_value`` attribute with + the value returned from the invoked command. + + .. versionchanged:: 4.0 + Added the ``color`` parameter. + + .. versionchanged:: 3.0 + Added the ``catch_exceptions`` parameter. + + .. versionchanged:: 3.0 + The result object has the ``exc_info`` attribute with the + traceback if available. + """ + exc_info = None + if catch_exceptions is None: + catch_exceptions = self.catch_exceptions + + with self.isolation(input=input, env=env, color=color) as outstreams: + return_value = None + exception: BaseException | None = None + exit_code = 0 + + if isinstance(args, str): + args = shlex.split(args) + + try: + prog_name = extra.pop("prog_name") + except KeyError: + prog_name = self.get_default_prog_name(cli) + + try: + return_value = cli.main(args=args or (), prog_name=prog_name, **extra) + except SystemExit as e: + exc_info = sys.exc_info() + e_code = t.cast("int | t.Any | None", e.code) + + if e_code is None: + e_code = 0 + + if e_code != 0: + exception = e + + if not isinstance(e_code, int): + sys.stdout.write(str(e_code)) + sys.stdout.write("\n") + e_code = 1 + + exit_code = e_code + + except Exception as e: + if not catch_exceptions: + raise + exception = e + exit_code = 1 + exc_info = sys.exc_info() + finally: + sys.stdout.flush() + sys.stderr.flush() + stdout = outstreams[0].getvalue() + stderr = outstreams[1].getvalue() + output = outstreams[2].getvalue() + + return Result( + runner=self, + stdout_bytes=stdout, + stderr_bytes=stderr, + output_bytes=output, + return_value=return_value, + exit_code=exit_code, + exception=exception, + exc_info=exc_info, # type: ignore + ) + + @contextlib.contextmanager + def isolated_filesystem( + self, temp_dir: str | os.PathLike[str] | None = None + ) -> cabc.Iterator[str]: + """A context manager that creates a temporary directory and + changes the current working directory to it. This isolates tests + that affect the contents of the CWD to prevent them from + interfering with each other. + + :param temp_dir: Create the temporary directory under this + directory. If given, the created directory is not removed + when exiting. + + .. versionchanged:: 8.0 + Added the ``temp_dir`` parameter. + """ + cwd = os.getcwd() + dt = tempfile.mkdtemp(dir=temp_dir) + os.chdir(dt) + + try: + yield dt + finally: + os.chdir(cwd) + + if temp_dir is None: + import shutil + + try: + shutil.rmtree(dt) + except OSError: + pass diff --git a/venv/lib/python3.11/site-packages/click/types.py b/venv/lib/python3.11/site-packages/click/types.py new file mode 100644 index 0000000..e71c1c2 --- /dev/null +++ b/venv/lib/python3.11/site-packages/click/types.py @@ -0,0 +1,1209 @@ +from __future__ import annotations + +import collections.abc as cabc +import enum +import os +import stat +import sys +import typing as t +from datetime import datetime +from gettext import gettext as _ +from gettext import ngettext + +from ._compat import _get_argv_encoding +from ._compat import open_stream +from .exceptions import BadParameter +from .utils import format_filename +from .utils import LazyFile +from .utils import safecall + +if t.TYPE_CHECKING: + import typing_extensions as te + + from .core import Context + from .core import Parameter + from .shell_completion import CompletionItem + +ParamTypeValue = t.TypeVar("ParamTypeValue") + + +class ParamType: + """Represents the type of a parameter. Validates and converts values + from the command line or Python into the correct type. + + To implement a custom type, subclass and implement at least the + following: + + - The :attr:`name` class attribute must be set. + - Calling an instance of the type with ``None`` must return + ``None``. This is already implemented by default. + - :meth:`convert` must convert string values to the correct type. + - :meth:`convert` must accept values that are already the correct + type. + - It must be able to convert a value if the ``ctx`` and ``param`` + arguments are ``None``. This can occur when converting prompt + input. + """ + + is_composite: t.ClassVar[bool] = False + arity: t.ClassVar[int] = 1 + + #: the descriptive name of this type + name: str + + #: if a list of this type is expected and the value is pulled from a + #: string environment variable, this is what splits it up. `None` + #: means any whitespace. For all parameters the general rule is that + #: whitespace splits them up. The exception are paths and files which + #: are split by ``os.path.pathsep`` by default (":" on Unix and ";" on + #: Windows). + envvar_list_splitter: t.ClassVar[str | None] = None + + def to_info_dict(self) -> dict[str, t.Any]: + """Gather information that could be useful for a tool generating + user-facing documentation. + + Use :meth:`click.Context.to_info_dict` to traverse the entire + CLI structure. + + .. versionadded:: 8.0 + """ + # The class name without the "ParamType" suffix. + param_type = type(self).__name__.partition("ParamType")[0] + param_type = param_type.partition("ParameterType")[0] + + # Custom subclasses might not remember to set a name. + if hasattr(self, "name"): + name = self.name + else: + name = param_type + + return {"param_type": param_type, "name": name} + + def __call__( + self, + value: t.Any, + param: Parameter | None = None, + ctx: Context | None = None, + ) -> t.Any: + if value is not None: + return self.convert(value, param, ctx) + + def get_metavar(self, param: Parameter, ctx: Context) -> str | None: + """Returns the metavar default for this param if it provides one.""" + + def get_missing_message(self, param: Parameter, ctx: Context | None) -> str | None: + """Optionally might return extra information about a missing + parameter. + + .. versionadded:: 2.0 + """ + + def convert( + self, value: t.Any, param: Parameter | None, ctx: Context | None + ) -> t.Any: + """Convert the value to the correct type. This is not called if + the value is ``None`` (the missing value). + + This must accept string values from the command line, as well as + values that are already the correct type. It may also convert + other compatible types. + + The ``param`` and ``ctx`` arguments may be ``None`` in certain + situations, such as when converting prompt input. + + If the value cannot be converted, call :meth:`fail` with a + descriptive message. + + :param value: The value to convert. + :param param: The parameter that is using this type to convert + its value. May be ``None``. + :param ctx: The current context that arrived at this value. May + be ``None``. + """ + return value + + def split_envvar_value(self, rv: str) -> cabc.Sequence[str]: + """Given a value from an environment variable this splits it up + into small chunks depending on the defined envvar list splitter. + + If the splitter is set to `None`, which means that whitespace splits, + then leading and trailing whitespace is ignored. Otherwise, leading + and trailing splitters usually lead to empty items being included. + """ + return (rv or "").split(self.envvar_list_splitter) + + def fail( + self, + message: str, + param: Parameter | None = None, + ctx: Context | None = None, + ) -> t.NoReturn: + """Helper method to fail with an invalid value message.""" + raise BadParameter(message, ctx=ctx, param=param) + + def shell_complete( + self, ctx: Context, param: Parameter, incomplete: str + ) -> list[CompletionItem]: + """Return a list of + :class:`~click.shell_completion.CompletionItem` objects for the + incomplete value. Most types do not provide completions, but + some do, and this allows custom types to provide custom + completions as well. + + :param ctx: Invocation context for this command. + :param param: The parameter that is requesting completion. + :param incomplete: Value being completed. May be empty. + + .. versionadded:: 8.0 + """ + return [] + + +class CompositeParamType(ParamType): + is_composite = True + + @property + def arity(self) -> int: # type: ignore + raise NotImplementedError() + + +class FuncParamType(ParamType): + def __init__(self, func: t.Callable[[t.Any], t.Any]) -> None: + self.name: str = func.__name__ + self.func = func + + def to_info_dict(self) -> dict[str, t.Any]: + info_dict = super().to_info_dict() + info_dict["func"] = self.func + return info_dict + + def convert( + self, value: t.Any, param: Parameter | None, ctx: Context | None + ) -> t.Any: + try: + return self.func(value) + except ValueError: + try: + value = str(value) + except UnicodeError: + value = value.decode("utf-8", "replace") + + self.fail(value, param, ctx) + + +class UnprocessedParamType(ParamType): + name = "text" + + def convert( + self, value: t.Any, param: Parameter | None, ctx: Context | None + ) -> t.Any: + return value + + def __repr__(self) -> str: + return "UNPROCESSED" + + +class StringParamType(ParamType): + name = "text" + + def convert( + self, value: t.Any, param: Parameter | None, ctx: Context | None + ) -> t.Any: + if isinstance(value, bytes): + enc = _get_argv_encoding() + try: + value = value.decode(enc) + except UnicodeError: + fs_enc = sys.getfilesystemencoding() + if fs_enc != enc: + try: + value = value.decode(fs_enc) + except UnicodeError: + value = value.decode("utf-8", "replace") + else: + value = value.decode("utf-8", "replace") + return value + return str(value) + + def __repr__(self) -> str: + return "STRING" + + +class Choice(ParamType, t.Generic[ParamTypeValue]): + """The choice type allows a value to be checked against a fixed set + of supported values. + + You may pass any iterable value which will be converted to a tuple + and thus will only be iterated once. + + The resulting value will always be one of the originally passed choices. + See :meth:`normalize_choice` for more info on the mapping of strings + to choices. See :ref:`choice-opts` for an example. + + :param case_sensitive: Set to false to make choices case + insensitive. Defaults to true. + + .. versionchanged:: 8.2.0 + Non-``str`` ``choices`` are now supported. It can additionally be any + iterable. Before you were not recommended to pass anything but a list or + tuple. + + .. versionadded:: 8.2.0 + Choice normalization can be overridden via :meth:`normalize_choice`. + """ + + name = "choice" + + def __init__( + self, choices: cabc.Iterable[ParamTypeValue], case_sensitive: bool = True + ) -> None: + self.choices: cabc.Sequence[ParamTypeValue] = tuple(choices) + self.case_sensitive = case_sensitive + + def to_info_dict(self) -> dict[str, t.Any]: + info_dict = super().to_info_dict() + info_dict["choices"] = self.choices + info_dict["case_sensitive"] = self.case_sensitive + return info_dict + + def _normalized_mapping( + self, ctx: Context | None = None + ) -> cabc.Mapping[ParamTypeValue, str]: + """ + Returns mapping where keys are the original choices and the values are + the normalized values that are accepted via the command line. + + This is a simple wrapper around :meth:`normalize_choice`, use that + instead which is supported. + """ + return { + choice: self.normalize_choice( + choice=choice, + ctx=ctx, + ) + for choice in self.choices + } + + def normalize_choice(self, choice: ParamTypeValue, ctx: Context | None) -> str: + """ + Normalize a choice value, used to map a passed string to a choice. + Each choice must have a unique normalized value. + + By default uses :meth:`Context.token_normalize_func` and if not case + sensitive, convert it to a casefolded value. + + .. versionadded:: 8.2.0 + """ + normed_value = choice.name if isinstance(choice, enum.Enum) else str(choice) + + if ctx is not None and ctx.token_normalize_func is not None: + normed_value = ctx.token_normalize_func(normed_value) + + if not self.case_sensitive: + normed_value = normed_value.casefold() + + return normed_value + + def get_metavar(self, param: Parameter, ctx: Context) -> str | None: + if param.param_type_name == "option" and not param.show_choices: # type: ignore + choice_metavars = [ + convert_type(type(choice)).name.upper() for choice in self.choices + ] + choices_str = "|".join([*dict.fromkeys(choice_metavars)]) + else: + choices_str = "|".join( + [str(i) for i in self._normalized_mapping(ctx=ctx).values()] + ) + + # Use curly braces to indicate a required argument. + if param.required and param.param_type_name == "argument": + return f"{{{choices_str}}}" + + # Use square braces to indicate an option or optional argument. + return f"[{choices_str}]" + + def get_missing_message(self, param: Parameter, ctx: Context | None) -> str: + """ + Message shown when no choice is passed. + + .. versionchanged:: 8.2.0 Added ``ctx`` argument. + """ + return _("Choose from:\n\t{choices}").format( + choices=",\n\t".join(self._normalized_mapping(ctx=ctx).values()) + ) + + def convert( + self, value: t.Any, param: Parameter | None, ctx: Context | None + ) -> ParamTypeValue: + """ + For a given value from the parser, normalize it and find its + matching normalized value in the list of choices. Then return the + matched "original" choice. + """ + normed_value = self.normalize_choice(choice=value, ctx=ctx) + normalized_mapping = self._normalized_mapping(ctx=ctx) + + try: + return next( + original + for original, normalized in normalized_mapping.items() + if normalized == normed_value + ) + except StopIteration: + self.fail( + self.get_invalid_choice_message(value=value, ctx=ctx), + param=param, + ctx=ctx, + ) + + def get_invalid_choice_message(self, value: t.Any, ctx: Context | None) -> str: + """Get the error message when the given choice is invalid. + + :param value: The invalid value. + + .. versionadded:: 8.2 + """ + choices_str = ", ".join(map(repr, self._normalized_mapping(ctx=ctx).values())) + return ngettext( + "{value!r} is not {choice}.", + "{value!r} is not one of {choices}.", + len(self.choices), + ).format(value=value, choice=choices_str, choices=choices_str) + + def __repr__(self) -> str: + return f"Choice({list(self.choices)})" + + def shell_complete( + self, ctx: Context, param: Parameter, incomplete: str + ) -> list[CompletionItem]: + """Complete choices that start with the incomplete value. + + :param ctx: Invocation context for this command. + :param param: The parameter that is requesting completion. + :param incomplete: Value being completed. May be empty. + + .. versionadded:: 8.0 + """ + from click.shell_completion import CompletionItem + + str_choices = map(str, self.choices) + + if self.case_sensitive: + matched = (c for c in str_choices if c.startswith(incomplete)) + else: + incomplete = incomplete.lower() + matched = (c for c in str_choices if c.lower().startswith(incomplete)) + + return [CompletionItem(c) for c in matched] + + +class DateTime(ParamType): + """The DateTime type converts date strings into `datetime` objects. + + The format strings which are checked are configurable, but default to some + common (non-timezone aware) ISO 8601 formats. + + When specifying *DateTime* formats, you should only pass a list or a tuple. + Other iterables, like generators, may lead to surprising results. + + The format strings are processed using ``datetime.strptime``, and this + consequently defines the format strings which are allowed. + + Parsing is tried using each format, in order, and the first format which + parses successfully is used. + + :param formats: A list or tuple of date format strings, in the order in + which they should be tried. Defaults to + ``'%Y-%m-%d'``, ``'%Y-%m-%dT%H:%M:%S'``, + ``'%Y-%m-%d %H:%M:%S'``. + """ + + name = "datetime" + + def __init__(self, formats: cabc.Sequence[str] | None = None): + self.formats: cabc.Sequence[str] = formats or [ + "%Y-%m-%d", + "%Y-%m-%dT%H:%M:%S", + "%Y-%m-%d %H:%M:%S", + ] + + def to_info_dict(self) -> dict[str, t.Any]: + info_dict = super().to_info_dict() + info_dict["formats"] = self.formats + return info_dict + + def get_metavar(self, param: Parameter, ctx: Context) -> str | None: + return f"[{'|'.join(self.formats)}]" + + def _try_to_convert_date(self, value: t.Any, format: str) -> datetime | None: + try: + return datetime.strptime(value, format) + except ValueError: + return None + + def convert( + self, value: t.Any, param: Parameter | None, ctx: Context | None + ) -> t.Any: + if isinstance(value, datetime): + return value + + for format in self.formats: + converted = self._try_to_convert_date(value, format) + + if converted is not None: + return converted + + formats_str = ", ".join(map(repr, self.formats)) + self.fail( + ngettext( + "{value!r} does not match the format {format}.", + "{value!r} does not match the formats {formats}.", + len(self.formats), + ).format(value=value, format=formats_str, formats=formats_str), + param, + ctx, + ) + + def __repr__(self) -> str: + return "DateTime" + + +class _NumberParamTypeBase(ParamType): + _number_class: t.ClassVar[type[t.Any]] + + def convert( + self, value: t.Any, param: Parameter | None, ctx: Context | None + ) -> t.Any: + try: + return self._number_class(value) + except ValueError: + self.fail( + _("{value!r} is not a valid {number_type}.").format( + value=value, number_type=self.name + ), + param, + ctx, + ) + + +class _NumberRangeBase(_NumberParamTypeBase): + def __init__( + self, + min: float | None = None, + max: float | None = None, + min_open: bool = False, + max_open: bool = False, + clamp: bool = False, + ) -> None: + self.min = min + self.max = max + self.min_open = min_open + self.max_open = max_open + self.clamp = clamp + + def to_info_dict(self) -> dict[str, t.Any]: + info_dict = super().to_info_dict() + info_dict.update( + min=self.min, + max=self.max, + min_open=self.min_open, + max_open=self.max_open, + clamp=self.clamp, + ) + return info_dict + + def convert( + self, value: t.Any, param: Parameter | None, ctx: Context | None + ) -> t.Any: + import operator + + rv = super().convert(value, param, ctx) + lt_min: bool = self.min is not None and ( + operator.le if self.min_open else operator.lt + )(rv, self.min) + gt_max: bool = self.max is not None and ( + operator.ge if self.max_open else operator.gt + )(rv, self.max) + + if self.clamp: + if lt_min: + return self._clamp(self.min, 1, self.min_open) # type: ignore + + if gt_max: + return self._clamp(self.max, -1, self.max_open) # type: ignore + + if lt_min or gt_max: + self.fail( + _("{value} is not in the range {range}.").format( + value=rv, range=self._describe_range() + ), + param, + ctx, + ) + + return rv + + def _clamp(self, bound: float, dir: t.Literal[1, -1], open: bool) -> float: + """Find the valid value to clamp to bound in the given + direction. + + :param bound: The boundary value. + :param dir: 1 or -1 indicating the direction to move. + :param open: If true, the range does not include the bound. + """ + raise NotImplementedError + + def _describe_range(self) -> str: + """Describe the range for use in help text.""" + if self.min is None: + op = "<" if self.max_open else "<=" + return f"x{op}{self.max}" + + if self.max is None: + op = ">" if self.min_open else ">=" + return f"x{op}{self.min}" + + lop = "<" if self.min_open else "<=" + rop = "<" if self.max_open else "<=" + return f"{self.min}{lop}x{rop}{self.max}" + + def __repr__(self) -> str: + clamp = " clamped" if self.clamp else "" + return f"<{type(self).__name__} {self._describe_range()}{clamp}>" + + +class IntParamType(_NumberParamTypeBase): + name = "integer" + _number_class = int + + def __repr__(self) -> str: + return "INT" + + +class IntRange(_NumberRangeBase, IntParamType): + """Restrict an :data:`click.INT` value to a range of accepted + values. See :ref:`ranges`. + + If ``min`` or ``max`` are not passed, any value is accepted in that + direction. If ``min_open`` or ``max_open`` are enabled, the + corresponding boundary is not included in the range. + + If ``clamp`` is enabled, a value outside the range is clamped to the + boundary instead of failing. + + .. versionchanged:: 8.0 + Added the ``min_open`` and ``max_open`` parameters. + """ + + name = "integer range" + + def _clamp( # type: ignore + self, bound: int, dir: t.Literal[1, -1], open: bool + ) -> int: + if not open: + return bound + + return bound + dir + + +class FloatParamType(_NumberParamTypeBase): + name = "float" + _number_class = float + + def __repr__(self) -> str: + return "FLOAT" + + +class FloatRange(_NumberRangeBase, FloatParamType): + """Restrict a :data:`click.FLOAT` value to a range of accepted + values. See :ref:`ranges`. + + If ``min`` or ``max`` are not passed, any value is accepted in that + direction. If ``min_open`` or ``max_open`` are enabled, the + corresponding boundary is not included in the range. + + If ``clamp`` is enabled, a value outside the range is clamped to the + boundary instead of failing. This is not supported if either + boundary is marked ``open``. + + .. versionchanged:: 8.0 + Added the ``min_open`` and ``max_open`` parameters. + """ + + name = "float range" + + def __init__( + self, + min: float | None = None, + max: float | None = None, + min_open: bool = False, + max_open: bool = False, + clamp: bool = False, + ) -> None: + super().__init__( + min=min, max=max, min_open=min_open, max_open=max_open, clamp=clamp + ) + + if (min_open or max_open) and clamp: + raise TypeError("Clamping is not supported for open bounds.") + + def _clamp(self, bound: float, dir: t.Literal[1, -1], open: bool) -> float: + if not open: + return bound + + # Could use math.nextafter here, but clamping an + # open float range doesn't seem to be particularly useful. It's + # left up to the user to write a callback to do it if needed. + raise RuntimeError("Clamping is not supported for open bounds.") + + +class BoolParamType(ParamType): + name = "boolean" + + bool_states: dict[str, bool] = { + "1": True, + "0": False, + "yes": True, + "no": False, + "true": True, + "false": False, + "on": True, + "off": False, + "t": True, + "f": False, + "y": True, + "n": False, + # Absence of value is considered False. + "": False, + } + """A mapping of string values to boolean states. + + Mapping is inspired by :py:attr:`configparser.ConfigParser.BOOLEAN_STATES` + and extends it. + + .. caution:: + String values are lower-cased, as the ``str_to_bool`` comparison function + below is case-insensitive. + + .. warning:: + The mapping is not exhaustive, and does not cover all possible boolean strings + representations. It will remains as it is to avoid endless bikeshedding. + + Future work my be considered to make this mapping user-configurable from public + API. + """ + + @staticmethod + def str_to_bool(value: str | bool) -> bool | None: + """Convert a string to a boolean value. + + If the value is already a boolean, it is returned as-is. If the value is a + string, it is stripped of whitespaces and lower-cased, then checked against + the known boolean states pre-defined in the `BoolParamType.bool_states` mapping + above. + + Returns `None` if the value does not match any known boolean state. + """ + if isinstance(value, bool): + return value + return BoolParamType.bool_states.get(value.strip().lower()) + + def convert( + self, value: t.Any, param: Parameter | None, ctx: Context | None + ) -> bool: + normalized = self.str_to_bool(value) + if normalized is None: + self.fail( + _( + "{value!r} is not a valid boolean. Recognized values: {states}" + ).format(value=value, states=", ".join(sorted(self.bool_states))), + param, + ctx, + ) + return normalized + + def __repr__(self) -> str: + return "BOOL" + + +class UUIDParameterType(ParamType): + name = "uuid" + + def convert( + self, value: t.Any, param: Parameter | None, ctx: Context | None + ) -> t.Any: + import uuid + + if isinstance(value, uuid.UUID): + return value + + value = value.strip() + + try: + return uuid.UUID(value) + except ValueError: + self.fail( + _("{value!r} is not a valid UUID.").format(value=value), param, ctx + ) + + def __repr__(self) -> str: + return "UUID" + + +class File(ParamType): + """Declares a parameter to be a file for reading or writing. The file + is automatically closed once the context tears down (after the command + finished working). + + Files can be opened for reading or writing. The special value ``-`` + indicates stdin or stdout depending on the mode. + + By default, the file is opened for reading text data, but it can also be + opened in binary mode or for writing. The encoding parameter can be used + to force a specific encoding. + + The `lazy` flag controls if the file should be opened immediately or upon + first IO. The default is to be non-lazy for standard input and output + streams as well as files opened for reading, `lazy` otherwise. When opening a + file lazily for reading, it is still opened temporarily for validation, but + will not be held open until first IO. lazy is mainly useful when opening + for writing to avoid creating the file until it is needed. + + Files can also be opened atomically in which case all writes go into a + separate file in the same folder and upon completion the file will + be moved over to the original location. This is useful if a file + regularly read by other users is modified. + + See :ref:`file-args` for more information. + + .. versionchanged:: 2.0 + Added the ``atomic`` parameter. + """ + + name = "filename" + envvar_list_splitter: t.ClassVar[str] = os.path.pathsep + + def __init__( + self, + mode: str = "r", + encoding: str | None = None, + errors: str | None = "strict", + lazy: bool | None = None, + atomic: bool = False, + ) -> None: + self.mode = mode + self.encoding = encoding + self.errors = errors + self.lazy = lazy + self.atomic = atomic + + def to_info_dict(self) -> dict[str, t.Any]: + info_dict = super().to_info_dict() + info_dict.update(mode=self.mode, encoding=self.encoding) + return info_dict + + def resolve_lazy_flag(self, value: str | os.PathLike[str]) -> bool: + if self.lazy is not None: + return self.lazy + if os.fspath(value) == "-": + return False + elif "w" in self.mode: + return True + return False + + def convert( + self, + value: str | os.PathLike[str] | t.IO[t.Any], + param: Parameter | None, + ctx: Context | None, + ) -> t.IO[t.Any]: + if _is_file_like(value): + return value + + value = t.cast("str | os.PathLike[str]", value) + + try: + lazy = self.resolve_lazy_flag(value) + + if lazy: + lf = LazyFile( + value, self.mode, self.encoding, self.errors, atomic=self.atomic + ) + + if ctx is not None: + ctx.call_on_close(lf.close_intelligently) + + return t.cast("t.IO[t.Any]", lf) + + f, should_close = open_stream( + value, self.mode, self.encoding, self.errors, atomic=self.atomic + ) + + # If a context is provided, we automatically close the file + # at the end of the context execution (or flush out). If a + # context does not exist, it's the caller's responsibility to + # properly close the file. This for instance happens when the + # type is used with prompts. + if ctx is not None: + if should_close: + ctx.call_on_close(safecall(f.close)) + else: + ctx.call_on_close(safecall(f.flush)) + + return f + except OSError as e: + self.fail(f"'{format_filename(value)}': {e.strerror}", param, ctx) + + def shell_complete( + self, ctx: Context, param: Parameter, incomplete: str + ) -> list[CompletionItem]: + """Return a special completion marker that tells the completion + system to use the shell to provide file path completions. + + :param ctx: Invocation context for this command. + :param param: The parameter that is requesting completion. + :param incomplete: Value being completed. May be empty. + + .. versionadded:: 8.0 + """ + from click.shell_completion import CompletionItem + + return [CompletionItem(incomplete, type="file")] + + +def _is_file_like(value: t.Any) -> te.TypeGuard[t.IO[t.Any]]: + return hasattr(value, "read") or hasattr(value, "write") + + +class Path(ParamType): + """The ``Path`` type is similar to the :class:`File` type, but + returns the filename instead of an open file. Various checks can be + enabled to validate the type of file and permissions. + + :param exists: The file or directory needs to exist for the value to + be valid. If this is not set to ``True``, and the file does not + exist, then all further checks are silently skipped. + :param file_okay: Allow a file as a value. + :param dir_okay: Allow a directory as a value. + :param readable: if true, a readable check is performed. + :param writable: if true, a writable check is performed. + :param executable: if true, an executable check is performed. + :param resolve_path: Make the value absolute and resolve any + symlinks. A ``~`` is not expanded, as this is supposed to be + done by the shell only. + :param allow_dash: Allow a single dash as a value, which indicates + a standard stream (but does not open it). Use + :func:`~click.open_file` to handle opening this value. + :param path_type: Convert the incoming path value to this type. If + ``None``, keep Python's default, which is ``str``. Useful to + convert to :class:`pathlib.Path`. + + .. versionchanged:: 8.1 + Added the ``executable`` parameter. + + .. versionchanged:: 8.0 + Allow passing ``path_type=pathlib.Path``. + + .. versionchanged:: 6.0 + Added the ``allow_dash`` parameter. + """ + + envvar_list_splitter: t.ClassVar[str] = os.path.pathsep + + def __init__( + self, + exists: bool = False, + file_okay: bool = True, + dir_okay: bool = True, + writable: bool = False, + readable: bool = True, + resolve_path: bool = False, + allow_dash: bool = False, + path_type: type[t.Any] | None = None, + executable: bool = False, + ): + self.exists = exists + self.file_okay = file_okay + self.dir_okay = dir_okay + self.readable = readable + self.writable = writable + self.executable = executable + self.resolve_path = resolve_path + self.allow_dash = allow_dash + self.type = path_type + + if self.file_okay and not self.dir_okay: + self.name: str = _("file") + elif self.dir_okay and not self.file_okay: + self.name = _("directory") + else: + self.name = _("path") + + def to_info_dict(self) -> dict[str, t.Any]: + info_dict = super().to_info_dict() + info_dict.update( + exists=self.exists, + file_okay=self.file_okay, + dir_okay=self.dir_okay, + writable=self.writable, + readable=self.readable, + allow_dash=self.allow_dash, + ) + return info_dict + + def coerce_path_result( + self, value: str | os.PathLike[str] + ) -> str | bytes | os.PathLike[str]: + if self.type is not None and not isinstance(value, self.type): + if self.type is str: + return os.fsdecode(value) + elif self.type is bytes: + return os.fsencode(value) + else: + return t.cast("os.PathLike[str]", self.type(value)) + + return value + + def convert( + self, + value: str | os.PathLike[str], + param: Parameter | None, + ctx: Context | None, + ) -> str | bytes | os.PathLike[str]: + rv = value + + is_dash = self.file_okay and self.allow_dash and rv in (b"-", "-") + + if not is_dash: + if self.resolve_path: + rv = os.path.realpath(rv) + + try: + st = os.stat(rv) + except OSError: + if not self.exists: + return self.coerce_path_result(rv) + self.fail( + _("{name} {filename!r} does not exist.").format( + name=self.name.title(), filename=format_filename(value) + ), + param, + ctx, + ) + + if not self.file_okay and stat.S_ISREG(st.st_mode): + self.fail( + _("{name} {filename!r} is a file.").format( + name=self.name.title(), filename=format_filename(value) + ), + param, + ctx, + ) + if not self.dir_okay and stat.S_ISDIR(st.st_mode): + self.fail( + _("{name} {filename!r} is a directory.").format( + name=self.name.title(), filename=format_filename(value) + ), + param, + ctx, + ) + + if self.readable and not os.access(rv, os.R_OK): + self.fail( + _("{name} {filename!r} is not readable.").format( + name=self.name.title(), filename=format_filename(value) + ), + param, + ctx, + ) + + if self.writable and not os.access(rv, os.W_OK): + self.fail( + _("{name} {filename!r} is not writable.").format( + name=self.name.title(), filename=format_filename(value) + ), + param, + ctx, + ) + + if self.executable and not os.access(value, os.X_OK): + self.fail( + _("{name} {filename!r} is not executable.").format( + name=self.name.title(), filename=format_filename(value) + ), + param, + ctx, + ) + + return self.coerce_path_result(rv) + + def shell_complete( + self, ctx: Context, param: Parameter, incomplete: str + ) -> list[CompletionItem]: + """Return a special completion marker that tells the completion + system to use the shell to provide path completions for only + directories or any paths. + + :param ctx: Invocation context for this command. + :param param: The parameter that is requesting completion. + :param incomplete: Value being completed. May be empty. + + .. versionadded:: 8.0 + """ + from click.shell_completion import CompletionItem + + type = "dir" if self.dir_okay and not self.file_okay else "file" + return [CompletionItem(incomplete, type=type)] + + +class Tuple(CompositeParamType): + """The default behavior of Click is to apply a type on a value directly. + This works well in most cases, except for when `nargs` is set to a fixed + count and different types should be used for different items. In this + case the :class:`Tuple` type can be used. This type can only be used + if `nargs` is set to a fixed number. + + For more information see :ref:`tuple-type`. + + This can be selected by using a Python tuple literal as a type. + + :param types: a list of types that should be used for the tuple items. + """ + + def __init__(self, types: cabc.Sequence[type[t.Any] | ParamType]) -> None: + self.types: cabc.Sequence[ParamType] = [convert_type(ty) for ty in types] + + def to_info_dict(self) -> dict[str, t.Any]: + info_dict = super().to_info_dict() + info_dict["types"] = [t.to_info_dict() for t in self.types] + return info_dict + + @property + def name(self) -> str: # type: ignore + return f"<{' '.join(ty.name for ty in self.types)}>" + + @property + def arity(self) -> int: # type: ignore + return len(self.types) + + def convert( + self, value: t.Any, param: Parameter | None, ctx: Context | None + ) -> t.Any: + len_type = len(self.types) + len_value = len(value) + + if len_value != len_type: + self.fail( + ngettext( + "{len_type} values are required, but {len_value} was given.", + "{len_type} values are required, but {len_value} were given.", + len_value, + ).format(len_type=len_type, len_value=len_value), + param=param, + ctx=ctx, + ) + + return tuple( + ty(x, param, ctx) for ty, x in zip(self.types, value, strict=False) + ) + + +def convert_type(ty: t.Any | None, default: t.Any | None = None) -> ParamType: + """Find the most appropriate :class:`ParamType` for the given Python + type. If the type isn't provided, it can be inferred from a default + value. + """ + guessed_type = False + + if ty is None and default is not None: + if isinstance(default, (tuple, list)): + # If the default is empty, ty will remain None and will + # return STRING. + if default: + item = default[0] + + # A tuple of tuples needs to detect the inner types. + # Can't call convert recursively because that would + # incorrectly unwind the tuple to a single type. + if isinstance(item, (tuple, list)): + ty = tuple(map(type, item)) + else: + ty = type(item) + else: + ty = type(default) + + guessed_type = True + + if isinstance(ty, tuple): + return Tuple(ty) + + if isinstance(ty, ParamType): + return ty + + if ty is str or ty is None: + return STRING + + if ty is int: + return INT + + if ty is float: + return FLOAT + + if ty is bool: + return BOOL + + if guessed_type: + return STRING + + if __debug__: + try: + if issubclass(ty, ParamType): + raise AssertionError( + f"Attempted to use an uninstantiated parameter type ({ty})." + ) + except TypeError: + # ty is an instance (correct), so issubclass fails. + pass + + return FuncParamType(ty) + + +#: A dummy parameter type that just does nothing. From a user's +#: perspective this appears to just be the same as `STRING` but +#: internally no string conversion takes place if the input was bytes. +#: This is usually useful when working with file paths as they can +#: appear in bytes and unicode. +#: +#: For path related uses the :class:`Path` type is a better choice but +#: there are situations where an unprocessed type is useful which is why +#: it is is provided. +#: +#: .. versionadded:: 4.0 +UNPROCESSED = UnprocessedParamType() + +#: A unicode string parameter type which is the implicit default. This +#: can also be selected by using ``str`` as type. +STRING = StringParamType() + +#: An integer parameter. This can also be selected by using ``int`` as +#: type. +INT = IntParamType() + +#: A floating point value parameter. This can also be selected by using +#: ``float`` as type. +FLOAT = FloatParamType() + +#: A boolean parameter. This is the default for boolean flags. This can +#: also be selected by using ``bool`` as a type. +BOOL = BoolParamType() + +#: A UUID parameter. +UUID = UUIDParameterType() + + +class OptionHelpExtra(t.TypedDict, total=False): + envvars: tuple[str, ...] + default: str + range: str + required: str diff --git a/venv/lib/python3.11/site-packages/click/utils.py b/venv/lib/python3.11/site-packages/click/utils.py new file mode 100644 index 0000000..beae26f --- /dev/null +++ b/venv/lib/python3.11/site-packages/click/utils.py @@ -0,0 +1,627 @@ +from __future__ import annotations + +import collections.abc as cabc +import os +import re +import sys +import typing as t +from functools import update_wrapper +from types import ModuleType +from types import TracebackType + +from ._compat import _default_text_stderr +from ._compat import _default_text_stdout +from ._compat import _find_binary_writer +from ._compat import auto_wrap_for_ansi +from ._compat import binary_streams +from ._compat import open_stream +from ._compat import should_strip_ansi +from ._compat import strip_ansi +from ._compat import text_streams +from ._compat import WIN +from .globals import resolve_color_default + +if t.TYPE_CHECKING: + import typing_extensions as te + + P = te.ParamSpec("P") + +R = t.TypeVar("R") + + +def _posixify(name: str) -> str: + return "-".join(name.split()).lower() + + +def safecall(func: t.Callable[P, R]) -> t.Callable[P, R | None]: + """Wraps a function so that it swallows exceptions.""" + + def wrapper(*args: P.args, **kwargs: P.kwargs) -> R | None: + try: + return func(*args, **kwargs) + except Exception: + pass + return None + + return update_wrapper(wrapper, func) + + +def make_str(value: t.Any) -> str: + """Converts a value into a valid string.""" + if isinstance(value, bytes): + try: + return value.decode(sys.getfilesystemencoding()) + except UnicodeError: + return value.decode("utf-8", "replace") + return str(value) + + +def make_default_short_help(help: str, max_length: int = 45) -> str: + """Returns a condensed version of help string.""" + # Consider only the first paragraph. + paragraph_end = help.find("\n\n") + + if paragraph_end != -1: + help = help[:paragraph_end] + + # Collapse newlines, tabs, and spaces. + words = help.split() + + if not words: + return "" + + # The first paragraph started with a "no rewrap" marker, ignore it. + if words[0] == "\b": + words = words[1:] + + total_length = 0 + last_index = len(words) - 1 + + for i, word in enumerate(words): + total_length += len(word) + (i > 0) + + if total_length > max_length: # too long, truncate + break + + if word[-1] == ".": # sentence end, truncate without "..." + return " ".join(words[: i + 1]) + + if total_length == max_length and i != last_index: + break # not at sentence end, truncate with "..." + else: + return " ".join(words) # no truncation needed + + # Account for the length of the suffix. + total_length += len("...") + + # remove words until the length is short enough + while i > 0: + total_length -= len(words[i]) + (i > 0) + + if total_length <= max_length: + break + + i -= 1 + + return " ".join(words[:i]) + "..." + + +class LazyFile: + """A lazy file works like a regular file but it does not fully open + the file but it does perform some basic checks early to see if the + filename parameter does make sense. This is useful for safely opening + files for writing. + """ + + def __init__( + self, + filename: str | os.PathLike[str], + mode: str = "r", + encoding: str | None = None, + errors: str | None = "strict", + atomic: bool = False, + ): + self.name: str = os.fspath(filename) + self.mode = mode + self.encoding = encoding + self.errors = errors + self.atomic = atomic + self._f: t.IO[t.Any] | None + self.should_close: bool + + if self.name == "-": + self._f, self.should_close = open_stream(filename, mode, encoding, errors) + else: + if "r" in mode: + # Open and close the file in case we're opening it for + # reading so that we can catch at least some errors in + # some cases early. + open(filename, mode).close() + self._f = None + self.should_close = True + + def __getattr__(self, name: str) -> t.Any: + return getattr(self.open(), name) + + def __repr__(self) -> str: + if self._f is not None: + return repr(self._f) + return f"" + + def open(self) -> t.IO[t.Any]: + """Opens the file if it's not yet open. This call might fail with + a :exc:`FileError`. Not handling this error will produce an error + that Click shows. + """ + if self._f is not None: + return self._f + try: + rv, self.should_close = open_stream( + self.name, self.mode, self.encoding, self.errors, atomic=self.atomic + ) + except OSError as e: + from .exceptions import FileError + + raise FileError(self.name, hint=e.strerror) from e + self._f = rv + return rv + + def close(self) -> None: + """Closes the underlying file, no matter what.""" + if self._f is not None: + self._f.close() + + def close_intelligently(self) -> None: + """This function only closes the file if it was opened by the lazy + file wrapper. For instance this will never close stdin. + """ + if self.should_close: + self.close() + + def __enter__(self) -> LazyFile: + return self + + def __exit__( + self, + exc_type: type[BaseException] | None, + exc_value: BaseException | None, + tb: TracebackType | None, + ) -> None: + self.close_intelligently() + + def __iter__(self) -> cabc.Iterator[t.AnyStr]: + self.open() + return iter(self._f) # type: ignore + + +class KeepOpenFile: + def __init__(self, file: t.IO[t.Any]) -> None: + self._file: t.IO[t.Any] = file + + def __getattr__(self, name: str) -> t.Any: + return getattr(self._file, name) + + def __enter__(self) -> KeepOpenFile: + return self + + def __exit__( + self, + exc_type: type[BaseException] | None, + exc_value: BaseException | None, + tb: TracebackType | None, + ) -> None: + pass + + def __repr__(self) -> str: + return repr(self._file) + + def __iter__(self) -> cabc.Iterator[t.AnyStr]: + return iter(self._file) + + +def echo( + message: t.Any | None = None, + file: t.IO[t.Any] | None = None, + nl: bool = True, + err: bool = False, + color: bool | None = None, +) -> None: + """Print a message and newline to stdout or a file. This should be + used instead of :func:`print` because it provides better support + for different data, files, and environments. + + Compared to :func:`print`, this does the following: + + - Ensures that the output encoding is not misconfigured on Linux. + - Supports Unicode in the Windows console. + - Supports writing to binary outputs, and supports writing bytes + to text outputs. + - Supports colors and styles on Windows. + - Removes ANSI color and style codes if the output does not look + like an interactive terminal. + - Always flushes the output. + + :param message: The string or bytes to output. Other objects are + converted to strings. + :param file: The file to write to. Defaults to ``stdout``. + :param err: Write to ``stderr`` instead of ``stdout``. + :param nl: Print a newline after the message. Enabled by default. + :param color: Force showing or hiding colors and other styles. By + default Click will remove color if the output does not look like + an interactive terminal. + + .. versionchanged:: 6.0 + Support Unicode output on the Windows console. Click does not + modify ``sys.stdout``, so ``sys.stdout.write()`` and ``print()`` + will still not support Unicode. + + .. versionchanged:: 4.0 + Added the ``color`` parameter. + + .. versionadded:: 3.0 + Added the ``err`` parameter. + + .. versionchanged:: 2.0 + Support colors on Windows if colorama is installed. + """ + if file is None: + if err: + file = _default_text_stderr() + else: + file = _default_text_stdout() + + # There are no standard streams attached to write to. For example, + # pythonw on Windows. + if file is None: + return + + # Convert non bytes/text into the native string type. + if message is not None and not isinstance(message, (str, bytes, bytearray)): + out: str | bytes | bytearray | None = str(message) + else: + out = message + + if nl: + out = out or "" + if isinstance(out, str): + out += "\n" + else: + out += b"\n" + + if not out: + file.flush() + return + + # If there is a message and the value looks like bytes, we manually + # need to find the binary stream and write the message in there. + # This is done separately so that most stream types will work as you + # would expect. Eg: you can write to StringIO for other cases. + if isinstance(out, (bytes, bytearray)): + binary_file = _find_binary_writer(file) + + if binary_file is not None: + file.flush() + binary_file.write(out) + binary_file.flush() + return + + # ANSI style code support. For no message or bytes, nothing happens. + # When outputting to a file instead of a terminal, strip codes. + else: + color = resolve_color_default(color) + + if should_strip_ansi(file, color): + out = strip_ansi(out) + elif WIN: + if auto_wrap_for_ansi is not None: + file = auto_wrap_for_ansi(file, color) # type: ignore + elif not color: + out = strip_ansi(out) + + file.write(out) # type: ignore + file.flush() + + +def get_binary_stream(name: t.Literal["stdin", "stdout", "stderr"]) -> t.BinaryIO: + """Returns a system stream for byte processing. + + :param name: the name of the stream to open. Valid names are ``'stdin'``, + ``'stdout'`` and ``'stderr'`` + """ + opener = binary_streams.get(name) + if opener is None: + raise TypeError(f"Unknown standard stream '{name}'") + return opener() + + +def get_text_stream( + name: t.Literal["stdin", "stdout", "stderr"], + encoding: str | None = None, + errors: str | None = "strict", +) -> t.TextIO: + """Returns a system stream for text processing. This usually returns + a wrapped stream around a binary stream returned from + :func:`get_binary_stream` but it also can take shortcuts for already + correctly configured streams. + + :param name: the name of the stream to open. Valid names are ``'stdin'``, + ``'stdout'`` and ``'stderr'`` + :param encoding: overrides the detected default encoding. + :param errors: overrides the default error mode. + """ + opener = text_streams.get(name) + if opener is None: + raise TypeError(f"Unknown standard stream '{name}'") + return opener(encoding, errors) + + +def open_file( + filename: str | os.PathLike[str], + mode: str = "r", + encoding: str | None = None, + errors: str | None = "strict", + lazy: bool = False, + atomic: bool = False, +) -> t.IO[t.Any]: + """Open a file, with extra behavior to handle ``'-'`` to indicate + a standard stream, lazy open on write, and atomic write. Similar to + the behavior of the :class:`~click.File` param type. + + If ``'-'`` is given to open ``stdout`` or ``stdin``, the stream is + wrapped so that using it in a context manager will not close it. + This makes it possible to use the function without accidentally + closing a standard stream: + + .. code-block:: python + + with open_file(filename) as f: + ... + + :param filename: The name or Path of the file to open, or ``'-'`` for + ``stdin``/``stdout``. + :param mode: The mode in which to open the file. + :param encoding: The encoding to decode or encode a file opened in + text mode. + :param errors: The error handling mode. + :param lazy: Wait to open the file until it is accessed. For read + mode, the file is temporarily opened to raise access errors + early, then closed until it is read again. + :param atomic: Write to a temporary file and replace the given file + on close. + + .. versionadded:: 3.0 + """ + if lazy: + return t.cast( + "t.IO[t.Any]", LazyFile(filename, mode, encoding, errors, atomic=atomic) + ) + + f, should_close = open_stream(filename, mode, encoding, errors, atomic=atomic) + + if not should_close: + f = t.cast("t.IO[t.Any]", KeepOpenFile(f)) + + return f + + +def format_filename( + filename: str | bytes | os.PathLike[str] | os.PathLike[bytes], + shorten: bool = False, +) -> str: + """Format a filename as a string for display. Ensures the filename can be + displayed by replacing any invalid bytes or surrogate escapes in the name + with the replacement character ``�``. + + Invalid bytes or surrogate escapes will raise an error when written to a + stream with ``errors="strict"``. This will typically happen with ``stdout`` + when the locale is something like ``en_GB.UTF-8``. + + Many scenarios *are* safe to write surrogates though, due to PEP 538 and + PEP 540, including: + + - Writing to ``stderr``, which uses ``errors="backslashreplace"``. + - The system has ``LANG=C.UTF-8``, ``C``, or ``POSIX``. Python opens + stdout and stderr with ``errors="surrogateescape"``. + - None of ``LANG/LC_*`` are set. Python assumes ``LANG=C.UTF-8``. + - Python is started in UTF-8 mode with ``PYTHONUTF8=1`` or ``-X utf8``. + Python opens stdout and stderr with ``errors="surrogateescape"``. + + :param filename: formats a filename for UI display. This will also convert + the filename into unicode without failing. + :param shorten: this optionally shortens the filename to strip of the + path that leads up to it. + """ + if shorten: + filename = os.path.basename(filename) + else: + filename = os.fspath(filename) + + if isinstance(filename, bytes): + filename = filename.decode(sys.getfilesystemencoding(), "replace") + else: + filename = filename.encode("utf-8", "surrogateescape").decode( + "utf-8", "replace" + ) + + return filename + + +def get_app_dir(app_name: str, roaming: bool = True, force_posix: bool = False) -> str: + r"""Returns the config folder for the application. The default behavior + is to return whatever is most appropriate for the operating system. + + To give you an idea, for an app called ``"Foo Bar"``, something like + the following folders could be returned: + + Mac OS X: + ``~/Library/Application Support/Foo Bar`` + Mac OS X (POSIX): + ``~/.foo-bar`` + Unix: + ``~/.config/foo-bar`` + Unix (POSIX): + ``~/.foo-bar`` + Windows (roaming): + ``C:\Users\\AppData\Roaming\Foo Bar`` + Windows (not roaming): + ``C:\Users\\AppData\Local\Foo Bar`` + + .. versionadded:: 2.0 + + :param app_name: the application name. This should be properly capitalized + and can contain whitespace. + :param roaming: controls if the folder should be roaming or not on Windows. + Has no effect otherwise. + :param force_posix: if this is set to `True` then on any POSIX system the + folder will be stored in the home folder with a leading + dot instead of the XDG config home or darwin's + application support folder. + """ + if WIN: + key = "APPDATA" if roaming else "LOCALAPPDATA" + folder = os.environ.get(key) + if folder is None: + folder = os.path.expanduser("~") + return os.path.join(folder, app_name) + if force_posix: + return os.path.join(os.path.expanduser(f"~/.{_posixify(app_name)}")) + if sys.platform == "darwin": + return os.path.join( + os.path.expanduser("~/Library/Application Support"), app_name + ) + return os.path.join( + os.environ.get("XDG_CONFIG_HOME", os.path.expanduser("~/.config")), + _posixify(app_name), + ) + + +class PacifyFlushWrapper: + """This wrapper is used to catch and suppress BrokenPipeErrors resulting + from ``.flush()`` being called on broken pipe during the shutdown/final-GC + of the Python interpreter. Notably ``.flush()`` is always called on + ``sys.stdout`` and ``sys.stderr``. So as to have minimal impact on any + other cleanup code, and the case where the underlying file is not a broken + pipe, all calls and attributes are proxied. + """ + + def __init__(self, wrapped: t.IO[t.Any]) -> None: + self.wrapped = wrapped + + def flush(self) -> None: + try: + self.wrapped.flush() + except OSError as e: + import errno + + if e.errno != errno.EPIPE: + raise + + def __getattr__(self, attr: str) -> t.Any: + return getattr(self.wrapped, attr) + + +def _detect_program_name( + path: str | None = None, _main: ModuleType | None = None +) -> str: + """Determine the command used to run the program, for use in help + text. If a file or entry point was executed, the file name is + returned. If ``python -m`` was used to execute a module or package, + ``python -m name`` is returned. + + This doesn't try to be too precise, the goal is to give a concise + name for help text. Files are only shown as their name without the + path. ``python`` is only shown for modules, and the full path to + ``sys.executable`` is not shown. + + :param path: The Python file being executed. Python puts this in + ``sys.argv[0]``, which is used by default. + :param _main: The ``__main__`` module. This should only be passed + during internal testing. + + .. versionadded:: 8.0 + Based on command args detection in the Werkzeug reloader. + + :meta private: + """ + if _main is None: + _main = sys.modules["__main__"] + + if not path: + path = sys.argv[0] + + # The value of __package__ indicates how Python was called. It may + # not exist if a setuptools script is installed as an egg. It may be + # set incorrectly for entry points created with pip on Windows. + # It is set to "" inside a Shiv or PEX zipapp. + if getattr(_main, "__package__", None) in {None, ""} or ( + os.name == "nt" + and _main.__package__ == "" + and not os.path.exists(path) + and os.path.exists(f"{path}.exe") + ): + # Executed a file, like "python app.py". + return os.path.basename(path) + + # Executed a module, like "python -m example". + # Rewritten by Python from "-m script" to "/path/to/script.py". + # Need to look at main module to determine how it was executed. + py_module = t.cast(str, _main.__package__) + name = os.path.splitext(os.path.basename(path))[0] + + # A submodule like "example.cli". + if name != "__main__": + py_module = f"{py_module}.{name}" + + return f"python -m {py_module.lstrip('.')}" + + +def _expand_args( + args: cabc.Iterable[str], + *, + user: bool = True, + env: bool = True, + glob_recursive: bool = True, +) -> list[str]: + """Simulate Unix shell expansion with Python functions. + + See :func:`glob.glob`, :func:`os.path.expanduser`, and + :func:`os.path.expandvars`. + + This is intended for use on Windows, where the shell does not do any + expansion. It may not exactly match what a Unix shell would do. + + :param args: List of command line arguments to expand. + :param user: Expand user home directory. + :param env: Expand environment variables. + :param glob_recursive: ``**`` matches directories recursively. + + .. versionchanged:: 8.1 + Invalid glob patterns are treated as empty expansions rather + than raising an error. + + .. versionadded:: 8.0 + + :meta private: + """ + from glob import glob + + out = [] + + for arg in args: + if user: + arg = os.path.expanduser(arg) + + if env: + arg = os.path.expandvars(arg) + + try: + matches = glob(arg, recursive=glob_recursive) + except re.error: + matches = [] + + if not matches: + out.append(arg) + else: + out.extend(matches) + + return out diff --git a/venv/lib/python3.11/site-packages/cryptography-46.0.3.dist-info/INSTALLER b/venv/lib/python3.11/site-packages/cryptography-46.0.3.dist-info/INSTALLER new file mode 100644 index 0000000..a1b589e --- /dev/null +++ b/venv/lib/python3.11/site-packages/cryptography-46.0.3.dist-info/INSTALLER @@ -0,0 +1 @@ +pip diff --git a/venv/lib/python3.11/site-packages/cryptography-46.0.3.dist-info/METADATA b/venv/lib/python3.11/site-packages/cryptography-46.0.3.dist-info/METADATA new file mode 100644 index 0000000..7b07ee7 --- /dev/null +++ b/venv/lib/python3.11/site-packages/cryptography-46.0.3.dist-info/METADATA @@ -0,0 +1,139 @@ +Metadata-Version: 2.4 +Name: cryptography +Version: 46.0.3 +Classifier: Development Status :: 5 - Production/Stable +Classifier: Intended Audience :: Developers +Classifier: Natural Language :: English +Classifier: Operating System :: MacOS :: MacOS X +Classifier: Operating System :: POSIX +Classifier: Operating System :: POSIX :: BSD +Classifier: Operating System :: POSIX :: Linux +Classifier: Operating System :: Microsoft :: Windows +Classifier: Programming Language :: Python +Classifier: Programming Language :: Python :: 3 +Classifier: Programming Language :: Python :: 3 :: Only +Classifier: Programming Language :: Python :: 3.8 +Classifier: Programming Language :: Python :: 3.9 +Classifier: Programming Language :: Python :: 3.10 +Classifier: Programming Language :: Python :: 3.11 +Classifier: Programming Language :: Python :: 3.12 +Classifier: Programming Language :: Python :: 3.13 +Classifier: Programming Language :: Python :: 3.14 +Classifier: Programming Language :: Python :: Implementation :: CPython +Classifier: Programming Language :: Python :: Implementation :: PyPy +Classifier: Programming Language :: Python :: Free Threading :: 3 - Stable +Classifier: Topic :: Security :: Cryptography +Requires-Dist: cffi>=1.14 ; python_full_version == '3.8.*' and platform_python_implementation != 'PyPy' +Requires-Dist: cffi>=2.0.0 ; python_full_version >= '3.9' and platform_python_implementation != 'PyPy' +Requires-Dist: typing-extensions>=4.13.2 ; python_full_version < '3.11' +Requires-Dist: bcrypt>=3.1.5 ; extra == 'ssh' +Requires-Dist: nox[uv]>=2024.4.15 ; extra == 'nox' +Requires-Dist: cryptography-vectors==46.0.3 ; extra == 'test' +Requires-Dist: pytest>=7.4.0 ; extra == 'test' +Requires-Dist: pytest-benchmark>=4.0 ; extra == 'test' +Requires-Dist: pytest-cov>=2.10.1 ; extra == 'test' +Requires-Dist: pytest-xdist>=3.5.0 ; extra == 'test' +Requires-Dist: pretend>=0.7 ; extra == 'test' +Requires-Dist: certifi>=2024 ; extra == 'test' +Requires-Dist: pytest-randomly ; extra == 'test-randomorder' +Requires-Dist: sphinx>=5.3.0 ; extra == 'docs' +Requires-Dist: sphinx-rtd-theme>=3.0.0 ; extra == 'docs' +Requires-Dist: sphinx-inline-tabs ; extra == 'docs' +Requires-Dist: pyenchant>=3 ; extra == 'docstest' +Requires-Dist: readme-renderer>=30.0 ; extra == 'docstest' +Requires-Dist: sphinxcontrib-spelling>=7.3.1 ; extra == 'docstest' +Requires-Dist: build>=1.0.0 ; extra == 'sdist' +Requires-Dist: ruff>=0.11.11 ; extra == 'pep8test' +Requires-Dist: mypy>=1.14 ; extra == 'pep8test' +Requires-Dist: check-sdist ; extra == 'pep8test' +Requires-Dist: click>=8.0.1 ; extra == 'pep8test' +Provides-Extra: ssh +Provides-Extra: nox +Provides-Extra: test +Provides-Extra: test-randomorder +Provides-Extra: docs +Provides-Extra: docstest +Provides-Extra: sdist +Provides-Extra: pep8test +License-File: LICENSE +License-File: LICENSE.APACHE +License-File: LICENSE.BSD +Summary: cryptography is a package which provides cryptographic recipes and primitives to Python developers. +Author-email: The Python Cryptographic Authority and individual contributors +License-Expression: Apache-2.0 OR BSD-3-Clause +Requires-Python: >=3.8, !=3.9.0, !=3.9.1 +Description-Content-Type: text/x-rst; charset=UTF-8 +Project-URL: homepage, https://github.com/pyca/cryptography +Project-URL: documentation, https://cryptography.io/ +Project-URL: source, https://github.com/pyca/cryptography/ +Project-URL: issues, https://github.com/pyca/cryptography/issues +Project-URL: changelog, https://cryptography.io/en/latest/changelog/ + +pyca/cryptography +================= + +.. image:: https://img.shields.io/pypi/v/cryptography.svg + :target: https://pypi.org/project/cryptography/ + :alt: Latest Version + +.. image:: https://readthedocs.org/projects/cryptography/badge/?version=latest + :target: https://cryptography.io + :alt: Latest Docs + +.. image:: https://github.com/pyca/cryptography/actions/workflows/ci.yml/badge.svg + :target: https://github.com/pyca/cryptography/actions/workflows/ci.yml?query=branch%3Amain + +``cryptography`` is a package which provides cryptographic recipes and +primitives to Python developers. Our goal is for it to be your "cryptographic +standard library". It supports Python 3.8+ and PyPy3 7.3.11+. + +``cryptography`` includes both high level recipes and low level interfaces to +common cryptographic algorithms such as symmetric ciphers, message digests, and +key derivation functions. For example, to encrypt something with +``cryptography``'s high level symmetric encryption recipe: + +.. code-block:: pycon + + >>> from cryptography.fernet import Fernet + >>> # Put this somewhere safe! + >>> key = Fernet.generate_key() + >>> f = Fernet(key) + >>> token = f.encrypt(b"A really secret message. Not for prying eyes.") + >>> token + b'...' + >>> f.decrypt(token) + b'A really secret message. Not for prying eyes.' + +You can find more information in the `documentation`_. + +You can install ``cryptography`` with: + +.. code-block:: console + + $ pip install cryptography + +For full details see `the installation documentation`_. + +Discussion +~~~~~~~~~~ + +If you run into bugs, you can file them in our `issue tracker`_. + +We maintain a `cryptography-dev`_ mailing list for development discussion. + +You can also join ``#pyca`` on ``irc.libera.chat`` to ask questions or get +involved. + +Security +~~~~~~~~ + +Need to report a security issue? Please consult our `security reporting`_ +documentation. + + +.. _`documentation`: https://cryptography.io/ +.. _`the installation documentation`: https://cryptography.io/en/latest/installation/ +.. _`issue tracker`: https://github.com/pyca/cryptography/issues +.. _`cryptography-dev`: https://mail.python.org/mailman/listinfo/cryptography-dev +.. _`security reporting`: https://cryptography.io/en/latest/security/ + diff --git a/venv/lib/python3.11/site-packages/cryptography-46.0.3.dist-info/RECORD b/venv/lib/python3.11/site-packages/cryptography-46.0.3.dist-info/RECORD new file mode 100644 index 0000000..022d32c --- /dev/null +++ b/venv/lib/python3.11/site-packages/cryptography-46.0.3.dist-info/RECORD @@ -0,0 +1,180 @@ +cryptography-46.0.3.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 +cryptography-46.0.3.dist-info/METADATA,sha256=bx2LyCEmOVUC8FH5hsGEZewWPiZoIIYTq0hM9mu9r4s,5748 +cryptography-46.0.3.dist-info/RECORD,, +cryptography-46.0.3.dist-info/WHEEL,sha256=jkxrJemT4jZpYSr-u9xPalWqoow8benNmiXfjKXLlJw,108 +cryptography-46.0.3.dist-info/licenses/LICENSE,sha256=Pgx8CRqUi4JTO6mP18u0BDLW8amsv4X1ki0vmak65rs,197 +cryptography-46.0.3.dist-info/licenses/LICENSE.APACHE,sha256=qsc7MUj20dcRHbyjIJn2jSbGRMaBOuHk8F9leaomY_4,11360 +cryptography-46.0.3.dist-info/licenses/LICENSE.BSD,sha256=YCxMdILeZHndLpeTzaJ15eY9dz2s0eymiSMqtwCPtPs,1532 +cryptography/__about__.py,sha256=QCLxNH_Abbygdc9RQGpUmrK14Wp3Cl_SEiB2byLwyxo,445 +cryptography/__init__.py,sha256=mthuUrTd4FROCpUYrTIqhjz6s6T9djAZrV7nZ1oMm2o,364 +cryptography/__pycache__/__about__.cpython-311.pyc,, +cryptography/__pycache__/__init__.cpython-311.pyc,, +cryptography/__pycache__/exceptions.cpython-311.pyc,, +cryptography/__pycache__/fernet.cpython-311.pyc,, +cryptography/__pycache__/utils.cpython-311.pyc,, +cryptography/exceptions.py,sha256=835EWILc2fwxw-gyFMriciC2SqhViETB10LBSytnDIc,1087 +cryptography/fernet.py,sha256=3Cvxkh0KJSbX8HbnCHu4wfCW7U0GgfUA3v_qQ8a8iWc,6963 +cryptography/hazmat/__init__.py,sha256=5IwrLWrVp0AjEr_4FdWG_V057NSJGY_W4egNNsuct0g,455 +cryptography/hazmat/__pycache__/__init__.cpython-311.pyc,, +cryptography/hazmat/__pycache__/_oid.cpython-311.pyc,, +cryptography/hazmat/_oid.py,sha256=p8ThjwJB56Ci_rAIrjyJ1f8VjgD6e39es2dh8JIUBOw,17240 +cryptography/hazmat/asn1/__init__.py,sha256=hS_EWx3wVvZzfbCcNV8hzcDnyMM8H-BhIoS1TipUosk,293 +cryptography/hazmat/asn1/__pycache__/__init__.cpython-311.pyc,, +cryptography/hazmat/asn1/__pycache__/asn1.cpython-311.pyc,, +cryptography/hazmat/asn1/asn1.py,sha256=eMEThEXa19LQjcyVofgHsW6tsZnjp3ddH7bWkkcxfLM,3860 +cryptography/hazmat/backends/__init__.py,sha256=O5jvKFQdZnXhKeqJ-HtulaEL9Ni7mr1mDzZY5kHlYhI,361 +cryptography/hazmat/backends/__pycache__/__init__.cpython-311.pyc,, +cryptography/hazmat/backends/openssl/__init__.py,sha256=p3jmJfnCag9iE5sdMrN6VvVEu55u46xaS_IjoI0SrmA,305 +cryptography/hazmat/backends/openssl/__pycache__/__init__.cpython-311.pyc,, +cryptography/hazmat/backends/openssl/__pycache__/backend.cpython-311.pyc,, +cryptography/hazmat/backends/openssl/backend.py,sha256=tV5AxBoFJ2GfA0DMWSY-0TxQJrpQoexzI9R4Kybb--4,10215 +cryptography/hazmat/bindings/__init__.py,sha256=s9oKCQ2ycFdXoERdS1imafueSkBsL9kvbyfghaauZ9Y,180 +cryptography/hazmat/bindings/__pycache__/__init__.cpython-311.pyc,, +cryptography/hazmat/bindings/_rust.abi3.so,sha256=4bUN0J2p_ZQMdgmAc9eL0VMj_lgbTsHUmX4doekVIJ4,12955672 +cryptography/hazmat/bindings/_rust/__init__.pyi,sha256=KhqLhXFPArPzzJ7DYO9Fl8FoXB_BagAd_r4Dm_Ze9Xo,1257 +cryptography/hazmat/bindings/_rust/_openssl.pyi,sha256=mpNJLuYLbCVrd5i33FBTmWwL_55Dw7JPkSLlSX9Q7oI,230 +cryptography/hazmat/bindings/_rust/asn1.pyi,sha256=BrGjC8J6nwuS-r3EVcdXJB8ndotfY9mbQYOfpbPG0HA,354 +cryptography/hazmat/bindings/_rust/declarative_asn1.pyi,sha256=2ECFmYue1EPkHEE2Bm7aLwkjB0mSUTpr23v9MN4pri4,892 +cryptography/hazmat/bindings/_rust/exceptions.pyi,sha256=exXr2xw_0pB1kk93cYbM3MohbzoUkjOms1ZMUi0uQZE,640 +cryptography/hazmat/bindings/_rust/ocsp.pyi,sha256=VPVWuKHI9EMs09ZLRYAGvR0Iz0mCMmEzXAkgJHovpoM,4020 +cryptography/hazmat/bindings/_rust/openssl/__init__.pyi,sha256=iOAMDyHoNwwCSZfZzuXDr64g4GpGUeDgEN-LjXqdrBM,1522 +cryptography/hazmat/bindings/_rust/openssl/aead.pyi,sha256=4Nddw6-ynzIB3w2W86WvkGKTLlTDk_6F5l54RHCuy3E,2688 +cryptography/hazmat/bindings/_rust/openssl/ciphers.pyi,sha256=LhPzHWSXJq4grAJXn6zSvSSdV-aYIIscHDwIPlJGGPs,1315 +cryptography/hazmat/bindings/_rust/openssl/cmac.pyi,sha256=nPH0X57RYpsAkRowVpjQiHE566ThUTx7YXrsadmrmHk,564 +cryptography/hazmat/bindings/_rust/openssl/dh.pyi,sha256=Z3TC-G04-THtSdAOPLM1h2G7ml5bda1ElZUcn5wpuhk,1564 +cryptography/hazmat/bindings/_rust/openssl/dsa.pyi,sha256=qBtkgj2albt2qFcnZ9UDrhzoNhCVO7HTby5VSf1EXMI,1299 +cryptography/hazmat/bindings/_rust/openssl/ec.pyi,sha256=zJy0pRa5n-_p2dm45PxECB_-B6SVZyNKfjxFDpPqT38,1691 +cryptography/hazmat/bindings/_rust/openssl/ed25519.pyi,sha256=VXfXd5G6hUivg399R1DYdmW3eTb0EebzDTqjRC2gaRw,532 +cryptography/hazmat/bindings/_rust/openssl/ed448.pyi,sha256=Yx49lqdnjsD7bxiDV1kcaMrDktug5evi5a6zerMiy2s,514 +cryptography/hazmat/bindings/_rust/openssl/hashes.pyi,sha256=OWZvBx7xfo_HJl41Nc--DugVyCVPIprZ3HlOPTSWH9g,984 +cryptography/hazmat/bindings/_rust/openssl/hmac.pyi,sha256=BXZn7NDjL3JAbYW0SQ8pg1iyC5DbQXVhUAiwsi8DFR8,702 +cryptography/hazmat/bindings/_rust/openssl/kdf.pyi,sha256=xXfFBb9QehHfDtEaxV_65Z0YK7NquOVIChpTLkgAs_k,2029 +cryptography/hazmat/bindings/_rust/openssl/keys.pyi,sha256=teIt8M6ZEMJrn4s3W0UnW0DZ-30Jd68WnSsKKG124l0,912 +cryptography/hazmat/bindings/_rust/openssl/poly1305.pyi,sha256=_SW9NtQ5FDlAbdclFtWpT4lGmxKIKHpN-4j8J2BzYfQ,585 +cryptography/hazmat/bindings/_rust/openssl/rsa.pyi,sha256=2OQCNSXkxgc-3uw1xiCCloIQTV6p9_kK79Yu0rhZgPc,1364 +cryptography/hazmat/bindings/_rust/openssl/x25519.pyi,sha256=ewn4GpQyb7zPwE-ni7GtyQgMC0A1mLuqYsSyqv6nI_s,523 +cryptography/hazmat/bindings/_rust/openssl/x448.pyi,sha256=juTZTmli8jO_5Vcufg-vHvx_tCyezmSLIh_9PU3TczI,505 +cryptography/hazmat/bindings/_rust/pkcs12.pyi,sha256=vEEd5wDiZvb8ZGFaziLCaWLzAwoG_tvPUxLQw5_uOl8,1605 +cryptography/hazmat/bindings/_rust/pkcs7.pyi,sha256=txGBJijqZshEcqra6byPNbnisIdlxzOSIHP2hl9arPs,1601 +cryptography/hazmat/bindings/_rust/test_support.pyi,sha256=PPhld-WkO743iXFPebeG0LtgK0aTzGdjcIsay1Gm5GE,757 +cryptography/hazmat/bindings/_rust/x509.pyi,sha256=n9X0IQ6ICbdIi-ExdCFZoBgeY6njm3QOVAVZwDQdnbk,9784 +cryptography/hazmat/bindings/openssl/__init__.py,sha256=s9oKCQ2ycFdXoERdS1imafueSkBsL9kvbyfghaauZ9Y,180 +cryptography/hazmat/bindings/openssl/__pycache__/__init__.cpython-311.pyc,, +cryptography/hazmat/bindings/openssl/__pycache__/_conditional.cpython-311.pyc,, +cryptography/hazmat/bindings/openssl/__pycache__/binding.cpython-311.pyc,, +cryptography/hazmat/bindings/openssl/_conditional.py,sha256=DMOpA_XN4l70zTc5_J9DpwlbQeUBRTWpfIJ4yRIn1-U,5791 +cryptography/hazmat/bindings/openssl/binding.py,sha256=x8eocEmukO4cm7cHqfVmOoYY7CCXdoF1v1WhZQt9neo,4610 +cryptography/hazmat/decrepit/__init__.py,sha256=wHCbWfaefa-fk6THSw9th9fJUsStJo7245wfFBqmduA,216 +cryptography/hazmat/decrepit/__pycache__/__init__.cpython-311.pyc,, +cryptography/hazmat/decrepit/ciphers/__init__.py,sha256=wHCbWfaefa-fk6THSw9th9fJUsStJo7245wfFBqmduA,216 +cryptography/hazmat/decrepit/ciphers/__pycache__/__init__.cpython-311.pyc,, +cryptography/hazmat/decrepit/ciphers/__pycache__/algorithms.cpython-311.pyc,, +cryptography/hazmat/decrepit/ciphers/algorithms.py,sha256=YrKgHS4MfwWaMmPBYRymRRlC0phwWp9ycICFezeJPGk,2595 +cryptography/hazmat/primitives/__init__.py,sha256=s9oKCQ2ycFdXoERdS1imafueSkBsL9kvbyfghaauZ9Y,180 +cryptography/hazmat/primitives/__pycache__/__init__.cpython-311.pyc,, +cryptography/hazmat/primitives/__pycache__/_asymmetric.cpython-311.pyc,, +cryptography/hazmat/primitives/__pycache__/_cipheralgorithm.cpython-311.pyc,, +cryptography/hazmat/primitives/__pycache__/_serialization.cpython-311.pyc,, +cryptography/hazmat/primitives/__pycache__/cmac.cpython-311.pyc,, +cryptography/hazmat/primitives/__pycache__/constant_time.cpython-311.pyc,, +cryptography/hazmat/primitives/__pycache__/hashes.cpython-311.pyc,, +cryptography/hazmat/primitives/__pycache__/hmac.cpython-311.pyc,, +cryptography/hazmat/primitives/__pycache__/keywrap.cpython-311.pyc,, +cryptography/hazmat/primitives/__pycache__/padding.cpython-311.pyc,, +cryptography/hazmat/primitives/__pycache__/poly1305.cpython-311.pyc,, +cryptography/hazmat/primitives/_asymmetric.py,sha256=RhgcouUB6HTiFDBrR1LxqkMjpUxIiNvQ1r_zJjRG6qQ,532 +cryptography/hazmat/primitives/_cipheralgorithm.py,sha256=Eh3i7lwedHfi0eLSsH93PZxQKzY9I6lkK67vL4V5tOc,1522 +cryptography/hazmat/primitives/_serialization.py,sha256=chgPCSF2jxI2Cr5gB-qbWXOvOfupBh4CARS0KAhv9AM,5123 +cryptography/hazmat/primitives/asymmetric/__init__.py,sha256=s9oKCQ2ycFdXoERdS1imafueSkBsL9kvbyfghaauZ9Y,180 +cryptography/hazmat/primitives/asymmetric/__pycache__/__init__.cpython-311.pyc,, +cryptography/hazmat/primitives/asymmetric/__pycache__/dh.cpython-311.pyc,, +cryptography/hazmat/primitives/asymmetric/__pycache__/dsa.cpython-311.pyc,, +cryptography/hazmat/primitives/asymmetric/__pycache__/ec.cpython-311.pyc,, +cryptography/hazmat/primitives/asymmetric/__pycache__/ed25519.cpython-311.pyc,, +cryptography/hazmat/primitives/asymmetric/__pycache__/ed448.cpython-311.pyc,, +cryptography/hazmat/primitives/asymmetric/__pycache__/padding.cpython-311.pyc,, +cryptography/hazmat/primitives/asymmetric/__pycache__/rsa.cpython-311.pyc,, +cryptography/hazmat/primitives/asymmetric/__pycache__/types.cpython-311.pyc,, +cryptography/hazmat/primitives/asymmetric/__pycache__/utils.cpython-311.pyc,, +cryptography/hazmat/primitives/asymmetric/__pycache__/x25519.cpython-311.pyc,, +cryptography/hazmat/primitives/asymmetric/__pycache__/x448.cpython-311.pyc,, +cryptography/hazmat/primitives/asymmetric/dh.py,sha256=0v_vEFFz5pQ1QG-FkWDyvgv7IfuVZSH5Q6LyFI5A8rg,3645 +cryptography/hazmat/primitives/asymmetric/dsa.py,sha256=Ld_bbbqQFz12dObHxIkzEQzX0SWWP41RLSWkYSaKhqE,4213 +cryptography/hazmat/primitives/asymmetric/ec.py,sha256=Vf5ig2PcS3PVnsb5N49Kx1uIkFBJyhg4BWXThDz5cug,12999 +cryptography/hazmat/primitives/asymmetric/ed25519.py,sha256=jZW5cs472wXXV3eB0sE1b8w64gdazwwU0_MT5UOTiXs,3700 +cryptography/hazmat/primitives/asymmetric/ed448.py,sha256=yAetgn2f2JYf0BO8MapGzXeThsvSMG5LmUCrxVOidAA,3729 +cryptography/hazmat/primitives/asymmetric/padding.py,sha256=vQ6l6gOg9HqcbOsvHrSiJRVLdEj9L4m4HkRGYziTyFA,2854 +cryptography/hazmat/primitives/asymmetric/rsa.py,sha256=ZnKOo2f34MCCOupC03Y1uR-_jiSG5IrelHEmxaME3D4,8303 +cryptography/hazmat/primitives/asymmetric/types.py,sha256=LnsOJym-wmPUJ7Knu_7bCNU3kIiELCd6krOaW_JU08I,2996 +cryptography/hazmat/primitives/asymmetric/utils.py,sha256=DPTs6T4F-UhwzFQTh-1fSEpQzazH2jf2xpIro3ItF4o,790 +cryptography/hazmat/primitives/asymmetric/x25519.py,sha256=_4nQeZ3yJ3Lg0RpXnaqA-1yt6vbx1F-wzLcaZHwSpeE,3613 +cryptography/hazmat/primitives/asymmetric/x448.py,sha256=WKBLtuVfJqiBRro654fGaQAlvsKbqbNkK7c4A_ZCdV0,3642 +cryptography/hazmat/primitives/ciphers/__init__.py,sha256=eyEXmjk6_CZXaOPYDr7vAYGXr29QvzgWL2-4CSolLFs,680 +cryptography/hazmat/primitives/ciphers/__pycache__/__init__.cpython-311.pyc,, +cryptography/hazmat/primitives/ciphers/__pycache__/aead.cpython-311.pyc,, +cryptography/hazmat/primitives/ciphers/__pycache__/algorithms.cpython-311.pyc,, +cryptography/hazmat/primitives/ciphers/__pycache__/base.cpython-311.pyc,, +cryptography/hazmat/primitives/ciphers/__pycache__/modes.cpython-311.pyc,, +cryptography/hazmat/primitives/ciphers/aead.py,sha256=Fzlyx7w8KYQakzDp1zWgJnIr62zgZrgVh1u2h4exB54,634 +cryptography/hazmat/primitives/ciphers/algorithms.py,sha256=Q7ZJwcsx83Mgxv5y7r6CyJKSdsOwC-my-5A67-ma2vw,3407 +cryptography/hazmat/primitives/ciphers/base.py,sha256=aBC7HHBBoixebmparVr0UlODs3VD0A7B6oz_AaRjDv8,4253 +cryptography/hazmat/primitives/ciphers/modes.py,sha256=20stpwhDtbAvpH0SMf9EDHIciwmTF-JMBUOZ9bU8WiQ,8318 +cryptography/hazmat/primitives/cmac.py,sha256=sz_s6H_cYnOvx-VNWdIKhRhe3Ymp8z8J0D3CBqOX3gg,338 +cryptography/hazmat/primitives/constant_time.py,sha256=xdunWT0nf8OvKdcqUhhlFKayGp4_PgVJRU2W1wLSr_A,422 +cryptography/hazmat/primitives/hashes.py,sha256=M8BrlKB3U6DEtHvWTV5VRjpteHv1kS3Zxm_Bsk04cr8,5184 +cryptography/hazmat/primitives/hmac.py,sha256=RpB3z9z5skirCQrm7zQbtnp9pLMnAjrlTUvKqF5aDDc,423 +cryptography/hazmat/primitives/kdf/__init__.py,sha256=4XibZnrYq4hh5xBjWiIXzaYW6FKx8hPbVaa_cB9zS64,750 +cryptography/hazmat/primitives/kdf/__pycache__/__init__.cpython-311.pyc,, +cryptography/hazmat/primitives/kdf/__pycache__/argon2.cpython-311.pyc,, +cryptography/hazmat/primitives/kdf/__pycache__/concatkdf.cpython-311.pyc,, +cryptography/hazmat/primitives/kdf/__pycache__/hkdf.cpython-311.pyc,, +cryptography/hazmat/primitives/kdf/__pycache__/kbkdf.cpython-311.pyc,, +cryptography/hazmat/primitives/kdf/__pycache__/pbkdf2.cpython-311.pyc,, +cryptography/hazmat/primitives/kdf/__pycache__/scrypt.cpython-311.pyc,, +cryptography/hazmat/primitives/kdf/__pycache__/x963kdf.cpython-311.pyc,, +cryptography/hazmat/primitives/kdf/argon2.py,sha256=UFDNXG0v-rw3DqAQTB1UQAsQC2M5Ejg0k_6OCyhLKus,460 +cryptography/hazmat/primitives/kdf/concatkdf.py,sha256=Ua8KoLXXnzgsrAUmHpyKymaPt8aPRP0EHEaBz7QCQ9I,3737 +cryptography/hazmat/primitives/kdf/hkdf.py,sha256=M0lAEfRoc4kpp4-nwDj9yB-vNZukIOYEQrUlWsBNn9o,543 +cryptography/hazmat/primitives/kdf/kbkdf.py,sha256=oZepvo4evhKkkJQWRDwaPoIbyTaFmDc5NPimxg6lfKg,9165 +cryptography/hazmat/primitives/kdf/pbkdf2.py,sha256=1WIwhELR0w8ztTpTu8BrFiYWmK3hUfJq08I79TxwieE,1957 +cryptography/hazmat/primitives/kdf/scrypt.py,sha256=XyWUdUUmhuI9V6TqAPOvujCSMGv1XQdg0a21IWCmO-U,590 +cryptography/hazmat/primitives/kdf/x963kdf.py,sha256=zLTcF665QFvXX2f8TS7fmBZTteXpFjKahzfjjQcCJyw,1999 +cryptography/hazmat/primitives/keywrap.py,sha256=XV4Pj2fqSeD-RqZVvY2cA3j5_7RwJSFygYuLfk2ujCo,5650 +cryptography/hazmat/primitives/padding.py,sha256=QT-U-NvV2eQGO1wVPbDiNGNSc9keRDS-ig5cQOrLz0E,1865 +cryptography/hazmat/primitives/poly1305.py,sha256=P5EPQV-RB_FJPahpg01u0Ts4S_PnAmsroxIGXbGeRRo,355 +cryptography/hazmat/primitives/serialization/__init__.py,sha256=Q7uTgDlt7n3WfsMT6jYwutC6DIg_7SEeoAm1GHZ5B5E,1705 +cryptography/hazmat/primitives/serialization/__pycache__/__init__.cpython-311.pyc,, +cryptography/hazmat/primitives/serialization/__pycache__/base.cpython-311.pyc,, +cryptography/hazmat/primitives/serialization/__pycache__/pkcs12.cpython-311.pyc,, +cryptography/hazmat/primitives/serialization/__pycache__/pkcs7.cpython-311.pyc,, +cryptography/hazmat/primitives/serialization/__pycache__/ssh.cpython-311.pyc,, +cryptography/hazmat/primitives/serialization/base.py,sha256=ikq5MJIwp_oUnjiaBco_PmQwOTYuGi-XkYUYHKy8Vo0,615 +cryptography/hazmat/primitives/serialization/pkcs12.py,sha256=mS9cFNG4afzvseoc5e1MWoY2VskfL8N8Y_OFjl67luY,5104 +cryptography/hazmat/primitives/serialization/pkcs7.py,sha256=5OR_Tkysxaprn4FegvJIfbep9rJ9wok6FLWvWwQ5-Mg,13943 +cryptography/hazmat/primitives/serialization/ssh.py,sha256=hPV5obFznz0QhFfXFPOeQ8y6MsurA0xVMQiLnLESEs8,53700 +cryptography/hazmat/primitives/twofactor/__init__.py,sha256=tmMZGB-g4IU1r7lIFqASU019zr0uPp_wEBYcwdDCKCA,258 +cryptography/hazmat/primitives/twofactor/__pycache__/__init__.cpython-311.pyc,, +cryptography/hazmat/primitives/twofactor/__pycache__/hotp.cpython-311.pyc,, +cryptography/hazmat/primitives/twofactor/__pycache__/totp.cpython-311.pyc,, +cryptography/hazmat/primitives/twofactor/hotp.py,sha256=ivZo5BrcCGWLsqql4nZV0XXCjyGPi_iHfDFltGlOJwk,3256 +cryptography/hazmat/primitives/twofactor/totp.py,sha256=m5LPpRL00kp4zY8gTjr55Hfz9aMlPS53kHmVkSQCmdY,1652 +cryptography/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +cryptography/utils.py,sha256=bZAjFC5KVpfmF29qS_18vvpW3mKxmdiRALcusHhTTkg,4301 +cryptography/x509/__init__.py,sha256=xloN0swseNx-m2WFZmCA17gOoxQWqeU82UVjEdJBePQ,8257 +cryptography/x509/__pycache__/__init__.cpython-311.pyc,, +cryptography/x509/__pycache__/base.cpython-311.pyc,, +cryptography/x509/__pycache__/certificate_transparency.cpython-311.pyc,, +cryptography/x509/__pycache__/extensions.cpython-311.pyc,, +cryptography/x509/__pycache__/general_name.cpython-311.pyc,, +cryptography/x509/__pycache__/name.cpython-311.pyc,, +cryptography/x509/__pycache__/ocsp.cpython-311.pyc,, +cryptography/x509/__pycache__/oid.cpython-311.pyc,, +cryptography/x509/__pycache__/verification.cpython-311.pyc,, +cryptography/x509/base.py,sha256=OrmTw3y8B6AE_nGXQPN8x9kq-d7rDWeH13gCq6T6D6U,27997 +cryptography/x509/certificate_transparency.py,sha256=JqoOIDhlwInrYMFW6IFn77WJ0viF-PB_rlZV3vs9MYc,797 +cryptography/x509/extensions.py,sha256=QxYrqR6SF1qzR9ZraP8wDiIczlEVlAFuwDRVcltB6Tk,77724 +cryptography/x509/general_name.py,sha256=sP_rV11Qlpsk4x3XXGJY_Mv0Q_s9dtjeLckHsjpLQoQ,7836 +cryptography/x509/name.py,sha256=ty0_xf0LnHwZAdEf-d8FLO1K4hGqx_7DsD3CHwoLJiY,15101 +cryptography/x509/ocsp.py,sha256=Yey6NdFV1MPjop24Mj_VenjEpg3kUaMopSWOK0AbeBs,12699 +cryptography/x509/oid.py,sha256=BUzgXXGVWilkBkdKPTm9R4qElE9gAGHgdYPMZAp7PJo,931 +cryptography/x509/verification.py,sha256=gR2C2c-XZQtblZhT5T5vjSKOtCb74ef2alPVmEcwFlM,958 diff --git a/venv/lib/python3.11/site-packages/cryptography-46.0.3.dist-info/WHEEL b/venv/lib/python3.11/site-packages/cryptography-46.0.3.dist-info/WHEEL new file mode 100644 index 0000000..8e48aa1 --- /dev/null +++ b/venv/lib/python3.11/site-packages/cryptography-46.0.3.dist-info/WHEEL @@ -0,0 +1,5 @@ +Wheel-Version: 1.0 +Generator: maturin (1.9.4) +Root-Is-Purelib: false +Tag: cp311-abi3-manylinux_2_34_x86_64 + diff --git a/venv/lib/python3.11/site-packages/cryptography-46.0.3.dist-info/licenses/LICENSE b/venv/lib/python3.11/site-packages/cryptography-46.0.3.dist-info/licenses/LICENSE new file mode 100644 index 0000000..b11f379 --- /dev/null +++ b/venv/lib/python3.11/site-packages/cryptography-46.0.3.dist-info/licenses/LICENSE @@ -0,0 +1,3 @@ +This software is made available under the terms of *either* of the licenses +found in LICENSE.APACHE or LICENSE.BSD. Contributions to cryptography are made +under the terms of *both* these licenses. diff --git a/venv/lib/python3.11/site-packages/cryptography-46.0.3.dist-info/licenses/LICENSE.APACHE b/venv/lib/python3.11/site-packages/cryptography-46.0.3.dist-info/licenses/LICENSE.APACHE new file mode 100644 index 0000000..62589ed --- /dev/null +++ b/venv/lib/python3.11/site-packages/cryptography-46.0.3.dist-info/licenses/LICENSE.APACHE @@ -0,0 +1,202 @@ + + Apache License + Version 2.0, January 2004 + https://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + https://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/venv/lib/python3.11/site-packages/cryptography-46.0.3.dist-info/licenses/LICENSE.BSD b/venv/lib/python3.11/site-packages/cryptography-46.0.3.dist-info/licenses/LICENSE.BSD new file mode 100644 index 0000000..ec1a29d --- /dev/null +++ b/venv/lib/python3.11/site-packages/cryptography-46.0.3.dist-info/licenses/LICENSE.BSD @@ -0,0 +1,27 @@ +Copyright (c) Individual contributors. +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + + 3. Neither the name of PyCA Cryptography nor the names of its contributors + may be used to endorse or promote products derived from this software + without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR +ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/venv/lib/python3.11/site-packages/cryptography/__about__.py b/venv/lib/python3.11/site-packages/cryptography/__about__.py new file mode 100644 index 0000000..a811628 --- /dev/null +++ b/venv/lib/python3.11/site-packages/cryptography/__about__.py @@ -0,0 +1,17 @@ +# This file is dual licensed under the terms of the Apache License, Version +# 2.0, and the BSD License. See the LICENSE file in the root of this repository +# for complete details. + +from __future__ import annotations + +__all__ = [ + "__author__", + "__copyright__", + "__version__", +] + +__version__ = "46.0.3" + + +__author__ = "The Python Cryptographic Authority and individual contributors" +__copyright__ = f"Copyright 2013-2025 {__author__}" diff --git a/venv/lib/python3.11/site-packages/cryptography/__init__.py b/venv/lib/python3.11/site-packages/cryptography/__init__.py new file mode 100644 index 0000000..d374f75 --- /dev/null +++ b/venv/lib/python3.11/site-packages/cryptography/__init__.py @@ -0,0 +1,13 @@ +# This file is dual licensed under the terms of the Apache License, Version +# 2.0, and the BSD License. See the LICENSE file in the root of this repository +# for complete details. + +from __future__ import annotations + +from cryptography.__about__ import __author__, __copyright__, __version__ + +__all__ = [ + "__author__", + "__copyright__", + "__version__", +] diff --git a/venv/lib/python3.11/site-packages/cryptography/__pycache__/__about__.cpython-311.pyc b/venv/lib/python3.11/site-packages/cryptography/__pycache__/__about__.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..41f6c2acb3d6ac25f50ed835c510d16b8ea223b5 GIT binary patch literal 491 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 X?X~Z^_R~P9wcrVseY;KtA=Li^P^Q+6 literal 0 HcmV?d00001 diff --git a/venv/lib/python3.11/site-packages/cryptography/__pycache__/utils.cpython-311.pyc b/venv/lib/python3.11/site-packages/cryptography/__pycache__/utils.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..3695ea5ca7c9b5d606e65ccd3680a09761a7c87e GIT binary patch literal 7389 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 None: + super().__init__(message) + self._reason = reason + + +class AlreadyFinalized(Exception): + pass + + +class AlreadyUpdated(Exception): + pass + + +class NotYetFinalized(Exception): + pass + + +class InvalidTag(Exception): + pass + + +class InvalidSignature(Exception): + pass + + +class InternalError(Exception): + def __init__( + self, msg: str, err_code: list[rust_openssl.OpenSSLError] + ) -> None: + super().__init__(msg) + self.err_code = err_code + + +class InvalidKey(Exception): + pass diff --git a/venv/lib/python3.11/site-packages/cryptography/fernet.py b/venv/lib/python3.11/site-packages/cryptography/fernet.py new file mode 100644 index 0000000..c6744ae --- /dev/null +++ b/venv/lib/python3.11/site-packages/cryptography/fernet.py @@ -0,0 +1,224 @@ +# This file is dual licensed under the terms of the Apache License, Version +# 2.0, and the BSD License. See the LICENSE file in the root of this repository +# for complete details. + +from __future__ import annotations + +import base64 +import binascii +import os +import time +import typing +from collections.abc import Iterable + +from cryptography import utils +from cryptography.exceptions import InvalidSignature +from cryptography.hazmat.primitives import hashes, padding +from cryptography.hazmat.primitives.ciphers import Cipher, algorithms, modes +from cryptography.hazmat.primitives.hmac import HMAC + + +class InvalidToken(Exception): + pass + + +_MAX_CLOCK_SKEW = 60 + + +class Fernet: + def __init__( + self, + key: bytes | str, + backend: typing.Any = None, + ) -> None: + try: + key = base64.urlsafe_b64decode(key) + except binascii.Error as exc: + raise ValueError( + "Fernet key must be 32 url-safe base64-encoded bytes." + ) from exc + if len(key) != 32: + raise ValueError( + "Fernet key must be 32 url-safe base64-encoded bytes." + ) + + self._signing_key = key[:16] + self._encryption_key = key[16:] + + @classmethod + def generate_key(cls) -> bytes: + return base64.urlsafe_b64encode(os.urandom(32)) + + def encrypt(self, data: bytes) -> bytes: + return self.encrypt_at_time(data, int(time.time())) + + def encrypt_at_time(self, data: bytes, current_time: int) -> bytes: + iv = os.urandom(16) + return self._encrypt_from_parts(data, current_time, iv) + + def _encrypt_from_parts( + self, data: bytes, current_time: int, iv: bytes + ) -> bytes: + utils._check_bytes("data", data) + + padder = padding.PKCS7(algorithms.AES.block_size).padder() + padded_data = padder.update(data) + padder.finalize() + encryptor = Cipher( + algorithms.AES(self._encryption_key), + modes.CBC(iv), + ).encryptor() + ciphertext = encryptor.update(padded_data) + encryptor.finalize() + + basic_parts = ( + b"\x80" + + current_time.to_bytes(length=8, byteorder="big") + + iv + + ciphertext + ) + + h = HMAC(self._signing_key, hashes.SHA256()) + h.update(basic_parts) + hmac = h.finalize() + return base64.urlsafe_b64encode(basic_parts + hmac) + + def decrypt(self, token: bytes | str, ttl: int | None = None) -> bytes: + timestamp, data = Fernet._get_unverified_token_data(token) + if ttl is None: + time_info = None + else: + time_info = (ttl, int(time.time())) + return self._decrypt_data(data, timestamp, time_info) + + def decrypt_at_time( + self, token: bytes | str, ttl: int, current_time: int + ) -> bytes: + if ttl is None: + raise ValueError( + "decrypt_at_time() can only be used with a non-None ttl" + ) + timestamp, data = Fernet._get_unverified_token_data(token) + return self._decrypt_data(data, timestamp, (ttl, current_time)) + + def extract_timestamp(self, token: bytes | str) -> int: + timestamp, data = Fernet._get_unverified_token_data(token) + # Verify the token was not tampered with. + self._verify_signature(data) + return timestamp + + @staticmethod + def _get_unverified_token_data(token: bytes | str) -> tuple[int, bytes]: + if not isinstance(token, (str, bytes)): + raise TypeError("token must be bytes or str") + + try: + data = base64.urlsafe_b64decode(token) + except (TypeError, binascii.Error): + raise InvalidToken + + if not data or data[0] != 0x80: + raise InvalidToken + + if len(data) < 9: + raise InvalidToken + + timestamp = int.from_bytes(data[1:9], byteorder="big") + return timestamp, data + + def _verify_signature(self, data: bytes) -> None: + h = HMAC(self._signing_key, hashes.SHA256()) + h.update(data[:-32]) + try: + h.verify(data[-32:]) + except InvalidSignature: + raise InvalidToken + + def _decrypt_data( + self, + data: bytes, + timestamp: int, + time_info: tuple[int, int] | None, + ) -> bytes: + if time_info is not None: + ttl, current_time = time_info + if timestamp + ttl < current_time: + raise InvalidToken + + if current_time + _MAX_CLOCK_SKEW < timestamp: + raise InvalidToken + + self._verify_signature(data) + + iv = data[9:25] + ciphertext = data[25:-32] + decryptor = Cipher( + algorithms.AES(self._encryption_key), modes.CBC(iv) + ).decryptor() + plaintext_padded = decryptor.update(ciphertext) + try: + plaintext_padded += decryptor.finalize() + except ValueError: + raise InvalidToken + unpadder = padding.PKCS7(algorithms.AES.block_size).unpadder() + + unpadded = unpadder.update(plaintext_padded) + try: + unpadded += unpadder.finalize() + except ValueError: + raise InvalidToken + return unpadded + + +class MultiFernet: + def __init__(self, fernets: Iterable[Fernet]): + fernets = list(fernets) + if not fernets: + raise ValueError( + "MultiFernet requires at least one Fernet instance" + ) + self._fernets = fernets + + def encrypt(self, msg: bytes) -> bytes: + return self.encrypt_at_time(msg, int(time.time())) + + def encrypt_at_time(self, msg: bytes, current_time: int) -> bytes: + return self._fernets[0].encrypt_at_time(msg, current_time) + + def rotate(self, msg: bytes | str) -> bytes: + timestamp, data = Fernet._get_unverified_token_data(msg) + for f in self._fernets: + try: + p = f._decrypt_data(data, timestamp, None) + break + except InvalidToken: + pass + else: + raise InvalidToken + + iv = os.urandom(16) + return self._fernets[0]._encrypt_from_parts(p, timestamp, iv) + + def decrypt(self, msg: bytes | str, ttl: int | None = None) -> bytes: + for f in self._fernets: + try: + return f.decrypt(msg, ttl) + except InvalidToken: + pass + raise InvalidToken + + def decrypt_at_time( + self, msg: bytes | str, ttl: int, current_time: int + ) -> bytes: + for f in self._fernets: + try: + return f.decrypt_at_time(msg, ttl, current_time) + except InvalidToken: + pass + raise InvalidToken + + def extract_timestamp(self, msg: bytes | str) -> int: + for f in self._fernets: + try: + return f.extract_timestamp(msg) + except InvalidToken: + pass + raise InvalidToken diff --git a/venv/lib/python3.11/site-packages/cryptography/hazmat/__init__.py b/venv/lib/python3.11/site-packages/cryptography/hazmat/__init__.py new file mode 100644 index 0000000..b9f1187 --- /dev/null +++ b/venv/lib/python3.11/site-packages/cryptography/hazmat/__init__.py @@ -0,0 +1,13 @@ +# This file is dual licensed under the terms of the Apache License, Version +# 2.0, and the BSD License. See the LICENSE file in the root of this repository +# for complete details. + +from __future__ import annotations + +""" +Hazardous Materials + +This is a "Hazardous Materials" module. You should ONLY use it if you're +100% absolutely sure that you know what you're doing because this module +is full of land mines, dragons, and dinosaurs with laser guns. +""" diff --git a/venv/lib/python3.11/site-packages/cryptography/hazmat/__pycache__/__init__.cpython-311.pyc b/venv/lib/python3.11/site-packages/cryptography/hazmat/__pycache__/__init__.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..c36b4499f3a8a266bd43485466f679291cbd1da7 GIT binary patch literal 272 zcmYk1y-LJD6ov0imSu@-V`J}DDRwW5tq8t=jh)SKHyM+`%ny@EB)*7`AU=hqt@XB6 zc7g4-a)K;)I2_J}4-WTjxy&Hyj=o9&ib73A7+@x+yEsqljfw({)ifoguy97qUdR1jk0hU4N|+p=rqjbFsY d_z|?L7-NcvV+OeTg3JFNXLFp55W~+S_X~yEO6>pu literal 0 HcmV?d00001 diff --git a/venv/lib/python3.11/site-packages/cryptography/hazmat/__pycache__/_oid.cpython-311.pyc b/venv/lib/python3.11/site-packages/cryptography/hazmat/__pycache__/_oid.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..ea325344da2a55d1b6762d6e83f262c46763a5e2 GIT binary patch literal 21664 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 H9vS^Fa_JUK literal 0 HcmV?d00001 diff --git a/venv/lib/python3.11/site-packages/cryptography/hazmat/_oid.py b/venv/lib/python3.11/site-packages/cryptography/hazmat/_oid.py new file mode 100644 index 0000000..4bf138d --- /dev/null +++ b/venv/lib/python3.11/site-packages/cryptography/hazmat/_oid.py @@ -0,0 +1,356 @@ +# This file is dual licensed under the terms of the Apache License, Version +# 2.0, and the BSD License. See the LICENSE file in the root of this repository +# for complete details. + +from __future__ import annotations + +from cryptography.hazmat.bindings._rust import ( + ObjectIdentifier as ObjectIdentifier, +) +from cryptography.hazmat.primitives import hashes + + +class ExtensionOID: + SUBJECT_DIRECTORY_ATTRIBUTES = ObjectIdentifier("2.5.29.9") + SUBJECT_KEY_IDENTIFIER = ObjectIdentifier("2.5.29.14") + KEY_USAGE = ObjectIdentifier("2.5.29.15") + PRIVATE_KEY_USAGE_PERIOD = ObjectIdentifier("2.5.29.16") + SUBJECT_ALTERNATIVE_NAME = ObjectIdentifier("2.5.29.17") + ISSUER_ALTERNATIVE_NAME = ObjectIdentifier("2.5.29.18") + BASIC_CONSTRAINTS = ObjectIdentifier("2.5.29.19") + NAME_CONSTRAINTS = ObjectIdentifier("2.5.29.30") + CRL_DISTRIBUTION_POINTS = ObjectIdentifier("2.5.29.31") + CERTIFICATE_POLICIES = ObjectIdentifier("2.5.29.32") + POLICY_MAPPINGS = ObjectIdentifier("2.5.29.33") + AUTHORITY_KEY_IDENTIFIER = ObjectIdentifier("2.5.29.35") + POLICY_CONSTRAINTS = ObjectIdentifier("2.5.29.36") + EXTENDED_KEY_USAGE = ObjectIdentifier("2.5.29.37") + FRESHEST_CRL = ObjectIdentifier("2.5.29.46") + INHIBIT_ANY_POLICY = ObjectIdentifier("2.5.29.54") + ISSUING_DISTRIBUTION_POINT = ObjectIdentifier("2.5.29.28") + AUTHORITY_INFORMATION_ACCESS = ObjectIdentifier("1.3.6.1.5.5.7.1.1") + SUBJECT_INFORMATION_ACCESS = ObjectIdentifier("1.3.6.1.5.5.7.1.11") + OCSP_NO_CHECK = ObjectIdentifier("1.3.6.1.5.5.7.48.1.5") + TLS_FEATURE = ObjectIdentifier("1.3.6.1.5.5.7.1.24") + CRL_NUMBER = ObjectIdentifier("2.5.29.20") + DELTA_CRL_INDICATOR = ObjectIdentifier("2.5.29.27") + PRECERT_SIGNED_CERTIFICATE_TIMESTAMPS = ObjectIdentifier( + "1.3.6.1.4.1.11129.2.4.2" + ) + PRECERT_POISON = ObjectIdentifier("1.3.6.1.4.1.11129.2.4.3") + SIGNED_CERTIFICATE_TIMESTAMPS = ObjectIdentifier("1.3.6.1.4.1.11129.2.4.5") + MS_CERTIFICATE_TEMPLATE = ObjectIdentifier("1.3.6.1.4.1.311.21.7") + ADMISSIONS = ObjectIdentifier("1.3.36.8.3.3") + + +class OCSPExtensionOID: + NONCE = ObjectIdentifier("1.3.6.1.5.5.7.48.1.2") + ACCEPTABLE_RESPONSES = ObjectIdentifier("1.3.6.1.5.5.7.48.1.4") + + +class CRLEntryExtensionOID: + CERTIFICATE_ISSUER = ObjectIdentifier("2.5.29.29") + CRL_REASON = ObjectIdentifier("2.5.29.21") + INVALIDITY_DATE = ObjectIdentifier("2.5.29.24") + + +class NameOID: + COMMON_NAME = ObjectIdentifier("2.5.4.3") + COUNTRY_NAME = ObjectIdentifier("2.5.4.6") + LOCALITY_NAME = ObjectIdentifier("2.5.4.7") + STATE_OR_PROVINCE_NAME = ObjectIdentifier("2.5.4.8") + STREET_ADDRESS = ObjectIdentifier("2.5.4.9") + ORGANIZATION_IDENTIFIER = ObjectIdentifier("2.5.4.97") + ORGANIZATION_NAME = ObjectIdentifier("2.5.4.10") + ORGANIZATIONAL_UNIT_NAME = ObjectIdentifier("2.5.4.11") + SERIAL_NUMBER = ObjectIdentifier("2.5.4.5") + SURNAME = ObjectIdentifier("2.5.4.4") + GIVEN_NAME = ObjectIdentifier("2.5.4.42") + TITLE = ObjectIdentifier("2.5.4.12") + INITIALS = ObjectIdentifier("2.5.4.43") + GENERATION_QUALIFIER = ObjectIdentifier("2.5.4.44") + X500_UNIQUE_IDENTIFIER = ObjectIdentifier("2.5.4.45") + DN_QUALIFIER = ObjectIdentifier("2.5.4.46") + PSEUDONYM = ObjectIdentifier("2.5.4.65") + USER_ID = ObjectIdentifier("0.9.2342.19200300.100.1.1") + DOMAIN_COMPONENT = ObjectIdentifier("0.9.2342.19200300.100.1.25") + EMAIL_ADDRESS = ObjectIdentifier("1.2.840.113549.1.9.1") + JURISDICTION_COUNTRY_NAME = ObjectIdentifier("1.3.6.1.4.1.311.60.2.1.3") + JURISDICTION_LOCALITY_NAME = ObjectIdentifier("1.3.6.1.4.1.311.60.2.1.1") + JURISDICTION_STATE_OR_PROVINCE_NAME = ObjectIdentifier( + "1.3.6.1.4.1.311.60.2.1.2" + ) + BUSINESS_CATEGORY = ObjectIdentifier("2.5.4.15") + POSTAL_ADDRESS = ObjectIdentifier("2.5.4.16") + POSTAL_CODE = ObjectIdentifier("2.5.4.17") + INN = ObjectIdentifier("1.2.643.3.131.1.1") + OGRN = ObjectIdentifier("1.2.643.100.1") + SNILS = ObjectIdentifier("1.2.643.100.3") + UNSTRUCTURED_NAME = ObjectIdentifier("1.2.840.113549.1.9.2") + + +class SignatureAlgorithmOID: + RSA_WITH_MD5 = ObjectIdentifier("1.2.840.113549.1.1.4") + RSA_WITH_SHA1 = ObjectIdentifier("1.2.840.113549.1.1.5") + # This is an alternate OID for RSA with SHA1 that is occasionally seen + _RSA_WITH_SHA1 = ObjectIdentifier("1.3.14.3.2.29") + RSA_WITH_SHA224 = ObjectIdentifier("1.2.840.113549.1.1.14") + RSA_WITH_SHA256 = ObjectIdentifier("1.2.840.113549.1.1.11") + RSA_WITH_SHA384 = ObjectIdentifier("1.2.840.113549.1.1.12") + RSA_WITH_SHA512 = ObjectIdentifier("1.2.840.113549.1.1.13") + RSA_WITH_SHA3_224 = ObjectIdentifier("2.16.840.1.101.3.4.3.13") + RSA_WITH_SHA3_256 = ObjectIdentifier("2.16.840.1.101.3.4.3.14") + RSA_WITH_SHA3_384 = ObjectIdentifier("2.16.840.1.101.3.4.3.15") + RSA_WITH_SHA3_512 = ObjectIdentifier("2.16.840.1.101.3.4.3.16") + RSASSA_PSS = ObjectIdentifier("1.2.840.113549.1.1.10") + ECDSA_WITH_SHA1 = ObjectIdentifier("1.2.840.10045.4.1") + ECDSA_WITH_SHA224 = ObjectIdentifier("1.2.840.10045.4.3.1") + ECDSA_WITH_SHA256 = ObjectIdentifier("1.2.840.10045.4.3.2") + ECDSA_WITH_SHA384 = ObjectIdentifier("1.2.840.10045.4.3.3") + ECDSA_WITH_SHA512 = ObjectIdentifier("1.2.840.10045.4.3.4") + ECDSA_WITH_SHA3_224 = ObjectIdentifier("2.16.840.1.101.3.4.3.9") + ECDSA_WITH_SHA3_256 = ObjectIdentifier("2.16.840.1.101.3.4.3.10") + ECDSA_WITH_SHA3_384 = ObjectIdentifier("2.16.840.1.101.3.4.3.11") + ECDSA_WITH_SHA3_512 = ObjectIdentifier("2.16.840.1.101.3.4.3.12") + DSA_WITH_SHA1 = ObjectIdentifier("1.2.840.10040.4.3") + DSA_WITH_SHA224 = ObjectIdentifier("2.16.840.1.101.3.4.3.1") + DSA_WITH_SHA256 = ObjectIdentifier("2.16.840.1.101.3.4.3.2") + DSA_WITH_SHA384 = ObjectIdentifier("2.16.840.1.101.3.4.3.3") + DSA_WITH_SHA512 = ObjectIdentifier("2.16.840.1.101.3.4.3.4") + ED25519 = ObjectIdentifier("1.3.101.112") + ED448 = ObjectIdentifier("1.3.101.113") + GOSTR3411_94_WITH_3410_2001 = ObjectIdentifier("1.2.643.2.2.3") + GOSTR3410_2012_WITH_3411_2012_256 = ObjectIdentifier("1.2.643.7.1.1.3.2") + GOSTR3410_2012_WITH_3411_2012_512 = ObjectIdentifier("1.2.643.7.1.1.3.3") + + +_SIG_OIDS_TO_HASH: dict[ObjectIdentifier, hashes.HashAlgorithm | None] = { + SignatureAlgorithmOID.RSA_WITH_MD5: hashes.MD5(), + SignatureAlgorithmOID.RSA_WITH_SHA1: hashes.SHA1(), + SignatureAlgorithmOID._RSA_WITH_SHA1: hashes.SHA1(), + SignatureAlgorithmOID.RSA_WITH_SHA224: hashes.SHA224(), + SignatureAlgorithmOID.RSA_WITH_SHA256: hashes.SHA256(), + SignatureAlgorithmOID.RSA_WITH_SHA384: hashes.SHA384(), + SignatureAlgorithmOID.RSA_WITH_SHA512: hashes.SHA512(), + SignatureAlgorithmOID.RSA_WITH_SHA3_224: hashes.SHA3_224(), + SignatureAlgorithmOID.RSA_WITH_SHA3_256: hashes.SHA3_256(), + SignatureAlgorithmOID.RSA_WITH_SHA3_384: hashes.SHA3_384(), + SignatureAlgorithmOID.RSA_WITH_SHA3_512: hashes.SHA3_512(), + SignatureAlgorithmOID.ECDSA_WITH_SHA1: hashes.SHA1(), + SignatureAlgorithmOID.ECDSA_WITH_SHA224: hashes.SHA224(), + SignatureAlgorithmOID.ECDSA_WITH_SHA256: hashes.SHA256(), + SignatureAlgorithmOID.ECDSA_WITH_SHA384: hashes.SHA384(), + SignatureAlgorithmOID.ECDSA_WITH_SHA512: hashes.SHA512(), + SignatureAlgorithmOID.ECDSA_WITH_SHA3_224: hashes.SHA3_224(), + SignatureAlgorithmOID.ECDSA_WITH_SHA3_256: hashes.SHA3_256(), + SignatureAlgorithmOID.ECDSA_WITH_SHA3_384: hashes.SHA3_384(), + SignatureAlgorithmOID.ECDSA_WITH_SHA3_512: hashes.SHA3_512(), + SignatureAlgorithmOID.DSA_WITH_SHA1: hashes.SHA1(), + SignatureAlgorithmOID.DSA_WITH_SHA224: hashes.SHA224(), + SignatureAlgorithmOID.DSA_WITH_SHA256: hashes.SHA256(), + SignatureAlgorithmOID.ED25519: None, + SignatureAlgorithmOID.ED448: None, + SignatureAlgorithmOID.GOSTR3411_94_WITH_3410_2001: None, + SignatureAlgorithmOID.GOSTR3410_2012_WITH_3411_2012_256: None, + SignatureAlgorithmOID.GOSTR3410_2012_WITH_3411_2012_512: None, +} + + +class HashAlgorithmOID: + SHA1 = ObjectIdentifier("1.3.14.3.2.26") + SHA224 = ObjectIdentifier("2.16.840.1.101.3.4.2.4") + SHA256 = ObjectIdentifier("2.16.840.1.101.3.4.2.1") + SHA384 = ObjectIdentifier("2.16.840.1.101.3.4.2.2") + SHA512 = ObjectIdentifier("2.16.840.1.101.3.4.2.3") + SHA3_224 = ObjectIdentifier("1.3.6.1.4.1.37476.3.2.1.99.7.224") + SHA3_256 = ObjectIdentifier("1.3.6.1.4.1.37476.3.2.1.99.7.256") + SHA3_384 = ObjectIdentifier("1.3.6.1.4.1.37476.3.2.1.99.7.384") + SHA3_512 = ObjectIdentifier("1.3.6.1.4.1.37476.3.2.1.99.7.512") + SHA3_224_NIST = ObjectIdentifier("2.16.840.1.101.3.4.2.7") + SHA3_256_NIST = ObjectIdentifier("2.16.840.1.101.3.4.2.8") + SHA3_384_NIST = ObjectIdentifier("2.16.840.1.101.3.4.2.9") + SHA3_512_NIST = ObjectIdentifier("2.16.840.1.101.3.4.2.10") + + +class PublicKeyAlgorithmOID: + DSA = ObjectIdentifier("1.2.840.10040.4.1") + EC_PUBLIC_KEY = ObjectIdentifier("1.2.840.10045.2.1") + RSAES_PKCS1_v1_5 = ObjectIdentifier("1.2.840.113549.1.1.1") + RSASSA_PSS = ObjectIdentifier("1.2.840.113549.1.1.10") + X25519 = ObjectIdentifier("1.3.101.110") + X448 = ObjectIdentifier("1.3.101.111") + ED25519 = ObjectIdentifier("1.3.101.112") + ED448 = ObjectIdentifier("1.3.101.113") + + +class ExtendedKeyUsageOID: + SERVER_AUTH = ObjectIdentifier("1.3.6.1.5.5.7.3.1") + CLIENT_AUTH = ObjectIdentifier("1.3.6.1.5.5.7.3.2") + CODE_SIGNING = ObjectIdentifier("1.3.6.1.5.5.7.3.3") + EMAIL_PROTECTION = ObjectIdentifier("1.3.6.1.5.5.7.3.4") + TIME_STAMPING = ObjectIdentifier("1.3.6.1.5.5.7.3.8") + OCSP_SIGNING = ObjectIdentifier("1.3.6.1.5.5.7.3.9") + ANY_EXTENDED_KEY_USAGE = ObjectIdentifier("2.5.29.37.0") + SMARTCARD_LOGON = ObjectIdentifier("1.3.6.1.4.1.311.20.2.2") + KERBEROS_PKINIT_KDC = ObjectIdentifier("1.3.6.1.5.2.3.5") + IPSEC_IKE = ObjectIdentifier("1.3.6.1.5.5.7.3.17") + BUNDLE_SECURITY = ObjectIdentifier("1.3.6.1.5.5.7.3.35") + CERTIFICATE_TRANSPARENCY = ObjectIdentifier("1.3.6.1.4.1.11129.2.4.4") + + +class OtherNameFormOID: + PERMANENT_IDENTIFIER = ObjectIdentifier("1.3.6.1.5.5.7.8.3") + HW_MODULE_NAME = ObjectIdentifier("1.3.6.1.5.5.7.8.4") + DNS_SRV = ObjectIdentifier("1.3.6.1.5.5.7.8.7") + NAI_REALM = ObjectIdentifier("1.3.6.1.5.5.7.8.8") + SMTP_UTF8_MAILBOX = ObjectIdentifier("1.3.6.1.5.5.7.8.9") + ACP_NODE_NAME = ObjectIdentifier("1.3.6.1.5.5.7.8.10") + BUNDLE_EID = ObjectIdentifier("1.3.6.1.5.5.7.8.11") + + +class AuthorityInformationAccessOID: + CA_ISSUERS = ObjectIdentifier("1.3.6.1.5.5.7.48.2") + OCSP = ObjectIdentifier("1.3.6.1.5.5.7.48.1") + + +class SubjectInformationAccessOID: + CA_REPOSITORY = ObjectIdentifier("1.3.6.1.5.5.7.48.5") + + +class CertificatePoliciesOID: + CPS_QUALIFIER = ObjectIdentifier("1.3.6.1.5.5.7.2.1") + CPS_USER_NOTICE = ObjectIdentifier("1.3.6.1.5.5.7.2.2") + ANY_POLICY = ObjectIdentifier("2.5.29.32.0") + + +class AttributeOID: + CHALLENGE_PASSWORD = ObjectIdentifier("1.2.840.113549.1.9.7") + UNSTRUCTURED_NAME = ObjectIdentifier("1.2.840.113549.1.9.2") + + +_OID_NAMES = { + NameOID.COMMON_NAME: "commonName", + NameOID.COUNTRY_NAME: "countryName", + NameOID.LOCALITY_NAME: "localityName", + NameOID.STATE_OR_PROVINCE_NAME: "stateOrProvinceName", + NameOID.STREET_ADDRESS: "streetAddress", + NameOID.ORGANIZATION_NAME: "organizationName", + NameOID.ORGANIZATIONAL_UNIT_NAME: "organizationalUnitName", + NameOID.SERIAL_NUMBER: "serialNumber", + NameOID.SURNAME: "surname", + NameOID.GIVEN_NAME: "givenName", + NameOID.TITLE: "title", + NameOID.GENERATION_QUALIFIER: "generationQualifier", + NameOID.X500_UNIQUE_IDENTIFIER: "x500UniqueIdentifier", + NameOID.DN_QUALIFIER: "dnQualifier", + NameOID.PSEUDONYM: "pseudonym", + NameOID.USER_ID: "userID", + NameOID.DOMAIN_COMPONENT: "domainComponent", + NameOID.EMAIL_ADDRESS: "emailAddress", + NameOID.JURISDICTION_COUNTRY_NAME: "jurisdictionCountryName", + NameOID.JURISDICTION_LOCALITY_NAME: "jurisdictionLocalityName", + NameOID.JURISDICTION_STATE_OR_PROVINCE_NAME: ( + "jurisdictionStateOrProvinceName" + ), + NameOID.BUSINESS_CATEGORY: "businessCategory", + NameOID.POSTAL_ADDRESS: "postalAddress", + NameOID.POSTAL_CODE: "postalCode", + NameOID.INN: "INN", + NameOID.OGRN: "OGRN", + NameOID.SNILS: "SNILS", + NameOID.UNSTRUCTURED_NAME: "unstructuredName", + SignatureAlgorithmOID.RSA_WITH_MD5: "md5WithRSAEncryption", + SignatureAlgorithmOID.RSA_WITH_SHA1: "sha1WithRSAEncryption", + SignatureAlgorithmOID.RSA_WITH_SHA224: "sha224WithRSAEncryption", + SignatureAlgorithmOID.RSA_WITH_SHA256: "sha256WithRSAEncryption", + SignatureAlgorithmOID.RSA_WITH_SHA384: "sha384WithRSAEncryption", + SignatureAlgorithmOID.RSA_WITH_SHA512: "sha512WithRSAEncryption", + SignatureAlgorithmOID.RSASSA_PSS: "rsassaPss", + SignatureAlgorithmOID.ECDSA_WITH_SHA1: "ecdsa-with-SHA1", + SignatureAlgorithmOID.ECDSA_WITH_SHA224: "ecdsa-with-SHA224", + SignatureAlgorithmOID.ECDSA_WITH_SHA256: "ecdsa-with-SHA256", + SignatureAlgorithmOID.ECDSA_WITH_SHA384: "ecdsa-with-SHA384", + SignatureAlgorithmOID.ECDSA_WITH_SHA512: "ecdsa-with-SHA512", + SignatureAlgorithmOID.DSA_WITH_SHA1: "dsa-with-sha1", + SignatureAlgorithmOID.DSA_WITH_SHA224: "dsa-with-sha224", + SignatureAlgorithmOID.DSA_WITH_SHA256: "dsa-with-sha256", + SignatureAlgorithmOID.ED25519: "ed25519", + SignatureAlgorithmOID.ED448: "ed448", + SignatureAlgorithmOID.GOSTR3411_94_WITH_3410_2001: ( + "GOST R 34.11-94 with GOST R 34.10-2001" + ), + SignatureAlgorithmOID.GOSTR3410_2012_WITH_3411_2012_256: ( + "GOST R 34.10-2012 with GOST R 34.11-2012 (256 bit)" + ), + SignatureAlgorithmOID.GOSTR3410_2012_WITH_3411_2012_512: ( + "GOST R 34.10-2012 with GOST R 34.11-2012 (512 bit)" + ), + HashAlgorithmOID.SHA1: "sha1", + HashAlgorithmOID.SHA224: "sha224", + HashAlgorithmOID.SHA256: "sha256", + HashAlgorithmOID.SHA384: "sha384", + HashAlgorithmOID.SHA512: "sha512", + HashAlgorithmOID.SHA3_224: "sha3_224", + HashAlgorithmOID.SHA3_256: "sha3_256", + HashAlgorithmOID.SHA3_384: "sha3_384", + HashAlgorithmOID.SHA3_512: "sha3_512", + HashAlgorithmOID.SHA3_224_NIST: "sha3_224", + HashAlgorithmOID.SHA3_256_NIST: "sha3_256", + HashAlgorithmOID.SHA3_384_NIST: "sha3_384", + HashAlgorithmOID.SHA3_512_NIST: "sha3_512", + PublicKeyAlgorithmOID.DSA: "dsaEncryption", + PublicKeyAlgorithmOID.EC_PUBLIC_KEY: "id-ecPublicKey", + PublicKeyAlgorithmOID.RSAES_PKCS1_v1_5: "rsaEncryption", + PublicKeyAlgorithmOID.X25519: "X25519", + PublicKeyAlgorithmOID.X448: "X448", + ExtendedKeyUsageOID.SERVER_AUTH: "serverAuth", + ExtendedKeyUsageOID.CLIENT_AUTH: "clientAuth", + ExtendedKeyUsageOID.CODE_SIGNING: "codeSigning", + ExtendedKeyUsageOID.EMAIL_PROTECTION: "emailProtection", + ExtendedKeyUsageOID.TIME_STAMPING: "timeStamping", + ExtendedKeyUsageOID.OCSP_SIGNING: "OCSPSigning", + ExtendedKeyUsageOID.SMARTCARD_LOGON: "msSmartcardLogin", + ExtendedKeyUsageOID.KERBEROS_PKINIT_KDC: "pkInitKDC", + ExtensionOID.SUBJECT_DIRECTORY_ATTRIBUTES: "subjectDirectoryAttributes", + ExtensionOID.SUBJECT_KEY_IDENTIFIER: "subjectKeyIdentifier", + ExtensionOID.KEY_USAGE: "keyUsage", + ExtensionOID.PRIVATE_KEY_USAGE_PERIOD: "privateKeyUsagePeriod", + ExtensionOID.SUBJECT_ALTERNATIVE_NAME: "subjectAltName", + ExtensionOID.ISSUER_ALTERNATIVE_NAME: "issuerAltName", + ExtensionOID.BASIC_CONSTRAINTS: "basicConstraints", + ExtensionOID.PRECERT_SIGNED_CERTIFICATE_TIMESTAMPS: ( + "signedCertificateTimestampList" + ), + ExtensionOID.SIGNED_CERTIFICATE_TIMESTAMPS: ( + "signedCertificateTimestampList" + ), + ExtensionOID.PRECERT_POISON: "ctPoison", + ExtensionOID.MS_CERTIFICATE_TEMPLATE: "msCertificateTemplate", + ExtensionOID.ADMISSIONS: "Admissions", + CRLEntryExtensionOID.CRL_REASON: "cRLReason", + CRLEntryExtensionOID.INVALIDITY_DATE: "invalidityDate", + CRLEntryExtensionOID.CERTIFICATE_ISSUER: "certificateIssuer", + ExtensionOID.NAME_CONSTRAINTS: "nameConstraints", + ExtensionOID.CRL_DISTRIBUTION_POINTS: "cRLDistributionPoints", + ExtensionOID.CERTIFICATE_POLICIES: "certificatePolicies", + ExtensionOID.POLICY_MAPPINGS: "policyMappings", + ExtensionOID.AUTHORITY_KEY_IDENTIFIER: "authorityKeyIdentifier", + ExtensionOID.POLICY_CONSTRAINTS: "policyConstraints", + ExtensionOID.EXTENDED_KEY_USAGE: "extendedKeyUsage", + ExtensionOID.FRESHEST_CRL: "freshestCRL", + ExtensionOID.INHIBIT_ANY_POLICY: "inhibitAnyPolicy", + ExtensionOID.ISSUING_DISTRIBUTION_POINT: "issuingDistributionPoint", + ExtensionOID.AUTHORITY_INFORMATION_ACCESS: "authorityInfoAccess", + ExtensionOID.SUBJECT_INFORMATION_ACCESS: "subjectInfoAccess", + ExtensionOID.OCSP_NO_CHECK: "OCSPNoCheck", + ExtensionOID.CRL_NUMBER: "cRLNumber", + ExtensionOID.DELTA_CRL_INDICATOR: "deltaCRLIndicator", + ExtensionOID.TLS_FEATURE: "TLSFeature", + AuthorityInformationAccessOID.OCSP: "OCSP", + AuthorityInformationAccessOID.CA_ISSUERS: "caIssuers", + SubjectInformationAccessOID.CA_REPOSITORY: "caRepository", + CertificatePoliciesOID.CPS_QUALIFIER: "id-qt-cps", + CertificatePoliciesOID.CPS_USER_NOTICE: "id-qt-unotice", + OCSPExtensionOID.NONCE: "OCSPNonce", + AttributeOID.CHALLENGE_PASSWORD: "challengePassword", +} diff --git a/venv/lib/python3.11/site-packages/cryptography/hazmat/asn1/__init__.py b/venv/lib/python3.11/site-packages/cryptography/hazmat/asn1/__init__.py new file mode 100644 index 0000000..be68373 --- /dev/null +++ b/venv/lib/python3.11/site-packages/cryptography/hazmat/asn1/__init__.py @@ -0,0 +1,10 @@ +# This file is dual licensed under the terms of the Apache License, Version +# 2.0, and the BSD License. See the LICENSE file in the root of this repository +# for complete details. + +from cryptography.hazmat.asn1.asn1 import encode_der, sequence + +__all__ = [ + "encode_der", + "sequence", +] diff --git a/venv/lib/python3.11/site-packages/cryptography/hazmat/asn1/__pycache__/__init__.cpython-311.pyc b/venv/lib/python3.11/site-packages/cryptography/hazmat/asn1/__pycache__/__init__.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..2a071a3b5294fa2f01af2150c26f34a4bf6f1455 GIT binary patch literal 356 zcmZWly-ve05I#F8t%{1o!~`2dhQ=zasE8L}VasBP0%Mhx zi7isMPB{DsB<@b1zSDhopL9=?$rwVs9IWIq0(k42pTOT_a}>xUaNtORMj6sL!w5L$ zQGv6F$5)UH-g|L^+p#ct#RcWUwWC_xE<-O|6oxJiaGAvIVeT61tHLo`HfhQ3HS;N} z&Fm9?we65nrWB>mu<5UFuSr>HLGGCI%rK&x3v0O3YpVobVQ?PXcriLZ}-9I)8=v X|LS&Nu)mJ?xsontUvU^)Tncx!VfLtdbTy&I9`eti!&bKw%0*Q6ZfE5m)*O1jW-9rbjFn<+zoP49 zQ!xu=-N>fc*Bn&8_LDXi6W6`=cKY?ITE3`Y=(wuMilI-~%-kI4d-LU01s4?Ew3%;g z-+VzUs6w|~wLR$((K{rfA&uezT!%X(+7%9^4}MqQ82Yj6(zr{ zENDh1kJl<@c>ybx#kI_$vR+cm3;`<@>B^dYM%K%?q!bJ5+Ob98I4t5L_>6}jYUrJa zA|qCKycteg;dJfJD^IY#{^ZN1=Tpn`X&Z^c@0nKgycM0O2X{l!C+Q!@rmV4B&CqQt zbi0ih?=5CGGSnEJd7*=Vw;8!yWcgG7 z%)Fdx`e!WvOoN|!1M2`oV&y?+nZ`j#E#%GbAa=&7OYa?|jw(JJMECMebikm*-ZY99 zA@dj&&<0aQn~*=9+_7{6-HZJZ;&Fq8IB{YIqKZ3-%ncsU%2e5FFyvo{sth2N0dBDc z@Kwp6#s<73pw$*B5)6tPiXglH2r%zM2_7bDy>hqLp?UBqR8PQX%z~()wupkgwVBq) z_)jC3cSbHZN3K{SSK5ddE>qEz&eeU7?tr6{lP_{V#F~k(t;E+2X}A@isEhUWrW9*P zu|0pdHjB@Z8M%DXIPj2Q`tF;1HlHo)n#-&bbfRYc4`d#@f}POL_KD!#V2+z`$)P#Z z$pPg!M&2aUcPdqpNn-9WRT(#txXHpbo7mNHJJ_uO)CosYG^l{*yLW^ zXoRme!&j~F)!Ln18gRSPpe4nBl16u=(M{vW@oO)0&GB2-_^qaN+mde6=JQSI6HEGJ zU*LMgw+KY-#ycMpdg{M@l-T^Z$zQPe3ytnekpi{|EkBUUdT~uwwRvTwXu5zxXc)G^ zy!kg|04N~4>F5+wnPtlSc!WjAPp~6Ms4RWBZT=a6W6J@^sq=)<6CWC5TX4Jmw7%<1 zJOMHW(dZT-x;wW8a*vvsd(PWD)+*R$weM{okZ^ucR`7yhdk!rF-9Lw(_?IA30$d5! z47+Dl!v>s7azURj+kRCs6}WL2hGy7ar+|rXpR*JgcEG8YAvz5bI$dl?4j87P_7CtG ze**#3E}@=~CS~CeZQcqplPJ(&8Tzl z@({NBR>7E@6PQGa?E~5?17WHfrbl9j0g1)!z9V1*nd-(o+*zo>pCgJE%6|vawNhDK zDQaKfJD@~hVf+PTn`0OTEX|y6ppoP69*Q)&ZwvWq^l70$jXryvXmNdy7IwIJgNwKL z;YRm`u_V9c8F(_f<4HC=$yRjCie9Y;>%qNf!iuJ8?#z&NW~`RoLti%B?;ani%{5 TgvmDRBf4EdbU!~`P5ty=1`ul$ literal 0 HcmV?d00001 diff --git a/venv/lib/python3.11/site-packages/cryptography/hazmat/asn1/asn1.py b/venv/lib/python3.11/site-packages/cryptography/hazmat/asn1/asn1.py new file mode 100644 index 0000000..dedad6f --- /dev/null +++ b/venv/lib/python3.11/site-packages/cryptography/hazmat/asn1/asn1.py @@ -0,0 +1,116 @@ +# This file is dual licensed under the terms of the Apache License, Version +# 2.0, and the BSD License. See the LICENSE file in the root of this repository +# for complete details. + +from __future__ import annotations + +import dataclasses +import sys +import typing + +if sys.version_info < (3, 11): + import typing_extensions + + # We use the `include_extras` parameter of `get_type_hints`, which was + # added in Python 3.9. This can be replaced by the `typing` version + # once the min version is >= 3.9 + if sys.version_info < (3, 9): + get_type_hints = typing_extensions.get_type_hints + else: + get_type_hints = typing.get_type_hints +else: + get_type_hints = typing.get_type_hints + +from cryptography.hazmat.bindings._rust import declarative_asn1 + +T = typing.TypeVar("T", covariant=True) +U = typing.TypeVar("U") + + +encode_der = declarative_asn1.encode_der + + +def _normalize_field_type( + field_type: typing.Any, field_name: str +) -> declarative_asn1.AnnotatedType: + annotation = declarative_asn1.Annotation() + + if hasattr(field_type, "__asn1_root__"): + annotated_root = field_type.__asn1_root__ + if not isinstance(annotated_root, declarative_asn1.AnnotatedType): + raise TypeError(f"unsupported root type: {annotated_root}") + return annotated_root + else: + rust_field_type = declarative_asn1.non_root_python_to_rust(field_type) + + return declarative_asn1.AnnotatedType(rust_field_type, annotation) + + +def _annotate_fields( + raw_fields: dict[str, type], +) -> dict[str, declarative_asn1.AnnotatedType]: + fields = {} + for field_name, field_type in raw_fields.items(): + # Recursively normalize the field type into something that the + # Rust code can understand. + annotated_field_type = _normalize_field_type(field_type, field_name) + fields[field_name] = annotated_field_type + + return fields + + +def _register_asn1_sequence(cls: type[U]) -> None: + raw_fields = get_type_hints(cls, include_extras=True) + root = declarative_asn1.AnnotatedType( + declarative_asn1.Type.Sequence(cls, _annotate_fields(raw_fields)), + declarative_asn1.Annotation(), + ) + + setattr(cls, "__asn1_root__", root) + + +# Due to https://github.com/python/mypy/issues/19731, we can't define an alias +# for `dataclass_transform` that conditionally points to `typing` or +# `typing_extensions` depending on the Python version (like we do for +# `get_type_hints`). +# We work around it by making the whole decorated class conditional on the +# Python version. +if sys.version_info < (3, 11): + + @typing_extensions.dataclass_transform(kw_only_default=True) + def sequence(cls: type[U]) -> type[U]: + # We use `dataclasses.dataclass` to add an __init__ method + # to the class with keyword-only parameters. + if sys.version_info >= (3, 10): + dataclass_cls = dataclasses.dataclass( + repr=False, + eq=False, + # `match_args` was added in Python 3.10 and defaults + # to True + match_args=False, + # `kw_only` was added in Python 3.10 and defaults to + # False + kw_only=True, + )(cls) + else: + dataclass_cls = dataclasses.dataclass( + repr=False, + eq=False, + )(cls) + _register_asn1_sequence(dataclass_cls) + return dataclass_cls + +else: + + @typing.dataclass_transform(kw_only_default=True) + def sequence(cls: type[U]) -> type[U]: + # Only add an __init__ method, with keyword-only + # parameters. + dataclass_cls = dataclasses.dataclass( + repr=False, + eq=False, + match_args=False, + kw_only=True, + )(cls) + _register_asn1_sequence(dataclass_cls) + return dataclass_cls diff --git a/venv/lib/python3.11/site-packages/cryptography/hazmat/backends/__init__.py b/venv/lib/python3.11/site-packages/cryptography/hazmat/backends/__init__.py new file mode 100644 index 0000000..b4400aa --- /dev/null +++ b/venv/lib/python3.11/site-packages/cryptography/hazmat/backends/__init__.py @@ -0,0 +1,13 @@ +# This file is dual licensed under the terms of the Apache License, Version +# 2.0, and the BSD License. See the LICENSE file in the root of this repository +# for complete details. + +from __future__ import annotations + +from typing import Any + + +def default_backend() -> Any: + from cryptography.hazmat.backends.openssl.backend import backend + + return backend diff --git a/venv/lib/python3.11/site-packages/cryptography/hazmat/backends/__pycache__/__init__.cpython-311.pyc b/venv/lib/python3.11/site-packages/cryptography/hazmat/backends/__pycache__/__init__.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..5db8df1a5df8513b51e840d7c569473aeb6e8f28 GIT binary patch literal 582 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 Mo$zK0{-YD|--BtmVgLXD literal 0 HcmV?d00001 diff --git a/venv/lib/python3.11/site-packages/cryptography/hazmat/backends/openssl/backend.py b/venv/lib/python3.11/site-packages/cryptography/hazmat/backends/openssl/backend.py new file mode 100644 index 0000000..248b8c5 --- /dev/null +++ b/venv/lib/python3.11/site-packages/cryptography/hazmat/backends/openssl/backend.py @@ -0,0 +1,302 @@ +# This file is dual licensed under the terms of the Apache License, Version +# 2.0, and the BSD License. See the LICENSE file in the root of this repository +# for complete details. + +from __future__ import annotations + +from cryptography.hazmat.bindings._rust import openssl as rust_openssl +from cryptography.hazmat.bindings.openssl import binding +from cryptography.hazmat.primitives import hashes +from cryptography.hazmat.primitives._asymmetric import AsymmetricPadding +from cryptography.hazmat.primitives.asymmetric import ec +from cryptography.hazmat.primitives.asymmetric import utils as asym_utils +from cryptography.hazmat.primitives.asymmetric.padding import ( + MGF1, + OAEP, + PSS, + PKCS1v15, +) +from cryptography.hazmat.primitives.ciphers import ( + CipherAlgorithm, +) +from cryptography.hazmat.primitives.ciphers.algorithms import ( + AES, +) +from cryptography.hazmat.primitives.ciphers.modes import ( + CBC, + Mode, +) + + +class Backend: + """ + OpenSSL API binding interfaces. + """ + + name = "openssl" + + # TripleDES encryption is disallowed/deprecated throughout 2023 in + # FIPS 140-3. To keep it simple we denylist any use of TripleDES (TDEA). + _fips_ciphers = (AES,) + # Sometimes SHA1 is still permissible. That logic is contained + # within the various *_supported methods. + _fips_hashes = ( + hashes.SHA224, + hashes.SHA256, + hashes.SHA384, + hashes.SHA512, + hashes.SHA512_224, + hashes.SHA512_256, + hashes.SHA3_224, + hashes.SHA3_256, + hashes.SHA3_384, + hashes.SHA3_512, + hashes.SHAKE128, + hashes.SHAKE256, + ) + _fips_ecdh_curves = ( + ec.SECP224R1, + ec.SECP256R1, + ec.SECP384R1, + ec.SECP521R1, + ) + _fips_rsa_min_key_size = 2048 + _fips_rsa_min_public_exponent = 65537 + _fips_dsa_min_modulus = 1 << 2048 + _fips_dh_min_key_size = 2048 + _fips_dh_min_modulus = 1 << _fips_dh_min_key_size + + def __init__(self) -> None: + self._binding = binding.Binding() + self._ffi = self._binding.ffi + self._lib = self._binding.lib + self._fips_enabled = rust_openssl.is_fips_enabled() + + def __repr__(self) -> str: + return ( + f"" + ) + + def openssl_assert(self, ok: bool) -> None: + return binding._openssl_assert(ok) + + def _enable_fips(self) -> None: + # This function enables FIPS mode for OpenSSL 3.0.0 on installs that + # have the FIPS provider installed properly. + rust_openssl.enable_fips(rust_openssl._providers) + assert rust_openssl.is_fips_enabled() + self._fips_enabled = rust_openssl.is_fips_enabled() + + def openssl_version_text(self) -> str: + """ + Friendly string name of the loaded OpenSSL library. This is not + necessarily the same version as it was compiled against. + + Example: OpenSSL 3.2.1 30 Jan 2024 + """ + return rust_openssl.openssl_version_text() + + def openssl_version_number(self) -> int: + return rust_openssl.openssl_version() + + def hash_supported(self, algorithm: hashes.HashAlgorithm) -> bool: + if self._fips_enabled and not isinstance(algorithm, self._fips_hashes): + return False + + return rust_openssl.hashes.hash_supported(algorithm) + + def signature_hash_supported( + self, algorithm: hashes.HashAlgorithm + ) -> bool: + # Dedicated check for hashing algorithm use in message digest for + # signatures, e.g. RSA PKCS#1 v1.5 SHA1 (sha1WithRSAEncryption). + if self._fips_enabled and isinstance(algorithm, hashes.SHA1): + return False + return self.hash_supported(algorithm) + + def scrypt_supported(self) -> bool: + if self._fips_enabled: + return False + else: + return hasattr(rust_openssl.kdf.Scrypt, "derive") + + def argon2_supported(self) -> bool: + if self._fips_enabled: + return False + else: + return hasattr(rust_openssl.kdf.Argon2id, "derive") + + def hmac_supported(self, algorithm: hashes.HashAlgorithm) -> bool: + # FIPS mode still allows SHA1 for HMAC + if self._fips_enabled and isinstance(algorithm, hashes.SHA1): + return True + if rust_openssl.CRYPTOGRAPHY_IS_AWSLC: + return isinstance( + algorithm, + ( + hashes.SHA1, + hashes.SHA224, + hashes.SHA256, + hashes.SHA384, + hashes.SHA512, + hashes.SHA512_224, + hashes.SHA512_256, + ), + ) + return self.hash_supported(algorithm) + + def cipher_supported(self, cipher: CipherAlgorithm, mode: Mode) -> bool: + if self._fips_enabled: + # FIPS mode requires AES. TripleDES is disallowed/deprecated in + # FIPS 140-3. + if not isinstance(cipher, self._fips_ciphers): + return False + + return rust_openssl.ciphers.cipher_supported(cipher, mode) + + def pbkdf2_hmac_supported(self, algorithm: hashes.HashAlgorithm) -> bool: + return self.hmac_supported(algorithm) + + def _consume_errors(self) -> list[rust_openssl.OpenSSLError]: + return rust_openssl.capture_error_stack() + + def _oaep_hash_supported(self, algorithm: hashes.HashAlgorithm) -> bool: + if self._fips_enabled and isinstance(algorithm, hashes.SHA1): + return False + + return isinstance( + algorithm, + ( + hashes.SHA1, + hashes.SHA224, + hashes.SHA256, + hashes.SHA384, + hashes.SHA512, + ), + ) + + def rsa_padding_supported(self, padding: AsymmetricPadding) -> bool: + if isinstance(padding, PKCS1v15): + return True + elif isinstance(padding, PSS) and isinstance(padding._mgf, MGF1): + # FIPS 186-4 only allows salt length == digest length for PSS + # It is technically acceptable to set an explicit salt length + # equal to the digest length and this will incorrectly fail, but + # since we don't do that in the tests and this method is + # private, we'll ignore that until we need to do otherwise. + if ( + self._fips_enabled + and padding._salt_length != PSS.DIGEST_LENGTH + ): + return False + return self.hash_supported(padding._mgf._algorithm) + elif isinstance(padding, OAEP) and isinstance(padding._mgf, MGF1): + return self._oaep_hash_supported( + padding._mgf._algorithm + ) and self._oaep_hash_supported(padding._algorithm) + else: + return False + + def rsa_encryption_supported(self, padding: AsymmetricPadding) -> bool: + if self._fips_enabled and isinstance(padding, PKCS1v15): + return False + else: + return self.rsa_padding_supported(padding) + + def dsa_supported(self) -> bool: + return ( + not rust_openssl.CRYPTOGRAPHY_IS_BORINGSSL + and not self._fips_enabled + ) + + def dsa_hash_supported(self, algorithm: hashes.HashAlgorithm) -> bool: + if not self.dsa_supported(): + return False + return self.signature_hash_supported(algorithm) + + def cmac_algorithm_supported(self, algorithm) -> bool: + return self.cipher_supported( + algorithm, CBC(b"\x00" * algorithm.block_size) + ) + + def elliptic_curve_supported(self, curve: ec.EllipticCurve) -> bool: + if self._fips_enabled and not isinstance( + curve, self._fips_ecdh_curves + ): + return False + + return rust_openssl.ec.curve_supported(curve) + + def elliptic_curve_signature_algorithm_supported( + self, + signature_algorithm: ec.EllipticCurveSignatureAlgorithm, + curve: ec.EllipticCurve, + ) -> bool: + # We only support ECDSA right now. + if not isinstance(signature_algorithm, ec.ECDSA): + return False + + return self.elliptic_curve_supported(curve) and ( + isinstance(signature_algorithm.algorithm, asym_utils.Prehashed) + or self.hash_supported(signature_algorithm.algorithm) + ) + + def elliptic_curve_exchange_algorithm_supported( + self, algorithm: ec.ECDH, curve: ec.EllipticCurve + ) -> bool: + return self.elliptic_curve_supported(curve) and isinstance( + algorithm, ec.ECDH + ) + + def dh_supported(self) -> bool: + return ( + not rust_openssl.CRYPTOGRAPHY_IS_BORINGSSL + and not rust_openssl.CRYPTOGRAPHY_IS_AWSLC + ) + + def dh_x942_serialization_supported(self) -> bool: + return self._lib.Cryptography_HAS_EVP_PKEY_DHX == 1 + + def x25519_supported(self) -> bool: + return not self._fips_enabled + + def x448_supported(self) -> bool: + if self._fips_enabled: + return False + return ( + not rust_openssl.CRYPTOGRAPHY_IS_LIBRESSL + and not rust_openssl.CRYPTOGRAPHY_IS_BORINGSSL + and not rust_openssl.CRYPTOGRAPHY_IS_AWSLC + ) + + def ed25519_supported(self) -> bool: + return not self._fips_enabled + + def ed448_supported(self) -> bool: + if self._fips_enabled: + return False + return ( + not rust_openssl.CRYPTOGRAPHY_IS_LIBRESSL + and not rust_openssl.CRYPTOGRAPHY_IS_BORINGSSL + and not rust_openssl.CRYPTOGRAPHY_IS_AWSLC + ) + + def ecdsa_deterministic_supported(self) -> bool: + return ( + rust_openssl.CRYPTOGRAPHY_OPENSSL_320_OR_GREATER + and not self._fips_enabled + ) + + def poly1305_supported(self) -> bool: + return not self._fips_enabled + + def pkcs7_supported(self) -> bool: + return ( + not rust_openssl.CRYPTOGRAPHY_IS_BORINGSSL + and not rust_openssl.CRYPTOGRAPHY_IS_AWSLC + ) + + +backend = Backend() diff --git a/venv/lib/python3.11/site-packages/cryptography/hazmat/bindings/__init__.py b/venv/lib/python3.11/site-packages/cryptography/hazmat/bindings/__init__.py new file mode 100644 index 0000000..b509336 --- /dev/null +++ b/venv/lib/python3.11/site-packages/cryptography/hazmat/bindings/__init__.py @@ -0,0 +1,3 @@ +# This file is dual licensed under the terms of the Apache License, Version +# 2.0, and the BSD License. See the LICENSE file in the root of this repository +# for complete details. diff --git a/venv/lib/python3.11/site-packages/cryptography/hazmat/bindings/__pycache__/__init__.cpython-311.pyc b/venv/lib/python3.11/site-packages/cryptography/hazmat/bindings/__pycache__/__init__.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..fbd48478c319af3b81879fa4177dcda68be2a9f4 GIT binary patch literal 215 zcmXv|K?=e!5KJtJ2*sms@X#*Bs|bF;iw`Ji8`@}+hBQ{ETK21bsgqhZ9t_;&5fwG0i~vy)lpp zDTOX0l^bZeZb6C+jCWP7H*u0cBOH$m%g?Oj4dm7vSC^KV%0tC&iaAWs1tv6*ra}vs frm^wEe5>l>BKgivv3h*2St4}-rL-e|vH|YCMh7~3 literal 0 HcmV?d00001 diff --git a/venv/lib/python3.11/site-packages/cryptography/hazmat/bindings/_rust.abi3.so b/venv/lib/python3.11/site-packages/cryptography/hazmat/bindings/_rust.abi3.so new file mode 100755 index 0000000000000000000000000000000000000000..f08839772bc057ddfb793de9ca00fd1da695bcf0 GIT binary patch literal 12955672 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

    i+$R`~DrC&vl%_W7P@a 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

    gZ{=JN~#< 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�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� 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

    Agqfpyi*$TFG4BXE)# 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

    7_ya5%Dsiia zXO>Jt?oWn7Y#Gd4&JJ7JlfJ=O!7;%ipM9uRR^;51)wV0nw+Xn(p2Q+7EXU$&NI{A= zzo7mglskcGtZk<0Zqu`e$&50Jz};_QWHLG|%{vOZ+Ys2D!~=1}qgk?JTBSD@st+c)lV1T8r5Wp(HJqN(>(^0^ z7cv=b#XnMn=8w4y2OUsY6iO1Bz7N(vYrK-kVOONfCvW~(NI3O7cAmBOaRN(Tj#^u( z21Y%Sf}{nTUD_T-#Qx^cF?ZT=Sk#b{Hshm>Z59SVKz8W^1gVLFHp8_y*70(KdC^Nc z#nRQDXBMW1JJ0>tyu@BkX==6;c5SZZC;a1f{9ttMtICyvn?`Ws0hNfQOak6z(ryO^ z+}dlh_zqfYBe4wm>v9Rd-DN;Bq^u%!INkAf|4MYvmy4(*J&ykUnl;h$EKrdvx}#EE zw@nDBGB_;Bu`u4H>JH-G8Geb8s_rsjvF0^44V<`Q{P0#U(WhQ$}CO zu&#D>rjsxBUxDa(hV%u5mh7g4=!!K~waaaDIG*8h6!r?fmiDD`Lo;%4`yy}ZS6;@D z>THw@qm3pi8)#*RifR+oM4u1bfnKdzSVk;hX`1k{(MQB&kz~=a$eoACHcLB9BWpW* z7t|oo*)SIcC29#BQ-JTdxe*3kNxNh_OOU#H6r+>W*^&`ORaTnZr7)ioa`0};`LU1_ z{D%!jg_S9~xqZR^J~Gp&L>9}8R2a*=|4C2O2BR2+hAvF;Sk@?UjGw8^V7f&ALibDC ztG8#FKTDCE4>4w8!4mW`3PY|h<*bO)c4r=a2G>#~`oK#Y%?FRFhQb5EvW2OP^SDel z|2vF;zRZJlNj%2kA5(xO+aH*T9#l|kD@^^NkrLd>Pv52&I%&WI@)rS4V8pV} zxS0xL8DAtsEFs3KAl$B~QV&vAPVKSddsO&!^+^7hU*xIHGjIw30mT@p(?v_#K^>-Q z&8D(zJd;=Tw7X#Ze+?_Wj#H<$Cf1CNtD~M;VgWXUq;rA@9 zT^wZuo>Wdild%Xp`B*@m*v88A=K8|NoE49Zimgi=U<=E$q}vUQU)deC$4}Z-!llmF zJQf{Hj7ld4eQ+?&=>jMS;MsWv)!pX5o}vO8?F+SZP6jtueKMzIu4_NMAUXK)^+q_G z8{c4&bi;?Aq8%-jDEmx2bkR=Ac%%@WgDgg zT*ubY>kj-Jl41wI5K!172u;%;&qM&rsyf$-=e47|SwZ_hZ-V9b$A=;T8VguL_v%V{ zJ3?SxL4fc?q28y>A|~N-B-UA$N$N=xIUiT=ktwu_TC(*N@(>1(p0_ZC#jQu8WuOQ4 zJr4Oa;NnB;T?$>QBtS$oTKiLfpA2hgjAE!(Hdd^h!fBkgN6xzIA0t}qqNSdR0?xfY zg=3VgAKC?~c%D#FEPjLvU{Jug*m>CzRa)ABXZ6Ni z)qZpIr^gKhFb(1Z8kF?`bIt-f_%Q7iQty#p*pfiOe{v`q>W&{4wc2!ZrxiA=6A?amnI zZ4|xjyoSko@YMMT9{PjTj@erK(W|~b(|~uD5j&7PQ844g$a|!o-VwTF(82=RG(%`R z;*F#YHqU<8iI56(w4ql_b2k4uq>u8ma7F6Nf~4~4&g-R%)@AP1Oli3`0F9V3U5Gd7 z(Ct%gyt%#yGk)V}XI!5LxvS|97V=Tm%$7r@Z8JxVhyW!+&To?0oLnO}-#8OBx4Ei+^<$e25Ed0Qrlu!aIdmn>8VYc> z4_38-mYMx?{UhkQ;k0ZYU6IHO zUuj`sWvRjr}-4pu+XH=byVdeq6vxm1io z!-@z>3e-l>#a3`OkeiIyK6Z5WDb_jF-3d+U+_7I_F3CbSAuQeOHYp*Eh+8{MdQqd z(9B^HibSesNs;%nkYEXd$rngiqIIZ_v+m4{V|O9*QcQcJe_P2%!r{GVW2n zMJ~!;di^Wxa?xfjvCwockBU;ZaXyD7|J8A8w#}Omj_5^K0i|z$MDho z&E^JhX^BLQE~rvf5TcCS3`Tf`_sX((aRcdMdmBtxOHtb_oxty0z7vt|`7K`@C;79F zr@b#!{DY6Lftuh!QTvK!II#v@hT}sINcK3{N8cT&cinRLUm#3z>8SG9iU^(9Nz_Jf za9tSc8D^4Vf8EFH0)FH%AiRvHAo1tPN{yKS?~B3OBHwGAdh;0Hg4~cVL%i=%HgH{z z?<~coftcB#dx(M^>>#^M*#HPy6kuR{FAQVMiG8oMkNyErZ>G^iK;nd`%JyJp?-%TLPu=;h7Uga?Sepy#w4 zOvv3Yrxm>oQGkcxFzkV^@w`Mn2Vn}RP#zSnhrUM`SCtKNLu&UI6sBm?!w1HPetz{b z^HNgy`Z@&Cq*4_j;S|iYN=>_x=H9lX7C4~DbgQ;0N;z-j8UTbv`<2&3gY8?TRiC$g zZZcQ=-^@zjJX6U8`ja`YJV#T=^gW@I>jrsmbOs`R`#l`nPK;<4H#(^#JRBL-An;eMZxa7OM4rSdNkL@9`G|LT^|#wzcCyL%ctL z`EC?W?Ot1eET1(U|OY@iNC0izbN! z?Ps*&^wxY1v{ue(nD_gb-YvjP2|oGPEbi^7!{F~i{b;hl|MQUT8YBo-{ilKGudx8w zdaIRE4KY4ea1ua6{MiYy-v85-g&NV3T=>YiZO<`S(sVA+-?ajxe4K)YJQQiZ&xzyM zXcv?PWE;?3g1-ZmIS@tS7tK~?;ZDqXegnFL!lS+*b)?yDz#2{jB!#c482-5bMPWOG~mh{+H4XA1zYouUP)s z+n9_thc%ZcrBsy4CcbczS`F+A|W`@>jBVRy; zsuu*m{?RG^3P+Qkfkv2~f1=`PmTEo(Wgg?A2+$-7Xt$it&ZpZ$ZjCcR^{?#A)j>sb z-S<|?h`g5GCe*dVqSKyhPuWPEC-^SAqf}$^XBZ1xMs?LuQ6iQ9u$k}J07dzTo#FE! z)-B^`GN_WGNqAzP$v%;Sh&L?y{n+jPjBoBf^Omors6X80H)p^dIvV zsle35>{4;JCh$p$bqw(zF$v3;e}nX2#8bz_0{h+mK*;&Ffyx->qxi6z&~JpiJ#**X zDi*P}I&LE%t#EKAW2Lh7+Kl*mynLA%hx`R{Qf5n1)GS2xm=?EW^9OidV0)j^7^G{v zEIXhNups?!I8@p<%07rBe?#*>Le4h#fhO9YLBqu8w!UdE{c8II4RCFfxllS!p@R&qvOvi1TL@IX2QpV% ze*OvLg7{kDr$9TTcy^WIRxniEODz`)Jn;>*CL5dv{{{3MhAF#>I!sk$D*O2;^pwz>At8nIf>tL>J1$#MUI%5~A5>OB`AEJ{(hPbN>H#}yU z72+b-Hs6tP7Iup@s5=<(JCAZ5>K-_3Zk9Q^@v^y+R4L~uN=AHtYqALn_tg*I3E=zr zp{uE_hnqGcAAE&YrTjA46nM~}HQRFd}< z?^6I01VKT+m)=1Vjn8rPzJR@9dsMhL0NccHIeoPM4f6gd)4cI#t;!GyE~zo$p)plp z8Cf4d$WLG3Qn)*8ET@yom*Qh*t*c2c3oAU?us!Yk1;lPZ9q)fIr4-!!mIx?Dn92gW_V))NZh#6Oy5y zh$2_C$Mf7?2rCxKKHcCk%dWho6EEeweHU=~Qqezl#z}6Wf91 z_HR7oCVd3-d|P=p>`73#_i*#CMcK|xEpf)YLRJavwJ_gqB$h~GOaq(IyO8b{z*1Io z+x~}dV>s&*rZoXa_%dFDJd@87vjYd_M}Hb_w_DH^B%G8CPhNuf)=+XHR-RTq0cd49 z>*>4vL-Ha&Aia%Bb3(I}cDG&a-aSIAU2N&aEgS5B_J2GzuMKf}Ar$k;r6$6}I- z@PTq8C>rsmPCp1UF1nu{1eJ*2jzgSD>fiiCy6us}+<12IP`cuWJA3dOjFdy~h&aJQ zuRsyhS`)&j(QcCS1W}G(Y4(WAFhueo!E0T64cRsU z=(X+qeb1dtB-M0ivRq`MI*v4X?kAzU9bZ>d%!)`J7UqD3egl=zP$nsZlI2$xf|C@P zedeoW5RN}flz%)Vi4HTijF9a%0aI_)kM0O*!T;CQw41mM5kWULt}l z;TX%&>TFyZrS*giu7N|yq_2O|6InFCs*wbOfRQ~+CTTt&hewmm@bt7i-KoCk)2%*d z(51cDymJM(!7~7CNTOYNlUOC^zN>~??upA?E>j}&sNj!G{C#rp4?(uuCTAj8ott6D zEh~CyR>EEZ>pM&aE={jirOtZLBO!%)NQ3wKaFh<~vt(8T>Zf(O?PuS1J4oo&;ncgy}l*TJHmNp{X$Z~9 zwLx{!dQjZrY4A^H=5~ixQWSKxYdo?n6n1WhiaHw-2lLxD2t}AaHs@e~Z8ot&}UIP{LnjZ_5di0E2OPM@5atm#%!yE=0zz-qc6JgwS}A|G_37=ZSGI4QDdvk`Hv zPd#s6i}H^rY&p1HmzNwvuBoxr{@LZPsC%8Zh4eI^@QgDSB@$%J+6}z^anuD8+EAp) z*o|UPVmeGWSSis1(Z^{o>jyYcK8d1{6tunG;o;Ubf)id_bTG!@8fHkI5R%ArCM)Xe z=NFB&)+ob=59|P*|9S95hJ|gdUJ)5SB;Rb$PpnHmIpG{z@+q9q4wfthia4E)O}<$x z_ukNK;6@EdCp6$)+atL>N^O(Ps?+zL2@4C%8HH8vmvDmk>!?0m^;FQ?QXkE(SpL!#?^Z*-zBy#A`=UdzwDU_q=(U31+U7Y-y_aJMWN}Z+>>ht;<$VvqzyH#q#bsDgWXnwY z5kmJ^C9}YYiZ*60f!CVCol{%(_Bt=ngOpd!PLr8B-y=Ww}s_E99=po|wv+ zFZR|c$V6%kd@4){qXv%(%b=K`v!YI9gYLd?dsJKz{wiqUKpjS?z(IR@#}A%1T@B*> zuH<=RpWQMbd~+-?l$l+V#Rc7ns=_|ii4}j_`g~3<~W;~%7e|*?mgr6z9+k=k{AGQZ#CvV zz2ADw<~zTgtkE+Z$jh$WVd&-wx&Gt<`1MnyN1~8dZZs#$3dI2%%o;{6Bq`33ikUA; zA>9Of^19Tq=^iH{XTs>wCoq2H+#ncSWYHmsj5sSyIMVGELi@aFHUAlQ_L4J9(P$ zRyX8J>4riy&cohBu$Xa+wGRLmlcmV&97}Q(26C`$2@-%vxWS{oOJc zl=}MTo8Avv4Ag1~hsv&ry81(%iX<%Yd`iZ4dSh}@0%8`s(YPX!$KkHBL#QGBnD_9p zTmX$t?c`RziVYutcV9IoBT_Wa1bZ1j!9x8Xv-v?ilMl4A{`X$gx?o*GZ!#x|&ytL? z&3*#@QZr7`(5!z&r+!)+-t~l9xO9!T;L{I2u z04Eeqm3z`SjhUI6j`Os#ioU@X5Wp3`TeXWYtD+9Hay0kdXg&8pqh-_U;ldecaT>rG z7X~ypp7b)-wAcahS3I`>ceExvLdXMZg4m?U3mq~z=Dx&<0+x~d|cJ>%d!ukYun7r_# z&oa_5+Z<5uJc`vW@!XwBk>H1%&(Z={VwWt(eqG$%*H8;?m`7wP5r2U9y8Vdu=?bta zg2`CmCp~RYxxZ>ppF)aMQKaY+W>wQ1*9x+b{ts>dJlT{D7}*^^vn@QEYl zduM2RHmq42mDwTxg?XpW907&4L5r%~SCP8=J^@b$HGlr1#5k%;ED;+;L#CTxYCxe2$dhR^x;*704bR{=S|hrg8?gpiU=o8y!WNje-Ap&v}nSCg_0mH_met-({iw zAv*p~??k7T6IIXk=karEXN-o9i5A8-EJTdQC>&>fF$!K-<>k+I^igma*g_IQH1HIr z()w2R&_oKnXdos|-)_!s&7$8I6|Z4*Kv zazO|iadekgT2xZAMpX(eSWpo`Ok#k%RmJ-l#KoTRNf>vn+=nc0zt;i9GRd&AZV`z- z&82G7d&*H-!g$j$K5m}cpc2N=)rz)Fr56Oa?ZzTX9z_7oCn&TT;J=@ugp;}jC8;mL zX{}^#S-2slH9MF|%ukPUMs;#vHwoTt{=fIg%oHy@CX`+OYgQ*P?DH+g>9n=Frfxpf z*YT8_UdpN(g}0ZNJ8@ParHWDZVG0$;=vOmoD=h5d=R$Z$rD$knum6pK{Al2Uy<^!k zcadd_T-szPb0mBJkZ_Vg!kE&h$x9*qe1KNEm$u{E>SRR%cpUG=NrAM_&FI|(CQVwW z@N1N>I2CMvO%*51A6woqlFXHYPljgc8HLy^D6xDR-6*&^mqxxOc8#F2)(Gc7jjwC- zv#w2{A6Igi{Vnn@bFqbu5QhM#0jr04Ac$G0{;H}~2k>e5GRVyEJO4Hgl}(m7Mzip5 z57LTXSl6|)cacq>0YC3xmxIqm#fXBl#V=UVYY`KhPL40{AR#j^8y@*1-4`k(hgQ!T zosG(c5sygH-iO(J$MUTtVZ>nYIWS-JmEdu83)kfj=U`$`hSh=v(NOoNUe`Hf!@6~` z(DRHb6VM?|R;Tl)(o!$Y1TPp`R^Q^96y8twvY)5yUJSUG$lW4)9Z9QyEHTCyY}c7r z8l-AHUk%EjV^h&3b0BfTQnJ2fqAKXZC^75+N2`=cKRAwJ*mi8|Brw2Gu{PXktlCp| zltcR?mdA}sc4+*v`#`i^nTA^p?#0Z%d1%(ti>j4Ei6RBTb!r}^KpM3d*ryJ5d@>}L zMRx~+0b>Saar&3TzWvrn56Khzoyj0$@@{BzQmoeNPWJxX3#G;~{QZW3vWLz5KFvQq zq)M`yjtICkz$V@5Mm@dBP4A^|YD|h)o%y0{q#Z9+)2rRl&H5V7_``B|1=N!6P7K+U zJ7UTow2RUa++K7M2mDZ2b;vz^t=XMq9-XxNF=@{E(2L2Upm%Jse6MRMrnzDwE%(fk zUk1-{kYjo2%mZ>SbIbXKNUjO<6oc;UJA7V`DeBwpiUu6)tbly+fzt?ENigH+YqbL{ zh$52mxc{#Ai?77?IRBN5eZ?O&E#pw|M6?%DzBOh5c^9R2QqcrbhlTb>yB$t!c@@SY zR!3XEXBcUR1Nx@W#zZJqU4QL;N1_9p&ojo>AvY~RT)y_^X#MH8E-|m+d_m{Zk|!kf z=MI-~yh8sTq-R`h-1HwdN6=k8c{WV%bq zFe$tI43m9F;68@*(Qi4?DkeULD+CuN3EdvSU4fuoJ3h;TCY$Jhj+Yn+Oc;G%;X!mq-6Xc_N+V@R9 zRiUx5IIb!io!#~#;)oW9WQ$u!RB2bL-Y!cgA&p0Bm4zOqkAbql@^?5B`l?Zo$0~!pH=w47sjL3r{M^vYm6jA{g|_qHz?7O-TrR~(ka%`S!#+7 zQ;;;(LD8v+Sx`6_{Psfbl$}QnCBF%fCxWxF(>fv?m$;L_CRuD^`uBBy{GMQm*}@)e zYSu-PCw-V>)*?hJ9kV{I%5zHQxh$i>Ds1qCx~`F5TtwMF0dcR@q4#P=$?Xf}7J}xW zaC6cNqs#QnAq0oNuYq~t@JWFu$s%1PS&VawOBFu#GTb6iedeFz!G z!A{Lr*>Yhm8oj=iI#O2gS5M8Mn-UbK?3BzbQF?| zOf@Q76TZr|q%VQeQXbXlA2Cyw5OnNIQDnF^MR!m5NZwm<)~&pKyon)mIB>~|?g_`9 zDMelQuUdrSekjo&za86jh#!5{hzyyFSVrm-gEoYkWV&FkL)Bo;%l*}`S`C3iZM2Zg z<<|uH*g0o2d@~JL8XN*ZeCB9k5vBki3ZFMSLGP87tK#VeW)l9K8DB4ji&tk8Nw_R2 z1HkpzeOEUyWR>@b{>3TuD!79(!M)8U>KmM%GX$K5pr2UZnK!XGl|BPB(3R35i~5Di z+?~BY_ZQzZW47HQ(JS*z1dD~Ii0@UGD)RoFnooc&d@-Gz5@-*m?uF1^$C z>C9cw{#~db+A!lS+4E#`Rk^;|zIb^Qla z#AhPDdqZAp8#Z2b;8cSFmBp3WRI>7gUvlhDE43_rVM~OyUqa9IRE6yl^Z6=1aA&K7 zg7iGWPQy%IaEhEIs-3WePkmd^(CN{gk~rIB@Agebx*@7#2W#Q`_>-b|(XqzAsvy+@ zw)GEsIXT0ea5;myeGGzb3G*}ZfG#_9MH3i3;k6ad$&<@G3@?>(V3vP zat>#=A1feVW8tVXi^#17*@^jTA?P##jkPHtjpo9WTIFw&9QYAHZz+!|M)4K$Vm<10 z(-j$gm&gI5Wp|!{tY))`ZT9JP{+G; zMXZtR@wxl&*9`_!?AMifd1Y?R+Vbu-f}rB_8c|d|>PjD^N-`dCcIM`BehyXl`cl7; zQO&$6#ylbx(}4J0>oO~TEIuCwB4~kA!g3xSb(;3^OH zM4ETp`_`8j@*@naYIop=&85@Z=n~g*f8)-LPWL7a$0+-t0TZ?;$Kd}|Lvqt-Attc+qQUn)BI8~w9<=SVPp%{`nk_YAdVuvb_*nJ zII6z9*V>TCfo3gUkJARjKUF?ZmtUQm+kEm4Ta3~w#f3hb!$(rDl?NFpXx+W*F?duY z^nyw!q9^m6_(y(toRKyxImbg8Ie6s${uU#uxdHLg2~ZrIp4_}egVCH5>Q(#4cg~|R z;Y{%j_NHKH8|U7J^kAvsDGc=6Np+fyaK3_cm}{A-Xwov?nhP%F;%+ggW=`M<&D_k4R)i zb-YB?h0pW|Cz7gT-{e!(0UC1cY_wfb44hGp-gtkEC4R8o$fJ!%$+Zxk#7dR3H~YcUXadFV>hU}CGLrK+$sGc-aaZ|a`86VF4KP|K}#rT z&#er|AC;#FFG6FP;RguxBr8^sM6Dvx<(&Ssv9b*i8}-5s9aQB16E^ERfq*6jN-VwB z2pd*irFv3WRUoGhr1+`q3q2%nrS9XiSpT3GIE8yB=4l#bKYg~=wP~oiyLJohBWF~C z>#w7dNL4;qcXT$FHD?QLqydinBI~$7%E+8vLvvZ|ZO(jQNX5@E-IX=?-4Yvq3LecBI z=!UDOOA%N22R^Fu^bV_u7ROqz**O7(qx^{QN@RA3KXYX!X$o-&s_H{E`)Zn#~XU!0IasJ4YM1 z{id);{OAvFOd{i3-+t&0&t4=wVIJ z$fcnvC~rmJz7WjSD|XseT-l1K9ogv=A}$qlJhFUp4qKPsW(=utc3u5b{9huixV5#e z(%$-W|81+CzD#d{XVvT1OIK=1ve*v#fvAE0M#4dGoZG_%NLG;vD27`IE5X-$jfGY5 z(X1aT=?SlVbdz>pLYf%5+-W=SWpkFFj^Yc+^#SOz4lq|QHG|b^thkf6vIWhFAJ3x9 zK+H{an+$yWBc-iHjN|@I%$X4EO`5dEY4B-(H(WCR$!tf?SR~!YDQ)nhD$|H5Xr&FXeMc={FHkFEbFPFYA59P?uNi}T`Yvtheg!K<7ju$& zafQ?jhBof#LTrgG!V^LLP4Lj1=dFbSklv^mUudk|Ja7-SEzMuiC%GoMiPaXe1BYMM1nlx?}Y8*;N z5**K9GB_z_Yo6J0RBc~oLp|!7$c+C4O_w%+o#@Y@No>M#gPhuJ0xY!BX3*L?0c^_d z^Q2ZNa*z94lTg^~d9?_$;W5@sr@=Hdg&C}t#u zu4H=7#pzgs(QGB9lF;6Q&YYdcx07ypS#HcHp1U!UaOB~jDW0l>FblUt=7l$P8W_L# z39XK0EI;*4(SVoL;WZPyW*g1mAk1mVzu>z!3TK<`zV9f3+*8iwrY3`Y=X4BXnvS^A z-~={EBHRV*C9@y3WgY1+{3LkN z`=tkWkSG%vQfD+tgT&y~pY~gIc&fJ3-4mu}*iclQ!FYdxq=b*0K=ejA;{1>(86BUw zM9#8kL2LndSwqM0BjCCj4&xw*$WpPdZ~Eg!79^ZtK7xe7m0fceQ5^Ul%I(MTcz|-+-lF& zvg0-0VizV+dx8WKFvLtk6avN*p(4#`m3$-`)-TS=zEaV138h)o7N=toT7zuQ?R^;S zRb;~FiOxyjHuWd942jG+g^(DbDm>V$35hV%JGUAu6w~a4tM#*4zlCbXq`vZK3Nkz& zRHSV<#f`0o5yZE!PV?%-mwcBg0eBqxxqij#zWHBx#3INf1x=zA)Eq`C?2i46MJMo1 z8Q%L9;Ts(pQ~$K|)@DfAbogV*&>FH8P{%dWNvuZJ$+f1bdJ}^Se8)mKS|Vut0MH}{ z>ESQP&tngjA4J9*u+buqM2_qk_c(pJv4419`ZJr~SOFQK{oIrZN^M^`vwXxRxKi$1 zHBV~_lNyN_0I0L~k z7?Er9CIP>R<5Ugq2J%W^)JSl-eCc=gh-`Q+fMl%US~t`j!9LaD&znXtA_hkdG@Jaa zqqN0WyF=%!MekXvv;h8y@$Fe7@1!Z4XoIx=E+jx=!a7m*({&|s+olZ2HvseEONN+& z&iu(OHc0{h5}|}~=}H`eb>)?8_*|5zv7{d_N&*WsrzJ&TgENm}i)`mB^X({;^*>1L z8jC3k>F8%6nr(A9v#Oj4Cy8eL(g|Ea9a^>Aw3Z~4LrUTr`}LE-_NZ@3P{#;g*agYL z(dx=qt}_Ra_t)u^-F)y|rpY8RS+%5`HHmZgMSeE735WIEdVb4iFd!coD7VM|OGJV* zfULSTJ1_^Keml|ROn_F`gTz^*5Jo^>>32#zG?SBOdBq)Il@ucXD{VV^(?=q7ysx`f!cTOP= zr1}(dZHY35@#O*RXLxo#fuR@i_^rv67j#s3+HA|JQJpkx8&bFFxX0t3T5I*+mY_1p zgpbUWV$*yyRy`IYafH^p5GCR>a(y5~T@>F^PBBC9tvv(zJn+SLpf}q)PVpy4S3a zB~U&~hL$PYOz7OCUq~N`aOR>~YD`nMD~qx@olD7U?58o>AiUOQcOe~+5q5^`warRn z5O8xSV{&Ml!YCnp?j%iU*q@=(>vF(5-HqEENG@Sg*kl@1*Wt9Q#Ky#|mG1yXYznIF z(l!;4M|VSpKq+Am+CMbtC9hQS)+POo+4-L}h>J#iuSN%_&JJ_SF?yGQO3%W8YYC-# z!&qc9Xqc)roxP^>oAPQ@*u^uO{$grgI}^7A!{$&(Xl{L30k#CBzIj#OmeNe|+U{J) zTH_G0#k}MF#l!^pEJ2Bi?)jAu>$ZaKS(Gf@s=}3JSA;J9{3p|{gi3dI)Mx`DH_6yL ziaz*ASG^7Ml_ZUps(GcGZb`17mRVE6y!p53zpn?A(tBHN+`&3MG9qyQELl5tJ_?+e z>kYcgdKpWfj^`NfHf$*n-W(x!+Qfo#mgs)kHh86Q(igT1R=1onoXzl%{#E4n%l!fK zG;@BtJheaUqNbvtaa}z;@*}`?n%U)o^PS zv1j`MJCvM`9S5)$5A z{UAfK?V{w*Fi*p{WUE%AF|n&AU7Xp>@OOWd9hkp2YK3NQ*NbxrZRZ&|k0X}Difrd* zvoNT>f~3Hiv`!2E>bSRMNc&5?gUya_ck`mREE|{Kin#Qob|JJzq#wTZePOxM8w1S< z)iR5~7`9V=)N33gc_M0T^d!V&*^=Gf{{wUKtF>`>C~@f>Ru%X%rbv&`Rlw8rkMxC4 zXeD(g6e=Ra3^r$=LD{BX&HuPoT5*wibSehMm)DGe-tEYI?;6a*x2H_3rBTz73KSwZ^eVi7Z;5yyS`L55T zy473*NTg*8MAuy2Wb;RAmJ{5;SA#3)D|-hjeAVg2w6P36Hva`O>r8s@sWr+?`VjNR zXn*-qv$xw=&jJfjJ9iA(mLEJJNG|FX7~t-(SF`^)fb!tYB+0qt`=dr$$u+&2s|}|D6K8+?jKy)O621JA%izAxn(xblwZZtgpgmVm)j;9DYxO%j+s91$&cUvW{SvnSJX=9xn7L zI;8+XK)%1Y#F?h+Hnox9aU7B#)w?EJd!FLVfTm$P?e&g&ejFdVLxAt)+Km+$7lP^* z`S71vD~fjkYy1R(*CVND^G|8o-$eRb5`Sj*+nI4sc`9$@_K$7A9TWKJt=_c=e9pA1 zS(;G-KI|&Ayb$-q8sxorSFm?IT5A}zfWLHPL086zXFrPsRKdps-Wf&4Pt4yAMmPuG zYpU@`H>a90cb|~T0*arD@4tX`Ie{gR87IQP%G1Bt9u>;TxB; zKm7ykdyCw_P8qy0Pc#GFwIE}Rr&4UDll`{P<1EOFK@(rI0X5T)3`H ze)6r;wchQ!d4nCeXIMinZd3~!VBMwbl6^&4Fn4g52+}! ze~JG^f-Ug6B4PRf=6S3tSM@fI7l?u+R>M9KF&$F5`0?)*9)?Js6&KXt64aq8xH0il z17i4b2$a!3+NcfonVpR%+!m)wkQ~LR_c28|9JQVG=&)e5t-Un*lF5&vz4+9e6#69a z)6l6S_b~NbR-26Clc8K;9>sHSJxD5T-NFs(5+uu{{};I)K|E$qo+;ky&vZIH0+M=4 z51F$mJzTM;SoOUH+%nX-hYNX)y@BsV*T5)p5&`00!+w9!Lpw6BZ_yQ4(luZ+}S z5F_m;O}H^Sbyh1>*S_8SP~G#(Fxas{79Rs8CmsyT9fj+J1s>D}3hI-gC zCz`~!ubk~Fme-*{E%6QqYKP1_1(k$N<4i!O zI8&z*UfZF#;Ylmft);&dQ6L}eHjjd~dF#5Zo?E>ESOR*T3`>L_4IZHF$=`m6bx~qV zA+~9j-JcK?n0xs4R?4D?y!H(jh_^2O`E#WI^akn-Gd<|UwSnzJi%9)md06w=4^8Wx z4`NCdlyhpV+k2A60}q~`_l?3uso~fB9%g7L@kpcp(CGAh;5dajgu>Ko8HSoDk)RkR zbFpz|U~YNuGRBaQloKbZ#1Bn7mtgktoh+^Zes{~{eF?@vF7IC2Z`|%_p=kG%q`F-!!~I9!n|mDf(g)CEsz(%gJk4Z z@SS_cR%3HxAiG+nQoK>cn81^(OXgp(`AI7{M~(kYts%mm*7SWt752(`31vmQWZV;9 z6bBy}*@?yE2@cdhtEjdosXj4xE`(L&iWhKf$Mvo1|Q3 zn7Qw>S=xLTx(-G-S?O=y7&ychHvpf zA_dgAzo!%4*mVVVfuVYz7Ebpz9PJ79&ptX9k)%L8AJ*z>s{H8R{FRIqZ=}r=ZX21S z(5^2u6(mS`a9L|+-dno!-L`77yyj9JJ>3X~=b?*shGhrpD%&tg`WoEl6jxW-7l_68 zeZR*aZ0YXV&8$ajH|&h%`*)%YD#QZk6XZV;QNDb{?qnC;IoCdW-h3Vez~Sj!S#--# z60#*J6NOea90(f##FhViRJ4eIy-e<7iVU8b_cDLm%SR+@7}R&On;~%1s)Fg`lcl1< zELGabK+k;zcna|v&9;%+U1Tg|UXad-V7i*fwr zp$7>4edp-8J#eR)L=Rqn^EQrQ4wG_ezI%WpxOaRjQ2!^(1thrTVvskz7X#4Q7=D{6?Ij;=K*Z7omMzG})k}Cma;(CcDU3J!^2#WT++WV0S z9OOPg=oh~`J~TdaWj&i`4VcH$1ry=YGGYZYZ+gJ-n2&tz^hK*{pPB7h8wVp8W1hui3C>1P7ID+Iig@si;pSj0E7G_{5BXhAH4 zy^_(O9Vhm^jGTy3B0mhFlUgu?=vyfJ! zbYD?DtmS#yPtQtIUm-AtIy<;%ZgqvwE{k+rvV7C!SaLD2#KO$Q8iX}xX;7U#Ysr0m zy;K+d5adUp)!muXlx`_yyrqx4(6Y7mdnXJ~XRTg}U5cRJ<|RfUNAR4L-2VMhGRmJQ z3q#3kKir$0&+u>K-VW+m%ZK4FKMRmrAg^Za*7T`gi zwq9WFB~6XG%@sLXax@XOxZ%J=+(2iG=p?Yq3{M^IQ+f!Aa^u7wT%eDr@;ZyJ%a!ws zi&nVap~-O`GCli%psrn`f&2I@X7aY^YH5&^=&w<289IPbZmhn6fRG`Ee@oKiJVtNd zo&9`r=uRkd%4KMb@AN~reT&F4&K=R`n~;+?=DyF54r@9JGm`A++AJRd5VnWG=H#br^*NE)vlhSIyBo@Bv-Gk2jHd-^D{Ei zY4Hu>(ox*3P>Tls?3oTGGiGdfPz{Snn!zB z*J3z4?aGp^_OH{z7^G7CyT+sazSbj0eL*`MsoJJ01# z!^rb}xif1s{Rn8c<6n@yYQaUSfoVgJVtdj(`deHjO`F}rzg(7ahl&RLzwIN=n*v*O zB}a|7z1jWF69-{*Qom*rU-uSqwwvS_B4-2w;~8%~pWj2@FUy7I(8n9^GQ@ar!6)0z zx9xwooEw(ma0MyCTrb=nhSKv!N{Sd~MV}z3fYE* zKX$i{cWx;vR3tP%HF|?WgNAX)F~3%8PmUl2V0 z6k*z7r2RMf*J>tAQRWjo=r~!0DX3%Pa!ci%o?YuMx%$i?4m-KNB^u@>U%UT3JqgSj zLtbTnVa{YZJ7=^NBu5MXplv$83O1L@DcNICUy*g zQ}4D)jqexw|2yQ9CH+UQG6v)eKmWB{qaEgs261Rq5B-X;ZW&~Ej|wU9?Xwz#hr>t9 zW*O+pPy0?7&feFm4iQO5vs3)s`7*XlJo1=kXMi8M)*33r3K)c99jF$uZ!!Vt`1S4U zMBw9>pG+t6$)C^>AcX-!BW{k-7hk4UJZLL5DjudTl&W4=yphr;EmHruA;){3Z%y#0 zzi4t_NEf85KgVcTt?uA^+rovPHIZ@uLU9Gb{F}C_9gW?$sRcs*X&+zz) zYQR%9w46AJ1b|=mm+jj*9hnHlH?ScF#Ej>bHRe(rsI&$QvdD!~1AXYQ+uu#tt*=Xy zX8WDQatHTWaN%)qYqcFZggOU0knxH;14&5(@E|GE<1L7NK#9+?3O{3!QIC{wc(Jf@ z$WtbGFx)6D1v-%1Ntl9&yV4nI3|$Gh%YyfY41buINTGO)Jg=$4;L`&v(GP8_Kll!9bY~^0X5s zu^xQ{xrB^6N&B*w;*R0R>*;yW5;ETsUhrb$GI z9TBC?(Y`bP^aeZzw01oWny$L zLX@_FycV{M?mS$z0B1-+c%qy1fiekk5C^4XoNbk@fqsf(i}GQW!`*;c-&_?`dL(bs zmP*^Q0MUm>PEL27(l>?&E^eM0YTyc9Ej~6JRHM)7K1h>vjk$Dxvpj@$M`^ayk!8xd zj0#2sn9fqPRgZQP{-|d4FSVPK05;J1ClXyz!9)^fm~HJ*?AmEkNanqh1`U zJx9#dAtV_atW3zAn3)S)xOHxvEl8-a;v5+|&|#TlFnNP*Wym|)k8f@TQwEvJr!&!H zK^%sJK)z~pb}~SV1LOGX8r8J7T_p-45i+y|Zk|B`EESi@>MsmqwnzVV-r651cZN|= z3oDS%y10WfJ22ZfwN6Woyb(}!E%b@Zo6!l~yL3IYP@~(5$!m0FCm9^IjIT~M>~gIT zmSx8iAPm&_AyEV{o0og)x0x+%%{%+%bj^6p{`=2{o?7G)_9Sp)^c<#ml_F3*a>#4Y zh_Z}DRA@KxhJ`OQp(fk8p5X3F&;LI2I{OT>&BWl>$h4ho!MF)+-`U6qLK?b2ZN^d@ z_m$Ld+GJ8EpB4`LVuO9lGA_t9^J6tYPo<~Y zt2itIt%&fQ3e!KkX0XrYPBrlF+G&wOY~v&~Quv&J9lliovrlgm5~sT#0k0-Vp`mL~ zwD9n5KBumCF^iJfP9&;c@@l{0OSU&c5>E(?2mS2hnZAx_*j6oR5$0Cnb?6s2#2eR zyI;uu3tPIS?hQPenNrX~&K9BOLM^cA{&knGwp>)908+4W>a?RVeQ!{_GMl}Ncrc0O zmnyO3H($KSakg_x1`Gge(5GK^BEPj0a8qg>@LPacnA?Cto#Lfu;~Z;uZ;?|^CidMk zANEgi1JQ+`jw1#_Yr-HbIX(yBYVEa)gJRF z{`jU^Hjl{ko=K`oA9An{YbyKW)u*#)9fguQeF=!C6G?CBihm9UypuW_bH46^8r&M9 zW%Rp3{SE`~q;CtsyO*$s$E12B+II~0GRBRIK2jsXYQp<(&v`{O5&!n2_D}+tJY^+V zxuP1pehJ;OIy0a*laq)CINP8%abEQt6BaCae@I9sVe-yDHWSd=Dej@qD#YBZhhm8D)7c*;V4QG0UCbqm}9zrwmwcy?+$T+61Y%~zF3ux!o)6Ue@ zmq2ge3!@TsQWTa6nx%>5{b$(ofWgpGPbG6MtaLmxqu67Ryyq0tmBps*?U{H+OGf7| z)72gdJVNgr6L!pL>UMr17pcwXAI{7t7C(uKYXR62Yfs0Ygx=P?VNMkD;ul!@Ozt5F zWI;6_k{QMewCaNupNDcC_R5fSvgc~|^Vy1-_g4|5P#G8=emdId=Hb_=U%4iP>x4I! z5GpQIZtdg_dmeSH#Y~;Iy%9qFa%B0F#!ueJ($jK`Wbj1a^~-5{;grAhq711$;*==y z_$5;s3)UBTY=1)vUCYUqh6LxE1zgfp z?6=V0Pz$k~A$&<{OD530mTXjv6g3I_D)ifV`bVi)*VfEQPK~s{fK|PSEU=INvUAi2 z=`~Wv^NJXv#Tu(mz;0KUyrT~TFMWOs=tjxt09G(?%*mxdv=gw%sbGR_T&TNnPcUc$ z5!0Zgp$!SG!R{3#aOiMxN9tjO{x!P4I2q}|ngMxYUqSpD^Eh^-4-UG#yIjULNGwhR z`wkWYDs{@PJ^-xA}2;$e`dy7gA^ z4p|I{aVyqXqkQ!T_XXK= zRTYk`v7ZkJF{P)QgpLS&e-xVShE>xCHp57-t41hbc@EDEGW{TP|Iv%FmO1u5OH z0OP_^&1XVG)}wy%Ut3@mZPAvCYj8zNNf5Jp_$57bj*Io@b^!B-TjaIrT0I3_)<~4m z1PUS3xs1#nX;S;zW7NlMpGd=J3b9!}8y;k3jCg4mIJj)REx1#PB42GI=GJC#Zc_+p zVH~Oh37D>C4cc+ZtS_3xYpAmUdgqcbz#xP>R<&<^0CNQbhYIw+p|U|~D*spp2xAKr zHmf8wV?%(4nc`7bQN2?FIzF64cFkMIU5AfXBb` z0=TAPOF8GpszIEm5bsy5gKAqu4D_aM>vvKNWiw-lYw4dc%VS?SAI1+0C(*qkgbXD? z!b0f@@l(-fU9BO&2n~{8rGZUyMpvIAnKHUtlDPl3GB82jp;3%cOxZ6ycmA6y{q&JB zIpWRBp{>@_7Cs3>29|bM^La%WTw*rTv#69Tj(tO1z_}u6$n)9QBjidwqL6Sd!7(iN zy;W-0^Yz0@k@;$C{0Jp9z3W^X0C7?c*9}D7&_GAH{bB)lLHLez`})S;4*uJyCl4_9 z1>fK5$xgcdUsVQum-;21gKxzWG>n_m148(B+wCPW<{OLc#hv5!K_tIhif3JF=57zL znd;D2&u&G!Lu}v|SP!n;s!LlBCq7pWp~Vo5E?rVOpb3yWT(oS`NOYavz|F9>CVVsDcA1=% z6mmwB>*EII<+5?wVwk1l;FD*uj2YRicbZhJK)`>So6~hJ|4B%lftr$XUX@NhRI7 zpJW^aZalA*`wHU%jFM`zxQL1XtyWW;ot_=f@ug==&e+(cM=n&x%(mZp=pP1iL4jwO z({F;zT2X*Ju~_E-gHT98M>76ub&9UGxd_V-;Ze^@jX2M^*12J6U{y*q4E>jCxOit8 zdB7I3A`l=CLEevL#b(LQ z9bhMZeZ11B=L;kM;p5D|wf{2!YyXrpugNlj3B{1uXm}nr>#)SCsueBh)83R(eQT~G zF1=7i)R|N2jxpLlfQw_1`oD?UEul)G&?KQ=M7d`+nYghZYE8sMX?g6GH(}^kN)+Fb zM69iIAl6@z0XV2xEpq{nGp3+AC7oC7oYmIJd|uuL5P<0fu_A{K811Kdi|Gy-$C$( z`WJW-2re^=+6=*lIrRc z$c$nF^84gTLgLx-xA=tPoBjQiYm7o;RABXGr3ti=Rix!6nq0 zAcBx*mR{tP_SGz7J=m{J8aIO12kgDC}=|>T0FcQc3^7U-iSNo5XrW zuJ3=RM4dO7d@YD6irk)1`@I0rWaMw=d0F|!;Jsn`6=6zH8l(R2ak#TqR2stYZQ?yG zzf(tpG5^~khMgv9NzZ=fkmes1QfU`@U)w5w1Xxi6jViX$6-#;U=2YaW?9K%6tZz8* zeCn47QK$UT68~a5>;!rn-+@6D>_=GpO5g|}a@X5Ijuc1HR3?-nbDu#g_e90%(=eZA zNdZ*IBf_Fm0{cy46z-{A^J#eW@J|O{%sP{!jfd`Z(O%Y1jp{1ag_^tR{(!o zE;A;PZN1Zuw88rUB@EqmWrzjLKNNONBAFy^@>&Xe zQ`1mtK$P!_df@P6%u62O`jASYI+=1r)KLt&4B`fNEoU+nFDV1`f|G(F`a4%rgWFp> zskVD+7$c{oz-8J9Uk2-Asv?cWh1L}tY*`lD?lW18d1is^GD@DIWrUJXR$e70T8o_l4lsC@4$F)*s znFL%<{Z%)6I4e`NSY@GZ_ipK;iI~RGNRRDdIy`rrygD+QKsseBk=Nny;RR;mdKHIC zWDwLv7UsOmw|JV5-R%d&sze^oPnKJw*wNjAnK=mko-;m20%&=T-o2D;h0#TY+Db55 z%eaek>O`)B4&jI2<28z6yAZ3`;owms9K~U2mYfpaXb+Krq(*Wd@{uK9?nJjPS8-xqKhsA% zXub0y$zp9yR``v}OQs-U-v?cLz{Z+7gO~GuSd}ZOPn$ZcG@&Tr1urGB2Z+Hz9Gkj; ziO_!h-KjFg-o}lr31}o$@0^0a59m%?Pk0*;0~YbNyG5D69)Qw8zMZgFs5Et{FCeA+ z6qb9zU#{4HHH0vDW~K|JO^k-qeD`vdu&UQB{d?~W|9N~Y2#%HKiDonJj-hwILlQX(`ul(?GTe1DH5cp%Q4#a_kZ_aLDlvS zH4()5@F$U$lS!s%$zUDwT!%sB3|($zGs4rMPWa&QU@ZU!S)gxSO}seM(^Q$au(7`v&N)=(tCX5l<8}RFI#PEA{PiS^*~^PN@9r z^Uk-Nz|c{U$nI?^SpMjSbPWMPh=H;*Uql-hgOdjVOsz42;~~$R=!ZGU1>)a~kBlzK zQb9lFJ=Co*sbZ9JTJV6$L$T{(Xz2z!aME>iGwTOwy@n$Cy}rm+Mk`~)tkM(5LIT#WdP3S4Ms-}tw`DLf z-lG@4n3yB@AOnL;KbE)i;{!5~pn5EX`+73x3d$m{wh4BYk}%;o@mO_rV*9vr!Km!_ zG3diQCl)jIbVL{AGy=rK%87ZW;DMk-p%?w-YAFu4efyW!oN*sWFe^tZQjBl@m?~oq zgu?K}7SYU!Vtkk_uZR%!&*m*m+RQ5|`S5x6{+y;Azk|AAsuN8b-eqX zM|Zuj0E_qf+7E-$S5HGyoFt6*t8EFGMRgxbv%vU|lyARtOcPE;J@BqH#eS@}^ik3H z)u#>RTDi{FxDGnpu#&W)V<_FTX?qoQVm(2{PRGRJ$HZT}_n$Jp+MW7f>MB};hs#BD zt@Ri2dT$o6^cRD!=5*}N_v6$1{Y!`7tQNKXqw|5r8DNAxupkzET<#JJ0mWl0-Lz=B z9>r*8GR*_5TgwYh_jzI}5M1bLuxY&)rqlf$d1;h#?2891XfmMLQi|5USf<870678< zBoOM&O%x5WA;Ipt+_;JbbPixz-OP!*A+IwN@u90a;OZsc&qQ%MZlSF#yqK$Ted2y) zZpm+YOp6Ga)Z0llpup7ytixFGkKfBeh1Ttdu(P&5&}8t2_8bQybOQvEOX>xF3$5WkmKPPK66?+W9^2~t2y>9u7;AbQCXlOW?C&PGNM z$*2c8_D{N zvWzD`>ma#Mea2PoaRqjcEt<>m3AdF93DHn|X+sSe2hRsW;eQgufqnuzX2t0`t-1KA zrMthZQ3$bG^;VTuNY+QE_j{=;Tq_sMBs2QFefQuMohOENm$yZu(*uCxfHZPisLfxG zpA(M#{afz6#8~C?cb`Aw^tx=)DOXw%s(Zc2vmOVHB>84rNJQ)@7 zEGE)pC2*TRV$ggsF-msXGJ~HPj-7Wf3mdT(20;hd*siX4pQ{&njvf0bzMOitGumzw zV>K}@Y^ZUgX>bbxx8_7=q7T_bL*ld6X9yW+NQ?wooz3Q-I2Ci1D6jyzPvFWjF9s5z zg3y_hyvPTE;u7CMO2z0$b3gC47g4$t3okZ->I)_!Aj}vV9wzFLHr62{pP7;&ptcd? z6w_qy^`TTdOddejx}v;qgP8#tOZ>l&lQOMFK);4J_R~V4{5f#8CcIqhdDJT3V1dhp0f6yspi>mAed*uaTgpLfTk+< z!T!Nm$z2{`H?}EkxdEQu96UUpu;9-tdlJa+4fPT#0&x&Em$P|Dv24w3Aup)-1o)Eo z0%WwQ1W27wPzVpfUHIMYst96B+z^D4+!7EuMw}w{wz(&F9>k}`LP$iaOHQ6B>PM;R z*`b>Ryxz!zf8_Z@j*A~*{-JmJC-fNgYC$gj!@5opaQgqndufSX>BLw56ZWdHtW(ha zMOs+u4V`Amdk9*Wer_fX*=5QPxsF$WxJ9oP>WL|SPFlyxEg?8`xHj)kIm*X4 zYG(q}l*CYmNPH~!W?HKzPDVP;CbVo$LHKejmYDhY$XqiTk%Tdf+<<87Z^J zVGWWSttBL&wzyh=hF}1V+7iVo{lN9SYJ{Y0*Ek`p*iq`QL)1((MRjD$K#+aCkM1c1 zmYkb`-lAsiMAxU@CG7cByCD~6LZ<#N>O?~k(c2kMi@Xi}HbpQ5k$>zds!&S-O#ueG z{v!Of;DY8Jsbkq-C&z{Uz^h2#Eqrh;6S}Po|E@)*I*nl7gV?X_i^A~*AKsL`-Yzyg zK|Wa%onp|9uWoI2Z*yJ>(fN$_5hJO;R&{y7hwu5M3BmzZA6nNCVRNtvOg9{5t`NcIgIX+o@>ytvKZ3_m_2bOBWC-^|YD zfe{FmUW5(3)m4*eAbE<+sCBc$Z4Vp~+~86DYrK{HI#P&eCTb8$ZJ+_m)+-cEm$SL8 ziPFD$6gh_Jl>6HYruJYKDWcdZEd(4@*1T$e=>NkC>zxA=`y++yDCQfWD8r!)13{y1 zj*e|#PUbvA@%g5@R34bdfK>w-X>XnM!bO5FCd{b z)gSVN*z=uEfiWH(G>xk{8iu4CN~#%K?B1P#W|J~aelPb~hfr-eK|lGTPu6GMoO8cG zSRrs`1wu)*c;T^gzGXbaQ(?+Dd}Yneb{Toxno;zZIUjD#DSv#-GC4ec`<&i5g+Fd2^hNHaK16aL`ED_P~_5(F4F|OEfk**(VztwBUXl0*-_2%h^b7v<6wao6Sgz4024q$<_#O1H9#IK)(>Lm#OGB68{iBAuU3KlqA8t>(eHC)|y7i(9%G% zTcEEnO&g)ahN5fT&PrfQOork<0A@%SzU7>ay4Gn}4f{*~#b}QWbI$-*3n8DjHNiJ+ zI%W1@NLv3|D?>g1X*#-cxx|4D@0l3->6(Y`{mN=BpyJ26nL}nAY(Lr7T@%Y&;f*Lv zzkI8ms~rP_@b$You>K?dh05*CW+WS*j8h335Vs2yT@evpQRs@Sp7jH7Xa8dj`${8y zQB_`b!H*z*PTRs^T}z7c&RLkM4+F0>{M6RHu^iw#ZKA}{e4sic{7<2q0yR*wsncBf ztCK2y2E2LWXpPF$=@|SzDnYw|>{vAjXsJb(K)D0iPX(r%w(yyxzM3?+JXeb#9Q?E} z<+G|gkV#U@x_Ie_fDYfxP8lRMLd;8jB^PmGx(NZfn>`BY;Nc?^SKS*snH8>H)tipD zc+vx&Mz@p)mtqdr1%?-ZRd~sn_>vbFTx+QH?vt|-Cr^mjf@SYWU%DB;dUHg*#$q6( zOx~D=RGiLXfa`UM^Kt&y$5#&3IL?>6kRdb`V|(yT-lDxxeYg%FuC5Zg_V~1^(lz0$ zoY~g;Wu0LJe3O)Ur-Nonn(&lwi;Q=Ai5sUNBZg3nWsxEr?J621nL7BYmE|in$hu+` zf9}7Z;}<|&xmfn#p z-u@C!8v_rxYZ#&j!q8RTTHV|vf8(#QK3hk$*Mwh>? z*3}yHKd<>kB$DZ}JYvKHs#edlT)V}B(|%So85l8Stcm1{5%O2;OAw*CU5Ozm2jFC2 zb;u22{?H&>KW|cw?pkD9cgk^Y{}2vF?{gY?3DJF5x>PPJE-Lk{W z#Pen8S!G;8gZt5q+Hdd*<_^Gr-&WZ(C6bKkqR72ZHS-=1qK=!lMNzvdi1NR^MJfG2 zw_O<5#7co`nqY*$Z=Ev4UE~|>QhU0|bS%x}4bmNnu{lA4e@abS5XW=47I(pB;KV~H zLBU&IzqNk37f7tt$CV64RIm8J#Rh~ipg$YQ_?Mll3N#Eh5!RxR2fbJO<@cthJgzxI z5Q^(BD$O69GIZ+4smv>v_I7|UOp*&5rA%8YN`bO~DLe0BTlIJ^PeF>oN_05*h6+89 zuIdrSRX;^47QEV&d9v>m+T-%(Jlr6Y7hrl@q_y^qFE}n~korI^;1ym!7}Gsuu7h~U zbVpQEO36_tzCdykmxJzgPYI9UG9=Jvh?d!+lt_wEIarVqanh zji5yRVz=p?Th`=0`q5(zeG}zmpV+AaQoxU831dT0bV!LvVcMA0_%N>Nk*|w^(Gb@z zAPj1Y2A+Q6L~9xx``joV+*hpDWXn2;aR0`_jdC@IH6q-_FA~;y`FG+O1JLy&$BgaW zB~Ivm3W&{Pu&=0*V6SvF#-~0%LVw-@gxvfLQlT2NFL}^n&IeeELrxoxewq;ElQ<}? z+MU&}%gGGGlYosq#x`H}vN8>(o<=d>$dQ3QOW%|3wccAb#TO8qD5@5Qg)w5%AsWNp z`GYL5bJf{uBa4ifW#fCLu7l}QPJ?e`O>=1Jn=qzbkLov(7S8d(B&PEaAqhmvqMj;v zwedz^Fe>b})1Z7V&Dz+=y3kZ;f7qkj&b!#0RfulVs=Wf=|=P4CV^ zR~b4~3(87wYO(nA4ng=< zY9@Qc{u(5g!H1k}j%z>)8>>Ri0zN;0Y3$nss0jmqU(mWc_k}yCe;JOgb8-pB!L4Ud z4n&v07XKtQwyzFz&c;829<}+`z)C(uG7Y^a7xHFJ*_y>bq=&;7Zxb_YO@M~$)wn}Y z$#Ys~5(AfXwrOVZG24%W-F=Qh-L?nC))_BHlZ}WuP3tENz9z1Igt)8w(>}EqPp$zg z8v-Z%f`&-Xhb~5lhb>+q?3UoZo8m&!n(8m>DEuL~Ut5@6(kdR@m*LWhV!AMpxMsCg z#<4+9wL$&kVQs0oF044W^h1<3%4datK%@isEn=94-1Op)Hey&S&Re-w#{kT`fTnF> z206f9QbHke<}Ma_(vql#V=EIwzhg2l@;}{6LZQ%{JaeU30%B#Ay| zPBb=BUZPll=5D9Go!{t!B0bCz*zfk-DYZ&F+MEag+oL$WaiG(YCAo6%z<;Sub>BYf zTfv_U(~dNx&6i?Y)IxmDHLExc5Uc)z?~~M@MH>-=!cmj0X z<_Fb49AL7&So&sg>;4@QDvYiQ}v7!nl6E-st$JR=y~x-B$?=+SFBjENDmpnr5fWvmX(CMQY&S#_L|YqnAsU%fIWq>cCZ~Y_+w1|@yPK#_ z#;{2Nxwer*S_bK_qw_P?h9}AG6OL-GO2P=_tCu*R-amtd6$cvFehz>`U;IzBM&k(H z;PUUyOc<1K(XL(=dpP+?ibi~QDPdh>*e#4x(a#Nxi!f?> z#*0dap8dAW8b3|hNb(`NTXU(Bu?#OiIgo|vc*GL+WpFP80kV^%5wiJD^4QetGRwrO zs-Po31wic;x2-zrV}7Eqq<- zgdB>XrABta%2X9uCDmJ?);CHaJbRS~oAA|0$(s<@%gsju=bTwEyX5&m?9yuV1NtSy z?)l@x&t~@kcSSnXXl7NblRMx(VG7e|2x_!<>Ve#SnFdJ5cVt@6gZ49KG|Q+%U_3UG zYkr0sj#XeE6cLg`4n;vPW8J*Xiwq+$09aH`#8ylp4MphkaGIV+Q8c^OV za(@PfoaluNz=0I`##^xXW#o>^+C1n2&*4NEJLB85N)dv};{B^mX@{Q=;(xL@z_B(- z-vXqon>Ds$tJ`a3FY3TRoWp=+i7J_#(XL=B6^{;J-$}pVq?`!rn%P1veLW+b`oe2W zl|PMS^V6;2sDs1YNTXy=Y78v&+uJYzZx_8PULkCKqXFejykwe7AAAr>SAAk2^ z|JVULL zQLA~n7pQ7->lNF<*sN~(W4?9-kskN@n5`dVK&ENkStVjA7+IOO+?he%rP{^=v|d!L zm)y#d<_zd_o5fwwW=suffbJcbk9%LqC9GE16mT>2%1u(N-Ps#N z^_c`;g*^*of}#D@sf5otpp~k!Rj}s-U>M&G3P0m1Lu)@mwRA2B4=bt)x!!&uRqD%w zH9xpma9tR@P40!nl4)NaJMce))eQ{K%(=O>P>P;Tj_#^_{n}|_dypCV+| zkOxEUSu)CKh`O~C^1X5^#0u{&+n2l?mI5ZHjwUokH{=pdDQ-RUq9wKwnz;`w;MOc0zN$1cq{lKyhUXhUcZ z@8?Hi?X~gKA^vSSsWUCJ!lIf=^qloZL4FVaXi?2++B7mt587EjzMfaKH3AFI$95!b zCA%DL2oJ-Z<~ImWm~L;7yLCXC(dS{uG_*S<5U+D?Ut})c91~v*U_hF0Cgl_ilaQSn2I{Nu-rz8swSDXW0;Zn99V-*g3;Cn;w%{i| z@sQrtxNqUDAMjr8x;W3q{wZxxs}(FXoZtHw~(?}z@+4LN=Pb;nsxovpUsQL$4c zut|4^v80(Jf#C*V${+WT&UbDru%=@p!%fCE+`dmJ0%5M{Po2lWY!oqhT<|d)n@V*AxcTZE4e1y{U?tB1u_S)+p?iMMsay z+~!ZK2EheGffhgXBxskz$TllKQZ`?t;=7X#l9OaynJZ)Qkhj{e_*7Xb9L>J#c}Oo= zdD}g^$C&AeUwdjHXFeGLyo(7R+5Cgsv85>4_W<^h=@*3KRWzxADLxUAD&9M>21wS) z%S8WG2duUcuoK2!1Q@kUZwiz3!Z9r^Qr=}QIIrQ#T5p!TCucBZSMZZ@99?h{UXF$6 zJ4Y|`@WnN-L>->}2C&kDiNR~`7>hu*nsO_EPjRY|BdLYkadJukM$?L!IMPT2#R3-+C zhcgRYsXW|IUXEP@!pb*F<%|pRfT_)gkmRiygCiXFHu(LF-g+o+b_F+YG)NhONTT%Q z7E`#VN&T(uT&MW6xfQ6gjTIXk_XeS<*68tp((3ZCN$&7I#65>sQ zAWbNh44=;vazKI=+#7VQ;?Fz;RNtoK4zm(O*qcZH7VwJ6-{4Ni_WRQOQlA!zr|B@s znMQ}M*rgZYNm%GJ9iMe1X0-f)bsfO%TTf(A-d+{+$^c#LzF+5aysTy|XWIb_C&t*h zhIw1{P=oJD(&LYpbJW%`VW9v^bwWi>%<0eHR|Ve%PVj5*QQe%fl=AJzoBs?`_<7W=!ENO;ip;V5hqVz^jQe+Sbsb5Luj;*Ijx8oJ83cq0{rx z1kHm9igP6LpS#L~$T(Z#D3yt&N2S|n>EG*4cLlY8EbBX!N^v`O?)K+G7C#~`P$K8m zVL`U!Zx&PU+pxtqoyQ9^_;BqN0f{H4b>>i*6T-~S|LpqLC-(Q*PhhAPFiiH?Ol0hm z#8G>lCy>{oSXNTUAH^T-3>Pp%kL`+OKI>W91um3f3nDk%4WnQ^x`%%*bkQ6!d~O@C z_U`|4WJ1L%X-{ASgVT|FBH{me@V)t}6=Od38T&-@@nz+n`I(U+)*ogaiX7yO)W$oA zj0D+qJdY7&5F3lH5AKOLalW&mfsa2cm!M=P&PCxoPxtl2D9rKD;#-*W#|;eb-oquH z)4;9teSn~6#2}bqKv-JOVUxTLL;%(*LZ&HqQl@LSu{Q~9%G@R(O@*s28Vau285Le} zu_mCzx|xx!@eX_H2e{v}HHqulK5t3&?W+iFE&t^*i7_X=B~FJF^GWn`KXq!d?|J-0 zjrf!t9ZlT8JH`9(NzkB}HVf)Uw;m~tBL2e|Qr0QKL$w6BH5SFJ(YRU2`e^3Xm3?Ut zY)<`l2#-UK!-MnEg9pR#Mawh^vFyS;Anrz;EIA~PYJ1+yWgA0l@o#G9Cm7A*LDz&d zPLI#Xxk@AzgZ*woWTW1c{6vll9I&9)+P}@nH19kS1VA{Pk@^ow6{Pzz{kP9udG?Ue zSg(s%g997z{=mT>%3~dEp2-@d@RmOpQ#o$A5G`nE{QOZS@UyA<{Ha5^YVm!(x7b=xmR%NivxZcqmEP-SWE zG1*8plL+Oruv_o2^iP_UxV`g;JSKySAc>hB+c10-s{`NEMEw}iJ_g9F)$ox}!j1_eh7H`f|rqxn?>ZLl8oF9i6T+0bZ!gS2D zbI86^eZK#u3QWMbMay7 zNg_FXPk2;ic<+wJAk8<^mARUC-{s-)XsBt=wXl)26p8-hDB!zndh5Wd#pM3s=Ri?@ zX{GH)e;<-mv^N1oPlbWam4shn+k@q@&7ljvbmVPb-F*Gzt~nPF=zT*`LS_SEte|pj zXhf6Mww(LpOSyIHq31-4ZVbVtk)xgCgb4(Xvyc?bH-g?OEJGQU0@$LE5rcpJ(y1lWF z<@}S6zaxwl7ga_|3Ujj+e{#w~*wU@kIR#_cK9NHnrxd;bXTF@UTlW0E*i@a?XwN$s zH)m5{r1#%&GrPA^aa&Rnzp8tP&&}h}*4=xo=a8-afp|}mC9C!<4OWk1&*e=8%s;>j zxlm)U7^e{^lm8LDn=rEgFLX%+v~P+Kc4pF1sNlI9fWeT7zrLB!4TdS>tE#HSSSOs- zP%7Q&4+V2Djr1Rtgm{}$hAH?XYXQJKX{l13 zut1G}GRxT|HEM|8XOvnaxWcYq1KqIXcVTdSQ3|qN5rg(EY%?_ecW3;@&BxtvXoKE| z3y1|_vA*5J*~)}9G~!EjJseLKvy{l@!8+|R2TYJ_Pwag%CNj;nm)^!noz3p-wXR)* zK>pX>+3iqc#sr9GdR)8iitOo*TemONQ5c~-j@^5q*A77RE*eqSK=fu>hpdo^#7E+M0)Hw|HVW-A=kRzbT@L%JLasy%JJ$sB(jKGH2B2$UmEwTV! z%D345!xsTF&-MYFf%?Xp)Kt9>JiVscZO@`ffM_suk%8~>uO66x)_|@UC^b!G!;+{f z8$?jhfhdy+J-=tLEtkwaaE6}8=M~~J;WwLa=3IK30*p6~%PXoGMx=h2 z%tSI_bWn zh5`iRSJT9)EV~J6Q5Lc|R9bd&c02}Z3ctBW1!T^nH#4TOn8=yHLSbp{1r30!wbrbq z5m`T$@naAmMpt3(x(XqdrAemQHjERe8)HMzu68S^q#S*L&*^J`^A47VRkdr}35k5R zdh6#;5uoR+QgEBR%NTZ;&Ecg?U|RhKPcz}YZORm{kYqB7lp;g^8f+{}#HK6_r~ZBT z4w+|it9N5*F5F}fF`y=aOlU5&Np`WI&cj5c4uX*;%lF-=Q_G#YyX$o3^D~`h*r<3Y z4WqUh(A71$1V$cjK#urayAi=xTNW*mp?Ll486o@wn5krUz@8i+u1V+u)Sc=`o6w)+ijIbh24c!A zGkZwBXU%@3!yN5L4~MZHbQFtO=U8s$nG*ldW6DGYZ(pDgwuHy;l^Fa-?TKw#Oh7%v~tSz zA|Xgp=4hiu5V9C61wV?O?V9vqxv?yNn{bu@d%-U5e{FhDB2!$NHi;$H5zG;2iWpZSMrD5d!_C_-$e%3Vw_6~4-BL~+I~3%i zM|hN#wn!1F?~~W$1$CA#{YKP&w7=QO1i6@S8b~mC8-XYuW?|$Wux4qYv2S!#DF_o% zyineEB>bQW$?s9UeH^q4*ab-`Q|#wksF#nGgBV*zZT&!K`!MtN7RcrSG!(L~`uMc9 z%n#FpuS@K0COKD#BHw4kdwe#uQF_us*yCbllBN{u4-{t0-`Pxa@~%xe>zKa45z^)A zK4pPUff4QIu^i4T<-CRv8QKI|r^ZaT6om-}jD``=>@Oqp>*CN3kKHaR#hwrN|Jz@+bu+Y@tq}|^q99Qzf99% zj*_@RRZ+xU9aNs3{6X%9u?=Cr)m}88ouA6A_FblXK8BPwsCszXom0BCj!$9&FVMC?RG(GecY_2HVHj+;U;&pe&TZdW;dXL6iz1k_j#)HMczBTpCUed zc1Hmo?c%HFf_eENcK9>)MRMHk89Ki=VO|xR=1%EOLCzDcpc-Wk93<7_lYS!30xE7A ztIB?|N|zU}=Q&SAz1~JtBolVPRv{|lS(sEO^v(}7*cny2wrYlMHc9y^vB|2Zgnuz#I9xJ-=P2eoF%^NggQ2kt8lOU|Df-^HP ziVm=tQN%cuLi#hE1j#!H9sg%>l{!TD#p0S!z7L$T09t; zKk!x3o%$HD{ib4n!jOxxxskzcIrlR6=&Oe33z02KQuUz43h%8lU6l4Em)6u%n~Ay* z1;%zN14I?;>!Xnagu^=5K8(1xM6z)(h|#*;~Ev~e5mHZThL}}y}t(!3CqrK z?1^=geeFaBC;rSGUp*S0?$VfBbc71jut4orB_WzZ+PRDrh3)Ki_BM&p-VD?tTF#{C zaOJtgJ9z`Ho?ArGzkbvU8VoEy@-bC};W4|wscSz>3Sdp#okZ^yEP1W^z068Te>S33 z&J`b91*be^2%~d|QzVD_F6YPLtX-Zd3A!@lt!AsQ2e)zElJ@=Kn;fxNS6N+~q(Dz) z$df3A3rCbUQuOvdwhU=r5Gj3?)Ua7)WMe}}eU6HFNjxX0^r=+NG`MU)?wi_g_zxx= z9)U_~&nV(h;c|ya8>6c(_>rVXP1U>c)8)+J*>dBjt9-nX z4cns8-^g^_{N)%%Hvp*b1zwV;6=`W95nUVt_9K|c)FVXk?}T0rh?W!0ZCbn|Ws8?Q z5&ZqE(LiXnyXa)Wuvvt)avm`B_w496rl!=I!kLD*Mq!Do^-xEZ4s?0FoyOAnWQg7& z0WKqj*+P3+E_WA2Q^mu!Rr|S|QAg!dyA5C{gr5O4@fvx7;C3-bS_lmLHDe+^FR*jc za~Cj-vYPK9cXklc%sJdpwvxh31zrS*Vctd}X3@ZdYx+`4kVehvmuK=Vr{pDFs&0(qN9U`WAt3=~W?UU+;{sDX96v|mZ#@7F_s7$#61j6yG=o2#nS zlO~D`E>Of*s*8KNz3;ERo7S2P6c`VzB|@raAoKgt1Y0Sw_asQLq!E#V6p>!NGm`P+ zEOHwzk5wIdoI|22Foq(N{#2E|)U>C3Np5;n;J6{^xZrc;XTCTn`%A=xK)D@>1;xU_ zmU9y^kxN8a*+2U0YQa@*<>}mLdiLrHE{B-y7DE zB??h0$$LawSl5TDd3S#(L>SV|@W3n2waxZ;$dLgM+Ri#SKMk6)LE{L|{g zCx{0YHChNtx6&3tgO=$prgNIfQyayBTi{z*hqqD)zNoKTlBXF>sQvn+cGLz^Sb|xk zISxFqUbbqRN!~xaa#VSn@zQ`gZk$_dsGosCZ3uNYR4xu50(9Lo!tkFKmp-|%ONu2rTt40xh!-}>Ed6DHFXa3mF#x~ z9MPk0=9YM#H)l%raixF#%Az+?vTC|PIGDY6 z@P2O5JVXMl#LA@pA!(?KRKeQc^A`wh)30A>^dHyQ37SPL#lB|$j$R{I3+Jvc7%OoG z0kJte?y%haz#lUQQMyzRrQErnW`cH|G5Y~gvhFXK3Mnxuutc+A0=db-QTlPyzgvs| z4l~Ml0vz3D*s)Wp<)(ITX3wG%V0pLCIyZ1`jQqD|5&W(9Q-!@%?-*aq?TgRGA!4sVARfm+xlD&rjyg+U z+o?4fA;TRTFp>l{lpuzcDQ#rZGXxZo?@QLO7W7^`n(8GVop>xYO6vgfASkrZODvy~ zLn&?<$7g0`rAWS!lkmcld2Y?%p1pjjs=vv|Jq$6hQOhEq-Oq}DBZSq3wV{C>yNF{! zjP-?GjZa7ZLRwmG4NhGnIA$k-=a@2XNoT!c9LQT2KMZDggH7G97m48nO^gPpg#i|* zGKHG5lHuf7+dGO4$A(*`=sQ55m`-mFUvMMsX@r&%2qx}v2)!`eGzD9nd`RhBI)@CY zLx6ioeR**X-8Z_4KoJ-Ow2=Y$MWuUmm{<@#9FpZ4ZaU$_n4X_3=;k&?)I$(D!+f|M zaRuy(s$&vEZ>pq3Ck+z+Lz{PZt}ltb(}JJejL8iC@Vv3b@#cSD%5s{LM1rPc%$nib z2@JaG$HH@5YpsPfFE9+{3QLl>in=h1V|vp37p2v+5Hw9eukp;9D$)nR2|{9Ol%K@f z6++er*DBw`uHZ_EKev)3EY28Tx8?Jl_0Y;wkJ3Q5e3TOK#QTM{J{R}LGKLJ=7fe5t zuUmPH>(Wtt_O(CaPDz=FXmxcM?~4|R1G2rerUQLf>R8h3#DXw%RV#R7I?V_#$4rlB zZ`h6HWzP{cRn5Qx)ILr-)l9)Rpea7yH>wg>z!t@}hHw9kvp(81DClcr>QXELzW6uY zVT>a!DceGUk3UjW4%h{112(iC|7VhR44b@H$=p0V#rOmpMcQ zAUh4c3pdJt1`j=6e`MZ0_UV*NDzop~B8n&Ymj3X+uRVDKHL;+sfGN!eUnzhivdaF$ zj#oZ#Wm9lIITVA#2E;UHeCtuSpdJsO#Wkep(v_&3UQ&>K6yI_nmmbqiFI;uT=8oEL zp;%=Z&;KT9#+5kq45M}$AA1SIgWv?#sSXY~W(k9k;s0L9vs3pArBMQ>_TIgg25PZt zJR5+ERAPtFqy+c;H%@H#-|syO30RTKX^G3|heOU@nM4PvMD_dG3iOpz_$|n=PsR4I zNzcsptrfi4b+F-~-`3@$fquc8Bt+ynj6?mWjs^Afs$kaI|7+5{;#O4_E{HN~cb zV#d#81;3S(O7^6m&^DT}uF0N`Xtck-$IkH+*{1r!VLY09c@mroYV4brFYI}iH4mMZ zwO|CB2R%~H>u|XG5C{Nk{hXt7liJ)aKQV+>Z>RZW4UCES0(`LP%c&ur{_CwVc(5tEppQYZ0o-Im1|= z|9d!hG2WcRO8Iv_hr(B7UqLXaHU>aYXKWeob;_0;n?QMtu-=10^A^J>5k!`te*c}L zYPGWvwTw-UpQ1gqS)WTxp8YY-r~y1M!6v>S4#`LE=z?(=7y*H~ecOC!+4fK2p-m1_ zdUDk^h`I=vLSwc>Ne!laqvaa;qp9}+`LW|Ro^I#kX_nJzmcDC@&*I*gwZ`SC-Q~e5XqEh_%5ppnPDJV}ciyV{7sv?!tBgYU zUKa2VMtbB-%*%mNa=#L7+R~~c0!VnqL?~`0Hu@?wZUlUzlMA~56qdaZ-J86zVz)-D z4ePB@a#8Q(doH;%eVU>l=1ZxvC^I5L20!5|OE--TGh)!zHU*%JvK|ijUXFGaZJ9<* z7Z>u2Vru`ypAAV)6_i?VcY2vEjVRrgoy2lo&e+-FcTaH~!KB3ooj#!Cc{Wk10*mqw z1H!Y06Jb9n`=;oE{`5g_XiFe&xLw9EaJ-j6?2%wF)q$2s?E>EV(lh&BLT zs_9A%m1tYX33@7%wemgoVy$@z-Yz9rCNY-gwLdf&Dr;t2QUP_0aXQ>U>S-;cCXWHk zt|G03+)D6pGJ9;pCGB$hP)BXLMvjW*lf}_DY>WsD5-~?PqS}UT%VR>m!#L0;aW;KH zEc%Xbi^chHTQ-GpH>xihXDi7$wZ_xV)4~H1quCp8!^ux$}Noe*M)!GER)u6Y%fyN6B4kJgPJ97&!4Fc~Nl<07w& zivP4a@_ZTk&xh7sAVfM4SfXd`4a1hVSJ#?%p=>&w3&jb1H7@=z-)>6B{`qDFj6u+}TN&U<0iI;rQOtOE%f9iX@o5@(m|Opb*r<4HcK z?5%r{t}cl(Oq8^_F19MP)f=v>9^yXUe^*KM$_cBr6V=uA<-RDezrf-HAW#O1l0#@m zXRJDTkf0D3$ayZ5UevA3CpJocRSa#U?H@EnGH7H5YuZ>R2rUheqDC9^iQ_UV}YP#Ut+oUG$BC z2ed&wXUM7gRaH~DiEmHV&V*b+x9ZYhNYlCw1=5?_U%#b=X3XGI+mmJMpE1BNxEKG- zY7p~>-4I+=pR4NwBV}-YD3vx~l#DflF2fOn_;>;P?zGvBP*R4vEe1EDeC4Z00HejK zVzZ|ni=fhBnuQdLu4Ai})R`{@hlCGwIO*DWM~EXv{ft6$2Wk()&!8m#(ylhUMS9~`L+o-q^b zBlE{h8ITsCiaHb}tq7jA35~5lz6yp==bH`IH%vpn#t5)eY=G-l6J0@awb9n3yH0?2)BR22VLK|;UTcIn8#gae z2VsHZunM;uSJDNiEnB%(wV02fv8Ju~KIQxD-KQ)th0O&qlye1B4qYXwAyrLPU@Cy~ z@}V!IV|92(&9KGDHK8rkYU)_@mn|e~>ws`AgGSE5`CqF<-33DEJz>a|}t6s3BPaA36{WI^0iVw_2? zo_>CVdL%h1ey1b_35>w5bn;bijTw?F_{Giw6fTxLN#`&x`WMOF9&kyk8V= zS`>^u>Td20Ugs6w-lB?P+;T|rbd$Sbc>cuc)8Mj)VJd>uR{18F#m^UHww@LUBxwmI z%7yrz#|EAD?T-_E+=?Fq04Ddm4(3KY5DrH%VllXaLJIwbVQX>%~Ki)jqLh zn`0Igy}e1T!;pDGwn2{lnI5iwaJ?1J5+1j!8XHfoDGps!2TkWgQQ_W;$TnjpFno4) zSO$~wC6*a;#&LxQoKY!N?Xr-D$g~9~g)J;kCoNS8PDG8ru+ep8nCreMc2P!#e>mcM zKx_Otrb#ef4kb1KhS@b-=SCLHUD#Xm3_2$!Y|_rki$Z5pwH?nc;)@2J8kg8T0mTV< zipvr77Y5ZGhM25ZSG!u19t|Jfg?i&n6|@lj-nHwTHj?AnxV|J4cAM|jR3?7$bh<%f zP2}Cdc*x_R!2KB6hkg-khy ze3(=4$f3l8>EDbw|1r6@17d+*zgq;kw?;e}lWXLrq+P#G9_LS@LtrYD`724Y{~j5^ zDFxmykVzzFpDn`^XRN1^$1IpPx7do-309;KgYH4`ZE^J0 z<~g9jt}fA-5f8eu6s+a$I$)u}>&|4k;5JAfKxRMCPnI|2E)qYF-APW{KNt@iWLC>8^4gLLPo)X_plt`Y!duC{bJlT>OyyD-OZUt#P zC%C5i%^2kTX`jYnP$SrDU?*PpYM_z>y5o?)R z8+4p(-}=K(kjFA}?rLM>$3;J)6sp;g@WWY#!$5^Cv0Yx7N{U&f^XxmNAeE`=u@_5I zRy^PYzogvLo@ip#*g95hap!np9i(@BBc1?IFpn_uTCxclW(O{I0*YvUIu)dJk51i~()=`T>P zhJxcTCj01Th?|JXzHVHEzm3U9%kq)*R1zu-dAc77ql<74!g&4m*B4&itT3!;rPs7l zXwa7V&{VDoMzu>FBs z`sXG)FNtoIZAVgv+F+P)^rPK^BzaNMI`D#h0pk!s*5nk_`Yer-6eKIqE?8d`EAbnG z%NrCLNZR#*PjJWM5`lyNpXFVgum0EPsYfdt%u)OHy$#d6uN#JauoOMu_`g6F_`du;epk})$GIV-tz;zX~AVg&q6f8{B|>MHY*3NgB>)=MX?L-~Yg4?q^0 zaUdS~+V&}3Xi}ZzCo{~!URj`2JC@$`IJ5n{@8uN$4yKK}P1z%T7p)hjm!e8?n2uGp z{ac9eFqWE$$BLr&`4Yh`hscVq(pkjAbIL*n`qs$b=YeS{6-v3aA5cWiXE*)b4)Gkv z4#(Y&nzQcZ$0$(Qfjy3_0$t;4fV!|Tw;HTb0P(o4W za;!p~Ffh#)lHHyDlLwu#h0}$GOGVm;Ea^9E*C|}4Z?6HHwen$H- zBQxe_C^Gs>(-p{^3WAz&c%?61hh%B~x3#~Ro=*nMCB z@G$Y_X|{@-_#*7=sJ#hdxr@kZ&EU!5v)hdNWvq^kO7$Xrq+|Irjo(~}gVED$wOPuo zs4{}{+6y(v5T6PNrL!LvD>_^DI%Hgbz7aY=mpMRnEU%Uu68CIkl)^rkYQ*OqL-#$* zQaas$H#?56D@G2A;;xy}QLT#Rs|X}|Wcj#0V1WsBT-F}O6z5Vi#S}!dh;Gz36P$=N zTF5J3`Ct_+VLEz%)Io$lifGy-QkR|$Xz2j!!-#IpV0FW5nvSV;IKoubPbB$(+y`{W zY85m~Y=H(sC6DUmp;)8`MilxRRQdbYmU@1?T}KL8F&l+yWcY3F6}p9<1HeDD*D<1> z(F6{fDd>y5ggWpI@-``*D{|BbhJr%{Bq|_Dkp#N7cDLtnHZeFHvJme5)>$yw-Eodc zc++~MohAGHp#2@pnN(?MWDwq~LjJkx7yK2>6mkjY)8u35)+`Y+WL$QqDcE!eTLA!O zh^~$ZELs;SH`KT=g08%;6L~{lkx_wmL=q^{*cwBI@N~JD!c`eYHv}GW`0%w~kQkko z{yM*Ucuq-bZ^CCGIoc7$C@l?o{4FMGw%o@j@$mg){gu1K`9|*(If-QfkPTp}5j>~T zbW*FepS^igFK7U_f232ME?3X6xod(X=sOS&y2PU~MvEE3V4`M; z`m2Qh#rUt4tRlW{EeUO;wcECv9F0%zQ`%yXLGSOEyU;?Ad%gAygMjdd55}g*Zko|y zNU8xZAfeiz)7AT0@^lsvu-PE{8qd}MZN(dBKmbr_6PxOVB;2q%k*s0wo(AnJA0VE2 zZ5M(Jh2Fw(GB;mAlMq=?Z0QF3S|Q}=#NSeiXxpZ#;-gzhFpDPnSUoTSMo;jteyt5V zzHO6ML{M_1PUq7<)0l^^j0iVF>xqiZ9Ia6Ohv?(~p5MeNYgP&*zP)}9%9#C6>~3L5 z=Q?os2e zWCe(jSCAj@mfe8VUOno$wa_j7KEhpWHYfU>ZUy5n?c$e_Zj$JAMO`XTs|lQO5kDax z=QgfG5i(ye%_; zR`mT#8kW4#+-7BOa47VjcY2sv@R;eoi|1`<%<_!R_Oksvl}bFV_%_-FBH1R?(Ltht z$3OAFv#4TI*A6y`K7J}-)EN<&$Dx_LsQScgp^tXPaup^8)>ZWGxzP3LO?QqfrCCM zwy`B&3R%hh!y@iPSfz@u@80Cy+ohW(-oGk1Z{NDrF^*@QFsy^=Q%kxHuMWM5LNjt&w}TwU^#Sw zvk8c3KIFhirv{*<*S{YEn3#Gt4h*MukixfO4;8$jzC#24FpQ=}CQregX?Xgtti<_y zMP!*q^nQm0}>6c zuwju=u*ZY>2j?+TT@_8~!V{HG3+*cM&$Y17YTbw>u+`kq5vG@_@=VR+FGGfdd^}^kw97j4;2)n8J?!kMv`HUI+|6mu1+R+v^%fhQ zq3_@$Z`N_UMbrJwM$MmiGs-~V&Uh(~nOCx+6#M#3UHG$@I z6Ii#h!4|(`7?x_D9tVZzkaY2eU5)umtK@I#h0_a8*F@9B%Ae!?ibuGSy}WIdkc@*G z{#YZl_1MV@V#VgF1q)ivq1Zbaj&l90O>qTrkF2UJ7)afZjn72~1p4kujBP%-^9sYp za}gl)7V|+8nRldD7I;g_} z-)RUNG|0a@azei&pphm;6e<7}Juv$1g-kN{UfT22hg4;kC58;O+`wBeHEgLeNU$eq zk4*XURl4Dh(E3G7G?{OiYF$ODsEx}r;rGFfb?hMrU1$5{c_68$YhH4yaO)p4;Wyaz zef7+MP$4e&e;we;@*(H!f->iK91~FRiBhB}9zNq)!4I+4zyj2{|unZ&j zj0d*A3k6M6TRS!u4ioVn?t-3~w0f%GCqXPWc`d9R&aiB|k&q0MXC&VvB4dqY9w?74 zUM~`kM1YX<~&krXm-WA`tv=LDfChfo(3#u8*Z(pF5g;=Ou@1w&3f8W9nQZ z5lZ4kSQx>m2CxQy70Z`$rM9$%f#eC_3L)p{#;JBp4ViB9^S^3Eh{r6(hkjWE1 zD9KdF`-O1auIK#(Ez7>#M`d??1z-AhnvwOrjdE~kBqdu=UQhCq%};57sXVrV17vTsz^&C{wPC`O)0% zvcwQyH?0QFTz`w})bHVdKae*m zxzg4v#AaPalYwmEK&G7W5KaMQ?N ziO&YwfXV%1vk-_)fN&OnAbW=*zL8R4PKePBo4>-Nm)z)DV(5mOL-$Tt2>+Pa+@+9l z-aYPEAV6#=Cc&|XUl+2lJ+*Br5OGH{%&`x5FI4HB*~h;}eXgWa13R4u{?f>5E(+&nFa=z05JOsP zoQ#|0?e)gfQm)C){KKWzFz>0rPa=Hm?d@#Am4omP8Qu@xl#lEZzB4o}g}53M4UrOX zg?`|yLa1Rt8QDI0l!c`9*VaDhFirpN`Dt?Oo&|uN3|YFYkkPq$9$2L8Umj{u9Vb-2 zkEhQ$B#taAqfQImb92FQ7RFSdL==LeH}O-8P8$k#fu1}0`6NQXraT^J&ooPT7?ioG z&C=|6s|M$b+qzB^GQ`waIF5j+oqt_LX$pK>SKf64wk#CR}$I zAB5~t=1Q;qw8N%8ISr08e?v1L9<}FFU@L?BIn@-NVcG)cM&S1D&C#r!g?#{GMCY8j zW4HCSOr=PxxaZwo_0n_3p4#vFjC6li(d@j32x}WSM#A%W;m(&tY0G9}9^)ltUK3<} zX(rw=S(DUQ4t(GEhY~-xSkPXsu}#CE-h}sP!=RCxg&?8On`k_S%(sXQuw_jjJs!av zI+InX3g_TB>gcY-eV9J+H?4b=yk~~f5H9XED$WOvbFBP##m#Uu$qh$>ClF*LcEICuJ2pSHth=4=oT!%vB_Iw*>&xr zzAsfIZpV;kB4*I>Wux*lJTA=qZ9YarDq%NB+d4(Vj4Nl=WrbkO=ZE}0-pkg0C$CN; zX=wBE84G|5To*&Hn&PHyi-~+5A6~~!xfMtIY{D2ZMPJ>J)l8!oAEBM(6jl^kBRQ)e zR690MFF|r+w{E-o!z0!edz|ES;;}&QpbCbumP7~jT%_f%X1_mJ)|x(k^biFkM3vRD z5ko^InOEP)?wNEp@de#;K4C1eJSq^ZeKWvF()BrarxQ;V&qA-#Bg=?Fzt5rMGPcQN zs`Ch<$fyU5?ms!`Z<$FA;W9cO=|7r)56ELLfE;ZJVLc6XS7H>NDC+)+n0^)p?Fl)V z;Nrl^)y9fYR@k8YMuUzUPe)*akx?f~ntF#UPp$su%5ng`aX}fX2F#7$IH>BrV@yj2 zTJ6Zr!8BRc*1ZF~s-Cp$rWJ&W-olaIs^B&eY2WX#&y_T*Bko175j{qC3y9w`q4Wk_ zfn32Oi8iER4fV6m!`iWr=p89iuX!P%9dvmG>LB<2(u^V3utkU+j>(w_Y}eW?bp&-4 zn3syCp-Wp;T|3KW(TI#M~;(XIfMALgFWW$Hf!3(l)ExoYM?@ z&!A2xhHHYa3G;wPc%$BO40?mizjK>X)}8*nr~-hfV<@7EaJfYt$yAzpY*tSI{ku3C z-&5GSxF(v6F6ZhaH>1u{Eifp`R)K9z1rfxJniPF8quSn0{r+NxpeuP@wK^3l?L_Iu zziPoXaPu4&05n*1rw1pxa3ZYhk zjdE?$Mp10<{--olOvqQPoiU!%S-$0h0&Pefa)I&x?M{MNyb!M&FfjmE0IH@ofoR^{ z9E|s>RZ=;|S#gtsCa+tRmHw^xSW?8xSL{fEHVEnyT>^>i{-Ae%{*U4arx zi_-ak8aj5!;#kMtO)KNu(P=@$FbyFRuQR2(cvGo#x>WKwq;5PDJzMV^AR1FKr0mye z_99*>6&1CAHDpgW%Cr5W>i-6Wil{9=-$>+Y5TWVFGmr|KkA+yRapFZrBNXil93(Ob zJw`2*dOm#$@xIB`KL0G}WW*hx$6nw!?s|cw!zdTF|FF1J5SWDySDjyr6Kb}$%^tAFymv=VgAv<|6 z!j6?7eDgr)7KNw|anEPm#rz=){1{h2h({LH2)CZ(&mY27*&j;XR@J2ym9zcbMZG#Rw~f=$##tA(?Q8l!`IVIp#% z`%)X|Slv)xu>V@lAyc)D9doEeD42vA85V9z2;!AbGM2sw@S$DEZ};wjU0#Dd)O8LU|4U&*Aq*m zLOFe>!zY)KxQJl=+P%BR&p8d!YeoTd8gdZCn7w**jG>P9y=CW-On91s2+HM^d?9&Q z$tkx;&wb3h-d}ti2}x1l@C0-yZ|p?PCc;`f_zorN&!#f2h{fv$9eM=CYJvAO)U;6L z$I^RpT=E>NVXzhX9I>rSE+9Fb_Ux@q8~zd4V+8OCB_mMhgf9bLs9n57F7-SnNz`S&dER% zS0Pnq*cVZa6HNgJPP|3itdR@0ggCo2FCLQUD$-9%^x~l_iH;~au(E)`v2+2YoreHN zK)Ao$lNM&HaBG2d1?S1Dn|?vufSm8$fklEwDN(5ni45g7M?cdkRtrH}Z?K-nKqF~1 zBu>tRE~Ke(S_Cx#qWQLOd(suOzwd9&Go2&q>m~RKY^sRcuAG){&e@uN+*4Yy;8Feg zmpG1iU5@y%9QE#y)ZwUm>>51FSj^y&Stc>9!=H?9FrTcTKu~S~?O!f$NBcuioysG6 z>b~d(oS|d8+71C&hSHiwXK6nvlH1shij6tglqe!`$GZmP$%ks9qb~8rafVZv-q+Un zE#$|%^07waJTA{ror(M%VA_va8~ff9$-fABALgHs#DOV$yqixjE*Utp1i?6m?ZaVR zKX^x;zU^QJvn{^q1`LjU>%c!@KH6>xE;5%s`q)R}Hq+>lz5YpBW#7ci6ORxAvR?cR z;Hm1iR>ltPSIPyD)DMdQxV znoC=lHfxjjw_7%afvFaxu}IM2C2Z%ufjm>)ffFEhN_t@pqtZ;2xH%>%LC8A8mwLW$ z96aY_hLass9+WxqG)m~1bV1bu1i3u8{S`8(IzzukU$?PcA!Dx<9=4kJC!y3?zN*?5 z=m!iQR9%v`7^YbUx~e8%CKoezGF4J_^_BdfQ?JRetZYzrlrjOnA;^vOKP5&HZ=f-i zFtAPK!UgrcyICUL=q9Zvj}=oMemVPpTg(mR!GBx!1Fre-m7Kj!c&Tv*WF)fQ*0~)*Cp$yH_9A2tJY*8qDh?)p^IffM>fSpfHFXpZ{UH+M@?@nC9nlWnIe1-eyU zm^P(8lIx#^(hmw_aL+R85{&|gX z)FYWuz|iuX+Kg0$=lUYNFHnM^a`oS-y})v_SYfzvn_marf-6}%^WZK6Bb7BLFm^Ip zP{bjp;eVe%miK}_ZhK0z&^5q&LF1>uCxdG^3q;Xk1FS73w~s^l&EQNCK`gPLm96p4 zr7L1X)n}+To50D2ldba2~ZaZxY|@sl&AE zoVk#VV85@4Q>R#%$i`1R5q7Gz;+L?F-hc!Xxns;C5Pob1%xnd=+B*RG?XpC%%QMmy z_j++;7sQrI6VR0P_u^K`9;EMc7%T)6f_L_`=j2K^)rgn>$mLr-f`DUQkt^bl?y^r=$r8u zZZZfZZiL*xy9;^%I6u}F9WJUa?7kEM1(!+&8IkguJ{MQ&|Z=ObUj>pux+z# z<6kPAUcN?9>2`Y6xz+L@x{l{EtW;8?xp9xm5${;0nEyUEUNC32K7s(D<^R$$7v&Lq zM^_H~I3+0S*5AeMIXld-LtIzPHp_S?@oKIm#0D*euyC6jB3z6w`E8tSg3g{#jcmhN zleBxfn)RJ9WZKo(j$8x>vyoQbreO$Jn=fiFwbrLt$(WQu?hdL<9(Svn-Oausym(Y$5mtpC|i#Ys6K2zl(Yb;q{(w)H9rK9-7UU0} z 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≧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

    _-cOwWS9DDxL#M!@Ino>@joA}7Bis8F5 zcLN{Zd%M>mmt&I#?>RlYwacTO`p%orHSE_<)x1~jerX&zPaS?*7@s)Y&l!^EzeVx zd!$xRzg%hO=5yCiq}EqgyZ_73ep6SstGQPd|5S+S-!s z4HaFytFKpmH?h~8;xDc}A9}G%vyC@RtNLE|zTWM}U3;hdWF!q&XAdm*(-;1#oO0zG zR*TS#I?~bTntop6J@ZG;r%iuPd~mvAozp*`cvoG!=d}g1tDbA_b8+^^k2fB^@zaM> ziY@+ZjKAmbfurxv^!@GPAonTH?rC;azPhn`|8>o?!`+LNYrd)RfekZ<%rTTH?(uX< z`8ub|+#I#=Zf@wpHs#9=TKLyD4X+%H2-80tesJ5|HD34DOsc!wZEDf-jWSmJ-0noH zCf!EN3(T!v{+M@?>38=fU-ss5ivzI;Ln)Ki#EM?spfF)r0A2i zUaad>R=4c?{*_zxxUj@yPweWQxolsDp*QaJi>nuUt6Hzz617%-{K3i@L!KoDJ-ENa z^U?NUd47raTYq?`bJ(LpV@JfKZ<}%>WM9AJd^_*pTB4z$>pP<_pXVn@Zi7r53N$NzWy z|L^$!e|G#YZRYvE_V52;`*-Yg+y7mE{tv7_#=M>@s+Cw zcceP=v!;(PK5OLm^xo;Ty4h<-j5)id*0!14r)z85}nTZaX2H+$~&U|I$3cEjeTgJzT(aV75e<;!{o24774=!<_^ ze)sa{^pm}7E(@JstbCb24|T3Jd(AJiS9E`CL|!%5Ax-LU+j*zy%yBz+um8Dco!m(u z?>PQCz-aJN3YhS{=?dy;yfqi#7{guBJSm{Z7Mu0|eBbS$+k@fkJPg+bk^)UWk?o8LKmu}Zs_C^2gon=?)KCK){1e|bOQ-oT=9agXaCoKpT| zPW|QmCx#CHM7QbDoD00UP2>e!YJ!#CxGOgKmp9+#yFu#;+Wt~mKO6pZ z9Uc22E8$>wVw~@hf^Cn5s&QIVtj%sviu$Cb7_hUh5&K7q{5EsbrvAJla{1<*3VC*= z!#Ix%FWv$f77O0WV(i9hhX?=0gBu&X z8o{j)Utq9&`H|)KW(J%WxMt1SH9a}xB$p5vr$xGWd*GaL8Taj5y>I7~6-5MY)#`k!O%IZm3;f}SYd#$8 z-Y-w!)2H>PuYC2nzrc?l|M~ct=ifyI&dT~H>$mZLED~6+U#*WmaV0?Dx8552*7M&w zB?}x8(LZ8?*ZWTd9y#*ek#%3}?Jn?_Ump8%M!L48z{{5pSpLzs4O=yxBWC~yueken5x{?wS6q` zwQFmyMRvdZnZW1H<(&KLqtEbEUBdhJHQhJj{?c~@Zqj6DljKFix(M8>SF>I**^BB6 z{PN}1m+w{oX}G`x2L=zESoY(y0+%ThRc2jqgRcb6$oM*A<@N`+1#aE?QtJRnZnKR(r3V~Oy?6z|Dk2OmP{P5u~55F(>qNcz-d$#O3YTN>qz!xs`y|7~8`mO>G z8Z>6m)7o3s2z>OY+fmPBb59CfzyAC6`@b2HE3mI`J>T#erH2Uo$tN#A`Kj-?aDi8? z+OlT*~J3at@}>h+F$f>6*xG!LU7=qiAI5E%_=*q(YttrYyYltaYfs=g)UPKWF8p0RlgJ_RX_d0l%gS{NTaL2Q^23 z{jI>cx%YDqzxCt`f#c$)#FhK`_-KJIUyi)|;heQO0+%Z{tlZ9CO*RYMy}L_y*KTt{ z1YWVC^NPurs#g^F*s)^AsvewiM&QPcw>C~&I%JT*d-fdK^Hx@D6M?DDa*Pny(fQqs0czX{yD`SIpc^5V7&92@&qY^OgC4HFpW zn!6VFbuTIKh7E6TXcH7VU*OTBe;mDe-SsO1A35T6r0B^v4+&hMf~LZeF@fI+92(jt z)R6jiJAr@vvCEHBmu-#~_>Vt+`(uBVf0_yW^UoW9?$zVsI)R4{9X<4VgYBOSJbik_ z=`G$a@}=Ag&mZw|p^c*u-;5&CF z-KjL{be4d`)#Rj z>s*=ktH3QdWK+1Zb?|DOBkO@Zgl%bxe> zZU>FP(b4MYeI0kdE3is6UR7n)8yy5rNcbut{_Lq@0#~eyIYTrNE;(?R8;S%Wfj()5P1Il^!fL0wi_pKjT+Ny6xqM`8v3 z{r8`LzgRM_fxt%Ncg8(yZXFl6WXT>S=MAYfQQ$Y;sPabJ;p4Lf_V!kJzfrGv4}tgZ zZ@7QJ?d1yvzISi&z2-RwuL^weVy}yf=56dP@aomOSF5W5D(R_mjXA zCk9T`Y^iWd;2(Y%_ruHepVSk$Ql+Fy=QCRE7kJyY2iv|Lnqd-n^X93WOVsbOTi{Wn zwvEcTdZvoN;o-x>cNJN6SKyEkpOBJaGY1O%=byj+`Azv}K>`N^>-Ub(EW;ae5`Oz_!`nBmwMiE^E$wL9+%NAw71-0Wyk|gF z|5gIeoLO>attCDm3;gM)e|-AS8(F;szIAKQt=PfeO%b?g(V(KKttyWdxLUQ`YENQ2 z{vvQp%)*$~e;?>C@R>6iXCAz_t*yZ8)-79CKd|=%ffp@`S#;o0vj~Cz`Dgz>%iI1I zBk;k4%@4-?wfH@OYu8>-yX7Z6iwit>aMs{IRG)4Xc=F^1lcPQ^b4p-?;jCfD+8YN2 zZqw#Qo3ob<_XG|LYaBL2y`-$bBSvUP9BcRG0)aC#Uu6C=<>5+!u{&kZ<@2dG1)e?I zcXsKi9!muN?z`CU4t=_(oWLJ^@bL%1egkg^eEs_7>s@;PxLRPfda1hUlYM;z{_L~A zKKnf+r?bG-t52?8=7Y{H1b*k8p6@L9p|-ccRjX!JeHhpNfxun5l;~0;Vyar;!-v}) zPJcfC6M>&UKll8zhBx~P?CxINT~*qB*;)THeVL`0CZ6SGP}oPbcu$u{Xz_TmF2#z_n`4tJPs^ zj|u{}Yj>~R!E@;^1>U%E(Z*&SdMy+9#EEJrI(|3dp}-|dbS*Kxe~qOA&z#Se>Mt*Zm;P&kwwtsOv^J{@8Oz1cvcTcq! z0xwuFYQdS8E#DCM@4uh@{j2|eSKzO|uK9Jh>no=T92wa!a*gYUzYBcn(!fg}&-%b1u%BNezd?1&Mhg7y zyM5k$=li-Y0^?2Gr0!pzZzyoHW(S%rd>r$>z$VkTrfHww{!`$;{>uC7XP@882;8lk zM>pRtv%>`b=%bk*`P2#dK;RiOs?KP?xY#y>47FehIT&F*E+EZX3pISaW8kYe@}$&I!DI`}OTV zMvc}BeCkyEsS`WCsw(jP`}6O&8+-T%fsY?Acf85PDc1$=+__BW1_LK22)ty;kR@C9 zHEtyE`|odfKeTB7`vTXix2oRo>EUSt4;z*|>_W4hQw4tV|4|`r1bhN(j zC#w>td^NoIqi;HT#NVhJJZtTkh3B6=$c?*PuKS8(jrVwM8ZxOl-IUPi42<^v=Eo>g z1V12gG5qFMpmq(mhp`gnoEAdQ0 zr?YXacqu1}e%peI;U}&{2(0b`&~ReBBUQ} zwvNLk%yL96Z0Od9PaqSgOZV65gdItWd|*Uuj7%4@ZO*QsGKhabbAFGEpD~t{pf)OR z5i009qY)?E;qDwAEUZYkI$}wYjsu^hGgn1j6y;I3oh3bFP*gOI z?d9j5YBO<66ou)BU`S+n&@mM4Q`@Gr|M}wo5>^x#>;$vStv#6XuOaG?(>YoFBZIr+ zX$YM;t&cUPigOG_el^m0`^b$`Y#7D?fbeJ;Q<$K=O`0YOuB5R_q$0RhKmL#PvS6L^YOGo98=P|Bo&r^f1}XE<_EWG|7%^$+hG7TN_T#MztBq>oJR z9ULBxQ;(Fhow4?9Vp)AaS%4eha!@Q=rGR5{SYRdX|F-Z$=nDIR$3mQ z8Yiw;mN7mz=nyDsk^X>z0D8_H4;Txmfz3*40!9Pg0xZVM(8~b70`39mNAoEjeM~0AvDI0Uq{{2@qE&RX$<(mflXB2eRZLo7QBs0OHy_@Gg-Y=3$z+YDF^mscMA!Q>K_rp%>h!!>k;B}ccE$!} zGq-0!^pHONd&3ir3bFRTWK%{12oKM#mIST^w>QCE@J5T|Pnt{yE2mzfW0ec-+&?Nr zdYM9b;=Mh(@|ae8bUnZ9lp4W?&OK-+{G9HDUw*d$SDB_vZaZz{Tj+2iNCSuTK9VC# zbhU}vrdhO_8V90flDYkC>9T0Mbe^dA$KR*Ov?)YEm&=#l&EXm-hzQDb8egQI!v4u8 zG0Mk?@{340zkFgFu2R$GQ*z~Ypix2>RaogrE*}vTR}^X1*G#lN#hdd<*T>KaZI+ZI zL~<#%bg3`-(rQcR+Q{yXSpx;X(AG?&fDJuKuTM;)YYRoX)eQlj&K)ouONtYLZJk?O z@Zud4>7tHq8<=7&x|+))g4GC-2cIZ6AKfy7c=`G0mJyVnPNiCYX1aqBLIcBmA#SA6 zn_{)XaekcJEaX@uOQB2}2k@M6l@X_x-+3eo&mR@h9}YNbZWZTVi?@e{J#p8t+rAoh z9&iM(6R-}j1TY$tY30MbM0+%P0B^t(FYp7-1C9W80@eYR z0Hy;n0SSOXfF6J#Ks`WtfH&ZYC-?#90Y?Bk0qX!u0Mh}PfCRuGKo39=pdO$+z#H%c zZFn1S9&iM(6R-}j1TYT#K*OG&^zC>Sozj~6=Ot;WR(c{C|x_mCeuj@KRy^0emp#r-^M z)5i;y^drAFn%@4xZvMFK0AAZFYt$*wLfkF0=$lFNNtRDx3q=a?@-6Kn>y_FG-Ou6cS7((BN&DPjZ#`lGT|uEcweziP7mT`q+l@=O=xkRa}5had^2z=XzM(*EFN&iQ_I5?SHjOo?=I7JgBGsHx7{YMlJCDd z{N(>&*{@r-^U#^VneO+{zD>NeEEFKhnWPAdwAaC_|3h+Kr)=UmAeVmu_yu4e>RJs@ z3g7}bf;L?a+MB5aFimeaEK0K(q@E|t}?-sPn@r8$EY zp!4;H)0;hEg7$ zcM31dlArrqbdfozMT;PL<+o7f`*y@^KY1n)ySz+7+OnTL~bMAzduu zDBd+P*peVCVdn4JBQqaSS$@|ZR%DVFVMiWsZ`r}271|~qpsYKEm2|8mR&jjjA+@jU z%S%0m1z914_lHc^X!G}gk`8`yuQ>mbFfE$^AiNWhDTgUu5S&MzH+sX)0K=h(ruPEG zZ+Lwg6MOFtE2DcmS(NMgc$haYMdb!p|0jkcf!r;BLWT-J`VzgWkZl z7__XsQOm{yZUe$$2zCNgX<9ZNaB4Ktkmn(=z26#KZ@dTi0PsFwx*KC30JXI0Ja{ zA#4mFXf5go*op8GKqjCb;0?eaKyiSxpSzEAZRHMq=_mHH@Id-r#BI|(kxtiOw&_T< z`$JY14sd~dH$dJ?#$EvEM}6vuM(Q}CxjUhGIH7rhM&revE?!P(-cD%L9OD7@Wa10} zhcrLX_B!D6cS0)y8nwT@@`^g46$8ytdlq*>E8&Dz(h04U6IyA|9Q8vPC$zGljR)AP zdpQLSK|an1)2}>WFM#;yM`KX@Do{XfPYNn&6%ii~uvcCsr0;b=tBiCZ({{{P0ckvu z?dVb!>DL_4sv&(mz}~!5A$_j{T6Ls5oUf=i^@BZ`E})HfK*KSR4ry*qXzrlxbs&?B zfxYs;f}>RI^AXLJj0gg@bs*Y34BoxK_GrI4q1~rJ??C2~b+EgDOaRUtU?a))BK!n! z8{r-R<6>I&MX$D?Z$rpoehkWZ~G#Lb?A!O!RD5pUR)) z;vET-xTj!D4vbbCvy!a}m3awqe#)dQ)E-@_v^{!i65T1Jcjk=BS7_9DxhXa#7Wx~x zZnpJM(&D}T1~UNvqj?^WYUT@bcyzgKOJS5+VRU2smd7c0i9u}*9p%VT*id2V@LdByUo z<#oy%mzQUwp@XPUT=bV{ck(;vN9z~;I!Op6Nk1VzPZp3T)Y7y>wk013Ou*iFV>GA<_L zYBKI5WAwKyK*laI#*XOx=Otrd7plqePBI=RV`yOi$JZM&+VQc;SSix27C*4$qsQt} z@uux;{3>thR{r17V`m zQt?cQp3dQcTMB<;RnSE>MBGMgbNvL}Mr||Qw#g_iWK$;Mr!;5siS9_gxga?}@-htS zR8e7bTy7{uRXK+Zo$JH-9TZ6UGvOOZ&j-*GM*bwz+~a~Sd?XRalS!>QS#EH--dv9L zaN*@sx^3~Yd0}kA#7UE`o>-<&hoX8mL1ZGN`xBjgAy479+q`GQTAequck zSh7l%bxEvO0*m!bU}4Y&7U=>DK7noJ3qFB`UIGif1s3%ZSWJ9j2o&?hpp#r#<#e)b zE*6U?%Sm{t-;q<8k8aa(mh#Lwt)?)Zf#EMOz|jOS({1DmMa^_Pam{MhJfNl3?1Fs| z^38NdGfhae#`*ajC}Pd_e@!eU4UZ5huv z_TPlPvbd7@ub8aqwpSaBaaN%m%Hwfvz-%>Ih`5%*{PSgg*;LI@dsz6(n z$zLz$k_pOJzXuCJimX?KZa#F@AS%Fk~Et>xRjKr<#le|w6_Rg~!Y6-(sjSXxz; za~P8nqBV4lYkm(v79`{;>Aku{2FdAo`Wi@=xVHDWdHV>VlmYL0(N(CB%IV2Tyi95D zBdpH~3#FuEk2+iNLW~8!?8N@o;NE44LCpPe2J5=Qja6_lvHBAXtX5So*6>Ot*6>bE z_OT|Ljeiu)(v~%4z851|Xm(Rp_hvmdXi26@r(M~T$)niPOTAgkQx#dw1>=}YUGF6`S!P1wOJEt&h2 zIM%p$C_7tsFx$Ml9h>^ND;ty2k1d+nigm6Ug_|9%Sf8Fb?42KKvJoF-u#SId*|}qJ ztm@d7Y{=XY)@gD}R=!m<8*YkcvyDM)U93M_R>_;C&n?O#gW9ncQ`)g+mj6b39AmoWu-^t1#odVD|Srscb@E zU$*(vzU-&e9_-j}F6@uuE!fm6sVwM_imgnk&)#1g!NMkYXDQ3Fm~ZJJY|@%ER=RpJ zYd>`ydvYg{UGd9iXBL)bu_2XNtp6x>_hJ}(=RH!si?AW_ z?b$be-PyR^<5-V271-CIeOOXjEp}~fE?d3CkNF%)WJxz%na{dVwy#wH`+H?9TTpo@ z`>DYg=25CNdpn~vtG%KW`)Nx&3&}Dvx7#}Q-idzf-L+lWpz%G}kBi%~`FE?aA$iT& znL#z#li;?@cr}bY>rjKOnl*&goE*v?mvm>-YS(7JyC<{Z%UiP5^?I@w6T7j2%ahsF z+I`uG-9=c%5tZ4kYtVO`Kbthyi_PjB&pcX>V=r!Huo~CW*xzl#*<@THP5mu^ja?eb z&Rxo2^J|;fewR>Ip^XRgSG%*$n})DTTRO5|3@upuYhmngZbeqBf*ZRzq9I#aqCRUk zWDpzOyA-SZQwKKLrxfe=ur}*9q&%yj?Z$SOF2&vos>j~?B9zSxh+v(jRA#;Ws<5>` z=-Hm>iLBC3C0VDAy;(q!QS9c6Om^6_G@E1yWcvGR7Bx7DEq$X3%kmh^KE64MdE6+= ze!1w!Zda+nPCjYQS}x6CMK(mSf1=~qpig31<e!79#y*a-s?=sX zjJ4UkVPn{m%T?Htgy!svGp=l%F`4ZN>&q(Vx-#z#<=N;LjoAmoFdkc1Uoz=#oeHbSHV?zQgLSH~rTApD zg{PifyqUu;MTao0S0vl=^>B8@i1GGf7@L3Gm3cl%Wewgb&o&$kW&K8Futq1_vA#9O zv1?@$*|9S1S;B}iY{y>)cA|b&1_Pl^Ww;rJ|F9=!OCr7Zl4?koQ{*`RM#Ew}WP1*K zl!zBJkTu^U*b?la|54u{*Y2*ndtg3r}~?)?UXvcDjZ7Z1V{7 z8s|IFb)(w=A9tS@Zc}`6-J*Opxm|Xxzw>q&R>SwI z>m%PHu3g=~@}BRK;^*p~=bhm`(>u<4x%)Za2CnIDvwU`WcK7_!J;Xc0YqN)k`*ZJ( z-uvA%{ARkOxy|+&<-HiUgcrNd_L=FjAGFOLA>Q3RXZbX6T@ERE-YI@xc^7fL>Kg5K z%J+o3KQ!3qcfoss=Q($Ox0!y)%-_Sy{X5U`zK{K`xz+OBz=eSh?i@J)Bsd4;>xaUbXPHLK!w-S$%MJY3Fgk zH7lXYNy*ak8!>m-Q0bq_(b_!cCGH??=rzP z0Hf!z*8=|xm&ZO0ypu6rI=P(neeBxYyP4}6pBlc8e7m~OcX4&kaF6po=bP@f3!@>z z%fr2+cZOe@+bD0o9&1w*b%6jZ$Jpi2>Zx|J5m(wVc3lBJ&2)h=(cuGn;ky!!=_M$u z2j=*$3uNqysNwrS(s$kzr>V%_m*VBiiRPES6cbpwPL0u-=xY-=G71t8TG4S|-j>eg z$H4iamj~2wv^l0#F=jfwtl*5!wPj43p31+VCqojTaBNToD#dJ{gdU=P)QZ+6OF3j$ zDX29$QjyXI3gKxn_ynt$HY=3gkxzx?g8j4et_Mjdn4kKzko@817eNbAvK{?x_??$* zhd)GmP@~n@2y)T{R`qwp??e%qzg5eB*ZxlUofK~AKZ(Ea)s`Bs0Dk8sTeZJbzN7Xl zxc!~;J5fY#{}wI&UHd!XcT%{e{UrX^Z-2Y|&P%pxe~JI~+uu3ALJ@5&HT0l1(X9gQ zS{5Z;!6qq-|C)qMSwIWB0<7qE1ZWb7Jsek>_{h z_<9zkF#OIGvEhGZ3*wyLS;;KBlZ&SV_e#eT)^{4xtWR_mH{hjeUF5J@oGXHD0zkPnEC0n(>%`J1%~{8#0J|KF7#81(PT4-EQO z~KKx&;{qqkWYyN`T zzYzRR>t7&$0qyUEpI;u}@o1s04;+n8JMuH>EBn{Fb0_&HPWkPWCvjQ+3;tJd$t=tW zIp8lu$&whs@2JV_ObNT?JK`@$kxXe9gV*kX0{9Cmo>}-`uLm6R7g(~~{^t5SYC-2c zU@6}bzjH;jntwL|obx*`n_9rk|9Z{ukiX!PrS>4 zC0gkvB2MHNs2jft|@O zSUdCk7LFU(rarb&xqKV`!jvpYlKBhWL6rYh>{9{q3sh8opQOrO$uVMn&7HAW<&tI65B|$QOq5H?Cc%i=|{sI+|-nX&ae0CcF`Cn!F$nW#mm0zH4 zR9E?ZE{89c+NCQbOLRxglfR0o1}#1X&_;tV|Ho*OKCd!8Wc?kLuTa#sW97KzeKfmm zn7;xxath!tPyq}7>rD}d`~{XQRm8&Ys12PrLBaga6#;*tF0bi@bX){VJG&|Rz!|^u zlFjuexv$sw5FwXu!(W(^t;#QS3RL$%=LnL0LaX@(WZ{_Rr`D z2pA@9EDm{!#rDzsQLOWkA!#7_FR#rm-lwz{peR_j?>2P4F_8Ti7)8U#Sh8QQ%`W=i zS^zpFRgD7~6?)nfYmPc=UwfS+>?hh4oAlx{1Rb_ESL}nNpevKj<=FA*i9EtGuOf3a>Kg=A;_r^sfjwmI&k|E$>2C4uS`Y@luPrG`9z^6MvmPa@ABYr5!P zs}dxY(4T?)TN1e-ZLC$4#!H~|&5pGyl%ATNXq^a=Xg|C8DcxTFe9uGT0{JFXqTc!F zMrU-oAzT36IX`abI_1X;8xHBx^9XCQ_5Esk-r$U$UwvzSdS2j^KcD(G{Q1B80s*`y)={!FIR9=etrCi+&Fist_VCVG9Uq?dG?=(XC4?qS7W z!fm35l3(Z-t4~hWr{K~z))*8Wmu!mG8(=*x^%vj&+V-*FC%UutG1DEi57C{qkC|?> z-*Ui2Pi6hw-P|U6D(e?8(Oua-?yhbV-L2cl&5GZ}ZK9i!AL|!B_QAJ0iJCZiu}zn* zRkSX@KI1zH3L5e!t4*=yt0%-AZT-RJXk(=kS~a&{0;gM*U{yTsAK8{@hwelJnzxGW zLm)4cE1as8UgD!T_I1X_Bi3?XHRhoC7^SNX@%ofNoX2Npe{Tz2B3t4*o}F~p;nZDm z3aW)Jdc;~&1)Vlip_Z{a^}`N58HZlb5fuDqhn|F^Wz4%=+M$~g=ooA{hdp`$^7UyZ zI)ozLlmHFv@EiF-i;ne6&A|R2|5ZQI$CPAj7Tw%&d&_jYqp(M>uHB+TGI4H?bf^f) zOQ3)9T;pNcIN1|m&M)ucnUJiGjn)`q;`wySKcKAX`6VXCC<;fTN%8#odPQ_@3DsGm zA*Q90BbE4RcT(9>5Y0AC*%u0W{z8zE405wTWeG}dX*@`IEM+Ql82Q$$IQA`GN+n5h znpsDpP~paavCT zFl96U_<9W|%W9D_Q|0v@bWsj3Jr(~+)m|aJ6(M0Z-y^(NNOW*Wa98PocixwBKXQ4T zPKGD6Pq)6b=M$X(3W$KJet>kY1;B+tqn5Z4n5y3jeA_c z41`HOn&Q5akOXg#$O?mMeH%!oQ+vwwEQCFhNBJQ>}tp77u^&j^D0j(J7(6b4oyWIG_0e2 zRwjq-U|FKtqERe{gdYnO@tUT9Ol;?ocE*b_$sM9^(3DAMVS9OX}>+bV!n5CumY@kJFsu14gO(k&9`zEZx% zvXGgy-y)X#Sjp_kaj1t9kxxM6#qyiMr;y#!`r!5gk7op66G{7jZ}O&D*5PJbb?M>k0XQL>niW(+zM~q>GMx z7aSITZHhW3NgJJ{k4=m{m?mKvRG_JySq|J{FFR*>X;CCcgfN|fHO zr2JC3Qe4uOQlz-$KvUa_i1+t|1Q8b!v>MXKa)(KZ=hsivTJSq6QRcU2%D4zJ9|~SE zY=n5Rz9|&IIedy-STDH3<`Z0PDlF5jN1s_b&c_MIevbgcTL3|T)IM2kZ*OUykv&J@ zbmghg!8|PZ^GqTLk(6JwC8b&7_I*rQKK6p+$FwF{&u)pIpzKZXCag;Ky*=mjmBcgDc#xLk-i&X-fQ`TmkjmhwBa4zfJ*a!Ed4 zfwQa*RpIibfrd*~Jn9z*rOO4#`%U5qZQKu3YH*pgD*4YX*eq>FpJMCIvtKR|F;p4dqzCs^Xr2?v(Abn<~EE}e{E ziM#W{Eph4O14~>w`M?r)k@9;rnA+n+kT^PwdCGB#%9tfToz|y})5(6yIGqBhjMIsM zhSGHy5cn1izb$d=P}0E;WaRZe5<6IET)h-?}_E zItNanuNy0E6E9^GFKH8}v()et@>y}4I6qxSK`&}UFJcpyn%g2zYHmwhYHmwhYHmwh zK8VAtk4^hAoAzTi?Z<4|PaO1NmS@v`!uUwzr-Q3`{P6MA!QI8vt)X@_{Y#~PdiqBe z*)qPQ2DZed2DZed2KMx5Sk%q6DD(7eSj)}L#nsaX<7?{QMO@?#w&a&Oz!H}_z!H}_ zz!H}_z#>n~MQ6q;_`emw}-GF zf-d!lr?>oufZTu5sFT;zt|1Z88MK3MB(?<%kBn5@+6t(sXqkW_=4NyCl=OB;_b7nw zRsh|#0J=*7ba$C7L4X1)DgX8mgqz z38Tt5okpsR)5)dExMV2J`nxo?rn}gbC-;}9pFA#oio201;{KL=2oCqV@p>xx8@hBZ z&Mw`~vMpt{^WUC)Xa0x1{Ps^uaiX7emXpFb@%|!it3bQM2l~Il;<)^C+ftc7B%4!T}Uk0pI>q z3RAown2x-Ak#Eo|@DwCd&>3V--k#0wLC?xErtmx4vRM*tFopZ%SMM)V^J8pXHT#3{`dRwB>%(}3?We$WR06CnV)9|vr4P=|YR`T`qzaYcLq z+CbF(3Brwzpr0`g1Pnu8Q22(No-4;GZI>eNJVjXW63#{X?c>?(3Bm%_*~F*Y#6>>B zJHNH?)kF9UAOZRNKo1k>jv!E`KSKGGXR3qzqmb@}v5M9vq{2)xBHe+B|-0iIy~ z{!fD*7^g>M-G2d2ETA4ipr^qGklnHeAIP*Bz|AmT?B%&G=lK$N9?DMycmZ}m_NYR@ zQbisU!oA&d*lFp&I`w^!f_vhq?4;pQpIxWe>Z_^6@e@gEh_M0|`tpq+4m&2mta~P!w z5Hu10PhugP%C-g4h03x`7v)z4Ee?6w11|!u4ZSH%fS`%^e-aDXRJJXUE>xCnx+wol z-yAkJB8M&Pm&1wx*9E=-{2Ras@QBP|Gm-Wb;RE40Y#JacDu;cF^k)Dg!V8Dyu-t?k zc3H+0CinpH$pdoOh!Hs~a8M503|KcXhus7&IT&LExB>7Dq*Vo83491JO97rp{}%8y zWK}p0pfu7~0Cz6!82VMP(9T1)$U6<;z2IXCx}Xt0jPkaltSE%10XEjn zWosJevWaza*`9jPp>{5d0A5f(m$gUQAE2)T4n}&V2D$7ka2RlW!(0{uh(o^pwQ||k znz<|!_&D+=t8!U5!jB*)74etVp&#Hl@~;PuhRlbMQ3^b(f%6*WvR@JY3p`&SJ{9qE zHBdfqGtv)bx*o6Bl9vmh{I>C>&2m|9z#-5D7!Z#~ z-aU%+TZj`~V3Ai~N>`yzDNej1ucQ1*`Y_D(_TVdn@{U4ARm86%+z|Ky;yD!P;fXI7MrbU1@u9Y?aX*uppwpVM3$K6T!RF;qt+(OFl3#{a64?S{Z8s#62IMLT4 zjdZ&LAT0E5Y@=Iy=nXiR1bBoU-f!)s3Eh?QM4G@#nh0-08|^_^=K)s$-vicTJl&8n(W2Tw4?r(KFd#w3 z%{yW~b;xCnfjaA41WVJzou2FU(s&Vfc0+UvJ2N0jP)YDwOwM1s_AcM2D@DZqyTRSfVC0XG2MWK3a##enDO@c%M$@oW^n zp^Pa^U_kuz#9S7NJi%G;xifRwH9!}@YQ(*=b6F9>nD6=u>gAq5$ zn8E}d5MKyTAzvHB(`8Iyf~JVKhyDvuMg_z#$(X_fYZ2cw4Py!L4d6Q90f5p32%3oh zC$W%CW!nPjLS@;ei}D-H%wkb=F0EIsWybq`ZxbXruAMjS56h8h^3g1WCY^0q590ySNI^Y6;u`%p6@B=yg9QZMy zk=qy+4wwa?aFQI}0eq+07*=03hCK(a0PJ3G466YM222CgZ$E~`0p0^B!%f4+u+f0o zfH5+r@OVX-;wC@_fbvtEAO?^C7$C>Bz*7N}Xh8z}h1#XA* zvVbeS#<10ZBY+)%qDZ>~Ol2+rl$PT=`;K8ssDkv7fR!@6a&Pn%pj96LFvTZ>M+xsD zEe!NYGW|F39!J<0X+FRd4+oDDazIl72FUb%$g>XdD~Ml0nBtYeqlA;7KLWizfargN zzC(sTfPV$F88(J_$}oJ0B`nee?ySfs(j4J1CvqI|DAP%&)kD$8GE9Ly5w^t}6!~mv zwsDgaIktK2#Yv|JBge1?>M?91z!MNKW(*rO4*kD)3_B=e3KQfYJ|Y)=J9Z2khj?AY z2@AN4^jcqyVTZpQ!%hPJ0=ObxRfb;>FM;rR;Cl7jstj8CS`VM%spzelWSvIUQH2+^ zV%165Q$aN{LW__4O>NtzrDPb?srBlQROwSx>J-(;5QAZ)3Lhw^XKave@lKtjqW95M_^?D3gGN{3iwS%t znWfdlAvsB9z}K0&WUWeTFz5|!RldO{lQuckgibK&RqEJSd{!mPYpjr#k$~??ROl=e zV8SbJDkHu~;srJF?W*T`$-HrCDX}JZs)4TC+TCLg)B*LsO}q;fQsQy ztwQHI%GSiUkxCtdFOE^RZ!p&qBSUY9Ri{v!$YrZlQM@HoVZ0q8O?m@95tD|GN|Q#P z+^X~jx#4)bq;Xx_s_eE6#-9$2&v!zgk0YfvQ|V)QpJ-H4qZqSNViOGd6kRrnmp4;V zXd8!@1f|v$-*u_dQgox!M7OCzyS7!)XC|rYSQL?&piVQQJ0w9W`b0^Utj^+19IH<; zsnL-9+aw)ol9HB`q>9PHN1QgVRWsW-fB1=iDmMNag(Lb$Mn!iH?$RqNBDhP)Kz&-0 zrZYM>(W0%~MOsWv%UFgF%5K#4x>ee`@sYO7B0h_I$k@RRe zi9J2Rqm7*kn%w3=h)0B;kTOj#tbu|6d!OGV#98MDx#$u#ne@`y~ev&R(XHwPEHi>VdGG-;iY$alX>r?CFlV&ujs1!-TY){c7X>}=5 zPv}zcZJ~-k(xwj}MKak1n)@0Rw(OF6CtGXK;}hXTGPh|d6ygJ&WR6bL!;EM%WARZp zj0crs((6@8*bPmK2G^$Dh7>3QOCuGT zk$|yDCOs_$B9c%Gm|Ckzr`DvaQ?MGrRH7hk;HxD&pQT4LfKO+jRTW#YS+a%dBPo~2 z1VbZd!8S%Z`UqbIGu_q~n@Va^_|%kbs+ioVYEy#BNV~49F?x+{RZYlFVD4ifQPCzb zaY_0NnthffJ{e!OX7Ulk&6g}ms;8ps`t%QzjF(9bfid_;J11$|`eM3i+o~eb53m!k zcu80t3|Ja5AJF-YXbn?k=%Cg}Yctj%4)$;)H9J-lXcmL9ZIRo=H#*vY?!{M&nrLGJ zZC_z7Q>Mgd<8^p>+?r-o@!!xUO_~T5RH`@w8D=C6_idk+l9&R^(($)FUrA$6EN?W6 zF(9Q%VvWHZ()e1%?5;ZzP!h8jy<=1*Q#gihFRE0%roJiO7QWq*TuX}Mo7z~G67y?4{QM0-?C!%krq)!iY0$Ac~M$TAH7LV(`tgT zf`+E_H)>_Rt{7*X`7#-fRWevw9z*!*2)5v^Vi^oITEgZ;xOxbf+FShsvj*?A@WK^ z!lLy0Fj}W@S;5z-&RC{G%*zzzpp-7ONNJ5-`6^`uPj4(sVOVC3a?zBL26V8zNQGgI zBGFi(LQ}A?O6yX8%evIxye@_4gPi{)ERHARm#jWaftV$%O6vG6_(dR(s=jIpU{O=9DW z*r48^(`%yBjMfZILC>Gk2&r(?O^VWZ9q7u6d{}aRw3#ZQG1kPs#z>Pv6@!Xu)P}64 za3`A5RyO)%%WS1j-Bk(-_Qy%8S3{9dqrPl-Ej(sFToT4FV>m~el+ZT?%cZn)3<7i^ zg&o1tb^0_T96EkYm8#bn^;o#gz6^E;#Wskr(r}e&c{Gwk6_J7KkVI_drNwm%;*th! zQNd`j0Zu*mawaX@3p=KqI?DEP$$TjQL#K)giifOcm zrK)-dRj-i2(UBp2q6P$q6(me{xJVC3QI;*QK-^G^D=(^#dBIhQ>qPm2TU^v8rh?q!E{}^+@?V>#84XR7 zbTJqwNU@1EiAmEXX&UP^O_gIC8z6R}ONf-ZCb*~Y&*W

    qN^nkxg#tet~sn%mC{I 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

    Bo?DSXYeA8Le6 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≦%DYc_|uWhvVyT&Pe9*>e%7TQv3=hd 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 h5c`;)gQ&!GgR9C!3(+R}`gLL8u(TCvGU6!*B zmD;?D))sM=m#)eVPVMYZaG+U%!fi1~kVZ$aNq?`wzoR^7?eX%8Z@Op<4 zmI7EBy0TUJJJ?Bm*K2l^(P>?pcYVCP)OTFj?g07W^6*Jl<*cVFe+MsmM7$tum}CHQNr3Eo3kplAV~2p-s{DiCM^GyoOOwGkHVg|#|xV$tp6FbAN5;> zWfNZ5Dq(Za%h`Jd6n0763)>`YwJ~S4yLrj@d8zyk`t`**>-+KxDBgD;VdBYWP)As4 zYtDLyo0kzgF9aDGmM6SFpR?DU89C>!bGgMmKGy1ib^y9D=lxCTxs1NPV_MGG`#j_Ly6@8dF3&xraeSw~ zA3j^~Y4P$D)h}D@{TD+eu@CV*?OK)NVNQ_1D5qw)X(XOX0+1F`^WH&Z^kN(n;vkvgi{UNE_oO!i8c+*=S&Agf~ z8%g`Mk*R56zWVMYysEA$?7K5yl_BgjSVah10V@w-XTiz>n6ZD?$Zr7C=cun%fp760 zqXNvCB^)GKX6LJ(us-4#-A1r%*(})NOLF#kc<6+?v=wYjXT&>aGE!N$7Yc1FMZ6*6 zog-dc{m}Fm&X&h6_<4!#f2jqYhGy;RoYlm;^iA+wEXw5o5R0BRU zZ{1XjStGjzZPhh7OD-Ed(iasEBEP`Qdg+jE3(bq-=h)eABDvZHzm98jR-Fpl=jZDS z->!&%G+|$16I47hD8%PDd>UVwvj#M%I1itH#x@DB)l-{N`E0Ct9$Qhmx_I)nCUZdT_NRTy|ERL)pKY8fRK=)_7+x^*HcNu$+yPm0^ zpaJN5r*hss=J)7)r|s-A#QwXTWoB1$|C_FNJtSQ~(MJet)*)x1<}y}piaU-roGCd1 zHTDPTZjkQshjP{lPd@LEE_&xE>W0IjN?zxvo#+x|<9Z$fDPFE5G76fsO#lA@^7_L$ z@9vDEb{FgyU9r2PK1g=*arlhECrYpQ?bp%a* zA^fLv_FS)Nm!WnP)LVU=A2yJM<7K3Bl}V+~EH^IJ$eF}Ia)8^MO46oW#!EVreUdE$ zq<8WoIs0x|?ilme4Zq2j(zGXaUiF!2Xe&NS8|PhpCb+K1^}%s=S1l(U)7a>gW@YSE z$%c+(6L;PQhXv-|k#q3N!|%zmb@4|O)rsE+Gvqw>Z;@S)g;M>p;-l6Q>d4lJmdVjf z&LtENNWTyMGxIyg3-$Xr*trlk4Ym=&=D^N|utl)-5Vi((CWM^>TMJ=j>)68~tQu@3 zgw=s9hp;r*QV8n=TMS{nU<&~(OBoC~{JOpV7;1NZ|Ip>$*~qG3be4zLBD^*~PCI!N ze{9=^9h-WoBt9N3Tg`elIGDDV`Vr&bzt34c5&84&IahDQ+e@OPwV3fpKK8+{W8Rme zx?3-GqwU{lOVAP2?xCB2ZVbAII*+JwIRmf0&*kiWYCD(91EVgz0r zpU+u0k=H=IMb8a3aU6QFm@#{a7vWQND(9VV6toj_+!DvmjT9$ppuG?fOm3+UT0cgA z5~ob>Ji;o$hC)~^*kA~21RDroDdOhA`oYXxkkS9BNH%AwUZu1pYx|*@hvsIdO-1jw z)wYZGVaRd2eQ;f0S__!#xYIBQqVl*CL@2_J4n!sMi87|tmd+@>(>d$u5pCG_SvYOD zEB2L0*+n0donLnr`{xTetBrSC7L#0PKID}lJ6~67qm zxHo5Iz3+blQVn%wp>|e28znHU*7UnOy4dyvrKB5se5H}B>5%`RX530!7 zL+RcF^txm!dkTB$UMh%#L9b+UfV~S+?QV>?E5r@9#VN4m5H<_86v7t37DL!7*g^o) z5M%@FbO2K})keyGLj8cdbD=>U%i3gfKBAU22dBBXaH?>U%i+}luQhmmOw5hGHf@Ba z>EA=BYaW90V+RwLhme+p@;e2u^g_;FlK-b&?n4txxJ!%1U@_M}+a!XKrm%^KO# zpEBR^rQ$TI!3V$}Y8tiVu?Jq&Uv|a?lu2+c$2IPzCg?$JRc5SvjMMTix16zr7~{#zt~Ig36^_1*h&cN0$UDY{a{N0O!YGgwg~o6_iafA zEyF8ypJQ8_{%7W_P5(1}nKP_nZAG2g$bpJ~!yixFPr}EpKeNum_gDDiN$oMzSvJMm z80WiW>JfM?!0Vx|im2-2_vik{*AuAS^!*I|K-$4}GXgdg!Y055 zL)ZzhfdD4?I1knzz<})i@8G@QX1r*|>&z|d?4OwuU364sZ_Tvtvn)NweEb9Wtffao zw3E=}4&Xt%zSv#xb)f%BbRz%C2l7R+d$z5l1io#I*jbNr=W z%UQR2Jk9(({YZEEk%^BH3y5OC+G1D6!QkJmMNFIE*$2;><(z#7NU*G@3ePzpe@?lZ zLjat2`z(oBc%;6bGxZEhqr(=!8o_>7fb*#Q*T6f#jlIU-!p?z>gFQ~)#gpP!_U~GM zk+YVBk+0!c{AxzG%qg++n|-D#kA2W&S8~=Jyvw$6=IStTeZ6jWrcgo@i*1B*Ohlok zcW>gc^D+d_et7;bCohs4$H0cZnX@jFPuS>6e96vzqj+3Z-b@)EFxUIpdtaLq@w>^b zTD2Mb+q_rdGx6=5cdmoJeFJP7%w2~etn?SON3iGfu18oE*eaM@1bT$+16u(rHHeKh zfh~i%Yds`iI>6Sz%-K>5>4JOTihMQs*ry|9=t14)8ELb`j=N5TgUS5xo};_RcHLEa zcl@51`pgn(r@zCzit z7=4}7o$5jVNmu+O@>mrs>}-M~*CHy7Gv@vxGQjxN>qxTcKd8?i<*ZLA-$ri8CCrv^ z)t%|0dSOA_vR#{x&eEL~NMYN%_q6**4WhL=iEWzb{V6p&}o>@gu3;x_^Z{_&2{@ z$)`C0b{6b)PM?Ze_Yk`W8!aeHnc(N!3m|u0;R5`sf8nR0bXUP@!SvaBgl&M;1n49) zO1G#FFtb<3)ZwLgjOBcgoK174j#d{?*U;8Mdm7sNH2+PF1n=LarjG97e&*rbc+6ul z?y?M5UdHsZet6`6o%7D7QGXc)>jg9SZ@@Qrj!@uESJUqF9dppH26&{v7Qr^b{4-w) z&$kiH1~ipuL!YMbT$nsGmH$b3K;xb@;N*qj>Tsz!(}-QDQg9R%4f0?jWJ|=@5S+@n z!R-mtzkA?$q-6VamA5fy2B0yz8l!8Na}+pC9-3unmY}(rchynQ z4;DM%smTKg)GEpF4YmzY{$JQTu{O&&*P`MT1XRJI20Z2C1!uT65mp}&raC%8SeCFW zln)+ZePGAH-2G?5M!=@P+;&<6HUTyX*2KHy%25XX*sr-{io507ZCRqY^U%#g=bnX= z0$T=K1N(R0t(?j+_IBhbyWe$ci#@-+3C+oPoAp%Dn6hp+=e9`BS0X5u2s`4))L>hT zm&nerOYNXGdONK^Lb{H)dE%bi-Dbu=cD~*DFIjX5b|V)3b4R*~GeVq-J#ALp)35%R zt4O~(GQ3#9+Pi`yB$Saul7nYSXKrts^*}j)&@LRi#2?!k9cuJ=E{T79UUIECp;mJ^ zdNGa>_F!}jav)vWYwfnme!I;c3s4kDVWw=%vI5gK#+-0Xjp|YTPJxvYNAg`yn%^v# z1!imljm2c+bdmZ%6|tv)N~}7%_Z}fC$syLO?a*w7_^5b zfm;*X?KZdl%&Vj~LB4;J^bVW!#J4!T><;Ov9NJ^Mt%fSUA2)(^fz^XO!O^|Jef>sX zV4n={j#tsEbaIrZ=GACb_EW^Kd8{XsJlR8#Df@ZxCtO`sPZPgousX0?1Q_{8A9U_z z;>=E`$7XaOrt{vS`yK7U15qUNs^Yt?Bk*{Fcwob8o<{YpdaNg`k1)%t$54L_+Fbcq zU$XOHva554vrt(-OU|P*!)~dF(zBX*?-oSoQcI(N|JM^iTPMB z|L+GeFByOvT;LpeD3)9pQA)3T7v=G!HtYU~^e!t*uT|-N_x$Poe7p2izJsJ!_VhOI zjJPX}lF|u=cH5sMyvhwXb{QvuU{s4jdg>(MwS-Udu6ADJv!@H=*eI|U)vwf7H;Fq& z+;YX`QJXK{z1tcEGkc;mE{Q8pQDB@r|b`}5cXJS!jOhq>< zQ%~LS-?*gBK0_{4PfXcq4^h+2c0D1eAiyG%UB8d)OcA%TuFYOgL{M7Z{>QvQuVzK-V3g&aXpeNTVMlVKM`QQ+wZ^r8Y^QDv?k}9bi!tYkZQ%j zv(VI*Tx!Zgq_jH9c3TzCZ1emI?O;7%n zPcb05m$tJ=bsK7Qf3}9vqx#qhTriP0~8jP?)Fky}PZR045og0_z8R z3h#Emv1O37g!nWOK0>(r9l|=mhQM6eBCH2&5KN*~kFY_ofeL}GkE!bJG#}u|LIlHd#n$W?-TfBGLf_QZiZ}~<3I6zoG*bwQcZ!tW6R{b4!j=Rm4`=V2bud)n8mjxjIpIUp=*Th|0)lhKaCIKLHzHh^zHph zZ~ysy8SU!ZUfE@{8XTf^Ff_liRK;DA6^G4!V2{shM zYQe@rSR>d(2+M;_hp=w2nGiMrb`s33H>EoUHW$LCz-B|(ti#W3!-~5Ab^^K}whDGU zgl&K+e?hv^-@^V3VO3z0A#5L*zBd@R3G5hHuuMA~el8|G+5@Kix$R~+=IhZW!bb^L zdHf6SA>Ad1w9~Yjwa-oO_+{G@FL7a_s095HfsJV>fg6j0OmHM>(A6a9@qA8zasD zaV8b#2K5=EH@jV(m;#=G=G+c6%Fi-1eFy#gDBe0)FPQJ+)@~}D%PHM|Fd>@q|HXJL z-R7O=uf289yuqevHfQA5K{E@@y!3#v$2phdDD&#ZH_TArmqFj~eiNsgI87~W)^B@p ze1Akn*9UG82QfmaVEMNiJ7j`5`!a3T2NlPZpRr{yJT%y{Ef!3fZtoA~23P~_gd8+} z_EmU{X4|Yiu+Wp`w*fW+w&;y@SP>aqch9AV&iTODO))c>7d4NThgV}I<<-_^eaZVS zW1rw@(_JP_`2YQ{BCj-f|Lcu&lfmzj6; z=W@+`a5+^awq-=p`_24$FT5J^56^cf>ng8#c%Htjt>7NBWw3cLSN@1@9c&TIo%fcV zv<0>T_7t!F{JXihgU?hLHEK6YmVb-~Dy*LPjgQ7Zba|V1*5X~-!{Mw2b;h-IJ;_?i zipEV}(L_Th@%o9kLA>wtF8_SAKT9qnCPB6SHR!wDpXe>JyY0IV&Dmc|@E*B>@08&| zn$EgFy`rW%RI_|!=AZok^^n*s>re*gb{Sf6`U4S9izl?0EGP8n(P~d&UF_+6%J!tHpyd8t#>Bf;q(SD$RDF0~q=Tl5@PzllFMY^@L>zJ3yEg^#sF6JH@Z& zcd*xAiu~ps-xp0eMb~dm*4a}4W}iS7nnh?%I(^C6|HyJ#Xa8eHszhh|GGw4r+1-I# z6p)Gq5EDr~Br^fO#;!K|T(h0a6bC13hms2=H_#+o_{3;_wP2)9kSb5kY-X`(P80B(LR)+emv#zH}-oN4& zC8a9)kgdkP?RMsA7{d+6bkeXrC)!QeJYoLaK6>J){P>zrM+mbj-qSP0QTv%7&c2%p z+tdlL+7LDmRujUO!BPQCHpDtuHP{a|;5c7@!pA$LnapC5bb!w_GQZ)m*y}HEv+pmY zJ+l1**AliFLvyv4PQn{s;rMP?$@Ds>z4n2Rgm9JLDEK0{X@6#%-)9E+U4%^&R&i^a z^$pKvGk)4oJvsX~^6^x(>olu#=_6{e)!2$=>A7 zYt*y*U0LwO2)qlt^!7q}@g4wg1b6$BuraV~2%7@y2w}5eT>(rwXaTGj?2hepP|&|T zQyRZfg;ZR>=|ub;%<7b0o}4dz3;#2VRBHNI?c*q){xL@r2H z^%ZQQU<|-|-2zDS2(r1>;WzlYHtXXT(uTU?e-~{+qf1|74noM9ojLGT*{4(J#{p~; zC$IPDZk_Gy^L*^@DEVURJk13RYMrbWHTu=jkPYykhX2qT+QN63p-43rvQ<%9Q>ZFU ziaw)G%A+>5M%?K)`f@~l?Ht$?*b_t)n%k{-JoY|e8wxXWB5Iz(k%{@(Wy#J%JJ0R5 z>57(!??umdki-z_)!)%(tvKlw*)|l3xj#ggy~;oe+QJ7D5tAFuW^Q){z9-@PV)3P) zLdeoNe{Oe^@YQX?Rc=*JV19*grzlNX?gQHdEAW4SoeN-U^BrItV6Rfz$g-mvGnujf z8L5Nda&OswC6cj!r3ox`n9PK_W8swkM7p?y0f$JDtn91 zU*Bmx5&0Cr27xNUEU?FWy28vmU+K*|n|W=M=3#~m@fSxYinAuU$$sY{j_=vTuH4Wq zD>iT?|L+&@YF^l59J}5DjBYtb`ZIU>^TLel%_=ZPvZND_X6H+-~09Qy|=mR@l+N~&`d+) z>c|vW2iVMc;tfEv2+gCR*Q2&R2DSqB0|7hRDB9CD5~;!VC(OL@3cLo7w%O-qn?8um zW%}Ul1^rG*sm+u<8T$?Tmka3i^?C}t^zFrX1Ne~$JP$q_f%kxyj~4S80`CstsnFKnG`lk*j7ZCI08)hfw#j1lyeH{5l~u%EbV z@AiGjs_#*-Rj_Y3RTq^{<$J-y^u(OeG77j(Qy@+=#r zlXxeIr?zj~DE538m0{ZD0O5;-KV9MGj6<|9?NV*_7-4G>Vd6VO*g3*fo;F{6YK*zX zSK&*9S59spzCn0B;o-h5c8Xu|`}ki8H|+?SAnpe+Ud4KAlz5B8bNi0!eG+T|tkRSFJL;|fimdl$TW_tyYw|;W-Kvdl zflYw9X$q@&2K_aFsXl7J#=*j6rm!Z$rX#{MhCM>q9ARZj;C%MXP)WQ&K9}N=p_#W) z-cG=8;G>28b{=d5>|(<8h;A8dD1@zp4F=*?LbnAr3Ko__m6sr2z}4OKh-WR>39w*U zHG&-vU@DJ1*fdzUti+?2usOnlx?>1z8EiY&v{WUwC7# zI_K0o>Mr_#kR8eTDl9PhDb~j4G?_-Ui*%>u|}VVwQ#{bl%aVX zSsDzHBDS@0Y$JHFDU>zW_ujjB-~A70rCeYOrP0Ba&!qlI`-iecqV-}vp25m0P{Jm$ z0z^7^A1u1zm;VI5J@G@19MwFT)}`TRd{T+)wP-taFTr*EjzK^4$u?_%(!a zHDZZyl|A{}l3*_(3Y~g2^-r8d;&dnuc@FMb@t5J6NcM0CvIf!q0rHf1-Fo-yjPZ5B zy?GS*{y+`c?W2*nwI_VNr+UkSrNO@MlwHuTZR(BM@a~_@$HpV;=YZLch*k?ZgP26d zXBJV>xkN8%FOv4$pR-;}Y13wk*6umJlrHTa56>%NL(y2m9+m?fUsiTXErt75hj$;{ zHCB2T=TY1GyzyDsPk-Uhe>!V(8CL}F=uLB~Q`P_D?QP)eTB^GL-E(r=zzHE&iUzEY z5rPJ-5;aPIfN6Wurs+v?xC96gxVaFxftw2f0tAQ{C`7v)SWP=*#7znwRN5tMEIw6d&`ndT~g5UHzNV ziKj>X_cC!W64&;Y=E#p7t}aD05%SGdpHi-IBsjwoKNTWF@*N}x2n3!C!oj8 zuD1lQ`9Dn8tCao)!j}mT>@X_#OJGZ2w$H<41M&rInK`w?vho-Dn?;FssL;onz^C%xXU>jh8Kb^|Pdm{QA zSfXs;IZ=UCN!De`Mnjb3F0YPPGju!91!bdeDu7)Ds~2B-eBk4yZ&Lb0gjcSV(u{-c z2fG%{9O3nZ$M?i7gVllksM6sP?=`R%u%KRqZG!d2FqP|Nun{o3PtEj%z$WKf0^`YX zJKVz`W;kvv7;!9}#%A=x1kXI!(u3f668Z}DyvrTlL4McvyZUJ`;g{I;!OuUVrkBT&m?fAxePuBE}7%Y znW%4EAZ-3#(iD%Y#9Jg@BzL%D0Nm=o1%2WgVU2`cBrMr4MOPqfBPC2}3=+0U*!9|^ z;!P9p(!In}|5+j44)K&{J;K((wiDQv;}?&21#Bx3ukxvW{^Ictfa!bUSRc4kJ1*kzAv4%0bJj6Py;MFg!6+m8&otOi`Hnen#-5ZyxK%w$KNRY z7FXSPMLI}2TlVD;-$rSqiZe@`72=q#N*t_SejJpeAkI1BEZ+;COT;;M9X^^nRQ>|x zOPo(RojiT+psD7mG#4{DDjqAHBiU~0#>B+Q^b@5wN_tiI{Qr~Q0O@U$Uf-Xgqu<02 ztH0~4A#m>a>(iA`{3F`stcOPtewkJqZqj}t=Z(U;*oysn9o>XE(!Hir%&;Jwy3std zaE$=$|0z?UqdB$Fb<$q>96lN{+}ztY&h5#zr_Za7s*UPf4jjTC{nIKGl zUxc>tOXW6ymC;mYJ+5TaB5`ZKT<%k~3f>R?GGzef zl3B{zCin`t-u3AJ%V5i3aXWv-5#$3{pvx;>E!cVtQ=dHuwgGm#Yuo8E!rU=22q#Sm z?ecg}g2!?=jwMYI$0%FX)vVI{3Vx?9y|T3+OA7m5$s(J1)|VhM6zH3F;J5JCQC(TN zlcA znedvdgq@|c0MC}q$i~nFeip15?E3bEfwJ|KE6|NYSF1*Aa^kw{DSwfgJ1R*!Piq_c z>{hxhppURY!YF=wl;>fv0kHd%XO;5;bc@gh{Y<*wS+E7LdU3aYR=UQrN%#ukKcVo% z8p~C})>Fd7cmGl9k1*xe=UckQ(nPrTwe)b6Ne|(5geUDI;yp}QQ%abU674kMdBUwd znSJW%5)~G=c_9lfohJS ze-eIL;go4~FM+n&03f+=vtt7|i$g3)w-PN6P3zy|`z;#Ule4|D?_r_>BPN7(p?fQ< z@VJ~r8(%coD6f<7I17)5iU&_Cf3sjK50dW|JevL?;;X)V1*{Rwe8ZfMr#4j8PWghj z@a})R?b+fJUJ`t|wY4VV4c~`&eZ-r*mv|a4P7-hKUg9ZBDyJplE)!QnvYvMSR>79Q z{xYRMC*%zWlT~N|B1MPDn|-b3IPGsc-Pd2~H@a}ONj=Jc9;_7_+sk3~Z}WDuAtm== z3_JSk&4W}&GsG*vGj2;z|5yU=32^K4{@hRHuufPnVU3~OHMy3y_l0xrvX7S7EmzTf zU%A>2_2CiuHE7+dd16`Rr<^nIi7nu_rkOO1Kc;3vWDE_##A zk{od%n>voU%^TXO27k%3bEI+Q|E9NB2-i2Z?h+fXP+6+mm?&Ug=J*9%jFV zd$l$)3r#yTCaawfz53uX_%wK+v#1=_z^1^`_SdS9ZWBIBxb4%3r(frG)FRj0`5y7w z-?`U2M_jcH<#j@iQ>>)C+UYz^gnQpCO}`y%_ZsQf!Df)~DrlZp!ZV+H37k7fw-J1b zIPJtaq&SRyr{qU%K6_CfkK{Nzjyy?$?jzbcXa=D9tZ1UK$7BzMtK)d1!KY0Jctt-s zIwbzHz)2!eAna5YbzRsy;D5XL(|_>9LW7rv?T5D#UVkM$Ty@n?_z2-9@Axfj1Z)~C zSfda&2{skOBqL_QCc&)DjQD$g>cE%5&w+oNck+h#)0GO{$lt5%t>w4cO;mrF2i#h%9V6;0Q0-0MeiFLN z&;{*T*bLYXn8|;Bt1cG7u7a74W9^a(yVWLD#%G=I%Ks_#Ti61t0NV$>o>u;@fO%kV z6cCM9Fq^2Lfhc#(@Yu8DzoX@J-~r=cNR+?kBI5%*J}4eM8k-7W8(>cr@KW^~E^FXb zy2T)2yM#SoVU~By^>nKmoR+(CL}q5#M9?(xn!a_y`+XNL(!cEFN+@ahC{ev(FYtAM zHRu+hdtzx_+SnAWsfK?0znUu0(CIbK?SDGs!S0RW)eo;T-@VVgW>WJ-qi!Z&i}0Fc zlvEy7Z*l($tTCraNb^f&mvnD=DaqAi@#Im#1zxl^pYy0zaQ@|kzXy;ct88XzsgXMd*PeMx+1t*0`# zI2oSN*)x2LwO{K)W5it}uI(!&dL4h$U>Ct=c@O)E_Cbq|0e1j+nK;F4!FxwIrbqMF zXiT@ZezdyZt~4#zkPhXtcSxR<9|mpquNKld(1U#3Tkw8Ic`-RbI;Z4^GEwn##+H(a z%;DT{eDr9Aq!0RS=z}|M6Lp{Y6t#`#Lm+PKekN8U{of3Vk_U6}XsRrDx2e9ZJZ-&_ z+Q@vA^7I!enUHCA=6l1i$CaoX&<#C=a!hF_QGJ?OD_)5lRP7Gf;#2u#dg|M8-n(uRj z*~+zBwts0)tKW$Ia&Cq0N_D~e^Ax$8Xp6RYqbhw2l?sHEp#8&dE{5|4< zmyO2V`e&oxet#iV2hv!WCw!dn;Qj!~=U%WyusvZPjdcHLJPLh2Zq_u0MvVzJZdA|b z7T`4xui-}(y#K2*Hea|jUg6lb39IsHoyoowygm0O;vYLt+V_z7I?fcIqv?O1w*Lh= zh1`?bFUb%)B>Y#yp;TX~GK4 zX8E@yBGK`m0~EiMim_7p*dWcZAByrJxw!*23ie3V$u-N->V%W_vP0=j6(=;^vTojk z3;X8?>E4jW%v5}ogB|K?H0qtmWq+82X z*z>|55692nqi-7|ZeK$@uAAG&Tew(iw zA}RCMwCd3cQrXRqFD=8`Ok@p`#1+yj9xQlY=iN^aWhZ`qx=W8{$Co5|AJYLmi9>mg z8E-p7G3Fy{?f(Vnv!oTwW1C2F1Z)fJgGwKrCOn^!qC@CArS7Os2lG`8*o$rvy566> ze{}WGU4rfcbpNFEI@z&LBB*s3wYXaW|K9fMVe5ZYx8iT}Qw86ypm?a=82ecbB{qr= z|8jwV-}ak{JNtx!Z}X>TPOv^(hiayIECUttw}#Eu$8v+z=>TyX8w=i@>b%!%f9{;@ z@jdLgN*Sja7pz^TjqI6O4%5*AGyVL3l*4thPn164M`a2e_GNUouxXd$X{>QLPsvQ1 zEJrD3SMDG{TWrR*nowl?gjq=_!)1(5OIYUPaz4j%Sx=uW^jnZKrz(Q;waPAp;WGDOzJPHgzq+RuyeY@e%}edOHQDjM z`$Xh6F#^mcVyykBZua=kMk9PFI=c}J~FbS_Ic>PbPS0rpa z%tykzRQfYVQ*|J031?H)sg9i5@D6D-v=_XO-OqOS+?00L{4(@kc%8kUylzY3brN1R z$8QX;3-CG#uN%>~4&1@~_6G49gx65Vjmg(CytZx-FK-Bck`oU;U((YG@LGe{e}-*> zd8IoK*7P*DAf1qrzlhZAh^eau>1k@Ov+x@&6vF#=-Mrn_^vt%*yx|mgG2oY>^Kg*9 zDf0p>>2>hhhSzLo!N1cFJ^PjD*|^|-mjC2#X=@EtcT(S71@AA^2T=mu`YqN)yZIOd z`wNQYpP?iAYYk}DM9o7tU1ZKtYVR|B(k?3Y6-q_}%o0w!>O_USm0ecI7i(pqwvPcN z)PVi9!}^!=ea|X*?@9Z`AxX7=9|FlkmGdQ1D(BmXY-vjBuwoN1OSL%IKYmGQx^G1noI! z>jw+oEi#5u{qEc7BU2n+7_3`r8So6I9Js|zd)(N!$v%zpO$y8xlOXf!ev)V$M&G=% z;GMsA8*R+Io4k@vI05a-W&RzA4iQ3F?!SR~~U4O}1{_2E@qk zRfSwOUt%vmniG!=c&xwbf%A~Ac;Jcrib+#Q~0W@EY82s)}SXR;mX_C|GM>j(4j>wiPR`y;0t+@<@GPiK*tQx*8c zow^A*s5@7;GIkVQ(qLz6YqG`dz-Qx)*nxT1Bg}gh{;n}ha(6%2Ww7U5OBXS@Yxys5 z3S0K)_oNA4pMO8RDt@ux@2`co+WQDtBiM&|_sf-4;0c`vE9;*xW>IBy)`9=SEU$iF zUV?TW+CNRnTVlO2FQ2-@D%)~vk=X+FEB#l~f8LDkRqyUm8PtLw0DoI)I_YB%hSHCv zCev_ScyqB1^KJ;xaU=~geR+k^01gWv933;x+6jBh5z z7!r`H^m?q>t?saD;;L<5b@7ks`>bu#qqN@Jm|+pd*aaqLu5pC^f3o1E(8 z;Z-S#pD|y#~pP|KTSw`^r#~Vh#|(-{m#Je!s&w7 z1#hj@1^4$Xf>+*EimU8b!CS$D^*~`8U@Zx32do+F;o{4qc;4%<7lWzn^{6lH2P=XN z3P64*{Z?*?EwvsXN}l-B#J^MVspko)qO4<%Q6sHD1B7oW4JS+DXS2{4XbW}WaMqT? z{2wjd+L)-ev;dFwy9?f%c`xa&CNuq7>~xk|tr99;jnDm!4MsM!`10+FV}B^j6bpSd-3Ve!X0A&6`iwS$J&E z6}*27^+dXnJJ*$|X7(x43qz*}|Bj!_(9F*lV)yPbUtq!b)%+{@qxQA`jkK@diQ4pj zum-S}0Ha?#hZ+{%3f=?$qr7{?=-#$o@F8&XU3iB2(ergCq#bb5cHZx6W5ih?&QFW> zIf~=U@P2;I5VlU3tz%gqa_i-CnsrjUO>NE%xt!C%JC_8~Nea2l%ff);>hLZS%XYzQ zFKO&5{r4BVo7HEonTFKP)tOi4s}9?22vws{98?=NvRwewVoz z?^?@tci_gy9&?T@m0X(1CzZ}o%*zS3N~hr$(O-V=|7|*woztWYmF)-dgP(1OHWv<~HNOT_WlBd6fM@Zo~j z5w=J7?daFP5q^7nF8cO18^>0mJNNsAk~{1+z}6Gk4%kKvQ@wg`X8r^AllMs`?$P%1 z^5Qv`<4#~g%6(}=U2~9h7XKhcx1wHW!*4sT%eq6`lG?)@bSFQ0|LHcM>swBzivy^RhC#C%PTyabEI;u~`iC1&q-chf55FOi~lb5ks)(g=ARtXowQ@A%sFTLp}yh z(*FOn;5|(;g?;F*ETS8 z?}6{%|bat6*v`aja_6Z+~&D4ovMijx~X)f5fqNumfP~ zD|+;QA6RVy8wOKvYn%ttPYV3uxQGIOq>v z2!u8}-VnhJj+q&6IZ1K*;ifVEdjOknXv5nXe^(3MM@sb~B&gm0?W^Sol}5h1hqyKO z6uf7vAR--}5f{6IG$os(`4dywG5n_1$Y*|6I+OF;;|{#8!Yhy&`^EDe$k!MqNa@ys?|}bP_JJyTv@RyF_aV5Qgj6(|fS`%`ZLxaB7?1^8L2T8ms1X-W2WQ^U?myc)N?f)74`u zR+5xzRB<T8zHNU@alzEaL-t}%?QPc-3RT3 z>f-aN+YeQ@Vq-|IdmfP+v_QIKsH_~#^_4~R+fDsx##_=2>{sd^&0xD=&s7=v{R2OI zzkd{gdI@j2Kz~+vq&JcvYwwzL`HG`|)M_ApC|=bRGOD9QM!}+mzeRX%!_)j3qdJCX z<`9&A|20o*aiL##=SBj!0s0;2d;c=Nzl0;iC$j9ajkOWh+SD&<@1lPbH|Q%sCI=hA zm%+`KKFWjHCw@6>XnETU+eh5dFQ&w0K96B1Y?R8|Byn55loFSD=dXluj~L%&;(8Zd z*;*c)OoQ*c!nnsR?iO(`-iNr&tFrg%iwoAo+aZGeh*hBgv3qxzDB!1FmAq~J;-+4FwJTo-xj=|4dp8xF@9%YBomKS_cM5>$OTM-h3dgus)vtP zkLKC+aJ;%-y9UbTBv+$>r&(uG#cH1Kt^H;CH~D)h?=hK;d^=rHE*D>A@-JaD^Xnfz z^|OPF6}kg| z$N25?6`!B-9om!GsM8rsoHp?A!RlKwXVpTw(Iv%L*a3@0F`9Gm&eQSn%;_JQ#(nnflYzECu~pG8LyWz z*;ijez`F?P+vOVRB~mG@BzY~Ctd^oUO~~VfG>i-SvVsAwgd!+ ze=dvk;|;>A{=t0%zeTeHRtxqV-u<)Bv?7?#y@-VgwTY@Tj1PpbD;)VywvU{iHL-V$ zN#t;XQ{auI^|^s+LlWNZk zU0^Rzn?DP-0QMJE{Gg27UL^d2oQ$HrPVEiuwab2g`f{FcL$CZb);GRcy0&`&tN|=Y zQ)STzRv*LE7xG|rU{BzkwpennT|Z$>DPd~cV}!L6_OqhnI6d_seb*WAVeqwm{IKsz zj1Bf(CNsHD-oLB1T=zaEs{D2I{TQb2Ismo}mi#W2Lo;E! zggu6LJ$3vQz-qr;h~4FLyVm@UXwIZHKgAg)PSbVbi1!)d6p0f*^M3)X02a5YoCRwK zdl)o&M0)`&AH&oSFM+j!*}4kl86P8JexP(@d4%}VNiJ8St(!qU?V{&8xmrT2rAR+I zBSR@|AGCeYj((@${fViDLP+M8q?Pg;NRCo@2V(K(h|Jb*I(sS@>^!ue6*l zfL#QOm(wM%3t;hbx(c=)!_+sc-i18{Y?XJ(;_&PtbWn|@Ky>7zIrdlkx;D{NMtSJ^ zIa%z1lEGfr>U{}F{a_oV&73>PwIakN=_Mw^B5KHjknJ%;vCMwbI_WDuqm*gR3u~~X7LwlaX?`sgw3UdiPtn?%Y+4E zQX|+r*g3E#@$R=vH{Yq_yjM*QXqAU!_jEK6Z3CKhXnsO8*5{!K?tBRfoFJuHF-!l5 zr75fyY%_*QULOS828+vUeNP^|<{{&IpUopUQZT)?<|{_P?HmTpI+Ucc_CANG>5qA;u@UVNab%}udV9z zULwZuIgQ^_uy+ANf%#yw)>0yuj^a+iIg%1fZKhg7s&DRr*Ex9ojd<}$pBV(3dRV9T z1p!e$p?3FdnQkS!o^r^#I&s>h2-0DcXsB)>n3cu~{Hm&>b|P#YtTusdfz>ClD`1T= z>>#w2zlpvDc7k{5hT+*0b+542B5mgUJqq-{r>1{FB}SX}9PT6u#B_)a_??B{ryRd@yOW!DwIVE2 z=9d}+8=n*c=KMCQ#B38oiL z61GFwfWoZ(QR8m!jI}?_$2v+?W!3pP=<09o4E-0?cP@gpg4OX}Dlhz-$f!$Cb-qiy zX5yVxJkl(&O&kutOT}Q{ba0OK3*uKOK9ACG1v`_#dcdX=*dW+c0viLH1dE@=KJEAg zvQ*zQ@Ay4diQ2dv+*#xsIP^W%{)wmjSv;cZ8@Irg!G0(lpG*$Y$0jPWb9=&%)P5Do z&6@YJzVnDq->#P^lV}coG$-CI#N8ln;OAdbemK&^+l6Gz5b;+Y*%{m8$IutId6-^n zK8hV?w`>MT7!@>Ti`NRghJK*aKg)=G#_var#x!TQ#cK6ysV)4N`Sn!%Htprno!&Zp z)ei2~{e{h9-sNUvK$;+93{y!|c`&;($)(vv3`YPET$Af*6Tf(NZw<+}bSwi!K_VWKB5KsBJ zLVg+#c6!fJ!%mc)*>!u(*%+nCnIdm%qCPydA1tHldfzq@rF zZCQH_c->LmPV2bEZ0=y?Y!CZqW-%7RZWP{&@SYTJtAn&Tp7BPFe6{g@y3d=+C}-Y= z#U!PU>^m-z)&z8!=#W@5)RoF4P^)Hz^lMt>+hhyH+On1 zd;IT+j}2s;X+xy$+KHV1H2emh)M;Y^KkZRE3*b}W|K;=? zH=d=}>v%T1t2UcfOz@Jdyb8aTr$+iiD_GV0nNNaE@E-HiFq?}TgU0vtGu|RS!>O3& zYyNR)X0Iy3;|x3=EgrPxXV5M+_6>s1g5M_GbiPcUxv`B=CkeYu*n+~WeQUx(`LM%- z>6Ybn3to8%w55LgqyzH{uK=x1A517(!%;#JD8W$KJi=EzA!nxFS`fY#qk1}c8 z;G;+Fa2$S3&tMES#GfCW0c!-aed^X8*cz6Zx9?IkT2v=8r8mO4Y1_~;(% z$dbb?#O)>S+2?h7zsI}E-RZ|kefDh$?bXh$SGmkUf3VNVUVaN(1e*a1d^?)K&VkK? zt@EyQPAgASj7Qi>xm(oE#wpuhOKmETyU;d2zti`Hw{yo3MrCK|W?o-9X*y(LT;ek zw=y4g^-yM4k`-1nskkK=+XGs@rXF;93JL*?N!Dab#Rsup_IH}TNZr@nPOg>C0q|z< zX#6w1g*rT4QP##{zh9;_cMZZB;H>q}q-uwF2AAw9C$^n>+)y+eTQ ze+gtRCmuQZe1esCjfse@_Vdg!)vjltTZHaQqO*2w^C3naw_ZdYGxaJNinL+2mFO3t zExwR>mTMnzKLN%uH{Ro{ZWkLQ$NR%(Tde&M-}j^f$&kne@g_3JlmQD_D&Y~O7g7rvs$80Lc0m=qa{~O=4ER$v_tWoCv58_o!)PU za~O08x5mo~j`W9iEfr_?Vd2*=giz7(-Ga8~rJdd#@X?(D^5apbRR7&2Y=N*}3HfrZ z&8e)N1FzbF6TPG@r*Wv^!>kt$MdSJ{Fj1Mbg4cup0`HQW*!wVAaP%EN8~N)eJWu#( zg~RZafA_frI;)GW0UXY8y(z>r0Ht*XnmK45FB)_u`c!6+RFGiM5 zNR>pHpq!4LC%m4&A>zys=dHXu9jH?a1kc2K80(7N(4;auLp<;0ohCEb0(Jn*#zOL~HlljI0A3ING~WF- zqBTz3YzPE3Vq>vmIUKNBCawA9HxTeigTY@IJyHsc z3EF<85y>6ei_-y^zhnJuKw8m|d{d?FbuL+JhqQ^mnm<6FhF9e8j;4P~>+};9@KBRO z)*LPKcW;Mo6FOU`PRl=MKThnuja(FC`9A`m5^JEp{s*ti_sUCO6z8S;%S(Bw?QFrT zVz|^^e+8@tEN*wI{3z`SET~h}$pNrhurc2KK85aliut{KxR`dkPKD(od^cN}>b)1* zK4_;j23dQN-2{Q48+KeG%HKHgR$p0~zcXMLz%^b`{mU^Ux0oR z`X1i>Z`LPw6Vd-*^`l|ptP;oC7i0c}T+b>ybK1|R@|Y(43gOnz_^of82lGZcz1Q=u zdWhSa@f|tk-_4+tf7LmB+c`PRt3kwjOC98w;nf5$=QmM9i)5U@fdOeQ?+N8`|HrUj z66YlE{&(DN;Tb-p2-HNl_nOY|jKa9A<$|bUb??io``fDrIaju;x`;nVywo@aBrHSm z=h1gh!gC0oLH!Dw1sep5uQe@!jerGhS9 zdXoYB|B&x{ZKwA_@r&94MM=AtZ<^l%@~mr19>C16rvh}%(7np(U3a4&1#``)Ee7lM z^xx)k6+f`U&cJKvb)Ejb2iAXZ1Jf$3X^FXK`nTTr>8=v@GI4*z=`r!UiK9EiEZq)n zwn{hlGw)YhtNA$V$FJ}7-V*Xko8P)`C}zK3)5>zwpuaz=4_>unZcT%4aC6FIoGknf zzZ5m@bI?hk{gS?9@EPc~po`=VV%y0b$zZw-WsdDOtO^{Zpj(Ho;TM^o^6vK&@*Y3e z+16x^Ru5yy#+Rw2Z?tJkY*H0wp4bSh`W566d}kfsxQ&ZiAxlw{rWlQ;7n+tg-FF)G zyD4ZEpfMYd*@%wQ?+)c&f{vvAut@ke;X!|B06PbE1?-*5o3)c3CV%v5c~45+(f;G13Fq2cjs_xA*~)pFr~$oA4#ev{#3M?a1J8`FC^s47Rut~6>-^Aro=X<=z>N(AB(2bDXNRz9| z;|_dgekp2;8auqR*pI+|rQ%+B=Vc!p%cKfCTS-@&EW+=~JD9hJV}Qv|vzyu&5ZQU~ z-O8L#9R!d&;x!Ae$_eB=>XE=#2r2xs9+RHY)X76@mHaj-hb!~D%_mI^*~SnCX9D zg&1v+pL5`Oa7JuU6D+qReobq@H z+VNkDe5v$JSHZ@>{yFTYi8WaU3b*E~F=#Ed*JC}`xSc!kF@dow922ymxnx48_OJx6Wq3W(dY-?01zd<-* z=nV^yh(j?1kE%wpAE|{l5x@cvB~vg zT2%Z`3a@^q`yC6d+Lo1DqMIGtZ8`wM@HKJr_U4eGS?0k;+r+*crX9V$6i5!4zQ z10_t$u&IR2cW2;r5MJu`!6Uh|1YQpwjMEBJ8(#xI03OVXgl&Q~fCc?kee*I{6PVup zzUi;C>vz?8%7d`Sgkk+*zil9_K-fJl%;|f~jc-+3Yhxb?V zbf)W>p2Bfo%r$*W*&*JK$;FFVvj1<=g4S!exyIRdF2QeLF6ztr&Q-Af1hxUzm%w(w zdJ~wpiabnU`@xDaOy%AHRsgedqmN4y7T)UUlXx$<(of>U;L3jzp9CLD!RNq7zyrJ7 z3thS^;8Wn{r%!%Vi^|Uh@H61n4#1`33*QExP2ul-26>!<*Mcvm;EmwR30yL;9sDf# z&+zWIE1Jd~))Guc4idge`1=%2zA`VM(vNar8$wcbI7#@>d!u@70GkCH1luP$!}(Co z9~s8Fr^&T5oHcq0UL$Vdw>!OmQ^znFOJ6Qq%VW`m7Mh&q;aH=UgXE7Qk+ljMF98E>^=$rb$u7U;qPyJyStYU%j{Gt3HpYgd*q!Zhm z<+$$L{o{0*BNr8a{U3fKf8gxyC2NpximT|BpB>_^5I4wUJv_WWqdvjT>)pOB^I<;j zxTeFHyEQ#9+6LnFeY8|ZXaVbuVQSMwupY3-iXW!d2`#r2&RbrG2pc5q_Y`JpF@rMy zV*%*b|M+?;HGf>1A?^-whXjx>XFJfki7bz_AR==JNARk&*P&@xj@zjHyW#bn+k_n? z>~W?1FbQMRWL-{4tDn@YAs+)Cq@pcPP2dgSE#SeLeAE`Pow@9^ziZC8N^eTq|iE_$>AN@lJ2t@rv6$7#cagP&}v{hOG|qknPd` zX?;iK-Vcv6pTIv;ec0L;%89D{U!(S=a+)OG>?b?DgyXEM3w&*@KR)7#KN z!bSH#6yzzjCYeSL;L*SF(*2wv-x*Z2Q31{(}RC$bnFT~Q+ zH%^1i2XPbWExP#kR{j@>w-oS*mH!U-N+LaP9r+i;O{8~#FvY)KdTQf&;+-R&>eH81 zrbFke`){=xlx)$r4H0kc8fi@uwtgSdS|Z-Xw6t2Iv{bem#M>lZ(AI?QfNjJu^#|{B zKEMA^N3rkEek14l!vIhn;md2C;hA^w@hY-u2kR@Dw^WbHuVAox^bpn!Y~?A6|6wkc z8to)juf_7$h9^m9{j;6^nYZL4v=!HJ`xfI`AfK0rcZGPtcj*%}uC9UafWJkPSQ}T7 zMR(zoT4D=ya}wqT|B&wIC3gh#L9hKh5P+3{TK0{yeY`H`5xOGq--uVtnEY1<>q#7g=k)olobNUg{It$8{Qe{?R^fN~Us$)R@cG5(*DQg#d*QMB zvwV`&{dC=Is_vJWE04^b;ktgJv0&q8IAv2IYkVqPVE%Wx(|cKpZWr19oIU!&9yW-l zG>rCKcCn&*W6#rNqwD77Fc&NNWBVff8@?6!^`y@I(Tqz5cXl;0!;D)4OrN_7uY=!q zegNcM^QCoD_9*^57=j-l@~=Z`#WpC=vz@VNY4bj*9_@tkY%SbzuqhTg;X!SG00 zK8is;zPOis981Z^4m<`Q(&ar`!XuT(a|0e<+LyvZWz_gZ?2R{f`FmXXt-g^58wPv1 z6n$H_LH<)nS_h!sDX40W4LMxheD}UK*^r-lb5%w2kyr-vRr{1B@tTI${A0SjpSq8{ zzEhLVOL^Ud*UZm$dEYPD!Xy5d#lN}hhVFR}jdq%QA|egMWMbIpdv8c@m^5py-! zyVLuz`Jk#FPr+}c*ya6xN{XUSeg_;e~=|`;@6ozsop$XDS_^iWc z)$wujL7NBIu{Xh@cjg5)SZh_cNZfPK4g7YO_gP0*rk}9}>HLb(M>BU+51yzVzO{Pr zP<4N2T3!a>v;Ql!e|X;M+NawO71>4OwsD+DUx~keJO2K|=J!9o2hYEhuRNT)-EQZd z-gBpmr!pNUtxNCg3hkM~&M5sD)(f@(wh8uMynDT}o0uPeq~As5EdPRH^(dR6_Po(F zOdONT3*EmC`U^_0VuShGd}$tP!Ny{k%K9MKDAv4Eqf#B_%GUJzF2^ye}iit?S< zt0f9FJhDhunf2R2VkL_f94I)Eh-CKm0n!*Ejmi&FexXjC@F$PgVKKu>PRa+O>;ABG z-Ex&$t{3Jne35j9Kh)*jem(ihYH5j{guPliT+QFmpFiB??Ycac`5|7T9N39oQVz#* zCqU@FVOiyKWAGn_fBqxrF%|r{W_>$((VzLR)Gs}n%jTjoz=jnja#Z(pr??fFy|9@i zFO&Yod&p`_hCXgs1dhJ;Kg_T}WUHVCxC&EZABCy8yPDz%GHEOJG;Q&L*&`ucB`x zusX2i1l9z$l)&1-786(>*g^su2AfY{C&A_t*bLZg0$T)|Nnq!|&LpslVABa~8*D0p z?Sf4vu$sTa9+|-E!NwCDe$)@*&h4Rq$5L|*s-KV;|e+u>a4%vpx-VoWaOm1aA{7`?o5ND$K zz2;5_w`gx`UEV-AekJk}mw&}<8+-piut3C_!AEwtQF!hAd6)NVlBL)vb-1hvX%{|2 z_|STn_w)Q#I1BhV^gh$ZYtgR|K6Rb&4Z;_%6MmKO^;kGAkxU;V{m~f)b;3spFI*>lhVY^5gs%`jb)E1H!WXX-ewFa`>x9?-J>P$w@MglRK7XC> zC;Z@b!bb@&Tqk^n@S*F3uMj?Ujd0mRHwZsV_!FdO+!E@`iGCA|)!Ao7>O{P;nmN?$ z+717JJo;jne}=u;XVJg?`|`fZq8A7jT4wT+-#x@#`cjwYrb&hkf-Qno5w547zcH`{ zu*i4c`cuNj8rqiSE>f=b<#m}#3QlK|&3%hBE?w;M)_7MxVucQ01K$q0OW4epyS#VE zE*0rwX=Q{_`?1;om2NXOy;EggxP*OuqbocUCT;C4qeFD!M$%(Bwv3f5zG+*g*|cZj zH~H6H{(f|P@Z$UeU!T|dT4uPG*UoN(5^f#l)^2sU1HU!+orHhMI)zS8bX6#4mKK6* z|B?3lH(lPM;+mdF-Nf&@L9*%M&ysI3PZ)n)s~7rN=odt9?Zx(`Yr`O0(_CWsrL_`# zlDKvMrz_KNjky3E6COR?bM6 z*w=-F^lzlL875DuIPF?(>EPF~cWrk0ep6&*g1NZ#7L8x+g!K_t&%4@LA0g7W`@u)R zAK~(K7gN)6zl6*`TS4MFO;PiGei_a}+xxf9Hp6)QQ_`%mag;6q`#*}NLFQrw1jEVyI(5am;@ z(=+MAp})DjbDqd4jRDfQ@YOEwQDGXK+);LphLc6DGQ6jxahU4_QtHtoDO>TV4JcIAhf{os^a2+ClJk z@F(%EM_4P^2$-$o^IPqt2W%SbM|tvw_~ApzohG_-;P6jWv9#gGv3|)pC^z` zt~_+t+#uxB@EU;EN5qS|Dzi_}W_1x>!=dwdpWH)xbQj-rdUWj$`XOO0E-X3^?v9{!*%;kQyi3H}QatLSY>ZZZ*-Yy) z!Rip={jhdSmS#)!t+8Voek0%P3il93enuHKr~C3jGHQi*i^S6sYVaK74~7&>b$R|MK27VM4+Jb>HJ-=lWW3|-X~^h@#J zY38p0)&TY*0j94YFWeb!%!2I9;?dGmDL7Ma{d4LElhF1-dz)yjE;8D33xqEc z-V=o%Av~{xqWi$s2;U+6Hx+JuBC;(;Yc{Tr7c=-SsY}o};_B|P9E;B7##4Q7!~aDe z`cEg*`Q6W73s^gt-Pf3wrpcAIVC;Nb>bS=GENWCr|Mc(9o+FKc|LO|Q)>MC62I~iV zXgHomx=!@1&Nrc$K}AgO<@zq~-;lrm4KKa(sBP^Bs{;#sNO4)S{(ca=0o?W#@xAeW z&fQzSn1fz<>?LjsabLlEvR_zRkp9R9`jVAt8L!=elCU>DNO_!xS3kTSCtf@S{#L-o zz`iMf$Yu6w%AT?9C8QAdsYg?}t<)?Fxzeb-O#NPs%DD)30IUJ*9^RAVMpVvWn?kQm zsYcw~{o|oN{{@xpFg)ks8I-qJOBPLn&w}fSIKTaC$G$HU<_Vi4Y*luL%(vA^QJ^NW z*7?t#YyWna_iSgMn3Dgw)1$Lr-{TL9l&VwHEnV;5kvHFQ{ol@Q;MV5j z=Pm32VJn1Lf98B@&d#t6fXZ((VO8JlGX34p@2KThW!XbmBVq9~#0SAzz+Oza9>p62 zn@Pl*2Ac1!!Z|s6!z${*SFS}wDKv{)&&V&6MB-d zSD+pLUY8f`T|~Os{v3Y}y~8^+evCZr;}N zP39*R-Cjf3-Y9I>-qgJjco7rU+%Lp=pk-+M8HY!HZ?}IwL?lxfe+@cqfV16~?o=Cf-mOPx+|4!uWDO^C3Cc z3f(GnHov1TT{)UJs)qjm9slOTy6`tDlJMv__^7Q+!E0t;)K;W>%z>Q&yUe@f+?39b zIpv?ha033gG)47-TP+i}u-+OW*@8Y_+3oKsrd+}{T*pFD&{U(*-SV;jKe5k36ZGE( z_%wixfgKI=K{>j*eq+#32&?0-hq!aZeVyWx=7bKT;*iJRC{ znPzj+S)X`QHJ8tK*}%&rrny|FK4Ew6^!yj{CD-lW9cJGVohu}*iYy|Jj^xyb$BDa4 zTszyrbSCEC&dw6pc(_`jL6-{~+jhm45XDPrv0V=|2eiG3ZAh{=m~e ztMnfP{jSoldEn`{{153vzZSN?LU`T+ew?RnDwqx?YeKyJncwCZG-J?D-rVhd$c-P@ zoyQilKh7BB`W)Srf!06ChfBV|%e8g}V~jm1z1Q0RsMvdYiinUInKx{|8nu) zfPdfjcYB`>`KQf?oNc|;&NMEUbH})U=o>vJZbLX%r-Z1f&i6=eKk4N|5{2xEwu~5I6 zA>L+5Jd6m8q49W<;pd1~@q^v|x#^^PD%0U~Sy`SKP*8+A?GiO#Ep69W@Af-MfAPM< zekbVX^?pry&D5ld!OV_8bBv9d&sX18fY%JX>|Y1s&lPO>Ro}7y zyXX@?)b0H(?`C&IYh$=p1r&5aedW`AyJ8FR)`<6bCqGhcKhP%TxS7B91tQ8a86y*R zhFr;_O`DxdJ`4YuAC7dD`^taKpY(?O+j8u=EipHpFx_KU{C}j|TTjv7Gb{+ZGUArf z%lz;QNy1yYTJ!gqFV}bbb3=lhUWu;uD&qR)*Ar@Me)GWMb7_7H+Xkxw`&r)g2-^i~28*9% zQNv6vpTO$DiV3V4tS^RH`v)5Yd%4O}w(M2f3dd^kFUHnS^Ix~EIgAi*>Bpin5bY$` zBG^|nm!lMQU5BV-#2a{gM62&u1?vY3zC$|k2G|hTU%0$vzmL&V4BPnc zL@x8Y{3k=N=qvW@^J)%8JVjp%Rt5G?L4I!Y>7>asqhv`1X2cVHp12o&GNKpO3$_jx zdQHurA?I)PiglPcln7Cy|59mC9ohr!Y0AaCgRP4tt7A|$1hI13U)3LZzF}@j^h{5 zsvmpVecmdxwW?>6|A-B(>-%@A`n?wkfQ`~ktNpXRnxR{4<{MN7rF0+iB?n{0@f_1r zCjrp9^qs@doq2Nf?R8)$!REle?YFfW>1~vtTuw|^RGbCkjJ0%oAJ%xSzUA8E$E@i6 zvR)@nWoyJ+vSkZwKiECuZL)=NKDmy~(VivZ_mEmtiNLh|tQuDuE6D$$Ztt}rKeKV0 ztP1U#?=7bm?GUsZhr7K;JKDI-C4+!-BKDB(40W@ge+g`V3~K~i1*-#_ z4bwLpkIXOF`NK2^f~MF`ysOYmL6diN;e6cNq+cfXYU$v;Posli(xQgrI=*Yu`Ms2X zd$)gX2D~LBdchXKKBGJ(>O@sdF;OY)HV&U8Zt=L&H=^;6K6uLCTSv-ti4rwJPSq-p zbI|VZ=nl^q5Oxu)4(uUHn@89-*a0wY)zPEAu?yA!_M7U%q+2%sG9BLR+j;FUnK$q0 z@(C6G)(7_lR(yXAwz-n=_36kJDKghDJK9gShVN}IXUry{I~7ts^-^Kf!g`K$E!HO}g zmwau56~JynHH_7l_4l&5{xJG-N^P+<^KY`%qup#Qd4}7%Y;}}>D68`?==Sc0HS%-V zd>~M+RDb=1jiiJrpJRk=6BgWaxgTsA>=Kythu~@DWdVE>{E|TG(w#L({@q!F^vj98 zOodU(9FFxa7XA;;Mu;~Q00H*Zfv}eJTUL3msrtgVkm%zpo z*j2Ex7}iQ&s;ZD*U}t$x_7@!jhDu(CcI1oh!_pC=pMg9s!sAMeufA~r>~aiK-y8+o z1)ES><}+gDepI&ZVAMh;9*WklS!@Dob{58&2eohiLOW6A~9-H4sN15+H_L<1agj$BglM8|A6YKD( zd{MW*PK+MI;LjAnUo%n~JA~H~{#@Su`i*IQoW5rhiQdsb^65y##UQ>Ls638(Jc66LEicJ{&7|+3uDU$V{;5^&smz-zYNW3$|)3#PU z;+F@T1ABxaKGqAi7)wL(hQJoU9_Hd5mg>R<#^EXKv zn{P;yKeyTTenxD&pJ|DB6>oIwBIa*k@`AY$dc&LWtt{L_PsJ4&o{ju%5&sPF&+zWc zHT=&fbVhZcWx%;3x=f{xX!{>YV;bxBMjXwA86(@=+JirSH4~?gIA*V;-lw!5+xY`z zFrPU=#3~p|KkkPn7Y*bP>klt&0iQNlg zXQ##+SU8W_f`0#-yS-tTR@|S|>JGg*dETtrUG4YNexUn#wL2RRXqd8#vESXbH45&q z?MYyq=RKcOev8ocj6d-FPD9`HmS{~i?(bnW=Fhf{0I$S9?Gq&HEhO9res+=ZTtcBTWF3b9h-B?+<8oD zApG-eIdJ12@eWLsj)_BH4PbFuIu2H!z|MfxfyKv!1;;PI)Q--A)e`TN@?!0XuI6Mz zhD+*wea_F%HgU&@`*6kOkv!c68wHDx+cmY!AHaUZV)?#|^U3hv9YRq|;w|s_S%Lp1x%g{4DrkrEBdis6V$5 zV`(6730@}d7IA+_`7xP`Y&)&9u3Vq6x!|$txr|o2lCweoeBG-`?`_?tH^as3K~<01 z=dFP?g?#DLr?pSg@%8;l?n+2*PVr12OgP)&*$2OsQ`nZBJt#gl*__+Xrf_TA^sE12 zs3|uuoiKU60I#XHcZX-~-+jIFAI@bo>1i$>&W_q$URU5X{Elw#$MxaNy)-{neybkM z`~>`??)&5UjmFZz-;+glv?o_w;Y^6c>)7k*80w$N0)+pgEr@OtUl$H&0 ztxShz+|Kr=k54CZl2xnlYMkzlolQx-nLneB;G_bv|Z>{pbPxG)F*0w zkoABVCfQOCb^+`-@1<>%8F9!T3xUtw`c^MAJ25`uJp^_YEU-Nb8wacS<7v2JEyF#Id=rYV zebd1M=yShPI+th#YXS@GHTtF=utqTTcRiXj4T80ReMLZ&f5zcc6~TN@`uCxjzJLm$ zJAL9Rg!voP!D0n|>+t(G@q51c=5lT0!1;c?zQjL^ev>#e@1%_>4v+G78Eh5I_E+#* zbJ2<)qCcE*^-F&^rMoYz{m{mpd^;)&kYB&-0Dy=`{92(s39b2xJFEw68Z4M2NxvBc zn+1D3?|vH!+Guo#c>_Vy#G5DHOUmNm%I)$ZdzRY$S>kRJ_nhKdncCf-MU^R+`{?e^ z*38>VHykL>SD+jI)hK@|gUbKK_yG1JNf}?%@#VGbHZdtK4|SIdd0qSZOdi_dU*p@# zXtULOg6M2KQ9BqW?#QnrdlWbF7p2-KD&%l@Ip)8qy(;b1#fgej9BYacrdEO>4Px3E zf9K%WGt=#TNh+^{k9+MBG^JGQzJhllc{YwpUCz|@cG$0(oF@&%&&40Ud`|Bj@`{>ewFm0 ziHgW3eaO~rH;CIu+zRrbNBP?U>jl$PNssd9)lq(6f2VgVKlHr#xzU*B*+=j``XO`d zu;jQD+lrEpfd~Piwp)PLHoQzuB15A6n$L|?1L7&}C~>RalWy~f`-n=0%oDejxbgiM z!q0-Yr{EXCiwRt|lO6D0aO;DnyA@1d6R*l2VZNTA5ncyAlEAJ0!NnM?s zhiubVTxQA%M7%fPxBFY&vAw!4v$0osxI$RXTxlNkO;wLUp9GKVr*&Za!Q$<_2~6~& z(WC#{!K%Q-Uyrap$1fPigbjn$6EBXP1ZxDV5+RS`&43*Qi>JE?)&Le?>p185?KMiD z_99pv@q+J={M`mS0QPH&M@wdj8J7jw=a1%o(Mrart$8f^Deh$yKU+sYFkxorQWpT-FMw%{j`phw?33APEQ>enM|7HlJdErDH3V5?vk z64(aVdIH-4TT5VGJ>wx*kQd2>{b2gueWA>XYzK+8;iJ_{douH>x~8vZ_rvStdtF;| z-!%d@4HnEr)LtjSroftH5IFXbY-P3~bKb?DCv53`-QI2d)}yjn0jrwt_HH%A$JW7m z!S0A*TVTszJu&PGnD;xS@hTsOyaXGJ#XA7DlE50l_P^iB5aPD-mj`PE`-mDG;_z-9 z)&pBhLT}E#JLQa)e#j=_vG~DmPiLKKT)d8c-%;Jlc?Bs(DXdE8f>qjLVxO+cY=<;z zKNR(!gJ9l|@;zWLaCJSUya#j0XD_y?pRN2t+vnTX+s?P$ ztzRAEJ~=AES3Ft1(t($nZrhy?XQ5ex=EJJHo@?1Y-F$6s&xzD-%A#)no}kshhetA? zwgGwhN6w$X+H@oXqV;0Oo4a9d;;^6c`KI452jJ!Xakuvb|cbz-;H;X zOqKVF7J%Y1^oUk$N|2)*s#pRv!0sZvm*5@Qf`YQte2syh0@Or8eZqS@?f+B6b%TZK za6j1id2AFa*QckQ|C#w#>4~2{uL5+FtMC#Xk9hTiUHMG6_j6LjdeV4hznx7mQ~A$8 zxBJ;{?+-MvCCWb`Q#jW$`=m^2OcOBDa{D~yX~Nf zYC;e@fI#E(DrwAZbbH^FGG=9kUYvfu#xaiR%)Y52H5Dx{+IYYJC(s|autkMsZ~US> zN4E34_}!e&&*rMi-+=giz1wRJ^GEM5v&DyYpzOD8i_$gYf%ixA#Hb^;rK0+XcHj%=2~H%y9OP)7zgr|3v)1&0Iu%;NIHuaQ45` zv&-S*-`JDZI;_stNMq-_kq_B*Y*+G7k^fVDxGE zwvt;|PkFbmE%?G!?Y@t=8xJdbPYLUtxYz2J$eoMnA8uzL)H~#@&|iVx94zjgKKuE7Vo*BZtN%^H zXYolzuTS$I9$~X!SD)g_!eL8b^DRa1sOr;Ut6-N87ri;vi^Dd+#`49I`ST9gB-ke% zt=gLRGuUrW6uloVwZrrMaXY+|bHmw>T&s(UR{>s?T}7`e><8GA+#Mtxy4QjY+fHU; zkjp-FU#bv3WbJkaURBR5dZ(2~Yirm`<71|+orL@Au9XG?m@)J+5@jXcuhX1=zYNTm$*+E zzQ4|=>;$&S-^4a~wA40vT)J)}OSD*bLQ!@oC*64&zFW^NdhZP7s`Y6bPpluBe6X@P zf$w&2^(pnetAk&XG%ADHB&=p%=7 z*(dud56y)p7`B7s`l`==0oEh@t&-N(5o|E-wk0WMWIh0CKYx?(+Jx74 zco(m`xwR$e?@{?%zmqE}cGZ-RI4VnPieUuLy;j)nkjCiCie77Je>7Q7ex0w5*ngd_ zm+;QVu&O@Y_(bf%cND$PRq}&2?CLe@dy!tq-543$G+kbL9OC}#`+^yb$@)q7?!3C_ zIq~nyf3WQYwgh%5fvtjV#jpcpZ3Ao*tdn=iyon5(eDF}vt-Kmrt`c4~QViFqgjF#? zsRfJs1Jr@lg9Y~5I^s2fHG+MTciFHrIDVpKy@r3SuQvnt5@($_>I<@&M(1t}AaUJl z5-U}56X=T&%i9@fz1I}OGYOTq1+XfxpnNo@p9QM~dz{iBANazW48I6o2mbc3KcvY= z*B|=vFGv|WMHUlsi`kfJt@P!88Ei_&~c8oBuymzX82Tr|E6!|xLOY>sU0 zJd!gB9SSEYY)dJ9FI@kF*T(CLzQ1-fuK9G%X2jH)KH+{a9;z&_K-WK749^%+Synz7 zeF4nuRr#Jvtz^wnWav2O z&QQlkawB#S&GGX^EH@eP9wC0sxYNbq9o*471zrpO1L6#Ri!0}O@H%i!pY^CrSHKQ{ zNet_0;BVd0KUVp$GVQDGe>K_Q92}b3hy6EyE%mDC-$Ea_m$*H!s(&i!zqJ_dm2-Mr zV%*@UNt#SjW5avwkIM&>_MBwP7<_9dir&LqUB-R$tZ!)+#S&G?k#P8`{v>r;;?}{~ zB-yeKzm2#3f3&?1e4JTT|NmqryJVR#1c_hc*P_9#60lzl8YNbM9A(&tP(IlzEB`SfTC5RMvQL73fU!U!2l7f6fGE`YW)%XM*O`$ z=ef_HdFDwQ1n2ddcJjIBp8NmYbI(2Z-lDf(Wr}1=Vs0|IhwfUP`D&`<^Y@P%p3eMn zx_mC!19mlmwS!#;3-;vH4!vO4zis#eV~9%5r@(p>Ml9 zPgiBWNuE(>n6Bgckl&^&@M@hZhHo&R)?SAB0NxWwKypXd;=2iL7qs=|b(NN`-VNGJ znSwcwaHqPe5|8M0f|`!TYb#eU>;DJ2A*$d{g)bp2Zp?GsJ7VzZm-A0a?F4 z2i^-F9}5@2ieSN*)c9Bf>jG<3L_XrV0oD(elw;NH*oVObe-*`V06Pg5$Ts!YJz$ey zray6~`h7g+%Up0ob0NN{=5K-&E1USxD{+u4Q|WCkY=_@T_>Daf&4qD4BwSbM`O#fo zIMQ+iJ8}Wh;R*HmWq6EE7rj?$!if5OdOH>~yb_i&pb;4u4Z>;^#z%G326i=p6~V3~utBiP32Y2(J%LSuttGHIuuBQ-JlJXiy9l2S>2ohIF_Uv)sI{KW6pR(%eD zt2~CAJoewtRX)ZDQ~7t2kF(IK{%)3!73kC+$$VS^zZT$$e0ckjKRe9F9%wgrkdI#I zykD)%$1r$JfG6@XNmwmmJE@QJ(AGhFv-((vt|3T|`Be5_waazz#sH7yLw&lg19?VR z(9hLYyTL@ile`sO{F~)%47xo*9%6Z$25$-QSl*P61;Sc)n2$AR+n~K!KD-0S=ODdU zJ{rKg0z8%v)lmy!MZ)5BRB-e=siRRB|7Llcg|0uyLo9FS!Ak)i%bV(Gm9Rm=c9M@R zXosM^Sw40jWPS+Ji{+yYd@R5d`RFI?!Ss_xgfn*KDxl?13ZzBA;K1Rn2$5ip4&k_mY`b<(u?Ke68Lg}C-QNP zunRlP$F2hMe+T*KfNnKNFP4u1@U;Ms${hsyAtFf zmbXptjQ~&Nt^P3cMIvuaV4~ki-g;g9o8|2!belmQVtG3Q?wzTeH&t)v2&*P6UT+s1 z{Z8_B&Bec2-WocYkAgh7yh-0}2ConBSiKSC`@gvGXA4N^7rNGkC@2{FcxlP~bnzyM z*9Kqn=SsxWxne)w5pGeFEyLGQB=44qH%PowO7Epwd*U*47fTFo!sp^QE`ie`^k8m; z;0*&mvSc#{sG|)o_^FxR8BOUp%eRdH-2|YE%=7@qSox5~| z{`YH6x27JY0X2e;fp37njoz@M~OkfwlN?_IE#Yg>Q z4Qv2RdC*7LhT|8v?{R5~H=5vA4>pp(n!tv^o?_g5dwd(%4A`rL(Lj-YNR>E~(?L6# z==(2q-CewUn736;#-^B-W#?x&ho`BTu?jDLtFb6_P8AFeHpVSu}r}1 zsC5)wLJl0QgkOSo9NIe_ZTxO@*46G_*pua3E6^7B)*Z#(Mckt)>xo1k(dzvDv^|U4 zish))_W-=+-x{@x#?OfOgPDIR+2#Zlrc?jjF}2Y&;TH%GY*WI{f-NVoMX;p=wgR@8 zz%GNGPhi)<&LyxKHtiM?*e)>TKgf&vQZtzHZ)ax6zb-^q9t$b)2NLl`H{#+4JcXSC zn~S9*YzAyLfh~Z|B(P<$GYRYx*mMk2zORB!fhF_p9jlCA4;GKF{4{|nemvi8V3P@~ z2zDxg4T6m)uraWc32X{%EQTrHb6}%j$$T%S#9v9oSH3U1`0;#S2OEi{Bf6R*<2!-v z0vk$T&0vEGtOKkR!<6rSumP}mzT3e^T>NYN)|hub9IV&l_qZIy{b(|2h&Thpxe%tu+!ME>BSo|gT(*yZK+`(>EOD<9cS3P3J(GP* zbeYk>h9nue0$u-XJYVMb$oAX4zKlfh>fm}Cw42aQLHh(Z7pCmpHD{}3XpHaP>2!fF zCtG{yzi(%MKAcO__AzWOJ;dEvIz*HrC_DW7zu>j}j-q$3m|I)GD_%GFg0gGbM1k3i zhX7fxH|*3F%fzjIXVLa*%IBcy?3Uhj4E$yl=Q?p3iDP>mW%HJNZ2_n!d-28j+DdLW z9cR5toTM#-AYcBu@E;Jsr;hIcSSxV?%;Y~<2iT8_h~~j~#)EY@9kV!B_%z|YHwZsR z_}~q~R|y~8CR};CM))bhgFFeV?nU0kFy*5GY<3$y3U4KRVViLA>?eFF##7iZ*u@wo zKI34Qw&A1jIl`}O6E2?1gkO*G6m|*Bn~TaQK3BnN!M3aSnm+aewh0%{Cc^i`cnWI+ zYmH$_rwG=u4IhP%5Z=2@cnjgvgbxyK_g>J|r*sxEcxS-xo%DXL9SW2l;waul;!S;v z@suC$1o{E-n)RFh$Y^J~{aC*Fgx?<<3BRySxay#t@Jocp`%^F2__2H{1*ci$j^Umc%1n*c)-H;44MWQ|L~EX>A%y+1i?@B=?=oY_mc~vm7Dw6 zc(gCt0gvhT6}`U_Kl)3BF3tJS=h4~r$Nb>%%h?CS-aNXz-~Vi1RQmoI_%+Tu`-P1G zx|ZEXaBseWyIt8mH(SLLbp6oTT?X*DUw4|hdr-{I;rH{Gkxtx+w2Nzeep{=DSAit+LQpA6kR|*6$SU&Mc?b(Iq%+wNFm@?Yi>C&f$3_ zdCN$`sLp7Z@XSCze< zeip;#0?D?jJ#);+bBDar{g66yn!o1Ywfkbxdzjz;`aaMHo|P}C3;OziYRcCE z4(4=KzyI4L25S_eUWLyBe5#$jqT+6DyXS)II%_fyR2rUqJH?)R=+A%d_8O?YxW5+O z`|^LWdjR4Vlfaj6h`1}njq80U!Pa7!=BsJ2D`4B{edh?jzD>CL>nh>ZpD0h~3RqnX zQ#zYqyTH=Y87918ko7L%{}{?TY+U#2Ue5Tt=sXvza}bwnGQXI=T5}|St>#Yt-zz{T zGSVEMGrf-TZb#|Mp-IwPc&O;#!Jinnk=^~Ef947CRX8eLupi$nl&^F-Wak@I)+_M# z9(KM^;To3%B&Z1ruYRr{emlRTH878Nx$xbD*Af4R%fdVJ%{VS9eh1-=gqO!B94XsR z_#olUgx^?RRFsW-)3+^~$yo7ThW9CWpH<#=SZ_!2{Ws!mdWd-M`g!{2x6b=UZDQw4 zRA*!G-t(#S{-=ICLwFnEHT>46iSGhfE7(qS$~71NW;&(!Jk}fVOzM;k;9UV8(iHJH24a|S(U!mm!QGK7yQ_Z`tOV8?jxDpDCUh;E?>IwH!>#t4jH&V4 z4%+_!|CK6ySqb$)QHW9cW9tg(HUA~{&M-am8D_4Czx81K&uq0iL{X_~bmm^4pRXz) z{O{y{^t39KzkLY(`qR!&l(9u2?4c`_eSokA!pvyQ-=b<=Gm&4cI?BPXWBH3!`|_(?gn!O1R;UzphjL@EFTsEC zGpymt`I{W=)R{P&SC9B|t*Avtiqzy{51uV*#SETM|BmR9m=wHVcUY~H_T*oOe%4I* zjTDIlX(83smJ9zu)dOvJG~Z|*kE+{-7hwM-Zm@5py4nLa1NN7qxA~7dIH$BO4&Uh* zuX+(WM`EFKC_hPkO;cYpeCMhTvu|#SV6^tJzA**=hP7{h4Wj(7!D|X$LEq~K+W?yc z`%cSY$+N->S?|N!&X-b`@w!&OA9CUEEbj+4<`ex)_Y{99bqFGvC2P*ZtNC+9@0I-a zPUh=gjUufwuYk{h+Z)>a-Ol$i*jcbee*5}mw8vfwZ5fB{$sNQT3So!c-Hrmq?8PHQ zMB6>g{Py{x|5l@|M=7AKN4Zi&3sT!xvU455PYy~V$Us3o)!q>M6S2|Y---z)Pwgt8s!^EfVMd(lK+o#h^c>Olv z;#nkoH{rp&C2SC^F@cSN?Mh%%U=0au4ovCA`JD%=i(yTqaS^N*Y$tQ$br=6;bK|ZT z`}s-EjV<6RkMwitXCwEfWDEFWi~D?yjc#}fEZfXC)&)yEoP z!#m7J^-I_f-$6e1KsOeoM~@EtX*BaJ~0zMPq zv3ywnCv29mct6^5^l_|i1bZQL5>xt|;=3D6={06vw1H-n!|!3*F^DR>F|5_sGXLirg3Ur*qYKhxk>z+040 zYeNps@ZhFwehNQFc=g{pKP<|3H=&*GeO0ydD&e~czeVx+sJvIe8o?^Z8Bd^)hHp9d zZRd3_^W$gTJhhGOoE4WW3!&}Y^m?ULB>r{M`Yy$XxAO^uR(H9&bvaH5D&I+HuU;;C zf5PwN+{EcL-Gk43)D?RUZeOkh>3QOf|6S30ZP*_Z_M&)yEM;Dq*ZFshR-Aw5*6^Wy z`4Nu9^GEv0&m;c*pD$;;d@+4KA0iK}F8q)At-L$?U1Wnaz0P!aSz?O$!oGa*pcyOJ zcSx~r?&F+Xit48}Jxf~Nl}Hy8wg|RG{(^H?yTMk#Ho=0v6W!DO+@R*o7v(y1b@1Ec z+Su8ge80Q5Q1P@I6@Ms4D~G?~-^;gol>YanqW2f!S|U;RQMp+Mz9c_{HsfDCpnF+T zmKC^^G{SchzEfADabi8Ik(Ix%u9|Ic0h&o@9uejnn}oZo4#VKH^99as@5}ce&X;uI zD-RGiqNw#<3mwf7)2uf?wgwPG4dy`DyyXM0(GzSNP#?cIlINU9m60f`dIQ9k+_x_RZp@{;@{< zm47PlGaFzR!AurGQ{d~p68QvX?^vew<7g}$;yioSHzZ^_*DqJG=BqW+QbbX*A&m@3-fJb)Ms?z zHKUT*32WDRf)}8@2<=ZH4r6r~mCyRBvztt3vv*eIXR^=C&t(th=Xo9AT=qHn>1^ij zw;7h1-+}r7)W`ULpC||H$6WR}|L+CJK0^$TLc&g!F}zb`ENh7~m)#Gzk5mrk7YSU> zo*>Z1`rxav7iGIc{gqZB&%T_Ies#))+q=L~-$<0p^$mRKj$wZ}gf7+V>@fJpr;JIq zhI*XA=C~tdCs6Ip+8f^C+-**Mk_EN*a=+6p-QioY@ja=?25b3XCqA1^-&Z?m`&<3+ zTDY~_dxMi-ZhwON{lhn{r>kCuL7;#^-~|6u!BvuGaofQmdxtiTm`!(pye`6j{Sn>X zE2QWo>Z~HKt5w;73`*z$Q#7TFuA-%;_5*GFbilIVHO#NI-J$0#3!{G+=bFs(v^PZjW-oRNVQ3bi3FL;baj^4Xft^X%8L)FPtO0BuYyr&9E+8i+@YhBBn+^7Yqqnol7B&!u zU3UDFVM=Fj!_^wBHhd#7%`KxDG z$Qml0FLSR$JF){>mA&zGG+36uWPPuL1!pAYpH`eEER!Pj5z zPpl(Me`zNE4Dp8_)9t;C-{tEFRy^S{B6NTD6laAvi{C;V>3H7jnSZ{k+xu7j-gX?C z%;Qpv*W~-V@})zzhG6q?Fja(D85&_X0PlHtr`ZIRoaERzH0PmtOu3F3$^J;6);i+z zse^QH`W;Pbhs*FEeQdY)pc3TFcKnQeh9U1d2KVUl+jn2$;y}Ba$n?X;aq6eO+xv8w zKSp-^9=5oCIFfm5YKF3El8b=%m*){sQ#}-Shda{^8~^Bz?Hg-u(J} z6Q*-hP;HPYUO({`zQuTw1JlI2LcBD8CCQF+gjY9|%aaRWUIJSK+k#JA?reZ{D@fl{%`~ zndu7+zL~j@dvPENY_44)eiQZZB*o`GY@Mpo9DD`5J%KB|E%1Kumx!LWt(fDjKV~p; zm#wjMgu>P*Z4<0ViC<|~iTaw-AB1iix}^Q`B=`*Yla;>RM|anQ60Yh$GlVS>X7Z1` zmC1AbI>K>_YhobV)vs5HSN**=&XeT&CUmvXS)NR;`#y6`gw>zIK0uhwX^FJs=QfpI zJGAvTNl$e!1l_J6J+yl11j@%a`0fBt^BE^ zA|Ja6Yu{l$iqLlKARlAUbp`3g@-YqG8{mn2ED+Ye!+fkkJFtU%c&Cw2-1t?;~e<;08iv&g|NjP=3^7ur5)s>aT5J6NH3O; zR`8VoPvoPQu+<&rV;tH`JIKd8bn8KSv3x9pUkUJ7J~UUZ6Lyub_*`_&(Fa&7bk)E7 z2=6jXrU6N`A@bJSLuH;)N|2~;(9Lno8F}#(GyC^J6?4c zGHBwGS6ky2;6DrR{_pGdj+E|K>3a^1(-JzeSn@^ZqIcq%; z&L^h3mY{EVBl-jMX2)j^h}%AGzdF)O<&$|IX;+%1I&(6yGm9n`t8O3rBxx)@uG_z3 ziZ+!;x#pBJ;LG3#`R%WTSgWH2;se2Ta(ZdQ->X=H?kaQ*u6~?u%U;7oHJM@o71@7z z|LEr-5;EIurPq zzb@3Z>b)d#13*5=Z)p-!81hxU)ceQ&xV$hY0`v8`|fb9Sh&vFQ`5%d#veK z(uHT?*ZMQ*=_!1P@P5KO!u()B;^b|RpLN0~3IBRE1X24Yd@jt!aukbDwqJEtnIEgO z5-j%IM}FEV-_6@Ym&odF0Gt35eV>a6_4q(#G6lQSe3~?_@9p;Q<~Q97pMJN;@qE*E zZ5eO2((4|*o#R-|BH_A7_=MEe$b8GxG!z^F7at!^A4ph zhbFWVjBgdlSgrne5q@1A-TwU{)}PVA%|}I>SbitAbz}pV_F|kl>hi1yE=Gwr3lHTv zdizo4X8_h5Dqn%%J>8B(Hxj-D?c(8X|1D?kCGp?+KByVyi0maABaOcTKWOs&)~Cd`1?)0d(042B z@tBQLGx)OBp zdtR=B4aYFG-xk;y*k6mEjdey^&OQtwH~6iw*8#NG9)^p9iR;l5(JFNB(y%2G4N?f>X@ zBNd?Er$*shEOv)`YHEu~ur9DS^1HlkHKzTc$yK^xx7V0%hIE;DXNmVESIA`*~K_CaV7u zan2KGElexX$Na2y=;EVTHm&VuiQ9j?+xrW}Eo*lh|Gq3@Cc?b!v=kBgWn3ff7ID87 zonCcQ_iNZsdb_=LF-nv1RI0xgKis(FT`=2!jmk^^34MB-UkbPQ6vj0C>*a_)zjVQ?wXfSd?)K#34Vz6t5z@&fnSXJ*9>}sL%9%;B;Wl2ws9&r7pNH z*GBYNc+Eez+k25KfBbwWr3~sbX$rUXgXV#C;;;RDwBIHj;2PK^uw&UBv|#)o)`@#DP3 z$XHXk&J(}%!fx+rj;FATU{hc(iec+un_wmz!BwZ%z^=Tg+dHc|eccVy&OWWGJaNTu zek=B}mvnny;J0Mbjq?8CSoBWvu6{T|{OS?*>C`{&tj(3O{WZ0Z@XIwt*w9$F_fGNV zqx9y$u7mw|^Lv^2qxZ4~62qJ1_hL$Z8{fuy;5DqVHKt!%o2$!yrds(`S=tC|9cOP) zi;5nFVL+uqh4p2Jc8x4>G#Y`wx1%X`gs zs9oc@;Ww~H5;hsi9$R}ywwE&fC3A1807sE%hSwmxmVcw$`wxCs=vi`f^yffZXNpAm zogvQDY_}(oq>r!#u*n3r40bAkT>=}AVJ82;PJ;cQm{~vYFSi!o>RI%0!u(O~r_}(a z^wmxE5sy7!O8@Z!Oz%5x`xUD90%5a+JwsvC<M?dA1a{dW3W z0&4(UPhfk%)?%3Iq#f)M*b`O0Se+hsML*y3 zjy`CQCh#Rke~jN1{i;3aR=z%T71~|zh}N!U>-uB#LGq3+b1WA&hQC&8d?j;*w2V*Wmmdwv?c z3zkdp--Q3&;{SY&-=BXZ9kQD;*!iY)!VB+=@2?%R{;K?L5;jbj?alMI_|?7>c>>nL zZ-0!Gf_06_mOX^e5PrMDT_0E9?*KmsE*`?49p`-(W%+G?6Q>XQ6GMD__qof_25P0(2{2{lacOx8uu@olakK9n7`Et6`4y z=esFWsCyv)?(^SCW~CFpm1N6XwOM@a4$IQoBv&ouASqJDf3L;tf=We|p{MtF_D>&*Mmk@@Z91%2!g&luMneh{da z?-^)Tp;;0QS$=w5twmyi)9_s%E^AFvCZ|i)w_aP0^NH?`| zB<$VxcFfUqd#ID9e&1|=7v*_>H15@3d%>o`9;5v85jF%i3#Rd+kFb+q^I*XkYzCVK zI}c`SKHA>he^$_X_Au^ynP1B{c0Gvb`8X}PlCNnc&IRI>KF}RImx!PD6fT>rVR$cd z;+DhtYgL&k))*YSM7~jUL|wt&8T8(bKDN;9pKT+(_?x0pKQ{*NqFxgno%i_MD_#TS zqYGa1@Oo}}zm4iQ>L-WtE;J^66Zm*W#`UqPFI}bKu z2>a>$e+jJaL*3pvwX=<%Xx$XGbFgm8-k;vg`*S?p(OS8w!-9Jxc)DzV;+1(n6Ox1d zXVJILZNDxUBYc4H@AactS*E~-z=D2LB5V$96zpCnhbnAs_NJtrpVcKj+J~xKuV8b3 zUs_$mUu&Z3_t0NI((S$6rQvKu)_>>&6Rcb3YBKMo|HN0pn8lc}UY_Sje#Lc`<(h13dIQ+|(PQvC3%|Pa=v~$Pkr=lX>)>K$Aypt2 zLi-eylpKa4gHbNo*Z5xaw~uyvuiHskikS!DRk;R7vsJwe!)tS~+xy8-{v`APs~5A8 z9M*o!U!_k_=AW*5S%Tly-^Yg~g`d?+yq-&$f83^Cut%g!Ah=IYrv@C%4U%^2`_Olm zy1n;=Y1{fBt&I`X*`H1?3VmpaL@Il%?SUzsInufGv2O2gc9Kpp`@HmYcssi`y^{rY z#F}~Zi9g0Rq;}@L%KJ0Cc|MWVuC;{aKKTdg$Dv#=ga2V0uWiI>`jcq9N){KvTEMQB zk0oT_X}x=?vD9p}Q8sW6=A?5?5%=nYai1qfR@@%#Zzu$p$J<75k$4w~*Le3E*IylBF?@YJni$7YSb{ zT-`(;Ve4RP3G5o!r36;}e)Nq5)&RBw7RX}p+XE(k@pWQ5nD_;GRXz1Oejnkt*D1Y^ zcC`Je%r9`uz=PD+$Cd8_!Q;>l{&}~zC0dhh$3y?pXs!y^2+OowrF`MMP>JX(@M`!( zx7V05R!kn)o57A((H_97TyGrIskf97i9Bp3jph$f-cQDT6q#G?jWOBgeZ9Ri_sZa> z=}@@5^srkwqIfGX0kk?69+m5594Wy!3Z3mVvgqa>5~)0Lyc~kbTJ1*EWdP@TqR^&t1Ixcq=0C^9k;6%HXk5 zCYp|L?MWHHI3|AU2N{p>T5-JM{xOL;nH{E=**S}DJ7=NpRoU&h?FzhDF%3&Ts~+Y_ zZ;SMTdJwh*Rxkim#Ea)N!x%#07Yj{@Sgn2J&^UbnEYR@OkhbgNAi^!!z@Zb}&Tw z*d%O;upm$BSG6BTzXtnO%hy3XZ>?O`_k(T0OJ-Ajl+G~NW(-r_$HA_H{e+0PZ~Qsr zU9>acyAnJXz#72JJ_L>Emce#|1u}UL*d?$=uov@NbH$YIg>*Kz%(H_*v6qF0-xk&9 zs6Xi69rl?U=rY9&>!6gjz*wRD6ybH@vr%0%fenH!gV|fe(Rf9_#`lb*=s6}=L^}=b z6=2ye*5!0M|u7IZJUc*2%p|2T)cY;KSy|4zZ)U!0%5m{H=ho^r@$_Q z-76p(3kg|jV*y#h-eJo0w410a@M-vbw~a65JDPX7H`MKr7NNTiT|0EYxTExbKHq;d zU+Oa1)t{EMm7(xk*q7lsxg(yLpG{+A?GK*|@cBdWiOSH)amUO;SPJ?X!AsEguVd46 z{Wk9Zr}L3|bRaS(AJXICoG5o)NM~jitGMv5s+<4!Lhd!fv+lRCr~gfN_}0P%cWQCu z@`Wbc2v`o}**^INc#gv}c<-jnwu{rGEAhd&ZCA;wuY2cppT+j;^hUxj5UwiLM{!!fmci~9 zfXbtrlrg8gR=R=YXfNT-e~TSN;Wpl*JM8rWr_>|{{NZ?hx*(k*-VpJgQ0>Qy@11sr zwti>#o3768mL6X@E7<;L2^Q<{D}0eY>GZ)0I~s8(Zbi${{2nfR+1+NXQwFh2+Y5vc zqWe%FGOxvg>Z1L3uupuc+uFgG6@yfU?}MoD65(eEw>iaR6wIltOnbh@6tpXsv5L4hpnqGKwI~Z=-_S~xHC%F%uZJy(V7d@ z3onu~>jmy9*eT0g)$9(BW|FJ_UDgBe8xGSBd_y_g=!~_8xURzev^!!7#Hqd7?R~)I zp~6l>UAwz+@r^{DrdXB^do?ob7DMixN+T;nzsX$c^m#H{rf9X-ZWQ_gN=gymFn8Y z3hVCES+jR$@L+ah*LK|1FU~=~`=7eK&x+pGR<{0-?0H{Y@lrdkL%Rm8#+KiQOkbn3 zOSAX8&>`G1-A|*dTcke{XC@poh%{&SH`}v~88Wtm0n$dYCHQrGwcC3^mvt-#q5mK?Q{K_4NZ!LoQ5gcp<4W+>^Hmh zBD~tJ#d&pxHg8ui+wh`VLS7xF*H`~O@*G}?eMDOWMqO}Uj-KgP0mYP@ZzJB?w-`_J z;wbU15$}KVTb}~oNw6)j(hcQ@-8U;=pU!Q@obkE@ueyJY&h$EYNF|2vR5xoLD(epj z#8;NfLmLl`f57|)uRl^oX#mH|+RVLq-JFqwRNU!zU(o-;W;EHVa*n{S<=^mkNSWgz zd&eQ)Ppp*vy-aFB59Tz!m*6$_b$2$^<_Pn7rkp=VZ)JhTcVclAI0M9~ z+3fb7UJ-{Uj}Y^`pFlkl2YzJL(wQbsJ#luLj{4ID;xrSdM(Oa8yjufn1GBxDyHobi zm`(6SS2y8m!;|6(Z~3P4*LpVkAe(Ru z;xX=m$g55DY2>>IUG0Cla@%-3s(F=n0{pS0@w*O916HygS2t4`+{907?wzR4{$y1s z%~g*z%dCg1dc4Pn_89oNbN(im;`$qR2mN}w4c+!;_Q0F*ntV-kP^XuTh5%`^X zRFAhyjcGOs=7`h2Uj_Ai-z_`^cmJ(C((u3|v~P6f(J`Mq|Kyv0)@BhtvybcXUZVEG z;5i{f%9QxrSDig}t2`zj)M*Eu8~95B7if?aSpCnp`gM=L%sL346W9khK$i!u3^5?{1C?ebD7N!>C4Ej4x>D z`~yU9xPU(P^d9fM{1&eYpL1eP+{)cRWiqdzyMvk9Bf)qK{iAF?g`LVf2LG;Sl-I!& zSOF}4*Vr6bM~tpS-1A`VU{4OqNt?#Uq{*tVoDZcA@Vb|Uj4t7qv=Erc}_HpXw&jq4BSG85IzX|5;GTTyM$jOZ2qm>nkG81ep6@!%Pr zdunIB;6$S4A+_ZUw0rjVcpnMnPSlo({RR2zXqrfA%)Pl`cwK?lTt`oM)+}yUiN;=N zUp$lV=l#`Q{aZv!P7#or+O`QOkzVh|u^$}h@!C@IZt0oKbaouyXP{CDAIh;5N=ciQ za4TsnlE%V8#;Hrg&HJo_!*dIz%pdsOGp>beJYOg7_@O9n{2m%~hSR!}9o=xQqH|-k zDeLa=Qd@QW8U3;F?YEWs)-=4%AMWvH_^rMbKd%((Gp{k_BP^EkaFKYsIvM-h)j9j_ zq5WmND)Zsg$}O1hU;RbSCmreW4mn=&JA>r2`!59kn4rE8QN3Ow!8G=`l0n5 z^UWh=dT*s`9#cgU#Air)!6bZ#yQ8u?+r8GhFCYuPQMn^`Ec|^y`m)1Wqv#{Kx(c5w z@ToDxpX;xHT?TuSu-LsgTi}}sT=h}^3Dze)J^ucY$v*#1GZM$Swu^te?8S1W*A8tj zv_X2pdclebYzV9?hAEwsU5*CzC`EGIaJIQy+#lKm;C!re- z@(|1S9QbH}$MUUwED<(F*iQ0s721=~-Y6g9S+_#}-XYI6XeV#NQ}sIt-86L8Cb2ST zEj&)xnUpYseEXjZ|Jz3ZBy^f+F0r|*gN>T(`;j9lv&O+(_LJ4zg2^qQRb1Z5e$QN$ z$!_l<>-Qs>MYvb$OjvgcWUmWe{m<#~3as(`yxJPZ)*ew_-Mm*i zn#xLsUh$fN*T9`U-oJ&sqWM4K<;p#h{b|{W(lVy{zXGqilGF9OrOWtt_$eLlVeH9- zePO$FOqX)HL3`!{+azP>L%QI#cz2Jj!+d$ojvH2?63Gk^wn5k@lxEb9Y3ni$MrN?q zrYrz_Cy7*VInC=Uq|tv*kGJI7vceY7sTEo`J*3Q9x7ThNMSBY;RNAv0e!D(}K0Vmu z`zBex#mFOLpYAc(D?cIqIG96`){p%WLS#Ow-x54dJ-5eunw0&h+_p|jX~*A7-_q)^ z^P3Cs8hde1nLTG2Y&3>R23`Ui0W;rPWQkf^vTP#}U$ow;A78^O_=vUvd>9_V8b!2w zz=pug{{X%^EG60waHSXU5Z3SF$FX4-KaP!q4JP8A0V{z$8b11{56^=QfZ6*W))vE3 ztF4YN5T^9sf5Sc;jJwQlr}kk6UJLx{{sQ~wNKfou6!Z!6ad{2Xt#4Dsyc^8C#PIW1 zAYScDd%SJ|kWFM>ZoUSs{5eQik+5G1bq3Q>Y`u`JqdPj?3AI{tI;CUDzy_o0agMlW zUly&2R2S#L=D^Hv-s-~K0Ii-@9lh0EEKK8LgRmLmHHP_M?z}JCsdJZhK9}x|-aC=d zd-vur5tr$`C|}B3+h5WjULN%kVMVaP1U3j(0*l)r$G`?+n8wN!SU*@MY)4zyrOSw7 z=5se{$2EBEdPR@#(@i}@z7QE)oK(kX3NcUuv?Is-1QT;MRw`w+_uF&*|0b3JlOpTM?719gVyg+6no&jG6PrC;7^TMvj!}W}iJrRVkm@ zGJ~EKNMfmdIG25j1RhpFbmzDg;z%z0=?pGuUAU%oJJ+=A>#Lo!+Or)(R@LV&koU`P zq+jz}A7N`?TVO$-lWlbaY!j?gMAj#Qv5mi`KeUZU{ipGtdQ*>ArE!98IicwYBW&hD z8`3tvwL()n)#H8DjivjvA26kT+tbzTYuH^dnct@mpv{K;* zGz&Hl7MGXjz|Mj_Qf1&{m#~)F!76HO<=QN zpHO-EH1ll(>wh3FD=DeTN)~AiOb`q)yyZh#sWCo6oKwUxzXtkk#rl?BVlQ*Y_tV&$ z8z>)5Caag=)iB-T{h2ZZulTx6izb?wamEh)FIX0A%xUagC*C>Y1#hyY<$+_lWl92D z2A@rgXqjqk{^|H@TIkI^-n#1x750_*SSmH-Gl!bLR>3cTmxL$kHQxOJL&(>?+vF z1hxe>1|~g1AIXTi&!P{3{fK}v8Nt0KPDZF~tGDzBS+F6nc>SFN8w9g?0UC{|3t+0hm2lonTPryKmXU4F+2Uv{J4D^*SP#90 ze1v@&85y^&#`|(H^X0U~mikUVeAeM(@`8R5x0BEh0~^~le@uma$M(rp_8H<2zqQBK z^!#b{u>dxfz?Q*Ifd#TpX znA84Q7$$GlYz<5Z?CTwr4(R%W(ku{Xg*gA6G^Ha>5`W`2=o8!L8HdJ?B(mILegGGU zyF9z|{HlI8iL*`|$r623hT3(`-+;Yp`#fx0Zz@9<@tfY!<9*Ne@hQW55@qn^-Xw8r z-x;-|+F=%~0W7GKay#TI4xt$Hm~wnMf57DDDsiq8Cn%Tlbp_0u>+zm)!+fnK@^!%K zw()N`ANqgO^B{wR8AHQ7_;+{p66Z2;f;_0chrl*sSQFSuuuZVwZjMk#rIy~|&tJ@- zhwNU!d1zPOf$14t$&z3N=+c!)`jhfaT#s)vk1SG$|%^| zE%leN7oG3%-W2YyMe|8Ty^dsmV>@0rY>yqmUe&{bmvj{w|_L+AByW= zPChr=8Y`|lcjQniwW31q`g(>;Wp?iQ0{og6d%XV$>p9w=PUN>!l7E-hLX|z?KrXwb zH3!d_SM>yIj>lK=>zN?WjMf~|AzS|r{p*i=yr*k&j_NyFFWEfl=3Lfa)#+(k8Pv}v z;kWSdNEZ<{3pSs?&VijxU>CsVz|>s&D1U2UOJIXe=EcWGWOs6XZ@DV_)bvI)e-80$ z`g{7IADW2MJ*F7#KL6a|tcU^7pvD13(S zEy5)e6i!#LC8ENWpGCrJA42D@;g3Z9N9A*Sz;l`GmzAGNrQ39PrC0Ms);FJK?&5cp zAOCGhg*UnIGk$m-UYRJmujJp(+#aw3;k!N)-$Pj-9}_?59}vF- zTDwH_dhA)c1ra)OFOAkN%Evk4T_@f*)vhKxGrwk;;Lj4@Rl+Z=^>}xO?Vi{hFW2Aj zfM~5e;@_EL+bng2m`rTB!uV&9B75y#hAM$JYx`sn#bL`E% zDsb?CjoNt*zSq}#yxH=0wtg42v$IdnWwZa1E`|0na74ghr3O^!ckwAVfKsHL8=6^(2bh0|$_EeLO zgwxp-fgZr!1zY^h4DSD3$Z^0R+QP(U$l=O}+>Z0dspT1zT5o|wD(tfybjeF{c<96lCJ!q-I&Tc8B@65R$b85Z1i~l?tI8nZD*$v zYF0-s+d(ClEw+)0>g%)cTl`mSc>H#K{Y91>2fWlbmI!b7w;u0+^3_xBo9ouP#SE>G zu)}3aiR7gCmtax*kMO%5?V-p00&LAfN5DS%mqbS#g=?0>HZ!r3V5IpoQ>Uu2jK4EOYo}s|03NqKIS5s>|}gV9?vOVxg&Rv zJ;vzHQ1rvM9;4zie1E2Vj6`#rjpdN9WJTo=>CC+%-+wG$I;{K1M>yr{uT@9jefH}; z-cuzfOm0W=DVnPt?-6^fFO9cfet6CN2QoWl-CI%q5*M5gaXn9u-H*-~N|A5u#gD1{ zU&da&)#D9?d?P!w$%v@@x`c;SNJ{zf{7Ov&LlTNiE2eh3l+Ai!r_r20P1?QREY}0h zf)!(!)-;P?U0?(JRz1e=+Kl`V@NZPV3A^e6J3DZlxFf{1dj^Rc*T0DC+b;L}QITeT zpWerz_Cz1l7;OIv^9{WIcjz~2@-*rzw4U=j(OJ7}v+TWX|UiP zC8emGj$x8pO<*fvfxlH;)Xf1j3}bv8YUo-XA}4y@CTGjBu zOZK{XWzV-aE>lJXbFb=ZjxKEty2tFERA%H$b93ugSr2^oao-OWpCTkA_A%e5MrrjEzCrj?Lm6uMPUvl}joa{*Zzg<*@HWDq z&u?E(49-+WcPH??FQC6~qB@)<&KPkP6(<@eiS}}HWxMX!sO(-6tiwdV3a<@#y*2Dd z(YzatUuzF8$75SGl~?As?7ZbcJCJMxvob|qJRrUPYpjR9k9v0PU!e=iIq!?iF>woQ zXUeWAyc+q=!*6}paqkGfbv_`ttN)oSz#ar@=eq(;&Et-H-*9PG*qq5M`rGFdlcL$2 ziEitSx_@E+Mtj34Z5qKknUDKIRhRAmVqM z795PjgmQqE{EZB+RY~$J}`+AXd2AYn0pT6OEbLkW_e`4)eum`yJ z<;V6RvT1e>`9CvX0^OG%iO|eESxOt6>i6ycN_{=)cR>pegxyG;(;nhEK-1|VN z?0xG*dX_)-`H~K4SER&v}Kh|LG zO)0lFX|}s&;`^Kk0Q9doVtUY7comzEdq1J(HrawN3Z?1LQNc_2nZ_U5^;U9bwf86ybZ!Z^nPh?L#`qo!XXKuZ{Ci}c6 z)p|7@AMbc@|Dzt!2uUmSTdzCr{h;*T{XYHaY_|SZpTu|$K-2I`$GxMEhvuGuCgPcS zJUkEi5!xY{g1+!xbeY@ZJoj-aI>&-I6!gF&6nCy#`Kh~IaX;1ZaK}R(D=uGcL|cW& zsXssNy-7+-=H)@6Aro;}_Qc`u9$i~qQx;!Q>i$37zjEArh2#hy^`+fl#r5Of)AIbW z|4}*B4M&!Od}SY(kLSXV(@&g%uN?O#)t6G@3_Yqc&J=MLzkb~NAvJDFoLj!PJdVcM zGI8o3(;J?}xG&R{9B0#2x@Ee|5ktpv%Ey`P9JODk{^7Ns-~KqeC*Oc(;5)Y;qlf!@ z#4XT`?0{|nx|to&oq}%pCUi}ty#U?So6sriCBAFW)_zy-|LA$EwoUYt$M%N4C>lpa zuu-sAN>(95rZULZ;JnqlQOJEQ+}2#`Z{yHksPDCY#-ApK&VXG8J18FLmMOZ!c$IsV zHC&%^p2w^5jfcv|8a%eXyVv`oHksUbJ{=p+Z+}Ahc&_;d>zk+bdT&!BN8@>_CN`e; zKvOu_>wUEmnw0VU?#A-*JOF*e^Lo7x?_fL+r;O(gl9_|Y`8W1@>yP1&OjwX`@F5fi z8PaPuq?;e3AzdyMh^BhJ3ZLQGUhnBy{@~NjcMELhoxR>4`s3PUUTj>Kv3^OulC^lW z{|DpmL%rVS4tTszJQ6Z%1|Fy2vAWdj-7euA)_uH)FAa*A`J>ufYC0c%%d5r^VL!|N zt^D7?|0@3hhi7}Mw+nfEKIC-#(YLaFqrG2g8A`gcJ&tOaa3hBbf} zz?Q&l|G?&Gy*})Z#X-WB3HzTs`*@Kw_WWh9CpA+a<$WEj3G9)E`19N~u-#yPEcu=s zpAUr#X7k}ub2M%-J}*Ul#Y((e!I!`f3E_q~o1NWxjv3xT+lm3f6Di+;M|WI2YtO zap+a;uuK}~|GL*(bMv*zaS3evb5T1mT}uYD=BRjIh3(l4GiECrZ=Yg$^Ds0I(LO6Q z(8p=52W?HX`5dqy>Xn6676;%&p$pR-%C zQq2~$UsbtL#wB8@9nJS?8Tc>ei_6j286l|=unw>$wU^y5(5bScj!yArX<&cQ@jU4# ztSC5i4$+;4H7|?h0voe;?&T<9ZWp>+d4j0Ob3B;SE;} zZ9$uRncfQhkxAj@h|rlTsgQ3=pKscU+7F+$>%HFV<%pgt(<3%NAWbweFNnu1JjSwp z-UFKZZo=col$8XJS)yHr$MyO??>}W6P37_0usHv#DmJ;i26$7mO2zEbf6KN(&wq5l zEc3HWFIG#3Dln$2z`W|0V{&3Yw9Cx9;^$@WUIrLz~;ezTSRxwQN<_hhxqN!6UasL8)m)9-Z6s5)@ifQH3U2`i)odox;PKs z2(I~6A7K~4c7gq*A-=tH9jpNMh9?5r7?1oyD(a$;eZdpADRYVFP1zc6>e+q&qjUHa zX>8unS2kbIfn5i?Uvmg$DAT9^DAcEIzHWqM75d(RKK~vzWVQ2M%)Y(Kuh({Hu0wPA z&OYx)r5ISfq}c+kk7WPzw)Ay=Yjusc^1S~(4^s9De8=H){-u4P-=v$@6E;qFAJRzX zZp3Y+b&L&Y@mhh`#g~0&cs1No)xUVJtb+_^cH(1)6 z)6xE{%j-zyld1e!-HHDIysnN#{aO4+z^;JZ&u`x@g}xWRU(P>+b}@MZPZ2;<9j6YjnuqS7qSo4@TOVUYx;bj7G#a3>`X+`shV8)ukc%AreaM> zuQYpJ{GK7+vtmZ3FNdpCW@KMpjlpl0^a6cdwwo!i8L$bZ!Csczmt{r|@49Q|e#kPD zxv2q=H}PE|{#D|CRq^edC$FVo9ygVZLyC53B|!sxH=$iP+2{RqNX~ZoJR?lz5=y#rN0E_DfCL?VItvkApeElC!EX8 z*SfJ;ILXkE6|gz5vjVK|GS5!w?y}Q5_h)Z1 zWJVIHv(Kk?YtCx+=4xlp;bu9ymTnpH*Opz-HbMKRE}bcKR%m&2hkKsy z2WbMIV`mb_?1^Zl|xC&EDkFA^f(!p58|en$7$= zyq15dFSH?RkFJF*)aJ+!cyNzyyxqb#$!S0~m%{-q+0a3}Ys7nUsB=aAw?Yn$SNTd; zmz|A-58fc0V4Eu@p_zh5V7FI$ z%!18;eXr`lbQ!AM_pKYGH~FV8Z2#OD6ew{K(o4h}zppRcd){UrP|h*&!P}Y3{siSL z!)za~8J#*?!{!V}aU+4%p$l`>7s-$<5?>yZZT^1dW%!-_4)HrfmYOwI zex=X5-SzeKy4AHMAFLFQ9HIOLQ2H?Cp-)pjvR%-XB6=Gl?o_uwhxdkdLF3?|92;Lr znd`r8e35*uyt%K;&t@HL4UE;VeI(DWfn5UY6;jrY&kfr|14sJHu1D8+HNVg)kC?`5Y8-~dV<|=n*-ZN>CgQ;T}jYRpVsbjtN zYkl6=Tt4p0@cOr#Bf_^a7AlsPJiG{H^rZUb^}_OmGu#}0CpAZc0>I3SO%;9bvL(BR}=DYr9JNDUkzT#rz_A* zLvu{=tj+F$#9y$AZ}nryKjA@IiqinL1eSLGx}NY>!q*88^fw@{oo^BR68Pr?(7)aI zKnIN5ckFh0T2~!BE`ko3FZmgGjJ(CoqvSU{7u3i(<)HsO3yF|DozZ-80s6Wb^mt{) z>#P2|(8p%`!h0SVso0|Mv>;q^xy6NlliwOc6B#Cp zs*J9|VClX;$8ACSQP8RHx`Y0KP}#_bi8u3h>^X{OuaCUJc<$lPNy2L1(dYe~ll2o^ zr4P?P@L6@pp;kOi9!s7sLf`hzKCjQsY1_-8 z@%Fr{&-XR9IyPGZV><2^VskRLjAS#PNv+~Tc1CR!Ud`|BGkF4Q`+pLw4J?=|I1^<( z_=Ws?l!j3qEkH8~%{vr{JjDIRGaN;5^1*BYva_s1zX`qRh$iby4)F|1uhGiRB6(F^ zPyadF7dy{nZ+}q__!PN$N)@4g-wbUpv`6@@y*a(LqVZAyp91d_Zhhj}mj6)~K1BG+ z4Z8n>*va2U{8tIDpO5lq@(-*LY`Zws|EtC;CE_%I4c{P6E8z=? zI9*_iH;6M#_+}!`I9T;>rsqxLZjSH{!jFb?Ttc@-DROfhi?XWBR~UDdPC12~J^h;R;l6po+W6bo3z+{Vvi4+AMEqqr!bSlH&`3B59JHb!h%opnH+hqfL-3k~ zm-&VxHzgg9uv}2NG)5;0U)m;I?K4mKI^n_kNZ1nCRj{DF#b*`l3fMFG?aK%54Cf9E zj?Gy+Un9K!Ls1;@ss7)D#W3~r2C!PNKM&WmR?m3DxcM%=-fqu6IbEgT(NTB}!fW~* zI&-*oH@~tz@p`82rNtiN_S%kd(lYyubY=%~$MTz1{p?u&EdTF=GV>9BFx_%h_$F7n z0es3)^f|!S|46@h-s$lyyO{j(o;wuQef9S-z6ft2uYR3j&P9h5g=G0|!p8}Z&w0Yz zz!y{SUhr!PT=hH*-t;?B-D{2>2ipy1{la8G;1|rnKPPtvpqq!T4Z5#{++)FXl&&e&fzBy4`zQVcvnBeki7= zw-fI=@zhQ9Q8|0Tt|hP`u#E(E66|UWQ=LwOT>(?w$gcHsuHVjsZ-J9t`&j=6+XT}X z(nr`TSUf*XU{}DDpHUH69S3%Vm-2bVOsZj-%lS0 zyTgt1_?w7ktCZ2<5<)I+*JjPA^0pDT_4lH>Qa>t!wSaw4{nYB(-Yv5Cu3r^ulLw^F zJI%7w-XNJI-oo#v$3w0|$EguJf6tLabryuZ~#+~&qK zUM{c5*&mlvL)w&>EmR>tt}L5=nHQkF3T-goE3eC7 zSHPs3dC$o=jyQR_2EOZ|h*t7+1FQk8O|+35WN+lfc2G(>uF|RhLB>lguG*ssY!6tn z3}U4?1;V=s5BwOE-T+u3h-2xQeINZPvU#cwPC-|K?&Xg16jQ`9p`dz>#f=o&NR**=ZHQvs8>)}5C zy*`U$a|d-MQ>+sdhjV1uzoL0RF;(_{;xJ%D{1Sl^k{z`TsU*Gcd8ePpgfcNx0i z{xko)u{YiHsP@V!d>w$Ju?c4R2cf70ID zb?dhFY_+n3sj-=tx|^`cHtu@}mJh@8Q&LS!2sBg!P$0N9T1r6^|JoLYi|IXZkwFX9e~Ur8-lA*V4|-NbnKTV(fk^;$L_ zGQSI}$^pT-CzYcJud{!*<8u7!Hu?Q;m1Bjpo4(lR)ooXfxGq(+ySyvQfh1LbZg?W= zl`D}Bz)Zo|_0P9T-nF{${&0NT`q;*I#U5=j^By}{=RW|Reh&kkOmbryzSqCRIB|Sa z{7l-liB=~4?X8S5L`Qy&-(~o<{9~W@2Pyo*`Gw2I%Jy~Gr$e_XgHZX6U-Oe_->cub z{Efr!%9p=0`IDSmgsnTA6w&_}5**yo#U@Zyk5?Ffzy9(Boz_!5p6Ik8zaUq0&d9DU(0I_SDvpCulHZd^IZL7lou@EFS-V> zff%N8>;W4B`zI$`Ds(XBNpvvo+8eBZ}>NC3HbE|crx#rOH@WmH^w#+NcJA@nmsF)G1HK&JgxA1z)?8|M#;kkyBB7t! z8E9=*XLqOD3PL+Zp_%^i^*(&|`PjMxJErp!;{ec5%uVGGnxoDwRG-fBA|YFBEJb|v z2xFwmdj?)}@Ord(@!7?99&8ru#|1#`pZ`C~6XL#&_9Ed+gx4tCeZ=cB_<8U^UNwMS z2RjGWAv$wge+^uGnO*l}<|D$Mq&l{Aa2RAslVNk1MTFUrTA;bMiOo#$t?vbM0Hskg zk||tsf}b{T4iRV9H?Z@D_1zizY9#Ke>CRtk&z_O;N`JxzN1KFw$<_nyB)bT|+AVzB zU0-l>g!QGnLMh9!5mt(tmKb7Og#9J^ExWerW(ywu{~6Vpu(}^-d?c{lV8sO13f2Xt zY9F0cYvU;_|V0_#X%qhRe|fsD}qla8OpndU9-fisP1s>=AV#66+HAm!T$>VJavg|FEh0BjTN&s_d)FkZD+hA>Rgt2ttn@9)f)j@z9ZW?MK9 z-;r;|_YByBlYh}%`#pi+ERyCrbd%6M(e;tIZ7%lS1E&ZQ6@#&@46)mp{5EcGVgC6q zw^u?MC;4`OO@lpA6NbqW>gN6|^4-0SYimpAn_0~Kd#cXQ8(@9v^J#0~%)_Yx^3#%B zyg>Tx*%RJp_#KmFkqyD*Vz?)Xd~U5=7c58?Vd${hE_%FYHkXw|N zRW=e{al43n^_COf373zGv*_}9d0Dw$EmFy$N#fStdcwObL6mw<>28h|&DpW5Gc_D3 zsyyav{csgNXY(gaW{S7^<`uAWV8QFE!kOapyiF@oer6nX!K)u$ zvyVIBy)%?O*gxavJWN+Q%s@g+gwq?>Q!XYT##STz=Ha*T{U^Nt;dh;w#s+iPcz?u|8_VoqIG@b z%Wbj*U+GM?t9rXy_GMEEepi0@M0lQ{;(f8mwxS!6WNfUQ_1%8k0=)X45RD;?t7Wj> z7*+zi1Xcw5sjwZb4AxH)wh8u%YqF13N3U#2%zOv(Yc)snmuq_XpH1W%nDbG(txu(Y zKJi4TGppZsfwh9&B_hVN4W@X1-(4o`m-K6}0#(gv15TXZW^w@n0a$ zB5@`a$L8hWZgAGsQgWD#Wv5X4u0gx&Nlp$DBo7kJ$=ASlgMULjkb4zpY>@B0_V749 zJj@#zHY&>uAq72XOP^(m^M$`}UoHF$_F4G;$qnn=&4D;JzMe~*3MkfH?lC&MoxF1H zGdqsTJ`ex4|8pXIUn=q`zB8&W=%)Ezf_4PjKXhZSLhrCX=lXC7ohGI659RIxPs>nd z%4MSzz4;;r!{qLwt-I7$uaNfik3}-J0JaG>1=gsAfz5w5M$n(*{+zD8@GHZ; zGNm^BciB3g#`^oGPK4{~7FhO!4S@YJzr{cPHqGn9d8va-QXA;W=n#+<`A!q>0`cCf zcy>OVe8uG^O~M+Jy{9q_?GP8ul^qyoABul$+f|Wpy9X%hyt};{sjUYqB}_xvZHS87Ix&))S!( zp+wqez=~i`(^yK|tDp`-pTFs<>}|Z`T-j6o8u(O!Thb;Tar)M&TkfmAKWkIl0Bko& zW6x7hcpLnVwZHlCMKaROrR{n%EM<@!&b`=D#*i9cq^W=PKLh;={y*Tx;C*^SWJ+hD zPFElC&s??Z^rTub)FV6CM{I&51pGPVEWDn4AwEE`8mYcd z!mH-UiO{B~dYT5S2K(J|{$`ho_`7jgG_hRCAIUFX>+l-uI^n%NoRdvoHeQKwqXSDH z+b*vqcs1>3et+f(@At!e8LvpEvN}H!+&}Y1coi$kje5&&XG(<}wtc}V(r7A1^`SbN z1KXXz&Vw~3u!~^3z#c^$eI(=7!5YBwDS5W?+qsZ1&ysOyKL|5QMXSDgVm7aEMg zAl`(UrP=Z{8kzhU(CC!XC!3&K zf$lk?8}xnjg|~y(A1}w1en0pC_~S*-N7yjfSPWDAaj-LBMGuxPB?+@SHfFKy(A&jt7tzfC@p z7qy3IpKp_oiel{#uUUA})9qvJ4>ps)#=*`curpxO32Yv0DuFG5O~x>lVHNBY*c(Hc zXYx6cpC+g5-U^J0*{*c6J`XL!Ygd8s{j3w-l1e~-dO&w8R`~k6I|AA>znnH4)n^Cc z)82o=_g!a(!_V1unxkW!0(t0p+8o>0lxrk0oorDZ8TQtFZej&nQ;yfG5hlMcCvH^U>5v|Jy-6iqM_;|7klPxXRMH{-3$9E8E2@)%=ovQDUM| zVp5S&QQnzhX70?eyX-DIT$FY1?vl%{sHmuzsOaEG#;&MTXlR(In3R-M=x;1)aYbX5 zYWhh)j*k|ShkLbLQJsZj(hyQB5z|em^ zoo2$o!HW=(Em=lZM}M(>SqIC-ux+q*2UGjI3YG;cr_a@Q`25%FbCQ{ZPWqH1a|qf_ zXs;(z{dfktJap#Fi_?~tzzYE$YfBrX^_8i|0kr*P=+SU1{WZwX(W4D~IKUk}q{A&RFdoWG6^lRZ?D_Aes?E-jr_pXp&U)5`iXLDw38ia2M zKC_=zy!@2MIQR^BQ1`-Sz@{B62et?{1@@lMcaF_z@bSXf$l?(#RVBT0!!*p+i?f|;DEy{vdzM`}YHTL$BRz;fWGrX_vnbA*mJ4{+N zY3dL937fF=?wny3tihqHgKi0|9&AdCrk`qi7Xi_iWvZHiE|We>`ec~iP7q9cv(*F6 zreEzpoMZx3a{`?tv+7RX4<1wB;LP9XfByNzdeR$7uYM&lImx8IvJMZ$Sy3E&3`q6Z z0Zk(`!MB6$-bL;XaPF^SBWh8M}FF&O)gyj|o4I^B=1DyJoIZ;-yvvwnK# zHLwF{-zI=Ev3vV9k0UHu%Nz0Pr-+i;Mf(C|2k_*P^POQ|GQNPB)0g-H+00 z{VO3hNaTKmJPLPFf3G_4HHU3G%EQcYir2^qH++Pyfr&#AsFh}Zw z8k6>r)$o?m@k;qr=jk7$eU4|}r=d%_YXej!K|;F_fH5&P*8wTL;~w(H-gZ8`^TXbcYs!+vmx-H9JjMI(9)!`t-s^4j(sw9U{S*0$H7YlY5j+Zva5z_Z}5 zv}IVb_Dbn9?_}jw<1lsZSM7;(>Q8*-L+GTrN2BFMw8wXpwjs5zPSW}k()7*)r1g_l zPJf<;b^zML-gyPOp&&no55;;^&zs;Q;NK&so%eCqNX)qF`jmqef0aDVZ%<3_h8Hvc zduMricS1V^?O}QkLpK7QTURQ-N${}%ckGb#SRie@Og%QCohU;Oub25mke@9-=}`+l z6X1>>D%%#)W=Z?H(5In+xZh(lWgFZbT2Y|-4_C(caYS%PN|o^smJHndlvJ*+;e?!kYAE?yt?;FXV*wsn<58);RfO@(cYc)NRt zeALFy;v2m$aR|jQoAD1>y_3t$Y>1z)*^_uzroJ!q5k=Pu-9Z_21?U>yd)~Vho?>|qh4Q51ICLG* znLWqsNx!IT2+W@2?to5iv3bWOXbaHZB$@p5-fLjJF>DJg?_e62_rSWqg8fhL(i!MS z6@z@Fk`qr8I!B zr2C5jiBsR2M*a-)|4Bg1ewX+>ovHQ2zGd&<-a%I9Pn`FThy66NS1fDVcMg5smE^I& z-v4zUk!A9O+YKPPoS4kTs zE!ZDx?+c`#zdC3;{`v=W)6hLj_QdRuypK8jsdN{AR^5-k_S5IR=Z3b1GAh}3q$%FT z(!E%xbkB8s`_*Z4uSWs7V>5Qop83u_?b@DsVNR=)zh;s77|;IpiR0$ZplSHF;QM=( z!8P|d1p7u(lhl8yn|8uXk4u-1PoyjAkC^e~i7$QmM5Yki>7eqceSrS-Gyk>aQ9$k> za$9DJnc8x8{gRS)%|1aj?9vw?ATXEo!Z!Xz9-|*B&xU(_)DN_W+3-f_CZLPk@GSUL zfIBu^Hm#Sm=`!^ghjyk6Jr<#x3-WXPl{N5%0C)6|E!iP$k+d_{n(H#Jxp=d^%iq7V z4J#Pivts@B<{x4G=ws!TZ7;OT&>mK{W6-TY7cbix@U;MU-brPj{Lb0-sn$--ZN|LV`555I3w!f#?Y+TQSIm{4Yo z?hK4FQ*2@m88x3g?|=IRE!n?$9K&ty{80I=l3pPFiAw%R+AkT^&l$eKevRu7@UhL( z2-`-#+zDB+QB*%_>Zd(^ioG&nKZ?fD*qn-)Z^cWJ>*;t}vWAhh_3888pma8EDpu#l z4>4o1?lXHcHCx&z@pLu6T}77nYsAT(638M>R^o@-eI%S^{3j_^D$Sg7lJ9x+A?6pW zc27^VHpMJn`^^1jqTso0CMV^WY0T(=ul952y>F3iH+y$uV<`1-;byu=(Qd?(X~w>y zy}N|SmhI?dV%u}b-A1mt(V-`||aq^;X~ zU|z*(lv?)Uo6DBZrEzd!WE9rcKQuS~WbMO@fACYX<|jX=2`nGOvS3{?tP8Bu!BpS< zU>#r=BrSRee3bin2LRsTRGRCp>~lw&bC)3=-B;TW`x3Gyk@ds2oRh~;>l<{YKA&hV z2va3mi<5Yy_HGmDUH>xXL!YNDTx+gt`j*M-6laE>m)z$0xC62VkTv{;^WH#c=c4{& z#(pEq#-2JW-km~0px8j<$0U}KHM3scIJ5)pEVPG>L)8Psv!IKQLk-}I0Zvu9`**UW zEtRRq0JO_x=rIM|N|2v3#xH=c1-PS!%65&kb<%DM?TIPd*#1moPxO6==c;T=O@Lpv zM_*3++9_vBA(RVqQVf*MgU8!viPV zt_FgkW6}!zJMdQt;3w=d*mext1>1^Y2Vk2q ztmak3e_~hz*oK42=V%362fO_y{xI#u_#8?0#_U=6bY*JF57vn%c7Qv5U3%2Kn({1Dk2Yv`%h00_y1gJj$L5TH?+18Hk7?2l%G6^O zTJNiem&X<8s-TOPN9Aj1{{imkAz!ebw4(fJQy*CBtVr|dx4}Go zz3{1d=%;o$0G0<+JV(Ey{2K-912c6=**Q zKAL}yD(2~^%w~}@gdB?1{Pd1XV1r;&HiqJkDTpw4CKBLb2yqWr<X&Dr(MZ@43l<+wCF5)G-rwCQo-KpiqrBdOUv49r!#G9 z4S7v}8cGr9Il3#Y#nQ*q^j@8$Nq%&GC-QM) z?{$_*X2py2Vx^9lxgowEd9%oy`n&U9Q#j6d3BC~EPWh@|TqSLhG&L#x8u(ZB2A}?01VA6%4a?0;{LS>#^s{E@lwV-i#oG=x z3szski{Iw(4nU{(cX>y_rpn-*hi(EoSLaJ$s*l5T-hpm3mhV28+Jjl=D|+APyXz{e z`XBY%hnsH;nB*OnZ!dJiv3v)?)LsuOt7+)eKislf0P6=kOy|qcssFgVyH?&|`PRJA z@2~FrHh>k7ci8)OKqvd*=34;kDnsXS=wwe^-We~*-uxU=FrWWtl;u_H;*Smev@43o#q)$(lZ9JI60J{!K` zzR8%$+(dm-zSKH&^U%d@?GE^2fYa84_=VcH_a^4Uqy_J<{(KZn^e2>V`bP3T!8YhN zp)>Up`G#hF{qDdsM1*AaL%Rj-Vec>r-41l|cbEsi65!4|HzsMh#$lF{~BrN(}1&+l^rbupI}Jk1zzb4fg3`KQoH= zn{%mVOh3yAUh#t!i5iD{G7SdGWbY<$Mm>N+Gv@2c%#_&GW2MKZX(Ff(IX2!72q*FdP$ou zQ;%_IXUfoH5xTh`KSz%>@Pz=6>9IrFVwrl>ycK&;h90fZT?+EEdMMt}3BDTOjvgc# z|6$OkYY9a^^{+9o6?g*sEo|D#moKBAum!L+hfed;6)Vr&qeFi7UKsYP@Il{N6vH@j znlp&eNR*Ma58nZ@Ts^Aa#(dn7uRQC)u7bIGw19d4TC8slO!5LdD&Afz&&39(ZdpqO%zn9m(hM?Vs_OSLf1Klok@%FU@ zz8Bz5d8&PFkao39Jr1DVFGG)pi%1tHI%7G^*e}{l%Yopbj?A2jvgK0tpOg>qo1_4GWD2(Hd}@sm!Qi9 z`8j%A2JZ}TM-TO_J<|F}bNfu?IQ_%Ha?sU+^@5r2MMUvC{I24TSEWx?x7S@f-bC+a<~Qcu>UsryD!?5c`Po~fO_P>Sc+bf0 z*%%{d9p0cyES(vIcRV+}llfJ3xA)%Ajz+P)NM2ZOeD)$i8j(E{|3ucoQ@g#&V%;K} z9L+J$=8-s=K;ytoT^u5_afzQZd^HZZma z_moNB#vez1O}DqHjuZ8VD4relhqH=nK2LL&(pF>km<%Ce7U+)oI$CdhZL&Scr8|)|gshEk>Gs|d%8Iq4sP0c^X1})LRPxIP z$Nh{yyN1kz`tBlsb_;AD%=N4Hz^;P1{%qwVRO&N}>1x5^@|wWn^0HuYd0jDivN`=$ z-e;st)P5qHW7?0oi;4YCHGJ}BlTT-F*F4Doj{_v%;)S8R%!eKgb0?i4v$mj6@tsFZiyJT(II_zqq3;n+A2LJ_`?oy$=S@2w zWxW0N?(jZdd+!~#-rjr1xi8%wSac@Jo>vZTl$J#ucx`|?`N z6RD{8=(OoU`xVv)wgFFowSo;>`ETc0_Q0-TVuvqQ+OvbKU2)Z{yMzg;?A8*z^-Wec zM+epA25AjJnr%C(uU+sa@ZSl??(5j^PXGH~rLKVAQ47dxeGlW|^Sb?S)Wr6jmiUL+ zigzcE2gkWHGT3ZaeBoe@JZ8va`1##lCbU`6p03E>uzR`+seec`Q|$hgzPre3`|fV< z{l&6k_Sg6>oYks$x?&8at{vYq1}}|0oJ^}uJKl@F-`nk-+Rj2)SfdPSJnh|AP4W39AJgc|o`LW`p=x6WA`;yBsVF*7tqg-k&;H7g)A6!kS6z z2dn%3ZtpKeXWA^MKXhjWd$z0YNOL4yVJiOH;a@tTemw)vCOrQf^01c6K8DoC`JZ_m zpIZ8^LA&q+-Jbcz41WvT0?YqkxA$}6=coR$2X+=@6!{V{u>*bjmIw0mu36WXCGKxgj8$Y-*A35xGK=_?!l_|-@HDCq_ME|wGR zan*vi`t~HWOVB>c(q2g2XXL0qEReQF+8Ywuu;~wx-^5q*Du$E$TrRD0*hkjE3$4w> zPTWr}Dud@4P#5Y&b%wnY0`U1R~hOjYym6}cFrK!ApXAsHU;*WFzis#{v0)bWaH3s zUoG3m{E4Q%KV$BDJb<_HShx3CeZ<-HSL{p4nJ2Eg=aR){HkP%ZJNAu% zY(ZT9r|8e;m}5#WWV?4`z6`Y}a;{D}uDj_&71ib@;ah_5E#fofqWyM!9?9t&%_J>D zSKWcVu=dw~@9_n%OsKbbWc4mM5+H*5tGy(&|b3)=;K)J=yk8S_^6B8@om(mdd6r zkd`Cuxgp;}VcHsLy$NY*YdfS3l4j0U8kro|z})2Et|z_nee74bM!K?6+iQeo0UEbG zwt>w%SPr^QusN_@TQBZ?|F?!`4Z}U&zm(iZkEI)tHG{0&?dAD3YtVK;dzfFd2VEC* zu3w|Nta?A?7vQFhqB|NJNGp`7M<=v>W#};s-9V6^^;1+=li))E?&v|1i5o21^yk~T z<2CLwu=|JU&-6X|Kfzm$0TlJ%*UXqX zuKMmgd0ZlohxOiOKQ1vee?RU$PUo%IIbyb6duoeY@a%VYd%thr&Gpes#*5BWa=eC! zMFCljGuX4>^t!W&~B)`heN8UQ}s*tVUF#l%2)`S(mdsOBoW>Bne zX~>DD&lhJ}OA|O|bk^YP!$)S=F3p^~_Ji1i2g zTdI*7k6D+JWl3&^_A)Zf_u*ppLczJzFJmA$9_ibQv%0~sXduobV+a{5ecj$yc=m0M zITMX-xKPPKw~!ZuVV^tFy7a)8c`nUGE%y2LqPw;A&Kt;X|B>SI+5yXgx#h4A)&}O5 zSM@C8O^mJ{O!9(usXSW1Brm{v!E#`d_x;6vD`|eEFFHR#i%gnE4JBCz)zLii>t0%3 zd%O&7J+z0l#{=jZp^LZ2qaR{@C%~QdC_S1=NF3so;O;JE;I z^vIF6Oj-wN5Av)wRB|s8rK?ZZxOX6N3Z*2TAX$|^OZ!LGM-%K!f-U0)zt&P~LI;to zPGnu~@Akg~8Pn^O-JAV#f7oMG^@qJ&!WDpR$eKY`<3reMp8bAe#%9w`cs*TM6ph8l zH~?ACVv^rU%-NDH`1|4ipyj{D_aeCJu*fkmKD_F>?!(w$_=m)g+>0qXwz+?fUG>&3 zD4;KYKL>5y!`TgnKZoS|`(Q4jv&>UmAsP2)-)u@e?)$HWD{KH-=TuF~5po^`2{5m@h$lm>p?{ZV$S+9q9$%4{)ddN{?aE4$9PH4q9*ca6Q(ctAZ}B#}0T+ zfXDRkKFWNbv~psnP0-esp+^^V^+A4)JsSXT4Dgs96|lw^jUNpL}NC*6sa-ov)Rgp`<0n z=MS8te@|>mVdPC9FZTh@HoYNj&8>bnp$REiJ=a??%GsDL+gG9I! zUAEM(WQNZ{b$4d?cxLdS%<$>(j}()L1fK9rz$W@^T_moDZvL8B@NMB&L`!1Qn}3y` z#9w(wx3?kMsBaU8bM7tIS2>t@gnc_l+tcidT7`w!pdTOTMAjU#eoL~rnq`6*OK|TB zInz4yC3aRIbh5wlV#P!%#d47v1|nFiY=UhH8O`I}-iWOmyLMpaJt_Ms1E1QDiLOFF z`eWVR?gQ?rPg$Hue6* zmd5R|MA;K2`R(ZfY7Udf%#Z)~=CMT{jgK(@D}E2tm!fkq;d{I_@jYnt*Ln}xi0m&i z-+HvW=zH5;V1o{(`C&iU2$-=ik&U2EQ(BhwjT0vNV(<))_-5g2c-M{bW#QX|ZymnB z)VsU+HK(SW{MbJk8b)2m=j*{_NqN`(68_w~yUqT(#D2j!9oF-TVhrj}UGUAq_eops zu5E$bKcD>!MyaArK-jF87Rzcx)-19r-`j2OS90cy*j6{}?Vnp)hqe{k;c&b+_pv6O zThqSIe@(O?tQ3AYu_5?tGR>c2KKv8i=8g=N$%O9dwD&5#E;hICg?1QPO7Z^pPB4GaOYt1CNwjQHjq!p68&x3uJxKWXU@%0{;Ze#Ez9^BL(p|XcP~7C z8Dd0j8K(TJo{T;1CwUgyF=+Xet-agK#Mw+{g1MC|ez~U^XJsR@ze0cb z>2B|Co}K$!7#J^9a<$LHZip`Df5B(H4boxwM&Nsi_)I^F+5jrj0iv+^sWjij4P)y5 zn7s`D4E$Fu|GU%=OYWeyYa@l!M=3wV@@no%2RoY!@K^pS^)u7$-?MD?4%5cm?H2_MZYCy5)1$mG;B-6s4trz}?>}S5;oF681ilw2fBGUXz?#P0a$AhA zTeVDilCHn?)7VxAHXXy7!KPwZJJ@6l%Y#kCumP~~7&Zzv=3uhk)r)@Ge;?XLHS;n`?~MzjA3hF9WiVREEmJ}z}mqApG0|7ULqbE!)n3w{w`e;nBL#TvS51u08=~f0#kXK z`x0n>+A(C>zvYkPW8lg^j?aKge;4mS{t~#}{}XnMD;YbDKNFp6k*k>y5HXkMnD_rI z{qJYGy3~K_L2XpHu3pNK9)ODlYA8Zz^9Q!qD`46*S^Uz5j*WRdKtbi{C zxYMUeGVN#ErU(5Z2YwYy?;G4{<@)E0kj6jPjkraQ{Rzf1eT6cd0Q+&8?5|-DkY&ad z^1rA9T^DqpyjH3GyGfn9QceFIf@cq&pOun^2cc$NjXA1~=Ph zZ;G6u}XzVX3Z(=PeT?>mR9~STFV0Tc67@w;dc}vLKMxNR4TU34oMZzf@ zp)tSs%)Y5zc$z-Uda<1wmH36M=w7&)_b75}D29Lc^$PtOqJ^XA(7J-X`3UdT~k#_C^n9#Eyd&@%G@bTz8ox8_?>b|J&NnN;^ed~>w#4uLa zk$z2aV^U6LE;5O{KIEA_@61K4t-#H?SZVzuPD3)!RUL+=fjjp=m;{8#vEXDyj?S_dRKZZ?$U3D{>UN<|l@ zn!dgT-#B{oS{qejcd45cQNN<1B>sbESp+G_t#;A$Ioitt@g?a&Gq}KeJjrHouL&nC`GXV z9b}d4Wq3y5aecORuwe(2>}{|iuuq1v@04s4pHTJpy22?J$v*md+8aEs@81Y^#lc#k zYXjQ_d!3bC(!Ne-7AsQs76;^@Rh3P^dO@G(A(ZtRT2?_cYxujQ|7#de zH8Bgbr>|tsFW(x*duuJ-7>4(k=zizSKH5?8X#Z5V_ZQ@+c&J;3k-ht|SdTPE>|^$h z{)vbU2c78&`}dWnyiB~RaP_yY5nrDz|oyVg?3G;&&%|6){zGmU36 z&3F1nHk5NVjdXwQhU`=qoyc24UeI>rfA)bbg1v@k#mL;fdiEWgUqawAlfBIpAm3ps zGVY2{O7;SBb{*NWNh@GGV0THjIs0Y$Fox-kVQ<&>38cprXlsAD+k2U4udT<~Yv^Il z!%L5rFJh076TD+HSPrZWtVgoVm>K9{OPw*(+16#sY6PBscy#jPs1F+X8* zV1*dA4AvXN*1_^IY#XdAhFt~gbTIXWs^7vt1iMyztdaBq(t~%FUTt8~-^Dt?q`!;x zfk}TC8wQj90j4sX0F(YN;@K}lT9?`5uVK!2Vsq(xgL*aPwF1wWBS(5&1{-y-qhPyW zBVgYo*@(J}J}z2sy_Ekbn9DD^MlkUQ`U-0U8;)U}U_%bp3|$}CAXvHYC4HyinSm#+ z?;`k|BVT%~g3ZRTP0R1z61Gc)wq~*qsZh2OpC|BE7pv zTO=)r2?^^5TZmyJVDm9-5^N6aS(3|7ymMeHF>D!Z3#`ph`8utGRsE_R8!TER3P>L;w`%ZvwLrhY8e0G5qmtzaE7tOG0$=GwCYSQnV<_YQ$| zI+*PExRqzts*U}`Pw~(9OopAG$&`tILA$bS&)1qcf~hw=!)U+4-LVmq)w{Pd2YD=0 zpL?7&v2}*QCxWu6+`vA4y4(Ao=%Js=v=(dt>~91Z|23M|nmGa+j93$Sk)KT%9biSp zFULImb)T_k4J|eRmIHI+tfOFEF>DH~09K*A`N4T^d8dvLh3I1W`|kcRlA;mb{X1#6|K?5tPS7`MeRB@5mV+^8mCq2 z(c$62xzko}ub+Qg(&w|?-mAhG74k~f+BMJpb$_0V6sIL?ZV;dSo=JC=L~P9bDfhdK zkH6OK-5KUZpLFwLufzrRKV=!p<3j11)1?ZS*;bs?+#i(V-ImF3;Mcpof8g2gpXS}n z9G-f+sPA}QxOq6%J=v7=?&1li#(~Pq%)eHmm{?JK^ggPI{zAE)NOKX4^>&Q|E#54= zm!AZ$+RF&MyKfBV0|%c46G2tronn+*aBEShOK~g#jwj@ zoiS_|tRsdUfaPLX&HrXT7Q-6AvN5a`tSyFhfVIZ30$5878v<*NVdG#;F>D5`F@`OI zHN>!0u=*Ib304Q@wu38RwGO8C=6!{=DX>aC+n;PvEx7oq6_950^O`OntwjO&IS|M|9m)h$*{3DMS&-*WdjmNMJuqm*h zt;<*20hdzjuz`oVS5^Q5<}CG)F2 z43j=WdP8x0!0E7ijaUcQeRbK?zm|*_s*h#(2fh&bn$me4tRE~%XYpJieV%l;zPvxc z-v$fXi|CGm&4LAfn*5VSum!MZ^X!k~!TkPw;4_(a(h1#CERR00MF&&A8@BRH+@jZy z$t&+k@T<@UetJFF99aDqyZ!GQo4E#Sb8MCk*3Lz<22I;_Xw;{#K$C~Y#OqA_gMKzq zL98T3j9>3JV)=u1X6hd-uFss6_uYDDexh3j>m~0X z-mJ1&2g`$<5)rn*U5jDA@5P&p57uicIJB^kw(zg&kLXYEK3fhyh9bN}sX6t*uwaiD zFG@>~EPQ=WM03byur9CynA)5#3!nNz#qI95E>G)DZoj(B{A3)S5qKUF4|tgWb?$J= z`&T^}-+c}K1^A~!dlH+k8GkVK(==~)n<94rXkF8Vj+xWA#fV?#O@B;#{8IF;=KaBT zVptd0HdqjwS6k@^+X9QC9B{3d;(%j25NgfTqZTF6# z@%^?>&4agr2Y!mm{t{R#SYW$V&KqDYU==(EKjFLJP2lyxMG9cTy=~~fVr>}PHPnZ5 zz_s8V;QtkSMEa05iYyabHD!JH9+7EyCg3?C9Zi2QJlN_xR6mbl==hYQ`Q)HqL%GKu zZ-I0JzPTIZE5KLvr;PXT1!o1Wu`htxn}&zbdazok#d8;86F(aniXdi7jpQ*v9{Zc_ zJDE1etkaD<_sP@$!GpaRCF={C;&RbcY!aVh zvu_cUOEcpwLQbUB78?GH@!$`leE_a}d!|3jiTI*%^OW{B6d~!l^GZw7EpZ!Db2^2p+<+BOa1{UO__qYO<1ACi@$j4o4 zA|HR>lcEW%4u-)FeLNwy?@97o|D5)Tte~H%emcO$!OVC@-@SwS(YVwHJ_-IP&;I+- zeoEGYQ|usj0}!mALOu)c4!r+nd2QL7n23qbutF6t`?KlN73|cVe(8l#5;oDOzj!;; z$5yxZQ+hUi)B1JU6ro=mpb1SW4h4KF%U1ZV!1tgG5@nfuCg0e?(|o^MyQx~4;>3*M z>GTNfW5}xcQ^rdbrjbSYl$>w0d%0O>Bn*)d>0+-ET`@7C;d!gTp|PJe$f7yKN5Vm*JuMdtYr}kkkd4;JF--h%np>eBW2kwYzt-*gs>-Mrxto8% z9hu>KF(zN@y*f4bOVE+>9!AzYvKDr`y}u8~o>&=0u|Q24K7*{%vFB9!M-%gCPrt#( zX;JQ2MGwo8cf(id|9>5|U-ynZcKy`SY$%0OMce0&g++BNU5|`@WQ-u={XDCkY43zC zD3QOa_@DaJ1T_251U_9e*euvpu-_3MZNpuk#jFu9Raf;j&}3PC<}y69f5UjA`i%NH zoh!Uswb^(=Za+Vlu!Tm~)X3z7o#w1rH);7x#_N9#U-#?oVJw@!&m~LR5NW@A-S@HQJ_{+9B@*6;bC0I}kyZ5{QH(rG9Zd)b(Zf=R{VfUx77NW@oNkbW61NW^4@D@C$K*@&Tra8EY_rY zOx|X3HeK=jRA&0fJ(*d)b~(+rFDH-O&;QTy_e1vY6!#_i$DK}TSJ+c7-aK*BBbAR< zyennOzxuCfPhXP{*C^DN>cOspnS1qlS9h;i6lYFdENSfQG%1=^U@_lOJbs%tJSzF= zym$ZC1!Wntk&#`~z4A{>HspMa;SVwta_I=8Mo>WXF8LgMbKd(wJ6@HH{g|WFFZpi~ zwgF~G@p!;-U11j^ll^KSkB+~=-aj+%y`5*jpWI{O6xc#tK-#5FBR^pXy6m^+{k=c; zWoq6)LJoWad>s6Y9Qveo<(5UE;(f{8+4r+Hku~vc`Jy%0E0Q0>yeo|VV8ObS`r%Qq z(HPbUHWI_yz=mU3C)f~}x`uv|*9SHj!-l~IV%P*&KbX7rI-4MGDM8*^g1jv&FPI-m zmp!n)SiY722m1gP(5a8tg7t#EKC~IMOLu=3qpR7o?b;05i|q(u6VgJ7^6f|7L}R{a zt$74&+`;54PJ)ernKoqln^{L<^XNpSiD8(yAOmNSuXxV**6Z+Y!t2KOw!tog1!Y=C z9#_G(!2+M}LMruk(@;rkkf;Et&kpI|4Qg=C-{_upzLZE<`s6HVEdnsb#Q%7~MKpzk{hyZiDrKnYaVvLUiYC zw;3mJKa4I_e^)B64$PG&U7Eop&(*ITOy%Wbd9dCXHUO57VWVJOF>DH~GltEBb;Phs zV7VB!0oESFcEGYRY#*#GhE?w|UjcK=xgM+~hP8k-$FLk&6PR0gf;E7d zc)h6)+PB%~zy!rkH_oO{omZ*05;4c`B{lwRmqueNk=V zD)Q=|mk<4!i>aV}_Y}2>y1z$%=z@9`Z!=f}SUu0O@lktb;fS|g6qiO8EEXCLB=LB-canvMsq)nS)Yi#~g|X6;^yZ)?`66j1mxmaLi1A=Zh8Ai?k3dF1qdSKfQ3 zL6|S{{{gUJu-_0C?QJ)HSUCTFZ>I4yyHrj&yHwN$=HadW?!0$QlY{GzjqHFrQt?L` z9Fs1=fnD#uFL^J_hie?ds{fJoL9oC^$yU~b9R)Mz9jPtNTRQvv1*jb9S<)Lwe+AFd z%Z)i3|H$7bbKI|hu%z0#<-Vxsl>Y>>a>xqqo00rkur9Et+BT3JbF}_-HiZ|P>;z?z zbp=_q$MRwP!=1;OTPXawZ7!`XF}y22^lb{9`m9pkMgl?fNjB=x(YEd ztQ<5W(0tnw0Mibr>yj8x#S!Z}h7EzKk9ogw_yw^*do|ejBXWd z7R(*vH^CObqIP>fL;T6~Nju){lYS{CyZZlPZ(_3R!FFO;3)o%^%Yhw$1#MTl_JURA zim^ekqcLm@tR9S_Fuz9rI}KI`_EsUZv&crL7`QuZ{MYxVSD_t+HrTuSD&A2tw!r7X zk4uKJ!Q26KQR{sdD(^Rg4Yrpg>00&A?C*m1nWE()6zp=0cM5DHMmG;8{oFh*fvv@`4X{-(SHB&w6|i7mVm+Mpz+P!RU-M;_+|0Ej9FKOJ>4kI^=LKIFBRM#suomgcufV}B5QJE-@ zQLrhnM~eH6u@%OCn(>AxQ<1ggjDnv@*pHM+4tX2MyL=X#VCA`UedL)KuXx?j@U+e& z7OCvdq3ZsH`Z`x!=FMQ2V^}-b23Sz$imT?q*1;a&*>8IoQoBY){&wI$VRv&!?Qjyl z%8p1@8|-sn9$0XO#T}EKIXD5yqC!$Nn)&7q{DbhnSh_HF>Ew{)9)K@{KjXS(Z;Y}# z%A5UlL-4o#EA@G6-up#0%4j@?Hd;?leJWPir_y)D3Y*Bq%dJ^-0&NwINBm$#j*SpE zU96m_ctk^BGyj&zcl(aKzgCJpj_!uL*DqNN^BHIDt^uB1c>1%Yt}4y@2S^_#-CY9}J_bGs z{zjfXE>uzl$$rg%?}MwX{XS}L7-!i=Lyx|d;txTRu?B6&U5r1XMa2Eq25y7*ft$KF z<2B}wWge}N9%FBVcGR3^;I4)@%k4<_5JpXlbn>cE0NChQVeZ4BG6 z@?5$du$ma%K3H`OtNwS!s~A=fRvE)uz&tQ_-$D*d@?3l0n;>t{%5%$a3{3AEv?aaU zG??BuC{tkzV2xnGyQ$t+z#6~;pB2dT`Ay4j@?ot|=RI!~U z8QwY@r_>kp%p5==Yk&PWb&FTolQ;8ohnF^bp^{<3vYvFOfyTbH!dDGnV6&99>`|wc zXT}@rYe?^Y@DAu*do}`=cd$)E?r|W>$^M1oJ6LHcgAE!`*wmmGnvjieVKIcQlZ+^t9NRvxW(H!FqZ2+c+-jLZy&zjwS2ChNPNYf31I%D>~A+k$BsBwCyLz09N!d?^$%TZW6K&VZ}CQ6ly~m! zH~tgtM62$#?BK+h-5MD))nzX{`|w;0^`XC)%!yx-X=TOwL?(AU(|J6TKb|R^%=B~J zE2^hfGBe385mtf7IV}i#J4m zuea~u?hVim0IWD+l5<7hVUZor!*>b3pAO%h@^sIG(5x=p{BWj~R@{-vaUW$uRh%fP z3g7=lw%409t`PdGu{Tl9v- zZCyU@C^Dvy@m)Oo_9vPrG113!QN#k5mVXP-&O<9dMzq!jM?QcVzwR*2`&=e>!Y|X} z*4+T>Rpcxp=h>2D<`2d<#W6l(HV?`-6x=YY) zmO-}z-F6vt)m686yNA$eylH`M54s0cezAHtaa_fvPx?b4wFw1&7kdd*ri1V{+;jc1 zS02;QH9_}e^0*9d;gCF}%K>!#WzaR;a*H>32%U89fNmJNZl14IF85I^w-)Uv@z;*W z;hi}o59z!J-CP-To6s$kLFau9{=^}48tWRNy98Y@=aDXLU~6UY_CdD+otF6Z6YntC z)*-y2n}u$t47xSwt{g(A_t=B(Ds=99RHm_~FS&l36mJuBRnP_RAuJ1a6fBS@tP89@ zM%NG46r&pfYmL!Og0;u!=D<2*bjx79F}iiI{utdh*iek_D%fa@uB!SLZz4ul2R0p} zYX+N((Y1pu#^~~3mtu4SU~3MY{P9t+%V00$*|-13cQyVeeZ~5p#rJIVL%Iy#7JQ$! ze6F7u`E=*3pZIFy>|D>MJI2jB2{Sz7S2aBK7O(lGufp9)o)qk=(=Oy~An*IFJa@manZq(Zu$Q6JS(-I`6Yy=`AfNi%Dtz1U zxqWaG>j>nC>W84VWvh5v(po*9O)Yqw54~iP80eWn*;1U>y#f ze4z=jJeWDlPCeMW#qq^2RQ^cN6`<2QFGD-v@C#c98;<3(4K@~|y9zcLqpPZ6{E1<8 zVDk>IbZiD&0xL(yUTD`Ge(5*}cG<~C?PUyX8|F*f83A#bimX9 zVBR|?9_OCLKJeKDd<1+GT=QkEOTChLm)>OxyuLs0ZP_u=9dDyJMnx-QZPCk|(FXmZ z(8Vbef7?Oc;zPvECC|+FC_i)0T}p?E*!94S?_~OwJX3o-vuUpYY2E)|e*19V>nd+- zes^MYfn5!ha6;H2m)4wNlsv{>miOLg_jkBsrJYM_zJMd=P-}$@1zXh;iu&SH+ zBlcc=*>vJ2{0jSxA$=&QqJjpJu&pDPu6W;(%=nR$IBaLw8GW4nLbpM0%C6?=_+w+V zd+Y1DzEDZo4XQ6BR4oS))Q)?RHUAFQwr$U z$_3=@{#f2W-x{@J;uga}D>ip1UWTsboq6xGl||*0w4eNJX5~og1DUlW z>`9{_HjlJ(nL!?~1MDPN4(v2oduEq^dq;*z>$db~Nz0Me16J{LZMb5BIw{EncoinQD^veK z5=b5@^9}N8e^=i7iJO9VKdUo0<~s{#)kaV;x-&=H?h=$XE9ZVYtp7&hQ&V~W4st{m z_}2n93-+xV^kVHWY9rQP?yT5VGdx>TGH24PRwrcMo>uI5nmh((Sl6@Vm9Y0B%Wbq= zN*MV>9diAP48`g68)JxGP4f4VU-yCk9{F|1&;L)x59FWcSvHrx&L%6rf6GP-w5zO!D{naT{#W0L0Ett=75WbpPJVVdSkN?~jnJHdG?dAFu67 zY^XEaYiRwhIM}oNTSH#&NAlhmdDgn2Yil^epe1)+hWmf~Yaw|)&Pfp6ab-S2W^7+| z9rgtoyOI%W*Je(QPPXq5wKms%mUeh7xa@ZxSrZ?P{6hH@17PD|U6OC?7o}{*VVxrL zhu-6S#@Rj^IkWIAIdU|PEP*Y8mE*&0TmHj*xT<4p}uHW50_XlZwy4@y&VG_+$l8 z&kQ7ZLD8SIzz_I;Q@|v*rz<{88;?GfecGHIsQMP{!OunYr8=wwt93B>9L-=y!OZ=G z_-s0ZEZQ7+8@R@A{WL%81#1O6C%}|}@g0hM+(M@HTqa9205tS!Ay*mBz@LMErr1U# zjbrVM;e4SlVJx=oaTi%LpNQU1?dSk(8mydl)c6da|FCw{3EdnruJvc?&v5z8cAC(Q;#laH_Fgs1iH;2 zKSz%#@a+J1^iZE$ByA@lO**cVwoBSOd6s=K_jBLl?{#AC#KIVxok&u9-G{bgp?E#I z`kBo494rT2Jy;*uJv{q%nl@arj;DddHOi-Sk2j-8XtzzC1IQXi);CBNzZU+Df{lUQ zDZum*{FR9cbKg6?;(~nIzF6;&{>$(!!1qk?@e{TVwg#qm)KAzp*s6myfn5b#0ehW@ z80GBQ1bn0mm8shUJHi!+>zvVnq~Tk!KR=)MzAwS=j{F^aKD&_GpdXf=Jw9gK9Yzo$ zfUbjhEM4&%a*(dES6_3aIr885rD)HFYyV!#$U#+O*iLHX@E`SF{LK5qy92LVCRf3> z9jp=Bs%H^T1}n!Fv_LEV!}?h-bi2^SZNU)uUVuC8TY5~AcC}1BE^W&}`5XnSaWKhf1glPvp)sM|(wlEb(U0|2G0E-)uZ8C(p7j$p2&Vk1 z4dUO~J!bhI5@y;XBSFdc0NDsedsG=MLEnjtKNdZGW+G+wb@P$93zeLVvyI?PTD05H zRxXuSuhq|HeFxgZ>a_*B8tB}5?I5oX@LKR!7SFqA?T=KJ^b_W%I!Kz(?wQ@&@eg^e z%XzQO&L6LH#{v_hS0@V7gj)5ti>#*4B)5Ue=MX<6EocKOw^}gKm(w5GE&pNVHUM2~ zpo3%Y$H21z?zB(&iL<1&lNNpZnsZip=qx`0kRxCz3{v>^i}X}?OhLNHSdgk zXC0p6n+6Fs68HR96KnCLY0C@bG5*U^K18%zdmU8=%V@ECbSFCc3OQ(?hTRu z84ob#w4YG}8U2rbWxT}{Q*bv3iEQ=b)<*oHU(1JgJPGRnn+9|Hb^&Y(EU|CF<| zcP(wXGqzr=Jg4!zBab?K-(@P(^`D5Mz9I(s^XL`iHGD4bea^~Dh?8`t#$a{ZFw(vXC%rOkyX+^j``z&6?EQ1< z{!68+#Ka79$e2V%!xtDstPC4}jO?9hug2Fpohc}upJ3vMS*ZPNAuIRA=-iL`!yZ^W z*leg{l0PdQiRw0=DDGuA(cEehM_EH)r)V<~0tz(rc-aH3_bD{7|KPWxy{Yz&dFnR2 z)0tImziJ(;gOi9EqDlE?$Ui^2fUJ3By$`v*uS{WMUIZYgm47YIW4#AiPezYHcvlb6Luaa7Jx*Rjk4wm^ zed5XKu@CPEyraC2UzYU4;<7BOUNp~d|4!zw$ofeu%N>{0lKKcYP?f$JI9dELUzO(= z{54;Ca__MM?-0Bnw0S4ht34DDHi=W$D9`HWV{f0N9yxfMzWo1Ro+^(iWEGJ0WZKsT zysPjAb&*sa<+iW7X4==rlhY#)?+CpA6?)7eYvW1ku?=s_Z~xcm(ez#TU&y-AdeOMj z5APLtzftYfj2$|Wlabea@IZ6A+V936f!}<4RWkS~uV(Pe z;L=?`y<0oj23VtjI}~@(Et3Ab6-e75tsH-40@__@5A#=+pxc8k?ysza?+3Uk<7h9y zE@=m(1$s-@1500yZjImL^B<;LCv=s+TdG?>cy)j~x~creNUKRmYanfww4 zXdC9fjOe}z)ytZdf0O9=HSuo?tP0+j3W&#fICg~^G%T$H_;pp?g1-R$E94uH7@n(a z);g_iDEJn}|ATho@{Pr0q~{=fbMU$KFa|aYR!%)ETK>c8VH3IqWX9Xb9{5s#JM|#l zs=t@`X-v0zFwvKzTZiR8Ot&HERstQIdGG}IT7Wycsg2B&ww{otdR`@MgS6N2TvE@m zcwRdsSD~-}J?2F6ncaG>PyIIa?4QnL0s4OspRj8&rxd-j&vKPb8)$n0`;)#B#V*~r z9Dbs0U#E-Waw_K`_&VXM=2<^s<6s>QmIIps%Yl7PMA${^3$tit=l;>$O<&Mup)J7| zW{ps?c9FG?tam5))v>iLVk!FiaYAIq`qeGpNBRAJ@!U5DRtM&OKfM>M5iEF5_2)sb z2C(PoolMyW{W-diNcMLcx+ds?ej;*})1u`M@J6szFzHiH8{M<~hqck#RzLrE|7iwq zAuoeFZB)8-kk(3ChG+d`CkmE+OMn^MaKp^GYqy2GK5Q-8&?LTT__mOBBYe_f1HQ38 zC_bOO12*em>NERbm%u*EbEsD^e^p!O-7t>Yrfc+R{C>vMKaBhcyS{4fl3?LUod)tV zT7lPwBH7in`fUNeIrz-^mRmJ8-Y1i5#?2AZ)=2w)>0r_xU?0e1rk?)W-^ZJSIGT0v2Qw-wox8Jq$9u|hO7g8_Q!Ea8FUC^9PTb>MW%@0t& zTai4yLjzbd*qg$PdkU~U`koKlr|vW|+_|rY)F-}V zzPx+$#hWH7AE|g$uO-_%h}^!vAx?M`f1rFg#+vU?0pN?VWcv|{j*{jNt~UIl?69AN z1@h}@897^fk{ z_Sw{3WS>plVV^5*p-2(}s2oV1NVMGM&I*kKd*stz(c|AM6SWZ&UorVaV~VD(r;!E{ zYa>MH3&?8wA?5?f`Y9E-k!50wk*p}@ORPrm`O;;vlj(~0Yv)wy@)x%_BX*WNR&VL? z?zU_H?ixU>T*#y1-;>LQ5DhV~giK7ibdpci4`UCjd%TbGeE7Sh@|pfqnZfQ%|1lk` zOc1Q*(~Hd7r}l(*MVR&v)&kZP_c7~J7s57=x(w#Fv7Ju8A$XK-{3LrBIUV2B6ONC< z*1>XM9U|ga$G>f`F|bPl=tJy7TEyI))}hssA;Cxc~C~N6FN*+7p5sc@;rogtr_C>@`?=cUy{>|5Zk2TTNNXf5iuJ_K3CN%wCwS(@dQYa~R|=SN-$&L6vfOg7KF0by7^|h`r*f|c8v;wx zSAJTS^rO%03FqEoR2}BQ>%djy`Ux8Vs|5?}v-n3XziEqDd_@IBJ8k(#tpH&QVB_B! z|!do_k$QYr+gXd%zIBlciG`pxy*rWgC+T#E2Ql>^m^CJV0&PC_Q$*^o{~4Vgd^J| z>0P}O_)pLVu@m$DVBWJLOgc1zRfB!2c#NGWgfiMmt0ygZU(x5mn!w&A`qONZ<@RIc zsk9-|W=Z>XrTI4Lvr25?&q>nS8+!cv157!Y`2pczd6~XTV0JqAkCI^Q-5PuY@cp6y z#v&W{gU_DDz9ZADIB4PO>M;7xdfZ$6l>!%K@7W8E1Xob|YuuycGxlvgUXL<1dPjYl)d#cxh5d_- zEbfQ#+v9kUMK1ztGym3+HI1wjk`j0BmtDoMj7c2*s^lrnX^^#WZyQyz1z%vbx{D^p4F>5%y+k?fgVfxVy ze2egzIm!)`$(fQe87{e!Ok+g*Y5MbbSbJmY5Wo2D$fos?zDT-TUc+DuU_p7wXPE$- z2U`-M@h7=6)?KSM{-p7NxmP|_@ku#*r85|9`7qxk-9ldN^LxTOtlhQ55?{A7HJr(x z%M>~?`D2+*J_?oKte#G@D45_JFiUPE&yF19b90aP4xT-B+u1oBHi&&?P9R(Jl3{2k zpzRVZ?`mU5G(pY-_^q2cv~f>O`62K*a36N-?eQ(-V*XAzpuyNGidAr?Zm`{2RWJL zx4Tj3wxC;s?nAQSradLiPwafSpl{GdbqggNyiL2VQBG)OxpeBynf}hq;5jo1s5o~d z)6Wh4xyF?WAAR_K^cm(*R_)@m1S+RIG6u3e{(V`oJ$>O`rIT(?@%!{7 ze5>%e{d^8=#liGm%V3wl%vj&!?>SW8*Z{u@{s7NzW943z~ z@@P{YMo;{b3p%IN8@AB`Nwd&hh3+GwJ5(3$Xp=6Sm3DRMxQ;HW|H|9g?{>V$|2BG5 zSH9i$!_wBQ`Daa9pr3^PH?2-~4-dNAJzC~Fi#qQkix&EXCYCA|wbfx{)SZaxS>wk9 zSS^_G7fc_C{Py^{;bqJJYzZ{wXZ+-%JA6$0hpqvc@i_KAcvFDGe<9_s6{>EI-cG!e zv{5Vj0(;QvIi06FGj)xEwvp#ZYlChay3dIYecdx2#vhSge#$uB2`gdV6vxiD6WETp^Fm z+j_k1uen|x*1y<3Qn8;bjqe2&j&K}M-?nMzh$5GgrV7k(Oucq?avr-Us#n!@A6RD$ z8wTqDbH8^w0hW(pvtWHOYzb@-?3DcQaqV zL7qN%>R)nW?=uZg?+x;-!!vz@Jl=WYZ8yl%0#D7oH}*dL@N~fQ)?yoSN2Wgb@&u0A zan3*5IE{SB8F=R5G4sjDA25C>u`KI*o-Vq3QMU0id|sh=eAor6j$sF2wK1%w8+#eU z8o-)kSSwhYgUOHU0Ly`WD167@+cw11ZIFg3%WdHwr=s`G!ZQK?@{{COmU{OMWHj7Y zJpS&0)jQY-bo*d+V0#t(fsb!v1ChVsu3d3frC+{4>GIX-YtGCDgE(I&)4`%o&6z#4 z!+Gp!Uyt{H?Yz*96;#X<*r*Lw)L-Qnmpo8>BfaAiyqymgkB4huy$+@^XbY?#%&f1Q zu_38G7`Ob;pqXpc^bqgA0UpiO+Tj_6M{QPP?1dD*Kc7U=X+x#=kv?0L&IW_3PLr;& zcZ~EE(#;+Lvo?RnV;X#wHcQ%0LYm(15@}WaJ^sF*qOp%9k8_#k{)Dk_51y_Y;8A%u zya@f_spnZgVXa^b4kmp%z?N@7w#sW1p2~;He+O8MFS86^2YhvM@{PZIRSQ{u<;QUUVu>%m*V|CDFn$B*`$2QkO{ zV{t;Z$v;wjGlPE~dH`9Q$okL`UzU6J0a^BbUjJSj;`BumC)t+;_;YVzE!gruqS%(Z zXWQI*@*Fx(ER+jxFaNH<-#^OSIQ0K%`)-*(M=$GV@9gpK7dP#Z7{`T*JT`uvP7H#LXD*_58HTpw$9ufz>0Q`2;@mGpRKX8u zw?Fo{;%ICzNIe2SdsWOB;rqYvw@vhT&xhUX&eW()u7l;l^sJxibsMY;jP4Zvw~ z?T5>|)jsyc|EZ|`$ktZhi@y$L_F?0RFzXM$+1W_i71G>xBsp2|9q@Xd^%K?wwimO-E4n;ai%_6t5WPsv_sI2LOWhUtJQmJ zC#Yxj-&tsPppEZCUk1MdUN0H^RPO6w`!Q@Atnyci>8^s+fPI7E^y6_=_hJ9R%sQlL zdnTU5JW?O-^Cz~dgJ$Tupz9K^Uq7ss`1?te-bwn@b==do$u)6gA2XYR5mY_hSrG4MijCtG0nfgqRf4>?Z%yGwDZ285TZZqc%Kjn{^p~-CLg9k;YNp(V1Tl(1a z7w+g&`^-K-eO|J$kra+J+bUHidGMys_L%z&WXw#02vCt6${(^>bLkI8d-}ZZ(b&UJ?H~tsa8UA33U>qUwt-yD=x6ga7bTNF!ZfVTaIUk>t-5Big4QHUz zVIRKrd-{s(XZ1_5|1qo{Y{$V0@V0>Mfz>F_nC}!@SLVwOW?z2k_C}oKH|om|agR#! z`8Q1-GcW1$eurnL|M+VX@A6B8DdFk#D@@_==-crP_}cI7i|;Ft9p}J|Z^zX?_o17B z?qn$6^f@CxT%RJXmwycpvVIHg$1QF0_h$kd%3k&aNAX%8nUF4H$oC3;{~Vh|Qq@DW2l(C>`nJ(H8R=l_c;kppJSPm4r_5biUC7#gdDQ34`-5$P znfv@`Whosi$1yMH{Yl$+MW6RV#bQi0ieVLgU3^<~p zpJ-`2t<=(%T53_LqMhBH-JRVf2}v+wLXuHu*@;1&DA7@gqKhl)Btb<*#fp_GZTTuz zYH3Sb+Rzjgl~%N9X+=fFmQS%#r54-odC$EwbMHHM*coEx_hWbFdH z@m==8-$_Y~@Uy3?%J)oSaX30bA4l!K3ipm`>P; z_)}~G)}z=gEUDNMEUnl&Y*4Ws*ob1*os17)G#}<8ajA!mx>yv}49mh^A!XFPFTPdY zo$j>HoGTy`RlCuR)v!ZQX0Ya|O6jBf@v;1hr1c}GoEPl_VUJ$0m)!MC-|cr%PD}W& z^0wCtuyMs!VN)(9^=k_@3;Q77rF<2IE4>W4=h=TEYm)+~KA4#H)r^1p=}%vswBNZ) zbIM~F*Mp^WF(EE36F5j<8Quu{fGKtLidzUb_E)y4t zbHhs*zrOD9I5(pgMQ;GT_c~(%_cMU9>yoB{vU9E`fo?y#+d~gu8IUkm31jZ{N$bD( zZl_@(pE-jgdj*mLb)PASgq794j!(M@loBpgRO@B6=^xSW6hwUiV3EOuu8OJ4Hp*JQibCweI z-d#S}QXzqwVH~lxADhEQ#$4mrHDZ_B&wTipiy^X4U66Oc`m`1%5BKpui2v6UmTnXC z`(#;-@U)5S$R1}P?u#co`E&OddnH}4h4dr_aF4J0>gSEf6Mr5d26Bk+#le% z3jcMUSU7PDl&!ur7iwWU_Z)6yfc71~ZzT+Ge#v;+ZY8(_Yu99ZdEcx@ z^kBDwomsyz<(W3pxmV$o=dJ*cG|13G;@(iv{Bo$u zoUdOzDBxhpCrhFg_mT4cMhWMDaJKJFS`Cs1CY*EmG-C^$b5^)B<|mwKycLH-gZXXW zU})j(b~|}D_s{N6S|NVRN6JJ7HUZ16K?=*lrd>?R{v>P;_6ok+&+P_Yz)h3~M1KKU z!>BW-;&+6P?9o^g>sRX~{$aauj>$D$-_gCgA)#CAO zXUXxUC2j1Cg#UK;nC#AQ1CJVTj2<(R>r9&{dTZ!K-f_5|#Q6Zd6na9Rx^b?-X-dL>vXA-5Hj-j`E8NE1q3+T1KFKNB8oHnOR)`Ml> zqB?r#e7x#G#={dy>z;?`D@we&@iqJYr2PyUX;5@_0P*V&kv_#b#jDzvaD-MOeLynf?zJfyp@AuJ^e)mv_(e0eW%tbX{-7tl@R6 z7a^-;&vPd>;}zNrVY61D%^Ws$&p2Pvp66|BIxDnk9HP8dXw!wwQiV3d*jUf3?0V+0 z>8Q|V2b)ZVHj&p;{wuWU#%8xdn-OeUIx0(p1#D6k+U#O8RiRDO8(9CT(545Q#%EP_ zJy~peDzsU|W~@S+J#1Dhv}wM`eCFBZUyroUz1YODaksl^Shr%su!Lgcuztm6U>O&a z^}|Kju#16AAF>Y5!XpCsNPKo+?!24$o;}zM7HH4lc-2vu!+1rdfs}D zfWrKa{U(gP_|2@?tix8nk@gWiiF58FX%>OU;1LH3YlC$u7KimJ)(cC)a_K1XNy7$U zm)mDFj@}GuC_{Ou(k`^fu|9~KYMi(I07l%W?#ZzC6;C!JsJN#`_r z^~a0Tc?4by&pi*;O4t*y2H1P~?#(-S2sL+??Vj8+lqut@*bKY;OMY#^h7{X}4Juaq zChC`B5!irYZLqY9Nj;3i`dv(-EMX_$Nf#G3081z~0_%n4u3z*fU@66BVGS42rHNzGZ>wqmQ)&*NrED76GECbt7EDPILY!Vha;k~vw zSRE`v8p%h}Y8lq3*aocG#iTs%!rEY$8yhyfnfyS{Z*16xERC#^v0)0EnF?(tu-UHA zW)+*JSo!@_D`^sX3+1swn|5p_DzxdxX1zk2No?v*R(3sW*mPBBQ~g%zONBNa*eq9Q zlg1`=sH=^Vn ztK`QOXLzYaZeSsPn(t?PgH3LHD69jvu2>grO|c|wRj~|gMX@Yw*~MgBF$r68F_5{g zdH8~hOMF&f^Dfo`+l0-*URcEs?h=@H;sw%X(e;eI=*rnDG7LUr-bYBCzunh zgU&KKxp9u<ci`M#uVD;oe>L}U_ONNa=Dh2Ez5TqMj1TJG#{3M~ zQyqU7<=iv&>O3z$inZr7?dbKR_w>Bp-DbWcKP4}EkS`!VCF#ybSU+t4+Vl3ABm9;b)bqSTq0QLrT4rm&0l6!KltZ64MMJI{C5{ta$+I%g_z7fH&gJ8tnB z?mWBi&|^BlU+5i-=kWCpjxT3jxp0oFcU}3Iy%wzYhVfn#c=63nS5fymxQ{Dw*uz(%@4WR4zRO2g^*b5=!MY8xStD#6mTU9n zK2j@e4HlL%Y|ceA_YDfqofhK3c~(51<&*cvYXXygdoE6xXG}g94|lnrmlhv5;jC7gYY>|uDbUxZHQ0`@+s9UPI?rudf8shZn- z<0OYyNm_Qli}H16p`DAsQm_u#EBS8cae#Wnjs$xPj@k2-MQ0qH4@+Cf`FZa9JL+1@ z!P~#*7dbh7?K7Vx5l1~wolCrS@W1`i^VXvz4t#`J?`FIQ%jL1Kdf29mN!!&7+kpMI z*m&D63aZm~vEhvGxvg`?e*(Ly^m((!B&M>SH2|B1>3f#-$VQRPAv0@6^jVyD%xQj_g#8$fpz-9mZHU0Y$TRIXtH zy?yj@*CuQhwg=1A7rCw_n05Dg>$!Zl%k66jH&$~KA&Siw@+fk*pM6+|Vzm>LSH&W* zHpSXtt%}8AEiTqVxV^Au*yCjkoZIgq-8v5}pWq=)IZy4ZJqI!I%%b1$ib9@ATR919 zg6X!h71@ILN0#NgtBlCrt&;mYcCi`8M%VE;E^6OT|AQ>IhpWW?j<=d!pd2khBPyMk z42kpovTXL~#a9o$CSG~o`lQ6IFkUIuCd+fT#rvMl`Hvl?T+ZXaHgi7z9PP!xi_AR5 zy_ZDdv58&`y@w+nQhuYqLwk$=FG?PBoh9~q&{dxcN1Zg2_bj^8EVuDP{Egx-_UiN2 zmnhP9x|#8n+51^|4$B$OY=(kw2>1?Bj7ur|oA_J1c;2&*WDm9r`xE4@ykVB-ey@-@ zJ4E)q`JYM3`#Pn+j(&jk{oz905|CdW!iDyX>~4{w$l8%Y?k z4>F&)RCX9FO!$Ox$g@pSkEaQv|{w;tzw7T$7nJw>W`b>kSv>5o@+qIiR&NLT~> z^-R%Tz4^RrZ(`w@Rx_8QmR)*;X~#`?@4)w6*G!gUt*^ryokRVl&}moZ%4&1q$~`&}u%B^_ITkM{bl z=dBmy{TJrjh4nh;y3&EW!L7IR8OIL#zZLHOn8$L zUiQ58=X|%@NZQ`qxzRJGlb~6&^L+)~>U#@qtdxaKSV*xwn59_thne3Hj`TP3G4&s| zuUIQ=Pq7$m*Ttk??1AmLSk7k}z6H;XU!`sjJN7q-k{Rn$HqCkFJc)0w3YzCNX3%RU z-glKs`$CzzCY)yM?VHYlcZV~_N$9R{<`~)07tWkC$u7U_b292b!g%?<^Y(jY%$f>k zGv60v`Q_fwwenmD&-6Oa5Xzb5QNM8P^Flsn(lLp@QT*l7R?;T}%et6cx}^Cid>Ec< zUnPB}9Q(uCpd@-L=uKn$njk+eH|FF_zn}GA-r^& z{4K)9V1ok8_$d%2I;UlkLFAjr_e#j6ep$ayd;E^`)|PxX_A-6o$yGBsk!Kt1dn0X# zThMJ7bLR7hj8|UkS`(G)OJdiB-D4ySKEg7vUKf+OP8ODey-YZ;ZgEwX83JIFfn zvR9k2q4-)tR`<@ryj9pbtkK1KU^}p8*!#r?@%MYijgtx0GlsNRo>g?-<)>EBC7t7c zK!1gAzqKHdr;uk$$R!^}kk245Cm-g}O~0$Md@$FK-86QGUH=Qz^>@m$*k!I?(mVc# z`+urzE7cB?dirjBw?)Ok*?&_6lzoBcqr;|adQa#MyD@U=hdj7@MS zVXnfOK6c&;@m)T`wqOxhZd@$oX&=@ID~#3U%>Z^;tDj+h?;{gmt;k}?V$uflk!y;< zhW_}xwJE?{lj(C!ds*lcbLXQ3Qoao{txFT;qxh=-_<8I5;@{MPZaTx@ahfWrk!D^e zbzmO7ow@T?qx0<2z4E+cHpsN{QpmYql@5ln^5mU8)08;xW54o=^VZGMSeZC;=8Atl z#KQAc!Kc-i&WG6lWxe=Q-Z5AYYzOAfhkn>L%$*NIuq~KhK1?9n_mN3H%p7Z*fOZ}}+u8L;(h8&RwkHl|n%HmO(-Y(}wu*t}vxuqDOD zV5=_HPF$v88?Z{tz0}JsY^^W*mwS}h?ZH~cB(_lRM4W4n5Y?*ZhSNANB2n#DG>QF&g8?GCohN3fOjYMy64kF8(d zCh|D)-V$5%IZ? z?gF~GwFF_ce@6QRbN77_*qn>WwYI@#VL!)r_c&GV@QR;qNAB*+QZNb6%?4r1ijBh7 z6q|x=!gAvV31c3%qu2^;U)gTLLSHF_+kovJtPa+}cRT)twS>Aqr#>UgjXC0|G{K^< z!{*IQ>O5m+wgwix=c*T9X?%_0>jx6HdhbMGUD%l`b_MS7oub%Ve7d~*r0o87RpP&S z-nvcvo3S4Ic%8m@2U(_stokp=pAxbrWY$;xeMXVRO2~SVjg*jOkgb%EjUlW1T5))i z@3Y9dk>%!)t*|9n7wq$L&1XGl>B||g_8^>%nanEWxJ&cSzkO^Du=#l2#@y3m|0Mg( z921U>Ws}hZ4@#M7UZ6ewy8l=uhHSHhEPk754i{_2wigzME%9Bhy)ZWlusH1`va`2&1l=8UbM2$FGZV0eZ~C{n61N59&B$}@ zg5=XGtPQ5eqN2ZpYy?@ZZcCqF{T1~QR%zcK!L$S0d2A1xPbAP;Lx(D8J`#@s*s5Y9 zu$7!IbVP3gwy)SMtm#`$n2z2OtPAEGt6*%`Vf{*P2R80vrY-(!`Wu*(FU~iO$nItN z-T*&KFr0UV@M@Dl@ZVYGYUN$oMO!MQJZ$1;VCTGL7E8#wkZqNa^&_kPfBxZ(AZsZhn?lxALbix(poDA# z*?0-rKC*=pviiTFJu4w=MHc#w|21?XYc3&6A?qw58%CBcA)7=tRzkLbY`%nS9oa?+ z*&Z_MyZ+Zu_qWuq60#O#@e;B)vi=gXB(l*GvLR%1C1exG)=S9dksXwfts#r-`d{BJ zvRDaO?E{P-OURm$WlP9n$Yx8(63Es{$Oe(^mynGkYy6)7HOwK4mXNI?OO}xBAR8$m zt6pNhQ$p5+Y_)_eifpfhtQT3sfB0WR23bc5*%-1!3E3>N;S#bHWYZ;N+sIZ*$U=X| z{p%942(tR``(Hx`vi1_P9%Q{GWCO^CO2|f$O_h+%AX_dWTSm51LbiphZqNT3tOpq{ zl#n$d>nR~?M>beO){Shkge;A0se~+xY`cVP8d>ds`d`Bmvepu^O=R6AWCzGHC1eeM zPybg!)`o1cgscnMRtZ@@vg#icUxSQwMv%22b3dCf0c&6d3=O)&ZH?$5=?ijV&0 zA^HbC`gO~t{kI@<$4A19I{NN-cf%sCc#B>N*63ogHarMxfIW@x_V}3lhGyT#3v;7m zvxYo{Uh8G_WN+dMdU5nF$UUpV{J`83%%3^BWDnW$69nF=!Ttqx%&&bvt?`re2R}S- zEe33V&hsdRy_9CZiJ7a$!d=0q%XSL;NgemDyOTANS1EjL{8w?l$sBwb*(S09zT4@* zy-br1Y(L0P-?$H*f3$>GS=h5WGrnBHKJueN*^#tehc&`3m$ufYsQ;JIll*H&uM<5p z*5|jd4p_#;B-}386l{*~_O+aqYvDd);QhIWFvT{5UdMlX$Lv{H56m6LBy3o*IoPaX z%dic_Hel5UUVpo=HpN1proU0F0hU#)1val(6t<;UH>~c*-f&Z}4#fsxDaA%%V~S0| z78RR^?I^YaYxo~;xSOz;VtcT(V%00OcZxN_mKAG-?I{+6MgG?tZV#+ev3^)au_4%$ zVq>sX#in5giY>sJdDDlxysW~y72ARhDYg%rQLOeej5igFz(Q5tFxp_Pip62QiuJ-q z6idVA6dQ(ZDmD(Q4S2(yfwe2P2umuq1{+mu8@8a>0c=~by3aD+33|hAf<+Z;hxIGg z2^&`|0b5dR0Jf{x2&^&W4R-<-S8NtGpx6>@Qn7W|iefvkeZ{QL(cfL+4YwZFrC2j; z(8Z*!>wrze4r}W~FNt3C5trA?qPJd#-W+=AD-ZYAOt>59RaYObhnhK$wR)BMkM2)9 zeW%mc6`s2&JlAUW>-Mr=_IYLtuDw54w(8OyvNYlD`%c#!NAD(=o}4ybytVLT&3V5) z@x)E~iYek2d1Rk;wM3SWT-!XX1@=J!X3aDA&LnnpHgrC~#sl-xBpDZMp*xFit<#S? zIkXG5IxoqO-9T^&a=$Bho5(pLkbyZ;5wXVBUGL{d(on12Y7MT z#pLjJpR8wHvmUpJf22PnjEIE6J`Qe*Hj3V3 z9la?3FFXF)oILS=4k^atJa1sNjAH7}Xx_sl;n#ki@E_f0k^JT(ECL%-tPM7*SR9sh zF-hlM*a+-)@kaW(-+jU17LrA*8OG&w3i~T+VmF4}EOxhC#*Wtr=Iy%BUBPZ0yN@4I zE(6ZPSFH9EBZ4>QEvQ>J5-y(%e~~rD50B}yZgYIP%Sh4vn%SzrO}=B`6YOZ3uR0fA ztm@|f<80Y~4*z%a`v(3$#_xXq@8$PR&hIo~PY`zVWBXjs?i8K{D?ATw#^0ydBp7%P zZH+vNa1;N_GYh=)&Zn(8!6^_v``!po_V?F)f${~73yer8l5!NVwLxfjf-)D7u!!vcTaEg_DSa|a4z|DNQ25`Frp6^@Ap#|0}Uek z<4zThAQvsu7L8+<#qLT&Y&HWMfrVUb5jL#!)?h<0X}{zn|8K(vVYz!n!VVmNZoRs7 z+h4sH@)21RY!usCLu}R#llZy!@pZx^er}d<{JGfxOycKeBQS}dn@zwnip|0XU_a%G z%aY?Scdt<5yzcmO_b)q+zZ^5y_$Aw4ZfqfLrH^lbOMJebua_JX?|z?3p&XtKuLc6V z2hF$GiLWHSB2VnIPUn58GHu3IrjDQGRoL>lqmQp+HFE!a7GF(GebyS^ed~wu<T7W$Q3J|3R-O&iSDenP&|`0DujsACD<|XZ_XS@nRfs-^K%E;J~FdEo{`ffIt|vQc#2xy_vbXmyo0C(-G+Z* zeEO?>`SZwJx;!FN(3M~$z2oRNw)9!Q734>utgE#`Q^&8BvC4;i%fT^oj@KBz>VCa1 zzxP4fvuRi@teWrg5w-xUhUNN*ZrCa;1bdp4A?64E<6s^U?kXMzvlO~$pWXG@6CB=^ zf6;X-uA2Xq^(Op2pYPW7l6Gdk#U1lINe=rVy)48F3?^%b4JhOgjL11ho3$w^F}S*EnT67O~V?L4i|nvl5N7Ovw! zES}M`%jzDo^waySi*o&@teR(#%=rguOwYT*0{#OWDxsu7bd&Y0_CD+Vd0&OT&9r}o ze37AQ-~r!!IbI|4^en!rpV4PM$MIE^22x&l)t{$$oM5AwN|kH5PN^Ro_-lA(pB3i2 ze1z@7>S5J}*evu_>Kn|x7q9_Vt5^%H+GQ(i_fc2~mJ)xaUYLDUWU%x0OU8HRXeFm& z#A|NIwH_uuL)f>eaK>P*icP~>V7YOMssFHcnEP5*VKLYl*Y$0|hF~{1O!93XwgNlm zlW*qTXN7!|^VIwsVmfE>75f_NwH=H}e0-@ga9YMnW0Zm7p8i-(0$-!}NK`q@&x zOh0e>t#eEp1LGyy(QbJ0!%Zjc{+}=+zujm3KH=Hr|E!Gd;_`fNT%PZxoH@_;o(ZpB zL3{5LT^KoZ}Jp-aJRAd2cTc00%Wtk+3AQad9u&CQQ}YAD(7cLg2w`8q63n?bpV~o(|y)w`7Y`2ocm#} z@j9ybCrm``r48xRrqGYZo%R}i_xc^z;H=-#rv;zQqMKgakq)Jm<{0-hO_-bK<;Cv- zep6@qtXDgESK9Ay`}md9B#Zqv;27$MlBoO%k^15@Rvq%17Bagtw zkf)LViIawx*hirpS71Scl51A^Al&?V6rN}(`7z|_?S8KHT2C# zT8r29S)UYNrk^IE-0PY4aKW=kBnPobJfhfkU*Bg9%A}OUy`R@Y>~eoX4?+e^el zd}Z-9@*L*M`MJ6ARakp5&)u84)QK6aLf$?+D& z<8r%AYWf!C^_D*CZ}Vwwd==tl+N8Lwhj1U5@sN+FQ#CTS@W}$=DrI7XFlujg#u?|r z5!nqGH%~s&z9OGS-huqxe3x`~$|{=K5PSbF$ynp!BVsHHkVp>4+Zu+QbMk3Qu_J0UVY(*D+coBdj_lLEMoqG#l3&+jmeNq)p?<{xqFcCeGYWSu+m zTmot4YXZIpf0fO1Z5?|=FNOk1)104___QO>q8ooqqlyVI%V34;Lkk5Zav-kB8NVR zpXPt#{^pDNtY4GKhVjF>$oB=gQm2f#{JgY;A4%Udeqwj^Szie8{xxY5 z_-=8MaPk+=!SmPg@8nme&-xdq%x43vBRFTXutHeHT6ly~Vs~T|@F+HEZ1!H=XI-DS zVZ7+rT*u-MPoLEy1aK5_Re^W=`Z`&YAS#{sYX5Mb^<%FuzqM>RH)XMetHAdV za0#kmx8plY7;7KtvtIJExoh`3-^b(~>%+By50vmFbEE@&?f+e$)x&qEZIB}qP214$ z|7dR?WW7mbe57q^fu&%%yepcYkXC{Bs|gvC>az+--znv15Pz9vXMN23+=iTZmb;00 zs)i@pA9&D?!z?!SpX{^#&`D$W{GN99(iOB%yj$^q?I{s$C*_0cbhajNLZMSN(r#Ga zVg2({&OOH7aGjiZngln%C*bELoa>}tr<|4=Uqre0=$m7~$5Rc9hvCQU2Y93n9wMBn zPxo2p_%0t|W3Wxw3k|XRsA*WoN}u(8VXSKur9ER5o&@)dQF!FVSeyq)x`a%lgmfxOXXuYU-rwx7_X1?iF;> zKJx$?^eEctr9`iyDfb~aiGf{5=jKizWH6t2mSPiRN7avp~>J~VUbHLb-LuZo7ftK7E@{EikiT$(srM?SF^0b-vqq^J0@XBAZ86`(1z88nOs7 zlfNcU?Pp%vvD-z~gzTkG-Ez-81Jrw`qm9)tQ_p|LPSUUC`;@=kKI=hmz3h}RP+{C) z?hVU5q2Rk{{EFuk_P8{IuZ{2ZS+AG2h%>YTU*zc@j?XgfAF{5!zWjL$681D~5ca72 zIIhsX6xQ?4+4p3b&+zU8pQMeOdq{iuivEc9#apfmWzMu!CZA4+Cm$I+R~4RqWOsP> zkzM?MOvu%ebH(ih^9+e=_a6R#%olPS}zF9v)4i@_lDhAse_I$&NMUU!NSzwfgK)p9`53AE_lKEX=nW9KVNmOJso_Of80)*bnN&~ z=Brm+uwIfc?}fM(uG5rjWbDZ$qnuCVlS?vPYbCxD_#eOOg53wx{Sr2UFIP&pfT+qe8Y!ZKVZLu4{w0)C@yhoh3~;Hh<_6& zMyt;FRfa!j+~Zf`BsNKGT5H`lg>iC`4Yfal%{Vsw*jyp`#BFlfq|L!N0q#_BN{-z= zFQC&CzF@u2TOZXv1*h$ttO{27C-b&93z?NYjEp@$T@@Hx?_N@xm%k}!z(m^)J#JR@fT=yv^Dz~7` zb;aFk9MK!Xan?Rgh2zJ<(O1)hxF5Nd{F1h~ zA3quVm^EyMlT>0k+R21Ff@}~OKg~zx(G!mTGllSGEDo&V05Ew%(ykv1$j7nCikx=- zQox)Wd6r^GCnl{o6J{B^IQOUI`gXC|!zR~nNxVY;#mfKH7mCIJ1IQxC>XE%M#1AzF zDAaMMy_gLKe^JuBxY3W-1Rom+&of_M6qcn)BdB4ELN0Cr*b`EcEq+yL$Zm+VyE2zn%EaUB6uC4lE9H@0Yg@ znExqO51WL!pQmnyEhxPX*tTL_u==0%hLMCtVbV>?N8*x!b-0+Ma~9SPdxj{Pa=;!s z8h!c{*1hca3ClQh4!th)zUtEs7REwOyFXhMe58N7FWU%ATtYu){qyGv^-AK`0NYWl z1-7kN6t<;UH*8a}6l_DWLD;%tqp&r_reLdz&BIm{TY)Vrwh3EOY!9}mSoQyqzlt@& z<`rv&%_$ax%_`Odn^CMEHm%qYY)Y{)*ra09unEN$VB?Cd!p0Qaf{iM+56dc6`@f9m z6pO%y6>EbHDHewf!X8K2k&l$2UdNxCrC}03Hyeh@^}5+OOw!NIW?+&ZZng-M{B^T6 zn3NYc+lEQ`bF%}OlxH`qW2CdESd)x?B3`|ASgm56um;5vuqMR@V6BRcz&aG0fW;M? zg>@^o1WPEk4(nHJ2bNLHs=CS=R*Z3zHL6%MY(lXP*tB9@usOw&utmi(uoV}Rz90)* zhdtV9*NWEm7|UJcUUD?BS-e_uN^VE0brpO{-?)X}(VxFy{VLz>cJ+Drd9)R{%9`@X z%+Ynmt`XThvM1&3Zp)9o+L5gwGh;I|_R2l8=ad-H(4 zJsUD>grqX-tGwPvHu2=wS5L@O5S~>M*5M-fOW<$pi5KkWFqy}&GS|7;yx9Yt zc=2dV_EpODTA{0~WYdNGep2@yCg#u=uQ(fCtmgjnay45aIN*D|`gnMgm5Rmc8@OO5 znEBga_WFDm{`TLj)Rq z-t_Wq_}a$T4!#y7UZ%WKHZRKktGk&h*qhc)$#LKL@Amz`$Q6`_Csl6OgWbUq>_)L0 z{-w&oYvz)cv8!#qV4o*L`EZ^!F?%Z9&zH!&Y7gBAx^t2iq@kQVdq%FE8Y^j4{|MSE zy4Wds%*cL6i=9@T*fsp}1=stDDIAyNOy-Lr=Ts?fMVP0Pa%QGo z7{)G*oqMc04(o@x+lm=jO6e`ak}f?-i#1pRHZJiuDLIStH@*A=lUKYCg{JZcgBFfwVicV6-VLHwrvk1Zj^X zzV+4g&n-V$zb*Lf$L}_NU(a_F-($q$oWz19n?lq~A0zq`=*NGpeEk*lrz_AuK)?FQ z<@;}WB;~IH{a*B!E6~rP-~8+4$7cckkqY#8(BG~=zws*4zqS1MbfQ09f&L)+)xS}` z{~7dC73goEzg&TSZ4K%Fl=9=#f&NGZ`u*r{SD-(Ee*8DfkIxGF(-r6+pkLiqzW

    QOR?wfWK>q;!>S+1?TOLdLSD@dE{&EHS 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

    46S`+vM%dHMuTv3=Ki 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 z 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