├── .python-version ├── benchmark_scheduler ├── __init__.py ├── user_config_reader.py └── benchmark_orchestrator.py ├── vlmhyperbench ├── system_dirs │ ├── cfg │ │ ├── .gitkeep │ │ ├── eval_run_requirements.txt │ │ ├── vlm_run_requirements.txt │ │ ├── BenchmarkRunConfig.json │ │ └── VLMHyperBench_config.json │ ├── wheels │ │ └── .gitkeep │ ├── model_cache │ │ └── .gitkeep │ └── bench_stages │ │ ├── run_eval.py │ │ └── run_vlm.py ├── data_dirs │ ├── Datasets │ │ ├── .gitkeep │ │ └── VQA │ │ │ └── demo_mini │ │ │ ├── images │ │ │ ├── 1.jpg │ │ │ ├── 2.jpg │ │ │ ├── 3.png │ │ │ └── 4.png │ │ │ └── annotation.csv │ ├── Reports │ │ └── .gitkeep │ ├── ModelsAnswers │ │ └── .gitkeep │ ├── ModelsMetrics │ │ └── .gitkeep │ ├── SystemPrompts │ │ └── .gitkeep │ └── PromptCollections │ │ ├── .gitkeep │ │ └── VQA │ │ └── demo_mini │ │ ├── JuliaJu_Qwen2-VL-2B_demo_mini_cer0.csv │ │ ├── JuliaJu_Qwen2_5-VL-7B_demo_mini_cer0.csv │ │ ├── JuliaJu_Qwen2-VL-7B_demo_mini_cer0.csv │ │ └── JuliaJu_Qwen2_5-VL-3B_demo_mini_008.csv └── vlm_base.csv ├── .env_example ├── repo_pics ├── stages_of_work.png ├── VLMHyperBench_logo.png ├── features_of_the_tool.png └── VLMHyperBench_development_team.jpg ├── run_benchmark.py ├── user_config_prompt_eval.csv ├── notebooks ├── user_config_2.csv └── testing_reading_the_user_config.ipynb ├── user_config_model_eval.csv ├── pyproject.toml ├── create_default_cfg.py ├── .gitignore ├── README.md └── uv.lock /.python-version: -------------------------------------------------------------------------------- 1 | 3.10 2 | -------------------------------------------------------------------------------- /benchmark_scheduler/__init__.py: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /vlmhyperbench/system_dirs/cfg/.gitkeep: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /vlmhyperbench/data_dirs/Datasets/.gitkeep: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /vlmhyperbench/data_dirs/Reports/.gitkeep: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /vlmhyperbench/system_dirs/wheels/.gitkeep: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /vlmhyperbench/data_dirs/ModelsAnswers/.gitkeep: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /vlmhyperbench/data_dirs/ModelsMetrics/.gitkeep: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /vlmhyperbench/data_dirs/SystemPrompts/.gitkeep: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /vlmhyperbench/system_dirs/model_cache/.gitkeep: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /vlmhyperbench/data_dirs/PromptCollections/.gitkeep: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /.env_example: -------------------------------------------------------------------------------- 1 | # Секреты пользователя 2 | HUGGING_FACE_TOKEN=your_token_here -------------------------------------------------------------------------------- /repo_pics/stages_of_work.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/VLMHyperBenchTeam/VLMHyperBench/HEAD/repo_pics/stages_of_work.png -------------------------------------------------------------------------------- /repo_pics/VLMHyperBench_logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/VLMHyperBenchTeam/VLMHyperBench/HEAD/repo_pics/VLMHyperBench_logo.png -------------------------------------------------------------------------------- /repo_pics/features_of_the_tool.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/VLMHyperBenchTeam/VLMHyperBench/HEAD/repo_pics/features_of_the_tool.png -------------------------------------------------------------------------------- /repo_pics/VLMHyperBench_development_team.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/VLMHyperBenchTeam/VLMHyperBench/HEAD/repo_pics/VLMHyperBench_development_team.jpg -------------------------------------------------------------------------------- /vlmhyperbench/data_dirs/Datasets/VQA/demo_mini/images/1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/VLMHyperBenchTeam/VLMHyperBench/HEAD/vlmhyperbench/data_dirs/Datasets/VQA/demo_mini/images/1.jpg -------------------------------------------------------------------------------- /vlmhyperbench/data_dirs/Datasets/VQA/demo_mini/images/2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/VLMHyperBenchTeam/VLMHyperBench/HEAD/vlmhyperbench/data_dirs/Datasets/VQA/demo_mini/images/2.jpg -------------------------------------------------------------------------------- /vlmhyperbench/data_dirs/Datasets/VQA/demo_mini/images/3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/VLMHyperBenchTeam/VLMHyperBench/HEAD/vlmhyperbench/data_dirs/Datasets/VQA/demo_mini/images/3.png -------------------------------------------------------------------------------- /vlmhyperbench/data_dirs/Datasets/VQA/demo_mini/images/4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/VLMHyperBenchTeam/VLMHyperBench/HEAD/vlmhyperbench/data_dirs/Datasets/VQA/demo_mini/images/4.png -------------------------------------------------------------------------------- /vlmhyperbench/system_dirs/cfg/eval_run_requirements.txt: -------------------------------------------------------------------------------- 1 | git+https://github.com/VLMHyperBenchTeam/benchmark_run_config.git@0.1.4 2 | git+https://github.com/VLMHyperBenchTeam/metric_evaluator.git@0.1.1 3 | git+https://github.com/VLMHyperBenchTeam/config_manager.git@0.1.2 -------------------------------------------------------------------------------- /vlmhyperbench/system_dirs/cfg/vlm_run_requirements.txt: -------------------------------------------------------------------------------- 1 | git+https://github.com/VLMHyperBenchTeam/benchmark_run_config.git@0.1.4 2 | git+https://github.com/VLMHyperBenchTeam/dataset_iterator.git@0.2.3 3 | git+https://github.com/VLMHyperBenchTeam/config_manager.git@0.1.2 -------------------------------------------------------------------------------- /run_benchmark.py: -------------------------------------------------------------------------------- 1 | from benchmark_scheduler.benchmark_orchestrator import BenchmarkOrchestrator 2 | 3 | if __name__ == "__main__": 4 | # Загрузка конфига из файла 5 | cfg_path = "vlmhyperbench/system_dirs/cfg/VLMHyperBench_config.json" 6 | 7 | eval_orchestrator = BenchmarkOrchestrator(cfg_path) 8 | eval_orchestrator.run_scheduler() -------------------------------------------------------------------------------- /user_config_prompt_eval.csv: -------------------------------------------------------------------------------- 1 | dataset;task;framework;model_name;system_prompt;prompt_collection;metrics;only_evaluate_metrics;metrics_aggregators;filter_doc_class;filter_question_type 2 | demo_mini;VQA;Hugging Face;Qwen2-VL-2B-Instruct;;demo_mini/JuliaJu_Qwen2-VL-2B_demo_mini_cer0.csv;['CER'];False;['by_id', 'by_doc_question', 'by_doc_type', 'general'];passport;Серия и номер паспорта 3 | -------------------------------------------------------------------------------- /notebooks/user_config_2.csv: -------------------------------------------------------------------------------- 1 | dataset;task;framework;model_name;system_prompt;prompt_collection;metrics;only_evaluate_metrics;metrics_aggregators;filter_doc_class;filter_question_type 2 | snils;VQA;Hugging Face;Qwen2.5-VL-3B;;AntonShiryaev.csv;['WER', 'CER', 'BLEU'];False;['by_id', 'by_doc_question', 'by_doc_type', 'general'];snils;Номер снилса 3 | idt_pdf_full_mini;VQA;Hugging Face;Qwen2-VL-2B;;AntonShiryaev.csv;['WER', 'CER', 'BLEU'];False;['by_id', 'by_doc_question', 'by_doc_type', 'general'];doc;Номер страницы 4 | -------------------------------------------------------------------------------- /user_config_model_eval.csv: -------------------------------------------------------------------------------- 1 | dataset;task;framework;model_name;system_prompt;prompt_collection;metrics;only_evaluate_metrics;metrics_aggregators;filter_doc_class;filter_question_type 2 | demo_mini;VQA;Hugging Face;Qwen2-VL-2B-Instruct;;demo_mini/JuliaJu_Qwen2-VL-2B_demo_mini_cer0.csv;['CER'];False;['by_id', 'by_doc_question', 'by_doc_type', 'general'];; 3 | demo_mini;VQA;Hugging Face;Qwen2.5-VL-3B-Instruct;;demo_mini/JuliaJu_Qwen2_5-VL-3B_demo_mini_008.csv;['CER'];False;['by_id', 'by_doc_question', 'by_doc_type', 'general'];; -------------------------------------------------------------------------------- /pyproject.toml: -------------------------------------------------------------------------------- 1 | [project] 2 | name = "vlmhyperbench" 3 | version = "0.1.3" 4 | description = "VLMHyperBench EvalKit" 5 | readme = "README.md" 6 | requires-python = ">=3.10" 7 | dependencies = [ 8 | "benchmark-run-config @ git+https://github.com/VLMHyperBenchTeam/benchmark_run_config.git@0.1.4", 9 | "config-manager @ git+https://github.com/VLMHyperBenchTeam/config_manager.git@0.1.2", 10 | "docker>=7.1.0", 11 | "ipykernel>=6.29.5", 12 | "pandas>=2.2.3", 13 | "python-dotenv>=1.1.0", 14 | "tqdm>=4.67.1", 15 | ] 16 | 17 | [tool.ruff] 18 | line-length = 88 -------------------------------------------------------------------------------- /create_default_cfg.py: -------------------------------------------------------------------------------- 1 | from config_manager.config_manager import ConfigManager 2 | 3 | if __name__ == "__main__": 4 | # Загрузка конфига из файла 5 | cfg_path = "vlmhyperbench/cfg/VLMHyperBench_config.json" 6 | 7 | # Создаем конфиг для VLMHyperBench по умолчанию 8 | config = ConfigManager(cfg_path, default=True) 9 | print(config.cfg) 10 | 11 | # Пример сохранения 12 | config.write_config() 13 | 14 | # Получим маппинг директорий для Docker-контейнера 15 | for host_path, container_path in config.volumes.items(): 16 | print(host_path, container_path) 17 | 18 | # Получим конфиг директорий для Docker-контейнера 19 | print(config.cfg_container) 20 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Игнорируем файлы, созданные Python 2 | __pycache__/ 3 | 4 | # Игнорируем файлы, созданные редакторами и IDE 5 | .vscode/ 6 | .idea/ 7 | 8 | # Игнорируем файлы, связанные с установкой и зависимостями 9 | dist/ 10 | 11 | # Игнорируем файлы, связанные с тестами и покрытием кода 12 | .coverage 13 | htmlcov/ 14 | .pytest_cache/ 15 | .coverage.* 16 | *.cover 17 | *.xml 18 | *.html 19 | 20 | # Игнорируем файлы, связанные с Jupyter Notebook 21 | .ipynb_checkpoints/ 22 | 23 | # Игнорируем файлы, связанные с конфигурацией и секретами 24 | *.env 25 | 26 | # Игнорируем файлы, связанные с логами 27 | *.log 28 | logs/ 29 | 30 | # Игнорируем python wheels 31 | *.whl 32 | 33 | # ignore all VLMHyperBench data_dirs 34 | vlmhyperbench/data_dirs 35 | 36 | # ignore all VLMHyperBench model_cache 37 | vlmhyperbench/system_dirs/model_cache 38 | 39 | # ignore all VLMHyperBench wheels 40 | vlmhyperbench/system_dirs/wheels -------------------------------------------------------------------------------- /vlmhyperbench/vlm_base.csv: -------------------------------------------------------------------------------- 1 | framework;model_family;model_name;docker_image;git_python_package;python_package;module;class_name 2 | Hugging Face;Qwen2.5-VL;Qwen2.5-VL-3B-Instruct;ghcr.io/vlmhyperbenchteam/qwen2.5-vl:ubuntu22.04-cu124-torch2.4.0_v0.1.0;git+https://github.com/VLMHyperBenchTeam/model_qwen2.5-vl.git@0.1.1;model_qwen2_5_vl;models;Qwen2_5_VLModel 3 | Hugging Face;Qwen2.5-VL;Qwen2.5-VL-7B-Instruct;ghcr.io/vlmhyperbenchteam/qwen2.5-vl:ubuntu22.04-cu124-torch2.4.0_v0.1.0;git+https://github.com/VLMHyperBenchTeam/model_qwen2.5-vl.git@0.1.1;model_qwen2_5_vl;models;Qwen2_5_VLModel 4 | Hugging Face;Qwen2-VL;Qwen2-VL-2B-Instruct;ghcr.io/vlmhyperbenchteam/qwen2-vl:ubuntu22.04-cu124-torch2.4.0_v0.1.0;git+https://github.com/VLMHyperBenchTeam/model_qwen2-vl.git@0.1.1;model_qwen2_vl;models;Qwen2VLModel 5 | Hugging Face;Qwen2-VL;Qwen2-VL-7B-Instruct;ghcr.io/vlmhyperbenchteam/qwen2-vl:ubuntu22.04-cu124-torch2.4.0_v0.1.0;git+https://github.com/VLMHyperBenchTeam/model_qwen2-vl.git@0.1.1;model_qwen2_vl;models;Qwen2VLModel 6 | -------------------------------------------------------------------------------- /vlmhyperbench/system_dirs/cfg/BenchmarkRunConfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "dataset": "demo_mini", 3 | "framework": "Hugging Face", 4 | "model_name": "Qwen2.5-VL-3B-Instruct", 5 | "model_family": "Qwen2.5-VL", 6 | "task_name": "VQA", 7 | "prompt_collection": "demo_mini/JuliaJu_Qwen2_5-VL-3B_demo_mini_008.csv", 8 | "docker_image": "ghcr.io/vlmhyperbenchteam/qwen2.5-vl:ubuntu22.04-cu124-torch2.4.0_v0.1.0", 9 | "git_python_package": "git+https://github.com/VLMHyperBenchTeam/model_qwen2.5-vl.git@0.1.1", 10 | "python_package": "model_qwen2_5_vl", 11 | "module": "models", 12 | "class_name": "Qwen2_5_VLModel", 13 | "system_prompt": null, 14 | "metrics": [ 15 | "CER" 16 | ], 17 | "only_evaluate_metrics": false, 18 | "metrics_aggregators": [ 19 | "by_id", 20 | "by_doc_question", 21 | "by_doc_type", 22 | "general" 23 | ], 24 | "filter_doc_class": null, 25 | "filter_question_type": null, 26 | "metric_file": "/workspace/data_dirs/model_answers/demo_mini_Hugging_Face_Qwen2.5-VL-3B-Instruct_VQA_answers_20250601_052520.csv" 27 | } -------------------------------------------------------------------------------- /vlmhyperbench/data_dirs/PromptCollections/VQA/demo_mini/JuliaJu_Qwen2-VL-2B_demo_mini_cer0.csv: -------------------------------------------------------------------------------- 1 | prompt;doc_class_question_type;cer 2 | Запиши четыре цифры серии паспорта и через пробел шесть цифр номера паспорта. Пример: 4369 975136.;passport Серия и номер паспорта;0.0 3 | Напиши Фамилия. Пример: Куликов.;passport Фамилия;0.0 4 | Напиши Имя. Пример: Арсен.;passport Имя;0.0 5 | Напиши Отчество. В ответе укажи только одно слово. Пример: Михайлович.;passport Отчество;0.0 6 | Напиши Дата рождения. Выйдай ответ в формате даты. Пример: 12.12.1975.;passport Дата рождения;0.0 7 | Какой Пол изображен на картинке муж. или жен.? Ответ укажи строго с маленькой буквы. Пример: муж., жен.;passport Пол;0.0 8 | Напиши Место рождения. Пример: Гор. Москва Московская обл.;passport Место рождения;0.0 9 | Напиши Номер счет-фактуры. Укажи только цифру. Пример: 632.;invoice Номер счет-фактуры;0.0 10 | Напиши Дату счет-фактуры. Пример: 22 января 1990.;invoice Дата счет-фактуры;0.0 11 | Напиши кто Продавец. Укажи только название. Пример: ПАО «Лимончик»;invoice Продавец;0.0 12 | Напиши кто Покупатель. Укажи только название. Пример: ИП Жуков;invoice Покупатель;0.0 -------------------------------------------------------------------------------- /vlmhyperbench/data_dirs/PromptCollections/VQA/demo_mini/JuliaJu_Qwen2_5-VL-7B_demo_mini_cer0.csv: -------------------------------------------------------------------------------- 1 | prompt;doc_class_question_type;cer 2 | Напиши поле Серия и поле Номер паспорта. В ответе укажи 4 цифры пробел 6 цифр. Пример: 4254 587326.;passport Серия и номер паспорта;0.0 3 | Напиши поле Фамилия. Пример: Куликов.;passport Фамилия;0.0 4 | Напиши поле Имя. Пример: Арсен.;passport Имя;0.0 5 | Напиши поле Отчество. Пример: Михайлович.;passport Отчество;0.0 6 | Напиши поле Дата рождения. Выйдай ответ в формате даты. Укажи только цифры. Пример: 12.12.1975.;passport Дата рождения;0.0 7 | Напиши поле Пол с маленькой буквы. Пример: муж.;passport Пол;0.0 8 | Напиши поле Место рождения. Пример: Гор. Москва Московсой обл.;passport Место рождения;0.0 9 | Напиши Номер счет-фактуры. Укажи только цифру. Пример: 632.;invoice Номер счет-фактуры;0.0 10 | Напиши Дату счет-фактуры. Выйдай ответ в формате даты. Следуй точно примеру. Пример: 22 января 1990;invoice Дата счет-фактуры;0.0 11 | Напиши кто Продавец. Укажи только название. Пример: ПАО «Лимончик»;invoice Продавец;0.0 12 | Напиши кто Покупатель. Укажи только название. Пример: ИП Жуков;invoice Покупатель;0.0 -------------------------------------------------------------------------------- /vlmhyperbench/data_dirs/PromptCollections/VQA/demo_mini/JuliaJu_Qwen2-VL-7B_demo_mini_cer0.csv: -------------------------------------------------------------------------------- 1 | prompt;doc_class_question_type;cer 2 | Напиши Серия (соедини четыре цифры вместе) и номер паспорта. Выдай ответ в формате ХХХХ ХХХХХХ. Следуй точно примеру. Пример: 4254 587326.;passport Серия и номер паспорта;0.0 3 | Напиши Фамилия. Пример: Куликов.;passport Фамилия;0.0 4 | Напиши Имя. Пример: Арсен.;passport Имя;0.0 5 | Напиши Отчество. В ответе укажи только одно слово. Пример: Михайлович.;passport Отчество;0.0 6 | Напиши Дата рождения. Выйдай ответ в формате даты. Следуй точно примеру. Пример: 12.12.1975.;passport Дата рождения;0.0 7 | Напиши Пол гражданина с маленькой буквы. Пример: муж., жен.;passport Пол;0.0 8 | Напиши Место рождения. Пример: Гор. Москва Московская обл.;passport Место рождения;0.0 9 | Напиши Номер счет-фактуры. Укажи только цифру. Пример: 632.;invoice Номер счет-фактуры;0.0 10 | Напиши Дату счет-фактуры. Выйдай ответ в формате даты. Следуй точно примеру. Пример: 22 января 1990;invoice Дата счет-фактуры;0.0 11 | Напиши кто Продавец. Укажи только название и никаких других слов. Пример: ПАО «Лимончик»;invoice Продавец;0.0 12 | Напиши кто Покупатель. Укажи только название и никаких других слов. Пример: ИП «Огурчик»;invoice Покупатель;0.0 -------------------------------------------------------------------------------- /vlmhyperbench/data_dirs/PromptCollections/VQA/demo_mini/JuliaJu_Qwen2_5-VL-3B_demo_mini_008.csv: -------------------------------------------------------------------------------- 1 | prompt;doc_class_question_type;cer 2 | Запиши четыре цифры серии паспорта и через пробел шесть цифр номера паспорта. Пример: 4369 975136.;passport Серия и номер паспорта;0.0 3 | Напиши Фамилия. Пример: Куликов.;passport Фамилия;0.0 4 | Напиши поле Имя в формате с первой заглавной буквой. Следуй строго примеру. Пример: Анна, Сергей.;passport Имя;0.0 5 | Какое Отчество у гражданина в паспорте? Если в ответе два слова, напиши второе. Пример: Сергеевна.;passport Отчество;0.0 6 | Напиши Дата рождения. Укажи только цифры. Пример: 12.12.1975.;passport Дата рождения;0.0 7 | Напиши поле Пол в нижнем регистре. Следуй точно примеру. Пример: муж., жен.;passport Пол;0.0 8 | Напиши Место рождения. Пример: Гор. Москва Московская обл.;passport Место рождения;0.0 9 | Напиши Номер счет-фактуры. Укажи только цифру. Пример: 632.;invoice Номер счет-фактуры;0.0 10 | Напиши Дату счет-фактуры. Выйдай ответ в формате даты. Следуй точно примеру. Пример: 22 января 1990;invoice Дата счет-фактуры;0.0 11 | Напиши кто Продавец. Укажи только название. Пример: РАО «Лимончик»;invoice Продавец;0.0 12 | Напиши кто Покупатель. Укажи только название. Пример: ЗАО «Огурчик»;invoice Покупатель;0.0 -------------------------------------------------------------------------------- /vlmhyperbench/system_dirs/cfg/VLMHyperBench_config.json: -------------------------------------------------------------------------------- 1 | { 2 | "user_config": "user_config_model_eval.csv", 3 | "vlm_base": "vlmhyperbench/vlm_base.csv", 4 | "data_dirs": { 5 | "datasets": "vlmhyperbench/data_dirs/Datasets", 6 | "model_answers": "vlmhyperbench/data_dirs/ModelsAnswers", 7 | "model_metrics": "vlmhyperbench/data_dirs/ModelsMetrics", 8 | "prompt_collections": "vlmhyperbench/data_dirs/PromptCollections", 9 | "system_prompts": "vlmhyperbench/data_dirs/SystemPrompts", 10 | "reports": "vlmhyperbench/data_dirs/Reports" 11 | }, 12 | "system_dirs": { 13 | "cfg": "vlmhyperbench/system_dirs/cfg", 14 | "bench_stages": "vlmhyperbench/system_dirs/bench_stages", 15 | "model_cache": "vlmhyperbench/system_dirs/model_cache", 16 | "wheels": "vlmhyperbench/system_dirs/wheels" 17 | }, 18 | "eval_docker_img": "ghcr.io/vlmhyperbenchteam/metric-evaluator:python3.10-slim_v0.1.0", 19 | "vlm_run_packages": "vlmhyperbench/system_dirs/cfg/vlm_run_requirements.txt", 20 | "eval_run_packages": "vlmhyperbench/system_dirs/cfg/eval_run_requirements.txt", 21 | "benchmark_run_cfg": "vlmhyperbench/system_dirs/cfg/BenchmarkRunConfig.json", 22 | "vlmhyperbench_cfg": "vlmhyperbench/system_dirs/cfg/VLMHyperBench_config.json" 23 | } -------------------------------------------------------------------------------- /vlmhyperbench/data_dirs/Datasets/VQA/demo_mini/annotation.csv: -------------------------------------------------------------------------------- 1 | data_index;split;image_path;question;answer;doc_class;question_type;answer_bbox 2 | 1;test_clean;images/1.jpg;Напиши Серия и номер паспорта;4 505 679 944;passport;Серия и номер паспорта;[1420, 280, 1470, 750] 3 | 1;test_clean;images/1.jpg;Напиши Фамилия;Карбаинов;passport;Фамилия;[780, 110, 1060, 170] 4 | 1;test_clean;images/1.jpg;Напиши Имя;Алексей;passport;Имя;[800, 270, 1010, 330] 5 | 1;test_clean;images/1.jpg;Напиши Отчество;Святославович;passport;Отчество;[700, 340, 1100, 410] 6 | 1;test_clean;images/1.jpg;Напиши Дата рождения;13.09.1985;passport;Дата рождения;[900, 430, 1160, 490] 7 | 1;test_clean;images/1.jpg;Напиши Пол;муж.;passport;Пол;[560, 430, 700, 500] 8 | 1;test_clean;images/1.jpg;Напиши Место рождения;Гор. Чердаклы Чердаклинского района Ульяновской области;passport;Место рождения;[600, 510, 1220, 730] 9 | 2;test_clean;images/2.jpg;Напиши Серия и номер паспорта;3 301 623 792;passport;Серия и номер паспорта;[1420, 380, 1470, 750] 10 | 2;test_clean;images/2.jpg;Напиши Фамилия;Беленкова;passport;Фамилия;[780, 110, 1060, 170] 11 | 2;test_clean;images/2.jpg;Напиши Имя;Христина;passport;Имя;[780, 270, 1040, 330] 12 | 2;test_clean;images/2.jpg;Напиши Отчество;Несторовна;passport;Отчество;[700, 340, 1100, 410] 13 | 2;test_clean;images/2.jpg;Напиши Дата рождения;05.01.1981;passport;Дата рождения;[900, 430, 1160, 490] 14 | 2;test_clean;images/2.jpg;Напиши Пол;жен.;passport;Пол;[560, 430, 700, 500] 15 | 2;test_clean;images/2.jpg;Напиши Место рождения;Гор. Белая Холуница Кировской обл.;passport;Место рождения;[600, 510, 1220, 650] 16 | 3;test_clean;images/3.png;Напиши Номер счет-фактуры;44;invoice;Номер счет-фактуры;[1200, 360, 1250, 400] 17 | 3;test_clean;images/3.png;Напиши Дату счет-фактуры;28 сентября 2010;invoice;Дата счет-фактуры;[1500, 360, 2300, 400] 18 | 3;test_clean;images/3.png;Напиши кто Продавец;Татэнерго;invoice;Продавец;[700, 470, 1150, 520] 19 | 3;test_clean;images/3.png;Напиши кто Покупатель;РАО «Шашков-Меркушев»;invoice;Покупатель;[700, 820, 1500, 870] 20 | 4;test_clean;images/4.png;Напиши Номер счет-фактуры;89;invoice;Номер счет-фактуры;[1200, 360, 1250, 400] 21 | 4;test_clean;images/4.png;Напиши Дату счет-фактуры;12 февраля 2025;invoice;Дата счет-фактуры;[1500, 360, 2300, 400] 22 | 4;test_clean;images/4.png;Напиши кто Продавец;Группа М.Видео-Эльдорадо;invoice;Продавец;[700, 470, 1150, 520] 23 | 4;test_clean;images/4.png;Напиши кто Покупатель;НПО «Зуев, Фадеев и Рогова»;invoice;Покупатель;[700, 820, 1500, 870] 24 | -------------------------------------------------------------------------------- /vlmhyperbench/system_dirs/bench_stages/run_eval.py: -------------------------------------------------------------------------------- 1 | import os 2 | 3 | from benchmark_run_config.benchmark_run_config import BenchmarkRunConfig 4 | from metric_evaluator.metric_evaluator import MetricEvaluator 5 | from config_manager.config_manager import ConfigManager 6 | 7 | 8 | def run_vlm_eval_greet(config, model_class_path): 9 | print("\n" * 2) 10 | print("#" * 80) 11 | print("Оценка модели:") 12 | print(f"dataset: {config.dataset}\n") 13 | print(f"framework: {config.framework}") 14 | print(f"model_name: {config.model_name}") 15 | print(f"model_family: {config.model_family}\n") 16 | print(f"docker_image: {config.docker_image}") 17 | print(f"model_class_path: {model_class_path}\n") 18 | print(f"task_name: {config.task_name}") 19 | print(f"system_prompt: {config.system_prompt}") 20 | print(f"prompt_collection: {config.prompt_collection}") 21 | print(f"metrics: {config.metrics}") 22 | print(f"metrics_aggregators: {config.metrics_aggregators}") 23 | print(f"filter_doc_class: {config.filter_doc_class}") 24 | print(f"filter_question_type: {config.filter_question_type}") 25 | print("#" * 80) 26 | print("\n" * 2) 27 | 28 | 29 | if __name__ == "__main__": 30 | # Получаем конфиг с всеми путями в Docker-контейнере 31 | cfg_path = os.getenv("VLMHYPERBENCH_CONFIG_PATH") 32 | cfg_container = ConfigManager(cfg_path).cfg_container 33 | 34 | # Получаем конфиг со всеми параметрами прогона 35 | run_config = BenchmarkRunConfig.from_json(cfg_container["benchmark_run_cfg"]) 36 | 37 | # Инфо о том где взять класс для семейства моделей 38 | model_class_path = f"{run_config.python_package}.{run_config.module}:{run_config.class_name}" 39 | 40 | run_vlm_eval_greet(run_config, model_class_path) 41 | 42 | dataset_annot = os.path.join( 43 | cfg_container["data_dirs"]["datasets"], run_config.task_name, run_config.dataset, "annotation.csv" 44 | ) 45 | 46 | # Получаем название файла метрик 47 | model_answers = run_config.metric_file 48 | filename_from_metric = os.path.split(model_answers)[-1] 49 | filename_from_metric = os.path.splitext(filename_from_metric)[0] 50 | 51 | metric_eval = MetricEvaluator(dataset_annot, model_answers) 52 | 53 | # Производим расчет метрик по всем агрегаторам 54 | for metrics_aggregator in run_config.metrics_aggregators: 55 | metric_csv_path = os.path.join( 56 | cfg_container["data_dirs"]["model_metrics"], f"{filename_from_metric}_{metrics_aggregator}.csv" 57 | ) 58 | metric_eval.save_function_results( 59 | csv_path=metric_csv_path, 60 | func_name=metrics_aggregator, 61 | metrics=run_config.metrics, 62 | ) 63 | -------------------------------------------------------------------------------- /vlmhyperbench/system_dirs/bench_stages/run_vlm.py: -------------------------------------------------------------------------------- 1 | import os 2 | 3 | from benchmark_run_config.benchmark_run_config import BenchmarkRunConfig 4 | from config_manager.config_manager import ConfigManager 5 | from dataset_iterator.fabrics import IteratorFabric 6 | from model_interface.model_factory import ModelFactory 7 | 8 | 9 | def run_vlm_stage_greet(config, model_class_path): 10 | print("\n" * 2) 11 | print("#" * 80) 12 | print("Запуск модели:") 13 | print(f"dataset: {config.dataset}\n") 14 | print(f"framework: {config.framework}") 15 | print(f"model_name: {config.model_name}") 16 | print(f"model_family: {config.model_family}\n") 17 | print(f"docker_image: {config.docker_image}") 18 | print(f"model_class_path: {model_class_path}\n") 19 | print(f"task_name: {config.task_name}") 20 | print(f"system_prompt: {config.system_prompt}") 21 | print(f"prompt_collection: {config.prompt_collection}") 22 | print("#" * 80) 23 | print("\n" * 2) 24 | 25 | 26 | if __name__ == "__main__": 27 | # Получаем конфиг с всеми путями в Docker-контейнере 28 | cfg_path = os.getenv("VLMHYPERBENCH_CONFIG_PATH") 29 | cfg_container = ConfigManager(cfg_path).cfg_container 30 | 31 | # Получаем конфиг со всеми параметрами прогона 32 | run_config = BenchmarkRunConfig.from_json(cfg_container["benchmark_run_cfg"]) 33 | 34 | # Инфо о том где взять класс для семейства моделей 35 | model_class_path = ( 36 | f"{run_config.python_package}.{run_config.module}:{run_config.class_name}" 37 | ) 38 | 39 | # Регистрация модели в фабрике 40 | ModelFactory.register_model(run_config.model_family, model_class_path) 41 | 42 | # TODO: Получаем системный промпт 43 | # system_prompt_adapter = ... 44 | 45 | # параметры модели - передаем системный промпт, если доступен 46 | model_init_params = { 47 | "model_name": run_config.model_name, 48 | "system_prompt": "", 49 | "cache_dir": cfg_container["system_dirs"]["model_cache"], 50 | } 51 | 52 | run_vlm_stage_greet(run_config, model_class_path) 53 | 54 | model = ModelFactory.get_model(run_config.model_family, model_init_params) 55 | 56 | # Совершаем прогон модели по датасету 57 | dataset_dir_path = os.path.join( 58 | cfg_container["data_dirs"]["datasets"], run_config.task_name, run_config.dataset 59 | ) 60 | 61 | prompt_collection_dir_path = os.path.join( 62 | cfg_container["data_dirs"]["prompt_collections"], run_config.task_name 63 | ) 64 | print(dataset_dir_path) 65 | print(prompt_collection_dir_path) 66 | 67 | iterator = IteratorFabric.get_dataset_iterator( 68 | task_name=run_config.task_name, 69 | dataset_name=run_config.dataset, 70 | filter_doc_class=run_config.filter_doc_class, 71 | filter_question_type=run_config.filter_question_type, 72 | dataset_dir_path=dataset_dir_path, 73 | prompt_collection_filename=run_config.prompt_collection, 74 | prompt_dir=prompt_collection_dir_path, 75 | ) 76 | 77 | runner = IteratorFabric.get_runner( 78 | iterator, model, answers_dir_path=cfg_container["data_dirs"]["model_answers"] 79 | ) 80 | runner.run() 81 | 82 | metric_file_path = runner.save_answers() 83 | 84 | # Сохраняем результаты в BenchmarkRunConfig.json 85 | run_config.metric_file = metric_file_path 86 | run_config.to_json(cfg_container["benchmark_run_cfg"]) 87 | -------------------------------------------------------------------------------- /benchmark_scheduler/user_config_reader.py: -------------------------------------------------------------------------------- 1 | import ast 2 | from typing import List 3 | 4 | import numpy as np 5 | import pandas as pd 6 | from benchmark_run_config.benchmark_run_config import BenchmarkRunConfig 7 | 8 | 9 | class UserConfigReader: 10 | """ 11 | Класс для считывания параметров `Evaluation run` указанных в `user_config.csv`. 12 | Дополняет конфигурацию "пробега модели по датасету" параметрами из Базы VLM. 13 | 14 | Attributes: 15 | cfg_df (pd.DataFrame): DataFrame с данными из пользовательской конфигурации. 16 | vlm_df (pd.DataFrame): DataFrame с параметрами из Базы VLM. 17 | """ 18 | 19 | def __init__( 20 | self, config_path: str, vlm_base_path: str = "vlmhyperbench/vlm_base.csv" 21 | ) -> None: 22 | """ 23 | Инициализирует объект UserConfigReader. 24 | 25 | Args: 26 | config_path (str): Путь к файлу пользовательской конфигурации (user_config.csv). 27 | vlm_base_path (str): Путь к файлу Базы VLM. Defaults to "vlmhyperbench/vlm_base.csv". 28 | """ 29 | self.cfg_df = self.load_user_config(config_path) 30 | self.vlm_df = self.load_vlm_base(vlm_base_path) 31 | 32 | @staticmethod 33 | def load_user_config(config_path: str) -> pd.DataFrame: 34 | """ 35 | Загружает пользовательскую конфигурацию (user_config.csv) из CSV-файла. 36 | 37 | Args: 38 | config_path (str): Путь к файлу пользовательской конфигурации. 39 | 40 | Returns: 41 | pd.DataFrame: DataFrame с данными из пользовательской конфигурации. 42 | """ 43 | try: 44 | df_cfg = pd.read_csv(config_path, sep=";", encoding="utf-8-sig") 45 | df_cfg["metrics"] = df_cfg["metrics"].apply(ast.literal_eval) 46 | df_cfg["metrics_aggregators"] = df_cfg["metrics_aggregators"].apply( 47 | ast.literal_eval 48 | ) 49 | df_cfg.replace({np.nan: None}, inplace=True) 50 | return df_cfg 51 | 52 | except Exception as e: 53 | print(f"Error loading user config: {e}") 54 | return pd.DataFrame() 55 | 56 | @staticmethod 57 | def load_vlm_base(vlm_base_path: str) -> pd.DataFrame: 58 | """ 59 | Загружает параметры VLM из Базы VLM в виде csv-файла. 60 | 61 | Args: 62 | vlm_base_path (str): Путь к файлу Базы VLM. 63 | 64 | Returns: 65 | pd.DataFrame: DataFrame с параметрами из Базы VLM. 66 | """ 67 | try: 68 | df_vlm_base = pd.read_csv(vlm_base_path, sep=";", encoding="utf-8-sig") 69 | df_vlm_base.replace({np.nan: None}, inplace=True) 70 | return df_vlm_base 71 | 72 | except Exception as e: 73 | print(f"Error loading VLM base: {e}") 74 | return pd.DataFrame() 75 | 76 | def read_user_config(self) -> List[BenchmarkRunConfig]: 77 | """ 78 | Читает пользовательскую конфигурацию и создаёт список конфигураций для запуска бенчмарков. 79 | 80 | Returns: 81 | List[BenchmarkRunConfig]: Список из BenchmarkRunConfig. 82 | """ 83 | bench_run_cfgs = [] 84 | 85 | for row in self.cfg_df.itertuples(): 86 | row_dict = row._asdict() 87 | 88 | # Чтение параметров из vlm_base.csv 89 | vlm_params = self.vlm_df[ 90 | (self.vlm_df["framework"] == row_dict["framework"]) 91 | & (self.vlm_df["model_name"] == row_dict["model_name"]) 92 | ].to_dict(orient="records")[0] 93 | 94 | bench_run_cfg = BenchmarkRunConfig( 95 | # Устанавливаем параметры из user_config.csv 96 | dataset=row_dict["dataset"], 97 | framework=row_dict["framework"], 98 | model_name=row_dict["model_name"], 99 | task_name=row_dict["task"], 100 | system_prompt=row_dict["system_prompt"], 101 | prompt_collection=row_dict["prompt_collection"], 102 | metrics=row_dict["metrics"], 103 | only_evaluate_metrics=row_dict["only_evaluate_metrics"], 104 | metrics_aggregators=row_dict["metrics_aggregators"], 105 | filter_doc_class=row_dict["filter_doc_class"], 106 | filter_question_type=row_dict["filter_question_type"], 107 | # Устанавливаем параметры из vlm_base.csv 108 | model_family=vlm_params["model_family"], 109 | docker_image=vlm_params["docker_image"], 110 | git_python_package=vlm_params["git_python_package"], 111 | python_package=vlm_params["python_package"], 112 | module=vlm_params["module"], 113 | class_name=vlm_params["class_name"], 114 | ) 115 | 116 | bench_run_cfgs.append(bench_run_cfg) 117 | 118 | return bench_run_cfgs 119 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Проект VLMHyperBench 2 | 3 | ![VLMHyperBench_logo](repo_pics/VLMHyperBench_logo.png) 4 | 5 | `VLMHyperBench` — open-source фреймворк для оценки возможностей `Vision language models (VLM)` распознавать документы на русском языке с целью оценки их потенциала для автоматизации документооборота. 6 | 7 | ## Цели проекта 8 | 1. Дать исследователям удобный инструмент для оценки VLM. 9 | 2. Дать инженерам удобный инструмент для оценки VLM, запускаемых в `production` на таких фреймворках инференса как `vLLM` и `SGLang`. 10 | 3. Упростить и ускорить внедрение самых передовых технологий из мира `Deep Learning` в контуры компаний. 11 | 12 | ## Актуальность 13 | Сейчас для обработки каждого нового документа со своей структурой разрабатываются специальные решения с использованием подходов `Optical character recognition (OCR)`. 14 | 15 | Используя `VLM`, можно заменить разработку нового узкоспециализированного решения под новую структуру документа на подбор подходящего промпта для извлечения нужных данных из сканов документов. 16 | 17 | В настоящее время область мультимодальных моделей интенсивно развивается: появляются новые модели и фреймворки для их инференса, — в связи с чем инструменты, позволяющие объективно сравнивать модели по метрикам, потребляемым ресурсам и скорости инференса на наборах данных компаний/исследователей, востребованы как никогда. 18 | 19 | ## Ключевые особенности 20 | Разрабатываемый фреймворк `VLMHyperBench` позволяет запускать каждую VLM в своем собственном изолированном окружении (сейчас изоляция осуществляется с помощью `Docker-контейнеров`). 21 | 22 | ![features_of_the_tool](repo_pics/features_of_the_tool.png) 23 | 24 | ### Фреймворк позволяет 25 | * Сравнивать между собой модели несовместимые по зависимостям. 26 | * Сравнивать модели, запускаемые на разных фреймворках инференса (`Hugging Face`, `vLLM`, `SGLang`). 27 | * Автоматизировать тестирование `Docker-контейнеров` с VLM в CI/CD-пайплайнах компаний. 28 | * Оценивать подбираемые промпты для каждого отдельного типа документа и каждого отдельного поля документа. 29 | * Использовать разные коллекции промптов и системных промптов, подобранных индивидуально для каждой модели на одном и том же датасете, благодаря компонентам `PromptAdapter` и `TXTPromptAdapter` ([ссылка](https://github.com/VLMHyperBenchTeam/prompt_adapter)). 30 | 31 | ### Особенности 32 | * Является `open-source` инструментом, рассчитанным на исследователей и инженеров (с лицензией разрешающей коммерческое использование). 33 | * Обладает модульной архитектурой для легкого добавления дополнительных наборов данных, моделей, метрик и визуализаций результатов оценки. 34 | * Модульность: 35 | 36 | 1. Все компоненты — это `python-пакеты`. 37 | 38 | Мы хотим, чтобы Вы могли использовать их в Ваших проектах, связанных с VLM, независимо от нашего основного проекта. 39 | 40 | 2. Docker-контейнеры `VLMHyperBench` также опубликованы и доступны для свободного скачивания и использования в Ваших проектах. 41 | 42 | ## Материалы по проекту 43 | * Сайт с документаций проекта ([ссылка](https://vlmhyperbenchteam.github.io/VLMHyperBenchDocs/)) 44 | * GitHub организации VLMHyperBenchTeam ([ссылка](https://github.com/orgs/VLMHyperBenchTeam/repositories)) 45 | * Container registry с нашими Docker-образами VLMHyperBenchTeam ([ссылка](https://github.com/orgs/VLMHyperBenchTeam/packages)) 46 | 47 | ## Этапы работы VLMHyperBench 48 | Процесс оценки моделей состоит из 4-х этапов: 49 | 50 | ![stages_of_work.png](repo_pics/stages_of_work.png) 51 | 52 | ### 0. Этап "Подготовка задач" 53 | 54 | На данном этапе пользователь формирует csv-файл (см. `user_config.csv`) со списком задач. 55 | 56 | Одна задача — один `Evaluation run`. 57 | 58 | Понятие `Evaluation run` включает в себя выбор: 59 | * датасета, на котором будет оцениваться модель; 60 | * фреймворка для инференса модели (`Hugging Face`, `vLLM`, `SGLang`); 61 | * модели VLM (например, `Qwen2.5-VL-3B`); 62 | * `коллекции промптов` для VLM (опционально); 63 | * `системного промпта` для VLM (опционально); 64 | * `ML-метрик`, которыми необходимо оценить ответы от VLM (опционально). 65 | 66 | Каждая строка csv-файла (см. `user_config.csv`) описывает все параметры для одного `Evaluation run`. 67 | 68 | ### 1. Этап "Планирование задач" 69 | 70 | ПО считывает из csv-файла от пользователя набор всех `Evaluation run`, которые далее распределяются по `исполнителям` каждого `Evaluation run`. 71 | 72 | Сейчас один `исполнитель` — это одна GPU в рамках одного ПК, на котором запускается `VLMHyperBench`. 73 | 74 | ### 2. Этап "Запуск VLM" 75 | 76 | Используя указанные параметры в `Evaluation run`, ПО: 77 | 78 | * скачивает из нашего `Container Registry` ([ссылка](https://github.com/orgs/VLMHyperBenchTeam/packages)) Docker-образ (с поддержкой вычислений на GPU) для выбранной VLM с настроенным внутри рабочим окружением для модели; 79 | * поднимает `Docker-контейнер` с VLM; 80 | * загружает указанный датасет; 81 | * загружает указанную `коллекцию промптов` для VLM; 82 | * загружает указанный `системный промпт` для VLM; 83 | * инициализирует VLM; 84 | * осуществляет итерирование по датасету; 85 | * сохраняет ответы модели в csv-файл. 86 | 87 | > [!NOTE] 88 | > 89 | > Данный этап опционален и может не выполняться, если требуется произвести только оценку ответов модели по новым метрикам. 90 | 91 | ### 3. Этап "Оценка метрик" 92 | 93 | Используя указанные параметры в `Evaluation run`, ПО: 94 | 95 | * скачивает из нашего `Container Registry` ([ссылка](https://github.com/orgs/VLMHyperBenchTeam/packages)) Docker-образ (с поддержкой вычислений на CPU) для нашего `MetricEvaluator` с настроенным внутри рабочим окружением; 96 | * считывает исходный датасет; 97 | * считывает ответы модели; 98 | * производит расчет указанных метрик; 99 | * сохраняет полученные метрики в csv-файл. 100 | 101 | > [!NOTE] 102 | > 103 | > Данный этап опционален и может не выполняться, если требуется получить только ответы от модели без расчета метрик. 104 | 105 | ### 4. Этап "Генерация отчета с диаграммами" (в разработке) 106 | 107 | Мы хотим формировать отчеты с важными для исследователей и инженеров: 108 | * ML-метриками; 109 | * параметрами работы моделей (время инференса, потребляемые ресурсы); 110 | * диаграммами. 111 | 112 | > [!NOTE] 113 | > 114 | > В настоящий момент мы собираем обратную связь о том, что должно войти в подобный отчет. 115 | 116 | В планах разработать отдельный модуль, который будет создавать эти отчеты по результатам, полученным на каждом `Evaluation run`. 117 | 118 | ## Планы на будущее 119 | 120 | * Добавить поддержку изоляции окружения для VLM на уровне `python venv`. 121 | 122 | 1. Изоляция окружения для VLM с помощью `Docker` требует `root` прав на его использование. Не везде есть такая возможность. 123 | 2. Хочется иметь возможность работы самого `VLMHyperBench` внутри `Docker-контейнера`. 124 | 125 | Многие облачные провайдеры предлагают запуск `Docker-контейнера` на своих облачных GPU. При этом возможность запуска `Docker-контейнеров in Docker` заблокирована по соображениям безопасности. 126 | 127 | Возможность использования изоляции окружения для запуска VLM на уровне `python venv` потенциально позволяет решить эти проблемы. 128 | 129 | * Добавить поддержку системы контейнеризации `Singularity` в качестве способа изоляции окружения моделей. 130 | 131 | `Singularity` популярна на GPU-кластерах IT-компаний и университетов. 132 | 133 | * Добавить поддержку работы с удаленными `pod` на `RunPod` ([ссылка](https://www.runpod.io/)) для запуска моделей. 134 | 135 | Данный облачный провайдер предлагает недорогую аренду облачных GPU. 136 | Мы надеемся, что данный кейс будет полезен небольшим исследовательским группам или инженерам небольших компаний и стартапов. 137 | 138 | # Разработчики 139 | 140 | * Ширяев Антон, [GitHub account](https://github.com/medphisiker) 141 | * Овчинникова Юлия, [GitHub account](https://github.com/YuliaOv22) 142 | * Лукин Семен, [GitHub account](https://github.com/ctpemho7) 143 | * Капустин Евгений, [GitHub account](https://github.com/EugenePWN) 144 | 145 | ![VLMHyperBench_development_team.png](repo_pics/VLMHyperBench_development_team.jpg) -------------------------------------------------------------------------------- /notebooks/testing_reading_the_user_config.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "code", 5 | "execution_count": 1, 6 | "metadata": {}, 7 | "outputs": [], 8 | "source": [ 9 | "import ast\n", 10 | "\n", 11 | "import pandas as pd" 12 | ] 13 | }, 14 | { 15 | "cell_type": "code", 16 | "execution_count": 2, 17 | "metadata": {}, 18 | "outputs": [], 19 | "source": [ 20 | "config_path = \"../user_config.csv\"\n", 21 | "\n", 22 | "df = pd.read_csv(config_path, sep=\";\", encoding=\"utf-8-sig\")" 23 | ] 24 | }, 25 | { 26 | "cell_type": "code", 27 | "execution_count": 3, 28 | "metadata": {}, 29 | "outputs": [ 30 | { 31 | "data": { 32 | "text/html": [ 33 | "
\n", 34 | "\n", 47 | "\n", 48 | " \n", 49 | " \n", 50 | " \n", 51 | " \n", 52 | " \n", 53 | " \n", 54 | " \n", 55 | " \n", 56 | " \n", 57 | " \n", 58 | " \n", 59 | " \n", 60 | " \n", 61 | " \n", 62 | " \n", 63 | " \n", 64 | " \n", 65 | " \n", 66 | " \n", 67 | " \n", 68 | " \n", 69 | " \n", 70 | " \n", 71 | " \n", 72 | " \n", 73 | " \n", 74 | " \n", 75 | " \n", 76 | " \n", 77 | " \n", 78 | " \n", 79 | " \n", 80 | " \n", 81 | " \n", 82 | " \n", 83 | " \n", 84 | " \n", 85 | " \n", 86 | " \n", 87 | " \n", 88 | " \n", 89 | " \n", 90 | " \n", 91 | " \n", 92 | " \n", 93 | " \n", 94 | "
datasettaskframeworkmodel_namesystem_promptprompt_collectionmetricsonly_evaluate_metricsmetrics_aggregatorsfilter_doc_classfilter_question_type
0snilsVQAHugging FaceQwen2.5-VL-3BNaNAntonShiryaev.csv['WER', 'CER', 'BLEU']False[\"by_id\", \"by_doc_question\", \"by_doc_type\", \"g...snilsНомер снилса
1idt_pdf_full_miniVQAHugging FaceQwen2-VL-2BNaNAntonShiryaev.csv['WER', 'CER', 'BLEU']False[\"by_id\", \"by_doc_question\", \"by_doc_type\", \"g...docНомер страницы
\n", 95 | "
" 96 | ], 97 | "text/plain": [ 98 | " dataset task framework model_name system_prompt \\\n", 99 | "0 snils VQA Hugging Face Qwen2.5-VL-3B NaN \n", 100 | "1 idt_pdf_full_mini VQA Hugging Face Qwen2-VL-2B NaN \n", 101 | "\n", 102 | " prompt_collection metrics only_evaluate_metrics \\\n", 103 | "0 AntonShiryaev.csv ['WER', 'CER', 'BLEU'] False \n", 104 | "1 AntonShiryaev.csv ['WER', 'CER', 'BLEU'] False \n", 105 | "\n", 106 | " metrics_aggregators filter_doc_class \\\n", 107 | "0 [\"by_id\", \"by_doc_question\", \"by_doc_type\", \"g... snils \n", 108 | "1 [\"by_id\", \"by_doc_question\", \"by_doc_type\", \"g... doc \n", 109 | "\n", 110 | " filter_question_type \n", 111 | "0 Номер снилса \n", 112 | "1 Номер страницы " 113 | ] 114 | }, 115 | "execution_count": 3, 116 | "metadata": {}, 117 | "output_type": "execute_result" 118 | } 119 | ], 120 | "source": [ 121 | "df" 122 | ] 123 | }, 124 | { 125 | "cell_type": "code", 126 | "execution_count": 4, 127 | "metadata": {}, 128 | "outputs": [ 129 | { 130 | "data": { 131 | "text/plain": [ 132 | "\"['WER', 'CER', 'BLEU']\"" 133 | ] 134 | }, 135 | "execution_count": 4, 136 | "metadata": {}, 137 | "output_type": "execute_result" 138 | } 139 | ], 140 | "source": [ 141 | "df['metrics'][0]" 142 | ] 143 | }, 144 | { 145 | "cell_type": "code", 146 | "execution_count": 5, 147 | "metadata": {}, 148 | "outputs": [ 149 | { 150 | "data": { 151 | "text/plain": [ 152 | "['WER', 'CER', 'BLEU']" 153 | ] 154 | }, 155 | "execution_count": 5, 156 | "metadata": {}, 157 | "output_type": "execute_result" 158 | } 159 | ], 160 | "source": [ 161 | "# Преобразование строки в список\n", 162 | "python_list = ast.literal_eval(df['metrics'][0])\n", 163 | "python_list" 164 | ] 165 | }, 166 | { 167 | "cell_type": "code", 168 | "execution_count": 6, 169 | "metadata": {}, 170 | "outputs": [], 171 | "source": [ 172 | "# Преобразование строк в списки\n", 173 | "df[\"metrics\"] = df[\"metrics\"].apply(ast.literal_eval)\n", 174 | "df[\"metrics_aggregators\"] = df[\"metrics_aggregators\"].apply(ast.literal_eval)" 175 | ] 176 | }, 177 | { 178 | "cell_type": "code", 179 | "execution_count": 7, 180 | "metadata": {}, 181 | "outputs": [ 182 | { 183 | "data": { 184 | "text/html": [ 185 | "
\n", 186 | "\n", 199 | "\n", 200 | " \n", 201 | " \n", 202 | " \n", 203 | " \n", 204 | " \n", 205 | " \n", 206 | " \n", 207 | " \n", 208 | " \n", 209 | " \n", 210 | " \n", 211 | " \n", 212 | " \n", 213 | " \n", 214 | " \n", 215 | " \n", 216 | " \n", 217 | " \n", 218 | " \n", 219 | " \n", 220 | " \n", 221 | " \n", 222 | " \n", 223 | " \n", 224 | " \n", 225 | " \n", 226 | " \n", 227 | " \n", 228 | " \n", 229 | " \n", 230 | " \n", 231 | " \n", 232 | " \n", 233 | " \n", 234 | " \n", 235 | " \n", 236 | " \n", 237 | " \n", 238 | " \n", 239 | " \n", 240 | " \n", 241 | " \n", 242 | " \n", 243 | " \n", 244 | " \n", 245 | " \n", 246 | "
datasettaskframeworkmodel_namesystem_promptprompt_collectionmetricsonly_evaluate_metricsmetrics_aggregatorsfilter_doc_classfilter_question_type
0snilsVQAHugging FaceQwen2.5-VL-3BNaNAntonShiryaev.csv[WER, CER, BLEU]False[by_id, by_doc_question, by_doc_type, general]snilsНомер снилса
1idt_pdf_full_miniVQAHugging FaceQwen2-VL-2BNaNAntonShiryaev.csv[WER, CER, BLEU]False[by_id, by_doc_question, by_doc_type, general]docНомер страницы
\n", 247 | "
" 248 | ], 249 | "text/plain": [ 250 | " dataset task framework model_name system_prompt \\\n", 251 | "0 snils VQA Hugging Face Qwen2.5-VL-3B NaN \n", 252 | "1 idt_pdf_full_mini VQA Hugging Face Qwen2-VL-2B NaN \n", 253 | "\n", 254 | " prompt_collection metrics only_evaluate_metrics \\\n", 255 | "0 AntonShiryaev.csv [WER, CER, BLEU] False \n", 256 | "1 AntonShiryaev.csv [WER, CER, BLEU] False \n", 257 | "\n", 258 | " metrics_aggregators filter_doc_class \\\n", 259 | "0 [by_id, by_doc_question, by_doc_type, general] snils \n", 260 | "1 [by_id, by_doc_question, by_doc_type, general] doc \n", 261 | "\n", 262 | " filter_question_type \n", 263 | "0 Номер снилса \n", 264 | "1 Номер страницы " 265 | ] 266 | }, 267 | "execution_count": 7, 268 | "metadata": {}, 269 | "output_type": "execute_result" 270 | } 271 | ], 272 | "source": [ 273 | "df" 274 | ] 275 | }, 276 | { 277 | "cell_type": "code", 278 | "execution_count": 8, 279 | "metadata": {}, 280 | "outputs": [], 281 | "source": [ 282 | "csv_path = \"user_config_2.csv\"\n", 283 | "\n", 284 | "df.to_csv(csv_path, sep=\";\", encoding=\"utf-8-sig\", index=False)" 285 | ] 286 | } 287 | ], 288 | "metadata": { 289 | "kernelspec": { 290 | "display_name": "Python 3", 291 | "language": "python", 292 | "name": "python3" 293 | }, 294 | "language_info": { 295 | "codemirror_mode": { 296 | "name": "ipython", 297 | "version": 3 298 | }, 299 | "file_extension": ".py", 300 | "mimetype": "text/x-python", 301 | "name": "python", 302 | "nbconvert_exporter": "python", 303 | "pygments_lexer": "ipython3", 304 | "version": "3.10.11" 305 | } 306 | }, 307 | "nbformat": 4, 308 | "nbformat_minor": 2 309 | } 310 | -------------------------------------------------------------------------------- /benchmark_scheduler/benchmark_orchestrator.py: -------------------------------------------------------------------------------- 1 | import copy 2 | import os 3 | from typing import Any, Dict, List, Optional 4 | 5 | import docker 6 | from config_manager.config_manager import ConfigManager 7 | from docker.errors import APIError, ImageNotFound 8 | from dotenv import load_dotenv 9 | from tqdm import tqdm 10 | 11 | from .user_config_reader import UserConfigReader 12 | 13 | 14 | class BenchmarkOrchestrator: 15 | """Оркестратор для выполнения `Evaluation run` для VLM-моделей. 16 | 17 | Attributes: 18 | evalkit_config (ConfigManager): Менеджер конфигурации VLMHyperBench 19 | volumes (Dict[str, str]): Словарь с маппингом директорий для монтирования в Docker-контейнеры 20 | vlm_run_packages (List[str]): Список Python-пакетов, которые будут установлены для этапа запуска VLM 21 | eval_run_packages (List[str]): Список Python-пакетов, которые будут установлены для этапа оценки метрик 22 | environment (Dict[str, str]): Переменные окружения для контейнеров 23 | bench_run_cfgs (List[BenchmarkRunConfig]): Список конфигураций запусков бенчмарка 24 | 25 | """ 26 | 27 | def __init__(self, config_path: str) -> None: 28 | """Инициализирует оркестратор. 29 | 30 | Args: 31 | config_path (str): Путь к конфигурационному файлу VLMHyperBench 32 | 33 | """ 34 | # Считываем конфиг для VLMHyperBench 35 | self.evalkit_config = ConfigManager(config_path) 36 | 37 | # Получим маппинг директорий для Docker-контейнера 38 | self.volumes = self.evalkit_config.get_volumes() 39 | self.volumes = host_paths_to_abs(self.volumes) 40 | 41 | # Получим список python-пакетов для каждого этапа работы 42 | self.vlm_run_packages = self.evalkit_config.load_packages("vlm_run") 43 | self.eval_run_packages = self.evalkit_config.load_packages("eval_run") 44 | 45 | # загружаем переменные окружения 46 | self.environment = load_env_vars() 47 | self.environment["VLMHYPERBENCH_CONFIG_PATH"] = ( 48 | self.evalkit_config.cfg_container["vlmhyperbench_cfg"] 49 | ) 50 | 51 | # Получим список Evaluation Run'ов из `user_config.csv` 52 | user_cfg_reader = UserConfigReader( 53 | self.evalkit_config.cfg["user_config"], self.evalkit_config.cfg["vlm_base"] 54 | ) 55 | self.bench_run_cfgs = user_cfg_reader.read_user_config() 56 | 57 | def run_scheduler(self): 58 | """Запускает цикл выполнения всех конфигураций `Evaluation run`. 59 | 60 | Последовательно выполняет benchmark_run() для каждой конфигурации 61 | из self.bench_run_cfgs. 62 | 63 | Перед запуском `Evaluation run` проверяет наличие Docker-образов. 64 | """ 65 | if not self.pull_required_images(): 66 | print("Ошибка: Не все необходимые Docker-образы были загружены.") 67 | return 68 | for bench_run_cfg in self.bench_run_cfgs: 69 | self.benchmark_run(bench_run_cfg) 70 | 71 | def benchmark_run(self, bench_run_cfg): 72 | """Выполняет полный цикл одного `Evaluation run`. 73 | 74 | Args: 75 | bench_run_cfg (BenchmarkRunConfig): Конфигурация текущего запуска 76 | 77 | Осуществляет: 78 | 1. Сохранение конфигурации в JSON 79 | 2. Запуск VLM-модели в Docker-контейнере 80 | 3. Оценку метрик в отдельном Docker-контейнере 81 | 82 | """ 83 | bench_run_cfg.to_json(self.evalkit_config.cfg["benchmark_run_cfg"]) 84 | 85 | # 2. Этап "Запуск VLM" на Docker-контейнере 86 | vlm_run_packages = copy.deepcopy(self.vlm_run_packages) 87 | vlm_run_packages.append(bench_run_cfg.git_python_package) 88 | print(vlm_run_packages) 89 | run_vlm_path = os.path.join( 90 | self.evalkit_config.cfg_container["system_dirs"]["bench_stages"], 91 | "run_vlm.py", 92 | ) 93 | run_container( 94 | bench_run_cfg.docker_image, 95 | self.volumes, 96 | script_path=run_vlm_path, 97 | packages_to_install=vlm_run_packages, 98 | use_gpu=True, 99 | environment=self.environment, 100 | ) 101 | 102 | # 3. Этап "Оценка метрик" на Docker-контейнере 103 | print(self.evalkit_config.cfg["eval_docker_img"]) 104 | run_eval_path = os.path.join( 105 | self.evalkit_config.cfg_container["system_dirs"]["bench_stages"], 106 | "run_eval.py", 107 | ) 108 | run_container( 109 | self.evalkit_config.cfg["eval_docker_img"], 110 | self.volumes, 111 | script_path=run_eval_path, 112 | packages_to_install=self.eval_run_packages, 113 | environment=self.environment, 114 | ) 115 | 116 | def pull_required_images(self) -> bool: 117 | """Скачивает все необходимые Docker-образы для выполнения `Evaluation run`. 118 | 119 | Returns: 120 | bool: True, если все образы успешно загружены, иначе False. 121 | """ 122 | required_images = set() 123 | # Собираем образы из конфигураций Evaluation run 124 | for bench_run_cfg in self.bench_run_cfgs: 125 | required_images.add(bench_run_cfg.docker_image) 126 | 127 | # Добавляем образ для оценки метрик 128 | required_images.add(self.evalkit_config.cfg["eval_docker_img"]) 129 | 130 | success = True 131 | for image in required_images: 132 | # Разделяем имя образа и тег 133 | parts = image.split(":", 1) 134 | image_name = parts[0] 135 | tag = parts[1] if len(parts) > 1 else "latest" 136 | 137 | print(f"Проверка образа: {image_name}:{tag}") 138 | if not check_and_pull_image(image_name, tag): 139 | success = False 140 | return success 141 | 142 | 143 | def host_paths_to_abs( 144 | volumes: Dict[str, str], current_dir: str | None = None 145 | ) -> Dict[str, str]: 146 | """Делает пути на хосте абсолютными в словаре volumes. 147 | Это необходимо для монтирования данных каталогов к запускаемому Docker-контейнеру. 148 | 149 | Если current_dir не указан, используется текущая рабочая директория. 150 | 151 | Args: 152 | volumes (Dict[str, str]): Словарь, осуществляет mapping директорий, которые будут примонтированы 153 | к запущенному Docker-контейнеру. 154 | В этом словаре: ключи — пути на хосте, а значения — пути внутри контейнера. 155 | current_dir (str | None, optional): Текущая директория. Если None, используется os.getcwd(). 156 | По умолчанию None. 157 | 158 | Returns: 159 | Dict[str, str]: Новый словарь, где ключи — абсолютные пути на хосте, а значения — пути внутри контейнера. 160 | 161 | Example: 162 | volumes = { 163 | "pipeline/data": "/workspace/data", 164 | "pipeline/bench_stages": "/workspace/bench_stages", 165 | "pipeline/wheels": "/workspace/wheels", 166 | } 167 | current_dir = "/home/user/project" 168 | result = add_current_dir_to_volumes(volumes, current_dir) 169 | print(result) 170 | # { 171 | # "/home/user/project/pipeline/data": "/workspace/data", 172 | # "/home/user/project/pipeline/bench_stages": "/workspace/bench_stages", 173 | # "/home/user/project/pipeline/wheels": "/workspace/wheels", 174 | # } 175 | """ 176 | if current_dir is None: 177 | current_dir = os.getcwd() 178 | 179 | return { 180 | os.path.join(current_dir, host_path): container_path 181 | for host_path, container_path in volumes.items() 182 | } 183 | 184 | 185 | def check_and_pull_image(image_name: str, tag: str = "latest") -> bool: 186 | """Проверяет наличие Docker-образа и скачивает его при необходимости. 187 | 188 | Args: 189 | image_name (str): Название Docker-образа (например, "python") 190 | tag (str): Тег образа. По умолчанию "latest" 191 | 192 | Returns: 193 | bool: True если образ успешно найден/скачан, False в случае ошибки 194 | 195 | Raises: 196 | docker.errors.APIError: При ошибках API Docker [[1]] 197 | ValueError: Если название образа пустое 198 | 199 | Example: 200 | >>> check_and_pull_image("nvidia/cuda", "12.4.0-base") 201 | Pulling nvidia/cuda:12.4.0-base... 202 | [======> ] 25% Downloading... 203 | ... 204 | True 205 | """ 206 | client = docker.from_env() 207 | full_image_name = f"{image_name}:{tag}" 208 | BAR_WIDTH = 120 209 | 210 | try: 211 | client.images.get(full_image_name) 212 | print(f"Образ {full_image_name} уже существует") 213 | return True 214 | except ImageNotFound: 215 | pass 216 | 217 | try: 218 | pull_log = client.api.pull(image_name, tag=tag, stream=True, decode=True) 219 | layer_bars = {} 220 | last_status = None 221 | 222 | for line in pull_log: 223 | if "id" not in line: 224 | continue 225 | 226 | layer_id = line["id"] 227 | status = line.get("status", "N/A") 228 | 229 | # Создаем/обновляем прогресс-бар 230 | if layer_id not in layer_bars: 231 | layer_bars[layer_id] = tqdm( 232 | desc=f"{layer_id[:12]:<12}", 233 | unit="B", 234 | unit_scale=True, 235 | leave=False, 236 | ncols=BAR_WIDTH, 237 | position=len(layer_bars), 238 | dynamic_ncols=False, 239 | bar_format="{l_bar}{bar}|{n_fmt}/{total_fmt} [{elapsed}<{remaining}, {rate_fmt}{postfix}]", 240 | ) 241 | 242 | bar = layer_bars[layer_id] 243 | if "progressDetail" in line: 244 | detail = line["progressDetail"] 245 | if "current" in detail and "total" in detail: 246 | bar.total = detail["total"] 247 | bar.update(detail["current"] - bar.n) 248 | 249 | # Обновляем статус 250 | if status != last_status: 251 | last_status = status 252 | postfix = f" {status}"[: BAR_WIDTH // 3] 253 | bar.set_postfix_str(postfix, refresh=False) 254 | 255 | # Завершаем все бары 256 | for bar in layer_bars.values(): 257 | bar.close() 258 | 259 | print(f"\nDocker-образ {full_image_name} успешно загружен") 260 | return True 261 | 262 | except APIError as e: 263 | print(f"Ошибка при загрузке образа: {e}") 264 | return False 265 | finally: 266 | for bar in layer_bars.values(): 267 | bar.close() 268 | 269 | 270 | def run_container( 271 | image_name: str, 272 | volumes: Dict[str, str], 273 | script_path: str, 274 | packages_to_install: Optional[List[str]] = None, 275 | use_gpu: bool = False, 276 | keep_container: bool = False, 277 | environment: Optional[Dict[str, str]] = None, 278 | ) -> None: 279 | """Запускает Docker-контейнер, монтирует папки, устанавливает пакеты, подключает GPU (если нужно) 280 | и выполняет Python-скрипт с возможностью передачи переменных окружения. 281 | 282 | Вывод контейнера, включая tqdm, отображается в реальном времени. 283 | 284 | Args: 285 | image_name (str): Имя Docker-образа. 286 | volumes (Dict[str, str]): Словарь, осуществляющий маппинг директорий, которые будут примонтированы 287 | к запущенному Docker-контейнеру. 288 | Ключи — пути на хосте, значения — пути внутри контейнера. 289 | script_path (str): Путь к Python-скрипту внутри контейнера, который будет исполняться. 290 | packages_to_install (Optional[List[str]]): Список Python-пакетов для установки (например, ["numpy", "pandas"]). 291 | По умолчанию None. 292 | use_gpu (bool): Флаг, указывающий, нужно ли подключать GPU. По умолчанию False. 293 | keep_container (bool): Флаг, указывающий, нужно ли оставлять контейнер запущенным после выполнения функции. 294 | По умолчанию False. 295 | environment (Optional[Dict[str, str]]): Словарь переменных окружения, которые будут переданы в контейнер. 296 | Например, {"HUGGING_FACE_TOKEN": "your_token_here"}. По умолчанию None. 297 | 298 | Raises: 299 | Exception: Если произошла ошибка при запуске контейнера или выполнении скрипта. 300 | 301 | Example: 302 | volumes = { 303 | "/host/path/data": "/container/path/data", 304 | "/host/path/scripts": "/container/path/scripts", 305 | } 306 | environment = { 307 | "HUGGING_FACE_TOKEN": "your_token_here", 308 | "OTHER_ENV_VAR": "value", 309 | } 310 | run_container( 311 | image_name="python:3.10", 312 | volumes=volumes, 313 | script_path="/container/path/scripts/run.py", 314 | packages_to_install=["numpy", "pandas"], 315 | use_gpu=True, 316 | keep_container=False, 317 | environment=environment, 318 | ) 319 | """ 320 | # Создание клиента Docker 321 | client = docker.from_env() 322 | 323 | # Определение запроса на использование GPU (если use_gpu=True) 324 | device_requests = [] 325 | if use_gpu: 326 | device_requests = [docker.types.DeviceRequest(count=-1, capabilities=[["gpu"]])] 327 | 328 | # Формирование volumes для монтирования папок 329 | volumes_dict = { 330 | host_path: {"bind": container_path, "mode": "rw"} # 'rw' - чтение и запись 331 | for host_path, container_path in volumes.items() 332 | } 333 | 334 | # Формирование команды для установки пакетов и запуска скрипта 335 | install_cmd = ( 336 | f"pip install {' '.join(packages_to_install)}" if packages_to_install else "" 337 | ) 338 | scrypt_run_cmd = f"python -u {script_path}" 339 | interactive_shell_cmd = "exec bash" if keep_container else "" 340 | 341 | command = [install_cmd, scrypt_run_cmd, interactive_shell_cmd] 342 | command = list(filter(lambda x: x != "", command)) 343 | command = " && ".join(command) 344 | 345 | # Объединение всех команд в одну 346 | command = f"sh -c '{command}'" 347 | 348 | # Вывод команды для отладки 349 | print(command) 350 | 351 | # Запуск контейнера 352 | container = client.containers.run( 353 | image_name, 354 | command=command, 355 | detach=True, 356 | stdout=True, 357 | stderr=True, 358 | tty=True, 359 | volumes=volumes_dict, 360 | device_requests=device_requests, 361 | environment=environment, # Передача переменных окружения 362 | ) 363 | 364 | # Чтение вывода контейнера в реальном времени 365 | print(f"Запущен контейнер с ID: {container.id}") 366 | try: 367 | for line in container.attach(stream=True, logs=True): 368 | print(line.decode("utf-8", errors="replace").strip()) 369 | except KeyboardInterrupt: 370 | print("Остановлено пользователем.") 371 | 372 | # Остановка контейнера, если keep_container=False 373 | if not keep_container: 374 | container.remove(force=True) 375 | print(f"Контейнер {container.id} удален.") 376 | else: 377 | print(f"Контейнер {container.id} оставлен запущенным.") 378 | print( 379 | f"Для подключения к контейнеру выполните: docker exec -it {container.id} bash" 380 | ) 381 | 382 | 383 | def load_env_vars(env_file: str = ".env") -> Dict[str, Any]: 384 | """Загружает переменные окружения из файла .env и возвращает их в виде словаря. 385 | 386 | Args: 387 | env_file (str): Путь к файлу .env. По умолчанию ".env". 388 | 389 | Returns: 390 | Dict[str, Any]: Словарь, где ключи — имена переменных окружения, а значения — их значения. 391 | 392 | Example: 393 | env_vars = load_env_vars() 394 | print(env_vars) 395 | # { 396 | # "HUGGING_FACE_TOKEN": "your_token_here", 397 | # "DATABASE_URL": "postgres://user:password@localhost:5432/mydatabase", 398 | # "DEBUG": True 399 | # } 400 | 401 | Raises: 402 | FileNotFoundError: Если файл .env не найден. 403 | """ 404 | # Загружаем переменные окружения из файла .env 405 | load_dotenv(env_file) 406 | 407 | # Преобразуем переменные окружения в словарь 408 | env_vars = {} 409 | for key, value in os.environ.items(): 410 | env_vars[key] = value 411 | 412 | return env_vars 413 | -------------------------------------------------------------------------------- /uv.lock: -------------------------------------------------------------------------------- 1 | version = 1 2 | revision = 2 3 | requires-python = ">=3.10" 4 | resolution-markers = [ 5 | "python_full_version >= '3.12'", 6 | "python_full_version == '3.11.*'", 7 | "python_full_version < '3.11'", 8 | ] 9 | 10 | [[package]] 11 | name = "appnope" 12 | version = "0.1.4" 13 | source = { registry = "https://pypi.org/simple" } 14 | sdist = { url = "https://files.pythonhosted.org/packages/35/5d/752690df9ef5b76e169e68d6a129fa6d08a7100ca7f754c89495db3c6019/appnope-0.1.4.tar.gz", hash = "sha256:1de3860566df9caf38f01f86f65e0e13e379af54f9e4bee1e66b48f2efffd1ee", size = 4170, upload-time = "2024-02-06T09:43:11.258Z" } 15 | wheels = [ 16 | { url = "https://files.pythonhosted.org/packages/81/29/5ecc3a15d5a33e31b26c11426c45c501e439cb865d0bff96315d86443b78/appnope-0.1.4-py2.py3-none-any.whl", hash = "sha256:502575ee11cd7a28c0205f379b525beefebab9d161b7c964670864014ed7213c", size = 4321, upload-time = "2024-02-06T09:43:09.663Z" }, 17 | ] 18 | 19 | [[package]] 20 | name = "asttokens" 21 | version = "3.0.0" 22 | source = { registry = "https://pypi.org/simple" } 23 | sdist = { url = "https://files.pythonhosted.org/packages/4a/e7/82da0a03e7ba5141f05cce0d302e6eed121ae055e0456ca228bf693984bc/asttokens-3.0.0.tar.gz", hash = "sha256:0dcd8baa8d62b0c1d118b399b2ddba3c4aff271d0d7a9e0d4c1681c79035bbc7", size = 61978, upload-time = "2024-11-30T04:30:14.439Z" } 24 | wheels = [ 25 | { url = "https://files.pythonhosted.org/packages/25/8a/c46dcc25341b5bce5472c718902eb3d38600a903b14fa6aeecef3f21a46f/asttokens-3.0.0-py3-none-any.whl", hash = "sha256:e3078351a059199dd5138cb1c706e6430c05eff2ff136af5eb4790f9d28932e2", size = 26918, upload-time = "2024-11-30T04:30:10.946Z" }, 26 | ] 27 | 28 | [[package]] 29 | name = "benchmark-run-config" 30 | version = "0.1.0" 31 | source = { git = "https://github.com/VLMHyperBenchTeam/benchmark_run_config.git?rev=0.1.4#022772896ed25a65e38596291466a7390850573c" } 32 | 33 | [[package]] 34 | name = "certifi" 35 | version = "2025.4.26" 36 | source = { registry = "https://pypi.org/simple" } 37 | sdist = { url = "https://files.pythonhosted.org/packages/e8/9e/c05b3920a3b7d20d3d3310465f50348e5b3694f4f88c6daf736eef3024c4/certifi-2025.4.26.tar.gz", hash = "sha256:0a816057ea3cdefcef70270d2c515e4506bbc954f417fa5ade2021213bb8f0c6", size = 160705, upload-time = "2025-04-26T02:12:29.51Z" } 38 | wheels = [ 39 | { url = "https://files.pythonhosted.org/packages/4a/7e/3db2bd1b1f9e95f7cddca6d6e75e2f2bd9f51b1246e546d88addca0106bd/certifi-2025.4.26-py3-none-any.whl", hash = "sha256:30350364dfe371162649852c63336a15c70c6510c2ad5015b21c2345311805f3", size = 159618, upload-time = "2025-04-26T02:12:27.662Z" }, 40 | ] 41 | 42 | [[package]] 43 | name = "cffi" 44 | version = "1.17.1" 45 | source = { registry = "https://pypi.org/simple" } 46 | dependencies = [ 47 | { name = "pycparser" }, 48 | ] 49 | sdist = { url = "https://files.pythonhosted.org/packages/fc/97/c783634659c2920c3fc70419e3af40972dbaf758daa229a7d6ea6135c90d/cffi-1.17.1.tar.gz", hash = "sha256:1c39c6016c32bc48dd54561950ebd6836e1670f2ae46128f67cf49e789c52824", size = 516621, upload-time = "2024-09-04T20:45:21.852Z" } 50 | wheels = [ 51 | { url = "https://files.pythonhosted.org/packages/90/07/f44ca684db4e4f08a3fdc6eeb9a0d15dc6883efc7b8c90357fdbf74e186c/cffi-1.17.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:df8b1c11f177bc2313ec4b2d46baec87a5f3e71fc8b45dab2ee7cae86d9aba14", size = 182191, upload-time = "2024-09-04T20:43:30.027Z" }, 52 | { url = "https://files.pythonhosted.org/packages/08/fd/cc2fedbd887223f9f5d170c96e57cbf655df9831a6546c1727ae13fa977a/cffi-1.17.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:8f2cdc858323644ab277e9bb925ad72ae0e67f69e804f4898c070998d50b1a67", size = 178592, upload-time = "2024-09-04T20:43:32.108Z" }, 53 | { url = "https://files.pythonhosted.org/packages/de/cc/4635c320081c78d6ffc2cab0a76025b691a91204f4aa317d568ff9280a2d/cffi-1.17.1-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:edae79245293e15384b51f88b00613ba9f7198016a5948b5dddf4917d4d26382", size = 426024, upload-time = "2024-09-04T20:43:34.186Z" }, 54 | { url = "https://files.pythonhosted.org/packages/b6/7b/3b2b250f3aab91abe5f8a51ada1b717935fdaec53f790ad4100fe2ec64d1/cffi-1.17.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:45398b671ac6d70e67da8e4224a065cec6a93541bb7aebe1b198a61b58c7b702", size = 448188, upload-time = "2024-09-04T20:43:36.286Z" }, 55 | { url = "https://files.pythonhosted.org/packages/d3/48/1b9283ebbf0ec065148d8de05d647a986c5f22586b18120020452fff8f5d/cffi-1.17.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ad9413ccdeda48c5afdae7e4fa2192157e991ff761e7ab8fdd8926f40b160cc3", size = 455571, upload-time = "2024-09-04T20:43:38.586Z" }, 56 | { url = "https://files.pythonhosted.org/packages/40/87/3b8452525437b40f39ca7ff70276679772ee7e8b394934ff60e63b7b090c/cffi-1.17.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5da5719280082ac6bd9aa7becb3938dc9f9cbd57fac7d2871717b1feb0902ab6", size = 436687, upload-time = "2024-09-04T20:43:40.084Z" }, 57 | { url = "https://files.pythonhosted.org/packages/8d/fb/4da72871d177d63649ac449aec2e8a29efe0274035880c7af59101ca2232/cffi-1.17.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2bb1a08b8008b281856e5971307cc386a8e9c5b625ac297e853d36da6efe9c17", size = 446211, upload-time = "2024-09-04T20:43:41.526Z" }, 58 | { url = "https://files.pythonhosted.org/packages/ab/a0/62f00bcb411332106c02b663b26f3545a9ef136f80d5df746c05878f8c4b/cffi-1.17.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:045d61c734659cc045141be4bae381a41d89b741f795af1dd018bfb532fd0df8", size = 461325, upload-time = "2024-09-04T20:43:43.117Z" }, 59 | { url = "https://files.pythonhosted.org/packages/36/83/76127035ed2e7e27b0787604d99da630ac3123bfb02d8e80c633f218a11d/cffi-1.17.1-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:6883e737d7d9e4899a8a695e00ec36bd4e5e4f18fabe0aca0efe0a4b44cdb13e", size = 438784, upload-time = "2024-09-04T20:43:45.256Z" }, 60 | { url = "https://files.pythonhosted.org/packages/21/81/a6cd025db2f08ac88b901b745c163d884641909641f9b826e8cb87645942/cffi-1.17.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:6b8b4a92e1c65048ff98cfe1f735ef8f1ceb72e3d5f0c25fdb12087a23da22be", size = 461564, upload-time = "2024-09-04T20:43:46.779Z" }, 61 | { url = "https://files.pythonhosted.org/packages/f8/fe/4d41c2f200c4a457933dbd98d3cf4e911870877bd94d9656cc0fcb390681/cffi-1.17.1-cp310-cp310-win32.whl", hash = "sha256:c9c3d058ebabb74db66e431095118094d06abf53284d9c81f27300d0e0d8bc7c", size = 171804, upload-time = "2024-09-04T20:43:48.186Z" }, 62 | { url = "https://files.pythonhosted.org/packages/d1/b6/0b0f5ab93b0df4acc49cae758c81fe4e5ef26c3ae2e10cc69249dfd8b3ab/cffi-1.17.1-cp310-cp310-win_amd64.whl", hash = "sha256:0f048dcf80db46f0098ccac01132761580d28e28bc0f78ae0d58048063317e15", size = 181299, upload-time = "2024-09-04T20:43:49.812Z" }, 63 | { url = "https://files.pythonhosted.org/packages/6b/f4/927e3a8899e52a27fa57a48607ff7dc91a9ebe97399b357b85a0c7892e00/cffi-1.17.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:a45e3c6913c5b87b3ff120dcdc03f6131fa0065027d0ed7ee6190736a74cd401", size = 182264, upload-time = "2024-09-04T20:43:51.124Z" }, 64 | { url = "https://files.pythonhosted.org/packages/6c/f5/6c3a8efe5f503175aaddcbea6ad0d2c96dad6f5abb205750d1b3df44ef29/cffi-1.17.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:30c5e0cb5ae493c04c8b42916e52ca38079f1b235c2f8ae5f4527b963c401caf", size = 178651, upload-time = "2024-09-04T20:43:52.872Z" }, 65 | { url = "https://files.pythonhosted.org/packages/94/dd/a3f0118e688d1b1a57553da23b16bdade96d2f9bcda4d32e7d2838047ff7/cffi-1.17.1-cp311-cp311-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f75c7ab1f9e4aca5414ed4d8e5c0e303a34f4421f8a0d47a4d019ceff0ab6af4", size = 445259, upload-time = "2024-09-04T20:43:56.123Z" }, 66 | { url = "https://files.pythonhosted.org/packages/2e/ea/70ce63780f096e16ce8588efe039d3c4f91deb1dc01e9c73a287939c79a6/cffi-1.17.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a1ed2dd2972641495a3ec98445e09766f077aee98a1c896dcb4ad0d303628e41", size = 469200, upload-time = "2024-09-04T20:43:57.891Z" }, 67 | { url = "https://files.pythonhosted.org/packages/1c/a0/a4fa9f4f781bda074c3ddd57a572b060fa0df7655d2a4247bbe277200146/cffi-1.17.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:46bf43160c1a35f7ec506d254e5c890f3c03648a4dbac12d624e4490a7046cd1", size = 477235, upload-time = "2024-09-04T20:44:00.18Z" }, 68 | { url = "https://files.pythonhosted.org/packages/62/12/ce8710b5b8affbcdd5c6e367217c242524ad17a02fe5beec3ee339f69f85/cffi-1.17.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a24ed04c8ffd54b0729c07cee15a81d964e6fee0e3d4d342a27b020d22959dc6", size = 459721, upload-time = "2024-09-04T20:44:01.585Z" }, 69 | { url = "https://files.pythonhosted.org/packages/ff/6b/d45873c5e0242196f042d555526f92aa9e0c32355a1be1ff8c27f077fd37/cffi-1.17.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:610faea79c43e44c71e1ec53a554553fa22321b65fae24889706c0a84d4ad86d", size = 467242, upload-time = "2024-09-04T20:44:03.467Z" }, 70 | { url = "https://files.pythonhosted.org/packages/1a/52/d9a0e523a572fbccf2955f5abe883cfa8bcc570d7faeee06336fbd50c9fc/cffi-1.17.1-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:a9b15d491f3ad5d692e11f6b71f7857e7835eb677955c00cc0aefcd0669adaf6", size = 477999, upload-time = "2024-09-04T20:44:05.023Z" }, 71 | { url = "https://files.pythonhosted.org/packages/44/74/f2a2460684a1a2d00ca799ad880d54652841a780c4c97b87754f660c7603/cffi-1.17.1-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:de2ea4b5833625383e464549fec1bc395c1bdeeb5f25c4a3a82b5a8c756ec22f", size = 454242, upload-time = "2024-09-04T20:44:06.444Z" }, 72 | { url = "https://files.pythonhosted.org/packages/f8/4a/34599cac7dfcd888ff54e801afe06a19c17787dfd94495ab0c8d35fe99fb/cffi-1.17.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:fc48c783f9c87e60831201f2cce7f3b2e4846bf4d8728eabe54d60700b318a0b", size = 478604, upload-time = "2024-09-04T20:44:08.206Z" }, 73 | { url = "https://files.pythonhosted.org/packages/34/33/e1b8a1ba29025adbdcda5fb3a36f94c03d771c1b7b12f726ff7fef2ebe36/cffi-1.17.1-cp311-cp311-win32.whl", hash = "sha256:85a950a4ac9c359340d5963966e3e0a94a676bd6245a4b55bc43949eee26a655", size = 171727, upload-time = "2024-09-04T20:44:09.481Z" }, 74 | { url = "https://files.pythonhosted.org/packages/3d/97/50228be003bb2802627d28ec0627837ac0bf35c90cf769812056f235b2d1/cffi-1.17.1-cp311-cp311-win_amd64.whl", hash = "sha256:caaf0640ef5f5517f49bc275eca1406b0ffa6aa184892812030f04c2abf589a0", size = 181400, upload-time = "2024-09-04T20:44:10.873Z" }, 75 | { url = "https://files.pythonhosted.org/packages/5a/84/e94227139ee5fb4d600a7a4927f322e1d4aea6fdc50bd3fca8493caba23f/cffi-1.17.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:805b4371bf7197c329fcb3ead37e710d1bca9da5d583f5073b799d5c5bd1eee4", size = 183178, upload-time = "2024-09-04T20:44:12.232Z" }, 76 | { url = "https://files.pythonhosted.org/packages/da/ee/fb72c2b48656111c4ef27f0f91da355e130a923473bf5ee75c5643d00cca/cffi-1.17.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:733e99bc2df47476e3848417c5a4540522f234dfd4ef3ab7fafdf555b082ec0c", size = 178840, upload-time = "2024-09-04T20:44:13.739Z" }, 77 | { url = "https://files.pythonhosted.org/packages/cc/b6/db007700f67d151abadf508cbfd6a1884f57eab90b1bb985c4c8c02b0f28/cffi-1.17.1-cp312-cp312-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1257bdabf294dceb59f5e70c64a3e2f462c30c7ad68092d01bbbfb1c16b1ba36", size = 454803, upload-time = "2024-09-04T20:44:15.231Z" }, 78 | { url = "https://files.pythonhosted.org/packages/1a/df/f8d151540d8c200eb1c6fba8cd0dfd40904f1b0682ea705c36e6c2e97ab3/cffi-1.17.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:da95af8214998d77a98cc14e3a3bd00aa191526343078b530ceb0bd710fb48a5", size = 478850, upload-time = "2024-09-04T20:44:17.188Z" }, 79 | { url = "https://files.pythonhosted.org/packages/28/c0/b31116332a547fd2677ae5b78a2ef662dfc8023d67f41b2a83f7c2aa78b1/cffi-1.17.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d63afe322132c194cf832bfec0dc69a99fb9bb6bbd550f161a49e9e855cc78ff", size = 485729, upload-time = "2024-09-04T20:44:18.688Z" }, 80 | { url = "https://files.pythonhosted.org/packages/91/2b/9a1ddfa5c7f13cab007a2c9cc295b70fbbda7cb10a286aa6810338e60ea1/cffi-1.17.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f79fc4fc25f1c8698ff97788206bb3c2598949bfe0fef03d299eb1b5356ada99", size = 471256, upload-time = "2024-09-04T20:44:20.248Z" }, 81 | { url = "https://files.pythonhosted.org/packages/b2/d5/da47df7004cb17e4955df6a43d14b3b4ae77737dff8bf7f8f333196717bf/cffi-1.17.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b62ce867176a75d03a665bad002af8e6d54644fad99a3c70905c543130e39d93", size = 479424, upload-time = "2024-09-04T20:44:21.673Z" }, 82 | { url = "https://files.pythonhosted.org/packages/0b/ac/2a28bcf513e93a219c8a4e8e125534f4f6db03e3179ba1c45e949b76212c/cffi-1.17.1-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:386c8bf53c502fff58903061338ce4f4950cbdcb23e2902d86c0f722b786bbe3", size = 484568, upload-time = "2024-09-04T20:44:23.245Z" }, 83 | { url = "https://files.pythonhosted.org/packages/d4/38/ca8a4f639065f14ae0f1d9751e70447a261f1a30fa7547a828ae08142465/cffi-1.17.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:4ceb10419a9adf4460ea14cfd6bc43d08701f0835e979bf821052f1805850fe8", size = 488736, upload-time = "2024-09-04T20:44:24.757Z" }, 84 | { url = "https://files.pythonhosted.org/packages/86/c5/28b2d6f799ec0bdecf44dced2ec5ed43e0eb63097b0f58c293583b406582/cffi-1.17.1-cp312-cp312-win32.whl", hash = "sha256:a08d7e755f8ed21095a310a693525137cfe756ce62d066e53f502a83dc550f65", size = 172448, upload-time = "2024-09-04T20:44:26.208Z" }, 85 | { url = "https://files.pythonhosted.org/packages/50/b9/db34c4755a7bd1cb2d1603ac3863f22bcecbd1ba29e5ee841a4bc510b294/cffi-1.17.1-cp312-cp312-win_amd64.whl", hash = "sha256:51392eae71afec0d0c8fb1a53b204dbb3bcabcb3c9b807eedf3e1e6ccf2de903", size = 181976, upload-time = "2024-09-04T20:44:27.578Z" }, 86 | { url = "https://files.pythonhosted.org/packages/8d/f8/dd6c246b148639254dad4d6803eb6a54e8c85c6e11ec9df2cffa87571dbe/cffi-1.17.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:f3a2b4222ce6b60e2e8b337bb9596923045681d71e5a082783484d845390938e", size = 182989, upload-time = "2024-09-04T20:44:28.956Z" }, 87 | { url = "https://files.pythonhosted.org/packages/8b/f1/672d303ddf17c24fc83afd712316fda78dc6fce1cd53011b839483e1ecc8/cffi-1.17.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:0984a4925a435b1da406122d4d7968dd861c1385afe3b45ba82b750f229811e2", size = 178802, upload-time = "2024-09-04T20:44:30.289Z" }, 88 | { url = "https://files.pythonhosted.org/packages/0e/2d/eab2e858a91fdff70533cab61dcff4a1f55ec60425832ddfdc9cd36bc8af/cffi-1.17.1-cp313-cp313-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d01b12eeeb4427d3110de311e1774046ad344f5b1a7403101878976ecd7a10f3", size = 454792, upload-time = "2024-09-04T20:44:32.01Z" }, 89 | { url = "https://files.pythonhosted.org/packages/75/b2/fbaec7c4455c604e29388d55599b99ebcc250a60050610fadde58932b7ee/cffi-1.17.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:706510fe141c86a69c8ddc029c7910003a17353970cff3b904ff0686a5927683", size = 478893, upload-time = "2024-09-04T20:44:33.606Z" }, 90 | { url = "https://files.pythonhosted.org/packages/4f/b7/6e4a2162178bf1935c336d4da8a9352cccab4d3a5d7914065490f08c0690/cffi-1.17.1-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:de55b766c7aa2e2a3092c51e0483d700341182f08e67c63630d5b6f200bb28e5", size = 485810, upload-time = "2024-09-04T20:44:35.191Z" }, 91 | { url = "https://files.pythonhosted.org/packages/c7/8a/1d0e4a9c26e54746dc08c2c6c037889124d4f59dffd853a659fa545f1b40/cffi-1.17.1-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c59d6e989d07460165cc5ad3c61f9fd8f1b4796eacbd81cee78957842b834af4", size = 471200, upload-time = "2024-09-04T20:44:36.743Z" }, 92 | { url = "https://files.pythonhosted.org/packages/26/9f/1aab65a6c0db35f43c4d1b4f580e8df53914310afc10ae0397d29d697af4/cffi-1.17.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dd398dbc6773384a17fe0d3e7eeb8d1a21c2200473ee6806bb5e6a8e62bb73dd", size = 479447, upload-time = "2024-09-04T20:44:38.492Z" }, 93 | { url = "https://files.pythonhosted.org/packages/5f/e4/fb8b3dd8dc0e98edf1135ff067ae070bb32ef9d509d6cb0f538cd6f7483f/cffi-1.17.1-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:3edc8d958eb099c634dace3c7e16560ae474aa3803a5df240542b305d14e14ed", size = 484358, upload-time = "2024-09-04T20:44:40.046Z" }, 94 | { url = "https://files.pythonhosted.org/packages/f1/47/d7145bf2dc04684935d57d67dff9d6d795b2ba2796806bb109864be3a151/cffi-1.17.1-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:72e72408cad3d5419375fc87d289076ee319835bdfa2caad331e377589aebba9", size = 488469, upload-time = "2024-09-04T20:44:41.616Z" }, 95 | { url = "https://files.pythonhosted.org/packages/bf/ee/f94057fa6426481d663b88637a9a10e859e492c73d0384514a17d78ee205/cffi-1.17.1-cp313-cp313-win32.whl", hash = "sha256:e03eab0a8677fa80d646b5ddece1cbeaf556c313dcfac435ba11f107ba117b5d", size = 172475, upload-time = "2024-09-04T20:44:43.733Z" }, 96 | { url = "https://files.pythonhosted.org/packages/7c/fc/6a8cb64e5f0324877d503c854da15d76c1e50eb722e320b15345c4d0c6de/cffi-1.17.1-cp313-cp313-win_amd64.whl", hash = "sha256:f6a16c31041f09ead72d69f583767292f750d24913dadacf5756b966aacb3f1a", size = 182009, upload-time = "2024-09-04T20:44:45.309Z" }, 97 | ] 98 | 99 | [[package]] 100 | name = "charset-normalizer" 101 | version = "3.4.2" 102 | source = { registry = "https://pypi.org/simple" } 103 | sdist = { url = "https://files.pythonhosted.org/packages/e4/33/89c2ced2b67d1c2a61c19c6751aa8902d46ce3dacb23600a283619f5a12d/charset_normalizer-3.4.2.tar.gz", hash = "sha256:5baececa9ecba31eff645232d59845c07aa030f0c81ee70184a90d35099a0e63", size = 126367, upload-time = "2025-05-02T08:34:42.01Z" } 104 | wheels = [ 105 | { url = "https://files.pythonhosted.org/packages/95/28/9901804da60055b406e1a1c5ba7aac1276fb77f1dde635aabfc7fd84b8ab/charset_normalizer-3.4.2-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:7c48ed483eb946e6c04ccbe02c6b4d1d48e51944b6db70f697e089c193404941", size = 201818, upload-time = "2025-05-02T08:31:46.725Z" }, 106 | { url = "https://files.pythonhosted.org/packages/d9/9b/892a8c8af9110935e5adcbb06d9c6fe741b6bb02608c6513983048ba1a18/charset_normalizer-3.4.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b2d318c11350e10662026ad0eb71bb51c7812fc8590825304ae0bdd4ac283acd", size = 144649, upload-time = "2025-05-02T08:31:48.889Z" }, 107 | { url = "https://files.pythonhosted.org/packages/7b/a5/4179abd063ff6414223575e008593861d62abfc22455b5d1a44995b7c101/charset_normalizer-3.4.2-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9cbfacf36cb0ec2897ce0ebc5d08ca44213af24265bd56eca54bee7923c48fd6", size = 155045, upload-time = "2025-05-02T08:31:50.757Z" }, 108 | { url = "https://files.pythonhosted.org/packages/3b/95/bc08c7dfeddd26b4be8c8287b9bb055716f31077c8b0ea1cd09553794665/charset_normalizer-3.4.2-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:18dd2e350387c87dabe711b86f83c9c78af772c748904d372ade190b5c7c9d4d", size = 147356, upload-time = "2025-05-02T08:31:52.634Z" }, 109 | { url = "https://files.pythonhosted.org/packages/a8/2d/7a5b635aa65284bf3eab7653e8b4151ab420ecbae918d3e359d1947b4d61/charset_normalizer-3.4.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8075c35cd58273fee266c58c0c9b670947c19df5fb98e7b66710e04ad4e9ff86", size = 149471, upload-time = "2025-05-02T08:31:56.207Z" }, 110 | { url = "https://files.pythonhosted.org/packages/ae/38/51fc6ac74251fd331a8cfdb7ec57beba8c23fd5493f1050f71c87ef77ed0/charset_normalizer-3.4.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5bf4545e3b962767e5c06fe1738f951f77d27967cb2caa64c28be7c4563e162c", size = 151317, upload-time = "2025-05-02T08:31:57.613Z" }, 111 | { url = "https://files.pythonhosted.org/packages/b7/17/edee1e32215ee6e9e46c3e482645b46575a44a2d72c7dfd49e49f60ce6bf/charset_normalizer-3.4.2-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:7a6ab32f7210554a96cd9e33abe3ddd86732beeafc7a28e9955cdf22ffadbab0", size = 146368, upload-time = "2025-05-02T08:31:59.468Z" }, 112 | { url = "https://files.pythonhosted.org/packages/26/2c/ea3e66f2b5f21fd00b2825c94cafb8c326ea6240cd80a91eb09e4a285830/charset_normalizer-3.4.2-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:b33de11b92e9f75a2b545d6e9b6f37e398d86c3e9e9653c4864eb7e89c5773ef", size = 154491, upload-time = "2025-05-02T08:32:01.219Z" }, 113 | { url = "https://files.pythonhosted.org/packages/52/47/7be7fa972422ad062e909fd62460d45c3ef4c141805b7078dbab15904ff7/charset_normalizer-3.4.2-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:8755483f3c00d6c9a77f490c17e6ab0c8729e39e6390328e42521ef175380ae6", size = 157695, upload-time = "2025-05-02T08:32:03.045Z" }, 114 | { url = "https://files.pythonhosted.org/packages/2f/42/9f02c194da282b2b340f28e5fb60762de1151387a36842a92b533685c61e/charset_normalizer-3.4.2-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:68a328e5f55ec37c57f19ebb1fdc56a248db2e3e9ad769919a58672958e8f366", size = 154849, upload-time = "2025-05-02T08:32:04.651Z" }, 115 | { url = "https://files.pythonhosted.org/packages/67/44/89cacd6628f31fb0b63201a618049be4be2a7435a31b55b5eb1c3674547a/charset_normalizer-3.4.2-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:21b2899062867b0e1fde9b724f8aecb1af14f2778d69aacd1a5a1853a597a5db", size = 150091, upload-time = "2025-05-02T08:32:06.719Z" }, 116 | { url = "https://files.pythonhosted.org/packages/1f/79/4b8da9f712bc079c0f16b6d67b099b0b8d808c2292c937f267d816ec5ecc/charset_normalizer-3.4.2-cp310-cp310-win32.whl", hash = "sha256:e8082b26888e2f8b36a042a58307d5b917ef2b1cacab921ad3323ef91901c71a", size = 98445, upload-time = "2025-05-02T08:32:08.66Z" }, 117 | { url = "https://files.pythonhosted.org/packages/7d/d7/96970afb4fb66497a40761cdf7bd4f6fca0fc7bafde3a84f836c1f57a926/charset_normalizer-3.4.2-cp310-cp310-win_amd64.whl", hash = "sha256:f69a27e45c43520f5487f27627059b64aaf160415589230992cec34c5e18a509", size = 105782, upload-time = "2025-05-02T08:32:10.46Z" }, 118 | { url = "https://files.pythonhosted.org/packages/05/85/4c40d00dcc6284a1c1ad5de5e0996b06f39d8232f1031cd23c2f5c07ee86/charset_normalizer-3.4.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:be1e352acbe3c78727a16a455126d9ff83ea2dfdcbc83148d2982305a04714c2", size = 198794, upload-time = "2025-05-02T08:32:11.945Z" }, 119 | { url = "https://files.pythonhosted.org/packages/41/d9/7a6c0b9db952598e97e93cbdfcb91bacd89b9b88c7c983250a77c008703c/charset_normalizer-3.4.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:aa88ca0b1932e93f2d961bf3addbb2db902198dca337d88c89e1559e066e7645", size = 142846, upload-time = "2025-05-02T08:32:13.946Z" }, 120 | { url = "https://files.pythonhosted.org/packages/66/82/a37989cda2ace7e37f36c1a8ed16c58cf48965a79c2142713244bf945c89/charset_normalizer-3.4.2-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d524ba3f1581b35c03cb42beebab4a13e6cdad7b36246bd22541fa585a56cccd", size = 153350, upload-time = "2025-05-02T08:32:15.873Z" }, 121 | { url = "https://files.pythonhosted.org/packages/df/68/a576b31b694d07b53807269d05ec3f6f1093e9545e8607121995ba7a8313/charset_normalizer-3.4.2-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:28a1005facc94196e1fb3e82a3d442a9d9110b8434fc1ded7a24a2983c9888d8", size = 145657, upload-time = "2025-05-02T08:32:17.283Z" }, 122 | { url = "https://files.pythonhosted.org/packages/92/9b/ad67f03d74554bed3aefd56fe836e1623a50780f7c998d00ca128924a499/charset_normalizer-3.4.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fdb20a30fe1175ecabed17cbf7812f7b804b8a315a25f24678bcdf120a90077f", size = 147260, upload-time = "2025-05-02T08:32:18.807Z" }, 123 | { url = "https://files.pythonhosted.org/packages/a6/e6/8aebae25e328160b20e31a7e9929b1578bbdc7f42e66f46595a432f8539e/charset_normalizer-3.4.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0f5d9ed7f254402c9e7d35d2f5972c9bbea9040e99cd2861bd77dc68263277c7", size = 149164, upload-time = "2025-05-02T08:32:20.333Z" }, 124 | { url = "https://files.pythonhosted.org/packages/8b/f2/b3c2f07dbcc248805f10e67a0262c93308cfa149a4cd3d1fe01f593e5fd2/charset_normalizer-3.4.2-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:efd387a49825780ff861998cd959767800d54f8308936b21025326de4b5a42b9", size = 144571, upload-time = "2025-05-02T08:32:21.86Z" }, 125 | { url = "https://files.pythonhosted.org/packages/60/5b/c3f3a94bc345bc211622ea59b4bed9ae63c00920e2e8f11824aa5708e8b7/charset_normalizer-3.4.2-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:f0aa37f3c979cf2546b73e8222bbfa3dc07a641585340179d768068e3455e544", size = 151952, upload-time = "2025-05-02T08:32:23.434Z" }, 126 | { url = "https://files.pythonhosted.org/packages/e2/4d/ff460c8b474122334c2fa394a3f99a04cf11c646da895f81402ae54f5c42/charset_normalizer-3.4.2-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:e70e990b2137b29dc5564715de1e12701815dacc1d056308e2b17e9095372a82", size = 155959, upload-time = "2025-05-02T08:32:24.993Z" }, 127 | { url = "https://files.pythonhosted.org/packages/a2/2b/b964c6a2fda88611a1fe3d4c400d39c66a42d6c169c924818c848f922415/charset_normalizer-3.4.2-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:0c8c57f84ccfc871a48a47321cfa49ae1df56cd1d965a09abe84066f6853b9c0", size = 153030, upload-time = "2025-05-02T08:32:26.435Z" }, 128 | { url = "https://files.pythonhosted.org/packages/59/2e/d3b9811db26a5ebf444bc0fa4f4be5aa6d76fc6e1c0fd537b16c14e849b6/charset_normalizer-3.4.2-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:6b66f92b17849b85cad91259efc341dce9c1af48e2173bf38a85c6329f1033e5", size = 148015, upload-time = "2025-05-02T08:32:28.376Z" }, 129 | { url = "https://files.pythonhosted.org/packages/90/07/c5fd7c11eafd561bb51220d600a788f1c8d77c5eef37ee49454cc5c35575/charset_normalizer-3.4.2-cp311-cp311-win32.whl", hash = "sha256:daac4765328a919a805fa5e2720f3e94767abd632ae410a9062dff5412bae65a", size = 98106, upload-time = "2025-05-02T08:32:30.281Z" }, 130 | { url = "https://files.pythonhosted.org/packages/a8/05/5e33dbef7e2f773d672b6d79f10ec633d4a71cd96db6673625838a4fd532/charset_normalizer-3.4.2-cp311-cp311-win_amd64.whl", hash = "sha256:e53efc7c7cee4c1e70661e2e112ca46a575f90ed9ae3fef200f2a25e954f4b28", size = 105402, upload-time = "2025-05-02T08:32:32.191Z" }, 131 | { url = "https://files.pythonhosted.org/packages/d7/a4/37f4d6035c89cac7930395a35cc0f1b872e652eaafb76a6075943754f095/charset_normalizer-3.4.2-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:0c29de6a1a95f24b9a1aa7aefd27d2487263f00dfd55a77719b530788f75cff7", size = 199936, upload-time = "2025-05-02T08:32:33.712Z" }, 132 | { url = "https://files.pythonhosted.org/packages/ee/8a/1a5e33b73e0d9287274f899d967907cd0bf9c343e651755d9307e0dbf2b3/charset_normalizer-3.4.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cddf7bd982eaa998934a91f69d182aec997c6c468898efe6679af88283b498d3", size = 143790, upload-time = "2025-05-02T08:32:35.768Z" }, 133 | { url = "https://files.pythonhosted.org/packages/66/52/59521f1d8e6ab1482164fa21409c5ef44da3e9f653c13ba71becdd98dec3/charset_normalizer-3.4.2-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:fcbe676a55d7445b22c10967bceaaf0ee69407fbe0ece4d032b6eb8d4565982a", size = 153924, upload-time = "2025-05-02T08:32:37.284Z" }, 134 | { url = "https://files.pythonhosted.org/packages/86/2d/fb55fdf41964ec782febbf33cb64be480a6b8f16ded2dbe8db27a405c09f/charset_normalizer-3.4.2-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d41c4d287cfc69060fa91cae9683eacffad989f1a10811995fa309df656ec214", size = 146626, upload-time = "2025-05-02T08:32:38.803Z" }, 135 | { url = "https://files.pythonhosted.org/packages/8c/73/6ede2ec59bce19b3edf4209d70004253ec5f4e319f9a2e3f2f15601ed5f7/charset_normalizer-3.4.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4e594135de17ab3866138f496755f302b72157d115086d100c3f19370839dd3a", size = 148567, upload-time = "2025-05-02T08:32:40.251Z" }, 136 | { url = "https://files.pythonhosted.org/packages/09/14/957d03c6dc343c04904530b6bef4e5efae5ec7d7990a7cbb868e4595ee30/charset_normalizer-3.4.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:cf713fe9a71ef6fd5adf7a79670135081cd4431c2943864757f0fa3a65b1fafd", size = 150957, upload-time = "2025-05-02T08:32:41.705Z" }, 137 | { url = "https://files.pythonhosted.org/packages/0d/c8/8174d0e5c10ccebdcb1b53cc959591c4c722a3ad92461a273e86b9f5a302/charset_normalizer-3.4.2-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:a370b3e078e418187da8c3674eddb9d983ec09445c99a3a263c2011993522981", size = 145408, upload-time = "2025-05-02T08:32:43.709Z" }, 138 | { url = "https://files.pythonhosted.org/packages/58/aa/8904b84bc8084ac19dc52feb4f5952c6df03ffb460a887b42615ee1382e8/charset_normalizer-3.4.2-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:a955b438e62efdf7e0b7b52a64dc5c3396e2634baa62471768a64bc2adb73d5c", size = 153399, upload-time = "2025-05-02T08:32:46.197Z" }, 139 | { url = "https://files.pythonhosted.org/packages/c2/26/89ee1f0e264d201cb65cf054aca6038c03b1a0c6b4ae998070392a3ce605/charset_normalizer-3.4.2-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:7222ffd5e4de8e57e03ce2cef95a4c43c98fcb72ad86909abdfc2c17d227fc1b", size = 156815, upload-time = "2025-05-02T08:32:48.105Z" }, 140 | { url = "https://files.pythonhosted.org/packages/fd/07/68e95b4b345bad3dbbd3a8681737b4338ff2c9df29856a6d6d23ac4c73cb/charset_normalizer-3.4.2-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:bee093bf902e1d8fc0ac143c88902c3dfc8941f7ea1d6a8dd2bcb786d33db03d", size = 154537, upload-time = "2025-05-02T08:32:49.719Z" }, 141 | { url = "https://files.pythonhosted.org/packages/77/1a/5eefc0ce04affb98af07bc05f3bac9094513c0e23b0562d64af46a06aae4/charset_normalizer-3.4.2-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:dedb8adb91d11846ee08bec4c8236c8549ac721c245678282dcb06b221aab59f", size = 149565, upload-time = "2025-05-02T08:32:51.404Z" }, 142 | { url = "https://files.pythonhosted.org/packages/37/a0/2410e5e6032a174c95e0806b1a6585eb21e12f445ebe239fac441995226a/charset_normalizer-3.4.2-cp312-cp312-win32.whl", hash = "sha256:db4c7bf0e07fc3b7d89ac2a5880a6a8062056801b83ff56d8464b70f65482b6c", size = 98357, upload-time = "2025-05-02T08:32:53.079Z" }, 143 | { url = "https://files.pythonhosted.org/packages/6c/4f/c02d5c493967af3eda9c771ad4d2bbc8df6f99ddbeb37ceea6e8716a32bc/charset_normalizer-3.4.2-cp312-cp312-win_amd64.whl", hash = "sha256:5a9979887252a82fefd3d3ed2a8e3b937a7a809f65dcb1e068b090e165bbe99e", size = 105776, upload-time = "2025-05-02T08:32:54.573Z" }, 144 | { url = "https://files.pythonhosted.org/packages/ea/12/a93df3366ed32db1d907d7593a94f1fe6293903e3e92967bebd6950ed12c/charset_normalizer-3.4.2-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:926ca93accd5d36ccdabd803392ddc3e03e6d4cd1cf17deff3b989ab8e9dbcf0", size = 199622, upload-time = "2025-05-02T08:32:56.363Z" }, 145 | { url = "https://files.pythonhosted.org/packages/04/93/bf204e6f344c39d9937d3c13c8cd5bbfc266472e51fc8c07cb7f64fcd2de/charset_normalizer-3.4.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:eba9904b0f38a143592d9fc0e19e2df0fa2e41c3c3745554761c5f6447eedabf", size = 143435, upload-time = "2025-05-02T08:32:58.551Z" }, 146 | { url = "https://files.pythonhosted.org/packages/22/2a/ea8a2095b0bafa6c5b5a55ffdc2f924455233ee7b91c69b7edfcc9e02284/charset_normalizer-3.4.2-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3fddb7e2c84ac87ac3a947cb4e66d143ca5863ef48e4a5ecb83bd48619e4634e", size = 153653, upload-time = "2025-05-02T08:33:00.342Z" }, 147 | { url = "https://files.pythonhosted.org/packages/b6/57/1b090ff183d13cef485dfbe272e2fe57622a76694061353c59da52c9a659/charset_normalizer-3.4.2-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:98f862da73774290f251b9df8d11161b6cf25b599a66baf087c1ffe340e9bfd1", size = 146231, upload-time = "2025-05-02T08:33:02.081Z" }, 148 | { url = "https://files.pythonhosted.org/packages/e2/28/ffc026b26f441fc67bd21ab7f03b313ab3fe46714a14b516f931abe1a2d8/charset_normalizer-3.4.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6c9379d65defcab82d07b2a9dfbfc2e95bc8fe0ebb1b176a3190230a3ef0e07c", size = 148243, upload-time = "2025-05-02T08:33:04.063Z" }, 149 | { url = "https://files.pythonhosted.org/packages/c0/0f/9abe9bd191629c33e69e47c6ef45ef99773320e9ad8e9cb08b8ab4a8d4cb/charset_normalizer-3.4.2-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e635b87f01ebc977342e2697d05b56632f5f879a4f15955dfe8cef2448b51691", size = 150442, upload-time = "2025-05-02T08:33:06.418Z" }, 150 | { url = "https://files.pythonhosted.org/packages/67/7c/a123bbcedca91d5916c056407f89a7f5e8fdfce12ba825d7d6b9954a1a3c/charset_normalizer-3.4.2-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:1c95a1e2902a8b722868587c0e1184ad5c55631de5afc0eb96bc4b0d738092c0", size = 145147, upload-time = "2025-05-02T08:33:08.183Z" }, 151 | { url = "https://files.pythonhosted.org/packages/ec/fe/1ac556fa4899d967b83e9893788e86b6af4d83e4726511eaaad035e36595/charset_normalizer-3.4.2-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:ef8de666d6179b009dce7bcb2ad4c4a779f113f12caf8dc77f0162c29d20490b", size = 153057, upload-time = "2025-05-02T08:33:09.986Z" }, 152 | { url = "https://files.pythonhosted.org/packages/2b/ff/acfc0b0a70b19e3e54febdd5301a98b72fa07635e56f24f60502e954c461/charset_normalizer-3.4.2-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:32fc0341d72e0f73f80acb0a2c94216bd704f4f0bce10aedea38f30502b271ff", size = 156454, upload-time = "2025-05-02T08:33:11.814Z" }, 153 | { url = "https://files.pythonhosted.org/packages/92/08/95b458ce9c740d0645feb0e96cea1f5ec946ea9c580a94adfe0b617f3573/charset_normalizer-3.4.2-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:289200a18fa698949d2b39c671c2cc7a24d44096784e76614899a7ccf2574b7b", size = 154174, upload-time = "2025-05-02T08:33:13.707Z" }, 154 | { url = "https://files.pythonhosted.org/packages/78/be/8392efc43487ac051eee6c36d5fbd63032d78f7728cb37aebcc98191f1ff/charset_normalizer-3.4.2-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:4a476b06fbcf359ad25d34a057b7219281286ae2477cc5ff5e3f70a246971148", size = 149166, upload-time = "2025-05-02T08:33:15.458Z" }, 155 | { url = "https://files.pythonhosted.org/packages/44/96/392abd49b094d30b91d9fbda6a69519e95802250b777841cf3bda8fe136c/charset_normalizer-3.4.2-cp313-cp313-win32.whl", hash = "sha256:aaeeb6a479c7667fbe1099af9617c83aaca22182d6cf8c53966491a0f1b7ffb7", size = 98064, upload-time = "2025-05-02T08:33:17.06Z" }, 156 | { url = "https://files.pythonhosted.org/packages/e9/b0/0200da600134e001d91851ddc797809e2fe0ea72de90e09bec5a2fbdaccb/charset_normalizer-3.4.2-cp313-cp313-win_amd64.whl", hash = "sha256:aa6af9e7d59f9c12b33ae4e9450619cf2488e2bbe9b44030905877f0b2324980", size = 105641, upload-time = "2025-05-02T08:33:18.753Z" }, 157 | { url = "https://files.pythonhosted.org/packages/20/94/c5790835a017658cbfabd07f3bfb549140c3ac458cfc196323996b10095a/charset_normalizer-3.4.2-py3-none-any.whl", hash = "sha256:7f56930ab0abd1c45cd15be65cc741c28b1c9a34876ce8c17a2fa107810c0af0", size = 52626, upload-time = "2025-05-02T08:34:40.053Z" }, 158 | ] 159 | 160 | [[package]] 161 | name = "colorama" 162 | version = "0.4.6" 163 | source = { registry = "https://pypi.org/simple" } 164 | sdist = { url = "https://files.pythonhosted.org/packages/d8/53/6f443c9a4a8358a93a6792e2acffb9d9d5cb0a5cfd8802644b7b1c9a02e4/colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44", size = 27697, upload-time = "2022-10-25T02:36:22.414Z" } 165 | wheels = [ 166 | { url = "https://files.pythonhosted.org/packages/d1/d6/3965ed04c63042e047cb6a3e6ed1a63a35087b6a609aa3a15ed8ac56c221/colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6", size = 25335, upload-time = "2022-10-25T02:36:20.889Z" }, 167 | ] 168 | 169 | [[package]] 170 | name = "comm" 171 | version = "0.2.2" 172 | source = { registry = "https://pypi.org/simple" } 173 | dependencies = [ 174 | { name = "traitlets" }, 175 | ] 176 | sdist = { url = "https://files.pythonhosted.org/packages/e9/a8/fb783cb0abe2b5fded9f55e5703015cdf1c9c85b3669087c538dd15a6a86/comm-0.2.2.tar.gz", hash = "sha256:3fd7a84065306e07bea1773df6eb8282de51ba82f77c72f9c85716ab11fe980e", size = 6210, upload-time = "2024-03-12T16:53:41.133Z" } 177 | wheels = [ 178 | { url = "https://files.pythonhosted.org/packages/e6/75/49e5bfe642f71f272236b5b2d2691cf915a7283cc0ceda56357b61daa538/comm-0.2.2-py3-none-any.whl", hash = "sha256:e6fb86cb70ff661ee8c9c14e7d36d6de3b4066f1441be4063df9c5009f0a64d3", size = 7180, upload-time = "2024-03-12T16:53:39.226Z" }, 179 | ] 180 | 181 | [[package]] 182 | name = "config-manager" 183 | version = "0.1.0" 184 | source = { git = "https://github.com/VLMHyperBenchTeam/config_manager.git?rev=0.1.2#10584a5debd61daec212ab7c09af3a44d04e84bb" } 185 | 186 | [[package]] 187 | name = "debugpy" 188 | version = "1.8.14" 189 | source = { registry = "https://pypi.org/simple" } 190 | sdist = { url = "https://files.pythonhosted.org/packages/bd/75/087fe07d40f490a78782ff3b0a30e3968936854105487decdb33446d4b0e/debugpy-1.8.14.tar.gz", hash = "sha256:7cd287184318416850aa8b60ac90105837bb1e59531898c07569d197d2ed5322", size = 1641444, upload-time = "2025-04-10T19:46:10.981Z" } 191 | wheels = [ 192 | { url = "https://files.pythonhosted.org/packages/fc/df/156df75a41aaebd97cee9d3870fe68f8001b6c1c4ca023e221cfce69bece/debugpy-1.8.14-cp310-cp310-macosx_14_0_x86_64.whl", hash = "sha256:93fee753097e85623cab1c0e6a68c76308cd9f13ffdf44127e6fab4fbf024339", size = 2076510, upload-time = "2025-04-10T19:46:13.315Z" }, 193 | { url = "https://files.pythonhosted.org/packages/69/cd/4fc391607bca0996db5f3658762106e3d2427beaef9bfd363fd370a3c054/debugpy-1.8.14-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3d937d93ae4fa51cdc94d3e865f535f185d5f9748efb41d0d49e33bf3365bd79", size = 3559614, upload-time = "2025-04-10T19:46:14.647Z" }, 194 | { url = "https://files.pythonhosted.org/packages/1a/42/4e6d2b9d63e002db79edfd0cb5656f1c403958915e0e73ab3e9220012eec/debugpy-1.8.14-cp310-cp310-win32.whl", hash = "sha256:c442f20577b38cc7a9aafecffe1094f78f07fb8423c3dddb384e6b8f49fd2987", size = 5208588, upload-time = "2025-04-10T19:46:16.233Z" }, 195 | { url = "https://files.pythonhosted.org/packages/97/b1/cc9e4e5faadc9d00df1a64a3c2d5c5f4b9df28196c39ada06361c5141f89/debugpy-1.8.14-cp310-cp310-win_amd64.whl", hash = "sha256:f117dedda6d969c5c9483e23f573b38f4e39412845c7bc487b6f2648df30fe84", size = 5241043, upload-time = "2025-04-10T19:46:17.768Z" }, 196 | { url = "https://files.pythonhosted.org/packages/67/e8/57fe0c86915671fd6a3d2d8746e40485fd55e8d9e682388fbb3a3d42b86f/debugpy-1.8.14-cp311-cp311-macosx_14_0_universal2.whl", hash = "sha256:1b2ac8c13b2645e0b1eaf30e816404990fbdb168e193322be8f545e8c01644a9", size = 2175064, upload-time = "2025-04-10T19:46:19.486Z" }, 197 | { url = "https://files.pythonhosted.org/packages/3b/97/2b2fd1b1c9569c6764ccdb650a6f752e4ac31be465049563c9eb127a8487/debugpy-1.8.14-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cf431c343a99384ac7eab2f763980724834f933a271e90496944195318c619e2", size = 3132359, upload-time = "2025-04-10T19:46:21.192Z" }, 198 | { url = "https://files.pythonhosted.org/packages/c0/ee/b825c87ed06256ee2a7ed8bab8fb3bb5851293bf9465409fdffc6261c426/debugpy-1.8.14-cp311-cp311-win32.whl", hash = "sha256:c99295c76161ad8d507b413cd33422d7c542889fbb73035889420ac1fad354f2", size = 5133269, upload-time = "2025-04-10T19:46:23.047Z" }, 199 | { url = "https://files.pythonhosted.org/packages/d5/a6/6c70cd15afa43d37839d60f324213843174c1d1e6bb616bd89f7c1341bac/debugpy-1.8.14-cp311-cp311-win_amd64.whl", hash = "sha256:7816acea4a46d7e4e50ad8d09d963a680ecc814ae31cdef3622eb05ccacf7b01", size = 5158156, upload-time = "2025-04-10T19:46:24.521Z" }, 200 | { url = "https://files.pythonhosted.org/packages/d9/2a/ac2df0eda4898f29c46eb6713a5148e6f8b2b389c8ec9e425a4a1d67bf07/debugpy-1.8.14-cp312-cp312-macosx_14_0_universal2.whl", hash = "sha256:8899c17920d089cfa23e6005ad9f22582fd86f144b23acb9feeda59e84405b84", size = 2501268, upload-time = "2025-04-10T19:46:26.044Z" }, 201 | { url = "https://files.pythonhosted.org/packages/10/53/0a0cb5d79dd9f7039169f8bf94a144ad3efa52cc519940b3b7dde23bcb89/debugpy-1.8.14-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f6bb5c0dcf80ad5dbc7b7d6eac484e2af34bdacdf81df09b6a3e62792b722826", size = 4221077, upload-time = "2025-04-10T19:46:27.464Z" }, 202 | { url = "https://files.pythonhosted.org/packages/f8/d5/84e01821f362327bf4828728aa31e907a2eca7c78cd7c6ec062780d249f8/debugpy-1.8.14-cp312-cp312-win32.whl", hash = "sha256:281d44d248a0e1791ad0eafdbbd2912ff0de9eec48022a5bfbc332957487ed3f", size = 5255127, upload-time = "2025-04-10T19:46:29.467Z" }, 203 | { url = "https://files.pythonhosted.org/packages/33/16/1ed929d812c758295cac7f9cf3dab5c73439c83d9091f2d91871e648093e/debugpy-1.8.14-cp312-cp312-win_amd64.whl", hash = "sha256:5aa56ef8538893e4502a7d79047fe39b1dae08d9ae257074c6464a7b290b806f", size = 5297249, upload-time = "2025-04-10T19:46:31.538Z" }, 204 | { url = "https://files.pythonhosted.org/packages/4d/e4/395c792b243f2367d84202dc33689aa3d910fb9826a7491ba20fc9e261f5/debugpy-1.8.14-cp313-cp313-macosx_14_0_universal2.whl", hash = "sha256:329a15d0660ee09fec6786acdb6e0443d595f64f5d096fc3e3ccf09a4259033f", size = 2485676, upload-time = "2025-04-10T19:46:32.96Z" }, 205 | { url = "https://files.pythonhosted.org/packages/ba/f1/6f2ee3f991327ad9e4c2f8b82611a467052a0fb0e247390192580e89f7ff/debugpy-1.8.14-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0f920c7f9af409d90f5fd26e313e119d908b0dd2952c2393cd3247a462331f15", size = 4217514, upload-time = "2025-04-10T19:46:34.336Z" }, 206 | { url = "https://files.pythonhosted.org/packages/79/28/b9d146f8f2dc535c236ee09ad3e5ac899adb39d7a19b49f03ac95d216beb/debugpy-1.8.14-cp313-cp313-win32.whl", hash = "sha256:3784ec6e8600c66cbdd4ca2726c72d8ca781e94bce2f396cc606d458146f8f4e", size = 5254756, upload-time = "2025-04-10T19:46:36.199Z" }, 207 | { url = "https://files.pythonhosted.org/packages/e0/62/a7b4a57013eac4ccaef6977966e6bec5c63906dd25a86e35f155952e29a1/debugpy-1.8.14-cp313-cp313-win_amd64.whl", hash = "sha256:684eaf43c95a3ec39a96f1f5195a7ff3d4144e4a18d69bb66beeb1a6de605d6e", size = 5297119, upload-time = "2025-04-10T19:46:38.141Z" }, 208 | { url = "https://files.pythonhosted.org/packages/97/1a/481f33c37ee3ac8040d3d51fc4c4e4e7e61cb08b8bc8971d6032acc2279f/debugpy-1.8.14-py2.py3-none-any.whl", hash = "sha256:5cd9a579d553b6cb9759a7908a41988ee6280b961f24f63336835d9418216a20", size = 5256230, upload-time = "2025-04-10T19:46:54.077Z" }, 209 | ] 210 | 211 | [[package]] 212 | name = "decorator" 213 | version = "5.2.1" 214 | source = { registry = "https://pypi.org/simple" } 215 | sdist = { url = "https://files.pythonhosted.org/packages/43/fa/6d96a0978d19e17b68d634497769987b16c8f4cd0a7a05048bec693caa6b/decorator-5.2.1.tar.gz", hash = "sha256:65f266143752f734b0a7cc83c46f4618af75b8c5911b00ccb61d0ac9b6da0360", size = 56711, upload-time = "2025-02-24T04:41:34.073Z" } 216 | wheels = [ 217 | { url = "https://files.pythonhosted.org/packages/4e/8c/f3147f5c4b73e7550fe5f9352eaa956ae838d5c51eb58e7a25b9f3e2643b/decorator-5.2.1-py3-none-any.whl", hash = "sha256:d316bb415a2d9e2d2b3abcc4084c6502fc09240e292cd76a76afc106a1c8e04a", size = 9190, upload-time = "2025-02-24T04:41:32.565Z" }, 218 | ] 219 | 220 | [[package]] 221 | name = "docker" 222 | version = "7.1.0" 223 | source = { registry = "https://pypi.org/simple" } 224 | dependencies = [ 225 | { name = "pywin32", marker = "sys_platform == 'win32'" }, 226 | { name = "requests" }, 227 | { name = "urllib3" }, 228 | ] 229 | sdist = { url = "https://files.pythonhosted.org/packages/91/9b/4a2ea29aeba62471211598dac5d96825bb49348fa07e906ea930394a83ce/docker-7.1.0.tar.gz", hash = "sha256:ad8c70e6e3f8926cb8a92619b832b4ea5299e2831c14284663184e200546fa6c", size = 117834, upload-time = "2024-05-23T11:13:57.216Z" } 230 | wheels = [ 231 | { url = "https://files.pythonhosted.org/packages/e3/26/57c6fb270950d476074c087527a558ccb6f4436657314bfb6cdf484114c4/docker-7.1.0-py3-none-any.whl", hash = "sha256:c96b93b7f0a746f9e77d325bcfb87422a3d8bd4f03136ae8a85b37f1898d5fc0", size = 147774, upload-time = "2024-05-23T11:13:55.01Z" }, 232 | ] 233 | 234 | [[package]] 235 | name = "exceptiongroup" 236 | version = "1.3.0" 237 | source = { registry = "https://pypi.org/simple" } 238 | dependencies = [ 239 | { name = "typing-extensions", marker = "python_full_version < '3.11'" }, 240 | ] 241 | sdist = { url = "https://files.pythonhosted.org/packages/0b/9f/a65090624ecf468cdca03533906e7c69ed7588582240cfe7cc9e770b50eb/exceptiongroup-1.3.0.tar.gz", hash = "sha256:b241f5885f560bc56a59ee63ca4c6a8bfa46ae4ad651af316d4e81817bb9fd88", size = 29749, upload-time = "2025-05-10T17:42:51.123Z" } 242 | wheels = [ 243 | { url = "https://files.pythonhosted.org/packages/36/f4/c6e662dade71f56cd2f3735141b265c3c79293c109549c1e6933b0651ffc/exceptiongroup-1.3.0-py3-none-any.whl", hash = "sha256:4d111e6e0c13d0644cad6ddaa7ed0261a0b36971f6d23e7ec9b4b9097da78a10", size = 16674, upload-time = "2025-05-10T17:42:49.33Z" }, 244 | ] 245 | 246 | [[package]] 247 | name = "executing" 248 | version = "2.2.0" 249 | source = { registry = "https://pypi.org/simple" } 250 | sdist = { url = "https://files.pythonhosted.org/packages/91/50/a9d80c47ff289c611ff12e63f7c5d13942c65d68125160cefd768c73e6e4/executing-2.2.0.tar.gz", hash = "sha256:5d108c028108fe2551d1a7b2e8b713341e2cb4fc0aa7dcf966fa4327a5226755", size = 978693, upload-time = "2025-01-22T15:41:29.403Z" } 251 | wheels = [ 252 | { url = "https://files.pythonhosted.org/packages/7b/8f/c4d9bafc34ad7ad5d8dc16dd1347ee0e507a52c3adb6bfa8887e1c6a26ba/executing-2.2.0-py2.py3-none-any.whl", hash = "sha256:11387150cad388d62750327a53d3339fad4888b39a6fe233c3afbb54ecffd3aa", size = 26702, upload-time = "2025-01-22T15:41:25.929Z" }, 253 | ] 254 | 255 | [[package]] 256 | name = "idna" 257 | version = "3.10" 258 | source = { registry = "https://pypi.org/simple" } 259 | sdist = { url = "https://files.pythonhosted.org/packages/f1/70/7703c29685631f5a7590aa73f1f1d3fa9a380e654b86af429e0934a32f7d/idna-3.10.tar.gz", hash = "sha256:12f65c9b470abda6dc35cf8e63cc574b1c52b11df2c86030af0ac09b01b13ea9", size = 190490, upload-time = "2024-09-15T18:07:39.745Z" } 260 | wheels = [ 261 | { url = "https://files.pythonhosted.org/packages/76/c6/c88e154df9c4e1a2a66ccf0005a88dfb2650c1dffb6f5ce603dfbd452ce3/idna-3.10-py3-none-any.whl", hash = "sha256:946d195a0d259cbba61165e88e65941f16e9b36ea6ddb97f00452bae8b1287d3", size = 70442, upload-time = "2024-09-15T18:07:37.964Z" }, 262 | ] 263 | 264 | [[package]] 265 | name = "ipykernel" 266 | version = "6.29.5" 267 | source = { registry = "https://pypi.org/simple" } 268 | dependencies = [ 269 | { name = "appnope", marker = "sys_platform == 'darwin'" }, 270 | { name = "comm" }, 271 | { name = "debugpy" }, 272 | { name = "ipython", version = "8.37.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, 273 | { name = "ipython", version = "9.3.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, 274 | { name = "jupyter-client" }, 275 | { name = "jupyter-core" }, 276 | { name = "matplotlib-inline" }, 277 | { name = "nest-asyncio" }, 278 | { name = "packaging" }, 279 | { name = "psutil" }, 280 | { name = "pyzmq" }, 281 | { name = "tornado" }, 282 | { name = "traitlets" }, 283 | ] 284 | sdist = { url = "https://files.pythonhosted.org/packages/e9/5c/67594cb0c7055dc50814b21731c22a601101ea3b1b50a9a1b090e11f5d0f/ipykernel-6.29.5.tar.gz", hash = "sha256:f093a22c4a40f8828f8e330a9c297cb93dcab13bd9678ded6de8e5cf81c56215", size = 163367, upload-time = "2024-07-01T14:07:22.543Z" } 285 | wheels = [ 286 | { url = "https://files.pythonhosted.org/packages/94/5c/368ae6c01c7628438358e6d337c19b05425727fbb221d2a3c4303c372f42/ipykernel-6.29.5-py3-none-any.whl", hash = "sha256:afdb66ba5aa354b09b91379bac28ae4afebbb30e8b39510c9690afb7a10421b5", size = 117173, upload-time = "2024-07-01T14:07:19.603Z" }, 287 | ] 288 | 289 | [[package]] 290 | name = "ipython" 291 | version = "8.37.0" 292 | source = { registry = "https://pypi.org/simple" } 293 | resolution-markers = [ 294 | "python_full_version < '3.11'", 295 | ] 296 | dependencies = [ 297 | { name = "colorama", marker = "python_full_version < '3.11' and sys_platform == 'win32'" }, 298 | { name = "decorator", marker = "python_full_version < '3.11'" }, 299 | { name = "exceptiongroup", marker = "python_full_version < '3.11'" }, 300 | { name = "jedi", marker = "python_full_version < '3.11'" }, 301 | { name = "matplotlib-inline", marker = "python_full_version < '3.11'" }, 302 | { name = "pexpect", marker = "python_full_version < '3.11' and sys_platform != 'emscripten' and sys_platform != 'win32'" }, 303 | { name = "prompt-toolkit", marker = "python_full_version < '3.11'" }, 304 | { name = "pygments", marker = "python_full_version < '3.11'" }, 305 | { name = "stack-data", marker = "python_full_version < '3.11'" }, 306 | { name = "traitlets", marker = "python_full_version < '3.11'" }, 307 | { name = "typing-extensions", marker = "python_full_version < '3.11'" }, 308 | ] 309 | sdist = { url = "https://files.pythonhosted.org/packages/85/31/10ac88f3357fc276dc8a64e8880c82e80e7459326ae1d0a211b40abf6665/ipython-8.37.0.tar.gz", hash = "sha256:ca815841e1a41a1e6b73a0b08f3038af9b2252564d01fc405356d34033012216", size = 5606088, upload-time = "2025-05-31T16:39:09.613Z" } 310 | wheels = [ 311 | { url = "https://files.pythonhosted.org/packages/91/d0/274fbf7b0b12643cbbc001ce13e6a5b1607ac4929d1b11c72460152c9fc3/ipython-8.37.0-py3-none-any.whl", hash = "sha256:ed87326596b878932dbcb171e3e698845434d8c61b8d8cd474bf663041a9dcf2", size = 831864, upload-time = "2025-05-31T16:39:06.38Z" }, 312 | ] 313 | 314 | [[package]] 315 | name = "ipython" 316 | version = "9.3.0" 317 | source = { registry = "https://pypi.org/simple" } 318 | resolution-markers = [ 319 | "python_full_version >= '3.12'", 320 | "python_full_version == '3.11.*'", 321 | ] 322 | dependencies = [ 323 | { name = "colorama", marker = "python_full_version >= '3.11' and sys_platform == 'win32'" }, 324 | { name = "decorator", marker = "python_full_version >= '3.11'" }, 325 | { name = "ipython-pygments-lexers", marker = "python_full_version >= '3.11'" }, 326 | { name = "jedi", marker = "python_full_version >= '3.11'" }, 327 | { name = "matplotlib-inline", marker = "python_full_version >= '3.11'" }, 328 | { name = "pexpect", marker = "python_full_version >= '3.11' and sys_platform != 'emscripten' and sys_platform != 'win32'" }, 329 | { name = "prompt-toolkit", marker = "python_full_version >= '3.11'" }, 330 | { name = "pygments", marker = "python_full_version >= '3.11'" }, 331 | { name = "stack-data", marker = "python_full_version >= '3.11'" }, 332 | { name = "traitlets", marker = "python_full_version >= '3.11'" }, 333 | { name = "typing-extensions", marker = "python_full_version == '3.11.*'" }, 334 | ] 335 | sdist = { url = "https://files.pythonhosted.org/packages/dc/09/4c7e06b96fbd203e06567b60fb41b06db606b6a82db6db7b2c85bb72a15c/ipython-9.3.0.tar.gz", hash = "sha256:79eb896f9f23f50ad16c3bc205f686f6e030ad246cc309c6279a242b14afe9d8", size = 4426460, upload-time = "2025-05-31T16:34:55.678Z" } 336 | wheels = [ 337 | { url = "https://files.pythonhosted.org/packages/3c/99/9ed3d52d00f1846679e3aa12e2326ac7044b5e7f90dc822b60115fa533ca/ipython-9.3.0-py3-none-any.whl", hash = "sha256:1a0b6dd9221a1f5dddf725b57ac0cb6fddc7b5f470576231ae9162b9b3455a04", size = 605320, upload-time = "2025-05-31T16:34:52.154Z" }, 338 | ] 339 | 340 | [[package]] 341 | name = "ipython-pygments-lexers" 342 | version = "1.1.1" 343 | source = { registry = "https://pypi.org/simple" } 344 | dependencies = [ 345 | { name = "pygments", marker = "python_full_version >= '3.11'" }, 346 | ] 347 | sdist = { url = "https://files.pythonhosted.org/packages/ef/4c/5dd1d8af08107f88c7f741ead7a40854b8ac24ddf9ae850afbcf698aa552/ipython_pygments_lexers-1.1.1.tar.gz", hash = "sha256:09c0138009e56b6854f9535736f4171d855c8c08a563a0dcd8022f78355c7e81", size = 8393, upload-time = "2025-01-17T11:24:34.505Z" } 348 | wheels = [ 349 | { url = "https://files.pythonhosted.org/packages/d9/33/1f075bf72b0b747cb3288d011319aaf64083cf2efef8354174e3ed4540e2/ipython_pygments_lexers-1.1.1-py3-none-any.whl", hash = "sha256:a9462224a505ade19a605f71f8fa63c2048833ce50abc86768a0d81d876dc81c", size = 8074, upload-time = "2025-01-17T11:24:33.271Z" }, 350 | ] 351 | 352 | [[package]] 353 | name = "jedi" 354 | version = "0.19.2" 355 | source = { registry = "https://pypi.org/simple" } 356 | dependencies = [ 357 | { name = "parso" }, 358 | ] 359 | sdist = { url = "https://files.pythonhosted.org/packages/72/3a/79a912fbd4d8dd6fbb02bf69afd3bb72cf0c729bb3063c6f4498603db17a/jedi-0.19.2.tar.gz", hash = "sha256:4770dc3de41bde3966b02eb84fbcf557fb33cce26ad23da12c742fb50ecb11f0", size = 1231287, upload-time = "2024-11-11T01:41:42.873Z" } 360 | wheels = [ 361 | { url = "https://files.pythonhosted.org/packages/c0/5a/9cac0c82afec3d09ccd97c8b6502d48f165f9124db81b4bcb90b4af974ee/jedi-0.19.2-py2.py3-none-any.whl", hash = "sha256:a8ef22bde8490f57fe5c7681a3c83cb58874daf72b4784de3cce5b6ef6edb5b9", size = 1572278, upload-time = "2024-11-11T01:41:40.175Z" }, 362 | ] 363 | 364 | [[package]] 365 | name = "jupyter-client" 366 | version = "8.6.3" 367 | source = { registry = "https://pypi.org/simple" } 368 | dependencies = [ 369 | { name = "jupyter-core" }, 370 | { name = "python-dateutil" }, 371 | { name = "pyzmq" }, 372 | { name = "tornado" }, 373 | { name = "traitlets" }, 374 | ] 375 | sdist = { url = "https://files.pythonhosted.org/packages/71/22/bf9f12fdaeae18019a468b68952a60fe6dbab5d67cd2a103cac7659b41ca/jupyter_client-8.6.3.tar.gz", hash = "sha256:35b3a0947c4a6e9d589eb97d7d4cd5e90f910ee73101611f01283732bd6d9419", size = 342019, upload-time = "2024-09-17T10:44:17.613Z" } 376 | wheels = [ 377 | { url = "https://files.pythonhosted.org/packages/11/85/b0394e0b6fcccd2c1eeefc230978a6f8cb0c5df1e4cd3e7625735a0d7d1e/jupyter_client-8.6.3-py3-none-any.whl", hash = "sha256:e8a19cc986cc45905ac3362915f410f3af85424b4c0905e94fa5f2cb08e8f23f", size = 106105, upload-time = "2024-09-17T10:44:15.218Z" }, 378 | ] 379 | 380 | [[package]] 381 | name = "jupyter-core" 382 | version = "5.8.1" 383 | source = { registry = "https://pypi.org/simple" } 384 | dependencies = [ 385 | { name = "platformdirs" }, 386 | { name = "pywin32", marker = "platform_python_implementation != 'PyPy' and sys_platform == 'win32'" }, 387 | { name = "traitlets" }, 388 | ] 389 | sdist = { url = "https://files.pythonhosted.org/packages/99/1b/72906d554acfeb588332eaaa6f61577705e9ec752ddb486f302dafa292d9/jupyter_core-5.8.1.tar.gz", hash = "sha256:0a5f9706f70e64786b75acba995988915ebd4601c8a52e534a40b51c95f59941", size = 88923, upload-time = "2025-05-27T07:38:16.655Z" } 390 | wheels = [ 391 | { url = "https://files.pythonhosted.org/packages/2f/57/6bffd4b20b88da3800c5d691e0337761576ee688eb01299eae865689d2df/jupyter_core-5.8.1-py3-none-any.whl", hash = "sha256:c28d268fc90fb53f1338ded2eb410704c5449a358406e8a948b75706e24863d0", size = 28880, upload-time = "2025-05-27T07:38:15.137Z" }, 392 | ] 393 | 394 | [[package]] 395 | name = "matplotlib-inline" 396 | version = "0.1.7" 397 | source = { registry = "https://pypi.org/simple" } 398 | dependencies = [ 399 | { name = "traitlets" }, 400 | ] 401 | sdist = { url = "https://files.pythonhosted.org/packages/99/5b/a36a337438a14116b16480db471ad061c36c3694df7c2084a0da7ba538b7/matplotlib_inline-0.1.7.tar.gz", hash = "sha256:8423b23ec666be3d16e16b60bdd8ac4e86e840ebd1dd11a30b9f117f2fa0ab90", size = 8159, upload-time = "2024-04-15T13:44:44.803Z" } 402 | wheels = [ 403 | { url = "https://files.pythonhosted.org/packages/8f/8e/9ad090d3553c280a8060fbf6e24dc1c0c29704ee7d1c372f0c174aa59285/matplotlib_inline-0.1.7-py3-none-any.whl", hash = "sha256:df192d39a4ff8f21b1895d72e6a13f5fcc5099f00fa84384e0ea28c2cc0653ca", size = 9899, upload-time = "2024-04-15T13:44:43.265Z" }, 404 | ] 405 | 406 | [[package]] 407 | name = "nest-asyncio" 408 | version = "1.6.0" 409 | source = { registry = "https://pypi.org/simple" } 410 | sdist = { url = "https://files.pythonhosted.org/packages/83/f8/51569ac65d696c8ecbee95938f89d4abf00f47d58d48f6fbabfe8f0baefe/nest_asyncio-1.6.0.tar.gz", hash = "sha256:6f172d5449aca15afd6c646851f4e31e02c598d553a667e38cafa997cfec55fe", size = 7418, upload-time = "2024-01-21T14:25:19.227Z" } 411 | wheels = [ 412 | { url = "https://files.pythonhosted.org/packages/a0/c4/c2971a3ba4c6103a3d10c4b0f24f461ddc027f0f09763220cf35ca1401b3/nest_asyncio-1.6.0-py3-none-any.whl", hash = "sha256:87af6efd6b5e897c81050477ef65c62e2b2f35d51703cae01aff2905b1852e1c", size = 5195, upload-time = "2024-01-21T14:25:17.223Z" }, 413 | ] 414 | 415 | [[package]] 416 | name = "numpy" 417 | version = "2.2.6" 418 | source = { registry = "https://pypi.org/simple" } 419 | sdist = { url = "https://files.pythonhosted.org/packages/76/21/7d2a95e4bba9dc13d043ee156a356c0a8f0c6309dff6b21b4d71a073b8a8/numpy-2.2.6.tar.gz", hash = "sha256:e29554e2bef54a90aa5cc07da6ce955accb83f21ab5de01a62c8478897b264fd", size = 20276440, upload-time = "2025-05-17T22:38:04.611Z" } 420 | wheels = [ 421 | { url = "https://files.pythonhosted.org/packages/9a/3e/ed6db5be21ce87955c0cbd3009f2803f59fa08df21b5df06862e2d8e2bdd/numpy-2.2.6-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:b412caa66f72040e6d268491a59f2c43bf03eb6c96dd8f0307829feb7fa2b6fb", size = 21165245, upload-time = "2025-05-17T21:27:58.555Z" }, 422 | { url = "https://files.pythonhosted.org/packages/22/c2/4b9221495b2a132cc9d2eb862e21d42a009f5a60e45fc44b00118c174bff/numpy-2.2.6-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:8e41fd67c52b86603a91c1a505ebaef50b3314de0213461c7a6e99c9a3beff90", size = 14360048, upload-time = "2025-05-17T21:28:21.406Z" }, 423 | { url = "https://files.pythonhosted.org/packages/fd/77/dc2fcfc66943c6410e2bf598062f5959372735ffda175b39906d54f02349/numpy-2.2.6-cp310-cp310-macosx_14_0_arm64.whl", hash = "sha256:37e990a01ae6ec7fe7fa1c26c55ecb672dd98b19c3d0e1d1f326fa13cb38d163", size = 5340542, upload-time = "2025-05-17T21:28:30.931Z" }, 424 | { url = "https://files.pythonhosted.org/packages/7a/4f/1cb5fdc353a5f5cc7feb692db9b8ec2c3d6405453f982435efc52561df58/numpy-2.2.6-cp310-cp310-macosx_14_0_x86_64.whl", hash = "sha256:5a6429d4be8ca66d889b7cf70f536a397dc45ba6faeb5f8c5427935d9592e9cf", size = 6878301, upload-time = "2025-05-17T21:28:41.613Z" }, 425 | { url = "https://files.pythonhosted.org/packages/eb/17/96a3acd228cec142fcb8723bd3cc39c2a474f7dcf0a5d16731980bcafa95/numpy-2.2.6-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:efd28d4e9cd7d7a8d39074a4d44c63eda73401580c5c76acda2ce969e0a38e83", size = 14297320, upload-time = "2025-05-17T21:29:02.78Z" }, 426 | { url = "https://files.pythonhosted.org/packages/b4/63/3de6a34ad7ad6646ac7d2f55ebc6ad439dbbf9c4370017c50cf403fb19b5/numpy-2.2.6-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fc7b73d02efb0e18c000e9ad8b83480dfcd5dfd11065997ed4c6747470ae8915", size = 16801050, upload-time = "2025-05-17T21:29:27.675Z" }, 427 | { url = "https://files.pythonhosted.org/packages/07/b6/89d837eddef52b3d0cec5c6ba0456c1bf1b9ef6a6672fc2b7873c3ec4e2e/numpy-2.2.6-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:74d4531beb257d2c3f4b261bfb0fc09e0f9ebb8842d82a7b4209415896adc680", size = 15807034, upload-time = "2025-05-17T21:29:51.102Z" }, 428 | { url = "https://files.pythonhosted.org/packages/01/c8/dc6ae86e3c61cfec1f178e5c9f7858584049b6093f843bca541f94120920/numpy-2.2.6-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:8fc377d995680230e83241d8a96def29f204b5782f371c532579b4f20607a289", size = 18614185, upload-time = "2025-05-17T21:30:18.703Z" }, 429 | { url = "https://files.pythonhosted.org/packages/5b/c5/0064b1b7e7c89137b471ccec1fd2282fceaae0ab3a9550f2568782d80357/numpy-2.2.6-cp310-cp310-win32.whl", hash = "sha256:b093dd74e50a8cba3e873868d9e93a85b78e0daf2e98c6797566ad8044e8363d", size = 6527149, upload-time = "2025-05-17T21:30:29.788Z" }, 430 | { url = "https://files.pythonhosted.org/packages/a3/dd/4b822569d6b96c39d1215dbae0582fd99954dcbcf0c1a13c61783feaca3f/numpy-2.2.6-cp310-cp310-win_amd64.whl", hash = "sha256:f0fd6321b839904e15c46e0d257fdd101dd7f530fe03fd6359c1ea63738703f3", size = 12904620, upload-time = "2025-05-17T21:30:48.994Z" }, 431 | { url = "https://files.pythonhosted.org/packages/da/a8/4f83e2aa666a9fbf56d6118faaaf5f1974d456b1823fda0a176eff722839/numpy-2.2.6-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:f9f1adb22318e121c5c69a09142811a201ef17ab257a1e66ca3025065b7f53ae", size = 21176963, upload-time = "2025-05-17T21:31:19.36Z" }, 432 | { url = "https://files.pythonhosted.org/packages/b3/2b/64e1affc7972decb74c9e29e5649fac940514910960ba25cd9af4488b66c/numpy-2.2.6-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:c820a93b0255bc360f53eca31a0e676fd1101f673dda8da93454a12e23fc5f7a", size = 14406743, upload-time = "2025-05-17T21:31:41.087Z" }, 433 | { url = "https://files.pythonhosted.org/packages/4a/9f/0121e375000b5e50ffdd8b25bf78d8e1a5aa4cca3f185d41265198c7b834/numpy-2.2.6-cp311-cp311-macosx_14_0_arm64.whl", hash = "sha256:3d70692235e759f260c3d837193090014aebdf026dfd167834bcba43e30c2a42", size = 5352616, upload-time = "2025-05-17T21:31:50.072Z" }, 434 | { url = "https://files.pythonhosted.org/packages/31/0d/b48c405c91693635fbe2dcd7bc84a33a602add5f63286e024d3b6741411c/numpy-2.2.6-cp311-cp311-macosx_14_0_x86_64.whl", hash = "sha256:481b49095335f8eed42e39e8041327c05b0f6f4780488f61286ed3c01368d491", size = 6889579, upload-time = "2025-05-17T21:32:01.712Z" }, 435 | { url = "https://files.pythonhosted.org/packages/52/b8/7f0554d49b565d0171eab6e99001846882000883998e7b7d9f0d98b1f934/numpy-2.2.6-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b64d8d4d17135e00c8e346e0a738deb17e754230d7e0810ac5012750bbd85a5a", size = 14312005, upload-time = "2025-05-17T21:32:23.332Z" }, 436 | { url = "https://files.pythonhosted.org/packages/b3/dd/2238b898e51bd6d389b7389ffb20d7f4c10066d80351187ec8e303a5a475/numpy-2.2.6-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ba10f8411898fc418a521833e014a77d3ca01c15b0c6cdcce6a0d2897e6dbbdf", size = 16821570, upload-time = "2025-05-17T21:32:47.991Z" }, 437 | { url = "https://files.pythonhosted.org/packages/83/6c/44d0325722cf644f191042bf47eedad61c1e6df2432ed65cbe28509d404e/numpy-2.2.6-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:bd48227a919f1bafbdda0583705e547892342c26fb127219d60a5c36882609d1", size = 15818548, upload-time = "2025-05-17T21:33:11.728Z" }, 438 | { url = "https://files.pythonhosted.org/packages/ae/9d/81e8216030ce66be25279098789b665d49ff19eef08bfa8cb96d4957f422/numpy-2.2.6-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:9551a499bf125c1d4f9e250377c1ee2eddd02e01eac6644c080162c0c51778ab", size = 18620521, upload-time = "2025-05-17T21:33:39.139Z" }, 439 | { url = "https://files.pythonhosted.org/packages/6a/fd/e19617b9530b031db51b0926eed5345ce8ddc669bb3bc0044b23e275ebe8/numpy-2.2.6-cp311-cp311-win32.whl", hash = "sha256:0678000bb9ac1475cd454c6b8c799206af8107e310843532b04d49649c717a47", size = 6525866, upload-time = "2025-05-17T21:33:50.273Z" }, 440 | { url = "https://files.pythonhosted.org/packages/31/0a/f354fb7176b81747d870f7991dc763e157a934c717b67b58456bc63da3df/numpy-2.2.6-cp311-cp311-win_amd64.whl", hash = "sha256:e8213002e427c69c45a52bbd94163084025f533a55a59d6f9c5b820774ef3303", size = 12907455, upload-time = "2025-05-17T21:34:09.135Z" }, 441 | { url = "https://files.pythonhosted.org/packages/82/5d/c00588b6cf18e1da539b45d3598d3557084990dcc4331960c15ee776ee41/numpy-2.2.6-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:41c5a21f4a04fa86436124d388f6ed60a9343a6f767fced1a8a71c3fbca038ff", size = 20875348, upload-time = "2025-05-17T21:34:39.648Z" }, 442 | { url = "https://files.pythonhosted.org/packages/66/ee/560deadcdde6c2f90200450d5938f63a34b37e27ebff162810f716f6a230/numpy-2.2.6-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:de749064336d37e340f640b05f24e9e3dd678c57318c7289d222a8a2f543e90c", size = 14119362, upload-time = "2025-05-17T21:35:01.241Z" }, 443 | { url = "https://files.pythonhosted.org/packages/3c/65/4baa99f1c53b30adf0acd9a5519078871ddde8d2339dc5a7fde80d9d87da/numpy-2.2.6-cp312-cp312-macosx_14_0_arm64.whl", hash = "sha256:894b3a42502226a1cac872f840030665f33326fc3dac8e57c607905773cdcde3", size = 5084103, upload-time = "2025-05-17T21:35:10.622Z" }, 444 | { url = "https://files.pythonhosted.org/packages/cc/89/e5a34c071a0570cc40c9a54eb472d113eea6d002e9ae12bb3a8407fb912e/numpy-2.2.6-cp312-cp312-macosx_14_0_x86_64.whl", hash = "sha256:71594f7c51a18e728451bb50cc60a3ce4e6538822731b2933209a1f3614e9282", size = 6625382, upload-time = "2025-05-17T21:35:21.414Z" }, 445 | { url = "https://files.pythonhosted.org/packages/f8/35/8c80729f1ff76b3921d5c9487c7ac3de9b2a103b1cd05e905b3090513510/numpy-2.2.6-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f2618db89be1b4e05f7a1a847a9c1c0abd63e63a1607d892dd54668dd92faf87", size = 14018462, upload-time = "2025-05-17T21:35:42.174Z" }, 446 | { url = "https://files.pythonhosted.org/packages/8c/3d/1e1db36cfd41f895d266b103df00ca5b3cbe965184df824dec5c08c6b803/numpy-2.2.6-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fd83c01228a688733f1ded5201c678f0c53ecc1006ffbc404db9f7a899ac6249", size = 16527618, upload-time = "2025-05-17T21:36:06.711Z" }, 447 | { url = "https://files.pythonhosted.org/packages/61/c6/03ed30992602c85aa3cd95b9070a514f8b3c33e31124694438d88809ae36/numpy-2.2.6-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:37c0ca431f82cd5fa716eca9506aefcabc247fb27ba69c5062a6d3ade8cf8f49", size = 15505511, upload-time = "2025-05-17T21:36:29.965Z" }, 448 | { url = "https://files.pythonhosted.org/packages/b7/25/5761d832a81df431e260719ec45de696414266613c9ee268394dd5ad8236/numpy-2.2.6-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:fe27749d33bb772c80dcd84ae7e8df2adc920ae8297400dabec45f0dedb3f6de", size = 18313783, upload-time = "2025-05-17T21:36:56.883Z" }, 449 | { url = "https://files.pythonhosted.org/packages/57/0a/72d5a3527c5ebffcd47bde9162c39fae1f90138c961e5296491ce778e682/numpy-2.2.6-cp312-cp312-win32.whl", hash = "sha256:4eeaae00d789f66c7a25ac5f34b71a7035bb474e679f410e5e1a94deb24cf2d4", size = 6246506, upload-time = "2025-05-17T21:37:07.368Z" }, 450 | { url = "https://files.pythonhosted.org/packages/36/fa/8c9210162ca1b88529ab76b41ba02d433fd54fecaf6feb70ef9f124683f1/numpy-2.2.6-cp312-cp312-win_amd64.whl", hash = "sha256:c1f9540be57940698ed329904db803cf7a402f3fc200bfe599334c9bd84a40b2", size = 12614190, upload-time = "2025-05-17T21:37:26.213Z" }, 451 | { url = "https://files.pythonhosted.org/packages/f9/5c/6657823f4f594f72b5471f1db1ab12e26e890bb2e41897522d134d2a3e81/numpy-2.2.6-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:0811bb762109d9708cca4d0b13c4f67146e3c3b7cf8d34018c722adb2d957c84", size = 20867828, upload-time = "2025-05-17T21:37:56.699Z" }, 452 | { url = "https://files.pythonhosted.org/packages/dc/9e/14520dc3dadf3c803473bd07e9b2bd1b69bc583cb2497b47000fed2fa92f/numpy-2.2.6-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:287cc3162b6f01463ccd86be154f284d0893d2b3ed7292439ea97eafa8170e0b", size = 14143006, upload-time = "2025-05-17T21:38:18.291Z" }, 453 | { url = "https://files.pythonhosted.org/packages/4f/06/7e96c57d90bebdce9918412087fc22ca9851cceaf5567a45c1f404480e9e/numpy-2.2.6-cp313-cp313-macosx_14_0_arm64.whl", hash = "sha256:f1372f041402e37e5e633e586f62aa53de2eac8d98cbfb822806ce4bbefcb74d", size = 5076765, upload-time = "2025-05-17T21:38:27.319Z" }, 454 | { url = "https://files.pythonhosted.org/packages/73/ed/63d920c23b4289fdac96ddbdd6132e9427790977d5457cd132f18e76eae0/numpy-2.2.6-cp313-cp313-macosx_14_0_x86_64.whl", hash = "sha256:55a4d33fa519660d69614a9fad433be87e5252f4b03850642f88993f7b2ca566", size = 6617736, upload-time = "2025-05-17T21:38:38.141Z" }, 455 | { url = "https://files.pythonhosted.org/packages/85/c5/e19c8f99d83fd377ec8c7e0cf627a8049746da54afc24ef0a0cb73d5dfb5/numpy-2.2.6-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f92729c95468a2f4f15e9bb94c432a9229d0d50de67304399627a943201baa2f", size = 14010719, upload-time = "2025-05-17T21:38:58.433Z" }, 456 | { url = "https://files.pythonhosted.org/packages/19/49/4df9123aafa7b539317bf6d342cb6d227e49f7a35b99c287a6109b13dd93/numpy-2.2.6-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1bc23a79bfabc5d056d106f9befb8d50c31ced2fbc70eedb8155aec74a45798f", size = 16526072, upload-time = "2025-05-17T21:39:22.638Z" }, 457 | { url = "https://files.pythonhosted.org/packages/b2/6c/04b5f47f4f32f7c2b0e7260442a8cbcf8168b0e1a41ff1495da42f42a14f/numpy-2.2.6-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:e3143e4451880bed956e706a3220b4e5cf6172ef05fcc397f6f36a550b1dd868", size = 15503213, upload-time = "2025-05-17T21:39:45.865Z" }, 458 | { url = "https://files.pythonhosted.org/packages/17/0a/5cd92e352c1307640d5b6fec1b2ffb06cd0dabe7d7b8227f97933d378422/numpy-2.2.6-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:b4f13750ce79751586ae2eb824ba7e1e8dba64784086c98cdbbcc6a42112ce0d", size = 18316632, upload-time = "2025-05-17T21:40:13.331Z" }, 459 | { url = "https://files.pythonhosted.org/packages/f0/3b/5cba2b1d88760ef86596ad0f3d484b1cbff7c115ae2429678465057c5155/numpy-2.2.6-cp313-cp313-win32.whl", hash = "sha256:5beb72339d9d4fa36522fc63802f469b13cdbe4fdab4a288f0c441b74272ebfd", size = 6244532, upload-time = "2025-05-17T21:43:46.099Z" }, 460 | { url = "https://files.pythonhosted.org/packages/cb/3b/d58c12eafcb298d4e6d0d40216866ab15f59e55d148a5658bb3132311fcf/numpy-2.2.6-cp313-cp313-win_amd64.whl", hash = "sha256:b0544343a702fa80c95ad5d3d608ea3599dd54d4632df855e4c8d24eb6ecfa1c", size = 12610885, upload-time = "2025-05-17T21:44:05.145Z" }, 461 | { url = "https://files.pythonhosted.org/packages/6b/9e/4bf918b818e516322db999ac25d00c75788ddfd2d2ade4fa66f1f38097e1/numpy-2.2.6-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:0bca768cd85ae743b2affdc762d617eddf3bcf8724435498a1e80132d04879e6", size = 20963467, upload-time = "2025-05-17T21:40:44Z" }, 462 | { url = "https://files.pythonhosted.org/packages/61/66/d2de6b291507517ff2e438e13ff7b1e2cdbdb7cb40b3ed475377aece69f9/numpy-2.2.6-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:fc0c5673685c508a142ca65209b4e79ed6740a4ed6b2267dbba90f34b0b3cfda", size = 14225144, upload-time = "2025-05-17T21:41:05.695Z" }, 463 | { url = "https://files.pythonhosted.org/packages/e4/25/480387655407ead912e28ba3a820bc69af9adf13bcbe40b299d454ec011f/numpy-2.2.6-cp313-cp313t-macosx_14_0_arm64.whl", hash = "sha256:5bd4fc3ac8926b3819797a7c0e2631eb889b4118a9898c84f585a54d475b7e40", size = 5200217, upload-time = "2025-05-17T21:41:15.903Z" }, 464 | { url = "https://files.pythonhosted.org/packages/aa/4a/6e313b5108f53dcbf3aca0c0f3e9c92f4c10ce57a0a721851f9785872895/numpy-2.2.6-cp313-cp313t-macosx_14_0_x86_64.whl", hash = "sha256:fee4236c876c4e8369388054d02d0e9bb84821feb1a64dd59e137e6511a551f8", size = 6712014, upload-time = "2025-05-17T21:41:27.321Z" }, 465 | { url = "https://files.pythonhosted.org/packages/b7/30/172c2d5c4be71fdf476e9de553443cf8e25feddbe185e0bd88b096915bcc/numpy-2.2.6-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e1dda9c7e08dc141e0247a5b8f49cf05984955246a327d4c48bda16821947b2f", size = 14077935, upload-time = "2025-05-17T21:41:49.738Z" }, 466 | { url = "https://files.pythonhosted.org/packages/12/fb/9e743f8d4e4d3c710902cf87af3512082ae3d43b945d5d16563f26ec251d/numpy-2.2.6-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f447e6acb680fd307f40d3da4852208af94afdfab89cf850986c3ca00562f4fa", size = 16600122, upload-time = "2025-05-17T21:42:14.046Z" }, 467 | { url = "https://files.pythonhosted.org/packages/12/75/ee20da0e58d3a66f204f38916757e01e33a9737d0b22373b3eb5a27358f9/numpy-2.2.6-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:389d771b1623ec92636b0786bc4ae56abafad4a4c513d36a55dce14bd9ce8571", size = 15586143, upload-time = "2025-05-17T21:42:37.464Z" }, 468 | { url = "https://files.pythonhosted.org/packages/76/95/bef5b37f29fc5e739947e9ce5179ad402875633308504a52d188302319c8/numpy-2.2.6-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:8e9ace4a37db23421249ed236fdcdd457d671e25146786dfc96835cd951aa7c1", size = 18385260, upload-time = "2025-05-17T21:43:05.189Z" }, 469 | { url = "https://files.pythonhosted.org/packages/09/04/f2f83279d287407cf36a7a8053a5abe7be3622a4363337338f2585e4afda/numpy-2.2.6-cp313-cp313t-win32.whl", hash = "sha256:038613e9fb8c72b0a41f025a7e4c3f0b7a1b5d768ece4796b674c8f3fe13efff", size = 6377225, upload-time = "2025-05-17T21:43:16.254Z" }, 470 | { url = "https://files.pythonhosted.org/packages/67/0e/35082d13c09c02c011cf21570543d202ad929d961c02a147493cb0c2bdf5/numpy-2.2.6-cp313-cp313t-win_amd64.whl", hash = "sha256:6031dd6dfecc0cf9f668681a37648373bddd6421fff6c66ec1624eed0180ee06", size = 12771374, upload-time = "2025-05-17T21:43:35.479Z" }, 471 | { url = "https://files.pythonhosted.org/packages/9e/3b/d94a75f4dbf1ef5d321523ecac21ef23a3cd2ac8b78ae2aac40873590229/numpy-2.2.6-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:0b605b275d7bd0c640cad4e5d30fa701a8d59302e127e5f79138ad62762c3e3d", size = 21040391, upload-time = "2025-05-17T21:44:35.948Z" }, 472 | { url = "https://files.pythonhosted.org/packages/17/f4/09b2fa1b58f0fb4f7c7963a1649c64c4d315752240377ed74d9cd878f7b5/numpy-2.2.6-pp310-pypy310_pp73-macosx_14_0_x86_64.whl", hash = "sha256:7befc596a7dc9da8a337f79802ee8adb30a552a94f792b9c9d18c840055907db", size = 6786754, upload-time = "2025-05-17T21:44:47.446Z" }, 473 | { url = "https://files.pythonhosted.org/packages/af/30/feba75f143bdc868a1cc3f44ccfa6c4b9ec522b36458e738cd00f67b573f/numpy-2.2.6-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ce47521a4754c8f4593837384bd3424880629f718d87c5d44f8ed763edd63543", size = 16643476, upload-time = "2025-05-17T21:45:11.871Z" }, 474 | { url = "https://files.pythonhosted.org/packages/37/48/ac2a9584402fb6c0cd5b5d1a91dcf176b15760130dd386bbafdbfe3640bf/numpy-2.2.6-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:d042d24c90c41b54fd506da306759e06e568864df8ec17ccc17e9e884634fd00", size = 12812666, upload-time = "2025-05-17T21:45:31.426Z" }, 475 | ] 476 | 477 | [[package]] 478 | name = "packaging" 479 | version = "25.0" 480 | source = { registry = "https://pypi.org/simple" } 481 | sdist = { url = "https://files.pythonhosted.org/packages/a1/d4/1fc4078c65507b51b96ca8f8c3ba19e6a61c8253c72794544580a7b6c24d/packaging-25.0.tar.gz", hash = "sha256:d443872c98d677bf60f6a1f2f8c1cb748e8fe762d2bf9d3148b5599295b0fc4f", size = 165727, upload-time = "2025-04-19T11:48:59.673Z" } 482 | wheels = [ 483 | { url = "https://files.pythonhosted.org/packages/20/12/38679034af332785aac8774540895e234f4d07f7545804097de4b666afd8/packaging-25.0-py3-none-any.whl", hash = "sha256:29572ef2b1f17581046b3a2227d5c611fb25ec70ca1ba8554b24b0e69331a484", size = 66469, upload-time = "2025-04-19T11:48:57.875Z" }, 484 | ] 485 | 486 | [[package]] 487 | name = "pandas" 488 | version = "2.2.3" 489 | source = { registry = "https://pypi.org/simple" } 490 | dependencies = [ 491 | { name = "numpy" }, 492 | { name = "python-dateutil" }, 493 | { name = "pytz" }, 494 | { name = "tzdata" }, 495 | ] 496 | sdist = { url = "https://files.pythonhosted.org/packages/9c/d6/9f8431bacc2e19dca897724cd097b1bb224a6ad5433784a44b587c7c13af/pandas-2.2.3.tar.gz", hash = "sha256:4f18ba62b61d7e192368b84517265a99b4d7ee8912f8708660fb4a366cc82667", size = 4399213, upload-time = "2024-09-20T13:10:04.827Z" } 497 | wheels = [ 498 | { url = "https://files.pythonhosted.org/packages/aa/70/c853aec59839bceed032d52010ff5f1b8d87dc3114b762e4ba2727661a3b/pandas-2.2.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:1948ddde24197a0f7add2bdc4ca83bf2b1ef84a1bc8ccffd95eda17fd836ecb5", size = 12580827, upload-time = "2024-09-20T13:08:42.347Z" }, 499 | { url = "https://files.pythonhosted.org/packages/99/f2/c4527768739ffa4469b2b4fff05aa3768a478aed89a2f271a79a40eee984/pandas-2.2.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:381175499d3802cde0eabbaf6324cce0c4f5d52ca6f8c377c29ad442f50f6348", size = 11303897, upload-time = "2024-09-20T13:08:45.807Z" }, 500 | { url = "https://files.pythonhosted.org/packages/ed/12/86c1747ea27989d7a4064f806ce2bae2c6d575b950be087837bdfcabacc9/pandas-2.2.3-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:d9c45366def9a3dd85a6454c0e7908f2b3b8e9c138f5dc38fed7ce720d8453ed", size = 66480908, upload-time = "2024-09-20T18:37:13.513Z" }, 501 | { url = "https://files.pythonhosted.org/packages/44/50/7db2cd5e6373ae796f0ddad3675268c8d59fb6076e66f0c339d61cea886b/pandas-2.2.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:86976a1c5b25ae3f8ccae3a5306e443569ee3c3faf444dfd0f41cda24667ad57", size = 13064210, upload-time = "2024-09-20T13:08:48.325Z" }, 502 | { url = "https://files.pythonhosted.org/packages/61/61/a89015a6d5536cb0d6c3ba02cebed51a95538cf83472975275e28ebf7d0c/pandas-2.2.3-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:b8661b0238a69d7aafe156b7fa86c44b881387509653fdf857bebc5e4008ad42", size = 16754292, upload-time = "2024-09-20T19:01:54.443Z" }, 503 | { url = "https://files.pythonhosted.org/packages/ce/0d/4cc7b69ce37fac07645a94e1d4b0880b15999494372c1523508511b09e40/pandas-2.2.3-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:37e0aced3e8f539eccf2e099f65cdb9c8aa85109b0be6e93e2baff94264bdc6f", size = 14416379, upload-time = "2024-09-20T13:08:50.882Z" }, 504 | { url = "https://files.pythonhosted.org/packages/31/9e/6ebb433de864a6cd45716af52a4d7a8c3c9aaf3a98368e61db9e69e69a9c/pandas-2.2.3-cp310-cp310-win_amd64.whl", hash = "sha256:56534ce0746a58afaf7942ba4863e0ef81c9c50d3f0ae93e9497d6a41a057645", size = 11598471, upload-time = "2024-09-20T13:08:53.332Z" }, 505 | { url = "https://files.pythonhosted.org/packages/a8/44/d9502bf0ed197ba9bf1103c9867d5904ddcaf869e52329787fc54ed70cc8/pandas-2.2.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:66108071e1b935240e74525006034333f98bcdb87ea116de573a6a0dccb6c039", size = 12602222, upload-time = "2024-09-20T13:08:56.254Z" }, 506 | { url = "https://files.pythonhosted.org/packages/52/11/9eac327a38834f162b8250aab32a6781339c69afe7574368fffe46387edf/pandas-2.2.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:7c2875855b0ff77b2a64a0365e24455d9990730d6431b9e0ee18ad8acee13dbd", size = 11321274, upload-time = "2024-09-20T13:08:58.645Z" }, 507 | { url = "https://files.pythonhosted.org/packages/45/fb/c4beeb084718598ba19aa9f5abbc8aed8b42f90930da861fcb1acdb54c3a/pandas-2.2.3-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:cd8d0c3be0515c12fed0bdbae072551c8b54b7192c7b1fda0ba56059a0179698", size = 15579836, upload-time = "2024-09-20T19:01:57.571Z" }, 508 | { url = "https://files.pythonhosted.org/packages/cd/5f/4dba1d39bb9c38d574a9a22548c540177f78ea47b32f99c0ff2ec499fac5/pandas-2.2.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c124333816c3a9b03fbeef3a9f230ba9a737e9e5bb4060aa2107a86cc0a497fc", size = 13058505, upload-time = "2024-09-20T13:09:01.501Z" }, 509 | { url = "https://files.pythonhosted.org/packages/b9/57/708135b90391995361636634df1f1130d03ba456e95bcf576fada459115a/pandas-2.2.3-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:63cc132e40a2e084cf01adf0775b15ac515ba905d7dcca47e9a251819c575ef3", size = 16744420, upload-time = "2024-09-20T19:02:00.678Z" }, 510 | { url = "https://files.pythonhosted.org/packages/86/4a/03ed6b7ee323cf30404265c284cee9c65c56a212e0a08d9ee06984ba2240/pandas-2.2.3-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:29401dbfa9ad77319367d36940cd8a0b3a11aba16063e39632d98b0e931ddf32", size = 14440457, upload-time = "2024-09-20T13:09:04.105Z" }, 511 | { url = "https://files.pythonhosted.org/packages/ed/8c/87ddf1fcb55d11f9f847e3c69bb1c6f8e46e2f40ab1a2d2abadb2401b007/pandas-2.2.3-cp311-cp311-win_amd64.whl", hash = "sha256:3fc6873a41186404dad67245896a6e440baacc92f5b716ccd1bc9ed2995ab2c5", size = 11617166, upload-time = "2024-09-20T13:09:06.917Z" }, 512 | { url = "https://files.pythonhosted.org/packages/17/a3/fb2734118db0af37ea7433f57f722c0a56687e14b14690edff0cdb4b7e58/pandas-2.2.3-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:b1d432e8d08679a40e2a6d8b2f9770a5c21793a6f9f47fdd52c5ce1948a5a8a9", size = 12529893, upload-time = "2024-09-20T13:09:09.655Z" }, 513 | { url = "https://files.pythonhosted.org/packages/e1/0c/ad295fd74bfac85358fd579e271cded3ac969de81f62dd0142c426b9da91/pandas-2.2.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:a5a1595fe639f5988ba6a8e5bc9649af3baf26df3998a0abe56c02609392e0a4", size = 11363475, upload-time = "2024-09-20T13:09:14.718Z" }, 514 | { url = "https://files.pythonhosted.org/packages/c6/2a/4bba3f03f7d07207481fed47f5b35f556c7441acddc368ec43d6643c5777/pandas-2.2.3-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:5de54125a92bb4d1c051c0659e6fcb75256bf799a732a87184e5ea503965bce3", size = 15188645, upload-time = "2024-09-20T19:02:03.88Z" }, 515 | { url = "https://files.pythonhosted.org/packages/38/f8/d8fddee9ed0d0c0f4a2132c1dfcf0e3e53265055da8df952a53e7eaf178c/pandas-2.2.3-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fffb8ae78d8af97f849404f21411c95062db1496aeb3e56f146f0355c9989319", size = 12739445, upload-time = "2024-09-20T13:09:17.621Z" }, 516 | { url = "https://files.pythonhosted.org/packages/20/e8/45a05d9c39d2cea61ab175dbe6a2de1d05b679e8de2011da4ee190d7e748/pandas-2.2.3-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:6dfcb5ee8d4d50c06a51c2fffa6cff6272098ad6540aed1a76d15fb9318194d8", size = 16359235, upload-time = "2024-09-20T19:02:07.094Z" }, 517 | { url = "https://files.pythonhosted.org/packages/1d/99/617d07a6a5e429ff90c90da64d428516605a1ec7d7bea494235e1c3882de/pandas-2.2.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:062309c1b9ea12a50e8ce661145c6aab431b1e99530d3cd60640e255778bd43a", size = 14056756, upload-time = "2024-09-20T13:09:20.474Z" }, 518 | { url = "https://files.pythonhosted.org/packages/29/d4/1244ab8edf173a10fd601f7e13b9566c1b525c4f365d6bee918e68381889/pandas-2.2.3-cp312-cp312-win_amd64.whl", hash = "sha256:59ef3764d0fe818125a5097d2ae867ca3fa64df032331b7e0917cf5d7bf66b13", size = 11504248, upload-time = "2024-09-20T13:09:23.137Z" }, 519 | { url = "https://files.pythonhosted.org/packages/64/22/3b8f4e0ed70644e85cfdcd57454686b9057c6c38d2f74fe4b8bc2527214a/pandas-2.2.3-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:f00d1345d84d8c86a63e476bb4955e46458b304b9575dcf71102b5c705320015", size = 12477643, upload-time = "2024-09-20T13:09:25.522Z" }, 520 | { url = "https://files.pythonhosted.org/packages/e4/93/b3f5d1838500e22c8d793625da672f3eec046b1a99257666c94446969282/pandas-2.2.3-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:3508d914817e153ad359d7e069d752cdd736a247c322d932eb89e6bc84217f28", size = 11281573, upload-time = "2024-09-20T13:09:28.012Z" }, 521 | { url = "https://files.pythonhosted.org/packages/f5/94/6c79b07f0e5aab1dcfa35a75f4817f5c4f677931d4234afcd75f0e6a66ca/pandas-2.2.3-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:22a9d949bfc9a502d320aa04e5d02feab689d61da4e7764b62c30b991c42c5f0", size = 15196085, upload-time = "2024-09-20T19:02:10.451Z" }, 522 | { url = "https://files.pythonhosted.org/packages/e8/31/aa8da88ca0eadbabd0a639788a6da13bb2ff6edbbb9f29aa786450a30a91/pandas-2.2.3-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f3a255b2c19987fbbe62a9dfd6cff7ff2aa9ccab3fc75218fd4b7530f01efa24", size = 12711809, upload-time = "2024-09-20T13:09:30.814Z" }, 523 | { url = "https://files.pythonhosted.org/packages/ee/7c/c6dbdb0cb2a4344cacfb8de1c5808ca885b2e4dcfde8008266608f9372af/pandas-2.2.3-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:800250ecdadb6d9c78eae4990da62743b857b470883fa27f652db8bdde7f6659", size = 16356316, upload-time = "2024-09-20T19:02:13.825Z" }, 524 | { url = "https://files.pythonhosted.org/packages/57/b7/8b757e7d92023b832869fa8881a992696a0bfe2e26f72c9ae9f255988d42/pandas-2.2.3-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:6374c452ff3ec675a8f46fd9ab25c4ad0ba590b71cf0656f8b6daa5202bca3fb", size = 14022055, upload-time = "2024-09-20T13:09:33.462Z" }, 525 | { url = "https://files.pythonhosted.org/packages/3b/bc/4b18e2b8c002572c5a441a64826252ce5da2aa738855747247a971988043/pandas-2.2.3-cp313-cp313-win_amd64.whl", hash = "sha256:61c5ad4043f791b61dd4752191d9f07f0ae412515d59ba8f005832a532f8736d", size = 11481175, upload-time = "2024-09-20T13:09:35.871Z" }, 526 | { url = "https://files.pythonhosted.org/packages/76/a3/a5d88146815e972d40d19247b2c162e88213ef51c7c25993942c39dbf41d/pandas-2.2.3-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:3b71f27954685ee685317063bf13c7709a7ba74fc996b84fc6821c59b0f06468", size = 12615650, upload-time = "2024-09-20T13:09:38.685Z" }, 527 | { url = "https://files.pythonhosted.org/packages/9c/8c/f0fd18f6140ddafc0c24122c8a964e48294acc579d47def376fef12bcb4a/pandas-2.2.3-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:38cf8125c40dae9d5acc10fa66af8ea6fdf760b2714ee482ca691fc66e6fcb18", size = 11290177, upload-time = "2024-09-20T13:09:41.141Z" }, 528 | { url = "https://files.pythonhosted.org/packages/ed/f9/e995754eab9c0f14c6777401f7eece0943840b7a9fc932221c19d1abee9f/pandas-2.2.3-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:ba96630bc17c875161df3818780af30e43be9b166ce51c9a18c1feae342906c2", size = 14651526, upload-time = "2024-09-20T19:02:16.905Z" }, 529 | { url = "https://files.pythonhosted.org/packages/25/b0/98d6ae2e1abac4f35230aa756005e8654649d305df9a28b16b9ae4353bff/pandas-2.2.3-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1db71525a1538b30142094edb9adc10be3f3e176748cd7acc2240c2f2e5aa3a4", size = 11871013, upload-time = "2024-09-20T13:09:44.39Z" }, 530 | { url = "https://files.pythonhosted.org/packages/cc/57/0f72a10f9db6a4628744c8e8f0df4e6e21de01212c7c981d31e50ffc8328/pandas-2.2.3-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:15c0e1e02e93116177d29ff83e8b1619c93ddc9c49083f237d4312337a61165d", size = 15711620, upload-time = "2024-09-20T19:02:20.639Z" }, 531 | { url = "https://files.pythonhosted.org/packages/ab/5f/b38085618b950b79d2d9164a711c52b10aefc0ae6833b96f626b7021b2ed/pandas-2.2.3-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:ad5b65698ab28ed8d7f18790a0dc58005c7629f227be9ecc1072aa74c0c1d43a", size = 13098436, upload-time = "2024-09-20T13:09:48.112Z" }, 532 | ] 533 | 534 | [[package]] 535 | name = "parso" 536 | version = "0.8.4" 537 | source = { registry = "https://pypi.org/simple" } 538 | sdist = { url = "https://files.pythonhosted.org/packages/66/94/68e2e17afaa9169cf6412ab0f28623903be73d1b32e208d9e8e541bb086d/parso-0.8.4.tar.gz", hash = "sha256:eb3a7b58240fb99099a345571deecc0f9540ea5f4dd2fe14c2a99d6b281ab92d", size = 400609, upload-time = "2024-04-05T09:43:55.897Z" } 539 | wheels = [ 540 | { url = "https://files.pythonhosted.org/packages/c6/ac/dac4a63f978e4dcb3c6d3a78c4d8e0192a113d288502a1216950c41b1027/parso-0.8.4-py2.py3-none-any.whl", hash = "sha256:a418670a20291dacd2dddc80c377c5c3791378ee1e8d12bffc35420643d43f18", size = 103650, upload-time = "2024-04-05T09:43:53.299Z" }, 541 | ] 542 | 543 | [[package]] 544 | name = "pexpect" 545 | version = "4.9.0" 546 | source = { registry = "https://pypi.org/simple" } 547 | dependencies = [ 548 | { name = "ptyprocess" }, 549 | ] 550 | sdist = { url = "https://files.pythonhosted.org/packages/42/92/cc564bf6381ff43ce1f4d06852fc19a2f11d180f23dc32d9588bee2f149d/pexpect-4.9.0.tar.gz", hash = "sha256:ee7d41123f3c9911050ea2c2dac107568dc43b2d3b0c7557a33212c398ead30f", size = 166450, upload-time = "2023-11-25T09:07:26.339Z" } 551 | wheels = [ 552 | { url = "https://files.pythonhosted.org/packages/9e/c3/059298687310d527a58bb01f3b1965787ee3b40dce76752eda8b44e9a2c5/pexpect-4.9.0-py2.py3-none-any.whl", hash = "sha256:7236d1e080e4936be2dc3e326cec0af72acf9212a7e1d060210e70a47e253523", size = 63772, upload-time = "2023-11-25T06:56:14.81Z" }, 553 | ] 554 | 555 | [[package]] 556 | name = "platformdirs" 557 | version = "4.3.8" 558 | source = { registry = "https://pypi.org/simple" } 559 | sdist = { url = "https://files.pythonhosted.org/packages/fe/8b/3c73abc9c759ecd3f1f7ceff6685840859e8070c4d947c93fae71f6a0bf2/platformdirs-4.3.8.tar.gz", hash = "sha256:3d512d96e16bcb959a814c9f348431070822a6496326a4be0911c40b5a74c2bc", size = 21362, upload-time = "2025-05-07T22:47:42.121Z" } 560 | wheels = [ 561 | { url = "https://files.pythonhosted.org/packages/fe/39/979e8e21520d4e47a0bbe349e2713c0aac6f3d853d0e5b34d76206c439aa/platformdirs-4.3.8-py3-none-any.whl", hash = "sha256:ff7059bb7eb1179e2685604f4aaf157cfd9535242bd23742eadc3c13542139b4", size = 18567, upload-time = "2025-05-07T22:47:40.376Z" }, 562 | ] 563 | 564 | [[package]] 565 | name = "prompt-toolkit" 566 | version = "3.0.51" 567 | source = { registry = "https://pypi.org/simple" } 568 | dependencies = [ 569 | { name = "wcwidth" }, 570 | ] 571 | sdist = { url = "https://files.pythonhosted.org/packages/bb/6e/9d084c929dfe9e3bfe0c6a47e31f78a25c54627d64a66e884a8bf5474f1c/prompt_toolkit-3.0.51.tar.gz", hash = "sha256:931a162e3b27fc90c86f1b48bb1fb2c528c2761475e57c9c06de13311c7b54ed", size = 428940, upload-time = "2025-04-15T09:18:47.731Z" } 572 | wheels = [ 573 | { url = "https://files.pythonhosted.org/packages/ce/4f/5249960887b1fbe561d9ff265496d170b55a735b76724f10ef19f9e40716/prompt_toolkit-3.0.51-py3-none-any.whl", hash = "sha256:52742911fde84e2d423e2f9a4cf1de7d7ac4e51958f648d9540e0fb8db077b07", size = 387810, upload-time = "2025-04-15T09:18:44.753Z" }, 574 | ] 575 | 576 | [[package]] 577 | name = "psutil" 578 | version = "7.0.0" 579 | source = { registry = "https://pypi.org/simple" } 580 | sdist = { url = "https://files.pythonhosted.org/packages/2a/80/336820c1ad9286a4ded7e845b2eccfcb27851ab8ac6abece774a6ff4d3de/psutil-7.0.0.tar.gz", hash = "sha256:7be9c3eba38beccb6495ea33afd982a44074b78f28c434a1f51cc07fd315c456", size = 497003, upload-time = "2025-02-13T21:54:07.946Z" } 581 | wheels = [ 582 | { url = "https://files.pythonhosted.org/packages/ed/e6/2d26234410f8b8abdbf891c9da62bee396583f713fb9f3325a4760875d22/psutil-7.0.0-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:101d71dc322e3cffd7cea0650b09b3d08b8e7c4109dd6809fe452dfd00e58b25", size = 238051, upload-time = "2025-02-13T21:54:12.36Z" }, 583 | { url = "https://files.pythonhosted.org/packages/04/8b/30f930733afe425e3cbfc0e1468a30a18942350c1a8816acfade80c005c4/psutil-7.0.0-cp36-abi3-macosx_11_0_arm64.whl", hash = "sha256:39db632f6bb862eeccf56660871433e111b6ea58f2caea825571951d4b6aa3da", size = 239535, upload-time = "2025-02-13T21:54:16.07Z" }, 584 | { url = "https://files.pythonhosted.org/packages/2a/ed/d362e84620dd22876b55389248e522338ed1bf134a5edd3b8231d7207f6d/psutil-7.0.0-cp36-abi3-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1fcee592b4c6f146991ca55919ea3d1f8926497a713ed7faaf8225e174581e91", size = 275004, upload-time = "2025-02-13T21:54:18.662Z" }, 585 | { url = "https://files.pythonhosted.org/packages/bf/b9/b0eb3f3cbcb734d930fdf839431606844a825b23eaf9a6ab371edac8162c/psutil-7.0.0-cp36-abi3-manylinux_2_12_x86_64.manylinux2010_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4b1388a4f6875d7e2aff5c4ca1cc16c545ed41dd8bb596cefea80111db353a34", size = 277986, upload-time = "2025-02-13T21:54:21.811Z" }, 586 | { url = "https://files.pythonhosted.org/packages/eb/a2/709e0fe2f093556c17fbafda93ac032257242cabcc7ff3369e2cb76a97aa/psutil-7.0.0-cp36-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a5f098451abc2828f7dc6b58d44b532b22f2088f4999a937557b603ce72b1993", size = 279544, upload-time = "2025-02-13T21:54:24.68Z" }, 587 | { url = "https://files.pythonhosted.org/packages/50/e6/eecf58810b9d12e6427369784efe814a1eec0f492084ce8eb8f4d89d6d61/psutil-7.0.0-cp37-abi3-win32.whl", hash = "sha256:ba3fcef7523064a6c9da440fc4d6bd07da93ac726b5733c29027d7dc95b39d99", size = 241053, upload-time = "2025-02-13T21:54:34.31Z" }, 588 | { url = "https://files.pythonhosted.org/packages/50/1b/6921afe68c74868b4c9fa424dad3be35b095e16687989ebbb50ce4fceb7c/psutil-7.0.0-cp37-abi3-win_amd64.whl", hash = "sha256:4cf3d4eb1aa9b348dec30105c55cd9b7d4629285735a102beb4441e38db90553", size = 244885, upload-time = "2025-02-13T21:54:37.486Z" }, 589 | ] 590 | 591 | [[package]] 592 | name = "ptyprocess" 593 | version = "0.7.0" 594 | source = { registry = "https://pypi.org/simple" } 595 | sdist = { url = "https://files.pythonhosted.org/packages/20/e5/16ff212c1e452235a90aeb09066144d0c5a6a8c0834397e03f5224495c4e/ptyprocess-0.7.0.tar.gz", hash = "sha256:5c5d0a3b48ceee0b48485e0c26037c0acd7d29765ca3fbb5cb3831d347423220", size = 70762, upload-time = "2020-12-28T15:15:30.155Z" } 596 | wheels = [ 597 | { url = "https://files.pythonhosted.org/packages/22/a6/858897256d0deac81a172289110f31629fc4cee19b6f01283303e18c8db3/ptyprocess-0.7.0-py2.py3-none-any.whl", hash = "sha256:4b41f3967fce3af57cc7e94b888626c18bf37a083e3651ca8feeb66d492fef35", size = 13993, upload-time = "2020-12-28T15:15:28.35Z" }, 598 | ] 599 | 600 | [[package]] 601 | name = "pure-eval" 602 | version = "0.2.3" 603 | source = { registry = "https://pypi.org/simple" } 604 | sdist = { url = "https://files.pythonhosted.org/packages/cd/05/0a34433a064256a578f1783a10da6df098ceaa4a57bbeaa96a6c0352786b/pure_eval-0.2.3.tar.gz", hash = "sha256:5f4e983f40564c576c7c8635ae88db5956bb2229d7e9237d03b3c0b0190eaf42", size = 19752, upload-time = "2024-07-21T12:58:21.801Z" } 605 | wheels = [ 606 | { url = "https://files.pythonhosted.org/packages/8e/37/efad0257dc6e593a18957422533ff0f87ede7c9c6ea010a2177d738fb82f/pure_eval-0.2.3-py3-none-any.whl", hash = "sha256:1db8e35b67b3d218d818ae653e27f06c3aa420901fa7b081ca98cbedc874e0d0", size = 11842, upload-time = "2024-07-21T12:58:20.04Z" }, 607 | ] 608 | 609 | [[package]] 610 | name = "pycparser" 611 | version = "2.22" 612 | source = { registry = "https://pypi.org/simple" } 613 | sdist = { url = "https://files.pythonhosted.org/packages/1d/b2/31537cf4b1ca988837256c910a668b553fceb8f069bedc4b1c826024b52c/pycparser-2.22.tar.gz", hash = "sha256:491c8be9c040f5390f5bf44a5b07752bd07f56edf992381b05c701439eec10f6", size = 172736, upload-time = "2024-03-30T13:22:22.564Z" } 614 | wheels = [ 615 | { url = "https://files.pythonhosted.org/packages/13/a3/a812df4e2dd5696d1f351d58b8fe16a405b234ad2886a0dab9183fb78109/pycparser-2.22-py3-none-any.whl", hash = "sha256:c3702b6d3dd8c7abc1afa565d7e63d53a1d0bd86cdc24edd75470f4de499cfcc", size = 117552, upload-time = "2024-03-30T13:22:20.476Z" }, 616 | ] 617 | 618 | [[package]] 619 | name = "pygments" 620 | version = "2.19.1" 621 | source = { registry = "https://pypi.org/simple" } 622 | sdist = { url = "https://files.pythonhosted.org/packages/7c/2d/c3338d48ea6cc0feb8446d8e6937e1408088a72a39937982cc6111d17f84/pygments-2.19.1.tar.gz", hash = "sha256:61c16d2a8576dc0649d9f39e089b5f02bcd27fba10d8fb4dcc28173f7a45151f", size = 4968581, upload-time = "2025-01-06T17:26:30.443Z" } 623 | wheels = [ 624 | { url = "https://files.pythonhosted.org/packages/8a/0b/9fcc47d19c48b59121088dd6da2488a49d5f72dacf8262e2790a1d2c7d15/pygments-2.19.1-py3-none-any.whl", hash = "sha256:9ea1544ad55cecf4b8242fab6dd35a93bbce657034b0611ee383099054ab6d8c", size = 1225293, upload-time = "2025-01-06T17:26:25.553Z" }, 625 | ] 626 | 627 | [[package]] 628 | name = "python-dateutil" 629 | version = "2.9.0.post0" 630 | source = { registry = "https://pypi.org/simple" } 631 | dependencies = [ 632 | { name = "six" }, 633 | ] 634 | sdist = { url = "https://files.pythonhosted.org/packages/66/c0/0c8b6ad9f17a802ee498c46e004a0eb49bc148f2fd230864601a86dcf6db/python-dateutil-2.9.0.post0.tar.gz", hash = "sha256:37dd54208da7e1cd875388217d5e00ebd4179249f90fb72437e91a35459a0ad3", size = 342432, upload-time = "2024-03-01T18:36:20.211Z" } 635 | wheels = [ 636 | { url = "https://files.pythonhosted.org/packages/ec/57/56b9bcc3c9c6a792fcbaf139543cee77261f3651ca9da0c93f5c1221264b/python_dateutil-2.9.0.post0-py2.py3-none-any.whl", hash = "sha256:a8b2bc7bffae282281c8140a97d3aa9c14da0b136dfe83f850eea9a5f7470427", size = 229892, upload-time = "2024-03-01T18:36:18.57Z" }, 637 | ] 638 | 639 | [[package]] 640 | name = "python-dotenv" 641 | version = "1.1.0" 642 | source = { registry = "https://pypi.org/simple" } 643 | sdist = { url = "https://files.pythonhosted.org/packages/88/2c/7bb1416c5620485aa793f2de31d3df393d3686aa8a8506d11e10e13c5baf/python_dotenv-1.1.0.tar.gz", hash = "sha256:41f90bc6f5f177fb41f53e87666db362025010eb28f60a01c9143bfa33a2b2d5", size = 39920, upload-time = "2025-03-25T10:14:56.835Z" } 644 | wheels = [ 645 | { url = "https://files.pythonhosted.org/packages/1e/18/98a99ad95133c6a6e2005fe89faedf294a748bd5dc803008059409ac9b1e/python_dotenv-1.1.0-py3-none-any.whl", hash = "sha256:d7c01d9e2293916c18baf562d95698754b0dbbb5e74d457c45d4f6561fb9d55d", size = 20256, upload-time = "2025-03-25T10:14:55.034Z" }, 646 | ] 647 | 648 | [[package]] 649 | name = "pytz" 650 | version = "2025.2" 651 | source = { registry = "https://pypi.org/simple" } 652 | sdist = { url = "https://files.pythonhosted.org/packages/f8/bf/abbd3cdfb8fbc7fb3d4d38d320f2441b1e7cbe29be4f23797b4a2b5d8aac/pytz-2025.2.tar.gz", hash = "sha256:360b9e3dbb49a209c21ad61809c7fb453643e048b38924c765813546746e81c3", size = 320884, upload-time = "2025-03-25T02:25:00.538Z" } 653 | wheels = [ 654 | { url = "https://files.pythonhosted.org/packages/81/c4/34e93fe5f5429d7570ec1fa436f1986fb1f00c3e0f43a589fe2bbcd22c3f/pytz-2025.2-py2.py3-none-any.whl", hash = "sha256:5ddf76296dd8c44c26eb8f4b6f35488f3ccbf6fbbd7adee0b7262d43f0ec2f00", size = 509225, upload-time = "2025-03-25T02:24:58.468Z" }, 655 | ] 656 | 657 | [[package]] 658 | name = "pywin32" 659 | version = "310" 660 | source = { registry = "https://pypi.org/simple" } 661 | wheels = [ 662 | { url = "https://files.pythonhosted.org/packages/95/da/a5f38fffbba2fb99aa4aa905480ac4b8e83ca486659ac8c95bce47fb5276/pywin32-310-cp310-cp310-win32.whl", hash = "sha256:6dd97011efc8bf51d6793a82292419eba2c71cf8e7250cfac03bba284454abc1", size = 8848240, upload-time = "2025-03-17T00:55:46.783Z" }, 663 | { url = "https://files.pythonhosted.org/packages/aa/fe/d873a773324fa565619ba555a82c9dabd677301720f3660a731a5d07e49a/pywin32-310-cp310-cp310-win_amd64.whl", hash = "sha256:c3e78706e4229b915a0821941a84e7ef420bf2b77e08c9dae3c76fd03fd2ae3d", size = 9601854, upload-time = "2025-03-17T00:55:48.783Z" }, 664 | { url = "https://files.pythonhosted.org/packages/3c/84/1a8e3d7a15490d28a5d816efa229ecb4999cdc51a7c30dd8914f669093b8/pywin32-310-cp310-cp310-win_arm64.whl", hash = "sha256:33babed0cf0c92a6f94cc6cc13546ab24ee13e3e800e61ed87609ab91e4c8213", size = 8522963, upload-time = "2025-03-17T00:55:50.969Z" }, 665 | { url = "https://files.pythonhosted.org/packages/f7/b1/68aa2986129fb1011dabbe95f0136f44509afaf072b12b8f815905a39f33/pywin32-310-cp311-cp311-win32.whl", hash = "sha256:1e765f9564e83011a63321bb9d27ec456a0ed90d3732c4b2e312b855365ed8bd", size = 8784284, upload-time = "2025-03-17T00:55:53.124Z" }, 666 | { url = "https://files.pythonhosted.org/packages/b3/bd/d1592635992dd8db5bb8ace0551bc3a769de1ac8850200cfa517e72739fb/pywin32-310-cp311-cp311-win_amd64.whl", hash = "sha256:126298077a9d7c95c53823934f000599f66ec9296b09167810eb24875f32689c", size = 9520748, upload-time = "2025-03-17T00:55:55.203Z" }, 667 | { url = "https://files.pythonhosted.org/packages/90/b1/ac8b1ffce6603849eb45a91cf126c0fa5431f186c2e768bf56889c46f51c/pywin32-310-cp311-cp311-win_arm64.whl", hash = "sha256:19ec5fc9b1d51c4350be7bb00760ffce46e6c95eaf2f0b2f1150657b1a43c582", size = 8455941, upload-time = "2025-03-17T00:55:57.048Z" }, 668 | { url = "https://files.pythonhosted.org/packages/6b/ec/4fdbe47932f671d6e348474ea35ed94227fb5df56a7c30cbbb42cd396ed0/pywin32-310-cp312-cp312-win32.whl", hash = "sha256:8a75a5cc3893e83a108c05d82198880704c44bbaee4d06e442e471d3c9ea4f3d", size = 8796239, upload-time = "2025-03-17T00:55:58.807Z" }, 669 | { url = "https://files.pythonhosted.org/packages/e3/e5/b0627f8bb84e06991bea89ad8153a9e50ace40b2e1195d68e9dff6b03d0f/pywin32-310-cp312-cp312-win_amd64.whl", hash = "sha256:bf5c397c9a9a19a6f62f3fb821fbf36cac08f03770056711f765ec1503972060", size = 9503839, upload-time = "2025-03-17T00:56:00.8Z" }, 670 | { url = "https://files.pythonhosted.org/packages/1f/32/9ccf53748df72301a89713936645a664ec001abd35ecc8578beda593d37d/pywin32-310-cp312-cp312-win_arm64.whl", hash = "sha256:2349cc906eae872d0663d4d6290d13b90621eaf78964bb1578632ff20e152966", size = 8459470, upload-time = "2025-03-17T00:56:02.601Z" }, 671 | { url = "https://files.pythonhosted.org/packages/1c/09/9c1b978ffc4ae53999e89c19c77ba882d9fce476729f23ef55211ea1c034/pywin32-310-cp313-cp313-win32.whl", hash = "sha256:5d241a659c496ada3253cd01cfaa779b048e90ce4b2b38cd44168ad555ce74ab", size = 8794384, upload-time = "2025-03-17T00:56:04.383Z" }, 672 | { url = "https://files.pythonhosted.org/packages/45/3c/b4640f740ffebadd5d34df35fecba0e1cfef8fde9f3e594df91c28ad9b50/pywin32-310-cp313-cp313-win_amd64.whl", hash = "sha256:667827eb3a90208ddbdcc9e860c81bde63a135710e21e4cb3348968e4bd5249e", size = 9503039, upload-time = "2025-03-17T00:56:06.207Z" }, 673 | { url = "https://files.pythonhosted.org/packages/b4/f4/f785020090fb050e7fb6d34b780f2231f302609dc964672f72bfaeb59a28/pywin32-310-cp313-cp313-win_arm64.whl", hash = "sha256:e308f831de771482b7cf692a1f308f8fca701b2d8f9dde6cc440c7da17e47b33", size = 8458152, upload-time = "2025-03-17T00:56:07.819Z" }, 674 | ] 675 | 676 | [[package]] 677 | name = "pyzmq" 678 | version = "26.4.0" 679 | source = { registry = "https://pypi.org/simple" } 680 | dependencies = [ 681 | { name = "cffi", marker = "implementation_name == 'pypy'" }, 682 | ] 683 | sdist = { url = "https://files.pythonhosted.org/packages/b1/11/b9213d25230ac18a71b39b3723494e57adebe36e066397b961657b3b41c1/pyzmq-26.4.0.tar.gz", hash = "sha256:4bd13f85f80962f91a651a7356fe0472791a5f7a92f227822b5acf44795c626d", size = 278293, upload-time = "2025-04-04T12:05:44.049Z" } 684 | wheels = [ 685 | { url = "https://files.pythonhosted.org/packages/38/b8/af1d814ffc3ff9730f9a970cbf216b6f078e5d251a25ef5201d7bc32a37c/pyzmq-26.4.0-cp310-cp310-macosx_10_15_universal2.whl", hash = "sha256:0329bdf83e170ac133f44a233fc651f6ed66ef8e66693b5af7d54f45d1ef5918", size = 1339238, upload-time = "2025-04-04T12:03:07.022Z" }, 686 | { url = "https://files.pythonhosted.org/packages/ee/e4/5aafed4886c264f2ea6064601ad39c5fc4e9b6539c6ebe598a859832eeee/pyzmq-26.4.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:398a825d2dea96227cf6460ce0a174cf7657d6f6827807d4d1ae9d0f9ae64315", size = 672848, upload-time = "2025-04-04T12:03:08.591Z" }, 687 | { url = "https://files.pythonhosted.org/packages/79/39/026bf49c721cb42f1ef3ae0ee3d348212a7621d2adb739ba97599b6e4d50/pyzmq-26.4.0-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6d52d62edc96787f5c1dfa6c6ccff9b581cfae5a70d94ec4c8da157656c73b5b", size = 911299, upload-time = "2025-04-04T12:03:10Z" }, 688 | { url = "https://files.pythonhosted.org/packages/03/23/b41f936a9403b8f92325c823c0f264c6102a0687a99c820f1aaeb99c1def/pyzmq-26.4.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1410c3a3705db68d11eb2424d75894d41cff2f64d948ffe245dd97a9debfebf4", size = 867920, upload-time = "2025-04-04T12:03:11.311Z" }, 689 | { url = "https://files.pythonhosted.org/packages/c1/3e/2de5928cdadc2105e7c8f890cc5f404136b41ce5b6eae5902167f1d5641c/pyzmq-26.4.0-cp310-cp310-manylinux_2_28_x86_64.whl", hash = "sha256:7dacb06a9c83b007cc01e8e5277f94c95c453c5851aac5e83efe93e72226353f", size = 862514, upload-time = "2025-04-04T12:03:13.013Z" }, 690 | { url = "https://files.pythonhosted.org/packages/ce/57/109569514dd32e05a61d4382bc88980c95bfd2f02e58fea47ec0ccd96de1/pyzmq-26.4.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:6bab961c8c9b3a4dc94d26e9b2cdf84de9918931d01d6ff38c721a83ab3c0ef5", size = 1204494, upload-time = "2025-04-04T12:03:14.795Z" }, 691 | { url = "https://files.pythonhosted.org/packages/aa/02/dc51068ff2ca70350d1151833643a598625feac7b632372d229ceb4de3e1/pyzmq-26.4.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:7a5c09413b924d96af2aa8b57e76b9b0058284d60e2fc3730ce0f979031d162a", size = 1514525, upload-time = "2025-04-04T12:03:16.246Z" }, 692 | { url = "https://files.pythonhosted.org/packages/48/2a/a7d81873fff0645eb60afaec2b7c78a85a377af8f1d911aff045d8955bc7/pyzmq-26.4.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:7d489ac234d38e57f458fdbd12a996bfe990ac028feaf6f3c1e81ff766513d3b", size = 1414659, upload-time = "2025-04-04T12:03:17.652Z" }, 693 | { url = "https://files.pythonhosted.org/packages/ef/ea/813af9c42ae21845c1ccfe495bd29c067622a621e85d7cda6bc437de8101/pyzmq-26.4.0-cp310-cp310-win32.whl", hash = "sha256:dea1c8db78fb1b4b7dc9f8e213d0af3fc8ecd2c51a1d5a3ca1cde1bda034a980", size = 580348, upload-time = "2025-04-04T12:03:19.384Z" }, 694 | { url = "https://files.pythonhosted.org/packages/20/68/318666a89a565252c81d3fed7f3b4c54bd80fd55c6095988dfa2cd04a62b/pyzmq-26.4.0-cp310-cp310-win_amd64.whl", hash = "sha256:fa59e1f5a224b5e04dc6c101d7186058efa68288c2d714aa12d27603ae93318b", size = 643838, upload-time = "2025-04-04T12:03:20.795Z" }, 695 | { url = "https://files.pythonhosted.org/packages/91/f8/fb1a15b5f4ecd3e588bfde40c17d32ed84b735195b5c7d1d7ce88301a16f/pyzmq-26.4.0-cp310-cp310-win_arm64.whl", hash = "sha256:a651fe2f447672f4a815e22e74630b6b1ec3a1ab670c95e5e5e28dcd4e69bbb5", size = 559565, upload-time = "2025-04-04T12:03:22.676Z" }, 696 | { url = "https://files.pythonhosted.org/packages/32/6d/234e3b0aa82fd0290b1896e9992f56bdddf1f97266110be54d0177a9d2d9/pyzmq-26.4.0-cp311-cp311-macosx_10_15_universal2.whl", hash = "sha256:bfcf82644c9b45ddd7cd2a041f3ff8dce4a0904429b74d73a439e8cab1bd9e54", size = 1339723, upload-time = "2025-04-04T12:03:24.358Z" }, 697 | { url = "https://files.pythonhosted.org/packages/4f/11/6d561efe29ad83f7149a7cd48e498e539ed09019c6cd7ecc73f4cc725028/pyzmq-26.4.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e9bcae3979b2654d5289d3490742378b2f3ce804b0b5fd42036074e2bf35b030", size = 672645, upload-time = "2025-04-04T12:03:25.693Z" }, 698 | { url = "https://files.pythonhosted.org/packages/19/fd/81bfe3e23f418644660bad1a90f0d22f0b3eebe33dd65a79385530bceb3d/pyzmq-26.4.0-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ccdff8ac4246b6fb60dcf3982dfaeeff5dd04f36051fe0632748fc0aa0679c01", size = 910133, upload-time = "2025-04-04T12:03:27.625Z" }, 699 | { url = "https://files.pythonhosted.org/packages/97/68/321b9c775595ea3df832a9516252b653fe32818db66fdc8fa31c9b9fce37/pyzmq-26.4.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4550af385b442dc2d55ab7717837812799d3674cb12f9a3aa897611839c18e9e", size = 867428, upload-time = "2025-04-04T12:03:29.004Z" }, 700 | { url = "https://files.pythonhosted.org/packages/4e/6e/159cbf2055ef36aa2aa297e01b24523176e5b48ead283c23a94179fb2ba2/pyzmq-26.4.0-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:2f9f7ffe9db1187a253fca95191854b3fda24696f086e8789d1d449308a34b88", size = 862409, upload-time = "2025-04-04T12:03:31.032Z" }, 701 | { url = "https://files.pythonhosted.org/packages/05/1c/45fb8db7be5a7d0cadea1070a9cbded5199a2d578de2208197e592f219bd/pyzmq-26.4.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:3709c9ff7ba61589b7372923fd82b99a81932b592a5c7f1a24147c91da9a68d6", size = 1205007, upload-time = "2025-04-04T12:03:32.687Z" }, 702 | { url = "https://files.pythonhosted.org/packages/f8/fa/658c7f583af6498b463f2fa600f34e298e1b330886f82f1feba0dc2dd6c3/pyzmq-26.4.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:f8f3c30fb2d26ae5ce36b59768ba60fb72507ea9efc72f8f69fa088450cff1df", size = 1514599, upload-time = "2025-04-04T12:03:34.084Z" }, 703 | { url = "https://files.pythonhosted.org/packages/4d/d7/44d641522353ce0a2bbd150379cb5ec32f7120944e6bfba4846586945658/pyzmq-26.4.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:382a4a48c8080e273427fc692037e3f7d2851959ffe40864f2db32646eeb3cef", size = 1414546, upload-time = "2025-04-04T12:03:35.478Z" }, 704 | { url = "https://files.pythonhosted.org/packages/72/76/c8ed7263218b3d1e9bce07b9058502024188bd52cc0b0a267a9513b431fc/pyzmq-26.4.0-cp311-cp311-win32.whl", hash = "sha256:d56aad0517d4c09e3b4f15adebba8f6372c5102c27742a5bdbfc74a7dceb8fca", size = 579247, upload-time = "2025-04-04T12:03:36.846Z" }, 705 | { url = "https://files.pythonhosted.org/packages/c3/d0/2d9abfa2571a0b1a67c0ada79a8aa1ba1cce57992d80f771abcdf99bb32c/pyzmq-26.4.0-cp311-cp311-win_amd64.whl", hash = "sha256:963977ac8baed7058c1e126014f3fe58b3773f45c78cce7af5c26c09b6823896", size = 644727, upload-time = "2025-04-04T12:03:38.578Z" }, 706 | { url = "https://files.pythonhosted.org/packages/0d/d1/c8ad82393be6ccedfc3c9f3adb07f8f3976e3c4802640fe3f71441941e70/pyzmq-26.4.0-cp311-cp311-win_arm64.whl", hash = "sha256:c0c8e8cadc81e44cc5088fcd53b9b3b4ce9344815f6c4a03aec653509296fae3", size = 559942, upload-time = "2025-04-04T12:03:40.143Z" }, 707 | { url = "https://files.pythonhosted.org/packages/10/44/a778555ebfdf6c7fc00816aad12d185d10a74d975800341b1bc36bad1187/pyzmq-26.4.0-cp312-cp312-macosx_10_15_universal2.whl", hash = "sha256:5227cb8da4b6f68acfd48d20c588197fd67745c278827d5238c707daf579227b", size = 1341586, upload-time = "2025-04-04T12:03:41.954Z" }, 708 | { url = "https://files.pythonhosted.org/packages/9c/4f/f3a58dc69ac757e5103be3bd41fb78721a5e17da7cc617ddb56d973a365c/pyzmq-26.4.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e1c07a7fa7f7ba86554a2b1bef198c9fed570c08ee062fd2fd6a4dcacd45f905", size = 665880, upload-time = "2025-04-04T12:03:43.45Z" }, 709 | { url = "https://files.pythonhosted.org/packages/fe/45/50230bcfb3ae5cb98bee683b6edeba1919f2565d7cc1851d3c38e2260795/pyzmq-26.4.0-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ae775fa83f52f52de73183f7ef5395186f7105d5ed65b1ae65ba27cb1260de2b", size = 902216, upload-time = "2025-04-04T12:03:45.572Z" }, 710 | { url = "https://files.pythonhosted.org/packages/41/59/56bbdc5689be5e13727491ad2ba5efd7cd564365750514f9bc8f212eef82/pyzmq-26.4.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:66c760d0226ebd52f1e6b644a9e839b5db1e107a23f2fcd46ec0569a4fdd4e63", size = 859814, upload-time = "2025-04-04T12:03:47.188Z" }, 711 | { url = "https://files.pythonhosted.org/packages/81/b1/57db58cfc8af592ce94f40649bd1804369c05b2190e4cbc0a2dad572baeb/pyzmq-26.4.0-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:ef8c6ecc1d520debc147173eaa3765d53f06cd8dbe7bd377064cdbc53ab456f5", size = 855889, upload-time = "2025-04-04T12:03:49.223Z" }, 712 | { url = "https://files.pythonhosted.org/packages/e8/92/47542e629cbac8f221c230a6d0f38dd3d9cff9f6f589ed45fdf572ffd726/pyzmq-26.4.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:3150ef4084e163dec29ae667b10d96aad309b668fac6810c9e8c27cf543d6e0b", size = 1197153, upload-time = "2025-04-04T12:03:50.591Z" }, 713 | { url = "https://files.pythonhosted.org/packages/07/e5/b10a979d1d565d54410afc87499b16c96b4a181af46e7645ab4831b1088c/pyzmq-26.4.0-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:4448c9e55bf8329fa1dcedd32f661bf611214fa70c8e02fee4347bc589d39a84", size = 1507352, upload-time = "2025-04-04T12:03:52.473Z" }, 714 | { url = "https://files.pythonhosted.org/packages/ab/58/5a23db84507ab9c01c04b1232a7a763be66e992aa2e66498521bbbc72a71/pyzmq-26.4.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:e07dde3647afb084d985310d067a3efa6efad0621ee10826f2cb2f9a31b89d2f", size = 1406834, upload-time = "2025-04-04T12:03:54Z" }, 715 | { url = "https://files.pythonhosted.org/packages/22/74/aaa837b331580c13b79ac39396601fb361454ee184ca85e8861914769b99/pyzmq-26.4.0-cp312-cp312-win32.whl", hash = "sha256:ba034a32ecf9af72adfa5ee383ad0fd4f4e38cdb62b13624278ef768fe5b5b44", size = 577992, upload-time = "2025-04-04T12:03:55.815Z" }, 716 | { url = "https://files.pythonhosted.org/packages/30/0f/55f8c02c182856743b82dde46b2dc3e314edda7f1098c12a8227eeda0833/pyzmq-26.4.0-cp312-cp312-win_amd64.whl", hash = "sha256:056a97aab4064f526ecb32f4343917a4022a5d9efb6b9df990ff72e1879e40be", size = 640466, upload-time = "2025-04-04T12:03:57.231Z" }, 717 | { url = "https://files.pythonhosted.org/packages/e4/29/073779afc3ef6f830b8de95026ef20b2d1ec22d0324d767748d806e57379/pyzmq-26.4.0-cp312-cp312-win_arm64.whl", hash = "sha256:2f23c750e485ce1eb639dbd576d27d168595908aa2d60b149e2d9e34c9df40e0", size = 556342, upload-time = "2025-04-04T12:03:59.218Z" }, 718 | { url = "https://files.pythonhosted.org/packages/d7/20/fb2c92542488db70f833b92893769a569458311a76474bda89dc4264bd18/pyzmq-26.4.0-cp313-cp313-macosx_10_15_universal2.whl", hash = "sha256:c43fac689880f5174d6fc864857d1247fe5cfa22b09ed058a344ca92bf5301e3", size = 1339484, upload-time = "2025-04-04T12:04:00.671Z" }, 719 | { url = "https://files.pythonhosted.org/packages/58/29/2f06b9cabda3a6ea2c10f43e67ded3e47fc25c54822e2506dfb8325155d4/pyzmq-26.4.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:902aca7eba477657c5fb81c808318460328758e8367ecdd1964b6330c73cae43", size = 666106, upload-time = "2025-04-04T12:04:02.366Z" }, 720 | { url = "https://files.pythonhosted.org/packages/77/e4/dcf62bd29e5e190bd21bfccaa4f3386e01bf40d948c239239c2f1e726729/pyzmq-26.4.0-cp313-cp313-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e5e48a830bfd152fe17fbdeaf99ac5271aa4122521bf0d275b6b24e52ef35eb6", size = 902056, upload-time = "2025-04-04T12:04:03.919Z" }, 721 | { url = "https://files.pythonhosted.org/packages/1a/cf/b36b3d7aea236087d20189bec1a87eeb2b66009731d7055e5c65f845cdba/pyzmq-26.4.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:31be2b6de98c824c06f5574331f805707c667dc8f60cb18580b7de078479891e", size = 860148, upload-time = "2025-04-04T12:04:05.581Z" }, 722 | { url = "https://files.pythonhosted.org/packages/18/a6/f048826bc87528c208e90604c3bf573801e54bd91e390cbd2dfa860e82dc/pyzmq-26.4.0-cp313-cp313-manylinux_2_28_x86_64.whl", hash = "sha256:6332452034be001bbf3206ac59c0d2a7713de5f25bb38b06519fc6967b7cf771", size = 855983, upload-time = "2025-04-04T12:04:07.096Z" }, 723 | { url = "https://files.pythonhosted.org/packages/0a/27/454d34ab6a1d9772a36add22f17f6b85baf7c16e14325fa29e7202ca8ee8/pyzmq-26.4.0-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:da8c0f5dd352136853e6a09b1b986ee5278dfddfebd30515e16eae425c872b30", size = 1197274, upload-time = "2025-04-04T12:04:08.523Z" }, 724 | { url = "https://files.pythonhosted.org/packages/f4/3d/7abfeab6b83ad38aa34cbd57c6fc29752c391e3954fd12848bd8d2ec0df6/pyzmq-26.4.0-cp313-cp313-musllinux_1_1_i686.whl", hash = "sha256:f4ccc1a0a2c9806dda2a2dd118a3b7b681e448f3bb354056cad44a65169f6d86", size = 1507120, upload-time = "2025-04-04T12:04:10.58Z" }, 725 | { url = "https://files.pythonhosted.org/packages/13/ff/bc8d21dbb9bc8705126e875438a1969c4f77e03fc8565d6901c7933a3d01/pyzmq-26.4.0-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:1c0b5fceadbab461578daf8d1dcc918ebe7ddd2952f748cf30c7cf2de5d51101", size = 1406738, upload-time = "2025-04-04T12:04:12.509Z" }, 726 | { url = "https://files.pythonhosted.org/packages/f5/5d/d4cd85b24de71d84d81229e3bbb13392b2698432cf8fdcea5afda253d587/pyzmq-26.4.0-cp313-cp313-win32.whl", hash = "sha256:28e2b0ff5ba4b3dd11062d905682bad33385cfa3cc03e81abd7f0822263e6637", size = 577826, upload-time = "2025-04-04T12:04:14.289Z" }, 727 | { url = "https://files.pythonhosted.org/packages/c6/6c/f289c1789d7bb6e5a3b3bef7b2a55089b8561d17132be7d960d3ff33b14e/pyzmq-26.4.0-cp313-cp313-win_amd64.whl", hash = "sha256:23ecc9d241004c10e8b4f49d12ac064cd7000e1643343944a10df98e57bc544b", size = 640406, upload-time = "2025-04-04T12:04:15.757Z" }, 728 | { url = "https://files.pythonhosted.org/packages/b3/99/676b8851cb955eb5236a0c1e9ec679ea5ede092bf8bf2c8a68d7e965cac3/pyzmq-26.4.0-cp313-cp313-win_arm64.whl", hash = "sha256:1edb0385c7f025045d6e0f759d4d3afe43c17a3d898914ec6582e6f464203c08", size = 556216, upload-time = "2025-04-04T12:04:17.212Z" }, 729 | { url = "https://files.pythonhosted.org/packages/65/c2/1fac340de9d7df71efc59d9c50fc7a635a77b103392d1842898dd023afcb/pyzmq-26.4.0-cp313-cp313t-macosx_10_15_universal2.whl", hash = "sha256:93a29e882b2ba1db86ba5dd5e88e18e0ac6b627026c5cfbec9983422011b82d4", size = 1333769, upload-time = "2025-04-04T12:04:18.665Z" }, 730 | { url = "https://files.pythonhosted.org/packages/5c/c7/6c03637e8d742c3b00bec4f5e4cd9d1c01b2f3694c6f140742e93ca637ed/pyzmq-26.4.0-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cb45684f276f57110bb89e4300c00f1233ca631f08f5f42528a5c408a79efc4a", size = 658826, upload-time = "2025-04-04T12:04:20.405Z" }, 731 | { url = "https://files.pythonhosted.org/packages/a5/97/a8dca65913c0f78e0545af2bb5078aebfc142ca7d91cdaffa1fbc73e5dbd/pyzmq-26.4.0-cp313-cp313t-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f72073e75260cb301aad4258ad6150fa7f57c719b3f498cb91e31df16784d89b", size = 891650, upload-time = "2025-04-04T12:04:22.413Z" }, 732 | { url = "https://files.pythonhosted.org/packages/7d/7e/f63af1031eb060bf02d033732b910fe48548dcfdbe9c785e9f74a6cc6ae4/pyzmq-26.4.0-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:be37e24b13026cfedd233bcbbccd8c0bcd2fdd186216094d095f60076201538d", size = 849776, upload-time = "2025-04-04T12:04:23.959Z" }, 733 | { url = "https://files.pythonhosted.org/packages/f6/fa/1a009ce582802a895c0d5fe9413f029c940a0a8ee828657a3bb0acffd88b/pyzmq-26.4.0-cp313-cp313t-manylinux_2_28_x86_64.whl", hash = "sha256:237b283044934d26f1eeff4075f751b05d2f3ed42a257fc44386d00df6a270cf", size = 842516, upload-time = "2025-04-04T12:04:25.449Z" }, 734 | { url = "https://files.pythonhosted.org/packages/6e/bc/f88b0bad0f7a7f500547d71e99f10336f2314e525d4ebf576a1ea4a1d903/pyzmq-26.4.0-cp313-cp313t-musllinux_1_1_aarch64.whl", hash = "sha256:b30f862f6768b17040929a68432c8a8be77780317f45a353cb17e423127d250c", size = 1189183, upload-time = "2025-04-04T12:04:27.035Z" }, 735 | { url = "https://files.pythonhosted.org/packages/d9/8c/db446a3dd9cf894406dec2e61eeffaa3c07c3abb783deaebb9812c4af6a5/pyzmq-26.4.0-cp313-cp313t-musllinux_1_1_i686.whl", hash = "sha256:c80fcd3504232f13617c6ab501124d373e4895424e65de8b72042333316f64a8", size = 1495501, upload-time = "2025-04-04T12:04:28.833Z" }, 736 | { url = "https://files.pythonhosted.org/packages/05/4c/bf3cad0d64c3214ac881299c4562b815f05d503bccc513e3fd4fdc6f67e4/pyzmq-26.4.0-cp313-cp313t-musllinux_1_1_x86_64.whl", hash = "sha256:26a2a7451606b87f67cdeca2c2789d86f605da08b4bd616b1a9981605ca3a364", size = 1395540, upload-time = "2025-04-04T12:04:30.562Z" }, 737 | { url = "https://files.pythonhosted.org/packages/47/03/96004704a84095f493be8d2b476641f5c967b269390173f85488a53c1c13/pyzmq-26.4.0-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:98d948288ce893a2edc5ec3c438fe8de2daa5bbbd6e2e865ec5f966e237084ba", size = 834408, upload-time = "2025-04-04T12:05:04.569Z" }, 738 | { url = "https://files.pythonhosted.org/packages/e4/7f/68d8f3034a20505db7551cb2260248be28ca66d537a1ac9a257913d778e4/pyzmq-26.4.0-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a9f34f5c9e0203ece706a1003f1492a56c06c0632d86cb77bcfe77b56aacf27b", size = 569580, upload-time = "2025-04-04T12:05:06.283Z" }, 739 | { url = "https://files.pythonhosted.org/packages/9b/a6/2b0d6801ec33f2b2a19dd8d02e0a1e8701000fec72926e6787363567d30c/pyzmq-26.4.0-pp310-pypy310_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:80c9b48aef586ff8b698359ce22f9508937c799cc1d2c9c2f7c95996f2300c94", size = 798250, upload-time = "2025-04-04T12:05:07.88Z" }, 740 | { url = "https://files.pythonhosted.org/packages/96/2a/0322b3437de977dcac8a755d6d7ce6ec5238de78e2e2d9353730b297cf12/pyzmq-26.4.0-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f3f2a5b74009fd50b53b26f65daff23e9853e79aa86e0aa08a53a7628d92d44a", size = 756758, upload-time = "2025-04-04T12:05:09.483Z" }, 741 | { url = "https://files.pythonhosted.org/packages/c2/33/43704f066369416d65549ccee366cc19153911bec0154da7c6b41fca7e78/pyzmq-26.4.0-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:61c5f93d7622d84cb3092d7f6398ffc77654c346545313a3737e266fc11a3beb", size = 555371, upload-time = "2025-04-04T12:05:11.062Z" }, 742 | { url = "https://files.pythonhosted.org/packages/04/52/a70fcd5592715702248306d8e1729c10742c2eac44529984413b05c68658/pyzmq-26.4.0-pp311-pypy311_pp73-macosx_10_15_x86_64.whl", hash = "sha256:4478b14cb54a805088299c25a79f27eaf530564a7a4f72bf432a040042b554eb", size = 834405, upload-time = "2025-04-04T12:05:13.3Z" }, 743 | { url = "https://files.pythonhosted.org/packages/25/f9/1a03f1accff16b3af1a6fa22cbf7ced074776abbf688b2e9cb4629700c62/pyzmq-26.4.0-pp311-pypy311_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8a28ac29c60e4ba84b5f58605ace8ad495414a724fe7aceb7cf06cd0598d04e1", size = 569578, upload-time = "2025-04-04T12:05:15.36Z" }, 744 | { url = "https://files.pythonhosted.org/packages/76/0c/3a633acd762aa6655fcb71fa841907eae0ab1e8582ff494b137266de341d/pyzmq-26.4.0-pp311-pypy311_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:43b03c1ceea27c6520124f4fb2ba9c647409b9abdf9a62388117148a90419494", size = 798248, upload-time = "2025-04-04T12:05:17.376Z" }, 745 | { url = "https://files.pythonhosted.org/packages/cd/cc/6c99c84aa60ac1cc56747bed6be8ce6305b9b861d7475772e7a25ce019d3/pyzmq-26.4.0-pp311-pypy311_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7731abd23a782851426d4e37deb2057bf9410848a4459b5ede4fe89342e687a9", size = 756757, upload-time = "2025-04-04T12:05:19.19Z" }, 746 | { url = "https://files.pythonhosted.org/packages/13/9c/d8073bd898eb896e94c679abe82e47506e2b750eb261cf6010ced869797c/pyzmq-26.4.0-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:a222ad02fbe80166b0526c038776e8042cd4e5f0dec1489a006a1df47e9040e0", size = 555371, upload-time = "2025-04-04T12:05:20.702Z" }, 747 | ] 748 | 749 | [[package]] 750 | name = "requests" 751 | version = "2.32.3" 752 | source = { registry = "https://pypi.org/simple" } 753 | dependencies = [ 754 | { name = "certifi" }, 755 | { name = "charset-normalizer" }, 756 | { name = "idna" }, 757 | { name = "urllib3" }, 758 | ] 759 | sdist = { url = "https://files.pythonhosted.org/packages/63/70/2bf7780ad2d390a8d301ad0b550f1581eadbd9a20f896afe06353c2a2913/requests-2.32.3.tar.gz", hash = "sha256:55365417734eb18255590a9ff9eb97e9e1da868d4ccd6402399eaf68af20a760", size = 131218, upload-time = "2024-05-29T15:37:49.536Z" } 760 | wheels = [ 761 | { url = "https://files.pythonhosted.org/packages/f9/9b/335f9764261e915ed497fcdeb11df5dfd6f7bf257d4a6a2a686d80da4d54/requests-2.32.3-py3-none-any.whl", hash = "sha256:70761cfe03c773ceb22aa2f671b4757976145175cdfca038c02654d061d6dcc6", size = 64928, upload-time = "2024-05-29T15:37:47.027Z" }, 762 | ] 763 | 764 | [[package]] 765 | name = "six" 766 | version = "1.17.0" 767 | source = { registry = "https://pypi.org/simple" } 768 | sdist = { url = "https://files.pythonhosted.org/packages/94/e7/b2c673351809dca68a0e064b6af791aa332cf192da575fd474ed7d6f16a2/six-1.17.0.tar.gz", hash = "sha256:ff70335d468e7eb6ec65b95b99d3a2836546063f63acc5171de367e834932a81", size = 34031, upload-time = "2024-12-04T17:35:28.174Z" } 769 | wheels = [ 770 | { url = "https://files.pythonhosted.org/packages/b7/ce/149a00dd41f10bc29e5921b496af8b574d8413afcd5e30dfa0ed46c2cc5e/six-1.17.0-py2.py3-none-any.whl", hash = "sha256:4721f391ed90541fddacab5acf947aa0d3dc7d27b2e1e8eda2be8970586c3274", size = 11050, upload-time = "2024-12-04T17:35:26.475Z" }, 771 | ] 772 | 773 | [[package]] 774 | name = "stack-data" 775 | version = "0.6.3" 776 | source = { registry = "https://pypi.org/simple" } 777 | dependencies = [ 778 | { name = "asttokens" }, 779 | { name = "executing" }, 780 | { name = "pure-eval" }, 781 | ] 782 | sdist = { url = "https://files.pythonhosted.org/packages/28/e3/55dcc2cfbc3ca9c29519eb6884dd1415ecb53b0e934862d3559ddcb7e20b/stack_data-0.6.3.tar.gz", hash = "sha256:836a778de4fec4dcd1dcd89ed8abff8a221f58308462e1c4aa2a3cf30148f0b9", size = 44707, upload-time = "2023-09-30T13:58:05.479Z" } 783 | wheels = [ 784 | { url = "https://files.pythonhosted.org/packages/f1/7b/ce1eafaf1a76852e2ec9b22edecf1daa58175c090266e9f6c64afcd81d91/stack_data-0.6.3-py3-none-any.whl", hash = "sha256:d5558e0c25a4cb0853cddad3d77da9891a08cb85dd9f9f91b9f8cd66e511e695", size = 24521, upload-time = "2023-09-30T13:58:03.53Z" }, 785 | ] 786 | 787 | [[package]] 788 | name = "tornado" 789 | version = "6.5.1" 790 | source = { registry = "https://pypi.org/simple" } 791 | sdist = { url = "https://files.pythonhosted.org/packages/51/89/c72771c81d25d53fe33e3dca61c233b665b2780f21820ba6fd2c6793c12b/tornado-6.5.1.tar.gz", hash = "sha256:84ceece391e8eb9b2b95578db65e920d2a61070260594819589609ba9bc6308c", size = 509934, upload-time = "2025-05-22T18:15:38.788Z" } 792 | wheels = [ 793 | { url = "https://files.pythonhosted.org/packages/77/89/f4532dee6843c9e0ebc4e28d4be04c67f54f60813e4bf73d595fe7567452/tornado-6.5.1-cp39-abi3-macosx_10_9_universal2.whl", hash = "sha256:d50065ba7fd11d3bd41bcad0825227cc9a95154bad83239357094c36708001f7", size = 441948, upload-time = "2025-05-22T18:15:20.862Z" }, 794 | { url = "https://files.pythonhosted.org/packages/15/9a/557406b62cffa395d18772e0cdcf03bed2fff03b374677348eef9f6a3792/tornado-6.5.1-cp39-abi3-macosx_10_9_x86_64.whl", hash = "sha256:9e9ca370f717997cb85606d074b0e5b247282cf5e2e1611568b8821afe0342d6", size = 440112, upload-time = "2025-05-22T18:15:22.591Z" }, 795 | { url = "https://files.pythonhosted.org/packages/55/82/7721b7319013a3cf881f4dffa4f60ceff07b31b394e459984e7a36dc99ec/tornado-6.5.1-cp39-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b77e9dfa7ed69754a54c89d82ef746398be82f749df69c4d3abe75c4d1ff4888", size = 443672, upload-time = "2025-05-22T18:15:24.027Z" }, 796 | { url = "https://files.pythonhosted.org/packages/7d/42/d11c4376e7d101171b94e03cef0cbce43e823ed6567ceda571f54cf6e3ce/tornado-6.5.1-cp39-abi3-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:253b76040ee3bab8bcf7ba9feb136436a3787208717a1fb9f2c16b744fba7331", size = 443019, upload-time = "2025-05-22T18:15:25.735Z" }, 797 | { url = "https://files.pythonhosted.org/packages/7d/f7/0c48ba992d875521ac761e6e04b0a1750f8150ae42ea26df1852d6a98942/tornado-6.5.1-cp39-abi3-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:308473f4cc5a76227157cdf904de33ac268af770b2c5f05ca6c1161d82fdd95e", size = 443252, upload-time = "2025-05-22T18:15:27.499Z" }, 798 | { url = "https://files.pythonhosted.org/packages/89/46/d8d7413d11987e316df4ad42e16023cd62666a3c0dfa1518ffa30b8df06c/tornado-6.5.1-cp39-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:caec6314ce8a81cf69bd89909f4b633b9f523834dc1a352021775d45e51d9401", size = 443930, upload-time = "2025-05-22T18:15:29.299Z" }, 799 | { url = "https://files.pythonhosted.org/packages/78/b2/f8049221c96a06df89bed68260e8ca94beca5ea532ffc63b1175ad31f9cc/tornado-6.5.1-cp39-abi3-musllinux_1_2_i686.whl", hash = "sha256:13ce6e3396c24e2808774741331638ee6c2f50b114b97a55c5b442df65fd9692", size = 443351, upload-time = "2025-05-22T18:15:31.038Z" }, 800 | { url = "https://files.pythonhosted.org/packages/76/ff/6a0079e65b326cc222a54720a748e04a4db246870c4da54ece4577bfa702/tornado-6.5.1-cp39-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:5cae6145f4cdf5ab24744526cc0f55a17d76f02c98f4cff9daa08ae9a217448a", size = 443328, upload-time = "2025-05-22T18:15:32.426Z" }, 801 | { url = "https://files.pythonhosted.org/packages/49/18/e3f902a1d21f14035b5bc6246a8c0f51e0eef562ace3a2cea403c1fb7021/tornado-6.5.1-cp39-abi3-win32.whl", hash = "sha256:e0a36e1bc684dca10b1aa75a31df8bdfed656831489bc1e6a6ebed05dc1ec365", size = 444396, upload-time = "2025-05-22T18:15:34.205Z" }, 802 | { url = "https://files.pythonhosted.org/packages/7b/09/6526e32bf1049ee7de3bebba81572673b19a2a8541f795d887e92af1a8bc/tornado-6.5.1-cp39-abi3-win_amd64.whl", hash = "sha256:908e7d64567cecd4c2b458075589a775063453aeb1d2a1853eedb806922f568b", size = 444840, upload-time = "2025-05-22T18:15:36.1Z" }, 803 | { url = "https://files.pythonhosted.org/packages/55/a7/535c44c7bea4578e48281d83c615219f3ab19e6abc67625ef637c73987be/tornado-6.5.1-cp39-abi3-win_arm64.whl", hash = "sha256:02420a0eb7bf617257b9935e2b754d1b63897525d8a289c9d65690d580b4dcf7", size = 443596, upload-time = "2025-05-22T18:15:37.433Z" }, 804 | ] 805 | 806 | [[package]] 807 | name = "tqdm" 808 | version = "4.67.1" 809 | source = { registry = "https://pypi.org/simple" } 810 | dependencies = [ 811 | { name = "colorama", marker = "sys_platform == 'win32'" }, 812 | ] 813 | sdist = { url = "https://files.pythonhosted.org/packages/a8/4b/29b4ef32e036bb34e4ab51796dd745cdba7ed47ad142a9f4a1eb8e0c744d/tqdm-4.67.1.tar.gz", hash = "sha256:f8aef9c52c08c13a65f30ea34f4e5aac3fd1a34959879d7e59e63027286627f2", size = 169737, upload-time = "2024-11-24T20:12:22.481Z" } 814 | wheels = [ 815 | { url = "https://files.pythonhosted.org/packages/d0/30/dc54f88dd4a2b5dc8a0279bdd7270e735851848b762aeb1c1184ed1f6b14/tqdm-4.67.1-py3-none-any.whl", hash = "sha256:26445eca388f82e72884e0d580d5464cd801a3ea01e63e5601bdff9ba6a48de2", size = 78540, upload-time = "2024-11-24T20:12:19.698Z" }, 816 | ] 817 | 818 | [[package]] 819 | name = "traitlets" 820 | version = "5.14.3" 821 | source = { registry = "https://pypi.org/simple" } 822 | sdist = { url = "https://files.pythonhosted.org/packages/eb/79/72064e6a701c2183016abbbfedaba506d81e30e232a68c9f0d6f6fcd1574/traitlets-5.14.3.tar.gz", hash = "sha256:9ed0579d3502c94b4b3732ac120375cda96f923114522847de4b3bb98b96b6b7", size = 161621, upload-time = "2024-04-19T11:11:49.746Z" } 823 | wheels = [ 824 | { url = "https://files.pythonhosted.org/packages/00/c0/8f5d070730d7836adc9c9b6408dec68c6ced86b304a9b26a14df072a6e8c/traitlets-5.14.3-py3-none-any.whl", hash = "sha256:b74e89e397b1ed28cc831db7aea759ba6640cb3de13090ca145426688ff1ac4f", size = 85359, upload-time = "2024-04-19T11:11:46.763Z" }, 825 | ] 826 | 827 | [[package]] 828 | name = "typing-extensions" 829 | version = "4.13.2" 830 | source = { registry = "https://pypi.org/simple" } 831 | sdist = { url = "https://files.pythonhosted.org/packages/f6/37/23083fcd6e35492953e8d2aaaa68b860eb422b34627b13f2ce3eb6106061/typing_extensions-4.13.2.tar.gz", hash = "sha256:e6c81219bd689f51865d9e372991c540bda33a0379d5573cddb9a3a23f7caaef", size = 106967, upload-time = "2025-04-10T14:19:05.416Z" } 832 | wheels = [ 833 | { url = "https://files.pythonhosted.org/packages/8b/54/b1ae86c0973cc6f0210b53d508ca3641fb6d0c56823f288d108bc7ab3cc8/typing_extensions-4.13.2-py3-none-any.whl", hash = "sha256:a439e7c04b49fec3e5d3e2beaa21755cadbbdc391694e28ccdd36ca4a1408f8c", size = 45806, upload-time = "2025-04-10T14:19:03.967Z" }, 834 | ] 835 | 836 | [[package]] 837 | name = "tzdata" 838 | version = "2025.2" 839 | source = { registry = "https://pypi.org/simple" } 840 | sdist = { url = "https://files.pythonhosted.org/packages/95/32/1a225d6164441be760d75c2c42e2780dc0873fe382da3e98a2e1e48361e5/tzdata-2025.2.tar.gz", hash = "sha256:b60a638fcc0daffadf82fe0f57e53d06bdec2f36c4df66280ae79bce6bd6f2b9", size = 196380, upload-time = "2025-03-23T13:54:43.652Z" } 841 | wheels = [ 842 | { url = "https://files.pythonhosted.org/packages/5c/23/c7abc0ca0a1526a0774eca151daeb8de62ec457e77262b66b359c3c7679e/tzdata-2025.2-py2.py3-none-any.whl", hash = "sha256:1a403fada01ff9221ca8044d701868fa132215d84beb92242d9acd2147f667a8", size = 347839, upload-time = "2025-03-23T13:54:41.845Z" }, 843 | ] 844 | 845 | [[package]] 846 | name = "urllib3" 847 | version = "2.4.0" 848 | source = { registry = "https://pypi.org/simple" } 849 | sdist = { url = "https://files.pythonhosted.org/packages/8a/78/16493d9c386d8e60e442a35feac5e00f0913c0f4b7c217c11e8ec2ff53e0/urllib3-2.4.0.tar.gz", hash = "sha256:414bc6535b787febd7567804cc015fee39daab8ad86268f1310a9250697de466", size = 390672, upload-time = "2025-04-10T15:23:39.232Z" } 850 | wheels = [ 851 | { url = "https://files.pythonhosted.org/packages/6b/11/cc635220681e93a0183390e26485430ca2c7b5f9d33b15c74c2861cb8091/urllib3-2.4.0-py3-none-any.whl", hash = "sha256:4e16665048960a0900c702d4a66415956a584919c03361cac9f1df5c5dd7e813", size = 128680, upload-time = "2025-04-10T15:23:37.377Z" }, 852 | ] 853 | 854 | [[package]] 855 | name = "vlmhyperbench" 856 | version = "0.1.3" 857 | source = { virtual = "." } 858 | dependencies = [ 859 | { name = "benchmark-run-config" }, 860 | { name = "config-manager" }, 861 | { name = "docker" }, 862 | { name = "ipykernel" }, 863 | { name = "pandas" }, 864 | { name = "python-dotenv" }, 865 | { name = "tqdm" }, 866 | ] 867 | 868 | [package.metadata] 869 | requires-dist = [ 870 | { name = "benchmark-run-config", git = "https://github.com/VLMHyperBenchTeam/benchmark_run_config.git?rev=0.1.4" }, 871 | { name = "config-manager", git = "https://github.com/VLMHyperBenchTeam/config_manager.git?rev=0.1.2" }, 872 | { name = "docker", specifier = ">=7.1.0" }, 873 | { name = "ipykernel", specifier = ">=6.29.5" }, 874 | { name = "pandas", specifier = ">=2.2.3" }, 875 | { name = "python-dotenv", specifier = ">=1.1.0" }, 876 | { name = "tqdm", specifier = ">=4.67.1" }, 877 | ] 878 | 879 | [[package]] 880 | name = "wcwidth" 881 | version = "0.2.13" 882 | source = { registry = "https://pypi.org/simple" } 883 | sdist = { url = "https://files.pythonhosted.org/packages/6c/63/53559446a878410fc5a5974feb13d31d78d752eb18aeba59c7fef1af7598/wcwidth-0.2.13.tar.gz", hash = "sha256:72ea0c06399eb286d978fdedb6923a9eb47e1c486ce63e9b4e64fc18303972b5", size = 101301, upload-time = "2024-01-06T02:10:57.829Z" } 884 | wheels = [ 885 | { url = "https://files.pythonhosted.org/packages/fd/84/fd2ba7aafacbad3c4201d395674fc6348826569da3c0937e75505ead3528/wcwidth-0.2.13-py2.py3-none-any.whl", hash = "sha256:3da69048e4540d84af32131829ff948f1e022c1c6bdb8d6102117aac784f6859", size = 34166, upload-time = "2024-01-06T02:10:55.763Z" }, 886 | ] 887 | --------------------------------------------------------------------------------