From a4c9a2a4e1228eadd64fbeff645eecb735d0aa80 Mon Sep 17 00:00:00 2001 From: magniloquency <197707854+magniloquency@users.noreply.github.com> Date: Mon, 3 Feb 2025 23:57:43 -0500 Subject: [PATCH 01/11] initial --- CONTRIBUTING.md | 62 + LICENSE | 201 + Makefile | 18 + README.md | 314 + __pycache__/check.cpython-311.pyc | Bin 0 -> 2637 bytes benchmarks/dask_local_test.py | 30 + benchmarks/dask_remote_test.py | 30 + benchmarks/scaler_test.py | 36 + check.py | 52 + docs/.gitignore | 1 + docs/Makefile | 20 + docs/make.bat | 35 + docs/requirements_docs.txt | 3 + docs/source/_static/style.css | 19 + docs/source/_templates/layout.html | 4 + docs/source/conf.py | 74 + docs/source/index.rst | 31 + docs/source/tutorials/configuration.rst | 91 + docs/source/tutorials/features.rst | 257 + docs/source/tutorials/images/architecture.png | Bin 0 -> 36570 bytes docs/source/tutorials/quickstart.rst | 213 + pyproject.toml | 67 + renovate.json | 6 + requirements.txt | 6 + run_cluster.py | 4 + run_scheduler.py | 5 + run_top.py | 5 + run_webui.py | 4 + scaler/__init__.py | 14 + scaler/__pycache__/__init__.cpython-311.pyc | Bin 0 -> 982 bytes scaler/__pycache__/about.cpython-311.pyc | Bin 0 -> 188 bytes scaler/about.py | 1 + scaler/client/__init__.py | 0 .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 177 bytes .../client/__pycache__/client.cpython-311.pyc | Bin 0 -> 32127 bytes .../client/__pycache__/future.cpython-311.pyc | Bin 0 -> 10893 bytes .../__pycache__/object_buffer.cpython-311.pyc | Bin 0 -> 7221 bytes .../object_reference.cpython-311.pyc | Bin 0 -> 1653 bytes scaler/client/agent/__init__.py | 0 .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 183 bytes .../__pycache__/client_agent.cpython-311.pyc | Bin 0 -> 11247 bytes .../disconnect_manager.cpython-311.pyc | Bin 0 -> 2376 bytes .../future_manager.cpython-311.pyc | Bin 0 -> 8418 bytes .../heartbeat_manager.cpython-311.pyc | Bin 0 -> 3748 bytes .../agent/__pycache__/mixins.cpython-311.pyc | Bin 0 -> 6478 bytes .../object_manager.cpython-311.pyc | Bin 0 -> 5578 bytes .../__pycache__/task_manager.cpython-311.pyc | Bin 0 -> 4428 bytes scaler/client/agent/client_agent.py | 200 + scaler/client/agent/disconnect_manager.py | 27 + scaler/client/agent/future_manager.py | 115 + scaler/client/agent/heartbeat_manager.py | 61 + scaler/client/agent/mixins.py | 94 + scaler/client/agent/object_manager.py | 75 + scaler/client/agent/task_manager.py | 66 + scaler/client/client.py | 554 ++ scaler/client/future.py | 173 + scaler/client/object_buffer.py | 103 + scaler/client/object_reference.py | 23 + scaler/client/serializer/__init__.py | 0 .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 188 bytes .../__pycache__/default.cpython-311.pyc | Bin 0 -> 1259 bytes .../__pycache__/mixins.cpython-311.pyc | Bin 0 -> 2220 bytes scaler/client/serializer/default.py | 16 + scaler/client/serializer/mixins.py | 38 + scaler/cluster/__init__.py | 0 .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 178 bytes .../__pycache__/cluster.cpython-311.pyc | Bin 0 -> 5826 bytes .../cluster/__pycache__/combo.cpython-311.pyc | Bin 0 -> 5170 bytes .../__pycache__/scheduler.cpython-311.pyc | Bin 0 -> 3062 bytes scaler/cluster/cluster.py | 102 + scaler/cluster/combo.py | 98 + scaler/cluster/scheduler.py | 61 + scaler/entry_points/__init__.py | 0 .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 183 bytes .../__pycache__/cluster.cpython-311.pyc | Bin 0 -> 6671 bytes .../__pycache__/scheduler.cpython-311.pyc | Bin 0 -> 6495 bytes scaler/entry_points/cluster.py | 141 + scaler/entry_points/scheduler.py | 142 + scaler/entry_points/top.py | 275 + scaler/entry_points/webui.py | 18 + scaler/io/__init__.py | 0 .../io/__pycache__/__init__.cpython-311.pyc | Bin 0 -> 173 bytes .../__pycache__/async_binder.cpython-311.pyc | Bin 0 -> 5360 bytes .../async_connector.cpython-311.pyc | Bin 0 -> 4313 bytes scaler/io/__pycache__/config.cpython-311.pyc | Bin 0 -> 1264 bytes scaler/io/__pycache__/model.cpython-311.pyc | Bin 0 -> 20683 bytes .../sync_connector.cpython-311.pyc | Bin 0 -> 5467 bytes scaler/io/__pycache__/utility.cpython-311.pyc | Bin 0 -> 2988 bytes scaler/io/async_binder.py | 65 + scaler/io/async_connector.py | 74 + scaler/io/config.py | 82 + scaler/io/cpp/__pycache__/ffi.cpython-311.pyc | Bin 0 -> 8345 bytes scaler/io/cpp/build.py | 20 + scaler/io/cpp/build/cpp.cpp | 1839 ++++ .../build/cpp.cpython-311-x86_64-linux-gnu.so | Bin 0 -> 1753536 bytes scaler/io/cpp/build/cpp.o | Bin 0 -> 750280 bytes scaler/io/cpp/doc.md | 9 + scaler/io/cpp/ffi.py | 140 + scaler/io/cpp/src/defs.h | 63 + scaler/io/cpp/src/main.cpp | 1912 ++++ scaler/io/cpp/src/main.h | 343 + scaler/io/cpp/src/main.o | Bin 0 -> 2891616 bytes .../src/third_party/blockingconcurrentqueue.h | 582 ++ .../io/cpp/src/third_party/concurrentqueue.h | 3747 +++++++ .../src/third_party/lightweightsemaphore.h | 429 + scaler/io/model.py | 451 + scaler/io/sync_connector.py | 90 + scaler/io/sync_subscriber.py | 83 + scaler/io/utility.py | 31 + scaler/protocol/__init__.py | 0 .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 179 bytes scaler/protocol/capnp/__init__.py | 0 .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 185 bytes .../capnp/__pycache__/_python.cpython-311.pyc | Bin 0 -> 576 bytes scaler/protocol/capnp/_python.py | 5 + scaler/protocol/capnp/common.capnp | 22 + scaler/protocol/capnp/message.capnp | 208 + scaler/protocol/capnp/status.capnp | 65 + scaler/protocol/introduction.md | 114 + scaler/protocol/python/__init__.py | 0 .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 186 bytes .../python/__pycache__/common.cpython-311.pyc | Bin 0 -> 3559 bytes .../__pycache__/message.cpython-311.pyc | Bin 0 -> 43239 bytes .../python/__pycache__/mixins.cpython-311.pyc | Bin 0 -> 918 bytes .../python/__pycache__/status.cpython-311.pyc | Bin 0 -> 17675 bytes scaler/protocol/python/common.py | 56 + scaler/protocol/python/message.py | 644 ++ scaler/protocol/python/mixins.py | 13 + scaler/protocol/python/status.py | 276 + scaler/protocol/worker.md | 228 + scaler/scheduler/__init__.py | 0 .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 180 bytes .../client_manager.cpython-311.pyc | Bin 0 -> 9118 bytes .../__pycache__/config.cpython-311.pyc | Bin 0 -> 1051 bytes .../__pycache__/graph_manager.cpython-311.pyc | Bin 0 -> 21077 bytes .../__pycache__/mixins.cpython-311.pyc | Bin 0 -> 10476 bytes .../object_manager.cpython-311.pyc | Bin 0 -> 12875 bytes .../__pycache__/scheduler.cpython-311.pyc | Bin 0 -> 9894 bytes .../status_reporter.cpython-311.pyc | Bin 0 -> 3172 bytes .../__pycache__/task_manager.cpython-311.pyc | Bin 0 -> 10831 bytes .../worker_manager.cpython-311.pyc | Bin 0 -> 16695 bytes scaler/scheduler/allocators/__init__.py | 0 .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 191 bytes .../__pycache__/mixins.cpython-311.pyc | Bin 0 -> 3981 bytes .../__pycache__/queued.cpython-311.pyc | Bin 0 -> 9100 bytes scaler/scheduler/allocators/mixins.py | 57 + scaler/scheduler/allocators/queued.py | 145 + scaler/scheduler/client_manager.py | 125 + scaler/scheduler/config.py | 18 + scaler/scheduler/graph_manager.py | 327 + scaler/scheduler/mixins.py | 154 + scaler/scheduler/object_manager.py | 175 + scaler/scheduler/object_usage/__init__.py | 0 .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 193 bytes .../object_tracker.cpython-311.pyc | Bin 0 -> 7939 bytes .../scheduler/object_usage/object_tracker.py | 132 + scaler/scheduler/scheduler.py | 184 + scaler/scheduler/status_reporter.py | 49 + scaler/scheduler/task_manager.py | 166 + scaler/scheduler/worker_manager.py | 229 + scaler/ui/__init__.py | 0 scaler/ui/live_display.py | 118 + scaler/ui/memory_window.py | 146 + scaler/ui/setting_page.py | 36 + scaler/ui/task_graph.py | 336 + scaler/ui/task_log.py | 83 + scaler/ui/utility.py | 35 + scaler/ui/webui.py | 116 + scaler/ui/worker_processors.py | 92 + scaler/utility/__init__.py | 0 .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 178 bytes .../utility/__pycache__/debug.cpython-311.pyc | Bin 0 -> 1099 bytes .../__pycache__/event_list.cpython-311.pyc | Bin 0 -> 5023 bytes .../__pycache__/event_loop.cpython-311.pyc | Bin 0 -> 3222 bytes .../__pycache__/exceptions.cpython-311.pyc | Bin 0 -> 2108 bytes .../__pycache__/formatter.cpython-311.pyc | Bin 0 -> 1854 bytes .../many_to_many_dict.cpython-311.pyc | Bin 0 -> 8621 bytes .../__pycache__/mixins.cpython-311.pyc | Bin 0 -> 1116 bytes .../object_utility.cpython-311.pyc | Bin 0 -> 2232 bytes .../one_to_many_dict.cpython-311.pyc | Bin 0 -> 4586 bytes .../__pycache__/zmq_config.cpython-311.pyc | Bin 0 -> 4577 bytes scaler/utility/debug.py | 19 + scaler/utility/event_list.py | 63 + scaler/utility/event_loop.py | 48 + scaler/utility/exceptions.py | 38 + scaler/utility/formatter.py | 44 + scaler/utility/graph/__init__.py | 0 .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 184 bytes .../__pycache__/optimization.cpython-311.pyc | Bin 0 -> 1805 bytes .../topological_sorter.cpython-311.pyc | Bin 0 -> 725 bytes ...pological_sorter_graphblas.cpython-311.pyc | Bin 0 -> 11341 bytes scaler/utility/graph/optimization.py | 27 + scaler/utility/graph/topological_sorter.py | 11 + .../graph/topological_sorter_graphblas.py | 174 + scaler/utility/logging/__init__.py | 0 .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 186 bytes .../__pycache__/scoped_logger.cpython-311.pyc | Bin 0 -> 2893 bytes .../__pycache__/utility.cpython-311.pyc | Bin 0 -> 7280 bytes scaler/utility/logging/decorators.py | 25 + scaler/utility/logging/scoped_logger.py | 33 + scaler/utility/logging/utility.py | 148 + scaler/utility/many_to_many_dict.py | 123 + scaler/utility/metadata/__init__.py | 0 .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 187 bytes .../profile_result.cpython-311.pyc | Bin 0 -> 2331 bytes .../__pycache__/task_flags.cpython-311.pyc | Bin 0 -> 2130 bytes scaler/utility/metadata/profile_result.py | 31 + scaler/utility/metadata/task_flags.py | 29 + scaler/utility/mixins.py | 13 + scaler/utility/object_utility.py | 32 + scaler/utility/one_to_many_dict.py | 72 + scaler/utility/queues/__init__.py | 0 .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 185 bytes .../async_indexed_queue.cpython-311.pyc | Bin 0 -> 2589 bytes .../async_priority_queue.cpython-311.pyc | Bin 0 -> 4960 bytes ...sync_sorted_priority_queue.cpython-311.pyc | Bin 0 -> 2745 bytes .../__pycache__/indexed_queue.cpython-311.pyc | Bin 0 -> 5754 bytes scaler/utility/queues/async_indexed_queue.py | 35 + scaler/utility/queues/async_priority_queue.py | 70 + .../queues/async_sorted_priority_queue.py | 45 + scaler/utility/queues/indexed_queue.py | 114 + scaler/utility/zmq_config.py | 70 + scaler/worker/__init__.py | 0 .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 177 bytes .../worker/__pycache__/worker.cpython-311.pyc | Bin 0 -> 11408 bytes scaler/worker/agent/__init__.py | 0 .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 183 bytes .../heartbeat_manager.cpython-311.pyc | Bin 0 -> 6055 bytes .../agent/__pycache__/mixins.cpython-311.pyc | Bin 0 -> 9750 bytes .../object_tracker.cpython-311.pyc | Bin 0 -> 5094 bytes .../processor_holder.cpython-311.pyc | Bin 0 -> 6602 bytes .../processor_manager.cpython-311.pyc | Bin 0 -> 22710 bytes .../profiling_manager.cpython-311.pyc | Bin 0 -> 6577 bytes .../__pycache__/task_manager.cpython-311.pyc | Bin 0 -> 8142 bytes .../timeout_manager.cpython-311.pyc | Bin 0 -> 1565 bytes scaler/worker/agent/heartbeat_manager.py | 93 + scaler/worker/agent/mixins.py | 142 + scaler/worker/agent/object_tracker.py | 69 + scaler/worker/agent/processor/__init__.py | 0 .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 193 bytes .../__pycache__/object_cache.cpython-311.pyc | Bin 0 -> 8890 bytes .../__pycache__/processor.cpython-311.pyc | Bin 0 -> 18305 bytes scaler/worker/agent/processor/object_cache.py | 117 + scaler/worker/agent/processor/processor.py | 301 + scaler/worker/agent/processor_holder.py | 139 + scaler/worker/agent/processor_manager.py | 411 + scaler/worker/agent/profiling_manager.py | 108 + scaler/worker/agent/task_manager.py | 138 + scaler/worker/agent/timeout_manager.py | 19 + scaler/worker/worker.py | 197 + scheduler | 1081 +++ shutff | 768 ++ shutff.py | 18 + tests/__init__.py | 0 tests/__pycache__/__init__.cpython-311.pyc | Bin 0 -> 169 bytes .../test_async_indexed_queue.cpython-311.pyc | Bin 0 -> 4075 bytes .../test_async_priority_queue.cpython-311.pyc | Bin 0 -> 3645 bytes ...sync_sorted_priority_queue.cpython-311.pyc | Bin 0 -> 3709 bytes .../__pycache__/test_balance.cpython-311.pyc | Bin 0 -> 4494 bytes tests/__pycache__/test_client.cpython-311.pyc | Bin 0 -> 34596 bytes .../test_death_timeout.cpython-311.pyc | Bin 0 -> 5161 bytes tests/__pycache__/test_future.cpython-311.pyc | Bin 0 -> 8943 bytes tests/__pycache__/test_graph.cpython-311.pyc | Bin 0 -> 15582 bytes .../test_indexed_queue.cpython-311.pyc | Bin 0 -> 2526 bytes .../test_nested_task.cpython-311.pyc | Bin 0 -> 5823 bytes .../test_object_usage.cpython-311.pyc | Bin 0 -> 3391 bytes .../test_profiling.cpython-311.pyc | Bin 0 -> 4518 bytes .../test_protected.cpython-311.pyc | Bin 0 -> 2827 bytes .../test_serializer.cpython-311.pyc | Bin 0 -> 8067 bytes tests/__pycache__/test_ui.cpython-311.pyc | Bin 0 -> 7505 bytes ...test_worker_object_tracker.cpython-311.pyc | Bin 0 -> 4452 bytes tests/__pycache__/utility.cpython-311.pyc | Bin 0 -> 1453 bytes .../site-packages/_distutils_hack/__init__.py | 235 + .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 11179 bytes .../__pycache__/override.cpython-311.pyc | Bin 0 -> 336 bytes .../site-packages/_distutils_hack/override.py | 1 + .../site-packages/distutils-precedence.pth | 1 + .../pip-24.0.dist-info/AUTHORS.txt | 760 ++ .../pip-24.0.dist-info/INSTALLER | 1 + .../pip-24.0.dist-info/LICENSE.txt | 20 + .../site-packages/pip-24.0.dist-info/METADATA | 88 + .../site-packages/pip-24.0.dist-info/RECORD | 1024 ++ .../pip-24.0.dist-info/REQUESTED | 0 .../site-packages/pip-24.0.dist-info/WHEEL | 5 + .../pip-24.0.dist-info/entry_points.txt | 4 + .../pip-24.0.dist-info/top_level.txt | 1 + .../python3.11/site-packages/pip/__init__.py | 13 + .../python3.11/site-packages/pip/__main__.py | 24 + .../site-packages/pip/__pip-runner__.py | 51 + .../pip/__pycache__/__init__.cpython-311.pyc | Bin 0 -> 789 bytes .../pip/__pycache__/__main__.cpython-311.pyc | Bin 0 -> 908 bytes .../__pip-runner__.cpython-311.pyc | Bin 0 -> 2527 bytes .../site-packages/pip/_internal/__init__.py | 18 + .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 905 bytes .../__pycache__/build_env.cpython-311.pyc | Bin 0 -> 16094 bytes .../__pycache__/cache.cpython-311.pyc | Bin 0 -> 14409 bytes .../__pycache__/configuration.cpython-311.pyc | Bin 0 -> 19800 bytes .../__pycache__/exceptions.cpython-311.pyc | Bin 0 -> 37464 bytes .../__pycache__/main.cpython-311.pyc | Bin 0 -> 774 bytes .../__pycache__/pyproject.cpython-311.pyc | Bin 0 -> 5632 bytes .../self_outdated_check.cpython-311.pyc | Bin 0 -> 11789 bytes .../__pycache__/wheel_builder.cpython-311.pyc | Bin 0 -> 15190 bytes .../site-packages/pip/_internal/build_env.py | 323 + .../site-packages/pip/_internal/cache.py | 306 + .../pip/_internal/cli/__init__.py | 4 + .../cli/__pycache__/__init__.cpython-311.pyc | Bin 0 -> 309 bytes .../autocompletion.cpython-311.pyc | Bin 0 -> 10264 bytes .../__pycache__/base_command.cpython-311.pyc | Bin 0 -> 11883 bytes .../__pycache__/cmdoptions.cpython-311.pyc | Bin 0 -> 33789 bytes .../command_context.cpython-311.pyc | Bin 0 -> 2131 bytes .../cli/__pycache__/main.cpython-311.pyc | Bin 0 -> 2601 bytes .../__pycache__/main_parser.cpython-311.pyc | Bin 0 -> 5545 bytes .../cli/__pycache__/parser.cpython-311.pyc | Bin 0 -> 16970 bytes .../__pycache__/progress_bars.cpython-311.pyc | Bin 0 -> 3193 bytes .../__pycache__/req_command.cpython-311.pyc | Bin 0 -> 20348 bytes .../cli/__pycache__/spinners.cpython-311.pyc | Bin 0 -> 8858 bytes .../__pycache__/status_codes.cpython-311.pyc | Bin 0 -> 397 bytes .../pip/_internal/cli/autocompletion.py | 172 + .../pip/_internal/cli/base_command.py | 245 + .../pip/_internal/cli/cmdoptions.py | 1118 +++ .../pip/_internal/cli/command_context.py | 30 + .../site-packages/pip/_internal/cli/main.py | 79 + .../pip/_internal/cli/main_parser.py | 134 + .../site-packages/pip/_internal/cli/parser.py | 320 + .../pip/_internal/cli/progress_bars.py | 68 + .../pip/_internal/cli/req_command.py | 519 + .../pip/_internal/cli/spinners.py | 172 + .../pip/_internal/cli/status_codes.py | 6 + .../pip/_internal/commands/__init__.py | 132 + .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 4477 bytes .../__pycache__/cache.cpython-311.pyc | Bin 0 -> 10897 bytes .../__pycache__/check.cpython-311.pyc | Bin 0 -> 2432 bytes .../__pycache__/completion.cpython-311.pyc | Bin 0 -> 5647 bytes .../__pycache__/configuration.cpython-311.pyc | Bin 0 -> 14875 bytes .../__pycache__/debug.cpython-311.pyc | Bin 0 -> 12220 bytes .../__pycache__/download.cpython-311.pyc | Bin 0 -> 7966 bytes .../__pycache__/freeze.cpython-311.pyc | Bin 0 -> 4682 bytes .../commands/__pycache__/hash.cpython-311.pyc | Bin 0 -> 3379 bytes .../commands/__pycache__/help.cpython-311.pyc | Bin 0 -> 1991 bytes .../__pycache__/index.cpython-311.pyc | Bin 0 -> 7745 bytes .../__pycache__/inspect.cpython-311.pyc | Bin 0 -> 4467 bytes .../__pycache__/install.cpython-311.pyc | Bin 0 -> 31167 bytes .../commands/__pycache__/list.cpython-311.pyc | Bin 0 -> 17271 bytes .../__pycache__/search.cpython-311.pyc | Bin 0 -> 8973 bytes .../commands/__pycache__/show.cpython-311.pyc | Bin 0 -> 11316 bytes .../__pycache__/uninstall.cpython-311.pyc | Bin 0 -> 5167 bytes .../__pycache__/wheel.cpython-311.pyc | Bin 0 -> 9423 bytes .../pip/_internal/commands/cache.py | 238 + .../pip/_internal/commands/check.py | 55 + .../pip/_internal/commands/completion.py | 132 + .../pip/_internal/commands/configuration.py | 299 + .../pip/_internal/commands/debug.py | 203 + .../pip/_internal/commands/download.py | 150 + .../pip/_internal/commands/freeze.py | 113 + .../pip/_internal/commands/hash.py | 62 + .../pip/_internal/commands/help.py | 42 + .../pip/_internal/commands/index.py | 143 + .../pip/_internal/commands/inspect.py | 97 + .../pip/_internal/commands/install.py | 788 ++ .../pip/_internal/commands/list.py | 386 + .../pip/_internal/commands/search.py | 178 + .../pip/_internal/commands/show.py | 193 + .../pip/_internal/commands/uninstall.py | 116 + .../pip/_internal/commands/wheel.py | 188 + .../pip/_internal/configuration.py | 404 + .../pip/_internal/distributions/__init__.py | 21 + .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 1059 bytes .../__pycache__/base.cpython-311.pyc | Bin 0 -> 3151 bytes .../__pycache__/installed.cpython-311.pyc | Bin 0 -> 1868 bytes .../__pycache__/sdist.cpython-311.pyc | Bin 0 -> 9391 bytes .../__pycache__/wheel.cpython-311.pyc | Bin 0 -> 2459 bytes .../pip/_internal/distributions/base.py | 55 + .../pip/_internal/distributions/installed.py | 32 + .../pip/_internal/distributions/sdist.py | 165 + .../pip/_internal/distributions/wheel.py | 43 + .../site-packages/pip/_internal/exceptions.py | 766 ++ .../pip/_internal/index/__init__.py | 2 + .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 263 bytes .../__pycache__/collector.cpython-311.pyc | Bin 0 -> 24608 bytes .../package_finder.cpython-311.pyc | Bin 0 -> 44172 bytes .../index/__pycache__/sources.cpython-311.pyc | Bin 0 -> 13979 bytes .../pip/_internal/index/collector.py | 524 + .../pip/_internal/index/package_finder.py | 1065 ++ .../pip/_internal/index/sources.py | 308 + .../pip/_internal/locations/__init__.py | 469 + .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 18201 bytes .../__pycache__/_distutils.cpython-311.pyc | Bin 0 -> 7575 bytes .../__pycache__/_sysconfig.cpython-311.pyc | Bin 0 -> 8905 bytes .../__pycache__/base.cpython-311.pyc | Bin 0 -> 4026 bytes .../pip/_internal/locations/_distutils.py | 172 + .../pip/_internal/locations/_sysconfig.py | 213 + .../pip/_internal/locations/base.py | 81 + .../site-packages/pip/_internal/main.py | 12 + .../pip/_internal/metadata/__init__.py | 128 + .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 6525 bytes .../__pycache__/_json.cpython-311.pyc | Bin 0 -> 3588 bytes .../metadata/__pycache__/base.cpython-311.pyc | Bin 0 -> 38702 bytes .../__pycache__/pkg_resources.cpython-311.pyc | Bin 0 -> 17559 bytes .../pip/_internal/metadata/_json.py | 85 + .../pip/_internal/metadata/base.py | 761 ++ .../_internal/metadata/importlib/__init__.py | 6 + .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 414 bytes .../__pycache__/_compat.cpython-311.pyc | Bin 0 -> 3587 bytes .../__pycache__/_dists.cpython-311.pyc | Bin 0 -> 14897 bytes .../__pycache__/_envs.cpython-311.pyc | Bin 0 -> 12530 bytes .../_internal/metadata/importlib/_compat.py | 59 + .../_internal/metadata/importlib/_dists.py | 249 + .../pip/_internal/metadata/importlib/_envs.py | 201 + .../pip/_internal/metadata/pkg_resources.py | 309 + .../pip/_internal/models/__init__.py | 2 + .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 297 bytes .../__pycache__/candidate.cpython-311.pyc | Bin 0 -> 2105 bytes .../__pycache__/direct_url.cpython-311.pyc | Bin 0 -> 12790 bytes .../format_control.cpython-311.pyc | Bin 0 -> 4651 bytes .../models/__pycache__/index.cpython-311.pyc | Bin 0 -> 1922 bytes .../installation_report.cpython-311.pyc | Bin 0 -> 2628 bytes .../models/__pycache__/link.cpython-311.pyc | Bin 0 -> 28641 bytes .../models/__pycache__/scheme.cpython-311.pyc | Bin 0 -> 1288 bytes .../__pycache__/search_scope.cpython-311.pyc | Bin 0 -> 5851 bytes .../selection_prefs.cpython-311.pyc | Bin 0 -> 2019 bytes .../__pycache__/target_python.cpython-311.pyc | Bin 0 -> 5318 bytes .../models/__pycache__/wheel.cpython-311.pyc | Bin 0 -> 6444 bytes .../pip/_internal/models/candidate.py | 34 + .../pip/_internal/models/direct_url.py | 255 + .../pip/_internal/models/format_control.py | 84 + .../pip/_internal/models/index.py | 30 + .../_internal/models/installation_report.py | 59 + .../pip/_internal/models/link.py | 613 ++ .../pip/_internal/models/scheme.py | 32 + .../pip/_internal/models/search_scope.py | 137 + .../pip/_internal/models/selection_prefs.py | 52 + .../pip/_internal/models/target_python.py | 126 + .../pip/_internal/models/wheel.py | 97 + .../pip/_internal/network/__init__.py | 2 + .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 285 bytes .../network/__pycache__/auth.cpython-311.pyc | Bin 0 -> 24012 bytes .../network/__pycache__/cache.cpython-311.pyc | Bin 0 -> 7953 bytes .../__pycache__/download.cpython-311.pyc | Bin 0 -> 9563 bytes .../__pycache__/lazy_wheel.cpython-311.pyc | Bin 0 -> 13046 bytes .../__pycache__/session.cpython-311.pyc | Bin 0 -> 21462 bytes .../network/__pycache__/utils.cpython-311.pyc | Bin 0 -> 2434 bytes .../__pycache__/xmlrpc.cpython-311.pyc | Bin 0 -> 3271 bytes .../pip/_internal/network/auth.py | 588 ++ .../pip/_internal/network/cache.py | 114 + .../pip/_internal/network/download.py | 190 + .../pip/_internal/network/lazy_wheel.py | 229 + .../pip/_internal/network/session.py | 532 + .../pip/_internal/network/utils.py | 96 + .../pip/_internal/network/xmlrpc.py | 64 + .../pip/_internal/operations/__init__.py | 0 .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 223 bytes .../__pycache__/check.cpython-311.pyc | Bin 0 -> 8486 bytes .../__pycache__/freeze.cpython-311.pyc | Bin 0 -> 11619 bytes .../__pycache__/prepare.cpython-311.pyc | Bin 0 -> 27844 bytes .../_internal/operations/build/__init__.py | 0 .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 229 bytes .../__pycache__/build_tracker.cpython-311.pyc | Bin 0 -> 8950 bytes .../__pycache__/metadata.cpython-311.pyc | Bin 0 -> 2300 bytes .../metadata_editable.cpython-311.pyc | Bin 0 -> 2336 bytes .../metadata_legacy.cpython-311.pyc | Bin 0 -> 3736 bytes .../build/__pycache__/wheel.cpython-311.pyc | Bin 0 -> 1966 bytes .../wheel_editable.cpython-311.pyc | Bin 0 -> 2410 bytes .../__pycache__/wheel_legacy.cpython-311.pyc | Bin 0 -> 4517 bytes .../operations/build/build_tracker.py | 147 + .../_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 | 187 + .../pip/_internal/operations/freeze.py | 258 + .../_internal/operations/install/__init__.py | 2 + .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 297 bytes .../editable_legacy.cpython-311.pyc | Bin 0 -> 2210 bytes .../install/__pycache__/wheel.cpython-311.pyc | Bin 0 -> 40191 bytes .../operations/install/editable_legacy.py | 46 + .../pip/_internal/operations/install/wheel.py | 755 ++ .../pip/_internal/operations/prepare.py | 745 ++ .../site-packages/pip/_internal/pyproject.py | 179 + .../pip/_internal/req/__init__.py | 94 + .../req/__pycache__/__init__.cpython-311.pyc | Bin 0 -> 4410 bytes .../__pycache__/constructors.cpython-311.pyc | Bin 0 -> 23419 bytes .../req/__pycache__/req_file.cpython-311.pyc | Bin 0 -> 23131 bytes .../__pycache__/req_install.cpython-311.pyc | Bin 0 -> 40267 bytes .../req/__pycache__/req_set.cpython-311.pyc | Bin 0 -> 7979 bytes .../__pycache__/req_uninstall.cpython-311.pyc | Bin 0 -> 37344 bytes .../pip/_internal/req/constructors.py | 579 ++ .../pip/_internal/req/req_file.py | 566 ++ .../pip/_internal/req/req_install.py | 961 ++ .../pip/_internal/req/req_set.py | 129 + .../pip/_internal/req/req_uninstall.py | 673 ++ .../pip/_internal/resolution/__init__.py | 0 .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 223 bytes .../__pycache__/base.cpython-311.pyc | Bin 0 -> 1394 bytes .../pip/_internal/resolution/base.py | 22 + .../_internal/resolution/legacy/__init__.py | 0 .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 230 bytes .../__pycache__/resolver.cpython-311.pyc | Bin 0 -> 23687 bytes .../_internal/resolution/legacy/resolver.py | 611 ++ .../resolution/resolvelib/__init__.py | 0 .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 234 bytes .../__pycache__/base.cpython-311.pyc | Bin 0 -> 9322 bytes .../__pycache__/candidates.cpython-311.pyc | Bin 0 -> 31416 bytes .../__pycache__/factory.cpython-311.pyc | Bin 0 -> 35804 bytes .../found_candidates.cpython-311.pyc | Bin 0 -> 6782 bytes .../__pycache__/provider.cpython-311.pyc | Bin 0 -> 11473 bytes .../__pycache__/reporter.cpython-311.pyc | Bin 0 -> 5464 bytes .../__pycache__/requirements.cpython-311.pyc | Bin 0 -> 12236 bytes .../__pycache__/resolver.cpython-311.pyc | Bin 0 -> 13474 bytes .../_internal/resolution/resolvelib/base.py | 161 + .../resolution/resolvelib/candidates.py | 652 ++ .../resolution/resolvelib/factory.py | 838 ++ .../resolution/resolvelib/found_candidates.py | 160 + .../resolution/resolvelib/provider.py | 266 + .../resolution/resolvelib/reporter.py | 89 + .../resolution/resolvelib/requirements.py | 199 + .../resolution/resolvelib/resolver.py | 321 + .../pip/_internal/self_outdated_check.py | 253 + .../pip/_internal/utils/__init__.py | 0 .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 218 bytes .../__pycache__/_jaraco_text.cpython-311.pyc | Bin 0 -> 4782 bytes .../utils/__pycache__/_log.cpython-311.pyc | Bin 0 -> 2039 bytes .../utils/__pycache__/appdirs.cpython-311.pyc | Bin 0 -> 2577 bytes .../utils/__pycache__/compat.cpython-311.pyc | Bin 0 -> 2285 bytes .../compatibility_tags.cpython-311.pyc | Bin 0 -> 6777 bytes .../__pycache__/datetime.cpython-311.pyc | Bin 0 -> 735 bytes .../__pycache__/deprecation.cpython-311.pyc | Bin 0 -> 4704 bytes .../direct_url_helpers.cpython-311.pyc | Bin 0 -> 3739 bytes .../__pycache__/egg_link.cpython-311.pyc | Bin 0 -> 3573 bytes .../__pycache__/encoding.cpython-311.pyc | Bin 0 -> 2341 bytes .../__pycache__/entrypoints.cpython-311.pyc | Bin 0 -> 4263 bytes .../__pycache__/filesystem.cpython-311.pyc | Bin 0 -> 8248 bytes .../__pycache__/filetypes.cpython-311.pyc | Bin 0 -> 1334 bytes .../utils/__pycache__/glibc.cpython-311.pyc | Bin 0 -> 2630 bytes .../utils/__pycache__/hashes.cpython-311.pyc | Bin 0 -> 8789 bytes .../utils/__pycache__/logging.cpython-311.pyc | Bin 0 -> 15389 bytes .../utils/__pycache__/misc.cpython-311.pyc | Bin 0 -> 38635 bytes .../utils/__pycache__/models.cpython-311.pyc | Bin 0 -> 2958 bytes .../__pycache__/packaging.cpython-311.pyc | Bin 0 -> 2825 bytes .../setuptools_build.cpython-311.pyc | Bin 0 -> 4890 bytes .../__pycache__/subprocess.cpython-311.pyc | Bin 0 -> 9917 bytes .../__pycache__/temp_dir.cpython-311.pyc | Bin 0 -> 13402 bytes .../__pycache__/unpacking.cpython-311.pyc | Bin 0 -> 12914 bytes .../utils/__pycache__/urls.cpython-311.pyc | Bin 0 -> 2710 bytes .../__pycache__/virtualenv.cpython-311.pyc | Bin 0 -> 4958 bytes .../utils/__pycache__/wheel.cpython-311.pyc | Bin 0 -> 7046 bytes .../pip/_internal/utils/_jaraco_text.py | 109 + .../site-packages/pip/_internal/utils/_log.py | 39 + .../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 | 120 + .../pip/_internal/utils/direct_url_helpers.py | 87 + .../pip/_internal/utils/egg_link.py | 80 + .../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 | 165 + .../pip/_internal/utils/logging.py | 360 + .../site-packages/pip/_internal/utils/misc.py | 798 ++ .../pip/_internal/utils/models.py | 47 + .../pip/_internal/utils/packaging.py | 57 + .../pip/_internal/utils/setuptools_build.py | 146 + .../pip/_internal/utils/subprocess.py | 262 + .../pip/_internal/utils/temp_dir.py | 311 + .../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 | 134 + .../pip/_internal/vcs/__init__.py | 15 + .../vcs/__pycache__/__init__.cpython-311.pyc | Bin 0 -> 653 bytes .../vcs/__pycache__/bazaar.cpython-311.pyc | Bin 0 -> 5878 bytes .../vcs/__pycache__/git.cpython-311.pyc | Bin 0 -> 21393 bytes .../vcs/__pycache__/mercurial.cpython-311.pyc | Bin 0 -> 8746 bytes .../__pycache__/subversion.cpython-311.pyc | Bin 0 -> 14621 bytes .../versioncontrol.cpython-311.pyc | Bin 0 -> 31785 bytes .../site-packages/pip/_internal/vcs/bazaar.py | 120 + .../site-packages/pip/_internal/vcs/git.py | 547 ++ .../pip/_internal/vcs/mercurial.py | 173 + .../pip/_internal/vcs/subversion.py | 340 + .../pip/_internal/vcs/versioncontrol.py | 748 ++ .../pip/_internal/wheel_builder.py | 354 + .../site-packages/pip/_vendor/__init__.py | 121 + .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 5681 bytes .../_vendor/__pycache__/six.cpython-311.pyc | Bin 0 -> 46433 bytes .../typing_extensions.cpython-311.pyc | Bin 0 -> 131603 bytes .../pip/_vendor/cachecontrol/__init__.py | 28 + .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 997 bytes .../__pycache__/_cmd.cpython-311.pyc | Bin 0 -> 3048 bytes .../__pycache__/adapter.cpython-311.pyc | Bin 0 -> 6924 bytes .../__pycache__/cache.cpython-311.pyc | Bin 0 -> 4521 bytes .../__pycache__/controller.cpython-311.pyc | Bin 0 -> 18274 bytes .../__pycache__/filewrapper.cpython-311.pyc | Bin 0 -> 4777 bytes .../__pycache__/heuristics.cpython-311.pyc | Bin 0 -> 7580 bytes .../__pycache__/serialize.cpython-311.pyc | Bin 0 -> 7056 bytes .../__pycache__/wrapper.cpython-311.pyc | Bin 0 -> 1889 bytes .../pip/_vendor/cachecontrol/_cmd.py | 70 + .../pip/_vendor/cachecontrol/adapter.py | 166 + .../pip/_vendor/cachecontrol/cache.py | 84 + .../_vendor/cachecontrol/caches/__init__.py | 8 + .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 498 bytes .../__pycache__/file_cache.cpython-311.pyc | Bin 0 -> 9004 bytes .../__pycache__/redis_cache.cpython-311.pyc | Bin 0 -> 3105 bytes .../_vendor/cachecontrol/caches/file_cache.py | 192 + .../cachecontrol/caches/redis_cache.py | 54 + .../pip/_vendor/cachecontrol/controller.py | 505 + .../pip/_vendor/cachecontrol/filewrapper.py | 125 + .../pip/_vendor/cachecontrol/heuristics.py | 163 + .../pip/_vendor/cachecontrol/py.typed | 0 .../pip/_vendor/cachecontrol/serialize.py | 215 + .../pip/_vendor/cachecontrol/wrapper.py | 43 + .../pip/_vendor/certifi/__init__.py | 4 + .../pip/_vendor/certifi/__main__.py | 12 + .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 360 bytes .../__pycache__/__main__.cpython-311.pyc | Bin 0 -> 761 bytes .../certifi/__pycache__/core.cpython-311.pyc | Bin 0 -> 3383 bytes .../pip/_vendor/certifi/cacert.pem | 4635 +++++++++ .../site-packages/pip/_vendor/certifi/core.py | 115 + .../pip/_vendor/certifi/py.typed | 0 .../pip/_vendor/chardet/__init__.py | 115 + .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 5092 bytes .../__pycache__/big5freq.cpython-311.pyc | Bin 0 -> 27222 bytes .../__pycache__/big5prober.cpython-311.pyc | Bin 0 -> 1697 bytes .../chardistribution.cpython-311.pyc | Bin 0 -> 11289 bytes .../charsetgroupprober.cpython-311.pyc | Bin 0 -> 4319 bytes .../__pycache__/charsetprober.cpython-311.pyc | Bin 0 -> 5565 bytes .../codingstatemachine.cpython-311.pyc | Bin 0 -> 4016 bytes .../codingstatemachinedict.cpython-311.pyc | Bin 0 -> 972 bytes .../__pycache__/cp949prober.cpython-311.pyc | Bin 0 -> 1706 bytes .../chardet/__pycache__/enums.cpython-311.pyc | Bin 0 -> 3407 bytes .../__pycache__/escprober.cpython-311.pyc | Bin 0 -> 4923 bytes .../chardet/__pycache__/escsm.cpython-311.pyc | Bin 0 -> 12662 bytes .../__pycache__/eucjpprober.cpython-311.pyc | Bin 0 -> 4749 bytes .../__pycache__/euckrfreq.cpython-311.pyc | Bin 0 -> 12105 bytes .../__pycache__/euckrprober.cpython-311.pyc | Bin 0 -> 1698 bytes .../__pycache__/euctwfreq.cpython-311.pyc | Bin 0 -> 27227 bytes .../__pycache__/euctwprober.cpython-311.pyc | Bin 0 -> 1698 bytes .../__pycache__/gb2312freq.cpython-311.pyc | Bin 0 -> 19149 bytes .../__pycache__/gb2312prober.cpython-311.pyc | Bin 0 -> 1713 bytes .../__pycache__/hebrewprober.cpython-311.pyc | Bin 0 -> 5702 bytes .../__pycache__/jisfreq.cpython-311.pyc | Bin 0 -> 22178 bytes .../__pycache__/johabfreq.cpython-311.pyc | Bin 0 -> 84682 bytes .../__pycache__/johabprober.cpython-311.pyc | Bin 0 -> 1704 bytes .../__pycache__/jpcntx.cpython-311.pyc | Bin 0 -> 40186 bytes .../langbulgarianmodel.cpython-311.pyc | Bin 0 -> 85856 bytes .../langgreekmodel.cpython-311.pyc | Bin 0 -> 79278 bytes .../langhebrewmodel.cpython-311.pyc | Bin 0 -> 80040 bytes .../langhungarianmodel.cpython-311.pyc | Bin 0 -> 85810 bytes .../langrussianmodel.cpython-311.pyc | Bin 0 -> 108757 bytes .../__pycache__/langthaimodel.cpython-311.pyc | Bin 0 -> 80218 bytes .../langturkishmodel.cpython-311.pyc | Bin 0 -> 80057 bytes .../__pycache__/latin1prober.cpython-311.pyc | Bin 0 -> 7353 bytes .../macromanprober.cpython-311.pyc | Bin 0 -> 7520 bytes .../mbcharsetprober.cpython-311.pyc | Bin 0 -> 4141 bytes .../mbcsgroupprober.cpython-311.pyc | Bin 0 -> 2011 bytes .../__pycache__/mbcssm.cpython-311.pyc | Bin 0 -> 31751 bytes .../__pycache__/resultdict.cpython-311.pyc | Bin 0 -> 790 bytes .../sbcharsetprober.cpython-311.pyc | Bin 0 -> 6416 bytes .../sbcsgroupprober.cpython-311.pyc | Bin 0 -> 2961 bytes .../__pycache__/sjisprober.cpython-311.pyc | Bin 0 -> 4854 bytes .../universaldetector.cpython-311.pyc | Bin 0 -> 12482 bytes .../__pycache__/utf1632prober.cpython-311.pyc | Bin 0 -> 10602 bytes .../__pycache__/utf8prober.cpython-311.pyc | Bin 0 -> 3489 bytes .../__pycache__/version.cpython-311.pyc | Bin 0 -> 525 bytes .../pip/_vendor/chardet/big5freq.py | 386 + .../pip/_vendor/chardet/big5prober.py | 50 + .../pip/_vendor/chardet/chardistribution.py | 281 + .../pip/_vendor/chardet/charsetgroupprober.py | 112 + .../pip/_vendor/chardet/charsetprober.py | 157 + .../pip/_vendor/chardet/cli/__init__.py | 0 .../cli/__pycache__/__init__.cpython-311.pyc | Bin 0 -> 222 bytes .../__pycache__/chardetect.cpython-311.pyc | Bin 0 -> 4361 bytes .../pip/_vendor/chardet/cli/chardetect.py | 113 + .../pip/_vendor/chardet/codingstatemachine.py | 96 + .../_vendor/chardet/codingstatemachinedict.py | 19 + .../pip/_vendor/chardet/cp949prober.py | 52 + .../pip/_vendor/chardet/enums.py | 86 + .../pip/_vendor/chardet/escprober.py | 108 + .../pip/_vendor/chardet/escsm.py | 261 + .../pip/_vendor/chardet/eucjpprober.py | 108 + .../pip/_vendor/chardet/euckrfreq.py | 196 + .../pip/_vendor/chardet/euckrprober.py | 50 + .../pip/_vendor/chardet/euctwfreq.py | 388 + .../pip/_vendor/chardet/euctwprober.py | 50 + .../pip/_vendor/chardet/gb2312freq.py | 284 + .../pip/_vendor/chardet/gb2312prober.py | 50 + .../pip/_vendor/chardet/hebrewprober.py | 325 + .../pip/_vendor/chardet/jisfreq.py | 325 + .../pip/_vendor/chardet/johabfreq.py | 2382 +++++ .../pip/_vendor/chardet/johabprober.py | 50 + .../pip/_vendor/chardet/jpcntx.py | 248 + .../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 | 153 + .../pip/_vendor/chardet/macromanprober.py | 168 + .../pip/_vendor/chardet/mbcharsetprober.py | 99 + .../pip/_vendor/chardet/mbcsgroupprober.py | 58 + .../pip/_vendor/chardet/mbcssm.py | 661 ++ .../pip/_vendor/chardet/metadata/__init__.py | 0 .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 227 bytes .../__pycache__/languages.cpython-311.pyc | Bin 0 -> 10827 bytes .../pip/_vendor/chardet/metadata/languages.py | 354 + .../pip/_vendor/chardet/py.typed | 0 .../pip/_vendor/chardet/resultdict.py | 16 + .../pip/_vendor/chardet/sbcharsetprober.py | 168 + .../pip/_vendor/chardet/sbcsgroupprober.py | 89 + .../pip/_vendor/chardet/sjisprober.py | 111 + .../pip/_vendor/chardet/universaldetector.py | 369 + .../pip/_vendor/chardet/utf1632prober.py | 240 + .../pip/_vendor/chardet/utf8prober.py | 88 + .../pip/_vendor/chardet/version.py | 9 + .../pip/_vendor/colorama/__init__.py | 7 + .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 594 bytes .../colorama/__pycache__/ansi.cpython-311.pyc | Bin 0 -> 4592 bytes .../__pycache__/ansitowin32.cpython-311.pyc | Bin 0 -> 16238 bytes .../__pycache__/initialise.cpython-311.pyc | Bin 0 -> 3955 bytes .../__pycache__/win32.cpython-311.pyc | Bin 0 -> 7943 bytes .../__pycache__/winterm.cpython-311.pyc | Bin 0 -> 9169 bytes .../pip/_vendor/colorama/ansi.py | 108 + .../pip/_vendor/colorama/ansitowin32.py | 298 + .../pip/_vendor/colorama/initialise.py | 121 + .../pip/_vendor/colorama/tests/__init__.py | 1 + .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 225 bytes .../__pycache__/ansi_test.cpython-311.pyc | Bin 0 -> 5870 bytes .../ansitowin32_test.cpython-311.pyc | Bin 0 -> 21537 bytes .../initialise_test.cpython-311.pyc | Bin 0 -> 14164 bytes .../__pycache__/isatty_test.cpython-311.pyc | Bin 0 -> 6729 bytes .../tests/__pycache__/utils.cpython-311.pyc | Bin 0 -> 2904 bytes .../__pycache__/winterm_test.cpython-311.pyc | Bin 0 -> 7257 bytes .../pip/_vendor/colorama/tests/ansi_test.py | 81 + .../colorama/tests/ansitowin32_test.py | 319 + .../_vendor/colorama/tests/initialise_test.py | 207 + .../pip/_vendor/colorama/tests/isatty_test.py | 64 + .../pip/_vendor/colorama/tests/utils.py | 51 + .../_vendor/colorama/tests/winterm_test.py | 139 + .../pip/_vendor/colorama/win32.py | 191 + .../pip/_vendor/colorama/winterm.py | 210 + .../pip/_vendor/distlib/__init__.py | 36 + .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 1487 bytes .../__pycache__/compat.cpython-311.pyc | Bin 0 -> 52424 bytes .../__pycache__/database.cpython-311.pyc | Bin 0 -> 72205 bytes .../distlib/__pycache__/index.cpython-311.pyc | Bin 0 -> 26686 bytes .../__pycache__/locators.cpython-311.pyc | Bin 0 -> 65811 bytes .../__pycache__/manifest.cpython-311.pyc | Bin 0 -> 17036 bytes .../__pycache__/markers.cpython-311.pyc | Bin 0 -> 8570 bytes .../__pycache__/metadata.cpython-311.pyc | Bin 0 -> 47451 bytes .../__pycache__/resources.cpython-311.pyc | Bin 0 -> 19012 bytes .../__pycache__/scripts.cpython-311.pyc | Bin 0 -> 21264 bytes .../distlib/__pycache__/util.cpython-311.pyc | Bin 0 -> 98215 bytes .../__pycache__/version.cpython-311.pyc | Bin 0 -> 34834 bytes .../distlib/__pycache__/wheel.cpython-311.pyc | Bin 0 -> 59497 bytes .../pip/_vendor/distlib/compat.py | 1221 +++ .../pip/_vendor/distlib/database.py | 1429 +++ .../pip/_vendor/distlib/index.py | 526 + .../pip/_vendor/distlib/locators.py | 1360 +++ .../pip/_vendor/distlib/manifest.py | 397 + .../pip/_vendor/distlib/markers.py | 169 + .../pip/_vendor/distlib/metadata.py | 1121 +++ .../pip/_vendor/distlib/resources.py | 389 + .../pip/_vendor/distlib/scripts.py | 469 + .../site-packages/pip/_vendor/distlib/t32.exe | Bin 0 -> 97792 bytes .../pip/_vendor/distlib/t64-arm.exe | Bin 0 -> 182784 bytes .../site-packages/pip/_vendor/distlib/t64.exe | Bin 0 -> 108032 bytes .../site-packages/pip/_vendor/distlib/util.py | 2114 ++++ .../pip/_vendor/distlib/version.py | 797 ++ .../site-packages/pip/_vendor/distlib/w32.exe | Bin 0 -> 91648 bytes .../pip/_vendor/distlib/w64-arm.exe | Bin 0 -> 168448 bytes .../site-packages/pip/_vendor/distlib/w64.exe | Bin 0 -> 101888 bytes .../pip/_vendor/distlib/wheel.py | 1137 +++ .../pip/_vendor/distro/__init__.py | 54 + .../pip/_vendor/distro/__main__.py | 4 + .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 1216 bytes .../__pycache__/__main__.cpython-311.pyc | Bin 0 -> 350 bytes .../distro/__pycache__/distro.cpython-311.pyc | Bin 0 -> 57749 bytes .../pip/_vendor/distro/distro.py | 1437 +++ .../site-packages/pip/_vendor/distro/py.typed | 0 .../pip/_vendor/idna/__init__.py | 44 + .../idna/__pycache__/__init__.cpython-311.pyc | Bin 0 -> 1117 bytes .../idna/__pycache__/codec.cpython-311.pyc | Bin 0 -> 5408 bytes .../idna/__pycache__/compat.cpython-311.pyc | Bin 0 -> 1034 bytes .../idna/__pycache__/core.cpython-311.pyc | Bin 0 -> 19469 bytes .../idna/__pycache__/idnadata.cpython-311.pyc | Bin 0 -> 38993 bytes .../__pycache__/intranges.cpython-311.pyc | Bin 0 -> 3002 bytes .../__pycache__/package_data.cpython-311.pyc | Bin 0 -> 237 bytes .../__pycache__/uts46data.cpython-311.pyc | Bin 0 -> 163217 bytes .../site-packages/pip/_vendor/idna/codec.py | 116 + .../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 + .../site-packages/pip/_vendor/idna/py.typed | 0 .../pip/_vendor/idna/uts46data.py | 8600 +++++++++++++++++ .../pip/_vendor/msgpack/__init__.py | 57 + .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 2096 bytes .../__pycache__/exceptions.cpython-311.pyc | Bin 0 -> 2397 bytes .../msgpack/__pycache__/ext.cpython-311.pyc | Bin 0 -> 9182 bytes .../__pycache__/fallback.cpython-311.pyc | Bin 0 -> 47169 bytes .../pip/_vendor/msgpack/exceptions.py | 50 + .../site-packages/pip/_vendor/msgpack/ext.py | 208 + .../pip/_vendor/msgpack/fallback.py | 1055 ++ .../pip/_vendor/packaging/__about__.py | 26 + .../pip/_vendor/packaging/__init__.py | 25 + .../__pycache__/__about__.cpython-311.pyc | Bin 0 -> 661 bytes .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 582 bytes .../__pycache__/_manylinux.cpython-311.pyc | Bin 0 -> 13248 bytes .../__pycache__/_musllinux.cpython-311.pyc | Bin 0 -> 8016 bytes .../__pycache__/_structures.cpython-311.pyc | Bin 0 -> 3704 bytes .../__pycache__/markers.cpython-311.pyc | Bin 0 -> 16544 bytes .../__pycache__/requirements.cpython-311.pyc | Bin 0 -> 7659 bytes .../__pycache__/specifiers.cpython-311.pyc | Bin 0 -> 34382 bytes .../__pycache__/tags.cpython-311.pyc | Bin 0 -> 21367 bytes .../__pycache__/utils.cpython-311.pyc | Bin 0 -> 6702 bytes .../__pycache__/version.cpython-311.pyc | Bin 0 -> 21894 bytes .../pip/_vendor/packaging/_manylinux.py | 303 + .../pip/_vendor/packaging/_musllinux.py | 136 + .../pip/_vendor/packaging/_structures.py | 77 + .../pip/_vendor/packaging/markers.py | 315 + .../pip/_vendor/packaging/py.typed | 0 .../pip/_vendor/packaging/requirements.py | 149 + .../pip/_vendor/packaging/specifiers.py | 856 ++ .../pip/_vendor/packaging/tags.py | 495 + .../pip/_vendor/packaging/utils.py | 136 + .../pip/_vendor/packaging/version.py | 542 ++ .../pip/_vendor/pkg_resources/__init__.py | 3550 +++++++ .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 160162 bytes .../pip/_vendor/platformdirs/__init__.py | 566 ++ .../pip/_vendor/platformdirs/__main__.py | 53 + .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 17515 bytes .../__pycache__/__main__.cpython-311.pyc | Bin 0 -> 2295 bytes .../__pycache__/android.cpython-311.pyc | Bin 0 -> 10481 bytes .../__pycache__/api.cpython-311.pyc | Bin 0 -> 10574 bytes .../__pycache__/macos.cpython-311.pyc | Bin 0 -> 6086 bytes .../__pycache__/unix.cpython-311.pyc | Bin 0 -> 13792 bytes .../__pycache__/version.cpython-311.pyc | Bin 0 -> 332 bytes .../__pycache__/windows.cpython-311.pyc | Bin 0 -> 13960 bytes .../pip/_vendor/platformdirs/android.py | 224 + .../pip/_vendor/platformdirs/api.py | 255 + .../pip/_vendor/platformdirs/macos.py | 105 + .../pip/_vendor/platformdirs/py.typed | 0 .../pip/_vendor/platformdirs/unix.py | 243 + .../pip/_vendor/platformdirs/version.py | 4 + .../pip/_vendor/platformdirs/windows.py | 270 + .../pip/_vendor/pygments/__init__.py | 82 + .../pip/_vendor/pygments/__main__.py | 17 + .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 3851 bytes .../__pycache__/__main__.cpython-311.pyc | Bin 0 -> 800 bytes .../__pycache__/cmdline.cpython-311.pyc | Bin 0 -> 30311 bytes .../__pycache__/console.cpython-311.pyc | Bin 0 -> 3063 bytes .../__pycache__/filter.cpython-311.pyc | Bin 0 -> 3524 bytes .../__pycache__/formatter.cpython-311.pyc | Bin 0 -> 4839 bytes .../__pycache__/lexer.cpython-311.pyc | Bin 0 -> 42327 bytes .../__pycache__/modeline.cpython-311.pyc | Bin 0 -> 1743 bytes .../__pycache__/plugin.cpython-311.pyc | Bin 0 -> 3756 bytes .../__pycache__/regexopt.cpython-311.pyc | Bin 0 -> 5050 bytes .../__pycache__/scanner.cpython-311.pyc | Bin 0 -> 4905 bytes .../__pycache__/sphinxext.cpython-311.pyc | Bin 0 -> 12850 bytes .../__pycache__/style.cpython-311.pyc | Bin 0 -> 7443 bytes .../__pycache__/token.cpython-311.pyc | Bin 0 -> 7484 bytes .../__pycache__/unistring.cpython-311.pyc | Bin 0 -> 33857 bytes .../pygments/__pycache__/util.cpython-311.pyc | Bin 0 -> 15709 bytes .../pip/_vendor/pygments/cmdline.py | 673 ++ .../pip/_vendor/pygments/console.py | 70 + .../pip/_vendor/pygments/filter.py | 78 + .../pip/_vendor/pygments/filters/__init__.py | 959 ++ .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 40124 bytes .../pip/_vendor/pygments/formatter.py | 127 + .../_vendor/pygments/formatters/__init__.py | 159 + .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 7782 bytes .../__pycache__/_mapping.cpython-311.pyc | Bin 0 -> 4242 bytes .../__pycache__/bbcode.cpython-311.pyc | Bin 0 -> 4498 bytes .../__pycache__/groff.cpython-311.pyc | Bin 0 -> 7871 bytes .../__pycache__/html.cpython-311.pyc | Bin 0 -> 42660 bytes .../__pycache__/img.cpython-311.pyc | Bin 0 -> 28588 bytes .../__pycache__/irc.cpython-311.pyc | Bin 0 -> 6424 bytes .../__pycache__/latex.cpython-311.pyc | Bin 0 -> 21824 bytes .../__pycache__/other.cpython-311.pyc | Bin 0 -> 7652 bytes .../__pycache__/pangomarkup.cpython-311.pyc | Bin 0 -> 3196 bytes .../__pycache__/rtf.cpython-311.pyc | Bin 0 -> 6863 bytes .../__pycache__/svg.cpython-311.pyc | Bin 0 -> 9683 bytes .../__pycache__/terminal.cpython-311.pyc | Bin 0 -> 6062 bytes .../__pycache__/terminal256.cpython-311.pyc | Bin 0 -> 16428 bytes .../_vendor/pygments/formatters/_mapping.py | 23 + .../pip/_vendor/pygments/formatters/bbcode.py | 111 + .../pip/_vendor/pygments/formatters/groff.py | 177 + .../pip/_vendor/pygments/formatters/html.py | 1021 ++ .../pip/_vendor/pygments/formatters/img.py | 693 ++ .../pip/_vendor/pygments/formatters/irc.py | 157 + .../pip/_vendor/pygments/formatters/latex.py | 531 + .../pip/_vendor/pygments/formatters/other.py | 169 + .../pygments/formatters/pangomarkup.py | 85 + .../pip/_vendor/pygments/formatters/rtf.py | 151 + .../pip/_vendor/pygments/formatters/svg.py | 192 + .../_vendor/pygments/formatters/terminal.py | 132 + .../pygments/formatters/terminal256.py | 354 + .../pip/_vendor/pygments/lexer.py | 984 ++ .../pip/_vendor/pygments/lexers/__init__.py | 365 + .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 16368 bytes .../__pycache__/_mapping.cpython-311.pyc | Bin 0 -> 64810 bytes .../lexers/__pycache__/python.cpython-311.pyc | Bin 0 -> 43324 bytes .../pip/_vendor/pygments/lexers/_mapping.py | 559 ++ .../pip/_vendor/pygments/lexers/python.py | 1221 +++ .../pip/_vendor/pygments/modeline.py | 43 + .../pip/_vendor/pygments/plugin.py | 88 + .../pip/_vendor/pygments/regexopt.py | 91 + .../pip/_vendor/pygments/scanner.py | 112 + .../pip/_vendor/pygments/sphinxext.py | 225 + .../pip/_vendor/pygments/style.py | 204 + .../pip/_vendor/pygments/styles/__init__.py | 103 + .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 4699 bytes .../pip/_vendor/pygments/token.py | 220 + .../pip/_vendor/pygments/unistring.py | 153 + .../pip/_vendor/pygments/util.py | 333 + .../pip/_vendor/pyparsing/__init__.py | 325 + .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 8248 bytes .../__pycache__/actions.cpython-311.pyc | Bin 0 -> 9139 bytes .../__pycache__/common.cpython-311.pyc | Bin 0 -> 14886 bytes .../__pycache__/core.cpython-311.pyc | Bin 0 -> 295459 bytes .../__pycache__/exceptions.cpython-311.pyc | Bin 0 -> 13726 bytes .../__pycache__/helpers.cpython-311.pyc | Bin 0 -> 54145 bytes .../__pycache__/results.cpython-311.pyc | Bin 0 -> 37866 bytes .../__pycache__/testing.cpython-311.pyc | Bin 0 -> 19529 bytes .../__pycache__/unicode.cpython-311.pyc | Bin 0 -> 15217 bytes .../__pycache__/util.cpython-311.pyc | Bin 0 -> 16800 bytes .../pip/_vendor/pyparsing/actions.py | 222 + .../pip/_vendor/pyparsing/common.py | 437 + .../pip/_vendor/pyparsing/core.py | 6423 ++++++++++++ .../pip/_vendor/pyparsing/diagram/__init__.py | 673 ++ .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 28808 bytes .../pip/_vendor/pyparsing/exceptions.py | 315 + .../pip/_vendor/pyparsing/helpers.py | 1117 +++ .../pip/_vendor/pyparsing/py.typed | 0 .../pip/_vendor/pyparsing/results.py | 850 ++ .../pip/_vendor/pyparsing/testing.py | 343 + .../pip/_vendor/pyparsing/unicode.py | 371 + .../pip/_vendor/pyparsing/util.py | 304 + .../pip/_vendor/pyproject_hooks/__init__.py | 24 + .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 725 bytes .../__pycache__/_compat.cpython-311.pyc | Bin 0 -> 423 bytes .../__pycache__/_impl.cpython-311.pyc | Bin 0 -> 16689 bytes .../pip/_vendor/pyproject_hooks/_compat.py | 8 + .../pip/_vendor/pyproject_hooks/_impl.py | 346 + .../pyproject_hooks/_in_process/__init__.py | 20 + .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 1185 bytes .../__pycache__/_in_process.cpython-311.pyc | Bin 0 -> 16507 bytes .../_in_process/_in_process.py | 359 + .../pip/_vendor/requests/__init__.py | 182 + .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 6456 bytes .../__pycache__/__version__.cpython-311.pyc | Bin 0 -> 606 bytes .../_internal_utils.cpython-311.pyc | Bin 0 -> 2170 bytes .../__pycache__/adapters.cpython-311.pyc | Bin 0 -> 23223 bytes .../requests/__pycache__/api.cpython-311.pyc | Bin 0 -> 7523 bytes .../requests/__pycache__/auth.cpython-311.pyc | Bin 0 -> 14650 bytes .../__pycache__/certs.cpython-311.pyc | Bin 0 -> 1002 bytes .../__pycache__/compat.cpython-311.pyc | Bin 0 -> 1828 bytes .../__pycache__/cookies.cpython-311.pyc | Bin 0 -> 27130 bytes .../__pycache__/exceptions.cpython-311.pyc | Bin 0 -> 8545 bytes .../requests/__pycache__/help.cpython-311.pyc | Bin 0 -> 4540 bytes .../__pycache__/hooks.cpython-311.pyc | Bin 0 -> 1270 bytes .../__pycache__/models.cpython-311.pyc | Bin 0 -> 38801 bytes .../__pycache__/packages.cpython-311.pyc | Bin 0 -> 850 bytes .../__pycache__/sessions.cpython-311.pyc | Bin 0 -> 29713 bytes .../__pycache__/status_codes.cpython-311.pyc | Bin 0 -> 6257 bytes .../__pycache__/structures.cpython-311.pyc | Bin 0 -> 6242 bytes .../__pycache__/utils.cpython-311.pyc | Bin 0 -> 40276 bytes .../pip/_vendor/requests/__version__.py | 14 + .../pip/_vendor/requests/_internal_utils.py | 50 + .../pip/_vendor/requests/adapters.py | 556 ++ .../site-packages/pip/_vendor/requests/api.py | 158 + .../pip/_vendor/requests/auth.py | 333 + .../pip/_vendor/requests/certs.py | 25 + .../pip/_vendor/requests/compat.py | 67 + .../pip/_vendor/requests/cookies.py | 602 ++ .../pip/_vendor/requests/exceptions.py | 143 + .../pip/_vendor/requests/help.py | 131 + .../pip/_vendor/requests/hooks.py | 33 + .../pip/_vendor/requests/models.py | 1078 +++ .../pip/_vendor/requests/packages.py | 16 + .../pip/_vendor/requests/sessions.py | 862 ++ .../pip/_vendor/requests/status_codes.py | 129 + .../pip/_vendor/requests/structures.py | 113 + .../pip/_vendor/requests/utils.py | 1097 +++ .../pip/_vendor/resolvelib/__init__.py | 26 + .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 773 bytes .../__pycache__/providers.cpython-311.pyc | Bin 0 -> 7091 bytes .../__pycache__/reporters.cpython-311.pyc | Bin 0 -> 2855 bytes .../__pycache__/resolvers.cpython-311.pyc | Bin 0 -> 29255 bytes .../__pycache__/structs.cpython-311.pyc | Bin 0 -> 11492 bytes .../pip/_vendor/resolvelib/compat/__init__.py | 0 .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 228 bytes .../collections_abc.cpython-311.pyc | Bin 0 -> 503 bytes .../resolvelib/compat/collections_abc.py | 6 + .../pip/_vendor/resolvelib/providers.py | 140 + .../pip/_vendor/resolvelib/py.typed | 0 .../pip/_vendor/resolvelib/reporters.py | 51 + .../pip/_vendor/resolvelib/resolvers.py | 570 ++ .../pip/_vendor/resolvelib/structs.py | 197 + .../pip/_vendor/rich/__init__.py | 180 + .../pip/_vendor/rich/__main__.py | 277 + .../rich/__pycache__/__init__.cpython-311.pyc | Bin 0 -> 7516 bytes .../rich/__pycache__/__main__.cpython-311.pyc | Bin 0 -> 11594 bytes .../__pycache__/_cell_widths.cpython-311.pyc | Bin 0 -> 7855 bytes .../__pycache__/_emoji_codes.cpython-311.pyc | Bin 0 -> 208542 bytes .../_emoji_replace.cpython-311.pyc | Bin 0 -> 1954 bytes .../_export_format.cpython-311.pyc | Bin 0 -> 2345 bytes .../__pycache__/_extension.cpython-311.pyc | Bin 0 -> 655 bytes .../rich/__pycache__/_fileno.cpython-311.pyc | Bin 0 -> 997 bytes .../rich/__pycache__/_inspect.cpython-311.pyc | Bin 0 -> 14207 bytes .../__pycache__/_log_render.cpython-311.pyc | Bin 0 -> 4789 bytes .../rich/__pycache__/_loop.cpython-311.pyc | Bin 0 -> 2135 bytes .../__pycache__/_null_file.cpython-311.pyc | Bin 0 -> 4194 bytes .../__pycache__/_palettes.cpython-311.pyc | Bin 0 -> 5271 bytes .../rich/__pycache__/_pick.cpython-311.pyc | Bin 0 -> 815 bytes .../rich/__pycache__/_ratio.cpython-311.pyc | Bin 0 -> 7954 bytes .../__pycache__/_spinners.cpython-311.pyc | Bin 0 -> 13704 bytes .../rich/__pycache__/_stack.cpython-311.pyc | Bin 0 -> 1150 bytes .../rich/__pycache__/_timer.cpython-311.pyc | Bin 0 -> 1003 bytes .../_win32_console.cpython-311.pyc | Bin 0 -> 30191 bytes .../rich/__pycache__/_windows.cpython-311.pyc | Bin 0 -> 2850 bytes .../_windows_renderer.cpython-311.pyc | Bin 0 -> 4041 bytes .../rich/__pycache__/_wrap.cpython-311.pyc | Bin 0 -> 2806 bytes .../rich/__pycache__/abc.cpython-311.pyc | Bin 0 -> 1947 bytes .../rich/__pycache__/align.cpython-311.pyc | Bin 0 -> 13489 bytes .../rich/__pycache__/ansi.cpython-311.pyc | Bin 0 -> 10520 bytes .../rich/__pycache__/bar.cpython-311.pyc | Bin 0 -> 4569 bytes .../rich/__pycache__/box.cpython-311.pyc | Bin 0 -> 13011 bytes .../rich/__pycache__/cells.cpython-311.pyc | Bin 0 -> 6641 bytes .../rich/__pycache__/color.cpython-311.pyc | Bin 0 -> 27825 bytes .../__pycache__/color_triplet.cpython-311.pyc | Bin 0 -> 1895 bytes .../rich/__pycache__/columns.cpython-311.pyc | Bin 0 -> 10666 bytes .../rich/__pycache__/console.cpython-311.pyc | Bin 0 -> 123761 bytes .../__pycache__/constrain.cpython-311.pyc | Bin 0 -> 2487 bytes .../__pycache__/containers.cpython-311.pyc | Bin 0 -> 10828 bytes .../rich/__pycache__/control.cpython-311.pyc | Bin 0 -> 11919 bytes .../default_styles.cpython-311.pyc | Bin 0 -> 12622 bytes .../rich/__pycache__/diagnose.cpython-311.pyc | Bin 0 -> 1842 bytes .../rich/__pycache__/emoji.cpython-311.pyc | Bin 0 -> 4820 bytes .../rich/__pycache__/errors.cpython-311.pyc | Bin 0 -> 2351 bytes .../__pycache__/file_proxy.cpython-311.pyc | Bin 0 -> 4055 bytes .../rich/__pycache__/filesize.cpython-311.pyc | Bin 0 -> 3323 bytes .../__pycache__/highlighter.cpython-311.pyc | Bin 0 -> 11009 bytes .../rich/__pycache__/json.cpython-311.pyc | Bin 0 -> 6566 bytes .../rich/__pycache__/jupyter.cpython-311.pyc | Bin 0 -> 6426 bytes .../rich/__pycache__/layout.cpython-311.pyc | Bin 0 -> 23333 bytes .../rich/__pycache__/live.cpython-311.pyc | Bin 0 -> 21319 bytes .../__pycache__/live_render.cpython-311.pyc | Bin 0 -> 5167 bytes .../rich/__pycache__/logging.cpython-311.pyc | Bin 0 -> 14538 bytes .../rich/__pycache__/markup.cpython-311.pyc | Bin 0 -> 10460 bytes .../rich/__pycache__/measure.cpython-311.pyc | Bin 0 -> 7293 bytes .../rich/__pycache__/padding.cpython-311.pyc | Bin 0 -> 7509 bytes .../rich/__pycache__/pager.cpython-311.pyc | Bin 0 -> 2267 bytes .../rich/__pycache__/palette.cpython-311.pyc | Bin 0 -> 6000 bytes .../rich/__pycache__/panel.cpython-311.pyc | Bin 0 -> 12756 bytes .../rich/__pycache__/pretty.cpython-311.pyc | Bin 0 -> 44369 bytes .../rich/__pycache__/progress.cpython-311.pyc | Bin 0 -> 82636 bytes .../__pycache__/progress_bar.cpython-311.pyc | Bin 0 -> 11034 bytes .../rich/__pycache__/prompt.cpython-311.pyc | Bin 0 -> 16400 bytes .../rich/__pycache__/protocol.cpython-311.pyc | Bin 0 -> 2118 bytes .../rich/__pycache__/region.cpython-311.pyc | Bin 0 -> 681 bytes .../rich/__pycache__/repr.cpython-311.pyc | Bin 0 -> 7648 bytes .../rich/__pycache__/rule.cpython-311.pyc | Bin 0 -> 7187 bytes .../rich/__pycache__/scope.cpython-311.pyc | Bin 0 -> 4373 bytes .../rich/__pycache__/screen.cpython-311.pyc | Bin 0 -> 2796 bytes .../rich/__pycache__/segment.cpython-311.pyc | Bin 0 -> 31626 bytes .../rich/__pycache__/spinner.cpython-311.pyc | Bin 0 -> 6902 bytes .../rich/__pycache__/status.cpython-311.pyc | Bin 0 -> 6780 bytes .../rich/__pycache__/style.cpython-311.pyc | Bin 0 -> 35220 bytes .../rich/__pycache__/styled.cpython-311.pyc | Bin 0 -> 2461 bytes .../rich/__pycache__/syntax.cpython-311.pyc | Bin 0 -> 42671 bytes .../rich/__pycache__/table.cpython-311.pyc | Bin 0 -> 48822 bytes .../terminal_theme.cpython-311.pyc | Bin 0 -> 3727 bytes .../rich/__pycache__/text.cpython-311.pyc | Bin 0 -> 64979 bytes .../rich/__pycache__/theme.cpython-311.pyc | Bin 0 -> 7326 bytes .../rich/__pycache__/themes.cpython-311.pyc | Bin 0 -> 377 bytes .../__pycache__/traceback.cpython-311.pyc | Bin 0 -> 34589 bytes .../rich/__pycache__/tree.cpython-311.pyc | Bin 0 -> 12548 bytes .../pip/_vendor/rich/_cell_widths.py | 451 + .../pip/_vendor/rich/_emoji_codes.py | 3610 +++++++ .../pip/_vendor/rich/_emoji_replace.py | 35 + .../pip/_vendor/rich/_export_format.py | 76 + .../pip/_vendor/rich/_extension.py | 10 + .../site-packages/pip/_vendor/rich/_fileno.py | 24 + .../pip/_vendor/rich/_inspect.py | 278 + .../pip/_vendor/rich/_log_render.py | 96 + .../site-packages/pip/_vendor/rich/_loop.py | 43 + .../pip/_vendor/rich/_null_file.py | 88 + .../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 | 18 + .../site-packages/pip/_vendor/rich/_timer.py | 19 + .../pip/_vendor/rich/_win32_console.py | 690 ++ .../pip/_vendor/rich/_windows.py | 74 + .../pip/_vendor/rich/_windows_renderer.py | 56 + .../site-packages/pip/_vendor/rich/_wrap.py | 56 + .../site-packages/pip/_vendor/rich/abc.py | 34 + .../site-packages/pip/_vendor/rich/align.py | 325 + .../site-packages/pip/_vendor/rich/ansi.py | 244 + .../site-packages/pip/_vendor/rich/bar.py | 98 + .../site-packages/pip/_vendor/rich/box.py | 525 + .../site-packages/pip/_vendor/rich/cells.py | 154 + .../site-packages/pip/_vendor/rich/color.py | 639 ++ .../pip/_vendor/rich/color_triplet.py | 41 + .../site-packages/pip/_vendor/rich/columns.py | 191 + .../site-packages/pip/_vendor/rich/console.py | 2750 ++++++ .../pip/_vendor/rich/constrain.py | 40 + .../pip/_vendor/rich/containers.py | 185 + .../site-packages/pip/_vendor/rich/control.py | 238 + .../pip/_vendor/rich/default_styles.py | 190 + .../pip/_vendor/rich/diagnose.py | 37 + .../site-packages/pip/_vendor/rich/emoji.py | 101 + .../site-packages/pip/_vendor/rich/errors.py | 34 + .../pip/_vendor/rich/file_proxy.py | 63 + .../pip/_vendor/rich/filesize.py | 89 + .../pip/_vendor/rich/highlighter.py | 237 + .../site-packages/pip/_vendor/rich/json.py | 151 + .../site-packages/pip/_vendor/rich/jupyter.py | 105 + .../site-packages/pip/_vendor/rich/layout.py | 471 + .../site-packages/pip/_vendor/rich/live.py | 391 + .../pip/_vendor/rich/live_render.py | 118 + .../site-packages/pip/_vendor/rich/logging.py | 297 + .../site-packages/pip/_vendor/rich/markup.py | 250 + .../site-packages/pip/_vendor/rich/measure.py | 157 + .../site-packages/pip/_vendor/rich/padding.py | 147 + .../site-packages/pip/_vendor/rich/pager.py | 37 + .../site-packages/pip/_vendor/rich/palette.py | 106 + .../site-packages/pip/_vendor/rich/panel.py | 316 + .../site-packages/pip/_vendor/rich/pretty.py | 1025 ++ .../pip/_vendor/rich/progress.py | 1793 ++++ .../pip/_vendor/rich/progress_bar.py | 232 + .../site-packages/pip/_vendor/rich/prompt.py | 400 + .../pip/_vendor/rich/protocol.py | 42 + .../site-packages/pip/_vendor/rich/py.typed | 0 .../site-packages/pip/_vendor/rich/region.py | 10 + .../site-packages/pip/_vendor/rich/repr.py | 153 + .../site-packages/pip/_vendor/rich/rule.py | 135 + .../site-packages/pip/_vendor/rich/scope.py | 89 + .../site-packages/pip/_vendor/rich/screen.py | 56 + .../site-packages/pip/_vendor/rich/segment.py | 766 ++ .../site-packages/pip/_vendor/rich/spinner.py | 142 + .../site-packages/pip/_vendor/rich/status.py | 141 + .../site-packages/pip/_vendor/rich/style.py | 837 ++ .../site-packages/pip/_vendor/rich/styled.py | 45 + .../site-packages/pip/_vendor/rich/syntax.py | 984 ++ .../site-packages/pip/_vendor/rich/table.py | 1032 ++ .../pip/_vendor/rich/terminal_theme.py | 154 + .../site-packages/pip/_vendor/rich/text.py | 1370 +++ .../site-packages/pip/_vendor/rich/theme.py | 122 + .../site-packages/pip/_vendor/rich/themes.py | 5 + .../pip/_vendor/rich/traceback.py | 780 ++ .../site-packages/pip/_vendor/rich/tree.py | 256 + .../site-packages/pip/_vendor/six.py | 1053 ++ .../pip/_vendor/tenacity/__init__.py | 639 ++ .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 29068 bytes .../__pycache__/_asyncio.cpython-311.pyc | Bin 0 -> 5244 bytes .../__pycache__/_utils.cpython-311.pyc | Bin 0 -> 2584 bytes .../__pycache__/after.cpython-311.pyc | Bin 0 -> 1779 bytes .../__pycache__/before.cpython-311.pyc | Bin 0 -> 1613 bytes .../__pycache__/before_sleep.cpython-311.pyc | Bin 0 -> 2396 bytes .../tenacity/__pycache__/nap.cpython-311.pyc | Bin 0 -> 1587 bytes .../__pycache__/retry.cpython-311.pyc | Bin 0 -> 15963 bytes .../tenacity/__pycache__/stop.cpython-311.pyc | Bin 0 -> 6316 bytes .../__pycache__/tornadoweb.cpython-311.pyc | Bin 0 -> 2933 bytes .../tenacity/__pycache__/wait.cpython-311.pyc | Bin 0 -> 13322 bytes .../pip/_vendor/tenacity/_asyncio.py | 98 + .../pip/_vendor/tenacity/_utils.py | 76 + .../pip/_vendor/tenacity/after.py | 52 + .../pip/_vendor/tenacity/before.py | 47 + .../pip/_vendor/tenacity/before_sleep.py | 72 + .../site-packages/pip/_vendor/tenacity/nap.py | 45 + .../pip/_vendor/tenacity/py.typed | 0 .../pip/_vendor/tenacity/retry.py | 298 + .../pip/_vendor/tenacity/stop.py | 117 + .../pip/_vendor/tenacity/tornadoweb.py | 61 + .../pip/_vendor/tenacity/wait.py | 248 + .../pip/_vendor/tomli/__init__.py | 11 + .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 432 bytes .../tomli/__pycache__/_parser.cpython-311.pyc | Bin 0 -> 30871 bytes .../tomli/__pycache__/_re.cpython-311.pyc | Bin 0 -> 4511 bytes .../tomli/__pycache__/_types.cpython-311.pyc | Bin 0 -> 424 bytes .../pip/_vendor/tomli/_parser.py | 702 ++ .../site-packages/pip/_vendor/tomli/_re.py | 107 + .../site-packages/pip/_vendor/tomli/_types.py | 10 + .../site-packages/pip/_vendor/tomli/py.typed | 1 + .../pip/_vendor/truststore/__init__.py | 13 + .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 685 bytes .../__pycache__/_api.cpython-311.pyc | Bin 0 -> 16747 bytes .../__pycache__/_macos.cpython-311.pyc | Bin 0 -> 17427 bytes .../__pycache__/_openssl.cpython-311.pyc | Bin 0 -> 2366 bytes .../_ssl_constants.cpython-311.pyc | Bin 0 -> 1141 bytes .../__pycache__/_windows.cpython-311.pyc | Bin 0 -> 17269 bytes .../pip/_vendor/truststore/_api.py | 340 + .../pip/_vendor/truststore/_macos.py | 501 + .../pip/_vendor/truststore/_openssl.py | 67 + .../pip/_vendor/truststore/_ssl_constants.py | 31 + .../pip/_vendor/truststore/_windows.py | 554 ++ .../pip/_vendor/truststore/py.typed | 0 .../pip/_vendor/typing_extensions.py | 3277 +++++++ .../pip/_vendor/urllib3/__init__.py | 102 + .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 3730 bytes .../__pycache__/_collections.cpython-311.pyc | Bin 0 -> 18318 bytes .../__pycache__/_version.cpython-311.pyc | Bin 0 -> 240 bytes .../__pycache__/connection.cpython-311.pyc | Bin 0 -> 22086 bytes .../connectionpool.cpython-311.pyc | Bin 0 -> 38298 bytes .../__pycache__/exceptions.cpython-311.pyc | Bin 0 -> 16144 bytes .../__pycache__/fields.cpython-311.pyc | Bin 0 -> 11437 bytes .../__pycache__/filepost.cpython-311.pyc | Bin 0 -> 4518 bytes .../__pycache__/poolmanager.cpython-311.pyc | Bin 0 -> 21636 bytes .../__pycache__/request.cpython-311.pyc | Bin 0 -> 7689 bytes .../__pycache__/response.cpython-311.pyc | Bin 0 -> 36564 bytes .../pip/_vendor/urllib3/_collections.py | 368 + .../pip/_vendor/urllib3/_version.py | 2 + .../pip/_vendor/urllib3/connection.py | 594 ++ .../pip/_vendor/urllib3/connectionpool.py | 1156 +++ .../pip/_vendor/urllib3/contrib/__init__.py | 0 .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 226 bytes .../_appengine_environ.cpython-311.pyc | Bin 0 -> 1965 bytes .../__pycache__/appengine.cpython-311.pyc | Bin 0 -> 12172 bytes .../__pycache__/ntlmpool.cpython-311.pyc | Bin 0 -> 6249 bytes .../__pycache__/pyopenssl.cpython-311.pyc | Bin 0 -> 25758 bytes .../securetransport.cpython-311.pyc | Bin 0 -> 36864 bytes .../contrib/__pycache__/socks.cpython-311.pyc | Bin 0 -> 8110 bytes .../urllib3/contrib/_appengine_environ.py | 36 + .../contrib/_securetransport/__init__.py | 0 .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 243 bytes .../__pycache__/bindings.cpython-311.pyc | Bin 0 -> 16990 bytes .../__pycache__/low_level.cpython-311.pyc | Bin 0 -> 15627 bytes .../contrib/_securetransport/bindings.py | 519 + .../contrib/_securetransport/low_level.py | 397 + .../pip/_vendor/urllib3/contrib/appengine.py | 321 + .../pip/_vendor/urllib3/contrib/ntlmpool.py | 133 + .../pip/_vendor/urllib3/contrib/pyopenssl.py | 545 ++ .../urllib3/contrib/securetransport.py | 958 ++ .../pip/_vendor/urllib3/contrib/socks.py | 220 + .../pip/_vendor/urllib3/exceptions.py | 338 + .../pip/_vendor/urllib3/fields.py | 283 + .../pip/_vendor/urllib3/filepost.py | 98 + .../pip/_vendor/urllib3/packages/__init__.py | 0 .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 227 bytes .../packages/__pycache__/six.cpython-311.pyc | Bin 0 -> 46469 bytes .../urllib3/packages/backports/__init__.py | 0 .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 237 bytes .../__pycache__/makefile.cpython-311.pyc | Bin 0 -> 1984 bytes .../weakref_finalize.cpython-311.pyc | Bin 0 -> 8012 bytes .../urllib3/packages/backports/makefile.py | 51 + .../packages/backports/weakref_finalize.py | 165 + .../pip/_vendor/urllib3/packages/six.py | 1131 +++ .../pip/_vendor/urllib3/poolmanager.py | 554 ++ .../pip/_vendor/urllib3/request.py | 197 + .../pip/_vendor/urllib3/response.py | 922 ++ .../pip/_vendor/urllib3/util/__init__.py | 49 + .../util/__pycache__/__init__.cpython-311.pyc | Bin 0 -> 1429 bytes .../__pycache__/connection.cpython-311.pyc | Bin 0 -> 5156 bytes .../util/__pycache__/proxy.cpython-311.pyc | Bin 0 -> 1738 bytes .../util/__pycache__/queue.cpython-311.pyc | Bin 0 -> 1521 bytes .../util/__pycache__/request.cpython-311.pyc | Bin 0 -> 4641 bytes .../util/__pycache__/response.cpython-311.pyc | Bin 0 -> 3510 bytes .../util/__pycache__/retry.cpython-311.pyc | Bin 0 -> 22790 bytes .../util/__pycache__/ssl_.cpython-311.pyc | Bin 0 -> 16841 bytes .../ssl_match_hostname.cpython-311.pyc | Bin 0 -> 5820 bytes .../__pycache__/ssltransport.cpython-311.pyc | Bin 0 -> 11649 bytes .../util/__pycache__/timeout.cpython-311.pyc | Bin 0 -> 11363 bytes .../util/__pycache__/url.cpython-311.pyc | Bin 0 -> 17604 bytes .../util/__pycache__/wait.cpython-311.pyc | Bin 0 -> 5023 bytes .../pip/_vendor/urllib3/util/connection.py | 149 + .../pip/_vendor/urllib3/util/proxy.py | 57 + .../pip/_vendor/urllib3/util/queue.py | 26 + .../pip/_vendor/urllib3/util/request.py | 137 + .../pip/_vendor/urllib3/util/response.py | 111 + .../pip/_vendor/urllib3/util/retry.py | 646 ++ .../pip/_vendor/urllib3/util/ssl_.py | 502 + .../urllib3/util/ssl_match_hostname.py | 159 + .../pip/_vendor/urllib3/util/ssltransport.py | 246 + .../pip/_vendor/urllib3/util/timeout.py | 283 + .../pip/_vendor/urllib3/util/url.py | 442 + .../pip/_vendor/urllib3/util/wait.py | 155 + .../site-packages/pip/_vendor/vendor.txt | 24 + .../pip/_vendor/webencodings/__init__.py | 347 + .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 12903 bytes .../__pycache__/labels.cpython-311.pyc | Bin 0 -> 7303 bytes .../__pycache__/mklabels.cpython-311.pyc | Bin 0 -> 3231 bytes .../__pycache__/tests.cpython-311.pyc | Bin 0 -> 11209 bytes .../x_user_defined.cpython-311.pyc | Bin 0 -> 3583 bytes .../pip/_vendor/webencodings/labels.py | 231 + .../pip/_vendor/webencodings/mklabels.py | 59 + .../pip/_vendor/webencodings/tests.py | 154 + .../_vendor/webencodings/x_user_defined.py | 329 + .../lib/python3.11/site-packages/pip/py.typed | 4 + .../site-packages/pkg_resources/__init__.py | 3486 +++++++ .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 159592 bytes .../pkg_resources/_vendor/__init__.py | 0 .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 220 bytes .../__pycache__/appdirs.cpython-311.pyc | Bin 0 -> 29468 bytes .../_vendor/__pycache__/zipp.cpython-311.pyc | Bin 0 -> 16013 bytes .../pkg_resources/_vendor/appdirs.py | 616 ++ .../_vendor/importlib_resources/__init__.py | 36 + .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 854 bytes .../__pycache__/_adapters.cpython-311.pyc | Bin 0 -> 10771 bytes .../__pycache__/_common.cpython-311.pyc | Bin 0 -> 4298 bytes .../__pycache__/_compat.cpython-311.pyc | Bin 0 -> 5583 bytes .../__pycache__/_itertools.cpython-311.pyc | Bin 0 -> 1416 bytes .../__pycache__/_legacy.cpython-311.pyc | Bin 0 -> 6514 bytes .../__pycache__/abc.cpython-311.pyc | Bin 0 -> 7515 bytes .../__pycache__/readers.cpython-311.pyc | Bin 0 -> 8389 bytes .../__pycache__/simple.cpython-311.pyc | Bin 0 -> 6411 bytes .../_vendor/importlib_resources/_adapters.py | 198 + .../_vendor/importlib_resources/_common.py | 104 + .../_vendor/importlib_resources/_compat.py | 107 + .../_vendor/importlib_resources/_itertools.py | 35 + .../_vendor/importlib_resources/_legacy.py | 122 + .../_vendor/importlib_resources/abc.py | 155 + .../_vendor/importlib_resources/readers.py | 142 + .../_vendor/importlib_resources/simple.py | 133 + .../pkg_resources/_vendor/jaraco/__init__.py | 0 .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 227 bytes .../__pycache__/context.cpython-311.pyc | Bin 0 -> 9450 bytes .../__pycache__/functools.cpython-311.pyc | Bin 0 -> 20313 bytes .../pkg_resources/_vendor/jaraco/context.py | 223 + .../pkg_resources/_vendor/jaraco/functools.py | 548 ++ .../_vendor/jaraco/text/__init__.py | 629 ++ .../text/__pycache__/__init__.cpython-311.pyc | Bin 0 -> 26630 bytes .../_vendor/more_itertools/__init__.py | 4 + .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 321 bytes .../__pycache__/more.cpython-311.pyc | Bin 0 -> 167982 bytes .../__pycache__/recipes.cpython-311.pyc | Bin 0 -> 26973 bytes .../_vendor/more_itertools/more.py | 4393 +++++++++ .../_vendor/more_itertools/recipes.py | 701 ++ .../_vendor/packaging/__about__.py | 26 + .../_vendor/packaging/__init__.py | 25 + .../__pycache__/__about__.cpython-311.pyc | Bin 0 -> 671 bytes .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 592 bytes .../__pycache__/_manylinux.cpython-311.pyc | Bin 0 -> 13258 bytes .../__pycache__/_musllinux.cpython-311.pyc | Bin 0 -> 8026 bytes .../__pycache__/_structures.cpython-311.pyc | Bin 0 -> 3714 bytes .../__pycache__/markers.cpython-311.pyc | Bin 0 -> 16563 bytes .../__pycache__/requirements.cpython-311.pyc | Bin 0 -> 7678 bytes .../__pycache__/specifiers.cpython-311.pyc | Bin 0 -> 34392 bytes .../__pycache__/tags.cpython-311.pyc | Bin 0 -> 21377 bytes .../__pycache__/utils.cpython-311.pyc | Bin 0 -> 6712 bytes .../__pycache__/version.cpython-311.pyc | Bin 0 -> 21904 bytes .../_vendor/packaging/_manylinux.py | 303 + .../_vendor/packaging/_musllinux.py | 136 + .../_vendor/packaging/_structures.py | 77 + .../_vendor/packaging/markers.py | 315 + .../_vendor/packaging/requirements.py | 149 + .../_vendor/packaging/specifiers.py | 856 ++ .../pkg_resources/_vendor/packaging/tags.py | 495 + .../pkg_resources/_vendor/packaging/utils.py | 136 + .../_vendor/packaging/version.py | 542 ++ .../_vendor/pyparsing/__init__.py | 334 + .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 8365 bytes .../__pycache__/actions.cpython-311.pyc | Bin 0 -> 8491 bytes .../__pycache__/common.cpython-311.pyc | Bin 0 -> 14813 bytes .../__pycache__/core.cpython-311.pyc | Bin 0 -> 277665 bytes .../__pycache__/exceptions.cpython-311.pyc | Bin 0 -> 12955 bytes .../__pycache__/helpers.cpython-311.pyc | Bin 0 -> 53656 bytes .../__pycache__/results.cpython-311.pyc | Bin 0 -> 36339 bytes .../__pycache__/testing.cpython-311.pyc | Bin 0 -> 19535 bytes .../__pycache__/unicode.cpython-311.pyc | Bin 0 -> 15393 bytes .../__pycache__/util.cpython-311.pyc | Bin 0 -> 14292 bytes .../_vendor/pyparsing/actions.py | 212 + .../pkg_resources/_vendor/pyparsing/common.py | 429 + .../pkg_resources/_vendor/pyparsing/core.py | 6081 ++++++++++++ .../_vendor/pyparsing/diagram/__init__.py | 659 ++ .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 28028 bytes .../_vendor/pyparsing/exceptions.py | 280 + .../_vendor/pyparsing/helpers.py | 1106 +++ .../_vendor/pyparsing/results.py | 814 ++ .../_vendor/pyparsing/testing.py | 343 + .../_vendor/pyparsing/unicode.py | 361 + .../pkg_resources/_vendor/pyparsing/util.py | 253 + .../pkg_resources/_vendor/zipp.py | 355 + .../pkg_resources/extern/__init__.py | 84 + .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 4339 bytes .../setuptools-65.5.0.dist-info/INSTALLER | 1 + .../setuptools-65.5.0.dist-info/LICENSE | 19 + .../setuptools-65.5.0.dist-info/METADATA | 144 + .../setuptools-65.5.0.dist-info/RECORD | 466 + .../setuptools-65.5.0.dist-info/REQUESTED | 0 .../setuptools-65.5.0.dist-info/WHEEL | 5 + .../entry_points.txt | 57 + .../setuptools-65.5.0.dist-info/top_level.txt | 3 + .../site-packages/setuptools/__init__.py | 254 + .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 12929 bytes .../_deprecation_warning.cpython-311.pyc | Bin 0 -> 664 bytes .../__pycache__/_entry_points.cpython-311.pyc | Bin 0 -> 4813 bytes .../__pycache__/_imp.cpython-311.pyc | Bin 0 -> 3677 bytes .../__pycache__/_importlib.cpython-311.pyc | Bin 0 -> 1977 bytes .../__pycache__/_itertools.cpython-311.pyc | Bin 0 -> 1176 bytes .../__pycache__/_path.cpython-311.pyc | Bin 0 -> 1497 bytes .../__pycache__/_reqs.cpython-311.pyc | Bin 0 -> 1158 bytes .../__pycache__/archive_util.cpython-311.pyc | Bin 0 -> 10186 bytes .../__pycache__/build_meta.cpython-311.pyc | Bin 0 -> 28119 bytes .../__pycache__/dep_util.cpython-311.pyc | Bin 0 -> 1312 bytes .../__pycache__/depends.cpython-311.pyc | Bin 0 -> 7997 bytes .../__pycache__/discovery.cpython-311.pyc | Bin 0 -> 31141 bytes .../__pycache__/dist.cpython-311.pyc | Bin 0 -> 64078 bytes .../__pycache__/errors.cpython-311.pyc | Bin 0 -> 2973 bytes .../__pycache__/extension.cpython-311.pyc | Bin 0 -> 6829 bytes .../__pycache__/glob.cpython-311.pyc | Bin 0 -> 6586 bytes .../__pycache__/installer.cpython-311.pyc | Bin 0 -> 5636 bytes .../__pycache__/launch.cpython-311.pyc | Bin 0 -> 1552 bytes .../__pycache__/logging.cpython-311.pyc | Bin 0 -> 2070 bytes .../__pycache__/monkey.cpython-311.pyc | Bin 0 -> 7029 bytes .../__pycache__/msvc.cpython-311.pyc | Bin 0 -> 64202 bytes .../__pycache__/namespaces.cpython-311.pyc | Bin 0 -> 5684 bytes .../__pycache__/package_index.cpython-311.pyc | Bin 0 -> 60779 bytes .../__pycache__/py34compat.cpython-311.pyc | Bin 0 -> 739 bytes .../__pycache__/sandbox.cpython-311.pyc | Bin 0 -> 27355 bytes .../__pycache__/unicode_utils.cpython-311.pyc | Bin 0 -> 1841 bytes .../__pycache__/version.cpython-311.pyc | Bin 0 -> 459 bytes .../__pycache__/wheel.cpython-311.pyc | Bin 0 -> 15514 bytes .../windows_support.cpython-311.pyc | Bin 0 -> 1456 bytes .../setuptools/_deprecation_warning.py | 7 + .../setuptools/_distutils/__init__.py | 24 + .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 794 bytes .../__pycache__/_collections.cpython-311.pyc | Bin 0 -> 2944 bytes .../__pycache__/_functools.cpython-311.pyc | Bin 0 -> 885 bytes .../__pycache__/_macos_compat.cpython-311.pyc | Bin 0 -> 594 bytes .../__pycache__/_msvccompiler.cpython-311.pyc | Bin 0 -> 25129 bytes .../__pycache__/archive_util.cpython-311.pyc | Bin 0 -> 10681 bytes .../__pycache__/bcppcompiler.cpython-311.pyc | Bin 0 -> 13507 bytes .../__pycache__/ccompiler.cpython-311.pyc | Bin 0 -> 46406 bytes .../__pycache__/cmd.cpython-311.pyc | Bin 0 -> 18920 bytes .../__pycache__/config.cpython-311.pyc | Bin 0 -> 6069 bytes .../__pycache__/core.cpython-311.pyc | Bin 0 -> 10013 bytes .../cygwinccompiler.cpython-311.pyc | Bin 0 -> 13637 bytes .../__pycache__/debug.cpython-311.pyc | Bin 0 -> 346 bytes .../__pycache__/dep_util.cpython-311.pyc | Bin 0 -> 4013 bytes .../__pycache__/dir_util.cpython-311.pyc | Bin 0 -> 10388 bytes .../__pycache__/dist.cpython-311.pyc | Bin 0 -> 55435 bytes .../__pycache__/errors.cpython-311.pyc | Bin 0 -> 6819 bytes .../__pycache__/extension.cpython-311.pyc | Bin 0 -> 10200 bytes .../__pycache__/fancy_getopt.cpython-311.pyc | Bin 0 -> 17265 bytes .../__pycache__/file_util.cpython-311.pyc | Bin 0 -> 10708 bytes .../__pycache__/filelist.cpython-311.pyc | Bin 0 -> 17654 bytes .../__pycache__/log.cpython-311.pyc | Bin 0 -> 3954 bytes .../__pycache__/msvc9compiler.cpython-311.pyc | Bin 0 -> 33612 bytes .../__pycache__/msvccompiler.cpython-311.pyc | Bin 0 -> 27014 bytes .../__pycache__/py38compat.cpython-311.pyc | Bin 0 -> 646 bytes .../__pycache__/py39compat.cpython-311.pyc | Bin 0 -> 1014 bytes .../__pycache__/spawn.cpython-311.pyc | Bin 0 -> 4483 bytes .../__pycache__/sysconfig.cpython-311.pyc | Bin 0 -> 22010 bytes .../__pycache__/text_file.cpython-311.pyc | Bin 0 -> 11295 bytes .../__pycache__/unixccompiler.cpython-311.pyc | Bin 0 -> 16551 bytes .../__pycache__/util.cpython-311.pyc | Bin 0 -> 20905 bytes .../__pycache__/version.cpython-311.pyc | Bin 0 -> 11370 bytes .../versionpredicate.cpython-311.pyc | Bin 0 -> 7771 bytes .../setuptools/_distutils/_collections.py | 60 + .../setuptools/_distutils/_functools.py | 21 + .../setuptools/_distutils/_macos_compat.py | 12 + .../setuptools/_distutils/_msvccompiler.py | 588 ++ .../setuptools/_distutils/archive_util.py | 281 + .../setuptools/_distutils/bcppcompiler.py | 417 + .../setuptools/_distutils/ccompiler.py | 1278 +++ .../setuptools/_distutils/cmd.py | 466 + .../setuptools/_distutils/command/__init__.py | 25 + .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 566 bytes .../_framework_compat.cpython-311.pyc | Bin 0 -> 2807 bytes .../command/__pycache__/bdist.cpython-311.pyc | Bin 0 -> 6060 bytes .../__pycache__/bdist_dumb.cpython-311.pyc | Bin 0 -> 5785 bytes .../__pycache__/bdist_rpm.cpython-311.pyc | Bin 0 -> 23319 bytes .../command/__pycache__/build.cpython-311.pyc | Bin 0 -> 6115 bytes .../__pycache__/build_clib.cpython-311.pyc | Bin 0 -> 7818 bytes .../__pycache__/build_ext.cpython-311.pyc | Bin 0 -> 30360 bytes .../__pycache__/build_py.cpython-311.pyc | Bin 0 -> 17636 bytes .../__pycache__/build_scripts.cpython-311.pyc | Bin 0 -> 7887 bytes .../command/__pycache__/check.cpython-311.pyc | Bin 0 -> 7549 bytes .../command/__pycache__/clean.cpython-311.pyc | Bin 0 -> 3217 bytes .../__pycache__/config.cpython-311.pyc | Bin 0 -> 16280 bytes .../__pycache__/install.cpython-311.pyc | Bin 0 -> 29468 bytes .../__pycache__/install_data.cpython-311.pyc | Bin 0 -> 3802 bytes .../install_egg_info.cpython-311.pyc | Bin 0 -> 5228 bytes .../install_headers.cpython-311.pyc | Bin 0 -> 2385 bytes .../__pycache__/install_lib.cpython-311.pyc | Bin 0 -> 8717 bytes .../install_scripts.cpython-311.pyc | Bin 0 -> 3182 bytes .../__pycache__/py37compat.cpython-311.pyc | Bin 0 -> 1563 bytes .../__pycache__/register.cpython-311.pyc | Bin 0 -> 15549 bytes .../command/__pycache__/sdist.cpython-311.pyc | Bin 0 -> 23857 bytes .../__pycache__/upload.cpython-311.pyc | Bin 0 -> 10498 bytes .../_distutils/command/_framework_compat.py | 55 + .../setuptools/_distutils/command/bdist.py | 162 + .../_distutils/command/bdist_dumb.py | 148 + .../_distutils/command/bdist_rpm.py | 625 ++ .../setuptools/_distutils/command/build.py | 160 + .../_distutils/command/build_clib.py | 215 + .../_distutils/command/build_ext.py | 806 ++ .../setuptools/_distutils/command/build_py.py | 426 + .../_distutils/command/build_scripts.py | 182 + .../setuptools/_distutils/command/check.py | 160 + .../setuptools/_distutils/command/clean.py | 79 + .../setuptools/_distutils/command/config.py | 394 + .../setuptools/_distutils/command/install.py | 835 ++ .../_distutils/command/install_data.py | 89 + .../_distutils/command/install_egg_info.py | 96 + .../_distutils/command/install_headers.py | 50 + .../_distutils/command/install_lib.py | 248 + .../_distutils/command/install_scripts.py | 66 + .../_distutils/command/py37compat.py | 31 + .../setuptools/_distutils/command/register.py | 329 + .../setuptools/_distutils/command/sdist.py | 554 ++ .../setuptools/_distutils/command/upload.py | 209 + .../setuptools/_distutils/config.py | 147 + .../setuptools/_distutils/core.py | 291 + .../setuptools/_distutils/cygwinccompiler.py | 374 + .../setuptools/_distutils/debug.py | 5 + .../setuptools/_distutils/dep_util.py | 97 + .../setuptools/_distutils/dir_util.py | 243 + .../setuptools/_distutils/dist.py | 1351 +++ .../setuptools/_distutils/errors.py | 127 + .../setuptools/_distutils/extension.py | 253 + .../setuptools/_distutils/fancy_getopt.py | 485 + .../setuptools/_distutils/file_util.py | 249 + .../setuptools/_distutils/filelist.py | 385 + .../setuptools/_distutils/log.py | 88 + .../setuptools/_distutils/msvc9compiler.py | 854 ++ .../setuptools/_distutils/msvccompiler.py | 712 ++ .../setuptools/_distutils/py38compat.py | 8 + .../setuptools/_distutils/py39compat.py | 22 + .../setuptools/_distutils/spawn.py | 109 + .../setuptools/_distutils/sysconfig.py | 560 ++ .../setuptools/_distutils/text_file.py | 297 + .../setuptools/_distutils/unixccompiler.py | 411 + .../setuptools/_distutils/util.py | 514 + .../setuptools/_distutils/version.py | 372 + .../setuptools/_distutils/versionpredicate.py | 178 + .../site-packages/setuptools/_entry_points.py | 86 + .../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 -> 217 bytes .../__pycache__/ordered_set.cpython-311.pyc | Bin 0 -> 21803 bytes .../typing_extensions.cpython-311.pyc | Bin 0 -> 107634 bytes .../_vendor/__pycache__/zipp.cpython-311.pyc | Bin 0 -> 16010 bytes .../_vendor/importlib_metadata/__init__.py | 1142 +++ .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 58256 bytes .../__pycache__/_adapters.cpython-311.pyc | Bin 0 -> 3869 bytes .../__pycache__/_collections.cpython-311.pyc | Bin 0 -> 2216 bytes .../__pycache__/_compat.cpython-311.pyc | Bin 0 -> 2738 bytes .../__pycache__/_functools.cpython-311.pyc | Bin 0 -> 3656 bytes .../__pycache__/_itertools.cpython-311.pyc | Bin 0 -> 2619 bytes .../__pycache__/_meta.cpython-311.pyc | Bin 0 -> 3023 bytes .../__pycache__/_text.cpython-311.pyc | Bin 0 -> 4414 bytes .../_vendor/importlib_metadata/_adapters.py | 75 + .../importlib_metadata/_collections.py | 33 + .../_vendor/importlib_metadata/_compat.py | 73 + .../_vendor/importlib_metadata/_functools.py | 107 + .../_vendor/importlib_metadata/_itertools.py | 73 + .../_vendor/importlib_metadata/_meta.py | 58 + .../_vendor/importlib_metadata/_text.py | 109 + .../_vendor/importlib_resources/__init__.py | 36 + .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 851 bytes .../__pycache__/_adapters.cpython-311.pyc | Bin 0 -> 10768 bytes .../__pycache__/_common.cpython-311.pyc | Bin 0 -> 4295 bytes .../__pycache__/_compat.cpython-311.pyc | Bin 0 -> 5580 bytes .../__pycache__/_itertools.cpython-311.pyc | Bin 0 -> 1413 bytes .../__pycache__/_legacy.cpython-311.pyc | Bin 0 -> 6511 bytes .../__pycache__/abc.cpython-311.pyc | Bin 0 -> 7512 bytes .../__pycache__/readers.cpython-311.pyc | Bin 0 -> 8386 bytes .../__pycache__/simple.cpython-311.pyc | Bin 0 -> 6408 bytes .../_vendor/importlib_resources/_adapters.py | 198 + .../_vendor/importlib_resources/_common.py | 104 + .../_vendor/importlib_resources/_compat.py | 107 + .../_vendor/importlib_resources/_itertools.py | 35 + .../_vendor/importlib_resources/_legacy.py | 122 + .../_vendor/importlib_resources/abc.py | 155 + .../_vendor/importlib_resources/readers.py | 142 + .../_vendor/importlib_resources/simple.py | 133 + .../setuptools/_vendor/jaraco/__init__.py | 0 .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 224 bytes .../__pycache__/context.cpython-311.pyc | Bin 0 -> 9447 bytes .../__pycache__/functools.cpython-311.pyc | Bin 0 -> 20304 bytes .../setuptools/_vendor/jaraco/context.py | 223 + .../setuptools/_vendor/jaraco/functools.py | 548 ++ .../_vendor/jaraco/text/__init__.py | 629 ++ .../text/__pycache__/__init__.cpython-311.pyc | Bin 0 -> 26618 bytes .../_vendor/more_itertools/__init__.py | 4 + .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 317 bytes .../__pycache__/more.cpython-311.pyc | Bin 0 -> 149204 bytes .../__pycache__/recipes.cpython-311.pyc | Bin 0 -> 23786 bytes .../setuptools/_vendor/more_itertools/more.py | 3900 ++++++++ .../_vendor/more_itertools/recipes.py | 621 ++ .../setuptools/_vendor/ordered_set.py | 516 + .../setuptools/_vendor/packaging/__about__.py | 26 + .../setuptools/_vendor/packaging/__init__.py | 25 + .../__pycache__/__about__.cpython-311.pyc | Bin 0 -> 668 bytes .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 589 bytes .../__pycache__/_manylinux.cpython-311.pyc | Bin 0 -> 13255 bytes .../__pycache__/_musllinux.cpython-311.pyc | Bin 0 -> 8023 bytes .../__pycache__/_structures.cpython-311.pyc | Bin 0 -> 3711 bytes .../__pycache__/markers.cpython-311.pyc | Bin 0 -> 16557 bytes .../__pycache__/requirements.cpython-311.pyc | Bin 0 -> 7672 bytes .../__pycache__/specifiers.cpython-311.pyc | Bin 0 -> 34389 bytes .../__pycache__/tags.cpython-311.pyc | Bin 0 -> 21374 bytes .../__pycache__/utils.cpython-311.pyc | Bin 0 -> 6709 bytes .../__pycache__/version.cpython-311.pyc | Bin 0 -> 21901 bytes .../_vendor/packaging/_manylinux.py | 303 + .../_vendor/packaging/_musllinux.py | 136 + .../_vendor/packaging/_structures.py | 77 + .../setuptools/_vendor/packaging/markers.py | 315 + .../_vendor/packaging/requirements.py | 149 + .../_vendor/packaging/specifiers.py | 856 ++ .../setuptools/_vendor/packaging/tags.py | 495 + .../setuptools/_vendor/packaging/utils.py | 136 + .../setuptools/_vendor/packaging/version.py | 542 ++ .../setuptools/_vendor/pyparsing/__init__.py | 334 + .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 8362 bytes .../__pycache__/actions.cpython-311.pyc | Bin 0 -> 8488 bytes .../__pycache__/common.cpython-311.pyc | Bin 0 -> 14810 bytes .../__pycache__/core.cpython-311.pyc | Bin 0 -> 277662 bytes .../__pycache__/exceptions.cpython-311.pyc | Bin 0 -> 12952 bytes .../__pycache__/helpers.cpython-311.pyc | Bin 0 -> 53653 bytes .../__pycache__/results.cpython-311.pyc | Bin 0 -> 36336 bytes .../__pycache__/testing.cpython-311.pyc | Bin 0 -> 19532 bytes .../__pycache__/unicode.cpython-311.pyc | Bin 0 -> 15390 bytes .../__pycache__/util.cpython-311.pyc | Bin 0 -> 14289 bytes .../setuptools/_vendor/pyparsing/actions.py | 212 + .../setuptools/_vendor/pyparsing/common.py | 429 + .../setuptools/_vendor/pyparsing/core.py | 6081 ++++++++++++ .../_vendor/pyparsing/diagram/__init__.py | 659 ++ .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 28025 bytes .../_vendor/pyparsing/exceptions.py | 280 + .../setuptools/_vendor/pyparsing/helpers.py | 1106 +++ .../setuptools/_vendor/pyparsing/results.py | 814 ++ .../setuptools/_vendor/pyparsing/testing.py | 343 + .../setuptools/_vendor/pyparsing/unicode.py | 361 + .../setuptools/_vendor/pyparsing/util.py | 253 + .../setuptools/_vendor/tomli/__init__.py | 11 + .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 439 bytes .../tomli/__pycache__/_parser.cpython-311.pyc | Bin 0 -> 30878 bytes .../tomli/__pycache__/_re.cpython-311.pyc | Bin 0 -> 4518 bytes .../tomli/__pycache__/_types.cpython-311.pyc | Bin 0 -> 431 bytes .../setuptools/_vendor/tomli/_parser.py | 702 ++ .../setuptools/_vendor/tomli/_re.py | 107 + .../setuptools/_vendor/tomli/_types.py | 10 + .../setuptools/_vendor/typing_extensions.py | 2460 +++++ .../site-packages/setuptools/_vendor/zipp.py | 355 + .../site-packages/setuptools/archive_util.py | 213 + .../site-packages/setuptools/build_meta.py | 535 + .../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 -> 658 bytes .../command/__pycache__/alias.cpython-311.pyc | Bin 0 -> 3925 bytes .../__pycache__/bdist_egg.cpython-311.pyc | Bin 0 -> 25607 bytes .../__pycache__/bdist_rpm.cpython-311.pyc | Bin 0 -> 2213 bytes .../command/__pycache__/build.cpython-311.pyc | Bin 0 -> 7019 bytes .../__pycache__/build_clib.cpython-311.pyc | Bin 0 -> 4146 bytes .../__pycache__/build_ext.cpython-311.pyc | Bin 0 -> 22033 bytes .../__pycache__/build_py.cpython-311.pyc | Bin 0 -> 23199 bytes .../__pycache__/develop.cpython-311.pyc | Bin 0 -> 10941 bytes .../__pycache__/dist_info.cpython-311.pyc | Bin 0 -> 8003 bytes .../__pycache__/easy_install.cpython-311.pyc | Bin 0 -> 119358 bytes .../editable_wheel.cpython-311.pyc | Bin 0 -> 51436 bytes .../__pycache__/egg_info.cpython-311.pyc | Bin 0 -> 39856 bytes .../__pycache__/install.cpython-311.pyc | Bin 0 -> 6838 bytes .../install_egg_info.cpython-311.pyc | Bin 0 -> 4151 bytes .../__pycache__/install_lib.cpython-311.pyc | Bin 0 -> 6433 bytes .../install_scripts.cpython-311.pyc | Bin 0 -> 4302 bytes .../__pycache__/py36compat.cpython-311.pyc | Bin 0 -> 8059 bytes .../__pycache__/register.cpython-311.pyc | Bin 0 -> 1149 bytes .../__pycache__/rotate.cpython-311.pyc | Bin 0 -> 4209 bytes .../__pycache__/saveopts.cpython-311.pyc | Bin 0 -> 1389 bytes .../command/__pycache__/sdist.cpython-311.pyc | Bin 0 -> 13461 bytes .../__pycache__/setopt.cpython-311.pyc | Bin 0 -> 7701 bytes .../command/__pycache__/test.cpython-311.pyc | Bin 0 -> 14642 bytes .../__pycache__/upload.cpython-311.pyc | Bin 0 -> 1113 bytes .../__pycache__/upload_docs.cpython-311.pyc | Bin 0 -> 11964 bytes .../site-packages/setuptools/command/alias.py | 81 + .../setuptools/command/bdist_egg.py | 470 + .../setuptools/command/bdist_rpm.py | 42 + .../site-packages/setuptools/command/build.py | 154 + .../setuptools/command/build_clib.py | 102 + .../setuptools/command/build_ext.py | 404 + .../setuptools/command/build_py.py | 394 + .../setuptools/command/develop.py | 204 + .../setuptools/command/dist_info.py | 146 + .../setuptools/command/easy_install.py | 2402 +++++ .../setuptools/command/editable_wheel.py | 887 ++ .../setuptools/command/egg_info.py | 808 ++ .../setuptools/command/install.py | 145 + .../setuptools/command/install_egg_info.py | 69 + .../setuptools/command/install_lib.py | 131 + .../setuptools/command/install_scripts.py | 73 + .../setuptools/command/launcher manifest.xml | 15 + .../setuptools/command/py36compat.py | 143 + .../setuptools/command/register.py | 19 + .../setuptools/command/rotate.py | 67 + .../setuptools/command/saveopts.py | 23 + .../site-packages/setuptools/command/sdist.py | 226 + .../setuptools/command/setopt.py | 154 + .../site-packages/setuptools/command/test.py | 269 + .../setuptools/command/upload.py | 18 + .../setuptools/command/upload_docs.py | 222 + .../setuptools/config/__init__.py | 36 + .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 2053 bytes .../_apply_pyprojecttoml.cpython-311.pyc | Bin 0 -> 22556 bytes .../config/__pycache__/expand.cpython-311.pyc | Bin 0 -> 28267 bytes .../__pycache__/pyprojecttoml.cpython-311.pyc | Bin 0 -> 27465 bytes .../__pycache__/setupcfg.cpython-311.pyc | Bin 0 -> 33049 bytes .../setuptools/config/_apply_pyprojecttoml.py | 379 + .../config/_validate_pyproject/__init__.py | 34 + .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 2341 bytes .../error_reporting.cpython-311.pyc | Bin 0 -> 20232 bytes .../extra_validations.cpython-311.pyc | Bin 0 -> 1890 bytes .../fastjsonschema_exceptions.cpython-311.pyc | Bin 0 -> 3265 bytes ...fastjsonschema_validations.cpython-311.pyc | Bin 0 -> 192663 bytes .../__pycache__/formats.cpython-311.pyc | Bin 0 -> 14380 bytes .../_validate_pyproject/error_reporting.py | 339 + .../_validate_pyproject/extra_validations.py | 36 + .../fastjsonschema_exceptions.py | 54 + .../fastjsonschema_validations.py | 1035 ++ .../config/_validate_pyproject/formats.py | 265 + .../site-packages/setuptools/config/expand.py | 476 + .../setuptools/config/pyprojecttoml.py | 516 + .../setuptools/config/setupcfg.py | 797 ++ .../site-packages/setuptools/dep_util.py | 25 + .../site-packages/setuptools/depends.py | 183 + .../site-packages/setuptools/discovery.py | 628 ++ .../site-packages/setuptools/dist.py | 1267 +++ .../site-packages/setuptools/errors.py | 58 + .../site-packages/setuptools/extension.py | 151 + .../setuptools/extern/__init__.py | 84 + .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 4417 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 | 36 + .../site-packages/setuptools/monkey.py | 166 + .../site-packages/setuptools/msvc.py | 1777 ++++ .../site-packages/setuptools/namespaces.py | 116 + .../site-packages/setuptools/package_index.py | 1181 +++ .../site-packages/setuptools/py34compat.py | 14 + .../site-packages/setuptools/sandbox.py | 562 ++ .../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 | 234 + .../setuptools/windows_support.py | 29 + tests/lib64 | 1 + tests/test_async_indexed_queue.py | 50 + tests/test_async_priority_queue.py | 44 + tests/test_async_sorted_priority_queue.py | 44 + tests/test_balance.py | 67 + tests/test_client.py | 337 + tests/test_death_timeout.py | 99 + tests/test_future.py | 110 + tests/test_graph.py | 179 + tests/test_indexed_queue.py | 39 + tests/test_nested_task.py | 72 + tests/test_object_usage.py | 54 + tests/test_profiling.py | 72 + tests/test_protected.py | 49 + tests/test_serializer.py | 95 + tests/test_ui.py | 83 + tests/test_worker_object_tracker.py | 73 + tests/utility.py | 15 + x | 198 + 1778 files changed, 310261 insertions(+) create mode 100644 CONTRIBUTING.md create mode 100644 LICENSE create mode 100644 Makefile create mode 100644 README.md create mode 100644 __pycache__/check.cpython-311.pyc create mode 100644 benchmarks/dask_local_test.py create mode 100644 benchmarks/dask_remote_test.py create mode 100644 benchmarks/scaler_test.py create mode 100644 check.py create mode 100644 docs/.gitignore create mode 100644 docs/Makefile create mode 100644 docs/make.bat create mode 100644 docs/requirements_docs.txt create mode 100644 docs/source/_static/style.css create mode 100644 docs/source/_templates/layout.html create mode 100644 docs/source/conf.py create mode 100644 docs/source/index.rst create mode 100644 docs/source/tutorials/configuration.rst create mode 100644 docs/source/tutorials/features.rst create mode 100644 docs/source/tutorials/images/architecture.png create mode 100644 docs/source/tutorials/quickstart.rst create mode 100644 pyproject.toml create mode 100644 renovate.json create mode 100644 requirements.txt create mode 100644 run_cluster.py create mode 100644 run_scheduler.py create mode 100644 run_top.py create mode 100644 run_webui.py create mode 100644 scaler/__init__.py create mode 100644 scaler/__pycache__/__init__.cpython-311.pyc create mode 100644 scaler/__pycache__/about.cpython-311.pyc create mode 100644 scaler/about.py create mode 100644 scaler/client/__init__.py create mode 100644 scaler/client/__pycache__/__init__.cpython-311.pyc create mode 100644 scaler/client/__pycache__/client.cpython-311.pyc create mode 100644 scaler/client/__pycache__/future.cpython-311.pyc create mode 100644 scaler/client/__pycache__/object_buffer.cpython-311.pyc create mode 100644 scaler/client/__pycache__/object_reference.cpython-311.pyc create mode 100644 scaler/client/agent/__init__.py create mode 100644 scaler/client/agent/__pycache__/__init__.cpython-311.pyc create mode 100644 scaler/client/agent/__pycache__/client_agent.cpython-311.pyc create mode 100644 scaler/client/agent/__pycache__/disconnect_manager.cpython-311.pyc create mode 100644 scaler/client/agent/__pycache__/future_manager.cpython-311.pyc create mode 100644 scaler/client/agent/__pycache__/heartbeat_manager.cpython-311.pyc create mode 100644 scaler/client/agent/__pycache__/mixins.cpython-311.pyc create mode 100644 scaler/client/agent/__pycache__/object_manager.cpython-311.pyc create mode 100644 scaler/client/agent/__pycache__/task_manager.cpython-311.pyc create mode 100644 scaler/client/agent/client_agent.py create mode 100644 scaler/client/agent/disconnect_manager.py create mode 100644 scaler/client/agent/future_manager.py create mode 100644 scaler/client/agent/heartbeat_manager.py create mode 100644 scaler/client/agent/mixins.py create mode 100644 scaler/client/agent/object_manager.py create mode 100644 scaler/client/agent/task_manager.py create mode 100644 scaler/client/client.py create mode 100644 scaler/client/future.py create mode 100644 scaler/client/object_buffer.py create mode 100644 scaler/client/object_reference.py create mode 100644 scaler/client/serializer/__init__.py create mode 100644 scaler/client/serializer/__pycache__/__init__.cpython-311.pyc create mode 100644 scaler/client/serializer/__pycache__/default.cpython-311.pyc create mode 100644 scaler/client/serializer/__pycache__/mixins.cpython-311.pyc create mode 100644 scaler/client/serializer/default.py create mode 100644 scaler/client/serializer/mixins.py create mode 100644 scaler/cluster/__init__.py create mode 100644 scaler/cluster/__pycache__/__init__.cpython-311.pyc create mode 100644 scaler/cluster/__pycache__/cluster.cpython-311.pyc create mode 100644 scaler/cluster/__pycache__/combo.cpython-311.pyc create mode 100644 scaler/cluster/__pycache__/scheduler.cpython-311.pyc create mode 100644 scaler/cluster/cluster.py create mode 100644 scaler/cluster/combo.py create mode 100644 scaler/cluster/scheduler.py create mode 100644 scaler/entry_points/__init__.py create mode 100644 scaler/entry_points/__pycache__/__init__.cpython-311.pyc create mode 100644 scaler/entry_points/__pycache__/cluster.cpython-311.pyc create mode 100644 scaler/entry_points/__pycache__/scheduler.cpython-311.pyc create mode 100644 scaler/entry_points/cluster.py create mode 100644 scaler/entry_points/scheduler.py create mode 100644 scaler/entry_points/top.py create mode 100644 scaler/entry_points/webui.py create mode 100644 scaler/io/__init__.py create mode 100644 scaler/io/__pycache__/__init__.cpython-311.pyc create mode 100644 scaler/io/__pycache__/async_binder.cpython-311.pyc create mode 100644 scaler/io/__pycache__/async_connector.cpython-311.pyc create mode 100644 scaler/io/__pycache__/config.cpython-311.pyc create mode 100644 scaler/io/__pycache__/model.cpython-311.pyc create mode 100644 scaler/io/__pycache__/sync_connector.cpython-311.pyc create mode 100644 scaler/io/__pycache__/utility.cpython-311.pyc create mode 100644 scaler/io/async_binder.py create mode 100644 scaler/io/async_connector.py create mode 100644 scaler/io/config.py create mode 100644 scaler/io/cpp/__pycache__/ffi.cpython-311.pyc create mode 100644 scaler/io/cpp/build.py create mode 100644 scaler/io/cpp/build/cpp.cpp create mode 100755 scaler/io/cpp/build/cpp.cpython-311-x86_64-linux-gnu.so create mode 100644 scaler/io/cpp/build/cpp.o create mode 100644 scaler/io/cpp/doc.md create mode 100644 scaler/io/cpp/ffi.py create mode 100644 scaler/io/cpp/src/defs.h create mode 100644 scaler/io/cpp/src/main.cpp create mode 100644 scaler/io/cpp/src/main.h create mode 100644 scaler/io/cpp/src/main.o create mode 100644 scaler/io/cpp/src/third_party/blockingconcurrentqueue.h create mode 100644 scaler/io/cpp/src/third_party/concurrentqueue.h create mode 100644 scaler/io/cpp/src/third_party/lightweightsemaphore.h create mode 100644 scaler/io/model.py create mode 100644 scaler/io/sync_connector.py create mode 100644 scaler/io/sync_subscriber.py create mode 100644 scaler/io/utility.py create mode 100644 scaler/protocol/__init__.py create mode 100644 scaler/protocol/__pycache__/__init__.cpython-311.pyc create mode 100644 scaler/protocol/capnp/__init__.py create mode 100644 scaler/protocol/capnp/__pycache__/__init__.cpython-311.pyc create mode 100644 scaler/protocol/capnp/__pycache__/_python.cpython-311.pyc create mode 100644 scaler/protocol/capnp/_python.py create mode 100644 scaler/protocol/capnp/common.capnp create mode 100644 scaler/protocol/capnp/message.capnp create mode 100644 scaler/protocol/capnp/status.capnp create mode 100644 scaler/protocol/introduction.md create mode 100644 scaler/protocol/python/__init__.py create mode 100644 scaler/protocol/python/__pycache__/__init__.cpython-311.pyc create mode 100644 scaler/protocol/python/__pycache__/common.cpython-311.pyc create mode 100644 scaler/protocol/python/__pycache__/message.cpython-311.pyc create mode 100644 scaler/protocol/python/__pycache__/mixins.cpython-311.pyc create mode 100644 scaler/protocol/python/__pycache__/status.cpython-311.pyc create mode 100644 scaler/protocol/python/common.py create mode 100644 scaler/protocol/python/message.py create mode 100644 scaler/protocol/python/mixins.py create mode 100644 scaler/protocol/python/status.py create mode 100644 scaler/protocol/worker.md create mode 100644 scaler/scheduler/__init__.py create mode 100644 scaler/scheduler/__pycache__/__init__.cpython-311.pyc create mode 100644 scaler/scheduler/__pycache__/client_manager.cpython-311.pyc create mode 100644 scaler/scheduler/__pycache__/config.cpython-311.pyc create mode 100644 scaler/scheduler/__pycache__/graph_manager.cpython-311.pyc create mode 100644 scaler/scheduler/__pycache__/mixins.cpython-311.pyc create mode 100644 scaler/scheduler/__pycache__/object_manager.cpython-311.pyc create mode 100644 scaler/scheduler/__pycache__/scheduler.cpython-311.pyc create mode 100644 scaler/scheduler/__pycache__/status_reporter.cpython-311.pyc create mode 100644 scaler/scheduler/__pycache__/task_manager.cpython-311.pyc create mode 100644 scaler/scheduler/__pycache__/worker_manager.cpython-311.pyc create mode 100644 scaler/scheduler/allocators/__init__.py create mode 100644 scaler/scheduler/allocators/__pycache__/__init__.cpython-311.pyc create mode 100644 scaler/scheduler/allocators/__pycache__/mixins.cpython-311.pyc create mode 100644 scaler/scheduler/allocators/__pycache__/queued.cpython-311.pyc create mode 100644 scaler/scheduler/allocators/mixins.py create mode 100644 scaler/scheduler/allocators/queued.py create mode 100644 scaler/scheduler/client_manager.py create mode 100644 scaler/scheduler/config.py create mode 100644 scaler/scheduler/graph_manager.py create mode 100644 scaler/scheduler/mixins.py create mode 100644 scaler/scheduler/object_manager.py create mode 100644 scaler/scheduler/object_usage/__init__.py create mode 100644 scaler/scheduler/object_usage/__pycache__/__init__.cpython-311.pyc create mode 100644 scaler/scheduler/object_usage/__pycache__/object_tracker.cpython-311.pyc create mode 100644 scaler/scheduler/object_usage/object_tracker.py create mode 100644 scaler/scheduler/scheduler.py create mode 100644 scaler/scheduler/status_reporter.py create mode 100644 scaler/scheduler/task_manager.py create mode 100644 scaler/scheduler/worker_manager.py create mode 100644 scaler/ui/__init__.py create mode 100644 scaler/ui/live_display.py create mode 100644 scaler/ui/memory_window.py create mode 100644 scaler/ui/setting_page.py create mode 100644 scaler/ui/task_graph.py create mode 100644 scaler/ui/task_log.py create mode 100644 scaler/ui/utility.py create mode 100644 scaler/ui/webui.py create mode 100644 scaler/ui/worker_processors.py create mode 100644 scaler/utility/__init__.py create mode 100644 scaler/utility/__pycache__/__init__.cpython-311.pyc create mode 100644 scaler/utility/__pycache__/debug.cpython-311.pyc create mode 100644 scaler/utility/__pycache__/event_list.cpython-311.pyc create mode 100644 scaler/utility/__pycache__/event_loop.cpython-311.pyc create mode 100644 scaler/utility/__pycache__/exceptions.cpython-311.pyc create mode 100644 scaler/utility/__pycache__/formatter.cpython-311.pyc create mode 100644 scaler/utility/__pycache__/many_to_many_dict.cpython-311.pyc create mode 100644 scaler/utility/__pycache__/mixins.cpython-311.pyc create mode 100644 scaler/utility/__pycache__/object_utility.cpython-311.pyc create mode 100644 scaler/utility/__pycache__/one_to_many_dict.cpython-311.pyc create mode 100644 scaler/utility/__pycache__/zmq_config.cpython-311.pyc create mode 100644 scaler/utility/debug.py create mode 100644 scaler/utility/event_list.py create mode 100644 scaler/utility/event_loop.py create mode 100644 scaler/utility/exceptions.py create mode 100644 scaler/utility/formatter.py create mode 100644 scaler/utility/graph/__init__.py create mode 100644 scaler/utility/graph/__pycache__/__init__.cpython-311.pyc create mode 100644 scaler/utility/graph/__pycache__/optimization.cpython-311.pyc create mode 100644 scaler/utility/graph/__pycache__/topological_sorter.cpython-311.pyc create mode 100644 scaler/utility/graph/__pycache__/topological_sorter_graphblas.cpython-311.pyc create mode 100644 scaler/utility/graph/optimization.py create mode 100644 scaler/utility/graph/topological_sorter.py create mode 100644 scaler/utility/graph/topological_sorter_graphblas.py create mode 100644 scaler/utility/logging/__init__.py create mode 100644 scaler/utility/logging/__pycache__/__init__.cpython-311.pyc create mode 100644 scaler/utility/logging/__pycache__/scoped_logger.cpython-311.pyc create mode 100644 scaler/utility/logging/__pycache__/utility.cpython-311.pyc create mode 100644 scaler/utility/logging/decorators.py create mode 100644 scaler/utility/logging/scoped_logger.py create mode 100644 scaler/utility/logging/utility.py create mode 100644 scaler/utility/many_to_many_dict.py create mode 100644 scaler/utility/metadata/__init__.py create mode 100644 scaler/utility/metadata/__pycache__/__init__.cpython-311.pyc create mode 100644 scaler/utility/metadata/__pycache__/profile_result.cpython-311.pyc create mode 100644 scaler/utility/metadata/__pycache__/task_flags.cpython-311.pyc create mode 100644 scaler/utility/metadata/profile_result.py create mode 100644 scaler/utility/metadata/task_flags.py create mode 100644 scaler/utility/mixins.py create mode 100644 scaler/utility/object_utility.py create mode 100644 scaler/utility/one_to_many_dict.py create mode 100644 scaler/utility/queues/__init__.py create mode 100644 scaler/utility/queues/__pycache__/__init__.cpython-311.pyc create mode 100644 scaler/utility/queues/__pycache__/async_indexed_queue.cpython-311.pyc create mode 100644 scaler/utility/queues/__pycache__/async_priority_queue.cpython-311.pyc create mode 100644 scaler/utility/queues/__pycache__/async_sorted_priority_queue.cpython-311.pyc create mode 100644 scaler/utility/queues/__pycache__/indexed_queue.cpython-311.pyc create mode 100644 scaler/utility/queues/async_indexed_queue.py create mode 100644 scaler/utility/queues/async_priority_queue.py create mode 100644 scaler/utility/queues/async_sorted_priority_queue.py create mode 100644 scaler/utility/queues/indexed_queue.py create mode 100644 scaler/utility/zmq_config.py create mode 100644 scaler/worker/__init__.py create mode 100644 scaler/worker/__pycache__/__init__.cpython-311.pyc create mode 100644 scaler/worker/__pycache__/worker.cpython-311.pyc create mode 100644 scaler/worker/agent/__init__.py create mode 100644 scaler/worker/agent/__pycache__/__init__.cpython-311.pyc create mode 100644 scaler/worker/agent/__pycache__/heartbeat_manager.cpython-311.pyc create mode 100644 scaler/worker/agent/__pycache__/mixins.cpython-311.pyc create mode 100644 scaler/worker/agent/__pycache__/object_tracker.cpython-311.pyc create mode 100644 scaler/worker/agent/__pycache__/processor_holder.cpython-311.pyc create mode 100644 scaler/worker/agent/__pycache__/processor_manager.cpython-311.pyc create mode 100644 scaler/worker/agent/__pycache__/profiling_manager.cpython-311.pyc create mode 100644 scaler/worker/agent/__pycache__/task_manager.cpython-311.pyc create mode 100644 scaler/worker/agent/__pycache__/timeout_manager.cpython-311.pyc create mode 100644 scaler/worker/agent/heartbeat_manager.py create mode 100644 scaler/worker/agent/mixins.py create mode 100644 scaler/worker/agent/object_tracker.py create mode 100644 scaler/worker/agent/processor/__init__.py create mode 100644 scaler/worker/agent/processor/__pycache__/__init__.cpython-311.pyc create mode 100644 scaler/worker/agent/processor/__pycache__/object_cache.cpython-311.pyc create mode 100644 scaler/worker/agent/processor/__pycache__/processor.cpython-311.pyc create mode 100644 scaler/worker/agent/processor/object_cache.py create mode 100644 scaler/worker/agent/processor/processor.py create mode 100644 scaler/worker/agent/processor_holder.py create mode 100644 scaler/worker/agent/processor_manager.py create mode 100644 scaler/worker/agent/profiling_manager.py create mode 100644 scaler/worker/agent/task_manager.py create mode 100644 scaler/worker/agent/timeout_manager.py create mode 100644 scaler/worker/worker.py create mode 100644 scheduler create mode 100644 shutff create mode 100644 shutff.py create mode 100644 tests/__init__.py create mode 100644 tests/__pycache__/__init__.cpython-311.pyc create mode 100644 tests/__pycache__/test_async_indexed_queue.cpython-311.pyc create mode 100644 tests/__pycache__/test_async_priority_queue.cpython-311.pyc create mode 100644 tests/__pycache__/test_async_sorted_priority_queue.cpython-311.pyc create mode 100644 tests/__pycache__/test_balance.cpython-311.pyc create mode 100644 tests/__pycache__/test_client.cpython-311.pyc create mode 100644 tests/__pycache__/test_death_timeout.cpython-311.pyc create mode 100644 tests/__pycache__/test_future.cpython-311.pyc create mode 100644 tests/__pycache__/test_graph.cpython-311.pyc create mode 100644 tests/__pycache__/test_indexed_queue.cpython-311.pyc create mode 100644 tests/__pycache__/test_nested_task.cpython-311.pyc create mode 100644 tests/__pycache__/test_object_usage.cpython-311.pyc create mode 100644 tests/__pycache__/test_profiling.cpython-311.pyc create mode 100644 tests/__pycache__/test_protected.cpython-311.pyc create mode 100644 tests/__pycache__/test_serializer.cpython-311.pyc create mode 100644 tests/__pycache__/test_ui.cpython-311.pyc create mode 100644 tests/__pycache__/test_worker_object_tracker.cpython-311.pyc create mode 100644 tests/__pycache__/utility.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/_distutils_hack/__init__.py create mode 100644 tests/lib/python3.11/site-packages/_distutils_hack/__pycache__/__init__.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/_distutils_hack/__pycache__/override.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/_distutils_hack/override.py create mode 100644 tests/lib/python3.11/site-packages/distutils-precedence.pth create mode 100644 tests/lib/python3.11/site-packages/pip-24.0.dist-info/AUTHORS.txt create mode 100644 tests/lib/python3.11/site-packages/pip-24.0.dist-info/INSTALLER create mode 100644 tests/lib/python3.11/site-packages/pip-24.0.dist-info/LICENSE.txt create mode 100644 tests/lib/python3.11/site-packages/pip-24.0.dist-info/METADATA create mode 100644 tests/lib/python3.11/site-packages/pip-24.0.dist-info/RECORD create mode 100644 tests/lib/python3.11/site-packages/pip-24.0.dist-info/REQUESTED create mode 100644 tests/lib/python3.11/site-packages/pip-24.0.dist-info/WHEEL create mode 100644 tests/lib/python3.11/site-packages/pip-24.0.dist-info/entry_points.txt create mode 100644 tests/lib/python3.11/site-packages/pip-24.0.dist-info/top_level.txt create mode 100644 tests/lib/python3.11/site-packages/pip/__init__.py create mode 100644 tests/lib/python3.11/site-packages/pip/__main__.py create mode 100644 tests/lib/python3.11/site-packages/pip/__pip-runner__.py create mode 100644 tests/lib/python3.11/site-packages/pip/__pycache__/__init__.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/pip/__pycache__/__main__.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/pip/__pycache__/__pip-runner__.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/pip/_internal/__init__.py create mode 100644 tests/lib/python3.11/site-packages/pip/_internal/__pycache__/__init__.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/pip/_internal/__pycache__/build_env.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/pip/_internal/__pycache__/cache.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/pip/_internal/__pycache__/configuration.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/pip/_internal/__pycache__/exceptions.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/pip/_internal/__pycache__/main.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/pip/_internal/__pycache__/pyproject.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/pip/_internal/__pycache__/self_outdated_check.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/pip/_internal/__pycache__/wheel_builder.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/pip/_internal/build_env.py create mode 100644 tests/lib/python3.11/site-packages/pip/_internal/cache.py create mode 100644 tests/lib/python3.11/site-packages/pip/_internal/cli/__init__.py create mode 100644 tests/lib/python3.11/site-packages/pip/_internal/cli/__pycache__/__init__.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/pip/_internal/cli/__pycache__/autocompletion.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/pip/_internal/cli/__pycache__/base_command.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/pip/_internal/cli/__pycache__/cmdoptions.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/pip/_internal/cli/__pycache__/command_context.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/pip/_internal/cli/__pycache__/main.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/pip/_internal/cli/__pycache__/main_parser.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/pip/_internal/cli/__pycache__/parser.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/pip/_internal/cli/__pycache__/progress_bars.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/pip/_internal/cli/__pycache__/req_command.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/pip/_internal/cli/__pycache__/spinners.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/pip/_internal/cli/__pycache__/status_codes.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/pip/_internal/cli/autocompletion.py create mode 100644 tests/lib/python3.11/site-packages/pip/_internal/cli/base_command.py create mode 100644 tests/lib/python3.11/site-packages/pip/_internal/cli/cmdoptions.py create mode 100644 tests/lib/python3.11/site-packages/pip/_internal/cli/command_context.py create mode 100644 tests/lib/python3.11/site-packages/pip/_internal/cli/main.py create mode 100644 tests/lib/python3.11/site-packages/pip/_internal/cli/main_parser.py create mode 100644 tests/lib/python3.11/site-packages/pip/_internal/cli/parser.py create mode 100644 tests/lib/python3.11/site-packages/pip/_internal/cli/progress_bars.py create mode 100644 tests/lib/python3.11/site-packages/pip/_internal/cli/req_command.py create mode 100644 tests/lib/python3.11/site-packages/pip/_internal/cli/spinners.py create mode 100644 tests/lib/python3.11/site-packages/pip/_internal/cli/status_codes.py create mode 100644 tests/lib/python3.11/site-packages/pip/_internal/commands/__init__.py create mode 100644 tests/lib/python3.11/site-packages/pip/_internal/commands/__pycache__/__init__.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/pip/_internal/commands/__pycache__/cache.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/pip/_internal/commands/__pycache__/check.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/pip/_internal/commands/__pycache__/completion.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/pip/_internal/commands/__pycache__/configuration.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/pip/_internal/commands/__pycache__/debug.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/pip/_internal/commands/__pycache__/download.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/pip/_internal/commands/__pycache__/freeze.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/pip/_internal/commands/__pycache__/hash.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/pip/_internal/commands/__pycache__/help.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/pip/_internal/commands/__pycache__/index.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/pip/_internal/commands/__pycache__/inspect.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/pip/_internal/commands/__pycache__/install.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/pip/_internal/commands/__pycache__/list.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/pip/_internal/commands/__pycache__/search.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/pip/_internal/commands/__pycache__/show.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/pip/_internal/commands/__pycache__/uninstall.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/pip/_internal/commands/__pycache__/wheel.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/pip/_internal/commands/cache.py create mode 100644 tests/lib/python3.11/site-packages/pip/_internal/commands/check.py create mode 100644 tests/lib/python3.11/site-packages/pip/_internal/commands/completion.py create mode 100644 tests/lib/python3.11/site-packages/pip/_internal/commands/configuration.py create mode 100644 tests/lib/python3.11/site-packages/pip/_internal/commands/debug.py create mode 100644 tests/lib/python3.11/site-packages/pip/_internal/commands/download.py create mode 100644 tests/lib/python3.11/site-packages/pip/_internal/commands/freeze.py create mode 100644 tests/lib/python3.11/site-packages/pip/_internal/commands/hash.py create mode 100644 tests/lib/python3.11/site-packages/pip/_internal/commands/help.py create mode 100644 tests/lib/python3.11/site-packages/pip/_internal/commands/index.py create mode 100644 tests/lib/python3.11/site-packages/pip/_internal/commands/inspect.py create mode 100644 tests/lib/python3.11/site-packages/pip/_internal/commands/install.py create mode 100644 tests/lib/python3.11/site-packages/pip/_internal/commands/list.py create mode 100644 tests/lib/python3.11/site-packages/pip/_internal/commands/search.py create mode 100644 tests/lib/python3.11/site-packages/pip/_internal/commands/show.py create mode 100644 tests/lib/python3.11/site-packages/pip/_internal/commands/uninstall.py create mode 100644 tests/lib/python3.11/site-packages/pip/_internal/commands/wheel.py create mode 100644 tests/lib/python3.11/site-packages/pip/_internal/configuration.py create mode 100644 tests/lib/python3.11/site-packages/pip/_internal/distributions/__init__.py create mode 100644 tests/lib/python3.11/site-packages/pip/_internal/distributions/__pycache__/__init__.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/pip/_internal/distributions/__pycache__/base.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/pip/_internal/distributions/__pycache__/installed.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/pip/_internal/distributions/__pycache__/sdist.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/pip/_internal/distributions/__pycache__/wheel.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/pip/_internal/distributions/base.py create mode 100644 tests/lib/python3.11/site-packages/pip/_internal/distributions/installed.py create mode 100644 tests/lib/python3.11/site-packages/pip/_internal/distributions/sdist.py create mode 100644 tests/lib/python3.11/site-packages/pip/_internal/distributions/wheel.py create mode 100644 tests/lib/python3.11/site-packages/pip/_internal/exceptions.py create mode 100644 tests/lib/python3.11/site-packages/pip/_internal/index/__init__.py create mode 100644 tests/lib/python3.11/site-packages/pip/_internal/index/__pycache__/__init__.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/pip/_internal/index/__pycache__/collector.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/pip/_internal/index/__pycache__/package_finder.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/pip/_internal/index/__pycache__/sources.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/pip/_internal/index/collector.py create mode 100644 tests/lib/python3.11/site-packages/pip/_internal/index/package_finder.py create mode 100644 tests/lib/python3.11/site-packages/pip/_internal/index/sources.py create mode 100644 tests/lib/python3.11/site-packages/pip/_internal/locations/__init__.py create mode 100644 tests/lib/python3.11/site-packages/pip/_internal/locations/__pycache__/__init__.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/pip/_internal/locations/__pycache__/_distutils.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/pip/_internal/locations/__pycache__/_sysconfig.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/pip/_internal/locations/__pycache__/base.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/pip/_internal/locations/_distutils.py create mode 100644 tests/lib/python3.11/site-packages/pip/_internal/locations/_sysconfig.py create mode 100644 tests/lib/python3.11/site-packages/pip/_internal/locations/base.py create mode 100644 tests/lib/python3.11/site-packages/pip/_internal/main.py create mode 100644 tests/lib/python3.11/site-packages/pip/_internal/metadata/__init__.py create mode 100644 tests/lib/python3.11/site-packages/pip/_internal/metadata/__pycache__/__init__.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/pip/_internal/metadata/__pycache__/_json.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/pip/_internal/metadata/__pycache__/base.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/pip/_internal/metadata/__pycache__/pkg_resources.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/pip/_internal/metadata/_json.py create mode 100644 tests/lib/python3.11/site-packages/pip/_internal/metadata/base.py create mode 100644 tests/lib/python3.11/site-packages/pip/_internal/metadata/importlib/__init__.py create mode 100644 tests/lib/python3.11/site-packages/pip/_internal/metadata/importlib/__pycache__/__init__.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/pip/_internal/metadata/importlib/__pycache__/_compat.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/pip/_internal/metadata/importlib/__pycache__/_dists.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/pip/_internal/metadata/importlib/__pycache__/_envs.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/pip/_internal/metadata/importlib/_compat.py create mode 100644 tests/lib/python3.11/site-packages/pip/_internal/metadata/importlib/_dists.py create mode 100644 tests/lib/python3.11/site-packages/pip/_internal/metadata/importlib/_envs.py create mode 100644 tests/lib/python3.11/site-packages/pip/_internal/metadata/pkg_resources.py create mode 100644 tests/lib/python3.11/site-packages/pip/_internal/models/__init__.py create mode 100644 tests/lib/python3.11/site-packages/pip/_internal/models/__pycache__/__init__.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/pip/_internal/models/__pycache__/candidate.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/pip/_internal/models/__pycache__/direct_url.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/pip/_internal/models/__pycache__/format_control.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/pip/_internal/models/__pycache__/index.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/pip/_internal/models/__pycache__/installation_report.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/pip/_internal/models/__pycache__/link.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/pip/_internal/models/__pycache__/scheme.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/pip/_internal/models/__pycache__/search_scope.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/pip/_internal/models/__pycache__/selection_prefs.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/pip/_internal/models/__pycache__/target_python.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/pip/_internal/models/__pycache__/wheel.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/pip/_internal/models/candidate.py create mode 100644 tests/lib/python3.11/site-packages/pip/_internal/models/direct_url.py create mode 100644 tests/lib/python3.11/site-packages/pip/_internal/models/format_control.py create mode 100644 tests/lib/python3.11/site-packages/pip/_internal/models/index.py create mode 100644 tests/lib/python3.11/site-packages/pip/_internal/models/installation_report.py create mode 100644 tests/lib/python3.11/site-packages/pip/_internal/models/link.py create mode 100644 tests/lib/python3.11/site-packages/pip/_internal/models/scheme.py create mode 100644 tests/lib/python3.11/site-packages/pip/_internal/models/search_scope.py create mode 100644 tests/lib/python3.11/site-packages/pip/_internal/models/selection_prefs.py create mode 100644 tests/lib/python3.11/site-packages/pip/_internal/models/target_python.py create mode 100644 tests/lib/python3.11/site-packages/pip/_internal/models/wheel.py create mode 100644 tests/lib/python3.11/site-packages/pip/_internal/network/__init__.py create mode 100644 tests/lib/python3.11/site-packages/pip/_internal/network/__pycache__/__init__.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/pip/_internal/network/__pycache__/auth.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/pip/_internal/network/__pycache__/cache.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/pip/_internal/network/__pycache__/download.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/pip/_internal/network/__pycache__/lazy_wheel.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/pip/_internal/network/__pycache__/session.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/pip/_internal/network/__pycache__/utils.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/pip/_internal/network/__pycache__/xmlrpc.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/pip/_internal/network/auth.py create mode 100644 tests/lib/python3.11/site-packages/pip/_internal/network/cache.py create mode 100644 tests/lib/python3.11/site-packages/pip/_internal/network/download.py create mode 100644 tests/lib/python3.11/site-packages/pip/_internal/network/lazy_wheel.py create mode 100644 tests/lib/python3.11/site-packages/pip/_internal/network/session.py create mode 100644 tests/lib/python3.11/site-packages/pip/_internal/network/utils.py create mode 100644 tests/lib/python3.11/site-packages/pip/_internal/network/xmlrpc.py create mode 100644 tests/lib/python3.11/site-packages/pip/_internal/operations/__init__.py create mode 100644 tests/lib/python3.11/site-packages/pip/_internal/operations/__pycache__/__init__.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/pip/_internal/operations/__pycache__/check.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/pip/_internal/operations/__pycache__/freeze.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/pip/_internal/operations/__pycache__/prepare.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/pip/_internal/operations/build/__init__.py create mode 100644 tests/lib/python3.11/site-packages/pip/_internal/operations/build/__pycache__/__init__.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/pip/_internal/operations/build/__pycache__/build_tracker.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/pip/_internal/operations/build/__pycache__/metadata.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/pip/_internal/operations/build/__pycache__/metadata_editable.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/pip/_internal/operations/build/__pycache__/metadata_legacy.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/pip/_internal/operations/build/__pycache__/wheel.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/pip/_internal/operations/build/__pycache__/wheel_editable.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/pip/_internal/operations/build/__pycache__/wheel_legacy.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/pip/_internal/operations/build/build_tracker.py create mode 100644 tests/lib/python3.11/site-packages/pip/_internal/operations/build/metadata.py create mode 100644 tests/lib/python3.11/site-packages/pip/_internal/operations/build/metadata_editable.py create mode 100644 tests/lib/python3.11/site-packages/pip/_internal/operations/build/metadata_legacy.py create mode 100644 tests/lib/python3.11/site-packages/pip/_internal/operations/build/wheel.py create mode 100644 tests/lib/python3.11/site-packages/pip/_internal/operations/build/wheel_editable.py create mode 100644 tests/lib/python3.11/site-packages/pip/_internal/operations/build/wheel_legacy.py create mode 100644 tests/lib/python3.11/site-packages/pip/_internal/operations/check.py create mode 100644 tests/lib/python3.11/site-packages/pip/_internal/operations/freeze.py create mode 100644 tests/lib/python3.11/site-packages/pip/_internal/operations/install/__init__.py create mode 100644 tests/lib/python3.11/site-packages/pip/_internal/operations/install/__pycache__/__init__.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/pip/_internal/operations/install/__pycache__/editable_legacy.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/pip/_internal/operations/install/__pycache__/wheel.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/pip/_internal/operations/install/editable_legacy.py create mode 100644 tests/lib/python3.11/site-packages/pip/_internal/operations/install/wheel.py create mode 100644 tests/lib/python3.11/site-packages/pip/_internal/operations/prepare.py create mode 100644 tests/lib/python3.11/site-packages/pip/_internal/pyproject.py create mode 100644 tests/lib/python3.11/site-packages/pip/_internal/req/__init__.py create mode 100644 tests/lib/python3.11/site-packages/pip/_internal/req/__pycache__/__init__.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/pip/_internal/req/__pycache__/constructors.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/pip/_internal/req/__pycache__/req_file.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/pip/_internal/req/__pycache__/req_install.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/pip/_internal/req/__pycache__/req_set.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/pip/_internal/req/__pycache__/req_uninstall.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/pip/_internal/req/constructors.py create mode 100644 tests/lib/python3.11/site-packages/pip/_internal/req/req_file.py create mode 100644 tests/lib/python3.11/site-packages/pip/_internal/req/req_install.py create mode 100644 tests/lib/python3.11/site-packages/pip/_internal/req/req_set.py create mode 100644 tests/lib/python3.11/site-packages/pip/_internal/req/req_uninstall.py create mode 100644 tests/lib/python3.11/site-packages/pip/_internal/resolution/__init__.py create mode 100644 tests/lib/python3.11/site-packages/pip/_internal/resolution/__pycache__/__init__.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/pip/_internal/resolution/__pycache__/base.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/pip/_internal/resolution/base.py create mode 100644 tests/lib/python3.11/site-packages/pip/_internal/resolution/legacy/__init__.py create mode 100644 tests/lib/python3.11/site-packages/pip/_internal/resolution/legacy/__pycache__/__init__.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/pip/_internal/resolution/legacy/__pycache__/resolver.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/pip/_internal/resolution/legacy/resolver.py create mode 100644 tests/lib/python3.11/site-packages/pip/_internal/resolution/resolvelib/__init__.py create mode 100644 tests/lib/python3.11/site-packages/pip/_internal/resolution/resolvelib/__pycache__/__init__.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/pip/_internal/resolution/resolvelib/__pycache__/base.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/pip/_internal/resolution/resolvelib/__pycache__/candidates.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/pip/_internal/resolution/resolvelib/__pycache__/factory.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/pip/_internal/resolution/resolvelib/__pycache__/found_candidates.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/pip/_internal/resolution/resolvelib/__pycache__/provider.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/pip/_internal/resolution/resolvelib/__pycache__/reporter.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/pip/_internal/resolution/resolvelib/__pycache__/requirements.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/pip/_internal/resolution/resolvelib/__pycache__/resolver.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/pip/_internal/resolution/resolvelib/base.py create mode 100644 tests/lib/python3.11/site-packages/pip/_internal/resolution/resolvelib/candidates.py create mode 100644 tests/lib/python3.11/site-packages/pip/_internal/resolution/resolvelib/factory.py create mode 100644 tests/lib/python3.11/site-packages/pip/_internal/resolution/resolvelib/found_candidates.py create mode 100644 tests/lib/python3.11/site-packages/pip/_internal/resolution/resolvelib/provider.py create mode 100644 tests/lib/python3.11/site-packages/pip/_internal/resolution/resolvelib/reporter.py create mode 100644 tests/lib/python3.11/site-packages/pip/_internal/resolution/resolvelib/requirements.py create mode 100644 tests/lib/python3.11/site-packages/pip/_internal/resolution/resolvelib/resolver.py create mode 100644 tests/lib/python3.11/site-packages/pip/_internal/self_outdated_check.py create mode 100644 tests/lib/python3.11/site-packages/pip/_internal/utils/__init__.py create mode 100644 tests/lib/python3.11/site-packages/pip/_internal/utils/__pycache__/__init__.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/pip/_internal/utils/__pycache__/_jaraco_text.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/pip/_internal/utils/__pycache__/_log.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/pip/_internal/utils/__pycache__/appdirs.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/pip/_internal/utils/__pycache__/compat.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/pip/_internal/utils/__pycache__/compatibility_tags.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/pip/_internal/utils/__pycache__/datetime.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/pip/_internal/utils/__pycache__/deprecation.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/pip/_internal/utils/__pycache__/direct_url_helpers.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/pip/_internal/utils/__pycache__/egg_link.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/pip/_internal/utils/__pycache__/encoding.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/pip/_internal/utils/__pycache__/entrypoints.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/pip/_internal/utils/__pycache__/filesystem.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/pip/_internal/utils/__pycache__/filetypes.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/pip/_internal/utils/__pycache__/glibc.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/pip/_internal/utils/__pycache__/hashes.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/pip/_internal/utils/__pycache__/logging.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/pip/_internal/utils/__pycache__/misc.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/pip/_internal/utils/__pycache__/models.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/pip/_internal/utils/__pycache__/packaging.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/pip/_internal/utils/__pycache__/setuptools_build.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/pip/_internal/utils/__pycache__/subprocess.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/pip/_internal/utils/__pycache__/temp_dir.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/pip/_internal/utils/__pycache__/unpacking.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/pip/_internal/utils/__pycache__/urls.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/pip/_internal/utils/__pycache__/virtualenv.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/pip/_internal/utils/__pycache__/wheel.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/pip/_internal/utils/_jaraco_text.py create mode 100644 tests/lib/python3.11/site-packages/pip/_internal/utils/_log.py create mode 100644 tests/lib/python3.11/site-packages/pip/_internal/utils/appdirs.py create mode 100644 tests/lib/python3.11/site-packages/pip/_internal/utils/compat.py create mode 100644 tests/lib/python3.11/site-packages/pip/_internal/utils/compatibility_tags.py create mode 100644 tests/lib/python3.11/site-packages/pip/_internal/utils/datetime.py create mode 100644 tests/lib/python3.11/site-packages/pip/_internal/utils/deprecation.py create mode 100644 tests/lib/python3.11/site-packages/pip/_internal/utils/direct_url_helpers.py create mode 100644 tests/lib/python3.11/site-packages/pip/_internal/utils/egg_link.py create mode 100644 tests/lib/python3.11/site-packages/pip/_internal/utils/encoding.py create mode 100644 tests/lib/python3.11/site-packages/pip/_internal/utils/entrypoints.py create mode 100644 tests/lib/python3.11/site-packages/pip/_internal/utils/filesystem.py create mode 100644 tests/lib/python3.11/site-packages/pip/_internal/utils/filetypes.py create mode 100644 tests/lib/python3.11/site-packages/pip/_internal/utils/glibc.py create mode 100644 tests/lib/python3.11/site-packages/pip/_internal/utils/hashes.py create mode 100644 tests/lib/python3.11/site-packages/pip/_internal/utils/logging.py create mode 100644 tests/lib/python3.11/site-packages/pip/_internal/utils/misc.py create mode 100644 tests/lib/python3.11/site-packages/pip/_internal/utils/models.py create mode 100644 tests/lib/python3.11/site-packages/pip/_internal/utils/packaging.py create mode 100644 tests/lib/python3.11/site-packages/pip/_internal/utils/setuptools_build.py create mode 100644 tests/lib/python3.11/site-packages/pip/_internal/utils/subprocess.py create mode 100644 tests/lib/python3.11/site-packages/pip/_internal/utils/temp_dir.py create mode 100644 tests/lib/python3.11/site-packages/pip/_internal/utils/unpacking.py create mode 100644 tests/lib/python3.11/site-packages/pip/_internal/utils/urls.py create mode 100644 tests/lib/python3.11/site-packages/pip/_internal/utils/virtualenv.py create mode 100644 tests/lib/python3.11/site-packages/pip/_internal/utils/wheel.py create mode 100644 tests/lib/python3.11/site-packages/pip/_internal/vcs/__init__.py create mode 100644 tests/lib/python3.11/site-packages/pip/_internal/vcs/__pycache__/__init__.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/pip/_internal/vcs/__pycache__/bazaar.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/pip/_internal/vcs/__pycache__/git.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/pip/_internal/vcs/__pycache__/mercurial.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/pip/_internal/vcs/__pycache__/subversion.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/pip/_internal/vcs/__pycache__/versioncontrol.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/pip/_internal/vcs/bazaar.py create mode 100644 tests/lib/python3.11/site-packages/pip/_internal/vcs/git.py create mode 100644 tests/lib/python3.11/site-packages/pip/_internal/vcs/mercurial.py create mode 100644 tests/lib/python3.11/site-packages/pip/_internal/vcs/subversion.py create mode 100644 tests/lib/python3.11/site-packages/pip/_internal/vcs/versioncontrol.py create mode 100644 tests/lib/python3.11/site-packages/pip/_internal/wheel_builder.py create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/__init__.py create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/__pycache__/__init__.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/__pycache__/six.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/__pycache__/typing_extensions.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/cachecontrol/__init__.py create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/cachecontrol/__pycache__/__init__.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/cachecontrol/__pycache__/_cmd.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/cachecontrol/__pycache__/adapter.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/cachecontrol/__pycache__/cache.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/cachecontrol/__pycache__/controller.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/cachecontrol/__pycache__/filewrapper.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/cachecontrol/__pycache__/heuristics.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/cachecontrol/__pycache__/serialize.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/cachecontrol/__pycache__/wrapper.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/cachecontrol/_cmd.py create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/cachecontrol/adapter.py create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/cachecontrol/cache.py create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/cachecontrol/caches/__init__.py create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/cachecontrol/caches/__pycache__/__init__.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/cachecontrol/caches/__pycache__/file_cache.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/cachecontrol/caches/__pycache__/redis_cache.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/cachecontrol/caches/file_cache.py create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/cachecontrol/caches/redis_cache.py create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/cachecontrol/controller.py create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/cachecontrol/filewrapper.py create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/cachecontrol/heuristics.py create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/cachecontrol/py.typed create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/cachecontrol/serialize.py create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/cachecontrol/wrapper.py create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/certifi/__init__.py create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/certifi/__main__.py create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/certifi/__pycache__/__init__.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/certifi/__pycache__/__main__.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/certifi/__pycache__/core.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/certifi/cacert.pem create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/certifi/core.py create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/certifi/py.typed create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/chardet/__init__.py create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/chardet/__pycache__/__init__.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/chardet/__pycache__/big5freq.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/chardet/__pycache__/big5prober.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/chardet/__pycache__/chardistribution.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/chardet/__pycache__/charsetgroupprober.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/chardet/__pycache__/charsetprober.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/chardet/__pycache__/codingstatemachine.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/chardet/__pycache__/codingstatemachinedict.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/chardet/__pycache__/cp949prober.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/chardet/__pycache__/enums.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/chardet/__pycache__/escprober.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/chardet/__pycache__/escsm.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/chardet/__pycache__/eucjpprober.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/chardet/__pycache__/euckrfreq.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/chardet/__pycache__/euckrprober.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/chardet/__pycache__/euctwfreq.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/chardet/__pycache__/euctwprober.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/chardet/__pycache__/gb2312freq.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/chardet/__pycache__/gb2312prober.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/chardet/__pycache__/hebrewprober.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/chardet/__pycache__/jisfreq.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/chardet/__pycache__/johabfreq.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/chardet/__pycache__/johabprober.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/chardet/__pycache__/jpcntx.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/chardet/__pycache__/langbulgarianmodel.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/chardet/__pycache__/langgreekmodel.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/chardet/__pycache__/langhebrewmodel.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/chardet/__pycache__/langhungarianmodel.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/chardet/__pycache__/langrussianmodel.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/chardet/__pycache__/langthaimodel.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/chardet/__pycache__/langturkishmodel.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/chardet/__pycache__/latin1prober.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/chardet/__pycache__/macromanprober.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/chardet/__pycache__/mbcharsetprober.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/chardet/__pycache__/mbcsgroupprober.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/chardet/__pycache__/mbcssm.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/chardet/__pycache__/resultdict.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/chardet/__pycache__/sbcharsetprober.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/chardet/__pycache__/sbcsgroupprober.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/chardet/__pycache__/sjisprober.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/chardet/__pycache__/universaldetector.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/chardet/__pycache__/utf1632prober.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/chardet/__pycache__/utf8prober.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/chardet/__pycache__/version.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/chardet/big5freq.py create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/chardet/big5prober.py create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/chardet/chardistribution.py create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/chardet/charsetgroupprober.py create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/chardet/charsetprober.py create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/chardet/cli/__init__.py create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/chardet/cli/__pycache__/__init__.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/chardet/cli/__pycache__/chardetect.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/chardet/cli/chardetect.py create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/chardet/codingstatemachine.py create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/chardet/codingstatemachinedict.py create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/chardet/cp949prober.py create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/chardet/enums.py create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/chardet/escprober.py create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/chardet/escsm.py create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/chardet/eucjpprober.py create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/chardet/euckrfreq.py create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/chardet/euckrprober.py create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/chardet/euctwfreq.py create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/chardet/euctwprober.py create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/chardet/gb2312freq.py create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/chardet/gb2312prober.py create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/chardet/hebrewprober.py create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/chardet/jisfreq.py create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/chardet/johabfreq.py create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/chardet/johabprober.py create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/chardet/jpcntx.py create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/chardet/langbulgarianmodel.py create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/chardet/langgreekmodel.py create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/chardet/langhebrewmodel.py create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/chardet/langhungarianmodel.py create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/chardet/langrussianmodel.py create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/chardet/langthaimodel.py create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/chardet/langturkishmodel.py create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/chardet/latin1prober.py create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/chardet/macromanprober.py create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/chardet/mbcharsetprober.py create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/chardet/mbcsgroupprober.py create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/chardet/mbcssm.py create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/chardet/metadata/__init__.py create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/chardet/metadata/__pycache__/__init__.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/chardet/metadata/__pycache__/languages.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/chardet/metadata/languages.py create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/chardet/py.typed create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/chardet/resultdict.py create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/chardet/sbcharsetprober.py create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/chardet/sbcsgroupprober.py create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/chardet/sjisprober.py create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/chardet/universaldetector.py create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/chardet/utf1632prober.py create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/chardet/utf8prober.py create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/chardet/version.py create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/colorama/__init__.py create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/colorama/__pycache__/__init__.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/colorama/__pycache__/ansi.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/colorama/__pycache__/ansitowin32.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/colorama/__pycache__/initialise.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/colorama/__pycache__/win32.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/colorama/__pycache__/winterm.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/colorama/ansi.py create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/colorama/ansitowin32.py create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/colorama/initialise.py create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/colorama/tests/__init__.py create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/colorama/tests/__pycache__/__init__.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/colorama/tests/__pycache__/ansi_test.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/colorama/tests/__pycache__/ansitowin32_test.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/colorama/tests/__pycache__/initialise_test.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/colorama/tests/__pycache__/isatty_test.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/colorama/tests/__pycache__/utils.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/colorama/tests/__pycache__/winterm_test.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/colorama/tests/ansi_test.py create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/colorama/tests/ansitowin32_test.py create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/colorama/tests/initialise_test.py create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/colorama/tests/isatty_test.py create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/colorama/tests/utils.py create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/colorama/tests/winterm_test.py create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/colorama/win32.py create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/colorama/winterm.py create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/distlib/__init__.py create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/distlib/__pycache__/__init__.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/distlib/__pycache__/compat.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/distlib/__pycache__/database.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/distlib/__pycache__/index.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/distlib/__pycache__/locators.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/distlib/__pycache__/manifest.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/distlib/__pycache__/markers.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/distlib/__pycache__/metadata.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/distlib/__pycache__/resources.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/distlib/__pycache__/scripts.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/distlib/__pycache__/util.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/distlib/__pycache__/version.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/distlib/__pycache__/wheel.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/distlib/compat.py create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/distlib/database.py create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/distlib/index.py create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/distlib/locators.py create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/distlib/manifest.py create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/distlib/markers.py create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/distlib/metadata.py create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/distlib/resources.py create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/distlib/scripts.py create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/distlib/t32.exe create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/distlib/t64-arm.exe create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/distlib/t64.exe create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/distlib/util.py create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/distlib/version.py create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/distlib/w32.exe create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/distlib/w64-arm.exe create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/distlib/w64.exe create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/distlib/wheel.py create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/distro/__init__.py create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/distro/__main__.py create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/distro/__pycache__/__init__.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/distro/__pycache__/__main__.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/distro/__pycache__/distro.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/distro/distro.py create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/distro/py.typed create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/idna/__init__.py create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/idna/__pycache__/__init__.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/idna/__pycache__/codec.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/idna/__pycache__/compat.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/idna/__pycache__/core.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/idna/__pycache__/idnadata.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/idna/__pycache__/intranges.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/idna/__pycache__/package_data.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/idna/__pycache__/uts46data.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/idna/codec.py create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/idna/compat.py create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/idna/core.py create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/idna/idnadata.py create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/idna/intranges.py create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/idna/package_data.py create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/idna/py.typed create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/idna/uts46data.py create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/msgpack/__init__.py create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/msgpack/__pycache__/__init__.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/msgpack/__pycache__/exceptions.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/msgpack/__pycache__/ext.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/msgpack/__pycache__/fallback.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/msgpack/exceptions.py create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/msgpack/ext.py create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/msgpack/fallback.py create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/packaging/__about__.py create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/packaging/__init__.py create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/packaging/__pycache__/__about__.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/packaging/__pycache__/__init__.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/packaging/__pycache__/_manylinux.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/packaging/__pycache__/_musllinux.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/packaging/__pycache__/_structures.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/packaging/__pycache__/markers.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/packaging/__pycache__/requirements.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/packaging/__pycache__/specifiers.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/packaging/__pycache__/tags.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/packaging/__pycache__/utils.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/packaging/__pycache__/version.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/packaging/_manylinux.py create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/packaging/_musllinux.py create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/packaging/_structures.py create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/packaging/markers.py create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/packaging/py.typed create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/packaging/requirements.py create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/packaging/specifiers.py create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/packaging/tags.py create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/packaging/utils.py create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/packaging/version.py create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/pkg_resources/__init__.py create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/pkg_resources/__pycache__/__init__.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/platformdirs/__init__.py create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/platformdirs/__main__.py create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/platformdirs/__pycache__/__init__.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/platformdirs/__pycache__/__main__.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/platformdirs/__pycache__/android.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/platformdirs/__pycache__/api.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/platformdirs/__pycache__/macos.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/platformdirs/__pycache__/unix.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/platformdirs/__pycache__/version.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/platformdirs/__pycache__/windows.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/platformdirs/android.py create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/platformdirs/api.py create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/platformdirs/macos.py create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/platformdirs/py.typed create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/platformdirs/unix.py create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/platformdirs/version.py create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/platformdirs/windows.py create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/pygments/__init__.py create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/pygments/__main__.py create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/pygments/__pycache__/__init__.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/pygments/__pycache__/__main__.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/pygments/__pycache__/cmdline.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/pygments/__pycache__/console.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/pygments/__pycache__/filter.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/pygments/__pycache__/formatter.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/pygments/__pycache__/lexer.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/pygments/__pycache__/modeline.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/pygments/__pycache__/plugin.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/pygments/__pycache__/regexopt.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/pygments/__pycache__/scanner.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/pygments/__pycache__/sphinxext.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/pygments/__pycache__/style.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/pygments/__pycache__/token.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/pygments/__pycache__/unistring.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/pygments/__pycache__/util.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/pygments/cmdline.py create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/pygments/console.py create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/pygments/filter.py create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/pygments/filters/__init__.py create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/pygments/filters/__pycache__/__init__.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/pygments/formatter.py create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/pygments/formatters/__init__.py create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/pygments/formatters/__pycache__/__init__.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/pygments/formatters/__pycache__/_mapping.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/pygments/formatters/__pycache__/bbcode.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/pygments/formatters/__pycache__/groff.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/pygments/formatters/__pycache__/html.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/pygments/formatters/__pycache__/img.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/pygments/formatters/__pycache__/irc.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/pygments/formatters/__pycache__/latex.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/pygments/formatters/__pycache__/other.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/pygments/formatters/__pycache__/pangomarkup.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/pygments/formatters/__pycache__/rtf.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/pygments/formatters/__pycache__/svg.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/pygments/formatters/__pycache__/terminal.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/pygments/formatters/__pycache__/terminal256.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/pygments/formatters/_mapping.py create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/pygments/formatters/bbcode.py create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/pygments/formatters/groff.py create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/pygments/formatters/html.py create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/pygments/formatters/img.py create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/pygments/formatters/irc.py create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/pygments/formatters/latex.py create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/pygments/formatters/other.py create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/pygments/formatters/pangomarkup.py create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/pygments/formatters/rtf.py create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/pygments/formatters/svg.py create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/pygments/formatters/terminal.py create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/pygments/formatters/terminal256.py create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/pygments/lexer.py create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/pygments/lexers/__init__.py create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/pygments/lexers/__pycache__/__init__.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/pygments/lexers/__pycache__/_mapping.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/pygments/lexers/__pycache__/python.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/pygments/lexers/_mapping.py create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/pygments/lexers/python.py create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/pygments/modeline.py create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/pygments/plugin.py create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/pygments/regexopt.py create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/pygments/scanner.py create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/pygments/sphinxext.py create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/pygments/style.py create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/pygments/styles/__init__.py create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/pygments/styles/__pycache__/__init__.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/pygments/token.py create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/pygments/unistring.py create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/pygments/util.py create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/pyparsing/__init__.py create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/pyparsing/__pycache__/__init__.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/pyparsing/__pycache__/actions.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/pyparsing/__pycache__/common.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/pyparsing/__pycache__/core.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/pyparsing/__pycache__/exceptions.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/pyparsing/__pycache__/helpers.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/pyparsing/__pycache__/results.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/pyparsing/__pycache__/testing.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/pyparsing/__pycache__/unicode.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/pyparsing/__pycache__/util.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/pyparsing/actions.py create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/pyparsing/common.py create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/pyparsing/core.py create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/pyparsing/diagram/__init__.py create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/pyparsing/diagram/__pycache__/__init__.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/pyparsing/exceptions.py create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/pyparsing/helpers.py create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/pyparsing/py.typed create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/pyparsing/results.py create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/pyparsing/testing.py create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/pyparsing/unicode.py create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/pyparsing/util.py create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/pyproject_hooks/__init__.py create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/pyproject_hooks/__pycache__/__init__.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/pyproject_hooks/__pycache__/_compat.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/pyproject_hooks/__pycache__/_impl.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/pyproject_hooks/_compat.py create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/pyproject_hooks/_impl.py create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/pyproject_hooks/_in_process/__init__.py create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/pyproject_hooks/_in_process/__pycache__/__init__.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/pyproject_hooks/_in_process/__pycache__/_in_process.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/pyproject_hooks/_in_process/_in_process.py create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/requests/__init__.py create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/requests/__pycache__/__init__.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/requests/__pycache__/__version__.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/requests/__pycache__/_internal_utils.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/requests/__pycache__/adapters.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/requests/__pycache__/api.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/requests/__pycache__/auth.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/requests/__pycache__/certs.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/requests/__pycache__/compat.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/requests/__pycache__/cookies.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/requests/__pycache__/exceptions.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/requests/__pycache__/help.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/requests/__pycache__/hooks.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/requests/__pycache__/models.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/requests/__pycache__/packages.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/requests/__pycache__/sessions.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/requests/__pycache__/status_codes.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/requests/__pycache__/structures.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/requests/__pycache__/utils.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/requests/__version__.py create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/requests/_internal_utils.py create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/requests/adapters.py create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/requests/api.py create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/requests/auth.py create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/requests/certs.py create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/requests/compat.py create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/requests/cookies.py create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/requests/exceptions.py create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/requests/help.py create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/requests/hooks.py create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/requests/models.py create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/requests/packages.py create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/requests/sessions.py create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/requests/status_codes.py create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/requests/structures.py create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/requests/utils.py create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/resolvelib/__init__.py create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/resolvelib/__pycache__/__init__.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/resolvelib/__pycache__/providers.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/resolvelib/__pycache__/reporters.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/resolvelib/__pycache__/resolvers.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/resolvelib/__pycache__/structs.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/resolvelib/compat/__init__.py create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/resolvelib/compat/__pycache__/__init__.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/resolvelib/compat/__pycache__/collections_abc.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/resolvelib/compat/collections_abc.py create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/resolvelib/providers.py create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/resolvelib/py.typed create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/resolvelib/reporters.py create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/resolvelib/resolvers.py create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/resolvelib/structs.py create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/rich/__init__.py create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/rich/__main__.py create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/__init__.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/__main__.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/_cell_widths.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/_emoji_codes.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/_emoji_replace.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/_export_format.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/_extension.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/_fileno.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/_inspect.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/_log_render.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/_loop.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/_null_file.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/_palettes.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/_pick.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/_ratio.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/_spinners.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/_stack.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/_timer.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/_win32_console.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/_windows.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/_windows_renderer.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/_wrap.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/abc.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/align.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/ansi.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/bar.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/box.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/cells.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/color.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/color_triplet.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/columns.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/console.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/constrain.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/containers.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/control.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/default_styles.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/diagnose.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/emoji.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/errors.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/file_proxy.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/filesize.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/highlighter.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/json.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/jupyter.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/layout.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/live.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/live_render.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/logging.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/markup.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/measure.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/padding.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/pager.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/palette.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/panel.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/pretty.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/progress.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/progress_bar.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/prompt.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/protocol.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/region.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/repr.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/rule.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/scope.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/screen.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/segment.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/spinner.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/status.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/style.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/styled.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/syntax.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/table.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/terminal_theme.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/text.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/theme.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/themes.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/traceback.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/tree.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/rich/_cell_widths.py create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/rich/_emoji_codes.py create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/rich/_emoji_replace.py create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/rich/_export_format.py create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/rich/_extension.py create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/rich/_fileno.py create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/rich/_inspect.py create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/rich/_log_render.py create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/rich/_loop.py create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/rich/_null_file.py create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/rich/_palettes.py create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/rich/_pick.py create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/rich/_ratio.py create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/rich/_spinners.py create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/rich/_stack.py create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/rich/_timer.py create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/rich/_win32_console.py create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/rich/_windows.py create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/rich/_windows_renderer.py create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/rich/_wrap.py create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/rich/abc.py create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/rich/align.py create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/rich/ansi.py create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/rich/bar.py create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/rich/box.py create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/rich/cells.py create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/rich/color.py create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/rich/color_triplet.py create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/rich/columns.py create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/rich/console.py create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/rich/constrain.py create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/rich/containers.py create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/rich/control.py create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/rich/default_styles.py create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/rich/diagnose.py create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/rich/emoji.py create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/rich/errors.py create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/rich/file_proxy.py create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/rich/filesize.py create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/rich/highlighter.py create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/rich/json.py create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/rich/jupyter.py create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/rich/layout.py create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/rich/live.py create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/rich/live_render.py create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/rich/logging.py create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/rich/markup.py create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/rich/measure.py create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/rich/padding.py create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/rich/pager.py create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/rich/palette.py create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/rich/panel.py create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/rich/pretty.py create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/rich/progress.py create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/rich/progress_bar.py create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/rich/prompt.py create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/rich/protocol.py create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/rich/py.typed create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/rich/region.py create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/rich/repr.py create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/rich/rule.py create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/rich/scope.py create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/rich/screen.py create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/rich/segment.py create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/rich/spinner.py create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/rich/status.py create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/rich/style.py create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/rich/styled.py create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/rich/syntax.py create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/rich/table.py create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/rich/terminal_theme.py create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/rich/text.py create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/rich/theme.py create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/rich/themes.py create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/rich/traceback.py create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/rich/tree.py create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/six.py create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/tenacity/__init__.py create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/tenacity/__pycache__/__init__.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/tenacity/__pycache__/_asyncio.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/tenacity/__pycache__/_utils.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/tenacity/__pycache__/after.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/tenacity/__pycache__/before.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/tenacity/__pycache__/before_sleep.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/tenacity/__pycache__/nap.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/tenacity/__pycache__/retry.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/tenacity/__pycache__/stop.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/tenacity/__pycache__/tornadoweb.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/tenacity/__pycache__/wait.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/tenacity/_asyncio.py create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/tenacity/_utils.py create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/tenacity/after.py create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/tenacity/before.py create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/tenacity/before_sleep.py create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/tenacity/nap.py create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/tenacity/py.typed create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/tenacity/retry.py create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/tenacity/stop.py create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/tenacity/tornadoweb.py create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/tenacity/wait.py create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/tomli/__init__.py create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/tomli/__pycache__/__init__.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/tomli/__pycache__/_parser.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/tomli/__pycache__/_re.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/tomli/__pycache__/_types.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/tomli/_parser.py create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/tomli/_re.py create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/tomli/_types.py create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/tomli/py.typed create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/truststore/__init__.py create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/truststore/__pycache__/__init__.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/truststore/__pycache__/_api.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/truststore/__pycache__/_macos.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/truststore/__pycache__/_openssl.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/truststore/__pycache__/_ssl_constants.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/truststore/__pycache__/_windows.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/truststore/_api.py create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/truststore/_macos.py create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/truststore/_openssl.py create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/truststore/_ssl_constants.py create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/truststore/_windows.py create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/truststore/py.typed create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/typing_extensions.py create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/urllib3/__init__.py create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/urllib3/__pycache__/__init__.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/urllib3/__pycache__/_collections.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/urllib3/__pycache__/_version.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/urllib3/__pycache__/connection.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/urllib3/__pycache__/connectionpool.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/urllib3/__pycache__/exceptions.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/urllib3/__pycache__/fields.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/urllib3/__pycache__/filepost.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/urllib3/__pycache__/poolmanager.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/urllib3/__pycache__/request.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/urllib3/__pycache__/response.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/urllib3/_collections.py create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/urllib3/_version.py create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/urllib3/connection.py create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/urllib3/connectionpool.py create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/urllib3/contrib/__init__.py create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/urllib3/contrib/__pycache__/__init__.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/urllib3/contrib/__pycache__/_appengine_environ.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/urllib3/contrib/__pycache__/appengine.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/urllib3/contrib/__pycache__/ntlmpool.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/urllib3/contrib/__pycache__/pyopenssl.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/urllib3/contrib/__pycache__/securetransport.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/urllib3/contrib/__pycache__/socks.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/urllib3/contrib/_appengine_environ.py create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/urllib3/contrib/_securetransport/__init__.py create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/urllib3/contrib/_securetransport/__pycache__/__init__.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/urllib3/contrib/_securetransport/__pycache__/bindings.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/urllib3/contrib/_securetransport/__pycache__/low_level.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/urllib3/contrib/_securetransport/bindings.py create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/urllib3/contrib/_securetransport/low_level.py create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/urllib3/contrib/appengine.py create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/urllib3/contrib/ntlmpool.py create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/urllib3/contrib/pyopenssl.py create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/urllib3/contrib/securetransport.py create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/urllib3/contrib/socks.py create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/urllib3/exceptions.py create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/urllib3/fields.py create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/urllib3/filepost.py create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/urllib3/packages/__init__.py create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/urllib3/packages/__pycache__/__init__.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/urllib3/packages/__pycache__/six.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/urllib3/packages/backports/__init__.py create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/urllib3/packages/backports/__pycache__/__init__.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/urllib3/packages/backports/__pycache__/makefile.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/urllib3/packages/backports/__pycache__/weakref_finalize.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/urllib3/packages/backports/makefile.py create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/urllib3/packages/backports/weakref_finalize.py create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/urllib3/packages/six.py create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/urllib3/poolmanager.py create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/urllib3/request.py create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/urllib3/response.py create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/urllib3/util/__init__.py create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/urllib3/util/__pycache__/__init__.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/urllib3/util/__pycache__/connection.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/urllib3/util/__pycache__/proxy.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/urllib3/util/__pycache__/queue.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/urllib3/util/__pycache__/request.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/urllib3/util/__pycache__/response.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/urllib3/util/__pycache__/retry.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/urllib3/util/__pycache__/ssl_.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/urllib3/util/__pycache__/ssl_match_hostname.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/urllib3/util/__pycache__/ssltransport.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/urllib3/util/__pycache__/timeout.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/urllib3/util/__pycache__/url.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/urllib3/util/__pycache__/wait.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/urllib3/util/connection.py create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/urllib3/util/proxy.py create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/urllib3/util/queue.py create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/urllib3/util/request.py create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/urllib3/util/response.py create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/urllib3/util/retry.py create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/urllib3/util/ssl_.py create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/urllib3/util/ssl_match_hostname.py create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/urllib3/util/ssltransport.py create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/urllib3/util/timeout.py create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/urllib3/util/url.py create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/urllib3/util/wait.py create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/vendor.txt create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/webencodings/__init__.py create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/webencodings/__pycache__/__init__.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/webencodings/__pycache__/labels.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/webencodings/__pycache__/mklabels.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/webencodings/__pycache__/tests.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/webencodings/__pycache__/x_user_defined.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/webencodings/labels.py create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/webencodings/mklabels.py create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/webencodings/tests.py create mode 100644 tests/lib/python3.11/site-packages/pip/_vendor/webencodings/x_user_defined.py create mode 100644 tests/lib/python3.11/site-packages/pip/py.typed create mode 100644 tests/lib/python3.11/site-packages/pkg_resources/__init__.py create mode 100644 tests/lib/python3.11/site-packages/pkg_resources/__pycache__/__init__.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/pkg_resources/_vendor/__init__.py create mode 100644 tests/lib/python3.11/site-packages/pkg_resources/_vendor/__pycache__/__init__.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/pkg_resources/_vendor/__pycache__/appdirs.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/pkg_resources/_vendor/__pycache__/zipp.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/pkg_resources/_vendor/appdirs.py create mode 100644 tests/lib/python3.11/site-packages/pkg_resources/_vendor/importlib_resources/__init__.py create mode 100644 tests/lib/python3.11/site-packages/pkg_resources/_vendor/importlib_resources/__pycache__/__init__.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/pkg_resources/_vendor/importlib_resources/__pycache__/_adapters.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/pkg_resources/_vendor/importlib_resources/__pycache__/_common.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/pkg_resources/_vendor/importlib_resources/__pycache__/_compat.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/pkg_resources/_vendor/importlib_resources/__pycache__/_itertools.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/pkg_resources/_vendor/importlib_resources/__pycache__/_legacy.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/pkg_resources/_vendor/importlib_resources/__pycache__/abc.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/pkg_resources/_vendor/importlib_resources/__pycache__/readers.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/pkg_resources/_vendor/importlib_resources/__pycache__/simple.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/pkg_resources/_vendor/importlib_resources/_adapters.py create mode 100644 tests/lib/python3.11/site-packages/pkg_resources/_vendor/importlib_resources/_common.py create mode 100644 tests/lib/python3.11/site-packages/pkg_resources/_vendor/importlib_resources/_compat.py create mode 100644 tests/lib/python3.11/site-packages/pkg_resources/_vendor/importlib_resources/_itertools.py create mode 100644 tests/lib/python3.11/site-packages/pkg_resources/_vendor/importlib_resources/_legacy.py create mode 100644 tests/lib/python3.11/site-packages/pkg_resources/_vendor/importlib_resources/abc.py create mode 100644 tests/lib/python3.11/site-packages/pkg_resources/_vendor/importlib_resources/readers.py create mode 100644 tests/lib/python3.11/site-packages/pkg_resources/_vendor/importlib_resources/simple.py create mode 100644 tests/lib/python3.11/site-packages/pkg_resources/_vendor/jaraco/__init__.py create mode 100644 tests/lib/python3.11/site-packages/pkg_resources/_vendor/jaraco/__pycache__/__init__.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/pkg_resources/_vendor/jaraco/__pycache__/context.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/pkg_resources/_vendor/jaraco/__pycache__/functools.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/pkg_resources/_vendor/jaraco/context.py create mode 100644 tests/lib/python3.11/site-packages/pkg_resources/_vendor/jaraco/functools.py create mode 100644 tests/lib/python3.11/site-packages/pkg_resources/_vendor/jaraco/text/__init__.py create mode 100644 tests/lib/python3.11/site-packages/pkg_resources/_vendor/jaraco/text/__pycache__/__init__.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/pkg_resources/_vendor/more_itertools/__init__.py create mode 100644 tests/lib/python3.11/site-packages/pkg_resources/_vendor/more_itertools/__pycache__/__init__.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/pkg_resources/_vendor/more_itertools/__pycache__/more.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/pkg_resources/_vendor/more_itertools/__pycache__/recipes.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/pkg_resources/_vendor/more_itertools/more.py create mode 100644 tests/lib/python3.11/site-packages/pkg_resources/_vendor/more_itertools/recipes.py create mode 100644 tests/lib/python3.11/site-packages/pkg_resources/_vendor/packaging/__about__.py create mode 100644 tests/lib/python3.11/site-packages/pkg_resources/_vendor/packaging/__init__.py create mode 100644 tests/lib/python3.11/site-packages/pkg_resources/_vendor/packaging/__pycache__/__about__.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/pkg_resources/_vendor/packaging/__pycache__/__init__.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/pkg_resources/_vendor/packaging/__pycache__/_manylinux.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/pkg_resources/_vendor/packaging/__pycache__/_musllinux.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/pkg_resources/_vendor/packaging/__pycache__/_structures.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/pkg_resources/_vendor/packaging/__pycache__/markers.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/pkg_resources/_vendor/packaging/__pycache__/requirements.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/pkg_resources/_vendor/packaging/__pycache__/specifiers.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/pkg_resources/_vendor/packaging/__pycache__/tags.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/pkg_resources/_vendor/packaging/__pycache__/utils.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/pkg_resources/_vendor/packaging/__pycache__/version.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/pkg_resources/_vendor/packaging/_manylinux.py create mode 100644 tests/lib/python3.11/site-packages/pkg_resources/_vendor/packaging/_musllinux.py create mode 100644 tests/lib/python3.11/site-packages/pkg_resources/_vendor/packaging/_structures.py create mode 100644 tests/lib/python3.11/site-packages/pkg_resources/_vendor/packaging/markers.py create mode 100644 tests/lib/python3.11/site-packages/pkg_resources/_vendor/packaging/requirements.py create mode 100644 tests/lib/python3.11/site-packages/pkg_resources/_vendor/packaging/specifiers.py create mode 100644 tests/lib/python3.11/site-packages/pkg_resources/_vendor/packaging/tags.py create mode 100644 tests/lib/python3.11/site-packages/pkg_resources/_vendor/packaging/utils.py create mode 100644 tests/lib/python3.11/site-packages/pkg_resources/_vendor/packaging/version.py create mode 100644 tests/lib/python3.11/site-packages/pkg_resources/_vendor/pyparsing/__init__.py create mode 100644 tests/lib/python3.11/site-packages/pkg_resources/_vendor/pyparsing/__pycache__/__init__.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/pkg_resources/_vendor/pyparsing/__pycache__/actions.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/pkg_resources/_vendor/pyparsing/__pycache__/common.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/pkg_resources/_vendor/pyparsing/__pycache__/core.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/pkg_resources/_vendor/pyparsing/__pycache__/exceptions.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/pkg_resources/_vendor/pyparsing/__pycache__/helpers.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/pkg_resources/_vendor/pyparsing/__pycache__/results.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/pkg_resources/_vendor/pyparsing/__pycache__/testing.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/pkg_resources/_vendor/pyparsing/__pycache__/unicode.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/pkg_resources/_vendor/pyparsing/__pycache__/util.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/pkg_resources/_vendor/pyparsing/actions.py create mode 100644 tests/lib/python3.11/site-packages/pkg_resources/_vendor/pyparsing/common.py create mode 100644 tests/lib/python3.11/site-packages/pkg_resources/_vendor/pyparsing/core.py create mode 100644 tests/lib/python3.11/site-packages/pkg_resources/_vendor/pyparsing/diagram/__init__.py create mode 100644 tests/lib/python3.11/site-packages/pkg_resources/_vendor/pyparsing/diagram/__pycache__/__init__.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/pkg_resources/_vendor/pyparsing/exceptions.py create mode 100644 tests/lib/python3.11/site-packages/pkg_resources/_vendor/pyparsing/helpers.py create mode 100644 tests/lib/python3.11/site-packages/pkg_resources/_vendor/pyparsing/results.py create mode 100644 tests/lib/python3.11/site-packages/pkg_resources/_vendor/pyparsing/testing.py create mode 100644 tests/lib/python3.11/site-packages/pkg_resources/_vendor/pyparsing/unicode.py create mode 100644 tests/lib/python3.11/site-packages/pkg_resources/_vendor/pyparsing/util.py create mode 100644 tests/lib/python3.11/site-packages/pkg_resources/_vendor/zipp.py create mode 100644 tests/lib/python3.11/site-packages/pkg_resources/extern/__init__.py create mode 100644 tests/lib/python3.11/site-packages/pkg_resources/extern/__pycache__/__init__.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/setuptools-65.5.0.dist-info/INSTALLER create mode 100644 tests/lib/python3.11/site-packages/setuptools-65.5.0.dist-info/LICENSE create mode 100644 tests/lib/python3.11/site-packages/setuptools-65.5.0.dist-info/METADATA create mode 100644 tests/lib/python3.11/site-packages/setuptools-65.5.0.dist-info/RECORD create mode 100644 tests/lib/python3.11/site-packages/setuptools-65.5.0.dist-info/REQUESTED create mode 100644 tests/lib/python3.11/site-packages/setuptools-65.5.0.dist-info/WHEEL create mode 100644 tests/lib/python3.11/site-packages/setuptools-65.5.0.dist-info/entry_points.txt create mode 100644 tests/lib/python3.11/site-packages/setuptools-65.5.0.dist-info/top_level.txt create mode 100644 tests/lib/python3.11/site-packages/setuptools/__init__.py create mode 100644 tests/lib/python3.11/site-packages/setuptools/__pycache__/__init__.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/setuptools/__pycache__/_deprecation_warning.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/setuptools/__pycache__/_entry_points.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/setuptools/__pycache__/_imp.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/setuptools/__pycache__/_importlib.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/setuptools/__pycache__/_itertools.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/setuptools/__pycache__/_path.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/setuptools/__pycache__/_reqs.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/setuptools/__pycache__/archive_util.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/setuptools/__pycache__/build_meta.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/setuptools/__pycache__/dep_util.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/setuptools/__pycache__/depends.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/setuptools/__pycache__/discovery.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/setuptools/__pycache__/dist.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/setuptools/__pycache__/errors.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/setuptools/__pycache__/extension.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/setuptools/__pycache__/glob.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/setuptools/__pycache__/installer.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/setuptools/__pycache__/launch.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/setuptools/__pycache__/logging.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/setuptools/__pycache__/monkey.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/setuptools/__pycache__/msvc.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/setuptools/__pycache__/namespaces.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/setuptools/__pycache__/package_index.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/setuptools/__pycache__/py34compat.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/setuptools/__pycache__/sandbox.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/setuptools/__pycache__/unicode_utils.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/setuptools/__pycache__/version.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/setuptools/__pycache__/wheel.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/setuptools/__pycache__/windows_support.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/setuptools/_deprecation_warning.py create mode 100644 tests/lib/python3.11/site-packages/setuptools/_distutils/__init__.py create mode 100644 tests/lib/python3.11/site-packages/setuptools/_distutils/__pycache__/__init__.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/setuptools/_distutils/__pycache__/_collections.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/setuptools/_distutils/__pycache__/_functools.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/setuptools/_distutils/__pycache__/_macos_compat.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/setuptools/_distutils/__pycache__/_msvccompiler.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/setuptools/_distutils/__pycache__/archive_util.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/setuptools/_distutils/__pycache__/bcppcompiler.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/setuptools/_distutils/__pycache__/ccompiler.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/setuptools/_distutils/__pycache__/cmd.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/setuptools/_distutils/__pycache__/config.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/setuptools/_distutils/__pycache__/core.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/setuptools/_distutils/__pycache__/cygwinccompiler.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/setuptools/_distutils/__pycache__/debug.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/setuptools/_distutils/__pycache__/dep_util.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/setuptools/_distutils/__pycache__/dir_util.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/setuptools/_distutils/__pycache__/dist.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/setuptools/_distutils/__pycache__/errors.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/setuptools/_distutils/__pycache__/extension.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/setuptools/_distutils/__pycache__/fancy_getopt.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/setuptools/_distutils/__pycache__/file_util.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/setuptools/_distutils/__pycache__/filelist.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/setuptools/_distutils/__pycache__/log.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/setuptools/_distutils/__pycache__/msvc9compiler.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/setuptools/_distutils/__pycache__/msvccompiler.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/setuptools/_distutils/__pycache__/py38compat.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/setuptools/_distutils/__pycache__/py39compat.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/setuptools/_distutils/__pycache__/spawn.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/setuptools/_distutils/__pycache__/sysconfig.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/setuptools/_distutils/__pycache__/text_file.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/setuptools/_distutils/__pycache__/unixccompiler.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/setuptools/_distutils/__pycache__/util.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/setuptools/_distutils/__pycache__/version.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/setuptools/_distutils/__pycache__/versionpredicate.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/setuptools/_distutils/_collections.py create mode 100644 tests/lib/python3.11/site-packages/setuptools/_distutils/_functools.py create mode 100644 tests/lib/python3.11/site-packages/setuptools/_distutils/_macos_compat.py create mode 100644 tests/lib/python3.11/site-packages/setuptools/_distutils/_msvccompiler.py create mode 100644 tests/lib/python3.11/site-packages/setuptools/_distutils/archive_util.py create mode 100644 tests/lib/python3.11/site-packages/setuptools/_distutils/bcppcompiler.py create mode 100644 tests/lib/python3.11/site-packages/setuptools/_distutils/ccompiler.py create mode 100644 tests/lib/python3.11/site-packages/setuptools/_distutils/cmd.py create mode 100644 tests/lib/python3.11/site-packages/setuptools/_distutils/command/__init__.py create mode 100644 tests/lib/python3.11/site-packages/setuptools/_distutils/command/__pycache__/__init__.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/setuptools/_distutils/command/__pycache__/_framework_compat.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/setuptools/_distutils/command/__pycache__/bdist.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/setuptools/_distutils/command/__pycache__/bdist_dumb.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/setuptools/_distutils/command/__pycache__/bdist_rpm.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/setuptools/_distutils/command/__pycache__/build.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/setuptools/_distutils/command/__pycache__/build_clib.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/setuptools/_distutils/command/__pycache__/build_ext.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/setuptools/_distutils/command/__pycache__/build_py.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/setuptools/_distutils/command/__pycache__/build_scripts.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/setuptools/_distutils/command/__pycache__/check.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/setuptools/_distutils/command/__pycache__/clean.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/setuptools/_distutils/command/__pycache__/config.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/setuptools/_distutils/command/__pycache__/install.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/setuptools/_distutils/command/__pycache__/install_data.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/setuptools/_distutils/command/__pycache__/install_egg_info.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/setuptools/_distutils/command/__pycache__/install_headers.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/setuptools/_distutils/command/__pycache__/install_lib.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/setuptools/_distutils/command/__pycache__/install_scripts.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/setuptools/_distutils/command/__pycache__/py37compat.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/setuptools/_distutils/command/__pycache__/register.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/setuptools/_distutils/command/__pycache__/sdist.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/setuptools/_distutils/command/__pycache__/upload.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/setuptools/_distutils/command/_framework_compat.py create mode 100644 tests/lib/python3.11/site-packages/setuptools/_distutils/command/bdist.py create mode 100644 tests/lib/python3.11/site-packages/setuptools/_distutils/command/bdist_dumb.py create mode 100644 tests/lib/python3.11/site-packages/setuptools/_distutils/command/bdist_rpm.py create mode 100644 tests/lib/python3.11/site-packages/setuptools/_distutils/command/build.py create mode 100644 tests/lib/python3.11/site-packages/setuptools/_distutils/command/build_clib.py create mode 100644 tests/lib/python3.11/site-packages/setuptools/_distutils/command/build_ext.py create mode 100644 tests/lib/python3.11/site-packages/setuptools/_distutils/command/build_py.py create mode 100644 tests/lib/python3.11/site-packages/setuptools/_distutils/command/build_scripts.py create mode 100644 tests/lib/python3.11/site-packages/setuptools/_distutils/command/check.py create mode 100644 tests/lib/python3.11/site-packages/setuptools/_distutils/command/clean.py create mode 100644 tests/lib/python3.11/site-packages/setuptools/_distutils/command/config.py create mode 100644 tests/lib/python3.11/site-packages/setuptools/_distutils/command/install.py create mode 100644 tests/lib/python3.11/site-packages/setuptools/_distutils/command/install_data.py create mode 100644 tests/lib/python3.11/site-packages/setuptools/_distutils/command/install_egg_info.py create mode 100644 tests/lib/python3.11/site-packages/setuptools/_distutils/command/install_headers.py create mode 100644 tests/lib/python3.11/site-packages/setuptools/_distutils/command/install_lib.py create mode 100644 tests/lib/python3.11/site-packages/setuptools/_distutils/command/install_scripts.py create mode 100644 tests/lib/python3.11/site-packages/setuptools/_distutils/command/py37compat.py create mode 100644 tests/lib/python3.11/site-packages/setuptools/_distutils/command/register.py create mode 100644 tests/lib/python3.11/site-packages/setuptools/_distutils/command/sdist.py create mode 100644 tests/lib/python3.11/site-packages/setuptools/_distutils/command/upload.py create mode 100644 tests/lib/python3.11/site-packages/setuptools/_distutils/config.py create mode 100644 tests/lib/python3.11/site-packages/setuptools/_distutils/core.py create mode 100644 tests/lib/python3.11/site-packages/setuptools/_distutils/cygwinccompiler.py create mode 100644 tests/lib/python3.11/site-packages/setuptools/_distutils/debug.py create mode 100644 tests/lib/python3.11/site-packages/setuptools/_distutils/dep_util.py create mode 100644 tests/lib/python3.11/site-packages/setuptools/_distutils/dir_util.py create mode 100644 tests/lib/python3.11/site-packages/setuptools/_distutils/dist.py create mode 100644 tests/lib/python3.11/site-packages/setuptools/_distutils/errors.py create mode 100644 tests/lib/python3.11/site-packages/setuptools/_distutils/extension.py create mode 100644 tests/lib/python3.11/site-packages/setuptools/_distutils/fancy_getopt.py create mode 100644 tests/lib/python3.11/site-packages/setuptools/_distutils/file_util.py create mode 100644 tests/lib/python3.11/site-packages/setuptools/_distutils/filelist.py create mode 100644 tests/lib/python3.11/site-packages/setuptools/_distutils/log.py create mode 100644 tests/lib/python3.11/site-packages/setuptools/_distutils/msvc9compiler.py create mode 100644 tests/lib/python3.11/site-packages/setuptools/_distutils/msvccompiler.py create mode 100644 tests/lib/python3.11/site-packages/setuptools/_distutils/py38compat.py create mode 100644 tests/lib/python3.11/site-packages/setuptools/_distutils/py39compat.py create mode 100644 tests/lib/python3.11/site-packages/setuptools/_distutils/spawn.py create mode 100644 tests/lib/python3.11/site-packages/setuptools/_distutils/sysconfig.py create mode 100644 tests/lib/python3.11/site-packages/setuptools/_distutils/text_file.py create mode 100644 tests/lib/python3.11/site-packages/setuptools/_distutils/unixccompiler.py create mode 100644 tests/lib/python3.11/site-packages/setuptools/_distutils/util.py create mode 100644 tests/lib/python3.11/site-packages/setuptools/_distutils/version.py create mode 100644 tests/lib/python3.11/site-packages/setuptools/_distutils/versionpredicate.py create mode 100644 tests/lib/python3.11/site-packages/setuptools/_entry_points.py create mode 100644 tests/lib/python3.11/site-packages/setuptools/_imp.py create mode 100644 tests/lib/python3.11/site-packages/setuptools/_importlib.py create mode 100644 tests/lib/python3.11/site-packages/setuptools/_itertools.py create mode 100644 tests/lib/python3.11/site-packages/setuptools/_path.py create mode 100644 tests/lib/python3.11/site-packages/setuptools/_reqs.py create mode 100644 tests/lib/python3.11/site-packages/setuptools/_vendor/__init__.py create mode 100644 tests/lib/python3.11/site-packages/setuptools/_vendor/__pycache__/__init__.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/setuptools/_vendor/__pycache__/ordered_set.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/setuptools/_vendor/__pycache__/typing_extensions.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/setuptools/_vendor/__pycache__/zipp.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/setuptools/_vendor/importlib_metadata/__init__.py create mode 100644 tests/lib/python3.11/site-packages/setuptools/_vendor/importlib_metadata/__pycache__/__init__.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/setuptools/_vendor/importlib_metadata/__pycache__/_adapters.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/setuptools/_vendor/importlib_metadata/__pycache__/_collections.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/setuptools/_vendor/importlib_metadata/__pycache__/_compat.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/setuptools/_vendor/importlib_metadata/__pycache__/_functools.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/setuptools/_vendor/importlib_metadata/__pycache__/_itertools.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/setuptools/_vendor/importlib_metadata/__pycache__/_meta.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/setuptools/_vendor/importlib_metadata/__pycache__/_text.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/setuptools/_vendor/importlib_metadata/_adapters.py create mode 100644 tests/lib/python3.11/site-packages/setuptools/_vendor/importlib_metadata/_collections.py create mode 100644 tests/lib/python3.11/site-packages/setuptools/_vendor/importlib_metadata/_compat.py create mode 100644 tests/lib/python3.11/site-packages/setuptools/_vendor/importlib_metadata/_functools.py create mode 100644 tests/lib/python3.11/site-packages/setuptools/_vendor/importlib_metadata/_itertools.py create mode 100644 tests/lib/python3.11/site-packages/setuptools/_vendor/importlib_metadata/_meta.py create mode 100644 tests/lib/python3.11/site-packages/setuptools/_vendor/importlib_metadata/_text.py create mode 100644 tests/lib/python3.11/site-packages/setuptools/_vendor/importlib_resources/__init__.py create mode 100644 tests/lib/python3.11/site-packages/setuptools/_vendor/importlib_resources/__pycache__/__init__.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/setuptools/_vendor/importlib_resources/__pycache__/_adapters.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/setuptools/_vendor/importlib_resources/__pycache__/_common.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/setuptools/_vendor/importlib_resources/__pycache__/_compat.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/setuptools/_vendor/importlib_resources/__pycache__/_itertools.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/setuptools/_vendor/importlib_resources/__pycache__/_legacy.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/setuptools/_vendor/importlib_resources/__pycache__/abc.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/setuptools/_vendor/importlib_resources/__pycache__/readers.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/setuptools/_vendor/importlib_resources/__pycache__/simple.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/setuptools/_vendor/importlib_resources/_adapters.py create mode 100644 tests/lib/python3.11/site-packages/setuptools/_vendor/importlib_resources/_common.py create mode 100644 tests/lib/python3.11/site-packages/setuptools/_vendor/importlib_resources/_compat.py create mode 100644 tests/lib/python3.11/site-packages/setuptools/_vendor/importlib_resources/_itertools.py create mode 100644 tests/lib/python3.11/site-packages/setuptools/_vendor/importlib_resources/_legacy.py create mode 100644 tests/lib/python3.11/site-packages/setuptools/_vendor/importlib_resources/abc.py create mode 100644 tests/lib/python3.11/site-packages/setuptools/_vendor/importlib_resources/readers.py create mode 100644 tests/lib/python3.11/site-packages/setuptools/_vendor/importlib_resources/simple.py create mode 100644 tests/lib/python3.11/site-packages/setuptools/_vendor/jaraco/__init__.py create mode 100644 tests/lib/python3.11/site-packages/setuptools/_vendor/jaraco/__pycache__/__init__.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/setuptools/_vendor/jaraco/__pycache__/context.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/setuptools/_vendor/jaraco/__pycache__/functools.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/setuptools/_vendor/jaraco/context.py create mode 100644 tests/lib/python3.11/site-packages/setuptools/_vendor/jaraco/functools.py create mode 100644 tests/lib/python3.11/site-packages/setuptools/_vendor/jaraco/text/__init__.py create mode 100644 tests/lib/python3.11/site-packages/setuptools/_vendor/jaraco/text/__pycache__/__init__.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/setuptools/_vendor/more_itertools/__init__.py create mode 100644 tests/lib/python3.11/site-packages/setuptools/_vendor/more_itertools/__pycache__/__init__.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/setuptools/_vendor/more_itertools/__pycache__/more.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/setuptools/_vendor/more_itertools/__pycache__/recipes.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/setuptools/_vendor/more_itertools/more.py create mode 100644 tests/lib/python3.11/site-packages/setuptools/_vendor/more_itertools/recipes.py create mode 100644 tests/lib/python3.11/site-packages/setuptools/_vendor/ordered_set.py create mode 100644 tests/lib/python3.11/site-packages/setuptools/_vendor/packaging/__about__.py create mode 100644 tests/lib/python3.11/site-packages/setuptools/_vendor/packaging/__init__.py create mode 100644 tests/lib/python3.11/site-packages/setuptools/_vendor/packaging/__pycache__/__about__.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/setuptools/_vendor/packaging/__pycache__/__init__.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/setuptools/_vendor/packaging/__pycache__/_manylinux.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/setuptools/_vendor/packaging/__pycache__/_musllinux.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/setuptools/_vendor/packaging/__pycache__/_structures.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/setuptools/_vendor/packaging/__pycache__/markers.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/setuptools/_vendor/packaging/__pycache__/requirements.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/setuptools/_vendor/packaging/__pycache__/specifiers.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/setuptools/_vendor/packaging/__pycache__/tags.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/setuptools/_vendor/packaging/__pycache__/utils.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/setuptools/_vendor/packaging/__pycache__/version.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/setuptools/_vendor/packaging/_manylinux.py create mode 100644 tests/lib/python3.11/site-packages/setuptools/_vendor/packaging/_musllinux.py create mode 100644 tests/lib/python3.11/site-packages/setuptools/_vendor/packaging/_structures.py create mode 100644 tests/lib/python3.11/site-packages/setuptools/_vendor/packaging/markers.py create mode 100644 tests/lib/python3.11/site-packages/setuptools/_vendor/packaging/requirements.py create mode 100644 tests/lib/python3.11/site-packages/setuptools/_vendor/packaging/specifiers.py create mode 100644 tests/lib/python3.11/site-packages/setuptools/_vendor/packaging/tags.py create mode 100644 tests/lib/python3.11/site-packages/setuptools/_vendor/packaging/utils.py create mode 100644 tests/lib/python3.11/site-packages/setuptools/_vendor/packaging/version.py create mode 100644 tests/lib/python3.11/site-packages/setuptools/_vendor/pyparsing/__init__.py create mode 100644 tests/lib/python3.11/site-packages/setuptools/_vendor/pyparsing/__pycache__/__init__.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/setuptools/_vendor/pyparsing/__pycache__/actions.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/setuptools/_vendor/pyparsing/__pycache__/common.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/setuptools/_vendor/pyparsing/__pycache__/core.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/setuptools/_vendor/pyparsing/__pycache__/exceptions.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/setuptools/_vendor/pyparsing/__pycache__/helpers.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/setuptools/_vendor/pyparsing/__pycache__/results.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/setuptools/_vendor/pyparsing/__pycache__/testing.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/setuptools/_vendor/pyparsing/__pycache__/unicode.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/setuptools/_vendor/pyparsing/__pycache__/util.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/setuptools/_vendor/pyparsing/actions.py create mode 100644 tests/lib/python3.11/site-packages/setuptools/_vendor/pyparsing/common.py create mode 100644 tests/lib/python3.11/site-packages/setuptools/_vendor/pyparsing/core.py create mode 100644 tests/lib/python3.11/site-packages/setuptools/_vendor/pyparsing/diagram/__init__.py create mode 100644 tests/lib/python3.11/site-packages/setuptools/_vendor/pyparsing/diagram/__pycache__/__init__.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/setuptools/_vendor/pyparsing/exceptions.py create mode 100644 tests/lib/python3.11/site-packages/setuptools/_vendor/pyparsing/helpers.py create mode 100644 tests/lib/python3.11/site-packages/setuptools/_vendor/pyparsing/results.py create mode 100644 tests/lib/python3.11/site-packages/setuptools/_vendor/pyparsing/testing.py create mode 100644 tests/lib/python3.11/site-packages/setuptools/_vendor/pyparsing/unicode.py create mode 100644 tests/lib/python3.11/site-packages/setuptools/_vendor/pyparsing/util.py create mode 100644 tests/lib/python3.11/site-packages/setuptools/_vendor/tomli/__init__.py create mode 100644 tests/lib/python3.11/site-packages/setuptools/_vendor/tomli/__pycache__/__init__.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/setuptools/_vendor/tomli/__pycache__/_parser.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/setuptools/_vendor/tomli/__pycache__/_re.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/setuptools/_vendor/tomli/__pycache__/_types.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/setuptools/_vendor/tomli/_parser.py create mode 100644 tests/lib/python3.11/site-packages/setuptools/_vendor/tomli/_re.py create mode 100644 tests/lib/python3.11/site-packages/setuptools/_vendor/tomli/_types.py create mode 100644 tests/lib/python3.11/site-packages/setuptools/_vendor/typing_extensions.py create mode 100644 tests/lib/python3.11/site-packages/setuptools/_vendor/zipp.py create mode 100644 tests/lib/python3.11/site-packages/setuptools/archive_util.py create mode 100644 tests/lib/python3.11/site-packages/setuptools/build_meta.py create mode 100644 tests/lib/python3.11/site-packages/setuptools/cli-32.exe create mode 100644 tests/lib/python3.11/site-packages/setuptools/cli-64.exe create mode 100644 tests/lib/python3.11/site-packages/setuptools/cli-arm64.exe create mode 100644 tests/lib/python3.11/site-packages/setuptools/cli.exe create mode 100644 tests/lib/python3.11/site-packages/setuptools/command/__init__.py create mode 100644 tests/lib/python3.11/site-packages/setuptools/command/__pycache__/__init__.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/setuptools/command/__pycache__/alias.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/setuptools/command/__pycache__/bdist_egg.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/setuptools/command/__pycache__/bdist_rpm.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/setuptools/command/__pycache__/build.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/setuptools/command/__pycache__/build_clib.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/setuptools/command/__pycache__/build_ext.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/setuptools/command/__pycache__/build_py.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/setuptools/command/__pycache__/develop.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/setuptools/command/__pycache__/dist_info.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/setuptools/command/__pycache__/easy_install.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/setuptools/command/__pycache__/editable_wheel.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/setuptools/command/__pycache__/egg_info.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/setuptools/command/__pycache__/install.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/setuptools/command/__pycache__/install_egg_info.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/setuptools/command/__pycache__/install_lib.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/setuptools/command/__pycache__/install_scripts.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/setuptools/command/__pycache__/py36compat.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/setuptools/command/__pycache__/register.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/setuptools/command/__pycache__/rotate.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/setuptools/command/__pycache__/saveopts.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/setuptools/command/__pycache__/sdist.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/setuptools/command/__pycache__/setopt.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/setuptools/command/__pycache__/test.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/setuptools/command/__pycache__/upload.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/setuptools/command/__pycache__/upload_docs.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/setuptools/command/alias.py create mode 100644 tests/lib/python3.11/site-packages/setuptools/command/bdist_egg.py create mode 100644 tests/lib/python3.11/site-packages/setuptools/command/bdist_rpm.py create mode 100644 tests/lib/python3.11/site-packages/setuptools/command/build.py create mode 100644 tests/lib/python3.11/site-packages/setuptools/command/build_clib.py create mode 100644 tests/lib/python3.11/site-packages/setuptools/command/build_ext.py create mode 100644 tests/lib/python3.11/site-packages/setuptools/command/build_py.py create mode 100644 tests/lib/python3.11/site-packages/setuptools/command/develop.py create mode 100644 tests/lib/python3.11/site-packages/setuptools/command/dist_info.py create mode 100644 tests/lib/python3.11/site-packages/setuptools/command/easy_install.py create mode 100644 tests/lib/python3.11/site-packages/setuptools/command/editable_wheel.py create mode 100644 tests/lib/python3.11/site-packages/setuptools/command/egg_info.py create mode 100644 tests/lib/python3.11/site-packages/setuptools/command/install.py create mode 100644 tests/lib/python3.11/site-packages/setuptools/command/install_egg_info.py create mode 100644 tests/lib/python3.11/site-packages/setuptools/command/install_lib.py create mode 100644 tests/lib/python3.11/site-packages/setuptools/command/install_scripts.py create mode 100644 tests/lib/python3.11/site-packages/setuptools/command/launcher manifest.xml create mode 100644 tests/lib/python3.11/site-packages/setuptools/command/py36compat.py create mode 100644 tests/lib/python3.11/site-packages/setuptools/command/register.py create mode 100644 tests/lib/python3.11/site-packages/setuptools/command/rotate.py create mode 100644 tests/lib/python3.11/site-packages/setuptools/command/saveopts.py create mode 100644 tests/lib/python3.11/site-packages/setuptools/command/sdist.py create mode 100644 tests/lib/python3.11/site-packages/setuptools/command/setopt.py create mode 100644 tests/lib/python3.11/site-packages/setuptools/command/test.py create mode 100644 tests/lib/python3.11/site-packages/setuptools/command/upload.py create mode 100644 tests/lib/python3.11/site-packages/setuptools/command/upload_docs.py create mode 100644 tests/lib/python3.11/site-packages/setuptools/config/__init__.py create mode 100644 tests/lib/python3.11/site-packages/setuptools/config/__pycache__/__init__.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/setuptools/config/__pycache__/_apply_pyprojecttoml.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/setuptools/config/__pycache__/expand.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/setuptools/config/__pycache__/pyprojecttoml.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/setuptools/config/__pycache__/setupcfg.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/setuptools/config/_apply_pyprojecttoml.py create mode 100644 tests/lib/python3.11/site-packages/setuptools/config/_validate_pyproject/__init__.py create mode 100644 tests/lib/python3.11/site-packages/setuptools/config/_validate_pyproject/__pycache__/__init__.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/setuptools/config/_validate_pyproject/__pycache__/error_reporting.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/setuptools/config/_validate_pyproject/__pycache__/extra_validations.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/setuptools/config/_validate_pyproject/__pycache__/fastjsonschema_exceptions.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/setuptools/config/_validate_pyproject/__pycache__/fastjsonschema_validations.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/setuptools/config/_validate_pyproject/__pycache__/formats.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/setuptools/config/_validate_pyproject/error_reporting.py create mode 100644 tests/lib/python3.11/site-packages/setuptools/config/_validate_pyproject/extra_validations.py create mode 100644 tests/lib/python3.11/site-packages/setuptools/config/_validate_pyproject/fastjsonschema_exceptions.py create mode 100644 tests/lib/python3.11/site-packages/setuptools/config/_validate_pyproject/fastjsonschema_validations.py create mode 100644 tests/lib/python3.11/site-packages/setuptools/config/_validate_pyproject/formats.py create mode 100644 tests/lib/python3.11/site-packages/setuptools/config/expand.py create mode 100644 tests/lib/python3.11/site-packages/setuptools/config/pyprojecttoml.py create mode 100644 tests/lib/python3.11/site-packages/setuptools/config/setupcfg.py create mode 100644 tests/lib/python3.11/site-packages/setuptools/dep_util.py create mode 100644 tests/lib/python3.11/site-packages/setuptools/depends.py create mode 100644 tests/lib/python3.11/site-packages/setuptools/discovery.py create mode 100644 tests/lib/python3.11/site-packages/setuptools/dist.py create mode 100644 tests/lib/python3.11/site-packages/setuptools/errors.py create mode 100644 tests/lib/python3.11/site-packages/setuptools/extension.py create mode 100644 tests/lib/python3.11/site-packages/setuptools/extern/__init__.py create mode 100644 tests/lib/python3.11/site-packages/setuptools/extern/__pycache__/__init__.cpython-311.pyc create mode 100644 tests/lib/python3.11/site-packages/setuptools/glob.py create mode 100644 tests/lib/python3.11/site-packages/setuptools/gui-32.exe create mode 100644 tests/lib/python3.11/site-packages/setuptools/gui-64.exe create mode 100644 tests/lib/python3.11/site-packages/setuptools/gui-arm64.exe create mode 100644 tests/lib/python3.11/site-packages/setuptools/gui.exe create mode 100644 tests/lib/python3.11/site-packages/setuptools/installer.py create mode 100644 tests/lib/python3.11/site-packages/setuptools/launch.py create mode 100644 tests/lib/python3.11/site-packages/setuptools/logging.py create mode 100644 tests/lib/python3.11/site-packages/setuptools/monkey.py create mode 100644 tests/lib/python3.11/site-packages/setuptools/msvc.py create mode 100644 tests/lib/python3.11/site-packages/setuptools/namespaces.py create mode 100644 tests/lib/python3.11/site-packages/setuptools/package_index.py create mode 100644 tests/lib/python3.11/site-packages/setuptools/py34compat.py create mode 100644 tests/lib/python3.11/site-packages/setuptools/sandbox.py create mode 100644 tests/lib/python3.11/site-packages/setuptools/script (dev).tmpl create mode 100644 tests/lib/python3.11/site-packages/setuptools/script.tmpl create mode 100644 tests/lib/python3.11/site-packages/setuptools/unicode_utils.py create mode 100644 tests/lib/python3.11/site-packages/setuptools/version.py create mode 100644 tests/lib/python3.11/site-packages/setuptools/wheel.py create mode 100644 tests/lib/python3.11/site-packages/setuptools/windows_support.py create mode 120000 tests/lib64 create mode 100644 tests/test_async_indexed_queue.py create mode 100644 tests/test_async_priority_queue.py create mode 100644 tests/test_async_sorted_priority_queue.py create mode 100644 tests/test_balance.py create mode 100644 tests/test_client.py create mode 100644 tests/test_death_timeout.py create mode 100644 tests/test_future.py create mode 100644 tests/test_graph.py create mode 100644 tests/test_indexed_queue.py create mode 100644 tests/test_nested_task.py create mode 100644 tests/test_object_usage.py create mode 100644 tests/test_profiling.py create mode 100644 tests/test_protected.py create mode 100644 tests/test_serializer.py create mode 100644 tests/test_ui.py create mode 100644 tests/test_worker_object_tracker.py create mode 100644 tests/utility.py create mode 100644 x diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md new file mode 100644 index 0000000..d91b799 --- /dev/null +++ b/CONTRIBUTING.md @@ -0,0 +1,62 @@ +We welcome contributions to Scaler. + + +## Helpful Resources + + +* [README.md](./README.md) + +* Documentation: [./docs](./docs) + +* [Repository](https://github.com/citi/scaler) + +* [Issue tracking](https://github.com/citi/scaler/issues) + + +## Contributing Guide + +Each contribution must meet the following: + +* Pass all tests, lint and formatting checks +* Include additional tests to verify the correctness of new features or bug fixes + + +### Submit a contribution + +#### Running tests + +```bash +python -m unittest discover +``` + +#### Lint checks + +**We enforce the [PEP 8](https://peps.python.org/pep-0008/) coding style, with a relaxed constraint on the maximum line +length (120 columns)**. + +`isort`, `black` and `flake8` can be installed via PIP. + +```bash +isort --profile black --line-length 120 . +black -l 120 -C . +flake8 --max-line-length 120 --extend-ignore=E203 . +``` + +The `isort`, `black` and `flake8` packages can be installed through Python's PIP. + + +#### Bump version number + +You must update the version defined in [about.py](scaler/about.py) for every contribution. Please follow +[semantic versioning](https://semver.org) in the format `MAJOR.MINOR.PATCH`. + + +#### Create Pull Request + +On the Github repository page, open a [new pull request](https://github.com/citi/scaler/pulls). + + +## Code of Conduct + +We are committed to making open source an enjoyable and respectful experience for our community. See +[`CODE_OF_CONDUCT`](https://github.com/citi/.github/blob/main/CODE_OF_CONDUCT.md) for more information. diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..f78bb41 --- /dev/null +++ b/LICENSE @@ -0,0 +1,201 @@ + Apache License + Version 2.0, January 2004 + http://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 2023 Citigroup, Inc. + + 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 + + http://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/Makefile b/Makefile new file mode 100644 index 0000000..937e42b --- /dev/null +++ b/Makefile @@ -0,0 +1,18 @@ +.PHONY: doc + +# declare your targets here & implement them with '_' prefix +doc: +# target name is formatted: +# bold - \033[1m, purple - \033[095m, normal text - \033[0m + @echo -e "Executing \033[1m\033[095m$@\033[0m target:" + @$(MAKE) --no-print-directory _$@ + @echo + +_doc: + rm -fr docsvenv build; mkdir build + python3.8 -m venv docsvenv + . docsvenv/bin/activate; \ + pip install -r docs/requirements_docs.txt; \ + pip install -r requirements.txt; \ + cd docs; make clean && make html + zip -r build/scaler_docs.zip docs/build/html/* diff --git a/README.md b/README.md new file mode 100644 index 0000000..4dc1b8f --- /dev/null +++ b/README.md @@ -0,0 +1,314 @@ +
+ + Citi + + +

Citi/scaler

+ +

+ Efficient, lightweight and reliable distributed computation engine. +

+ +

+ + + + + PyPI - Version + + +

+
+ +
+ +**Scaler provides a simple, efficient and reliable way to perform distributed computing** using a centralized scheduler, +with a stable and language agnostic protocol for client and worker communications. + +```python +import math +from scaler import Client + +with Client(address="tcp://127.0.0.1:2345") as client: + # Submits 100 tasks + futures = [ + client.submit(math.sqrt, i) + for i in range(0, 100) + ] + + # Collects the results and sums them + result = sum(future.result() for future in futures) + + print(result) # 661.46 +``` + +Scaler is a suitable Dask replacement, offering significantly better scheduling performance for jobs with a large number +of lightweight tasks while improving on load balancing, messaging and deadlocks. + +## Features + +- Distributed computing on **multiple cores and multiple servers** +- **Python** reference implementation, with **language agnostic messaging protocol** built on top of + [Cap'n Proto](https://capnproto.org/) and [ZeroMQ](https://zeromq.org) +- **Graph** scheduling, which supports [Dask](https://www.dask.org)-like graph computing, optionally you + can use [GraphBLAS](https://graphblas.org) for very large graph tasks +- **Automated load balancing**. automatically balances load from busy workers to idle workers and tries to keep workers + utilized as uniformly as possible +- **Automated task recovery** from faulting workers who have died +- Supports for **nested tasks**, tasks can themselves submit new tasks +- `top`-like **monitoring tools** +- GUI monitoring tool + +Scaler's scheduler can be run on PyPy, which can provide a performance boost + +## Installation + +```bash +$ pip install scaler + +# or with graphblas and uvloop support +$ pip install scaler[graphblas,uvloop] +``` + +## Quick Start + +Scaler operates around 3 components: + +- A **scheduler**, responsible for routing tasks to available computing resources +- A set of **workers**, or cluster. Workers are independent computing units, each capable of executing a single task +- **Clients** running inside applications, responsible for submitting tasks to the scheduler. + +### Start local scheduler and cluster at the same time in code + +A local scheduler and a local set of workers can be conveniently spawn using `SchedulerClusterCombo`: + +```python +from scaler import SchedulerClusterCombo + +cluster = SchedulerClusterCombo(address="tcp://127.0.0.1:2345", n_workers=4) + +... + +cluster.shutdown() +``` + +This will start a scheduler with 4 task executing workers on port `2345`. + +### Setting up a computing cluster from the CLI + +The scheduler and workers can also be started from the command line with `scaler_scheduler` and `scaler_cluster`. + +First start the Scaler scheduler: + +```bash +$ scaler_scheduler tcp://127.0.0.1:2345 +[INFO]2023-03-19 12:16:10-0400: logging to ('/dev/stdout',) +[INFO]2023-03-19 12:16:10-0400: use event loop: 2 +[INFO]2023-03-19 12:16:10-0400: Scheduler: monitor address is ipc:///tmp/127.0.0.1_2345_monitor +... +``` + +Then start a set of workers (a.k.a. a Scaler *cluster*) that connect to the previously started scheduler: + +```bash +$ scaler_cluster -n 4 tcp://127.0.0.1:2345 +[INFO]2023-03-19 12:19:19-0400: logging to ('/dev/stdout',) +[INFO]2023-03-19 12:19:19-0400: ClusterProcess: starting 4 workers, heartbeat_interval_seconds=2, object_retention_seconds=3600 +[INFO]2023-03-19 12:19:19-0400: Worker[0] started +[INFO]2023-03-19 12:19:19-0400: Worker[1] started +[INFO]2023-03-19 12:19:19-0400: Worker[2] started +[INFO]2023-03-19 12:19:19-0400: Worker[3] started +... +``` + +Multiple Scaler clusters can be connected to the same scheduler, providing distributed computation over multiple +servers. + +`-h` lists the available options for the scheduler and the cluster executables: + +```bash +$ scaler_scheduler -h +$ scaler_cluster -h +``` + +### Submitting Python tasks using the Scaler client + +Knowing the scheduler address, you can connect and submit tasks from a client in your Python code: + +```python +from scaler import Client + + +def square(value: int): + return value * value + + +with Client(address="tcp://127.0.0.1:2345") as client: + future = client.submit(square, 4) + print(future.result()) # 16 +``` + +`Client.submit()` returns a standard Python future. + +## Graph computations + +Scaler also supports graph tasks, for example: + +```python +from scaler import Client + + +def inc(i): + return i + 1 + + +def add(a, b): + return a + b + + +def minus(a, b): + return a - b + + +graph = { + "a": 2, + "b": 2, + "c": (inc, "a"), # c = a + 1 = 2 + 1 = 3 + "d": (add, "a", "b"), # d = a + b = 2 + 2 = 4 + "e": (minus, "d", "c") # e = d - c = 4 - 3 = 1 +} + +with Client(address="tcp://127.0.0.1:2345") as client: + result = client.get(graph, keys=["e"]) + print(result) # {"e": 1} +``` + +## Nested computations + +Scaler allows tasks to submit new tasks while being executed. Scaler also supports recursive task calls. + +```python +from scaler import Client + + +def fibonacci(clnt: Client, n: int): + if n == 0: + return 0 + elif n == 1: + return 1 + else: + a = clnt.submit(fibonacci, clnt, n - 1) + b = clnt.submit(fibonacci, clnt, n - 2) + return a.result() + b.result() + + +with Client(address="tcp://127.0.0.1:2345") as client: + result = client.submit(fibonacci, client, 8).result() + print(result) # 21 +``` + +## Performance + +### uvloop + +For better async performance, you can install uvloop (`pip install uvloop`) and supply `uvloop` for the CLI argument +`--event-loop` or as a keyword argument for `event_loop` in Python code when initializing the scheduler. + +```bash +scaler_scheduler --event-loop uvloop tcp://127.0.0.1:2345 +``` + +```python +from scaler import SchedulerClusterCombo + +scheduler = SchedulerClusterCombo(address="tcp://127.0.0.1:2345", event_loop="uvloop", n_workers=4) +``` + +## Monitoring + +### From the CLI + +Use `scaler_top` to connect to the scheduler's monitor address (printed by the scheduler on startup) to see +diagnostics/metrics information about the scheduler and its workers. + +```bash +$ scaler_top ipc:///tmp/127.0.0.1_2345_monitor +``` + +It will look similar to `top`, but provides information about the current Scaler setup: + +```bash +scheduler | task_manager | scheduler_sent | scheduler_received + cpu 0.0% | unassigned 0 | ObjectResponse 24 | Heartbeat 183,109 + rss 37.1 MiB | running 0 | TaskEcho 200,000 | ObjectRequest 24 + | success 200,000 | Task 200,000 | Task 200,000 + | failed 0 | TaskResult 200,000 | TaskResult 200,000 + | canceled 0 | BalanceRequest 4 | BalanceResponse 4 +-------------------------------------------------------------------------------------------------- +Shortcuts: worker[n] cpu[c] rss[m] free[f] working[w] queued[q] + +Total 10 worker(s) + worker agt_cpu agt_rss [cpu] rss free sent queued | object_id_to_tasks +W|Linux|15940|3c9409c0+ 0.0% 32.7m 0.0% 28.4m 1000 0 0 | +W|Linux|15946|d6450641+ 0.0% 30.7m 0.0% 28.2m 1000 0 0 | +W|Linux|15942|3ed56e89+ 0.0% 34.8m 0.0% 30.4m 1000 0 0 | +W|Linux|15944|6e7d5b99+ 0.0% 30.8m 0.0% 28.2m 1000 0 0 | +W|Linux|15945|33106447+ 0.0% 31.1m 0.0% 28.1m 1000 0 0 | +W|Linux|15937|b031ce9a+ 0.0% 31.0m 0.0% 30.3m 1000 0 0 | +W|Linux|15941|c4dcc2f3+ 0.0% 30.5m 0.0% 28.2m 1000 0 0 | +W|Linux|15939|e1ab4340+ 0.0% 31.0m 0.0% 28.1m 1000 0 0 | +W|Linux|15938|ed582770+ 0.0% 31.1m 0.0% 28.1m 1000 0 0 | +W|Linux|15943|a7fe8b5e+ 0.0% 30.7m 0.0% 28.3m 1000 0 0 | +``` + +- scheduler section shows scheduler resource usage +- task_manager section shows count for each task status +- scheduler_sent section shows count for each type of messages scheduler sent +- scheduler_received section shows count for each type of messages scheduler received +- function_id_to_tasks section shows task count for each function used +- worker section shows worker details, you can use shortcuts to sort by columns, the char * on column header show which + column is sorted right now + - agt_cpu/agt_rss means cpu/memory usage of worker agent + - cpu/rss means cpu/memory usage of worker + - free means number of free task slots for this worker + - sent means how many tasks scheduler sent to the worker + - queued means how many tasks worker received and queued + +### From the web UI + +`scaler_ui` provides a web monitoring interface for Scaler. + +```bash +$ scaler_ui ipc:///tmp/127.0.0.1_2345_monitor --port 8081 +``` + +This will open a web server on port `8081`. + +## Contributing + +Your contributions are at the core of making this a true open source project. Any contributions you make are **greatly +appreciated**. + +We welcome you to: + +- Fix typos or touch up documentation +- Share your opinions on [existing issues](https://github.com/citi/scaler/issues) +- Help expand and improve our library by [opening a new issue](https://github.com/citi/scaler/issues/new) + +Please review our [community contribution guidelines](https://github.com/Citi/.github/blob/main/CONTRIBUTING.md) and +[functional contribution guidelines](./CONTRIBUTING.md) to get started 👍. + +## Code of Conduct + +We are committed to making open source an enjoyable and respectful experience for our community. See +[`CODE_OF_CONDUCT`](https://github.com/Citi/.github/blob/main/CODE_OF_CONDUCT.md) for more information. + +## License + +This project is distributed under the [Apache-2.0 License](https://www.apache.org/licenses/LICENSE-2.0). See +[`LICENSE`](./LICENSE) for more information. + +## Contact + +If you have a query or require support with this project, [raise an issue](https://github.com/Citi/scaler/issues). +Otherwise, reach out to [opensource@citi.com](mailto:opensource@citi.com). diff --git a/__pycache__/check.cpython-311.pyc b/__pycache__/check.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..af4249eeebec0877e086ac9cda5d678a9a63a1ff GIT binary patch literal 2637 zcmb_d%WE4)7@yhaXm|DSn_7;vi5(+jTE|HX!3_mFp-sR^XkGFUZG`ZS9#oc(*R^SyrG zeDm$-7r$QuWc=RzIlayS@F!jD457t5|BD6SHedh-8n_DqctC#J;{yQZE{%Y%$~VMj@9i5+O8PCaW3r`cu^xCnhqB z3wR=(!=Gh@u33-7|EiBSL|41JuOL~xoNb=ca zA%qU^D}P=YxA=aW@81Lv_S6qMlDsxr9bJvpV&&7+s>f4!nJ>$F!cRWGexsa+|5OyRt3ZxagFPvJUbp4&dsf_uqI5@E>X&H4HXGxI~RF=B;A zHvy6DC*2?rGP^5h%RWa5m`vql89B1QqE}*NaYG5NovWTRwbhHYi<^Lhhdok0<4D2E zQIlI8uZ@>aJEBzn*6He96)H?+#z9@?k(&Q08hV0;>YrIiwUOFH>ehzRvv$6EzCL0p zQCo@9NUBHP5RPP5Q=X#m6BMq`SSV_vXcI+AxbC&t>TJE&QX;kzp^?0p(Kmz(noLc8 ziUyyc!TNCvMQjvlqR7?;;LChdh??gJA&&)A8>mg7I@^jNGu9M_$YX&+HaOG-hgyn3 zbD${k?{{=8;Ds%t< literal 0 HcmV?d00001 diff --git a/benchmarks/dask_local_test.py b/benchmarks/dask_local_test.py new file mode 100644 index 0000000..90c390b --- /dev/null +++ b/benchmarks/dask_local_test.py @@ -0,0 +1,30 @@ +import random + +from dask.distributed import Client, LocalCluster + +from scaler.utility.logging.scoped_logger import ScopedLogger +from scaler.utility.logging.utility import setup_logger + + +def sleep_print(sec: int): + return sec * 1 + + +def main(): + setup_logger() + tasks = [random.randint(0, 100) for _ in range(10000)] + + cluster = LocalCluster(n_workers=10, threads_per_worker=2, memory_limit="100GB") + client = Client(address=cluster.scheduler_address) + + with ScopedLogger(f"submit {len(tasks)} tasks"): + futures = [client.submit(sleep_print, i) for i in tasks] + + with ScopedLogger(f"gather {len(futures)} results"): + results = [future.result() for future in futures] + + assert results == tasks + + +if __name__ == "__main__": + main() diff --git a/benchmarks/dask_remote_test.py b/benchmarks/dask_remote_test.py new file mode 100644 index 0000000..7ad8137 --- /dev/null +++ b/benchmarks/dask_remote_test.py @@ -0,0 +1,30 @@ +import random + +from dask.distributed import Client as DaskClient + +from scaler.utility.logging.scoped_logger import ScopedLogger +from scaler.utility.logging.utility import setup_logger + + +def sleep_print(sec: int): + return sec * 1 + + +def main(): + setup_logger() + + tasks = [random.randint(0, 100) for _ in range(10000)] + + client = DaskClient("127.0.0.1:12345") + + with ScopedLogger(f"submit {len(tasks)} tasks"): + futures = [client.submit(sleep_print, i) for i in tasks] + + with ScopedLogger(f"gather {len(futures)} results"): + results = [future.result() for future in futures] + + assert results == tasks + + +if __name__ == "__main__": + main() diff --git a/benchmarks/scaler_test.py b/benchmarks/scaler_test.py new file mode 100644 index 0000000..d3a7d17 --- /dev/null +++ b/benchmarks/scaler_test.py @@ -0,0 +1,36 @@ +import random + +from scaler.client.client import Client +from scaler.cluster.combo import SchedulerClusterCombo +from scaler.utility.logging.scoped_logger import ScopedLogger +from scaler.utility.logging.utility import setup_logger + + +def sleep_print(sec: int): + return sec * 1 + + +def main(): + setup_logger() + + address = "tcp://127.0.0.1:2345" + + cluster = SchedulerClusterCombo(address=address, n_workers=10, per_worker_queue_size=2, event_loop="builtin") + client = Client(address=address) + + tasks = [random.randint(0, 101) for _ in range(10000)] + + with ScopedLogger(f"Scaler submit {len(tasks)} tasks"): + futures = [client.submit(sleep_print, a) for a in tasks] + + with ScopedLogger(f"Scaler gather {len(futures)} results"): + results = [future.result() for future in futures] + + assert results == tasks + + client.disconnect() + cluster.shutdown() + + +if __name__ == "__main__": + main() diff --git a/check.py b/check.py new file mode 100644 index 0000000..31fb9a7 --- /dev/null +++ b/check.py @@ -0,0 +1,52 @@ +with open("scheduler") as f: + sch = f.read() + +with open("cluster") as f: + cluster = f.read() + +with open("shutff") as f: + shutff = f.read() + +# read_message(): read message ; HASH: -599833624 +# write_message(): writing message ; HASH: -1390068153 +def parse(s) -> tuple[str, str] | None: + if s.startswith("read_message"): + id = s.split("HASH: ")[1] + return (id, 0) + if s.startswith("write_message"): + id = s.split("HASH: ")[1] + return (id, 1) + return None + +scheduler = [[], []] +cluster_ = [[], []] +shutff_ = [[], []] + +for line in sch.split("\n"): + res = parse(line) + if res is not None: + id, op = res + scheduler[op].append(id) + +for line in cluster.split("\n"): + res = parse(line) + if res is not None: + id, op = res + cluster_[op].append(id) + +for line in shutff.split("\n"): + res = parse(line) + if res is not None: + id, op = res + shutff_[op].append(id) + +print(f"Scheduler: {scheduler}") +print(f"Cluster: {cluster_}") +print(f"Shutff: {shutff_}") + +all_read = scheduler[0] + cluster_[0] + shutff_[0] +all_write = scheduler[1] + cluster_[1] + shutff_[1] + +# diff = all_read.difference(all_write) + +# print(f"Diff: {diff}") diff --git a/docs/.gitignore b/docs/.gitignore new file mode 100644 index 0000000..567609b --- /dev/null +++ b/docs/.gitignore @@ -0,0 +1 @@ +build/ diff --git a/docs/Makefile b/docs/Makefile new file mode 100644 index 0000000..d0c3cbf --- /dev/null +++ b/docs/Makefile @@ -0,0 +1,20 @@ +# Minimal makefile for Sphinx documentation +# + +# You can set these variables from the command line, and also +# from the environment for the first two. +SPHINXOPTS ?= +SPHINXBUILD ?= sphinx-build +SOURCEDIR = source +BUILDDIR = build + +# Put it first so that "make" without argument is like "make help". +help: + @$(SPHINXBUILD) -M help "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O) + +.PHONY: help Makefile + +# Catch-all target: route all unknown targets to Sphinx using the new +# "make mode" option. $(O) is meant as a shortcut for $(SPHINXOPTS). +%: Makefile + @$(SPHINXBUILD) -M $@ "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O) diff --git a/docs/make.bat b/docs/make.bat new file mode 100644 index 0000000..dc1312a --- /dev/null +++ b/docs/make.bat @@ -0,0 +1,35 @@ +@ECHO OFF + +pushd %~dp0 + +REM Command file for Sphinx documentation + +if "%SPHINXBUILD%" == "" ( + set SPHINXBUILD=sphinx-build +) +set SOURCEDIR=source +set BUILDDIR=build + +%SPHINXBUILD% >NUL 2>NUL +if errorlevel 9009 ( + echo. + echo.The 'sphinx-build' command was not found. Make sure you have Sphinx + echo.installed, then set the SPHINXBUILD environment variable to point + echo.to the full path of the 'sphinx-build' executable. Alternatively you + echo.may add the Sphinx directory to PATH. + echo. + echo.If you don't have Sphinx installed, grab it from + echo.https://www.sphinx-doc.org/ + exit /b 1 +) + +if "%1" == "" goto help + +%SPHINXBUILD% -M %1 %SOURCEDIR% %BUILDDIR% %SPHINXOPTS% %O% +goto end + +:help +%SPHINXBUILD% -M help %SOURCEDIR% %BUILDDIR% %SPHINXOPTS% %O% + +:end +popd diff --git a/docs/requirements_docs.txt b/docs/requirements_docs.txt new file mode 100644 index 0000000..85e44e0 --- /dev/null +++ b/docs/requirements_docs.txt @@ -0,0 +1,3 @@ +sphinx +sphinx_rtd_theme +sphinx-substitution-extensions diff --git a/docs/source/_static/style.css b/docs/source/_static/style.css new file mode 100644 index 0000000..e97cb2a --- /dev/null +++ b/docs/source/_static/style.css @@ -0,0 +1,19 @@ +.wy-nav-content { + max-width: none; +} +/* Newlines (\a) and spaces (\20) before each parameter */ +/*.sig-param::before {*/ +/* content: "\a\20\20\20\20\20\20\20\20\20\20\20\20\20\20\20\20";*/ +/* white-space: pre;*/ +/*}*/ + +/* Newline after the last parameter (so the closing bracket is on a new line) */ +/*dt em.sig-param:last-of-type::after {*/ +/* content: "\a";*/ +/* white-space: pre;*/ +/*}*/ + + /*To have blue background of width of the block (instead of width of content) */ +dl.class > dt:first-of-type { + display: block !important; +} diff --git a/docs/source/_templates/layout.html b/docs/source/_templates/layout.html new file mode 100644 index 0000000..50f4d90 --- /dev/null +++ b/docs/source/_templates/layout.html @@ -0,0 +1,4 @@ +{% extends "!layout.html" %} +{% block extrahead %} + +{% endblock %} diff --git a/docs/source/conf.py b/docs/source/conf.py new file mode 100644 index 0000000..f2fca81 --- /dev/null +++ b/docs/source/conf.py @@ -0,0 +1,74 @@ +# Configuration file for the Sphinx documentation builder. +# +# This file only contains a selection of the most common options. For a full +# list see the documentation: +# https://www.sphinx-doc.org/en/master/usage/configuration.html + +# -- Path setup -------------------------------------------------------------- + +# If extensions (or modules to document with autodoc) are in another directory, +# add these directories to sys.path here. If the directory is relative to the +# documentation root, use os.path.abspath to make it absolute, like shown here. + +import os +import sys + +sys.path.insert(0, os.path.abspath(os.path.join("..", ".."))) + + +# -- Project information ----------------------------------------------------- + +project = "Scaler" +author = "Citi" + + +version = __import__("scaler").__version__ +release = f"{__import__('scaler').__version__}-py3-none-any" + +rst_prolog = f""" +.. |version| replace:: {version} +.. |release| replace:: {release} +""" + +# -- General configuration --------------------------------------------------- + +# Add any Sphinx extension module names here, as strings. They can be +# extensions coming with Sphinx (named 'sphinx.ext.*') or your custom +# ones. +extensions = [ + "sphinx.ext.autodoc", + "sphinx.ext.doctest", + "sphinx_substitution_extensions", + "sphinx.ext.napoleon", + "sphinx.ext.autosectionlabel", +] + +# Add any paths that contain templates here, relative to this directory. +templates_path = ["_templates"] + +# List of patterns, relative to source directory, that match files and +# directories to ignore when looking for source files. +# This pattern also affects html_static_path and html_extra_path. +exclude_patterns = [] + + +# -- Options for HTML output ------------------------------------------------- + +# The theme to use for HTML and HTML Help pages. See the documentation for +# a list of builtin themes. +# +# html_theme = "alabaster" + +html_theme = "sphinx_rtd_theme" + +# Add any paths that contain custom static files (such as style sheets) here, +# relative to this directory. They are copied after the builtin static files, +# so a file named "default.css" will overwrite the builtin "default.css". +html_static_path = ["_static"] +html_css_files = ["style.css"] + +# html_static_path = [] +# html_css_files = [] + + +# -- Extension configuration ------------------------------------------------- diff --git a/docs/source/index.rst b/docs/source/index.rst new file mode 100644 index 0000000..30f03bf --- /dev/null +++ b/docs/source/index.rst @@ -0,0 +1,31 @@ +.. scaler documentation master file, created by + sphinx-quickstart on Wed Feb 15 16:00:47 2023. + You can adapt this file completely to your liking, but it should at least + contain the root `toctree` directive. + +Welcome to scaler's documentation! +================================================ + +Scaler is a lightweight distributed computing Python framework. It allocates work over multiple workers (distributedly or locally through multiprocessing). The motivation behind Scaler was the difficulty of debugging Dask jobs that were hanging. It is meant to be a drop-in replacement for Dask Futures with improvements and additional features. + +Scaler's design focuses on simplicity, resulting in reduced overhead and debuggable errors. Based on our benchmarking results for ICAAP Wholesale Loss forecasting, it took Scaler Graph only a third of the time to finish compared to Dask. + +Lastly, Scaler's load-balancers work in a more predictable manner, increasing utilization of workers. The best part is that Scaler can be adopted in place of Dask with minimal code change! + +Key features include: + + * Graph Task Submission - submit task with dependencies together + * Monitoring Dashboard - utilization of workers and task completion can be seen + * Task Profiling - seeing execution time of functions + * Logging of Distributed Work - send logs back to the Client from workers (under development) + + +Content +======= + +.. toctree:: + :maxdepth: 2 + + tutorials/quickstart + tutorials/features + tutorials/configuration diff --git a/docs/source/tutorials/configuration.rst b/docs/source/tutorials/configuration.rst new file mode 100644 index 0000000..6110f54 --- /dev/null +++ b/docs/source/tutorials/configuration.rst @@ -0,0 +1,91 @@ +Configuration +============= + +Scaler has some settings that can be tuned for performance, but ideally users should not have to concern themselves with these because the defaults will give decent performance. A full list of the settings can be found using `-h` flag in the CLI (as detailed below). List in this page are the expected settings that users may want to configure. + +Scheduler Settings +------------------ + +For the full list, use the CLI command: + +.. code:: bash + + scaler_scheduler -h + +**Protected Mode** + +.. _protected: + +The Scheduler is started in protected mode by default, which means that it can not be shut down by the Client. This is because multiple Clients can connect to a long-running Scheduler, and calling `Client.shutdown()` may inadverdently kill work that another user is executing. This is also because Scaler encourages strong decoupling between Client, Scheduler and Workers. To turn off protected mode, start the scheduler with: + +.. code:: bash + + scaler_scheduler tcp://127.0.0.1:8516 -p False + +Or if using the programmatic API, pass ``protected=True```: + +.. code:: python + + from scaler import SchedulerClusterCombo + + cluster = SchedulerClusterCombo( + address=f"tcp://127.0.0.1:{port}", + n_workers=2, + protected=protected, + ) + +**Event Loop** + +Scaler supports ``uvloop`` as the event loop for the backend. This will provide speedups when running Scaler. ``Uvloop`` needs to be installed separately: + +.. code:: bash + + pip install uvloop + +``uvloop`` can be set when starting the scheduler through the CLI: + +.. code:: bash + + scaler_scheduler tcp://127.0.0.1:8516 -e uvloop + +.. code:: python + + from scaler import SchedulerClusterCombo + + cluster = SchedulerClusterCombo( + address=f"tcp://127.0.0.1:{port}", + n_workers=2, + event_loop="uvloop" + ) + +Worker Settings +--------------- + +For the full list, use the CLI command: + +.. code:: bash + + scaler_cluster -h + +**Death Timeout** + +Workers are spun up with a ``death_timeout_seconds``, which indicates how long the worker will stay alive without being connected to a Scheduler. The default setting is 300 seconds. This is intended for the workers to clean up if the Scheduler crashes. + +This can be set using the CLI: + +.. code:: bash + + scaler_cluster -n 10 tcp://127.0.0.1:8516 -ds 300 + +Through the programmatic API: + +.. code:: python + + from scaler import SchedulerClusterCombo + + cluster = SchedulerClusterCombo( + address=f"tcp://127.0.0.1:8516", + n_workers=2, + death_timeout_seconds=300 + ) + diff --git a/docs/source/tutorials/features.rst b/docs/source/tutorials/features.rst new file mode 100644 index 0000000..76ba296 --- /dev/null +++ b/docs/source/tutorials/features.rst @@ -0,0 +1,257 @@ +Additional Features +=================== + +These features are not needed for standard usage, but are helpful for monitoring and other use cases. + +Scaler Top (Monitoring) +----------------------- + +The scheduler has an address that can be monitored with an ipc connection. The exact address will be in the logs +when the scheduler is spun up. Connect to it with the `scaler_top` CLI command. + +.. code:: bash + + scaler_top ipc:///tmp/0.0.0.0_8516_monitor + +Which will show something similar to top command, but it's for getting status of the scaled system: + +.. code:: console + + scheduler | task_manager | scheduler_sent | scheduler_received + cpu 0.0% | unassigned 0 | HeartbeatEcho 283,701 | Heartbeat 283,701 + rss 130.1m | running 0 | ObjectResponse 233 | ObjectRequest 215 + | success 53,704 | TaskEcho 53,780 | Task 53,764 + | failed 14 | Task 54,660 | TaskResult 53,794 + | canceled 48 | TaskResult 53,766 | DisconnectRequest 21 + | not_found 14 | ObjectRequest 366 | TaskCancel 60 + | DisconnectResponse 21 | BalanceResponse 15 + | TaskCancel 62 | GraphTask 6 + | BalanceRequest 15 | + | GraphTaskResult 6 | + ------------------------------------------------------------------------------------------------- + Shortcuts: worker[n] agt_cpu[C] agt_rss[M] cpu[c] rss[m] free[f] sent[w] queued[d] lag[l] + + Total 7 worker(s) + worker agt_cpu agt_rss [cpu] rss free sent queued lag ITL | client_manager + 2732890|sd-1e7d-dfba|d26+ 0.5% 111.8m 0.5% 113.3m 1000 0 0 0.7ms 100 | + 2732885|sd-1e7d-dfba|56b+ 0.0% 111.0m 0.5% 111.2m 1000 0 0 0.7ms 100 | func_to_num_tasks + 2732888|sd-1e7d-dfba|108+ 0.0% 111.7m 0.5% 111.0m 1000 0 0 0.6ms 100 | + 2732891|sd-1e7d-dfba|149+ 0.0% 113.0m 0.0% 112.2m 1000 0 0 0.9ms 100 | + 2732889|sd-1e7d-dfba|211+ 0.5% 111.7m 0.0% 111.2m 1000 0 0 1ms 100 | + 2732887|sd-1e7d-dfba|e48+ 0.5% 112.6m 0.0% 111.0m 1000 0 0 0.9ms 100 | + 2732886|sd-1e7d-dfba|345+ 0.0% 111.5m 0.0% 112.8m 1000 0 0 0.8ms 100 | + + +* scheduler section is showing how much resources the scheduler used +* task_manager section shows count for each task status +* scheduler_sent section shows count for each type of messages scheduler sent +* scheduler_received section shows count for each type of messages scheduler received +* object_id_to_tasks section shows task count for each object used +* worker section shows worker details, you can use shortcuts to sort by columns, the char * on column header show which + column is sorted right now + * agt_cpu/agt_rss means cpu/memory usage of worker agent + * cpu/rss means cpu/memory usage of worker + * free means number of free task slots for this worker + * sent means how many tasks scheduler sent to the worker + * queued means how many tasks worker received and queued + * lag means the latency between scheduler and worker + * ITL means debug bits information, I means processor initialized, T means have a task or not, L means task lock + + +Task Profiling +-------------- + +To get the execution time of a task, submit it with profiling turned on. ``.result()`` needs to be called on the Future first so that execution is complete. + +.. code:: python + + from scaler import Client + + def calculate(sec: int): + return sec * 1 + + client = Client(address="tcp://127.0.0.1:2345") + fut = client.submit(calculate, 1, profiling=True) + fut.result() + + # contains task run duration time in microseconds + fut.profiling_info().duration_us + + # contains the peak memory usage in bytes for that function, this memory peak is sampled every second + fut.profiling_info().peak_memory + + +Send Object +----------- + +Scaler can send objects to the workers. This is useful for sending large objects that are needed for the tasks, and +reuse it over and over again + +- The object is sent to the workers only once +- the scaler API will returns an reference that link to the object +- on the workers side, workers can use this reference to access the object, but this reference must be in the + positional argument level, **it cannot be nested to the other reference or inside of list etc.** +- This ``client.send_object``, objects are still get serialized and deserialized by Serializer, if you have special + needs to customize your serializer, please refer below :ref:`Custom Serializer` section + +.. code:: python + + from scaler import Client + + def add(a, b): + return a + b + + client = Client(address="tcp://127.0.0.1:2345") + ref = client.send_object("large_object", [1, 2, 3, 4, 5]) + + fut = client.submit(add, ref, [6]) + assert fut.result() == [1, 2, 3, 4, 5, 6] + + # this will not work, scaler doesn't do deep resolving + # fut = client.submit(add, [ref], [6]) + + +Graph Submission +---------------- + +For tasks that are dependent on the output of other tasks, they can all be submitted together as a graph. Scaler will handle executing the dependencies in the right order. + +.. code:: python + + from scaler import Client + + def inc(i): + return i + 1 + + def add(a, b): + return a + b + + def minus(a, b): + return a - b + + graph = { + "a": 2, + "b": 2, + "c": (inc, "a"), # c = a + 1 = 2 + 1 = 3 + "d": (add, "a", "b"), # d = a + b = 2 + 2 = 4 + "e": (minus, "d", "c") # e = d - c = 4 - 3 = 1 + } + + client = Client(address="tcp://127.0.0.1:2345") + futures = client.submit_graph(graph, keys=["e"]) + + print(futures[0].result()) + + +Client Shutdown +--------------- + +By default, the Scheduler is running in protected mode. For more information, check the :ref:`protected ` section. If the Scheduler is not in protected mode, the Client can shutdown the Cluster by calling ``client.shutdown()``. This needs to be specifically enabled when spinning up the Scheduler. + +.. code:: python + + from scaler import Client + + client = Client(address="tcp://127.0.0.1:2345") + client.shutdown() + +Custom Serializer +----------------- +Scaler uses cloudpickle by default for serialization. You can use a custom serializer by passing it to the Client. + +The serializer API has only two methods: ``serialize`` and ``deserialize``, and these are responsible for + +- function +- function arguments +- function results + + +**All libraries used for serialization must be installed on workers.** + + +.. py:function:: serialize(obj: Any) -> bytes + + :param obj: the object to be serialized, can be function object, argument object, or function result object + :return: serialized bytes of the object + +Serialize the object to bytes, this serialization method is called for function object and EACH argument +object and function result object, for example: + + +.. code:: python + + def add(a, b): + return a + b + + client.submit(add, 1, 2) + + +``serialize`` will initially be called three times: once for ``add``, once for ``1``, and once for ``2``. +The result of the ``a+b`` calculation will then be serialized and sent back to the client. +The client will ``deserialize`` the result. + + +.. py:function:: deserialize(payload: bytes) -> Any + + :param payload: the serialized bytes of the object, can be function object, argument object, or function result object + :return: any deserialized object + +Deserialize the bytes to the original object, this de-serialize method is used to deserialize the function +object bytes and EACH serialized argument and serialized function result. + + +Below is an example implementation of customized serializer that deal with different types, but as you introduce +different types, you may need an enum in front of serialized bytes to indicate how to deserialize on other ends, for +example + +- following example will serialize and deserialize the pd.DataFrame and Integer specially (not use cloudpickle) +- all other objects will be serialized by cloudpickle still + + +.. code:: python + + import enum + import pickle + import struct + from io import BytesIO + from typing import Any + + import pandas as pd + from cloudpickle import cloudpickle + + from scaler import Serializer + + + class ObjType(enum.Enum): + General = b"G" + Integer = b"I" + DataFrame = b"D" + + + class CustomSerializer(Serializer): + @staticmethod + def serialize(obj: Any) -> bytes: + if isinstance(obj, pd.DataFrame): + buf = BytesIO() + obj.to_parquet(buf) + return ObjType.DataFrame.value + buf.getvalue() + + if isinstance(obj, int): + return ObjType.Integer.value + struct.pack("I", obj) + + return ObjType.General.value + cloudpickle.dumps(obj, protocol=pickle.HIGHEST_PROTOCOL) + + @staticmethod + def deserialize(payload: bytes) -> Any: + obj_type = ObjType(payload[0]) + payload = payload[1:] + + if obj_type == ObjType.DataFrame: + buf = BytesIO(payload) + return pd.read_parquet(buf) + + if obj_type == ObjType.Integer: + return struct.unpack("I", payload)[0] + + return cloudpickle.loads(payload) + diff --git a/docs/source/tutorials/images/architecture.png b/docs/source/tutorials/images/architecture.png new file mode 100644 index 0000000000000000000000000000000000000000..bf7c8f160843823b1c7011741a3a7099960c002a GIT binary patch literal 36570 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 N{7*w=XZ%3U>n}_h4ub#y literal 0 HcmV?d00001 diff --git a/scaler/__pycache__/about.cpython-311.pyc b/scaler/__pycache__/about.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..f6f1b668b2ac1aa86a0bd16018af65d80173bcb1 GIT binary patch literal 188 zcmZ3^%ge<81fG0R>Eb~8F^B^Lj8MjBkdo;PDGX5zDU87knoLz}hI$ryhQ@xHjJLSs z2ypPQFN08K0J#7oVP=mtIwx zuV0*;n3GxrqY{(yOH1?$Dt~d<p+&IiZ*jNPJ*sWMsU-C)U6Xf<-Jq FApqCuFcAO% literal 0 HcmV?d00001 diff --git a/scaler/about.py b/scaler/about.py new file mode 100644 index 0000000..880e579 --- /dev/null +++ b/scaler/about.py @@ -0,0 +1 @@ +__version__ = "1.8.13" diff --git a/scaler/client/__init__.py b/scaler/client/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/scaler/client/__pycache__/__init__.cpython-311.pyc b/scaler/client/__pycache__/__init__.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..c5c6bef5a31bed2b18de2fde2f8a8d7b993e380c GIT binary patch literal 177 zcmZ3^%ge<81fG0R=^*+sh=2h`DC095kTIPhg&~+hlhJP_LlF~@{~09t%SAsUKQ~oB zJtwt1vsgbTGcUb7F*Ck0Gd?XfFFrj#FTJWXU%xmxF(lIY~;;_lhPbtkwwJTx;8Va(um>)=dU}j`w{J;PsikN|70MQ03g#Z8m literal 0 HcmV?d00001 diff --git a/scaler/client/__pycache__/client.cpython-311.pyc b/scaler/client/__pycache__/client.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..af5f5a9831645b7d8203ebc5db1d683441eef7ed GIT binary patch literal 32127 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 literal 0 HcmV?d00001 diff --git a/scaler/client/__pycache__/object_buffer.cpython-311.pyc b/scaler/client/__pycache__/object_buffer.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..416e0854e6f369863daab6276ae151e370fa2a32 GIT binary patch literal 7221 zcmcgxTWk|o8lIb-u``KH;v^Uo!X;1{sG)&eSOwG;mU3&-7FvPZFgTt`aOz8XW+Ix% ztdN#n<)NzRsuGn}mAq1yrAwtvB_8N%rIq%HmzBoRRIx^igtXd+z8S&3@Y4PNGoG=> zNdWD`9-sVk&Y6GC>|z;}ndx?>#xZX(O5i4=1n+PRa}WOPbO#>y zoC=fdp?s~tCwcjjn-%sv6L0$odB@^Di+>|OZ;8iK*=%Yut6IXjjHX-S_^h5O)(W0iNhX!eET{x(ZRh9n>EnfbUQO!-Z0Js3oy&hL>jgOrpUZ_Qd2(J?HDn#1 zoB=Li*3~@rw8?Hbo!4|Sm&Q@zoYgU{=2eo?Rk=Xf<&0wWx^0>}cKvnQT`Ls$TII9_efb7iGj-Q3`{mUTF-GgOu z$P|YRai|jNGsHeyyxdei-6#rIv1#C3)?dT|jT;+h%gXq2(t)k5Ef61ExkK@Zwt zAb{JR*h)`gxhHW~TRKthIb!x4S(H2y{-`VtnBssT4pc%hLyXzT4ca|{3Dnj{upK6V z)LR)M&srqARkw0Tt6ftkmOt`9R0%WK#X>M)1_ zm9>9G+_x<5yL+ZA4x8ez;bgjEj|oIiL2(3;C&f{Hl^TchSJ<0i80)Pkn*7eon8QY| zHG`W@lkR#VhM94KXlBN3g;8B^r*Cq;0^WKLo%Plt`#JMDa|hOP&()J=6zg4eey>q) z^uM_3I5*}I6HX5YdxCE0HZu((ndpY4vvt8h*@Xp^U1K=Kf5Cm$13VHz!C72oa>|^%Mi=`SrScTXVyG%Ifws>=E8^B=aqFto zYf8IU!#m9Iuo*s92}izcUk&$~;oX1K?v5L;j2hvik6VPc_NNSx$GkrP-2kZ~`A?YH zvHK7HZ~QbQ0b}mia}TIo-Rs^!_g-wN|1X-=p#5HrYN|a~_Zn?TDF_?1CV4fo(R#L0 z>q!uSb6fmz&i{ zKQLMTT3h(k>99^8G=+HUv0TEwehUQbPPEsI##f?; zmZOK3-YiFl&FJuA`)XuQN&n_oOTQ{dPMVRE0H$bvMe16WI&Z!CRnX`^e)rN}CjLC} zt^A$*;JpW_2k)7$z7DN+E=wm&>BNe3c3C=Gmfkj{w^yZ|rDJ7jz?25SK5YT#24u0l z8f3!TTyN&$1?J^ipZ)(U8u<;;$TwLep~#U)kt?}23&wZT9Vp#%Yx&m{wkVVuaPGcp ziewdtcbl-uf6c$l7}tF|qNbLLLeb~3giWU@FFwKY31bVsQ3!>$XP*81^UvfX=qD~x zT#^YWlR6@=U=?qQ>>E3ZLVxoatKE*OmVekbB5KLzfKk z619x>GcSl4-g7%B-LqeSa9+?Q@hhRug5Xl4u0~cC4A$ZA45Ygmy zB2(N>txba>+;D$Y&hI-?>Vo*tcVy`deLOr$AI&5z z__p6|tupXvCX(RWR{9iMw=JEek7fcKTd{3xDNP?sn;-1D-%E=RAy#qTHk2gRHv(to z!S5Czl<|!;6MxwEN|kX*zvO$h%D7}J?~_@aEI!wvLD8NtJaEGBXeJTCmxM2o+EY%l z^*JY5d(sYv&9|1?dw}APN3B*kW2e&Dl%}Z~`2gB1zdk<;mzMS}(@jTvK=<3;Wpvk8 zpGGgs6ZS26qV5tBxy+}Tyhd?kZLV=;3JDGVu~EMwr3kY&)nCu)nJiogQ)glI*4mu_ z2d>@qtA%_51JOd>J|Jz|fG4MFT54Lg&s|POwcZmoZFdHv#sUK$E8vR3Mmz;4y52fq zpNXUPKOl~gPv8XxiQ4Nxt31oH6{f>*a)oKTL4Ory(0IB0$oUpJdBhAE-dte@3~#P5 zhYfG8FvEs7SC~=5n=8zR#(KHxXSg<#?XGe>3y@n&9%I{6B#(K9>v377cUkzSU6tAR O@z{R%^f@e4!v6)5*lvda literal 0 HcmV?d00001 diff --git a/scaler/client/__pycache__/object_reference.cpython-311.pyc b/scaler/client/__pycache__/object_reference.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..337c07c764035731251961e9dc0213f7a6f9edd1 GIT binary patch literal 1653 zcmZuw&1)M+6rb5IeOU4q%dry*jZ#}})CMcQ6%zMQN{et&i$!}-!NXcJme*bFI?5ik!P_VB#OnyQlkovH z6pHJpto? zM}_D769DKN@1bpw;`Lmi3Y-&vIID0@I)4te{hor{daZk_-n1OXljQeB?v<|oplH*T zZt6i%q+Yqe<+92J+1wBy(jQ}}i#eOV$Wy%ds^&{YbLK!1|h>d<_xtVG(D z7 zI^1n0_XjpHld|jv2oq)F;ELz5gnT4N!JiPVd?my$9K=0heh1w7ZGg$zUH10cg?>)>&jY{^7UuhpetmS%IW3e1g;Hpi!gNViS}W(o zJcuugkSI$?+oK&v$T>oubS!6N(KmJj=0_$Wmg{7|CRka(PJ-#BKRM0ral?US-YRYH#(~>X|tkYT|#Y&7NiRy=t%etUA=N zPB5^4i3Zjeg<=GTrY|3SF+{K(26CH(9M(S&FHAyQqA04YMpM)Ztfpi6K6IT)4sr2| z;B(o~Mf!0}+NbHnR!cTxZV literal 0 HcmV?d00001 diff --git a/scaler/client/agent/__init__.py b/scaler/client/agent/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/scaler/client/agent/__pycache__/__init__.cpython-311.pyc b/scaler/client/agent/__pycache__/__init__.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..1a622c999c14f44adddb06738b7e226ce9f9b288 GIT binary patch literal 183 zcmZ3^%ge<81fG0R=^*+sh=2h`DC095kTIPhg&~+hlhJP_LlF~@{~09t%S%5aKQ~oB zJtwt1vsgbTGcUb7F*Ck0Gd?XfFFrj#FTJWXU%xmxF(01+fD$p8QV literal 0 HcmV?d00001 diff --git a/scaler/client/agent/__pycache__/client_agent.cpython-311.pyc b/scaler/client/agent/__pycache__/client_agent.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..9a859922d0e6a6074e0d63421627c085658a185f GIT binary patch literal 11247 zcmeG?TWlLwc9$=4NDe7!BwBBa*26YsnUWvzD~c64w&U1|owc2KLlhm*oRLI%NGg}3 zI9BDYkqs6`5uo`nkOdYg1hnzSa6aaB%iqW2Q3Ti8Z@*j^8A9lv$%Au+?8>uVA3|Rs2}wQ$ zWv#m}>!Z*9tRL=vB~T1zgFez1P(sDFY#Xfym2i>Ea&BE@JnO6zS(tjK41S`RDn zVj`QMbxvt7c4RwfJ)(3Lg{(m9QKhTco$W3rv&rI)?2ckjwx`&e?Jf3Y`-=V9{^CG( zpg5QvEDmLdiaWDA>71A{TufzCw9YHLiX+((T8}HE#j)&IaXdR-+@0M`+Y-v2;@<4u zVmg~HPGl#1$dBGcQv0V!>X7|Q`y7JY4N~koZb8P-)n#>^T~SxC>^ASPn$O8OtX`LMTPIw)zU0Bv zX-&AAtK4w0M6bxWkW&h)bg9H#$U#t{Vx6%GK&dae5z!bg$E7F}aqFueUESur0`Q4K)0<#FJX4|a z1(Few36KY$9FY8SPzu0*P!35UxlL-5!%LhqSqjS$iG%-$9Gw@W=%>MKOp1Mqvb@9t zj7xEV2`M4B&-;N3gV_$d-U0PasS|nyNdVsKGGo@O&n*D6nOs4FTS2{LcIPSki9o!P zD&}D4@LpzTCBG<3D~gO+Q@CQkaAKbFqgb@~)QnbCpt1ZB!P~ADiZW1JtjNI4QpN0F zbhuP3lvEjilv7w=w8A(rPj!p^))BZ9*?A`T3AG5#oNEd6i*>C--_~mlG|xBw`_T80 z_509T+Zqy?G_Hl=Dd@~ySAmDJ`&JHOgi)E(+P zX4v6+E}v7B>$&_5oPt@a!xrWg6^)dGIb~0irKY9jkAc6*(qVhV>V6Lbr{6`8Qp+hO zXeZLWW<*^CIXnXH)+kx742^iagsfx<(YsB@xScx$u!J&f{{?UefGx zJ^*|Qhqz{F8AIJ{J1yrx`IviNjEU{igUlf`G)l~>GIb?1(8*C@aZv@!;tWYg&0s}V z<|!B8UF79P2q3J4#|RiFU^fAK2-pjtLWq!J*Pkv@DLbBC10K>`HxmllLin7~O<9Ep{-@-=#{c3juT{8}2kPTJ_K-BM`AA3s&Tt??y$if*0{r)1LJpt&|6DQk^4|>-x+e>TeI6Y`*z(8ewL_> zA1BQtwUI;QK3wY^hUWO@@P6_*_=nL0weH?~@6>+#_an# zcg^6gY23BVv*+nLwbSRUU7t8f?)@4q&wxfK&(tA25S33%!n1#aRxmORefOdHA^ckx zs3z8@GDAUCIhjwdZ+u>L3v-x(QJEp2bC_`fGX;2E6%BKkT2(t8%m{7SO`}p~J6mUF z#hpplW2=J#=AFK80?jJ8QK|no;9`5+78lz~ae>h-{3= zRFIwwAAEHB?=Nb@7xdu^#_$EwIQV2JqYq6RL(^2o>TM_z2N~bs(p4^98y+==kN$Al zcw4FmP-NmM@<%`s0H{-74IbR!#;e?T)8O5$2lsDqqg8Iy8eAI~HU_3FSP!Gf*i#fF z3jnB75T&~r-r)9DxxJ508#7lmZm-V0XK?RnPQh;j0XzzUd?u<8AP8+z2(H(;MHrcv z3Czjr>r62KPIj%Kb;iD|5h`AsUZw@5z*LTB1;R>OE*QZ^d+|`=areg*O(P2LJ}hy0 z;JcXSz(FFhRH1ApO7cz1)2D%z8M1CMJLDop)a>z^>;+k+gDNnX_6vBWB(6a4p@97_ zE-SJMo>^WggM)Gvw$sSaQBfp=Nes7Y$C(a0JMA~flm!65%*jC`xld2-H@Cl99Cly8%P?g?8b$3H6}0XttIN`uEwIcpIEJ7S3oQKTKl=Hv1qO3YRn~A zXHI~#61o5E)q368Ehy=(#!R?7{y(uAi6`vqg{!gX*cnakKl|NM?(7$?*5H`AGhSk~ zad))jTl4+S|7DZ=_lfU;|Ke)Ld!-vCNTa1}$$AYEH_<|+0GTq9I>Y2cQeVRChN#Mp z5!@gLlVkwC48Tl6zwK0z*>;`{ll_~WZXdQ1Zn%p~qz*?6I*FPm${Lek9^4yPie~Pt zM#AG12N||N(tK7s`4ZN?tif)V86ml`GZ>fg13&d!undDML=&WJ@1=LUKyh`fQD1F0 zYK7qYCs3*X0)Jo(V#&`J9uH6Hv1ubVO&pJ|ny|wVCN_lGsxbRqSQpM2!a0p^QEI$! z_v{}m1k-x#fDt?3BG|nl%v6P$N7r=Wj3J!S_!h-Q@a1hiw%>^D_sl<56^=dX(Sai&!HszUryeb@jv_}_C8Nw-z zZ&9rIi5{(Y|N2n?Q1nE`NMtlFV;SHE6XF`2e}u39{{{!-fL_$RF*CEyA~L6+++RX* zH8?3?Oj&Yoi@_NL)6LAxI*aaJw3_8&ssrwr?NlQs9v*~Ji*UolyjVJLfG8#_eO2=sZKmZdaXAY z0jCWib)Q?80^aO{_sLfK-rY{Rv(=1SpKm(L!_%G}vxr0rHm?Dk^%Fa8HhwMlb_P3@c%;PNf%3784@9G`?1W>_gNERe&q5G-8AmKom(_$UtR(5fQdEI{g4b`JhA;UP?p zXfgR}X0TA2FPr>T>l~YgEci9(fL!l+(jQ?nO`lvLh62ufto&zlCpT#VNIfU?j#j5{Ija!+PR~kvO7pEy`wh@7+kxfm zyP($FclRy#?>Suc0E{5_HWcqP_`wZ6RpnDUKVtAB8b7j0;x7oFNcf`*Ck)|)#>aKDq|VP8G%%w329Ia9%FjN2{g>JYH}uyP<8?*niw0lRobn{z^V`Vdv7?WV zzpIV@LXTfI;+N|vY$1GG>pQCR#|-|M#vf}$_+3Qj&l~)C%_$VkS2KEi+K5BU8)O@j zNj5&O^~+Fne%|2cHGckus5XUxyO$~lfLXtqOP^{--zR*hyU_RT(Np7r@B93xQi1OW zLZl@XA}!+qsQ*LP+~k?rz(vSez^OGka)(oE$l(^t8w`k^me9W8#6)(@%Vz)ba#K1dyKy;5h=$5b$RJ9v~VXQgOt@ zz)+BaO656#JM6FSKOCCf6ng3*xC6fq@2-bQjYET@^$4j&k<89+X%Io@g@GZzdgaj9D)Z8{ty{+|gyoFHfC z-mTI=&OX$~#AP;zy~EsJL1c=Bk0CKe*~{#+M-|E$>t|!^{Ez;&!Q5&0FXOUW&X*N9 zkXIMWrHq}Wv(j=j;H1GRabz*chFSSIl5?}-N}6RO?h_3_&7tkkT3aIw&b9`>U{m1t zS{eE~D|#eCP3zWv$FNnJEnB<$k|2??VhJ5dvsyCv3aL?{`JB|=Cg1{qKXEgb1fRrz z1CJyYtJDC3y7&2NC~=4WHB>q@WS1Hm(7a_6o!7jjhE8eTQbXr7Z)r8=q=r1DhK^|7 zQbUI|Z>jrvpTCa&H$gx09n{c)#!^GGnzz)DqHSL`(W~0_r5;@L`#=q}hM%VmVdN?8 L{Npx5=$HQw9G`YC literal 0 HcmV?d00001 diff --git a/scaler/client/agent/__pycache__/disconnect_manager.cpython-311.pyc b/scaler/client/agent/__pycache__/disconnect_manager.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..494af143aa6782822cac0d1caa1b1692e8b15cf3 GIT binary patch literal 2376 zcmb_d-ESL35a0W-eX)~E>n4Q~sho-$$!cXkKw3bFQ7IJ#M4)xV!wKnR-EEu;_Yro_ z$_EjO+6eI<fTVcQ)Ed#ShEMf@`aRprvkQW`%m2@fQB}aA(dLiazr|6dS zlB?)SJTEw7Zdot86}=)5k$g<7;x4gDRC+8C@)Z6_)5k5PMQUSzxgz7E6>6y0^vCnE^bndoeQ!mJsql<~8wbBhNf8D!J`I_%> z3c44Pm3v(~xU*r>_^#-+VfAdm9M~8SfKuF!=3&?)l<0y*bkP!ai7r_pl`Vn(BiTP9?NiP|CwjIjS!HiLFKv=w>VP%mr+$2=>warK|zz91qj4dsJ_>{->R0GqI zzYb)F94_4YQSK>PI);h{{Rkb8sw3PxCQH3Dv;2ZhCxF}*jsv+Z!fXggHUWE>3Zy2n z^Tgv6`l_DvXiBXvgLN=h@z+8hBdj-CJ{scY`tUj!of-dl^dGgL_jI=i4Br8=ll}UlSol!rlVem73pbuLQFP!`=Iy6)N=w#S)_3YP{7wqI}KcQyZf#E?Xn z2kUFh4}8;ipsEKezE^iC=lDU!hZ_Txozx9%#|}2@H2u8t`0>Vxlz=yjd$8WcfWA`Z zlfX3Db&z4X;*WszB|#7l$xJxhpObgP;eJTo35WY3X@#TuA-Nxp>iuF>0C-Q6@N(lH L6u%s?7JKk7C-!S2 literal 0 HcmV?d00001 diff --git a/scaler/client/agent/__pycache__/future_manager.cpython-311.pyc b/scaler/client/agent/__pycache__/future_manager.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..0220c053ebf9472a0a2ee1cf96f88d35312b2ad7 GIT binary patch literal 8418 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 literal 0 HcmV?d00001 diff --git a/scaler/client/agent/__pycache__/mixins.cpython-311.pyc b/scaler/client/agent/__pycache__/mixins.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..717deac0e5c6fdde5f2429fe9fa413a16dd7ac45 GIT binary patch literal 6478 zcmcgw%Wu?17`OM~UGFAKUOdV(kU+I9Y>HZ{mLe)10aD6BfvT<5%5v;UvfxJ;dllHK z5-R)$J-~qj2h@V-AAox3vFB9cfGqV?RcddE67|5T-#1>bGxqLkqeS)Y{??xP&CEA5 z-}jsG{M6rH5a60BDYO5|g77CkgjcqCv+}+u2oD59Fho;O@IPgWR!T{Uc%L@YRz}HK zStV;pie%-KoRwGdmaNEDK`B^8rD*jjeWH*O&I?B7zF=gDaHBtL-f(UvMcU z#>)XO-<7w8@nql?y7C4XuL!)puDn6U>jz$`D{qMLwg7LSD{t5kuLRz3avg{9>F>A#3&emMrv2CJz{&0|TfoRm5CYm>?&pH0KAo1E<-7}m8`zmqg9or?o ze4c9abJsQZrayRj`UaGrvR#kXb+6{wet(d3mE5Wm*Yiu^W3zCEl`9}Zg>}=@o8!*@ z!dY0k4v!B6A}FFEC@GS@kqK#rcwhJt9-fB@f|BL(Q$(6c8R`3(7%OLFU_7$^K&zLR zG+Ub`R0r>BT`9P`2fvjA02c)jtnk+4^L2hNJ`=0YM1Q#IcvIHANh}yvVoXx%P)N?W z#GG-l^yupg6LXG5CT2~tP;)2DnmxOq)zmvRb%xmLtYgnM>du6#YbK%LpU!4!0!*~M z39ELyX1kU7JATO}wxQ02Q`OiP?@xs%3}J5&{)W$8;jhyE-%DdJOJj@qu@y)ae7RMZ zj=c}Bb&dobfP!=opq!#3c>e}~i?xi7(yj344?1>aw@Sdr8V3@_Cpg=%uI&gr0IKD@ zpI22|vxutt1y!{iqi*7TpQ_%fYi2VitxfBGNt*`8)O61x-kf7lRu!rW-39P0sFB%5 zOPGp)J#fDPxZC=?%I05Yw=bo{?D&!Zu$&g89jz2ekmT@T@#tB`h=Au}X_m+O!rFt# zl)*erH#OJgf+3uYl?qtXdoUO&aPzcZx?Z!0Q};SKIfmNGURHBA2al$e4g)#x=3qLv z*5?h)BPtl~sV)IO_MpkeINxxkEo(Qnj>FA6WOIroiurU80-8woA&ep%LfDUh-Vn^) zINl-Pthz@5dY!x2d|(~i6tq^LCy>)=3P=|8CY8_|iBqLC$pI^qVC6YhmdJ)g36197BjHL>bc%Fx~wHpshkI zp1d3>H@oBId#%(z{jPWFK}LNs*>j0DZO5bvJHts;=x!@_A!kEUB{Hc>ZlHLn%79Fz zjBHY-3<+c?=NEB{7m82@opf`e_*rvz@ga1Rlbs?&u}v0OJT$hiX&t2|%yoX+ZHq>N}C6NNKlKX}t$I6pFV9ANF?KcV#wne``cuNceSDIljjR{Xg zwOQBhF?=bQgo0ey7Bs_9gH{?lxW+3{4)dMP%htNBN$h2Zbj{X@$=0mE7`HLXTa#p* zgT6$IsV|e;I+@3p;LRJZPvXP1*CpOsE7gUXH>b8*ZXD)~?#{;AqYhA1h>e?0PsMCz zk>A+O8^&u-l{3W8gCeoBhK*Yjsvow%`P~p$(Ax9`t;J_N$+*hdSuK}3>md3hJ&!O2 z;LDStbI?yQF_OdrK7NJ}6UVcdhQJ2&54dSBj@!D**xEe{BX-`>ypVgY>9Nu?_36p3 z)R@d-f7{Ef0y!I#*-o!uMi!(`@&}^>u~7aBM(d0$;fnXbo*qw$qP=n`gP%iT&K*a< z*@6QfHEOeQC}9$AW)i$Fp|)sOL($ha$6R_PZs)G3eYbfqi2DZ?t&Jny%uUe0=B%!k z<<7yBLFyL>62eyqv1q{)LyCYj_Xa@QXjweg`!0O(_?7jzE;e2sVP_To5S*;)bxPsr zuF_mjC@O-#*JWpXm3iuTj_#Onq6bG)cEuvDi-(b{r|gJ|^_1?FlwE)jn2uYgNwQ50VZg}dzY zN;tU4f0r@^F|{Q8U$8SL!ckcg9uGg+#nP8Cb2Va&q_IE}9=eadW$DY9xf(J0wqSuI zJk%fEWa-P8xf(IXi&!8D56?Wh$kLZFb2Vb@9>xMm2wH&jWz1ZS7>ASnWqo}-_T=rh Loo;oXz0dy#`ZY9U literal 0 HcmV?d00001 diff --git a/scaler/client/agent/__pycache__/object_manager.cpython-311.pyc b/scaler/client/agent/__pycache__/object_manager.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..425eb22a8c4d4b9eedecf3aaab0c3470b48bf7dd GIT binary patch literal 5578 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 C*!!>m literal 0 HcmV?d00001 diff --git a/scaler/client/agent/client_agent.py b/scaler/client/agent/client_agent.py new file mode 100644 index 0000000..d0104ab --- /dev/null +++ b/scaler/client/agent/client_agent.py @@ -0,0 +1,200 @@ +import asyncio +import logging +import threading +from typing import Optional + +from scaler.client.agent.disconnect_manager import ClientDisconnectManager +from scaler.client.agent.future_manager import ClientFutureManager +from scaler.client.agent.heartbeat_manager import ClientHeartbeatManager +from scaler.client.agent.object_manager import ClientObjectManager +from scaler.client.agent.task_manager import ClientTaskManager +from scaler.client.serializer.mixins import Serializer +from scaler.io.async_connector import AsyncConnector +from scaler.protocol.python.message import ( + ClientDisconnect, + ClientHeartbeatEcho, + ClientShutdownResponse, + GraphTask, + GraphTaskCancel, + ObjectInstruction, + ObjectRequest, + ObjectResponse, + Task, + TaskCancel, + TaskResult, +) +from scaler.protocol.python.mixins import Message +from scaler.utility.event_loop import create_async_loop_routine +from scaler.utility.exceptions import ClientCancelledException, ClientQuitException, ClientShutdownException + +from scaler.io.model import Session, ConnectorType, TcpAddr + +class ClientAgent(threading.Thread): + def __init__( + self, + identity: bytes, + client_agent_address: TcpAddr, + scheduler_address: TcpAddr, + session: Session, + future_manager: ClientFutureManager, + stop_event: threading.Event, + timeout_seconds: int, + heartbeat_interval_seconds: int, + serializer: Serializer, + ): + threading.Thread.__init__(self, daemon=True) + + self._stop_event = stop_event + self._timeout_seconds = timeout_seconds + self._heartbeat_interval_seconds = heartbeat_interval_seconds + self._serializer = serializer + + self._identity = identity + self._client_agent_address = client_agent_address + self._scheduler_address = scheduler_address + self._session = session + + self._future_manager = future_manager + + self._connector_internal = AsyncConnector( + session=self._session, + name="client_agent_internal", + type_=ConnectorType.Pair, + bind_or_connect="bind", + address=self._client_agent_address, + callback=self.__on_receive_from_client, + identity=None, + ) + + print("client agent internal connected") + + self._connector_external = AsyncConnector( + session=self._session, + name="client_agent_external", + type_=ConnectorType.Dealer, + bind_or_connect="connect", + address=self._scheduler_address, + callback=self.__on_receive_from_scheduler, + identity=self._identity, + ) + + print("client agent external connected to scheduler:", self._scheduler_address) + + self._disconnect_manager: Optional[ClientDisconnectManager] = None + self._heartbeat_manager: Optional[ClientHeartbeatManager] = None + self._task_manager: Optional[ClientTaskManager] = None + + def __initialize(self): + self._disconnect_manager = ClientDisconnectManager() + self._heartbeat_manager = ClientHeartbeatManager(death_timeout_seconds=self._timeout_seconds) + self._object_manager = ClientObjectManager(identity=self._identity) + self._task_manager = ClientTaskManager() + + # register all managers + self._disconnect_manager.register( + connector_internal=self._connector_internal, connector_external=self._connector_external + ) + self._object_manager.register( + connector_internal=self._connector_internal, connector_external=self._connector_external + ) + self._task_manager.register( + connector_external=self._connector_external, + object_manager=self._object_manager, + future_manager=self._future_manager, + ) + self._heartbeat_manager.register(connector_external=self._connector_external) + + def __run_loop(self): + self._loop = asyncio.new_event_loop() + self._task = self._loop.create_task(self.__get_loops()) + self._loop.run_until_complete(self._task) + self._loop.close() + + def run(self): + self.__initialize() + self.__run_loop() + + async def __on_receive_from_client(self, message: Message): + if isinstance(message, ClientDisconnect): + await self._disconnect_manager.on_client_disconnect(message) + return + + if isinstance(message, ObjectInstruction): + await self._object_manager.on_object_instruction(message) + return + + if isinstance(message, ObjectRequest): + await self._object_manager.on_object_request(message) + return + + if isinstance(message, Task): + await self._task_manager.on_new_task(message) + return + + if isinstance(message, TaskCancel): + await self._task_manager.on_cancel_task(message) + return + + if isinstance(message, GraphTask): + await self._task_manager.on_new_graph_task(message) + return + + if isinstance(message, GraphTaskCancel): + await self._task_manager.on_cancel_graph_task(message) + return + + raise TypeError(f"Unknown {message=}") + + async def __on_receive_from_scheduler(self, message: Message): + if isinstance(message, ClientShutdownResponse): + await self._disconnect_manager.on_client_shutdown_response(message) + return + + if isinstance(message, ClientHeartbeatEcho): + await self._heartbeat_manager.on_heartbeat_echo(message) + return + + if isinstance(message, TaskResult): + await self._task_manager.on_task_result(message) + return + + if isinstance(message, ObjectResponse): + self._future_manager.on_object_response(message) + return + + raise TypeError(f"Unknown {message=}") + + async def __get_loops(self): + await self._heartbeat_manager.send_heartbeat() + + exception = None + try: + await asyncio.gather( + create_async_loop_routine(self._connector_external.routine, 0), + create_async_loop_routine(self._connector_internal.routine, 0), + create_async_loop_routine(self._heartbeat_manager.routine, self._heartbeat_interval_seconds), + ) + except BaseException as e: + exception = e + finally: + self._stop_event.set() # always set the stop event before setting futures' exceptions + + await self._object_manager.clean_all_objects() + + self._connector_external.destroy() + self._connector_internal.destroy() + + if exception is None: + return + + if isinstance(exception, asyncio.CancelledError): + logging.error("ClientAgent: async. loop cancelled") + self._future_manager.set_all_futures_with_exception(ClientCancelledException("client cancelled")) + elif isinstance(exception, (ClientQuitException, ClientShutdownException)): + logging.info("ClientAgent: client quitting") + self._future_manager.set_all_futures_with_exception(exception) + elif isinstance(exception, TimeoutError): + logging.error(f"ClientAgent: client timeout when connecting to {self._scheduler_address}") + self._future_manager.set_all_futures_with_exception(exception) + else: + raise exception diff --git a/scaler/client/agent/disconnect_manager.py b/scaler/client/agent/disconnect_manager.py new file mode 100644 index 0000000..50df24b --- /dev/null +++ b/scaler/client/agent/disconnect_manager.py @@ -0,0 +1,27 @@ +from typing import Optional + +from scaler.client.agent.mixins import DisconnectManager +from scaler.io.async_connector import AsyncConnector +from scaler.protocol.python.message import ClientDisconnect, ClientShutdownResponse +from scaler.utility.exceptions import ClientQuitException, ClientShutdownException + + +class ClientDisconnectManager(DisconnectManager): + def __init__(self): + self._connector_internal: Optional[AsyncConnector] = None + self._connector_external: Optional[AsyncConnector] = None + + def register(self, connector_internal: AsyncConnector, connector_external: AsyncConnector): + self._connector_internal = connector_internal + self._connector_external = connector_external + + async def on_client_disconnect(self, disconnect: ClientDisconnect): + await self._connector_external.send(disconnect) + + if disconnect.disconnect_type == ClientDisconnect.DisconnectType.Disconnect: + raise ClientQuitException("client disconnecting") + + async def on_client_shutdown_response(self, response: ClientShutdownResponse): + await self._connector_internal.send(response) + + raise ClientShutdownException("cluster shutting down") diff --git a/scaler/client/agent/future_manager.py b/scaler/client/agent/future_manager.py new file mode 100644 index 0000000..d9733ec --- /dev/null +++ b/scaler/client/agent/future_manager.py @@ -0,0 +1,115 @@ +import logging +import threading +from concurrent.futures import Future, InvalidStateError +from typing import Dict, Tuple + +from scaler.client.agent.mixins import FutureManager +from scaler.client.future import ScalerFuture +from scaler.client.serializer.mixins import Serializer +from scaler.io.utility import concat_list_of_bytes +from scaler.protocol.python.common import TaskStatus +from scaler.protocol.python.message import ObjectResponse, TaskResult +from scaler.utility.exceptions import DisconnectedError, NoWorkerError, TaskNotFoundError, WorkerDiedError +from scaler.utility.metadata.profile_result import retrieve_profiling_result_from_task_result +from scaler.utility.object_utility import deserialize_failure + + +class ClientFutureManager(FutureManager): + def __init__(self, serializer: Serializer): + self._lock = threading.RLock() + self._serializer = serializer + + self._task_id_to_future: Dict[bytes, ScalerFuture] = dict() + self._object_id_to_future: Dict[bytes, Tuple[TaskStatus, ScalerFuture]] = dict() + + def add_future(self, future: Future): + assert isinstance(future, ScalerFuture) + with self._lock: + future.set_running_or_notify_cancel() + self._task_id_to_future[future.task_id] = future + + def cancel_all_futures(self): + with self._lock: + logging.info(f"canceling {len(self._task_id_to_future)} task(s)") + for task_id, future in self._task_id_to_future.items(): + future.cancel() + + def set_all_futures_with_exception(self, exception: Exception): + with self._lock: + for future in self._task_id_to_future.values(): + try: + future.set_exception(exception) + except InvalidStateError: + continue # Future got canceled + + self._task_id_to_future = dict() + + def on_task_result(self, result: TaskResult): + with self._lock: + task_id = result.task_id + if task_id not in self._task_id_to_future: + return + + future = self._task_id_to_future.pop(task_id) + assert result.task_id == future.task_id + + profile_result = retrieve_profiling_result_from_task_result(result) + + try: + if result.status == TaskStatus.NotFound: + future.set_exception(TaskNotFoundError(f"task not found: {task_id.hex()}"), profile_result) + return + + if result.status == TaskStatus.WorkerDied: + future.set_exception( + WorkerDiedError(f"worker died when processing task: {task_id.hex()}"), profile_result + ) + return + + if result.status == TaskStatus.NoWorker: + future.set_exception( + NoWorkerError(f"no available worker when processing task: {task_id.hex()}"), profile_result + ) + return + + if result.status == TaskStatus.Canceled: + future.set_exception(DisconnectedError("client disconnected"), profile_result) + return + + if result.status == TaskStatus.Success: + assert len(result.results) == 1 + result_object_id = result.results[0] + future.set_result_ready(result_object_id, profile_result) + self._object_id_to_future[result_object_id] = result.status, future + return + + if result.status == TaskStatus.Failed: + assert len(result.results) == 1 + result_object_id = result.results[0] + future.set_result_ready(result_object_id, profile_result) + self._object_id_to_future[result_object_id] = result.status, future + return + + raise TypeError(f"Unknown task status: {result.status}") + except InvalidStateError: + return # Future got canceled + + def on_object_response(self, response: ObjectResponse): + for object_id, object_name, object_bytes in zip( + response.object_content.object_ids, + response.object_content.object_names, + response.object_content.object_bytes, + ): + if object_id not in self._object_id_to_future: + continue + + status, future = self._object_id_to_future.pop(object_id) + + try: + if status == TaskStatus.Success: + future.set_result(self._serializer.deserialize(concat_list_of_bytes(object_bytes))) + + elif status == TaskStatus.Failed: + future.set_exception(deserialize_failure(concat_list_of_bytes(object_bytes))) + except InvalidStateError: + continue # future got canceled diff --git a/scaler/client/agent/heartbeat_manager.py b/scaler/client/agent/heartbeat_manager.py new file mode 100644 index 0000000..d100a2e --- /dev/null +++ b/scaler/client/agent/heartbeat_manager.py @@ -0,0 +1,61 @@ +import time +from typing import Optional + +import psutil + +from scaler.client.agent.mixins import HeartbeatManager +from scaler.io.async_connector import AsyncConnector +from scaler.protocol.python.message import ClientHeartbeat, ClientHeartbeatEcho +from scaler.protocol.python.status import Resource +from scaler.utility.mixins import Looper + + +class ClientHeartbeatManager(Looper, HeartbeatManager): + def __init__(self, death_timeout_seconds: int): + self._death_timeout_seconds = death_timeout_seconds + + self._process = psutil.Process() + + self._last_scheduler_contact = time.time() + self._start_timestamp_ns = 0 + self._latency_us = 0 + self._connected = False + + self._connector_external: Optional[AsyncConnector] = None + + def register(self, connector_external: AsyncConnector): + self._connector_external = connector_external + + async def send_heartbeat(self): + await self._connector_external.send( + ClientHeartbeat.new_msg( + Resource.new_msg(int(self._process.cpu_percent() * 10), self._process.memory_info().rss), + self._latency_us, + ) + ) + + async def on_heartbeat_echo(self, heartbeat: ClientHeartbeatEcho): + if not self._connected: + self._connected = True + + self._last_scheduler_contact = time.time() + if self._start_timestamp_ns == 0: + # not handling echo if we didn't send out heartbeat + return + + self._latency_us = int(((time.time_ns() - self._start_timestamp_ns) / 2) // 1_000) + self._start_timestamp_ns = 0 + + async def routine(self): + if time.time() - self._last_scheduler_contact > self._death_timeout_seconds: + raise TimeoutError( + f"Timeout when connecting to scheduler {self._connector_external.address} " + f"in {self._death_timeout_seconds} seconds" + ) + + if self._start_timestamp_ns != 0: + # already sent heartbeat, expecting heartbeat echo, so not sending + return + + await self.send_heartbeat() + self._start_timestamp_ns = time.time_ns() diff --git a/scaler/client/agent/mixins.py b/scaler/client/agent/mixins.py new file mode 100644 index 0000000..a66b1bf --- /dev/null +++ b/scaler/client/agent/mixins.py @@ -0,0 +1,94 @@ +import abc +from concurrent.futures import Future + +from scaler.protocol.python.message import ( + ClientDisconnect, + ClientHeartbeatEcho, + ClientShutdownResponse, + GraphTask, + ObjectInstruction, + ObjectRequest, + ObjectResponse, + Task, + TaskResult, +) + + +class HeartbeatManager(metaclass=abc.ABCMeta): + @abc.abstractmethod + async def send_heartbeat(self): + raise NotImplementedError() + + @abc.abstractmethod + async def on_heartbeat_echo(self, heartbeat: ClientHeartbeatEcho): + raise NotImplementedError() + + +class TimeoutManager(metaclass=abc.ABCMeta): + @abc.abstractmethod + def update_last_seen_time(self): + raise NotImplementedError() + + +class ObjectManager(metaclass=abc.ABCMeta): + @abc.abstractmethod + async def on_object_instruction(self, object_instruction: ObjectInstruction): + raise NotImplementedError() + + @abc.abstractmethod + async def on_object_request(self, request: ObjectRequest): + raise NotImplementedError() + + @abc.abstractmethod + def record_task_result(self, task_id: bytes, object_id: bytes): + raise NotImplementedError() + + @abc.abstractmethod + async def clean_all_objects(self): + raise NotImplementedError() + + +class TaskManager(metaclass=abc.ABCMeta): + @abc.abstractmethod + async def on_new_task(self, task: Task): + raise NotImplementedError() + + @abc.abstractmethod + async def on_new_graph_task(self, task: GraphTask): + raise NotImplementedError() + + @abc.abstractmethod + async def on_task_result(self, result: TaskResult): + raise NotImplementedError() + + +class FutureManager(metaclass=abc.ABCMeta): + @abc.abstractmethod + def add_future(self, future: Future): + raise NotImplementedError() + + @abc.abstractmethod + def cancel_all_futures(self): + raise NotImplementedError() + + @abc.abstractmethod + def set_all_futures_with_exception(self, exception: Exception): + raise NotImplementedError() + + @abc.abstractmethod + def on_task_result(self, result: TaskResult): + raise NotImplementedError() + + @abc.abstractmethod + def on_object_response(self, response: ObjectResponse): + raise NotImplementedError() + + +class DisconnectManager(metaclass=abc.ABCMeta): + @abc.abstractmethod + async def on_client_disconnect(self, disconnect: ClientDisconnect): + raise NotImplementedError() + + @abc.abstractmethod + async def on_client_shutdown_response(self, response: ClientShutdownResponse): + raise NotImplementedError() diff --git a/scaler/client/agent/object_manager.py b/scaler/client/agent/object_manager.py new file mode 100644 index 0000000..92ff051 --- /dev/null +++ b/scaler/client/agent/object_manager.py @@ -0,0 +1,75 @@ +from typing import Optional, Set + +from scaler.client.agent.mixins import ObjectManager +from scaler.io.async_connector import AsyncConnector +from scaler.protocol.python.common import ObjectContent +from scaler.protocol.python.message import ObjectInstruction, ObjectRequest + + +class ClientObjectManager(ObjectManager): + def __init__(self, identity: bytes): + self._sent_object_ids: Set[bytes] = set() + self._identity = identity + + self._connector_internal: Optional[AsyncConnector] = None + self._connector_external: Optional[AsyncConnector] = None + + def register(self, connector_internal: AsyncConnector, connector_external: AsyncConnector): + self._connector_internal = connector_internal + self._connector_external = connector_external + + async def on_object_instruction(self, instruction: ObjectInstruction): + if instruction.instruction_type == ObjectInstruction.ObjectInstructionType.Create: + await self.__send_object_creation(instruction) + elif instruction.instruction_type == ObjectInstruction.ObjectInstructionType.Delete: + await self.__delete_objects(instruction) + + async def on_object_request(self, object_request: ObjectRequest): + assert object_request.request_type == ObjectRequest.ObjectRequestType.Get + await self._connector_external.send(object_request) + + def record_task_result(self, task_id: bytes, object_id: bytes): + self._sent_object_ids.add(object_id) + + async def clean_all_objects(self): + await self._connector_external.send( + ObjectInstruction.new_msg( + ObjectInstruction.ObjectInstructionType.Delete, + self._identity, + ObjectContent.new_msg(tuple(self._sent_object_ids)), + ) + ) + self._sent_object_ids = set() + + async def __send_object_creation(self, instruction: ObjectInstruction): + assert instruction.instruction_type == ObjectInstruction.ObjectInstructionType.Create + + new_object_ids = set(instruction.object_content.object_ids) - self._sent_object_ids + if not new_object_ids: + return + + new_object_content = ObjectContent.new_msg( + *zip( + *filter( + lambda object_pack: object_pack[0] in new_object_ids, + zip( + instruction.object_content.object_ids, + instruction.object_content.object_names, + instruction.object_content.object_bytes, + ), + ) + ) + ) + + self._sent_object_ids.update(set(new_object_content.object_ids)) + + await self._connector_external.send( + ObjectInstruction.new_msg( + ObjectInstruction.ObjectInstructionType.Create, instruction.object_user, new_object_content + ) + ) + + async def __delete_objects(self, instruction: ObjectInstruction): + assert instruction.instruction_type == ObjectInstruction.ObjectInstructionType.Delete + self._sent_object_ids.difference_update(instruction.object_content.object_ids) + await self._connector_external.send(instruction) diff --git a/scaler/client/agent/task_manager.py b/scaler/client/agent/task_manager.py new file mode 100644 index 0000000..8b54c77 --- /dev/null +++ b/scaler/client/agent/task_manager.py @@ -0,0 +1,66 @@ +from typing import Optional, Set + +from scaler.client.agent.future_manager import ClientFutureManager +from scaler.client.agent.mixins import ObjectManager, TaskManager +from scaler.io.async_connector import AsyncConnector +from scaler.protocol.python.common import TaskStatus +from scaler.protocol.python.message import GraphTask, GraphTaskCancel, Task, TaskCancel, TaskResult + + +class ClientTaskManager(TaskManager): + def __init__(self): + self._task_ids: Set[bytes] = set() + self._graph_task_ids: Set[bytes] = set() + + self._connector_external: Optional[AsyncConnector] = None + self._object_manager: Optional[ObjectManager] = None + self._future_manager: Optional[ClientFutureManager] = None + + def register( + self, connector_external: AsyncConnector, object_manager: ObjectManager, future_manager: ClientFutureManager + ): + self._connector_external = connector_external + self._object_manager = object_manager + self._future_manager = future_manager + + async def on_new_task(self, task: Task): + self._task_ids.add(task.task_id) + await self._connector_external.send(task) + + async def on_cancel_task(self, task_cancel: TaskCancel): + # We might receive a cancel task event on a previously finished task if: + # - The scheduler sends a TaskResult message to the client agent + # - The client sends a TaskCancel message to the client agent, as it's not yet aware the task finished. + # - The client agent processes the TaskResult message and removes the task from self._task_ids + # - The client agent processes the TaskCancel message (that was already queued before processing the + # TaskResult), and fails on self._task_ids.remove() as the task_id no longer exists. + + if task_cancel.task_id not in self._task_ids: + return + + self._task_ids.remove(task_cancel.task_id) + await self._connector_external.send(task_cancel) + + async def on_new_graph_task(self, task: GraphTask): + self._graph_task_ids.add(task.task_id) + self._task_ids.update(set(task.targets)) + await self._connector_external.send(task) + + async def on_cancel_graph_task(self, task_cancel: GraphTaskCancel): + if task_cancel.task_id not in self._graph_task_ids: + return + + self._graph_task_ids.remove(task_cancel.task_id) + await self._connector_external.send(task_cancel) + + async def on_task_result(self, result: TaskResult): + if result.task_id not in self._task_ids: + return + + self._task_ids.remove(result.task_id) + + if result.status != TaskStatus.Canceled: + for result_object_id in result.results: + self._object_manager.record_task_result(result.task_id, result_object_id) + + self._future_manager.on_task_result(result) diff --git a/scaler/client/client.py b/scaler/client/client.py new file mode 100644 index 0000000..811e786 --- /dev/null +++ b/scaler/client/client.py @@ -0,0 +1,554 @@ +import dataclasses +import functools +import logging +import os +import threading +import uuid +from collections import Counter +from inspect import signature +from typing import Any, Callable, Dict, Iterable, List, Optional, Tuple, Union +import random + +from scaler.client.agent.client_agent import ClientAgent +from scaler.client.agent.future_manager import ClientFutureManager +from scaler.client.future import ScalerFuture +from scaler.client.object_buffer import ObjectBuffer +from scaler.client.object_reference import ObjectReference +from scaler.client.serializer.default import DefaultSerializer +from scaler.client.serializer.mixins import Serializer +from scaler.io.config import DEFAULT_CLIENT_TIMEOUT_SECONDS, DEFAULT_HEARTBEAT_INTERVAL_SECONDS +from scaler.io.sync_connector import SyncConnector +from scaler.protocol.python.message import ClientDisconnect, ClientShutdownResponse, GraphTask, Task +from scaler.utility.exceptions import ClientQuitException +from scaler.utility.graph.optimization import cull_graph +from scaler.utility.graph.topological_sorter import TopologicalSorter +from scaler.utility.metadata.profile_result import ProfileResult +from scaler.utility.metadata.task_flags import TaskFlags, retrieve_task_flags_from_task +from scaler.worker.agent.processor.processor import Processor + +from scaler.io.model import Session, ConnectorType, TcpAddr, InprocAddr + + +@dataclasses.dataclass +class _CallNode: + func: Callable + args: Tuple[str, ...] + + def __post_init__(self): + if not callable(self.func): + raise TypeError(f"the first item of the tuple must be function, get {self.func}") + + if not isinstance(self.args, tuple): + raise TypeError(f"arguments must be tuple, get {self.args}") + + for arg in self.args: + if not isinstance(arg, str): + raise TypeError(f"argument `{arg}` must be a string and the string has to be in the graph") + + +class Client: + def __init__( + self, + address: str, + profiling: bool = False, + timeout_seconds: int = DEFAULT_CLIENT_TIMEOUT_SECONDS, + heartbeat_interval_seconds: int = DEFAULT_HEARTBEAT_INTERVAL_SECONDS, + serializer: Serializer = DefaultSerializer(), + ): + """ + The Scaler Client used to send tasks to a scheduler. + + :param address: Address of Scheduler to submit work to + :type address: str + :param profiling: If True, the returned futures will have the `task_duration()` property enabled. + :type profiling: bool + :param timeout_seconds: Seconds until heartbeat times out + :type timeout_seconds: int + :param heartbeat_interval_seconds: Frequency of heartbeat to scheduler in seconds + :type heartbeat_interval_seconds: int + """ + self.__initialize__(address, profiling, timeout_seconds, heartbeat_interval_seconds, serializer) + + def __initialize__( + self, + address: str, + profiling: bool, + timeout_seconds: int, + heartbeat_interval_seconds: int, + serializer: Serializer = DefaultSerializer(), + ): + self._serializer = serializer + + self._profiling = profiling + self._identity = f"{os.getpid()}|Client|{uuid.uuid4().bytes.hex()}".encode() + + self._client_agent_address = TcpAddr.localhost(random.randint(10000, 20000)) #InprocAddr(f"scaler_client_{uuid.uuid4().hex}") + self._scheduler_address = TcpAddr.from_str(address) + self._timeout_seconds = timeout_seconds + self._heartbeat_interval_seconds = heartbeat_interval_seconds + + self._stop_event = threading.Event() + self._session = Session(2) + + self._future_manager = ClientFutureManager(self._serializer) + self._agent = ClientAgent( + identity=self._identity, + client_agent_address=self._client_agent_address, + scheduler_address=self._scheduler_address, + # context=self._context, + session=self._session, + future_manager=self._future_manager, + stop_event=self._stop_event, + timeout_seconds=self._timeout_seconds, + heartbeat_interval_seconds=self._heartbeat_interval_seconds, + serializer=self._serializer, + ) + self._agent.start() + + self._connector = SyncConnector( + session=self._session, type_=ConnectorType.Pair, address=self._client_agent_address, identity=self._identity + ) + + logging.info(f"ScalerClient: connect to {self._scheduler_address}") + + self._object_buffer = ObjectBuffer(self._identity, self._serializer, self._connector) + self._future_factory = functools.partial(ScalerFuture, connector=self._connector) + + self._object_buffer.buffer_send_serializer() + self._object_buffer.commit_send_objects() + + @property + def identity(self): + return self._identity + + def __del__(self): + self.disconnect() + + def __enter__(self): + return self + + def __exit__(self, exc_type, exc_val, exc_tb): + self.disconnect() + + def __getstate__(self) -> dict: + """ + Serializes the client object's state. + + Client serialization is useful when a client reference is used within a remote task: + + + .. code:: python + + client = Client(...) + + def fibonacci(client: Client, n: int): + if n == 0: + return 0 + elif n == 1: + return 1 + else: + a = client.submit(fibonacci, n - 1) + b = client.submit(fibonacci, n - 2) + return a.result() + b.result() + + print(client.submit(fibonacci, client, 7).result()) + + + When serializing the client, only saves the address parameters. When deserialized, a new client object + connecting to the same scheduler and remote logger will be instantiated. + """ + + return { + "address": self._scheduler_address, + "profiling": self._profiling, + "timeout_seconds": self._timeout_seconds, + "heartbeat_interval_seconds": self._heartbeat_interval_seconds, + } + + def __setstate__(self, state: dict) -> None: + # TODO: fix copy the serializer + self.__initialize__( + address=state["address"], + profiling=state["profiling"], + timeout_seconds=state["timeout_seconds"], + heartbeat_interval_seconds=state["heartbeat_interval_seconds"], + ) + + def submit(self, fn: Callable, *args, **kwargs) -> ScalerFuture: + """ + Submit a single task (function with arguments) to the scheduler, and return a future + + :param fn: function to be executed remotely + :type fn: Callable + :param args: positional arguments will be passed to function + :return: future of the submitted task + :rtype: ScalerFuture + """ + + self.__assert_client_not_stopped() + + function_object_id = self._object_buffer.buffer_send_function(fn).object_id + all_args = Client.__convert_kwargs_to_args(fn, args, kwargs) + + task, future = self.__submit(function_object_id, all_args, delayed=True) + + self._object_buffer.commit_send_objects() + self._connector.send(task) + return future + + def map(self, fn: Callable, iterable: Iterable[Tuple[Any, ...]]) -> List[Any]: + if not all(isinstance(args, (tuple, list)) for args in iterable): + raise TypeError("iterable should be list of arguments(list or tuple-like) of function") + + self.__assert_client_not_stopped() + + function_object_id = self._object_buffer.buffer_send_function(fn).object_id + tasks, futures = zip(*[self.__submit(function_object_id, args, delayed=False) for args in iterable]) + + self._object_buffer.commit_send_objects() + for task in tasks: + self._connector.send(task) + + try: + results = [fut.result() for fut in futures] + except Exception as e: + logging.exception(f"error happened when do scaler client.map:\n{e}") + self.disconnect() + raise e + + return results + + def get( + self, graph: Dict[str, Union[Any, Tuple[Union[Callable, str], ...]]], keys: List[str], block: bool = True + ) -> Dict[str, Union[Any, ScalerFuture]]: + """ + .. code-block:: python + :linenos: + graph = { + "a": 1, + "b": 2, + "c": (inc, "a"), + "d": (inc, "b"), + "e": (add, "c", "d") + } + + :param graph: dictionary presentation of task graphs + :type graph: Dict[str, Union[Any, Tuple[Union[Callable, Any]] + :param keys: list of keys want to get results from computed graph + :type keys: List[str] + :param block: if True, it will directly return a dictionary that maps from keys to results + :return: dictionary of mapping keys to futures, or map to results if block=True is specified + :rtype: Dict[ScalerFuture] + """ + + self.__assert_client_not_stopped() + + graph = cull_graph(graph, keys) + + node_name_to_argument, call_graph = self.__split_data_and_graph(graph) + self.__check_graph(node_name_to_argument, call_graph, keys) + + graph_task, compute_futures, finished_futures = self.__construct_graph( + node_name_to_argument, call_graph, keys, block + ) + self._object_buffer.commit_send_objects() + self._connector.send(graph_task) + + self._future_manager.add_future( + self._future_factory( + task=Task.new_msg( + task_id=graph_task.task_id, + source=self._identity, + metadata=b"", + func_object_id=b"", + function_args=[], + ), + is_delayed=not block, + group_task_id=None, + ) + ) + for future in compute_futures.values(): + self._future_manager.add_future(future) + + # preserve the future insertion order based on inputted keys + futures = {} + for key in keys: + if key in compute_futures: + futures[key] = compute_futures[key] + else: + futures[key] = finished_futures[key] + + if not block: + # just return futures + return futures + + try: + results = {k: v.result() for k, v in futures.items()} + except Exception as e: + logging.exception(f"error happened when do scaler client.get:\n{e}") + self.disconnect() + raise e + + return results + + def send_object(self, obj: Any, name: Optional[str] = None) -> ObjectReference: + """ + send object to scheduler, this can be used to cache very large data to scheduler, and reuse it in multiple + tasks + + :param obj: object to send, it will be serialized and send to scheduler + :type obj: Any + :param name: give a name to the cached argument + :type name: Optional[str] + :return: object reference + :rtype ObjectReference + """ + + self.__assert_client_not_stopped() + + cache = self._object_buffer.buffer_send_object(obj, name) + return ObjectReference(cache.object_name, cache.object_id, sum(map(len, cache.object_bytes))) + + def disconnect(self): + """ + disconnect from connected scheduler, this will not shut down the scheduler + """ + + if self._stop_event.is_set(): + self.__destroy() + return + + logging.info(f"ScalerClient: disconnect from {self._scheduler_address}") + + self._future_manager.cancel_all_futures() + + self._connector.send(ClientDisconnect.new_msg(ClientDisconnect.DisconnectType.Disconnect)) + + self.__destroy() + + def __receive_shutdown_response(self): + message: Optional[ClientShutdownResponse] = None + while not isinstance(message, ClientShutdownResponse): + message = self._connector.receive() + + if not message.accepted: + raise ValueError("Scheduler is in protected mode. Can't shutdown") + + def shutdown(self): + """ + shutdown all workers that connected to the scheduler this client connects to, it will cancel all other + clients' ongoing tasks, please be aware shutdown might not success if scheduler is configured as protected mode, + then it cannot shut down scheduler and the workers + """ + + if not self._agent.is_alive(): + self.__destroy() + return + + logging.info(f"ScalerClient: request shutdown for {self._scheduler_address}") + + self._future_manager.cancel_all_futures() + + self._connector.send(ClientDisconnect.new_msg(ClientDisconnect.DisconnectType.Shutdown)) + try: + self.__receive_shutdown_response() + finally: + self.__destroy() + + def __submit(self, function_object_id: bytes, args: Tuple[Any, ...], delayed: bool) -> Tuple[Task, ScalerFuture]: + task_id = uuid.uuid1().bytes + + object_ids = [] + for arg in args: + if isinstance(arg, ObjectReference): + object_ids.append(arg.object_id) + else: + object_ids.append(self._object_buffer.buffer_send_object(arg).object_id) + + task_flags_bytes = self.__get_task_flags().serialize() + + arguments = [Task.Argument(Task.Argument.ArgumentType.ObjectID, object_id) for object_id in object_ids] + task = Task.new_msg( + task_id=task_id, + source=self._identity, + metadata=task_flags_bytes, + func_object_id=function_object_id, + function_args=arguments, + ) + + future = self._future_factory(task=task, is_delayed=delayed, group_task_id=None) + self._future_manager.add_future(future) + return task, future + + @staticmethod + def __convert_kwargs_to_args(fn: Callable, args: Tuple[Any, ...], kwargs: Dict[str, Any]) -> Tuple[Any, ...]: + all_params = [p for p in signature(fn).parameters.values()] + + params = [p for p in all_params if p.kind in {p.POSITIONAL_ONLY, p.POSITIONAL_OR_KEYWORD}] + + if len(args) >= len(params): + return args + + number_of_required = len([p for p in params if p.default is p.empty]) + + args_list = list(args) + kwargs = kwargs.copy() + kwargs.update({p.name: p.default for p in all_params if p.kind == p.KEYWORD_ONLY if p.default != p.empty}) + + for p in params[len(args_list) : number_of_required]: + try: + args_list.append(kwargs.pop(p.name)) + except KeyError: + missing = tuple(p.name for p in params[len(args_list) : number_of_required]) + raise TypeError(f"{fn} missing {len(missing)} arguments: {missing}") + + for p in params[len(args_list) :]: + args_list.append(kwargs.pop(p.name, p.default)) + + return tuple(args_list) + + def __split_data_and_graph( + self, graph: Dict[str, Union[Any, Tuple[Union[Callable, str], ...]]] + ) -> Tuple[Dict[str, Tuple[Task.Argument, Any]], Dict[str, _CallNode]]: + call_graph = {} + node_name_to_argument: Dict[str, Tuple[Task.Argument, Union[Any, Tuple[Union[Callable, Any], ...]]]] = dict() + + for node_name, node in graph.items(): + if isinstance(node, tuple) and len(node) > 0 and callable(node[0]): + call_graph[node_name] = _CallNode(func=node[0], args=node[1:]) # type: ignore[arg-type] + continue + + if isinstance(node, ObjectReference): + object_id = node.object_id + else: + object_id = self._object_buffer.buffer_send_object(node, name=node_name).object_id + + node_name_to_argument[node_name] = (Task.Argument(Task.Argument.ArgumentType.ObjectID, object_id), node) + + return node_name_to_argument, call_graph + + @staticmethod + def __check_graph( + node_to_argument: Dict[str, Tuple[Task.Argument, Any]], call_graph: Dict[str, _CallNode], keys: List[str] + ): + duplicate_keys = [key for key, count in dict(Counter(keys)).items() if count > 1] + if duplicate_keys: + raise KeyError(f"duplicate key detected in argument keys: {duplicate_keys}") + + # sanity check graph + for key in keys: + if key not in call_graph and key not in node_to_argument: + raise KeyError(f"key {key} has to be in graph") + + sorter: TopologicalSorter[str] = TopologicalSorter() + for node_name, node in call_graph.items(): + for arg in node.args: + if arg not in node_to_argument and arg not in call_graph: + raise KeyError(f"argument {arg} in node '{node_name}': {node} is not defined in graph") + + sorter.add(node_name, *node.args) + + # check cyclic dependencies + sorter.prepare() + + def __construct_graph( + self, + node_name_to_arguments: Dict[str, Tuple[Task.Argument, Any]], + call_graph: Dict[str, _CallNode], + keys: List[str], + block: bool, + ) -> Tuple[GraphTask, Dict[str, ScalerFuture], Dict[str, ScalerFuture]]: + graph_task_id = uuid.uuid1().bytes + + node_name_to_task_id: Dict[str, bytes] = {node_name: uuid.uuid1().bytes for node_name in call_graph.keys()} + + task_flags_bytes = self.__get_task_flags().serialize() + + task_id_to_tasks = dict() + + for node_name, node in call_graph.items(): + task_id = node_name_to_task_id[node_name] + function_cache = self._object_buffer.buffer_send_function(node.func) + + arguments: List[Task.Argument] = [] + for arg in node.args: + assert arg in call_graph or arg in node_name_to_arguments + + if arg in call_graph: + arguments.append( + Task.Argument(type=Task.Argument.ArgumentType.Task, data=node_name_to_task_id[arg]) + ) + elif arg in node_name_to_arguments: + argument, _ = node_name_to_arguments[arg] + arguments.append(argument) + else: + raise ValueError("Not possible") + + task_id_to_tasks[task_id] = Task.new_msg( + task_id=task_id, + source=self._identity, + metadata=task_flags_bytes, + func_object_id=function_cache.object_id, + function_args=arguments, + ) + + result_task_ids = [node_name_to_task_id[key] for key in keys if key in call_graph] + graph_task = GraphTask.new_msg(graph_task_id, self._identity, result_task_ids, list(task_id_to_tasks.values())) + + compute_futures = {} + ready_futures = {} + for key in keys: + if key in call_graph: + compute_futures[key] = self._future_factory( + task=task_id_to_tasks[node_name_to_task_id[key]], is_delayed=not block, group_task_id=graph_task_id + ) + + elif key in node_name_to_arguments: + argument, data = node_name_to_arguments[key] + future: ScalerFuture = self._future_factory( + task=Task.new_msg( + task_id=argument.data, source=self._identity, metadata=b"", func_object_id=b"", function_args=[] + ), + is_delayed=False, + group_task_id=graph_task_id, + ) + future.set_result_ready(argument.data, ProfileResult()) + future.set_result(data) + ready_futures[key] = future + + else: + raise ValueError(f"cannot find {key=} in graph") + + return graph_task, compute_futures, ready_futures + + def __get_task_flags(self) -> TaskFlags: + parent_task_priority = self.__get_parent_task_priority() + + if parent_task_priority is not None: + task_priority = parent_task_priority + 1 + else: + task_priority = 0 + + return TaskFlags(profiling=self._profiling, priority=task_priority) + + def __assert_client_not_stopped(self): + if self._stop_event.is_set(): + raise ClientQuitException("client is already stopped.") + + def __destroy(self): + self._agent.join() + # self._context.destroy(linger=1) + + @staticmethod + def __get_parent_task_priority() -> Optional[int]: + """If the client is running inside a Scaler processor, returns the priority of the associated task.""" + + current_processor = Processor.get_current_processor() + + if current_processor is None: + return None + + current_task = current_processor.current_task() + assert current_task is not None + + return retrieve_task_flags_from_task(current_task).priority diff --git a/scaler/client/future.py b/scaler/client/future.py new file mode 100644 index 0000000..8697c98 --- /dev/null +++ b/scaler/client/future.py @@ -0,0 +1,173 @@ +import threading +from concurrent.futures import Future, InvalidStateError +from typing import Any, Callable, Optional + +from scaler.io.sync_connector import SyncConnector +from scaler.protocol.python.message import ObjectRequest, Task, TaskCancel +from scaler.utility.event_list import EventList +from scaler.utility.metadata.profile_result import ProfileResult + + +class ScalerFuture(Future): + def __init__(self, task: Task, is_delayed: bool, group_task_id: Optional[bytes], connector: SyncConnector): + super().__init__() + + self._waiters = EventList(self._waiters) # type: ignore[assignment] + self._waiters.add_update_callback(self._on_waiters_updated) # type: ignore[attr-defined] + + self._task_id: bytes = task.task_id + self._is_delayed: bool = is_delayed + self._group_task_id: Optional[bytes] = group_task_id + self._connector: SyncConnector = connector + + self._result_object_id: Optional[bytes] = None + self._result_ready_event = threading.Event() + self._result_request_sent = False + self._result_received = False + + self._profiling_info: Optional[ProfileResult] = None + + @property + def task_id(self): + return self._task_id + + def profiling_info(self) -> ProfileResult: + with self._condition: # type: ignore[attr-defined] + if self._profiling_info is None: + raise ValueError(f"didn't receive profiling info for {self} yet") + + return self._profiling_info + + def set_result_ready(self, object_id: Optional[bytes], profile_result: Optional[ProfileResult] = None) -> None: + with self._condition: # type: ignore[attr-defined] + if self.done(): + raise InvalidStateError(f"invalid future state: {self._state}") + + self._state = "FINISHED" + + if object_id is not None: + self._result_object_id = object_id + + if profile_result is not None: + self._profiling_info = profile_result + + # if it's not delayed future, or if there is any listener (waiter or callback), get the result immediately + if not self._is_delayed or self._has_result_listeners(): + self._request_result_object() + + self._result_ready_event.set() + + def _set_result_or_exception( + self, + result: Optional[Any] = None, + exception: Optional[BaseException] = None, + profiling_info: Optional[ProfileResult] = None + ) -> None: + with self._condition: # type: ignore[attr-defined] + if self.cancelled(): + raise InvalidStateError(f"invalid future state: {self._state}") + + if self._result_received: + raise InvalidStateError("future already received object data.") + + if profiling_info is not None: + if self._profiling_info is not None: + raise InvalidStateError("cannot set profiling info twice.") + + self._profiling_info = profiling_info + + self._state = "FINISHED" + self._result_received = True + + if exception is not None: + assert result is None + self._exception = exception + for waiter in self._waiters: + waiter.add_exception(self) + else: + self._result = result + for waiter in self._waiters: + waiter.add_result(self) + + self._result_ready_event.set() + self._condition.notify_all() + + self._invoke_callbacks() # type: ignore[attr-defined] + + def set_result(self, result: Any, profiling_info: Optional[ProfileResult] = None) -> None: + self._set_result_or_exception(result=result, profiling_info=profiling_info) + + def set_exception(self, exception: Optional[BaseException], profiling_info: Optional[ProfileResult] = None) -> None: + self._set_result_or_exception(exception=exception, profiling_info=profiling_info) + + def result(self, timeout: Optional[float] = None) -> Any: + self._result_ready_event.wait(timeout) + + with self._condition: # type: ignore[attr-defined] + # if it's delayed future, get the result when future.result() gets called + if self._is_delayed: + self._request_result_object() + + if not self._result_received: + self._condition.wait(timeout) + + return super().result() + + def exception(self, timeout: Optional[float] = None) -> Optional[BaseException]: + self._result_ready_event.wait(timeout) + + with self._condition: # type: ignore[attr-defined] + # if it's delayed future, get the result when future.exception() gets called + if self._is_delayed: + self._request_result_object() + + if not self._result_received: + self._condition.wait(timeout) + + return super().exception() + + def cancel(self) -> bool: + with self._condition: # type: ignore[attr-defined] + if self.cancelled(): + return True + + if self.done(): + return False + + if self._group_task_id is not None: + self._connector.send(TaskCancel.new_msg(self._group_task_id)) + else: + self._connector.send(TaskCancel.new_msg(self._task_id)) + + self._state = "CANCELLED" + self._result_received = True + + self._result_ready_event.set() + self._condition.notify_all() # type: ignore[attr-defined] + + self._invoke_callbacks() # type: ignore[attr-defined] + return True + + def add_done_callback(self, fn: Callable[[Future], Any]) -> None: + with self._condition: # type: ignore[attr-defined] + # if it's delayed future, get the result when a callback gets added + if self._is_delayed: + self._request_result_object() + + return super().add_done_callback(fn) + + def _on_waiters_updated(self, waiters: EventList): + with self._condition: # type: ignore[attr-defined] + # if it's delayed future, get the result when waiter gets added + if self._is_delayed and len(self._waiters) > 0: + self._request_result_object() + + def _has_result_listeners(self) -> bool: + return len(self._done_callbacks) > 0 or len(self._waiters) > 0 # type: ignore[attr-defined] + + def _request_result_object(self): + if self._result_request_sent or self._result_object_id is None or self.cancelled(): + return + + self._connector.send(ObjectRequest.new_msg(ObjectRequest.ObjectRequestType.Get, (self._result_object_id,))) + self._result_request_sent = True diff --git a/scaler/client/object_buffer.py b/scaler/client/object_buffer.py new file mode 100644 index 0000000..885c8cc --- /dev/null +++ b/scaler/client/object_buffer.py @@ -0,0 +1,103 @@ +import dataclasses +import pickle +from typing import Any, Callable, List, Optional, Set + +import cloudpickle + +from scaler.client.serializer.mixins import Serializer +from scaler.io.sync_connector import SyncConnector +from scaler.io.utility import chunk_to_list_of_bytes +from scaler.protocol.python.common import ObjectContent +from scaler.protocol.python.message import ObjectInstruction +from scaler.utility.object_utility import generate_object_id, generate_serializer_object_id + + +@dataclasses.dataclass +class ObjectCache: + object_id: bytes + object_name: bytes + object_bytes: List[bytes] + + +class ObjectBuffer: + def __init__(self, identity: bytes, serializer: Serializer, connector: SyncConnector): + self._identity = identity + self._serializer = serializer + self._connector = connector + + self._pending_objects: List[ObjectCache] = list() + self._pending_delete_objects: Set[bytes] = set() + + def buffer_send_serializer(self) -> ObjectCache: + serializer_cache = self.__construct_serializer() + + self._pending_objects.append(serializer_cache) + return serializer_cache + + def buffer_send_function(self, fn: Callable) -> ObjectCache: + function_cache = self.__construct_function(fn) + + self._pending_objects.append(function_cache) + return function_cache + + def buffer_send_object(self, obj: Any, name: Optional[str] = None) -> ObjectCache: + object_cache = self.__construct_object(obj, name) + + self._pending_objects.append(object_cache) + return object_cache + + def buffer_delete_object(self, object_ids: Set[bytes]): + self._pending_delete_objects.update(object_ids) + + def commit_send_objects(self): + if not self._pending_objects: + return + + objects_to_send = [ + (obj_cache.object_id, obj_cache.object_name, obj_cache.object_bytes) for obj_cache in self._pending_objects + ] + + self._connector.send( + ObjectInstruction.new_msg( + ObjectInstruction.ObjectInstructionType.Create, + self._identity, + ObjectContent.new_msg(*zip(*objects_to_send)), + ) + ) + + self._pending_objects = list() + + def commit_delete_objects(self): + if not self._pending_delete_objects: + return + + self._connector.send( + ObjectInstruction.new_msg( + ObjectInstruction.ObjectInstructionType.Delete, + self._identity, + ObjectContent.new_msg(tuple(self._pending_delete_objects)), + ) + ) + + self._pending_delete_objects.clear() + + def __construct_serializer(self) -> ObjectCache: + serializer_bytes = cloudpickle.dumps(self._serializer, protocol=pickle.HIGHEST_PROTOCOL) + object_id = generate_serializer_object_id(self._identity) + return ObjectCache(object_id, b"serializer", chunk_to_list_of_bytes(serializer_bytes)) + + def __construct_function(self, fn: Callable) -> ObjectCache: + function_bytes = self._serializer.serialize(fn) + object_id = generate_object_id(self._identity, function_bytes) + function_cache = ObjectCache( + object_id, + getattr(fn, "__name__", f"").encode(), + chunk_to_list_of_bytes(function_bytes), + ) + return function_cache + + def __construct_object(self, obj: Any, name: Optional[str] = None) -> ObjectCache: + object_payload = self._serializer.serialize(obj) + object_id = generate_object_id(self._identity, object_payload) + name_bytes = name.encode() if name else f"".encode() + return ObjectCache(object_id, name_bytes, chunk_to_list_of_bytes(object_payload)) diff --git a/scaler/client/object_reference.py b/scaler/client/object_reference.py new file mode 100644 index 0000000..ed95195 --- /dev/null +++ b/scaler/client/object_reference.py @@ -0,0 +1,23 @@ +import dataclasses + + +@dataclasses.dataclass +class ObjectReference: + name: bytes + object_id: bytes + size: int + + def __repr__(self): + return f"ScalerReference(name={self.name!r}, id={self.object_id!r}, size={self.size})" + + def __hash__(self): + return hash(self.object_id) + + def __eq__(self, other: object) -> bool: + if not isinstance(other, ObjectReference): + return NotImplemented + + return self.object_id == other.object_id + + def __ne__(self, other): + return not self.__eq__(other) diff --git a/scaler/client/serializer/__init__.py b/scaler/client/serializer/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/scaler/client/serializer/__pycache__/__init__.cpython-311.pyc b/scaler/client/serializer/__pycache__/__init__.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..695b55bf4af03a26eb6c630e4b65c08791cfc284 GIT binary patch literal 188 zcmZ3^%ge<81fG0R=^*+sh=2h`DC095kTIPhg&~+hlhJP_LlF~@{~09t%U?euKQ~oB zJtwt1vsgbTGcUb7F*Ck0Gd?XfFFrj#FTJWXU%xmxF(#EpxuBRINPJ*sWMurn03(W+fnoqT1TXmj literal 0 HcmV?d00001 diff --git a/scaler/client/serializer/__pycache__/default.cpython-311.pyc b/scaler/client/serializer/__pycache__/default.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..5ccdd1d910f207df05b1fe78b0db28228ddcf262 GIT binary patch literal 1259 zcmZ`%yKmD#7{Bu?Y1-6%2#~0NuFjBbObCf*T7*(W%VHr}uJ4*Uob7P7DTx@0)IWf& z9Xkb~!vB&=87fbe5CdDPGIioRJ9Se9KHq(>-#xzX=lfbNmk`M6tl9jG5&9{DOHoJ8 z`3rFN5kUkqWC|-W>`A7Cvz%siumNgzAVWdx)r1?a2ro!OXXt&}J*5ZeQNGXA09U9A zxB|F3fftAdMHG_xr*zAXS#))IA_tqTMB_Ayx$giSxhUX?HqIY|+DFkC*2?`)C=%;N z(#qTZj(ZYR2s0D7T@u|F+dPN@Ct!w>Ogk)yN!xYaF`B3(_S#{hjl#K=)%wb_^$qLQ z>$Q!wCu=Va%nNW-C~jW9Xw}2er_#8ReJ8 zVJ`KfTA0&bBN-Rfb|;z2)7_;BimEv%-c7g!Y8U;|Zx8h4!^IyT2DRsXy?(6M2YS6< zte*pnl0w_=u)rqQ7!~ZKj8?$;KchY9@hE2)n8OW2;?v?-Rh$_D7Yh(&TyR|g(}d<# zcJEBKFb29P=i3Ym4i28QROh*SxNm=jV&L`W(A2di~=u%Nwlcbh8L7}kkNcE zOrK6Qdox%6pI1Hiqw9xUfqhv&;x%0Lcu{OE-c7#~bhCeb foT7#P{pY8eh?~wkRhn*s!LWaw=F_SO9eeNm%wE~8hOUv&7||OwP&>5 zoT9cTPTW!n4xEar^2ZdZhiI;xxNQ}<^u)70kCZ`pv(j!B*eO>YLHRE3Bn#=8L08FgZXBjV+4CHCAVh-69PL&ziKxT9XEZY&-+Y z7r7fk$5-R_3C{*=foBsu?f>!Y&?cnX%DUT(`y}x97|-glyPGvROHv+rmWhb~K0*@Z z(MK>Gpro>QJfTNc-y%PQc^BuOIUXlF3_}3sB{+$(yGWQAfYKLOJ}+Il1i@FeDVl184g$r0G(% z>jhLrA_H@z`!cE)O|c8dx+eN;WB=UBE^fuiUDu{j4Xnf(6_jhj{%n{!B>^eN)G9ArzO4(;7+cU0cg$=6lMPp6KoC!LTxwqy>;Caz`P5As#s@xjg{f$#(%WI5hmoZyt$n?X++@(%P9sMZ6asm9OA4xg(OaBpq9q)0{of%M5q zvQ{MtUxl5mem847PDDcHI9b-Igc(10$(ehKnT`wLydFZqYCA>Re@Jq*jbWm$))yRZHZ(b~)7 b|I6mb79@Lmc>4J-HYrl{ literal 0 HcmV?d00001 diff --git a/scaler/client/serializer/default.py b/scaler/client/serializer/default.py new file mode 100644 index 0000000..942a5e6 --- /dev/null +++ b/scaler/client/serializer/default.py @@ -0,0 +1,16 @@ +import pickle +from typing import Any + +import cloudpickle + +from scaler.client.serializer.mixins import Serializer + + +class DefaultSerializer(Serializer): + @staticmethod + def serialize(obj: Any) -> bytes: + return cloudpickle.dumps(obj, protocol=pickle.HIGHEST_PROTOCOL) + + @staticmethod + def deserialize(payload: bytes) -> Any: + return cloudpickle.loads(payload) diff --git a/scaler/client/serializer/mixins.py b/scaler/client/serializer/mixins.py new file mode 100644 index 0000000..4dbea79 --- /dev/null +++ b/scaler/client/serializer/mixins.py @@ -0,0 +1,38 @@ +import abc +from typing import Any + + +class Serializer(metaclass=abc.ABCMeta): + @staticmethod + @abc.abstractmethod + def serialize(obj: Any) -> bytes: + """ + Serialize the object to bytes, this serialization method is used to call for function object and EACH argument + object and function result object, for example: + + def add(a, b): + return a + b + + client.submit(add, 1, 2) + + The add function and the arguments 1 and 2 will be serialized and sent to the worker, and the result of the a+b + will be serialized and sent back to the client, client will use deserialize function below to deserialize + + :param obj: the object to be serialized, can be function object, argument object, or function result object + :return: serialized bytes of the object + """ + + raise NotImplementedError() + + @staticmethod + @abc.abstractmethod + def deserialize(payload: bytes) -> Any: + """ + Deserialize the bytes to the original object, this de-serialize method is used to deserialize the function + object bytes and EACH serialized argument and serialized function result. + + :param payload: the serialized bytes of the object, can be function object, argument object, or function result + object + :return: any deserialized object + """ + raise NotImplementedError() diff --git a/scaler/cluster/__init__.py b/scaler/cluster/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/scaler/cluster/__pycache__/__init__.cpython-311.pyc b/scaler/cluster/__pycache__/__init__.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..cef68aaf44f7985fd943657ed32541fb0b2346f4 GIT binary patch literal 178 zcmZ3^%ge<81fG0R=^*+sh=2h`DC095kTIPhg&~+hlhJP_LlF~@{~09t%T+%kKQ~oB zJtwt1vsgbTGcUb7F*Ck0Gd?XfFFrj#FTJWXU%xmxF(C%vKQO?EB4(f%01eA52><{9 literal 0 HcmV?d00001 diff --git a/scaler/cluster/__pycache__/cluster.cpython-311.pyc b/scaler/cluster/__pycache__/cluster.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..dccc37d6f44cf185719ec0faeb262bcd6edddfd1 GIT binary patch literal 5826 zcmbtY+i%;}89&sOk|oRcNVa1uPJB`9$aRt?ZFAYW+}GH<)Il3{8K;P}OqUY1LpqrS zXETNXvkL?3hI9$g2Jl0WwMYl_VShj$_Fl;#5Q0Df14DuBO@UKj$iuMjJCrCXcCuol z4u9wS&N)2i@O)S5&*5;8!1YyfBm0k5LjI0S?ebTN?F}IA5|N0ULQ;0kr8vgBQZ81z zQ*NkTiYMnyd2_y$FXvDBIUMU&_*@_rV6;aG=2}uMjP@#_TsRfxh>KhxqVF~l{VpPL z3$P3O68VQ5A&=m;uZ2jBdgz9Bxa}*|CUS3+MBtyu&LrHH=d!Hn7XPDyF01*pVtHp5 z3yPHBtdJ(@iv>YZvssA(?|Vn3?=#9jn<>00iZoN5lU03HX8S`R?h=XMJHz{Ol3R31 z9?>m%C11>WLi9kJ7j7TiezepXla!KjdRTPijmu%R8VZY zO;RmlJ77rc01S(rfURN|U_|VO_wBL#XOu-vm#F1W!`3BDv)XU67ZPMu(C4X?7BwqW zZOW%}l4kYJOKGZKm(sc*=i$*CX+_YajGBj$U3yx3U(n^8q%P`CYqto4=XW&6vuS!g zot1=)swh%sm+AU+D(8fplvC*v+l@A_Dxz?GNr!#(%%`a+6sVekZL3t!7PW$u7p