From fad589ba6c97284466516bb544be0c4ed05dba8e Mon Sep 17 00:00:00 2001 From: Georgy Gospodinov Date: Fri, 13 Dec 2024 11:11:42 +0300 Subject: [PATCH 01/15] GigaAM-v2: MIT license, updated weights, ONNX --- .gitignore | 5 + GigaAM License_NC.pdf | Bin 91423 -> 0 bytes LICENSE | 21 + README.md | 232 +++- README_ru.md | 208 ++- examples/Dockerfile | 13 - examples/README.md | 126 -- examples/ctc_inference.py | 83 -- examples/ctc_longform_inference.py | 201 --- examples/emo_inference.py | 81 -- .../GigaAM_CTC_Model_Usage_Example.ipynb | 1162 ---------------- .../GigaAM_Emo_Model_Usage_Example.ipynb | 955 ------------- .../GigaAM_Model_Usage_Example.ipynb | 881 ------------ .../GigaAM_RNNT_Model_Usage_Example.ipynb | 1235 ----------------- examples/rnnt_inference.py | 98 -- examples/rnnt_longform_inference.py | 210 --- examples/ssl_inference.py | 55 - gigaam/__init__.py | 145 ++ gigaam/decoder.py | 128 ++ gigaam/decoding.py | 127 ++ gigaam/encoder.py | 527 +++++++ gigaam/model.py | 224 +++ gigaam/onnx_utils.py | 166 +++ gigaam/preprocess.py | 86 ++ gigaam/utils.py | 133 ++ gigaam/vad_utils.py | 102 ++ gigaam_scheme.svg | 2 +- inference_example.ipynb | 468 +++++++ requirements.txt | 10 + setup.py | 25 + 30 files changed, 2513 insertions(+), 5196 deletions(-) create mode 100644 .gitignore delete mode 100644 GigaAM License_NC.pdf create mode 100644 LICENSE delete mode 100644 examples/Dockerfile delete mode 100644 examples/README.md delete mode 100644 examples/ctc_inference.py delete mode 100644 examples/ctc_longform_inference.py delete mode 100644 examples/emo_inference.py delete mode 100644 examples/notebooks/GigaAM_CTC_Model_Usage_Example.ipynb delete mode 100644 examples/notebooks/GigaAM_Emo_Model_Usage_Example.ipynb delete mode 100644 examples/notebooks/GigaAM_Model_Usage_Example.ipynb delete mode 100644 examples/notebooks/GigaAM_RNNT_Model_Usage_Example.ipynb delete mode 100644 examples/rnnt_inference.py delete mode 100644 examples/rnnt_longform_inference.py delete mode 100644 examples/ssl_inference.py create mode 100644 gigaam/__init__.py create mode 100644 gigaam/decoder.py create mode 100644 gigaam/decoding.py create mode 100644 gigaam/encoder.py create mode 100644 gigaam/model.py create mode 100644 gigaam/onnx_utils.py create mode 100644 gigaam/preprocess.py create mode 100644 gigaam/utils.py create mode 100644 gigaam/vad_utils.py create mode 100644 inference_example.ipynb create mode 100644 requirements.txt create mode 100644 setup.py diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..57c7e43 --- /dev/null +++ b/.gitignore @@ -0,0 +1,5 @@ +__pycache__ +build +*.egg-info +*.wav +.DS_Store diff --git a/GigaAM License_NC.pdf b/GigaAM License_NC.pdf deleted file mode 100644 index d9a6f7fff2e4acc126435550348f66a5998d5b2b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 91423 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 diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..8d9a2e7 --- /dev/null +++ b/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2024 GigaChat Team + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/README.md b/README.md index 04c8604..b63a31f 100644 --- a/README.md +++ b/README.md @@ -2,76 +2,188 @@ ![plot](./gigaam_scheme.svg) -## Table of contents +## Latest News +* 2024/12 — [MIT License](./LICENSE), GigaAM-v2 (**-15%** and **-12%** WER Reduction for CTC and RNN-T models, respectively), [ONNX export support](#onnx-inference-example) +* 2024/05 — GigaAM-RNNT (**-19%** WER Reduction), [long-form inference using external Voice Activity Detection](#long-form-audio-transcribation) +* 2024/04 — GigaAM Release: GigaAM-CTC ([SoTA Speech Recognition model for the Russian language](#performance-metrics-word-error-rate)), [GigaAM-Emo](#gigaam-emo-emotion-recognition) +--- -* [GigaAM](#gigaam) -* [GigaAM for Speech Recognition](#gigaam-for-speech-recognition) - * [GigaAM-CTC](#gigaam-ctc) - * [GigaAM-RNNT](#gigaam-rnnt) -* [GigaAM-Emo](#gigaam-emo) -* [License](./GigaAM%20License_NC.pdf) -* [Links](#links) +## Table of Contents -## GigaAM +- [Overview](#overview) +- [Installation](#installation) +- [GigaAM: The Foundational Model](#gigaam-the-foundational-model) +- [GigaAM for Speech Recognition](#gigaam-for-speech-recognition) + - [GigaAM-CTC](#gigaam-ctc) + - [GigaAM-RNNT](#gigaam-rnnt) +- [GigaAM-Emo: Emotion Recognition](#gigaam-emo-emotion-recognition) +- [License](#license) +- [Links](#links) -GigaAM (**Giga** **A**coustic **M**odel) is a [Conformer](https://arxiv.org/pdf/2005.08100.pdf)-based [wav2vec2](https://arxiv.org/pdf/2006.11477.pdf) foundational model (around 240M parameters). We trained GigaAM on nearly 50 thousand hours of diversified speech audio in the Russian language. +--- -Resources: -* [Model weights](https://n-ws-q0bez.s3pd12.sbercloud.ru/b-ws-q0bez-jpv/GigaAM/ssl_model_weights.ckpt) -* [Encoder config](https://n-ws-q0bez.s3pd12.sbercloud.ru/b-ws-q0bez-jpv/GigaAM/encoder_config.yaml) -* [Colab example](https://colab.research.google.com/github/salute-developers/GigaAM/blob/main/examples/notebooks/GigaAM_Model_Usage_Example.ipynb) -* [Docker example](./examples/README.md) +## Overview +GigaAM (**Giga** **A**coustic **M**odel) is a family of open-source models for Russian speech processing tasks, including speech recognition and emotion recognition. The models are built on top of the [Conformer](https://arxiv.org/pdf/2005.08100.pdf) architecture and leverage self-supervised learning ([wav2vec2](https://arxiv.org/abs/2006.11477)-based for GigaAM-v1 and [HuBERT](https://arxiv.org/pdf/2106.07447)-based for GigaAM-v2). + +GigaAM models are state-of-the-art open-source solutions for their respective tasks in the Russian language. + +This repository includes: + +- **GigaAM**: A foundational self-supervised model pre-trained on massive Russian speech datasets. +- **GigaAM-CTC** and **GigaAM-RNNT**: Fine-tuned models for automatic speech recognition (ASR). +- **GigaAM-Emo**: A fine-tuned model for emotion recognition. + +## Installation + +### Requirements +- Python ≥ 3.8 +- [ffmpeg](https://ffmpeg.org/) installed and added to your system's PATH + +### Install the GigaAM Package + +1. Clone the repository: + ```bash + git clone https://github.com/salute-developers/GigaAM.git + cd GigaAM + ``` + +2. Install the package in editable mode: + ```bash + pip install -e . + ``` + +3. Verify the installation: + ```python + import gigaam + model = gigaam.load_model("ctc") + print(model) + ``` + +--- + +## GigaAM: The Foundational Model + +GigaAM is a [Conformer](https://arxiv.org/pdf/2005.08100.pdf)-based foundational model (240M parameters) pre-trained on 50,000+ hours of diverse Russian speech data. + +It serves as the backbone for the entire GigaAM family, enabling state-of-the-art fine-tuned performance in speech recognition and emotion recognition. + +There are 2 available versions: + +* GigaAM-v1 was trained with a [wav2vec2](https://arxiv.org/abs/2006.11477)-like approach and can be used by loading the `v1_ssl` model version. +* GigaAM-v2 was trained with a [HuBERT](https://arxiv.org/pdf/2106.07447)-like approach and allows us to get GigaAM-v2 ASR model with better quality. It can be used by loading the `v2_ssl` or `ssl` model version. + +More information about GigaAM-v1 can be found in our [post on Habr](https://habr.com/ru/companies/sberdevices/articles/805569). + +### GigaAM Usage Example + +```python +import gigaam +model = gigaam.load_model('ssl') # Options: "ssl", "v1_ssl" +embedding, _ = model.embed_audio(audio_path) +``` + +--- ## GigaAM for Speech Recognition -We fine-tuned the GigaAM encoder for Speech Recognition with two different decoders: -* GigaAM-CTC was fine-tunined with [Connectionist Temporal Classification](https://www.cs.toronto.edu/~graves/icml_2006.pdf) and character-based tokenizer. -* GigaAM-RNNT was fine-tuned with [RNN Transducer loss](https://arxiv.org/abs/1211.3711) and subword tokenizer. +We fine-tuned the GigaAM encoder for ASR using two different architectures: + +- GigaAM-CTC was fine-tuned with [Connectionist Temporal Classification](https://www.cs.toronto.edu/~graves/icml_2006.pdf) and a character-based tokenizer. +- GigaAM-RNNT was fine-tuned with [RNN Transducer loss](https://arxiv.org/abs/1211.3711). -Both models were trained using [the NeMo toolkit](https://github.com/NVIDIA/NeMo) on publicly available Russian labeled data: +Fine-tuning was done for both GigaAM-v1 and GigaAM-v2 SSL models, so we have 4 ASR models: `v1` and `v2` versions for both CTC and RNNT. -| dataset | size, hours | weight | -| --- | --- | --- | -| [Golos](https://arxiv.org/pdf/2106.10161.pdf) | 1227 | 0.6 | -| [SOVA](https://github.com/sovaai/sova-dataset) | 369 | 0.2 | -| [Russian Common Voice](https://arxiv.org/pdf/1912.06670.pdf) | 207 | 0.1 | -| [Russian LibriSpeech](https://arxiv.org/pdf/2012.03411.pdf) | 93 | 0.1 | +### Training Data +The models were trained on publicly available Russian datasets: +| Dataset | Size (hours) | Weight | +|------------------------|--------------|--------| +| Golos | 1227 | 0.6 | +| SOVA | 369 | 0.2 | +| Russian Common Voice | 207 | 0.1 | +| Russian LibriSpeech | 93 | 0.1 | -Resources: -* ### GigaAM-CTC: - * [Model weights](https://n-ws-q0bez.s3pd12.sbercloud.ru/b-ws-q0bez-jpv/GigaAM/ctc_model_weights.ckpt) - * [Model config](https://n-ws-q0bez.s3pd12.sbercloud.ru/b-ws-q0bez-jpv/GigaAM/ctc_model_config.yaml) - * [Colab example](https://colab.research.google.com/github/salute-developers/GigaAM/blob/main/examples/notebooks/GigaAM_CTC_Model_Usage_Example.ipynb) - * [Docker example](./examples/README.md) -* ### GigaAM-RNNT: - * [Model weights](https://n-ws-q0bez.s3pd12.sbercloud.ru/b-ws-q0bez-jpv/GigaAM/rnnt_model_weights.ckpt) - * [Model config](https://n-ws-q0bez.s3pd12.sbercloud.ru/b-ws-q0bez-jpv/GigaAM/rnnt_model_config.yaml) - * [Colab example](https://colab.research.google.com/github/salute-developers/GigaAM/blob/main/examples/notebooks/GigaAM_RNNT_Model_Usage_Example.ipynb) - * [Docker examples](./examples/README.md) +### Performance Metrics (Word Error Rate) +| Model | Parameters | Golos Crowd | Golos Farfield | OpenSTT YouTube | OpenSTT Phone Calls | OpenSTT Audiobooks | Mozilla Common Voice 12 | Mozilla Common Voice 19 | Russian LibriSpeech | +|--------------------|------------|-------------|----------------|-----------------|----------------------|--------------------|-------|-------|---------------------| +| Whisper-large-v3 | 1.5B | 13.9 | 16.6 | 18.0 | 28.0 | 14.4 | 5.7 | 5.5 | 9.5 | +| NVIDIA FastConformer | 115M | 2.2 | 6.6 | 21.2 | 30.0 | 13.9 | 2.7 | 5.7 | 11.3 | +| **GigaAM-CTC-v1** | 242M | 3.0 | 5.7 | 16.0 | 23.2 | 12.5 | 2.0 | 10.5 | 7.5 | +| **GigaAM-RNNT-v1** | 243M | 2.3 | 5.0 | 14.0 | 21.7 | 11.7 | 1.9 | 9.9 | 7.7 | +| **GigaAM-CTC-v2** | 242M | 2.5 | 4.3 | 14.1 | 21.1 | 10.7 | 2.1 | 3.1 | 5.5 | +| **GigaAM-RNNT-v2** | 243M | **2.2** | **3.9** | **13.3** | **20.0** | **10.2** | **1.8** | **2.7** | **5.5** | -The following table summarizes the performance of different models in terms of Word Error Rate on open Russian datasets: -| model | parameters | [Golos Crowd](https://arxiv.org/abs/2106.10161) | [Golos Farfield](https://arxiv.org/abs/2106.10161) | [OpenSTT Youtube](https://github.com/snakers4/open_stt) | [OpenSTT Phone calls](https://github.com/snakers4/open_stt) | [OpenSTT Audiobooks](https://github.com/snakers4/open_stt) | [Mozilla Common Voice](https://arxiv.org/pdf/1912.06670.pdf) | [Russian LibriSpeech](https://arxiv.org/pdf/2012.03411.pdf) | -| --- | --- | --- | --- | --- | --- | --- | --- | --- | -| [Whisper-large-v3](https://huggingface.co/openai/whisper-large-v3) | 1.5B | 17.4 | 14.5 | 21.1 | 31.2 | 17.0 | 5.3 | 9.0 | -| [NVIDIA Ru-FastConformer-RNNT](https://huggingface.co/nvidia/stt_ru_fastconformer_hybrid_large_pc) | 115M | 2.6 | 6.6 | 23.8 | 32.9 | 16.4 | 2.7 | 11.6 | -| GigaAM-CTC | 242M | 3.1 | 5.7 | 18.4 | 25.6 | 15.1| 1.7 | 8.1 | -| GigaAM-RNNT | 243M | 2.3 | 4.4 | 16.7 | 22.9 | 13.9 | 0.9 | 7.4 | +### Speech Recognition Example (GigaAM-ASR) -## GigaAM-Emo + #### Basic usage: short audio transcribation (up to 30 seconds) -GigaAM-Emo is an acoustic model for Emotion Recognition. We fine-tuned the GigaAM Encoder on the [Dusha](https://arxiv.org/pdf/2212.12266.pdf) dataset. + ```python + import gigaam + model_name = "rnnt" # Options: "v2_ctc" or "ctc", "v2_rnnt" or "rnnt", "v1_ctc", "v1_rnnt" + model = gigaam.load_model(model_name) + transcription = model.transcribe(audio_path) + ``` -Resources: -* [Model weights](https://n-ws-q0bez.s3pd12.sbercloud.ru/b-ws-q0bez-jpv/GigaAM/emo_model_weights.ckpt) -* [Model config](https://n-ws-q0bez.s3pd12.sbercloud.ru/b-ws-q0bez-jpv/GigaAM/emo_model_config.yaml) -* [Colab example](https://colab.research.google.com/github/salute-developers/GigaAM/blob/main/examples/notebooks/GigaAM_Emo_Model_Usage_Example.ipynb) -* [Docker example](./examples/README.md) + #### Long-form audio transcribation + 1. Install external VAD dependencies ([pyannote.audio](https://github.com/pyannote/pyannote-audio) library) with + ```bash + pip install gigaam[longform] + ``` + 2. + * Generate [Hugging Face API token](https://huggingface.co/docs/hub/security-tokens) + * Accept the conditions to access [pyannote/voice-activity-detection](https://huggingface.co/pyannote/voice-activity-detection) files and content. + * Accept the conditions to access [pyannote/segmentation](https://huggingface.co/pyannote/segmentation) files and content. + 3. Use the `model.transcribe_longform` method: + ```python + import os + import gigaam -The following table summarizes the performance of different models on the [Dusha](https://arxiv.org/pdf/2212.12266.pdf) dataset: + os.environ["HF_TOKEN"] = "" + model = gigaam.load_model("ctc") + recognition_result = model.transcribe_longform("long_example.wav") + + for utterance in recognition_result: + transcription = utterance["transcription"] + start, end = utterance["boundaries"] + print(f"[{gigaam.format_time(start)} - {gigaam.format_time(end)}]: {transcription}") + ``` + + #### ONNX inference example + + 1. Export the model to ONNX using the `model.to_onnx` method: + ```python + onnx_dir = "onnx" + model_type = "rnnt" # or "ctc" + + model = gigaam.load_model( + model_type, + fp16_encoder=False, # only fp32 tensors + use_flash=False, # disable flash attention + ) + model.to_onnx(dir_path=onnx_dir) + ``` + 2. Run ONNX inference: + ```python + from gigaam.onnx_utils import load_onnx_sessions, transcribe_sample + + sessions = load_onnx_sessions(onnx_dir, model_type) + transcribe_sample("example.wav", model_type, sessions) + ``` + + +All these examples can also be found in [inference_example.ipynb](./inference_example.ipynb) notebook. + +--- + + +## GigaAM-Emo: Emotion Recognition + +GigaAM-Emo is a fine-tuned model for emotion recognition trained on the [Dusha](https://arxiv.org/pdf/2212.12266.pdf) dataset. It significantly outperforms existing models on several metrics. + +### Performance Metrics | | | Crowd | | | Podcast | | | --- | --- | --- | --- | --- | --- | --- | | | Unweighted Accuracy | Weighted Accuracy | Macro F1-score | Unweighted Accuracy | Weighted Accuracy | Macro F1-score | @@ -79,6 +191,24 @@ The following table summarizes the performance of different models on the [Dusha | [АБК](https://aij.ru/archive?albumId=2&videoId=337) ([TIM-Net](https://arxiv.org/pdf/2211.08233.pdf)) | 0.84 | 0.77 | 0.78 | 0.90 | 0.50 | 0.55 | | GigaAM-Emo | 0.90 | 0.87 | 0.84 | 0.90 | 0.76 | 0.67 | +### Emotion Recognition Example (GigaAM-Emo) + +```python +import gigaam +model = gigaam.load_model('emo') +emotion2prob: Dict[str, int] = model.get_probs("example.wav") + +print(", ".join([f"{emotion}: {prob:.3f}" for emotion, prob in emotion2prob.items()])) +``` + +--- + +## License + +GigaAM's code and model weights are released under the [MIT License](./LICENSE). + +--- + ## Links * [[habr] GigaAM: класс открытых моделей для обработки звучащей речи](https://habr.com/ru/companies/sberdevices/articles/805569) * [[youtube] GigaAM: Семейство акустических моделей для русского языка](https://youtu.be/PvZuTUnZa2Q?t=26442) diff --git a/README_ru.md b/README_ru.md index f4148a2..1b39c12 100644 --- a/README_ru.md +++ b/README_ru.md @@ -2,33 +2,91 @@ ![plot](./gigaam_scheme.svg) +## Последние Обновления +* 2024/12 — [MIT-лицензия](./LICENSE), GigaAM-v2 (улучшение качества распознавания речи на **15%** и **12%** WER для CTC и RNN-T моделей), [поддержка экспорта в ONNX](#пример-распознавания-с-помощью-onnx) +* 2024/05 — GigaAM-RNNT (улучшение WER на **-19%**), [распознавание речи на длинных аудиозаписях с помощью внешей VAD-модели](#распознавание-речи-на-длинных-аудиозаписях) +* 2024/04 — Релиз GigaAM: GigaAM-CTC ([Лучшая открытая модель для распознавания речи на русском языке](#метрики-качества-word-error-rate)), [GigaAM-Emo](#gigaam-emo) +--- + ## Содержание -* [GigaAM](#gigaam) -* [GigaAM для распознавания речи](#gigaam-для-распознавания-речи) - * [GigaAM-CTC](#gigaam-ctc) - * [GigaAM-RNNT](#gigaam-rnnt) -* [GigaAM-Emo](#gigaam-emo) -* [Лицензионное соглашение](./GigaAM%20License_NC.pdf) -* [Ссылки](#ссылки) +- [Обзор](#обзор) +- [Установка](#установка) +- [GigaAM](#gigaam) +- [GigaAM для распознавания речи](#gigaam-для-распознавания-речи) + - [GigaAM-CTC](#gigaam-ctc) + - [GigaAM-RNNT](#gigaam-rnnt) +- [GigaAM-Emo](#gigaam-emo) +- [Лицензионное соглашение](#лицензия) +- [Ссылки](#ссылки) + +--- + +## Обзор + +GigaAM (**Giga** **A**coustic **M**odel) - семейство акустических моделей для обработки звучащей речи на русском языке. Среди решаемых задач - задачи распознавания речи, распознавания эмоций и извлечения эмбеддингов из аудио. Модели построены на основе архитектуры [Conformer](https://arxiv.org/pdf/2005.08100.pdf) с использованием методов self-supervised learning ([wav2vec2](https://arxiv.org/abs/2006.11477)-подход для GigaAM-v1 и [HuBERT](https://arxiv.org/pdf/2106.07447)-подход для GigaAM-v2). + +Модели GigaAM с отрывом являются лучшими по качеству моделями в открытом доступе для соответствующих задач. + +Репозиторий включает: +- **GigaAM**: фундаментальная акустическая модель, обученная на большом объеме неразмеченных русскоязычных аудиозаписей. +- **GigaAM-CTC и GigaAM-RNNT**: модели, дообученные на задачу автоматического распознавания речи. +- **GigaAM-Emo**: модель, дообученная на задачу распознавания эмоций. + +## Установка + +### Требования +- Python ≥ 3.8 +- установленный и добавленный в PATH [ffmpeg](https://ffmpeg.org/) + +### Установка пакета GigaAM + +1. Скачивание репозитория: + ```bash + git clone https://github.com/salute-developers/GigaAM.git + cd GigaAM + ``` +2. Установка пакета: + ```bash + pip install -e . + ``` + +3. Проверка установленного пакета: + ```python + import gigaam + model = gigaam.load_model("ctc") + print(model) + ``` ## GigaAM -GigaAM (**Giga** **A**coustic **M**odel) — фундаментальная акустическая модель, основанная на [Conformer](https://arxiv.org/pdf/2005.08100.pdf) энкодере (около 240M параметров). Мы предобучали GigaAM в [wav2vec2](https://arxiv.org/pdf/2006.11477.pdf) режиме на 50 тысячах часов разнообразных русскоязычных данных. +GigaAM (**Giga** **A**coustic **M**odel) — фундаментальная акустическая модель, основанная на [Conformer](https://arxiv.org/pdf/2005.08100.pdf)-энкодере (около 240M параметров) и обученная на 50 тысячах часов разнообразных русскоязычных данных. + +Доступны 2 версии модели, отличающиеся алгоритмом предобучения: +* GigaAM-v1 была обучена на основе подхода [wav2vec2](https://arxiv.org/abs/2006.11477). Версия модели для использования - `v1_ssl`. +* GigaAM-v2 была обучена на основе подхода [HuBERT](https://arxiv.org/pdf/2106.07447) и позволила улучшить качество распознавания речи. Версия модели для использования - `v2_ssl` или `ssl`. + +Больше информации про обучение GigaAM-v1 можно найти в [нашей статье на Хабре](https://habr.com/ru/companies/sberdevices/articles/805569). -Материалы -* [Model weights](https://n-ws-q0bez.s3pd12.sbercloud.ru/b-ws-q0bez-jpv/GigaAM/ssl_model_weights.ckpt) -* [Encoder config](https://n-ws-q0bez.s3pd12.sbercloud.ru/b-ws-q0bez-jpv/GigaAM/encoder_config.yaml) -* [Пример использования в colab](https://colab.research.google.com/github/salute-developers/GigaAM/blob/main/examples/notebooks/GigaAM_Model_Usage_Example.ipynb) -* [Пример использования в docker](./examples/README.md) +### Пример использования GigaAM +```python +import gigaam +model = gigaam.load_model('ssl') # Options: "ssl", "v1_ssl" +embedding, _ = model.embed_audio(audio_path) +``` -## GigaAM для распознавания речи +--- + + +## GigaAM для распознавания речи (GigaAM-ASR) Мы дообучали GigaAM энкодер для задачи распознавания речи с двумя разными декодерами: -* GigaAM-CTC была дообучена с [CTC](https://www.cs.toronto.edu/~graves/icml_2006.pdf) функцией потерь и посимвольной токенизацией. -* GigaAM-RNNT была дообучена с [RNN-T](https://arxiv.org/abs/1211.3711) функцией потерь и subword-токенизацией. +* Модели GigaAM-CTC были дообучены с [CTC](https://www.cs.toronto.edu/~graves/icml_2006.pdf) функцией потерь. +* Модели GigaAM-RNNT была дообучена с [RNN-T](https://arxiv.org/abs/1211.3711) функцией потерь. + +Мы проводили дообучения моделей с обеих версий GigaAM: `v1` и `v2`, таким образом для каждой из GigaAM-CTC и GigaAM-RNNT моделей доступны 2 версии: `v1` и `v2`. -Для обучения обеих моделей использовался [фреймворк NeMo](https://github.com/NVIDIA/NeMo) и следующие открытые данные: +### Данные для обучения | dataset | size, hours | weight | | --- | --- | --- | @@ -37,38 +95,84 @@ GigaAM (**Giga** **A**coustic **M**odel) — фундаментальная ак | [Russian Common Voice](https://arxiv.org/pdf/1912.06670.pdf) | 207 | 0.1 | | [Russian LibriSpeech](https://arxiv.org/pdf/2012.03411.pdf) | 93 | 0.1 | -Материалы: -* ### GigaAM-CTC: - * [Model weights](https://n-ws-q0bez.s3pd12.sbercloud.ru/b-ws-q0bez-jpv/GigaAM/ctc_model_weights.ckpt) - * [Model config](https://n-ws-q0bez.s3pd12.sbercloud.ru/b-ws-q0bez-jpv/GigaAM/ctc_model_config.yaml) - * [Пример использования в colab](https://colab.research.google.com/github/salute-developers/GigaAM/blob/main/examples/notebooks/GigaAM_CTC_Model_Usage_Example.ipynb) - * [Пример использования в docker](./examples/README.md) -* ### GigaAM-RNNT: - * [Model weights](https://n-ws-q0bez.s3pd12.sbercloud.ru/b-ws-q0bez-jpv/GigaAM/rnnt_model_weights.ckpt) - * [Model config](https://n-ws-q0bez.s3pd12.sbercloud.ru/b-ws-q0bez-jpv/GigaAM/rnnt_model_config.yaml) - * [Пример использования в colab](https://colab.research.google.com/github/salute-developers/GigaAM/blob/main/examples/notebooks/GigaAM_RNNT_Model_Usage_Example.ipynb) - * [Пример использования в docker](./examples/README.md) - -В таблице ниже приведены оценки Word Error Rate различных моделей на открытых русскоязычных наборах данных: - -| model | parameters | [Golos Crowd](https://arxiv.org/abs/2106.10161) | [Golos Farfield](https://arxiv.org/abs/2106.10161) | [OpenSTT Youtube](https://github.com/snakers4/open_stt) | [OpenSTT Phone calls](https://github.com/snakers4/open_stt) | [OpenSTT Audiobooks](https://github.com/snakers4/open_stt) | [Mozilla Common Voice](https://arxiv.org/pdf/1912.06670.pdf) | [Russian LibriSpeech](https://arxiv.org/pdf/2012.03411.pdf) | -| --- | --- | --- | --- | --- | --- | --- | --- | --- | -| [Whisper-large-v3](https://huggingface.co/openai/whisper-large-v3) | 1.5B | 17.4 | 14.5 | 21.1 | 31.2 | 17.0 | 5.3 | 9.0 | -| [NVIDIA Ru-FastConformer-RNNT](https://huggingface.co/nvidia/stt_ru_fastconformer_hybrid_large_pc) | 115M | 2.6 | 6.6 | 23.8 | 32.9 | 16.4 | 2.7 | 11.6 | -| GigaAM-CTC | 242M | 3.1 | 5.7 | 18.4 | 25.6 | 15.1| 1.7 | 8.1 | -| GigaAM-RNNT | 243M | 2.3 | 4.4 | 16.7 | 22.9 | 13.9 | 0.9 | 7.4 | +### Метрики качества (Word Error Rate) + +| Model | Parameters | Golos Crowd | Golos Farfield | OpenSTT YouTube | OpenSTT Phone Calls | OpenSTT Audiobooks | Mozilla Common Voice 12 | Mozilla Common Voice 19 | Russian LibriSpeech | +|--------------------|------------|-------------|----------------|-----------------|----------------------|--------------------|-------|-------|---------------------| +| Whisper-large-v3 | 1.5B | 13.9 | 16.6 | 18.0 | 28.0 | 14.4 | 5.7 | 5.5 | 9.5 | +| NVIDIA FastConformer | 115M | 2.2 | 6.6 | 21.2 | 30.0 | 13.9 | 2.7 | 5.7 | 11.3 | +| **GigaAM-CTC-v1** | 242M | 3.0 | 5.7 | 16.0 | 23.2 | 12.5 | 2.0 | 10.5 | 7.5 | +| **GigaAM-RNNT-v1** | 243M | 2.3 | 5.0 | 14.0 | 21.7 | 11.7 | 1.9 | 9.9 | 7.7 | +| **GigaAM-CTC-v2** | 242M | 2.5 | 4.3 | 14.1 | 21.1 | 10.7 | 2.1 | 3.1 | 5.5 | +| **GigaAM-RNNT-v2** | 243M | **2.2** | **3.9** | **13.3** | **20.0** | **10.2** | **1.8** | **2.7** | **5.5** | + +### Использование моделей распознавания речи (GigaAM-ASR) + + #### Базовое использование - распознование речи на коротких аудиозаписях (до 30 секунд) + ```python + import gigaam + model_name = "rnnt" # Options: "v2_ctc" or "ctc", "v2_rnnt" or "rnnt", "v1_ctc", "v1_rnnt" + model = gigaam.load_model(model_name) + transcription = model.transcribe(audio_path) + ``` + + #### Распознавание речи на длинных аудиозаписях + 1. Установите зависимости для внешней VAD-модели ([pyannote.audio](https://github.com/pyannote/pyannote-audio) library): + ```bash + pip install gigaam[longform] + ``` + 2. + * Сгенерируйте [Hugging Face API token](https://huggingface.co/docs/hub/security-tokens) + * Примите условия для получения доступа к контенту [pyannote/voice-activity-detection](https://huggingface.co/pyannote/voice-activity-detection) + * Примите условия для получения доступа к контенту [pyannote/segmentation](https://huggingface.co/pyannote/segmentation) + + 3. Используйте метод ```model.transcribe_longform```: + ```python + import os + import gigaam + + os.environ["HF_TOKEN"] = "" + + model = gigaam.load_model("ctc") + recognition_result = model.transcribe_longform("long_example.wav") + + for utterance in recognition_result: + transcription = utterance["transcription"] + start, end = utterance["boundaries"] + print(f"[{gigaam.format_time(start)} - {gigaam.format_time(end)}]: {transcription}") + ``` + + #### Пример распознавания с помощью ONNX + + 1. Экспортируйте модель в onnx-формат с помощью метода ```model.to_onnx```: + ```python + onnx_dir = "onnx" + model_type = "rnnt" # or "ctc" + + model = gigaam.load_model( + model_type, + fp16_encoder=False, # only fp32 tensors + use_flash=False, # disable flash attention + ) + model.to_onnx(dir_path=onnx_dir) + ``` + 2. Используйте полученную модель для транскрибации: + ```python + from gigaam.onnx_utils import load_onnx_sessions, transcribe_sample + + sessions = load_onnx_sessions(onnx_dir, model_type) + transcribe_sample("example.wav", model_type, sessions) + ``` + +Все приведенные примеры также могут быть найдены в jupyter-ноутбуке [inference_example.ipynb](./inference_example.ipynb). + +--- + ## GigaAM-Emo GigaAM-Emo — акустическая модель для определения эмоций. Мы доучивали GigaAM на датасете [Dusha](https://arxiv.org/pdf/2212.12266.pdf). -Материалы: -* [Model weights](https://n-ws-q0bez.s3pd12.sbercloud.ru/b-ws-q0bez-jpv/GigaAM/emo_model_weights.ckpt) -* [Model config](https://n-ws-q0bez.s3pd12.sbercloud.ru/b-ws-q0bez-jpv/GigaAM/emo_model_config.yaml) -* [Пример использования в colab](https://colab.research.google.com/github/salute-developers/GigaAM/blob/main/examples/notebooks/GigaAM_Emo_Model_Usage_Example.ipynb) -* [Пример использования в docker](./examples/README.md) - - В таблице ниже приведены метрики качества открытых моделей на датасете [Dusha](https://arxiv.org/pdf/2212.12266.pdf): | | | Crowd | | | Podcast | | @@ -78,6 +182,22 @@ GigaAM-Emo — акустическая модель для определени | [АБК](https://aij.ru/archive?albumId=2&videoId=337) ([TIM-Net](https://arxiv.org/pdf/2211.08233.pdf)) | 0.84 | 0.77 | 0.78 | 0.90 | 0.50 | 0.55 | | GigaAM-Emo | 0.90 | 0.87 | 0.84 | 0.90 | 0.76 | 0.67 | +### Пример использвания GigaAM-Emo для распознавания эмоций + +```python +import gigaam +model = gigaam.load_model('emo') +emotion2prob: Dict[str, int] = model.get_probs("example.wav") + +print(", ".join([f"{emotion}: {prob:.3f}" for emotion, prob in emotion2prob.items()])) +``` + +--- + +## Лицензия + +Код и веса моделей семества GigaAM доступны для использования с [MIT-лицензией](./LICENSE). + ## Ссылки * [[habr] GigaAM: класс открытых моделей для обработки звучащей речи](https://habr.com/ru/companies/sberdevices/articles/805569) * [[youtube] GigaAM: Семейство акустических моделей для русского языка](https://youtu.be/PvZuTUnZa2Q?t=26442) diff --git a/examples/Dockerfile b/examples/Dockerfile deleted file mode 100644 index d86fd62..0000000 --- a/examples/Dockerfile +++ /dev/null @@ -1,13 +0,0 @@ -FROM nvcr.io/nvidia/nemo:23.10 - -RUN mkdir -p /workspace/data -WORKDIR /workspace/data - -RUN wget https://n-ws-q0bez.s3pd12.sbercloud.ru/b-ws-q0bez-jpv/GigaAM/{ssl_model_weights.ckpt,emo_model_weights.ckpt,ctc_model_weights.ckpt,rnnt_model_weights.ckpt,ctc_model_config.yaml,emo_model_config.yaml,encoder_config.yaml,rnnt_model_config.yaml,tokenizer_all_sets.tar,example.wav,long_example.wav} -RUN tar -xf tokenizer_all_sets.tar && rm tokenizer_all_sets.tar - -RUN pip install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu118 -RUN pip install Cython -RUN pip install git+https://github.com/NVIDIA/NeMo.git@1fa961ba03ab5f8c91b278640e29807079373372#egg=nemo_toolkit[all] -RUN pip install -U soundfile -RUN pip install pyannote.audio==3.2.0 \ No newline at end of file diff --git a/examples/README.md b/examples/README.md deleted file mode 100644 index e6bf8c0..0000000 --- a/examples/README.md +++ /dev/null @@ -1,126 +0,0 @@ -* [Virtual environment](#virtual-environment) -* [Docker](#docker) -* For long-form inference: - * generate [Hugging Face API token](https://huggingface.co/docs/hub/security-tokens) - * accept the conditions to access [pyannote/voice-activity-detection](https://huggingface.co/pyannote/voice-activity-detection) files and content - * accept the conditions to access [pyannote/segmentation](https://huggingface.co/pyannote/segmentation) files and content - - -## Virtual environment -```bash -apt install python3-dev -apt install python3-venv -apt install ffmpeg libavcodec-extra -``` - -```bash -python3.10 -m venv venv && . venv/bin/activate -pip install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu118 -pip install Cython -pip install -U wheel -pip install git+https://github.com/NVIDIA/NeMo.git@1fa961ba03ab5f8c91b278640e29807079373372#egg=nemo_toolkit[all] -pip install pyannote.audio==3.2.0 -mkdir ./data -wget https://n-ws-q0bez.s3pd12.sbercloud.ru/b-ws-q0bez-jpv/GigaAM/{ssl_model_weights.ckpt,emo_model_weights.ckpt,ctc_model_weights.ckpt,rnnt_model_weights.ckpt,ctc_model_config.yaml,emo_model_config.yaml,encoder_config.yaml,rnnt_model_config.yaml,tokenizer_all_sets.tar,example.wav,long_example.wav} -P ./data && tar -xf ./data/tokenizer_all_sets.tar --directory ./data/ && rm ./data/tokenizer_all_sets.tar - -# GigaAM -python ssl_inference.py --encoder_config ./data/encoder_config.yaml \ - --model_weights ./data/ssl_model_weights.ckpt --device cuda --audio_path ./data/example.wav - -# encoded signal shape: torch.Size([1, 768, 283]) - -# GigaAM-CTC -python ctc_inference.py --model_config ./data/ctc_model_config.yaml \ - --model_weights ./data/ctc_model_weights.ckpt --device cuda --audio_path ./data/example.wav - -# transcription: ничьих не требуя похвал счастлив уж я надеждой сладкой что дева с трепетом любви посмотрит может быть украдкой на песни грешные мои у лукоморья дуб зеленый - -# GigaAM-CTC long-form -python ctc_longform_inference.py --model_config ./data/ctc_model_config.yaml \ - --model_weights ./data/ctc_model_weights.ckpt --device cuda \ - --audio_path ./data/long_example.wav --hf_token - -# [00:00:00 - 00:16:83]: вечерня отошла давно но в кельях тихо и темно уже и сам эгумин строгий свои молитвы прекратил и кости ветхие склонил перекрестясь на одр убогий кругом и сон и тишина но церкви дверь отворена -# [00:17:10 - 00:32:61]: трепещет луч лампады и тускло озаряет он и темную живопись икон и возлощенные оклады и раздается в тишине то тяжкий вздох то шепот важный и мрачно дремлет в вашине старинный свод -# ... - -# GigaAM-RNNT -python rnnt_inference.py --model_config ./data/rnnt_model_config.yaml \ - --model_weights ./data/rnnt_model_weights.ckpt --tokenizer_path ./data/tokenizer_all_sets \ - --device cuda --audio_path ./data/example.wav - -# transcription: ничьих не требуя похвал счастлив уж я надеждой сладкой что дева с трепетом любви посмотрит может быть украдкой на песни грешные мои у лукоморья дуб зеленый - -# GigaAM-RNNT long-form -python rnnt_longform_inference.py --model_config ./data/rnnt_model_config.yaml \ - --model_weights ./data/rnnt_model_weights.ckpt --tokenizer_path ./data/tokenizer_all_sets \ - --device cuda --audio_path ./data/long_example.wav --hf_token - -# [00:00:00 - 00:16:83]: вечерня отошла давно но в кельях тихо и темно уже и сам игумин строгий свои молитвы прекратил и кости ветхие склонил перекрестясь на одр убогий кругом и сон и тишина но церкви дверь отворена -# [00:17:10 - 00:32:61]: трепещет луч лампады и тускло озаряет он и темну живопись икон и возлащенные оклады и раздается в тишине то тяжкий вздох то шепот важный и мрачно дремлет в вышине старинный свод -# ... - -# GigaAM-Emo -python emo_inference.py --model_config ./data/emo_model_config.yaml \ - --model_weights ./data/emo_model_weights.ckpt --device cuda --audio_path ./data/example.wav - -# angry: 0.000, sad: 0.002, neutral: 0.923, positive: 0.074 -``` - -## Docker - -```bash -docker build -t gigaam_image . - -# GigaAM -docker run -v $PWD:/workspace/gigaam --gpus all gigaam_image \ - python /workspace/gigaam/ssl_inference.py --encoder_config /workspace/data/encoder_config.yaml \ - --model_weights /workspace/data/ssl_model_weights.ckpt \ - --device cuda --audio_path /workspace/data/example.wav - -# encoded signal shape: torch.Size([1, 768, 283]) - -# GigaAM-CTC -docker run -v $PWD:/workspace/gigaam --gpus all gigaam_image \ - python /workspace/gigaam/ctc_inference.py --model_config /workspace/data/ctc_model_config.yaml \ - --model_weights /workspace/data/ctc_model_weights.ckpt \ - --device cuda --audio_path /workspace/data/example.wav - -# transcription: ничьих не требуя похвал счастлив уж я надеждой сладкой что дева с трепетом любви посмотрит может быть украдкой на песни грешные мои у лукоморья дуб зеленый - -# GigaAM-CTC longform -docker run -v $PWD:/workspace/gigaam --gpus all gigaam_image \ - python /workspace/gigaam/ctc_longform_inference.py --model_config /workspace/data/ctc_model_config.yaml \ - --model_weights /workspace/data/ctc_model_weights.ckpt --device cuda \ - --audio_path /workspace/data/long_example.wav --hf_token - -# [00:00:00 - 00:16:83]: вечерня отошла давно но в кельях тихо и темно уже и сам эгумин строгий свои молитвы прекратил и кости ветхие склонил перекрестясь на одр убогий кругом и сон и тишина но церкви дверь отворена -# [00:17:10 - 00:32:61]: трепещет луч лампады и тускло озаряет он и темную живопись икон и возлощенные оклады и раздается в тишине то тяжкий вздох то шепот важный и мрачно дремлет в вашине старинный свод -# ... - -# GigaAM-RNNT -docker run -v $PWD:/workspace/gigaam --gpus all gigaam_image \ - python /workspace/gigaam/rnnt_inference.py --model_config /workspace/data/rnnt_model_config.yaml \ - --model_weights /workspace/data/rnnt_model_weights.ckpt --tokenizer_path /workspace/data/tokenizer_all_sets \ - --device cuda --audio_path /workspace/data/example.wav - -# transcription: ничьих не требуя похвал счастлив уж я надеждой сладкой что дева с трепетом любви посмотрит может быть украдкой на песни грешные мои у лукоморья дуб зеленый - -# GigaAM-RNNT longform -docker run -v $PWD:/workspace/gigaam --gpus all gigaam_image \ - python /workspace/gigaam/rnnt_longform_inference.py --model_config /workspace/data/rnnt_model_config.yaml \ - --model_weights /workspace/data/rnnt_model_weights.ckpt --tokenizer_path /workspace/data/tokenizer_all_sets \ - --device cuda --audio_path /workspace/data/long_example.wav --hf_token - -# [00:00:00 - 00:16:83]: вечерня отошла давно но в кельях тихо и темно уже и сам игумин строгий свои молитвы прекратил и кости ветхие склонил перекрестясь на одр убогий кругом и сон и тишина но церкви дверь отворена -# [00:17:10 - 00:32:61]: трепещет луч лампады и тускло озаряет он и темну живопись икон и возлащенные оклады и раздается в тишине то тяжкий вздох то шепот важный и мрачно дремлет в вышине старинный свод -# ... - -# GigaAM-Emo -docker run -v $PWD:/workspace/gigaam --gpus all gigaam_image \ - python /workspace/gigaam/emo_inference.py --model_config /workspace/data/emo_model_config.yaml \ - --model_weights /workspace/data/emo_model_weights.ckpt \ - --device cuda --audio_path /workspace/data/example.wav - -# angry: 0.000, sad: 0.002, neutral: 0.923, positive: 0.074 -``` diff --git a/examples/ctc_inference.py b/examples/ctc_inference.py deleted file mode 100644 index 3bf4112..0000000 --- a/examples/ctc_inference.py +++ /dev/null @@ -1,83 +0,0 @@ -import argparse - -import torch -import torchaudio -from nemo.collections.asr.models import EncDecCTCModel -from nemo.collections.asr.modules.audio_preprocessing import ( - AudioToMelSpectrogramPreprocessor as NeMoAudioToMelSpectrogramPreprocessor, -) -from nemo.collections.asr.parts.preprocessing.features import ( - FilterbankFeaturesTA as NeMoFilterbankFeaturesTA, -) - - -class FilterbankFeaturesTA(NeMoFilterbankFeaturesTA): - def __init__(self, mel_scale: str = "htk", wkwargs=None, **kwargs): - if "window_size" in kwargs: - del kwargs["window_size"] - if "window_stride" in kwargs: - del kwargs["window_stride"] - - super().__init__(**kwargs) - - self._mel_spec_extractor = torchaudio.transforms.MelSpectrogram( - sample_rate=self._sample_rate, - win_length=self.win_length, - hop_length=self.hop_length, - n_mels=kwargs["nfilt"], - window_fn=self.torch_windows[kwargs["window"]], - mel_scale=mel_scale, - norm=kwargs["mel_norm"], - n_fft=kwargs["n_fft"], - f_max=kwargs.get("highfreq", None), - f_min=kwargs.get("lowfreq", 0), - wkwargs=wkwargs, - ) - - -class AudioToMelSpectrogramPreprocessor(NeMoAudioToMelSpectrogramPreprocessor): - def __init__(self, mel_scale: str = "htk", **kwargs): - super().__init__(**kwargs) - kwargs["nfilt"] = kwargs["features"] - del kwargs["features"] - self.featurizer = ( - FilterbankFeaturesTA( # Deprecated arguments; kept for config compatibility - mel_scale=mel_scale, - **kwargs, - ) - ) - - -def _parse_args(): - parser = argparse.ArgumentParser( - description="Run inference using GigaAM-CTC checkpoint" - ) - parser.add_argument("--model_config", help="Path to GigaAM-CTC config file (.yaml)") - parser.add_argument( - "--model_weights", help="Path to GigaAM-CTC checkpoint file (.ckpt)" - ) - parser.add_argument("--audio_path", help="Path to audio signal") - parser.add_argument("--device", help="Device: cpu / cuda") - return parser.parse_args() - - -def main(model_config: str, model_weights: str, device: str, audio_path: str): - model = EncDecCTCModel.from_config_file(model_config) - - ckpt = torch.load(model_weights, map_location="cpu") - model.load_state_dict(ckpt, strict=False) - model = model.to(device) - model.eval() - - transcription = model.transcribe([audio_path])[0] - print(f"transcription: {transcription}") - - -if __name__ == "__main__": - args = _parse_args() - main( - model_config=args.model_config, - model_weights=args.model_weights, - device=args.device, - audio_path=args.audio_path, - ) diff --git a/examples/ctc_longform_inference.py b/examples/ctc_longform_inference.py deleted file mode 100644 index cb4a680..0000000 --- a/examples/ctc_longform_inference.py +++ /dev/null @@ -1,201 +0,0 @@ -import argparse -from io import BytesIO -from typing import List, Tuple - -import numpy as np -import torch -import torchaudio -from nemo.collections.asr.models import EncDecCTCModel -from nemo.collections.asr.modules.audio_preprocessing import ( - AudioToMelSpectrogramPreprocessor as NeMoAudioToMelSpectrogramPreprocessor, -) -from nemo.collections.asr.parts.preprocessing.features import ( - FilterbankFeaturesTA as NeMoFilterbankFeaturesTA, -) -from pyannote.audio import Pipeline -from pydub import AudioSegment - - -class FilterbankFeaturesTA(NeMoFilterbankFeaturesTA): - def __init__(self, mel_scale: str = "htk", wkwargs=None, **kwargs): - if "window_size" in kwargs: - del kwargs["window_size"] - if "window_stride" in kwargs: - del kwargs["window_stride"] - - super().__init__(**kwargs) - - self._mel_spec_extractor = torchaudio.transforms.MelSpectrogram( - sample_rate=self._sample_rate, - win_length=self.win_length, - hop_length=self.hop_length, - n_mels=kwargs["nfilt"], - window_fn=self.torch_windows[kwargs["window"]], - mel_scale=mel_scale, - norm=kwargs["mel_norm"], - n_fft=kwargs["n_fft"], - f_max=kwargs.get("highfreq", None), - f_min=kwargs.get("lowfreq", 0), - wkwargs=wkwargs, - ) - - -class AudioToMelSpectrogramPreprocessor(NeMoAudioToMelSpectrogramPreprocessor): - def __init__(self, mel_scale: str = "htk", **kwargs): - super().__init__(**kwargs) - kwargs["nfilt"] = kwargs["features"] - del kwargs["features"] - self.featurizer = ( - FilterbankFeaturesTA( # Deprecated arguments; kept for config compatibility - mel_scale=mel_scale, - **kwargs, - ) - ) - - -def audiosegment_to_numpy(audiosegment: AudioSegment) -> np.ndarray: - """Convert AudioSegment to numpy array.""" - samples = np.array(audiosegment.get_array_of_samples()) - if audiosegment.channels == 2: - samples = samples.reshape((-1, 2)) - - samples = samples.astype(np.float32, order="C") / 32768.0 - return samples - - -def format_time(seconds: float) -> str: - hours = int(seconds // 3600) - minutes = int((seconds % 3600) // 60) - seconds = seconds % 60 - full_seconds = int(seconds) - milliseconds = int((seconds - full_seconds) * 100) - - if hours > 0: - return f"{hours:02}:{minutes:02}:{full_seconds:02}:{milliseconds:02}" - else: - return f"{minutes:02}:{full_seconds:02}:{milliseconds:02}" - - -def segment_audio( - audio_path: str, - pipeline: Pipeline, - max_duration: float = 22.0, - min_duration: float = 15.0, - new_chunk_threshold: float = 0.2, -) -> Tuple[List[np.ndarray], List[List[float]]]: - # Prepare audio for pyannote vad pipeline - audio = AudioSegment.from_wav(audio_path) - audio_bytes = BytesIO() - audio.export(audio_bytes, format="wav") - audio_bytes.seek(0) - - # Process audio with pipeline to obtain segments with speech activity - sad_segments = pipeline({"uri": "filename", "audio": audio_bytes}) - - segments = [] - curr_duration = 0 - curr_start = 0 - curr_end = 0 - boundaries = [] - - # Concat segments from pipeline into chunks for asr according to max/min duration - for segment in sad_segments.get_timeline().support(): - start = max(0, segment.start) - end = min(len(audio) / 1000, segment.end) - if ( - curr_duration > min_duration and start - curr_end > new_chunk_threshold - ) or (curr_duration + (end - curr_end) > max_duration): - audio_segment = audiosegment_to_numpy( - audio[curr_start * 1000 : curr_end * 1000] - ) - segments.append(audio_segment) - boundaries.append([curr_start, curr_end]) - curr_start = start - - curr_end = end - curr_duration = curr_end - curr_start - - if curr_duration != 0: - audio_segment = audiosegment_to_numpy( - audio[curr_start * 1000 : curr_end * 1000] - ) - segments.append(audio_segment) - boundaries.append([curr_start, curr_end]) - - return segments, boundaries - - -def _parse_args(): - parser = argparse.ArgumentParser( - description="Run long-form inference using GigaAM-CTC checkpoint" - ) - parser.add_argument("--model_config", help="Path to GigaAM-CTC config file (.yaml)") - parser.add_argument( - "--model_weights", help="Path to GigaAM-CTC checkpoint file (.ckpt)" - ) - parser.add_argument("--audio_path", help="Path to audio signal") - parser.add_argument( - "--hf_token", help="HuggingFace token for using pyannote Pipeline" - ) - parser.add_argument("--device", help="Device: cpu / cuda") - parser.add_argument("--fp16", help="Run in FP16 mode", default=True) - parser.add_argument( - "--batch_size", help="Batch size for acoustic model inference", default=10 - ) - return parser.parse_args() - - -def main( - model_config: str, - model_weights: str, - device: str, - audio_path: str, - hf_token: str, - fp16: bool, - batch_size: int = 10, -): - # Initialize model - model = EncDecCTCModel.from_config_file(model_config) - - ckpt = torch.load(model_weights, map_location="cpu") - model.load_state_dict(ckpt, strict=False) - model = model.to(device) - if device != "cpu" and fp16: - model = model.half() - model.preprocessor = model.preprocessor.float() - model.eval() - - # Initialize pyannote pipeline - pipeline = Pipeline.from_pretrained( - "pyannote/voice-activity-detection", use_auth_token=hf_token - ) - pipeline = pipeline.to(torch.device(device)) - - # Segment audio - segments, boundaries = segment_audio(audio_path, pipeline) - - # Transcribe segments - transcriptions = [] - if device != "cpu" and fp16: - with torch.autocast(device_type="cuda", dtype=torch.float16): - transcriptions = model.transcribe(segments, batch_size=batch_size) - else: - transcriptions = model.transcribe(segments, batch_size=batch_size) - - for transcription, boundary in zip(transcriptions, boundaries): - print( - f"[{format_time(boundary[0])} - {format_time(boundary[1])}]: {transcription}\n" - ) - - -if __name__ == "__main__": - args = _parse_args() - main( - model_config=args.model_config, - model_weights=args.model_weights, - device=args.device, - audio_path=args.audio_path, - hf_token=args.hf_token, - fp16=args.fp16, - batch_size=args.batch_size, - ) diff --git a/examples/emo_inference.py b/examples/emo_inference.py deleted file mode 100644 index 0d8dd4e..0000000 --- a/examples/emo_inference.py +++ /dev/null @@ -1,81 +0,0 @@ -import argparse -from typing import List, Union - -import hydra -import soundfile -import torch -from omegaconf import DictConfig, ListConfig, OmegaConf - - -class SpecScaler(torch.nn.Module): - def forward(self, x: torch.Tensor) -> torch.Tensor: - return torch.log(x.clamp_(1e-9, 1e9)) - - -class GigaAMEmo(torch.nn.Module): - def __init__(self, conf: Union[DictConfig, ListConfig]): - super().__init__() - self.id2name = conf.id2name - self.feature_extractor = hydra.utils.instantiate(conf.feature_extractor) - self.conformer = hydra.utils.instantiate(conf.encoder) - self.linear_head = hydra.utils.instantiate(conf.classification_head) - - @property - def device(self): - return next(self.parameters()).device - - def forward(self, features, features_length=None): - if features.dim() == 2: - features = features.unsqueeze(0) - if not features_length: - features_length = torch.ones(features.shape[0], device=self.device) * features.shape[-1] - encoded, _ = self.conformer(audio_signal=features, length=features_length) - encoded_pooled = torch.nn.functional.avg_pool1d( - encoded, kernel_size=encoded.shape[-1] - ).squeeze(-1) - - logits = self.linear_head(encoded_pooled) - return logits - - def get_probs(self, audio_path: str) -> List[List[float]]: - audio_signal, _ = soundfile.read(audio_path, dtype="float32") - audio_tensor = torch.tensor(audio_signal).float().to(self.device) - features = self.feature_extractor(audio_tensor) - logits = self.forward(features) - probs = torch.nn.functional.softmax(logits, dim=1).detach().tolist() - return probs - - -def _parse_args(): - parser = argparse.ArgumentParser( - description="Run inference using GigaAM-Emo checkpoint" - ) - parser.add_argument("--model_config", help="Path to GigaAM-Emo config file (.yaml)") - parser.add_argument( - "--model_weights", help="Path to GigaAM-Emo checkpoint file (.ckpt)" - ) - parser.add_argument("--audio_path", help="Path to audio signal") - parser.add_argument("--device", help="Device: cpu / cuda") - return parser.parse_args() - - -def main(model_config: str, model_weights: str, device: str, audio_path: str): - conf = OmegaConf.load(model_config) - model = GigaAMEmo(conf) - ckpt = torch.load(model_weights, map_location="cpu") - model.load_state_dict(ckpt, strict=False) - model = model.to(device) - model.eval() - with torch.no_grad(): - probs = model.get_probs(audio_path)[0] - print(", ".join([f"{model.id2name[i]}: {p:.3f}" for i, p in enumerate(probs)])) - - -if __name__ == "__main__": - args = _parse_args() - main( - model_config=args.model_config, - model_weights=args.model_weights, - device=args.device, - audio_path=args.audio_path, - ) diff --git a/examples/notebooks/GigaAM_CTC_Model_Usage_Example.ipynb b/examples/notebooks/GigaAM_CTC_Model_Usage_Example.ipynb deleted file mode 100644 index f1eabc7..0000000 --- a/examples/notebooks/GigaAM_CTC_Model_Usage_Example.ipynb +++ /dev/null @@ -1,1162 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": { - "id": "0Q99xpSOdHEM" - }, - "source": [ - "### Installing and importing dependencies" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/" - }, - "id": "2am02YkxKBJ5", - "outputId": "344cb595-c9ba-4d9e-a970-2d486392ff36" - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Collecting wget\n", - " Downloading wget-3.2.zip (10 kB)\n", - " Preparing metadata (setup.py) ... \u001b[?25l\u001b[?25hdone\n", - "Building wheels for collected packages: wget\n", - " Building wheel for wget (setup.py) ... \u001b[?25l\u001b[?25hdone\n", - " Created wheel for wget: filename=wget-3.2-py3-none-any.whl size=9656 sha256=bbb22603efb56b962ad6a42332b0daf8d137a1446f5e46d6af4c4c2fb216fbdd\n", - " Stored in directory: /root/.cache/pip/wheels/8b/f1/7f/5c94f0a7a505ca1c81cd1d9208ae2064675d97582078e6c769\n", - "Successfully built wget\n", - "Installing collected packages: wget\n", - "Successfully installed wget-3.2\n", - "Reading package lists... Done\n", - "Building dependency tree... Done\n", - "Reading state information... Done\n", - "libsndfile1 is already the newest version (1.0.31-2ubuntu0.1).\n", - "ffmpeg is already the newest version (7:4.4.2-0ubuntu0.22.04.1).\n", - "The following additional packages will be installed:\n", - " libopencore-amrnb0 libopencore-amrwb0 libsox-fmt-alsa libsox-fmt-base libsox3 libwavpack1\n", - "Suggested packages:\n", - " libsox-fmt-all\n", - "The following NEW packages will be installed:\n", - " libopencore-amrnb0 libopencore-amrwb0 libsox-fmt-alsa libsox-fmt-base libsox3 libwavpack1 sox\n", - "0 upgraded, 7 newly installed, 0 to remove and 45 not upgraded.\n", - "Need to get 617 kB of archives.\n", - "After this operation, 1,764 kB of additional disk space will be used.\n", - "Get:1 http://archive.ubuntu.com/ubuntu jammy/universe amd64 libopencore-amrnb0 amd64 0.1.5-1 [94.8 kB]\n", - "Get:2 http://archive.ubuntu.com/ubuntu jammy/universe amd64 libopencore-amrwb0 amd64 0.1.5-1 [49.1 kB]\n", - "Get:3 http://archive.ubuntu.com/ubuntu jammy-updates/universe amd64 libsox3 amd64 14.4.2+git20190427-2+deb11u2ubuntu0.22.04.1 [240 kB]\n", - "Get:4 http://archive.ubuntu.com/ubuntu jammy-updates/universe amd64 libsox-fmt-alsa amd64 14.4.2+git20190427-2+deb11u2ubuntu0.22.04.1 [11.2 kB]\n", - "Get:5 http://archive.ubuntu.com/ubuntu jammy/main amd64 libwavpack1 amd64 5.4.0-1build2 [83.7 kB]\n", - "Get:6 http://archive.ubuntu.com/ubuntu jammy-updates/universe amd64 libsox-fmt-base amd64 14.4.2+git20190427-2+deb11u2ubuntu0.22.04.1 [33.7 kB]\n", - "Get:7 http://archive.ubuntu.com/ubuntu jammy-updates/universe amd64 sox amd64 14.4.2+git20190427-2+deb11u2ubuntu0.22.04.1 [104 kB]\n", - "Fetched 617 kB in 0s (1,421 kB/s)\n", - "Selecting previously unselected package libopencore-amrnb0:amd64.\n", - "(Reading database ... 121918 files and directories currently installed.)\n", - "Preparing to unpack .../0-libopencore-amrnb0_0.1.5-1_amd64.deb ...\n", - "Unpacking libopencore-amrnb0:amd64 (0.1.5-1) ...\n", - "Selecting previously unselected package libopencore-amrwb0:amd64.\n", - "Preparing to unpack .../1-libopencore-amrwb0_0.1.5-1_amd64.deb ...\n", - "Unpacking libopencore-amrwb0:amd64 (0.1.5-1) ...\n", - "Selecting previously unselected package libsox3:amd64.\n", - "Preparing to unpack .../2-libsox3_14.4.2+git20190427-2+deb11u2ubuntu0.22.04.1_amd64.deb ...\n", - "Unpacking libsox3:amd64 (14.4.2+git20190427-2+deb11u2ubuntu0.22.04.1) ...\n", - "Selecting previously unselected package libsox-fmt-alsa:amd64.\n", - "Preparing to unpack .../3-libsox-fmt-alsa_14.4.2+git20190427-2+deb11u2ubuntu0.22.04.1_amd64.deb ...\n", - "Unpacking libsox-fmt-alsa:amd64 (14.4.2+git20190427-2+deb11u2ubuntu0.22.04.1) ...\n", - "Selecting previously unselected package libwavpack1:amd64.\n", - "Preparing to unpack .../4-libwavpack1_5.4.0-1build2_amd64.deb ...\n", - "Unpacking libwavpack1:amd64 (5.4.0-1build2) ...\n", - "Selecting previously unselected package libsox-fmt-base:amd64.\n", - "Preparing to unpack .../5-libsox-fmt-base_14.4.2+git20190427-2+deb11u2ubuntu0.22.04.1_amd64.deb ...\n", - "Unpacking libsox-fmt-base:amd64 (14.4.2+git20190427-2+deb11u2ubuntu0.22.04.1) ...\n", - "Selecting previously unselected package sox.\n", - "Preparing to unpack .../6-sox_14.4.2+git20190427-2+deb11u2ubuntu0.22.04.1_amd64.deb ...\n", - "Unpacking sox (14.4.2+git20190427-2+deb11u2ubuntu0.22.04.1) ...\n", - "Setting up libsox3:amd64 (14.4.2+git20190427-2+deb11u2ubuntu0.22.04.1) ...\n", - "Setting up libopencore-amrwb0:amd64 (0.1.5-1) ...\n", - "Setting up libsox-fmt-alsa:amd64 (14.4.2+git20190427-2+deb11u2ubuntu0.22.04.1) ...\n", - "Setting up libwavpack1:amd64 (5.4.0-1build2) ...\n", - "Setting up libopencore-amrnb0:amd64 (0.1.5-1) ...\n", - "Setting up libsox-fmt-base:amd64 (14.4.2+git20190427-2+deb11u2ubuntu0.22.04.1) ...\n", - "Setting up sox (14.4.2+git20190427-2+deb11u2ubuntu0.22.04.1) ...\n", - "Processing triggers for man-db (2.10.2-1) ...\n", - "Processing triggers for libc-bin (2.35-0ubuntu3.4) ...\n", - "/sbin/ldconfig.real: /usr/local/lib/libtbb.so.12 is not a symbolic link\n", - "\n", - "/sbin/ldconfig.real: /usr/local/lib/libtbbmalloc_proxy.so.2 is not a symbolic link\n", - "\n", - "/sbin/ldconfig.real: /usr/local/lib/libtbbbind_2_5.so.3 is not a symbolic link\n", - "\n", - "/sbin/ldconfig.real: /usr/local/lib/libtbbbind_2_0.so.3 is not a symbolic link\n", - "\n", - "/sbin/ldconfig.real: /usr/local/lib/libtbbbind.so.3 is not a symbolic link\n", - "\n", - "/sbin/ldconfig.real: /usr/local/lib/libtbbmalloc.so.2 is not a symbolic link\n", - "\n", - "\u001b[33mDEPRECATION: git+https://github.com/NVIDIA/NeMo.git#egg=nemo_toolkit[all] contains an egg fragment with a non-PEP 508 name pip 25.0 will enforce this behaviour change. A possible replacement is to use the req @ url syntax, and remove the egg fragment. Discussion can be found at https://github.com/pypa/pip/issues/11617\u001b[0m\u001b[33m\n", - "\u001b[0mCollecting nemo_toolkit[all]\n", - " Cloning https://github.com/NVIDIA/NeMo.git to /tmp/pip-install-2e_42u82/nemo-toolkit_3b6b672cfd704a23a1afb7a299463840\n", - " Running command git clone --filter=blob:none --quiet https://github.com/NVIDIA/NeMo.git /tmp/pip-install-2e_42u82/nemo-toolkit_3b6b672cfd704a23a1afb7a299463840\n", - " Resolved https://github.com/NVIDIA/NeMo.git to commit 1fa961ba03ab5f8c91b278640e29807079373372\n", - " Installing build dependencies ... \u001b[?25l\u001b[?25hdone\n", - " Getting requirements to build wheel ... \u001b[?25l\u001b[?25hdone\n", - " Preparing metadata (pyproject.toml) ... \u001b[?25l\u001b[?25hdone\n", - "Collecting fiddle (from nemo_toolkit[all])\n", - " Downloading fiddle-0.3.0-py3-none-any.whl (419 kB)\n", - "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m419.8/419.8 kB\u001b[0m \u001b[31m2.9 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", - "\u001b[?25hRequirement already satisfied: huggingface-hub>=0.20.3 in /usr/local/lib/python3.10/dist-packages (from nemo_toolkit[all]) (0.23.1)\n", - "Requirement already satisfied: numba in /usr/local/lib/python3.10/dist-packages (from nemo_toolkit[all]) (0.58.1)\n", - "Requirement already satisfied: numpy>=1.22 in /usr/local/lib/python3.10/dist-packages (from nemo_toolkit[all]) (1.25.2)\n", - "Collecting onnx>=1.7.0 (from nemo_toolkit[all])\n", - " Downloading onnx-1.16.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (15.9 MB)\n", - "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m15.9/15.9 MB\u001b[0m \u001b[31m55.5 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", - "\u001b[?25hRequirement already satisfied: python-dateutil in /usr/local/lib/python3.10/dist-packages (from nemo_toolkit[all]) (2.8.2)\n", - "Collecting ruamel.yaml (from nemo_toolkit[all])\n", - " Downloading ruamel.yaml-0.18.6-py3-none-any.whl (117 kB)\n", - "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m117.8/117.8 kB\u001b[0m \u001b[31m11.0 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", - "\u001b[?25hRequirement already satisfied: scikit-learn in /usr/local/lib/python3.10/dist-packages (from nemo_toolkit[all]) (1.2.2)\n", - "Requirement already satisfied: setuptools>=65.5.1 in /usr/local/lib/python3.10/dist-packages (from nemo_toolkit[all]) (67.7.2)\n", - "Requirement already satisfied: tensorboard in /usr/local/lib/python3.10/dist-packages (from nemo_toolkit[all]) (2.15.2)\n", - "Requirement already satisfied: text-unidecode in /usr/local/lib/python3.10/dist-packages (from nemo_toolkit[all]) (1.3)\n", - "Requirement already satisfied: torch in /usr/local/lib/python3.10/dist-packages (from nemo_toolkit[all]) (2.3.0+cu121)\n", - "Requirement already satisfied: tqdm>=4.41.0 in /usr/local/lib/python3.10/dist-packages (from nemo_toolkit[all]) (4.66.4)\n", - "Requirement already satisfied: wget in /usr/local/lib/python3.10/dist-packages (from nemo_toolkit[all]) (3.2)\n", - "Requirement already satisfied: wrapt in /usr/local/lib/python3.10/dist-packages (from nemo_toolkit[all]) (1.14.1)\n", - "Collecting black~=24.3 (from nemo_toolkit[all])\n", - " Downloading black-24.4.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (1.8 MB)\n", - "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m1.8/1.8 MB\u001b[0m \u001b[31m61.1 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", - "\u001b[?25hCollecting click==8.0.2 (from nemo_toolkit[all])\n", - " Downloading click-8.0.2-py3-none-any.whl (97 kB)\n", - "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m97.6/97.6 kB\u001b[0m \u001b[31m12.5 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", - "\u001b[?25hCollecting isort<6.0.0,>5.1.0 (from nemo_toolkit[all])\n", - " Downloading isort-5.13.2-py3-none-any.whl (92 kB)\n", - "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m92.3/92.3 kB\u001b[0m \u001b[31m11.8 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", - "\u001b[?25hCollecting parameterized (from nemo_toolkit[all])\n", - " Downloading parameterized-0.9.0-py2.py3-none-any.whl (20 kB)\n", - "Requirement already satisfied: pytest in /usr/local/lib/python3.10/dist-packages (from nemo_toolkit[all]) (7.4.4)\n", - "Collecting pytest-mock (from nemo_toolkit[all])\n", - " Downloading pytest_mock-3.14.0-py3-none-any.whl (9.9 kB)\n", - "Collecting pytest-runner (from nemo_toolkit[all])\n", - " Downloading pytest_runner-6.0.1-py3-none-any.whl (7.2 kB)\n", - "Requirement already satisfied: sphinx in /usr/local/lib/python3.10/dist-packages (from nemo_toolkit[all]) (5.0.2)\n", - "Collecting sphinxcontrib-bibtex (from nemo_toolkit[all])\n", - " Downloading sphinxcontrib_bibtex-2.6.2-py3-none-any.whl (40 kB)\n", - "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m41.0/41.0 kB\u001b[0m \u001b[31m4.9 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", - "\u001b[?25hCollecting wandb (from nemo_toolkit[all])\n", - " Downloading wandb-0.17.0-py3-none-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl (6.7 MB)\n", - "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m6.7/6.7 MB\u001b[0m \u001b[31m54.4 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", - "\u001b[?25hRequirement already satisfied: cloudpickle in /usr/local/lib/python3.10/dist-packages (from nemo_toolkit[all]) (2.2.1)\n", - "Collecting hydra-core<=1.3.2,>1.3 (from nemo_toolkit[all])\n", - " Downloading hydra_core-1.3.2-py3-none-any.whl (154 kB)\n", - "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m154.5/154.5 kB\u001b[0m \u001b[31m17.9 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", - "\u001b[?25hCollecting omegaconf<=2.3 (from nemo_toolkit[all])\n", - " Downloading omegaconf-2.3.0-py3-none-any.whl (79 kB)\n", - "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m79.5/79.5 kB\u001b[0m \u001b[31m8.7 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", - "\u001b[?25hCollecting pytorch-lightning>=2.2.1 (from nemo_toolkit[all])\n", - " Downloading pytorch_lightning-2.2.5-py3-none-any.whl (802 kB)\n", - "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m802.3/802.3 kB\u001b[0m \u001b[31m44.7 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", - "\u001b[?25hCollecting torchmetrics>=0.11.0 (from nemo_toolkit[all])\n", - " Downloading torchmetrics-1.4.0.post0-py3-none-any.whl (868 kB)\n", - "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m868.8/868.8 kB\u001b[0m \u001b[31m47.9 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", - "\u001b[?25hCollecting transformers<=4.40.2,>=4.36.0 (from nemo_toolkit[all])\n", - " Downloading transformers-4.40.2-py3-none-any.whl (9.0 MB)\n", - "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m9.0/9.0 MB\u001b[0m \u001b[31m58.1 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", - "\u001b[?25hCollecting webdataset>=0.2.86 (from nemo_toolkit[all])\n", - " Downloading webdataset-0.2.86-py3-none-any.whl (70 kB)\n", - "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m70.4/70.4 kB\u001b[0m \u001b[31m9.9 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", - "\u001b[?25hCollecting datasets (from nemo_toolkit[all])\n", - " Downloading datasets-2.19.1-py3-none-any.whl (542 kB)\n", - "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m542.0/542.0 kB\u001b[0m \u001b[31m48.1 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", - "\u001b[?25hRequirement already satisfied: inflect in /usr/local/lib/python3.10/dist-packages (from nemo_toolkit[all]) (7.0.0)\n", - "Requirement already satisfied: pandas in /usr/local/lib/python3.10/dist-packages (from nemo_toolkit[all]) (2.0.3)\n", - "Collecting sacremoses>=0.0.43 (from nemo_toolkit[all])\n", - " Downloading sacremoses-0.1.1-py3-none-any.whl (897 kB)\n", - "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m897.5/897.5 kB\u001b[0m \u001b[31m61.1 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", - "\u001b[?25hRequirement already satisfied: sentencepiece<1.0.0 in /usr/local/lib/python3.10/dist-packages (from nemo_toolkit[all]) (0.1.99)\n", - "Collecting braceexpand (from nemo_toolkit[all])\n", - " Downloading braceexpand-0.1.7-py2.py3-none-any.whl (5.9 kB)\n", - "Requirement already satisfied: editdistance in /usr/local/lib/python3.10/dist-packages (from nemo_toolkit[all]) (0.6.2)\n", - "Collecting einops (from nemo_toolkit[all])\n", - " Downloading einops-0.8.0-py3-none-any.whl (43 kB)\n", - "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m43.2/43.2 kB\u001b[0m \u001b[31m5.7 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", - "\u001b[?25hCollecting g2p-en (from nemo_toolkit[all])\n", - " Downloading g2p_en-2.1.0-py3-none-any.whl (3.1 MB)\n", - "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m3.1/3.1 MB\u001b[0m \u001b[31m84.2 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", - "\u001b[?25hRequirement already satisfied: ipywidgets in /usr/local/lib/python3.10/dist-packages (from nemo_toolkit[all]) (7.7.1)\n", - "Collecting jiwer (from nemo_toolkit[all])\n", - " Downloading jiwer-3.0.4-py3-none-any.whl (21 kB)\n", - "Collecting kaldi-python-io (from nemo_toolkit[all])\n", - " Downloading kaldi-python-io-1.2.2.tar.gz (8.8 kB)\n", - " Preparing metadata (setup.py) ... \u001b[?25l\u001b[?25hdone\n", - "Collecting kaldiio (from nemo_toolkit[all])\n", - " Downloading kaldiio-2.18.0-py3-none-any.whl (28 kB)\n", - "Collecting lhotse>=1.22.0 (from nemo_toolkit[all])\n", - " Downloading lhotse-1.23.0-py3-none-any.whl (772 kB)\n", - "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m772.4/772.4 kB\u001b[0m \u001b[31m50.0 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", - "\u001b[?25hRequirement already satisfied: librosa>=0.10.0 in /usr/local/lib/python3.10/dist-packages (from nemo_toolkit[all]) (0.10.2.post1)\n", - "Collecting marshmallow (from nemo_toolkit[all])\n", - " Downloading marshmallow-3.21.2-py3-none-any.whl (49 kB)\n", - "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m49.3/49.3 kB\u001b[0m \u001b[31m5.8 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", - "\u001b[?25hRequirement already satisfied: matplotlib in /usr/local/lib/python3.10/dist-packages (from nemo_toolkit[all]) (3.7.1)\n", - "Requirement already satisfied: packaging in /usr/local/lib/python3.10/dist-packages (from nemo_toolkit[all]) (24.0)\n", - "Collecting pyannote.core (from nemo_toolkit[all])\n", - " Downloading pyannote.core-5.0.0-py3-none-any.whl (58 kB)\n", - "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m58.5/58.5 kB\u001b[0m \u001b[31m7.3 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", - "\u001b[?25hCollecting pyannote.metrics (from nemo_toolkit[all])\n", - " Downloading pyannote.metrics-3.2.1-py3-none-any.whl (51 kB)\n", - "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m51.4/51.4 kB\u001b[0m \u001b[31m6.3 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", - "\u001b[?25hCollecting pydub (from nemo_toolkit[all])\n", - " Downloading pydub-0.25.1-py2.py3-none-any.whl (32 kB)\n", - "Collecting pyloudnorm (from nemo_toolkit[all])\n", - " Downloading pyloudnorm-0.1.1-py3-none-any.whl (9.6 kB)\n", - "Collecting resampy (from nemo_toolkit[all])\n", - " Downloading resampy-0.4.3-py3-none-any.whl (3.1 MB)\n", - "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m3.1/3.1 MB\u001b[0m \u001b[31m82.6 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", - "\u001b[?25hRequirement already satisfied: scipy>=0.14 in /usr/local/lib/python3.10/dist-packages (from nemo_toolkit[all]) (1.11.4)\n", - "Requirement already satisfied: soundfile in /usr/local/lib/python3.10/dist-packages (from nemo_toolkit[all]) (0.12.1)\n", - "Collecting sox (from nemo_toolkit[all])\n", - " Downloading sox-1.5.0.tar.gz (63 kB)\n", - "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m63.9/63.9 kB\u001b[0m \u001b[31m8.2 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", - "\u001b[?25h Preparing metadata (setup.py) ... \u001b[?25l\u001b[?25hdone\n", - "Collecting texterrors (from nemo_toolkit[all])\n", - " Downloading texterrors-0.4.4-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (1.1 MB)\n", - "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m1.1/1.1 MB\u001b[0m \u001b[31m6.9 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", - "\u001b[?25hCollecting accelerated-scan (from nemo_toolkit[all])\n", - " Downloading accelerated_scan-0.2.0-py3-none-any.whl (11 kB)\n", - "Collecting boto3 (from nemo_toolkit[all])\n", - " Downloading boto3-1.34.113-py3-none-any.whl (139 kB)\n", - "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m139.3/139.3 kB\u001b[0m \u001b[31m17.8 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", - "\u001b[?25hCollecting causal-conv1d>=1.2.0 (from nemo_toolkit[all])\n", - " Downloading causal_conv1d-1.2.2.post1.tar.gz (7.2 kB)\n", - " Preparing metadata (setup.py) ... \u001b[?25l\u001b[?25hdone\n", - "Collecting faiss-cpu (from nemo_toolkit[all])\n", - " Downloading faiss_cpu-1.8.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (27.0 MB)\n", - "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m27.0/27.0 MB\u001b[0m \u001b[31m38.2 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", - "\u001b[?25hCollecting fasttext (from nemo_toolkit[all])\n", - " Downloading fasttext-0.9.2.tar.gz (68 kB)\n", - "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m68.8/68.8 kB\u001b[0m \u001b[31m9.1 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", - "\u001b[?25h Preparing metadata (setup.py) ... \u001b[?25l\u001b[?25hdone\n", - "Collecting flask-restful (from nemo_toolkit[all])\n", - " Downloading Flask_RESTful-0.3.10-py2.py3-none-any.whl (26 kB)\n", - "Collecting ftfy (from nemo_toolkit[all])\n", - " Downloading ftfy-6.2.0-py3-none-any.whl (54 kB)\n", - "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m54.4/54.4 kB\u001b[0m \u001b[31m7.4 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", - "\u001b[?25hRequirement already satisfied: gdown in /usr/local/lib/python3.10/dist-packages (from nemo_toolkit[all]) (5.1.0)\n", - "Requirement already satisfied: h5py in /usr/local/lib/python3.10/dist-packages (from nemo_toolkit[all]) (3.9.0)\n", - "Collecting ijson (from nemo_toolkit[all])\n", - " Downloading ijson-3.2.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (111 kB)\n", - "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m111.8/111.8 kB\u001b[0m \u001b[31m13.3 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", - "\u001b[?25hRequirement already satisfied: jieba in /usr/local/lib/python3.10/dist-packages (from nemo_toolkit[all]) (0.42.1)\n", - "Collecting markdown2 (from nemo_toolkit[all])\n", - " Downloading markdown2-2.4.13-py2.py3-none-any.whl (41 kB)\n", - "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m41.3/41.3 kB\u001b[0m \u001b[31m5.0 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", - "\u001b[?25hRequirement already satisfied: nltk>=3.6.5 in /usr/local/lib/python3.10/dist-packages (from nemo_toolkit[all]) (3.8.1)\n", - "Collecting opencc<1.1.7 (from nemo_toolkit[all])\n", - " Downloading OpenCC-1.1.6-cp310-cp310-manylinux1_x86_64.whl (778 kB)\n", - "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m778.3/778.3 kB\u001b[0m \u001b[31m43.3 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", - "\u001b[?25hCollecting pangu (from nemo_toolkit[all])\n", - " Downloading pangu-4.0.6.1-py3-none-any.whl (6.4 kB)\n", - "Collecting rapidfuzz (from nemo_toolkit[all])\n", - " Downloading rapidfuzz-3.9.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (3.4 MB)\n", - "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m3.4/3.4 MB\u001b[0m \u001b[31m36.3 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", - "\u001b[?25hCollecting rouge-score (from nemo_toolkit[all])\n", - " Downloading rouge_score-0.1.2.tar.gz (17 kB)\n", - " Preparing metadata (setup.py) ... \u001b[?25l\u001b[?25hdone\n", - "Collecting sacrebleu (from nemo_toolkit[all])\n", - " Downloading sacrebleu-2.4.2-py3-none-any.whl (106 kB)\n", - "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m106.7/106.7 kB\u001b[0m \u001b[31m14.6 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", - "\u001b[?25hCollecting sentence-transformers (from nemo_toolkit[all])\n", - " Downloading sentence_transformers-2.7.0-py3-none-any.whl (171 kB)\n", - "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m171.5/171.5 kB\u001b[0m \u001b[31m18.9 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", - "\u001b[?25hRequirement already satisfied: tensorstore<0.1.46 in /usr/local/lib/python3.10/dist-packages (from nemo_toolkit[all]) (0.1.45)\n", - "Collecting zarr (from nemo_toolkit[all])\n", - " Downloading zarr-2.18.2-py3-none-any.whl (210 kB)\n", - "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m210.2/210.2 kB\u001b[0m \u001b[31m23.5 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", - "\u001b[?25hCollecting attrdict (from nemo_toolkit[all])\n", - " Downloading attrdict-2.0.1-py2.py3-none-any.whl (9.9 kB)\n", - "Collecting kornia (from nemo_toolkit[all])\n", - " Downloading kornia-0.7.2-py2.py3-none-any.whl (825 kB)\n", - "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m825.4/825.4 kB\u001b[0m \u001b[31m57.5 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", - "\u001b[?25hCollecting pypinyin (from nemo_toolkit[all])\n", - " Downloading pypinyin-0.51.0-py2.py3-none-any.whl (1.4 MB)\n", - "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m1.4/1.4 MB\u001b[0m \u001b[31m70.1 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", - "\u001b[?25hCollecting pypinyin-dict (from nemo_toolkit[all])\n", - " Downloading pypinyin_dict-0.8.0-py2.py3-none-any.whl (9.5 MB)\n", - "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m9.5/9.5 MB\u001b[0m \u001b[31m49.6 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", - "\u001b[?25hCollecting progress>=1.5 (from nemo_toolkit[all])\n", - " Downloading progress-1.6.tar.gz (7.8 kB)\n", - " Preparing metadata (setup.py) ... \u001b[?25l\u001b[?25hdone\n", - "Requirement already satisfied: tabulate>=0.8.7 in /usr/local/lib/python3.10/dist-packages (from nemo_toolkit[all]) (0.9.0)\n", - "Collecting textdistance>=4.1.5 (from nemo_toolkit[all])\n", - " Downloading textdistance-4.6.2-py3-none-any.whl (31 kB)\n", - "Collecting addict (from nemo_toolkit[all])\n", - " Downloading addict-2.4.0-py3-none-any.whl (3.8 kB)\n", - "Collecting clip (from nemo_toolkit[all])\n", - " Downloading clip-0.2.0.tar.gz (5.5 kB)\n", - " Preparing metadata (setup.py) ... \u001b[?25l\u001b[?25hdone\n", - "Collecting decord (from nemo_toolkit[all])\n", - " Downloading decord-0.6.0-py3-none-manylinux2010_x86_64.whl (13.6 MB)\n", - "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m13.6/13.6 MB\u001b[0m \u001b[31m48.3 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", - "\u001b[?25hCollecting diffusers>=0.19.3 (from nemo_toolkit[all])\n", - " Downloading diffusers-0.28.0-py3-none-any.whl (2.2 MB)\n", - "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m2.2/2.2 MB\u001b[0m \u001b[31m58.3 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", - "\u001b[?25hCollecting einops-exts (from nemo_toolkit[all])\n", - " Downloading einops_exts-0.0.4-py3-none-any.whl (3.9 kB)\n", - "Requirement already satisfied: imageio in /usr/local/lib/python3.10/dist-packages (from nemo_toolkit[all]) (2.31.6)\n", - "Collecting nerfacc>=0.5.3 (from nemo_toolkit[all])\n", - " Downloading nerfacc-0.5.3-py3-none-any.whl (54 kB)\n", - "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m54.6/54.6 kB\u001b[0m \u001b[31m7.2 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", - "\u001b[?25hCollecting open-clip-torch (from nemo_toolkit[all])\n", - " Downloading open_clip_torch-2.24.0-py3-none-any.whl (1.5 MB)\n", - "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m1.5/1.5 MB\u001b[0m \u001b[31m24.2 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", - "\u001b[?25hCollecting PyMCubes (from nemo_toolkit[all])\n", - " Downloading PyMCubes-0.1.4-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (274 kB)\n", - "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m274.3/274.3 kB\u001b[0m \u001b[31m31.1 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", - "\u001b[?25hCollecting taming-transformers (from nemo_toolkit[all])\n", - " Downloading taming_transformers-0.0.1-py3-none-any.whl (45 kB)\n", - "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m45.6/45.6 kB\u001b[0m \u001b[31m5.5 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", - "\u001b[?25hCollecting torchdiffeq (from nemo_toolkit[all])\n", - " Downloading torchdiffeq-0.2.3-py3-none-any.whl (31 kB)\n", - "Collecting torchsde (from nemo_toolkit[all])\n", - " Downloading torchsde-0.2.6-py3-none-any.whl (61 kB)\n", - "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m61.2/61.2 kB\u001b[0m \u001b[31m8.3 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", - "\u001b[?25hCollecting trimesh (from nemo_toolkit[all])\n", - " Downloading trimesh-4.4.0-py3-none-any.whl (694 kB)\n", - "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m694.6/694.6 kB\u001b[0m \u001b[31m36.7 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", - "\u001b[?25hCollecting nemo-text-processing (from nemo_toolkit[all])\n", - " Downloading nemo_text_processing-1.0.2-py3-none-any.whl (2.6 MB)\n", - "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m2.6/2.6 MB\u001b[0m \u001b[31m38.6 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", - "\u001b[?25hCollecting mypy-extensions>=0.4.3 (from black~=24.3->nemo_toolkit[all])\n", - " Downloading mypy_extensions-1.0.0-py3-none-any.whl (4.7 kB)\n", - "Collecting pathspec>=0.9.0 (from black~=24.3->nemo_toolkit[all])\n", - " Downloading pathspec-0.12.1-py3-none-any.whl (31 kB)\n", - "Requirement already satisfied: platformdirs>=2 in /usr/local/lib/python3.10/dist-packages (from black~=24.3->nemo_toolkit[all]) (4.2.2)\n", - "Requirement already satisfied: tomli>=1.1.0 in /usr/local/lib/python3.10/dist-packages (from black~=24.3->nemo_toolkit[all]) (2.0.1)\n", - "Requirement already satisfied: typing-extensions>=4.0.1 in /usr/local/lib/python3.10/dist-packages (from black~=24.3->nemo_toolkit[all]) (4.11.0)\n", - "Collecting ninja (from causal-conv1d>=1.2.0->nemo_toolkit[all])\n", - " Downloading ninja-1.11.1.1-py2.py3-none-manylinux1_x86_64.manylinux_2_5_x86_64.whl (307 kB)\n", - "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m307.2/307.2 kB\u001b[0m \u001b[31m30.5 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", - "\u001b[?25hRequirement already satisfied: importlib-metadata in /usr/local/lib/python3.10/dist-packages (from diffusers>=0.19.3->nemo_toolkit[all]) (7.1.0)\n", - "Requirement already satisfied: filelock in /usr/local/lib/python3.10/dist-packages (from diffusers>=0.19.3->nemo_toolkit[all]) (3.14.0)\n", - "Requirement already satisfied: regex!=2019.12.17 in /usr/local/lib/python3.10/dist-packages (from diffusers>=0.19.3->nemo_toolkit[all]) (2023.12.25)\n", - "Requirement already satisfied: requests in /usr/local/lib/python3.10/dist-packages (from diffusers>=0.19.3->nemo_toolkit[all]) (2.31.0)\n", - "Requirement already satisfied: safetensors>=0.3.1 in /usr/local/lib/python3.10/dist-packages (from diffusers>=0.19.3->nemo_toolkit[all]) (0.4.3)\n", - "Requirement already satisfied: Pillow in /usr/local/lib/python3.10/dist-packages (from diffusers>=0.19.3->nemo_toolkit[all]) (9.4.0)\n", - "Requirement already satisfied: fsspec>=2023.5.0 in /usr/local/lib/python3.10/dist-packages (from huggingface-hub>=0.20.3->nemo_toolkit[all]) (2023.6.0)\n", - "Requirement already satisfied: pyyaml>=5.1 in /usr/local/lib/python3.10/dist-packages (from huggingface-hub>=0.20.3->nemo_toolkit[all]) (6.0.1)\n", - "Collecting antlr4-python3-runtime==4.9.* (from hydra-core<=1.3.2,>1.3->nemo_toolkit[all])\n", - " Downloading antlr4-python3-runtime-4.9.3.tar.gz (117 kB)\n", - "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m117.0/117.0 kB\u001b[0m \u001b[31m15.8 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", - "\u001b[?25h Preparing metadata (setup.py) ... \u001b[?25l\u001b[?25hdone\n", - "INFO: pip is looking at multiple versions of jiwer to determine which version is compatible with other requirements. This could take a while.\n", - "Collecting jiwer (from nemo_toolkit[all])\n", - " Downloading jiwer-3.0.3-py3-none-any.whl (21 kB)\n", - " Downloading jiwer-3.0.2-py3-none-any.whl (21 kB)\n", - " Downloading jiwer-3.0.1-py3-none-any.whl (21 kB)\n", - " Downloading jiwer-3.0.0-py3-none-any.whl (21 kB)\n", - " Downloading jiwer-2.6.0-py3-none-any.whl (20 kB)\n", - " Downloading jiwer-2.5.2-py3-none-any.whl (15 kB)\n", - "Collecting rapidfuzz (from nemo_toolkit[all])\n", - " Downloading rapidfuzz-2.13.7-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (2.2 MB)\n", - "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m2.2/2.2 MB\u001b[0m \u001b[31m37.9 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", - "\u001b[?25hRequirement already satisfied: audioread>=2.1.9 in /usr/local/lib/python3.10/dist-packages (from lhotse>=1.22.0->nemo_toolkit[all]) (3.0.1)\n", - "Collecting cytoolz>=0.10.1 (from lhotse>=1.22.0->nemo_toolkit[all])\n", - " Downloading cytoolz-0.12.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (2.0 MB)\n", - "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m2.0/2.0 MB\u001b[0m \u001b[31m36.0 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", - "\u001b[?25hCollecting intervaltree>=3.1.0 (from lhotse>=1.22.0->nemo_toolkit[all])\n", - " Downloading intervaltree-3.1.0.tar.gz (32 kB)\n", - " Preparing metadata (setup.py) ... \u001b[?25l\u001b[?25hdone\n", - "Collecting lilcom>=1.1.0 (from lhotse>=1.22.0->nemo_toolkit[all])\n", - " Downloading lilcom-1.7-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (87 kB)\n", - "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m87.1/87.1 kB\u001b[0m \u001b[31m11.4 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", - "\u001b[?25hRequirement already satisfied: joblib>=0.14 in /usr/local/lib/python3.10/dist-packages (from librosa>=0.10.0->nemo_toolkit[all]) (1.4.2)\n", - "Requirement already satisfied: decorator>=4.3.0 in /usr/local/lib/python3.10/dist-packages (from librosa>=0.10.0->nemo_toolkit[all]) (4.4.2)\n", - "Requirement already satisfied: pooch>=1.1 in /usr/local/lib/python3.10/dist-packages (from librosa>=0.10.0->nemo_toolkit[all]) (1.8.1)\n", - "Requirement already satisfied: soxr>=0.3.2 in /usr/local/lib/python3.10/dist-packages (from librosa>=0.10.0->nemo_toolkit[all]) (0.3.7)\n", - "Requirement already satisfied: lazy-loader>=0.1 in /usr/local/lib/python3.10/dist-packages (from librosa>=0.10.0->nemo_toolkit[all]) (0.4)\n", - "Requirement already satisfied: msgpack>=1.0 in /usr/local/lib/python3.10/dist-packages (from librosa>=0.10.0->nemo_toolkit[all]) (1.0.8)\n", - "Requirement already satisfied: contourpy>=1.0.1 in /usr/local/lib/python3.10/dist-packages (from matplotlib->nemo_toolkit[all]) (1.2.1)\n", - "Requirement already satisfied: cycler>=0.10 in /usr/local/lib/python3.10/dist-packages (from matplotlib->nemo_toolkit[all]) (0.12.1)\n", - "Requirement already satisfied: fonttools>=4.22.0 in /usr/local/lib/python3.10/dist-packages (from matplotlib->nemo_toolkit[all]) (4.51.0)\n", - "Requirement already satisfied: kiwisolver>=1.0.1 in /usr/local/lib/python3.10/dist-packages (from matplotlib->nemo_toolkit[all]) (1.4.5)\n", - "Requirement already satisfied: pyparsing>=2.3.1 in /usr/local/lib/python3.10/dist-packages (from matplotlib->nemo_toolkit[all]) (3.1.2)\n", - "Requirement already satisfied: rich>=12 in /usr/local/lib/python3.10/dist-packages (from nerfacc>=0.5.3->nemo_toolkit[all]) (13.7.1)\n", - "Requirement already satisfied: llvmlite<0.42,>=0.41.0dev0 in /usr/local/lib/python3.10/dist-packages (from numba->nemo_toolkit[all]) (0.41.1)\n", - "Requirement already satisfied: protobuf>=3.20.2 in /usr/local/lib/python3.10/dist-packages (from onnx>=1.7.0->nemo_toolkit[all]) (3.20.3)\n", - "Requirement already satisfied: six>=1.5 in /usr/local/lib/python3.10/dist-packages (from python-dateutil->nemo_toolkit[all]) (1.16.0)\n", - "Collecting lightning-utilities>=0.8.0 (from pytorch-lightning>=2.2.1->nemo_toolkit[all])\n", - " Downloading lightning_utilities-0.11.2-py3-none-any.whl (26 kB)\n", - "Requirement already satisfied: threadpoolctl>=2.0.0 in /usr/local/lib/python3.10/dist-packages (from scikit-learn->nemo_toolkit[all]) (3.5.0)\n", - "Requirement already satisfied: cffi>=1.0 in /usr/local/lib/python3.10/dist-packages (from soundfile->nemo_toolkit[all]) (1.16.0)\n", - "Requirement already satisfied: sympy in /usr/local/lib/python3.10/dist-packages (from torch->nemo_toolkit[all]) (1.12)\n", - "Requirement already satisfied: networkx in /usr/local/lib/python3.10/dist-packages (from torch->nemo_toolkit[all]) (3.3)\n", - "Requirement already satisfied: jinja2 in /usr/local/lib/python3.10/dist-packages (from torch->nemo_toolkit[all]) (3.1.4)\n", - "Collecting nvidia-cuda-nvrtc-cu12==12.1.105 (from torch->nemo_toolkit[all])\n", - " Using cached nvidia_cuda_nvrtc_cu12-12.1.105-py3-none-manylinux1_x86_64.whl (23.7 MB)\n", - "Collecting nvidia-cuda-runtime-cu12==12.1.105 (from torch->nemo_toolkit[all])\n", - " Using cached nvidia_cuda_runtime_cu12-12.1.105-py3-none-manylinux1_x86_64.whl (823 kB)\n", - "Collecting nvidia-cuda-cupti-cu12==12.1.105 (from torch->nemo_toolkit[all])\n", - " Using cached nvidia_cuda_cupti_cu12-12.1.105-py3-none-manylinux1_x86_64.whl (14.1 MB)\n", - "Collecting nvidia-cudnn-cu12==8.9.2.26 (from torch->nemo_toolkit[all])\n", - " Using cached nvidia_cudnn_cu12-8.9.2.26-py3-none-manylinux1_x86_64.whl (731.7 MB)\n", - "Collecting nvidia-cublas-cu12==12.1.3.1 (from torch->nemo_toolkit[all])\n", - " Using cached nvidia_cublas_cu12-12.1.3.1-py3-none-manylinux1_x86_64.whl (410.6 MB)\n", - "Collecting nvidia-cufft-cu12==11.0.2.54 (from torch->nemo_toolkit[all])\n", - " Using cached nvidia_cufft_cu12-11.0.2.54-py3-none-manylinux1_x86_64.whl (121.6 MB)\n", - "Collecting nvidia-curand-cu12==10.3.2.106 (from torch->nemo_toolkit[all])\n", - " Using cached nvidia_curand_cu12-10.3.2.106-py3-none-manylinux1_x86_64.whl (56.5 MB)\n", - "Collecting nvidia-cusolver-cu12==11.4.5.107 (from torch->nemo_toolkit[all])\n", - " Using cached nvidia_cusolver_cu12-11.4.5.107-py3-none-manylinux1_x86_64.whl (124.2 MB)\n", - "Collecting nvidia-cusparse-cu12==12.1.0.106 (from torch->nemo_toolkit[all])\n", - " Using cached nvidia_cusparse_cu12-12.1.0.106-py3-none-manylinux1_x86_64.whl (196.0 MB)\n", - "Collecting nvidia-nccl-cu12==2.20.5 (from torch->nemo_toolkit[all])\n", - " Using cached nvidia_nccl_cu12-2.20.5-py3-none-manylinux2014_x86_64.whl (176.2 MB)\n", - "Collecting nvidia-nvtx-cu12==12.1.105 (from torch->nemo_toolkit[all])\n", - " Using cached nvidia_nvtx_cu12-12.1.105-py3-none-manylinux1_x86_64.whl (99 kB)\n", - "Requirement already satisfied: triton==2.3.0 in /usr/local/lib/python3.10/dist-packages (from torch->nemo_toolkit[all]) (2.3.0)\n", - "Collecting nvidia-nvjitlink-cu12 (from nvidia-cusolver-cu12==11.4.5.107->torch->nemo_toolkit[all])\n", - " Downloading nvidia_nvjitlink_cu12-12.5.40-py3-none-manylinux2014_x86_64.whl (21.3 MB)\n", - "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m21.3/21.3 MB\u001b[0m \u001b[31m24.5 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", - "\u001b[?25hRequirement already satisfied: tokenizers<0.20,>=0.19 in /usr/local/lib/python3.10/dist-packages (from transformers<=4.40.2,>=4.36.0->nemo_toolkit[all]) (0.19.1)\n", - "Collecting botocore<1.35.0,>=1.34.113 (from boto3->nemo_toolkit[all])\n", - " Downloading botocore-1.34.113-py3-none-any.whl (12.3 MB)\n", - "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m12.3/12.3 MB\u001b[0m \u001b[31m29.0 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", - "\u001b[?25hCollecting jmespath<2.0.0,>=0.7.1 (from boto3->nemo_toolkit[all])\n", - " Downloading jmespath-1.0.1-py3-none-any.whl (20 kB)\n", - "Collecting s3transfer<0.11.0,>=0.10.0 (from boto3->nemo_toolkit[all])\n", - " Downloading s3transfer-0.10.1-py3-none-any.whl (82 kB)\n", - "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m82.2/82.2 kB\u001b[0m \u001b[31m9.0 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", - "\u001b[?25hRequirement already satisfied: pyarrow>=12.0.0 in /usr/local/lib/python3.10/dist-packages (from datasets->nemo_toolkit[all]) (14.0.2)\n", - "Requirement already satisfied: pyarrow-hotfix in /usr/local/lib/python3.10/dist-packages (from datasets->nemo_toolkit[all]) (0.6)\n", - "Collecting dill<0.3.9,>=0.3.0 (from datasets->nemo_toolkit[all])\n", - " Downloading dill-0.3.8-py3-none-any.whl (116 kB)\n", - "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m116.3/116.3 kB\u001b[0m \u001b[31m11.4 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", - "\u001b[?25hCollecting xxhash (from datasets->nemo_toolkit[all])\n", - " Downloading xxhash-3.4.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (194 kB)\n", - "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m194.1/194.1 kB\u001b[0m \u001b[31m21.8 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", - "\u001b[?25hCollecting multiprocess (from datasets->nemo_toolkit[all])\n", - " Downloading multiprocess-0.70.16-py310-none-any.whl (134 kB)\n", - "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m134.8/134.8 kB\u001b[0m \u001b[31m15.2 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", - "\u001b[?25hRequirement already satisfied: aiohttp in /usr/local/lib/python3.10/dist-packages (from datasets->nemo_toolkit[all]) (3.9.5)\n", - "Collecting pybind11>=2.2 (from fasttext->nemo_toolkit[all])\n", - " Using cached pybind11-2.12.0-py3-none-any.whl (234 kB)\n", - "Requirement already satisfied: absl-py in /usr/local/lib/python3.10/dist-packages (from fiddle->nemo_toolkit[all]) (1.4.0)\n", - "Requirement already satisfied: graphviz in /usr/local/lib/python3.10/dist-packages (from fiddle->nemo_toolkit[all]) (0.20.3)\n", - "Collecting libcst (from fiddle->nemo_toolkit[all])\n", - " Downloading libcst-1.4.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (2.3 MB)\n", - "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m2.3/2.3 MB\u001b[0m \u001b[31m29.6 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", - "\u001b[?25hCollecting aniso8601>=0.82 (from flask-restful->nemo_toolkit[all])\n", - " Downloading aniso8601-9.0.1-py2.py3-none-any.whl (52 kB)\n", - "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m52.8/52.8 kB\u001b[0m \u001b[31m6.7 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", - "\u001b[?25hRequirement already satisfied: Flask>=0.8 in /usr/local/lib/python3.10/dist-packages (from flask-restful->nemo_toolkit[all]) (2.2.5)\n", - "Requirement already satisfied: pytz in /usr/local/lib/python3.10/dist-packages (from flask-restful->nemo_toolkit[all]) (2023.4)\n", - "Requirement already satisfied: wcwidth<0.3.0,>=0.2.12 in /usr/local/lib/python3.10/dist-packages (from ftfy->nemo_toolkit[all]) (0.2.13)\n", - "Collecting distance>=0.1.3 (from g2p-en->nemo_toolkit[all])\n", - " Downloading Distance-0.1.3.tar.gz (180 kB)\n", - "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m180.3/180.3 kB\u001b[0m \u001b[31m20.3 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", - "\u001b[?25h Preparing metadata (setup.py) ... \u001b[?25l\u001b[?25hdone\n", - "Requirement already satisfied: pydantic>=1.9.1 in /usr/local/lib/python3.10/dist-packages (from inflect->nemo_toolkit[all]) (2.7.1)\n", - "Requirement already satisfied: beautifulsoup4 in /usr/local/lib/python3.10/dist-packages (from gdown->nemo_toolkit[all]) (4.12.3)\n", - "Requirement already satisfied: ipykernel>=4.5.1 in /usr/local/lib/python3.10/dist-packages (from ipywidgets->nemo_toolkit[all]) (5.5.6)\n", - "Requirement already satisfied: ipython-genutils~=0.2.0 in /usr/local/lib/python3.10/dist-packages (from ipywidgets->nemo_toolkit[all]) (0.2.0)\n", - "Requirement already satisfied: traitlets>=4.3.1 in /usr/local/lib/python3.10/dist-packages (from ipywidgets->nemo_toolkit[all]) (5.7.1)\n", - "Requirement already satisfied: widgetsnbextension~=3.6.0 in /usr/local/lib/python3.10/dist-packages (from ipywidgets->nemo_toolkit[all]) (3.6.6)\n", - "Requirement already satisfied: ipython>=4.0.0 in /usr/local/lib/python3.10/dist-packages (from ipywidgets->nemo_toolkit[all]) (7.34.0)\n", - "Requirement already satisfied: jupyterlab-widgets>=1.0.0 in /usr/local/lib/python3.10/dist-packages (from ipywidgets->nemo_toolkit[all]) (3.0.10)\n", - "Collecting kornia-rs>=0.1.0 (from kornia->nemo_toolkit[all])\n", - " Downloading kornia_rs-0.1.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (2.4 MB)\n", - "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m2.4/2.4 MB\u001b[0m \u001b[31m36.5 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", - "\u001b[?25hCollecting cdifflib (from nemo-text-processing->nemo_toolkit[all])\n", - " Downloading cdifflib-1.2.6.tar.gz (11 kB)\n", - " Installing build dependencies ... \u001b[?25l\u001b[?25hdone\n", - " Getting requirements to build wheel ... \u001b[?25l\u001b[?25hdone\n", - " Installing backend dependencies ... \u001b[?25l\u001b[?25hdone\n", - " Preparing metadata (pyproject.toml) ... \u001b[?25l\u001b[?25hdone\n", - "Collecting pynini==2.1.5 (from nemo-text-processing->nemo_toolkit[all])\n", - " Downloading pynini-2.1.5-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (161.3 MB)\n", - "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m161.3/161.3 MB\u001b[0m \u001b[31m2.6 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", - "\u001b[?25hRequirement already satisfied: Cython>=0.29 in /usr/local/lib/python3.10/dist-packages (from pynini==2.1.5->nemo-text-processing->nemo_toolkit[all]) (3.0.10)\n", - "Requirement already satisfied: torchvision in /usr/local/lib/python3.10/dist-packages (from open-clip-torch->nemo_toolkit[all]) (0.18.0+cu121)\n", - "Collecting timm (from open-clip-torch->nemo_toolkit[all])\n", - " Downloading timm-1.0.3-py3-none-any.whl (2.3 MB)\n", - "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m2.3/2.3 MB\u001b[0m \u001b[31m4.8 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", - "\u001b[?25hRequirement already satisfied: tzdata>=2022.1 in /usr/local/lib/python3.10/dist-packages (from pandas->nemo_toolkit[all]) (2024.1)\n", - "Requirement already satisfied: sortedcontainers>=2.0.4 in /usr/local/lib/python3.10/dist-packages (from pyannote.core->nemo_toolkit[all]) (2.4.0)\n", - "Collecting pyannote.database>=4.0.1 (from pyannote.metrics->nemo_toolkit[all])\n", - " Downloading pyannote.database-5.1.0-py3-none-any.whl (48 kB)\n", - "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m48.1/48.1 kB\u001b[0m \u001b[31m4.8 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", - "\u001b[?25hCollecting docopt>=0.6.2 (from pyannote.metrics->nemo_toolkit[all])\n", - " Downloading docopt-0.6.2.tar.gz (25 kB)\n", - " Preparing metadata (setup.py) ... \u001b[?25l\u001b[?25hdone\n", - "Requirement already satisfied: future>=0.16.0 in /usr/local/lib/python3.10/dist-packages (from pyloudnorm->nemo_toolkit[all]) (0.18.3)\n", - "Requirement already satisfied: iniconfig in /usr/local/lib/python3.10/dist-packages (from pytest->nemo_toolkit[all]) (2.0.0)\n", - "Requirement already satisfied: pluggy<2.0,>=0.12 in /usr/local/lib/python3.10/dist-packages (from pytest->nemo_toolkit[all]) (1.5.0)\n", - "Requirement already satisfied: exceptiongroup>=1.0.0rc8 in /usr/local/lib/python3.10/dist-packages (from pytest->nemo_toolkit[all]) (1.2.1)\n", - "Collecting ruamel.yaml.clib>=0.2.7 (from ruamel.yaml->nemo_toolkit[all])\n", - " Downloading ruamel.yaml.clib-0.2.8-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl (526 kB)\n", - "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m526.7/526.7 kB\u001b[0m \u001b[31m4.9 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", - "\u001b[?25hCollecting portalocker (from sacrebleu->nemo_toolkit[all])\n", - " Downloading portalocker-2.8.2-py3-none-any.whl (17 kB)\n", - "Collecting colorama (from sacrebleu->nemo_toolkit[all])\n", - " Downloading colorama-0.4.6-py2.py3-none-any.whl (25 kB)\n", - "Requirement already satisfied: lxml in /usr/local/lib/python3.10/dist-packages (from sacrebleu->nemo_toolkit[all]) (4.9.4)\n", - "Requirement already satisfied: sphinxcontrib-applehelp in /usr/local/lib/python3.10/dist-packages (from sphinx->nemo_toolkit[all]) (1.0.8)\n", - "Requirement already satisfied: sphinxcontrib-devhelp in /usr/local/lib/python3.10/dist-packages (from sphinx->nemo_toolkit[all]) (1.0.6)\n", - "Requirement already satisfied: sphinxcontrib-jsmath in /usr/local/lib/python3.10/dist-packages (from sphinx->nemo_toolkit[all]) (1.0.1)\n", - "Requirement already satisfied: sphinxcontrib-htmlhelp>=2.0.0 in /usr/local/lib/python3.10/dist-packages (from sphinx->nemo_toolkit[all]) (2.0.5)\n", - "Requirement already satisfied: sphinxcontrib-serializinghtml>=1.1.5 in /usr/local/lib/python3.10/dist-packages (from sphinx->nemo_toolkit[all]) (1.1.10)\n", - "Requirement already satisfied: sphinxcontrib-qthelp in /usr/local/lib/python3.10/dist-packages (from sphinx->nemo_toolkit[all]) (1.0.7)\n", - "Requirement already satisfied: Pygments>=2.0 in /usr/local/lib/python3.10/dist-packages (from sphinx->nemo_toolkit[all]) (2.16.1)\n", - "Requirement already satisfied: docutils<0.19,>=0.14 in /usr/local/lib/python3.10/dist-packages (from sphinx->nemo_toolkit[all]) (0.18.1)\n", - "Requirement already satisfied: snowballstemmer>=1.1 in /usr/local/lib/python3.10/dist-packages (from sphinx->nemo_toolkit[all]) (2.2.0)\n", - "Requirement already satisfied: babel>=1.3 in /usr/local/lib/python3.10/dist-packages (from sphinx->nemo_toolkit[all]) (2.15.0)\n", - "Requirement already satisfied: alabaster<0.8,>=0.7 in /usr/local/lib/python3.10/dist-packages (from sphinx->nemo_toolkit[all]) (0.7.16)\n", - "Requirement already satisfied: imagesize in /usr/local/lib/python3.10/dist-packages (from sphinx->nemo_toolkit[all]) (1.4.1)\n", - "Collecting docutils<0.19,>=0.14 (from sphinx->nemo_toolkit[all])\n", - " Downloading docutils-0.17.1-py2.py3-none-any.whl (575 kB)\n", - "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m575.5/575.5 kB\u001b[0m \u001b[31m4.9 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", - "\u001b[?25hCollecting pybtex>=0.24 (from sphinxcontrib-bibtex->nemo_toolkit[all])\n", - " Downloading pybtex-0.24.0-py2.py3-none-any.whl (561 kB)\n", - "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m561.4/561.4 kB\u001b[0m \u001b[31m4.8 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", - "\u001b[?25hCollecting pybtex-docutils>=1.0.0 (from sphinxcontrib-bibtex->nemo_toolkit[all])\n", - " Downloading pybtex_docutils-1.0.3-py3-none-any.whl (6.4 kB)\n", - "Requirement already satisfied: grpcio>=1.48.2 in /usr/local/lib/python3.10/dist-packages (from tensorboard->nemo_toolkit[all]) (1.64.0)\n", - "Requirement already satisfied: google-auth<3,>=1.6.3 in /usr/local/lib/python3.10/dist-packages (from tensorboard->nemo_toolkit[all]) (2.27.0)\n", - "Requirement already satisfied: google-auth-oauthlib<2,>=0.5 in /usr/local/lib/python3.10/dist-packages (from tensorboard->nemo_toolkit[all]) (1.2.0)\n", - "Requirement already satisfied: markdown>=2.6.8 in /usr/local/lib/python3.10/dist-packages (from tensorboard->nemo_toolkit[all]) (3.6)\n", - "Requirement already satisfied: tensorboard-data-server<0.8.0,>=0.7.0 in /usr/local/lib/python3.10/dist-packages (from tensorboard->nemo_toolkit[all]) (0.7.2)\n", - "Requirement already satisfied: werkzeug>=1.0.1 in /usr/local/lib/python3.10/dist-packages (from tensorboard->nemo_toolkit[all]) (3.0.3)\n", - "Collecting plac (from texterrors->nemo_toolkit[all])\n", - " Downloading plac-1.4.3-py2.py3-none-any.whl (22 kB)\n", - "Collecting loguru (from texterrors->nemo_toolkit[all])\n", - " Downloading loguru-0.7.2-py3-none-any.whl (62 kB)\n", - "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m62.5/62.5 kB\u001b[0m \u001b[31m4.9 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", - "\u001b[?25hRequirement already satisfied: termcolor in /usr/local/lib/python3.10/dist-packages (from texterrors->nemo_toolkit[all]) (2.4.0)\n", - "Collecting Levenshtein (from texterrors->nemo_toolkit[all])\n", - " Downloading Levenshtein-0.25.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (177 kB)\n", - "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m177.4/177.4 kB\u001b[0m \u001b[31m4.7 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", - "\u001b[?25hCollecting trampoline>=0.1.2 (from torchsde->nemo_toolkit[all])\n", - " Downloading trampoline-0.1.2-py3-none-any.whl (5.2 kB)\n", - "Collecting docker-pycreds>=0.4.0 (from wandb->nemo_toolkit[all])\n", - " Downloading docker_pycreds-0.4.0-py2.py3-none-any.whl (9.0 kB)\n", - "Collecting gitpython!=3.1.29,>=1.0.0 (from wandb->nemo_toolkit[all])\n", - " Downloading GitPython-3.1.43-py3-none-any.whl (207 kB)\n", - "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m207.3/207.3 kB\u001b[0m \u001b[31m4.5 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", - "\u001b[?25hRequirement already satisfied: psutil>=5.0.0 in /usr/local/lib/python3.10/dist-packages (from wandb->nemo_toolkit[all]) (5.9.5)\n", - "Collecting sentry-sdk>=1.0.0 (from wandb->nemo_toolkit[all])\n", - " Downloading sentry_sdk-2.3.1-py2.py3-none-any.whl (289 kB)\n", - "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m289.0/289.0 kB\u001b[0m \u001b[31m5.4 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", - "\u001b[?25hCollecting setproctitle (from wandb->nemo_toolkit[all])\n", - " Downloading setproctitle-1.3.3-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl (30 kB)\n", - "Collecting asciitree (from zarr->nemo_toolkit[all])\n", - " Downloading asciitree-0.3.3.tar.gz (4.0 kB)\n", - " Preparing metadata (setup.py) ... \u001b[?25l\u001b[?25hdone\n", - "Collecting numcodecs>=0.10.0 (from zarr->nemo_toolkit[all])\n", - " Downloading numcodecs-0.12.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (7.7 MB)\n", - "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m7.7/7.7 MB\u001b[0m \u001b[31m5.7 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", - "\u001b[?25hCollecting fasteners (from zarr->nemo_toolkit[all])\n", - " Downloading fasteners-0.19-py3-none-any.whl (18 kB)\n", - "Requirement already satisfied: urllib3!=2.2.0,<3,>=1.25.4 in /usr/local/lib/python3.10/dist-packages (from botocore<1.35.0,>=1.34.113->boto3->nemo_toolkit[all]) (2.0.7)\n", - "Requirement already satisfied: pycparser in /usr/local/lib/python3.10/dist-packages (from cffi>=1.0->soundfile->nemo_toolkit[all]) (2.22)\n", - "Requirement already satisfied: toolz>=0.8.0 in /usr/local/lib/python3.10/dist-packages (from cytoolz>=0.10.1->lhotse>=1.22.0->nemo_toolkit[all]) (0.12.1)\n", - "Requirement already satisfied: itsdangerous>=2.0 in /usr/local/lib/python3.10/dist-packages (from Flask>=0.8->flask-restful->nemo_toolkit[all]) (2.2.0)\n", - "Requirement already satisfied: aiosignal>=1.1.2 in /usr/local/lib/python3.10/dist-packages (from aiohttp->datasets->nemo_toolkit[all]) (1.3.1)\n", - "Requirement already satisfied: attrs>=17.3.0 in /usr/local/lib/python3.10/dist-packages (from aiohttp->datasets->nemo_toolkit[all]) (23.2.0)\n", - "Requirement already satisfied: frozenlist>=1.1.1 in /usr/local/lib/python3.10/dist-packages (from aiohttp->datasets->nemo_toolkit[all]) (1.4.1)\n", - "Requirement already satisfied: multidict<7.0,>=4.5 in /usr/local/lib/python3.10/dist-packages (from aiohttp->datasets->nemo_toolkit[all]) (6.0.5)\n", - "Requirement already satisfied: yarl<2.0,>=1.0 in /usr/local/lib/python3.10/dist-packages (from aiohttp->datasets->nemo_toolkit[all]) (1.9.4)\n", - "Requirement already satisfied: async-timeout<5.0,>=4.0 in /usr/local/lib/python3.10/dist-packages (from aiohttp->datasets->nemo_toolkit[all]) (4.0.3)\n", - "Collecting gitdb<5,>=4.0.1 (from gitpython!=3.1.29,>=1.0.0->wandb->nemo_toolkit[all])\n", - " Downloading gitdb-4.0.11-py3-none-any.whl (62 kB)\n", - "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m62.7/62.7 kB\u001b[0m \u001b[31m5.1 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", - "\u001b[?25hRequirement already satisfied: cachetools<6.0,>=2.0.0 in /usr/local/lib/python3.10/dist-packages (from google-auth<3,>=1.6.3->tensorboard->nemo_toolkit[all]) (5.3.3)\n", - "Requirement already satisfied: pyasn1-modules>=0.2.1 in /usr/local/lib/python3.10/dist-packages (from google-auth<3,>=1.6.3->tensorboard->nemo_toolkit[all]) (0.4.0)\n", - "Requirement already satisfied: rsa<5,>=3.1.4 in /usr/local/lib/python3.10/dist-packages (from google-auth<3,>=1.6.3->tensorboard->nemo_toolkit[all]) (4.9)\n", - "Requirement already satisfied: requests-oauthlib>=0.7.0 in /usr/local/lib/python3.10/dist-packages (from google-auth-oauthlib<2,>=0.5->tensorboard->nemo_toolkit[all]) (1.3.1)\n", - "Requirement already satisfied: jupyter-client in /usr/local/lib/python3.10/dist-packages (from ipykernel>=4.5.1->ipywidgets->nemo_toolkit[all]) (6.1.12)\n", - "Requirement already satisfied: tornado>=4.2 in /usr/local/lib/python3.10/dist-packages (from ipykernel>=4.5.1->ipywidgets->nemo_toolkit[all]) (6.3.3)\n", - "Collecting jedi>=0.16 (from ipython>=4.0.0->ipywidgets->nemo_toolkit[all])\n", - " Downloading jedi-0.19.1-py2.py3-none-any.whl (1.6 MB)\n", - "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m1.6/1.6 MB\u001b[0m \u001b[31m6.1 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", - "\u001b[?25hRequirement already satisfied: pickleshare in /usr/local/lib/python3.10/dist-packages (from ipython>=4.0.0->ipywidgets->nemo_toolkit[all]) (0.7.5)\n", - "Requirement already satisfied: prompt-toolkit!=3.0.0,!=3.0.1,<3.1.0,>=2.0.0 in /usr/local/lib/python3.10/dist-packages (from ipython>=4.0.0->ipywidgets->nemo_toolkit[all]) (3.0.43)\n", - "Requirement already satisfied: backcall in /usr/local/lib/python3.10/dist-packages (from ipython>=4.0.0->ipywidgets->nemo_toolkit[all]) (0.2.0)\n", - "Requirement already satisfied: matplotlib-inline in /usr/local/lib/python3.10/dist-packages (from ipython>=4.0.0->ipywidgets->nemo_toolkit[all]) (0.1.7)\n", - "Requirement already satisfied: pexpect>4.3 in /usr/local/lib/python3.10/dist-packages (from ipython>=4.0.0->ipywidgets->nemo_toolkit[all]) (4.9.0)\n", - "Requirement already satisfied: MarkupSafe>=2.0 in /usr/local/lib/python3.10/dist-packages (from jinja2->torch->nemo_toolkit[all]) (2.1.5)\n", - "Collecting typer>=0.12.1 (from pyannote.database>=4.0.1->pyannote.metrics->nemo_toolkit[all])\n", - " Downloading typer-0.12.3-py3-none-any.whl (47 kB)\n", - "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m47.2/47.2 kB\u001b[0m \u001b[31m5.2 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", - "\u001b[?25hCollecting latexcodec>=1.0.4 (from pybtex>=0.24->sphinxcontrib-bibtex->nemo_toolkit[all])\n", - " Downloading latexcodec-3.0.0-py3-none-any.whl (18 kB)\n", - "Requirement already satisfied: annotated-types>=0.4.0 in /usr/local/lib/python3.10/dist-packages (from pydantic>=1.9.1->inflect->nemo_toolkit[all]) (0.7.0)\n", - "Requirement already satisfied: pydantic-core==2.18.2 in /usr/local/lib/python3.10/dist-packages (from pydantic>=1.9.1->inflect->nemo_toolkit[all]) (2.18.2)\n", - "Requirement already satisfied: charset-normalizer<4,>=2 in /usr/local/lib/python3.10/dist-packages (from requests->diffusers>=0.19.3->nemo_toolkit[all]) (3.3.2)\n", - "Requirement already satisfied: idna<4,>=2.5 in /usr/local/lib/python3.10/dist-packages (from requests->diffusers>=0.19.3->nemo_toolkit[all]) (3.7)\n", - "Requirement already satisfied: certifi>=2017.4.17 in /usr/local/lib/python3.10/dist-packages (from requests->diffusers>=0.19.3->nemo_toolkit[all]) (2024.2.2)\n", - "Requirement already satisfied: markdown-it-py>=2.2.0 in /usr/local/lib/python3.10/dist-packages (from rich>=12->nerfacc>=0.5.3->nemo_toolkit[all]) (3.0.0)\n", - "Requirement already satisfied: mpmath>=0.19 in /usr/local/lib/python3.10/dist-packages (from sympy->torch->nemo_toolkit[all]) (1.3.0)\n", - "Requirement already satisfied: notebook>=4.4.1 in /usr/local/lib/python3.10/dist-packages (from widgetsnbextension~=3.6.0->ipywidgets->nemo_toolkit[all]) (6.5.5)\n", - "Requirement already satisfied: soupsieve>1.2 in /usr/local/lib/python3.10/dist-packages (from beautifulsoup4->gdown->nemo_toolkit[all]) (2.5)\n", - "Requirement already satisfied: zipp>=0.5 in /usr/local/lib/python3.10/dist-packages (from importlib-metadata->diffusers>=0.19.3->nemo_toolkit[all]) (3.18.2)\n", - "INFO: pip is looking at multiple versions of levenshtein to determine which version is compatible with other requirements. This could take a while.\n", - "Collecting Levenshtein (from texterrors->nemo_toolkit[all])\n", - " Downloading Levenshtein-0.25.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (177 kB)\n", - "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m177.4/177.4 kB\u001b[0m \u001b[31m6.8 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", - "\u001b[?25h Downloading Levenshtein-0.24.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (177 kB)\n", - "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m177.4/177.4 kB\u001b[0m \u001b[31m7.0 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", - "\u001b[?25h Downloading Levenshtein-0.23.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (169 kB)\n", - "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m169.4/169.4 kB\u001b[0m \u001b[31m6.9 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", - "\u001b[?25h Downloading Levenshtein-0.22.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (172 kB)\n", - "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m172.9/172.9 kB\u001b[0m \u001b[31m6.9 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", - "\u001b[?25hRequirement already satisfied: PySocks!=1.5.7,>=1.5.6 in /usr/local/lib/python3.10/dist-packages (from requests->diffusers>=0.19.3->nemo_toolkit[all]) (1.7.1)\n", - "Collecting smmap<6,>=3.0.1 (from gitdb<5,>=4.0.1->gitpython!=3.1.29,>=1.0.0->wandb->nemo_toolkit[all])\n", - " Downloading smmap-5.0.1-py3-none-any.whl (24 kB)\n", - "Requirement already satisfied: parso<0.9.0,>=0.8.3 in /usr/local/lib/python3.10/dist-packages (from jedi>=0.16->ipython>=4.0.0->ipywidgets->nemo_toolkit[all]) (0.8.4)\n", - "Requirement already satisfied: mdurl~=0.1 in /usr/local/lib/python3.10/dist-packages (from markdown-it-py>=2.2.0->rich>=12->nerfacc>=0.5.3->nemo_toolkit[all]) (0.1.2)\n", - "Requirement already satisfied: pyzmq<25,>=17 in /usr/local/lib/python3.10/dist-packages (from notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets->nemo_toolkit[all]) (24.0.1)\n", - "Requirement already satisfied: argon2-cffi in /usr/local/lib/python3.10/dist-packages (from notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets->nemo_toolkit[all]) (23.1.0)\n", - "Requirement already satisfied: jupyter-core>=4.6.1 in /usr/local/lib/python3.10/dist-packages (from notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets->nemo_toolkit[all]) (5.7.2)\n", - "Requirement already satisfied: nbformat in /usr/local/lib/python3.10/dist-packages (from notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets->nemo_toolkit[all]) (5.10.4)\n", - "Requirement already satisfied: nbconvert>=5 in /usr/local/lib/python3.10/dist-packages (from notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets->nemo_toolkit[all]) (6.5.4)\n", - "Requirement already satisfied: nest-asyncio>=1.5 in /usr/local/lib/python3.10/dist-packages (from notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets->nemo_toolkit[all]) (1.6.0)\n", - "Requirement already satisfied: Send2Trash>=1.8.0 in /usr/local/lib/python3.10/dist-packages (from notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets->nemo_toolkit[all]) (1.8.3)\n", - "Requirement already satisfied: terminado>=0.8.3 in /usr/local/lib/python3.10/dist-packages (from notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets->nemo_toolkit[all]) (0.18.1)\n", - "Requirement already satisfied: prometheus-client in /usr/local/lib/python3.10/dist-packages (from notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets->nemo_toolkit[all]) (0.20.0)\n", - "Requirement already satisfied: nbclassic>=0.4.7 in /usr/local/lib/python3.10/dist-packages (from notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets->nemo_toolkit[all]) (1.0.0)\n", - "Requirement already satisfied: ptyprocess>=0.5 in /usr/local/lib/python3.10/dist-packages (from pexpect>4.3->ipython>=4.0.0->ipywidgets->nemo_toolkit[all]) (0.7.0)\n", - "Requirement already satisfied: pyasn1<0.7.0,>=0.4.6 in /usr/local/lib/python3.10/dist-packages (from pyasn1-modules>=0.2.1->google-auth<3,>=1.6.3->tensorboard->nemo_toolkit[all]) (0.6.0)\n", - "Requirement already satisfied: oauthlib>=3.0.0 in /usr/local/lib/python3.10/dist-packages (from requests-oauthlib>=0.7.0->google-auth-oauthlib<2,>=0.5->tensorboard->nemo_toolkit[all]) (3.2.2)\n", - "Collecting shellingham>=1.3.0 (from typer>=0.12.1->pyannote.database>=4.0.1->pyannote.metrics->nemo_toolkit[all])\n", - " Downloading shellingham-1.5.4-py2.py3-none-any.whl (9.8 kB)\n", - "Requirement already satisfied: jupyter-server>=1.8 in /usr/local/lib/python3.10/dist-packages (from nbclassic>=0.4.7->notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets->nemo_toolkit[all]) (1.24.0)\n", - "Requirement already satisfied: notebook-shim>=0.2.3 in /usr/local/lib/python3.10/dist-packages (from nbclassic>=0.4.7->notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets->nemo_toolkit[all]) (0.2.4)\n", - "Requirement already satisfied: bleach in /usr/local/lib/python3.10/dist-packages (from nbconvert>=5->notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets->nemo_toolkit[all]) (6.1.0)\n", - "Requirement already satisfied: defusedxml in /usr/local/lib/python3.10/dist-packages (from nbconvert>=5->notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets->nemo_toolkit[all]) (0.7.1)\n", - "Requirement already satisfied: entrypoints>=0.2.2 in /usr/local/lib/python3.10/dist-packages (from nbconvert>=5->notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets->nemo_toolkit[all]) (0.4)\n", - "Requirement already satisfied: jupyterlab-pygments in /usr/local/lib/python3.10/dist-packages (from nbconvert>=5->notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets->nemo_toolkit[all]) (0.3.0)\n", - "Requirement already satisfied: mistune<2,>=0.8.1 in /usr/local/lib/python3.10/dist-packages (from nbconvert>=5->notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets->nemo_toolkit[all]) (0.8.4)\n", - "Requirement already satisfied: nbclient>=0.5.0 in /usr/local/lib/python3.10/dist-packages (from nbconvert>=5->notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets->nemo_toolkit[all]) (0.10.0)\n", - "Requirement already satisfied: pandocfilters>=1.4.1 in /usr/local/lib/python3.10/dist-packages (from nbconvert>=5->notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets->nemo_toolkit[all]) (1.5.1)\n", - "Requirement already satisfied: tinycss2 in /usr/local/lib/python3.10/dist-packages (from nbconvert>=5->notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets->nemo_toolkit[all]) (1.3.0)\n", - "Requirement already satisfied: fastjsonschema>=2.15 in /usr/local/lib/python3.10/dist-packages (from nbformat->notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets->nemo_toolkit[all]) (2.19.1)\n", - "Requirement already satisfied: jsonschema>=2.6 in /usr/local/lib/python3.10/dist-packages (from nbformat->notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets->nemo_toolkit[all]) (4.19.2)\n", - "Requirement already satisfied: argon2-cffi-bindings in /usr/local/lib/python3.10/dist-packages (from argon2-cffi->notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets->nemo_toolkit[all]) (21.2.0)\n", - "Requirement already satisfied: jsonschema-specifications>=2023.03.6 in /usr/local/lib/python3.10/dist-packages (from jsonschema>=2.6->nbformat->notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets->nemo_toolkit[all]) (2023.12.1)\n", - "Requirement already satisfied: referencing>=0.28.4 in /usr/local/lib/python3.10/dist-packages (from jsonschema>=2.6->nbformat->notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets->nemo_toolkit[all]) (0.35.1)\n", - "Requirement already satisfied: rpds-py>=0.7.1 in /usr/local/lib/python3.10/dist-packages (from jsonschema>=2.6->nbformat->notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets->nemo_toolkit[all]) (0.18.1)\n", - "Requirement already satisfied: anyio<4,>=3.1.0 in /usr/local/lib/python3.10/dist-packages (from jupyter-server>=1.8->nbclassic>=0.4.7->notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets->nemo_toolkit[all]) (3.7.1)\n", - "Requirement already satisfied: websocket-client in /usr/local/lib/python3.10/dist-packages (from jupyter-server>=1.8->nbclassic>=0.4.7->notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets->nemo_toolkit[all]) (1.8.0)\n", - "Requirement already satisfied: webencodings in /usr/local/lib/python3.10/dist-packages (from bleach->nbconvert>=5->notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets->nemo_toolkit[all]) (0.5.1)\n", - "Requirement already satisfied: sniffio>=1.1 in /usr/local/lib/python3.10/dist-packages (from anyio<4,>=3.1.0->jupyter-server>=1.8->nbclassic>=0.4.7->notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets->nemo_toolkit[all]) (1.3.1)\n", - "Building wheels for collected packages: causal-conv1d, antlr4-python3-runtime, progress, clip, fasttext, kaldi-python-io, nemo_toolkit, rouge-score, sox, distance, docopt, intervaltree, asciitree, cdifflib\n", - " Building wheel for causal-conv1d (setup.py) ... \u001b[?25l\u001b[?25hdone\n", - " Created wheel for causal-conv1d: filename=causal_conv1d-1.2.2.post1-cp310-cp310-linux_x86_64.whl size=103643300 sha256=2bba8823ae89bd79c2d067978e0e533fab8298f69855bfc5d199828b278cf66c\n", - " Stored in directory: /root/.cache/pip/wheels/22/a7/db/0c9482dec3707ad23181b0eb2da40e4b8f26aaed49752fc49f\n", - " Building wheel for antlr4-python3-runtime (setup.py) ... \u001b[?25l\u001b[?25hdone\n", - " Created wheel for antlr4-python3-runtime: filename=antlr4_python3_runtime-4.9.3-py3-none-any.whl size=144554 sha256=3475219dd9a159d2f8bb2612ab31b18a5bbfc6afd74b2893a59926eb5e69b04f\n", - " Stored in directory: /root/.cache/pip/wheels/12/93/dd/1f6a127edc45659556564c5730f6d4e300888f4bca2d4c5a88\n", - " Building wheel for progress (setup.py) ... \u001b[?25l\u001b[?25hdone\n", - " Created wheel for progress: filename=progress-1.6-py3-none-any.whl size=9614 sha256=002f0ee026c618dd5f333e3443e17a96b67c55ef9f4fb3258e23ceb28d1b084f\n", - " Stored in directory: /root/.cache/pip/wheels/a2/68/5f/c339b20a41659d856c93ccdce6a33095493eb82c3964aac5a1\n", - " Building wheel for clip (setup.py) ... \u001b[?25l\u001b[?25hdone\n", - " Created wheel for clip: filename=clip-0.2.0-py3-none-any.whl size=6989 sha256=7facf9c95580429794e45eb0de901026dbba4a0594516ca3b01cfd83e5327b09\n", - " Stored in directory: /root/.cache/pip/wheels/7f/5c/e6/2c0fdb453a3569188864b17e9676bea8b3b7e160c037117869\n", - " Building wheel for fasttext (setup.py) ... \u001b[?25l\u001b[?25hdone\n", - " Created wheel for fasttext: filename=fasttext-0.9.2-cp310-cp310-linux_x86_64.whl size=4227137 sha256=75b8d49867f3a6050d83b244af20f2f1639ad368503e713e4729e98de3364ebd\n", - " Stored in directory: /root/.cache/pip/wheels/a5/13/75/f811c84a8ab36eedbaef977a6a58a98990e8e0f1967f98f394\n", - " Building wheel for kaldi-python-io (setup.py) ... \u001b[?25l\u001b[?25hdone\n", - " Created wheel for kaldi-python-io: filename=kaldi_python_io-1.2.2-py3-none-any.whl size=8949 sha256=6df72238f6e5726ae4f6b7dc885d35b8fa67f3357cf20bdbcee509505fbde502\n", - " Stored in directory: /root/.cache/pip/wheels/b7/23/5f/49d3a826be576faf61d84e8028e1914bb36a5586ee2613b087\n", - " Building wheel for nemo_toolkit (pyproject.toml) ... \u001b[?25l\u001b[?25hdone\n", - " Created wheel for nemo_toolkit: filename=nemo_toolkit-2.0.0rc1-py3-none-any.whl size=3709778 sha256=a5cfa7816f3fca80b689a63035624e111b8ba07a050aac3b5ff291bb960b4111\n", - " Stored in directory: /tmp/pip-ephem-wheel-cache-2g05a16e/wheels/c3/4e/45/ab3d29aa73df619f27b371cacf809d5330a18f794879163c1b\n", - " Building wheel for rouge-score (setup.py) ... \u001b[?25l\u001b[?25hdone\n", - " Created wheel for rouge-score: filename=rouge_score-0.1.2-py3-none-any.whl size=24933 sha256=c521082f739db0d5d39e39138000af42e91ddbd12241f940cff8952a4251c9db\n", - " Stored in directory: /root/.cache/pip/wheels/5f/dd/89/461065a73be61a532ff8599a28e9beef17985c9e9c31e541b4\n", - " Building wheel for sox (setup.py) ... \u001b[?25l\u001b[?25hdone\n", - " Created wheel for sox: filename=sox-1.5.0-py3-none-any.whl size=40038 sha256=9329074980e400e0ecbcc6ab10d6689231f16020c0e3446f8da7efe1361c26e0\n", - " Stored in directory: /root/.cache/pip/wheels/74/e7/7b/8033be3ec5e4994595d01269fc9657c8fd83a0dcbf8536666a\n", - " Building wheel for distance (setup.py) ... \u001b[?25l\u001b[?25hdone\n", - " Created wheel for distance: filename=Distance-0.1.3-py3-none-any.whl size=16258 sha256=53d619716f56f2f5fc910f70e0989c6dcf6aea446cdcbb5cef695a88bee573b7\n", - " Stored in directory: /root/.cache/pip/wheels/e8/bb/de/f71bf63559ea9a921059a5405806f7ff6ed612a9231c4a9309\n", - " Building wheel for docopt (setup.py) ... \u001b[?25l\u001b[?25hdone\n", - " Created wheel for docopt: filename=docopt-0.6.2-py2.py3-none-any.whl size=13706 sha256=d835ec4010ca08d4cf9b0c53a510801354d3f0280fb36f0321c4cf3c76c52538\n", - " Stored in directory: /root/.cache/pip/wheels/fc/ab/d4/5da2067ac95b36618c629a5f93f809425700506f72c9732fac\n", - " Building wheel for intervaltree (setup.py) ... \u001b[?25l\u001b[?25hdone\n", - " Created wheel for intervaltree: filename=intervaltree-3.1.0-py2.py3-none-any.whl size=26096 sha256=02634dad4709129d056a619dccce857203e32b217a9f26abd6492182ba2b1473\n", - " Stored in directory: /root/.cache/pip/wheels/fa/80/8c/43488a924a046b733b64de3fac99252674c892a4c3801c0a61\n", - " Building wheel for asciitree (setup.py) ... \u001b[?25l\u001b[?25hdone\n", - " Created wheel for asciitree: filename=asciitree-0.3.3-py3-none-any.whl size=5034 sha256=918a415f5aa5fedc4db5dbc458a2970531cd17c65d386b22899f84adef0531d0\n", - " Stored in directory: /root/.cache/pip/wheels/7f/4e/be/1171b40f43b918087657ec57cf3b81fa1a2e027d8755baa184\n", - " Building wheel for cdifflib (pyproject.toml) ... \u001b[?25l\u001b[?25hdone\n", - " Created wheel for cdifflib: filename=cdifflib-1.2.6-cp310-cp310-linux_x86_64.whl size=27683 sha256=a7519a005f8d300aa7824d0dcf90e32c77b2fbac755372acafba3671729c2909\n", - " Stored in directory: /root/.cache/pip/wheels/87/a7/fd/8061e24ed08689045cb6d1ca303768dc463b20a5a338174841\n", - "Successfully built causal-conv1d antlr4-python3-runtime progress clip fasttext kaldi-python-io nemo_toolkit rouge-score sox distance docopt intervaltree asciitree cdifflib\n", - "Installing collected packages: trampoline, pydub, progress, plac, pangu, opencc, ninja, ijson, docopt, distance, clip, braceexpand, asciitree, antlr4-python3-runtime, aniso8601, addict, xxhash, webdataset, trimesh, textdistance, sox, smmap, shellingham, setproctitle, sentry-sdk, ruamel.yaml.clib, rapidfuzz, pytest-runner, pypinyin, pynini, pybind11, portalocker, pathspec, parameterized, onnx, omegaconf, nvidia-nvtx-cu12, nvidia-nvjitlink-cu12, nvidia-nccl-cu12, nvidia-curand-cu12, nvidia-cufft-cu12, nvidia-cuda-runtime-cu12, nvidia-cuda-nvrtc-cu12, nvidia-cuda-cupti-cu12, nvidia-cublas-cu12, numcodecs, mypy-extensions, marshmallow, markdown2, loguru, lilcom, lightning-utilities, libcst, latexcodec, kornia-rs, kaldiio, kaldi-python-io, jmespath, jedi, isort, intervaltree, ftfy, fasteners, faiss-cpu, einops, docutils, docker-pycreds, dill, decord, cytoolz, colorama, click, cdifflib, attrdict, zarr, sacremoses, sacrebleu, ruamel.yaml, resampy, pytest-mock, pypinyin-dict, PyMCubes, pyloudnorm, pybtex, pyannote.core, nvidia-cusparse-cu12, nvidia-cudnn-cu12, multiprocess, Levenshtein, jiwer, hydra-core, gitdb, fiddle, fasttext, einops-exts, botocore, black, typer, texterrors, s3transfer, rouge-score, pybtex-docutils, nvidia-cusolver-cu12, lhotse, gitpython, flask-restful, diffusers, wandb, transformers, sphinxcontrib-bibtex, pyannote.database, g2p-en, datasets, boto3, torchsde, torchmetrics, torchdiffeq, sentence-transformers, pyannote.metrics, nerfacc, nemo_toolkit, nemo-text-processing, kornia, causal-conv1d, accelerated-scan, timm, pytorch-lightning, taming-transformers, open-clip-torch\n", - " Attempting uninstall: docutils\n", - " Found existing installation: docutils 0.18.1\n", - " Uninstalling docutils-0.18.1:\n", - " Successfully uninstalled docutils-0.18.1\n", - " Attempting uninstall: click\n", - " Found existing installation: click 8.1.7\n", - " Uninstalling click-8.1.7:\n", - " Successfully uninstalled click-8.1.7\n", - " Attempting uninstall: typer\n", - " Found existing installation: typer 0.9.4\n", - " Uninstalling typer-0.9.4:\n", - " Successfully uninstalled typer-0.9.4\n", - " Attempting uninstall: transformers\n", - " Found existing installation: transformers 4.41.0\n", - " Uninstalling transformers-4.41.0:\n", - " Successfully uninstalled transformers-4.41.0\n", - "\u001b[31mERROR: pip's dependency resolver does not currently take into account all the packages that are installed. This behaviour is the source of the following dependency conflicts.\n", - "spacy 3.7.4 requires typer<0.10.0,>=0.3.0, but you have typer 0.12.3 which is incompatible.\n", - "weasel 0.3.4 requires typer<0.10.0,>=0.3.0, but you have typer 0.12.3 which is incompatible.\u001b[0m\u001b[31m\n", - "\u001b[0mSuccessfully installed Levenshtein-0.22.0 PyMCubes-0.1.4 accelerated-scan-0.2.0 addict-2.4.0 aniso8601-9.0.1 antlr4-python3-runtime-4.9.3 asciitree-0.3.3 attrdict-2.0.1 black-24.4.2 boto3-1.34.113 botocore-1.34.113 braceexpand-0.1.7 causal-conv1d-1.2.2.post1 cdifflib-1.2.6 click-8.0.2 clip-0.2.0 colorama-0.4.6 cytoolz-0.12.3 datasets-2.19.1 decord-0.6.0 diffusers-0.28.0 dill-0.3.8 distance-0.1.3 docker-pycreds-0.4.0 docopt-0.6.2 docutils-0.17.1 einops-0.8.0 einops-exts-0.0.4 faiss-cpu-1.8.0 fasteners-0.19 fasttext-0.9.2 fiddle-0.3.0 flask-restful-0.3.10 ftfy-6.2.0 g2p-en-2.1.0 gitdb-4.0.11 gitpython-3.1.43 hydra-core-1.3.2 ijson-3.2.3 intervaltree-3.1.0 isort-5.13.2 jedi-0.19.1 jiwer-2.5.2 jmespath-1.0.1 kaldi-python-io-1.2.2 kaldiio-2.18.0 kornia-0.7.2 kornia-rs-0.1.3 latexcodec-3.0.0 lhotse-1.23.0 libcst-1.4.0 lightning-utilities-0.11.2 lilcom-1.7 loguru-0.7.2 markdown2-2.4.13 marshmallow-3.21.2 multiprocess-0.70.16 mypy-extensions-1.0.0 nemo-text-processing-1.0.2 nemo_toolkit-2.0.0rc1 nerfacc-0.5.3 ninja-1.11.1.1 numcodecs-0.12.1 nvidia-cublas-cu12-12.1.3.1 nvidia-cuda-cupti-cu12-12.1.105 nvidia-cuda-nvrtc-cu12-12.1.105 nvidia-cuda-runtime-cu12-12.1.105 nvidia-cudnn-cu12-8.9.2.26 nvidia-cufft-cu12-11.0.2.54 nvidia-curand-cu12-10.3.2.106 nvidia-cusolver-cu12-11.4.5.107 nvidia-cusparse-cu12-12.1.0.106 nvidia-nccl-cu12-2.20.5 nvidia-nvjitlink-cu12-12.5.40 nvidia-nvtx-cu12-12.1.105 omegaconf-2.3.0 onnx-1.16.1 open-clip-torch-2.24.0 opencc-1.1.6 pangu-4.0.6.1 parameterized-0.9.0 pathspec-0.12.1 plac-1.4.3 portalocker-2.8.2 progress-1.6 pyannote.core-5.0.0 pyannote.database-5.1.0 pyannote.metrics-3.2.1 pybind11-2.12.0 pybtex-0.24.0 pybtex-docutils-1.0.3 pydub-0.25.1 pyloudnorm-0.1.1 pynini-2.1.5 pypinyin-0.51.0 pypinyin-dict-0.8.0 pytest-mock-3.14.0 pytest-runner-6.0.1 pytorch-lightning-2.2.5 rapidfuzz-2.13.7 resampy-0.4.3 rouge-score-0.1.2 ruamel.yaml-0.18.6 ruamel.yaml.clib-0.2.8 s3transfer-0.10.1 sacrebleu-2.4.2 sacremoses-0.1.1 sentence-transformers-2.7.0 sentry-sdk-2.3.1 setproctitle-1.3.3 shellingham-1.5.4 smmap-5.0.1 sox-1.5.0 sphinxcontrib-bibtex-2.6.2 taming-transformers-0.0.1 textdistance-4.6.2 texterrors-0.4.4 timm-1.0.3 torchdiffeq-0.2.3 torchmetrics-1.4.0.post0 torchsde-0.2.6 trampoline-0.1.2 transformers-4.40.2 trimesh-4.4.0 typer-0.12.3 wandb-0.17.0 webdataset-0.2.86 xxhash-3.4.1 zarr-2.18.2\n" - ] - } - ], - "source": [ - "!pip install wget\n", - "!apt-get install sox libsndfile1 ffmpeg\n", - "!pip install matplotlib>=3.3.2\n", - "\n", - "!python -m pip install git+https://github.com/NVIDIA/NeMo.git@1fa961ba03ab5f8c91b278640e29807079373372#egg=nemo_toolkit[all]\n", - "!python -m pip install pyannote.audio==3.2.0" - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "metadata": { - "id": "WLLmJFoeBWt7" - }, - "outputs": [], - "source": [ - "import torch\n", - "import torchaudio\n", - "from nemo.collections.asr.models import EncDecCTCModel\n", - "from nemo.collections.asr.modules.audio_preprocessing import (\n", - " AudioToMelSpectrogramPreprocessor as NeMoAudioToMelSpectrogramPreprocessor,\n", - ")\n", - "from nemo.collections.asr.parts.preprocessing.features import (\n", - " FilterbankFeaturesTA as NeMoFilterbankFeaturesTA,\n", - ")" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "8oUuhRnadATl" - }, - "source": [ - "### Downloading config, weights and audio example" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/" - }, - "id": "OD99UH_9U8UW", - "outputId": "dd3cb10c-66cd-42f6-cbd2-8e9e738a172a" - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "--2024-05-28 07:16:36-- https://n-ws-q0bez.s3pd12.sbercloud.ru/b-ws-q0bez-jpv/GigaAM/example.wav\n", - "Resolving n-ws-q0bez.s3pd12.sbercloud.ru (n-ws-q0bez.s3pd12.sbercloud.ru)... 37.230.193.192\n", - "Connecting to n-ws-q0bez.s3pd12.sbercloud.ru (n-ws-q0bez.s3pd12.sbercloud.ru)|37.230.193.192|:443... connected.\n", - "HTTP request sent, awaiting response... 200 OK\n", - "Length: 361324 (353K) [application/octet-stream]\n", - "Saving to: ‘example.wav’\n", - "\n", - "example.wav 100%[===================>] 352.86K 646KB/s in 0.5s \n", - "\n", - "2024-05-28 07:16:38 (646 KB/s) - ‘example.wav’ saved [361324/361324]\n", - "\n" - ] - } - ], - "source": [ - "import locale\n", - "\n", - "locale.getpreferredencoding = lambda: \"UTF-8\"\n", - "\n", - "# Loading weights, config and example wav for CTC-model\n", - "!wget https://n-ws-q0bez.s3pd12.sbercloud.ru/b-ws-q0bez-jpv/GigaAM/ctc_model_weights.ckpt\n", - "!wget https://n-ws-q0bez.s3pd12.sbercloud.ru/b-ws-q0bez-jpv/GigaAM/ctc_model_config.yaml\n", - "!wget https://n-ws-q0bez.s3pd12.sbercloud.ru/b-ws-q0bez-jpv/GigaAM/example.wav\n", - "!wget https://n-ws-q0bez.s3pd12.sbercloud.ru/b-ws-q0bez-jpv/GigaAM/long_example.wav" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "7l6p192UWtLe" - }, - "source": [ - "### Adding modules for features extraction" - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "metadata": { - "id": "gzdGDuz3ZN2V" - }, - "outputs": [], - "source": [ - "class FilterbankFeaturesTA(NeMoFilterbankFeaturesTA):\n", - " def __init__(self, mel_scale: str = \"htk\", wkwargs=None, **kwargs):\n", - " if \"window_size\" in kwargs:\n", - " del kwargs[\"window_size\"]\n", - " if \"window_stride\" in kwargs:\n", - " del kwargs[\"window_stride\"]\n", - "\n", - " super().__init__(**kwargs)\n", - "\n", - " self._mel_spec_extractor: torchaudio.transforms.MelSpectrogram = (\n", - " torchaudio.transforms.MelSpectrogram(\n", - " sample_rate=self._sample_rate,\n", - " win_length=self.win_length,\n", - " hop_length=self.hop_length,\n", - " n_mels=kwargs[\"nfilt\"],\n", - " window_fn=self.torch_windows[kwargs[\"window\"]],\n", - " mel_scale=mel_scale,\n", - " norm=kwargs[\"mel_norm\"],\n", - " n_fft=kwargs[\"n_fft\"],\n", - " f_max=kwargs.get(\"highfreq\", None),\n", - " f_min=kwargs.get(\"lowfreq\", 0),\n", - " wkwargs=wkwargs,\n", - " )\n", - " )\n", - "\n", - "\n", - "class AudioToMelSpectrogramPreprocessor(NeMoAudioToMelSpectrogramPreprocessor):\n", - " def __init__(self, mel_scale: str = \"htk\", **kwargs):\n", - " super().__init__(**kwargs)\n", - " kwargs[\"nfilt\"] = kwargs[\"features\"]\n", - " del kwargs[\"features\"]\n", - " self.featurizer = (\n", - " FilterbankFeaturesTA( # Deprecated arguments; kept for config compatibility\n", - " mel_scale=mel_scale,\n", - " **kwargs,\n", - " )\n", - " )" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "pAS_1RpLWpjh" - }, - "source": [ - "### Transcribation example witch CTC-model" - ] - }, - { - "cell_type": "code", - "execution_count": 10, - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/" - }, - "id": "D5dm-IG_KvY0", - "outputId": "f04c3f8f-8ee3-43ca-8a91-bae19f9bbcf7" - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "[NeMo I 2024-05-28 20:34:54 features:305] PADDING: 0\n" - ] - } - ], - "source": [ - "device = \"cuda\" if torch.cuda.is_available() else \"cpu\"\n", - "\n", - "model = EncDecCTCModel.from_config_file(\"./ctc_model_config.yaml\")\n", - "ckpt = torch.load(\"./ctc_model_weights.ckpt\", map_location=\"cpu\")\n", - "model.load_state_dict(ckpt, strict=False)\n", - "model.eval()\n", - "model = model.to(device)" - ] - }, - { - "cell_type": "code", - "execution_count": 6, - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/" - }, - "id": "nlrRmRPvKxYq", - "outputId": "5dc3722a-3795-4e18-f12f-bbad168bd48f" - }, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "Transcribing: 100%|█████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████| 1/1 [00:00<00:00, 1.26it/s]\n" - ] - }, - { - "data": { - "text/plain": [ - "['ничьих не требуя похвал счастлив уж я надеждой сладкой что дева с трепетом любви посмотрит может быть украдкой на песни грешные мои у лукоморья дуб зеленый']" - ] - }, - "execution_count": 6, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "model.transcribe([\"example.wav\"])" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "5HoUmN9FaFKa" - }, - "source": [ - "### Long-form transcription example\n" - ] - }, - { - "cell_type": "code", - "execution_count": 7, - "metadata": {}, - "outputs": [], - "source": [ - "from io import BytesIO\n", - "from typing import List, Tuple\n", - "\n", - "import numpy as np\n", - "from pyannote.audio import Pipeline\n", - "from pydub import AudioSegment" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Function for segmentation" - ] - }, - { - "cell_type": "code", - "execution_count": 8, - "metadata": {}, - "outputs": [], - "source": [ - "def audiosegment_to_numpy(audiosegment: AudioSegment) -> np.ndarray:\n", - " \"\"\"Convert AudioSegment to numpy array.\"\"\"\n", - " samples = np.array(audiosegment.get_array_of_samples())\n", - " if audiosegment.channels == 2:\n", - " samples = samples.reshape((-1, 2))\n", - "\n", - " samples = samples.astype(np.float32, order=\"C\") / 32768.0\n", - " return samples\n", - "\n", - "\n", - "def segment_audio(\n", - " audio_path: str,\n", - " pipeline: Pipeline,\n", - " max_duration: float = 22.0,\n", - " min_duration: float = 15.0,\n", - " new_chunk_threshold: float = 0.2,\n", - ") -> Tuple[List[np.ndarray], List[List[float]]]:\n", - " # Prepare audio for pyannote vad pipeline\n", - " audio = AudioSegment.from_wav(audio_path)\n", - " audio_bytes = BytesIO()\n", - " audio.export(audio_bytes, format=\"wav\")\n", - " audio_bytes.seek(0)\n", - "\n", - " # Process audio with pipeline to obtain segments with speech activity\n", - " sad_segments = pipeline({\"uri\": \"filename\", \"audio\": audio_bytes})\n", - "\n", - " segments = []\n", - " curr_duration = 0\n", - " curr_start = 0\n", - " curr_end = 0\n", - " boundaries = []\n", - "\n", - " # Concat segments from pipeline into chunks for asr according to max/min duration\n", - " for segment in sad_segments.get_timeline().support():\n", - " start = max(0, segment.start)\n", - " end = min(len(audio) / 1000, segment.end)\n", - " if (\n", - " curr_duration > min_duration and start - curr_end > new_chunk_threshold\n", - " ) or (curr_duration + (end - curr_end) > max_duration):\n", - " audio_segment = audiosegment_to_numpy(\n", - " audio[curr_start * 1000 : curr_end * 1000]\n", - " )\n", - " segments.append(audio_segment)\n", - " boundaries.append([curr_start, curr_end])\n", - " curr_start = start\n", - "\n", - " curr_end = end\n", - " curr_duration = curr_end - curr_start\n", - "\n", - " if curr_duration != 0:\n", - " audio_segment = audiosegment_to_numpy(\n", - " audio[curr_start * 1000 : curr_end * 1000]\n", - " )\n", - " segments.append(audio_segment)\n", - " boundaries.append([curr_start, curr_end])\n", - "\n", - " return segments, boundaries" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Initializing pyannote VAD pipeline and using it for segmentation" - ] - }, - { - "cell_type": "code", - "execution_count": 11, - "metadata": {}, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "Lightning automatically upgraded your loaded checkpoint from v1.1.3 to v2.2.4. To apply the upgrade to your files permanently, run `python -m pytorch_lightning.utilities.upgrade_checkpoint ../libs_cache/pyannote_cache/models--pyannote--segmentation/snapshots/059e96f964841d40f1a5e755bb7223f76666bba4/pytorch_model.bin`\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Model was trained with pyannote.audio 0.0.1, yours is 3.2.0. Bad things might happen unless you revert pyannote.audio to 0.x.\n", - "Model was trained with torch 1.7.1, yours is 2.3.0+cu121. Bad things might happen unless you revert torch to 1.x.\n" - ] - } - ], - "source": [ - "HF_TOKEN = \"\"\n", - "\n", - "# Initialize pyannote pipeline\n", - "pipeline = Pipeline.from_pretrained(\n", - " \"pyannote/voice-activity-detection\", use_auth_token=HF_TOKEN\n", - ")\n", - "pipeline = pipeline.to(torch.device(device))\n", - "\n", - "# Segment audio\n", - "segments, boundaries = segment_audio(\"./long_example.wav\", pipeline)" - ] - }, - { - "cell_type": "code", - "execution_count": 15, - "metadata": {}, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "Transcribing: 100%|█████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████| 1/1 [00:00<00:00, 3.23it/s]\n" - ] - } - ], - "source": [ - "# Transcribing segments\n", - "BATCH_SIZE = 10\n", - "transcriptions = model.transcribe(segments, batch_size=BATCH_SIZE)" - ] - }, - { - "cell_type": "code", - "execution_count": 16, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "[00:00:00 - 00:16:83]: вечерня отошла давно но в кельях тихо и темно уже и сам эгумин строгий свои молитвы прекратил и кости ветхие склонил перекрестясь на одр убогий кругом и сон и тишина но церкви дверь отворена\n", - "\n", - "[00:17:10 - 00:32:61]: трепещет луч лампады и тускло озаряет он и темную живопись икон и возлощенные оклады и раздается в тишине то тяжкий вздох то шепот важный и мрачно дремлет в вашине старинный свод\n", - "\n", - "[00:32:95 - 00:49:33]: глухой и влажный стоят за клиросом чернец и грешник неподвижны оба и шепот их как глаз из гроба и грешник бледен как мертвец монах несчастный полно перестань\n", - "\n", - "[00:49:82 - 01:05:74]: ужасна исповедь злодея заплачена тобою дань тому кто в злобе пламенее лукаво грешника блюдет и к вечной гибели ведет смирись опомнись время время раскаянья покров\n", - "\n", - "[01:05:97 - 01:10:90]: я разрешу тебя грехов сложи мучительное бремя\n", - "\n" - ] - } - ], - "source": [ - "def format_time(seconds):\n", - " hours = int(seconds // 3600)\n", - " minutes = int((seconds % 3600) // 60)\n", - " seconds = seconds % 60\n", - " full_seconds = int(seconds)\n", - " milliseconds = int((seconds - full_seconds) * 100)\n", - "\n", - " if hours > 0:\n", - " return f\"{hours:02}:{minutes:02}:{full_seconds:02}:{milliseconds:02}\"\n", - " else:\n", - " return f\"{minutes:02}:{full_seconds:02}:{milliseconds:02}\"\n", - "\n", - "\n", - "for transcription, boundary in zip(transcriptions, boundaries):\n", - " boundary_0 = format_time(boundary[0])\n", - " boundary_1 = format_time(boundary[1])\n", - " print(f\"[{boundary_0} - {boundary_1}]: {transcription}\\n\")" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [] - } - ], - "metadata": { - "accelerator": "GPU", - "colab": { - "gpuType": "T4", - "provenance": [] - }, - "kernelspec": { - "display_name": "Python 3 (ipykernel)", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.10.12" - } - }, - "nbformat": 4, - "nbformat_minor": 1 -} diff --git a/examples/notebooks/GigaAM_Emo_Model_Usage_Example.ipynb b/examples/notebooks/GigaAM_Emo_Model_Usage_Example.ipynb deleted file mode 100644 index 271de74..0000000 --- a/examples/notebooks/GigaAM_Emo_Model_Usage_Example.ipynb +++ /dev/null @@ -1,955 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": { - "id": "oREzT-effoFr" - }, - "source": [ - "### Installing and importing dependencies" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/" - }, - "id": "yxU1SOPfWxab", - "outputId": "e9b2c73a-d3d4-4ba9-8ce1-3527c95c4d3f" - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Collecting wget\n", - " Downloading wget-3.2.zip (10 kB)\n", - " Preparing metadata (setup.py) ... \u001b[?25l\u001b[?25hdone\n", - "Building wheels for collected packages: wget\n", - " Building wheel for wget (setup.py) ... \u001b[?25l\u001b[?25hdone\n", - " Created wheel for wget: filename=wget-3.2-py3-none-any.whl size=9656 sha256=2e82f0e3a185ee764cf0a1eef86b3f525139a342d3630e878d05860de80d6dee\n", - " Stored in directory: /root/.cache/pip/wheels/8b/f1/7f/5c94f0a7a505ca1c81cd1d9208ae2064675d97582078e6c769\n", - "Successfully built wget\n", - "Installing collected packages: wget\n", - "Successfully installed wget-3.2\n", - "Reading package lists... Done\n", - "Building dependency tree... Done\n", - "Reading state information... Done\n", - "libsndfile1 is already the newest version (1.0.31-2ubuntu0.1).\n", - "ffmpeg is already the newest version (7:4.4.2-0ubuntu0.22.04.1).\n", - "The following additional packages will be installed:\n", - " libopencore-amrnb0 libopencore-amrwb0 libsox-fmt-alsa libsox-fmt-base libsox3 libwavpack1\n", - "Suggested packages:\n", - " libsox-fmt-all\n", - "The following NEW packages will be installed:\n", - " libopencore-amrnb0 libopencore-amrwb0 libsox-fmt-alsa libsox-fmt-base libsox3 libwavpack1 sox\n", - "0 upgraded, 7 newly installed, 0 to remove and 45 not upgraded.\n", - "Need to get 617 kB of archives.\n", - "After this operation, 1,764 kB of additional disk space will be used.\n", - "Get:1 http://archive.ubuntu.com/ubuntu jammy/universe amd64 libopencore-amrnb0 amd64 0.1.5-1 [94.8 kB]\n", - "Get:2 http://archive.ubuntu.com/ubuntu jammy/universe amd64 libopencore-amrwb0 amd64 0.1.5-1 [49.1 kB]\n", - "Get:3 http://archive.ubuntu.com/ubuntu jammy-updates/universe amd64 libsox3 amd64 14.4.2+git20190427-2+deb11u2ubuntu0.22.04.1 [240 kB]\n", - "Get:4 http://archive.ubuntu.com/ubuntu jammy-updates/universe amd64 libsox-fmt-alsa amd64 14.4.2+git20190427-2+deb11u2ubuntu0.22.04.1 [11.2 kB]\n", - "Get:5 http://archive.ubuntu.com/ubuntu jammy/main amd64 libwavpack1 amd64 5.4.0-1build2 [83.7 kB]\n", - "Get:6 http://archive.ubuntu.com/ubuntu jammy-updates/universe amd64 libsox-fmt-base amd64 14.4.2+git20190427-2+deb11u2ubuntu0.22.04.1 [33.7 kB]\n", - "Get:7 http://archive.ubuntu.com/ubuntu jammy-updates/universe amd64 sox amd64 14.4.2+git20190427-2+deb11u2ubuntu0.22.04.1 [104 kB]\n", - "Fetched 617 kB in 0s (2,444 kB/s)\n", - "Selecting previously unselected package libopencore-amrnb0:amd64.\n", - "(Reading database ... 121918 files and directories currently installed.)\n", - "Preparing to unpack .../0-libopencore-amrnb0_0.1.5-1_amd64.deb ...\n", - "Unpacking libopencore-amrnb0:amd64 (0.1.5-1) ...\n", - "Selecting previously unselected package libopencore-amrwb0:amd64.\n", - "Preparing to unpack .../1-libopencore-amrwb0_0.1.5-1_amd64.deb ...\n", - "Unpacking libopencore-amrwb0:amd64 (0.1.5-1) ...\n", - "Selecting previously unselected package libsox3:amd64.\n", - "Preparing to unpack .../2-libsox3_14.4.2+git20190427-2+deb11u2ubuntu0.22.04.1_amd64.deb ...\n", - "Unpacking libsox3:amd64 (14.4.2+git20190427-2+deb11u2ubuntu0.22.04.1) ...\n", - "Selecting previously unselected package libsox-fmt-alsa:amd64.\n", - "Preparing to unpack .../3-libsox-fmt-alsa_14.4.2+git20190427-2+deb11u2ubuntu0.22.04.1_amd64.deb ...\n", - "Unpacking libsox-fmt-alsa:amd64 (14.4.2+git20190427-2+deb11u2ubuntu0.22.04.1) ...\n", - "Selecting previously unselected package libwavpack1:amd64.\n", - "Preparing to unpack .../4-libwavpack1_5.4.0-1build2_amd64.deb ...\n", - "Unpacking libwavpack1:amd64 (5.4.0-1build2) ...\n", - "Selecting previously unselected package libsox-fmt-base:amd64.\n", - "Preparing to unpack .../5-libsox-fmt-base_14.4.2+git20190427-2+deb11u2ubuntu0.22.04.1_amd64.deb ...\n", - "Unpacking libsox-fmt-base:amd64 (14.4.2+git20190427-2+deb11u2ubuntu0.22.04.1) ...\n", - "Selecting previously unselected package sox.\n", - "Preparing to unpack .../6-sox_14.4.2+git20190427-2+deb11u2ubuntu0.22.04.1_amd64.deb ...\n", - "Unpacking sox (14.4.2+git20190427-2+deb11u2ubuntu0.22.04.1) ...\n", - "Setting up libsox3:amd64 (14.4.2+git20190427-2+deb11u2ubuntu0.22.04.1) ...\n", - "Setting up libopencore-amrwb0:amd64 (0.1.5-1) ...\n", - "Setting up libsox-fmt-alsa:amd64 (14.4.2+git20190427-2+deb11u2ubuntu0.22.04.1) ...\n", - "Setting up libwavpack1:amd64 (5.4.0-1build2) ...\n", - "Setting up libopencore-amrnb0:amd64 (0.1.5-1) ...\n", - "Setting up libsox-fmt-base:amd64 (14.4.2+git20190427-2+deb11u2ubuntu0.22.04.1) ...\n", - "Setting up sox (14.4.2+git20190427-2+deb11u2ubuntu0.22.04.1) ...\n", - "Processing triggers for man-db (2.10.2-1) ...\n", - "Processing triggers for libc-bin (2.35-0ubuntu3.4) ...\n", - "/sbin/ldconfig.real: /usr/local/lib/libtbb.so.12 is not a symbolic link\n", - "\n", - "/sbin/ldconfig.real: /usr/local/lib/libtbbmalloc_proxy.so.2 is not a symbolic link\n", - "\n", - "/sbin/ldconfig.real: /usr/local/lib/libtbbbind_2_5.so.3 is not a symbolic link\n", - "\n", - "/sbin/ldconfig.real: /usr/local/lib/libtbbbind_2_0.so.3 is not a symbolic link\n", - "\n", - "/sbin/ldconfig.real: /usr/local/lib/libtbbbind.so.3 is not a symbolic link\n", - "\n", - "/sbin/ldconfig.real: /usr/local/lib/libtbbmalloc.so.2 is not a symbolic link\n", - "\n", - "\u001b[33mDEPRECATION: git+https://github.com/NVIDIA/NeMo.git#egg=nemo_toolkit[all] contains an egg fragment with a non-PEP 508 name pip 25.0 will enforce this behaviour change. A possible replacement is to use the req @ url syntax, and remove the egg fragment. Discussion can be found at https://github.com/pypa/pip/issues/11617\u001b[0m\u001b[33m\n", - "\u001b[0mCollecting nemo_toolkit[all]\n", - " Cloning https://github.com/NVIDIA/NeMo.git to /tmp/pip-install-unbwo6dj/nemo-toolkit_de6e0e6e28ce411cafb3187496bb4905\n", - " Running command git clone --filter=blob:none --quiet https://github.com/NVIDIA/NeMo.git /tmp/pip-install-unbwo6dj/nemo-toolkit_de6e0e6e28ce411cafb3187496bb4905\n", - " Resolved https://github.com/NVIDIA/NeMo.git to commit 1fa961ba03ab5f8c91b278640e29807079373372\n", - " Installing build dependencies ... \u001b[?25l\u001b[?25hdone\n", - " Getting requirements to build wheel ... \u001b[?25l\u001b[?25hdone\n", - " Preparing metadata (pyproject.toml) ... \u001b[?25l\u001b[?25hdone\n", - "Collecting fiddle (from nemo_toolkit[all])\n", - " Downloading fiddle-0.3.0-py3-none-any.whl (419 kB)\n", - "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m419.8/419.8 kB\u001b[0m \u001b[31m4.9 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", - "\u001b[?25hRequirement already satisfied: huggingface-hub>=0.20.3 in /usr/local/lib/python3.10/dist-packages (from nemo_toolkit[all]) (0.23.1)\n", - "Requirement already satisfied: numba in /usr/local/lib/python3.10/dist-packages (from nemo_toolkit[all]) (0.58.1)\n", - "Requirement already satisfied: numpy>=1.22 in /usr/local/lib/python3.10/dist-packages (from nemo_toolkit[all]) (1.25.2)\n", - "Collecting onnx>=1.7.0 (from nemo_toolkit[all])\n", - " Downloading onnx-1.16.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (15.9 MB)\n", - "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m15.9/15.9 MB\u001b[0m \u001b[31m34.2 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", - "\u001b[?25hRequirement already satisfied: python-dateutil in /usr/local/lib/python3.10/dist-packages (from nemo_toolkit[all]) (2.8.2)\n", - "Collecting ruamel.yaml (from nemo_toolkit[all])\n", - " Downloading ruamel.yaml-0.18.6-py3-none-any.whl (117 kB)\n", - "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m117.8/117.8 kB\u001b[0m \u001b[31m14.7 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", - "\u001b[?25hRequirement already satisfied: scikit-learn in /usr/local/lib/python3.10/dist-packages (from nemo_toolkit[all]) (1.2.2)\n", - "Requirement already satisfied: setuptools>=65.5.1 in /usr/local/lib/python3.10/dist-packages (from nemo_toolkit[all]) (67.7.2)\n", - "Requirement already satisfied: tensorboard in /usr/local/lib/python3.10/dist-packages (from nemo_toolkit[all]) (2.15.2)\n", - "Requirement already satisfied: text-unidecode in /usr/local/lib/python3.10/dist-packages (from nemo_toolkit[all]) (1.3)\n", - "Requirement already satisfied: torch in /usr/local/lib/python3.10/dist-packages (from nemo_toolkit[all]) (2.3.0+cu121)\n", - "Requirement already satisfied: tqdm>=4.41.0 in /usr/local/lib/python3.10/dist-packages (from nemo_toolkit[all]) (4.66.4)\n", - "Requirement already satisfied: wget in /usr/local/lib/python3.10/dist-packages (from nemo_toolkit[all]) (3.2)\n", - "Requirement already satisfied: wrapt in /usr/local/lib/python3.10/dist-packages (from nemo_toolkit[all]) (1.14.1)\n", - "Collecting black~=24.3 (from nemo_toolkit[all])\n", - " Downloading black-24.4.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (1.8 MB)\n", - "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m1.8/1.8 MB\u001b[0m \u001b[31m53.1 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", - "\u001b[?25hCollecting click==8.0.2 (from nemo_toolkit[all])\n", - " Downloading click-8.0.2-py3-none-any.whl (97 kB)\n", - "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m97.6/97.6 kB\u001b[0m \u001b[31m11.0 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", - "\u001b[?25hCollecting isort<6.0.0,>5.1.0 (from nemo_toolkit[all])\n", - " Downloading isort-5.13.2-py3-none-any.whl (92 kB)\n", - "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m92.3/92.3 kB\u001b[0m \u001b[31m10.9 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", - "\u001b[?25hCollecting parameterized (from nemo_toolkit[all])\n", - " Downloading parameterized-0.9.0-py2.py3-none-any.whl (20 kB)\n", - "Requirement already satisfied: pytest in /usr/local/lib/python3.10/dist-packages (from nemo_toolkit[all]) (7.4.4)\n", - "Collecting pytest-mock (from nemo_toolkit[all])\n", - " Downloading pytest_mock-3.14.0-py3-none-any.whl (9.9 kB)\n", - "Collecting pytest-runner (from nemo_toolkit[all])\n", - " Downloading pytest_runner-6.0.1-py3-none-any.whl (7.2 kB)\n", - "Requirement already satisfied: sphinx in /usr/local/lib/python3.10/dist-packages (from nemo_toolkit[all]) (5.0.2)\n", - "Collecting sphinxcontrib-bibtex (from nemo_toolkit[all])\n", - " Downloading sphinxcontrib_bibtex-2.6.2-py3-none-any.whl (40 kB)\n", - "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m41.0/41.0 kB\u001b[0m \u001b[31m4.6 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", - "\u001b[?25hCollecting wandb (from nemo_toolkit[all])\n", - " Downloading wandb-0.17.0-py3-none-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl (6.7 MB)\n", - "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m6.7/6.7 MB\u001b[0m \u001b[31m59.8 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", - "\u001b[?25hRequirement already satisfied: cloudpickle in /usr/local/lib/python3.10/dist-packages (from nemo_toolkit[all]) (2.2.1)\n", - "Collecting hydra-core<=1.3.2,>1.3 (from nemo_toolkit[all])\n", - " Downloading hydra_core-1.3.2-py3-none-any.whl (154 kB)\n", - "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m154.5/154.5 kB\u001b[0m \u001b[31m19.4 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", - "\u001b[?25hCollecting omegaconf<=2.3 (from nemo_toolkit[all])\n", - " Downloading omegaconf-2.3.0-py3-none-any.whl (79 kB)\n", - "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m79.5/79.5 kB\u001b[0m \u001b[31m10.5 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", - "\u001b[?25hCollecting pytorch-lightning>=2.2.1 (from nemo_toolkit[all])\n", - " Downloading pytorch_lightning-2.2.5-py3-none-any.whl (802 kB)\n", - "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m802.3/802.3 kB\u001b[0m \u001b[31m45.3 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", - "\u001b[?25hCollecting torchmetrics>=0.11.0 (from nemo_toolkit[all])\n", - " Downloading torchmetrics-1.4.0.post0-py3-none-any.whl (868 kB)\n", - "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m868.8/868.8 kB\u001b[0m \u001b[31m58.9 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", - "\u001b[?25hCollecting transformers<=4.40.2,>=4.36.0 (from nemo_toolkit[all])\n", - " Downloading transformers-4.40.2-py3-none-any.whl (9.0 MB)\n", - "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m9.0/9.0 MB\u001b[0m \u001b[31m76.1 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", - "\u001b[?25hCollecting webdataset>=0.2.86 (from nemo_toolkit[all])\n", - " Downloading webdataset-0.2.86-py3-none-any.whl (70 kB)\n", - "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m70.4/70.4 kB\u001b[0m \u001b[31m8.7 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", - "\u001b[?25hCollecting datasets (from nemo_toolkit[all])\n", - " Downloading datasets-2.19.1-py3-none-any.whl (542 kB)\n", - "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m542.0/542.0 kB\u001b[0m \u001b[31m46.1 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", - "\u001b[?25hRequirement already satisfied: inflect in /usr/local/lib/python3.10/dist-packages (from nemo_toolkit[all]) (7.0.0)\n", - "Requirement already satisfied: pandas in /usr/local/lib/python3.10/dist-packages (from nemo_toolkit[all]) (2.0.3)\n", - "Collecting sacremoses>=0.0.43 (from nemo_toolkit[all])\n", - " Downloading sacremoses-0.1.1-py3-none-any.whl (897 kB)\n", - "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m897.5/897.5 kB\u001b[0m \u001b[31m58.8 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", - "\u001b[?25hRequirement already satisfied: sentencepiece<1.0.0 in /usr/local/lib/python3.10/dist-packages (from nemo_toolkit[all]) (0.1.99)\n", - "Collecting braceexpand (from nemo_toolkit[all])\n", - " Downloading braceexpand-0.1.7-py2.py3-none-any.whl (5.9 kB)\n", - "Requirement already satisfied: editdistance in /usr/local/lib/python3.10/dist-packages (from nemo_toolkit[all]) (0.6.2)\n", - "Collecting einops (from nemo_toolkit[all])\n", - " Downloading einops-0.8.0-py3-none-any.whl (43 kB)\n", - "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m43.2/43.2 kB\u001b[0m \u001b[31m5.6 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", - "\u001b[?25hCollecting g2p-en (from nemo_toolkit[all])\n", - " Downloading g2p_en-2.1.0-py3-none-any.whl (3.1 MB)\n", - "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m3.1/3.1 MB\u001b[0m \u001b[31m78.2 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", - "\u001b[?25hRequirement already satisfied: ipywidgets in /usr/local/lib/python3.10/dist-packages (from nemo_toolkit[all]) (7.7.1)\n", - "Collecting jiwer (from nemo_toolkit[all])\n", - " Downloading jiwer-3.0.4-py3-none-any.whl (21 kB)\n", - "Collecting kaldi-python-io (from nemo_toolkit[all])\n", - " Downloading kaldi-python-io-1.2.2.tar.gz (8.8 kB)\n", - " Preparing metadata (setup.py) ... \u001b[?25l\u001b[?25hdone\n", - "Collecting kaldiio (from nemo_toolkit[all])\n", - " Downloading kaldiio-2.18.0-py3-none-any.whl (28 kB)\n", - "Collecting lhotse>=1.22.0 (from nemo_toolkit[all])\n", - " Downloading lhotse-1.23.0-py3-none-any.whl (772 kB)\n", - "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m772.4/772.4 kB\u001b[0m \u001b[31m46.7 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", - "\u001b[?25hRequirement already satisfied: librosa>=0.10.0 in /usr/local/lib/python3.10/dist-packages (from nemo_toolkit[all]) (0.10.2.post1)\n", - "Collecting marshmallow (from nemo_toolkit[all])\n", - " Downloading marshmallow-3.21.2-py3-none-any.whl (49 kB)\n", - "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m49.3/49.3 kB\u001b[0m \u001b[31m7.1 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", - "\u001b[?25hRequirement already satisfied: matplotlib in /usr/local/lib/python3.10/dist-packages (from nemo_toolkit[all]) (3.7.1)\n", - "Requirement already satisfied: packaging in /usr/local/lib/python3.10/dist-packages (from nemo_toolkit[all]) (24.0)\n", - "Collecting pyannote.core (from nemo_toolkit[all])\n", - " Downloading pyannote.core-5.0.0-py3-none-any.whl (58 kB)\n", - "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m58.5/58.5 kB\u001b[0m \u001b[31m8.0 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", - "\u001b[?25hCollecting pyannote.metrics (from nemo_toolkit[all])\n", - " Downloading pyannote.metrics-3.2.1-py3-none-any.whl (51 kB)\n", - "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m51.4/51.4 kB\u001b[0m \u001b[31m6.6 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", - "\u001b[?25hCollecting pydub (from nemo_toolkit[all])\n", - " Downloading pydub-0.25.1-py2.py3-none-any.whl (32 kB)\n", - "Collecting pyloudnorm (from nemo_toolkit[all])\n", - " Downloading pyloudnorm-0.1.1-py3-none-any.whl (9.6 kB)\n", - "Collecting resampy (from nemo_toolkit[all])\n", - " Downloading resampy-0.4.3-py3-none-any.whl (3.1 MB)\n", - "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m3.1/3.1 MB\u001b[0m \u001b[31m82.9 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", - "\u001b[?25hRequirement already satisfied: scipy>=0.14 in /usr/local/lib/python3.10/dist-packages (from nemo_toolkit[all]) (1.11.4)\n", - "Requirement already satisfied: soundfile in /usr/local/lib/python3.10/dist-packages (from nemo_toolkit[all]) (0.12.1)\n", - "Collecting sox (from nemo_toolkit[all])\n", - " Downloading sox-1.5.0.tar.gz (63 kB)\n", - "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m63.9/63.9 kB\u001b[0m \u001b[31m8.7 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", - "\u001b[?25h Preparing metadata (setup.py) ... \u001b[?25l\u001b[?25hdone\n", - "Collecting texterrors (from nemo_toolkit[all])\n", - " Downloading texterrors-0.4.4-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (1.1 MB)\n", - "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m1.1/1.1 MB\u001b[0m \u001b[31m64.3 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", - "\u001b[?25hCollecting accelerated-scan (from nemo_toolkit[all])\n", - " Downloading accelerated_scan-0.2.0-py3-none-any.whl (11 kB)\n", - "Collecting boto3 (from nemo_toolkit[all])\n", - " Downloading boto3-1.34.113-py3-none-any.whl (139 kB)\n", - "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m139.3/139.3 kB\u001b[0m \u001b[31m16.3 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", - "\u001b[?25hCollecting causal-conv1d>=1.2.0 (from nemo_toolkit[all])\n", - " Downloading causal_conv1d-1.2.2.post1.tar.gz (7.2 kB)\n", - " Preparing metadata (setup.py) ... \u001b[?25l\u001b[?25hdone\n", - "Collecting faiss-cpu (from nemo_toolkit[all])\n", - " Downloading faiss_cpu-1.8.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (27.0 MB)\n", - "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m27.0/27.0 MB\u001b[0m \u001b[31m45.7 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", - "\u001b[?25hCollecting fasttext (from nemo_toolkit[all])\n", - " Downloading fasttext-0.9.2.tar.gz (68 kB)\n", - "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m68.8/68.8 kB\u001b[0m \u001b[31m7.0 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", - "\u001b[?25h Preparing metadata (setup.py) ... \u001b[?25l\u001b[?25hdone\n", - "Collecting flask-restful (from nemo_toolkit[all])\n", - " Downloading Flask_RESTful-0.3.10-py2.py3-none-any.whl (26 kB)\n", - "Collecting ftfy (from nemo_toolkit[all])\n", - " Downloading ftfy-6.2.0-py3-none-any.whl (54 kB)\n", - "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m54.4/54.4 kB\u001b[0m \u001b[31m6.4 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", - "\u001b[?25hRequirement already satisfied: gdown in /usr/local/lib/python3.10/dist-packages (from nemo_toolkit[all]) (5.1.0)\n", - "Requirement already satisfied: h5py in /usr/local/lib/python3.10/dist-packages (from nemo_toolkit[all]) (3.9.0)\n", - "Collecting ijson (from nemo_toolkit[all])\n", - " Downloading ijson-3.2.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (111 kB)\n", - "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m111.8/111.8 kB\u001b[0m \u001b[31m13.9 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", - "\u001b[?25hRequirement already satisfied: jieba in /usr/local/lib/python3.10/dist-packages (from nemo_toolkit[all]) (0.42.1)\n", - "Collecting markdown2 (from nemo_toolkit[all])\n", - " Downloading markdown2-2.4.13-py2.py3-none-any.whl (41 kB)\n", - "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m41.3/41.3 kB\u001b[0m \u001b[31m5.1 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", - "\u001b[?25hRequirement already satisfied: nltk>=3.6.5 in /usr/local/lib/python3.10/dist-packages (from nemo_toolkit[all]) (3.8.1)\n", - "Collecting opencc<1.1.7 (from nemo_toolkit[all])\n", - " Downloading OpenCC-1.1.6-cp310-cp310-manylinux1_x86_64.whl (778 kB)\n", - "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m778.3/778.3 kB\u001b[0m \u001b[31m54.8 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", - "\u001b[?25hCollecting pangu (from nemo_toolkit[all])\n", - " Downloading pangu-4.0.6.1-py3-none-any.whl (6.4 kB)\n", - "Collecting rapidfuzz (from nemo_toolkit[all])\n", - " Downloading rapidfuzz-3.9.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (3.4 MB)\n", - "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m3.4/3.4 MB\u001b[0m \u001b[31m83.5 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", - "\u001b[?25hCollecting rouge-score (from nemo_toolkit[all])\n", - " Downloading rouge_score-0.1.2.tar.gz (17 kB)\n", - " Preparing metadata (setup.py) ... \u001b[?25l\u001b[?25hdone\n", - "Collecting sacrebleu (from nemo_toolkit[all])\n", - " Downloading sacrebleu-2.4.2-py3-none-any.whl (106 kB)\n", - "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m106.7/106.7 kB\u001b[0m \u001b[31m11.5 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", - "\u001b[?25hCollecting sentence-transformers (from nemo_toolkit[all])\n", - " Downloading sentence_transformers-2.7.0-py3-none-any.whl (171 kB)\n", - "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m171.5/171.5 kB\u001b[0m \u001b[31m16.4 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", - "\u001b[?25hRequirement already satisfied: tensorstore<0.1.46 in /usr/local/lib/python3.10/dist-packages (from nemo_toolkit[all]) (0.1.45)\n", - "Collecting zarr (from nemo_toolkit[all])\n", - " Downloading zarr-2.18.2-py3-none-any.whl (210 kB)\n", - "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m210.2/210.2 kB\u001b[0m \u001b[31m22.4 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", - "\u001b[?25hCollecting attrdict (from nemo_toolkit[all])\n", - " Downloading attrdict-2.0.1-py2.py3-none-any.whl (9.9 kB)\n", - "Collecting kornia (from nemo_toolkit[all])\n", - " Downloading kornia-0.7.2-py2.py3-none-any.whl (825 kB)\n", - "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m825.4/825.4 kB\u001b[0m \u001b[31m57.7 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", - "\u001b[?25hCollecting pypinyin (from nemo_toolkit[all])\n", - " Downloading pypinyin-0.51.0-py2.py3-none-any.whl (1.4 MB)\n", - "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m1.4/1.4 MB\u001b[0m \u001b[31m61.9 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", - "\u001b[?25hCollecting pypinyin-dict (from nemo_toolkit[all])\n", - " Downloading pypinyin_dict-0.8.0-py2.py3-none-any.whl (9.5 MB)\n", - "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m9.5/9.5 MB\u001b[0m \u001b[31m88.8 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", - "\u001b[?25hCollecting progress>=1.5 (from nemo_toolkit[all])\n", - " Downloading progress-1.6.tar.gz (7.8 kB)\n", - " Preparing metadata (setup.py) ... \u001b[?25l\u001b[?25hdone\n", - "Requirement already satisfied: tabulate>=0.8.7 in /usr/local/lib/python3.10/dist-packages (from nemo_toolkit[all]) (0.9.0)\n", - "Collecting textdistance>=4.1.5 (from nemo_toolkit[all])\n", - " Downloading textdistance-4.6.2-py3-none-any.whl (31 kB)\n", - "Collecting addict (from nemo_toolkit[all])\n", - " Downloading addict-2.4.0-py3-none-any.whl (3.8 kB)\n", - "Collecting clip (from nemo_toolkit[all])\n", - " Downloading clip-0.2.0.tar.gz (5.5 kB)\n", - " Preparing metadata (setup.py) ... \u001b[?25l\u001b[?25hdone\n", - "Collecting decord (from nemo_toolkit[all])\n", - " Downloading decord-0.6.0-py3-none-manylinux2010_x86_64.whl (13.6 MB)\n", - "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m13.6/13.6 MB\u001b[0m \u001b[31m74.6 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", - "\u001b[?25hCollecting diffusers>=0.19.3 (from nemo_toolkit[all])\n", - " Downloading diffusers-0.28.0-py3-none-any.whl (2.2 MB)\n", - "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m2.2/2.2 MB\u001b[0m \u001b[31m77.2 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", - "\u001b[?25hCollecting einops-exts (from nemo_toolkit[all])\n", - " Downloading einops_exts-0.0.4-py3-none-any.whl (3.9 kB)\n", - "Requirement already satisfied: imageio in /usr/local/lib/python3.10/dist-packages (from nemo_toolkit[all]) (2.31.6)\n", - "Collecting nerfacc>=0.5.3 (from nemo_toolkit[all])\n", - " Downloading nerfacc-0.5.3-py3-none-any.whl (54 kB)\n", - "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m54.6/54.6 kB\u001b[0m \u001b[31m5.3 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", - "\u001b[?25hCollecting open-clip-torch (from nemo_toolkit[all])\n", - " Downloading open_clip_torch-2.24.0-py3-none-any.whl (1.5 MB)\n", - "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m1.5/1.5 MB\u001b[0m \u001b[31m74.5 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", - "\u001b[?25hCollecting PyMCubes (from nemo_toolkit[all])\n", - " Downloading PyMCubes-0.1.4-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (274 kB)\n", - "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m274.3/274.3 kB\u001b[0m \u001b[31m27.8 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", - "\u001b[?25hCollecting taming-transformers (from nemo_toolkit[all])\n", - " Downloading taming_transformers-0.0.1-py3-none-any.whl (45 kB)\n", - "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m45.6/45.6 kB\u001b[0m \u001b[31m5.7 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", - "\u001b[?25hCollecting torchdiffeq (from nemo_toolkit[all])\n", - " Downloading torchdiffeq-0.2.3-py3-none-any.whl (31 kB)\n", - "Collecting torchsde (from nemo_toolkit[all])\n", - " Downloading torchsde-0.2.6-py3-none-any.whl (61 kB)\n", - "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m61.2/61.2 kB\u001b[0m \u001b[31m7.6 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", - "\u001b[?25hCollecting trimesh (from nemo_toolkit[all])\n", - " Downloading trimesh-4.4.0-py3-none-any.whl (694 kB)\n", - "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m694.6/694.6 kB\u001b[0m \u001b[31m52.3 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", - "\u001b[?25hCollecting nemo-text-processing (from nemo_toolkit[all])\n", - " Downloading nemo_text_processing-1.0.2-py3-none-any.whl (2.6 MB)\n", - "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m2.6/2.6 MB\u001b[0m \u001b[31m79.6 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", - "\u001b[?25hCollecting mypy-extensions>=0.4.3 (from black~=24.3->nemo_toolkit[all])\n", - " Downloading mypy_extensions-1.0.0-py3-none-any.whl (4.7 kB)\n", - "Collecting pathspec>=0.9.0 (from black~=24.3->nemo_toolkit[all])\n", - " Downloading pathspec-0.12.1-py3-none-any.whl (31 kB)\n", - "Requirement already satisfied: platformdirs>=2 in /usr/local/lib/python3.10/dist-packages (from black~=24.3->nemo_toolkit[all]) (4.2.2)\n", - "Requirement already satisfied: tomli>=1.1.0 in /usr/local/lib/python3.10/dist-packages (from black~=24.3->nemo_toolkit[all]) (2.0.1)\n", - "Requirement already satisfied: typing-extensions>=4.0.1 in /usr/local/lib/python3.10/dist-packages (from black~=24.3->nemo_toolkit[all]) (4.11.0)\n", - "Collecting ninja (from causal-conv1d>=1.2.0->nemo_toolkit[all])\n", - " Downloading ninja-1.11.1.1-py2.py3-none-manylinux1_x86_64.manylinux_2_5_x86_64.whl (307 kB)\n", - "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m307.2/307.2 kB\u001b[0m \u001b[31m7.3 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", - "\u001b[?25hRequirement already satisfied: importlib-metadata in /usr/local/lib/python3.10/dist-packages (from diffusers>=0.19.3->nemo_toolkit[all]) (7.1.0)\n", - "Requirement already satisfied: filelock in /usr/local/lib/python3.10/dist-packages (from diffusers>=0.19.3->nemo_toolkit[all]) (3.14.0)\n", - "Requirement already satisfied: regex!=2019.12.17 in /usr/local/lib/python3.10/dist-packages (from diffusers>=0.19.3->nemo_toolkit[all]) (2023.12.25)\n", - "Requirement already satisfied: requests in /usr/local/lib/python3.10/dist-packages (from diffusers>=0.19.3->nemo_toolkit[all]) (2.31.0)\n", - "Requirement already satisfied: safetensors>=0.3.1 in /usr/local/lib/python3.10/dist-packages (from diffusers>=0.19.3->nemo_toolkit[all]) (0.4.3)\n", - "Requirement already satisfied: Pillow in /usr/local/lib/python3.10/dist-packages (from diffusers>=0.19.3->nemo_toolkit[all]) (9.4.0)\n", - "Requirement already satisfied: fsspec>=2023.5.0 in /usr/local/lib/python3.10/dist-packages (from huggingface-hub>=0.20.3->nemo_toolkit[all]) (2023.6.0)\n", - "Requirement already satisfied: pyyaml>=5.1 in /usr/local/lib/python3.10/dist-packages (from huggingface-hub>=0.20.3->nemo_toolkit[all]) (6.0.1)\n", - "Collecting antlr4-python3-runtime==4.9.* (from hydra-core<=1.3.2,>1.3->nemo_toolkit[all])\n", - " Downloading antlr4-python3-runtime-4.9.3.tar.gz (117 kB)\n", - "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m117.0/117.0 kB\u001b[0m \u001b[31m13.4 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", - "\u001b[?25h Preparing metadata (setup.py) ... \u001b[?25l\u001b[?25hdone\n", - "INFO: pip is looking at multiple versions of jiwer to determine which version is compatible with other requirements. This could take a while.\n", - "Collecting jiwer (from nemo_toolkit[all])\n", - " Downloading jiwer-3.0.3-py3-none-any.whl (21 kB)\n", - " Downloading jiwer-3.0.2-py3-none-any.whl (21 kB)\n", - " Downloading jiwer-3.0.1-py3-none-any.whl (21 kB)\n", - " Downloading jiwer-3.0.0-py3-none-any.whl (21 kB)\n", - " Downloading jiwer-2.6.0-py3-none-any.whl (20 kB)\n", - " Downloading jiwer-2.5.2-py3-none-any.whl (15 kB)\n", - "Collecting rapidfuzz (from nemo_toolkit[all])\n", - " Downloading rapidfuzz-2.13.7-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (2.2 MB)\n", - "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m2.2/2.2 MB\u001b[0m \u001b[31m62.7 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", - "\u001b[?25hRequirement already satisfied: audioread>=2.1.9 in /usr/local/lib/python3.10/dist-packages (from lhotse>=1.22.0->nemo_toolkit[all]) (3.0.1)\n", - "Collecting cytoolz>=0.10.1 (from lhotse>=1.22.0->nemo_toolkit[all])\n", - " Downloading cytoolz-0.12.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (2.0 MB)\n", - "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m2.0/2.0 MB\u001b[0m \u001b[31m59.9 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", - "\u001b[?25hCollecting intervaltree>=3.1.0 (from lhotse>=1.22.0->nemo_toolkit[all])\n", - " Downloading intervaltree-3.1.0.tar.gz (32 kB)\n", - " Preparing metadata (setup.py) ... \u001b[?25l\u001b[?25hdone\n", - "Collecting lilcom>=1.1.0 (from lhotse>=1.22.0->nemo_toolkit[all])\n", - " Downloading lilcom-1.7-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (87 kB)\n", - "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m87.1/87.1 kB\u001b[0m \u001b[31m10.4 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", - "\u001b[?25hRequirement already satisfied: joblib>=0.14 in /usr/local/lib/python3.10/dist-packages (from librosa>=0.10.0->nemo_toolkit[all]) (1.4.2)\n", - "Requirement already satisfied: decorator>=4.3.0 in /usr/local/lib/python3.10/dist-packages (from librosa>=0.10.0->nemo_toolkit[all]) (4.4.2)\n", - "Requirement already satisfied: pooch>=1.1 in /usr/local/lib/python3.10/dist-packages (from librosa>=0.10.0->nemo_toolkit[all]) (1.8.1)\n", - "Requirement already satisfied: soxr>=0.3.2 in /usr/local/lib/python3.10/dist-packages (from librosa>=0.10.0->nemo_toolkit[all]) (0.3.7)\n", - "Requirement already satisfied: lazy-loader>=0.1 in /usr/local/lib/python3.10/dist-packages (from librosa>=0.10.0->nemo_toolkit[all]) (0.4)\n", - "Requirement already satisfied: msgpack>=1.0 in /usr/local/lib/python3.10/dist-packages (from librosa>=0.10.0->nemo_toolkit[all]) (1.0.8)\n", - "Requirement already satisfied: contourpy>=1.0.1 in /usr/local/lib/python3.10/dist-packages (from matplotlib->nemo_toolkit[all]) (1.2.1)\n", - "Requirement already satisfied: cycler>=0.10 in /usr/local/lib/python3.10/dist-packages (from matplotlib->nemo_toolkit[all]) (0.12.1)\n", - "Requirement already satisfied: fonttools>=4.22.0 in /usr/local/lib/python3.10/dist-packages (from matplotlib->nemo_toolkit[all]) (4.51.0)\n", - "Requirement already satisfied: kiwisolver>=1.0.1 in /usr/local/lib/python3.10/dist-packages (from matplotlib->nemo_toolkit[all]) (1.4.5)\n", - "Requirement already satisfied: pyparsing>=2.3.1 in /usr/local/lib/python3.10/dist-packages (from matplotlib->nemo_toolkit[all]) (3.1.2)\n", - "Requirement already satisfied: rich>=12 in /usr/local/lib/python3.10/dist-packages (from nerfacc>=0.5.3->nemo_toolkit[all]) (13.7.1)\n", - "Requirement already satisfied: llvmlite<0.42,>=0.41.0dev0 in /usr/local/lib/python3.10/dist-packages (from numba->nemo_toolkit[all]) (0.41.1)\n", - "Requirement already satisfied: protobuf>=3.20.2 in /usr/local/lib/python3.10/dist-packages (from onnx>=1.7.0->nemo_toolkit[all]) (3.20.3)\n", - "Requirement already satisfied: six>=1.5 in /usr/local/lib/python3.10/dist-packages (from python-dateutil->nemo_toolkit[all]) (1.16.0)\n", - "Collecting lightning-utilities>=0.8.0 (from pytorch-lightning>=2.2.1->nemo_toolkit[all])\n", - " Downloading lightning_utilities-0.11.2-py3-none-any.whl (26 kB)\n", - "Requirement already satisfied: threadpoolctl>=2.0.0 in /usr/local/lib/python3.10/dist-packages (from scikit-learn->nemo_toolkit[all]) (3.5.0)\n", - "Requirement already satisfied: cffi>=1.0 in /usr/local/lib/python3.10/dist-packages (from soundfile->nemo_toolkit[all]) (1.16.0)\n", - "Requirement already satisfied: sympy in /usr/local/lib/python3.10/dist-packages (from torch->nemo_toolkit[all]) (1.12)\n", - "Requirement already satisfied: networkx in /usr/local/lib/python3.10/dist-packages (from torch->nemo_toolkit[all]) (3.3)\n", - "Requirement already satisfied: jinja2 in /usr/local/lib/python3.10/dist-packages (from torch->nemo_toolkit[all]) (3.1.4)\n", - "Collecting nvidia-cuda-nvrtc-cu12==12.1.105 (from torch->nemo_toolkit[all])\n", - " Using cached nvidia_cuda_nvrtc_cu12-12.1.105-py3-none-manylinux1_x86_64.whl (23.7 MB)\n", - "Collecting nvidia-cuda-runtime-cu12==12.1.105 (from torch->nemo_toolkit[all])\n", - " Using cached nvidia_cuda_runtime_cu12-12.1.105-py3-none-manylinux1_x86_64.whl (823 kB)\n", - "Collecting nvidia-cuda-cupti-cu12==12.1.105 (from torch->nemo_toolkit[all])\n", - " Using cached nvidia_cuda_cupti_cu12-12.1.105-py3-none-manylinux1_x86_64.whl (14.1 MB)\n", - "Collecting nvidia-cudnn-cu12==8.9.2.26 (from torch->nemo_toolkit[all])\n", - " Using cached nvidia_cudnn_cu12-8.9.2.26-py3-none-manylinux1_x86_64.whl (731.7 MB)\n", - "Collecting nvidia-cublas-cu12==12.1.3.1 (from torch->nemo_toolkit[all])\n", - " Using cached nvidia_cublas_cu12-12.1.3.1-py3-none-manylinux1_x86_64.whl (410.6 MB)\n", - "Collecting nvidia-cufft-cu12==11.0.2.54 (from torch->nemo_toolkit[all])\n", - " Using cached nvidia_cufft_cu12-11.0.2.54-py3-none-manylinux1_x86_64.whl (121.6 MB)\n", - "Collecting nvidia-curand-cu12==10.3.2.106 (from torch->nemo_toolkit[all])\n", - " Using cached nvidia_curand_cu12-10.3.2.106-py3-none-manylinux1_x86_64.whl (56.5 MB)\n", - "Collecting nvidia-cusolver-cu12==11.4.5.107 (from torch->nemo_toolkit[all])\n", - " Using cached nvidia_cusolver_cu12-11.4.5.107-py3-none-manylinux1_x86_64.whl (124.2 MB)\n", - "Collecting nvidia-cusparse-cu12==12.1.0.106 (from torch->nemo_toolkit[all])\n", - " Using cached nvidia_cusparse_cu12-12.1.0.106-py3-none-manylinux1_x86_64.whl (196.0 MB)\n", - "Collecting nvidia-nccl-cu12==2.20.5 (from torch->nemo_toolkit[all])\n", - " Using cached nvidia_nccl_cu12-2.20.5-py3-none-manylinux2014_x86_64.whl (176.2 MB)\n", - "Collecting nvidia-nvtx-cu12==12.1.105 (from torch->nemo_toolkit[all])\n", - " Using cached nvidia_nvtx_cu12-12.1.105-py3-none-manylinux1_x86_64.whl (99 kB)\n", - "Requirement already satisfied: triton==2.3.0 in /usr/local/lib/python3.10/dist-packages (from torch->nemo_toolkit[all]) (2.3.0)\n", - "Collecting nvidia-nvjitlink-cu12 (from nvidia-cusolver-cu12==11.4.5.107->torch->nemo_toolkit[all])\n", - " Downloading nvidia_nvjitlink_cu12-12.5.40-py3-none-manylinux2014_x86_64.whl (21.3 MB)\n", - "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m21.3/21.3 MB\u001b[0m \u001b[31m57.9 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", - "\u001b[?25hRequirement already satisfied: tokenizers<0.20,>=0.19 in /usr/local/lib/python3.10/dist-packages (from transformers<=4.40.2,>=4.36.0->nemo_toolkit[all]) (0.19.1)\n", - "Collecting botocore<1.35.0,>=1.34.113 (from boto3->nemo_toolkit[all])\n", - " Downloading botocore-1.34.113-py3-none-any.whl (12.3 MB)\n", - "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m12.3/12.3 MB\u001b[0m \u001b[31m78.8 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", - "\u001b[?25hCollecting jmespath<2.0.0,>=0.7.1 (from boto3->nemo_toolkit[all])\n", - " Downloading jmespath-1.0.1-py3-none-any.whl (20 kB)\n", - "Collecting s3transfer<0.11.0,>=0.10.0 (from boto3->nemo_toolkit[all])\n", - " Downloading s3transfer-0.10.1-py3-none-any.whl (82 kB)\n", - "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m82.2/82.2 kB\u001b[0m \u001b[31m8.8 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", - "\u001b[?25hRequirement already satisfied: pyarrow>=12.0.0 in /usr/local/lib/python3.10/dist-packages (from datasets->nemo_toolkit[all]) (14.0.2)\n", - "Requirement already satisfied: pyarrow-hotfix in /usr/local/lib/python3.10/dist-packages (from datasets->nemo_toolkit[all]) (0.6)\n", - "Collecting dill<0.3.9,>=0.3.0 (from datasets->nemo_toolkit[all])\n", - " Downloading dill-0.3.8-py3-none-any.whl (116 kB)\n", - "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m116.3/116.3 kB\u001b[0m \u001b[31m13.1 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", - "\u001b[?25hCollecting xxhash (from datasets->nemo_toolkit[all])\n", - " Downloading xxhash-3.4.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (194 kB)\n", - "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m194.1/194.1 kB\u001b[0m \u001b[31m10.3 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", - "\u001b[?25hCollecting multiprocess (from datasets->nemo_toolkit[all])\n", - " Downloading multiprocess-0.70.16-py310-none-any.whl (134 kB)\n", - "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m134.8/134.8 kB\u001b[0m \u001b[31m15.8 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", - "\u001b[?25hRequirement already satisfied: aiohttp in /usr/local/lib/python3.10/dist-packages (from datasets->nemo_toolkit[all]) (3.9.5)\n", - "Collecting pybind11>=2.2 (from fasttext->nemo_toolkit[all])\n", - " Using cached pybind11-2.12.0-py3-none-any.whl (234 kB)\n", - "Requirement already satisfied: absl-py in /usr/local/lib/python3.10/dist-packages (from fiddle->nemo_toolkit[all]) (1.4.0)\n", - "Requirement already satisfied: graphviz in /usr/local/lib/python3.10/dist-packages (from fiddle->nemo_toolkit[all]) (0.20.3)\n", - "Collecting libcst (from fiddle->nemo_toolkit[all])\n", - " Downloading libcst-1.4.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (2.3 MB)\n", - "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m2.3/2.3 MB\u001b[0m \u001b[31m65.7 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", - "\u001b[?25hCollecting aniso8601>=0.82 (from flask-restful->nemo_toolkit[all])\n", - " Downloading aniso8601-9.0.1-py2.py3-none-any.whl (52 kB)\n", - "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m52.8/52.8 kB\u001b[0m \u001b[31m2.2 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", - "\u001b[?25hRequirement already satisfied: Flask>=0.8 in /usr/local/lib/python3.10/dist-packages (from flask-restful->nemo_toolkit[all]) (2.2.5)\n", - "Requirement already satisfied: pytz in /usr/local/lib/python3.10/dist-packages (from flask-restful->nemo_toolkit[all]) (2023.4)\n", - "Requirement already satisfied: wcwidth<0.3.0,>=0.2.12 in /usr/local/lib/python3.10/dist-packages (from ftfy->nemo_toolkit[all]) (0.2.13)\n", - "Collecting distance>=0.1.3 (from g2p-en->nemo_toolkit[all])\n", - " Downloading Distance-0.1.3.tar.gz (180 kB)\n", - "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m180.3/180.3 kB\u001b[0m \u001b[31m16.3 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", - "\u001b[?25h Preparing metadata (setup.py) ... \u001b[?25l\u001b[?25hdone\n", - "Requirement already satisfied: pydantic>=1.9.1 in /usr/local/lib/python3.10/dist-packages (from inflect->nemo_toolkit[all]) (2.7.1)\n", - "Requirement already satisfied: beautifulsoup4 in /usr/local/lib/python3.10/dist-packages (from gdown->nemo_toolkit[all]) (4.12.3)\n", - "Requirement already satisfied: ipykernel>=4.5.1 in /usr/local/lib/python3.10/dist-packages (from ipywidgets->nemo_toolkit[all]) (5.5.6)\n", - "Requirement already satisfied: ipython-genutils~=0.2.0 in /usr/local/lib/python3.10/dist-packages (from ipywidgets->nemo_toolkit[all]) (0.2.0)\n", - "Requirement already satisfied: traitlets>=4.3.1 in /usr/local/lib/python3.10/dist-packages (from ipywidgets->nemo_toolkit[all]) (5.7.1)\n", - "Requirement already satisfied: widgetsnbextension~=3.6.0 in /usr/local/lib/python3.10/dist-packages (from ipywidgets->nemo_toolkit[all]) (3.6.6)\n", - "Requirement already satisfied: ipython>=4.0.0 in /usr/local/lib/python3.10/dist-packages (from ipywidgets->nemo_toolkit[all]) (7.34.0)\n", - "Requirement already satisfied: jupyterlab-widgets>=1.0.0 in /usr/local/lib/python3.10/dist-packages (from ipywidgets->nemo_toolkit[all]) (3.0.10)\n", - "Collecting kornia-rs>=0.1.0 (from kornia->nemo_toolkit[all])\n", - " Downloading kornia_rs-0.1.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (2.4 MB)\n", - "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m2.4/2.4 MB\u001b[0m \u001b[31m89.4 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", - "\u001b[?25hCollecting cdifflib (from nemo-text-processing->nemo_toolkit[all])\n", - " Downloading cdifflib-1.2.6.tar.gz (11 kB)\n", - " Installing build dependencies ... \u001b[?25l\u001b[?25hdone\n", - " Getting requirements to build wheel ... \u001b[?25l\u001b[?25hdone\n", - " Installing backend dependencies ... \u001b[?25l\u001b[?25hdone\n", - " Preparing metadata (pyproject.toml) ... \u001b[?25l\u001b[?25hdone\n", - "Collecting pynini==2.1.5 (from nemo-text-processing->nemo_toolkit[all])\n", - " Downloading pynini-2.1.5-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (161.3 MB)\n", - "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m161.3/161.3 MB\u001b[0m \u001b[31m7.8 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", - "\u001b[?25hRequirement already satisfied: Cython>=0.29 in /usr/local/lib/python3.10/dist-packages (from pynini==2.1.5->nemo-text-processing->nemo_toolkit[all]) (3.0.10)\n", - "Requirement already satisfied: torchvision in /usr/local/lib/python3.10/dist-packages (from open-clip-torch->nemo_toolkit[all]) (0.18.0+cu121)\n", - "Collecting timm (from open-clip-torch->nemo_toolkit[all])\n", - " Downloading timm-1.0.3-py3-none-any.whl (2.3 MB)\n", - "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m2.3/2.3 MB\u001b[0m \u001b[31m85.9 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", - "\u001b[?25hRequirement already satisfied: tzdata>=2022.1 in /usr/local/lib/python3.10/dist-packages (from pandas->nemo_toolkit[all]) (2024.1)\n", - "Requirement already satisfied: sortedcontainers>=2.0.4 in /usr/local/lib/python3.10/dist-packages (from pyannote.core->nemo_toolkit[all]) (2.4.0)\n", - "Collecting pyannote.database>=4.0.1 (from pyannote.metrics->nemo_toolkit[all])\n", - " Downloading pyannote.database-5.1.0-py3-none-any.whl (48 kB)\n", - "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m48.1/48.1 kB\u001b[0m \u001b[31m5.9 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", - "\u001b[?25hCollecting docopt>=0.6.2 (from pyannote.metrics->nemo_toolkit[all])\n", - " Downloading docopt-0.6.2.tar.gz (25 kB)\n", - " Preparing metadata (setup.py) ... \u001b[?25l\u001b[?25hdone\n", - "Requirement already satisfied: future>=0.16.0 in /usr/local/lib/python3.10/dist-packages (from pyloudnorm->nemo_toolkit[all]) (0.18.3)\n", - "Requirement already satisfied: iniconfig in /usr/local/lib/python3.10/dist-packages (from pytest->nemo_toolkit[all]) (2.0.0)\n", - "Requirement already satisfied: pluggy<2.0,>=0.12 in /usr/local/lib/python3.10/dist-packages (from pytest->nemo_toolkit[all]) (1.5.0)\n", - "Requirement already satisfied: exceptiongroup>=1.0.0rc8 in /usr/local/lib/python3.10/dist-packages (from pytest->nemo_toolkit[all]) (1.2.1)\n", - "Collecting ruamel.yaml.clib>=0.2.7 (from ruamel.yaml->nemo_toolkit[all])\n", - " Downloading ruamel.yaml.clib-0.2.8-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl (526 kB)\n", - "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m526.7/526.7 kB\u001b[0m \u001b[31m48.6 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", - "\u001b[?25hCollecting portalocker (from sacrebleu->nemo_toolkit[all])\n", - " Downloading portalocker-2.8.2-py3-none-any.whl (17 kB)\n", - "Collecting colorama (from sacrebleu->nemo_toolkit[all])\n", - " Downloading colorama-0.4.6-py2.py3-none-any.whl (25 kB)\n", - "Requirement already satisfied: lxml in /usr/local/lib/python3.10/dist-packages (from sacrebleu->nemo_toolkit[all]) (4.9.4)\n", - "Requirement already satisfied: sphinxcontrib-applehelp in /usr/local/lib/python3.10/dist-packages (from sphinx->nemo_toolkit[all]) (1.0.8)\n", - "Requirement already satisfied: sphinxcontrib-devhelp in /usr/local/lib/python3.10/dist-packages (from sphinx->nemo_toolkit[all]) (1.0.6)\n", - "Requirement already satisfied: sphinxcontrib-jsmath in /usr/local/lib/python3.10/dist-packages (from sphinx->nemo_toolkit[all]) (1.0.1)\n", - "Requirement already satisfied: sphinxcontrib-htmlhelp>=2.0.0 in /usr/local/lib/python3.10/dist-packages (from sphinx->nemo_toolkit[all]) (2.0.5)\n", - "Requirement already satisfied: sphinxcontrib-serializinghtml>=1.1.5 in /usr/local/lib/python3.10/dist-packages (from sphinx->nemo_toolkit[all]) (1.1.10)\n", - "Requirement already satisfied: sphinxcontrib-qthelp in /usr/local/lib/python3.10/dist-packages (from sphinx->nemo_toolkit[all]) (1.0.7)\n", - "Requirement already satisfied: Pygments>=2.0 in /usr/local/lib/python3.10/dist-packages (from sphinx->nemo_toolkit[all]) (2.16.1)\n", - "Requirement already satisfied: docutils<0.19,>=0.14 in /usr/local/lib/python3.10/dist-packages (from sphinx->nemo_toolkit[all]) (0.18.1)\n", - "Requirement already satisfied: snowballstemmer>=1.1 in /usr/local/lib/python3.10/dist-packages (from sphinx->nemo_toolkit[all]) (2.2.0)\n", - "Requirement already satisfied: babel>=1.3 in /usr/local/lib/python3.10/dist-packages (from sphinx->nemo_toolkit[all]) (2.15.0)\n", - "Requirement already satisfied: alabaster<0.8,>=0.7 in /usr/local/lib/python3.10/dist-packages (from sphinx->nemo_toolkit[all]) (0.7.16)\n", - "Requirement already satisfied: imagesize in /usr/local/lib/python3.10/dist-packages (from sphinx->nemo_toolkit[all]) (1.4.1)\n", - "Collecting docutils<0.19,>=0.14 (from sphinx->nemo_toolkit[all])\n", - " Downloading docutils-0.17.1-py2.py3-none-any.whl (575 kB)\n", - "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m575.5/575.5 kB\u001b[0m \u001b[31m48.7 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", - "\u001b[?25hCollecting pybtex>=0.24 (from sphinxcontrib-bibtex->nemo_toolkit[all])\n", - " Downloading pybtex-0.24.0-py2.py3-none-any.whl (561 kB)\n", - "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m561.4/561.4 kB\u001b[0m \u001b[31m50.8 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", - "\u001b[?25hCollecting pybtex-docutils>=1.0.0 (from sphinxcontrib-bibtex->nemo_toolkit[all])\n", - " Downloading pybtex_docutils-1.0.3-py3-none-any.whl (6.4 kB)\n", - "Requirement already satisfied: grpcio>=1.48.2 in /usr/local/lib/python3.10/dist-packages (from tensorboard->nemo_toolkit[all]) (1.64.0)\n", - "Requirement already satisfied: google-auth<3,>=1.6.3 in /usr/local/lib/python3.10/dist-packages (from tensorboard->nemo_toolkit[all]) (2.27.0)\n", - "Requirement already satisfied: google-auth-oauthlib<2,>=0.5 in /usr/local/lib/python3.10/dist-packages (from tensorboard->nemo_toolkit[all]) (1.2.0)\n", - "Requirement already satisfied: markdown>=2.6.8 in /usr/local/lib/python3.10/dist-packages (from tensorboard->nemo_toolkit[all]) (3.6)\n", - "Requirement already satisfied: tensorboard-data-server<0.8.0,>=0.7.0 in /usr/local/lib/python3.10/dist-packages (from tensorboard->nemo_toolkit[all]) (0.7.2)\n", - "Requirement already satisfied: werkzeug>=1.0.1 in /usr/local/lib/python3.10/dist-packages (from tensorboard->nemo_toolkit[all]) (3.0.3)\n", - "Collecting plac (from texterrors->nemo_toolkit[all])\n", - " Downloading plac-1.4.3-py2.py3-none-any.whl (22 kB)\n", - "Collecting loguru (from texterrors->nemo_toolkit[all])\n", - " Downloading loguru-0.7.2-py3-none-any.whl (62 kB)\n", - "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m62.5/62.5 kB\u001b[0m \u001b[31m7.1 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", - "\u001b[?25hRequirement already satisfied: termcolor in /usr/local/lib/python3.10/dist-packages (from texterrors->nemo_toolkit[all]) (2.4.0)\n", - "Collecting Levenshtein (from texterrors->nemo_toolkit[all])\n", - " Downloading Levenshtein-0.25.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (177 kB)\n", - "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m177.4/177.4 kB\u001b[0m \u001b[31m19.6 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", - "\u001b[?25hCollecting trampoline>=0.1.2 (from torchsde->nemo_toolkit[all])\n", - " Downloading trampoline-0.1.2-py3-none-any.whl (5.2 kB)\n", - "Collecting docker-pycreds>=0.4.0 (from wandb->nemo_toolkit[all])\n", - " Downloading docker_pycreds-0.4.0-py2.py3-none-any.whl (9.0 kB)\n", - "Collecting gitpython!=3.1.29,>=1.0.0 (from wandb->nemo_toolkit[all])\n", - " Downloading GitPython-3.1.43-py3-none-any.whl (207 kB)\n", - "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m207.3/207.3 kB\u001b[0m \u001b[31m17.6 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", - "\u001b[?25hRequirement already satisfied: psutil>=5.0.0 in /usr/local/lib/python3.10/dist-packages (from wandb->nemo_toolkit[all]) (5.9.5)\n", - "Collecting sentry-sdk>=1.0.0 (from wandb->nemo_toolkit[all])\n", - " Downloading sentry_sdk-2.3.1-py2.py3-none-any.whl (289 kB)\n", - "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m289.0/289.0 kB\u001b[0m \u001b[31m28.1 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", - "\u001b[?25hCollecting setproctitle (from wandb->nemo_toolkit[all])\n", - " Downloading setproctitle-1.3.3-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl (30 kB)\n", - "Collecting asciitree (from zarr->nemo_toolkit[all])\n", - " Downloading asciitree-0.3.3.tar.gz (4.0 kB)\n", - " Preparing metadata (setup.py) ... \u001b[?25l\u001b[?25hdone\n", - "Collecting numcodecs>=0.10.0 (from zarr->nemo_toolkit[all])\n", - " Downloading numcodecs-0.12.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (7.7 MB)\n", - "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m7.7/7.7 MB\u001b[0m \u001b[31m63.7 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", - "\u001b[?25hCollecting fasteners (from zarr->nemo_toolkit[all])\n", - " Downloading fasteners-0.19-py3-none-any.whl (18 kB)\n", - "Requirement already satisfied: urllib3!=2.2.0,<3,>=1.25.4 in /usr/local/lib/python3.10/dist-packages (from botocore<1.35.0,>=1.34.113->boto3->nemo_toolkit[all]) (2.0.7)\n", - "Requirement already satisfied: pycparser in /usr/local/lib/python3.10/dist-packages (from cffi>=1.0->soundfile->nemo_toolkit[all]) (2.22)\n", - "Requirement already satisfied: toolz>=0.8.0 in /usr/local/lib/python3.10/dist-packages (from cytoolz>=0.10.1->lhotse>=1.22.0->nemo_toolkit[all]) (0.12.1)\n", - "Requirement already satisfied: itsdangerous>=2.0 in /usr/local/lib/python3.10/dist-packages (from Flask>=0.8->flask-restful->nemo_toolkit[all]) (2.2.0)\n", - "Requirement already satisfied: aiosignal>=1.1.2 in /usr/local/lib/python3.10/dist-packages (from aiohttp->datasets->nemo_toolkit[all]) (1.3.1)\n", - "Requirement already satisfied: attrs>=17.3.0 in /usr/local/lib/python3.10/dist-packages (from aiohttp->datasets->nemo_toolkit[all]) (23.2.0)\n", - "Requirement already satisfied: frozenlist>=1.1.1 in /usr/local/lib/python3.10/dist-packages (from aiohttp->datasets->nemo_toolkit[all]) (1.4.1)\n", - "Requirement already satisfied: multidict<7.0,>=4.5 in /usr/local/lib/python3.10/dist-packages (from aiohttp->datasets->nemo_toolkit[all]) (6.0.5)\n", - "Requirement already satisfied: yarl<2.0,>=1.0 in /usr/local/lib/python3.10/dist-packages (from aiohttp->datasets->nemo_toolkit[all]) (1.9.4)\n", - "Requirement already satisfied: async-timeout<5.0,>=4.0 in /usr/local/lib/python3.10/dist-packages (from aiohttp->datasets->nemo_toolkit[all]) (4.0.3)\n", - "Collecting gitdb<5,>=4.0.1 (from gitpython!=3.1.29,>=1.0.0->wandb->nemo_toolkit[all])\n", - " Downloading gitdb-4.0.11-py3-none-any.whl (62 kB)\n", - "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m62.7/62.7 kB\u001b[0m \u001b[31m7.7 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", - "\u001b[?25hRequirement already satisfied: cachetools<6.0,>=2.0.0 in /usr/local/lib/python3.10/dist-packages (from google-auth<3,>=1.6.3->tensorboard->nemo_toolkit[all]) (5.3.3)\n", - "Requirement already satisfied: pyasn1-modules>=0.2.1 in /usr/local/lib/python3.10/dist-packages (from google-auth<3,>=1.6.3->tensorboard->nemo_toolkit[all]) (0.4.0)\n", - "Requirement already satisfied: rsa<5,>=3.1.4 in /usr/local/lib/python3.10/dist-packages (from google-auth<3,>=1.6.3->tensorboard->nemo_toolkit[all]) (4.9)\n", - "Requirement already satisfied: requests-oauthlib>=0.7.0 in /usr/local/lib/python3.10/dist-packages (from google-auth-oauthlib<2,>=0.5->tensorboard->nemo_toolkit[all]) (1.3.1)\n", - "Requirement already satisfied: jupyter-client in /usr/local/lib/python3.10/dist-packages (from ipykernel>=4.5.1->ipywidgets->nemo_toolkit[all]) (6.1.12)\n", - "Requirement already satisfied: tornado>=4.2 in /usr/local/lib/python3.10/dist-packages (from ipykernel>=4.5.1->ipywidgets->nemo_toolkit[all]) (6.3.3)\n", - "Collecting jedi>=0.16 (from ipython>=4.0.0->ipywidgets->nemo_toolkit[all])\n", - " Downloading jedi-0.19.1-py2.py3-none-any.whl (1.6 MB)\n", - "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m1.6/1.6 MB\u001b[0m \u001b[31m73.5 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", - "\u001b[?25hRequirement already satisfied: pickleshare in /usr/local/lib/python3.10/dist-packages (from ipython>=4.0.0->ipywidgets->nemo_toolkit[all]) (0.7.5)\n", - "Requirement already satisfied: prompt-toolkit!=3.0.0,!=3.0.1,<3.1.0,>=2.0.0 in /usr/local/lib/python3.10/dist-packages (from ipython>=4.0.0->ipywidgets->nemo_toolkit[all]) (3.0.43)\n", - "Requirement already satisfied: backcall in /usr/local/lib/python3.10/dist-packages (from ipython>=4.0.0->ipywidgets->nemo_toolkit[all]) (0.2.0)\n", - "Requirement already satisfied: matplotlib-inline in /usr/local/lib/python3.10/dist-packages (from ipython>=4.0.0->ipywidgets->nemo_toolkit[all]) (0.1.7)\n", - "Requirement already satisfied: pexpect>4.3 in /usr/local/lib/python3.10/dist-packages (from ipython>=4.0.0->ipywidgets->nemo_toolkit[all]) (4.9.0)\n", - "Requirement already satisfied: MarkupSafe>=2.0 in /usr/local/lib/python3.10/dist-packages (from jinja2->torch->nemo_toolkit[all]) (2.1.5)\n", - "Collecting typer>=0.12.1 (from pyannote.database>=4.0.1->pyannote.metrics->nemo_toolkit[all])\n", - " Downloading typer-0.12.3-py3-none-any.whl (47 kB)\n", - "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m47.2/47.2 kB\u001b[0m \u001b[31m5.7 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", - "\u001b[?25hCollecting latexcodec>=1.0.4 (from pybtex>=0.24->sphinxcontrib-bibtex->nemo_toolkit[all])\n", - " Downloading latexcodec-3.0.0-py3-none-any.whl (18 kB)\n", - "Requirement already satisfied: annotated-types>=0.4.0 in /usr/local/lib/python3.10/dist-packages (from pydantic>=1.9.1->inflect->nemo_toolkit[all]) (0.7.0)\n", - "Requirement already satisfied: pydantic-core==2.18.2 in /usr/local/lib/python3.10/dist-packages (from pydantic>=1.9.1->inflect->nemo_toolkit[all]) (2.18.2)\n", - "Requirement already satisfied: charset-normalizer<4,>=2 in /usr/local/lib/python3.10/dist-packages (from requests->diffusers>=0.19.3->nemo_toolkit[all]) (3.3.2)\n", - "Requirement already satisfied: idna<4,>=2.5 in /usr/local/lib/python3.10/dist-packages (from requests->diffusers>=0.19.3->nemo_toolkit[all]) (3.7)\n", - "Requirement already satisfied: certifi>=2017.4.17 in /usr/local/lib/python3.10/dist-packages (from requests->diffusers>=0.19.3->nemo_toolkit[all]) (2024.2.2)\n", - "Requirement already satisfied: markdown-it-py>=2.2.0 in /usr/local/lib/python3.10/dist-packages (from rich>=12->nerfacc>=0.5.3->nemo_toolkit[all]) (3.0.0)\n", - "Requirement already satisfied: mpmath>=0.19 in /usr/local/lib/python3.10/dist-packages (from sympy->torch->nemo_toolkit[all]) (1.3.0)\n", - "Requirement already satisfied: notebook>=4.4.1 in /usr/local/lib/python3.10/dist-packages (from widgetsnbextension~=3.6.0->ipywidgets->nemo_toolkit[all]) (6.5.5)\n", - "Requirement already satisfied: soupsieve>1.2 in /usr/local/lib/python3.10/dist-packages (from beautifulsoup4->gdown->nemo_toolkit[all]) (2.5)\n", - "Requirement already satisfied: zipp>=0.5 in /usr/local/lib/python3.10/dist-packages (from importlib-metadata->diffusers>=0.19.3->nemo_toolkit[all]) (3.18.2)\n", - "INFO: pip is looking at multiple versions of levenshtein to determine which version is compatible with other requirements. This could take a while.\n", - "Collecting Levenshtein (from texterrors->nemo_toolkit[all])\n", - " Downloading Levenshtein-0.25.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (177 kB)\n", - "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m177.4/177.4 kB\u001b[0m \u001b[31m20.2 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", - "\u001b[?25h Downloading Levenshtein-0.24.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (177 kB)\n", - "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m177.4/177.4 kB\u001b[0m \u001b[31m21.5 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", - "\u001b[?25h Downloading Levenshtein-0.23.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (169 kB)\n", - "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m169.4/169.4 kB\u001b[0m \u001b[31m19.9 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", - "\u001b[?25h Downloading Levenshtein-0.22.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (172 kB)\n", - "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m172.9/172.9 kB\u001b[0m \u001b[31m19.3 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", - "\u001b[?25hRequirement already satisfied: PySocks!=1.5.7,>=1.5.6 in /usr/local/lib/python3.10/dist-packages (from requests->diffusers>=0.19.3->nemo_toolkit[all]) (1.7.1)\n", - "Collecting smmap<6,>=3.0.1 (from gitdb<5,>=4.0.1->gitpython!=3.1.29,>=1.0.0->wandb->nemo_toolkit[all])\n", - " Downloading smmap-5.0.1-py3-none-any.whl (24 kB)\n", - "Requirement already satisfied: parso<0.9.0,>=0.8.3 in /usr/local/lib/python3.10/dist-packages (from jedi>=0.16->ipython>=4.0.0->ipywidgets->nemo_toolkit[all]) (0.8.4)\n", - "Requirement already satisfied: mdurl~=0.1 in /usr/local/lib/python3.10/dist-packages (from markdown-it-py>=2.2.0->rich>=12->nerfacc>=0.5.3->nemo_toolkit[all]) (0.1.2)\n", - "Requirement already satisfied: pyzmq<25,>=17 in /usr/local/lib/python3.10/dist-packages (from notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets->nemo_toolkit[all]) (24.0.1)\n", - "Requirement already satisfied: argon2-cffi in /usr/local/lib/python3.10/dist-packages (from notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets->nemo_toolkit[all]) (23.1.0)\n", - "Requirement already satisfied: jupyter-core>=4.6.1 in /usr/local/lib/python3.10/dist-packages (from notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets->nemo_toolkit[all]) (5.7.2)\n", - "Requirement already satisfied: nbformat in /usr/local/lib/python3.10/dist-packages (from notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets->nemo_toolkit[all]) (5.10.4)\n", - "Requirement already satisfied: nbconvert>=5 in /usr/local/lib/python3.10/dist-packages (from notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets->nemo_toolkit[all]) (6.5.4)\n", - "Requirement already satisfied: nest-asyncio>=1.5 in /usr/local/lib/python3.10/dist-packages (from notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets->nemo_toolkit[all]) (1.6.0)\n", - "Requirement already satisfied: Send2Trash>=1.8.0 in /usr/local/lib/python3.10/dist-packages (from notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets->nemo_toolkit[all]) (1.8.3)\n", - "Requirement already satisfied: terminado>=0.8.3 in /usr/local/lib/python3.10/dist-packages (from notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets->nemo_toolkit[all]) (0.18.1)\n", - "Requirement already satisfied: prometheus-client in /usr/local/lib/python3.10/dist-packages (from notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets->nemo_toolkit[all]) (0.20.0)\n", - "Requirement already satisfied: nbclassic>=0.4.7 in /usr/local/lib/python3.10/dist-packages (from notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets->nemo_toolkit[all]) (1.0.0)\n", - "Requirement already satisfied: ptyprocess>=0.5 in /usr/local/lib/python3.10/dist-packages (from pexpect>4.3->ipython>=4.0.0->ipywidgets->nemo_toolkit[all]) (0.7.0)\n", - "Requirement already satisfied: pyasn1<0.7.0,>=0.4.6 in /usr/local/lib/python3.10/dist-packages (from pyasn1-modules>=0.2.1->google-auth<3,>=1.6.3->tensorboard->nemo_toolkit[all]) (0.6.0)\n", - "Requirement already satisfied: oauthlib>=3.0.0 in /usr/local/lib/python3.10/dist-packages (from requests-oauthlib>=0.7.0->google-auth-oauthlib<2,>=0.5->tensorboard->nemo_toolkit[all]) (3.2.2)\n", - "Collecting shellingham>=1.3.0 (from typer>=0.12.1->pyannote.database>=4.0.1->pyannote.metrics->nemo_toolkit[all])\n", - " Downloading shellingham-1.5.4-py2.py3-none-any.whl (9.8 kB)\n", - "Requirement already satisfied: jupyter-server>=1.8 in /usr/local/lib/python3.10/dist-packages (from nbclassic>=0.4.7->notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets->nemo_toolkit[all]) (1.24.0)\n", - "Requirement already satisfied: notebook-shim>=0.2.3 in /usr/local/lib/python3.10/dist-packages (from nbclassic>=0.4.7->notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets->nemo_toolkit[all]) (0.2.4)\n", - "Requirement already satisfied: bleach in /usr/local/lib/python3.10/dist-packages (from nbconvert>=5->notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets->nemo_toolkit[all]) (6.1.0)\n", - "Requirement already satisfied: defusedxml in /usr/local/lib/python3.10/dist-packages (from nbconvert>=5->notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets->nemo_toolkit[all]) (0.7.1)\n", - "Requirement already satisfied: entrypoints>=0.2.2 in /usr/local/lib/python3.10/dist-packages (from nbconvert>=5->notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets->nemo_toolkit[all]) (0.4)\n", - "Requirement already satisfied: jupyterlab-pygments in /usr/local/lib/python3.10/dist-packages (from nbconvert>=5->notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets->nemo_toolkit[all]) (0.3.0)\n", - "Requirement already satisfied: mistune<2,>=0.8.1 in /usr/local/lib/python3.10/dist-packages (from nbconvert>=5->notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets->nemo_toolkit[all]) (0.8.4)\n", - "Requirement already satisfied: nbclient>=0.5.0 in /usr/local/lib/python3.10/dist-packages (from nbconvert>=5->notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets->nemo_toolkit[all]) (0.10.0)\n", - "Requirement already satisfied: pandocfilters>=1.4.1 in /usr/local/lib/python3.10/dist-packages (from nbconvert>=5->notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets->nemo_toolkit[all]) (1.5.1)\n", - "Requirement already satisfied: tinycss2 in /usr/local/lib/python3.10/dist-packages (from nbconvert>=5->notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets->nemo_toolkit[all]) (1.3.0)\n", - "Requirement already satisfied: fastjsonschema>=2.15 in /usr/local/lib/python3.10/dist-packages (from nbformat->notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets->nemo_toolkit[all]) (2.19.1)\n", - "Requirement already satisfied: jsonschema>=2.6 in /usr/local/lib/python3.10/dist-packages (from nbformat->notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets->nemo_toolkit[all]) (4.19.2)\n", - "Requirement already satisfied: argon2-cffi-bindings in /usr/local/lib/python3.10/dist-packages (from argon2-cffi->notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets->nemo_toolkit[all]) (21.2.0)\n", - "Requirement already satisfied: jsonschema-specifications>=2023.03.6 in /usr/local/lib/python3.10/dist-packages (from jsonschema>=2.6->nbformat->notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets->nemo_toolkit[all]) (2023.12.1)\n", - "Requirement already satisfied: referencing>=0.28.4 in /usr/local/lib/python3.10/dist-packages (from jsonschema>=2.6->nbformat->notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets->nemo_toolkit[all]) (0.35.1)\n", - "Requirement already satisfied: rpds-py>=0.7.1 in /usr/local/lib/python3.10/dist-packages (from jsonschema>=2.6->nbformat->notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets->nemo_toolkit[all]) (0.18.1)\n", - "Requirement already satisfied: anyio<4,>=3.1.0 in /usr/local/lib/python3.10/dist-packages (from jupyter-server>=1.8->nbclassic>=0.4.7->notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets->nemo_toolkit[all]) (3.7.1)\n", - "Requirement already satisfied: websocket-client in /usr/local/lib/python3.10/dist-packages (from jupyter-server>=1.8->nbclassic>=0.4.7->notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets->nemo_toolkit[all]) (1.8.0)\n", - "Requirement already satisfied: webencodings in /usr/local/lib/python3.10/dist-packages (from bleach->nbconvert>=5->notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets->nemo_toolkit[all]) (0.5.1)\n", - "Requirement already satisfied: sniffio>=1.1 in /usr/local/lib/python3.10/dist-packages (from anyio<4,>=3.1.0->jupyter-server>=1.8->nbclassic>=0.4.7->notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets->nemo_toolkit[all]) (1.3.1)\n", - "Building wheels for collected packages: causal-conv1d, antlr4-python3-runtime, progress, clip, fasttext, kaldi-python-io, nemo_toolkit, rouge-score, sox, distance, docopt, intervaltree, asciitree, cdifflib\n", - " Building wheel for causal-conv1d (setup.py) ... \u001b[?25l\u001b[?25hdone\n", - " Created wheel for causal-conv1d: filename=causal_conv1d-1.2.2.post1-cp310-cp310-linux_x86_64.whl size=103643300 sha256=2bba8823ae89bd79c2d067978e0e533fab8298f69855bfc5d199828b278cf66c\n", - " Stored in directory: /root/.cache/pip/wheels/22/a7/db/0c9482dec3707ad23181b0eb2da40e4b8f26aaed49752fc49f\n", - " Building wheel for antlr4-python3-runtime (setup.py) ... \u001b[?25l\u001b[?25hdone\n", - " Created wheel for antlr4-python3-runtime: filename=antlr4_python3_runtime-4.9.3-py3-none-any.whl size=144554 sha256=d26518c128f80048ec70721551489517353867c7668a281f27cf1a20b9acd114\n", - " Stored in directory: /root/.cache/pip/wheels/12/93/dd/1f6a127edc45659556564c5730f6d4e300888f4bca2d4c5a88\n", - " Building wheel for progress (setup.py) ... \u001b[?25l\u001b[?25hdone\n", - " Created wheel for progress: filename=progress-1.6-py3-none-any.whl size=9614 sha256=87c634c79d4e56e317499682766011b5d0e28953e43f6a3754957d0f4fd3633a\n", - " Stored in directory: /root/.cache/pip/wheels/a2/68/5f/c339b20a41659d856c93ccdce6a33095493eb82c3964aac5a1\n", - " Building wheel for clip (setup.py) ... \u001b[?25l\u001b[?25hdone\n", - " Created wheel for clip: filename=clip-0.2.0-py3-none-any.whl size=6989 sha256=3e9ac01ba0eff273ea70feaf80d486a07683956515496b6dfeeafe81c9caae24\n", - " Stored in directory: /root/.cache/pip/wheels/7f/5c/e6/2c0fdb453a3569188864b17e9676bea8b3b7e160c037117869\n", - " Building wheel for fasttext (setup.py) ... \u001b[?25l\u001b[?25hdone\n", - " Created wheel for fasttext: filename=fasttext-0.9.2-cp310-cp310-linux_x86_64.whl size=4227140 sha256=708a73871f9ae384ea66b706bb0b73b6c624f23ce0d19882b6711b31abed8091\n", - " Stored in directory: /root/.cache/pip/wheels/a5/13/75/f811c84a8ab36eedbaef977a6a58a98990e8e0f1967f98f394\n", - " Building wheel for kaldi-python-io (setup.py) ... \u001b[?25l\u001b[?25hdone\n", - " Created wheel for kaldi-python-io: filename=kaldi_python_io-1.2.2-py3-none-any.whl size=8949 sha256=5399346b043c1ae3d7431729bbd34a5206a1bbe26c41b5ba69d2b45879740d55\n", - " Stored in directory: /root/.cache/pip/wheels/b7/23/5f/49d3a826be576faf61d84e8028e1914bb36a5586ee2613b087\n", - " Building wheel for nemo_toolkit (pyproject.toml) ... \u001b[?25l\u001b[?25hdone\n", - " Created wheel for nemo_toolkit: filename=nemo_toolkit-2.0.0rc1-py3-none-any.whl size=3709778 sha256=3eb9e4278cef98370e97bf7cc0f009cdebbdaaf8fac7a6584289fdd8abfbd8c8\n", - " Stored in directory: /tmp/pip-ephem-wheel-cache-sdhc6zr1/wheels/c3/4e/45/ab3d29aa73df619f27b371cacf809d5330a18f794879163c1b\n", - " Building wheel for rouge-score (setup.py) ... \u001b[?25l\u001b[?25hdone\n", - " Created wheel for rouge-score: filename=rouge_score-0.1.2-py3-none-any.whl size=24933 sha256=78515a9f3e94b274e69e68c059af462dc7cc1b10b51c1b6d419704ea6b4cffe5\n", - " Stored in directory: /root/.cache/pip/wheels/5f/dd/89/461065a73be61a532ff8599a28e9beef17985c9e9c31e541b4\n", - " Building wheel for sox (setup.py) ... \u001b[?25l\u001b[?25hdone\n", - " Created wheel for sox: filename=sox-1.5.0-py3-none-any.whl size=40038 sha256=1c48c5456291b6b4859918dc81caa53229a5114b68c2772f1a5518f6c6a21254\n", - " Stored in directory: /root/.cache/pip/wheels/74/e7/7b/8033be3ec5e4994595d01269fc9657c8fd83a0dcbf8536666a\n", - " Building wheel for distance (setup.py) ... \u001b[?25l\u001b[?25hdone\n", - " Created wheel for distance: filename=Distance-0.1.3-py3-none-any.whl size=16258 sha256=ade70730449fb839934e857bdcddc6de204e5eaab05db259da2f85be3fc099d0\n", - " Stored in directory: /root/.cache/pip/wheels/e8/bb/de/f71bf63559ea9a921059a5405806f7ff6ed612a9231c4a9309\n", - " Building wheel for docopt (setup.py) ... \u001b[?25l\u001b[?25hdone\n", - " Created wheel for docopt: filename=docopt-0.6.2-py2.py3-none-any.whl size=13706 sha256=1aaae6b0427604326f67708418c3010e0f969b8a82ae512f79307f3978f09f52\n", - " Stored in directory: /root/.cache/pip/wheels/fc/ab/d4/5da2067ac95b36618c629a5f93f809425700506f72c9732fac\n", - " Building wheel for intervaltree (setup.py) ... \u001b[?25l\u001b[?25hdone\n", - " Created wheel for intervaltree: filename=intervaltree-3.1.0-py2.py3-none-any.whl size=26096 sha256=f306547725eb9ea7e52d4b78e8d49734164aa4dc43faee9a74ebd91087a42b68\n", - " Stored in directory: /root/.cache/pip/wheels/fa/80/8c/43488a924a046b733b64de3fac99252674c892a4c3801c0a61\n", - " Building wheel for asciitree (setup.py) ... \u001b[?25l\u001b[?25hdone\n", - " Created wheel for asciitree: filename=asciitree-0.3.3-py3-none-any.whl size=5034 sha256=0251fcc8a18991f12d3209f3acf225199c31dee41236f40b77b69fde95038da9\n", - " Stored in directory: /root/.cache/pip/wheels/7f/4e/be/1171b40f43b918087657ec57cf3b81fa1a2e027d8755baa184\n", - " Building wheel for cdifflib (pyproject.toml) ... \u001b[?25l\u001b[?25hdone\n", - " Created wheel for cdifflib: filename=cdifflib-1.2.6-cp310-cp310-linux_x86_64.whl size=27681 sha256=7c7f9bf50579f19875573df405249c5c962045cdeb20eea6469b5c2d2defb0ce\n", - " Stored in directory: /root/.cache/pip/wheels/87/a7/fd/8061e24ed08689045cb6d1ca303768dc463b20a5a338174841\n", - "Successfully built causal-conv1d antlr4-python3-runtime progress clip fasttext kaldi-python-io nemo_toolkit rouge-score sox distance docopt intervaltree asciitree cdifflib\n", - "Installing collected packages: trampoline, pydub, progress, plac, pangu, opencc, ninja, ijson, docopt, distance, clip, braceexpand, asciitree, antlr4-python3-runtime, aniso8601, addict, xxhash, webdataset, trimesh, textdistance, sox, smmap, shellingham, setproctitle, sentry-sdk, ruamel.yaml.clib, rapidfuzz, pytest-runner, pypinyin, pynini, pybind11, portalocker, pathspec, parameterized, onnx, omegaconf, nvidia-nvtx-cu12, nvidia-nvjitlink-cu12, nvidia-nccl-cu12, nvidia-curand-cu12, nvidia-cufft-cu12, nvidia-cuda-runtime-cu12, nvidia-cuda-nvrtc-cu12, nvidia-cuda-cupti-cu12, nvidia-cublas-cu12, numcodecs, mypy-extensions, marshmallow, markdown2, loguru, lilcom, lightning-utilities, libcst, latexcodec, kornia-rs, kaldiio, kaldi-python-io, jmespath, jedi, isort, intervaltree, ftfy, fasteners, faiss-cpu, einops, docutils, docker-pycreds, dill, decord, cytoolz, colorama, click, cdifflib, attrdict, zarr, sacremoses, sacrebleu, ruamel.yaml, resampy, pytest-mock, pypinyin-dict, PyMCubes, pyloudnorm, pybtex, pyannote.core, nvidia-cusparse-cu12, nvidia-cudnn-cu12, multiprocess, Levenshtein, jiwer, hydra-core, gitdb, fiddle, fasttext, einops-exts, botocore, black, typer, texterrors, s3transfer, rouge-score, pybtex-docutils, nvidia-cusolver-cu12, lhotse, gitpython, flask-restful, diffusers, wandb, transformers, sphinxcontrib-bibtex, pyannote.database, g2p-en, datasets, boto3, torchsde, torchmetrics, torchdiffeq, sentence-transformers, pyannote.metrics, nerfacc, nemo_toolkit, nemo-text-processing, kornia, causal-conv1d, accelerated-scan, timm, pytorch-lightning, taming-transformers, open-clip-torch\n", - " Attempting uninstall: docutils\n", - " Found existing installation: docutils 0.18.1\n", - " Uninstalling docutils-0.18.1:\n", - " Successfully uninstalled docutils-0.18.1\n", - " Attempting uninstall: click\n", - " Found existing installation: click 8.1.7\n", - " Uninstalling click-8.1.7:\n", - " Successfully uninstalled click-8.1.7\n", - " Attempting uninstall: typer\n", - " Found existing installation: typer 0.9.4\n", - " Uninstalling typer-0.9.4:\n", - " Successfully uninstalled typer-0.9.4\n", - " Attempting uninstall: transformers\n", - " Found existing installation: transformers 4.41.0\n", - " Uninstalling transformers-4.41.0:\n", - " Successfully uninstalled transformers-4.41.0\n", - "\u001b[31mERROR: pip's dependency resolver does not currently take into account all the packages that are installed. This behaviour is the source of the following dependency conflicts.\n", - "spacy 3.7.4 requires typer<0.10.0,>=0.3.0, but you have typer 0.12.3 which is incompatible.\n", - "weasel 0.3.4 requires typer<0.10.0,>=0.3.0, but you have typer 0.12.3 which is incompatible.\u001b[0m\u001b[31m\n", - "\u001b[0mSuccessfully installed Levenshtein-0.22.0 PyMCubes-0.1.4 accelerated-scan-0.2.0 addict-2.4.0 aniso8601-9.0.1 antlr4-python3-runtime-4.9.3 asciitree-0.3.3 attrdict-2.0.1 black-24.4.2 boto3-1.34.113 botocore-1.34.113 braceexpand-0.1.7 causal-conv1d-1.2.2.post1 cdifflib-1.2.6 click-8.0.2 clip-0.2.0 colorama-0.4.6 cytoolz-0.12.3 datasets-2.19.1 decord-0.6.0 diffusers-0.28.0 dill-0.3.8 distance-0.1.3 docker-pycreds-0.4.0 docopt-0.6.2 docutils-0.17.1 einops-0.8.0 einops-exts-0.0.4 faiss-cpu-1.8.0 fasteners-0.19 fasttext-0.9.2 fiddle-0.3.0 flask-restful-0.3.10 ftfy-6.2.0 g2p-en-2.1.0 gitdb-4.0.11 gitpython-3.1.43 hydra-core-1.3.2 ijson-3.2.3 intervaltree-3.1.0 isort-5.13.2 jedi-0.19.1 jiwer-2.5.2 jmespath-1.0.1 kaldi-python-io-1.2.2 kaldiio-2.18.0 kornia-0.7.2 kornia-rs-0.1.3 latexcodec-3.0.0 lhotse-1.23.0 libcst-1.4.0 lightning-utilities-0.11.2 lilcom-1.7 loguru-0.7.2 markdown2-2.4.13 marshmallow-3.21.2 multiprocess-0.70.16 mypy-extensions-1.0.0 nemo-text-processing-1.0.2 nemo_toolkit-2.0.0rc1 nerfacc-0.5.3 ninja-1.11.1.1 numcodecs-0.12.1 nvidia-cublas-cu12-12.1.3.1 nvidia-cuda-cupti-cu12-12.1.105 nvidia-cuda-nvrtc-cu12-12.1.105 nvidia-cuda-runtime-cu12-12.1.105 nvidia-cudnn-cu12-8.9.2.26 nvidia-cufft-cu12-11.0.2.54 nvidia-curand-cu12-10.3.2.106 nvidia-cusolver-cu12-11.4.5.107 nvidia-cusparse-cu12-12.1.0.106 nvidia-nccl-cu12-2.20.5 nvidia-nvjitlink-cu12-12.5.40 nvidia-nvtx-cu12-12.1.105 omegaconf-2.3.0 onnx-1.16.1 open-clip-torch-2.24.0 opencc-1.1.6 pangu-4.0.6.1 parameterized-0.9.0 pathspec-0.12.1 plac-1.4.3 portalocker-2.8.2 progress-1.6 pyannote.core-5.0.0 pyannote.database-5.1.0 pyannote.metrics-3.2.1 pybind11-2.12.0 pybtex-0.24.0 pybtex-docutils-1.0.3 pydub-0.25.1 pyloudnorm-0.1.1 pynini-2.1.5 pypinyin-0.51.0 pypinyin-dict-0.8.0 pytest-mock-3.14.0 pytest-runner-6.0.1 pytorch-lightning-2.2.5 rapidfuzz-2.13.7 resampy-0.4.3 rouge-score-0.1.2 ruamel.yaml-0.18.6 ruamel.yaml.clib-0.2.8 s3transfer-0.10.1 sacrebleu-2.4.2 sacremoses-0.1.1 sentence-transformers-2.7.0 sentry-sdk-2.3.1 setproctitle-1.3.3 shellingham-1.5.4 smmap-5.0.1 sox-1.5.0 sphinxcontrib-bibtex-2.6.2 taming-transformers-0.0.1 textdistance-4.6.2 texterrors-0.4.4 timm-1.0.3 torchdiffeq-0.2.3 torchmetrics-1.4.0.post0 torchsde-0.2.6 trampoline-0.1.2 transformers-4.40.2 trimesh-4.4.0 typer-0.12.3 wandb-0.17.0 webdataset-0.2.86 xxhash-3.4.1 zarr-2.18.2\n" - ] - } - ], - "source": [ - "!pip install wget\n", - "!apt-get install sox libsndfile1 ffmpeg\n", - "!pip install matplotlib>=3.3.2\n", - "\n", - "!python -m pip install git+https://github.com/NVIDIA/NeMo.git@1fa961ba03ab5f8c91b278640e29807079373372#egg=nemo_toolkit[all]" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "id": "_Utv8kLRW9Js" - }, - "outputs": [], - "source": [ - "from typing import List, Union\n", - "\n", - "import hydra\n", - "import soundfile as sf\n", - "import torch\n", - "from omegaconf import DictConfig, ListConfig, OmegaConf" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "ZLslfbEfXQIE" - }, - "source": [ - "### Model for emotions classification" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "id": "paEKSFFVXPqC" - }, - "outputs": [], - "source": [ - "class SpecScaler(torch.nn.Module):\n", - " def forward(self, x: torch.Tensor) -> torch.Tensor:\n", - " return torch.log(x.clamp_(1e-9, 1e9))\n", - "\n", - "\n", - "class GigaAMEmo(torch.nn.Module):\n", - " def __init__(self, conf: Union[DictConfig, ListConfig]):\n", - " super().__init__()\n", - " self.id2name = conf.id2name\n", - " self.feature_extractor = hydra.utils.instantiate(conf.feature_extractor)\n", - " self.conformer = hydra.utils.instantiate(conf.encoder)\n", - " self.linear_head = hydra.utils.instantiate(conf.classification_head)\n", - "\n", - " def forward(self, features, features_length=None):\n", - " if features.dim() == 2:\n", - " features = features.unsqueeze(0)\n", - " if not features_length:\n", - " features_length = torch.ones(features.shape[0]) * features.shape[-1]\n", - " features_length = features_length.to(features.device)\n", - " encoded, _ = self.conformer(audio_signal=features, length=features_length)\n", - " encoded_pooled = torch.nn.functional.avg_pool1d(\n", - " encoded, kernel_size=encoded.shape[-1]\n", - " ).squeeze(-1)\n", - "\n", - " logits = self.linear_head(encoded_pooled)\n", - " return logits\n", - "\n", - " def get_probs(self, audio_path: str) -> List[List[float]]:\n", - " audio_signal, _ = sf.read(audio_path, dtype=\"float32\")\n", - " features = self.feature_extractor(\n", - " torch.tensor(audio_signal).float().to(next(self.parameters()).device)\n", - " )\n", - " logits = self.forward(features)\n", - " probs = torch.nn.functional.softmax(logits).detach().tolist()\n", - " return probs" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "7UFpN0Ghc244" - }, - "source": [ - "### Downloading config, weights and audio example" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/" - }, - "id": "jFZJGISjcmHW", - "outputId": "74a2a71e-2dba-4551-c2cb-737eaa35bfa4" - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "--2024-05-28 07:10:07-- https://n-ws-q0bez.s3pd12.sbercloud.ru/b-ws-q0bez-jpv/GigaAM/emo_model_weights.ckpt\n", - "Resolving n-ws-q0bez.s3pd12.sbercloud.ru (n-ws-q0bez.s3pd12.sbercloud.ru)... 37.230.193.192\n", - "Connecting to n-ws-q0bez.s3pd12.sbercloud.ru (n-ws-q0bez.s3pd12.sbercloud.ru)|37.230.193.192|:443... connected.\n", - "HTTP request sent, awaiting response... 200 OK\n", - "Length: 968409626 (924M) [application/octet-stream]\n", - "Saving to: ‘emo_model_weights.ckpt’\n", - "\n", - "emo_model_weights.c 100%[===================>] 923.55M 7.48MB/s in 1m 45s \n", - "\n", - "2024-05-28 07:11:53 (8.82 MB/s) - ‘emo_model_weights.ckpt’ saved [968409626/968409626]\n", - "\n", - "--2024-05-28 07:11:54-- https://n-ws-q0bez.s3pd12.sbercloud.ru/b-ws-q0bez-jpv/GigaAM/emo_model_config.yaml\n", - "Resolving n-ws-q0bez.s3pd12.sbercloud.ru (n-ws-q0bez.s3pd12.sbercloud.ru)... 37.230.193.192\n", - "Connecting to n-ws-q0bez.s3pd12.sbercloud.ru (n-ws-q0bez.s3pd12.sbercloud.ru)|37.230.193.192|:443... connected.\n", - "HTTP request sent, awaiting response... 200 OK\n", - "Length: 765 [application/octet-stream]\n", - "Saving to: ‘emo_model_config.yaml’\n", - "\n", - "emo_model_config.ya 100%[===================>] 765 --.-KB/s in 0s \n", - "\n", - "2024-05-28 07:11:54 (252 MB/s) - ‘emo_model_config.yaml’ saved [765/765]\n", - "\n", - "--2024-05-28 07:11:54-- https://n-ws-q0bez.s3pd12.sbercloud.ru/b-ws-q0bez-jpv/GigaAM/example.wav\n", - "Resolving n-ws-q0bez.s3pd12.sbercloud.ru (n-ws-q0bez.s3pd12.sbercloud.ru)... 37.230.193.192\n", - "Connecting to n-ws-q0bez.s3pd12.sbercloud.ru (n-ws-q0bez.s3pd12.sbercloud.ru)|37.230.193.192|:443... connected.\n", - "HTTP request sent, awaiting response... 200 OK\n", - "Length: 361324 (353K) [application/octet-stream]\n", - "Saving to: ‘example.wav’\n", - "\n", - "example.wav 100%[===================>] 352.86K 715KB/s in 0.5s \n", - "\n", - "2024-05-28 07:11:56 (715 KB/s) - ‘example.wav’ saved [361324/361324]\n", - "\n" - ] - } - ], - "source": [ - "import locale\n", - "\n", - "locale.getpreferredencoding = lambda: \"UTF-8\"\n", - "\n", - "# Loading weights, config and example wav for CTC-model\n", - "!wget https://n-ws-q0bez.s3pd12.sbercloud.ru/b-ws-q0bez-jpv/GigaAM/emo_model_weights.ckpt\n", - "!wget https://n-ws-q0bez.s3pd12.sbercloud.ru/b-ws-q0bez-jpv/GigaAM/emo_model_config.yaml\n", - "!wget https://n-ws-q0bez.s3pd12.sbercloud.ru/b-ws-q0bez-jpv/GigaAM/example.wav" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "NZ6-O2M0fxDY" - }, - "source": [ - "### Model instantiating and inference" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/" - }, - "id": "plXt8297d5km", - "outputId": "537acb90-f6a1-4a73-ea66-0d3fe6fd9a3a" - }, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "[NeMo W 2024-05-28 07:20:12 nemo_logging:349] :32: UserWarning: Implicit dimension choice for softmax has been deprecated. Change the call to include dim=X as an argument.\n", - " probs = torch.nn.functional.softmax(logits).detach().tolist()\n", - " \n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "angry: 0.000, sad: 0.002, neutral: 0.923, positive: 0.074\n" - ] - } - ], - "source": [ - "model_config = \"emo_model_config.yaml\"\n", - "model_weights = \"emo_model_weights.ckpt\"\n", - "audio_path = \"example.wav\"\n", - "device = \"cuda\" if torch.cuda.is_available() else \"cpu\"\n", - "\n", - "conf = OmegaConf.load(model_config)\n", - "model = GigaAMEmo(conf)\n", - "ckpt = torch.load(model_weights, map_location=\"cpu\")\n", - "model.load_state_dict(ckpt, strict=False)\n", - "model = model.to(device)\n", - "model.eval()\n", - "with torch.no_grad():\n", - " probs = model.get_probs(audio_path)[0]\n", - "print(\", \".join([f\"{model.id2name[i]}: {p:.3f}\" for i, p in enumerate(probs)]))" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "id": "nmFvC_GfkasV" - }, - "outputs": [], - "source": [] - } - ], - "metadata": { - "accelerator": "GPU", - "colab": { - "gpuType": "T4", - "provenance": [] - }, - "kernelspec": { - "display_name": "Python 3", - "name": "python3" - }, - "language_info": { - "name": "python" - } - }, - "nbformat": 4, - "nbformat_minor": 0 -} diff --git a/examples/notebooks/GigaAM_Model_Usage_Example.ipynb b/examples/notebooks/GigaAM_Model_Usage_Example.ipynb deleted file mode 100644 index c6eb2d4..0000000 --- a/examples/notebooks/GigaAM_Model_Usage_Example.ipynb +++ /dev/null @@ -1,881 +0,0 @@ -{ - "nbformat": 4, - "nbformat_minor": 0, - "metadata": { - "colab": { - "provenance": [], - "gpuType": "T4" - }, - "kernelspec": { - "name": "python3", - "display_name": "Python 3" - }, - "language_info": { - "name": "python" - }, - "accelerator": "GPU" - }, - "cells": [ - { - "cell_type": "markdown", - "source": [ - "### Installing and importing dependencies" - ], - "metadata": { - "id": "aqymJFVQhere" - } - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/" - }, - "id": "mJ5zzajTbzRX", - "outputId": "a6e8f1cc-5ef7-43e2-824e-39133c8f3f98" - }, - "outputs": [ - { - "output_type": "stream", - "name": "stdout", - "text": [ - "Collecting wget\n", - " Downloading wget-3.2.zip (10 kB)\n", - " Preparing metadata (setup.py) ... \u001b[?25l\u001b[?25hdone\n", - "Building wheels for collected packages: wget\n", - " Building wheel for wget (setup.py) ... \u001b[?25l\u001b[?25hdone\n", - " Created wheel for wget: filename=wget-3.2-py3-none-any.whl size=9656 sha256=fb233af0965c5da90b8babdcb0fbd51095c2a135ec877618013ed9078dced85b\n", - " Stored in directory: /root/.cache/pip/wheels/8b/f1/7f/5c94f0a7a505ca1c81cd1d9208ae2064675d97582078e6c769\n", - "Successfully built wget\n", - "Installing collected packages: wget\n", - "Successfully installed wget-3.2\n", - "Reading package lists... Done\n", - "Building dependency tree... Done\n", - "Reading state information... Done\n", - "libsndfile1 is already the newest version (1.0.31-2ubuntu0.1).\n", - "ffmpeg is already the newest version (7:4.4.2-0ubuntu0.22.04.1).\n", - "The following additional packages will be installed:\n", - " libopencore-amrnb0 libopencore-amrwb0 libsox-fmt-alsa libsox-fmt-base libsox3 libwavpack1\n", - "Suggested packages:\n", - " libsox-fmt-all\n", - "The following NEW packages will be installed:\n", - " libopencore-amrnb0 libopencore-amrwb0 libsox-fmt-alsa libsox-fmt-base libsox3 libwavpack1 sox\n", - "0 upgraded, 7 newly installed, 0 to remove and 45 not upgraded.\n", - "Need to get 617 kB of archives.\n", - "After this operation, 1,764 kB of additional disk space will be used.\n", - "Get:1 http://archive.ubuntu.com/ubuntu jammy/universe amd64 libopencore-amrnb0 amd64 0.1.5-1 [94.8 kB]\n", - "Get:2 http://archive.ubuntu.com/ubuntu jammy/universe amd64 libopencore-amrwb0 amd64 0.1.5-1 [49.1 kB]\n", - "Get:3 http://archive.ubuntu.com/ubuntu jammy-updates/universe amd64 libsox3 amd64 14.4.2+git20190427-2+deb11u2ubuntu0.22.04.1 [240 kB]\n", - "Get:4 http://archive.ubuntu.com/ubuntu jammy-updates/universe amd64 libsox-fmt-alsa amd64 14.4.2+git20190427-2+deb11u2ubuntu0.22.04.1 [11.2 kB]\n", - "Get:5 http://archive.ubuntu.com/ubuntu jammy/main amd64 libwavpack1 amd64 5.4.0-1build2 [83.7 kB]\n", - "Get:6 http://archive.ubuntu.com/ubuntu jammy-updates/universe amd64 libsox-fmt-base amd64 14.4.2+git20190427-2+deb11u2ubuntu0.22.04.1 [33.7 kB]\n", - "Get:7 http://archive.ubuntu.com/ubuntu jammy-updates/universe amd64 sox amd64 14.4.2+git20190427-2+deb11u2ubuntu0.22.04.1 [104 kB]\n", - "Fetched 617 kB in 0s (2,171 kB/s)\n", - "Selecting previously unselected package libopencore-amrnb0:amd64.\n", - "(Reading database ... 121918 files and directories currently installed.)\n", - "Preparing to unpack .../0-libopencore-amrnb0_0.1.5-1_amd64.deb ...\n", - "Unpacking libopencore-amrnb0:amd64 (0.1.5-1) ...\n", - "Selecting previously unselected package libopencore-amrwb0:amd64.\n", - "Preparing to unpack .../1-libopencore-amrwb0_0.1.5-1_amd64.deb ...\n", - "Unpacking libopencore-amrwb0:amd64 (0.1.5-1) ...\n", - "Selecting previously unselected package libsox3:amd64.\n", - "Preparing to unpack .../2-libsox3_14.4.2+git20190427-2+deb11u2ubuntu0.22.04.1_amd64.deb ...\n", - "Unpacking libsox3:amd64 (14.4.2+git20190427-2+deb11u2ubuntu0.22.04.1) ...\n", - "Selecting previously unselected package libsox-fmt-alsa:amd64.\n", - "Preparing to unpack .../3-libsox-fmt-alsa_14.4.2+git20190427-2+deb11u2ubuntu0.22.04.1_amd64.deb ...\n", - "Unpacking libsox-fmt-alsa:amd64 (14.4.2+git20190427-2+deb11u2ubuntu0.22.04.1) ...\n", - "Selecting previously unselected package libwavpack1:amd64.\n", - "Preparing to unpack .../4-libwavpack1_5.4.0-1build2_amd64.deb ...\n", - "Unpacking libwavpack1:amd64 (5.4.0-1build2) ...\n", - "Selecting previously unselected package libsox-fmt-base:amd64.\n", - "Preparing to unpack .../5-libsox-fmt-base_14.4.2+git20190427-2+deb11u2ubuntu0.22.04.1_amd64.deb ...\n", - "Unpacking libsox-fmt-base:amd64 (14.4.2+git20190427-2+deb11u2ubuntu0.22.04.1) ...\n", - "Selecting previously unselected package sox.\n", - "Preparing to unpack .../6-sox_14.4.2+git20190427-2+deb11u2ubuntu0.22.04.1_amd64.deb ...\n", - "Unpacking sox (14.4.2+git20190427-2+deb11u2ubuntu0.22.04.1) ...\n", - "Setting up libsox3:amd64 (14.4.2+git20190427-2+deb11u2ubuntu0.22.04.1) ...\n", - "Setting up libopencore-amrwb0:amd64 (0.1.5-1) ...\n", - "Setting up libsox-fmt-alsa:amd64 (14.4.2+git20190427-2+deb11u2ubuntu0.22.04.1) ...\n", - "Setting up libwavpack1:amd64 (5.4.0-1build2) ...\n", - "Setting up libopencore-amrnb0:amd64 (0.1.5-1) ...\n", - "Setting up libsox-fmt-base:amd64 (14.4.2+git20190427-2+deb11u2ubuntu0.22.04.1) ...\n", - "Setting up sox (14.4.2+git20190427-2+deb11u2ubuntu0.22.04.1) ...\n", - "Processing triggers for man-db (2.10.2-1) ...\n", - "Processing triggers for libc-bin (2.35-0ubuntu3.4) ...\n", - "/sbin/ldconfig.real: /usr/local/lib/libtbb.so.12 is not a symbolic link\n", - "\n", - "/sbin/ldconfig.real: /usr/local/lib/libtbbmalloc_proxy.so.2 is not a symbolic link\n", - "\n", - "/sbin/ldconfig.real: /usr/local/lib/libtbbbind_2_5.so.3 is not a symbolic link\n", - "\n", - "/sbin/ldconfig.real: /usr/local/lib/libtbbbind_2_0.so.3 is not a symbolic link\n", - "\n", - "/sbin/ldconfig.real: /usr/local/lib/libtbbbind.so.3 is not a symbolic link\n", - "\n", - "/sbin/ldconfig.real: /usr/local/lib/libtbbmalloc.so.2 is not a symbolic link\n", - "\n", - "\u001b[33mDEPRECATION: git+https://github.com/NVIDIA/NeMo.git#egg=nemo_toolkit[all] contains an egg fragment with a non-PEP 508 name pip 25.0 will enforce this behaviour change. A possible replacement is to use the req @ url syntax, and remove the egg fragment. Discussion can be found at https://github.com/pypa/pip/issues/11617\u001b[0m\u001b[33m\n", - "\u001b[0mCollecting nemo_toolkit[all]\n", - " Cloning https://github.com/NVIDIA/NeMo.git to /tmp/pip-install-rgi4yev1/nemo-toolkit_1a843c4761a042a6a6b3b0dfbb81352c\n", - " Running command git clone --filter=blob:none --quiet https://github.com/NVIDIA/NeMo.git /tmp/pip-install-rgi4yev1/nemo-toolkit_1a843c4761a042a6a6b3b0dfbb81352c\n", - " Resolved https://github.com/NVIDIA/NeMo.git to commit 1fa961ba03ab5f8c91b278640e29807079373372\n", - " Installing build dependencies ... \u001b[?25l\u001b[?25hdone\n", - " Getting requirements to build wheel ... \u001b[?25l\u001b[?25hdone\n", - " Preparing metadata (pyproject.toml) ... \u001b[?25l\u001b[?25hdone\n", - "Collecting fiddle (from nemo_toolkit[all])\n", - " Downloading fiddle-0.3.0-py3-none-any.whl (419 kB)\n", - "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m419.8/419.8 kB\u001b[0m \u001b[31m7.0 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", - "\u001b[?25hRequirement already satisfied: huggingface-hub>=0.20.3 in /usr/local/lib/python3.10/dist-packages (from nemo_toolkit[all]) (0.23.1)\n", - "Requirement already satisfied: numba in /usr/local/lib/python3.10/dist-packages (from nemo_toolkit[all]) (0.58.1)\n", - "Requirement already satisfied: numpy>=1.22 in /usr/local/lib/python3.10/dist-packages (from nemo_toolkit[all]) (1.25.2)\n", - "Collecting onnx>=1.7.0 (from nemo_toolkit[all])\n", - " Downloading onnx-1.16.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (15.9 MB)\n", - "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m15.9/15.9 MB\u001b[0m \u001b[31m64.0 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", - "\u001b[?25hRequirement already satisfied: python-dateutil in /usr/local/lib/python3.10/dist-packages (from nemo_toolkit[all]) (2.8.2)\n", - "Collecting ruamel.yaml (from nemo_toolkit[all])\n", - " Downloading ruamel.yaml-0.18.6-py3-none-any.whl (117 kB)\n", - "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m117.8/117.8 kB\u001b[0m \u001b[31m11.1 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", - "\u001b[?25hRequirement already satisfied: scikit-learn in /usr/local/lib/python3.10/dist-packages (from nemo_toolkit[all]) (1.2.2)\n", - "Requirement already satisfied: setuptools>=65.5.1 in /usr/local/lib/python3.10/dist-packages (from nemo_toolkit[all]) (67.7.2)\n", - "Requirement already satisfied: tensorboard in /usr/local/lib/python3.10/dist-packages (from nemo_toolkit[all]) (2.15.2)\n", - "Requirement already satisfied: text-unidecode in /usr/local/lib/python3.10/dist-packages (from nemo_toolkit[all]) (1.3)\n", - "Requirement already satisfied: torch in /usr/local/lib/python3.10/dist-packages (from nemo_toolkit[all]) (2.3.0+cu121)\n", - "Requirement already satisfied: tqdm>=4.41.0 in /usr/local/lib/python3.10/dist-packages (from nemo_toolkit[all]) (4.66.4)\n", - "Requirement already satisfied: wget in /usr/local/lib/python3.10/dist-packages (from nemo_toolkit[all]) (3.2)\n", - "Requirement already satisfied: wrapt in /usr/local/lib/python3.10/dist-packages (from nemo_toolkit[all]) (1.14.1)\n", - "Collecting black~=24.3 (from nemo_toolkit[all])\n", - " Downloading black-24.4.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (1.8 MB)\n", - "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m1.8/1.8 MB\u001b[0m \u001b[31m56.2 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", - "\u001b[?25hCollecting click==8.0.2 (from nemo_toolkit[all])\n", - " Downloading click-8.0.2-py3-none-any.whl (97 kB)\n", - "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m97.6/97.6 kB\u001b[0m \u001b[31m6.6 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", - "\u001b[?25hCollecting isort<6.0.0,>5.1.0 (from nemo_toolkit[all])\n", - " Downloading isort-5.13.2-py3-none-any.whl (92 kB)\n", - "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m92.3/92.3 kB\u001b[0m \u001b[31m9.6 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", - "\u001b[?25hCollecting parameterized (from nemo_toolkit[all])\n", - " Downloading parameterized-0.9.0-py2.py3-none-any.whl (20 kB)\n", - "Requirement already satisfied: pytest in /usr/local/lib/python3.10/dist-packages (from nemo_toolkit[all]) (7.4.4)\n", - "Collecting pytest-mock (from nemo_toolkit[all])\n", - " Downloading pytest_mock-3.14.0-py3-none-any.whl (9.9 kB)\n", - "Collecting pytest-runner (from nemo_toolkit[all])\n", - " Downloading pytest_runner-6.0.1-py3-none-any.whl (7.2 kB)\n", - "Requirement already satisfied: sphinx in /usr/local/lib/python3.10/dist-packages (from nemo_toolkit[all]) (5.0.2)\n", - "Collecting sphinxcontrib-bibtex (from nemo_toolkit[all])\n", - " Downloading sphinxcontrib_bibtex-2.6.2-py3-none-any.whl (40 kB)\n", - "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m41.0/41.0 kB\u001b[0m \u001b[31m4.1 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", - "\u001b[?25hCollecting wandb (from nemo_toolkit[all])\n", - " Downloading wandb-0.17.0-py3-none-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl (6.7 MB)\n", - "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m6.7/6.7 MB\u001b[0m \u001b[31m57.9 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", - "\u001b[?25hRequirement already satisfied: cloudpickle in /usr/local/lib/python3.10/dist-packages (from nemo_toolkit[all]) (2.2.1)\n", - "Collecting hydra-core<=1.3.2,>1.3 (from nemo_toolkit[all])\n", - " Downloading hydra_core-1.3.2-py3-none-any.whl (154 kB)\n", - "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m154.5/154.5 kB\u001b[0m \u001b[31m14.7 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", - "\u001b[?25hCollecting omegaconf<=2.3 (from nemo_toolkit[all])\n", - " Downloading omegaconf-2.3.0-py3-none-any.whl (79 kB)\n", - "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m79.5/79.5 kB\u001b[0m \u001b[31m7.9 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", - "\u001b[?25hCollecting pytorch-lightning>=2.2.1 (from nemo_toolkit[all])\n", - " Downloading pytorch_lightning-2.2.5-py3-none-any.whl (802 kB)\n", - "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m802.3/802.3 kB\u001b[0m \u001b[31m47.9 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", - "\u001b[?25hCollecting torchmetrics>=0.11.0 (from nemo_toolkit[all])\n", - " Downloading torchmetrics-1.4.0.post0-py3-none-any.whl (868 kB)\n", - "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m868.8/868.8 kB\u001b[0m \u001b[31m46.7 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", - "\u001b[?25hCollecting transformers<=4.40.2,>=4.36.0 (from nemo_toolkit[all])\n", - " Downloading transformers-4.40.2-py3-none-any.whl (9.0 MB)\n", - "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m9.0/9.0 MB\u001b[0m \u001b[31m70.7 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", - "\u001b[?25hCollecting webdataset>=0.2.86 (from nemo_toolkit[all])\n", - " Downloading webdataset-0.2.86-py3-none-any.whl (70 kB)\n", - "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m70.4/70.4 kB\u001b[0m \u001b[31m7.4 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", - "\u001b[?25hCollecting datasets (from nemo_toolkit[all])\n", - " Downloading datasets-2.19.1-py3-none-any.whl (542 kB)\n", - "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m542.0/542.0 kB\u001b[0m \u001b[31m40.3 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", - "\u001b[?25hRequirement already satisfied: inflect in /usr/local/lib/python3.10/dist-packages (from nemo_toolkit[all]) (7.0.0)\n", - "Requirement already satisfied: pandas in /usr/local/lib/python3.10/dist-packages (from nemo_toolkit[all]) (2.0.3)\n", - "Collecting sacremoses>=0.0.43 (from nemo_toolkit[all])\n", - " Downloading sacremoses-0.1.1-py3-none-any.whl (897 kB)\n", - "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m897.5/897.5 kB\u001b[0m \u001b[31m56.5 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", - "\u001b[?25hRequirement already satisfied: sentencepiece<1.0.0 in /usr/local/lib/python3.10/dist-packages (from nemo_toolkit[all]) (0.1.99)\n", - "Collecting braceexpand (from nemo_toolkit[all])\n", - " Downloading braceexpand-0.1.7-py2.py3-none-any.whl (5.9 kB)\n", - "Requirement already satisfied: editdistance in /usr/local/lib/python3.10/dist-packages (from nemo_toolkit[all]) (0.6.2)\n", - "Collecting einops (from nemo_toolkit[all])\n", - " Downloading einops-0.8.0-py3-none-any.whl (43 kB)\n", - "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m43.2/43.2 kB\u001b[0m \u001b[31m4.5 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", - "\u001b[?25hCollecting g2p-en (from nemo_toolkit[all])\n", - " Downloading g2p_en-2.1.0-py3-none-any.whl (3.1 MB)\n", - "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m3.1/3.1 MB\u001b[0m \u001b[31m76.9 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", - "\u001b[?25hRequirement already satisfied: ipywidgets in /usr/local/lib/python3.10/dist-packages (from nemo_toolkit[all]) (7.7.1)\n", - "Collecting jiwer (from nemo_toolkit[all])\n", - " Downloading jiwer-3.0.4-py3-none-any.whl (21 kB)\n", - "Collecting kaldi-python-io (from nemo_toolkit[all])\n", - " Downloading kaldi-python-io-1.2.2.tar.gz (8.8 kB)\n", - " Preparing metadata (setup.py) ... \u001b[?25l\u001b[?25hdone\n", - "Collecting kaldiio (from nemo_toolkit[all])\n", - " Downloading kaldiio-2.18.0-py3-none-any.whl (28 kB)\n", - "Collecting lhotse>=1.22.0 (from nemo_toolkit[all])\n", - " Downloading lhotse-1.23.0-py3-none-any.whl (772 kB)\n", - "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m772.4/772.4 kB\u001b[0m \u001b[31m50.3 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", - "\u001b[?25hRequirement already satisfied: librosa>=0.10.0 in /usr/local/lib/python3.10/dist-packages (from nemo_toolkit[all]) (0.10.2.post1)\n", - "Collecting marshmallow (from nemo_toolkit[all])\n", - " Downloading marshmallow-3.21.2-py3-none-any.whl (49 kB)\n", - "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m49.3/49.3 kB\u001b[0m \u001b[31m5.1 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", - "\u001b[?25hRequirement already satisfied: matplotlib in /usr/local/lib/python3.10/dist-packages (from nemo_toolkit[all]) (3.7.1)\n", - "Requirement already satisfied: packaging in /usr/local/lib/python3.10/dist-packages (from nemo_toolkit[all]) (24.0)\n", - "Collecting pyannote.core (from nemo_toolkit[all])\n", - " Downloading pyannote.core-5.0.0-py3-none-any.whl (58 kB)\n", - "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m58.5/58.5 kB\u001b[0m \u001b[31m5.7 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", - "\u001b[?25hCollecting pyannote.metrics (from nemo_toolkit[all])\n", - " Downloading pyannote.metrics-3.2.1-py3-none-any.whl (51 kB)\n", - "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m51.4/51.4 kB\u001b[0m \u001b[31m6.2 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", - "\u001b[?25hCollecting pydub (from nemo_toolkit[all])\n", - " Downloading pydub-0.25.1-py2.py3-none-any.whl (32 kB)\n", - "Collecting pyloudnorm (from nemo_toolkit[all])\n", - " Downloading pyloudnorm-0.1.1-py3-none-any.whl (9.6 kB)\n", - "Collecting resampy (from nemo_toolkit[all])\n", - " Downloading resampy-0.4.3-py3-none-any.whl (3.1 MB)\n", - "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m3.1/3.1 MB\u001b[0m \u001b[31m82.5 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", - "\u001b[?25hRequirement already satisfied: scipy>=0.14 in /usr/local/lib/python3.10/dist-packages (from nemo_toolkit[all]) (1.11.4)\n", - "Requirement already satisfied: soundfile in /usr/local/lib/python3.10/dist-packages (from nemo_toolkit[all]) (0.12.1)\n", - "Collecting sox (from nemo_toolkit[all])\n", - " Downloading sox-1.5.0.tar.gz (63 kB)\n", - "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m63.9/63.9 kB\u001b[0m \u001b[31m6.9 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", - "\u001b[?25h Preparing metadata (setup.py) ... \u001b[?25l\u001b[?25hdone\n", - "Collecting texterrors (from nemo_toolkit[all])\n", - " Downloading texterrors-0.4.4-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (1.1 MB)\n", - "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m1.1/1.1 MB\u001b[0m \u001b[31m58.1 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", - "\u001b[?25hCollecting accelerated-scan (from nemo_toolkit[all])\n", - " Downloading accelerated_scan-0.2.0-py3-none-any.whl (11 kB)\n", - "Collecting boto3 (from nemo_toolkit[all])\n", - " Downloading boto3-1.34.113-py3-none-any.whl (139 kB)\n", - "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m139.3/139.3 kB\u001b[0m \u001b[31m14.4 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", - "\u001b[?25hCollecting causal-conv1d>=1.2.0 (from nemo_toolkit[all])\n", - " Downloading causal_conv1d-1.2.2.post1.tar.gz (7.2 kB)\n", - " Preparing metadata (setup.py) ... \u001b[?25l\u001b[?25hdone\n", - "Collecting faiss-cpu (from nemo_toolkit[all])\n", - " Downloading faiss_cpu-1.8.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (27.0 MB)\n", - "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m27.0/27.0 MB\u001b[0m \u001b[31m41.7 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", - "\u001b[?25hCollecting fasttext (from nemo_toolkit[all])\n", - " Downloading fasttext-0.9.2.tar.gz (68 kB)\n", - "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m68.8/68.8 kB\u001b[0m \u001b[31m6.0 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", - "\u001b[?25h Preparing metadata (setup.py) ... \u001b[?25l\u001b[?25hdone\n", - "Collecting flask-restful (from nemo_toolkit[all])\n", - " Downloading Flask_RESTful-0.3.10-py2.py3-none-any.whl (26 kB)\n", - "Collecting ftfy (from nemo_toolkit[all])\n", - " Downloading ftfy-6.2.0-py3-none-any.whl (54 kB)\n", - "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m54.4/54.4 kB\u001b[0m \u001b[31m4.9 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", - "\u001b[?25hRequirement already satisfied: gdown in /usr/local/lib/python3.10/dist-packages (from nemo_toolkit[all]) (5.1.0)\n", - "Requirement already satisfied: h5py in /usr/local/lib/python3.10/dist-packages (from nemo_toolkit[all]) (3.9.0)\n", - "Collecting ijson (from nemo_toolkit[all])\n", - " Downloading ijson-3.2.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (111 kB)\n", - "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m111.8/111.8 kB\u001b[0m \u001b[31m11.8 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", - "\u001b[?25hRequirement already satisfied: jieba in /usr/local/lib/python3.10/dist-packages (from nemo_toolkit[all]) (0.42.1)\n", - "Collecting markdown2 (from nemo_toolkit[all])\n", - " Downloading markdown2-2.4.13-py2.py3-none-any.whl (41 kB)\n", - "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m41.3/41.3 kB\u001b[0m \u001b[31m3.9 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", - "\u001b[?25hRequirement already satisfied: nltk>=3.6.5 in /usr/local/lib/python3.10/dist-packages (from nemo_toolkit[all]) (3.8.1)\n", - "Collecting opencc<1.1.7 (from nemo_toolkit[all])\n", - " Downloading OpenCC-1.1.6-cp310-cp310-manylinux1_x86_64.whl (778 kB)\n", - "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m778.3/778.3 kB\u001b[0m \u001b[31m43.3 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", - "\u001b[?25hCollecting pangu (from nemo_toolkit[all])\n", - " Downloading pangu-4.0.6.1-py3-none-any.whl (6.4 kB)\n", - "Collecting rapidfuzz (from nemo_toolkit[all])\n", - " Downloading rapidfuzz-3.9.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (3.4 MB)\n", - "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m3.4/3.4 MB\u001b[0m \u001b[31m76.7 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", - "\u001b[?25hCollecting rouge-score (from nemo_toolkit[all])\n", - " Downloading rouge_score-0.1.2.tar.gz (17 kB)\n", - " Preparing metadata (setup.py) ... \u001b[?25l\u001b[?25hdone\n", - "Collecting sacrebleu (from nemo_toolkit[all])\n", - " Downloading sacrebleu-2.4.2-py3-none-any.whl (106 kB)\n", - "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m106.7/106.7 kB\u001b[0m \u001b[31m11.9 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", - "\u001b[?25hCollecting sentence-transformers (from nemo_toolkit[all])\n", - " Downloading sentence_transformers-2.7.0-py3-none-any.whl (171 kB)\n", - "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m171.5/171.5 kB\u001b[0m \u001b[31m19.9 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", - "\u001b[?25hRequirement already satisfied: tensorstore<0.1.46 in /usr/local/lib/python3.10/dist-packages (from nemo_toolkit[all]) (0.1.45)\n", - "Collecting zarr (from nemo_toolkit[all])\n", - " Downloading zarr-2.18.2-py3-none-any.whl (210 kB)\n", - "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m210.2/210.2 kB\u001b[0m \u001b[31m18.8 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", - "\u001b[?25hCollecting attrdict (from nemo_toolkit[all])\n", - " Downloading attrdict-2.0.1-py2.py3-none-any.whl (9.9 kB)\n", - "Collecting kornia (from nemo_toolkit[all])\n", - " Downloading kornia-0.7.2-py2.py3-none-any.whl (825 kB)\n", - "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m825.4/825.4 kB\u001b[0m \u001b[31m54.6 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", - "\u001b[?25hCollecting pypinyin (from nemo_toolkit[all])\n", - " Downloading pypinyin-0.51.0-py2.py3-none-any.whl (1.4 MB)\n", - "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m1.4/1.4 MB\u001b[0m \u001b[31m62.6 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", - "\u001b[?25hCollecting pypinyin-dict (from nemo_toolkit[all])\n", - " Downloading pypinyin_dict-0.8.0-py2.py3-none-any.whl (9.5 MB)\n", - "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m9.5/9.5 MB\u001b[0m \u001b[31m92.3 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", - "\u001b[?25hCollecting progress>=1.5 (from nemo_toolkit[all])\n", - " Downloading progress-1.6.tar.gz (7.8 kB)\n", - " Preparing metadata (setup.py) ... \u001b[?25l\u001b[?25hdone\n", - "Requirement already satisfied: tabulate>=0.8.7 in /usr/local/lib/python3.10/dist-packages (from nemo_toolkit[all]) (0.9.0)\n", - "Collecting textdistance>=4.1.5 (from nemo_toolkit[all])\n", - " Downloading textdistance-4.6.2-py3-none-any.whl (31 kB)\n", - "Collecting addict (from nemo_toolkit[all])\n", - " Downloading addict-2.4.0-py3-none-any.whl (3.8 kB)\n", - "Collecting clip (from nemo_toolkit[all])\n", - " Downloading clip-0.2.0.tar.gz (5.5 kB)\n", - " Preparing metadata (setup.py) ... \u001b[?25l\u001b[?25hdone\n", - "Collecting decord (from nemo_toolkit[all])\n", - " Downloading decord-0.6.0-py3-none-manylinux2010_x86_64.whl (13.6 MB)\n", - "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m13.6/13.6 MB\u001b[0m \u001b[31m74.3 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", - "\u001b[?25hCollecting diffusers>=0.19.3 (from nemo_toolkit[all])\n", - " Downloading diffusers-0.28.0-py3-none-any.whl (2.2 MB)\n", - "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m2.2/2.2 MB\u001b[0m \u001b[31m59.9 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", - "\u001b[?25hCollecting einops-exts (from nemo_toolkit[all])\n", - " Downloading einops_exts-0.0.4-py3-none-any.whl (3.9 kB)\n", - "Requirement already satisfied: imageio in /usr/local/lib/python3.10/dist-packages (from nemo_toolkit[all]) (2.31.6)\n", - "Collecting nerfacc>=0.5.3 (from nemo_toolkit[all])\n", - " Downloading nerfacc-0.5.3-py3-none-any.whl (54 kB)\n", - "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m54.6/54.6 kB\u001b[0m \u001b[31m5.7 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", - "\u001b[?25hCollecting open-clip-torch (from nemo_toolkit[all])\n", - " Downloading open_clip_torch-2.24.0-py3-none-any.whl (1.5 MB)\n", - "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m1.5/1.5 MB\u001b[0m \u001b[31m58.3 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", - "\u001b[?25hCollecting PyMCubes (from nemo_toolkit[all])\n", - " Downloading PyMCubes-0.1.4-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (274 kB)\n", - "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m274.3/274.3 kB\u001b[0m \u001b[31m19.8 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", - "\u001b[?25hCollecting taming-transformers (from nemo_toolkit[all])\n", - " Downloading taming_transformers-0.0.1-py3-none-any.whl (45 kB)\n", - "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m45.6/45.6 kB\u001b[0m \u001b[31m4.8 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", - "\u001b[?25hCollecting torchdiffeq (from nemo_toolkit[all])\n", - " Downloading torchdiffeq-0.2.3-py3-none-any.whl (31 kB)\n", - "Collecting torchsde (from nemo_toolkit[all])\n", - " Downloading torchsde-0.2.6-py3-none-any.whl (61 kB)\n", - "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m61.2/61.2 kB\u001b[0m \u001b[31m6.2 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", - "\u001b[?25hCollecting trimesh (from nemo_toolkit[all])\n", - " Downloading trimesh-4.4.0-py3-none-any.whl (694 kB)\n", - "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m694.6/694.6 kB\u001b[0m \u001b[31m39.6 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", - "\u001b[?25hCollecting nemo-text-processing (from nemo_toolkit[all])\n", - " Downloading nemo_text_processing-1.0.2-py3-none-any.whl (2.6 MB)\n", - "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m2.6/2.6 MB\u001b[0m \u001b[31m44.1 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", - "\u001b[?25hCollecting mypy-extensions>=0.4.3 (from black~=24.3->nemo_toolkit[all])\n", - " Downloading mypy_extensions-1.0.0-py3-none-any.whl (4.7 kB)\n", - "Collecting pathspec>=0.9.0 (from black~=24.3->nemo_toolkit[all])\n", - " Downloading pathspec-0.12.1-py3-none-any.whl (31 kB)\n", - "Requirement already satisfied: platformdirs>=2 in /usr/local/lib/python3.10/dist-packages (from black~=24.3->nemo_toolkit[all]) (4.2.2)\n", - "Requirement already satisfied: tomli>=1.1.0 in /usr/local/lib/python3.10/dist-packages (from black~=24.3->nemo_toolkit[all]) (2.0.1)\n", - "Requirement already satisfied: typing-extensions>=4.0.1 in /usr/local/lib/python3.10/dist-packages (from black~=24.3->nemo_toolkit[all]) (4.11.0)\n", - "Collecting ninja (from causal-conv1d>=1.2.0->nemo_toolkit[all])\n", - " Downloading ninja-1.11.1.1-py2.py3-none-manylinux1_x86_64.manylinux_2_5_x86_64.whl (307 kB)\n", - "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m307.2/307.2 kB\u001b[0m \u001b[31m25.2 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", - "\u001b[?25hRequirement already satisfied: importlib-metadata in /usr/local/lib/python3.10/dist-packages (from diffusers>=0.19.3->nemo_toolkit[all]) (7.1.0)\n", - "Requirement already satisfied: filelock in /usr/local/lib/python3.10/dist-packages (from diffusers>=0.19.3->nemo_toolkit[all]) (3.14.0)\n", - "Requirement already satisfied: regex!=2019.12.17 in /usr/local/lib/python3.10/dist-packages (from diffusers>=0.19.3->nemo_toolkit[all]) (2023.12.25)\n", - "Requirement already satisfied: requests in /usr/local/lib/python3.10/dist-packages (from diffusers>=0.19.3->nemo_toolkit[all]) (2.31.0)\n", - "Requirement already satisfied: safetensors>=0.3.1 in /usr/local/lib/python3.10/dist-packages (from diffusers>=0.19.3->nemo_toolkit[all]) (0.4.3)\n", - "Requirement already satisfied: Pillow in /usr/local/lib/python3.10/dist-packages (from diffusers>=0.19.3->nemo_toolkit[all]) (9.4.0)\n", - "Requirement already satisfied: fsspec>=2023.5.0 in /usr/local/lib/python3.10/dist-packages (from huggingface-hub>=0.20.3->nemo_toolkit[all]) (2023.6.0)\n", - "Requirement already satisfied: pyyaml>=5.1 in /usr/local/lib/python3.10/dist-packages (from huggingface-hub>=0.20.3->nemo_toolkit[all]) (6.0.1)\n", - "Collecting antlr4-python3-runtime==4.9.* (from hydra-core<=1.3.2,>1.3->nemo_toolkit[all])\n", - " Downloading antlr4-python3-runtime-4.9.3.tar.gz (117 kB)\n", - "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m117.0/117.0 kB\u001b[0m \u001b[31m12.0 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", - "\u001b[?25h Preparing metadata (setup.py) ... \u001b[?25l\u001b[?25hdone\n", - "INFO: pip is looking at multiple versions of jiwer to determine which version is compatible with other requirements. This could take a while.\n", - "Collecting jiwer (from nemo_toolkit[all])\n", - " Downloading jiwer-3.0.3-py3-none-any.whl (21 kB)\n", - " Downloading jiwer-3.0.2-py3-none-any.whl (21 kB)\n", - " Downloading jiwer-3.0.1-py3-none-any.whl (21 kB)\n", - " Downloading jiwer-3.0.0-py3-none-any.whl (21 kB)\n", - " Downloading jiwer-2.6.0-py3-none-any.whl (20 kB)\n", - " Downloading jiwer-2.5.2-py3-none-any.whl (15 kB)\n", - "Collecting rapidfuzz (from nemo_toolkit[all])\n", - " Downloading rapidfuzz-2.13.7-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (2.2 MB)\n", - "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m2.2/2.2 MB\u001b[0m \u001b[31m63.9 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", - "\u001b[?25hRequirement already satisfied: audioread>=2.1.9 in /usr/local/lib/python3.10/dist-packages (from lhotse>=1.22.0->nemo_toolkit[all]) (3.0.1)\n", - "Collecting cytoolz>=0.10.1 (from lhotse>=1.22.0->nemo_toolkit[all])\n", - " Downloading cytoolz-0.12.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (2.0 MB)\n", - "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m2.0/2.0 MB\u001b[0m \u001b[31m63.6 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", - "\u001b[?25hCollecting intervaltree>=3.1.0 (from lhotse>=1.22.0->nemo_toolkit[all])\n", - " Downloading intervaltree-3.1.0.tar.gz (32 kB)\n", - " Preparing metadata (setup.py) ... \u001b[?25l\u001b[?25hdone\n", - "Collecting lilcom>=1.1.0 (from lhotse>=1.22.0->nemo_toolkit[all])\n", - " Downloading lilcom-1.7-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (87 kB)\n", - "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m87.1/87.1 kB\u001b[0m \u001b[31m8.4 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", - "\u001b[?25hRequirement already satisfied: joblib>=0.14 in /usr/local/lib/python3.10/dist-packages (from librosa>=0.10.0->nemo_toolkit[all]) (1.4.2)\n", - "Requirement already satisfied: decorator>=4.3.0 in /usr/local/lib/python3.10/dist-packages (from librosa>=0.10.0->nemo_toolkit[all]) (4.4.2)\n", - "Requirement already satisfied: pooch>=1.1 in /usr/local/lib/python3.10/dist-packages (from librosa>=0.10.0->nemo_toolkit[all]) (1.8.1)\n", - "Requirement already satisfied: soxr>=0.3.2 in /usr/local/lib/python3.10/dist-packages (from librosa>=0.10.0->nemo_toolkit[all]) (0.3.7)\n", - "Requirement already satisfied: lazy-loader>=0.1 in /usr/local/lib/python3.10/dist-packages (from librosa>=0.10.0->nemo_toolkit[all]) (0.4)\n", - "Requirement already satisfied: msgpack>=1.0 in /usr/local/lib/python3.10/dist-packages (from librosa>=0.10.0->nemo_toolkit[all]) (1.0.8)\n", - "Requirement already satisfied: contourpy>=1.0.1 in /usr/local/lib/python3.10/dist-packages (from matplotlib->nemo_toolkit[all]) (1.2.1)\n", - "Requirement already satisfied: cycler>=0.10 in /usr/local/lib/python3.10/dist-packages (from matplotlib->nemo_toolkit[all]) (0.12.1)\n", - "Requirement already satisfied: fonttools>=4.22.0 in /usr/local/lib/python3.10/dist-packages (from matplotlib->nemo_toolkit[all]) (4.51.0)\n", - "Requirement already satisfied: kiwisolver>=1.0.1 in /usr/local/lib/python3.10/dist-packages (from matplotlib->nemo_toolkit[all]) (1.4.5)\n", - "Requirement already satisfied: pyparsing>=2.3.1 in /usr/local/lib/python3.10/dist-packages (from matplotlib->nemo_toolkit[all]) (3.1.2)\n", - "Requirement already satisfied: rich>=12 in /usr/local/lib/python3.10/dist-packages (from nerfacc>=0.5.3->nemo_toolkit[all]) (13.7.1)\n", - "Requirement already satisfied: llvmlite<0.42,>=0.41.0dev0 in /usr/local/lib/python3.10/dist-packages (from numba->nemo_toolkit[all]) (0.41.1)\n", - "Requirement already satisfied: protobuf>=3.20.2 in /usr/local/lib/python3.10/dist-packages (from onnx>=1.7.0->nemo_toolkit[all]) (3.20.3)\n", - "Requirement already satisfied: six>=1.5 in /usr/local/lib/python3.10/dist-packages (from python-dateutil->nemo_toolkit[all]) (1.16.0)\n", - "Collecting lightning-utilities>=0.8.0 (from pytorch-lightning>=2.2.1->nemo_toolkit[all])\n", - " Downloading lightning_utilities-0.11.2-py3-none-any.whl (26 kB)\n", - "Requirement already satisfied: threadpoolctl>=2.0.0 in /usr/local/lib/python3.10/dist-packages (from scikit-learn->nemo_toolkit[all]) (3.5.0)\n", - "Requirement already satisfied: cffi>=1.0 in /usr/local/lib/python3.10/dist-packages (from soundfile->nemo_toolkit[all]) (1.16.0)\n", - "Requirement already satisfied: sympy in /usr/local/lib/python3.10/dist-packages (from torch->nemo_toolkit[all]) (1.12)\n", - "Requirement already satisfied: networkx in /usr/local/lib/python3.10/dist-packages (from torch->nemo_toolkit[all]) (3.3)\n", - "Requirement already satisfied: jinja2 in /usr/local/lib/python3.10/dist-packages (from torch->nemo_toolkit[all]) (3.1.4)\n", - "Collecting nvidia-cuda-nvrtc-cu12==12.1.105 (from torch->nemo_toolkit[all])\n", - " Using cached nvidia_cuda_nvrtc_cu12-12.1.105-py3-none-manylinux1_x86_64.whl (23.7 MB)\n", - "Collecting nvidia-cuda-runtime-cu12==12.1.105 (from torch->nemo_toolkit[all])\n", - " Using cached nvidia_cuda_runtime_cu12-12.1.105-py3-none-manylinux1_x86_64.whl (823 kB)\n", - "Collecting nvidia-cuda-cupti-cu12==12.1.105 (from torch->nemo_toolkit[all])\n", - " Using cached nvidia_cuda_cupti_cu12-12.1.105-py3-none-manylinux1_x86_64.whl (14.1 MB)\n", - "Collecting nvidia-cudnn-cu12==8.9.2.26 (from torch->nemo_toolkit[all])\n", - " Using cached nvidia_cudnn_cu12-8.9.2.26-py3-none-manylinux1_x86_64.whl (731.7 MB)\n", - "Collecting nvidia-cublas-cu12==12.1.3.1 (from torch->nemo_toolkit[all])\n", - " Using cached nvidia_cublas_cu12-12.1.3.1-py3-none-manylinux1_x86_64.whl (410.6 MB)\n", - "Collecting nvidia-cufft-cu12==11.0.2.54 (from torch->nemo_toolkit[all])\n", - " Using cached nvidia_cufft_cu12-11.0.2.54-py3-none-manylinux1_x86_64.whl (121.6 MB)\n", - "Collecting nvidia-curand-cu12==10.3.2.106 (from torch->nemo_toolkit[all])\n", - " Using cached nvidia_curand_cu12-10.3.2.106-py3-none-manylinux1_x86_64.whl (56.5 MB)\n", - "Collecting nvidia-cusolver-cu12==11.4.5.107 (from torch->nemo_toolkit[all])\n", - " Using cached nvidia_cusolver_cu12-11.4.5.107-py3-none-manylinux1_x86_64.whl (124.2 MB)\n", - "Collecting nvidia-cusparse-cu12==12.1.0.106 (from torch->nemo_toolkit[all])\n", - " Using cached nvidia_cusparse_cu12-12.1.0.106-py3-none-manylinux1_x86_64.whl (196.0 MB)\n", - "Collecting nvidia-nccl-cu12==2.20.5 (from torch->nemo_toolkit[all])\n", - " Using cached nvidia_nccl_cu12-2.20.5-py3-none-manylinux2014_x86_64.whl (176.2 MB)\n", - "Collecting nvidia-nvtx-cu12==12.1.105 (from torch->nemo_toolkit[all])\n", - " Using cached nvidia_nvtx_cu12-12.1.105-py3-none-manylinux1_x86_64.whl (99 kB)\n", - "Requirement already satisfied: triton==2.3.0 in /usr/local/lib/python3.10/dist-packages (from torch->nemo_toolkit[all]) (2.3.0)\n", - "Collecting nvidia-nvjitlink-cu12 (from nvidia-cusolver-cu12==11.4.5.107->torch->nemo_toolkit[all])\n", - " Downloading nvidia_nvjitlink_cu12-12.5.40-py3-none-manylinux2014_x86_64.whl (21.3 MB)\n", - "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m21.3/21.3 MB\u001b[0m \u001b[31m57.8 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", - "\u001b[?25hRequirement already satisfied: tokenizers<0.20,>=0.19 in /usr/local/lib/python3.10/dist-packages (from transformers<=4.40.2,>=4.36.0->nemo_toolkit[all]) (0.19.1)\n", - "Collecting botocore<1.35.0,>=1.34.113 (from boto3->nemo_toolkit[all])\n", - " Downloading botocore-1.34.113-py3-none-any.whl (12.3 MB)\n", - "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m12.3/12.3 MB\u001b[0m \u001b[31m63.2 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", - "\u001b[?25hCollecting jmespath<2.0.0,>=0.7.1 (from boto3->nemo_toolkit[all])\n", - " Downloading jmespath-1.0.1-py3-none-any.whl (20 kB)\n", - "Collecting s3transfer<0.11.0,>=0.10.0 (from boto3->nemo_toolkit[all])\n", - " Downloading s3transfer-0.10.1-py3-none-any.whl (82 kB)\n", - "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m82.2/82.2 kB\u001b[0m \u001b[31m7.1 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", - "\u001b[?25hRequirement already satisfied: pyarrow>=12.0.0 in /usr/local/lib/python3.10/dist-packages (from datasets->nemo_toolkit[all]) (14.0.2)\n", - "Requirement already satisfied: pyarrow-hotfix in /usr/local/lib/python3.10/dist-packages (from datasets->nemo_toolkit[all]) (0.6)\n", - "Collecting dill<0.3.9,>=0.3.0 (from datasets->nemo_toolkit[all])\n", - " Downloading dill-0.3.8-py3-none-any.whl (116 kB)\n", - "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m116.3/116.3 kB\u001b[0m \u001b[31m12.7 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", - "\u001b[?25hCollecting xxhash (from datasets->nemo_toolkit[all])\n", - " Downloading xxhash-3.4.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (194 kB)\n", - "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m194.1/194.1 kB\u001b[0m \u001b[31m17.5 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", - "\u001b[?25hCollecting multiprocess (from datasets->nemo_toolkit[all])\n", - " Downloading multiprocess-0.70.16-py310-none-any.whl (134 kB)\n", - "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m134.8/134.8 kB\u001b[0m \u001b[31m15.4 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", - "\u001b[?25hRequirement already satisfied: aiohttp in /usr/local/lib/python3.10/dist-packages (from datasets->nemo_toolkit[all]) (3.9.5)\n", - "Collecting pybind11>=2.2 (from fasttext->nemo_toolkit[all])\n", - " Using cached pybind11-2.12.0-py3-none-any.whl (234 kB)\n", - "Requirement already satisfied: absl-py in /usr/local/lib/python3.10/dist-packages (from fiddle->nemo_toolkit[all]) (1.4.0)\n", - "Requirement already satisfied: graphviz in /usr/local/lib/python3.10/dist-packages (from fiddle->nemo_toolkit[all]) (0.20.3)\n", - "Collecting libcst (from fiddle->nemo_toolkit[all])\n", - " Downloading libcst-1.4.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (2.3 MB)\n", - "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m2.3/2.3 MB\u001b[0m \u001b[31m72.7 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", - "\u001b[?25hCollecting aniso8601>=0.82 (from flask-restful->nemo_toolkit[all])\n", - " Downloading aniso8601-9.0.1-py2.py3-none-any.whl (52 kB)\n", - "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m52.8/52.8 kB\u001b[0m \u001b[31m5.5 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", - "\u001b[?25hRequirement already satisfied: Flask>=0.8 in /usr/local/lib/python3.10/dist-packages (from flask-restful->nemo_toolkit[all]) (2.2.5)\n", - "Requirement already satisfied: pytz in /usr/local/lib/python3.10/dist-packages (from flask-restful->nemo_toolkit[all]) (2023.4)\n", - "Requirement already satisfied: wcwidth<0.3.0,>=0.2.12 in /usr/local/lib/python3.10/dist-packages (from ftfy->nemo_toolkit[all]) (0.2.13)\n", - "Collecting distance>=0.1.3 (from g2p-en->nemo_toolkit[all])\n", - " Downloading Distance-0.1.3.tar.gz (180 kB)\n", - "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m180.3/180.3 kB\u001b[0m \u001b[31m16.4 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", - "\u001b[?25h Preparing metadata (setup.py) ... \u001b[?25l\u001b[?25hdone\n", - "Requirement already satisfied: pydantic>=1.9.1 in /usr/local/lib/python3.10/dist-packages (from inflect->nemo_toolkit[all]) (2.7.1)\n", - "Requirement already satisfied: beautifulsoup4 in /usr/local/lib/python3.10/dist-packages (from gdown->nemo_toolkit[all]) (4.12.3)\n", - "Requirement already satisfied: ipykernel>=4.5.1 in /usr/local/lib/python3.10/dist-packages (from ipywidgets->nemo_toolkit[all]) (5.5.6)\n", - "Requirement already satisfied: ipython-genutils~=0.2.0 in /usr/local/lib/python3.10/dist-packages (from ipywidgets->nemo_toolkit[all]) (0.2.0)\n", - "Requirement already satisfied: traitlets>=4.3.1 in /usr/local/lib/python3.10/dist-packages (from ipywidgets->nemo_toolkit[all]) (5.7.1)\n", - "Requirement already satisfied: widgetsnbextension~=3.6.0 in /usr/local/lib/python3.10/dist-packages (from ipywidgets->nemo_toolkit[all]) (3.6.6)\n", - "Requirement already satisfied: ipython>=4.0.0 in /usr/local/lib/python3.10/dist-packages (from ipywidgets->nemo_toolkit[all]) (7.34.0)\n", - "Requirement already satisfied: jupyterlab-widgets>=1.0.0 in /usr/local/lib/python3.10/dist-packages (from ipywidgets->nemo_toolkit[all]) (3.0.10)\n", - "Collecting kornia-rs>=0.1.0 (from kornia->nemo_toolkit[all])\n", - " Downloading kornia_rs-0.1.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (2.4 MB)\n", - "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m2.4/2.4 MB\u001b[0m \u001b[31m75.9 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", - "\u001b[?25hCollecting cdifflib (from nemo-text-processing->nemo_toolkit[all])\n", - " Downloading cdifflib-1.2.6.tar.gz (11 kB)\n", - " Installing build dependencies ... \u001b[?25l\u001b[?25hdone\n", - " Getting requirements to build wheel ... \u001b[?25l\u001b[?25hdone\n", - " Installing backend dependencies ... \u001b[?25l\u001b[?25hdone\n", - " Preparing metadata (pyproject.toml) ... \u001b[?25l\u001b[?25hdone\n", - "Collecting pynini==2.1.5 (from nemo-text-processing->nemo_toolkit[all])\n", - " Downloading pynini-2.1.5-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (161.3 MB)\n", - "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m161.3/161.3 MB\u001b[0m \u001b[31m7.1 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", - "\u001b[?25hRequirement already satisfied: Cython>=0.29 in /usr/local/lib/python3.10/dist-packages (from pynini==2.1.5->nemo-text-processing->nemo_toolkit[all]) (3.0.10)\n", - "Requirement already satisfied: torchvision in /usr/local/lib/python3.10/dist-packages (from open-clip-torch->nemo_toolkit[all]) (0.18.0+cu121)\n", - "Collecting timm (from open-clip-torch->nemo_toolkit[all])\n", - " Downloading timm-1.0.3-py3-none-any.whl (2.3 MB)\n", - "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m2.3/2.3 MB\u001b[0m \u001b[31m58.7 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", - "\u001b[?25hRequirement already satisfied: tzdata>=2022.1 in /usr/local/lib/python3.10/dist-packages (from pandas->nemo_toolkit[all]) (2024.1)\n", - "Requirement already satisfied: sortedcontainers>=2.0.4 in /usr/local/lib/python3.10/dist-packages (from pyannote.core->nemo_toolkit[all]) (2.4.0)\n", - "Collecting pyannote.database>=4.0.1 (from pyannote.metrics->nemo_toolkit[all])\n", - " Downloading pyannote.database-5.1.0-py3-none-any.whl (48 kB)\n", - "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m48.1/48.1 kB\u001b[0m \u001b[31m3.8 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", - "\u001b[?25hCollecting docopt>=0.6.2 (from pyannote.metrics->nemo_toolkit[all])\n", - " Downloading docopt-0.6.2.tar.gz (25 kB)\n", - " Preparing metadata (setup.py) ... \u001b[?25l\u001b[?25hdone\n", - "Requirement already satisfied: future>=0.16.0 in /usr/local/lib/python3.10/dist-packages (from pyloudnorm->nemo_toolkit[all]) (0.18.3)\n", - "Requirement already satisfied: iniconfig in /usr/local/lib/python3.10/dist-packages (from pytest->nemo_toolkit[all]) (2.0.0)\n", - "Requirement already satisfied: pluggy<2.0,>=0.12 in /usr/local/lib/python3.10/dist-packages (from pytest->nemo_toolkit[all]) (1.5.0)\n", - "Requirement already satisfied: exceptiongroup>=1.0.0rc8 in /usr/local/lib/python3.10/dist-packages (from pytest->nemo_toolkit[all]) (1.2.1)\n", - "Collecting ruamel.yaml.clib>=0.2.7 (from ruamel.yaml->nemo_toolkit[all])\n", - " Downloading ruamel.yaml.clib-0.2.8-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl (526 kB)\n", - "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m526.7/526.7 kB\u001b[0m \u001b[31m30.4 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", - "\u001b[?25hCollecting portalocker (from sacrebleu->nemo_toolkit[all])\n", - " Downloading portalocker-2.8.2-py3-none-any.whl (17 kB)\n", - "Collecting colorama (from sacrebleu->nemo_toolkit[all])\n", - " Downloading colorama-0.4.6-py2.py3-none-any.whl (25 kB)\n", - "Requirement already satisfied: lxml in /usr/local/lib/python3.10/dist-packages (from sacrebleu->nemo_toolkit[all]) (4.9.4)\n", - "Requirement already satisfied: sphinxcontrib-applehelp in /usr/local/lib/python3.10/dist-packages (from sphinx->nemo_toolkit[all]) (1.0.8)\n", - "Requirement already satisfied: sphinxcontrib-devhelp in /usr/local/lib/python3.10/dist-packages (from sphinx->nemo_toolkit[all]) (1.0.6)\n", - "Requirement already satisfied: sphinxcontrib-jsmath in /usr/local/lib/python3.10/dist-packages (from sphinx->nemo_toolkit[all]) (1.0.1)\n", - "Requirement already satisfied: sphinxcontrib-htmlhelp>=2.0.0 in /usr/local/lib/python3.10/dist-packages (from sphinx->nemo_toolkit[all]) (2.0.5)\n", - "Requirement already satisfied: sphinxcontrib-serializinghtml>=1.1.5 in /usr/local/lib/python3.10/dist-packages (from sphinx->nemo_toolkit[all]) (1.1.10)\n", - "Requirement already satisfied: sphinxcontrib-qthelp in /usr/local/lib/python3.10/dist-packages (from sphinx->nemo_toolkit[all]) (1.0.7)\n", - "Requirement already satisfied: Pygments>=2.0 in /usr/local/lib/python3.10/dist-packages (from sphinx->nemo_toolkit[all]) (2.16.1)\n", - "Requirement already satisfied: docutils<0.19,>=0.14 in /usr/local/lib/python3.10/dist-packages (from sphinx->nemo_toolkit[all]) (0.18.1)\n", - "Requirement already satisfied: snowballstemmer>=1.1 in /usr/local/lib/python3.10/dist-packages (from sphinx->nemo_toolkit[all]) (2.2.0)\n", - "Requirement already satisfied: babel>=1.3 in /usr/local/lib/python3.10/dist-packages (from sphinx->nemo_toolkit[all]) (2.15.0)\n", - "Requirement already satisfied: alabaster<0.8,>=0.7 in /usr/local/lib/python3.10/dist-packages (from sphinx->nemo_toolkit[all]) (0.7.16)\n", - "Requirement already satisfied: imagesize in /usr/local/lib/python3.10/dist-packages (from sphinx->nemo_toolkit[all]) (1.4.1)\n", - "Collecting docutils<0.19,>=0.14 (from sphinx->nemo_toolkit[all])\n", - " Downloading docutils-0.17.1-py2.py3-none-any.whl (575 kB)\n", - "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m575.5/575.5 kB\u001b[0m \u001b[31m34.7 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", - "\u001b[?25hCollecting pybtex>=0.24 (from sphinxcontrib-bibtex->nemo_toolkit[all])\n", - " Downloading pybtex-0.24.0-py2.py3-none-any.whl (561 kB)\n", - "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m561.4/561.4 kB\u001b[0m \u001b[31m32.6 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", - "\u001b[?25hCollecting pybtex-docutils>=1.0.0 (from sphinxcontrib-bibtex->nemo_toolkit[all])\n", - " Downloading pybtex_docutils-1.0.3-py3-none-any.whl (6.4 kB)\n", - "Requirement already satisfied: grpcio>=1.48.2 in /usr/local/lib/python3.10/dist-packages (from tensorboard->nemo_toolkit[all]) (1.64.0)\n", - "Requirement already satisfied: google-auth<3,>=1.6.3 in /usr/local/lib/python3.10/dist-packages (from tensorboard->nemo_toolkit[all]) (2.27.0)\n", - "Requirement already satisfied: google-auth-oauthlib<2,>=0.5 in /usr/local/lib/python3.10/dist-packages (from tensorboard->nemo_toolkit[all]) (1.2.0)\n", - "Requirement already satisfied: markdown>=2.6.8 in /usr/local/lib/python3.10/dist-packages (from tensorboard->nemo_toolkit[all]) (3.6)\n", - "Requirement already satisfied: tensorboard-data-server<0.8.0,>=0.7.0 in /usr/local/lib/python3.10/dist-packages (from tensorboard->nemo_toolkit[all]) (0.7.2)\n", - "Requirement already satisfied: werkzeug>=1.0.1 in /usr/local/lib/python3.10/dist-packages (from tensorboard->nemo_toolkit[all]) (3.0.3)\n", - "Collecting plac (from texterrors->nemo_toolkit[all])\n", - " Downloading plac-1.4.3-py2.py3-none-any.whl (22 kB)\n", - "Collecting loguru (from texterrors->nemo_toolkit[all])\n", - " Downloading loguru-0.7.2-py3-none-any.whl (62 kB)\n", - "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m62.5/62.5 kB\u001b[0m \u001b[31m6.3 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", - "\u001b[?25hRequirement already satisfied: termcolor in /usr/local/lib/python3.10/dist-packages (from texterrors->nemo_toolkit[all]) (2.4.0)\n", - "Collecting Levenshtein (from texterrors->nemo_toolkit[all])\n", - " Downloading Levenshtein-0.25.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (177 kB)\n", - "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m177.4/177.4 kB\u001b[0m \u001b[31m13.9 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", - "\u001b[?25hCollecting trampoline>=0.1.2 (from torchsde->nemo_toolkit[all])\n", - " Downloading trampoline-0.1.2-py3-none-any.whl (5.2 kB)\n", - "Collecting docker-pycreds>=0.4.0 (from wandb->nemo_toolkit[all])\n", - " Downloading docker_pycreds-0.4.0-py2.py3-none-any.whl (9.0 kB)\n", - "Collecting gitpython!=3.1.29,>=1.0.0 (from wandb->nemo_toolkit[all])\n", - " Downloading GitPython-3.1.43-py3-none-any.whl (207 kB)\n", - "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m207.3/207.3 kB\u001b[0m \u001b[31m19.3 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", - "\u001b[?25hRequirement already satisfied: psutil>=5.0.0 in /usr/local/lib/python3.10/dist-packages (from wandb->nemo_toolkit[all]) (5.9.5)\n", - "Collecting sentry-sdk>=1.0.0 (from wandb->nemo_toolkit[all])\n", - " Downloading sentry_sdk-2.3.1-py2.py3-none-any.whl (289 kB)\n", - "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m289.0/289.0 kB\u001b[0m \u001b[31m25.3 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", - "\u001b[?25hCollecting setproctitle (from wandb->nemo_toolkit[all])\n", - " Downloading setproctitle-1.3.3-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl (30 kB)\n", - "Collecting asciitree (from zarr->nemo_toolkit[all])\n", - " Downloading asciitree-0.3.3.tar.gz (4.0 kB)\n", - " Preparing metadata (setup.py) ... \u001b[?25l\u001b[?25hdone\n", - "Collecting numcodecs>=0.10.0 (from zarr->nemo_toolkit[all])\n", - " Downloading numcodecs-0.12.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (7.7 MB)\n", - "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m7.7/7.7 MB\u001b[0m \u001b[31m86.5 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", - "\u001b[?25hCollecting fasteners (from zarr->nemo_toolkit[all])\n", - " Downloading fasteners-0.19-py3-none-any.whl (18 kB)\n", - "Requirement already satisfied: urllib3!=2.2.0,<3,>=1.25.4 in /usr/local/lib/python3.10/dist-packages (from botocore<1.35.0,>=1.34.113->boto3->nemo_toolkit[all]) (2.0.7)\n", - "Requirement already satisfied: pycparser in /usr/local/lib/python3.10/dist-packages (from cffi>=1.0->soundfile->nemo_toolkit[all]) (2.22)\n", - "Requirement already satisfied: toolz>=0.8.0 in /usr/local/lib/python3.10/dist-packages (from cytoolz>=0.10.1->lhotse>=1.22.0->nemo_toolkit[all]) (0.12.1)\n", - "Requirement already satisfied: itsdangerous>=2.0 in /usr/local/lib/python3.10/dist-packages (from Flask>=0.8->flask-restful->nemo_toolkit[all]) (2.2.0)\n", - "Requirement already satisfied: aiosignal>=1.1.2 in /usr/local/lib/python3.10/dist-packages (from aiohttp->datasets->nemo_toolkit[all]) (1.3.1)\n", - "Requirement already satisfied: attrs>=17.3.0 in /usr/local/lib/python3.10/dist-packages (from aiohttp->datasets->nemo_toolkit[all]) (23.2.0)\n", - "Requirement already satisfied: frozenlist>=1.1.1 in /usr/local/lib/python3.10/dist-packages (from aiohttp->datasets->nemo_toolkit[all]) (1.4.1)\n", - "Requirement already satisfied: multidict<7.0,>=4.5 in /usr/local/lib/python3.10/dist-packages (from aiohttp->datasets->nemo_toolkit[all]) (6.0.5)\n", - "Requirement already satisfied: yarl<2.0,>=1.0 in /usr/local/lib/python3.10/dist-packages (from aiohttp->datasets->nemo_toolkit[all]) (1.9.4)\n", - "Requirement already satisfied: async-timeout<5.0,>=4.0 in /usr/local/lib/python3.10/dist-packages (from aiohttp->datasets->nemo_toolkit[all]) (4.0.3)\n", - "Collecting gitdb<5,>=4.0.1 (from gitpython!=3.1.29,>=1.0.0->wandb->nemo_toolkit[all])\n", - " Downloading gitdb-4.0.11-py3-none-any.whl (62 kB)\n", - "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m62.7/62.7 kB\u001b[0m \u001b[31m6.6 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", - "\u001b[?25hRequirement already satisfied: cachetools<6.0,>=2.0.0 in /usr/local/lib/python3.10/dist-packages (from google-auth<3,>=1.6.3->tensorboard->nemo_toolkit[all]) (5.3.3)\n", - "Requirement already satisfied: pyasn1-modules>=0.2.1 in /usr/local/lib/python3.10/dist-packages (from google-auth<3,>=1.6.3->tensorboard->nemo_toolkit[all]) (0.4.0)\n", - "Requirement already satisfied: rsa<5,>=3.1.4 in /usr/local/lib/python3.10/dist-packages (from google-auth<3,>=1.6.3->tensorboard->nemo_toolkit[all]) (4.9)\n", - "Requirement already satisfied: requests-oauthlib>=0.7.0 in /usr/local/lib/python3.10/dist-packages (from google-auth-oauthlib<2,>=0.5->tensorboard->nemo_toolkit[all]) (1.3.1)\n", - "Requirement already satisfied: jupyter-client in /usr/local/lib/python3.10/dist-packages (from ipykernel>=4.5.1->ipywidgets->nemo_toolkit[all]) (6.1.12)\n", - "Requirement already satisfied: tornado>=4.2 in /usr/local/lib/python3.10/dist-packages (from ipykernel>=4.5.1->ipywidgets->nemo_toolkit[all]) (6.3.3)\n", - "Collecting jedi>=0.16 (from ipython>=4.0.0->ipywidgets->nemo_toolkit[all])\n", - " Downloading jedi-0.19.1-py2.py3-none-any.whl (1.6 MB)\n", - "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m1.6/1.6 MB\u001b[0m \u001b[31m64.9 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", - "\u001b[?25hRequirement already satisfied: pickleshare in /usr/local/lib/python3.10/dist-packages (from ipython>=4.0.0->ipywidgets->nemo_toolkit[all]) (0.7.5)\n", - "Requirement already satisfied: prompt-toolkit!=3.0.0,!=3.0.1,<3.1.0,>=2.0.0 in /usr/local/lib/python3.10/dist-packages (from ipython>=4.0.0->ipywidgets->nemo_toolkit[all]) (3.0.43)\n", - "Requirement already satisfied: backcall in /usr/local/lib/python3.10/dist-packages (from ipython>=4.0.0->ipywidgets->nemo_toolkit[all]) (0.2.0)\n", - "Requirement already satisfied: matplotlib-inline in /usr/local/lib/python3.10/dist-packages (from ipython>=4.0.0->ipywidgets->nemo_toolkit[all]) (0.1.7)\n", - "Requirement already satisfied: pexpect>4.3 in /usr/local/lib/python3.10/dist-packages (from ipython>=4.0.0->ipywidgets->nemo_toolkit[all]) (4.9.0)\n", - "Requirement already satisfied: MarkupSafe>=2.0 in /usr/local/lib/python3.10/dist-packages (from jinja2->torch->nemo_toolkit[all]) (2.1.5)\n", - "Collecting typer>=0.12.1 (from pyannote.database>=4.0.1->pyannote.metrics->nemo_toolkit[all])\n", - " Downloading typer-0.12.3-py3-none-any.whl (47 kB)\n", - "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m47.2/47.2 kB\u001b[0m \u001b[31m4.8 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", - "\u001b[?25hCollecting latexcodec>=1.0.4 (from pybtex>=0.24->sphinxcontrib-bibtex->nemo_toolkit[all])\n", - " Downloading latexcodec-3.0.0-py3-none-any.whl (18 kB)\n", - "Requirement already satisfied: annotated-types>=0.4.0 in /usr/local/lib/python3.10/dist-packages (from pydantic>=1.9.1->inflect->nemo_toolkit[all]) (0.7.0)\n", - "Requirement already satisfied: pydantic-core==2.18.2 in /usr/local/lib/python3.10/dist-packages (from pydantic>=1.9.1->inflect->nemo_toolkit[all]) (2.18.2)\n", - "Requirement already satisfied: charset-normalizer<4,>=2 in /usr/local/lib/python3.10/dist-packages (from requests->diffusers>=0.19.3->nemo_toolkit[all]) (3.3.2)\n", - "Requirement already satisfied: idna<4,>=2.5 in /usr/local/lib/python3.10/dist-packages (from requests->diffusers>=0.19.3->nemo_toolkit[all]) (3.7)\n", - "Requirement already satisfied: certifi>=2017.4.17 in /usr/local/lib/python3.10/dist-packages (from requests->diffusers>=0.19.3->nemo_toolkit[all]) (2024.2.2)\n", - "Requirement already satisfied: markdown-it-py>=2.2.0 in /usr/local/lib/python3.10/dist-packages (from rich>=12->nerfacc>=0.5.3->nemo_toolkit[all]) (3.0.0)\n", - "Requirement already satisfied: mpmath>=0.19 in /usr/local/lib/python3.10/dist-packages (from sympy->torch->nemo_toolkit[all]) (1.3.0)\n", - "Requirement already satisfied: notebook>=4.4.1 in /usr/local/lib/python3.10/dist-packages (from widgetsnbextension~=3.6.0->ipywidgets->nemo_toolkit[all]) (6.5.5)\n", - "Requirement already satisfied: soupsieve>1.2 in /usr/local/lib/python3.10/dist-packages (from beautifulsoup4->gdown->nemo_toolkit[all]) (2.5)\n", - "Requirement already satisfied: zipp>=0.5 in /usr/local/lib/python3.10/dist-packages (from importlib-metadata->diffusers>=0.19.3->nemo_toolkit[all]) (3.18.2)\n", - "INFO: pip is looking at multiple versions of levenshtein to determine which version is compatible with other requirements. This could take a while.\n", - "Collecting Levenshtein (from texterrors->nemo_toolkit[all])\n", - " Downloading Levenshtein-0.25.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (177 kB)\n", - "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m177.4/177.4 kB\u001b[0m \u001b[31m16.0 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", - "\u001b[?25h Downloading Levenshtein-0.24.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (177 kB)\n", - "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m177.4/177.4 kB\u001b[0m \u001b[31m19.1 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", - "\u001b[?25h Downloading Levenshtein-0.23.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (169 kB)\n", - "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m169.4/169.4 kB\u001b[0m \u001b[31m19.2 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", - "\u001b[?25h Downloading Levenshtein-0.22.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (172 kB)\n", - "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m172.9/172.9 kB\u001b[0m \u001b[31m16.1 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", - "\u001b[?25hRequirement already satisfied: PySocks!=1.5.7,>=1.5.6 in /usr/local/lib/python3.10/dist-packages (from requests->diffusers>=0.19.3->nemo_toolkit[all]) (1.7.1)\n", - "Collecting smmap<6,>=3.0.1 (from gitdb<5,>=4.0.1->gitpython!=3.1.29,>=1.0.0->wandb->nemo_toolkit[all])\n", - " Downloading smmap-5.0.1-py3-none-any.whl (24 kB)\n", - "Requirement already satisfied: parso<0.9.0,>=0.8.3 in /usr/local/lib/python3.10/dist-packages (from jedi>=0.16->ipython>=4.0.0->ipywidgets->nemo_toolkit[all]) (0.8.4)\n", - "Requirement already satisfied: mdurl~=0.1 in /usr/local/lib/python3.10/dist-packages (from markdown-it-py>=2.2.0->rich>=12->nerfacc>=0.5.3->nemo_toolkit[all]) (0.1.2)\n", - "Requirement already satisfied: pyzmq<25,>=17 in /usr/local/lib/python3.10/dist-packages (from notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets->nemo_toolkit[all]) (24.0.1)\n", - "Requirement already satisfied: argon2-cffi in /usr/local/lib/python3.10/dist-packages (from notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets->nemo_toolkit[all]) (23.1.0)\n", - "Requirement already satisfied: jupyter-core>=4.6.1 in /usr/local/lib/python3.10/dist-packages (from notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets->nemo_toolkit[all]) (5.7.2)\n", - "Requirement already satisfied: nbformat in /usr/local/lib/python3.10/dist-packages (from notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets->nemo_toolkit[all]) (5.10.4)\n", - "Requirement already satisfied: nbconvert>=5 in /usr/local/lib/python3.10/dist-packages (from notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets->nemo_toolkit[all]) (6.5.4)\n", - "Requirement already satisfied: nest-asyncio>=1.5 in /usr/local/lib/python3.10/dist-packages (from notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets->nemo_toolkit[all]) (1.6.0)\n", - "Requirement already satisfied: Send2Trash>=1.8.0 in /usr/local/lib/python3.10/dist-packages (from notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets->nemo_toolkit[all]) (1.8.3)\n", - "Requirement already satisfied: terminado>=0.8.3 in /usr/local/lib/python3.10/dist-packages (from notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets->nemo_toolkit[all]) (0.18.1)\n", - "Requirement already satisfied: prometheus-client in /usr/local/lib/python3.10/dist-packages (from notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets->nemo_toolkit[all]) (0.20.0)\n", - "Requirement already satisfied: nbclassic>=0.4.7 in /usr/local/lib/python3.10/dist-packages (from notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets->nemo_toolkit[all]) (1.0.0)\n", - "Requirement already satisfied: ptyprocess>=0.5 in /usr/local/lib/python3.10/dist-packages (from pexpect>4.3->ipython>=4.0.0->ipywidgets->nemo_toolkit[all]) (0.7.0)\n", - "Requirement already satisfied: pyasn1<0.7.0,>=0.4.6 in /usr/local/lib/python3.10/dist-packages (from pyasn1-modules>=0.2.1->google-auth<3,>=1.6.3->tensorboard->nemo_toolkit[all]) (0.6.0)\n", - "Requirement already satisfied: oauthlib>=3.0.0 in /usr/local/lib/python3.10/dist-packages (from requests-oauthlib>=0.7.0->google-auth-oauthlib<2,>=0.5->tensorboard->nemo_toolkit[all]) (3.2.2)\n", - "Collecting shellingham>=1.3.0 (from typer>=0.12.1->pyannote.database>=4.0.1->pyannote.metrics->nemo_toolkit[all])\n", - " Downloading shellingham-1.5.4-py2.py3-none-any.whl (9.8 kB)\n", - "Requirement already satisfied: jupyter-server>=1.8 in /usr/local/lib/python3.10/dist-packages (from nbclassic>=0.4.7->notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets->nemo_toolkit[all]) (1.24.0)\n", - "Requirement already satisfied: notebook-shim>=0.2.3 in /usr/local/lib/python3.10/dist-packages (from nbclassic>=0.4.7->notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets->nemo_toolkit[all]) (0.2.4)\n", - "Requirement already satisfied: bleach in /usr/local/lib/python3.10/dist-packages (from nbconvert>=5->notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets->nemo_toolkit[all]) (6.1.0)\n", - "Requirement already satisfied: defusedxml in /usr/local/lib/python3.10/dist-packages (from nbconvert>=5->notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets->nemo_toolkit[all]) (0.7.1)\n", - "Requirement already satisfied: entrypoints>=0.2.2 in /usr/local/lib/python3.10/dist-packages (from nbconvert>=5->notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets->nemo_toolkit[all]) (0.4)\n", - "Requirement already satisfied: jupyterlab-pygments in /usr/local/lib/python3.10/dist-packages (from nbconvert>=5->notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets->nemo_toolkit[all]) (0.3.0)\n", - "Requirement already satisfied: mistune<2,>=0.8.1 in /usr/local/lib/python3.10/dist-packages (from nbconvert>=5->notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets->nemo_toolkit[all]) (0.8.4)\n", - "Requirement already satisfied: nbclient>=0.5.0 in /usr/local/lib/python3.10/dist-packages (from nbconvert>=5->notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets->nemo_toolkit[all]) (0.10.0)\n", - "Requirement already satisfied: pandocfilters>=1.4.1 in /usr/local/lib/python3.10/dist-packages (from nbconvert>=5->notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets->nemo_toolkit[all]) (1.5.1)\n", - "Requirement already satisfied: tinycss2 in /usr/local/lib/python3.10/dist-packages (from nbconvert>=5->notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets->nemo_toolkit[all]) (1.3.0)\n", - "Requirement already satisfied: fastjsonschema>=2.15 in /usr/local/lib/python3.10/dist-packages (from nbformat->notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets->nemo_toolkit[all]) (2.19.1)\n", - "Requirement already satisfied: jsonschema>=2.6 in /usr/local/lib/python3.10/dist-packages (from nbformat->notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets->nemo_toolkit[all]) (4.19.2)\n", - "Requirement already satisfied: argon2-cffi-bindings in /usr/local/lib/python3.10/dist-packages (from argon2-cffi->notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets->nemo_toolkit[all]) (21.2.0)\n", - "Requirement already satisfied: jsonschema-specifications>=2023.03.6 in /usr/local/lib/python3.10/dist-packages (from jsonschema>=2.6->nbformat->notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets->nemo_toolkit[all]) (2023.12.1)\n", - "Requirement already satisfied: referencing>=0.28.4 in /usr/local/lib/python3.10/dist-packages (from jsonschema>=2.6->nbformat->notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets->nemo_toolkit[all]) (0.35.1)\n", - "Requirement already satisfied: rpds-py>=0.7.1 in /usr/local/lib/python3.10/dist-packages (from jsonschema>=2.6->nbformat->notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets->nemo_toolkit[all]) (0.18.1)\n", - "Requirement already satisfied: anyio<4,>=3.1.0 in /usr/local/lib/python3.10/dist-packages (from jupyter-server>=1.8->nbclassic>=0.4.7->notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets->nemo_toolkit[all]) (3.7.1)\n", - "Requirement already satisfied: websocket-client in /usr/local/lib/python3.10/dist-packages (from jupyter-server>=1.8->nbclassic>=0.4.7->notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets->nemo_toolkit[all]) (1.8.0)\n", - "Requirement already satisfied: webencodings in /usr/local/lib/python3.10/dist-packages (from bleach->nbconvert>=5->notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets->nemo_toolkit[all]) (0.5.1)\n", - "Requirement already satisfied: sniffio>=1.1 in /usr/local/lib/python3.10/dist-packages (from anyio<4,>=3.1.0->jupyter-server>=1.8->nbclassic>=0.4.7->notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets->nemo_toolkit[all]) (1.3.1)\n", - "Building wheels for collected packages: causal-conv1d, antlr4-python3-runtime, progress, clip, fasttext, kaldi-python-io, nemo_toolkit, rouge-score, sox, distance, docopt, intervaltree, asciitree, cdifflib\n", - " Building wheel for causal-conv1d (setup.py) ... \u001b[?25l\u001b[?25hdone\n", - " Created wheel for causal-conv1d: filename=causal_conv1d-1.2.2.post1-cp310-cp310-linux_x86_64.whl size=103643300 sha256=2bba8823ae89bd79c2d067978e0e533fab8298f69855bfc5d199828b278cf66c\n", - " Stored in directory: /root/.cache/pip/wheels/22/a7/db/0c9482dec3707ad23181b0eb2da40e4b8f26aaed49752fc49f\n", - " Building wheel for antlr4-python3-runtime (setup.py) ... \u001b[?25l\u001b[?25hdone\n", - " Created wheel for antlr4-python3-runtime: filename=antlr4_python3_runtime-4.9.3-py3-none-any.whl size=144554 sha256=5ba620ca9da88d714c879b4a21820b9bdebd36fb76051b0b48a375e2e4f0fcb7\n", - " Stored in directory: /root/.cache/pip/wheels/12/93/dd/1f6a127edc45659556564c5730f6d4e300888f4bca2d4c5a88\n", - " Building wheel for progress (setup.py) ... \u001b[?25l\u001b[?25hdone\n", - " Created wheel for progress: filename=progress-1.6-py3-none-any.whl size=9614 sha256=8102705b8ef612530f059a82dde5ea899c85e387fb8c5e956ed0fef5f2929103\n", - " Stored in directory: /root/.cache/pip/wheels/a2/68/5f/c339b20a41659d856c93ccdce6a33095493eb82c3964aac5a1\n", - " Building wheel for clip (setup.py) ... \u001b[?25l\u001b[?25hdone\n", - " Created wheel for clip: filename=clip-0.2.0-py3-none-any.whl size=6989 sha256=d8ab11e4cbc0837cde86e4c7011ffabab187b9937f98e39480bb87ec75a34740\n", - " Stored in directory: /root/.cache/pip/wheels/7f/5c/e6/2c0fdb453a3569188864b17e9676bea8b3b7e160c037117869\n", - " Building wheel for fasttext (setup.py) ... \u001b[?25l\u001b[?25hdone\n", - " Created wheel for fasttext: filename=fasttext-0.9.2-cp310-cp310-linux_x86_64.whl size=4227136 sha256=71dc3f2989afb1a6f206ee64ae86bfcfa8381c66960e93ac984be24f2871c66b\n", - " Stored in directory: /root/.cache/pip/wheels/a5/13/75/f811c84a8ab36eedbaef977a6a58a98990e8e0f1967f98f394\n", - " Building wheel for kaldi-python-io (setup.py) ... \u001b[?25l\u001b[?25hdone\n", - " Created wheel for kaldi-python-io: filename=kaldi_python_io-1.2.2-py3-none-any.whl size=8949 sha256=959e8f93e517267e62e51f1e26455214c6b2aba320bb5621fa506730d4ad2ceb\n", - " Stored in directory: /root/.cache/pip/wheels/b7/23/5f/49d3a826be576faf61d84e8028e1914bb36a5586ee2613b087\n", - " Building wheel for nemo_toolkit (pyproject.toml) ... \u001b[?25l\u001b[?25hdone\n", - " Created wheel for nemo_toolkit: filename=nemo_toolkit-2.0.0rc1-py3-none-any.whl size=3709778 sha256=458c9cb158a12a8ddc8c570fde72f15111afe5767ac2a0e485966d2d76e1bda8\n", - " Stored in directory: /tmp/pip-ephem-wheel-cache-992hxcpb/wheels/c3/4e/45/ab3d29aa73df619f27b371cacf809d5330a18f794879163c1b\n", - " Building wheel for rouge-score (setup.py) ... \u001b[?25l\u001b[?25hdone\n", - " Created wheel for rouge-score: filename=rouge_score-0.1.2-py3-none-any.whl size=24933 sha256=076fda87c1a21e7a9fe88f0b3b9a26f7b76171063d76812353b4a30ebe02da51\n", - " Stored in directory: /root/.cache/pip/wheels/5f/dd/89/461065a73be61a532ff8599a28e9beef17985c9e9c31e541b4\n", - " Building wheel for sox (setup.py) ... \u001b[?25l\u001b[?25hdone\n", - " Created wheel for sox: filename=sox-1.5.0-py3-none-any.whl size=40038 sha256=717f5186772b8ce84cbbf7b1a01931be688fc591982575b518b2bc327460675d\n", - " Stored in directory: /root/.cache/pip/wheels/74/e7/7b/8033be3ec5e4994595d01269fc9657c8fd83a0dcbf8536666a\n", - " Building wheel for distance (setup.py) ... \u001b[?25l\u001b[?25hdone\n", - " Created wheel for distance: filename=Distance-0.1.3-py3-none-any.whl size=16258 sha256=4863022ee11d6ede70f4b4362c6554629a2e734cb7a0a0212904aeafac36f78e\n", - " Stored in directory: /root/.cache/pip/wheels/e8/bb/de/f71bf63559ea9a921059a5405806f7ff6ed612a9231c4a9309\n", - " Building wheel for docopt (setup.py) ... \u001b[?25l\u001b[?25hdone\n", - " Created wheel for docopt: filename=docopt-0.6.2-py2.py3-none-any.whl size=13706 sha256=80b5355530de1ea759d79fc19047cdd59679e6b0a014b51dbca811111b1aad36\n", - " Stored in directory: /root/.cache/pip/wheels/fc/ab/d4/5da2067ac95b36618c629a5f93f809425700506f72c9732fac\n", - " Building wheel for intervaltree (setup.py) ... \u001b[?25l\u001b[?25hdone\n", - " Created wheel for intervaltree: filename=intervaltree-3.1.0-py2.py3-none-any.whl size=26096 sha256=e831b80cc0232f925c293997e7be035697c58f5a834060f1b1f6a097fa5502b7\n", - " Stored in directory: /root/.cache/pip/wheels/fa/80/8c/43488a924a046b733b64de3fac99252674c892a4c3801c0a61\n", - " Building wheel for asciitree (setup.py) ... \u001b[?25l\u001b[?25hdone\n", - " Created wheel for asciitree: filename=asciitree-0.3.3-py3-none-any.whl size=5034 sha256=483b21d8a257179dcd00b430bc43c6fce9f97d0442b44433ac2794d3030a48e1\n", - " Stored in directory: /root/.cache/pip/wheels/7f/4e/be/1171b40f43b918087657ec57cf3b81fa1a2e027d8755baa184\n", - " Building wheel for cdifflib (pyproject.toml) ... \u001b[?25l\u001b[?25hdone\n", - " Created wheel for cdifflib: filename=cdifflib-1.2.6-cp310-cp310-linux_x86_64.whl size=27681 sha256=a4929dc925e36d0e71a89e124ce85f0ada2ec5862708eb18c9136da35649ebc1\n", - " Stored in directory: /root/.cache/pip/wheels/87/a7/fd/8061e24ed08689045cb6d1ca303768dc463b20a5a338174841\n", - "Successfully built causal-conv1d antlr4-python3-runtime progress clip fasttext kaldi-python-io nemo_toolkit rouge-score sox distance docopt intervaltree asciitree cdifflib\n", - "Installing collected packages: trampoline, pydub, progress, plac, pangu, opencc, ninja, ijson, docopt, distance, clip, braceexpand, asciitree, antlr4-python3-runtime, aniso8601, addict, xxhash, webdataset, trimesh, textdistance, sox, smmap, shellingham, setproctitle, sentry-sdk, ruamel.yaml.clib, rapidfuzz, pytest-runner, pypinyin, pynini, pybind11, portalocker, pathspec, parameterized, onnx, omegaconf, nvidia-nvtx-cu12, nvidia-nvjitlink-cu12, nvidia-nccl-cu12, nvidia-curand-cu12, nvidia-cufft-cu12, nvidia-cuda-runtime-cu12, nvidia-cuda-nvrtc-cu12, nvidia-cuda-cupti-cu12, nvidia-cublas-cu12, numcodecs, mypy-extensions, marshmallow, markdown2, loguru, lilcom, lightning-utilities, libcst, latexcodec, kornia-rs, kaldiio, kaldi-python-io, jmespath, jedi, isort, intervaltree, ftfy, fasteners, faiss-cpu, einops, docutils, docker-pycreds, dill, decord, cytoolz, colorama, click, cdifflib, attrdict, zarr, sacremoses, sacrebleu, ruamel.yaml, resampy, pytest-mock, pypinyin-dict, PyMCubes, pyloudnorm, pybtex, pyannote.core, nvidia-cusparse-cu12, nvidia-cudnn-cu12, multiprocess, Levenshtein, jiwer, hydra-core, gitdb, fiddle, fasttext, einops-exts, botocore, black, typer, texterrors, s3transfer, rouge-score, pybtex-docutils, nvidia-cusolver-cu12, lhotse, gitpython, flask-restful, diffusers, wandb, transformers, sphinxcontrib-bibtex, pyannote.database, g2p-en, datasets, boto3, torchsde, torchmetrics, torchdiffeq, sentence-transformers, pyannote.metrics, nerfacc, nemo_toolkit, nemo-text-processing, kornia, causal-conv1d, accelerated-scan, timm, pytorch-lightning, taming-transformers, open-clip-torch\n", - " Attempting uninstall: docutils\n", - " Found existing installation: docutils 0.18.1\n", - " Uninstalling docutils-0.18.1:\n", - " Successfully uninstalled docutils-0.18.1\n", - " Attempting uninstall: click\n", - " Found existing installation: click 8.1.7\n", - " Uninstalling click-8.1.7:\n", - " Successfully uninstalled click-8.1.7\n", - " Attempting uninstall: typer\n", - " Found existing installation: typer 0.9.4\n", - " Uninstalling typer-0.9.4:\n", - " Successfully uninstalled typer-0.9.4\n", - " Attempting uninstall: transformers\n", - " Found existing installation: transformers 4.41.0\n", - " Uninstalling transformers-4.41.0:\n", - " Successfully uninstalled transformers-4.41.0\n", - "\u001b[31mERROR: pip's dependency resolver does not currently take into account all the packages that are installed. This behaviour is the source of the following dependency conflicts.\n", - "spacy 3.7.4 requires typer<0.10.0,>=0.3.0, but you have typer 0.12.3 which is incompatible.\n", - "weasel 0.3.4 requires typer<0.10.0,>=0.3.0, but you have typer 0.12.3 which is incompatible.\u001b[0m\u001b[31m\n", - "\u001b[0mSuccessfully installed Levenshtein-0.22.0 PyMCubes-0.1.4 accelerated-scan-0.2.0 addict-2.4.0 aniso8601-9.0.1 antlr4-python3-runtime-4.9.3 asciitree-0.3.3 attrdict-2.0.1 black-24.4.2 boto3-1.34.113 botocore-1.34.113 braceexpand-0.1.7 causal-conv1d-1.2.2.post1 cdifflib-1.2.6 click-8.0.2 clip-0.2.0 colorama-0.4.6 cytoolz-0.12.3 datasets-2.19.1 decord-0.6.0 diffusers-0.28.0 dill-0.3.8 distance-0.1.3 docker-pycreds-0.4.0 docopt-0.6.2 docutils-0.17.1 einops-0.8.0 einops-exts-0.0.4 faiss-cpu-1.8.0 fasteners-0.19 fasttext-0.9.2 fiddle-0.3.0 flask-restful-0.3.10 ftfy-6.2.0 g2p-en-2.1.0 gitdb-4.0.11 gitpython-3.1.43 hydra-core-1.3.2 ijson-3.2.3 intervaltree-3.1.0 isort-5.13.2 jedi-0.19.1 jiwer-2.5.2 jmespath-1.0.1 kaldi-python-io-1.2.2 kaldiio-2.18.0 kornia-0.7.2 kornia-rs-0.1.3 latexcodec-3.0.0 lhotse-1.23.0 libcst-1.4.0 lightning-utilities-0.11.2 lilcom-1.7 loguru-0.7.2 markdown2-2.4.13 marshmallow-3.21.2 multiprocess-0.70.16 mypy-extensions-1.0.0 nemo-text-processing-1.0.2 nemo_toolkit-2.0.0rc1 nerfacc-0.5.3 ninja-1.11.1.1 numcodecs-0.12.1 nvidia-cublas-cu12-12.1.3.1 nvidia-cuda-cupti-cu12-12.1.105 nvidia-cuda-nvrtc-cu12-12.1.105 nvidia-cuda-runtime-cu12-12.1.105 nvidia-cudnn-cu12-8.9.2.26 nvidia-cufft-cu12-11.0.2.54 nvidia-curand-cu12-10.3.2.106 nvidia-cusolver-cu12-11.4.5.107 nvidia-cusparse-cu12-12.1.0.106 nvidia-nccl-cu12-2.20.5 nvidia-nvjitlink-cu12-12.5.40 nvidia-nvtx-cu12-12.1.105 omegaconf-2.3.0 onnx-1.16.1 open-clip-torch-2.24.0 opencc-1.1.6 pangu-4.0.6.1 parameterized-0.9.0 pathspec-0.12.1 plac-1.4.3 portalocker-2.8.2 progress-1.6 pyannote.core-5.0.0 pyannote.database-5.1.0 pyannote.metrics-3.2.1 pybind11-2.12.0 pybtex-0.24.0 pybtex-docutils-1.0.3 pydub-0.25.1 pyloudnorm-0.1.1 pynini-2.1.5 pypinyin-0.51.0 pypinyin-dict-0.8.0 pytest-mock-3.14.0 pytest-runner-6.0.1 pytorch-lightning-2.2.5 rapidfuzz-2.13.7 resampy-0.4.3 rouge-score-0.1.2 ruamel.yaml-0.18.6 ruamel.yaml.clib-0.2.8 s3transfer-0.10.1 sacrebleu-2.4.2 sacremoses-0.1.1 sentence-transformers-2.7.0 sentry-sdk-2.3.1 setproctitle-1.3.3 shellingham-1.5.4 smmap-5.0.1 sox-1.5.0 sphinxcontrib-bibtex-2.6.2 taming-transformers-0.0.1 textdistance-4.6.2 texterrors-0.4.4 timm-1.0.3 torchdiffeq-0.2.3 torchmetrics-1.4.0.post0 torchsde-0.2.6 trampoline-0.1.2 transformers-4.40.2 trimesh-4.4.0 typer-0.12.3 wandb-0.17.0 webdataset-0.2.86 xxhash-3.4.1 zarr-2.18.2\n" - ] - } - ], - "source": [ - "!pip install wget\n", - "!apt-get install sox libsndfile1 ffmpeg\n", - "\n", - "!python -m pip install git+https://github.com/NVIDIA/NeMo.git@1fa961ba03ab5f8c91b278640e29807079373372#egg=nemo_toolkit[all]" - ] - }, - { - "cell_type": "code", - "source": [ - "import hydra\n", - "import soundfile as sf\n", - "import torch\n", - "from omegaconf import OmegaConf" - ], - "metadata": { - "id": "cBz_fQ6KbzrZ" - }, - "execution_count": null, - "outputs": [] - }, - { - "cell_type": "markdown", - "source": [ - "### Downloading config, weights and audio example" - ], - "metadata": { - "id": "3Fvy0phvhr0G" - } - }, - { - "cell_type": "code", - "source": [ - "import locale\n", - "\n", - "locale.getpreferredencoding = lambda: \"UTF-8\"\n", - "\n", - "# Loading weights, config and example wav for CTC-model\n", - "!wget https://n-ws-q0bez.s3pd12.sbercloud.ru/b-ws-q0bez-jpv/GigaAM/ssl_model_weights.ckpt\n", - "!wget https://n-ws-q0bez.s3pd12.sbercloud.ru/b-ws-q0bez-jpv/GigaAM/encoder_config.yaml\n", - "!wget https://n-ws-q0bez.s3pd12.sbercloud.ru/b-ws-q0bez-jpv/GigaAM/example.wav" - ], - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/" - }, - "id": "0EHgk_I6hrGI", - "outputId": "4c9ac38d-eeca-4da4-af26-aa41becfed00" - }, - "execution_count": null, - "outputs": [ - { - "output_type": "stream", - "name": "stdout", - "text": [ - "--2024-05-28 07:12:41-- https://n-ws-q0bez.s3pd12.sbercloud.ru/b-ws-q0bez-jpv/GigaAM/example.wav\n", - "Resolving n-ws-q0bez.s3pd12.sbercloud.ru (n-ws-q0bez.s3pd12.sbercloud.ru)... 37.230.193.192\n", - "Connecting to n-ws-q0bez.s3pd12.sbercloud.ru (n-ws-q0bez.s3pd12.sbercloud.ru)|37.230.193.192|:443... connected.\n", - "HTTP request sent, awaiting response... 200 OK\n", - "Length: 361324 (353K) [application/octet-stream]\n", - "Saving to: ‘example.wav’\n", - "\n", - "example.wav 100%[===================>] 352.86K 583KB/s in 0.6s \n", - "\n", - "2024-05-28 07:12:42 (583 KB/s) - ‘example.wav’ saved [361324/361324]\n", - "\n" - ] - } - ] - }, - { - "cell_type": "markdown", - "source": [ - "### Model instantiating and *inference*" - ], - "metadata": { - "id": "FUA6Ah1blyHv" - } - }, - { - "cell_type": "code", - "source": [ - "class SpecScaler(torch.nn.Module):\n", - " def forward(self, x: torch.Tensor) -> torch.Tensor:\n", - " return torch.log(x.clamp_(1e-9, 1e9))\n", - "\n", - "\n", - "device = \"cuda\" if torch.cuda.is_available() else \"cpu\"\n", - "encoder_config = \"encoder_config.yaml\"\n", - "model_weights = \"ssl_model_weights.ckpt\"\n", - "audio_path = \"example.wav\"\n", - "\n", - "conf = OmegaConf.load(encoder_config)\n", - "\n", - "encoder = hydra.utils.instantiate(conf.encoder)\n", - "ckpt = torch.load(model_weights, map_location=\"cpu\")\n", - "encoder.load_state_dict(ckpt, strict=True)\n", - "encoder.to(device)\n", - "\n", - "feature_extractor = hydra.utils.instantiate(conf.feature_extractor)\n", - "\n", - "audio_signal, _ = sf.read(audio_path, dtype=\"float32\")\n", - "features = feature_extractor(torch.tensor(audio_signal).float())\n", - "features = features.to(device)\n", - "\n", - "encoded, _ = encoder.forward(\n", - " audio_signal=features.unsqueeze(0),\n", - " length=torch.tensor([features.shape[-1]]).to(device),\n", - ")\n", - "print(f\"encoded signal shape: {encoded.shape}\")" - ], - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/" - }, - "id": "AsUapeJKh3cz", - "outputId": "ee5bc82b-4526-4364-ef7c-decd59cdbc5f" - }, - "execution_count": null, - "outputs": [ - { - "output_type": "stream", - "name": "stdout", - "text": [ - "encoded signal shape: torch.Size([1, 768, 283])\n" - ] - } - ] - }, - { - "cell_type": "code", - "source": [], - "metadata": { - "id": "p1yWHEU5Dn60" - }, - "execution_count": null, - "outputs": [] - } - ] -} \ No newline at end of file diff --git a/examples/notebooks/GigaAM_RNNT_Model_Usage_Example.ipynb b/examples/notebooks/GigaAM_RNNT_Model_Usage_Example.ipynb deleted file mode 100644 index b4a989c..0000000 --- a/examples/notebooks/GigaAM_RNNT_Model_Usage_Example.ipynb +++ /dev/null @@ -1,1235 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": { - "id": "0Q99xpSOdHEM" - }, - "source": [ - "### Installing and importing dependencies" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/" - }, - "id": "2am02YkxKBJ5", - "outputId": "1ca9927f-5bb0-4110-f9b7-54298e85918f" - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Collecting wget\n", - " Downloading wget-3.2.zip (10 kB)\n", - " Preparing metadata (setup.py) ... \u001b[?25l\u001b[?25hdone\n", - "Building wheels for collected packages: wget\n", - " Building wheel for wget (setup.py) ... \u001b[?25l\u001b[?25hdone\n", - " Created wheel for wget: filename=wget-3.2-py3-none-any.whl size=9656 sha256=80bdd08a8dd1b0676f765e38a9293c17297c03dffbccd77ed2c8fe44847bfe0a\n", - " Stored in directory: /root/.cache/pip/wheels/8b/f1/7f/5c94f0a7a505ca1c81cd1d9208ae2064675d97582078e6c769\n", - "Successfully built wget\n", - "Installing collected packages: wget\n", - "Successfully installed wget-3.2\n", - "Reading package lists... Done\n", - "Building dependency tree... Done\n", - "Reading state information... Done\n", - "libsndfile1 is already the newest version (1.0.31-2ubuntu0.1).\n", - "ffmpeg is already the newest version (7:4.4.2-0ubuntu0.22.04.1).\n", - "The following additional packages will be installed:\n", - " libopencore-amrnb0 libopencore-amrwb0 libsox-fmt-alsa libsox-fmt-base libsox3 libwavpack1\n", - "Suggested packages:\n", - " libsox-fmt-all\n", - "The following NEW packages will be installed:\n", - " libopencore-amrnb0 libopencore-amrwb0 libsox-fmt-alsa libsox-fmt-base libsox3 libwavpack1 sox\n", - "0 upgraded, 7 newly installed, 0 to remove and 45 not upgraded.\n", - "Need to get 617 kB of archives.\n", - "After this operation, 1,764 kB of additional disk space will be used.\n", - "Get:1 http://archive.ubuntu.com/ubuntu jammy/universe amd64 libopencore-amrnb0 amd64 0.1.5-1 [94.8 kB]\n", - "Get:2 http://archive.ubuntu.com/ubuntu jammy/universe amd64 libopencore-amrwb0 amd64 0.1.5-1 [49.1 kB]\n", - "Get:3 http://archive.ubuntu.com/ubuntu jammy-updates/universe amd64 libsox3 amd64 14.4.2+git20190427-2+deb11u2ubuntu0.22.04.1 [240 kB]\n", - "Get:4 http://archive.ubuntu.com/ubuntu jammy-updates/universe amd64 libsox-fmt-alsa amd64 14.4.2+git20190427-2+deb11u2ubuntu0.22.04.1 [11.2 kB]\n", - "Get:5 http://archive.ubuntu.com/ubuntu jammy/main amd64 libwavpack1 amd64 5.4.0-1build2 [83.7 kB]\n", - "Get:6 http://archive.ubuntu.com/ubuntu jammy-updates/universe amd64 libsox-fmt-base amd64 14.4.2+git20190427-2+deb11u2ubuntu0.22.04.1 [33.7 kB]\n", - "Get:7 http://archive.ubuntu.com/ubuntu jammy-updates/universe amd64 sox amd64 14.4.2+git20190427-2+deb11u2ubuntu0.22.04.1 [104 kB]\n", - "Fetched 617 kB in 1s (440 kB/s)\n", - "Selecting previously unselected package libopencore-amrnb0:amd64.\n", - "(Reading database ... 121918 files and directories currently installed.)\n", - "Preparing to unpack .../0-libopencore-amrnb0_0.1.5-1_amd64.deb ...\n", - "Unpacking libopencore-amrnb0:amd64 (0.1.5-1) ...\n", - "Selecting previously unselected package libopencore-amrwb0:amd64.\n", - "Preparing to unpack .../1-libopencore-amrwb0_0.1.5-1_amd64.deb ...\n", - "Unpacking libopencore-amrwb0:amd64 (0.1.5-1) ...\n", - "Selecting previously unselected package libsox3:amd64.\n", - "Preparing to unpack .../2-libsox3_14.4.2+git20190427-2+deb11u2ubuntu0.22.04.1_amd64.deb ...\n", - "Unpacking libsox3:amd64 (14.4.2+git20190427-2+deb11u2ubuntu0.22.04.1) ...\n", - "Selecting previously unselected package libsox-fmt-alsa:amd64.\n", - "Preparing to unpack .../3-libsox-fmt-alsa_14.4.2+git20190427-2+deb11u2ubuntu0.22.04.1_amd64.deb ...\n", - "Unpacking libsox-fmt-alsa:amd64 (14.4.2+git20190427-2+deb11u2ubuntu0.22.04.1) ...\n", - "Selecting previously unselected package libwavpack1:amd64.\n", - "Preparing to unpack .../4-libwavpack1_5.4.0-1build2_amd64.deb ...\n", - "Unpacking libwavpack1:amd64 (5.4.0-1build2) ...\n", - "Selecting previously unselected package libsox-fmt-base:amd64.\n", - "Preparing to unpack .../5-libsox-fmt-base_14.4.2+git20190427-2+deb11u2ubuntu0.22.04.1_amd64.deb ...\n", - "Unpacking libsox-fmt-base:amd64 (14.4.2+git20190427-2+deb11u2ubuntu0.22.04.1) ...\n", - "Selecting previously unselected package sox.\n", - "Preparing to unpack .../6-sox_14.4.2+git20190427-2+deb11u2ubuntu0.22.04.1_amd64.deb ...\n", - "Unpacking sox (14.4.2+git20190427-2+deb11u2ubuntu0.22.04.1) ...\n", - "Setting up libsox3:amd64 (14.4.2+git20190427-2+deb11u2ubuntu0.22.04.1) ...\n", - "Setting up libopencore-amrwb0:amd64 (0.1.5-1) ...\n", - "Setting up libsox-fmt-alsa:amd64 (14.4.2+git20190427-2+deb11u2ubuntu0.22.04.1) ...\n", - "Setting up libwavpack1:amd64 (5.4.0-1build2) ...\n", - "Setting up libopencore-amrnb0:amd64 (0.1.5-1) ...\n", - "Setting up libsox-fmt-base:amd64 (14.4.2+git20190427-2+deb11u2ubuntu0.22.04.1) ...\n", - "Setting up sox (14.4.2+git20190427-2+deb11u2ubuntu0.22.04.1) ...\n", - "Processing triggers for man-db (2.10.2-1) ...\n", - "Processing triggers for libc-bin (2.35-0ubuntu3.4) ...\n", - "/sbin/ldconfig.real: /usr/local/lib/libtbbbind_2_0.so.3 is not a symbolic link\n", - "\n", - "/sbin/ldconfig.real: /usr/local/lib/libtbbmalloc_proxy.so.2 is not a symbolic link\n", - "\n", - "/sbin/ldconfig.real: /usr/local/lib/libtbbbind_2_5.so.3 is not a symbolic link\n", - "\n", - "/sbin/ldconfig.real: /usr/local/lib/libtbbmalloc.so.2 is not a symbolic link\n", - "\n", - "/sbin/ldconfig.real: /usr/local/lib/libtbbbind.so.3 is not a symbolic link\n", - "\n", - "/sbin/ldconfig.real: /usr/local/lib/libtbb.so.12 is not a symbolic link\n", - "\n", - "\u001b[33mDEPRECATION: git+https://github.com/NVIDIA/NeMo.git#egg=nemo_toolkit[all] contains an egg fragment with a non-PEP 508 name pip 25.0 will enforce this behaviour change. A possible replacement is to use the req @ url syntax, and remove the egg fragment. Discussion can be found at https://github.com/pypa/pip/issues/11617\u001b[0m\u001b[33m\n", - "\u001b[0mCollecting nemo_toolkit[all]\n", - " Cloning https://github.com/NVIDIA/NeMo.git to /tmp/pip-install-zgha1me1/nemo-toolkit_d10b949bd918411eba7d6801059de022\n", - " Running command git clone --filter=blob:none --quiet https://github.com/NVIDIA/NeMo.git /tmp/pip-install-zgha1me1/nemo-toolkit_d10b949bd918411eba7d6801059de022\n", - " Resolved https://github.com/NVIDIA/NeMo.git to commit 1fa961ba03ab5f8c91b278640e29807079373372\n", - " Installing build dependencies ... \u001b[?25l\u001b[?25hdone\n", - " Getting requirements to build wheel ... \u001b[?25l\u001b[?25hdone\n", - " Preparing metadata (pyproject.toml) ... \u001b[?25l\u001b[?25hdone\n", - "Collecting fiddle (from nemo_toolkit[all])\n", - " Downloading fiddle-0.3.0-py3-none-any.whl (419 kB)\n", - "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m419.8/419.8 kB\u001b[0m \u001b[31m5.4 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", - "\u001b[?25hRequirement already satisfied: huggingface-hub>=0.20.3 in /usr/local/lib/python3.10/dist-packages (from nemo_toolkit[all]) (0.23.1)\n", - "Requirement already satisfied: numba in /usr/local/lib/python3.10/dist-packages (from nemo_toolkit[all]) (0.58.1)\n", - "Requirement already satisfied: numpy>=1.22 in /usr/local/lib/python3.10/dist-packages (from nemo_toolkit[all]) (1.25.2)\n", - "Collecting onnx>=1.7.0 (from nemo_toolkit[all])\n", - " Downloading onnx-1.16.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (15.9 MB)\n", - "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m15.9/15.9 MB\u001b[0m \u001b[31m35.9 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", - "\u001b[?25hRequirement already satisfied: python-dateutil in /usr/local/lib/python3.10/dist-packages (from nemo_toolkit[all]) (2.8.2)\n", - "Collecting ruamel.yaml (from nemo_toolkit[all])\n", - " Downloading ruamel.yaml-0.18.6-py3-none-any.whl (117 kB)\n", - "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m117.8/117.8 kB\u001b[0m \u001b[31m14.4 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", - "\u001b[?25hRequirement already satisfied: scikit-learn in /usr/local/lib/python3.10/dist-packages (from nemo_toolkit[all]) (1.2.2)\n", - "Requirement already satisfied: setuptools>=65.5.1 in /usr/local/lib/python3.10/dist-packages (from nemo_toolkit[all]) (67.7.2)\n", - "Requirement already satisfied: tensorboard in /usr/local/lib/python3.10/dist-packages (from nemo_toolkit[all]) (2.15.2)\n", - "Requirement already satisfied: text-unidecode in /usr/local/lib/python3.10/dist-packages (from nemo_toolkit[all]) (1.3)\n", - "Requirement already satisfied: torch in /usr/local/lib/python3.10/dist-packages (from nemo_toolkit[all]) (2.3.0+cu121)\n", - "Requirement already satisfied: tqdm>=4.41.0 in /usr/local/lib/python3.10/dist-packages (from nemo_toolkit[all]) (4.66.4)\n", - "Requirement already satisfied: wget in /usr/local/lib/python3.10/dist-packages (from nemo_toolkit[all]) (3.2)\n", - "Requirement already satisfied: wrapt in /usr/local/lib/python3.10/dist-packages (from nemo_toolkit[all]) (1.14.1)\n", - "Collecting black~=24.3 (from nemo_toolkit[all])\n", - " Downloading black-24.4.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (1.8 MB)\n", - "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m1.8/1.8 MB\u001b[0m \u001b[31m25.9 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", - "\u001b[?25hCollecting click==8.0.2 (from nemo_toolkit[all])\n", - " Downloading click-8.0.2-py3-none-any.whl (97 kB)\n", - "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m97.6/97.6 kB\u001b[0m \u001b[31m15.8 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", - "\u001b[?25hCollecting isort<6.0.0,>5.1.0 (from nemo_toolkit[all])\n", - " Downloading isort-5.13.2-py3-none-any.whl (92 kB)\n", - "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m92.3/92.3 kB\u001b[0m \u001b[31m15.4 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", - "\u001b[?25hCollecting parameterized (from nemo_toolkit[all])\n", - " Downloading parameterized-0.9.0-py2.py3-none-any.whl (20 kB)\n", - "Requirement already satisfied: pytest in /usr/local/lib/python3.10/dist-packages (from nemo_toolkit[all]) (7.4.4)\n", - "Collecting pytest-mock (from nemo_toolkit[all])\n", - " Downloading pytest_mock-3.14.0-py3-none-any.whl (9.9 kB)\n", - "Collecting pytest-runner (from nemo_toolkit[all])\n", - " Downloading pytest_runner-6.0.1-py3-none-any.whl (7.2 kB)\n", - "Requirement already satisfied: sphinx in /usr/local/lib/python3.10/dist-packages (from nemo_toolkit[all]) (5.0.2)\n", - "Collecting sphinxcontrib-bibtex (from nemo_toolkit[all])\n", - " Downloading sphinxcontrib_bibtex-2.6.2-py3-none-any.whl (40 kB)\n", - "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m41.0/41.0 kB\u001b[0m \u001b[31m6.8 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", - "\u001b[?25hCollecting wandb (from nemo_toolkit[all])\n", - " Downloading wandb-0.17.0-py3-none-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl (6.7 MB)\n", - "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m6.7/6.7 MB\u001b[0m \u001b[31m66.6 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", - "\u001b[?25hRequirement already satisfied: cloudpickle in /usr/local/lib/python3.10/dist-packages (from nemo_toolkit[all]) (2.2.1)\n", - "Collecting hydra-core<=1.3.2,>1.3 (from nemo_toolkit[all])\n", - " Downloading hydra_core-1.3.2-py3-none-any.whl (154 kB)\n", - "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m154.5/154.5 kB\u001b[0m \u001b[31m21.6 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", - "\u001b[?25hCollecting omegaconf<=2.3 (from nemo_toolkit[all])\n", - " Downloading omegaconf-2.3.0-py3-none-any.whl (79 kB)\n", - "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m79.5/79.5 kB\u001b[0m \u001b[31m13.3 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", - "\u001b[?25hCollecting pytorch-lightning>=2.2.1 (from nemo_toolkit[all])\n", - " Downloading pytorch_lightning-2.2.5-py3-none-any.whl (802 kB)\n", - "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m802.3/802.3 kB\u001b[0m \u001b[31m63.9 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", - "\u001b[?25hCollecting torchmetrics>=0.11.0 (from nemo_toolkit[all])\n", - " Downloading torchmetrics-1.4.0.post0-py3-none-any.whl (868 kB)\n", - "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m868.8/868.8 kB\u001b[0m \u001b[31m70.4 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", - "\u001b[?25hCollecting transformers<=4.40.2,>=4.36.0 (from nemo_toolkit[all])\n", - " Downloading transformers-4.40.2-py3-none-any.whl (9.0 MB)\n", - "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m9.0/9.0 MB\u001b[0m \u001b[31m96.5 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", - "\u001b[?25hCollecting webdataset>=0.2.86 (from nemo_toolkit[all])\n", - " Downloading webdataset-0.2.86-py3-none-any.whl (70 kB)\n", - "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m70.4/70.4 kB\u001b[0m \u001b[31m12.6 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", - "\u001b[?25hCollecting datasets (from nemo_toolkit[all])\n", - " Downloading datasets-2.19.1-py3-none-any.whl (542 kB)\n", - "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m542.0/542.0 kB\u001b[0m \u001b[31m61.4 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", - "\u001b[?25hRequirement already satisfied: inflect in /usr/local/lib/python3.10/dist-packages (from nemo_toolkit[all]) (7.0.0)\n", - "Requirement already satisfied: pandas in /usr/local/lib/python3.10/dist-packages (from nemo_toolkit[all]) (2.0.3)\n", - "Collecting sacremoses>=0.0.43 (from nemo_toolkit[all])\n", - " Downloading sacremoses-0.1.1-py3-none-any.whl (897 kB)\n", - "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m897.5/897.5 kB\u001b[0m \u001b[31m76.6 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", - "\u001b[?25hRequirement already satisfied: sentencepiece<1.0.0 in /usr/local/lib/python3.10/dist-packages (from nemo_toolkit[all]) (0.1.99)\n", - "Collecting braceexpand (from nemo_toolkit[all])\n", - " Downloading braceexpand-0.1.7-py2.py3-none-any.whl (5.9 kB)\n", - "Requirement already satisfied: editdistance in /usr/local/lib/python3.10/dist-packages (from nemo_toolkit[all]) (0.6.2)\n", - "Collecting einops (from nemo_toolkit[all])\n", - " Downloading einops-0.8.0-py3-none-any.whl (43 kB)\n", - "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m43.2/43.2 kB\u001b[0m \u001b[31m8.4 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", - "\u001b[?25hCollecting g2p-en (from nemo_toolkit[all])\n", - " Downloading g2p_en-2.1.0-py3-none-any.whl (3.1 MB)\n", - "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m3.1/3.1 MB\u001b[0m \u001b[31m99.2 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", - "\u001b[?25hRequirement already satisfied: ipywidgets in /usr/local/lib/python3.10/dist-packages (from nemo_toolkit[all]) (7.7.1)\n", - "Collecting jiwer (from nemo_toolkit[all])\n", - " Downloading jiwer-3.0.4-py3-none-any.whl (21 kB)\n", - "Collecting kaldi-python-io (from nemo_toolkit[all])\n", - " Downloading kaldi-python-io-1.2.2.tar.gz (8.8 kB)\n", - " Preparing metadata (setup.py) ... \u001b[?25l\u001b[?25hdone\n", - "Collecting kaldiio (from nemo_toolkit[all])\n", - " Downloading kaldiio-2.18.0-py3-none-any.whl (28 kB)\n", - "Collecting lhotse>=1.22.0 (from nemo_toolkit[all])\n", - " Downloading lhotse-1.23.0-py3-none-any.whl (772 kB)\n", - "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m772.4/772.4 kB\u001b[0m \u001b[31m73.7 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", - "\u001b[?25hRequirement already satisfied: librosa>=0.10.0 in /usr/local/lib/python3.10/dist-packages (from nemo_toolkit[all]) (0.10.2.post1)\n", - "Collecting marshmallow (from nemo_toolkit[all])\n", - " Downloading marshmallow-3.21.2-py3-none-any.whl (49 kB)\n", - "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m49.3/49.3 kB\u001b[0m \u001b[31m7.9 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", - "\u001b[?25hRequirement already satisfied: matplotlib in /usr/local/lib/python3.10/dist-packages (from nemo_toolkit[all]) (3.7.1)\n", - "Requirement already satisfied: packaging in /usr/local/lib/python3.10/dist-packages (from nemo_toolkit[all]) (24.0)\n", - "Collecting pyannote.core (from nemo_toolkit[all])\n", - " Downloading pyannote.core-5.0.0-py3-none-any.whl (58 kB)\n", - "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m58.5/58.5 kB\u001b[0m \u001b[31m10.7 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", - "\u001b[?25hCollecting pyannote.metrics (from nemo_toolkit[all])\n", - " Downloading pyannote.metrics-3.2.1-py3-none-any.whl (51 kB)\n", - "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m51.4/51.4 kB\u001b[0m \u001b[31m8.4 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", - "\u001b[?25hCollecting pydub (from nemo_toolkit[all])\n", - " Downloading pydub-0.25.1-py2.py3-none-any.whl (32 kB)\n", - "Collecting pyloudnorm (from nemo_toolkit[all])\n", - " Downloading pyloudnorm-0.1.1-py3-none-any.whl (9.6 kB)\n", - "Collecting resampy (from nemo_toolkit[all])\n", - " Downloading resampy-0.4.3-py3-none-any.whl (3.1 MB)\n", - "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m3.1/3.1 MB\u001b[0m \u001b[31m108.8 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", - "\u001b[?25hRequirement already satisfied: scipy>=0.14 in /usr/local/lib/python3.10/dist-packages (from nemo_toolkit[all]) (1.11.4)\n", - "Requirement already satisfied: soundfile in /usr/local/lib/python3.10/dist-packages (from nemo_toolkit[all]) (0.12.1)\n", - "Collecting sox (from nemo_toolkit[all])\n", - " Downloading sox-1.5.0.tar.gz (63 kB)\n", - "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m63.9/63.9 kB\u001b[0m \u001b[31m11.3 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", - "\u001b[?25h Preparing metadata (setup.py) ... \u001b[?25l\u001b[?25hdone\n", - "Collecting texterrors (from nemo_toolkit[all])\n", - " Downloading texterrors-0.4.4-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (1.1 MB)\n", - "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m1.1/1.1 MB\u001b[0m \u001b[31m76.9 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", - "\u001b[?25hCollecting accelerated-scan (from nemo_toolkit[all])\n", - " Downloading accelerated_scan-0.2.0-py3-none-any.whl (11 kB)\n", - "Collecting boto3 (from nemo_toolkit[all])\n", - " Downloading boto3-1.34.113-py3-none-any.whl (139 kB)\n", - "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m139.3/139.3 kB\u001b[0m \u001b[31m22.5 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", - "\u001b[?25hCollecting causal-conv1d>=1.2.0 (from nemo_toolkit[all])\n", - " Downloading causal_conv1d-1.2.2.post1.tar.gz (7.2 kB)\n", - " Preparing metadata (setup.py) ... \u001b[?25l\u001b[?25hdone\n", - "Collecting faiss-cpu (from nemo_toolkit[all])\n", - " Downloading faiss_cpu-1.8.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (27.0 MB)\n", - "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m27.0/27.0 MB\u001b[0m \u001b[31m42.9 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", - "\u001b[?25hCollecting fasttext (from nemo_toolkit[all])\n", - " Downloading fasttext-0.9.2.tar.gz (68 kB)\n", - "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m68.8/68.8 kB\u001b[0m \u001b[31m11.8 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", - "\u001b[?25h Preparing metadata (setup.py) ... \u001b[?25l\u001b[?25hdone\n", - "Collecting flask-restful (from nemo_toolkit[all])\n", - " Downloading Flask_RESTful-0.3.10-py2.py3-none-any.whl (26 kB)\n", - "Collecting ftfy (from nemo_toolkit[all])\n", - " Downloading ftfy-6.2.0-py3-none-any.whl (54 kB)\n", - "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m54.4/54.4 kB\u001b[0m \u001b[31m10.4 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", - "\u001b[?25hRequirement already satisfied: gdown in /usr/local/lib/python3.10/dist-packages (from nemo_toolkit[all]) (5.1.0)\n", - "Requirement already satisfied: h5py in /usr/local/lib/python3.10/dist-packages (from nemo_toolkit[all]) (3.9.0)\n", - "Collecting ijson (from nemo_toolkit[all])\n", - " Downloading ijson-3.2.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (111 kB)\n", - "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m111.8/111.8 kB\u001b[0m \u001b[31m18.6 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", - "\u001b[?25hRequirement already satisfied: jieba in /usr/local/lib/python3.10/dist-packages (from nemo_toolkit[all]) (0.42.1)\n", - "Collecting markdown2 (from nemo_toolkit[all])\n", - " Downloading markdown2-2.4.13-py2.py3-none-any.whl (41 kB)\n", - "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m41.3/41.3 kB\u001b[0m \u001b[31m7.4 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", - "\u001b[?25hRequirement already satisfied: nltk>=3.6.5 in /usr/local/lib/python3.10/dist-packages (from nemo_toolkit[all]) (3.8.1)\n", - "Collecting opencc<1.1.7 (from nemo_toolkit[all])\n", - " Downloading OpenCC-1.1.6-cp310-cp310-manylinux1_x86_64.whl (778 kB)\n", - "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m778.3/778.3 kB\u001b[0m \u001b[31m50.2 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", - "\u001b[?25hCollecting pangu (from nemo_toolkit[all])\n", - " Downloading pangu-4.0.6.1-py3-none-any.whl (6.4 kB)\n", - "Collecting rapidfuzz (from nemo_toolkit[all])\n", - " Downloading rapidfuzz-3.9.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (3.4 MB)\n", - "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m3.4/3.4 MB\u001b[0m \u001b[31m113.7 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", - "\u001b[?25hCollecting rouge-score (from nemo_toolkit[all])\n", - " Downloading rouge_score-0.1.2.tar.gz (17 kB)\n", - " Preparing metadata (setup.py) ... \u001b[?25l\u001b[?25hdone\n", - "Collecting sacrebleu (from nemo_toolkit[all])\n", - " Downloading sacrebleu-2.4.2-py3-none-any.whl (106 kB)\n", - "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m106.7/106.7 kB\u001b[0m \u001b[31m18.0 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", - "\u001b[?25hCollecting sentence-transformers (from nemo_toolkit[all])\n", - " Downloading sentence_transformers-2.7.0-py3-none-any.whl (171 kB)\n", - "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m171.5/171.5 kB\u001b[0m \u001b[31m28.7 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", - "\u001b[?25hRequirement already satisfied: tensorstore<0.1.46 in /usr/local/lib/python3.10/dist-packages (from nemo_toolkit[all]) (0.1.45)\n", - "Collecting zarr (from nemo_toolkit[all])\n", - " Downloading zarr-2.18.2-py3-none-any.whl (210 kB)\n", - "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m210.2/210.2 kB\u001b[0m \u001b[31m30.4 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", - "\u001b[?25hCollecting attrdict (from nemo_toolkit[all])\n", - " Downloading attrdict-2.0.1-py2.py3-none-any.whl (9.9 kB)\n", - "Collecting kornia (from nemo_toolkit[all])\n", - " Downloading kornia-0.7.2-py2.py3-none-any.whl (825 kB)\n", - "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m825.4/825.4 kB\u001b[0m \u001b[31m73.6 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", - "\u001b[?25hCollecting pypinyin (from nemo_toolkit[all])\n", - " Downloading pypinyin-0.51.0-py2.py3-none-any.whl (1.4 MB)\n", - "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m1.4/1.4 MB\u001b[0m \u001b[31m94.2 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", - "\u001b[?25hCollecting pypinyin-dict (from nemo_toolkit[all])\n", - " Downloading pypinyin_dict-0.8.0-py2.py3-none-any.whl (9.5 MB)\n", - "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m9.5/9.5 MB\u001b[0m \u001b[31m113.4 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", - "\u001b[?25hCollecting progress>=1.5 (from nemo_toolkit[all])\n", - " Downloading progress-1.6.tar.gz (7.8 kB)\n", - " Preparing metadata (setup.py) ... \u001b[?25l\u001b[?25hdone\n", - "Requirement already satisfied: tabulate>=0.8.7 in /usr/local/lib/python3.10/dist-packages (from nemo_toolkit[all]) (0.9.0)\n", - "Collecting textdistance>=4.1.5 (from nemo_toolkit[all])\n", - " Downloading textdistance-4.6.2-py3-none-any.whl (31 kB)\n", - "Collecting addict (from nemo_toolkit[all])\n", - " Downloading addict-2.4.0-py3-none-any.whl (3.8 kB)\n", - "Collecting clip (from nemo_toolkit[all])\n", - " Downloading clip-0.2.0.tar.gz (5.5 kB)\n", - " Preparing metadata (setup.py) ... \u001b[?25l\u001b[?25hdone\n", - "Collecting decord (from nemo_toolkit[all])\n", - " Downloading decord-0.6.0-py3-none-manylinux2010_x86_64.whl (13.6 MB)\n", - "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m13.6/13.6 MB\u001b[0m \u001b[31m73.7 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", - "\u001b[?25hCollecting diffusers>=0.19.3 (from nemo_toolkit[all])\n", - " Downloading diffusers-0.28.0-py3-none-any.whl (2.2 MB)\n", - "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m2.2/2.2 MB\u001b[0m \u001b[31m72.9 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", - "\u001b[?25hCollecting einops-exts (from nemo_toolkit[all])\n", - " Downloading einops_exts-0.0.4-py3-none-any.whl (3.9 kB)\n", - "Requirement already satisfied: imageio in /usr/local/lib/python3.10/dist-packages (from nemo_toolkit[all]) (2.31.6)\n", - "Collecting nerfacc>=0.5.3 (from nemo_toolkit[all])\n", - " Downloading nerfacc-0.5.3-py3-none-any.whl (54 kB)\n", - "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m54.6/54.6 kB\u001b[0m \u001b[31m8.7 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", - "\u001b[?25hCollecting open-clip-torch (from nemo_toolkit[all])\n", - " Downloading open_clip_torch-2.24.0-py3-none-any.whl (1.5 MB)\n", - "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m1.5/1.5 MB\u001b[0m \u001b[31m65.1 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", - "\u001b[?25hCollecting PyMCubes (from nemo_toolkit[all])\n", - " Downloading PyMCubes-0.1.4-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (274 kB)\n", - "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m274.3/274.3 kB\u001b[0m \u001b[31m29.1 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", - "\u001b[?25hCollecting taming-transformers (from nemo_toolkit[all])\n", - " Downloading taming_transformers-0.0.1-py3-none-any.whl (45 kB)\n", - "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m45.6/45.6 kB\u001b[0m \u001b[31m8.2 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", - "\u001b[?25hCollecting torchdiffeq (from nemo_toolkit[all])\n", - " Downloading torchdiffeq-0.2.3-py3-none-any.whl (31 kB)\n", - "Collecting torchsde (from nemo_toolkit[all])\n", - " Downloading torchsde-0.2.6-py3-none-any.whl (61 kB)\n", - "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m61.2/61.2 kB\u001b[0m \u001b[31m10.1 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", - "\u001b[?25hCollecting trimesh (from nemo_toolkit[all])\n", - " Downloading trimesh-4.4.0-py3-none-any.whl (694 kB)\n", - "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m694.6/694.6 kB\u001b[0m \u001b[31m64.6 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", - "\u001b[?25hCollecting nemo-text-processing (from nemo_toolkit[all])\n", - " Downloading nemo_text_processing-1.0.2-py3-none-any.whl (2.6 MB)\n", - "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m2.6/2.6 MB\u001b[0m \u001b[31m92.0 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", - "\u001b[?25hCollecting mypy-extensions>=0.4.3 (from black~=24.3->nemo_toolkit[all])\n", - " Downloading mypy_extensions-1.0.0-py3-none-any.whl (4.7 kB)\n", - "Collecting pathspec>=0.9.0 (from black~=24.3->nemo_toolkit[all])\n", - " Downloading pathspec-0.12.1-py3-none-any.whl (31 kB)\n", - "Requirement already satisfied: platformdirs>=2 in /usr/local/lib/python3.10/dist-packages (from black~=24.3->nemo_toolkit[all]) (4.2.2)\n", - "Requirement already satisfied: tomli>=1.1.0 in /usr/local/lib/python3.10/dist-packages (from black~=24.3->nemo_toolkit[all]) (2.0.1)\n", - "Requirement already satisfied: typing-extensions>=4.0.1 in /usr/local/lib/python3.10/dist-packages (from black~=24.3->nemo_toolkit[all]) (4.11.0)\n", - "Collecting ninja (from causal-conv1d>=1.2.0->nemo_toolkit[all])\n", - " Downloading ninja-1.11.1.1-py2.py3-none-manylinux1_x86_64.manylinux_2_5_x86_64.whl (307 kB)\n", - "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m307.2/307.2 kB\u001b[0m \u001b[31m45.5 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", - "\u001b[?25hRequirement already satisfied: importlib-metadata in /usr/local/lib/python3.10/dist-packages (from diffusers>=0.19.3->nemo_toolkit[all]) (7.1.0)\n", - "Requirement already satisfied: filelock in /usr/local/lib/python3.10/dist-packages (from diffusers>=0.19.3->nemo_toolkit[all]) (3.14.0)\n", - "Requirement already satisfied: regex!=2019.12.17 in /usr/local/lib/python3.10/dist-packages (from diffusers>=0.19.3->nemo_toolkit[all]) (2023.12.25)\n", - "Requirement already satisfied: requests in /usr/local/lib/python3.10/dist-packages (from diffusers>=0.19.3->nemo_toolkit[all]) (2.31.0)\n", - "Requirement already satisfied: safetensors>=0.3.1 in /usr/local/lib/python3.10/dist-packages (from diffusers>=0.19.3->nemo_toolkit[all]) (0.4.3)\n", - "Requirement already satisfied: Pillow in /usr/local/lib/python3.10/dist-packages (from diffusers>=0.19.3->nemo_toolkit[all]) (9.4.0)\n", - "Requirement already satisfied: fsspec>=2023.5.0 in /usr/local/lib/python3.10/dist-packages (from huggingface-hub>=0.20.3->nemo_toolkit[all]) (2023.6.0)\n", - "Requirement already satisfied: pyyaml>=5.1 in /usr/local/lib/python3.10/dist-packages (from huggingface-hub>=0.20.3->nemo_toolkit[all]) (6.0.1)\n", - "Collecting antlr4-python3-runtime==4.9.* (from hydra-core<=1.3.2,>1.3->nemo_toolkit[all])\n", - " Downloading antlr4-python3-runtime-4.9.3.tar.gz (117 kB)\n", - "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m117.0/117.0 kB\u001b[0m \u001b[31m20.7 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", - "\u001b[?25h Preparing metadata (setup.py) ... \u001b[?25l\u001b[?25hdone\n", - "INFO: pip is looking at multiple versions of jiwer to determine which version is compatible with other requirements. This could take a while.\n", - "Collecting jiwer (from nemo_toolkit[all])\n", - " Downloading jiwer-3.0.3-py3-none-any.whl (21 kB)\n", - " Downloading jiwer-3.0.2-py3-none-any.whl (21 kB)\n", - " Downloading jiwer-3.0.1-py3-none-any.whl (21 kB)\n", - " Downloading jiwer-3.0.0-py3-none-any.whl (21 kB)\n", - " Downloading jiwer-2.6.0-py3-none-any.whl (20 kB)\n", - " Downloading jiwer-2.5.2-py3-none-any.whl (15 kB)\n", - "Collecting rapidfuzz (from nemo_toolkit[all])\n", - " Downloading rapidfuzz-2.13.7-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (2.2 MB)\n", - "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m2.2/2.2 MB\u001b[0m \u001b[31m105.1 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", - "\u001b[?25hRequirement already satisfied: audioread>=2.1.9 in /usr/local/lib/python3.10/dist-packages (from lhotse>=1.22.0->nemo_toolkit[all]) (3.0.1)\n", - "Collecting cytoolz>=0.10.1 (from lhotse>=1.22.0->nemo_toolkit[all])\n", - " Downloading cytoolz-0.12.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (2.0 MB)\n", - "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m2.0/2.0 MB\u001b[0m \u001b[31m95.5 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", - "\u001b[?25hCollecting intervaltree>=3.1.0 (from lhotse>=1.22.0->nemo_toolkit[all])\n", - " Downloading intervaltree-3.1.0.tar.gz (32 kB)\n", - " Preparing metadata (setup.py) ... \u001b[?25l\u001b[?25hdone\n", - "Collecting lilcom>=1.1.0 (from lhotse>=1.22.0->nemo_toolkit[all])\n", - " Downloading lilcom-1.7-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (87 kB)\n", - "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m87.1/87.1 kB\u001b[0m \u001b[31m12.8 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", - "\u001b[?25hRequirement already satisfied: joblib>=0.14 in /usr/local/lib/python3.10/dist-packages (from librosa>=0.10.0->nemo_toolkit[all]) (1.4.2)\n", - "Requirement already satisfied: decorator>=4.3.0 in /usr/local/lib/python3.10/dist-packages (from librosa>=0.10.0->nemo_toolkit[all]) (4.4.2)\n", - "Requirement already satisfied: pooch>=1.1 in /usr/local/lib/python3.10/dist-packages (from librosa>=0.10.0->nemo_toolkit[all]) (1.8.1)\n", - "Requirement already satisfied: soxr>=0.3.2 in /usr/local/lib/python3.10/dist-packages (from librosa>=0.10.0->nemo_toolkit[all]) (0.3.7)\n", - "Requirement already satisfied: lazy-loader>=0.1 in /usr/local/lib/python3.10/dist-packages (from librosa>=0.10.0->nemo_toolkit[all]) (0.4)\n", - "Requirement already satisfied: msgpack>=1.0 in /usr/local/lib/python3.10/dist-packages (from librosa>=0.10.0->nemo_toolkit[all]) (1.0.8)\n", - "Requirement already satisfied: contourpy>=1.0.1 in /usr/local/lib/python3.10/dist-packages (from matplotlib->nemo_toolkit[all]) (1.2.1)\n", - "Requirement already satisfied: cycler>=0.10 in /usr/local/lib/python3.10/dist-packages (from matplotlib->nemo_toolkit[all]) (0.12.1)\n", - "Requirement already satisfied: fonttools>=4.22.0 in /usr/local/lib/python3.10/dist-packages (from matplotlib->nemo_toolkit[all]) (4.51.0)\n", - "Requirement already satisfied: kiwisolver>=1.0.1 in /usr/local/lib/python3.10/dist-packages (from matplotlib->nemo_toolkit[all]) (1.4.5)\n", - "Requirement already satisfied: pyparsing>=2.3.1 in /usr/local/lib/python3.10/dist-packages (from matplotlib->nemo_toolkit[all]) (3.1.2)\n", - "Requirement already satisfied: rich>=12 in /usr/local/lib/python3.10/dist-packages (from nerfacc>=0.5.3->nemo_toolkit[all]) (13.7.1)\n", - "Requirement already satisfied: llvmlite<0.42,>=0.41.0dev0 in /usr/local/lib/python3.10/dist-packages (from numba->nemo_toolkit[all]) (0.41.1)\n", - "Requirement already satisfied: protobuf>=3.20.2 in /usr/local/lib/python3.10/dist-packages (from onnx>=1.7.0->nemo_toolkit[all]) (3.20.3)\n", - "Requirement already satisfied: six>=1.5 in /usr/local/lib/python3.10/dist-packages (from python-dateutil->nemo_toolkit[all]) (1.16.0)\n", - "Collecting lightning-utilities>=0.8.0 (from pytorch-lightning>=2.2.1->nemo_toolkit[all])\n", - " Downloading lightning_utilities-0.11.2-py3-none-any.whl (26 kB)\n", - "Requirement already satisfied: threadpoolctl>=2.0.0 in /usr/local/lib/python3.10/dist-packages (from scikit-learn->nemo_toolkit[all]) (3.5.0)\n", - "Requirement already satisfied: cffi>=1.0 in /usr/local/lib/python3.10/dist-packages (from soundfile->nemo_toolkit[all]) (1.16.0)\n", - "Requirement already satisfied: sympy in /usr/local/lib/python3.10/dist-packages (from torch->nemo_toolkit[all]) (1.12)\n", - "Requirement already satisfied: networkx in /usr/local/lib/python3.10/dist-packages (from torch->nemo_toolkit[all]) (3.3)\n", - "Requirement already satisfied: jinja2 in /usr/local/lib/python3.10/dist-packages (from torch->nemo_toolkit[all]) (3.1.4)\n", - "Collecting nvidia-cuda-nvrtc-cu12==12.1.105 (from torch->nemo_toolkit[all])\n", - " Using cached nvidia_cuda_nvrtc_cu12-12.1.105-py3-none-manylinux1_x86_64.whl (23.7 MB)\n", - "Collecting nvidia-cuda-runtime-cu12==12.1.105 (from torch->nemo_toolkit[all])\n", - " Using cached nvidia_cuda_runtime_cu12-12.1.105-py3-none-manylinux1_x86_64.whl (823 kB)\n", - "Collecting nvidia-cuda-cupti-cu12==12.1.105 (from torch->nemo_toolkit[all])\n", - " Using cached nvidia_cuda_cupti_cu12-12.1.105-py3-none-manylinux1_x86_64.whl (14.1 MB)\n", - "Collecting nvidia-cudnn-cu12==8.9.2.26 (from torch->nemo_toolkit[all])\n", - " Using cached nvidia_cudnn_cu12-8.9.2.26-py3-none-manylinux1_x86_64.whl (731.7 MB)\n", - "Collecting nvidia-cublas-cu12==12.1.3.1 (from torch->nemo_toolkit[all])\n", - " Using cached nvidia_cublas_cu12-12.1.3.1-py3-none-manylinux1_x86_64.whl (410.6 MB)\n", - "Collecting nvidia-cufft-cu12==11.0.2.54 (from torch->nemo_toolkit[all])\n", - " Using cached nvidia_cufft_cu12-11.0.2.54-py3-none-manylinux1_x86_64.whl (121.6 MB)\n", - "Collecting nvidia-curand-cu12==10.3.2.106 (from torch->nemo_toolkit[all])\n", - " Using cached nvidia_curand_cu12-10.3.2.106-py3-none-manylinux1_x86_64.whl (56.5 MB)\n", - "Collecting nvidia-cusolver-cu12==11.4.5.107 (from torch->nemo_toolkit[all])\n", - " Using cached nvidia_cusolver_cu12-11.4.5.107-py3-none-manylinux1_x86_64.whl (124.2 MB)\n", - "Collecting nvidia-cusparse-cu12==12.1.0.106 (from torch->nemo_toolkit[all])\n", - " Using cached nvidia_cusparse_cu12-12.1.0.106-py3-none-manylinux1_x86_64.whl (196.0 MB)\n", - "Collecting nvidia-nccl-cu12==2.20.5 (from torch->nemo_toolkit[all])\n", - " Using cached nvidia_nccl_cu12-2.20.5-py3-none-manylinux2014_x86_64.whl (176.2 MB)\n", - "Collecting nvidia-nvtx-cu12==12.1.105 (from torch->nemo_toolkit[all])\n", - " Using cached nvidia_nvtx_cu12-12.1.105-py3-none-manylinux1_x86_64.whl (99 kB)\n", - "Requirement already satisfied: triton==2.3.0 in /usr/local/lib/python3.10/dist-packages (from torch->nemo_toolkit[all]) (2.3.0)\n", - "Collecting nvidia-nvjitlink-cu12 (from nvidia-cusolver-cu12==11.4.5.107->torch->nemo_toolkit[all])\n", - " Downloading nvidia_nvjitlink_cu12-12.5.40-py3-none-manylinux2014_x86_64.whl (21.3 MB)\n", - "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m21.3/21.3 MB\u001b[0m \u001b[31m77.8 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", - "\u001b[?25hRequirement already satisfied: tokenizers<0.20,>=0.19 in /usr/local/lib/python3.10/dist-packages (from transformers<=4.40.2,>=4.36.0->nemo_toolkit[all]) (0.19.1)\n", - "Collecting botocore<1.35.0,>=1.34.113 (from boto3->nemo_toolkit[all])\n", - " Downloading botocore-1.34.113-py3-none-any.whl (12.3 MB)\n", - "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m12.3/12.3 MB\u001b[0m \u001b[31m118.1 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", - "\u001b[?25hCollecting jmespath<2.0.0,>=0.7.1 (from boto3->nemo_toolkit[all])\n", - " Downloading jmespath-1.0.1-py3-none-any.whl (20 kB)\n", - "Collecting s3transfer<0.11.0,>=0.10.0 (from boto3->nemo_toolkit[all])\n", - " Downloading s3transfer-0.10.1-py3-none-any.whl (82 kB)\n", - "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m82.2/82.2 kB\u001b[0m \u001b[31m14.8 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", - "\u001b[?25hRequirement already satisfied: pyarrow>=12.0.0 in /usr/local/lib/python3.10/dist-packages (from datasets->nemo_toolkit[all]) (14.0.2)\n", - "Requirement already satisfied: pyarrow-hotfix in /usr/local/lib/python3.10/dist-packages (from datasets->nemo_toolkit[all]) (0.6)\n", - "Collecting dill<0.3.9,>=0.3.0 (from datasets->nemo_toolkit[all])\n", - " Downloading dill-0.3.8-py3-none-any.whl (116 kB)\n", - "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m116.3/116.3 kB\u001b[0m \u001b[31m20.5 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", - "\u001b[?25hCollecting xxhash (from datasets->nemo_toolkit[all])\n", - " Downloading xxhash-3.4.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (194 kB)\n", - "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m194.1/194.1 kB\u001b[0m \u001b[31m29.3 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", - "\u001b[?25hCollecting multiprocess (from datasets->nemo_toolkit[all])\n", - " Downloading multiprocess-0.70.16-py310-none-any.whl (134 kB)\n", - "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m134.8/134.8 kB\u001b[0m \u001b[31m21.7 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", - "\u001b[?25hRequirement already satisfied: aiohttp in /usr/local/lib/python3.10/dist-packages (from datasets->nemo_toolkit[all]) (3.9.5)\n", - "Collecting pybind11>=2.2 (from fasttext->nemo_toolkit[all])\n", - " Using cached pybind11-2.12.0-py3-none-any.whl (234 kB)\n", - "Requirement already satisfied: absl-py in /usr/local/lib/python3.10/dist-packages (from fiddle->nemo_toolkit[all]) (1.4.0)\n", - "Requirement already satisfied: graphviz in /usr/local/lib/python3.10/dist-packages (from fiddle->nemo_toolkit[all]) (0.20.3)\n", - "Collecting libcst (from fiddle->nemo_toolkit[all])\n", - " Downloading libcst-1.4.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (2.3 MB)\n", - "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m2.3/2.3 MB\u001b[0m \u001b[31m100.9 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", - "\u001b[?25hCollecting aniso8601>=0.82 (from flask-restful->nemo_toolkit[all])\n", - " Downloading aniso8601-9.0.1-py2.py3-none-any.whl (52 kB)\n", - "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m52.8/52.8 kB\u001b[0m \u001b[31m9.2 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", - "\u001b[?25hRequirement already satisfied: Flask>=0.8 in /usr/local/lib/python3.10/dist-packages (from flask-restful->nemo_toolkit[all]) (2.2.5)\n", - "Requirement already satisfied: pytz in /usr/local/lib/python3.10/dist-packages (from flask-restful->nemo_toolkit[all]) (2023.4)\n", - "Requirement already satisfied: wcwidth<0.3.0,>=0.2.12 in /usr/local/lib/python3.10/dist-packages (from ftfy->nemo_toolkit[all]) (0.2.13)\n", - "Collecting distance>=0.1.3 (from g2p-en->nemo_toolkit[all])\n", - " Downloading Distance-0.1.3.tar.gz (180 kB)\n", - "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m180.3/180.3 kB\u001b[0m \u001b[31m28.6 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", - "\u001b[?25h Preparing metadata (setup.py) ... \u001b[?25l\u001b[?25hdone\n", - "Requirement already satisfied: pydantic>=1.9.1 in /usr/local/lib/python3.10/dist-packages (from inflect->nemo_toolkit[all]) (2.7.1)\n", - "Requirement already satisfied: beautifulsoup4 in /usr/local/lib/python3.10/dist-packages (from gdown->nemo_toolkit[all]) (4.12.3)\n", - "Requirement already satisfied: ipykernel>=4.5.1 in /usr/local/lib/python3.10/dist-packages (from ipywidgets->nemo_toolkit[all]) (5.5.6)\n", - "Requirement already satisfied: ipython-genutils~=0.2.0 in /usr/local/lib/python3.10/dist-packages (from ipywidgets->nemo_toolkit[all]) (0.2.0)\n", - "Requirement already satisfied: traitlets>=4.3.1 in /usr/local/lib/python3.10/dist-packages (from ipywidgets->nemo_toolkit[all]) (5.7.1)\n", - "Requirement already satisfied: widgetsnbextension~=3.6.0 in /usr/local/lib/python3.10/dist-packages (from ipywidgets->nemo_toolkit[all]) (3.6.6)\n", - "Requirement already satisfied: ipython>=4.0.0 in /usr/local/lib/python3.10/dist-packages (from ipywidgets->nemo_toolkit[all]) (7.34.0)\n", - "Requirement already satisfied: jupyterlab-widgets>=1.0.0 in /usr/local/lib/python3.10/dist-packages (from ipywidgets->nemo_toolkit[all]) (3.0.10)\n", - "Collecting kornia-rs>=0.1.0 (from kornia->nemo_toolkit[all])\n", - " Downloading kornia_rs-0.1.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (2.4 MB)\n", - "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m2.4/2.4 MB\u001b[0m \u001b[31m62.0 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", - "\u001b[?25hCollecting cdifflib (from nemo-text-processing->nemo_toolkit[all])\n", - " Downloading cdifflib-1.2.6.tar.gz (11 kB)\n", - " Installing build dependencies ... \u001b[?25l\u001b[?25hdone\n", - " Getting requirements to build wheel ... \u001b[?25l\u001b[?25hdone\n", - " Installing backend dependencies ... \u001b[?25l\u001b[?25hdone\n", - " Preparing metadata (pyproject.toml) ... \u001b[?25l\u001b[?25hdone\n", - "Collecting pynini==2.1.5 (from nemo-text-processing->nemo_toolkit[all])\n", - " Downloading pynini-2.1.5-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (161.3 MB)\n", - "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m161.3/161.3 MB\u001b[0m \u001b[31m6.6 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", - "\u001b[?25hRequirement already satisfied: Cython>=0.29 in /usr/local/lib/python3.10/dist-packages (from pynini==2.1.5->nemo-text-processing->nemo_toolkit[all]) (3.0.10)\n", - "Requirement already satisfied: torchvision in /usr/local/lib/python3.10/dist-packages (from open-clip-torch->nemo_toolkit[all]) (0.18.0+cu121)\n", - "Collecting timm (from open-clip-torch->nemo_toolkit[all])\n", - " Downloading timm-1.0.3-py3-none-any.whl (2.3 MB)\n", - "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m2.3/2.3 MB\u001b[0m \u001b[31m98.3 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", - "\u001b[?25hRequirement already satisfied: tzdata>=2022.1 in /usr/local/lib/python3.10/dist-packages (from pandas->nemo_toolkit[all]) (2024.1)\n", - "Requirement already satisfied: sortedcontainers>=2.0.4 in /usr/local/lib/python3.10/dist-packages (from pyannote.core->nemo_toolkit[all]) (2.4.0)\n", - "Collecting pyannote.database>=4.0.1 (from pyannote.metrics->nemo_toolkit[all])\n", - " Downloading pyannote.database-5.1.0-py3-none-any.whl (48 kB)\n", - "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m48.1/48.1 kB\u001b[0m \u001b[31m8.1 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", - "\u001b[?25hCollecting docopt>=0.6.2 (from pyannote.metrics->nemo_toolkit[all])\n", - " Downloading docopt-0.6.2.tar.gz (25 kB)\n", - " Preparing metadata (setup.py) ... \u001b[?25l\u001b[?25hdone\n", - "Requirement already satisfied: future>=0.16.0 in /usr/local/lib/python3.10/dist-packages (from pyloudnorm->nemo_toolkit[all]) (0.18.3)\n", - "Requirement already satisfied: iniconfig in /usr/local/lib/python3.10/dist-packages (from pytest->nemo_toolkit[all]) (2.0.0)\n", - "Requirement already satisfied: pluggy<2.0,>=0.12 in /usr/local/lib/python3.10/dist-packages (from pytest->nemo_toolkit[all]) (1.5.0)\n", - "Requirement already satisfied: exceptiongroup>=1.0.0rc8 in /usr/local/lib/python3.10/dist-packages (from pytest->nemo_toolkit[all]) (1.2.1)\n", - "Collecting ruamel.yaml.clib>=0.2.7 (from ruamel.yaml->nemo_toolkit[all])\n", - " Downloading ruamel.yaml.clib-0.2.8-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl (526 kB)\n", - "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m526.7/526.7 kB\u001b[0m \u001b[31m53.7 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", - "\u001b[?25hCollecting portalocker (from sacrebleu->nemo_toolkit[all])\n", - " Downloading portalocker-2.8.2-py3-none-any.whl (17 kB)\n", - "Collecting colorama (from sacrebleu->nemo_toolkit[all])\n", - " Downloading colorama-0.4.6-py2.py3-none-any.whl (25 kB)\n", - "Requirement already satisfied: lxml in /usr/local/lib/python3.10/dist-packages (from sacrebleu->nemo_toolkit[all]) (4.9.4)\n", - "Requirement already satisfied: sphinxcontrib-applehelp in /usr/local/lib/python3.10/dist-packages (from sphinx->nemo_toolkit[all]) (1.0.8)\n", - "Requirement already satisfied: sphinxcontrib-devhelp in /usr/local/lib/python3.10/dist-packages (from sphinx->nemo_toolkit[all]) (1.0.6)\n", - "Requirement already satisfied: sphinxcontrib-jsmath in /usr/local/lib/python3.10/dist-packages (from sphinx->nemo_toolkit[all]) (1.0.1)\n", - "Requirement already satisfied: sphinxcontrib-htmlhelp>=2.0.0 in /usr/local/lib/python3.10/dist-packages (from sphinx->nemo_toolkit[all]) (2.0.5)\n", - "Requirement already satisfied: sphinxcontrib-serializinghtml>=1.1.5 in /usr/local/lib/python3.10/dist-packages (from sphinx->nemo_toolkit[all]) (1.1.10)\n", - "Requirement already satisfied: sphinxcontrib-qthelp in /usr/local/lib/python3.10/dist-packages (from sphinx->nemo_toolkit[all]) (1.0.7)\n", - "Requirement already satisfied: Pygments>=2.0 in /usr/local/lib/python3.10/dist-packages (from sphinx->nemo_toolkit[all]) (2.16.1)\n", - "Requirement already satisfied: docutils<0.19,>=0.14 in /usr/local/lib/python3.10/dist-packages (from sphinx->nemo_toolkit[all]) (0.18.1)\n", - "Requirement already satisfied: snowballstemmer>=1.1 in /usr/local/lib/python3.10/dist-packages (from sphinx->nemo_toolkit[all]) (2.2.0)\n", - "Requirement already satisfied: babel>=1.3 in /usr/local/lib/python3.10/dist-packages (from sphinx->nemo_toolkit[all]) (2.15.0)\n", - "Requirement already satisfied: alabaster<0.8,>=0.7 in /usr/local/lib/python3.10/dist-packages (from sphinx->nemo_toolkit[all]) (0.7.16)\n", - "Requirement already satisfied: imagesize in /usr/local/lib/python3.10/dist-packages (from sphinx->nemo_toolkit[all]) (1.4.1)\n", - "Collecting docutils<0.19,>=0.14 (from sphinx->nemo_toolkit[all])\n", - " Downloading docutils-0.17.1-py2.py3-none-any.whl (575 kB)\n", - "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m575.5/575.5 kB\u001b[0m \u001b[31m55.8 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", - "\u001b[?25hCollecting pybtex>=0.24 (from sphinxcontrib-bibtex->nemo_toolkit[all])\n", - " Downloading pybtex-0.24.0-py2.py3-none-any.whl (561 kB)\n", - "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m561.4/561.4 kB\u001b[0m \u001b[31m54.0 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", - "\u001b[?25hCollecting pybtex-docutils>=1.0.0 (from sphinxcontrib-bibtex->nemo_toolkit[all])\n", - " Downloading pybtex_docutils-1.0.3-py3-none-any.whl (6.4 kB)\n", - "Requirement already satisfied: grpcio>=1.48.2 in /usr/local/lib/python3.10/dist-packages (from tensorboard->nemo_toolkit[all]) (1.64.0)\n", - "Requirement already satisfied: google-auth<3,>=1.6.3 in /usr/local/lib/python3.10/dist-packages (from tensorboard->nemo_toolkit[all]) (2.27.0)\n", - "Requirement already satisfied: google-auth-oauthlib<2,>=0.5 in /usr/local/lib/python3.10/dist-packages (from tensorboard->nemo_toolkit[all]) (1.2.0)\n", - "Requirement already satisfied: markdown>=2.6.8 in /usr/local/lib/python3.10/dist-packages (from tensorboard->nemo_toolkit[all]) (3.6)\n", - "Requirement already satisfied: tensorboard-data-server<0.8.0,>=0.7.0 in /usr/local/lib/python3.10/dist-packages (from tensorboard->nemo_toolkit[all]) (0.7.2)\n", - "Requirement already satisfied: werkzeug>=1.0.1 in /usr/local/lib/python3.10/dist-packages (from tensorboard->nemo_toolkit[all]) (3.0.3)\n", - "Collecting plac (from texterrors->nemo_toolkit[all])\n", - " Downloading plac-1.4.3-py2.py3-none-any.whl (22 kB)\n", - "Collecting loguru (from texterrors->nemo_toolkit[all])\n", - " Downloading loguru-0.7.2-py3-none-any.whl (62 kB)\n", - "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m62.5/62.5 kB\u001b[0m \u001b[31m10.7 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", - "\u001b[?25hRequirement already satisfied: termcolor in /usr/local/lib/python3.10/dist-packages (from texterrors->nemo_toolkit[all]) (2.4.0)\n", - "Collecting Levenshtein (from texterrors->nemo_toolkit[all])\n", - " Downloading Levenshtein-0.25.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (177 kB)\n", - "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m177.4/177.4 kB\u001b[0m \u001b[31m24.3 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", - "\u001b[?25hCollecting trampoline>=0.1.2 (from torchsde->nemo_toolkit[all])\n", - " Downloading trampoline-0.1.2-py3-none-any.whl (5.2 kB)\n", - "Collecting docker-pycreds>=0.4.0 (from wandb->nemo_toolkit[all])\n", - " Downloading docker_pycreds-0.4.0-py2.py3-none-any.whl (9.0 kB)\n", - "Collecting gitpython!=3.1.29,>=1.0.0 (from wandb->nemo_toolkit[all])\n", - " Downloading GitPython-3.1.43-py3-none-any.whl (207 kB)\n", - "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m207.3/207.3 kB\u001b[0m \u001b[31m30.2 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", - "\u001b[?25hRequirement already satisfied: psutil>=5.0.0 in /usr/local/lib/python3.10/dist-packages (from wandb->nemo_toolkit[all]) (5.9.5)\n", - "Collecting sentry-sdk>=1.0.0 (from wandb->nemo_toolkit[all])\n", - " Downloading sentry_sdk-2.3.1-py2.py3-none-any.whl (289 kB)\n", - "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m289.0/289.0 kB\u001b[0m \u001b[31m27.1 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", - "\u001b[?25hCollecting setproctitle (from wandb->nemo_toolkit[all])\n", - " Downloading setproctitle-1.3.3-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl (30 kB)\n", - "Collecting asciitree (from zarr->nemo_toolkit[all])\n", - " Downloading asciitree-0.3.3.tar.gz (4.0 kB)\n", - " Preparing metadata (setup.py) ... \u001b[?25l\u001b[?25hdone\n", - "Collecting numcodecs>=0.10.0 (from zarr->nemo_toolkit[all])\n", - " Downloading numcodecs-0.12.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (7.7 MB)\n", - "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m7.7/7.7 MB\u001b[0m \u001b[31m118.6 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", - "\u001b[?25hCollecting fasteners (from zarr->nemo_toolkit[all])\n", - " Downloading fasteners-0.19-py3-none-any.whl (18 kB)\n", - "Requirement already satisfied: urllib3!=2.2.0,<3,>=1.25.4 in /usr/local/lib/python3.10/dist-packages (from botocore<1.35.0,>=1.34.113->boto3->nemo_toolkit[all]) (2.0.7)\n", - "Requirement already satisfied: pycparser in /usr/local/lib/python3.10/dist-packages (from cffi>=1.0->soundfile->nemo_toolkit[all]) (2.22)\n", - "Requirement already satisfied: toolz>=0.8.0 in /usr/local/lib/python3.10/dist-packages (from cytoolz>=0.10.1->lhotse>=1.22.0->nemo_toolkit[all]) (0.12.1)\n", - "Requirement already satisfied: itsdangerous>=2.0 in /usr/local/lib/python3.10/dist-packages (from Flask>=0.8->flask-restful->nemo_toolkit[all]) (2.2.0)\n", - "Requirement already satisfied: aiosignal>=1.1.2 in /usr/local/lib/python3.10/dist-packages (from aiohttp->datasets->nemo_toolkit[all]) (1.3.1)\n", - "Requirement already satisfied: attrs>=17.3.0 in /usr/local/lib/python3.10/dist-packages (from aiohttp->datasets->nemo_toolkit[all]) (23.2.0)\n", - "Requirement already satisfied: frozenlist>=1.1.1 in /usr/local/lib/python3.10/dist-packages (from aiohttp->datasets->nemo_toolkit[all]) (1.4.1)\n", - "Requirement already satisfied: multidict<7.0,>=4.5 in /usr/local/lib/python3.10/dist-packages (from aiohttp->datasets->nemo_toolkit[all]) (6.0.5)\n", - "Requirement already satisfied: yarl<2.0,>=1.0 in /usr/local/lib/python3.10/dist-packages (from aiohttp->datasets->nemo_toolkit[all]) (1.9.4)\n", - "Requirement already satisfied: async-timeout<5.0,>=4.0 in /usr/local/lib/python3.10/dist-packages (from aiohttp->datasets->nemo_toolkit[all]) (4.0.3)\n", - "Collecting gitdb<5,>=4.0.1 (from gitpython!=3.1.29,>=1.0.0->wandb->nemo_toolkit[all])\n", - " Downloading gitdb-4.0.11-py3-none-any.whl (62 kB)\n", - "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m62.7/62.7 kB\u001b[0m \u001b[31m9.9 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", - "\u001b[?25hRequirement already satisfied: cachetools<6.0,>=2.0.0 in /usr/local/lib/python3.10/dist-packages (from google-auth<3,>=1.6.3->tensorboard->nemo_toolkit[all]) (5.3.3)\n", - "Requirement already satisfied: pyasn1-modules>=0.2.1 in /usr/local/lib/python3.10/dist-packages (from google-auth<3,>=1.6.3->tensorboard->nemo_toolkit[all]) (0.4.0)\n", - "Requirement already satisfied: rsa<5,>=3.1.4 in /usr/local/lib/python3.10/dist-packages (from google-auth<3,>=1.6.3->tensorboard->nemo_toolkit[all]) (4.9)\n", - "Requirement already satisfied: requests-oauthlib>=0.7.0 in /usr/local/lib/python3.10/dist-packages (from google-auth-oauthlib<2,>=0.5->tensorboard->nemo_toolkit[all]) (1.3.1)\n", - "Requirement already satisfied: jupyter-client in /usr/local/lib/python3.10/dist-packages (from ipykernel>=4.5.1->ipywidgets->nemo_toolkit[all]) (6.1.12)\n", - "Requirement already satisfied: tornado>=4.2 in /usr/local/lib/python3.10/dist-packages (from ipykernel>=4.5.1->ipywidgets->nemo_toolkit[all]) (6.3.3)\n", - "Collecting jedi>=0.16 (from ipython>=4.0.0->ipywidgets->nemo_toolkit[all])\n", - " Downloading jedi-0.19.1-py2.py3-none-any.whl (1.6 MB)\n", - "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m1.6/1.6 MB\u001b[0m \u001b[31m83.7 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", - "\u001b[?25hRequirement already satisfied: pickleshare in /usr/local/lib/python3.10/dist-packages (from ipython>=4.0.0->ipywidgets->nemo_toolkit[all]) (0.7.5)\n", - "Requirement already satisfied: prompt-toolkit!=3.0.0,!=3.0.1,<3.1.0,>=2.0.0 in /usr/local/lib/python3.10/dist-packages (from ipython>=4.0.0->ipywidgets->nemo_toolkit[all]) (3.0.43)\n", - "Requirement already satisfied: backcall in /usr/local/lib/python3.10/dist-packages (from ipython>=4.0.0->ipywidgets->nemo_toolkit[all]) (0.2.0)\n", - "Requirement already satisfied: matplotlib-inline in /usr/local/lib/python3.10/dist-packages (from ipython>=4.0.0->ipywidgets->nemo_toolkit[all]) (0.1.7)\n", - "Requirement already satisfied: pexpect>4.3 in /usr/local/lib/python3.10/dist-packages (from ipython>=4.0.0->ipywidgets->nemo_toolkit[all]) (4.9.0)\n", - "Requirement already satisfied: MarkupSafe>=2.0 in /usr/local/lib/python3.10/dist-packages (from jinja2->torch->nemo_toolkit[all]) (2.1.5)\n", - "Collecting typer>=0.12.1 (from pyannote.database>=4.0.1->pyannote.metrics->nemo_toolkit[all])\n", - " Downloading typer-0.12.3-py3-none-any.whl (47 kB)\n", - "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m47.2/47.2 kB\u001b[0m \u001b[31m7.5 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", - "\u001b[?25hCollecting latexcodec>=1.0.4 (from pybtex>=0.24->sphinxcontrib-bibtex->nemo_toolkit[all])\n", - " Downloading latexcodec-3.0.0-py3-none-any.whl (18 kB)\n", - "Requirement already satisfied: annotated-types>=0.4.0 in /usr/local/lib/python3.10/dist-packages (from pydantic>=1.9.1->inflect->nemo_toolkit[all]) (0.7.0)\n", - "Requirement already satisfied: pydantic-core==2.18.2 in /usr/local/lib/python3.10/dist-packages (from pydantic>=1.9.1->inflect->nemo_toolkit[all]) (2.18.2)\n", - "Requirement already satisfied: charset-normalizer<4,>=2 in /usr/local/lib/python3.10/dist-packages (from requests->diffusers>=0.19.3->nemo_toolkit[all]) (3.3.2)\n", - "Requirement already satisfied: idna<4,>=2.5 in /usr/local/lib/python3.10/dist-packages (from requests->diffusers>=0.19.3->nemo_toolkit[all]) (3.7)\n", - "Requirement already satisfied: certifi>=2017.4.17 in /usr/local/lib/python3.10/dist-packages (from requests->diffusers>=0.19.3->nemo_toolkit[all]) (2024.2.2)\n", - "Requirement already satisfied: markdown-it-py>=2.2.0 in /usr/local/lib/python3.10/dist-packages (from rich>=12->nerfacc>=0.5.3->nemo_toolkit[all]) (3.0.0)\n", - "Requirement already satisfied: mpmath>=0.19 in /usr/local/lib/python3.10/dist-packages (from sympy->torch->nemo_toolkit[all]) (1.3.0)\n", - "Requirement already satisfied: notebook>=4.4.1 in /usr/local/lib/python3.10/dist-packages (from widgetsnbextension~=3.6.0->ipywidgets->nemo_toolkit[all]) (6.5.5)\n", - "Requirement already satisfied: soupsieve>1.2 in /usr/local/lib/python3.10/dist-packages (from beautifulsoup4->gdown->nemo_toolkit[all]) (2.5)\n", - "Requirement already satisfied: zipp>=0.5 in /usr/local/lib/python3.10/dist-packages (from importlib-metadata->diffusers>=0.19.3->nemo_toolkit[all]) (3.18.2)\n", - "INFO: pip is looking at multiple versions of levenshtein to determine which version is compatible with other requirements. This could take a while.\n", - "Collecting Levenshtein (from texterrors->nemo_toolkit[all])\n", - " Downloading Levenshtein-0.25.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (177 kB)\n", - "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m177.4/177.4 kB\u001b[0m \u001b[31m26.9 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", - "\u001b[?25h Downloading Levenshtein-0.24.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (177 kB)\n", - "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m177.4/177.4 kB\u001b[0m \u001b[31m27.5 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", - "\u001b[?25h Downloading Levenshtein-0.23.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (169 kB)\n", - "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m169.4/169.4 kB\u001b[0m \u001b[31m27.4 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", - "\u001b[?25h Downloading Levenshtein-0.22.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (172 kB)\n", - "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m172.9/172.9 kB\u001b[0m \u001b[31m26.9 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", - "\u001b[?25hRequirement already satisfied: PySocks!=1.5.7,>=1.5.6 in /usr/local/lib/python3.10/dist-packages (from requests->diffusers>=0.19.3->nemo_toolkit[all]) (1.7.1)\n", - "Collecting smmap<6,>=3.0.1 (from gitdb<5,>=4.0.1->gitpython!=3.1.29,>=1.0.0->wandb->nemo_toolkit[all])\n", - " Downloading smmap-5.0.1-py3-none-any.whl (24 kB)\n", - "Requirement already satisfied: parso<0.9.0,>=0.8.3 in /usr/local/lib/python3.10/dist-packages (from jedi>=0.16->ipython>=4.0.0->ipywidgets->nemo_toolkit[all]) (0.8.4)\n", - "Requirement already satisfied: mdurl~=0.1 in /usr/local/lib/python3.10/dist-packages (from markdown-it-py>=2.2.0->rich>=12->nerfacc>=0.5.3->nemo_toolkit[all]) (0.1.2)\n", - "Requirement already satisfied: pyzmq<25,>=17 in /usr/local/lib/python3.10/dist-packages (from notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets->nemo_toolkit[all]) (24.0.1)\n", - "Requirement already satisfied: argon2-cffi in /usr/local/lib/python3.10/dist-packages (from notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets->nemo_toolkit[all]) (23.1.0)\n", - "Requirement already satisfied: jupyter-core>=4.6.1 in /usr/local/lib/python3.10/dist-packages (from notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets->nemo_toolkit[all]) (5.7.2)\n", - "Requirement already satisfied: nbformat in /usr/local/lib/python3.10/dist-packages (from notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets->nemo_toolkit[all]) (5.10.4)\n", - "Requirement already satisfied: nbconvert>=5 in /usr/local/lib/python3.10/dist-packages (from notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets->nemo_toolkit[all]) (6.5.4)\n", - "Requirement already satisfied: nest-asyncio>=1.5 in /usr/local/lib/python3.10/dist-packages (from notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets->nemo_toolkit[all]) (1.6.0)\n", - "Requirement already satisfied: Send2Trash>=1.8.0 in /usr/local/lib/python3.10/dist-packages (from notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets->nemo_toolkit[all]) (1.8.3)\n", - "Requirement already satisfied: terminado>=0.8.3 in /usr/local/lib/python3.10/dist-packages (from notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets->nemo_toolkit[all]) (0.18.1)\n", - "Requirement already satisfied: prometheus-client in /usr/local/lib/python3.10/dist-packages (from notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets->nemo_toolkit[all]) (0.20.0)\n", - "Requirement already satisfied: nbclassic>=0.4.7 in /usr/local/lib/python3.10/dist-packages (from notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets->nemo_toolkit[all]) (1.0.0)\n", - "Requirement already satisfied: ptyprocess>=0.5 in /usr/local/lib/python3.10/dist-packages (from pexpect>4.3->ipython>=4.0.0->ipywidgets->nemo_toolkit[all]) (0.7.0)\n", - "Requirement already satisfied: pyasn1<0.7.0,>=0.4.6 in /usr/local/lib/python3.10/dist-packages (from pyasn1-modules>=0.2.1->google-auth<3,>=1.6.3->tensorboard->nemo_toolkit[all]) (0.6.0)\n", - "Requirement already satisfied: oauthlib>=3.0.0 in /usr/local/lib/python3.10/dist-packages (from requests-oauthlib>=0.7.0->google-auth-oauthlib<2,>=0.5->tensorboard->nemo_toolkit[all]) (3.2.2)\n", - "Collecting shellingham>=1.3.0 (from typer>=0.12.1->pyannote.database>=4.0.1->pyannote.metrics->nemo_toolkit[all])\n", - " Downloading shellingham-1.5.4-py2.py3-none-any.whl (9.8 kB)\n", - "Requirement already satisfied: jupyter-server>=1.8 in /usr/local/lib/python3.10/dist-packages (from nbclassic>=0.4.7->notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets->nemo_toolkit[all]) (1.24.0)\n", - "Requirement already satisfied: notebook-shim>=0.2.3 in /usr/local/lib/python3.10/dist-packages (from nbclassic>=0.4.7->notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets->nemo_toolkit[all]) (0.2.4)\n", - "Requirement already satisfied: bleach in /usr/local/lib/python3.10/dist-packages (from nbconvert>=5->notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets->nemo_toolkit[all]) (6.1.0)\n", - "Requirement already satisfied: defusedxml in /usr/local/lib/python3.10/dist-packages (from nbconvert>=5->notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets->nemo_toolkit[all]) (0.7.1)\n", - "Requirement already satisfied: entrypoints>=0.2.2 in /usr/local/lib/python3.10/dist-packages (from nbconvert>=5->notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets->nemo_toolkit[all]) (0.4)\n", - "Requirement already satisfied: jupyterlab-pygments in /usr/local/lib/python3.10/dist-packages (from nbconvert>=5->notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets->nemo_toolkit[all]) (0.3.0)\n", - "Requirement already satisfied: mistune<2,>=0.8.1 in /usr/local/lib/python3.10/dist-packages (from nbconvert>=5->notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets->nemo_toolkit[all]) (0.8.4)\n", - "Requirement already satisfied: nbclient>=0.5.0 in /usr/local/lib/python3.10/dist-packages (from nbconvert>=5->notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets->nemo_toolkit[all]) (0.10.0)\n", - "Requirement already satisfied: pandocfilters>=1.4.1 in /usr/local/lib/python3.10/dist-packages (from nbconvert>=5->notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets->nemo_toolkit[all]) (1.5.1)\n", - "Requirement already satisfied: tinycss2 in /usr/local/lib/python3.10/dist-packages (from nbconvert>=5->notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets->nemo_toolkit[all]) (1.3.0)\n", - "Requirement already satisfied: fastjsonschema>=2.15 in /usr/local/lib/python3.10/dist-packages (from nbformat->notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets->nemo_toolkit[all]) (2.19.1)\n", - "Requirement already satisfied: jsonschema>=2.6 in /usr/local/lib/python3.10/dist-packages (from nbformat->notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets->nemo_toolkit[all]) (4.19.2)\n", - "Requirement already satisfied: argon2-cffi-bindings in /usr/local/lib/python3.10/dist-packages (from argon2-cffi->notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets->nemo_toolkit[all]) (21.2.0)\n", - "Requirement already satisfied: jsonschema-specifications>=2023.03.6 in /usr/local/lib/python3.10/dist-packages (from jsonschema>=2.6->nbformat->notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets->nemo_toolkit[all]) (2023.12.1)\n", - "Requirement already satisfied: referencing>=0.28.4 in /usr/local/lib/python3.10/dist-packages (from jsonschema>=2.6->nbformat->notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets->nemo_toolkit[all]) (0.35.1)\n", - "Requirement already satisfied: rpds-py>=0.7.1 in /usr/local/lib/python3.10/dist-packages (from jsonschema>=2.6->nbformat->notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets->nemo_toolkit[all]) (0.18.1)\n", - "Requirement already satisfied: anyio<4,>=3.1.0 in /usr/local/lib/python3.10/dist-packages (from jupyter-server>=1.8->nbclassic>=0.4.7->notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets->nemo_toolkit[all]) (3.7.1)\n", - "Requirement already satisfied: websocket-client in /usr/local/lib/python3.10/dist-packages (from jupyter-server>=1.8->nbclassic>=0.4.7->notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets->nemo_toolkit[all]) (1.8.0)\n", - "Requirement already satisfied: webencodings in /usr/local/lib/python3.10/dist-packages (from bleach->nbconvert>=5->notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets->nemo_toolkit[all]) (0.5.1)\n", - "Requirement already satisfied: sniffio>=1.1 in /usr/local/lib/python3.10/dist-packages (from anyio<4,>=3.1.0->jupyter-server>=1.8->nbclassic>=0.4.7->notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets->nemo_toolkit[all]) (1.3.1)\n", - "Building wheels for collected packages: causal-conv1d, antlr4-python3-runtime, progress, clip, fasttext, kaldi-python-io, nemo_toolkit, rouge-score, sox, distance, docopt, intervaltree, asciitree, cdifflib\n", - " Building wheel for causal-conv1d (setup.py) ... \u001b[?25l\u001b[?25hdone\n", - " Created wheel for causal-conv1d: filename=causal_conv1d-1.2.2.post1-cp310-cp310-linux_x86_64.whl size=103643300 sha256=2bba8823ae89bd79c2d067978e0e533fab8298f69855bfc5d199828b278cf66c\n", - " Stored in directory: /root/.cache/pip/wheels/22/a7/db/0c9482dec3707ad23181b0eb2da40e4b8f26aaed49752fc49f\n", - " Building wheel for antlr4-python3-runtime (setup.py) ... \u001b[?25l\u001b[?25hdone\n", - " Created wheel for antlr4-python3-runtime: filename=antlr4_python3_runtime-4.9.3-py3-none-any.whl size=144554 sha256=2f9471cefb2dc6e381bd9d319dcec64f7c88b7e79e1683a5b3bc22f230e7dd00\n", - " Stored in directory: /root/.cache/pip/wheels/12/93/dd/1f6a127edc45659556564c5730f6d4e300888f4bca2d4c5a88\n", - " Building wheel for progress (setup.py) ... \u001b[?25l\u001b[?25hdone\n", - " Created wheel for progress: filename=progress-1.6-py3-none-any.whl size=9614 sha256=a85963983777cf4462c6afa303bc630dd1e28be54b6eb6cf98141b56e6dae5ed\n", - " Stored in directory: /root/.cache/pip/wheels/a2/68/5f/c339b20a41659d856c93ccdce6a33095493eb82c3964aac5a1\n", - " Building wheel for clip (setup.py) ... \u001b[?25l\u001b[?25hdone\n", - " Created wheel for clip: filename=clip-0.2.0-py3-none-any.whl size=6989 sha256=f656e4ba6e5ef302ba483b928407fef1c55258c7bf8261df60496cce106e7e8d\n", - " Stored in directory: /root/.cache/pip/wheels/7f/5c/e6/2c0fdb453a3569188864b17e9676bea8b3b7e160c037117869\n", - " Building wheel for fasttext (setup.py) ... \u001b[?25l\u001b[?25hdone\n", - " Created wheel for fasttext: filename=fasttext-0.9.2-cp310-cp310-linux_x86_64.whl size=4227138 sha256=e1bf53ed606bd38e5b01a839114b34fabad467d67b669a3fff65d5a9484241cd\n", - " Stored in directory: /root/.cache/pip/wheels/a5/13/75/f811c84a8ab36eedbaef977a6a58a98990e8e0f1967f98f394\n", - " Building wheel for kaldi-python-io (setup.py) ... \u001b[?25l\u001b[?25hdone\n", - " Created wheel for kaldi-python-io: filename=kaldi_python_io-1.2.2-py3-none-any.whl size=8949 sha256=b2b93a9ad56a38f5465239c2c042ecd5b3bbb9707e653f386dafc6d803aee405\n", - " Stored in directory: /root/.cache/pip/wheels/b7/23/5f/49d3a826be576faf61d84e8028e1914bb36a5586ee2613b087\n", - " Building wheel for nemo_toolkit (pyproject.toml) ... \u001b[?25l\u001b[?25hdone\n", - " Created wheel for nemo_toolkit: filename=nemo_toolkit-2.0.0rc1-py3-none-any.whl size=3709778 sha256=31c434d101313b4af736ff7798ee97be04ba13d380a4ad0e7fdd704c498e0642\n", - " Stored in directory: /tmp/pip-ephem-wheel-cache-sqf8kvo6/wheels/c3/4e/45/ab3d29aa73df619f27b371cacf809d5330a18f794879163c1b\n", - " Building wheel for rouge-score (setup.py) ... \u001b[?25l\u001b[?25hdone\n", - " Created wheel for rouge-score: filename=rouge_score-0.1.2-py3-none-any.whl size=24933 sha256=e94a4b49aed06b37a93a9c949b746fe6947798850f727c3da33e9dca080a3124\n", - " Stored in directory: /root/.cache/pip/wheels/5f/dd/89/461065a73be61a532ff8599a28e9beef17985c9e9c31e541b4\n", - " Building wheel for sox (setup.py) ... \u001b[?25l\u001b[?25hdone\n", - " Created wheel for sox: filename=sox-1.5.0-py3-none-any.whl size=40038 sha256=1675e9d5bcbec5434e5e910ef061ca9f6b1c18dee4c01531c523ef88b54bd614\n", - " Stored in directory: /root/.cache/pip/wheels/74/e7/7b/8033be3ec5e4994595d01269fc9657c8fd83a0dcbf8536666a\n", - " Building wheel for distance (setup.py) ... \u001b[?25l\u001b[?25hdone\n", - " Created wheel for distance: filename=Distance-0.1.3-py3-none-any.whl size=16258 sha256=8762c401eb16799f9df3ba85acbe69109341de3180393b23b80b6b79d718bd9b\n", - " Stored in directory: /root/.cache/pip/wheels/e8/bb/de/f71bf63559ea9a921059a5405806f7ff6ed612a9231c4a9309\n", - " Building wheel for docopt (setup.py) ... \u001b[?25l\u001b[?25hdone\n", - " Created wheel for docopt: filename=docopt-0.6.2-py2.py3-none-any.whl size=13706 sha256=8ee58371636140b7b1f4a7f4aa4d44f4ae6c84f7686a08f048e9caecdf6c0392\n", - " Stored in directory: /root/.cache/pip/wheels/fc/ab/d4/5da2067ac95b36618c629a5f93f809425700506f72c9732fac\n", - " Building wheel for intervaltree (setup.py) ... \u001b[?25l\u001b[?25hdone\n", - " Created wheel for intervaltree: filename=intervaltree-3.1.0-py2.py3-none-any.whl size=26096 sha256=51d389da8183a0b4f111d59c71a0c6c1ac3f5051ac07ef7347327b5b005cedac\n", - " Stored in directory: /root/.cache/pip/wheels/fa/80/8c/43488a924a046b733b64de3fac99252674c892a4c3801c0a61\n", - " Building wheel for asciitree (setup.py) ... \u001b[?25l\u001b[?25hdone\n", - " Created wheel for asciitree: filename=asciitree-0.3.3-py3-none-any.whl size=5034 sha256=57725650f47797654802547c4586ae35fc85bcd1b5ade4182c20544f9f074eb5\n", - " Stored in directory: /root/.cache/pip/wheels/7f/4e/be/1171b40f43b918087657ec57cf3b81fa1a2e027d8755baa184\n", - " Building wheel for cdifflib (pyproject.toml) ... \u001b[?25l\u001b[?25hdone\n", - " Created wheel for cdifflib: filename=cdifflib-1.2.6-cp310-cp310-linux_x86_64.whl size=27681 sha256=632549aac7fbe4fccb4c817424f8ef37b946f29887624270f061a5c92e6cde99\n", - " Stored in directory: /root/.cache/pip/wheels/87/a7/fd/8061e24ed08689045cb6d1ca303768dc463b20a5a338174841\n", - "Successfully built causal-conv1d antlr4-python3-runtime progress clip fasttext kaldi-python-io nemo_toolkit rouge-score sox distance docopt intervaltree asciitree cdifflib\n", - "Installing collected packages: trampoline, pydub, progress, plac, pangu, opencc, ninja, ijson, docopt, distance, clip, braceexpand, asciitree, antlr4-python3-runtime, aniso8601, addict, xxhash, webdataset, trimesh, textdistance, sox, smmap, shellingham, setproctitle, sentry-sdk, ruamel.yaml.clib, rapidfuzz, pytest-runner, pypinyin, pynini, pybind11, portalocker, pathspec, parameterized, onnx, omegaconf, nvidia-nvtx-cu12, nvidia-nvjitlink-cu12, nvidia-nccl-cu12, nvidia-curand-cu12, nvidia-cufft-cu12, nvidia-cuda-runtime-cu12, nvidia-cuda-nvrtc-cu12, nvidia-cuda-cupti-cu12, nvidia-cublas-cu12, numcodecs, mypy-extensions, marshmallow, markdown2, loguru, lilcom, lightning-utilities, libcst, latexcodec, kornia-rs, kaldiio, kaldi-python-io, jmespath, jedi, isort, intervaltree, ftfy, fasteners, faiss-cpu, einops, docutils, docker-pycreds, dill, decord, cytoolz, colorama, click, cdifflib, attrdict, zarr, sacremoses, sacrebleu, ruamel.yaml, resampy, pytest-mock, pypinyin-dict, PyMCubes, pyloudnorm, pybtex, pyannote.core, nvidia-cusparse-cu12, nvidia-cudnn-cu12, multiprocess, Levenshtein, jiwer, hydra-core, gitdb, fiddle, fasttext, einops-exts, botocore, black, typer, texterrors, s3transfer, rouge-score, pybtex-docutils, nvidia-cusolver-cu12, lhotse, gitpython, flask-restful, diffusers, wandb, transformers, sphinxcontrib-bibtex, pyannote.database, g2p-en, datasets, boto3, torchsde, torchmetrics, torchdiffeq, sentence-transformers, pyannote.metrics, nerfacc, nemo_toolkit, nemo-text-processing, kornia, causal-conv1d, accelerated-scan, timm, pytorch-lightning, taming-transformers, open-clip-torch\n", - " Attempting uninstall: docutils\n", - " Found existing installation: docutils 0.18.1\n", - " Uninstalling docutils-0.18.1:\n", - " Successfully uninstalled docutils-0.18.1\n", - " Attempting uninstall: click\n", - " Found existing installation: click 8.1.7\n", - " Uninstalling click-8.1.7:\n", - " Successfully uninstalled click-8.1.7\n", - " Attempting uninstall: typer\n", - " Found existing installation: typer 0.9.4\n", - " Uninstalling typer-0.9.4:\n", - " Successfully uninstalled typer-0.9.4\n", - " Attempting uninstall: transformers\n", - " Found existing installation: transformers 4.41.0\n", - " Uninstalling transformers-4.41.0:\n", - " Successfully uninstalled transformers-4.41.0\n", - "\u001b[31mERROR: pip's dependency resolver does not currently take into account all the packages that are installed. This behaviour is the source of the following dependency conflicts.\n", - "spacy 3.7.4 requires typer<0.10.0,>=0.3.0, but you have typer 0.12.3 which is incompatible.\n", - "weasel 0.3.4 requires typer<0.10.0,>=0.3.0, but you have typer 0.12.3 which is incompatible.\u001b[0m\u001b[31m\n", - "\u001b[0mSuccessfully installed Levenshtein-0.22.0 PyMCubes-0.1.4 accelerated-scan-0.2.0 addict-2.4.0 aniso8601-9.0.1 antlr4-python3-runtime-4.9.3 asciitree-0.3.3 attrdict-2.0.1 black-24.4.2 boto3-1.34.113 botocore-1.34.113 braceexpand-0.1.7 causal-conv1d-1.2.2.post1 cdifflib-1.2.6 click-8.0.2 clip-0.2.0 colorama-0.4.6 cytoolz-0.12.3 datasets-2.19.1 decord-0.6.0 diffusers-0.28.0 dill-0.3.8 distance-0.1.3 docker-pycreds-0.4.0 docopt-0.6.2 docutils-0.17.1 einops-0.8.0 einops-exts-0.0.4 faiss-cpu-1.8.0 fasteners-0.19 fasttext-0.9.2 fiddle-0.3.0 flask-restful-0.3.10 ftfy-6.2.0 g2p-en-2.1.0 gitdb-4.0.11 gitpython-3.1.43 hydra-core-1.3.2 ijson-3.2.3 intervaltree-3.1.0 isort-5.13.2 jedi-0.19.1 jiwer-2.5.2 jmespath-1.0.1 kaldi-python-io-1.2.2 kaldiio-2.18.0 kornia-0.7.2 kornia-rs-0.1.3 latexcodec-3.0.0 lhotse-1.23.0 libcst-1.4.0 lightning-utilities-0.11.2 lilcom-1.7 loguru-0.7.2 markdown2-2.4.13 marshmallow-3.21.2 multiprocess-0.70.16 mypy-extensions-1.0.0 nemo-text-processing-1.0.2 nemo_toolkit-2.0.0rc1 nerfacc-0.5.3 ninja-1.11.1.1 numcodecs-0.12.1 nvidia-cublas-cu12-12.1.3.1 nvidia-cuda-cupti-cu12-12.1.105 nvidia-cuda-nvrtc-cu12-12.1.105 nvidia-cuda-runtime-cu12-12.1.105 nvidia-cudnn-cu12-8.9.2.26 nvidia-cufft-cu12-11.0.2.54 nvidia-curand-cu12-10.3.2.106 nvidia-cusolver-cu12-11.4.5.107 nvidia-cusparse-cu12-12.1.0.106 nvidia-nccl-cu12-2.20.5 nvidia-nvjitlink-cu12-12.5.40 nvidia-nvtx-cu12-12.1.105 omegaconf-2.3.0 onnx-1.16.1 open-clip-torch-2.24.0 opencc-1.1.6 pangu-4.0.6.1 parameterized-0.9.0 pathspec-0.12.1 plac-1.4.3 portalocker-2.8.2 progress-1.6 pyannote.core-5.0.0 pyannote.database-5.1.0 pyannote.metrics-3.2.1 pybind11-2.12.0 pybtex-0.24.0 pybtex-docutils-1.0.3 pydub-0.25.1 pyloudnorm-0.1.1 pynini-2.1.5 pypinyin-0.51.0 pypinyin-dict-0.8.0 pytest-mock-3.14.0 pytest-runner-6.0.1 pytorch-lightning-2.2.5 rapidfuzz-2.13.7 resampy-0.4.3 rouge-score-0.1.2 ruamel.yaml-0.18.6 ruamel.yaml.clib-0.2.8 s3transfer-0.10.1 sacrebleu-2.4.2 sacremoses-0.1.1 sentence-transformers-2.7.0 sentry-sdk-2.3.1 setproctitle-1.3.3 shellingham-1.5.4 smmap-5.0.1 sox-1.5.0 sphinxcontrib-bibtex-2.6.2 taming-transformers-0.0.1 textdistance-4.6.2 texterrors-0.4.4 timm-1.0.3 torchdiffeq-0.2.3 torchmetrics-1.4.0.post0 torchsde-0.2.6 trampoline-0.1.2 transformers-4.40.2 trimesh-4.4.0 typer-0.12.3 wandb-0.17.0 webdataset-0.2.86 xxhash-3.4.1 zarr-2.18.2\n" - ] - } - ], - "source": [ - "!pip install wget\n", - "!apt-get install sox libsndfile1 ffmpeg\n", - "!pip install matplotlib>=3.3.2\n", - "\n", - "!python -m pip install git+https://github.com/NVIDIA/NeMo.git@1fa961ba03ab5f8c91b278640e29807079373372#egg=nemo_toolkit[all]\n", - "!python -m pip install pyannote.audio==3.2.0" - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "metadata": { - "id": "WLLmJFoeBWt7" - }, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "/usr/local/lib/python3.10/dist-packages/transformers/utils/generic.py:441: UserWarning: torch.utils._pytree._register_pytree_node is deprecated. Please use torch.utils._pytree.register_pytree_node instead.\n", - " _torch_pytree._register_pytree_node(\n" - ] - } - ], - "source": [ - "import torch\n", - "import torchaudio\n", - "from nemo.collections.asr.models import EncDecRNNTBPEModel\n", - "from nemo.collections.asr.modules.audio_preprocessing import (\n", - " AudioToMelSpectrogramPreprocessor as NeMoAudioToMelSpectrogramPreprocessor,\n", - ")\n", - "from nemo.collections.asr.parts.preprocessing.features import (\n", - " FilterbankFeaturesTA as NeMoFilterbankFeaturesTA,\n", - ")" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "8oUuhRnadATl" - }, - "source": [ - "### Downloading config, weights, tokenizer and audio example" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/" - }, - "id": "zjPqKs4s8eDi", - "outputId": "2add8ada-10f2-4ab9-f18d-95bfac5e3033" - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "--2024-05-28 06:42:34-- https://n-ws-q0bez.s3pd12.sbercloud.ru/b-ws-q0bez-jpv/GigaAM/rnnt_model_weights.ckpt\n", - "Resolving n-ws-q0bez.s3pd12.sbercloud.ru (n-ws-q0bez.s3pd12.sbercloud.ru)... 37.230.193.192\n", - "Connecting to n-ws-q0bez.s3pd12.sbercloud.ru (n-ws-q0bez.s3pd12.sbercloud.ru)|37.230.193.192|:443... connected.\n", - "HTTP request sent, awaiting response... 200 OK\n", - "Length: 974419733 (929M) [application/octet-stream]\n", - "Saving to: ‘rnnt_model_weights.ckpt’\n", - "\n", - "rnnt_model_weights. 100%[===================>] 929.28M 14.7MB/s in 83s \n", - "\n", - "2024-05-28 06:44:00 (11.2 MB/s) - ‘rnnt_model_weights.ckpt’ saved [974419733/974419733]\n", - "\n", - "--2024-05-28 06:44:00-- https://n-ws-q0bez.s3pd12.sbercloud.ru/b-ws-q0bez-jpv/GigaAM/rnnt_model_config.yaml\n", - "Resolving n-ws-q0bez.s3pd12.sbercloud.ru (n-ws-q0bez.s3pd12.sbercloud.ru)... 37.230.193.192\n", - "Connecting to n-ws-q0bez.s3pd12.sbercloud.ru (n-ws-q0bez.s3pd12.sbercloud.ru)|37.230.193.192|:443... connected.\n", - "HTTP request sent, awaiting response... 200 OK\n", - "Length: 2063 (2.0K) [application/octet-stream]\n", - "Saving to: ‘rnnt_model_config.yaml’\n", - "\n", - "rnnt_model_config.y 100%[===================>] 2.01K --.-KB/s in 0s \n", - "\n", - "2024-05-28 06:44:01 (667 MB/s) - ‘rnnt_model_config.yaml’ saved [2063/2063]\n", - "\n", - "--2024-05-28 06:44:01-- https://n-ws-q0bez.s3pd12.sbercloud.ru/b-ws-q0bez-jpv/GigaAM/example.wav\n", - "Resolving n-ws-q0bez.s3pd12.sbercloud.ru (n-ws-q0bez.s3pd12.sbercloud.ru)... 37.230.193.192\n", - "Connecting to n-ws-q0bez.s3pd12.sbercloud.ru (n-ws-q0bez.s3pd12.sbercloud.ru)|37.230.193.192|:443... connected.\n", - "HTTP request sent, awaiting response... 200 OK\n", - "Length: 361324 (353K) [application/octet-stream]\n", - "Saving to: ‘example.wav’\n", - "\n", - "example.wav 100%[===================>] 352.86K 414KB/s in 0.9s \n", - "\n", - "2024-05-28 06:44:03 (414 KB/s) - ‘example.wav’ saved [361324/361324]\n", - "\n", - "--2024-05-28 06:44:03-- https://n-ws-q0bez.s3pd12.sbercloud.ru/b-ws-q0bez-jpv/GigaAM/tokenizer_all_sets.tar\n", - "Resolving n-ws-q0bez.s3pd12.sbercloud.ru (n-ws-q0bez.s3pd12.sbercloud.ru)... 37.230.193.192\n", - "Connecting to n-ws-q0bez.s3pd12.sbercloud.ru (n-ws-q0bez.s3pd12.sbercloud.ru)|37.230.193.192|:443... connected.\n", - "HTTP request sent, awaiting response... 200 OK\n", - "Length: 276480 (270K) [application/octet-stream]\n", - "Saving to: ‘tokenizer_all_sets.tar’\n", - "\n", - "tokenizer_all_sets. 100%[===================>] 270.00K 390KB/s in 0.7s \n", - "\n", - "2024-05-28 06:44:04 (390 KB/s) - ‘tokenizer_all_sets.tar’ saved [276480/276480]\n", - "\n" - ] - } - ], - "source": [ - "import locale\n", - "\n", - "locale.getpreferredencoding = lambda: \"UTF-8\"\n", - "\n", - "!wget https://n-ws-q0bez.s3pd12.sbercloud.ru/b-ws-q0bez-jpv/GigaAM/rnnt_model_weights.ckpt\n", - "!wget https://n-ws-q0bez.s3pd12.sbercloud.ru/b-ws-q0bez-jpv/GigaAM/rnnt_model_config.yaml\n", - "!wget https://n-ws-q0bez.s3pd12.sbercloud.ru/b-ws-q0bez-jpv/GigaAM/example.wav\n", - "!wget https://n-ws-q0bez.s3pd12.sbercloud.ru/b-ws-q0bez-jpv/GigaAM/long_example.wav\n", - "!wget https://n-ws-q0bez.s3pd12.sbercloud.ru/b-ws-q0bez-jpv/GigaAM/tokenizer_all_sets.tar\n", - "!tar -xf tokenizer_all_sets.tar && rm tokenizer_all_sets.tar" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "7l6p192UWtLe" - }, - "source": [ - "### Adding modules for features extraction" - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "metadata": { - "id": "gzdGDuz3ZN2V" - }, - "outputs": [], - "source": [ - "class FilterbankFeaturesTA(NeMoFilterbankFeaturesTA):\n", - " def __init__(self, mel_scale: str = \"htk\", wkwargs=None, **kwargs):\n", - " if \"window_size\" in kwargs:\n", - " del kwargs[\"window_size\"]\n", - " if \"window_stride\" in kwargs:\n", - " del kwargs[\"window_stride\"]\n", - "\n", - " super().__init__(**kwargs)\n", - "\n", - " self._mel_spec_extractor: torchaudio.transforms.MelSpectrogram = (\n", - " torchaudio.transforms.MelSpectrogram(\n", - " sample_rate=self._sample_rate,\n", - " win_length=self.win_length,\n", - " hop_length=self.hop_length,\n", - " n_mels=kwargs[\"nfilt\"],\n", - " window_fn=self.torch_windows[kwargs[\"window\"]],\n", - " mel_scale=mel_scale,\n", - " norm=kwargs[\"mel_norm\"],\n", - " n_fft=kwargs[\"n_fft\"],\n", - " f_max=kwargs.get(\"highfreq\", None),\n", - " f_min=kwargs.get(\"lowfreq\", 0),\n", - " wkwargs=wkwargs,\n", - " )\n", - " )\n", - "\n", - "\n", - "class AudioToMelSpectrogramPreprocessor(NeMoAudioToMelSpectrogramPreprocessor):\n", - " def __init__(self, mel_scale: str = \"htk\", **kwargs):\n", - " super().__init__(**kwargs)\n", - " kwargs[\"nfilt\"] = kwargs[\"features\"]\n", - " del kwargs[\"features\"]\n", - " self.featurizer = (\n", - " FilterbankFeaturesTA( # Deprecated arguments; kept for config compatibility\n", - " mel_scale=mel_scale,\n", - " **kwargs,\n", - " )\n", - " )" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "pAS_1RpLWpjh" - }, - "source": [ - "### Transcribation example witch RNNT-model" - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/" - }, - "id": "D5dm-IG_KvY0", - "outputId": "bc31c717-ed0d-4e17-ac42-97875d9bd3e6", - "scrolled": false - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "[NeMo I 2024-05-28 18:58:47 mixins:172] Tokenizer SentencePieceTokenizer initialized with 512 tokens\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "[NeMo W 2024-05-28 18:58:48 audio_to_text_dataset:830] Could not load dataset as `manifest_filepath` was None. Provided config : {'shuffle': False, 'manifest_filepath': None}\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "[NeMo I 2024-05-28 18:58:48 features:305] PADDING: 0\n", - "[NeMo I 2024-05-28 18:58:51 rnnt_models:222] Using RNNT Loss : warprnnt_numba\n", - " Loss warprnnt_numba_kwargs: {'fastemit_lambda': 0.0, 'clamp': -1.0}\n", - "[NeMo I 2024-05-28 18:58:51 rnnt_models:222] Using RNNT Loss : warprnnt_numba\n", - " Loss warprnnt_numba_kwargs: {'fastemit_lambda': 0.0, 'clamp': -1.0}\n", - "[NeMo I 2024-05-28 18:58:51 rnnt_models:222] Using RNNT Loss : warprnnt_numba\n", - " Loss warprnnt_numba_kwargs: {'fastemit_lambda': 0.0, 'clamp': -1.0}\n" - ] - } - ], - "source": [ - "device = \"cuda\" if torch.cuda.is_available() else \"cpu\"\n", - "\n", - "model = EncDecRNNTBPEModel.from_config_file(\"./rnnt_model_config.yaml\")\n", - "ckpt = torch.load(\"./rnnt_model_weights.ckpt\", map_location=\"cpu\")\n", - "model.load_state_dict(ckpt, strict=False)\n", - "model.eval()\n", - "model = model.to(device)" - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/" - }, - "id": "nlrRmRPvKxYq", - "outputId": "693262a7-b058-4378-a628-85766c7110cb" - }, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "Transcribing: 100%|█████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████| 1/1 [00:00<00:00, 1.04it/s]\n" - ] - }, - { - "data": { - "text/plain": [ - "['ничьих не требуя похвал счастлив уж я надеждой сладкой что дева с трепетом любви посмотрит может быть украдкой на песни грешные мои у лукоморья дуб зеленый']" - ] - }, - "execution_count": 5, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "model.transcribe([\"./example.wav\"])[0]" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "Sl_3pybCBaSQ" - }, - "source": [ - "### Long-form transcription example" - ] - }, - { - "cell_type": "code", - "execution_count": 6, - "metadata": {}, - "outputs": [], - "source": [ - "from io import BytesIO\n", - "from typing import List, Tuple\n", - "\n", - "import numpy as np\n", - "from pyannote.audio import Pipeline\n", - "from pydub import AudioSegment" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Function for segmentation" - ] - }, - { - "cell_type": "code", - "execution_count": 28, - "metadata": {}, - "outputs": [], - "source": [ - "def audiosegment_to_numpy(audiosegment: AudioSegment) -> np.ndarray:\n", - " \"\"\"Convert AudioSegment to numpy array.\"\"\"\n", - " samples = np.array(audiosegment.get_array_of_samples())\n", - " if audiosegment.channels == 2:\n", - " samples = samples.reshape((-1, 2))\n", - "\n", - " samples = samples.astype(np.float32, order=\"C\") / 32768.0\n", - " return samples\n", - "\n", - "\n", - "def segment_audio(\n", - " audio_path: str,\n", - " pipeline: Pipeline,\n", - " max_duration: float = 22.0,\n", - " min_duration: float = 15.0,\n", - " new_chunk_threshold: float = 0.2,\n", - ") -> Tuple[List[np.ndarray], List[List[float]]]:\n", - " # Prepare audio for pyannote vad pipeline\n", - " audio = AudioSegment.from_wav(audio_path)\n", - " audio_bytes = BytesIO()\n", - " audio.export(audio_bytes, format=\"wav\")\n", - " audio_bytes.seek(0)\n", - "\n", - " # Process audio with pipeline to obtain segments with speech activity\n", - " sad_segments = pipeline({\"uri\": \"filename\", \"audio\": audio_bytes})\n", - "\n", - " segments = []\n", - " curr_duration = 0\n", - " curr_start = 0\n", - " curr_end = 0\n", - " boundaries = []\n", - "\n", - " # Concat segments from pipeline into chunks for asr according to max/min duration\n", - " for segment in sad_segments.get_timeline().support():\n", - " start = max(0, segment.start)\n", - " end = min(len(audio) / 1000, segment.end)\n", - " if (\n", - " curr_duration > min_duration and start - curr_end > new_chunk_threshold\n", - " ) or (curr_duration + (end - curr_end) > max_duration):\n", - " audio_segment = audiosegment_to_numpy(\n", - " audio[curr_start * 1000 : curr_end * 1000]\n", - " )\n", - " segments.append(audio_segment)\n", - " boundaries.append([curr_start, curr_end])\n", - " curr_start = start\n", - "\n", - " curr_end = end\n", - " curr_duration = curr_end - curr_start\n", - "\n", - " if curr_duration != 0:\n", - " audio_segment = audiosegment_to_numpy(\n", - " audio[curr_start * 1000 : curr_end * 1000]\n", - " )\n", - " segments.append(audio_segment)\n", - " boundaries.append([curr_start, curr_end])\n", - "\n", - " return segments, boundaries" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Initializing pyannote VAD pipeline and using it for segmentation" - ] - }, - { - "cell_type": "code", - "execution_count": 29, - "metadata": {}, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "Lightning automatically upgraded your loaded checkpoint from v1.1.3 to v2.2.4. To apply the upgrade to your files permanently, run `python -m pytorch_lightning.utilities.upgrade_checkpoint ../libs_cache/pyannote_cache/models--pyannote--segmentation/snapshots/059e96f964841d40f1a5e755bb7223f76666bba4/pytorch_model.bin`\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Model was trained with pyannote.audio 0.0.1, yours is 3.2.0. Bad things might happen unless you revert pyannote.audio to 0.x.\n", - "Model was trained with torch 1.7.1, yours is 2.3.0+cu121. Bad things might happen unless you revert torch to 1.x.\n" - ] - } - ], - "source": [ - "HF_TOKEN = \"\"\n", - "\n", - "# Initialize pyannote pipeline\n", - "pipeline = Pipeline.from_pretrained(\n", - " \"pyannote/voice-activity-detection\", use_auth_token=HF_TOKEN\n", - ")\n", - "pipeline = pipeline.to(torch.device(device))\n", - "\n", - "# Segment audio\n", - "segments, boundaries = segment_audio(\"./long_example.wav\", pipeline)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Transcribing segments with RNNT-model" - ] - }, - { - "cell_type": "code", - "execution_count": 30, - "metadata": { - "scrolled": true - }, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "Transcribing: 100%|█████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████| 1/1 [00:00<00:00, 1.84it/s]\n" - ] - } - ], - "source": [ - "# Transcribing segments\n", - "BATCH_SIZE = 10\n", - "transcriptions = model.transcribe(segments, batch_size=BATCH_SIZE)[0]" - ] - }, - { - "cell_type": "code", - "execution_count": 82, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "[00:00:00 - 00:16:83]: вечерня отошла давно но в кельях тихо и темно уже и сам игумин строгий свои молитвы прекратил и кости ветхие склонил перекрестясь на одр убогий кругом и сон и тишина но церкви дверь отворена\n", - "\n", - "[00:17:10 - 00:32:61]: трепещет луч лампады и тускло озаряет он и темну живопись икон и возлащенные оклады и раздается в тишине то тяжкий вздох то шепот важный и мрачно дремлет в вышине старинный свод\n", - "\n", - "[00:32:95 - 00:49:33]: глухой и влажный стоят за клиросом чернец и грешник неподвижны оба и шепот их как глаз из гроба и грешник бледен как мертвец монах несчастный полно перестань\n", - "\n", - "[00:49:82 - 01:05:74]: ужасна исповедь злодея заплачена тобою дань тому кто в злобе пламенея лукаво грешника блюдет и к вечной гибели ведет смирись опомнись время время раскаяние покров\n", - "\n", - "[01:05:97 - 01:10:90]: я разрешу тебя грехов сложи мучительное бремя\n", - "\n" - ] - } - ], - "source": [ - "def format_time(seconds):\n", - " hours = int(seconds // 3600)\n", - " minutes = int((seconds % 3600) // 60)\n", - " seconds = seconds % 60\n", - " full_seconds = int(seconds)\n", - " milliseconds = int((seconds - full_seconds) * 100)\n", - "\n", - " if hours > 0:\n", - " return f\"{hours:02}:{minutes:02}:{full_seconds:02}:{milliseconds:02}\"\n", - " else:\n", - " return f\"{minutes:02}:{full_seconds:02}:{milliseconds:02}\"\n", - "\n", - "\n", - "for transcription, boundary in zip(transcriptions, boundaries):\n", - " boundary_0 = format_time(boundary[0])\n", - " boundary_1 = format_time(boundary[1])\n", - " print(f\"[{boundary_0} - {boundary_1}]: {transcription}\\n\")" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [] - } - ], - "metadata": { - "accelerator": "GPU", - "colab": { - "gpuType": "T4", - "provenance": [] - }, - "kernelspec": { - "display_name": "Python 3 (ipykernel)", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.10.12" - } - }, - "nbformat": 4, - "nbformat_minor": 1 -} diff --git a/examples/rnnt_inference.py b/examples/rnnt_inference.py deleted file mode 100644 index 140330f..0000000 --- a/examples/rnnt_inference.py +++ /dev/null @@ -1,98 +0,0 @@ -import argparse - -import torch -import torchaudio -from nemo.collections.asr.models import EncDecRNNTBPEModel -from nemo.collections.asr.modules.audio_preprocessing import ( - AudioToMelSpectrogramPreprocessor as NeMoAudioToMelSpectrogramPreprocessor, -) -from nemo.collections.asr.parts.preprocessing.features import ( - FilterbankFeaturesTA as NeMoFilterbankFeaturesTA, -) -from omegaconf import OmegaConf, open_dict - - -class FilterbankFeaturesTA(NeMoFilterbankFeaturesTA): - def __init__(self, mel_scale: str = "htk", wkwargs=None, **kwargs): - if "window_size" in kwargs: - del kwargs["window_size"] - if "window_stride" in kwargs: - del kwargs["window_stride"] - - super().__init__(**kwargs) - - self._mel_spec_extractor = torchaudio.transforms.MelSpectrogram( - sample_rate=self._sample_rate, - win_length=self.win_length, - hop_length=self.hop_length, - n_mels=kwargs["nfilt"], - window_fn=self.torch_windows[kwargs["window"]], - mel_scale=mel_scale, - norm=kwargs["mel_norm"], - n_fft=kwargs["n_fft"], - f_max=kwargs.get("highfreq", None), - f_min=kwargs.get("lowfreq", 0), - wkwargs=wkwargs, - ) - - -class AudioToMelSpectrogramPreprocessor(NeMoAudioToMelSpectrogramPreprocessor): - def __init__(self, mel_scale: str = "htk", **kwargs): - super().__init__(**kwargs) - kwargs["nfilt"] = kwargs["features"] - del kwargs["features"] - self.featurizer = ( - FilterbankFeaturesTA( # Deprecated arguments; kept for config compatibility - mel_scale=mel_scale, - **kwargs, - ) - ) - - -def _parse_args(): - parser = argparse.ArgumentParser( - description="Run inference using GigaAM-RNNT checkpoint" - ) - parser.add_argument( - "--model_config", help="Path to GigaAM-RNNT config file (.yaml)" - ) - parser.add_argument( - "--model_weights", help="Path to GigaAM-RNNT checkpoint file (.ckpt)" - ) - parser.add_argument("--tokenizer_path", help="Path to tokenizer directory") - parser.add_argument("--audio_path", help="Path to audio signal") - parser.add_argument("--device", help="Device: cpu / cuda") - return parser.parse_args() - - -def main( - model_config: str, - model_weights: str, - tokenizer_path: str, - device: str, - audio_path: str, -): - config = OmegaConf.load(model_config) - with open_dict(config): - config.tokenizer.dir = tokenizer_path - - model = EncDecRNNTBPEModel.from_config_dict(config) - - ckpt = torch.load(model_weights, map_location="cpu") - model.load_state_dict(ckpt, strict=False) - model = model.to(device) - model.eval() - - transcription = model.transcribe([audio_path])[0][0] - print(f"transcription: {transcription}") - - -if __name__ == "__main__": - args = _parse_args() - main( - model_config=args.model_config, - model_weights=args.model_weights, - tokenizer_path=args.tokenizer_path, - device=args.device, - audio_path=args.audio_path, - ) diff --git a/examples/rnnt_longform_inference.py b/examples/rnnt_longform_inference.py deleted file mode 100644 index 0fb3e0f..0000000 --- a/examples/rnnt_longform_inference.py +++ /dev/null @@ -1,210 +0,0 @@ -import argparse -from io import BytesIO -from typing import List, Tuple - -import numpy as np -import torch -import torchaudio -from nemo.collections.asr.models import EncDecRNNTBPEModel -from nemo.collections.asr.modules.audio_preprocessing import ( - AudioToMelSpectrogramPreprocessor as NeMoAudioToMelSpectrogramPreprocessor, -) -from nemo.collections.asr.parts.preprocessing.features import ( - FilterbankFeaturesTA as NeMoFilterbankFeaturesTA, -) -from omegaconf import OmegaConf, open_dict -from pyannote.audio import Pipeline -from pydub import AudioSegment - - -class FilterbankFeaturesTA(NeMoFilterbankFeaturesTA): - def __init__(self, mel_scale: str = "htk", wkwargs=None, **kwargs): - if "window_size" in kwargs: - del kwargs["window_size"] - if "window_stride" in kwargs: - del kwargs["window_stride"] - - super().__init__(**kwargs) - - self._mel_spec_extractor = torchaudio.transforms.MelSpectrogram( - sample_rate=self._sample_rate, - win_length=self.win_length, - hop_length=self.hop_length, - n_mels=kwargs["nfilt"], - window_fn=self.torch_windows[kwargs["window"]], - mel_scale=mel_scale, - norm=kwargs["mel_norm"], - n_fft=kwargs["n_fft"], - f_max=kwargs.get("highfreq", None), - f_min=kwargs.get("lowfreq", 0), - wkwargs=wkwargs, - ) - - -class AudioToMelSpectrogramPreprocessor(NeMoAudioToMelSpectrogramPreprocessor): - def __init__(self, mel_scale: str = "htk", **kwargs): - super().__init__(**kwargs) - kwargs["nfilt"] = kwargs["features"] - del kwargs["features"] - self.featurizer = ( - FilterbankFeaturesTA( # Deprecated arguments; kept for config compatibility - mel_scale=mel_scale, - **kwargs, - ) - ) - - -def audiosegment_to_numpy(audiosegment: AudioSegment) -> np.ndarray: - """Convert AudioSegment to numpy array.""" - samples = np.array(audiosegment.get_array_of_samples()) - if audiosegment.channels == 2: - samples = samples.reshape((-1, 2)) - - samples = samples.astype(np.float32, order="C") / 32768.0 - return samples - - -def format_time(seconds: float) -> str: - hours = int(seconds // 3600) - minutes = int((seconds % 3600) // 60) - seconds = seconds % 60 - full_seconds = int(seconds) - milliseconds = int((seconds - full_seconds) * 100) - - if hours > 0: - return f"{hours:02}:{minutes:02}:{full_seconds:02}:{milliseconds:02}" - else: - return f"{minutes:02}:{full_seconds:02}:{milliseconds:02}" - - -def segment_audio( - audio_path: str, - pipeline: Pipeline, - max_duration: float = 22.0, - min_duration: float = 15.0, - new_chunk_threshold: float = 0.2, -) -> Tuple[List[np.ndarray], List[List[float]]]: - # Prepare audio for pyannote vad pipeline - audio = AudioSegment.from_wav(audio_path) - audio_bytes = BytesIO() - audio.export(audio_bytes, format="wav") - audio_bytes.seek(0) - - # Process audio with pipeline to obtain segments with speech activity - sad_segments = pipeline({"uri": "filename", "audio": audio_bytes}) - - segments = [] - curr_duration = 0 - curr_start = 0 - curr_end = 0 - boundaries = [] - - # Concat segments from pipeline into chunks for asr according to max/min duration - for segment in sad_segments.get_timeline().support(): - start = max(0, segment.start) - end = min(len(audio) / 1000, segment.end) - if ( - curr_duration > min_duration and start - curr_end > new_chunk_threshold - ) or (curr_duration + (end - curr_end) > max_duration): - audio_segment = audiosegment_to_numpy( - audio[curr_start * 1000 : curr_end * 1000] - ) - segments.append(audio_segment) - boundaries.append([curr_start, curr_end]) - curr_start = start - - curr_end = end - curr_duration = curr_end - curr_start - - if curr_duration != 0: - audio_segment = audiosegment_to_numpy( - audio[curr_start * 1000 : curr_end * 1000] - ) - segments.append(audio_segment) - boundaries.append([curr_start, curr_end]) - - return segments, boundaries - - -def _parse_args(): - parser = argparse.ArgumentParser( - description="Run long-form inference using GigaAM-RNNT checkpoint" - ) - parser.add_argument( - "--model_config", help="Path to GigaAM-RNNT config file (.yaml)" - ) - parser.add_argument( - "--model_weights", help="Path to GigaAM-RNNT checkpoint file (.ckpt)" - ) - parser.add_argument("--tokenizer_path", help="Path to tokenizer directory") - parser.add_argument("--audio_path", help="Path to audio signal") - parser.add_argument( - "--hf_token", help="HuggingFace token for using pyannote Pipeline" - ) - parser.add_argument("--device", help="Device: cpu / cuda") - parser.add_argument("--fp16", help="Run in FP16 mode", default=True) - parser.add_argument( - "--batch_size", help="Batch size for acoustic model inference", default=10 - ) - return parser.parse_args() - - -def main( - model_config: str, - model_weights: str, - tokenizer_path: str, - device: str, - audio_path: str, - hf_token: str, - fp16: bool, - batch_size: int = 10, -): - # Initialize model - config = OmegaConf.load(model_config) - with open_dict(config): - config.tokenizer.dir = tokenizer_path - - model = EncDecRNNTBPEModel.from_config_dict(config) - ckpt = torch.load(model_weights, map_location="cpu") - model.load_state_dict(ckpt, strict=False) - model = model.to(device) - if device != "cpu" and fp16: - model = model.half() - model.preprocessor = model.preprocessor.float() - model.eval() - - # Initialize pyannote pipeline - pipeline = Pipeline.from_pretrained( - "pyannote/voice-activity-detection", use_auth_token=hf_token - ) - pipeline = pipeline.to(torch.device(device)) - - # Segment audio - segments, boundaries = segment_audio(audio_path, pipeline) - - # Transcribe segments - transcriptions = [] - if device != "cpu" and fp16: - with torch.autocast(device_type="cuda", dtype=torch.float16): - transcriptions = model.transcribe(segments, batch_size=batch_size)[0] - else: - transcriptions = model.transcribe(segments, batch_size=batch_size)[0] - - for transcription, boundary in zip(transcriptions, boundaries): - print( - f"[{format_time(boundary[0])} - {format_time(boundary[1])}]: {transcription}\n" - ) - - -if __name__ == "__main__": - args = _parse_args() - main( - model_config=args.model_config, - model_weights=args.model_weights, - tokenizer_path=args.tokenizer_path, - device=args.device, - audio_path=args.audio_path, - hf_token=args.hf_token, - fp16=args.fp16, - batch_size=args.batch_size, - ) diff --git a/examples/ssl_inference.py b/examples/ssl_inference.py deleted file mode 100644 index 57a669e..0000000 --- a/examples/ssl_inference.py +++ /dev/null @@ -1,55 +0,0 @@ -import argparse - -import hydra -import soundfile -import torch -from omegaconf import OmegaConf - - -class SpecScaler(torch.nn.Module): - def forward(self, x: torch.Tensor) -> torch.Tensor: - return torch.log(x.clamp_(1e-9, 1e9)) - - -def _parse_args(): - parser = argparse.ArgumentParser( - description="Run inference using GigaAM checkpoint" - ) - parser.add_argument("--encoder_config", help="Path to GigaAM config file (.yaml)") - parser.add_argument( - "--model_weights", help="Path to GigaAM checkpoint file (.ckpt)" - ) - parser.add_argument("--audio_path", help="Path to audio signal") - parser.add_argument("--device", help="Device: cpu / cuda") - return parser.parse_args() - - -def main(encoder_config: str, model_weights: str, device: str, audio_path: str): - conf = OmegaConf.load(encoder_config) - - encoder = hydra.utils.instantiate(conf.encoder) - ckpt = torch.load(model_weights, map_location="cpu") - encoder.load_state_dict(ckpt, strict=True) - encoder.to(device) - - feature_extractor = hydra.utils.instantiate(conf.feature_extractor) - - audio_signal, _ = soundfile.read(audio_path, dtype="float32") - features = feature_extractor(torch.tensor(audio_signal).float()) - features = features.to(device) - - encoded, _ = encoder.forward( - audio_signal=features.unsqueeze(0), - length=torch.tensor([features.shape[-1]]).to(device), - ) - print(f"encoded signal shape: {encoded.shape}") - - -if __name__ == "__main__": - args = _parse_args() - main( - encoder_config=args.encoder_config, - model_weights=args.model_weights, - device=args.device, - audio_path=args.audio_path, - ) diff --git a/gigaam/__init__.py b/gigaam/__init__.py new file mode 100644 index 0000000..705d894 --- /dev/null +++ b/gigaam/__init__.py @@ -0,0 +1,145 @@ +import logging +import os +import urllib.request +from typing import Optional, Tuple, Union + +import torch +from tqdm import tqdm + +from .model import GigaAM, GigaAMASR, GigaAMEmo +from .preprocess import load_audio +from .utils import format_time + +# Default cache directory +_CACHE_DIR = os.path.expanduser("~/.cache/gigaam") +# Url with model checkpoints +_URL_DIR = "https://n-ws-q0bez.s3pd12.sbercloud.ru/b-ws-q0bez-jpv/GigaAM" +_MODEL_NAMES = [ + "ctc", + "rnnt", + "ssl", + "emo", + "v1_ctc", + "v1_rnnt", + "v1_ssl", + "v2_ctc", + "v2_rnnt", + "v2_ssl", +] + + +def _download_file(file_url: str, file_path: str) -> str: + """Helper to download a file if not already cached.""" + if os.path.exists(file_path): + return file_path + + os.makedirs(os.path.dirname(file_path), exist_ok=True) + + with urllib.request.urlopen(file_url) as source, open(file_path, "wb") as output: + with tqdm( + total=int(source.info().get("Content-Length", 0)), + ncols=80, + unit="iB", + unit_scale=True, + unit_divisor=1024, + ) as loop: + while True: + buffer = source.read(8192) + if not buffer: + break + + output.write(buffer) + loop.update(len(buffer)) + + return file_path + + +def _download_model(model_name: str, download_root: str) -> Tuple[str, str]: + """Download the model weights if not already cached.""" + if model_name not in _MODEL_NAMES: + raise ValueError( + f"Model '{model_name}' not found. Available model names: {_MODEL_NAMES}" + ) + + if model_name in ["ctc", "rnnt", "ssl"]: + model_name = f"v2_{model_name}" + if model_name == "emo": + model_name = f"v1_{model_name}" + model_url = f"{_URL_DIR}/{model_name}.ckpt" + model_path = os.path.join(download_root, model_name + ".ckpt") + return model_name, _download_file(model_url, model_path) + + +def _download_tokenizer(model_name: str, download_root: str) -> Optional[str]: + """Download the tokenizer if required and return its path.""" + if model_name != "v1_rnnt": + return None # No tokenizer required for this model + + tokenizer_url = f"{_URL_DIR}/{model_name}_tokenizer.model" + tokenizer_path = os.path.join(download_root, model_name + "_tokenizer.model") + return _download_file(tokenizer_url, tokenizer_path) + + +def load_model( + model_name: str, + fp16_encoder: bool = True, + use_flash: Optional[bool] = False, + device: Optional[Union[str, torch.device]] = None, + download_root: Optional[str] = None, +) -> Union[GigaAM, GigaAMEmo, GigaAMASR]: + """ + Load the GigaAM model by name. + + Parameters + ---------- + model_name : str + The name of the model to load. + fp16_encoder: + Whether to convert encoder weights to FP16 precision. + use_flash : Optional[bool] + Whether to use flash_attn if the model allows it (requires the flash_attn library installed). + Default to False. + device : Optional[Union[str, torch.device]] + The device to load the model onto. Defaults to "cuda" if available, otherwise "cpu". + download_root : Optional[str] + The directory to download the model to. Defaults to "~/.cache/gigaam". + """ + if device is None: + device = "cuda" if torch.cuda.is_available() else "cpu" + if isinstance(device, str): + device = torch.device(device) + + if download_root is None: + download_root = _CACHE_DIR + + model_name, model_path = _download_model(model_name, download_root) + tokenizer_path = _download_tokenizer(model_name, download_root) + + checkpoint = torch.load(model_path, map_location="cpu") + + if use_flash is not None: + checkpoint["cfg"].encoder.flash_attn = use_flash + if checkpoint["cfg"].encoder.get("flash_attn", False) and device.type == "cpu": + logging.warning("flash_attn is not supported on CPU. Disabling it...") + checkpoint["cfg"].encoder.flash_attn = False + + if tokenizer_path is not None: + checkpoint["cfg"].decoding.model_path = tokenizer_path + + if "ssl" in model_name: + model = GigaAM(checkpoint["cfg"]) + elif "emo" in model_name: + model = GigaAMEmo(checkpoint["cfg"]) + else: + model = GigaAMASR(checkpoint["cfg"]) + + model.load_state_dict(checkpoint["state_dict"], strict=False) + model = model.eval() + + if fp16_encoder and device.type != "cpu": + model.encoder = model.encoder.half() + elif fp16_encoder: + logging.warning("fp16 is not supported on CPU. Leaving fp32 weights...") + + checkpoint["cfg"].model_name = model_name + return model.to(device) diff --git a/gigaam/decoder.py b/gigaam/decoder.py new file mode 100644 index 0000000..5abbe67 --- /dev/null +++ b/gigaam/decoder.py @@ -0,0 +1,128 @@ +from typing import Dict, Optional, Tuple + +import torch +from torch import Tensor, nn + + +class CTCHead(nn.Module): + """ + CTC Head module for Connectionist Temporal Classification. + """ + + def __init__(self, feat_in: int, num_classes: int): + super().__init__() + self.decoder_layers = torch.nn.Sequential( + torch.nn.Conv1d(feat_in, num_classes, kernel_size=1) + ) + + def forward(self, encoder_output: Tensor) -> Tensor: + return torch.nn.functional.log_softmax( + self.decoder_layers(encoder_output).transpose(1, 2), dim=-1 + ) + + +class RNNTJoint(nn.Module): + """ + RNN-Transducer Joint Network Module. + This module combines the outputs of the encoder and the prediction network using + a linear transformation followed by ReLU activation and another linear projection. + """ + + def __init__( + self, enc_hidden: int, pred_hidden: int, joint_hidden: int, num_classes: int + ): + super().__init__() + self.enc_hidden = enc_hidden + self.pred_hidden = pred_hidden + self.pred = nn.Linear(pred_hidden, joint_hidden) + self.enc = nn.Linear(enc_hidden, joint_hidden) + self.joint_net = nn.Sequential(nn.ReLU(), nn.Linear(joint_hidden, num_classes)) + + def joint(self, encoder_out: Tensor, decoder_out: Tensor) -> Tensor: + """ + Combine the encoder and prediction network outputs into a joint representation. + """ + enc = self.enc(encoder_out).unsqueeze(2) + pred = self.pred(decoder_out).unsqueeze(1) + return self.joint_net(enc + pred).log_softmax(-1) + + def input_example(self): + device = next(self.parameters()).device + enc = torch.zeros(1, self.enc_hidden, 1) + dec = torch.zeros(1, self.pred_hidden, 1) + return enc.float().to(device), dec.float().to(device) + + def input_names(self): + return ["enc", "dec"] + + def output_names(self): + return ["joint"] + + def forward(self, enc: Tensor, dec: Tensor) -> Tensor: + return self.joint(enc.transpose(1, 2), dec.transpose(1, 2)) + + +class RNNTDecoder(nn.Module): + """ + RNN-Transducer Decoder Module. + This module handles the prediction network part of the RNN-Transducer architecture. + """ + + def __init__(self, pred_hidden: int, pred_rnn_layers: int, num_classes: int): + super().__init__() + self.blank_id = num_classes - 1 + self.pred_hidden = pred_hidden + self.embed = nn.Embedding(num_classes, pred_hidden, padding_idx=self.blank_id) + self.lstm = nn.LSTM(pred_hidden, pred_hidden, pred_rnn_layers) + + def predict( + self, + x: Optional[Tensor], + state: Optional[Tensor], + batch_size: int = 1, + ) -> Tuple[Tensor, Tensor]: + """ + Make predictions based on the current input and previous states. + If no input is provided, use zeros as the initial input. + """ + if x is not None: + emb: Tensor = self.embed(x) + else: + emb = torch.zeros( + (batch_size, 1, self.pred_hidden), device=next(self.parameters()).device + ) + g, hid = self.lstm(emb.transpose(0, 1), state) + return g.transpose(0, 1), hid + + def input_example(self): + device = next(self.parameters()).device + label = torch.tensor([[0]]).to(device) + hidden_h = torch.zeros(1, 1, self.pred_hidden).to(device) + hidden_c = torch.zeros(1, 1, self.pred_hidden).to(device) + return label, hidden_h, hidden_c + + def input_names(self): + return ["x", "h", "c"] + + def output_names(self): + return ["dec", "h", "c"] + + def forward(self, x: Tensor, h: Tensor, c: Tensor) -> Tuple[Tensor, Tensor, Tensor]: + """ + ONNX-specific forward with x, state = (h, c) -> x, h, c. + """ + emb = self.embed(x) + g, (h, c) = self.lstm(emb.transpose(0, 1), (h, c)) + return g.transpose(0, 1), h, c + + +class RNNTHead(nn.Module): + """ + RNN-Transducer Head Module. + This module combines the decoder and joint network components of the RNN-Transducer architecture. + """ + + def __init__(self, decoder: Dict[str, int], joint: Dict[str, int]): + super().__init__() + self.decoder = RNNTDecoder(**decoder) + self.joint = RNNTJoint(**joint) diff --git a/gigaam/decoding.py b/gigaam/decoding.py new file mode 100644 index 0000000..98dc6d2 --- /dev/null +++ b/gigaam/decoding.py @@ -0,0 +1,127 @@ +from typing import List, Optional + +import torch +from sentencepiece import SentencePieceProcessor +from torch import Tensor + +from .decoder import CTCHead, RNNTHead + + +class Tokenizer: + """ + Tokenizer for converting between text and token IDs. + The tokenizer can operate either character-wise or using a pre-trained SentencePiece model. + """ + + def __init__(self, vocab: List[str], model_path: Optional[str] = None): + self.charwise = model_path is None + if self.charwise: + self.vocab = vocab + else: + self.model = SentencePieceProcessor() + self.model.load(model_path) + + def decode(self, tokens: List[int]) -> str: + """ + Convert a list of token IDs back to a string. + """ + if self.charwise: + return "".join(self.vocab[tok] for tok in tokens) + return self.model.decode(tokens) + + def __len__(self): + """ + Get the total number of tokens in the vocabulary. + """ + return len(self.vocab) if self.charwise else len(self.model) + + +class CTCGreedyDecoding: + """ + Class for performing greedy decoding of CTC outputs. + """ + + def __init__(self, vocabulary: List[str], model_path: Optional[str] = None): + self.tokenizer = Tokenizer(vocabulary, model_path) + self.blank_id = len(self.tokenizer) + + @torch.inference_mode() + def decode(self, head: CTCHead, encoded: Tensor, lengths: Tensor) -> List[str]: + """ + Decode the output of a CTC model into a list of hypotheses. + """ + log_probs = head(encoder_output=encoded) + assert ( + len(log_probs.shape) == 3 + ), f"Expected log_probs shape {log_probs.shape} == [B, T, C]" + b, _, c = log_probs.shape + assert ( + c == len(self.tokenizer) + 1 + ), f"Num classes {c} != len(vocab) + 1 {len(self.tokenizer) + 1}" + labels = log_probs.argmax(dim=-1, keepdim=False) + + skip_mask = labels != self.blank_id + skip_mask[:, 1:] = torch.logical_and( + skip_mask[:, 1:], labels[:, 1:] != labels[:, :-1] + ) + for length in lengths: + skip_mask[length:] = 0 + + pred_texts: List[str] = [] + for i in range(b): + pred_texts.append( + "".join(self.tokenizer.decode(labels[i][skip_mask[i]].cpu().tolist())) + ) + return pred_texts + + +class RNNTGreedyDecoding: + def __init__( + self, + vocabulary: List[str], + model_path: Optional[str] = None, + max_symbols_per_step: int = 10, + ): + """ + Class for performing greedy decoding of RNN-T outputs. + """ + self.tokenizer = Tokenizer(vocabulary, model_path) + self.blank_id = len(self.tokenizer) + self.max_symbols = max_symbols_per_step + + def _greedy_decode(self, head: RNNTHead, x: Tensor, seqlen: Tensor) -> str: + """ + Internal helper function for performing greedy decoding on a single sequence. + """ + hyp: List[int] = [] + dec_state: Optional[Tensor] = None + last_label: Optional[Tensor] = None + for t in range(seqlen): + f = x[t, :, :].unsqueeze(1) + not_blank = True + new_symbols = 0 + while not_blank and new_symbols < self.max_symbols: + g, hidden = head.decoder.predict(last_label, dec_state) + k = head.joint.joint(f, g)[0, 0, 0, :].argmax(0).item() + if k == self.blank_id: + not_blank = False + else: + hyp.append(k) + dec_state = hidden + last_label = torch.tensor([[hyp[-1]]]).to(x.device) + new_symbols += 1 + + return self.tokenizer.decode(hyp) + + @torch.inference_mode() + def decode(self, head: RNNTHead, encoded: Tensor, enc_len: Tensor) -> List[str]: + """ + Decode the output of an RNN-T model into a list of hypotheses. + """ + b = encoded.shape[0] + pred_texts = [] + encoded = encoded.transpose(1, 2) + for i in range(b): + inseq = encoded[i, :, :].unsqueeze(1) + pred_texts.append(self._greedy_decode(head, inseq, enc_len[i])) + return pred_texts diff --git a/gigaam/encoder.py b/gigaam/encoder.py new file mode 100644 index 0000000..931582d --- /dev/null +++ b/gigaam/encoder.py @@ -0,0 +1,527 @@ +import math +from abc import ABC, abstractmethod +from typing import List, Optional, Tuple, Union + +import torch +from torch import Tensor, nn + +try: + from flash_attn import flash_attn_func + + IMPORT_FLASH = True +except Exception as err: + IMPORT_FLASH = False + IMPORT_FLASH_ERR = err + +from .utils import apply_masked_flash_attn, apply_rotary_pos_emb + + +class StridingSubsampling(nn.Module): + """ + Strided Subsampling layer used to reduce the sequence length. + """ + + def __init__( + self, + subsampling_factor: int, + feat_in: int, + feat_out: int, + conv_channels: int, + ): + super().__init__() + self._sampling_num = int(math.log(subsampling_factor, 2)) + self._stride = 2 + self._kernel_size = 3 + self._padding = (self._kernel_size - 1) // 2 + + layers: List[nn.Module] = [] + in_channels = 1 + for _ in range(self._sampling_num): + layers.append( + torch.nn.Conv2d( + in_channels=in_channels, + out_channels=conv_channels, + kernel_size=self._kernel_size, + stride=self._stride, + padding=self._padding, + ) + ) + layers.append(nn.ReLU()) + in_channels = conv_channels + + out_length = self.calc_output_length(torch.tensor(feat_in)) + self.out = torch.nn.Linear(conv_channels * int(out_length), feat_out) + self.conv = torch.nn.Sequential(*layers) + + def calc_output_length(self, lengths: Tensor) -> Tensor: + """ + Calculates the output length after applying the subsampling. + """ + lengths = lengths.to(torch.float) + add_pad = 2 * self._padding - self._kernel_size + for _ in range(self._sampling_num): + lengths = torch.div(lengths + add_pad, self._stride) + 1.0 + lengths = torch.floor(lengths) + return lengths.to(dtype=torch.int) + + def forward(self, x: Tensor, lengths: Tensor) -> Tuple[Tensor, Tensor]: + x = self.conv(x.unsqueeze(1)) + b, _, t, _ = x.size() + x = self.out(x.transpose(1, 2).reshape(b, t, -1)) + return x, self.calc_output_length(lengths) + + +class MultiHeadAttention(nn.Module, ABC): + """ + Base class of Multi-Head Attention Mechanisms. + """ + + def __init__(self, n_head: int, n_feat: int, flash_attn=False): + super().__init__() + assert n_feat % n_head == 0 + self.d_k = n_feat // n_head + self.h = n_head + self.linear_q = nn.Linear(n_feat, n_feat) + self.linear_k = nn.Linear(n_feat, n_feat) + self.linear_v = nn.Linear(n_feat, n_feat) + self.linear_out = nn.Linear(n_feat, n_feat) + self.flash_attn = flash_attn + if self.flash_attn and not IMPORT_FLASH: + raise RuntimeError( + f"flash_attn_func was imported with err {IMPORT_FLASH_ERR}. " + "Please install flash_attn or use --no_flash flag. " + "If you have already done this, " + "--force-reinstall flag might be useful" + ) + + def forward_qkv( + self, query: Tensor, key: Tensor, value: Tensor + ) -> Tuple[Tensor, Tensor, Tensor]: + """ + Projects the inputs into queries, keys, and values for multi-head attention. + """ + b = query.size(0) + q = self.linear_q(query).view(b, -1, self.h, self.d_k) + k = self.linear_k(key).view(b, -1, self.h, self.d_k) + v = self.linear_v(value).view(b, -1, self.h, self.d_k) + if self.flash_attn: + return q, k, v + return q.transpose(1, 2), k.transpose(1, 2), v.transpose(1, 2) + + def forward_attention( + self, value: Tensor, scores: Tensor, mask: Optional[Tensor] + ) -> Tensor: + """ + Computes the scaled dot-product attention given the projected values and scores. + """ + b = value.size(0) + if mask is not None: + mask = mask.unsqueeze(1) + scores = scores.masked_fill(mask, -10000.0) + attn = torch.softmax(scores, dim=-1).masked_fill(mask, 0.0) + else: + attn = torch.softmax(scores, dim=-1) + x = torch.matmul(attn, value) + x = x.transpose(1, 2).reshape(b, -1, self.h * self.d_k) + return self.linear_out(x) + + +class RelPositionMultiHeadAttention(MultiHeadAttention): + """ + Relative Position Multi-Head Attention module. + """ + + def __init__(self, n_head: int, n_feat: int): + super().__init__(n_head, n_feat) + self.linear_pos = nn.Linear(n_feat, n_feat, bias=False) + self.pos_bias_u = nn.Parameter(torch.FloatTensor(self.h, self.d_k)) + self.pos_bias_v = nn.Parameter(torch.FloatTensor(self.h, self.d_k)) + + def rel_shift(self, x: Tensor) -> Tensor: + b, h, qlen, pos_len = x.size() + x = torch.nn.functional.pad(x, pad=(1, 0)) + x = x.view(b, h, -1, qlen) + return x[:, :, 1:].view(b, h, qlen, pos_len) + + def forward( + self, + query: Tensor, + key: Tensor, + value: Tensor, + pos_emb: Tensor, + mask: Optional[Tensor] = None, + ) -> Tensor: + q, k, v = self.forward_qkv(query, key, value) + q = q.transpose(1, 2) + p = self.linear_pos(pos_emb) + p = p.view(pos_emb.shape[0], -1, self.h, self.d_k).transpose(1, 2) + q_with_bias_u = (q + self.pos_bias_u).transpose(1, 2) + q_with_bias_v = (q + self.pos_bias_v).transpose(1, 2) + matrix_bd = torch.matmul(q_with_bias_v, p.transpose(-2, -1)) + matrix_bd = self.rel_shift(matrix_bd) + matrix_ac = torch.matmul(q_with_bias_u, k.transpose(-2, -1)) + matrix_bd = matrix_bd[:, :, :, : matrix_ac.size(-1)] + scores = (matrix_ac + matrix_bd) / math.sqrt(self.d_k) + return self.forward_attention(v, scores, mask) + + +class RotaryPositionMultiHeadAttention(MultiHeadAttention): + """ + Rotary Position Multi-Head Attention module. + """ + + def forward( + self, + query: Tensor, + key: Tensor, + value: Tensor, + pos_emb: List[Tensor], + mask: Optional[Tensor] = None, + ) -> Tensor: + b, t, _ = value.size() + query = query.transpose(0, 1).view(t, b, self.h, self.d_k) + key = key.transpose(0, 1).view(t, b, self.h, self.d_k) + value = value.transpose(0, 1).view(t, b, self.h, self.d_k) + + cos, sin = pos_emb + query, key = apply_rotary_pos_emb(query, key, cos, sin, offset=0) + + q, k, v = self.forward_qkv( + query.view(t, b, self.h * self.d_k).transpose(0, 1), + key.view(t, b, self.h * self.d_k).transpose(0, 1), + value.view(t, b, self.h * self.d_k).transpose(0, 1), + ) + + if not self.flash_attn: + scores = torch.matmul(q, k.transpose(-2, -1) / math.sqrt(self.d_k)) + out = self.forward_attention(v, scores, mask) + else: + if mask is None: + scores = flash_attn_func(q, k, v) + else: + scores = apply_masked_flash_attn(q, k, v, mask, self.h, self.d_k) + + scores = scores.view(b, -1, self.h * self.d_k) + out = self.linear_out(scores) + + return out + + +class PositionalEncoding(nn.Module, ABC): + """ + Base class of Positional Encodings. + """ + + def __init__(self, dim: int, base: int): + super().__init__() + self.dim = dim + self.base = base + + @abstractmethod + def create_pe(self, length: int, device: torch.device) -> Optional[Tensor]: + pass + + def extend_pe(self, length: int, device: torch.device): + """ + Extends the positional encoding buffer to process longer sequences. + """ + pe = self.create_pe(length, device) + if pe is None: + return + if hasattr(self, "pe"): + self.pe = pe + else: + self.register_buffer("pe", pe, persistent=False) + + +class RelPositionalEmbedding(PositionalEncoding): + """ + Relative Positional Embedding module. + """ + + def create_pe(self, length: int, device: torch.device) -> Optional[Tensor]: + """ + Creates the relative positional encoding matrix. + """ + if hasattr(self, "pe") and self.pe.shape[1] >= 2 * length - 1: + return None + positions = torch.arange(length - 1, -length, -1, device=device).unsqueeze(1) + pos_length = positions.size(0) + pe = torch.zeros(pos_length, self.dim, device=positions.device) + div_term = torch.exp( + torch.arange(0, self.dim, 2, device=pe.device) + * -(math.log(10000.0) / self.dim) + ) + pe[:, 0::2] = torch.sin(positions * div_term) + pe[:, 1::2] = torch.cos(positions * div_term) + return pe.unsqueeze(0) + + def forward(self, x: torch.Tensor) -> Tuple[Tensor, Tensor]: + input_len = x.size(1) + center_pos = self.pe.size(1) // 2 + 1 + start_pos = center_pos - input_len + end_pos = center_pos + input_len - 1 + return x, self.pe[:, start_pos:end_pos] + + +class RotaryPositionalEmbedding(PositionalEncoding): + """ + Rotary Positional Embedding module. + """ + + def create_pe(self, length: int, device: torch.device) -> Optional[Tensor]: + """ + Creates or extends the rotary positional encoding matrix. + """ + if hasattr(self, "pe") and self.pe.size(0) >= 2 * length: + return None + positions = torch.arange(0, length, dtype=torch.float32, device=device) + inv_freq = 1.0 / ( + self.base ** (torch.arange(0, self.dim, 2).float() / self.dim) + ) + t = torch.arange(length, device=positions.device).type_as(inv_freq) + freqs = torch.einsum("i,j->ij", t, inv_freq) + emb = torch.cat((freqs, freqs), dim=-1).to(positions.device) + return torch.cat([emb.cos()[:, None, None, :], emb.sin()[:, None, None, :]]) + + def forward(self, x: torch.Tensor) -> Tuple[Tensor, List[Tensor]]: + cos_emb = self.pe[0 : x.shape[1]] + half_pe = self.pe.shape[0] // 2 + sin_emb = self.pe[half_pe : half_pe + x.shape[1]] + return x, [cos_emb, sin_emb] + + +class ConformerConvolution(nn.Module): + """ + Conformer Convolution module. + """ + + def __init__( + self, + d_model: int, + kernel_size: int, + ): + super().__init__() + assert (kernel_size - 1) % 2 == 0 + self.pointwise_conv1 = nn.Conv1d(d_model, d_model * 2, kernel_size=1) + self.depthwise_conv = nn.Conv1d( + in_channels=d_model, + out_channels=d_model, + kernel_size=kernel_size, + padding=(kernel_size - 1) // 2, + groups=d_model, + bias=True, + ) + self.batch_norm = nn.BatchNorm1d(d_model) + self.activation = nn.SiLU() + self.pointwise_conv2 = nn.Conv1d(d_model, d_model, kernel_size=1) + + def forward(self, x: Tensor, pad_mask: Optional[Tensor] = None) -> Tensor: + x = x.transpose(1, 2) + x = self.pointwise_conv1(x) + x = nn.functional.glu(x, dim=1) + if pad_mask is not None: + x = x.masked_fill(pad_mask.unsqueeze(1), 0.0) + x = self.depthwise_conv(x) + x = self.batch_norm(x) + x = self.activation(x) + x = self.pointwise_conv2(x) + return x.transpose(1, 2) + + +class ConformerFeedForward(nn.Module): + """ + Conformer Feed Forward module. + """ + + def __init__(self, d_model: int, d_ff: int, use_bias=True): + super().__init__() + self.linear1 = nn.Linear(d_model, d_ff, bias=use_bias) + self.activation = nn.SiLU() + self.linear2 = nn.Linear(d_ff, d_model, bias=use_bias) + + def forward(self, x: Tensor) -> Tensor: + return self.linear2(self.activation(self.linear1(x))) + + +class ConformerLayer(nn.Module): + """ + Conformer Layer module. + This module combines several submodules including feed forward networks, + depthwise separable convolution, and multi-head self-attention + to form a single Conformer block. + """ + + def __init__( + self, + d_model: int, + d_ff: int, + self_attention_model: str, + n_heads: int = 16, + conv_kernel_size: int = 31, + flash_attn: bool = False, + ): + super().__init__() + self.fc_factor = 0.5 + self.norm_feed_forward1 = nn.LayerNorm(d_model) + self.feed_forward1 = ConformerFeedForward(d_model=d_model, d_ff=d_ff) + self.norm_conv = nn.LayerNorm(d_model) + self.conv = ConformerConvolution( + d_model=d_model, + kernel_size=conv_kernel_size, + ) + self.norm_self_att = nn.LayerNorm(d_model) + if self_attention_model == "rotary": + self.self_attn: nn.Module = RotaryPositionMultiHeadAttention( + n_head=n_heads, + n_feat=d_model, + flash_attn=flash_attn, + ) + else: + assert not flash_attn, "Not supported flash_attn for rel_pos" + self.self_attn = RelPositionMultiHeadAttention( + n_head=n_heads, + n_feat=d_model, + ) + self.norm_feed_forward2 = nn.LayerNorm(d_model) + self.feed_forward2 = ConformerFeedForward(d_model=d_model, d_ff=d_ff) + self.norm_out = nn.LayerNorm(d_model) + + def forward( + self, + x: Tensor, + pos_emb: Union[Tensor, List[Tensor]], + att_mask: Optional[Tensor] = None, + pad_mask: Optional[Tensor] = None, + ) -> Tensor: + residual = x + x = self.norm_feed_forward1(x) + x = self.feed_forward1(x) + residual = residual + x * self.fc_factor + + x = self.norm_self_att(residual) + x = self.self_attn(x, x, x, pos_emb, mask=att_mask) + residual = residual + x + + x = self.norm_conv(residual) + x = self.conv(x, pad_mask=pad_mask) + residual = residual + x + + x = self.norm_feed_forward2(residual) + x = self.feed_forward2(x) + residual = residual + x * self.fc_factor + + x = self.norm_out(residual) + return x + + +class ConformerEncoder(nn.Module): + """ + Conformer Encoder module. + This module encapsulates the entire Conformer encoder architecture, + consisting of a StridingSubsampling layer, positional embeddings, and + a stack of Conformer Layers. + It serves as the main component responsible for processing speech features. + """ + + def __init__( + self, + feat_in: int = 64, + n_layers: int = 16, + d_model: int = 768, + subsampling_factor: int = 4, + ff_expansion_factor: int = 4, + self_attention_model: str = "rotary", + n_heads: int = 16, + pos_emb_max_len: int = 5000, + conv_kernel_size: int = 31, + flash_attn: bool = False, + ): + super().__init__() + self.feat_in = feat_in + assert self_attention_model in [ + "rotary", + "rel_pos", + ], f"Not supported attn = {self_attention_model}" + + self.pre_encode = StridingSubsampling( + subsampling_factor=subsampling_factor, + feat_in=feat_in, + feat_out=d_model, + conv_channels=d_model, + ) + + if self_attention_model == "rotary": + self.pos_enc: nn.Module = RotaryPositionalEmbedding( + d_model // n_heads, pos_emb_max_len + ) + else: + self.pos_enc = RelPositionalEmbedding(d_model, pos_emb_max_len) + + self.layers = nn.ModuleList() + for _ in range(n_layers): + layer = ConformerLayer( + d_model=d_model, + d_ff=d_model * ff_expansion_factor, + self_attention_model=self_attention_model, + n_heads=n_heads, + conv_kernel_size=conv_kernel_size, + flash_attn=flash_attn, + ) + self.layers.append(layer) + + self.pos_enc.extend_pe(pos_emb_max_len, next(self.parameters()).device) + + def input_example( + self, + batch_size: int = 1, + seqlen: int = 200, + ): + device = next(self.parameters()).device + features = torch.zeros(batch_size, self.feat_in, seqlen) + feature_lengths = torch.full([batch_size], features.shape[-1]) + return features.float().to(device), feature_lengths.to(device) + + def input_names(self): + return ["audio_signal", "length"] + + def output_names(self): + return ["encoded", "encoded_len"] + + def dynamic_axes(self): + return { + "audio_signal": {0: "batch_size", 2: "seq_len"}, + "length": {0: "batch_size"}, + "encoded": {0: "batch_size", 1: "seq_len"}, + "encoded_len": {0: "batch_size"}, + } + + def forward(self, audio_signal: Tensor, length: Tensor) -> Tuple[Tensor, Tensor]: + audio_signal, length = self.pre_encode( + x=audio_signal.transpose(1, 2), lengths=length + ) + + max_len = audio_signal.size(1) + audio_signal, pos_emb = self.pos_enc(x=audio_signal) + + pad_mask = torch.arange(0, max_len, device=audio_signal.device).expand( + length.size(0), -1 + ) < length.unsqueeze(-1) + + att_mask = None + if audio_signal.shape[0] > 1: + att_mask = pad_mask.unsqueeze(1).repeat([1, max_len, 1]) + att_mask = torch.logical_and(att_mask, att_mask.transpose(1, 2)) + att_mask = ~att_mask + + pad_mask = ~pad_mask + + for layer in self.layers: + audio_signal = layer( + x=audio_signal, + pos_emb=pos_emb, + att_mask=att_mask, + pad_mask=pad_mask, + ) + + return audio_signal.transpose(1, 2), length diff --git a/gigaam/model.py b/gigaam/model.py new file mode 100644 index 0000000..bf58e79 --- /dev/null +++ b/gigaam/model.py @@ -0,0 +1,224 @@ +from typing import Dict, List, Tuple, Union + +import hydra +import omegaconf +import torch +from torch import Tensor, nn + +from .preprocess import SAMPLE_RATE, load_audio +from .utils import onnx_converter + +LONGFORM_THRESHOLD = 25 * SAMPLE_RATE + + +class GigaAM(nn.Module): + """ + Giga Acoustic Model: Self-Supervised Model for Speech Tasks + """ + + def __init__(self, cfg: omegaconf.DictConfig): + super().__init__() + self.cfg = cfg + self.preprocessor = hydra.utils.instantiate(self.cfg.preprocessor) + self.encoder = hydra.utils.instantiate(self.cfg.encoder) + + def forward( + self, + features: Tensor, + feature_lengths: Tensor, + ) -> Tensor: + """ + Perform forward pass through the preprocessor and encoder. + """ + features, feature_lengths = self.preprocessor(features, feature_lengths) + if self._device.type == "cpu": + return self.encoder(features, feature_lengths) + with torch.autocast(device_type=self._device.type, dtype=torch.float16): + return self.encoder(features, feature_lengths) + + @property + def _device(self) -> torch.device: + return next(self.parameters()).device + + @property + def _dtype(self) -> torch.dtype: + return next(self.parameters()).dtype + + def prepare_wav(self, wav_file: str) -> Tuple[Tensor, Tensor]: + """ + Prepare an audio file for processing by loading it onto + the correct device and converting its format. + """ + wav = load_audio(wav_file) + wav = wav.to(self._device).to(self._dtype).unsqueeze(0) + length = torch.full([1], wav.shape[-1], device=self._device) + return wav, length + + def embed_audio(self, wav_file: str) -> Tuple[Tensor, Tensor]: + """ + Extract audio representations using the GigaAM model. + """ + wav, length = self.prepare_wav(wav_file) + encoded, encoded_len = self.forward(wav, length) + return encoded, encoded_len + + def to_onnx(self, dir_path: str = ".") -> None: + """ + Export onnx model encoder to the specified dir. + """ + onnx_converter( + model_name=f"{self.cfg.model_name}_encoder", + out_dir=dir_path, + module=self.encoder, + dynamic_axes=self.encoder.dynamic_axes(), + ) + + +class GigaAMASR(GigaAM): + """ + Giga Acoustic Model for Speech Recognition + """ + + def __init__(self, cfg: omegaconf.DictConfig): + super().__init__(cfg) + self.head = hydra.utils.instantiate(self.cfg.head) + self.decoding = hydra.utils.instantiate(self.cfg.decoding) + + @torch.inference_mode() + def transcribe(self, wav_file: str) -> str: + """ + Transcribes a short audio file into text. + """ + wav, length = self.prepare_wav(wav_file) + if length > LONGFORM_THRESHOLD: + raise ValueError("Too long wav file, use 'transcribe_longform' method.") + + encoded, encoded_len = self.forward(wav, length) + return self.decoding.decode(self.head, encoded, encoded_len)[0] + + def forward_for_export(self, features: Tensor, feature_lengths: Tensor) -> Tensor: + """ + Encoder-decoder forward to save model entirely in onnx format. + """ + return self.head(self.encoder(features, feature_lengths)[0]) + + def to_onnx(self, dir_path: str = ".") -> None: + """ + Export onnx ASR model. + `ctc`: exported entirely in encoder-decoder format. + `rnnt`: exported in encoder/decoder/joint parts separately. + """ + if "ctc" in self.cfg.model_name: + saved_forward = self.forward + self.forward = self.forward_for_export + onnx_converter( + model_name=self.cfg.model_name, + out_dir=dir_path, + module=self, + inputs=self.encoder.input_example(), + input_names=["features", "feature_lengths"], + output_names=["log_probs"], + dynamic_axes={ + "features": {0: "batch_size", 2: "seq_len"}, + "feature_lengths": {0: "batch_size"}, + "log_probs": {0: "batch_size", 1: "seq_len"}, + }, + ) + self.forward = saved_forward + else: + super().to_onnx(dir_path) # export encoder + onnx_converter( + model_name=f"{self.cfg.model_name}_decoder", + out_dir=dir_path, + module=self.head.decoder, + ) + onnx_converter( + model_name=f"{self.cfg.model_name}_joint", + out_dir=dir_path, + module=self.head.joint, + ) + + @torch.inference_mode() + def transcribe_longform( + self, wav_file: str, **kwargs + ) -> List[Dict[str, Union[str, Tuple[float, float]]]]: + """ + Transcribes a long audio file by splitting it into segments and + then transcribing each segment. + """ + from .vad_utils import segment_audio + + transcribed_segments = [] + wav = load_audio(wav_file, return_format="int") + segments, boundaries = segment_audio( + wav, SAMPLE_RATE, device=self._device, **kwargs + ) + for segment, segment_boundaries in zip(segments, boundaries): + wav = segment.to(self._device).unsqueeze(0).to(self._dtype) + length = torch.full([1], wav.shape[-1], device=self._device) + encoded, encoded_len = self.forward(wav, length) + result = self.decoding.decode(self.head, encoded, encoded_len)[0] + transcribed_segments.append( + { + "transcription": result, + "boundaries": segment_boundaries, + } + ) + return transcribed_segments + + +class GigaAMEmo(GigaAM): + """ + Giga Acoustic Model for Emotion Recognition + """ + + def __init__(self, cfg: omegaconf.DictConfig): + super().__init__(cfg) + self.head = hydra.utils.instantiate(self.cfg.head) + self.id2name = cfg.id2name + + def get_probs(self, wav_file: str) -> Dict[str, float]: + """ + Calculate probabilities for each emotion class based on the provided audio file. + """ + wav, length = self.prepare_wav(wav_file) + encoded, _ = self.forward(wav, length) + encoded_pooled = nn.functional.avg_pool1d( + encoded, kernel_size=encoded.shape[-1] + ).squeeze(-1) + + logits = self.head(encoded_pooled)[0] + probs = nn.functional.softmax(logits, dim=-1).detach().tolist() + + return {self.id2name[i]: probs[i] for i in range(len(self.id2name))} + + def forward_for_export(self, features: Tensor, feature_lengths: Tensor) -> Tensor: + """ + Encoder-decoder forward to save model entirely in onnx format. + """ + encoded, _ = self.encoder(features, feature_lengths) + enc_pooled = nn.functional.avg_pool1d( + encoded, kernel_size=encoded.shape[-1].item() + ).squeeze(-1) + return nn.functional.softmax(self.head(enc_pooled)[0], dim=-1) + + def to_onnx(self, dir_path: str = ".") -> None: + """ + Export onnx Emo model. + """ + saved_forward = self.forward + self.forward = self.forward_for_export + onnx_converter( + model_name=self.cfg.model_name, + out_dir=dir_path, + module=self, + inputs=self.encoder.input_example(), + input_names=["features", "feature_lengths"], + output_names=["probs"], + dynamic_axes={ + "features": {0: "batch_size", 2: "seq_len"}, + "feature_lengths": {0: "batch_size"}, + "probs": {0: "batch_size", 1: "seq_len"}, + }, + ) + self.forward = saved_forward diff --git a/gigaam/onnx_utils.py b/gigaam/onnx_utils.py new file mode 100644 index 0000000..53c5fc8 --- /dev/null +++ b/gigaam/onnx_utils.py @@ -0,0 +1,166 @@ +import warnings +from typing import List, Optional + +import numpy as np +import onnxruntime as rt +import torch + +warnings.simplefilter("ignore", category=UserWarning) + +import gigaam + +D_MODEL = 768 +DTYPE = np.float32 +MAX_LETTERS_PER_FRAME = 3 +SAMPLE_RATE = 16000 +FEAT_IN = 64 +PRED_HIDDEN = 320 +BLANK_IDX = 33 +VOCAB = [ + " ", + "а", + "б", + "в", + "г", + "д", + "е", + "ж", + "з", + "и", + "й", + "к", + "л", + "м", + "н", + "о", + "п", + "р", + "с", + "т", + "у", + "ф", + "х", + "ц", + "ч", + "ш", + "щ", + "ъ", + "ы", + "ь", + "э", + "ю", + "я", +] + + +def transcribe_sample( + wav_file: str, + model_type: str, + sessions: List[rt.InferenceSession], + preprocessor: Optional[gigaam.preprocess.FeatureExtractor] = None, +) -> str: + if preprocessor is None: + preprocessor = gigaam.preprocess.FeatureExtractor(SAMPLE_RATE, FEAT_IN) + + assert model_type in ["ctc", "rnnt"], "Only `ctc` and `rnnt` inference supported" + + input_signal = gigaam.load_audio(wav_file) + input_signal = preprocessor( + input_signal.unsqueeze(0), torch.tensor([input_signal.shape[-1]]) + )[0].numpy() + + enc_sess = sessions[0] + enc_inputs = { + node.name: data + for (node, data) in zip( + enc_sess.get_inputs(), + [input_signal.astype(DTYPE), [input_signal.shape[-1]]], + ) + } + enc_features = enc_sess.run( + [node.name for node in enc_sess.get_outputs()], enc_inputs + )[0] + + token_ids = [] + prev_token = BLANK_IDX + if model_type == "ctc": + prev_tok = BLANK_IDX + for tok in enc_features.argmax(-1).squeeze().tolist(): + if (tok != prev_tok or prev_tok == BLANK_IDX) and tok != BLANK_IDX: + token_ids.append(tok) + prev_tok = tok + else: + pred_states = [ + np.zeros(shape=(1, 1, PRED_HIDDEN), dtype=DTYPE), + np.zeros(shape=(1, 1, PRED_HIDDEN), dtype=DTYPE), + ] + pred_sess, joint_sess = sessions[1:] + for j in range(enc_features.shape[-1]): + emitted_letters = 0 + while emitted_letters < MAX_LETTERS_PER_FRAME: + pred_inputs = { + node.name: data + for (node, data) in zip( + pred_sess.get_inputs(), [[[prev_token]]] + pred_states + ) + } + pred_outputs = pred_sess.run( + [node.name for node in pred_sess.get_outputs()], pred_inputs + ) + + joint_inputs = { + node.name: data + for node, data in zip( + joint_sess.get_inputs(), + [enc_features[:, :, [j]], pred_outputs[0].swapaxes(1, 2)], + ) + } + log_probs = joint_sess.run( + [node.name for node in joint_sess.get_outputs()], joint_inputs + ) + token = log_probs[0].argmax(-1)[0][0] + + if token != BLANK_IDX: + prev_token = int(token) + pred_states = pred_outputs[1:] + token_ids.append(int(token)) + emitted_letters += 1 + else: + break + + return "".join(VOCAB[tok] for tok in token_ids) + + +def load_onnx_sessions( + onnx_dir: str, + model_type: str, + model_version: Optional[str] = None, +) -> List[rt.InferenceSession]: + if model_version is None: + model_version = "v2" + + opts = rt.SessionOptions() + opts.intra_op_num_threads = 16 + opts.execution_mode = rt.ExecutionMode.ORT_SEQUENTIAL + + if model_type == "ctc": + model_path = f"{onnx_dir}/{model_version}_{model_type}.onnx" + sessions = [ + rt.InferenceSession( + model_path, providers=["CPUExecutionProvider"], sess_options=opts + ) + ] + else: + pth = f"{onnx_dir}/{model_version}_{model_type}" + enc_sess = rt.InferenceSession( + f"{pth}_encoder.onnx", providers=["CPUExecutionProvider"], sess_options=opts + ) + pred_sess = rt.InferenceSession( + f"{pth}_decoder.onnx", providers=["CPUExecutionProvider"], sess_options=opts + ) + joint_sess = rt.InferenceSession( + f"{pth}_joint.onnx", providers=["CPUExecutionProvider"], sess_options=opts + ) + sessions = [enc_sess, pred_sess, joint_sess] + + return sessions diff --git a/gigaam/preprocess.py b/gigaam/preprocess.py new file mode 100644 index 0000000..d3ee201 --- /dev/null +++ b/gigaam/preprocess.py @@ -0,0 +1,86 @@ +from subprocess import CalledProcessError, run +from typing import Tuple + +import torch +import torchaudio +from torch import Tensor, nn + +SAMPLE_RATE = 16000 + + +def load_audio( + audio_path: str, sample_rate: int = SAMPLE_RATE, return_format: str = "float" +) -> Tensor: + """ + Load an audio file and resample it to the specified sample rate. + """ + cmd = [ + "ffmpeg", + "-nostdin", + "-threads", + "0", + "-i", + audio_path, + "-f", + "s16le", + "-ac", + "1", + "-acodec", + "pcm_s16le", + "-ar", + str(sample_rate), + "-", + ] + try: + audio = run(cmd, capture_output=True, check=True).stdout + except CalledProcessError as exc: + raise RuntimeError("Failed to load audio") from exc + + if return_format == "float": + return torch.frombuffer(audio, dtype=torch.int16).float() / 32768.0 + + return torch.frombuffer(audio, dtype=torch.int16) + + +class SpecScaler(nn.Module): + """ + Module that applies logarithmic scaling to spectrogram values. + This module clamps the input values within a certain range and then applies a natural logarithm. + """ + + def forward(self, x: Tensor) -> Tensor: + return torch.log(x.clamp_(1e-9, 1e9)) + + +class FeatureExtractor(nn.Module): + """ + Module for extracting Log-mel spectrogram features from raw audio signals. + This module uses Torchaudio's MelSpectrogram transform to extract features + and applies logarithmic scaling. + """ + + def __init__(self, sample_rate: int, features: int): + super().__init__() + self.hop_length = sample_rate // 100 + self.featurizer = nn.Sequential( + torchaudio.transforms.MelSpectrogram( + sample_rate=sample_rate, + n_fft=sample_rate // 40, + win_length=sample_rate // 40, + hop_length=self.hop_length, + n_mels=features, + ), + SpecScaler(), + ) + + def out_len(self, input_lengths: Tensor) -> Tensor: + """ + Calculates the output length after the feature extraction process. + """ + return input_lengths.div(self.hop_length, rounding_mode="floor").add(1).long() + + def forward(self, input_signal: Tensor, length: Tensor) -> Tuple[Tensor, Tensor]: + """ + Extract Log-mel spectrogram features from the input audio signal. + """ + return self.featurizer(input_signal), self.out_len(length) diff --git a/gigaam/utils.py b/gigaam/utils.py new file mode 100644 index 0000000..53aa1f2 --- /dev/null +++ b/gigaam/utils.py @@ -0,0 +1,133 @@ +import warnings +from pathlib import Path +from typing import Dict, List, Optional, Tuple, Union + +import torch +import torch.nn.functional as F +from torch import Tensor +from torch.jit import TracerWarning + + +def onnx_converter( + model_name: str, + module: torch.nn.Module, + out_dir: str, + inputs: Optional[Tuple[Tensor]] = None, + input_names: Optional[List[str]] = None, + output_names: Optional[List[str]] = None, + dynamic_axes: Optional[ + Union[Dict[str, List[int]], Dict[str, Dict[int, str]]] + ] = None, + opset_version: int = 17, +): + if inputs is None: + inputs = module.input_example() + if input_names is None: + input_names = module.input_names() + if output_names is None: + output_names = module.output_names() + + Path(out_dir).mkdir(exist_ok=True, parents=True) + out_path = str(Path(out_dir) / f"{model_name}.onnx") + saved_dtype = next(module.parameters()).dtype + with warnings.catch_warnings(): + warnings.simplefilter("ignore", category=(UserWarning, TracerWarning)) + torch.onnx.export( + module.to(torch.float32), + inputs, + out_path, + input_names=input_names, + output_names=output_names, + dynamic_axes=dynamic_axes, + opset_version=opset_version, + ) + print(f"Succesfully ported onnx {model_name} to {out_path}.") + module.to(saved_dtype) + + +def format_time(seconds: float) -> str: + """ + Formats time in seconds to HH:MM:SS:mm format. + """ + hours = int(seconds // 3600) + minutes = int((seconds % 3600) // 60) + seconds = seconds % 60 + full_seconds = int(seconds) + milliseconds = int((seconds - full_seconds) * 100) + + if hours > 0: + return f"{hours:02}:{minutes:02}:{full_seconds:02}:{milliseconds:02}" + return f"{minutes:02}:{full_seconds:02}:{milliseconds:02}" + + +def rtt_half(x: Tensor) -> Tensor: + x1, x2 = x[..., : x.shape[-1] // 2], x[..., x.shape[-1] // 2 :] + return torch.cat([-x2, x1], dim=x1.ndim - 1) + + +def apply_rotary_pos_emb( + q: Tensor, k: Tensor, cos: Tensor, sin: Tensor, offset: int = 0 +) -> Tuple[Tensor, Tensor]: + """ + Applies Rotary Position Embeddings to query and key tensors. + """ + cos, sin = ( + cos[offset : q.shape[0] + offset, ...], + sin[offset : q.shape[0] + offset, ...], + ) + return (q * cos) + (rtt_half(q) * sin), (k * cos) + (rtt_half(k) * sin) + + +def apply_masked_flash_attn( + q: Tensor, + k: Tensor, + v: Tensor, + mask: Tensor, + h: int, + d_k: int, +) -> Tensor: + """ + Applies Flash Attention with padding masks. + """ + + from einops import rearrange + from flash_attn import flash_attn_varlen_func + from flash_attn.bert_padding import pad_input, unpad_input + + pad_mask = ~mask[:, 0, :] + b, t = pad_mask.shape + q = q.view(b, t, h * d_k) + k = k.view(b, t, h * d_k) + v = v.view(b, t, h * d_k) + + q_unpad, indices_q, _, max_seqlen_q = unpad_input(q, pad_mask)[:4] + q_unpad = rearrange(q_unpad, "nnz (h d) -> nnz h d", h=h) + + k_unpad = unpad_input(k, pad_mask)[0] + k_unpad = rearrange(k_unpad, "nnz (h d) -> nnz h d", h=h) + + v_unpad = unpad_input(v, pad_mask)[0] + v_unpad = rearrange(v_unpad, "nnz (h d) -> nnz h d", h=h) + + lengths_q = pad_mask.sum(1).to(torch.int32).to(q.device) + cu_seqlens_q = F.pad(lengths_q.cumsum(0), (1, 0), value=0).to(torch.int32) + max_seqlen_q = torch.max(lengths_q) + + output_unpad = flash_attn_varlen_func( + q_unpad, + k_unpad, + v_unpad, + cu_seqlens_q, + cu_seqlens_q, + max_seqlen_q, + max_seqlen_q, + ) + + scores = pad_input( + rearrange(output_unpad, "nnz h d -> nnz (h d)"), + indices_q, + b, + t, + ) + + return scores diff --git a/gigaam/vad_utils.py b/gigaam/vad_utils.py new file mode 100644 index 0000000..0284b90 --- /dev/null +++ b/gigaam/vad_utils.py @@ -0,0 +1,102 @@ +import os +from io import BytesIO +from typing import List, Tuple, Union + +import torch +from pyannote.audio import Pipeline +from pydub import AudioSegment + +_PIPELINE = None + + +def get_pipeline(device: Union[str, torch.device]) -> Pipeline: + """ + Retrieves a PyAnnote voice activity detection pipeline and move it to the specified device. + The pipeline is loaded only once and reused across subsequent calls. + It requires the Hugging Face API token to be set in the HF_TOKEN environment variable. + """ + global _PIPELINE + if _PIPELINE is not None: + return _PIPELINE.to(device) + + try: + hf_token = os.environ["HF_TOKEN"] + except KeyError as exc: + raise ValueError("HF_TOKEN environment variable is not set") from exc + + _PIPELINE = Pipeline.from_pretrained( + "pyannote/voice-activity-detection", use_auth_token=hf_token + ) + + return _PIPELINE.to(device) + + +def audiosegment_to_tensor(audiosegment: AudioSegment) -> torch.Tensor: + """ + Converts an AudioSegment object to a PyTorch tensor. + """ + samples = torch.tensor(audiosegment.get_array_of_samples(), dtype=torch.float32) + if audiosegment.channels == 2: + samples = samples.view(-1, 2) + + samples = samples / 32768.0 # Normalize to [-1, 1] range + return samples + + +def segment_audio( + wav_tensor: torch.Tensor, + sample_rate: int, + max_duration: float = 22.0, + min_duration: float = 15.0, + new_chunk_threshold: float = 0.2, + device: Union[str, torch.device] = "cpu", +) -> Tuple[List[torch.Tensor], List[Tuple[float, float]]]: + """ + Segments an audio waveform into smaller chunks based on speech activity. + The segmentation is performed using a PyAnnote voice activity detection pipeline. + """ + + audio = AudioSegment( + wav_tensor.numpy().tobytes(), + frame_rate=sample_rate, + sample_width=wav_tensor.dtype.itemsize, + channels=1, + ) + audio_bytes = BytesIO() + audio.export(audio_bytes, format="wav") + audio_bytes.seek(0) + + # Process audio with pipeline to obtain segments with speech activity + pipeline = get_pipeline(device) + sad_segments = pipeline({"uri": "filename", "audio": audio_bytes}) + + segments: List[torch.Tensor] = [] + curr_duration = 0.0 + curr_start = 0.0 + curr_end = 0.0 + boundaries: List[Tuple[float, float]] = [] + + # Concat segments from pipeline into chunks for asr according to max/min duration + for segment in sad_segments.get_timeline().support(): + start = max(0, segment.start) + end = min(len(audio) / 1000, segment.end) + if ( + curr_duration > min_duration and start - curr_end > new_chunk_threshold + ) or (curr_duration + (end - curr_end) > max_duration): + + start_ms = int(curr_start * 1000) + end_ms = int(curr_end * 1000) + segments.append(audiosegment_to_tensor(audio[start_ms:end_ms])) + boundaries.append((curr_start, curr_end)) + curr_start = start + + curr_end = end + curr_duration = curr_end - curr_start + + if curr_duration != 0: + start_ms = int(curr_start * 1000) + end_ms = int(curr_end * 1000) + segments.append(audiosegment_to_tensor(audio[start_ms:end_ms])) + boundaries.append((curr_start, curr_end)) + + return segments, boundaries diff --git a/gigaam_scheme.svg b/gigaam_scheme.svg index fe5a5a8..38b8ba6 100644 --- a/gigaam_scheme.svg +++ b/gigaam_scheme.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/inference_example.ipynb b/inference_example.ipynb new file mode 100644 index 0000000..22a7464 --- /dev/null +++ b/inference_example.ipynb @@ -0,0 +1,468 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": { + "id": "Me66GFwT0ABG" + }, + "source": [ + "### Installing reqs and downloading examples" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "PlM9MI70iTIp" + }, + "outputs": [], + "source": [ + "# If package is not installed\n", + "! pip install git+https://github.com/salute-developers/GigaAM.git" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "GSE4HSfr1P0B" + }, + "outputs": [], + "source": [ + "# Downloading wavs for examples\n", + "!wget https://n-ws-q0bez.s3pd12.sbercloud.ru/b-ws-q0bez-jpv/GigaAM/example.wav\n", + "!wget https://n-ws-q0bez.s3pd12.sbercloud.ru/b-ws-q0bez-jpv/GigaAM/long_example.wav" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "tIvec0280O64" + }, + "source": [ + "## Speech Recognition" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "xCgbSPkViZpF" + }, + "outputs": [], + "source": [ + "import os\n", + "import warnings\n", + "from typing import Dict\n", + "\n", + "import gigaam\n", + "\n", + "warnings.simplefilter(action=\"ignore\", category=FutureWarning)\n", + "warnings.simplefilter(action=\"ignore\", category=UserWarning)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 71 + }, + "id": "R2aUkZbG8fJ6", + "outputId": "3172d43c-19cf-4b97-df5e-108e40d92144" + }, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "100%|███████████████████████████████████████| 888M/888M [02:27<00:00, 6.29MiB/s]\n" + ] + }, + { + "data": { + "application/vnd.google.colaboratory.intrinsic+json": { + "type": "string" + }, + "text/plain": [ + "'ничьих не требуя похвал счастлив уж я надеждой сладкой что дева с трепетом любви посмотрит может быть украдкой на песни грешные мои у лукоморья дуб зеленый'" + ] + }, + "execution_count": null, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "model = gigaam.load_model(\n", + " \"ctc\", # GigaAM-V2 CTC model\n", + " fp16_encoder=True, # to use fp16 encoder weights - GPU only\n", + " use_flash=False, # disable flash attention - colab does not support it\n", + ")\n", + "model.transcribe(\"example.wav\")" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 107 + }, + "id": "5nPc8flc1U3d", + "outputId": "cce9f875-62ad-4b48-a6a9-29701eb343ed" + }, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "100%|███████████████████████████████████████| 892M/892M [02:34<00:00, 6.07MiB/s]\n", + "WARNING:root:flash_attn is not supported on CPU. Disabling it...\n", + "WARNING:root:fp16 is not supported on CPU. Leaving fp32 weights...\n" + ] + }, + { + "data": { + "application/vnd.google.colaboratory.intrinsic+json": { + "type": "string" + }, + "text/plain": [ + "'ничьих не требуя похвал счастлив уж я надеждой сладкой что дева с трепетом любви посмотрит может быть украдкой на песни грешные мои у лукоморья дуб зеленый'" + ] + }, + "execution_count": null, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "model = gigaam.load_model(\n", + " \"rnnt\", # GigaAM-V2 RNNT model\n", + " device=\"cpu\", # CPU-inference\n", + ")\n", + "model.transcribe(\"example.wav\")" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "78WAYQTa14Qs" + }, + "source": [ + "### Long-Form Speech Recognition" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "hvQdrpqG39kQ" + }, + "outputs": [], + "source": [ + "!pip install gigaam[longform]" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "riG4tjcH8fJ7" + }, + "source": [ + "* For long-form inference:\n", + " * generate [Hugging Face API token](https://huggingface.co/docs/hub/security-tokens)\n", + " * accept the conditions to access [pyannote/voice-activity-detection](https://huggingface.co/pyannote/voice-activity-detection) files and content\n", + " * accept the conditions to access [pyannote/segmentation](https://huggingface.co/pyannote/segmentation) files and content" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "GlpX1XOX4vGw" + }, + "outputs": [], + "source": [ + "os.environ[\"HF_TOKEN\"] = \"\"" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "DI_tb_N918FS", + "outputId": "db002337-fdd4-4fba-95e8-802e010d5303" + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[00:00:00 - 00:16:83]: вечерня отошла давно но в кельях тихо и темно уже и сам игумен строгий свои молитвы прекратил и кости ветхие склонил перекрестясь на одр убогий кругом и сон и тишина но церкви дверь отворена\n", + "[00:17:10 - 00:32:61]: трепещет луч лампады и тускло озаряет он и темную живопись икон и позлощенные оклады и раздается в тишине то тяжкий вздох то шепот важный и мрачно дремлет в вышине старинный свод\n", + "[00:32:95 - 00:49:33]: глухой и влажный стоят за клиросом чернец и грешник неподвижны оба и шепот их как глаз из гроба и грешник бледен как мертвец монах несчастный полно перестань\n", + "[00:49:82 - 01:05:74]: ужасна исповедь злодея заплачена тобою дань тому кто в злобе пламенея лукаво грешника блюдет и к вечной гибели ведет смирись опомнись время время раскаянье покров\n", + "[01:05:97 - 01:10:90]: я разрешу тебя грехов сложи мучительное бремя\n" + ] + } + ], + "source": [ + "model = gigaam.load_model(\"ctc\", use_flash=False)\n", + "recognition_result = model.transcribe_longform(\"long_example.wav\")\n", + "\n", + "for utterance in recognition_result:\n", + " transcription = utterance[\"transcription\"]\n", + " start, end = utterance[\"boundaries\"]\n", + " print(f\"[{gigaam.format_time(start)} - {gigaam.format_time(end)}]: {transcription}\")" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "ywEjYaAe3BMU" + }, + "source": [ + "## Emotion recognition" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "HWsJ2RuG3HNB", + "outputId": "6d1f8abb-9fb0-4c28-c5e3-c21413a22796" + }, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "100%|███████████████████████████████████████| 924M/924M [02:04<00:00, 7.78MiB/s]\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "angry: 0.000, sad: 0.002, neutral: 0.923, positive: 0.074\n" + ] + } + ], + "source": [ + "model = gigaam.load_model(\"emo\")\n", + "emotion2prob: Dict[str, int] = model.get_probs(\"example.wav\")\n", + "\n", + "print(\", \".join([f\"{emotion}: {prob:.3f}\" for emotion, prob in emotion2prob.items()]))" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "1EBcRVcC3P2E" + }, + "source": [ + "## GigaAM embeddings" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "5y2mEAGU3TYN", + "outputId": "ae488719-df9f-4318-ecf7-56c95a87a4ac" + }, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "100%|███████████████████████████████████████| 887M/887M [03:21<00:00, 4.62MiB/s]\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "tensor([[[-0.2829, 0.3638, 0.4520, ..., -0.4743, -0.4033, -0.2417],\n", + " [ 0.1611, -0.5006, -0.0584, ..., -0.6239, -0.2320, -0.2054],\n", + " [-1.1849, -1.0029, -0.6111, ..., -0.5137, -0.3737, -0.2654],\n", + " ...,\n", + " [ 0.0181, -0.3763, -0.8959, ..., 0.1716, 0.0556, 0.1298],\n", + " [ 0.2690, -0.0654, -0.5020, ..., -1.4432, -1.4827, -1.4490],\n", + " [-1.5650, -1.6693, -1.2834, ..., 0.5117, 0.4839, 0.0136]]],\n", + " device='cuda:0', grad_fn=)\n" + ] + } + ], + "source": [ + "# audio-only pretrained encoder\n", + "model = gigaam.load_model(\"ssl\", use_flash=False)\n", + "\n", + "emb, _ = model.embed_audio(\"example.wav\")\n", + "print(emb)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "hW8GKJrl3tm7", + "outputId": "160f4e59-3020-4986-b35e-5c7fa6e105fd" + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "tensor([[[-1.0334, -0.2841, -0.3606, ..., -0.2859, -0.6947, -0.7006],\n", + " [-0.4317, -0.0140, -0.9296, ..., 0.1781, 0.2170, -0.0181],\n", + " [-0.9221, -1.1284, -0.6389, ..., -1.0664, -1.3304, -1.2421],\n", + " ...,\n", + " [ 0.5749, 0.5176, -0.0996, ..., 1.7497, 1.8691, 2.1302],\n", + " [-0.2919, -0.8087, -1.2554, ..., -0.7942, -0.7634, -0.7938],\n", + " [-1.8086, -2.1976, -2.4012, ..., 0.8310, 1.0165, 1.0165]]],\n", + " device='cuda:0', grad_fn=)\n" + ] + } + ], + "source": [ + "# you also can embed audio with CTC- or RNNT-finetuned encoder\n", + "model = gigaam.load_model(\"ctc\", use_flash=False)\n", + "\n", + "emb, _ = model.embed_audio(\"example.wav\")\n", + "print(emb)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "je4WAyLgz0Ua" + }, + "source": [ + "## Export to ONNX" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "7tvo_v_iz0Ua", + "outputId": "4db517e6-7e85-4c01-c4c3-0b21744b8988" + }, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "100%|███████████████████████████████████████| 892M/892M [03:20<00:00, 4.66MiB/s]\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Succesfully ported onnx v2_rnnt_encoder to onnx/v2_rnnt_encoder.onnx.\n", + "Succesfully ported onnx v2_rnnt_decoder to onnx/v2_rnnt_decoder.onnx.\n", + "Succesfully ported onnx v2_rnnt_joint to onnx/v2_rnnt_joint.onnx.\n" + ] + } + ], + "source": [ + "onnx_dir = \"onnx\"\n", + "model_type = \"rnnt\" # or \"ctc\"\n", + "\n", + "model = gigaam.load_model(\n", + " model_type,\n", + " fp16_encoder=False, # only fp32 tensors\n", + " use_flash=False, # disable flash attention\n", + ")\n", + "model.to_onnx(dir_path=onnx_dir)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "NL3W76cgz0Ua" + }, + "source": [ + "### ONNX inference" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 53 + }, + "id": "j_rjvUeJz0Ua", + "outputId": "2f8a9e71-c5aa-4fb6-89cf-d251eeb7dce3" + }, + "outputs": [ + { + "data": { + "application/vnd.google.colaboratory.intrinsic+json": { + "type": "string" + }, + "text/plain": [ + "'ничьих не требуя похвал счастлив уж я надеждой сладкой что дева с трепетом любви посмотрит может быть украдкой на песни грешные мои у лукоморья дуб зеленый'" + ] + }, + "execution_count": null, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "from gigaam.onnx_utils import load_onnx_sessions, transcribe_sample\n", + "\n", + "sessions = load_onnx_sessions(onnx_dir, model_type)\n", + "transcribe_sample(\"example.wav\", model_type, sessions)" + ] + } + ], + "metadata": { + "accelerator": "GPU", + "colab": { + "gpuType": "T4", + "provenance": [] + }, + "kernelspec": { + "display_name": "Python 3", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.9.18" + } + }, + "nbformat": 4, + "nbformat_minor": 0 +} diff --git a/requirements.txt b/requirements.txt new file mode 100644 index 0000000..2260551 --- /dev/null +++ b/requirements.txt @@ -0,0 +1,10 @@ +hydra-core<=1.3.2 +numpy +omegaconf<=2.3.0 +pydub<=0.25.1 +sentencepiece<=0.2.0 +torch<=2.5.1 +torchaudio<=2.5.1 +onnx==1.17.0 +onnxruntime==1.17.3 +tqdm \ No newline at end of file diff --git a/setup.py b/setup.py new file mode 100644 index 0000000..856b95a --- /dev/null +++ b/setup.py @@ -0,0 +1,25 @@ +import pkg_resources +from setuptools import find_packages, setup + +setup( + name="gigaam", + py_modules=["gigaam"], + version="0.1.0", + description="GigaAM: A package for audio modeling and ASR.", + long_description=open("README.md", "r", encoding="utf-8").read(), + long_description_content_type="text/markdown", + readme="README.md", + author="GigaChat Team", + url="https://github.com/salute-developers/GigaAM/", + license="MIT", + packages=find_packages(include=["gigaam"]), + python_requires=">=3.8", + install_requires=[ + str(r) + for r in pkg_resources.parse_requirements( + open("requirements.txt", "r", encoding="utf-8").read() + ) + ], + extras_require={"longform": ["pyannote.audio", "pydub"]}, + include_package_data=True, +) From 1d114723141a8c7755ccd5207d799fdf4a93b49d Mon Sep 17 00:00:00 2001 From: Georgy Gospodinov Date: Tue, 4 Mar 2025 13:42:09 +0300 Subject: [PATCH 02/15] fix links --- README.md | 1 + README_ru.md | 1 + gigaam/__init__.py | 2 +- inference_example.ipynb | 4 ++-- 4 files changed, 5 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index b63a31f..999cc82 100644 --- a/README.md +++ b/README.md @@ -211,5 +211,6 @@ GigaAM's code and model weights are released under the [MIT License](./LICENSE). ## Links * [[habr] GigaAM: класс открытых моделей для обработки звучащей речи](https://habr.com/ru/companies/sberdevices/articles/805569) +* [[youtube] Как научить LLM слышать: GigaAM 🤝 GigaChat Audio](https://www.youtube.com/watch?v=O7NSH2SAwRc) * [[youtube] GigaAM: Семейство акустических моделей для русского языка](https://youtu.be/PvZuTUnZa2Q?t=26442) * [[youtube] Speech-only Pre-training: обучение универсального аудиоэнкодера](https://www.youtube.com/watch?v=ktO4Mx6UMNk) diff --git a/README_ru.md b/README_ru.md index 1b39c12..1c4073e 100644 --- a/README_ru.md +++ b/README_ru.md @@ -200,5 +200,6 @@ print(", ".join([f"{emotion}: {prob:.3f}" for emotion, prob in emotion2prob.item ## Ссылки * [[habr] GigaAM: класс открытых моделей для обработки звучащей речи](https://habr.com/ru/companies/sberdevices/articles/805569) +* [[youtube] Как научить LLM слышать: GigaAM 🤝 GigaChat Audio](https://www.youtube.com/watch?v=O7NSH2SAwRc) * [[youtube] GigaAM: Семейство акустических моделей для русского языка](https://youtu.be/PvZuTUnZa2Q?t=26442) * [[youtube] Speech-only Pre-training: обучение универсального аудиоэнкодера](https://www.youtube.com/watch?v=ktO4Mx6UMNk) diff --git a/gigaam/__init__.py b/gigaam/__init__.py index 705d894..b131e31 100644 --- a/gigaam/__init__.py +++ b/gigaam/__init__.py @@ -13,7 +13,7 @@ # Default cache directory _CACHE_DIR = os.path.expanduser("~/.cache/gigaam") # Url with model checkpoints -_URL_DIR = "https://n-ws-q0bez.s3pd12.sbercloud.ru/b-ws-q0bez-jpv/GigaAM" +_URL_DIR = "https://cdn.chatwm.opensmodel.sberdevices.ru/GigaAM" _MODEL_NAMES = [ "ctc", "rnnt", diff --git a/inference_example.ipynb b/inference_example.ipynb index 22a7464..d388f26 100644 --- a/inference_example.ipynb +++ b/inference_example.ipynb @@ -30,8 +30,8 @@ "outputs": [], "source": [ "# Downloading wavs for examples\n", - "!wget https://n-ws-q0bez.s3pd12.sbercloud.ru/b-ws-q0bez-jpv/GigaAM/example.wav\n", - "!wget https://n-ws-q0bez.s3pd12.sbercloud.ru/b-ws-q0bez-jpv/GigaAM/long_example.wav" + "!wget https://cdn.chatwm.opensmodel.sberdevices.ru/GigaAM/example.wav\n", + "!wget https://cdn.chatwm.opensmodel.sberdevices.ru/GigaAM/long_example.wav" ] }, { From c24cbafa077c2d36de93f4b533091aa66478adb9 Mon Sep 17 00:00:00 2001 From: Georgy Gospodinov Date: Tue, 3 Jun 2025 18:23:49 +0300 Subject: [PATCH 03/15] arxiv paper (#40) * add arxiv paper --- README.md | 2 ++ README_ru.md | 2 ++ 2 files changed, 4 insertions(+) diff --git a/README.md b/README.md index 999cc82..8cbae55 100644 --- a/README.md +++ b/README.md @@ -3,6 +3,7 @@ ![plot](./gigaam_scheme.svg) ## Latest News +* 2025/06 — Our [research paper on GigaAM](https://arxiv.org/abs/2506.01192) was accepted to InterSpeech 2025! * 2024/12 — [MIT License](./LICENSE), GigaAM-v2 (**-15%** and **-12%** WER Reduction for CTC and RNN-T models, respectively), [ONNX export support](#onnx-inference-example) * 2024/05 — GigaAM-RNNT (**-19%** WER Reduction), [long-form inference using external Voice Activity Detection](#long-form-audio-transcribation) * 2024/04 — GigaAM Release: GigaAM-CTC ([SoTA Speech Recognition model for the Russian language](#performance-metrics-word-error-rate)), [GigaAM-Emo](#gigaam-emo-emotion-recognition) @@ -210,6 +211,7 @@ GigaAM's code and model weights are released under the [MIT License](./LICENSE). --- ## Links +* [[arxiv] GigaAM: Efficient Self-Supervised Learner for Speech Recognition](https://arxiv.org/abs/2506.01192) * [[habr] GigaAM: класс открытых моделей для обработки звучащей речи](https://habr.com/ru/companies/sberdevices/articles/805569) * [[youtube] Как научить LLM слышать: GigaAM 🤝 GigaChat Audio](https://www.youtube.com/watch?v=O7NSH2SAwRc) * [[youtube] GigaAM: Семейство акустических моделей для русского языка](https://youtu.be/PvZuTUnZa2Q?t=26442) diff --git a/README_ru.md b/README_ru.md index 1c4073e..7b93d5d 100644 --- a/README_ru.md +++ b/README_ru.md @@ -3,6 +3,7 @@ ![plot](./gigaam_scheme.svg) ## Последние Обновления +* 2025/06 — Наша [научная статья о GigaAM](https://arxiv.org/abs/2506.01192) принята на конференцию InterSpeech 2025! * 2024/12 — [MIT-лицензия](./LICENSE), GigaAM-v2 (улучшение качества распознавания речи на **15%** и **12%** WER для CTC и RNN-T моделей), [поддержка экспорта в ONNX](#пример-распознавания-с-помощью-onnx) * 2024/05 — GigaAM-RNNT (улучшение WER на **-19%**), [распознавание речи на длинных аудиозаписях с помощью внешей VAD-модели](#распознавание-речи-на-длинных-аудиозаписях) * 2024/04 — Релиз GigaAM: GigaAM-CTC ([Лучшая открытая модель для распознавания речи на русском языке](#метрики-качества-word-error-rate)), [GigaAM-Emo](#gigaam-emo) @@ -199,6 +200,7 @@ print(", ".join([f"{emotion}: {prob:.3f}" for emotion, prob in emotion2prob.item Код и веса моделей семества GigaAM доступны для использования с [MIT-лицензией](./LICENSE). ## Ссылки +* [[arxiv] GigaAM: Efficient Self-Supervised Learner for Speech Recognition](https://arxiv.org/abs/2506.01192) * [[habr] GigaAM: класс открытых моделей для обработки звучащей речи](https://habr.com/ru/companies/sberdevices/articles/805569) * [[youtube] Как научить LLM слышать: GigaAM 🤝 GigaChat Audio](https://www.youtube.com/watch?v=O7NSH2SAwRc) * [[youtube] GigaAM: Семейство акустических моделей для русского языка](https://youtu.be/PvZuTUnZa2Q?t=26442) From 13a2b2e586165599cf4bcab1831e4deccd8b8f62 Mon Sep 17 00:00:00 2001 From: Evgeny Lagutin Date: Wed, 30 Jul 2025 20:55:54 +0300 Subject: [PATCH 04/15] fix: bug in decoding.py producing empty transcriptions (#30) --- gigaam/decoding.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/gigaam/decoding.py b/gigaam/decoding.py index 98dc6d2..a51d968 100644 --- a/gigaam/decoding.py +++ b/gigaam/decoding.py @@ -64,8 +64,8 @@ def decode(self, head: CTCHead, encoded: Tensor, lengths: Tensor) -> List[str]: skip_mask[:, 1:] = torch.logical_and( skip_mask[:, 1:], labels[:, 1:] != labels[:, :-1] ) - for length in lengths: - skip_mask[length:] = 0 + for i, length in enumerate(lengths): + skip_mask[i, length:] = 0 pred_texts: List[str] = [] for i in range(b): From 129e5f4f8400b6ff4b837212b42d676ac8680f11 Mon Sep 17 00:00:00 2001 From: Alexander Kutsakov <71152283+Alexander4127@users.noreply.github.com> Date: Thu, 20 Nov 2025 13:32:18 +0300 Subject: [PATCH 05/15] GigaAM-v3 (#47): end-to-end models, new domains --- .github/workflows/gigaam.yml | 144 ++++++ .gitignore | 2 + README.md | 281 +++++------ README_ru.md | 284 +++++------ assets/gigaam_scheme.svg | 1 + assets/sbs_results.png | Bin 0 -> 653039 bytes colab_example.ipynb | 882 +++++++++++++++++++++++++++++++++++ evaluation.md | 77 +++ gigaam/__init__.py | 96 ++-- gigaam/decoder.py | 14 +- gigaam/decoding.py | 2 +- gigaam/encoder.py | 95 ++-- gigaam/model.py | 103 ++-- gigaam/onnx_utils.py | 138 +++--- gigaam/preprocess.py | 36 +- gigaam/utils.py | 79 +++- gigaam/vad_utils.py | 89 ++-- gigaam_scheme.svg | 1 - inference_example.ipynb | 468 ------------------- requirements.txt | 17 +- setup.py | 7 +- tests/test_batching.py | 165 +++++++ tests/test_loading.py | 91 ++++ tests/test_longform.py | 219 +++++++++ tests/test_onnx.py | 49 ++ tests/test_reading.py | 58 +++ 26 files changed, 2340 insertions(+), 1058 deletions(-) create mode 100644 .github/workflows/gigaam.yml create mode 100644 assets/gigaam_scheme.svg create mode 100644 assets/sbs_results.png create mode 100644 colab_example.ipynb create mode 100644 evaluation.md delete mode 100644 gigaam_scheme.svg delete mode 100644 inference_example.ipynb create mode 100644 tests/test_batching.py create mode 100644 tests/test_loading.py create mode 100644 tests/test_longform.py create mode 100644 tests/test_onnx.py create mode 100644 tests/test_reading.py diff --git a/.github/workflows/gigaam.yml b/.github/workflows/gigaam.yml new file mode 100644 index 0000000..16f4e1e --- /dev/null +++ b/.github/workflows/gigaam.yml @@ -0,0 +1,144 @@ +name: CI + +on: + push: + branches: [ main ] + pull_request: + branches: [ main ] + workflow_dispatch: + +env: + FORCE_COLOR: 1 + +jobs: + test: + name: Test (Python ${{ matrix.python-version }}) + runs-on: ubuntu-latest + timeout-minutes: 45 + + strategy: + fail-fast: false + matrix: + python-version: ["3.10", "3.11", "3.12"] + + steps: + - name: Checkout code + uses: actions/checkout@v4 + + - name: Set up Python ${{ matrix.python-version }} + uses: actions/setup-python@v5 + with: + python-version: ${{ matrix.python-version }} + cache: 'pip' + + - name: Install system dependencies + run: | + sudo apt-get update + sudo apt-get install -y wget ffmpeg libsndfile1 libasound2-dev + ffmpeg -version + + - name: Download test audio file + run: | + wget -O example.wav https://cdn.chatwm.opensmodel.sberdevices.ru/GigaAM/example.wav + + - name: Cache pip dependencies + uses: actions/cache@v4 + with: + path: ~/.cache/pip + key: ${{ runner.os }}-pip-${{ matrix.python-version }}-${{ hashFiles('requirements.txt', 'setup.py') }} + restore-keys: | + ${{ runner.os }}-pip-${{ matrix.python-version }}- + ${{ runner.os }}-pip- + + - name: Show disk usage before install + run: df -h + + - name: Install Python dependencies + run: | + python -m pip install --upgrade pip setuptools wheel + pip install --no-cache-dir -e .[longform,tests] + + - name: Show disk usage after install + run: df -h + + - name: Run model loading tests + run: | + pytest -v tests/test_loading.py -m partial --tb=short + + - name: Run audio loading tests + run: | + pytest -v tests/test_reading.py --tb=short + + - name: Run batching tests + run: | + pytest -v tests/test_batching.py --tb=short + + - name: Run longform tests + env: + HF_TOKEN: ${{ secrets.HF_TOKEN }} + run: | + pytest -v tests/test_longform.py --tb=short + + - name: Run onnx tests + run: | + pytest -v tests/test_onnx.py --tb=short + + - name: Run all tests with coverage + if: matrix.python-version == '3.10' + env: + HF_TOKEN: ${{ secrets.HF_TOKEN }} + run: | + pytest --cov=gigaam --cov-report=xml --cov-report=term-missing tests/ + + - name: Upload coverage to Codecov + if: matrix.python-version == '3.10' + uses: codecov/codecov-action@v4 + with: + file: ./coverage.xml + flags: unittests + name: codecov-umbrella + fail_ci_if_error: false + + lint: + name: Lint and Format Check + runs-on: ubuntu-latest + timeout-minutes: 10 + + steps: + - name: Checkout code + uses: actions/checkout@v4 + + - name: Set up Python + uses: actions/setup-python@v5 + with: + python-version: '3.10' + cache: 'pip' + + - name: Cache pip dependencies + uses: actions/cache@v4 + with: + path: ~/.cache/pip + key: ${{ runner.os }}-pip-lint-${{ hashFiles('requirements.txt') }} + restore-keys: | + ${{ runner.os }}-pip-lint- + + - name: Install linters + run: | + pip install --upgrade pip + pip install flake8 black isort mypy types-requests + + - name: Check code formatting with black + run: | + black --check --diff gigaam/ tests/ + + - name: Check imports with isort + run: | + isort --check-only --diff gigaam/ tests/ + + - name: Lint with flake8 + run: | + flake8 --ignore=E203,W503,W504 --max-line-length=120 --statistics gigaam/ tests/ + + - name: Type check with mypy + run: | + mypy gigaam/ --ignore-missing-imports --no-strict-optional diff --git a/.gitignore b/.gitignore index 57c7e43..4775fdd 100644 --- a/.gitignore +++ b/.gitignore @@ -3,3 +3,5 @@ build *.egg-info *.wav .DS_Store +*tmp* +onnx \ No newline at end of file diff --git a/README.md b/README.md index 8cbae55..82135ee 100644 --- a/README.md +++ b/README.md @@ -1,216 +1,181 @@ # GigaAM: the family of open-source acoustic models for speech processing -![plot](./gigaam_scheme.svg) +
-## Latest News -* 2025/06 — Our [research paper on GigaAM](https://arxiv.org/abs/2506.01192) was accepted to InterSpeech 2025! -* 2024/12 — [MIT License](./LICENSE), GigaAM-v2 (**-15%** and **-12%** WER Reduction for CTC and RNN-T models, respectively), [ONNX export support](#onnx-inference-example) -* 2024/05 — GigaAM-RNNT (**-19%** WER Reduction), [long-form inference using external Voice Activity Detection](#long-form-audio-transcribation) -* 2024/04 — GigaAM Release: GigaAM-CTC ([SoTA Speech Recognition model for the Russian language](#performance-metrics-word-error-rate)), [GigaAM-Emo](#gigaam-emo-emotion-recognition) ---- +[![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](./LICENSE) +[![Python 3.10+](https://img.shields.io/badge/python-3.10+-blue.svg)](https://www.python.org/downloads/) +[![arXiv](https://img.shields.io/badge/arXiv-2506.01192-b31b1b.svg)](https://arxiv.org/abs/2506.01192) +[![HuggingFace](https://img.shields.io/badge/🤗%20HuggingFace-Models-yellow.svg)](https://huggingface.co/ai-sage/GigaAM) +[![Open In Colab](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/github/salute-developers/GigaAM/blob/main/colab_example.ipynb) -## Table of Contents - -- [Overview](#overview) -- [Installation](#installation) -- [GigaAM: The Foundational Model](#gigaam-the-foundational-model) -- [GigaAM for Speech Recognition](#gigaam-for-speech-recognition) - - [GigaAM-CTC](#gigaam-ctc) - - [GigaAM-RNNT](#gigaam-rnnt) -- [GigaAM-Emo: Emotion Recognition](#gigaam-emo-emotion-recognition) -- [License](#license) -- [Links](#links) - ---- +
-## Overview +
-GigaAM (**Giga** **A**coustic **M**odel) is a family of open-source models for Russian speech processing tasks, including speech recognition and emotion recognition. The models are built on top of the [Conformer](https://arxiv.org/pdf/2005.08100.pdf) architecture and leverage self-supervised learning ([wav2vec2](https://arxiv.org/abs/2006.11477)-based for GigaAM-v1 and [HuBERT](https://arxiv.org/pdf/2106.07447)-based for GigaAM-v2). +![plot](./assets/gigaam_scheme.svg) -GigaAM models are state-of-the-art open-source solutions for their respective tasks in the Russian language. - -This repository includes: +## Latest News +* 2025/11 — GigaAM-v3: **30%** WER reduction on new data domains; GigaAM-v3-e2e: end-to-end transcription support (**70:30** win in Side-by-Side vs Whisper-large-v3) +* 2025/06 — Our [research paper on GigaAM](https://arxiv.org/abs/2506.01192) was accepted to InterSpeech 2025! +* 2024/12 — [MIT License](./LICENSE), GigaAM-v2 (**-15%** and **-12%** WER Reduction for CTC and RNN-T models, respectively), [ONNX export support](#onnx-export-and-inference) +* 2024/05 — GigaAM-RNNT (**-19%** WER Reduction), [long-form inference using external Voice Activity Detection](#model-inference) +* 2024/04 — GigaAM Release: GigaAM-CTC ([SoTA Speech Recognition model for the Russian language](#model-performance)), [GigaAM-Emo](#model-performance) -- **GigaAM**: A foundational self-supervised model pre-trained on massive Russian speech datasets. -- **GigaAM-CTC** and **GigaAM-RNNT**: Fine-tuned models for automatic speech recognition (ASR). -- **GigaAM-Emo**: A fine-tuned model for emotion recognition. +--- -## Installation +## Setup ### Requirements -- Python ≥ 3.8 +- Python ≥ 3.10 - [ffmpeg](https://ffmpeg.org/) installed and added to your system's PATH ### Install the GigaAM Package -1. Clone the repository: - ```bash - git clone https://github.com/salute-developers/GigaAM.git - cd GigaAM - ``` +```bash +# Clone the repository +git clone https://github.com/salute-developers/GigaAM.git +cd GigaAM -2. Install the package in editable mode: - ```bash - pip install -e . - ``` +# Install the package requirements +pip install -e . -3. Verify the installation: - ```python - import gigaam - model = gigaam.load_model("ctc") - print(model) - ``` +# (optionally) Verify the installation: +pip install -e .[tests] +pytest -v tests/test_loading.py -m partial # or `-m full` to test all models +``` --- -## GigaAM: The Foundational Model +## GigaAM overview -GigaAM is a [Conformer](https://arxiv.org/pdf/2005.08100.pdf)-based foundational model (240M parameters) pre-trained on 50,000+ hours of diverse Russian speech data. +GigaAM is a [Conformer](https://arxiv.org/pdf/2005.08100.pdf)-based foundational model (220-240M parameters) pre-trained on diverse Russian speech data. It serves as the backbone for the entire GigaAM family, enabling state-of-the-art fine-tuned performance in speech recognition and emotion recognition. More information about GigaAM-v1 can be found in our [post on Habr](https://habr.com/ru/companies/sberdevices/articles/805569). We fine-tuned the GigaAM encoder for ASR using [CTC](https://www.cs.toronto.edu/~graves/icml_2006.pdf) and [RNNT](https://arxiv.org/abs/1211.3711) decoders. GigaAM family includes three lines of models -It serves as the backbone for the entire GigaAM family, enabling state-of-the-art fine-tuned performance in speech recognition and emotion recognition. +| | Pretrain Method | Pretrain (hours) | ASR (hours) | Available Versions | +| :--- | :--- | :--- | :--- | :---: | +| **v1** | [Wav2vec 2.0](https://arxiv.org/abs/2006.11477) | 50,000 | 2,000 | `v1_ssl`, `emo`, `v1_ctc`, `v1_rnnt` | +| **v2** | [HuBERT–CTC](https://arxiv.org/abs/2506.01192) | 50,000 | 2,000 | `v2_ssl`, `v2_ctc`, `v2_rnnt` | +| **v3** | HuBERT–CTC | 700,000 | 4,000 | `v3_ssl`, `v3_ctc`, `v3_rnnt`, `v3_e2e_ctc`, `v3_e2e_rnnt` | -There are 2 available versions: +Where `v3_e2e_ctc` and `v3_e2e_rnnt` support punctuation and text normalization. -* GigaAM-v1 was trained with a [wav2vec2](https://arxiv.org/abs/2006.11477)-like approach and can be used by loading the `v1_ssl` model version. -* GigaAM-v2 was trained with a [HuBERT](https://arxiv.org/pdf/2106.07447)-like approach and allows us to get GigaAM-v2 ASR model with better quality. It can be used by loading the `v2_ssl` or `ssl` model version. +## Model Performance -More information about GigaAM-v1 can be found in our [post on Habr](https://habr.com/ru/companies/sberdevices/articles/805569). +`GigaAM-v3` training incorporates new internal datasets: callcenter, music, speech with atypical characteristics, and voice messages. As a result, the models perform on average **30%** better on these new domains while maintaining the same quality as `GigaAM-v2` on public benchmarks. In end-to-end ASR comparisons of `e2e_ctc` and `e2e_rnnt` against Whisper (judged via independent LLM-as-a-Judge side-by-side) GigaAM models win by an average margin of **70:30**. Our emotion recognition model `GigaAM-Emo` outperforms existing models by **15%** Macro F1-Score. -### GigaAM Usage Example - -```python -import gigaam -model = gigaam.load_model('ssl') # Options: "ssl", "v1_ssl" -embedding, _ = model.embed_audio(audio_path) -``` +For detailed results, see [here](./evaluation.md). --- -## GigaAM for Speech Recognition +## Usage + +### Model inference + +**Note:** ASR with `.transcribe` function is applicable for audio **only up to 25 seconds**. To enable `.transcribe_longform` install the additional [pyannote.audio](https://github.com/pyannote/pyannote-audio) dependencies -We fine-tuned the GigaAM encoder for ASR using two different architectures: +
+Longform setup instruction -- GigaAM-CTC was fine-tuned with [Connectionist Temporal Classification](https://www.cs.toronto.edu/~graves/icml_2006.pdf) and a character-based tokenizer. -- GigaAM-RNNT was fine-tuned with [RNN Transducer loss](https://arxiv.org/abs/1211.3711). +* Generate [Hugging Face API token](https://huggingface.co/docs/hub/security-tokens) +* Accept the conditions to access [pyannote/segmentation-3.0](https://huggingface.co/pyannote/segmentation-3.0) files and content -Fine-tuning was done for both GigaAM-v1 and GigaAM-v2 SSL models, so we have 4 ASR models: `v1` and `v2` versions for both CTC and RNNT. +```bash +pip install -e .[longform] +# optionally run longform testing +pip install -e .[tests] +HF_TOKEN= pytest -v tests/test_longform.py +``` +
-### Training Data -The models were trained on publicly available Russian datasets: +
-| Dataset | Size (hours) | Weight | -|------------------------|--------------|--------| -| Golos | 1227 | 0.6 | -| SOVA | 369 | 0.2 | -| Russian Common Voice | 207 | 0.1 | -| Russian LibriSpeech | 93 | 0.1 | -### Performance Metrics (Word Error Rate) -| Model | Parameters | Golos Crowd | Golos Farfield | OpenSTT YouTube | OpenSTT Phone Calls | OpenSTT Audiobooks | Mozilla Common Voice 12 | Mozilla Common Voice 19 | Russian LibriSpeech | -|--------------------|------------|-------------|----------------|-----------------|----------------------|--------------------|-------|-------|---------------------| -| Whisper-large-v3 | 1.5B | 13.9 | 16.6 | 18.0 | 28.0 | 14.4 | 5.7 | 5.5 | 9.5 | -| NVIDIA FastConformer | 115M | 2.2 | 6.6 | 21.2 | 30.0 | 13.9 | 2.7 | 5.7 | 11.3 | -| **GigaAM-CTC-v1** | 242M | 3.0 | 5.7 | 16.0 | 23.2 | 12.5 | 2.0 | 10.5 | 7.5 | -| **GigaAM-RNNT-v1** | 243M | 2.3 | 5.0 | 14.0 | 21.7 | 11.7 | 1.9 | 9.9 | 7.7 | -| **GigaAM-CTC-v2** | 242M | 2.5 | 4.3 | 14.1 | 21.1 | 10.7 | 2.1 | 3.1 | 5.5 | -| **GigaAM-RNNT-v2** | 243M | **2.2** | **3.9** | **13.3** | **20.0** | **10.2** | **1.8** | **2.7** | **5.5** | +```python +import gigaam +# Load test audio +audio_path = gigaam.utils.download_short_audio() +long_audio_path = gigaam.utils.download_long_audio() -### Speech Recognition Example (GigaAM-ASR) +# Audio embeddings +model_name = "v3_ssl" # Options: `v1_ssl`, `v2_ssl`, `v3_ssl` +model = gigaam.load_model(model_name) +embedding, _ = model.embed_audio(audio_path) +print(embedding) + +# ASR +model_name = "v3_e2e_rnnt" # Options: any model version with suffix `_ctc` or `_rnnt` +model = gigaam.load_model(model_name) +transcription = model.transcribe(audio_path) +print(transcription) + +# and long-form ASR +import os +os.environ["HF_TOKEN"] = +utterances = model.transcribe_longform(long_audio_path) +for utt in utterances: + transcription, (start, end) = utt["transcription"], utt["boundaries"] + print(f"[{gigaam.format_time(start)} - {gigaam.format_time(end)}]: {transcription}") + +# Emotion recognition +model = gigaam.load_model("emo") +emotion2prob = model.get_probs(audio_path) +print(", ".join([f"{emotion}: {prob:.3f}" for emotion, prob in emotion2prob.items()])) +``` - #### Basic usage: short audio transcribation (up to 30 seconds) +### Loading from Hugging Face - ```python - import gigaam - model_name = "rnnt" # Options: "v2_ctc" or "ctc", "v2_rnnt" or "rnnt", "v1_ctc", "v1_rnnt" - model = gigaam.load_model(model_name) - transcription = model.transcribe(audio_path) - ``` +> **Note:** Install requirements from the [example](./colab_example.ipynb). - #### Long-form audio transcribation - 1. Install external VAD dependencies ([pyannote.audio](https://github.com/pyannote/pyannote-audio) library) with - ```bash - pip install gigaam[longform] - ``` - 2. - * Generate [Hugging Face API token](https://huggingface.co/docs/hub/security-tokens) - * Accept the conditions to access [pyannote/voice-activity-detection](https://huggingface.co/pyannote/voice-activity-detection) files and content. - * Accept the conditions to access [pyannote/segmentation](https://huggingface.co/pyannote/segmentation) files and content. - 3. Use the `model.transcribe_longform` method: - ```python - import os - import gigaam - - os.environ["HF_TOKEN"] = "" - - model = gigaam.load_model("ctc") - recognition_result = model.transcribe_longform("long_example.wav") - - for utterance in recognition_result: - transcription = utterance["transcription"] - start, end = utterance["boundaries"] - print(f"[{gigaam.format_time(start)} - {gigaam.format_time(end)}]: {transcription}") - ``` - - #### ONNX inference example - - 1. Export the model to ONNX using the `model.to_onnx` method: - ```python - onnx_dir = "onnx" - model_type = "rnnt" # or "ctc" - - model = gigaam.load_model( - model_type, - fp16_encoder=False, # only fp32 tensors - use_flash=False, # disable flash attention - ) - model.to_onnx(dir_path=onnx_dir) - ``` - 2. Run ONNX inference: - ```python - from gigaam.onnx_utils import load_onnx_sessions, transcribe_sample - - sessions = load_onnx_sessions(onnx_dir, model_type) - transcribe_sample("example.wav", model_type, sessions) - ``` - - -All these examples can also be found in [inference_example.ipynb](./inference_example.ipynb) notebook. +```python +from transformers import AutoModel ---- +model = AutoModel.from_pretrained("ai-sage/GigaAM-v3", revision="e2e_rnnt", trust_remote_code=True) +``` +### ONNX Export and Inference -## GigaAM-Emo: Emotion Recognition +> **Note:** GPU support can be enabled with `pip install onnxruntime-gpu==1.23.*` if applicable. -GigaAM-Emo is a fine-tuned model for emotion recognition trained on the [Dusha](https://arxiv.org/pdf/2212.12266.pdf) dataset. It significantly outperforms existing models on several metrics. +1. Export the model to ONNX using the `model.to_onnx` method: + ```python + onnx_dir = "onnx" + model_version = "v3_ctc" # Options: any version -### Performance Metrics -| | | Crowd | | | Podcast | | -| --- | --- | --- | --- | --- | --- | --- | -| | Unweighted Accuracy | Weighted Accuracy | Macro F1-score | Unweighted Accuracy | Weighted Accuracy | Macro F1-score | -| [DUSHA](https://arxiv.org/pdf/2212.12266.pdf) baseline
([MobileNetV2](https://arxiv.org/abs/1801.04381) + [Self-Attention](https://arxiv.org/pdf/1805.08318.pdf)) | 0.83 | 0.76 | 0.77 | 0.89 | 0.53 | 0.54 | -| [АБК](https://aij.ru/archive?albumId=2&videoId=337) ([TIM-Net](https://arxiv.org/pdf/2211.08233.pdf)) | 0.84 | 0.77 | 0.78 | 0.90 | 0.50 | 0.55 | -| GigaAM-Emo | 0.90 | 0.87 | 0.84 | 0.90 | 0.76 | 0.67 | + model = gigaam.load_model(model_version) + model.to_onnx(dir_path=onnx_dir) + ``` -### Emotion Recognition Example (GigaAM-Emo) +2. Run ONNX inference: + ```python + from gigaam.onnx_utils import load_onnx, infer_onnx -```python -import gigaam -model = gigaam.load_model('emo') -emotion2prob: Dict[str, int] = model.get_probs("example.wav") + sessions, model_cfg = load_onnx(onnx_dir, model_version) + result = infer_onnx(audio_path, model_cfg, sessions) + print(result) # string for ctc / rnnt, np.ndarray for ssl / emo + ``` -print(", ".join([f"{emotion}: {prob:.3f}" for emotion, prob in emotion2prob.items()])) -``` +These and more advanced (e.g. custom audio loading, batching) examples can be found in the [Colab notebook](https://colab.research.google.com/github/salute-developers/GigaAM/blob/main/colab_example.ipynb). --- -## License +## Citation -GigaAM's code and model weights are released under the [MIT License](./LICENSE). +If you use GigaAM in your research, please cite our paper: ---- +```bibtex +@inproceedings{kutsakov25_interspeech, + title = {{GigaAM: Efficient Self-Supervised Learner for Speech Recognition}}, + author = {Aleksandr Kutsakov and Alexandr Maximenko and Georgii Gospodinov and Pavel Bogomolov and Fyodor Minkin}, + year = {2025}, + booktitle = {{Interspeech 2025}}, + pages = {1213--1217}, + doi = {10.21437/Interspeech.2025-1616}, + issn = {2958-1796}, +} +``` ## Links + * [[arxiv] GigaAM: Efficient Self-Supervised Learner for Speech Recognition](https://arxiv.org/abs/2506.01192) * [[habr] GigaAM: класс открытых моделей для обработки звучащей речи](https://habr.com/ru/companies/sberdevices/articles/805569) * [[youtube] Как научить LLM слышать: GigaAM 🤝 GigaChat Audio](https://www.youtube.com/watch?v=O7NSH2SAwRc) diff --git a/README_ru.md b/README_ru.md index 7b93d5d..5d73f3f 100644 --- a/README_ru.md +++ b/README_ru.md @@ -1,203 +1,177 @@ -# GigaAM: семейство акустических моделей для обработки звучащей речи +# GigaAM: семейство открытых акустических моделей для обработки речи -![plot](./gigaam_scheme.svg) +
-## Последние Обновления -* 2025/06 — Наша [научная статья о GigaAM](https://arxiv.org/abs/2506.01192) принята на конференцию InterSpeech 2025! -* 2024/12 — [MIT-лицензия](./LICENSE), GigaAM-v2 (улучшение качества распознавания речи на **15%** и **12%** WER для CTC и RNN-T моделей), [поддержка экспорта в ONNX](#пример-распознавания-с-помощью-onnx) -* 2024/05 — GigaAM-RNNT (улучшение WER на **-19%**), [распознавание речи на длинных аудиозаписях с помощью внешей VAD-модели](#распознавание-речи-на-длинных-аудиозаписях) -* 2024/04 — Релиз GigaAM: GigaAM-CTC ([Лучшая открытая модель для распознавания речи на русском языке](#метрики-качества-word-error-rate)), [GigaAM-Emo](#gigaam-emo) ---- - -## Содержание - -- [Обзор](#обзор) -- [Установка](#установка) -- [GigaAM](#gigaam) -- [GigaAM для распознавания речи](#gigaam-для-распознавания-речи) - - [GigaAM-CTC](#gigaam-ctc) - - [GigaAM-RNNT](#gigaam-rnnt) -- [GigaAM-Emo](#gigaam-emo) -- [Лицензионное соглашение](#лицензия) -- [Ссылки](#ссылки) - ---- +[![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](./LICENSE) +[![Python 3.10+](https://img.shields.io/badge/python-3.10+-blue.svg)](https://www.python.org/downloads/) +[![arXiv](https://img.shields.io/badge/arXiv-2506.01192-b31b1b.svg)](https://arxiv.org/abs/2506.01192) +[![HuggingFace](https://img.shields.io/badge/🤗%20HuggingFace-Models-yellow.svg)](https://huggingface.co/ai-sage/GigaAM) +[![Open In Colab](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/github/salute-developers/GigaAM/blob/main/colab_example.ipynb) -## Обзор +
-GigaAM (**Giga** **A**coustic **M**odel) - семейство акустических моделей для обработки звучащей речи на русском языке. Среди решаемых задач - задачи распознавания речи, распознавания эмоций и извлечения эмбеддингов из аудио. Модели построены на основе архитектуры [Conformer](https://arxiv.org/pdf/2005.08100.pdf) с использованием методов self-supervised learning ([wav2vec2](https://arxiv.org/abs/2006.11477)-подход для GigaAM-v1 и [HuBERT](https://arxiv.org/pdf/2106.07447)-подход для GigaAM-v2). +
-Модели GigaAM с отрывом являются лучшими по качеству моделями в открытом доступе для соответствующих задач. +![plot](./assets/gigaam_scheme.svg) -Репозиторий включает: -- **GigaAM**: фундаментальная акустическая модель, обученная на большом объеме неразмеченных русскоязычных аудиозаписей. -- **GigaAM-CTC и GigaAM-RNNT**: модели, дообученные на задачу автоматического распознавания речи. -- **GigaAM-Emo**: модель, дообученная на задачу распознавания эмоций. +## Последние обновления +* **2025/11** — GigaAM-v3: снижение WER на **30%** на новых доменах данных; GigaAM-v3-e2e: end-to-end распознавание речи (**70:30** в side-by-side сравнении против Whisper-large-v3) +* **2025/06** — Наша [научная статья о GigaAM](https://arxiv.org/abs/2506.01192) принята на InterSpeech 2025! +* **2024/12** — [MIT-лицензия](./LICENSE), GigaAM-v2 (**снижение WER на 15% и 12%** для CTC и RNN-T моделей), [поддержка экспорта в ONNX](#конвертация-в-onnx-и-использование-графа) +* **2024/05** — GigaAM-RNNT (**снижение WER на 19%**), [распознавание речи на длинных аудиозаписях с помощью внешней VAD-модели](#основные-функции) +* **2024/04** — Релиз GigaAM: GigaAM-CTC ([Лучшая открытая модель для распознавания речи на русском языке](#качество-моделей)), [GigaAM-Emo](#качество-моделей) +--- ## Установка ### Требования -- Python ≥ 3.8 -- установленный и добавленный в PATH [ffmpeg](https://ffmpeg.org/) +- Python ≥ 3.10 +- [ffmpeg](https://ffmpeg.org/) установлен и добавлен в переменную PATH системы ### Установка пакета GigaAM -1. Скачивание репозитория: - ```bash - git clone https://github.com/salute-developers/GigaAM.git - cd GigaAM - ``` -2. Установка пакета: - ```bash - pip install -e . - ``` +```bash +# Клонировать репозиторий +git clone https://github.com/salute-developers/GigaAM.git +cd GigaAM -3. Проверка установленного пакета: - ```python - import gigaam - model = gigaam.load_model("ctc") - print(model) - ``` +# Установить зависимости +pip install -e . -## GigaAM +# (опционально) Проверить установку: +pip install -e .[tests] +pytest -v tests/test_loading.py -m partial # или `-m full` для тестирования всех моделей +``` -GigaAM (**Giga** **A**coustic **M**odel) — фундаментальная акустическая модель, основанная на [Conformer](https://arxiv.org/pdf/2005.08100.pdf)-энкодере (около 240M параметров) и обученная на 50 тысячах часов разнообразных русскоязычных данных. +--- -Доступны 2 версии модели, отличающиеся алгоритмом предобучения: -* GigaAM-v1 была обучена на основе подхода [wav2vec2](https://arxiv.org/abs/2006.11477). Версия модели для использования - `v1_ssl`. -* GigaAM-v2 была обучена на основе подхода [HuBERT](https://arxiv.org/pdf/2106.07447) и позволила улучшить качество распознавания речи. Версия модели для использования - `v2_ssl` или `ssl`. +## Обзор GigaAM -Больше информации про обучение GigaAM-v1 можно найти в [нашей статье на Хабре](https://habr.com/ru/companies/sberdevices/articles/805569). +GigaAM - фундаментальная акустическая модель на базе архитектуры [Conformer](https://arxiv.org/pdf/2005.08100.pdf) (220–240 млн параметров), предобученная на разнообразных русскоязычных данных. Она служит основой для всего семейства GigaAM и обеспечивает высокое качество при дообучении на задачи распознавания речи и распознавания эмоций. Подробнее о GigaAM-v1 можно узнать в нашей [статье на Хабре](https://habr.com/ru/companies/sberdevices/articles/805569). Для задач автоматического распознавания речи (ASR) мы дообучили энкодер GigaAM с декодерами на основе [CTC](https://www.cs.toronto.edu/~graves/icml_2006.pdf) и [RNNT](https://arxiv.org/abs/1211.3711). Семейство GigaAM включает три поколения моделей: -### Пример использования GigaAM +| | Метод предобучения | Объём предобучения (часы) | Объём данных ASR (часы) | Доступные версии | +| :--- | :--- | :--- | :--- | :---: | +| **v1** | [Wav2vec 2.0](https://arxiv.org/abs/2006.11477) | 50 000 | 2 000 | `v1_ssl`, `emo`, `v1_ctc`, `v1_rnnt` | +| **v2** | [HuBERT–CTC](https://arxiv.org/abs/2506.01192) | 50 000 | 2 000 | `v2_ssl`, `v2_ctc`, `v2_rnnt` | +| **v3** | HuBERT–CTC | 700 000 | 4 000 | `v3_ssl`, `v3_ctc`, `v3_rnnt`, `v3_e2e_ctc`, `v3_e2e_rnnt` | -```python -import gigaam -model = gigaam.load_model('ssl') # Options: "ssl", "v1_ssl" -embedding, _ = model.embed_audio(audio_path) -``` +Версии `v3_e2e_ctc` и `v3_e2e_rnnt` поддерживают пунктуацию и нормализацию текста. ---- +## Качество моделей +В обучение `GigaAM-v3` были включены новые внутренние наборы данных: колл-центр, музыка, речь с атипичными характеристиками и голосовые сообщения. В результате модели в среднем демонстрируют улучшение на **30%** (по метрике WER) на новых доменах при уровне качества `GigaAM-v2` на публичных бенчмарках. В сравнении end-to-end моделей (`e2e_ctc` и `e2e_rnnt`) с Whisper (оценка проводилась с использованием внешней LLM в формате side-by-side) модели GigaAM выигрывают в соотношении **70:30**. Наша модель распознавания эмоций `GigaAM-Emo` превосходит существующие аналоги на **15%** по метрике Macro F1-Score. -## GigaAM для распознавания речи (GigaAM-ASR) -Мы дообучали GigaAM энкодер для задачи распознавания речи с двумя разными декодерами: -* Модели GigaAM-CTC были дообучены с [CTC](https://www.cs.toronto.edu/~graves/icml_2006.pdf) функцией потерь. -* Модели GigaAM-RNNT была дообучена с [RNN-T](https://arxiv.org/abs/1211.3711) функцией потерь. +С более подробными результатами можно ознакомиться [здесь](./evaluation.md). -Мы проводили дообучения моделей с обеих версий GigaAM: `v1` и `v2`, таким образом для каждой из GigaAM-CTC и GigaAM-RNNT моделей доступны 2 версии: `v1` и `v2`. +--- -### Данные для обучения +## Использование -| dataset | size, hours | weight | -| --- | --- | --- | -| [Golos](https://arxiv.org/pdf/2106.10161.pdf) | 1227 | 0.6 | -| [SOVA](https://github.com/sovaai/sova-dataset) | 369 | 0.2 | -| [Russian Common Voice](https://arxiv.org/pdf/1912.06670.pdf) | 207 | 0.1 | -| [Russian LibriSpeech](https://arxiv.org/pdf/2012.03411.pdf) | 93 | 0.1 | +### Основные функции -### Метрики качества (Word Error Rate) +**Важно:** функция `.transcribe` для ASR применима только к аудиофайлам **до 25 секунд**. Для использования `.transcribe_longform` необходимо установить дополнительные зависимости [pyannote.audio](https://github.com/pyannote/pyannote-audio). -| Model | Parameters | Golos Crowd | Golos Farfield | OpenSTT YouTube | OpenSTT Phone Calls | OpenSTT Audiobooks | Mozilla Common Voice 12 | Mozilla Common Voice 19 | Russian LibriSpeech | -|--------------------|------------|-------------|----------------|-----------------|----------------------|--------------------|-------|-------|---------------------| -| Whisper-large-v3 | 1.5B | 13.9 | 16.6 | 18.0 | 28.0 | 14.4 | 5.7 | 5.5 | 9.5 | -| NVIDIA FastConformer | 115M | 2.2 | 6.6 | 21.2 | 30.0 | 13.9 | 2.7 | 5.7 | 11.3 | -| **GigaAM-CTC-v1** | 242M | 3.0 | 5.7 | 16.0 | 23.2 | 12.5 | 2.0 | 10.5 | 7.5 | -| **GigaAM-RNNT-v1** | 243M | 2.3 | 5.0 | 14.0 | 21.7 | 11.7 | 1.9 | 9.9 | 7.7 | -| **GigaAM-CTC-v2** | 242M | 2.5 | 4.3 | 14.1 | 21.1 | 10.7 | 2.1 | 3.1 | 5.5 | -| **GigaAM-RNNT-v2** | 243M | **2.2** | **3.9** | **13.3** | **20.0** | **10.2** | **1.8** | **2.7** | **5.5** | +
+Инструкция по настройке распознавания длинных аудио -### Использование моделей распознавания речи (GigaAM-ASR) +* Сгенерируйте [токен API Hugging Face](https://huggingface.co/docs/hub/security-tokens) +* Примите условия для получения доступа к контенту [pyannote/segmentation-3.0](https://huggingface.co/pyannote/segmentation-3.0) - #### Базовое использование - распознование речи на коротких аудиозаписях (до 30 секунд) - ```python - import gigaam - model_name = "rnnt" # Options: "v2_ctc" or "ctc", "v2_rnnt" or "rnnt", "v1_ctc", "v1_rnnt" - model = gigaam.load_model(model_name) - transcription = model.transcribe(audio_path) - ``` +```bash +pip install -e .[longform] +# опционально: запустить тесты для длинной транскрибации +pip install -e .[tests] +HF_TOKEN=<ваш hf токен> pytest -v tests/test_longform.py +``` +
- #### Распознавание речи на длинных аудиозаписях - 1. Установите зависимости для внешней VAD-модели ([pyannote.audio](https://github.com/pyannote/pyannote-audio) library): - ```bash - pip install gigaam[longform] - ``` - 2. - * Сгенерируйте [Hugging Face API token](https://huggingface.co/docs/hub/security-tokens) - * Примите условия для получения доступа к контенту [pyannote/voice-activity-detection](https://huggingface.co/pyannote/voice-activity-detection) - * Примите условия для получения доступа к контенту [pyannote/segmentation](https://huggingface.co/pyannote/segmentation) - - 3. Используйте метод ```model.transcribe_longform```: - ```python - import os - import gigaam - - os.environ["HF_TOKEN"] = "" - - model = gigaam.load_model("ctc") - recognition_result = model.transcribe_longform("long_example.wav") - - for utterance in recognition_result: - transcription = utterance["transcription"] - start, end = utterance["boundaries"] - print(f"[{gigaam.format_time(start)} - {gigaam.format_time(end)}]: {transcription}") - ``` - - #### Пример распознавания с помощью ONNX - - 1. Экспортируйте модель в onnx-формат с помощью метода ```model.to_onnx```: - ```python - onnx_dir = "onnx" - model_type = "rnnt" # or "ctc" - - model = gigaam.load_model( - model_type, - fp16_encoder=False, # only fp32 tensors - use_flash=False, # disable flash attention - ) - model.to_onnx(dir_path=onnx_dir) - ``` - 2. Используйте полученную модель для транскрибации: - ```python - from gigaam.onnx_utils import load_onnx_sessions, transcribe_sample - - sessions = load_onnx_sessions(onnx_dir, model_type) - transcribe_sample("example.wav", model_type, sessions) - ``` - -Все приведенные примеры также могут быть найдены в jupyter-ноутбуке [inference_example.ipynb](./inference_example.ipynb). +
---- +```python +import gigaam -## GigaAM-Emo - -GigaAM-Emo — акустическая модель для определения эмоций. Мы доучивали GigaAM на датасете [Dusha](https://arxiv.org/pdf/2212.12266.pdf). +# Загрузка тестового аудио +audio_path = gigaam.utils.download_short_audio() +long_audio_path = gigaam.utils.download_long_audio() -В таблице ниже приведены метрики качества открытых моделей на датасете [Dusha](https://arxiv.org/pdf/2212.12266.pdf): +# Аудио-эмбеддинги +model_name = "v3_ssl" # Варианты: `v1_ssl`, `v2_ssl`, `v3_ssl` +model = gigaam.load_model(model_name) +embedding, _ = model.embed_audio(audio_path) +print(embedding) + +# Распознавание речи +model_name = "v3_e2e_rnnt" # Варианты: любые версии с суффиксами `_ctc` или `_rnnt` +model = gigaam.load_model(model_name) +transcription = model.transcribe(audio_path) +print(transcription) + +# Распознавание на длинном аудио +import os +os.environ["HF_TOKEN"] = "" +utterances = model.transcribe_longform(long_audio_path) +for utt in utterances: + transcription, (start, end) = utt["transcription"], utt["boundaries"] + print(f"[{gigaam.format_time(start)} - {gigaam.format_time(end)}]: {transcription}") + +# Распознавание эмоций +model = gigaam.load_model("emo") +emotion2prob = model.get_probs(audio_path) +print(", ".join([f"{emotion}: {prob:.3f}" for emotion, prob in emotion2prob.items()])) +``` -| | | Crowd | | | Podcast | | -| --- | --- | --- | --- | --- | --- | --- | -| | Unweighted Accuracy | Weighted Accuracy | Macro F1-score | Unweighted Accuracy | Weighted Accuracy | Macro F1-score | -| [DUSHA](https://arxiv.org/pdf/2212.12266.pdf) baseline
([MobileNetV2](https://arxiv.org/abs/1801.04381) + [Self-Attention](https://arxiv.org/pdf/1805.08318.pdf)) | 0.83 | 0.76 | 0.77 | 0.89 | 0.53 | 0.54 | -| [АБК](https://aij.ru/archive?albumId=2&videoId=337) ([TIM-Net](https://arxiv.org/pdf/2211.08233.pdf)) | 0.84 | 0.77 | 0.78 | 0.90 | 0.50 | 0.55 | -| GigaAM-Emo | 0.90 | 0.87 | 0.84 | 0.90 | 0.76 | 0.67 | +### Загрузка из Hugging Face -### Пример использвания GigaAM-Emo для распознавания эмоций +> Используйте установку зависимостей из [примера](./colab_example.ipynb). ```python -import gigaam -model = gigaam.load_model('emo') -emotion2prob: Dict[str, int] = model.get_probs("example.wav") +from transformers import AutoModel -print(", ".join([f"{emotion}: {prob:.3f}" for emotion, prob in emotion2prob.items()])) +model = AutoModel.from_pretrained("ai-sage/GigaAM-v3", revision="e2e_rnnt", trust_remote_code=True) ``` +### Конвертация в ONNX и использование графа + +> GPU будет использоваться после установки `pip install onnxruntime-gpu==1.23.*` (если доступно). + +1. Экспорт модели в ONNX с помощью метода `model.to_onnx`: + ```python + onnx_dir = "onnx" + model_version = "v3_ctc" # Варианты: любая версия модели + + model = gigaam.load_model(model_version) + model.to_onnx(dir_path=onnx_dir) + ``` + +2. Запуск с использованием ONNX: + ```python + from gigaam.onnx_utils import load_onnx, infer_onnx + + sessions, model_cfg = load_onnx(onnx_dir, model_version) + result = infer_onnx(audio_path, model_cfg, sessions) + print(result) # str для ctc / rnnt версий, np.ndarray для ssl / emo + ``` + +Эти и более продвинутые примеры (кастомная загрузка аудио, батчинг) доступны в [Colab notebook](https://colab.research.google.com/github/salute-developers/GigaAM/blob/main/colab_example.ipynb). + --- -## Лицензия +## Citation -Код и веса моделей семества GigaAM доступны для использования с [MIT-лицензией](./LICENSE). +Если применяете GigaAM в своих исследованиях, используйте ссылку на нашу статью: + +```bibtex +@inproceedings{kutsakov25_interspeech, + title = {{GigaAM: Efficient Self-Supervised Learner for Speech Recognition}}, + author = {Aleksandr Kutsakov and Alexandr Maximenko and Georgii Gospodinov and Pavel Bogomolov and Fyodor Minkin}, + year = {2025}, + booktitle = {{Interspeech 2025}}, + pages = {1213--1217}, + doi = {10.21437/Interspeech.2025-1616}, + issn = {2958-1796}, +} +``` ## Ссылки * [[arxiv] GigaAM: Efficient Self-Supervised Learner for Speech Recognition](https://arxiv.org/abs/2506.01192) diff --git a/assets/gigaam_scheme.svg b/assets/gigaam_scheme.svg new file mode 100644 index 0000000..747271a --- /dev/null +++ b/assets/gigaam_scheme.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/sbs_results.png b/assets/sbs_results.png new file mode 100644 index 0000000000000000000000000000000000000000..11d21e5c9f44bee2a432b8e2ae2580e9ad3b55a4 GIT binary patch literal 653039 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

KmE#w1LC?*`Y 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

u;Iv$ofl0L@L2I>qo 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 z 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%0DX0=ZIugULo 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

6TwuegS%$J(RmBu1T;90a{Y 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

6y23oS!MYJS+eSdz<$e3r=Xx;6 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\n", + "\n", + "Transcription: Ничьих не требуя похвал, Счастлив уж я надеждой сладкой, Что дева с трепетом любви Посмотрит, может быть, украдкой На песни грешные мои. У лукоморья дуб зелёный.\n", + "\n", + "Emotions: angry: 0.000, sad: 0.002, neutral: 0.923, positive: 0.075\n" + ] + } + ], + "source": [ + "# Load test audio\n", + "audio_path = gigaam.utils.download_short_audio()\n", + "\n", + "# Audio embeddings\n", + "model_name = \"v2_ssl\" # Options: `v1_ssl`, `v2_ssl`, `v3_ssl`\n", + "model = gigaam.load_model(model_name)\n", + "embedding, _ = model.embed_audio(audio_path)\n", + "print(\"Embeds:\", embedding)\n", + "\n", + "# ASR\n", + "model_name = \"v3_e2e_rnnt\" # Options: any model version with suffix `_ctc` or `_rnnt`\n", + "model = gigaam.load_model(model_name)\n", + "transcription = model.transcribe(audio_path)\n", + "print(\"\\nTranscription:\", transcription)\n", + "\n", + "# Emotion recognition\n", + "model = gigaam.load_model(\"emo\")\n", + "emotion2prob = model.get_probs(audio_path)\n", + "print(\"\\nEmotions:\", \", \".join([f\"{emotion}: {prob:.3f}\" for emotion, prob in emotion2prob.items()]))" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "AP3QqjPpwZYl" + }, + "source": [ + "### ONNX convertation and inference" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "NnKh1tnjwYZw", + "outputId": "8786532b-a4b9-4fe2-8936-a7db4e57b38d" + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Succesfully ported onnx v2_ssl_encoder to onnx/v2_ssl_encoder.onnx.\n", + "Succesfully ported onnx v3_e2e_rnnt_encoder to onnx/v3_e2e_rnnt_encoder.onnx.\n", + "Succesfully ported onnx v3_e2e_rnnt_decoder to onnx/v3_e2e_rnnt_decoder.onnx.\n", + "Succesfully ported onnx v3_e2e_rnnt_joint to onnx/v3_e2e_rnnt_joint.onnx.\n", + "Succesfully ported onnx emo to onnx/emo.onnx.\n" + ] + } + ], + "source": [ + "onnx_dir = \"onnx\"\n", + "\n", + "gigaam.load_model(\"v2_ssl\").to_onnx(dir_path=onnx_dir)\n", + "gigaam.load_model(\"v3_e2e_rnnt\").to_onnx(dir_path=onnx_dir)\n", + "gigaam.load_model(\"emo\").to_onnx(dir_path=onnx_dir)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "uk2zWgmIwt5n", + "outputId": "e3850b76-c20d-4f60-c49b-2ca8053b8d08" + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Embeds: [[[-0.2815268 0.36459672 0.45034242 ... -0.47318697 -0.40278506\n", + " -0.24017537]\n", + " [ 0.16104491 -0.49883014 -0.05703727 ... -0.6232359 -0.23104468\n", + " -0.20491666]\n", + " [-1.1852155 -1.002929 -0.608784 ... -0.5141611 -0.37379324\n", + " -0.2654637 ]\n", + " ...\n", + " [ 0.01822925 -0.3753832 -0.8963473 ... 0.17242727 0.05693132\n", + " 0.1306364 ]\n", + " [ 0.26943898 -0.06628752 -0.5013158 ... -1.4431518 -1.4824082\n", + " -1.4502244 ]\n", + " [-1.5649999 -1.669118 -1.2826786 ... 0.511411 0.48322338\n", + " 0.01353467]]]\n", + "\n", + "Transcription: Ничьих не требуя похвал, Счастлив уж я надеждой сладкой, Что дева с трепетом любви Посмотрит, может быть, украдкой На песни грешные мои. У лукоморья дуб зелёный.\n", + "\n", + "Emotions: [[7.7093333e-05 2.2028047e-03 9.2327267e-01 7.4447356e-02]]\n" + ] + } + ], + "source": [ + "from gigaam.onnx_utils import load_onnx, infer_onnx\n", + "\n", + "sessions, model_cfg = load_onnx(onnx_dir, \"v2_ssl\")\n", + "print(\"Embeds:\", infer_onnx(audio_path, model_cfg, sessions))\n", + "\n", + "sessions, model_cfg = load_onnx(onnx_dir, \"v3_e2e_rnnt\")\n", + "print(\"\\nTranscription:\", infer_onnx(audio_path, model_cfg, sessions))\n", + "\n", + "sessions, model_cfg = load_onnx(onnx_dir, \"emo\")\n", + "print(\"\\nEmotions:\", infer_onnx(audio_path, model_cfg, sessions))" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "adf16N9yaxGo" + }, + "source": [ + "### Longform\n", + "\n", + "As `.transcribe` function input lenght is limited by 25 seconds, we need `.transcribe_longform` with audio segmentation based on `pyannote/segmentation-3.0` voice activity detection pipeline." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "NiX5t2CHb1QB" + }, + "outputs": [], + "source": [ + "! pip install -e .[longform]" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "Jq3NiXRR1nts", + "outputId": "76b5606a-56a8-47e7-9ae8-d9c911313ed4" + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "/content/gigaam\n" + ] + } + ], + "source": [ + "# in colab the session might need restarting here\n", + "%cd GigaAM" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "DB8qh_X1bUL_", + "outputId": "387aea4b-382f-4348-9eae-8b51da2c7026" + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\u001b[1m============================= test session starts ==============================\u001b[0m\n", + "platform linux -- Python 3.12.12, pytest-8.4.2, pluggy-1.6.0 -- /usr/bin/python3\n", + "cachedir: .pytest_cache\n", + "rootdir: /content/gigaam\n", + "plugins: cov-7.0.0, hydra-core-1.3.2, anyio-4.11.0, typeguard-4.4.4, langsmith-0.4.42\n", + "collected 7 items \u001b[0m\n", + "\n", + "tests/test_longform.py::test_segmentation_functionality[30.0] \u001b[32mPASSED\u001b[0m\u001b[32m [ 14%]\u001b[0m\n", + "tests/test_longform.py::test_segmentation_functionality[60.0] \u001b[32mPASSED\u001b[0m\u001b[32m [ 28%]\u001b[0m\n", + "tests/test_longform.py::test_segmentation_functionality[120.0] \u001b[32mPASSED\u001b[0m\u001b[32m [ 42%]\u001b[0m\n", + "tests/test_longform.py::test_transcribe_longform[v3_ctc] \u001b[32mPASSED\u001b[0m\u001b[32m [ 57%]\u001b[0m\n", + "tests/test_longform.py::test_transcribe_longform[v3_e2e_rnnt] \u001b[32mPASSED\u001b[0m\u001b[33m [ 71%]\u001b[0m\n", + "tests/test_longform.py::test_longform_consistency[v3_ctc] \u001b[32mPASSED\u001b[0m\u001b[33m [ 85%]\u001b[0m\n", + "tests/test_longform.py::test_segmentation_edge_cases \u001b[32mPASSED\u001b[0m\u001b[33m [100%]\u001b[0m\n", + "\n", + "\u001b[33m======================== \u001b[32m7 passed\u001b[0m, \u001b[33m\u001b[1m1 warning\u001b[0m\u001b[33m in 56.39s\u001b[0m\u001b[33m =========================\u001b[0m\n" + ] + } + ], + "source": [ + "! HF_TOKEN=\"\" pytest -v tests/test_longform.py --disable-warnings" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "ZFlpV4VXapk7", + "outputId": "17a36be8-d1db-4ce8-cf33-5812b93c5f14" + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[00:00:00 - 00:16:80]: Вечерня отошла давно, Но в кельях тихо и темно; Уже и сам игумен строгий Свои молитвы прекратил И кости ветхие склонил, Перекрестясь на одр убогий. Кругом и сон, и тишина; Но церкви дверь отворена.\n", + "[00:17:07 - 00:32:54]: Трепещет луч лампады, И тускло озаряет он И тёмную живопись икон, и возглащённые оклады. И раздаётся в тишине То тяжкий вздох, то шёпот важный, И мрачно дремлет в тишине старинный свод.\n", + "[00:32:95 - 00:49:30]: Глухой и влажный Стоят за клиросом чернец и грешник, Неподвижны оба. И шёпот их — Как глаз из гроба, И грешник бледен, как мертвец — Монах. Несчастный! Полно, перестань!\n", + "[00:49:81 - 01:05:65]: Ужасна исповедь злодея, Заплачена тобою дань Тому, Кто в злобе пламенея Лукавого грешника блюдёт И к вечной гибели ведёт. Смирись, опомнись. Время, время. Раскаянье, покров\n", + "[01:05:94 - 01:10:88]: Я разрешу тебя, грехов сложи мучительное бремя.\n" + ] + } + ], + "source": [ + "import os\n", + "import warnings\n", + "warnings.simplefilter(\"ignore\")\n", + "\n", + "import gigaam\n", + "\n", + "os.environ[\"HF_TOKEN\"] = \"\"\n", + "\n", + "long_audio_path = gigaam.utils.download_long_audio()\n", + "model = gigaam.load_model(\"v3_e2e_rnnt\")\n", + "\n", + "utterances = model.transcribe_longform(long_audio_path)\n", + "for utt in utterances:\n", + " transcription, (start, end) = utt[\"transcription\"], utt[\"boundaries\"]\n", + " print(f\"[{gigaam.format_time(start)} - {gigaam.format_time(end)}]: {transcription}\")" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "oBwAxFger9vB" + }, + "source": [ + "### More advanced examples" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "FNPBdICGsqio" + }, + "source": [ + "##### Another way to load audio" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "fmwFIE9qaf7y", + "outputId": "9d85b25e-0346-4306-cf3c-131a6a63af1f" + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "['Ничьих не требуя похвал, Счастлив уж я надеждой сладкой, Что дева с трепетом любви Посмотрит, может быть, украдкой На песни грешные мои. У лукоморья дуб зелёный.', 'Ничьих не требуя похвал, Счастлив уж я надеждой сладкой, Что дева с трепетом любви Посмотрит, может быть, украдкой На песни грешные мои. У лукоморья дуб зелёный.']\n" + ] + } + ], + "source": [ + "import librosa\n", + "import torch\n", + "\n", + "from gigaam.utils import AudioDataset\n", + "from gigaam.preprocess import SAMPLE_RATE as SR\n", + "\n", + "fname = gigaam.utils.download_short_audio()\n", + "wav = gigaam.load_audio(fname)\n", + "# arrays can be not equal after possible resampling, but close enough\n", + "wav_ = torch.from_numpy(librosa.load(fname, sr=SR, mono=True)[0])\n", + "\n", + "wav_tns, lengths = AudioDataset.collate([wav, wav_])\n", + "with torch.no_grad():\n", + " encoded, encoded_len = model(\n", + " wav_tns.to(model._device).to(model._dtype), lengths.to(model._device)\n", + " )\n", + " print(model.decoding.decode(model.head, encoded, encoded_len))\n", + "\n", + "# outputs expected to be equal" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "kIeaDNXYsw44" + }, + "source": [ + "##### Longform & batch > 1\n", + "\n", + "We'll demonstrate batching with an example for longform inference. Here a long audio is split into independent segments - making it ideal for batching." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "LMqA7Kbosu1k" + }, + "outputs": [], + "source": [ + "import os\n", + "import soundfile as sf\n", + "from pathlib import Path\n", + "\n", + "import gigaam\n", + "from gigaam.preprocess import SAMPLE_RATE as SR\n", + "from gigaam.vad_utils import segment_audio_file\n", + "\n", + "\n", + "os.environ[\"HF_TOKEN\"] = \"\"\n", + "\n", + "exp_dir = Path(\"tmp_inference_example\")\n", + "exp_dir.mkdir(exist_ok=True)\n", + "long_fname = gigaam.utils.download_long_audio()\n", + "model = gigaam.load_model(\"v3_e2e_rnnt\")\n", + "\n", + "# Saving parts as files\n", + "with torch.inference_mode():\n", + " segments, boundaries = segment_audio_file(long_fname, sr=SR, device=model._device)\n", + "wav_paths = []\n", + "for i, segment in enumerate(segments):\n", + " wav_paths.append(str(exp_dir / f\"{Path(long_fname).stem}_{i}{Path(long_fname).suffix}\"))\n", + " sf.write(wav_paths[-1], segment, SR)\n", + "\n", + "# Load wavs: you can use their paths or load with librosa-like method as above\n", + "wavs_np = [librosa.load(wav_path, sr=SR, mono=True)[0] for wav_path in wav_paths]" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "C6OcwpVqt05n" + }, + "source": [ + "Finally, run batched inference. In our case the input audio is fairly short, `batch_size` can be decreased for longer inputs." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "xGeCADORttRY", + "outputId": "2cff3399-663c-497a-d41a-2d028a3de65c" + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[00:00:00 - 00:16:80]: Вечерня отошла давно, Но в кельях тихо и темно; Уже и сам игумен строгий Свои молитвы прекратил И кости ветхие склонил, Перекрестясь на одр убогий. Кругом и сон, и тишина; Но церкви дверь отворена.\n", + "[00:17:07 - 00:32:54]: Трепещет луч лампады, И тускло озаряет он И тёмную живопись икон, и возглащённые оклады. И раздаётся в тишине То тяжкий вздох, то шёпот важный, И мрачно дремлет в тишине старинный свод.\n", + "[00:32:95 - 00:49:30]: Глухой и влажный Стоят за клиросом чернец и грешник, Неподвижны оба. И шёпот их — Как глаз из гроба, И грешник бледен, как мертвец — Монах. Несчастный! Полно, перестань!\n", + "[00:49:81 - 01:05:65]: Ужасна исповедь злодея, Заплачена тобою дань Тому, Кто в злобе пламенея Лукавого грешника блюдёт И к вечной гибели ведёт. Смирись, опомнись. Время, время. Раскаянье, покров\n", + "[01:05:94 - 01:10:88]: Я разрешу тебя, грехов сложи мучительное бремя.\n" + ] + } + ], + "source": [ + "import torch\n", + "\n", + "dataset = AudioDataset(wavs_np) # or AudioDataset(wav_paths)\n", + "batch_size = len(dataset)\n", + "dataloader = torch.utils.data.DataLoader(\n", + " dataset, batch_size=batch_size, collate_fn=dataset.collate, shuffle=False\n", + ")\n", + "\n", + "pred_texts = []\n", + "for wav_tns, lengths in dataloader:\n", + " wav_tns, lengths = wav_tns.to(model._device).to(model._dtype), lengths.to(model._device)\n", + " with torch.no_grad():\n", + " encoded, encoded_len = model(wav_tns, lengths)\n", + " pred_texts.extend(model.decoding.decode(model.head, encoded, encoded_len))\n", + "\n", + "for (start, end), text in zip(boundaries, pred_texts):\n", + " print(f\"[{gigaam.format_time(start)} - {gigaam.format_time(end)}]: {text}\")" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "4ipQYBdYcQH0" + }, + "source": [ + "## GigaAM from Hugging Face" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "_FJqALokc5vx" + }, + "source": [ + "### Reqs and files loading: now by hand" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "5EAqie1xco_I" + }, + "outputs": [], + "source": [ + "! pip install numpy==2.* torch==2.8.* torchaudio==2.8.* transformers==4.57.* \\\n", + " pyannote.audio==4.0 torchcodec==0.7 numba>=0.62 \\\n", + " onnx==1.19.* onnxruntime==1.23.* \\\n", + " hydra-core==1.3.* omegaconf==2.3.* \\\n", + " sentencepiece tqdm\n", + "! pip install --force-reinstall numpy # make transformers work fine" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "9nMLdr0VvIGj" + }, + "outputs": [], + "source": [ + "! wget https://cdn.chatwm.opensmodel.sberdevices.ru/GigaAM/example.wav\n", + "! wget https://cdn.chatwm.opensmodel.sberdevices.ru/GigaAM/long_example.wav" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 267, + "referenced_widgets": [ + "2e3f6159ef5e407e8f1fb9bca32162b7", + "4b76d95921354dc785fe6193f2925317", + "c23e0e9417cc44a7bb653a7a56b954d0", + "ea66c0bd776e4845834237d8c5d4837b", + "5441e4df284e49408cb8be1271039aa4", + "ac4f18edb19b468f963e771fdb1dc12e", + "6f3018569f1a400fb15e4eda9eb5ec8e", + "bd2462f8e23f4bb1ba8d50bb73c64699", + "fff6474730784e089f6d956b8e2bd1a0", + "d61a763ea9884978aef9261c818f3c83", + "3c95709c357f4869812159549a0edffb", + "ea8dd50349f342c6b0b53cfab3e4437a", + "d7820d5e55964d4cac1989638bb70a6d", + "e30d397d613b48e9916d5f2a0e3acd8e", + "164df35c2a65427e800b6a17fdb90438", + "593ccb48450e43ae9df220123bfc2c85", + "69c0084f5032462687d770528342c803", + "c046db1ead5c4b309d7e3e127661ccc4", + "6bbccc048f264a7a91bdcc520d25e492", + "1b1adb6e50da4cb7a94a01d1315331f6", + "83fb6d82fab347708f7dd10b98340a1a", + "3fe5ac311b244176b2d61c49c20986e7", + "604c907ea10344c996e6d5d09896d7bf", + "31aaa1dc03e042a8820692d86b198eb3", + "920b77ca466643528c108e56cdd65aa5", + "6ce4197e475b44ca8ddd47f1c9fc4393", + "693b1d83cb7044afa437ce811f5b864a", + "62178bcb8395445baf7ec87d43ff1956", + "5034511b0e9c41adb9de422f60be5db9", + "23272696a2b34ac4883abb80b2f80be1", + "65d81f90e2014bdc8af2348a16a22919", + "38fa41796aea4b7ebe2f552a76691f30", + "43b54378f65347bb97b8a9958fe0e141", + "c4c239fbddbd49428c53e99e4c6d7395", + "94b3977244d84269a9b12ee836d1eb81", + "040db1bc88cc4798a257d30d61e22f0d", + "3fde9901a2254aa79c42c9b510e2f293", + "8b04a773cc3a46508992d4145864f9bc", + "ed0e21bd550b4fd38d47a55377eedb6c", + "909ae2153eb04d3394bad1298787b56e", + "cf99eeeb1b394df4af5adaa674aabffc", + "29909a4fc3fa48c2b34f59840f7889c3", + "510a7cbe840140118b8c850545a11aab", + "f4443110254141e8a1366a3d7a54ef93" + ] + }, + "id": "UCY_7Ltya2Wt", + "outputId": "a5924f29-ea27-4181-aa56-dbef579875f4" + }, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/usr/local/lib/python3.12/dist-packages/huggingface_hub/utils/_auth.py:94: UserWarning: \n", + "The secret `HF_TOKEN` does not exist in your Colab secrets.\n", + "To authenticate with the Hugging Face Hub, create a token in your settings tab (https://huggingface.co/settings/tokens), set it as secret in your Google Colab and restart your session.\n", + "You will be able to reuse this secret in all of your notebooks.\n", + "Please note that authentication is recommended but still optional to access public models or datasets.\n", + " warnings.warn(\n" + ] + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "2e3f6159ef5e407e8f1fb9bca32162b7", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "config.json: 0%| | 0.00/1.87k [00:00 Note: `fp16` encoder on CUDA can be used with `model.model.encoder = model.model.encoder.half()`." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "3OlYBRz0dVcA", + "outputId": "b5cfac2c-0d94-452f-acbb-c69cbd0155ed" + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Embed: tensor([[[-0.2815, 0.3646, 0.4503, ..., -0.4732, -0.4028, -0.2402],\n", + " [ 0.1610, -0.4988, -0.0570, ..., -0.6232, -0.2310, -0.2049],\n", + " [-1.1852, -1.0029, -0.6088, ..., -0.5142, -0.3738, -0.2655],\n", + " ...,\n", + " [ 0.0182, -0.3754, -0.8963, ..., 0.1724, 0.0569, 0.1306],\n", + " [ 0.2694, -0.0663, -0.5013, ..., -1.4432, -1.4824, -1.4502],\n", + " [-1.5650, -1.6691, -1.2827, ..., 0.5114, 0.4832, 0.0135]]],\n", + " grad_fn=)\n", + "\n", + "Transcription: Ничьих не требуя похвал, Счастлив уж я надеждой сладкой, Что дева с трепетом любви Посмотрит, может быть, украдкой На песни грешные мои. У лукоморья дуб зелёный.\n" + ] + } + ], + "source": [ + "import torch\n", + "\n", + "device = torch.device(\"cpu\")\n", + "repo_name = \"ai-sage/GigaAM-v3\"\n", + "\n", + "# Audio embeddings\n", + "model_name = \"ssl\"\n", + "model = AutoModel.from_pretrained(repo_name, revision=model_name, trust_remote_code=True).to(device)\n", + "embedding, _ = model.embed_audio(\"example.wav\")\n", + "print(\"Embed:\", embedding)\n", + "\n", + "# ASR\n", + "model_name = \"e2e_rnnt\" # Options: rnnt, ctc, e2e_rnnt, e2e_ctc\n", + "model = AutoModel.from_pretrained(repo_name, revision=model_name, trust_remote_code=True).to(device)\n", + "transcription = model.transcribe(\"example.wav\")\n", + "print(\"\\nTranscription:\", transcription)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "Ek1gKS6_cW-G", + "outputId": "39308dfb-f63d-4eb5-d944-30bcf6d7e462" + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Longform transcription:\n", + "\n", + "[0.0000 - 16.8047]: Вечерня отошла давно, Но в кельях тихо и темно; Уже и сам игумен строгий Свои молитвы прекратил И кости ветхие склонил, Перекрестясь на одр убогий. Кругом и сон, и тишина; Но церкви дверь отворена.\n", + "[17.0747 - 32.5491]: Трепещет луч лампады, И тускло озаряет он И тёмную живопись икон, и возглащённые оклады. И раздаётся в тишине То тяжкий вздох, то шёпот важный, И мрачно дремлет в тишине старинный свод.\n", + "[32.9541 - 49.3060]: Глухой и влажный Стоят за клиросом чернец и грешник, Неподвижны оба. И шёпот их — Как глаз из гроба, И грешник бледен, как мертвец — Монах. Несчастный! Полно, перестань!\n", + "[49.8122 - 65.6578]: Ужасна исповедь злодея, Заплачена тобою дань Тому, Кто в злобе пламенея Лукавого грешника блюдёт И к вечной гибели ведёт. Смирись, опомнись. Время, время. Раскаянье, покров\n", + "[65.9447 - 70.8891]: Я разрешу тебя, грехов сложи мучительное бремя.\n" + ] + } + ], + "source": [ + "import os\n", + "os.environ[\"HF_TOKEN\"] = \"\"\n", + "\n", + "model = AutoModel.from_pretrained(repo_name, revision=\"e2e_rnnt\", trust_remote_code=True)\n", + "utterances = model.transcribe_longform(\"long_example.wav\")\n", + "print(\"Longform transcription:\\n\")\n", + "for utt in utterances:\n", + " transcription, (start, end) = utt[\"transcription\"], utt[\"boundaries\"]\n", + " print(f\"[{start:.4f} - {end:.4f}]: {transcription}\")" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "LBG1U5TOrB24", + "outputId": "5f8e0707-a6ed-4e4f-fc45-78c31465e8fd" + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Succesfully ported onnx v3_e2e_rnnt_encoder to hf_onnx/v3_e2e_rnnt_encoder.onnx.\n", + "Succesfully ported onnx v3_e2e_rnnt_decoder to hf_onnx/v3_e2e_rnnt_decoder.onnx.\n", + "Succesfully ported onnx v3_e2e_rnnt_joint to hf_onnx/v3_e2e_rnnt_joint.onnx.\n" + ] + } + ], + "source": [ + "model.to_onnx(\"hf_onnx\")" + ] + } + ], + "metadata": { + "accelerator": "GPU", + "colab": { + "gpuType": "T4", + "provenance": [] + }, + "kernelspec": { + "display_name": "Python 3", + "name": "python3" + }, + "language_info": { + "name": "python" + } + }, + "nbformat": 4, + "nbformat_minor": 0 +} diff --git a/evaluation.md b/evaluation.md new file mode 100644 index 0000000..2c02925 --- /dev/null +++ b/evaluation.md @@ -0,0 +1,77 @@ +## ASR + +Word Error Rate (%) across all validation sets for ASR models: + + +| Set Name | V3 CTC | V3 RNNT | E2E CTC*| E2E RNNT*| V2 CTC | V2 RNNT | V1 CTC | V1 RNNT | T-One + LM | Whisper*| +|:------------------------|-------:|--------:|-----------:|------------:|-------:|--------:|-------:|--------:|-----------:|--------:| +| Golos Farfield | 4.5 | 3.9 | 6.1 | 5.5 | 4.3 | 4.0 | 5.8 | 4.8 | 12.2 | 16.4 | +| Golos Crowd | 2.8 | 2.4 | 9.7 | 9.1 | 2.5 | 2.3 | 3.1 | 2.3 | 5.7 | 19.0 | +| Russian LibriSpeech | 4.7 | 4.4 | 6.4 | 6.4 | 5.2 | 5.2 | 7.5 | 7.7 | 6.2 | 9.4 | +| Mozilla Common Voice 19 | 1.3 | 0.9 | 3.2 | 3.0 | 1.5 | 0.9 | 8.4 | 8.0 | 5.2 | 5.5 | +| Natural Speech | 7.8 | 6.9 | 9.6 | 8.5 | 10.8 | 10.3 | 12.6 | 11.4 | 14.5 | 13.4 | +| Disordered Speech | 20.6 | 19.2 | 22.8 | 23.1 | 28.0 | 27.5 | 37.5 | 40.8 | 51.0 | 58.6 | +| Callcenter | 10.3 | 9.5 | 13.3 | 12.6 | 13.6 | 12.9 | 15.5 | 15.0 | 13.5 | 23.1 | +| OpenSTT Phone Calls | 18.6 | 17.4 | 20.0 | 19.1 | 20.7 | 19.8 | 23.0 | 21.1 | 19.8 | 27.4 | +| OpenSTT Youtube | 11.6 | 10.6 | 12.7 | 11.8 | 13.9 | 13.0 | 16.0 | 14.7 | 21.9 | 17.8 | +| OpenSTT Audiobooks | 8.7 | 8.2 | 10.3 | 9.3 | 10.8 | 10.3 | 12.7 | 11.7 | 13.4 | 14.3 | +| **Average** | **9.1**| **8.3** | 12.0 | 11.2 | 11.1 | 10.6 | 14.2 | 13.8 | 16.3 | 21.0 | + +\* with post-processing applied (removing punctuation and capitalization, replacing numerals, etc.) + +## End-to-end ASR + +Side-by-side (SBS) comparison of **v3_e2e_ctc** (blue) and **v3_e2e_rnnt** (red) against Whisper outputs across domains, using 500 random samples per test set. Each model was evaluated independently against Whisper by an LLM-as-a-Judge with randomized prompt ordering. + +![plot](./assets/sbs_results.png) + +For the creation of training labels with punctuation and text normalization, we used [GigaChat Max Audio](https://habr.com/ru/companies/sberdevices/articles/904894/): this model was provided with both the original audio and transcription from the training corpus, alongside few-shot examples, to produce normalized text with precise punctuation. In contrast, using Whisper in forced decoding mode adds only punctuation (not normalization). Although this alternative reduces hallucinations, it results in especially poor comma accuracy, and training on such labels further degrades overall model performance. + +| | Normalization | F1(,) ↑ | F1(.) ↑ | F1(?) ↑ | WER ↓ | CER ↓ | +|:----------------------------------|:------------------|----------:|----------:|----------:|--------:|--------:| +| GigaChat Max Audio | Full | 84.2 | 85.6 | 74.9 | 18.4 | 10.9 | +| Whisper Punctuator | punctuation only | 62.2 | 85.0 | 77.7 | 0.0 | 0.0 | +| GigaAM from Whisper labels | punctuation only | 50.3 | 84.1 | 77.7 | 12.0 | 7.8 | +| GigaAM-e2e-ctc | Full | 83.7 | 86.7 | 78.6 | 16.0 | 8.7 | +| GigaAM-e2e-rnnt | Full | 84.5 | 86.7 | 79.8 | 14.2 | 8.8 | + +## Emotion recognition + +GigaAM-Emo was trained on the [Dusha](https://arxiv.org/pdf/2212.12266.pdf) dataset + +| | | Crowd | | | Podcast | | +| --- | --- | --- | --- | --- | --- | --- | +| | Unweighted Accuracy | Weighted Accuracy | Macro F1-score | Unweighted Accuracy | Weighted Accuracy | Macro F1-score | +| [DUSHA](https://arxiv.org/pdf/2212.12266.pdf) baseline
([MobileNetV2](https://arxiv.org/abs/1801.04381) + [Self-Attention](https://arxiv.org/pdf/1805.08318.pdf)) | 0.83 | 0.76 | 0.77 | 0.89 | 0.53 | 0.54 | +| [АБК](https://aij.ru/archive?albumId=2&videoId=337) ([TIM-Net](https://arxiv.org/pdf/2211.08233.pdf)) | 0.84 | 0.77 | 0.78 | **0.90** | 0.50 | 0.55 | +| GigaAM-Emo | **0.90** | **0.87** | **0.84** | **0.90** | **0.76** | **0.67** | + +## Attention type + +We benchmarked attention implementations (one layer and full encoder) on CUDA. Custom implementation runs naive tensor multiplication. [SDPA](https://docs.pytorch.org/docs/stable/generated/torch.nn.functional.scaled_dot_product_attention.html) is enabled by default, as it offers better robustness across varying input dimensions. `flash_attn` is only beneficial for long sequences with `batch_size >> 1` ([example for `bs > 1`](./colab_example.ipynb)). + +* Only Attention Mechanism (Time (ms) ± std) + +| bs, seq_len | Custom | SDPA | Flash | +|-------------|---------------|-------------|--------------| +| 1, 10s | 0.03 ± 0.00 | 0.03 ± 0.00 | 0.05 ± 0.03 | +| 8, 20s | 0.15 ± 0.01 | 0.14 ± 0.01 | 0.66 ± 0.14 | +| 128, 30s | 3.60 ± 0.10 | 3.59 ± 0.04 | 1.40 ± 0.06 | + +* Full Encoder Inference (Time (ms) ± std) + +| bs, seq_len | Custom | SDPA | Flash | +|-------------|---------------|--------------|--------------| +| 1, 10s | 10.14 ± 0.17 | 10.06 ± 0.12 | 11.57 ± 0.25 | +| 8, 20s | 15.84 ± 0.07 | 15.90 ± 0.02 | 25.26 ± 0.26 | +| 128, 30s | 324.53 ± 0.17 | 324.48 ± 0.09| 293.80 ± 0.89| + + +## Test Coverage + +We maintain high unit test coverage to ensure reliability and ease of refactoring. Coverage currently stands at 91%, measured with `pytest-cov` (`flash-attn` is not covered, as it requires GPU execution). + +Command to reproduce (testing will take some time) +```bash +HF_TOKEN= pytest --cov=gigaam --cov-report=term-missing -v tests/ +``` diff --git a/gigaam/__init__.py b/gigaam/__init__.py index b131e31..d43a8fc 100644 --- a/gigaam/__init__.py +++ b/gigaam/__init__.py @@ -1,6 +1,8 @@ +import hashlib import logging import os import urllib.request +import warnings from typing import Optional, Tuple, Union import torch @@ -10,31 +12,41 @@ from .preprocess import load_audio from .utils import format_time +__all__ = [ + "GigaAM", + "GigaAMASR", + "GigaAMEmo", + "load_audio", + "format_time", + "load_model", +] + # Default cache directory _CACHE_DIR = os.path.expanduser("~/.cache/gigaam") # Url with model checkpoints _URL_DIR = "https://cdn.chatwm.opensmodel.sberdevices.ru/GigaAM" -_MODEL_NAMES = [ - "ctc", - "rnnt", - "ssl", - "emo", - "v1_ctc", - "v1_rnnt", - "v1_ssl", - "v2_ctc", - "v2_rnnt", - "v2_ssl", -] - - -def _download_file(file_url: str, file_path: str) -> str: +_MODEL_HASHES = { + "emo": "7ce76f9535cb254488985057c0d33006", + "v1_ctc": "f027f199e590a391d015aeede2e66174", + "v1_rnnt": "02c758999bcdc6afcb2087ef256d47ef", + "v1_ssl": "dc7f7b231f7f91c4968dc21910e7b396", + "v2_ctc": "e00f59cb5d39624fb30d1786044795bf", + "v2_rnnt": "547460139acfebd842323f59ed54ab54", + "v2_ssl": "cd4cf819c8191a07b9d7edcad111668e", + "v3_ctc": "73413e7be9c6a5935827bfab5c0dd678", + "v3_rnnt": "0fd2c9a1ff66abd8d32a3a07f7592815", + "v3_e2e_ctc": "367074d6498f426d960b25f49531cf68", + "v3_e2e_rnnt": "2730de7545ac43ad256485a462b0a27a", + "v3_ssl": "70cbf5ed7303a0ed242ddb257e9dc6a6", +} + + +def _download_file(file_url: str, file_path: str): """Helper to download a file if not already cached.""" if os.path.exists(file_path): return file_path os.makedirs(os.path.dirname(file_path), exist_ok=True) - with urllib.request.urlopen(file_url) as source, open(file_path, "wb") as output: with tqdm( total=int(source.info().get("Content-Length", 0)), @@ -56,15 +68,15 @@ def _download_file(file_url: str, file_path: str) -> str: def _download_model(model_name: str, download_root: str) -> Tuple[str, str]: """Download the model weights if not already cached.""" - if model_name not in _MODEL_NAMES: + short_names = ["ctc", "rnnt", "e2e_ctc", "e2e_rnnt", "ssl"] + possible_names = short_names + list(_MODEL_HASHES.keys()) + if model_name not in possible_names: raise ValueError( - f"Model '{model_name}' not found. Available model names: {_MODEL_NAMES}" + f"Model '{model_name}' not found. Available model names: {possible_names}" ) - if model_name in ["ctc", "rnnt", "ssl"]: - model_name = f"v2_{model_name}" - if model_name == "emo": - model_name = f"v1_{model_name}" + if model_name in short_names: + model_name = f"v3_{model_name}" model_url = f"{_URL_DIR}/{model_name}.ckpt" model_path = os.path.join(download_root, model_name + ".ckpt") return model_name, _download_file(model_url, model_path) @@ -72,7 +84,7 @@ def _download_model(model_name: str, download_root: str) -> Tuple[str, str]: def _download_tokenizer(model_name: str, download_root: str) -> Optional[str]: """Download the tokenizer if required and return its path.""" - if model_name != "v1_rnnt": + if model_name != "v1_rnnt" and "e2e" not in model_name: return None # No tokenizer required for this model tokenizer_url = f"{_URL_DIR}/{model_name}_tokenizer.model" @@ -80,6 +92,21 @@ def _download_tokenizer(model_name: str, download_root: str) -> Optional[str]: return _download_file(tokenizer_url, tokenizer_path) +def hash_path(ckpt_path: str) -> str: + """Calculate binary file hash for checksum""" + return hashlib.md5(open(ckpt_path, "rb").read()).hexdigest() + + +def _normalize_device(device: Optional[Union[str, torch.device]]) -> torch.device: + """Normalize device parameter to torch.device.""" + if device is None: + device_str = "cuda" if torch.cuda.is_available() else "cpu" + return torch.device(device_str) + if isinstance(device, str): + return torch.device(device) + return device + + def load_model( model_name: str, fp16_encoder: bool = True, @@ -104,10 +131,7 @@ def load_model( download_root : Optional[str] The directory to download the model to. Defaults to "~/.cache/gigaam". """ - if device is None: - device = "cuda" if torch.cuda.is_available() else "cpu" - if isinstance(device, str): - device = torch.device(device) + device_obj = _normalize_device(device) if download_root is None: download_root = _CACHE_DIR @@ -115,11 +139,17 @@ def load_model( model_name, model_path = _download_model(model_name, download_root) tokenizer_path = _download_tokenizer(model_name, download_root) - checkpoint = torch.load(model_path, map_location="cpu") + assert ( + hash_path(model_path) == _MODEL_HASHES[model_name] + ), f"Model checksum failed. Please run `rm {model_path}` and reload the model" + + with warnings.catch_warnings(): + warnings.simplefilter("ignore", category=(FutureWarning)) + checkpoint = torch.load(model_path, map_location="cpu", weights_only=False) if use_flash is not None: checkpoint["cfg"].encoder.flash_attn = use_flash - if checkpoint["cfg"].encoder.get("flash_attn", False) and device.type == "cpu": + if checkpoint["cfg"].encoder.get("flash_attn", False) and device_obj.type == "cpu": logging.warning("flash_attn is not supported on CPU. Disabling it...") checkpoint["cfg"].encoder.flash_attn = False @@ -133,13 +163,11 @@ def load_model( else: model = GigaAMASR(checkpoint["cfg"]) - model.load_state_dict(checkpoint["state_dict"], strict=False) + model.load_state_dict(checkpoint["state_dict"]) model = model.eval() - if fp16_encoder and device.type != "cpu": + if fp16_encoder and device_obj.type != "cpu": model.encoder = model.encoder.half() - elif fp16_encoder: - logging.warning("fp16 is not supported on CPU. Leaving fp32 weights...") checkpoint["cfg"].model_name = model_name - return model.to(device) + return model.to(device_obj) diff --git a/gigaam/decoder.py b/gigaam/decoder.py index 5abbe67..066d397 100644 --- a/gigaam/decoder.py +++ b/gigaam/decoder.py @@ -1,4 +1,4 @@ -from typing import Dict, Optional, Tuple +from typing import Dict, List, Optional, Tuple import torch from torch import Tensor, nn @@ -46,16 +46,16 @@ def joint(self, encoder_out: Tensor, decoder_out: Tensor) -> Tensor: pred = self.pred(decoder_out).unsqueeze(1) return self.joint_net(enc + pred).log_softmax(-1) - def input_example(self): + def input_example(self) -> Tuple[Tensor, Tensor]: device = next(self.parameters()).device enc = torch.zeros(1, self.enc_hidden, 1) dec = torch.zeros(1, self.pred_hidden, 1) return enc.float().to(device), dec.float().to(device) - def input_names(self): + def input_names(self) -> List[str]: return ["enc", "dec"] - def output_names(self): + def output_names(self) -> List[str]: return ["joint"] def forward(self, enc: Tensor, dec: Tensor) -> Tensor: @@ -94,17 +94,17 @@ def predict( g, hid = self.lstm(emb.transpose(0, 1), state) return g.transpose(0, 1), hid - def input_example(self): + def input_example(self) -> Tuple[Tensor, Tensor, Tensor]: device = next(self.parameters()).device label = torch.tensor([[0]]).to(device) hidden_h = torch.zeros(1, 1, self.pred_hidden).to(device) hidden_c = torch.zeros(1, 1, self.pred_hidden).to(device) return label, hidden_h, hidden_c - def input_names(self): + def input_names(self) -> List[str]: return ["x", "h", "c"] - def output_names(self): + def output_names(self) -> List[str]: return ["dec", "h", "c"] def forward(self, x: Tensor, h: Tensor, c: Tensor) -> Tuple[Tensor, Tensor, Tensor]: diff --git a/gigaam/decoding.py b/gigaam/decoding.py index a51d968..6f9d239 100644 --- a/gigaam/decoding.py +++ b/gigaam/decoding.py @@ -106,7 +106,7 @@ def _greedy_decode(self, head: RNNTHead, x: Tensor, seqlen: Tensor) -> str: if k == self.blank_id: not_blank = False else: - hyp.append(k) + hyp.append(int(k)) dec_state = hidden last_label = torch.tensor([[hyp[-1]]]).to(x.device) new_symbols += 1 diff --git a/gigaam/encoder.py b/gigaam/encoder.py index 931582d..d49e630 100644 --- a/gigaam/encoder.py +++ b/gigaam/encoder.py @@ -1,8 +1,9 @@ import math from abc import ABC, abstractmethod -from typing import List, Optional, Tuple, Union +from typing import Dict, List, Optional, Tuple, Union import torch +import torch.nn.functional as F from torch import Tensor, nn try: @@ -23,22 +24,29 @@ class StridingSubsampling(nn.Module): def __init__( self, + subsampling: str, + kernel_size: int, subsampling_factor: int, feat_in: int, feat_out: int, conv_channels: int, ): super().__init__() + self.subsampling_type = subsampling + assert self.subsampling_type in ["conv1d", "conv2d"] self._sampling_num = int(math.log(subsampling_factor, 2)) self._stride = 2 - self._kernel_size = 3 + self._kernel_size = kernel_size self._padding = (self._kernel_size - 1) // 2 layers: List[nn.Module] = [] - in_channels = 1 + in_channels = 1 if self.subsampling_type == "conv2d" else feat_in + subs_conv_class = ( + torch.nn.Conv2d if self.subsampling_type == "conv2d" else torch.nn.Conv1d + ) for _ in range(self._sampling_num): layers.append( - torch.nn.Conv2d( + subs_conv_class( in_channels=in_channels, out_channels=conv_channels, kernel_size=self._kernel_size, @@ -50,7 +58,8 @@ def __init__( in_channels = conv_channels out_length = self.calc_output_length(torch.tensor(feat_in)) - self.out = torch.nn.Linear(conv_channels * int(out_length), feat_out) + if self.subsampling_type == "conv2d": + self.out = torch.nn.Linear(conv_channels * int(out_length), feat_out) self.conv = torch.nn.Sequential(*layers) def calc_output_length(self, lengths: Tensor) -> Tensor: @@ -65,9 +74,12 @@ def calc_output_length(self, lengths: Tensor) -> Tensor: return lengths.to(dtype=torch.int) def forward(self, x: Tensor, lengths: Tensor) -> Tuple[Tensor, Tensor]: - x = self.conv(x.unsqueeze(1)) - b, _, t, _ = x.size() - x = self.out(x.transpose(1, 2).reshape(b, t, -1)) + if self.subsampling_type == "conv2d": + x = self.conv(x.unsqueeze(1)) + b, _, t, _ = x.size() + x = self.out(x.transpose(1, 2).reshape(b, t, -1)) + else: + x = self.conv(x.transpose(1, 2)).transpose(1, 2) return x, self.calc_output_length(lengths) @@ -76,7 +88,9 @@ class MultiHeadAttention(nn.Module, ABC): Base class of Multi-Head Attention Mechanisms. """ - def __init__(self, n_head: int, n_feat: int, flash_attn=False): + def __init__( + self, n_head: int, n_feat: int, flash_attn=False, torch_sdpa_attn=False + ): super().__init__() assert n_feat % n_head == 0 self.d_k = n_feat // n_head @@ -86,6 +100,7 @@ def __init__(self, n_head: int, n_feat: int, flash_attn=False): self.linear_v = nn.Linear(n_feat, n_feat) self.linear_out = nn.Linear(n_feat, n_feat) self.flash_attn = flash_attn + self.torch_sdpa_attn = torch_sdpa_attn if self.flash_attn and not IMPORT_FLASH: raise RuntimeError( f"flash_attn_func was imported with err {IMPORT_FLASH_ERR}. " @@ -192,19 +207,26 @@ def forward( value.view(t, b, self.h * self.d_k).transpose(0, 1), ) - if not self.flash_attn: - scores = torch.matmul(q, k.transpose(-2, -1) / math.sqrt(self.d_k)) - out = self.forward_attention(v, scores, mask) - else: + if self.flash_attn: if mask is None: scores = flash_attn_func(q, k, v) else: scores = apply_masked_flash_attn(q, k, v, mask, self.h, self.d_k) - scores = scores.view(b, -1, self.h * self.d_k) - out = self.linear_out(scores) - - return out + return self.linear_out(scores) + elif self.torch_sdpa_attn: + attn_mask = None if mask is None else ~mask.unsqueeze(1) + attn_output = F.scaled_dot_product_attention( + q, + k, + v, + attn_mask=attn_mask, + ) + attn_output = attn_output.transpose(1, 2).reshape(b, t, self.h * self.d_k) + return self.linear_out(attn_output) + else: + scores = torch.matmul(q, k.transpose(-2, -1) / math.sqrt(self.d_k)) + return self.forward_attention(v, scores, mask) class PositionalEncoding(nn.Module, ABC): @@ -300,9 +322,12 @@ def __init__( self, d_model: int, kernel_size: int, + norm_type: str, ): super().__init__() assert (kernel_size - 1) % 2 == 0 + assert norm_type in ["batch_norm", "layer_norm"] + self.norm_type = norm_type self.pointwise_conv1 = nn.Conv1d(d_model, d_model * 2, kernel_size=1) self.depthwise_conv = nn.Conv1d( in_channels=d_model, @@ -312,7 +337,11 @@ def __init__( groups=d_model, bias=True, ) - self.batch_norm = nn.BatchNorm1d(d_model) + self.batch_norm = ( + nn.BatchNorm1d(d_model) + if norm_type == "batch_norm" + else nn.LayerNorm(d_model) + ) self.activation = nn.SiLU() self.pointwise_conv2 = nn.Conv1d(d_model, d_model, kernel_size=1) @@ -323,7 +352,10 @@ def forward(self, x: Tensor, pad_mask: Optional[Tensor] = None) -> Tensor: if pad_mask is not None: x = x.masked_fill(pad_mask.unsqueeze(1), 0.0) x = self.depthwise_conv(x) - x = self.batch_norm(x) + if self.norm_type == "batch_norm": + x = self.batch_norm(x) + else: + x = self.batch_norm(x.transpose(1, 2)).transpose(1, 2) x = self.activation(x) x = self.pointwise_conv2(x) return x.transpose(1, 2) @@ -358,6 +390,7 @@ def __init__( d_ff: int, self_attention_model: str, n_heads: int = 16, + conv_norm_type: str = "batch_norm", conv_kernel_size: int = 31, flash_attn: bool = False, ): @@ -369,6 +402,7 @@ def __init__( self.conv = ConformerConvolution( d_model=d_model, kernel_size=conv_kernel_size, + norm_type=conv_norm_type, ) self.norm_self_att = nn.LayerNorm(d_model) if self_attention_model == "rotary": @@ -376,6 +410,7 @@ def __init__( n_head=n_heads, n_feat=d_model, flash_attn=flash_attn, + torch_sdpa_attn=not flash_attn, ) else: assert not flash_attn, "Not supported flash_attn for rel_pos" @@ -429,11 +464,14 @@ def __init__( feat_in: int = 64, n_layers: int = 16, d_model: int = 768, + subsampling: str = "conv2d", + subs_kernel_size: int = 3, subsampling_factor: int = 4, ff_expansion_factor: int = 4, self_attention_model: str = "rotary", n_heads: int = 16, pos_emb_max_len: int = 5000, + conv_norm_type: str = "batch_norm", conv_kernel_size: int = 31, flash_attn: bool = False, ): @@ -445,14 +483,17 @@ def __init__( ], f"Not supported attn = {self_attention_model}" self.pre_encode = StridingSubsampling( + subsampling=subsampling, + kernel_size=subs_kernel_size, subsampling_factor=subsampling_factor, feat_in=feat_in, feat_out=d_model, conv_channels=d_model, ) + self.pos_emb_max_len = pos_emb_max_len if self_attention_model == "rotary": - self.pos_enc: nn.Module = RotaryPositionalEmbedding( + self.pos_enc: PositionalEncoding = RotaryPositionalEmbedding( d_model // n_heads, pos_emb_max_len ) else: @@ -465,30 +506,29 @@ def __init__( d_ff=d_model * ff_expansion_factor, self_attention_model=self_attention_model, n_heads=n_heads, + conv_norm_type=conv_norm_type, conv_kernel_size=conv_kernel_size, flash_attn=flash_attn, ) self.layers.append(layer) - self.pos_enc.extend_pe(pos_emb_max_len, next(self.parameters()).device) - def input_example( self, batch_size: int = 1, seqlen: int = 200, - ): + ) -> Tuple[Tensor, Tensor]: device = next(self.parameters()).device features = torch.zeros(batch_size, self.feat_in, seqlen) feature_lengths = torch.full([batch_size], features.shape[-1]) return features.float().to(device), feature_lengths.to(device) - def input_names(self): + def input_names(self) -> List[str]: return ["audio_signal", "length"] - def output_names(self): + def output_names(self) -> List[str]: return ["encoded", "encoded_len"] - def dynamic_axes(self): + def dynamic_axes(self) -> Dict[str, Dict[int, str]]: return { "audio_signal": {0: "batch_size", 2: "seq_len"}, "length": {0: "batch_size"}, @@ -497,6 +537,9 @@ def dynamic_axes(self): } def forward(self, audio_signal: Tensor, length: Tensor) -> Tuple[Tensor, Tensor]: + if not hasattr(self.pos_enc, "pe"): + self.pos_enc.extend_pe(self.pos_emb_max_len, audio_signal.device) + audio_signal, length = self.pre_encode( x=audio_signal.transpose(1, 2), lengths=length ) diff --git a/gigaam/model.py b/gigaam/model.py index bf58e79..ac38c1d 100644 --- a/gigaam/model.py +++ b/gigaam/model.py @@ -23,10 +23,8 @@ def __init__(self, cfg: omegaconf.DictConfig): self.encoder = hydra.utils.instantiate(self.cfg.encoder) def forward( - self, - features: Tensor, - feature_lengths: Tensor, - ) -> Tensor: + self, features: Tensor, feature_lengths: Tensor + ) -> Tuple[Tensor, Tensor]: """ Perform forward pass through the preprocessor and encoder. """ @@ -63,6 +61,13 @@ def embed_audio(self, wav_file: str) -> Tuple[Tensor, Tensor]: return encoded, encoded_len def to_onnx(self, dir_path: str = ".") -> None: + """ + Export onnx model encoder to the specified dir. + """ + self._to_onnx(dir_path) + omegaconf.OmegaConf.save(self.cfg, f"{dir_path}/{self.cfg.model_name}.yaml") + + def _to_onnx(self, dir_path: str = ".") -> None: """ Export onnx model encoder to the specified dir. """ @@ -90,7 +95,7 @@ def transcribe(self, wav_file: str) -> str: Transcribes a short audio file into text. """ wav, length = self.prepare_wav(wav_file) - if length > LONGFORM_THRESHOLD: + if length.item() > LONGFORM_THRESHOLD: raise ValueError("Too long wav file, use 'transcribe_longform' method.") encoded, encoded_len = self.forward(wav, length) @@ -102,7 +107,7 @@ def forward_for_export(self, features: Tensor, feature_lengths: Tensor) -> Tenso """ return self.head(self.encoder(features, feature_lengths)[0]) - def to_onnx(self, dir_path: str = ".") -> None: + def _to_onnx(self, dir_path: str = ".") -> None: """ Export onnx ASR model. `ctc`: exported entirely in encoder-decoder format. @@ -110,23 +115,25 @@ def to_onnx(self, dir_path: str = ".") -> None: """ if "ctc" in self.cfg.model_name: saved_forward = self.forward - self.forward = self.forward_for_export - onnx_converter( - model_name=self.cfg.model_name, - out_dir=dir_path, - module=self, - inputs=self.encoder.input_example(), - input_names=["features", "feature_lengths"], - output_names=["log_probs"], - dynamic_axes={ - "features": {0: "batch_size", 2: "seq_len"}, - "feature_lengths": {0: "batch_size"}, - "log_probs": {0: "batch_size", 1: "seq_len"}, - }, - ) - self.forward = saved_forward + self.forward = self.forward_for_export # type: ignore[assignment, method-assign] + try: + onnx_converter( + model_name=self.cfg.model_name, + out_dir=dir_path, + module=self, + inputs=self.encoder.input_example(), + input_names=["features", "feature_lengths"], + output_names=["log_probs"], + dynamic_axes={ + "features": {0: "batch_size", 2: "seq_len"}, + "feature_lengths": {0: "batch_size"}, + "log_probs": {0: "batch_size", 1: "seq_len"}, + }, + ) + finally: + self.forward = saved_forward # type: ignore[assignment, method-assign] else: - super().to_onnx(dir_path) # export encoder + super()._to_onnx(dir_path) # export encoder onnx_converter( model_name=f"{self.cfg.model_name}_decoder", out_dir=dir_path, @@ -146,12 +153,11 @@ def transcribe_longform( Transcribes a long audio file by splitting it into segments and then transcribing each segment. """ - from .vad_utils import segment_audio + from .vad_utils import segment_audio_file transcribed_segments = [] - wav = load_audio(wav_file, return_format="int") - segments, boundaries = segment_audio( - wav, SAMPLE_RATE, device=self._device, **kwargs + segments, boundaries = segment_audio_file( + wav_file, SAMPLE_RATE, device=self._device, **kwargs ) for segment, segment_boundaries in zip(segments, boundaries): wav = segment.to(self._device).unsqueeze(0).to(self._dtype) @@ -159,10 +165,7 @@ def transcribe_longform( encoded, encoded_len = self.forward(wav, length) result = self.decoding.decode(self.head, encoded, encoded_len)[0] transcribed_segments.append( - { - "transcription": result, - "boundaries": segment_boundaries, - } + {"transcription": result, "boundaries": segment_boundaries} ) return transcribed_segments @@ -197,28 +200,28 @@ def forward_for_export(self, features: Tensor, feature_lengths: Tensor) -> Tenso Encoder-decoder forward to save model entirely in onnx format. """ encoded, _ = self.encoder(features, feature_lengths) - enc_pooled = nn.functional.avg_pool1d( - encoded, kernel_size=encoded.shape[-1].item() - ).squeeze(-1) - return nn.functional.softmax(self.head(enc_pooled)[0], dim=-1) + enc_pooled = encoded.mean(dim=-1) + return nn.functional.softmax(self.head(enc_pooled), dim=-1) - def to_onnx(self, dir_path: str = ".") -> None: + def _to_onnx(self, dir_path: str = ".") -> None: """ Export onnx Emo model. """ saved_forward = self.forward - self.forward = self.forward_for_export - onnx_converter( - model_name=self.cfg.model_name, - out_dir=dir_path, - module=self, - inputs=self.encoder.input_example(), - input_names=["features", "feature_lengths"], - output_names=["probs"], - dynamic_axes={ - "features": {0: "batch_size", 2: "seq_len"}, - "feature_lengths": {0: "batch_size"}, - "probs": {0: "batch_size", 1: "seq_len"}, - }, - ) - self.forward = saved_forward + self.forward = self.forward_for_export # type: ignore[assignment, method-assign] + try: + onnx_converter( + model_name=self.cfg.model_name, + out_dir=dir_path, + module=self, + inputs=self.encoder.input_example(), + input_names=["features", "feature_lengths"], + output_names=["probs"], + dynamic_axes={ + "features": {0: "batch_size", 2: "seq_len"}, + "feature_lengths": {0: "batch_size"}, + "probs": {0: "batch_size", 1: "seq_len"}, + }, + ) + finally: + self.forward = saved_forward # type: ignore[assignment, method-assign] diff --git a/gigaam/onnx_utils.py b/gigaam/onnx_utils.py index 53c5fc8..8fd1c0d 100644 --- a/gigaam/onnx_utils.py +++ b/gigaam/onnx_utils.py @@ -1,70 +1,38 @@ import warnings -from typing import List, Optional +from typing import List, Optional, Tuple, Union +import hydra import numpy as np +import omegaconf import onnxruntime as rt import torch +from .decoding import Tokenizer +from .preprocess import FeatureExtractor, load_audio + warnings.simplefilter("ignore", category=UserWarning) -import gigaam -D_MODEL = 768 DTYPE = np.float32 MAX_LETTERS_PER_FRAME = 3 -SAMPLE_RATE = 16000 -FEAT_IN = 64 -PRED_HIDDEN = 320 -BLANK_IDX = 33 -VOCAB = [ - " ", - "а", - "б", - "в", - "г", - "д", - "е", - "ж", - "з", - "и", - "й", - "к", - "л", - "м", - "н", - "о", - "п", - "р", - "с", - "т", - "у", - "ф", - "х", - "ц", - "ч", - "ш", - "щ", - "ъ", - "ы", - "ь", - "э", - "ю", - "я", -] - - -def transcribe_sample( + + +def infer_onnx( wav_file: str, - model_type: str, + model_cfg: omegaconf.DictConfig, sessions: List[rt.InferenceSession], - preprocessor: Optional[gigaam.preprocess.FeatureExtractor] = None, -) -> str: - if preprocessor is None: - preprocessor = gigaam.preprocess.FeatureExtractor(SAMPLE_RATE, FEAT_IN) + preprocessor: Optional[FeatureExtractor] = None, + tokenizer: Optional[Tokenizer] = None, +) -> Union[str, np.ndarray]: + """Run ONNX sessions for the model, requires preprocessor instantiating""" + model_name = model_cfg.model_name - assert model_type in ["ctc", "rnnt"], "Only `ctc` and `rnnt` inference supported" + if preprocessor is None: + preprocessor = hydra.utils.instantiate(model_cfg.preprocessor) + if tokenizer is None and ("ctc" in model_name or "rnnt" in model_name): + tokenizer = hydra.utils.instantiate(model_cfg.decoding).tokenizer - input_signal = gigaam.load_audio(wav_file) + input_signal = load_audio(wav_file) input_signal = preprocessor( input_signal.unsqueeze(0), torch.tensor([input_signal.shape[-1]]) )[0].numpy() @@ -81,18 +49,22 @@ def transcribe_sample( [node.name for node in enc_sess.get_outputs()], enc_inputs )[0] + if "emo" in model_name or "ssl" in model_name: + return enc_features + + blank_idx = len(tokenizer) token_ids = [] - prev_token = BLANK_IDX - if model_type == "ctc": - prev_tok = BLANK_IDX + prev_token = blank_idx + if "ctc" in model_name: + prev_tok = blank_idx for tok in enc_features.argmax(-1).squeeze().tolist(): - if (tok != prev_tok or prev_tok == BLANK_IDX) and tok != BLANK_IDX: + if (tok != prev_tok or prev_tok == blank_idx) and tok != blank_idx: token_ids.append(tok) prev_tok = tok else: pred_states = [ - np.zeros(shape=(1, 1, PRED_HIDDEN), dtype=DTYPE), - np.zeros(shape=(1, 1, PRED_HIDDEN), dtype=DTYPE), + np.zeros(shape=(1, 1, model_cfg.head.decoder.pred_hidden), dtype=DTYPE), + np.zeros(shape=(1, 1, model_cfg.head.decoder.pred_hidden), dtype=DTYPE), ] pred_sess, joint_sess = sessions[1:] for j in range(enc_features.shape[-1]): @@ -101,7 +73,7 @@ def transcribe_sample( pred_inputs = { node.name: data for (node, data) in zip( - pred_sess.get_inputs(), [[[prev_token]]] + pred_states + pred_sess.get_inputs(), [np.array([[prev_token]])] + pred_states ) } pred_outputs = pred_sess.run( @@ -120,7 +92,7 @@ def transcribe_sample( ) token = log_probs[0].argmax(-1)[0][0] - if token != BLANK_IDX: + if token != blank_idx: prev_token = int(token) pred_states = pred_outputs[1:] token_ids.append(int(token)) @@ -128,39 +100,51 @@ def transcribe_sample( else: break - return "".join(VOCAB[tok] for tok in token_ids) + return tokenizer.decode(token_ids) -def load_onnx_sessions( +def load_onnx( onnx_dir: str, - model_type: str, - model_version: Optional[str] = None, -) -> List[rt.InferenceSession]: - if model_version is None: - model_version = "v2" + model_version: str, + provider: Optional[str] = None, +) -> Tuple[ + List[rt.InferenceSession], Union[omegaconf.DictConfig, omegaconf.ListConfig] +]: + """Load ONNX sessions for the given versions and cpu / cuda provider""" + if provider is None and "CUDAExecutionProvider" in rt.get_available_providers(): + provider = "CUDAExecutionProvider" + elif provider is None: + provider = "CPUExecutionProvider" opts = rt.SessionOptions() opts.intra_op_num_threads = 16 opts.execution_mode = rt.ExecutionMode.ORT_SEQUENTIAL + opts.log_severity_level = 3 + + model_cfg = omegaconf.OmegaConf.load(f"{onnx_dir}/{model_version}.yaml") - if model_type == "ctc": - model_path = f"{onnx_dir}/{model_version}_{model_type}.onnx" + if "rnnt" not in model_version and "ssl" not in model_version: + model_path = f"{onnx_dir}/{model_version}.onnx" sessions = [ - rt.InferenceSession( - model_path, providers=["CPUExecutionProvider"], sess_options=opts - ) + rt.InferenceSession(model_path, providers=[provider], sess_options=opts) ] + elif "ssl" in model_version: + pth = f"{onnx_dir}/{model_version}" + enc_sess = rt.InferenceSession( + f"{pth}_encoder.onnx", providers=[provider], sess_options=opts + ) + sessions = [enc_sess] else: - pth = f"{onnx_dir}/{model_version}_{model_type}" + pth = f"{onnx_dir}/{model_version}" enc_sess = rt.InferenceSession( - f"{pth}_encoder.onnx", providers=["CPUExecutionProvider"], sess_options=opts + f"{pth}_encoder.onnx", providers=[provider], sess_options=opts ) pred_sess = rt.InferenceSession( - f"{pth}_decoder.onnx", providers=["CPUExecutionProvider"], sess_options=opts + f"{pth}_decoder.onnx", providers=[provider], sess_options=opts ) joint_sess = rt.InferenceSession( - f"{pth}_joint.onnx", providers=["CPUExecutionProvider"], sess_options=opts + f"{pth}_joint.onnx", providers=[provider], sess_options=opts ) sessions = [enc_sess, pred_sess, joint_sess] - return sessions + return sessions, model_cfg diff --git a/gigaam/preprocess.py b/gigaam/preprocess.py index d3ee201..fb6ebde 100644 --- a/gigaam/preprocess.py +++ b/gigaam/preprocess.py @@ -1,3 +1,4 @@ +import warnings from subprocess import CalledProcessError, run from typing import Tuple @@ -8,9 +9,7 @@ SAMPLE_RATE = 16000 -def load_audio( - audio_path: str, sample_rate: int = SAMPLE_RATE, return_format: str = "float" -) -> Tensor: +def load_audio(audio_path: str, sample_rate: int = SAMPLE_RATE) -> Tensor: """ Load an audio file and resample it to the specified sample rate. """ @@ -36,11 +35,10 @@ def load_audio( except CalledProcessError as exc: raise RuntimeError("Failed to load audio") from exc - if return_format == "float": + with warnings.catch_warnings(): + warnings.simplefilter("ignore", category=UserWarning) return torch.frombuffer(audio, dtype=torch.int16).float() / 32768.0 - return torch.frombuffer(audio, dtype=torch.int16) - class SpecScaler(nn.Module): """ @@ -59,16 +57,20 @@ class FeatureExtractor(nn.Module): and applies logarithmic scaling. """ - def __init__(self, sample_rate: int, features: int): + def __init__(self, sample_rate: int, features: int, **kwargs): super().__init__() - self.hop_length = sample_rate // 100 + self.hop_length = kwargs.get("hop_length", sample_rate // 100) + self.win_length = kwargs.get("win_length", sample_rate // 40) + self.n_fft = kwargs.get("n_fft", sample_rate // 40) + self.center = kwargs.get("center", True) self.featurizer = nn.Sequential( torchaudio.transforms.MelSpectrogram( sample_rate=sample_rate, - n_fft=sample_rate // 40, - win_length=sample_rate // 40, - hop_length=self.hop_length, n_mels=features, + win_length=self.win_length, + hop_length=self.hop_length, + n_fft=self.n_fft, + center=self.center, ), SpecScaler(), ) @@ -77,7 +79,17 @@ def out_len(self, input_lengths: Tensor) -> Tensor: """ Calculates the output length after the feature extraction process. """ - return input_lengths.div(self.hop_length, rounding_mode="floor").add(1).long() + if self.center: + return ( + input_lengths.div(self.hop_length, rounding_mode="floor").add(1).long() + ) + else: + return ( + (input_lengths - self.win_length) + .div(self.hop_length, rounding_mode="floor") + .add(1) + .long() + ) def forward(self, input_signal: Tensor, length: Tensor) -> Tuple[Tensor, Tensor]: """ diff --git a/gigaam/utils.py b/gigaam/utils.py index 53aa1f2..145a842 100644 --- a/gigaam/utils.py +++ b/gigaam/utils.py @@ -1,18 +1,22 @@ +import os import warnings from pathlib import Path from typing import Dict, List, Optional, Tuple, Union +import numpy as np import torch import torch.nn.functional as F from torch import Tensor from torch.jit import TracerWarning +from .preprocess import load_audio + def onnx_converter( model_name: str, module: torch.nn.Module, out_dir: str, - inputs: Optional[Tuple[Tensor]] = None, + inputs: Optional[Tuple[Tensor, ...]] = None, input_names: Optional[List[str]] = None, output_names: Optional[List[str]] = None, dynamic_axes: Optional[ @@ -21,17 +25,18 @@ def onnx_converter( opset_version: int = 17, ): if inputs is None: - inputs = module.input_example() + inputs = module.input_example() # type: ignore[operator] if input_names is None: - input_names = module.input_names() + input_names = module.input_names() # type: ignore[operator] if output_names is None: - output_names = module.output_names() + output_names = module.output_names() # type: ignore[operator] Path(out_dir).mkdir(exist_ok=True, parents=True) out_path = str(Path(out_dir) / f"{model_name}.onnx") saved_dtype = next(module.parameters()).dtype - with warnings.catch_warnings(): - warnings.simplefilter("ignore", category=(UserWarning, TracerWarning)) + with warnings.catch_warnings(), torch.no_grad(): + warnings.simplefilter("ignore", category=UserWarning) + warnings.simplefilter("ignore", category=TracerWarning) torch.onnx.export( module.to(torch.float32), inputs, @@ -41,7 +46,7 @@ def onnx_converter( dynamic_axes=dynamic_axes, opset_version=opset_version, ) - print(f"Succesfully ported onnx {model_name} to {out_path}.") + print(f"Successfully ported onnx {model_name} to {out_path}.") module.to(saved_dtype) @@ -131,3 +136,63 @@ def apply_masked_flash_attn( ) return scores + + +def download_short_audio(): + """Download test audio file if not exists""" + audio_file = "example.wav" + if not os.path.exists(audio_file): + os.system( + 'wget -O example.wav "https://cdn.chatwm.opensmodel.sberdevices.ru/GigaAM/example.wav"' + ) + assert os.path.exists(audio_file), "Short audio file not found" + return audio_file + + +def download_long_audio(): + """Download test audio file if not exists""" + audio_file = "long_example.wav" + if not os.path.exists(audio_file): + os.system( + 'wget -O long_example.wav "https://cdn.chatwm.opensmodel.sberdevices.ru/GigaAM/long_example.wav"' + ) + assert os.path.exists(audio_file), "Long audio file not found" + return audio_file + + +class AudioDataset(torch.utils.data.Dataset): + """ + Helper class for creating batched inputs + """ + + def __init__(self, lst: List[Union[str, np.ndarray, torch.Tensor]]): + if len(lst) == 0: + raise ValueError("AudioDataset cannot be initialized with an empty list") + assert isinstance( + lst[0], (str, np.ndarray, torch.Tensor) + ), f"Unexpected dtype: {type(lst[0])}" + self.lst = lst + + def __len__(self): + return len(self.lst) + + def __getitem__(self, idx): + item = self.lst[idx] + if isinstance(item, str): + wav_tns = load_audio(item) + elif isinstance(item, np.ndarray): + wav_tns = torch.from_numpy(item) + elif isinstance(item, torch.Tensor): + wav_tns = item + else: + raise RuntimeError(f"Unexpected sample type: {type(item)} at idx={idx}") + return wav_tns + + @staticmethod + def collate(wavs): + lengths = torch.tensor([len(wav) for wav in wavs]) + max_len = lengths.max().item() + wav_tns = torch.zeros(len(wavs), max_len, dtype=wavs[0].dtype) + for idx, wav in enumerate(wavs): + wav_tns[idx, : wav.shape[-1]] = wav.squeeze() + return wav_tns, lengths diff --git a/gigaam/vad_utils.py b/gigaam/vad_utils.py index 0284b90..53a7c26 100644 --- a/gigaam/vad_utils.py +++ b/gigaam/vad_utils.py @@ -1,15 +1,16 @@ import os -from io import BytesIO -from typing import List, Tuple, Union +from typing import List, Tuple import torch -from pyannote.audio import Pipeline -from pydub import AudioSegment +from pyannote.audio import Model, Pipeline +from pyannote.audio.pipelines import VoiceActivityDetection + +from .preprocess import load_audio _PIPELINE = None -def get_pipeline(device: Union[str, torch.device]) -> Pipeline: +def get_pipeline(device: torch.device) -> Pipeline: """ Retrieves a PyAnnote voice activity detection pipeline and move it to the specified device. The pipeline is loaded only once and reused across subsequent calls. @@ -24,51 +25,30 @@ def get_pipeline(device: Union[str, torch.device]) -> Pipeline: except KeyError as exc: raise ValueError("HF_TOKEN environment variable is not set") from exc - _PIPELINE = Pipeline.from_pretrained( - "pyannote/voice-activity-detection", use_auth_token=hf_token - ) + model = Model.from_pretrained("pyannote/segmentation-3.0", token=hf_token) + _PIPELINE = VoiceActivityDetection(segmentation=model) + _PIPELINE.instantiate({"min_duration_on": 0.0, "min_duration_off": 0.0}) return _PIPELINE.to(device) -def audiosegment_to_tensor(audiosegment: AudioSegment) -> torch.Tensor: - """ - Converts an AudioSegment object to a PyTorch tensor. - """ - samples = torch.tensor(audiosegment.get_array_of_samples(), dtype=torch.float32) - if audiosegment.channels == 2: - samples = samples.view(-1, 2) - - samples = samples / 32768.0 # Normalize to [-1, 1] range - return samples - - -def segment_audio( - wav_tensor: torch.Tensor, - sample_rate: int, +def segment_audio_file( + wav_file: str, + sr: int, max_duration: float = 22.0, min_duration: float = 15.0, + strict_limit_duration: float = 30.0, new_chunk_threshold: float = 0.2, - device: Union[str, torch.device] = "cpu", + device: torch.device = torch.device("cpu"), ) -> Tuple[List[torch.Tensor], List[Tuple[float, float]]]: """ Segments an audio waveform into smaller chunks based on speech activity. The segmentation is performed using a PyAnnote voice activity detection pipeline. """ - audio = AudioSegment( - wav_tensor.numpy().tobytes(), - frame_rate=sample_rate, - sample_width=wav_tensor.dtype.itemsize, - channels=1, - ) - audio_bytes = BytesIO() - audio.export(audio_bytes, format="wav") - audio_bytes.seek(0) - - # Process audio with pipeline to obtain segments with speech activity + audio = load_audio(wav_file) pipeline = get_pipeline(device) - sad_segments = pipeline({"uri": "filename", "audio": audio_bytes}) + sad_segments = pipeline(wav_file) segments: List[torch.Tensor] = [] curr_duration = 0.0 @@ -76,27 +56,34 @@ def segment_audio( curr_end = 0.0 boundaries: List[Tuple[float, float]] = [] + def _update_segments(curr_start: float, curr_end: float, curr_duration: float): + if curr_duration > strict_limit_duration: + max_segments = int(curr_duration / strict_limit_duration) + 1 + segment_duration = curr_duration / max_segments + curr_end = curr_start + segment_duration + for _ in range(max_segments - 1): + segments.append(audio[int(curr_start * sr) : int(curr_end * sr)]) + boundaries.append((curr_start, curr_end)) + curr_start = curr_end + curr_end += segment_duration + segments.append(audio[int(curr_start * sr) : int(curr_end * sr)]) + boundaries.append((curr_start, curr_end)) + # Concat segments from pipeline into chunks for asr according to max/min duration + # Segments longer than strict_limit_duration are split manually for segment in sad_segments.get_timeline().support(): start = max(0, segment.start) - end = min(len(audio) / 1000, segment.end) - if ( - curr_duration > min_duration and start - curr_end > new_chunk_threshold - ) or (curr_duration + (end - curr_end) > max_duration): - - start_ms = int(curr_start * 1000) - end_ms = int(curr_end * 1000) - segments.append(audiosegment_to_tensor(audio[start_ms:end_ms])) - boundaries.append((curr_start, curr_end)) + end = min(audio.shape[0] / sr, segment.end) + if curr_duration > new_chunk_threshold and ( + curr_duration + (end - curr_end) > max_duration + or curr_duration > min_duration + ): + _update_segments(curr_start, curr_end, curr_duration) curr_start = start - curr_end = end curr_duration = curr_end - curr_start - if curr_duration != 0: - start_ms = int(curr_start * 1000) - end_ms = int(curr_end * 1000) - segments.append(audiosegment_to_tensor(audio[start_ms:end_ms])) - boundaries.append((curr_start, curr_end)) + if curr_duration > new_chunk_threshold: + _update_segments(curr_start, curr_end, curr_duration) return segments, boundaries diff --git a/gigaam_scheme.svg b/gigaam_scheme.svg deleted file mode 100644 index 38b8ba6..0000000 --- a/gigaam_scheme.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/inference_example.ipynb b/inference_example.ipynb deleted file mode 100644 index d388f26..0000000 --- a/inference_example.ipynb +++ /dev/null @@ -1,468 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": { - "id": "Me66GFwT0ABG" - }, - "source": [ - "### Installing reqs and downloading examples" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "id": "PlM9MI70iTIp" - }, - "outputs": [], - "source": [ - "# If package is not installed\n", - "! pip install git+https://github.com/salute-developers/GigaAM.git" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "id": "GSE4HSfr1P0B" - }, - "outputs": [], - "source": [ - "# Downloading wavs for examples\n", - "!wget https://cdn.chatwm.opensmodel.sberdevices.ru/GigaAM/example.wav\n", - "!wget https://cdn.chatwm.opensmodel.sberdevices.ru/GigaAM/long_example.wav" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "tIvec0280O64" - }, - "source": [ - "## Speech Recognition" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "id": "xCgbSPkViZpF" - }, - "outputs": [], - "source": [ - "import os\n", - "import warnings\n", - "from typing import Dict\n", - "\n", - "import gigaam\n", - "\n", - "warnings.simplefilter(action=\"ignore\", category=FutureWarning)\n", - "warnings.simplefilter(action=\"ignore\", category=UserWarning)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/", - "height": 71 - }, - "id": "R2aUkZbG8fJ6", - "outputId": "3172d43c-19cf-4b97-df5e-108e40d92144" - }, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "100%|███████████████████████████████████████| 888M/888M [02:27<00:00, 6.29MiB/s]\n" - ] - }, - { - "data": { - "application/vnd.google.colaboratory.intrinsic+json": { - "type": "string" - }, - "text/plain": [ - "'ничьих не требуя похвал счастлив уж я надеждой сладкой что дева с трепетом любви посмотрит может быть украдкой на песни грешные мои у лукоморья дуб зеленый'" - ] - }, - "execution_count": null, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "model = gigaam.load_model(\n", - " \"ctc\", # GigaAM-V2 CTC model\n", - " fp16_encoder=True, # to use fp16 encoder weights - GPU only\n", - " use_flash=False, # disable flash attention - colab does not support it\n", - ")\n", - "model.transcribe(\"example.wav\")" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/", - "height": 107 - }, - "id": "5nPc8flc1U3d", - "outputId": "cce9f875-62ad-4b48-a6a9-29701eb343ed" - }, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "100%|███████████████████████████████████████| 892M/892M [02:34<00:00, 6.07MiB/s]\n", - "WARNING:root:flash_attn is not supported on CPU. Disabling it...\n", - "WARNING:root:fp16 is not supported on CPU. Leaving fp32 weights...\n" - ] - }, - { - "data": { - "application/vnd.google.colaboratory.intrinsic+json": { - "type": "string" - }, - "text/plain": [ - "'ничьих не требуя похвал счастлив уж я надеждой сладкой что дева с трепетом любви посмотрит может быть украдкой на песни грешные мои у лукоморья дуб зеленый'" - ] - }, - "execution_count": null, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "model = gigaam.load_model(\n", - " \"rnnt\", # GigaAM-V2 RNNT model\n", - " device=\"cpu\", # CPU-inference\n", - ")\n", - "model.transcribe(\"example.wav\")" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "78WAYQTa14Qs" - }, - "source": [ - "### Long-Form Speech Recognition" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "id": "hvQdrpqG39kQ" - }, - "outputs": [], - "source": [ - "!pip install gigaam[longform]" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "riG4tjcH8fJ7" - }, - "source": [ - "* For long-form inference:\n", - " * generate [Hugging Face API token](https://huggingface.co/docs/hub/security-tokens)\n", - " * accept the conditions to access [pyannote/voice-activity-detection](https://huggingface.co/pyannote/voice-activity-detection) files and content\n", - " * accept the conditions to access [pyannote/segmentation](https://huggingface.co/pyannote/segmentation) files and content" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "id": "GlpX1XOX4vGw" - }, - "outputs": [], - "source": [ - "os.environ[\"HF_TOKEN\"] = \"\"" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/" - }, - "id": "DI_tb_N918FS", - "outputId": "db002337-fdd4-4fba-95e8-802e010d5303" - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "[00:00:00 - 00:16:83]: вечерня отошла давно но в кельях тихо и темно уже и сам игумен строгий свои молитвы прекратил и кости ветхие склонил перекрестясь на одр убогий кругом и сон и тишина но церкви дверь отворена\n", - "[00:17:10 - 00:32:61]: трепещет луч лампады и тускло озаряет он и темную живопись икон и позлощенные оклады и раздается в тишине то тяжкий вздох то шепот важный и мрачно дремлет в вышине старинный свод\n", - "[00:32:95 - 00:49:33]: глухой и влажный стоят за клиросом чернец и грешник неподвижны оба и шепот их как глаз из гроба и грешник бледен как мертвец монах несчастный полно перестань\n", - "[00:49:82 - 01:05:74]: ужасна исповедь злодея заплачена тобою дань тому кто в злобе пламенея лукаво грешника блюдет и к вечной гибели ведет смирись опомнись время время раскаянье покров\n", - "[01:05:97 - 01:10:90]: я разрешу тебя грехов сложи мучительное бремя\n" - ] - } - ], - "source": [ - "model = gigaam.load_model(\"ctc\", use_flash=False)\n", - "recognition_result = model.transcribe_longform(\"long_example.wav\")\n", - "\n", - "for utterance in recognition_result:\n", - " transcription = utterance[\"transcription\"]\n", - " start, end = utterance[\"boundaries\"]\n", - " print(f\"[{gigaam.format_time(start)} - {gigaam.format_time(end)}]: {transcription}\")" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "ywEjYaAe3BMU" - }, - "source": [ - "## Emotion recognition" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/" - }, - "id": "HWsJ2RuG3HNB", - "outputId": "6d1f8abb-9fb0-4c28-c5e3-c21413a22796" - }, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "100%|███████████████████████████████████████| 924M/924M [02:04<00:00, 7.78MiB/s]\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "angry: 0.000, sad: 0.002, neutral: 0.923, positive: 0.074\n" - ] - } - ], - "source": [ - "model = gigaam.load_model(\"emo\")\n", - "emotion2prob: Dict[str, int] = model.get_probs(\"example.wav\")\n", - "\n", - "print(\", \".join([f\"{emotion}: {prob:.3f}\" for emotion, prob in emotion2prob.items()]))" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "1EBcRVcC3P2E" - }, - "source": [ - "## GigaAM embeddings" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/" - }, - "id": "5y2mEAGU3TYN", - "outputId": "ae488719-df9f-4318-ecf7-56c95a87a4ac" - }, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "100%|███████████████████████████████████████| 887M/887M [03:21<00:00, 4.62MiB/s]\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "tensor([[[-0.2829, 0.3638, 0.4520, ..., -0.4743, -0.4033, -0.2417],\n", - " [ 0.1611, -0.5006, -0.0584, ..., -0.6239, -0.2320, -0.2054],\n", - " [-1.1849, -1.0029, -0.6111, ..., -0.5137, -0.3737, -0.2654],\n", - " ...,\n", - " [ 0.0181, -0.3763, -0.8959, ..., 0.1716, 0.0556, 0.1298],\n", - " [ 0.2690, -0.0654, -0.5020, ..., -1.4432, -1.4827, -1.4490],\n", - " [-1.5650, -1.6693, -1.2834, ..., 0.5117, 0.4839, 0.0136]]],\n", - " device='cuda:0', grad_fn=)\n" - ] - } - ], - "source": [ - "# audio-only pretrained encoder\n", - "model = gigaam.load_model(\"ssl\", use_flash=False)\n", - "\n", - "emb, _ = model.embed_audio(\"example.wav\")\n", - "print(emb)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/" - }, - "id": "hW8GKJrl3tm7", - "outputId": "160f4e59-3020-4986-b35e-5c7fa6e105fd" - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "tensor([[[-1.0334, -0.2841, -0.3606, ..., -0.2859, -0.6947, -0.7006],\n", - " [-0.4317, -0.0140, -0.9296, ..., 0.1781, 0.2170, -0.0181],\n", - " [-0.9221, -1.1284, -0.6389, ..., -1.0664, -1.3304, -1.2421],\n", - " ...,\n", - " [ 0.5749, 0.5176, -0.0996, ..., 1.7497, 1.8691, 2.1302],\n", - " [-0.2919, -0.8087, -1.2554, ..., -0.7942, -0.7634, -0.7938],\n", - " [-1.8086, -2.1976, -2.4012, ..., 0.8310, 1.0165, 1.0165]]],\n", - " device='cuda:0', grad_fn=)\n" - ] - } - ], - "source": [ - "# you also can embed audio with CTC- or RNNT-finetuned encoder\n", - "model = gigaam.load_model(\"ctc\", use_flash=False)\n", - "\n", - "emb, _ = model.embed_audio(\"example.wav\")\n", - "print(emb)" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "je4WAyLgz0Ua" - }, - "source": [ - "## Export to ONNX" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/" - }, - "id": "7tvo_v_iz0Ua", - "outputId": "4db517e6-7e85-4c01-c4c3-0b21744b8988" - }, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "100%|███████████████████████████████████████| 892M/892M [03:20<00:00, 4.66MiB/s]\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Succesfully ported onnx v2_rnnt_encoder to onnx/v2_rnnt_encoder.onnx.\n", - "Succesfully ported onnx v2_rnnt_decoder to onnx/v2_rnnt_decoder.onnx.\n", - "Succesfully ported onnx v2_rnnt_joint to onnx/v2_rnnt_joint.onnx.\n" - ] - } - ], - "source": [ - "onnx_dir = \"onnx\"\n", - "model_type = \"rnnt\" # or \"ctc\"\n", - "\n", - "model = gigaam.load_model(\n", - " model_type,\n", - " fp16_encoder=False, # only fp32 tensors\n", - " use_flash=False, # disable flash attention\n", - ")\n", - "model.to_onnx(dir_path=onnx_dir)" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "NL3W76cgz0Ua" - }, - "source": [ - "### ONNX inference" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/", - "height": 53 - }, - "id": "j_rjvUeJz0Ua", - "outputId": "2f8a9e71-c5aa-4fb6-89cf-d251eeb7dce3" - }, - "outputs": [ - { - "data": { - "application/vnd.google.colaboratory.intrinsic+json": { - "type": "string" - }, - "text/plain": [ - "'ничьих не требуя похвал счастлив уж я надеждой сладкой что дева с трепетом любви посмотрит может быть украдкой на песни грешные мои у лукоморья дуб зеленый'" - ] - }, - "execution_count": null, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "from gigaam.onnx_utils import load_onnx_sessions, transcribe_sample\n", - "\n", - "sessions = load_onnx_sessions(onnx_dir, model_type)\n", - "transcribe_sample(\"example.wav\", model_type, sessions)" - ] - } - ], - "metadata": { - "accelerator": "GPU", - "colab": { - "gpuType": "T4", - "provenance": [] - }, - "kernelspec": { - "display_name": "Python 3", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.9.18" - } - }, - "nbformat": 4, - "nbformat_minor": 0 -} diff --git a/requirements.txt b/requirements.txt index 2260551..3dbb658 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,10 +1,9 @@ -hydra-core<=1.3.2 -numpy -omegaconf<=2.3.0 -pydub<=0.25.1 -sentencepiece<=0.2.0 -torch<=2.5.1 -torchaudio<=2.5.1 -onnx==1.17.0 -onnxruntime==1.17.3 +hydra-core==1.3.* +numpy==2.* +omegaconf==2.3.* +onnx==1.19.* +onnxruntime==1.23.* +sentencepiece +torch>=2.5,<2.9 +torchaudio>=2.5,<2.9 tqdm \ No newline at end of file diff --git a/setup.py b/setup.py index 856b95a..fc59fd4 100644 --- a/setup.py +++ b/setup.py @@ -13,13 +13,16 @@ url="https://github.com/salute-developers/GigaAM/", license="MIT", packages=find_packages(include=["gigaam"]), - python_requires=">=3.8", + python_requires=">=3.10", install_requires=[ str(r) for r in pkg_resources.parse_requirements( open("requirements.txt", "r", encoding="utf-8").read() ) ], - extras_require={"longform": ["pyannote.audio", "pydub"]}, + extras_require={ + "longform": ["torch==2.8.*", "torchaudio==2.8.*", "pyannote.audio==4.0", "torchcodec==0.7", "numba>=0.62"], + "tests": ["pytest", "pytest-cov", "scipy", "soundfile", "librosa"], + }, include_package_data=True, ) diff --git a/tests/test_batching.py b/tests/test_batching.py new file mode 100644 index 0000000..bf41f45 --- /dev/null +++ b/tests/test_batching.py @@ -0,0 +1,165 @@ +import logging + +import numpy as np +import pytest +import torch +from scipy import signal + +import gigaam +from gigaam.utils import AudioDataset + +logging.basicConfig(level=logging.INFO) +logger = logging.getLogger(__name__) + + +def generate_test_audio(duration=3.0, sr=16000): + """Generate synthetic test audio with different characteristics""" + t = np.linspace(0, duration, int(sr * duration)) + audio = ( + 0.5 * np.sin(2 * np.pi * 220 * t) + + 0.3 * np.sin(2 * np.pi * 440 * t) + + 0.2 * np.sin(2 * np.pi * 660 * t) + + 0.1 * np.random.normal(0, 0.1, len(t)) + ) + envelope = signal.windows.tukey(len(audio), alpha=0.1) + return (audio * envelope).astype(np.float32) + + +def create_test_batches(batch_size=4, max_duration=3.0, sr=16000): + """Create test batches with different lengths""" + durations = np.linspace(max_duration * 0.5, max_duration, batch_size) + ds = AudioDataset([generate_test_audio(duration=dr, sr=sr) for dr in durations]) + return ds.collate([ds[i] for i in range(len(ds))]) + + +def custom_forward(model, features, feature_lengths): + """Custom forward pass for batching comparison""" + out_feat, out_lns = [], [] + for i in range(len(features)): + of, ol = model.preprocessor( + features[i : i + 1, : feature_lengths[i]], feature_lengths[i : i + 1] + ) + if model._device.type == "cpu": + of, ol = model.encoder.pre_encode(of.transpose(1, 2), ol) + else: + with torch.autocast(device_type="cuda"): + of, ol = model.encoder.pre_encode(of.transpose(1, 2), ol) + out_feat.append(of.transpose(1, 2)) + out_lns.append(ol.item()) + + features_padded = torch.zeros(len(features), out_feat[0].shape[1], max(out_lns)).to( + features.device + ) + for i in range(len(features)): + features_padded[i, :, : out_lns[i]] = out_feat[i][:, :, : out_lns[i]] + feature_lengths_tensor = torch.tensor(out_lns).to(features.device) + + subs_forward = model.encoder.pre_encode.forward + model.encoder.pre_encode.forward = lambda x, lengths: (x, lengths) + + if model._device.type == "cpu": + enc_out = model.encoder(features_padded, feature_lengths_tensor) + else: + with torch.autocast(device_type=model._device.type, dtype=torch.float16): + enc_out = model.encoder(features_padded, feature_lengths_tensor) + + model.encoder.pre_encode.forward = subs_forward + return enc_out + + +def compare_outputs(output1, output2, atol=0.03): + """Compare two model outputs with tolerance""" + feat1, lens1 = output1 + feat2, lens2 = output2 + assert (lens1 == lens2).all(), f"Length mismatch: {lens1} != {lens2}" + min_len = min(lens1.item(), lens2.item()) + assert ( + feat1.shape[:2] == feat2.shape[:2] + ), f"Shape mismatch: {feat1.shape} vs {feat2.shape}" + + feat1, feat2 = feat1[:, :, :min_len], feat2[:, :, :min_len] + abs_diff = torch.abs(feat1 - feat2).max().item() + close = abs_diff < atol + return close, { + "max_absolute_difference": abs_diff, + } + + +@pytest.mark.parametrize("revision", ["v3_ctc", "v3_e2e_rnnt"]) +@pytest.mark.parametrize("batch_size", [1, 2, 4]) +def test_model_batching(revision, batch_size): + """Test batching correctness for different models and batch sizes""" + torch.manual_seed(0) + model = gigaam.load_model(revision) + model.eval() + device = next(model.parameters()).device + + features, feature_lengths = create_test_batches( + batch_size=batch_size, max_duration=5.0 + ) + features, feature_lengths = features.to(device), feature_lengths.to(device) + + with torch.no_grad(): + batch_output = custom_forward(model, features, feature_lengths) + + # Compare with individual processing + for i in range(batch_size): + single_features = features[i : i + 1][:, : feature_lengths[i]] + single_lengths = feature_lengths[i : i + 1] + + with torch.no_grad(): + single_output = custom_forward(model, single_features, single_lengths) + + if batch_size == 1: + close, metrics = compare_outputs(batch_output, single_output) + else: + batch_element = (batch_output[0][i : i + 1], batch_output[1][i : i + 1]) + close, metrics = compare_outputs(batch_element, single_output) + + assert close, ( + f"Batch inconsistency for sample {i}: " + f"abs_diff={metrics['max_absolute_difference']:.4f}, " + ) + + logger.info(f"Batching test passed: {revision} batch_size={batch_size}") + + +@pytest.mark.parametrize("revision", ["v3_ctc", "v3_e2e_rnnt"]) +def test_batching_edge_cases(revision): + """Test batching with edge cases""" + model = gigaam.load_model(revision) + model.eval() + device = next(model.parameters()).device + + # Test with very short sequences + features = torch.randn(2, 5000).to(device) + feature_lengths = torch.tensor([3200, 5000], dtype=torch.int32).to(device) + + with torch.no_grad(): + output = custom_forward(model, features, feature_lengths) + + assert output[0].shape[0] == 2, "Should handle variable length sequences" + logger.info(f"Edge case test passed: {revision}") + + +@pytest.mark.parametrize("max_duration", [0.5, 1.0]) +def test_different_audio_lengths(max_duration): + """Test batching with different audio durations""" + model = gigaam.load_model("v3_e2e_ctc") + model.eval() + device = next(model.parameters()).device + + features, feature_lengths = create_test_batches( + batch_size=2, max_duration=max_duration + ) + features, feature_lengths = features.to(device), feature_lengths.to(device) + + with torch.no_grad(): + output = custom_forward(model, features, feature_lengths) + + assert output[0].shape[0] == 2, f"Failed for max_duration={max_duration}" + logger.info(f"Audio length test passed: max_duration={max_duration}") + + +if __name__ == "__main__": + pytest.main([__file__, "-v"]) diff --git a/tests/test_loading.py b/tests/test_loading.py new file mode 100644 index 0000000..bdea44f --- /dev/null +++ b/tests/test_loading.py @@ -0,0 +1,91 @@ +import logging +import os + +import pytest + +import gigaam +from gigaam.utils import download_short_audio + +logging.basicConfig(level=logging.INFO) +logger = logging.getLogger(__name__) + +_predictions = { + "emo": { + "angry": 7.70451661082916e-05, + "sad": 0.002205904107540846, + "neutral": 0.9233596324920654, + "positive": 0.07435736805200577, + }, + "asr": "ничьих не требуя похвал счастлив уж я надеждой сладкой что дева с трепетом любви посмотрит может быть украдкой на песни грешные мои у лукоморья дуб зеленый", # noqa: E501 + "v3_e2e_ctc": "Ничьих, не требуя похвал, счастлив уж я надеждой сладкой, Что дева с трепетом любви посмотрит, может быть украдкой На песни грешные мои. У лукоморья дуб зелёный.", # noqa: E501 + "v3_e2e_rnnt": "Ничьих не требуя похвал, Счастлив уж я надеждой сладкой, Что дева с трепетом любви Посмотрит, может быть, украдкой На песни грешные мои. У лукоморья дуб зелёный.", # noqa: E501 +} + + +@pytest.fixture(scope="session") +def test_audio(): + """Provide test audio file for all tests""" + return download_short_audio() + + +def run_model_method(model, revision, test_audio): + if "ssl" in revision: + result = model.embed_audio(test_audio) + assert result is not None, "SSL embedding failed" + logger.info(f"{revision}: SSL embedding completed") + + elif "emo" in revision: + result = model.get_probs(test_audio) + assert all( + abs(result[em] - _predictions["emo"][em]) < 1e-3 for em in result + ), f"Emotion probs failed: {result}" + logger.info(f"{revision}: Emotion probs obtained") + + else: + result = model.transcribe(test_audio) + if "e2e" in revision: + assert ( + _predictions[revision] == result + ), f"Transcription failed ({revision}): {result}" + else: + assert ( + _predictions["asr"] == result + ), f"Transcription failed ({revision}): {result}" + logger.info(f"{revision}: Transcription completed") + + +@pytest.mark.parametrize( + "revision", + [ + "emo", + "v1_ctc", + "v1_rnnt", + "v1_ssl", + "v2_ctc", + "v2_rnnt", + "v2_ssl", + "v3_ctc", + "v3_rnnt", + "v3_e2e_ctc", + "v3_e2e_rnnt", + "v3_ssl", + ], +) +@pytest.mark.full +def test_model_revision_full(revision, test_audio): + """Test specific model revision loads and processes audio (full models only)""" + model = gigaam.load_model(revision) + run_model_method(model, revision, test_audio) + os.remove(os.path.join(gigaam._CACHE_DIR, f"{revision}.ckpt")) + + +@pytest.mark.parametrize("revision", ["emo", "v2_ssl", "v3_ctc", "v3_e2e_rnnt"]) +@pytest.mark.partial +def test_model_revision_partial(revision, test_audio): + """Test specific model revision loads and processes audio (partial models enabled)""" + model = gigaam.load_model(revision) + run_model_method(model, revision, test_audio) + + +if __name__ == "__main__": + pytest.main([__file__, "-v", "-m", "partial"]) diff --git a/tests/test_longform.py b/tests/test_longform.py new file mode 100644 index 0000000..fb35f78 --- /dev/null +++ b/tests/test_longform.py @@ -0,0 +1,219 @@ +import logging +import os +import tempfile +from typing import List, Tuple + +import numpy as np +import pytest +import soundfile as sf +from scipy import signal + +import gigaam +from gigaam.utils import download_long_audio + +logging.basicConfig(level=logging.INFO) +logger = logging.getLogger(__name__) + +_predictions = { + "v3_e2e_rnnt": [ + { + "transcription": "Вечерня отошла давно, Но в кельях тихо и темно; Уже и сам игумен строгий Свои молитвы прекратил И кости ветхие склонил, Перекрестясь на одр убогий. Кругом и сон, и тишина; Но церкви дверь отворена.", # noqa: E501 + "boundaries": (0.0, 16.80471875), + }, + { + "transcription": "Трепещет луч лампады, И тускло озаряет он И тёмную живопись икон, и возглащённые оклады. И раздаётся в тишине То тяжкий вздох, то шёпот важный, И мрачно дремлет в тишине старинный свод.", # noqa: E501 + "boundaries": (17.074718750000002, 32.549093750000004), + }, + { + "transcription": "Глухой и влажный Стоят за клиросом чернец и грешник, Неподвижны оба. И шёпот их — Как глаз из гроба, И грешник бледен, как мертвец — Монах. Несчастный! Полно, перестань!", # noqa: E501 + "boundaries": (32.95409375, 49.305968750000005), + }, + { + "transcription": "Ужасна исповедь злодея, Заплачена тобою дань Тому, Кто в злобе пламенея Лукавого грешника блюдёт И к вечной гибели ведёт. Смирись, опомнись. Время, время. Раскаянье, покров", # noqa: E501 + "boundaries": (49.81221875, 65.65784375), + }, + { + "transcription": "Я разрешу тебя, грехов сложи мучительное бремя.", + "boundaries": (65.94471875, 70.88909375), + }, + ], + "v3_ctc": [ + { + "transcription": "вечерня отошла давно но в кельях тихо и темно уже и сам игумен строгий свои молитвы прекратил и кости ветхие склонил перекрестясь на одр убогий кругом и сон и тишина но церкви дверь отворена", # noqa: E501 + "boundaries": (0.0, 16.80471875), + }, + { + "transcription": "трепещет луч лампады и тускло озаряет он и темную живопись икон и позлащенные оклады и раздается в тишине то тяжкий вздох то шепот важный и мрачно дремлет в вашине старинный свод", # noqa: E501 + "boundaries": (17.074718750000002, 32.549093750000004), + }, + { + "transcription": "глухой и влажный стоят за клиросом чернец и грешник неподвижны оба и шепот их как глаз из гроба и грешник бледен как мертвец монах несчастный полно перестань", # noqa: E501 + "boundaries": (32.95409375, 49.305968750000005), + }, + { + "transcription": "ужасна исповедь злодея заплачена тобою дань тому кто в злобе пламенея лукаво грешника блюдет и к вечной гибели ведет смирись опомнись время время раскаянье покров", # noqa: E501 + "boundaries": (49.81221875, 65.65784375), + }, + { + "transcription": "я разрешу тебя грехов сложи мучительное бремя", + "boundaries": (65.94471875, 70.88909375), + }, + ], +} + + +def generate_long_audio(duration=60.0, sr=16000, include_silence=True): + """Generate long test audio with speech-like segments and silence""" + t = np.linspace(0, duration, int(sr * duration)) + audio = np.zeros_like(t, dtype=np.float32) + segment_durations = list(np.random.uniform(0.2, 5, size=100)) + current_time = 0.0 + + for i, seg_duration in enumerate(segment_durations): + if current_time + seg_duration > duration: + break + seg_t = np.linspace(0, seg_duration, int(sr * seg_duration)) + freq1, freq2, freq3 = 100 + i * 20, 200 + i * 30, 300 + i * 40 + segment = ( + 0.4 * np.sin(2 * np.pi * freq1 * seg_t) + + 0.3 * np.sin(2 * np.pi * freq2 * seg_t) + + 0.2 * np.sin(2 * np.pi * freq3 * seg_t) + + 0.1 * np.random.normal(0, 0.2, len(seg_t)) + ) + envelope = signal.windows.tukey(len(segment), alpha=0.1) + segment = segment * envelope + start_idx, end_idx = int(current_time * sr), int(current_time * sr) + len( + segment + ) + audio[start_idx:end_idx] = segment + if include_silence and i < len(segment_durations) - 1: + current_time += seg_duration + np.random.uniform(0.1, 0.5) + else: + current_time += seg_duration + return audio + + +def validate_segmentation_boundaries( + boundaries: List[Tuple[float, float]], audio_duration: float +): + """Validate segmentation boundaries meet requirements""" + issues = [] + total_duration = 0.0 + + for i, (start, end) in enumerate(boundaries): + duration = end - start + if duration < 0.2: + issues.append(f"Segment {i} too short: {duration:.2f}s") + if duration > 30.0: + issues.append(f"Segment {i} too long: {duration:.2f}s") + if start >= end: + issues.append(f"Segment {i} invalid boundaries: {start:.2f}-{end:.2f}") + total_duration += duration + + if boundaries and boundaries[-1][1] > audio_duration: + issues.append( + f"Last segment exceeds audio: {boundaries[-1][1]:.2f} > {audio_duration:.2f}" + ) + + return { + "valid": len(issues) == 0, + "issues": issues, + "total_segments": len(boundaries), + } + + +@pytest.mark.parametrize("duration", [30.0, 60.0, 120.0]) +def test_segmentation_functionality(duration): + """Test audio segmentation with different durations""" + with tempfile.NamedTemporaryFile(suffix=".wav", delete=False) as f: + try: + audio = generate_long_audio(duration=duration) + sf.write(f.name, audio, 16000) + + from gigaam.vad_utils import segment_audio_file + + segments, boundaries = segment_audio_file(f.name, sr=16000) + + validation = validate_segmentation_boundaries(boundaries, duration) + assert validation[ + "valid" + ], f"Boundary validation failed: {validation['issues']}" + assert len(segments) == len( + boundaries + ), "Segments and boundaries count mismatch" + + logger.info(f"Segmentation: {len(segments)} segments for {duration}s audio") + + finally: + if os.path.exists(f.name): + os.remove(f.name) + + +@pytest.mark.parametrize("revision", ["v3_ctc", "v3_e2e_rnnt"]) +def test_transcribe_longform(revision): + """Test longform transcription for different models""" + model = gigaam.load_model(revision) + results = model.transcribe_longform(download_long_audio()) + ref = _predictions[revision] + + assert isinstance(results, list), "Should return list of segments" + assert len(results) == len(ref), "Distinct results len from reference" + + for segment, ref_segment in zip(results, ref): + assert "transcription" in segment, "Missing transcription key" + assert "boundaries" in segment, "Missing boundaries key" + start, end = segment["boundaries"] + ref_start, ref_end = ref_segment["boundaries"] + assert ( + abs(start - ref_start) < 0.1 and abs(end - ref_end) < 0.1 + ), f"Segments are not close {start, end} and {ref_start, ref_end}" + assert ( + segment["transcription"] == ref_segment["transcription"] + ), f"Different transcription: {segment['transcription']} and {ref_segment['transcription']}" + + +@pytest.mark.parametrize("revision", ["v3_ctc"]) +def test_longform_consistency(revision): + """Test that multiple runs produce consistent results""" + with tempfile.NamedTemporaryFile(suffix=".wav", delete=False) as f: + try: + audio = generate_long_audio(duration=30.0) + sf.write(f.name, audio, 16000) + + model = gigaam.load_model(revision) + results1 = model.transcribe_longform(f.name) + results2 = model.transcribe_longform(f.name) + + assert len(results1) == len(results2), "Inconsistent segment count" + for seg1, seg2 in zip(results1, results2): + assert ( + seg1["boundaries"] == seg2["boundaries"] + ), "Inconsistent boundaries" + + finally: + if os.path.exists(f.name): + os.remove(f.name) + + +def test_segmentation_edge_cases(): + """Test segmentation with edge cases""" + with tempfile.NamedTemporaryFile(suffix=".wav", delete=False) as f: + try: + # Very short audio + audio = generate_long_audio(duration=0.5) + sf.write(f.name, audio, 16000) + + from gigaam.vad_utils import segment_audio_file + + segments, boundaries = segment_audio_file(f.name, sr=16000) + + # Should handle short audio gracefully + assert isinstance(segments, list), "Should return list even for short audio" + + finally: + if os.path.exists(f.name): + os.remove(f.name) + + +if __name__ == "__main__": + pytest.main([__file__, "-v"]) diff --git a/tests/test_onnx.py b/tests/test_onnx.py new file mode 100644 index 0000000..c933a32 --- /dev/null +++ b/tests/test_onnx.py @@ -0,0 +1,49 @@ +import logging +import shutil + +import numpy as np +import pytest + +import gigaam +from gigaam.onnx_utils import infer_onnx, load_onnx +from gigaam.utils import download_short_audio + +logging.basicConfig(level=logging.INFO) +logger = logging.getLogger(__name__) + + +@pytest.fixture(scope="session") +def test_audio(): + """Provide test audio file for all tests""" + return download_short_audio() + + +@pytest.mark.parametrize("revision", ["emo", "v2_ssl", "v3_ctc", "v3_e2e_rnnt"]) +def test_onnx_converting(revision, test_audio): + """Test specific model revision loads and processes audio (partial models enabled)""" + onnx_dir = "test_onnx_tmp" + model = gigaam.load_model(revision, fp16_encoder=False) + model.to_onnx(dir_path=onnx_dir) + sessions, model_cfg = load_onnx(onnx_dir, revision) + result = infer_onnx(test_audio, model_cfg, sessions) + shutil.rmtree(onnx_dir) + + if "ssl" in revision: + orig_embed = model.embed_audio(test_audio)[0].detach().cpu().numpy() + diff = np.abs(orig_embed - result).max() + assert diff < 0.01, f"{revision}: ONNX embed failed with diff {diff}" + + elif "emo" in revision: + orig_probs = model.get_probs(test_audio) + pred_probs = {model.id2name[i]: result[0, i] for i in range(len(model.id2name))} + assert all( + abs(orig_probs[em] - pred_probs[em]) < 1e-3 for em in orig_probs + ), f"{revision}: ONNX emotions probs failed: {pred_probs}" + + else: + orig_text = model.transcribe(test_audio) + assert orig_text == result, f"{revision}: ONNX transcribe failed: {result}" + + +if __name__ == "__main__": + pytest.main([__file__, "-v", "-m", "partial"]) diff --git a/tests/test_reading.py b/tests/test_reading.py new file mode 100644 index 0000000..257f65b --- /dev/null +++ b/tests/test_reading.py @@ -0,0 +1,58 @@ +import logging + +import librosa +import pytest +import torch +from torch.nn.functional import softmax + +import gigaam +from gigaam.preprocess import SAMPLE_RATE +from gigaam.utils import download_short_audio + +logging.basicConfig(level=logging.INFO) +logger = logging.getLogger(__name__) + + +@pytest.fixture(scope="session") +def test_audio(): + """Provide test audio file for all tests""" + return download_short_audio() + + +@pytest.mark.parametrize("revision", ["emo", "v2_ctc", "v3_e2e_rnnt"]) +def test_librosa_loading(revision, test_audio): + """Test the outputs with librosa.load are close to load_audio""" + model = gigaam.load_model(revision) + wav_tns = torch.from_numpy(librosa.load(test_audio, sr=SAMPLE_RATE)[0]) + lengths = torch.full([1], wav_tns.shape[-1], device=model._device) + with torch.no_grad(): + encoded, encoded_len = model( + wav_tns.unsqueeze(0).to(model._device).to(model._dtype), lengths + ) + if "emo" in revision: + orig_probs = model.get_probs(test_audio) + pred_probs = ( + softmax(model.head(encoded.mean(dim=-1)), dim=-1) + .squeeze() + .cpu() + .tolist() + ) + pred_probs = { + model.id2name[i]: pred_probs[i] for i in range(len(model.id2name)) + } + are_close = ( + max(abs(pred_probs[k] - orig_probs[k]) for k in orig_probs) < 1e-3 + ) + assert ( + are_close + ), f"Emotions with librosa failed: {orig_probs} != {pred_probs}" + else: + orig_text = model.transcribe(test_audio) + pred_text = model.decoding.decode(model.head, encoded, encoded_len)[0] + assert ( + orig_text == pred_text + ), f"Transcribe with librosa failed: {orig_text} != {pred_text}" + + +if __name__ == "__main__": + pytest.main([__file__, "-v"]) From 44aa8725ba9c5aaac08ea3b5d3903150240da699 Mon Sep 17 00:00:00 2001 From: Georgy Gospodinov Date: Sat, 22 Nov 2025 18:48:31 +0300 Subject: [PATCH 06/15] fix: hf link --- README.md | 2 +- README_ru.md | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 82135ee..a6a56a7 100644 --- a/README.md +++ b/README.md @@ -5,7 +5,7 @@ [![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](./LICENSE) [![Python 3.10+](https://img.shields.io/badge/python-3.10+-blue.svg)](https://www.python.org/downloads/) [![arXiv](https://img.shields.io/badge/arXiv-2506.01192-b31b1b.svg)](https://arxiv.org/abs/2506.01192) -[![HuggingFace](https://img.shields.io/badge/🤗%20HuggingFace-Models-yellow.svg)](https://huggingface.co/ai-sage/GigaAM) +[![HuggingFace](https://img.shields.io/badge/🤗%20HuggingFace-Models-yellow.svg)](https://huggingface.co/ai-sage/GigaAM-v3) [![Open In Colab](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/github/salute-developers/GigaAM/blob/main/colab_example.ipynb) diff --git a/README_ru.md b/README_ru.md index 5d73f3f..d3006e2 100644 --- a/README_ru.md +++ b/README_ru.md @@ -5,7 +5,7 @@ [![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](./LICENSE) [![Python 3.10+](https://img.shields.io/badge/python-3.10+-blue.svg)](https://www.python.org/downloads/) [![arXiv](https://img.shields.io/badge/arXiv-2506.01192-b31b1b.svg)](https://arxiv.org/abs/2506.01192) -[![HuggingFace](https://img.shields.io/badge/🤗%20HuggingFace-Models-yellow.svg)](https://huggingface.co/ai-sage/GigaAM) +[![HuggingFace](https://img.shields.io/badge/🤗%20HuggingFace-Models-yellow.svg)](https://huggingface.co/ai-sage/GigaAM-v3) [![Open In Colab](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/github/salute-developers/GigaAM/blob/main/colab_example.ipynb) From 1193373c2a5c04b86b299e7b0c7e185911076d43 Mon Sep 17 00:00:00 2001 From: Georgy Gospodinov Date: Thu, 4 Dec 2025 23:31:42 +0300 Subject: [PATCH 07/15] add habr link --- README.md | 1 + README_ru.md | 1 + 2 files changed, 2 insertions(+) diff --git a/README.md b/README.md index a6a56a7..c2b29ac 100644 --- a/README.md +++ b/README.md @@ -177,6 +177,7 @@ If you use GigaAM in your research, please cite our paper: ## Links * [[arxiv] GigaAM: Efficient Self-Supervised Learner for Speech Recognition](https://arxiv.org/abs/2506.01192) +* [[habr] GigaAM-v3: открытая SOTA-модель распознавания речи на русском](https://habr.com/ru/companies/sberdevices/articles/973160/) * [[habr] GigaAM: класс открытых моделей для обработки звучащей речи](https://habr.com/ru/companies/sberdevices/articles/805569) * [[youtube] Как научить LLM слышать: GigaAM 🤝 GigaChat Audio](https://www.youtube.com/watch?v=O7NSH2SAwRc) * [[youtube] GigaAM: Семейство акустических моделей для русского языка](https://youtu.be/PvZuTUnZa2Q?t=26442) diff --git a/README_ru.md b/README_ru.md index d3006e2..eaae27b 100644 --- a/README_ru.md +++ b/README_ru.md @@ -175,6 +175,7 @@ model = AutoModel.from_pretrained("ai-sage/GigaAM-v3", revision="e2e_rnnt", trus ## Ссылки * [[arxiv] GigaAM: Efficient Self-Supervised Learner for Speech Recognition](https://arxiv.org/abs/2506.01192) +* [[habr] GigaAM-v3: открытая SOTA-модель распознавания речи на русском](https://habr.com/ru/companies/sberdevices/articles/973160/) * [[habr] GigaAM: класс открытых моделей для обработки звучащей речи](https://habr.com/ru/companies/sberdevices/articles/805569) * [[youtube] Как научить LLM слышать: GigaAM 🤝 GigaChat Audio](https://www.youtube.com/watch?v=O7NSH2SAwRc) * [[youtube] GigaAM: Семейство акустических моделей для русского языка](https://youtu.be/PvZuTUnZa2Q?t=26442) From 20d0789d6d173af89688e47c4c8e5eacf1538d73 Mon Sep 17 00:00:00 2001 From: Alexander4127 Date: Fri, 5 Dec 2025 11:30:04 +0000 Subject: [PATCH 08/15] Fx: pyannote model loading --- .github/workflows/gigaam.yml | 1 + gigaam/vad_utils.py | 12 +++++++++++- 2 files changed, 12 insertions(+), 1 deletion(-) diff --git a/.github/workflows/gigaam.yml b/.github/workflows/gigaam.yml index 16f4e1e..d5a6069 100644 --- a/.github/workflows/gigaam.yml +++ b/.github/workflows/gigaam.yml @@ -56,6 +56,7 @@ jobs: - name: Install Python dependencies run: | python -m pip install --upgrade pip setuptools wheel + pip install --no-cache-dir torch==2.8.0 torchaudio==2.8.0 --index-url https://download.pytorch.org/whl/cpu pip install --no-cache-dir -e .[longform,tests] - name: Show disk usage after install diff --git a/gigaam/vad_utils.py b/gigaam/vad_utils.py index 53a7c26..2315599 100644 --- a/gigaam/vad_utils.py +++ b/gigaam/vad_utils.py @@ -3,7 +3,9 @@ import torch from pyannote.audio import Model, Pipeline +from pyannote.audio.core.task import Problem, Resolution, Specifications from pyannote.audio.pipelines import VoiceActivityDetection +from torch.torch_version import TorchVersion from .preprocess import load_audio @@ -25,7 +27,15 @@ def get_pipeline(device: torch.device) -> Pipeline: except KeyError as exc: raise ValueError("HF_TOKEN environment variable is not set") from exc - model = Model.from_pretrained("pyannote/segmentation-3.0", token=hf_token) + with torch.serialization.safe_globals( + [ + TorchVersion, + Problem, + Specifications, + Resolution, + ] + ): + model = Model.from_pretrained("pyannote/segmentation-3.0", token=hf_token) _PIPELINE = VoiceActivityDetection(segmentation=model) _PIPELINE.instantiate({"min_duration_on": 0.0, "min_duration_off": 0.0}) From 410802e20dd28bf28877d236e9ab5460ffe7bb35 Mon Sep 17 00:00:00 2001 From: Alexander4127 Date: Fri, 26 Dec 2025 11:01:48 +0000 Subject: [PATCH 09/15] Fx: hf model caching --- gigaam/vad_utils.py | 59 ++++++++++++++++++++++++++++++++++++--------- 1 file changed, 47 insertions(+), 12 deletions(-) diff --git a/gigaam/vad_utils.py b/gigaam/vad_utils.py index 2315599..5d6219f 100644 --- a/gigaam/vad_utils.py +++ b/gigaam/vad_utils.py @@ -2,6 +2,8 @@ from typing import List, Tuple import torch +from huggingface_hub import snapshot_download +from huggingface_hub.errors import LocalEntryNotFoundError from pyannote.audio import Model, Pipeline from pyannote.audio.core.task import Problem, Resolution, Specifications from pyannote.audio.pipelines import VoiceActivityDetection @@ -12,20 +14,37 @@ _PIPELINE = None -def get_pipeline(device: torch.device) -> Pipeline: +def resolve_local_segmentation_path(model_id: str) -> str: """ - Retrieves a PyAnnote voice activity detection pipeline and move it to the specified device. - The pipeline is loaded only once and reused across subsequent calls. - It requires the Hugging Face API token to be set in the HF_TOKEN environment variable. + Finds the local path to the segmentation model. """ - global _PIPELINE - if _PIPELINE is not None: - return _PIPELINE.to(device) - try: - hf_token = os.environ["HF_TOKEN"] - except KeyError as exc: - raise ValueError("HF_TOKEN environment variable is not set") from exc + return snapshot_download( + repo_id=model_id, + local_files_only=True, + ) + except LocalEntryNotFoundError: + pass + + hf_token = os.getenv("HF_TOKEN") + if not hf_token: + raise RuntimeError( + f"Model {model_id} was not found locally, " + f"and no HF_TOKEN was provided to download it." + ) + + return snapshot_download( + repo_id=model_id, + token=hf_token, + ) + + +def load_segmentation_model(model_id: str) -> Model: + """ + Loads the segmentation model from a local snapshot. + If it doesn’t exist, it first creates (downloads) the snapshot. + """ + local_path = resolve_local_segmentation_path(model_id=model_id) with torch.serialization.safe_globals( [ @@ -35,7 +54,23 @@ def get_pipeline(device: torch.device) -> Pipeline: Resolution, ] ): - model = Model.from_pretrained("pyannote/segmentation-3.0", token=hf_token) + return Model.from_pretrained(local_path) + + +def get_pipeline( + device: torch.device, model_id: str = "pyannote/segmentation-3.0" +) -> Pipeline: + """ + Retrieves a PyAnnote voice activity detection pipeline and moves it to the specified device. + The pipeline is loaded only once and reused across subsequent calls. + It requires the Hugging Face API token to be set in the HF_TOKEN environment variable. + """ + global _PIPELINE + if _PIPELINE is not None: + return _PIPELINE.to(device) + + model = load_segmentation_model(model_id=model_id) + _PIPELINE = VoiceActivityDetection(segmentation=model) _PIPELINE.instantiate({"min_duration_on": 0.0, "min_duration_off": 0.0}) From fb13e840477ceadf37c2697e832ad112fa5c5dca Mon Sep 17 00:00:00 2001 From: Alexander4127 Date: Thu, 12 Feb 2026 21:52:36 +0300 Subject: [PATCH 10/15] Mv to pyproject.toml, rm setup & reqs --- .github/workflows/gigaam.yml | 4 +-- pyproject.toml | 48 ++++++++++++++++++++++++++++++++++++ requirements.txt | 9 ------- setup.py | 28 --------------------- 4 files changed, 50 insertions(+), 39 deletions(-) create mode 100644 pyproject.toml delete mode 100644 requirements.txt delete mode 100644 setup.py diff --git a/.github/workflows/gigaam.yml b/.github/workflows/gigaam.yml index d5a6069..a2c02cb 100644 --- a/.github/workflows/gigaam.yml +++ b/.github/workflows/gigaam.yml @@ -45,7 +45,7 @@ jobs: uses: actions/cache@v4 with: path: ~/.cache/pip - key: ${{ runner.os }}-pip-${{ matrix.python-version }}-${{ hashFiles('requirements.txt', 'setup.py') }} + key: ${{ runner.os }}-pip-${{ matrix.python-version }}-${{ hashFiles('pyproject.toml') }} restore-keys: | ${{ runner.os }}-pip-${{ matrix.python-version }}- ${{ runner.os }}-pip- @@ -119,7 +119,7 @@ jobs: uses: actions/cache@v4 with: path: ~/.cache/pip - key: ${{ runner.os }}-pip-lint-${{ hashFiles('requirements.txt') }} + key: ${{ runner.os }}-pip-lint-${{ hashFiles('pyproject.toml') }} restore-keys: | ${{ runner.os }}-pip-lint- diff --git a/pyproject.toml b/pyproject.toml new file mode 100644 index 0000000..37eaa3e --- /dev/null +++ b/pyproject.toml @@ -0,0 +1,48 @@ +[build-system] +requires = ["setuptools>=68.0", "wheel"] +build-backend = "setuptools.build_meta" + +[project] +name = "gigaam" +version = "0.1.0" +description = "GigaAM: A package for audio modeling and ASR." +readme = "README.md" +license = "MIT" +requires-python = ">=3.10" +authors = [ + { name = "GigaChat Team" }, +] + +dependencies = [ + "hydra-core==1.3.*", + "numpy==2.*", + "omegaconf==2.3.*", + "onnx==1.19.*", + "onnxruntime==1.23.*", + "sentencepiece", + "torch>=2.5,<2.9", + "torchaudio>=2.5,<2.9", + "tqdm", +] + +[project.optional-dependencies] +longform = [ + "torch==2.8.*", + "torchaudio==2.8.*", + "pyannote.audio==4.0", + "torchcodec==0.7", + "numba>=0.62", +] +tests = [ + "pytest", + "pytest-cov", + "scipy", + "soundfile", + "librosa", +] + +[project.urls] +Homepage = "https://github.com/salute-developers/GigaAM/" + +[tool.setuptools.packages.find] +include = ["gigaam"] diff --git a/requirements.txt b/requirements.txt deleted file mode 100644 index 3dbb658..0000000 --- a/requirements.txt +++ /dev/null @@ -1,9 +0,0 @@ -hydra-core==1.3.* -numpy==2.* -omegaconf==2.3.* -onnx==1.19.* -onnxruntime==1.23.* -sentencepiece -torch>=2.5,<2.9 -torchaudio>=2.5,<2.9 -tqdm \ No newline at end of file diff --git a/setup.py b/setup.py deleted file mode 100644 index fc59fd4..0000000 --- a/setup.py +++ /dev/null @@ -1,28 +0,0 @@ -import pkg_resources -from setuptools import find_packages, setup - -setup( - name="gigaam", - py_modules=["gigaam"], - version="0.1.0", - description="GigaAM: A package for audio modeling and ASR.", - long_description=open("README.md", "r", encoding="utf-8").read(), - long_description_content_type="text/markdown", - readme="README.md", - author="GigaChat Team", - url="https://github.com/salute-developers/GigaAM/", - license="MIT", - packages=find_packages(include=["gigaam"]), - python_requires=">=3.10", - install_requires=[ - str(r) - for r in pkg_resources.parse_requirements( - open("requirements.txt", "r", encoding="utf-8").read() - ) - ], - extras_require={ - "longform": ["torch==2.8.*", "torchaudio==2.8.*", "pyannote.audio==4.0", "torchcodec==0.7", "numba>=0.62"], - "tests": ["pytest", "pytest-cov", "scipy", "soundfile", "librosa"], - }, - include_package_data=True, -) From 8eaf3c44742eaa63008716b2ffe12774f49ada4a Mon Sep 17 00:00:00 2001 From: Alexander4127 Date: Thu, 12 Feb 2026 22:18:24 +0300 Subject: [PATCH 11/15] Add quotes --- .github/workflows/gigaam.yml | 2 +- README.md | 6 +++--- README_ru.md | 6 +++--- 3 files changed, 7 insertions(+), 7 deletions(-) diff --git a/.github/workflows/gigaam.yml b/.github/workflows/gigaam.yml index a2c02cb..79d88a1 100644 --- a/.github/workflows/gigaam.yml +++ b/.github/workflows/gigaam.yml @@ -57,7 +57,7 @@ jobs: run: | python -m pip install --upgrade pip setuptools wheel pip install --no-cache-dir torch==2.8.0 torchaudio==2.8.0 --index-url https://download.pytorch.org/whl/cpu - pip install --no-cache-dir -e .[longform,tests] + pip install --no-cache-dir -e ".[longform,tests]" - name: Show disk usage after install run: df -h diff --git a/README.md b/README.md index c2b29ac..509abd6 100644 --- a/README.md +++ b/README.md @@ -40,7 +40,7 @@ cd GigaAM pip install -e . # (optionally) Verify the installation: -pip install -e .[tests] +pip install -e ".[tests]" pytest -v tests/test_loading.py -m partial # or `-m full` to test all models ``` @@ -79,9 +79,9 @@ For detailed results, see [here](./evaluation.md). * Accept the conditions to access [pyannote/segmentation-3.0](https://huggingface.co/pyannote/segmentation-3.0) files and content ```bash -pip install -e .[longform] +pip install -e ".[longform]" # optionally run longform testing -pip install -e .[tests] +pip install -e ".[tests]" HF_TOKEN= pytest -v tests/test_longform.py ``` diff --git a/README_ru.md b/README_ru.md index eaae27b..3d458af 100644 --- a/README_ru.md +++ b/README_ru.md @@ -39,7 +39,7 @@ cd GigaAM pip install -e . # (опционально) Проверить установку: -pip install -e .[tests] +pip install -e ".[tests]" pytest -v tests/test_loading.py -m partial # или `-m full` для тестирования всех моделей ``` @@ -78,9 +78,9 @@ GigaAM - фундаментальная акустическая модель н * Примите условия для получения доступа к контенту [pyannote/segmentation-3.0](https://huggingface.co/pyannote/segmentation-3.0) ```bash -pip install -e .[longform] +pip install -e ".[longform]" # опционально: запустить тесты для длинной транскрибации -pip install -e .[tests] +pip install -e ".[tests]" HF_TOKEN=<ваш hf токен> pytest -v tests/test_longform.py ``` From b94ee2c40c95f7b51622a7f21cd06125361dd5b7 Mon Sep 17 00:00:00 2001 From: Aleksandr Bobrov Date: Fri, 13 Mar 2026 10:22:23 +0500 Subject: [PATCH 12/15] feat: GigaAM v3 CTC inference on Apple Silicon via MLX MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Add native MLX (Apple Silicon) inference for GigaAM v3 CTC model: - Full Conformer encoder (16 layers, 768d) with RoPE attention - Conv1d subsampling, GLU convolution module, SiLU FFN - CTC greedy decoding with proper blank/repeat collapsing - Log-mel spectrogram computed in MLX (exact match to PyTorch) - PyTorch → MLX weight conversion script (safetensors + config.json) - Streaming transcription (growing buffer, live mic + file) - CLI tools: gigaam-cli, gigaam-stream, gigaam-transcribe - Python API: load_model, transcribe, stream_generate, stream_live - mlx-audio ecosystem compatible (StreamingResult contract) Performance on Apple M4: - 139x realtime (11s audio in 81ms) - 57ms/step streaming latency - fp16 weights: 421 MB New files in mlx_convert/: gigaam_mlx.py — MLX model + inference + streaming convert_gigaam_to_mlx.py — PyTorch → MLX conversion gigaam-cli — single-file transcription CLI gigaam-stream — real-time streaming CLI gigaam-transcribe — shell wrapper README.md — documentation, API, benchmarks --- .gitignore | 8 +- mlx_convert/README.md | 377 ++++++++++++++++ mlx_convert/convert_gigaam_to_mlx.py | 204 +++++++++ mlx_convert/gigaam-cli | 66 +++ mlx_convert/gigaam-stream | 204 +++++++++ mlx_convert/gigaam-transcribe | 15 + mlx_convert/gigaam_mlx.py | 647 +++++++++++++++++++++++++++ 7 files changed, 1520 insertions(+), 1 deletion(-) create mode 100644 mlx_convert/README.md create mode 100644 mlx_convert/convert_gigaam_to_mlx.py create mode 100755 mlx_convert/gigaam-cli create mode 100755 mlx_convert/gigaam-stream create mode 100755 mlx_convert/gigaam-transcribe create mode 100644 mlx_convert/gigaam_mlx.py diff --git a/.gitignore b/.gitignore index 4775fdd..fc65e15 100644 --- a/.gitignore +++ b/.gitignore @@ -4,4 +4,10 @@ build *.wav .DS_Store *tmp* -onnx \ No newline at end of file +onnx +.venv +mlx_convert/.venv +mlx_convert/gigaam-v3-ctc-mlx/ +mlx_convert/gigaam-v3-ctc-mlx-fp32/ +mlx_convert/ggml-small.bin +mlx_convert/debug_*.py \ No newline at end of file diff --git a/mlx_convert/README.md b/mlx_convert/README.md new file mode 100644 index 0000000..37a8a78 --- /dev/null +++ b/mlx_convert/README.md @@ -0,0 +1,377 @@ +# GigaAM v3 MLX — Russian ASR on Apple Silicon + +GigaAM v3 CTC (Conformer encoder, 16 layers, 768d) converted to [MLX](https://github.com/ml-explore/mlx) for fast inference on Apple Silicon. + +**139x realtime** on M4 — transcribes 11 seconds of Russian speech in 81ms. + +## Quick Start + +### 1. Install dependencies + +```bash +uv venv .venv +uv pip install mlx safetensors numpy +# For streaming from microphone: +uv pip install sounddevice +``` + +### 2. Convert the model (one-time) + +```bash +# Downloads GigaAM v3 CTC from HuggingFace and converts to MLX safetensors +python convert_gigaam_to_mlx.py --model v3_ctc --output ./gigaam-v3-ctc-mlx + +# Optional: fp32 version +python convert_gigaam_to_mlx.py --model v3_ctc --output ./gigaam-v3-ctc-mlx-fp32 --dtype float32 +``` + +This creates a directory with: +- `model.safetensors` — weights (421 MB fp16, 842 MB fp32) +- `config.json` — model configuration + vocabulary + +### 3. Transcribe + +```bash +# Single file +python gigaam-cli -f audio.wav + +# Streaming from file +python gigaam-stream --file audio.wav + +# Live microphone streaming +python gigaam-stream +``` + +--- + +## Python API + +### Basic transcription + +```python +from gigaam_mlx import load_model, load_audio + +model = load_model("./gigaam-v3-ctc-mlx") +audio = load_audio("audio.wav") # any format, resampled to 16kHz via ffmpeg +text = model.transcribe(audio) +print(text) +# → ничьих не требуя похвал счастлив уж я надеждой сладкой +``` + +### Streaming (pre-recorded file) + +Process audio incrementally, yielding results every N seconds: + +```python +from gigaam_mlx import load_model, load_audio, StreamingConfig + +model = load_model("./gigaam-v3-ctc-mlx") +audio = load_audio("audio.wav") + +config = StreamingConfig(step_duration=1.0) # yield every 1s + +for result in model.stream_generate(audio, config): + print(f"[{result.audio_position:.1f}s] {result.cumulative_text}") + # [1.0s] ничьих не требуя + # [2.0s] ничьих не требуя похвал + # [3.0s] ничьих не требуя похвал счастлив уж я надеж + # ... +``` + +`StreamingResult` fields: + +| Field | Type | Description | +|-------|------|-------------| +| `text` | `str` | New text since last emission | +| `cumulative_text` | `str` | Full transcription so far | +| `is_final` | `bool` | `True` if last chunk | +| `audio_position` | `float` | Current position in seconds | +| `audio_duration` | `float` | Total audio duration | +| `progress` | `float` | 0.0–1.0 | +| `language` | `str` | Always `"ru"` | + +### Streaming (live microphone) + +For real-time transcription, call `stream_live()` with a growing audio buffer: + +```python +import numpy as np +import mlx.core as mx +from gigaam_mlx import load_model + +model = load_model("./gigaam-v3-ctc-mlx") + +# Accumulate audio from microphone (16kHz float32 mono) +buffer = np.zeros(0, dtype=np.float32) + +# Called every N ms with new audio +def on_audio_chunk(chunk: np.ndarray): + global buffer + buffer = np.concatenate([buffer, chunk]) + + result = model.stream_live(mx.array(buffer)) + print(f"\r{result.cumulative_text}", end="", flush=True) +``` + +### StreamingConfig options + +```python +from gigaam_mlx import StreamingConfig + +config = StreamingConfig( + step_duration=1.0, # process every 1s (default: 2s) + chunk_duration=2.0, # unused for stream_generate (kept for compat) + context_duration=3.0, # unused for stream_generate (kept for compat) +) +``` + +--- + +## mlx-audio Integration + +GigaAM MLX is designed to be compatible with the [mlx-audio](https://github.com/Blaizzy/mlx-audio) ecosystem. + +### Using with mlx-audio's generate interface + +The `StreamingResult` dataclass follows the same contract as mlx-audio's Parakeet and Whisper streaming: + +```python +# mlx-audio style usage +for result in model.stream_generate(audio, config): + if result.is_final: + print(f"Final: {result.cumulative_text}") + else: + print(f"[{result.progress:.0%}] {result.text}") +``` + +### Adding GigaAM to mlx-audio as a model + +To register GigaAM as an mlx-audio STT model, create the following structure in `mlx_audio/stt/models/gigaam/`: + +``` +mlx_audio/stt/models/gigaam/ +├── __init__.py # exports Model, ModelConfig +├── gigaam.py # Model class with generate() method +├── conformer.py # ConformerEncoder, layers +├── audio.py # log_mel_spectrogram +└── README.md +``` + +**`__init__.py`:** + +```python +from .gigaam import Model, ModelConfig +``` + +**`gigaam.py`** (key parts): + +```python +import mlx.core as mx +import mlx.nn as nn +from dataclasses import dataclass +from typing import Optional, Union, Generator +from pathlib import Path + +from mlx_audio.stt.models.base import STTOutput + + +@dataclass +class ModelConfig: + """Wraps GigaAM config.json.""" + def __init__(self, config: dict): + self._config = config + + @classmethod + def from_dict(cls, config: dict) -> "ModelConfig": + return cls(config) + + +class Model(nn.Module): + def __init__(self, config: ModelConfig): + super().__init__() + cfg = config._config + # ... build ConformerEncoder + CTCHead from cfg ... + self.sample_rate = cfg.get("sample_rate", 16000) + self.vocabulary = cfg.get("vocabulary", []) + + def generate( + self, + audio: Union[str, Path, mx.array], + *, + stream: bool = False, + verbose: bool = False, + **kwargs, + ) -> Union[STTOutput, Generator]: + """mlx-audio compatible generate interface.""" + from mlx_audio.stt.utils import load_audio + + if isinstance(audio, (str, Path)): + audio = load_audio(str(audio), self.sample_rate) + + if stream: + return self._stream_generate(audio, **kwargs) + + text = self._transcribe(audio) + + return STTOutput( + text=text, + segments=[{"text": text, "start": 0.0, "end": len(audio) / self.sample_rate}], + language="ru", + ) + + def _transcribe(self, audio: mx.array) -> str: + """CTC forward + greedy decode.""" + # ... mel → encoder → ctc_head → argmax → collapse ... + pass + + def _stream_generate(self, audio, **kwargs): + """Yields StreamingResult compatible with mlx-audio.""" + # ... growing buffer approach ... + pass +``` + +Then register in `mlx_audio/stt/models/__init__.py`: + +```python +from . import gigaam # add this line +``` + +And in `mlx_audio/stt/utils.py` add the remapping: + +```python +MODEL_REMAPPING = { + # ... existing entries ... + "gigaam": "gigaam", +} +``` + +The model will then work with: + +```python +from mlx_audio.stt.utils import load_model + +model = load_model("path/to/gigaam-v3-ctc-mlx") # or HuggingFace repo +result = model.generate("audio.wav") +print(result.text) + +# Streaming +for chunk in model.generate("audio.wav", stream=True): + print(chunk.text, end="", flush=True) +``` + +### HuggingFace model card + +To upload to HuggingFace for `load_model("your-name/gigaam-v3-ctc-mlx")`: + +``` +gigaam-v3-ctc-mlx/ +├── config.json # must include "model_type": "gigaam" +├── model.safetensors # 421 MB (fp16) +└── README.md # model card +``` + +The `config.json` already has `"model_type": "gigaam"` so mlx-audio's auto-detection will route to the correct model class. + +--- + +## CLI Tools + +### `gigaam-cli` — Single-file transcription + +```bash +python gigaam-cli -f audio.wav # default model +python gigaam-cli -f audio.wav -m /path/to/model # custom model path +python gigaam-cli -f audio.wav --no-prints # only text to stdout +``` + +### `gigaam-stream` — Real-time streaming + +```bash +# Live microphone +python gigaam-stream +python gigaam-stream --step 1000 # update every 1s +python gigaam-stream --step 500 # update every 0.5s + +# File streaming (simulates real-time) +python gigaam-stream --file audio.wav +python gigaam-stream --file audio.wav --step 1000 --no-overwrite +``` + +Options: + +| Flag | Default | Description | +|------|---------|-------------| +| `--step N` | 2000 | Process every N ms | +| `--file PATH` | — | File mode instead of microphone | +| `--model PATH` | auto | Model directory | +| `--no-overwrite` | off | Print incrementally (don't clear line) | +| `--vad-threshold` | 0.003 | Energy threshold for speech detection | + +### `gigaam-transcribe` — Shell wrapper + +```bash +# Uses bundled Python venv automatically +gigaam-transcribe -f audio.wav --no-prints + +# Symlink for PATH access +ln -s /path/to/mlx_convert/gigaam-transcribe /usr/local/bin/gigaam-transcribe +``` + +--- + +## OpenWispr Integration + +GigaAM can be used as a transcription engine in [OpenWispr](https://github.com/nicklama/open-wispr) (push-to-talk macOS app): + +```bash +# Switch to GigaAM engine +open-wispr set-engine gigaam +open-wispr status +# Engine: gigaam +# GigaAM: ready +``` + +Or in `~/.config/open-wispr/config.json`: + +```json +{ + "engine": "gigaam", + "language": "ru" +} +``` + +--- + +## Benchmarks (Apple M4) + +| | GigaAM MLX (fp16) | GigaAM PyTorch | Whisper CPP (small) | +|--|---|---|---| +| **Batch (11s audio)** | **81ms** | 400ms | 1130ms | +| **Realtime factor** | **139x** | 28x | 10x | +| **Stream (1s step)** | **57ms/step** | — | ~300ms/step | +| **Model size** | 421 MB | 842 MB | 465 MB | +| **Language** | Russian | Russian | Multilingual | + +## Architecture + +``` +Audio (16kHz) → Log-Mel Spectrogram (64 bins) + → Conv1d Subsampling (4x stride) + → 16× Conformer Layers: + ├─ FFN₁ (half-step residual) + ├─ RoPE Multi-Head Self-Attention (16 heads) + ├─ Convolution Module (GLU + depthwise conv) + └─ FFN₂ (half-step residual) + → CTC Head (Conv1d → 35 classes) + → Greedy Decode (collapse repeated + remove blanks) +``` + +Key implementation details: +- **RoPE before projections**: GigaAM applies rotary embeddings to raw input *before* Q/K/V linear projections (non-standard) +- **Exact mel filterbank**: Saved from PyTorch to avoid HTK recomputation differences +- **All Conv1d weights transposed**: `[out, in, K]` → `[out, K, in]` for MLX convention + +## License + +GigaAM model weights: [ai-sage/GigaAM](https://huggingface.co/ai-sage/GigaAM) — check their license. +MLX conversion code: MIT. diff --git a/mlx_convert/convert_gigaam_to_mlx.py b/mlx_convert/convert_gigaam_to_mlx.py new file mode 100644 index 0000000..198d0fe --- /dev/null +++ b/mlx_convert/convert_gigaam_to_mlx.py @@ -0,0 +1,204 @@ +""" +Convert GigaAM v3 PyTorch checkpoint to MLX safetensors format. + +Handles weight shape transpositions required by MLX conventions: +- PyTorch Conv1d: [out_ch, in_ch, kernel] → MLX Conv1d: [out_ch, kernel, in_ch] +- PyTorch Linear: same (no change needed, MLX nn.Linear uses same layout) +- BatchNorm running stats need special handling + +Usage: + python convert_gigaam_to_mlx.py --model v3_ctc --output ./gigaam-v3-ctc-mlx +""" +import argparse +import json +import os +import sys + +sys.path.insert(0, "..") + +import numpy as np +import torch +from safetensors.numpy import save_file + +VOCABULARY_V3 = [ + " ", "а", "б", "в", "г", "д", "е", "ж", "з", "и", "й", "к", "л", "м", + "н", "о", "п", "р", "с", "т", "у", "ф", "х", "ц", "ч", "ш", "щ", "ъ", + "ы", "ь", "э", "ю", "я" +] + + +def transpose_conv1d_weight(w: np.ndarray) -> np.ndarray: + """PyTorch Conv1d: [out, in, kernel] → MLX Conv1d: [out, kernel, in]""" + return np.transpose(w, (0, 2, 1)) + + +def sanitize_weights(state_dict: dict) -> dict: + """ + Convert PyTorch state_dict to MLX-compatible weight dict. + + Key transformations: + 1. Conv1d weights: transpose [out, in, K] → [out, K, in] + 2. Skip preprocessor (mel filterbank computed at runtime in MLX) + 3. Handle LayerNorm batch_norm naming + """ + mlx_weights = {} + + skipped = [] + for key, tensor in state_dict.items(): + w = tensor.detach().cpu().float().numpy() + + # Keep preprocessor mel filterbank and window for exact reproduction + if key == "preprocessor.featurizer.0.mel_scale.fb": + mlx_weights["mel_filterbank"] = w # [n_fft//2+1, n_mels] + skipped.append(key + " → mel_filterbank") + continue + if key == "preprocessor.featurizer.0.spectrogram.window": + mlx_weights["stft_window"] = w # [win_length] + skipped.append(key + " → stft_window") + continue + if key.startswith("preprocessor."): + skipped.append(key) + continue + + # ALL 3D weights are Conv1d weights and need transposition + # PyTorch Conv1d: [out, in, kernel] → MLX Conv1d: [out, kernel, in] + # This covers: encoder.pre_encode.conv.*, encoder.layers.*.conv.*, head.decoder_layers.* + if "weight" in key and len(w.shape) == 3: + w = transpose_conv1d_weight(w) + + # BatchNorm / LayerNorm: + # GigaAM v3 uses layer_norm for conv_norm_type, so batch_norm is actually LayerNorm + # The keys already use "batch_norm" name but the module is nn.LayerNorm + # In MLX, this maps to nn.LayerNorm with weight/bias — same key structure works + + mlx_weights[key] = w + + if skipped: + print(f"Skipped {len(skipped)} preprocessor keys: {skipped}") + + return mlx_weights + + +def build_config(model_name: str, cfg) -> dict: + """Build config.json for the MLX model.""" + from omegaconf import OmegaConf + cfg_dict = OmegaConf.to_container(cfg, resolve=True) + + config = { + "model_type": "gigaam", + "model_name": model_name, + "sample_rate": cfg_dict.get("sample_rate", 16000), + "preprocessor": { + "sample_rate": cfg_dict["preprocessor"].get("sample_rate", 16000), + "features": cfg_dict["preprocessor"].get("features", 64), + "win_length": cfg_dict["preprocessor"].get("win_length", 320), + "hop_length": cfg_dict["preprocessor"].get("hop_length", 160), + "n_fft": cfg_dict["preprocessor"].get("n_fft", 320), + "center": cfg_dict["preprocessor"].get("center", False), + }, + "encoder": { + "feat_in": cfg_dict["encoder"].get("feat_in", 64), + "n_layers": cfg_dict["encoder"].get("n_layers", 16), + "d_model": cfg_dict["encoder"].get("d_model", 768), + "subsampling": cfg_dict["encoder"].get("subsampling", "conv1d"), + "subs_kernel_size": cfg_dict["encoder"].get("subs_kernel_size", 5), + "subsampling_factor": cfg_dict["encoder"].get("subsampling_factor", 4), + "ff_expansion_factor": cfg_dict["encoder"].get("ff_expansion_factor", 4), + "self_attention_model": cfg_dict["encoder"].get("self_attention_model", "rotary"), + "pos_emb_max_len": cfg_dict["encoder"].get("pos_emb_max_len", 5000), + "n_heads": cfg_dict["encoder"].get("n_heads", 16), + "conv_kernel_size": cfg_dict["encoder"].get("conv_kernel_size", 5), + "conv_norm_type": cfg_dict["encoder"].get("conv_norm_type", "layer_norm"), + }, + } + + # Model-specific head config + if "ctc" in model_name: + config["head_type"] = "ctc" + config["head"] = { + "feat_in": cfg_dict["head"].get("feat_in", 768), + "num_classes": cfg_dict["head"].get("num_classes", 34), + } + config["vocabulary"] = cfg_dict["decoding"].get("vocabulary", VOCABULARY_V3) + elif "rnnt" in model_name: + config["head_type"] = "rnnt" + config["head"] = { + "decoder": cfg_dict["head"]["decoder"], + "joint": cfg_dict["head"]["joint"], + } + # RNNT uses tokenizer + config["tokenizer_model"] = "tokenizer.model" + + return config + + +def main(): + parser = argparse.ArgumentParser(description="Convert GigaAM to MLX format") + parser.add_argument("--model", type=str, default="v3_ctc", + help="Model name: v3_ctc, v3_rnnt, v3_e2e_ctc, v3_e2e_rnnt, v3_ssl") + parser.add_argument("--output", type=str, default="./gigaam-v3-ctc-mlx", + help="Output directory") + parser.add_argument("--dtype", type=str, default="float16", + choices=["float16", "bfloat16", "float32"], + help="Output dtype") + args = parser.parse_args() + + print(f"Loading GigaAM model: {args.model}") + import gigaam + model = gigaam.load_model(args.model, device="cpu", fp16_encoder=False, use_flash=False) + + print("Extracting state dict...") + state_dict = model.state_dict() + print(f" Total PyTorch keys: {len(state_dict)}") + print(f" Total parameters: {sum(p.numel() for p in model.parameters()):,}") + + print("Sanitizing weights for MLX...") + mlx_weights = sanitize_weights(state_dict) + print(f" Total MLX keys: {len(mlx_weights)}") + + # Convert dtype + np_dtype = { + "float16": np.float16, + "bfloat16": np.float16, # safetensors doesn't support bf16 natively in numpy + "float32": np.float32, + }[args.dtype] + + mlx_weights = {k: v.astype(np_dtype) for k, v in mlx_weights.items()} + + # Build config + print("Building config.json...") + config = build_config(args.model, model.cfg) + + # Save + os.makedirs(args.output, exist_ok=True) + + safetensors_path = os.path.join(args.output, "model.safetensors") + print(f"Saving weights to {safetensors_path}...") + save_file(mlx_weights, safetensors_path) + + config_path = os.path.join(args.output, "config.json") + print(f"Saving config to {config_path}...") + with open(config_path, "w") as f: + json.dump(config, f, indent=2, ensure_ascii=False) + + # Copy tokenizer if rnnt + if "rnnt" in args.model: + import shutil + tokenizer_src = os.path.join(os.path.expanduser("~/.cache/gigaam"), + f"{args.model}_tokenizer.model") + if os.path.exists(tokenizer_src): + tokenizer_dst = os.path.join(args.output, "tokenizer.model") + shutil.copy2(tokenizer_src, tokenizer_dst) + print(f"Copied tokenizer to {tokenizer_dst}") + + # Summary + total_bytes = os.path.getsize(safetensors_path) + print(f"\n✅ Conversion complete!") + print(f" Output: {args.output}") + print(f" Weights: {total_bytes / 1024 / 1024:.1f} MB ({args.dtype})") + print(f" Keys: {len(mlx_weights)}") + print(f" Config: {config_path}") + + +if __name__ == "__main__": + main() diff --git a/mlx_convert/gigaam-cli b/mlx_convert/gigaam-cli new file mode 100755 index 0000000..ffffc98 --- /dev/null +++ b/mlx_convert/gigaam-cli @@ -0,0 +1,66 @@ +#!/usr/bin/env python3 +""" +gigaam-cli — GigaAM v3 CTC transcription CLI for MLX. + +Drop-in companion for whisper-cli. Used by OpenWispr. + +Usage: + gigaam-cli -f audio.wav [-m /path/to/model_dir] + gigaam-cli --help +""" +import argparse +import os +import sys +import time + +# Resolve default model dir relative to this script +SCRIPT_DIR = os.path.dirname(os.path.abspath(__file__)) +DEFAULT_MODEL = os.path.join(SCRIPT_DIR, "gigaam-v3-ctc-mlx") + + +def main(): + parser = argparse.ArgumentParser(description="GigaAM v3 CTC transcription (MLX)") + parser.add_argument("-f", "--file", required=True, help="Audio file path") + parser.add_argument("-m", "--model", default=DEFAULT_MODEL, help="Model directory") + parser.add_argument("-l", "--language", default="ru", help="Language (ignored, always ru)") + parser.add_argument("-nt", "--no-timestamps", action="store_true", help="(compat flag, ignored)") + parser.add_argument("--no-prints", action="store_true", help="Suppress info messages") + args = parser.parse_args() + + if not os.path.isfile(args.file): + print(f"Error: file not found: {args.file}", file=sys.stderr) + sys.exit(1) + + if not os.path.isdir(args.model): + print(f"Error: model dir not found: {args.model}", file=sys.stderr) + sys.exit(1) + + # Add script directory to path so gigaam_mlx can be imported + sys.path.insert(0, SCRIPT_DIR) + from gigaam_mlx import load_model, load_audio + + if not args.no_prints: + print(f"gigaam-cli: loading model from {args.model}", file=sys.stderr) + + t0 = time.time() + model = load_model(args.model) + load_time = time.time() - t0 + + if not args.no_prints: + print(f"gigaam-cli: model loaded in {load_time:.2f}s", file=sys.stderr) + + audio = load_audio(args.file) + + t0 = time.time() + text = model.transcribe(audio) + transcribe_time = time.time() - t0 + + if not args.no_prints: + print(f"gigaam-cli: transcribed in {transcribe_time:.2f}s", file=sys.stderr) + + # Output ONLY the text to stdout (like whisper-cli -nt) + print(text) + + +if __name__ == "__main__": + main() diff --git a/mlx_convert/gigaam-stream b/mlx_convert/gigaam-stream new file mode 100755 index 0000000..0a7330b --- /dev/null +++ b/mlx_convert/gigaam-stream @@ -0,0 +1,204 @@ +#!/usr/bin/env python3 +""" +gigaam-stream — Real-time speech recognition using GigaAM v3 on MLX. + +Growing-buffer pseudo-streaming: captures audio, transcribes from start +up to current position each step. GigaAM is 85x realtime on M4 so +even 30s audio processes in ~0.4s. + +Usage: + gigaam-stream # live microphone + gigaam-stream --file audio.wav # file streaming + gigaam-stream --step 1000 --context 5000 # custom timing + +Requirements: + pip install sounddevice (for live microphone capture) +""" +import argparse +import os +import sys +import time +import threading +import signal + +import numpy as np +import mlx.core as mx + +SCRIPT_DIR = os.path.dirname(os.path.abspath(__file__)) +DEFAULT_MODEL = os.path.join(SCRIPT_DIR, "gigaam-v3-ctc-mlx") +SAMPLE_RATE = 16000 + + +def parse_args(): + p = argparse.ArgumentParser(description="GigaAM v3 real-time streaming (MLX)") + p.add_argument("-m", "--model", default=DEFAULT_MODEL, help="Model directory") + p.add_argument("--step", type=int, default=2000, + help="Process every N ms (default: 2000)") + p.add_argument("--file", "-f", type=str, default=None, + help="Transcribe file instead of microphone") + p.add_argument("--no-overwrite", action="store_true", + help="Print incrementally instead of overwriting line") + p.add_argument("--vad-threshold", type=float, default=0.003, + help="VAD energy threshold (default: 0.003)") + return p.parse_args() + + +def clear_line(): + sys.stdout.write("\33[2K\r") + sys.stdout.flush() + + +def stream_from_file(model, audio, args): + """Stream a pre-recorded file with growing buffer.""" + from gigaam_mlx import StreamingConfig + + config = StreamingConfig(step_duration=args.step / 1000.0) + total_dur = audio.shape[0] / SAMPLE_RATE + + print(f"\033[90m[Streaming {total_dur:.1f}s audio, step={args.step}ms]\033[0m\n") + + t0 = time.time() + for result in model.stream_generate(audio, config=config): + elapsed = time.time() - t0 + if args.no_overwrite: + if result.text: + sys.stdout.write(result.text) + sys.stdout.flush() + else: + clear_line() + # Show current transcription with position indicator + pos = f"[{result.audio_position:.1f}s]" + sys.stdout.write(f"\r\033[90m{pos}\033[0m {result.cumulative_text}") + sys.stdout.flush() + + if result.is_final: + print() + break + + total_time = time.time() - t0 + print(f"\n\033[90m[Done in {total_time:.2f}s | {total_dur/total_time:.0f}x realtime]\033[0m") + + +def stream_from_microphone(model, args): + """Live streaming from microphone with growing buffer.""" + try: + import sounddevice as sd + except ImportError: + print("Error: sounddevice not installed. Run: uv pip install sounddevice", + file=sys.stderr) + sys.exit(1) + + step_ms = args.step + step_sec = step_ms / 1000.0 + + # Shared state + audio_buffer = np.zeros(0, dtype=np.float32) + buffer_lock = threading.Lock() + running = True + prev_text = "" + + def audio_callback(indata, frames, time_info, status): + nonlocal audio_buffer + if status: + print(f"\033[90m[audio: {status}]\033[0m", file=sys.stderr) + chunk = indata[:, 0].copy() + with buffer_lock: + audio_buffer = np.concatenate([audio_buffer, chunk]) + # Cap at 30s + max_buf = SAMPLE_RATE * 30 + if len(audio_buffer) > max_buf: + audio_buffer = audio_buffer[-max_buf:] + + def signal_handler(sig, frame): + nonlocal running + running = False + + signal.signal(signal.SIGINT, signal_handler) + + print(f"\033[90m[GigaAM streaming — step={step_ms}ms, Ctrl+C to stop]\033[0m") + print(f"\033[90m[Start speaking...]\033[0m\n") + + stream = sd.InputStream( + samplerate=SAMPLE_RATE, + channels=1, + dtype="float32", + blocksize=int(SAMPLE_RATE * 0.1), + callback=audio_callback, + ) + stream.start() + + last_process_time = 0 + silence_count = 0 + MAX_SILENCE = 5 # stop after 5 consecutive silent steps + + try: + while running: + now = time.time() + if now - last_process_time < step_sec: + time.sleep(0.05) + continue + + last_process_time = now + + with buffer_lock: + if len(audio_buffer) < int(SAMPLE_RATE * 0.3): + continue + buf_copy = audio_buffer.copy() + + # Simple energy VAD on latest step + latest = buf_copy[-min(int(step_sec * SAMPLE_RATE), len(buf_copy)):] + energy = np.sqrt(np.mean(latest ** 2)) + + if energy < args.vad_threshold: + silence_count += 1 + continue + else: + silence_count = 0 + + # Transcribe entire buffer (growing buffer approach) + t0 = time.time() + audio_mx = mx.array(buf_copy) + result = model.stream_live(audio_mx) + dt = time.time() - t0 + + text = result.cumulative_text + + if text and text != prev_text: + clear_line() + dur = len(buf_copy) / SAMPLE_RATE + sys.stdout.write( + f"\r\033[90m[{dur:.1f}s {dt*1000:.0f}ms]\033[0m {text}" + ) + sys.stdout.flush() + prev_text = text + + except KeyboardInterrupt: + pass + finally: + stream.stop() + stream.close() + print(f"\n") + if prev_text: + print(f"\033[1mFinal:\033[0m {prev_text}") + + +def main(): + args = parse_args() + + sys.path.insert(0, SCRIPT_DIR) + from gigaam_mlx import load_model, load_audio + + print(f"\033[90mLoading GigaAM v3 MLX...\033[0m", file=sys.stderr) + t0 = time.time() + model = load_model(args.model) + print(f"\033[90mLoaded in {time.time() - t0:.2f}s\033[0m", file=sys.stderr) + + if args.file: + audio = load_audio(args.file) + stream_from_file(model, audio, args) + else: + stream_from_microphone(model, args) + + +if __name__ == "__main__": + main() diff --git a/mlx_convert/gigaam-transcribe b/mlx_convert/gigaam-transcribe new file mode 100755 index 0000000..af387fa --- /dev/null +++ b/mlx_convert/gigaam-transcribe @@ -0,0 +1,15 @@ +#!/bin/bash +# gigaam-transcribe — shell wrapper for gigaam-cli +# Activates the correct Python venv and runs gigaam-cli +# Install: ln -s /path/to/gigaam-transcribe /usr/local/bin/gigaam-transcribe + +SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)" +PYTHON="${SCRIPT_DIR}/.venv/bin/python" + +if [ ! -f "$PYTHON" ]; then + echo "Error: Python venv not found at ${SCRIPT_DIR}/.venv" >&2 + echo "Run: cd ${SCRIPT_DIR} && uv venv .venv && uv pip install mlx safetensors numpy" >&2 + exit 1 +fi + +exec "$PYTHON" "${SCRIPT_DIR}/gigaam-cli" "$@" diff --git a/mlx_convert/gigaam_mlx.py b/mlx_convert/gigaam_mlx.py new file mode 100644 index 0000000..d1bf8f0 --- /dev/null +++ b/mlx_convert/gigaam_mlx.py @@ -0,0 +1,647 @@ +""" +GigaAM v3 CTC model in MLX. + +Architecture: + - FeatureExtractor: log-mel spectrogram (computed via numpy/MLX at runtime) + - ConformerEncoder: conv1d subsampling + rotary positional embeddings + 16 conformer layers + - CTCHead: Conv1d(768, num_classes, kernel=1) + - CTC greedy decoding + +Supports pseudo-streaming via sliding window (like whisper-stream / mlx-audio Parakeet). +""" +import json +import math +from dataclasses import dataclass, field +from pathlib import Path +from typing import Generator, List, Optional, Tuple + +import mlx.core as mx +import mlx.nn as nn +import numpy as np + + +# ─────────────────────────── Config ─────────────────────────── + +@dataclass +class GigaAMConfig: + model_type: str = "gigaam" + model_name: str = "v3_ctc" + sample_rate: int = 16000 + # preprocessor + features: int = 64 + win_length: int = 320 + hop_length: int = 160 + n_fft: int = 320 + center: bool = False + # encoder + feat_in: int = 64 + n_layers: int = 16 + d_model: int = 768 + subsampling: str = "conv1d" + subs_kernel_size: int = 5 + subsampling_factor: int = 4 + ff_expansion_factor: int = 4 + self_attention_model: str = "rotary" + pos_emb_max_len: int = 5000 + n_heads: int = 16 + conv_kernel_size: int = 5 + conv_norm_type: str = "layer_norm" + # head + head_type: str = "ctc" + num_classes: int = 34 + # vocabulary + vocabulary: Optional[List[str]] = None + + @classmethod + def from_file(cls, path: str) -> "GigaAMConfig": + with open(path) as f: + d = json.load(f) + enc = d.get("encoder", {}) + pre = d.get("preprocessor", {}) + head = d.get("head", {}) + return cls( + model_type=d.get("model_type", "gigaam"), + model_name=d.get("model_name", "v3_ctc"), + sample_rate=d.get("sample_rate", 16000), + features=pre.get("features", 64), + win_length=pre.get("win_length", 320), + hop_length=pre.get("hop_length", 160), + n_fft=pre.get("n_fft", 320), + center=pre.get("center", False), + feat_in=enc.get("feat_in", 64), + n_layers=enc.get("n_layers", 16), + d_model=enc.get("d_model", 768), + subsampling=enc.get("subsampling", "conv1d"), + subs_kernel_size=enc.get("subs_kernel_size", 5), + subsampling_factor=enc.get("subsampling_factor", 4), + ff_expansion_factor=enc.get("ff_expansion_factor", 4), + self_attention_model=enc.get("self_attention_model", "rotary"), + pos_emb_max_len=enc.get("pos_emb_max_len", 5000), + n_heads=enc.get("n_heads", 16), + conv_kernel_size=enc.get("conv_kernel_size", 5), + conv_norm_type=enc.get("conv_norm_type", "layer_norm"), + head_type=d.get("head_type", "ctc"), + num_classes=head.get("num_classes", 34), + vocabulary=d.get("vocabulary"), + ) + + +# ─────────────────────── Audio preprocessing ─────────────────────── + +def mel_filters(sr: int, n_fft: int, n_mels: int) -> mx.array: + """HTK mel filterbank (matching torchaudio default for GigaAM).""" + def hz_to_mel(f): + return 2595.0 * math.log10(1.0 + f / 700.0) + def mel_to_hz(m): + return 700.0 * (10.0 ** (m / 2595.0) - 1.0) + + f_min, f_max = 0.0, sr / 2.0 + mel_min, mel_max = hz_to_mel(f_min), hz_to_mel(f_max) + mel_points = np.linspace(mel_min, mel_max, n_mels + 2) + hz_points = np.array([mel_to_hz(m) for m in mel_points]) + + bins = np.floor((n_fft + 1) * hz_points / sr).astype(int) + + fb = np.zeros((n_fft // 2 + 1, n_mels), dtype=np.float32) + for i in range(n_mels): + lo, mid, hi = bins[i], bins[i + 1], bins[i + 2] + for k in range(lo, mid): + if mid != lo: + fb[k, i] = (k - lo) / (mid - lo) + for k in range(mid, hi): + if hi != mid: + fb[k, i] = (hi - k) / (hi - mid) + return mx.array(fb) + + +def hanning_window(size: int) -> mx.array: + """Hanning window.""" + n = np.arange(size, dtype=np.float32) + return mx.array(0.5 - 0.5 * np.cos(2.0 * np.pi * n / size)) + + +def stft(signal: mx.array, n_fft: int, hop: int, win_len: int, window: mx.array) -> mx.array: + """Simple STFT using mx operations.""" + # Pad if necessary + pad_amount = n_fft // 2 + # For center=False, no padding + length = signal.shape[-1] + # Number of frames + n_frames = 1 + (length - win_len) // hop + + # Build frames via strided indexing + indices = mx.arange(win_len)[None, :] + (mx.arange(n_frames) * hop)[:, None] + frames = signal[indices] * window[None, :] + + # Zero-pad to n_fft if needed + if win_len < n_fft: + pad_size = n_fft - win_len + frames = mx.pad(frames, ((0, 0), (0, pad_size))) + + # Real FFT + spectrum = mx.fft.rfft(frames) + return spectrum # [n_frames, n_fft//2 + 1] + + +def log_mel_spectrogram(audio: mx.array, cfg: GigaAMConfig, + mel_fb: Optional[mx.array] = None, + stft_win: Optional[mx.array] = None) -> mx.array: + """Compute log-mel spectrogram matching GigaAM FeatureExtractor.""" + window = stft_win if stft_win is not None else hanning_window(cfg.win_length) + spec = stft(audio, cfg.n_fft, cfg.hop_length, cfg.win_length, window) + # Power spectrum + power = mx.square(mx.abs(spec)) # [T, n_fft//2+1] + # Mel filterbank + if mel_fb is not None: + filters = mel_fb + else: + filters = mel_filters(cfg.sample_rate, cfg.n_fft, cfg.features) # [n_fft//2+1, n_mels] + mel = power @ filters # [T, n_mels] + # Log + log_mel = mx.log(mx.clip(mel, 1e-9, 1e9)) + return log_mel # [T, n_mels] + + +# ─────────────────────── Model layers ─────────────────────── + +class Conv1dSubsampling(nn.Module): + """Conv1d striding subsampling: 2 conv1d layers with stride=2, ReLU.""" + def __init__(self, cfg: GigaAMConfig): + super().__init__() + ks = cfg.subs_kernel_size + pad = (ks - 1) // 2 + n_subs = int(math.log2(cfg.subsampling_factor)) + + layers = [] + in_ch = cfg.feat_in + for _ in range(n_subs): + layers.append(nn.Conv1d(in_ch, cfg.d_model, kernel_size=ks, stride=2, padding=pad)) + layers.append(nn.ReLU()) + in_ch = cfg.d_model + self.conv = layers + self._n_subs = n_subs + self._ks = ks + self._pad = pad + + def __call__(self, x: mx.array, lengths: mx.array) -> Tuple[mx.array, mx.array]: + """x: [B, T, feat_in] → [B, T', d_model]""" + for layer in self.conv: + x = layer(x) + # Compute output lengths + for _ in range(self._n_subs): + lengths = mx.floor((lengths.astype(mx.float32) + 2 * self._pad - self._ks) / 2 + 1).astype(mx.int32) + return x, lengths + + +class RotaryPositionalEmbedding(nn.Module): + """Rotary positional embeddings (RoPE).""" + def __init__(self, dim: int, base: int = 10000, max_len: int = 5000): + super().__init__() + self.dim = dim + self.base = base + inv_freq = 1.0 / (base ** (np.arange(0, dim, 2, dtype=np.float32) / dim)) + self._inv_freq = mx.array(inv_freq) + + def __call__(self, seq_len: int) -> Tuple[mx.array, mx.array]: + t = mx.arange(seq_len).astype(mx.float32) + freqs = mx.outer(t, self._inv_freq) + emb = mx.concatenate([freqs, freqs], axis=-1) + return mx.cos(emb), mx.sin(emb) + + +def rotate_half(x: mx.array) -> mx.array: + """Rotates half the hidden dims of the input.""" + d = x.shape[-1] // 2 + x1, x2 = x[..., :d], x[..., d:] + return mx.concatenate([-x2, x1], axis=-1) + + +def apply_rotary_emb(q: mx.array, k: mx.array, cos: mx.array, sin: mx.array) -> Tuple[mx.array, mx.array]: + """Apply rotary embeddings. q,k: [B, H, T, D], cos,sin: [T, D]""" + cos = cos[None, None, :, :] # [1, 1, T, D] + sin = sin[None, None, :, :] + q_rot = q * cos + rotate_half(q) * sin + k_rot = k * cos + rotate_half(k) * sin + return q_rot, k_rot + + +class RotaryMultiHeadAttention(nn.Module): + """Multi-head attention with rotary positional embeddings. + + GigaAM applies RoPE BEFORE linear projections: + 1. Reshape raw input to multi-head: [B, T, D] → [B, T, H, d_k] + 2. Apply RoPE to query/key heads + 3. Reshape back to [B, T, D] + 4. Project through linear_q/k/v + 5. Standard scaled dot-product attention + """ + def __init__(self, d_model: int, n_heads: int): + super().__init__() + self.n_heads = n_heads + self.d_k = d_model // n_heads + self.linear_q = nn.Linear(d_model, d_model) + self.linear_k = nn.Linear(d_model, d_model) + self.linear_v = nn.Linear(d_model, d_model) + self.linear_out = nn.Linear(d_model, d_model) + + def __call__(self, x: mx.array, cos: mx.array, sin: mx.array, + mask: Optional[mx.array] = None) -> mx.array: + B, T, D = x.shape + H, d_k = self.n_heads, self.d_k + + # 1. Reshape raw input to multi-head for RoPE: [B, T, H, d_k] + x_heads = x.reshape(B, T, H, d_k) + + # 2. Apply RoPE to query and key (same input for self-attention) + # cos, sin: [T, d_k] → [1, T, 1, d_k] + cos_e = cos[None, :, None, :] + sin_e = sin[None, :, None, :] + q_rot = x_heads * cos_e + rotate_half(x_heads) * sin_e + k_rot = x_heads * cos_e + rotate_half(x_heads) * sin_e + + # 3. Reshape back to [B, T, D] + q_rot = q_rot.reshape(B, T, D) + k_rot = k_rot.reshape(B, T, D) + + # 4. Project through linear layers + q = self.linear_q(q_rot).reshape(B, T, H, d_k).transpose(0, 2, 1, 3) # [B, H, T, d_k] + k = self.linear_k(k_rot).reshape(B, T, H, d_k).transpose(0, 2, 1, 3) + v = self.linear_v(x).reshape(B, T, H, d_k).transpose(0, 2, 1, 3) # value uses original x + + # 5. Scaled dot-product attention + scale = math.sqrt(d_k) + attn = (q @ k.transpose(0, 1, 3, 2)) / scale + if mask is not None: + attn = attn + mask + attn = mx.softmax(attn, axis=-1) + out = attn @ v # [B, H, T, d_k] + out = out.transpose(0, 2, 1, 3).reshape(B, T, -1) + return self.linear_out(out) + + +class ConformerConvolution(nn.Module): + """Conformer convolution module with LayerNorm.""" + def __init__(self, d_model: int, kernel_size: int): + super().__init__() + pad = (kernel_size - 1) // 2 + self.pointwise_conv1 = nn.Conv1d(d_model, d_model * 2, kernel_size=1) + self.depthwise_conv = nn.Conv1d(d_model, d_model, kernel_size=kernel_size, + padding=pad, groups=d_model) + # GigaAM v3 uses layer_norm for conv_norm_type + self.batch_norm = nn.LayerNorm(d_model) + self.activation = nn.SiLU() + self.pointwise_conv2 = nn.Conv1d(d_model, d_model, kernel_size=1) + + def __call__(self, x: mx.array) -> mx.array: + # x: [B, T, D] + x = self.pointwise_conv1(x) # → [B, T, 2*D] + # GLU: split last dim in half, apply sigmoid gate + half = x.shape[-1] // 2 + x = x[..., :half] * mx.sigmoid(x[..., half:]) # GLU + x = self.depthwise_conv(x) # → [B, T, D] + x = self.batch_norm(x) + x = self.activation(x) + x = self.pointwise_conv2(x) # → [B, T, D] + return x + + +class ConformerFeedForward(nn.Module): + """Conformer feed-forward module.""" + def __init__(self, d_model: int, d_ff: int): + super().__init__() + self.linear1 = nn.Linear(d_model, d_ff) + self.activation = nn.SiLU() + self.linear2 = nn.Linear(d_ff, d_model) + + def __call__(self, x: mx.array) -> mx.array: + return self.linear2(self.activation(self.linear1(x))) + + +class ConformerLayer(nn.Module): + """Single conformer layer.""" + def __init__(self, cfg: GigaAMConfig): + super().__init__() + d = cfg.d_model + d_ff = d * cfg.ff_expansion_factor + + self.norm_feed_forward1 = nn.LayerNorm(d) + self.feed_forward1 = ConformerFeedForward(d, d_ff) + self.norm_self_att = nn.LayerNorm(d) + self.self_attn = RotaryMultiHeadAttention(d, cfg.n_heads) + self.norm_conv = nn.LayerNorm(d) + self.conv = ConformerConvolution(d, cfg.conv_kernel_size) + self.norm_feed_forward2 = nn.LayerNorm(d) + self.feed_forward2 = ConformerFeedForward(d, d_ff) + self.norm_out = nn.LayerNorm(d) + + def __call__(self, x: mx.array, cos: mx.array, sin: mx.array, + mask: Optional[mx.array] = None) -> mx.array: + # FF1 + residual = x + x = self.norm_feed_forward1(x) + x = self.feed_forward1(x) + residual = residual + x * 0.5 + + # Self-attention + x = self.norm_self_att(residual) + x = self.self_attn(x, cos, sin, mask=mask) + residual = residual + x + + # Conv + x = self.norm_conv(residual) + x = self.conv(x) + residual = residual + x + + # FF2 + x = self.norm_feed_forward2(residual) + x = self.feed_forward2(x) + residual = residual + x * 0.5 + + return self.norm_out(residual) + + +class ConformerEncoder(nn.Module): + """GigaAM Conformer encoder.""" + def __init__(self, cfg: GigaAMConfig): + super().__init__() + self.pre_encode = Conv1dSubsampling(cfg) + self.pos_enc = RotaryPositionalEmbedding( + cfg.d_model // cfg.n_heads, + base=10000, + max_len=cfg.pos_emb_max_len, + ) + self.layers = [ConformerLayer(cfg) for _ in range(cfg.n_layers)] + + def __call__(self, features: mx.array, lengths: mx.array) -> Tuple[mx.array, mx.array]: + """features: [B, T, feat_in] → encoded: [B, T', D], lengths: [B]""" + x, lengths = self.pre_encode(features, lengths) + T = x.shape[1] + cos, sin = self.pos_enc(T) + for layer in self.layers: + x = layer(x, cos, sin) + return x, lengths + + +class CTCHead(nn.Module): + """CTC decoder head: Conv1d(d_model, num_classes, kernel=1).""" + def __init__(self, feat_in: int, num_classes: int): + super().__init__() + self.decoder_layers = [nn.Conv1d(feat_in, num_classes, kernel_size=1)] + + def __call__(self, x: mx.array) -> mx.array: + """x: [B, T, D] → log_probs: [B, T, C]""" + logits = self.decoder_layers[0](x) # [B, T, C] + return mx.softmax(logits, axis=-1) # we'll use log later + + +# ─────────────────────── Streaming dataclasses ─────────────────────── + +@dataclass +class StreamingConfig: + """Configuration for pseudo-streaming transcription. + + Attributes: + chunk_duration: Duration of each audio chunk in seconds. + context_duration: Extra audio from before the chunk to keep as context. + The model always sees [context + chunk] for better accuracy. + step_duration: How much to advance between steps. If None, equals chunk_duration. + """ + chunk_duration: float = 2.0 + context_duration: float = 3.0 + step_duration: Optional[float] = None + + def __post_init__(self): + if self.step_duration is None: + self.step_duration = self.chunk_duration + + +@dataclass +class StreamingResult: + """Result from streaming transcription — mlx-audio compatible. + + Attributes: + text: New text since last emission. + is_final: True if this is the final result. + start_time: Start time in seconds. + end_time: End time in seconds. + progress: Progress 0.0–1.0. + audio_position: Current position in audio (seconds). + audio_duration: Total audio duration (seconds), 0 for live. + cumulative_text: Full accumulated transcription so far. + language: Language code. + """ + text: str + is_final: bool + start_time: float + end_time: float + progress: float = 0.0 + audio_position: float = 0.0 + audio_duration: float = 0.0 + cumulative_text: str = "" + language: str = "ru" + + +class GigaAMCTC(nn.Module): + """Full GigaAM CTC model.""" + def __init__(self, cfg: GigaAMConfig): + super().__init__() + self.cfg = cfg + self.encoder = ConformerEncoder(cfg) + self.head = CTCHead(cfg.d_model, cfg.num_classes + 1) # +1 for blank + self.mel_filterbank: Optional[mx.array] = None + self.stft_window: Optional[mx.array] = None + + def __call__(self, features: mx.array, lengths: mx.array) -> Tuple[mx.array, mx.array]: + encoded, enc_lengths = self.encoder(features, lengths) + log_probs = self.head(encoded) + return log_probs, enc_lengths + + def _ctc_decode(self, log_probs: mx.array, enc_length: int) -> str: + """CTC greedy decode: collapse repeated + remove blanks.""" + vocab = self.cfg.vocabulary + blank_id = len(vocab) + labels = mx.argmax(log_probs, axis=-1) + labels_list = labels.tolist() + + result = [] + prev = -1 + for t, label in enumerate(labels_list): + if t >= enc_length: + break + if label == blank_id: + prev = label + continue + if label == prev: + continue + result.append(label) + prev = label + + return "".join(vocab[i] for i in result) + + def _compute_features(self, audio: mx.array) -> Tuple[mx.array, mx.array]: + """Audio → mel features [1, T, features] + lengths [1].""" + mel = log_mel_spectrogram(audio, self.cfg, + mel_fb=self.mel_filterbank, + stft_win=self.stft_window) + mel = mx.expand_dims(mel, 0) + lengths = mx.array([mel.shape[1]]) + return mel, lengths + + def transcribe(self, audio: mx.array) -> str: + """Transcribe raw audio waveform → text.""" + mel, lengths = self._compute_features(audio) + log_probs, enc_lengths = self(mel, lengths) + mx.eval(log_probs, enc_lengths) + return self._ctc_decode(log_probs[0], int(enc_lengths[0])) + + def transcribe_chunk(self, audio: mx.array) -> str: + """Transcribe a single chunk (for streaming). Same as transcribe but clearer name.""" + return self.transcribe(audio) + + def stream_generate( + self, + audio: mx.array, + config: Optional[StreamingConfig] = None, + ) -> Generator[StreamingResult, None, None]: + """Pseudo-streaming transcription over pre-recorded audio. + + Uses growing buffer approach: each step transcribes from the start + up to the current position. GigaAM at 85x realtime makes this fast + even for 30s audio (~0.4s inference). + + For very long audio (>30s), falls back to sliding window of last 30s. + + Args: + audio: Raw audio waveform, mx.array, 16kHz mono. + config: StreamingConfig with step duration. + + Yields: + StreamingResult with incremental text for each step. + """ + if config is None: + config = StreamingConfig() + + sr = self.cfg.sample_rate + total_samples = audio.shape[0] + audio_duration = total_samples / sr + + step_samples = int(config.step_duration * sr) + max_window = int(30.0 * sr) # cap at 30s for memory/speed + + previous_text = "" + position = step_samples # start with first step + + while position <= total_samples: + is_last = position >= total_samples + # Growing buffer from start, capped at 30s + window_start = max(0, position - max_window) + window = audio[window_start:position] + + current_text = self.transcribe(window) + + # Incremental text + new_text = _incremental_text(previous_text, current_text) + previous_text = current_text + + audio_pos = position / sr + yield StreamingResult( + text=new_text, + is_final=is_last, + start_time=window_start / sr, + end_time=audio_pos, + progress=position / total_samples, + audio_position=audio_pos, + audio_duration=audio_duration, + cumulative_text=current_text, + language="ru", + ) + + if is_last: + break + + position = min(position + step_samples, total_samples) + + def stream_live( + self, + audio_buffer: mx.array, + ) -> StreamingResult: + """Transcribe a growing audio buffer for live microphone use. + + Call this repeatedly as new audio arrives. Transcribes the full buffer + (capped at 30s from the end). GigaAM is 85x realtime so this is fast. + + Args: + audio_buffer: The full accumulated audio so far. + + Returns: + StreamingResult with current full transcription. + """ + sr = self.cfg.sample_rate + total_samples = audio_buffer.shape[0] + max_window = int(30.0 * sr) + + start = max(0, total_samples - max_window) + window = audio_buffer[start:] + + text = self.transcribe(window) + + return StreamingResult( + text=text, + is_final=False, + start_time=start / sr, + end_time=total_samples / sr, + progress=0.0, + audio_position=total_samples / sr, + audio_duration=0.0, + cumulative_text=text, + language="ru", + ) + + +def _incremental_text(previous: str, current: str) -> str: + """Find new text added to current vs previous. + + If current starts with previous → return the new suffix. + If model corrected → return full current (with marker). + """ + if not previous: + return current + if current.startswith(previous): + return current[len(previous):] + # Model self-corrected — return full updated text + return current + + +def load_model(model_dir: str) -> GigaAMCTC: + """Load converted GigaAM MLX model from directory.""" + model_dir = Path(model_dir) + cfg = GigaAMConfig.from_file(str(model_dir / "config.json")) + model = GigaAMCTC(cfg) + weights = mx.load(str(model_dir / "model.safetensors")) + + # Extract preprocessing weights + mel_fb = weights.pop("mel_filterbank", None) + stft_win = weights.pop("stft_window", None) + + if mel_fb is not None: + model.mel_filterbank = mel_fb.astype(mx.float32) + if stft_win is not None: + model.stft_window = stft_win.astype(mx.float32) + + # Load model weights + model.load_weights(list(weights.items()), strict=False) + mx.eval(model.parameters()) + return model + + +def load_audio(path: str, sample_rate: int = 16000) -> mx.array: + """Load audio via ffmpeg → mx.array.""" + import subprocess + cmd = [ + "ffmpeg", "-nostdin", "-threads", "0", "-i", path, + "-f", "s16le", "-ac", "1", "-acodec", "pcm_s16le", + "-ar", str(sample_rate), "-" + ] + result = subprocess.run(cmd, capture_output=True, check=True) + audio_np = np.frombuffer(result.stdout, dtype=np.int16).astype(np.float32) / 32768.0 + return mx.array(audio_np) From 7da43ef7dd73b63249be713fef6f1e9c064a1071 Mon Sep 17 00:00:00 2001 From: Aleksandr Bobrov Date: Fri, 13 Mar 2026 11:57:26 +0500 Subject: [PATCH 13/15] feat: Add RNNT support to MLX implementation - Implement (Embedding + LSTM) matching PyTorch layout - Implement (Linear layers + ReLU) - Abstract and to automatically use RNNT or CTC based on config - Update conversion script to map PyTorch's separate gate weights/biases to MLX's grouped format - Update GigaAMConfig to parse RNNT settings - Update README with RNNT benchmarks (48x realtime on M4 vs 139x for CTC) --- mlx_convert/README.md | 6 +- mlx_convert/convert_gigaam_to_mlx.py | 33 +++++++- mlx_convert/gigaam_mlx.py | 118 ++++++++++++++++++++++++--- 3 files changed, 143 insertions(+), 14 deletions(-) diff --git a/mlx_convert/README.md b/mlx_convert/README.md index 37a8a78..dbec986 100644 --- a/mlx_convert/README.md +++ b/mlx_convert/README.md @@ -1,8 +1,10 @@ # GigaAM v3 MLX — Russian ASR on Apple Silicon -GigaAM v3 CTC (Conformer encoder, 16 layers, 768d) converted to [MLX](https://github.com/ml-explore/mlx) for fast inference on Apple Silicon. +GigaAM v3 (Conformer encoder, 16 layers, 768d) converted to [MLX](https://github.com/ml-explore/mlx) for fast inference on Apple Silicon. +Supports both **CTC** and **RNNT** models. -**139x realtime** on M4 — transcribes 11 seconds of Russian speech in 81ms. +**139x realtime** for CTC on M4 — transcribes 11 seconds of Russian speech in 81ms. +**48x realtime** for RNNT on M4 — transcribes 11 seconds in 230ms (higher quality, sequential decode). ## Quick Start diff --git a/mlx_convert/convert_gigaam_to_mlx.py b/mlx_convert/convert_gigaam_to_mlx.py index 198d0fe..63c7606 100644 --- a/mlx_convert/convert_gigaam_to_mlx.py +++ b/mlx_convert/convert_gigaam_to_mlx.py @@ -4,10 +4,12 @@ Handles weight shape transpositions required by MLX conventions: - PyTorch Conv1d: [out_ch, in_ch, kernel] → MLX Conv1d: [out_ch, kernel, in_ch] - PyTorch Linear: same (no change needed, MLX nn.Linear uses same layout) +- RNNT LSTM weights properly mapped to MLX layout - BatchNorm running stats need special handling Usage: python convert_gigaam_to_mlx.py --model v3_ctc --output ./gigaam-v3-ctc-mlx + python convert_gigaam_to_mlx.py --model v3_rnnt --output ./gigaam-v3-rnnt-mlx """ import argparse import json @@ -65,7 +67,32 @@ def sanitize_weights(state_dict: dict) -> dict: # This covers: encoder.pre_encode.conv.*, encoder.layers.*.conv.*, head.decoder_layers.* if "weight" in key and len(w.shape) == 3: w = transpose_conv1d_weight(w) - + + # RNNT LSTM conversions + if "lstm.weight_ih" in key: + mlx_weights[key.replace(".weight_ih_l0", ".Wx")] = w + continue + if "lstm.weight_hh" in key: + mlx_weights[key.replace(".weight_hh_l0", ".Wh")] = w + continue + if "lstm.bias_ih" in key: + # We must add bias_ih and bias_hh + hh_key = key.replace(".bias_ih_l0", ".bias_hh_l0") + hh_w = state_dict[hh_key].detach().cpu().float().numpy() + mlx_weights[key.replace(".bias_ih_l0", ".bias")] = w + hh_w + continue + if "lstm.bias_hh" in key: + # Already handled with bias_ih + continue + + # RNNT Joint conversions + if "joint.joint_net.1.weight" in key: + mlx_weights[key.replace("joint_net.1.weight", "joint_net_linear.weight")] = w + continue + if "joint.joint_net.1.bias" in key: + mlx_weights[key.replace("joint_net.1.bias", "joint_net_linear.bias")] = w + continue + # BatchNorm / LayerNorm: # GigaAM v3 uses layer_norm for conv_norm_type, so batch_norm is actually LayerNorm # The keys already use "batch_norm" name but the module is nn.LayerNorm @@ -126,6 +153,10 @@ def build_config(model_name: str, cfg) -> dict: "decoder": cfg_dict["head"]["decoder"], "joint": cfg_dict["head"]["joint"], } + if "vocabulary" in cfg_dict["decoding"]: + config["vocabulary"] = cfg_dict["decoding"]["vocabulary"] + else: + config["vocabulary"] = VOCABULARY_V3 # RNNT uses tokenizer config["tokenizer_model"] = "tokenizer.model" diff --git a/mlx_convert/gigaam_mlx.py b/mlx_convert/gigaam_mlx.py index d1bf8f0..dd461b0 100644 --- a/mlx_convert/gigaam_mlx.py +++ b/mlx_convert/gigaam_mlx.py @@ -49,6 +49,12 @@ class GigaAMConfig: # head head_type: str = "ctc" num_classes: int = 34 + + # rnnt specific + rnnt_pred_hidden: int = 320 + rnnt_joint_hidden: int = 320 + rnnt_max_symbols: int = 10 + # vocabulary vocabulary: Optional[List[str]] = None @@ -81,7 +87,9 @@ def from_file(cls, path: str) -> "GigaAMConfig": conv_kernel_size=enc.get("conv_kernel_size", 5), conv_norm_type=enc.get("conv_norm_type", "layer_norm"), head_type=d.get("head_type", "ctc"), - num_classes=head.get("num_classes", 34), + num_classes=head.get("num_classes", 34) if "num_classes" in head else head.get("decoder", {}).get("num_classes", 34), + rnnt_pred_hidden=head.get("decoder", {}).get("pred_hidden", 320), + rnnt_joint_hidden=head.get("joint", {}).get("joint_hidden", 320), vocabulary=d.get("vocabulary"), ) @@ -382,6 +390,46 @@ def __call__(self, features: mx.array, lengths: mx.array) -> Tuple[mx.array, mx. return x, lengths +class RNNTJoint(nn.Module): + def __init__(self, enc_hidden: int, pred_hidden: int, joint_hidden: int, num_classes: int): + super().__init__() + self.enc = nn.Linear(enc_hidden, joint_hidden) + self.pred = nn.Linear(pred_hidden, joint_hidden) + self.joint_net_linear = nn.Linear(joint_hidden, num_classes) + + def __call__(self, encoder_out: mx.array, decoder_out: mx.array) -> mx.array: + enc = mx.expand_dims(self.enc(encoder_out), 2) + pred = mx.expand_dims(self.pred(decoder_out), 1) + joint_rep = mx.maximum(enc + pred, 0.0) + return self.joint_net_linear(joint_rep) + + +class RNNTDecoder(nn.Module): + def __init__(self, num_classes: int, pred_hidden: int): + super().__init__() + self.blank_id = num_classes - 1 + self.pred_hidden = pred_hidden + self.embed = nn.Embedding(num_classes, pred_hidden) + self.lstm = nn.LSTM(pred_hidden, pred_hidden) + + def predict(self, x: Optional[int], state: Optional[Tuple[mx.array, mx.array]], batch_size: int = 1): + if x is not None: + emb = self.embed(mx.array([[x]])) + else: + emb = mx.zeros((batch_size, 1, self.pred_hidden)) + + h, c = state if state is not None else (None, None) + out, cell = self.lstm(emb, hidden=h, cell=c) + return out, (out[:, -1, :], cell[:, -1, :]) + + +class RNNTHead(nn.Module): + def __init__(self, feat_in: int, pred_hidden: int, joint_hidden: int, num_classes: int): + super().__init__() + self.decoder = RNNTDecoder(num_classes, pred_hidden) + self.joint = RNNTJoint(feat_in, pred_hidden, joint_hidden, num_classes) + + class CTCHead(nn.Module): """CTC decoder head: Conv1d(d_model, num_classes, kernel=1).""" def __init__(self, feat_in: int, num_classes: int): @@ -441,20 +489,30 @@ class StreamingResult: language: str = "ru" -class GigaAMCTC(nn.Module): - """Full GigaAM CTC model.""" +class GigaAM(nn.Module): + """Full GigaAM model (supports CTC and RNNT).""" def __init__(self, cfg: GigaAMConfig): super().__init__() self.cfg = cfg self.encoder = ConformerEncoder(cfg) - self.head = CTCHead(cfg.d_model, cfg.num_classes + 1) # +1 for blank + + if cfg.head_type == "rnnt": + self.head = RNNTHead( + feat_in=cfg.d_model, + pred_hidden=cfg.rnnt_pred_hidden, + joint_hidden=cfg.rnnt_joint_hidden, + num_classes=cfg.num_classes + ) + else: + self.head = CTCHead(cfg.d_model, cfg.num_classes) + self.mel_filterbank: Optional[mx.array] = None self.stft_window: Optional[mx.array] = None def __call__(self, features: mx.array, lengths: mx.array) -> Tuple[mx.array, mx.array]: + """Returns encoded features and their lengths.""" encoded, enc_lengths = self.encoder(features, lengths) - log_probs = self.head(encoded) - return log_probs, enc_lengths + return encoded, enc_lengths def _ctc_decode(self, log_probs: mx.array, enc_length: int) -> str: """CTC greedy decode: collapse repeated + remove blanks.""" @@ -490,9 +548,47 @@ def _compute_features(self, audio: mx.array) -> Tuple[mx.array, mx.array]: def transcribe(self, audio: mx.array) -> str: """Transcribe raw audio waveform → text.""" mel, lengths = self._compute_features(audio) - log_probs, enc_lengths = self(mel, lengths) - mx.eval(log_probs, enc_lengths) - return self._ctc_decode(log_probs[0], int(enc_lengths[0])) + encoded, enc_lengths = self(mel, lengths) + mx.eval(encoded, enc_lengths) + + if self.cfg.head_type == "rnnt": + return self._rnnt_decode(encoded[0], int(enc_lengths[0])) + else: + log_probs = self.head(encoded) + return self._ctc_decode(log_probs[0], int(enc_lengths[0])) + + def _rnnt_decode(self, encoded: mx.array, enc_length: int) -> str: + """Greedy decode for RNN-T.""" + vocab = self.cfg.vocabulary + blank_id = len(vocab) + max_symbols = self.cfg.rnnt_max_symbols + + hyp = [] + dec_state = None + last_label = None + + for t in range(enc_length): + # encoded: [T, D] -> [1, 1, D] + f = encoded[t:t+1, :].reshape(1, 1, -1) + + not_blank = True + new_symbols = 0 + while not_blank and new_symbols < max_symbols: + g, hidden = self.head.decoder.predict(last_label, dec_state, batch_size=1) + # g: [1, 1, D] + # joint output is [1, 1, 1, num_classes], we want argmax over classes + logits = self.head.joint(f, g) # [1, 1, 1, C] + k = int(mx.argmax(logits[0, 0, 0, :]).item()) + + if k == blank_id: + not_blank = False + else: + hyp.append(k) + dec_state = hidden + last_label = k + new_symbols += 1 + + return "".join(vocab[i] for i in hyp) def transcribe_chunk(self, audio: mx.array) -> str: """Transcribe a single chunk (for streaming). Same as transcribe but clearer name.""" @@ -612,11 +708,11 @@ def _incremental_text(previous: str, current: str) -> str: return current -def load_model(model_dir: str) -> GigaAMCTC: +def load_model(model_dir: str) -> GigaAM: """Load converted GigaAM MLX model from directory.""" model_dir = Path(model_dir) cfg = GigaAMConfig.from_file(str(model_dir / "config.json")) - model = GigaAMCTC(cfg) + model = GigaAM(cfg) weights = mx.load(str(model_dir / "model.safetensors")) # Extract preprocessing weights From ac45b22d8e0b49aa6afaa2e53e3c322e4d294935 Mon Sep 17 00:00:00 2001 From: Aleksandr Bobrov Date: Sun, 15 Mar 2026 17:10:41 +0500 Subject: [PATCH 14/15] feat(mlx): add GigaAM v3 RNNT MLX conversion with testing and benchmarking MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Add complete MLX conversion pipeline and inference tools for GigaAM v3 RNNT model targeting Apple Silicon: - Add pre-converted GigaAM v3 RNNT MLX model artifacts (config, weights in safetensors format) with comprehensive documentation of architecture and performance metrics (48× realtime on M4) - Add weight inspection utility to analyze PyTorch checkpoint structure and enable accurate parameter mapping during conversion - Add comprehensive test suite covering MLX model inference, fp32 variant testing, and PyTorch baseline comparison - Add comparative benchmarking tool (compare_all.py) for side-by-side evaluation of Whisper CPP, GigaAM PyTorch (CPU), and GigaAM MLX implementations - Add RNNT architecture patch script to support joint network and LSTM decoder components - Add dependency lock file (uv.lock) for reproducible environment management This enables efficient speech recognition on Apple Silicon with ~9% lower WER compared to CTC variant through autoregressive joint language modeling. --- mlx_convert/compare_all.py | 76 + mlx_convert/gigaam-v3-rnnt-mlx/README.md | 85 + mlx_convert/gigaam-v3-rnnt-mlx/config.json | 77 + mlx_convert/step1_inspect_weights.py | 35 + mlx_convert/test_fp32.py | 26 + mlx_convert/test_mlx_gigaam.py | 25 + mlx_convert/test_pytorch_gigaam.py | 13 + patch_rnnt.py | 48 + uv.lock | 4392 ++++++++++++++++++++ 9 files changed, 4777 insertions(+) create mode 100644 mlx_convert/compare_all.py create mode 100644 mlx_convert/gigaam-v3-rnnt-mlx/README.md create mode 100644 mlx_convert/gigaam-v3-rnnt-mlx/config.json create mode 100644 mlx_convert/step1_inspect_weights.py create mode 100644 mlx_convert/test_fp32.py create mode 100644 mlx_convert/test_mlx_gigaam.py create mode 100644 mlx_convert/test_pytorch_gigaam.py create mode 100644 patch_rnnt.py create mode 100644 uv.lock diff --git a/mlx_convert/compare_all.py b/mlx_convert/compare_all.py new file mode 100644 index 0000000..7934309 --- /dev/null +++ b/mlx_convert/compare_all.py @@ -0,0 +1,76 @@ +"""Full comparison: Whisper CPP vs GigaAM PyTorch vs GigaAM MLX.""" +import subprocess +import time +import sys + +sys.path.insert(0, "..") +sys.path.insert(0, ".") + +AUDIO = "test_ru.wav" + +print("=" * 70) +print("COMPARISON: Russian speech transcription") +print("Audio: GigaAM example.wav (~11.3s, Pushkin poetry)") +print("=" * 70) + +# ── 1. Whisper CPP ── +print("\n📢 1. Whisper CPP (small, Russian)") +t0 = time.time() +result = subprocess.run( + ["whisper-cli", "-m", "ggml-small.bin", "-l", "ru", "-f", AUDIO, "-nt"], + capture_output=True, text=True +) +whisper_time = time.time() - t0 +whisper_text = "" +for line in result.stdout.strip().split("\n"): + line = line.strip() + if line and not line.startswith("["): + whisper_text += line + " " + elif line.startswith("["): + # extract text after timestamp + parts = line.split("]", 1) + if len(parts) > 1: + whisper_text += parts[1].strip() + " " +whisper_text = whisper_text.strip() +print(f" Text: {whisper_text}") +print(f" Time: {whisper_time:.2f}s") + +# ── 2. GigaAM PyTorch ── +print("\n📢 2. GigaAM v3_ctc (PyTorch, CPU)") +import gigaam +model_pt = gigaam.load_model("v3_ctc", device="cpu", fp16_encoder=False, use_flash=False) +t0 = time.time() +pt_text = model_pt.transcribe(AUDIO) +pt_time = time.time() - t0 +print(f" Text: {pt_text}") +print(f" Time: {pt_time:.2f}s") + +# ── 3. GigaAM MLX ── +print("\n📢 3. GigaAM v3_ctc (MLX, Apple Silicon)") +from gigaam_mlx import load_model, load_audio +model_mlx = load_model("./gigaam-v3-ctc-mlx") +audio = load_audio(AUDIO) + +# Warmup +_ = model_mlx.transcribe(audio) + +t0 = time.time() +mlx_text = model_mlx.transcribe(audio) +mlx_time = time.time() - t0 +print(f" Text: {mlx_text}") +print(f" Time: {mlx_time:.2f}s") + +# ── Summary ── +print("\n" + "=" * 70) +print("SUMMARY") +print("=" * 70) +print(f"{'Model':<35} {'Time':>8} Text") +print("-" * 70) +print(f"{'Whisper CPP (small)':<35} {whisper_time:>7.2f}s {whisper_text[:60]}...") +print(f"{'GigaAM v3_ctc (PyTorch/CPU)':<35} {pt_time:>7.2f}s {pt_text[:60]}...") +print(f"{'GigaAM v3_ctc (MLX/M4)':<35} {mlx_time:>7.2f}s {mlx_text[:60]}...") +print() + +# Reference text (Pushkin) +ref = "ничьих не требуя похвал счастлив уж я надеждой сладкой что дева с трепетом любви посмотрит может быть украдкой на песни грешные мои у лукоморья дуб зеленый" +print(f"Reference: {ref}") diff --git a/mlx_convert/gigaam-v3-rnnt-mlx/README.md b/mlx_convert/gigaam-v3-rnnt-mlx/README.md new file mode 100644 index 0000000..039a6c6 --- /dev/null +++ b/mlx_convert/gigaam-v3-rnnt-mlx/README.md @@ -0,0 +1,85 @@ +--- +license: mit +language: + - ru +library_name: mlx +tags: + - mlx + - speech-recognition + - asr + - rnnt + - conformer + - russian + - apple-silicon +base_model: ai-sage/GigaAM +pipeline_tag: automatic-speech-recognition +--- + +# GigaAM v3 RNNT — MLX (Apple Silicon) + +GigaAM v3 RNNT (Conformer, 16 layers, 768d + RNNT Joint & Decoder) converted to [MLX](https://github.com/ml-explore/mlx) for native inference on Apple Silicon. + +**48× realtime** on M4 — transcribes 11 seconds of Russian speech in 230ms. +Compared to the CTC version, RNNT offers **~9% lower Word Error Rate (WER)** across benchmarks due to the autoregressive joint language modeling loop, with slightly slower sequential decoding. + +Original model: [ai-sage/GigaAM](https://huggingface.co/ai-sage/GigaAM) + +## Quick Start + +```bash +pip install mlx safetensors numpy +``` + +```python +from huggingface_hub import snapshot_download + +model_dir = snapshot_download("al-bo/gigaam-v3-rnnt-mlx") +``` + +Or use with the inference code from [GigaAM MLX](https://github.com/salute-developers/GigaAM/tree/main/mlx_convert): + +```python +from gigaam_mlx import load_model, load_audio + +model = load_model("./gigaam-v3-rnnt-mlx") +text = model.transcribe(load_audio("audio.wav")) +print(text) +# → ничьих не требуя похвал счастлив уж я надеждой сладкой +``` + +## Architecture + +``` +Audio (16kHz) → Log-Mel Spectrogram (64 bins) + → Conv1d Subsampling (4× stride) + → 16× Conformer Layers: + ├─ FFN₁ (half-step residual) + ├─ RoPE Multi-Head Self-Attention (16 heads) + ├─ Convolution Module (GLU + depthwise conv) + └─ FFN₂ (half-step residual) + → RNNT Head (Joint + LSTM Decoder) + → Greedy Decode +``` + +## Performance (Apple M4) + +| Metric | Value | +|--------|-------| +| Batch (11s audio) | **230ms** (48× realtime) | +| Model size | 423 MB (fp16) | +| Parameters | ~222M | + +## Files + +- `model.safetensors` — weights (fp16, 423 MB) +- `config.json` — model config + vocabulary (34 Russian characters) + +## Conversion + +Converted from PyTorch using `convert_gigaam_to_mlx.py`. +LSTM weights are transformed from PyTorch `(weight_ih, weight_hh, bias_ih, bias_hh)` to MLX layout `(Wx, Wh, bias)`. + +## License + +MLX conversion code: MIT. +Model weights: see [ai-sage/GigaAM](https://huggingface.co/ai-sage/GigaAM) license. \ No newline at end of file diff --git a/mlx_convert/gigaam-v3-rnnt-mlx/config.json b/mlx_convert/gigaam-v3-rnnt-mlx/config.json new file mode 100644 index 0000000..d0b84eb --- /dev/null +++ b/mlx_convert/gigaam-v3-rnnt-mlx/config.json @@ -0,0 +1,77 @@ +{ + "model_type": "gigaam", + "model_name": "v3_rnnt", + "sample_rate": 16000, + "preprocessor": { + "sample_rate": 16000, + "features": 64, + "win_length": 320, + "hop_length": 160, + "n_fft": 320, + "center": false + }, + "encoder": { + "feat_in": 64, + "n_layers": 16, + "d_model": 768, + "subsampling": "conv1d", + "subs_kernel_size": 5, + "subsampling_factor": 4, + "ff_expansion_factor": 4, + "self_attention_model": "rotary", + "pos_emb_max_len": 5000, + "n_heads": 16, + "conv_kernel_size": 5, + "conv_norm_type": "layer_norm" + }, + "head_type": "rnnt", + "head": { + "decoder": { + "pred_hidden": 320, + "pred_rnn_layers": 1, + "num_classes": 34 + }, + "joint": { + "enc_hidden": 768, + "pred_hidden": 320, + "joint_hidden": 320, + "num_classes": 34 + } + }, + "vocabulary": [ + " ", + "а", + "б", + "в", + "г", + "д", + "е", + "ж", + "з", + "и", + "й", + "к", + "л", + "м", + "н", + "о", + "п", + "р", + "с", + "т", + "у", + "ф", + "х", + "ц", + "ч", + "ш", + "щ", + "ъ", + "ы", + "ь", + "э", + "ю", + "я" + ], + "tokenizer_model": "tokenizer.model" +} \ No newline at end of file diff --git a/mlx_convert/step1_inspect_weights.py b/mlx_convert/step1_inspect_weights.py new file mode 100644 index 0000000..3970f0e --- /dev/null +++ b/mlx_convert/step1_inspect_weights.py @@ -0,0 +1,35 @@ +""" +Step 1: Load the GigaAM v3_ctc checkpoint and inspect weight keys/shapes. +This helps us understand the exact mapping needed for MLX conversion. +""" +import sys +sys.path.insert(0, "..") + +import warnings +import torch + +# Download the model using GigaAM's own download mechanism +import gigaam + +model = gigaam.load_model("v3_ctc", device="cpu", fp16_encoder=False, use_flash=False) + +print("=" * 80) +print("Model type:", type(model).__name__) +print("=" * 80) + +# Get state dict +sd = model.state_dict() +print(f"\nTotal parameters: {sum(p.numel() for p in model.parameters()):,}") +print(f"Total keys: {len(sd)}") +print() + +# Print all keys with shapes +for k, v in sorted(sd.items()): + print(f" {k:70s} {str(list(v.shape)):>25s} {v.dtype}") + +# Also print the config +print("\n" + "=" * 80) +print("Model config:") +print("=" * 80) +from omegaconf import OmegaConf +print(OmegaConf.to_yaml(model.cfg)) diff --git a/mlx_convert/test_fp32.py b/mlx_convert/test_fp32.py new file mode 100644 index 0000000..29f4b03 --- /dev/null +++ b/mlx_convert/test_fp32.py @@ -0,0 +1,26 @@ +"""Test GigaAM MLX model in float32.""" +import time +import sys +sys.path.insert(0, ".") + +from gigaam_mlx import load_model, load_audio + +print("Loading GigaAM MLX fp32 model...") +model = load_model("./gigaam-v3-ctc-mlx-fp32") + +audio = load_audio("test_ru.wav") + +# warmup +_ = model.transcribe(audio) + +t0 = time.time() +result = model.transcribe(audio) +elapsed = time.time() - t0 + +print(f"GigaAM v3_ctc (MLX fp32): {result}") +print(f"Time: {elapsed:.2f}s") + +# Compare with reference +ref = "ничьих не требуя похвал счастлив уж я надеждой сладкой что дева с трепетом любви посмотрит может быть украдкой на песни грешные мои у лукоморья дуб зеленый" +print(f"Reference: {ref}") +print(f"Match: {result == ref}") diff --git a/mlx_convert/test_mlx_gigaam.py b/mlx_convert/test_mlx_gigaam.py new file mode 100644 index 0000000..7427e51 --- /dev/null +++ b/mlx_convert/test_mlx_gigaam.py @@ -0,0 +1,25 @@ +"""Test GigaAM MLX model.""" +import time +import sys + +sys.path.insert(0, ".") + +from gigaam_mlx import load_model, load_audio + +print("Loading GigaAM MLX model...") +t0 = time.time() +model = load_model("./gigaam-v3-ctc-mlx") +load_time = time.time() - t0 +print(f"Model loaded in {load_time:.2f}s") + +print("\nLoading audio...") +audio = load_audio("test_ru.wav") +print(f"Audio: {audio.shape[0]} samples ({audio.shape[0]/16000:.2f}s)") + +print("\nTranscribing...") +t0 = time.time() +result = model.transcribe(audio) +transcribe_time = time.time() - t0 + +print(f"\nGigaAM v3_ctc (MLX): {result}") +print(f"Transcription time: {transcribe_time:.2f}s") diff --git a/mlx_convert/test_pytorch_gigaam.py b/mlx_convert/test_pytorch_gigaam.py new file mode 100644 index 0000000..007ca33 --- /dev/null +++ b/mlx_convert/test_pytorch_gigaam.py @@ -0,0 +1,13 @@ +"""Test original PyTorch GigaAM for baseline comparison.""" +import sys, time +sys.path.insert(0, "..") +import gigaam + +model = gigaam.load_model("v3_ctc", device="cpu", fp16_encoder=False, use_flash=False) + +t0 = time.time() +result = model.transcribe("test_ru.wav") +elapsed = time.time() - t0 + +print(f"GigaAM v3_ctc (PyTorch): {result}") +print(f"Time: {elapsed:.2f}s") diff --git a/patch_rnnt.py b/patch_rnnt.py new file mode 100644 index 0000000..c70ffdc --- /dev/null +++ b/patch_rnnt.py @@ -0,0 +1,48 @@ +with open("gigaam_mlx.py", "r") as f: + content = f.read() + +rnnt_code = """ +class RNNTJoint(nn.Module): + def __init__(self, enc_hidden: int, pred_hidden: int, joint_hidden: int, num_classes: int): + super().__init__() + self.enc = nn.Linear(enc_hidden, joint_hidden) + self.pred = nn.Linear(pred_hidden, joint_hidden) + self.joint_net_linear = nn.Linear(joint_hidden, num_classes) + + def __call__(self, encoder_out: mx.array, decoder_out: mx.array) -> mx.array: + enc = mx.expand_dims(self.enc(encoder_out), 2) + pred = mx.expand_dims(self.pred(decoder_out), 1) + joint_rep = mx.maximum(enc + pred, 0.0) + return self.joint_net_linear(joint_rep) + +class RNNTDecoder(nn.Module): + def __init__(self, num_classes: int, pred_hidden: int): + super().__init__() + self.blank_id = num_classes - 1 + self.pred_hidden = pred_hidden + self.embed = nn.Embedding(num_classes, pred_hidden) + self.lstm = nn.LSTM(pred_hidden, pred_hidden) + + def predict(self, x: Optional[int], state: Optional[Tuple[mx.array, mx.array]], batch_size: int = 1): + if x is not None: + emb = self.embed(mx.array([[x]])) + else: + emb = mx.zeros((batch_size, 1, self.pred_hidden)) + + h, c = state if state is not None else (None, None) + out, cell = self.lstm(emb, hidden=h, cell=c) + return out, (out[:, -1, :], cell[:, -1, :]) + +class RNNTHead(nn.Module): + def __init__(self, cfg: GigaAMConfig): + super().__init__() + self.decoder = RNNTDecoder(cfg.num_classes, cfg.rnnt_pred_hidden) + self.joint = RNNTJoint(cfg.d_model, cfg.rnnt_pred_hidden, cfg.rnnt_joint_hidden, cfg.num_classes) + +""" + +# Insert before CTCHead +content = content.replace("class CTCHead(nn.Module):", rnnt_code + "\nclass CTCHead(nn.Module):") + +with open("gigaam_mlx.py", "w") as f: + f.write(content) diff --git a/uv.lock b/uv.lock new file mode 100644 index 0000000..0b10279 --- /dev/null +++ b/uv.lock @@ -0,0 +1,4392 @@ +version = 1 +revision = 3 +requires-python = ">=3.10" +resolution-markers = [ + "python_full_version >= '3.14' and sys_platform == 'win32'", + "python_full_version >= '3.14' and sys_platform == 'emscripten'", + "python_full_version >= '3.14' and sys_platform != 'emscripten' and sys_platform != 'win32'", + "python_full_version == '3.13.*' and sys_platform == 'win32'", + "python_full_version == '3.13.*' and sys_platform == 'emscripten'", + "python_full_version == '3.13.*' and sys_platform != 'emscripten' and sys_platform != 'win32'", + "python_full_version == '3.12.*' and sys_platform == 'win32'", + "python_full_version == '3.12.*' and sys_platform == 'emscripten'", + "python_full_version == '3.12.*' and sys_platform != 'emscripten' and sys_platform != 'win32'", + "python_full_version == '3.11.*' and sys_platform == 'win32'", + "python_full_version == '3.11.*' and sys_platform == 'emscripten'", + "python_full_version == '3.11.*' and sys_platform != 'emscripten' and sys_platform != 'win32'", + "python_full_version < '3.11'", +] + +[[package]] +name = "aiohappyeyeballs" +version = "2.6.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/26/30/f84a107a9c4331c14b2b586036f40965c128aa4fee4dda5d3d51cb14ad54/aiohappyeyeballs-2.6.1.tar.gz", hash = "sha256:c3f9d0113123803ccadfdf3f0faa505bc78e6a72d1cc4806cbd719826e943558", size = 22760, upload-time = "2025-03-12T01:42:48.764Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/0f/15/5bf3b99495fb160b63f95972b81750f18f7f4e02ad051373b669d17d44f2/aiohappyeyeballs-2.6.1-py3-none-any.whl", hash = "sha256:f349ba8f4b75cb25c99c5c2d84e997e485204d2902a9597802b0371f09331fb8", size = 15265, upload-time = "2025-03-12T01:42:47.083Z" }, +] + +[[package]] +name = "aiohttp" +version = "3.13.3" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "aiohappyeyeballs" }, + { name = "aiosignal" }, + { name = "async-timeout", marker = "python_full_version < '3.11'" }, + { name = "attrs" }, + { name = "frozenlist" }, + { name = "multidict" }, + { name = "propcache" }, + { name = "yarl" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/50/42/32cf8e7704ceb4481406eb87161349abb46a57fee3f008ba9cb610968646/aiohttp-3.13.3.tar.gz", hash = "sha256:a949eee43d3782f2daae4f4a2819b2cb9b0c5d3b7f7a927067cc84dafdbb9f88", size = 7844556, upload-time = "2026-01-03T17:33:05.204Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/36/d6/5aec9313ee6ea9c7cde8b891b69f4ff4001416867104580670a31daeba5b/aiohttp-3.13.3-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:d5a372fd5afd301b3a89582817fdcdb6c34124787c70dbcc616f259013e7eef7", size = 738950, upload-time = "2026-01-03T17:29:13.002Z" }, + { url = "https://files.pythonhosted.org/packages/68/03/8fa90a7e6d11ff20a18837a8e2b5dd23db01aabc475aa9271c8ad33299f5/aiohttp-3.13.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:147e422fd1223005c22b4fe080f5d93ced44460f5f9c105406b753612b587821", size = 496099, upload-time = "2026-01-03T17:29:15.268Z" }, + { url = "https://files.pythonhosted.org/packages/d2/23/b81f744d402510a8366b74eb420fc0cc1170d0c43daca12d10814df85f10/aiohttp-3.13.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:859bd3f2156e81dd01432f5849fc73e2243d4a487c4fd26609b1299534ee1845", size = 491072, upload-time = "2026-01-03T17:29:16.922Z" }, + { url = "https://files.pythonhosted.org/packages/d5/e1/56d1d1c0dd334cd203dd97706ce004c1aa24b34a813b0b8daf3383039706/aiohttp-3.13.3-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:dca68018bf48c251ba17c72ed479f4dafe9dbd5a73707ad8d28a38d11f3d42af", size = 1671588, upload-time = "2026-01-03T17:29:18.539Z" }, + { url = "https://files.pythonhosted.org/packages/5f/34/8d7f962604f4bc2b4e39eb1220dac7d4e4cba91fb9ba0474b4ecd67db165/aiohttp-3.13.3-cp310-cp310-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:fee0c6bc7db1de362252affec009707a17478a00ec69f797d23ca256e36d5940", size = 1640334, upload-time = "2026-01-03T17:29:21.028Z" }, + { url = "https://files.pythonhosted.org/packages/94/1d/fcccf2c668d87337ddeef9881537baee13c58d8f01f12ba8a24215f2b804/aiohttp-3.13.3-cp310-cp310-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:c048058117fd649334d81b4b526e94bde3ccaddb20463a815ced6ecbb7d11160", size = 1722656, upload-time = "2026-01-03T17:29:22.531Z" }, + { url = "https://files.pythonhosted.org/packages/aa/98/c6f3b081c4c606bc1e5f2ec102e87d6411c73a9ef3616fea6f2d5c98c062/aiohttp-3.13.3-cp310-cp310-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:215a685b6fbbfcf71dfe96e3eba7a6f58f10da1dfdf4889c7dd856abe430dca7", size = 1817625, upload-time = "2026-01-03T17:29:24.276Z" }, + { url = "https://files.pythonhosted.org/packages/2c/c0/cfcc3d2e11b477f86e1af2863f3858c8850d751ce8dc39c4058a072c9e54/aiohttp-3.13.3-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:de2c184bb1fe2cbd2cefba613e9db29a5ab559323f994b6737e370d3da0ac455", size = 1672604, upload-time = "2026-01-03T17:29:26.099Z" }, + { url = "https://files.pythonhosted.org/packages/1e/77/6b4ffcbcac4c6a5d041343a756f34a6dd26174ae07f977a64fe028dda5b0/aiohttp-3.13.3-cp310-cp310-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:75ca857eba4e20ce9f546cd59c7007b33906a4cd48f2ff6ccf1ccfc3b646f279", size = 1554370, upload-time = "2026-01-03T17:29:28.121Z" }, + { url = "https://files.pythonhosted.org/packages/f2/f0/e3ddfa93f17d689dbe014ba048f18e0c9f9b456033b70e94349a2e9048be/aiohttp-3.13.3-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:81e97251d9298386c2b7dbeb490d3d1badbdc69107fb8c9299dd04eb39bddc0e", size = 1642023, upload-time = "2026-01-03T17:29:30.002Z" }, + { url = "https://files.pythonhosted.org/packages/eb/45/c14019c9ec60a8e243d06d601b33dcc4fd92379424bde3021725859d7f99/aiohttp-3.13.3-cp310-cp310-musllinux_1_2_armv7l.whl", hash = "sha256:c0e2d366af265797506f0283487223146af57815b388623f0357ef7eac9b209d", size = 1649680, upload-time = "2026-01-03T17:29:31.782Z" }, + { url = "https://files.pythonhosted.org/packages/9c/fd/09c9451dae5aa5c5ed756df95ff9ef549d45d4be663bafd1e4954fd836f0/aiohttp-3.13.3-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:4e239d501f73d6db1522599e14b9b321a7e3b1de66ce33d53a765d975e9f4808", size = 1692407, upload-time = "2026-01-03T17:29:33.392Z" }, + { url = "https://files.pythonhosted.org/packages/a6/81/938bc2ec33c10efd6637ccb3d22f9f3160d08e8f3aa2587a2c2d5ab578eb/aiohttp-3.13.3-cp310-cp310-musllinux_1_2_riscv64.whl", hash = "sha256:0db318f7a6f065d84cb1e02662c526294450b314a02bd9e2a8e67f0d8564ce40", size = 1543047, upload-time = "2026-01-03T17:29:34.855Z" }, + { url = "https://files.pythonhosted.org/packages/f7/23/80488ee21c8d567c83045e412e1d9b7077d27171591a4eb7822586e8c06a/aiohttp-3.13.3-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:bfc1cc2fe31a6026a8a88e4ecfb98d7f6b1fec150cfd708adbfd1d2f42257c29", size = 1715264, upload-time = "2026-01-03T17:29:36.389Z" }, + { url = "https://files.pythonhosted.org/packages/e2/83/259a8da6683182768200b368120ab3deff5370bed93880fb9a3a86299f34/aiohttp-3.13.3-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:af71fff7bac6bb7508956696dce8f6eec2bbb045eceb40343944b1ae62b5ef11", size = 1657275, upload-time = "2026-01-03T17:29:38.162Z" }, + { url = "https://files.pythonhosted.org/packages/3f/4f/2c41f800a0b560785c10fb316216ac058c105f9be50bdc6a285de88db625/aiohttp-3.13.3-cp310-cp310-win32.whl", hash = "sha256:37da61e244d1749798c151421602884db5270faf479cf0ef03af0ff68954c9dd", size = 434053, upload-time = "2026-01-03T17:29:40.074Z" }, + { url = "https://files.pythonhosted.org/packages/80/df/29cd63c7ecfdb65ccc12f7d808cac4fa2a19544660c06c61a4a48462de0c/aiohttp-3.13.3-cp310-cp310-win_amd64.whl", hash = "sha256:7e63f210bc1b57ef699035f2b4b6d9ce096b5914414a49b0997c839b2bd2223c", size = 456687, upload-time = "2026-01-03T17:29:41.819Z" }, + { url = "https://files.pythonhosted.org/packages/f1/4c/a164164834f03924d9a29dc3acd9e7ee58f95857e0b467f6d04298594ebb/aiohttp-3.13.3-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:5b6073099fb654e0a068ae678b10feff95c5cae95bbfcbfa7af669d361a8aa6b", size = 746051, upload-time = "2026-01-03T17:29:43.287Z" }, + { url = "https://files.pythonhosted.org/packages/82/71/d5c31390d18d4f58115037c432b7e0348c60f6f53b727cad33172144a112/aiohttp-3.13.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:1cb93e166e6c28716c8c6aeb5f99dfb6d5ccf482d29fe9bf9a794110e6d0ab64", size = 499234, upload-time = "2026-01-03T17:29:44.822Z" }, + { url = "https://files.pythonhosted.org/packages/0e/c9/741f8ac91e14b1d2e7100690425a5b2b919a87a5075406582991fb7de920/aiohttp-3.13.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:28e027cf2f6b641693a09f631759b4d9ce9165099d2b5d92af9bd4e197690eea", size = 494979, upload-time = "2026-01-03T17:29:46.405Z" }, + { url = "https://files.pythonhosted.org/packages/75/b5/31d4d2e802dfd59f74ed47eba48869c1c21552c586d5e81a9d0d5c2ad640/aiohttp-3.13.3-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:3b61b7169ababd7802f9568ed96142616a9118dd2be0d1866e920e77ec8fa92a", size = 1748297, upload-time = "2026-01-03T17:29:48.083Z" }, + { url = "https://files.pythonhosted.org/packages/1a/3e/eefad0ad42959f226bb79664826883f2687d602a9ae2941a18e0484a74d3/aiohttp-3.13.3-cp311-cp311-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:80dd4c21b0f6237676449c6baaa1039abae86b91636b6c91a7f8e61c87f89540", size = 1707172, upload-time = "2026-01-03T17:29:49.648Z" }, + { url = "https://files.pythonhosted.org/packages/c5/3a/54a64299fac2891c346cdcf2aa6803f994a2e4beeaf2e5a09dcc54acc842/aiohttp-3.13.3-cp311-cp311-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:65d2ccb7eabee90ce0503c17716fc77226be026dcc3e65cce859a30db715025b", size = 1805405, upload-time = "2026-01-03T17:29:51.244Z" }, + { url = "https://files.pythonhosted.org/packages/6c/70/ddc1b7169cf64075e864f64595a14b147a895a868394a48f6a8031979038/aiohttp-3.13.3-cp311-cp311-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:5b179331a481cb5529fca8b432d8d3c7001cb217513c94cd72d668d1248688a3", size = 1899449, upload-time = "2026-01-03T17:29:53.938Z" }, + { url = "https://files.pythonhosted.org/packages/a1/7e/6815aab7d3a56610891c76ef79095677b8b5be6646aaf00f69b221765021/aiohttp-3.13.3-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:9d4c940f02f49483b18b079d1c27ab948721852b281f8b015c058100e9421dd1", size = 1748444, upload-time = "2026-01-03T17:29:55.484Z" }, + { url = "https://files.pythonhosted.org/packages/6b/f2/073b145c4100da5511f457dc0f7558e99b2987cf72600d42b559db856fbc/aiohttp-3.13.3-cp311-cp311-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:f9444f105664c4ce47a2a7171a2418bce5b7bae45fb610f4e2c36045d85911d3", size = 1606038, upload-time = "2026-01-03T17:29:57.179Z" }, + { url = "https://files.pythonhosted.org/packages/0a/c1/778d011920cae03ae01424ec202c513dc69243cf2db303965615b81deeea/aiohttp-3.13.3-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:694976222c711d1d00ba131904beb60534f93966562f64440d0c9d41b8cdb440", size = 1724156, upload-time = "2026-01-03T17:29:58.914Z" }, + { url = "https://files.pythonhosted.org/packages/0e/cb/3419eabf4ec1e9ec6f242c32b689248365a1cf621891f6f0386632525494/aiohttp-3.13.3-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:f33ed1a2bf1997a36661874b017f5c4b760f41266341af36febaf271d179f6d7", size = 1722340, upload-time = "2026-01-03T17:30:01.962Z" }, + { url = "https://files.pythonhosted.org/packages/7a/e5/76cf77bdbc435bf233c1f114edad39ed4177ccbfab7c329482b179cff4f4/aiohttp-3.13.3-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:e636b3c5f61da31a92bf0d91da83e58fdfa96f178ba682f11d24f31944cdd28c", size = 1783041, upload-time = "2026-01-03T17:30:03.609Z" }, + { url = "https://files.pythonhosted.org/packages/9d/d4/dd1ca234c794fd29c057ce8c0566b8ef7fd6a51069de5f06fa84b9a1971c/aiohttp-3.13.3-cp311-cp311-musllinux_1_2_riscv64.whl", hash = "sha256:5d2d94f1f5fcbe40838ac51a6ab5704a6f9ea42e72ceda48de5e6b898521da51", size = 1596024, upload-time = "2026-01-03T17:30:05.132Z" }, + { url = "https://files.pythonhosted.org/packages/55/58/4345b5f26661a6180afa686c473620c30a66afdf120ed3dd545bbc809e85/aiohttp-3.13.3-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:2be0e9ccf23e8a94f6f0650ce06042cefc6ac703d0d7ab6c7a917289f2539ad4", size = 1804590, upload-time = "2026-01-03T17:30:07.135Z" }, + { url = "https://files.pythonhosted.org/packages/7b/06/05950619af6c2df7e0a431d889ba2813c9f0129cec76f663e547a5ad56f2/aiohttp-3.13.3-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:9af5e68ee47d6534d36791bbe9b646d2a7c7deb6fc24d7943628edfbb3581f29", size = 1740355, upload-time = "2026-01-03T17:30:09.083Z" }, + { url = "https://files.pythonhosted.org/packages/3e/80/958f16de79ba0422d7c1e284b2abd0c84bc03394fbe631d0a39ffa10e1eb/aiohttp-3.13.3-cp311-cp311-win32.whl", hash = "sha256:a2212ad43c0833a873d0fb3c63fa1bacedd4cf6af2fee62bf4b739ceec3ab239", size = 433701, upload-time = "2026-01-03T17:30:10.869Z" }, + { url = "https://files.pythonhosted.org/packages/dc/f2/27cdf04c9851712d6c1b99df6821a6623c3c9e55956d4b1e318c337b5a48/aiohttp-3.13.3-cp311-cp311-win_amd64.whl", hash = "sha256:642f752c3eb117b105acbd87e2c143de710987e09860d674e068c4c2c441034f", size = 457678, upload-time = "2026-01-03T17:30:12.719Z" }, + { url = "https://files.pythonhosted.org/packages/a0/be/4fc11f202955a69e0db803a12a062b8379c970c7c84f4882b6da17337cc1/aiohttp-3.13.3-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:b903a4dfee7d347e2d87697d0713be59e0b87925be030c9178c5faa58ea58d5c", size = 739732, upload-time = "2026-01-03T17:30:14.23Z" }, + { url = "https://files.pythonhosted.org/packages/97/2c/621d5b851f94fa0bb7430d6089b3aa970a9d9b75196bc93bb624b0db237a/aiohttp-3.13.3-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:a45530014d7a1e09f4a55f4f43097ba0fd155089372e105e4bff4ca76cb1b168", size = 494293, upload-time = "2026-01-03T17:30:15.96Z" }, + { url = "https://files.pythonhosted.org/packages/5d/43/4be01406b78e1be8320bb8316dc9c42dbab553d281c40364e0f862d5661c/aiohttp-3.13.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:27234ef6d85c914f9efeb77ff616dbf4ad2380be0cda40b4db086ffc7ddd1b7d", size = 493533, upload-time = "2026-01-03T17:30:17.431Z" }, + { url = "https://files.pythonhosted.org/packages/8d/a8/5a35dc56a06a2c90d4742cbf35294396907027f80eea696637945a106f25/aiohttp-3.13.3-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:d32764c6c9aafb7fb55366a224756387cd50bfa720f32b88e0e6fa45b27dcf29", size = 1737839, upload-time = "2026-01-03T17:30:19.422Z" }, + { url = "https://files.pythonhosted.org/packages/bf/62/4b9eeb331da56530bf2e198a297e5303e1c1ebdceeb00fe9b568a65c5a0c/aiohttp-3.13.3-cp312-cp312-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:b1a6102b4d3ebc07dad44fbf07b45bb600300f15b552ddf1851b5390202ea2e3", size = 1703932, upload-time = "2026-01-03T17:30:21.756Z" }, + { url = "https://files.pythonhosted.org/packages/7c/f6/af16887b5d419e6a367095994c0b1332d154f647e7dc2bd50e61876e8e3d/aiohttp-3.13.3-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:c014c7ea7fb775dd015b2d3137378b7be0249a448a1612268b5a90c2d81de04d", size = 1771906, upload-time = "2026-01-03T17:30:23.932Z" }, + { url = "https://files.pythonhosted.org/packages/ce/83/397c634b1bcc24292fa1e0c7822800f9f6569e32934bdeef09dae7992dfb/aiohttp-3.13.3-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:2b8d8ddba8f95ba17582226f80e2de99c7a7948e66490ef8d947e272a93e9463", size = 1871020, upload-time = "2026-01-03T17:30:26Z" }, + { url = "https://files.pythonhosted.org/packages/86/f6/a62cbbf13f0ac80a70f71b1672feba90fdb21fd7abd8dbf25c0105fb6fa3/aiohttp-3.13.3-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:9ae8dd55c8e6c4257eae3a20fd2c8f41edaea5992ed67156642493b8daf3cecc", size = 1755181, upload-time = "2026-01-03T17:30:27.554Z" }, + { url = "https://files.pythonhosted.org/packages/0a/87/20a35ad487efdd3fba93d5843efdfaa62d2f1479eaafa7453398a44faf13/aiohttp-3.13.3-cp312-cp312-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:01ad2529d4b5035578f5081606a465f3b814c542882804e2e8cda61adf5c71bf", size = 1561794, upload-time = "2026-01-03T17:30:29.254Z" }, + { url = "https://files.pythonhosted.org/packages/de/95/8fd69a66682012f6716e1bc09ef8a1a2a91922c5725cb904689f112309c4/aiohttp-3.13.3-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:bb4f7475e359992b580559e008c598091c45b5088f28614e855e42d39c2f1033", size = 1697900, upload-time = "2026-01-03T17:30:31.033Z" }, + { url = "https://files.pythonhosted.org/packages/e5/66/7b94b3b5ba70e955ff597672dad1691333080e37f50280178967aff68657/aiohttp-3.13.3-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:c19b90316ad3b24c69cd78d5c9b4f3aa4497643685901185b65166293d36a00f", size = 1728239, upload-time = "2026-01-03T17:30:32.703Z" }, + { url = "https://files.pythonhosted.org/packages/47/71/6f72f77f9f7d74719692ab65a2a0252584bf8d5f301e2ecb4c0da734530a/aiohttp-3.13.3-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:96d604498a7c782cb15a51c406acaea70d8c027ee6b90c569baa6e7b93073679", size = 1740527, upload-time = "2026-01-03T17:30:34.695Z" }, + { url = "https://files.pythonhosted.org/packages/fa/b4/75ec16cbbd5c01bdaf4a05b19e103e78d7ce1ef7c80867eb0ace42ff4488/aiohttp-3.13.3-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:084911a532763e9d3dd95adf78a78f4096cd5f58cdc18e6fdbc1b58417a45423", size = 1554489, upload-time = "2026-01-03T17:30:36.864Z" }, + { url = "https://files.pythonhosted.org/packages/52/8f/bc518c0eea29f8406dcf7ed1f96c9b48e3bc3995a96159b3fc11f9e08321/aiohttp-3.13.3-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:7a4a94eb787e606d0a09404b9c38c113d3b099d508021faa615d70a0131907ce", size = 1767852, upload-time = "2026-01-03T17:30:39.433Z" }, + { url = "https://files.pythonhosted.org/packages/9d/f2/a07a75173124f31f11ea6f863dc44e6f09afe2bca45dd4e64979490deab1/aiohttp-3.13.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:87797e645d9d8e222e04160ee32aa06bc5c163e8499f24db719e7852ec23093a", size = 1722379, upload-time = "2026-01-03T17:30:41.081Z" }, + { url = "https://files.pythonhosted.org/packages/3c/4a/1a3fee7c21350cac78e5c5cef711bac1b94feca07399f3d406972e2d8fcd/aiohttp-3.13.3-cp312-cp312-win32.whl", hash = "sha256:b04be762396457bef43f3597c991e192ee7da460a4953d7e647ee4b1c28e7046", size = 428253, upload-time = "2026-01-03T17:30:42.644Z" }, + { url = "https://files.pythonhosted.org/packages/d9/b7/76175c7cb4eb73d91ad63c34e29fc4f77c9386bba4a65b53ba8e05ee3c39/aiohttp-3.13.3-cp312-cp312-win_amd64.whl", hash = "sha256:e3531d63d3bdfa7e3ac5e9b27b2dd7ec9df3206a98e0b3445fa906f233264c57", size = 455407, upload-time = "2026-01-03T17:30:44.195Z" }, + { url = "https://files.pythonhosted.org/packages/97/8a/12ca489246ca1faaf5432844adbfce7ff2cc4997733e0af120869345643a/aiohttp-3.13.3-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:5dff64413671b0d3e7d5918ea490bdccb97a4ad29b3f311ed423200b2203e01c", size = 734190, upload-time = "2026-01-03T17:30:45.832Z" }, + { url = "https://files.pythonhosted.org/packages/32/08/de43984c74ed1fca5c014808963cc83cb00d7bb06af228f132d33862ca76/aiohttp-3.13.3-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:87b9aab6d6ed88235aa2970294f496ff1a1f9adcd724d800e9b952395a80ffd9", size = 491783, upload-time = "2026-01-03T17:30:47.466Z" }, + { url = "https://files.pythonhosted.org/packages/17/f8/8dd2cf6112a5a76f81f81a5130c57ca829d101ad583ce57f889179accdda/aiohttp-3.13.3-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:425c126c0dc43861e22cb1c14ba4c8e45d09516d0a3ae0a3f7494b79f5f233a3", size = 490704, upload-time = "2026-01-03T17:30:49.373Z" }, + { url = "https://files.pythonhosted.org/packages/6d/40/a46b03ca03936f832bc7eaa47cfbb1ad012ba1be4790122ee4f4f8cba074/aiohttp-3.13.3-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:7f9120f7093c2a32d9647abcaf21e6ad275b4fbec5b55969f978b1a97c7c86bf", size = 1720652, upload-time = "2026-01-03T17:30:50.974Z" }, + { url = "https://files.pythonhosted.org/packages/f7/7e/917fe18e3607af92657e4285498f500dca797ff8c918bd7d90b05abf6c2a/aiohttp-3.13.3-cp313-cp313-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:697753042d57f4bf7122cab985bf15d0cef23c770864580f5af4f52023a56bd6", size = 1692014, upload-time = "2026-01-03T17:30:52.729Z" }, + { url = "https://files.pythonhosted.org/packages/71/b6/cefa4cbc00d315d68973b671cf105b21a609c12b82d52e5d0c9ae61d2a09/aiohttp-3.13.3-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:6de499a1a44e7de70735d0b39f67c8f25eb3d91eb3103be99ca0fa882cdd987d", size = 1759777, upload-time = "2026-01-03T17:30:54.537Z" }, + { url = "https://files.pythonhosted.org/packages/fb/e3/e06ee07b45e59e6d81498b591fc589629be1553abb2a82ce33efe2a7b068/aiohttp-3.13.3-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:37239e9f9a7ea9ac5bf6b92b0260b01f8a22281996da609206a84df860bc1261", size = 1861276, upload-time = "2026-01-03T17:30:56.512Z" }, + { url = "https://files.pythonhosted.org/packages/7c/24/75d274228acf35ceeb2850b8ce04de9dd7355ff7a0b49d607ee60c29c518/aiohttp-3.13.3-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:f76c1e3fe7d7c8afad7ed193f89a292e1999608170dcc9751a7462a87dfd5bc0", size = 1743131, upload-time = "2026-01-03T17:30:58.256Z" }, + { url = "https://files.pythonhosted.org/packages/04/98/3d21dde21889b17ca2eea54fdcff21b27b93f45b7bb94ca029c31ab59dc3/aiohttp-3.13.3-cp313-cp313-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:fc290605db2a917f6e81b0e1e0796469871f5af381ce15c604a3c5c7e51cb730", size = 1556863, upload-time = "2026-01-03T17:31:00.445Z" }, + { url = "https://files.pythonhosted.org/packages/9e/84/da0c3ab1192eaf64782b03971ab4055b475d0db07b17eff925e8c93b3aa5/aiohttp-3.13.3-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:4021b51936308aeea0367b8f006dc999ca02bc118a0cc78c303f50a2ff6afb91", size = 1682793, upload-time = "2026-01-03T17:31:03.024Z" }, + { url = "https://files.pythonhosted.org/packages/ff/0f/5802ada182f575afa02cbd0ec5180d7e13a402afb7c2c03a9aa5e5d49060/aiohttp-3.13.3-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:49a03727c1bba9a97d3e93c9f93ca03a57300f484b6e935463099841261195d3", size = 1716676, upload-time = "2026-01-03T17:31:04.842Z" }, + { url = "https://files.pythonhosted.org/packages/3f/8c/714d53bd8b5a4560667f7bbbb06b20c2382f9c7847d198370ec6526af39c/aiohttp-3.13.3-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:3d9908a48eb7416dc1f4524e69f1d32e5d90e3981e4e37eb0aa1cd18f9cfa2a4", size = 1733217, upload-time = "2026-01-03T17:31:06.868Z" }, + { url = "https://files.pythonhosted.org/packages/7d/79/e2176f46d2e963facea939f5be2d26368ce543622be6f00a12844d3c991f/aiohttp-3.13.3-cp313-cp313-musllinux_1_2_riscv64.whl", hash = "sha256:2712039939ec963c237286113c68dbad80a82a4281543f3abf766d9d73228998", size = 1552303, upload-time = "2026-01-03T17:31:08.958Z" }, + { url = "https://files.pythonhosted.org/packages/ab/6a/28ed4dea1759916090587d1fe57087b03e6c784a642b85ef48217b0277ae/aiohttp-3.13.3-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:7bfdc049127717581866fa4708791220970ce291c23e28ccf3922c700740fdc0", size = 1763673, upload-time = "2026-01-03T17:31:10.676Z" }, + { url = "https://files.pythonhosted.org/packages/e8/35/4a3daeb8b9fab49240d21c04d50732313295e4bd813a465d840236dd0ce1/aiohttp-3.13.3-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:8057c98e0c8472d8846b9c79f56766bcc57e3e8ac7bfd510482332366c56c591", size = 1721120, upload-time = "2026-01-03T17:31:12.575Z" }, + { url = "https://files.pythonhosted.org/packages/bc/9f/d643bb3c5fb99547323e635e251c609fbbc660d983144cfebec529e09264/aiohttp-3.13.3-cp313-cp313-win32.whl", hash = "sha256:1449ceddcdbcf2e0446957863af03ebaaa03f94c090f945411b61269e2cb5daf", size = 427383, upload-time = "2026-01-03T17:31:14.382Z" }, + { url = "https://files.pythonhosted.org/packages/4e/f1/ab0395f8a79933577cdd996dd2f9aa6014af9535f65dddcf88204682fe62/aiohttp-3.13.3-cp313-cp313-win_amd64.whl", hash = "sha256:693781c45a4033d31d4187d2436f5ac701e7bbfe5df40d917736108c1cc7436e", size = 453899, upload-time = "2026-01-03T17:31:15.958Z" }, + { url = "https://files.pythonhosted.org/packages/99/36/5b6514a9f5d66f4e2597e40dea2e3db271e023eb7a5d22defe96ba560996/aiohttp-3.13.3-cp314-cp314-macosx_10_13_universal2.whl", hash = "sha256:ea37047c6b367fd4bd632bff8077449b8fa034b69e812a18e0132a00fae6e808", size = 737238, upload-time = "2026-01-03T17:31:17.909Z" }, + { url = "https://files.pythonhosted.org/packages/f7/49/459327f0d5bcd8c6c9ca69e60fdeebc3622861e696490d8674a6d0cb90a6/aiohttp-3.13.3-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:6fc0e2337d1a4c3e6acafda6a78a39d4c14caea625124817420abceed36e2415", size = 492292, upload-time = "2026-01-03T17:31:19.919Z" }, + { url = "https://files.pythonhosted.org/packages/e8/0b/b97660c5fd05d3495b4eb27f2d0ef18dc1dc4eff7511a9bf371397ff0264/aiohttp-3.13.3-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:c685f2d80bb67ca8c3837823ad76196b3694b0159d232206d1e461d3d434666f", size = 493021, upload-time = "2026-01-03T17:31:21.636Z" }, + { url = "https://files.pythonhosted.org/packages/54/d4/438efabdf74e30aeceb890c3290bbaa449780583b1270b00661126b8aae4/aiohttp-3.13.3-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:48e377758516d262bde50c2584fc6c578af272559c409eecbdd2bae1601184d6", size = 1717263, upload-time = "2026-01-03T17:31:23.296Z" }, + { url = "https://files.pythonhosted.org/packages/71/f2/7bddc7fd612367d1459c5bcf598a9e8f7092d6580d98de0e057eb42697ad/aiohttp-3.13.3-cp314-cp314-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:34749271508078b261c4abb1767d42b8d0c0cc9449c73a4df494777dc55f0687", size = 1669107, upload-time = "2026-01-03T17:31:25.334Z" }, + { url = "https://files.pythonhosted.org/packages/00/5a/1aeaecca40e22560f97610a329e0e5efef5e0b5afdf9f857f0d93839ab2e/aiohttp-3.13.3-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:82611aeec80eb144416956ec85b6ca45a64d76429c1ed46ae1b5f86c6e0c9a26", size = 1760196, upload-time = "2026-01-03T17:31:27.394Z" }, + { url = "https://files.pythonhosted.org/packages/f8/f8/0ff6992bea7bd560fc510ea1c815f87eedd745fe035589c71ce05612a19a/aiohttp-3.13.3-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:2fff83cfc93f18f215896e3a190e8e5cb413ce01553901aca925176e7568963a", size = 1843591, upload-time = "2026-01-03T17:31:29.238Z" }, + { url = "https://files.pythonhosted.org/packages/e3/d1/e30e537a15f53485b61f5be525f2157da719819e8377298502aebac45536/aiohttp-3.13.3-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:bbe7d4cecacb439e2e2a8a1a7b935c25b812af7a5fd26503a66dadf428e79ec1", size = 1720277, upload-time = "2026-01-03T17:31:31.053Z" }, + { url = "https://files.pythonhosted.org/packages/84/45/23f4c451d8192f553d38d838831ebbc156907ea6e05557f39563101b7717/aiohttp-3.13.3-cp314-cp314-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:b928f30fe49574253644b1ca44b1b8adbd903aa0da4b9054a6c20fc7f4092a25", size = 1548575, upload-time = "2026-01-03T17:31:32.87Z" }, + { url = "https://files.pythonhosted.org/packages/6a/ed/0a42b127a43712eda7807e7892c083eadfaf8429ca8fb619662a530a3aab/aiohttp-3.13.3-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:7b5e8fe4de30df199155baaf64f2fcd604f4c678ed20910db8e2c66dc4b11603", size = 1679455, upload-time = "2026-01-03T17:31:34.76Z" }, + { url = "https://files.pythonhosted.org/packages/2e/b5/c05f0c2b4b4fe2c9d55e73b6d3ed4fd6c9dc2684b1d81cbdf77e7fad9adb/aiohttp-3.13.3-cp314-cp314-musllinux_1_2_armv7l.whl", hash = "sha256:8542f41a62bcc58fc7f11cf7c90e0ec324ce44950003feb70640fc2a9092c32a", size = 1687417, upload-time = "2026-01-03T17:31:36.699Z" }, + { url = "https://files.pythonhosted.org/packages/c9/6b/915bc5dad66aef602b9e459b5a973529304d4e89ca86999d9d75d80cbd0b/aiohttp-3.13.3-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:5e1d8c8b8f1d91cd08d8f4a3c2b067bfca6ec043d3ff36de0f3a715feeedf926", size = 1729968, upload-time = "2026-01-03T17:31:38.622Z" }, + { url = "https://files.pythonhosted.org/packages/11/3b/e84581290a9520024a08640b63d07673057aec5ca548177a82026187ba73/aiohttp-3.13.3-cp314-cp314-musllinux_1_2_riscv64.whl", hash = "sha256:90455115e5da1c3c51ab619ac57f877da8fd6d73c05aacd125c5ae9819582aba", size = 1545690, upload-time = "2026-01-03T17:31:40.57Z" }, + { url = "https://files.pythonhosted.org/packages/f5/04/0c3655a566c43fd647c81b895dfe361b9f9ad6d58c19309d45cff52d6c3b/aiohttp-3.13.3-cp314-cp314-musllinux_1_2_s390x.whl", hash = "sha256:042e9e0bcb5fba81886c8b4fbb9a09d6b8a00245fd8d88e4d989c1f96c74164c", size = 1746390, upload-time = "2026-01-03T17:31:42.857Z" }, + { url = "https://files.pythonhosted.org/packages/1f/53/71165b26978f719c3419381514c9690bd5980e764a09440a10bb816ea4ab/aiohttp-3.13.3-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:2eb752b102b12a76ca02dff751a801f028b4ffbbc478840b473597fc91a9ed43", size = 1702188, upload-time = "2026-01-03T17:31:44.984Z" }, + { url = "https://files.pythonhosted.org/packages/29/a7/cbe6c9e8e136314fa1980da388a59d2f35f35395948a08b6747baebb6aa6/aiohttp-3.13.3-cp314-cp314-win32.whl", hash = "sha256:b556c85915d8efaed322bf1bdae9486aa0f3f764195a0fb6ee962e5c71ef5ce1", size = 433126, upload-time = "2026-01-03T17:31:47.463Z" }, + { url = "https://files.pythonhosted.org/packages/de/56/982704adea7d3b16614fc5936014e9af85c0e34b58f9046655817f04306e/aiohttp-3.13.3-cp314-cp314-win_amd64.whl", hash = "sha256:9bf9f7a65e7aa20dd764151fb3d616c81088f91f8df39c3893a536e279b4b984", size = 459128, upload-time = "2026-01-03T17:31:49.2Z" }, + { url = "https://files.pythonhosted.org/packages/6c/2a/3c79b638a9c3d4658d345339d22070241ea341ed4e07b5ac60fb0f418003/aiohttp-3.13.3-cp314-cp314t-macosx_10_13_universal2.whl", hash = "sha256:05861afbbec40650d8a07ea324367cb93e9e8cc7762e04dd4405df99fa65159c", size = 769512, upload-time = "2026-01-03T17:31:51.134Z" }, + { url = "https://files.pythonhosted.org/packages/29/b9/3e5014d46c0ab0db8707e0ac2711ed28c4da0218c358a4e7c17bae0d8722/aiohttp-3.13.3-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:2fc82186fadc4a8316768d61f3722c230e2c1dcab4200d52d2ebdf2482e47592", size = 506444, upload-time = "2026-01-03T17:31:52.85Z" }, + { url = "https://files.pythonhosted.org/packages/90/03/c1d4ef9a054e151cd7839cdc497f2638f00b93cbe8043983986630d7a80c/aiohttp-3.13.3-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:0add0900ff220d1d5c5ebbf99ed88b0c1bbf87aa7e4262300ed1376a6b13414f", size = 510798, upload-time = "2026-01-03T17:31:54.91Z" }, + { url = "https://files.pythonhosted.org/packages/ea/76/8c1e5abbfe8e127c893fe7ead569148a4d5a799f7cf958d8c09f3eedf097/aiohttp-3.13.3-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:568f416a4072fbfae453dcf9a99194bbb8bdeab718e08ee13dfa2ba0e4bebf29", size = 1868835, upload-time = "2026-01-03T17:31:56.733Z" }, + { url = "https://files.pythonhosted.org/packages/8e/ac/984c5a6f74c363b01ff97adc96a3976d9c98940b8969a1881575b279ac5d/aiohttp-3.13.3-cp314-cp314t-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:add1da70de90a2569c5e15249ff76a631ccacfe198375eead4aadf3b8dc849dc", size = 1720486, upload-time = "2026-01-03T17:31:58.65Z" }, + { url = "https://files.pythonhosted.org/packages/b2/9a/b7039c5f099c4eb632138728828b33428585031a1e658d693d41d07d89d1/aiohttp-3.13.3-cp314-cp314t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:10b47b7ba335d2e9b1239fa571131a87e2d8ec96b333e68b2a305e7a98b0bae2", size = 1847951, upload-time = "2026-01-03T17:32:00.989Z" }, + { url = "https://files.pythonhosted.org/packages/3c/02/3bec2b9a1ba3c19ff89a43a19324202b8eb187ca1e928d8bdac9bbdddebd/aiohttp-3.13.3-cp314-cp314t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:3dd4dce1c718e38081c8f35f323209d4c1df7d4db4bab1b5c88a6b4d12b74587", size = 1941001, upload-time = "2026-01-03T17:32:03.122Z" }, + { url = "https://files.pythonhosted.org/packages/37/df/d879401cedeef27ac4717f6426c8c36c3091c6e9f08a9178cc87549c537f/aiohttp-3.13.3-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:34bac00a67a812570d4a460447e1e9e06fae622946955f939051e7cc895cfab8", size = 1797246, upload-time = "2026-01-03T17:32:05.255Z" }, + { url = "https://files.pythonhosted.org/packages/8d/15/be122de1f67e6953add23335c8ece6d314ab67c8bebb3f181063010795a7/aiohttp-3.13.3-cp314-cp314t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:a19884d2ee70b06d9204b2727a7b9f983d0c684c650254679e716b0b77920632", size = 1627131, upload-time = "2026-01-03T17:32:07.607Z" }, + { url = "https://files.pythonhosted.org/packages/12/12/70eedcac9134cfa3219ab7af31ea56bc877395b1ac30d65b1bc4b27d0438/aiohttp-3.13.3-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:5f8ca7f2bb6ba8348a3614c7918cc4bb73268c5ac2a207576b7afea19d3d9f64", size = 1795196, upload-time = "2026-01-03T17:32:09.59Z" }, + { url = "https://files.pythonhosted.org/packages/32/11/b30e1b1cd1f3054af86ebe60df96989c6a414dd87e27ad16950eee420bea/aiohttp-3.13.3-cp314-cp314t-musllinux_1_2_armv7l.whl", hash = "sha256:b0d95340658b9d2f11d9697f59b3814a9d3bb4b7a7c20b131df4bcef464037c0", size = 1782841, upload-time = "2026-01-03T17:32:11.445Z" }, + { url = "https://files.pythonhosted.org/packages/88/0d/d98a9367b38912384a17e287850f5695c528cff0f14f791ce8ee2e4f7796/aiohttp-3.13.3-cp314-cp314t-musllinux_1_2_ppc64le.whl", hash = "sha256:a1e53262fd202e4b40b70c3aff944a8155059beedc8a89bba9dc1f9ef06a1b56", size = 1795193, upload-time = "2026-01-03T17:32:13.705Z" }, + { url = "https://files.pythonhosted.org/packages/43/a5/a2dfd1f5ff5581632c7f6a30e1744deda03808974f94f6534241ef60c751/aiohttp-3.13.3-cp314-cp314t-musllinux_1_2_riscv64.whl", hash = "sha256:d60ac9663f44168038586cab2157e122e46bdef09e9368b37f2d82d354c23f72", size = 1621979, upload-time = "2026-01-03T17:32:15.965Z" }, + { url = "https://files.pythonhosted.org/packages/fa/f0/12973c382ae7c1cccbc4417e129c5bf54c374dfb85af70893646e1f0e749/aiohttp-3.13.3-cp314-cp314t-musllinux_1_2_s390x.whl", hash = "sha256:90751b8eed69435bac9ff4e3d2f6b3af1f57e37ecb0fbeee59c0174c9e2d41df", size = 1822193, upload-time = "2026-01-03T17:32:18.219Z" }, + { url = "https://files.pythonhosted.org/packages/3c/5f/24155e30ba7f8c96918af1350eb0663e2430aad9e001c0489d89cd708ab1/aiohttp-3.13.3-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:fc353029f176fd2b3ec6cfc71be166aba1936fe5d73dd1992ce289ca6647a9aa", size = 1769801, upload-time = "2026-01-03T17:32:20.25Z" }, + { url = "https://files.pythonhosted.org/packages/eb/f8/7314031ff5c10e6ece114da79b338ec17eeff3a079e53151f7e9f43c4723/aiohttp-3.13.3-cp314-cp314t-win32.whl", hash = "sha256:2e41b18a58da1e474a057b3d35248d8320029f61d70a37629535b16a0c8f3767", size = 466523, upload-time = "2026-01-03T17:32:22.215Z" }, + { url = "https://files.pythonhosted.org/packages/b4/63/278a98c715ae467624eafe375542d8ba9b4383a016df8fdefe0ae28382a7/aiohttp-3.13.3-cp314-cp314t-win_amd64.whl", hash = "sha256:44531a36aa2264a1860089ffd4dce7baf875ee5a6079d5fb42e261c704ef7344", size = 499694, upload-time = "2026-01-03T17:32:24.546Z" }, +] + +[[package]] +name = "aiosignal" +version = "1.4.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "frozenlist" }, + { name = "typing-extensions", marker = "python_full_version < '3.13'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/61/62/06741b579156360248d1ec624842ad0edf697050bbaf7c3e46394e106ad1/aiosignal-1.4.0.tar.gz", hash = "sha256:f47eecd9468083c2029cc99945502cb7708b082c232f9aca65da147157b251c7", size = 25007, upload-time = "2025-07-03T22:54:43.528Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/fb/76/641ae371508676492379f16e2fa48f4e2c11741bd63c48be4b12a6b09cba/aiosignal-1.4.0-py3-none-any.whl", hash = "sha256:053243f8b92b990551949e63930a839ff0cf0b0ebbe0597b0f3fb19e1a0fe82e", size = 7490, upload-time = "2025-07-03T22:54:42.156Z" }, +] + +[[package]] +name = "alembic" +version = "1.18.4" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "mako" }, + { name = "sqlalchemy" }, + { name = "tomli", marker = "python_full_version < '3.11'" }, + { name = "typing-extensions" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/94/13/8b084e0f2efb0275a1d534838844926f798bd766566b1375174e2448cd31/alembic-1.18.4.tar.gz", hash = "sha256:cb6e1fd84b6174ab8dbb2329f86d631ba9559dd78df550b57804d607672cedbc", size = 2056725, upload-time = "2026-02-10T16:00:47.195Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/d2/29/6533c317b74f707ea28f8d633734dbda2119bbadfc61b2f3640ba835d0f7/alembic-1.18.4-py3-none-any.whl", hash = "sha256:a5ed4adcf6d8a4cb575f3d759f071b03cd6e5c7618eb796cb52497be25bfe19a", size = 263893, upload-time = "2026-02-10T16:00:49.997Z" }, +] + +[[package]] +name = "annotated-doc" +version = "0.0.4" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/57/ba/046ceea27344560984e26a590f90bc7f4a75b06701f653222458922b558c/annotated_doc-0.0.4.tar.gz", hash = "sha256:fbcda96e87e9c92ad167c2e53839e57503ecfda18804ea28102353485033faa4", size = 7288, upload-time = "2025-11-10T22:07:42.062Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/1e/d3/26bf1008eb3d2daa8ef4cacc7f3bfdc11818d111f7e2d0201bc6e3b49d45/annotated_doc-0.0.4-py3-none-any.whl", hash = "sha256:571ac1dc6991c450b25a9c2d84a3705e2ae7a53467b5d111c24fa8baabbed320", size = 5303, upload-time = "2025-11-10T22:07:40.673Z" }, +] + +[[package]] +name = "antlr4-python3-runtime" +version = "4.9.3" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/3e/38/7859ff46355f76f8d19459005ca000b6e7012f2f1ca597746cbcd1fbfe5e/antlr4-python3-runtime-4.9.3.tar.gz", hash = "sha256:f224469b4168294902bb1efa80a8bf7855f24c99aef99cbefc1bcd3cce77881b", size = 117034, upload-time = "2021-11-06T17:52:23.524Z" } + +[[package]] +name = "anyio" +version = "4.12.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "exceptiongroup", marker = "python_full_version < '3.11'" }, + { name = "idna" }, + { name = "typing-extensions", marker = "python_full_version < '3.13'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/96/f0/5eb65b2bb0d09ac6776f2eb54adee6abe8228ea05b20a5ad0e4945de8aac/anyio-4.12.1.tar.gz", hash = "sha256:41cfcc3a4c85d3f05c932da7c26d0201ac36f72abd4435ba90d0464a3ffed703", size = 228685, upload-time = "2026-01-06T11:45:21.246Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/38/0e/27be9fdef66e72d64c0cdc3cc2823101b80585f8119b5c112c2e8f5f7dab/anyio-4.12.1-py3-none-any.whl", hash = "sha256:d405828884fc140aa80a3c667b8beed277f1dfedec42ba031bd6ac3db606ab6c", size = 113592, upload-time = "2026-01-06T11:45:19.497Z" }, +] + +[[package]] +name = "asteroid-filterbanks" +version = "0.4.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "numpy", version = "2.2.6", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, + { name = "numpy", version = "2.4.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, + { name = "torch" }, + { name = "typing-extensions" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/90/fa/5c2be1f96dc179f83cdd3bb267edbd1f47d08f756785c016d5c2163901a7/asteroid-filterbanks-0.4.0.tar.gz", hash = "sha256:415f89d1dcf2b13b35f03f7a9370968ac4e6fa6800633c522dac992b283409b9", size = 24599, upload-time = "2021-04-09T20:03:07.456Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/c5/7c/83ff6046176a675e6a1e8aeefed8892cd97fe7c46af93cc540d1b24b8323/asteroid_filterbanks-0.4.0-py3-none-any.whl", hash = "sha256:4932ac8b6acc6e08fb87cbe8ece84215b5a74eee284fe83acf3540a72a02eaf5", size = 29912, upload-time = "2021-04-09T20:03:05.817Z" }, +] + +[[package]] +name = "async-timeout" +version = "5.0.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/a5/ae/136395dfbfe00dfc94da3f3e136d0b13f394cba8f4841120e34226265780/async_timeout-5.0.1.tar.gz", hash = "sha256:d9321a7a3d5a6a5e187e824d2fa0793ce379a202935782d555d6e9d2735677d3", size = 9274, upload-time = "2024-11-06T16:41:39.6Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/fe/ba/e2081de779ca30d473f21f5b30e0e737c438205440784c7dfc81efc2b029/async_timeout-5.0.1-py3-none-any.whl", hash = "sha256:39e3809566ff85354557ec2398b55e096c8364bacac9405a7a1fa429e77fe76c", size = 6233, upload-time = "2024-11-06T16:41:37.9Z" }, +] + +[[package]] +name = "attrs" +version = "25.4.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/6b/5c/685e6633917e101e5dcb62b9dd76946cbb57c26e133bae9e0cd36033c0a9/attrs-25.4.0.tar.gz", hash = "sha256:16d5969b87f0859ef33a48b35d55ac1be6e42ae49d5e853b597db70c35c57e11", size = 934251, upload-time = "2025-10-06T13:54:44.725Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/3a/2a/7cc015f5b9f5db42b7d48157e23356022889fc354a2813c15934b7cb5c0e/attrs-25.4.0-py3-none-any.whl", hash = "sha256:adcf7e2a1fb3b36ac48d97835bb6d8ade15b8dcce26aba8bf1d14847b57a3373", size = 67615, upload-time = "2025-10-06T13:54:43.17Z" }, +] + +[[package]] +name = "audioop-lts" +version = "0.2.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/38/53/946db57842a50b2da2e0c1e34bd37f36f5aadba1a929a3971c5d7841dbca/audioop_lts-0.2.2.tar.gz", hash = "sha256:64d0c62d88e67b98a1a5e71987b7aa7b5bcffc7dcee65b635823dbdd0a8dbbd0", size = 30686, upload-time = "2025-08-05T16:43:17.409Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/de/d4/94d277ca941de5a507b07f0b592f199c22454eeaec8f008a286b3fbbacd6/audioop_lts-0.2.2-cp313-abi3-macosx_10_13_universal2.whl", hash = "sha256:fd3d4602dc64914d462924a08c1a9816435a2155d74f325853c1f1ac3b2d9800", size = 46523, upload-time = "2025-08-05T16:42:20.836Z" }, + { url = "https://files.pythonhosted.org/packages/f8/5a/656d1c2da4b555920ce4177167bfeb8623d98765594af59702c8873f60ec/audioop_lts-0.2.2-cp313-abi3-macosx_10_13_x86_64.whl", hash = "sha256:550c114a8df0aafe9a05442a1162dfc8fec37e9af1d625ae6060fed6e756f303", size = 27455, upload-time = "2025-08-05T16:42:22.283Z" }, + { url = "https://files.pythonhosted.org/packages/1b/83/ea581e364ce7b0d41456fb79d6ee0ad482beda61faf0cab20cbd4c63a541/audioop_lts-0.2.2-cp313-abi3-macosx_11_0_arm64.whl", hash = "sha256:9a13dc409f2564de15dd68be65b462ba0dde01b19663720c68c1140c782d1d75", size = 26997, upload-time = "2025-08-05T16:42:23.849Z" }, + { url = "https://files.pythonhosted.org/packages/b8/3b/e8964210b5e216e5041593b7d33e97ee65967f17c282e8510d19c666dab4/audioop_lts-0.2.2-cp313-abi3-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:51c916108c56aa6e426ce611946f901badac950ee2ddaf302b7ed35d9958970d", size = 85844, upload-time = "2025-08-05T16:42:25.208Z" }, + { url = "https://files.pythonhosted.org/packages/c7/2e/0a1c52faf10d51def20531a59ce4c706cb7952323b11709e10de324d6493/audioop_lts-0.2.2-cp313-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:47eba38322370347b1c47024defbd36374a211e8dd5b0dcbce7b34fdb6f8847b", size = 85056, upload-time = "2025-08-05T16:42:26.559Z" }, + { url = "https://files.pythonhosted.org/packages/75/e8/cd95eef479656cb75ab05dfece8c1f8c395d17a7c651d88f8e6e291a63ab/audioop_lts-0.2.2-cp313-abi3-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:ba7c3a7e5f23e215cb271516197030c32aef2e754252c4c70a50aaff7031a2c8", size = 93892, upload-time = "2025-08-05T16:42:27.902Z" }, + { url = "https://files.pythonhosted.org/packages/5c/1e/a0c42570b74f83efa5cca34905b3eef03f7ab09fe5637015df538a7f3345/audioop_lts-0.2.2-cp313-abi3-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:def246fe9e180626731b26e89816e79aae2276f825420a07b4a647abaa84becc", size = 96660, upload-time = "2025-08-05T16:42:28.9Z" }, + { url = "https://files.pythonhosted.org/packages/50/d5/8a0ae607ca07dbb34027bac8db805498ee7bfecc05fd2c148cc1ed7646e7/audioop_lts-0.2.2-cp313-abi3-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:e160bf9df356d841bb6c180eeeea1834085464626dc1b68fa4e1d59070affdc3", size = 79143, upload-time = "2025-08-05T16:42:29.929Z" }, + { url = "https://files.pythonhosted.org/packages/12/17/0d28c46179e7910bfb0bb62760ccb33edb5de973052cb2230b662c14ca2e/audioop_lts-0.2.2-cp313-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:4b4cd51a57b698b2d06cb9993b7ac8dfe89a3b2878e96bc7948e9f19ff51dba6", size = 84313, upload-time = "2025-08-05T16:42:30.949Z" }, + { url = "https://files.pythonhosted.org/packages/84/ba/bd5d3806641564f2024e97ca98ea8f8811d4e01d9b9f9831474bc9e14f9e/audioop_lts-0.2.2-cp313-abi3-musllinux_1_2_ppc64le.whl", hash = "sha256:4a53aa7c16a60a6857e6b0b165261436396ef7293f8b5c9c828a3a203147ed4a", size = 93044, upload-time = "2025-08-05T16:42:31.959Z" }, + { url = "https://files.pythonhosted.org/packages/f9/5e/435ce8d5642f1f7679540d1e73c1c42d933331c0976eb397d1717d7f01a3/audioop_lts-0.2.2-cp313-abi3-musllinux_1_2_riscv64.whl", hash = "sha256:3fc38008969796f0f689f1453722a0f463da1b8a6fbee11987830bfbb664f623", size = 78766, upload-time = "2025-08-05T16:42:33.302Z" }, + { url = "https://files.pythonhosted.org/packages/ae/3b/b909e76b606cbfd53875693ec8c156e93e15a1366a012f0b7e4fb52d3c34/audioop_lts-0.2.2-cp313-abi3-musllinux_1_2_s390x.whl", hash = "sha256:15ab25dd3e620790f40e9ead897f91e79c0d3ce65fe193c8ed6c26cffdd24be7", size = 87640, upload-time = "2025-08-05T16:42:34.854Z" }, + { url = "https://files.pythonhosted.org/packages/30/e7/8f1603b4572d79b775f2140d7952f200f5e6c62904585d08a01f0a70393a/audioop_lts-0.2.2-cp313-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:03f061a1915538fd96272bac9551841859dbb2e3bf73ebe4a23ef043766f5449", size = 86052, upload-time = "2025-08-05T16:42:35.839Z" }, + { url = "https://files.pythonhosted.org/packages/b5/96/c37846df657ccdda62ba1ae2b6534fa90e2e1b1742ca8dcf8ebd38c53801/audioop_lts-0.2.2-cp313-abi3-win32.whl", hash = "sha256:3bcddaaf6cc5935a300a8387c99f7a7fbbe212a11568ec6cf6e4bc458c048636", size = 26185, upload-time = "2025-08-05T16:42:37.04Z" }, + { url = "https://files.pythonhosted.org/packages/34/a5/9d78fdb5b844a83da8a71226c7bdae7cc638861085fff7a1d707cb4823fa/audioop_lts-0.2.2-cp313-abi3-win_amd64.whl", hash = "sha256:a2c2a947fae7d1062ef08c4e369e0ba2086049a5e598fda41122535557012e9e", size = 30503, upload-time = "2025-08-05T16:42:38.427Z" }, + { url = "https://files.pythonhosted.org/packages/34/25/20d8fde083123e90c61b51afb547bb0ea7e77bab50d98c0ab243d02a0e43/audioop_lts-0.2.2-cp313-abi3-win_arm64.whl", hash = "sha256:5f93a5db13927a37d2d09637ccca4b2b6b48c19cd9eda7b17a2e9f77edee6a6f", size = 24173, upload-time = "2025-08-05T16:42:39.704Z" }, + { url = "https://files.pythonhosted.org/packages/58/a7/0a764f77b5c4ac58dc13c01a580f5d32ae8c74c92020b961556a43e26d02/audioop_lts-0.2.2-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:73f80bf4cd5d2ca7814da30a120de1f9408ee0619cc75da87d0641273d202a09", size = 47096, upload-time = "2025-08-05T16:42:40.684Z" }, + { url = "https://files.pythonhosted.org/packages/aa/ed/ebebedde1a18848b085ad0fa54b66ceb95f1f94a3fc04f1cd1b5ccb0ed42/audioop_lts-0.2.2-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:106753a83a25ee4d6f473f2be6b0966fc1c9af7e0017192f5531a3e7463dce58", size = 27748, upload-time = "2025-08-05T16:42:41.992Z" }, + { url = "https://files.pythonhosted.org/packages/cb/6e/11ca8c21af79f15dbb1c7f8017952ee8c810c438ce4e2b25638dfef2b02c/audioop_lts-0.2.2-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:fbdd522624141e40948ab3e8cdae6e04c748d78710e9f0f8d4dae2750831de19", size = 27329, upload-time = "2025-08-05T16:42:42.987Z" }, + { url = "https://files.pythonhosted.org/packages/84/52/0022f93d56d85eec5da6b9da6a958a1ef09e80c39f2cc0a590c6af81dcbb/audioop_lts-0.2.2-cp313-cp313t-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:143fad0311e8209ece30a8dbddab3b65ab419cbe8c0dde6e8828da25999be911", size = 92407, upload-time = "2025-08-05T16:42:44.336Z" }, + { url = "https://files.pythonhosted.org/packages/87/1d/48a889855e67be8718adbc7a01f3c01d5743c325453a5e81cf3717664aad/audioop_lts-0.2.2-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:dfbbc74ec68a0fd08cfec1f4b5e8cca3d3cd7de5501b01c4b5d209995033cde9", size = 91811, upload-time = "2025-08-05T16:42:45.325Z" }, + { url = "https://files.pythonhosted.org/packages/98/a6/94b7213190e8077547ffae75e13ed05edc488653c85aa5c41472c297d295/audioop_lts-0.2.2-cp313-cp313t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:cfcac6aa6f42397471e4943e0feb2244549db5c5d01efcd02725b96af417f3fe", size = 100470, upload-time = "2025-08-05T16:42:46.468Z" }, + { url = "https://files.pythonhosted.org/packages/e9/e9/78450d7cb921ede0cfc33426d3a8023a3bda755883c95c868ee36db8d48d/audioop_lts-0.2.2-cp313-cp313t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:752d76472d9804ac60f0078c79cdae8b956f293177acd2316cd1e15149aee132", size = 103878, upload-time = "2025-08-05T16:42:47.576Z" }, + { url = "https://files.pythonhosted.org/packages/4f/e2/cd5439aad4f3e34ae1ee852025dc6aa8f67a82b97641e390bf7bd9891d3e/audioop_lts-0.2.2-cp313-cp313t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:83c381767e2cc10e93e40281a04852facc4cd9334550e0f392f72d1c0a9c5753", size = 84867, upload-time = "2025-08-05T16:42:49.003Z" }, + { url = "https://files.pythonhosted.org/packages/68/4b/9d853e9076c43ebba0d411e8d2aa19061083349ac695a7d082540bad64d0/audioop_lts-0.2.2-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:c0022283e9556e0f3643b7c3c03f05063ca72b3063291834cca43234f20c60bb", size = 90001, upload-time = "2025-08-05T16:42:50.038Z" }, + { url = "https://files.pythonhosted.org/packages/58/26/4bae7f9d2f116ed5593989d0e521d679b0d583973d203384679323d8fa85/audioop_lts-0.2.2-cp313-cp313t-musllinux_1_2_ppc64le.whl", hash = "sha256:a2d4f1513d63c795e82948e1305f31a6d530626e5f9f2605408b300ae6095093", size = 99046, upload-time = "2025-08-05T16:42:51.111Z" }, + { url = "https://files.pythonhosted.org/packages/b2/67/a9f4fb3e250dda9e9046f8866e9fa7d52664f8985e445c6b4ad6dfb55641/audioop_lts-0.2.2-cp313-cp313t-musllinux_1_2_riscv64.whl", hash = "sha256:c9c8e68d8b4a56fda8c025e538e639f8c5953f5073886b596c93ec9b620055e7", size = 84788, upload-time = "2025-08-05T16:42:52.198Z" }, + { url = "https://files.pythonhosted.org/packages/70/f7/3de86562db0121956148bcb0fe5b506615e3bcf6e63c4357a612b910765a/audioop_lts-0.2.2-cp313-cp313t-musllinux_1_2_s390x.whl", hash = "sha256:96f19de485a2925314f5020e85911fb447ff5fbef56e8c7c6927851b95533a1c", size = 94472, upload-time = "2025-08-05T16:42:53.59Z" }, + { url = "https://files.pythonhosted.org/packages/f1/32/fd772bf9078ae1001207d2df1eef3da05bea611a87dd0e8217989b2848fa/audioop_lts-0.2.2-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:e541c3ef484852ef36545f66209444c48b28661e864ccadb29daddb6a4b8e5f5", size = 92279, upload-time = "2025-08-05T16:42:54.632Z" }, + { url = "https://files.pythonhosted.org/packages/4f/41/affea7181592ab0ab560044632571a38edaf9130b84928177823fbf3176a/audioop_lts-0.2.2-cp313-cp313t-win32.whl", hash = "sha256:d5e73fa573e273e4f2e5ff96f9043858a5e9311e94ffefd88a3186a910c70917", size = 26568, upload-time = "2025-08-05T16:42:55.627Z" }, + { url = "https://files.pythonhosted.org/packages/28/2b/0372842877016641db8fc54d5c88596b542eec2f8f6c20a36fb6612bf9ee/audioop_lts-0.2.2-cp313-cp313t-win_amd64.whl", hash = "sha256:9191d68659eda01e448188f60364c7763a7ca6653ed3f87ebb165822153a8547", size = 30942, upload-time = "2025-08-05T16:42:56.674Z" }, + { url = "https://files.pythonhosted.org/packages/ee/ca/baf2b9cc7e96c179bb4a54f30fcd83e6ecb340031bde68f486403f943768/audioop_lts-0.2.2-cp313-cp313t-win_arm64.whl", hash = "sha256:c174e322bb5783c099aaf87faeb240c8d210686b04bd61dfd05a8e5a83d88969", size = 24603, upload-time = "2025-08-05T16:42:57.571Z" }, + { url = "https://files.pythonhosted.org/packages/5c/73/413b5a2804091e2c7d5def1d618e4837f1cb82464e230f827226278556b7/audioop_lts-0.2.2-cp314-cp314t-macosx_10_13_universal2.whl", hash = "sha256:f9ee9b52f5f857fbaf9d605a360884f034c92c1c23021fb90b2e39b8e64bede6", size = 47104, upload-time = "2025-08-05T16:42:58.518Z" }, + { url = "https://files.pythonhosted.org/packages/ae/8c/daa3308dc6593944410c2c68306a5e217f5c05b70a12e70228e7dd42dc5c/audioop_lts-0.2.2-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:49ee1a41738a23e98d98b937a0638357a2477bc99e61b0f768a8f654f45d9b7a", size = 27754, upload-time = "2025-08-05T16:43:00.132Z" }, + { url = "https://files.pythonhosted.org/packages/4e/86/c2e0f627168fcf61781a8f72cab06b228fe1da4b9fa4ab39cfb791b5836b/audioop_lts-0.2.2-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:5b00be98ccd0fc123dcfad31d50030d25fcf31488cde9e61692029cd7394733b", size = 27332, upload-time = "2025-08-05T16:43:01.666Z" }, + { url = "https://files.pythonhosted.org/packages/c7/bd/35dce665255434f54e5307de39e31912a6f902d4572da7c37582809de14f/audioop_lts-0.2.2-cp314-cp314t-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:a6d2e0f9f7a69403e388894d4ca5ada5c47230716a03f2847cfc7bd1ecb589d6", size = 92396, upload-time = "2025-08-05T16:43:02.991Z" }, + { url = "https://files.pythonhosted.org/packages/2d/d2/deeb9f51def1437b3afa35aeb729d577c04bcd89394cb56f9239a9f50b6f/audioop_lts-0.2.2-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:f9b0b8a03ef474f56d1a842af1a2e01398b8f7654009823c6d9e0ecff4d5cfbf", size = 91811, upload-time = "2025-08-05T16:43:04.096Z" }, + { url = "https://files.pythonhosted.org/packages/76/3b/09f8b35b227cee28cc8231e296a82759ed80c1a08e349811d69773c48426/audioop_lts-0.2.2-cp314-cp314t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:2b267b70747d82125f1a021506565bdc5609a2b24bcb4773c16d79d2bb260bbd", size = 100483, upload-time = "2025-08-05T16:43:05.085Z" }, + { url = "https://files.pythonhosted.org/packages/0b/15/05b48a935cf3b130c248bfdbdea71ce6437f5394ee8533e0edd7cfd93d5e/audioop_lts-0.2.2-cp314-cp314t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:0337d658f9b81f4cd0fdb1f47635070cc084871a3d4646d9de74fdf4e7c3d24a", size = 103885, upload-time = "2025-08-05T16:43:06.197Z" }, + { url = "https://files.pythonhosted.org/packages/83/80/186b7fce6d35b68d3d739f228dc31d60b3412105854edb975aa155a58339/audioop_lts-0.2.2-cp314-cp314t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:167d3b62586faef8b6b2275c3218796b12621a60e43f7e9d5845d627b9c9b80e", size = 84899, upload-time = "2025-08-05T16:43:07.291Z" }, + { url = "https://files.pythonhosted.org/packages/49/89/c78cc5ac6cb5828f17514fb12966e299c850bc885e80f8ad94e38d450886/audioop_lts-0.2.2-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:0d9385e96f9f6da847f4d571ce3cb15b5091140edf3db97276872647ce37efd7", size = 89998, upload-time = "2025-08-05T16:43:08.335Z" }, + { url = "https://files.pythonhosted.org/packages/4c/4b/6401888d0c010e586c2ca50fce4c903d70a6bb55928b16cfbdfd957a13da/audioop_lts-0.2.2-cp314-cp314t-musllinux_1_2_ppc64le.whl", hash = "sha256:48159d96962674eccdca9a3df280e864e8ac75e40a577cc97c5c42667ffabfc5", size = 99046, upload-time = "2025-08-05T16:43:09.367Z" }, + { url = "https://files.pythonhosted.org/packages/de/f8/c874ca9bb447dae0e2ef2e231f6c4c2b0c39e31ae684d2420b0f9e97ee68/audioop_lts-0.2.2-cp314-cp314t-musllinux_1_2_riscv64.whl", hash = "sha256:8fefe5868cd082db1186f2837d64cfbfa78b548ea0d0543e9b28935ccce81ce9", size = 84843, upload-time = "2025-08-05T16:43:10.749Z" }, + { url = "https://files.pythonhosted.org/packages/3e/c0/0323e66f3daebc13fd46b36b30c3be47e3fc4257eae44f1e77eb828c703f/audioop_lts-0.2.2-cp314-cp314t-musllinux_1_2_s390x.whl", hash = "sha256:58cf54380c3884fb49fdd37dfb7a772632b6701d28edd3e2904743c5e1773602", size = 94490, upload-time = "2025-08-05T16:43:12.131Z" }, + { url = "https://files.pythonhosted.org/packages/98/6b/acc7734ac02d95ab791c10c3f17ffa3584ccb9ac5c18fd771c638ed6d1f5/audioop_lts-0.2.2-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:088327f00488cdeed296edd9215ca159f3a5a5034741465789cad403fcf4bec0", size = 92297, upload-time = "2025-08-05T16:43:13.139Z" }, + { url = "https://files.pythonhosted.org/packages/13/c3/c3dc3f564ce6877ecd2a05f8d751b9b27a8c320c2533a98b0c86349778d0/audioop_lts-0.2.2-cp314-cp314t-win32.whl", hash = "sha256:068aa17a38b4e0e7de771c62c60bbca2455924b67a8814f3b0dee92b5820c0b3", size = 27331, upload-time = "2025-08-05T16:43:14.19Z" }, + { url = "https://files.pythonhosted.org/packages/72/bb/b4608537e9ffcb86449091939d52d24a055216a36a8bf66b936af8c3e7ac/audioop_lts-0.2.2-cp314-cp314t-win_amd64.whl", hash = "sha256:a5bf613e96f49712073de86f20dbdd4014ca18efd4d34ed18c75bd808337851b", size = 31697, upload-time = "2025-08-05T16:43:15.193Z" }, + { url = "https://files.pythonhosted.org/packages/f6/22/91616fe707a5c5510de2cac9b046a30defe7007ba8a0c04f9c08f27df312/audioop_lts-0.2.2-cp314-cp314t-win_arm64.whl", hash = "sha256:b492c3b040153e68b9fdaff5913305aaaba5bb433d8a7f73d5cf6a64ed3cc1dd", size = 25206, upload-time = "2025-08-05T16:43:16.444Z" }, +] + +[[package]] +name = "audioread" +version = "3.1.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "standard-aifc", marker = "python_full_version >= '3.13'" }, + { name = "standard-sunau", marker = "python_full_version >= '3.13'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/a1/4a/874ecf9b472f998130c2b5e145dcdb9f6131e84786111489103b66772143/audioread-3.1.0.tar.gz", hash = "sha256:1c4ab2f2972764c896a8ac61ac53e261c8d29f0c6ccd652f84e18f08a4cab190", size = 20082, upload-time = "2025-10-26T19:44:13.484Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/7e/16/fbe8e1e185a45042f7cd3a282def5bb8d95bb69ab9e9ef6a5368aa17e426/audioread-3.1.0-py3-none-any.whl", hash = "sha256:b30d1df6c5d3de5dcef0fb0e256f6ea17bdcf5f979408df0297d8a408e2971b4", size = 23143, upload-time = "2025-10-26T19:44:12.016Z" }, +] + +[[package]] +name = "certifi" +version = "2026.2.25" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/af/2d/7bf41579a8986e348fa033a31cdd0e4121114f6bce2457e8876010b092dd/certifi-2026.2.25.tar.gz", hash = "sha256:e887ab5cee78ea814d3472169153c2d12cd43b14bd03329a39a9c6e2e80bfba7", size = 155029, upload-time = "2026-02-25T02:54:17.342Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/9a/3c/c17fb3ca2d9c3acff52e30b309f538586f9f5b9c9cf454f3845fc9af4881/certifi-2026.2.25-py3-none-any.whl", hash = "sha256:027692e4402ad994f1c42e52a4997a9763c646b73e4096e4d5d6db8af1d6f0fa", size = 153684, upload-time = "2026-02-25T02:54:15.766Z" }, +] + +[[package]] +name = "cffi" +version = "2.0.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pycparser", marker = "implementation_name != 'PyPy'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/eb/56/b1ba7935a17738ae8453301356628e8147c79dbb825bcbc73dc7401f9846/cffi-2.0.0.tar.gz", hash = "sha256:44d1b5909021139fe36001ae048dbdde8214afa20200eda0f64c068cac5d5529", size = 523588, upload-time = "2025-09-08T23:24:04.541Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/93/d7/516d984057745a6cd96575eea814fe1edd6646ee6efd552fb7b0921dec83/cffi-2.0.0-cp310-cp310-macosx_10_13_x86_64.whl", hash = "sha256:0cf2d91ecc3fcc0625c2c530fe004f82c110405f101548512cce44322fa8ac44", size = 184283, upload-time = "2025-09-08T23:22:08.01Z" }, + { url = "https://files.pythonhosted.org/packages/9e/84/ad6a0b408daa859246f57c03efd28e5dd1b33c21737c2db84cae8c237aa5/cffi-2.0.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:f73b96c41e3b2adedc34a7356e64c8eb96e03a3782b535e043a986276ce12a49", size = 180504, upload-time = "2025-09-08T23:22:10.637Z" }, + { url = "https://files.pythonhosted.org/packages/50/bd/b1a6362b80628111e6653c961f987faa55262b4002fcec42308cad1db680/cffi-2.0.0-cp310-cp310-manylinux1_i686.manylinux2014_i686.manylinux_2_17_i686.manylinux_2_5_i686.whl", hash = "sha256:53f77cbe57044e88bbd5ed26ac1d0514d2acf0591dd6bb02a3ae37f76811b80c", size = 208811, upload-time = "2025-09-08T23:22:12.267Z" }, + { url = "https://files.pythonhosted.org/packages/4f/27/6933a8b2562d7bd1fb595074cf99cc81fc3789f6a6c05cdabb46284a3188/cffi-2.0.0-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:3e837e369566884707ddaf85fc1744b47575005c0a229de3327f8f9a20f4efeb", size = 216402, upload-time = "2025-09-08T23:22:13.455Z" }, + { url = "https://files.pythonhosted.org/packages/05/eb/b86f2a2645b62adcfff53b0dd97e8dfafb5c8aa864bd0d9a2c2049a0d551/cffi-2.0.0-cp310-cp310-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:5eda85d6d1879e692d546a078b44251cdd08dd1cfb98dfb77b670c97cee49ea0", size = 203217, upload-time = "2025-09-08T23:22:14.596Z" }, + { url = "https://files.pythonhosted.org/packages/9f/e0/6cbe77a53acf5acc7c08cc186c9928864bd7c005f9efd0d126884858a5fe/cffi-2.0.0-cp310-cp310-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:9332088d75dc3241c702d852d4671613136d90fa6881da7d770a483fd05248b4", size = 203079, upload-time = "2025-09-08T23:22:15.769Z" }, + { url = "https://files.pythonhosted.org/packages/98/29/9b366e70e243eb3d14a5cb488dfd3a0b6b2f1fb001a203f653b93ccfac88/cffi-2.0.0-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:fc7de24befaeae77ba923797c7c87834c73648a05a4bde34b3b7e5588973a453", size = 216475, upload-time = "2025-09-08T23:22:17.427Z" }, + { url = "https://files.pythonhosted.org/packages/21/7a/13b24e70d2f90a322f2900c5d8e1f14fa7e2a6b3332b7309ba7b2ba51a5a/cffi-2.0.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:cf364028c016c03078a23b503f02058f1814320a56ad535686f90565636a9495", size = 218829, upload-time = "2025-09-08T23:22:19.069Z" }, + { url = "https://files.pythonhosted.org/packages/60/99/c9dc110974c59cc981b1f5b66e1d8af8af764e00f0293266824d9c4254bc/cffi-2.0.0-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:e11e82b744887154b182fd3e7e8512418446501191994dbf9c9fc1f32cc8efd5", size = 211211, upload-time = "2025-09-08T23:22:20.588Z" }, + { url = "https://files.pythonhosted.org/packages/49/72/ff2d12dbf21aca1b32a40ed792ee6b40f6dc3a9cf1644bd7ef6e95e0ac5e/cffi-2.0.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:8ea985900c5c95ce9db1745f7933eeef5d314f0565b27625d9a10ec9881e1bfb", size = 218036, upload-time = "2025-09-08T23:22:22.143Z" }, + { url = "https://files.pythonhosted.org/packages/e2/cc/027d7fb82e58c48ea717149b03bcadcbdc293553edb283af792bd4bcbb3f/cffi-2.0.0-cp310-cp310-win32.whl", hash = "sha256:1f72fb8906754ac8a2cc3f9f5aaa298070652a0ffae577e0ea9bd480dc3c931a", size = 172184, upload-time = "2025-09-08T23:22:23.328Z" }, + { url = "https://files.pythonhosted.org/packages/33/fa/072dd15ae27fbb4e06b437eb6e944e75b068deb09e2a2826039e49ee2045/cffi-2.0.0-cp310-cp310-win_amd64.whl", hash = "sha256:b18a3ed7d5b3bd8d9ef7a8cb226502c6bf8308df1525e1cc676c3680e7176739", size = 182790, upload-time = "2025-09-08T23:22:24.752Z" }, + { url = "https://files.pythonhosted.org/packages/12/4a/3dfd5f7850cbf0d06dc84ba9aa00db766b52ca38d8b86e3a38314d52498c/cffi-2.0.0-cp311-cp311-macosx_10_13_x86_64.whl", hash = "sha256:b4c854ef3adc177950a8dfc81a86f5115d2abd545751a304c5bcf2c2c7283cfe", size = 184344, upload-time = "2025-09-08T23:22:26.456Z" }, + { url = "https://files.pythonhosted.org/packages/4f/8b/f0e4c441227ba756aafbe78f117485b25bb26b1c059d01f137fa6d14896b/cffi-2.0.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:2de9a304e27f7596cd03d16f1b7c72219bd944e99cc52b84d0145aefb07cbd3c", size = 180560, upload-time = "2025-09-08T23:22:28.197Z" }, + { url = "https://files.pythonhosted.org/packages/b1/b7/1200d354378ef52ec227395d95c2576330fd22a869f7a70e88e1447eb234/cffi-2.0.0-cp311-cp311-manylinux1_i686.manylinux2014_i686.manylinux_2_17_i686.manylinux_2_5_i686.whl", hash = "sha256:baf5215e0ab74c16e2dd324e8ec067ef59e41125d3eade2b863d294fd5035c92", size = 209613, upload-time = "2025-09-08T23:22:29.475Z" }, + { url = "https://files.pythonhosted.org/packages/b8/56/6033f5e86e8cc9bb629f0077ba71679508bdf54a9a5e112a3c0b91870332/cffi-2.0.0-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:730cacb21e1bdff3ce90babf007d0a0917cc3e6492f336c2f0134101e0944f93", size = 216476, upload-time = "2025-09-08T23:22:31.063Z" }, + { url = "https://files.pythonhosted.org/packages/dc/7f/55fecd70f7ece178db2f26128ec41430d8720f2d12ca97bf8f0a628207d5/cffi-2.0.0-cp311-cp311-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:6824f87845e3396029f3820c206e459ccc91760e8fa24422f8b0c3d1731cbec5", size = 203374, upload-time = "2025-09-08T23:22:32.507Z" }, + { url = "https://files.pythonhosted.org/packages/84/ef/a7b77c8bdc0f77adc3b46888f1ad54be8f3b7821697a7b89126e829e676a/cffi-2.0.0-cp311-cp311-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:9de40a7b0323d889cf8d23d1ef214f565ab154443c42737dfe52ff82cf857664", size = 202597, upload-time = "2025-09-08T23:22:34.132Z" }, + { url = "https://files.pythonhosted.org/packages/d7/91/500d892b2bf36529a75b77958edfcd5ad8e2ce4064ce2ecfeab2125d72d1/cffi-2.0.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:8941aaadaf67246224cee8c3803777eed332a19d909b47e29c9842ef1e79ac26", size = 215574, upload-time = "2025-09-08T23:22:35.443Z" }, + { url = "https://files.pythonhosted.org/packages/44/64/58f6255b62b101093d5df22dcb752596066c7e89dd725e0afaed242a61be/cffi-2.0.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:a05d0c237b3349096d3981b727493e22147f934b20f6f125a3eba8f994bec4a9", size = 218971, upload-time = "2025-09-08T23:22:36.805Z" }, + { url = "https://files.pythonhosted.org/packages/ab/49/fa72cebe2fd8a55fbe14956f9970fe8eb1ac59e5df042f603ef7c8ba0adc/cffi-2.0.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:94698a9c5f91f9d138526b48fe26a199609544591f859c870d477351dc7b2414", size = 211972, upload-time = "2025-09-08T23:22:38.436Z" }, + { url = "https://files.pythonhosted.org/packages/0b/28/dd0967a76aab36731b6ebfe64dec4e981aff7e0608f60c2d46b46982607d/cffi-2.0.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:5fed36fccc0612a53f1d4d9a816b50a36702c28a2aa880cb8a122b3466638743", size = 217078, upload-time = "2025-09-08T23:22:39.776Z" }, + { url = "https://files.pythonhosted.org/packages/2b/c0/015b25184413d7ab0a410775fdb4a50fca20f5589b5dab1dbbfa3baad8ce/cffi-2.0.0-cp311-cp311-win32.whl", hash = "sha256:c649e3a33450ec82378822b3dad03cc228b8f5963c0c12fc3b1e0ab940f768a5", size = 172076, upload-time = "2025-09-08T23:22:40.95Z" }, + { url = "https://files.pythonhosted.org/packages/ae/8f/dc5531155e7070361eb1b7e4c1a9d896d0cb21c49f807a6c03fd63fc877e/cffi-2.0.0-cp311-cp311-win_amd64.whl", hash = "sha256:66f011380d0e49ed280c789fbd08ff0d40968ee7b665575489afa95c98196ab5", size = 182820, upload-time = "2025-09-08T23:22:42.463Z" }, + { url = "https://files.pythonhosted.org/packages/95/5c/1b493356429f9aecfd56bc171285a4c4ac8697f76e9bbbbb105e537853a1/cffi-2.0.0-cp311-cp311-win_arm64.whl", hash = "sha256:c6638687455baf640e37344fe26d37c404db8b80d037c3d29f58fe8d1c3b194d", size = 177635, upload-time = "2025-09-08T23:22:43.623Z" }, + { url = "https://files.pythonhosted.org/packages/ea/47/4f61023ea636104d4f16ab488e268b93008c3d0bb76893b1b31db1f96802/cffi-2.0.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:6d02d6655b0e54f54c4ef0b94eb6be0607b70853c45ce98bd278dc7de718be5d", size = 185271, upload-time = "2025-09-08T23:22:44.795Z" }, + { url = "https://files.pythonhosted.org/packages/df/a2/781b623f57358e360d62cdd7a8c681f074a71d445418a776eef0aadb4ab4/cffi-2.0.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:8eca2a813c1cb7ad4fb74d368c2ffbbb4789d377ee5bb8df98373c2cc0dee76c", size = 181048, upload-time = "2025-09-08T23:22:45.938Z" }, + { url = "https://files.pythonhosted.org/packages/ff/df/a4f0fbd47331ceeba3d37c2e51e9dfc9722498becbeec2bd8bc856c9538a/cffi-2.0.0-cp312-cp312-manylinux1_i686.manylinux2014_i686.manylinux_2_17_i686.manylinux_2_5_i686.whl", hash = "sha256:21d1152871b019407d8ac3985f6775c079416c282e431a4da6afe7aefd2bccbe", size = 212529, upload-time = "2025-09-08T23:22:47.349Z" }, + { url = "https://files.pythonhosted.org/packages/d5/72/12b5f8d3865bf0f87cf1404d8c374e7487dcf097a1c91c436e72e6badd83/cffi-2.0.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:b21e08af67b8a103c71a250401c78d5e0893beff75e28c53c98f4de42f774062", size = 220097, upload-time = "2025-09-08T23:22:48.677Z" }, + { url = "https://files.pythonhosted.org/packages/c2/95/7a135d52a50dfa7c882ab0ac17e8dc11cec9d55d2c18dda414c051c5e69e/cffi-2.0.0-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:1e3a615586f05fc4065a8b22b8152f0c1b00cdbc60596d187c2a74f9e3036e4e", size = 207983, upload-time = "2025-09-08T23:22:50.06Z" }, + { url = "https://files.pythonhosted.org/packages/3a/c8/15cb9ada8895957ea171c62dc78ff3e99159ee7adb13c0123c001a2546c1/cffi-2.0.0-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:81afed14892743bbe14dacb9e36d9e0e504cd204e0b165062c488942b9718037", size = 206519, upload-time = "2025-09-08T23:22:51.364Z" }, + { url = "https://files.pythonhosted.org/packages/78/2d/7fa73dfa841b5ac06c7b8855cfc18622132e365f5b81d02230333ff26e9e/cffi-2.0.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:3e17ed538242334bf70832644a32a7aae3d83b57567f9fd60a26257e992b79ba", size = 219572, upload-time = "2025-09-08T23:22:52.902Z" }, + { url = "https://files.pythonhosted.org/packages/07/e0/267e57e387b4ca276b90f0434ff88b2c2241ad72b16d31836adddfd6031b/cffi-2.0.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:3925dd22fa2b7699ed2617149842d2e6adde22b262fcbfada50e3d195e4b3a94", size = 222963, upload-time = "2025-09-08T23:22:54.518Z" }, + { url = "https://files.pythonhosted.org/packages/b6/75/1f2747525e06f53efbd878f4d03bac5b859cbc11c633d0fb81432d98a795/cffi-2.0.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:2c8f814d84194c9ea681642fd164267891702542f028a15fc97d4674b6206187", size = 221361, upload-time = "2025-09-08T23:22:55.867Z" }, + { url = "https://files.pythonhosted.org/packages/7b/2b/2b6435f76bfeb6bbf055596976da087377ede68df465419d192acf00c437/cffi-2.0.0-cp312-cp312-win32.whl", hash = "sha256:da902562c3e9c550df360bfa53c035b2f241fed6d9aef119048073680ace4a18", size = 172932, upload-time = "2025-09-08T23:22:57.188Z" }, + { url = "https://files.pythonhosted.org/packages/f8/ed/13bd4418627013bec4ed6e54283b1959cf6db888048c7cf4b4c3b5b36002/cffi-2.0.0-cp312-cp312-win_amd64.whl", hash = "sha256:da68248800ad6320861f129cd9c1bf96ca849a2771a59e0344e88681905916f5", size = 183557, upload-time = "2025-09-08T23:22:58.351Z" }, + { url = "https://files.pythonhosted.org/packages/95/31/9f7f93ad2f8eff1dbc1c3656d7ca5bfd8fb52c9d786b4dcf19b2d02217fa/cffi-2.0.0-cp312-cp312-win_arm64.whl", hash = "sha256:4671d9dd5ec934cb9a73e7ee9676f9362aba54f7f34910956b84d727b0d73fb6", size = 177762, upload-time = "2025-09-08T23:22:59.668Z" }, + { url = "https://files.pythonhosted.org/packages/4b/8d/a0a47a0c9e413a658623d014e91e74a50cdd2c423f7ccfd44086ef767f90/cffi-2.0.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:00bdf7acc5f795150faa6957054fbbca2439db2f775ce831222b66f192f03beb", size = 185230, upload-time = "2025-09-08T23:23:00.879Z" }, + { url = "https://files.pythonhosted.org/packages/4a/d2/a6c0296814556c68ee32009d9c2ad4f85f2707cdecfd7727951ec228005d/cffi-2.0.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:45d5e886156860dc35862657e1494b9bae8dfa63bf56796f2fb56e1679fc0bca", size = 181043, upload-time = "2025-09-08T23:23:02.231Z" }, + { url = "https://files.pythonhosted.org/packages/b0/1e/d22cc63332bd59b06481ceaac49d6c507598642e2230f201649058a7e704/cffi-2.0.0-cp313-cp313-manylinux1_i686.manylinux2014_i686.manylinux_2_17_i686.manylinux_2_5_i686.whl", hash = "sha256:07b271772c100085dd28b74fa0cd81c8fb1a3ba18b21e03d7c27f3436a10606b", size = 212446, upload-time = "2025-09-08T23:23:03.472Z" }, + { url = "https://files.pythonhosted.org/packages/a9/f5/a2c23eb03b61a0b8747f211eb716446c826ad66818ddc7810cc2cc19b3f2/cffi-2.0.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:d48a880098c96020b02d5a1f7d9251308510ce8858940e6fa99ece33f610838b", size = 220101, upload-time = "2025-09-08T23:23:04.792Z" }, + { url = "https://files.pythonhosted.org/packages/f2/7f/e6647792fc5850d634695bc0e6ab4111ae88e89981d35ac269956605feba/cffi-2.0.0-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:f93fd8e5c8c0a4aa1f424d6173f14a892044054871c771f8566e4008eaa359d2", size = 207948, upload-time = "2025-09-08T23:23:06.127Z" }, + { url = "https://files.pythonhosted.org/packages/cb/1e/a5a1bd6f1fb30f22573f76533de12a00bf274abcdc55c8edab639078abb6/cffi-2.0.0-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:dd4f05f54a52fb558f1ba9f528228066954fee3ebe629fc1660d874d040ae5a3", size = 206422, upload-time = "2025-09-08T23:23:07.753Z" }, + { url = "https://files.pythonhosted.org/packages/98/df/0a1755e750013a2081e863e7cd37e0cdd02664372c754e5560099eb7aa44/cffi-2.0.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:c8d3b5532fc71b7a77c09192b4a5a200ea992702734a2e9279a37f2478236f26", size = 219499, upload-time = "2025-09-08T23:23:09.648Z" }, + { url = "https://files.pythonhosted.org/packages/50/e1/a969e687fcf9ea58e6e2a928ad5e2dd88cc12f6f0ab477e9971f2309b57c/cffi-2.0.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:d9b29c1f0ae438d5ee9acb31cadee00a58c46cc9c0b2f9038c6b0b3470877a8c", size = 222928, upload-time = "2025-09-08T23:23:10.928Z" }, + { url = "https://files.pythonhosted.org/packages/36/54/0362578dd2c9e557a28ac77698ed67323ed5b9775ca9d3fe73fe191bb5d8/cffi-2.0.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:6d50360be4546678fc1b79ffe7a66265e28667840010348dd69a314145807a1b", size = 221302, upload-time = "2025-09-08T23:23:12.42Z" }, + { url = "https://files.pythonhosted.org/packages/eb/6d/bf9bda840d5f1dfdbf0feca87fbdb64a918a69bca42cfa0ba7b137c48cb8/cffi-2.0.0-cp313-cp313-win32.whl", hash = "sha256:74a03b9698e198d47562765773b4a8309919089150a0bb17d829ad7b44b60d27", size = 172909, upload-time = "2025-09-08T23:23:14.32Z" }, + { url = "https://files.pythonhosted.org/packages/37/18/6519e1ee6f5a1e579e04b9ddb6f1676c17368a7aba48299c3759bbc3c8b3/cffi-2.0.0-cp313-cp313-win_amd64.whl", hash = "sha256:19f705ada2530c1167abacb171925dd886168931e0a7b78f5bffcae5c6b5be75", size = 183402, upload-time = "2025-09-08T23:23:15.535Z" }, + { url = "https://files.pythonhosted.org/packages/cb/0e/02ceeec9a7d6ee63bb596121c2c8e9b3a9e150936f4fbef6ca1943e6137c/cffi-2.0.0-cp313-cp313-win_arm64.whl", hash = "sha256:256f80b80ca3853f90c21b23ee78cd008713787b1b1e93eae9f3d6a7134abd91", size = 177780, upload-time = "2025-09-08T23:23:16.761Z" }, + { url = "https://files.pythonhosted.org/packages/92/c4/3ce07396253a83250ee98564f8d7e9789fab8e58858f35d07a9a2c78de9f/cffi-2.0.0-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:fc33c5141b55ed366cfaad382df24fe7dcbc686de5be719b207bb248e3053dc5", size = 185320, upload-time = "2025-09-08T23:23:18.087Z" }, + { url = "https://files.pythonhosted.org/packages/59/dd/27e9fa567a23931c838c6b02d0764611c62290062a6d4e8ff7863daf9730/cffi-2.0.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:c654de545946e0db659b3400168c9ad31b5d29593291482c43e3564effbcee13", size = 181487, upload-time = "2025-09-08T23:23:19.622Z" }, + { url = "https://files.pythonhosted.org/packages/d6/43/0e822876f87ea8a4ef95442c3d766a06a51fc5298823f884ef87aaad168c/cffi-2.0.0-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:24b6f81f1983e6df8db3adc38562c83f7d4a0c36162885ec7f7b77c7dcbec97b", size = 220049, upload-time = "2025-09-08T23:23:20.853Z" }, + { url = "https://files.pythonhosted.org/packages/b4/89/76799151d9c2d2d1ead63c2429da9ea9d7aac304603de0c6e8764e6e8e70/cffi-2.0.0-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:12873ca6cb9b0f0d3a0da705d6086fe911591737a59f28b7936bdfed27c0d47c", size = 207793, upload-time = "2025-09-08T23:23:22.08Z" }, + { url = "https://files.pythonhosted.org/packages/bb/dd/3465b14bb9e24ee24cb88c9e3730f6de63111fffe513492bf8c808a3547e/cffi-2.0.0-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:d9b97165e8aed9272a6bb17c01e3cc5871a594a446ebedc996e2397a1c1ea8ef", size = 206300, upload-time = "2025-09-08T23:23:23.314Z" }, + { url = "https://files.pythonhosted.org/packages/47/d9/d83e293854571c877a92da46fdec39158f8d7e68da75bf73581225d28e90/cffi-2.0.0-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:afb8db5439b81cf9c9d0c80404b60c3cc9c3add93e114dcae767f1477cb53775", size = 219244, upload-time = "2025-09-08T23:23:24.541Z" }, + { url = "https://files.pythonhosted.org/packages/2b/0f/1f177e3683aead2bb00f7679a16451d302c436b5cbf2505f0ea8146ef59e/cffi-2.0.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:737fe7d37e1a1bffe70bd5754ea763a62a066dc5913ca57e957824b72a85e205", size = 222828, upload-time = "2025-09-08T23:23:26.143Z" }, + { url = "https://files.pythonhosted.org/packages/c6/0f/cafacebd4b040e3119dcb32fed8bdef8dfe94da653155f9d0b9dc660166e/cffi-2.0.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:38100abb9d1b1435bc4cc340bb4489635dc2f0da7456590877030c9b3d40b0c1", size = 220926, upload-time = "2025-09-08T23:23:27.873Z" }, + { url = "https://files.pythonhosted.org/packages/3e/aa/df335faa45b395396fcbc03de2dfcab242cd61a9900e914fe682a59170b1/cffi-2.0.0-cp314-cp314-win32.whl", hash = "sha256:087067fa8953339c723661eda6b54bc98c5625757ea62e95eb4898ad5e776e9f", size = 175328, upload-time = "2025-09-08T23:23:44.61Z" }, + { url = "https://files.pythonhosted.org/packages/bb/92/882c2d30831744296ce713f0feb4c1cd30f346ef747b530b5318715cc367/cffi-2.0.0-cp314-cp314-win_amd64.whl", hash = "sha256:203a48d1fb583fc7d78a4c6655692963b860a417c0528492a6bc21f1aaefab25", size = 185650, upload-time = "2025-09-08T23:23:45.848Z" }, + { url = "https://files.pythonhosted.org/packages/9f/2c/98ece204b9d35a7366b5b2c6539c350313ca13932143e79dc133ba757104/cffi-2.0.0-cp314-cp314-win_arm64.whl", hash = "sha256:dbd5c7a25a7cb98f5ca55d258b103a2054f859a46ae11aaf23134f9cc0d356ad", size = 180687, upload-time = "2025-09-08T23:23:47.105Z" }, + { url = "https://files.pythonhosted.org/packages/3e/61/c768e4d548bfa607abcda77423448df8c471f25dbe64fb2ef6d555eae006/cffi-2.0.0-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:9a67fc9e8eb39039280526379fb3a70023d77caec1852002b4da7e8b270c4dd9", size = 188773, upload-time = "2025-09-08T23:23:29.347Z" }, + { url = "https://files.pythonhosted.org/packages/2c/ea/5f76bce7cf6fcd0ab1a1058b5af899bfbef198bea4d5686da88471ea0336/cffi-2.0.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:7a66c7204d8869299919db4d5069a82f1561581af12b11b3c9f48c584eb8743d", size = 185013, upload-time = "2025-09-08T23:23:30.63Z" }, + { url = "https://files.pythonhosted.org/packages/be/b4/c56878d0d1755cf9caa54ba71e5d049479c52f9e4afc230f06822162ab2f/cffi-2.0.0-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:7cc09976e8b56f8cebd752f7113ad07752461f48a58cbba644139015ac24954c", size = 221593, upload-time = "2025-09-08T23:23:31.91Z" }, + { url = "https://files.pythonhosted.org/packages/e0/0d/eb704606dfe8033e7128df5e90fee946bbcb64a04fcdaa97321309004000/cffi-2.0.0-cp314-cp314t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:92b68146a71df78564e4ef48af17551a5ddd142e5190cdf2c5624d0c3ff5b2e8", size = 209354, upload-time = "2025-09-08T23:23:33.214Z" }, + { url = "https://files.pythonhosted.org/packages/d8/19/3c435d727b368ca475fb8742ab97c9cb13a0de600ce86f62eab7fa3eea60/cffi-2.0.0-cp314-cp314t-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:b1e74d11748e7e98e2f426ab176d4ed720a64412b6a15054378afdb71e0f37dc", size = 208480, upload-time = "2025-09-08T23:23:34.495Z" }, + { url = "https://files.pythonhosted.org/packages/d0/44/681604464ed9541673e486521497406fadcc15b5217c3e326b061696899a/cffi-2.0.0-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:28a3a209b96630bca57cce802da70c266eb08c6e97e5afd61a75611ee6c64592", size = 221584, upload-time = "2025-09-08T23:23:36.096Z" }, + { url = "https://files.pythonhosted.org/packages/25/8e/342a504ff018a2825d395d44d63a767dd8ebc927ebda557fecdaca3ac33a/cffi-2.0.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:7553fb2090d71822f02c629afe6042c299edf91ba1bf94951165613553984512", size = 224443, upload-time = "2025-09-08T23:23:37.328Z" }, + { url = "https://files.pythonhosted.org/packages/e1/5e/b666bacbbc60fbf415ba9988324a132c9a7a0448a9a8f125074671c0f2c3/cffi-2.0.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:6c6c373cfc5c83a975506110d17457138c8c63016b563cc9ed6e056a82f13ce4", size = 223437, upload-time = "2025-09-08T23:23:38.945Z" }, + { url = "https://files.pythonhosted.org/packages/a0/1d/ec1a60bd1a10daa292d3cd6bb0b359a81607154fb8165f3ec95fe003b85c/cffi-2.0.0-cp314-cp314t-win32.whl", hash = "sha256:1fc9ea04857caf665289b7a75923f2c6ed559b8298a1b8c49e59f7dd95c8481e", size = 180487, upload-time = "2025-09-08T23:23:40.423Z" }, + { url = "https://files.pythonhosted.org/packages/bf/41/4c1168c74fac325c0c8156f04b6749c8b6a8f405bbf91413ba088359f60d/cffi-2.0.0-cp314-cp314t-win_amd64.whl", hash = "sha256:d68b6cef7827e8641e8ef16f4494edda8b36104d79773a334beaa1e3521430f6", size = 191726, upload-time = "2025-09-08T23:23:41.742Z" }, + { url = "https://files.pythonhosted.org/packages/ae/3a/dbeec9d1ee0844c679f6bb5d6ad4e9f198b1224f4e7a32825f47f6192b0c/cffi-2.0.0-cp314-cp314t-win_arm64.whl", hash = "sha256:0a1527a803f0a659de1af2e1fd700213caba79377e27e4693648c2923da066f9", size = 184195, upload-time = "2025-09-08T23:23:43.004Z" }, +] + +[[package]] +name = "charset-normalizer" +version = "3.4.5" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/1d/35/02daf95b9cd686320bb622eb148792655c9412dbb9b67abb5694e5910a24/charset_normalizer-3.4.5.tar.gz", hash = "sha256:95adae7b6c42a6c5b5b559b1a99149f090a57128155daeea91732c8d970d8644", size = 134804, upload-time = "2026-03-06T06:03:19.46Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/a7/21/a2b1505639008ba2e6ef03733a81fc6cfd6a07ea6139a2b76421230b8dad/charset_normalizer-3.4.5-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:4167a621a9a1a986c73777dbc15d4b5eac8ac5c10393374109a343d4013ec765", size = 283319, upload-time = "2026-03-06T06:00:26.433Z" }, + { url = "https://files.pythonhosted.org/packages/70/67/df234c29b68f4e1e095885c9db1cb4b69b8aba49cf94fac041db4aaf1267/charset_normalizer-3.4.5-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:3f64c6bf8f32f9133b668c7f7a7cbdbc453412bc95ecdbd157f3b1e377a92990", size = 189974, upload-time = "2026-03-06T06:00:28.222Z" }, + { url = "https://files.pythonhosted.org/packages/df/7f/fc66af802961c6be42e2c7b69c58f95cbd1f39b0e81b3365d8efe2a02a04/charset_normalizer-3.4.5-cp310-cp310-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:568e3c34b58422075a1b49575a6abc616d9751b4d61b23f712e12ebb78fe47b2", size = 207866, upload-time = "2026-03-06T06:00:29.769Z" }, + { url = "https://files.pythonhosted.org/packages/c9/23/404eb36fac4e95b833c50e305bba9a241086d427bb2167a42eac7c4f7da4/charset_normalizer-3.4.5-cp310-cp310-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:036c079aa08a6a592b82487f97c60b439428320ed1b2ea0b3912e99d30c77765", size = 203239, upload-time = "2026-03-06T06:00:31.086Z" }, + { url = "https://files.pythonhosted.org/packages/4b/2f/8a1d989bfadd120c90114ab33e0d2a0cbde05278c1fc15e83e62d570f50a/charset_normalizer-3.4.5-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:340810d34ef83af92148e96e3e44cb2d3f910d2bf95e5618a5c467d9f102231d", size = 196529, upload-time = "2026-03-06T06:00:32.608Z" }, + { url = "https://files.pythonhosted.org/packages/a5/0c/c75f85ff7ca1f051958bb518cd43922d86f576c03947a050fbedfdfb4f15/charset_normalizer-3.4.5-cp310-cp310-manylinux_2_31_armv7l.whl", hash = "sha256:cd2d0f0ec9aa977a27731a3209ebbcacebebaf41f902bd453a928bfd281cf7f8", size = 184152, upload-time = "2026-03-06T06:00:33.93Z" }, + { url = "https://files.pythonhosted.org/packages/f9/20/4ed37f6199af5dde94d4aeaf577f3813a5ec6635834cda1d957013a09c76/charset_normalizer-3.4.5-cp310-cp310-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:0b362bcd27819f9c07cbf23db4e0e8cd4b44c5ecd900c2ff907b2b92274a7412", size = 195226, upload-time = "2026-03-06T06:00:35.469Z" }, + { url = "https://files.pythonhosted.org/packages/28/31/7ba1102178cba7c34dcc050f43d427172f389729e356038f0726253dd914/charset_normalizer-3.4.5-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:77be992288f720306ab4108fe5c74797de327f3248368dfc7e1a916d6ed9e5a2", size = 192933, upload-time = "2026-03-06T06:00:36.83Z" }, + { url = "https://files.pythonhosted.org/packages/4b/23/f86443ab3921e6a60b33b93f4a1161222231f6c69bc24fb18f3bee7b8518/charset_normalizer-3.4.5-cp310-cp310-musllinux_1_2_armv7l.whl", hash = "sha256:8b78d8a609a4b82c273257ee9d631ded7fac0d875bdcdccc109f3ee8328cfcb1", size = 185647, upload-time = "2026-03-06T06:00:38.367Z" }, + { url = "https://files.pythonhosted.org/packages/82/44/08b8be891760f1f5a6d23ce11d6d50c92981603e6eb740b4f72eea9424e2/charset_normalizer-3.4.5-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:ba20bdf69bd127f66d0174d6f2a93e69045e0b4036dc1ca78e091bcc765830c4", size = 209533, upload-time = "2026-03-06T06:00:41.931Z" }, + { url = "https://files.pythonhosted.org/packages/3b/5f/df114f23406199f8af711ddccfbf409ffbc5b7cdc18fa19644997ff0c9bb/charset_normalizer-3.4.5-cp310-cp310-musllinux_1_2_riscv64.whl", hash = "sha256:76a9d0de4d0eab387822e7b35d8f89367dd237c72e82ab42b9f7bf5e15ada00f", size = 195901, upload-time = "2026-03-06T06:00:43.978Z" }, + { url = "https://files.pythonhosted.org/packages/07/83/71ef34a76fe8aa05ff8f840244bda2d61e043c2ef6f30d200450b9f6a1be/charset_normalizer-3.4.5-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:8fff79bf5978c693c9b1a4d71e4a94fddfb5fe744eb062a318e15f4a2f63a550", size = 204950, upload-time = "2026-03-06T06:00:45.202Z" }, + { url = "https://files.pythonhosted.org/packages/58/40/0253be623995365137d7dc68e45245036207ab2227251e69a3d93ce43183/charset_normalizer-3.4.5-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:c7e84e0c0005e3bdc1a9211cd4e62c78ba80bc37b2365ef4410cd2007a9047f2", size = 198546, upload-time = "2026-03-06T06:00:46.481Z" }, + { url = "https://files.pythonhosted.org/packages/ed/5c/5f3cb5b259a130895ef5ae16b38eaf141430fa3f7af50cd06c5d67e4f7b2/charset_normalizer-3.4.5-cp310-cp310-win32.whl", hash = "sha256:58ad8270cfa5d4bef1bc85bd387217e14ff154d6630e976c6f56f9a040757475", size = 132516, upload-time = "2026-03-06T06:00:47.924Z" }, + { url = "https://files.pythonhosted.org/packages/a5/c3/84fb174e7770f2df2e1a2115090771bfbc2227fb39a765c6d00568d1aab4/charset_normalizer-3.4.5-cp310-cp310-win_amd64.whl", hash = "sha256:02a9d1b01c1e12c27883b0c9349e0bcd9ae92e727ff1a277207e1a262b1cbf05", size = 142906, upload-time = "2026-03-06T06:00:49.389Z" }, + { url = "https://files.pythonhosted.org/packages/d7/b2/6f852f8b969f2cbd0d4092d2e60139ab1af95af9bb651337cae89ec0f684/charset_normalizer-3.4.5-cp310-cp310-win_arm64.whl", hash = "sha256:039215608ac7b358c4da0191d10fc76868567fbf276d54c14721bdedeb6de064", size = 133258, upload-time = "2026-03-06T06:00:51.051Z" }, + { url = "https://files.pythonhosted.org/packages/8f/9e/bcec3b22c64ecec47d39bf5167c2613efd41898c019dccd4183f6aa5d6a7/charset_normalizer-3.4.5-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:610f72c0ee565dfb8ae1241b666119582fdbfe7c0975c175be719f940e110694", size = 279531, upload-time = "2026-03-06T06:00:52.252Z" }, + { url = "https://files.pythonhosted.org/packages/58/12/81fd25f7e7078ab5d1eedbb0fac44be4904ae3370a3bf4533c8f2d159acd/charset_normalizer-3.4.5-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:60d68e820af339df4ae8358c7a2e7596badeb61e544438e489035f9fbf3246a5", size = 188006, upload-time = "2026-03-06T06:00:53.8Z" }, + { url = "https://files.pythonhosted.org/packages/ae/6e/f2d30e8c27c1b0736a6520311982cf5286cfc7f6cac77d7bc1325e3a23f2/charset_normalizer-3.4.5-cp311-cp311-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:10b473fc8dca1c3ad8559985794815f06ca3fc71942c969129070f2c3cdf7281", size = 205085, upload-time = "2026-03-06T06:00:55.311Z" }, + { url = "https://files.pythonhosted.org/packages/d0/90/d12cefcb53b5931e2cf792a33718d7126efb116a320eaa0742c7059a95e4/charset_normalizer-3.4.5-cp311-cp311-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:d4eb8ac7469b2a5d64b5b8c04f84d8bf3ad340f4514b98523805cbf46e3b3923", size = 200545, upload-time = "2026-03-06T06:00:56.532Z" }, + { url = "https://files.pythonhosted.org/packages/03/f4/44d3b830a20e89ff82a3134912d9a1cf6084d64f3b95dcad40f74449a654/charset_normalizer-3.4.5-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:5bcb3227c3d9aaf73eaaab1db7ccd80a8995c509ee9941e2aae060ca6e4e5d81", size = 193863, upload-time = "2026-03-06T06:00:57.823Z" }, + { url = "https://files.pythonhosted.org/packages/25/4b/f212119c18a6320a9d4a730d1b4057875cdeabf21b3614f76549042ef8a8/charset_normalizer-3.4.5-cp311-cp311-manylinux_2_31_armv7l.whl", hash = "sha256:75ee9c1cce2911581a70a3c0919d8bccf5b1cbc9b0e5171400ec736b4b569497", size = 181827, upload-time = "2026-03-06T06:00:59.323Z" }, + { url = "https://files.pythonhosted.org/packages/74/00/b26158e48b425a202a92965f8069e8a63d9af1481dfa206825d7f74d2a3c/charset_normalizer-3.4.5-cp311-cp311-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:1d1401945cb77787dbd3af2446ff2d75912327c4c3a1526ab7955ecf8600687c", size = 191085, upload-time = "2026-03-06T06:01:00.546Z" }, + { url = "https://files.pythonhosted.org/packages/c4/c2/1c1737bf6fd40335fe53d28fe49afd99ee4143cc57a845e99635ce0b9b6d/charset_normalizer-3.4.5-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:0a45e504f5e1be0bd385935a8e1507c442349ca36f511a47057a71c9d1d6ea9e", size = 190688, upload-time = "2026-03-06T06:01:02.479Z" }, + { url = "https://files.pythonhosted.org/packages/5a/3d/abb5c22dc2ef493cd56522f811246a63c5427c08f3e3e50ab663de27fcf4/charset_normalizer-3.4.5-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:e09f671a54ce70b79a1fc1dc6da3072b7ef7251fadb894ed92d9aa8218465a5f", size = 183077, upload-time = "2026-03-06T06:01:04.231Z" }, + { url = "https://files.pythonhosted.org/packages/44/33/5298ad4d419a58e25b3508e87f2758d1442ff00c2471f8e0403dab8edad5/charset_normalizer-3.4.5-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:d01de5e768328646e6a3fa9e562706f8f6641708c115c62588aef2b941a4f88e", size = 206706, upload-time = "2026-03-06T06:01:05.773Z" }, + { url = "https://files.pythonhosted.org/packages/7b/17/51e7895ac0f87c3b91d276a449ef09f5532a7529818f59646d7a55089432/charset_normalizer-3.4.5-cp311-cp311-musllinux_1_2_riscv64.whl", hash = "sha256:131716d6786ad5e3dc542f5cc6f397ba3339dc0fb87f87ac30e550e8987756af", size = 191665, upload-time = "2026-03-06T06:01:07.473Z" }, + { url = "https://files.pythonhosted.org/packages/90/8f/cce9adf1883e98906dbae380d769b4852bb0fa0004bc7d7a2243418d3ea8/charset_normalizer-3.4.5-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:1a374cc0b88aa710e8865dc1bd6edb3743c59f27830f0293ab101e4cf3ce9f85", size = 201950, upload-time = "2026-03-06T06:01:08.973Z" }, + { url = "https://files.pythonhosted.org/packages/08/ca/bce99cd5c397a52919e2769d126723f27a4c037130374c051c00470bcd38/charset_normalizer-3.4.5-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:d31f0d1671e1534e395f9eb84a68e0fb670e1edb1fe819a9d7f564ae3bc4e53f", size = 195830, upload-time = "2026-03-06T06:01:10.155Z" }, + { url = "https://files.pythonhosted.org/packages/87/4f/2e3d023a06911f1281f97b8f036edc9872167036ca6f55cc874a0be6c12c/charset_normalizer-3.4.5-cp311-cp311-win32.whl", hash = "sha256:cace89841c0599d736d3d74a27bc5821288bb47c5441923277afc6059d7fbcb4", size = 132029, upload-time = "2026-03-06T06:01:11.706Z" }, + { url = "https://files.pythonhosted.org/packages/fe/1f/a853b73d386521fd44b7f67ded6b17b7b2367067d9106a5c4b44f9a34274/charset_normalizer-3.4.5-cp311-cp311-win_amd64.whl", hash = "sha256:f8102ae93c0bc863b1d41ea0f4499c20a83229f52ed870850892df555187154a", size = 142404, upload-time = "2026-03-06T06:01:12.865Z" }, + { url = "https://files.pythonhosted.org/packages/b4/10/dba36f76b71c38e9d391abe0fd8a5b818790e053c431adecfc98c35cd2a9/charset_normalizer-3.4.5-cp311-cp311-win_arm64.whl", hash = "sha256:ed98364e1c262cf5f9363c3eca8c2df37024f52a8fa1180a3610014f26eac51c", size = 132796, upload-time = "2026-03-06T06:01:14.106Z" }, + { url = "https://files.pythonhosted.org/packages/9c/b6/9ee9c1a608916ca5feae81a344dffbaa53b26b90be58cc2159e3332d44ec/charset_normalizer-3.4.5-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:ed97c282ee4f994ef814042423a529df9497e3c666dca19be1d4cd1129dc7ade", size = 280976, upload-time = "2026-03-06T06:01:15.276Z" }, + { url = "https://files.pythonhosted.org/packages/f8/d8/a54f7c0b96f1df3563e9190f04daf981e365a9b397eedfdfb5dbef7e5c6c/charset_normalizer-3.4.5-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:0294916d6ccf2d069727d65973c3a1ca477d68708db25fd758dd28b0827cff54", size = 189356, upload-time = "2026-03-06T06:01:16.511Z" }, + { url = "https://files.pythonhosted.org/packages/42/69/2bf7f76ce1446759a5787cb87d38f6a61eb47dbbdf035cfebf6347292a65/charset_normalizer-3.4.5-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:dc57a0baa3eeedd99fafaef7511b5a6ef4581494e8168ee086031744e2679467", size = 206369, upload-time = "2026-03-06T06:01:17.853Z" }, + { url = "https://files.pythonhosted.org/packages/10/9c/949d1a46dab56b959d9a87272482195f1840b515a3380e39986989a893ae/charset_normalizer-3.4.5-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:ed1a9a204f317ef879b32f9af507d47e49cd5e7f8e8d5d96358c98373314fc60", size = 203285, upload-time = "2026-03-06T06:01:19.473Z" }, + { url = "https://files.pythonhosted.org/packages/67/5c/ae30362a88b4da237d71ea214a8c7eb915db3eec941adda511729ac25fa2/charset_normalizer-3.4.5-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:7ad83b8f9379176c841f8865884f3514d905bcd2a9a3b210eaa446e7d2223e4d", size = 196274, upload-time = "2026-03-06T06:01:20.728Z" }, + { url = "https://files.pythonhosted.org/packages/b2/07/c9f2cb0e46cb6d64fdcc4f95953747b843bb2181bda678dc4e699b8f0f9a/charset_normalizer-3.4.5-cp312-cp312-manylinux_2_31_armv7l.whl", hash = "sha256:a118e2e0b5ae6b0120d5efa5f866e58f2bb826067a646431da4d6a2bdae7950e", size = 184715, upload-time = "2026-03-06T06:01:22.194Z" }, + { url = "https://files.pythonhosted.org/packages/36/64/6b0ca95c44fddf692cd06d642b28f63009d0ce325fad6e9b2b4d0ef86a52/charset_normalizer-3.4.5-cp312-cp312-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:754f96058e61a5e22e91483f823e07df16416ce76afa4ebf306f8e1d1296d43f", size = 193426, upload-time = "2026-03-06T06:01:23.795Z" }, + { url = "https://files.pythonhosted.org/packages/50/bc/a730690d726403743795ca3f5bb2baf67838c5fea78236098f324b965e40/charset_normalizer-3.4.5-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:0c300cefd9b0970381a46394902cd18eaf2aa00163f999590ace991989dcd0fc", size = 191780, upload-time = "2026-03-06T06:01:25.053Z" }, + { url = "https://files.pythonhosted.org/packages/97/4f/6c0bc9af68222b22951552d73df4532b5be6447cee32d58e7e8c74ecbb7b/charset_normalizer-3.4.5-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:c108f8619e504140569ee7de3f97d234f0fbae338a7f9f360455071ef9855a95", size = 185805, upload-time = "2026-03-06T06:01:26.294Z" }, + { url = "https://files.pythonhosted.org/packages/dd/b9/a523fb9b0ee90814b503452b2600e4cbc118cd68714d57041564886e7325/charset_normalizer-3.4.5-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:d1028de43596a315e2720a9849ee79007ab742c06ad8b45a50db8cdb7ed4a82a", size = 208342, upload-time = "2026-03-06T06:01:27.55Z" }, + { url = "https://files.pythonhosted.org/packages/4d/61/c59e761dee4464050713e50e27b58266cc8e209e518c0b378c1580c959ba/charset_normalizer-3.4.5-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:19092dde50335accf365cce21998a1c6dd8eafd42c7b226eb54b2747cdce2fac", size = 193661, upload-time = "2026-03-06T06:01:29.051Z" }, + { url = "https://files.pythonhosted.org/packages/1c/43/729fa30aad69783f755c5ad8649da17ee095311ca42024742701e202dc59/charset_normalizer-3.4.5-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:4354e401eb6dab9aed3c7b4030514328a6c748d05e1c3e19175008ca7de84fb1", size = 204819, upload-time = "2026-03-06T06:01:30.298Z" }, + { url = "https://files.pythonhosted.org/packages/87/33/d9b442ce5a91b96fc0840455a9e49a611bbadae6122778d0a6a79683dd31/charset_normalizer-3.4.5-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:a68766a3c58fde7f9aaa22b3786276f62ab2f594efb02d0a1421b6282e852e98", size = 198080, upload-time = "2026-03-06T06:01:31.478Z" }, + { url = "https://files.pythonhosted.org/packages/56/5a/b8b5a23134978ee9885cee2d6995f4c27cc41f9baded0a9685eabc5338f0/charset_normalizer-3.4.5-cp312-cp312-win32.whl", hash = "sha256:1827734a5b308b65ac54e86a618de66f935a4f63a8a462ff1e19a6788d6c2262", size = 132630, upload-time = "2026-03-06T06:01:33.056Z" }, + { url = "https://files.pythonhosted.org/packages/70/53/e44a4c07e8904500aec95865dc3f6464dc3586a039ef0df606eb3ac38e35/charset_normalizer-3.4.5-cp312-cp312-win_amd64.whl", hash = "sha256:728c6a963dfab66ef865f49286e45239384249672cd598576765acc2a640a636", size = 142856, upload-time = "2026-03-06T06:01:34.489Z" }, + { url = "https://files.pythonhosted.org/packages/ea/aa/c5628f7cad591b1cf45790b7a61483c3e36cf41349c98af7813c483fd6e8/charset_normalizer-3.4.5-cp312-cp312-win_arm64.whl", hash = "sha256:75dfd1afe0b1647449e852f4fb428195a7ed0588947218f7ba929f6538487f02", size = 132982, upload-time = "2026-03-06T06:01:35.641Z" }, + { url = "https://files.pythonhosted.org/packages/f5/48/9f34ec4bb24aa3fdba1890c1bddb97c8a4be1bd84ef5c42ac2352563ad05/charset_normalizer-3.4.5-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:ac59c15e3f1465f722607800c68713f9fbc2f672b9eb649fe831da4019ae9b23", size = 280788, upload-time = "2026-03-06T06:01:37.126Z" }, + { url = "https://files.pythonhosted.org/packages/0e/09/6003e7ffeb90cc0560da893e3208396a44c210c5ee42efff539639def59b/charset_normalizer-3.4.5-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:165c7b21d19365464e8f70e5ce5e12524c58b48c78c1f5a57524603c1ab003f8", size = 188890, upload-time = "2026-03-06T06:01:38.73Z" }, + { url = "https://files.pythonhosted.org/packages/42/1e/02706edf19e390680daa694d17e2b8eab4b5f7ac285e2a51168b4b22ee6b/charset_normalizer-3.4.5-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:28269983f25a4da0425743d0d257a2d6921ea7d9b83599d4039486ec5b9f911d", size = 206136, upload-time = "2026-03-06T06:01:40.016Z" }, + { url = "https://files.pythonhosted.org/packages/c7/87/942c3def1b37baf3cf786bad01249190f3ca3d5e63a84f831e704977de1f/charset_normalizer-3.4.5-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:d27ce22ec453564770d29d03a9506d449efbb9fa13c00842262b2f6801c48cce", size = 202551, upload-time = "2026-03-06T06:01:41.522Z" }, + { url = "https://files.pythonhosted.org/packages/94/0a/af49691938dfe175d71b8a929bd7e4ace2809c0c5134e28bc535660d5262/charset_normalizer-3.4.5-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:0625665e4ebdddb553ab185de5db7054393af8879fb0c87bd5690d14379d6819", size = 195572, upload-time = "2026-03-06T06:01:43.208Z" }, + { url = "https://files.pythonhosted.org/packages/20/ea/dfb1792a8050a8e694cfbde1570ff97ff74e48afd874152d38163d1df9ae/charset_normalizer-3.4.5-cp313-cp313-manylinux_2_31_armv7l.whl", hash = "sha256:c23eb3263356d94858655b3e63f85ac5d50970c6e8febcdde7830209139cc37d", size = 184438, upload-time = "2026-03-06T06:01:44.755Z" }, + { url = "https://files.pythonhosted.org/packages/72/12/c281e2067466e3ddd0595bfaea58a6946765ace5c72dfa3edc2f5f118026/charset_normalizer-3.4.5-cp313-cp313-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:e6302ca4ae283deb0af68d2fbf467474b8b6aedcd3dab4db187e07f94c109763", size = 193035, upload-time = "2026-03-06T06:01:46.051Z" }, + { url = "https://files.pythonhosted.org/packages/ba/4f/3792c056e7708e10464bad0438a44708886fb8f92e3c3d29ec5e2d964d42/charset_normalizer-3.4.5-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:e51ae7d81c825761d941962450f50d041db028b7278e7b08930b4541b3e45cb9", size = 191340, upload-time = "2026-03-06T06:01:47.547Z" }, + { url = "https://files.pythonhosted.org/packages/e7/86/80ddba897127b5c7a9bccc481b0cd36c8fefa485d113262f0fe4332f0bf4/charset_normalizer-3.4.5-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:597d10dec876923e5c59e48dbd366e852eacb2b806029491d307daea6b917d7c", size = 185464, upload-time = "2026-03-06T06:01:48.764Z" }, + { url = "https://files.pythonhosted.org/packages/4d/00/b5eff85ba198faacab83e0e4b6f0648155f072278e3b392a82478f8b988b/charset_normalizer-3.4.5-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:5cffde4032a197bd3b42fd0b9509ec60fb70918d6970e4cc773f20fc9180ca67", size = 208014, upload-time = "2026-03-06T06:01:50.371Z" }, + { url = "https://files.pythonhosted.org/packages/c8/11/d36f70be01597fd30850dde8a1269ebc8efadd23ba5785808454f2389bde/charset_normalizer-3.4.5-cp313-cp313-musllinux_1_2_riscv64.whl", hash = "sha256:2da4eedcb6338e2321e831a0165759c0c620e37f8cd044a263ff67493be8ffb3", size = 193297, upload-time = "2026-03-06T06:01:51.933Z" }, + { url = "https://files.pythonhosted.org/packages/1a/1d/259eb0a53d4910536c7c2abb9cb25f4153548efb42800c6a9456764649c0/charset_normalizer-3.4.5-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:65a126fb4b070d05340a84fc709dd9e7c75d9b063b610ece8a60197a291d0adf", size = 204321, upload-time = "2026-03-06T06:01:53.887Z" }, + { url = "https://files.pythonhosted.org/packages/84/31/faa6c5b9d3688715e1ed1bb9d124c384fe2fc1633a409e503ffe1c6398c1/charset_normalizer-3.4.5-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:c7a80a9242963416bd81f99349d5f3fce1843c303bd404f204918b6d75a75fd6", size = 197509, upload-time = "2026-03-06T06:01:56.439Z" }, + { url = "https://files.pythonhosted.org/packages/fd/a5/c7d9dd1503ffc08950b3260f5d39ec2366dd08254f0900ecbcf3a6197c7c/charset_normalizer-3.4.5-cp313-cp313-win32.whl", hash = "sha256:f1d725b754e967e648046f00c4facc42d414840f5ccc670c5670f59f83693e4f", size = 132284, upload-time = "2026-03-06T06:01:57.812Z" }, + { url = "https://files.pythonhosted.org/packages/b9/0f/57072b253af40c8aa6636e6de7d75985624c1eb392815b2f934199340a89/charset_normalizer-3.4.5-cp313-cp313-win_amd64.whl", hash = "sha256:e37bd100d2c5d3ba35db9c7c5ba5a9228cbcffe5c4778dc824b164e5257813d7", size = 142630, upload-time = "2026-03-06T06:01:59.062Z" }, + { url = "https://files.pythonhosted.org/packages/31/41/1c4b7cc9f13bd9d369ce3bc993e13d374ce25fa38a2663644283ecf422c1/charset_normalizer-3.4.5-cp313-cp313-win_arm64.whl", hash = "sha256:93b3b2cc5cf1b8743660ce77a4f45f3f6d1172068207c1defc779a36eea6bb36", size = 133254, upload-time = "2026-03-06T06:02:00.281Z" }, + { url = "https://files.pythonhosted.org/packages/43/be/0f0fd9bb4a7fa4fb5067fb7d9ac693d4e928d306f80a0d02bde43a7c4aee/charset_normalizer-3.4.5-cp314-cp314-macosx_10_15_universal2.whl", hash = "sha256:8197abe5ca1ffb7d91e78360f915eef5addff270f8a71c1fc5be24a56f3e4873", size = 280232, upload-time = "2026-03-06T06:02:01.508Z" }, + { url = "https://files.pythonhosted.org/packages/28/02/983b5445e4bef49cd8c9da73a8e029f0825f39b74a06d201bfaa2e55142a/charset_normalizer-3.4.5-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:a2aecdb364b8a1802afdc7f9327d55dad5366bc97d8502d0f5854e50712dbc5f", size = 189688, upload-time = "2026-03-06T06:02:02.857Z" }, + { url = "https://files.pythonhosted.org/packages/d0/88/152745c5166437687028027dc080e2daed6fe11cfa95a22f4602591c42db/charset_normalizer-3.4.5-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:a66aa5022bf81ab4b1bebfb009db4fd68e0c6d4307a1ce5ef6a26e5878dfc9e4", size = 206833, upload-time = "2026-03-06T06:02:05.127Z" }, + { url = "https://files.pythonhosted.org/packages/cb/0f/ebc15c8b02af2f19be9678d6eed115feeeccc45ce1f4b098d986c13e8769/charset_normalizer-3.4.5-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:d77f97e515688bd615c1d1f795d540f32542d514242067adcb8ef532504cb9ee", size = 202879, upload-time = "2026-03-06T06:02:06.446Z" }, + { url = "https://files.pythonhosted.org/packages/38/9c/71336bff6934418dc8d1e8a1644176ac9088068bc571da612767619c97b3/charset_normalizer-3.4.5-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:01a1ed54b953303ca7e310fafe0fe347aab348bd81834a0bcd602eb538f89d66", size = 195764, upload-time = "2026-03-06T06:02:08.763Z" }, + { url = "https://files.pythonhosted.org/packages/b7/95/ce92fde4f98615661871bc282a856cf9b8a15f686ba0af012984660d480b/charset_normalizer-3.4.5-cp314-cp314-manylinux_2_31_armv7l.whl", hash = "sha256:b2d37d78297b39a9eb9eb92c0f6df98c706467282055419df141389b23f93362", size = 183728, upload-time = "2026-03-06T06:02:10.137Z" }, + { url = "https://files.pythonhosted.org/packages/1c/e7/f5b4588d94e747ce45ae680f0f242bc2d98dbd4eccfab73e6160b6893893/charset_normalizer-3.4.5-cp314-cp314-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:e71bbb595973622b817c042bd943c3f3667e9c9983ce3d205f973f486fec98a7", size = 192937, upload-time = "2026-03-06T06:02:11.663Z" }, + { url = "https://files.pythonhosted.org/packages/f9/29/9d94ed6b929bf9f48bf6ede6e7474576499f07c4c5e878fb186083622716/charset_normalizer-3.4.5-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:4cd966c2559f501c6fd69294d082c2934c8dd4719deb32c22961a5ac6db0df1d", size = 192040, upload-time = "2026-03-06T06:02:13.489Z" }, + { url = "https://files.pythonhosted.org/packages/15/d2/1a093a1cf827957f9445f2fe7298bcc16f8fc5e05c1ed2ad1af0b239035e/charset_normalizer-3.4.5-cp314-cp314-musllinux_1_2_armv7l.whl", hash = "sha256:d5e52d127045d6ae01a1e821acfad2f3a1866c54d0e837828538fabe8d9d1bd6", size = 184107, upload-time = "2026-03-06T06:02:14.83Z" }, + { url = "https://files.pythonhosted.org/packages/0f/7d/82068ce16bd36135df7b97f6333c5d808b94e01d4599a682e2337ed5fd14/charset_normalizer-3.4.5-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:30a2b1a48478c3428d047ed9690d57c23038dac838a87ad624c85c0a78ebeb39", size = 208310, upload-time = "2026-03-06T06:02:16.165Z" }, + { url = "https://files.pythonhosted.org/packages/84/4e/4dfb52307bb6af4a5c9e73e482d171b81d36f522b21ccd28a49656baa680/charset_normalizer-3.4.5-cp314-cp314-musllinux_1_2_riscv64.whl", hash = "sha256:d8ed79b8f6372ca4254955005830fd61c1ccdd8c0fac6603e2c145c61dd95db6", size = 192918, upload-time = "2026-03-06T06:02:18.144Z" }, + { url = "https://files.pythonhosted.org/packages/08/a4/159ff7da662cf7201502ca89980b8f06acf3e887b278956646a8aeb178ab/charset_normalizer-3.4.5-cp314-cp314-musllinux_1_2_s390x.whl", hash = "sha256:c5af897b45fa606b12464ccbe0014bbf8c09191e0a66aab6aa9d5cf6e77e0c94", size = 204615, upload-time = "2026-03-06T06:02:19.821Z" }, + { url = "https://files.pythonhosted.org/packages/d6/62/0dd6172203cb6b429ffffc9935001fde42e5250d57f07b0c28c6046deb6b/charset_normalizer-3.4.5-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:1088345bcc93c58d8d8f3d783eca4a6e7a7752bbff26c3eee7e73c597c191c2e", size = 197784, upload-time = "2026-03-06T06:02:21.86Z" }, + { url = "https://files.pythonhosted.org/packages/c7/5e/1aab5cb737039b9c59e63627dc8bbc0d02562a14f831cc450e5f91d84ce1/charset_normalizer-3.4.5-cp314-cp314-win32.whl", hash = "sha256:ee57b926940ba00bca7ba7041e665cc956e55ef482f851b9b65acb20d867e7a2", size = 133009, upload-time = "2026-03-06T06:02:23.289Z" }, + { url = "https://files.pythonhosted.org/packages/40/65/e7c6c77d7aaa4c0d7974f2e403e17f0ed2cb0fc135f77d686b916bf1eead/charset_normalizer-3.4.5-cp314-cp314-win_amd64.whl", hash = "sha256:4481e6da1830c8a1cc0b746b47f603b653dadb690bcd851d039ffaefe70533aa", size = 143511, upload-time = "2026-03-06T06:02:26.195Z" }, + { url = "https://files.pythonhosted.org/packages/ba/91/52b0841c71f152f563b8e072896c14e3d83b195c188b338d3cc2e582d1d4/charset_normalizer-3.4.5-cp314-cp314-win_arm64.whl", hash = "sha256:97ab7787092eb9b50fb47fa04f24c75b768a606af1bcba1957f07f128a7219e4", size = 133775, upload-time = "2026-03-06T06:02:27.473Z" }, + { url = "https://files.pythonhosted.org/packages/c5/60/3a621758945513adfd4db86827a5bafcc615f913dbd0b4c2ed64a65731be/charset_normalizer-3.4.5-py3-none-any.whl", hash = "sha256:9db5e3fcdcee89a78c04dffb3fe33c79f77bd741a624946db2591c81b2fc85b0", size = 55455, upload-time = "2026-03-06T06:03:17.827Z" }, +] + +[[package]] +name = "click" +version = "8.3.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "colorama", marker = "sys_platform == 'win32'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/3d/fa/656b739db8587d7b5dfa22e22ed02566950fbfbcdc20311993483657a5c0/click-8.3.1.tar.gz", hash = "sha256:12ff4785d337a1bb490bb7e9c2b1ee5da3112e94a8622f26a6c77f5d2fc6842a", size = 295065, upload-time = "2025-11-15T20:45:42.706Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/98/78/01c019cdb5d6498122777c1a43056ebb3ebfeef2076d9d026bfe15583b2b/click-8.3.1-py3-none-any.whl", hash = "sha256:981153a64e25f12d547d3426c367a4857371575ee7ad18df2a6183ab0545b2a6", size = 108274, upload-time = "2025-11-15T20:45:41.139Z" }, +] + +[[package]] +name = "colorama" +version = "0.4.6" +source = { registry = "https://pypi.org/simple" } +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" } +wheels = [ + { 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" }, +] + +[[package]] +name = "coloredlogs" +version = "15.0.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "humanfriendly" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/cc/c7/eed8f27100517e8c0e6b923d5f0845d0cb99763da6fdee00478f91db7325/coloredlogs-15.0.1.tar.gz", hash = "sha256:7c991aa71a4577af2f82600d8f8f3a89f936baeaf9b50a9c197da014e5bf16b0", size = 278520, upload-time = "2021-06-11T10:22:45.202Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/a7/06/3d6badcf13db419e25b07041d9c7b4a2c331d3f4e7134445ec5df57714cd/coloredlogs-15.0.1-py2.py3-none-any.whl", hash = "sha256:612ee75c546f53e92e70049c9dbfcc18c935a2b9a53b66085ce9ef6a6e5c0934", size = 46018, upload-time = "2021-06-11T10:22:42.561Z" }, +] + +[[package]] +name = "colorlog" +version = "6.10.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "colorama", marker = "sys_platform == 'win32'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/a2/61/f083b5ac52e505dfc1c624eafbf8c7589a0d7f32daa398d2e7590efa5fda/colorlog-6.10.1.tar.gz", hash = "sha256:eb4ae5cb65fe7fec7773c2306061a8e63e02efc2c72eba9d27b0fa23c94f1321", size = 17162, upload-time = "2025-10-16T16:14:11.978Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/6d/c1/e419ef3723a074172b68aaa89c9f3de486ed4c2399e2dbd8113a4fdcaf9e/colorlog-6.10.1-py3-none-any.whl", hash = "sha256:2d7e8348291948af66122cff006c9f8da6255d224e7cf8e37d8de2df3bad8c9c", size = 11743, upload-time = "2025-10-16T16:14:10.512Z" }, +] + +[[package]] +name = "contourpy" +version = "1.3.2" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version < '3.11'", +] +dependencies = [ + { name = "numpy", version = "2.2.6", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/66/54/eb9bfc647b19f2009dd5c7f5ec51c4e6ca831725f1aea7a993034f483147/contourpy-1.3.2.tar.gz", hash = "sha256:b6945942715a034c671b7fc54f9588126b0b8bf23db2696e3ca8328f3ff0ab54", size = 13466130, upload-time = "2025-04-15T17:47:53.79Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/12/a3/da4153ec8fe25d263aa48c1a4cbde7f49b59af86f0b6f7862788c60da737/contourpy-1.3.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:ba38e3f9f330af820c4b27ceb4b9c7feee5fe0493ea53a8720f4792667465934", size = 268551, upload-time = "2025-04-15T17:34:46.581Z" }, + { url = "https://files.pythonhosted.org/packages/2f/6c/330de89ae1087eb622bfca0177d32a7ece50c3ef07b28002de4757d9d875/contourpy-1.3.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:dc41ba0714aa2968d1f8674ec97504a8f7e334f48eeacebcaa6256213acb0989", size = 253399, upload-time = "2025-04-15T17:34:51.427Z" }, + { url = "https://files.pythonhosted.org/packages/c1/bd/20c6726b1b7f81a8bee5271bed5c165f0a8e1f572578a9d27e2ccb763cb2/contourpy-1.3.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9be002b31c558d1ddf1b9b415b162c603405414bacd6932d031c5b5a8b757f0d", size = 312061, upload-time = "2025-04-15T17:34:55.961Z" }, + { url = "https://files.pythonhosted.org/packages/22/fc/a9665c88f8a2473f823cf1ec601de9e5375050f1958cbb356cdf06ef1ab6/contourpy-1.3.2-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8d2e74acbcba3bfdb6d9d8384cdc4f9260cae86ed9beee8bd5f54fee49a430b9", size = 351956, upload-time = "2025-04-15T17:35:00.992Z" }, + { url = "https://files.pythonhosted.org/packages/25/eb/9f0a0238f305ad8fb7ef42481020d6e20cf15e46be99a1fcf939546a177e/contourpy-1.3.2-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e259bced5549ac64410162adc973c5e2fb77f04df4a439d00b478e57a0e65512", size = 320872, upload-time = "2025-04-15T17:35:06.177Z" }, + { url = "https://files.pythonhosted.org/packages/32/5c/1ee32d1c7956923202f00cf8d2a14a62ed7517bdc0ee1e55301227fc273c/contourpy-1.3.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ad687a04bc802cbe8b9c399c07162a3c35e227e2daccf1668eb1f278cb698631", size = 325027, upload-time = "2025-04-15T17:35:11.244Z" }, + { url = "https://files.pythonhosted.org/packages/83/bf/9baed89785ba743ef329c2b07fd0611d12bfecbedbdd3eeecf929d8d3b52/contourpy-1.3.2-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:cdd22595308f53ef2f891040ab2b93d79192513ffccbd7fe19be7aa773a5e09f", size = 1306641, upload-time = "2025-04-15T17:35:26.701Z" }, + { url = "https://files.pythonhosted.org/packages/d4/cc/74e5e83d1e35de2d28bd97033426b450bc4fd96e092a1f7a63dc7369b55d/contourpy-1.3.2-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:b4f54d6a2defe9f257327b0f243612dd051cc43825587520b1bf74a31e2f6ef2", size = 1374075, upload-time = "2025-04-15T17:35:43.204Z" }, + { url = "https://files.pythonhosted.org/packages/0c/42/17f3b798fd5e033b46a16f8d9fcb39f1aba051307f5ebf441bad1ecf78f8/contourpy-1.3.2-cp310-cp310-win32.whl", hash = "sha256:f939a054192ddc596e031e50bb13b657ce318cf13d264f095ce9db7dc6ae81c0", size = 177534, upload-time = "2025-04-15T17:35:46.554Z" }, + { url = "https://files.pythonhosted.org/packages/54/ec/5162b8582f2c994721018d0c9ece9dc6ff769d298a8ac6b6a652c307e7df/contourpy-1.3.2-cp310-cp310-win_amd64.whl", hash = "sha256:c440093bbc8fc21c637c03bafcbef95ccd963bc6e0514ad887932c18ca2a759a", size = 221188, upload-time = "2025-04-15T17:35:50.064Z" }, + { url = "https://files.pythonhosted.org/packages/b3/b9/ede788a0b56fc5b071639d06c33cb893f68b1178938f3425debebe2dab78/contourpy-1.3.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:6a37a2fb93d4df3fc4c0e363ea4d16f83195fc09c891bc8ce072b9d084853445", size = 269636, upload-time = "2025-04-15T17:35:54.473Z" }, + { url = "https://files.pythonhosted.org/packages/e6/75/3469f011d64b8bbfa04f709bfc23e1dd71be54d05b1b083be9f5b22750d1/contourpy-1.3.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:b7cd50c38f500bbcc9b6a46643a40e0913673f869315d8e70de0438817cb7773", size = 254636, upload-time = "2025-04-15T17:35:58.283Z" }, + { url = "https://files.pythonhosted.org/packages/8d/2f/95adb8dae08ce0ebca4fd8e7ad653159565d9739128b2d5977806656fcd2/contourpy-1.3.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d6658ccc7251a4433eebd89ed2672c2ed96fba367fd25ca9512aa92a4b46c4f1", size = 313053, upload-time = "2025-04-15T17:36:03.235Z" }, + { url = "https://files.pythonhosted.org/packages/c3/a6/8ccf97a50f31adfa36917707fe39c9a0cbc24b3bbb58185577f119736cc9/contourpy-1.3.2-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:70771a461aaeb335df14deb6c97439973d253ae70660ca085eec25241137ef43", size = 352985, upload-time = "2025-04-15T17:36:08.275Z" }, + { url = "https://files.pythonhosted.org/packages/1d/b6/7925ab9b77386143f39d9c3243fdd101621b4532eb126743201160ffa7e6/contourpy-1.3.2-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:65a887a6e8c4cd0897507d814b14c54a8c2e2aa4ac9f7686292f9769fcf9a6ab", size = 323750, upload-time = "2025-04-15T17:36:13.29Z" }, + { url = "https://files.pythonhosted.org/packages/c2/f3/20c5d1ef4f4748e52d60771b8560cf00b69d5c6368b5c2e9311bcfa2a08b/contourpy-1.3.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3859783aefa2b8355697f16642695a5b9792e7a46ab86da1118a4a23a51a33d7", size = 326246, upload-time = "2025-04-15T17:36:18.329Z" }, + { url = "https://files.pythonhosted.org/packages/8c/e5/9dae809e7e0b2d9d70c52b3d24cba134dd3dad979eb3e5e71f5df22ed1f5/contourpy-1.3.2-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:eab0f6db315fa4d70f1d8ab514e527f0366ec021ff853d7ed6a2d33605cf4b83", size = 1308728, upload-time = "2025-04-15T17:36:33.878Z" }, + { url = "https://files.pythonhosted.org/packages/e2/4a/0058ba34aeea35c0b442ae61a4f4d4ca84d6df8f91309bc2d43bb8dd248f/contourpy-1.3.2-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:d91a3ccc7fea94ca0acab82ceb77f396d50a1f67412efe4c526f5d20264e6ecd", size = 1375762, upload-time = "2025-04-15T17:36:51.295Z" }, + { url = "https://files.pythonhosted.org/packages/09/33/7174bdfc8b7767ef2c08ed81244762d93d5c579336fc0b51ca57b33d1b80/contourpy-1.3.2-cp311-cp311-win32.whl", hash = "sha256:1c48188778d4d2f3d48e4643fb15d8608b1d01e4b4d6b0548d9b336c28fc9b6f", size = 178196, upload-time = "2025-04-15T17:36:55.002Z" }, + { url = "https://files.pythonhosted.org/packages/5e/fe/4029038b4e1c4485cef18e480b0e2cd2d755448bb071eb9977caac80b77b/contourpy-1.3.2-cp311-cp311-win_amd64.whl", hash = "sha256:5ebac872ba09cb8f2131c46b8739a7ff71de28a24c869bcad554477eb089a878", size = 222017, upload-time = "2025-04-15T17:36:58.576Z" }, + { url = "https://files.pythonhosted.org/packages/34/f7/44785876384eff370c251d58fd65f6ad7f39adce4a093c934d4a67a7c6b6/contourpy-1.3.2-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:4caf2bcd2969402bf77edc4cb6034c7dd7c0803213b3523f111eb7460a51b8d2", size = 271580, upload-time = "2025-04-15T17:37:03.105Z" }, + { url = "https://files.pythonhosted.org/packages/93/3b/0004767622a9826ea3d95f0e9d98cd8729015768075d61f9fea8eeca42a8/contourpy-1.3.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:82199cb78276249796419fe36b7386bd8d2cc3f28b3bc19fe2454fe2e26c4c15", size = 255530, upload-time = "2025-04-15T17:37:07.026Z" }, + { url = "https://files.pythonhosted.org/packages/e7/bb/7bd49e1f4fa805772d9fd130e0d375554ebc771ed7172f48dfcd4ca61549/contourpy-1.3.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:106fab697af11456fcba3e352ad50effe493a90f893fca6c2ca5c033820cea92", size = 307688, upload-time = "2025-04-15T17:37:11.481Z" }, + { url = "https://files.pythonhosted.org/packages/fc/97/e1d5dbbfa170725ef78357a9a0edc996b09ae4af170927ba8ce977e60a5f/contourpy-1.3.2-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d14f12932a8d620e307f715857107b1d1845cc44fdb5da2bc8e850f5ceba9f87", size = 347331, upload-time = "2025-04-15T17:37:18.212Z" }, + { url = "https://files.pythonhosted.org/packages/6f/66/e69e6e904f5ecf6901be3dd16e7e54d41b6ec6ae3405a535286d4418ffb4/contourpy-1.3.2-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:532fd26e715560721bb0d5fc7610fce279b3699b018600ab999d1be895b09415", size = 318963, upload-time = "2025-04-15T17:37:22.76Z" }, + { url = "https://files.pythonhosted.org/packages/a8/32/b8a1c8965e4f72482ff2d1ac2cd670ce0b542f203c8e1d34e7c3e6925da7/contourpy-1.3.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f26b383144cf2d2c29f01a1e8170f50dacf0eac02d64139dcd709a8ac4eb3cfe", size = 323681, upload-time = "2025-04-15T17:37:33.001Z" }, + { url = "https://files.pythonhosted.org/packages/30/c6/12a7e6811d08757c7162a541ca4c5c6a34c0f4e98ef2b338791093518e40/contourpy-1.3.2-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:c49f73e61f1f774650a55d221803b101d966ca0c5a2d6d5e4320ec3997489441", size = 1308674, upload-time = "2025-04-15T17:37:48.64Z" }, + { url = "https://files.pythonhosted.org/packages/2a/8a/bebe5a3f68b484d3a2b8ffaf84704b3e343ef1addea528132ef148e22b3b/contourpy-1.3.2-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:3d80b2c0300583228ac98d0a927a1ba6a2ba6b8a742463c564f1d419ee5b211e", size = 1380480, upload-time = "2025-04-15T17:38:06.7Z" }, + { url = "https://files.pythonhosted.org/packages/34/db/fcd325f19b5978fb509a7d55e06d99f5f856294c1991097534360b307cf1/contourpy-1.3.2-cp312-cp312-win32.whl", hash = "sha256:90df94c89a91b7362e1142cbee7568f86514412ab8a2c0d0fca72d7e91b62912", size = 178489, upload-time = "2025-04-15T17:38:10.338Z" }, + { url = "https://files.pythonhosted.org/packages/01/c8/fadd0b92ffa7b5eb5949bf340a63a4a496a6930a6c37a7ba0f12acb076d6/contourpy-1.3.2-cp312-cp312-win_amd64.whl", hash = "sha256:8c942a01d9163e2e5cfb05cb66110121b8d07ad438a17f9e766317bcb62abf73", size = 223042, upload-time = "2025-04-15T17:38:14.239Z" }, + { url = "https://files.pythonhosted.org/packages/2e/61/5673f7e364b31e4e7ef6f61a4b5121c5f170f941895912f773d95270f3a2/contourpy-1.3.2-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:de39db2604ae755316cb5967728f4bea92685884b1e767b7c24e983ef5f771cb", size = 271630, upload-time = "2025-04-15T17:38:19.142Z" }, + { url = "https://files.pythonhosted.org/packages/ff/66/a40badddd1223822c95798c55292844b7e871e50f6bfd9f158cb25e0bd39/contourpy-1.3.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:3f9e896f447c5c8618f1edb2bafa9a4030f22a575ec418ad70611450720b5b08", size = 255670, upload-time = "2025-04-15T17:38:23.688Z" }, + { url = "https://files.pythonhosted.org/packages/1e/c7/cf9fdee8200805c9bc3b148f49cb9482a4e3ea2719e772602a425c9b09f8/contourpy-1.3.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:71e2bd4a1c4188f5c2b8d274da78faab884b59df20df63c34f74aa1813c4427c", size = 306694, upload-time = "2025-04-15T17:38:28.238Z" }, + { url = "https://files.pythonhosted.org/packages/dd/e7/ccb9bec80e1ba121efbffad7f38021021cda5be87532ec16fd96533bb2e0/contourpy-1.3.2-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:de425af81b6cea33101ae95ece1f696af39446db9682a0b56daaa48cfc29f38f", size = 345986, upload-time = "2025-04-15T17:38:33.502Z" }, + { url = "https://files.pythonhosted.org/packages/dc/49/ca13bb2da90391fa4219fdb23b078d6065ada886658ac7818e5441448b78/contourpy-1.3.2-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:977e98a0e0480d3fe292246417239d2d45435904afd6d7332d8455981c408b85", size = 318060, upload-time = "2025-04-15T17:38:38.672Z" }, + { url = "https://files.pythonhosted.org/packages/c8/65/5245ce8c548a8422236c13ffcdcdada6a2a812c361e9e0c70548bb40b661/contourpy-1.3.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:434f0adf84911c924519d2b08fc10491dd282b20bdd3fa8f60fd816ea0b48841", size = 322747, upload-time = "2025-04-15T17:38:43.712Z" }, + { url = "https://files.pythonhosted.org/packages/72/30/669b8eb48e0a01c660ead3752a25b44fdb2e5ebc13a55782f639170772f9/contourpy-1.3.2-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:c66c4906cdbc50e9cba65978823e6e00b45682eb09adbb78c9775b74eb222422", size = 1308895, upload-time = "2025-04-15T17:39:00.224Z" }, + { url = "https://files.pythonhosted.org/packages/05/5a/b569f4250decee6e8d54498be7bdf29021a4c256e77fe8138c8319ef8eb3/contourpy-1.3.2-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:8b7fc0cd78ba2f4695fd0a6ad81a19e7e3ab825c31b577f384aa9d7817dc3bef", size = 1379098, upload-time = "2025-04-15T17:43:29.649Z" }, + { url = "https://files.pythonhosted.org/packages/19/ba/b227c3886d120e60e41b28740ac3617b2f2b971b9f601c835661194579f1/contourpy-1.3.2-cp313-cp313-win32.whl", hash = "sha256:15ce6ab60957ca74cff444fe66d9045c1fd3e92c8936894ebd1f3eef2fff075f", size = 178535, upload-time = "2025-04-15T17:44:44.532Z" }, + { url = "https://files.pythonhosted.org/packages/12/6e/2fed56cd47ca739b43e892707ae9a13790a486a3173be063681ca67d2262/contourpy-1.3.2-cp313-cp313-win_amd64.whl", hash = "sha256:e1578f7eafce927b168752ed7e22646dad6cd9bca673c60bff55889fa236ebf9", size = 223096, upload-time = "2025-04-15T17:44:48.194Z" }, + { url = "https://files.pythonhosted.org/packages/54/4c/e76fe2a03014a7c767d79ea35c86a747e9325537a8b7627e0e5b3ba266b4/contourpy-1.3.2-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:0475b1f6604896bc7c53bb070e355e9321e1bc0d381735421a2d2068ec56531f", size = 285090, upload-time = "2025-04-15T17:43:34.084Z" }, + { url = "https://files.pythonhosted.org/packages/7b/e2/5aba47debd55d668e00baf9651b721e7733975dc9fc27264a62b0dd26eb8/contourpy-1.3.2-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:c85bb486e9be652314bb5b9e2e3b0d1b2e643d5eec4992c0fbe8ac71775da739", size = 268643, upload-time = "2025-04-15T17:43:38.626Z" }, + { url = "https://files.pythonhosted.org/packages/a1/37/cd45f1f051fe6230f751cc5cdd2728bb3a203f5619510ef11e732109593c/contourpy-1.3.2-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:745b57db7758f3ffc05a10254edd3182a2a83402a89c00957a8e8a22f5582823", size = 310443, upload-time = "2025-04-15T17:43:44.522Z" }, + { url = "https://files.pythonhosted.org/packages/8b/a2/36ea6140c306c9ff6dd38e3bcec80b3b018474ef4d17eb68ceecd26675f4/contourpy-1.3.2-cp313-cp313t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:970e9173dbd7eba9b4e01aab19215a48ee5dd3f43cef736eebde064a171f89a5", size = 349865, upload-time = "2025-04-15T17:43:49.545Z" }, + { url = "https://files.pythonhosted.org/packages/95/b7/2fc76bc539693180488f7b6cc518da7acbbb9e3b931fd9280504128bf956/contourpy-1.3.2-cp313-cp313t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c6c4639a9c22230276b7bffb6a850dfc8258a2521305e1faefe804d006b2e532", size = 321162, upload-time = "2025-04-15T17:43:54.203Z" }, + { url = "https://files.pythonhosted.org/packages/f4/10/76d4f778458b0aa83f96e59d65ece72a060bacb20cfbee46cf6cd5ceba41/contourpy-1.3.2-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cc829960f34ba36aad4302e78eabf3ef16a3a100863f0d4eeddf30e8a485a03b", size = 327355, upload-time = "2025-04-15T17:44:01.025Z" }, + { url = "https://files.pythonhosted.org/packages/43/a3/10cf483ea683f9f8ab096c24bad3cce20e0d1dd9a4baa0e2093c1c962d9d/contourpy-1.3.2-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:d32530b534e986374fc19eaa77fcb87e8a99e5431499949b828312bdcd20ac52", size = 1307935, upload-time = "2025-04-15T17:44:17.322Z" }, + { url = "https://files.pythonhosted.org/packages/78/73/69dd9a024444489e22d86108e7b913f3528f56cfc312b5c5727a44188471/contourpy-1.3.2-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:e298e7e70cf4eb179cc1077be1c725b5fd131ebc81181bf0c03525c8abc297fd", size = 1372168, upload-time = "2025-04-15T17:44:33.43Z" }, + { url = "https://files.pythonhosted.org/packages/0f/1b/96d586ccf1b1a9d2004dd519b25fbf104a11589abfd05484ff12199cca21/contourpy-1.3.2-cp313-cp313t-win32.whl", hash = "sha256:d0e589ae0d55204991450bb5c23f571c64fe43adaa53f93fc902a84c96f52fe1", size = 189550, upload-time = "2025-04-15T17:44:37.092Z" }, + { url = "https://files.pythonhosted.org/packages/b0/e6/6000d0094e8a5e32ad62591c8609e269febb6e4db83a1c75ff8868b42731/contourpy-1.3.2-cp313-cp313t-win_amd64.whl", hash = "sha256:78e9253c3de756b3f6a5174d024c4835acd59eb3f8e2ca13e775dbffe1558f69", size = 238214, upload-time = "2025-04-15T17:44:40.827Z" }, + { url = "https://files.pythonhosted.org/packages/33/05/b26e3c6ecc05f349ee0013f0bb850a761016d89cec528a98193a48c34033/contourpy-1.3.2-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:fd93cc7f3139b6dd7aab2f26a90dde0aa9fc264dbf70f6740d498a70b860b82c", size = 265681, upload-time = "2025-04-15T17:44:59.314Z" }, + { url = "https://files.pythonhosted.org/packages/2b/25/ac07d6ad12affa7d1ffed11b77417d0a6308170f44ff20fa1d5aa6333f03/contourpy-1.3.2-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:107ba8a6a7eec58bb475329e6d3b95deba9440667c4d62b9b6063942b61d7f16", size = 315101, upload-time = "2025-04-15T17:45:04.165Z" }, + { url = "https://files.pythonhosted.org/packages/8f/4d/5bb3192bbe9d3f27e3061a6a8e7733c9120e203cb8515767d30973f71030/contourpy-1.3.2-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:ded1706ed0c1049224531b81128efbd5084598f18d8a2d9efae833edbd2b40ad", size = 220599, upload-time = "2025-04-15T17:45:08.456Z" }, + { url = "https://files.pythonhosted.org/packages/ff/c0/91f1215d0d9f9f343e4773ba6c9b89e8c0cc7a64a6263f21139da639d848/contourpy-1.3.2-pp311-pypy311_pp73-macosx_10_15_x86_64.whl", hash = "sha256:5f5964cdad279256c084b69c3f412b7801e15356b16efa9d78aa974041903da0", size = 266807, upload-time = "2025-04-15T17:45:15.535Z" }, + { url = "https://files.pythonhosted.org/packages/d4/79/6be7e90c955c0487e7712660d6cead01fa17bff98e0ea275737cc2bc8e71/contourpy-1.3.2-pp311-pypy311_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:49b65a95d642d4efa8f64ba12558fcb83407e58a2dfba9d796d77b63ccfcaff5", size = 318729, upload-time = "2025-04-15T17:45:20.166Z" }, + { url = "https://files.pythonhosted.org/packages/87/68/7f46fb537958e87427d98a4074bcde4b67a70b04900cfc5ce29bc2f556c1/contourpy-1.3.2-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:8c5acb8dddb0752bf252e01a3035b21443158910ac16a3b0d20e7fed7d534ce5", size = 221791, upload-time = "2025-04-15T17:45:24.794Z" }, +] + +[[package]] +name = "contourpy" +version = "1.3.3" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version >= '3.14' and sys_platform == 'win32'", + "python_full_version >= '3.14' and sys_platform == 'emscripten'", + "python_full_version >= '3.14' and sys_platform != 'emscripten' and sys_platform != 'win32'", + "python_full_version == '3.13.*' and sys_platform == 'win32'", + "python_full_version == '3.13.*' and sys_platform == 'emscripten'", + "python_full_version == '3.13.*' and sys_platform != 'emscripten' and sys_platform != 'win32'", + "python_full_version == '3.12.*' and sys_platform == 'win32'", + "python_full_version == '3.12.*' and sys_platform == 'emscripten'", + "python_full_version == '3.12.*' and sys_platform != 'emscripten' and sys_platform != 'win32'", + "python_full_version == '3.11.*' and sys_platform == 'win32'", + "python_full_version == '3.11.*' and sys_platform == 'emscripten'", + "python_full_version == '3.11.*' and sys_platform != 'emscripten' and sys_platform != 'win32'", +] +dependencies = [ + { name = "numpy", version = "2.4.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/58/01/1253e6698a07380cd31a736d248a3f2a50a7c88779a1813da27503cadc2a/contourpy-1.3.3.tar.gz", hash = "sha256:083e12155b210502d0bca491432bb04d56dc3432f95a979b429f2848c3dbe880", size = 13466174, upload-time = "2025-07-26T12:03:12.549Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/91/2e/c4390a31919d8a78b90e8ecf87cd4b4c4f05a5b48d05ec17db8e5404c6f4/contourpy-1.3.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:709a48ef9a690e1343202916450bc48b9e51c049b089c7f79a267b46cffcdaa1", size = 288773, upload-time = "2025-07-26T12:01:02.277Z" }, + { url = "https://files.pythonhosted.org/packages/0d/44/c4b0b6095fef4dc9c420e041799591e3b63e9619e3044f7f4f6c21c0ab24/contourpy-1.3.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:23416f38bfd74d5d28ab8429cc4d63fa67d5068bd711a85edb1c3fb0c3e2f381", size = 270149, upload-time = "2025-07-26T12:01:04.072Z" }, + { url = "https://files.pythonhosted.org/packages/30/2e/dd4ced42fefac8470661d7cb7e264808425e6c5d56d175291e93890cce09/contourpy-1.3.3-cp311-cp311-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:929ddf8c4c7f348e4c0a5a3a714b5c8542ffaa8c22954862a46ca1813b667ee7", size = 329222, upload-time = "2025-07-26T12:01:05.688Z" }, + { url = "https://files.pythonhosted.org/packages/f2/74/cc6ec2548e3d276c71389ea4802a774b7aa3558223b7bade3f25787fafc2/contourpy-1.3.3-cp311-cp311-manylinux_2_26_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:9e999574eddae35f1312c2b4b717b7885d4edd6cb46700e04f7f02db454e67c1", size = 377234, upload-time = "2025-07-26T12:01:07.054Z" }, + { url = "https://files.pythonhosted.org/packages/03/b3/64ef723029f917410f75c09da54254c5f9ea90ef89b143ccadb09df14c15/contourpy-1.3.3-cp311-cp311-manylinux_2_26_s390x.manylinux_2_28_s390x.whl", hash = "sha256:0bf67e0e3f482cb69779dd3061b534eb35ac9b17f163d851e2a547d56dba0a3a", size = 380555, upload-time = "2025-07-26T12:01:08.801Z" }, + { url = "https://files.pythonhosted.org/packages/5f/4b/6157f24ca425b89fe2eb7e7be642375711ab671135be21e6faa100f7448c/contourpy-1.3.3-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:51e79c1f7470158e838808d4a996fa9bac72c498e93d8ebe5119bc1e6becb0db", size = 355238, upload-time = "2025-07-26T12:01:10.319Z" }, + { url = "https://files.pythonhosted.org/packages/98/56/f914f0dd678480708a04cfd2206e7c382533249bc5001eb9f58aa693e200/contourpy-1.3.3-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:598c3aaece21c503615fd59c92a3598b428b2f01bfb4b8ca9c4edeecc2438620", size = 1326218, upload-time = "2025-07-26T12:01:12.659Z" }, + { url = "https://files.pythonhosted.org/packages/fb/d7/4a972334a0c971acd5172389671113ae82aa7527073980c38d5868ff1161/contourpy-1.3.3-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:322ab1c99b008dad206d406bb61d014cf0174df491ae9d9d0fac6a6fda4f977f", size = 1392867, upload-time = "2025-07-26T12:01:15.533Z" }, + { url = "https://files.pythonhosted.org/packages/75/3e/f2cc6cd56dc8cff46b1a56232eabc6feea52720083ea71ab15523daab796/contourpy-1.3.3-cp311-cp311-win32.whl", hash = "sha256:fd907ae12cd483cd83e414b12941c632a969171bf90fc937d0c9f268a31cafff", size = 183677, upload-time = "2025-07-26T12:01:17.088Z" }, + { url = "https://files.pythonhosted.org/packages/98/4b/9bd370b004b5c9d8045c6c33cf65bae018b27aca550a3f657cdc99acdbd8/contourpy-1.3.3-cp311-cp311-win_amd64.whl", hash = "sha256:3519428f6be58431c56581f1694ba8e50626f2dd550af225f82fb5f5814d2a42", size = 225234, upload-time = "2025-07-26T12:01:18.256Z" }, + { url = "https://files.pythonhosted.org/packages/d9/b6/71771e02c2e004450c12b1120a5f488cad2e4d5b590b1af8bad060360fe4/contourpy-1.3.3-cp311-cp311-win_arm64.whl", hash = "sha256:15ff10bfada4bf92ec8b31c62bf7c1834c244019b4a33095a68000d7075df470", size = 193123, upload-time = "2025-07-26T12:01:19.848Z" }, + { url = "https://files.pythonhosted.org/packages/be/45/adfee365d9ea3d853550b2e735f9d66366701c65db7855cd07621732ccfc/contourpy-1.3.3-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:b08a32ea2f8e42cf1d4be3169a98dd4be32bafe4f22b6c4cb4ba810fa9e5d2cb", size = 293419, upload-time = "2025-07-26T12:01:21.16Z" }, + { url = "https://files.pythonhosted.org/packages/53/3e/405b59cfa13021a56bba395a6b3aca8cec012b45bf177b0eaf7a202cde2c/contourpy-1.3.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:556dba8fb6f5d8742f2923fe9457dbdd51e1049c4a43fd3986a0b14a1d815fc6", size = 273979, upload-time = "2025-07-26T12:01:22.448Z" }, + { url = "https://files.pythonhosted.org/packages/d4/1c/a12359b9b2ca3a845e8f7f9ac08bdf776114eb931392fcad91743e2ea17b/contourpy-1.3.3-cp312-cp312-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:92d9abc807cf7d0e047b95ca5d957cf4792fcd04e920ca70d48add15c1a90ea7", size = 332653, upload-time = "2025-07-26T12:01:24.155Z" }, + { url = "https://files.pythonhosted.org/packages/63/12/897aeebfb475b7748ea67b61e045accdfcf0d971f8a588b67108ed7f5512/contourpy-1.3.3-cp312-cp312-manylinux_2_26_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:b2e8faa0ed68cb29af51edd8e24798bb661eac3bd9f65420c1887b6ca89987c8", size = 379536, upload-time = "2025-07-26T12:01:25.91Z" }, + { url = "https://files.pythonhosted.org/packages/43/8a/a8c584b82deb248930ce069e71576fc09bd7174bbd35183b7943fb1064fd/contourpy-1.3.3-cp312-cp312-manylinux_2_26_s390x.manylinux_2_28_s390x.whl", hash = "sha256:626d60935cf668e70a5ce6ff184fd713e9683fb458898e4249b63be9e28286ea", size = 384397, upload-time = "2025-07-26T12:01:27.152Z" }, + { url = "https://files.pythonhosted.org/packages/cc/8f/ec6289987824b29529d0dfda0d74a07cec60e54b9c92f3c9da4c0ac732de/contourpy-1.3.3-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:4d00e655fcef08aba35ec9610536bfe90267d7ab5ba944f7032549c55a146da1", size = 362601, upload-time = "2025-07-26T12:01:28.808Z" }, + { url = "https://files.pythonhosted.org/packages/05/0a/a3fe3be3ee2dceb3e615ebb4df97ae6f3828aa915d3e10549ce016302bd1/contourpy-1.3.3-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:451e71b5a7d597379ef572de31eeb909a87246974d960049a9848c3bc6c41bf7", size = 1331288, upload-time = "2025-07-26T12:01:31.198Z" }, + { url = "https://files.pythonhosted.org/packages/33/1d/acad9bd4e97f13f3e2b18a3977fe1b4a37ecf3d38d815333980c6c72e963/contourpy-1.3.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:459c1f020cd59fcfe6650180678a9993932d80d44ccde1fa1868977438f0b411", size = 1403386, upload-time = "2025-07-26T12:01:33.947Z" }, + { url = "https://files.pythonhosted.org/packages/cf/8f/5847f44a7fddf859704217a99a23a4f6417b10e5ab1256a179264561540e/contourpy-1.3.3-cp312-cp312-win32.whl", hash = "sha256:023b44101dfe49d7d53932be418477dba359649246075c996866106da069af69", size = 185018, upload-time = "2025-07-26T12:01:35.64Z" }, + { url = "https://files.pythonhosted.org/packages/19/e8/6026ed58a64563186a9ee3f29f41261fd1828f527dd93d33b60feca63352/contourpy-1.3.3-cp312-cp312-win_amd64.whl", hash = "sha256:8153b8bfc11e1e4d75bcb0bff1db232f9e10b274e0929de9d608027e0d34ff8b", size = 226567, upload-time = "2025-07-26T12:01:36.804Z" }, + { url = "https://files.pythonhosted.org/packages/d1/e2/f05240d2c39a1ed228d8328a78b6f44cd695f7ef47beb3e684cf93604f86/contourpy-1.3.3-cp312-cp312-win_arm64.whl", hash = "sha256:07ce5ed73ecdc4a03ffe3e1b3e3c1166db35ae7584be76f65dbbe28a7791b0cc", size = 193655, upload-time = "2025-07-26T12:01:37.999Z" }, + { url = "https://files.pythonhosted.org/packages/68/35/0167aad910bbdb9599272bd96d01a9ec6852f36b9455cf2ca67bd4cc2d23/contourpy-1.3.3-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:177fb367556747a686509d6fef71d221a4b198a3905fe824430e5ea0fda54eb5", size = 293257, upload-time = "2025-07-26T12:01:39.367Z" }, + { url = "https://files.pythonhosted.org/packages/96/e4/7adcd9c8362745b2210728f209bfbcf7d91ba868a2c5f40d8b58f54c509b/contourpy-1.3.3-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:d002b6f00d73d69333dac9d0b8d5e84d9724ff9ef044fd63c5986e62b7c9e1b1", size = 274034, upload-time = "2025-07-26T12:01:40.645Z" }, + { url = "https://files.pythonhosted.org/packages/73/23/90e31ceeed1de63058a02cb04b12f2de4b40e3bef5e082a7c18d9c8ae281/contourpy-1.3.3-cp313-cp313-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:348ac1f5d4f1d66d3322420f01d42e43122f43616e0f194fc1c9f5d830c5b286", size = 334672, upload-time = "2025-07-26T12:01:41.942Z" }, + { url = "https://files.pythonhosted.org/packages/ed/93/b43d8acbe67392e659e1d984700e79eb67e2acb2bd7f62012b583a7f1b55/contourpy-1.3.3-cp313-cp313-manylinux_2_26_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:655456777ff65c2c548b7c454af9c6f33f16c8884f11083244b5819cc214f1b5", size = 381234, upload-time = "2025-07-26T12:01:43.499Z" }, + { url = "https://files.pythonhosted.org/packages/46/3b/bec82a3ea06f66711520f75a40c8fc0b113b2a75edb36aa633eb11c4f50f/contourpy-1.3.3-cp313-cp313-manylinux_2_26_s390x.manylinux_2_28_s390x.whl", hash = "sha256:644a6853d15b2512d67881586bd03f462c7ab755db95f16f14d7e238f2852c67", size = 385169, upload-time = "2025-07-26T12:01:45.219Z" }, + { url = "https://files.pythonhosted.org/packages/4b/32/e0f13a1c5b0f8572d0ec6ae2f6c677b7991fafd95da523159c19eff0696a/contourpy-1.3.3-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:4debd64f124ca62069f313a9cb86656ff087786016d76927ae2cf37846b006c9", size = 362859, upload-time = "2025-07-26T12:01:46.519Z" }, + { url = "https://files.pythonhosted.org/packages/33/71/e2a7945b7de4e58af42d708a219f3b2f4cff7386e6b6ab0a0fa0033c49a9/contourpy-1.3.3-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:a15459b0f4615b00bbd1e91f1b9e19b7e63aea7483d03d804186f278c0af2659", size = 1332062, upload-time = "2025-07-26T12:01:48.964Z" }, + { url = "https://files.pythonhosted.org/packages/12/fc/4e87ac754220ccc0e807284f88e943d6d43b43843614f0a8afa469801db0/contourpy-1.3.3-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:ca0fdcd73925568ca027e0b17ab07aad764be4706d0a925b89227e447d9737b7", size = 1403932, upload-time = "2025-07-26T12:01:51.979Z" }, + { url = "https://files.pythonhosted.org/packages/a6/2e/adc197a37443f934594112222ac1aa7dc9a98faf9c3842884df9a9d8751d/contourpy-1.3.3-cp313-cp313-win32.whl", hash = "sha256:b20c7c9a3bf701366556e1b1984ed2d0cedf999903c51311417cf5f591d8c78d", size = 185024, upload-time = "2025-07-26T12:01:53.245Z" }, + { url = "https://files.pythonhosted.org/packages/18/0b/0098c214843213759692cc638fce7de5c289200a830e5035d1791d7a2338/contourpy-1.3.3-cp313-cp313-win_amd64.whl", hash = "sha256:1cadd8b8969f060ba45ed7c1b714fe69185812ab43bd6b86a9123fe8f99c3263", size = 226578, upload-time = "2025-07-26T12:01:54.422Z" }, + { url = "https://files.pythonhosted.org/packages/8a/9a/2f6024a0c5995243cd63afdeb3651c984f0d2bc727fd98066d40e141ad73/contourpy-1.3.3-cp313-cp313-win_arm64.whl", hash = "sha256:fd914713266421b7536de2bfa8181aa8c699432b6763a0ea64195ebe28bff6a9", size = 193524, upload-time = "2025-07-26T12:01:55.73Z" }, + { url = "https://files.pythonhosted.org/packages/c0/b3/f8a1a86bd3298513f500e5b1f5fd92b69896449f6cab6a146a5d52715479/contourpy-1.3.3-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:88df9880d507169449d434c293467418b9f6cbe82edd19284aa0409e7fdb933d", size = 306730, upload-time = "2025-07-26T12:01:57.051Z" }, + { url = "https://files.pythonhosted.org/packages/3f/11/4780db94ae62fc0c2053909b65dc3246bd7cecfc4f8a20d957ad43aa4ad8/contourpy-1.3.3-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:d06bb1f751ba5d417047db62bca3c8fde202b8c11fb50742ab3ab962c81e8216", size = 287897, upload-time = "2025-07-26T12:01:58.663Z" }, + { url = "https://files.pythonhosted.org/packages/ae/15/e59f5f3ffdd6f3d4daa3e47114c53daabcb18574a26c21f03dc9e4e42ff0/contourpy-1.3.3-cp313-cp313t-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:e4e6b05a45525357e382909a4c1600444e2a45b4795163d3b22669285591c1ae", size = 326751, upload-time = "2025-07-26T12:02:00.343Z" }, + { url = "https://files.pythonhosted.org/packages/0f/81/03b45cfad088e4770b1dcf72ea78d3802d04200009fb364d18a493857210/contourpy-1.3.3-cp313-cp313t-manylinux_2_26_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:ab3074b48c4e2cf1a960e6bbeb7f04566bf36b1861d5c9d4d8ac04b82e38ba20", size = 375486, upload-time = "2025-07-26T12:02:02.128Z" }, + { url = "https://files.pythonhosted.org/packages/0c/ba/49923366492ffbdd4486e970d421b289a670ae8cf539c1ea9a09822b371a/contourpy-1.3.3-cp313-cp313t-manylinux_2_26_s390x.manylinux_2_28_s390x.whl", hash = "sha256:6c3d53c796f8647d6deb1abe867daeb66dcc8a97e8455efa729516b997b8ed99", size = 388106, upload-time = "2025-07-26T12:02:03.615Z" }, + { url = "https://files.pythonhosted.org/packages/9f/52/5b00ea89525f8f143651f9f03a0df371d3cbd2fccd21ca9b768c7a6500c2/contourpy-1.3.3-cp313-cp313t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:50ed930df7289ff2a8d7afeb9603f8289e5704755c7e5c3bbd929c90c817164b", size = 352548, upload-time = "2025-07-26T12:02:05.165Z" }, + { url = "https://files.pythonhosted.org/packages/32/1d/a209ec1a3a3452d490f6b14dd92e72280c99ae3d1e73da74f8277d4ee08f/contourpy-1.3.3-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:4feffb6537d64b84877da813a5c30f1422ea5739566abf0bd18065ac040e120a", size = 1322297, upload-time = "2025-07-26T12:02:07.379Z" }, + { url = "https://files.pythonhosted.org/packages/bc/9e/46f0e8ebdd884ca0e8877e46a3f4e633f6c9c8c4f3f6e72be3fe075994aa/contourpy-1.3.3-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:2b7e9480ffe2b0cd2e787e4df64270e3a0440d9db8dc823312e2c940c167df7e", size = 1391023, upload-time = "2025-07-26T12:02:10.171Z" }, + { url = "https://files.pythonhosted.org/packages/b9/70/f308384a3ae9cd2209e0849f33c913f658d3326900d0ff5d378d6a1422d2/contourpy-1.3.3-cp313-cp313t-win32.whl", hash = "sha256:283edd842a01e3dcd435b1c5116798d661378d83d36d337b8dde1d16a5fc9ba3", size = 196157, upload-time = "2025-07-26T12:02:11.488Z" }, + { url = "https://files.pythonhosted.org/packages/b2/dd/880f890a6663b84d9e34a6f88cded89d78f0091e0045a284427cb6b18521/contourpy-1.3.3-cp313-cp313t-win_amd64.whl", hash = "sha256:87acf5963fc2b34825e5b6b048f40e3635dd547f590b04d2ab317c2619ef7ae8", size = 240570, upload-time = "2025-07-26T12:02:12.754Z" }, + { url = "https://files.pythonhosted.org/packages/80/99/2adc7d8ffead633234817ef8e9a87115c8a11927a94478f6bb3d3f4d4f7d/contourpy-1.3.3-cp313-cp313t-win_arm64.whl", hash = "sha256:3c30273eb2a55024ff31ba7d052dde990d7d8e5450f4bbb6e913558b3d6c2301", size = 199713, upload-time = "2025-07-26T12:02:14.4Z" }, + { url = "https://files.pythonhosted.org/packages/72/8b/4546f3ab60f78c514ffb7d01a0bd743f90de36f0019d1be84d0a708a580a/contourpy-1.3.3-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:fde6c716d51c04b1c25d0b90364d0be954624a0ee9d60e23e850e8d48353d07a", size = 292189, upload-time = "2025-07-26T12:02:16.095Z" }, + { url = "https://files.pythonhosted.org/packages/fd/e1/3542a9cb596cadd76fcef413f19c79216e002623158befe6daa03dbfa88c/contourpy-1.3.3-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:cbedb772ed74ff5be440fa8eee9bd49f64f6e3fc09436d9c7d8f1c287b121d77", size = 273251, upload-time = "2025-07-26T12:02:17.524Z" }, + { url = "https://files.pythonhosted.org/packages/b1/71/f93e1e9471d189f79d0ce2497007731c1e6bf9ef6d1d61b911430c3db4e5/contourpy-1.3.3-cp314-cp314-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:22e9b1bd7a9b1d652cd77388465dc358dafcd2e217d35552424aa4f996f524f5", size = 335810, upload-time = "2025-07-26T12:02:18.9Z" }, + { url = "https://files.pythonhosted.org/packages/91/f9/e35f4c1c93f9275d4e38681a80506b5510e9327350c51f8d4a5a724d178c/contourpy-1.3.3-cp314-cp314-manylinux_2_26_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:a22738912262aa3e254e4f3cb079a95a67132fc5a063890e224393596902f5a4", size = 382871, upload-time = "2025-07-26T12:02:20.418Z" }, + { url = "https://files.pythonhosted.org/packages/b5/71/47b512f936f66a0a900d81c396a7e60d73419868fba959c61efed7a8ab46/contourpy-1.3.3-cp314-cp314-manylinux_2_26_s390x.manylinux_2_28_s390x.whl", hash = "sha256:afe5a512f31ee6bd7d0dda52ec9864c984ca3d66664444f2d72e0dc4eb832e36", size = 386264, upload-time = "2025-07-26T12:02:21.916Z" }, + { url = "https://files.pythonhosted.org/packages/04/5f/9ff93450ba96b09c7c2b3f81c94de31c89f92292f1380261bd7195bea4ea/contourpy-1.3.3-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:f64836de09927cba6f79dcd00fdd7d5329f3fccc633468507079c829ca4db4e3", size = 363819, upload-time = "2025-07-26T12:02:23.759Z" }, + { url = "https://files.pythonhosted.org/packages/3e/a6/0b185d4cc480ee494945cde102cb0149ae830b5fa17bf855b95f2e70ad13/contourpy-1.3.3-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:1fd43c3be4c8e5fd6e4f2baeae35ae18176cf2e5cced681cca908addf1cdd53b", size = 1333650, upload-time = "2025-07-26T12:02:26.181Z" }, + { url = "https://files.pythonhosted.org/packages/43/d7/afdc95580ca56f30fbcd3060250f66cedbde69b4547028863abd8aa3b47e/contourpy-1.3.3-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:6afc576f7b33cf00996e5c1102dc2a8f7cc89e39c0b55df93a0b78c1bd992b36", size = 1404833, upload-time = "2025-07-26T12:02:28.782Z" }, + { url = "https://files.pythonhosted.org/packages/e2/e2/366af18a6d386f41132a48f033cbd2102e9b0cf6345d35ff0826cd984566/contourpy-1.3.3-cp314-cp314-win32.whl", hash = "sha256:66c8a43a4f7b8df8b71ee1840e4211a3c8d93b214b213f590e18a1beca458f7d", size = 189692, upload-time = "2025-07-26T12:02:30.128Z" }, + { url = "https://files.pythonhosted.org/packages/7d/c2/57f54b03d0f22d4044b8afb9ca0e184f8b1afd57b4f735c2fa70883dc601/contourpy-1.3.3-cp314-cp314-win_amd64.whl", hash = "sha256:cf9022ef053f2694e31d630feaacb21ea24224be1c3ad0520b13d844274614fd", size = 232424, upload-time = "2025-07-26T12:02:31.395Z" }, + { url = "https://files.pythonhosted.org/packages/18/79/a9416650df9b525737ab521aa181ccc42d56016d2123ddcb7b58e926a42c/contourpy-1.3.3-cp314-cp314-win_arm64.whl", hash = "sha256:95b181891b4c71de4bb404c6621e7e2390745f887f2a026b2d99e92c17892339", size = 198300, upload-time = "2025-07-26T12:02:32.956Z" }, + { url = "https://files.pythonhosted.org/packages/1f/42/38c159a7d0f2b7b9c04c64ab317042bb6952b713ba875c1681529a2932fe/contourpy-1.3.3-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:33c82d0138c0a062380332c861387650c82e4cf1747aaa6938b9b6516762e772", size = 306769, upload-time = "2025-07-26T12:02:34.2Z" }, + { url = "https://files.pythonhosted.org/packages/c3/6c/26a8205f24bca10974e77460de68d3d7c63e282e23782f1239f226fcae6f/contourpy-1.3.3-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:ea37e7b45949df430fe649e5de8351c423430046a2af20b1c1961cae3afcda77", size = 287892, upload-time = "2025-07-26T12:02:35.807Z" }, + { url = "https://files.pythonhosted.org/packages/66/06/8a475c8ab718ebfd7925661747dbb3c3ee9c82ac834ccb3570be49d129f4/contourpy-1.3.3-cp314-cp314t-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:d304906ecc71672e9c89e87c4675dc5c2645e1f4269a5063b99b0bb29f232d13", size = 326748, upload-time = "2025-07-26T12:02:37.193Z" }, + { url = "https://files.pythonhosted.org/packages/b4/a3/c5ca9f010a44c223f098fccd8b158bb1cb287378a31ac141f04730dc49be/contourpy-1.3.3-cp314-cp314t-manylinux_2_26_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:ca658cd1a680a5c9ea96dc61cdbae1e85c8f25849843aa799dfd3cb370ad4fbe", size = 375554, upload-time = "2025-07-26T12:02:38.894Z" }, + { url = "https://files.pythonhosted.org/packages/80/5b/68bd33ae63fac658a4145088c1e894405e07584a316738710b636c6d0333/contourpy-1.3.3-cp314-cp314t-manylinux_2_26_s390x.manylinux_2_28_s390x.whl", hash = "sha256:ab2fd90904c503739a75b7c8c5c01160130ba67944a7b77bbf36ef8054576e7f", size = 388118, upload-time = "2025-07-26T12:02:40.642Z" }, + { url = "https://files.pythonhosted.org/packages/40/52/4c285a6435940ae25d7410a6c36bda5145839bc3f0beb20c707cda18b9d2/contourpy-1.3.3-cp314-cp314t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:b7301b89040075c30e5768810bc96a8e8d78085b47d8be6e4c3f5a0b4ed478a0", size = 352555, upload-time = "2025-07-26T12:02:42.25Z" }, + { url = "https://files.pythonhosted.org/packages/24/ee/3e81e1dd174f5c7fefe50e85d0892de05ca4e26ef1c9a59c2a57e43b865a/contourpy-1.3.3-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:2a2a8b627d5cc6b7c41a4beff6c5ad5eb848c88255fda4a8745f7e901b32d8e4", size = 1322295, upload-time = "2025-07-26T12:02:44.668Z" }, + { url = "https://files.pythonhosted.org/packages/3c/b2/6d913d4d04e14379de429057cd169e5e00f6c2af3bb13e1710bcbdb5da12/contourpy-1.3.3-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:fd6ec6be509c787f1caf6b247f0b1ca598bef13f4ddeaa126b7658215529ba0f", size = 1391027, upload-time = "2025-07-26T12:02:47.09Z" }, + { url = "https://files.pythonhosted.org/packages/93/8a/68a4ec5c55a2971213d29a9374913f7e9f18581945a7a31d1a39b5d2dfe5/contourpy-1.3.3-cp314-cp314t-win32.whl", hash = "sha256:e74a9a0f5e3fff48fb5a7f2fd2b9b70a3fe014a67522f79b7cca4c0c7e43c9ae", size = 202428, upload-time = "2025-07-26T12:02:48.691Z" }, + { url = "https://files.pythonhosted.org/packages/fa/96/fd9f641ffedc4fa3ace923af73b9d07e869496c9cc7a459103e6e978992f/contourpy-1.3.3-cp314-cp314t-win_amd64.whl", hash = "sha256:13b68d6a62db8eafaebb8039218921399baf6e47bf85006fd8529f2a08ef33fc", size = 250331, upload-time = "2025-07-26T12:02:50.137Z" }, + { url = "https://files.pythonhosted.org/packages/ae/8c/469afb6465b853afff216f9528ffda78a915ff880ed58813ba4faf4ba0b6/contourpy-1.3.3-cp314-cp314t-win_arm64.whl", hash = "sha256:b7448cb5a725bb1e35ce88771b86fba35ef418952474492cf7c764059933ff8b", size = 203831, upload-time = "2025-07-26T12:02:51.449Z" }, + { url = "https://files.pythonhosted.org/packages/a5/29/8dcfe16f0107943fa92388c23f6e05cff0ba58058c4c95b00280d4c75a14/contourpy-1.3.3-pp311-pypy311_pp73-macosx_10_15_x86_64.whl", hash = "sha256:cd5dfcaeb10f7b7f9dc8941717c6c2ade08f587be2226222c12b25f0483ed497", size = 278809, upload-time = "2025-07-26T12:02:52.74Z" }, + { url = "https://files.pythonhosted.org/packages/85/a9/8b37ef4f7dafeb335daee3c8254645ef5725be4d9c6aa70b50ec46ef2f7e/contourpy-1.3.3-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:0c1fc238306b35f246d61a1d416a627348b5cf0648648a031e14bb8705fcdfe8", size = 261593, upload-time = "2025-07-26T12:02:54.037Z" }, + { url = "https://files.pythonhosted.org/packages/0a/59/ebfb8c677c75605cc27f7122c90313fd2f375ff3c8d19a1694bda74aaa63/contourpy-1.3.3-pp311-pypy311_pp73-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:70f9aad7de812d6541d29d2bbf8feb22ff7e1c299523db288004e3157ff4674e", size = 302202, upload-time = "2025-07-26T12:02:55.947Z" }, + { url = "https://files.pythonhosted.org/packages/3c/37/21972a15834d90bfbfb009b9d004779bd5a07a0ec0234e5ba8f64d5736f4/contourpy-1.3.3-pp311-pypy311_pp73-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:5ed3657edf08512fc3fe81b510e35c2012fbd3081d2e26160f27ca28affec989", size = 329207, upload-time = "2025-07-26T12:02:57.468Z" }, + { url = "https://files.pythonhosted.org/packages/0c/58/bd257695f39d05594ca4ad60df5bcb7e32247f9951fd09a9b8edb82d1daa/contourpy-1.3.3-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:3d1a3799d62d45c18bafd41c5fa05120b96a28079f2393af559b843d1a966a77", size = 225315, upload-time = "2025-07-26T12:02:58.801Z" }, +] + +[[package]] +name = "coverage" +version = "7.13.4" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/24/56/95b7e30fa389756cb56630faa728da46a27b8c6eb46f9d557c68fff12b65/coverage-7.13.4.tar.gz", hash = "sha256:e5c8f6ed1e61a8b2dcdf31eb0b9bbf0130750ca79c1c49eb898e2ad86f5ccc91", size = 827239, upload-time = "2026-02-09T12:59:03.86Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/44/d4/7827d9ffa34d5d4d752eec907022aa417120936282fc488306f5da08c292/coverage-7.13.4-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:0fc31c787a84f8cd6027eba44010517020e0d18487064cd3d8968941856d1415", size = 219152, upload-time = "2026-02-09T12:56:11.974Z" }, + { url = "https://files.pythonhosted.org/packages/35/b0/d69df26607c64043292644dbb9dc54b0856fabaa2cbb1eeee3331cc9e280/coverage-7.13.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:a32ebc02a1805adf637fc8dec324b5cdacd2e493515424f70ee33799573d661b", size = 219667, upload-time = "2026-02-09T12:56:13.33Z" }, + { url = "https://files.pythonhosted.org/packages/82/a4/c1523f7c9e47b2271dbf8c2a097e7a1f89ef0d66f5840bb59b7e8814157b/coverage-7.13.4-cp310-cp310-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:e24f9156097ff9dc286f2f913df3a7f63c0e333dcafa3c196f2c18b4175ca09a", size = 246425, upload-time = "2026-02-09T12:56:14.552Z" }, + { url = "https://files.pythonhosted.org/packages/f8/02/aa7ec01d1a5023c4b680ab7257f9bfde9defe8fdddfe40be096ac19e8177/coverage-7.13.4-cp310-cp310-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:8041b6c5bfdc03257666e9881d33b1abc88daccaf73f7b6340fb7946655cd10f", size = 248229, upload-time = "2026-02-09T12:56:16.31Z" }, + { url = "https://files.pythonhosted.org/packages/35/98/85aba0aed5126d896162087ef3f0e789a225697245256fc6181b95f47207/coverage-7.13.4-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:2a09cfa6a5862bc2fc6ca7c3def5b2926194a56b8ab78ffcf617d28911123012", size = 250106, upload-time = "2026-02-09T12:56:18.024Z" }, + { url = "https://files.pythonhosted.org/packages/96/72/1db59bd67494bc162e3e4cd5fbc7edba2c7026b22f7c8ef1496d58c2b94c/coverage-7.13.4-cp310-cp310-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:296f8b0af861d3970c2a4d8c91d48eb4dd4771bcef9baedec6a9b515d7de3def", size = 252021, upload-time = "2026-02-09T12:56:19.272Z" }, + { url = "https://files.pythonhosted.org/packages/9d/97/72899c59c7066961de6e3daa142d459d47d104956db43e057e034f015c8a/coverage-7.13.4-cp310-cp310-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:e101609bcbbfb04605ea1027b10dc3735c094d12d40826a60f897b98b1c30256", size = 247114, upload-time = "2026-02-09T12:56:21.051Z" }, + { url = "https://files.pythonhosted.org/packages/39/1f/f1885573b5970235e908da4389176936c8933e86cb316b9620aab1585fa2/coverage-7.13.4-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:aa3feb8db2e87ff5e6d00d7e1480ae241876286691265657b500886c98f38bda", size = 248143, upload-time = "2026-02-09T12:56:22.585Z" }, + { url = "https://files.pythonhosted.org/packages/a8/cf/e80390c5b7480b722fa3e994f8202807799b85bc562aa4f1dde209fbb7be/coverage-7.13.4-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:4fc7fa81bbaf5a02801b65346c8b3e657f1d93763e58c0abdf7c992addd81a92", size = 246152, upload-time = "2026-02-09T12:56:23.748Z" }, + { url = "https://files.pythonhosted.org/packages/44/bf/f89a8350d85572f95412debb0fb9bb4795b1d5b5232bd652923c759e787b/coverage-7.13.4-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:33901f604424145c6e9c2398684b92e176c0b12df77d52db81c20abd48c3794c", size = 249959, upload-time = "2026-02-09T12:56:25.209Z" }, + { url = "https://files.pythonhosted.org/packages/f7/6e/612a02aece8178c818df273e8d1642190c4875402ca2ba74514394b27aba/coverage-7.13.4-cp310-cp310-musllinux_1_2_riscv64.whl", hash = "sha256:bb28c0f2cf2782508a40cec377935829d5fcc3ad9a3681375af4e84eb34b6b58", size = 246416, upload-time = "2026-02-09T12:56:26.475Z" }, + { url = "https://files.pythonhosted.org/packages/cb/98/b5afc39af67c2fa6786b03c3a7091fc300947387ce8914b096db8a73d67a/coverage-7.13.4-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:9d107aff57a83222ddbd8d9ee705ede2af2cc926608b57abed8ef96b50b7e8f9", size = 247025, upload-time = "2026-02-09T12:56:27.727Z" }, + { url = "https://files.pythonhosted.org/packages/51/30/2bba8ef0682d5bd210c38fe497e12a06c9f8d663f7025e9f5c2c31ce847d/coverage-7.13.4-cp310-cp310-win32.whl", hash = "sha256:a6f94a7d00eb18f1b6d403c91a88fd58cfc92d4b16080dfdb774afc8294469bf", size = 221758, upload-time = "2026-02-09T12:56:29.051Z" }, + { url = "https://files.pythonhosted.org/packages/78/13/331f94934cf6c092b8ea59ff868eb587bc8fe0893f02c55bc6c0183a192e/coverage-7.13.4-cp310-cp310-win_amd64.whl", hash = "sha256:2cb0f1e000ebc419632bbe04366a8990b6e32c4e0b51543a6484ffe15eaeda95", size = 222693, upload-time = "2026-02-09T12:56:30.366Z" }, + { url = "https://files.pythonhosted.org/packages/b4/ad/b59e5b451cf7172b8d1043dc0fa718f23aab379bc1521ee13d4bd9bfa960/coverage-7.13.4-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:d490ba50c3f35dd7c17953c68f3270e7ccd1c6642e2d2afe2d8e720b98f5a053", size = 219278, upload-time = "2026-02-09T12:56:31.673Z" }, + { url = "https://files.pythonhosted.org/packages/f1/17/0cb7ca3de72e5f4ef2ec2fa0089beafbcaaaead1844e8b8a63d35173d77d/coverage-7.13.4-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:19bc3c88078789f8ef36acb014d7241961dbf883fd2533d18cb1e7a5b4e28b11", size = 219783, upload-time = "2026-02-09T12:56:33.104Z" }, + { url = "https://files.pythonhosted.org/packages/ab/63/325d8e5b11e0eaf6d0f6a44fad444ae58820929a9b0de943fa377fe73e85/coverage-7.13.4-cp311-cp311-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:3998e5a32e62fdf410c0dbd3115df86297995d6e3429af80b8798aad894ca7aa", size = 250200, upload-time = "2026-02-09T12:56:34.474Z" }, + { url = "https://files.pythonhosted.org/packages/76/53/c16972708cbb79f2942922571a687c52bd109a7bd51175aeb7558dff2236/coverage-7.13.4-cp311-cp311-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:8e264226ec98e01a8e1054314af91ee6cde0eacac4f465cc93b03dbe0bce2fd7", size = 252114, upload-time = "2026-02-09T12:56:35.749Z" }, + { url = "https://files.pythonhosted.org/packages/eb/c2/7ab36d8b8cc412bec9ea2d07c83c48930eb4ba649634ba00cb7e4e0f9017/coverage-7.13.4-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:a3aa4e7b9e416774b21797365b358a6e827ffadaaca81b69ee02946852449f00", size = 254220, upload-time = "2026-02-09T12:56:37.796Z" }, + { url = "https://files.pythonhosted.org/packages/d6/4d/cf52c9a3322c89a0e6febdfbc83bb45c0ed3c64ad14081b9503adee702e7/coverage-7.13.4-cp311-cp311-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:71ca20079dd8f27fcf808817e281e90220475cd75115162218d0e27549f95fef", size = 256164, upload-time = "2026-02-09T12:56:39.016Z" }, + { url = "https://files.pythonhosted.org/packages/78/e9/eb1dd17bd6de8289df3580e967e78294f352a5df8a57ff4671ee5fc3dcd0/coverage-7.13.4-cp311-cp311-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:e2f25215f1a359ab17320b47bcdaca3e6e6356652e8256f2441e4ef972052903", size = 250325, upload-time = "2026-02-09T12:56:40.668Z" }, + { url = "https://files.pythonhosted.org/packages/71/07/8c1542aa873728f72267c07278c5cc0ec91356daf974df21335ccdb46368/coverage-7.13.4-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:d65b2d373032411e86960604dc4edac91fdfb5dca539461cf2cbe78327d1e64f", size = 251913, upload-time = "2026-02-09T12:56:41.97Z" }, + { url = "https://files.pythonhosted.org/packages/74/d7/c62e2c5e4483a748e27868e4c32ad3daa9bdddbba58e1bc7a15e252baa74/coverage-7.13.4-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:94eb63f9b363180aff17de3e7c8760c3ba94664ea2695c52f10111244d16a299", size = 249974, upload-time = "2026-02-09T12:56:43.323Z" }, + { url = "https://files.pythonhosted.org/packages/98/9f/4c5c015a6e98ced54efd0f5cf8d31b88e5504ecb6857585fc0161bb1e600/coverage-7.13.4-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:e856bf6616714c3a9fbc270ab54103f4e685ba236fa98c054e8f87f266c93505", size = 253741, upload-time = "2026-02-09T12:56:45.155Z" }, + { url = "https://files.pythonhosted.org/packages/bd/59/0f4eef89b9f0fcd9633b5d350016f54126ab49426a70ff4c4e87446cabdc/coverage-7.13.4-cp311-cp311-musllinux_1_2_riscv64.whl", hash = "sha256:65dfcbe305c3dfe658492df2d85259e0d79ead4177f9ae724b6fb245198f55d6", size = 249695, upload-time = "2026-02-09T12:56:46.636Z" }, + { url = "https://files.pythonhosted.org/packages/b5/2c/b7476f938deb07166f3eb281a385c262675d688ff4659ad56c6c6b8e2e70/coverage-7.13.4-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:b507778ae8a4c915436ed5c2e05b4a6cecfa70f734e19c22a005152a11c7b6a9", size = 250599, upload-time = "2026-02-09T12:56:48.13Z" }, + { url = "https://files.pythonhosted.org/packages/b8/34/c3420709d9846ee3785b9f2831b4d94f276f38884032dca1457fa83f7476/coverage-7.13.4-cp311-cp311-win32.whl", hash = "sha256:784fc3cf8be001197b652d51d3fd259b1e2262888693a4636e18879f613a62a9", size = 221780, upload-time = "2026-02-09T12:56:50.479Z" }, + { url = "https://files.pythonhosted.org/packages/61/08/3d9c8613079d2b11c185b865de9a4c1a68850cfda2b357fae365cf609f29/coverage-7.13.4-cp311-cp311-win_amd64.whl", hash = "sha256:2421d591f8ca05b308cf0092807308b2facbefe54af7c02ac22548b88b95c98f", size = 222715, upload-time = "2026-02-09T12:56:51.815Z" }, + { url = "https://files.pythonhosted.org/packages/18/1a/54c3c80b2f056164cc0a6cdcb040733760c7c4be9d780fe655f356f433e4/coverage-7.13.4-cp311-cp311-win_arm64.whl", hash = "sha256:79e73a76b854d9c6088fe5d8b2ebe745f8681c55f7397c3c0a016192d681045f", size = 221385, upload-time = "2026-02-09T12:56:53.194Z" }, + { url = "https://files.pythonhosted.org/packages/d1/81/4ce2fdd909c5a0ed1f6dedb88aa57ab79b6d1fbd9b588c1ac7ef45659566/coverage-7.13.4-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:02231499b08dabbe2b96612993e5fc34217cdae907a51b906ac7fca8027a4459", size = 219449, upload-time = "2026-02-09T12:56:54.889Z" }, + { url = "https://files.pythonhosted.org/packages/5d/96/5238b1efc5922ddbdc9b0db9243152c09777804fb7c02ad1741eb18a11c0/coverage-7.13.4-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:40aa8808140e55dc022b15d8aa7f651b6b3d68b365ea0398f1441e0b04d859c3", size = 219810, upload-time = "2026-02-09T12:56:56.33Z" }, + { url = "https://files.pythonhosted.org/packages/78/72/2f372b726d433c9c35e56377cf1d513b4c16fe51841060d826b95caacec1/coverage-7.13.4-cp312-cp312-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:5b856a8ccf749480024ff3bd7310adaef57bf31fd17e1bfc404b7940b6986634", size = 251308, upload-time = "2026-02-09T12:56:57.858Z" }, + { url = "https://files.pythonhosted.org/packages/5d/a0/2ea570925524ef4e00bb6c82649f5682a77fac5ab910a65c9284de422600/coverage-7.13.4-cp312-cp312-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:2c048ea43875fbf8b45d476ad79f179809c590ec7b79e2035c662e7afa3192e3", size = 254052, upload-time = "2026-02-09T12:56:59.754Z" }, + { url = "https://files.pythonhosted.org/packages/e8/ac/45dc2e19a1939098d783c846e130b8f862fbb50d09e0af663988f2f21973/coverage-7.13.4-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b7b38448866e83176e28086674fe7368ab8590e4610fb662b44e345b86d63ffa", size = 255165, upload-time = "2026-02-09T12:57:01.287Z" }, + { url = "https://files.pythonhosted.org/packages/2d/4d/26d236ff35abc3b5e63540d3386e4c3b192168c1d96da5cb2f43c640970f/coverage-7.13.4-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:de6defc1c9badbf8b9e67ae90fd00519186d6ab64e5cc5f3d21359c2a9b2c1d3", size = 257432, upload-time = "2026-02-09T12:57:02.637Z" }, + { url = "https://files.pythonhosted.org/packages/ec/55/14a966c757d1348b2e19caf699415a2a4c4f7feaa4bbc6326a51f5c7dd1b/coverage-7.13.4-cp312-cp312-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:7eda778067ad7ffccd23ecffce537dface96212576a07924cbf0d8799d2ded5a", size = 251716, upload-time = "2026-02-09T12:57:04.056Z" }, + { url = "https://files.pythonhosted.org/packages/77/33/50116647905837c66d28b2af1321b845d5f5d19be9655cb84d4a0ea806b4/coverage-7.13.4-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:e87f6c587c3f34356c3759f0420693e35e7eb0e2e41e4c011cb6ec6ecbbf1db7", size = 253089, upload-time = "2026-02-09T12:57:05.503Z" }, + { url = "https://files.pythonhosted.org/packages/c2/b4/8efb11a46e3665d92635a56e4f2d4529de6d33f2cb38afd47d779d15fc99/coverage-7.13.4-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:8248977c2e33aecb2ced42fef99f2d319e9904a36e55a8a68b69207fb7e43edc", size = 251232, upload-time = "2026-02-09T12:57:06.879Z" }, + { url = "https://files.pythonhosted.org/packages/51/24/8cd73dd399b812cc76bb0ac260e671c4163093441847ffe058ac9fda1e32/coverage-7.13.4-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:25381386e80ae727608e662474db537d4df1ecd42379b5ba33c84633a2b36d47", size = 255299, upload-time = "2026-02-09T12:57:08.245Z" }, + { url = "https://files.pythonhosted.org/packages/03/94/0a4b12f1d0e029ce1ccc1c800944a9984cbe7d678e470bb6d3c6bc38a0da/coverage-7.13.4-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:ee756f00726693e5ba94d6df2bdfd64d4852d23b09bb0bc700e3b30e6f333985", size = 250796, upload-time = "2026-02-09T12:57:10.142Z" }, + { url = "https://files.pythonhosted.org/packages/73/44/6002fbf88f6698ca034360ce474c406be6d5a985b3fdb3401128031eef6b/coverage-7.13.4-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:fdfc1e28e7c7cdce44985b3043bc13bbd9c747520f94a4d7164af8260b3d91f0", size = 252673, upload-time = "2026-02-09T12:57:12.197Z" }, + { url = "https://files.pythonhosted.org/packages/de/c6/a0279f7c00e786be75a749a5674e6fa267bcbd8209cd10c9a450c655dfa7/coverage-7.13.4-cp312-cp312-win32.whl", hash = "sha256:01d4cbc3c283a17fc1e42d614a119f7f438eabb593391283adca8dc86eff1246", size = 221990, upload-time = "2026-02-09T12:57:14.085Z" }, + { url = "https://files.pythonhosted.org/packages/77/4e/c0a25a425fcf5557d9abd18419c95b63922e897bc86c1f327f155ef234a9/coverage-7.13.4-cp312-cp312-win_amd64.whl", hash = "sha256:9401ebc7ef522f01d01d45532c68c5ac40fb27113019b6b7d8b208f6e9baa126", size = 222800, upload-time = "2026-02-09T12:57:15.944Z" }, + { url = "https://files.pythonhosted.org/packages/47/ac/92da44ad9a6f4e3a7debd178949d6f3769bedca33830ce9b1dcdab589a37/coverage-7.13.4-cp312-cp312-win_arm64.whl", hash = "sha256:b1ec7b6b6e93255f952e27ab58fbc68dcc468844b16ecbee881aeb29b6ab4d8d", size = 221415, upload-time = "2026-02-09T12:57:17.497Z" }, + { url = "https://files.pythonhosted.org/packages/db/23/aad45061a31677d68e47499197a131eea55da4875d16c1f42021ab963503/coverage-7.13.4-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:b66a2da594b6068b48b2692f043f35d4d3693fb639d5ea8b39533c2ad9ac3ab9", size = 219474, upload-time = "2026-02-09T12:57:19.332Z" }, + { url = "https://files.pythonhosted.org/packages/a5/70/9b8b67a0945f3dfec1fd896c5cefb7c19d5a3a6d74630b99a895170999ae/coverage-7.13.4-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:3599eb3992d814d23b35c536c28df1a882caa950f8f507cef23d1cbf334995ac", size = 219844, upload-time = "2026-02-09T12:57:20.66Z" }, + { url = "https://files.pythonhosted.org/packages/97/fd/7e859f8fab324cef6c4ad7cff156ca7c489fef9179d5749b0c8d321281c2/coverage-7.13.4-cp313-cp313-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:93550784d9281e374fb5a12bf1324cc8a963fd63b2d2f223503ef0fd4aa339ea", size = 250832, upload-time = "2026-02-09T12:57:22.007Z" }, + { url = "https://files.pythonhosted.org/packages/e4/dc/b2442d10020c2f52617828862d8b6ee337859cd8f3a1f13d607dddda9cf7/coverage-7.13.4-cp313-cp313-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:b720ce6a88a2755f7c697c23268ddc47a571b88052e6b155224347389fdf6a3b", size = 253434, upload-time = "2026-02-09T12:57:23.339Z" }, + { url = "https://files.pythonhosted.org/packages/5a/88/6728a7ad17428b18d836540630487231f5470fb82454871149502f5e5aa2/coverage-7.13.4-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:7b322db1284a2ed3aa28ffd8ebe3db91c929b7a333c0820abec3d838ef5b3525", size = 254676, upload-time = "2026-02-09T12:57:24.774Z" }, + { url = "https://files.pythonhosted.org/packages/7c/bc/21244b1b8cedf0dff0a2b53b208015fe798d5f2a8d5348dbfece04224fff/coverage-7.13.4-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:f4594c67d8a7c89cf922d9df0438c7c7bb022ad506eddb0fdb2863359ff78242", size = 256807, upload-time = "2026-02-09T12:57:26.125Z" }, + { url = "https://files.pythonhosted.org/packages/97/a0/ddba7ed3251cff51006737a727d84e05b61517d1784a9988a846ba508877/coverage-7.13.4-cp313-cp313-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:53d133df809c743eb8bce33b24bcababb371f4441340578cd406e084d94a6148", size = 251058, upload-time = "2026-02-09T12:57:27.614Z" }, + { url = "https://files.pythonhosted.org/packages/9b/55/e289addf7ff54d3a540526f33751951bf0878f3809b47f6dfb3def69c6f7/coverage-7.13.4-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:76451d1978b95ba6507a039090ba076105c87cc76fc3efd5d35d72093964d49a", size = 252805, upload-time = "2026-02-09T12:57:29.066Z" }, + { url = "https://files.pythonhosted.org/packages/13/4e/cc276b1fa4a59be56d96f1dabddbdc30f4ba22e3b1cd42504c37b3313255/coverage-7.13.4-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:7f57b33491e281e962021de110b451ab8a24182589be17e12a22c79047935e23", size = 250766, upload-time = "2026-02-09T12:57:30.522Z" }, + { url = "https://files.pythonhosted.org/packages/94/44/1093b8f93018f8b41a8cf29636c9292502f05e4a113d4d107d14a3acd044/coverage-7.13.4-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:1731dc33dc276dafc410a885cbf5992f1ff171393e48a21453b78727d090de80", size = 254923, upload-time = "2026-02-09T12:57:31.946Z" }, + { url = "https://files.pythonhosted.org/packages/8b/55/ea2796da2d42257f37dbea1aab239ba9263b31bd91d5527cdd6db5efe174/coverage-7.13.4-cp313-cp313-musllinux_1_2_riscv64.whl", hash = "sha256:bd60d4fe2f6fa7dff9223ca1bbc9f05d2b6697bc5961072e5d3b952d46e1b1ea", size = 250591, upload-time = "2026-02-09T12:57:33.842Z" }, + { url = "https://files.pythonhosted.org/packages/d4/fa/7c4bb72aacf8af5020675aa633e59c1fbe296d22aed191b6a5b711eb2bc7/coverage-7.13.4-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:9181a3ccead280b828fae232df12b16652702b49d41e99d657f46cc7b1f6ec7a", size = 252364, upload-time = "2026-02-09T12:57:35.743Z" }, + { url = "https://files.pythonhosted.org/packages/5c/38/a8d2ec0146479c20bbaa7181b5b455a0c41101eed57f10dd19a78ab44c80/coverage-7.13.4-cp313-cp313-win32.whl", hash = "sha256:f53d492307962561ac7de4cd1de3e363589b000ab69617c6156a16ba7237998d", size = 222010, upload-time = "2026-02-09T12:57:37.25Z" }, + { url = "https://files.pythonhosted.org/packages/e2/0c/dbfafbe90a185943dcfbc766fe0e1909f658811492d79b741523a414a6cc/coverage-7.13.4-cp313-cp313-win_amd64.whl", hash = "sha256:e6f70dec1cc557e52df5306d051ef56003f74d56e9c4dd7ddb07e07ef32a84dd", size = 222818, upload-time = "2026-02-09T12:57:38.734Z" }, + { url = "https://files.pythonhosted.org/packages/04/d1/934918a138c932c90d78301f45f677fb05c39a3112b96fd2c8e60503cdc7/coverage-7.13.4-cp313-cp313-win_arm64.whl", hash = "sha256:fb07dc5da7e849e2ad31a5d74e9bece81f30ecf5a42909d0a695f8bd1874d6af", size = 221438, upload-time = "2026-02-09T12:57:40.223Z" }, + { url = "https://files.pythonhosted.org/packages/52/57/ee93ced533bcb3e6df961c0c6e42da2fc6addae53fb95b94a89b1e33ebd7/coverage-7.13.4-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:40d74da8e6c4b9ac18b15331c4b5ebc35a17069410cad462ad4f40dcd2d50c0d", size = 220165, upload-time = "2026-02-09T12:57:41.639Z" }, + { url = "https://files.pythonhosted.org/packages/c5/e0/969fc285a6fbdda49d91af278488d904dcd7651b2693872f0ff94e40e84a/coverage-7.13.4-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:4223b4230a376138939a9173f1bdd6521994f2aff8047fae100d6d94d50c5a12", size = 220516, upload-time = "2026-02-09T12:57:44.215Z" }, + { url = "https://files.pythonhosted.org/packages/b1/b8/9531944e16267e2735a30a9641ff49671f07e8138ecf1ca13db9fd2560c7/coverage-7.13.4-cp313-cp313t-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:1d4be36a5114c499f9f1f9195e95ebf979460dbe2d88e6816ea202010ba1c34b", size = 261804, upload-time = "2026-02-09T12:57:45.989Z" }, + { url = "https://files.pythonhosted.org/packages/8a/f3/e63df6d500314a2a60390d1989240d5f27318a7a68fa30ad3806e2a9323e/coverage-7.13.4-cp313-cp313t-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:200dea7d1e8095cc6e98cdabe3fd1d21ab17d3cee6dab00cadbb2fe35d9c15b9", size = 263885, upload-time = "2026-02-09T12:57:47.42Z" }, + { url = "https://files.pythonhosted.org/packages/f3/67/7654810de580e14b37670b60a09c599fa348e48312db5b216d730857ffe6/coverage-7.13.4-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b8eb931ee8e6d8243e253e5ed7336deea6904369d2fd8ae6e43f68abbf167092", size = 266308, upload-time = "2026-02-09T12:57:49.345Z" }, + { url = "https://files.pythonhosted.org/packages/37/6f/39d41eca0eab3cc82115953ad41c4e77935286c930e8fad15eaed1389d83/coverage-7.13.4-cp313-cp313t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:75eab1ebe4f2f64d9509b984f9314d4aa788540368218b858dad56dc8f3e5eb9", size = 267452, upload-time = "2026-02-09T12:57:50.811Z" }, + { url = "https://files.pythonhosted.org/packages/50/6d/39c0fbb8fc5cd4d2090811e553c2108cf5112e882f82505ee7495349a6bf/coverage-7.13.4-cp313-cp313t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:c35eb28c1d085eb7d8c9b3296567a1bebe03ce72962e932431b9a61f28facf26", size = 261057, upload-time = "2026-02-09T12:57:52.447Z" }, + { url = "https://files.pythonhosted.org/packages/a4/a2/60010c669df5fa603bb5a97fb75407e191a846510da70ac657eb696b7fce/coverage-7.13.4-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:eb88b316ec33760714a4720feb2816a3a59180fd58c1985012054fa7aebee4c2", size = 263875, upload-time = "2026-02-09T12:57:53.938Z" }, + { url = "https://files.pythonhosted.org/packages/3e/d9/63b22a6bdbd17f1f96e9ed58604c2a6b0e72a9133e37d663bef185877cf6/coverage-7.13.4-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:7d41eead3cc673cbd38a4417deb7fd0b4ca26954ff7dc6078e33f6ff97bed940", size = 261500, upload-time = "2026-02-09T12:57:56.012Z" }, + { url = "https://files.pythonhosted.org/packages/70/bf/69f86ba1ad85bc3ad240e4c0e57a2e620fbc0e1645a47b5c62f0e941ad7f/coverage-7.13.4-cp313-cp313t-musllinux_1_2_ppc64le.whl", hash = "sha256:fb26a934946a6afe0e326aebe0730cdff393a8bc0bbb65a2f41e30feddca399c", size = 265212, upload-time = "2026-02-09T12:57:57.5Z" }, + { url = "https://files.pythonhosted.org/packages/ae/f2/5f65a278a8c2148731831574c73e42f57204243d33bedaaf18fa79c5958f/coverage-7.13.4-cp313-cp313t-musllinux_1_2_riscv64.whl", hash = "sha256:dae88bc0fc77edaa65c14be099bd57ee140cf507e6bfdeea7938457ab387efb0", size = 260398, upload-time = "2026-02-09T12:57:59.027Z" }, + { url = "https://files.pythonhosted.org/packages/ef/80/6e8280a350ee9fea92f14b8357448a242dcaa243cb2c72ab0ca591f66c8c/coverage-7.13.4-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:845f352911777a8e722bfce168958214951e07e47e5d5d9744109fa5fe77f79b", size = 262584, upload-time = "2026-02-09T12:58:01.129Z" }, + { url = "https://files.pythonhosted.org/packages/22/63/01ff182fc95f260b539590fb12c11ad3e21332c15f9799cb5e2386f71d9f/coverage-7.13.4-cp313-cp313t-win32.whl", hash = "sha256:2fa8d5f8de70688a28240de9e139fa16b153cc3cbb01c5f16d88d6505ebdadf9", size = 222688, upload-time = "2026-02-09T12:58:02.736Z" }, + { url = "https://files.pythonhosted.org/packages/a9/43/89de4ef5d3cd53b886afa114065f7e9d3707bdb3e5efae13535b46ae483d/coverage-7.13.4-cp313-cp313t-win_amd64.whl", hash = "sha256:9351229c8c8407645840edcc277f4a2d44814d1bc34a2128c11c2a031d45a5dd", size = 223746, upload-time = "2026-02-09T12:58:05.362Z" }, + { url = "https://files.pythonhosted.org/packages/35/39/7cf0aa9a10d470a5309b38b289b9bb07ddeac5d61af9b664fe9775a4cb3e/coverage-7.13.4-cp313-cp313t-win_arm64.whl", hash = "sha256:30b8d0512f2dc8c8747557e8fb459d6176a2c9e5731e2b74d311c03b78451997", size = 222003, upload-time = "2026-02-09T12:58:06.952Z" }, + { url = "https://files.pythonhosted.org/packages/92/11/a9cf762bb83386467737d32187756a42094927150c3e107df4cb078e8590/coverage-7.13.4-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:300deaee342f90696ed186e3a00c71b5b3d27bffe9e827677954f4ee56969601", size = 219522, upload-time = "2026-02-09T12:58:08.623Z" }, + { url = "https://files.pythonhosted.org/packages/d3/28/56e6d892b7b052236d67c95f1936b6a7cf7c3e2634bf27610b8cbd7f9c60/coverage-7.13.4-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:29e3220258d682b6226a9b0925bc563ed9a1ebcff3cad30f043eceea7eaf2689", size = 219855, upload-time = "2026-02-09T12:58:10.176Z" }, + { url = "https://files.pythonhosted.org/packages/e5/69/233459ee9eb0c0d10fcc2fe425a029b3fa5ce0f040c966ebce851d030c70/coverage-7.13.4-cp314-cp314-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:391ee8f19bef69210978363ca930f7328081c6a0152f1166c91f0b5fdd2a773c", size = 250887, upload-time = "2026-02-09T12:58:12.503Z" }, + { url = "https://files.pythonhosted.org/packages/06/90/2cdab0974b9b5bbc1623f7876b73603aecac11b8d95b85b5b86b32de5eab/coverage-7.13.4-cp314-cp314-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:0dd7ab8278f0d58a0128ba2fca25824321f05d059c1441800e934ff2efa52129", size = 253396, upload-time = "2026-02-09T12:58:14.615Z" }, + { url = "https://files.pythonhosted.org/packages/ac/15/ea4da0f85bf7d7b27635039e649e99deb8173fe551096ea15017f7053537/coverage-7.13.4-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:78cdf0d578b15148b009ccf18c686aa4f719d887e76e6b40c38ffb61d264a552", size = 254745, upload-time = "2026-02-09T12:58:16.162Z" }, + { url = "https://files.pythonhosted.org/packages/99/11/bb356e86920c655ca4d61daee4e2bbc7258f0a37de0be32d233b561134ff/coverage-7.13.4-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:48685fee12c2eb3b27c62f2658e7ea21e9c3239cba5a8a242801a0a3f6a8c62a", size = 257055, upload-time = "2026-02-09T12:58:17.892Z" }, + { url = "https://files.pythonhosted.org/packages/c9/0f/9ae1f8cb17029e09da06ca4e28c9e1d5c1c0a511c7074592e37e0836c915/coverage-7.13.4-cp314-cp314-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:4e83efc079eb39480e6346a15a1bcb3e9b04759c5202d157e1dd4303cd619356", size = 250911, upload-time = "2026-02-09T12:58:19.495Z" }, + { url = "https://files.pythonhosted.org/packages/89/3a/adfb68558fa815cbc29747b553bc833d2150228f251b127f1ce97e48547c/coverage-7.13.4-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:ecae9737b72408d6a950f7e525f30aca12d4bd8dd95e37342e5beb3a2a8c4f71", size = 252754, upload-time = "2026-02-09T12:58:21.064Z" }, + { url = "https://files.pythonhosted.org/packages/32/b1/540d0c27c4e748bd3cd0bd001076ee416eda993c2bae47a73b7cc9357931/coverage-7.13.4-cp314-cp314-musllinux_1_2_i686.whl", hash = "sha256:ae4578f8528569d3cf303fef2ea569c7f4c4059a38c8667ccef15c6e1f118aa5", size = 250720, upload-time = "2026-02-09T12:58:22.622Z" }, + { url = "https://files.pythonhosted.org/packages/c7/95/383609462b3ffb1fe133014a7c84fc0dd01ed55ac6140fa1093b5af7ebb1/coverage-7.13.4-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:6fdef321fdfbb30a197efa02d48fcd9981f0d8ad2ae8903ac318adc653f5df98", size = 254994, upload-time = "2026-02-09T12:58:24.548Z" }, + { url = "https://files.pythonhosted.org/packages/f7/ba/1761138e86c81680bfc3c49579d66312865457f9fe405b033184e5793cb3/coverage-7.13.4-cp314-cp314-musllinux_1_2_riscv64.whl", hash = "sha256:2b0f6ccf3dbe577170bebfce1318707d0e8c3650003cb4b3a9dd744575daa8b5", size = 250531, upload-time = "2026-02-09T12:58:26.271Z" }, + { url = "https://files.pythonhosted.org/packages/f8/8e/05900df797a9c11837ab59c4d6fe94094e029582aab75c3309a93e6fb4e3/coverage-7.13.4-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:75fcd519f2a5765db3f0e391eb3b7d150cce1a771bf4c9f861aeab86c767a3c0", size = 252189, upload-time = "2026-02-09T12:58:27.807Z" }, + { url = "https://files.pythonhosted.org/packages/00/bd/29c9f2db9ea4ed2738b8a9508c35626eb205d51af4ab7bf56a21a2e49926/coverage-7.13.4-cp314-cp314-win32.whl", hash = "sha256:8e798c266c378da2bd819b0677df41ab46d78065fb2a399558f3f6cae78b2fbb", size = 222258, upload-time = "2026-02-09T12:58:29.441Z" }, + { url = "https://files.pythonhosted.org/packages/a7/4d/1f8e723f6829977410efeb88f73673d794075091c8c7c18848d273dc9d73/coverage-7.13.4-cp314-cp314-win_amd64.whl", hash = "sha256:245e37f664d89861cf2329c9afa2c1fe9e6d4e1a09d872c947e70718aeeac505", size = 223073, upload-time = "2026-02-09T12:58:31.026Z" }, + { url = "https://files.pythonhosted.org/packages/51/5b/84100025be913b44e082ea32abcf1afbf4e872f5120b7a1cab1d331b1e13/coverage-7.13.4-cp314-cp314-win_arm64.whl", hash = "sha256:ad27098a189e5838900ce4c2a99f2fe42a0bf0c2093c17c69b45a71579e8d4a2", size = 221638, upload-time = "2026-02-09T12:58:32.599Z" }, + { url = "https://files.pythonhosted.org/packages/a7/e4/c884a405d6ead1370433dad1e3720216b4f9fd8ef5b64bfd984a2a60a11a/coverage-7.13.4-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:85480adfb35ffc32d40918aad81b89c69c9cc5661a9b8a81476d3e645321a056", size = 220246, upload-time = "2026-02-09T12:58:34.181Z" }, + { url = "https://files.pythonhosted.org/packages/81/5c/4d7ed8b23b233b0fffbc9dfec53c232be2e695468523242ea9fd30f97ad2/coverage-7.13.4-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:79be69cf7f3bf9b0deeeb062eab7ac7f36cd4cc4c4dd694bd28921ba4d8596cc", size = 220514, upload-time = "2026-02-09T12:58:35.704Z" }, + { url = "https://files.pythonhosted.org/packages/2f/6f/3284d4203fd2f28edd73034968398cd2d4cb04ab192abc8cff007ea35679/coverage-7.13.4-cp314-cp314t-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:caa421e2684e382c5d8973ac55e4f36bed6821a9bad5c953494de960c74595c9", size = 261877, upload-time = "2026-02-09T12:58:37.864Z" }, + { url = "https://files.pythonhosted.org/packages/09/aa/b672a647bbe1556a85337dc95bfd40d146e9965ead9cc2fe81bde1e5cbce/coverage-7.13.4-cp314-cp314t-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:14375934243ee05f56c45393fe2ce81fe5cc503c07cee2bdf1725fb8bef3ffaf", size = 264004, upload-time = "2026-02-09T12:58:39.492Z" }, + { url = "https://files.pythonhosted.org/packages/79/a1/aa384dbe9181f98bba87dd23dda436f0c6cf2e148aecbb4e50fc51c1a656/coverage-7.13.4-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:25a41c3104d08edb094d9db0d905ca54d0cd41c928bb6be3c4c799a54753af55", size = 266408, upload-time = "2026-02-09T12:58:41.852Z" }, + { url = "https://files.pythonhosted.org/packages/53/5e/5150bf17b4019bc600799f376bb9606941e55bd5a775dc1e096b6ffea952/coverage-7.13.4-cp314-cp314t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:6f01afcff62bf9a08fb32b2c1d6e924236c0383c02c790732b6537269e466a72", size = 267544, upload-time = "2026-02-09T12:58:44.093Z" }, + { url = "https://files.pythonhosted.org/packages/e0/ed/f1de5c675987a4a7a672250d2c5c9d73d289dbf13410f00ed7181d8017dd/coverage-7.13.4-cp314-cp314t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:eb9078108fbf0bcdde37c3f4779303673c2fa1fe8f7956e68d447d0dd426d38a", size = 260980, upload-time = "2026-02-09T12:58:45.721Z" }, + { url = "https://files.pythonhosted.org/packages/b3/e3/fe758d01850aa172419a6743fe76ba8b92c29d181d4f676ffe2dae2ba631/coverage-7.13.4-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:0e086334e8537ddd17e5f16a344777c1ab8194986ec533711cbe6c41cde841b6", size = 263871, upload-time = "2026-02-09T12:58:47.334Z" }, + { url = "https://files.pythonhosted.org/packages/b6/76/b829869d464115e22499541def9796b25312b8cf235d3bb00b39f1675395/coverage-7.13.4-cp314-cp314t-musllinux_1_2_i686.whl", hash = "sha256:725d985c5ab621268b2edb8e50dfe57633dc69bda071abc470fed55a14935fd3", size = 261472, upload-time = "2026-02-09T12:58:48.995Z" }, + { url = "https://files.pythonhosted.org/packages/14/9e/caedb1679e73e2f6ad240173f55218488bfe043e38da577c4ec977489915/coverage-7.13.4-cp314-cp314t-musllinux_1_2_ppc64le.whl", hash = "sha256:3c06f0f1337c667b971ca2f975523347e63ec5e500b9aa5882d91931cd3ef750", size = 265210, upload-time = "2026-02-09T12:58:51.178Z" }, + { url = "https://files.pythonhosted.org/packages/3a/10/0dd02cb009b16ede425b49ec344aba13a6ae1dc39600840ea6abcb085ac4/coverage-7.13.4-cp314-cp314t-musllinux_1_2_riscv64.whl", hash = "sha256:590c0ed4bf8e85f745e6b805b2e1c457b2e33d5255dd9729743165253bc9ad39", size = 260319, upload-time = "2026-02-09T12:58:53.081Z" }, + { url = "https://files.pythonhosted.org/packages/92/8e/234d2c927af27c6d7a5ffad5bd2cf31634c46a477b4c7adfbfa66baf7ebb/coverage-7.13.4-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:eb30bf180de3f632cd043322dad5751390e5385108b2807368997d1a92a509d0", size = 262638, upload-time = "2026-02-09T12:58:55.258Z" }, + { url = "https://files.pythonhosted.org/packages/2f/64/e5547c8ff6964e5965c35a480855911b61509cce544f4d442caa759a0702/coverage-7.13.4-cp314-cp314t-win32.whl", hash = "sha256:c4240e7eded42d131a2d2c4dec70374b781b043ddc79a9de4d55ca71f8e98aea", size = 223040, upload-time = "2026-02-09T12:58:56.936Z" }, + { url = "https://files.pythonhosted.org/packages/c7/96/38086d58a181aac86d503dfa9c47eb20715a79c3e3acbdf786e92e5c09a8/coverage-7.13.4-cp314-cp314t-win_amd64.whl", hash = "sha256:4c7d3cc01e7350f2f0f6f7036caaf5673fb56b6998889ccfe9e1c1fe75a9c932", size = 224148, upload-time = "2026-02-09T12:58:58.645Z" }, + { url = "https://files.pythonhosted.org/packages/ce/72/8d10abd3740a0beb98c305e0c3faf454366221c0f37a8bcf8f60020bb65a/coverage-7.13.4-cp314-cp314t-win_arm64.whl", hash = "sha256:23e3f687cf945070d1c90f85db66d11e3025665d8dafa831301a0e0038f3db9b", size = 222172, upload-time = "2026-02-09T12:59:00.396Z" }, + { url = "https://files.pythonhosted.org/packages/0d/4a/331fe2caf6799d591109bb9c08083080f6de90a823695d412a935622abb2/coverage-7.13.4-py3-none-any.whl", hash = "sha256:1af1641e57cf7ba1bd67d677c9abdbcd6cc2ab7da3bca7fa1e2b7e50e65f2ad0", size = 211242, upload-time = "2026-02-09T12:59:02.032Z" }, +] + +[package.optional-dependencies] +toml = [ + { name = "tomli", marker = "python_full_version <= '3.11'" }, +] + +[[package]] +name = "cycler" +version = "0.12.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/a9/95/a3dbbb5028f35eafb79008e7522a75244477d2838f38cbb722248dabc2a8/cycler-0.12.1.tar.gz", hash = "sha256:88bb128f02ba341da8ef447245a9e138fae777f6a23943da4540077d3601eb1c", size = 7615, upload-time = "2023-10-07T05:32:18.335Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/e7/05/c19819d5e3d95294a6f5947fb9b9629efb316b96de511b418c53d245aae6/cycler-0.12.1-py3-none-any.whl", hash = "sha256:85cef7cff222d8644161529808465972e51340599459b8ac3ccbac5a854e0d30", size = 8321, upload-time = "2023-10-07T05:32:16.783Z" }, +] + +[[package]] +name = "decorator" +version = "5.2.1" +source = { registry = "https://pypi.org/simple" } +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" } +wheels = [ + { 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" }, +] + +[[package]] +name = "einops" +version = "0.8.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/2c/77/850bef8d72ffb9219f0b1aac23fbc1bf7d038ee6ea666f331fa273031aa2/einops-0.8.2.tar.gz", hash = "sha256:609da665570e5e265e27283aab09e7f279ade90c4f01bcfca111f3d3e13f2827", size = 56261, upload-time = "2026-01-26T04:13:17.638Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/2a/09/f8d8f8f31e4483c10a906437b4ce31bdf3d6d417b73fe33f1a8b59e34228/einops-0.8.2-py3-none-any.whl", hash = "sha256:54058201ac7087911181bfec4af6091bb59380360f069276601256a76af08193", size = 65638, upload-time = "2026-01-26T04:13:18.546Z" }, +] + +[[package]] +name = "exceptiongroup" +version = "1.3.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "typing-extensions", marker = "python_full_version < '3.11'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/50/79/66800aadf48771f6b62f7eb014e352e5d06856655206165d775e675a02c9/exceptiongroup-1.3.1.tar.gz", hash = "sha256:8b412432c6055b0b7d14c310000ae93352ed6754f70fa8f7c34141f91c4e3219", size = 30371, upload-time = "2025-11-21T23:01:54.787Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/8a/0e/97c33bf5009bdbac74fd2beace167cab3f978feb69cc36f1ef79360d6c4e/exceptiongroup-1.3.1-py3-none-any.whl", hash = "sha256:a7a39a3bd276781e98394987d3a5701d0c4edffb633bb7a5144577f82c773598", size = 16740, upload-time = "2025-11-21T23:01:53.443Z" }, +] + +[[package]] +name = "filelock" +version = "3.25.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/94/b8/00651a0f559862f3bb7d6f7477b192afe3f583cc5e26403b44e59a55ab34/filelock-3.25.2.tar.gz", hash = "sha256:b64ece2b38f4ca29dd3e810287aa8c48182bbecd1ae6e9ae126c9b35f1382694", size = 40480, upload-time = "2026-03-11T20:45:38.487Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/a4/a5/842ae8f0c08b61d6484b52f99a03510a3a72d23141942d216ebe81fefbce/filelock-3.25.2-py3-none-any.whl", hash = "sha256:ca8afb0da15f229774c9ad1b455ed96e85a81373065fb10446672f64444ddf70", size = 26759, upload-time = "2026-03-11T20:45:37.437Z" }, +] + +[[package]] +name = "flatbuffers" +version = "25.12.19" +source = { registry = "https://pypi.org/simple" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/e8/2d/d2a548598be01649e2d46231d151a6c56d10b964d94043a335ae56ea2d92/flatbuffers-25.12.19-py2.py3-none-any.whl", hash = "sha256:7634f50c427838bb021c2d66a3d1168e9d199b0607e6329399f04846d42e20b4", size = 26661, upload-time = "2025-12-19T23:16:13.622Z" }, +] + +[[package]] +name = "fonttools" +version = "4.62.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/5a/96/686339e0fda8142b7ebed39af53f4a5694602a729662f42a6209e3be91d0/fonttools-4.62.0.tar.gz", hash = "sha256:0dc477c12b8076b4eb9af2e440421b0433ffa9e1dcb39e0640a6c94665ed1098", size = 3579521, upload-time = "2026-03-09T16:50:06.217Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/82/e0/9db48ec7f6b95bae7b20667ded54f18dba8e759ef66232c8683822ae26fc/fonttools-4.62.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:62b6a3d0028e458e9b59501cf7124a84cd69681c433570e4861aff4fb54a236c", size = 2873527, upload-time = "2026-03-09T16:48:12.416Z" }, + { url = "https://files.pythonhosted.org/packages/dd/45/86eccfdc922cb9fafc63189a9793fa9f6dd60e68a07be42e454ef2c0deae/fonttools-4.62.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:966557078b55e697f65300b18025c54e872d7908d1899b7314d7c16e64868cb2", size = 2417427, upload-time = "2026-03-09T16:48:15.122Z" }, + { url = "https://files.pythonhosted.org/packages/d3/98/f547a1fceeae81a9a5c6461bde2badac8bf50bda7122a8012b32b1e65396/fonttools-4.62.0-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:9cf34861145b516cddd19b07ae6f4a61ea1c6326031b960ec9ddce8ee815e888", size = 4934993, upload-time = "2026-03-09T16:48:18.186Z" }, + { url = "https://files.pythonhosted.org/packages/5c/57/a23a051fcff998fdfabdd33c6721b5bad499da08b586d3676993410071f0/fonttools-4.62.0-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:3e2ff573de2775508c8a366351fb901c4ced5dc6cf2d87dd15c973bedcdd5216", size = 4892154, upload-time = "2026-03-09T16:48:20.736Z" }, + { url = "https://files.pythonhosted.org/packages/e2/62/e27644b433dc6db1d47bc6028a27d772eec5cc8338e24a9a1fce5d7120aa/fonttools-4.62.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:55b189a1b3033860a38e4e5bd0626c5aa25c7ce9caee7bc784a8caec7a675401", size = 4911635, upload-time = "2026-03-09T16:48:23.174Z" }, + { url = "https://files.pythonhosted.org/packages/7e/e2/1bf141911a5616bacfe9cf237c80ccd69d0d92482c38c0f7f6a55d063ad9/fonttools-4.62.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:825f98cd14907c74a4d0a3f7db8570886ffce9c6369fed1385020febf919abf6", size = 5031492, upload-time = "2026-03-09T16:48:25.095Z" }, + { url = "https://files.pythonhosted.org/packages/2f/59/790c292f4347ecfa77d9c7e0d1d91e04ab227f6e4a337ed4fe37ca388048/fonttools-4.62.0-cp310-cp310-win32.whl", hash = "sha256:c858030560f92a054444c6e46745227bfd3bb4e55383c80d79462cd47289e4b5", size = 1507656, upload-time = "2026-03-09T16:48:26.973Z" }, + { url = "https://files.pythonhosted.org/packages/e9/ee/08c0b7f8bac6e44638de6fe9a3e710a623932f60eccd58912c4d4743516d/fonttools-4.62.0-cp310-cp310-win_amd64.whl", hash = "sha256:9bf75eb69330e34ad2a096fac67887102c8537991eb6cac1507fc835bbb70e0a", size = 1556540, upload-time = "2026-03-09T16:48:30.359Z" }, + { url = "https://files.pythonhosted.org/packages/e4/33/63d79ca41020dd460b51f1e0f58ad1ff0a36b7bcbdf8f3971d52836581e9/fonttools-4.62.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:196cafef9aeec5258425bd31a4e9a414b2ee0d1557bca184d7923d3d3bcd90f9", size = 2870816, upload-time = "2026-03-09T16:48:32.39Z" }, + { url = "https://files.pythonhosted.org/packages/c0/7a/9aeec114bc9fc00d757a41f092f7107863d372e684a5b5724c043654477c/fonttools-4.62.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:153afc3012ff8761b1733e8fbe5d98623409774c44ffd88fbcb780e240c11d13", size = 2416127, upload-time = "2026-03-09T16:48:34.627Z" }, + { url = "https://files.pythonhosted.org/packages/5a/71/12cfd8ae0478b7158ffa8850786781f67e73c00fd897ef9d053415c5f88b/fonttools-4.62.0-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:13b663fb197334de84db790353d59da2a7288fd14e9be329f5debc63ec0500a5", size = 5100678, upload-time = "2026-03-09T16:48:36.454Z" }, + { url = "https://files.pythonhosted.org/packages/8a/d7/8e4845993ee233c2023d11babe9b3dae7d30333da1d792eeccebcb77baab/fonttools-4.62.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:591220d5333264b1df0d3285adbdfe2af4f6a45bbf9ca2b485f97c9f577c49ff", size = 5070859, upload-time = "2026-03-09T16:48:38.786Z" }, + { url = "https://files.pythonhosted.org/packages/ae/a0/287ae04cd883a52e7bb1d92dfc4997dcffb54173761c751106845fa9e316/fonttools-4.62.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:579f35c121528a50c96bf6fcb6a393e81e7f896d4326bf40e379f1c971603db9", size = 5076689, upload-time = "2026-03-09T16:48:41.886Z" }, + { url = "https://files.pythonhosted.org/packages/6d/4e/a2377ad26c36fcd3e671a1c316ea5ed83107de1588e2d897a98349363bc7/fonttools-4.62.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:44956b003151d5a289eba6c71fe590d63509267c37e26de1766ba15d9c589582", size = 5202053, upload-time = "2026-03-09T16:48:43.867Z" }, + { url = "https://files.pythonhosted.org/packages/44/2e/ad0472e69b02f83dc88983a9910d122178461606404be5b4838af6d1744a/fonttools-4.62.0-cp311-cp311-win32.whl", hash = "sha256:42c7848fa8836ab92c23b1617c407a905642521ff2d7897fe2bf8381530172f1", size = 2292852, upload-time = "2026-03-09T16:48:46.962Z" }, + { url = "https://files.pythonhosted.org/packages/77/ce/f5a4c42c117f8113ce04048053c128d17426751a508f26398110c993a074/fonttools-4.62.0-cp311-cp311-win_amd64.whl", hash = "sha256:4da779e8f342a32856075ddb193b2a024ad900bc04ecb744014c32409ae871ed", size = 2344367, upload-time = "2026-03-09T16:48:48.818Z" }, + { url = "https://files.pythonhosted.org/packages/ab/9d/7ad1ffc080619f67d0b1e0fa6a0578f0be077404f13fd8e448d1616a94a3/fonttools-4.62.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:22bde4dc12a9e09b5ced77f3b5053d96cf10c4976c6ac0dee293418ef289d221", size = 2870004, upload-time = "2026-03-09T16:48:50.837Z" }, + { url = "https://files.pythonhosted.org/packages/4d/8b/ba59069a490f61b737e064c3129453dbd28ee38e81d56af0d04d7e6b4de4/fonttools-4.62.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:7199c73b326bad892f1cb53ffdd002128bfd58a89b8f662204fbf1daf8d62e85", size = 2414662, upload-time = "2026-03-09T16:48:53.295Z" }, + { url = "https://files.pythonhosted.org/packages/8c/8c/c52a4310de58deeac7e9ea800892aec09b00bb3eb0c53265b31ec02be115/fonttools-4.62.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:d732938633681d6e2324e601b79e93f7f72395ec8681f9cdae5a8c08bc167e72", size = 5032975, upload-time = "2026-03-09T16:48:55.718Z" }, + { url = "https://files.pythonhosted.org/packages/0b/a1/d16318232964d786907b9b3613b8409f74cf0be2da400854509d3a864e43/fonttools-4.62.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:31a804c16d76038cc4e3826e07678efb0a02dc4f15396ea8e07088adbfb2578e", size = 4988544, upload-time = "2026-03-09T16:48:57.715Z" }, + { url = "https://files.pythonhosted.org/packages/b2/8d/7e745ca3e65852adc5e52a83dc213fe1b07d61cb5b394970fcd4b1199d1e/fonttools-4.62.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:090e74ac86e68c20150e665ef8e7e0c20cb9f8b395302c9419fa2e4d332c3b51", size = 4971296, upload-time = "2026-03-09T16:48:59.678Z" }, + { url = "https://files.pythonhosted.org/packages/e6/d4/b717a4874175146029ca1517e85474b1af80c9d9a306fc3161e71485eea5/fonttools-4.62.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:8f086120e8be9e99ca1288aa5ce519833f93fe0ec6ebad2380c1dee18781f0b5", size = 5122503, upload-time = "2026-03-09T16:49:02.464Z" }, + { url = "https://files.pythonhosted.org/packages/cb/4b/92cfcba4bf8373f51c49c5ae4b512ead6fbda7d61a0e8c35a369d0db40a0/fonttools-4.62.0-cp312-cp312-win32.whl", hash = "sha256:37a73e5e38fd05c637daede6ffed5f3496096be7df6e4a3198d32af038f87527", size = 2281060, upload-time = "2026-03-09T16:49:04.385Z" }, + { url = "https://files.pythonhosted.org/packages/cd/06/cc96468781a4dc8ae2f14f16f32b32f69bde18cb9384aad27ccc7adf76f7/fonttools-4.62.0-cp312-cp312-win_amd64.whl", hash = "sha256:658ab837c878c4d2a652fcbb319547ea41693890e6434cf619e66f79387af3b8", size = 2331193, upload-time = "2026-03-09T16:49:06.598Z" }, + { url = "https://files.pythonhosted.org/packages/82/c7/985c1670aa6d82ef270f04cde11394c168f2002700353bd2bde405e59b8f/fonttools-4.62.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:274c8b8a87e439faf565d3bcd3f9f9e31bca7740755776a4a90a4bfeaa722efa", size = 2864929, upload-time = "2026-03-09T16:49:09.331Z" }, + { url = "https://files.pythonhosted.org/packages/c1/dc/c409c8ceec0d3119e9ab0b7b1a2e3c76d1f4d66e4a9db5c59e6b7652e7df/fonttools-4.62.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:93e27131a5a0ae82aaadcffe309b1bae195f6711689722af026862bede05c07c", size = 2412586, upload-time = "2026-03-09T16:49:11.378Z" }, + { url = "https://files.pythonhosted.org/packages/5f/ac/8e300dbf7b4d135287c261ffd92ede02d9f48f0d2db14665fbc8b059588a/fonttools-4.62.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:83c6524c5b93bad9c2939d88e619fedc62e913c19e673f25d5ab74e7a5d074e5", size = 5013708, upload-time = "2026-03-09T16:49:14.063Z" }, + { url = "https://files.pythonhosted.org/packages/fb/bc/60d93477b653eeb1ddf5f9ec34be689b79234d82dbdded269ac0252715b8/fonttools-4.62.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:106aec9226f9498fc5345125ff7200842c01eda273ae038f5049b0916907acee", size = 4964355, upload-time = "2026-03-09T16:49:16.515Z" }, + { url = "https://files.pythonhosted.org/packages/cb/eb/6dc62bcc3c3598c28a3ecb77e69018869c3e109bd83031d4973c059d318b/fonttools-4.62.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:15d86b96c79013320f13bc1b15f94789edb376c0a2d22fb6088f33637e8dfcbc", size = 4953472, upload-time = "2026-03-09T16:49:18.494Z" }, + { url = "https://files.pythonhosted.org/packages/82/b3/3af7592d9b254b7b7fec018135f8776bfa0d1ad335476c2791b1334dc5e4/fonttools-4.62.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:4f16c07e5250d5d71d0f990a59460bc5620c3cc456121f2cfb5b60475699905f", size = 5094701, upload-time = "2026-03-09T16:49:21.67Z" }, + { url = "https://files.pythonhosted.org/packages/31/3d/976645583ab567d3ee75ff87b33aa1330fa2baeeeae5fc46210b4274dd45/fonttools-4.62.0-cp313-cp313-win32.whl", hash = "sha256:d31558890f3fa00d4f937d12708f90c7c142c803c23eaeb395a71f987a77ebe3", size = 2279710, upload-time = "2026-03-09T16:49:23.812Z" }, + { url = "https://files.pythonhosted.org/packages/f5/7a/e25245a30457595740041dba9d0ea8ec1b2517f2f1a6a741f15eba1a4edc/fonttools-4.62.0-cp313-cp313-win_amd64.whl", hash = "sha256:6826a5aa53fb6def8a66bf423939745f415546c4e92478a7c531b8b6282b6c3b", size = 2330291, upload-time = "2026-03-09T16:49:26.237Z" }, + { url = "https://files.pythonhosted.org/packages/1a/64/61f69298aa6e7c363dcf00dd6371a654676900abe27d1effd1a74b43e5d0/fonttools-4.62.0-cp314-cp314-macosx_10_15_universal2.whl", hash = "sha256:4fa5a9c716e2f75ef34b5a5c2ca0ee4848d795daa7e6792bf30fd4abf8993449", size = 2864222, upload-time = "2026-03-09T16:49:28.285Z" }, + { url = "https://files.pythonhosted.org/packages/c6/57/6b08756fe4455336b1fe160ab3c11fccc90768ccb6ee03fb0b45851aace4/fonttools-4.62.0-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:625f5cbeb0b8f4e42343eaeb4bc2786718ddd84760a2f5e55fdd3db049047c00", size = 2410674, upload-time = "2026-03-09T16:49:30.504Z" }, + { url = "https://files.pythonhosted.org/packages/6f/86/db65b63bb1b824b63e602e9be21b18741ddc99bcf5a7850f9181159ae107/fonttools-4.62.0-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6247e58b96b982709cd569a91a2ba935d406dccf17b6aa615afaed37ac3856aa", size = 4999387, upload-time = "2026-03-09T16:49:32.593Z" }, + { url = "https://files.pythonhosted.org/packages/86/c8/c6669e42d2f4efd60d38a3252cebbb28851f968890efb2b9b15f9d1092b0/fonttools-4.62.0-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:840632ea9c1eab7b7f01c369e408c0721c287dfd7500ab937398430689852fd1", size = 4912506, upload-time = "2026-03-09T16:49:34.927Z" }, + { url = "https://files.pythonhosted.org/packages/2e/49/0ae552aa098edd0ec548413fbf818f52ceb70535016215094a5ce9bf8f70/fonttools-4.62.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:28a9ea2a7467a816d1bec22658b0cce4443ac60abac3e293bdee78beb74588f3", size = 4951202, upload-time = "2026-03-09T16:49:37.1Z" }, + { url = "https://files.pythonhosted.org/packages/71/65/ae38fc8a4cea6f162d74cf11f58e9aeef1baa7d0e3d1376dabd336c129e5/fonttools-4.62.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:5ae611294f768d413949fd12693a8cba0e6332fbc1e07aba60121be35eac68d0", size = 5060758, upload-time = "2026-03-09T16:49:39.464Z" }, + { url = "https://files.pythonhosted.org/packages/db/3d/bb797496f35c60544cd5af71ffa5aad62df14ef7286908d204cb5c5096fe/fonttools-4.62.0-cp314-cp314-win32.whl", hash = "sha256:273acb61f316d07570a80ed5ff0a14a23700eedbec0ad968b949abaa4d3f6bb5", size = 2283496, upload-time = "2026-03-09T16:49:42.448Z" }, + { url = "https://files.pythonhosted.org/packages/2e/9f/91081ffe5881253177c175749cce5841f5ec6e931f5d52f4a817207b7429/fonttools-4.62.0-cp314-cp314-win_amd64.whl", hash = "sha256:a5f974006d14f735c6c878fc4b117ad031dc93638ddcc450ca69f8fd64d5e104", size = 2335426, upload-time = "2026-03-09T16:49:44.228Z" }, + { url = "https://files.pythonhosted.org/packages/f8/65/f47f9b3db1ec156a1f222f1089ba076b2cc9ee1d024a8b0a60c54258517e/fonttools-4.62.0-cp314-cp314t-macosx_10_15_universal2.whl", hash = "sha256:0361a7d41d86937f1f752717c19f719d0fde064d3011038f9f19bdf5fc2f5c95", size = 2947079, upload-time = "2026-03-09T16:49:46.471Z" }, + { url = "https://files.pythonhosted.org/packages/52/73/bc62e5058a0c22cf02b1e0169ef0c3ca6c3247216d719f95bead3c05a991/fonttools-4.62.0-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:d4108c12773b3c97aa592311557c405d5b4fc03db2b969ed928fcf68e7b3c887", size = 2448802, upload-time = "2026-03-09T16:49:48.328Z" }, + { url = "https://files.pythonhosted.org/packages/2b/df/bfaa0e845884935355670e6e68f137185ab87295f8bc838db575e4a66064/fonttools-4.62.0-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b448075f32708e8fb377fe7687f769a5f51a027172c591ba9a58693631b077a8", size = 5137378, upload-time = "2026-03-09T16:49:50.223Z" }, + { url = "https://files.pythonhosted.org/packages/32/32/04f616979a18b48b52e634988b93d847b6346260faf85ecccaf7e2e9057f/fonttools-4.62.0-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:e5f1fa8cc9f1a56a3e33ee6b954d6d9235e6b9d11eb7a6c9dfe2c2f829dc24db", size = 4920714, upload-time = "2026-03-09T16:49:53.172Z" }, + { url = "https://files.pythonhosted.org/packages/3b/2e/274e16689c1dfee5c68302cd7c444213cfddd23cf4620374419625037ec6/fonttools-4.62.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:f8c8ea812f82db1e884b9cdb663080453e28f0f9a1f5027a5adb59c4cc8d38d1", size = 5016012, upload-time = "2026-03-09T16:49:55.762Z" }, + { url = "https://files.pythonhosted.org/packages/7f/0c/b08117270626e7117ac2f89d732fdd4386ec37d2ab3a944462d29e6f89a1/fonttools-4.62.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:03c6068adfdc67c565d217e92386b1cdd951abd4240d65180cec62fa74ba31b2", size = 5042766, upload-time = "2026-03-09T16:49:57.726Z" }, + { url = "https://files.pythonhosted.org/packages/11/83/a48b73e54efa272ee65315a6331b30a9b3a98733310bc11402606809c50e/fonttools-4.62.0-cp314-cp314t-win32.whl", hash = "sha256:d28d5baacb0017d384df14722a63abe6e0230d8ce642b1615a27d78ffe3bc983", size = 2347785, upload-time = "2026-03-09T16:49:59.698Z" }, + { url = "https://files.pythonhosted.org/packages/f8/27/c67eab6dc3525bdc39586511b1b3d7161e972dacc0f17476dbaf932e708b/fonttools-4.62.0-cp314-cp314t-win_amd64.whl", hash = "sha256:3f9e20c4618f1e04190c802acae6dc337cb6db9fa61e492fd97cd5c5a9ff6d07", size = 2413914, upload-time = "2026-03-09T16:50:02.251Z" }, + { url = "https://files.pythonhosted.org/packages/9c/57/c2487c281dde03abb2dec244fd67059b8d118bd30a653cbf69e94084cb23/fonttools-4.62.0-py3-none-any.whl", hash = "sha256:75064f19a10c50c74b336aa5ebe7b1f89fd0fb5255807bfd4b0c6317098f4af3", size = 1152427, upload-time = "2026-03-09T16:50:04.074Z" }, +] + +[[package]] +name = "frozenlist" +version = "1.8.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/2d/f5/c831fac6cc817d26fd54c7eaccd04ef7e0288806943f7cc5bbf69f3ac1f0/frozenlist-1.8.0.tar.gz", hash = "sha256:3ede829ed8d842f6cd48fc7081d7a41001a56f1f38603f9d49bf3020d59a31ad", size = 45875, upload-time = "2025-10-06T05:38:17.865Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/83/4a/557715d5047da48d54e659203b9335be7bfaafda2c3f627b7c47e0b3aaf3/frozenlist-1.8.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:b37f6d31b3dcea7deb5e9696e529a6aa4a898adc33db82da12e4c60a7c4d2011", size = 86230, upload-time = "2025-10-06T05:35:23.699Z" }, + { url = "https://files.pythonhosted.org/packages/a2/fb/c85f9fed3ea8fe8740e5b46a59cc141c23b842eca617da8876cfce5f760e/frozenlist-1.8.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:ef2b7b394f208233e471abc541cc6991f907ffd47dc72584acee3147899d6565", size = 49621, upload-time = "2025-10-06T05:35:25.341Z" }, + { url = "https://files.pythonhosted.org/packages/63/70/26ca3f06aace16f2352796b08704338d74b6d1a24ca38f2771afbb7ed915/frozenlist-1.8.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:a88f062f072d1589b7b46e951698950e7da00442fc1cacbe17e19e025dc327ad", size = 49889, upload-time = "2025-10-06T05:35:26.797Z" }, + { url = "https://files.pythonhosted.org/packages/5d/ed/c7895fd2fde7f3ee70d248175f9b6cdf792fb741ab92dc59cd9ef3bd241b/frozenlist-1.8.0-cp310-cp310-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:f57fb59d9f385710aa7060e89410aeb5058b99e62f4d16b08b91986b9a2140c2", size = 219464, upload-time = "2025-10-06T05:35:28.254Z" }, + { url = "https://files.pythonhosted.org/packages/6b/83/4d587dccbfca74cb8b810472392ad62bfa100bf8108c7223eb4c4fa2f7b3/frozenlist-1.8.0-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:799345ab092bee59f01a915620b5d014698547afd011e691a208637312db9186", size = 221649, upload-time = "2025-10-06T05:35:29.454Z" }, + { url = "https://files.pythonhosted.org/packages/6a/c6/fd3b9cd046ec5fff9dab66831083bc2077006a874a2d3d9247dea93ddf7e/frozenlist-1.8.0-cp310-cp310-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:c23c3ff005322a6e16f71bf8692fcf4d5a304aaafe1e262c98c6d4adc7be863e", size = 219188, upload-time = "2025-10-06T05:35:30.951Z" }, + { url = "https://files.pythonhosted.org/packages/ce/80/6693f55eb2e085fc8afb28cf611448fb5b90e98e068fa1d1b8d8e66e5c7d/frozenlist-1.8.0-cp310-cp310-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:8a76ea0f0b9dfa06f254ee06053d93a600865b3274358ca48a352ce4f0798450", size = 231748, upload-time = "2025-10-06T05:35:32.101Z" }, + { url = "https://files.pythonhosted.org/packages/97/d6/e9459f7c5183854abd989ba384fe0cc1a0fb795a83c033f0571ec5933ca4/frozenlist-1.8.0-cp310-cp310-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:c7366fe1418a6133d5aa824ee53d406550110984de7637d65a178010f759c6ef", size = 236351, upload-time = "2025-10-06T05:35:33.834Z" }, + { url = "https://files.pythonhosted.org/packages/97/92/24e97474b65c0262e9ecd076e826bfd1d3074adcc165a256e42e7b8a7249/frozenlist-1.8.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:13d23a45c4cebade99340c4165bd90eeb4a56c6d8a9d8aa49568cac19a6d0dc4", size = 218767, upload-time = "2025-10-06T05:35:35.205Z" }, + { url = "https://files.pythonhosted.org/packages/ee/bf/dc394a097508f15abff383c5108cb8ad880d1f64a725ed3b90d5c2fbf0bb/frozenlist-1.8.0-cp310-cp310-musllinux_1_2_armv7l.whl", hash = "sha256:e4a3408834f65da56c83528fb52ce7911484f0d1eaf7b761fc66001db1646eff", size = 235887, upload-time = "2025-10-06T05:35:36.354Z" }, + { url = "https://files.pythonhosted.org/packages/40/90/25b201b9c015dbc999a5baf475a257010471a1fa8c200c843fd4abbee725/frozenlist-1.8.0-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:42145cd2748ca39f32801dad54aeea10039da6f86e303659db90db1c4b614c8c", size = 228785, upload-time = "2025-10-06T05:35:37.949Z" }, + { url = "https://files.pythonhosted.org/packages/84/f4/b5bc148df03082f05d2dd30c089e269acdbe251ac9a9cf4e727b2dbb8a3d/frozenlist-1.8.0-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:e2de870d16a7a53901e41b64ffdf26f2fbb8917b3e6ebf398098d72c5b20bd7f", size = 230312, upload-time = "2025-10-06T05:35:39.178Z" }, + { url = "https://files.pythonhosted.org/packages/db/4b/87e95b5d15097c302430e647136b7d7ab2398a702390cf4c8601975709e7/frozenlist-1.8.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:20e63c9493d33ee48536600d1a5c95eefc870cd71e7ab037763d1fbb89cc51e7", size = 217650, upload-time = "2025-10-06T05:35:40.377Z" }, + { url = "https://files.pythonhosted.org/packages/e5/70/78a0315d1fea97120591a83e0acd644da638c872f142fd72a6cebee825f3/frozenlist-1.8.0-cp310-cp310-win32.whl", hash = "sha256:adbeebaebae3526afc3c96fad434367cafbfd1b25d72369a9e5858453b1bb71a", size = 39659, upload-time = "2025-10-06T05:35:41.863Z" }, + { url = "https://files.pythonhosted.org/packages/66/aa/3f04523fb189a00e147e60c5b2205126118f216b0aa908035c45336e27e4/frozenlist-1.8.0-cp310-cp310-win_amd64.whl", hash = "sha256:667c3777ca571e5dbeb76f331562ff98b957431df140b54c85fd4d52eea8d8f6", size = 43837, upload-time = "2025-10-06T05:35:43.205Z" }, + { url = "https://files.pythonhosted.org/packages/39/75/1135feecdd7c336938bd55b4dc3b0dfc46d85b9be12ef2628574b28de776/frozenlist-1.8.0-cp310-cp310-win_arm64.whl", hash = "sha256:80f85f0a7cc86e7a54c46d99c9e1318ff01f4687c172ede30fd52d19d1da1c8e", size = 39989, upload-time = "2025-10-06T05:35:44.596Z" }, + { url = "https://files.pythonhosted.org/packages/bc/03/077f869d540370db12165c0aa51640a873fb661d8b315d1d4d67b284d7ac/frozenlist-1.8.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:09474e9831bc2b2199fad6da3c14c7b0fbdd377cce9d3d77131be28906cb7d84", size = 86912, upload-time = "2025-10-06T05:35:45.98Z" }, + { url = "https://files.pythonhosted.org/packages/df/b5/7610b6bd13e4ae77b96ba85abea1c8cb249683217ef09ac9e0ae93f25a91/frozenlist-1.8.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:17c883ab0ab67200b5f964d2b9ed6b00971917d5d8a92df149dc2c9779208ee9", size = 50046, upload-time = "2025-10-06T05:35:47.009Z" }, + { url = "https://files.pythonhosted.org/packages/6e/ef/0e8f1fe32f8a53dd26bdd1f9347efe0778b0fddf62789ea683f4cc7d787d/frozenlist-1.8.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:fa47e444b8ba08fffd1c18e8cdb9a75db1b6a27f17507522834ad13ed5922b93", size = 50119, upload-time = "2025-10-06T05:35:48.38Z" }, + { url = "https://files.pythonhosted.org/packages/11/b1/71a477adc7c36e5fb628245dfbdea2166feae310757dea848d02bd0689fd/frozenlist-1.8.0-cp311-cp311-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:2552f44204b744fba866e573be4c1f9048d6a324dfe14475103fd51613eb1d1f", size = 231067, upload-time = "2025-10-06T05:35:49.97Z" }, + { url = "https://files.pythonhosted.org/packages/45/7e/afe40eca3a2dc19b9904c0f5d7edfe82b5304cb831391edec0ac04af94c2/frozenlist-1.8.0-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:957e7c38f250991e48a9a73e6423db1bb9dd14e722a10f6b8bb8e16a0f55f695", size = 233160, upload-time = "2025-10-06T05:35:51.729Z" }, + { url = "https://files.pythonhosted.org/packages/a6/aa/7416eac95603ce428679d273255ffc7c998d4132cfae200103f164b108aa/frozenlist-1.8.0-cp311-cp311-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:8585e3bb2cdea02fc88ffa245069c36555557ad3609e83be0ec71f54fd4abb52", size = 228544, upload-time = "2025-10-06T05:35:53.246Z" }, + { url = "https://files.pythonhosted.org/packages/8b/3d/2a2d1f683d55ac7e3875e4263d28410063e738384d3adc294f5ff3d7105e/frozenlist-1.8.0-cp311-cp311-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:edee74874ce20a373d62dc28b0b18b93f645633c2943fd90ee9d898550770581", size = 243797, upload-time = "2025-10-06T05:35:54.497Z" }, + { url = "https://files.pythonhosted.org/packages/78/1e/2d5565b589e580c296d3bb54da08d206e797d941a83a6fdea42af23be79c/frozenlist-1.8.0-cp311-cp311-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:c9a63152fe95756b85f31186bddf42e4c02c6321207fd6601a1c89ebac4fe567", size = 247923, upload-time = "2025-10-06T05:35:55.861Z" }, + { url = "https://files.pythonhosted.org/packages/aa/c3/65872fcf1d326a7f101ad4d86285c403c87be7d832b7470b77f6d2ed5ddc/frozenlist-1.8.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:b6db2185db9be0a04fecf2f241c70b63b1a242e2805be291855078f2b404dd6b", size = 230886, upload-time = "2025-10-06T05:35:57.399Z" }, + { url = "https://files.pythonhosted.org/packages/a0/76/ac9ced601d62f6956f03cc794f9e04c81719509f85255abf96e2510f4265/frozenlist-1.8.0-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:f4be2e3d8bc8aabd566f8d5b8ba7ecc09249d74ba3c9ed52e54dc23a293f0b92", size = 245731, upload-time = "2025-10-06T05:35:58.563Z" }, + { url = "https://files.pythonhosted.org/packages/b9/49/ecccb5f2598daf0b4a1415497eba4c33c1e8ce07495eb07d2860c731b8d5/frozenlist-1.8.0-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:c8d1634419f39ea6f5c427ea2f90ca85126b54b50837f31497f3bf38266e853d", size = 241544, upload-time = "2025-10-06T05:35:59.719Z" }, + { url = "https://files.pythonhosted.org/packages/53/4b/ddf24113323c0bbcc54cb38c8b8916f1da7165e07b8e24a717b4a12cbf10/frozenlist-1.8.0-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:1a7fa382a4a223773ed64242dbe1c9c326ec09457e6b8428efb4118c685c3dfd", size = 241806, upload-time = "2025-10-06T05:36:00.959Z" }, + { url = "https://files.pythonhosted.org/packages/a7/fb/9b9a084d73c67175484ba2789a59f8eebebd0827d186a8102005ce41e1ba/frozenlist-1.8.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:11847b53d722050808926e785df837353bd4d75f1d494377e59b23594d834967", size = 229382, upload-time = "2025-10-06T05:36:02.22Z" }, + { url = "https://files.pythonhosted.org/packages/95/a3/c8fb25aac55bf5e12dae5c5aa6a98f85d436c1dc658f21c3ac73f9fa95e5/frozenlist-1.8.0-cp311-cp311-win32.whl", hash = "sha256:27c6e8077956cf73eadd514be8fb04d77fc946a7fe9f7fe167648b0b9085cc25", size = 39647, upload-time = "2025-10-06T05:36:03.409Z" }, + { url = "https://files.pythonhosted.org/packages/0a/f5/603d0d6a02cfd4c8f2a095a54672b3cf967ad688a60fb9faf04fc4887f65/frozenlist-1.8.0-cp311-cp311-win_amd64.whl", hash = "sha256:ac913f8403b36a2c8610bbfd25b8013488533e71e62b4b4adce9c86c8cea905b", size = 44064, upload-time = "2025-10-06T05:36:04.368Z" }, + { url = "https://files.pythonhosted.org/packages/5d/16/c2c9ab44e181f043a86f9a8f84d5124b62dbcb3a02c0977ec72b9ac1d3e0/frozenlist-1.8.0-cp311-cp311-win_arm64.whl", hash = "sha256:d4d3214a0f8394edfa3e303136d0575eece0745ff2b47bd2cb2e66dd92d4351a", size = 39937, upload-time = "2025-10-06T05:36:05.669Z" }, + { url = "https://files.pythonhosted.org/packages/69/29/948b9aa87e75820a38650af445d2ef2b6b8a6fab1a23b6bb9e4ef0be2d59/frozenlist-1.8.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:78f7b9e5d6f2fdb88cdde9440dc147259b62b9d3b019924def9f6478be254ac1", size = 87782, upload-time = "2025-10-06T05:36:06.649Z" }, + { url = "https://files.pythonhosted.org/packages/64/80/4f6e318ee2a7c0750ed724fa33a4bdf1eacdc5a39a7a24e818a773cd91af/frozenlist-1.8.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:229bf37d2e4acdaf808fd3f06e854a4a7a3661e871b10dc1f8f1896a3b05f18b", size = 50594, upload-time = "2025-10-06T05:36:07.69Z" }, + { url = "https://files.pythonhosted.org/packages/2b/94/5c8a2b50a496b11dd519f4a24cb5496cf125681dd99e94c604ccdea9419a/frozenlist-1.8.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:f833670942247a14eafbb675458b4e61c82e002a148f49e68257b79296e865c4", size = 50448, upload-time = "2025-10-06T05:36:08.78Z" }, + { url = "https://files.pythonhosted.org/packages/6a/bd/d91c5e39f490a49df14320f4e8c80161cfcce09f1e2cde1edd16a551abb3/frozenlist-1.8.0-cp312-cp312-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:494a5952b1c597ba44e0e78113a7266e656b9794eec897b19ead706bd7074383", size = 242411, upload-time = "2025-10-06T05:36:09.801Z" }, + { url = "https://files.pythonhosted.org/packages/8f/83/f61505a05109ef3293dfb1ff594d13d64a2324ac3482be2cedc2be818256/frozenlist-1.8.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:96f423a119f4777a4a056b66ce11527366a8bb92f54e541ade21f2374433f6d4", size = 243014, upload-time = "2025-10-06T05:36:11.394Z" }, + { url = "https://files.pythonhosted.org/packages/d8/cb/cb6c7b0f7d4023ddda30cf56b8b17494eb3a79e3fda666bf735f63118b35/frozenlist-1.8.0-cp312-cp312-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:3462dd9475af2025c31cc61be6652dfa25cbfb56cbbf52f4ccfe029f38decaf8", size = 234909, upload-time = "2025-10-06T05:36:12.598Z" }, + { url = "https://files.pythonhosted.org/packages/31/c5/cd7a1f3b8b34af009fb17d4123c5a778b44ae2804e3ad6b86204255f9ec5/frozenlist-1.8.0-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:c4c800524c9cd9bac5166cd6f55285957fcfc907db323e193f2afcd4d9abd69b", size = 250049, upload-time = "2025-10-06T05:36:14.065Z" }, + { url = "https://files.pythonhosted.org/packages/c0/01/2f95d3b416c584a1e7f0e1d6d31998c4a795f7544069ee2e0962a4b60740/frozenlist-1.8.0-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:d6a5df73acd3399d893dafc71663ad22534b5aa4f94e8a2fabfe856c3c1b6a52", size = 256485, upload-time = "2025-10-06T05:36:15.39Z" }, + { url = "https://files.pythonhosted.org/packages/ce/03/024bf7720b3abaebcff6d0793d73c154237b85bdf67b7ed55e5e9596dc9a/frozenlist-1.8.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:405e8fe955c2280ce66428b3ca55e12b3c4e9c336fb2103a4937e891c69a4a29", size = 237619, upload-time = "2025-10-06T05:36:16.558Z" }, + { url = "https://files.pythonhosted.org/packages/69/fa/f8abdfe7d76b731f5d8bd217827cf6764d4f1d9763407e42717b4bed50a0/frozenlist-1.8.0-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:908bd3f6439f2fef9e85031b59fd4f1297af54415fb60e4254a95f75b3cab3f3", size = 250320, upload-time = "2025-10-06T05:36:17.821Z" }, + { url = "https://files.pythonhosted.org/packages/f5/3c/b051329f718b463b22613e269ad72138cc256c540f78a6de89452803a47d/frozenlist-1.8.0-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:294e487f9ec720bd8ffcebc99d575f7eff3568a08a253d1ee1a0378754b74143", size = 246820, upload-time = "2025-10-06T05:36:19.046Z" }, + { url = "https://files.pythonhosted.org/packages/0f/ae/58282e8f98e444b3f4dd42448ff36fa38bef29e40d40f330b22e7108f565/frozenlist-1.8.0-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:74c51543498289c0c43656701be6b077f4b265868fa7f8a8859c197006efb608", size = 250518, upload-time = "2025-10-06T05:36:20.763Z" }, + { url = "https://files.pythonhosted.org/packages/8f/96/007e5944694d66123183845a106547a15944fbbb7154788cbf7272789536/frozenlist-1.8.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:776f352e8329135506a1d6bf16ac3f87bc25b28e765949282dcc627af36123aa", size = 239096, upload-time = "2025-10-06T05:36:22.129Z" }, + { url = "https://files.pythonhosted.org/packages/66/bb/852b9d6db2fa40be96f29c0d1205c306288f0684df8fd26ca1951d461a56/frozenlist-1.8.0-cp312-cp312-win32.whl", hash = "sha256:433403ae80709741ce34038da08511d4a77062aa924baf411ef73d1146e74faf", size = 39985, upload-time = "2025-10-06T05:36:23.661Z" }, + { url = "https://files.pythonhosted.org/packages/b8/af/38e51a553dd66eb064cdf193841f16f077585d4d28394c2fa6235cb41765/frozenlist-1.8.0-cp312-cp312-win_amd64.whl", hash = "sha256:34187385b08f866104f0c0617404c8eb08165ab1272e884abc89c112e9c00746", size = 44591, upload-time = "2025-10-06T05:36:24.958Z" }, + { url = "https://files.pythonhosted.org/packages/a7/06/1dc65480ab147339fecc70797e9c2f69d9cea9cf38934ce08df070fdb9cb/frozenlist-1.8.0-cp312-cp312-win_arm64.whl", hash = "sha256:fe3c58d2f5db5fbd18c2987cba06d51b0529f52bc3a6cdc33d3f4eab725104bd", size = 40102, upload-time = "2025-10-06T05:36:26.333Z" }, + { url = "https://files.pythonhosted.org/packages/2d/40/0832c31a37d60f60ed79e9dfb5a92e1e2af4f40a16a29abcc7992af9edff/frozenlist-1.8.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:8d92f1a84bb12d9e56f818b3a746f3efba93c1b63c8387a73dde655e1e42282a", size = 85717, upload-time = "2025-10-06T05:36:27.341Z" }, + { url = "https://files.pythonhosted.org/packages/30/ba/b0b3de23f40bc55a7057bd38434e25c34fa48e17f20ee273bbde5e0650f3/frozenlist-1.8.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:96153e77a591c8adc2ee805756c61f59fef4cf4073a9275ee86fe8cba41241f7", size = 49651, upload-time = "2025-10-06T05:36:28.855Z" }, + { url = "https://files.pythonhosted.org/packages/0c/ab/6e5080ee374f875296c4243c381bbdef97a9ac39c6e3ce1d5f7d42cb78d6/frozenlist-1.8.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:f21f00a91358803399890ab167098c131ec2ddd5f8f5fd5fe9c9f2c6fcd91e40", size = 49417, upload-time = "2025-10-06T05:36:29.877Z" }, + { url = "https://files.pythonhosted.org/packages/d5/4e/e4691508f9477ce67da2015d8c00acd751e6287739123113a9fca6f1604e/frozenlist-1.8.0-cp313-cp313-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:fb30f9626572a76dfe4293c7194a09fb1fe93ba94c7d4f720dfae3b646b45027", size = 234391, upload-time = "2025-10-06T05:36:31.301Z" }, + { url = "https://files.pythonhosted.org/packages/40/76/c202df58e3acdf12969a7895fd6f3bc016c642e6726aa63bd3025e0fc71c/frozenlist-1.8.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:eaa352d7047a31d87dafcacbabe89df0aa506abb5b1b85a2fb91bc3faa02d822", size = 233048, upload-time = "2025-10-06T05:36:32.531Z" }, + { url = "https://files.pythonhosted.org/packages/f9/c0/8746afb90f17b73ca5979c7a3958116e105ff796e718575175319b5bb4ce/frozenlist-1.8.0-cp313-cp313-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:03ae967b4e297f58f8c774c7eabcce57fe3c2434817d4385c50661845a058121", size = 226549, upload-time = "2025-10-06T05:36:33.706Z" }, + { url = "https://files.pythonhosted.org/packages/7e/eb/4c7eefc718ff72f9b6c4893291abaae5fbc0c82226a32dcd8ef4f7a5dbef/frozenlist-1.8.0-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:f6292f1de555ffcc675941d65fffffb0a5bcd992905015f85d0592201793e0e5", size = 239833, upload-time = "2025-10-06T05:36:34.947Z" }, + { url = "https://files.pythonhosted.org/packages/c2/4e/e5c02187cf704224f8b21bee886f3d713ca379535f16893233b9d672ea71/frozenlist-1.8.0-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:29548f9b5b5e3460ce7378144c3010363d8035cea44bc0bf02d57f5a685e084e", size = 245363, upload-time = "2025-10-06T05:36:36.534Z" }, + { url = "https://files.pythonhosted.org/packages/1f/96/cb85ec608464472e82ad37a17f844889c36100eed57bea094518bf270692/frozenlist-1.8.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:ec3cc8c5d4084591b4237c0a272cc4f50a5b03396a47d9caaf76f5d7b38a4f11", size = 229314, upload-time = "2025-10-06T05:36:38.582Z" }, + { url = "https://files.pythonhosted.org/packages/5d/6f/4ae69c550e4cee66b57887daeebe006fe985917c01d0fff9caab9883f6d0/frozenlist-1.8.0-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:517279f58009d0b1f2e7c1b130b377a349405da3f7621ed6bfae50b10adf20c1", size = 243365, upload-time = "2025-10-06T05:36:40.152Z" }, + { url = "https://files.pythonhosted.org/packages/7a/58/afd56de246cf11780a40a2c28dc7cbabbf06337cc8ddb1c780a2d97e88d8/frozenlist-1.8.0-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:db1e72ede2d0d7ccb213f218df6a078a9c09a7de257c2fe8fcef16d5925230b1", size = 237763, upload-time = "2025-10-06T05:36:41.355Z" }, + { url = "https://files.pythonhosted.org/packages/cb/36/cdfaf6ed42e2644740d4a10452d8e97fa1c062e2a8006e4b09f1b5fd7d63/frozenlist-1.8.0-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:b4dec9482a65c54a5044486847b8a66bf10c9cb4926d42927ec4e8fd5db7fed8", size = 240110, upload-time = "2025-10-06T05:36:42.716Z" }, + { url = "https://files.pythonhosted.org/packages/03/a8/9ea226fbefad669f11b52e864c55f0bd57d3c8d7eb07e9f2e9a0b39502e1/frozenlist-1.8.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:21900c48ae04d13d416f0e1e0c4d81f7931f73a9dfa0b7a8746fb2fe7dd970ed", size = 233717, upload-time = "2025-10-06T05:36:44.251Z" }, + { url = "https://files.pythonhosted.org/packages/1e/0b/1b5531611e83ba7d13ccc9988967ea1b51186af64c42b7a7af465dcc9568/frozenlist-1.8.0-cp313-cp313-win32.whl", hash = "sha256:8b7b94a067d1c504ee0b16def57ad5738701e4ba10cec90529f13fa03c833496", size = 39628, upload-time = "2025-10-06T05:36:45.423Z" }, + { url = "https://files.pythonhosted.org/packages/d8/cf/174c91dbc9cc49bc7b7aab74d8b734e974d1faa8f191c74af9b7e80848e6/frozenlist-1.8.0-cp313-cp313-win_amd64.whl", hash = "sha256:878be833caa6a3821caf85eb39c5ba92d28e85df26d57afb06b35b2efd937231", size = 43882, upload-time = "2025-10-06T05:36:46.796Z" }, + { url = "https://files.pythonhosted.org/packages/c1/17/502cd212cbfa96eb1388614fe39a3fc9ab87dbbe042b66f97acb57474834/frozenlist-1.8.0-cp313-cp313-win_arm64.whl", hash = "sha256:44389d135b3ff43ba8cc89ff7f51f5a0bb6b63d829c8300f79a2fe4fe61bcc62", size = 39676, upload-time = "2025-10-06T05:36:47.8Z" }, + { url = "https://files.pythonhosted.org/packages/d2/5c/3bbfaa920dfab09e76946a5d2833a7cbdf7b9b4a91c714666ac4855b88b4/frozenlist-1.8.0-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:e25ac20a2ef37e91c1b39938b591457666a0fa835c7783c3a8f33ea42870db94", size = 89235, upload-time = "2025-10-06T05:36:48.78Z" }, + { url = "https://files.pythonhosted.org/packages/d2/d6/f03961ef72166cec1687e84e8925838442b615bd0b8854b54923ce5b7b8a/frozenlist-1.8.0-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:07cdca25a91a4386d2e76ad992916a85038a9b97561bf7a3fd12d5d9ce31870c", size = 50742, upload-time = "2025-10-06T05:36:49.837Z" }, + { url = "https://files.pythonhosted.org/packages/1e/bb/a6d12b7ba4c3337667d0e421f7181c82dda448ce4e7ad7ecd249a16fa806/frozenlist-1.8.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:4e0c11f2cc6717e0a741f84a527c52616140741cd812a50422f83dc31749fb52", size = 51725, upload-time = "2025-10-06T05:36:50.851Z" }, + { url = "https://files.pythonhosted.org/packages/bc/71/d1fed0ffe2c2ccd70b43714c6cab0f4188f09f8a67a7914a6b46ee30f274/frozenlist-1.8.0-cp313-cp313t-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:b3210649ee28062ea6099cfda39e147fa1bc039583c8ee4481cb7811e2448c51", size = 284533, upload-time = "2025-10-06T05:36:51.898Z" }, + { url = "https://files.pythonhosted.org/packages/c9/1f/fb1685a7b009d89f9bf78a42d94461bc06581f6e718c39344754a5d9bada/frozenlist-1.8.0-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:581ef5194c48035a7de2aefc72ac6539823bb71508189e5de01d60c9dcd5fa65", size = 292506, upload-time = "2025-10-06T05:36:53.101Z" }, + { url = "https://files.pythonhosted.org/packages/e6/3b/b991fe1612703f7e0d05c0cf734c1b77aaf7c7d321df4572e8d36e7048c8/frozenlist-1.8.0-cp313-cp313t-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:3ef2d026f16a2b1866e1d86fc4e1291e1ed8a387b2c333809419a2f8b3a77b82", size = 274161, upload-time = "2025-10-06T05:36:54.309Z" }, + { url = "https://files.pythonhosted.org/packages/ca/ec/c5c618767bcdf66e88945ec0157d7f6c4a1322f1473392319b7a2501ded7/frozenlist-1.8.0-cp313-cp313t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:5500ef82073f599ac84d888e3a8c1f77ac831183244bfd7f11eaa0289fb30714", size = 294676, upload-time = "2025-10-06T05:36:55.566Z" }, + { url = "https://files.pythonhosted.org/packages/7c/ce/3934758637d8f8a88d11f0585d6495ef54b2044ed6ec84492a91fa3b27aa/frozenlist-1.8.0-cp313-cp313t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:50066c3997d0091c411a66e710f4e11752251e6d2d73d70d8d5d4c76442a199d", size = 300638, upload-time = "2025-10-06T05:36:56.758Z" }, + { url = "https://files.pythonhosted.org/packages/fc/4f/a7e4d0d467298f42de4b41cbc7ddaf19d3cfeabaf9ff97c20c6c7ee409f9/frozenlist-1.8.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:5c1c8e78426e59b3f8005e9b19f6ff46e5845895adbde20ece9218319eca6506", size = 283067, upload-time = "2025-10-06T05:36:57.965Z" }, + { url = "https://files.pythonhosted.org/packages/dc/48/c7b163063d55a83772b268e6d1affb960771b0e203b632cfe09522d67ea5/frozenlist-1.8.0-cp313-cp313t-musllinux_1_2_armv7l.whl", hash = "sha256:eefdba20de0d938cec6a89bd4d70f346a03108a19b9df4248d3cf0d88f1b0f51", size = 292101, upload-time = "2025-10-06T05:36:59.237Z" }, + { url = "https://files.pythonhosted.org/packages/9f/d0/2366d3c4ecdc2fd391e0afa6e11500bfba0ea772764d631bbf82f0136c9d/frozenlist-1.8.0-cp313-cp313t-musllinux_1_2_ppc64le.whl", hash = "sha256:cf253e0e1c3ceb4aaff6df637ce033ff6535fb8c70a764a8f46aafd3d6ab798e", size = 289901, upload-time = "2025-10-06T05:37:00.811Z" }, + { url = "https://files.pythonhosted.org/packages/b8/94/daff920e82c1b70e3618a2ac39fbc01ae3e2ff6124e80739ce5d71c9b920/frozenlist-1.8.0-cp313-cp313t-musllinux_1_2_s390x.whl", hash = "sha256:032efa2674356903cd0261c4317a561a6850f3ac864a63fc1583147fb05a79b0", size = 289395, upload-time = "2025-10-06T05:37:02.115Z" }, + { url = "https://files.pythonhosted.org/packages/e3/20/bba307ab4235a09fdcd3cc5508dbabd17c4634a1af4b96e0f69bfe551ebd/frozenlist-1.8.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:6da155091429aeba16851ecb10a9104a108bcd32f6c1642867eadaee401c1c41", size = 283659, upload-time = "2025-10-06T05:37:03.711Z" }, + { url = "https://files.pythonhosted.org/packages/fd/00/04ca1c3a7a124b6de4f8a9a17cc2fcad138b4608e7a3fc5877804b8715d7/frozenlist-1.8.0-cp313-cp313t-win32.whl", hash = "sha256:0f96534f8bfebc1a394209427d0f8a63d343c9779cda6fc25e8e121b5fd8555b", size = 43492, upload-time = "2025-10-06T05:37:04.915Z" }, + { url = "https://files.pythonhosted.org/packages/59/5e/c69f733a86a94ab10f68e496dc6b7e8bc078ebb415281d5698313e3af3a1/frozenlist-1.8.0-cp313-cp313t-win_amd64.whl", hash = "sha256:5d63a068f978fc69421fb0e6eb91a9603187527c86b7cd3f534a5b77a592b888", size = 48034, upload-time = "2025-10-06T05:37:06.343Z" }, + { url = "https://files.pythonhosted.org/packages/16/6c/be9d79775d8abe79b05fa6d23da99ad6e7763a1d080fbae7290b286093fd/frozenlist-1.8.0-cp313-cp313t-win_arm64.whl", hash = "sha256:bf0a7e10b077bf5fb9380ad3ae8ce20ef919a6ad93b4552896419ac7e1d8e042", size = 41749, upload-time = "2025-10-06T05:37:07.431Z" }, + { url = "https://files.pythonhosted.org/packages/f1/c8/85da824b7e7b9b6e7f7705b2ecaf9591ba6f79c1177f324c2735e41d36a2/frozenlist-1.8.0-cp314-cp314-macosx_10_13_universal2.whl", hash = "sha256:cee686f1f4cadeb2136007ddedd0aaf928ab95216e7691c63e50a8ec066336d0", size = 86127, upload-time = "2025-10-06T05:37:08.438Z" }, + { url = "https://files.pythonhosted.org/packages/8e/e8/a1185e236ec66c20afd72399522f142c3724c785789255202d27ae992818/frozenlist-1.8.0-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:119fb2a1bd47307e899c2fac7f28e85b9a543864df47aa7ec9d3c1b4545f096f", size = 49698, upload-time = "2025-10-06T05:37:09.48Z" }, + { url = "https://files.pythonhosted.org/packages/a1/93/72b1736d68f03fda5fdf0f2180fb6caaae3894f1b854d006ac61ecc727ee/frozenlist-1.8.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:4970ece02dbc8c3a92fcc5228e36a3e933a01a999f7094ff7c23fbd2beeaa67c", size = 49749, upload-time = "2025-10-06T05:37:10.569Z" }, + { url = "https://files.pythonhosted.org/packages/a7/b2/fabede9fafd976b991e9f1b9c8c873ed86f202889b864756f240ce6dd855/frozenlist-1.8.0-cp314-cp314-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:cba69cb73723c3f329622e34bdbf5ce1f80c21c290ff04256cff1cd3c2036ed2", size = 231298, upload-time = "2025-10-06T05:37:11.993Z" }, + { url = "https://files.pythonhosted.org/packages/3a/3b/d9b1e0b0eed36e70477ffb8360c49c85c8ca8ef9700a4e6711f39a6e8b45/frozenlist-1.8.0-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:778a11b15673f6f1df23d9586f83c4846c471a8af693a22e066508b77d201ec8", size = 232015, upload-time = "2025-10-06T05:37:13.194Z" }, + { url = "https://files.pythonhosted.org/packages/dc/94/be719d2766c1138148564a3960fc2c06eb688da592bdc25adcf856101be7/frozenlist-1.8.0-cp314-cp314-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:0325024fe97f94c41c08872db482cf8ac4800d80e79222c6b0b7b162d5b13686", size = 225038, upload-time = "2025-10-06T05:37:14.577Z" }, + { url = "https://files.pythonhosted.org/packages/e4/09/6712b6c5465f083f52f50cf74167b92d4ea2f50e46a9eea0523d658454ae/frozenlist-1.8.0-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:97260ff46b207a82a7567b581ab4190bd4dfa09f4db8a8b49d1a958f6aa4940e", size = 240130, upload-time = "2025-10-06T05:37:15.781Z" }, + { url = "https://files.pythonhosted.org/packages/f8/d4/cd065cdcf21550b54f3ce6a22e143ac9e4836ca42a0de1022da8498eac89/frozenlist-1.8.0-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:54b2077180eb7f83dd52c40b2750d0a9f175e06a42e3213ce047219de902717a", size = 242845, upload-time = "2025-10-06T05:37:17.037Z" }, + { url = "https://files.pythonhosted.org/packages/62/c3/f57a5c8c70cd1ead3d5d5f776f89d33110b1addae0ab010ad774d9a44fb9/frozenlist-1.8.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:2f05983daecab868a31e1da44462873306d3cbfd76d1f0b5b69c473d21dbb128", size = 229131, upload-time = "2025-10-06T05:37:18.221Z" }, + { url = "https://files.pythonhosted.org/packages/6c/52/232476fe9cb64f0742f3fde2b7d26c1dac18b6d62071c74d4ded55e0ef94/frozenlist-1.8.0-cp314-cp314-musllinux_1_2_armv7l.whl", hash = "sha256:33f48f51a446114bc5d251fb2954ab0164d5be02ad3382abcbfe07e2531d650f", size = 240542, upload-time = "2025-10-06T05:37:19.771Z" }, + { url = "https://files.pythonhosted.org/packages/5f/85/07bf3f5d0fb5414aee5f47d33c6f5c77bfe49aac680bfece33d4fdf6a246/frozenlist-1.8.0-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:154e55ec0655291b5dd1b8731c637ecdb50975a2ae70c606d100750a540082f7", size = 237308, upload-time = "2025-10-06T05:37:20.969Z" }, + { url = "https://files.pythonhosted.org/packages/11/99/ae3a33d5befd41ac0ca2cc7fd3aa707c9c324de2e89db0e0f45db9a64c26/frozenlist-1.8.0-cp314-cp314-musllinux_1_2_s390x.whl", hash = "sha256:4314debad13beb564b708b4a496020e5306c7333fa9a3ab90374169a20ffab30", size = 238210, upload-time = "2025-10-06T05:37:22.252Z" }, + { url = "https://files.pythonhosted.org/packages/b2/60/b1d2da22f4970e7a155f0adde9b1435712ece01b3cd45ba63702aea33938/frozenlist-1.8.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:073f8bf8becba60aa931eb3bc420b217bb7d5b8f4750e6f8b3be7f3da85d38b7", size = 231972, upload-time = "2025-10-06T05:37:23.5Z" }, + { url = "https://files.pythonhosted.org/packages/3f/ab/945b2f32de889993b9c9133216c068b7fcf257d8595a0ac420ac8677cab0/frozenlist-1.8.0-cp314-cp314-win32.whl", hash = "sha256:bac9c42ba2ac65ddc115d930c78d24ab8d4f465fd3fc473cdedfccadb9429806", size = 40536, upload-time = "2025-10-06T05:37:25.581Z" }, + { url = "https://files.pythonhosted.org/packages/59/ad/9caa9b9c836d9ad6f067157a531ac48b7d36499f5036d4141ce78c230b1b/frozenlist-1.8.0-cp314-cp314-win_amd64.whl", hash = "sha256:3e0761f4d1a44f1d1a47996511752cf3dcec5bbdd9cc2b4fe595caf97754b7a0", size = 44330, upload-time = "2025-10-06T05:37:26.928Z" }, + { url = "https://files.pythonhosted.org/packages/82/13/e6950121764f2676f43534c555249f57030150260aee9dcf7d64efda11dd/frozenlist-1.8.0-cp314-cp314-win_arm64.whl", hash = "sha256:d1eaff1d00c7751b7c6662e9c5ba6eb2c17a2306ba5e2a37f24ddf3cc953402b", size = 40627, upload-time = "2025-10-06T05:37:28.075Z" }, + { url = "https://files.pythonhosted.org/packages/c0/c7/43200656ecc4e02d3f8bc248df68256cd9572b3f0017f0a0c4e93440ae23/frozenlist-1.8.0-cp314-cp314t-macosx_10_13_universal2.whl", hash = "sha256:d3bb933317c52d7ea5004a1c442eef86f426886fba134ef8cf4226ea6ee1821d", size = 89238, upload-time = "2025-10-06T05:37:29.373Z" }, + { url = "https://files.pythonhosted.org/packages/d1/29/55c5f0689b9c0fb765055629f472c0de484dcaf0acee2f7707266ae3583c/frozenlist-1.8.0-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:8009897cdef112072f93a0efdce29cd819e717fd2f649ee3016efd3cd885a7ed", size = 50738, upload-time = "2025-10-06T05:37:30.792Z" }, + { url = "https://files.pythonhosted.org/packages/ba/7d/b7282a445956506fa11da8c2db7d276adcbf2b17d8bb8407a47685263f90/frozenlist-1.8.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:2c5dcbbc55383e5883246d11fd179782a9d07a986c40f49abe89ddf865913930", size = 51739, upload-time = "2025-10-06T05:37:32.127Z" }, + { url = "https://files.pythonhosted.org/packages/62/1c/3d8622e60d0b767a5510d1d3cf21065b9db874696a51ea6d7a43180a259c/frozenlist-1.8.0-cp314-cp314t-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:39ecbc32f1390387d2aa4f5a995e465e9e2f79ba3adcac92d68e3e0afae6657c", size = 284186, upload-time = "2025-10-06T05:37:33.21Z" }, + { url = "https://files.pythonhosted.org/packages/2d/14/aa36d5f85a89679a85a1d44cd7a6657e0b1c75f61e7cad987b203d2daca8/frozenlist-1.8.0-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:92db2bf818d5cc8d9c1f1fc56b897662e24ea5adb36ad1f1d82875bd64e03c24", size = 292196, upload-time = "2025-10-06T05:37:36.107Z" }, + { url = "https://files.pythonhosted.org/packages/05/23/6bde59eb55abd407d34f77d39a5126fb7b4f109a3f611d3929f14b700c66/frozenlist-1.8.0-cp314-cp314t-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:2dc43a022e555de94c3b68a4ef0b11c4f747d12c024a520c7101709a2144fb37", size = 273830, upload-time = "2025-10-06T05:37:37.663Z" }, + { url = "https://files.pythonhosted.org/packages/d2/3f/22cff331bfad7a8afa616289000ba793347fcd7bc275f3b28ecea2a27909/frozenlist-1.8.0-cp314-cp314t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:cb89a7f2de3602cfed448095bab3f178399646ab7c61454315089787df07733a", size = 294289, upload-time = "2025-10-06T05:37:39.261Z" }, + { url = "https://files.pythonhosted.org/packages/a4/89/5b057c799de4838b6c69aa82b79705f2027615e01be996d2486a69ca99c4/frozenlist-1.8.0-cp314-cp314t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:33139dc858c580ea50e7e60a1b0ea003efa1fd42e6ec7fdbad78fff65fad2fd2", size = 300318, upload-time = "2025-10-06T05:37:43.213Z" }, + { url = "https://files.pythonhosted.org/packages/30/de/2c22ab3eb2a8af6d69dc799e48455813bab3690c760de58e1bf43b36da3e/frozenlist-1.8.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:168c0969a329b416119507ba30b9ea13688fafffac1b7822802537569a1cb0ef", size = 282814, upload-time = "2025-10-06T05:37:45.337Z" }, + { url = "https://files.pythonhosted.org/packages/59/f7/970141a6a8dbd7f556d94977858cfb36fa9b66e0892c6dd780d2219d8cd8/frozenlist-1.8.0-cp314-cp314t-musllinux_1_2_armv7l.whl", hash = "sha256:28bd570e8e189d7f7b001966435f9dac6718324b5be2990ac496cf1ea9ddb7fe", size = 291762, upload-time = "2025-10-06T05:37:46.657Z" }, + { url = "https://files.pythonhosted.org/packages/c1/15/ca1adae83a719f82df9116d66f5bb28bb95557b3951903d39135620ef157/frozenlist-1.8.0-cp314-cp314t-musllinux_1_2_ppc64le.whl", hash = "sha256:b2a095d45c5d46e5e79ba1e5b9cb787f541a8dee0433836cea4b96a2c439dcd8", size = 289470, upload-time = "2025-10-06T05:37:47.946Z" }, + { url = "https://files.pythonhosted.org/packages/ac/83/dca6dc53bf657d371fbc88ddeb21b79891e747189c5de990b9dfff2ccba1/frozenlist-1.8.0-cp314-cp314t-musllinux_1_2_s390x.whl", hash = "sha256:eab8145831a0d56ec9c4139b6c3e594c7a83c2c8be25d5bcf2d86136a532287a", size = 289042, upload-time = "2025-10-06T05:37:49.499Z" }, + { url = "https://files.pythonhosted.org/packages/96/52/abddd34ca99be142f354398700536c5bd315880ed0a213812bc491cff5e4/frozenlist-1.8.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:974b28cf63cc99dfb2188d8d222bc6843656188164848c4f679e63dae4b0708e", size = 283148, upload-time = "2025-10-06T05:37:50.745Z" }, + { url = "https://files.pythonhosted.org/packages/af/d3/76bd4ed4317e7119c2b7f57c3f6934aba26d277acc6309f873341640e21f/frozenlist-1.8.0-cp314-cp314t-win32.whl", hash = "sha256:342c97bf697ac5480c0a7ec73cd700ecfa5a8a40ac923bd035484616efecc2df", size = 44676, upload-time = "2025-10-06T05:37:52.222Z" }, + { url = "https://files.pythonhosted.org/packages/89/76/c615883b7b521ead2944bb3480398cbb07e12b7b4e4d073d3752eb721558/frozenlist-1.8.0-cp314-cp314t-win_amd64.whl", hash = "sha256:06be8f67f39c8b1dc671f5d83aaefd3358ae5cdcf8314552c57e7ed3e6475bdd", size = 49451, upload-time = "2025-10-06T05:37:53.425Z" }, + { url = "https://files.pythonhosted.org/packages/e0/a3/5982da14e113d07b325230f95060e2169f5311b1017ea8af2a29b374c289/frozenlist-1.8.0-cp314-cp314t-win_arm64.whl", hash = "sha256:102e6314ca4da683dca92e3b1355490fed5f313b768500084fbe6371fddfdb79", size = 42507, upload-time = "2025-10-06T05:37:54.513Z" }, + { url = "https://files.pythonhosted.org/packages/9a/9a/e35b4a917281c0b8419d4207f4334c8e8c5dbf4f3f5f9ada73958d937dcc/frozenlist-1.8.0-py3-none-any.whl", hash = "sha256:0c18a16eab41e82c295618a77502e17b195883241c563b00f0aa5106fc4eaa0d", size = 13409, upload-time = "2025-10-06T05:38:16.721Z" }, +] + +[[package]] +name = "fsspec" +version = "2026.2.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/51/7c/f60c259dcbf4f0c47cc4ddb8f7720d2dcdc8888c8e5ad84c73ea4531cc5b/fsspec-2026.2.0.tar.gz", hash = "sha256:6544e34b16869f5aacd5b90bdf1a71acb37792ea3ddf6125ee69a22a53fb8bff", size = 313441, upload-time = "2026-02-05T21:50:53.743Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/e6/ab/fb21f4c939bb440104cc2b396d3be1d9b7a9fd3c6c2a53d98c45b3d7c954/fsspec-2026.2.0-py3-none-any.whl", hash = "sha256:98de475b5cb3bd66bedd5c4679e87b4fdfe1a3bf4d707b151b3c07e58c9a2437", size = 202505, upload-time = "2026-02-05T21:50:51.819Z" }, +] + +[package.optional-dependencies] +http = [ + { name = "aiohttp" }, +] + +[[package]] +name = "gigaam" +version = "0.1.0" +source = { editable = "." } +dependencies = [ + { name = "hydra-core" }, + { name = "numpy", version = "2.2.6", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, + { name = "numpy", version = "2.4.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, + { name = "omegaconf" }, + { name = "onnx" }, + { name = "onnxruntime" }, + { name = "sentencepiece" }, + { name = "torch" }, + { name = "torchaudio" }, + { name = "tqdm" }, +] + +[package.optional-dependencies] +longform = [ + { name = "numba" }, + { name = "pyannote-audio" }, + { name = "torch" }, + { name = "torchaudio" }, + { name = "torchcodec" }, +] +tests = [ + { name = "librosa" }, + { name = "pytest" }, + { name = "pytest-cov" }, + { name = "scipy", version = "1.15.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, + { name = "scipy", version = "1.17.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, + { name = "soundfile" }, +] + +[package.metadata] +requires-dist = [ + { name = "hydra-core", specifier = "==1.3.*" }, + { name = "librosa", marker = "extra == 'tests'" }, + { name = "numba", marker = "extra == 'longform'", specifier = ">=0.62" }, + { name = "numpy", specifier = "==2.*" }, + { name = "omegaconf", specifier = "==2.3.*" }, + { name = "onnx", specifier = "==1.19.*" }, + { name = "onnxruntime", specifier = "==1.23.*" }, + { name = "pyannote-audio", marker = "extra == 'longform'", specifier = "==4.0" }, + { name = "pytest", marker = "extra == 'tests'" }, + { name = "pytest-cov", marker = "extra == 'tests'" }, + { name = "scipy", marker = "extra == 'tests'" }, + { name = "sentencepiece" }, + { name = "soundfile", marker = "extra == 'tests'" }, + { name = "torch", specifier = ">=2.5,<2.9" }, + { name = "torch", marker = "extra == 'longform'", specifier = "==2.8.*" }, + { name = "torchaudio", specifier = ">=2.5,<2.9" }, + { name = "torchaudio", marker = "extra == 'longform'", specifier = "==2.8.*" }, + { name = "torchcodec", marker = "extra == 'longform'", specifier = "==0.7" }, + { name = "tqdm" }, +] +provides-extras = ["longform", "tests"] + +[[package]] +name = "googleapis-common-protos" +version = "1.73.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "protobuf" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/99/96/a0205167fa0154f4a542fd6925bdc63d039d88dab3588b875078107e6f06/googleapis_common_protos-1.73.0.tar.gz", hash = "sha256:778d07cd4fbeff84c6f7c72102f0daf98fa2bfd3fa8bea426edc545588da0b5a", size = 147323, upload-time = "2026-03-06T21:53:09.727Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/69/28/23eea8acd65972bbfe295ce3666b28ac510dfcb115fac089d3edb0feb00a/googleapis_common_protos-1.73.0-py3-none-any.whl", hash = "sha256:dfdaaa2e860f242046be561e6d6cb5c5f1541ae02cfbcb034371aadb2942b4e8", size = 297578, upload-time = "2026-03-06T21:52:33.933Z" }, +] + +[[package]] +name = "greenlet" +version = "3.3.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/a3/51/1664f6b78fc6ebbd98019a1fd730e83fa78f2db7058f72b1463d3612b8db/greenlet-3.3.2.tar.gz", hash = "sha256:2eaf067fc6d886931c7962e8c6bede15d2f01965560f3359b27c80bde2d151f2", size = 188267, upload-time = "2026-02-20T20:54:15.531Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/38/3f/9859f655d11901e7b2996c6e3d33e0caa9a1d4572c3bc61ed0faa64b2f4c/greenlet-3.3.2-cp310-cp310-macosx_11_0_universal2.whl", hash = "sha256:9bc885b89709d901859cf95179ec9f6bb67a3d2bb1f0e88456461bd4b7f8fd0d", size = 277747, upload-time = "2026-02-20T20:16:21.325Z" }, + { url = "https://files.pythonhosted.org/packages/fb/07/cb284a8b5c6498dbd7cba35d31380bb123d7dceaa7907f606c8ff5993cbf/greenlet-3.3.2-cp310-cp310-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b568183cf65b94919be4438dc28416b234b678c608cafac8874dfeeb2a9bbe13", size = 579202, upload-time = "2026-02-20T20:47:28.955Z" }, + { url = "https://files.pythonhosted.org/packages/ed/45/67922992b3a152f726163b19f890a85129a992f39607a2a53155de3448b8/greenlet-3.3.2-cp310-cp310-manylinux_2_24_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:527fec58dc9f90efd594b9b700662ed3fb2493c2122067ac9c740d98080a620e", size = 590620, upload-time = "2026-02-20T20:55:55.581Z" }, + { url = "https://files.pythonhosted.org/packages/03/5f/6e2a7d80c353587751ef3d44bb947f0565ec008a2e0927821c007e96d3a7/greenlet-3.3.2-cp310-cp310-manylinux_2_24_s390x.manylinux_2_28_s390x.whl", hash = "sha256:508c7f01f1791fbc8e011bd508f6794cb95397fdb198a46cb6635eb5b78d85a7", size = 602132, upload-time = "2026-02-20T21:02:43.261Z" }, + { url = "https://files.pythonhosted.org/packages/ad/55/9f1ebb5a825215fadcc0f7d5073f6e79e3007e3282b14b22d6aba7ca6cb8/greenlet-3.3.2-cp310-cp310-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:ad0c8917dd42a819fe77e6bdfcb84e3379c0de956469301d9fd36427a1ca501f", size = 591729, upload-time = "2026-02-20T20:20:58.395Z" }, + { url = "https://files.pythonhosted.org/packages/24/b4/21f5455773d37f94b866eb3cf5caed88d6cea6dd2c6e1f9c34f463cba3ec/greenlet-3.3.2-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:97245cc10e5515dbc8c3104b2928f7f02b6813002770cfaffaf9a6e0fc2b94ef", size = 1551946, upload-time = "2026-02-20T20:49:31.102Z" }, + { url = "https://files.pythonhosted.org/packages/00/68/91f061a926abead128fe1a87f0b453ccf07368666bd59ffa46016627a930/greenlet-3.3.2-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:8c1fdd7d1b309ff0da81d60a9688a8bd044ac4e18b250320a96fc68d31c209ca", size = 1618494, upload-time = "2026-02-20T20:21:06.541Z" }, + { url = "https://files.pythonhosted.org/packages/ac/78/f93e840cbaef8becaf6adafbaf1319682a6c2d8c1c20224267a5c6c8c891/greenlet-3.3.2-cp310-cp310-win_amd64.whl", hash = "sha256:5d0e35379f93a6d0222de929a25ab47b5eb35b5ef4721c2b9cbcc4036129ff1f", size = 230092, upload-time = "2026-02-20T20:17:09.379Z" }, + { url = "https://files.pythonhosted.org/packages/f3/47/16400cb42d18d7a6bb46f0626852c1718612e35dcb0dffa16bbaffdf5dd2/greenlet-3.3.2-cp311-cp311-macosx_11_0_universal2.whl", hash = "sha256:c56692189a7d1c7606cb794be0a8381470d95c57ce5be03fb3d0ef57c7853b86", size = 278890, upload-time = "2026-02-20T20:19:39.263Z" }, + { url = "https://files.pythonhosted.org/packages/a3/90/42762b77a5b6aa96cd8c0e80612663d39211e8ae8a6cd47c7f1249a66262/greenlet-3.3.2-cp311-cp311-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:1ebd458fa8285960f382841da585e02201b53a5ec2bac6b156fc623b5ce4499f", size = 581120, upload-time = "2026-02-20T20:47:30.161Z" }, + { url = "https://files.pythonhosted.org/packages/bf/6f/f3d64f4fa0a9c7b5c5b3c810ff1df614540d5aa7d519261b53fba55d4df9/greenlet-3.3.2-cp311-cp311-manylinux_2_24_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:a443358b33c4ec7b05b79a7c8b466f5d275025e750298be7340f8fc63dff2a55", size = 594363, upload-time = "2026-02-20T20:55:56.965Z" }, + { url = "https://files.pythonhosted.org/packages/9c/8b/1430a04657735a3f23116c2e0d5eb10220928846e4537a938a41b350bed6/greenlet-3.3.2-cp311-cp311-manylinux_2_24_s390x.manylinux_2_28_s390x.whl", hash = "sha256:4375a58e49522698d3e70cc0b801c19433021b5c37686f7ce9c65b0d5c8677d2", size = 605046, upload-time = "2026-02-20T21:02:45.234Z" }, + { url = "https://files.pythonhosted.org/packages/72/83/3e06a52aca8128bdd4dcd67e932b809e76a96ab8c232a8b025b2850264c5/greenlet-3.3.2-cp311-cp311-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:8e2cd90d413acbf5e77ae41e5d3c9b3ac1d011a756d7284d7f3f2b806bbd6358", size = 594156, upload-time = "2026-02-20T20:20:59.955Z" }, + { url = "https://files.pythonhosted.org/packages/70/79/0de5e62b873e08fe3cef7dbe84e5c4bc0e8ed0c7ff131bccb8405cd107c8/greenlet-3.3.2-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:442b6057453c8cb29b4fb36a2ac689382fc71112273726e2423f7f17dc73bf99", size = 1554649, upload-time = "2026-02-20T20:49:32.293Z" }, + { url = "https://files.pythonhosted.org/packages/5a/00/32d30dee8389dc36d42170a9c66217757289e2afb0de59a3565260f38373/greenlet-3.3.2-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:45abe8eb6339518180d5a7fa47fa01945414d7cca5ecb745346fc6a87d2750be", size = 1619472, upload-time = "2026-02-20T20:21:07.966Z" }, + { url = "https://files.pythonhosted.org/packages/f1/3a/efb2cf697fbccdf75b24e2c18025e7dfa54c4f31fab75c51d0fe79942cef/greenlet-3.3.2-cp311-cp311-win_amd64.whl", hash = "sha256:1e692b2dae4cc7077cbb11b47d258533b48c8fde69a33d0d8a82e2fe8d8531d5", size = 230389, upload-time = "2026-02-20T20:17:18.772Z" }, + { url = "https://files.pythonhosted.org/packages/e1/a1/65bbc059a43a7e2143ec4fc1f9e3f673e04f9c7b371a494a101422ac4fd5/greenlet-3.3.2-cp311-cp311-win_arm64.whl", hash = "sha256:02b0a8682aecd4d3c6c18edf52bc8e51eacdd75c8eac52a790a210b06aa295fd", size = 229645, upload-time = "2026-02-20T20:18:18.695Z" }, + { url = "https://files.pythonhosted.org/packages/ea/ab/1608e5a7578e62113506740b88066bf09888322a311cff602105e619bd87/greenlet-3.3.2-cp312-cp312-macosx_11_0_universal2.whl", hash = "sha256:ac8d61d4343b799d1e526db579833d72f23759c71e07181c2d2944e429eb09cd", size = 280358, upload-time = "2026-02-20T20:17:43.971Z" }, + { url = "https://files.pythonhosted.org/packages/a5/23/0eae412a4ade4e6623ff7626e38998cb9b11e9ff1ebacaa021e4e108ec15/greenlet-3.3.2-cp312-cp312-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:3ceec72030dae6ac0c8ed7591b96b70410a8be370b6a477b1dbc072856ad02bd", size = 601217, upload-time = "2026-02-20T20:47:31.462Z" }, + { url = "https://files.pythonhosted.org/packages/f8/16/5b1678a9c07098ecb9ab2dd159fafaf12e963293e61ee8d10ecb55273e5e/greenlet-3.3.2-cp312-cp312-manylinux_2_24_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:a2a5be83a45ce6188c045bcc44b0ee037d6a518978de9a5d97438548b953a1ac", size = 611792, upload-time = "2026-02-20T20:55:58.423Z" }, + { url = "https://files.pythonhosted.org/packages/5c/c5/cc09412a29e43406eba18d61c70baa936e299bc27e074e2be3806ed29098/greenlet-3.3.2-cp312-cp312-manylinux_2_24_s390x.manylinux_2_28_s390x.whl", hash = "sha256:ae9e21c84035c490506c17002f5c8ab25f980205c3e61ddb3a2a2a2e6c411fcb", size = 626250, upload-time = "2026-02-20T21:02:46.596Z" }, + { url = "https://files.pythonhosted.org/packages/50/1f/5155f55bd71cabd03765a4aac9ac446be129895271f73872c36ebd4b04b6/greenlet-3.3.2-cp312-cp312-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:43e99d1749147ac21dde49b99c9abffcbc1e2d55c67501465ef0930d6e78e070", size = 613875, upload-time = "2026-02-20T20:21:01.102Z" }, + { url = "https://files.pythonhosted.org/packages/fc/dd/845f249c3fcd69e32df80cdab059b4be8b766ef5830a3d0aa9d6cad55beb/greenlet-3.3.2-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:4c956a19350e2c37f2c48b336a3afb4bff120b36076d9d7fb68cb44e05d95b79", size = 1571467, upload-time = "2026-02-20T20:49:33.495Z" }, + { url = "https://files.pythonhosted.org/packages/2a/50/2649fe21fcc2b56659a452868e695634722a6655ba245d9f77f5656010bf/greenlet-3.3.2-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:6c6f8ba97d17a1e7d664151284cb3315fc5f8353e75221ed4324f84eb162b395", size = 1640001, upload-time = "2026-02-20T20:21:09.154Z" }, + { url = "https://files.pythonhosted.org/packages/9b/40/cc802e067d02af8b60b6771cea7d57e21ef5e6659912814babb42b864713/greenlet-3.3.2-cp312-cp312-win_amd64.whl", hash = "sha256:34308836d8370bddadb41f5a7ce96879b72e2fdfb4e87729330c6ab52376409f", size = 231081, upload-time = "2026-02-20T20:17:28.121Z" }, + { url = "https://files.pythonhosted.org/packages/58/2e/fe7f36ff1982d6b10a60d5e0740c759259a7d6d2e1dc41da6d96de32fff6/greenlet-3.3.2-cp312-cp312-win_arm64.whl", hash = "sha256:d3a62fa76a32b462a97198e4c9e99afb9ab375115e74e9a83ce180e7a496f643", size = 230331, upload-time = "2026-02-20T20:17:23.34Z" }, + { url = "https://files.pythonhosted.org/packages/ac/48/f8b875fa7dea7dd9b33245e37f065af59df6a25af2f9561efa8d822fde51/greenlet-3.3.2-cp313-cp313-macosx_11_0_universal2.whl", hash = "sha256:aa6ac98bdfd716a749b84d4034486863fd81c3abde9aa3cf8eff9127981a4ae4", size = 279120, upload-time = "2026-02-20T20:19:01.9Z" }, + { url = "https://files.pythonhosted.org/packages/49/8d/9771d03e7a8b1ee456511961e1b97a6d77ae1dea4a34a5b98eee706689d3/greenlet-3.3.2-cp313-cp313-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ab0c7e7901a00bc0a7284907273dc165b32e0d109a6713babd04471327ff7986", size = 603238, upload-time = "2026-02-20T20:47:32.873Z" }, + { url = "https://files.pythonhosted.org/packages/59/0e/4223c2bbb63cd5c97f28ffb2a8aee71bdfb30b323c35d409450f51b91e3e/greenlet-3.3.2-cp313-cp313-manylinux_2_24_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:d248d8c23c67d2291ffd47af766e2a3aa9fa1c6703155c099feb11f526c63a92", size = 614219, upload-time = "2026-02-20T20:55:59.817Z" }, + { url = "https://files.pythonhosted.org/packages/94/2b/4d012a69759ac9d77210b8bfb128bc621125f5b20fc398bce3940d036b1c/greenlet-3.3.2-cp313-cp313-manylinux_2_24_s390x.manylinux_2_28_s390x.whl", hash = "sha256:ccd21bb86944ca9be6d967cf7691e658e43417782bce90b5d2faeda0ff78a7dd", size = 628268, upload-time = "2026-02-20T21:02:48.024Z" }, + { url = "https://files.pythonhosted.org/packages/7a/34/259b28ea7a2a0c904b11cd36c79b8cef8019b26ee5dbe24e73b469dea347/greenlet-3.3.2-cp313-cp313-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:b6997d360a4e6a4e936c0f9625b1c20416b8a0ea18a8e19cabbefc712e7397ab", size = 616774, upload-time = "2026-02-20T20:21:02.454Z" }, + { url = "https://files.pythonhosted.org/packages/0a/03/996c2d1689d486a6e199cb0f1cf9e4aa940c500e01bdf201299d7d61fa69/greenlet-3.3.2-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:64970c33a50551c7c50491671265d8954046cb6e8e2999aacdd60e439b70418a", size = 1571277, upload-time = "2026-02-20T20:49:34.795Z" }, + { url = "https://files.pythonhosted.org/packages/d9/c4/2570fc07f34a39f2caf0bf9f24b0a1a0a47bc2e8e465b2c2424821389dfc/greenlet-3.3.2-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:1a9172f5bf6bd88e6ba5a84e0a68afeac9dc7b6b412b245dd64f52d83c81e55b", size = 1640455, upload-time = "2026-02-20T20:21:10.261Z" }, + { url = "https://files.pythonhosted.org/packages/91/39/5ef5aa23bc545aa0d31e1b9b55822b32c8da93ba657295840b6b34124009/greenlet-3.3.2-cp313-cp313-win_amd64.whl", hash = "sha256:a7945dd0eab63ded0a48e4dcade82939783c172290a7903ebde9e184333ca124", size = 230961, upload-time = "2026-02-20T20:16:58.461Z" }, + { url = "https://files.pythonhosted.org/packages/62/6b/a89f8456dcb06becff288f563618e9f20deed8dd29beea14f9a168aef64b/greenlet-3.3.2-cp313-cp313-win_arm64.whl", hash = "sha256:394ead29063ee3515b4e775216cb756b2e3b4a7e55ae8fd884f17fa579e6b327", size = 230221, upload-time = "2026-02-20T20:17:37.152Z" }, + { url = "https://files.pythonhosted.org/packages/3f/ae/8bffcbd373b57a5992cd077cbe8858fff39110480a9d50697091faea6f39/greenlet-3.3.2-cp314-cp314-macosx_11_0_universal2.whl", hash = "sha256:8d1658d7291f9859beed69a776c10822a0a799bc4bfe1bd4272bb60e62507dab", size = 279650, upload-time = "2026-02-20T20:18:00.783Z" }, + { url = "https://files.pythonhosted.org/packages/d1/c0/45f93f348fa49abf32ac8439938726c480bd96b2a3c6f4d949ec0124b69f/greenlet-3.3.2-cp314-cp314-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:18cb1b7337bca281915b3c5d5ae19f4e76d35e1df80f4ad3c1a7be91fadf1082", size = 650295, upload-time = "2026-02-20T20:47:34.036Z" }, + { url = "https://files.pythonhosted.org/packages/b3/de/dd7589b3f2b8372069ab3e4763ea5329940fc7ad9dcd3e272a37516d7c9b/greenlet-3.3.2-cp314-cp314-manylinux_2_24_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:c2e47408e8ce1c6f1ceea0dffcdf6ebb85cc09e55c7af407c99f1112016e45e9", size = 662163, upload-time = "2026-02-20T20:56:01.295Z" }, + { url = "https://files.pythonhosted.org/packages/cd/ac/85804f74f1ccea31ba518dcc8ee6f14c79f73fe36fa1beba38930806df09/greenlet-3.3.2-cp314-cp314-manylinux_2_24_s390x.manylinux_2_28_s390x.whl", hash = "sha256:e3cb43ce200f59483eb82949bf1835a99cf43d7571e900d7c8d5c62cdf25d2f9", size = 675371, upload-time = "2026-02-20T21:02:49.664Z" }, + { url = "https://files.pythonhosted.org/packages/d2/d8/09bfa816572a4d83bccd6750df1926f79158b1c36c5f73786e26dbe4ee38/greenlet-3.3.2-cp314-cp314-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:63d10328839d1973e5ba35e98cccbca71b232b14051fd957b6f8b6e8e80d0506", size = 664160, upload-time = "2026-02-20T20:21:04.015Z" }, + { url = "https://files.pythonhosted.org/packages/48/cf/56832f0c8255d27f6c35d41b5ec91168d74ec721d85f01a12131eec6b93c/greenlet-3.3.2-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:8e4ab3cfb02993c8cc248ea73d7dae6cec0253e9afa311c9b37e603ca9fad2ce", size = 1619181, upload-time = "2026-02-20T20:49:36.052Z" }, + { url = "https://files.pythonhosted.org/packages/0a/23/b90b60a4aabb4cec0796e55f25ffbfb579a907c3898cd2905c8918acaa16/greenlet-3.3.2-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:94ad81f0fd3c0c0681a018a976e5c2bd2ca2d9d94895f23e7bb1af4e8af4e2d5", size = 1687713, upload-time = "2026-02-20T20:21:11.684Z" }, + { url = "https://files.pythonhosted.org/packages/f3/ca/2101ca3d9223a1dc125140dbc063644dca76df6ff356531eb27bc267b446/greenlet-3.3.2-cp314-cp314-win_amd64.whl", hash = "sha256:8c4dd0f3997cf2512f7601563cc90dfb8957c0cff1e3a1b23991d4ea1776c492", size = 232034, upload-time = "2026-02-20T20:20:08.186Z" }, + { url = "https://files.pythonhosted.org/packages/f6/4a/ecf894e962a59dea60f04877eea0fd5724618da89f1867b28ee8b91e811f/greenlet-3.3.2-cp314-cp314-win_arm64.whl", hash = "sha256:cd6f9e2bbd46321ba3bbb4c8a15794d32960e3b0ae2cc4d49a1a53d314805d71", size = 231437, upload-time = "2026-02-20T20:18:59.722Z" }, + { url = "https://files.pythonhosted.org/packages/98/6d/8f2ef704e614bcf58ed43cfb8d87afa1c285e98194ab2cfad351bf04f81e/greenlet-3.3.2-cp314-cp314t-macosx_11_0_universal2.whl", hash = "sha256:e26e72bec7ab387ac80caa7496e0f908ff954f31065b0ffc1f8ecb1338b11b54", size = 286617, upload-time = "2026-02-20T20:19:29.856Z" }, + { url = "https://files.pythonhosted.org/packages/5e/0d/93894161d307c6ea237a43988f27eba0947b360b99ac5239ad3fe09f0b47/greenlet-3.3.2-cp314-cp314t-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:8b466dff7a4ffda6ca975979bab80bdadde979e29fc947ac3be4451428d8b0e4", size = 655189, upload-time = "2026-02-20T20:47:35.742Z" }, + { url = "https://files.pythonhosted.org/packages/f5/2c/d2d506ebd8abcb57386ec4f7ba20f4030cbe56eae541bc6fd6ef399c0b41/greenlet-3.3.2-cp314-cp314t-manylinux_2_24_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:b8bddc5b73c9720bea487b3bffdb1840fe4e3656fba3bd40aa1489e9f37877ff", size = 658225, upload-time = "2026-02-20T20:56:02.527Z" }, + { url = "https://files.pythonhosted.org/packages/d1/67/8197b7e7e602150938049d8e7f30de1660cfb87e4c8ee349b42b67bdb2e1/greenlet-3.3.2-cp314-cp314t-manylinux_2_24_s390x.manylinux_2_28_s390x.whl", hash = "sha256:59b3e2c40f6706b05a9cd299c836c6aa2378cabe25d021acd80f13abf81181cf", size = 666581, upload-time = "2026-02-20T21:02:51.526Z" }, + { url = "https://files.pythonhosted.org/packages/8e/30/3a09155fbf728673a1dea713572d2d31159f824a37c22da82127056c44e4/greenlet-3.3.2-cp314-cp314t-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:b26b0f4428b871a751968285a1ac9648944cea09807177ac639b030bddebcea4", size = 657907, upload-time = "2026-02-20T20:21:05.259Z" }, + { url = "https://files.pythonhosted.org/packages/f3/fd/d05a4b7acd0154ed758797f0a43b4c0962a843bedfe980115e842c5b2d08/greenlet-3.3.2-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:1fb39a11ee2e4d94be9a76671482be9398560955c9e568550de0224e41104727", size = 1618857, upload-time = "2026-02-20T20:49:37.309Z" }, + { url = "https://files.pythonhosted.org/packages/6f/e1/50ee92a5db521de8f35075b5eff060dd43d39ebd46c2181a2042f7070385/greenlet-3.3.2-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:20154044d9085151bc309e7689d6f7ba10027f8f5a8c0676ad398b951913d89e", size = 1680010, upload-time = "2026-02-20T20:21:13.427Z" }, + { url = "https://files.pythonhosted.org/packages/29/4b/45d90626aef8e65336bed690106d1382f7a43665e2249017e9527df8823b/greenlet-3.3.2-cp314-cp314t-win_amd64.whl", hash = "sha256:c04c5e06ec3e022cbfe2cd4a846e1d4e50087444f875ff6d2c2ad8445495cf1a", size = 237086, upload-time = "2026-02-20T20:20:45.786Z" }, +] + +[[package]] +name = "grpcio" +version = "1.78.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "typing-extensions" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/06/8a/3d098f35c143a89520e568e6539cc098fcd294495910e359889ce8741c84/grpcio-1.78.0.tar.gz", hash = "sha256:7382b95189546f375c174f53a5fa873cef91c4b8005faa05cc5b3beea9c4f1c5", size = 12852416, upload-time = "2026-02-06T09:57:18.093Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/5a/a8/690a085b4d1fe066130de97a87de32c45062cf2ecd218df9675add895550/grpcio-1.78.0-cp310-cp310-linux_armv7l.whl", hash = "sha256:7cc47943d524ee0096f973e1081cb8f4f17a4615f2116882a5f1416e4cfe92b5", size = 5946986, upload-time = "2026-02-06T09:54:34.043Z" }, + { url = "https://files.pythonhosted.org/packages/c7/1b/e5213c5c0ced9d2d92778d30529ad5bb2dcfb6c48c4e2d01b1f302d33d64/grpcio-1.78.0-cp310-cp310-macosx_11_0_universal2.whl", hash = "sha256:c3f293fdc675ccba4db5a561048cca627b5e7bd1c8a6973ffedabe7d116e22e2", size = 11816533, upload-time = "2026-02-06T09:54:37.04Z" }, + { url = "https://files.pythonhosted.org/packages/18/37/1ba32dccf0a324cc5ace744c44331e300b000a924bf14840f948c559ede7/grpcio-1.78.0-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:10a9a644b5dd5aec3b82b5b0b90d41c0fa94c85ef42cb42cf78a23291ddb5e7d", size = 6519964, upload-time = "2026-02-06T09:54:40.268Z" }, + { url = "https://files.pythonhosted.org/packages/ed/f5/c0e178721b818072f2e8b6fde13faaba942406c634009caf065121ce246b/grpcio-1.78.0-cp310-cp310-manylinux2014_i686.manylinux_2_17_i686.whl", hash = "sha256:4c5533d03a6cbd7f56acfc9cfb44ea64f63d29091e40e44010d34178d392d7eb", size = 7198058, upload-time = "2026-02-06T09:54:42.389Z" }, + { url = "https://files.pythonhosted.org/packages/5b/b2/40d43c91ae9cd667edc960135f9f08e58faa1576dc95af29f66ec912985f/grpcio-1.78.0-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:ff870aebe9a93a85283837801d35cd5f8814fe2ad01e606861a7fb47c762a2b7", size = 6727212, upload-time = "2026-02-06T09:54:44.91Z" }, + { url = "https://files.pythonhosted.org/packages/ed/88/9da42eed498f0efcfcd9156e48ae63c0cde3bea398a16c99fb5198c885b6/grpcio-1.78.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:391e93548644e6b2726f1bb84ed60048d4bcc424ce5e4af0843d28ca0b754fec", size = 7300845, upload-time = "2026-02-06T09:54:47.562Z" }, + { url = "https://files.pythonhosted.org/packages/23/3f/1c66b7b1b19a8828890e37868411a6e6925df5a9030bfa87ab318f34095d/grpcio-1.78.0-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:df2c8f3141f7cbd112a6ebbd760290b5849cda01884554f7c67acc14e7b1758a", size = 8284605, upload-time = "2026-02-06T09:54:50.475Z" }, + { url = "https://files.pythonhosted.org/packages/94/c4/ca1bd87394f7b033e88525384b4d1e269e8424ab441ea2fba1a0c5b50986/grpcio-1.78.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:bd8cb8026e5f5b50498a3c4f196f57f9db344dad829ffae16b82e4fdbaea2813", size = 7726672, upload-time = "2026-02-06T09:54:53.11Z" }, + { url = "https://files.pythonhosted.org/packages/41/09/f16e487d4cc65ccaf670f6ebdd1a17566b965c74fc3d93999d3b2821e052/grpcio-1.78.0-cp310-cp310-win32.whl", hash = "sha256:f8dff3d9777e5d2703a962ee5c286c239bf0ba173877cc68dc02c17d042e29de", size = 4076715, upload-time = "2026-02-06T09:54:55.549Z" }, + { url = "https://files.pythonhosted.org/packages/2a/32/4ce60d94e242725fd3bcc5673c04502c82a8e87b21ea411a63992dc39f8f/grpcio-1.78.0-cp310-cp310-win_amd64.whl", hash = "sha256:94f95cf5d532d0e717eed4fc1810e8e6eded04621342ec54c89a7c2f14b581bf", size = 4799157, upload-time = "2026-02-06T09:54:59.838Z" }, + { url = "https://files.pythonhosted.org/packages/86/c7/d0b780a29b0837bf4ca9580904dfb275c1fc321ded7897d620af7047ec57/grpcio-1.78.0-cp311-cp311-linux_armv7l.whl", hash = "sha256:2777b783f6c13b92bd7b716667452c329eefd646bfb3f2e9dabea2e05dbd34f6", size = 5951525, upload-time = "2026-02-06T09:55:01.989Z" }, + { url = "https://files.pythonhosted.org/packages/c5/b1/96920bf2ee61df85a9503cb6f733fe711c0ff321a5a697d791b075673281/grpcio-1.78.0-cp311-cp311-macosx_11_0_universal2.whl", hash = "sha256:9dca934f24c732750389ce49d638069c3892ad065df86cb465b3fa3012b70c9e", size = 11830418, upload-time = "2026-02-06T09:55:04.462Z" }, + { url = "https://files.pythonhosted.org/packages/83/0c/7c1528f098aeb75a97de2bae18c530f56959fb7ad6c882db45d9884d6edc/grpcio-1.78.0-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:459ab414b35f4496138d0ecd735fed26f1318af5e52cb1efbc82a09f0d5aa911", size = 6524477, upload-time = "2026-02-06T09:55:07.111Z" }, + { url = "https://files.pythonhosted.org/packages/8d/52/e7c1f3688f949058e19a011c4e0dec973da3d0ae5e033909677f967ae1f4/grpcio-1.78.0-cp311-cp311-manylinux2014_i686.manylinux_2_17_i686.whl", hash = "sha256:082653eecbdf290e6e3e2c276ab2c54b9e7c299e07f4221872380312d8cf395e", size = 7198266, upload-time = "2026-02-06T09:55:10.016Z" }, + { url = "https://files.pythonhosted.org/packages/e5/61/8ac32517c1e856677282c34f2e7812d6c328fa02b8f4067ab80e77fdc9c9/grpcio-1.78.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:85f93781028ec63f383f6bc90db785a016319c561cc11151fbb7b34e0d012303", size = 6730552, upload-time = "2026-02-06T09:55:12.207Z" }, + { url = "https://files.pythonhosted.org/packages/bd/98/b8ee0158199250220734f620b12e4a345955ac7329cfd908d0bf0fda77f0/grpcio-1.78.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:f12857d24d98441af6a1d5c87442d624411db486f7ba12550b07788f74b67b04", size = 7304296, upload-time = "2026-02-06T09:55:15.044Z" }, + { url = "https://files.pythonhosted.org/packages/bd/0f/7b72762e0d8840b58032a56fdbd02b78fc645b9fa993d71abf04edbc54f4/grpcio-1.78.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:5397fff416b79e4b284959642a4e95ac4b0f1ece82c9993658e0e477d40551ec", size = 8288298, upload-time = "2026-02-06T09:55:17.276Z" }, + { url = "https://files.pythonhosted.org/packages/24/ae/ae4ce56bc5bb5caa3a486d60f5f6083ac3469228faa734362487176c15c5/grpcio-1.78.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:fbe6e89c7ffb48518384068321621b2a69cab509f58e40e4399fdd378fa6d074", size = 7730953, upload-time = "2026-02-06T09:55:19.545Z" }, + { url = "https://files.pythonhosted.org/packages/b5/6e/8052e3a28eb6a820c372b2eb4b5e32d195c661e137d3eca94d534a4cfd8a/grpcio-1.78.0-cp311-cp311-win32.whl", hash = "sha256:6092beabe1966a3229f599d7088b38dfc8ffa1608b5b5cdda31e591e6500f856", size = 4076503, upload-time = "2026-02-06T09:55:21.521Z" }, + { url = "https://files.pythonhosted.org/packages/08/62/f22c98c5265dfad327251fa2f840b591b1df5f5e15d88b19c18c86965b27/grpcio-1.78.0-cp311-cp311-win_amd64.whl", hash = "sha256:1afa62af6e23f88629f2b29ec9e52ec7c65a7176c1e0a83292b93c76ca882558", size = 4799767, upload-time = "2026-02-06T09:55:24.107Z" }, + { url = "https://files.pythonhosted.org/packages/4e/f4/7384ed0178203d6074446b3c4f46c90a22ddf7ae0b3aee521627f54cfc2a/grpcio-1.78.0-cp312-cp312-linux_armv7l.whl", hash = "sha256:f9ab915a267fc47c7e88c387a3a28325b58c898e23d4995f765728f4e3dedb97", size = 5913985, upload-time = "2026-02-06T09:55:26.832Z" }, + { url = "https://files.pythonhosted.org/packages/81/ed/be1caa25f06594463f685b3790b320f18aea49b33166f4141bfdc2bfb236/grpcio-1.78.0-cp312-cp312-macosx_11_0_universal2.whl", hash = "sha256:3f8904a8165ab21e07e58bf3e30a73f4dffc7a1e0dbc32d51c61b5360d26f43e", size = 11811853, upload-time = "2026-02-06T09:55:29.224Z" }, + { url = "https://files.pythonhosted.org/packages/24/a7/f06d151afc4e64b7e3cc3e872d331d011c279aaab02831e40a81c691fb65/grpcio-1.78.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:859b13906ce098c0b493af92142ad051bf64c7870fa58a123911c88606714996", size = 6475766, upload-time = "2026-02-06T09:55:31.825Z" }, + { url = "https://files.pythonhosted.org/packages/8a/a8/4482922da832ec0082d0f2cc3a10976d84a7424707f25780b82814aafc0a/grpcio-1.78.0-cp312-cp312-manylinux2014_i686.manylinux_2_17_i686.whl", hash = "sha256:b2342d87af32790f934a79c3112641e7b27d63c261b8b4395350dad43eff1dc7", size = 7170027, upload-time = "2026-02-06T09:55:34.7Z" }, + { url = "https://files.pythonhosted.org/packages/54/bf/f4a3b9693e35d25b24b0b39fa46d7d8a3c439e0a3036c3451764678fec20/grpcio-1.78.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:12a771591ae40bc65ba67048fa52ef4f0e6db8279e595fd349f9dfddeef571f9", size = 6690766, upload-time = "2026-02-06T09:55:36.902Z" }, + { url = "https://files.pythonhosted.org/packages/c7/b9/521875265cc99fe5ad4c5a17010018085cae2810a928bf15ebe7d8bcd9cc/grpcio-1.78.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:185dea0d5260cbb2d224c507bf2a5444d5abbb1fa3594c1ed7e4c709d5eb8383", size = 7266161, upload-time = "2026-02-06T09:55:39.824Z" }, + { url = "https://files.pythonhosted.org/packages/05/86/296a82844fd40a4ad4a95f100b55044b4f817dece732bf686aea1a284147/grpcio-1.78.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:51b13f9aed9d59ee389ad666b8c2214cc87b5de258fa712f9ab05f922e3896c6", size = 8253303, upload-time = "2026-02-06T09:55:42.353Z" }, + { url = "https://files.pythonhosted.org/packages/f3/e4/ea3c0caf5468537f27ad5aab92b681ed7cc0ef5f8c9196d3fd42c8c2286b/grpcio-1.78.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:fd5f135b1bd58ab088930b3c613455796dfa0393626a6972663ccdda5b4ac6ce", size = 7698222, upload-time = "2026-02-06T09:55:44.629Z" }, + { url = "https://files.pythonhosted.org/packages/d7/47/7f05f81e4bb6b831e93271fb12fd52ba7b319b5402cbc101d588f435df00/grpcio-1.78.0-cp312-cp312-win32.whl", hash = "sha256:94309f498bcc07e5a7d16089ab984d42ad96af1d94b5a4eb966a266d9fcabf68", size = 4066123, upload-time = "2026-02-06T09:55:47.644Z" }, + { url = "https://files.pythonhosted.org/packages/ad/e7/d6914822c88aa2974dbbd10903d801a28a19ce9cd8bad7e694cbbcf61528/grpcio-1.78.0-cp312-cp312-win_amd64.whl", hash = "sha256:9566fe4ababbb2610c39190791e5b829869351d14369603702e890ef3ad2d06e", size = 4797657, upload-time = "2026-02-06T09:55:49.86Z" }, + { url = "https://files.pythonhosted.org/packages/05/a9/8f75894993895f361ed8636cd9237f4ab39ef87fd30db17467235ed1c045/grpcio-1.78.0-cp313-cp313-linux_armv7l.whl", hash = "sha256:ce3a90455492bf8bfa38e56fbbe1dbd4f872a3d8eeaf7337dc3b1c8aa28c271b", size = 5920143, upload-time = "2026-02-06T09:55:52.035Z" }, + { url = "https://files.pythonhosted.org/packages/55/06/0b78408e938ac424100100fd081189451b472236e8a3a1f6500390dc4954/grpcio-1.78.0-cp313-cp313-macosx_11_0_universal2.whl", hash = "sha256:2bf5e2e163b356978b23652c4818ce4759d40f4712ee9ec5a83c4be6f8c23a3a", size = 11803926, upload-time = "2026-02-06T09:55:55.494Z" }, + { url = "https://files.pythonhosted.org/packages/88/93/b59fe7832ff6ae3c78b813ea43dac60e295fa03606d14d89d2e0ec29f4f3/grpcio-1.78.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:8f2ac84905d12918e4e55a16da17939eb63e433dc11b677267c35568aa63fc84", size = 6478628, upload-time = "2026-02-06T09:55:58.533Z" }, + { url = "https://files.pythonhosted.org/packages/ed/df/e67e3734527f9926b7d9c0dde6cd998d1d26850c3ed8eeec81297967ac67/grpcio-1.78.0-cp313-cp313-manylinux2014_i686.manylinux_2_17_i686.whl", hash = "sha256:b58f37edab4a3881bc6c9bca52670610e0c9ca14e2ea3cf9debf185b870457fb", size = 7173574, upload-time = "2026-02-06T09:56:01.786Z" }, + { url = "https://files.pythonhosted.org/packages/a6/62/cc03fffb07bfba982a9ec097b164e8835546980aec25ecfa5f9c1a47e022/grpcio-1.78.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:735e38e176a88ce41840c21bb49098ab66177c64c82426e24e0082500cc68af5", size = 6692639, upload-time = "2026-02-06T09:56:04.529Z" }, + { url = "https://files.pythonhosted.org/packages/bf/9a/289c32e301b85bdb67d7ec68b752155e674ee3ba2173a1858f118e399ef3/grpcio-1.78.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:2045397e63a7a0ee7957c25f7dbb36ddc110e0cfb418403d110c0a7a68a844e9", size = 7268838, upload-time = "2026-02-06T09:56:08.397Z" }, + { url = "https://files.pythonhosted.org/packages/0e/79/1be93f32add280461fa4773880196572563e9c8510861ac2da0ea0f892b6/grpcio-1.78.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:a9f136fbafe7ccf4ac7e8e0c28b31066e810be52d6e344ef954a3a70234e1702", size = 8251878, upload-time = "2026-02-06T09:56:10.914Z" }, + { url = "https://files.pythonhosted.org/packages/65/65/793f8e95296ab92e4164593674ae6291b204bb5f67f9d4a711489cd30ffa/grpcio-1.78.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:748b6138585379c737adc08aeffd21222abbda1a86a0dca2a39682feb9196c20", size = 7695412, upload-time = "2026-02-06T09:56:13.593Z" }, + { url = "https://files.pythonhosted.org/packages/1c/9f/1e233fe697ecc82845942c2822ed06bb522e70d6771c28d5528e4c50f6a4/grpcio-1.78.0-cp313-cp313-win32.whl", hash = "sha256:271c73e6e5676afe4fc52907686670c7cea22ab2310b76a59b678403ed40d670", size = 4064899, upload-time = "2026-02-06T09:56:15.601Z" }, + { url = "https://files.pythonhosted.org/packages/4d/27/d86b89e36de8a951501fb06a0f38df19853210f341d0b28f83f4aa0ffa08/grpcio-1.78.0-cp313-cp313-win_amd64.whl", hash = "sha256:f2d4e43ee362adfc05994ed479334d5a451ab7bc3f3fee1b796b8ca66895acb4", size = 4797393, upload-time = "2026-02-06T09:56:17.882Z" }, + { url = "https://files.pythonhosted.org/packages/29/f2/b56e43e3c968bfe822fa6ce5bca10d5c723aa40875b48791ce1029bb78c7/grpcio-1.78.0-cp314-cp314-linux_armv7l.whl", hash = "sha256:e87cbc002b6f440482b3519e36e1313eb5443e9e9e73d6a52d43bd2004fcfd8e", size = 5920591, upload-time = "2026-02-06T09:56:20.758Z" }, + { url = "https://files.pythonhosted.org/packages/5d/81/1f3b65bd30c334167bfa8b0d23300a44e2725ce39bba5b76a2460d85f745/grpcio-1.78.0-cp314-cp314-macosx_11_0_universal2.whl", hash = "sha256:c41bc64626db62e72afec66b0c8a0da76491510015417c127bfc53b2fe6d7f7f", size = 11813685, upload-time = "2026-02-06T09:56:24.315Z" }, + { url = "https://files.pythonhosted.org/packages/0e/1c/bbe2f8216a5bd3036119c544d63c2e592bdf4a8ec6e4a1867592f4586b26/grpcio-1.78.0-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:8dfffba826efcf366b1e3ccc37e67afe676f290e13a3b48d31a46739f80a8724", size = 6487803, upload-time = "2026-02-06T09:56:27.367Z" }, + { url = "https://files.pythonhosted.org/packages/16/5c/a6b2419723ea7ddce6308259a55e8e7593d88464ce8db9f4aa857aba96fa/grpcio-1.78.0-cp314-cp314-manylinux2014_i686.manylinux_2_17_i686.whl", hash = "sha256:74be1268d1439eaaf552c698cdb11cd594f0c49295ae6bb72c34ee31abbe611b", size = 7173206, upload-time = "2026-02-06T09:56:29.876Z" }, + { url = "https://files.pythonhosted.org/packages/df/1e/b8801345629a415ea7e26c83d75eb5dbe91b07ffe5210cc517348a8d4218/grpcio-1.78.0-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:be63c88b32e6c0f1429f1398ca5c09bc64b0d80950c8bb7807d7d7fb36fb84c7", size = 6693826, upload-time = "2026-02-06T09:56:32.305Z" }, + { url = "https://files.pythonhosted.org/packages/34/84/0de28eac0377742679a510784f049738a80424b17287739fc47d63c2439e/grpcio-1.78.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:3c586ac70e855c721bda8f548d38c3ca66ac791dc49b66a8281a1f99db85e452", size = 7277897, upload-time = "2026-02-06T09:56:34.915Z" }, + { url = "https://files.pythonhosted.org/packages/ca/9c/ad8685cfe20559a9edb66f735afdcb2b7d3de69b13666fdfc542e1916ebd/grpcio-1.78.0-cp314-cp314-musllinux_1_2_i686.whl", hash = "sha256:35eb275bf1751d2ffbd8f57cdbc46058e857cf3971041521b78b7db94bdaf127", size = 8252404, upload-time = "2026-02-06T09:56:37.553Z" }, + { url = "https://files.pythonhosted.org/packages/3c/05/33a7a4985586f27e1de4803887c417ec7ced145ebd069bc38a9607059e2b/grpcio-1.78.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:207db540302c884b8848036b80db352a832b99dfdf41db1eb554c2c2c7800f65", size = 7696837, upload-time = "2026-02-06T09:56:40.173Z" }, + { url = "https://files.pythonhosted.org/packages/73/77/7382241caf88729b106e49e7d18e3116216c778e6a7e833826eb96de22f7/grpcio-1.78.0-cp314-cp314-win32.whl", hash = "sha256:57bab6deef2f4f1ca76cc04565df38dc5713ae6c17de690721bdf30cb1e0545c", size = 4142439, upload-time = "2026-02-06T09:56:43.258Z" }, + { url = "https://files.pythonhosted.org/packages/48/b2/b096ccce418882fbfda4f7496f9357aaa9a5af1896a9a7f60d9f2b275a06/grpcio-1.78.0-cp314-cp314-win_amd64.whl", hash = "sha256:dce09d6116df20a96acfdbf85e4866258c3758180e8c49845d6ba8248b6d0bbb", size = 4929852, upload-time = "2026-02-06T09:56:45.885Z" }, +] + +[[package]] +name = "h11" +version = "0.16.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/01/ee/02a2c011bdab74c6fb3c75474d40b3052059d95df7e73351460c8588d963/h11-0.16.0.tar.gz", hash = "sha256:4e35b956cf45792e4caa5885e69fba00bdbc6ffafbfa020300e549b208ee5ff1", size = 101250, upload-time = "2025-04-24T03:35:25.427Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/04/4b/29cac41a4d98d144bf5f6d33995617b185d14b22401f75ca86f384e87ff1/h11-0.16.0-py3-none-any.whl", hash = "sha256:63cf8bbe7522de3bf65932fda1d9c2772064ffb3dae62d55932da54b31cb6c86", size = 37515, upload-time = "2025-04-24T03:35:24.344Z" }, +] + +[[package]] +name = "hf-xet" +version = "1.4.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/59/3f/c4000b25702612ccbae00e941c53f3564067f1c6e94f2f423be1d0205d09/hf_xet-1.4.1.tar.gz", hash = "sha256:e16cf5b6dadf95f80b3138b3af778f5f1b4ae9c4738241f0da59c219b281d29f", size = 672345, upload-time = "2026-03-12T22:30:37.039Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/00/7d/da7b1fbed1e9951b52117122aca06f8871329fe9e6b3fcfdf7394dbbb85b/hf_xet-1.4.1-cp313-cp313t-macosx_10_12_x86_64.whl", hash = "sha256:6859dfca607b852016aca9aa774da8f27f59663542eab008289300460c903c8e", size = 3796337, upload-time = "2026-03-12T22:30:16.734Z" }, + { url = "https://files.pythonhosted.org/packages/c8/e3/435380282215214acd499995f36ccdb6e4794966e8968e625b33915a3481/hf_xet-1.4.1-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:ec3ccfc640974a8db27e9ddcb2e52aefa9229d7807b6f2b50e4415547c1ff64f", size = 3555870, upload-time = "2026-03-12T22:30:14.766Z" }, + { url = "https://files.pythonhosted.org/packages/e8/98/1eab277d4307bcad51dfd50e5fc7bec97b929e7a9015d81987b16f2b7774/hf_xet-1.4.1-cp313-cp313t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:1ee3e60fe0c4071a84e4ddae2921518850302cc18965f6d8b770292083690384", size = 4211746, upload-time = "2026-03-12T22:30:04.983Z" }, + { url = "https://files.pythonhosted.org/packages/10/d0/435b837cbc1cb5b5e2ab2d88bc0d3487268fd7b900f71445a8c81714c411/hf_xet-1.4.1-cp313-cp313t-manylinux_2_28_aarch64.whl", hash = "sha256:30a2d968ba96a511d3d67a18a0340b2bd8c1c085c6464931cc576a05ccb78cf0", size = 3988671, upload-time = "2026-03-12T22:30:03.118Z" }, + { url = "https://files.pythonhosted.org/packages/e1/ed/6a1de8bc161187355aebf87921f702592fe29992b4bbda81fe5376e6c3fe/hf_xet-1.4.1-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:5739118c76d837d09ba246bfdb91bd076cf336fed9f49eb80bc7e4f1e323e9e9", size = 4188546, upload-time = "2026-03-12T22:30:25.914Z" }, + { url = "https://files.pythonhosted.org/packages/13/6e/723a2a04866697e047d60535b60c9a0f7186fb68466c1964f870fca1757e/hf_xet-1.4.1-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:d89cbc44931201cb67ad55aeedb14b371bed00e26af84c979effd3b41e6576e2", size = 4428262, upload-time = "2026-03-12T22:30:27.772Z" }, + { url = "https://files.pythonhosted.org/packages/3b/99/263744ecf4caaea039338d8ab79e2db7ec0c4963c1ea2493ca4b6e0f8d3e/hf_xet-1.4.1-cp313-cp313t-win_amd64.whl", hash = "sha256:7275d117da0fbef825dba05b503ea7ab40e90bdaa76bdc644d7bbc94364dd9ec", size = 3665375, upload-time = "2026-03-12T22:30:41.314Z" }, + { url = "https://files.pythonhosted.org/packages/0f/d1/e28271aa87058698f8e9377d905e619554738b894da98c149ca145790014/hf_xet-1.4.1-cp313-cp313t-win_arm64.whl", hash = "sha256:c16731cc4b8cc5e3b9e5e9103f178e3fbef6f1cc78d6d7f89c7e8192174e1af1", size = 3528871, upload-time = "2026-03-12T22:30:38.889Z" }, + { url = "https://files.pythonhosted.org/packages/88/aa/666146eac9e4f1f2e3a293feb22d8596df1469e7c01d16839f16eb2fc8ed/hf_xet-1.4.1-cp314-cp314t-macosx_10_12_x86_64.whl", hash = "sha256:f1e166b3eb3fb6c188245ccc21106833c305ffa56a538da82f63498269694810", size = 3796578, upload-time = "2026-03-12T22:30:24.159Z" }, + { url = "https://files.pythonhosted.org/packages/73/ed/716ef4fdfc66e3d2c68efba1051d5971e81d1f70dbfa6ac2513d2fa28720/hf_xet-1.4.1-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:54672d32a08e38c405c8e246fd756c7fe349b65649ecc3eb26c8a97c9d1e60b5", size = 3555602, upload-time = "2026-03-12T22:30:22.461Z" }, + { url = "https://files.pythonhosted.org/packages/ac/d9/2ab1648b854095a3cd09e2e0005b3f127ea376d6628a48a1bb5dfd8dda50/hf_xet-1.4.1-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:7293e7763602d06f053f22fb88a98e0549d24c0eb3119da99e89965b78de1f62", size = 4211996, upload-time = "2026-03-12T22:30:12.862Z" }, + { url = "https://files.pythonhosted.org/packages/26/4c/e4ed15bfc1259dcaa240447d4f6f558c84770e158b5458f97fcb0fa87cf4/hf_xet-1.4.1-cp314-cp314t-manylinux_2_28_aarch64.whl", hash = "sha256:bf6ebb0a597344b71c572f04700054b59ceeb2937fb59a6fdd575462718b3897", size = 3987668, upload-time = "2026-03-12T22:30:10.861Z" }, + { url = "https://files.pythonhosted.org/packages/e3/2f/62be2b80164f0d5de16e120e658600c96dcbb7818ee47cfe2cddb7de2904/hf_xet-1.4.1-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:9c58eb27344d7c0e2d4eecc66268779289bceb7916193463a86970796b4547ff", size = 4188488, upload-time = "2026-03-12T22:30:33.598Z" }, + { url = "https://files.pythonhosted.org/packages/d4/ea/048fd429b34cbf397e26a06e8720486cd615cde8e90055ab8d61c98a078a/hf_xet-1.4.1-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:d25f98d13c8bc3aac0a1e79d86f0bbbb0f0d82697adab7dd3ebf12e5ce53f6ea", size = 4428144, upload-time = "2026-03-12T22:30:35.504Z" }, + { url = "https://files.pythonhosted.org/packages/33/19/1d3a0a7b5a55af7dcfdccc1e1bba1381d84f7ec7e81e22f701f95b71cec2/hf_xet-1.4.1-cp314-cp314t-win_amd64.whl", hash = "sha256:9154171d0aaedd82476bbf47efcc171ed473b65f9e11d71e99728921737becac", size = 3665953, upload-time = "2026-03-12T22:30:48.946Z" }, + { url = "https://files.pythonhosted.org/packages/92/5f/257845b1fa1e783f2fdc02dc4e839a83fbeebff4428d09d306a166169855/hf_xet-1.4.1-cp314-cp314t-win_arm64.whl", hash = "sha256:dfc754b80edb3741e5675d36c3883f1c12461cb0d99d2fe37f1e211e21df1700", size = 3529088, upload-time = "2026-03-12T22:30:46.853Z" }, + { url = "https://files.pythonhosted.org/packages/5b/9d/57d7af8c30a01da69ec4e0f26b43937345f7f0ee258adecde1652094536e/hf_xet-1.4.1-cp37-abi3-macosx_10_12_x86_64.whl", hash = "sha256:01e1fa399a43b057d8a9117def7a30e04b12aa4563c81dc7343854b95734c8ab", size = 3800407, upload-time = "2026-03-12T22:30:20.37Z" }, + { url = "https://files.pythonhosted.org/packages/b1/be/c8b5891e8af1c28291ee817fec67a5bb7338571ec0670966f204c05c8ea6/hf_xet-1.4.1-cp37-abi3-macosx_11_0_arm64.whl", hash = "sha256:1f0ee88aff43b78039a0661a2ea28d22c6f68fcce3dae44984ac7953e3930e25", size = 3559643, upload-time = "2026-03-12T22:30:18.469Z" }, + { url = "https://files.pythonhosted.org/packages/44/2a/0581e23eb6fad8f05cef25fc545d4185037d2b4b6a5ea218f034fe7a240d/hf_xet-1.4.1-cp37-abi3-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:fb73af369d2fb4fbb67df8d56ac40c3f3cf09d2bd962294220a3038dd6359524", size = 4217475, upload-time = "2026-03-12T22:30:09.111Z" }, + { url = "https://files.pythonhosted.org/packages/93/db/8e16d9ba175cb49292b2eef668be26cf7bf547114ed0886f366c62ba4675/hf_xet-1.4.1-cp37-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:ac4ab0c4eabe2e25b2ec5f807f3014496169b1b6dda761cdb52e339866ba8cca", size = 3993259, upload-time = "2026-03-12T22:30:06.95Z" }, + { url = "https://files.pythonhosted.org/packages/84/20/b0cf23af484a535d0cb22baa118844b59d2e7234cabadb59884aefeec8f6/hf_xet-1.4.1-cp37-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:4afe580557e2bb264989cf954bb7c37398db4f1ec2512ca4804993be8031241f", size = 4194024, upload-time = "2026-03-12T22:30:30.018Z" }, + { url = "https://files.pythonhosted.org/packages/20/35/7de82cc7a4ac987748781b9cb4ce8572e635f3350a24cec519b14a8855d7/hf_xet-1.4.1-cp37-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:7d0eb889e9c36870b12a4fea9dc9d26782edf2fb0af030a63cdc9bf0f416157c", size = 4432709, upload-time = "2026-03-12T22:30:31.803Z" }, + { url = "https://files.pythonhosted.org/packages/5b/17/9d67808070f6b9884bb1f565224e6f9bc35cb9f4b2375cc70a9f0d171ff8/hf_xet-1.4.1-cp37-abi3-win_amd64.whl", hash = "sha256:850d920b4fde0fc0e6ed3e00e4dcb7a9d93cd8847f4d054c76cb98b3256db307", size = 3670976, upload-time = "2026-03-12T22:30:45.079Z" }, + { url = "https://files.pythonhosted.org/packages/67/7e/fc236b968a40598ff4f2e15a49912813b368f77e7a1920a9911da85eec52/hf_xet-1.4.1-cp37-abi3-win_arm64.whl", hash = "sha256:803bc82799412e3dfd595831faae443ce311e107fde8eedcc4a260011f040635", size = 3533708, upload-time = "2026-03-12T22:30:43.264Z" }, +] + +[[package]] +name = "httpcore" +version = "1.0.9" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "certifi" }, + { name = "h11" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/06/94/82699a10bca87a5556c9c59b5963f2d039dbd239f25bc2a63907a05a14cb/httpcore-1.0.9.tar.gz", hash = "sha256:6e34463af53fd2ab5d807f399a9b45ea31c3dfa2276f15a2c3f00afff6e176e8", size = 85484, upload-time = "2025-04-24T22:06:22.219Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/7e/f5/f66802a942d491edb555dd61e3a9961140fd64c90bce1eafd741609d334d/httpcore-1.0.9-py3-none-any.whl", hash = "sha256:2d400746a40668fc9dec9810239072b40b4484b640a8c38fd654a024c7a1bf55", size = 78784, upload-time = "2025-04-24T22:06:20.566Z" }, +] + +[[package]] +name = "httpx" +version = "0.28.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "anyio" }, + { name = "certifi" }, + { name = "httpcore" }, + { name = "idna" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/b1/df/48c586a5fe32a0f01324ee087459e112ebb7224f646c0b5023f5e79e9956/httpx-0.28.1.tar.gz", hash = "sha256:75e98c5f16b0f35b567856f597f06ff2270a374470a5c2392242528e3e3e42fc", size = 141406, upload-time = "2024-12-06T15:37:23.222Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/2a/39/e50c7c3a983047577ee07d2a9e53faf5a69493943ec3f6a384bdc792deb2/httpx-0.28.1-py3-none-any.whl", hash = "sha256:d909fcccc110f8c7faf814ca82a9a4d816bc5a6dbfea25d6591d6985b8ba59ad", size = 73517, upload-time = "2024-12-06T15:37:21.509Z" }, +] + +[[package]] +name = "huggingface-hub" +version = "1.6.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "filelock" }, + { name = "fsspec" }, + { name = "hf-xet", marker = "platform_machine == 'AMD64' or platform_machine == 'aarch64' or platform_machine == 'amd64' or platform_machine == 'arm64' or platform_machine == 'x86_64'" }, + { name = "httpx" }, + { name = "packaging" }, + { name = "pyyaml" }, + { name = "tqdm" }, + { name = "typer" }, + { name = "typing-extensions" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/d5/7a/304cec37112382c4fe29a43bcb0d5891f922785d18745883d2aa4eb74e4b/huggingface_hub-1.6.0.tar.gz", hash = "sha256:d931ddad8ba8dfc1e816bf254810eb6f38e5c32f60d4184b5885662a3b167325", size = 717071, upload-time = "2026-03-06T14:19:18.524Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/92/e3/e3a44f54c8e2f28983fcf07f13d4260b37bd6a0d3a081041bc60b91d230e/huggingface_hub-1.6.0-py3-none-any.whl", hash = "sha256:ef40e2d5cb85e48b2c067020fa5142168342d5108a1b267478ed384ecbf18961", size = 612874, upload-time = "2026-03-06T14:19:16.844Z" }, +] + +[[package]] +name = "humanfriendly" +version = "10.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pyreadline3", marker = "sys_platform == 'win32'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/cc/3f/2c29224acb2e2df4d2046e4c73ee2662023c58ff5b113c4c1adac0886c43/humanfriendly-10.0.tar.gz", hash = "sha256:6b0b831ce8f15f7300721aa49829fc4e83921a9a301cc7f606be6686a2288ddc", size = 360702, upload-time = "2021-09-17T21:40:43.31Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/f0/0f/310fb31e39e2d734ccaa2c0fb981ee41f7bd5056ce9bc29b2248bd569169/humanfriendly-10.0-py2.py3-none-any.whl", hash = "sha256:1697e1a8a8f550fd43c2865cd84542fc175a61dcb779b6fee18cf6b6ccba1477", size = 86794, upload-time = "2021-09-17T21:40:39.897Z" }, +] + +[[package]] +name = "hydra-core" +version = "1.3.2" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "antlr4-python3-runtime" }, + { name = "omegaconf" }, + { name = "packaging" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/6d/8e/07e42bc434a847154083b315779b0a81d567154504624e181caf2c71cd98/hydra-core-1.3.2.tar.gz", hash = "sha256:8a878ed67216997c3e9d88a8e72e7b4767e81af37afb4ea3334b269a4390a824", size = 3263494, upload-time = "2023-02-23T18:33:43.03Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/c6/50/e0edd38dcd63fb26a8547f13d28f7a008bc4a3fd4eb4ff030673f22ad41a/hydra_core-1.3.2-py3-none-any.whl", hash = "sha256:fa0238a9e31df3373b35b0bfb672c34cc92718d21f81311d8996a16de1141d8b", size = 154547, upload-time = "2023-02-23T18:33:40.801Z" }, +] + +[[package]] +name = "idna" +version = "3.11" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/6f/6d/0703ccc57f3a7233505399edb88de3cbd678da106337b9fcde432b65ed60/idna-3.11.tar.gz", hash = "sha256:795dafcc9c04ed0c1fb032c2aa73654d8e8c5023a7df64a53f39190ada629902", size = 194582, upload-time = "2025-10-12T14:55:20.501Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/0e/61/66938bbb5fc52dbdf84594873d5b51fb1f7c7794e9c0f5bd885f30bc507b/idna-3.11-py3-none-any.whl", hash = "sha256:771a87f49d9defaf64091e6e6fe9c18d4833f140bd19464795bc32d966ca37ea", size = 71008, upload-time = "2025-10-12T14:55:18.883Z" }, +] + +[[package]] +name = "importlib-metadata" +version = "8.7.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "zipp" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/f3/49/3b30cad09e7771a4982d9975a8cbf64f00d4a1ececb53297f1d9a7be1b10/importlib_metadata-8.7.1.tar.gz", hash = "sha256:49fef1ae6440c182052f407c8d34a68f72efc36db9ca90dc0113398f2fdde8bb", size = 57107, upload-time = "2025-12-21T10:00:19.278Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/fa/5e/f8e9a1d23b9c20a551a8a02ea3637b4642e22c2626e3a13a9a29cdea99eb/importlib_metadata-8.7.1-py3-none-any.whl", hash = "sha256:5a1f80bf1daa489495071efbb095d75a634cf28a8bc299581244063b53176151", size = 27865, upload-time = "2025-12-21T10:00:18.329Z" }, +] + +[[package]] +name = "iniconfig" +version = "2.3.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/72/34/14ca021ce8e5dfedc35312d08ba8bf51fdd999c576889fc2c24cb97f4f10/iniconfig-2.3.0.tar.gz", hash = "sha256:c76315c77db068650d49c5b56314774a7804df16fee4402c1f19d6d15d8c4730", size = 20503, upload-time = "2025-10-18T21:55:43.219Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/cb/b1/3846dd7f199d53cb17f49cba7e651e9ce294d8497c8c150530ed11865bb8/iniconfig-2.3.0-py3-none-any.whl", hash = "sha256:f631c04d2c48c52b84d0d0549c99ff3859c98df65b3101406327ecc7d53fbf12", size = 7484, upload-time = "2025-10-18T21:55:41.639Z" }, +] + +[[package]] +name = "jinja2" +version = "3.1.6" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "markupsafe" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/df/bf/f7da0350254c0ed7c72f3e33cef02e048281fec7ecec5f032d4aac52226b/jinja2-3.1.6.tar.gz", hash = "sha256:0137fb05990d35f1275a587e9aee6d56da821fc83491a0fb838183be43f66d6d", size = 245115, upload-time = "2025-03-05T20:05:02.478Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/62/a1/3d680cbfd5f4b8f15abc1d571870c5fc3e594bb582bc3b64ea099db13e56/jinja2-3.1.6-py3-none-any.whl", hash = "sha256:85ece4451f492d0c13c5dd7c13a64681a86afae63a5f347908daf103ce6d2f67", size = 134899, upload-time = "2025-03-05T20:05:00.369Z" }, +] + +[[package]] +name = "joblib" +version = "1.5.3" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/41/f2/d34e8b3a08a9cc79a50b2208a93dce981fe615b64d5a4d4abee421d898df/joblib-1.5.3.tar.gz", hash = "sha256:8561a3269e6801106863fd0d6d84bb737be9e7631e33aaed3fb9ce5953688da3", size = 331603, upload-time = "2025-12-15T08:41:46.427Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/7b/91/984aca2ec129e2757d1e4e3c81c3fcda9d0f85b74670a094cc443d9ee949/joblib-1.5.3-py3-none-any.whl", hash = "sha256:5fc3c5039fc5ca8c0276333a188bbd59d6b7ab37fe6632daa76bc7f9ec18e713", size = 309071, upload-time = "2025-12-15T08:41:44.973Z" }, +] + +[[package]] +name = "julius" +version = "0.2.7" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "torch" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/a1/19/c9e1596b5572c786b93428d0904280e964c930fae7e6c9368ed9e1b63922/julius-0.2.7.tar.gz", hash = "sha256:3c0f5f5306d7d6016fcc95196b274cae6f07e2c9596eed314e4e7641554fbb08", size = 59640, upload-time = "2022-09-19T16:13:34.2Z" } + +[[package]] +name = "kiwisolver" +version = "1.5.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/d0/67/9c61eccb13f0bdca9307614e782fec49ffdde0f7a2314935d489fa93cd9c/kiwisolver-1.5.0.tar.gz", hash = "sha256:d4193f3d9dc3f6f79aaed0e5637f45d98850ebf01f7ca20e69457f3e8946b66a", size = 103482, upload-time = "2026-03-09T13:15:53.382Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ac/f8/06549565caa026e540b7e7bab5c5a90eb7ca986015f4c48dace243cd24d9/kiwisolver-1.5.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:32cc0a5365239a6ea0c6ed461e8838d053b57e397443c0ca894dcc8e388d4374", size = 122802, upload-time = "2026-03-09T13:12:37.515Z" }, + { url = "https://files.pythonhosted.org/packages/84/eb/8476a0818850c563ff343ea7c9c05dcdcbd689a38e01aa31657df01f91fa/kiwisolver-1.5.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:cc0b66c1eec9021353a4b4483afb12dfd50e3669ffbb9152d6842eb34c7e29fd", size = 66216, upload-time = "2026-03-09T13:12:38.812Z" }, + { url = "https://files.pythonhosted.org/packages/f3/c4/f9c8a6b4c21aed4198566e45923512986d6cef530e7263b3a5f823546561/kiwisolver-1.5.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:86e0287879f75621ae85197b0877ed2f8b7aa57b511c7331dce2eb6f4de7d476", size = 63917, upload-time = "2026-03-09T13:12:40.053Z" }, + { url = "https://files.pythonhosted.org/packages/f1/0e/ba4ae25d03722f64de8b2c13e80d82ab537a06b30fc7065183c6439357e3/kiwisolver-1.5.0-cp310-cp310-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:62f59da443c4f4849f73a51a193b1d9d258dcad0c41bc4d1b8fb2bcc04bfeb22", size = 1628776, upload-time = "2026-03-09T13:12:41.976Z" }, + { url = "https://files.pythonhosted.org/packages/8a/e4/3f43a011bc8a0860d1c96f84d32fa87439d3feedf66e672fef03bf5e8bac/kiwisolver-1.5.0-cp310-cp310-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:9190426b7aa26c5229501fa297b8d0653cfd3f5a36f7990c264e157cbf886b3b", size = 1228164, upload-time = "2026-03-09T13:12:44.002Z" }, + { url = "https://files.pythonhosted.org/packages/4b/34/3a901559a1e0c218404f9a61a93be82d45cb8f44453ba43088644980f033/kiwisolver-1.5.0-cp310-cp310-manylinux_2_24_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:c8277104ded0a51e699c8c3aff63ce2c56d4ed5519a5f73e0fd7057f959a2b9e", size = 1246656, upload-time = "2026-03-09T13:12:45.557Z" }, + { url = "https://files.pythonhosted.org/packages/87/9e/f78c466ea20527822b95ad38f141f2de1dcd7f23fb8716b002b0d91bbe59/kiwisolver-1.5.0-cp310-cp310-manylinux_2_24_s390x.manylinux_2_28_s390x.whl", hash = "sha256:8f9baf6f0a6e7571c45c8863010b45e837c3ee1c2c77fcd6ef423be91b21fedb", size = 1295562, upload-time = "2026-03-09T13:12:47.562Z" }, + { url = "https://files.pythonhosted.org/packages/0a/66/fd0e4a612e3a286c24e6d6f3a5428d11258ed1909bc530ba3b59807fd980/kiwisolver-1.5.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:cff8e5383db4989311f99e814feeb90c4723eb4edca425b9d5d9c3fefcdd9537", size = 2178473, upload-time = "2026-03-09T13:12:50.254Z" }, + { url = "https://files.pythonhosted.org/packages/dc/8e/6cac929e0049539e5ee25c1ee937556f379ba5204840d03008363ced662d/kiwisolver-1.5.0-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:ebae99ed6764f2b5771c522477b311be313e8841d2e0376db2b10922daebbba4", size = 2274035, upload-time = "2026-03-09T13:12:51.785Z" }, + { url = "https://files.pythonhosted.org/packages/ca/d3/9d0c18f1b52ea8074b792452cf17f1f5a56bd0302a85191f405cfbf9da16/kiwisolver-1.5.0-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:d5cd5189fc2b6a538b75ae45433140c4823463918f7b1617c31e68b085c0022c", size = 2443217, upload-time = "2026-03-09T13:12:53.329Z" }, + { url = "https://files.pythonhosted.org/packages/45/2a/6e19368803a038b2a90857bf4ee9e3c7b667216d045866bf22d3439fd75e/kiwisolver-1.5.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:f42c23db5d1521218a3276bb08666dcb662896a0be7347cba864eca45ff64ede", size = 2249196, upload-time = "2026-03-09T13:12:55.057Z" }, + { url = "https://files.pythonhosted.org/packages/75/2b/3f641dfcbe72e222175d626bacf2f72c3b34312afec949dd1c50afa400f5/kiwisolver-1.5.0-cp310-cp310-win_amd64.whl", hash = "sha256:94eff26096eb5395136634622515b234ecb6c9979824c1f5004c6e3c3c85ccd2", size = 73389, upload-time = "2026-03-09T13:12:56.496Z" }, + { url = "https://files.pythonhosted.org/packages/da/88/299b137b9e0025d8982e03d2d52c123b0a2b159e84b0ef1501ef446339cf/kiwisolver-1.5.0-cp310-cp310-win_arm64.whl", hash = "sha256:dd952e03bfbb096cfe2dd35cd9e00f269969b67536cb4370994afc20ff2d0875", size = 64782, upload-time = "2026-03-09T13:12:57.609Z" }, + { url = "https://files.pythonhosted.org/packages/12/dd/a495a9c104be1c476f0386e714252caf2b7eca883915422a64c50b88c6f5/kiwisolver-1.5.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:9eed0f7edbb274413b6ee781cca50541c8c0facd3d6fd289779e494340a2b85c", size = 122798, upload-time = "2026-03-09T13:12:58.963Z" }, + { url = "https://files.pythonhosted.org/packages/11/60/37b4047a2af0cf5ef6d8b4b26e91829ae6fc6a2d1f74524bcb0e7cd28a32/kiwisolver-1.5.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:3c4923e404d6bcd91b6779c009542e5647fef32e4a5d75e115e3bbac6f2335eb", size = 66216, upload-time = "2026-03-09T13:13:00.155Z" }, + { url = "https://files.pythonhosted.org/packages/0a/aa/510dc933d87767584abfe03efa445889996c70c2990f6f87c3ebaa0a18c5/kiwisolver-1.5.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:0df54df7e686afa55e6f21fb86195224a6d9beb71d637e8d7920c95cf0f89aac", size = 63911, upload-time = "2026-03-09T13:13:01.671Z" }, + { url = "https://files.pythonhosted.org/packages/80/46/bddc13df6c2a40741e0cc7865bb1c9ed4796b6760bd04ce5fae3928ef917/kiwisolver-1.5.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:2517e24d7315eb51c10664cdb865195df38ab74456c677df67bb47f12d088a27", size = 1438209, upload-time = "2026-03-09T13:13:03.385Z" }, + { url = "https://files.pythonhosted.org/packages/fd/d6/76621246f5165e5372f02f5e6f3f48ea336a8f9e96e43997d45b240ed8cd/kiwisolver-1.5.0-cp311-cp311-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ff710414307fefa903e0d9bdf300972f892c23477829f49504e59834f4195398", size = 1248888, upload-time = "2026-03-09T13:13:05.231Z" }, + { url = "https://files.pythonhosted.org/packages/b2/c1/31559ec6fb39a5b48035ce29bb63ade628f321785f38c384dee3e2c08bc1/kiwisolver-1.5.0-cp311-cp311-manylinux_2_24_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:6176c1811d9d5a04fa391c490cc44f451e240697a16977f11c6f722efb9041db", size = 1266304, upload-time = "2026-03-09T13:13:06.743Z" }, + { url = "https://files.pythonhosted.org/packages/5e/ef/1cb8276f2d29cc6a41e0a042f27946ca347d3a4a75acf85d0a16aa6dcc82/kiwisolver-1.5.0-cp311-cp311-manylinux_2_24_s390x.manylinux_2_28_s390x.whl", hash = "sha256:50847dca5d197fcbd389c805aa1a1cf32f25d2e7273dc47ab181a517666b68cc", size = 1319650, upload-time = "2026-03-09T13:13:08.607Z" }, + { url = "https://files.pythonhosted.org/packages/4c/e4/5ba3cecd7ce6236ae4a80f67e5d5531287337d0e1f076ca87a5abe4cd5d0/kiwisolver-1.5.0-cp311-cp311-manylinux_2_39_riscv64.whl", hash = "sha256:01808c6d15f4c3e8559595d6d1fe6411c68e4a3822b4b9972b44473b24f4e679", size = 970949, upload-time = "2026-03-09T13:13:10.299Z" }, + { url = "https://files.pythonhosted.org/packages/5a/69/dc61f7ae9a2f071f26004ced87f078235b5507ab6e5acd78f40365655034/kiwisolver-1.5.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:f1f9f4121ec58628c96baa3de1a55a4e3a333c5102c8e94b64e23bf7b2083309", size = 2199125, upload-time = "2026-03-09T13:13:11.841Z" }, + { url = "https://files.pythonhosted.org/packages/e5/7b/abbe0f1b5afa85f8d084b73e90e5f801c0939eba16ac2e49af7c61a6c28d/kiwisolver-1.5.0-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:b7d335370ae48a780c6e6a6bbfa97342f563744c39c35562f3f367665f5c1de2", size = 2293783, upload-time = "2026-03-09T13:13:14.399Z" }, + { url = "https://files.pythonhosted.org/packages/8a/80/5908ae149d96d81580d604c7f8aefd0e98f4fd728cf172f477e9f2a81744/kiwisolver-1.5.0-cp311-cp311-musllinux_1_2_riscv64.whl", hash = "sha256:800ee55980c18545af444d93fdd60c56b580db5cc54867d8cbf8a1dc0829938c", size = 1960726, upload-time = "2026-03-09T13:13:16.047Z" }, + { url = "https://files.pythonhosted.org/packages/84/08/a78cb776f8c085b7143142ce479859cfec086bd09ee638a317040b6ef420/kiwisolver-1.5.0-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:c438f6ca858697c9ab67eb28246c92508af972e114cac34e57a6d4ba17a3ac08", size = 2464738, upload-time = "2026-03-09T13:13:17.897Z" }, + { url = "https://files.pythonhosted.org/packages/b1/e1/65584da5356ed6cb12c63791a10b208860ac40a83de165cb6a6751a686e3/kiwisolver-1.5.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:8c63c91f95173f9c2a67c7c526b2cea976828a0e7fced9cdcead2802dc10f8a4", size = 2270718, upload-time = "2026-03-09T13:13:19.421Z" }, + { url = "https://files.pythonhosted.org/packages/be/6c/28f17390b62b8f2f520e2915095b3c94d88681ecf0041e75389d9667f202/kiwisolver-1.5.0-cp311-cp311-win_amd64.whl", hash = "sha256:beb7f344487cdcb9e1efe4b7a29681b74d34c08f0043a327a74da852a6749e7b", size = 73480, upload-time = "2026-03-09T13:13:20.818Z" }, + { url = "https://files.pythonhosted.org/packages/d8/0e/2ee5debc4f77a625778fec5501ff3e8036fe361b7ee28ae402a485bb9694/kiwisolver-1.5.0-cp311-cp311-win_arm64.whl", hash = "sha256:ad4ae4ffd1ee9cd11357b4c66b612da9888f4f4daf2f36995eda64bd45370cac", size = 64930, upload-time = "2026-03-09T13:13:21.997Z" }, + { url = "https://files.pythonhosted.org/packages/4d/b2/818b74ebea34dabe6d0c51cb1c572e046730e64844da6ed646d5298c40ce/kiwisolver-1.5.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:4e9750bc21b886308024f8a54ccb9a2cc38ac9fa813bf4348434e3d54f337ff9", size = 123158, upload-time = "2026-03-09T13:13:23.127Z" }, + { url = "https://files.pythonhosted.org/packages/bf/d9/405320f8077e8e1c5c4bd6adc45e1e6edf6d727b6da7f2e2533cf58bff71/kiwisolver-1.5.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:72ec46b7eba5b395e0a7b63025490d3214c11013f4aacb4f5e8d6c3041829588", size = 66388, upload-time = "2026-03-09T13:13:24.765Z" }, + { url = "https://files.pythonhosted.org/packages/99/9f/795fedf35634f746151ca8839d05681ceb6287fbed6cc1c9bf235f7887c2/kiwisolver-1.5.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:ed3a984b31da7481b103f68776f7128a89ef26ed40f4dc41a2223cda7fb24819", size = 64068, upload-time = "2026-03-09T13:13:25.878Z" }, + { url = "https://files.pythonhosted.org/packages/c4/13/680c54afe3e65767bed7ec1a15571e1a2f1257128733851ade24abcefbcc/kiwisolver-1.5.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:bb5136fb5352d3f422df33f0c879a1b0c204004324150cc3b5e3c4f310c9049f", size = 1477934, upload-time = "2026-03-09T13:13:27.166Z" }, + { url = "https://files.pythonhosted.org/packages/c8/2f/cebfcdb60fd6a9b0f6b47a9337198bcbad6fbe15e68189b7011fd914911f/kiwisolver-1.5.0-cp312-cp312-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b2af221f268f5af85e776a73d62b0845fc8baf8ef0abfae79d29c77d0e776aaf", size = 1278537, upload-time = "2026-03-09T13:13:28.707Z" }, + { url = "https://files.pythonhosted.org/packages/f2/0d/9b782923aada3fafb1d6b84e13121954515c669b18af0c26e7d21f579855/kiwisolver-1.5.0-cp312-cp312-manylinux_2_24_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:b0f172dc8ffaccb8522d7c5d899de00133f2f1ca7b0a49b7da98e901de87bf2d", size = 1296685, upload-time = "2026-03-09T13:13:30.528Z" }, + { url = "https://files.pythonhosted.org/packages/27/70/83241b6634b04fe44e892688d5208332bde130f38e610c0418f9ede47ded/kiwisolver-1.5.0-cp312-cp312-manylinux_2_24_s390x.manylinux_2_28_s390x.whl", hash = "sha256:6ab8ba9152203feec73758dad83af9a0bbe05001eb4639e547207c40cfb52083", size = 1346024, upload-time = "2026-03-09T13:13:32.818Z" }, + { url = "https://files.pythonhosted.org/packages/e4/db/30ed226fb271ae1a6431fc0fe0edffb2efe23cadb01e798caeb9f2ceae8f/kiwisolver-1.5.0-cp312-cp312-manylinux_2_39_riscv64.whl", hash = "sha256:cdee07c4d7f6d72008d3f73b9bf027f4e11550224c7c50d8df1ae4a37c1402a6", size = 987241, upload-time = "2026-03-09T13:13:34.435Z" }, + { url = "https://files.pythonhosted.org/packages/ec/bd/c314595208e4c9587652d50959ead9e461995389664e490f4dce7ff0f782/kiwisolver-1.5.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:7c60d3c9b06fb23bd9c6139281ccbdc384297579ae037f08ae90c69f6845c0b1", size = 2227742, upload-time = "2026-03-09T13:13:36.4Z" }, + { url = "https://files.pythonhosted.org/packages/c1/43/0499cec932d935229b5543d073c2b87c9c22846aab48881e9d8d6e742a2d/kiwisolver-1.5.0-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:e315e5ec90d88e140f57696ff85b484ff68bb311e36f2c414aa4286293e6dee0", size = 2323966, upload-time = "2026-03-09T13:13:38.204Z" }, + { url = "https://files.pythonhosted.org/packages/3d/6f/79b0d760907965acfd9d61826a3d41f8f093c538f55cd2633d3f0db269f6/kiwisolver-1.5.0-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:1465387ac63576c3e125e5337a6892b9e99e0627d52317f3ca79e6930d889d15", size = 1977417, upload-time = "2026-03-09T13:13:39.966Z" }, + { url = "https://files.pythonhosted.org/packages/ab/31/01d0537c41cb75a551a438c3c7a80d0c60d60b81f694dac83dd436aec0d0/kiwisolver-1.5.0-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:530a3fd64c87cffa844d4b6b9768774763d9caa299e9b75d8eca6a4423b31314", size = 2491238, upload-time = "2026-03-09T13:13:41.698Z" }, + { url = "https://files.pythonhosted.org/packages/e4/34/8aefdd0be9cfd00a44509251ba864f5caf2991e36772e61c408007e7f417/kiwisolver-1.5.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:1d9daea4ea6b9be74fe2f01f7fbade8d6ffab263e781274cffca0dba9be9eec9", size = 2294947, upload-time = "2026-03-09T13:13:43.343Z" }, + { url = "https://files.pythonhosted.org/packages/ad/cf/0348374369ca588f8fe9c338fae49fa4e16eeb10ffb3d012f23a54578a9e/kiwisolver-1.5.0-cp312-cp312-win_amd64.whl", hash = "sha256:f18c2d9782259a6dc132fdc7a63c168cbc74b35284b6d75c673958982a378384", size = 73569, upload-time = "2026-03-09T13:13:45.792Z" }, + { url = "https://files.pythonhosted.org/packages/28/26/192b26196e2316e2bd29deef67e37cdf9870d9af8e085e521afff0fed526/kiwisolver-1.5.0-cp312-cp312-win_arm64.whl", hash = "sha256:f7c7553b13f69c1b29a5bde08ddc6d9d0c8bfb84f9ed01c30db25944aeb852a7", size = 64997, upload-time = "2026-03-09T13:13:46.878Z" }, + { url = "https://files.pythonhosted.org/packages/9d/69/024d6711d5ba575aa65d5538042e99964104e97fa153a9f10bc369182bc2/kiwisolver-1.5.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:fd40bb9cd0891c4c3cb1ddf83f8bbfa15731a248fdc8162669405451e2724b09", size = 123166, upload-time = "2026-03-09T13:13:48.032Z" }, + { url = "https://files.pythonhosted.org/packages/ce/48/adbb40df306f587054a348831220812b9b1d787aff714cfbc8556e38fccd/kiwisolver-1.5.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:c0e1403fd7c26d77c1f03e096dc58a5c726503fa0db0456678b8668f76f521e3", size = 66395, upload-time = "2026-03-09T13:13:49.365Z" }, + { url = "https://files.pythonhosted.org/packages/a8/3a/d0a972b34e1c63e2409413104216cd1caa02c5a37cb668d1687d466c1c45/kiwisolver-1.5.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:dda366d548e89a90d88a86c692377d18d8bd64b39c1fb2b92cb31370e2896bbd", size = 64065, upload-time = "2026-03-09T13:13:50.562Z" }, + { url = "https://files.pythonhosted.org/packages/2b/0a/7b98e1e119878a27ba8618ca1e18b14f992ff1eda40f47bccccf4de44121/kiwisolver-1.5.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:332b4f0145c30b5f5ad9374881133e5aa64320428a57c2c2b61e9d891a51c2f3", size = 1477903, upload-time = "2026-03-09T13:13:52.084Z" }, + { url = "https://files.pythonhosted.org/packages/18/d8/55638d89ffd27799d5cc3d8aa28e12f4ce7a64d67b285114dbedc8ea4136/kiwisolver-1.5.0-cp313-cp313-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:0c50b89ffd3e1a911c69a1dd3de7173c0cd10b130f56222e57898683841e4f96", size = 1278751, upload-time = "2026-03-09T13:13:54.673Z" }, + { url = "https://files.pythonhosted.org/packages/b8/97/b4c8d0d18421ecceba20ad8701358453b88e32414e6f6950b5a4bad54e65/kiwisolver-1.5.0-cp313-cp313-manylinux_2_24_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:4db576bb8c3ef9365f8b40fe0f671644de6736ae2c27a2c62d7d8a1b4329f099", size = 1296793, upload-time = "2026-03-09T13:13:56.287Z" }, + { url = "https://files.pythonhosted.org/packages/c4/10/f862f94b6389d8957448ec9df59450b81bec4abb318805375c401a1e6892/kiwisolver-1.5.0-cp313-cp313-manylinux_2_24_s390x.manylinux_2_28_s390x.whl", hash = "sha256:0b85aad90cea8ac6797a53b5d5f2e967334fa4d1149f031c4537569972596cb8", size = 1346041, upload-time = "2026-03-09T13:13:58.269Z" }, + { url = "https://files.pythonhosted.org/packages/a3/6a/f1650af35821eaf09de398ec0bc2aefc8f211f0cda50204c9f1673741ba9/kiwisolver-1.5.0-cp313-cp313-manylinux_2_39_riscv64.whl", hash = "sha256:d36ca54cb4c6c4686f7cbb7b817f66f5911c12ddb519450bbe86707155028f87", size = 987292, upload-time = "2026-03-09T13:13:59.871Z" }, + { url = "https://files.pythonhosted.org/packages/de/19/d7fb82984b9238115fe629c915007be608ebd23dc8629703d917dbfaffd4/kiwisolver-1.5.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:38f4a703656f493b0ad185211ccfca7f0386120f022066b018eb5296d8613e23", size = 2227865, upload-time = "2026-03-09T13:14:01.401Z" }, + { url = "https://files.pythonhosted.org/packages/7f/b9/46b7f386589fd222dac9e9de9c956ce5bcefe2ee73b4e79891381dda8654/kiwisolver-1.5.0-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:3ac2360e93cb41be81121755c6462cff3beaa9967188c866e5fce5cf13170859", size = 2324369, upload-time = "2026-03-09T13:14:02.972Z" }, + { url = "https://files.pythonhosted.org/packages/92/8b/95e237cf3d9c642960153c769ddcbe278f182c8affb20cecc1cc983e7cc5/kiwisolver-1.5.0-cp313-cp313-musllinux_1_2_riscv64.whl", hash = "sha256:c95cab08d1965db3d84a121f1c7ce7479bdd4072c9b3dafd8fecce48a2e6b902", size = 1977989, upload-time = "2026-03-09T13:14:04.503Z" }, + { url = "https://files.pythonhosted.org/packages/1b/95/980c9df53501892784997820136c01f62bc1865e31b82b9560f980c0e649/kiwisolver-1.5.0-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:fc20894c3d21194d8041a28b65622d5b86db786da6e3cfe73f0c762951a61167", size = 2491645, upload-time = "2026-03-09T13:14:06.106Z" }, + { url = "https://files.pythonhosted.org/packages/cb/32/900647fd0840abebe1561792c6b31e6a7c0e278fc3973d30572a965ca14c/kiwisolver-1.5.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:7a32f72973f0f950c1920475d5c5ea3d971b81b6f0ec53b8d0a956cc965f22e0", size = 2295237, upload-time = "2026-03-09T13:14:08.891Z" }, + { url = "https://files.pythonhosted.org/packages/be/8a/be60e3bbcf513cc5a50f4a3e88e1dcecebb79c1ad607a7222877becaa101/kiwisolver-1.5.0-cp313-cp313-win_amd64.whl", hash = "sha256:0bf3acf1419fa93064a4c2189ac0b58e3be7872bf6ee6177b0d4c63dc4cea276", size = 73573, upload-time = "2026-03-09T13:14:12.327Z" }, + { url = "https://files.pythonhosted.org/packages/4d/d2/64be2e429eb4fca7f7e1c52a91b12663aeaf25de3895e5cca0f47ef2a8d0/kiwisolver-1.5.0-cp313-cp313-win_arm64.whl", hash = "sha256:fa8eb9ecdb7efb0b226acec134e0d709e87a909fa4971a54c0c4f6e88635484c", size = 64998, upload-time = "2026-03-09T13:14:13.469Z" }, + { url = "https://files.pythonhosted.org/packages/b0/69/ce68dd0c85755ae2de490bf015b62f2cea5f6b14ff00a463f9d0774449ff/kiwisolver-1.5.0-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:db485b3847d182b908b483b2ed133c66d88d49cacf98fd278fadafe11b4478d1", size = 125700, upload-time = "2026-03-09T13:14:14.636Z" }, + { url = "https://files.pythonhosted.org/packages/74/aa/937aac021cf9d4349990d47eb319309a51355ed1dbdc9c077cdc9224cb11/kiwisolver-1.5.0-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:be12f931839a3bdfe28b584db0e640a65a8bcbc24560ae3fdb025a449b3d754e", size = 67537, upload-time = "2026-03-09T13:14:15.808Z" }, + { url = "https://files.pythonhosted.org/packages/ee/20/3a87fbece2c40ad0f6f0aefa93542559159c5f99831d596050e8afae7a9f/kiwisolver-1.5.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:16b85d37c2cbb3253226d26e64663f755d88a03439a9c47df6246b35defbdfb7", size = 65514, upload-time = "2026-03-09T13:14:18.035Z" }, + { url = "https://files.pythonhosted.org/packages/f0/7f/f943879cda9007c45e1f7dba216d705c3a18d6b35830e488b6c6a4e7cdf0/kiwisolver-1.5.0-cp313-cp313t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:4432b835675f0ea7414aab3d37d119f7226d24869b7a829caeab49ebda407b0c", size = 1584848, upload-time = "2026-03-09T13:14:19.745Z" }, + { url = "https://files.pythonhosted.org/packages/37/f8/4d4f85cc1870c127c88d950913370dd76138482161cd07eabbc450deff01/kiwisolver-1.5.0-cp313-cp313t-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:1b0feb50971481a2cc44d94e88bdb02cdd497618252ae226b8eb1201b957e368", size = 1391542, upload-time = "2026-03-09T13:14:21.54Z" }, + { url = "https://files.pythonhosted.org/packages/04/0b/65dd2916c84d252b244bd405303220f729e7c17c9d7d33dca6feeff9ffc4/kiwisolver-1.5.0-cp313-cp313t-manylinux_2_24_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:56fa888f10d0f367155e76ce849fa1166fc9730d13bd2d65a2aa13b6f5424489", size = 1404447, upload-time = "2026-03-09T13:14:23.205Z" }, + { url = "https://files.pythonhosted.org/packages/39/5c/2606a373247babce9b1d056c03a04b65f3cf5290a8eac5d7bdead0a17e21/kiwisolver-1.5.0-cp313-cp313t-manylinux_2_24_s390x.manylinux_2_28_s390x.whl", hash = "sha256:940dda65d5e764406b9fb92761cbf462e4e63f712ab60ed98f70552e496f3bf1", size = 1455918, upload-time = "2026-03-09T13:14:24.74Z" }, + { url = "https://files.pythonhosted.org/packages/d5/d1/c6078b5756670658e9192a2ef11e939c92918833d2745f85cd14a6004bdf/kiwisolver-1.5.0-cp313-cp313t-manylinux_2_39_riscv64.whl", hash = "sha256:89fc958c702ee9a745e4700378f5d23fddbc46ff89e8fdbf5395c24d5c1452a3", size = 1072856, upload-time = "2026-03-09T13:14:26.597Z" }, + { url = "https://files.pythonhosted.org/packages/cb/c8/7def6ddf16eb2b3741d8b172bdaa9af882b03c78e9b0772975408801fa63/kiwisolver-1.5.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:9027d773c4ff81487181a925945743413f6069634d0b122d0b37684ccf4f1e18", size = 2333580, upload-time = "2026-03-09T13:14:28.237Z" }, + { url = "https://files.pythonhosted.org/packages/9e/87/2ac1fce0eb1e616fcd3c35caa23e665e9b1948bb984f4764790924594128/kiwisolver-1.5.0-cp313-cp313t-musllinux_1_2_ppc64le.whl", hash = "sha256:5b233ea3e165e43e35dba1d2b8ecc21cf070b45b65ae17dd2747d2713d942021", size = 2423018, upload-time = "2026-03-09T13:14:30.018Z" }, + { url = "https://files.pythonhosted.org/packages/67/13/c6700ccc6cc218716bfcda4935e4b2997039869b4ad8a94f364c5a3b8e63/kiwisolver-1.5.0-cp313-cp313t-musllinux_1_2_riscv64.whl", hash = "sha256:ce9bf03dad3b46408c08649c6fbd6ca28a9fce0eb32fdfffa6775a13103b5310", size = 2062804, upload-time = "2026-03-09T13:14:32.888Z" }, + { url = "https://files.pythonhosted.org/packages/1b/bd/877056304626943ff0f1f44c08f584300c199b887cb3176cd7e34f1515f1/kiwisolver-1.5.0-cp313-cp313t-musllinux_1_2_s390x.whl", hash = "sha256:fc4d3f1fb9ca0ae9f97b095963bc6326f1dbfd3779d6679a1e016b9baaa153d3", size = 2597482, upload-time = "2026-03-09T13:14:34.971Z" }, + { url = "https://files.pythonhosted.org/packages/75/19/c60626c47bf0f8ac5dcf72c6c98e266d714f2fbbfd50cf6dab5ede3aaa50/kiwisolver-1.5.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:f443b4825c50a51ee68585522ab4a1d1257fac65896f282b4c6763337ac9f5d2", size = 2394328, upload-time = "2026-03-09T13:14:36.816Z" }, + { url = "https://files.pythonhosted.org/packages/47/84/6a6d5e5bb8273756c27b7d810d47f7ef2f1f9b9fd23c9ee9a3f8c75c9cef/kiwisolver-1.5.0-cp313-cp313t-win_arm64.whl", hash = "sha256:893ff3a711d1b515ba9da14ee090519bad4610ed1962fbe298a434e8c5f8db53", size = 68410, upload-time = "2026-03-09T13:14:38.695Z" }, + { url = "https://files.pythonhosted.org/packages/e4/d7/060f45052f2a01ad5762c8fdecd6d7a752b43400dc29ff75cd47225a40fd/kiwisolver-1.5.0-cp314-cp314-macosx_10_15_universal2.whl", hash = "sha256:8df31fe574b8b3993cc61764f40941111b25c2d9fea13d3ce24a49907cd2d615", size = 123231, upload-time = "2026-03-09T13:14:41.323Z" }, + { url = "https://files.pythonhosted.org/packages/c2/a7/78da680eadd06ff35edef6ef68a1ad273bad3e2a0936c9a885103230aece/kiwisolver-1.5.0-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:1d49a49ac4cbfb7c1375301cd1ec90169dfeae55ff84710d782260ce77a75a02", size = 66489, upload-time = "2026-03-09T13:14:42.534Z" }, + { url = "https://files.pythonhosted.org/packages/49/b2/97980f3ad4fae37dd7fe31626e2bf75fbf8bdf5d303950ec1fab39a12da8/kiwisolver-1.5.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:0cbe94b69b819209a62cb27bdfa5dc2a8977d8de2f89dfd97ba4f53ed3af754e", size = 64063, upload-time = "2026-03-09T13:14:44.759Z" }, + { url = "https://files.pythonhosted.org/packages/e7/f9/b06c934a6aa8bc91f566bd2a214fd04c30506c2d9e2b6b171953216a65b6/kiwisolver-1.5.0-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:80aa065ffd378ff784822a6d7c3212f2d5f5e9c3589614b5c228b311fd3063ac", size = 1475913, upload-time = "2026-03-09T13:14:46.247Z" }, + { url = "https://files.pythonhosted.org/packages/6b/f0/f768ae564a710135630672981231320bc403cf9152b5596ec5289de0f106/kiwisolver-1.5.0-cp314-cp314-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:4e7f886f47ab881692f278ae901039a234e4025a68e6dfab514263a0b1c4ae05", size = 1282782, upload-time = "2026-03-09T13:14:48.458Z" }, + { url = "https://files.pythonhosted.org/packages/e2/9f/1de7aad00697325f05238a5f2eafbd487fb637cc27a558b5367a5f37fb7f/kiwisolver-1.5.0-cp314-cp314-manylinux_2_24_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:5060731cc3ed12ca3a8b57acd4aeca5bbc2f49216dd0bec1650a1acd89486bcd", size = 1300815, upload-time = "2026-03-09T13:14:50.721Z" }, + { url = "https://files.pythonhosted.org/packages/5a/c2/297f25141d2e468e0ce7f7a7b92e0cf8918143a0cbd3422c1ad627e85a06/kiwisolver-1.5.0-cp314-cp314-manylinux_2_24_s390x.manylinux_2_28_s390x.whl", hash = "sha256:7a4aa69609f40fce3cbc3f87b2061f042eee32f94b8f11db707b66a26461591a", size = 1347925, upload-time = "2026-03-09T13:14:52.304Z" }, + { url = "https://files.pythonhosted.org/packages/b9/d3/f4c73a02eb41520c47610207b21afa8cdd18fdbf64ffd94674ae21c4812d/kiwisolver-1.5.0-cp314-cp314-manylinux_2_39_riscv64.whl", hash = "sha256:d168fda2dbff7b9b5f38e693182d792a938c31db4dac3a80a4888de603c99554", size = 991322, upload-time = "2026-03-09T13:14:54.637Z" }, + { url = "https://files.pythonhosted.org/packages/7b/46/d3f2efef7732fcda98d22bf4ad5d3d71d545167a852ca710a494f4c15343/kiwisolver-1.5.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:413b820229730d358efd838ecbab79902fe97094565fdc80ddb6b0a18c18a581", size = 2232857, upload-time = "2026-03-09T13:14:56.471Z" }, + { url = "https://files.pythonhosted.org/packages/3f/ec/2d9756bf2b6d26ae4349b8d3662fb3993f16d80c1f971c179ce862b9dbae/kiwisolver-1.5.0-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:5124d1ea754509b09e53738ec185584cc609aae4a3b510aaf4ed6aa047ef9303", size = 2329376, upload-time = "2026-03-09T13:14:58.072Z" }, + { url = "https://files.pythonhosted.org/packages/8f/9f/876a0a0f2260f1bde92e002b3019a5fabc35e0939c7d945e0fa66185eb20/kiwisolver-1.5.0-cp314-cp314-musllinux_1_2_riscv64.whl", hash = "sha256:e4415a8db000bf49a6dd1c478bf70062eaacff0f462b92b0ba68791a905861f9", size = 1982549, upload-time = "2026-03-09T13:14:59.668Z" }, + { url = "https://files.pythonhosted.org/packages/6c/4f/ba3624dfac23a64d54ac4179832860cb537c1b0af06024936e82ca4154a0/kiwisolver-1.5.0-cp314-cp314-musllinux_1_2_s390x.whl", hash = "sha256:d618fd27420381a4f6044faa71f46d8bfd911bd077c555f7138ed88729bfbe79", size = 2494680, upload-time = "2026-03-09T13:15:01.364Z" }, + { url = "https://files.pythonhosted.org/packages/39/b7/97716b190ab98911b20d10bf92eca469121ec483b8ce0edd314f51bc85af/kiwisolver-1.5.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:5092eb5b1172947f57d6ea7d89b2f29650414e4293c47707eb499ec07a0ac796", size = 2297905, upload-time = "2026-03-09T13:15:03.925Z" }, + { url = "https://files.pythonhosted.org/packages/a3/36/4e551e8aa55c9188bca9abb5096805edbf7431072b76e2298e34fd3a3008/kiwisolver-1.5.0-cp314-cp314-win_amd64.whl", hash = "sha256:d76e2d8c75051d58177e762164d2e9ab92886534e3a12e795f103524f221dd8e", size = 75086, upload-time = "2026-03-09T13:15:07.775Z" }, + { url = "https://files.pythonhosted.org/packages/70/15/9b90f7df0e31a003c71649cf66ef61c3c1b862f48c81007fa2383c8bd8d7/kiwisolver-1.5.0-cp314-cp314-win_arm64.whl", hash = "sha256:fa6248cd194edff41d7ea9425ced8ca3a6f838bfb295f6f1d6e6bb694a8518df", size = 66577, upload-time = "2026-03-09T13:15:09.139Z" }, + { url = "https://files.pythonhosted.org/packages/17/01/7dc8c5443ff42b38e72731643ed7cf1ed9bf01691ae5cdca98501999ed83/kiwisolver-1.5.0-cp314-cp314t-macosx_10_15_universal2.whl", hash = "sha256:d1ffeb80b5676463d7a7d56acbe8e37a20ce725570e09549fe738e02ca6b7e1e", size = 125794, upload-time = "2026-03-09T13:15:10.525Z" }, + { url = "https://files.pythonhosted.org/packages/46/8a/b4ebe46ebaac6a303417fab10c2e165c557ddaff558f9699d302b256bc53/kiwisolver-1.5.0-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:bc4d8e252f532ab46a1de9349e2d27b91fce46736a9eedaa37beaca66f574ed4", size = 67646, upload-time = "2026-03-09T13:15:12.016Z" }, + { url = "https://files.pythonhosted.org/packages/60/35/10a844afc5f19d6f567359bf4789e26661755a2f36200d5d1ed8ad0126e5/kiwisolver-1.5.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:6783e069732715ad0c3ce96dbf21dbc2235ab0593f2baf6338101f70371f4028", size = 65511, upload-time = "2026-03-09T13:15:13.311Z" }, + { url = "https://files.pythonhosted.org/packages/f8/8a/685b297052dd041dcebce8e8787b58923b6e78acc6115a0dc9189011c44b/kiwisolver-1.5.0-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:e7c4c09a490dc4d4a7f8cbee56c606a320f9dc28cf92a7157a39d1ce7676a657", size = 1584858, upload-time = "2026-03-09T13:15:15.103Z" }, + { url = "https://files.pythonhosted.org/packages/9e/80/04865e3d4638ac5bddec28908916df4a3075b8c6cc101786a96803188b96/kiwisolver-1.5.0-cp314-cp314t-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:2a075bd7bd19c70cf67c8badfa36cf7c5d8de3c9ddb8420c51e10d9c50e94920", size = 1392539, upload-time = "2026-03-09T13:15:16.661Z" }, + { url = "https://files.pythonhosted.org/packages/ba/01/77a19cacc0893fa13fafa46d1bba06fb4dc2360b3292baf4b56d8e067b24/kiwisolver-1.5.0-cp314-cp314t-manylinux_2_24_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:bdd3e53429ff02aa319ba59dfe4ceeec345bf46cf180ec2cf6fd5b942e7975e9", size = 1405310, upload-time = "2026-03-09T13:15:18.229Z" }, + { url = "https://files.pythonhosted.org/packages/53/39/bcaf5d0cca50e604cfa9b4e3ae1d64b50ca1ae5b754122396084599ef903/kiwisolver-1.5.0-cp314-cp314t-manylinux_2_24_s390x.manylinux_2_28_s390x.whl", hash = "sha256:3cdcb35dc9d807259c981a85531048ede628eabcffb3239adf3d17463518992d", size = 1456244, upload-time = "2026-03-09T13:15:20.444Z" }, + { url = "https://files.pythonhosted.org/packages/d0/7a/72c187abc6975f6978c3e39b7cf67aeb8b3c0a8f9790aa7fd412855e9e1f/kiwisolver-1.5.0-cp314-cp314t-manylinux_2_39_riscv64.whl", hash = "sha256:70d593af6a6ca332d1df73d519fddb5148edb15cd90d5f0155e3746a6d4fcc65", size = 1073154, upload-time = "2026-03-09T13:15:22.039Z" }, + { url = "https://files.pythonhosted.org/packages/c7/ca/cf5b25783ebbd59143b4371ed0c8428a278abe68d6d0104b01865b1bbd0f/kiwisolver-1.5.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:377815a8616074cabbf3f53354e1d040c35815a134e01d7614b7692e4bf8acfa", size = 2334377, upload-time = "2026-03-09T13:15:23.741Z" }, + { url = "https://files.pythonhosted.org/packages/4a/e5/b1f492adc516796e88751282276745340e2a72dcd0d36cf7173e0daf3210/kiwisolver-1.5.0-cp314-cp314t-musllinux_1_2_ppc64le.whl", hash = "sha256:0255a027391d52944eae1dbb5d4cc5903f57092f3674e8e544cdd2622826b3f0", size = 2425288, upload-time = "2026-03-09T13:15:25.789Z" }, + { url = "https://files.pythonhosted.org/packages/e6/e5/9b21fbe91a61b8f409d74a26498706e97a48008bfcd1864373d32a6ba31c/kiwisolver-1.5.0-cp314-cp314t-musllinux_1_2_riscv64.whl", hash = "sha256:012b1eb16e28718fa782b5e61dc6f2da1f0792ca73bd05d54de6cb9561665fc9", size = 2063158, upload-time = "2026-03-09T13:15:27.63Z" }, + { url = "https://files.pythonhosted.org/packages/b1/02/83f47986138310f95ea95531f851b2a62227c11cbc3e690ae1374fe49f0f/kiwisolver-1.5.0-cp314-cp314t-musllinux_1_2_s390x.whl", hash = "sha256:0e3aafb33aed7479377e5e9a82e9d4bf87063741fc99fc7ae48b0f16e32bdd6f", size = 2597260, upload-time = "2026-03-09T13:15:29.421Z" }, + { url = "https://files.pythonhosted.org/packages/07/18/43a5f24608d8c313dd189cf838c8e68d75b115567c6279de7796197cfb6a/kiwisolver-1.5.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:e7a116ae737f0000343218c4edf5bd45893bfeaff0993c0b215d7124c9f77646", size = 2394403, upload-time = "2026-03-09T13:15:31.517Z" }, + { url = "https://files.pythonhosted.org/packages/3b/b5/98222136d839b8afabcaa943b09bd05888c2d36355b7e448550211d1fca4/kiwisolver-1.5.0-cp314-cp314t-win_amd64.whl", hash = "sha256:1dd9b0b119a350976a6d781e7278ec7aca0b201e1a9e2d23d9804afecb6ca681", size = 79687, upload-time = "2026-03-09T13:15:33.204Z" }, + { url = "https://files.pythonhosted.org/packages/99/a2/ca7dc962848040befed12732dff6acae7fb3c4f6fc4272b3f6c9a30b8713/kiwisolver-1.5.0-cp314-cp314t-win_arm64.whl", hash = "sha256:58f812017cd2985c21fbffb4864d59174d4903dd66fa23815e74bbc7a0e2dd57", size = 70032, upload-time = "2026-03-09T13:15:34.411Z" }, + { url = "https://files.pythonhosted.org/packages/1c/fa/2910df836372d8761bb6eff7d8bdcb1613b5c2e03f260efe7abe34d388a7/kiwisolver-1.5.0-graalpy312-graalpy250_312_native-macosx_10_13_x86_64.whl", hash = "sha256:5ae8e62c147495b01a0f4765c878e9bfdf843412446a247e28df59936e99e797", size = 130262, upload-time = "2026-03-09T13:15:35.629Z" }, + { url = "https://files.pythonhosted.org/packages/0f/41/c5f71f9f00aabcc71fee8b7475e3f64747282580c2fe748961ba29b18385/kiwisolver-1.5.0-graalpy312-graalpy250_312_native-macosx_11_0_arm64.whl", hash = "sha256:f6764a4ccab3078db14a632420930f6186058750df066b8ea2a7106df91d3203", size = 138036, upload-time = "2026-03-09T13:15:36.894Z" }, + { url = "https://files.pythonhosted.org/packages/fa/06/7399a607f434119c6e1fdc8ec89a8d51ccccadf3341dee4ead6bd14caaf5/kiwisolver-1.5.0-graalpy312-graalpy250_312_native-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:c31c13da98624f957b0fb1b5bae5383b2333c2c3f6793d9825dd5ce79b525cb7", size = 194295, upload-time = "2026-03-09T13:15:38.22Z" }, + { url = "https://files.pythonhosted.org/packages/b5/91/53255615acd2a1eaca307ede3c90eb550bae9c94581f8c00081b6b1c8f44/kiwisolver-1.5.0-graalpy312-graalpy250_312_native-win_amd64.whl", hash = "sha256:1f1489f769582498610e015a8ef2d36f28f505ab3096d0e16b4858a9ec214f57", size = 75987, upload-time = "2026-03-09T13:15:39.65Z" }, + { url = "https://files.pythonhosted.org/packages/17/6f/6fd4f690a40c2582fa34b97d2678f718acf3706b91d270c65ecb455d0a06/kiwisolver-1.5.0-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:295d9ffe712caa9f8a3081de8d32fc60191b4b51c76f02f951fd8407253528f4", size = 59606, upload-time = "2026-03-09T13:15:40.81Z" }, + { url = "https://files.pythonhosted.org/packages/82/a0/2355d5e3b338f13ce63f361abb181e3b6ea5fffdb73f739b3e80efa76159/kiwisolver-1.5.0-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:51e8c4084897de9f05898c2c2a39af6318044ae969d46ff7a34ed3f96274adca", size = 57537, upload-time = "2026-03-09T13:15:42.071Z" }, + { url = "https://files.pythonhosted.org/packages/c8/b9/1d50e610ecadebe205b71d6728fd224ce0e0ca6aba7b9cbe1da049203ac5/kiwisolver-1.5.0-pp310-pypy310_pp73-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:b83af57bdddef03c01a9138034c6ff03181a3028d9a1003b301eb1a55e161a3f", size = 79888, upload-time = "2026-03-09T13:15:43.317Z" }, + { url = "https://files.pythonhosted.org/packages/cd/ee/b85ffcd75afed0357d74f0e6fc02a4507da441165de1ca4760b9f496390d/kiwisolver-1.5.0-pp310-pypy310_pp73-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:bf4679a3d71012a7c2bf360e5cd878fbd5e4fcac0896b56393dec239d81529ed", size = 77584, upload-time = "2026-03-09T13:15:44.605Z" }, + { url = "https://files.pythonhosted.org/packages/6b/dd/644d0dde6010a8583b4cd66dd41c5f83f5325464d15c4f490b3340ab73b4/kiwisolver-1.5.0-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:41024ed50e44ab1a60d3fe0a9d15a4ccc9f5f2b1d814ff283c8d01134d5b81bc", size = 73390, upload-time = "2026-03-09T13:15:45.832Z" }, + { url = "https://files.pythonhosted.org/packages/e9/eb/5fcbbbf9a0e2c3a35effb88831a483345326bbc3a030a3b5b69aee647f84/kiwisolver-1.5.0-pp311-pypy311_pp73-macosx_10_15_x86_64.whl", hash = "sha256:ec4c85dc4b687c7f7f15f553ff26a98bfe8c58f5f7f0ac8905f0ba4c7be60232", size = 59532, upload-time = "2026-03-09T13:15:47.047Z" }, + { url = "https://files.pythonhosted.org/packages/c3/9b/e17104555bb4db148fd52327feea1e96be4b88e8e008b029002c281a21ab/kiwisolver-1.5.0-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:12e91c215a96e39f57989c8912ae761286ac5a9584d04030ceb3368a357f017a", size = 57420, upload-time = "2026-03-09T13:15:48.199Z" }, + { url = "https://files.pythonhosted.org/packages/48/44/2b5b95b7aa39fb2d8d9d956e0f3d5d45aef2ae1d942d4c3ffac2f9cfed1a/kiwisolver-1.5.0-pp311-pypy311_pp73-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:be4a51a55833dc29ab5d7503e7bcb3b3af3402d266018137127450005cdfe737", size = 79892, upload-time = "2026-03-09T13:15:49.694Z" }, + { url = "https://files.pythonhosted.org/packages/52/7d/7157f9bba6b455cfb4632ed411e199fc8b8977642c2b12082e1bd9e6d173/kiwisolver-1.5.0-pp311-pypy311_pp73-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:daae526907e262de627d8f70058a0f64acc9e2641c164c99c8f594b34a799a16", size = 77603, upload-time = "2026-03-09T13:15:50.945Z" }, + { url = "https://files.pythonhosted.org/packages/0a/dd/8050c947d435c8d4bc94e3252f4d8bb8a76cfb424f043a8680be637a57f1/kiwisolver-1.5.0-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:59cd8683f575d96df5bb48f6add94afc055012c29e28124fcae2b63661b9efb1", size = 73558, upload-time = "2026-03-09T13:15:52.112Z" }, +] + +[[package]] +name = "lazy-loader" +version = "0.5" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "packaging" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/49/ac/21a1f8aa3777f5658576777ea76bfb124b702c520bbe90edf4ae9915eafa/lazy_loader-0.5.tar.gz", hash = "sha256:717f9179a0dbed357012ddad50a5ad3d5e4d9a0b8712680d4e687f5e6e6ed9b3", size = 15294, upload-time = "2026-03-06T15:45:09.054Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/8a/a1/8d812e53a5da1687abb10445275d41a8b13adb781bbf7196ddbcf8d88505/lazy_loader-0.5-py3-none-any.whl", hash = "sha256:ab0ea149e9c554d4ffeeb21105ac60bed7f3b4fd69b1d2360a4add51b170b005", size = 8044, upload-time = "2026-03-06T15:45:07.668Z" }, +] + +[[package]] +name = "librosa" +version = "0.11.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "audioread" }, + { name = "decorator" }, + { name = "joblib" }, + { name = "lazy-loader" }, + { name = "msgpack" }, + { name = "numba" }, + { name = "numpy", version = "2.2.6", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, + { name = "numpy", version = "2.4.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, + { name = "pooch" }, + { name = "scikit-learn", version = "1.7.2", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, + { name = "scikit-learn", version = "1.8.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, + { name = "scipy", version = "1.15.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, + { name = "scipy", version = "1.17.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, + { name = "soundfile" }, + { name = "soxr" }, + { name = "standard-aifc", marker = "python_full_version >= '3.13'" }, + { name = "standard-sunau", marker = "python_full_version >= '3.13'" }, + { name = "typing-extensions" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/64/36/360b5aafa0238e29758729e9486c6ed92a6f37fa403b7875e06c115cdf4a/librosa-0.11.0.tar.gz", hash = "sha256:f5ed951ca189b375bbe2e33b2abd7e040ceeee302b9bbaeeffdfddb8d0ace908", size = 327001, upload-time = "2025-03-11T15:09:54.884Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/b5/ba/c63c5786dfee4c3417094c4b00966e61e4a63efecee22cb7b4c0387dda83/librosa-0.11.0-py3-none-any.whl", hash = "sha256:0b6415c4fd68bff4c29288abe67c6d80b587e0e1e2cfb0aad23e4559504a7fa1", size = 260749, upload-time = "2025-03-11T15:09:52.982Z" }, +] + +[[package]] +name = "lightning" +version = "2.6.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "fsspec", extra = ["http"] }, + { name = "lightning-utilities" }, + { name = "packaging" }, + { name = "pytorch-lightning" }, + { name = "pyyaml" }, + { name = "torch" }, + { name = "torchmetrics" }, + { name = "tqdm" }, + { name = "typing-extensions" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/15/ad/a1c91a795521be252209d45fb080f28a4f1e7244d3b37121fcc6e3e43034/lightning-2.6.1.tar.gz", hash = "sha256:859104b98c61add6fe60d0c623abf749baf25f2950a66ebdfb4bd18aa7decba9", size = 663175, upload-time = "2026-01-30T14:59:13.92Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/4a/6d/42640e15a8c34b57dc7ea922152440c0c6692214a08d5282b6e3eb46ddf4/lightning-2.6.1-py3-none-any.whl", hash = "sha256:30e1adac23004c713663928541bd72ecb1371b7abc9aff9f46b7fd2644988d30", size = 853631, upload-time = "2026-01-30T14:59:11.687Z" }, +] + +[[package]] +name = "lightning-utilities" +version = "0.15.3" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "packaging" }, + { name = "typing-extensions" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/f1/45/7fa8f56b17dc0f0a41ec70dd307ecd6787254483549843bef4c30ab5adce/lightning_utilities-0.15.3.tar.gz", hash = "sha256:792ae0204c79f6859721ac7f386c237a33b0ed06ba775009cb894e010a842033", size = 33553, upload-time = "2026-02-22T14:48:53.348Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/25/f4/ead6e0e37209b07c9baa3e984ccdb0348ca370b77cea3aaea8ddbb097e00/lightning_utilities-0.15.3-py3-none-any.whl", hash = "sha256:6c55f1bee70084a1cbeaa41ada96e4b3a0fea5909e844dd335bd80f5a73c5f91", size = 31906, upload-time = "2026-02-22T14:48:52.488Z" }, +] + +[[package]] +name = "llvmlite" +version = "0.46.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/74/cd/08ae687ba099c7e3d21fe2ea536500563ef1943c5105bf6ab4ee3829f68e/llvmlite-0.46.0.tar.gz", hash = "sha256:227c9fd6d09dce2783c18b754b7cd9d9b3b3515210c46acc2d3c5badd9870ceb", size = 193456, upload-time = "2025-12-08T18:15:36.295Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/3d/a4/3959e1c61c5ca9db7921e5fd115b344c29b9d57a5dadd87bef97963ca1a5/llvmlite-0.46.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:4323177e936d61ae0f73e653e2e614284d97d14d5dd12579adc92b6c2b0597b0", size = 37232766, upload-time = "2025-12-08T18:14:34.765Z" }, + { url = "https://files.pythonhosted.org/packages/c2/a5/a4d916f1015106e1da876028606a8e87fd5d5c840f98c87bc2d5153b6a2f/llvmlite-0.46.0-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:0a2d461cb89537b7c20feb04c46c32e12d5ad4f0896c9dfc0f60336219ff248e", size = 56275176, upload-time = "2025-12-08T18:14:37.944Z" }, + { url = "https://files.pythonhosted.org/packages/79/7f/a7f2028805dac8c1a6fae7bda4e739b7ebbcd45b29e15bf6d21556fcd3d5/llvmlite-0.46.0-cp310-cp310-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b1f6595a35b7b39c3518b85a28bf18f45e075264e4b2dce3f0c2a4f232b4a910", size = 55128629, upload-time = "2025-12-08T18:14:41.674Z" }, + { url = "https://files.pythonhosted.org/packages/b2/bc/4689e1ba0c073c196b594471eb21be0aa51d9e64b911728aa13cd85ef0ae/llvmlite-0.46.0-cp310-cp310-win_amd64.whl", hash = "sha256:e7a34d4aa6f9a97ee006b504be6d2b8cb7f755b80ab2f344dda1ef992f828559", size = 38138651, upload-time = "2025-12-08T18:14:45.845Z" }, + { url = "https://files.pythonhosted.org/packages/7a/a1/2ad4b2367915faeebe8447f0a057861f646dbf5fbbb3561db42c65659cf3/llvmlite-0.46.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:82f3d39b16f19aa1a56d5fe625883a6ab600d5cc9ea8906cca70ce94cabba067", size = 37232766, upload-time = "2025-12-08T18:14:48.836Z" }, + { url = "https://files.pythonhosted.org/packages/12/b5/99cf8772fdd846c07da4fd70f07812a3c8fd17ea2409522c946bb0f2b277/llvmlite-0.46.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:a3df43900119803bbc52720e758c76f316a9a0f34612a886862dfe0a5591a17e", size = 56275175, upload-time = "2025-12-08T18:14:51.604Z" }, + { url = "https://files.pythonhosted.org/packages/38/f2/ed806f9c003563732da156139c45d970ee435bd0bfa5ed8de87ba972b452/llvmlite-0.46.0-cp311-cp311-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:de183fefc8022d21b0aa37fc3e90410bc3524aed8617f0ff76732fc6c3af5361", size = 55128630, upload-time = "2025-12-08T18:14:55.107Z" }, + { url = "https://files.pythonhosted.org/packages/19/0c/8f5a37a65fc9b7b17408508145edd5f86263ad69c19d3574e818f533a0eb/llvmlite-0.46.0-cp311-cp311-win_amd64.whl", hash = "sha256:e8b10bc585c58bdffec9e0c309bb7d51be1f2f15e169a4b4d42f2389e431eb93", size = 38138652, upload-time = "2025-12-08T18:14:58.171Z" }, + { url = "https://files.pythonhosted.org/packages/2b/f8/4db016a5e547d4e054ff2f3b99203d63a497465f81ab78ec8eb2ff7b2304/llvmlite-0.46.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:6b9588ad4c63b4f0175a3984b85494f0c927c6b001e3a246a3a7fb3920d9a137", size = 37232767, upload-time = "2025-12-08T18:15:00.737Z" }, + { url = "https://files.pythonhosted.org/packages/aa/85/4890a7c14b4fa54400945cb52ac3cd88545bbdb973c440f98ca41591cdc5/llvmlite-0.46.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:3535bd2bb6a2d7ae4012681ac228e5132cdb75fefb1bcb24e33f2f3e0c865ed4", size = 56275176, upload-time = "2025-12-08T18:15:03.936Z" }, + { url = "https://files.pythonhosted.org/packages/6a/07/3d31d39c1a1a08cd5337e78299fca77e6aebc07c059fbd0033e3edfab45c/llvmlite-0.46.0-cp312-cp312-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:4cbfd366e60ff87ea6cc62f50bc4cd800ebb13ed4c149466f50cf2163a473d1e", size = 55128630, upload-time = "2025-12-08T18:15:07.196Z" }, + { url = "https://files.pythonhosted.org/packages/2a/6b/d139535d7590a1bba1ceb68751bef22fadaa5b815bbdf0e858e3875726b2/llvmlite-0.46.0-cp312-cp312-win_amd64.whl", hash = "sha256:398b39db462c39563a97b912d4f2866cd37cba60537975a09679b28fbbc0fb38", size = 38138940, upload-time = "2025-12-08T18:15:10.162Z" }, + { url = "https://files.pythonhosted.org/packages/e6/ff/3eba7eb0aed4b6fca37125387cd417e8c458e750621fce56d2c541f67fa8/llvmlite-0.46.0-cp313-cp313-macosx_12_0_arm64.whl", hash = "sha256:30b60892d034bc560e0ec6654737aaa74e5ca327bd8114d82136aa071d611172", size = 37232767, upload-time = "2025-12-08T18:15:13.22Z" }, + { url = "https://files.pythonhosted.org/packages/0e/54/737755c0a91558364b9200702c3c9c15d70ed63f9b98a2c32f1c2aa1f3ba/llvmlite-0.46.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:6cc19b051753368a9c9f31dc041299059ee91aceec81bd57b0e385e5d5bf1a54", size = 56275176, upload-time = "2025-12-08T18:15:16.339Z" }, + { url = "https://files.pythonhosted.org/packages/e6/91/14f32e1d70905c1c0aa4e6609ab5d705c3183116ca02ac6df2091868413a/llvmlite-0.46.0-cp313-cp313-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:bca185892908f9ede48c0acd547fe4dc1bafefb8a4967d47db6cf664f9332d12", size = 55128629, upload-time = "2025-12-08T18:15:19.493Z" }, + { url = "https://files.pythonhosted.org/packages/4a/a7/d526ae86708cea531935ae777b6dbcabe7db52718e6401e0fb9c5edea80e/llvmlite-0.46.0-cp313-cp313-win_amd64.whl", hash = "sha256:67438fd30e12349ebb054d86a5a1a57fd5e87d264d2451bcfafbbbaa25b82a35", size = 38138941, upload-time = "2025-12-08T18:15:22.536Z" }, + { url = "https://files.pythonhosted.org/packages/95/ae/af0ffb724814cc2ea64445acad05f71cff5f799bb7efb22e47ee99340dbc/llvmlite-0.46.0-cp314-cp314-macosx_12_0_arm64.whl", hash = "sha256:d252edfb9f4ac1fcf20652258e3f102b26b03eef738dc8a6ffdab7d7d341d547", size = 37232768, upload-time = "2025-12-08T18:15:25.055Z" }, + { url = "https://files.pythonhosted.org/packages/c9/19/5018e5352019be753b7b07f7759cdabb69ca5779fea2494be8839270df4c/llvmlite-0.46.0-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:379fdd1c59badeff8982cb47e4694a6143bec3bb49aa10a466e095410522064d", size = 56275173, upload-time = "2025-12-08T18:15:28.109Z" }, + { url = "https://files.pythonhosted.org/packages/9f/c9/d57877759d707e84c082163c543853245f91b70c804115a5010532890f18/llvmlite-0.46.0-cp314-cp314-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:2e8cbfff7f6db0fa2c771ad24154e2a7e457c2444d7673e6de06b8b698c3b269", size = 55128628, upload-time = "2025-12-08T18:15:31.098Z" }, + { url = "https://files.pythonhosted.org/packages/30/a8/e61a8c2b3cc7a597073d9cde1fcbb567e9d827f1db30c93cf80422eac70d/llvmlite-0.46.0-cp314-cp314-win_amd64.whl", hash = "sha256:7821eda3ec1f18050f981819756631d60b6d7ab1a6cf806d9efefbe3f4082d61", size = 39153056, upload-time = "2025-12-08T18:15:33.938Z" }, +] + +[[package]] +name = "mako" +version = "1.3.10" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "markupsafe" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/9e/38/bd5b78a920a64d708fe6bc8e0a2c075e1389d53bef8413725c63ba041535/mako-1.3.10.tar.gz", hash = "sha256:99579a6f39583fa7e5630a28c3c1f440e4e97a414b80372649c0ce338da2ea28", size = 392474, upload-time = "2025-04-10T12:44:31.16Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/87/fb/99f81ac72ae23375f22b7afdb7642aba97c00a713c217124420147681a2f/mako-1.3.10-py3-none-any.whl", hash = "sha256:baef24a52fc4fc514a0887ac600f9f1cff3d82c61d4d700a1fa84d597b88db59", size = 78509, upload-time = "2025-04-10T12:50:53.297Z" }, +] + +[[package]] +name = "markdown-it-py" +version = "4.0.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "mdurl" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/5b/f5/4ec618ed16cc4f8fb3b701563655a69816155e79e24a17b651541804721d/markdown_it_py-4.0.0.tar.gz", hash = "sha256:cb0a2b4aa34f932c007117b194e945bd74e0ec24133ceb5bac59009cda1cb9f3", size = 73070, upload-time = "2025-08-11T12:57:52.854Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/94/54/e7d793b573f298e1c9013b8c4dade17d481164aa517d1d7148619c2cedbf/markdown_it_py-4.0.0-py3-none-any.whl", hash = "sha256:87327c59b172c5011896038353a81343b6754500a08cd7a4973bb48c6d578147", size = 87321, upload-time = "2025-08-11T12:57:51.923Z" }, +] + +[[package]] +name = "markupsafe" +version = "3.0.3" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/7e/99/7690b6d4034fffd95959cbe0c02de8deb3098cc577c67bb6a24fe5d7caa7/markupsafe-3.0.3.tar.gz", hash = "sha256:722695808f4b6457b320fdc131280796bdceb04ab50fe1795cd540799ebe1698", size = 80313, upload-time = "2025-09-27T18:37:40.426Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/e8/4b/3541d44f3937ba468b75da9eebcae497dcf67adb65caa16760b0a6807ebb/markupsafe-3.0.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:2f981d352f04553a7171b8e44369f2af4055f888dfb147d55e42d29e29e74559", size = 11631, upload-time = "2025-09-27T18:36:05.558Z" }, + { url = "https://files.pythonhosted.org/packages/98/1b/fbd8eed11021cabd9226c37342fa6ca4e8a98d8188a8d9b66740494960e4/markupsafe-3.0.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:e1c1493fb6e50ab01d20a22826e57520f1284df32f2d8601fdd90b6304601419", size = 12057, upload-time = "2025-09-27T18:36:07.165Z" }, + { url = "https://files.pythonhosted.org/packages/40/01/e560d658dc0bb8ab762670ece35281dec7b6c1b33f5fbc09ebb57a185519/markupsafe-3.0.3-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:1ba88449deb3de88bd40044603fafffb7bc2b055d626a330323a9ed736661695", size = 22050, upload-time = "2025-09-27T18:36:08.005Z" }, + { url = "https://files.pythonhosted.org/packages/af/cd/ce6e848bbf2c32314c9b237839119c5a564a59725b53157c856e90937b7a/markupsafe-3.0.3-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:f42d0984e947b8adf7dd6dde396e720934d12c506ce84eea8476409563607591", size = 20681, upload-time = "2025-09-27T18:36:08.881Z" }, + { url = "https://files.pythonhosted.org/packages/c9/2a/b5c12c809f1c3045c4d580b035a743d12fcde53cf685dbc44660826308da/markupsafe-3.0.3-cp310-cp310-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:c0c0b3ade1c0b13b936d7970b1d37a57acde9199dc2aecc4c336773e1d86049c", size = 20705, upload-time = "2025-09-27T18:36:10.131Z" }, + { url = "https://files.pythonhosted.org/packages/cf/e3/9427a68c82728d0a88c50f890d0fc072a1484de2f3ac1ad0bfc1a7214fd5/markupsafe-3.0.3-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:0303439a41979d9e74d18ff5e2dd8c43ed6c6001fd40e5bf2e43f7bd9bbc523f", size = 21524, upload-time = "2025-09-27T18:36:11.324Z" }, + { url = "https://files.pythonhosted.org/packages/bc/36/23578f29e9e582a4d0278e009b38081dbe363c5e7165113fad546918a232/markupsafe-3.0.3-cp310-cp310-musllinux_1_2_riscv64.whl", hash = "sha256:d2ee202e79d8ed691ceebae8e0486bd9a2cd4794cec4824e1c99b6f5009502f6", size = 20282, upload-time = "2025-09-27T18:36:12.573Z" }, + { url = "https://files.pythonhosted.org/packages/56/21/dca11354e756ebd03e036bd8ad58d6d7168c80ce1fe5e75218e4945cbab7/markupsafe-3.0.3-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:177b5253b2834fe3678cb4a5f0059808258584c559193998be2601324fdeafb1", size = 20745, upload-time = "2025-09-27T18:36:13.504Z" }, + { url = "https://files.pythonhosted.org/packages/87/99/faba9369a7ad6e4d10b6a5fbf71fa2a188fe4a593b15f0963b73859a1bbd/markupsafe-3.0.3-cp310-cp310-win32.whl", hash = "sha256:2a15a08b17dd94c53a1da0438822d70ebcd13f8c3a95abe3a9ef9f11a94830aa", size = 14571, upload-time = "2025-09-27T18:36:14.779Z" }, + { url = "https://files.pythonhosted.org/packages/d6/25/55dc3ab959917602c96985cb1253efaa4ff42f71194bddeb61eb7278b8be/markupsafe-3.0.3-cp310-cp310-win_amd64.whl", hash = "sha256:c4ffb7ebf07cfe8931028e3e4c85f0357459a3f9f9490886198848f4fa002ec8", size = 15056, upload-time = "2025-09-27T18:36:16.125Z" }, + { url = "https://files.pythonhosted.org/packages/d0/9e/0a02226640c255d1da0b8d12e24ac2aa6734da68bff14c05dd53b94a0fc3/markupsafe-3.0.3-cp310-cp310-win_arm64.whl", hash = "sha256:e2103a929dfa2fcaf9bb4e7c091983a49c9ac3b19c9061b6d5427dd7d14d81a1", size = 13932, upload-time = "2025-09-27T18:36:17.311Z" }, + { url = "https://files.pythonhosted.org/packages/08/db/fefacb2136439fc8dd20e797950e749aa1f4997ed584c62cfb8ef7c2be0e/markupsafe-3.0.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:1cc7ea17a6824959616c525620e387f6dd30fec8cb44f649e31712db02123dad", size = 11631, upload-time = "2025-09-27T18:36:18.185Z" }, + { url = "https://files.pythonhosted.org/packages/e1/2e/5898933336b61975ce9dc04decbc0a7f2fee78c30353c5efba7f2d6ff27a/markupsafe-3.0.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:4bd4cd07944443f5a265608cc6aab442e4f74dff8088b0dfc8238647b8f6ae9a", size = 12058, upload-time = "2025-09-27T18:36:19.444Z" }, + { url = "https://files.pythonhosted.org/packages/1d/09/adf2df3699d87d1d8184038df46a9c80d78c0148492323f4693df54e17bb/markupsafe-3.0.3-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6b5420a1d9450023228968e7e6a9ce57f65d148ab56d2313fcd589eee96a7a50", size = 24287, upload-time = "2025-09-27T18:36:20.768Z" }, + { url = "https://files.pythonhosted.org/packages/30/ac/0273f6fcb5f42e314c6d8cd99effae6a5354604d461b8d392b5ec9530a54/markupsafe-3.0.3-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:0bf2a864d67e76e5c9a34dc26ec616a66b9888e25e7b9460e1c76d3293bd9dbf", size = 22940, upload-time = "2025-09-27T18:36:22.249Z" }, + { url = "https://files.pythonhosted.org/packages/19/ae/31c1be199ef767124c042c6c3e904da327a2f7f0cd63a0337e1eca2967a8/markupsafe-3.0.3-cp311-cp311-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:bc51efed119bc9cfdf792cdeaa4d67e8f6fcccab66ed4bfdd6bde3e59bfcbb2f", size = 21887, upload-time = "2025-09-27T18:36:23.535Z" }, + { url = "https://files.pythonhosted.org/packages/b2/76/7edcab99d5349a4532a459e1fe64f0b0467a3365056ae550d3bcf3f79e1e/markupsafe-3.0.3-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:068f375c472b3e7acbe2d5318dea141359e6900156b5b2ba06a30b169086b91a", size = 23692, upload-time = "2025-09-27T18:36:24.823Z" }, + { url = "https://files.pythonhosted.org/packages/a4/28/6e74cdd26d7514849143d69f0bf2399f929c37dc2b31e6829fd2045b2765/markupsafe-3.0.3-cp311-cp311-musllinux_1_2_riscv64.whl", hash = "sha256:7be7b61bb172e1ed687f1754f8e7484f1c8019780f6f6b0786e76bb01c2ae115", size = 21471, upload-time = "2025-09-27T18:36:25.95Z" }, + { url = "https://files.pythonhosted.org/packages/62/7e/a145f36a5c2945673e590850a6f8014318d5577ed7e5920a4b3448e0865d/markupsafe-3.0.3-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:f9e130248f4462aaa8e2552d547f36ddadbeaa573879158d721bbd33dfe4743a", size = 22923, upload-time = "2025-09-27T18:36:27.109Z" }, + { url = "https://files.pythonhosted.org/packages/0f/62/d9c46a7f5c9adbeeeda52f5b8d802e1094e9717705a645efc71b0913a0a8/markupsafe-3.0.3-cp311-cp311-win32.whl", hash = "sha256:0db14f5dafddbb6d9208827849fad01f1a2609380add406671a26386cdf15a19", size = 14572, upload-time = "2025-09-27T18:36:28.045Z" }, + { url = "https://files.pythonhosted.org/packages/83/8a/4414c03d3f891739326e1783338e48fb49781cc915b2e0ee052aa490d586/markupsafe-3.0.3-cp311-cp311-win_amd64.whl", hash = "sha256:de8a88e63464af587c950061a5e6a67d3632e36df62b986892331d4620a35c01", size = 15077, upload-time = "2025-09-27T18:36:29.025Z" }, + { url = "https://files.pythonhosted.org/packages/35/73/893072b42e6862f319b5207adc9ae06070f095b358655f077f69a35601f0/markupsafe-3.0.3-cp311-cp311-win_arm64.whl", hash = "sha256:3b562dd9e9ea93f13d53989d23a7e775fdfd1066c33494ff43f5418bc8c58a5c", size = 13876, upload-time = "2025-09-27T18:36:29.954Z" }, + { url = "https://files.pythonhosted.org/packages/5a/72/147da192e38635ada20e0a2e1a51cf8823d2119ce8883f7053879c2199b5/markupsafe-3.0.3-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:d53197da72cc091b024dd97249dfc7794d6a56530370992a5e1a08983ad9230e", size = 11615, upload-time = "2025-09-27T18:36:30.854Z" }, + { url = "https://files.pythonhosted.org/packages/9a/81/7e4e08678a1f98521201c3079f77db69fb552acd56067661f8c2f534a718/markupsafe-3.0.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:1872df69a4de6aead3491198eaf13810b565bdbeec3ae2dc8780f14458ec73ce", size = 12020, upload-time = "2025-09-27T18:36:31.971Z" }, + { url = "https://files.pythonhosted.org/packages/1e/2c/799f4742efc39633a1b54a92eec4082e4f815314869865d876824c257c1e/markupsafe-3.0.3-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:3a7e8ae81ae39e62a41ec302f972ba6ae23a5c5396c8e60113e9066ef893da0d", size = 24332, upload-time = "2025-09-27T18:36:32.813Z" }, + { url = "https://files.pythonhosted.org/packages/3c/2e/8d0c2ab90a8c1d9a24f0399058ab8519a3279d1bd4289511d74e909f060e/markupsafe-3.0.3-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:d6dd0be5b5b189d31db7cda48b91d7e0a9795f31430b7f271219ab30f1d3ac9d", size = 22947, upload-time = "2025-09-27T18:36:33.86Z" }, + { url = "https://files.pythonhosted.org/packages/2c/54/887f3092a85238093a0b2154bd629c89444f395618842e8b0c41783898ea/markupsafe-3.0.3-cp312-cp312-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:94c6f0bb423f739146aec64595853541634bde58b2135f27f61c1ffd1cd4d16a", size = 21962, upload-time = "2025-09-27T18:36:35.099Z" }, + { url = "https://files.pythonhosted.org/packages/c9/2f/336b8c7b6f4a4d95e91119dc8521402461b74a485558d8f238a68312f11c/markupsafe-3.0.3-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:be8813b57049a7dc738189df53d69395eba14fb99345e0a5994914a3864c8a4b", size = 23760, upload-time = "2025-09-27T18:36:36.001Z" }, + { url = "https://files.pythonhosted.org/packages/32/43/67935f2b7e4982ffb50a4d169b724d74b62a3964bc1a9a527f5ac4f1ee2b/markupsafe-3.0.3-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:83891d0e9fb81a825d9a6d61e3f07550ca70a076484292a70fde82c4b807286f", size = 21529, upload-time = "2025-09-27T18:36:36.906Z" }, + { url = "https://files.pythonhosted.org/packages/89/e0/4486f11e51bbba8b0c041098859e869e304d1c261e59244baa3d295d47b7/markupsafe-3.0.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:77f0643abe7495da77fb436f50f8dab76dbc6e5fd25d39589a0f1fe6548bfa2b", size = 23015, upload-time = "2025-09-27T18:36:37.868Z" }, + { url = "https://files.pythonhosted.org/packages/2f/e1/78ee7a023dac597a5825441ebd17170785a9dab23de95d2c7508ade94e0e/markupsafe-3.0.3-cp312-cp312-win32.whl", hash = "sha256:d88b440e37a16e651bda4c7c2b930eb586fd15ca7406cb39e211fcff3bf3017d", size = 14540, upload-time = "2025-09-27T18:36:38.761Z" }, + { url = "https://files.pythonhosted.org/packages/aa/5b/bec5aa9bbbb2c946ca2733ef9c4ca91c91b6a24580193e891b5f7dbe8e1e/markupsafe-3.0.3-cp312-cp312-win_amd64.whl", hash = "sha256:26a5784ded40c9e318cfc2bdb30fe164bdb8665ded9cd64d500a34fb42067b1c", size = 15105, upload-time = "2025-09-27T18:36:39.701Z" }, + { url = "https://files.pythonhosted.org/packages/e5/f1/216fc1bbfd74011693a4fd837e7026152e89c4bcf3e77b6692fba9923123/markupsafe-3.0.3-cp312-cp312-win_arm64.whl", hash = "sha256:35add3b638a5d900e807944a078b51922212fb3dedb01633a8defc4b01a3c85f", size = 13906, upload-time = "2025-09-27T18:36:40.689Z" }, + { url = "https://files.pythonhosted.org/packages/38/2f/907b9c7bbba283e68f20259574b13d005c121a0fa4c175f9bed27c4597ff/markupsafe-3.0.3-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:e1cf1972137e83c5d4c136c43ced9ac51d0e124706ee1c8aa8532c1287fa8795", size = 11622, upload-time = "2025-09-27T18:36:41.777Z" }, + { url = "https://files.pythonhosted.org/packages/9c/d9/5f7756922cdd676869eca1c4e3c0cd0df60ed30199ffd775e319089cb3ed/markupsafe-3.0.3-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:116bb52f642a37c115f517494ea5feb03889e04df47eeff5b130b1808ce7c219", size = 12029, upload-time = "2025-09-27T18:36:43.257Z" }, + { url = "https://files.pythonhosted.org/packages/00/07/575a68c754943058c78f30db02ee03a64b3c638586fba6a6dd56830b30a3/markupsafe-3.0.3-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:133a43e73a802c5562be9bbcd03d090aa5a1fe899db609c29e8c8d815c5f6de6", size = 24374, upload-time = "2025-09-27T18:36:44.508Z" }, + { url = "https://files.pythonhosted.org/packages/a9/21/9b05698b46f218fc0e118e1f8168395c65c8a2c750ae2bab54fc4bd4e0e8/markupsafe-3.0.3-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:ccfcd093f13f0f0b7fdd0f198b90053bf7b2f02a3927a30e63f3ccc9df56b676", size = 22980, upload-time = "2025-09-27T18:36:45.385Z" }, + { url = "https://files.pythonhosted.org/packages/7f/71/544260864f893f18b6827315b988c146b559391e6e7e8f7252839b1b846a/markupsafe-3.0.3-cp313-cp313-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:509fa21c6deb7a7a273d629cf5ec029bc209d1a51178615ddf718f5918992ab9", size = 21990, upload-time = "2025-09-27T18:36:46.916Z" }, + { url = "https://files.pythonhosted.org/packages/c2/28/b50fc2f74d1ad761af2f5dcce7492648b983d00a65b8c0e0cb457c82ebbe/markupsafe-3.0.3-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:a4afe79fb3de0b7097d81da19090f4df4f8d3a2b3adaa8764138aac2e44f3af1", size = 23784, upload-time = "2025-09-27T18:36:47.884Z" }, + { url = "https://files.pythonhosted.org/packages/ed/76/104b2aa106a208da8b17a2fb72e033a5a9d7073c68f7e508b94916ed47a9/markupsafe-3.0.3-cp313-cp313-musllinux_1_2_riscv64.whl", hash = "sha256:795e7751525cae078558e679d646ae45574b47ed6e7771863fcc079a6171a0fc", size = 21588, upload-time = "2025-09-27T18:36:48.82Z" }, + { url = "https://files.pythonhosted.org/packages/b5/99/16a5eb2d140087ebd97180d95249b00a03aa87e29cc224056274f2e45fd6/markupsafe-3.0.3-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:8485f406a96febb5140bfeca44a73e3ce5116b2501ac54fe953e488fb1d03b12", size = 23041, upload-time = "2025-09-27T18:36:49.797Z" }, + { url = "https://files.pythonhosted.org/packages/19/bc/e7140ed90c5d61d77cea142eed9f9c303f4c4806f60a1044c13e3f1471d0/markupsafe-3.0.3-cp313-cp313-win32.whl", hash = "sha256:bdd37121970bfd8be76c5fb069c7751683bdf373db1ed6c010162b2a130248ed", size = 14543, upload-time = "2025-09-27T18:36:51.584Z" }, + { url = "https://files.pythonhosted.org/packages/05/73/c4abe620b841b6b791f2edc248f556900667a5a1cf023a6646967ae98335/markupsafe-3.0.3-cp313-cp313-win_amd64.whl", hash = "sha256:9a1abfdc021a164803f4d485104931fb8f8c1efd55bc6b748d2f5774e78b62c5", size = 15113, upload-time = "2025-09-27T18:36:52.537Z" }, + { url = "https://files.pythonhosted.org/packages/f0/3a/fa34a0f7cfef23cf9500d68cb7c32dd64ffd58a12b09225fb03dd37d5b80/markupsafe-3.0.3-cp313-cp313-win_arm64.whl", hash = "sha256:7e68f88e5b8799aa49c85cd116c932a1ac15caaa3f5db09087854d218359e485", size = 13911, upload-time = "2025-09-27T18:36:53.513Z" }, + { url = "https://files.pythonhosted.org/packages/e4/d7/e05cd7efe43a88a17a37b3ae96e79a19e846f3f456fe79c57ca61356ef01/markupsafe-3.0.3-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:218551f6df4868a8d527e3062d0fb968682fe92054e89978594c28e642c43a73", size = 11658, upload-time = "2025-09-27T18:36:54.819Z" }, + { url = "https://files.pythonhosted.org/packages/99/9e/e412117548182ce2148bdeacdda3bb494260c0b0184360fe0d56389b523b/markupsafe-3.0.3-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:3524b778fe5cfb3452a09d31e7b5adefeea8c5be1d43c4f810ba09f2ceb29d37", size = 12066, upload-time = "2025-09-27T18:36:55.714Z" }, + { url = "https://files.pythonhosted.org/packages/bc/e6/fa0ffcda717ef64a5108eaa7b4f5ed28d56122c9a6d70ab8b72f9f715c80/markupsafe-3.0.3-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:4e885a3d1efa2eadc93c894a21770e4bc67899e3543680313b09f139e149ab19", size = 25639, upload-time = "2025-09-27T18:36:56.908Z" }, + { url = "https://files.pythonhosted.org/packages/96/ec/2102e881fe9d25fc16cb4b25d5f5cde50970967ffa5dddafdb771237062d/markupsafe-3.0.3-cp313-cp313t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:8709b08f4a89aa7586de0aadc8da56180242ee0ada3999749b183aa23df95025", size = 23569, upload-time = "2025-09-27T18:36:57.913Z" }, + { url = "https://files.pythonhosted.org/packages/4b/30/6f2fce1f1f205fc9323255b216ca8a235b15860c34b6798f810f05828e32/markupsafe-3.0.3-cp313-cp313t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:b8512a91625c9b3da6f127803b166b629725e68af71f8184ae7e7d54686a56d6", size = 23284, upload-time = "2025-09-27T18:36:58.833Z" }, + { url = "https://files.pythonhosted.org/packages/58/47/4a0ccea4ab9f5dcb6f79c0236d954acb382202721e704223a8aafa38b5c8/markupsafe-3.0.3-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:9b79b7a16f7fedff2495d684f2b59b0457c3b493778c9eed31111be64d58279f", size = 24801, upload-time = "2025-09-27T18:36:59.739Z" }, + { url = "https://files.pythonhosted.org/packages/6a/70/3780e9b72180b6fecb83a4814d84c3bf4b4ae4bf0b19c27196104149734c/markupsafe-3.0.3-cp313-cp313t-musllinux_1_2_riscv64.whl", hash = "sha256:12c63dfb4a98206f045aa9563db46507995f7ef6d83b2f68eda65c307c6829eb", size = 22769, upload-time = "2025-09-27T18:37:00.719Z" }, + { url = "https://files.pythonhosted.org/packages/98/c5/c03c7f4125180fc215220c035beac6b9cb684bc7a067c84fc69414d315f5/markupsafe-3.0.3-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:8f71bc33915be5186016f675cd83a1e08523649b0e33efdb898db577ef5bb009", size = 23642, upload-time = "2025-09-27T18:37:01.673Z" }, + { url = "https://files.pythonhosted.org/packages/80/d6/2d1b89f6ca4bff1036499b1e29a1d02d282259f3681540e16563f27ebc23/markupsafe-3.0.3-cp313-cp313t-win32.whl", hash = "sha256:69c0b73548bc525c8cb9a251cddf1931d1db4d2258e9599c28c07ef3580ef354", size = 14612, upload-time = "2025-09-27T18:37:02.639Z" }, + { url = "https://files.pythonhosted.org/packages/2b/98/e48a4bfba0a0ffcf9925fe2d69240bfaa19c6f7507b8cd09c70684a53c1e/markupsafe-3.0.3-cp313-cp313t-win_amd64.whl", hash = "sha256:1b4b79e8ebf6b55351f0d91fe80f893b4743f104bff22e90697db1590e47a218", size = 15200, upload-time = "2025-09-27T18:37:03.582Z" }, + { url = "https://files.pythonhosted.org/packages/0e/72/e3cc540f351f316e9ed0f092757459afbc595824ca724cbc5a5d4263713f/markupsafe-3.0.3-cp313-cp313t-win_arm64.whl", hash = "sha256:ad2cf8aa28b8c020ab2fc8287b0f823d0a7d8630784c31e9ee5edea20f406287", size = 13973, upload-time = "2025-09-27T18:37:04.929Z" }, + { url = "https://files.pythonhosted.org/packages/33/8a/8e42d4838cd89b7dde187011e97fe6c3af66d8c044997d2183fbd6d31352/markupsafe-3.0.3-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:eaa9599de571d72e2daf60164784109f19978b327a3910d3e9de8c97b5b70cfe", size = 11619, upload-time = "2025-09-27T18:37:06.342Z" }, + { url = "https://files.pythonhosted.org/packages/b5/64/7660f8a4a8e53c924d0fa05dc3a55c9cee10bbd82b11c5afb27d44b096ce/markupsafe-3.0.3-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:c47a551199eb8eb2121d4f0f15ae0f923d31350ab9280078d1e5f12b249e0026", size = 12029, upload-time = "2025-09-27T18:37:07.213Z" }, + { url = "https://files.pythonhosted.org/packages/da/ef/e648bfd021127bef5fa12e1720ffed0c6cbb8310c8d9bea7266337ff06de/markupsafe-3.0.3-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:f34c41761022dd093b4b6896d4810782ffbabe30f2d443ff5f083e0cbbb8c737", size = 24408, upload-time = "2025-09-27T18:37:09.572Z" }, + { url = "https://files.pythonhosted.org/packages/41/3c/a36c2450754618e62008bf7435ccb0f88053e07592e6028a34776213d877/markupsafe-3.0.3-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:457a69a9577064c05a97c41f4e65148652db078a3a509039e64d3467b9e7ef97", size = 23005, upload-time = "2025-09-27T18:37:10.58Z" }, + { url = "https://files.pythonhosted.org/packages/bc/20/b7fdf89a8456b099837cd1dc21974632a02a999ec9bf7ca3e490aacd98e7/markupsafe-3.0.3-cp314-cp314-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:e8afc3f2ccfa24215f8cb28dcf43f0113ac3c37c2f0f0806d8c70e4228c5cf4d", size = 22048, upload-time = "2025-09-27T18:37:11.547Z" }, + { url = "https://files.pythonhosted.org/packages/9a/a7/591f592afdc734f47db08a75793a55d7fbcc6902a723ae4cfbab61010cc5/markupsafe-3.0.3-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:ec15a59cf5af7be74194f7ab02d0f59a62bdcf1a537677ce67a2537c9b87fcda", size = 23821, upload-time = "2025-09-27T18:37:12.48Z" }, + { url = "https://files.pythonhosted.org/packages/7d/33/45b24e4f44195b26521bc6f1a82197118f74df348556594bd2262bda1038/markupsafe-3.0.3-cp314-cp314-musllinux_1_2_riscv64.whl", hash = "sha256:0eb9ff8191e8498cca014656ae6b8d61f39da5f95b488805da4bb029cccbfbaf", size = 21606, upload-time = "2025-09-27T18:37:13.485Z" }, + { url = "https://files.pythonhosted.org/packages/ff/0e/53dfaca23a69fbfbbf17a4b64072090e70717344c52eaaaa9c5ddff1e5f0/markupsafe-3.0.3-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:2713baf880df847f2bece4230d4d094280f4e67b1e813eec43b4c0e144a34ffe", size = 23043, upload-time = "2025-09-27T18:37:14.408Z" }, + { url = "https://files.pythonhosted.org/packages/46/11/f333a06fc16236d5238bfe74daccbca41459dcd8d1fa952e8fbd5dccfb70/markupsafe-3.0.3-cp314-cp314-win32.whl", hash = "sha256:729586769a26dbceff69f7a7dbbf59ab6572b99d94576a5592625d5b411576b9", size = 14747, upload-time = "2025-09-27T18:37:15.36Z" }, + { url = "https://files.pythonhosted.org/packages/28/52/182836104b33b444e400b14f797212f720cbc9ed6ba34c800639d154e821/markupsafe-3.0.3-cp314-cp314-win_amd64.whl", hash = "sha256:bdc919ead48f234740ad807933cdf545180bfbe9342c2bb451556db2ed958581", size = 15341, upload-time = "2025-09-27T18:37:16.496Z" }, + { url = "https://files.pythonhosted.org/packages/6f/18/acf23e91bd94fd7b3031558b1f013adfa21a8e407a3fdb32745538730382/markupsafe-3.0.3-cp314-cp314-win_arm64.whl", hash = "sha256:5a7d5dc5140555cf21a6fefbdbf8723f06fcd2f63ef108f2854de715e4422cb4", size = 14073, upload-time = "2025-09-27T18:37:17.476Z" }, + { url = "https://files.pythonhosted.org/packages/3c/f0/57689aa4076e1b43b15fdfa646b04653969d50cf30c32a102762be2485da/markupsafe-3.0.3-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:1353ef0c1b138e1907ae78e2f6c63ff67501122006b0f9abad68fda5f4ffc6ab", size = 11661, upload-time = "2025-09-27T18:37:18.453Z" }, + { url = "https://files.pythonhosted.org/packages/89/c3/2e67a7ca217c6912985ec766c6393b636fb0c2344443ff9d91404dc4c79f/markupsafe-3.0.3-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:1085e7fbddd3be5f89cc898938f42c0b3c711fdcb37d75221de2666af647c175", size = 12069, upload-time = "2025-09-27T18:37:19.332Z" }, + { url = "https://files.pythonhosted.org/packages/f0/00/be561dce4e6ca66b15276e184ce4b8aec61fe83662cce2f7d72bd3249d28/markupsafe-3.0.3-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:1b52b4fb9df4eb9ae465f8d0c228a00624de2334f216f178a995ccdcf82c4634", size = 25670, upload-time = "2025-09-27T18:37:20.245Z" }, + { url = "https://files.pythonhosted.org/packages/50/09/c419f6f5a92e5fadde27efd190eca90f05e1261b10dbd8cbcb39cd8ea1dc/markupsafe-3.0.3-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:fed51ac40f757d41b7c48425901843666a6677e3e8eb0abcff09e4ba6e664f50", size = 23598, upload-time = "2025-09-27T18:37:21.177Z" }, + { url = "https://files.pythonhosted.org/packages/22/44/a0681611106e0b2921b3033fc19bc53323e0b50bc70cffdd19f7d679bb66/markupsafe-3.0.3-cp314-cp314t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:f190daf01f13c72eac4efd5c430a8de82489d9cff23c364c3ea822545032993e", size = 23261, upload-time = "2025-09-27T18:37:22.167Z" }, + { url = "https://files.pythonhosted.org/packages/5f/57/1b0b3f100259dc9fffe780cfb60d4be71375510e435efec3d116b6436d43/markupsafe-3.0.3-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:e56b7d45a839a697b5eb268c82a71bd8c7f6c94d6fd50c3d577fa39a9f1409f5", size = 24835, upload-time = "2025-09-27T18:37:23.296Z" }, + { url = "https://files.pythonhosted.org/packages/26/6a/4bf6d0c97c4920f1597cc14dd720705eca0bf7c787aebc6bb4d1bead5388/markupsafe-3.0.3-cp314-cp314t-musllinux_1_2_riscv64.whl", hash = "sha256:f3e98bb3798ead92273dc0e5fd0f31ade220f59a266ffd8a4f6065e0a3ce0523", size = 22733, upload-time = "2025-09-27T18:37:24.237Z" }, + { url = "https://files.pythonhosted.org/packages/14/c7/ca723101509b518797fedc2fdf79ba57f886b4aca8a7d31857ba3ee8281f/markupsafe-3.0.3-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:5678211cb9333a6468fb8d8be0305520aa073f50d17f089b5b4b477ea6e67fdc", size = 23672, upload-time = "2025-09-27T18:37:25.271Z" }, + { url = "https://files.pythonhosted.org/packages/fb/df/5bd7a48c256faecd1d36edc13133e51397e41b73bb77e1a69deab746ebac/markupsafe-3.0.3-cp314-cp314t-win32.whl", hash = "sha256:915c04ba3851909ce68ccc2b8e2cd691618c4dc4c4232fb7982bca3f41fd8c3d", size = 14819, upload-time = "2025-09-27T18:37:26.285Z" }, + { url = "https://files.pythonhosted.org/packages/1a/8a/0402ba61a2f16038b48b39bccca271134be00c5c9f0f623208399333c448/markupsafe-3.0.3-cp314-cp314t-win_amd64.whl", hash = "sha256:4faffd047e07c38848ce017e8725090413cd80cbc23d86e55c587bf979e579c9", size = 15426, upload-time = "2025-09-27T18:37:27.316Z" }, + { url = "https://files.pythonhosted.org/packages/70/bc/6f1c2f612465f5fa89b95bead1f44dcb607670fd42891d8fdcd5d039f4f4/markupsafe-3.0.3-cp314-cp314t-win_arm64.whl", hash = "sha256:32001d6a8fc98c8cb5c947787c5d08b0a50663d139f1305bac5885d98d9b40fa", size = 14146, upload-time = "2025-09-27T18:37:28.327Z" }, +] + +[[package]] +name = "matplotlib" +version = "3.10.8" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "contourpy", version = "1.3.2", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, + { name = "contourpy", version = "1.3.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, + { name = "cycler" }, + { name = "fonttools" }, + { name = "kiwisolver" }, + { name = "numpy", version = "2.2.6", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, + { name = "numpy", version = "2.4.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, + { name = "packaging" }, + { name = "pillow" }, + { name = "pyparsing" }, + { name = "python-dateutil" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/8a/76/d3c6e3a13fe484ebe7718d14e269c9569c4eb0020a968a327acb3b9a8fe6/matplotlib-3.10.8.tar.gz", hash = "sha256:2299372c19d56bcd35cf05a2738308758d32b9eaed2371898d8f5bd33f084aa3", size = 34806269, upload-time = "2025-12-10T22:56:51.155Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/58/be/a30bd917018ad220c400169fba298f2bb7003c8ccbc0c3e24ae2aacad1e8/matplotlib-3.10.8-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:00270d217d6b20d14b584c521f810d60c5c78406dc289859776550df837dcda7", size = 8239828, upload-time = "2025-12-10T22:55:02.313Z" }, + { url = "https://files.pythonhosted.org/packages/58/27/ca01e043c4841078e82cf6e80a6993dfecd315c3d79f5f3153afbb8e1ec6/matplotlib-3.10.8-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:37b3c1cc42aa184b3f738cfa18c1c1d72fd496d85467a6cf7b807936d39aa656", size = 8128050, upload-time = "2025-12-10T22:55:04.997Z" }, + { url = "https://files.pythonhosted.org/packages/cb/aa/7ab67f2b729ae6a91bcf9dcac0affb95fb8c56f7fd2b2af894ae0b0cf6fa/matplotlib-3.10.8-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:ee40c27c795bda6a5292e9cff9890189d32f7e3a0bf04e0e3c9430c4a00c37df", size = 8700452, upload-time = "2025-12-10T22:55:07.47Z" }, + { url = "https://files.pythonhosted.org/packages/73/ae/2d5817b0acee3c49b7e7ccfbf5b273f284957cc8e270adf36375db353190/matplotlib-3.10.8-cp310-cp310-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:a48f2b74020919552ea25d222d5cc6af9ca3f4eb43a93e14d068457f545c2a17", size = 9534928, upload-time = "2025-12-10T22:55:10.566Z" }, + { url = "https://files.pythonhosted.org/packages/c9/5b/8e66653e9f7c39cb2e5cab25fce4810daffa2bff02cbf5f3077cea9e942c/matplotlib-3.10.8-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:f254d118d14a7f99d616271d6c3c27922c092dac11112670b157798b89bf4933", size = 9586377, upload-time = "2025-12-10T22:55:12.362Z" }, + { url = "https://files.pythonhosted.org/packages/e2/e2/fd0bbadf837f81edb0d208ba8f8cb552874c3b16e27cb91a31977d90875d/matplotlib-3.10.8-cp310-cp310-win_amd64.whl", hash = "sha256:f9b587c9c7274c1613a30afabf65a272114cd6cdbe67b3406f818c79d7ab2e2a", size = 8128127, upload-time = "2025-12-10T22:55:14.436Z" }, + { url = "https://files.pythonhosted.org/packages/f8/86/de7e3a1cdcfc941483af70609edc06b83e7c8a0e0dc9ac325200a3f4d220/matplotlib-3.10.8-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:6be43b667360fef5c754dda5d25a32e6307a03c204f3c0fc5468b78fa87b4160", size = 8251215, upload-time = "2025-12-10T22:55:16.175Z" }, + { url = "https://files.pythonhosted.org/packages/fd/14/baad3222f424b19ce6ad243c71de1ad9ec6b2e4eb1e458a48fdc6d120401/matplotlib-3.10.8-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:a2b336e2d91a3d7006864e0990c83b216fcdca64b5a6484912902cef87313d78", size = 8139625, upload-time = "2025-12-10T22:55:17.712Z" }, + { url = "https://files.pythonhosted.org/packages/8f/a0/7024215e95d456de5883e6732e708d8187d9753a21d32f8ddb3befc0c445/matplotlib-3.10.8-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:efb30e3baaea72ce5928e32bab719ab4770099079d66726a62b11b1ef7273be4", size = 8712614, upload-time = "2025-12-10T22:55:20.8Z" }, + { url = "https://files.pythonhosted.org/packages/5a/f4/b8347351da9a5b3f41e26cf547252d861f685c6867d179a7c9d60ad50189/matplotlib-3.10.8-cp311-cp311-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:d56a1efd5bfd61486c8bc968fa18734464556f0fb8e51690f4ac25d85cbbbbc2", size = 9540997, upload-time = "2025-12-10T22:55:23.258Z" }, + { url = "https://files.pythonhosted.org/packages/9e/c0/c7b914e297efe0bc36917bf216b2acb91044b91e930e878ae12981e461e5/matplotlib-3.10.8-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:238b7ce5717600615c895050239ec955d91f321c209dd110db988500558e70d6", size = 9596825, upload-time = "2025-12-10T22:55:25.217Z" }, + { url = "https://files.pythonhosted.org/packages/6f/d3/a4bbc01c237ab710a1f22b4da72f4ff6d77eb4c7735ea9811a94ae239067/matplotlib-3.10.8-cp311-cp311-win_amd64.whl", hash = "sha256:18821ace09c763ec93aef5eeff087ee493a24051936d7b9ebcad9662f66501f9", size = 8135090, upload-time = "2025-12-10T22:55:27.162Z" }, + { url = "https://files.pythonhosted.org/packages/89/dd/a0b6588f102beab33ca6f5218b31725216577b2a24172f327eaf6417d5c9/matplotlib-3.10.8-cp311-cp311-win_arm64.whl", hash = "sha256:bab485bcf8b1c7d2060b4fcb6fc368a9e6f4cd754c9c2fea281f4be21df394a2", size = 8012377, upload-time = "2025-12-10T22:55:29.185Z" }, + { url = "https://files.pythonhosted.org/packages/9e/67/f997cdcbb514012eb0d10cd2b4b332667997fb5ebe26b8d41d04962fa0e6/matplotlib-3.10.8-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:64fcc24778ca0404ce0cb7b6b77ae1f4c7231cdd60e6778f999ee05cbd581b9a", size = 8260453, upload-time = "2025-12-10T22:55:30.709Z" }, + { url = "https://files.pythonhosted.org/packages/7e/65/07d5f5c7f7c994f12c768708bd2e17a4f01a2b0f44a1c9eccad872433e2e/matplotlib-3.10.8-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:b9a5ca4ac220a0cdd1ba6bcba3608547117d30468fefce49bb26f55c1a3d5c58", size = 8148321, upload-time = "2025-12-10T22:55:33.265Z" }, + { url = "https://files.pythonhosted.org/packages/3e/f3/c5195b1ae57ef85339fd7285dfb603b22c8b4e79114bae5f4f0fcf688677/matplotlib-3.10.8-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:3ab4aabc72de4ff77b3ec33a6d78a68227bf1123465887f9905ba79184a1cc04", size = 8716944, upload-time = "2025-12-10T22:55:34.922Z" }, + { url = "https://files.pythonhosted.org/packages/00/f9/7638f5cc82ec8a7aa005de48622eecc3ed7c9854b96ba15bd76b7fd27574/matplotlib-3.10.8-cp312-cp312-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:24d50994d8c5816ddc35411e50a86ab05f575e2530c02752e02538122613371f", size = 9550099, upload-time = "2025-12-10T22:55:36.789Z" }, + { url = "https://files.pythonhosted.org/packages/57/61/78cd5920d35b29fd2a0fe894de8adf672ff52939d2e9b43cb83cd5ce1bc7/matplotlib-3.10.8-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:99eefd13c0dc3b3c1b4d561c1169e65fe47aab7b8158754d7c084088e2329466", size = 9613040, upload-time = "2025-12-10T22:55:38.715Z" }, + { url = "https://files.pythonhosted.org/packages/30/4e/c10f171b6e2f44d9e3a2b96efa38b1677439d79c99357600a62cc1e9594e/matplotlib-3.10.8-cp312-cp312-win_amd64.whl", hash = "sha256:dd80ecb295460a5d9d260df63c43f4afbdd832d725a531f008dad1664f458adf", size = 8142717, upload-time = "2025-12-10T22:55:41.103Z" }, + { url = "https://files.pythonhosted.org/packages/f1/76/934db220026b5fef85f45d51a738b91dea7d70207581063cd9bd8fafcf74/matplotlib-3.10.8-cp312-cp312-win_arm64.whl", hash = "sha256:3c624e43ed56313651bc18a47f838b60d7b8032ed348911c54906b130b20071b", size = 8012751, upload-time = "2025-12-10T22:55:42.684Z" }, + { url = "https://files.pythonhosted.org/packages/3d/b9/15fd5541ef4f5b9a17eefd379356cf12175fe577424e7b1d80676516031a/matplotlib-3.10.8-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:3f2e409836d7f5ac2f1c013110a4d50b9f7edc26328c108915f9075d7d7a91b6", size = 8261076, upload-time = "2025-12-10T22:55:44.648Z" }, + { url = "https://files.pythonhosted.org/packages/8d/a0/2ba3473c1b66b9c74dc7107c67e9008cb1782edbe896d4c899d39ae9cf78/matplotlib-3.10.8-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:56271f3dac49a88d7fca5060f004d9d22b865f743a12a23b1e937a0be4818ee1", size = 8148794, upload-time = "2025-12-10T22:55:46.252Z" }, + { url = "https://files.pythonhosted.org/packages/75/97/a471f1c3eb1fd6f6c24a31a5858f443891d5127e63a7788678d14e249aea/matplotlib-3.10.8-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:a0a7f52498f72f13d4a25ea70f35f4cb60642b466cbb0a9be951b5bc3f45a486", size = 8718474, upload-time = "2025-12-10T22:55:47.864Z" }, + { url = "https://files.pythonhosted.org/packages/01/be/cd478f4b66f48256f42927d0acbcd63a26a893136456cd079c0cc24fbabf/matplotlib-3.10.8-cp313-cp313-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:646d95230efb9ca614a7a594d4fcacde0ac61d25e37dd51710b36477594963ce", size = 9549637, upload-time = "2025-12-10T22:55:50.048Z" }, + { url = "https://files.pythonhosted.org/packages/5d/7c/8dc289776eae5109e268c4fb92baf870678dc048a25d4ac903683b86d5bf/matplotlib-3.10.8-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:f89c151aab2e2e23cb3fe0acad1e8b82841fd265379c4cecd0f3fcb34c15e0f6", size = 9613678, upload-time = "2025-12-10T22:55:52.21Z" }, + { url = "https://files.pythonhosted.org/packages/64/40/37612487cc8a437d4dd261b32ca21fe2d79510fe74af74e1f42becb1bdb8/matplotlib-3.10.8-cp313-cp313-win_amd64.whl", hash = "sha256:e8ea3e2d4066083e264e75c829078f9e149fa119d27e19acd503de65e0b13149", size = 8142686, upload-time = "2025-12-10T22:55:54.253Z" }, + { url = "https://files.pythonhosted.org/packages/66/52/8d8a8730e968185514680c2a6625943f70269509c3dcfc0dcf7d75928cb8/matplotlib-3.10.8-cp313-cp313-win_arm64.whl", hash = "sha256:c108a1d6fa78a50646029cb6d49808ff0fc1330fda87fa6f6250c6b5369b6645", size = 8012917, upload-time = "2025-12-10T22:55:56.268Z" }, + { url = "https://files.pythonhosted.org/packages/b5/27/51fe26e1062f298af5ef66343d8ef460e090a27fea73036c76c35821df04/matplotlib-3.10.8-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:ad3d9833a64cf48cc4300f2b406c3d0f4f4724a91c0bd5640678a6ba7c102077", size = 8305679, upload-time = "2025-12-10T22:55:57.856Z" }, + { url = "https://files.pythonhosted.org/packages/2c/1e/4de865bc591ac8e3062e835f42dd7fe7a93168d519557837f0e37513f629/matplotlib-3.10.8-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:eb3823f11823deade26ce3b9f40dcb4a213da7a670013929f31d5f5ed1055b22", size = 8198336, upload-time = "2025-12-10T22:55:59.371Z" }, + { url = "https://files.pythonhosted.org/packages/c6/cb/2f7b6e75fb4dce87ef91f60cac4f6e34f4c145ab036a22318ec837971300/matplotlib-3.10.8-cp313-cp313t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:d9050fee89a89ed57b4fb2c1bfac9a3d0c57a0d55aed95949eedbc42070fea39", size = 8731653, upload-time = "2025-12-10T22:56:01.032Z" }, + { url = "https://files.pythonhosted.org/packages/46/b3/bd9c57d6ba670a37ab31fb87ec3e8691b947134b201f881665b28cc039ff/matplotlib-3.10.8-cp313-cp313t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b44d07310e404ba95f8c25aa5536f154c0a8ec473303535949e52eb71d0a1565", size = 9561356, upload-time = "2025-12-10T22:56:02.95Z" }, + { url = "https://files.pythonhosted.org/packages/c0/3d/8b94a481456dfc9dfe6e39e93b5ab376e50998cddfd23f4ae3b431708f16/matplotlib-3.10.8-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:0a33deb84c15ede243aead39f77e990469fff93ad1521163305095b77b72ce4a", size = 9614000, upload-time = "2025-12-10T22:56:05.411Z" }, + { url = "https://files.pythonhosted.org/packages/bd/cd/bc06149fe5585ba800b189a6a654a75f1f127e8aab02fd2be10df7fa500c/matplotlib-3.10.8-cp313-cp313t-win_amd64.whl", hash = "sha256:3a48a78d2786784cc2413e57397981fb45c79e968d99656706018d6e62e57958", size = 8220043, upload-time = "2025-12-10T22:56:07.551Z" }, + { url = "https://files.pythonhosted.org/packages/e3/de/b22cf255abec916562cc04eef457c13e58a1990048de0c0c3604d082355e/matplotlib-3.10.8-cp313-cp313t-win_arm64.whl", hash = "sha256:15d30132718972c2c074cd14638c7f4592bd98719e2308bccea40e0538bc0cb5", size = 8062075, upload-time = "2025-12-10T22:56:09.178Z" }, + { url = "https://files.pythonhosted.org/packages/3c/43/9c0ff7a2f11615e516c3b058e1e6e8f9614ddeca53faca06da267c48345d/matplotlib-3.10.8-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:b53285e65d4fa4c86399979e956235deb900be5baa7fc1218ea67fbfaeaadd6f", size = 8262481, upload-time = "2025-12-10T22:56:10.885Z" }, + { url = "https://files.pythonhosted.org/packages/6f/ca/e8ae28649fcdf039fda5ef554b40a95f50592a3c47e6f7270c9561c12b07/matplotlib-3.10.8-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:32f8dce744be5569bebe789e46727946041199030db8aeb2954d26013a0eb26b", size = 8151473, upload-time = "2025-12-10T22:56:12.377Z" }, + { url = "https://files.pythonhosted.org/packages/f1/6f/009d129ae70b75e88cbe7e503a12a4c0670e08ed748a902c2568909e9eb5/matplotlib-3.10.8-cp314-cp314-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:4cf267add95b1c88300d96ca837833d4112756045364f5c734a2276038dae27d", size = 9553896, upload-time = "2025-12-10T22:56:14.432Z" }, + { url = "https://files.pythonhosted.org/packages/f5/26/4221a741eb97967bc1fd5e4c52b9aa5a91b2f4ec05b59f6def4d820f9df9/matplotlib-3.10.8-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:2cf5bd12cecf46908f286d7838b2abc6c91cda506c0445b8223a7c19a00df008", size = 9824193, upload-time = "2025-12-10T22:56:16.29Z" }, + { url = "https://files.pythonhosted.org/packages/1f/f3/3abf75f38605772cf48a9daf5821cd4f563472f38b4b828c6fba6fa6d06e/matplotlib-3.10.8-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:41703cc95688f2516b480f7f339d8851a6035f18e100ee6a32bc0b8536a12a9c", size = 9615444, upload-time = "2025-12-10T22:56:18.155Z" }, + { url = "https://files.pythonhosted.org/packages/93/a5/de89ac80f10b8dc615807ee1133cd99ac74082581196d4d9590bea10690d/matplotlib-3.10.8-cp314-cp314-win_amd64.whl", hash = "sha256:83d282364ea9f3e52363da262ce32a09dfe241e4080dcedda3c0db059d3c1f11", size = 8272719, upload-time = "2025-12-10T22:56:20.366Z" }, + { url = "https://files.pythonhosted.org/packages/69/ce/b006495c19ccc0a137b48083168a37bd056392dee02f87dba0472f2797fe/matplotlib-3.10.8-cp314-cp314-win_arm64.whl", hash = "sha256:2c1998e92cd5999e295a731bcb2911c75f597d937341f3030cc24ef2733d78a8", size = 8144205, upload-time = "2025-12-10T22:56:22.239Z" }, + { url = "https://files.pythonhosted.org/packages/68/d9/b31116a3a855bd313c6fcdb7226926d59b041f26061c6c5b1be66a08c826/matplotlib-3.10.8-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:b5a2b97dbdc7d4f353ebf343744f1d1f1cca8aa8bfddb4262fcf4306c3761d50", size = 8305785, upload-time = "2025-12-10T22:56:24.218Z" }, + { url = "https://files.pythonhosted.org/packages/1e/90/6effe8103f0272685767ba5f094f453784057072f49b393e3ea178fe70a5/matplotlib-3.10.8-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:3f5c3e4da343bba819f0234186b9004faba952cc420fbc522dc4e103c1985908", size = 8198361, upload-time = "2025-12-10T22:56:26.787Z" }, + { url = "https://files.pythonhosted.org/packages/d7/65/a73188711bea603615fc0baecca1061429ac16940e2385433cc778a9d8e7/matplotlib-3.10.8-cp314-cp314t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:5f62550b9a30afde8c1c3ae450e5eb547d579dd69b25c2fc7a1c67f934c1717a", size = 9561357, upload-time = "2025-12-10T22:56:28.953Z" }, + { url = "https://files.pythonhosted.org/packages/f4/3d/b5c5d5d5be8ce63292567f0e2c43dde9953d3ed86ac2de0a72e93c8f07a1/matplotlib-3.10.8-cp314-cp314t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:495672de149445ec1b772ff2c9ede9b769e3cb4f0d0aa7fa730d7f59e2d4e1c1", size = 9823610, upload-time = "2025-12-10T22:56:31.455Z" }, + { url = "https://files.pythonhosted.org/packages/4d/4b/e7beb6bbd49f6bae727a12b270a2654d13c397576d25bd6786e47033300f/matplotlib-3.10.8-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:595ba4d8fe983b88f0eec8c26a241e16d6376fe1979086232f481f8f3f67494c", size = 9614011, upload-time = "2025-12-10T22:56:33.85Z" }, + { url = "https://files.pythonhosted.org/packages/7c/e6/76f2813d31f032e65f6f797e3f2f6e4aab95b65015924b1c51370395c28a/matplotlib-3.10.8-cp314-cp314t-win_amd64.whl", hash = "sha256:25d380fe8b1dc32cf8f0b1b448470a77afb195438bafdf1d858bfb876f3edf7b", size = 8362801, upload-time = "2025-12-10T22:56:36.107Z" }, + { url = "https://files.pythonhosted.org/packages/5d/49/d651878698a0b67f23aa28e17f45a6d6dd3d3f933fa29087fa4ce5947b5a/matplotlib-3.10.8-cp314-cp314t-win_arm64.whl", hash = "sha256:113bb52413ea508ce954a02c10ffd0d565f9c3bc7f2eddc27dfe1731e71c7b5f", size = 8192560, upload-time = "2025-12-10T22:56:38.008Z" }, + { url = "https://files.pythonhosted.org/packages/f5/43/31d59500bb950b0d188e149a2e552040528c13d6e3d6e84d0cccac593dcd/matplotlib-3.10.8-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:f97aeb209c3d2511443f8797e3e5a569aebb040d4f8bc79aa3ee78a8fb9e3dd8", size = 8237252, upload-time = "2025-12-10T22:56:39.529Z" }, + { url = "https://files.pythonhosted.org/packages/0c/2c/615c09984f3c5f907f51c886538ad785cf72e0e11a3225de2c0f9442aecc/matplotlib-3.10.8-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:fb061f596dad3a0f52b60dc6a5dec4a0c300dec41e058a7efe09256188d170b7", size = 8124693, upload-time = "2025-12-10T22:56:41.758Z" }, + { url = "https://files.pythonhosted.org/packages/91/e1/2757277a1c56041e1fc104b51a0f7b9a4afc8eb737865d63cababe30bc61/matplotlib-3.10.8-pp310-pypy310_pp73-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:12d90df9183093fcd479f4172ac26b322b1248b15729cb57f42f71f24c7e37a3", size = 8702205, upload-time = "2025-12-10T22:56:43.415Z" }, + { url = "https://files.pythonhosted.org/packages/04/30/3afaa31c757f34b7725ab9d2ba8b48b5e89c2019c003e7d0ead143aabc5a/matplotlib-3.10.8-pp311-pypy311_pp73-macosx_10_15_x86_64.whl", hash = "sha256:6da7c2ce169267d0d066adcf63758f0604aa6c3eebf67458930f9d9b79ad1db1", size = 8249198, upload-time = "2025-12-10T22:56:45.584Z" }, + { url = "https://files.pythonhosted.org/packages/48/2f/6334aec331f57485a642a7c8be03cb286f29111ae71c46c38b363230063c/matplotlib-3.10.8-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:9153c3292705be9f9c64498a8872118540c3f4123d1a1c840172edf262c8be4a", size = 8136817, upload-time = "2025-12-10T22:56:47.339Z" }, + { url = "https://files.pythonhosted.org/packages/73/e4/6d6f14b2a759c622f191b2d67e9075a3f56aaccb3be4bb9bb6890030d0a0/matplotlib-3.10.8-pp311-pypy311_pp73-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:1ae029229a57cd1e8fe542485f27e7ca7b23aa9e8944ddb4985d0bc444f1eca2", size = 8713867, upload-time = "2025-12-10T22:56:48.954Z" }, +] + +[[package]] +name = "mdurl" +version = "0.1.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/d6/54/cfe61301667036ec958cb99bd3efefba235e65cdeb9c84d24a8293ba1d90/mdurl-0.1.2.tar.gz", hash = "sha256:bb413d29f5eea38f31dd4754dd7377d4465116fb207585f97bf925588687c1ba", size = 8729, upload-time = "2022-08-14T12:40:10.846Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/b3/38/89ba8ad64ae25be8de66a6d463314cf1eb366222074cfda9ee839c56a4b4/mdurl-0.1.2-py3-none-any.whl", hash = "sha256:84008a41e51615a49fc9966191ff91509e3c40b939176e643fd50a5c2196b8f8", size = 9979, upload-time = "2022-08-14T12:40:09.779Z" }, +] + +[[package]] +name = "ml-dtypes" +version = "0.5.4" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "numpy", version = "2.2.6", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, + { name = "numpy", version = "2.4.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/0e/4a/c27b42ed9b1c7d13d9ba8b6905dece787d6259152f2309338aed29b2447b/ml_dtypes-0.5.4.tar.gz", hash = "sha256:8ab06a50fb9bf9666dd0fe5dfb4676fa2b0ac0f31ecff72a6c3af8e22c063453", size = 692314, upload-time = "2025-11-17T22:32:31.031Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/fe/3a/c5b855752a70267ff729c349e650263adb3c206c29d28cc8ea7ace30a1d5/ml_dtypes-0.5.4-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:b95e97e470fe60ed493fd9ae3911d8da4ebac16bd21f87ffa2b7c588bf22ea2c", size = 679735, upload-time = "2025-11-17T22:31:31.367Z" }, + { url = "https://files.pythonhosted.org/packages/41/79/7433f30ee04bd4faa303844048f55e1eb939131c8e5195a00a96a0939b64/ml_dtypes-0.5.4-cp310-cp310-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b4b801ebe0b477be666696bda493a9be8356f1f0057a57f1e35cd26928823e5a", size = 5051883, upload-time = "2025-11-17T22:31:33.658Z" }, + { url = "https://files.pythonhosted.org/packages/10/b1/8938e8830b0ee2e167fc75a094dea766a1152bde46752cd9bfc57ee78a82/ml_dtypes-0.5.4-cp310-cp310-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:388d399a2152dd79a3f0456a952284a99ee5c93d3e2f8dfe25977511e0515270", size = 5030369, upload-time = "2025-11-17T22:31:35.595Z" }, + { url = "https://files.pythonhosted.org/packages/c7/a3/51886727bd16e2f47587997b802dd56398692ce8c6c03c2e5bb32ecafe26/ml_dtypes-0.5.4-cp310-cp310-win_amd64.whl", hash = "sha256:4ff7f3e7ca2972e7de850e7b8fcbb355304271e2933dd90814c1cb847414d6e2", size = 210738, upload-time = "2025-11-17T22:31:37.43Z" }, + { url = "https://files.pythonhosted.org/packages/c6/5e/712092cfe7e5eb667b8ad9ca7c54442f21ed7ca8979745f1000e24cf8737/ml_dtypes-0.5.4-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:6c7ecb74c4bd71db68a6bea1edf8da8c34f3d9fe218f038814fd1d310ac76c90", size = 679734, upload-time = "2025-11-17T22:31:39.223Z" }, + { url = "https://files.pythonhosted.org/packages/4f/cf/912146dfd4b5c0eea956836c01dcd2fce6c9c844b2691f5152aca196ce4f/ml_dtypes-0.5.4-cp311-cp311-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:bc11d7e8c44a65115d05e2ab9989d1e045125d7be8e05a071a48bc76eb6d6040", size = 5056165, upload-time = "2025-11-17T22:31:41.071Z" }, + { url = "https://files.pythonhosted.org/packages/a9/80/19189ea605017473660e43762dc853d2797984b3c7bf30ce656099add30c/ml_dtypes-0.5.4-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:19b9a53598f21e453ea2fbda8aa783c20faff8e1eeb0d7ab899309a0053f1483", size = 5034975, upload-time = "2025-11-17T22:31:42.758Z" }, + { url = "https://files.pythonhosted.org/packages/b4/24/70bd59276883fdd91600ca20040b41efd4902a923283c4d6edcb1de128d2/ml_dtypes-0.5.4-cp311-cp311-win_amd64.whl", hash = "sha256:7c23c54a00ae43edf48d44066a7ec31e05fdc2eee0be2b8b50dd1903a1db94bb", size = 210742, upload-time = "2025-11-17T22:31:44.068Z" }, + { url = "https://files.pythonhosted.org/packages/a0/c9/64230ef14e40aa3f1cb254ef623bf812735e6bec7772848d19131111ac0d/ml_dtypes-0.5.4-cp311-cp311-win_arm64.whl", hash = "sha256:557a31a390b7e9439056644cb80ed0735a6e3e3bb09d67fd5687e4b04238d1de", size = 160709, upload-time = "2025-11-17T22:31:46.557Z" }, + { url = "https://files.pythonhosted.org/packages/a8/b8/3c70881695e056f8a32f8b941126cf78775d9a4d7feba8abcb52cb7b04f2/ml_dtypes-0.5.4-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:a174837a64f5b16cab6f368171a1a03a27936b31699d167684073ff1c4237dac", size = 676927, upload-time = "2025-11-17T22:31:48.182Z" }, + { url = "https://files.pythonhosted.org/packages/54/0f/428ef6881782e5ebb7eca459689448c0394fa0a80bea3aa9262cba5445ea/ml_dtypes-0.5.4-cp312-cp312-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:a7f7c643e8b1320fd958bf098aa7ecf70623a42ec5154e3be3be673f4c34d900", size = 5028464, upload-time = "2025-11-17T22:31:50.135Z" }, + { url = "https://files.pythonhosted.org/packages/3a/cb/28ce52eb94390dda42599c98ea0204d74799e4d8047a0eb559b6fd648056/ml_dtypes-0.5.4-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:9ad459e99793fa6e13bd5b7e6792c8f9190b4e5a1b45c63aba14a4d0a7f1d5ff", size = 5009002, upload-time = "2025-11-17T22:31:52.001Z" }, + { url = "https://files.pythonhosted.org/packages/f5/f0/0cfadd537c5470378b1b32bd859cf2824972174b51b873c9d95cfd7475a5/ml_dtypes-0.5.4-cp312-cp312-win_amd64.whl", hash = "sha256:c1a953995cccb9e25a4ae19e34316671e4e2edaebe4cf538229b1fc7109087b7", size = 212222, upload-time = "2025-11-17T22:31:53.742Z" }, + { url = "https://files.pythonhosted.org/packages/16/2e/9acc86985bfad8f2c2d30291b27cd2bb4c74cea08695bd540906ed744249/ml_dtypes-0.5.4-cp312-cp312-win_arm64.whl", hash = "sha256:9bad06436568442575beb2d03389aa7456c690a5b05892c471215bfd8cf39460", size = 160793, upload-time = "2025-11-17T22:31:55.358Z" }, + { url = "https://files.pythonhosted.org/packages/d9/a1/4008f14bbc616cfb1ac5b39ea485f9c63031c4634ab3f4cf72e7541f816a/ml_dtypes-0.5.4-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:8c760d85a2f82e2bed75867079188c9d18dae2ee77c25a54d60e9cc79be1bc48", size = 676888, upload-time = "2025-11-17T22:31:56.907Z" }, + { url = "https://files.pythonhosted.org/packages/d3/b7/dff378afc2b0d5a7d6cd9d3209b60474d9819d1189d347521e1688a60a53/ml_dtypes-0.5.4-cp313-cp313-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ce756d3a10d0c4067172804c9cc276ba9cc0ff47af9078ad439b075d1abdc29b", size = 5036993, upload-time = "2025-11-17T22:31:58.497Z" }, + { url = "https://files.pythonhosted.org/packages/eb/33/40cd74219417e78b97c47802037cf2d87b91973e18bb968a7da48a96ea44/ml_dtypes-0.5.4-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:533ce891ba774eabf607172254f2e7260ba5f57bdd64030c9a4fcfbd99815d0d", size = 5010956, upload-time = "2025-11-17T22:31:59.931Z" }, + { url = "https://files.pythonhosted.org/packages/e1/8b/200088c6859d8221454825959df35b5244fa9bdf263fd0249ac5fb75e281/ml_dtypes-0.5.4-cp313-cp313-win_amd64.whl", hash = "sha256:f21c9219ef48ca5ee78402d5cc831bd58ea27ce89beda894428bc67a52da5328", size = 212224, upload-time = "2025-11-17T22:32:01.349Z" }, + { url = "https://files.pythonhosted.org/packages/8f/75/dfc3775cb36367816e678f69a7843f6f03bd4e2bcd79941e01ea960a068e/ml_dtypes-0.5.4-cp313-cp313-win_arm64.whl", hash = "sha256:35f29491a3e478407f7047b8a4834e4640a77d2737e0b294d049746507af5175", size = 160798, upload-time = "2025-11-17T22:32:02.864Z" }, + { url = "https://files.pythonhosted.org/packages/4f/74/e9ddb35fd1dd43b1106c20ced3f53c2e8e7fc7598c15638e9f80677f81d4/ml_dtypes-0.5.4-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:304ad47faa395415b9ccbcc06a0350800bc50eda70f0e45326796e27c62f18b6", size = 702083, upload-time = "2025-11-17T22:32:04.08Z" }, + { url = "https://files.pythonhosted.org/packages/74/f5/667060b0aed1aa63166b22897fdf16dca9eb704e6b4bbf86848d5a181aa7/ml_dtypes-0.5.4-cp313-cp313t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6a0df4223b514d799b8a1629c65ddc351b3efa833ccf7f8ea0cf654a61d1e35d", size = 5354111, upload-time = "2025-11-17T22:32:05.546Z" }, + { url = "https://files.pythonhosted.org/packages/40/49/0f8c498a28c0efa5f5c95a9e374c83ec1385ca41d0e85e7cf40e5d519a21/ml_dtypes-0.5.4-cp313-cp313t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:531eff30e4d368cb6255bc2328d070e35836aa4f282a0fb5f3a0cd7260257298", size = 5366453, upload-time = "2025-11-17T22:32:07.115Z" }, + { url = "https://files.pythonhosted.org/packages/8c/27/12607423d0a9c6bbbcc780ad19f1f6baa2b68b18ce4bddcdc122c4c68dc9/ml_dtypes-0.5.4-cp313-cp313t-win_amd64.whl", hash = "sha256:cb73dccfc991691c444acc8c0012bee8f2470da826a92e3a20bb333b1a7894e6", size = 225612, upload-time = "2025-11-17T22:32:08.615Z" }, + { url = "https://files.pythonhosted.org/packages/e5/80/5a5929e92c72936d5b19872c5fb8fc09327c1da67b3b68c6a13139e77e20/ml_dtypes-0.5.4-cp313-cp313t-win_arm64.whl", hash = "sha256:3bbbe120b915090d9dd1375e4684dd17a20a2491ef25d640a908281da85e73f1", size = 164145, upload-time = "2025-11-17T22:32:09.782Z" }, + { url = "https://files.pythonhosted.org/packages/72/4e/1339dc6e2557a344f5ba5590872e80346f76f6cb2ac3dd16e4666e88818c/ml_dtypes-0.5.4-cp314-cp314-macosx_10_13_universal2.whl", hash = "sha256:2b857d3af6ac0d39db1de7c706e69c7f9791627209c3d6dedbfca8c7e5faec22", size = 673781, upload-time = "2025-11-17T22:32:11.364Z" }, + { url = "https://files.pythonhosted.org/packages/04/f9/067b84365c7e83bda15bba2b06c6ca250ce27b20630b1128c435fb7a09aa/ml_dtypes-0.5.4-cp314-cp314-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:805cef3a38f4eafae3a5bf9ebdcdb741d0bcfd9e1bd90eb54abd24f928cd2465", size = 5036145, upload-time = "2025-11-17T22:32:12.783Z" }, + { url = "https://files.pythonhosted.org/packages/c6/bb/82c7dcf38070b46172a517e2334e665c5bf374a262f99a283ea454bece7c/ml_dtypes-0.5.4-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:14a4fd3228af936461db66faccef6e4f41c1d82fcc30e9f8d58a08916b1d811f", size = 5010230, upload-time = "2025-11-17T22:32:14.38Z" }, + { url = "https://files.pythonhosted.org/packages/e9/93/2bfed22d2498c468f6bcd0d9f56b033eaa19f33320389314c19ef6766413/ml_dtypes-0.5.4-cp314-cp314-win_amd64.whl", hash = "sha256:8c6a2dcebd6f3903e05d51960a8058d6e131fe69f952a5397e5dbabc841b6d56", size = 221032, upload-time = "2025-11-17T22:32:15.763Z" }, + { url = "https://files.pythonhosted.org/packages/76/a3/9c912fe6ea747bb10fe2f8f54d027eb265db05dfb0c6335e3e063e74e6e8/ml_dtypes-0.5.4-cp314-cp314-win_arm64.whl", hash = "sha256:5a0f68ca8fd8d16583dfa7793973feb86f2fbb56ce3966daf9c9f748f52a2049", size = 163353, upload-time = "2025-11-17T22:32:16.932Z" }, + { url = "https://files.pythonhosted.org/packages/cd/02/48aa7d84cc30ab4ee37624a2fd98c56c02326785750cd212bc0826c2f15b/ml_dtypes-0.5.4-cp314-cp314t-macosx_10_13_universal2.whl", hash = "sha256:bfc534409c5d4b0bf945af29e5d0ab075eae9eecbb549ff8a29280db822f34f9", size = 702085, upload-time = "2025-11-17T22:32:18.175Z" }, + { url = "https://files.pythonhosted.org/packages/5a/e7/85cb99fe80a7a5513253ec7faa88a65306be071163485e9a626fce1b6e84/ml_dtypes-0.5.4-cp314-cp314t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:2314892cdc3fcf05e373d76d72aaa15fda9fb98625effa73c1d646f331fcecb7", size = 5355358, upload-time = "2025-11-17T22:32:19.7Z" }, + { url = "https://files.pythonhosted.org/packages/79/2b/a826ba18d2179a56e144aef69e57fb2ab7c464ef0b2111940ee8a3a223a2/ml_dtypes-0.5.4-cp314-cp314t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:0d2ffd05a2575b1519dc928c0b93c06339eb67173ff53acb00724502cda231cf", size = 5366332, upload-time = "2025-11-17T22:32:21.193Z" }, + { url = "https://files.pythonhosted.org/packages/84/44/f4d18446eacb20ea11e82f133ea8f86e2bf2891785b67d9da8d0ab0ef525/ml_dtypes-0.5.4-cp314-cp314t-win_amd64.whl", hash = "sha256:4381fe2f2452a2d7589689693d3162e876b3ddb0a832cde7a414f8e1adf7eab1", size = 236612, upload-time = "2025-11-17T22:32:22.579Z" }, + { url = "https://files.pythonhosted.org/packages/ad/3f/3d42e9a78fe5edf792a83c074b13b9b770092a4fbf3462872f4303135f09/ml_dtypes-0.5.4-cp314-cp314t-win_arm64.whl", hash = "sha256:11942cbf2cf92157db91e5022633c0d9474d4dfd813a909383bd23ce828a4b7d", size = 168825, upload-time = "2025-11-17T22:32:23.766Z" }, +] + +[[package]] +name = "mpmath" +version = "1.3.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/e0/47/dd32fa426cc72114383ac549964eecb20ecfd886d1e5ccf5340b55b02f57/mpmath-1.3.0.tar.gz", hash = "sha256:7a28eb2a9774d00c7bc92411c19a89209d5da7c4c9a9e227be8330a23a25b91f", size = 508106, upload-time = "2023-03-07T16:47:11.061Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/43/e3/7d92a15f894aa0c9c4b49b8ee9ac9850d6e63b03c9c32c0367a13ae62209/mpmath-1.3.0-py3-none-any.whl", hash = "sha256:a0b2b9fe80bbcd81a6647ff13108738cfb482d481d826cc0e02f5b35e5c88d2c", size = 536198, upload-time = "2023-03-07T16:47:09.197Z" }, +] + +[[package]] +name = "msgpack" +version = "1.1.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/4d/f2/bfb55a6236ed8725a96b0aa3acbd0ec17588e6a2c3b62a93eb513ed8783f/msgpack-1.1.2.tar.gz", hash = "sha256:3b60763c1373dd60f398488069bcdc703cd08a711477b5d480eecc9f9626f47e", size = 173581, upload-time = "2025-10-08T09:15:56.596Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/f5/a2/3b68a9e769db68668b25c6108444a35f9bd163bb848c0650d516761a59c0/msgpack-1.1.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:0051fffef5a37ca2cd16978ae4f0aef92f164df86823871b5162812bebecd8e2", size = 81318, upload-time = "2025-10-08T09:14:38.722Z" }, + { url = "https://files.pythonhosted.org/packages/5b/e1/2b720cc341325c00be44e1ed59e7cfeae2678329fbf5aa68f5bda57fe728/msgpack-1.1.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:a605409040f2da88676e9c9e5853b3449ba8011973616189ea5ee55ddbc5bc87", size = 83786, upload-time = "2025-10-08T09:14:40.082Z" }, + { url = "https://files.pythonhosted.org/packages/71/e5/c2241de64bfceac456b140737812a2ab310b10538a7b34a1d393b748e095/msgpack-1.1.2-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:8b696e83c9f1532b4af884045ba7f3aa741a63b2bc22617293a2c6a7c645f251", size = 398240, upload-time = "2025-10-08T09:14:41.151Z" }, + { url = "https://files.pythonhosted.org/packages/b7/09/2a06956383c0fdebaef5aa9246e2356776f12ea6f2a44bd1368abf0e46c4/msgpack-1.1.2-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:365c0bbe981a27d8932da71af63ef86acc59ed5c01ad929e09a0b88c6294e28a", size = 406070, upload-time = "2025-10-08T09:14:42.821Z" }, + { url = "https://files.pythonhosted.org/packages/0e/74/2957703f0e1ef20637d6aead4fbb314330c26f39aa046b348c7edcf6ca6b/msgpack-1.1.2-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:41d1a5d875680166d3ac5c38573896453bbbea7092936d2e107214daf43b1d4f", size = 393403, upload-time = "2025-10-08T09:14:44.38Z" }, + { url = "https://files.pythonhosted.org/packages/a5/09/3bfc12aa90f77b37322fc33e7a8a7c29ba7c8edeadfa27664451801b9860/msgpack-1.1.2-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:354e81bcdebaab427c3df4281187edc765d5d76bfb3a7c125af9da7a27e8458f", size = 398947, upload-time = "2025-10-08T09:14:45.56Z" }, + { url = "https://files.pythonhosted.org/packages/4b/4f/05fcebd3b4977cb3d840f7ef6b77c51f8582086de5e642f3fefee35c86fc/msgpack-1.1.2-cp310-cp310-win32.whl", hash = "sha256:e64c8d2f5e5d5fda7b842f55dec6133260ea8f53c4257d64494c534f306bf7a9", size = 64769, upload-time = "2025-10-08T09:14:47.334Z" }, + { url = "https://files.pythonhosted.org/packages/d0/3e/b4547e3a34210956382eed1c85935fff7e0f9b98be3106b3745d7dec9c5e/msgpack-1.1.2-cp310-cp310-win_amd64.whl", hash = "sha256:db6192777d943bdaaafb6ba66d44bf65aa0e9c5616fa1d2da9bb08828c6b39aa", size = 71293, upload-time = "2025-10-08T09:14:48.665Z" }, + { url = "https://files.pythonhosted.org/packages/2c/97/560d11202bcd537abca693fd85d81cebe2107ba17301de42b01ac1677b69/msgpack-1.1.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:2e86a607e558d22985d856948c12a3fa7b42efad264dca8a3ebbcfa2735d786c", size = 82271, upload-time = "2025-10-08T09:14:49.967Z" }, + { url = "https://files.pythonhosted.org/packages/83/04/28a41024ccbd67467380b6fb440ae916c1e4f25e2cd4c63abe6835ac566e/msgpack-1.1.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:283ae72fc89da59aa004ba147e8fc2f766647b1251500182fac0350d8af299c0", size = 84914, upload-time = "2025-10-08T09:14:50.958Z" }, + { url = "https://files.pythonhosted.org/packages/71/46/b817349db6886d79e57a966346cf0902a426375aadc1e8e7a86a75e22f19/msgpack-1.1.2-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:61c8aa3bd513d87c72ed0b37b53dd5c5a0f58f2ff9f26e1555d3bd7948fb7296", size = 416962, upload-time = "2025-10-08T09:14:51.997Z" }, + { url = "https://files.pythonhosted.org/packages/da/e0/6cc2e852837cd6086fe7d8406af4294e66827a60a4cf60b86575a4a65ca8/msgpack-1.1.2-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:454e29e186285d2ebe65be34629fa0e8605202c60fbc7c4c650ccd41870896ef", size = 426183, upload-time = "2025-10-08T09:14:53.477Z" }, + { url = "https://files.pythonhosted.org/packages/25/98/6a19f030b3d2ea906696cedd1eb251708e50a5891d0978b012cb6107234c/msgpack-1.1.2-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:7bc8813f88417599564fafa59fd6f95be417179f76b40325b500b3c98409757c", size = 411454, upload-time = "2025-10-08T09:14:54.648Z" }, + { url = "https://files.pythonhosted.org/packages/b7/cd/9098fcb6adb32187a70b7ecaabf6339da50553351558f37600e53a4a2a23/msgpack-1.1.2-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:bafca952dc13907bdfdedfc6a5f579bf4f292bdd506fadb38389afa3ac5b208e", size = 422341, upload-time = "2025-10-08T09:14:56.328Z" }, + { url = "https://files.pythonhosted.org/packages/e6/ae/270cecbcf36c1dc85ec086b33a51a4d7d08fc4f404bdbc15b582255d05ff/msgpack-1.1.2-cp311-cp311-win32.whl", hash = "sha256:602b6740e95ffc55bfb078172d279de3773d7b7db1f703b2f1323566b878b90e", size = 64747, upload-time = "2025-10-08T09:14:57.882Z" }, + { url = "https://files.pythonhosted.org/packages/2a/79/309d0e637f6f37e83c711f547308b91af02b72d2326ddd860b966080ef29/msgpack-1.1.2-cp311-cp311-win_amd64.whl", hash = "sha256:d198d275222dc54244bf3327eb8cbe00307d220241d9cec4d306d49a44e85f68", size = 71633, upload-time = "2025-10-08T09:14:59.177Z" }, + { url = "https://files.pythonhosted.org/packages/73/4d/7c4e2b3d9b1106cd0aa6cb56cc57c6267f59fa8bfab7d91df5adc802c847/msgpack-1.1.2-cp311-cp311-win_arm64.whl", hash = "sha256:86f8136dfa5c116365a8a651a7d7484b65b13339731dd6faebb9a0242151c406", size = 64755, upload-time = "2025-10-08T09:15:00.48Z" }, + { url = "https://files.pythonhosted.org/packages/ad/bd/8b0d01c756203fbab65d265859749860682ccd2a59594609aeec3a144efa/msgpack-1.1.2-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:70a0dff9d1f8da25179ffcf880e10cf1aad55fdb63cd59c9a49a1b82290062aa", size = 81939, upload-time = "2025-10-08T09:15:01.472Z" }, + { url = "https://files.pythonhosted.org/packages/34/68/ba4f155f793a74c1483d4bdef136e1023f7bcba557f0db4ef3db3c665cf1/msgpack-1.1.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:446abdd8b94b55c800ac34b102dffd2f6aa0ce643c55dfc017ad89347db3dbdb", size = 85064, upload-time = "2025-10-08T09:15:03.764Z" }, + { url = "https://files.pythonhosted.org/packages/f2/60/a064b0345fc36c4c3d2c743c82d9100c40388d77f0b48b2f04d6041dbec1/msgpack-1.1.2-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c63eea553c69ab05b6747901b97d620bb2a690633c77f23feb0c6a947a8a7b8f", size = 417131, upload-time = "2025-10-08T09:15:05.136Z" }, + { url = "https://files.pythonhosted.org/packages/65/92/a5100f7185a800a5d29f8d14041f61475b9de465ffcc0f3b9fba606e4505/msgpack-1.1.2-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:372839311ccf6bdaf39b00b61288e0557916c3729529b301c52c2d88842add42", size = 427556, upload-time = "2025-10-08T09:15:06.837Z" }, + { url = "https://files.pythonhosted.org/packages/f5/87/ffe21d1bf7d9991354ad93949286f643b2bb6ddbeab66373922b44c3b8cc/msgpack-1.1.2-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:2929af52106ca73fcb28576218476ffbb531a036c2adbcf54a3664de124303e9", size = 404920, upload-time = "2025-10-08T09:15:08.179Z" }, + { url = "https://files.pythonhosted.org/packages/ff/41/8543ed2b8604f7c0d89ce066f42007faac1eaa7d79a81555f206a5cdb889/msgpack-1.1.2-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:be52a8fc79e45b0364210eef5234a7cf8d330836d0a64dfbb878efa903d84620", size = 415013, upload-time = "2025-10-08T09:15:09.83Z" }, + { url = "https://files.pythonhosted.org/packages/41/0d/2ddfaa8b7e1cee6c490d46cb0a39742b19e2481600a7a0e96537e9c22f43/msgpack-1.1.2-cp312-cp312-win32.whl", hash = "sha256:1fff3d825d7859ac888b0fbda39a42d59193543920eda9d9bea44d958a878029", size = 65096, upload-time = "2025-10-08T09:15:11.11Z" }, + { url = "https://files.pythonhosted.org/packages/8c/ec/d431eb7941fb55a31dd6ca3404d41fbb52d99172df2e7707754488390910/msgpack-1.1.2-cp312-cp312-win_amd64.whl", hash = "sha256:1de460f0403172cff81169a30b9a92b260cb809c4cb7e2fc79ae8d0510c78b6b", size = 72708, upload-time = "2025-10-08T09:15:12.554Z" }, + { url = "https://files.pythonhosted.org/packages/c5/31/5b1a1f70eb0e87d1678e9624908f86317787b536060641d6798e3cf70ace/msgpack-1.1.2-cp312-cp312-win_arm64.whl", hash = "sha256:be5980f3ee0e6bd44f3a9e9dea01054f175b50c3e6cdb692bc9424c0bbb8bf69", size = 64119, upload-time = "2025-10-08T09:15:13.589Z" }, + { url = "https://files.pythonhosted.org/packages/6b/31/b46518ecc604d7edf3a4f94cb3bf021fc62aa301f0cb849936968164ef23/msgpack-1.1.2-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:4efd7b5979ccb539c221a4c4e16aac1a533efc97f3b759bb5a5ac9f6d10383bf", size = 81212, upload-time = "2025-10-08T09:15:14.552Z" }, + { url = "https://files.pythonhosted.org/packages/92/dc/c385f38f2c2433333345a82926c6bfa5ecfff3ef787201614317b58dd8be/msgpack-1.1.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:42eefe2c3e2af97ed470eec850facbe1b5ad1d6eacdbadc42ec98e7dcf68b4b7", size = 84315, upload-time = "2025-10-08T09:15:15.543Z" }, + { url = "https://files.pythonhosted.org/packages/d3/68/93180dce57f684a61a88a45ed13047558ded2be46f03acb8dec6d7c513af/msgpack-1.1.2-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:1fdf7d83102bf09e7ce3357de96c59b627395352a4024f6e2458501f158bf999", size = 412721, upload-time = "2025-10-08T09:15:16.567Z" }, + { url = "https://files.pythonhosted.org/packages/5d/ba/459f18c16f2b3fc1a1ca871f72f07d70c07bf768ad0a507a698b8052ac58/msgpack-1.1.2-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:fac4be746328f90caa3cd4bc67e6fe36ca2bf61d5c6eb6d895b6527e3f05071e", size = 424657, upload-time = "2025-10-08T09:15:17.825Z" }, + { url = "https://files.pythonhosted.org/packages/38/f8/4398c46863b093252fe67368b44edc6c13b17f4e6b0e4929dbf0bdb13f23/msgpack-1.1.2-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:fffee09044073e69f2bad787071aeec727183e7580443dfeb8556cbf1978d162", size = 402668, upload-time = "2025-10-08T09:15:19.003Z" }, + { url = "https://files.pythonhosted.org/packages/28/ce/698c1eff75626e4124b4d78e21cca0b4cc90043afb80a507626ea354ab52/msgpack-1.1.2-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:5928604de9b032bc17f5099496417f113c45bc6bc21b5c6920caf34b3c428794", size = 419040, upload-time = "2025-10-08T09:15:20.183Z" }, + { url = "https://files.pythonhosted.org/packages/67/32/f3cd1667028424fa7001d82e10ee35386eea1408b93d399b09fb0aa7875f/msgpack-1.1.2-cp313-cp313-win32.whl", hash = "sha256:a7787d353595c7c7e145e2331abf8b7ff1e6673a6b974ded96e6d4ec09f00c8c", size = 65037, upload-time = "2025-10-08T09:15:21.416Z" }, + { url = "https://files.pythonhosted.org/packages/74/07/1ed8277f8653c40ebc65985180b007879f6a836c525b3885dcc6448ae6cb/msgpack-1.1.2-cp313-cp313-win_amd64.whl", hash = "sha256:a465f0dceb8e13a487e54c07d04ae3ba131c7c5b95e2612596eafde1dccf64a9", size = 72631, upload-time = "2025-10-08T09:15:22.431Z" }, + { url = "https://files.pythonhosted.org/packages/e5/db/0314e4e2db56ebcf450f277904ffd84a7988b9e5da8d0d61ab2d057df2b6/msgpack-1.1.2-cp313-cp313-win_arm64.whl", hash = "sha256:e69b39f8c0aa5ec24b57737ebee40be647035158f14ed4b40e6f150077e21a84", size = 64118, upload-time = "2025-10-08T09:15:23.402Z" }, + { url = "https://files.pythonhosted.org/packages/22/71/201105712d0a2ff07b7873ed3c220292fb2ea5120603c00c4b634bcdafb3/msgpack-1.1.2-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:e23ce8d5f7aa6ea6d2a2b326b4ba46c985dbb204523759984430db7114f8aa00", size = 81127, upload-time = "2025-10-08T09:15:24.408Z" }, + { url = "https://files.pythonhosted.org/packages/1b/9f/38ff9e57a2eade7bf9dfee5eae17f39fc0e998658050279cbb14d97d36d9/msgpack-1.1.2-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:6c15b7d74c939ebe620dd8e559384be806204d73b4f9356320632d783d1f7939", size = 84981, upload-time = "2025-10-08T09:15:25.812Z" }, + { url = "https://files.pythonhosted.org/packages/8e/a9/3536e385167b88c2cc8f4424c49e28d49a6fc35206d4a8060f136e71f94c/msgpack-1.1.2-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:99e2cb7b9031568a2a5c73aa077180f93dd2e95b4f8d3b8e14a73ae94a9e667e", size = 411885, upload-time = "2025-10-08T09:15:27.22Z" }, + { url = "https://files.pythonhosted.org/packages/2f/40/dc34d1a8d5f1e51fc64640b62b191684da52ca469da9cd74e84936ffa4a6/msgpack-1.1.2-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:180759d89a057eab503cf62eeec0aa61c4ea1200dee709f3a8e9397dbb3b6931", size = 419658, upload-time = "2025-10-08T09:15:28.4Z" }, + { url = "https://files.pythonhosted.org/packages/3b/ef/2b92e286366500a09a67e03496ee8b8ba00562797a52f3c117aa2b29514b/msgpack-1.1.2-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:04fb995247a6e83830b62f0b07bf36540c213f6eac8e851166d8d86d83cbd014", size = 403290, upload-time = "2025-10-08T09:15:29.764Z" }, + { url = "https://files.pythonhosted.org/packages/78/90/e0ea7990abea5764e4655b8177aa7c63cdfa89945b6e7641055800f6c16b/msgpack-1.1.2-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:8e22ab046fa7ede9e36eeb4cfad44d46450f37bb05d5ec482b02868f451c95e2", size = 415234, upload-time = "2025-10-08T09:15:31.022Z" }, + { url = "https://files.pythonhosted.org/packages/72/4e/9390aed5db983a2310818cd7d3ec0aecad45e1f7007e0cda79c79507bb0d/msgpack-1.1.2-cp314-cp314-win32.whl", hash = "sha256:80a0ff7d4abf5fecb995fcf235d4064b9a9a8a40a3ab80999e6ac1e30b702717", size = 66391, upload-time = "2025-10-08T09:15:32.265Z" }, + { url = "https://files.pythonhosted.org/packages/6e/f1/abd09c2ae91228c5f3998dbd7f41353def9eac64253de3c8105efa2082f7/msgpack-1.1.2-cp314-cp314-win_amd64.whl", hash = "sha256:9ade919fac6a3e7260b7f64cea89df6bec59104987cbea34d34a2fa15d74310b", size = 73787, upload-time = "2025-10-08T09:15:33.219Z" }, + { url = "https://files.pythonhosted.org/packages/6a/b0/9d9f667ab48b16ad4115c1935d94023b82b3198064cb84a123e97f7466c1/msgpack-1.1.2-cp314-cp314-win_arm64.whl", hash = "sha256:59415c6076b1e30e563eb732e23b994a61c159cec44deaf584e5cc1dd662f2af", size = 66453, upload-time = "2025-10-08T09:15:34.225Z" }, + { url = "https://files.pythonhosted.org/packages/16/67/93f80545eb1792b61a217fa7f06d5e5cb9e0055bed867f43e2b8e012e137/msgpack-1.1.2-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:897c478140877e5307760b0ea66e0932738879e7aa68144d9b78ea4c8302a84a", size = 85264, upload-time = "2025-10-08T09:15:35.61Z" }, + { url = "https://files.pythonhosted.org/packages/87/1c/33c8a24959cf193966ef11a6f6a2995a65eb066bd681fd085afd519a57ce/msgpack-1.1.2-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:a668204fa43e6d02f89dbe79a30b0d67238d9ec4c5bd8a940fc3a004a47b721b", size = 89076, upload-time = "2025-10-08T09:15:36.619Z" }, + { url = "https://files.pythonhosted.org/packages/fc/6b/62e85ff7193663fbea5c0254ef32f0c77134b4059f8da89b958beb7696f3/msgpack-1.1.2-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:5559d03930d3aa0f3aacb4c42c776af1a2ace2611871c84a75afe436695e6245", size = 435242, upload-time = "2025-10-08T09:15:37.647Z" }, + { url = "https://files.pythonhosted.org/packages/c1/47/5c74ecb4cc277cf09f64e913947871682ffa82b3b93c8dad68083112f412/msgpack-1.1.2-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:70c5a7a9fea7f036b716191c29047374c10721c389c21e9ffafad04df8c52c90", size = 432509, upload-time = "2025-10-08T09:15:38.794Z" }, + { url = "https://files.pythonhosted.org/packages/24/a4/e98ccdb56dc4e98c929a3f150de1799831c0a800583cde9fa022fa90602d/msgpack-1.1.2-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:f2cb069d8b981abc72b41aea1c580ce92d57c673ec61af4c500153a626cb9e20", size = 415957, upload-time = "2025-10-08T09:15:40.238Z" }, + { url = "https://files.pythonhosted.org/packages/da/28/6951f7fb67bc0a4e184a6b38ab71a92d9ba58080b27a77d3e2fb0be5998f/msgpack-1.1.2-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:d62ce1f483f355f61adb5433ebfd8868c5f078d1a52d042b0a998682b4fa8c27", size = 422910, upload-time = "2025-10-08T09:15:41.505Z" }, + { url = "https://files.pythonhosted.org/packages/f0/03/42106dcded51f0a0b5284d3ce30a671e7bd3f7318d122b2ead66ad289fed/msgpack-1.1.2-cp314-cp314t-win32.whl", hash = "sha256:1d1418482b1ee984625d88aa9585db570180c286d942da463533b238b98b812b", size = 75197, upload-time = "2025-10-08T09:15:42.954Z" }, + { url = "https://files.pythonhosted.org/packages/15/86/d0071e94987f8db59d4eeb386ddc64d0bb9b10820a8d82bcd3e53eeb2da6/msgpack-1.1.2-cp314-cp314t-win_amd64.whl", hash = "sha256:5a46bf7e831d09470ad92dff02b8b1ac92175ca36b087f904a0519857c6be3ff", size = 85772, upload-time = "2025-10-08T09:15:43.954Z" }, + { url = "https://files.pythonhosted.org/packages/81/f2/08ace4142eb281c12701fc3b93a10795e4d4dc7f753911d836675050f886/msgpack-1.1.2-cp314-cp314t-win_arm64.whl", hash = "sha256:d99ef64f349d5ec3293688e91486c5fdb925ed03807f64d98d205d2713c60b46", size = 70868, upload-time = "2025-10-08T09:15:44.959Z" }, +] + +[[package]] +name = "multidict" +version = "6.7.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "typing-extensions", marker = "python_full_version < '3.11'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/1a/c2/c2d94cbe6ac1753f3fc980da97b3d930efe1da3af3c9f5125354436c073d/multidict-6.7.1.tar.gz", hash = "sha256:ec6652a1bee61c53a3e5776b6049172c53b6aaba34f18c9ad04f82712bac623d", size = 102010, upload-time = "2026-01-26T02:46:45.979Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/84/0b/19348d4c98980c4851d2f943f8ebafdece2ae7ef737adcfa5994ce8e5f10/multidict-6.7.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:c93c3db7ea657dd4637d57e74ab73de31bccefe144d3d4ce370052035bc85fb5", size = 77176, upload-time = "2026-01-26T02:42:59.784Z" }, + { url = "https://files.pythonhosted.org/packages/ef/04/9de3f8077852e3d438215c81e9b691244532d2e05b4270e89ce67b7d103c/multidict-6.7.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:974e72a2474600827abaeda71af0c53d9ebbc3c2eb7da37b37d7829ae31232d8", size = 44996, upload-time = "2026-01-26T02:43:01.674Z" }, + { url = "https://files.pythonhosted.org/packages/31/5c/08c7f7fe311f32e83f7621cd3f99d805f45519cd06fafb247628b861da7d/multidict-6.7.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:cdea2e7b2456cfb6694fb113066fd0ec7ea4d67e3a35e1f4cbeea0b448bf5872", size = 44631, upload-time = "2026-01-26T02:43:03.169Z" }, + { url = "https://files.pythonhosted.org/packages/b7/7f/0e3b1390ae772f27501199996b94b52ceeb64fe6f9120a32c6c3f6b781be/multidict-6.7.1-cp310-cp310-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:17207077e29342fdc2c9a82e4b306f1127bf1ea91f8b71e02d4798a70bb99991", size = 242561, upload-time = "2026-01-26T02:43:04.733Z" }, + { url = "https://files.pythonhosted.org/packages/dd/f4/8719f4f167586af317b69dd3e90f913416c91ca610cac79a45c53f590312/multidict-6.7.1-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:d4f49cb5661344764e4c7c7973e92a47a59b8fc19b6523649ec9dc4960e58a03", size = 242223, upload-time = "2026-01-26T02:43:06.695Z" }, + { url = "https://files.pythonhosted.org/packages/47/ab/7c36164cce64a6ad19c6d9a85377b7178ecf3b89f8fd589c73381a5eedfd/multidict-6.7.1-cp310-cp310-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:a9fc4caa29e2e6ae408d1c450ac8bf19892c5fca83ee634ecd88a53332c59981", size = 222322, upload-time = "2026-01-26T02:43:08.472Z" }, + { url = "https://files.pythonhosted.org/packages/f5/79/a25add6fb38035b5337bc5734f296d9afc99163403bbcf56d4170f97eb62/multidict-6.7.1-cp310-cp310-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:c5f0c21549ab432b57dcc82130f388d84ad8179824cc3f223d5e7cfbfd4143f6", size = 254005, upload-time = "2026-01-26T02:43:10.127Z" }, + { url = "https://files.pythonhosted.org/packages/4a/7b/64a87cf98e12f756fc8bd444b001232ffff2be37288f018ad0d3f0aae931/multidict-6.7.1-cp310-cp310-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:7dfb78d966b2c906ae1d28ccf6e6712a3cd04407ee5088cd276fe8cb42186190", size = 251173, upload-time = "2026-01-26T02:43:11.731Z" }, + { url = "https://files.pythonhosted.org/packages/4b/ac/b605473de2bb404e742f2cc3583d12aedb2352a70e49ae8fce455b50c5aa/multidict-6.7.1-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:9b0d9b91d1aa44db9c1f1ecd0d9d2ae610b2f4f856448664e01a3b35899f3f92", size = 243273, upload-time = "2026-01-26T02:43:13.063Z" }, + { url = "https://files.pythonhosted.org/packages/03/65/11492d6a0e259783720f3bc1d9ea55579a76f1407e31ed44045c99542004/multidict-6.7.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:dd96c01a9dcd4889dcfcf9eb5544ca0c77603f239e3ffab0524ec17aea9a93ee", size = 238956, upload-time = "2026-01-26T02:43:14.843Z" }, + { url = "https://files.pythonhosted.org/packages/5f/a7/7ee591302af64e7c196fb63fe856c788993c1372df765102bd0448e7e165/multidict-6.7.1-cp310-cp310-musllinux_1_2_armv7l.whl", hash = "sha256:067343c68cd6612d375710f895337b3a98a033c94f14b9a99eff902f205424e2", size = 233477, upload-time = "2026-01-26T02:43:16.025Z" }, + { url = "https://files.pythonhosted.org/packages/9c/99/c109962d58756c35fd9992fed7f2355303846ea2ff054bb5f5e9d6b888de/multidict-6.7.1-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:5884a04f4ff56c6120f6ccf703bdeb8b5079d808ba604d4d53aec0d55dc33568", size = 243615, upload-time = "2026-01-26T02:43:17.84Z" }, + { url = "https://files.pythonhosted.org/packages/d5/5f/1973e7c771c86e93dcfe1c9cc55a5481b610f6614acfc28c0d326fe6bfad/multidict-6.7.1-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:8affcf1c98b82bc901702eb73b6947a1bfa170823c153fe8a47b5f5f02e48e40", size = 249930, upload-time = "2026-01-26T02:43:19.06Z" }, + { url = "https://files.pythonhosted.org/packages/5d/a5/f170fc2268c3243853580203378cd522446b2df632061e0a5409817854c7/multidict-6.7.1-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:0d17522c37d03e85c8098ec8431636309b2682cf12e58f4dbc76121fb50e4962", size = 243807, upload-time = "2026-01-26T02:43:20.286Z" }, + { url = "https://files.pythonhosted.org/packages/de/01/73856fab6d125e5bc652c3986b90e8699a95e84b48d72f39ade6c0e74a8c/multidict-6.7.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:24c0cf81544ca5e17cfcb6e482e7a82cd475925242b308b890c9452a074d4505", size = 239103, upload-time = "2026-01-26T02:43:21.508Z" }, + { url = "https://files.pythonhosted.org/packages/e7/46/f1220bd9944d8aa40d8ccff100eeeee19b505b857b6f603d6078cb5315b0/multidict-6.7.1-cp310-cp310-win32.whl", hash = "sha256:d82dd730a95e6643802f4454b8fdecdf08667881a9c5670db85bc5a56693f122", size = 41416, upload-time = "2026-01-26T02:43:22.703Z" }, + { url = "https://files.pythonhosted.org/packages/68/00/9b38e272a770303692fc406c36e1a4c740f401522d5787691eb38a8925a8/multidict-6.7.1-cp310-cp310-win_amd64.whl", hash = "sha256:cf37cbe5ced48d417ba045aca1b21bafca67489452debcde94778a576666a1df", size = 46022, upload-time = "2026-01-26T02:43:23.77Z" }, + { url = "https://files.pythonhosted.org/packages/64/65/d8d42490c02ee07b6bbe00f7190d70bb4738b3cce7629aaf9f213ef730dd/multidict-6.7.1-cp310-cp310-win_arm64.whl", hash = "sha256:59bc83d3f66b41dac1e7460aac1d196edc70c9ba3094965c467715a70ecb46db", size = 43238, upload-time = "2026-01-26T02:43:24.882Z" }, + { url = "https://files.pythonhosted.org/packages/ce/f1/a90635c4f88fb913fbf4ce660b83b7445b7a02615bda034b2f8eb38fd597/multidict-6.7.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:7ff981b266af91d7b4b3793ca3382e53229088d193a85dfad6f5f4c27fc73e5d", size = 76626, upload-time = "2026-01-26T02:43:26.485Z" }, + { url = "https://files.pythonhosted.org/packages/a6/9b/267e64eaf6fc637a15b35f5de31a566634a2740f97d8d094a69d34f524a4/multidict-6.7.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:844c5bca0b5444adb44a623fb0a1310c2f4cd41f402126bb269cd44c9b3f3e1e", size = 44706, upload-time = "2026-01-26T02:43:27.607Z" }, + { url = "https://files.pythonhosted.org/packages/dd/a4/d45caf2b97b035c57267791ecfaafbd59c68212004b3842830954bb4b02e/multidict-6.7.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:f2a0a924d4c2e9afcd7ec64f9de35fcd96915149b2216e1cb2c10a56df483855", size = 44356, upload-time = "2026-01-26T02:43:28.661Z" }, + { url = "https://files.pythonhosted.org/packages/fd/d2/0a36c8473f0cbaeadd5db6c8b72d15bbceeec275807772bfcd059bef487d/multidict-6.7.1-cp311-cp311-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:8be1802715a8e892c784c0197c2ace276ea52702a0ede98b6310c8f255a5afb3", size = 244355, upload-time = "2026-01-26T02:43:31.165Z" }, + { url = "https://files.pythonhosted.org/packages/5d/16/8c65be997fd7dd311b7d39c7b6e71a0cb449bad093761481eccbbe4b42a2/multidict-6.7.1-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:2e2d2ed645ea29f31c4c7ea1552fcfd7cb7ba656e1eafd4134a6620c9f5fdd9e", size = 246433, upload-time = "2026-01-26T02:43:32.581Z" }, + { url = "https://files.pythonhosted.org/packages/01/fb/4dbd7e848d2799c6a026ec88ad39cf2b8416aa167fcc903baa55ecaa045c/multidict-6.7.1-cp311-cp311-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:95922cee9a778659e91db6497596435777bd25ed116701a4c034f8e46544955a", size = 225376, upload-time = "2026-01-26T02:43:34.417Z" }, + { url = "https://files.pythonhosted.org/packages/b6/8a/4a3a6341eac3830f6053062f8fbc9a9e54407c80755b3f05bc427295c2d0/multidict-6.7.1-cp311-cp311-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:6b83cabdc375ffaaa15edd97eb7c0c672ad788e2687004990074d7d6c9b140c8", size = 257365, upload-time = "2026-01-26T02:43:35.741Z" }, + { url = "https://files.pythonhosted.org/packages/f7/a2/dd575a69c1aa206e12d27d0770cdf9b92434b48a9ef0cd0d1afdecaa93c4/multidict-6.7.1-cp311-cp311-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:38fb49540705369bab8484db0689d86c0a33a0a9f2c1b197f506b71b4b6c19b0", size = 254747, upload-time = "2026-01-26T02:43:36.976Z" }, + { url = "https://files.pythonhosted.org/packages/5a/56/21b27c560c13822ed93133f08aa6372c53a8e067f11fbed37b4adcdac922/multidict-6.7.1-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:439cbebd499f92e9aa6793016a8acaa161dfa749ae86d20960189f5398a19144", size = 246293, upload-time = "2026-01-26T02:43:38.258Z" }, + { url = "https://files.pythonhosted.org/packages/5a/a4/23466059dc3854763423d0ad6c0f3683a379d97673b1b89ec33826e46728/multidict-6.7.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:6d3bc717b6fe763b8be3f2bee2701d3c8eb1b2a8ae9f60910f1b2860c82b6c49", size = 242962, upload-time = "2026-01-26T02:43:40.034Z" }, + { url = "https://files.pythonhosted.org/packages/1f/67/51dd754a3524d685958001e8fa20a0f5f90a6a856e0a9dcabff69be3dbb7/multidict-6.7.1-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:619e5a1ac57986dbfec9f0b301d865dddf763696435e2962f6d9cf2fdff2bb71", size = 237360, upload-time = "2026-01-26T02:43:41.752Z" }, + { url = "https://files.pythonhosted.org/packages/64/3f/036dfc8c174934d4b55d86ff4f978e558b0e585cef70cfc1ad01adc6bf18/multidict-6.7.1-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:0b38ebffd9be37c1170d33bc0f36f4f262e0a09bc1aac1c34c7aa51a7293f0b3", size = 245940, upload-time = "2026-01-26T02:43:43.042Z" }, + { url = "https://files.pythonhosted.org/packages/3d/20/6214d3c105928ebc353a1c644a6ef1408bc5794fcb4f170bb524a3c16311/multidict-6.7.1-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:10ae39c9cfe6adedcdb764f5e8411d4a92b055e35573a2eaa88d3323289ef93c", size = 253502, upload-time = "2026-01-26T02:43:44.371Z" }, + { url = "https://files.pythonhosted.org/packages/b1/e2/c653bc4ae1be70a0f836b82172d643fcf1dade042ba2676ab08ec08bff0f/multidict-6.7.1-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:25167cc263257660290fba06b9318d2026e3c910be240a146e1f66dd114af2b0", size = 247065, upload-time = "2026-01-26T02:43:45.745Z" }, + { url = "https://files.pythonhosted.org/packages/c8/11/a854b4154cd3bd8b1fd375e8a8ca9d73be37610c361543d56f764109509b/multidict-6.7.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:128441d052254f42989ef98b7b6a6ecb1e6f708aa962c7984235316db59f50fa", size = 241870, upload-time = "2026-01-26T02:43:47.054Z" }, + { url = "https://files.pythonhosted.org/packages/13/bf/9676c0392309b5fdae322333d22a829715b570edb9baa8016a517b55b558/multidict-6.7.1-cp311-cp311-win32.whl", hash = "sha256:d62b7f64ffde3b99d06b707a280db04fb3855b55f5a06df387236051d0668f4a", size = 41302, upload-time = "2026-01-26T02:43:48.753Z" }, + { url = "https://files.pythonhosted.org/packages/c9/68/f16a3a8ba6f7b6dc92a1f19669c0810bd2c43fc5a02da13b1cbf8e253845/multidict-6.7.1-cp311-cp311-win_amd64.whl", hash = "sha256:bdbf9f3b332abd0cdb306e7c2113818ab1e922dc84b8f8fd06ec89ed2a19ab8b", size = 45981, upload-time = "2026-01-26T02:43:49.921Z" }, + { url = "https://files.pythonhosted.org/packages/ac/ad/9dd5305253fa00cd3c7555dbef69d5bf4133debc53b87ab8d6a44d411665/multidict-6.7.1-cp311-cp311-win_arm64.whl", hash = "sha256:b8c990b037d2fff2f4e33d3f21b9b531c5745b33a49a7d6dbe7a177266af44f6", size = 43159, upload-time = "2026-01-26T02:43:51.635Z" }, + { url = "https://files.pythonhosted.org/packages/8d/9c/f20e0e2cf80e4b2e4b1c365bf5fe104ee633c751a724246262db8f1a0b13/multidict-6.7.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:a90f75c956e32891a4eda3639ce6dd86e87105271f43d43442a3aedf3cddf172", size = 76893, upload-time = "2026-01-26T02:43:52.754Z" }, + { url = "https://files.pythonhosted.org/packages/fe/cf/18ef143a81610136d3da8193da9d80bfe1cb548a1e2d1c775f26b23d024a/multidict-6.7.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:3fccb473e87eaa1382689053e4a4618e7ba7b9b9b8d6adf2027ee474597128cd", size = 45456, upload-time = "2026-01-26T02:43:53.893Z" }, + { url = "https://files.pythonhosted.org/packages/a9/65/1caac9d4cd32e8433908683446eebc953e82d22b03d10d41a5f0fefe991b/multidict-6.7.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:b0fa96985700739c4c7853a43c0b3e169360d6855780021bfc6d0f1ce7c123e7", size = 43872, upload-time = "2026-01-26T02:43:55.041Z" }, + { url = "https://files.pythonhosted.org/packages/cf/3b/d6bd75dc4f3ff7c73766e04e705b00ed6dbbaccf670d9e05a12b006f5a21/multidict-6.7.1-cp312-cp312-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:cb2a55f408c3043e42b40cc8eecd575afa27b7e0b956dfb190de0f8499a57a53", size = 251018, upload-time = "2026-01-26T02:43:56.198Z" }, + { url = "https://files.pythonhosted.org/packages/fd/80/c959c5933adedb9ac15152e4067c702a808ea183a8b64cf8f31af8ad3155/multidict-6.7.1-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:eb0ce7b2a32d09892b3dd6cc44877a0d02a33241fafca5f25c8b6b62374f8b75", size = 258883, upload-time = "2026-01-26T02:43:57.499Z" }, + { url = "https://files.pythonhosted.org/packages/86/85/7ed40adafea3d4f1c8b916e3b5cc3a8e07dfcdcb9cd72800f4ed3ca1b387/multidict-6.7.1-cp312-cp312-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:c3a32d23520ee37bf327d1e1a656fec76a2edd5c038bf43eddfa0572ec49c60b", size = 242413, upload-time = "2026-01-26T02:43:58.755Z" }, + { url = "https://files.pythonhosted.org/packages/d2/57/b8565ff533e48595503c785f8361ff9a4fde4d67de25c207cd0ba3befd03/multidict-6.7.1-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:9c90fed18bffc0189ba814749fdcc102b536e83a9f738a9003e569acd540a733", size = 268404, upload-time = "2026-01-26T02:44:00.216Z" }, + { url = "https://files.pythonhosted.org/packages/e0/50/9810c5c29350f7258180dfdcb2e52783a0632862eb334c4896ac717cebcb/multidict-6.7.1-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:da62917e6076f512daccfbbde27f46fed1c98fee202f0559adec8ee0de67f71a", size = 269456, upload-time = "2026-01-26T02:44:02.202Z" }, + { url = "https://files.pythonhosted.org/packages/f3/8d/5e5be3ced1d12966fefb5c4ea3b2a5b480afcea36406559442c6e31d4a48/multidict-6.7.1-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:bfde23ef6ed9db7eaee6c37dcec08524cb43903c60b285b172b6c094711b3961", size = 256322, upload-time = "2026-01-26T02:44:03.56Z" }, + { url = "https://files.pythonhosted.org/packages/31/6e/d8a26d81ac166a5592782d208dd90dfdc0a7a218adaa52b45a672b46c122/multidict-6.7.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:3758692429e4e32f1ba0df23219cd0b4fc0a52f476726fff9337d1a57676a582", size = 253955, upload-time = "2026-01-26T02:44:04.845Z" }, + { url = "https://files.pythonhosted.org/packages/59/4c/7c672c8aad41534ba619bcd4ade7a0dc87ed6b8b5c06149b85d3dd03f0cd/multidict-6.7.1-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:398c1478926eca669f2fd6a5856b6de9c0acf23a2cb59a14c0ba5844fa38077e", size = 251254, upload-time = "2026-01-26T02:44:06.133Z" }, + { url = "https://files.pythonhosted.org/packages/7b/bd/84c24de512cbafbdbc39439f74e967f19570ce7924e3007174a29c348916/multidict-6.7.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:c102791b1c4f3ab36ce4101154549105a53dc828f016356b3e3bcae2e3a039d3", size = 252059, upload-time = "2026-01-26T02:44:07.518Z" }, + { url = "https://files.pythonhosted.org/packages/fa/ba/f5449385510825b73d01c2d4087bf6d2fccc20a2d42ac34df93191d3dd03/multidict-6.7.1-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:a088b62bd733e2ad12c50dad01b7d0166c30287c166e137433d3b410add807a6", size = 263588, upload-time = "2026-01-26T02:44:09.382Z" }, + { url = "https://files.pythonhosted.org/packages/d7/11/afc7c677f68f75c84a69fe37184f0f82fce13ce4b92f49f3db280b7e92b3/multidict-6.7.1-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:3d51ff4785d58d3f6c91bdbffcb5e1f7ddfda557727043aa20d20ec4f65e324a", size = 259642, upload-time = "2026-01-26T02:44:10.73Z" }, + { url = "https://files.pythonhosted.org/packages/2b/17/ebb9644da78c4ab36403739e0e6e0e30ebb135b9caf3440825001a0bddcb/multidict-6.7.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:fc5907494fccf3e7d3f94f95c91d6336b092b5fc83811720fae5e2765890dfba", size = 251377, upload-time = "2026-01-26T02:44:12.042Z" }, + { url = "https://files.pythonhosted.org/packages/ca/a4/840f5b97339e27846c46307f2530a2805d9d537d8b8bd416af031cad7fa0/multidict-6.7.1-cp312-cp312-win32.whl", hash = "sha256:28ca5ce2fd9716631133d0e9a9b9a745ad7f60bac2bccafb56aa380fc0b6c511", size = 41887, upload-time = "2026-01-26T02:44:14.245Z" }, + { url = "https://files.pythonhosted.org/packages/80/31/0b2517913687895f5904325c2069d6a3b78f66cc641a86a2baf75a05dcbb/multidict-6.7.1-cp312-cp312-win_amd64.whl", hash = "sha256:fcee94dfbd638784645b066074b338bc9cc155d4b4bffa4adce1615c5a426c19", size = 46053, upload-time = "2026-01-26T02:44:15.371Z" }, + { url = "https://files.pythonhosted.org/packages/0c/5b/aba28e4ee4006ae4c7df8d327d31025d760ffa992ea23812a601d226e682/multidict-6.7.1-cp312-cp312-win_arm64.whl", hash = "sha256:ba0a9fb644d0c1a2194cf7ffb043bd852cea63a57f66fbd33959f7dae18517bf", size = 43307, upload-time = "2026-01-26T02:44:16.852Z" }, + { url = "https://files.pythonhosted.org/packages/f2/22/929c141d6c0dba87d3e1d38fbdf1ba8baba86b7776469f2bc2d3227a1e67/multidict-6.7.1-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:2b41f5fed0ed563624f1c17630cb9941cf2309d4df00e494b551b5f3e3d67a23", size = 76174, upload-time = "2026-01-26T02:44:18.509Z" }, + { url = "https://files.pythonhosted.org/packages/c7/75/bc704ae15fee974f8fccd871305e254754167dce5f9e42d88a2def741a1d/multidict-6.7.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:84e61e3af5463c19b67ced91f6c634effb89ef8bfc5ca0267f954451ed4bb6a2", size = 45116, upload-time = "2026-01-26T02:44:19.745Z" }, + { url = "https://files.pythonhosted.org/packages/79/76/55cd7186f498ed080a18440c9013011eb548f77ae1b297206d030eb1180a/multidict-6.7.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:935434b9853c7c112eee7ac891bc4cb86455aa631269ae35442cb316790c1445", size = 43524, upload-time = "2026-01-26T02:44:21.571Z" }, + { url = "https://files.pythonhosted.org/packages/e9/3c/414842ef8d5a1628d68edee29ba0e5bcf235dbfb3ccd3ea303a7fe8c72ff/multidict-6.7.1-cp313-cp313-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:432feb25a1cb67fe82a9680b4d65fb542e4635cb3166cd9c01560651ad60f177", size = 249368, upload-time = "2026-01-26T02:44:22.803Z" }, + { url = "https://files.pythonhosted.org/packages/f6/32/befed7f74c458b4a525e60519fe8d87eef72bb1e99924fa2b0f9d97a221e/multidict-6.7.1-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:e82d14e3c948952a1a85503817e038cba5905a3352de76b9a465075d072fba23", size = 256952, upload-time = "2026-01-26T02:44:24.306Z" }, + { url = "https://files.pythonhosted.org/packages/03/d6/c878a44ba877f366630c860fdf74bfb203c33778f12b6ac274936853c451/multidict-6.7.1-cp313-cp313-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:4cfb48c6ea66c83bcaaf7e4dfa7ec1b6bbcf751b7db85a328902796dfde4c060", size = 240317, upload-time = "2026-01-26T02:44:25.772Z" }, + { url = "https://files.pythonhosted.org/packages/68/49/57421b4d7ad2e9e60e25922b08ceb37e077b90444bde6ead629095327a6f/multidict-6.7.1-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:1d540e51b7e8e170174555edecddbd5538105443754539193e3e1061864d444d", size = 267132, upload-time = "2026-01-26T02:44:27.648Z" }, + { url = "https://files.pythonhosted.org/packages/b7/fe/ec0edd52ddbcea2a2e89e174f0206444a61440b40f39704e64dc807a70bd/multidict-6.7.1-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:273d23f4b40f3dce4d6c8a821c741a86dec62cded82e1175ba3d99be128147ed", size = 268140, upload-time = "2026-01-26T02:44:29.588Z" }, + { url = "https://files.pythonhosted.org/packages/b0/73/6e1b01cbeb458807aa0831742232dbdd1fa92bfa33f52a3f176b4ff3dc11/multidict-6.7.1-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:9d624335fd4fa1c08a53f8b4be7676ebde19cd092b3895c421045ca87895b429", size = 254277, upload-time = "2026-01-26T02:44:30.902Z" }, + { url = "https://files.pythonhosted.org/packages/6a/b2/5fb8c124d7561a4974c342bc8c778b471ebbeb3cc17df696f034a7e9afe7/multidict-6.7.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:12fad252f8b267cc75b66e8fc51b3079604e8d43a75428ffe193cd9e2195dfd6", size = 252291, upload-time = "2026-01-26T02:44:32.31Z" }, + { url = "https://files.pythonhosted.org/packages/5a/96/51d4e4e06bcce92577fcd488e22600bd38e4fd59c20cb49434d054903bd2/multidict-6.7.1-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:03ede2a6ffbe8ef936b92cb4529f27f42be7f56afcdab5ab739cd5f27fb1cbf9", size = 250156, upload-time = "2026-01-26T02:44:33.734Z" }, + { url = "https://files.pythonhosted.org/packages/db/6b/420e173eec5fba721a50e2a9f89eda89d9c98fded1124f8d5c675f7a0c0f/multidict-6.7.1-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:90efbcf47dbe33dcf643a1e400d67d59abeac5db07dc3f27d6bdeae497a2198c", size = 249742, upload-time = "2026-01-26T02:44:35.222Z" }, + { url = "https://files.pythonhosted.org/packages/44/a3/ec5b5bd98f306bc2aa297b8c6f11a46714a56b1e6ef5ebda50a4f5d7c5fb/multidict-6.7.1-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:5c4b9bfc148f5a91be9244d6264c53035c8a0dcd2f51f1c3c6e30e30ebaa1c84", size = 262221, upload-time = "2026-01-26T02:44:36.604Z" }, + { url = "https://files.pythonhosted.org/packages/cd/f7/e8c0d0da0cd1e28d10e624604e1a36bcc3353aaebdfdc3a43c72bc683a12/multidict-6.7.1-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:401c5a650f3add2472d1d288c26deebc540f99e2fb83e9525007a74cd2116f1d", size = 258664, upload-time = "2026-01-26T02:44:38.008Z" }, + { url = "https://files.pythonhosted.org/packages/52/da/151a44e8016dd33feed44f730bd856a66257c1ee7aed4f44b649fb7edeb3/multidict-6.7.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:97891f3b1b3ffbded884e2916cacf3c6fc87b66bb0dde46f7357404750559f33", size = 249490, upload-time = "2026-01-26T02:44:39.386Z" }, + { url = "https://files.pythonhosted.org/packages/87/af/a3b86bf9630b732897f6fc3f4c4714b90aa4361983ccbdcd6c0339b21b0c/multidict-6.7.1-cp313-cp313-win32.whl", hash = "sha256:e1c5988359516095535c4301af38d8a8838534158f649c05dd1050222321bcb3", size = 41695, upload-time = "2026-01-26T02:44:41.318Z" }, + { url = "https://files.pythonhosted.org/packages/b2/35/e994121b0e90e46134673422dd564623f93304614f5d11886b1b3e06f503/multidict-6.7.1-cp313-cp313-win_amd64.whl", hash = "sha256:960c83bf01a95b12b08fd54324a4eb1d5b52c88932b5cba5d6e712bb3ed12eb5", size = 45884, upload-time = "2026-01-26T02:44:42.488Z" }, + { url = "https://files.pythonhosted.org/packages/ca/61/42d3e5dbf661242a69c97ea363f2d7b46c567da8eadef8890022be6e2ab0/multidict-6.7.1-cp313-cp313-win_arm64.whl", hash = "sha256:563fe25c678aaba333d5399408f5ec3c383ca5b663e7f774dd179a520b8144df", size = 43122, upload-time = "2026-01-26T02:44:43.664Z" }, + { url = "https://files.pythonhosted.org/packages/6d/b3/e6b21c6c4f314bb956016b0b3ef2162590a529b84cb831c257519e7fde44/multidict-6.7.1-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:c76c4bec1538375dad9d452d246ca5368ad6e1c9039dadcf007ae59c70619ea1", size = 83175, upload-time = "2026-01-26T02:44:44.894Z" }, + { url = "https://files.pythonhosted.org/packages/fb/76/23ecd2abfe0957b234f6c960f4ade497f55f2c16aeb684d4ecdbf1c95791/multidict-6.7.1-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:57b46b24b5d5ebcc978da4ec23a819a9402b4228b8a90d9c656422b4bdd8a963", size = 48460, upload-time = "2026-01-26T02:44:46.106Z" }, + { url = "https://files.pythonhosted.org/packages/c4/57/a0ed92b23f3a042c36bc4227b72b97eca803f5f1801c1ab77c8a212d455e/multidict-6.7.1-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:e954b24433c768ce78ab7929e84ccf3422e46deb45a4dc9f93438f8217fa2d34", size = 46930, upload-time = "2026-01-26T02:44:47.278Z" }, + { url = "https://files.pythonhosted.org/packages/b5/66/02ec7ace29162e447f6382c495dc95826bf931d3818799bbef11e8f7df1a/multidict-6.7.1-cp313-cp313t-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:3bd231490fa7217cc832528e1cd8752a96f0125ddd2b5749390f7c3ec8721b65", size = 242582, upload-time = "2026-01-26T02:44:48.604Z" }, + { url = "https://files.pythonhosted.org/packages/58/18/64f5a795e7677670e872673aca234162514696274597b3708b2c0d276cce/multidict-6.7.1-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:253282d70d67885a15c8a7716f3a73edf2d635793ceda8173b9ecc21f2fb8292", size = 250031, upload-time = "2026-01-26T02:44:50.544Z" }, + { url = "https://files.pythonhosted.org/packages/c8/ed/e192291dbbe51a8290c5686f482084d31bcd9d09af24f63358c3d42fd284/multidict-6.7.1-cp313-cp313t-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:0b4c48648d7649c9335cf1927a8b87fa692de3dcb15faa676c6a6f1f1aabda43", size = 228596, upload-time = "2026-01-26T02:44:51.951Z" }, + { url = "https://files.pythonhosted.org/packages/1e/7e/3562a15a60cf747397e7f2180b0a11dc0c38d9175a650e75fa1b4d325e15/multidict-6.7.1-cp313-cp313t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:98bc624954ec4d2c7cb074b8eefc2b5d0ce7d482e410df446414355d158fe4ca", size = 257492, upload-time = "2026-01-26T02:44:53.902Z" }, + { url = "https://files.pythonhosted.org/packages/24/02/7d0f9eae92b5249bb50ac1595b295f10e263dd0078ebb55115c31e0eaccd/multidict-6.7.1-cp313-cp313t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:1b99af4d9eec0b49927b4402bcbb58dea89d3e0db8806a4086117019939ad3dd", size = 255899, upload-time = "2026-01-26T02:44:55.316Z" }, + { url = "https://files.pythonhosted.org/packages/00/e3/9b60ed9e23e64c73a5cde95269ef1330678e9c6e34dd4eb6b431b85b5a10/multidict-6.7.1-cp313-cp313t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:6aac4f16b472d5b7dc6f66a0d49dd57b0e0902090be16594dc9ebfd3d17c47e7", size = 247970, upload-time = "2026-01-26T02:44:56.783Z" }, + { url = "https://files.pythonhosted.org/packages/3e/06/538e58a63ed5cfb0bd4517e346b91da32fde409d839720f664e9a4ae4f9d/multidict-6.7.1-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:21f830fe223215dffd51f538e78c172ed7c7f60c9b96a2bf05c4848ad49921c3", size = 245060, upload-time = "2026-01-26T02:44:58.195Z" }, + { url = "https://files.pythonhosted.org/packages/b2/2f/d743a3045a97c895d401e9bd29aaa09b94f5cbdf1bd561609e5a6c431c70/multidict-6.7.1-cp313-cp313t-musllinux_1_2_armv7l.whl", hash = "sha256:f5dd81c45b05518b9aa4da4aa74e1c93d715efa234fd3e8a179df611cc85e5f4", size = 235888, upload-time = "2026-01-26T02:44:59.57Z" }, + { url = "https://files.pythonhosted.org/packages/38/83/5a325cac191ab28b63c52f14f1131f3b0a55ba3b9aa65a6d0bf2a9b921a0/multidict-6.7.1-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:eb304767bca2bb92fb9c5bd33cedc95baee5bb5f6c88e63706533a1c06ad08c8", size = 243554, upload-time = "2026-01-26T02:45:01.054Z" }, + { url = "https://files.pythonhosted.org/packages/20/1f/9d2327086bd15da2725ef6aae624208e2ef828ed99892b17f60c344e57ed/multidict-6.7.1-cp313-cp313t-musllinux_1_2_ppc64le.whl", hash = "sha256:c9035dde0f916702850ef66460bc4239d89d08df4d02023a5926e7446724212c", size = 252341, upload-time = "2026-01-26T02:45:02.484Z" }, + { url = "https://files.pythonhosted.org/packages/e8/2c/2a1aa0280cf579d0f6eed8ee5211c4f1730bd7e06c636ba2ee6aafda302e/multidict-6.7.1-cp313-cp313t-musllinux_1_2_s390x.whl", hash = "sha256:af959b9beeb66c822380f222f0e0a1889331597e81f1ded7f374f3ecb0fd6c52", size = 246391, upload-time = "2026-01-26T02:45:03.862Z" }, + { url = "https://files.pythonhosted.org/packages/e5/03/7ca022ffc36c5a3f6e03b179a5ceb829be9da5783e6fe395f347c0794680/multidict-6.7.1-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:41f2952231456154ee479651491e94118229844dd7226541788be783be2b5108", size = 243422, upload-time = "2026-01-26T02:45:05.296Z" }, + { url = "https://files.pythonhosted.org/packages/dc/1d/b31650eab6c5778aceed46ba735bd97f7c7d2f54b319fa916c0f96e7805b/multidict-6.7.1-cp313-cp313t-win32.whl", hash = "sha256:df9f19c28adcb40b6aae30bbaa1478c389efd50c28d541d76760199fc1037c32", size = 47770, upload-time = "2026-01-26T02:45:06.754Z" }, + { url = "https://files.pythonhosted.org/packages/ac/5b/2d2d1d522e51285bd61b1e20df8f47ae1a9d80839db0b24ea783b3832832/multidict-6.7.1-cp313-cp313t-win_amd64.whl", hash = "sha256:d54ecf9f301853f2c5e802da559604b3e95bb7a3b01a9c295c6ee591b9882de8", size = 53109, upload-time = "2026-01-26T02:45:08.044Z" }, + { url = "https://files.pythonhosted.org/packages/3d/a3/cc409ba012c83ca024a308516703cf339bdc4b696195644a7215a5164a24/multidict-6.7.1-cp313-cp313t-win_arm64.whl", hash = "sha256:5a37ca18e360377cfda1d62f5f382ff41f2b8c4ccb329ed974cc2e1643440118", size = 45573, upload-time = "2026-01-26T02:45:09.349Z" }, + { url = "https://files.pythonhosted.org/packages/91/cc/db74228a8be41884a567e88a62fd589a913708fcf180d029898c17a9a371/multidict-6.7.1-cp314-cp314-macosx_10_15_universal2.whl", hash = "sha256:8f333ec9c5eb1b7105e3b84b53141e66ca05a19a605368c55450b6ba208cb9ee", size = 75190, upload-time = "2026-01-26T02:45:10.651Z" }, + { url = "https://files.pythonhosted.org/packages/d5/22/492f2246bb5b534abd44804292e81eeaf835388901f0c574bac4eeec73c5/multidict-6.7.1-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:a407f13c188f804c759fc6a9f88286a565c242a76b27626594c133b82883b5c2", size = 44486, upload-time = "2026-01-26T02:45:11.938Z" }, + { url = "https://files.pythonhosted.org/packages/f1/4f/733c48f270565d78b4544f2baddc2fb2a245e5a8640254b12c36ac7ac68e/multidict-6.7.1-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:0e161ddf326db5577c3a4cc2d8648f81456e8a20d40415541587a71620d7a7d1", size = 43219, upload-time = "2026-01-26T02:45:14.346Z" }, + { url = "https://files.pythonhosted.org/packages/24/bb/2c0c2287963f4259c85e8bcbba9182ced8d7fca65c780c38e99e61629d11/multidict-6.7.1-cp314-cp314-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:1e3a8bb24342a8201d178c3b4984c26ba81a577c80d4d525727427460a50c22d", size = 245132, upload-time = "2026-01-26T02:45:15.712Z" }, + { url = "https://files.pythonhosted.org/packages/a7/f9/44d4b3064c65079d2467888794dea218d1601898ac50222ab8a9a8094460/multidict-6.7.1-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:97231140a50f5d447d3164f994b86a0bed7cd016e2682f8650d6a9158e14fd31", size = 252420, upload-time = "2026-01-26T02:45:17.293Z" }, + { url = "https://files.pythonhosted.org/packages/8b/13/78f7275e73fa17b24c9a51b0bd9d73ba64bb32d0ed51b02a746eb876abe7/multidict-6.7.1-cp314-cp314-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:6b10359683bd8806a200fd2909e7c8ca3a7b24ec1d8132e483d58e791d881048", size = 233510, upload-time = "2026-01-26T02:45:19.356Z" }, + { url = "https://files.pythonhosted.org/packages/4b/25/8167187f62ae3cbd52da7893f58cb036b47ea3fb67138787c76800158982/multidict-6.7.1-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:283ddac99f7ac25a4acadbf004cb5ae34480bbeb063520f70ce397b281859362", size = 264094, upload-time = "2026-01-26T02:45:20.834Z" }, + { url = "https://files.pythonhosted.org/packages/a1/e7/69a3a83b7b030cf283fb06ce074a05a02322359783424d7edf0f15fe5022/multidict-6.7.1-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:538cec1e18c067d0e6103aa9a74f9e832904c957adc260e61cd9d8cf0c3b3d37", size = 260786, upload-time = "2026-01-26T02:45:22.818Z" }, + { url = "https://files.pythonhosted.org/packages/fe/3b/8ec5074bcfc450fe84273713b4b0a0dd47c0249358f5d82eb8104ffe2520/multidict-6.7.1-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:7eee46ccb30ff48a1e35bb818cc90846c6be2b68240e42a78599166722cea709", size = 248483, upload-time = "2026-01-26T02:45:24.368Z" }, + { url = "https://files.pythonhosted.org/packages/48/5a/d5a99e3acbca0e29c5d9cba8f92ceb15dce78bab963b308ae692981e3a5d/multidict-6.7.1-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:fa263a02f4f2dd2d11a7b1bb4362aa7cb1049f84a9235d31adf63f30143469a0", size = 248403, upload-time = "2026-01-26T02:45:25.982Z" }, + { url = "https://files.pythonhosted.org/packages/35/48/e58cd31f6c7d5102f2a4bf89f96b9cf7e00b6c6f3d04ecc44417c00a5a3c/multidict-6.7.1-cp314-cp314-musllinux_1_2_armv7l.whl", hash = "sha256:2e1425e2f99ec5bd36c15a01b690a1a2456209c5deed58f95469ffb46039ccbb", size = 240315, upload-time = "2026-01-26T02:45:27.487Z" }, + { url = "https://files.pythonhosted.org/packages/94/33/1cd210229559cb90b6786c30676bb0c58249ff42f942765f88793b41fdce/multidict-6.7.1-cp314-cp314-musllinux_1_2_i686.whl", hash = "sha256:497394b3239fc6f0e13a78a3e1b61296e72bf1c5f94b4c4eb80b265c37a131cd", size = 245528, upload-time = "2026-01-26T02:45:28.991Z" }, + { url = "https://files.pythonhosted.org/packages/64/f2/6e1107d226278c876c783056b7db43d800bb64c6131cec9c8dfb6903698e/multidict-6.7.1-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:233b398c29d3f1b9676b4b6f75c518a06fcb2ea0b925119fb2c1bc35c05e1601", size = 258784, upload-time = "2026-01-26T02:45:30.503Z" }, + { url = "https://files.pythonhosted.org/packages/4d/c1/11f664f14d525e4a1b5327a82d4de61a1db604ab34c6603bb3c2cc63ad34/multidict-6.7.1-cp314-cp314-musllinux_1_2_s390x.whl", hash = "sha256:93b1818e4a6e0930454f0f2af7dfce69307ca03cdcfb3739bf4d91241967b6c1", size = 251980, upload-time = "2026-01-26T02:45:32.603Z" }, + { url = "https://files.pythonhosted.org/packages/e1/9f/75a9ac888121d0c5bbd4ecf4eead45668b1766f6baabfb3b7f66a410e231/multidict-6.7.1-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:f33dc2a3abe9249ea5d8360f969ec7f4142e7ac45ee7014d8f8d5acddf178b7b", size = 243602, upload-time = "2026-01-26T02:45:34.043Z" }, + { url = "https://files.pythonhosted.org/packages/9a/e7/50bf7b004cc8525d80dbbbedfdc7aed3e4c323810890be4413e589074032/multidict-6.7.1-cp314-cp314-win32.whl", hash = "sha256:3ab8b9d8b75aef9df299595d5388b14530839f6422333357af1339443cff777d", size = 40930, upload-time = "2026-01-26T02:45:36.278Z" }, + { url = "https://files.pythonhosted.org/packages/e0/bf/52f25716bbe93745595800f36fb17b73711f14da59ed0bb2eba141bc9f0f/multidict-6.7.1-cp314-cp314-win_amd64.whl", hash = "sha256:5e01429a929600e7dab7b166062d9bb54a5eed752384c7384c968c2afab8f50f", size = 45074, upload-time = "2026-01-26T02:45:37.546Z" }, + { url = "https://files.pythonhosted.org/packages/97/ab/22803b03285fa3a525f48217963da3a65ae40f6a1b6f6cf2768879e208f9/multidict-6.7.1-cp314-cp314-win_arm64.whl", hash = "sha256:4885cb0e817aef5d00a2e8451d4665c1808378dc27c2705f1bf4ef8505c0d2e5", size = 42471, upload-time = "2026-01-26T02:45:38.889Z" }, + { url = "https://files.pythonhosted.org/packages/e0/6d/f9293baa6146ba9507e360ea0292b6422b016907c393e2f63fc40ab7b7b5/multidict-6.7.1-cp314-cp314t-macosx_10_15_universal2.whl", hash = "sha256:0458c978acd8e6ea53c81eefaddbbee9c6c5e591f41b3f5e8e194780fe026581", size = 82401, upload-time = "2026-01-26T02:45:40.254Z" }, + { url = "https://files.pythonhosted.org/packages/7a/68/53b5494738d83558d87c3c71a486504d8373421c3e0dbb6d0db48ad42ee0/multidict-6.7.1-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:c0abd12629b0af3cf590982c0b413b1e7395cd4ec026f30986818ab95bfaa94a", size = 48143, upload-time = "2026-01-26T02:45:41.635Z" }, + { url = "https://files.pythonhosted.org/packages/37/e8/5284c53310dcdc99ce5d66563f6e5773531a9b9fe9ec7a615e9bc306b05f/multidict-6.7.1-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:14525a5f61d7d0c94b368a42cff4c9a4e7ba2d52e2672a7b23d84dc86fb02b0c", size = 46507, upload-time = "2026-01-26T02:45:42.99Z" }, + { url = "https://files.pythonhosted.org/packages/e4/fc/6800d0e5b3875568b4083ecf5f310dcf91d86d52573160834fb4bfcf5e4f/multidict-6.7.1-cp314-cp314t-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:17307b22c217b4cf05033dabefe68255a534d637c6c9b0cc8382718f87be4262", size = 239358, upload-time = "2026-01-26T02:45:44.376Z" }, + { url = "https://files.pythonhosted.org/packages/41/75/4ad0973179361cdf3a113905e6e088173198349131be2b390f9fa4da5fc6/multidict-6.7.1-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:7a7e590ff876a3eaf1c02a4dfe0724b6e69a9e9de6d8f556816f29c496046e59", size = 246884, upload-time = "2026-01-26T02:45:47.167Z" }, + { url = "https://files.pythonhosted.org/packages/c3/9c/095bb28b5da139bd41fb9a5d5caff412584f377914bd8787c2aa98717130/multidict-6.7.1-cp314-cp314t-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:5fa6a95dfee63893d80a34758cd0e0c118a30b8dcb46372bf75106c591b77889", size = 225878, upload-time = "2026-01-26T02:45:48.698Z" }, + { url = "https://files.pythonhosted.org/packages/07/d0/c0a72000243756e8f5a277b6b514fa005f2c73d481b7d9e47cd4568aa2e4/multidict-6.7.1-cp314-cp314t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:a0543217a6a017692aa6ae5cc39adb75e587af0f3a82288b1492eb73dd6cc2a4", size = 253542, upload-time = "2026-01-26T02:45:50.164Z" }, + { url = "https://files.pythonhosted.org/packages/c0/6b/f69da15289e384ecf2a68837ec8b5ad8c33e973aa18b266f50fe55f24b8c/multidict-6.7.1-cp314-cp314t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:f99fe611c312b3c1c0ace793f92464d8cd263cc3b26b5721950d977b006b6c4d", size = 252403, upload-time = "2026-01-26T02:45:51.779Z" }, + { url = "https://files.pythonhosted.org/packages/a2/76/b9669547afa5a1a25cd93eaca91c0da1c095b06b6d2d8ec25b713588d3a1/multidict-6.7.1-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:9004d8386d133b7e6135679424c91b0b854d2d164af6ea3f289f8f2761064609", size = 244889, upload-time = "2026-01-26T02:45:53.27Z" }, + { url = "https://files.pythonhosted.org/packages/7e/a9/a50d2669e506dad33cfc45b5d574a205587b7b8a5f426f2fbb2e90882588/multidict-6.7.1-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:e628ef0e6859ffd8273c69412a2465c4be4a9517d07261b33334b5ec6f3c7489", size = 241982, upload-time = "2026-01-26T02:45:54.919Z" }, + { url = "https://files.pythonhosted.org/packages/c5/bb/1609558ad8b456b4827d3c5a5b775c93b87878fd3117ed3db3423dfbce1b/multidict-6.7.1-cp314-cp314t-musllinux_1_2_armv7l.whl", hash = "sha256:841189848ba629c3552035a6a7f5bf3b02eb304e9fea7492ca220a8eda6b0e5c", size = 232415, upload-time = "2026-01-26T02:45:56.981Z" }, + { url = "https://files.pythonhosted.org/packages/d8/59/6f61039d2aa9261871e03ab9dc058a550d240f25859b05b67fd70f80d4b3/multidict-6.7.1-cp314-cp314t-musllinux_1_2_i686.whl", hash = "sha256:ce1bbd7d780bb5a0da032e095c951f7014d6b0a205f8318308140f1a6aba159e", size = 240337, upload-time = "2026-01-26T02:45:58.698Z" }, + { url = "https://files.pythonhosted.org/packages/a1/29/fdc6a43c203890dc2ae9249971ecd0c41deaedfe00d25cb6564b2edd99eb/multidict-6.7.1-cp314-cp314t-musllinux_1_2_ppc64le.whl", hash = "sha256:b26684587228afed0d50cf804cc71062cc9c1cdf55051c4c6345d372947b268c", size = 248788, upload-time = "2026-01-26T02:46:00.862Z" }, + { url = "https://files.pythonhosted.org/packages/a9/14/a153a06101323e4cf086ecee3faadba52ff71633d471f9685c42e3736163/multidict-6.7.1-cp314-cp314t-musllinux_1_2_s390x.whl", hash = "sha256:9f9af11306994335398293f9958071019e3ab95e9a707dc1383a35613f6abcb9", size = 242842, upload-time = "2026-01-26T02:46:02.824Z" }, + { url = "https://files.pythonhosted.org/packages/41/5f/604ae839e64a4a6efc80db94465348d3b328ee955e37acb24badbcd24d83/multidict-6.7.1-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:b4938326284c4f1224178a560987b6cf8b4d38458b113d9b8c1db1a836e640a2", size = 240237, upload-time = "2026-01-26T02:46:05.898Z" }, + { url = "https://files.pythonhosted.org/packages/5f/60/c3a5187bf66f6fb546ff4ab8fb5a077cbdd832d7b1908d4365c7f74a1917/multidict-6.7.1-cp314-cp314t-win32.whl", hash = "sha256:98655c737850c064a65e006a3df7c997cd3b220be4ec8fe26215760b9697d4d7", size = 48008, upload-time = "2026-01-26T02:46:07.468Z" }, + { url = "https://files.pythonhosted.org/packages/0c/f7/addf1087b860ac60e6f382240f64fb99f8bfb532bb06f7c542b83c29ca61/multidict-6.7.1-cp314-cp314t-win_amd64.whl", hash = "sha256:497bde6223c212ba11d462853cfa4f0ae6ef97465033e7dc9940cdb3ab5b48e5", size = 53542, upload-time = "2026-01-26T02:46:08.809Z" }, + { url = "https://files.pythonhosted.org/packages/4c/81/4629d0aa32302ef7b2ec65c75a728cc5ff4fa410c50096174c1632e70b3e/multidict-6.7.1-cp314-cp314t-win_arm64.whl", hash = "sha256:2bbd113e0d4af5db41d5ebfe9ccaff89de2120578164f86a5d17d5a576d1e5b2", size = 44719, upload-time = "2026-01-26T02:46:11.146Z" }, + { url = "https://files.pythonhosted.org/packages/81/08/7036c080d7117f28a4af526d794aab6a84463126db031b007717c1a6676e/multidict-6.7.1-py3-none-any.whl", hash = "sha256:55d97cc6dae627efa6a6e548885712d4864b81110ac76fa4e534c03819fa4a56", size = 12319, upload-time = "2026-01-26T02:46:44.004Z" }, +] + +[[package]] +name = "networkx" +version = "3.4.2" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version < '3.11'", +] +sdist = { url = "https://files.pythonhosted.org/packages/fd/1d/06475e1cd5264c0b870ea2cc6fdb3e37177c1e565c43f56ff17a10e3937f/networkx-3.4.2.tar.gz", hash = "sha256:307c3669428c5362aab27c8a1260aa8f47c4e91d3891f48be0141738d8d053e1", size = 2151368, upload-time = "2024-10-21T12:39:38.695Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/b9/54/dd730b32ea14ea797530a4479b2ed46a6fb250f682a9cfb997e968bf0261/networkx-3.4.2-py3-none-any.whl", hash = "sha256:df5d4365b724cf81b8c6a7312509d0c22386097011ad1abe274afd5e9d3bbc5f", size = 1723263, upload-time = "2024-10-21T12:39:36.247Z" }, +] + +[[package]] +name = "networkx" +version = "3.6.1" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version >= '3.14' and sys_platform == 'win32'", + "python_full_version >= '3.14' and sys_platform == 'emscripten'", + "python_full_version >= '3.14' and sys_platform != 'emscripten' and sys_platform != 'win32'", + "python_full_version == '3.13.*' and sys_platform == 'win32'", + "python_full_version == '3.13.*' and sys_platform == 'emscripten'", + "python_full_version == '3.13.*' and sys_platform != 'emscripten' and sys_platform != 'win32'", + "python_full_version == '3.12.*' and sys_platform == 'win32'", + "python_full_version == '3.12.*' and sys_platform == 'emscripten'", + "python_full_version == '3.12.*' and sys_platform != 'emscripten' and sys_platform != 'win32'", + "python_full_version == '3.11.*' and sys_platform == 'win32'", + "python_full_version == '3.11.*' and sys_platform == 'emscripten'", + "python_full_version == '3.11.*' and sys_platform != 'emscripten' and sys_platform != 'win32'", +] +sdist = { url = "https://files.pythonhosted.org/packages/6a/51/63fe664f3908c97be9d2e4f1158eb633317598cfa6e1fc14af5383f17512/networkx-3.6.1.tar.gz", hash = "sha256:26b7c357accc0c8cde558ad486283728b65b6a95d85ee1cd66bafab4c8168509", size = 2517025, upload-time = "2025-12-08T17:02:39.908Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/9e/c9/b2622292ea83fbb4ec318f5b9ab867d0a28ab43c5717bb85b0a5f6b3b0a4/networkx-3.6.1-py3-none-any.whl", hash = "sha256:d47fbf302e7d9cbbb9e2555a0d267983d2aa476bac30e90dfbe5669bd57f3762", size = 2068504, upload-time = "2025-12-08T17:02:38.159Z" }, +] + +[[package]] +name = "numba" +version = "0.64.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "llvmlite" }, + { name = "numpy", version = "2.2.6", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, + { name = "numpy", version = "2.4.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/23/c9/a0fb41787d01d621046138da30f6c2100d80857bf34b3390dd68040f27a3/numba-0.64.0.tar.gz", hash = "sha256:95e7300af648baa3308127b1955b52ce6d11889d16e8cfe637b4f85d2fca52b1", size = 2765679, upload-time = "2026-02-18T18:41:20.974Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/4c/5e/604fed821cd7e3426bb3bc99a7ed6ac0bcb489f4cd93052256437d082f95/numba-0.64.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:cc09b79440952e3098eeebea4bf6e8d2355fb7f12734fcd9fc5039f0dca90727", size = 2683250, upload-time = "2026-02-18T18:40:45.829Z" }, + { url = "https://files.pythonhosted.org/packages/4f/9f/9275a723d050b5f1a9b1c7fb7dbfce324fef301a8e50c5f88338569db06c/numba-0.64.0-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:1afe3a80b8c2f376b211fb7a49e536ef9eafc92436afc95a2f41ea5392f8cc65", size = 3742168, upload-time = "2026-02-18T18:40:48.066Z" }, + { url = "https://files.pythonhosted.org/packages/e2/d1/97ca7dddaa36b16f4c46319bdb6b4913ba15d0245317d0d8ccde7b2d7d92/numba-0.64.0-cp310-cp310-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:23804194b93b8cd416c6444b5fbc4956082a45fed2d25436ef49c594666e7f7e", size = 3449103, upload-time = "2026-02-18T18:40:49.905Z" }, + { url = "https://files.pythonhosted.org/packages/52/0a/b9e137ad78415373e3353564500e8bf29dbce3c0d73633bb384d4e5d7537/numba-0.64.0-cp310-cp310-win_amd64.whl", hash = "sha256:e2a9fe998bb2cf848960b34db02c2c3b5e02cf82c07a26d9eef3494069740278", size = 2749950, upload-time = "2026-02-18T18:40:51.536Z" }, + { url = "https://files.pythonhosted.org/packages/89/a3/1a4286a1c16136c8896d8e2090d950e79b3ec626d3a8dc9620f6234d5a38/numba-0.64.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:766156ee4b8afeeb2b2e23c81307c5d19031f18d5ce76ae2c5fb1429e72fa92b", size = 2682938, upload-time = "2026-02-18T18:40:52.897Z" }, + { url = "https://files.pythonhosted.org/packages/19/16/aa6e3ba3cd45435c117d1101b278b646444ed05b7c712af631b91353f573/numba-0.64.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:d17071b4ffc9d39b75d8e6c101a36f0c81b646123859898c9799cb31807c8f78", size = 3747376, upload-time = "2026-02-18T18:40:54.925Z" }, + { url = "https://files.pythonhosted.org/packages/c0/f1/dd2f25e18d75fdf897f730b78c5a7b00cc4450f2405564dbebfaf359f21f/numba-0.64.0-cp311-cp311-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:4ead5630434133bac87fa67526eacb264535e4e9a2d5ec780e0b4fc381a7d275", size = 3453292, upload-time = "2026-02-18T18:40:56.818Z" }, + { url = "https://files.pythonhosted.org/packages/31/29/e09d5630578a50a2b3fa154990b6b839cf95327aa0709e2d50d0b6816cd1/numba-0.64.0-cp311-cp311-win_amd64.whl", hash = "sha256:f2b1fd93e7aaac07d6fbaed059c00679f591f2423885c206d8c1b55d65ca3f2d", size = 2749824, upload-time = "2026-02-18T18:40:58.392Z" }, + { url = "https://files.pythonhosted.org/packages/70/a6/9fc52cb4f0d5e6d8b5f4d81615bc01012e3cf24e1052a60f17a68deb8092/numba-0.64.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:69440a8e8bc1a81028446f06b363e28635aa67bd51b1e498023f03b812e0ce68", size = 2683418, upload-time = "2026-02-18T18:40:59.886Z" }, + { url = "https://files.pythonhosted.org/packages/9b/89/1a74ea99b180b7a5587b0301ed1b183a2937c4b4b67f7994689b5d36fc34/numba-0.64.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:f13721011f693ba558b8dd4e4db7f2640462bba1b855bdc804be45bbeb55031a", size = 3804087, upload-time = "2026-02-18T18:41:01.699Z" }, + { url = "https://files.pythonhosted.org/packages/91/e1/583c647404b15f807410510fec1eb9b80cb8474165940b7749f026f21cbc/numba-0.64.0-cp312-cp312-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:e0b180b1133f2b5d8b3f09d96b6d7a9e51a7da5dda3c09e998b5bcfac85d222c", size = 3504309, upload-time = "2026-02-18T18:41:03.252Z" }, + { url = "https://files.pythonhosted.org/packages/85/23/0fce5789b8a5035e7ace21216a468143f3144e02013252116616c58339aa/numba-0.64.0-cp312-cp312-win_amd64.whl", hash = "sha256:e63dc94023b47894849b8b106db28ccb98b49d5498b98878fac1a38f83ac007a", size = 2752740, upload-time = "2026-02-18T18:41:05.097Z" }, + { url = "https://files.pythonhosted.org/packages/52/80/2734de90f9300a6e2503b35ee50d9599926b90cbb7ac54f9e40074cd07f1/numba-0.64.0-cp313-cp313-macosx_12_0_arm64.whl", hash = "sha256:3bab2c872194dcd985f1153b70782ec0fbbe348fffef340264eacd3a76d59fd6", size = 2683392, upload-time = "2026-02-18T18:41:06.563Z" }, + { url = "https://files.pythonhosted.org/packages/42/e8/14b5853ebefd5b37723ef365c5318a30ce0702d39057eaa8d7d76392859d/numba-0.64.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:703a246c60832cad231d2e73c1182f25bf3cc8b699759ec8fe58a2dbc689a70c", size = 3812245, upload-time = "2026-02-18T18:41:07.963Z" }, + { url = "https://files.pythonhosted.org/packages/8a/a2/f60dc6c96d19b7185144265a5fbf01c14993d37ff4cd324b09d0212aa7ce/numba-0.64.0-cp313-cp313-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:7e2e49a7900ee971d32af7609adc0cfe6aa7477c6f6cccdf6d8138538cf7756f", size = 3511328, upload-time = "2026-02-18T18:41:09.504Z" }, + { url = "https://files.pythonhosted.org/packages/9c/2a/fe7003ea7e7237ee7014f8eaeeb7b0d228a2db22572ca85bab2648cf52cb/numba-0.64.0-cp313-cp313-win_amd64.whl", hash = "sha256:396f43c3f77e78d7ec84cdfc6b04969c78f8f169351b3c4db814b97e7acf4245", size = 2752668, upload-time = "2026-02-18T18:41:11.455Z" }, + { url = "https://files.pythonhosted.org/packages/3d/8a/77d26afe0988c592dd97cb8d4e80bfb3dfc7dbdacfca7d74a7c5c81dd8c2/numba-0.64.0-cp314-cp314-macosx_12_0_arm64.whl", hash = "sha256:f565d55eaeff382cbc86c63c8c610347453af3d1e7afb2b6569aac1c9b5c93ce", size = 2683590, upload-time = "2026-02-18T18:41:12.897Z" }, + { url = "https://files.pythonhosted.org/packages/8e/4b/600b8b7cdbc7f9cebee9ea3d13bb70052a79baf28944024ffcb59f0712e3/numba-0.64.0-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:9b55169b18892c783f85e9ad9e6f5297a6d12967e4414e6b71361086025ff0bb", size = 3781163, upload-time = "2026-02-18T18:41:15.377Z" }, + { url = "https://files.pythonhosted.org/packages/ff/73/53f2d32bfa45b7175e9944f6b816d8c32840178c3eee9325033db5bf838e/numba-0.64.0-cp314-cp314-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:196bcafa02c9dd1707e068434f6d5cedde0feb787e3432f7f1f0e993cc336c4c", size = 3481172, upload-time = "2026-02-18T18:41:17.281Z" }, + { url = "https://files.pythonhosted.org/packages/b5/00/aebd2f7f1e11e38814bb96e95a27580817a7b340608d3ac085fdbab83174/numba-0.64.0-cp314-cp314-win_amd64.whl", hash = "sha256:213e9acbe7f1c05090592e79020315c1749dd52517b90e94c517dca3f014d4a1", size = 2754700, upload-time = "2026-02-18T18:41:19.277Z" }, +] + +[[package]] +name = "numpy" +version = "2.2.6" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version < '3.11'", +] +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" } +wheels = [ + { 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" }, + { 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" }, + { 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" }, + { 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" }, + { 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" }, + { 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" }, + { 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" }, + { 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" }, + { 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" }, + { 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" }, + { 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" }, + { 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" }, + { 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" }, + { 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" }, + { 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" }, + { 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" }, + { 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" }, + { 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" }, + { 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" }, + { 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" }, + { 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" }, + { 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" }, + { 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" }, + { 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" }, + { 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" }, + { 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" }, + { 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" }, + { 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" }, + { 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" }, + { 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" }, + { 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" }, + { 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" }, + { 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" }, + { 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" }, + { 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" }, + { 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" }, + { 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" }, + { 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" }, + { 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" }, + { 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" }, + { 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" }, + { 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" }, + { 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" }, + { 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" }, + { 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" }, + { 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" }, + { 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" }, + { 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" }, + { 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" }, + { 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" }, + { 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" }, + { 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" }, + { 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" }, + { 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" }, +] + +[[package]] +name = "numpy" +version = "2.4.3" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version >= '3.14' and sys_platform == 'win32'", + "python_full_version >= '3.14' and sys_platform == 'emscripten'", + "python_full_version >= '3.14' and sys_platform != 'emscripten' and sys_platform != 'win32'", + "python_full_version == '3.13.*' and sys_platform == 'win32'", + "python_full_version == '3.13.*' and sys_platform == 'emscripten'", + "python_full_version == '3.13.*' and sys_platform != 'emscripten' and sys_platform != 'win32'", + "python_full_version == '3.12.*' and sys_platform == 'win32'", + "python_full_version == '3.12.*' and sys_platform == 'emscripten'", + "python_full_version == '3.12.*' and sys_platform != 'emscripten' and sys_platform != 'win32'", + "python_full_version == '3.11.*' and sys_platform == 'win32'", + "python_full_version == '3.11.*' and sys_platform == 'emscripten'", + "python_full_version == '3.11.*' and sys_platform != 'emscripten' and sys_platform != 'win32'", +] +sdist = { url = "https://files.pythonhosted.org/packages/10/8b/c265f4823726ab832de836cdd184d0986dcf94480f81e8739692a7ac7af2/numpy-2.4.3.tar.gz", hash = "sha256:483a201202b73495f00dbc83796c6ae63137a9bdade074f7648b3e32613412dd", size = 20727743, upload-time = "2026-03-09T07:58:53.426Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/f9/51/5093a2df15c4dc19da3f79d1021e891f5dcf1d9d1db6ba38891d5590f3fe/numpy-2.4.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:33b3bf58ee84b172c067f56aeadc7ee9ab6de69c5e800ab5b10295d54c581adb", size = 16957183, upload-time = "2026-03-09T07:55:57.774Z" }, + { url = "https://files.pythonhosted.org/packages/b5/7c/c061f3de0630941073d2598dc271ac2f6cbcf5c83c74a5870fea07488333/numpy-2.4.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:8ba7b51e71c05aa1f9bc3641463cd82308eab40ce0d5c7e1fd4038cbf9938147", size = 14968734, upload-time = "2026-03-09T07:56:00.494Z" }, + { url = "https://files.pythonhosted.org/packages/ef/27/d26c85cbcd86b26e4f125b0668e7a7c0542d19dd7d23ee12e87b550e95b5/numpy-2.4.3-cp311-cp311-macosx_14_0_arm64.whl", hash = "sha256:a1988292870c7cb9d0ebb4cc96b4d447513a9644801de54606dc7aabf2b7d920", size = 5475288, upload-time = "2026-03-09T07:56:02.857Z" }, + { url = "https://files.pythonhosted.org/packages/2b/09/3c4abbc1dcd8010bf1a611d174c7aa689fc505585ec806111b4406f6f1b1/numpy-2.4.3-cp311-cp311-macosx_14_0_x86_64.whl", hash = "sha256:23b46bb6d8ecb68b58c09944483c135ae5f0e9b8d8858ece5e4ead783771d2a9", size = 6805253, upload-time = "2026-03-09T07:56:04.53Z" }, + { url = "https://files.pythonhosted.org/packages/21/bc/e7aa3f6817e40c3f517d407742337cbb8e6fc4b83ce0b55ab780c829243b/numpy-2.4.3-cp311-cp311-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:a016db5c5dba78fa8fe9f5d80d6708f9c42ab087a739803c0ac83a43d686a470", size = 15969479, upload-time = "2026-03-09T07:56:06.638Z" }, + { url = "https://files.pythonhosted.org/packages/78/51/9f5d7a41f0b51649ddf2f2320595e15e122a40610b233d51928dd6c92353/numpy-2.4.3-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:715de7f82e192e8cae5a507a347d97ad17598f8e026152ca97233e3666daaa71", size = 16901035, upload-time = "2026-03-09T07:56:09.405Z" }, + { url = "https://files.pythonhosted.org/packages/64/6e/b221dd847d7181bc5ee4857bfb026182ef69499f9305eb1371cbb1aea626/numpy-2.4.3-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:2ddb7919366ee468342b91dea2352824c25b55814a987847b6c52003a7c97f15", size = 17325657, upload-time = "2026-03-09T07:56:12.067Z" }, + { url = "https://files.pythonhosted.org/packages/eb/b8/8f3fd2da596e1063964b758b5e3c970aed1949a05200d7e3d46a9d46d643/numpy-2.4.3-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:a315e5234d88067f2d97e1f2ef670a7569df445d55400f1e33d117418d008d52", size = 18635512, upload-time = "2026-03-09T07:56:14.629Z" }, + { url = "https://files.pythonhosted.org/packages/5c/24/2993b775c37e39d2f8ab4125b44337ab0b2ba106c100980b7c274a22bee7/numpy-2.4.3-cp311-cp311-win32.whl", hash = "sha256:2b3f8d2c4589b1a2028d2a770b0fc4d1f332fb5e01521f4de3199a896d158ddd", size = 6238100, upload-time = "2026-03-09T07:56:17.243Z" }, + { url = "https://files.pythonhosted.org/packages/76/1d/edccf27adedb754db7c4511d5eac8b83f004ae948fe2d3509e8b78097d4c/numpy-2.4.3-cp311-cp311-win_amd64.whl", hash = "sha256:77e76d932c49a75617c6d13464e41203cd410956614d0a0e999b25e9e8d27eec", size = 12609816, upload-time = "2026-03-09T07:56:19.089Z" }, + { url = "https://files.pythonhosted.org/packages/92/82/190b99153480076c8dce85f4cfe7d53ea84444145ffa54cb58dcd460d66b/numpy-2.4.3-cp311-cp311-win_arm64.whl", hash = "sha256:eb610595dd91560905c132c709412b512135a60f1851ccbd2c959e136431ff67", size = 10485757, upload-time = "2026-03-09T07:56:21.753Z" }, + { url = "https://files.pythonhosted.org/packages/a9/ed/6388632536f9788cea23a3a1b629f25b43eaacd7d7377e5d6bc7b9deb69b/numpy-2.4.3-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:61b0cbabbb6126c8df63b9a3a0c4b1f44ebca5e12ff6997b80fcf267fb3150ef", size = 16669628, upload-time = "2026-03-09T07:56:24.252Z" }, + { url = "https://files.pythonhosted.org/packages/74/1b/ee2abfc68e1ce728b2958b6ba831d65c62e1b13ce3017c13943f8f9b5b2e/numpy-2.4.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:7395e69ff32526710748f92cd8c9849b361830968ea3e24a676f272653e8983e", size = 14696872, upload-time = "2026-03-09T07:56:26.991Z" }, + { url = "https://files.pythonhosted.org/packages/ba/d1/780400e915ff5638166f11ca9dc2c5815189f3d7cf6f8759a1685e586413/numpy-2.4.3-cp312-cp312-macosx_14_0_arm64.whl", hash = "sha256:abdce0f71dcb4a00e4e77f3faf05e4616ceccfe72ccaa07f47ee79cda3b7b0f4", size = 5203489, upload-time = "2026-03-09T07:56:29.414Z" }, + { url = "https://files.pythonhosted.org/packages/0b/bb/baffa907e9da4cc34a6e556d6d90e032f6d7a75ea47968ea92b4858826c4/numpy-2.4.3-cp312-cp312-macosx_14_0_x86_64.whl", hash = "sha256:48da3a4ee1336454b07497ff7ec83903efa5505792c4e6d9bf83d99dc07a1e18", size = 6550814, upload-time = "2026-03-09T07:56:32.225Z" }, + { url = "https://files.pythonhosted.org/packages/7b/12/8c9f0c6c95f76aeb20fc4a699c33e9f827fa0d0f857747c73bb7b17af945/numpy-2.4.3-cp312-cp312-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:32e3bef222ad6b052280311d1d60db8e259e4947052c3ae7dd6817451fc8a4c5", size = 15666601, upload-time = "2026-03-09T07:56:34.461Z" }, + { url = "https://files.pythonhosted.org/packages/bd/79/cc665495e4d57d0aa6fbcc0aa57aa82671dfc78fbf95fe733ed86d98f52a/numpy-2.4.3-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:e7dd01a46700b1967487141a66ac1a3cf0dd8ebf1f08db37d46389401512ca97", size = 16621358, upload-time = "2026-03-09T07:56:36.852Z" }, + { url = "https://files.pythonhosted.org/packages/a8/40/b4ecb7224af1065c3539f5ecfff879d090de09608ad1008f02c05c770cb3/numpy-2.4.3-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:76f0f283506c28b12bba319c0fab98217e9f9b54e6160e9c79e9f7348ba32e9c", size = 17016135, upload-time = "2026-03-09T07:56:39.337Z" }, + { url = "https://files.pythonhosted.org/packages/f7/b1/6a88e888052eed951afed7a142dcdf3b149a030ca59b4c71eef085858e43/numpy-2.4.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:737f630a337364665aba3b5a77e56a68cc42d350edd010c345d65a3efa3addcc", size = 18345816, upload-time = "2026-03-09T07:56:42.31Z" }, + { url = "https://files.pythonhosted.org/packages/f3/8f/103a60c5f8c3d7fc678c19cd7b2476110da689ccb80bc18050efbaeae183/numpy-2.4.3-cp312-cp312-win32.whl", hash = "sha256:26952e18d82a1dbbc2f008d402021baa8d6fc8e84347a2072a25e08b46d698b9", size = 5960132, upload-time = "2026-03-09T07:56:44.851Z" }, + { url = "https://files.pythonhosted.org/packages/d7/7c/f5ee1bf6ed888494978046a809df2882aad35d414b622893322df7286879/numpy-2.4.3-cp312-cp312-win_amd64.whl", hash = "sha256:65f3c2455188f09678355f5cae1f959a06b778bc66d535da07bf2ef20cd319d5", size = 12316144, upload-time = "2026-03-09T07:56:47.057Z" }, + { url = "https://files.pythonhosted.org/packages/71/46/8d1cb3f7a00f2fb6394140e7e6623696e54c6318a9d9691bb4904672cf42/numpy-2.4.3-cp312-cp312-win_arm64.whl", hash = "sha256:2abad5c7fef172b3377502bde47892439bae394a71bc329f31df0fd829b41a9e", size = 10220364, upload-time = "2026-03-09T07:56:49.849Z" }, + { url = "https://files.pythonhosted.org/packages/b6/d0/1fe47a98ce0df229238b77611340aff92d52691bcbc10583303181abf7fc/numpy-2.4.3-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:b346845443716c8e542d54112966383b448f4a3ba5c66409771b8c0889485dd3", size = 16665297, upload-time = "2026-03-09T07:56:52.296Z" }, + { url = "https://files.pythonhosted.org/packages/27/d9/4e7c3f0e68dfa91f21c6fb6cf839bc829ec920688b1ce7ec722b1a6202fb/numpy-2.4.3-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:2629289168f4897a3c4e23dc98d6f1731f0fc0fe52fb9db19f974041e4cc12b9", size = 14691853, upload-time = "2026-03-09T07:56:54.992Z" }, + { url = "https://files.pythonhosted.org/packages/3a/66/bd096b13a87549683812b53ab211e6d413497f84e794fb3c39191948da97/numpy-2.4.3-cp313-cp313-macosx_14_0_arm64.whl", hash = "sha256:bb2e3cf95854233799013779216c57e153c1ee67a0bf92138acca0e429aefaee", size = 5198435, upload-time = "2026-03-09T07:56:57.184Z" }, + { url = "https://files.pythonhosted.org/packages/a2/2f/687722910b5a5601de2135c891108f51dfc873d8e43c8ed9f4ebb440b4a2/numpy-2.4.3-cp313-cp313-macosx_14_0_x86_64.whl", hash = "sha256:7f3408ff897f8ab07a07fbe2823d7aee6ff644c097cc1f90382511fe982f647f", size = 6546347, upload-time = "2026-03-09T07:56:59.531Z" }, + { url = "https://files.pythonhosted.org/packages/bf/ec/7971c4e98d86c564750393fab8d7d83d0a9432a9d78bb8a163a6dc59967a/numpy-2.4.3-cp313-cp313-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:decb0eb8a53c3b009b0962378065589685d66b23467ef5dac16cbe818afde27f", size = 15664626, upload-time = "2026-03-09T07:57:01.385Z" }, + { url = "https://files.pythonhosted.org/packages/7e/eb/7daecbea84ec935b7fc732e18f532073064a3816f0932a40a17f3349185f/numpy-2.4.3-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:d5f51900414fc9204a0e0da158ba2ac52b75656e7dce7e77fb9f84bfa343b4cc", size = 16608916, upload-time = "2026-03-09T07:57:04.008Z" }, + { url = "https://files.pythonhosted.org/packages/df/58/2a2b4a817ffd7472dca4421d9f0776898b364154e30c95f42195041dc03b/numpy-2.4.3-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:6bd06731541f89cdc01b261ba2c9e037f1543df7472517836b78dfb15bd6e476", size = 17015824, upload-time = "2026-03-09T07:57:06.347Z" }, + { url = "https://files.pythonhosted.org/packages/4a/ca/627a828d44e78a418c55f82dd4caea8ea4a8ef24e5144d9e71016e52fb40/numpy-2.4.3-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:22654fe6be0e5206f553a9250762c653d3698e46686eee53b399ab90da59bd92", size = 18334581, upload-time = "2026-03-09T07:57:09.114Z" }, + { url = "https://files.pythonhosted.org/packages/cd/c0/76f93962fc79955fcba30a429b62304332345f22d4daec1cb33653425643/numpy-2.4.3-cp313-cp313-win32.whl", hash = "sha256:d71e379452a2f670ccb689ec801b1218cd3983e253105d6e83780967e899d687", size = 5958618, upload-time = "2026-03-09T07:57:11.432Z" }, + { url = "https://files.pythonhosted.org/packages/b1/3c/88af0040119209b9b5cb59485fa48b76f372c73068dbf9254784b975ac53/numpy-2.4.3-cp313-cp313-win_amd64.whl", hash = "sha256:0a60e17a14d640f49146cb38e3f105f571318db7826d9b6fef7e4dce758faecd", size = 12312824, upload-time = "2026-03-09T07:57:13.586Z" }, + { url = "https://files.pythonhosted.org/packages/58/ce/3d07743aced3d173f877c3ef6a454c2174ba42b584ab0b7e6d99374f51ed/numpy-2.4.3-cp313-cp313-win_arm64.whl", hash = "sha256:c9619741e9da2059cd9c3f206110b97583c7152c1dc9f8aafd4beb450ac1c89d", size = 10221218, upload-time = "2026-03-09T07:57:16.183Z" }, + { url = "https://files.pythonhosted.org/packages/62/09/d96b02a91d09e9d97862f4fc8bfebf5400f567d8eb1fe4b0cc4795679c15/numpy-2.4.3-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:7aa4e54f6469300ebca1d9eb80acd5253cdfa36f2c03d79a35883687da430875", size = 14819570, upload-time = "2026-03-09T07:57:18.564Z" }, + { url = "https://files.pythonhosted.org/packages/b5/ca/0b1aba3905fdfa3373d523b2b15b19029f4f3031c87f4066bd9d20ef6c6b/numpy-2.4.3-cp313-cp313t-macosx_14_0_arm64.whl", hash = "sha256:d1b90d840b25874cf5cd20c219af10bac3667db3876d9a495609273ebe679070", size = 5326113, upload-time = "2026-03-09T07:57:21.052Z" }, + { url = "https://files.pythonhosted.org/packages/c0/63/406e0fd32fcaeb94180fd6a4c41e55736d676c54346b7efbce548b94a914/numpy-2.4.3-cp313-cp313t-macosx_14_0_x86_64.whl", hash = "sha256:a749547700de0a20a6718293396ec237bb38218049cfce788e08fcb716e8cf73", size = 6646370, upload-time = "2026-03-09T07:57:22.804Z" }, + { url = "https://files.pythonhosted.org/packages/b6/d0/10f7dc157d4b37af92720a196be6f54f889e90dcd30dce9dc657ed92c257/numpy-2.4.3-cp313-cp313t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:94f3c4a151a2e529adf49c1d54f0f57ff8f9b233ee4d44af623a81553ab86368", size = 15723499, upload-time = "2026-03-09T07:57:24.693Z" }, + { url = "https://files.pythonhosted.org/packages/66/f1/d1c2bf1161396629701bc284d958dc1efa3a5a542aab83cf11ee6eb4cba5/numpy-2.4.3-cp313-cp313t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:22c31dc07025123aedf7f2db9e91783df13f1776dc52c6b22c620870dc0fab22", size = 16657164, upload-time = "2026-03-09T07:57:27.676Z" }, + { url = "https://files.pythonhosted.org/packages/1a/be/cca19230b740af199ac47331a21c71e7a3d0ba59661350483c1600d28c37/numpy-2.4.3-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:148d59127ac95979d6f07e4d460f934ebdd6eed641db9c0db6c73026f2b2101a", size = 17081544, upload-time = "2026-03-09T07:57:30.664Z" }, + { url = "https://files.pythonhosted.org/packages/b9/c5/9602b0cbb703a0936fb40f8a95407e8171935b15846de2f0776e08af04c7/numpy-2.4.3-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:a97cbf7e905c435865c2d939af3d93f99d18eaaa3cabe4256f4304fb51604349", size = 18380290, upload-time = "2026-03-09T07:57:33.763Z" }, + { url = "https://files.pythonhosted.org/packages/ed/81/9f24708953cd30be9ee36ec4778f4b112b45165812f2ada4cc5ea1c1f254/numpy-2.4.3-cp313-cp313t-win32.whl", hash = "sha256:be3b8487d725a77acccc9924f65fd8bce9af7fac8c9820df1049424a2115af6c", size = 6082814, upload-time = "2026-03-09T07:57:36.491Z" }, + { url = "https://files.pythonhosted.org/packages/e2/9e/52f6eaa13e1a799f0ab79066c17f7016a4a8ae0c1aefa58c82b4dab690b4/numpy-2.4.3-cp313-cp313t-win_amd64.whl", hash = "sha256:1ec84fd7c8e652b0f4aaaf2e6e9cc8eaa9b1b80a537e06b2e3a2fb176eedcb26", size = 12452673, upload-time = "2026-03-09T07:57:38.281Z" }, + { url = "https://files.pythonhosted.org/packages/c4/04/b8cece6ead0b30c9fbd99bb835ad7ea0112ac5f39f069788c5558e3b1ab2/numpy-2.4.3-cp313-cp313t-win_arm64.whl", hash = "sha256:120df8c0a81ebbf5b9020c91439fccd85f5e018a927a39f624845be194a2be02", size = 10290907, upload-time = "2026-03-09T07:57:40.747Z" }, + { url = "https://files.pythonhosted.org/packages/70/ae/3936f79adebf8caf81bd7a599b90a561334a658be4dcc7b6329ebf4ee8de/numpy-2.4.3-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:5884ce5c7acfae1e4e1b6fde43797d10aa506074d25b531b4f54bde33c0c31d4", size = 16664563, upload-time = "2026-03-09T07:57:43.817Z" }, + { url = "https://files.pythonhosted.org/packages/9b/62/760f2b55866b496bb1fa7da2a6db076bef908110e568b02fcfc1422e2a3a/numpy-2.4.3-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:297837823f5bc572c5f9379b0c9f3a3365f08492cbdc33bcc3af174372ebb168", size = 14702161, upload-time = "2026-03-09T07:57:46.169Z" }, + { url = "https://files.pythonhosted.org/packages/32/af/a7a39464e2c0a21526fb4fb76e346fb172ebc92f6d1c7a07c2c139cc17b1/numpy-2.4.3-cp314-cp314-macosx_14_0_arm64.whl", hash = "sha256:a111698b4a3f8dcbe54c64a7708f049355abd603e619013c346553c1fd4ca90b", size = 5208738, upload-time = "2026-03-09T07:57:48.506Z" }, + { url = "https://files.pythonhosted.org/packages/29/8c/2a0cf86a59558fa078d83805589c2de490f29ed4fb336c14313a161d358a/numpy-2.4.3-cp314-cp314-macosx_14_0_x86_64.whl", hash = "sha256:4bd4741a6a676770e0e97fe9ab2e51de01183df3dcbcec591d26d331a40de950", size = 6543618, upload-time = "2026-03-09T07:57:50.591Z" }, + { url = "https://files.pythonhosted.org/packages/aa/b8/612ce010c0728b1c363fa4ea3aa4c22fe1c5da1de008486f8c2f5cb92fae/numpy-2.4.3-cp314-cp314-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:54f29b877279d51e210e0c80709ee14ccbbad647810e8f3d375561c45ef613dd", size = 15680676, upload-time = "2026-03-09T07:57:52.34Z" }, + { url = "https://files.pythonhosted.org/packages/a9/7e/4f120ecc54ba26ddf3dc348eeb9eb063f421de65c05fc961941798feea18/numpy-2.4.3-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:679f2a834bae9020f81534671c56fd0cc76dd7e5182f57131478e23d0dc59e24", size = 16613492, upload-time = "2026-03-09T07:57:54.91Z" }, + { url = "https://files.pythonhosted.org/packages/2c/86/1b6020db73be330c4b45d5c6ee4295d59cfeef0e3ea323959d053e5a6909/numpy-2.4.3-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:d84f0f881cb2225c2dfd7f78a10a5645d487a496c6668d6cc39f0f114164f3d0", size = 17031789, upload-time = "2026-03-09T07:57:57.641Z" }, + { url = "https://files.pythonhosted.org/packages/07/3a/3b90463bf41ebc21d1b7e06079f03070334374208c0f9a1f05e4ae8455e7/numpy-2.4.3-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:d213c7e6e8d211888cc359bab7199670a00f5b82c0978b9d1c75baf1eddbeac0", size = 18339941, upload-time = "2026-03-09T07:58:00.577Z" }, + { url = "https://files.pythonhosted.org/packages/a8/74/6d736c4cd962259fd8bae9be27363eb4883a2f9069763747347544c2a487/numpy-2.4.3-cp314-cp314-win32.whl", hash = "sha256:52077feedeff7c76ed7c9f1a0428558e50825347b7545bbb8523da2cd55c547a", size = 6007503, upload-time = "2026-03-09T07:58:03.331Z" }, + { url = "https://files.pythonhosted.org/packages/48/39/c56ef87af669364356bb011922ef0734fc49dad51964568634c72a009488/numpy-2.4.3-cp314-cp314-win_amd64.whl", hash = "sha256:0448e7f9caefb34b4b7dd2b77f21e8906e5d6f0365ad525f9f4f530b13df2afc", size = 12444915, upload-time = "2026-03-09T07:58:06.353Z" }, + { url = "https://files.pythonhosted.org/packages/9d/1f/ab8528e38d295fd349310807496fabb7cf9fe2e1f70b97bc20a483ea9d4a/numpy-2.4.3-cp314-cp314-win_arm64.whl", hash = "sha256:b44fd60341c4d9783039598efadd03617fa28d041fc37d22b62d08f2027fa0e7", size = 10494875, upload-time = "2026-03-09T07:58:08.734Z" }, + { url = "https://files.pythonhosted.org/packages/e6/ef/b7c35e4d5ef141b836658ab21a66d1a573e15b335b1d111d31f26c8ef80f/numpy-2.4.3-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:0a195f4216be9305a73c0e91c9b026a35f2161237cf1c6de9b681637772ea657", size = 14822225, upload-time = "2026-03-09T07:58:11.034Z" }, + { url = "https://files.pythonhosted.org/packages/cd/8d/7730fa9278cf6648639946cc816e7cc89f0d891602584697923375f801ed/numpy-2.4.3-cp314-cp314t-macosx_14_0_arm64.whl", hash = "sha256:cd32fbacb9fd1bf041bf8e89e4576b6f00b895f06d00914820ae06a616bdfef7", size = 5328769, upload-time = "2026-03-09T07:58:13.67Z" }, + { url = "https://files.pythonhosted.org/packages/47/01/d2a137317c958b074d338807c1b6a383406cdf8b8e53b075d804cc3d211d/numpy-2.4.3-cp314-cp314t-macosx_14_0_x86_64.whl", hash = "sha256:2e03c05abaee1f672e9d67bc858f300b5ccba1c21397211e8d77d98350972093", size = 6649461, upload-time = "2026-03-09T07:58:15.912Z" }, + { url = "https://files.pythonhosted.org/packages/5c/34/812ce12bc0f00272a4b0ec0d713cd237cb390666eb6206323d1cc9cedbb2/numpy-2.4.3-cp314-cp314t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:7d1ce23cce91fcea443320a9d0ece9b9305d4368875bab09538f7a5b4131938a", size = 15725809, upload-time = "2026-03-09T07:58:17.787Z" }, + { url = "https://files.pythonhosted.org/packages/25/c0/2aed473a4823e905e765fee3dc2cbf504bd3e68ccb1150fbdabd5c39f527/numpy-2.4.3-cp314-cp314t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:c59020932feb24ed49ffd03704fbab89f22aa9c0d4b180ff45542fe8918f5611", size = 16655242, upload-time = "2026-03-09T07:58:20.476Z" }, + { url = "https://files.pythonhosted.org/packages/f2/c8/7e052b2fc87aa0e86de23f20e2c42bd261c624748aa8efd2c78f7bb8d8c6/numpy-2.4.3-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:9684823a78a6cd6ad7511fc5e25b07947d1d5b5e2812c93fe99d7d4195130720", size = 17080660, upload-time = "2026-03-09T07:58:23.067Z" }, + { url = "https://files.pythonhosted.org/packages/f3/3d/0876746044db2adcb11549f214d104f2e1be00f07a67edbb4e2812094847/numpy-2.4.3-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:0200b25c687033316fb39f0ff4e3e690e8957a2c3c8d22499891ec58c37a3eb5", size = 18380384, upload-time = "2026-03-09T07:58:25.839Z" }, + { url = "https://files.pythonhosted.org/packages/07/12/8160bea39da3335737b10308df4f484235fd297f556745f13092aa039d3b/numpy-2.4.3-cp314-cp314t-win32.whl", hash = "sha256:5e10da9e93247e554bb1d22f8edc51847ddd7dde52d85ce31024c1b4312bfba0", size = 6154547, upload-time = "2026-03-09T07:58:28.289Z" }, + { url = "https://files.pythonhosted.org/packages/42/f3/76534f61f80d74cc9cdf2e570d3d4eeb92c2280a27c39b0aaf471eda7b48/numpy-2.4.3-cp314-cp314t-win_amd64.whl", hash = "sha256:45f003dbdffb997a03da2d1d0cb41fbd24a87507fb41605c0420a3db5bd4667b", size = 12633645, upload-time = "2026-03-09T07:58:30.384Z" }, + { url = "https://files.pythonhosted.org/packages/1f/b6/7c0d4334c15983cec7f92a69e8ce9b1e6f31857e5ee3a413ac424e6bd63d/numpy-2.4.3-cp314-cp314t-win_arm64.whl", hash = "sha256:4d382735cecd7bcf090172489a525cd7d4087bc331f7df9f60ddc9a296cf208e", size = 10565454, upload-time = "2026-03-09T07:58:33.031Z" }, + { url = "https://files.pythonhosted.org/packages/64/e4/4dab9fb43c83719c29241c535d9e07be73bea4bc0c6686c5816d8e1b6689/numpy-2.4.3-pp311-pypy311_pp73-macosx_10_15_x86_64.whl", hash = "sha256:c6b124bfcafb9e8d3ed09130dbee44848c20b3e758b6bbf006e641778927c028", size = 16834892, upload-time = "2026-03-09T07:58:35.334Z" }, + { url = "https://files.pythonhosted.org/packages/c9/29/f8b6d4af90fed3dfda84ebc0df06c9833d38880c79ce954e5b661758aa31/numpy-2.4.3-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:76dbb9d4e43c16cf9aa711fcd8de1e2eeb27539dcefb60a1d5e9f12fae1d1ed8", size = 14893070, upload-time = "2026-03-09T07:58:37.7Z" }, + { url = "https://files.pythonhosted.org/packages/9a/04/a19b3c91dbec0a49269407f15d5753673a09832daed40c45e8150e6fa558/numpy-2.4.3-pp311-pypy311_pp73-macosx_14_0_arm64.whl", hash = "sha256:29363fbfa6f8ee855d7569c96ce524845e3d726d6c19b29eceec7dd555dab152", size = 5399609, upload-time = "2026-03-09T07:58:39.853Z" }, + { url = "https://files.pythonhosted.org/packages/79/34/4d73603f5420eab89ea8a67097b31364bf7c30f811d4dd84b1659c7476d9/numpy-2.4.3-pp311-pypy311_pp73-macosx_14_0_x86_64.whl", hash = "sha256:bc71942c789ef415a37f0d4eab90341425a00d538cd0642445d30b41023d3395", size = 6714355, upload-time = "2026-03-09T07:58:42.365Z" }, + { url = "https://files.pythonhosted.org/packages/58/ad/1100d7229bb248394939a12a8074d485b655e8ed44207d328fdd7fcebc7b/numpy-2.4.3-pp311-pypy311_pp73-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:7e58765ad74dcebd3ef0208a5078fba32dc8ec3578fe84a604432950cd043d79", size = 15800434, upload-time = "2026-03-09T07:58:44.837Z" }, + { url = "https://files.pythonhosted.org/packages/0c/fd/16d710c085d28ba4feaf29ac60c936c9d662e390344f94a6beaa2ac9899b/numpy-2.4.3-pp311-pypy311_pp73-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:8e236dbda4e1d319d681afcbb136c0c4a8e0f1a5c58ceec2adebb547357fe857", size = 16729409, upload-time = "2026-03-09T07:58:47.972Z" }, + { url = "https://files.pythonhosted.org/packages/57/a7/b35835e278c18b85206834b3aa3abe68e77a98769c59233d1f6300284781/numpy-2.4.3-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:4b42639cdde6d24e732ff823a3fa5b701d8acad89c4142bc1d0bd6dc85200ba5", size = 12504685, upload-time = "2026-03-09T07:58:50.525Z" }, +] + +[[package]] +name = "nvidia-cublas-cu12" +version = "12.8.4.1" +source = { registry = "https://pypi.org/simple" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/dc/61/e24b560ab2e2eaeb3c839129175fb330dfcfc29e5203196e5541a4c44682/nvidia_cublas_cu12-12.8.4.1-py3-none-manylinux_2_27_x86_64.whl", hash = "sha256:8ac4e771d5a348c551b2a426eda6193c19aa630236b418086020df5ba9667142", size = 594346921, upload-time = "2025-03-07T01:44:31.254Z" }, +] + +[[package]] +name = "nvidia-cuda-cupti-cu12" +version = "12.8.90" +source = { registry = "https://pypi.org/simple" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/f8/02/2adcaa145158bf1a8295d83591d22e4103dbfd821bcaf6f3f53151ca4ffa/nvidia_cuda_cupti_cu12-12.8.90-py3-none-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:ea0cb07ebda26bb9b29ba82cda34849e73c166c18162d3913575b0c9db9a6182", size = 10248621, upload-time = "2025-03-07T01:40:21.213Z" }, +] + +[[package]] +name = "nvidia-cuda-nvrtc-cu12" +version = "12.8.93" +source = { registry = "https://pypi.org/simple" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/05/6b/32f747947df2da6994e999492ab306a903659555dddc0fbdeb9d71f75e52/nvidia_cuda_nvrtc_cu12-12.8.93-py3-none-manylinux2010_x86_64.manylinux_2_12_x86_64.whl", hash = "sha256:a7756528852ef889772a84c6cd89d41dfa74667e24cca16bb31f8f061e3e9994", size = 88040029, upload-time = "2025-03-07T01:42:13.562Z" }, +] + +[[package]] +name = "nvidia-cuda-runtime-cu12" +version = "12.8.90" +source = { registry = "https://pypi.org/simple" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/0d/9b/a997b638fcd068ad6e4d53b8551a7d30fe8b404d6f1804abf1df69838932/nvidia_cuda_runtime_cu12-12.8.90-py3-none-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:adade8dcbd0edf427b7204d480d6066d33902cab2a4707dcfc48a2d0fd44ab90", size = 954765, upload-time = "2025-03-07T01:40:01.615Z" }, +] + +[[package]] +name = "nvidia-cudnn-cu12" +version = "9.10.2.21" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "nvidia-cublas-cu12" }, +] +wheels = [ + { url = "https://files.pythonhosted.org/packages/ba/51/e123d997aa098c61d029f76663dedbfb9bc8dcf8c60cbd6adbe42f76d049/nvidia_cudnn_cu12-9.10.2.21-py3-none-manylinux_2_27_x86_64.whl", hash = "sha256:949452be657fa16687d0930933f032835951ef0892b37d2d53824d1a84dc97a8", size = 706758467, upload-time = "2025-06-06T21:54:08.597Z" }, +] + +[[package]] +name = "nvidia-cufft-cu12" +version = "11.3.3.83" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "nvidia-nvjitlink-cu12" }, +] +wheels = [ + { url = "https://files.pythonhosted.org/packages/1f/13/ee4e00f30e676b66ae65b4f08cb5bcbb8392c03f54f2d5413ea99a5d1c80/nvidia_cufft_cu12-11.3.3.83-py3-none-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:4d2dd21ec0b88cf61b62e6b43564355e5222e4a3fb394cac0db101f2dd0d4f74", size = 193118695, upload-time = "2025-03-07T01:45:27.821Z" }, +] + +[[package]] +name = "nvidia-cufile-cu12" +version = "1.13.1.3" +source = { registry = "https://pypi.org/simple" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/bb/fe/1bcba1dfbfb8d01be8d93f07bfc502c93fa23afa6fd5ab3fc7c1df71038a/nvidia_cufile_cu12-1.13.1.3-py3-none-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:1d069003be650e131b21c932ec3d8969c1715379251f8d23a1860554b1cb24fc", size = 1197834, upload-time = "2025-03-07T01:45:50.723Z" }, +] + +[[package]] +name = "nvidia-curand-cu12" +version = "10.3.9.90" +source = { registry = "https://pypi.org/simple" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/fb/aa/6584b56dc84ebe9cf93226a5cde4d99080c8e90ab40f0c27bda7a0f29aa1/nvidia_curand_cu12-10.3.9.90-py3-none-manylinux_2_27_x86_64.whl", hash = "sha256:b32331d4f4df5d6eefa0554c565b626c7216f87a06a4f56fab27c3b68a830ec9", size = 63619976, upload-time = "2025-03-07T01:46:23.323Z" }, +] + +[[package]] +name = "nvidia-cusolver-cu12" +version = "11.7.3.90" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "nvidia-cublas-cu12" }, + { name = "nvidia-cusparse-cu12" }, + { name = "nvidia-nvjitlink-cu12" }, +] +wheels = [ + { url = "https://files.pythonhosted.org/packages/85/48/9a13d2975803e8cf2777d5ed57b87a0b6ca2cc795f9a4f59796a910bfb80/nvidia_cusolver_cu12-11.7.3.90-py3-none-manylinux_2_27_x86_64.whl", hash = "sha256:4376c11ad263152bd50ea295c05370360776f8c3427b30991df774f9fb26c450", size = 267506905, upload-time = "2025-03-07T01:47:16.273Z" }, +] + +[[package]] +name = "nvidia-cusparse-cu12" +version = "12.5.8.93" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "nvidia-nvjitlink-cu12" }, +] +wheels = [ + { url = "https://files.pythonhosted.org/packages/c2/f5/e1854cb2f2bcd4280c44736c93550cc300ff4b8c95ebe370d0aa7d2b473d/nvidia_cusparse_cu12-12.5.8.93-py3-none-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:1ec05d76bbbd8b61b06a80e1eaf8cf4959c3d4ce8e711b65ebd0443bb0ebb13b", size = 288216466, upload-time = "2025-03-07T01:48:13.779Z" }, +] + +[[package]] +name = "nvidia-cusparselt-cu12" +version = "0.7.1" +source = { registry = "https://pypi.org/simple" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/56/79/12978b96bd44274fe38b5dde5cfb660b1d114f70a65ef962bcbbed99b549/nvidia_cusparselt_cu12-0.7.1-py3-none-manylinux2014_x86_64.whl", hash = "sha256:f1bb701d6b930d5a7cea44c19ceb973311500847f81b634d802b7b539dc55623", size = 287193691, upload-time = "2025-02-26T00:15:44.104Z" }, +] + +[[package]] +name = "nvidia-nccl-cu12" +version = "2.27.3" +source = { registry = "https://pypi.org/simple" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/5c/5b/4e4fff7bad39adf89f735f2bc87248c81db71205b62bcc0d5ca5b606b3c3/nvidia_nccl_cu12-2.27.3-py3-none-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:adf27ccf4238253e0b826bce3ff5fa532d65fc42322c8bfdfaf28024c0fbe039", size = 322364134, upload-time = "2025-06-03T21:58:04.013Z" }, +] + +[[package]] +name = "nvidia-nvjitlink-cu12" +version = "12.8.93" +source = { registry = "https://pypi.org/simple" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/f6/74/86a07f1d0f42998ca31312f998bd3b9a7eff7f52378f4f270c8679c77fb9/nvidia_nvjitlink_cu12-12.8.93-py3-none-manylinux2010_x86_64.manylinux_2_12_x86_64.whl", hash = "sha256:81ff63371a7ebd6e6451970684f916be2eab07321b73c9d244dc2b4da7f73b88", size = 39254836, upload-time = "2025-03-07T01:49:55.661Z" }, +] + +[[package]] +name = "nvidia-nvtx-cu12" +version = "12.8.90" +source = { registry = "https://pypi.org/simple" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/a2/eb/86626c1bbc2edb86323022371c39aa48df6fd8b0a1647bc274577f72e90b/nvidia_nvtx_cu12-12.8.90-py3-none-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:5b17e2001cc0d751a5bc2c6ec6d26ad95913324a4adb86788c944f8ce9ba441f", size = 89954, upload-time = "2025-03-07T01:42:44.131Z" }, +] + +[[package]] +name = "omegaconf" +version = "2.3.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "antlr4-python3-runtime" }, + { name = "pyyaml" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/09/48/6388f1bb9da707110532cb70ec4d2822858ddfb44f1cdf1233c20a80ea4b/omegaconf-2.3.0.tar.gz", hash = "sha256:d5d4b6d29955cc50ad50c46dc269bcd92c6e00f5f90d23ab5fee7bfca4ba4cc7", size = 3298120, upload-time = "2022-12-08T20:59:22.753Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/e3/94/1843518e420fa3ed6919835845df698c7e27e183cb997394e4a670973a65/omegaconf-2.3.0-py3-none-any.whl", hash = "sha256:7b4df175cdb08ba400f45cae3bdcae7ba8365db4d165fc65fd04b050ab63b46b", size = 79500, upload-time = "2022-12-08T20:59:19.686Z" }, +] + +[[package]] +name = "onnx" +version = "1.19.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "ml-dtypes" }, + { name = "numpy", version = "2.2.6", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, + { name = "numpy", version = "2.4.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, + { name = "protobuf" }, + { name = "typing-extensions" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/27/2f/c619eb65769357e9b6de9212c9a821ab39cd484448e5d6b3fb5fb0a64c6d/onnx-1.19.1.tar.gz", hash = "sha256:737524d6eb3907d3499ea459c6f01c5a96278bb3a0f2ff8ae04786fb5d7f1ed5", size = 12033525, upload-time = "2025-10-10T04:01:34.342Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/5b/f3/892eea0206ed13a986239bd508c82b974387ef1b0ffd83ece0ce0725aaf6/onnx-1.19.1-cp310-cp310-macosx_12_0_universal2.whl", hash = "sha256:7343250cc5276cf439fe623b8f92e11cf0d1eebc733ae4a8b2e86903bb72ae68", size = 18319433, upload-time = "2025-10-10T03:59:47.236Z" }, + { url = "https://files.pythonhosted.org/packages/9c/f3/c7ea4a1dfda9b9ddeff914a601ffaf5ed151b3352529f223eae74c03c8d1/onnx-1.19.1-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:1fb8f79de7f3920bb82b537f3c6ac70c0ce59f600471d9c3eed2b5f8b079b748", size = 18043327, upload-time = "2025-10-10T03:59:50.854Z" }, + { url = "https://files.pythonhosted.org/packages/8d/eb/30159bb6a108b03f2b7521410369a5bd8d296be3fbf0b30ab7acd9ef42ad/onnx-1.19.1-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:92b9d2dece41cc84213dbbfd1acbc2a28c27108c53bd28ddb6d1043fbfcbd2d5", size = 18216877, upload-time = "2025-10-10T03:59:54.512Z" }, + { url = "https://files.pythonhosted.org/packages/0c/86/dc034e5a723a20ca45aa8dd76dda53c358a5f955908e1436f42c21bdfb3a/onnx-1.19.1-cp310-cp310-win32.whl", hash = "sha256:c0b1a2b6bb19a0fc9f5de7661a547136d082c03c169a5215e18ff3ececd2a82f", size = 16344116, upload-time = "2025-10-10T03:59:57.991Z" }, + { url = "https://files.pythonhosted.org/packages/b6/60/537f2c19050f71445ee00ed91e78a396b6189dd1fce61b29ac6a0d651c7e/onnx-1.19.1-cp310-cp310-win_amd64.whl", hash = "sha256:1c0498c00db05fcdb3426697d330dcecc3f60020015065e2c76fa795f2c9a605", size = 16462819, upload-time = "2025-10-10T04:00:01.157Z" }, + { url = "https://files.pythonhosted.org/packages/36/07/0019c72924909e4f64b9199770630ab7b8d7914b912b03230e68f5eda7ae/onnx-1.19.1-cp311-cp311-macosx_12_0_universal2.whl", hash = "sha256:17aaf5832126de0a5197a5864e4f09a764dd7681d3035135547959b4b6b77a09", size = 18320936, upload-time = "2025-10-10T04:00:04.235Z" }, + { url = "https://files.pythonhosted.org/packages/af/2f/5c47acf740dc35f0decc640844260fbbdc0efa0565657c93fd7ff30f13f3/onnx-1.19.1-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:01b292a4d0b197c45d8184545bbc8ae1df83466341b604187c1b05902cb9c920", size = 18044269, upload-time = "2025-10-10T04:00:07.449Z" }, + { url = "https://files.pythonhosted.org/packages/d5/61/6c457ee8c3a62a3cad0a4bfa4c5436bb3ac4df90c3551d40bee1224b5b51/onnx-1.19.1-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:1839af08ab4a909e4af936b8149c27f8c64b96138981024e251906e0539d8bf9", size = 18218092, upload-time = "2025-10-10T04:00:11.135Z" }, + { url = "https://files.pythonhosted.org/packages/54/d5/ab832e1369505e67926a70e9a102061f89ad01f91aa296c4b1277cb81b25/onnx-1.19.1-cp311-cp311-win32.whl", hash = "sha256:0bdbb676e3722bd32f9227c465d552689f49086f986a696419d865cb4e70b989", size = 16344809, upload-time = "2025-10-10T04:00:14.634Z" }, + { url = "https://files.pythonhosted.org/packages/8b/b5/6eb4611d24b85002f878ba8476b4cecbe6f9784c0236a3c5eff85236cc0a/onnx-1.19.1-cp311-cp311-win_amd64.whl", hash = "sha256:1346853df5c1e3ebedb2e794cf2a51e0f33759affd655524864ccbcddad7035b", size = 16464319, upload-time = "2025-10-10T04:00:18.235Z" }, + { url = "https://files.pythonhosted.org/packages/0c/ff/f0e1f06420c70e20d497fec7c94a864d069943b6312bedd4224c0ab946f8/onnx-1.19.1-cp311-cp311-win_arm64.whl", hash = "sha256:2d69c280c0e665b7f923f499243b9bb84fe97970b7a4668afa0032045de602c8", size = 16437503, upload-time = "2025-10-10T04:00:21.247Z" }, + { url = "https://files.pythonhosted.org/packages/50/07/f6c5b2cffef8c29e739616d1415aea22f7b7ef1f19c17f02b7cff71f5498/onnx-1.19.1-cp312-cp312-macosx_12_0_universal2.whl", hash = "sha256:3612193a89ddbce5c4e86150869b9258780a82fb8c4ca197723a4460178a6ce9", size = 18327840, upload-time = "2025-10-10T04:00:24.259Z" }, + { url = "https://files.pythonhosted.org/packages/93/20/0568ebd52730287ae80cac8ac893a7301c793ea1630984e2519ee92b02a9/onnx-1.19.1-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:6c2fd2f744e7a3880ad0c262efa2edf6d965d0bd02b8f327ec516ad4cb0f2f15", size = 18042539, upload-time = "2025-10-10T04:00:27.693Z" }, + { url = "https://files.pythonhosted.org/packages/14/fd/cd7a0fd10a04f8cc5ae436b63e0022e236fe51b9dbb8ee6317fd48568c72/onnx-1.19.1-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:485d3674d50d789e0ee72fa6f6e174ab81cb14c772d594f992141bd744729d8a", size = 18218271, upload-time = "2025-10-10T04:00:30.495Z" }, + { url = "https://files.pythonhosted.org/packages/65/68/cc8b8c05469fe08384b446304ad7e6256131ca0463bf6962366eebec98c0/onnx-1.19.1-cp312-cp312-win32.whl", hash = "sha256:638bc56ff1a5718f7441e887aeb4e450f37a81c6eac482040381b140bd9ba601", size = 16345111, upload-time = "2025-10-10T04:00:34.982Z" }, + { url = "https://files.pythonhosted.org/packages/c7/5e/d1cb16693598a512c2cf9ffe0841d8d8fd2c83ae8e889efd554f5aa427cf/onnx-1.19.1-cp312-cp312-win_amd64.whl", hash = "sha256:bc7e2e4e163e679721e547958b5a7db875bf822cad371b7c1304aa4401a7c7a4", size = 16465621, upload-time = "2025-10-10T04:00:39.107Z" }, + { url = "https://files.pythonhosted.org/packages/90/32/da116cc61fdef334782aa7f87a1738431dd1af1a5d1a44bd95d6d51ad260/onnx-1.19.1-cp312-cp312-win_arm64.whl", hash = "sha256:17c215b1c0f20fe93b4cbe62668247c1d2294b9bc7f6be0ca9ced28e980c07b7", size = 16437505, upload-time = "2025-10-10T04:00:42.255Z" }, + { url = "https://files.pythonhosted.org/packages/b4/b8/ab1fdfe2e8502f4dc4289fc893db35816bd20d080d8370f86e74dda5f598/onnx-1.19.1-cp313-cp313-macosx_12_0_universal2.whl", hash = "sha256:4e5f938c68c4dffd3e19e4fd76eb98d298174eb5ebc09319cdd0ec5fe50050dc", size = 18327815, upload-time = "2025-10-10T04:00:45.682Z" }, + { url = "https://files.pythonhosted.org/packages/04/40/eb875745a4b92aea10e5e32aa2830f409c4d7b6f7b48ca1c4eaad96636c5/onnx-1.19.1-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:86e20a5984b017feeef2dbf4ceff1c7c161ab9423254968dd77d3696c38691d0", size = 18041464, upload-time = "2025-10-10T04:00:48.557Z" }, + { url = "https://files.pythonhosted.org/packages/cf/8e/8586135f40dbe4989cec4d413164bc8fc5c73d37c566f33f5ea3a7f2b6f6/onnx-1.19.1-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:c8d9c467f0f29993c12f330736af87972f30adb8329b515f39d63a0db929cb2c", size = 18218244, upload-time = "2025-10-10T04:00:51.891Z" }, + { url = "https://files.pythonhosted.org/packages/51/b5/4201254b8683129db5da3fb55aa1f7e56d0a8d45c66ce875dec21ca1ff25/onnx-1.19.1-cp313-cp313-win32.whl", hash = "sha256:65eee353a51b4e4ca3e797784661e5376e2b209f17557e04921eac9166a8752e", size = 16345330, upload-time = "2025-10-10T04:00:54.858Z" }, + { url = "https://files.pythonhosted.org/packages/69/67/c6d239afbcdbeb6805432969b908b5c9f700c96d332b34e3f99518d76caf/onnx-1.19.1-cp313-cp313-win_amd64.whl", hash = "sha256:c3bc87e38b53554b1fc9ef7b275c81c6f5c93c90a91935bb0aa8d4d498a6d48e", size = 16465567, upload-time = "2025-10-10T04:00:57.893Z" }, + { url = "https://files.pythonhosted.org/packages/99/fe/89f1e40f5bc54595ff0dcf5391ce19e578b528973ccc74dd99800196d30d/onnx-1.19.1-cp313-cp313-win_arm64.whl", hash = "sha256:e41496f400afb980ec643d80d5164753a88a85234fa5c06afdeebc8b7d1ec252", size = 16437562, upload-time = "2025-10-10T04:01:00.703Z" }, + { url = "https://files.pythonhosted.org/packages/86/43/b186ccbc8fe7e93643a6a6d40bbf2bb6ce4fb9469bbd3453c77e270c50ad/onnx-1.19.1-cp313-cp313t-macosx_12_0_universal2.whl", hash = "sha256:5f6274abf0fd74e80e78ecbb44bd44509409634525c89a9b38276c8af47dc0a2", size = 18355703, upload-time = "2025-10-10T04:01:03.735Z" }, + { url = "https://files.pythonhosted.org/packages/60/f1/22ee4d8b8f9fa4cb1d1b9579da3b4b5187ddab33846ec5ac744af02c0e2b/onnx-1.19.1-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:07dcd4d83584eb4bf8f21ac04c82643712e5e93ac2a0ed10121ec123cb127e1e", size = 18047830, upload-time = "2025-10-10T04:01:06.552Z" }, + { url = "https://files.pythonhosted.org/packages/8e/a4/8f3d51e3a095d42cdf2039a590cff06d024f2a10efbd0b1a2a6b3825f019/onnx-1.19.1-cp313-cp313t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:1975860c3e720db25d37f1619976582828264bdcc64fa7511c321ac4fc01add3", size = 18221126, upload-time = "2025-10-10T04:01:09.77Z" }, + { url = "https://files.pythonhosted.org/packages/4f/0d/f9d6c2237083f1aac14b37f0b03b0d81f1147a8e2af0c3828165e0a6a67b/onnx-1.19.1-cp313-cp313t-win_amd64.whl", hash = "sha256:9807d0e181f6070ee3a6276166acdc571575d1bd522fc7e89dba16fd6e7ffed9", size = 16465560, upload-time = "2025-10-10T04:01:13.212Z" }, + { url = "https://files.pythonhosted.org/packages/36/70/8418a58faa7d606d6a92cab69ae8d361b3b3969bf7e7e9a65a86d5d1b674/onnx-1.19.1-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:b6ee83e6929d75005482d9f304c502ac7c9b8d6db153aa6b484dae74d0f28570", size = 18042812, upload-time = "2025-10-10T04:01:15.919Z" }, +] + +[[package]] +name = "onnxruntime" +version = "1.23.2" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "coloredlogs" }, + { name = "flatbuffers" }, + { name = "numpy", version = "2.2.6", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, + { name = "numpy", version = "2.4.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, + { name = "packaging" }, + { name = "protobuf" }, + { name = "sympy" }, +] +wheels = [ + { url = "https://files.pythonhosted.org/packages/35/d6/311b1afea060015b56c742f3531168c1644650767f27ef40062569960587/onnxruntime-1.23.2-cp310-cp310-macosx_13_0_arm64.whl", hash = "sha256:a7730122afe186a784660f6ec5807138bf9d792fa1df76556b27307ea9ebcbe3", size = 17195934, upload-time = "2025-10-27T23:06:14.143Z" }, + { url = "https://files.pythonhosted.org/packages/db/db/81bf3d7cecfbfed9092b6b4052e857a769d62ed90561b410014e0aae18db/onnxruntime-1.23.2-cp310-cp310-macosx_13_0_x86_64.whl", hash = "sha256:b28740f4ecef1738ea8f807461dd541b8287d5650b5be33bca7b474e3cbd1f36", size = 19153079, upload-time = "2025-10-27T23:05:57.686Z" }, + { url = "https://files.pythonhosted.org/packages/2e/4d/a382452b17cf70a2313153c520ea4c96ab670c996cb3a95cc5d5ac7bfdac/onnxruntime-1.23.2-cp310-cp310-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:8f7d1fe034090a1e371b7f3ca9d3ccae2fabae8c1d8844fb7371d1ea38e8e8d2", size = 15219883, upload-time = "2025-10-22T03:46:21.66Z" }, + { url = "https://files.pythonhosted.org/packages/fb/56/179bf90679984c85b417664c26aae4f427cba7514bd2d65c43b181b7b08b/onnxruntime-1.23.2-cp310-cp310-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:4ca88747e708e5c67337b0f65eed4b7d0dd70d22ac332038c9fc4635760018f7", size = 17370357, upload-time = "2025-10-22T03:46:57.968Z" }, + { url = "https://files.pythonhosted.org/packages/cd/6d/738e50c47c2fd285b1e6c8083f15dac1a5f6199213378a5f14092497296d/onnxruntime-1.23.2-cp310-cp310-win_amd64.whl", hash = "sha256:0be6a37a45e6719db5120e9986fcd30ea205ac8103fd1fb74b6c33348327a0cc", size = 13467651, upload-time = "2025-10-27T23:06:11.904Z" }, + { url = "https://files.pythonhosted.org/packages/44/be/467b00f09061572f022ffd17e49e49e5a7a789056bad95b54dfd3bee73ff/onnxruntime-1.23.2-cp311-cp311-macosx_13_0_arm64.whl", hash = "sha256:6f91d2c9b0965e86827a5ba01531d5b669770b01775b23199565d6c1f136616c", size = 17196113, upload-time = "2025-10-22T03:47:33.526Z" }, + { url = "https://files.pythonhosted.org/packages/9f/a8/3c23a8f75f93122d2b3410bfb74d06d0f8da4ac663185f91866b03f7da1b/onnxruntime-1.23.2-cp311-cp311-macosx_13_0_x86_64.whl", hash = "sha256:87d8b6eaf0fbeb6835a60a4265fde7a3b60157cf1b2764773ac47237b4d48612", size = 19153857, upload-time = "2025-10-22T03:46:37.578Z" }, + { url = "https://files.pythonhosted.org/packages/3f/d8/506eed9af03d86f8db4880a4c47cd0dffee973ef7e4f4cff9f1d4bcf7d22/onnxruntime-1.23.2-cp311-cp311-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:bbfd2fca76c855317568c1b36a885ddea2272c13cb0e395002c402f2360429a6", size = 15220095, upload-time = "2025-10-22T03:46:24.769Z" }, + { url = "https://files.pythonhosted.org/packages/e9/80/113381ba832d5e777accedc6cb41d10f9eca82321ae31ebb6bcede530cea/onnxruntime-1.23.2-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:da44b99206e77734c5819aa2142c69e64f3b46edc3bd314f6a45a932defc0b3e", size = 17372080, upload-time = "2025-10-22T03:47:00.265Z" }, + { url = "https://files.pythonhosted.org/packages/3a/db/1b4a62e23183a0c3fe441782462c0ede9a2a65c6bbffb9582fab7c7a0d38/onnxruntime-1.23.2-cp311-cp311-win_amd64.whl", hash = "sha256:902c756d8b633ce0dedd889b7c08459433fbcf35e9c38d1c03ddc020f0648c6e", size = 13468349, upload-time = "2025-10-22T03:47:25.783Z" }, + { url = "https://files.pythonhosted.org/packages/1b/9e/f748cd64161213adeef83d0cb16cb8ace1e62fa501033acdd9f9341fff57/onnxruntime-1.23.2-cp312-cp312-macosx_13_0_arm64.whl", hash = "sha256:b8f029a6b98d3cf5be564d52802bb50a8489ab73409fa9db0bf583eabb7c2321", size = 17195929, upload-time = "2025-10-22T03:47:36.24Z" }, + { url = "https://files.pythonhosted.org/packages/91/9d/a81aafd899b900101988ead7fb14974c8a58695338ab6a0f3d6b0100f30b/onnxruntime-1.23.2-cp312-cp312-macosx_13_0_x86_64.whl", hash = "sha256:218295a8acae83905f6f1aed8cacb8e3eb3bd7513a13fe4ba3b2664a19fc4a6b", size = 19157705, upload-time = "2025-10-22T03:46:40.415Z" }, + { url = "https://files.pythonhosted.org/packages/3c/35/4e40f2fba272a6698d62be2cd21ddc3675edfc1a4b9ddefcc4648f115315/onnxruntime-1.23.2-cp312-cp312-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:76ff670550dc23e58ea9bc53b5149b99a44e63b34b524f7b8547469aaa0dcb8c", size = 15226915, upload-time = "2025-10-22T03:46:27.773Z" }, + { url = "https://files.pythonhosted.org/packages/ef/88/9cc25d2bafe6bc0d4d3c1db3ade98196d5b355c0b273e6a5dc09c5d5d0d5/onnxruntime-1.23.2-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:0f9b4ae77f8e3c9bee50c27bc1beede83f786fe1d52e99ac85aa8d65a01e9b77", size = 17382649, upload-time = "2025-10-22T03:47:02.782Z" }, + { url = "https://files.pythonhosted.org/packages/c0/b4/569d298f9fc4d286c11c45e85d9ffa9e877af12ace98af8cab52396e8f46/onnxruntime-1.23.2-cp312-cp312-win_amd64.whl", hash = "sha256:25de5214923ce941a3523739d34a520aac30f21e631de53bba9174dc9c004435", size = 13470528, upload-time = "2025-10-22T03:47:28.106Z" }, + { url = "https://files.pythonhosted.org/packages/3d/41/fba0cabccecefe4a1b5fc8020c44febb334637f133acefc7ec492029dd2c/onnxruntime-1.23.2-cp313-cp313-macosx_13_0_arm64.whl", hash = "sha256:2ff531ad8496281b4297f32b83b01cdd719617e2351ffe0dba5684fb283afa1f", size = 17196337, upload-time = "2025-10-22T03:46:35.168Z" }, + { url = "https://files.pythonhosted.org/packages/fe/f9/2d49ca491c6a986acce9f1d1d5fc2099108958cc1710c28e89a032c9cfe9/onnxruntime-1.23.2-cp313-cp313-macosx_13_0_x86_64.whl", hash = "sha256:162f4ca894ec3de1a6fd53589e511e06ecdc3ff646849b62a9da7489dee9ce95", size = 19157691, upload-time = "2025-10-22T03:46:43.518Z" }, + { url = "https://files.pythonhosted.org/packages/1c/a1/428ee29c6eaf09a6f6be56f836213f104618fb35ac6cc586ff0f477263eb/onnxruntime-1.23.2-cp313-cp313-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:45d127d6e1e9b99d1ebeae9bcd8f98617a812f53f46699eafeb976275744826b", size = 15226898, upload-time = "2025-10-22T03:46:30.039Z" }, + { url = "https://files.pythonhosted.org/packages/f2/2b/b57c8a2466a3126dbe0a792f56ad7290949b02f47b86216cd47d857e4b77/onnxruntime-1.23.2-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:8bace4e0d46480fbeeb7bbe1ffe1f080e6663a42d1086ff95c1551f2d39e7872", size = 17382518, upload-time = "2025-10-22T03:47:05.407Z" }, + { url = "https://files.pythonhosted.org/packages/4a/93/aba75358133b3a941d736816dd392f687e7eab77215a6e429879080b76b6/onnxruntime-1.23.2-cp313-cp313-win_amd64.whl", hash = "sha256:1f9cc0a55349c584f083c1c076e611a7c35d5b867d5d6e6d6c823bf821978088", size = 13470276, upload-time = "2025-10-22T03:47:31.193Z" }, + { url = "https://files.pythonhosted.org/packages/7c/3d/6830fa61c69ca8e905f237001dbfc01689a4e4ab06147020a4518318881f/onnxruntime-1.23.2-cp313-cp313t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:9d2385e774f46ac38f02b3a91a91e30263d41b2f1f4f26ae34805b2a9ddef466", size = 15229610, upload-time = "2025-10-22T03:46:32.239Z" }, + { url = "https://files.pythonhosted.org/packages/b6/ca/862b1e7a639460f0ca25fd5b6135fb42cf9deea86d398a92e44dfda2279d/onnxruntime-1.23.2-cp313-cp313t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:e2b9233c4947907fd1818d0e581c049c41ccc39b2856cc942ff6d26317cee145", size = 17394184, upload-time = "2025-10-22T03:47:08.127Z" }, +] + +[[package]] +name = "opentelemetry-api" +version = "1.34.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "importlib-metadata" }, + { name = "typing-extensions" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/4c/0b/4433d3f18301b541d98ea775fcbeab817fc7f962e980a75d17c967471b64/opentelemetry_api-1.34.0.tar.gz", hash = "sha256:48d167589134799093005b7f7f347c69cc67859c693b17787f334fbe8871279f", size = 64983, upload-time = "2025-06-04T13:31:26.107Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/98/f9/d50ba0c92a97a6d0861357d0ecd67e850d319ac7e7be1895cc236b6ed2b5/opentelemetry_api-1.34.0-py3-none-any.whl", hash = "sha256:390b81984affe4453180820ca518de55e3be051111e70cc241bb3b0071ca3a2c", size = 65768, upload-time = "2025-06-04T13:31:02.706Z" }, +] + +[[package]] +name = "opentelemetry-exporter-otlp" +version = "1.34.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "opentelemetry-exporter-otlp-proto-grpc" }, + { name = "opentelemetry-exporter-otlp-proto-http" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/27/3c/5670ffcb88691f8a29b753d2639550cf6726be4bd5d101373294419b7992/opentelemetry_exporter_otlp-1.34.0.tar.gz", hash = "sha256:d23df4fc22e0a863db2b2117c5a5780d5fa3bbeb65fdce9848d1f98fc3ace4cd", size = 6176, upload-time = "2025-06-04T13:31:27.372Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/71/9e/53cf14827b7e3084f28c73934f899cd3a3dde22efc3fe869a0ff7151ffd4/opentelemetry_exporter_otlp-1.34.0-py3-none-any.whl", hash = "sha256:73e2465560ef4e932b5348598593db202621eb666c34349c9cefc90a19aaf5c6", size = 7039, upload-time = "2025-06-04T13:31:04.832Z" }, +] + +[[package]] +name = "opentelemetry-exporter-otlp-proto-common" +version = "1.34.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "opentelemetry-proto" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/81/12/0d549f53e70a8297c1817705febe2bdb81479dc74c5b2496014f35f74455/opentelemetry_exporter_otlp_proto_common-1.34.0.tar.gz", hash = "sha256:5916d9ceda8c733adbec5e9cecf654fbf359e9f619ff43214277076fba888557", size = 20818, upload-time = "2025-06-04T13:31:28.136Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/e9/78/7bfd2d027aa36a68fff4019950569f8cda27793441098cda0a82ea2ecb89/opentelemetry_exporter_otlp_proto_common-1.34.0-py3-none-any.whl", hash = "sha256:a5ab7a9b7c3c7ba957c8ddcb08c0c93b1d732e066f544682a250ecf4d7a9ceef", size = 18835, upload-time = "2025-06-04T13:31:05.797Z" }, +] + +[[package]] +name = "opentelemetry-exporter-otlp-proto-grpc" +version = "1.34.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "googleapis-common-protos" }, + { name = "grpcio" }, + { name = "opentelemetry-api" }, + { name = "opentelemetry-exporter-otlp-proto-common" }, + { name = "opentelemetry-proto" }, + { name = "opentelemetry-sdk" }, + { name = "typing-extensions" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/51/d3/2d1037ba79cfd0cc01258ebf4ec5140d6cec5c337d885ed2f07502d2a1d3/opentelemetry_exporter_otlp_proto_grpc-1.34.0.tar.gz", hash = "sha256:a634425340f506d5ebf641c92d88eb873754d4c5259b5b816afb234c6f87b37d", size = 22565, upload-time = "2025-06-04T13:31:28.79Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/bd/42/094c93ffda2834631a121cdc89af80c7a9f2ee6249a4498d7f5151beb57e/opentelemetry_exporter_otlp_proto_grpc-1.34.0-py3-none-any.whl", hash = "sha256:31c41017af85833242d49beb07bde7341b0a145f0b898ee383f3e3019037afb1", size = 18612, upload-time = "2025-06-04T13:31:06.744Z" }, +] + +[[package]] +name = "opentelemetry-exporter-otlp-proto-http" +version = "1.34.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "googleapis-common-protos" }, + { name = "opentelemetry-api" }, + { name = "opentelemetry-exporter-otlp-proto-common" }, + { name = "opentelemetry-proto" }, + { name = "opentelemetry-sdk" }, + { name = "requests" }, + { name = "typing-extensions" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/99/80/c382acdddc75d440a4bc5283a1cda997435985031ec2d978d99ab3ef9461/opentelemetry_exporter_otlp_proto_http-1.34.0.tar.gz", hash = "sha256:3f674dbc32549a2fae413a77428d59b38e8c8b4caaf7f594ae2c2f8d2f018014", size = 15353, upload-time = "2025-06-04T13:31:29.388Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/69/c5/468c245231feff02ac41573a1d73b1bbd5ff0412365f441de785a4fa178c/opentelemetry_exporter_otlp_proto_http-1.34.0-py3-none-any.whl", hash = "sha256:b3cc9dd5152fae2dd32f3566bbfbc7d26d6ab3ef6c6b3f85bc9f6adc059d713f", size = 17743, upload-time = "2025-06-04T13:31:09.34Z" }, +] + +[[package]] +name = "opentelemetry-proto" +version = "1.34.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "protobuf" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/95/19/45adb533d0a34990942d12eefb2077d59b22958940c71484a45e694f5dd7/opentelemetry_proto-1.34.0.tar.gz", hash = "sha256:73e40509b692630a47192888424f7e0b8fb19d9ecf2f04e6f708170cd3346dfe", size = 34343, upload-time = "2025-06-04T13:31:35.695Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/db/58/708881f5ad3c72954caa61ac970d3c01209dbebf5e534fb840dfb777bad2/opentelemetry_proto-1.34.0-py3-none-any.whl", hash = "sha256:ffb1f1b27552fda5a1cd581e34243cc0b6f134fb14c1c2a33cc3b4b208c9bf97", size = 55691, upload-time = "2025-06-04T13:31:20.333Z" }, +] + +[[package]] +name = "opentelemetry-sdk" +version = "1.34.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "opentelemetry-api" }, + { name = "opentelemetry-semantic-conventions" }, + { name = "typing-extensions" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/52/07/8ca4b295322b5978e2cc4fab3f743ddabf72b82b5d2c50141471f573149d/opentelemetry_sdk-1.34.0.tar.gz", hash = "sha256:719559622afcd515c2aec462ccb749ba2e70075a01df45837623643814d33716", size = 159322, upload-time = "2025-06-04T13:31:36.333Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/55/96/5b788eef90a65543a67988729f0e44fc46eac1da455505ae5091f418a9d9/opentelemetry_sdk-1.34.0-py3-none-any.whl", hash = "sha256:7850bcd5b5c95f9aae48603d6592bdad5c7bdef50c03e06393f8f457d891fe32", size = 118385, upload-time = "2025-06-04T13:31:21.372Z" }, +] + +[[package]] +name = "opentelemetry-semantic-conventions" +version = "0.55b0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "opentelemetry-api" }, + { name = "typing-extensions" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/f1/64/b99165f7e205e103a83406fb5c3dde668c3a990b3fa0cbe358011095f4fa/opentelemetry_semantic_conventions-0.55b0.tar.gz", hash = "sha256:933d2e20c2dbc0f9b2f4f52138282875b4b14c66c491f5273bcdef1781368e9c", size = 119828, upload-time = "2025-06-04T13:31:37.118Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ca/b1/d7a2472f7da7e39f1a85f63951ad653c1126a632d6491c056ec6284a10a7/opentelemetry_semantic_conventions-0.55b0-py3-none-any.whl", hash = "sha256:63bb15b67377700e51c422d0d24092ca6ce9f3a4cb6f032375aa8af1fc2aab65", size = 196224, upload-time = "2025-06-04T13:31:22.451Z" }, +] + +[[package]] +name = "optuna" +version = "4.7.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "alembic" }, + { name = "colorlog" }, + { name = "numpy", version = "2.2.6", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, + { name = "numpy", version = "2.4.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, + { name = "packaging" }, + { name = "pyyaml" }, + { name = "sqlalchemy" }, + { name = "tqdm" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/58/b2/b5e12de7b4486556fe2257611b55dbabf30d0300bdb031831aa943ad20e4/optuna-4.7.0.tar.gz", hash = "sha256:d91817e2079825557bd2e97de2e8c9ae260bfc99b32712502aef8a5095b2d2c0", size = 479740, upload-time = "2026-01-19T05:45:52.604Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/75/d1/6c8a4fbb38a9e3565f5c36b871262a85ecab3da48120af036b1e4937a15c/optuna-4.7.0-py3-none-any.whl", hash = "sha256:e41ec84018cecc10eabf28143573b1f0bde0ba56dba8151631a590ecbebc1186", size = 413894, upload-time = "2026-01-19T05:45:50.815Z" }, +] + +[[package]] +name = "packaging" +version = "26.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/65/ee/299d360cdc32edc7d2cf530f3accf79c4fca01e96ffc950d8a52213bd8e4/packaging-26.0.tar.gz", hash = "sha256:00243ae351a257117b6a241061796684b084ed1c516a08c48a3f7e147a9d80b4", size = 143416, upload-time = "2026-01-21T20:50:39.064Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/b7/b9/c538f279a4e237a006a2c98387d081e9eb060d203d8ed34467cc0f0b9b53/packaging-26.0-py3-none-any.whl", hash = "sha256:b36f1fef9334a5588b4166f8bcd26a14e521f2b55e6b9de3aaa80d3ff7a37529", size = 74366, upload-time = "2026-01-21T20:50:37.788Z" }, +] + +[[package]] +name = "pandas" +version = "2.3.3" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version < '3.11'", +] +dependencies = [ + { name = "numpy", version = "2.2.6", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, + { name = "python-dateutil", marker = "python_full_version < '3.11'" }, + { name = "pytz", marker = "python_full_version < '3.11'" }, + { name = "tzdata", marker = "python_full_version < '3.11'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/33/01/d40b85317f86cf08d853a4f495195c73815fdf205eef3993821720274518/pandas-2.3.3.tar.gz", hash = "sha256:e05e1af93b977f7eafa636d043f9f94c7ee3ac81af99c13508215942e64c993b", size = 4495223, upload-time = "2025-09-29T23:34:51.853Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/3d/f7/f425a00df4fcc22b292c6895c6831c0c8ae1d9fac1e024d16f98a9ce8749/pandas-2.3.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:376c6446ae31770764215a6c937f72d917f214b43560603cd60da6408f183b6c", size = 11555763, upload-time = "2025-09-29T23:16:53.287Z" }, + { url = "https://files.pythonhosted.org/packages/13/4f/66d99628ff8ce7857aca52fed8f0066ce209f96be2fede6cef9f84e8d04f/pandas-2.3.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:e19d192383eab2f4ceb30b412b22ea30690c9e618f78870357ae1d682912015a", size = 10801217, upload-time = "2025-09-29T23:17:04.522Z" }, + { url = "https://files.pythonhosted.org/packages/1d/03/3fc4a529a7710f890a239cc496fc6d50ad4a0995657dccc1d64695adb9f4/pandas-2.3.3-cp310-cp310-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:5caf26f64126b6c7aec964f74266f435afef1c1b13da3b0636c7518a1fa3e2b1", size = 12148791, upload-time = "2025-09-29T23:17:18.444Z" }, + { url = "https://files.pythonhosted.org/packages/40/a8/4dac1f8f8235e5d25b9955d02ff6f29396191d4e665d71122c3722ca83c5/pandas-2.3.3-cp310-cp310-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:dd7478f1463441ae4ca7308a70e90b33470fa593429f9d4c578dd00d1fa78838", size = 12769373, upload-time = "2025-09-29T23:17:35.846Z" }, + { url = "https://files.pythonhosted.org/packages/df/91/82cc5169b6b25440a7fc0ef3a694582418d875c8e3ebf796a6d6470aa578/pandas-2.3.3-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:4793891684806ae50d1288c9bae9330293ab4e083ccd1c5e383c34549c6e4250", size = 13200444, upload-time = "2025-09-29T23:17:49.341Z" }, + { url = "https://files.pythonhosted.org/packages/10/ae/89b3283800ab58f7af2952704078555fa60c807fff764395bb57ea0b0dbd/pandas-2.3.3-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:28083c648d9a99a5dd035ec125d42439c6c1c525098c58af0fc38dd1a7a1b3d4", size = 13858459, upload-time = "2025-09-29T23:18:03.722Z" }, + { url = "https://files.pythonhosted.org/packages/85/72/530900610650f54a35a19476eca5104f38555afccda1aa11a92ee14cb21d/pandas-2.3.3-cp310-cp310-win_amd64.whl", hash = "sha256:503cf027cf9940d2ceaa1a93cfb5f8c8c7e6e90720a2850378f0b3f3b1e06826", size = 11346086, upload-time = "2025-09-29T23:18:18.505Z" }, + { url = "https://files.pythonhosted.org/packages/c1/fa/7ac648108144a095b4fb6aa3de1954689f7af60a14cf25583f4960ecb878/pandas-2.3.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:602b8615ebcc4a0c1751e71840428ddebeb142ec02c786e8ad6b1ce3c8dec523", size = 11578790, upload-time = "2025-09-29T23:18:30.065Z" }, + { url = "https://files.pythonhosted.org/packages/9b/35/74442388c6cf008882d4d4bdfc4109be87e9b8b7ccd097ad1e7f006e2e95/pandas-2.3.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:8fe25fc7b623b0ef6b5009149627e34d2a4657e880948ec3c840e9402e5c1b45", size = 10833831, upload-time = "2025-09-29T23:38:56.071Z" }, + { url = "https://files.pythonhosted.org/packages/fe/e4/de154cbfeee13383ad58d23017da99390b91d73f8c11856f2095e813201b/pandas-2.3.3-cp311-cp311-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b468d3dad6ff947df92dcb32ede5b7bd41a9b3cceef0a30ed925f6d01fb8fa66", size = 12199267, upload-time = "2025-09-29T23:18:41.627Z" }, + { url = "https://files.pythonhosted.org/packages/bf/c9/63f8d545568d9ab91476b1818b4741f521646cbdd151c6efebf40d6de6f7/pandas-2.3.3-cp311-cp311-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:b98560e98cb334799c0b07ca7967ac361a47326e9b4e5a7dfb5ab2b1c9d35a1b", size = 12789281, upload-time = "2025-09-29T23:18:56.834Z" }, + { url = "https://files.pythonhosted.org/packages/f2/00/a5ac8c7a0e67fd1a6059e40aa08fa1c52cc00709077d2300e210c3ce0322/pandas-2.3.3-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:1d37b5848ba49824e5c30bedb9c830ab9b7751fd049bc7914533e01c65f79791", size = 13240453, upload-time = "2025-09-29T23:19:09.247Z" }, + { url = "https://files.pythonhosted.org/packages/27/4d/5c23a5bc7bd209231618dd9e606ce076272c9bc4f12023a70e03a86b4067/pandas-2.3.3-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:db4301b2d1f926ae677a751eb2bd0e8c5f5319c9cb3f88b0becbbb0b07b34151", size = 13890361, upload-time = "2025-09-29T23:19:25.342Z" }, + { url = "https://files.pythonhosted.org/packages/8e/59/712db1d7040520de7a4965df15b774348980e6df45c129b8c64d0dbe74ef/pandas-2.3.3-cp311-cp311-win_amd64.whl", hash = "sha256:f086f6fe114e19d92014a1966f43a3e62285109afe874f067f5abbdcbb10e59c", size = 11348702, upload-time = "2025-09-29T23:19:38.296Z" }, + { url = "https://files.pythonhosted.org/packages/9c/fb/231d89e8637c808b997d172b18e9d4a4bc7bf31296196c260526055d1ea0/pandas-2.3.3-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:6d21f6d74eb1725c2efaa71a2bfc661a0689579b58e9c0ca58a739ff0b002b53", size = 11597846, upload-time = "2025-09-29T23:19:48.856Z" }, + { url = "https://files.pythonhosted.org/packages/5c/bd/bf8064d9cfa214294356c2d6702b716d3cf3bb24be59287a6a21e24cae6b/pandas-2.3.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:3fd2f887589c7aa868e02632612ba39acb0b8948faf5cc58f0850e165bd46f35", size = 10729618, upload-time = "2025-09-29T23:39:08.659Z" }, + { url = "https://files.pythonhosted.org/packages/57/56/cf2dbe1a3f5271370669475ead12ce77c61726ffd19a35546e31aa8edf4e/pandas-2.3.3-cp312-cp312-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ecaf1e12bdc03c86ad4a7ea848d66c685cb6851d807a26aa245ca3d2017a1908", size = 11737212, upload-time = "2025-09-29T23:19:59.765Z" }, + { url = "https://files.pythonhosted.org/packages/e5/63/cd7d615331b328e287d8233ba9fdf191a9c2d11b6af0c7a59cfcec23de68/pandas-2.3.3-cp312-cp312-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:b3d11d2fda7eb164ef27ffc14b4fcab16a80e1ce67e9f57e19ec0afaf715ba89", size = 12362693, upload-time = "2025-09-29T23:20:14.098Z" }, + { url = "https://files.pythonhosted.org/packages/a6/de/8b1895b107277d52f2b42d3a6806e69cfef0d5cf1d0ba343470b9d8e0a04/pandas-2.3.3-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:a68e15f780eddf2b07d242e17a04aa187a7ee12b40b930bfdd78070556550e98", size = 12771002, upload-time = "2025-09-29T23:20:26.76Z" }, + { url = "https://files.pythonhosted.org/packages/87/21/84072af3187a677c5893b170ba2c8fbe450a6ff911234916da889b698220/pandas-2.3.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:371a4ab48e950033bcf52b6527eccb564f52dc826c02afd9a1bc0ab731bba084", size = 13450971, upload-time = "2025-09-29T23:20:41.344Z" }, + { url = "https://files.pythonhosted.org/packages/86/41/585a168330ff063014880a80d744219dbf1dd7a1c706e75ab3425a987384/pandas-2.3.3-cp312-cp312-win_amd64.whl", hash = "sha256:a16dcec078a01eeef8ee61bf64074b4e524a2a3f4b3be9326420cabe59c4778b", size = 10992722, upload-time = "2025-09-29T23:20:54.139Z" }, + { url = "https://files.pythonhosted.org/packages/cd/4b/18b035ee18f97c1040d94debd8f2e737000ad70ccc8f5513f4eefad75f4b/pandas-2.3.3-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:56851a737e3470de7fa88e6131f41281ed440d29a9268dcbf0002da5ac366713", size = 11544671, upload-time = "2025-09-29T23:21:05.024Z" }, + { url = "https://files.pythonhosted.org/packages/31/94/72fac03573102779920099bcac1c3b05975c2cb5f01eac609faf34bed1ca/pandas-2.3.3-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:bdcd9d1167f4885211e401b3036c0c8d9e274eee67ea8d0758a256d60704cfe8", size = 10680807, upload-time = "2025-09-29T23:21:15.979Z" }, + { url = "https://files.pythonhosted.org/packages/16/87/9472cf4a487d848476865321de18cc8c920b8cab98453ab79dbbc98db63a/pandas-2.3.3-cp313-cp313-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:e32e7cc9af0f1cc15548288a51a3b681cc2a219faa838e995f7dc53dbab1062d", size = 11709872, upload-time = "2025-09-29T23:21:27.165Z" }, + { url = "https://files.pythonhosted.org/packages/15/07/284f757f63f8a8d69ed4472bfd85122bd086e637bf4ed09de572d575a693/pandas-2.3.3-cp313-cp313-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:318d77e0e42a628c04dc56bcef4b40de67918f7041c2b061af1da41dcff670ac", size = 12306371, upload-time = "2025-09-29T23:21:40.532Z" }, + { url = "https://files.pythonhosted.org/packages/33/81/a3afc88fca4aa925804a27d2676d22dcd2031c2ebe08aabd0ae55b9ff282/pandas-2.3.3-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:4e0a175408804d566144e170d0476b15d78458795bb18f1304fb94160cabf40c", size = 12765333, upload-time = "2025-09-29T23:21:55.77Z" }, + { url = "https://files.pythonhosted.org/packages/8d/0f/b4d4ae743a83742f1153464cf1a8ecfafc3ac59722a0b5c8602310cb7158/pandas-2.3.3-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:93c2d9ab0fc11822b5eece72ec9587e172f63cff87c00b062f6e37448ced4493", size = 13418120, upload-time = "2025-09-29T23:22:10.109Z" }, + { url = "https://files.pythonhosted.org/packages/4f/c7/e54682c96a895d0c808453269e0b5928a07a127a15704fedb643e9b0a4c8/pandas-2.3.3-cp313-cp313-win_amd64.whl", hash = "sha256:f8bfc0e12dc78f777f323f55c58649591b2cd0c43534e8355c51d3fede5f4dee", size = 10993991, upload-time = "2025-09-29T23:25:04.889Z" }, + { url = "https://files.pythonhosted.org/packages/f9/ca/3f8d4f49740799189e1395812f3bf23b5e8fc7c190827d55a610da72ce55/pandas-2.3.3-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:75ea25f9529fdec2d2e93a42c523962261e567d250b0013b16210e1d40d7c2e5", size = 12048227, upload-time = "2025-09-29T23:22:24.343Z" }, + { url = "https://files.pythonhosted.org/packages/0e/5a/f43efec3e8c0cc92c4663ccad372dbdff72b60bdb56b2749f04aa1d07d7e/pandas-2.3.3-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:74ecdf1d301e812db96a465a525952f4dde225fdb6d8e5a521d47e1f42041e21", size = 11411056, upload-time = "2025-09-29T23:22:37.762Z" }, + { url = "https://files.pythonhosted.org/packages/46/b1/85331edfc591208c9d1a63a06baa67b21d332e63b7a591a5ba42a10bb507/pandas-2.3.3-cp313-cp313t-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6435cb949cb34ec11cc9860246ccb2fdc9ecd742c12d3304989017d53f039a78", size = 11645189, upload-time = "2025-09-29T23:22:51.688Z" }, + { url = "https://files.pythonhosted.org/packages/44/23/78d645adc35d94d1ac4f2a3c4112ab6f5b8999f4898b8cdf01252f8df4a9/pandas-2.3.3-cp313-cp313t-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:900f47d8f20860de523a1ac881c4c36d65efcb2eb850e6948140fa781736e110", size = 12121912, upload-time = "2025-09-29T23:23:05.042Z" }, + { url = "https://files.pythonhosted.org/packages/53/da/d10013df5e6aaef6b425aa0c32e1fc1f3e431e4bcabd420517dceadce354/pandas-2.3.3-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:a45c765238e2ed7d7c608fc5bc4a6f88b642f2f01e70c0c23d2224dd21829d86", size = 12712160, upload-time = "2025-09-29T23:23:28.57Z" }, + { url = "https://files.pythonhosted.org/packages/bd/17/e756653095a083d8a37cbd816cb87148debcfcd920129b25f99dd8d04271/pandas-2.3.3-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:c4fc4c21971a1a9f4bdb4c73978c7f7256caa3e62b323f70d6cb80db583350bc", size = 13199233, upload-time = "2025-09-29T23:24:24.876Z" }, + { url = "https://files.pythonhosted.org/packages/04/fd/74903979833db8390b73b3a8a7d30d146d710bd32703724dd9083950386f/pandas-2.3.3-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:ee15f284898e7b246df8087fc82b87b01686f98ee67d85a17b7ab44143a3a9a0", size = 11540635, upload-time = "2025-09-29T23:25:52.486Z" }, + { url = "https://files.pythonhosted.org/packages/21/00/266d6b357ad5e6d3ad55093a7e8efc7dd245f5a842b584db9f30b0f0a287/pandas-2.3.3-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:1611aedd912e1ff81ff41c745822980c49ce4a7907537be8692c8dbc31924593", size = 10759079, upload-time = "2025-09-29T23:26:33.204Z" }, + { url = "https://files.pythonhosted.org/packages/ca/05/d01ef80a7a3a12b2f8bbf16daba1e17c98a2f039cbc8e2f77a2c5a63d382/pandas-2.3.3-cp314-cp314-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6d2cefc361461662ac48810cb14365a365ce864afe85ef1f447ff5a1e99ea81c", size = 11814049, upload-time = "2025-09-29T23:27:15.384Z" }, + { url = "https://files.pythonhosted.org/packages/15/b2/0e62f78c0c5ba7e3d2c5945a82456f4fac76c480940f805e0b97fcbc2f65/pandas-2.3.3-cp314-cp314-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:ee67acbbf05014ea6c763beb097e03cd629961c8a632075eeb34247120abcb4b", size = 12332638, upload-time = "2025-09-29T23:27:51.625Z" }, + { url = "https://files.pythonhosted.org/packages/c5/33/dd70400631b62b9b29c3c93d2feee1d0964dc2bae2e5ad7a6c73a7f25325/pandas-2.3.3-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:c46467899aaa4da076d5abc11084634e2d197e9460643dd455ac3db5856b24d6", size = 12886834, upload-time = "2025-09-29T23:28:21.289Z" }, + { url = "https://files.pythonhosted.org/packages/d3/18/b5d48f55821228d0d2692b34fd5034bb185e854bdb592e9c640f6290e012/pandas-2.3.3-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:6253c72c6a1d990a410bc7de641d34053364ef8bcd3126f7e7450125887dffe3", size = 13409925, upload-time = "2025-09-29T23:28:58.261Z" }, + { url = "https://files.pythonhosted.org/packages/a6/3d/124ac75fcd0ecc09b8fdccb0246ef65e35b012030defb0e0eba2cbbbe948/pandas-2.3.3-cp314-cp314-win_amd64.whl", hash = "sha256:1b07204a219b3b7350abaae088f451860223a52cfb8a6c53358e7948735158e5", size = 11109071, upload-time = "2025-09-29T23:32:27.484Z" }, + { url = "https://files.pythonhosted.org/packages/89/9c/0e21c895c38a157e0faa1fb64587a9226d6dd46452cac4532d80c3c4a244/pandas-2.3.3-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:2462b1a365b6109d275250baaae7b760fd25c726aaca0054649286bcfbb3e8ec", size = 12048504, upload-time = "2025-09-29T23:29:31.47Z" }, + { url = "https://files.pythonhosted.org/packages/d7/82/b69a1c95df796858777b68fbe6a81d37443a33319761d7c652ce77797475/pandas-2.3.3-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:0242fe9a49aa8b4d78a4fa03acb397a58833ef6199e9aa40a95f027bb3a1b6e7", size = 11410702, upload-time = "2025-09-29T23:29:54.591Z" }, + { url = "https://files.pythonhosted.org/packages/f9/88/702bde3ba0a94b8c73a0181e05144b10f13f29ebfc2150c3a79062a8195d/pandas-2.3.3-cp314-cp314t-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:a21d830e78df0a515db2b3d2f5570610f5e6bd2e27749770e8bb7b524b89b450", size = 11634535, upload-time = "2025-09-29T23:30:21.003Z" }, + { url = "https://files.pythonhosted.org/packages/a4/1e/1bac1a839d12e6a82ec6cb40cda2edde64a2013a66963293696bbf31fbbb/pandas-2.3.3-cp314-cp314t-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:2e3ebdb170b5ef78f19bfb71b0dc5dc58775032361fa188e814959b74d726dd5", size = 12121582, upload-time = "2025-09-29T23:30:43.391Z" }, + { url = "https://files.pythonhosted.org/packages/44/91/483de934193e12a3b1d6ae7c8645d083ff88dec75f46e827562f1e4b4da6/pandas-2.3.3-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:d051c0e065b94b7a3cea50eb1ec32e912cd96dba41647eb24104b6c6c14c5788", size = 12699963, upload-time = "2025-09-29T23:31:10.009Z" }, + { url = "https://files.pythonhosted.org/packages/70/44/5191d2e4026f86a2a109053e194d3ba7a31a2d10a9c2348368c63ed4e85a/pandas-2.3.3-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:3869faf4bd07b3b66a9f462417d0ca3a9df29a9f6abd5d0d0dbab15dac7abe87", size = 13202175, upload-time = "2025-09-29T23:31:59.173Z" }, +] + +[[package]] +name = "pandas" +version = "3.0.1" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version >= '3.14' and sys_platform == 'win32'", + "python_full_version >= '3.14' and sys_platform == 'emscripten'", + "python_full_version >= '3.14' and sys_platform != 'emscripten' and sys_platform != 'win32'", + "python_full_version == '3.13.*' and sys_platform == 'win32'", + "python_full_version == '3.13.*' and sys_platform == 'emscripten'", + "python_full_version == '3.13.*' and sys_platform != 'emscripten' and sys_platform != 'win32'", + "python_full_version == '3.12.*' and sys_platform == 'win32'", + "python_full_version == '3.12.*' and sys_platform == 'emscripten'", + "python_full_version == '3.12.*' and sys_platform != 'emscripten' and sys_platform != 'win32'", + "python_full_version == '3.11.*' and sys_platform == 'win32'", + "python_full_version == '3.11.*' and sys_platform == 'emscripten'", + "python_full_version == '3.11.*' and sys_platform != 'emscripten' and sys_platform != 'win32'", +] +dependencies = [ + { name = "numpy", version = "2.4.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, + { name = "python-dateutil", marker = "python_full_version >= '3.11'" }, + { name = "tzdata", marker = "(python_full_version >= '3.11' and sys_platform == 'emscripten') or (python_full_version >= '3.11' and sys_platform == 'win32')" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/2e/0c/b28ed414f080ee0ad153f848586d61d1878f91689950f037f976ce15f6c8/pandas-3.0.1.tar.gz", hash = "sha256:4186a699674af418f655dbd420ed87f50d56b4cd6603784279d9eef6627823c8", size = 4641901, upload-time = "2026-02-17T22:20:16.434Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ff/07/c7087e003ceee9b9a82539b40414ec557aa795b584a1a346e89180853d79/pandas-3.0.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:de09668c1bf3b925c07e5762291602f0d789eca1b3a781f99c1c78f6cac0e7ea", size = 10323380, upload-time = "2026-02-17T22:18:16.133Z" }, + { url = "https://files.pythonhosted.org/packages/c1/27/90683c7122febeefe84a56f2cde86a9f05f68d53885cebcc473298dfc33e/pandas-3.0.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:24ba315ba3d6e5806063ac6eb717504e499ce30bd8c236d8693a5fd3f084c796", size = 9923455, upload-time = "2026-02-17T22:18:19.13Z" }, + { url = "https://files.pythonhosted.org/packages/0e/f1/ed17d927f9950643bc7631aa4c99ff0cc83a37864470bc419345b656a41f/pandas-3.0.1-cp311-cp311-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:406ce835c55bac912f2a0dcfaf27c06d73c6b04a5dde45f1fd3169ce31337389", size = 10753464, upload-time = "2026-02-17T22:18:21.134Z" }, + { url = "https://files.pythonhosted.org/packages/2e/7c/870c7e7daec2a6c7ff2ac9e33b23317230d4e4e954b35112759ea4a924a7/pandas-3.0.1-cp311-cp311-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:830994d7e1f31dd7e790045235605ab61cff6c94defc774547e8b7fdfbff3dc7", size = 11255234, upload-time = "2026-02-17T22:18:24.175Z" }, + { url = "https://files.pythonhosted.org/packages/5c/39/3653fe59af68606282b989c23d1a543ceba6e8099cbcc5f1d506a7bae2aa/pandas-3.0.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:a64ce8b0f2de1d2efd2ae40b0abe7f8ae6b29fbfb3812098ed5a6f8e235ad9bf", size = 11767299, upload-time = "2026-02-17T22:18:26.824Z" }, + { url = "https://files.pythonhosted.org/packages/9b/31/1daf3c0c94a849c7a8dab8a69697b36d313b229918002ba3e409265c7888/pandas-3.0.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:9832c2c69da24b602c32e0c7b1b508a03949c18ba08d4d9f1c1033426685b447", size = 12333292, upload-time = "2026-02-17T22:18:28.996Z" }, + { url = "https://files.pythonhosted.org/packages/1f/67/af63f83cd6ca603a00fe8530c10a60f0879265b8be00b5930e8e78c5b30b/pandas-3.0.1-cp311-cp311-win_amd64.whl", hash = "sha256:84f0904a69e7365f79a0c77d3cdfccbfb05bf87847e3a51a41e1426b0edb9c79", size = 9892176, upload-time = "2026-02-17T22:18:31.79Z" }, + { url = "https://files.pythonhosted.org/packages/79/ab/9c776b14ac4b7b4140788eca18468ea39894bc7340a408f1d1e379856a6b/pandas-3.0.1-cp311-cp311-win_arm64.whl", hash = "sha256:4a68773d5a778afb31d12e34f7dd4612ab90de8c6fb1d8ffe5d4a03b955082a1", size = 9151328, upload-time = "2026-02-17T22:18:35.721Z" }, + { url = "https://files.pythonhosted.org/packages/37/51/b467209c08dae2c624873d7491ea47d2b47336e5403309d433ea79c38571/pandas-3.0.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:476f84f8c20c9f5bc47252b66b4bb25e1a9fc2fa98cead96744d8116cb85771d", size = 10344357, upload-time = "2026-02-17T22:18:38.262Z" }, + { url = "https://files.pythonhosted.org/packages/7c/f1/e2567ffc8951ab371db2e40b2fe068e36b81d8cf3260f06ae508700e5504/pandas-3.0.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:0ab749dfba921edf641d4036c4c21c0b3ea70fea478165cb98a998fb2a261955", size = 9884543, upload-time = "2026-02-17T22:18:41.476Z" }, + { url = "https://files.pythonhosted.org/packages/d7/39/327802e0b6d693182403c144edacbc27eb82907b57062f23ef5a4c4a5ea7/pandas-3.0.1-cp312-cp312-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b8e36891080b87823aff3640c78649b91b8ff6eea3c0d70aeabd72ea43ab069b", size = 10396030, upload-time = "2026-02-17T22:18:43.822Z" }, + { url = "https://files.pythonhosted.org/packages/3d/fe/89d77e424365280b79d99b3e1e7d606f5165af2f2ecfaf0c6d24c799d607/pandas-3.0.1-cp312-cp312-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:532527a701281b9dd371e2f582ed9094f4c12dd9ffb82c0c54ee28d8ac9520c4", size = 10876435, upload-time = "2026-02-17T22:18:45.954Z" }, + { url = "https://files.pythonhosted.org/packages/b5/a6/2a75320849dd154a793f69c951db759aedb8d1dd3939eeacda9bdcfa1629/pandas-3.0.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:356e5c055ed9b0da1580d465657bc7d00635af4fd47f30afb23025352ba764d1", size = 11405133, upload-time = "2026-02-17T22:18:48.533Z" }, + { url = "https://files.pythonhosted.org/packages/58/53/1d68fafb2e02d7881df66aa53be4cd748d25cbe311f3b3c85c93ea5d30ca/pandas-3.0.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:9d810036895f9ad6345b8f2a338dd6998a74e8483847403582cab67745bff821", size = 11932065, upload-time = "2026-02-17T22:18:50.837Z" }, + { url = "https://files.pythonhosted.org/packages/75/08/67cc404b3a966b6df27b38370ddd96b3b023030b572283d035181854aac5/pandas-3.0.1-cp312-cp312-win_amd64.whl", hash = "sha256:536232a5fe26dd989bd633e7a0c450705fdc86a207fec7254a55e9a22950fe43", size = 9741627, upload-time = "2026-02-17T22:18:53.905Z" }, + { url = "https://files.pythonhosted.org/packages/86/4f/caf9952948fb00d23795f09b893d11f1cacb384e666854d87249530f7cbe/pandas-3.0.1-cp312-cp312-win_arm64.whl", hash = "sha256:0f463ebfd8de7f326d38037c7363c6dacb857c5881ab8961fb387804d6daf2f7", size = 9052483, upload-time = "2026-02-17T22:18:57.31Z" }, + { url = "https://files.pythonhosted.org/packages/0b/48/aad6ec4f8d007534c091e9a7172b3ec1b1ee6d99a9cbb936b5eab6c6cf58/pandas-3.0.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:5272627187b5d9c20e55d27caf5f2cd23e286aba25cadf73c8590e432e2b7262", size = 10317509, upload-time = "2026-02-17T22:18:59.498Z" }, + { url = "https://files.pythonhosted.org/packages/a8/14/5990826f779f79148ae9d3a2c39593dc04d61d5d90541e71b5749f35af95/pandas-3.0.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:661e0f665932af88c7877f31da0dc743fe9c8f2524bdffe23d24fdcb67ef9d56", size = 9860561, upload-time = "2026-02-17T22:19:02.265Z" }, + { url = "https://files.pythonhosted.org/packages/fa/80/f01ff54664b6d70fed71475543d108a9b7c888e923ad210795bef04ffb7d/pandas-3.0.1-cp313-cp313-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:75e6e292ff898679e47a2199172593d9f6107fd2dd3617c22c2946e97d5df46e", size = 10365506, upload-time = "2026-02-17T22:19:05.017Z" }, + { url = "https://files.pythonhosted.org/packages/f2/85/ab6d04733a7d6ff32bfc8382bf1b07078228f5d6ebec5266b91bfc5c4ff7/pandas-3.0.1-cp313-cp313-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:1ff8cf1d2896e34343197685f432450ec99a85ba8d90cce2030c5eee2ef98791", size = 10873196, upload-time = "2026-02-17T22:19:07.204Z" }, + { url = "https://files.pythonhosted.org/packages/48/a9/9301c83d0b47c23ac5deab91c6b39fd98d5b5db4d93b25df8d381451828f/pandas-3.0.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:eca8b4510f6763f3d37359c2105df03a7a221a508f30e396a51d0713d462e68a", size = 11370859, upload-time = "2026-02-17T22:19:09.436Z" }, + { url = "https://files.pythonhosted.org/packages/59/fe/0c1fc5bd2d29c7db2ab372330063ad555fb83e08422829c785f5ec2176ca/pandas-3.0.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:06aff2ad6f0b94a17822cf8b83bbb563b090ed82ff4fe7712db2ce57cd50d9b8", size = 11924584, upload-time = "2026-02-17T22:19:11.562Z" }, + { url = "https://files.pythonhosted.org/packages/d6/7d/216a1588b65a7aa5f4535570418a599d943c85afb1d95b0876fc00aa1468/pandas-3.0.1-cp313-cp313-win_amd64.whl", hash = "sha256:9fea306c783e28884c29057a1d9baa11a349bbf99538ec1da44c8476563d1b25", size = 9742769, upload-time = "2026-02-17T22:19:13.926Z" }, + { url = "https://files.pythonhosted.org/packages/c4/cb/810a22a6af9a4e97c8ab1c946b47f3489c5bca5adc483ce0ffc84c9cc768/pandas-3.0.1-cp313-cp313-win_arm64.whl", hash = "sha256:a8d37a43c52917427e897cb2e429f67a449327394396a81034a4449b99afda59", size = 9043855, upload-time = "2026-02-17T22:19:16.09Z" }, + { url = "https://files.pythonhosted.org/packages/92/fa/423c89086cca1f039cf1253c3ff5b90f157b5b3757314aa635f6bf3e30aa/pandas-3.0.1-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:d54855f04f8246ed7b6fc96b05d4871591143c46c0b6f4af874764ed0d2d6f06", size = 10752673, upload-time = "2026-02-17T22:19:18.304Z" }, + { url = "https://files.pythonhosted.org/packages/22/23/b5a08ec1f40020397f0faba72f1e2c11f7596a6169c7b3e800abff0e433f/pandas-3.0.1-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:4e1b677accee34a09e0dc2ce5624e4a58a1870ffe56fc021e9caf7f23cd7668f", size = 10404967, upload-time = "2026-02-17T22:19:20.726Z" }, + { url = "https://files.pythonhosted.org/packages/5c/81/94841f1bb4afdc2b52a99daa895ac2c61600bb72e26525ecc9543d453ebc/pandas-3.0.1-cp313-cp313t-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:a9cabbdcd03f1b6cd254d6dda8ae09b0252524be1592594c00b7895916cb1324", size = 10320575, upload-time = "2026-02-17T22:19:24.919Z" }, + { url = "https://files.pythonhosted.org/packages/0a/8b/2ae37d66a5342a83adadfd0cb0b4bf9c3c7925424dd5f40d15d6cfaa35ee/pandas-3.0.1-cp313-cp313t-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:5ae2ab1f166668b41e770650101e7090824fd34d17915dd9cd479f5c5e0065e9", size = 10710921, upload-time = "2026-02-17T22:19:27.181Z" }, + { url = "https://files.pythonhosted.org/packages/a2/61/772b2e2757855e232b7ccf7cb8079a5711becb3a97f291c953def15a833f/pandas-3.0.1-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:6bf0603c2e30e2cafac32807b06435f28741135cb8697eae8b28c7d492fc7d76", size = 11334191, upload-time = "2026-02-17T22:19:29.411Z" }, + { url = "https://files.pythonhosted.org/packages/1b/08/b16c6df3ef555d8495d1d265a7963b65be166785d28f06a350913a4fac78/pandas-3.0.1-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:6c426422973973cae1f4a23e51d4ae85974f44871b24844e4f7de752dd877098", size = 11782256, upload-time = "2026-02-17T22:19:32.34Z" }, + { url = "https://files.pythonhosted.org/packages/55/80/178af0594890dee17e239fca96d3d8670ba0f5ff59b7d0439850924a9c09/pandas-3.0.1-cp313-cp313t-win_amd64.whl", hash = "sha256:b03f91ae8c10a85c1613102c7bef5229b5379f343030a3ccefeca8a33414cf35", size = 10485047, upload-time = "2026-02-17T22:19:34.605Z" }, + { url = "https://files.pythonhosted.org/packages/bb/8b/4bb774a998b97e6c2fd62a9e6cfdaae133b636fd1c468f92afb4ae9a447a/pandas-3.0.1-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:99d0f92ed92d3083d140bf6b97774f9f13863924cf3f52a70711f4e7588f9d0a", size = 10322465, upload-time = "2026-02-17T22:19:36.803Z" }, + { url = "https://files.pythonhosted.org/packages/72/3a/5b39b51c64159f470f1ca3b1c2a87da290657ca022f7cd11442606f607d1/pandas-3.0.1-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:3b66857e983208654294bb6477b8a63dee26b37bdd0eb34d010556e91261784f", size = 9910632, upload-time = "2026-02-17T22:19:39.001Z" }, + { url = "https://files.pythonhosted.org/packages/4e/f7/b449ffb3f68c11da12fc06fbf6d2fa3a41c41e17d0284d23a79e1c13a7e4/pandas-3.0.1-cp314-cp314-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:56cf59638bf24dc9bdf2154c81e248b3289f9a09a6d04e63608c159022352749", size = 10440535, upload-time = "2026-02-17T22:19:41.157Z" }, + { url = "https://files.pythonhosted.org/packages/55/77/6ea82043db22cb0f2bbfe7198da3544000ddaadb12d26be36e19b03a2dc5/pandas-3.0.1-cp314-cp314-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:c1a9f55e0f46951874b863d1f3906dcb57df2d9be5c5847ba4dfb55b2c815249", size = 10893940, upload-time = "2026-02-17T22:19:43.493Z" }, + { url = "https://files.pythonhosted.org/packages/03/30/f1b502a72468c89412c1b882a08f6eed8a4ee9dc033f35f65d0663df6081/pandas-3.0.1-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:1849f0bba9c8a2fb0f691d492b834cc8dadf617e29015c66e989448d58d011ee", size = 11442711, upload-time = "2026-02-17T22:19:46.074Z" }, + { url = "https://files.pythonhosted.org/packages/0d/f0/ebb6ddd8fc049e98cabac5c2924d14d1dda26a20adb70d41ea2e428d3ec4/pandas-3.0.1-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:c3d288439e11b5325b02ae6e9cc83e6805a62c40c5a6220bea9beb899c073b1c", size = 11963918, upload-time = "2026-02-17T22:19:48.838Z" }, + { url = "https://files.pythonhosted.org/packages/09/f8/8ce132104074f977f907442790eaae24e27bce3b3b454e82faa3237ff098/pandas-3.0.1-cp314-cp314-win_amd64.whl", hash = "sha256:93325b0fe372d192965f4cca88d97667f49557398bbf94abdda3bf1b591dbe66", size = 9862099, upload-time = "2026-02-17T22:19:51.081Z" }, + { url = "https://files.pythonhosted.org/packages/e6/b7/6af9aac41ef2456b768ef0ae60acf8abcebb450a52043d030a65b4b7c9bd/pandas-3.0.1-cp314-cp314-win_arm64.whl", hash = "sha256:97ca08674e3287c7148f4858b01136f8bdfe7202ad25ad04fec602dd1d29d132", size = 9185333, upload-time = "2026-02-17T22:19:53.266Z" }, + { url = "https://files.pythonhosted.org/packages/66/fc/848bb6710bc6061cb0c5badd65b92ff75c81302e0e31e496d00029fe4953/pandas-3.0.1-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:58eeb1b2e0fb322befcf2bbc9ba0af41e616abadb3d3414a6bc7167f6cbfce32", size = 10772664, upload-time = "2026-02-17T22:19:55.806Z" }, + { url = "https://files.pythonhosted.org/packages/69/5c/866a9bbd0f79263b4b0db6ec1a341be13a1473323f05c122388e0f15b21d/pandas-3.0.1-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:cd9af1276b5ca9e298bd79a26bda32fa9cc87ed095b2a9a60978d2ca058eaf87", size = 10421286, upload-time = "2026-02-17T22:19:58.091Z" }, + { url = "https://files.pythonhosted.org/packages/51/a4/2058fb84fb1cfbfb2d4a6d485e1940bb4ad5716e539d779852494479c580/pandas-3.0.1-cp314-cp314t-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:94f87a04984d6b63788327cd9f79dda62b7f9043909d2440ceccf709249ca988", size = 10342050, upload-time = "2026-02-17T22:20:01.376Z" }, + { url = "https://files.pythonhosted.org/packages/22/1b/674e89996cc4be74db3c4eb09240c4bb549865c9c3f5d9b086ff8fcfbf00/pandas-3.0.1-cp314-cp314t-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:85fe4c4df62e1e20f9db6ebfb88c844b092c22cd5324bdcf94bfa2fc1b391221", size = 10740055, upload-time = "2026-02-17T22:20:04.328Z" }, + { url = "https://files.pythonhosted.org/packages/d0/f8/e954b750764298c22fa4614376531fe63c521ef517e7059a51f062b87dca/pandas-3.0.1-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:331ca75a2f8672c365ae25c0b29e46f5ac0c6551fdace8eec4cd65e4fac271ff", size = 11357632, upload-time = "2026-02-17T22:20:06.647Z" }, + { url = "https://files.pythonhosted.org/packages/6d/02/c6e04b694ffd68568297abd03588b6d30295265176a5c01b7459d3bc35a3/pandas-3.0.1-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:15860b1fdb1973fffade772fdb931ccf9b2f400a3f5665aef94a00445d7d8dd5", size = 11810974, upload-time = "2026-02-17T22:20:08.946Z" }, + { url = "https://files.pythonhosted.org/packages/89/41/d7dfb63d2407f12055215070c42fc6ac41b66e90a2946cdc5e759058398b/pandas-3.0.1-cp314-cp314t-win_amd64.whl", hash = "sha256:44f1364411d5670efa692b146c748f4ed013df91ee91e9bec5677fb1fd58b937", size = 10884622, upload-time = "2026-02-17T22:20:11.711Z" }, + { url = "https://files.pythonhosted.org/packages/68/b0/34937815889fa982613775e4b97fddd13250f11012d769949c5465af2150/pandas-3.0.1-cp314-cp314t-win_arm64.whl", hash = "sha256:108dd1790337a494aa80e38def654ca3f0968cf4f362c85f44c15e471667102d", size = 9452085, upload-time = "2026-02-17T22:20:14.331Z" }, +] + +[[package]] +name = "pillow" +version = "12.1.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/1f/42/5c74462b4fd957fcd7b13b04fb3205ff8349236ea74c7c375766d6c82288/pillow-12.1.1.tar.gz", hash = "sha256:9ad8fa5937ab05218e2b6a4cff30295ad35afd2f83ac592e68c0d871bb0fdbc4", size = 46980264, upload-time = "2026-02-11T04:23:07.146Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/1d/30/5bd3d794762481f8c8ae9c80e7b76ecea73b916959eb587521358ef0b2f9/pillow-12.1.1-cp310-cp310-macosx_10_10_x86_64.whl", hash = "sha256:1f1625b72740fdda5d77b4def688eb8fd6490975d06b909fd19f13f391e077e0", size = 5304099, upload-time = "2026-02-11T04:20:06.13Z" }, + { url = "https://files.pythonhosted.org/packages/bd/c1/aab9e8f3eeb4490180e357955e15c2ef74b31f64790ff356c06fb6cf6d84/pillow-12.1.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:178aa072084bd88ec759052feca8e56cbb14a60b39322b99a049e58090479713", size = 4657880, upload-time = "2026-02-11T04:20:09.291Z" }, + { url = "https://files.pythonhosted.org/packages/f1/0a/9879e30d56815ad529d3985aeff5af4964202425c27261a6ada10f7cbf53/pillow-12.1.1-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:b66e95d05ba806247aaa1561f080abc7975daf715c30780ff92a20e4ec546e1b", size = 6222587, upload-time = "2026-02-11T04:20:10.82Z" }, + { url = "https://files.pythonhosted.org/packages/5a/5f/a1b72ff7139e4f89014e8d451442c74a774d5c43cd938fb0a9f878576b37/pillow-12.1.1-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:89c7e895002bbe49cdc5426150377cbbc04767d7547ed145473f496dfa40408b", size = 8027678, upload-time = "2026-02-11T04:20:12.455Z" }, + { url = "https://files.pythonhosted.org/packages/e2/c2/c7cb187dac79a3d22c3ebeae727abee01e077c8c7d930791dc592f335153/pillow-12.1.1-cp310-cp310-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:3a5cbdcddad0af3da87cb16b60d23648bc3b51967eb07223e9fed77a82b457c4", size = 6335777, upload-time = "2026-02-11T04:20:14.441Z" }, + { url = "https://files.pythonhosted.org/packages/0c/7b/f9b09a7804ec7336effb96c26d37c29d27225783dc1501b7d62dcef6ae25/pillow-12.1.1-cp310-cp310-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:9f51079765661884a486727f0729d29054242f74b46186026582b4e4769918e4", size = 7027140, upload-time = "2026-02-11T04:20:16.387Z" }, + { url = "https://files.pythonhosted.org/packages/98/b2/2fa3c391550bd421b10849d1a2144c44abcd966daadd2f7c12e19ea988c4/pillow-12.1.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:99c1506ea77c11531d75e3a412832a13a71c7ebc8192ab9e4b2e355555920e3e", size = 6449855, upload-time = "2026-02-11T04:20:18.554Z" }, + { url = "https://files.pythonhosted.org/packages/96/ff/9caf4b5b950c669263c39e96c78c0d74a342c71c4f43fd031bb5cb7ceac9/pillow-12.1.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:36341d06738a9f66c8287cf8b876d24b18db9bd8740fa0672c74e259ad408cff", size = 7151329, upload-time = "2026-02-11T04:20:20.646Z" }, + { url = "https://files.pythonhosted.org/packages/7b/f8/4b24841f582704da675ca535935bccb32b00a6da1226820845fac4a71136/pillow-12.1.1-cp310-cp310-win32.whl", hash = "sha256:6c52f062424c523d6c4db85518774cc3d50f5539dd6eed32b8f6229b26f24d40", size = 6325574, upload-time = "2026-02-11T04:20:22.43Z" }, + { url = "https://files.pythonhosted.org/packages/f8/f9/9f6b01c0881d7036063aa6612ef04c0e2cad96be21325a1e92d0203f8e91/pillow-12.1.1-cp310-cp310-win_amd64.whl", hash = "sha256:c6008de247150668a705a6338156efb92334113421ceecf7438a12c9a12dab23", size = 7032347, upload-time = "2026-02-11T04:20:23.932Z" }, + { url = "https://files.pythonhosted.org/packages/79/13/c7922edded3dcdaf10c59297540b72785620abc0538872c819915746757d/pillow-12.1.1-cp310-cp310-win_arm64.whl", hash = "sha256:1a9b0ee305220b392e1124a764ee4265bd063e54a751a6b62eff69992f457fa9", size = 2453457, upload-time = "2026-02-11T04:20:25.392Z" }, + { url = "https://files.pythonhosted.org/packages/2b/46/5da1ec4a5171ee7bf1a0efa064aba70ba3d6e0788ce3f5acd1375d23c8c0/pillow-12.1.1-cp311-cp311-macosx_10_10_x86_64.whl", hash = "sha256:e879bb6cd5c73848ef3b2b48b8af9ff08c5b71ecda8048b7dd22d8a33f60be32", size = 5304084, upload-time = "2026-02-11T04:20:27.501Z" }, + { url = "https://files.pythonhosted.org/packages/78/93/a29e9bc02d1cf557a834da780ceccd54e02421627200696fcf805ebdc3fb/pillow-12.1.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:365b10bb9417dd4498c0e3b128018c4a624dc11c7b97d8cc54effe3b096f4c38", size = 4657866, upload-time = "2026-02-11T04:20:29.827Z" }, + { url = "https://files.pythonhosted.org/packages/13/84/583a4558d492a179d31e4aae32eadce94b9acf49c0337c4ce0b70e0a01f2/pillow-12.1.1-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:d4ce8e329c93845720cd2014659ca67eac35f6433fd3050393d85f3ecef0dad5", size = 6232148, upload-time = "2026-02-11T04:20:31.329Z" }, + { url = "https://files.pythonhosted.org/packages/d5/e2/53c43334bbbb2d3b938978532fbda8e62bb6e0b23a26ce8592f36bcc4987/pillow-12.1.1-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:fc354a04072b765eccf2204f588a7a532c9511e8b9c7f900e1b64e3e33487090", size = 8038007, upload-time = "2026-02-11T04:20:34.225Z" }, + { url = "https://files.pythonhosted.org/packages/b8/a6/3d0e79c8a9d58150dd98e199d7c1c56861027f3829a3a60b3c2784190180/pillow-12.1.1-cp311-cp311-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:7e7976bf1910a8116b523b9f9f58bf410f3e8aa330cd9a2bb2953f9266ab49af", size = 6345418, upload-time = "2026-02-11T04:20:35.858Z" }, + { url = "https://files.pythonhosted.org/packages/a2/c8/46dfeac5825e600579157eea177be43e2f7ff4a99da9d0d0a49533509ac5/pillow-12.1.1-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:597bd9c8419bc7c6af5604e55847789b69123bbe25d65cc6ad3012b4f3c98d8b", size = 7034590, upload-time = "2026-02-11T04:20:37.91Z" }, + { url = "https://files.pythonhosted.org/packages/af/bf/e6f65d3db8a8bbfeaf9e13cc0417813f6319863a73de934f14b2229ada18/pillow-12.1.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:2c1fc0f2ca5f96a3c8407e41cca26a16e46b21060fe6d5b099d2cb01412222f5", size = 6458655, upload-time = "2026-02-11T04:20:39.496Z" }, + { url = "https://files.pythonhosted.org/packages/f9/c2/66091f3f34a25894ca129362e510b956ef26f8fb67a0e6417bc5744e56f1/pillow-12.1.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:578510d88c6229d735855e1f278aa305270438d36a05031dfaae5067cc8eb04d", size = 7159286, upload-time = "2026-02-11T04:20:41.139Z" }, + { url = "https://files.pythonhosted.org/packages/7b/5a/24bc8eb526a22f957d0cec6243146744966d40857e3d8deb68f7902ca6c1/pillow-12.1.1-cp311-cp311-win32.whl", hash = "sha256:7311c0a0dcadb89b36b7025dfd8326ecfa36964e29913074d47382706e516a7c", size = 6328663, upload-time = "2026-02-11T04:20:43.184Z" }, + { url = "https://files.pythonhosted.org/packages/31/03/bef822e4f2d8f9d7448c133d0a18185d3cce3e70472774fffefe8b0ed562/pillow-12.1.1-cp311-cp311-win_amd64.whl", hash = "sha256:fbfa2a7c10cc2623f412753cddf391c7f971c52ca40a3f65dc5039b2939e8563", size = 7031448, upload-time = "2026-02-11T04:20:44.696Z" }, + { url = "https://files.pythonhosted.org/packages/49/70/f76296f53610bd17b2e7d31728b8b7825e3ac3b5b3688b51f52eab7c0818/pillow-12.1.1-cp311-cp311-win_arm64.whl", hash = "sha256:b81b5e3511211631b3f672a595e3221252c90af017e399056d0faabb9538aa80", size = 2453651, upload-time = "2026-02-11T04:20:46.243Z" }, + { url = "https://files.pythonhosted.org/packages/07/d3/8df65da0d4df36b094351dce696f2989bec731d4f10e743b1c5f4da4d3bf/pillow-12.1.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:ab323b787d6e18b3d91a72fc99b1a2c28651e4358749842b8f8dfacd28ef2052", size = 5262803, upload-time = "2026-02-11T04:20:47.653Z" }, + { url = "https://files.pythonhosted.org/packages/d6/71/5026395b290ff404b836e636f51d7297e6c83beceaa87c592718747e670f/pillow-12.1.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:adebb5bee0f0af4909c30db0d890c773d1a92ffe83da908e2e9e720f8edf3984", size = 4657601, upload-time = "2026-02-11T04:20:49.328Z" }, + { url = "https://files.pythonhosted.org/packages/b1/2e/1001613d941c67442f745aff0f7cc66dd8df9a9c084eb497e6a543ee6f7e/pillow-12.1.1-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:bb66b7cc26f50977108790e2456b7921e773f23db5630261102233eb355a3b79", size = 6234995, upload-time = "2026-02-11T04:20:51.032Z" }, + { url = "https://files.pythonhosted.org/packages/07/26/246ab11455b2549b9233dbd44d358d033a2f780fa9007b61a913c5b2d24e/pillow-12.1.1-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:aee2810642b2898bb187ced9b349e95d2a7272930796e022efaf12e99dccd293", size = 8045012, upload-time = "2026-02-11T04:20:52.882Z" }, + { url = "https://files.pythonhosted.org/packages/b2/8b/07587069c27be7535ac1fe33874e32de118fbd34e2a73b7f83436a88368c/pillow-12.1.1-cp312-cp312-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:a0b1cd6232e2b618adcc54d9882e4e662a089d5768cd188f7c245b4c8c44a397", size = 6349638, upload-time = "2026-02-11T04:20:54.444Z" }, + { url = "https://files.pythonhosted.org/packages/ff/79/6df7b2ee763d619cda2fb4fea498e5f79d984dae304d45a8999b80d6cf5c/pillow-12.1.1-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:7aac39bcf8d4770d089588a2e1dd111cbaa42df5a94be3114222057d68336bd0", size = 7041540, upload-time = "2026-02-11T04:20:55.97Z" }, + { url = "https://files.pythonhosted.org/packages/2c/5e/2ba19e7e7236d7529f4d873bdaf317a318896bac289abebd4bb00ef247f0/pillow-12.1.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:ab174cd7d29a62dd139c44bf74b698039328f45cb03b4596c43473a46656b2f3", size = 6462613, upload-time = "2026-02-11T04:20:57.542Z" }, + { url = "https://files.pythonhosted.org/packages/03/03/31216ec124bb5c3dacd74ce8efff4cc7f52643653bad4825f8f08c697743/pillow-12.1.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:339ffdcb7cbeaa08221cd401d517d4b1fe7a9ed5d400e4a8039719238620ca35", size = 7166745, upload-time = "2026-02-11T04:20:59.196Z" }, + { url = "https://files.pythonhosted.org/packages/1f/e7/7c4552d80052337eb28653b617eafdef39adfb137c49dd7e831b8dc13bc5/pillow-12.1.1-cp312-cp312-win32.whl", hash = "sha256:5d1f9575a12bed9e9eedd9a4972834b08c97a352bd17955ccdebfeca5913fa0a", size = 6328823, upload-time = "2026-02-11T04:21:01.385Z" }, + { url = "https://files.pythonhosted.org/packages/3d/17/688626d192d7261bbbf98846fc98995726bddc2c945344b65bec3a29d731/pillow-12.1.1-cp312-cp312-win_amd64.whl", hash = "sha256:21329ec8c96c6e979cd0dfd29406c40c1d52521a90544463057d2aaa937d66a6", size = 7033367, upload-time = "2026-02-11T04:21:03.536Z" }, + { url = "https://files.pythonhosted.org/packages/ed/fe/a0ef1f73f939b0eca03ee2c108d0043a87468664770612602c63266a43c4/pillow-12.1.1-cp312-cp312-win_arm64.whl", hash = "sha256:af9a332e572978f0218686636610555ae3defd1633597be015ed50289a03c523", size = 2453811, upload-time = "2026-02-11T04:21:05.116Z" }, + { url = "https://files.pythonhosted.org/packages/d5/11/6db24d4bd7685583caeae54b7009584e38da3c3d4488ed4cd25b439de486/pillow-12.1.1-cp313-cp313-ios_13_0_arm64_iphoneos.whl", hash = "sha256:d242e8ac078781f1de88bf823d70c1a9b3c7950a44cdf4b7c012e22ccbcd8e4e", size = 4062689, upload-time = "2026-02-11T04:21:06.804Z" }, + { url = "https://files.pythonhosted.org/packages/33/c0/ce6d3b1fe190f0021203e0d9b5b99e57843e345f15f9ef22fcd43842fd21/pillow-12.1.1-cp313-cp313-ios_13_0_arm64_iphonesimulator.whl", hash = "sha256:02f84dfad02693676692746df05b89cf25597560db2857363a208e393429f5e9", size = 4138535, upload-time = "2026-02-11T04:21:08.452Z" }, + { url = "https://files.pythonhosted.org/packages/a0/c6/d5eb6a4fb32a3f9c21a8c7613ec706534ea1cf9f4b3663e99f0d83f6fca8/pillow-12.1.1-cp313-cp313-ios_13_0_x86_64_iphonesimulator.whl", hash = "sha256:e65498daf4b583091ccbb2556c7000abf0f3349fcd57ef7adc9a84a394ed29f6", size = 3601364, upload-time = "2026-02-11T04:21:10.194Z" }, + { url = "https://files.pythonhosted.org/packages/14/a1/16c4b823838ba4c9c52c0e6bbda903a3fe5a1bdbf1b8eb4fff7156f3e318/pillow-12.1.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:6c6db3b84c87d48d0088943bf33440e0c42370b99b1c2a7989216f7b42eede60", size = 5262561, upload-time = "2026-02-11T04:21:11.742Z" }, + { url = "https://files.pythonhosted.org/packages/bb/ad/ad9dc98ff24f485008aa5cdedaf1a219876f6f6c42a4626c08bc4e80b120/pillow-12.1.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:8b7e5304e34942bf62e15184219a7b5ad4ff7f3bb5cca4d984f37df1a0e1aee2", size = 4657460, upload-time = "2026-02-11T04:21:13.786Z" }, + { url = "https://files.pythonhosted.org/packages/9e/1b/f1a4ea9a895b5732152789326202a82464d5254759fbacae4deea3069334/pillow-12.1.1-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:18e5bddd742a44b7e6b1e773ab5db102bd7a94c32555ba656e76d319d19c3850", size = 6232698, upload-time = "2026-02-11T04:21:15.949Z" }, + { url = "https://files.pythonhosted.org/packages/95/f4/86f51b8745070daf21fd2e5b1fe0eb35d4db9ca26e6d58366562fb56a743/pillow-12.1.1-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:fc44ef1f3de4f45b50ccf9136999d71abb99dca7706bc75d222ed350b9fd2289", size = 8041706, upload-time = "2026-02-11T04:21:17.723Z" }, + { url = "https://files.pythonhosted.org/packages/29/9b/d6ecd956bb1266dd1045e995cce9b8d77759e740953a1c9aad9502a0461e/pillow-12.1.1-cp313-cp313-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:5a8eb7ed8d4198bccbd07058416eeec51686b498e784eda166395a23eb99138e", size = 6346621, upload-time = "2026-02-11T04:21:19.547Z" }, + { url = "https://files.pythonhosted.org/packages/71/24/538bff45bde96535d7d998c6fed1a751c75ac7c53c37c90dc2601b243893/pillow-12.1.1-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:47b94983da0c642de92ced1702c5b6c292a84bd3a8e1d1702ff923f183594717", size = 7038069, upload-time = "2026-02-11T04:21:21.378Z" }, + { url = "https://files.pythonhosted.org/packages/94/0e/58cb1a6bc48f746bc4cb3adb8cabff73e2742c92b3bf7a220b7cf69b9177/pillow-12.1.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:518a48c2aab7ce596d3bf79d0e275661b846e86e4d0e7dec34712c30fe07f02a", size = 6460040, upload-time = "2026-02-11T04:21:23.148Z" }, + { url = "https://files.pythonhosted.org/packages/6c/57/9045cb3ff11eeb6c1adce3b2d60d7d299d7b273a2e6c8381a524abfdc474/pillow-12.1.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:a550ae29b95c6dc13cf69e2c9dc5747f814c54eeb2e32d683e5e93af56caa029", size = 7164523, upload-time = "2026-02-11T04:21:25.01Z" }, + { url = "https://files.pythonhosted.org/packages/73/f2/9be9cb99f2175f0d4dbadd6616ce1bf068ee54a28277ea1bf1fbf729c250/pillow-12.1.1-cp313-cp313-win32.whl", hash = "sha256:a003d7422449f6d1e3a34e3dd4110c22148336918ddbfc6a32581cd54b2e0b2b", size = 6332552, upload-time = "2026-02-11T04:21:27.238Z" }, + { url = "https://files.pythonhosted.org/packages/3f/eb/b0834ad8b583d7d9d42b80becff092082a1c3c156bb582590fcc973f1c7c/pillow-12.1.1-cp313-cp313-win_amd64.whl", hash = "sha256:344cf1e3dab3be4b1fa08e449323d98a2a3f819ad20f4b22e77a0ede31f0faa1", size = 7040108, upload-time = "2026-02-11T04:21:29.462Z" }, + { url = "https://files.pythonhosted.org/packages/d5/7d/fc09634e2aabdd0feabaff4a32f4a7d97789223e7c2042fd805ea4b4d2c2/pillow-12.1.1-cp313-cp313-win_arm64.whl", hash = "sha256:5c0dd1636633e7e6a0afe7bf6a51a14992b7f8e60de5789018ebbdfae55b040a", size = 2453712, upload-time = "2026-02-11T04:21:31.072Z" }, + { url = "https://files.pythonhosted.org/packages/19/2a/b9d62794fc8a0dd14c1943df68347badbd5511103e0d04c035ffe5cf2255/pillow-12.1.1-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:0330d233c1a0ead844fc097a7d16c0abff4c12e856c0b325f231820fee1f39da", size = 5264880, upload-time = "2026-02-11T04:21:32.865Z" }, + { url = "https://files.pythonhosted.org/packages/26/9d/e03d857d1347fa5ed9247e123fcd2a97b6220e15e9cb73ca0a8d91702c6e/pillow-12.1.1-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:5dae5f21afb91322f2ff791895ddd8889e5e947ff59f71b46041c8ce6db790bc", size = 4660616, upload-time = "2026-02-11T04:21:34.97Z" }, + { url = "https://files.pythonhosted.org/packages/f7/ec/8a6d22afd02570d30954e043f09c32772bfe143ba9285e2fdb11284952cd/pillow-12.1.1-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:2e0c664be47252947d870ac0d327fea7e63985a08794758aa8af5b6cb6ec0c9c", size = 6269008, upload-time = "2026-02-11T04:21:36.623Z" }, + { url = "https://files.pythonhosted.org/packages/3d/1d/6d875422c9f28a4a361f495a5f68d9de4a66941dc2c619103ca335fa6446/pillow-12.1.1-cp313-cp313t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:691ab2ac363b8217f7d31b3497108fb1f50faab2f75dfb03284ec2f217e87bf8", size = 8073226, upload-time = "2026-02-11T04:21:38.585Z" }, + { url = "https://files.pythonhosted.org/packages/a1/cd/134b0b6ee5eda6dc09e25e24b40fdafe11a520bc725c1d0bbaa5e00bf95b/pillow-12.1.1-cp313-cp313t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:e9e8064fb1cc019296958595f6db671fba95209e3ceb0c4734c9baf97de04b20", size = 6380136, upload-time = "2026-02-11T04:21:40.562Z" }, + { url = "https://files.pythonhosted.org/packages/7a/a9/7628f013f18f001c1b98d8fffe3452f306a70dc6aba7d931019e0492f45e/pillow-12.1.1-cp313-cp313t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:472a8d7ded663e6162dafdf20015c486a7009483ca671cece7a9279b512fcb13", size = 7067129, upload-time = "2026-02-11T04:21:42.521Z" }, + { url = "https://files.pythonhosted.org/packages/1e/f8/66ab30a2193b277785601e82ee2d49f68ea575d9637e5e234faaa98efa4c/pillow-12.1.1-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:89b54027a766529136a06cfebeecb3a04900397a3590fd252160b888479517bf", size = 6491807, upload-time = "2026-02-11T04:21:44.22Z" }, + { url = "https://files.pythonhosted.org/packages/da/0b/a877a6627dc8318fdb84e357c5e1a758c0941ab1ddffdafd231983788579/pillow-12.1.1-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:86172b0831b82ce4f7877f280055892b31179e1576aa00d0df3bb1bbf8c3e524", size = 7190954, upload-time = "2026-02-11T04:21:46.114Z" }, + { url = "https://files.pythonhosted.org/packages/83/43/6f732ff85743cf746b1361b91665d9f5155e1483817f693f8d57ea93147f/pillow-12.1.1-cp313-cp313t-win32.whl", hash = "sha256:44ce27545b6efcf0fdbdceb31c9a5bdea9333e664cda58a7e674bb74608b3986", size = 6336441, upload-time = "2026-02-11T04:21:48.22Z" }, + { url = "https://files.pythonhosted.org/packages/3b/44/e865ef3986611bb75bfabdf94a590016ea327833f434558801122979cd0e/pillow-12.1.1-cp313-cp313t-win_amd64.whl", hash = "sha256:a285e3eb7a5a45a2ff504e31f4a8d1b12ef62e84e5411c6804a42197c1cf586c", size = 7045383, upload-time = "2026-02-11T04:21:50.015Z" }, + { url = "https://files.pythonhosted.org/packages/a8/c6/f4fb24268d0c6908b9f04143697ea18b0379490cb74ba9e8d41b898bd005/pillow-12.1.1-cp313-cp313t-win_arm64.whl", hash = "sha256:cc7d296b5ea4d29e6570dabeaed58d31c3fea35a633a69679fb03d7664f43fb3", size = 2456104, upload-time = "2026-02-11T04:21:51.633Z" }, + { url = "https://files.pythonhosted.org/packages/03/d0/bebb3ffbf31c5a8e97241476c4cf8b9828954693ce6744b4a2326af3e16b/pillow-12.1.1-cp314-cp314-ios_13_0_arm64_iphoneos.whl", hash = "sha256:417423db963cb4be8bac3fc1204fe61610f6abeed1580a7a2cbb2fbda20f12af", size = 4062652, upload-time = "2026-02-11T04:21:53.19Z" }, + { url = "https://files.pythonhosted.org/packages/2d/c0/0e16fb0addda4851445c28f8350d8c512f09de27bbb0d6d0bbf8b6709605/pillow-12.1.1-cp314-cp314-ios_13_0_arm64_iphonesimulator.whl", hash = "sha256:b957b71c6b2387610f556a7eb0828afbe40b4a98036fc0d2acfa5a44a0c2036f", size = 4138823, upload-time = "2026-02-11T04:22:03.088Z" }, + { url = "https://files.pythonhosted.org/packages/6b/fb/6170ec655d6f6bb6630a013dd7cf7bc218423d7b5fa9071bf63dc32175ae/pillow-12.1.1-cp314-cp314-ios_13_0_x86_64_iphonesimulator.whl", hash = "sha256:097690ba1f2efdeb165a20469d59d8bb03c55fb6621eb2041a060ae8ea3e9642", size = 3601143, upload-time = "2026-02-11T04:22:04.909Z" }, + { url = "https://files.pythonhosted.org/packages/59/04/dc5c3f297510ba9a6837cbb318b87dd2b8f73eb41a43cc63767f65cb599c/pillow-12.1.1-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:2815a87ab27848db0321fb78c7f0b2c8649dee134b7f2b80c6a45c6831d75ccd", size = 5266254, upload-time = "2026-02-11T04:22:07.656Z" }, + { url = "https://files.pythonhosted.org/packages/05/30/5db1236b0d6313f03ebf97f5e17cda9ca060f524b2fcc875149a8360b21c/pillow-12.1.1-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:f7ed2c6543bad5a7d5530eb9e78c53132f93dfa44a28492db88b41cdab885202", size = 4657499, upload-time = "2026-02-11T04:22:09.613Z" }, + { url = "https://files.pythonhosted.org/packages/6f/18/008d2ca0eb612e81968e8be0bbae5051efba24d52debf930126d7eaacbba/pillow-12.1.1-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:652a2c9ccfb556235b2b501a3a7cf3742148cd22e04b5625c5fe057ea3e3191f", size = 6232137, upload-time = "2026-02-11T04:22:11.434Z" }, + { url = "https://files.pythonhosted.org/packages/70/f1/f14d5b8eeb4b2cd62b9f9f847eb6605f103df89ef619ac68f92f748614ea/pillow-12.1.1-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:d6e4571eedf43af33d0fc233a382a76e849badbccdf1ac438841308652a08e1f", size = 8042721, upload-time = "2026-02-11T04:22:13.321Z" }, + { url = "https://files.pythonhosted.org/packages/5a/d6/17824509146e4babbdabf04d8171491fa9d776f7061ff6e727522df9bd03/pillow-12.1.1-cp314-cp314-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b574c51cf7d5d62e9be37ba446224b59a2da26dc4c1bb2ecbe936a4fb1a7cb7f", size = 6347798, upload-time = "2026-02-11T04:22:15.449Z" }, + { url = "https://files.pythonhosted.org/packages/d1/ee/c85a38a9ab92037a75615aba572c85ea51e605265036e00c5b67dfafbfe2/pillow-12.1.1-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:a37691702ed687799de29a518d63d4682d9016932db66d4e90c345831b02fb4e", size = 7039315, upload-time = "2026-02-11T04:22:17.24Z" }, + { url = "https://files.pythonhosted.org/packages/ec/f3/bc8ccc6e08a148290d7523bde4d9a0d6c981db34631390dc6e6ec34cacf6/pillow-12.1.1-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:f95c00d5d6700b2b890479664a06e754974848afaae5e21beb4d83c106923fd0", size = 6462360, upload-time = "2026-02-11T04:22:19.111Z" }, + { url = "https://files.pythonhosted.org/packages/f6/ab/69a42656adb1d0665ab051eec58a41f169ad295cf81ad45406963105408f/pillow-12.1.1-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:559b38da23606e68681337ad74622c4dbba02254fc9cb4488a305dd5975c7eeb", size = 7165438, upload-time = "2026-02-11T04:22:21.041Z" }, + { url = "https://files.pythonhosted.org/packages/02/46/81f7aa8941873f0f01d4b55cc543b0a3d03ec2ee30d617a0448bf6bd6dec/pillow-12.1.1-cp314-cp314-win32.whl", hash = "sha256:03edcc34d688572014ff223c125a3f77fb08091e4607e7745002fc214070b35f", size = 6431503, upload-time = "2026-02-11T04:22:22.833Z" }, + { url = "https://files.pythonhosted.org/packages/40/72/4c245f7d1044b67affc7f134a09ea619d4895333d35322b775b928180044/pillow-12.1.1-cp314-cp314-win_amd64.whl", hash = "sha256:50480dcd74fa63b8e78235957d302d98d98d82ccbfac4c7e12108ba9ecbdba15", size = 7176748, upload-time = "2026-02-11T04:22:24.64Z" }, + { url = "https://files.pythonhosted.org/packages/e4/ad/8a87bdbe038c5c698736e3348af5c2194ffb872ea52f11894c95f9305435/pillow-12.1.1-cp314-cp314-win_arm64.whl", hash = "sha256:5cb1785d97b0c3d1d1a16bc1d710c4a0049daefc4935f3a8f31f827f4d3d2e7f", size = 2544314, upload-time = "2026-02-11T04:22:26.685Z" }, + { url = "https://files.pythonhosted.org/packages/6c/9d/efd18493f9de13b87ede7c47e69184b9e859e4427225ea962e32e56a49bc/pillow-12.1.1-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:1f90cff8aa76835cba5769f0b3121a22bd4eb9e6884cfe338216e557a9a548b8", size = 5268612, upload-time = "2026-02-11T04:22:29.884Z" }, + { url = "https://files.pythonhosted.org/packages/f8/f1/4f42eb2b388eb2ffc660dcb7f7b556c1015c53ebd5f7f754965ef997585b/pillow-12.1.1-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:1f1be78ce9466a7ee64bfda57bdba0f7cc499d9794d518b854816c41bf0aa4e9", size = 4660567, upload-time = "2026-02-11T04:22:31.799Z" }, + { url = "https://files.pythonhosted.org/packages/01/54/df6ef130fa43e4b82e32624a7b821a2be1c5653a5fdad8469687a7db4e00/pillow-12.1.1-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:42fc1f4677106188ad9a55562bbade416f8b55456f522430fadab3cef7cd4e60", size = 6269951, upload-time = "2026-02-11T04:22:33.921Z" }, + { url = "https://files.pythonhosted.org/packages/a9/48/618752d06cc44bb4aae8ce0cd4e6426871929ed7b46215638088270d9b34/pillow-12.1.1-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:98edb152429ab62a1818039744d8fbb3ccab98a7c29fc3d5fcef158f3f1f68b7", size = 8074769, upload-time = "2026-02-11T04:22:35.877Z" }, + { url = "https://files.pythonhosted.org/packages/c3/bd/f1d71eb39a72fa088d938655afba3e00b38018d052752f435838961127d8/pillow-12.1.1-cp314-cp314t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:d470ab1178551dd17fdba0fef463359c41aaa613cdcd7ff8373f54be629f9f8f", size = 6381358, upload-time = "2026-02-11T04:22:37.698Z" }, + { url = "https://files.pythonhosted.org/packages/64/ef/c784e20b96674ed36a5af839305f55616f8b4f8aa8eeccf8531a6e312243/pillow-12.1.1-cp314-cp314t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:6408a7b064595afcab0a49393a413732a35788f2a5092fdc6266952ed67de586", size = 7068558, upload-time = "2026-02-11T04:22:39.597Z" }, + { url = "https://files.pythonhosted.org/packages/73/cb/8059688b74422ae61278202c4e1ad992e8a2e7375227be0a21c6b87ca8d5/pillow-12.1.1-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:5d8c41325b382c07799a3682c1c258469ea2ff97103c53717b7893862d0c98ce", size = 6493028, upload-time = "2026-02-11T04:22:42.73Z" }, + { url = "https://files.pythonhosted.org/packages/c6/da/e3c008ed7d2dd1f905b15949325934510b9d1931e5df999bb15972756818/pillow-12.1.1-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:c7697918b5be27424e9ce568193efd13d925c4481dd364e43f5dff72d33e10f8", size = 7191940, upload-time = "2026-02-11T04:22:44.543Z" }, + { url = "https://files.pythonhosted.org/packages/01/4a/9202e8d11714c1fc5951f2e1ef362f2d7fbc595e1f6717971d5dd750e969/pillow-12.1.1-cp314-cp314t-win32.whl", hash = "sha256:d2912fd8114fc5545aa3a4b5576512f64c55a03f3ebcca4c10194d593d43ea36", size = 6438736, upload-time = "2026-02-11T04:22:46.347Z" }, + { url = "https://files.pythonhosted.org/packages/f3/ca/cbce2327eb9885476b3957b2e82eb12c866a8b16ad77392864ad601022ce/pillow-12.1.1-cp314-cp314t-win_amd64.whl", hash = "sha256:4ceb838d4bd9dab43e06c363cab2eebf63846d6a4aeaea283bbdfd8f1a8ed58b", size = 7182894, upload-time = "2026-02-11T04:22:48.114Z" }, + { url = "https://files.pythonhosted.org/packages/ec/d2/de599c95ba0a973b94410477f8bf0b6f0b5e67360eb89bcb1ad365258beb/pillow-12.1.1-cp314-cp314t-win_arm64.whl", hash = "sha256:7b03048319bfc6170e93bd60728a1af51d3dd7704935feb228c4d4faab35d334", size = 2546446, upload-time = "2026-02-11T04:22:50.342Z" }, + { url = "https://files.pythonhosted.org/packages/56/11/5d43209aa4cb58e0cc80127956ff1796a68b928e6324bbf06ef4db34367b/pillow-12.1.1-pp311-pypy311_pp73-macosx_10_15_x86_64.whl", hash = "sha256:600fd103672b925fe62ed08e0d874ea34d692474df6f4bf7ebe148b30f89f39f", size = 5228606, upload-time = "2026-02-11T04:22:52.106Z" }, + { url = "https://files.pythonhosted.org/packages/5f/d5/3b005b4e4fda6698b371fa6c21b097d4707585d7db99e98d9b0b87ac612a/pillow-12.1.1-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:665e1b916b043cef294bc54d47bf02d87e13f769bc4bc5fa225a24b3a6c5aca9", size = 4622321, upload-time = "2026-02-11T04:22:53.827Z" }, + { url = "https://files.pythonhosted.org/packages/df/36/ed3ea2d594356fd8037e5a01f6156c74bc8d92dbb0fa60746cc96cabb6e8/pillow-12.1.1-pp311-pypy311_pp73-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:495c302af3aad1ca67420ddd5c7bd480c8867ad173528767d906428057a11f0e", size = 5247579, upload-time = "2026-02-11T04:22:56.094Z" }, + { url = "https://files.pythonhosted.org/packages/54/9a/9cc3e029683cf6d20ae5085da0dafc63148e3252c2f13328e553aaa13cfb/pillow-12.1.1-pp311-pypy311_pp73-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:8fd420ef0c52c88b5a035a0886f367748c72147b2b8f384c9d12656678dfdfa9", size = 6989094, upload-time = "2026-02-11T04:22:58.288Z" }, + { url = "https://files.pythonhosted.org/packages/00/98/fc53ab36da80b88df0967896b6c4b4cd948a0dc5aa40a754266aa3ae48b3/pillow-12.1.1-pp311-pypy311_pp73-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:f975aa7ef9684ce7e2c18a3aa8f8e2106ce1e46b94ab713d156b2898811651d3", size = 5313850, upload-time = "2026-02-11T04:23:00.554Z" }, + { url = "https://files.pythonhosted.org/packages/30/02/00fa585abfd9fe9d73e5f6e554dc36cc2b842898cbfc46d70353dae227f8/pillow-12.1.1-pp311-pypy311_pp73-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:8089c852a56c2966cf18835db62d9b34fef7ba74c726ad943928d494fa7f4735", size = 5963343, upload-time = "2026-02-11T04:23:02.934Z" }, + { url = "https://files.pythonhosted.org/packages/f2/26/c56ce33ca856e358d27fda9676c055395abddb82c35ac0f593877ed4562e/pillow-12.1.1-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:cb9bb857b2d057c6dfc72ac5f3b44836924ba15721882ef103cecb40d002d80e", size = 7029880, upload-time = "2026-02-11T04:23:04.783Z" }, +] + +[[package]] +name = "platformdirs" +version = "4.9.4" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/19/56/8d4c30c8a1d07013911a8fdbd8f89440ef9f08d07a1b50ab8ca8be5a20f9/platformdirs-4.9.4.tar.gz", hash = "sha256:1ec356301b7dc906d83f371c8f487070e99d3ccf9e501686456394622a01a934", size = 28737, upload-time = "2026-03-05T18:34:13.271Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/63/d7/97f7e3a6abb67d8080dd406fd4df842c2be0efaf712d1c899c32a075027c/platformdirs-4.9.4-py3-none-any.whl", hash = "sha256:68a9a4619a666ea6439f2ff250c12a853cd1cbd5158d258bd824a7df6be2f868", size = 21216, upload-time = "2026-03-05T18:34:12.172Z" }, +] + +[[package]] +name = "pluggy" +version = "1.6.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/f9/e2/3e91f31a7d2b083fe6ef3fa267035b518369d9511ffab804f839851d2779/pluggy-1.6.0.tar.gz", hash = "sha256:7dcc130b76258d33b90f61b658791dede3486c3e6bfb003ee5c9bfb396dd22f3", size = 69412, upload-time = "2025-05-15T12:30:07.975Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/54/20/4d324d65cc6d9205fabedc306948156824eb9f0ee1633355a8f7ec5c66bf/pluggy-1.6.0-py3-none-any.whl", hash = "sha256:e920276dd6813095e9377c0bc5566d94c932c33b27a3e3945d8389c374dd4746", size = 20538, upload-time = "2025-05-15T12:30:06.134Z" }, +] + +[[package]] +name = "pooch" +version = "1.9.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "packaging" }, + { name = "platformdirs" }, + { name = "requests" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/83/43/85ef45e8b36c6a48546af7b266592dc32d7f67837a6514d111bced6d7d75/pooch-1.9.0.tar.gz", hash = "sha256:de46729579b9857ffd3e741987a2f6d5e0e03219892c167c6578c0091fb511ed", size = 61788, upload-time = "2026-01-30T19:15:09.649Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/2a/2d/d4bf65e47cea8ff2c794a600c4fd1273a7902f268757c531e0ee9f18aa58/pooch-1.9.0-py3-none-any.whl", hash = "sha256:f265597baa9f760d25ceb29d0beb8186c243d6607b0f60b83ecf14078dbc703b", size = 67175, upload-time = "2026-01-30T19:15:08.36Z" }, +] + +[[package]] +name = "primepy" +version = "1.3" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/35/77/0cfa1b4697cfb5336f3a96e8bc73327f64610be3a64c97275f1801afb395/primePy-1.3.tar.gz", hash = "sha256:25fd7e25344b0789a5984c75d89f054fcf1f180bef20c998e4befbac92de4669", size = 3914, upload-time = "2018-05-29T17:18:18.683Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/74/c1/bb7e334135859c3a92ec399bc89293ea73f28e815e35b43929c8db6af030/primePy-1.3-py3-none-any.whl", hash = "sha256:5ed443718765be9bf7e2ff4c56cdff71b42140a15b39d054f9d99f0009e2317a", size = 4040, upload-time = "2018-05-29T17:18:17.53Z" }, +] + +[[package]] +name = "propcache" +version = "0.4.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/9e/da/e9fc233cf63743258bff22b3dfa7ea5baef7b5bc324af47a0ad89b8ffc6f/propcache-0.4.1.tar.gz", hash = "sha256:f48107a8c637e80362555f37ecf49abe20370e557cc4ab374f04ec4423c97c3d", size = 46442, upload-time = "2025-10-08T19:49:02.291Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/3c/0e/934b541323035566a9af292dba85a195f7b78179114f2c6ebb24551118a9/propcache-0.4.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:7c2d1fa3201efaf55d730400d945b5b3ab6e672e100ba0f9a409d950ab25d7db", size = 79534, upload-time = "2025-10-08T19:46:02.083Z" }, + { url = "https://files.pythonhosted.org/packages/a1/6b/db0d03d96726d995dc7171286c6ba9d8d14251f37433890f88368951a44e/propcache-0.4.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:1eb2994229cc8ce7fe9b3db88f5465f5fd8651672840b2e426b88cdb1a30aac8", size = 45526, upload-time = "2025-10-08T19:46:03.884Z" }, + { url = "https://files.pythonhosted.org/packages/e4/c3/82728404aea669e1600f304f2609cde9e665c18df5a11cdd57ed73c1dceb/propcache-0.4.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:66c1f011f45a3b33d7bcb22daed4b29c0c9e2224758b6be00686731e1b46f925", size = 47263, upload-time = "2025-10-08T19:46:05.405Z" }, + { url = "https://files.pythonhosted.org/packages/df/1b/39313ddad2bf9187a1432654c38249bab4562ef535ef07f5eb6eb04d0b1b/propcache-0.4.1-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:9a52009f2adffe195d0b605c25ec929d26b36ef986ba85244891dee3b294df21", size = 201012, upload-time = "2025-10-08T19:46:07.165Z" }, + { url = "https://files.pythonhosted.org/packages/5b/01/f1d0b57d136f294a142acf97f4ed58c8e5b974c21e543000968357115011/propcache-0.4.1-cp310-cp310-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:5d4e2366a9c7b837555cf02fb9be2e3167d333aff716332ef1b7c3a142ec40c5", size = 209491, upload-time = "2025-10-08T19:46:08.909Z" }, + { url = "https://files.pythonhosted.org/packages/a1/c8/038d909c61c5bb039070b3fb02ad5cccdb1dde0d714792e251cdb17c9c05/propcache-0.4.1-cp310-cp310-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:9d2b6caef873b4f09e26ea7e33d65f42b944837563a47a94719cc3544319a0db", size = 215319, upload-time = "2025-10-08T19:46:10.7Z" }, + { url = "https://files.pythonhosted.org/packages/08/57/8c87e93142b2c1fa2408e45695205a7ba05fb5db458c0bf5c06ba0e09ea6/propcache-0.4.1-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:2b16ec437a8c8a965ecf95739448dd938b5c7f56e67ea009f4300d8df05f32b7", size = 196856, upload-time = "2025-10-08T19:46:12.003Z" }, + { url = "https://files.pythonhosted.org/packages/42/df/5615fec76aa561987a534759b3686008a288e73107faa49a8ae5795a9f7a/propcache-0.4.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:296f4c8ed03ca7476813fe666c9ea97869a8d7aec972618671b33a38a5182ef4", size = 193241, upload-time = "2025-10-08T19:46:13.495Z" }, + { url = "https://files.pythonhosted.org/packages/d5/21/62949eb3a7a54afe8327011c90aca7e03547787a88fb8bd9726806482fea/propcache-0.4.1-cp310-cp310-musllinux_1_2_armv7l.whl", hash = "sha256:1f0978529a418ebd1f49dad413a2b68af33f85d5c5ca5c6ca2a3bed375a7ac60", size = 190552, upload-time = "2025-10-08T19:46:14.938Z" }, + { url = "https://files.pythonhosted.org/packages/30/ee/ab4d727dd70806e5b4de96a798ae7ac6e4d42516f030ee60522474b6b332/propcache-0.4.1-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:fd138803047fb4c062b1c1dd95462f5209456bfab55c734458f15d11da288f8f", size = 200113, upload-time = "2025-10-08T19:46:16.695Z" }, + { url = "https://files.pythonhosted.org/packages/8a/0b/38b46208e6711b016aa8966a3ac793eee0d05c7159d8342aa27fc0bc365e/propcache-0.4.1-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:8c9b3cbe4584636d72ff556d9036e0c9317fa27b3ac1f0f558e7e84d1c9c5900", size = 200778, upload-time = "2025-10-08T19:46:18.023Z" }, + { url = "https://files.pythonhosted.org/packages/cf/81/5abec54355ed344476bee711e9f04815d4b00a311ab0535599204eecc257/propcache-0.4.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:f93243fdc5657247533273ac4f86ae106cc6445a0efacb9a1bfe982fcfefd90c", size = 193047, upload-time = "2025-10-08T19:46:19.449Z" }, + { url = "https://files.pythonhosted.org/packages/ec/b6/1f237c04e32063cb034acd5f6ef34ef3a394f75502e72703545631ab1ef6/propcache-0.4.1-cp310-cp310-win32.whl", hash = "sha256:a0ee98db9c5f80785b266eb805016e36058ac72c51a064040f2bc43b61101cdb", size = 38093, upload-time = "2025-10-08T19:46:20.643Z" }, + { url = "https://files.pythonhosted.org/packages/a6/67/354aac4e0603a15f76439caf0427781bcd6797f370377f75a642133bc954/propcache-0.4.1-cp310-cp310-win_amd64.whl", hash = "sha256:1cdb7988c4e5ac7f6d175a28a9aa0c94cb6f2ebe52756a3c0cda98d2809a9e37", size = 41638, upload-time = "2025-10-08T19:46:21.935Z" }, + { url = "https://files.pythonhosted.org/packages/e0/e1/74e55b9fd1a4c209ff1a9a824bf6c8b3d1fc5a1ac3eabe23462637466785/propcache-0.4.1-cp310-cp310-win_arm64.whl", hash = "sha256:d82ad62b19645419fe79dd63b3f9253e15b30e955c0170e5cebc350c1844e581", size = 38229, upload-time = "2025-10-08T19:46:23.368Z" }, + { url = "https://files.pythonhosted.org/packages/8c/d4/4e2c9aaf7ac2242b9358f98dccd8f90f2605402f5afeff6c578682c2c491/propcache-0.4.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:60a8fda9644b7dfd5dece8c61d8a85e271cb958075bfc4e01083c148b61a7caf", size = 80208, upload-time = "2025-10-08T19:46:24.597Z" }, + { url = "https://files.pythonhosted.org/packages/c2/21/d7b68e911f9c8e18e4ae43bdbc1e1e9bbd971f8866eb81608947b6f585ff/propcache-0.4.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:c30b53e7e6bda1d547cabb47c825f3843a0a1a42b0496087bb58d8fedf9f41b5", size = 45777, upload-time = "2025-10-08T19:46:25.733Z" }, + { url = "https://files.pythonhosted.org/packages/d3/1d/11605e99ac8ea9435651ee71ab4cb4bf03f0949586246476a25aadfec54a/propcache-0.4.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:6918ecbd897443087a3b7cd978d56546a812517dcaaca51b49526720571fa93e", size = 47647, upload-time = "2025-10-08T19:46:27.304Z" }, + { url = "https://files.pythonhosted.org/packages/58/1a/3c62c127a8466c9c843bccb503d40a273e5cc69838805f322e2826509e0d/propcache-0.4.1-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:3d902a36df4e5989763425a8ab9e98cd8ad5c52c823b34ee7ef307fd50582566", size = 214929, upload-time = "2025-10-08T19:46:28.62Z" }, + { url = "https://files.pythonhosted.org/packages/56/b9/8fa98f850960b367c4b8fe0592e7fc341daa7a9462e925228f10a60cf74f/propcache-0.4.1-cp311-cp311-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:a9695397f85973bb40427dedddf70d8dc4a44b22f1650dd4af9eedf443d45165", size = 221778, upload-time = "2025-10-08T19:46:30.358Z" }, + { url = "https://files.pythonhosted.org/packages/46/a6/0ab4f660eb59649d14b3d3d65c439421cf2f87fe5dd68591cbe3c1e78a89/propcache-0.4.1-cp311-cp311-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:2bb07ffd7eaad486576430c89f9b215f9e4be68c4866a96e97db9e97fead85dc", size = 228144, upload-time = "2025-10-08T19:46:32.607Z" }, + { url = "https://files.pythonhosted.org/packages/52/6a/57f43e054fb3d3a56ac9fc532bc684fc6169a26c75c353e65425b3e56eef/propcache-0.4.1-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:fd6f30fdcf9ae2a70abd34da54f18da086160e4d7d9251f81f3da0ff84fc5a48", size = 210030, upload-time = "2025-10-08T19:46:33.969Z" }, + { url = "https://files.pythonhosted.org/packages/40/e2/27e6feebb5f6b8408fa29f5efbb765cd54c153ac77314d27e457a3e993b7/propcache-0.4.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:fc38cba02d1acba4e2869eef1a57a43dfbd3d49a59bf90dda7444ec2be6a5570", size = 208252, upload-time = "2025-10-08T19:46:35.309Z" }, + { url = "https://files.pythonhosted.org/packages/9e/f8/91c27b22ccda1dbc7967f921c42825564fa5336a01ecd72eb78a9f4f53c2/propcache-0.4.1-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:67fad6162281e80e882fb3ec355398cf72864a54069d060321f6cd0ade95fe85", size = 202064, upload-time = "2025-10-08T19:46:36.993Z" }, + { url = "https://files.pythonhosted.org/packages/f2/26/7f00bd6bd1adba5aafe5f4a66390f243acab58eab24ff1a08bebb2ef9d40/propcache-0.4.1-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:f10207adf04d08bec185bae14d9606a1444715bc99180f9331c9c02093e1959e", size = 212429, upload-time = "2025-10-08T19:46:38.398Z" }, + { url = "https://files.pythonhosted.org/packages/84/89/fd108ba7815c1117ddca79c228f3f8a15fc82a73bca8b142eb5de13b2785/propcache-0.4.1-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:e9b0d8d0845bbc4cfcdcbcdbf5086886bc8157aa963c31c777ceff7846c77757", size = 216727, upload-time = "2025-10-08T19:46:39.732Z" }, + { url = "https://files.pythonhosted.org/packages/79/37/3ec3f7e3173e73f1d600495d8b545b53802cbf35506e5732dd8578db3724/propcache-0.4.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:981333cb2f4c1896a12f4ab92a9cc8f09ea664e9b7dbdc4eff74627af3a11c0f", size = 205097, upload-time = "2025-10-08T19:46:41.025Z" }, + { url = "https://files.pythonhosted.org/packages/61/b0/b2631c19793f869d35f47d5a3a56fb19e9160d3c119f15ac7344fc3ccae7/propcache-0.4.1-cp311-cp311-win32.whl", hash = "sha256:f1d2f90aeec838a52f1c1a32fe9a619fefd5e411721a9117fbf82aea638fe8a1", size = 38084, upload-time = "2025-10-08T19:46:42.693Z" }, + { url = "https://files.pythonhosted.org/packages/f4/78/6cce448e2098e9f3bfc91bb877f06aa24b6ccace872e39c53b2f707c4648/propcache-0.4.1-cp311-cp311-win_amd64.whl", hash = "sha256:364426a62660f3f699949ac8c621aad6977be7126c5807ce48c0aeb8e7333ea6", size = 41637, upload-time = "2025-10-08T19:46:43.778Z" }, + { url = "https://files.pythonhosted.org/packages/9c/e9/754f180cccd7f51a39913782c74717c581b9cc8177ad0e949f4d51812383/propcache-0.4.1-cp311-cp311-win_arm64.whl", hash = "sha256:e53f3a38d3510c11953f3e6a33f205c6d1b001129f972805ca9b42fc308bc239", size = 38064, upload-time = "2025-10-08T19:46:44.872Z" }, + { url = "https://files.pythonhosted.org/packages/a2/0f/f17b1b2b221d5ca28b4b876e8bb046ac40466513960646bda8e1853cdfa2/propcache-0.4.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:e153e9cd40cc8945138822807139367f256f89c6810c2634a4f6902b52d3b4e2", size = 80061, upload-time = "2025-10-08T19:46:46.075Z" }, + { url = "https://files.pythonhosted.org/packages/76/47/8ccf75935f51448ba9a16a71b783eb7ef6b9ee60f5d14c7f8a8a79fbeed7/propcache-0.4.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:cd547953428f7abb73c5ad82cbb32109566204260d98e41e5dfdc682eb7f8403", size = 46037, upload-time = "2025-10-08T19:46:47.23Z" }, + { url = "https://files.pythonhosted.org/packages/0a/b6/5c9a0e42df4d00bfb4a3cbbe5cf9f54260300c88a0e9af1f47ca5ce17ac0/propcache-0.4.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:f048da1b4f243fc44f205dfd320933a951b8d89e0afd4c7cacc762a8b9165207", size = 47324, upload-time = "2025-10-08T19:46:48.384Z" }, + { url = "https://files.pythonhosted.org/packages/9e/d3/6c7ee328b39a81ee877c962469f1e795f9db87f925251efeb0545e0020d0/propcache-0.4.1-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ec17c65562a827bba85e3872ead335f95405ea1674860d96483a02f5c698fa72", size = 225505, upload-time = "2025-10-08T19:46:50.055Z" }, + { url = "https://files.pythonhosted.org/packages/01/5d/1c53f4563490b1d06a684742cc6076ef944bc6457df6051b7d1a877c057b/propcache-0.4.1-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:405aac25c6394ef275dee4c709be43745d36674b223ba4eb7144bf4d691b7367", size = 230242, upload-time = "2025-10-08T19:46:51.815Z" }, + { url = "https://files.pythonhosted.org/packages/20/e1/ce4620633b0e2422207c3cb774a0ee61cac13abc6217763a7b9e2e3f4a12/propcache-0.4.1-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:0013cb6f8dde4b2a2f66903b8ba740bdfe378c943c4377a200551ceb27f379e4", size = 238474, upload-time = "2025-10-08T19:46:53.208Z" }, + { url = "https://files.pythonhosted.org/packages/46/4b/3aae6835b8e5f44ea6a68348ad90f78134047b503765087be2f9912140ea/propcache-0.4.1-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:15932ab57837c3368b024473a525e25d316d8353016e7cc0e5ba9eb343fbb1cf", size = 221575, upload-time = "2025-10-08T19:46:54.511Z" }, + { url = "https://files.pythonhosted.org/packages/6e/a5/8a5e8678bcc9d3a1a15b9a29165640d64762d424a16af543f00629c87338/propcache-0.4.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:031dce78b9dc099f4c29785d9cf5577a3faf9ebf74ecbd3c856a7b92768c3df3", size = 216736, upload-time = "2025-10-08T19:46:56.212Z" }, + { url = "https://files.pythonhosted.org/packages/f1/63/b7b215eddeac83ca1c6b934f89d09a625aa9ee4ba158338854c87210cc36/propcache-0.4.1-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:ab08df6c9a035bee56e31af99be621526bd237bea9f32def431c656b29e41778", size = 213019, upload-time = "2025-10-08T19:46:57.595Z" }, + { url = "https://files.pythonhosted.org/packages/57/74/f580099a58c8af587cac7ba19ee7cb418506342fbbe2d4a4401661cca886/propcache-0.4.1-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:4d7af63f9f93fe593afbf104c21b3b15868efb2c21d07d8732c0c4287e66b6a6", size = 220376, upload-time = "2025-10-08T19:46:59.067Z" }, + { url = "https://files.pythonhosted.org/packages/c4/ee/542f1313aff7eaf19c2bb758c5d0560d2683dac001a1c96d0774af799843/propcache-0.4.1-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:cfc27c945f422e8b5071b6e93169679e4eb5bf73bbcbf1ba3ae3a83d2f78ebd9", size = 226988, upload-time = "2025-10-08T19:47:00.544Z" }, + { url = "https://files.pythonhosted.org/packages/8f/18/9c6b015dd9c6930f6ce2229e1f02fb35298b847f2087ea2b436a5bfa7287/propcache-0.4.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:35c3277624a080cc6ec6f847cbbbb5b49affa3598c4535a0a4682a697aaa5c75", size = 215615, upload-time = "2025-10-08T19:47:01.968Z" }, + { url = "https://files.pythonhosted.org/packages/80/9e/e7b85720b98c45a45e1fca6a177024934dc9bc5f4d5dd04207f216fc33ed/propcache-0.4.1-cp312-cp312-win32.whl", hash = "sha256:671538c2262dadb5ba6395e26c1731e1d52534bfe9ae56d0b5573ce539266aa8", size = 38066, upload-time = "2025-10-08T19:47:03.503Z" }, + { url = "https://files.pythonhosted.org/packages/54/09/d19cff2a5aaac632ec8fc03737b223597b1e347416934c1b3a7df079784c/propcache-0.4.1-cp312-cp312-win_amd64.whl", hash = "sha256:cb2d222e72399fcf5890d1d5cc1060857b9b236adff2792ff48ca2dfd46c81db", size = 41655, upload-time = "2025-10-08T19:47:04.973Z" }, + { url = "https://files.pythonhosted.org/packages/68/ab/6b5c191bb5de08036a8c697b265d4ca76148efb10fa162f14af14fb5f076/propcache-0.4.1-cp312-cp312-win_arm64.whl", hash = "sha256:204483131fb222bdaaeeea9f9e6c6ed0cac32731f75dfc1d4a567fc1926477c1", size = 37789, upload-time = "2025-10-08T19:47:06.077Z" }, + { url = "https://files.pythonhosted.org/packages/bf/df/6d9c1b6ac12b003837dde8a10231a7344512186e87b36e855bef32241942/propcache-0.4.1-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:43eedf29202c08550aac1d14e0ee619b0430aaef78f85864c1a892294fbc28cf", size = 77750, upload-time = "2025-10-08T19:47:07.648Z" }, + { url = "https://files.pythonhosted.org/packages/8b/e8/677a0025e8a2acf07d3418a2e7ba529c9c33caf09d3c1f25513023c1db56/propcache-0.4.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:d62cdfcfd89ccb8de04e0eda998535c406bf5e060ffd56be6c586cbcc05b3311", size = 44780, upload-time = "2025-10-08T19:47:08.851Z" }, + { url = "https://files.pythonhosted.org/packages/89/a4/92380f7ca60f99ebae761936bc48a72a639e8a47b29050615eef757cb2a7/propcache-0.4.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:cae65ad55793da34db5f54e4029b89d3b9b9490d8abe1b4c7ab5d4b8ec7ebf74", size = 46308, upload-time = "2025-10-08T19:47:09.982Z" }, + { url = "https://files.pythonhosted.org/packages/2d/48/c5ac64dee5262044348d1d78a5f85dd1a57464a60d30daee946699963eb3/propcache-0.4.1-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:333ddb9031d2704a301ee3e506dc46b1fe5f294ec198ed6435ad5b6a085facfe", size = 208182, upload-time = "2025-10-08T19:47:11.319Z" }, + { url = "https://files.pythonhosted.org/packages/c6/0c/cd762dd011a9287389a6a3eb43aa30207bde253610cca06824aeabfe9653/propcache-0.4.1-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:fd0858c20f078a32cf55f7e81473d96dcf3b93fd2ccdb3d40fdf54b8573df3af", size = 211215, upload-time = "2025-10-08T19:47:13.146Z" }, + { url = "https://files.pythonhosted.org/packages/30/3e/49861e90233ba36890ae0ca4c660e95df565b2cd15d4a68556ab5865974e/propcache-0.4.1-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:678ae89ebc632c5c204c794f8dab2837c5f159aeb59e6ed0539500400577298c", size = 218112, upload-time = "2025-10-08T19:47:14.913Z" }, + { url = "https://files.pythonhosted.org/packages/f1/8b/544bc867e24e1bd48f3118cecd3b05c694e160a168478fa28770f22fd094/propcache-0.4.1-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:d472aeb4fbf9865e0c6d622d7f4d54a4e101a89715d8904282bb5f9a2f476c3f", size = 204442, upload-time = "2025-10-08T19:47:16.277Z" }, + { url = "https://files.pythonhosted.org/packages/50/a6/4282772fd016a76d3e5c0df58380a5ea64900afd836cec2c2f662d1b9bb3/propcache-0.4.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:4d3df5fa7e36b3225954fba85589da77a0fe6a53e3976de39caf04a0db4c36f1", size = 199398, upload-time = "2025-10-08T19:47:17.962Z" }, + { url = "https://files.pythonhosted.org/packages/3e/ec/d8a7cd406ee1ddb705db2139f8a10a8a427100347bd698e7014351c7af09/propcache-0.4.1-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:ee17f18d2498f2673e432faaa71698032b0127ebf23ae5974eeaf806c279df24", size = 196920, upload-time = "2025-10-08T19:47:19.355Z" }, + { url = "https://files.pythonhosted.org/packages/f6/6c/f38ab64af3764f431e359f8baf9e0a21013e24329e8b85d2da32e8ed07ca/propcache-0.4.1-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:580e97762b950f993ae618e167e7be9256b8353c2dcd8b99ec100eb50f5286aa", size = 203748, upload-time = "2025-10-08T19:47:21.338Z" }, + { url = "https://files.pythonhosted.org/packages/d6/e3/fa846bd70f6534d647886621388f0a265254d30e3ce47e5c8e6e27dbf153/propcache-0.4.1-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:501d20b891688eb8e7aa903021f0b72d5a55db40ffaab27edefd1027caaafa61", size = 205877, upload-time = "2025-10-08T19:47:23.059Z" }, + { url = "https://files.pythonhosted.org/packages/e2/39/8163fc6f3133fea7b5f2827e8eba2029a0277ab2c5beee6c1db7b10fc23d/propcache-0.4.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:9a0bd56e5b100aef69bd8562b74b46254e7c8812918d3baa700c8a8009b0af66", size = 199437, upload-time = "2025-10-08T19:47:24.445Z" }, + { url = "https://files.pythonhosted.org/packages/93/89/caa9089970ca49c7c01662bd0eeedfe85494e863e8043565aeb6472ce8fe/propcache-0.4.1-cp313-cp313-win32.whl", hash = "sha256:bcc9aaa5d80322bc2fb24bb7accb4a30f81e90ab8d6ba187aec0744bc302ad81", size = 37586, upload-time = "2025-10-08T19:47:25.736Z" }, + { url = "https://files.pythonhosted.org/packages/f5/ab/f76ec3c3627c883215b5c8080debb4394ef5a7a29be811f786415fc1e6fd/propcache-0.4.1-cp313-cp313-win_amd64.whl", hash = "sha256:381914df18634f5494334d201e98245c0596067504b9372d8cf93f4bb23e025e", size = 40790, upload-time = "2025-10-08T19:47:26.847Z" }, + { url = "https://files.pythonhosted.org/packages/59/1b/e71ae98235f8e2ba5004d8cb19765a74877abf189bc53fc0c80d799e56c3/propcache-0.4.1-cp313-cp313-win_arm64.whl", hash = "sha256:8873eb4460fd55333ea49b7d189749ecf6e55bf85080f11b1c4530ed3034cba1", size = 37158, upload-time = "2025-10-08T19:47:27.961Z" }, + { url = "https://files.pythonhosted.org/packages/83/ce/a31bbdfc24ee0dcbba458c8175ed26089cf109a55bbe7b7640ed2470cfe9/propcache-0.4.1-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:92d1935ee1f8d7442da9c0c4fa7ac20d07e94064184811b685f5c4fada64553b", size = 81451, upload-time = "2025-10-08T19:47:29.445Z" }, + { url = "https://files.pythonhosted.org/packages/25/9c/442a45a470a68456e710d96cacd3573ef26a1d0a60067e6a7d5e655621ed/propcache-0.4.1-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:473c61b39e1460d386479b9b2f337da492042447c9b685f28be4f74d3529e566", size = 46374, upload-time = "2025-10-08T19:47:30.579Z" }, + { url = "https://files.pythonhosted.org/packages/f4/bf/b1d5e21dbc3b2e889ea4327044fb16312a736d97640fb8b6aa3f9c7b3b65/propcache-0.4.1-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:c0ef0aaafc66fbd87842a3fe3902fd889825646bc21149eafe47be6072725835", size = 48396, upload-time = "2025-10-08T19:47:31.79Z" }, + { url = "https://files.pythonhosted.org/packages/f4/04/5b4c54a103d480e978d3c8a76073502b18db0c4bc17ab91b3cb5092ad949/propcache-0.4.1-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:f95393b4d66bfae908c3ca8d169d5f79cd65636ae15b5e7a4f6e67af675adb0e", size = 275950, upload-time = "2025-10-08T19:47:33.481Z" }, + { url = "https://files.pythonhosted.org/packages/b4/c1/86f846827fb969c4b78b0af79bba1d1ea2156492e1b83dea8b8a6ae27395/propcache-0.4.1-cp313-cp313t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:c07fda85708bc48578467e85099645167a955ba093be0a2dcba962195676e859", size = 273856, upload-time = "2025-10-08T19:47:34.906Z" }, + { url = "https://files.pythonhosted.org/packages/36/1d/fc272a63c8d3bbad6878c336c7a7dea15e8f2d23a544bda43205dfa83ada/propcache-0.4.1-cp313-cp313t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:af223b406d6d000830c6f65f1e6431783fc3f713ba3e6cc8c024d5ee96170a4b", size = 280420, upload-time = "2025-10-08T19:47:36.338Z" }, + { url = "https://files.pythonhosted.org/packages/07/0c/01f2219d39f7e53d52e5173bcb09c976609ba30209912a0680adfb8c593a/propcache-0.4.1-cp313-cp313t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:a78372c932c90ee474559c5ddfffd718238e8673c340dc21fe45c5b8b54559a0", size = 263254, upload-time = "2025-10-08T19:47:37.692Z" }, + { url = "https://files.pythonhosted.org/packages/2d/18/cd28081658ce597898f0c4d174d4d0f3c5b6d4dc27ffafeef835c95eb359/propcache-0.4.1-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:564d9f0d4d9509e1a870c920a89b2fec951b44bf5ba7d537a9e7c1ccec2c18af", size = 261205, upload-time = "2025-10-08T19:47:39.659Z" }, + { url = "https://files.pythonhosted.org/packages/7a/71/1f9e22eb8b8316701c2a19fa1f388c8a3185082607da8e406a803c9b954e/propcache-0.4.1-cp313-cp313t-musllinux_1_2_armv7l.whl", hash = "sha256:17612831fda0138059cc5546f4d12a2aacfb9e47068c06af35c400ba58ba7393", size = 247873, upload-time = "2025-10-08T19:47:41.084Z" }, + { url = "https://files.pythonhosted.org/packages/4a/65/3d4b61f36af2b4eddba9def857959f1016a51066b4f1ce348e0cf7881f58/propcache-0.4.1-cp313-cp313t-musllinux_1_2_ppc64le.whl", hash = "sha256:41a89040cb10bd345b3c1a873b2bf36413d48da1def52f268a055f7398514874", size = 262739, upload-time = "2025-10-08T19:47:42.51Z" }, + { url = "https://files.pythonhosted.org/packages/2a/42/26746ab087faa77c1c68079b228810436ccd9a5ce9ac85e2b7307195fd06/propcache-0.4.1-cp313-cp313t-musllinux_1_2_s390x.whl", hash = "sha256:e35b88984e7fa64aacecea39236cee32dd9bd8c55f57ba8a75cf2399553f9bd7", size = 263514, upload-time = "2025-10-08T19:47:43.927Z" }, + { url = "https://files.pythonhosted.org/packages/94/13/630690fe201f5502d2403dd3cfd451ed8858fe3c738ee88d095ad2ff407b/propcache-0.4.1-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:6f8b465489f927b0df505cbe26ffbeed4d6d8a2bbc61ce90eb074ff129ef0ab1", size = 257781, upload-time = "2025-10-08T19:47:45.448Z" }, + { url = "https://files.pythonhosted.org/packages/92/f7/1d4ec5841505f423469efbfc381d64b7b467438cd5a4bbcbb063f3b73d27/propcache-0.4.1-cp313-cp313t-win32.whl", hash = "sha256:2ad890caa1d928c7c2965b48f3a3815c853180831d0e5503d35cf00c472f4717", size = 41396, upload-time = "2025-10-08T19:47:47.202Z" }, + { url = "https://files.pythonhosted.org/packages/48/f0/615c30622316496d2cbbc29f5985f7777d3ada70f23370608c1d3e081c1f/propcache-0.4.1-cp313-cp313t-win_amd64.whl", hash = "sha256:f7ee0e597f495cf415bcbd3da3caa3bd7e816b74d0d52b8145954c5e6fd3ff37", size = 44897, upload-time = "2025-10-08T19:47:48.336Z" }, + { url = "https://files.pythonhosted.org/packages/fd/ca/6002e46eccbe0e33dcd4069ef32f7f1c9e243736e07adca37ae8c4830ec3/propcache-0.4.1-cp313-cp313t-win_arm64.whl", hash = "sha256:929d7cbe1f01bb7baffb33dc14eb5691c95831450a26354cd210a8155170c93a", size = 39789, upload-time = "2025-10-08T19:47:49.876Z" }, + { url = "https://files.pythonhosted.org/packages/8e/5c/bca52d654a896f831b8256683457ceddd490ec18d9ec50e97dfd8fc726a8/propcache-0.4.1-cp314-cp314-macosx_10_13_universal2.whl", hash = "sha256:3f7124c9d820ba5548d431afb4632301acf965db49e666aa21c305cbe8c6de12", size = 78152, upload-time = "2025-10-08T19:47:51.051Z" }, + { url = "https://files.pythonhosted.org/packages/65/9b/03b04e7d82a5f54fb16113d839f5ea1ede58a61e90edf515f6577c66fa8f/propcache-0.4.1-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:c0d4b719b7da33599dfe3b22d3db1ef789210a0597bc650b7cee9c77c2be8c5c", size = 44869, upload-time = "2025-10-08T19:47:52.594Z" }, + { url = "https://files.pythonhosted.org/packages/b2/fa/89a8ef0468d5833a23fff277b143d0573897cf75bd56670a6d28126c7d68/propcache-0.4.1-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:9f302f4783709a78240ebc311b793f123328716a60911d667e0c036bc5dcbded", size = 46596, upload-time = "2025-10-08T19:47:54.073Z" }, + { url = "https://files.pythonhosted.org/packages/86/bd/47816020d337f4a746edc42fe8d53669965138f39ee117414c7d7a340cfe/propcache-0.4.1-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c80ee5802e3fb9ea37938e7eecc307fb984837091d5fd262bb37238b1ae97641", size = 206981, upload-time = "2025-10-08T19:47:55.715Z" }, + { url = "https://files.pythonhosted.org/packages/df/f6/c5fa1357cc9748510ee55f37173eb31bfde6d94e98ccd9e6f033f2fc06e1/propcache-0.4.1-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:ed5a841e8bb29a55fb8159ed526b26adc5bdd7e8bd7bf793ce647cb08656cdf4", size = 211490, upload-time = "2025-10-08T19:47:57.499Z" }, + { url = "https://files.pythonhosted.org/packages/80/1e/e5889652a7c4a3846683401a48f0f2e5083ce0ec1a8a5221d8058fbd1adf/propcache-0.4.1-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:55c72fd6ea2da4c318e74ffdf93c4fe4e926051133657459131a95c846d16d44", size = 215371, upload-time = "2025-10-08T19:47:59.317Z" }, + { url = "https://files.pythonhosted.org/packages/b2/f2/889ad4b2408f72fe1a4f6a19491177b30ea7bf1a0fd5f17050ca08cfc882/propcache-0.4.1-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:8326e144341460402713f91df60ade3c999d601e7eb5ff8f6f7862d54de0610d", size = 201424, upload-time = "2025-10-08T19:48:00.67Z" }, + { url = "https://files.pythonhosted.org/packages/27/73/033d63069b57b0812c8bd19f311faebeceb6ba31b8f32b73432d12a0b826/propcache-0.4.1-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:060b16ae65bc098da7f6d25bf359f1f31f688384858204fe5d652979e0015e5b", size = 197566, upload-time = "2025-10-08T19:48:02.604Z" }, + { url = "https://files.pythonhosted.org/packages/dc/89/ce24f3dc182630b4e07aa6d15f0ff4b14ed4b9955fae95a0b54c58d66c05/propcache-0.4.1-cp314-cp314-musllinux_1_2_armv7l.whl", hash = "sha256:89eb3fa9524f7bec9de6e83cf3faed9d79bffa560672c118a96a171a6f55831e", size = 193130, upload-time = "2025-10-08T19:48:04.499Z" }, + { url = "https://files.pythonhosted.org/packages/a9/24/ef0d5fd1a811fb5c609278d0209c9f10c35f20581fcc16f818da959fc5b4/propcache-0.4.1-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:dee69d7015dc235f526fe80a9c90d65eb0039103fe565776250881731f06349f", size = 202625, upload-time = "2025-10-08T19:48:06.213Z" }, + { url = "https://files.pythonhosted.org/packages/f5/02/98ec20ff5546f68d673df2f7a69e8c0d076b5abd05ca882dc7ee3a83653d/propcache-0.4.1-cp314-cp314-musllinux_1_2_s390x.whl", hash = "sha256:5558992a00dfd54ccbc64a32726a3357ec93825a418a401f5cc67df0ac5d9e49", size = 204209, upload-time = "2025-10-08T19:48:08.432Z" }, + { url = "https://files.pythonhosted.org/packages/a0/87/492694f76759b15f0467a2a93ab68d32859672b646aa8a04ce4864e7932d/propcache-0.4.1-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:c9b822a577f560fbd9554812526831712c1436d2c046cedee4c3796d3543b144", size = 197797, upload-time = "2025-10-08T19:48:09.968Z" }, + { url = "https://files.pythonhosted.org/packages/ee/36/66367de3575db1d2d3f3d177432bd14ee577a39d3f5d1b3d5df8afe3b6e2/propcache-0.4.1-cp314-cp314-win32.whl", hash = "sha256:ab4c29b49d560fe48b696cdcb127dd36e0bc2472548f3bf56cc5cb3da2b2984f", size = 38140, upload-time = "2025-10-08T19:48:11.232Z" }, + { url = "https://files.pythonhosted.org/packages/0c/2a/a758b47de253636e1b8aef181c0b4f4f204bf0dd964914fb2af90a95b49b/propcache-0.4.1-cp314-cp314-win_amd64.whl", hash = "sha256:5a103c3eb905fcea0ab98be99c3a9a5ab2de60228aa5aceedc614c0281cf6153", size = 41257, upload-time = "2025-10-08T19:48:12.707Z" }, + { url = "https://files.pythonhosted.org/packages/34/5e/63bd5896c3fec12edcbd6f12508d4890d23c265df28c74b175e1ef9f4f3b/propcache-0.4.1-cp314-cp314-win_arm64.whl", hash = "sha256:74c1fb26515153e482e00177a1ad654721bf9207da8a494a0c05e797ad27b992", size = 38097, upload-time = "2025-10-08T19:48:13.923Z" }, + { url = "https://files.pythonhosted.org/packages/99/85/9ff785d787ccf9bbb3f3106f79884a130951436f58392000231b4c737c80/propcache-0.4.1-cp314-cp314t-macosx_10_13_universal2.whl", hash = "sha256:824e908bce90fb2743bd6b59db36eb4f45cd350a39637c9f73b1c1ea66f5b75f", size = 81455, upload-time = "2025-10-08T19:48:15.16Z" }, + { url = "https://files.pythonhosted.org/packages/90/85/2431c10c8e7ddb1445c1f7c4b54d886e8ad20e3c6307e7218f05922cad67/propcache-0.4.1-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:c2b5e7db5328427c57c8e8831abda175421b709672f6cfc3d630c3b7e2146393", size = 46372, upload-time = "2025-10-08T19:48:16.424Z" }, + { url = "https://files.pythonhosted.org/packages/01/20/b0972d902472da9bcb683fa595099911f4d2e86e5683bcc45de60dd05dc3/propcache-0.4.1-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:6f6ff873ed40292cd4969ef5310179afd5db59fdf055897e282485043fc80ad0", size = 48411, upload-time = "2025-10-08T19:48:17.577Z" }, + { url = "https://files.pythonhosted.org/packages/e2/e3/7dc89f4f21e8f99bad3d5ddb3a3389afcf9da4ac69e3deb2dcdc96e74169/propcache-0.4.1-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:49a2dc67c154db2c1463013594c458881a069fcf98940e61a0569016a583020a", size = 275712, upload-time = "2025-10-08T19:48:18.901Z" }, + { url = "https://files.pythonhosted.org/packages/20/67/89800c8352489b21a8047c773067644e3897f02ecbbd610f4d46b7f08612/propcache-0.4.1-cp314-cp314t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:005f08e6a0529984491e37d8dbc3dd86f84bd78a8ceb5fa9a021f4c48d4984be", size = 273557, upload-time = "2025-10-08T19:48:20.762Z" }, + { url = "https://files.pythonhosted.org/packages/e2/a1/b52b055c766a54ce6d9c16d9aca0cad8059acd9637cdf8aa0222f4a026ef/propcache-0.4.1-cp314-cp314t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:5c3310452e0d31390da9035c348633b43d7e7feb2e37be252be6da45abd1abcc", size = 280015, upload-time = "2025-10-08T19:48:22.592Z" }, + { url = "https://files.pythonhosted.org/packages/48/c8/33cee30bd890672c63743049f3c9e4be087e6780906bfc3ec58528be59c1/propcache-0.4.1-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:4c3c70630930447f9ef1caac7728c8ad1c56bc5015338b20fed0d08ea2480b3a", size = 262880, upload-time = "2025-10-08T19:48:23.947Z" }, + { url = "https://files.pythonhosted.org/packages/0c/b1/8f08a143b204b418285c88b83d00edbd61afbc2c6415ffafc8905da7038b/propcache-0.4.1-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:8e57061305815dfc910a3634dcf584f08168a8836e6999983569f51a8544cd89", size = 260938, upload-time = "2025-10-08T19:48:25.656Z" }, + { url = "https://files.pythonhosted.org/packages/cf/12/96e4664c82ca2f31e1c8dff86afb867348979eb78d3cb8546a680287a1e9/propcache-0.4.1-cp314-cp314t-musllinux_1_2_armv7l.whl", hash = "sha256:521a463429ef54143092c11a77e04056dd00636f72e8c45b70aaa3140d639726", size = 247641, upload-time = "2025-10-08T19:48:27.207Z" }, + { url = "https://files.pythonhosted.org/packages/18/ed/e7a9cfca28133386ba52278136d42209d3125db08d0a6395f0cba0c0285c/propcache-0.4.1-cp314-cp314t-musllinux_1_2_ppc64le.whl", hash = "sha256:120c964da3fdc75e3731aa392527136d4ad35868cc556fd09bb6d09172d9a367", size = 262510, upload-time = "2025-10-08T19:48:28.65Z" }, + { url = "https://files.pythonhosted.org/packages/f5/76/16d8bf65e8845dd62b4e2b57444ab81f07f40caa5652b8969b87ddcf2ef6/propcache-0.4.1-cp314-cp314t-musllinux_1_2_s390x.whl", hash = "sha256:d8f353eb14ee3441ee844ade4277d560cdd68288838673273b978e3d6d2c8f36", size = 263161, upload-time = "2025-10-08T19:48:30.133Z" }, + { url = "https://files.pythonhosted.org/packages/e7/70/c99e9edb5d91d5ad8a49fa3c1e8285ba64f1476782fed10ab251ff413ba1/propcache-0.4.1-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:ab2943be7c652f09638800905ee1bab2c544e537edb57d527997a24c13dc1455", size = 257393, upload-time = "2025-10-08T19:48:31.567Z" }, + { url = "https://files.pythonhosted.org/packages/08/02/87b25304249a35c0915d236575bc3574a323f60b47939a2262b77632a3ee/propcache-0.4.1-cp314-cp314t-win32.whl", hash = "sha256:05674a162469f31358c30bcaa8883cb7829fa3110bf9c0991fe27d7896c42d85", size = 42546, upload-time = "2025-10-08T19:48:32.872Z" }, + { url = "https://files.pythonhosted.org/packages/cb/ef/3c6ecf8b317aa982f309835e8f96987466123c6e596646d4e6a1dfcd080f/propcache-0.4.1-cp314-cp314t-win_amd64.whl", hash = "sha256:990f6b3e2a27d683cb7602ed6c86f15ee6b43b1194736f9baaeb93d0016633b1", size = 46259, upload-time = "2025-10-08T19:48:34.226Z" }, + { url = "https://files.pythonhosted.org/packages/c4/2d/346e946d4951f37eca1e4f55be0f0174c52cd70720f84029b02f296f4a38/propcache-0.4.1-cp314-cp314t-win_arm64.whl", hash = "sha256:ecef2343af4cc68e05131e45024ba34f6095821988a9d0a02aa7c73fcc448aa9", size = 40428, upload-time = "2025-10-08T19:48:35.441Z" }, + { url = "https://files.pythonhosted.org/packages/5b/5a/bc7b4a4ef808fa59a816c17b20c4bef6884daebbdf627ff2a161da67da19/propcache-0.4.1-py3-none-any.whl", hash = "sha256:af2a6052aeb6cf17d3e46ee169099044fd8224cbaf75c76a2ef596e8163e2237", size = 13305, upload-time = "2025-10-08T19:49:00.792Z" }, +] + +[[package]] +name = "protobuf" +version = "5.29.6" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/7e/57/394a763c103e0edf87f0938dafcd918d53b4c011dfc5c8ae80f3b0452dbb/protobuf-5.29.6.tar.gz", hash = "sha256:da9ee6a5424b6b30fd5e45c5ea663aef540ca95f9ad99d1e887e819cdf9b8723", size = 425623, upload-time = "2026-02-04T22:54:40.584Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/d4/88/9ee58ff7863c479d6f8346686d4636dd4c415b0cbeed7a6a7d0617639c2a/protobuf-5.29.6-cp310-abi3-win32.whl", hash = "sha256:62e8a3114992c7c647bce37dcc93647575fc52d50e48de30c6fcb28a6a291eb1", size = 423357, upload-time = "2026-02-04T22:54:25.805Z" }, + { url = "https://files.pythonhosted.org/packages/1c/66/2dc736a4d576847134fb6d80bd995c569b13cdc7b815d669050bf0ce2d2c/protobuf-5.29.6-cp310-abi3-win_amd64.whl", hash = "sha256:7e6ad413275be172f67fdee0f43484b6de5a904cc1c3ea9804cb6fe2ff366eda", size = 435175, upload-time = "2026-02-04T22:54:28.592Z" }, + { url = "https://files.pythonhosted.org/packages/06/db/49b05966fd208ae3f44dcd33837b6243b4915c57561d730a43f881f24dea/protobuf-5.29.6-cp38-abi3-macosx_10_9_universal2.whl", hash = "sha256:b5a169e664b4057183a34bdc424540e86eea47560f3c123a0d64de4e137f9269", size = 418619, upload-time = "2026-02-04T22:54:30.266Z" }, + { url = "https://files.pythonhosted.org/packages/b7/d7/48cbf6b0c3c39761e47a99cb483405f0fde2be22cf00d71ef316ce52b458/protobuf-5.29.6-cp38-abi3-manylinux2014_aarch64.whl", hash = "sha256:a8866b2cff111f0f863c1b3b9e7572dc7eaea23a7fae27f6fc613304046483e6", size = 320284, upload-time = "2026-02-04T22:54:31.782Z" }, + { url = "https://files.pythonhosted.org/packages/e3/dd/cadd6ec43069247d91f6345fa7a0d2858bef6af366dbd7ba8f05d2c77d3b/protobuf-5.29.6-cp38-abi3-manylinux2014_x86_64.whl", hash = "sha256:e3387f44798ac1106af0233c04fb8abf543772ff241169946f698b3a9a3d3ab9", size = 320478, upload-time = "2026-02-04T22:54:32.909Z" }, + { url = "https://files.pythonhosted.org/packages/5a/cb/e3065b447186cb70aa65acc70c86baf482d82bf75625bf5a2c4f6919c6a3/protobuf-5.29.6-py3-none-any.whl", hash = "sha256:6b9edb641441b2da9fa8f428760fc136a49cf97a52076010cf22a2ff73438a86", size = 173126, upload-time = "2026-02-04T22:54:39.462Z" }, +] + +[[package]] +name = "pyannote-audio" +version = "4.0.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "asteroid-filterbanks" }, + { name = "einops" }, + { name = "huggingface-hub" }, + { name = "lightning" }, + { name = "matplotlib" }, + { name = "opentelemetry-api" }, + { name = "opentelemetry-exporter-otlp" }, + { name = "opentelemetry-sdk" }, + { name = "pyannote-core" }, + { name = "pyannote-database" }, + { name = "pyannote-metrics" }, + { name = "pyannote-pipeline" }, + { name = "pyannoteai-sdk" }, + { name = "pytorch-metric-learning" }, + { name = "rich" }, + { name = "safetensors" }, + { name = "soundfile" }, + { name = "torch" }, + { name = "torch-audiomentations" }, + { name = "torchaudio" }, + { name = "torchcodec" }, + { name = "torchmetrics" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/d5/57/7b64f1a209efb38df348ffc85c6299128701da30a94176d7063fbba7c2cd/pyannote_audio-4.0.0.tar.gz", hash = "sha256:dcf85de540f67eb5846a956e142808c37e3ce3e7a59e723098198c6cbd49c843", size = 13864108, upload-time = "2025-09-29T12:03:45.57Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/3b/19/f8cd6048f7adbac919c68273a7d7f46a29c975f931bf7f229af0600ba964/pyannote_audio-4.0.0-py3-none-any.whl", hash = "sha256:5a662f5a498aea8133bd05471af0acb229a55640cec476126e56d1e2f1bcecc4", size = 891429, upload-time = "2025-09-29T12:03:43.01Z" }, +] + +[[package]] +name = "pyannote-core" +version = "6.0.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "numpy", version = "2.2.6", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, + { name = "numpy", version = "2.4.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, + { name = "pandas", version = "2.3.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, + { name = "pandas", version = "3.0.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, + { name = "sortedcontainers" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/a3/be/4a35ea31c685aef801f7f35c193e7766ca1bb948ae497a625cbfaa8c31ba/pyannote_core-6.0.1.tar.gz", hash = "sha256:4b4ada3276f6df4e073fa79166636e3597d0dcb5a0fe26014a3477867cc033fb", size = 327540, upload-time = "2025-09-16T09:24:39.081Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ea/57/ecf62344b9b81debd0ca95ed987135e93d1b039507f8174f52d1d19d8c6b/pyannote_core-6.0.1-py3-none-any.whl", hash = "sha256:924550d6ecf6b05ad13bf3f66f59c29fc740cf1c62a6fca860ac2e66908203e5", size = 57505, upload-time = "2025-09-16T09:24:37.798Z" }, +] + +[[package]] +name = "pyannote-database" +version = "6.1.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pandas", version = "2.3.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, + { name = "pandas", version = "3.0.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, + { name = "pyannote-core" }, + { name = "pyyaml" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/65/45/6210274c187cc457e854be8b56c6819fa14376f27e7e2b6021b2aa02449a/pyannote_database-6.1.1.tar.gz", hash = "sha256:bbe76da738257a9e64061123d9694ad7e949c4f171d91a9269606d873528cd10", size = 112225, upload-time = "2025-12-07T06:33:10.296Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/04/bf/6a6f5abaa4d9f803f34c9883ef5e316624eac6be0eaa87720216be9bba12/pyannote_database-6.1.1-py3-none-any.whl", hash = "sha256:36460c70ce9f50ff25c9ea365bc83ad625bb6b2494deccf6bd3fc750686ae684", size = 53735, upload-time = "2025-12-07T06:33:11.578Z" }, +] + +[[package]] +name = "pyannote-metrics" +version = "4.0.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "numpy", version = "2.2.6", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, + { name = "numpy", version = "2.4.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, + { name = "pandas", version = "2.3.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, + { name = "pandas", version = "3.0.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, + { name = "pyannote-core" }, + { name = "pyannote-database" }, + { name = "scikit-learn", version = "1.7.2", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, + { name = "scikit-learn", version = "1.8.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, + { name = "scipy", version = "1.15.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, + { name = "scipy", version = "1.17.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/3a/98/f8962bb2f5826c9798212797b0fa96ff02f81573a2d7cf1f5b678d6c55a2/pyannote_metrics-4.0.0.tar.gz", hash = "sha256:aec037eb7ca4c0ad5c5bbcc19bc04e9acf24ba42c95f025497378e31db6a0ff4", size = 879283, upload-time = "2025-09-09T14:38:27.073Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/b9/d5/637f67578fd704e27ca2edc45c5b0ad6433684916c08cd7fa54d07482407/pyannote_metrics-4.0.0-py3-none-any.whl", hash = "sha256:618dd4c778cb6a92b809c9aa79ee9b93f12dbe3b11e273431b094b10c53c8dd9", size = 49749, upload-time = "2025-09-09T14:38:24.592Z" }, +] + +[[package]] +name = "pyannote-pipeline" +version = "4.0.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "filelock" }, + { name = "optuna" }, + { name = "pyannote-core" }, + { name = "pyannote-database" }, + { name = "pyyaml" }, + { name = "tqdm" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/d2/47/a6a49d82ea640fe320e227247402965ebc3a62a0fb2bfed13f6b17a45025/pyannote_pipeline-4.0.0.tar.gz", hash = "sha256:aa0156f76de132269f4069eca6d884d245e017e2c94f6426c3255ff45dd3c6da", size = 348865, upload-time = "2025-09-09T14:42:53.276Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/d8/83/51290b8a17a3007bc4e4a5ea897f0765f30a6598d58670ba12d35ac0cc36/pyannote_pipeline-4.0.0-py3-none-any.whl", hash = "sha256:6b0bfc19e684d89cc1608bb39448e15ff1231d4a87e99fc7e812e7891b8cd555", size = 22215, upload-time = "2025-09-09T14:42:52.236Z" }, +] + +[[package]] +name = "pyannoteai-sdk" +version = "0.4.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "requests" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/f6/53/3e3f14c1382cf14e1dfeb958c08282c44ac07e6965803608e1b748a38273/pyannoteai_sdk-0.4.0.tar.gz", hash = "sha256:fbdade06eb54347374acf10698b8c9c0bcdb592f8339c90c5a16fa441ea8cf9d", size = 14773, upload-time = "2026-01-14T14:20:19.19Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/f9/8d/16e62133ff748931e923c2d29a150a710c85283f533a4148adc42addb6a8/pyannoteai_sdk-0.4.0-py3-none-any.whl", hash = "sha256:36a0175978e0427f27843d690eb4d1e8ec839009ea540516d6dfcdce749cd883", size = 8886, upload-time = "2026-01-14T14:20:18.407Z" }, +] + +[[package]] +name = "pycparser" +version = "3.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/1b/7d/92392ff7815c21062bea51aa7b87d45576f649f16458d78b7cf94b9ab2e6/pycparser-3.0.tar.gz", hash = "sha256:600f49d217304a5902ac3c37e1281c9fe94e4d0489de643a9504c5cdfdfc6b29", size = 103492, upload-time = "2026-01-21T14:26:51.89Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/0c/c3/44f3fbbfa403ea2a7c779186dc20772604442dde72947e7d01069cbe98e3/pycparser-3.0-py3-none-any.whl", hash = "sha256:b727414169a36b7d524c1c3e31839a521725078d7b2ff038656844266160a992", size = 48172, upload-time = "2026-01-21T14:26:50.693Z" }, +] + +[[package]] +name = "pygments" +version = "2.19.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/b0/77/a5b8c569bf593b0140bde72ea885a803b82086995367bf2037de0159d924/pygments-2.19.2.tar.gz", hash = "sha256:636cb2477cec7f8952536970bc533bc43743542f70392ae026374600add5b887", size = 4968631, upload-time = "2025-06-21T13:39:12.283Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/c7/21/705964c7812476f378728bdf590ca4b771ec72385c533964653c68e86bdc/pygments-2.19.2-py3-none-any.whl", hash = "sha256:86540386c03d588bb81d44bc3928634ff26449851e99741617ecb9037ee5ec0b", size = 1225217, upload-time = "2025-06-21T13:39:07.939Z" }, +] + +[[package]] +name = "pyparsing" +version = "3.3.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/f3/91/9c6ee907786a473bf81c5f53cf703ba0957b23ab84c264080fb5a450416f/pyparsing-3.3.2.tar.gz", hash = "sha256:c777f4d763f140633dcb6d8a3eda953bf7a214dc4eff598413c070bcdc117cbc", size = 6851574, upload-time = "2026-01-21T03:57:59.36Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/10/bd/c038d7cc38edc1aa5bf91ab8068b63d4308c66c4c8bb3cbba7dfbc049f9c/pyparsing-3.3.2-py3-none-any.whl", hash = "sha256:850ba148bd908d7e2411587e247a1e4f0327839c40e2e5e6d05a007ecc69911d", size = 122781, upload-time = "2026-01-21T03:57:55.912Z" }, +] + +[[package]] +name = "pyreadline3" +version = "3.5.4" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/0f/49/4cea918a08f02817aabae639e3d0ac046fef9f9180518a3ad394e22da148/pyreadline3-3.5.4.tar.gz", hash = "sha256:8d57d53039a1c75adba8e50dd3d992b28143480816187ea5efbd5c78e6c885b7", size = 99839, upload-time = "2024-09-19T02:40:10.062Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/5a/dc/491b7661614ab97483abf2056be1deee4dc2490ecbf7bff9ab5cdbac86e1/pyreadline3-3.5.4-py3-none-any.whl", hash = "sha256:eaf8e6cc3c49bcccf145fc6067ba8643d1df34d604a1ec0eccbf7a18e6d3fae6", size = 83178, upload-time = "2024-09-19T02:40:08.598Z" }, +] + +[[package]] +name = "pytest" +version = "9.0.2" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "colorama", marker = "sys_platform == 'win32'" }, + { name = "exceptiongroup", marker = "python_full_version < '3.11'" }, + { name = "iniconfig" }, + { name = "packaging" }, + { name = "pluggy" }, + { name = "pygments" }, + { name = "tomli", marker = "python_full_version < '3.11'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/d1/db/7ef3487e0fb0049ddb5ce41d3a49c235bf9ad299b6a25d5780a89f19230f/pytest-9.0.2.tar.gz", hash = "sha256:75186651a92bd89611d1d9fc20f0b4345fd827c41ccd5c299a868a05d70edf11", size = 1568901, upload-time = "2025-12-06T21:30:51.014Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/3b/ab/b3226f0bd7cdcf710fbede2b3548584366da3b19b5021e74f5bde2a8fa3f/pytest-9.0.2-py3-none-any.whl", hash = "sha256:711ffd45bf766d5264d487b917733b453d917afd2b0ad65223959f59089f875b", size = 374801, upload-time = "2025-12-06T21:30:49.154Z" }, +] + +[[package]] +name = "pytest-cov" +version = "7.0.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "coverage", extra = ["toml"] }, + { name = "pluggy" }, + { name = "pytest" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/5e/f7/c933acc76f5208b3b00089573cf6a2bc26dc80a8aece8f52bb7d6b1855ca/pytest_cov-7.0.0.tar.gz", hash = "sha256:33c97eda2e049a0c5298e91f519302a1334c26ac65c1a483d6206fd458361af1", size = 54328, upload-time = "2025-09-09T10:57:02.113Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ee/49/1377b49de7d0c1ce41292161ea0f721913fa8722c19fb9c1e3aa0367eecb/pytest_cov-7.0.0-py3-none-any.whl", hash = "sha256:3b8e9558b16cc1479da72058bdecf8073661c7f57f7d3c5f22a1c23507f2d861", size = 22424, upload-time = "2025-09-09T10:57:00.695Z" }, +] + +[[package]] +name = "python-dateutil" +version = "2.9.0.post0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "six" }, +] +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" } +wheels = [ + { 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" }, +] + +[[package]] +name = "pytorch-lightning" +version = "2.6.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "fsspec", extra = ["http"] }, + { name = "lightning-utilities" }, + { name = "packaging" }, + { name = "pyyaml" }, + { name = "torch" }, + { name = "torchmetrics" }, + { name = "tqdm" }, + { name = "typing-extensions" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/8b/ac/ebd5f6f58691cbd4f73836e43e1727f3814311b960c41f88e259606ca2b2/pytorch_lightning-2.6.1.tar.gz", hash = "sha256:ba08f8901cf226fcca473046ad9346f414e99117762dc869c76e650d5b3d7bdc", size = 665563, upload-time = "2026-01-30T14:59:11.636Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/0e/93/c8c361bf0a2fe50f828f32def460e8b8a14b93955d3fd302b1a9b63b19e4/pytorch_lightning-2.6.1-py3-none-any.whl", hash = "sha256:1f8118567ec829e3055f16cf1aa320883a86a47c836951bfd9dcfa34ec7ffd59", size = 857273, upload-time = "2026-01-30T14:59:10.141Z" }, +] + +[[package]] +name = "pytorch-metric-learning" +version = "2.9.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "numpy", version = "2.2.6", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, + { name = "numpy", version = "2.4.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, + { name = "scikit-learn", version = "1.7.2", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, + { name = "scikit-learn", version = "1.8.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, + { name = "torch" }, + { name = "tqdm" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/9b/80/6e61b1a91debf4c1b47d441f9a9d7fe2aabcdd9575ed70b2811474eb95c3/pytorch-metric-learning-2.9.0.tar.gz", hash = "sha256:27a626caf5e2876a0fd666605a78cb67ef7597e25d7a68c18053dd503830701f", size = 84530, upload-time = "2025-08-17T17:11:19.501Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/46/7d/73ef5052f57b7720cad00e16598db3592a5ef4826745ffca67a2f085d4dc/pytorch_metric_learning-2.9.0-py3-none-any.whl", hash = "sha256:d51646006dc87168f00cf954785db133a4c5aac81253877248737aa42ef6432a", size = 127801, upload-time = "2025-08-17T17:11:18.185Z" }, +] + +[[package]] +name = "pytz" +version = "2026.1.post1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/56/db/b8721d71d945e6a8ac63c0fc900b2067181dbb50805958d4d4661cf7d277/pytz-2026.1.post1.tar.gz", hash = "sha256:3378dde6a0c3d26719182142c56e60c7f9af7e968076f31aae569d72a0358ee1", size = 321088, upload-time = "2026-03-03T07:47:50.683Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/10/99/781fe0c827be2742bcc775efefccb3b048a3a9c6ce9aec0cbf4a101677e5/pytz-2026.1.post1-py2.py3-none-any.whl", hash = "sha256:f2fd16142fda348286a75e1a524be810bb05d444e5a081f37f7affc635035f7a", size = 510489, upload-time = "2026-03-03T07:47:49.167Z" }, +] + +[[package]] +name = "pyyaml" +version = "6.0.3" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/05/8e/961c0007c59b8dd7729d542c61a4d537767a59645b82a0b521206e1e25c2/pyyaml-6.0.3.tar.gz", hash = "sha256:d76623373421df22fb4cf8817020cbb7ef15c725b9d5e45f17e189bfc384190f", size = 130960, upload-time = "2025-09-25T21:33:16.546Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/f4/a0/39350dd17dd6d6c6507025c0e53aef67a9293a6d37d3511f23ea510d5800/pyyaml-6.0.3-cp310-cp310-macosx_10_13_x86_64.whl", hash = "sha256:214ed4befebe12df36bcc8bc2b64b396ca31be9304b8f59e25c11cf94a4c033b", size = 184227, upload-time = "2025-09-25T21:31:46.04Z" }, + { url = "https://files.pythonhosted.org/packages/05/14/52d505b5c59ce73244f59c7a50ecf47093ce4765f116cdb98286a71eeca2/pyyaml-6.0.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:02ea2dfa234451bbb8772601d7b8e426c2bfa197136796224e50e35a78777956", size = 174019, upload-time = "2025-09-25T21:31:47.706Z" }, + { url = "https://files.pythonhosted.org/packages/43/f7/0e6a5ae5599c838c696adb4e6330a59f463265bfa1e116cfd1fbb0abaaae/pyyaml-6.0.3-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b30236e45cf30d2b8e7b3e85881719e98507abed1011bf463a8fa23e9c3e98a8", size = 740646, upload-time = "2025-09-25T21:31:49.21Z" }, + { url = "https://files.pythonhosted.org/packages/2f/3a/61b9db1d28f00f8fd0ae760459a5c4bf1b941baf714e207b6eb0657d2578/pyyaml-6.0.3-cp310-cp310-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:66291b10affd76d76f54fad28e22e51719ef9ba22b29e1d7d03d6777a9174198", size = 840793, upload-time = "2025-09-25T21:31:50.735Z" }, + { url = "https://files.pythonhosted.org/packages/7a/1e/7acc4f0e74c4b3d9531e24739e0ab832a5edf40e64fbae1a9c01941cabd7/pyyaml-6.0.3-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:9c7708761fccb9397fe64bbc0395abcae8c4bf7b0eac081e12b809bf47700d0b", size = 770293, upload-time = "2025-09-25T21:31:51.828Z" }, + { url = "https://files.pythonhosted.org/packages/8b/ef/abd085f06853af0cd59fa5f913d61a8eab65d7639ff2a658d18a25d6a89d/pyyaml-6.0.3-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:418cf3f2111bc80e0933b2cd8cd04f286338bb88bdc7bc8e6dd775ebde60b5e0", size = 732872, upload-time = "2025-09-25T21:31:53.282Z" }, + { url = "https://files.pythonhosted.org/packages/1f/15/2bc9c8faf6450a8b3c9fc5448ed869c599c0a74ba2669772b1f3a0040180/pyyaml-6.0.3-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:5e0b74767e5f8c593e8c9b5912019159ed0533c70051e9cce3e8b6aa699fcd69", size = 758828, upload-time = "2025-09-25T21:31:54.807Z" }, + { url = "https://files.pythonhosted.org/packages/a3/00/531e92e88c00f4333ce359e50c19b8d1de9fe8d581b1534e35ccfbc5f393/pyyaml-6.0.3-cp310-cp310-win32.whl", hash = "sha256:28c8d926f98f432f88adc23edf2e6d4921ac26fb084b028c733d01868d19007e", size = 142415, upload-time = "2025-09-25T21:31:55.885Z" }, + { url = "https://files.pythonhosted.org/packages/2a/fa/926c003379b19fca39dd4634818b00dec6c62d87faf628d1394e137354d4/pyyaml-6.0.3-cp310-cp310-win_amd64.whl", hash = "sha256:bdb2c67c6c1390b63c6ff89f210c8fd09d9a1217a465701eac7316313c915e4c", size = 158561, upload-time = "2025-09-25T21:31:57.406Z" }, + { url = "https://files.pythonhosted.org/packages/6d/16/a95b6757765b7b031c9374925bb718d55e0a9ba8a1b6a12d25962ea44347/pyyaml-6.0.3-cp311-cp311-macosx_10_13_x86_64.whl", hash = "sha256:44edc647873928551a01e7a563d7452ccdebee747728c1080d881d68af7b997e", size = 185826, upload-time = "2025-09-25T21:31:58.655Z" }, + { url = "https://files.pythonhosted.org/packages/16/19/13de8e4377ed53079ee996e1ab0a9c33ec2faf808a4647b7b4c0d46dd239/pyyaml-6.0.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:652cb6edd41e718550aad172851962662ff2681490a8a711af6a4d288dd96824", size = 175577, upload-time = "2025-09-25T21:32:00.088Z" }, + { url = "https://files.pythonhosted.org/packages/0c/62/d2eb46264d4b157dae1275b573017abec435397aa59cbcdab6fc978a8af4/pyyaml-6.0.3-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:10892704fc220243f5305762e276552a0395f7beb4dbf9b14ec8fd43b57f126c", size = 775556, upload-time = "2025-09-25T21:32:01.31Z" }, + { url = "https://files.pythonhosted.org/packages/10/cb/16c3f2cf3266edd25aaa00d6c4350381c8b012ed6f5276675b9eba8d9ff4/pyyaml-6.0.3-cp311-cp311-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:850774a7879607d3a6f50d36d04f00ee69e7fc816450e5f7e58d7f17f1ae5c00", size = 882114, upload-time = "2025-09-25T21:32:03.376Z" }, + { url = "https://files.pythonhosted.org/packages/71/60/917329f640924b18ff085ab889a11c763e0b573da888e8404ff486657602/pyyaml-6.0.3-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:b8bb0864c5a28024fac8a632c443c87c5aa6f215c0b126c449ae1a150412f31d", size = 806638, upload-time = "2025-09-25T21:32:04.553Z" }, + { url = "https://files.pythonhosted.org/packages/dd/6f/529b0f316a9fd167281a6c3826b5583e6192dba792dd55e3203d3f8e655a/pyyaml-6.0.3-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:1d37d57ad971609cf3c53ba6a7e365e40660e3be0e5175fa9f2365a379d6095a", size = 767463, upload-time = "2025-09-25T21:32:06.152Z" }, + { url = "https://files.pythonhosted.org/packages/f2/6a/b627b4e0c1dd03718543519ffb2f1deea4a1e6d42fbab8021936a4d22589/pyyaml-6.0.3-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:37503bfbfc9d2c40b344d06b2199cf0e96e97957ab1c1b546fd4f87e53e5d3e4", size = 794986, upload-time = "2025-09-25T21:32:07.367Z" }, + { url = "https://files.pythonhosted.org/packages/45/91/47a6e1c42d9ee337c4839208f30d9f09caa9f720ec7582917b264defc875/pyyaml-6.0.3-cp311-cp311-win32.whl", hash = "sha256:8098f252adfa6c80ab48096053f512f2321f0b998f98150cea9bd23d83e1467b", size = 142543, upload-time = "2025-09-25T21:32:08.95Z" }, + { url = "https://files.pythonhosted.org/packages/da/e3/ea007450a105ae919a72393cb06f122f288ef60bba2dc64b26e2646fa315/pyyaml-6.0.3-cp311-cp311-win_amd64.whl", hash = "sha256:9f3bfb4965eb874431221a3ff3fdcddc7e74e3b07799e0e84ca4a0f867d449bf", size = 158763, upload-time = "2025-09-25T21:32:09.96Z" }, + { url = "https://files.pythonhosted.org/packages/d1/33/422b98d2195232ca1826284a76852ad5a86fe23e31b009c9886b2d0fb8b2/pyyaml-6.0.3-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:7f047e29dcae44602496db43be01ad42fc6f1cc0d8cd6c83d342306c32270196", size = 182063, upload-time = "2025-09-25T21:32:11.445Z" }, + { url = "https://files.pythonhosted.org/packages/89/a0/6cf41a19a1f2f3feab0e9c0b74134aa2ce6849093d5517a0c550fe37a648/pyyaml-6.0.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:fc09d0aa354569bc501d4e787133afc08552722d3ab34836a80547331bb5d4a0", size = 173973, upload-time = "2025-09-25T21:32:12.492Z" }, + { url = "https://files.pythonhosted.org/packages/ed/23/7a778b6bd0b9a8039df8b1b1d80e2e2ad78aa04171592c8a5c43a56a6af4/pyyaml-6.0.3-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:9149cad251584d5fb4981be1ecde53a1ca46c891a79788c0df828d2f166bda28", size = 775116, upload-time = "2025-09-25T21:32:13.652Z" }, + { url = "https://files.pythonhosted.org/packages/65/30/d7353c338e12baef4ecc1b09e877c1970bd3382789c159b4f89d6a70dc09/pyyaml-6.0.3-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:5fdec68f91a0c6739b380c83b951e2c72ac0197ace422360e6d5a959d8d97b2c", size = 844011, upload-time = "2025-09-25T21:32:15.21Z" }, + { url = "https://files.pythonhosted.org/packages/8b/9d/b3589d3877982d4f2329302ef98a8026e7f4443c765c46cfecc8858c6b4b/pyyaml-6.0.3-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:ba1cc08a7ccde2d2ec775841541641e4548226580ab850948cbfda66a1befcdc", size = 807870, upload-time = "2025-09-25T21:32:16.431Z" }, + { url = "https://files.pythonhosted.org/packages/05/c0/b3be26a015601b822b97d9149ff8cb5ead58c66f981e04fedf4e762f4bd4/pyyaml-6.0.3-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:8dc52c23056b9ddd46818a57b78404882310fb473d63f17b07d5c40421e47f8e", size = 761089, upload-time = "2025-09-25T21:32:17.56Z" }, + { url = "https://files.pythonhosted.org/packages/be/8e/98435a21d1d4b46590d5459a22d88128103f8da4c2d4cb8f14f2a96504e1/pyyaml-6.0.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:41715c910c881bc081f1e8872880d3c650acf13dfa8214bad49ed4cede7c34ea", size = 790181, upload-time = "2025-09-25T21:32:18.834Z" }, + { url = "https://files.pythonhosted.org/packages/74/93/7baea19427dcfbe1e5a372d81473250b379f04b1bd3c4c5ff825e2327202/pyyaml-6.0.3-cp312-cp312-win32.whl", hash = "sha256:96b533f0e99f6579b3d4d4995707cf36df9100d67e0c8303a0c55b27b5f99bc5", size = 137658, upload-time = "2025-09-25T21:32:20.209Z" }, + { url = "https://files.pythonhosted.org/packages/86/bf/899e81e4cce32febab4fb42bb97dcdf66bc135272882d1987881a4b519e9/pyyaml-6.0.3-cp312-cp312-win_amd64.whl", hash = "sha256:5fcd34e47f6e0b794d17de1b4ff496c00986e1c83f7ab2fb8fcfe9616ff7477b", size = 154003, upload-time = "2025-09-25T21:32:21.167Z" }, + { url = "https://files.pythonhosted.org/packages/1a/08/67bd04656199bbb51dbed1439b7f27601dfb576fb864099c7ef0c3e55531/pyyaml-6.0.3-cp312-cp312-win_arm64.whl", hash = "sha256:64386e5e707d03a7e172c0701abfb7e10f0fb753ee1d773128192742712a98fd", size = 140344, upload-time = "2025-09-25T21:32:22.617Z" }, + { url = "https://files.pythonhosted.org/packages/d1/11/0fd08f8192109f7169db964b5707a2f1e8b745d4e239b784a5a1dd80d1db/pyyaml-6.0.3-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:8da9669d359f02c0b91ccc01cac4a67f16afec0dac22c2ad09f46bee0697eba8", size = 181669, upload-time = "2025-09-25T21:32:23.673Z" }, + { url = "https://files.pythonhosted.org/packages/b1/16/95309993f1d3748cd644e02e38b75d50cbc0d9561d21f390a76242ce073f/pyyaml-6.0.3-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:2283a07e2c21a2aa78d9c4442724ec1eb15f5e42a723b99cb3d822d48f5f7ad1", size = 173252, upload-time = "2025-09-25T21:32:25.149Z" }, + { url = "https://files.pythonhosted.org/packages/50/31/b20f376d3f810b9b2371e72ef5adb33879b25edb7a6d072cb7ca0c486398/pyyaml-6.0.3-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ee2922902c45ae8ccada2c5b501ab86c36525b883eff4255313a253a3160861c", size = 767081, upload-time = "2025-09-25T21:32:26.575Z" }, + { url = "https://files.pythonhosted.org/packages/49/1e/a55ca81e949270d5d4432fbbd19dfea5321eda7c41a849d443dc92fd1ff7/pyyaml-6.0.3-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:a33284e20b78bd4a18c8c2282d549d10bc8408a2a7ff57653c0cf0b9be0afce5", size = 841159, upload-time = "2025-09-25T21:32:27.727Z" }, + { url = "https://files.pythonhosted.org/packages/74/27/e5b8f34d02d9995b80abcef563ea1f8b56d20134d8f4e5e81733b1feceb2/pyyaml-6.0.3-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:0f29edc409a6392443abf94b9cf89ce99889a1dd5376d94316ae5145dfedd5d6", size = 801626, upload-time = "2025-09-25T21:32:28.878Z" }, + { url = "https://files.pythonhosted.org/packages/f9/11/ba845c23988798f40e52ba45f34849aa8a1f2d4af4b798588010792ebad6/pyyaml-6.0.3-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:f7057c9a337546edc7973c0d3ba84ddcdf0daa14533c2065749c9075001090e6", size = 753613, upload-time = "2025-09-25T21:32:30.178Z" }, + { url = "https://files.pythonhosted.org/packages/3d/e0/7966e1a7bfc0a45bf0a7fb6b98ea03fc9b8d84fa7f2229e9659680b69ee3/pyyaml-6.0.3-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:eda16858a3cab07b80edaf74336ece1f986ba330fdb8ee0d6c0d68fe82bc96be", size = 794115, upload-time = "2025-09-25T21:32:31.353Z" }, + { url = "https://files.pythonhosted.org/packages/de/94/980b50a6531b3019e45ddeada0626d45fa85cbe22300844a7983285bed3b/pyyaml-6.0.3-cp313-cp313-win32.whl", hash = "sha256:d0eae10f8159e8fdad514efdc92d74fd8d682c933a6dd088030f3834bc8e6b26", size = 137427, upload-time = "2025-09-25T21:32:32.58Z" }, + { url = "https://files.pythonhosted.org/packages/97/c9/39d5b874e8b28845e4ec2202b5da735d0199dbe5b8fb85f91398814a9a46/pyyaml-6.0.3-cp313-cp313-win_amd64.whl", hash = "sha256:79005a0d97d5ddabfeeea4cf676af11e647e41d81c9a7722a193022accdb6b7c", size = 154090, upload-time = "2025-09-25T21:32:33.659Z" }, + { url = "https://files.pythonhosted.org/packages/73/e8/2bdf3ca2090f68bb3d75b44da7bbc71843b19c9f2b9cb9b0f4ab7a5a4329/pyyaml-6.0.3-cp313-cp313-win_arm64.whl", hash = "sha256:5498cd1645aa724a7c71c8f378eb29ebe23da2fc0d7a08071d89469bf1d2defb", size = 140246, upload-time = "2025-09-25T21:32:34.663Z" }, + { url = "https://files.pythonhosted.org/packages/9d/8c/f4bd7f6465179953d3ac9bc44ac1a8a3e6122cf8ada906b4f96c60172d43/pyyaml-6.0.3-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:8d1fab6bb153a416f9aeb4b8763bc0f22a5586065f86f7664fc23339fc1c1fac", size = 181814, upload-time = "2025-09-25T21:32:35.712Z" }, + { url = "https://files.pythonhosted.org/packages/bd/9c/4d95bb87eb2063d20db7b60faa3840c1b18025517ae857371c4dd55a6b3a/pyyaml-6.0.3-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:34d5fcd24b8445fadc33f9cf348c1047101756fd760b4dacb5c3e99755703310", size = 173809, upload-time = "2025-09-25T21:32:36.789Z" }, + { url = "https://files.pythonhosted.org/packages/92/b5/47e807c2623074914e29dabd16cbbdd4bf5e9b2db9f8090fa64411fc5382/pyyaml-6.0.3-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:501a031947e3a9025ed4405a168e6ef5ae3126c59f90ce0cd6f2bfc477be31b7", size = 766454, upload-time = "2025-09-25T21:32:37.966Z" }, + { url = "https://files.pythonhosted.org/packages/02/9e/e5e9b168be58564121efb3de6859c452fccde0ab093d8438905899a3a483/pyyaml-6.0.3-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:b3bc83488de33889877a0f2543ade9f70c67d66d9ebb4ac959502e12de895788", size = 836355, upload-time = "2025-09-25T21:32:39.178Z" }, + { url = "https://files.pythonhosted.org/packages/88/f9/16491d7ed2a919954993e48aa941b200f38040928474c9e85ea9e64222c3/pyyaml-6.0.3-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:c458b6d084f9b935061bc36216e8a69a7e293a2f1e68bf956dcd9e6cbcd143f5", size = 794175, upload-time = "2025-09-25T21:32:40.865Z" }, + { url = "https://files.pythonhosted.org/packages/dd/3f/5989debef34dc6397317802b527dbbafb2b4760878a53d4166579111411e/pyyaml-6.0.3-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:7c6610def4f163542a622a73fb39f534f8c101d690126992300bf3207eab9764", size = 755228, upload-time = "2025-09-25T21:32:42.084Z" }, + { url = "https://files.pythonhosted.org/packages/d7/ce/af88a49043cd2e265be63d083fc75b27b6ed062f5f9fd6cdc223ad62f03e/pyyaml-6.0.3-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:5190d403f121660ce8d1d2c1bb2ef1bd05b5f68533fc5c2ea899bd15f4399b35", size = 789194, upload-time = "2025-09-25T21:32:43.362Z" }, + { url = "https://files.pythonhosted.org/packages/23/20/bb6982b26a40bb43951265ba29d4c246ef0ff59c9fdcdf0ed04e0687de4d/pyyaml-6.0.3-cp314-cp314-win_amd64.whl", hash = "sha256:4a2e8cebe2ff6ab7d1050ecd59c25d4c8bd7e6f400f5f82b96557ac0abafd0ac", size = 156429, upload-time = "2025-09-25T21:32:57.844Z" }, + { url = "https://files.pythonhosted.org/packages/f4/f4/a4541072bb9422c8a883ab55255f918fa378ecf083f5b85e87fc2b4eda1b/pyyaml-6.0.3-cp314-cp314-win_arm64.whl", hash = "sha256:93dda82c9c22deb0a405ea4dc5f2d0cda384168e466364dec6255b293923b2f3", size = 143912, upload-time = "2025-09-25T21:32:59.247Z" }, + { url = "https://files.pythonhosted.org/packages/7c/f9/07dd09ae774e4616edf6cda684ee78f97777bdd15847253637a6f052a62f/pyyaml-6.0.3-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:02893d100e99e03eda1c8fd5c441d8c60103fd175728e23e431db1b589cf5ab3", size = 189108, upload-time = "2025-09-25T21:32:44.377Z" }, + { url = "https://files.pythonhosted.org/packages/4e/78/8d08c9fb7ce09ad8c38ad533c1191cf27f7ae1effe5bb9400a46d9437fcf/pyyaml-6.0.3-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:c1ff362665ae507275af2853520967820d9124984e0f7466736aea23d8611fba", size = 183641, upload-time = "2025-09-25T21:32:45.407Z" }, + { url = "https://files.pythonhosted.org/packages/7b/5b/3babb19104a46945cf816d047db2788bcaf8c94527a805610b0289a01c6b/pyyaml-6.0.3-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6adc77889b628398debc7b65c073bcb99c4a0237b248cacaf3fe8a557563ef6c", size = 831901, upload-time = "2025-09-25T21:32:48.83Z" }, + { url = "https://files.pythonhosted.org/packages/8b/cc/dff0684d8dc44da4d22a13f35f073d558c268780ce3c6ba1b87055bb0b87/pyyaml-6.0.3-cp314-cp314t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:a80cb027f6b349846a3bf6d73b5e95e782175e52f22108cfa17876aaeff93702", size = 861132, upload-time = "2025-09-25T21:32:50.149Z" }, + { url = "https://files.pythonhosted.org/packages/b1/5e/f77dc6b9036943e285ba76b49e118d9ea929885becb0a29ba8a7c75e29fe/pyyaml-6.0.3-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:00c4bdeba853cc34e7dd471f16b4114f4162dc03e6b7afcc2128711f0eca823c", size = 839261, upload-time = "2025-09-25T21:32:51.808Z" }, + { url = "https://files.pythonhosted.org/packages/ce/88/a9db1376aa2a228197c58b37302f284b5617f56a5d959fd1763fb1675ce6/pyyaml-6.0.3-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:66e1674c3ef6f541c35191caae2d429b967b99e02040f5ba928632d9a7f0f065", size = 805272, upload-time = "2025-09-25T21:32:52.941Z" }, + { url = "https://files.pythonhosted.org/packages/da/92/1446574745d74df0c92e6aa4a7b0b3130706a4142b2d1a5869f2eaa423c6/pyyaml-6.0.3-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:16249ee61e95f858e83976573de0f5b2893b3677ba71c9dd36b9cf8be9ac6d65", size = 829923, upload-time = "2025-09-25T21:32:54.537Z" }, + { url = "https://files.pythonhosted.org/packages/f0/7a/1c7270340330e575b92f397352af856a8c06f230aa3e76f86b39d01b416a/pyyaml-6.0.3-cp314-cp314t-win_amd64.whl", hash = "sha256:4ad1906908f2f5ae4e5a8ddfce73c320c2a1429ec52eafd27138b7f1cbe341c9", size = 174062, upload-time = "2025-09-25T21:32:55.767Z" }, + { url = "https://files.pythonhosted.org/packages/f1/12/de94a39c2ef588c7e6455cfbe7343d3b2dc9d6b6b2f40c4c6565744c873d/pyyaml-6.0.3-cp314-cp314t-win_arm64.whl", hash = "sha256:ebc55a14a21cb14062aa4162f906cd962b28e2e9ea38f9b4391244cd8de4ae0b", size = 149341, upload-time = "2025-09-25T21:32:56.828Z" }, +] + +[[package]] +name = "requests" +version = "2.32.5" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "certifi" }, + { name = "charset-normalizer" }, + { name = "idna" }, + { name = "urllib3" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/c9/74/b3ff8e6c8446842c3f5c837e9c3dfcfe2018ea6ecef224c710c85ef728f4/requests-2.32.5.tar.gz", hash = "sha256:dbba0bac56e100853db0ea71b82b4dfd5fe2bf6d3754a8893c3af500cec7d7cf", size = 134517, upload-time = "2025-08-18T20:46:02.573Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/1e/db/4254e3eabe8020b458f1a747140d32277ec7a271daf1d235b70dc0b4e6e3/requests-2.32.5-py3-none-any.whl", hash = "sha256:2462f94637a34fd532264295e186976db0f5d453d1cdd31473c85a6a161affb6", size = 64738, upload-time = "2025-08-18T20:46:00.542Z" }, +] + +[[package]] +name = "rich" +version = "14.3.3" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "markdown-it-py" }, + { name = "pygments" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/b3/c6/f3b320c27991c46f43ee9d856302c70dc2d0fb2dba4842ff739d5f46b393/rich-14.3.3.tar.gz", hash = "sha256:b8daa0b9e4eef54dd8cf7c86c03713f53241884e814f4e2f5fb342fe520f639b", size = 230582, upload-time = "2026-02-19T17:23:12.474Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/14/25/b208c5683343959b670dc001595f2f3737e051da617f66c31f7c4fa93abc/rich-14.3.3-py3-none-any.whl", hash = "sha256:793431c1f8619afa7d3b52b2cdec859562b950ea0d4b6b505397612db8d5362d", size = 310458, upload-time = "2026-02-19T17:23:13.732Z" }, +] + +[[package]] +name = "safetensors" +version = "0.7.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/29/9c/6e74567782559a63bd040a236edca26fd71bc7ba88de2ef35d75df3bca5e/safetensors-0.7.0.tar.gz", hash = "sha256:07663963b67e8bd9f0b8ad15bb9163606cd27cc5a1b96235a50d8369803b96b0", size = 200878, upload-time = "2025-11-19T15:18:43.199Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/fa/47/aef6c06649039accf914afef490268e1067ed82be62bcfa5b7e886ad15e8/safetensors-0.7.0-cp38-abi3-macosx_10_12_x86_64.whl", hash = "sha256:c82f4d474cf725255d9e6acf17252991c3c8aac038d6ef363a4bf8be2f6db517", size = 467781, upload-time = "2025-11-19T15:18:35.84Z" }, + { url = "https://files.pythonhosted.org/packages/e8/00/374c0c068e30cd31f1e1b46b4b5738168ec79e7689ca82ee93ddfea05109/safetensors-0.7.0-cp38-abi3-macosx_11_0_arm64.whl", hash = "sha256:94fd4858284736bb67a897a41608b5b0c2496c9bdb3bf2af1fa3409127f20d57", size = 447058, upload-time = "2025-11-19T15:18:34.416Z" }, + { url = "https://files.pythonhosted.org/packages/f1/06/578ffed52c2296f93d7fd2d844cabfa92be51a587c38c8afbb8ae449ca89/safetensors-0.7.0-cp38-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e07d91d0c92a31200f25351f4acb2bc6aff7f48094e13ebb1d0fb995b54b6542", size = 491748, upload-time = "2025-11-19T15:18:09.79Z" }, + { url = "https://files.pythonhosted.org/packages/ae/33/1debbbb70e4791dde185edb9413d1fe01619255abb64b300157d7f15dddd/safetensors-0.7.0-cp38-abi3-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:8469155f4cb518bafb4acf4865e8bb9d6804110d2d9bdcaa78564b9fd841e104", size = 503881, upload-time = "2025-11-19T15:18:16.145Z" }, + { url = "https://files.pythonhosted.org/packages/8e/1c/40c2ca924d60792c3be509833df711b553c60effbd91da6f5284a83f7122/safetensors-0.7.0-cp38-abi3-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:54bef08bf00a2bff599982f6b08e8770e09cc012d7bba00783fc7ea38f1fb37d", size = 623463, upload-time = "2025-11-19T15:18:21.11Z" }, + { url = "https://files.pythonhosted.org/packages/9b/3a/13784a9364bd43b0d61eef4bea2845039bc2030458b16594a1bd787ae26e/safetensors-0.7.0-cp38-abi3-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:42cb091236206bb2016d245c377ed383aa7f78691748f3bb6ee1bfa51ae2ce6a", size = 532855, upload-time = "2025-11-19T15:18:25.719Z" }, + { url = "https://files.pythonhosted.org/packages/a0/60/429e9b1cb3fc651937727befe258ea24122d9663e4d5709a48c9cbfceecb/safetensors-0.7.0-cp38-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dac7252938f0696ddea46f5e855dd3138444e82236e3be475f54929f0c510d48", size = 507152, upload-time = "2025-11-19T15:18:33.023Z" }, + { url = "https://files.pythonhosted.org/packages/3c/a8/4b45e4e059270d17af60359713ffd83f97900d45a6afa73aaa0d737d48b6/safetensors-0.7.0-cp38-abi3-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:1d060c70284127fa805085d8f10fbd0962792aed71879d00864acda69dbab981", size = 541856, upload-time = "2025-11-19T15:18:31.075Z" }, + { url = "https://files.pythonhosted.org/packages/06/87/d26d8407c44175d8ae164a95b5a62707fcc445f3c0c56108e37d98070a3d/safetensors-0.7.0-cp38-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:cdab83a366799fa730f90a4ebb563e494f28e9e92c4819e556152ad55e43591b", size = 674060, upload-time = "2025-11-19T15:18:37.211Z" }, + { url = "https://files.pythonhosted.org/packages/11/f5/57644a2ff08dc6325816ba7217e5095f17269dada2554b658442c66aed51/safetensors-0.7.0-cp38-abi3-musllinux_1_2_armv7l.whl", hash = "sha256:672132907fcad9f2aedcb705b2d7b3b93354a2aec1b2f706c4db852abe338f85", size = 771715, upload-time = "2025-11-19T15:18:38.689Z" }, + { url = "https://files.pythonhosted.org/packages/86/31/17883e13a814bd278ae6e266b13282a01049b0c81341da7fd0e3e71a80a3/safetensors-0.7.0-cp38-abi3-musllinux_1_2_i686.whl", hash = "sha256:5d72abdb8a4d56d4020713724ba81dac065fedb7f3667151c4a637f1d3fb26c0", size = 714377, upload-time = "2025-11-19T15:18:40.162Z" }, + { url = "https://files.pythonhosted.org/packages/4a/d8/0c8a7dc9b41dcac53c4cbf9df2b9c83e0e0097203de8b37a712b345c0be5/safetensors-0.7.0-cp38-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:b0f6d66c1c538d5a94a73aa9ddca8ccc4227e6c9ff555322ea40bdd142391dd4", size = 677368, upload-time = "2025-11-19T15:18:41.627Z" }, + { url = "https://files.pythonhosted.org/packages/05/e5/cb4b713c8a93469e3c5be7c3f8d77d307e65fe89673e731f5c2bfd0a9237/safetensors-0.7.0-cp38-abi3-win32.whl", hash = "sha256:c74af94bf3ac15ac4d0f2a7c7b4663a15f8c2ab15ed0fc7531ca61d0835eccba", size = 326423, upload-time = "2025-11-19T15:18:45.74Z" }, + { url = "https://files.pythonhosted.org/packages/5d/e6/ec8471c8072382cb91233ba7267fd931219753bb43814cbc71757bfd4dab/safetensors-0.7.0-cp38-abi3-win_amd64.whl", hash = "sha256:d1239932053f56f3456f32eb9625590cc7582e905021f94636202a864d470755", size = 341380, upload-time = "2025-11-19T15:18:44.427Z" }, + { url = "https://files.pythonhosted.org/packages/a7/6a/4d08d89a6fcbe905c5ae68b8b34f0791850882fc19782d0d02c65abbdf3b/safetensors-0.7.0-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f4729811a6640d019a4b7ba8638ee2fd21fa5ca8c7e7bdf0fed62068fcaac737", size = 492430, upload-time = "2025-11-19T15:18:11.884Z" }, + { url = "https://files.pythonhosted.org/packages/dd/29/59ed8152b30f72c42d00d241e58eaca558ae9dbfa5695206e2e0f54c7063/safetensors-0.7.0-pp310-pypy310_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:12f49080303fa6bb424b362149a12949dfbbf1e06811a88f2307276b0c131afd", size = 503977, upload-time = "2025-11-19T15:18:17.523Z" }, + { url = "https://files.pythonhosted.org/packages/d3/0b/4811bfec67fa260e791369b16dab105e4bae82686120554cc484064e22b4/safetensors-0.7.0-pp310-pypy310_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:0071bffba4150c2f46cae1432d31995d77acfd9f8db598b5d1a2ce67e8440ad2", size = 623890, upload-time = "2025-11-19T15:18:22.666Z" }, + { url = "https://files.pythonhosted.org/packages/58/5b/632a58724221ef03d78ab65062e82a1010e1bef8e8e0b9d7c6d7b8044841/safetensors-0.7.0-pp310-pypy310_pp73-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:473b32699f4200e69801bf5abf93f1a4ecd432a70984df164fc22ccf39c4a6f3", size = 531885, upload-time = "2025-11-19T15:18:27.146Z" }, +] + +[[package]] +name = "scikit-learn" +version = "1.7.2" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version < '3.11'", +] +dependencies = [ + { name = "joblib", marker = "python_full_version < '3.11'" }, + { name = "numpy", version = "2.2.6", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, + { name = "scipy", version = "1.15.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, + { name = "threadpoolctl", marker = "python_full_version < '3.11'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/98/c2/a7855e41c9d285dfe86dc50b250978105dce513d6e459ea66a6aeb0e1e0c/scikit_learn-1.7.2.tar.gz", hash = "sha256:20e9e49ecd130598f1ca38a1d85090e1a600147b9c02fa6f15d69cb53d968fda", size = 7193136, upload-time = "2025-09-09T08:21:29.075Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ba/3e/daed796fd69cce768b8788401cc464ea90b306fb196ae1ffed0b98182859/scikit_learn-1.7.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:6b33579c10a3081d076ab403df4a4190da4f4432d443521674637677dc91e61f", size = 9336221, upload-time = "2025-09-09T08:20:19.328Z" }, + { url = "https://files.pythonhosted.org/packages/1c/ce/af9d99533b24c55ff4e18d9b7b4d9919bbc6cd8f22fe7a7be01519a347d5/scikit_learn-1.7.2-cp310-cp310-macosx_12_0_arm64.whl", hash = "sha256:36749fb62b3d961b1ce4fedf08fa57a1986cd409eff2d783bca5d4b9b5fce51c", size = 8653834, upload-time = "2025-09-09T08:20:22.073Z" }, + { url = "https://files.pythonhosted.org/packages/58/0e/8c2a03d518fb6bd0b6b0d4b114c63d5f1db01ff0f9925d8eb10960d01c01/scikit_learn-1.7.2-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:7a58814265dfc52b3295b1900cfb5701589d30a8bb026c7540f1e9d3499d5ec8", size = 9660938, upload-time = "2025-09-09T08:20:24.327Z" }, + { url = "https://files.pythonhosted.org/packages/2b/75/4311605069b5d220e7cf5adabb38535bd96f0079313cdbb04b291479b22a/scikit_learn-1.7.2-cp310-cp310-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:4a847fea807e278f821a0406ca01e387f97653e284ecbd9750e3ee7c90347f18", size = 9477818, upload-time = "2025-09-09T08:20:26.845Z" }, + { url = "https://files.pythonhosted.org/packages/7f/9b/87961813c34adbca21a6b3f6b2bea344c43b30217a6d24cc437c6147f3e8/scikit_learn-1.7.2-cp310-cp310-win_amd64.whl", hash = "sha256:ca250e6836d10e6f402436d6463d6c0e4d8e0234cfb6a9a47835bd392b852ce5", size = 8886969, upload-time = "2025-09-09T08:20:29.329Z" }, + { url = "https://files.pythonhosted.org/packages/43/83/564e141eef908a5863a54da8ca342a137f45a0bfb71d1d79704c9894c9d1/scikit_learn-1.7.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:c7509693451651cd7361d30ce4e86a1347493554f172b1c72a39300fa2aea79e", size = 9331967, upload-time = "2025-09-09T08:20:32.421Z" }, + { url = "https://files.pythonhosted.org/packages/18/d6/ba863a4171ac9d7314c4d3fc251f015704a2caeee41ced89f321c049ed83/scikit_learn-1.7.2-cp311-cp311-macosx_12_0_arm64.whl", hash = "sha256:0486c8f827c2e7b64837c731c8feff72c0bd2b998067a8a9cbc10643c31f0fe1", size = 8648645, upload-time = "2025-09-09T08:20:34.436Z" }, + { url = "https://files.pythonhosted.org/packages/ef/0e/97dbca66347b8cf0ea8b529e6bb9367e337ba2e8be0ef5c1a545232abfde/scikit_learn-1.7.2-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:89877e19a80c7b11a2891a27c21c4894fb18e2c2e077815bcade10d34287b20d", size = 9715424, upload-time = "2025-09-09T08:20:36.776Z" }, + { url = "https://files.pythonhosted.org/packages/f7/32/1f3b22e3207e1d2c883a7e09abb956362e7d1bd2f14458c7de258a26ac15/scikit_learn-1.7.2-cp311-cp311-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:8da8bf89d4d79aaec192d2bda62f9b56ae4e5b4ef93b6a56b5de4977e375c1f1", size = 9509234, upload-time = "2025-09-09T08:20:38.957Z" }, + { url = "https://files.pythonhosted.org/packages/9f/71/34ddbd21f1da67c7a768146968b4d0220ee6831e4bcbad3e03dd3eae88b6/scikit_learn-1.7.2-cp311-cp311-win_amd64.whl", hash = "sha256:9b7ed8d58725030568523e937c43e56bc01cadb478fc43c042a9aca1dacb3ba1", size = 8894244, upload-time = "2025-09-09T08:20:41.166Z" }, + { url = "https://files.pythonhosted.org/packages/a7/aa/3996e2196075689afb9fce0410ebdb4a09099d7964d061d7213700204409/scikit_learn-1.7.2-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:8d91a97fa2b706943822398ab943cde71858a50245e31bc71dba62aab1d60a96", size = 9259818, upload-time = "2025-09-09T08:20:43.19Z" }, + { url = "https://files.pythonhosted.org/packages/43/5d/779320063e88af9c4a7c2cf463ff11c21ac9c8bd730c4a294b0000b666c9/scikit_learn-1.7.2-cp312-cp312-macosx_12_0_arm64.whl", hash = "sha256:acbc0f5fd2edd3432a22c69bed78e837c70cf896cd7993d71d51ba6708507476", size = 8636997, upload-time = "2025-09-09T08:20:45.468Z" }, + { url = "https://files.pythonhosted.org/packages/5c/d0/0c577d9325b05594fdd33aa970bf53fb673f051a45496842caee13cfd7fe/scikit_learn-1.7.2-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:e5bf3d930aee75a65478df91ac1225ff89cd28e9ac7bd1196853a9229b6adb0b", size = 9478381, upload-time = "2025-09-09T08:20:47.982Z" }, + { url = "https://files.pythonhosted.org/packages/82/70/8bf44b933837ba8494ca0fc9a9ab60f1c13b062ad0197f60a56e2fc4c43e/scikit_learn-1.7.2-cp312-cp312-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b4d6e9deed1a47aca9fe2f267ab8e8fe82ee20b4526b2c0cd9e135cea10feb44", size = 9300296, upload-time = "2025-09-09T08:20:50.366Z" }, + { url = "https://files.pythonhosted.org/packages/c6/99/ed35197a158f1fdc2fe7c3680e9c70d0128f662e1fee4ed495f4b5e13db0/scikit_learn-1.7.2-cp312-cp312-win_amd64.whl", hash = "sha256:6088aa475f0785e01bcf8529f55280a3d7d298679f50c0bb70a2364a82d0b290", size = 8731256, upload-time = "2025-09-09T08:20:52.627Z" }, + { url = "https://files.pythonhosted.org/packages/ae/93/a3038cb0293037fd335f77f31fe053b89c72f17b1c8908c576c29d953e84/scikit_learn-1.7.2-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:0b7dacaa05e5d76759fb071558a8b5130f4845166d88654a0f9bdf3eb57851b7", size = 9212382, upload-time = "2025-09-09T08:20:54.731Z" }, + { url = "https://files.pythonhosted.org/packages/40/dd/9a88879b0c1104259136146e4742026b52df8540c39fec21a6383f8292c7/scikit_learn-1.7.2-cp313-cp313-macosx_12_0_arm64.whl", hash = "sha256:abebbd61ad9e1deed54cca45caea8ad5f79e1b93173dece40bb8e0c658dbe6fe", size = 8592042, upload-time = "2025-09-09T08:20:57.313Z" }, + { url = "https://files.pythonhosted.org/packages/46/af/c5e286471b7d10871b811b72ae794ac5fe2989c0a2df07f0ec723030f5f5/scikit_learn-1.7.2-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:502c18e39849c0ea1a5d681af1dbcf15f6cce601aebb657aabbfe84133c1907f", size = 9434180, upload-time = "2025-09-09T08:20:59.671Z" }, + { url = "https://files.pythonhosted.org/packages/f1/fd/df59faa53312d585023b2da27e866524ffb8faf87a68516c23896c718320/scikit_learn-1.7.2-cp313-cp313-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:7a4c328a71785382fe3fe676a9ecf2c86189249beff90bf85e22bdb7efaf9ae0", size = 9283660, upload-time = "2025-09-09T08:21:01.71Z" }, + { url = "https://files.pythonhosted.org/packages/a7/c7/03000262759d7b6f38c836ff9d512f438a70d8a8ddae68ee80de72dcfb63/scikit_learn-1.7.2-cp313-cp313-win_amd64.whl", hash = "sha256:63a9afd6f7b229aad94618c01c252ce9e6fa97918c5ca19c9a17a087d819440c", size = 8702057, upload-time = "2025-09-09T08:21:04.234Z" }, + { url = "https://files.pythonhosted.org/packages/55/87/ef5eb1f267084532c8e4aef98a28b6ffe7425acbfd64b5e2f2e066bc29b3/scikit_learn-1.7.2-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:9acb6c5e867447b4e1390930e3944a005e2cb115922e693c08a323421a6966e8", size = 9558731, upload-time = "2025-09-09T08:21:06.381Z" }, + { url = "https://files.pythonhosted.org/packages/93/f8/6c1e3fc14b10118068d7938878a9f3f4e6d7b74a8ddb1e5bed65159ccda8/scikit_learn-1.7.2-cp313-cp313t-macosx_12_0_arm64.whl", hash = "sha256:2a41e2a0ef45063e654152ec9d8bcfc39f7afce35b08902bfe290c2498a67a6a", size = 9038852, upload-time = "2025-09-09T08:21:08.628Z" }, + { url = "https://files.pythonhosted.org/packages/83/87/066cafc896ee540c34becf95d30375fe5cbe93c3b75a0ee9aa852cd60021/scikit_learn-1.7.2-cp313-cp313t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:98335fb98509b73385b3ab2bd0639b1f610541d3988ee675c670371d6a87aa7c", size = 9527094, upload-time = "2025-09-09T08:21:11.486Z" }, + { url = "https://files.pythonhosted.org/packages/9c/2b/4903e1ccafa1f6453b1ab78413938c8800633988c838aa0be386cbb33072/scikit_learn-1.7.2-cp313-cp313t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:191e5550980d45449126e23ed1d5e9e24b2c68329ee1f691a3987476e115e09c", size = 9367436, upload-time = "2025-09-09T08:21:13.602Z" }, + { url = "https://files.pythonhosted.org/packages/b5/aa/8444be3cfb10451617ff9d177b3c190288f4563e6c50ff02728be67ad094/scikit_learn-1.7.2-cp313-cp313t-win_amd64.whl", hash = "sha256:57dc4deb1d3762c75d685507fbd0bc17160144b2f2ba4ccea5dc285ab0d0e973", size = 9275749, upload-time = "2025-09-09T08:21:15.96Z" }, + { url = "https://files.pythonhosted.org/packages/d9/82/dee5acf66837852e8e68df6d8d3a6cb22d3df997b733b032f513d95205b7/scikit_learn-1.7.2-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:fa8f63940e29c82d1e67a45d5297bdebbcb585f5a5a50c4914cc2e852ab77f33", size = 9208906, upload-time = "2025-09-09T08:21:18.557Z" }, + { url = "https://files.pythonhosted.org/packages/3c/30/9029e54e17b87cb7d50d51a5926429c683d5b4c1732f0507a6c3bed9bf65/scikit_learn-1.7.2-cp314-cp314-macosx_12_0_arm64.whl", hash = "sha256:f95dc55b7902b91331fa4e5845dd5bde0580c9cd9612b1b2791b7e80c3d32615", size = 8627836, upload-time = "2025-09-09T08:21:20.695Z" }, + { url = "https://files.pythonhosted.org/packages/60/18/4a52c635c71b536879f4b971c2cedf32c35ee78f48367885ed8025d1f7ee/scikit_learn-1.7.2-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:9656e4a53e54578ad10a434dc1f993330568cfee176dff07112b8785fb413106", size = 9426236, upload-time = "2025-09-09T08:21:22.645Z" }, + { url = "https://files.pythonhosted.org/packages/99/7e/290362f6ab582128c53445458a5befd471ed1ea37953d5bcf80604619250/scikit_learn-1.7.2-cp314-cp314-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:96dc05a854add0e50d3f47a1ef21a10a595016da5b007c7d9cd9d0bffd1fcc61", size = 9312593, upload-time = "2025-09-09T08:21:24.65Z" }, + { url = "https://files.pythonhosted.org/packages/8e/87/24f541b6d62b1794939ae6422f8023703bbf6900378b2b34e0b4384dfefd/scikit_learn-1.7.2-cp314-cp314-win_amd64.whl", hash = "sha256:bb24510ed3f9f61476181e4db51ce801e2ba37541def12dc9333b946fc7a9cf8", size = 8820007, upload-time = "2025-09-09T08:21:26.713Z" }, +] + +[[package]] +name = "scikit-learn" +version = "1.8.0" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version >= '3.14' and sys_platform == 'win32'", + "python_full_version >= '3.14' and sys_platform == 'emscripten'", + "python_full_version >= '3.14' and sys_platform != 'emscripten' and sys_platform != 'win32'", + "python_full_version == '3.13.*' and sys_platform == 'win32'", + "python_full_version == '3.13.*' and sys_platform == 'emscripten'", + "python_full_version == '3.13.*' and sys_platform != 'emscripten' and sys_platform != 'win32'", + "python_full_version == '3.12.*' and sys_platform == 'win32'", + "python_full_version == '3.12.*' and sys_platform == 'emscripten'", + "python_full_version == '3.12.*' and sys_platform != 'emscripten' and sys_platform != 'win32'", + "python_full_version == '3.11.*' and sys_platform == 'win32'", + "python_full_version == '3.11.*' and sys_platform == 'emscripten'", + "python_full_version == '3.11.*' and sys_platform != 'emscripten' and sys_platform != 'win32'", +] +dependencies = [ + { name = "joblib", marker = "python_full_version >= '3.11'" }, + { name = "numpy", version = "2.4.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, + { name = "scipy", version = "1.17.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, + { name = "threadpoolctl", marker = "python_full_version >= '3.11'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/0e/d4/40988bf3b8e34feec1d0e6a051446b1f66225f8529b9309becaeef62b6c4/scikit_learn-1.8.0.tar.gz", hash = "sha256:9bccbb3b40e3de10351f8f5068e105d0f4083b1a65fa07b6634fbc401a6287fd", size = 7335585, upload-time = "2025-12-10T07:08:53.618Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/c9/92/53ea2181da8ac6bf27170191028aee7251f8f841f8d3edbfdcaf2008fde9/scikit_learn-1.8.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:146b4d36f800c013d267b29168813f7a03a43ecd2895d04861f1240b564421da", size = 8595835, upload-time = "2025-12-10T07:07:39.385Z" }, + { url = "https://files.pythonhosted.org/packages/01/18/d154dc1638803adf987910cdd07097d9c526663a55666a97c124d09fb96a/scikit_learn-1.8.0-cp311-cp311-macosx_12_0_arm64.whl", hash = "sha256:f984ca4b14914e6b4094c5d52a32ea16b49832c03bd17a110f004db3c223e8e1", size = 8080381, upload-time = "2025-12-10T07:07:41.93Z" }, + { url = "https://files.pythonhosted.org/packages/8a/44/226142fcb7b7101e64fdee5f49dbe6288d4c7af8abf593237b70fca080a4/scikit_learn-1.8.0-cp311-cp311-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:5e30adb87f0cc81c7690a84f7932dd66be5bac57cfe16b91cb9151683a4a2d3b", size = 8799632, upload-time = "2025-12-10T07:07:43.899Z" }, + { url = "https://files.pythonhosted.org/packages/36/4d/4a67f30778a45d542bbea5db2dbfa1e9e100bf9ba64aefe34215ba9f11f6/scikit_learn-1.8.0-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:ada8121bcb4dac28d930febc791a69f7cb1673c8495e5eee274190b73a4559c1", size = 9103788, upload-time = "2025-12-10T07:07:45.982Z" }, + { url = "https://files.pythonhosted.org/packages/89/3c/45c352094cfa60050bcbb967b1faf246b22e93cb459f2f907b600f2ceda5/scikit_learn-1.8.0-cp311-cp311-win_amd64.whl", hash = "sha256:c57b1b610bd1f40ba43970e11ce62821c2e6569e4d74023db19c6b26f246cb3b", size = 8081706, upload-time = "2025-12-10T07:07:48.111Z" }, + { url = "https://files.pythonhosted.org/packages/3d/46/5416595bb395757f754feb20c3d776553a386b661658fb21b7c814e89efe/scikit_learn-1.8.0-cp311-cp311-win_arm64.whl", hash = "sha256:2838551e011a64e3053ad7618dda9310175f7515f1742fa2d756f7c874c05961", size = 7688451, upload-time = "2025-12-10T07:07:49.873Z" }, + { url = "https://files.pythonhosted.org/packages/90/74/e6a7cc4b820e95cc38cf36cd74d5aa2b42e8ffc2d21fe5a9a9c45c1c7630/scikit_learn-1.8.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:5fb63362b5a7ddab88e52b6dbb47dac3fd7dafeee740dc6c8d8a446ddedade8e", size = 8548242, upload-time = "2025-12-10T07:07:51.568Z" }, + { url = "https://files.pythonhosted.org/packages/49/d8/9be608c6024d021041c7f0b3928d4749a706f4e2c3832bbede4fb4f58c95/scikit_learn-1.8.0-cp312-cp312-macosx_12_0_arm64.whl", hash = "sha256:5025ce924beccb28298246e589c691fe1b8c1c96507e6d27d12c5fadd85bfd76", size = 8079075, upload-time = "2025-12-10T07:07:53.697Z" }, + { url = "https://files.pythonhosted.org/packages/dd/47/f187b4636ff80cc63f21cd40b7b2d177134acaa10f6bb73746130ee8c2e5/scikit_learn-1.8.0-cp312-cp312-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:4496bb2cf7a43ce1a2d7524a79e40bc5da45cf598dbf9545b7e8316ccba47bb4", size = 8660492, upload-time = "2025-12-10T07:07:55.574Z" }, + { url = "https://files.pythonhosted.org/packages/97/74/b7a304feb2b49df9fafa9382d4d09061a96ee9a9449a7cbea7988dda0828/scikit_learn-1.8.0-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:a0bcfe4d0d14aec44921545fd2af2338c7471de9cb701f1da4c9d85906ab847a", size = 8931904, upload-time = "2025-12-10T07:07:57.666Z" }, + { url = "https://files.pythonhosted.org/packages/9f/c4/0ab22726a04ede56f689476b760f98f8f46607caecff993017ac1b64aa5d/scikit_learn-1.8.0-cp312-cp312-win_amd64.whl", hash = "sha256:35c007dedb2ffe38fe3ee7d201ebac4a2deccd2408e8621d53067733e3c74809", size = 8019359, upload-time = "2025-12-10T07:07:59.838Z" }, + { url = "https://files.pythonhosted.org/packages/24/90/344a67811cfd561d7335c1b96ca21455e7e472d281c3c279c4d3f2300236/scikit_learn-1.8.0-cp312-cp312-win_arm64.whl", hash = "sha256:8c497fff237d7b4e07e9ef1a640887fa4fb765647f86fbe00f969ff6280ce2bb", size = 7641898, upload-time = "2025-12-10T07:08:01.36Z" }, + { url = "https://files.pythonhosted.org/packages/03/aa/e22e0768512ce9255eba34775be2e85c2048da73da1193e841707f8f039c/scikit_learn-1.8.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:0d6ae97234d5d7079dc0040990a6f7aeb97cb7fa7e8945f1999a429b23569e0a", size = 8513770, upload-time = "2025-12-10T07:08:03.251Z" }, + { url = "https://files.pythonhosted.org/packages/58/37/31b83b2594105f61a381fc74ca19e8780ee923be2d496fcd8d2e1147bd99/scikit_learn-1.8.0-cp313-cp313-macosx_12_0_arm64.whl", hash = "sha256:edec98c5e7c128328124a029bceb09eda2d526997780fef8d65e9a69eead963e", size = 8044458, upload-time = "2025-12-10T07:08:05.336Z" }, + { url = "https://files.pythonhosted.org/packages/2d/5a/3f1caed8765f33eabb723596666da4ebbf43d11e96550fb18bdec42b467b/scikit_learn-1.8.0-cp313-cp313-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:74b66d8689d52ed04c271e1329f0c61635bcaf5b926db9b12d58914cdc01fe57", size = 8610341, upload-time = "2025-12-10T07:08:07.732Z" }, + { url = "https://files.pythonhosted.org/packages/38/cf/06896db3f71c75902a8e9943b444a56e727418f6b4b4a90c98c934f51ed4/scikit_learn-1.8.0-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:8fdf95767f989b0cfedb85f7ed8ca215d4be728031f56ff5a519ee1e3276dc2e", size = 8900022, upload-time = "2025-12-10T07:08:09.862Z" }, + { url = "https://files.pythonhosted.org/packages/1c/f9/9b7563caf3ec8873e17a31401858efab6b39a882daf6c1bfa88879c0aa11/scikit_learn-1.8.0-cp313-cp313-win_amd64.whl", hash = "sha256:2de443b9373b3b615aec1bb57f9baa6bb3a9bd093f1269ba95c17d870422b271", size = 7989409, upload-time = "2025-12-10T07:08:12.028Z" }, + { url = "https://files.pythonhosted.org/packages/49/bd/1f4001503650e72c4f6009ac0c4413cb17d2d601cef6f71c0453da2732fc/scikit_learn-1.8.0-cp313-cp313-win_arm64.whl", hash = "sha256:eddde82a035681427cbedded4e6eff5e57fa59216c2e3e90b10b19ab1d0a65c3", size = 7619760, upload-time = "2025-12-10T07:08:13.688Z" }, + { url = "https://files.pythonhosted.org/packages/d2/7d/a630359fc9dcc95496588c8d8e3245cc8fd81980251079bc09c70d41d951/scikit_learn-1.8.0-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:7cc267b6108f0a1499a734167282c00c4ebf61328566b55ef262d48e9849c735", size = 8826045, upload-time = "2025-12-10T07:08:15.215Z" }, + { url = "https://files.pythonhosted.org/packages/cc/56/a0c86f6930cfcd1c7054a2bc417e26960bb88d32444fe7f71d5c2cfae891/scikit_learn-1.8.0-cp313-cp313t-macosx_12_0_arm64.whl", hash = "sha256:fe1c011a640a9f0791146011dfd3c7d9669785f9fed2b2a5f9e207536cf5c2fd", size = 8420324, upload-time = "2025-12-10T07:08:17.561Z" }, + { url = "https://files.pythonhosted.org/packages/46/1e/05962ea1cebc1cf3876667ecb14c283ef755bf409993c5946ade3b77e303/scikit_learn-1.8.0-cp313-cp313t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:72358cce49465d140cc4e7792015bb1f0296a9742d5622c67e31399b75468b9e", size = 8680651, upload-time = "2025-12-10T07:08:19.952Z" }, + { url = "https://files.pythonhosted.org/packages/fe/56/a85473cd75f200c9759e3a5f0bcab2d116c92a8a02ee08ccd73b870f8bb4/scikit_learn-1.8.0-cp313-cp313t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:80832434a6cc114f5219211eec13dcbc16c2bac0e31ef64c6d346cde3cf054cb", size = 8925045, upload-time = "2025-12-10T07:08:22.11Z" }, + { url = "https://files.pythonhosted.org/packages/cc/b7/64d8cfa896c64435ae57f4917a548d7ac7a44762ff9802f75a79b77cb633/scikit_learn-1.8.0-cp313-cp313t-win_amd64.whl", hash = "sha256:ee787491dbfe082d9c3013f01f5991658b0f38aa8177e4cd4bf434c58f551702", size = 8507994, upload-time = "2025-12-10T07:08:23.943Z" }, + { url = "https://files.pythonhosted.org/packages/5e/37/e192ea709551799379958b4c4771ec507347027bb7c942662c7fbeba31cb/scikit_learn-1.8.0-cp313-cp313t-win_arm64.whl", hash = "sha256:bf97c10a3f5a7543f9b88cbf488d33d175e9146115a451ae34568597ba33dcde", size = 7869518, upload-time = "2025-12-10T07:08:25.71Z" }, + { url = "https://files.pythonhosted.org/packages/24/05/1af2c186174cc92dcab2233f327336058c077d38f6fe2aceb08e6ab4d509/scikit_learn-1.8.0-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:c22a2da7a198c28dd1a6e1136f19c830beab7fdca5b3e5c8bba8394f8a5c45b3", size = 8528667, upload-time = "2025-12-10T07:08:27.541Z" }, + { url = "https://files.pythonhosted.org/packages/a8/25/01c0af38fe969473fb292bba9dc2b8f9b451f3112ff242c647fee3d0dfe7/scikit_learn-1.8.0-cp314-cp314-macosx_12_0_arm64.whl", hash = "sha256:6b595b07a03069a2b1740dc08c2299993850ea81cce4fe19b2421e0c970de6b7", size = 8066524, upload-time = "2025-12-10T07:08:29.822Z" }, + { url = "https://files.pythonhosted.org/packages/be/ce/a0623350aa0b68647333940ee46fe45086c6060ec604874e38e9ab7d8e6c/scikit_learn-1.8.0-cp314-cp314-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:29ffc74089f3d5e87dfca4c2c8450f88bdc61b0fc6ed5d267f3988f19a1309f6", size = 8657133, upload-time = "2025-12-10T07:08:31.865Z" }, + { url = "https://files.pythonhosted.org/packages/b8/cb/861b41341d6f1245e6ca80b1c1a8c4dfce43255b03df034429089ca2a2c5/scikit_learn-1.8.0-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:fb65db5d7531bccf3a4f6bec3462223bea71384e2cda41da0f10b7c292b9e7c4", size = 8923223, upload-time = "2025-12-10T07:08:34.166Z" }, + { url = "https://files.pythonhosted.org/packages/76/18/a8def8f91b18cd1ba6e05dbe02540168cb24d47e8dcf69e8d00b7da42a08/scikit_learn-1.8.0-cp314-cp314-win_amd64.whl", hash = "sha256:56079a99c20d230e873ea40753102102734c5953366972a71d5cb39a32bc40c6", size = 8096518, upload-time = "2025-12-10T07:08:36.339Z" }, + { url = "https://files.pythonhosted.org/packages/d1/77/482076a678458307f0deb44e29891d6022617b2a64c840c725495bee343f/scikit_learn-1.8.0-cp314-cp314-win_arm64.whl", hash = "sha256:3bad7565bc9cf37ce19a7c0d107742b320c1285df7aab1a6e2d28780df167242", size = 7754546, upload-time = "2025-12-10T07:08:38.128Z" }, + { url = "https://files.pythonhosted.org/packages/2d/d1/ef294ca754826daa043b2a104e59960abfab4cf653891037d19dd5b6f3cf/scikit_learn-1.8.0-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:4511be56637e46c25721e83d1a9cea9614e7badc7040c4d573d75fbe257d6fd7", size = 8848305, upload-time = "2025-12-10T07:08:41.013Z" }, + { url = "https://files.pythonhosted.org/packages/5b/e2/b1f8b05138ee813b8e1a4149f2f0d289547e60851fd1bb268886915adbda/scikit_learn-1.8.0-cp314-cp314t-macosx_12_0_arm64.whl", hash = "sha256:a69525355a641bf8ef136a7fa447672fb54fe8d60cab5538d9eb7c6438543fb9", size = 8432257, upload-time = "2025-12-10T07:08:42.873Z" }, + { url = "https://files.pythonhosted.org/packages/26/11/c32b2138a85dcb0c99f6afd13a70a951bfdff8a6ab42d8160522542fb647/scikit_learn-1.8.0-cp314-cp314t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c2656924ec73e5939c76ac4c8b026fc203b83d8900362eb2599d8aee80e4880f", size = 8678673, upload-time = "2025-12-10T07:08:45.362Z" }, + { url = "https://files.pythonhosted.org/packages/c7/57/51f2384575bdec454f4fe4e7a919d696c9ebce914590abf3e52d47607ab8/scikit_learn-1.8.0-cp314-cp314t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:15fc3b5d19cc2be65404786857f2e13c70c83dd4782676dd6814e3b89dc8f5b9", size = 8922467, upload-time = "2025-12-10T07:08:47.408Z" }, + { url = "https://files.pythonhosted.org/packages/35/4d/748c9e2872637a57981a04adc038dacaa16ba8ca887b23e34953f0b3f742/scikit_learn-1.8.0-cp314-cp314t-win_amd64.whl", hash = "sha256:00d6f1d66fbcf4eba6e356e1420d33cc06c70a45bb1363cd6f6a8e4ebbbdece2", size = 8774395, upload-time = "2025-12-10T07:08:49.337Z" }, + { url = "https://files.pythonhosted.org/packages/60/22/d7b2ebe4704a5e50790ba089d5c2ae308ab6bb852719e6c3bd4f04c3a363/scikit_learn-1.8.0-cp314-cp314t-win_arm64.whl", hash = "sha256:f28dd15c6bb0b66ba09728cf09fd8736c304be29409bd8445a080c1280619e8c", size = 8002647, upload-time = "2025-12-10T07:08:51.601Z" }, +] + +[[package]] +name = "scipy" +version = "1.15.3" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version < '3.11'", +] +dependencies = [ + { name = "numpy", version = "2.2.6", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/0f/37/6964b830433e654ec7485e45a00fc9a27cf868d622838f6b6d9c5ec0d532/scipy-1.15.3.tar.gz", hash = "sha256:eae3cf522bc7df64b42cad3925c876e1b0b6c35c1337c93e12c0f366f55b0eaf", size = 59419214, upload-time = "2025-05-08T16:13:05.955Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/78/2f/4966032c5f8cc7e6a60f1b2e0ad686293b9474b65246b0c642e3ef3badd0/scipy-1.15.3-cp310-cp310-macosx_10_13_x86_64.whl", hash = "sha256:a345928c86d535060c9c2b25e71e87c39ab2f22fc96e9636bd74d1dbf9de448c", size = 38702770, upload-time = "2025-05-08T16:04:20.849Z" }, + { url = "https://files.pythonhosted.org/packages/a0/6e/0c3bf90fae0e910c274db43304ebe25a6b391327f3f10b5dcc638c090795/scipy-1.15.3-cp310-cp310-macosx_12_0_arm64.whl", hash = "sha256:ad3432cb0f9ed87477a8d97f03b763fd1d57709f1bbde3c9369b1dff5503b253", size = 30094511, upload-time = "2025-05-08T16:04:27.103Z" }, + { url = "https://files.pythonhosted.org/packages/ea/b1/4deb37252311c1acff7f101f6453f0440794f51b6eacb1aad4459a134081/scipy-1.15.3-cp310-cp310-macosx_14_0_arm64.whl", hash = "sha256:aef683a9ae6eb00728a542b796f52a5477b78252edede72b8327a886ab63293f", size = 22368151, upload-time = "2025-05-08T16:04:31.731Z" }, + { url = "https://files.pythonhosted.org/packages/38/7d/f457626e3cd3c29b3a49ca115a304cebb8cc6f31b04678f03b216899d3c6/scipy-1.15.3-cp310-cp310-macosx_14_0_x86_64.whl", hash = "sha256:1c832e1bd78dea67d5c16f786681b28dd695a8cb1fb90af2e27580d3d0967e92", size = 25121732, upload-time = "2025-05-08T16:04:36.596Z" }, + { url = "https://files.pythonhosted.org/packages/db/0a/92b1de4a7adc7a15dcf5bddc6e191f6f29ee663b30511ce20467ef9b82e4/scipy-1.15.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:263961f658ce2165bbd7b99fa5135195c3a12d9bef045345016b8b50c315cb82", size = 35547617, upload-time = "2025-05-08T16:04:43.546Z" }, + { url = "https://files.pythonhosted.org/packages/8e/6d/41991e503e51fc1134502694c5fa7a1671501a17ffa12716a4a9151af3df/scipy-1.15.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9e2abc762b0811e09a0d3258abee2d98e0c703eee49464ce0069590846f31d40", size = 37662964, upload-time = "2025-05-08T16:04:49.431Z" }, + { url = "https://files.pythonhosted.org/packages/25/e1/3df8f83cb15f3500478c889be8fb18700813b95e9e087328230b98d547ff/scipy-1.15.3-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:ed7284b21a7a0c8f1b6e5977ac05396c0d008b89e05498c8b7e8f4a1423bba0e", size = 37238749, upload-time = "2025-05-08T16:04:55.215Z" }, + { url = "https://files.pythonhosted.org/packages/93/3e/b3257cf446f2a3533ed7809757039016b74cd6f38271de91682aa844cfc5/scipy-1.15.3-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:5380741e53df2c566f4d234b100a484b420af85deb39ea35a1cc1be84ff53a5c", size = 40022383, upload-time = "2025-05-08T16:05:01.914Z" }, + { url = "https://files.pythonhosted.org/packages/d1/84/55bc4881973d3f79b479a5a2e2df61c8c9a04fcb986a213ac9c02cfb659b/scipy-1.15.3-cp310-cp310-win_amd64.whl", hash = "sha256:9d61e97b186a57350f6d6fd72640f9e99d5a4a2b8fbf4b9ee9a841eab327dc13", size = 41259201, upload-time = "2025-05-08T16:05:08.166Z" }, + { url = "https://files.pythonhosted.org/packages/96/ab/5cc9f80f28f6a7dff646c5756e559823614a42b1939d86dd0ed550470210/scipy-1.15.3-cp311-cp311-macosx_10_13_x86_64.whl", hash = "sha256:993439ce220d25e3696d1b23b233dd010169b62f6456488567e830654ee37a6b", size = 38714255, upload-time = "2025-05-08T16:05:14.596Z" }, + { url = "https://files.pythonhosted.org/packages/4a/4a/66ba30abe5ad1a3ad15bfb0b59d22174012e8056ff448cb1644deccbfed2/scipy-1.15.3-cp311-cp311-macosx_12_0_arm64.whl", hash = "sha256:34716e281f181a02341ddeaad584205bd2fd3c242063bd3423d61ac259ca7eba", size = 30111035, upload-time = "2025-05-08T16:05:20.152Z" }, + { url = "https://files.pythonhosted.org/packages/4b/fa/a7e5b95afd80d24313307f03624acc65801846fa75599034f8ceb9e2cbf6/scipy-1.15.3-cp311-cp311-macosx_14_0_arm64.whl", hash = "sha256:3b0334816afb8b91dab859281b1b9786934392aa3d527cd847e41bb6f45bee65", size = 22384499, upload-time = "2025-05-08T16:05:24.494Z" }, + { url = "https://files.pythonhosted.org/packages/17/99/f3aaddccf3588bb4aea70ba35328c204cadd89517a1612ecfda5b2dd9d7a/scipy-1.15.3-cp311-cp311-macosx_14_0_x86_64.whl", hash = "sha256:6db907c7368e3092e24919b5e31c76998b0ce1684d51a90943cb0ed1b4ffd6c1", size = 25152602, upload-time = "2025-05-08T16:05:29.313Z" }, + { url = "https://files.pythonhosted.org/packages/56/c5/1032cdb565f146109212153339f9cb8b993701e9fe56b1c97699eee12586/scipy-1.15.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:721d6b4ef5dc82ca8968c25b111e307083d7ca9091bc38163fb89243e85e3889", size = 35503415, upload-time = "2025-05-08T16:05:34.699Z" }, + { url = "https://files.pythonhosted.org/packages/bd/37/89f19c8c05505d0601ed5650156e50eb881ae3918786c8fd7262b4ee66d3/scipy-1.15.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:39cb9c62e471b1bb3750066ecc3a3f3052b37751c7c3dfd0fd7e48900ed52982", size = 37652622, upload-time = "2025-05-08T16:05:40.762Z" }, + { url = "https://files.pythonhosted.org/packages/7e/31/be59513aa9695519b18e1851bb9e487de66f2d31f835201f1b42f5d4d475/scipy-1.15.3-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:795c46999bae845966368a3c013e0e00947932d68e235702b5c3f6ea799aa8c9", size = 37244796, upload-time = "2025-05-08T16:05:48.119Z" }, + { url = "https://files.pythonhosted.org/packages/10/c0/4f5f3eeccc235632aab79b27a74a9130c6c35df358129f7ac8b29f562ac7/scipy-1.15.3-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:18aaacb735ab38b38db42cb01f6b92a2d0d4b6aabefeb07f02849e47f8fb3594", size = 40047684, upload-time = "2025-05-08T16:05:54.22Z" }, + { url = "https://files.pythonhosted.org/packages/ab/a7/0ddaf514ce8a8714f6ed243a2b391b41dbb65251affe21ee3077ec45ea9a/scipy-1.15.3-cp311-cp311-win_amd64.whl", hash = "sha256:ae48a786a28412d744c62fd7816a4118ef97e5be0bee968ce8f0a2fba7acf3bb", size = 41246504, upload-time = "2025-05-08T16:06:00.437Z" }, + { url = "https://files.pythonhosted.org/packages/37/4b/683aa044c4162e10ed7a7ea30527f2cbd92e6999c10a8ed8edb253836e9c/scipy-1.15.3-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:6ac6310fdbfb7aa6612408bd2f07295bcbd3fda00d2d702178434751fe48e019", size = 38766735, upload-time = "2025-05-08T16:06:06.471Z" }, + { url = "https://files.pythonhosted.org/packages/7b/7e/f30be3d03de07f25dc0ec926d1681fed5c732d759ac8f51079708c79e680/scipy-1.15.3-cp312-cp312-macosx_12_0_arm64.whl", hash = "sha256:185cd3d6d05ca4b44a8f1595af87f9c372bb6acf9c808e99aa3e9aa03bd98cf6", size = 30173284, upload-time = "2025-05-08T16:06:11.686Z" }, + { url = "https://files.pythonhosted.org/packages/07/9c/0ddb0d0abdabe0d181c1793db51f02cd59e4901da6f9f7848e1f96759f0d/scipy-1.15.3-cp312-cp312-macosx_14_0_arm64.whl", hash = "sha256:05dc6abcd105e1a29f95eada46d4a3f251743cfd7d3ae8ddb4088047f24ea477", size = 22446958, upload-time = "2025-05-08T16:06:15.97Z" }, + { url = "https://files.pythonhosted.org/packages/af/43/0bce905a965f36c58ff80d8bea33f1f9351b05fad4beaad4eae34699b7a1/scipy-1.15.3-cp312-cp312-macosx_14_0_x86_64.whl", hash = "sha256:06efcba926324df1696931a57a176c80848ccd67ce6ad020c810736bfd58eb1c", size = 25242454, upload-time = "2025-05-08T16:06:20.394Z" }, + { url = "https://files.pythonhosted.org/packages/56/30/a6f08f84ee5b7b28b4c597aca4cbe545535c39fe911845a96414700b64ba/scipy-1.15.3-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c05045d8b9bfd807ee1b9f38761993297b10b245f012b11b13b91ba8945f7e45", size = 35210199, upload-time = "2025-05-08T16:06:26.159Z" }, + { url = "https://files.pythonhosted.org/packages/0b/1f/03f52c282437a168ee2c7c14a1a0d0781a9a4a8962d84ac05c06b4c5b555/scipy-1.15.3-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:271e3713e645149ea5ea3e97b57fdab61ce61333f97cfae392c28ba786f9bb49", size = 37309455, upload-time = "2025-05-08T16:06:32.778Z" }, + { url = "https://files.pythonhosted.org/packages/89/b1/fbb53137f42c4bf630b1ffdfc2151a62d1d1b903b249f030d2b1c0280af8/scipy-1.15.3-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:6cfd56fc1a8e53f6e89ba3a7a7251f7396412d655bca2aa5611c8ec9a6784a1e", size = 36885140, upload-time = "2025-05-08T16:06:39.249Z" }, + { url = "https://files.pythonhosted.org/packages/2e/2e/025e39e339f5090df1ff266d021892694dbb7e63568edcfe43f892fa381d/scipy-1.15.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:0ff17c0bb1cb32952c09217d8d1eed9b53d1463e5f1dd6052c7857f83127d539", size = 39710549, upload-time = "2025-05-08T16:06:45.729Z" }, + { url = "https://files.pythonhosted.org/packages/e6/eb/3bf6ea8ab7f1503dca3a10df2e4b9c3f6b3316df07f6c0ded94b281c7101/scipy-1.15.3-cp312-cp312-win_amd64.whl", hash = "sha256:52092bc0472cfd17df49ff17e70624345efece4e1a12b23783a1ac59a1b728ed", size = 40966184, upload-time = "2025-05-08T16:06:52.623Z" }, + { url = "https://files.pythonhosted.org/packages/73/18/ec27848c9baae6e0d6573eda6e01a602e5649ee72c27c3a8aad673ebecfd/scipy-1.15.3-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:2c620736bcc334782e24d173c0fdbb7590a0a436d2fdf39310a8902505008759", size = 38728256, upload-time = "2025-05-08T16:06:58.696Z" }, + { url = "https://files.pythonhosted.org/packages/74/cd/1aef2184948728b4b6e21267d53b3339762c285a46a274ebb7863c9e4742/scipy-1.15.3-cp313-cp313-macosx_12_0_arm64.whl", hash = "sha256:7e11270a000969409d37ed399585ee530b9ef6aa99d50c019de4cb01e8e54e62", size = 30109540, upload-time = "2025-05-08T16:07:04.209Z" }, + { url = "https://files.pythonhosted.org/packages/5b/d8/59e452c0a255ec352bd0a833537a3bc1bfb679944c4938ab375b0a6b3a3e/scipy-1.15.3-cp313-cp313-macosx_14_0_arm64.whl", hash = "sha256:8c9ed3ba2c8a2ce098163a9bdb26f891746d02136995df25227a20e71c396ebb", size = 22383115, upload-time = "2025-05-08T16:07:08.998Z" }, + { url = "https://files.pythonhosted.org/packages/08/f5/456f56bbbfccf696263b47095291040655e3cbaf05d063bdc7c7517f32ac/scipy-1.15.3-cp313-cp313-macosx_14_0_x86_64.whl", hash = "sha256:0bdd905264c0c9cfa74a4772cdb2070171790381a5c4d312c973382fc6eaf730", size = 25163884, upload-time = "2025-05-08T16:07:14.091Z" }, + { url = "https://files.pythonhosted.org/packages/a2/66/a9618b6a435a0f0c0b8a6d0a2efb32d4ec5a85f023c2b79d39512040355b/scipy-1.15.3-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:79167bba085c31f38603e11a267d862957cbb3ce018d8b38f79ac043bc92d825", size = 35174018, upload-time = "2025-05-08T16:07:19.427Z" }, + { url = "https://files.pythonhosted.org/packages/b5/09/c5b6734a50ad4882432b6bb7c02baf757f5b2f256041da5df242e2d7e6b6/scipy-1.15.3-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c9deabd6d547aee2c9a81dee6cc96c6d7e9a9b1953f74850c179f91fdc729cb7", size = 37269716, upload-time = "2025-05-08T16:07:25.712Z" }, + { url = "https://files.pythonhosted.org/packages/77/0a/eac00ff741f23bcabd352731ed9b8995a0a60ef57f5fd788d611d43d69a1/scipy-1.15.3-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:dde4fc32993071ac0c7dd2d82569e544f0bdaff66269cb475e0f369adad13f11", size = 36872342, upload-time = "2025-05-08T16:07:31.468Z" }, + { url = "https://files.pythonhosted.org/packages/fe/54/4379be86dd74b6ad81551689107360d9a3e18f24d20767a2d5b9253a3f0a/scipy-1.15.3-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:f77f853d584e72e874d87357ad70f44b437331507d1c311457bed8ed2b956126", size = 39670869, upload-time = "2025-05-08T16:07:38.002Z" }, + { url = "https://files.pythonhosted.org/packages/87/2e/892ad2862ba54f084ffe8cc4a22667eaf9c2bcec6d2bff1d15713c6c0703/scipy-1.15.3-cp313-cp313-win_amd64.whl", hash = "sha256:b90ab29d0c37ec9bf55424c064312930ca5f4bde15ee8619ee44e69319aab163", size = 40988851, upload-time = "2025-05-08T16:08:33.671Z" }, + { url = "https://files.pythonhosted.org/packages/1b/e9/7a879c137f7e55b30d75d90ce3eb468197646bc7b443ac036ae3fe109055/scipy-1.15.3-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:3ac07623267feb3ae308487c260ac684b32ea35fd81e12845039952f558047b8", size = 38863011, upload-time = "2025-05-08T16:07:44.039Z" }, + { url = "https://files.pythonhosted.org/packages/51/d1/226a806bbd69f62ce5ef5f3ffadc35286e9fbc802f606a07eb83bf2359de/scipy-1.15.3-cp313-cp313t-macosx_12_0_arm64.whl", hash = "sha256:6487aa99c2a3d509a5227d9a5e889ff05830a06b2ce08ec30df6d79db5fcd5c5", size = 30266407, upload-time = "2025-05-08T16:07:49.891Z" }, + { url = "https://files.pythonhosted.org/packages/e5/9b/f32d1d6093ab9eeabbd839b0f7619c62e46cc4b7b6dbf05b6e615bbd4400/scipy-1.15.3-cp313-cp313t-macosx_14_0_arm64.whl", hash = "sha256:50f9e62461c95d933d5c5ef4a1f2ebf9a2b4e83b0db374cb3f1de104d935922e", size = 22540030, upload-time = "2025-05-08T16:07:54.121Z" }, + { url = "https://files.pythonhosted.org/packages/e7/29/c278f699b095c1a884f29fda126340fcc201461ee8bfea5c8bdb1c7c958b/scipy-1.15.3-cp313-cp313t-macosx_14_0_x86_64.whl", hash = "sha256:14ed70039d182f411ffc74789a16df3835e05dc469b898233a245cdfd7f162cb", size = 25218709, upload-time = "2025-05-08T16:07:58.506Z" }, + { url = "https://files.pythonhosted.org/packages/24/18/9e5374b617aba742a990581373cd6b68a2945d65cc588482749ef2e64467/scipy-1.15.3-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0a769105537aa07a69468a0eefcd121be52006db61cdd8cac8a0e68980bbb723", size = 34809045, upload-time = "2025-05-08T16:08:03.929Z" }, + { url = "https://files.pythonhosted.org/packages/e1/fe/9c4361e7ba2927074360856db6135ef4904d505e9b3afbbcb073c4008328/scipy-1.15.3-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9db984639887e3dffb3928d118145ffe40eff2fa40cb241a306ec57c219ebbbb", size = 36703062, upload-time = "2025-05-08T16:08:09.558Z" }, + { url = "https://files.pythonhosted.org/packages/b7/8e/038ccfe29d272b30086b25a4960f757f97122cb2ec42e62b460d02fe98e9/scipy-1.15.3-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:40e54d5c7e7ebf1aa596c374c49fa3135f04648a0caabcb66c52884b943f02b4", size = 36393132, upload-time = "2025-05-08T16:08:15.34Z" }, + { url = "https://files.pythonhosted.org/packages/10/7e/5c12285452970be5bdbe8352c619250b97ebf7917d7a9a9e96b8a8140f17/scipy-1.15.3-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:5e721fed53187e71d0ccf382b6bf977644c533e506c4d33c3fb24de89f5c3ed5", size = 38979503, upload-time = "2025-05-08T16:08:21.513Z" }, + { url = "https://files.pythonhosted.org/packages/81/06/0a5e5349474e1cbc5757975b21bd4fad0e72ebf138c5592f191646154e06/scipy-1.15.3-cp313-cp313t-win_amd64.whl", hash = "sha256:76ad1fb5f8752eabf0fa02e4cc0336b4e8f021e2d5f061ed37d6d264db35e3ca", size = 40308097, upload-time = "2025-05-08T16:08:27.627Z" }, +] + +[[package]] +name = "scipy" +version = "1.17.1" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version >= '3.14' and sys_platform == 'win32'", + "python_full_version >= '3.14' and sys_platform == 'emscripten'", + "python_full_version >= '3.14' and sys_platform != 'emscripten' and sys_platform != 'win32'", + "python_full_version == '3.13.*' and sys_platform == 'win32'", + "python_full_version == '3.13.*' and sys_platform == 'emscripten'", + "python_full_version == '3.13.*' and sys_platform != 'emscripten' and sys_platform != 'win32'", + "python_full_version == '3.12.*' and sys_platform == 'win32'", + "python_full_version == '3.12.*' and sys_platform == 'emscripten'", + "python_full_version == '3.12.*' and sys_platform != 'emscripten' and sys_platform != 'win32'", + "python_full_version == '3.11.*' and sys_platform == 'win32'", + "python_full_version == '3.11.*' and sys_platform == 'emscripten'", + "python_full_version == '3.11.*' and sys_platform != 'emscripten' and sys_platform != 'win32'", +] +dependencies = [ + { name = "numpy", version = "2.4.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/7a/97/5a3609c4f8d58b039179648e62dd220f89864f56f7357f5d4f45c29eb2cc/scipy-1.17.1.tar.gz", hash = "sha256:95d8e012d8cb8816c226aef832200b1d45109ed4464303e997c5b13122b297c0", size = 30573822, upload-time = "2026-02-23T00:26:24.851Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/df/75/b4ce781849931fef6fd529afa6b63711d5a733065722d0c3e2724af9e40a/scipy-1.17.1-cp311-cp311-macosx_10_14_x86_64.whl", hash = "sha256:1f95b894f13729334fb990162e911c9e5dc1ab390c58aa6cbecb389c5b5e28ec", size = 31613675, upload-time = "2026-02-23T00:16:00.13Z" }, + { url = "https://files.pythonhosted.org/packages/f7/58/bccc2861b305abdd1b8663d6130c0b3d7cc22e8d86663edbc8401bfd40d4/scipy-1.17.1-cp311-cp311-macosx_12_0_arm64.whl", hash = "sha256:e18f12c6b0bc5a592ed23d3f7b891f68fd7f8241d69b7883769eb5d5dfb52696", size = 28162057, upload-time = "2026-02-23T00:16:09.456Z" }, + { url = "https://files.pythonhosted.org/packages/6d/ee/18146b7757ed4976276b9c9819108adbc73c5aad636e5353e20746b73069/scipy-1.17.1-cp311-cp311-macosx_14_0_arm64.whl", hash = "sha256:a3472cfbca0a54177d0faa68f697d8ba4c80bbdc19908c3465556d9f7efce9ee", size = 20334032, upload-time = "2026-02-23T00:16:17.358Z" }, + { url = "https://files.pythonhosted.org/packages/ec/e6/cef1cf3557f0c54954198554a10016b6a03b2ec9e22a4e1df734936bd99c/scipy-1.17.1-cp311-cp311-macosx_14_0_x86_64.whl", hash = "sha256:766e0dc5a616d026a3a1cffa379af959671729083882f50307e18175797b3dfd", size = 22709533, upload-time = "2026-02-23T00:16:25.791Z" }, + { url = "https://files.pythonhosted.org/packages/4d/60/8804678875fc59362b0fb759ab3ecce1f09c10a735680318ac30da8cd76b/scipy-1.17.1-cp311-cp311-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:744b2bf3640d907b79f3fd7874efe432d1cf171ee721243e350f55234b4cec4c", size = 33062057, upload-time = "2026-02-23T00:16:36.931Z" }, + { url = "https://files.pythonhosted.org/packages/09/7d/af933f0f6e0767995b4e2d705a0665e454d1c19402aa7e895de3951ebb04/scipy-1.17.1-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:43af8d1f3bea642559019edfe64e9b11192a8978efbd1539d7bc2aaa23d92de4", size = 35349300, upload-time = "2026-02-23T00:16:49.108Z" }, + { url = "https://files.pythonhosted.org/packages/b4/3d/7ccbbdcbb54c8fdc20d3b6930137c782a163fa626f0aef920349873421ba/scipy-1.17.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:cd96a1898c0a47be4520327e01f874acfd61fb48a9420f8aa9f6483412ffa444", size = 35127333, upload-time = "2026-02-23T00:17:01.293Z" }, + { url = "https://files.pythonhosted.org/packages/e8/19/f926cb11c42b15ba08e3a71e376d816ac08614f769b4f47e06c3580c836a/scipy-1.17.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:4eb6c25dd62ee8d5edf68a8e1c171dd71c292fdae95d8aeb3dd7d7de4c364082", size = 37741314, upload-time = "2026-02-23T00:17:12.576Z" }, + { url = "https://files.pythonhosted.org/packages/95/da/0d1df507cf574b3f224ccc3d45244c9a1d732c81dcb26b1e8a766ae271a8/scipy-1.17.1-cp311-cp311-win_amd64.whl", hash = "sha256:d30e57c72013c2a4fe441c2fcb8e77b14e152ad48b5464858e07e2ad9fbfceff", size = 36607512, upload-time = "2026-02-23T00:17:23.424Z" }, + { url = "https://files.pythonhosted.org/packages/68/7f/bdd79ceaad24b671543ffe0ef61ed8e659440eb683b66f033454dcee90eb/scipy-1.17.1-cp311-cp311-win_arm64.whl", hash = "sha256:9ecb4efb1cd6e8c4afea0daa91a87fbddbce1b99d2895d151596716c0b2e859d", size = 24599248, upload-time = "2026-02-23T00:17:34.561Z" }, + { url = "https://files.pythonhosted.org/packages/35/48/b992b488d6f299dbe3f11a20b24d3dda3d46f1a635ede1c46b5b17a7b163/scipy-1.17.1-cp312-cp312-macosx_10_14_x86_64.whl", hash = "sha256:35c3a56d2ef83efc372eaec584314bd0ef2e2f0d2adb21c55e6ad5b344c0dcb8", size = 31610954, upload-time = "2026-02-23T00:17:49.855Z" }, + { url = "https://files.pythonhosted.org/packages/b2/02/cf107b01494c19dc100f1d0b7ac3cc08666e96ba2d64db7626066cee895e/scipy-1.17.1-cp312-cp312-macosx_12_0_arm64.whl", hash = "sha256:fcb310ddb270a06114bb64bbe53c94926b943f5b7f0842194d585c65eb4edd76", size = 28172662, upload-time = "2026-02-23T00:18:01.64Z" }, + { url = "https://files.pythonhosted.org/packages/cf/a9/599c28631bad314d219cf9ffd40e985b24d603fc8a2f4ccc5ae8419a535b/scipy-1.17.1-cp312-cp312-macosx_14_0_arm64.whl", hash = "sha256:cc90d2e9c7e5c7f1a482c9875007c095c3194b1cfedca3c2f3291cdc2bc7c086", size = 20344366, upload-time = "2026-02-23T00:18:12.015Z" }, + { url = "https://files.pythonhosted.org/packages/35/f5/906eda513271c8deb5af284e5ef0206d17a96239af79f9fa0aebfe0e36b4/scipy-1.17.1-cp312-cp312-macosx_14_0_x86_64.whl", hash = "sha256:c80be5ede8f3f8eded4eff73cc99a25c388ce98e555b17d31da05287015ffa5b", size = 22704017, upload-time = "2026-02-23T00:18:21.502Z" }, + { url = "https://files.pythonhosted.org/packages/da/34/16f10e3042d2f1d6b66e0428308ab52224b6a23049cb2f5c1756f713815f/scipy-1.17.1-cp312-cp312-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:e19ebea31758fac5893a2ac360fedd00116cbb7628e650842a6691ba7ca28a21", size = 32927842, upload-time = "2026-02-23T00:18:35.367Z" }, + { url = "https://files.pythonhosted.org/packages/01/8e/1e35281b8ab6d5d72ebe9911edcdffa3f36b04ed9d51dec6dd140396e220/scipy-1.17.1-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:02ae3b274fde71c5e92ac4d54bc06c42d80e399fec704383dcd99b301df37458", size = 35235890, upload-time = "2026-02-23T00:18:49.188Z" }, + { url = "https://files.pythonhosted.org/packages/c5/5c/9d7f4c88bea6e0d5a4f1bc0506a53a00e9fcb198de372bfe4d3652cef482/scipy-1.17.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:8a604bae87c6195d8b1045eddece0514d041604b14f2727bbc2b3020172045eb", size = 35003557, upload-time = "2026-02-23T00:18:54.74Z" }, + { url = "https://files.pythonhosted.org/packages/65/94/7698add8f276dbab7a9de9fb6b0e02fc13ee61d51c7c3f85ac28b65e1239/scipy-1.17.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:f590cd684941912d10becc07325a3eeb77886fe981415660d9265c4c418d0bea", size = 37625856, upload-time = "2026-02-23T00:19:00.307Z" }, + { url = "https://files.pythonhosted.org/packages/a2/84/dc08d77fbf3d87d3ee27f6a0c6dcce1de5829a64f2eae85a0ecc1f0daa73/scipy-1.17.1-cp312-cp312-win_amd64.whl", hash = "sha256:41b71f4a3a4cab9d366cd9065b288efc4d4f3c0b37a91a8e0947fb5bd7f31d87", size = 36549682, upload-time = "2026-02-23T00:19:07.67Z" }, + { url = "https://files.pythonhosted.org/packages/bc/98/fe9ae9ffb3b54b62559f52dedaebe204b408db8109a8c66fdd04869e6424/scipy-1.17.1-cp312-cp312-win_arm64.whl", hash = "sha256:f4115102802df98b2b0db3cce5cb9b92572633a1197c77b7553e5203f284a5b3", size = 24547340, upload-time = "2026-02-23T00:19:12.024Z" }, + { url = "https://files.pythonhosted.org/packages/76/27/07ee1b57b65e92645f219b37148a7e7928b82e2b5dbeccecb4dff7c64f0b/scipy-1.17.1-cp313-cp313-macosx_10_14_x86_64.whl", hash = "sha256:5e3c5c011904115f88a39308379c17f91546f77c1667cea98739fe0fccea804c", size = 31590199, upload-time = "2026-02-23T00:19:17.192Z" }, + { url = "https://files.pythonhosted.org/packages/ec/ae/db19f8ab842e9b724bf5dbb7db29302a91f1e55bc4d04b1025d6d605a2c5/scipy-1.17.1-cp313-cp313-macosx_12_0_arm64.whl", hash = "sha256:6fac755ca3d2c3edcb22f479fceaa241704111414831ddd3bc6056e18516892f", size = 28154001, upload-time = "2026-02-23T00:19:22.241Z" }, + { url = "https://files.pythonhosted.org/packages/5b/58/3ce96251560107b381cbd6e8413c483bbb1228a6b919fa8652b0d4090e7f/scipy-1.17.1-cp313-cp313-macosx_14_0_arm64.whl", hash = "sha256:7ff200bf9d24f2e4d5dc6ee8c3ac64d739d3a89e2326ba68aaf6c4a2b838fd7d", size = 20325719, upload-time = "2026-02-23T00:19:26.329Z" }, + { url = "https://files.pythonhosted.org/packages/b2/83/15087d945e0e4d48ce2377498abf5ad171ae013232ae31d06f336e64c999/scipy-1.17.1-cp313-cp313-macosx_14_0_x86_64.whl", hash = "sha256:4b400bdc6f79fa02a4d86640310dde87a21fba0c979efff5248908c6f15fad1b", size = 22683595, upload-time = "2026-02-23T00:19:30.304Z" }, + { url = "https://files.pythonhosted.org/packages/b4/e0/e58fbde4a1a594c8be8114eb4aac1a55bcd6587047efc18a61eb1f5c0d30/scipy-1.17.1-cp313-cp313-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:2b64ca7d4aee0102a97f3ba22124052b4bd2152522355073580bf4845e2550b6", size = 32896429, upload-time = "2026-02-23T00:19:35.536Z" }, + { url = "https://files.pythonhosted.org/packages/f5/5f/f17563f28ff03c7b6799c50d01d5d856a1d55f2676f537ca8d28c7f627cd/scipy-1.17.1-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:581b2264fc0aa555f3f435a5944da7504ea3a065d7029ad60e7c3d1ae09c5464", size = 35203952, upload-time = "2026-02-23T00:19:42.259Z" }, + { url = "https://files.pythonhosted.org/packages/8d/a5/9afd17de24f657fdfe4df9a3f1ea049b39aef7c06000c13db1530d81ccca/scipy-1.17.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:beeda3d4ae615106d7094f7e7cef6218392e4465cc95d25f900bebabfded0950", size = 34979063, upload-time = "2026-02-23T00:19:47.547Z" }, + { url = "https://files.pythonhosted.org/packages/8b/13/88b1d2384b424bf7c924f2038c1c409f8d88bb2a8d49d097861dd64a57b2/scipy-1.17.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:6609bc224e9568f65064cfa72edc0f24ee6655b47575954ec6339534b2798369", size = 37598449, upload-time = "2026-02-23T00:19:53.238Z" }, + { url = "https://files.pythonhosted.org/packages/35/e5/d6d0e51fc888f692a35134336866341c08655d92614f492c6860dc45bb2c/scipy-1.17.1-cp313-cp313-win_amd64.whl", hash = "sha256:37425bc9175607b0268f493d79a292c39f9d001a357bebb6b88fdfaff13f6448", size = 36510943, upload-time = "2026-02-23T00:20:50.89Z" }, + { url = "https://files.pythonhosted.org/packages/2a/fd/3be73c564e2a01e690e19cc618811540ba5354c67c8680dce3281123fb79/scipy-1.17.1-cp313-cp313-win_arm64.whl", hash = "sha256:5cf36e801231b6a2059bf354720274b7558746f3b1a4efb43fcf557ccd484a87", size = 24545621, upload-time = "2026-02-23T00:20:55.871Z" }, + { url = "https://files.pythonhosted.org/packages/6f/6b/17787db8b8114933a66f9dcc479a8272e4b4da75fe03b0c282f7b0ade8cd/scipy-1.17.1-cp313-cp313t-macosx_10_14_x86_64.whl", hash = "sha256:d59c30000a16d8edc7e64152e30220bfbd724c9bbb08368c054e24c651314f0a", size = 31936708, upload-time = "2026-02-23T00:19:58.694Z" }, + { url = "https://files.pythonhosted.org/packages/38/2e/524405c2b6392765ab1e2b722a41d5da33dc5c7b7278184a8ad29b6cb206/scipy-1.17.1-cp313-cp313t-macosx_12_0_arm64.whl", hash = "sha256:010f4333c96c9bb1a4516269e33cb5917b08ef2166d5556ca2fd9f082a9e6ea0", size = 28570135, upload-time = "2026-02-23T00:20:03.934Z" }, + { url = "https://files.pythonhosted.org/packages/fd/c3/5bd7199f4ea8556c0c8e39f04ccb014ac37d1468e6cfa6a95c6b3562b76e/scipy-1.17.1-cp313-cp313t-macosx_14_0_arm64.whl", hash = "sha256:2ceb2d3e01c5f1d83c4189737a42d9cb2fc38a6eeed225e7515eef71ad301dce", size = 20741977, upload-time = "2026-02-23T00:20:07.935Z" }, + { url = "https://files.pythonhosted.org/packages/d9/b8/8ccd9b766ad14c78386599708eb745f6b44f08400a5fd0ade7cf89b6fc93/scipy-1.17.1-cp313-cp313t-macosx_14_0_x86_64.whl", hash = "sha256:844e165636711ef41f80b4103ed234181646b98a53c8f05da12ca5ca289134f6", size = 23029601, upload-time = "2026-02-23T00:20:12.161Z" }, + { url = "https://files.pythonhosted.org/packages/6d/a0/3cb6f4d2fb3e17428ad2880333cac878909ad1a89f678527b5328b93c1d4/scipy-1.17.1-cp313-cp313t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:158dd96d2207e21c966063e1635b1063cd7787b627b6f07305315dd73d9c679e", size = 33019667, upload-time = "2026-02-23T00:20:17.208Z" }, + { url = "https://files.pythonhosted.org/packages/f3/c3/2d834a5ac7bf3a0c806ad1508efc02dda3c8c61472a56132d7894c312dea/scipy-1.17.1-cp313-cp313t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:74cbb80d93260fe2ffa334efa24cb8f2f0f622a9b9febf8b483c0b865bfb3475", size = 35264159, upload-time = "2026-02-23T00:20:23.087Z" }, + { url = "https://files.pythonhosted.org/packages/4d/77/d3ed4becfdbd217c52062fafe35a72388d1bd82c2d0ba5ca19d6fcc93e11/scipy-1.17.1-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:dbc12c9f3d185f5c737d801da555fb74b3dcfa1a50b66a1a93e09190f41fab50", size = 35102771, upload-time = "2026-02-23T00:20:28.636Z" }, + { url = "https://files.pythonhosted.org/packages/bd/12/d19da97efde68ca1ee5538bb261d5d2c062f0c055575128f11a2730e3ac1/scipy-1.17.1-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:94055a11dfebe37c656e70317e1996dc197e1a15bbcc351bcdd4610e128fe1ca", size = 37665910, upload-time = "2026-02-23T00:20:34.743Z" }, + { url = "https://files.pythonhosted.org/packages/06/1c/1172a88d507a4baaf72c5a09bb6c018fe2ae0ab622e5830b703a46cc9e44/scipy-1.17.1-cp313-cp313t-win_amd64.whl", hash = "sha256:e30bdeaa5deed6bc27b4cc490823cd0347d7dae09119b8803ae576ea0ce52e4c", size = 36562980, upload-time = "2026-02-23T00:20:40.575Z" }, + { url = "https://files.pythonhosted.org/packages/70/b0/eb757336e5a76dfa7911f63252e3b7d1de00935d7705cf772db5b45ec238/scipy-1.17.1-cp313-cp313t-win_arm64.whl", hash = "sha256:a720477885a9d2411f94a93d16f9d89bad0f28ca23c3f8daa521e2dcc3f44d49", size = 24856543, upload-time = "2026-02-23T00:20:45.313Z" }, + { url = "https://files.pythonhosted.org/packages/cf/83/333afb452af6f0fd70414dc04f898647ee1423979ce02efa75c3b0f2c28e/scipy-1.17.1-cp314-cp314-macosx_10_14_x86_64.whl", hash = "sha256:a48a72c77a310327f6a3a920092fa2b8fd03d7deaa60f093038f22d98e096717", size = 31584510, upload-time = "2026-02-23T00:21:01.015Z" }, + { url = "https://files.pythonhosted.org/packages/ed/a6/d05a85fd51daeb2e4ea71d102f15b34fedca8e931af02594193ae4fd25f7/scipy-1.17.1-cp314-cp314-macosx_12_0_arm64.whl", hash = "sha256:45abad819184f07240d8a696117a7aacd39787af9e0b719d00285549ed19a1e9", size = 28170131, upload-time = "2026-02-23T00:21:05.888Z" }, + { url = "https://files.pythonhosted.org/packages/db/7b/8624a203326675d7746a254083a187398090a179335b2e4a20e2ddc46e83/scipy-1.17.1-cp314-cp314-macosx_14_0_arm64.whl", hash = "sha256:3fd1fcdab3ea951b610dc4cef356d416d5802991e7e32b5254828d342f7b7e0b", size = 20342032, upload-time = "2026-02-23T00:21:09.904Z" }, + { url = "https://files.pythonhosted.org/packages/c9/35/2c342897c00775d688d8ff3987aced3426858fd89d5a0e26e020b660b301/scipy-1.17.1-cp314-cp314-macosx_14_0_x86_64.whl", hash = "sha256:7bdf2da170b67fdf10bca777614b1c7d96ae3ca5794fd9587dce41eb2966e866", size = 22678766, upload-time = "2026-02-23T00:21:14.313Z" }, + { url = "https://files.pythonhosted.org/packages/ef/f2/7cdb8eb308a1a6ae1e19f945913c82c23c0c442a462a46480ce487fdc0ac/scipy-1.17.1-cp314-cp314-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:adb2642e060a6549c343603a3851ba76ef0b74cc8c079a9a58121c7ec9fe2350", size = 32957007, upload-time = "2026-02-23T00:21:19.663Z" }, + { url = "https://files.pythonhosted.org/packages/0b/2e/7eea398450457ecb54e18e9d10110993fa65561c4f3add5e8eccd2b9cd41/scipy-1.17.1-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:eee2cfda04c00a857206a4330f0c5e3e56535494e30ca445eb19ec624ae75118", size = 35221333, upload-time = "2026-02-23T00:21:25.278Z" }, + { url = "https://files.pythonhosted.org/packages/d9/77/5b8509d03b77f093a0d52e606d3c4f79e8b06d1d38c441dacb1e26cacf46/scipy-1.17.1-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:d2650c1fb97e184d12d8ba010493ee7b322864f7d3d00d3f9bb97d9c21de4068", size = 35042066, upload-time = "2026-02-23T00:21:31.358Z" }, + { url = "https://files.pythonhosted.org/packages/f9/df/18f80fb99df40b4070328d5ae5c596f2f00fffb50167e31439e932f29e7d/scipy-1.17.1-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:08b900519463543aa604a06bec02461558a6e1cef8fdbb8098f77a48a83c8118", size = 37612763, upload-time = "2026-02-23T00:21:37.247Z" }, + { url = "https://files.pythonhosted.org/packages/4b/39/f0e8ea762a764a9dc52aa7dabcfad51a354819de1f0d4652b6a1122424d6/scipy-1.17.1-cp314-cp314-win_amd64.whl", hash = "sha256:3877ac408e14da24a6196de0ddcace62092bfc12a83823e92e49e40747e52c19", size = 37290984, upload-time = "2026-02-23T00:22:35.023Z" }, + { url = "https://files.pythonhosted.org/packages/7c/56/fe201e3b0f93d1a8bcf75d3379affd228a63d7e2d80ab45467a74b494947/scipy-1.17.1-cp314-cp314-win_arm64.whl", hash = "sha256:f8885db0bc2bffa59d5c1b72fad7a6a92d3e80e7257f967dd81abb553a90d293", size = 25192877, upload-time = "2026-02-23T00:22:39.798Z" }, + { url = "https://files.pythonhosted.org/packages/96/ad/f8c414e121f82e02d76f310f16db9899c4fcde36710329502a6b2a3c0392/scipy-1.17.1-cp314-cp314t-macosx_10_14_x86_64.whl", hash = "sha256:1cc682cea2ae55524432f3cdff9e9a3be743d52a7443d0cba9017c23c87ae2f6", size = 31949750, upload-time = "2026-02-23T00:21:42.289Z" }, + { url = "https://files.pythonhosted.org/packages/7c/b0/c741e8865d61b67c81e255f4f0a832846c064e426636cd7de84e74d209be/scipy-1.17.1-cp314-cp314t-macosx_12_0_arm64.whl", hash = "sha256:2040ad4d1795a0ae89bfc7e8429677f365d45aa9fd5e4587cf1ea737f927b4a1", size = 28585858, upload-time = "2026-02-23T00:21:47.706Z" }, + { url = "https://files.pythonhosted.org/packages/ed/1b/3985219c6177866628fa7c2595bfd23f193ceebbe472c98a08824b9466ff/scipy-1.17.1-cp314-cp314t-macosx_14_0_arm64.whl", hash = "sha256:131f5aaea57602008f9822e2115029b55d4b5f7c070287699fe45c661d051e39", size = 20757723, upload-time = "2026-02-23T00:21:52.039Z" }, + { url = "https://files.pythonhosted.org/packages/c0/19/2a04aa25050d656d6f7b9e7b685cc83d6957fb101665bfd9369ca6534563/scipy-1.17.1-cp314-cp314t-macosx_14_0_x86_64.whl", hash = "sha256:9cdc1a2fcfd5c52cfb3045feb399f7b3ce822abdde3a193a6b9a60b3cb5854ca", size = 23043098, upload-time = "2026-02-23T00:21:56.185Z" }, + { url = "https://files.pythonhosted.org/packages/86/f1/3383beb9b5d0dbddd030335bf8a8b32d4317185efe495374f134d8be6cce/scipy-1.17.1-cp314-cp314t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6e3dcd57ab780c741fde8dc68619de988b966db759a3c3152e8e9142c26295ad", size = 33030397, upload-time = "2026-02-23T00:22:01.404Z" }, + { url = "https://files.pythonhosted.org/packages/41/68/8f21e8a65a5a03f25a79165ec9d2b28c00e66dc80546cf5eb803aeeff35b/scipy-1.17.1-cp314-cp314t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:a9956e4d4f4a301ebf6cde39850333a6b6110799d470dbbb1e25326ac447f52a", size = 35281163, upload-time = "2026-02-23T00:22:07.024Z" }, + { url = "https://files.pythonhosted.org/packages/84/8d/c8a5e19479554007a5632ed7529e665c315ae7492b4f946b0deb39870e39/scipy-1.17.1-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:a4328d245944d09fd639771de275701ccadf5f781ba0ff092ad141e017eccda4", size = 35116291, upload-time = "2026-02-23T00:22:12.585Z" }, + { url = "https://files.pythonhosted.org/packages/52/52/e57eceff0e342a1f50e274264ed47497b59e6a4e3118808ee58ddda7b74a/scipy-1.17.1-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:a77cbd07b940d326d39a1d1b37817e2ee4d79cb30e7338f3d0cddffae70fcaa2", size = 37682317, upload-time = "2026-02-23T00:22:18.513Z" }, + { url = "https://files.pythonhosted.org/packages/11/2f/b29eafe4a3fbc3d6de9662b36e028d5f039e72d345e05c250e121a230dd4/scipy-1.17.1-cp314-cp314t-win_amd64.whl", hash = "sha256:eb092099205ef62cd1782b006658db09e2fed75bffcae7cc0d44052d8aa0f484", size = 37345327, upload-time = "2026-02-23T00:22:24.442Z" }, + { url = "https://files.pythonhosted.org/packages/07/39/338d9219c4e87f3e708f18857ecd24d22a0c3094752393319553096b98af/scipy-1.17.1-cp314-cp314t-win_arm64.whl", hash = "sha256:200e1050faffacc162be6a486a984a0497866ec54149a01270adc8a59b7c7d21", size = 25489165, upload-time = "2026-02-23T00:22:29.563Z" }, +] + +[[package]] +name = "sentencepiece" +version = "0.2.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/15/15/2e7a025fc62d764b151ae6d0f2a92f8081755ebe8d4a64099accc6f77ba6/sentencepiece-0.2.1.tar.gz", hash = "sha256:8138cec27c2f2282f4a34d9a016e3374cd40e5c6e9cb335063db66a0a3b71fad", size = 3228515, upload-time = "2025-08-12T07:00:51.718Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/af/31/5b7cccb307b485db1a2372d6d2980b0a65d067f8be5ca943a103b4acd5b3/sentencepiece-0.2.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:e10fa50bdbaa5e2445dbd387979980d391760faf0ec99a09bd7780ff37eaec44", size = 1942557, upload-time = "2025-08-12T06:59:12.379Z" }, + { url = "https://files.pythonhosted.org/packages/1f/41/0ac923a8e685ad290c5afc8ae55c5844977b8d75076fcc04302b9a324274/sentencepiece-0.2.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:2f27ae6deea72efdb6f361750c92f6c21fd0ad087445082770cc34015213c526", size = 1325384, upload-time = "2025-08-12T06:59:14.334Z" }, + { url = "https://files.pythonhosted.org/packages/fc/ef/3751555d67daf9003384978f169d31c775cb5c7baf28633caaf1eb2b2b4d/sentencepiece-0.2.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:60937c959e6f44159fdd9f56fbdd302501f96114a5ba436829496d5f32d8de3f", size = 1253317, upload-time = "2025-08-12T06:59:16.247Z" }, + { url = "https://files.pythonhosted.org/packages/46/a5/742c69b7bd144eb32b6e5fd50dbd8abbbc7a95fce2fe16e50156fa400e3b/sentencepiece-0.2.1-cp310-cp310-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:d8b1d91545578852f128650b8cce4ec20f93d39b378ff554ebe66290f2dabb92", size = 1316379, upload-time = "2025-08-12T06:59:17.825Z" }, + { url = "https://files.pythonhosted.org/packages/c8/89/8deeafbba2871e8fa10f20f17447786f4ac38085925335728d360eaf4cae/sentencepiece-0.2.1-cp310-cp310-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:27e38eee653abc3d387862e67bc5c8b6f428cd604e688b85d29170b7e725c26c", size = 1387926, upload-time = "2025-08-12T06:59:19.395Z" }, + { url = "https://files.pythonhosted.org/packages/c3/ca/67fe73005f0ab617c6a970b199754e28e524b6873aa7025224fad3cda252/sentencepiece-0.2.1-cp310-cp310-win32.whl", hash = "sha256:251874d720ac7f28024a168501f3c7bb15d1802245f6e66de565f18bbb9b5eaa", size = 999550, upload-time = "2025-08-12T06:59:20.844Z" }, + { url = "https://files.pythonhosted.org/packages/6d/33/dc5b54042050d2dda4229c3ce1f862541c99966390b6aa20f54d520d2dc2/sentencepiece-0.2.1-cp310-cp310-win_amd64.whl", hash = "sha256:e52144670738b4b477fade6c2a9b6af71a8d0094514c9853ac9f6fc1fcfabae7", size = 1054613, upload-time = "2025-08-12T06:59:22.255Z" }, + { url = "https://files.pythonhosted.org/packages/fa/19/1ea47f46ff97fe04422b78997da1a37cd632f414aae042d27a9009c5b733/sentencepiece-0.2.1-cp310-cp310-win_arm64.whl", hash = "sha256:9076430ac25dfa7147d9d05751dbc66a04bc1aaac371c07f84952979ea59f0d0", size = 1033884, upload-time = "2025-08-12T06:59:24.194Z" }, + { url = "https://files.pythonhosted.org/packages/d8/15/46afbab00733d81788b64be430ca1b93011bb9388527958e26cc31832de5/sentencepiece-0.2.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:6356d0986b8b8dc351b943150fcd81a1c6e6e4d439772e8584c64230e58ca987", size = 1942560, upload-time = "2025-08-12T06:59:25.82Z" }, + { url = "https://files.pythonhosted.org/packages/fa/79/7c01b8ef98a0567e9d84a4e7a910f8e7074fcbf398a5cd76f93f4b9316f9/sentencepiece-0.2.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:8f8ba89a3acb3dc1ae90f65ec1894b0b9596fdb98ab003ff38e058f898b39bc7", size = 1325385, upload-time = "2025-08-12T06:59:27.722Z" }, + { url = "https://files.pythonhosted.org/packages/bb/88/2b41e07bd24f33dcf2f18ec3b74247aa4af3526bad8907b8727ea3caba03/sentencepiece-0.2.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:02593eca45440ef39247cee8c47322a34bdcc1d8ae83ad28ba5a899a2cf8d79a", size = 1253319, upload-time = "2025-08-12T06:59:29.306Z" }, + { url = "https://files.pythonhosted.org/packages/a0/54/38a1af0c6210a3c6f95aa46d23d6640636d020fba7135cd0d9a84ada05a7/sentencepiece-0.2.1-cp311-cp311-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:0a0d15781a171d188b661ae4bde1d998c303f6bd8621498c50c671bd45a4798e", size = 1316162, upload-time = "2025-08-12T06:59:30.914Z" }, + { url = "https://files.pythonhosted.org/packages/ef/66/fb191403ade791ad2c3c1e72fe8413e63781b08cfa3aa4c9dfc536d6e795/sentencepiece-0.2.1-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:4f5a3e0d9f445ed9d66c0fec47d4b23d12cfc858b407a03c194c1b26c2ac2a63", size = 1387785, upload-time = "2025-08-12T06:59:32.491Z" }, + { url = "https://files.pythonhosted.org/packages/a9/2d/3bd9b08e70067b2124518b308db6a84a4f8901cc8a4317e2e4288cdd9b4d/sentencepiece-0.2.1-cp311-cp311-win32.whl", hash = "sha256:6d297a1748d429ba8534eebe5535448d78b8acc32d00a29b49acf28102eeb094", size = 999555, upload-time = "2025-08-12T06:59:34.475Z" }, + { url = "https://files.pythonhosted.org/packages/32/b8/f709977f5fda195ae1ea24f24e7c581163b6f142b1005bc3d0bbfe4d7082/sentencepiece-0.2.1-cp311-cp311-win_amd64.whl", hash = "sha256:82d9ead6591015f009cb1be1cb1c015d5e6f04046dbb8c9588b931e869a29728", size = 1054617, upload-time = "2025-08-12T06:59:36.461Z" }, + { url = "https://files.pythonhosted.org/packages/7a/40/a1fc23be23067da0f703709797b464e8a30a1c78cc8a687120cd58d4d509/sentencepiece-0.2.1-cp311-cp311-win_arm64.whl", hash = "sha256:39f8651bd10974eafb9834ce30d9bcf5b73e1fc798a7f7d2528f9820ca86e119", size = 1033877, upload-time = "2025-08-12T06:59:38.391Z" }, + { url = "https://files.pythonhosted.org/packages/4a/be/32ce495aa1d0e0c323dcb1ba87096037358edee539cac5baf8755a6bd396/sentencepiece-0.2.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:57cae326c8727de58c85977b175af132a7138d84c764635d7e71bbee7e774133", size = 1943152, upload-time = "2025-08-12T06:59:40.048Z" }, + { url = "https://files.pythonhosted.org/packages/88/7e/ff23008899a58678e98c6ff592bf4d368eee5a71af96d0df6b38a039dd4f/sentencepiece-0.2.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:56dd39a3c4d6493db3cdca7e8cc68c6b633f0d4195495cbadfcf5af8a22d05a6", size = 1325651, upload-time = "2025-08-12T06:59:41.536Z" }, + { url = "https://files.pythonhosted.org/packages/19/84/42eb3ce4796777a1b5d3699dfd4dca85113e68b637f194a6c8d786f16a04/sentencepiece-0.2.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:d9381351182ff9888cc80e41c632e7e274b106f450de33d67a9e8f6043da6f76", size = 1253645, upload-time = "2025-08-12T06:59:42.903Z" }, + { url = "https://files.pythonhosted.org/packages/89/fa/d3d5ebcba3cb9e6d3775a096251860c41a6bc53a1b9461151df83fe93255/sentencepiece-0.2.1-cp312-cp312-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:99f955df238021bf11f0fc37cdb54fd5e5b5f7fd30ecc3d93fb48b6815437167", size = 1316273, upload-time = "2025-08-12T06:59:44.476Z" }, + { url = "https://files.pythonhosted.org/packages/04/88/14f2f4a2b922d8b39be45bf63d79e6cd3a9b2f248b2fcb98a69b12af12f5/sentencepiece-0.2.1-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:0cdfecef430d985f1c2bcbfff3defd1d95dae876fbd0173376012d2d7d24044b", size = 1387881, upload-time = "2025-08-12T06:59:46.09Z" }, + { url = "https://files.pythonhosted.org/packages/fd/b8/903e5ccb77b4ef140605d5d71b4f9e0ad95d456d6184688073ed11712809/sentencepiece-0.2.1-cp312-cp312-win32.whl", hash = "sha256:a483fd29a34c3e34c39ac5556b0a90942bec253d260235729e50976f5dba1068", size = 999540, upload-time = "2025-08-12T06:59:48.023Z" }, + { url = "https://files.pythonhosted.org/packages/2d/81/92df5673c067148c2545b1bfe49adfd775bcc3a169a047f5a0e6575ddaca/sentencepiece-0.2.1-cp312-cp312-win_amd64.whl", hash = "sha256:4cdc7c36234fda305e85c32949c5211faaf8dd886096c7cea289ddc12a2d02de", size = 1054671, upload-time = "2025-08-12T06:59:49.895Z" }, + { url = "https://files.pythonhosted.org/packages/fe/02/c5e3bc518655d714622bec87d83db9cdba1cd0619a4a04e2109751c4f47f/sentencepiece-0.2.1-cp312-cp312-win_arm64.whl", hash = "sha256:daeb5e9e9fcad012324807856113708614d534f596d5008638eb9b40112cd9e4", size = 1033923, upload-time = "2025-08-12T06:59:51.952Z" }, + { url = "https://files.pythonhosted.org/packages/ba/4a/85fbe1706d4d04a7e826b53f327c4b80f849cf1c7b7c5e31a20a97d8f28b/sentencepiece-0.2.1-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:dcd8161eee7b41aae57ded06272905dbd680a0a04b91edd0f64790c796b2f706", size = 1943150, upload-time = "2025-08-12T06:59:53.588Z" }, + { url = "https://files.pythonhosted.org/packages/c2/83/4cfb393e287509fc2155480b9d184706ef8d9fa8cbf5505d02a5792bf220/sentencepiece-0.2.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:c6c8f42949f419ff8c7e9960dbadcfbc982d7b5efc2f6748210d3dd53a7de062", size = 1325651, upload-time = "2025-08-12T06:59:55.073Z" }, + { url = "https://files.pythonhosted.org/packages/8d/de/5a007fb53b1ab0aafc69d11a5a3dd72a289d5a3e78dcf2c3a3d9b14ffe93/sentencepiece-0.2.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:097f3394e99456e9e4efba1737c3749d7e23563dd1588ce71a3d007f25475fff", size = 1253641, upload-time = "2025-08-12T06:59:56.562Z" }, + { url = "https://files.pythonhosted.org/packages/2c/d2/f552be5928105588f4f4d66ee37dd4c61460d8097e62d0e2e0eec41bc61d/sentencepiece-0.2.1-cp313-cp313-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:d7b670879c370d350557edabadbad1f6561a9e6968126e6debca4029e5547820", size = 1316271, upload-time = "2025-08-12T06:59:58.109Z" }, + { url = "https://files.pythonhosted.org/packages/96/df/0cfe748ace5485be740fed9476dee7877f109da32ed0d280312c94ec259f/sentencepiece-0.2.1-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:c7f0fd2f2693309e6628aeeb2e2faf6edd221134dfccac3308ca0de01f8dab47", size = 1387882, upload-time = "2025-08-12T07:00:00.701Z" }, + { url = "https://files.pythonhosted.org/packages/ac/dd/f7774d42a881ced8e1739f393ab1e82ece39fc9abd4779e28050c2e975b5/sentencepiece-0.2.1-cp313-cp313-win32.whl", hash = "sha256:92b3816aa2339355fda2c8c4e021a5de92180b00aaccaf5e2808972e77a4b22f", size = 999541, upload-time = "2025-08-12T07:00:02.709Z" }, + { url = "https://files.pythonhosted.org/packages/dd/e9/932b9eae6fd7019548321eee1ab8d5e3b3d1294df9d9a0c9ac517c7b636d/sentencepiece-0.2.1-cp313-cp313-win_amd64.whl", hash = "sha256:10ed3dab2044c47f7a2e7b4969b0c430420cdd45735d78c8f853191fa0e3148b", size = 1054669, upload-time = "2025-08-12T07:00:04.915Z" }, + { url = "https://files.pythonhosted.org/packages/c9/3a/76488a00ea7d6931689cda28726a1447d66bf1a4837943489314593d5596/sentencepiece-0.2.1-cp313-cp313-win_arm64.whl", hash = "sha256:ac650534e2251083c5f75dde4ff28896ce7c8904133dc8fef42780f4d5588fcd", size = 1033922, upload-time = "2025-08-12T07:00:06.496Z" }, + { url = "https://files.pythonhosted.org/packages/4a/b6/08fe2ce819e02ccb0296f4843e3f195764ce9829cbda61b7513f29b95718/sentencepiece-0.2.1-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:8dd4b477a7b069648d19363aad0cab9bad2f4e83b2d179be668efa672500dc94", size = 1946052, upload-time = "2025-08-12T07:00:08.136Z" }, + { url = "https://files.pythonhosted.org/packages/ab/d9/1ea0e740591ff4c6fc2b6eb1d7510d02f3fb885093f19b2f3abd1363b402/sentencepiece-0.2.1-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:0c0f672da370cc490e4c59d89e12289778310a0e71d176c541e4834759e1ae07", size = 1327408, upload-time = "2025-08-12T07:00:09.572Z" }, + { url = "https://files.pythonhosted.org/packages/99/7e/1fb26e8a21613f6200e1ab88824d5d203714162cf2883248b517deb500b7/sentencepiece-0.2.1-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:ad8493bea8432dae8d6830365352350f3b4144415a1d09c4c8cb8d30cf3b6c3c", size = 1254857, upload-time = "2025-08-12T07:00:11.021Z" }, + { url = "https://files.pythonhosted.org/packages/bc/85/c72fd1f3c7a6010544d6ae07f8ddb38b5e2a7e33bd4318f87266c0bbafbf/sentencepiece-0.2.1-cp313-cp313t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b81a24733726e3678d2db63619acc5a8dccd074f7aa7a54ecd5ca33ca6d2d596", size = 1315722, upload-time = "2025-08-12T07:00:12.989Z" }, + { url = "https://files.pythonhosted.org/packages/4a/e8/661e5bd82a8aa641fd6c1020bd0e890ef73230a2b7215ddf9c8cd8e941c2/sentencepiece-0.2.1-cp313-cp313t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:0a81799d0a68d618e89063fb423c3001a034c893069135ffe51fee439ae474d6", size = 1387452, upload-time = "2025-08-12T07:00:15.088Z" }, + { url = "https://files.pythonhosted.org/packages/99/5e/ae66c361023a470afcbc1fbb8da722c72ea678a2fcd9a18f1a12598c7501/sentencepiece-0.2.1-cp313-cp313t-win32.whl", hash = "sha256:89a3ea015517c42c0341d0d962f3e6aaf2cf10d71b1932d475c44ba48d00aa2b", size = 1002501, upload-time = "2025-08-12T07:00:16.966Z" }, + { url = "https://files.pythonhosted.org/packages/c1/03/d332828c4ff764e16c1b56c2c8f9a33488bbe796b53fb6b9c4205ddbf167/sentencepiece-0.2.1-cp313-cp313t-win_amd64.whl", hash = "sha256:33f068c9382dc2e7c228eedfd8163b52baa86bb92f50d0488bf2b7da7032e484", size = 1057555, upload-time = "2025-08-12T07:00:18.573Z" }, + { url = "https://files.pythonhosted.org/packages/88/14/5aee0bf0864df9bd82bd59e7711362908e4935e3f9cdc1f57246b5d5c9b9/sentencepiece-0.2.1-cp313-cp313t-win_arm64.whl", hash = "sha256:b3616ad246f360e52c85781e47682d31abfb6554c779e42b65333d4b5f44ecc0", size = 1036042, upload-time = "2025-08-12T07:00:20.209Z" }, + { url = "https://files.pythonhosted.org/packages/24/9c/89eb8b2052f720a612478baf11c8227dcf1dc28cd4ea4c0c19506b5af2a2/sentencepiece-0.2.1-cp314-cp314-macosx_10_13_universal2.whl", hash = "sha256:5d0350b686c320068702116276cfb26c066dc7e65cfef173980b11bb4d606719", size = 1943147, upload-time = "2025-08-12T07:00:21.809Z" }, + { url = "https://files.pythonhosted.org/packages/82/0b/a1432bc87f97c2ace36386ca23e8bd3b91fb40581b5e6148d24b24186419/sentencepiece-0.2.1-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:c7f54a31cde6fa5cb030370566f68152a742f433f8d2be458463d06c208aef33", size = 1325624, upload-time = "2025-08-12T07:00:23.289Z" }, + { url = "https://files.pythonhosted.org/packages/ea/99/bbe054ebb5a5039457c590e0a4156ed073fb0fe9ce4f7523404dd5b37463/sentencepiece-0.2.1-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:c83b85ab2d6576607f31df77ff86f28182be4a8de6d175d2c33ca609925f5da1", size = 1253670, upload-time = "2025-08-12T07:00:24.69Z" }, + { url = "https://files.pythonhosted.org/packages/19/ad/d5c7075f701bd97971d7c2ac2904f227566f51ef0838dfbdfdccb58cd212/sentencepiece-0.2.1-cp314-cp314-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:1855f57db07b51fb51ed6c9c452f570624d2b169b36f0f79ef71a6e6c618cd8b", size = 1316247, upload-time = "2025-08-12T07:00:26.435Z" }, + { url = "https://files.pythonhosted.org/packages/fb/03/35fbe5f3d9a7435eebd0b473e09584bd3cc354ce118b960445b060d33781/sentencepiece-0.2.1-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:01e6912125cb45d3792f530a4d38f8e21bf884d6b4d4ade1b2de5cf7a8d2a52b", size = 1387894, upload-time = "2025-08-12T07:00:28.339Z" }, + { url = "https://files.pythonhosted.org/packages/dc/aa/956ef729aafb6c8f9c443104c9636489093bb5c61d6b90fc27aa1a865574/sentencepiece-0.2.1-cp314-cp314-win32.whl", hash = "sha256:c415c9de1447e0a74ae3fdb2e52f967cb544113a3a5ce3a194df185cbc1f962f", size = 1096698, upload-time = "2025-08-12T07:00:29.764Z" }, + { url = "https://files.pythonhosted.org/packages/b8/cb/fe400d8836952cc535c81a0ce47dc6875160e5fedb71d2d9ff0e9894c2a6/sentencepiece-0.2.1-cp314-cp314-win_amd64.whl", hash = "sha256:881b2e44b14fc19feade3cbed314be37de639fc415375cefaa5bc81a4be137fd", size = 1155115, upload-time = "2025-08-12T07:00:32.865Z" }, + { url = "https://files.pythonhosted.org/packages/32/89/047921cf70f36c7b6b6390876b2399b3633ab73b8d0cb857e5a964238941/sentencepiece-0.2.1-cp314-cp314-win_arm64.whl", hash = "sha256:2005242a16d2dc3ac5fe18aa7667549134d37854823df4c4db244752453b78a8", size = 1133890, upload-time = "2025-08-12T07:00:34.763Z" }, + { url = "https://files.pythonhosted.org/packages/a1/11/5b414b9fae6255b5fb1e22e2ed3dc3a72d3a694e5703910e640ac78346bb/sentencepiece-0.2.1-cp314-cp314t-macosx_10_13_universal2.whl", hash = "sha256:a19adcec27c524cb7069a1c741060add95f942d1cbf7ad0d104dffa0a7d28a2b", size = 1946081, upload-time = "2025-08-12T07:00:36.97Z" }, + { url = "https://files.pythonhosted.org/packages/77/eb/7a5682bb25824db8545f8e5662e7f3e32d72a508fdce086029d89695106b/sentencepiece-0.2.1-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:e37e4b4c4a11662b5db521def4e44d4d30ae69a1743241412a93ae40fdcab4bb", size = 1327406, upload-time = "2025-08-12T07:00:38.669Z" }, + { url = "https://files.pythonhosted.org/packages/03/b0/811dae8fb9f2784e138785d481469788f2e0d0c109c5737372454415f55f/sentencepiece-0.2.1-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:477c81505db072b3ab627e7eab972ea1025331bd3a92bacbf798df2b75ea86ec", size = 1254846, upload-time = "2025-08-12T07:00:40.611Z" }, + { url = "https://files.pythonhosted.org/packages/ef/23/195b2e7ec85ebb6a547969f60b723c7aca5a75800ece6cc3f41da872d14e/sentencepiece-0.2.1-cp314-cp314t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:010f025a544ef770bb395091d57cb94deb9652d8972e0d09f71d85d5a0816c8c", size = 1315721, upload-time = "2025-08-12T07:00:42.914Z" }, + { url = "https://files.pythonhosted.org/packages/7e/aa/553dbe4178b5f23eb28e59393dddd64186178b56b81d9b8d5c3ff1c28395/sentencepiece-0.2.1-cp314-cp314t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:733e59ff1794d26db706cd41fc2d7ca5f6c64a820709cb801dc0ea31780d64ab", size = 1387458, upload-time = "2025-08-12T07:00:44.56Z" }, + { url = "https://files.pythonhosted.org/packages/66/7c/08ff0012507297a4dd74a5420fdc0eb9e3e80f4e88cab1538d7f28db303d/sentencepiece-0.2.1-cp314-cp314t-win32.whl", hash = "sha256:d3233770f78e637dc8b1fda2cd7c3b99ec77e7505041934188a4e7fe751de3b0", size = 1099765, upload-time = "2025-08-12T07:00:46.058Z" }, + { url = "https://files.pythonhosted.org/packages/91/d5/2a69e1ce15881beb9ddfc7e3f998322f5cedcd5e4d244cb74dade9441663/sentencepiece-0.2.1-cp314-cp314t-win_amd64.whl", hash = "sha256:5e4366c97b68218fd30ea72d70c525e6e78a6c0a88650f57ac4c43c63b234a9d", size = 1157807, upload-time = "2025-08-12T07:00:47.673Z" }, + { url = "https://files.pythonhosted.org/packages/f3/16/54f611fcfc2d1c46cbe3ec4169780b2cfa7cf63708ef2b71611136db7513/sentencepiece-0.2.1-cp314-cp314t-win_arm64.whl", hash = "sha256:105e36e75cbac1292642045458e8da677b2342dcd33df503e640f0b457cb6751", size = 1136264, upload-time = "2025-08-12T07:00:49.485Z" }, +] + +[[package]] +name = "setuptools" +version = "82.0.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/4f/db/cfac1baf10650ab4d1c111714410d2fbb77ac5a616db26775db562c8fab2/setuptools-82.0.1.tar.gz", hash = "sha256:7d872682c5d01cfde07da7bccc7b65469d3dca203318515ada1de5eda35efbf9", size = 1152316, upload-time = "2026-03-09T12:47:17.221Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/9d/76/f789f7a86709c6b087c5a2f52f911838cad707cc613162401badc665acfe/setuptools-82.0.1-py3-none-any.whl", hash = "sha256:a59e362652f08dcd477c78bb6e7bd9d80a7995bc73ce773050228a348ce2e5bb", size = 1006223, upload-time = "2026-03-09T12:47:15.026Z" }, +] + +[[package]] +name = "shellingham" +version = "1.5.4" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/58/15/8b3609fd3830ef7b27b655beb4b4e9c62313a4e8da8c676e142cc210d58e/shellingham-1.5.4.tar.gz", hash = "sha256:8dbca0739d487e5bd35ab3ca4b36e11c4078f3a234bfce294b0a0291363404de", size = 10310, upload-time = "2023-10-24T04:13:40.426Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/e0/f9/0595336914c5619e5f28a1fb793285925a8cd4b432c9da0a987836c7f822/shellingham-1.5.4-py2.py3-none-any.whl", hash = "sha256:7ecfff8f2fd72616f7481040475a65b2bf8af90a56c89140852d1120324e8686", size = 9755, upload-time = "2023-10-24T04:13:38.866Z" }, +] + +[[package]] +name = "six" +version = "1.17.0" +source = { registry = "https://pypi.org/simple" } +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" } +wheels = [ + { 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" }, +] + +[[package]] +name = "sortedcontainers" +version = "2.4.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/e8/c4/ba2f8066cceb6f23394729afe52f3bf7adec04bf9ed2c820b39e19299111/sortedcontainers-2.4.0.tar.gz", hash = "sha256:25caa5a06cc30b6b83d11423433f65d1f9d76c4c6a0c90e3379eaa43b9bfdb88", size = 30594, upload-time = "2021-05-16T22:03:42.897Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/32/46/9cb0e58b2deb7f82b84065f37f3bffeb12413f947f9388e4cac22c4621ce/sortedcontainers-2.4.0-py2.py3-none-any.whl", hash = "sha256:a163dcaede0f1c021485e957a39245190e74249897e2ae4b2aa38595db237ee0", size = 29575, upload-time = "2021-05-16T22:03:41.177Z" }, +] + +[[package]] +name = "soundfile" +version = "0.13.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "cffi" }, + { name = "numpy", version = "2.2.6", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, + { name = "numpy", version = "2.4.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/e1/41/9b873a8c055582859b239be17902a85339bec6a30ad162f98c9b0288a2cc/soundfile-0.13.1.tar.gz", hash = "sha256:b2c68dab1e30297317080a5b43df57e302584c49e2942defdde0acccc53f0e5b", size = 46156, upload-time = "2025-01-25T09:17:04.831Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/64/28/e2a36573ccbcf3d57c00626a21fe51989380636e821b341d36ccca0c1c3a/soundfile-0.13.1-py2.py3-none-any.whl", hash = "sha256:a23c717560da2cf4c7b5ae1142514e0fd82d6bbd9dfc93a50423447142f2c445", size = 25751, upload-time = "2025-01-25T09:16:44.235Z" }, + { url = "https://files.pythonhosted.org/packages/ea/ab/73e97a5b3cc46bba7ff8650a1504348fa1863a6f9d57d7001c6b67c5f20e/soundfile-0.13.1-py2.py3-none-macosx_10_9_x86_64.whl", hash = "sha256:82dc664d19831933fe59adad199bf3945ad06d84bc111a5b4c0d3089a5b9ec33", size = 1142250, upload-time = "2025-01-25T09:16:47.583Z" }, + { url = "https://files.pythonhosted.org/packages/a0/e5/58fd1a8d7b26fc113af244f966ee3aecf03cb9293cb935daaddc1e455e18/soundfile-0.13.1-py2.py3-none-macosx_11_0_arm64.whl", hash = "sha256:743f12c12c4054921e15736c6be09ac26b3b3d603aef6fd69f9dde68748f2593", size = 1101406, upload-time = "2025-01-25T09:16:49.662Z" }, + { url = "https://files.pythonhosted.org/packages/58/ae/c0e4a53d77cf6e9a04179535766b3321b0b9ced5f70522e4caf9329f0046/soundfile-0.13.1-py2.py3-none-manylinux_2_28_aarch64.whl", hash = "sha256:9c9e855f5a4d06ce4213f31918653ab7de0c5a8d8107cd2427e44b42df547deb", size = 1235729, upload-time = "2025-01-25T09:16:53.018Z" }, + { url = "https://files.pythonhosted.org/packages/57/5e/70bdd9579b35003a489fc850b5047beeda26328053ebadc1fb60f320f7db/soundfile-0.13.1-py2.py3-none-manylinux_2_28_x86_64.whl", hash = "sha256:03267c4e493315294834a0870f31dbb3b28a95561b80b134f0bd3cf2d5f0e618", size = 1313646, upload-time = "2025-01-25T09:16:54.872Z" }, + { url = "https://files.pythonhosted.org/packages/fe/df/8c11dc4dfceda14e3003bb81a0d0edcaaf0796dd7b4f826ea3e532146bba/soundfile-0.13.1-py2.py3-none-win32.whl", hash = "sha256:c734564fab7c5ddf8e9be5bf70bab68042cd17e9c214c06e365e20d64f9a69d5", size = 899881, upload-time = "2025-01-25T09:16:56.663Z" }, + { url = "https://files.pythonhosted.org/packages/14/e9/6b761de83277f2f02ded7e7ea6f07828ec78e4b229b80e4ca55dd205b9dc/soundfile-0.13.1-py2.py3-none-win_amd64.whl", hash = "sha256:1e70a05a0626524a69e9f0f4dd2ec174b4e9567f4d8b6c11d38b5c289be36ee9", size = 1019162, upload-time = "2025-01-25T09:16:59.573Z" }, +] + +[[package]] +name = "soxr" +version = "1.0.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "numpy", version = "2.2.6", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, + { name = "numpy", version = "2.4.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/42/7e/f4b461944662ad75036df65277d6130f9411002bfb79e9df7dff40a31db9/soxr-1.0.0.tar.gz", hash = "sha256:e07ee6c1d659bc6957034f4800c60cb8b98de798823e34d2a2bba1caa85a4509", size = 171415, upload-time = "2025-09-07T13:22:21.317Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/1e/a7/11c36d71595b52fe84a220040ace679035953acf06b83bf2c7117c565d2c/soxr-1.0.0-cp310-cp310-macosx_10_14_x86_64.whl", hash = "sha256:b876a3156f67c76aef0cff1084eaf4088d9ca584bb569cb993f89a52ec5f399f", size = 206459, upload-time = "2025-09-07T13:21:46.904Z" }, + { url = "https://files.pythonhosted.org/packages/43/5e/8962f2aeea7777d2a6e65a24a2b83c6aea1a28badeda027fd328f7f03bb7/soxr-1.0.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:4d3b957a7b0cc19ae6aa45d40b2181474e53a8dd00efd7bce6bcf4e60e020892", size = 164808, upload-time = "2025-09-07T13:21:48.83Z" }, + { url = "https://files.pythonhosted.org/packages/fc/91/00384166f110a3888ea8efd44523ba7168dd2dc39e3e43c931cc2d069fa9/soxr-1.0.0-cp310-cp310-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b89685faedebc45af71f08f9957b61cc6143bc94ba43fe38e97067f81e272969", size = 208586, upload-time = "2025-09-07T13:21:50.341Z" }, + { url = "https://files.pythonhosted.org/packages/75/34/e18f1003e242aabed44ed8902534814d3e64209e4d1d874f5b9b67d73cde/soxr-1.0.0-cp310-cp310-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:d255741b2f0084fd02d4a2ddd77cd495be9e7e7b6f9dba1c9494f86afefac65b", size = 242310, upload-time = "2025-09-07T13:21:51.56Z" }, + { url = "https://files.pythonhosted.org/packages/61/9c/a1c5ed106b40cc1e2e12cd58831b7f1b61c5fbdb8eceeca4b3a0b0dbef6c/soxr-1.0.0-cp310-cp310-win_amd64.whl", hash = "sha256:158a4a9055958c4b95ef91dbbe280cabb00946b5423b25a9b0ce31bd9e0a271e", size = 173561, upload-time = "2025-09-07T13:21:53.03Z" }, + { url = "https://files.pythonhosted.org/packages/65/ce/a3262bc8733d3a4ce5f660ed88c3d97f4b12658b0909e71334cba1721dcb/soxr-1.0.0-cp311-cp311-macosx_10_14_x86_64.whl", hash = "sha256:28e19d74a5ef45c0d7000f3c70ec1719e89077379df2a1215058914d9603d2d8", size = 206739, upload-time = "2025-09-07T13:21:54.572Z" }, + { url = "https://files.pythonhosted.org/packages/64/dc/e8cbd100b652697cc9865dbed08832e7e135ff533f453eb6db9e6168d153/soxr-1.0.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:f8dc69fc18884e53b72f6141fdf9d80997edbb4fec9dc2942edcb63abbe0d023", size = 165233, upload-time = "2025-09-07T13:21:55.887Z" }, + { url = "https://files.pythonhosted.org/packages/75/12/4b49611c9ba5e9fe6f807d0a83352516808e8e573f8b4e712fc0c17f3363/soxr-1.0.0-cp311-cp311-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:3f15450e6f65f22f02fcd4c5a9219c873b1e583a73e232805ff160c759a6b586", size = 208867, upload-time = "2025-09-07T13:21:57.076Z" }, + { url = "https://files.pythonhosted.org/packages/cc/70/92146ab970a3ef8c43ac160035b1e52fde5417f89adb10572f7e788d9596/soxr-1.0.0-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:1f73f57452f9df37b4de7a4052789fcbd474a5b28f38bba43278ae4b489d4384", size = 242633, upload-time = "2025-09-07T13:21:58.621Z" }, + { url = "https://files.pythonhosted.org/packages/b5/a7/628479336206959463d08260bffed87905e7ba9e3bd83ca6b405a0736e94/soxr-1.0.0-cp311-cp311-win_amd64.whl", hash = "sha256:9f417c3d69236051cf5a1a7bad7c4bff04eb3d8fcaa24ac1cb06e26c8d48d8dc", size = 173814, upload-time = "2025-09-07T13:21:59.798Z" }, + { url = "https://files.pythonhosted.org/packages/c5/c7/f92b81f1a151c13afb114f57799b86da9330bec844ea5a0d3fe6a8732678/soxr-1.0.0-cp312-abi3-macosx_10_14_x86_64.whl", hash = "sha256:abecf4e39017f3fadb5e051637c272ae5778d838e5c3926a35db36a53e3a607f", size = 205508, upload-time = "2025-09-07T13:22:01.252Z" }, + { url = "https://files.pythonhosted.org/packages/ff/1d/c945fea9d83ea1f2be9d116b3674dbaef26ed090374a77c394b31e3b083b/soxr-1.0.0-cp312-abi3-macosx_11_0_arm64.whl", hash = "sha256:e973d487ee46aa8023ca00a139db6e09af053a37a032fe22f9ff0cc2e19c94b4", size = 163568, upload-time = "2025-09-07T13:22:03.558Z" }, + { url = "https://files.pythonhosted.org/packages/b5/80/10640970998a1d2199bef6c4d92205f36968cddaf3e4d0e9fe35ddd405bd/soxr-1.0.0-cp312-abi3-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:e8ce273cca101aff3d8c387db5a5a41001ba76ef1837883438d3c652507a9ccc", size = 204707, upload-time = "2025-09-07T13:22:05.125Z" }, + { url = "https://files.pythonhosted.org/packages/b1/87/2726603c13c2126cb8ded9e57381b7377f4f0df6ba4408e1af5ddbfdc3dd/soxr-1.0.0-cp312-abi3-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:e8f2a69686f2856d37823bbb7b78c3d44904f311fe70ba49b893af11d6b6047b", size = 238032, upload-time = "2025-09-07T13:22:06.428Z" }, + { url = "https://files.pythonhosted.org/packages/ce/04/530252227f4d0721a5524a936336485dfb429bb206a66baf8e470384f4a2/soxr-1.0.0-cp312-abi3-win_amd64.whl", hash = "sha256:2a3b77b115ae7c478eecdbd060ed4f61beda542dfb70639177ac263aceda42a2", size = 172070, upload-time = "2025-09-07T13:22:07.62Z" }, + { url = "https://files.pythonhosted.org/packages/99/77/d3b3c25b4f1b1aa4a73f669355edcaee7a52179d0c50407697200a0e55b9/soxr-1.0.0-cp314-cp314t-macosx_10_14_x86_64.whl", hash = "sha256:392a5c70c04eb939c9c176bd6f654dec9a0eaa9ba33d8f1024ed63cf68cdba0a", size = 209509, upload-time = "2025-09-07T13:22:08.773Z" }, + { url = "https://files.pythonhosted.org/packages/8a/ee/3ca73e18781bb2aff92b809f1c17c356dfb9a1870652004bd432e79afbfa/soxr-1.0.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:fdc41a1027ba46777186f26a8fba7893be913383414135577522da2fcc684490", size = 167690, upload-time = "2025-09-07T13:22:10.259Z" }, + { url = "https://files.pythonhosted.org/packages/bd/f0/eea8b5f587a2531657dc5081d2543a5a845f271a3bea1c0fdee5cebde021/soxr-1.0.0-cp314-cp314t-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:449acd1dfaf10f0ce6dfd75c7e2ef984890df94008765a6742dafb42061c1a24", size = 209541, upload-time = "2025-09-07T13:22:11.739Z" }, + { url = "https://files.pythonhosted.org/packages/64/59/2430a48c705565eb09e78346950b586f253a11bd5313426ced3ecd9b0feb/soxr-1.0.0-cp314-cp314t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:38b35c99e408b8f440c9376a5e1dd48014857cd977c117bdaa4304865ae0edd0", size = 243025, upload-time = "2025-09-07T13:22:12.877Z" }, + { url = "https://files.pythonhosted.org/packages/3c/1b/f84a2570a74094e921bbad5450b2a22a85d58585916e131d9b98029c3e69/soxr-1.0.0-cp314-cp314t-win_amd64.whl", hash = "sha256:a39b519acca2364aa726b24a6fd55acf29e4c8909102e0b858c23013c38328e5", size = 184850, upload-time = "2025-09-07T13:22:14.068Z" }, +] + +[[package]] +name = "sqlalchemy" +version = "2.0.48" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "greenlet", marker = "platform_machine == 'AMD64' or platform_machine == 'WIN32' or platform_machine == 'aarch64' or platform_machine == 'amd64' or platform_machine == 'ppc64le' or platform_machine == 'win32' or platform_machine == 'x86_64'" }, + { name = "typing-extensions" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/1f/73/b4a9737255583b5fa858e0bb8e116eb94b88c910164ed2ed719147bde3de/sqlalchemy-2.0.48.tar.gz", hash = "sha256:5ca74f37f3369b45e1f6b7b06afb182af1fd5dde009e4ffd831830d98cbe5fe7", size = 9886075, upload-time = "2026-03-02T15:28:51.474Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/9a/67/1235676e93dd3b742a4a8eddfae49eea46c85e3eed29f0da446a8dd57500/sqlalchemy-2.0.48-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:7001dc9d5f6bb4deb756d5928eaefe1930f6f4179da3924cbd95ee0e9f4dce89", size = 2157384, upload-time = "2026-03-02T15:38:26.781Z" }, + { url = "https://files.pythonhosted.org/packages/4d/d7/fa728b856daa18c10e1390e76f26f64ac890c947008284387451d56ca3d0/sqlalchemy-2.0.48-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:1a89ce07ad2d4b8cfc30bd5889ec40613e028ed80ef47da7d9dd2ce969ad30e0", size = 3236981, upload-time = "2026-03-02T15:58:53.53Z" }, + { url = "https://files.pythonhosted.org/packages/5c/ad/6c4395649a212a6c603a72c5b9ab5dce3135a1546cfdffa3c427e71fd535/sqlalchemy-2.0.48-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:10853a53a4a00417a00913d270dddda75815fcb80675874285f41051c094d7dd", size = 3235232, upload-time = "2026-03-02T15:52:25.654Z" }, + { url = "https://files.pythonhosted.org/packages/01/f4/58f845e511ac0509765a6f85eb24924c1ef0d54fb50de9d15b28c3601458/sqlalchemy-2.0.48-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:fac0fa4e4f55f118fd87177dacb1c6522fe39c28d498d259014020fec9164c29", size = 3188106, upload-time = "2026-03-02T15:58:55.193Z" }, + { url = "https://files.pythonhosted.org/packages/3f/f9/6dcc7bfa5f5794c3a095e78cd1de8269dfb5584dfd4c2c00a50d3c1ade44/sqlalchemy-2.0.48-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:3713e21ea67bca727eecd4a24bf68bcd414c403faae4989442be60994301ded0", size = 3209522, upload-time = "2026-03-02T15:52:27.407Z" }, + { url = "https://files.pythonhosted.org/packages/d7/5a/b632875ab35874d42657f079529f0745410604645c269a8c21fb4272ff7a/sqlalchemy-2.0.48-cp310-cp310-win32.whl", hash = "sha256:d404dc897ce10e565d647795861762aa2d06ca3f4a728c5e9a835096c7059018", size = 2117695, upload-time = "2026-03-02T15:46:51.389Z" }, + { url = "https://files.pythonhosted.org/packages/de/03/9752eb2a41afdd8568e41ac3c3128e32a0a73eada5ab80483083604a56d1/sqlalchemy-2.0.48-cp310-cp310-win_amd64.whl", hash = "sha256:841a94c66577661c1f088ac958cd767d7c9bf507698f45afffe7a4017049de76", size = 2140928, upload-time = "2026-03-02T15:46:52.992Z" }, + { url = "https://files.pythonhosted.org/packages/d7/6d/b8b78b5b80f3c3ab3f7fa90faa195ec3401f6d884b60221260fd4d51864c/sqlalchemy-2.0.48-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:1b4c575df7368b3b13e0cebf01d4679f9a28ed2ae6c1cd0b1d5beffb6b2007dc", size = 2157184, upload-time = "2026-03-02T15:38:28.161Z" }, + { url = "https://files.pythonhosted.org/packages/21/4b/4f3d4a43743ab58b95b9ddf5580a265b593d017693df9e08bd55780af5bb/sqlalchemy-2.0.48-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:e83e3f959aaa1c9df95c22c528096d94848a1bc819f5d0ebf7ee3df0ca63db6c", size = 3313555, upload-time = "2026-03-02T15:58:57.21Z" }, + { url = "https://files.pythonhosted.org/packages/21/dd/3b7c53f1dbbf736fd27041aee68f8ac52226b610f914085b1652c2323442/sqlalchemy-2.0.48-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:6f7b7243850edd0b8b97043f04748f31de50cf426e939def5c16bedb540698f7", size = 3313057, upload-time = "2026-03-02T15:52:29.366Z" }, + { url = "https://files.pythonhosted.org/packages/d9/cc/3e600a90ae64047f33313d7d32e5ad025417f09d2ded487e8284b5e21a15/sqlalchemy-2.0.48-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:82745b03b4043e04600a6b665cb98697c4339b24e34d74b0a2ac0a2488b6f94d", size = 3265431, upload-time = "2026-03-02T15:58:59.096Z" }, + { url = "https://files.pythonhosted.org/packages/8b/19/780138dacfe3f5024f4cf96e4005e91edf6653d53d3673be4844578faf1d/sqlalchemy-2.0.48-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:e5e088bf43f6ee6fec7dbf1ef7ff7774a616c236b5c0cb3e00662dd71a56b571", size = 3287646, upload-time = "2026-03-02T15:52:31.569Z" }, + { url = "https://files.pythonhosted.org/packages/40/fd/f32ced124f01a23151f4777e4c705f3a470adc7bd241d9f36a7c941a33bf/sqlalchemy-2.0.48-cp311-cp311-win32.whl", hash = "sha256:9c7d0a77e36b5f4b01ca398482230ab792061d243d715299b44a0b55c89fe617", size = 2116956, upload-time = "2026-03-02T15:46:54.535Z" }, + { url = "https://files.pythonhosted.org/packages/58/d5/dd767277f6feef12d05651538f280277e661698f617fa4d086cce6055416/sqlalchemy-2.0.48-cp311-cp311-win_amd64.whl", hash = "sha256:583849c743e0e3c9bb7446f5b5addeacedc168d657a69b418063dfdb2d90081c", size = 2141627, upload-time = "2026-03-02T15:46:55.849Z" }, + { url = "https://files.pythonhosted.org/packages/ef/91/a42ae716f8925e9659df2da21ba941f158686856107a61cc97a95e7647a3/sqlalchemy-2.0.48-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:348174f228b99f33ca1f773e85510e08927620caa59ffe7803b37170df30332b", size = 2155737, upload-time = "2026-03-02T15:49:13.207Z" }, + { url = "https://files.pythonhosted.org/packages/b9/52/f75f516a1f3888f027c1cfb5d22d4376f4b46236f2e8669dcb0cddc60275/sqlalchemy-2.0.48-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:53667b5f668991e279d21f94ccfa6e45b4e3f4500e7591ae59a8012d0f010dcb", size = 3337020, upload-time = "2026-03-02T15:50:34.547Z" }, + { url = "https://files.pythonhosted.org/packages/37/9a/0c28b6371e0cdcb14f8f1930778cb3123acfcbd2c95bb9cf6b4a2ba0cce3/sqlalchemy-2.0.48-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:34634e196f620c7a61d18d5cf7dc841ca6daa7961aed75d532b7e58b309ac894", size = 3349983, upload-time = "2026-03-02T15:53:25.542Z" }, + { url = "https://files.pythonhosted.org/packages/1c/46/0aee8f3ff20b1dcbceb46ca2d87fcc3d48b407925a383ff668218509d132/sqlalchemy-2.0.48-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:546572a1793cc35857a2ffa1fe0e58571af1779bcc1ffa7c9fb0839885ed69a9", size = 3279690, upload-time = "2026-03-02T15:50:36.277Z" }, + { url = "https://files.pythonhosted.org/packages/ce/8c/a957bc91293b49181350bfd55e6dfc6e30b7f7d83dc6792d72043274a390/sqlalchemy-2.0.48-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:07edba08061bc277bfdc772dd2a1a43978f5a45994dd3ede26391b405c15221e", size = 3314738, upload-time = "2026-03-02T15:53:27.519Z" }, + { url = "https://files.pythonhosted.org/packages/4b/44/1d257d9f9556661e7bdc83667cc414ba210acfc110c82938cb3611eea58f/sqlalchemy-2.0.48-cp312-cp312-win32.whl", hash = "sha256:908a3fa6908716f803b86896a09a2c4dde5f5ce2bb07aacc71ffebb57986ce99", size = 2115546, upload-time = "2026-03-02T15:54:31.591Z" }, + { url = "https://files.pythonhosted.org/packages/f2/af/c3c7e1f3a2b383155a16454df62ae8c62a30dd238e42e68c24cebebbfae6/sqlalchemy-2.0.48-cp312-cp312-win_amd64.whl", hash = "sha256:68549c403f79a8e25984376480959975212a670405e3913830614432b5daa07a", size = 2142484, upload-time = "2026-03-02T15:54:34.072Z" }, + { url = "https://files.pythonhosted.org/packages/d1/c6/569dc8bf3cd375abc5907e82235923e986799f301cd79a903f784b996fca/sqlalchemy-2.0.48-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:e3070c03701037aa418b55d36532ecb8f8446ed0135acb71c678dbdf12f5b6e4", size = 2152599, upload-time = "2026-03-02T15:49:14.41Z" }, + { url = "https://files.pythonhosted.org/packages/6d/ff/f4e04a4bd5a24304f38cb0d4aa2ad4c0fb34999f8b884c656535e1b2b74c/sqlalchemy-2.0.48-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:2645b7d8a738763b664a12a1542c89c940daa55196e8d73e55b169cc5c99f65f", size = 3278825, upload-time = "2026-03-02T15:50:38.269Z" }, + { url = "https://files.pythonhosted.org/packages/fe/88/cb59509e4668d8001818d7355d9995be90c321313078c912420603a7cb95/sqlalchemy-2.0.48-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:b19151e76620a412c2ac1c6f977ab1b9fa7ad43140178345136456d5265b32ed", size = 3295200, upload-time = "2026-03-02T15:53:29.366Z" }, + { url = "https://files.pythonhosted.org/packages/87/dc/1609a4442aefd750ea2f32629559394ec92e89ac1d621a7f462b70f736ff/sqlalchemy-2.0.48-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:5b193a7e29fd9fa56e502920dca47dffe60f97c863494946bd698c6058a55658", size = 3226876, upload-time = "2026-03-02T15:50:39.802Z" }, + { url = "https://files.pythonhosted.org/packages/37/c3/6ae2ab5ea2fa989fbac4e674de01224b7a9d744becaf59bb967d62e99bed/sqlalchemy-2.0.48-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:36ac4ddc3d33e852da9cb00ffb08cea62ca05c39711dc67062ca2bb1fae35fd8", size = 3265045, upload-time = "2026-03-02T15:53:31.421Z" }, + { url = "https://files.pythonhosted.org/packages/6f/82/ea4665d1bb98c50c19666e672f21b81356bd6077c4574e3d2bbb84541f53/sqlalchemy-2.0.48-cp313-cp313-win32.whl", hash = "sha256:389b984139278f97757ea9b08993e7b9d1142912e046ab7d82b3fbaeb0209131", size = 2113700, upload-time = "2026-03-02T15:54:35.825Z" }, + { url = "https://files.pythonhosted.org/packages/b7/2b/b9040bec58c58225f073f5b0c1870defe1940835549dafec680cbd58c3c3/sqlalchemy-2.0.48-cp313-cp313-win_amd64.whl", hash = "sha256:d612c976cbc2d17edfcc4c006874b764e85e990c29ce9bd411f926bbfb02b9a2", size = 2139487, upload-time = "2026-03-02T15:54:37.079Z" }, + { url = "https://files.pythonhosted.org/packages/f4/f4/7b17bd50244b78a49d22cc63c969d71dc4de54567dc152a9b46f6fae40ce/sqlalchemy-2.0.48-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:69f5bc24904d3bc3640961cddd2523e361257ef68585d6e364166dfbe8c78fae", size = 3558851, upload-time = "2026-03-02T15:57:48.607Z" }, + { url = "https://files.pythonhosted.org/packages/20/0d/213668e9aca61d370f7d2a6449ea4ec699747fac67d4bda1bb3d129025be/sqlalchemy-2.0.48-cp313-cp313t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:fd08b90d211c086181caed76931ecfa2bdfc83eea3cfccdb0f82abc6c4b876cb", size = 3525525, upload-time = "2026-03-02T16:04:38.058Z" }, + { url = "https://files.pythonhosted.org/packages/85/d7/a84edf412979e7d59c69b89a5871f90a49228360594680e667cb2c46a828/sqlalchemy-2.0.48-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:1ccd42229aaac2df431562117ac7e667d702e8e44afdb6cf0e50fa3f18160f0b", size = 3466611, upload-time = "2026-03-02T15:57:50.759Z" }, + { url = "https://files.pythonhosted.org/packages/86/55/42404ce5770f6be26a2b0607e7866c31b9a4176c819e9a7a5e0a055770be/sqlalchemy-2.0.48-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:f0dcbc588cd5b725162c076eb9119342f6579c7f7f55057bb7e3c6ff27e13121", size = 3475812, upload-time = "2026-03-02T16:04:40.092Z" }, + { url = "https://files.pythonhosted.org/packages/ae/ae/29b87775fadc43e627cf582fe3bda4d02e300f6b8f2747c764950d13784c/sqlalchemy-2.0.48-cp313-cp313t-win32.whl", hash = "sha256:9764014ef5e58aab76220c5664abb5d47d5bc858d9debf821e55cfdd0f128485", size = 2141335, upload-time = "2026-03-02T15:52:51.518Z" }, + { url = "https://files.pythonhosted.org/packages/91/44/f39d063c90f2443e5b46ec4819abd3d8de653893aae92df42a5c4f5843de/sqlalchemy-2.0.48-cp313-cp313t-win_amd64.whl", hash = "sha256:e2f35b4cccd9ed286ad62e0a3c3ac21e06c02abc60e20aa51a3e305a30f5fa79", size = 2173095, upload-time = "2026-03-02T15:52:52.79Z" }, + { url = "https://files.pythonhosted.org/packages/f7/b3/f437eaa1cf028bb3c927172c7272366393e73ccd104dcf5b6963f4ab5318/sqlalchemy-2.0.48-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:e2d0d88686e3d35a76f3e15a34e8c12d73fc94c1dea1cd55782e695cc14086dd", size = 2154401, upload-time = "2026-03-02T15:49:17.24Z" }, + { url = "https://files.pythonhosted.org/packages/6c/1c/b3abdf0f402aa3f60f0df6ea53d92a162b458fca2321d8f1f00278506402/sqlalchemy-2.0.48-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:49b7bddc1eebf011ea5ab722fdbe67a401caa34a350d278cc7733c0e88fecb1f", size = 3274528, upload-time = "2026-03-02T15:50:41.489Z" }, + { url = "https://files.pythonhosted.org/packages/f2/5e/327428a034407651a048f5e624361adf3f9fbac9d0fa98e981e9c6ff2f5e/sqlalchemy-2.0.48-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:426c5ca86415d9b8945c7073597e10de9644802e2ff502b8e1f11a7a2642856b", size = 3279523, upload-time = "2026-03-02T15:53:32.962Z" }, + { url = "https://files.pythonhosted.org/packages/2a/ca/ece73c81a918add0965b76b868b7b5359e068380b90ef1656ee995940c02/sqlalchemy-2.0.48-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:288937433bd44e3990e7da2402fabc44a3c6c25d3704da066b85b89a85474ae0", size = 3224312, upload-time = "2026-03-02T15:50:42.996Z" }, + { url = "https://files.pythonhosted.org/packages/88/11/fbaf1ae91fa4ee43f4fe79661cead6358644824419c26adb004941bdce7c/sqlalchemy-2.0.48-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:8183dc57ae7d9edc1346e007e840a9f3d6aa7b7f165203a99e16f447150140d2", size = 3246304, upload-time = "2026-03-02T15:53:34.937Z" }, + { url = "https://files.pythonhosted.org/packages/fa/a8/5fb0deb13930b4f2f698c5541ae076c18981173e27dd00376dbaea7a9c82/sqlalchemy-2.0.48-cp314-cp314-win32.whl", hash = "sha256:1182437cb2d97988cfea04cf6cdc0b0bb9c74f4d56ec3d08b81e23d621a28cc6", size = 2116565, upload-time = "2026-03-02T15:54:38.321Z" }, + { url = "https://files.pythonhosted.org/packages/95/7e/e83615cb63f80047f18e61e31e8e32257d39458426c23006deeaf48f463b/sqlalchemy-2.0.48-cp314-cp314-win_amd64.whl", hash = "sha256:144921da96c08feb9e2b052c5c5c1d0d151a292c6135623c6b2c041f2a45f9e0", size = 2142205, upload-time = "2026-03-02T15:54:39.831Z" }, + { url = "https://files.pythonhosted.org/packages/83/e3/69d8711b3f2c5135e9cde5f063bc1605860f0b2c53086d40c04017eb1f77/sqlalchemy-2.0.48-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:5aee45fd2c6c0f2b9cdddf48c48535e7471e42d6fb81adfde801da0bd5b93241", size = 3563519, upload-time = "2026-03-02T15:57:52.387Z" }, + { url = "https://files.pythonhosted.org/packages/f8/4f/a7cce98facca73c149ea4578981594aaa5fd841e956834931de503359336/sqlalchemy-2.0.48-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:7cddca31edf8b0653090cbb54562ca027c421c58ddde2c0685f49ff56a1690e0", size = 3528611, upload-time = "2026-03-02T16:04:42.097Z" }, + { url = "https://files.pythonhosted.org/packages/cd/7d/5936c7a03a0b0cb0fa0cc425998821c6029756b0855a8f7ee70fba1de955/sqlalchemy-2.0.48-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:7a936f1bb23d370b7c8cc079d5fce4c7d18da87a33c6744e51a93b0f9e97e9b3", size = 3472326, upload-time = "2026-03-02T15:57:54.423Z" }, + { url = "https://files.pythonhosted.org/packages/f4/33/cea7dfc31b52904efe3dcdc169eb4514078887dff1f5ae28a7f4c5d54b3c/sqlalchemy-2.0.48-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:e004aa9248e8cb0a5f9b96d003ca7c1c0a5da8decd1066e7b53f59eb8ce7c62b", size = 3478453, upload-time = "2026-03-02T16:04:44.584Z" }, + { url = "https://files.pythonhosted.org/packages/c8/95/32107c4d13be077a9cae61e9ae49966a35dc4bf442a8852dd871db31f62e/sqlalchemy-2.0.48-cp314-cp314t-win32.whl", hash = "sha256:b8438ec5594980d405251451c5b7ea9aa58dda38eb7ac35fb7e4c696712ee24f", size = 2147209, upload-time = "2026-03-02T15:52:54.274Z" }, + { url = "https://files.pythonhosted.org/packages/d2/d7/1e073da7a4bc645eb83c76067284a0374e643bc4be57f14cc6414656f92c/sqlalchemy-2.0.48-cp314-cp314t-win_amd64.whl", hash = "sha256:d854b3970067297f3a7fbd7a4683587134aa9b3877ee15aa29eea478dc68f933", size = 2182198, upload-time = "2026-03-02T15:52:55.606Z" }, + { url = "https://files.pythonhosted.org/packages/46/2c/9664130905f03db57961b8980b05cab624afd114bf2be2576628a9f22da4/sqlalchemy-2.0.48-py3-none-any.whl", hash = "sha256:a66fe406437dd65cacd96a72689a3aaaecaebbcd62d81c5ac1c0fdbeac835096", size = 1940202, upload-time = "2026-03-02T15:52:43.285Z" }, +] + +[[package]] +name = "standard-aifc" +version = "3.13.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "audioop-lts", marker = "python_full_version >= '3.13'" }, + { name = "standard-chunk", marker = "python_full_version >= '3.13'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/c4/53/6050dc3dde1671eb3db592c13b55a8005e5040131f7509cef0215212cb84/standard_aifc-3.13.0.tar.gz", hash = "sha256:64e249c7cb4b3daf2fdba4e95721f811bde8bdfc43ad9f936589b7bb2fae2e43", size = 15240, upload-time = "2024-10-30T16:01:31.772Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/c3/52/5fbb203394cc852334d1575cc020f6bcec768d2265355984dfd361968f36/standard_aifc-3.13.0-py3-none-any.whl", hash = "sha256:f7ae09cc57de1224a0dd8e3eb8f73830be7c3d0bc485de4c1f82b4a7f645ac66", size = 10492, upload-time = "2024-10-30T16:01:07.071Z" }, +] + +[[package]] +name = "standard-chunk" +version = "3.13.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/43/06/ce1bb165c1f111c7d23a1ad17204d67224baa69725bb6857a264db61beaf/standard_chunk-3.13.0.tar.gz", hash = "sha256:4ac345d37d7e686d2755e01836b8d98eda0d1a3ee90375e597ae43aaf064d654", size = 4672, upload-time = "2024-10-30T16:18:28.326Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/7a/90/a5c1084d87767d787a6caba615aa50dc587229646308d9420c960cb5e4c0/standard_chunk-3.13.0-py3-none-any.whl", hash = "sha256:17880a26c285189c644bd5bd8f8ed2bdb795d216e3293e6dbe55bbd848e2982c", size = 4944, upload-time = "2024-10-30T16:18:26.694Z" }, +] + +[[package]] +name = "standard-sunau" +version = "3.13.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "audioop-lts", marker = "python_full_version >= '3.13'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/66/e3/ce8d38cb2d70e05ffeddc28bb09bad77cfef979eb0a299c9117f7ed4e6a9/standard_sunau-3.13.0.tar.gz", hash = "sha256:b319a1ac95a09a2378a8442f403c66f4fd4b36616d6df6ae82b8e536ee790908", size = 9368, upload-time = "2024-10-30T16:01:41.626Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/34/ae/e3707f6c1bc6f7aa0df600ba8075bfb8a19252140cd595335be60e25f9ee/standard_sunau-3.13.0-py3-none-any.whl", hash = "sha256:53af624a9529c41062f4c2fd33837f297f3baa196b0cfceffea6555654602622", size = 7364, upload-time = "2024-10-30T16:01:28.003Z" }, +] + +[[package]] +name = "sympy" +version = "1.14.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "mpmath" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/83/d3/803453b36afefb7c2bb238361cd4ae6125a569b4db67cd9e79846ba2d68c/sympy-1.14.0.tar.gz", hash = "sha256:d3d3fe8df1e5a0b42f0e7bdf50541697dbe7d23746e894990c030e2b05e72517", size = 7793921, upload-time = "2025-04-27T18:05:01.611Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/a2/09/77d55d46fd61b4a135c444fc97158ef34a095e5681d0a6c10b75bf356191/sympy-1.14.0-py3-none-any.whl", hash = "sha256:e091cc3e99d2141a0ba2847328f5479b05d94a6635cb96148ccb3f34671bd8f5", size = 6299353, upload-time = "2025-04-27T18:04:59.103Z" }, +] + +[[package]] +name = "threadpoolctl" +version = "3.6.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/b7/4d/08c89e34946fce2aec4fbb45c9016efd5f4d7f24af8e5d93296e935631d8/threadpoolctl-3.6.0.tar.gz", hash = "sha256:8ab8b4aa3491d812b623328249fab5302a68d2d71745c8a4c719a2fcaba9f44e", size = 21274, upload-time = "2025-03-13T13:49:23.031Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/32/d5/f9a850d79b0851d1d4ef6456097579a9005b31fea68726a4ae5f2d82ddd9/threadpoolctl-3.6.0-py3-none-any.whl", hash = "sha256:43a0b8fd5a2928500110039e43a5eed8480b918967083ea48dc3ab9f13c4a7fb", size = 18638, upload-time = "2025-03-13T13:49:21.846Z" }, +] + +[[package]] +name = "tomli" +version = "2.4.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/82/30/31573e9457673ab10aa432461bee537ce6cef177667deca369efb79df071/tomli-2.4.0.tar.gz", hash = "sha256:aa89c3f6c277dd275d8e243ad24f3b5e701491a860d5121f2cdd399fbb31fc9c", size = 17477, upload-time = "2026-01-11T11:22:38.165Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/3c/d9/3dc2289e1f3b32eb19b9785b6a006b28ee99acb37d1d47f78d4c10e28bf8/tomli-2.4.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:b5ef256a3fd497d4973c11bf142e9ed78b150d36f5773f1ca6088c230ffc5867", size = 153663, upload-time = "2026-01-11T11:21:45.27Z" }, + { url = "https://files.pythonhosted.org/packages/51/32/ef9f6845e6b9ca392cd3f64f9ec185cc6f09f0a2df3db08cbe8809d1d435/tomli-2.4.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:5572e41282d5268eb09a697c89a7bee84fae66511f87533a6f88bd2f7b652da9", size = 148469, upload-time = "2026-01-11T11:21:46.873Z" }, + { url = "https://files.pythonhosted.org/packages/d6/c2/506e44cce89a8b1b1e047d64bd495c22c9f71f21e05f380f1a950dd9c217/tomli-2.4.0-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:551e321c6ba03b55676970b47cb1b73f14a0a4dce6a3e1a9458fd6d921d72e95", size = 236039, upload-time = "2026-01-11T11:21:48.503Z" }, + { url = "https://files.pythonhosted.org/packages/b3/40/e1b65986dbc861b7e986e8ec394598187fa8aee85b1650b01dd925ca0be8/tomli-2.4.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:5e3f639a7a8f10069d0e15408c0b96a2a828cfdec6fca05296ebcdcc28ca7c76", size = 243007, upload-time = "2026-01-11T11:21:49.456Z" }, + { url = "https://files.pythonhosted.org/packages/9c/6f/6e39ce66b58a5b7ae572a0f4352ff40c71e8573633deda43f6a379d56b3e/tomli-2.4.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:1b168f2731796b045128c45982d3a4874057626da0e2ef1fdd722848b741361d", size = 240875, upload-time = "2026-01-11T11:21:50.755Z" }, + { url = "https://files.pythonhosted.org/packages/aa/ad/cb089cb190487caa80204d503c7fd0f4d443f90b95cf4ef5cf5aa0f439b0/tomli-2.4.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:133e93646ec4300d651839d382d63edff11d8978be23da4cc106f5a18b7d0576", size = 246271, upload-time = "2026-01-11T11:21:51.81Z" }, + { url = "https://files.pythonhosted.org/packages/0b/63/69125220e47fd7a3a27fd0de0c6398c89432fec41bc739823bcc66506af6/tomli-2.4.0-cp311-cp311-win32.whl", hash = "sha256:b6c78bdf37764092d369722d9946cb65b8767bfa4110f902a1b2542d8d173c8a", size = 96770, upload-time = "2026-01-11T11:21:52.647Z" }, + { url = "https://files.pythonhosted.org/packages/1e/0d/a22bb6c83f83386b0008425a6cd1fa1c14b5f3dd4bad05e98cf3dbbf4a64/tomli-2.4.0-cp311-cp311-win_amd64.whl", hash = "sha256:d3d1654e11d724760cdb37a3d7691f0be9db5fbdaef59c9f532aabf87006dbaa", size = 107626, upload-time = "2026-01-11T11:21:53.459Z" }, + { url = "https://files.pythonhosted.org/packages/2f/6d/77be674a3485e75cacbf2ddba2b146911477bd887dda9d8c9dfb2f15e871/tomli-2.4.0-cp311-cp311-win_arm64.whl", hash = "sha256:cae9c19ed12d4e8f3ebf46d1a75090e4c0dc16271c5bce1c833ac168f08fb614", size = 94842, upload-time = "2026-01-11T11:21:54.831Z" }, + { url = "https://files.pythonhosted.org/packages/3c/43/7389a1869f2f26dba52404e1ef13b4784b6b37dac93bac53457e3ff24ca3/tomli-2.4.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:920b1de295e72887bafa3ad9f7a792f811847d57ea6b1215154030cf131f16b1", size = 154894, upload-time = "2026-01-11T11:21:56.07Z" }, + { url = "https://files.pythonhosted.org/packages/e9/05/2f9bf110b5294132b2edf13fe6ca6ae456204f3d749f623307cbb7a946f2/tomli-2.4.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:7d6d9a4aee98fac3eab4952ad1d73aee87359452d1c086b5ceb43ed02ddb16b8", size = 149053, upload-time = "2026-01-11T11:21:57.467Z" }, + { url = "https://files.pythonhosted.org/packages/e8/41/1eda3ca1abc6f6154a8db4d714a4d35c4ad90adc0bcf700657291593fbf3/tomli-2.4.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:36b9d05b51e65b254ea6c2585b59d2c4cb91c8a3d91d0ed0f17591a29aaea54a", size = 243481, upload-time = "2026-01-11T11:21:58.661Z" }, + { url = "https://files.pythonhosted.org/packages/d2/6d/02ff5ab6c8868b41e7d4b987ce2b5f6a51d3335a70aa144edd999e055a01/tomli-2.4.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:1c8a885b370751837c029ef9bc014f27d80840e48bac415f3412e6593bbc18c1", size = 251720, upload-time = "2026-01-11T11:22:00.178Z" }, + { url = "https://files.pythonhosted.org/packages/7b/57/0405c59a909c45d5b6f146107c6d997825aa87568b042042f7a9c0afed34/tomli-2.4.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:8768715ffc41f0008abe25d808c20c3d990f42b6e2e58305d5da280ae7d1fa3b", size = 247014, upload-time = "2026-01-11T11:22:01.238Z" }, + { url = "https://files.pythonhosted.org/packages/2c/0e/2e37568edd944b4165735687cbaf2fe3648129e440c26d02223672ee0630/tomli-2.4.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:7b438885858efd5be02a9a133caf5812b8776ee0c969fea02c45e8e3f296ba51", size = 251820, upload-time = "2026-01-11T11:22:02.727Z" }, + { url = "https://files.pythonhosted.org/packages/5a/1c/ee3b707fdac82aeeb92d1a113f803cf6d0f37bdca0849cb489553e1f417a/tomli-2.4.0-cp312-cp312-win32.whl", hash = "sha256:0408e3de5ec77cc7f81960c362543cbbd91ef883e3138e81b729fc3eea5b9729", size = 97712, upload-time = "2026-01-11T11:22:03.777Z" }, + { url = "https://files.pythonhosted.org/packages/69/13/c07a9177d0b3bab7913299b9278845fc6eaaca14a02667c6be0b0a2270c8/tomli-2.4.0-cp312-cp312-win_amd64.whl", hash = "sha256:685306e2cc7da35be4ee914fd34ab801a6acacb061b6a7abca922aaf9ad368da", size = 108296, upload-time = "2026-01-11T11:22:04.86Z" }, + { url = "https://files.pythonhosted.org/packages/18/27/e267a60bbeeee343bcc279bb9e8fbed0cbe224bc7b2a3dc2975f22809a09/tomli-2.4.0-cp312-cp312-win_arm64.whl", hash = "sha256:5aa48d7c2356055feef06a43611fc401a07337d5b006be13a30f6c58f869e3c3", size = 94553, upload-time = "2026-01-11T11:22:05.854Z" }, + { url = "https://files.pythonhosted.org/packages/34/91/7f65f9809f2936e1f4ce6268ae1903074563603b2a2bd969ebbda802744f/tomli-2.4.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:84d081fbc252d1b6a982e1870660e7330fb8f90f676f6e78b052ad4e64714bf0", size = 154915, upload-time = "2026-01-11T11:22:06.703Z" }, + { url = "https://files.pythonhosted.org/packages/20/aa/64dd73a5a849c2e8f216b755599c511badde80e91e9bc2271baa7b2cdbb1/tomli-2.4.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:9a08144fa4cba33db5255f9b74f0b89888622109bd2776148f2597447f92a94e", size = 149038, upload-time = "2026-01-11T11:22:07.56Z" }, + { url = "https://files.pythonhosted.org/packages/9e/8a/6d38870bd3d52c8d1505ce054469a73f73a0fe62c0eaf5dddf61447e32fa/tomli-2.4.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c73add4bb52a206fd0c0723432db123c0c75c280cbd67174dd9d2db228ebb1b4", size = 242245, upload-time = "2026-01-11T11:22:08.344Z" }, + { url = "https://files.pythonhosted.org/packages/59/bb/8002fadefb64ab2669e5b977df3f5e444febea60e717e755b38bb7c41029/tomli-2.4.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:1fb2945cbe303b1419e2706e711b7113da57b7db31ee378d08712d678a34e51e", size = 250335, upload-time = "2026-01-11T11:22:09.951Z" }, + { url = "https://files.pythonhosted.org/packages/a5/3d/4cdb6f791682b2ea916af2de96121b3cb1284d7c203d97d92d6003e91c8d/tomli-2.4.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:bbb1b10aa643d973366dc2cb1ad94f99c1726a02343d43cbc011edbfac579e7c", size = 245962, upload-time = "2026-01-11T11:22:11.27Z" }, + { url = "https://files.pythonhosted.org/packages/f2/4a/5f25789f9a460bd858ba9756ff52d0830d825b458e13f754952dd15fb7bb/tomli-2.4.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:4cbcb367d44a1f0c2be408758b43e1ffb5308abe0ea222897d6bfc8e8281ef2f", size = 250396, upload-time = "2026-01-11T11:22:12.325Z" }, + { url = "https://files.pythonhosted.org/packages/aa/2f/b73a36fea58dfa08e8b3a268750e6853a6aac2a349241a905ebd86f3047a/tomli-2.4.0-cp313-cp313-win32.whl", hash = "sha256:7d49c66a7d5e56ac959cb6fc583aff0651094ec071ba9ad43df785abc2320d86", size = 97530, upload-time = "2026-01-11T11:22:13.865Z" }, + { url = "https://files.pythonhosted.org/packages/3b/af/ca18c134b5d75de7e8dc551c5234eaba2e8e951f6b30139599b53de9c187/tomli-2.4.0-cp313-cp313-win_amd64.whl", hash = "sha256:3cf226acb51d8f1c394c1b310e0e0e61fecdd7adcb78d01e294ac297dd2e7f87", size = 108227, upload-time = "2026-01-11T11:22:15.224Z" }, + { url = "https://files.pythonhosted.org/packages/22/c3/b386b832f209fee8073c8138ec50f27b4460db2fdae9ffe022df89a57f9b/tomli-2.4.0-cp313-cp313-win_arm64.whl", hash = "sha256:d20b797a5c1ad80c516e41bc1fb0443ddb5006e9aaa7bda2d71978346aeb9132", size = 94748, upload-time = "2026-01-11T11:22:16.009Z" }, + { url = "https://files.pythonhosted.org/packages/f3/c4/84047a97eb1004418bc10bdbcfebda209fca6338002eba2dc27cc6d13563/tomli-2.4.0-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:26ab906a1eb794cd4e103691daa23d95c6919cc2fa9160000ac02370cc9dd3f6", size = 154725, upload-time = "2026-01-11T11:22:17.269Z" }, + { url = "https://files.pythonhosted.org/packages/a8/5d/d39038e646060b9d76274078cddf146ced86dc2b9e8bbf737ad5983609a0/tomli-2.4.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:20cedb4ee43278bc4f2fee6cb50daec836959aadaf948db5172e776dd3d993fc", size = 148901, upload-time = "2026-01-11T11:22:18.287Z" }, + { url = "https://files.pythonhosted.org/packages/73/e5/383be1724cb30f4ce44983d249645684a48c435e1cd4f8b5cded8a816d3c/tomli-2.4.0-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:39b0b5d1b6dd03684b3fb276407ebed7090bbec989fa55838c98560c01113b66", size = 243375, upload-time = "2026-01-11T11:22:19.154Z" }, + { url = "https://files.pythonhosted.org/packages/31/f0/bea80c17971c8d16d3cc109dc3585b0f2ce1036b5f4a8a183789023574f2/tomli-2.4.0-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:a26d7ff68dfdb9f87a016ecfd1e1c2bacbe3108f4e0f8bcd2228ef9a766c787d", size = 250639, upload-time = "2026-01-11T11:22:20.168Z" }, + { url = "https://files.pythonhosted.org/packages/2c/8f/2853c36abbb7608e3f945d8a74e32ed3a74ee3a1f468f1ffc7d1cb3abba6/tomli-2.4.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:20ffd184fb1df76a66e34bd1b36b4a4641bd2b82954befa32fe8163e79f1a702", size = 246897, upload-time = "2026-01-11T11:22:21.544Z" }, + { url = "https://files.pythonhosted.org/packages/49/f0/6c05e3196ed5337b9fe7ea003e95fd3819a840b7a0f2bf5a408ef1dad8ed/tomli-2.4.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:75c2f8bbddf170e8effc98f5e9084a8751f8174ea6ccf4fca5398436e0320bc8", size = 254697, upload-time = "2026-01-11T11:22:23.058Z" }, + { url = "https://files.pythonhosted.org/packages/f3/f5/2922ef29c9f2951883525def7429967fc4d8208494e5ab524234f06b688b/tomli-2.4.0-cp314-cp314-win32.whl", hash = "sha256:31d556d079d72db7c584c0627ff3a24c5d3fb4f730221d3444f3efb1b2514776", size = 98567, upload-time = "2026-01-11T11:22:24.033Z" }, + { url = "https://files.pythonhosted.org/packages/7b/31/22b52e2e06dd2a5fdbc3ee73226d763b184ff21fc24e20316a44ccc4d96b/tomli-2.4.0-cp314-cp314-win_amd64.whl", hash = "sha256:43e685b9b2341681907759cf3a04e14d7104b3580f808cfde1dfdb60ada85475", size = 108556, upload-time = "2026-01-11T11:22:25.378Z" }, + { url = "https://files.pythonhosted.org/packages/48/3d/5058dff3255a3d01b705413f64f4306a141a8fd7a251e5a495e3f192a998/tomli-2.4.0-cp314-cp314-win_arm64.whl", hash = "sha256:3d895d56bd3f82ddd6faaff993c275efc2ff38e52322ea264122d72729dca2b2", size = 96014, upload-time = "2026-01-11T11:22:26.138Z" }, + { url = "https://files.pythonhosted.org/packages/b8/4e/75dab8586e268424202d3a1997ef6014919c941b50642a1682df43204c22/tomli-2.4.0-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:5b5807f3999fb66776dbce568cc9a828544244a8eb84b84b9bafc080c99597b9", size = 163339, upload-time = "2026-01-11T11:22:27.143Z" }, + { url = "https://files.pythonhosted.org/packages/06/e3/b904d9ab1016829a776d97f163f183a48be6a4deb87304d1e0116a349519/tomli-2.4.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:c084ad935abe686bd9c898e62a02a19abfc9760b5a79bc29644463eaf2840cb0", size = 159490, upload-time = "2026-01-11T11:22:28.399Z" }, + { url = "https://files.pythonhosted.org/packages/e3/5a/fc3622c8b1ad823e8ea98a35e3c632ee316d48f66f80f9708ceb4f2a0322/tomli-2.4.0-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:0f2e3955efea4d1cfbcb87bc321e00dc08d2bcb737fd1d5e398af111d86db5df", size = 269398, upload-time = "2026-01-11T11:22:29.345Z" }, + { url = "https://files.pythonhosted.org/packages/fd/33/62bd6152c8bdd4c305ad9faca48f51d3acb2df1f8791b1477d46ff86e7f8/tomli-2.4.0-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:0e0fe8a0b8312acf3a88077a0802565cb09ee34107813bba1c7cd591fa6cfc8d", size = 276515, upload-time = "2026-01-11T11:22:30.327Z" }, + { url = "https://files.pythonhosted.org/packages/4b/ff/ae53619499f5235ee4211e62a8d7982ba9e439a0fb4f2f351a93d67c1dd2/tomli-2.4.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:413540dce94673591859c4c6f794dfeaa845e98bf35d72ed59636f869ef9f86f", size = 273806, upload-time = "2026-01-11T11:22:32.56Z" }, + { url = "https://files.pythonhosted.org/packages/47/71/cbca7787fa68d4d0a9f7072821980b39fbb1b6faeb5f5cf02f4a5559fa28/tomli-2.4.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:0dc56fef0e2c1c470aeac5b6ca8cc7b640bb93e92d9803ddaf9ea03e198f5b0b", size = 281340, upload-time = "2026-01-11T11:22:33.505Z" }, + { url = "https://files.pythonhosted.org/packages/f5/00/d595c120963ad42474cf6ee7771ad0d0e8a49d0f01e29576ee9195d9ecdf/tomli-2.4.0-cp314-cp314t-win32.whl", hash = "sha256:d878f2a6707cc9d53a1be1414bbb419e629c3d6e67f69230217bb663e76b5087", size = 108106, upload-time = "2026-01-11T11:22:34.451Z" }, + { url = "https://files.pythonhosted.org/packages/de/69/9aa0c6a505c2f80e519b43764f8b4ba93b5a0bbd2d9a9de6e2b24271b9a5/tomli-2.4.0-cp314-cp314t-win_amd64.whl", hash = "sha256:2add28aacc7425117ff6364fe9e06a183bb0251b03f986df0e78e974047571fd", size = 120504, upload-time = "2026-01-11T11:22:35.764Z" }, + { url = "https://files.pythonhosted.org/packages/b3/9f/f1668c281c58cfae01482f7114a4b88d345e4c140386241a1a24dcc9e7bc/tomli-2.4.0-cp314-cp314t-win_arm64.whl", hash = "sha256:2b1e3b80e1d5e52e40e9b924ec43d81570f0e7d09d11081b797bc4692765a3d4", size = 99561, upload-time = "2026-01-11T11:22:36.624Z" }, + { url = "https://files.pythonhosted.org/packages/23/d1/136eb2cb77520a31e1f64cbae9d33ec6df0d78bdf4160398e86eec8a8754/tomli-2.4.0-py3-none-any.whl", hash = "sha256:1f776e7d669ebceb01dee46484485f43a4048746235e683bcdffacdf1fb4785a", size = 14477, upload-time = "2026-01-11T11:22:37.446Z" }, +] + +[[package]] +name = "torch" +version = "2.8.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "filelock" }, + { name = "fsspec" }, + { name = "jinja2" }, + { name = "networkx", version = "3.4.2", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, + { name = "networkx", version = "3.6.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, + { name = "nvidia-cublas-cu12", marker = "platform_machine == 'x86_64' and sys_platform == 'linux'" }, + { name = "nvidia-cuda-cupti-cu12", marker = "platform_machine == 'x86_64' and sys_platform == 'linux'" }, + { name = "nvidia-cuda-nvrtc-cu12", marker = "platform_machine == 'x86_64' and sys_platform == 'linux'" }, + { name = "nvidia-cuda-runtime-cu12", marker = "platform_machine == 'x86_64' and sys_platform == 'linux'" }, + { name = "nvidia-cudnn-cu12", marker = "platform_machine == 'x86_64' and sys_platform == 'linux'" }, + { name = "nvidia-cufft-cu12", marker = "platform_machine == 'x86_64' and sys_platform == 'linux'" }, + { name = "nvidia-cufile-cu12", marker = "platform_machine == 'x86_64' and sys_platform == 'linux'" }, + { name = "nvidia-curand-cu12", marker = "platform_machine == 'x86_64' and sys_platform == 'linux'" }, + { name = "nvidia-cusolver-cu12", marker = "platform_machine == 'x86_64' and sys_platform == 'linux'" }, + { name = "nvidia-cusparse-cu12", marker = "platform_machine == 'x86_64' and sys_platform == 'linux'" }, + { name = "nvidia-cusparselt-cu12", marker = "platform_machine == 'x86_64' and sys_platform == 'linux'" }, + { name = "nvidia-nccl-cu12", marker = "platform_machine == 'x86_64' and sys_platform == 'linux'" }, + { name = "nvidia-nvjitlink-cu12", marker = "platform_machine == 'x86_64' and sys_platform == 'linux'" }, + { name = "nvidia-nvtx-cu12", marker = "platform_machine == 'x86_64' and sys_platform == 'linux'" }, + { name = "setuptools", marker = "python_full_version >= '3.12'" }, + { name = "sympy" }, + { name = "triton", marker = "platform_machine == 'x86_64' and sys_platform == 'linux'" }, + { name = "typing-extensions" }, +] +wheels = [ + { url = "https://files.pythonhosted.org/packages/63/28/110f7274254f1b8476c561dada127173f994afa2b1ffc044efb773c15650/torch-2.8.0-cp310-cp310-manylinux_2_28_aarch64.whl", hash = "sha256:0be92c08b44009d4131d1ff7a8060d10bafdb7ddcb7359ef8d8c5169007ea905", size = 102052793, upload-time = "2025-08-06T14:53:15.852Z" }, + { url = "https://files.pythonhosted.org/packages/70/1c/58da560016f81c339ae14ab16c98153d51c941544ae568da3cb5b1ceb572/torch-2.8.0-cp310-cp310-manylinux_2_28_x86_64.whl", hash = "sha256:89aa9ee820bb39d4d72b794345cccef106b574508dd17dbec457949678c76011", size = 888025420, upload-time = "2025-08-06T14:54:18.014Z" }, + { url = "https://files.pythonhosted.org/packages/70/87/f69752d0dd4ba8218c390f0438130c166fa264a33b7025adb5014b92192c/torch-2.8.0-cp310-cp310-win_amd64.whl", hash = "sha256:e8e5bf982e87e2b59d932769938b698858c64cc53753894be25629bdf5cf2f46", size = 241363614, upload-time = "2025-08-06T14:53:31.496Z" }, + { url = "https://files.pythonhosted.org/packages/ef/d6/e6d4c57e61c2b2175d3aafbfb779926a2cfd7c32eeda7c543925dceec923/torch-2.8.0-cp310-none-macosx_11_0_arm64.whl", hash = "sha256:a3f16a58a9a800f589b26d47ee15aca3acf065546137fc2af039876135f4c760", size = 73611154, upload-time = "2025-08-06T14:53:10.919Z" }, + { url = "https://files.pythonhosted.org/packages/8f/c4/3e7a3887eba14e815e614db70b3b529112d1513d9dae6f4d43e373360b7f/torch-2.8.0-cp311-cp311-manylinux_2_28_aarch64.whl", hash = "sha256:220a06fd7af8b653c35d359dfe1aaf32f65aa85befa342629f716acb134b9710", size = 102073391, upload-time = "2025-08-06T14:53:20.937Z" }, + { url = "https://files.pythonhosted.org/packages/5a/63/4fdc45a0304536e75a5e1b1bbfb1b56dd0e2743c48ee83ca729f7ce44162/torch-2.8.0-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:c12fa219f51a933d5f80eeb3a7a5d0cbe9168c0a14bbb4055f1979431660879b", size = 888063640, upload-time = "2025-08-06T14:55:05.325Z" }, + { url = "https://files.pythonhosted.org/packages/84/57/2f64161769610cf6b1c5ed782bd8a780e18a3c9d48931319f2887fa9d0b1/torch-2.8.0-cp311-cp311-win_amd64.whl", hash = "sha256:8c7ef765e27551b2fbfc0f41bcf270e1292d9bf79f8e0724848b1682be6e80aa", size = 241366752, upload-time = "2025-08-06T14:53:38.692Z" }, + { url = "https://files.pythonhosted.org/packages/a4/5e/05a5c46085d9b97e928f3f037081d3d2b87fb4b4195030fc099aaec5effc/torch-2.8.0-cp311-none-macosx_11_0_arm64.whl", hash = "sha256:5ae0524688fb6707c57a530c2325e13bb0090b745ba7b4a2cd6a3ce262572916", size = 73621174, upload-time = "2025-08-06T14:53:25.44Z" }, + { url = "https://files.pythonhosted.org/packages/49/0c/2fd4df0d83a495bb5e54dca4474c4ec5f9c62db185421563deeb5dabf609/torch-2.8.0-cp312-cp312-manylinux_2_28_aarch64.whl", hash = "sha256:e2fab4153768d433f8ed9279c8133a114a034a61e77a3a104dcdf54388838705", size = 101906089, upload-time = "2025-08-06T14:53:52.631Z" }, + { url = "https://files.pythonhosted.org/packages/99/a8/6acf48d48838fb8fe480597d98a0668c2beb02ee4755cc136de92a0a956f/torch-2.8.0-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:b2aca0939fb7e4d842561febbd4ffda67a8e958ff725c1c27e244e85e982173c", size = 887913624, upload-time = "2025-08-06T14:56:44.33Z" }, + { url = "https://files.pythonhosted.org/packages/af/8a/5c87f08e3abd825c7dfecef5a0f1d9aa5df5dd0e3fd1fa2f490a8e512402/torch-2.8.0-cp312-cp312-win_amd64.whl", hash = "sha256:2f4ac52f0130275d7517b03a33d2493bab3693c83dcfadf4f81688ea82147d2e", size = 241326087, upload-time = "2025-08-06T14:53:46.503Z" }, + { url = "https://files.pythonhosted.org/packages/be/66/5c9a321b325aaecb92d4d1855421e3a055abd77903b7dab6575ca07796db/torch-2.8.0-cp312-none-macosx_11_0_arm64.whl", hash = "sha256:619c2869db3ada2c0105487ba21b5008defcc472d23f8b80ed91ac4a380283b0", size = 73630478, upload-time = "2025-08-06T14:53:57.144Z" }, + { url = "https://files.pythonhosted.org/packages/10/4e/469ced5a0603245d6a19a556e9053300033f9c5baccf43a3d25ba73e189e/torch-2.8.0-cp313-cp313-manylinux_2_28_aarch64.whl", hash = "sha256:2b2f96814e0345f5a5aed9bf9734efa913678ed19caf6dc2cddb7930672d6128", size = 101936856, upload-time = "2025-08-06T14:54:01.526Z" }, + { url = "https://files.pythonhosted.org/packages/16/82/3948e54c01b2109238357c6f86242e6ecbf0c63a1af46906772902f82057/torch-2.8.0-cp313-cp313-manylinux_2_28_x86_64.whl", hash = "sha256:65616ca8ec6f43245e1f5f296603e33923f4c30f93d65e103d9e50c25b35150b", size = 887922844, upload-time = "2025-08-06T14:55:50.78Z" }, + { url = "https://files.pythonhosted.org/packages/e3/54/941ea0a860f2717d86a811adf0c2cd01b3983bdd460d0803053c4e0b8649/torch-2.8.0-cp313-cp313-win_amd64.whl", hash = "sha256:659df54119ae03e83a800addc125856effda88b016dfc54d9f65215c3975be16", size = 241330968, upload-time = "2025-08-06T14:54:45.293Z" }, + { url = "https://files.pythonhosted.org/packages/de/69/8b7b13bba430f5e21d77708b616f767683629fc4f8037564a177d20f90ed/torch-2.8.0-cp313-cp313t-macosx_14_0_arm64.whl", hash = "sha256:1a62a1ec4b0498930e2543535cf70b1bef8c777713de7ceb84cd79115f553767", size = 73915128, upload-time = "2025-08-06T14:54:34.769Z" }, + { url = "https://files.pythonhosted.org/packages/15/0e/8a800e093b7f7430dbaefa80075aee9158ec22e4c4fc3c1a66e4fb96cb4f/torch-2.8.0-cp313-cp313t-manylinux_2_28_aarch64.whl", hash = "sha256:83c13411a26fac3d101fe8035a6b0476ae606deb8688e904e796a3534c197def", size = 102020139, upload-time = "2025-08-06T14:54:39.047Z" }, + { url = "https://files.pythonhosted.org/packages/4a/15/5e488ca0bc6162c86a33b58642bc577c84ded17c7b72d97e49b5833e2d73/torch-2.8.0-cp313-cp313t-manylinux_2_28_x86_64.whl", hash = "sha256:8f0a9d617a66509ded240add3754e462430a6c1fc5589f86c17b433dd808f97a", size = 887990692, upload-time = "2025-08-06T14:56:18.286Z" }, + { url = "https://files.pythonhosted.org/packages/b4/a8/6a04e4b54472fc5dba7ca2341ab219e529f3c07b6941059fbf18dccac31f/torch-2.8.0-cp313-cp313t-win_amd64.whl", hash = "sha256:a7242b86f42be98ac674b88a4988643b9bc6145437ec8f048fea23f72feb5eca", size = 241603453, upload-time = "2025-08-06T14:55:22.945Z" }, + { url = "https://files.pythonhosted.org/packages/04/6e/650bb7f28f771af0cb791b02348db8b7f5f64f40f6829ee82aa6ce99aabe/torch-2.8.0-cp313-none-macosx_11_0_arm64.whl", hash = "sha256:7b677e17f5a3e69fdef7eb3b9da72622f8d322692930297e4ccb52fefc6c8211", size = 73632395, upload-time = "2025-08-06T14:55:28.645Z" }, +] + +[[package]] +name = "torch-audiomentations" +version = "0.12.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "julius" }, + { name = "torch" }, + { name = "torch-pitch-shift" }, + { name = "torchaudio" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/31/8d/2f8fd7e34c75f5ee8de4310c3bd3f22270acd44d1f809e2fe7c12fbf35f8/torch_audiomentations-0.12.0.tar.gz", hash = "sha256:b02d4c5eb86376986a53eb405cca5e34f370ea9284411237508e720c529f7888", size = 52094, upload-time = "2025-01-15T09:07:01.071Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/21/9d/1ee04f49c15d2d632f6f7102061d7c07652858e6d91b58a091531034e84f/torch_audiomentations-0.12.0-py3-none-any.whl", hash = "sha256:1b80b91d2016ccf83979622cac8f702072a79b7dcc4c2bee40f00b26433a786b", size = 48506, upload-time = "2025-01-15T09:06:59.687Z" }, +] + +[[package]] +name = "torch-pitch-shift" +version = "1.2.5" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "packaging" }, + { name = "primepy" }, + { name = "torch" }, + { name = "torchaudio" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/79/a6/722a832bca75d5079f6731e005b3d0c2eec7c6c6863d030620952d143d57/torch_pitch_shift-1.2.5.tar.gz", hash = "sha256:6e1c7531f08d0f407a4c55e5ff8385a41355c5c5d27ab7fa08632e51defbd0ed", size = 4725, upload-time = "2024-09-25T19:10:12.922Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/27/4c/96ac2a09efb56cc3c41fb3ce9b6f4d8c0604499f7481d4a13a7b03e21382/torch_pitch_shift-1.2.5-py3-none-any.whl", hash = "sha256:6f8500cbc13f1c98b11cde1805ce5084f82cdd195c285f34287541f168a7c6a7", size = 5005, upload-time = "2024-09-25T19:10:11.521Z" }, +] + +[[package]] +name = "torchaudio" +version = "2.8.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "torch" }, +] +wheels = [ + { url = "https://files.pythonhosted.org/packages/30/81/92d34ff136b17ddda872f6d8149f2ca927ad53a37ae26d02cb5f66435772/torchaudio-2.8.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:c2f44cf279f673cfcdd8f576c349eee8bedf8caab351a5dd78b32970cc34a212", size = 1852315, upload-time = "2025-08-06T14:58:32.64Z" }, + { url = "https://files.pythonhosted.org/packages/95/c8/e46c22a3c059844bb0f1b670317c9e538b51728558326dcd9e5fffbf2ec2/torchaudio-2.8.0-cp310-cp310-manylinux_2_28_aarch64.whl", hash = "sha256:d3c1b85b26a09832d139f6d6da6b66caeb51d2e16e08f8587665c44a9e1aa8f9", size = 1685620, upload-time = "2025-08-06T14:58:34.045Z" }, + { url = "https://files.pythonhosted.org/packages/d8/f5/69db76b564263f22c1788cc298ab1c4e2391a79fa8ba7b4a3e76d945292a/torchaudio-2.8.0-cp310-cp310-manylinux_2_28_x86_64.whl", hash = "sha256:58f912bf2d289c709b42a55475b2b483becec79d9affb7684b606bb1f896b434", size = 4001714, upload-time = "2025-08-06T14:58:38.951Z" }, + { url = "https://files.pythonhosted.org/packages/f1/18/63adf60a9f0592c6dcea2b37735990881edbbe671e3af3ae79f2da816a50/torchaudio-2.8.0-cp310-cp310-win_amd64.whl", hash = "sha256:4e2b4712ad6d7547ce82d84567c8c29d5e2966ff1d31d94e1644024fb4b2649f", size = 2500313, upload-time = "2025-08-06T14:58:42.441Z" }, + { url = "https://files.pythonhosted.org/packages/dd/bf/6b01ef3defb8d0a772c863588711e9b2b011c27d6b37c1b9d15a359c8442/torchaudio-2.8.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:c9276857d241c6de257af765c0f51fc011af38cb725401495121b280913007cf", size = 1859094, upload-time = "2025-08-06T14:58:35.078Z" }, + { url = "https://files.pythonhosted.org/packages/75/ca/da5d0a3bb7d114a8b590ecce14859ea0a05102bb4de68cdd1ed7a90634d6/torchaudio-2.8.0-cp311-cp311-manylinux_2_28_aarch64.whl", hash = "sha256:4573c6042950c20278e3608a9a38050ba0bc72e0049e1bbfd249caf859a8029b", size = 1692033, upload-time = "2025-08-06T14:58:37.393Z" }, + { url = "https://files.pythonhosted.org/packages/b6/ef/62ac736d8f906cc414181050e08a495a637dab985186c34bd76ea37efbc0/torchaudio-2.8.0-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:776c0b4ba84b9e3ddf6304b9c47cd63549d7896a6f3d5184ece074cc3d76ed6b", size = 4011716, upload-time = "2025-08-06T14:58:40.138Z" }, + { url = "https://files.pythonhosted.org/packages/14/86/015337c8434abc604b8680371df783f66c421a7f211cbe40a374b0540b6d/torchaudio-2.8.0-cp311-cp311-win_amd64.whl", hash = "sha256:078105bf80f725c0215a0bebac8cb2fb1b3993ab32bdc3fcd50145a5b4127001", size = 2505194, upload-time = "2025-08-06T14:58:57.301Z" }, + { url = "https://files.pythonhosted.org/packages/ac/cc/c2e2a3eb6ee956f73c68541e439916f8146170ea9cc61e72adea5c995312/torchaudio-2.8.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:ddef94bf181e6447cbb05f38beaca8f6c5bb8d2b9ddced1aa3452025b9fc70d3", size = 1856736, upload-time = "2025-08-06T14:58:36.3Z" }, + { url = "https://files.pythonhosted.org/packages/c7/0d/24dad878784f1edd62862f27173781669f0c71eb46368636787d1e364188/torchaudio-2.8.0-cp312-cp312-manylinux_2_28_aarch64.whl", hash = "sha256:862e2e40bf09d865e5df080a84c1a39bbcef40e43140f4b1737eb3a389d3b38f", size = 1692930, upload-time = "2025-08-06T14:58:41.312Z" }, + { url = "https://files.pythonhosted.org/packages/c2/a6/84d80f34472503e9eb82245d7df501c59602d75d7360e717fb9b84f91c5e/torchaudio-2.8.0-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:93a8583f280fe83ba021aa713319381ea71362cc87b67ee38e97a43cb2254aee", size = 4014607, upload-time = "2025-08-06T14:58:47.234Z" }, + { url = "https://files.pythonhosted.org/packages/43/ab/96ad33afa320738a7cfb4b51ba97e2f3cfb1e04ae3115d5057655103ba4f/torchaudio-2.8.0-cp312-cp312-win_amd64.whl", hash = "sha256:4b82cacd1b8ccd543b1149d8cab257a40dfda8119023d2e3a96c66349c84bffb", size = 2499890, upload-time = "2025-08-06T14:58:55.066Z" }, + { url = "https://files.pythonhosted.org/packages/3b/ea/2a68259c4dbb5fe44ebfdcfa40b115010d8c677221a7ef0f5577f3c4f5f1/torchaudio-2.8.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:f851d32e94ca05e470f0c60e25726ec1e0eb71cb2ca5a0206b7fd03272ccc3c8", size = 1857045, upload-time = "2025-08-06T14:58:51.984Z" }, + { url = "https://files.pythonhosted.org/packages/0d/a3/1c79a8ef29fe403b83bdfc033db852bc2a888b80c406325e5c6fb37a7f2d/torchaudio-2.8.0-cp313-cp313-manylinux_2_28_aarch64.whl", hash = "sha256:09535a9b727c0793cd07c1ace99f3f353626281bcc3e30c2f2314e3ebc9d3f96", size = 1692755, upload-time = "2025-08-06T14:58:50.868Z" }, + { url = "https://files.pythonhosted.org/packages/49/df/61941198e9ac6bcebfdd57e1836e4f3c23409308e3d8d7458f0198a6a366/torchaudio-2.8.0-cp313-cp313-manylinux_2_28_x86_64.whl", hash = "sha256:d2a85b124494736241884372fe1c6dd8c15e9bc1931bd325838c5c00238c7378", size = 4013897, upload-time = "2025-08-06T14:59:01.66Z" }, + { url = "https://files.pythonhosted.org/packages/c3/ab/7175d35a4bbc4a465a9f1388571842f16eb6dec5069d7ea9c8c2d7b5b401/torchaudio-2.8.0-cp313-cp313-win_amd64.whl", hash = "sha256:c1b5139c840367a7855a062a06688a416619f6fd2ca46d9b9299b49a7d133dfd", size = 2500085, upload-time = "2025-08-06T14:58:44.95Z" }, + { url = "https://files.pythonhosted.org/packages/34/1a/69b9f8349d9d57953d5e7e445075cbf74000173fb5f5d5d9e9d59415fc63/torchaudio-2.8.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:68df9c9068984edff8065c2b6656725e6114fe89281b0cf122c7505305fc98a4", size = 1935600, upload-time = "2025-08-06T14:58:46.051Z" }, + { url = "https://files.pythonhosted.org/packages/71/76/40fec21b65bccfdc5c8cdb9d511033ab07a7ad4b05f0a5b07f85c68279fc/torchaudio-2.8.0-cp313-cp313t-manylinux_2_28_aarch64.whl", hash = "sha256:1951f10ed092f2dda57634f6a3950ef21c9d9352551aa84a9fccd51bbda18095", size = 1704199, upload-time = "2025-08-06T14:58:43.594Z" }, + { url = "https://files.pythonhosted.org/packages/8e/53/95c3363413c2f2009f805144160b093a385f641224465fbcd717449c71fb/torchaudio-2.8.0-cp313-cp313t-manylinux_2_28_x86_64.whl", hash = "sha256:4f7d97494698d98854129349b12061e8c3398d33bd84c929fa9aed5fd1389f73", size = 4020596, upload-time = "2025-08-06T14:59:03.031Z" }, + { url = "https://files.pythonhosted.org/packages/52/27/7fc2d7435af044ffbe0b9b8e98d99eac096d43f128a5cde23c04825d5dcf/torchaudio-2.8.0-cp313-cp313t-win_amd64.whl", hash = "sha256:d4a715d09ac28c920d031ee1e60ecbc91e8a5079ad8c61c0277e658436c821a6", size = 2549553, upload-time = "2025-08-06T14:59:00.019Z" }, +] + +[[package]] +name = "torchcodec" +version = "0.7.0" +source = { registry = "https://pypi.org/simple" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/d8/23/ca6bd1bc5e22786596e25d1dd62a6a4e733802940b54726a54fcf5a8795b/torchcodec-0.7.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:6ae0b7acbc0c1a755ae817a8843715131f24be7807ddc46092d8b49a0fc970eb", size = 2891797, upload-time = "2025-09-08T14:17:48.602Z" }, + { url = "https://files.pythonhosted.org/packages/0d/81/cff42793544b7d3e2ff9a4912542c6d1c7a617aabe8404f8fd3d52453f20/torchcodec-0.7.0-cp310-cp310-manylinux_2_28_x86_64.whl", hash = "sha256:a0071096724e8ded6a171457ce4680f646499b4a4d285cdb46e130983f965ce4", size = 1411823, upload-time = "2025-09-08T14:17:39.405Z" }, + { url = "https://files.pythonhosted.org/packages/ad/b9/7f03bf7d42e0f7ab5598d400cb1133d3f227b52aad15d88b2ab9c97fe1ff/torchcodec-0.7.0-cp310-cp310-win_amd64.whl", hash = "sha256:737da9212594bf2f205582512a7a4f56d39591b357bf5a30e72e858cfcedc2ac", size = 1553965, upload-time = "2025-09-08T14:17:57.187Z" }, + { url = "https://files.pythonhosted.org/packages/6a/f1/bb2b5ab929ef3f092cb6508673510ffc2aafd8324493c94a2d41f1c8a683/torchcodec-0.7.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:967a14b31e04721901ddbf965f9e9f733f328c5e98a51e22f414e25ac32e20ba", size = 3388626, upload-time = "2025-09-08T14:17:50.433Z" }, + { url = "https://files.pythonhosted.org/packages/06/14/8ff28247988365fc47e8471e28cdfd8d037232fcf73abb67ee815ac80f1d/torchcodec-0.7.0-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:afb1c48b52bd4ee8f485f5a427bb4e82380590255a26b8e9e3fe099e0779287f", size = 1419444, upload-time = "2025-09-08T14:17:41.479Z" }, + { url = "https://files.pythonhosted.org/packages/1f/80/04f23dff2c7ac406d2d6b24a52be7654a946d2fdfe158b19341a524dae20/torchcodec-0.7.0-cp311-cp311-win_amd64.whl", hash = "sha256:a68765cd29159da3cf36eb5716481c617ad9d168fe06418bcde2a9360cc7eb5e", size = 1563430, upload-time = "2025-09-08T14:17:58.571Z" }, + { url = "https://files.pythonhosted.org/packages/c7/b2/6d3e190fcd18c65b35f6da734d4415c72b42c8a72ffc2494d998bad8caf3/torchcodec-0.7.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:d9d082bbb599f4f7715bfc3b1afa5bc16d8fb9d852e68084c63f1973cc78a1cb", size = 3574506, upload-time = "2025-09-08T14:17:52.071Z" }, + { url = "https://files.pythonhosted.org/packages/41/10/4a1a8407d0fad37cb43d1f749e7b422e5a0f6def17f3b90ab9ab9a105e32/torchcodec-0.7.0-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:3cd23c3296c9b071d56bb2c534a6a98275d65c1a6a7213cdb72a26ec9f9d2fd8", size = 1421871, upload-time = "2025-09-08T14:17:43.419Z" }, + { url = "https://files.pythonhosted.org/packages/9b/e7/a2fa7ed9c81d7d683d37ca7204007b421c0537132364a9cfd8d577f19a96/torchcodec-0.7.0-cp312-cp312-win_amd64.whl", hash = "sha256:ac942831bff02e6041d8718b71c6f63e4e37c05dd95e72863725c9dbef0d4a7b", size = 1565029, upload-time = "2025-09-08T14:18:02.83Z" }, + { url = "https://files.pythonhosted.org/packages/3c/82/7c7691d538f67704b2b2444deb0e234ae564f9329bc9becf66d69998bc9b/torchcodec-0.7.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:32a0115035a7f0a77fa451f67c101e0273a3a37d33b69e1bcd777f00aceb7340", size = 3537881, upload-time = "2025-09-08T14:17:54.254Z" }, + { url = "https://files.pythonhosted.org/packages/01/25/177ea01d138598ab68d5e3b000789e8617bf97874bd8f761d89093f419ba/torchcodec-0.7.0-cp313-cp313-manylinux_2_28_x86_64.whl", hash = "sha256:9c70f910f9f48e6625aacaed534f766e13d447b895dc7299e96d4db9a93f1514", size = 1422493, upload-time = "2025-09-08T14:17:45.41Z" }, + { url = "https://files.pythonhosted.org/packages/5c/a9/e2b6301fbf4590d352e183bef64927f74ef4d4f660cca3ed7a32dda60484/torchcodec-0.7.0-cp313-cp313-win_amd64.whl", hash = "sha256:31b402c9ae3c6e9f33c41fddf7058f9492c443ad55d02f022395f8fa196b58f6", size = 1565405, upload-time = "2025-09-08T14:18:04.217Z" }, +] + +[[package]] +name = "torchmetrics" +version = "1.9.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "lightning-utilities" }, + { name = "numpy", version = "2.2.6", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, + { name = "numpy", version = "2.4.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, + { name = "packaging" }, + { name = "torch" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/81/34/39b8b749333db56c0585d7a11fa62a283c087bb1dfc897d69fb8cedbefb1/torchmetrics-1.9.0.tar.gz", hash = "sha256:a488609948600df52d3db4fcdab02e62aab2a85ef34da67037dc3e65b8512faa", size = 581765, upload-time = "2026-03-09T17:41:22.443Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/c3/a2/c7f6ebf546f8f644edf0f999aa98ece106986a77a7b922316bf6414ff825/torchmetrics-1.9.0-py3-none-any.whl", hash = "sha256:bfdcbff3dd1d96b3374bb2496eb39f23c4b28b8a845b6a18c313688e0d2d9ca1", size = 983384, upload-time = "2026-03-09T17:41:19.756Z" }, +] + +[[package]] +name = "tqdm" +version = "4.67.3" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "colorama", marker = "sys_platform == 'win32'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/09/a9/6ba95a270c6f1fbcd8dac228323f2777d886cb206987444e4bce66338dd4/tqdm-4.67.3.tar.gz", hash = "sha256:7d825f03f89244ef73f1d4ce193cb1774a8179fd96f31d7e1dcde62092b960bb", size = 169598, upload-time = "2026-02-03T17:35:53.048Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/16/e1/3079a9ff9b8e11b846c6ac5c8b5bfb7ff225eee721825310c91b3b50304f/tqdm-4.67.3-py3-none-any.whl", hash = "sha256:ee1e4c0e59148062281c49d80b25b67771a127c85fc9676d3be5f243206826bf", size = 78374, upload-time = "2026-02-03T17:35:50.982Z" }, +] + +[[package]] +name = "triton" +version = "3.4.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "setuptools" }, +] +wheels = [ + { url = "https://files.pythonhosted.org/packages/62/ee/0ee5f64a87eeda19bbad9bc54ae5ca5b98186ed00055281fd40fb4beb10e/triton-3.4.0-cp310-cp310-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:7ff2785de9bc02f500e085420273bb5cc9c9bb767584a4aa28d6e360cec70128", size = 155430069, upload-time = "2025-07-30T19:58:21.715Z" }, + { url = "https://files.pythonhosted.org/packages/7d/39/43325b3b651d50187e591eefa22e236b2981afcebaefd4f2fc0ea99df191/triton-3.4.0-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:7b70f5e6a41e52e48cfc087436c8a28c17ff98db369447bcaff3b887a3ab4467", size = 155531138, upload-time = "2025-07-30T19:58:29.908Z" }, + { url = "https://files.pythonhosted.org/packages/d0/66/b1eb52839f563623d185f0927eb3530ee4d5ffe9d377cdaf5346b306689e/triton-3.4.0-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:31c1d84a5c0ec2c0f8e8a072d7fd150cab84a9c239eaddc6706c081bfae4eb04", size = 155560068, upload-time = "2025-07-30T19:58:37.081Z" }, + { url = "https://files.pythonhosted.org/packages/30/7b/0a685684ed5322d2af0bddefed7906674f67974aa88b0fae6e82e3b766f6/triton-3.4.0-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:00be2964616f4c619193cb0d1b29a99bd4b001d7dc333816073f92cf2a8ccdeb", size = 155569223, upload-time = "2025-07-30T19:58:44.017Z" }, + { url = "https://files.pythonhosted.org/packages/20/63/8cb444ad5cdb25d999b7d647abac25af0ee37d292afc009940c05b82dda0/triton-3.4.0-cp313-cp313t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:7936b18a3499ed62059414d7df563e6c163c5e16c3773678a3ee3d417865035d", size = 155659780, upload-time = "2025-07-30T19:58:51.171Z" }, +] + +[[package]] +name = "typer" +version = "0.24.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "annotated-doc" }, + { name = "click" }, + { name = "rich" }, + { name = "shellingham" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/f5/24/cb09efec5cc954f7f9b930bf8279447d24618bb6758d4f6adf2574c41780/typer-0.24.1.tar.gz", hash = "sha256:e39b4732d65fbdcde189ae76cf7cd48aeae72919dea1fdfc16593be016256b45", size = 118613, upload-time = "2026-02-21T16:54:40.609Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/4a/91/48db081e7a63bb37284f9fbcefda7c44c277b18b0e13fbc36ea2335b71e6/typer-0.24.1-py3-none-any.whl", hash = "sha256:112c1f0ce578bfb4cab9ffdabc68f031416ebcc216536611ba21f04e9aa84c9e", size = 56085, upload-time = "2026-02-21T16:54:41.616Z" }, +] + +[[package]] +name = "typing-extensions" +version = "4.15.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/72/94/1a15dd82efb362ac84269196e94cf00f187f7ed21c242792a923cdb1c61f/typing_extensions-4.15.0.tar.gz", hash = "sha256:0cea48d173cc12fa28ecabc3b837ea3cf6f38c6d1136f85cbaaf598984861466", size = 109391, upload-time = "2025-08-25T13:49:26.313Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/18/67/36e9267722cc04a6b9f15c7f3441c2363321a3ea07da7ae0c0707beb2a9c/typing_extensions-4.15.0-py3-none-any.whl", hash = "sha256:f0fa19c6845758ab08074a0cfa8b7aecb71c999ca73d62883bc25cc018c4e548", size = 44614, upload-time = "2025-08-25T13:49:24.86Z" }, +] + +[[package]] +name = "tzdata" +version = "2025.3" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/5e/a7/c202b344c5ca7daf398f3b8a477eeb205cf3b6f32e7ec3a6bac0629ca975/tzdata-2025.3.tar.gz", hash = "sha256:de39c2ca5dc7b0344f2eba86f49d614019d29f060fc4ebc8a417896a620b56a7", size = 196772, upload-time = "2025-12-13T17:45:35.667Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/c7/b0/003792df09decd6849a5e39c28b513c06e84436a54440380862b5aeff25d/tzdata-2025.3-py2.py3-none-any.whl", hash = "sha256:06a47e5700f3081aab02b2e513160914ff0694bce9947d6b76ebd6bf57cfc5d1", size = 348521, upload-time = "2025-12-13T17:45:33.889Z" }, +] + +[[package]] +name = "urllib3" +version = "2.6.3" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/c7/24/5f1b3bdffd70275f6661c76461e25f024d5a38a46f04aaca912426a2b1d3/urllib3-2.6.3.tar.gz", hash = "sha256:1b62b6884944a57dbe321509ab94fd4d3b307075e0c2eae991ac71ee15ad38ed", size = 435556, upload-time = "2026-01-07T16:24:43.925Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/39/08/aaaad47bc4e9dc8c725e68f9d04865dbcb2052843ff09c97b08904852d84/urllib3-2.6.3-py3-none-any.whl", hash = "sha256:bf272323e553dfb2e87d9bfd225ca7b0f467b919d7bbd355436d3fd37cb0acd4", size = 131584, upload-time = "2026-01-07T16:24:42.685Z" }, +] + +[[package]] +name = "yarl" +version = "1.23.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "idna" }, + { name = "multidict" }, + { name = "propcache" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/23/6e/beb1beec874a72f23815c1434518bfc4ed2175065173fb138c3705f658d4/yarl-1.23.0.tar.gz", hash = "sha256:53b1ea6ca88ebd4420379c330aea57e258408dd0df9af0992e5de2078dc9f5d5", size = 194676, upload-time = "2026-03-01T22:07:53.373Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/8b/0d/9cc638702f6fc3c7a3685bcc8cf2a9ed7d6206e932a49f5242658047ef51/yarl-1.23.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:cff6d44cb13d39db2663a22b22305d10855efa0fa8015ddeacc40bc59b9d8107", size = 123764, upload-time = "2026-03-01T22:04:09.7Z" }, + { url = "https://files.pythonhosted.org/packages/7a/35/5a553687c5793df5429cd1db45909d4f3af7eee90014888c208d086a44f0/yarl-1.23.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:e4c53f8347cd4200f0d70a48ad059cabaf24f5adc6ba08622a23423bc7efa10d", size = 86282, upload-time = "2026-03-01T22:04:11.892Z" }, + { url = "https://files.pythonhosted.org/packages/68/2e/c5a2234238f8ce37a8312b52801ee74117f576b1539eec8404a480434acc/yarl-1.23.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:2a6940a074fb3c48356ed0158a3ca5699c955ee4185b4d7d619be3c327143e05", size = 86053, upload-time = "2026-03-01T22:04:13.292Z" }, + { url = "https://files.pythonhosted.org/packages/74/3f/bbd8ff36fb038622797ffbaf7db314918bb4d76f1cc8a4f9ca7a55fe5195/yarl-1.23.0-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ed5f69ce7be7902e5c70ea19eb72d20abf7d725ab5d49777d696e32d4fc1811d", size = 99395, upload-time = "2026-03-01T22:04:15.133Z" }, + { url = "https://files.pythonhosted.org/packages/77/04/9516bc4e269d2a3ec9c6779fcdeac51ce5b3a9b0156f06ac7152e5bba864/yarl-1.23.0-cp310-cp310-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:389871e65468400d6283c0308e791a640b5ab5c83bcee02a2f51295f95e09748", size = 92143, upload-time = "2026-03-01T22:04:16.829Z" }, + { url = "https://files.pythonhosted.org/packages/c7/63/88802d1f6b1cb1fc67d67a58cd0cf8a1790de4ce7946e434240f1d60ab4a/yarl-1.23.0-cp310-cp310-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:dda608c88cf709b1d406bdfcd84d8d63cff7c9e577a403c6108ce8ce9dcc8764", size = 107643, upload-time = "2026-03-01T22:04:18.519Z" }, + { url = "https://files.pythonhosted.org/packages/8e/db/4f9b838f4d8bdd6f0f385aed8bbf21c71ed11a0b9983305c302cbd557815/yarl-1.23.0-cp310-cp310-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:8c4fe09e0780c6c3bf2b7d4af02ee2394439d11a523bbcf095cf4747c2932007", size = 108700, upload-time = "2026-03-01T22:04:20.373Z" }, + { url = "https://files.pythonhosted.org/packages/50/12/95a1d33f04a79c402664070d43b8b9f72dc18914e135b345b611b0b1f8cc/yarl-1.23.0-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:31c9921eb8bd12633b41ad27686bbb0b1a2a9b8452bfdf221e34f311e9942ed4", size = 102769, upload-time = "2026-03-01T22:04:23.055Z" }, + { url = "https://files.pythonhosted.org/packages/86/65/91a0285f51321369fd1a8308aa19207520c5f0587772cfc2e03fc2467e90/yarl-1.23.0-cp310-cp310-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:5f10fd85e4b75967468af655228fbfd212bdf66db1c0d135065ce288982eda26", size = 101114, upload-time = "2026-03-01T22:04:25.031Z" }, + { url = "https://files.pythonhosted.org/packages/58/80/c7c8244fc3e5bc483dc71a09560f43b619fab29301a0f0a8f936e42865c7/yarl-1.23.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:dbf507e9ef5688bada447a24d68b4b58dd389ba93b7afc065a2ba892bea54769", size = 98883, upload-time = "2026-03-01T22:04:27.281Z" }, + { url = "https://files.pythonhosted.org/packages/86/e7/71ca9cc9ca79c0b7d491216177d1aed559d632947b8ffb0ee60f7d8b23e3/yarl-1.23.0-cp310-cp310-musllinux_1_2_armv7l.whl", hash = "sha256:85e9beda1f591bc73e77ea1c51965c68e98dafd0fec72cdd745f77d727466716", size = 94172, upload-time = "2026-03-01T22:04:28.554Z" }, + { url = "https://files.pythonhosted.org/packages/6a/3f/6c6c8a0fe29c26fb2db2e8d32195bb84ec1bfb8f1d32e7f73b787fcf349b/yarl-1.23.0-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:0e1fdaa14ef51366d7757b45bde294e95f6c8c049194e793eedb8387c86d5993", size = 107010, upload-time = "2026-03-01T22:04:30.385Z" }, + { url = "https://files.pythonhosted.org/packages/56/38/12730c05e5ad40a76374d440ed8b0899729a96c250516d91c620a6e38fc2/yarl-1.23.0-cp310-cp310-musllinux_1_2_riscv64.whl", hash = "sha256:75e3026ab649bf48f9a10c0134512638725b521340293f202a69b567518d94e0", size = 100285, upload-time = "2026-03-01T22:04:31.752Z" }, + { url = "https://files.pythonhosted.org/packages/34/92/6a7be9239f2347234e027284e7a5f74b1140cc86575e7b469d13fba1ebfe/yarl-1.23.0-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:80e6d33a3d42a7549b409f199857b4fb54e2103fc44fb87605b6663b7a7ff750", size = 108230, upload-time = "2026-03-01T22:04:33.844Z" }, + { url = "https://files.pythonhosted.org/packages/5e/81/4aebccfa9376bd98b9d8bfad20621a57d3e8cfc5b8631c1fa5f62cdd03f4/yarl-1.23.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:5ec2f42d41ccbd5df0270d7df31618a8ee267bfa50997f5d720ddba86c4a83a6", size = 103008, upload-time = "2026-03-01T22:04:35.856Z" }, + { url = "https://files.pythonhosted.org/packages/38/0f/0b4e3edcec794a86b853b0c6396c0a888d72dfce19b2d88c02ac289fb6c1/yarl-1.23.0-cp310-cp310-win32.whl", hash = "sha256:debe9c4f41c32990771be5c22b56f810659f9ddf3d63f67abfdcaa2c6c9c5c1d", size = 83073, upload-time = "2026-03-01T22:04:38.268Z" }, + { url = "https://files.pythonhosted.org/packages/a0/71/ad95c33da18897e4c636528bbc24a1dd23fe16797de8bc4ec667b8db0ba4/yarl-1.23.0-cp310-cp310-win_amd64.whl", hash = "sha256:ab5f043cb8a2d71c981c09c510da013bc79fd661f5c60139f00dd3c3cc4f2ffb", size = 87328, upload-time = "2026-03-01T22:04:39.558Z" }, + { url = "https://files.pythonhosted.org/packages/e2/14/dfa369523c79bccf9c9c746b0a63eb31f65db9418ac01275f7950962e504/yarl-1.23.0-cp310-cp310-win_arm64.whl", hash = "sha256:263cd4f47159c09b8b685890af949195b51d1aa82ba451c5847ca9bc6413c220", size = 82463, upload-time = "2026-03-01T22:04:41.454Z" }, + { url = "https://files.pythonhosted.org/packages/a2/aa/60da938b8f0997ba3a911263c40d82b6f645a67902a490b46f3355e10fae/yarl-1.23.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:b35d13d549077713e4414f927cdc388d62e543987c572baee613bf82f11a4b99", size = 123641, upload-time = "2026-03-01T22:04:42.841Z" }, + { url = "https://files.pythonhosted.org/packages/24/84/e237607faf4e099dbb8a4f511cfd5efcb5f75918baad200ff7380635631b/yarl-1.23.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:cbb0fef01f0c6b38cb0f39b1f78fc90b807e0e3c86a7ff3ce74ad77ce5c7880c", size = 86248, upload-time = "2026-03-01T22:04:44.757Z" }, + { url = "https://files.pythonhosted.org/packages/b2/0d/71ceabc14c146ba8ee3804ca7b3d42b1664c8440439de5214d366fec7d3a/yarl-1.23.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:dc52310451fc7c629e13c4e061cbe2dd01684d91f2f8ee2821b083c58bd72432", size = 85988, upload-time = "2026-03-01T22:04:46.365Z" }, + { url = "https://files.pythonhosted.org/packages/8c/6c/4a90d59c572e46b270ca132aca66954f1175abd691f74c1ef4c6711828e2/yarl-1.23.0-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b2c6b50c7b0464165472b56b42d4c76a7b864597007d9c085e8b63e185cf4a7a", size = 100566, upload-time = "2026-03-01T22:04:47.639Z" }, + { url = "https://files.pythonhosted.org/packages/49/fb/c438fb5108047e629f6282a371e6e91cf3f97ee087c4fb748a1f32ceef55/yarl-1.23.0-cp311-cp311-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:aafe5dcfda86c8af00386d7781d4c2181b5011b7be3f2add5e99899ea925df05", size = 92079, upload-time = "2026-03-01T22:04:48.925Z" }, + { url = "https://files.pythonhosted.org/packages/d9/13/d269aa1aed3e4f50a5a103f96327210cc5fa5dd2d50882778f13c7a14606/yarl-1.23.0-cp311-cp311-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:9ee33b875f0b390564c1fb7bc528abf18c8ee6073b201c6ae8524aca778e2d83", size = 108741, upload-time = "2026-03-01T22:04:50.838Z" }, + { url = "https://files.pythonhosted.org/packages/85/fb/115b16f22c37ea4437d323e472945bea97301c8ec6089868fa560abab590/yarl-1.23.0-cp311-cp311-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:4c41e021bc6d7affb3364dc1e1e5fa9582b470f283748784bd6ea0558f87f42c", size = 108099, upload-time = "2026-03-01T22:04:52.499Z" }, + { url = "https://files.pythonhosted.org/packages/9a/64/c53487d9f4968045b8afa51aed7ca44f58b2589e772f32745f3744476c82/yarl-1.23.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:99c8a9ed30f4164bc4c14b37a90208836cbf50d4ce2a57c71d0f52c7fb4f7598", size = 102678, upload-time = "2026-03-01T22:04:55.176Z" }, + { url = "https://files.pythonhosted.org/packages/85/59/cd98e556fbb2bf8fab29c1a722f67ad45c5f3447cac798ab85620d1e70af/yarl-1.23.0-cp311-cp311-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:f2af5c81a1f124609d5f33507082fc3f739959d4719b56877ab1ee7e7b3d602b", size = 100803, upload-time = "2026-03-01T22:04:56.588Z" }, + { url = "https://files.pythonhosted.org/packages/9e/c0/b39770b56d4a9f0bb5f77e2f1763cd2d75cc2f6c0131e3b4c360348fcd65/yarl-1.23.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:6b41389c19b07c760c7e427a3462e8ab83c4bb087d127f0e854c706ce1b9215c", size = 100163, upload-time = "2026-03-01T22:04:58.492Z" }, + { url = "https://files.pythonhosted.org/packages/e7/64/6980f99ab00e1f0ff67cb84766c93d595b067eed07439cfccfc8fb28c1a6/yarl-1.23.0-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:1dc702e42d0684f42d6519c8d581e49c96cefaaab16691f03566d30658ee8788", size = 93859, upload-time = "2026-03-01T22:05:00.268Z" }, + { url = "https://files.pythonhosted.org/packages/38/69/912e6c5e146793e5d4b5fe39ff5b00f4d22463dfd5a162bec565ac757673/yarl-1.23.0-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:0e40111274f340d32ebcc0a5668d54d2b552a6cca84c9475859d364b380e3222", size = 108202, upload-time = "2026-03-01T22:05:02.273Z" }, + { url = "https://files.pythonhosted.org/packages/59/97/35ca6767524687ad64e5f5c31ad54bc76d585585a9fcb40f649e7e82ffed/yarl-1.23.0-cp311-cp311-musllinux_1_2_riscv64.whl", hash = "sha256:4764a6a7588561a9aef92f65bda2c4fb58fe7c675c0883862e6df97559de0bfb", size = 99866, upload-time = "2026-03-01T22:05:03.597Z" }, + { url = "https://files.pythonhosted.org/packages/d3/1c/1a3387ee6d73589f6f2a220ae06f2984f6c20b40c734989b0a44f5987308/yarl-1.23.0-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:03214408cfa590df47728b84c679ae4ef00be2428e11630277be0727eba2d7cc", size = 107852, upload-time = "2026-03-01T22:05:04.986Z" }, + { url = "https://files.pythonhosted.org/packages/a4/b8/35c0750fcd5a3f781058bfd954515dd4b1eab45e218cbb85cf11132215f1/yarl-1.23.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:170e26584b060879e29fac213e4228ef063f39128723807a312e5c7fec28eff2", size = 102919, upload-time = "2026-03-01T22:05:06.397Z" }, + { url = "https://files.pythonhosted.org/packages/e5/1c/9a1979aec4a81896d597bcb2177827f2dbee3f5b7cc48b2d0dadb644b41d/yarl-1.23.0-cp311-cp311-win32.whl", hash = "sha256:51430653db848d258336cfa0244427b17d12db63d42603a55f0d4546f50f25b5", size = 82602, upload-time = "2026-03-01T22:05:08.444Z" }, + { url = "https://files.pythonhosted.org/packages/93/22/b85eca6fa2ad9491af48c973e4c8cf6b103a73dbb271fe3346949449fca0/yarl-1.23.0-cp311-cp311-win_amd64.whl", hash = "sha256:bf49a3ae946a87083ef3a34c8f677ae4243f5b824bfc4c69672e72b3d6719d46", size = 87461, upload-time = "2026-03-01T22:05:10.145Z" }, + { url = "https://files.pythonhosted.org/packages/93/95/07e3553fe6f113e6864a20bdc53a78113cda3b9ced8784ee52a52c9f80d8/yarl-1.23.0-cp311-cp311-win_arm64.whl", hash = "sha256:b39cb32a6582750b6cc77bfb3c49c0f8760dc18dc96ec9fb55fbb0f04e08b928", size = 82336, upload-time = "2026-03-01T22:05:11.554Z" }, + { url = "https://files.pythonhosted.org/packages/88/8a/94615bc31022f711add374097ad4144d569e95ff3c38d39215d07ac153a0/yarl-1.23.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:1932b6b8bba8d0160a9d1078aae5838a66039e8832d41d2992daa9a3a08f7860", size = 124737, upload-time = "2026-03-01T22:05:12.897Z" }, + { url = "https://files.pythonhosted.org/packages/e3/6f/c6554045d59d64052698add01226bc867b52fe4a12373415d7991fdca95d/yarl-1.23.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:411225bae281f114067578891bc75534cfb3d92a3b4dfef7a6ca78ba354e6069", size = 87029, upload-time = "2026-03-01T22:05:14.376Z" }, + { url = "https://files.pythonhosted.org/packages/19/2a/725ecc166d53438bc88f76822ed4b1e3b10756e790bafd7b523fe97c322d/yarl-1.23.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:13a563739ae600a631c36ce096615fe307f131344588b0bc0daec108cdb47b25", size = 86310, upload-time = "2026-03-01T22:05:15.71Z" }, + { url = "https://files.pythonhosted.org/packages/99/30/58260ed98e6ff7f90ba84442c1ddd758c9170d70327394a6227b310cd60f/yarl-1.23.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:9cbf44c5cb4a7633d078788e1b56387e3d3cf2b8139a3be38040b22d6c3221c8", size = 97587, upload-time = "2026-03-01T22:05:17.384Z" }, + { url = "https://files.pythonhosted.org/packages/76/0a/8b08aac08b50682e65759f7f8dde98ae8168f72487e7357a5d684c581ef9/yarl-1.23.0-cp312-cp312-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:53ad387048f6f09a8969631e4de3f1bf70c50e93545d64af4f751b2498755072", size = 92528, upload-time = "2026-03-01T22:05:18.804Z" }, + { url = "https://files.pythonhosted.org/packages/52/07/0b7179101fe5f8385ec6c6bb5d0cb9f76bd9fb4a769591ab6fb5cdbfc69a/yarl-1.23.0-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:4a59ba56f340334766f3a4442e0efd0af895fae9e2b204741ef885c446b3a1a8", size = 105339, upload-time = "2026-03-01T22:05:20.235Z" }, + { url = "https://files.pythonhosted.org/packages/d3/8a/36d82869ab5ec829ca8574dfcb92b51286fcfb1e9c7a73659616362dc880/yarl-1.23.0-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:803a3c3ce4acc62eaf01eaca1208dcf0783025ef27572c3336502b9c232005e7", size = 105061, upload-time = "2026-03-01T22:05:22.268Z" }, + { url = "https://files.pythonhosted.org/packages/66/3e/868e5c3364b6cee19ff3e1a122194fa4ce51def02c61023970442162859e/yarl-1.23.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:a3d2bff8f37f8d0f96c7ec554d16945050d54462d6e95414babaa18bfafc7f51", size = 100132, upload-time = "2026-03-01T22:05:23.638Z" }, + { url = "https://files.pythonhosted.org/packages/cf/26/9c89acf82f08a52cb52d6d39454f8d18af15f9d386a23795389d1d423823/yarl-1.23.0-cp312-cp312-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:c75eb09e8d55bceb4367e83496ff8ef2bc7ea6960efb38e978e8073ea59ecb67", size = 99289, upload-time = "2026-03-01T22:05:25.749Z" }, + { url = "https://files.pythonhosted.org/packages/6f/54/5b0db00d2cb056922356104468019c0a132e89c8d3ab67d8ede9f4483d2a/yarl-1.23.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:877b0738624280e34c55680d6054a307aa94f7d52fa0e3034a9cc6e790871da7", size = 96950, upload-time = "2026-03-01T22:05:27.318Z" }, + { url = "https://files.pythonhosted.org/packages/f6/40/10fa93811fd439341fad7e0718a86aca0de9548023bbb403668d6555acab/yarl-1.23.0-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:b5405bb8f0e783a988172993cfc627e4d9d00432d6bbac65a923041edacf997d", size = 93960, upload-time = "2026-03-01T22:05:28.738Z" }, + { url = "https://files.pythonhosted.org/packages/bc/d2/8ae2e6cd77d0805f4526e30ec43b6f9a3dfc542d401ac4990d178e4bf0cf/yarl-1.23.0-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:1c3a3598a832590c5a3ce56ab5576361b5688c12cb1d39429cf5dba30b510760", size = 104703, upload-time = "2026-03-01T22:05:30.438Z" }, + { url = "https://files.pythonhosted.org/packages/2f/0c/b3ceacf82c3fe21183ce35fa2acf5320af003d52bc1fcf5915077681142e/yarl-1.23.0-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:8419ebd326430d1cbb7efb5292330a2cf39114e82df5cc3d83c9a0d5ebeaf2f2", size = 98325, upload-time = "2026-03-01T22:05:31.835Z" }, + { url = "https://files.pythonhosted.org/packages/9d/e0/12900edd28bdab91a69bd2554b85ad7b151f64e8b521fe16f9ad2f56477a/yarl-1.23.0-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:be61f6fff406ca40e3b1d84716fde398fc08bc63dd96d15f3a14230a0973ed86", size = 105067, upload-time = "2026-03-01T22:05:33.358Z" }, + { url = "https://files.pythonhosted.org/packages/15/61/74bb1182cf79c9bbe4eb6b1f14a57a22d7a0be5e9cedf8e2d5c2086474c3/yarl-1.23.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:3ceb13c5c858d01321b5d9bb65e4cf37a92169ea470b70fec6f236b2c9dd7e34", size = 100285, upload-time = "2026-03-01T22:05:35.4Z" }, + { url = "https://files.pythonhosted.org/packages/69/7f/cd5ef733f2550de6241bd8bd8c3febc78158b9d75f197d9c7baa113436af/yarl-1.23.0-cp312-cp312-win32.whl", hash = "sha256:fffc45637bcd6538de8b85f51e3df3223e4ad89bccbfca0481c08c7fc8b7ed7d", size = 82359, upload-time = "2026-03-01T22:05:36.811Z" }, + { url = "https://files.pythonhosted.org/packages/f5/be/25216a49daeeb7af2bec0db22d5e7df08ed1d7c9f65d78b14f3b74fd72fc/yarl-1.23.0-cp312-cp312-win_amd64.whl", hash = "sha256:f69f57305656a4852f2a7203efc661d8c042e6cc67f7acd97d8667fb448a426e", size = 87674, upload-time = "2026-03-01T22:05:38.171Z" }, + { url = "https://files.pythonhosted.org/packages/d2/35/aeab955d6c425b227d5b7247eafb24f2653fedc32f95373a001af5dfeb9e/yarl-1.23.0-cp312-cp312-win_arm64.whl", hash = "sha256:6e87a6e8735b44816e7db0b2fbc9686932df473c826b0d9743148432e10bb9b9", size = 81879, upload-time = "2026-03-01T22:05:40.006Z" }, + { url = "https://files.pythonhosted.org/packages/9a/4b/a0a6e5d0ee8a2f3a373ddef8a4097d74ac901ac363eea1440464ccbe0898/yarl-1.23.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:16c6994ac35c3e74fb0ae93323bf8b9c2a9088d55946109489667c510a7d010e", size = 123796, upload-time = "2026-03-01T22:05:41.412Z" }, + { url = "https://files.pythonhosted.org/packages/67/b6/8925d68af039b835ae876db5838e82e76ec87b9782ecc97e192b809c4831/yarl-1.23.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:4a42e651629dafb64fd5b0286a3580613702b5809ad3f24934ea87595804f2c5", size = 86547, upload-time = "2026-03-01T22:05:42.841Z" }, + { url = "https://files.pythonhosted.org/packages/ae/50/06d511cc4b8e0360d3c94af051a768e84b755c5eb031b12adaaab6dec6e5/yarl-1.23.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:7c6b9461a2a8b47c65eef63bb1c76a4f1c119618ffa99ea79bc5bb1e46c5821b", size = 85854, upload-time = "2026-03-01T22:05:44.85Z" }, + { url = "https://files.pythonhosted.org/packages/c4/f4/4e30b250927ffdab4db70da08b9b8d2194d7c7b400167b8fbeca1e4701ca/yarl-1.23.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:2569b67d616eab450d262ca7cb9f9e19d2f718c70a8b88712859359d0ab17035", size = 98351, upload-time = "2026-03-01T22:05:46.836Z" }, + { url = "https://files.pythonhosted.org/packages/86/fc/4118c5671ea948208bdb1492d8b76bdf1453d3e73df051f939f563e7dcc5/yarl-1.23.0-cp313-cp313-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:e9d9a4d06d3481eab79803beb4d9bd6f6a8e781ec078ac70d7ef2dcc29d1bea5", size = 92711, upload-time = "2026-03-01T22:05:48.316Z" }, + { url = "https://files.pythonhosted.org/packages/56/11/1ed91d42bd9e73c13dc9e7eb0dd92298d75e7ac4dd7f046ad0c472e231cd/yarl-1.23.0-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:f514f6474e04179d3d33175ed3f3e31434d3130d42ec153540d5b157deefd735", size = 106014, upload-time = "2026-03-01T22:05:50.028Z" }, + { url = "https://files.pythonhosted.org/packages/ce/c9/74e44e056a23fbc33aca71779ef450ca648a5bc472bdad7a82339918f818/yarl-1.23.0-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:fda207c815b253e34f7e1909840fd14299567b1c0eb4908f8c2ce01a41265401", size = 105557, upload-time = "2026-03-01T22:05:51.416Z" }, + { url = "https://files.pythonhosted.org/packages/66/fe/b1e10b08d287f518994f1e2ff9b6d26f0adeecd8dd7d533b01bab29a3eda/yarl-1.23.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:34b6cf500e61c90f305094911f9acc9c86da1a05a7a3f5be9f68817043f486e4", size = 101559, upload-time = "2026-03-01T22:05:52.872Z" }, + { url = "https://files.pythonhosted.org/packages/72/59/c5b8d94b14e3d3c2a9c20cb100119fd534ab5a14b93673ab4cc4a4141ea5/yarl-1.23.0-cp313-cp313-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:d7504f2b476d21653e4d143f44a175f7f751cd41233525312696c76aa3dbb23f", size = 100502, upload-time = "2026-03-01T22:05:54.954Z" }, + { url = "https://files.pythonhosted.org/packages/77/4f/96976cb54cbfc5c9fd73ed4c51804f92f209481d1fb190981c0f8a07a1d7/yarl-1.23.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:578110dd426f0d209d1509244e6d4a3f1a3e9077655d98c5f22583d63252a08a", size = 98027, upload-time = "2026-03-01T22:05:56.409Z" }, + { url = "https://files.pythonhosted.org/packages/63/6e/904c4f476471afdbad6b7e5b70362fb5810e35cd7466529a97322b6f5556/yarl-1.23.0-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:609d3614d78d74ebe35f54953c5bbd2ac647a7ddb9c30a5d877580f5e86b22f2", size = 95369, upload-time = "2026-03-01T22:05:58.141Z" }, + { url = "https://files.pythonhosted.org/packages/9d/40/acfcdb3b5f9d68ef499e39e04d25e141fe90661f9d54114556cf83be8353/yarl-1.23.0-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:4966242ec68afc74c122f8459abd597afd7d8a60dc93d695c1334c5fd25f762f", size = 105565, upload-time = "2026-03-01T22:06:00.286Z" }, + { url = "https://files.pythonhosted.org/packages/5e/c6/31e28f3a6ba2869c43d124f37ea5260cac9c9281df803c354b31f4dd1f3c/yarl-1.23.0-cp313-cp313-musllinux_1_2_riscv64.whl", hash = "sha256:e0fd068364a6759bc794459f0a735ab151d11304346332489c7972bacbe9e72b", size = 99813, upload-time = "2026-03-01T22:06:01.712Z" }, + { url = "https://files.pythonhosted.org/packages/08/1f/6f65f59e72d54aa467119b63fc0b0b1762eff0232db1f4720cd89e2f4a17/yarl-1.23.0-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:39004f0ad156da43e86aa71f44e033de68a44e5a31fc53507b36dd253970054a", size = 105632, upload-time = "2026-03-01T22:06:03.188Z" }, + { url = "https://files.pythonhosted.org/packages/a3/c4/18b178a69935f9e7a338127d5b77d868fdc0f0e49becd286d51b3a18c61d/yarl-1.23.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:e5723c01a56c5028c807c701aa66722916d2747ad737a046853f6c46f4875543", size = 101895, upload-time = "2026-03-01T22:06:04.651Z" }, + { url = "https://files.pythonhosted.org/packages/8f/54/f5b870b5505663911dba950a8e4776a0dbd51c9c54c0ae88e823e4b874a0/yarl-1.23.0-cp313-cp313-win32.whl", hash = "sha256:1b6b572edd95b4fa8df75de10b04bc81acc87c1c7d16bcdd2035b09d30acc957", size = 82356, upload-time = "2026-03-01T22:06:06.04Z" }, + { url = "https://files.pythonhosted.org/packages/7a/84/266e8da36879c6edcd37b02b547e2d9ecdfea776be49598e75696e3316e1/yarl-1.23.0-cp313-cp313-win_amd64.whl", hash = "sha256:baaf55442359053c7d62f6f8413a62adba3205119bcb6f49594894d8be47e5e3", size = 87515, upload-time = "2026-03-01T22:06:08.107Z" }, + { url = "https://files.pythonhosted.org/packages/00/fd/7e1c66efad35e1649114fa13f17485f62881ad58edeeb7f49f8c5e748bf9/yarl-1.23.0-cp313-cp313-win_arm64.whl", hash = "sha256:fb4948814a2a98e3912505f09c9e7493b1506226afb1f881825368d6fb776ee3", size = 81785, upload-time = "2026-03-01T22:06:10.181Z" }, + { url = "https://files.pythonhosted.org/packages/9c/fc/119dd07004f17ea43bb91e3ece6587759edd7519d6b086d16bfbd3319982/yarl-1.23.0-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:aecfed0b41aa72b7881712c65cf764e39ce2ec352324f5e0837c7048d9e6daaa", size = 130719, upload-time = "2026-03-01T22:06:11.708Z" }, + { url = "https://files.pythonhosted.org/packages/e6/0d/9f2348502fbb3af409e8f47730282cd6bc80dec6630c1e06374d882d6eb2/yarl-1.23.0-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:a41bcf68efd19073376eb8cf948b8d9be0af26256403e512bb18f3966f1f9120", size = 89690, upload-time = "2026-03-01T22:06:13.429Z" }, + { url = "https://files.pythonhosted.org/packages/50/93/e88f3c80971b42cfc83f50a51b9d165a1dbf154b97005f2994a79f212a07/yarl-1.23.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:cde9a2ecd91668bcb7f077c4966d8ceddb60af01b52e6e3e2680e4cf00ad1a59", size = 89851, upload-time = "2026-03-01T22:06:15.53Z" }, + { url = "https://files.pythonhosted.org/packages/1c/07/61c9dd8ba8f86473263b4036f70fb594c09e99c0d9737a799dfd8bc85651/yarl-1.23.0-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:5023346c4ee7992febc0068e7593de5fa2bf611848c08404b35ebbb76b1b0512", size = 95874, upload-time = "2026-03-01T22:06:17.553Z" }, + { url = "https://files.pythonhosted.org/packages/9e/e9/f9ff8ceefba599eac6abddcfb0b3bee9b9e636e96dbf54342a8577252379/yarl-1.23.0-cp313-cp313t-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:d1009abedb49ae95b136a8904a3f71b342f849ffeced2d3747bf29caeda218c4", size = 88710, upload-time = "2026-03-01T22:06:19.004Z" }, + { url = "https://files.pythonhosted.org/packages/eb/78/0231bfcc5d4c8eec220bc2f9ef82cb4566192ea867a7c5b4148f44f6cbcd/yarl-1.23.0-cp313-cp313t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:a8d00f29b42f534cc8aa3931cfe773b13b23e561e10d2b26f27a8d309b0e82a1", size = 101033, upload-time = "2026-03-01T22:06:21.203Z" }, + { url = "https://files.pythonhosted.org/packages/cd/9b/30ea5239a61786f18fd25797151a17fbb3be176977187a48d541b5447dd4/yarl-1.23.0-cp313-cp313t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:95451e6ce06c3e104556d73b559f5da6c34a069b6b62946d3ad66afcd51642ea", size = 100817, upload-time = "2026-03-01T22:06:22.738Z" }, + { url = "https://files.pythonhosted.org/packages/62/e2/a4980481071791bc83bce2b7a1a1f7adcabfa366007518b4b845e92eeee3/yarl-1.23.0-cp313-cp313t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:531ef597132086b6cf96faa7c6c1dcd0361dd5f1694e5cc30375907b9b7d3ea9", size = 97482, upload-time = "2026-03-01T22:06:24.21Z" }, + { url = "https://files.pythonhosted.org/packages/e5/1e/304a00cf5f6100414c4b5a01fc7ff9ee724b62158a08df2f8170dfc72a2d/yarl-1.23.0-cp313-cp313t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:88f9fb0116fbfcefcab70f85cf4b74a2b6ce5d199c41345296f49d974ddb4123", size = 95949, upload-time = "2026-03-01T22:06:25.697Z" }, + { url = "https://files.pythonhosted.org/packages/68/03/093f4055ed4cae649ac53bca3d180bd37102e9e11d048588e9ab0c0108d0/yarl-1.23.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:e7b0460976dc75cb87ad9cc1f9899a4b97751e7d4e77ab840fc9b6d377b8fd24", size = 95839, upload-time = "2026-03-01T22:06:27.309Z" }, + { url = "https://files.pythonhosted.org/packages/b9/28/4c75ebb108f322aa8f917ae10a8ffa4f07cae10a8a627b64e578617df6a0/yarl-1.23.0-cp313-cp313t-musllinux_1_2_armv7l.whl", hash = "sha256:115136c4a426f9da976187d238e84139ff6b51a20839aa6e3720cd1026d768de", size = 90696, upload-time = "2026-03-01T22:06:29.048Z" }, + { url = "https://files.pythonhosted.org/packages/23/9c/42c2e2dd91c1a570402f51bdf066bfdb1241c2240ba001967bad778e77b7/yarl-1.23.0-cp313-cp313t-musllinux_1_2_ppc64le.whl", hash = "sha256:ead11956716a940c1abc816b7df3fa2b84d06eaed8832ca32f5c5e058c65506b", size = 100865, upload-time = "2026-03-01T22:06:30.525Z" }, + { url = "https://files.pythonhosted.org/packages/74/05/1bcd60a8a0a914d462c305137246b6f9d167628d73568505fce3f1cb2e65/yarl-1.23.0-cp313-cp313t-musllinux_1_2_riscv64.whl", hash = "sha256:fe8f8f5e70e6dbdfca9882cd9deaac058729bcf323cf7a58660901e55c9c94f6", size = 96234, upload-time = "2026-03-01T22:06:32.692Z" }, + { url = "https://files.pythonhosted.org/packages/90/b2/f52381aac396d6778ce516b7bc149c79e65bfc068b5de2857ab69eeea3b7/yarl-1.23.0-cp313-cp313t-musllinux_1_2_s390x.whl", hash = "sha256:a0e317df055958a0c1e79e5d2aa5a5eaa4a6d05a20d4b0c9c3f48918139c9fc6", size = 100295, upload-time = "2026-03-01T22:06:34.268Z" }, + { url = "https://files.pythonhosted.org/packages/e5/e8/638bae5bbf1113a659b2435d8895474598afe38b4a837103764f603aba56/yarl-1.23.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:6f0fd84de0c957b2d280143522c4f91a73aada1923caee763e24a2b3fda9f8a5", size = 97784, upload-time = "2026-03-01T22:06:35.864Z" }, + { url = "https://files.pythonhosted.org/packages/80/25/a3892b46182c586c202629fc2159aa13975d3741d52ebd7347fd501d48d5/yarl-1.23.0-cp313-cp313t-win32.whl", hash = "sha256:93a784271881035ab4406a172edb0faecb6e7d00f4b53dc2f55919d6c9688595", size = 88313, upload-time = "2026-03-01T22:06:37.39Z" }, + { url = "https://files.pythonhosted.org/packages/43/68/8c5b36aa5178900b37387937bc2c2fe0e9505537f713495472dcf6f6fccc/yarl-1.23.0-cp313-cp313t-win_amd64.whl", hash = "sha256:dd00607bffbf30250fe108065f07453ec124dbf223420f57f5e749b04295e090", size = 94932, upload-time = "2026-03-01T22:06:39.579Z" }, + { url = "https://files.pythonhosted.org/packages/c6/cc/d79ba8292f51f81f4dc533a8ccfb9fc6992cabf0998ed3245de7589dc07c/yarl-1.23.0-cp313-cp313t-win_arm64.whl", hash = "sha256:ac09d42f48f80c9ee1635b2fcaa819496a44502737660d3c0f2ade7526d29144", size = 84786, upload-time = "2026-03-01T22:06:41.988Z" }, + { url = "https://files.pythonhosted.org/packages/90/98/b85a038d65d1b92c3903ab89444f48d3cee490a883477b716d7a24b1a78c/yarl-1.23.0-cp314-cp314-macosx_10_15_universal2.whl", hash = "sha256:21d1b7305a71a15b4794b5ff22e8eef96ff4a6d7f9657155e5aa419444b28912", size = 124455, upload-time = "2026-03-01T22:06:43.615Z" }, + { url = "https://files.pythonhosted.org/packages/39/54/bc2b45559f86543d163b6e294417a107bb87557609007c007ad889afec18/yarl-1.23.0-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:85610b4f27f69984932a7abbe52703688de3724d9f72bceb1cca667deff27474", size = 86752, upload-time = "2026-03-01T22:06:45.425Z" }, + { url = "https://files.pythonhosted.org/packages/24/f9/e8242b68362bffe6fb536c8db5076861466fc780f0f1b479fc4ffbebb128/yarl-1.23.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:23f371bd662cf44a7630d4d113101eafc0cfa7518a2760d20760b26021454719", size = 86291, upload-time = "2026-03-01T22:06:46.974Z" }, + { url = "https://files.pythonhosted.org/packages/ea/d8/d1cb2378c81dd729e98c716582b1ccb08357e8488e4c24714658cc6630e8/yarl-1.23.0-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c4a80f77dc1acaaa61f0934176fccca7096d9b1ff08c8ba9cddf5ae034a24319", size = 99026, upload-time = "2026-03-01T22:06:48.459Z" }, + { url = "https://files.pythonhosted.org/packages/0a/ff/7196790538f31debe3341283b5b0707e7feb947620fc5e8236ef28d44f72/yarl-1.23.0-cp314-cp314-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:bd654fad46d8d9e823afbb4f87c79160b5a374ed1ff5bde24e542e6ba8f41434", size = 92355, upload-time = "2026-03-01T22:06:50.306Z" }, + { url = "https://files.pythonhosted.org/packages/c1/56/25d58c3eddde825890a5fe6aa1866228377354a3c39262235234ab5f616b/yarl-1.23.0-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:682bae25f0a0dd23a056739f23a134db9f52a63e2afd6bfb37ddc76292bbd723", size = 106417, upload-time = "2026-03-01T22:06:52.1Z" }, + { url = "https://files.pythonhosted.org/packages/51/8a/882c0e7bc8277eb895b31bce0138f51a1ba551fc2e1ec6753ffc1e7c1377/yarl-1.23.0-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:a82836cab5f197a0514235aaf7ffccdc886ccdaa2324bc0aafdd4ae898103039", size = 106422, upload-time = "2026-03-01T22:06:54.424Z" }, + { url = "https://files.pythonhosted.org/packages/42/2b/fef67d616931055bf3d6764885990a3ac647d68734a2d6a9e1d13de437a2/yarl-1.23.0-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:1c57676bdedc94cd3bc37724cf6f8cd2779f02f6aba48de45feca073e714fe52", size = 101915, upload-time = "2026-03-01T22:06:55.895Z" }, + { url = "https://files.pythonhosted.org/packages/18/6a/530e16aebce27c5937920f3431c628a29a4b6b430fab3fd1c117b26ff3f6/yarl-1.23.0-cp314-cp314-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:c7f8dc16c498ff06497c015642333219871effba93e4a2e8604a06264aca5c5c", size = 100690, upload-time = "2026-03-01T22:06:58.21Z" }, + { url = "https://files.pythonhosted.org/packages/88/08/93749219179a45e27b036e03260fda05190b911de8e18225c294ac95bbc9/yarl-1.23.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:5ee586fb17ff8f90c91cf73c6108a434b02d69925f44f5f8e0d7f2f260607eae", size = 98750, upload-time = "2026-03-01T22:06:59.794Z" }, + { url = "https://files.pythonhosted.org/packages/d9/cf/ea424a004969f5d81a362110a6ac1496d79efdc6d50c2c4b2e3ea0fc2519/yarl-1.23.0-cp314-cp314-musllinux_1_2_armv7l.whl", hash = "sha256:17235362f580149742739cc3828b80e24029d08cbb9c4bda0242c7b5bc610a8e", size = 94685, upload-time = "2026-03-01T22:07:01.375Z" }, + { url = "https://files.pythonhosted.org/packages/e2/b7/14341481fe568e2b0408bcf1484c652accafe06a0ade9387b5d3fd9df446/yarl-1.23.0-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:0793e2bd0cf14234983bbb371591e6bea9e876ddf6896cdcc93450996b0b5c85", size = 106009, upload-time = "2026-03-01T22:07:03.151Z" }, + { url = "https://files.pythonhosted.org/packages/0a/e6/5c744a9b54f4e8007ad35bce96fbc9218338e84812d36f3390cea616881a/yarl-1.23.0-cp314-cp314-musllinux_1_2_riscv64.whl", hash = "sha256:3650dc2480f94f7116c364096bc84b1d602f44224ef7d5c7208425915c0475dd", size = 100033, upload-time = "2026-03-01T22:07:04.701Z" }, + { url = "https://files.pythonhosted.org/packages/0c/23/e3bfc188d0b400f025bc49d99793d02c9abe15752138dcc27e4eaf0c4a9e/yarl-1.23.0-cp314-cp314-musllinux_1_2_s390x.whl", hash = "sha256:f40e782d49630ad384db66d4d8b73ff4f1b8955dc12e26b09a3e3af064b3b9d6", size = 106483, upload-time = "2026-03-01T22:07:06.231Z" }, + { url = "https://files.pythonhosted.org/packages/72/42/f0505f949a90b3f8b7a363d6cbdf398f6e6c58946d85c6d3a3bc70595b26/yarl-1.23.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:94f8575fbdf81749008d980c17796097e645574a3b8c28ee313931068dad14fe", size = 102175, upload-time = "2026-03-01T22:07:08.4Z" }, + { url = "https://files.pythonhosted.org/packages/aa/65/b39290f1d892a9dd671d1c722014ca062a9c35d60885d57e5375db0404b5/yarl-1.23.0-cp314-cp314-win32.whl", hash = "sha256:c8aa34a5c864db1087d911a0b902d60d203ea3607d91f615acd3f3108ac32169", size = 83871, upload-time = "2026-03-01T22:07:09.968Z" }, + { url = "https://files.pythonhosted.org/packages/a9/5b/9b92f54c784c26e2a422e55a8d2607ab15b7ea3349e28359282f84f01d43/yarl-1.23.0-cp314-cp314-win_amd64.whl", hash = "sha256:63e92247f383c85ab00dd0091e8c3fa331a96e865459f5ee80353c70a4a42d70", size = 89093, upload-time = "2026-03-01T22:07:11.501Z" }, + { url = "https://files.pythonhosted.org/packages/e0/7d/8a84dc9381fd4412d5e7ff04926f9865f6372b4c2fd91e10092e65d29eb8/yarl-1.23.0-cp314-cp314-win_arm64.whl", hash = "sha256:70efd20be968c76ece7baa8dafe04c5be06abc57f754d6f36f3741f7aa7a208e", size = 83384, upload-time = "2026-03-01T22:07:13.069Z" }, + { url = "https://files.pythonhosted.org/packages/dd/8d/d2fad34b1c08aa161b74394183daa7d800141aaaee207317e82c790b418d/yarl-1.23.0-cp314-cp314t-macosx_10_15_universal2.whl", hash = "sha256:9a18d6f9359e45722c064c97464ec883eb0e0366d33eda61cb19a244bf222679", size = 131019, upload-time = "2026-03-01T22:07:14.903Z" }, + { url = "https://files.pythonhosted.org/packages/19/ff/33009a39d3ccf4b94d7d7880dfe17fb5816c5a4fe0096d9b56abceea9ac7/yarl-1.23.0-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:2803ed8b21ca47a43da80a6fd1ed3019d30061f7061daa35ac54f63933409412", size = 89894, upload-time = "2026-03-01T22:07:17.372Z" }, + { url = "https://files.pythonhosted.org/packages/0c/f1/dab7ac5e7306fb79c0190766a3c00b4cb8d09a1f390ded68c85a5934faf5/yarl-1.23.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:394906945aa8b19fc14a61cf69743a868bb8c465efe85eee687109cc540b98f4", size = 89979, upload-time = "2026-03-01T22:07:19.361Z" }, + { url = "https://files.pythonhosted.org/packages/aa/b1/08e95f3caee1fad6e65017b9f26c1d79877b502622d60e517de01e72f95d/yarl-1.23.0-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:71d006bee8397a4a89f469b8deb22469fe7508132d3c17fa6ed871e79832691c", size = 95943, upload-time = "2026-03-01T22:07:21.266Z" }, + { url = "https://files.pythonhosted.org/packages/c0/cc/6409f9018864a6aa186c61175b977131f373f1988e198e031236916e87e4/yarl-1.23.0-cp314-cp314t-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:62694e275c93d54f7ccedcfef57d42761b2aad5234b6be1f3e3026cae4001cd4", size = 88786, upload-time = "2026-03-01T22:07:23.129Z" }, + { url = "https://files.pythonhosted.org/packages/76/40/cc22d1d7714b717fde2006fad2ced5efe5580606cb059ae42117542122f3/yarl-1.23.0-cp314-cp314t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:a31de1613658308efdb21ada98cbc86a97c181aa050ba22a808120bb5be3ab94", size = 101307, upload-time = "2026-03-01T22:07:24.689Z" }, + { url = "https://files.pythonhosted.org/packages/8f/0d/476c38e85ddb4c6ec6b20b815bdd779aa386a013f3d8b85516feee55c8dc/yarl-1.23.0-cp314-cp314t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:fb1e8b8d66c278b21d13b0a7ca22c41dd757a7c209c6b12c313e445c31dd3b28", size = 100904, upload-time = "2026-03-01T22:07:26.287Z" }, + { url = "https://files.pythonhosted.org/packages/72/32/0abe4a76d59adf2081dcb0397168553ece4616ada1c54d1c49d8936c74f8/yarl-1.23.0-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:50f9d8d531dfb767c565f348f33dd5139a6c43f5cbdf3f67da40d54241df93f6", size = 97728, upload-time = "2026-03-01T22:07:27.906Z" }, + { url = "https://files.pythonhosted.org/packages/b7/35/7b30f4810fba112f60f5a43237545867504e15b1c7647a785fbaf588fac2/yarl-1.23.0-cp314-cp314t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:575aa4405a656e61a540f4a80eaa5260f2a38fff7bfdc4b5f611840d76e9e277", size = 95964, upload-time = "2026-03-01T22:07:30.198Z" }, + { url = "https://files.pythonhosted.org/packages/2d/86/ed7a73ab85ef00e8bb70b0cb5421d8a2a625b81a333941a469a6f4022828/yarl-1.23.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:041b1a4cefacf65840b4e295c6985f334ba83c30607441ae3cf206a0eed1a2e4", size = 95882, upload-time = "2026-03-01T22:07:32.132Z" }, + { url = "https://files.pythonhosted.org/packages/19/90/d56967f61a29d8498efb7afb651e0b2b422a1e9b47b0ab5f4e40a19b699b/yarl-1.23.0-cp314-cp314t-musllinux_1_2_armv7l.whl", hash = "sha256:d38c1e8231722c4ce40d7593f28d92b5fc72f3e9774fe73d7e800ec32299f63a", size = 90797, upload-time = "2026-03-01T22:07:34.404Z" }, + { url = "https://files.pythonhosted.org/packages/72/00/8b8f76909259f56647adb1011d7ed8b321bcf97e464515c65016a47ecdf0/yarl-1.23.0-cp314-cp314t-musllinux_1_2_ppc64le.whl", hash = "sha256:d53834e23c015ee83a99377db6e5e37d8484f333edb03bd15b4bc312cc7254fb", size = 101023, upload-time = "2026-03-01T22:07:35.953Z" }, + { url = "https://files.pythonhosted.org/packages/ac/e2/cab11b126fb7d440281b7df8e9ddbe4851e70a4dde47a202b6642586b8d9/yarl-1.23.0-cp314-cp314t-musllinux_1_2_riscv64.whl", hash = "sha256:2e27c8841126e017dd2a054a95771569e6070b9ee1b133366d8b31beb5018a41", size = 96227, upload-time = "2026-03-01T22:07:37.594Z" }, + { url = "https://files.pythonhosted.org/packages/c2/9b/2c893e16bfc50e6b2edf76c1a9eb6cb0c744346197e74c65e99ad8d634d0/yarl-1.23.0-cp314-cp314t-musllinux_1_2_s390x.whl", hash = "sha256:76855800ac56f878847a09ce6dba727c93ca2d89c9e9d63002d26b916810b0a2", size = 100302, upload-time = "2026-03-01T22:07:39.334Z" }, + { url = "https://files.pythonhosted.org/packages/28/ec/5498c4e3a6d5f1003beb23405671c2eb9cdbf3067d1c80f15eeafe301010/yarl-1.23.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:e09fd068c2e169a7070d83d3bde728a4d48de0549f975290be3c108c02e499b4", size = 98202, upload-time = "2026-03-01T22:07:41.717Z" }, + { url = "https://files.pythonhosted.org/packages/fe/c3/cd737e2d45e70717907f83e146f6949f20cc23cd4bf7b2688727763aa458/yarl-1.23.0-cp314-cp314t-win32.whl", hash = "sha256:73309162a6a571d4cbd3b6a1dcc703c7311843ae0d1578df6f09be4e98df38d4", size = 90558, upload-time = "2026-03-01T22:07:43.433Z" }, + { url = "https://files.pythonhosted.org/packages/e1/19/3774d162f6732d1cfb0b47b4140a942a35ca82bb19b6db1f80e9e7bdc8f8/yarl-1.23.0-cp314-cp314t-win_amd64.whl", hash = "sha256:4503053d296bc6e4cbd1fad61cf3b6e33b939886c4f249ba7c78b602214fabe2", size = 97610, upload-time = "2026-03-01T22:07:45.773Z" }, + { url = "https://files.pythonhosted.org/packages/51/47/3fa2286c3cb162c71cdb34c4224d5745a1ceceb391b2bd9b19b668a8d724/yarl-1.23.0-cp314-cp314t-win_arm64.whl", hash = "sha256:44bb7bef4ea409384e3f8bc36c063d77ea1b8d4a5b2706956c0d6695f07dcc25", size = 86041, upload-time = "2026-03-01T22:07:49.026Z" }, + { url = "https://files.pythonhosted.org/packages/69/68/c8739671f5699c7dc470580a4f821ef37c32c4cb0b047ce223a7f115757f/yarl-1.23.0-py3-none-any.whl", hash = "sha256:a2df6afe50dea8ae15fa34c9f824a3ee958d785fd5d089063d960bae1daa0a3f", size = 48288, upload-time = "2026-03-01T22:07:51.388Z" }, +] + +[[package]] +name = "zipp" +version = "3.23.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/e3/02/0f2892c661036d50ede074e376733dca2ae7c6eb617489437771209d4180/zipp-3.23.0.tar.gz", hash = "sha256:a07157588a12518c9d4034df3fbbee09c814741a33ff63c05fa29d26a2404166", size = 25547, upload-time = "2025-06-08T17:06:39.4Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/2e/54/647ade08bf0db230bfea292f893923872fd20be6ac6f53b2b936ba839d75/zipp-3.23.0-py3-none-any.whl", hash = "sha256:071652d6115ed432f5ce1d34c336c0adfd6a884660d1e9712a256d3d3bd4b14e", size = 10276, upload-time = "2025-06-08T17:06:38.034Z" }, +] From 63e4ad0ee48466ac7615a33ba0c26774d11608e3 Mon Sep 17 00:00:00 2001 From: Aleksandr Bobrov Date: Sun, 15 Mar 2026 17:13:15 +0500 Subject: [PATCH 15/15] chore: add gigaam-v3-rnnt-mlx to .gitignore --- .gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitignore b/.gitignore index fc65e15..c9c59ca 100644 --- a/.gitignore +++ b/.gitignore @@ -9,5 +9,6 @@ onnx mlx_convert/.venv mlx_convert/gigaam-v3-ctc-mlx/ mlx_convert/gigaam-v3-ctc-mlx-fp32/ +mlx_convert/gigaam-v3-rnnt-mlx/ mlx_convert/ggml-small.bin mlx_convert/debug_*.py \ No newline at end of file

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