From 366b52f73dbf43891e1fe9fc3e3b059562fd5d5e Mon Sep 17 00:00:00 2001 From: Alex Sullivan <115666116+asullivan-blze@users.noreply.github.com> Date: Fri, 25 Oct 2024 12:33:35 -0700 Subject: [PATCH] boardwalk (feat): allow execution of playbooks in addition to tasks (#85) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This changeset adds a `BaseJob` class, from which `TaskJob` and `PlaybookJob` are derived. As the names suggest, these are Jobs which permit execution of tasks -- as was previously possible when using the `Job` class -- and full Ansible playbooks. The design features of Boardwalk, however, still exist even when using a PlaybookJob in a Workflow; that is, under the hood, `ansible-runner` is told to execute the targeted playbook file with a `limit` to the host which is currently progressing through the workflow. As such, if the playbook(s) being selected for a given Workflow do not apply to the host(s) going through it, Ansible will skip execution of the playbook, as it would for a standard `ansible-playbook` invocation. As a quick overview, the new jobs would look like the following: ```python class TestJob(TaskJob): def tasks(self) -> AnsibleTasksType: return [{"ansible.builtin.debug": {"msg": "Hello, Boardwalk!"}}] class ShouldSucceedPlaybookExecutionTestJob(PlaybookJob): def playbooks(self) -> AnsibleTasksType: return [ {"ansible.builtin.import_playbook": path("playbook-job-test-should-succeed.yml")}, {"ansible.builtin.import_playbook": path("playbook-job-test-should-be-skipped.yml")}, ] ``` A Workflow may use TaskJob, PlaybookJob, or a mix of both, as in the following example: ```python class ShouldSucceedMixedJobTypesWorkflow(Workflow): def jobs(self): return [ TestJob(), ShouldSucceedPlaybookExecutionTestJob(), ] def exit_jobs(self): return TestJob() ``` And, of course, the `test/server-client/Boardwalkfile.py` contains a full example Boardwalkfile. Other notes ----------- - ๐Ÿงช Test enhancements: The majority of test Workspaces in the `Boardwalkfile.py` have been integrated into the `pytest` test suite (see: `test/integration/test_workspaces.py`). No more shall the tedious cycle of running the trinity of commands -- `boardwalk workspace use $WORKSPACE`, `boardwalk init`, `boardwalk run` -- be needed, one command does them all! Unless of course, you _want_ to run them manually; I won't judge. - When running `pytest`, upon reaching these tests, the execution will pause, and prompt for the `BECOME password`; this is the same `sudo` password that _would_ be used with `boardwalk run`; the difference is now we write it -- via `tempfile.NamedTemporaryFile` -- to a file, and then set the envvar `ANSIBLE_BECOME_PASSWORD_FILE` to the path returned by the context manager. This results in only needing to specify your password _once_ if you want to run all of the test workspaces. - Note, however, having `make develop-server` running in a different shell beforehand is still needed, as is releasing any caught Workspace(s) that the development server may be aware of. (Having `pytest` spawn the development server itself is an item to complete for the future.) - As there is still the requirement to have the development server up, these tests are marked to be skipped if the `CI` envvar is found as set (and it is [always set](https://docs.github.com/en/actions/writing-workflows/choosing-what-your-workflow-does/store-information-in-variables#default-environment-variables) in GitHub workflows). - ๐Ÿ“ Logging enhancements: If you're like me, you enjoy a good logging output. So [`loguru`](https://github.com/delgan/loguru) has been tapped to transform the prior usages of Python's built-in `logger`, which looked a little something like this... ```bash # ... like this ... asullivan@MBP-NT9RPG2XV7 tmp % boardwalk run -nsc INFO:boardwalk.cli_run:Using workspace: ShouldFailTestWorkspace INFO:boardwalk.cli_run:Reading inventory to process any --limit INFO:boardwalk.ansible:Processing ansible-inventory WARNING:boardwalk.cli_run:localhost: Host started workflow but never completed. Job preconditions are ignored for this host [... truncated ...] # ... and turned it into this! โœจ (boardwalk-py3.12) asullivan@MBP-NT9RPG2XV7 server-client % boardwalk run -nsc 2024-10-24 15:27:52.564 | INFO | boardwalk.cli:cli:77 - Log level is INFO 2024-10-24 15:27:52.566 | INFO | boardwalk.cli_run:run:125 - Using workspace: ShouldFailTestWorkspace 2024-10-24 15:27:52.566 | INFO | boardwalk.cli_run:filter_hosts_by_limit:375 - Reading inventory to process any --limit 2024-10-24 15:27:52.566 | INFO | boardwalk.ansible:ansible_inventory:191 - Processing ansible-inventory 2024-10-24 15:27:52.933 | WARNING | boardwalk.cli_run:check_host_preconditions_locally:442 - 127.0.0.1: Host started workflow but never completed. Job preconditions are ignored for this host ``` This is admittedly a bit of a minor change, but it should aid with readability. - ๐Ÿ› `boardwalk workspace use` tab completion - Tab completion via `click`'s built-in capabilities was added in [#81](https://github.com/Backblaze/boardwalk/pull/81), however only recently was it discovered that if no previous workspace was set as active -- that is, `.boardwalk/workspaces/active_workspaces.txt` existed -- a `NoActiveWorkspace` exception would be raised. (Which, is not ideal considering that if you're tab-completing, you might not _know what workspaces exist_ to begin with; or, more likely, just cannot remember their names.) Deprecation notes ----------------- - `Job` class - The original `Job` class is deprecated, and will be removed in a future release; usage of this deprecated class will emit a DeprecationWarning to this effect. To ease transitioning to the new differentiated classes, usage of the `Job` class will be treated as a `TaskJob`. Compatibility notes ------------------- Based on running this changeset's `pytest` session against a test instance of `boardwalkd` running version `0.8.21`, this version should be compatible with prior versions of the server. Internal ticket reference: SVRENG-608 --- Makefile | 36 +- README.md | 153 +- diagrams/_d2_configuration.d2 | 16 + diagrams/architecture.d2 | 43 + diagrams/architecture.png | Bin 0 -> 63606 bytes diagrams/conceptual_overview.d2 | 14 + diagrams/conceptual_overview.png | Bin 0 -> 105620 bytes poetry.lock | 1775 +++++++++-------- pyproject.toml | 15 +- src/boardwalk/__init__.py | 6 + src/boardwalk/ansible.py | 37 +- src/boardwalk/app_exceptions.py | 4 +- src/boardwalk/cli.py | 54 +- src/boardwalk/cli_catch.py | 5 +- src/boardwalk/cli_init.py | 15 +- src/boardwalk/cli_login.py | 2 +- src/boardwalk/cli_run.py | 41 +- src/boardwalk/cli_workspace.py | 11 +- src/boardwalk/host.py | 14 +- src/boardwalk/manifest.py | 92 +- src/boardwalk/state.py | 4 +- src/boardwalkd/__init__.py | 3 + src/boardwalkd/cli.py | 5 +- src/boardwalkd/protocol.py | 10 +- src/boardwalkd/server.py | 4 +- src/boardwalkd/slack.py | 2 +- src/boardwalkd/state.py | 4 +- test/boardwalk/test_boardwalk_cli.py | 11 + test/boardwalk/test_manifest.py | 16 + test/boardwalk/test_utils.py | 1 + test/boardwalkd/test_boardwalkd_cli.py | 43 + test/conftest.py | 33 + test/integration/test_workspaces.py | 68 + test/server-client/Boardwalkfile.py | 90 +- .../playbook-job-test-should-be-skipped.yml | 7 + .../playbook-job-test-should-fail.yml | 7 + .../playbook-job-test-should-succeed.yml | 7 + 37 files changed, 1633 insertions(+), 1015 deletions(-) create mode 100644 diagrams/_d2_configuration.d2 create mode 100644 diagrams/architecture.d2 create mode 100644 diagrams/architecture.png create mode 100644 diagrams/conceptual_overview.d2 create mode 100644 diagrams/conceptual_overview.png create mode 100644 test/boardwalk/test_boardwalk_cli.py create mode 100644 test/boardwalk/test_manifest.py create mode 100644 test/boardwalkd/test_boardwalkd_cli.py create mode 100644 test/conftest.py create mode 100644 test/integration/test_workspaces.py create mode 100644 test/server-client/playbook-job-test-should-be-skipped.yml create mode 100644 test/server-client/playbook-job-test-should-fail.yml create mode 100644 test/server-client/playbook-job-test-should-succeed.yml diff --git a/Makefile b/Makefile index 65b30b3..bbd2fde 100644 --- a/Makefile +++ b/Makefile @@ -9,19 +9,21 @@ container: # Cleans up temporary data that might get created during normal development .PHONY: clean clean: - rm -r \ - dist \ - src/*.egg-info \ - src/boardwalk/__pycache__ \ - src/boardwalkd/__pycache__ \ - .boardwalk \ - .boardwalkd \ - test/boardwalk/__pycache__ \ - test/server-client/.boardwalk \ - test/server-client/__pycache__ \ - .pytest_cache \ - .ruff_cache \ - || : + set -o pipefail + + @echo '[.] Removing built packages ...' + rm -rf dist/ + + @echo '[.] Cleaning __pycache__ directories ...' + find . -type d -name '__pycache__' | xargs rm -rf + + @echo '[.] Cleaning .boardwalk and .boardwalkd directories ...' + find . -type d -name '.boardwalk' -or -name '.boardwalkd' | xargs rm -rf + + @echo '[.] Cleaning pytest and ruff caches ...' + find . -type d -name '.pytest_cache' -or -name '.ruff_cache' | xargs rm -rf + + @echo '[.] Removing podman images for localhost/boardwalk ...' podman image rm $$(podman images 'localhost/boardwalk' --quiet) || : # Installs modules in editable mode @@ -70,6 +72,14 @@ install-web-deps: curl "https://cdn.jsdelivr.net/npm/bootstrap@$(BOOTSTRAP_VERSION)/dist/css/bootstrap.min.css" -o src/boardwalkd/static/bootstrap.min.css curl "https://cdn.jsdelivr.net/npm/bootstrap@$(BOOTSTRAP_VERSION)/dist/js/bootstrap.bundle.min.js" -o src/boardwalkd/static/bootstrap.bundle.min.js +# Render all d2 diagrams in ./diagrams to PNG +.PHONY: render-d2 +render-d2: + for file in $$(find ./diagrams -type f -name '*.d2' -not -name '_*.d2'); \ + do \ + d2 $$file $${file%.*}.png; \ + done + # Runs all available tests .PHONY: test test: test-pytest test-ruff test-pyright test-semgrep diff --git a/README.md b/README.md index 27bb59e..c1b77e7 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,6 @@ -# Boardwalk - +Boardwalk +========= +A picture of a boardwalk through a forest. Boardwalk is an open-source linear [Ansible](https://www.ansible.com/) workflow engine. It's purpose-built to help systems engineers automate low-and-slow background jobs @@ -16,7 +17,24 @@ stopping and resuming long-running Ansible workflows easy and efficient. ๐Ÿ’ฅ __Boardwalk is alpha software. Interfaces and behaviors may change between updates.__ ๐Ÿ’ฅ -## Motivation & Goals + +# Table of Contents +- [Motivation & Goals](#motivation--goals) +- [Open-Source License](#open-source-license) +- [Contributing](#contributing) +- [Concepts](#concepts) + - [Workspace](#workspace) + - [Workflow](#workflow) + - [Jobs](#jobs) + - [Local State](#local-state) + - [Remote State](#remote-state) +- [Usage](#usage) + - [Installation](#installation) + - [The `Boardwalkfile.py`](#the-boardwalkfilepy) +- [Command-line Interface](#environment-variables) +- [`boardwalkd` Server](#boardwalkd-server) + +# Motivation & Goals Ansible is already a very capable agentless, modular, remote execution engine. It uses task playbooks that are easy to read and run against any number of @@ -40,7 +58,7 @@ Ansible workflows. It interfaces with Ansible via [ansible-runner](https://github.com/ansible/ansible-runner), which is the same interface used by [AWX](https://github.com/ansible/awx). -### Non-Goals +## Non-Goals - โ›”๏ธ Be a scheduler. Boardwalk doesn't need to solve the problems that cron, systemd timers or other schedulers do. Boardwalk does have primitives for @@ -52,31 +70,19 @@ interface used by [AWX](https://github.com/ansible/awx). own secret management system, because Ansible already has solutions to those areas. -## Open-Source License +# Open-Source License Boardwalk is open source, licensed under the terms of the [MIT license](LICENSE). -## Contributing +# Contributing -See [here](./CONTRIBUTING.md). +See [CONTRIBUTING.md](./CONTRIBUTING.md). -## Concepts +# Concepts -Conceptual overview diagram: +Boardwalk can use multiple Workspaces. Each Workspace has exactly one Workflow, while each Workflow has at least one Job associated with it. If multiple Jobs exist in a Workflow, they are executed in sequence. -```text -+----------------------------------------+ -| Workspace | -| +------------------------------------+ | -| | Workflow | | -| | +------+ +------+ +------+ | | -| | | Job1 | --> | Job2 | --> | JobN | | | -| | +------+ +------+ +------+ | | -| +------------------------------------+ | -+----------------------------------------+ -``` - -### Workspace +## Workspace Workspaces define isolated configurations and state for working on projects with Boardwalk. They define the Ansible host pattern Boardwalk should target, the @@ -85,7 +91,7 @@ Workflow Boardwalk will use, and some essential configuration options. Workspaces are defined in the [Boardwalkfile.py](#the-boardwalkfile-py). The active Workspace is selected with `boardwalk workspace use `. -### Workflow +## Workflow Every Workspace specifies a Workflow. Workflows are the set of Jobs that will be run against hosts in the Workspace. They define the Jobs, Jobs options, and the @@ -98,7 +104,7 @@ Workflows are defined in the [Boardwalkfile.py](#the-boardwalkfile-py). Workflows can be dry-run with `boardwalk check`, which runs Ansible in `--check` mode. Workflows are run with `boardwalk run`. -### Jobs +## Jobs Jobs define what is actually executed in a Workflow. They define Ansible tasks that are run against hosts. They accept options that can be passed into them and @@ -107,7 +113,7 @@ will run against it. Jobs are defined in the [Boardwalkfile.py](#the-boardwalkfile-py). -#### Job Preconditions +### Job Preconditions Preconditions are an important feature of Boardwalk Jobs; they are the mechanism indicating to Boardwalk whether a Workflow needs to be run on a host. When used @@ -136,7 +142,7 @@ have changed. Thus, it's very important not to rely on preconditions alone for safety. Additional safety checks should be included in the Ansible tasks run by Jobs. -### Local State +## Local State Boardwalk maintains a local "statefile" for each Workspace. The primary data contained in the local state are Ansible facts associated with hosts. Inventory @@ -146,15 +152,15 @@ The state is initially built using `boardwalk init`, and Workflows update the state with fresh Ansible facts as hosts are completed. The local state can be reset with `boardwalk workspace reset`. -### Remote State +## Remote State Boardwalk maintains a remote statefile on each host in `/etc/ansible/facts.d/boardwalk_state`. This file is used internally by Boardwalk. -## Usage +# Usage -### Installation +## Installation We recommend installing `boardwalk` in a [`pipx`](https://pipx.pypa.io/stable/) environment, to ensure that your system or user pip packages are not affected by @@ -175,13 +181,13 @@ release, minus 1 minor version. So, if the current stable version is `3.22.x`, Boardwalk should work with `3.21.x`. Consider using [`pyenv`](https://github.com/pyenv/pyenv) to maintain fresh python environment. -#### Shell Completion +### Shell Completion To enable shell completion for `boardwalk` and `boardwalkd`, the following set of commands will generate the completion script and add them to your shell (a shell restart will be needed): -##### Bash +#### Bash ```bash _BOARDWALK_COMPLETE=bash_source boardwalk > ~/.boardwalk-complete.bash _BOARDWALKD_COMPLETE=bash_source boardwalkd > ~/.boardwalkd-complete.bash @@ -189,7 +195,7 @@ echo '. ~/.boardwalk-complete.bash' >> ~/.bashrc echo '. ~/.boardwalkd-complete.bash' >> ~/.bashrc ``` -##### Zsh +#### Zsh ```zsh _BOARDWALK_COMPLETE=zsh_source boardwalk > ~/.boardwalk-complete.zsh _BOARDWALKD_COMPLETE=zsh_source boardwalkd > ~/.boardwalkd-complete.zsh @@ -197,27 +203,27 @@ echo '. ~/.boardwalk-complete.zsh' >> ~/.zshrc echo '. ~/.boardwalkd-complete.zsh' >> ~/.zshrc ``` -##### Fish +#### Fish ```sh _BOARDWALK_COMPLETE=fish_source boardwalk > ~/.config/fish/completions/boardwalk.fish _BOARDWALKD_COMPLETE=fish_source boardwalkd > ~/.config/fish/completions/boardwalkd.fish ``` -#### Container Install +### Container Install Boardwalk may be built as a container image by running `make container`. The entrypoint is simply `python -m` so either `boardwalk` or `boardwalkd` must be specified as the command when running. -### The `Boardwalkfile.py` +## The `Boardwalkfile.py` Boardwalk is both a python library and command-line tool. The `boardwalk` command-line tool expects a file called `Boardwalkfile.py` to exist in the current working directory where it's run. The `Boardwalkfile.py` defines what Workspaces, Workflows, and Jobs are available for use and how they are used. -#### Example `Boardwalkfile.py` +### Example `Boardwalkfile.py` ```python """ @@ -226,7 +232,7 @@ OS upgrades for storage pods in the staging environment """ # Imports the boardwalk module and classes used in the Boardwalkfile.py -from boardwalk import Job, Workflow, WorkflowConfig, Workspace, WorkspaceConfig, path +from boardwalk import TaskJob, Workflow, WorkflowConfig, Workspace, WorkspaceConfig, path # Optionally sets the URL to a boardwalkd server boardwalkd_url = "http://localhost:8888" @@ -282,9 +288,9 @@ class PodDistUpgradeWorkflow(Workflow): return WorkflowConfig(always_retry_failed_hosts=False) -# Defines a Job with the name "PodPreTasksJob", which is called in the +# Defines a TaskJob with the name "PodPreTasksJob", which is called in the # PodDistUpgradeWorkflow Workflow as the first Job -class PodPreTasksJob(Job): +class PodPreTasksJob(TaskJob): """ Jobs have an optional "tasks" method that returns a list of Ansible tasks. The format for tasks is structurally the same as Ansible tasks defined using @@ -300,9 +306,9 @@ class PodPreTasksJob(Job): def tasks(self): return [{"import_tasks": path("dist_upgrade/pod_pre_tasks.yml")}] -# Defines a Job with the name "DistUpgradeJob", which is called in the +# Defines a TaskJob with the name "DistUpgradeJob", which is called in the # PodDistUpgradeWorkflow Workflow as the second Job -class DistUpgradeJob(Job): +class DistUpgradeJob(TaskJob): """ Jobs have an optional "required_options" method that returns either a string or tuple of strings. The return value specifies options that can be passed @@ -348,16 +354,16 @@ class DistUpgradeJob(Job): {"import_tasks": path("dist_upgrade/main.yml")}, ] -# Defines a Job with the name "PodPostTasksJob", which is called in the +# Defines a TaskJob with the name "PodPostTasksJob", which is called in the # PodDistUpgradeWorkflow Workflow as the last Job -class PodPostTasksJob(Job): +class PodPostTasksJob(TaskJob): def tasks(self): return [ {"import_tasks": path("dist_upgrade/pod_post_tasks.yml")} ] ``` -### Command-line Interface +## Command-line Interface Once you have a `Boardwalkfile.py`, `boardwalk` can be used to run workflows. The example command-line usage below is using the `Boardwalkfile.py` example above. @@ -398,13 +404,13 @@ boardwalk --help boardwalk workspace --help ``` -### Environment Variables +## Environment Variables - `BOARDWALK_WORKSPACE`: When set, Boardwalk will use the value as the Workspace in use. This allows the tool to run against multiple Workspaces at the same time from the same working directory. -### Ansible Configuration & Options +## Ansible Configuration & Options Ansible, when run inside Boardwalk, will use almost the exact same configuration as any Ansible commands will use outside of Boardwalk. The only differences are: @@ -418,14 +424,14 @@ ansible.cfg](https://docs.ansible.com/ansible/latest/reference_appendices/config and/or [environment variables](https://docs.ansible.com/ansible/latest/reference_appendices/config.html). -#### Ansible Fact Cache +### Ansible Fact Cache Boardwalk maintains a fact cache per-workspace. The fact cache is populated for all hosts in a workspace during `boardwalk init`, and for each individual host as a Workflow runs. If `boardwalk init` hasn't been run in a long time, it may have stale data about hosts in the workspace. -#### Ansible Performance +### Ansible Performance Some optimal configuration settings are recommended. Ansible settings below are shown as environment variables here, but they may also be provided in an @@ -448,13 +454,13 @@ against large numbers of hosts: `ANSIBLE_FORKS` should be set to as high a value as the controller can handle. Maximizing `ANSIBLE_FORKS` depends upon the controller's CPU, memory, and open files limits. -### Automatic Vars +## Automatic Vars Boardwalk injects a boolean variable into Ansible operations, `boardwalk_operation`. This variable is always `True` when Ansible is being run by Boardwalk. -### `boardwalkd` Server +## `boardwalkd` Server Boardwalk is bundled along with `boardwalkd`, which is a central network server that Boardwalk can coordinate with. By specifying `boardwalkd_url` in the @@ -468,41 +474,24 @@ Boardwalk will use the server for several purposes: It enables Boardwalk to: See `boardwalkd serve --help` for options to run the server. -#### Architecture +### Architecture In the diagram and descriptions below, the word "worker" refers to the `boardwalk` CLI when it is connected to `boardwalkd`. -```text - +------------+ - | boardwalkd |-----------+ - +------------+ | - ^ (1) | - | | - +-----------+-----------+ | - | | | | -+---------+ +---------+ +---------+ | -| Worker1 | | Worker2 | | WorkerN | | -+---------+ +---------+ +---------+ | -| ^ (2) | ^ (2) | ^ (2) | -| | | | | | | -\ +------\----+------\----+------+ - | | | - v (3) v (3) v (3) -+-------+ +-------+ +-------+ -| Hosts | | Hosts | | Hosts | -+-------+ +-------+ +-------+ - -(1) Worker details, Workspace data, Workflow events, heartbeats sent from - workers to boardwalkd over HTTP(S). - -(2) Workers poll boardwalkd over HTTP(S) for semaphores including Workspace - mutexes and Workspace catches. - -(3) Workers connect directly to hosts over SSH. -``` +A diagram showing the relationship between boardwalkd, boardwalk workers, and managed hosts. A single boardwalkd server exists, to which one or more workers may connect (reference items 1 and 2 in the Key). Each worker operates on a specific set of hosts (reference item 3 in the Key). + +> Key +> --- +> (1) Worker details, Workspace data, Workflow events, +heartbeats sent from workers to boardwalkd over HTTP(S). +> +> (2) Workers poll boardwalkd over HTTP(S) for semaphores including Workspace +mutexes and Workspace catches. +> +> (3) Workers connect directly to hosts over SSH. -#### Catch & Release Behavior With Boardwalkd +### Catch & Release Behavior With Boardwalkd When Boardwalk encounters an error on a host, it will automatically catch the workspace. When a `boardwalkd` server is configured, automatic catching of @@ -512,11 +501,11 @@ and local catches cannot be released from the server UI. If Boardwalk encounters an error and for any reason it cannot catch the Workspace on the server, it will fall back to catching locally. -#### Boardwalkd Database Storage and Persistence +### Boardwalkd Database Storage and Persistence `boardwalkd` uses a single JSON file to save state. The JSON file is flushed to the working directory of the server, in `.boardwalkd/statefile.json` -#### Security +### Security __Authentication__: By default, `boardwalkd` uses anonymous authentication. It's important that an authentication method be configured. See diff --git a/diagrams/_d2_configuration.d2 b/diagrams/_d2_configuration.d2 new file mode 100644 index 0000000..0e378ed --- /dev/null +++ b/diagrams/_d2_configuration.d2 @@ -0,0 +1,16 @@ +vars: { + d2-config: { + center: true + pad: 10 + sketch: true + theme-id: 101 + theme-overrides: { + B1: "#590310" # Red 80 + B2: "#E20626" # Red 50 + B3: "#E02945" # Red 40 + B4: "#EC766D" # Red 30 + B5: "#F2A19B" # Red 20 + B6: "#F7CFCB" # Red 10 + } + } +} diff --git a/diagrams/architecture.d2 b/diagrams/architecture.d2 new file mode 100644 index 0000000..071df97 --- /dev/null +++ b/diagrams/architecture.d2 @@ -0,0 +1,43 @@ +# Import color overrides +...@_d2_configuration + +boardwalkd { + near: top-center +} + +worker1; worker2; workerN + + +worker1 -> boardwalkd: (1,2) +worker2 -> boardwalkd: (1,2) +workerN -> boardwalkd: (1,2) + + +h1: Hosts +h2: Hosts +h3: Hosts + +worker1 -> h1: (3) +worker2 -> h2: (3) +workerN -> h3: (3) + +# ```text +# +------------+ +# | boardwalkd |-----------+ +# +------------+ | +# ^ (1) | +# | | +# +-----------+-----------+ | +# | | | | +# +---------+ +---------+ +---------+ | +# | Worker1 | | Worker2 | | WorkerN | | +# +---------+ +---------+ +---------+ | +# | ^ (2) | ^ (2) | ^ (2) | +# | | | | | | | +# \ +------\----+------\----+------+ +# | | | +# v (3) v (3) v (3) +# +-------+ +-------+ +-------+ +# | Hosts | | Hosts | | Hosts | +# +-------+ +-------+ +-------+ + diff --git a/diagrams/architecture.png b/diagrams/architecture.png new file mode 100644 index 0000000000000000000000000000000000000000..dddd2e470501e9ffb9294662f922e261f553c4f0 GIT binary patch literal 63606 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 Job2 -> JobN + JobN.style.multiple: true + } +} diff --git a/diagrams/conceptual_overview.png b/diagrams/conceptual_overview.png new file mode 100644 index 0000000000000000000000000000000000000000..b9d0af02895254393685f271aec8ad95fae5d46e GIT binary patch literal 105620 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 literal 0 HcmV?d00001 diff --git a/poetry.lock b/poetry.lock index 06a160e..84555ae 100644 --- a/poetry.lock +++ b/poetry.lock @@ -2,113 +2,113 @@ [[package]] name = "aiohappyeyeballs" -version = "2.4.0" +version = "2.4.3" description = "Happy Eyeballs for asyncio" optional = false python-versions = ">=3.8" files = [ - {file = "aiohappyeyeballs-2.4.0-py3-none-any.whl", hash = "sha256:7ce92076e249169a13c2f49320d1967425eaf1f407522d707d59cac7628d62bd"}, - {file = "aiohappyeyeballs-2.4.0.tar.gz", hash = "sha256:55a1714f084e63d49639800f95716da97a1f173d46a16dfcfda0016abb93b6b2"}, + {file = "aiohappyeyeballs-2.4.3-py3-none-any.whl", hash = "sha256:8a7a83727b2756f394ab2895ea0765a0a8c475e3c71e98d43d76f22b4b435572"}, + {file = "aiohappyeyeballs-2.4.3.tar.gz", hash = "sha256:75cf88a15106a5002a8eb1dab212525c00d1f4c0fa96e551c9fbe6f09a621586"}, ] [[package]] name = "aiohttp" -version = "3.10.5" +version = "3.10.10" description = "Async http client/server framework (asyncio)" optional = false python-versions = ">=3.8" files = [ - {file = "aiohttp-3.10.5-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:18a01eba2574fb9edd5f6e5fb25f66e6ce061da5dab5db75e13fe1558142e0a3"}, - {file = "aiohttp-3.10.5-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:94fac7c6e77ccb1ca91e9eb4cb0ac0270b9fb9b289738654120ba8cebb1189c6"}, - {file = "aiohttp-3.10.5-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:2f1f1c75c395991ce9c94d3e4aa96e5c59c8356a15b1c9231e783865e2772699"}, - {file = "aiohttp-3.10.5-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4f7acae3cf1a2a2361ec4c8e787eaaa86a94171d2417aae53c0cca6ca3118ff6"}, - {file = "aiohttp-3.10.5-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:94c4381ffba9cc508b37d2e536b418d5ea9cfdc2848b9a7fea6aebad4ec6aac1"}, - {file = "aiohttp-3.10.5-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c31ad0c0c507894e3eaa843415841995bf8de4d6b2d24c6e33099f4bc9fc0d4f"}, - {file = "aiohttp-3.10.5-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0912b8a8fadeb32ff67a3ed44249448c20148397c1ed905d5dac185b4ca547bb"}, - {file = "aiohttp-3.10.5-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0d93400c18596b7dc4794d48a63fb361b01a0d8eb39f28800dc900c8fbdaca91"}, - {file = "aiohttp-3.10.5-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:d00f3c5e0d764a5c9aa5a62d99728c56d455310bcc288a79cab10157b3af426f"}, - {file = "aiohttp-3.10.5-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:d742c36ed44f2798c8d3f4bc511f479b9ceef2b93f348671184139e7d708042c"}, - {file = "aiohttp-3.10.5-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:814375093edae5f1cb31e3407997cf3eacefb9010f96df10d64829362ae2df69"}, - {file = "aiohttp-3.10.5-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:8224f98be68a84b19f48e0bdc14224b5a71339aff3a27df69989fa47d01296f3"}, - {file = "aiohttp-3.10.5-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:d9a487ef090aea982d748b1b0d74fe7c3950b109df967630a20584f9a99c0683"}, - {file = "aiohttp-3.10.5-cp310-cp310-win32.whl", hash = "sha256:d9ef084e3dc690ad50137cc05831c52b6ca428096e6deb3c43e95827f531d5ef"}, - {file = "aiohttp-3.10.5-cp310-cp310-win_amd64.whl", hash = "sha256:66bf9234e08fe561dccd62083bf67400bdbf1c67ba9efdc3dac03650e97c6088"}, - {file = "aiohttp-3.10.5-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:8c6a4e5e40156d72a40241a25cc226051c0a8d816610097a8e8f517aeacd59a2"}, - {file = "aiohttp-3.10.5-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:2c634a3207a5445be65536d38c13791904fda0748b9eabf908d3fe86a52941cf"}, - {file = "aiohttp-3.10.5-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:4aff049b5e629ef9b3e9e617fa6e2dfeda1bf87e01bcfecaf3949af9e210105e"}, - {file = "aiohttp-3.10.5-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1942244f00baaacaa8155eca94dbd9e8cc7017deb69b75ef67c78e89fdad3c77"}, - {file = "aiohttp-3.10.5-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e04a1f2a65ad2f93aa20f9ff9f1b672bf912413e5547f60749fa2ef8a644e061"}, - {file = "aiohttp-3.10.5-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7f2bfc0032a00405d4af2ba27f3c429e851d04fad1e5ceee4080a1c570476697"}, - {file = "aiohttp-3.10.5-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:424ae21498790e12eb759040bbb504e5e280cab64693d14775c54269fd1d2bb7"}, - {file = "aiohttp-3.10.5-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:975218eee0e6d24eb336d0328c768ebc5d617609affaca5dbbd6dd1984f16ed0"}, - {file = "aiohttp-3.10.5-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:4120d7fefa1e2d8fb6f650b11489710091788de554e2b6f8347c7a20ceb003f5"}, - {file = "aiohttp-3.10.5-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:b90078989ef3fc45cf9221d3859acd1108af7560c52397ff4ace8ad7052a132e"}, - {file = "aiohttp-3.10.5-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:ba5a8b74c2a8af7d862399cdedce1533642fa727def0b8c3e3e02fcb52dca1b1"}, - {file = "aiohttp-3.10.5-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:02594361128f780eecc2a29939d9dfc870e17b45178a867bf61a11b2a4367277"}, - {file = "aiohttp-3.10.5-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:8fb4fc029e135859f533025bc82047334e24b0d489e75513144f25408ecaf058"}, - {file = "aiohttp-3.10.5-cp311-cp311-win32.whl", hash = "sha256:e1ca1ef5ba129718a8fc827b0867f6aa4e893c56eb00003b7367f8a733a9b072"}, - {file = "aiohttp-3.10.5-cp311-cp311-win_amd64.whl", hash = "sha256:349ef8a73a7c5665cca65c88ab24abe75447e28aa3bc4c93ea5093474dfdf0ff"}, - {file = "aiohttp-3.10.5-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:305be5ff2081fa1d283a76113b8df7a14c10d75602a38d9f012935df20731487"}, - {file = "aiohttp-3.10.5-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:3a1c32a19ee6bbde02f1cb189e13a71b321256cc1d431196a9f824050b160d5a"}, - {file = "aiohttp-3.10.5-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:61645818edd40cc6f455b851277a21bf420ce347baa0b86eaa41d51ef58ba23d"}, - {file = "aiohttp-3.10.5-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6c225286f2b13bab5987425558baa5cbdb2bc925b2998038fa028245ef421e75"}, - {file = "aiohttp-3.10.5-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8ba01ebc6175e1e6b7275c907a3a36be48a2d487549b656aa90c8a910d9f3178"}, - {file = "aiohttp-3.10.5-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8eaf44ccbc4e35762683078b72bf293f476561d8b68ec8a64f98cf32811c323e"}, - {file = "aiohttp-3.10.5-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b1c43eb1ab7cbf411b8e387dc169acb31f0ca0d8c09ba63f9eac67829585b44f"}, - {file = "aiohttp-3.10.5-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:de7a5299827253023c55ea549444e058c0eb496931fa05d693b95140a947cb73"}, - {file = "aiohttp-3.10.5-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:4790f0e15f00058f7599dab2b206d3049d7ac464dc2e5eae0e93fa18aee9e7bf"}, - {file = "aiohttp-3.10.5-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:44b324a6b8376a23e6ba25d368726ee3bc281e6ab306db80b5819999c737d820"}, - {file = "aiohttp-3.10.5-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:0d277cfb304118079e7044aad0b76685d30ecb86f83a0711fc5fb257ffe832ca"}, - {file = "aiohttp-3.10.5-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:54d9ddea424cd19d3ff6128601a4a4d23d54a421f9b4c0fff740505813739a91"}, - {file = "aiohttp-3.10.5-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:4f1c9866ccf48a6df2b06823e6ae80573529f2af3a0992ec4fe75b1a510df8a6"}, - {file = "aiohttp-3.10.5-cp312-cp312-win32.whl", hash = "sha256:dc4826823121783dccc0871e3f405417ac116055bf184ac04c36f98b75aacd12"}, - {file = "aiohttp-3.10.5-cp312-cp312-win_amd64.whl", hash = "sha256:22c0a23a3b3138a6bf76fc553789cb1a703836da86b0f306b6f0dc1617398abc"}, - {file = "aiohttp-3.10.5-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:7f6b639c36734eaa80a6c152a238242bedcee9b953f23bb887e9102976343092"}, - {file = "aiohttp-3.10.5-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:f29930bc2921cef955ba39a3ff87d2c4398a0394ae217f41cb02d5c26c8b1b77"}, - {file = "aiohttp-3.10.5-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:f489a2c9e6455d87eabf907ac0b7d230a9786be43fbe884ad184ddf9e9c1e385"}, - {file = "aiohttp-3.10.5-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:123dd5b16b75b2962d0fff566effb7a065e33cd4538c1692fb31c3bda2bfb972"}, - {file = "aiohttp-3.10.5-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b98e698dc34966e5976e10bbca6d26d6724e6bdea853c7c10162a3235aba6e16"}, - {file = "aiohttp-3.10.5-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c3b9162bab7e42f21243effc822652dc5bb5e8ff42a4eb62fe7782bcbcdfacf6"}, - {file = "aiohttp-3.10.5-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1923a5c44061bffd5eebeef58cecf68096e35003907d8201a4d0d6f6e387ccaa"}, - {file = "aiohttp-3.10.5-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d55f011da0a843c3d3df2c2cf4e537b8070a419f891c930245f05d329c4b0689"}, - {file = "aiohttp-3.10.5-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:afe16a84498441d05e9189a15900640a2d2b5e76cf4efe8cbb088ab4f112ee57"}, - {file = "aiohttp-3.10.5-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:f8112fb501b1e0567a1251a2fd0747baae60a4ab325a871e975b7bb67e59221f"}, - {file = "aiohttp-3.10.5-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:1e72589da4c90337837fdfe2026ae1952c0f4a6e793adbbfbdd40efed7c63599"}, - {file = "aiohttp-3.10.5-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:4d46c7b4173415d8e583045fbc4daa48b40e31b19ce595b8d92cf639396c15d5"}, - {file = "aiohttp-3.10.5-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:33e6bc4bab477c772a541f76cd91e11ccb6d2efa2b8d7d7883591dfb523e5987"}, - {file = "aiohttp-3.10.5-cp313-cp313-win32.whl", hash = "sha256:c58c6837a2c2a7cf3133983e64173aec11f9c2cd8e87ec2fdc16ce727bcf1a04"}, - {file = "aiohttp-3.10.5-cp313-cp313-win_amd64.whl", hash = "sha256:38172a70005252b6893088c0f5e8a47d173df7cc2b2bd88650957eb84fcf5022"}, - {file = "aiohttp-3.10.5-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:f6f18898ace4bcd2d41a122916475344a87f1dfdec626ecde9ee802a711bc569"}, - {file = "aiohttp-3.10.5-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:5ede29d91a40ba22ac1b922ef510aab871652f6c88ef60b9dcdf773c6d32ad7a"}, - {file = "aiohttp-3.10.5-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:673f988370f5954df96cc31fd99c7312a3af0a97f09e407399f61583f30da9bc"}, - {file = "aiohttp-3.10.5-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:58718e181c56a3c02d25b09d4115eb02aafe1a732ce5714ab70326d9776457c3"}, - {file = "aiohttp-3.10.5-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4b38b1570242fbab8d86a84128fb5b5234a2f70c2e32f3070143a6d94bc854cf"}, - {file = "aiohttp-3.10.5-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:074d1bff0163e107e97bd48cad9f928fa5a3eb4b9d33366137ffce08a63e37fe"}, - {file = "aiohttp-3.10.5-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fd31f176429cecbc1ba499d4aba31aaccfea488f418d60376b911269d3b883c5"}, - {file = "aiohttp-3.10.5-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7384d0b87d4635ec38db9263e6a3f1eb609e2e06087f0aa7f63b76833737b471"}, - {file = "aiohttp-3.10.5-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:8989f46f3d7ef79585e98fa991e6ded55d2f48ae56d2c9fa5e491a6e4effb589"}, - {file = "aiohttp-3.10.5-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:c83f7a107abb89a227d6c454c613e7606c12a42b9a4ca9c5d7dad25d47c776ae"}, - {file = "aiohttp-3.10.5-cp38-cp38-musllinux_1_2_ppc64le.whl", hash = "sha256:cde98f323d6bf161041e7627a5fd763f9fd829bcfcd089804a5fdce7bb6e1b7d"}, - {file = "aiohttp-3.10.5-cp38-cp38-musllinux_1_2_s390x.whl", hash = "sha256:676f94c5480d8eefd97c0c7e3953315e4d8c2b71f3b49539beb2aa676c58272f"}, - {file = "aiohttp-3.10.5-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:2d21ac12dc943c68135ff858c3a989f2194a709e6e10b4c8977d7fcd67dfd511"}, - {file = "aiohttp-3.10.5-cp38-cp38-win32.whl", hash = "sha256:17e997105bd1a260850272bfb50e2a328e029c941c2708170d9d978d5a30ad9a"}, - {file = "aiohttp-3.10.5-cp38-cp38-win_amd64.whl", hash = "sha256:1c19de68896747a2aa6257ae4cf6ef59d73917a36a35ee9d0a6f48cff0f94db8"}, - {file = "aiohttp-3.10.5-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:7e2fe37ac654032db1f3499fe56e77190282534810e2a8e833141a021faaab0e"}, - {file = "aiohttp-3.10.5-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:f5bf3ead3cb66ab990ee2561373b009db5bc0e857549b6c9ba84b20bc462e172"}, - {file = "aiohttp-3.10.5-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:1b2c16a919d936ca87a3c5f0e43af12a89a3ce7ccbce59a2d6784caba945b68b"}, - {file = "aiohttp-3.10.5-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ad146dae5977c4dd435eb31373b3fe9b0b1bf26858c6fc452bf6af394067e10b"}, - {file = "aiohttp-3.10.5-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8c5c6fa16412b35999320f5c9690c0f554392dc222c04e559217e0f9ae244b92"}, - {file = "aiohttp-3.10.5-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:95c4dc6f61d610bc0ee1edc6f29d993f10febfe5b76bb470b486d90bbece6b22"}, - {file = "aiohttp-3.10.5-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:da452c2c322e9ce0cfef392e469a26d63d42860f829026a63374fde6b5c5876f"}, - {file = "aiohttp-3.10.5-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:898715cf566ec2869d5cb4d5fb4be408964704c46c96b4be267442d265390f32"}, - {file = "aiohttp-3.10.5-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:391cc3a9c1527e424c6865e087897e766a917f15dddb360174a70467572ac6ce"}, - {file = "aiohttp-3.10.5-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:380f926b51b92d02a34119d072f178d80bbda334d1a7e10fa22d467a66e494db"}, - {file = "aiohttp-3.10.5-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:ce91db90dbf37bb6fa0997f26574107e1b9d5ff939315247b7e615baa8ec313b"}, - {file = "aiohttp-3.10.5-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:9093a81e18c45227eebe4c16124ebf3e0d893830c6aca7cc310bfca8fe59d857"}, - {file = "aiohttp-3.10.5-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:ee40b40aa753d844162dcc80d0fe256b87cba48ca0054f64e68000453caead11"}, - {file = "aiohttp-3.10.5-cp39-cp39-win32.whl", hash = "sha256:03f2645adbe17f274444953bdea69f8327e9d278d961d85657cb0d06864814c1"}, - {file = "aiohttp-3.10.5-cp39-cp39-win_amd64.whl", hash = "sha256:d17920f18e6ee090bdd3d0bfffd769d9f2cb4c8ffde3eb203777a3895c128862"}, - {file = "aiohttp-3.10.5.tar.gz", hash = "sha256:f071854b47d39591ce9a17981c46790acb30518e2f83dfca8db2dfa091178691"}, + {file = "aiohttp-3.10.10-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:be7443669ae9c016b71f402e43208e13ddf00912f47f623ee5994e12fc7d4b3f"}, + {file = "aiohttp-3.10.10-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:7b06b7843929e41a94ea09eb1ce3927865387e3e23ebe108e0d0d09b08d25be9"}, + {file = "aiohttp-3.10.10-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:333cf6cf8e65f6a1e06e9eb3e643a0c515bb850d470902274239fea02033e9a8"}, + {file = "aiohttp-3.10.10-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:274cfa632350225ce3fdeb318c23b4a10ec25c0e2c880eff951a3842cf358ac1"}, + {file = "aiohttp-3.10.10-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d9e5e4a85bdb56d224f412d9c98ae4cbd032cc4f3161818f692cd81766eee65a"}, + {file = "aiohttp-3.10.10-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2b606353da03edcc71130b52388d25f9a30a126e04caef1fd637e31683033abd"}, + {file = "aiohttp-3.10.10-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ab5a5a0c7a7991d90446a198689c0535be89bbd6b410a1f9a66688f0880ec026"}, + {file = "aiohttp-3.10.10-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:578a4b875af3e0daaf1ac6fa983d93e0bbfec3ead753b6d6f33d467100cdc67b"}, + {file = "aiohttp-3.10.10-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:8105fd8a890df77b76dd3054cddf01a879fc13e8af576805d667e0fa0224c35d"}, + {file = "aiohttp-3.10.10-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:3bcd391d083f636c06a68715e69467963d1f9600f85ef556ea82e9ef25f043f7"}, + {file = "aiohttp-3.10.10-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:fbc6264158392bad9df19537e872d476f7c57adf718944cc1e4495cbabf38e2a"}, + {file = "aiohttp-3.10.10-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:e48d5021a84d341bcaf95c8460b152cfbad770d28e5fe14a768988c461b821bc"}, + {file = "aiohttp-3.10.10-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:2609e9ab08474702cc67b7702dbb8a80e392c54613ebe80db7e8dbdb79837c68"}, + {file = "aiohttp-3.10.10-cp310-cp310-win32.whl", hash = "sha256:84afcdea18eda514c25bc68b9af2a2b1adea7c08899175a51fe7c4fb6d551257"}, + {file = "aiohttp-3.10.10-cp310-cp310-win_amd64.whl", hash = "sha256:9c72109213eb9d3874f7ac8c0c5fa90e072d678e117d9061c06e30c85b4cf0e6"}, + {file = "aiohttp-3.10.10-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:c30a0eafc89d28e7f959281b58198a9fa5e99405f716c0289b7892ca345fe45f"}, + {file = "aiohttp-3.10.10-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:258c5dd01afc10015866114e210fb7365f0d02d9d059c3c3415382ab633fcbcb"}, + {file = "aiohttp-3.10.10-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:15ecd889a709b0080f02721255b3f80bb261c2293d3c748151274dfea93ac871"}, + {file = "aiohttp-3.10.10-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f3935f82f6f4a3820270842e90456ebad3af15810cf65932bd24da4463bc0a4c"}, + {file = "aiohttp-3.10.10-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:413251f6fcf552a33c981c4709a6bba37b12710982fec8e558ae944bfb2abd38"}, + {file = "aiohttp-3.10.10-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d1720b4f14c78a3089562b8875b53e36b51c97c51adc53325a69b79b4b48ebcb"}, + {file = "aiohttp-3.10.10-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:679abe5d3858b33c2cf74faec299fda60ea9de62916e8b67e625d65bf069a3b7"}, + {file = "aiohttp-3.10.10-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:79019094f87c9fb44f8d769e41dbb664d6e8fcfd62f665ccce36762deaa0e911"}, + {file = "aiohttp-3.10.10-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:fe2fb38c2ed905a2582948e2de560675e9dfbee94c6d5ccdb1301c6d0a5bf092"}, + {file = "aiohttp-3.10.10-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:a3f00003de6eba42d6e94fabb4125600d6e484846dbf90ea8e48a800430cc142"}, + {file = "aiohttp-3.10.10-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:1bbb122c557a16fafc10354b9d99ebf2f2808a660d78202f10ba9d50786384b9"}, + {file = "aiohttp-3.10.10-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:30ca7c3b94708a9d7ae76ff281b2f47d8eaf2579cd05971b5dc681db8caac6e1"}, + {file = "aiohttp-3.10.10-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:df9270660711670e68803107d55c2b5949c2e0f2e4896da176e1ecfc068b974a"}, + {file = "aiohttp-3.10.10-cp311-cp311-win32.whl", hash = "sha256:aafc8ee9b742ce75044ae9a4d3e60e3d918d15a4c2e08a6c3c3e38fa59b92d94"}, + {file = "aiohttp-3.10.10-cp311-cp311-win_amd64.whl", hash = "sha256:362f641f9071e5f3ee6f8e7d37d5ed0d95aae656adf4ef578313ee585b585959"}, + {file = "aiohttp-3.10.10-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:9294bbb581f92770e6ed5c19559e1e99255e4ca604a22c5c6397b2f9dd3ee42c"}, + {file = "aiohttp-3.10.10-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:a8fa23fe62c436ccf23ff930149c047f060c7126eae3ccea005f0483f27b2e28"}, + {file = "aiohttp-3.10.10-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:5c6a5b8c7926ba5d8545c7dd22961a107526562da31a7a32fa2456baf040939f"}, + {file = "aiohttp-3.10.10-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:007ec22fbc573e5eb2fb7dec4198ef8f6bf2fe4ce20020798b2eb5d0abda6138"}, + {file = "aiohttp-3.10.10-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9627cc1a10c8c409b5822a92d57a77f383b554463d1884008e051c32ab1b3742"}, + {file = "aiohttp-3.10.10-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:50edbcad60d8f0e3eccc68da67f37268b5144ecc34d59f27a02f9611c1d4eec7"}, + {file = "aiohttp-3.10.10-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a45d85cf20b5e0d0aa5a8dca27cce8eddef3292bc29d72dcad1641f4ed50aa16"}, + {file = "aiohttp-3.10.10-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0b00807e2605f16e1e198f33a53ce3c4523114059b0c09c337209ae55e3823a8"}, + {file = "aiohttp-3.10.10-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:f2d4324a98062be0525d16f768a03e0bbb3b9fe301ceee99611dc9a7953124e6"}, + {file = "aiohttp-3.10.10-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:438cd072f75bb6612f2aca29f8bd7cdf6e35e8f160bc312e49fbecab77c99e3a"}, + {file = "aiohttp-3.10.10-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:baa42524a82f75303f714108fea528ccacf0386af429b69fff141ffef1c534f9"}, + {file = "aiohttp-3.10.10-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:a7d8d14fe962153fc681f6366bdec33d4356f98a3e3567782aac1b6e0e40109a"}, + {file = "aiohttp-3.10.10-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:c1277cd707c465cd09572a774559a3cc7c7a28802eb3a2a9472588f062097205"}, + {file = "aiohttp-3.10.10-cp312-cp312-win32.whl", hash = "sha256:59bb3c54aa420521dc4ce3cc2c3fe2ad82adf7b09403fa1f48ae45c0cbde6628"}, + {file = "aiohttp-3.10.10-cp312-cp312-win_amd64.whl", hash = "sha256:0e1b370d8007c4ae31ee6db7f9a2fe801a42b146cec80a86766e7ad5c4a259cf"}, + {file = "aiohttp-3.10.10-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:ad7593bb24b2ab09e65e8a1d385606f0f47c65b5a2ae6c551db67d6653e78c28"}, + {file = "aiohttp-3.10.10-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:1eb89d3d29adaf533588f209768a9c02e44e4baf832b08118749c5fad191781d"}, + {file = "aiohttp-3.10.10-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:3fe407bf93533a6fa82dece0e74dbcaaf5d684e5a51862887f9eaebe6372cd79"}, + {file = "aiohttp-3.10.10-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:50aed5155f819873d23520919e16703fc8925e509abbb1a1491b0087d1cd969e"}, + {file = "aiohttp-3.10.10-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4f05e9727ce409358baa615dbeb9b969db94324a79b5a5cea45d39bdb01d82e6"}, + {file = "aiohttp-3.10.10-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3dffb610a30d643983aeb185ce134f97f290f8935f0abccdd32c77bed9388b42"}, + {file = "aiohttp-3.10.10-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:aa6658732517ddabe22c9036479eabce6036655ba87a0224c612e1ae6af2087e"}, + {file = "aiohttp-3.10.10-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:741a46d58677d8c733175d7e5aa618d277cd9d880301a380fd296975a9cdd7bc"}, + {file = "aiohttp-3.10.10-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:e00e3505cd80440f6c98c6d69269dcc2a119f86ad0a9fd70bccc59504bebd68a"}, + {file = "aiohttp-3.10.10-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:ffe595f10566f8276b76dc3a11ae4bb7eba1aac8ddd75811736a15b0d5311414"}, + {file = "aiohttp-3.10.10-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:bdfcf6443637c148c4e1a20c48c566aa694fa5e288d34b20fcdc58507882fed3"}, + {file = "aiohttp-3.10.10-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:d183cf9c797a5291e8301790ed6d053480ed94070637bfaad914dd38b0981f67"}, + {file = "aiohttp-3.10.10-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:77abf6665ae54000b98b3c742bc6ea1d1fb31c394bcabf8b5d2c1ac3ebfe7f3b"}, + {file = "aiohttp-3.10.10-cp313-cp313-win32.whl", hash = "sha256:4470c73c12cd9109db8277287d11f9dd98f77fc54155fc71a7738a83ffcc8ea8"}, + {file = "aiohttp-3.10.10-cp313-cp313-win_amd64.whl", hash = "sha256:486f7aabfa292719a2753c016cc3a8f8172965cabb3ea2e7f7436c7f5a22a151"}, + {file = "aiohttp-3.10.10-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:1b66ccafef7336a1e1f0e389901f60c1d920102315a56df85e49552308fc0486"}, + {file = "aiohttp-3.10.10-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:acd48d5b80ee80f9432a165c0ac8cbf9253eaddb6113269a5e18699b33958dbb"}, + {file = "aiohttp-3.10.10-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:3455522392fb15ff549d92fbf4b73b559d5e43dc522588f7eb3e54c3f38beee7"}, + {file = "aiohttp-3.10.10-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:45c3b868724137f713a38376fef8120c166d1eadd50da1855c112fe97954aed8"}, + {file = "aiohttp-3.10.10-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:da1dee8948d2137bb51fbb8a53cce6b1bcc86003c6b42565f008438b806cccd8"}, + {file = "aiohttp-3.10.10-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c5ce2ce7c997e1971b7184ee37deb6ea9922ef5163c6ee5aa3c274b05f9e12fa"}, + {file = "aiohttp-3.10.10-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:28529e08fde6f12eba8677f5a8608500ed33c086f974de68cc65ab218713a59d"}, + {file = "aiohttp-3.10.10-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f7db54c7914cc99d901d93a34704833568d86c20925b2762f9fa779f9cd2e70f"}, + {file = "aiohttp-3.10.10-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:03a42ac7895406220124c88911ebee31ba8b2d24c98507f4a8bf826b2937c7f2"}, + {file = "aiohttp-3.10.10-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:7e338c0523d024fad378b376a79faff37fafb3c001872a618cde1d322400a572"}, + {file = "aiohttp-3.10.10-cp38-cp38-musllinux_1_2_ppc64le.whl", hash = "sha256:038f514fe39e235e9fef6717fbf944057bfa24f9b3db9ee551a7ecf584b5b480"}, + {file = "aiohttp-3.10.10-cp38-cp38-musllinux_1_2_s390x.whl", hash = "sha256:64f6c17757251e2b8d885d728b6433d9d970573586a78b78ba8929b0f41d045a"}, + {file = "aiohttp-3.10.10-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:93429602396f3383a797a2a70e5f1de5df8e35535d7806c9f91df06f297e109b"}, + {file = "aiohttp-3.10.10-cp38-cp38-win32.whl", hash = "sha256:c823bc3971c44ab93e611ab1a46b1eafeae474c0c844aff4b7474287b75fe49c"}, + {file = "aiohttp-3.10.10-cp38-cp38-win_amd64.whl", hash = "sha256:54ca74df1be3c7ca1cf7f4c971c79c2daf48d9aa65dea1a662ae18926f5bc8ce"}, + {file = "aiohttp-3.10.10-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:01948b1d570f83ee7bbf5a60ea2375a89dfb09fd419170e7f5af029510033d24"}, + {file = "aiohttp-3.10.10-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:9fc1500fd2a952c5c8e3b29aaf7e3cc6e27e9cfc0a8819b3bce48cc1b849e4cc"}, + {file = "aiohttp-3.10.10-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:f614ab0c76397661b90b6851a030004dac502e48260ea10f2441abd2207fbcc7"}, + {file = "aiohttp-3.10.10-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:00819de9e45d42584bed046314c40ea7e9aea95411b38971082cad449392b08c"}, + {file = "aiohttp-3.10.10-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:05646ebe6b94cc93407b3bf34b9eb26c20722384d068eb7339de802154d61bc5"}, + {file = "aiohttp-3.10.10-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:998f3bd3cfc95e9424a6acd7840cbdd39e45bc09ef87533c006f94ac47296090"}, + {file = "aiohttp-3.10.10-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d9010c31cd6fa59438da4e58a7f19e4753f7f264300cd152e7f90d4602449762"}, + {file = "aiohttp-3.10.10-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7ea7ffc6d6d6f8a11e6f40091a1040995cdff02cfc9ba4c2f30a516cb2633554"}, + {file = "aiohttp-3.10.10-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:ef9c33cc5cbca35808f6c74be11eb7f5f6b14d2311be84a15b594bd3e58b5527"}, + {file = "aiohttp-3.10.10-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:ce0cdc074d540265bfeb31336e678b4e37316849d13b308607efa527e981f5c2"}, + {file = "aiohttp-3.10.10-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:597a079284b7ee65ee102bc3a6ea226a37d2b96d0418cc9047490f231dc09fe8"}, + {file = "aiohttp-3.10.10-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:7789050d9e5d0c309c706953e5e8876e38662d57d45f936902e176d19f1c58ab"}, + {file = "aiohttp-3.10.10-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:e7f8b04d83483577fd9200461b057c9f14ced334dcb053090cea1da9c8321a91"}, + {file = "aiohttp-3.10.10-cp39-cp39-win32.whl", hash = "sha256:c02a30b904282777d872266b87b20ed8cc0d1501855e27f831320f471d54d983"}, + {file = "aiohttp-3.10.10-cp39-cp39-win_amd64.whl", hash = "sha256:edfe3341033a6b53a5c522c802deb2079eee5cbfbb0af032a55064bd65c73a23"}, + {file = "aiohttp-3.10.10.tar.gz", hash = "sha256:0631dd7c9f0822cc61c88586ca76d5b5ada26538097d0f1df510b082bad3411a"}, ] [package.dependencies] @@ -117,7 +117,7 @@ aiosignal = ">=1.1.2" attrs = ">=17.3.0" frozenlist = ">=1.1.1" multidict = ">=4.5,<7.0" -yarl = ">=1.0,<2.0" +yarl = ">=1.12.0,<2.0" [package.extras] speedups = ["Brotli", "aiodns (>=3.2.0)", "brotlicffi"] @@ -164,6 +164,26 @@ pexpect = ">=4.5" python-daemon = "*" pyyaml = "*" +[[package]] +name = "anyio" +version = "4.6.2.post1" +description = "High level compatibility layer for multiple asynchronous event loop implementations" +optional = false +python-versions = ">=3.9" +files = [ + {file = "anyio-4.6.2.post1-py3-none-any.whl", hash = "sha256:6d170c36fba3bdd840c73d3868c1e777e33676a69c3a72cf0a0d5d6d8009b61d"}, + {file = "anyio-4.6.2.post1.tar.gz", hash = "sha256:4c8bc31ccdb51c7f7bd251f51c609e038d63e34219b44aa86e47576389880b4c"}, +] + +[package.dependencies] +idna = ">=2.8" +sniffio = ">=1.1" + +[package.extras] +doc = ["Sphinx (>=7.4,<8.0)", "packaging", "sphinx-autodoc-typehints (>=1.2.0)", "sphinx-rtd-theme"] +test = ["anyio[trio]", "coverage[toml] (>=7)", "exceptiongroup (>=1.2.0)", "hypothesis (>=4.0)", "psutil (>=5.9)", "pytest (>=7.0)", "pytest-mock (>=3.6.1)", "trustme", "truststore (>=0.9.1)", "uvloop (>=0.21.0b1)"] +trio = ["trio (>=0.26.1)"] + [[package]] name = "attrs" version = "24.2.0" @@ -196,100 +216,100 @@ files = [ [[package]] name = "bracex" -version = "2.5" +version = "2.5.post1" description = "Bash style brace expander." optional = false python-versions = ">=3.8" files = [ - {file = "bracex-2.5-py3-none-any.whl", hash = "sha256:d2fcf4b606a82ac325471affe1706dd9bbaa3536c91ef86a31f6b766f3dad1d0"}, - {file = "bracex-2.5.tar.gz", hash = "sha256:0725da5045e8d37ea9592ab3614d8b561e22c3c5fde3964699be672e072ab611"}, + {file = "bracex-2.5.post1-py3-none-any.whl", hash = "sha256:13e5732fec27828d6af308628285ad358047cec36801598368cb28bc631dbaf6"}, + {file = "bracex-2.5.post1.tar.gz", hash = "sha256:12c50952415bfa773d2d9ccb8e79651b8cdb1f31a42f6091b804f6ba2b4a66b6"}, ] [[package]] name = "certifi" -version = "2024.7.4" +version = "2024.8.30" description = "Python package for providing Mozilla's CA Bundle." optional = false python-versions = ">=3.6" files = [ - {file = "certifi-2024.7.4-py3-none-any.whl", hash = "sha256:c198e21b1289c2ab85ee4e67bb4b4ef3ead0892059901a8d5b622f24a1101e90"}, - {file = "certifi-2024.7.4.tar.gz", hash = "sha256:5a1e7645bc0ec61a09e26c36f6106dd4cf40c6db3a1fb6352b0244e7fb057c7b"}, + {file = "certifi-2024.8.30-py3-none-any.whl", hash = "sha256:922820b53db7a7257ffbda3f597266d435245903d80737e34f8a45ff3e3230d8"}, + {file = "certifi-2024.8.30.tar.gz", hash = "sha256:bec941d2aa8195e248a60b31ff9f0558284cf01a52591ceda73ea9afffd69fd9"}, ] [[package]] name = "cffi" -version = "1.17.0" +version = "1.17.1" description = "Foreign Function Interface for Python calling C code." optional = false python-versions = ">=3.8" files = [ - {file = "cffi-1.17.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:f9338cc05451f1942d0d8203ec2c346c830f8e86469903d5126c1f0a13a2bcbb"}, - {file = "cffi-1.17.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:a0ce71725cacc9ebf839630772b07eeec220cbb5f03be1399e0457a1464f8e1a"}, - {file = "cffi-1.17.0-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c815270206f983309915a6844fe994b2fa47e5d05c4c4cef267c3b30e34dbe42"}, - {file = "cffi-1.17.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d6bdcd415ba87846fd317bee0774e412e8792832e7805938987e4ede1d13046d"}, - {file = "cffi-1.17.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8a98748ed1a1df4ee1d6f927e151ed6c1a09d5ec21684de879c7ea6aa96f58f2"}, - {file = "cffi-1.17.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:0a048d4f6630113e54bb4b77e315e1ba32a5a31512c31a273807d0027a7e69ab"}, - {file = "cffi-1.17.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:24aa705a5f5bd3a8bcfa4d123f03413de5d86e497435693b638cbffb7d5d8a1b"}, - {file = "cffi-1.17.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:856bf0924d24e7f93b8aee12a3a1095c34085600aa805693fb7f5d1962393206"}, - {file = "cffi-1.17.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:4304d4416ff032ed50ad6bb87416d802e67139e31c0bde4628f36a47a3164bfa"}, - {file = "cffi-1.17.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:331ad15c39c9fe9186ceaf87203a9ecf5ae0ba2538c9e898e3a6967e8ad3db6f"}, - {file = "cffi-1.17.0-cp310-cp310-win32.whl", hash = "sha256:669b29a9eca6146465cc574659058ed949748f0809a2582d1f1a324eb91054dc"}, - {file = "cffi-1.17.0-cp310-cp310-win_amd64.whl", hash = "sha256:48b389b1fd5144603d61d752afd7167dfd205973a43151ae5045b35793232aa2"}, - {file = "cffi-1.17.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:c5d97162c196ce54af6700949ddf9409e9833ef1003b4741c2b39ef46f1d9720"}, - {file = "cffi-1.17.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:5ba5c243f4004c750836f81606a9fcb7841f8874ad8f3bf204ff5e56332b72b9"}, - {file = "cffi-1.17.0-cp311-cp311-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:bb9333f58fc3a2296fb1d54576138d4cf5d496a2cc118422bd77835e6ae0b9cb"}, - {file = "cffi-1.17.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:435a22d00ec7d7ea533db494da8581b05977f9c37338c80bc86314bec2619424"}, - {file = "cffi-1.17.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d1df34588123fcc88c872f5acb6f74ae59e9d182a2707097f9e28275ec26a12d"}, - {file = "cffi-1.17.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:df8bb0010fdd0a743b7542589223a2816bdde4d94bb5ad67884348fa2c1c67e8"}, - {file = "cffi-1.17.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a8b5b9712783415695663bd463990e2f00c6750562e6ad1d28e072a611c5f2a6"}, - {file = "cffi-1.17.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:ffef8fd58a36fb5f1196919638f73dd3ae0db1a878982b27a9a5a176ede4ba91"}, - {file = "cffi-1.17.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:4e67d26532bfd8b7f7c05d5a766d6f437b362c1bf203a3a5ce3593a645e870b8"}, - {file = "cffi-1.17.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:45f7cd36186db767d803b1473b3c659d57a23b5fa491ad83c6d40f2af58e4dbb"}, - {file = "cffi-1.17.0-cp311-cp311-win32.whl", hash = "sha256:a9015f5b8af1bb6837a3fcb0cdf3b874fe3385ff6274e8b7925d81ccaec3c5c9"}, - {file = "cffi-1.17.0-cp311-cp311-win_amd64.whl", hash = "sha256:b50aaac7d05c2c26dfd50c3321199f019ba76bb650e346a6ef3616306eed67b0"}, - {file = "cffi-1.17.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:aec510255ce690d240f7cb23d7114f6b351c733a74c279a84def763660a2c3bc"}, - {file = "cffi-1.17.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:2770bb0d5e3cc0e31e7318db06efcbcdb7b31bcb1a70086d3177692a02256f59"}, - {file = "cffi-1.17.0-cp312-cp312-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:db9a30ec064129d605d0f1aedc93e00894b9334ec74ba9c6bdd08147434b33eb"}, - {file = "cffi-1.17.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a47eef975d2b8b721775a0fa286f50eab535b9d56c70a6e62842134cf7841195"}, - {file = "cffi-1.17.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f3e0992f23bbb0be00a921eae5363329253c3b86287db27092461c887b791e5e"}, - {file = "cffi-1.17.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:6107e445faf057c118d5050560695e46d272e5301feffda3c41849641222a828"}, - {file = "cffi-1.17.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:eb862356ee9391dc5a0b3cbc00f416b48c1b9a52d252d898e5b7696a5f9fe150"}, - {file = "cffi-1.17.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:c1c13185b90bbd3f8b5963cd8ce7ad4ff441924c31e23c975cb150e27c2bf67a"}, - {file = "cffi-1.17.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:17c6d6d3260c7f2d94f657e6872591fe8733872a86ed1345bda872cfc8c74885"}, - {file = "cffi-1.17.0-cp312-cp312-win32.whl", hash = "sha256:c3b8bd3133cd50f6b637bb4322822c94c5ce4bf0d724ed5ae70afce62187c492"}, - {file = "cffi-1.17.0-cp312-cp312-win_amd64.whl", hash = "sha256:dca802c8db0720ce1c49cce1149ff7b06e91ba15fa84b1d59144fef1a1bc7ac2"}, - {file = "cffi-1.17.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:6ce01337d23884b21c03869d2f68c5523d43174d4fc405490eb0091057943118"}, - {file = "cffi-1.17.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:cab2eba3830bf4f6d91e2d6718e0e1c14a2f5ad1af68a89d24ace0c6b17cced7"}, - {file = "cffi-1.17.0-cp313-cp313-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:14b9cbc8f7ac98a739558eb86fabc283d4d564dafed50216e7f7ee62d0d25377"}, - {file = "cffi-1.17.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b00e7bcd71caa0282cbe3c90966f738e2db91e64092a877c3ff7f19a1628fdcb"}, - {file = "cffi-1.17.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:41f4915e09218744d8bae14759f983e466ab69b178de38066f7579892ff2a555"}, - {file = "cffi-1.17.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e4760a68cab57bfaa628938e9c2971137e05ce48e762a9cb53b76c9b569f1204"}, - {file = "cffi-1.17.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:011aff3524d578a9412c8b3cfaa50f2c0bd78e03eb7af7aa5e0df59b158efb2f"}, - {file = "cffi-1.17.0-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:a003ac9edc22d99ae1286b0875c460351f4e101f8c9d9d2576e78d7e048f64e0"}, - {file = "cffi-1.17.0-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:ef9528915df81b8f4c7612b19b8628214c65c9b7f74db2e34a646a0a2a0da2d4"}, - {file = "cffi-1.17.0-cp313-cp313-win32.whl", hash = "sha256:70d2aa9fb00cf52034feac4b913181a6e10356019b18ef89bc7c12a283bf5f5a"}, - {file = "cffi-1.17.0-cp313-cp313-win_amd64.whl", hash = "sha256:b7b6ea9e36d32582cda3465f54c4b454f62f23cb083ebc7a94e2ca6ef011c3a7"}, - {file = "cffi-1.17.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:964823b2fc77b55355999ade496c54dde161c621cb1f6eac61dc30ed1b63cd4c"}, - {file = "cffi-1.17.0-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:516a405f174fd3b88829eabfe4bb296ac602d6a0f68e0d64d5ac9456194a5b7e"}, - {file = "cffi-1.17.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dec6b307ce928e8e112a6bb9921a1cb00a0e14979bf28b98e084a4b8a742bd9b"}, - {file = "cffi-1.17.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e4094c7b464cf0a858e75cd14b03509e84789abf7b79f8537e6a72152109c76e"}, - {file = "cffi-1.17.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2404f3de742f47cb62d023f0ba7c5a916c9c653d5b368cc966382ae4e57da401"}, - {file = "cffi-1.17.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3aa9d43b02a0c681f0bfbc12d476d47b2b2b6a3f9287f11ee42989a268a1833c"}, - {file = "cffi-1.17.0-cp38-cp38-win32.whl", hash = "sha256:0bb15e7acf8ab35ca8b24b90af52c8b391690ef5c4aec3d31f38f0d37d2cc499"}, - {file = "cffi-1.17.0-cp38-cp38-win_amd64.whl", hash = "sha256:93a7350f6706b31f457c1457d3a3259ff9071a66f312ae64dc024f049055f72c"}, - {file = "cffi-1.17.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:1a2ddbac59dc3716bc79f27906c010406155031a1c801410f1bafff17ea304d2"}, - {file = "cffi-1.17.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:6327b572f5770293fc062a7ec04160e89741e8552bf1c358d1a23eba68166759"}, - {file = "cffi-1.17.0-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:dbc183e7bef690c9abe5ea67b7b60fdbca81aa8da43468287dae7b5c046107d4"}, - {file = "cffi-1.17.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5bdc0f1f610d067c70aa3737ed06e2726fd9d6f7bfee4a351f4c40b6831f4e82"}, - {file = "cffi-1.17.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:6d872186c1617d143969defeadac5a904e6e374183e07977eedef9c07c8953bf"}, - {file = "cffi-1.17.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:0d46ee4764b88b91f16661a8befc6bfb24806d885e27436fdc292ed7e6f6d058"}, - {file = "cffi-1.17.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6f76a90c345796c01d85e6332e81cab6d70de83b829cf1d9762d0a3da59c7932"}, - {file = "cffi-1.17.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:0e60821d312f99d3e1569202518dddf10ae547e799d75aef3bca3a2d9e8ee693"}, - {file = "cffi-1.17.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:eb09b82377233b902d4c3fbeeb7ad731cdab579c6c6fda1f763cd779139e47c3"}, - {file = "cffi-1.17.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:24658baf6224d8f280e827f0a50c46ad819ec8ba380a42448e24459daf809cf4"}, - {file = "cffi-1.17.0-cp39-cp39-win32.whl", hash = "sha256:0fdacad9e0d9fc23e519efd5ea24a70348305e8d7d85ecbb1a5fa66dc834e7fb"}, - {file = "cffi-1.17.0-cp39-cp39-win_amd64.whl", hash = "sha256:7cbc78dc018596315d4e7841c8c3a7ae31cc4d638c9b627f87d52e8abaaf2d29"}, - {file = "cffi-1.17.0.tar.gz", hash = "sha256:f3157624b7558b914cb039fd1af735e5e8049a87c817cc215109ad1c8779df76"}, + {file = "cffi-1.17.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:df8b1c11f177bc2313ec4b2d46baec87a5f3e71fc8b45dab2ee7cae86d9aba14"}, + {file = "cffi-1.17.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:8f2cdc858323644ab277e9bb925ad72ae0e67f69e804f4898c070998d50b1a67"}, + {file = "cffi-1.17.1-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:edae79245293e15384b51f88b00613ba9f7198016a5948b5dddf4917d4d26382"}, + {file = "cffi-1.17.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:45398b671ac6d70e67da8e4224a065cec6a93541bb7aebe1b198a61b58c7b702"}, + {file = "cffi-1.17.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ad9413ccdeda48c5afdae7e4fa2192157e991ff761e7ab8fdd8926f40b160cc3"}, + {file = "cffi-1.17.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5da5719280082ac6bd9aa7becb3938dc9f9cbd57fac7d2871717b1feb0902ab6"}, + {file = "cffi-1.17.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2bb1a08b8008b281856e5971307cc386a8e9c5b625ac297e853d36da6efe9c17"}, + {file = "cffi-1.17.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:045d61c734659cc045141be4bae381a41d89b741f795af1dd018bfb532fd0df8"}, + {file = "cffi-1.17.1-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:6883e737d7d9e4899a8a695e00ec36bd4e5e4f18fabe0aca0efe0a4b44cdb13e"}, + {file = "cffi-1.17.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:6b8b4a92e1c65048ff98cfe1f735ef8f1ceb72e3d5f0c25fdb12087a23da22be"}, + {file = "cffi-1.17.1-cp310-cp310-win32.whl", hash = "sha256:c9c3d058ebabb74db66e431095118094d06abf53284d9c81f27300d0e0d8bc7c"}, + {file = "cffi-1.17.1-cp310-cp310-win_amd64.whl", hash = "sha256:0f048dcf80db46f0098ccac01132761580d28e28bc0f78ae0d58048063317e15"}, + {file = "cffi-1.17.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:a45e3c6913c5b87b3ff120dcdc03f6131fa0065027d0ed7ee6190736a74cd401"}, + {file = "cffi-1.17.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:30c5e0cb5ae493c04c8b42916e52ca38079f1b235c2f8ae5f4527b963c401caf"}, + {file = "cffi-1.17.1-cp311-cp311-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f75c7ab1f9e4aca5414ed4d8e5c0e303a34f4421f8a0d47a4d019ceff0ab6af4"}, + {file = "cffi-1.17.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a1ed2dd2972641495a3ec98445e09766f077aee98a1c896dcb4ad0d303628e41"}, + {file = "cffi-1.17.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:46bf43160c1a35f7ec506d254e5c890f3c03648a4dbac12d624e4490a7046cd1"}, + {file = "cffi-1.17.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a24ed04c8ffd54b0729c07cee15a81d964e6fee0e3d4d342a27b020d22959dc6"}, + {file = "cffi-1.17.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:610faea79c43e44c71e1ec53a554553fa22321b65fae24889706c0a84d4ad86d"}, + {file = "cffi-1.17.1-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:a9b15d491f3ad5d692e11f6b71f7857e7835eb677955c00cc0aefcd0669adaf6"}, + {file = "cffi-1.17.1-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:de2ea4b5833625383e464549fec1bc395c1bdeeb5f25c4a3a82b5a8c756ec22f"}, + {file = "cffi-1.17.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:fc48c783f9c87e60831201f2cce7f3b2e4846bf4d8728eabe54d60700b318a0b"}, + {file = "cffi-1.17.1-cp311-cp311-win32.whl", hash = "sha256:85a950a4ac9c359340d5963966e3e0a94a676bd6245a4b55bc43949eee26a655"}, + {file = "cffi-1.17.1-cp311-cp311-win_amd64.whl", hash = "sha256:caaf0640ef5f5517f49bc275eca1406b0ffa6aa184892812030f04c2abf589a0"}, + {file = "cffi-1.17.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:805b4371bf7197c329fcb3ead37e710d1bca9da5d583f5073b799d5c5bd1eee4"}, + {file = "cffi-1.17.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:733e99bc2df47476e3848417c5a4540522f234dfd4ef3ab7fafdf555b082ec0c"}, + {file = "cffi-1.17.1-cp312-cp312-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1257bdabf294dceb59f5e70c64a3e2f462c30c7ad68092d01bbbfb1c16b1ba36"}, + {file = "cffi-1.17.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:da95af8214998d77a98cc14e3a3bd00aa191526343078b530ceb0bd710fb48a5"}, + {file = "cffi-1.17.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d63afe322132c194cf832bfec0dc69a99fb9bb6bbd550f161a49e9e855cc78ff"}, + {file = "cffi-1.17.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f79fc4fc25f1c8698ff97788206bb3c2598949bfe0fef03d299eb1b5356ada99"}, + {file = "cffi-1.17.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b62ce867176a75d03a665bad002af8e6d54644fad99a3c70905c543130e39d93"}, + {file = "cffi-1.17.1-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:386c8bf53c502fff58903061338ce4f4950cbdcb23e2902d86c0f722b786bbe3"}, + {file = "cffi-1.17.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:4ceb10419a9adf4460ea14cfd6bc43d08701f0835e979bf821052f1805850fe8"}, + {file = "cffi-1.17.1-cp312-cp312-win32.whl", hash = "sha256:a08d7e755f8ed21095a310a693525137cfe756ce62d066e53f502a83dc550f65"}, + {file = "cffi-1.17.1-cp312-cp312-win_amd64.whl", hash = "sha256:51392eae71afec0d0c8fb1a53b204dbb3bcabcb3c9b807eedf3e1e6ccf2de903"}, + {file = "cffi-1.17.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:f3a2b4222ce6b60e2e8b337bb9596923045681d71e5a082783484d845390938e"}, + {file = "cffi-1.17.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:0984a4925a435b1da406122d4d7968dd861c1385afe3b45ba82b750f229811e2"}, + {file = "cffi-1.17.1-cp313-cp313-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d01b12eeeb4427d3110de311e1774046ad344f5b1a7403101878976ecd7a10f3"}, + {file = "cffi-1.17.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:706510fe141c86a69c8ddc029c7910003a17353970cff3b904ff0686a5927683"}, + {file = "cffi-1.17.1-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:de55b766c7aa2e2a3092c51e0483d700341182f08e67c63630d5b6f200bb28e5"}, + {file = "cffi-1.17.1-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c59d6e989d07460165cc5ad3c61f9fd8f1b4796eacbd81cee78957842b834af4"}, + {file = "cffi-1.17.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dd398dbc6773384a17fe0d3e7eeb8d1a21c2200473ee6806bb5e6a8e62bb73dd"}, + {file = "cffi-1.17.1-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:3edc8d958eb099c634dace3c7e16560ae474aa3803a5df240542b305d14e14ed"}, + {file = "cffi-1.17.1-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:72e72408cad3d5419375fc87d289076ee319835bdfa2caad331e377589aebba9"}, + {file = "cffi-1.17.1-cp313-cp313-win32.whl", hash = "sha256:e03eab0a8677fa80d646b5ddece1cbeaf556c313dcfac435ba11f107ba117b5d"}, + {file = "cffi-1.17.1-cp313-cp313-win_amd64.whl", hash = "sha256:f6a16c31041f09ead72d69f583767292f750d24913dadacf5756b966aacb3f1a"}, + {file = "cffi-1.17.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:636062ea65bd0195bc012fea9321aca499c0504409f413dc88af450b57ffd03b"}, + {file = "cffi-1.17.1-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c7eac2ef9b63c79431bc4b25f1cd649d7f061a28808cbc6c47b534bd789ef964"}, + {file = "cffi-1.17.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e221cf152cff04059d011ee126477f0d9588303eb57e88923578ace7baad17f9"}, + {file = "cffi-1.17.1-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:31000ec67d4221a71bd3f67df918b1f88f676f1c3b535a7eb473255fdc0b83fc"}, + {file = "cffi-1.17.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:6f17be4345073b0a7b8ea599688f692ac3ef23ce28e5df79c04de519dbc4912c"}, + {file = "cffi-1.17.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0e2b1fac190ae3ebfe37b979cc1ce69c81f4e4fe5746bb401dca63a9062cdaf1"}, + {file = "cffi-1.17.1-cp38-cp38-win32.whl", hash = "sha256:7596d6620d3fa590f677e9ee430df2958d2d6d6de2feeae5b20e82c00b76fbf8"}, + {file = "cffi-1.17.1-cp38-cp38-win_amd64.whl", hash = "sha256:78122be759c3f8a014ce010908ae03364d00a1f81ab5c7f4a7a5120607ea56e1"}, + {file = "cffi-1.17.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:b2ab587605f4ba0bf81dc0cb08a41bd1c0a5906bd59243d56bad7668a6fc6c16"}, + {file = "cffi-1.17.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:28b16024becceed8c6dfbc75629e27788d8a3f9030691a1dbf9821a128b22c36"}, + {file = "cffi-1.17.1-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1d599671f396c4723d016dbddb72fe8e0397082b0a77a4fab8028923bec050e8"}, + {file = "cffi-1.17.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ca74b8dbe6e8e8263c0ffd60277de77dcee6c837a3d0881d8c1ead7268c9e576"}, + {file = "cffi-1.17.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f7f5baafcc48261359e14bcd6d9bff6d4b28d9103847c9e136694cb0501aef87"}, + {file = "cffi-1.17.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:98e3969bcff97cae1b2def8ba499ea3d6f31ddfdb7635374834cf89a1a08ecf0"}, + {file = "cffi-1.17.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cdf5ce3acdfd1661132f2a9c19cac174758dc2352bfe37d98aa7512c6b7178b3"}, + {file = "cffi-1.17.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:9755e4345d1ec879e3849e62222a18c7174d65a6a92d5b346b1863912168b595"}, + {file = "cffi-1.17.1-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:f1e22e8c4419538cb197e4dd60acc919d7696e5ef98ee4da4e01d3f8cfa4cc5a"}, + {file = "cffi-1.17.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:c03e868a0b3bc35839ba98e74211ed2b05d2119be4e8a0f224fba9384f1fe02e"}, + {file = "cffi-1.17.1-cp39-cp39-win32.whl", hash = "sha256:e31ae45bc2e29f6b2abd0de1cc3b9d5205aa847cafaecb8af1476a609a2f6eb7"}, + {file = "cffi-1.17.1-cp39-cp39-win_amd64.whl", hash = "sha256:d016c76bdd850f3c626af19b0542c9677ba156e4ee4fccfdd7848803533ef662"}, + {file = "cffi-1.17.1.tar.gz", hash = "sha256:1c39c6016c32bc48dd54561950ebd6836e1670f2ae46128f67cf49e789c52824"}, ] [package.dependencies] @@ -297,101 +317,116 @@ pycparser = "*" [[package]] name = "charset-normalizer" -version = "3.3.2" +version = "3.4.0" description = "The Real First Universal Charset Detector. Open, modern and actively maintained alternative to Chardet." optional = false python-versions = ">=3.7.0" files = [ - {file = "charset-normalizer-3.3.2.tar.gz", hash = "sha256:f30c3cb33b24454a82faecaf01b19c18562b1e89558fb6c56de4d9118a032fd5"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:25baf083bf6f6b341f4121c2f3c548875ee6f5339300e08be3f2b2ba1721cdd3"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:06435b539f889b1f6f4ac1758871aae42dc3a8c0e24ac9e60c2384973ad73027"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:9063e24fdb1e498ab71cb7419e24622516c4a04476b17a2dab57e8baa30d6e03"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6897af51655e3691ff853668779c7bad41579facacf5fd7253b0133308cf000d"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1d3193f4a680c64b4b6a9115943538edb896edc190f0b222e73761716519268e"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:cd70574b12bb8a4d2aaa0094515df2463cb429d8536cfb6c7ce983246983e5a6"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8465322196c8b4d7ab6d1e049e4c5cb460d0394da4a27d23cc242fbf0034b6b5"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a9a8e9031d613fd2009c182b69c7b2c1ef8239a0efb1df3f7c8da66d5dd3d537"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:beb58fe5cdb101e3a055192ac291b7a21e3b7ef4f67fa1d74e331a7f2124341c"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:e06ed3eb3218bc64786f7db41917d4e686cc4856944f53d5bdf83a6884432e12"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:2e81c7b9c8979ce92ed306c249d46894776a909505d8f5a4ba55b14206e3222f"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:572c3763a264ba47b3cf708a44ce965d98555f618ca42c926a9c1616d8f34269"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:fd1abc0d89e30cc4e02e4064dc67fcc51bd941eb395c502aac3ec19fab46b519"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-win32.whl", hash = "sha256:3d47fa203a7bd9c5b6cee4736ee84ca03b8ef23193c0d1ca99b5089f72645c73"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-win_amd64.whl", hash = "sha256:10955842570876604d404661fbccbc9c7e684caf432c09c715ec38fbae45ae09"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:802fe99cca7457642125a8a88a084cef28ff0cf9407060f7b93dca5aa25480db"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:573f6eac48f4769d667c4442081b1794f52919e7edada77495aaed9236d13a96"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:549a3a73da901d5bc3ce8d24e0600d1fa85524c10287f6004fbab87672bf3e1e"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f27273b60488abe721a075bcca6d7f3964f9f6f067c8c4c605743023d7d3944f"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1ceae2f17a9c33cb48e3263960dc5fc8005351ee19db217e9b1bb15d28c02574"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:65f6f63034100ead094b8744b3b97965785388f308a64cf8d7c34f2f2e5be0c4"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:753f10e867343b4511128c6ed8c82f7bec3bd026875576dfd88483c5c73b2fd8"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4a78b2b446bd7c934f5dcedc588903fb2f5eec172f3d29e52a9096a43722adfc"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:e537484df0d8f426ce2afb2d0f8e1c3d0b114b83f8850e5f2fbea0e797bd82ae"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:eb6904c354526e758fda7167b33005998fb68c46fbc10e013ca97f21ca5c8887"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:deb6be0ac38ece9ba87dea880e438f25ca3eddfac8b002a2ec3d9183a454e8ae"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:4ab2fe47fae9e0f9dee8c04187ce5d09f48eabe611be8259444906793ab7cbce"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:80402cd6ee291dcb72644d6eac93785fe2c8b9cb30893c1af5b8fdd753b9d40f"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-win32.whl", hash = "sha256:7cd13a2e3ddeed6913a65e66e94b51d80a041145a026c27e6bb76c31a853c6ab"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-win_amd64.whl", hash = "sha256:663946639d296df6a2bb2aa51b60a2454ca1cb29835324c640dafb5ff2131a77"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:0b2b64d2bb6d3fb9112bafa732def486049e63de9618b5843bcdd081d8144cd8"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:ddbb2551d7e0102e7252db79ba445cdab71b26640817ab1e3e3648dad515003b"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:55086ee1064215781fff39a1af09518bc9255b50d6333f2e4c74ca09fac6a8f6"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8f4a014bc36d3c57402e2977dada34f9c12300af536839dc38c0beab8878f38a"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a10af20b82360ab00827f916a6058451b723b4e65030c5a18577c8b2de5b3389"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8d756e44e94489e49571086ef83b2bb8ce311e730092d2c34ca8f7d925cb20aa"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:90d558489962fd4918143277a773316e56c72da56ec7aa3dc3dbbe20fdfed15b"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6ac7ffc7ad6d040517be39eb591cac5ff87416c2537df6ba3cba3bae290c0fed"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:7ed9e526742851e8d5cc9e6cf41427dfc6068d4f5a3bb03659444b4cabf6bc26"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:8bdb58ff7ba23002a4c5808d608e4e6c687175724f54a5dade5fa8c67b604e4d"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_ppc64le.whl", hash = "sha256:6b3251890fff30ee142c44144871185dbe13b11bab478a88887a639655be1068"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_s390x.whl", hash = "sha256:b4a23f61ce87adf89be746c8a8974fe1c823c891d8f86eb218bb957c924bb143"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:efcb3f6676480691518c177e3b465bcddf57cea040302f9f4e6e191af91174d4"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-win32.whl", hash = "sha256:d965bba47ddeec8cd560687584e88cf699fd28f192ceb452d1d7ee807c5597b7"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-win_amd64.whl", hash = "sha256:96b02a3dc4381e5494fad39be677abcb5e6634bf7b4fa83a6dd3112607547001"}, - {file = "charset_normalizer-3.3.2-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:95f2a5796329323b8f0512e09dbb7a1860c46a39da62ecb2324f116fa8fdc85c"}, - {file = "charset_normalizer-3.3.2-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c002b4ffc0be611f0d9da932eb0f704fe2602a9a949d1f738e4c34c75b0863d5"}, - {file = "charset_normalizer-3.3.2-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a981a536974bbc7a512cf44ed14938cf01030a99e9b3a06dd59578882f06f985"}, - {file = "charset_normalizer-3.3.2-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3287761bc4ee9e33561a7e058c72ac0938c4f57fe49a09eae428fd88aafe7bb6"}, - {file = "charset_normalizer-3.3.2-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:42cb296636fcc8b0644486d15c12376cb9fa75443e00fb25de0b8602e64c1714"}, - {file = "charset_normalizer-3.3.2-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0a55554a2fa0d408816b3b5cedf0045f4b8e1a6065aec45849de2d6f3f8e9786"}, - {file = "charset_normalizer-3.3.2-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:c083af607d2515612056a31f0a8d9e0fcb5876b7bfc0abad3ecd275bc4ebc2d5"}, - {file = "charset_normalizer-3.3.2-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:87d1351268731db79e0f8e745d92493ee2841c974128ef629dc518b937d9194c"}, - {file = "charset_normalizer-3.3.2-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:bd8f7df7d12c2db9fab40bdd87a7c09b1530128315d047a086fa3ae3435cb3a8"}, - {file = "charset_normalizer-3.3.2-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:c180f51afb394e165eafe4ac2936a14bee3eb10debc9d9e4db8958fe36afe711"}, - {file = "charset_normalizer-3.3.2-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:8c622a5fe39a48f78944a87d4fb8a53ee07344641b0562c540d840748571b811"}, - {file = "charset_normalizer-3.3.2-cp37-cp37m-win32.whl", hash = "sha256:db364eca23f876da6f9e16c9da0df51aa4f104a972735574842618b8c6d999d4"}, - {file = "charset_normalizer-3.3.2-cp37-cp37m-win_amd64.whl", hash = "sha256:86216b5cee4b06df986d214f664305142d9c76df9b6512be2738aa72a2048f99"}, - {file = "charset_normalizer-3.3.2-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:6463effa3186ea09411d50efc7d85360b38d5f09b870c48e4600f63af490e56a"}, - {file = "charset_normalizer-3.3.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:6c4caeef8fa63d06bd437cd4bdcf3ffefe6738fb1b25951440d80dc7df8c03ac"}, - {file = "charset_normalizer-3.3.2-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:37e55c8e51c236f95b033f6fb391d7d7970ba5fe7ff453dad675e88cf303377a"}, - {file = "charset_normalizer-3.3.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fb69256e180cb6c8a894fee62b3afebae785babc1ee98b81cdf68bbca1987f33"}, - {file = "charset_normalizer-3.3.2-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ae5f4161f18c61806f411a13b0310bea87f987c7d2ecdbdaad0e94eb2e404238"}, - {file = "charset_normalizer-3.3.2-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b2b0a0c0517616b6869869f8c581d4eb2dd83a4d79e0ebcb7d373ef9956aeb0a"}, - {file = "charset_normalizer-3.3.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:45485e01ff4d3630ec0d9617310448a8702f70e9c01906b0d0118bdf9d124cf2"}, - {file = "charset_normalizer-3.3.2-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:eb00ed941194665c332bf8e078baf037d6c35d7c4f3102ea2d4f16ca94a26dc8"}, - {file = "charset_normalizer-3.3.2-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:2127566c664442652f024c837091890cb1942c30937add288223dc895793f898"}, - {file = "charset_normalizer-3.3.2-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:a50aebfa173e157099939b17f18600f72f84eed3049e743b68ad15bd69b6bf99"}, - {file = "charset_normalizer-3.3.2-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:4d0d1650369165a14e14e1e47b372cfcb31d6ab44e6e33cb2d4e57265290044d"}, - {file = "charset_normalizer-3.3.2-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:923c0c831b7cfcb071580d3f46c4baf50f174be571576556269530f4bbd79d04"}, - {file = "charset_normalizer-3.3.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:06a81e93cd441c56a9b65d8e1d043daeb97a3d0856d177d5c90ba85acb3db087"}, - {file = "charset_normalizer-3.3.2-cp38-cp38-win32.whl", hash = "sha256:6ef1d82a3af9d3eecdba2321dc1b3c238245d890843e040e41e470ffa64c3e25"}, - {file = "charset_normalizer-3.3.2-cp38-cp38-win_amd64.whl", hash = "sha256:eb8821e09e916165e160797a6c17edda0679379a4be5c716c260e836e122f54b"}, - {file = "charset_normalizer-3.3.2-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:c235ebd9baae02f1b77bcea61bce332cb4331dc3617d254df3323aa01ab47bd4"}, - {file = "charset_normalizer-3.3.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:5b4c145409bef602a690e7cfad0a15a55c13320ff7a3ad7ca59c13bb8ba4d45d"}, - {file = "charset_normalizer-3.3.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:68d1f8a9e9e37c1223b656399be5d6b448dea850bed7d0f87a8311f1ff3dabb0"}, - {file = "charset_normalizer-3.3.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:22afcb9f253dac0696b5a4be4a1c0f8762f8239e21b99680099abd9b2b1b2269"}, - {file = "charset_normalizer-3.3.2-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e27ad930a842b4c5eb8ac0016b0a54f5aebbe679340c26101df33424142c143c"}, - {file = "charset_normalizer-3.3.2-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1f79682fbe303db92bc2b1136016a38a42e835d932bab5b3b1bfcfbf0640e519"}, - {file = "charset_normalizer-3.3.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b261ccdec7821281dade748d088bb6e9b69e6d15b30652b74cbbac25e280b796"}, - {file = "charset_normalizer-3.3.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:122c7fa62b130ed55f8f285bfd56d5f4b4a5b503609d181f9ad85e55c89f4185"}, - {file = "charset_normalizer-3.3.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:d0eccceffcb53201b5bfebb52600a5fb483a20b61da9dbc885f8b103cbe7598c"}, - {file = "charset_normalizer-3.3.2-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:9f96df6923e21816da7e0ad3fd47dd8f94b2a5ce594e00677c0013018b813458"}, - {file = "charset_normalizer-3.3.2-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:7f04c839ed0b6b98b1a7501a002144b76c18fb1c1850c8b98d458ac269e26ed2"}, - {file = "charset_normalizer-3.3.2-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:34d1c8da1e78d2e001f363791c98a272bb734000fcef47a491c1e3b0505657a8"}, - {file = "charset_normalizer-3.3.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:ff8fa367d09b717b2a17a052544193ad76cd49979c805768879cb63d9ca50561"}, - {file = "charset_normalizer-3.3.2-cp39-cp39-win32.whl", hash = "sha256:aed38f6e4fb3f5d6bf81bfa990a07806be9d83cf7bacef998ab1a9bd660a581f"}, - {file = "charset_normalizer-3.3.2-cp39-cp39-win_amd64.whl", hash = "sha256:b01b88d45a6fcb69667cd6d2f7a9aeb4bf53760d7fc536bf679ec94fe9f3ff3d"}, - {file = "charset_normalizer-3.3.2-py3-none-any.whl", hash = "sha256:3e4d1f6587322d2788836a99c69062fbb091331ec940e02d12d179c1d53e25fc"}, + {file = "charset_normalizer-3.4.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:4f9fc98dad6c2eaa32fc3af1417d95b5e3d08aff968df0cd320066def971f9a6"}, + {file = "charset_normalizer-3.4.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:0de7b687289d3c1b3e8660d0741874abe7888100efe14bd0f9fd7141bcbda92b"}, + {file = "charset_normalizer-3.4.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:5ed2e36c3e9b4f21dd9422f6893dec0abf2cca553af509b10cd630f878d3eb99"}, + {file = "charset_normalizer-3.4.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:40d3ff7fc90b98c637bda91c89d51264a3dcf210cade3a2c6f838c7268d7a4ca"}, + {file = "charset_normalizer-3.4.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1110e22af8ca26b90bd6364fe4c763329b0ebf1ee213ba32b68c73de5752323d"}, + {file = "charset_normalizer-3.4.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:86f4e8cca779080f66ff4f191a685ced73d2f72d50216f7112185dc02b90b9b7"}, + {file = "charset_normalizer-3.4.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7f683ddc7eedd742e2889d2bfb96d69573fde1d92fcb811979cdb7165bb9c7d3"}, + {file = "charset_normalizer-3.4.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:27623ba66c183eca01bf9ff833875b459cad267aeeb044477fedac35e19ba907"}, + {file = "charset_normalizer-3.4.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:f606a1881d2663630ea5b8ce2efe2111740df4b687bd78b34a8131baa007f79b"}, + {file = "charset_normalizer-3.4.0-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:0b309d1747110feb25d7ed6b01afdec269c647d382c857ef4663bbe6ad95a912"}, + {file = "charset_normalizer-3.4.0-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:136815f06a3ae311fae551c3df1f998a1ebd01ddd424aa5603a4336997629e95"}, + {file = "charset_normalizer-3.4.0-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:14215b71a762336254351b00ec720a8e85cada43b987da5a042e4ce3e82bd68e"}, + {file = "charset_normalizer-3.4.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:79983512b108e4a164b9c8d34de3992f76d48cadc9554c9e60b43f308988aabe"}, + {file = "charset_normalizer-3.4.0-cp310-cp310-win32.whl", hash = "sha256:c94057af19bc953643a33581844649a7fdab902624d2eb739738a30e2b3e60fc"}, + {file = "charset_normalizer-3.4.0-cp310-cp310-win_amd64.whl", hash = "sha256:55f56e2ebd4e3bc50442fbc0888c9d8c94e4e06a933804e2af3e89e2f9c1c749"}, + {file = "charset_normalizer-3.4.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:0d99dd8ff461990f12d6e42c7347fd9ab2532fb70e9621ba520f9e8637161d7c"}, + {file = "charset_normalizer-3.4.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:c57516e58fd17d03ebe67e181a4e4e2ccab1168f8c2976c6a334d4f819fe5944"}, + {file = "charset_normalizer-3.4.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:6dba5d19c4dfab08e58d5b36304b3f92f3bd5d42c1a3fa37b5ba5cdf6dfcbcee"}, + {file = "charset_normalizer-3.4.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bf4475b82be41b07cc5e5ff94810e6a01f276e37c2d55571e3fe175e467a1a1c"}, + {file = "charset_normalizer-3.4.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ce031db0408e487fd2775d745ce30a7cd2923667cf3b69d48d219f1d8f5ddeb6"}, + {file = "charset_normalizer-3.4.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8ff4e7cdfdb1ab5698e675ca622e72d58a6fa2a8aa58195de0c0061288e6e3ea"}, + {file = "charset_normalizer-3.4.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3710a9751938947e6327ea9f3ea6332a09bf0ba0c09cae9cb1f250bd1f1549bc"}, + {file = "charset_normalizer-3.4.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:82357d85de703176b5587dbe6ade8ff67f9f69a41c0733cf2425378b49954de5"}, + {file = "charset_normalizer-3.4.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:47334db71978b23ebcf3c0f9f5ee98b8d65992b65c9c4f2d34c2eaf5bcaf0594"}, + {file = "charset_normalizer-3.4.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:8ce7fd6767a1cc5a92a639b391891bf1c268b03ec7e021c7d6d902285259685c"}, + {file = "charset_normalizer-3.4.0-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:f1a2f519ae173b5b6a2c9d5fa3116ce16e48b3462c8b96dfdded11055e3d6365"}, + {file = "charset_normalizer-3.4.0-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:63bc5c4ae26e4bc6be6469943b8253c0fd4e4186c43ad46e713ea61a0ba49129"}, + {file = "charset_normalizer-3.4.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:bcb4f8ea87d03bc51ad04add8ceaf9b0f085ac045ab4d74e73bbc2dc033f0236"}, + {file = "charset_normalizer-3.4.0-cp311-cp311-win32.whl", hash = "sha256:9ae4ef0b3f6b41bad6366fb0ea4fc1d7ed051528e113a60fa2a65a9abb5b1d99"}, + {file = "charset_normalizer-3.4.0-cp311-cp311-win_amd64.whl", hash = "sha256:cee4373f4d3ad28f1ab6290684d8e2ebdb9e7a1b74fdc39e4c211995f77bec27"}, + {file = "charset_normalizer-3.4.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:0713f3adb9d03d49d365b70b84775d0a0d18e4ab08d12bc46baa6132ba78aaf6"}, + {file = "charset_normalizer-3.4.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:de7376c29d95d6719048c194a9cf1a1b0393fbe8488a22008610b0361d834ecf"}, + {file = "charset_normalizer-3.4.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:4a51b48f42d9358460b78725283f04bddaf44a9358197b889657deba38f329db"}, + {file = "charset_normalizer-3.4.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b295729485b06c1a0683af02a9e42d2caa9db04a373dc38a6a58cdd1e8abddf1"}, + {file = "charset_normalizer-3.4.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ee803480535c44e7f5ad00788526da7d85525cfefaf8acf8ab9a310000be4b03"}, + {file = "charset_normalizer-3.4.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3d59d125ffbd6d552765510e3f31ed75ebac2c7470c7274195b9161a32350284"}, + {file = "charset_normalizer-3.4.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8cda06946eac330cbe6598f77bb54e690b4ca93f593dee1568ad22b04f347c15"}, + {file = "charset_normalizer-3.4.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:07afec21bbbbf8a5cc3651aa96b980afe2526e7f048fdfb7f1014d84acc8b6d8"}, + {file = "charset_normalizer-3.4.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:6b40e8d38afe634559e398cc32b1472f376a4099c75fe6299ae607e404c033b2"}, + {file = "charset_normalizer-3.4.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:b8dcd239c743aa2f9c22ce674a145e0a25cb1566c495928440a181ca1ccf6719"}, + {file = "charset_normalizer-3.4.0-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:84450ba661fb96e9fd67629b93d2941c871ca86fc38d835d19d4225ff946a631"}, + {file = "charset_normalizer-3.4.0-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:44aeb140295a2f0659e113b31cfe92c9061622cadbc9e2a2f7b8ef6b1e29ef4b"}, + {file = "charset_normalizer-3.4.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:1db4e7fefefd0f548d73e2e2e041f9df5c59e178b4c72fbac4cc6f535cfb1565"}, + {file = "charset_normalizer-3.4.0-cp312-cp312-win32.whl", hash = "sha256:5726cf76c982532c1863fb64d8c6dd0e4c90b6ece9feb06c9f202417a31f7dd7"}, + {file = "charset_normalizer-3.4.0-cp312-cp312-win_amd64.whl", hash = "sha256:b197e7094f232959f8f20541ead1d9862ac5ebea1d58e9849c1bf979255dfac9"}, + {file = "charset_normalizer-3.4.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:dd4eda173a9fcccb5f2e2bd2a9f423d180194b1bf17cf59e3269899235b2a114"}, + {file = "charset_normalizer-3.4.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:e9e3c4c9e1ed40ea53acf11e2a386383c3304212c965773704e4603d589343ed"}, + {file = "charset_normalizer-3.4.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:92a7e36b000bf022ef3dbb9c46bfe2d52c047d5e3f3343f43204263c5addc250"}, + {file = "charset_normalizer-3.4.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:54b6a92d009cbe2fb11054ba694bc9e284dad30a26757b1e372a1fdddaf21920"}, + {file = "charset_normalizer-3.4.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1ffd9493de4c922f2a38c2bf62b831dcec90ac673ed1ca182fe11b4d8e9f2a64"}, + {file = "charset_normalizer-3.4.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:35c404d74c2926d0287fbd63ed5d27eb911eb9e4a3bb2c6d294f3cfd4a9e0c23"}, + {file = "charset_normalizer-3.4.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4796efc4faf6b53a18e3d46343535caed491776a22af773f366534056c4e1fbc"}, + {file = "charset_normalizer-3.4.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e7fdd52961feb4c96507aa649550ec2a0d527c086d284749b2f582f2d40a2e0d"}, + {file = "charset_normalizer-3.4.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:92db3c28b5b2a273346bebb24857fda45601aef6ae1c011c0a997106581e8a88"}, + {file = "charset_normalizer-3.4.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:ab973df98fc99ab39080bfb0eb3a925181454d7c3ac8a1e695fddfae696d9e90"}, + {file = "charset_normalizer-3.4.0-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:4b67fdab07fdd3c10bb21edab3cbfe8cf5696f453afce75d815d9d7223fbe88b"}, + {file = "charset_normalizer-3.4.0-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:aa41e526a5d4a9dfcfbab0716c7e8a1b215abd3f3df5a45cf18a12721d31cb5d"}, + {file = "charset_normalizer-3.4.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:ffc519621dce0c767e96b9c53f09c5d215578e10b02c285809f76509a3931482"}, + {file = "charset_normalizer-3.4.0-cp313-cp313-win32.whl", hash = "sha256:f19c1585933c82098c2a520f8ec1227f20e339e33aca8fa6f956f6691b784e67"}, + {file = "charset_normalizer-3.4.0-cp313-cp313-win_amd64.whl", hash = "sha256:707b82d19e65c9bd28b81dde95249b07bf9f5b90ebe1ef17d9b57473f8a64b7b"}, + {file = "charset_normalizer-3.4.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:dbe03226baf438ac4fda9e2d0715022fd579cb641c4cf639fa40d53b2fe6f3e2"}, + {file = "charset_normalizer-3.4.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dd9a8bd8900e65504a305bf8ae6fa9fbc66de94178c420791d0293702fce2df7"}, + {file = "charset_normalizer-3.4.0-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b8831399554b92b72af5932cdbbd4ddc55c55f631bb13ff8fe4e6536a06c5c51"}, + {file = "charset_normalizer-3.4.0-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a14969b8691f7998e74663b77b4c36c0337cb1df552da83d5c9004a93afdb574"}, + {file = "charset_normalizer-3.4.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dcaf7c1524c0542ee2fc82cc8ec337f7a9f7edee2532421ab200d2b920fc97cf"}, + {file = "charset_normalizer-3.4.0-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:425c5f215d0eecee9a56cdb703203dda90423247421bf0d67125add85d0c4455"}, + {file = "charset_normalizer-3.4.0-cp37-cp37m-musllinux_1_2_aarch64.whl", hash = "sha256:d5b054862739d276e09928de37c79ddeec42a6e1bfc55863be96a36ba22926f6"}, + {file = "charset_normalizer-3.4.0-cp37-cp37m-musllinux_1_2_i686.whl", hash = "sha256:f3e73a4255342d4eb26ef6df01e3962e73aa29baa3124a8e824c5d3364a65748"}, + {file = "charset_normalizer-3.4.0-cp37-cp37m-musllinux_1_2_ppc64le.whl", hash = "sha256:2f6c34da58ea9c1a9515621f4d9ac379871a8f21168ba1b5e09d74250de5ad62"}, + {file = "charset_normalizer-3.4.0-cp37-cp37m-musllinux_1_2_s390x.whl", hash = "sha256:f09cb5a7bbe1ecae6e87901a2eb23e0256bb524a79ccc53eb0b7629fbe7677c4"}, + {file = "charset_normalizer-3.4.0-cp37-cp37m-musllinux_1_2_x86_64.whl", hash = "sha256:0099d79bdfcf5c1f0c2c72f91516702ebf8b0b8ddd8905f97a8aecf49712c621"}, + {file = "charset_normalizer-3.4.0-cp37-cp37m-win32.whl", hash = "sha256:9c98230f5042f4945f957d006edccc2af1e03ed5e37ce7c373f00a5a4daa6149"}, + {file = "charset_normalizer-3.4.0-cp37-cp37m-win_amd64.whl", hash = "sha256:62f60aebecfc7f4b82e3f639a7d1433a20ec32824db2199a11ad4f5e146ef5ee"}, + {file = "charset_normalizer-3.4.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:af73657b7a68211996527dbfeffbb0864e043d270580c5aef06dc4b659a4b578"}, + {file = "charset_normalizer-3.4.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:cab5d0b79d987c67f3b9e9c53f54a61360422a5a0bc075f43cab5621d530c3b6"}, + {file = "charset_normalizer-3.4.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:9289fd5dddcf57bab41d044f1756550f9e7cf0c8e373b8cdf0ce8773dc4bd417"}, + {file = "charset_normalizer-3.4.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6b493a043635eb376e50eedf7818f2f322eabbaa974e948bd8bdd29eb7ef2a51"}, + {file = "charset_normalizer-3.4.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9fa2566ca27d67c86569e8c85297aaf413ffab85a8960500f12ea34ff98e4c41"}, + {file = "charset_normalizer-3.4.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a8e538f46104c815be19c975572d74afb53f29650ea2025bbfaef359d2de2f7f"}, + {file = "charset_normalizer-3.4.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6fd30dc99682dc2c603c2b315bded2799019cea829f8bf57dc6b61efde6611c8"}, + {file = "charset_normalizer-3.4.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2006769bd1640bdf4d5641c69a3d63b71b81445473cac5ded39740a226fa88ab"}, + {file = "charset_normalizer-3.4.0-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:dc15e99b2d8a656f8e666854404f1ba54765871104e50c8e9813af8a7db07f12"}, + {file = "charset_normalizer-3.4.0-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:ab2e5bef076f5a235c3774b4f4028a680432cded7cad37bba0fd90d64b187d19"}, + {file = "charset_normalizer-3.4.0-cp38-cp38-musllinux_1_2_ppc64le.whl", hash = "sha256:4ec9dd88a5b71abfc74e9df5ebe7921c35cbb3b641181a531ca65cdb5e8e4dea"}, + {file = "charset_normalizer-3.4.0-cp38-cp38-musllinux_1_2_s390x.whl", hash = "sha256:43193c5cda5d612f247172016c4bb71251c784d7a4d9314677186a838ad34858"}, + {file = "charset_normalizer-3.4.0-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:aa693779a8b50cd97570e5a0f343538a8dbd3e496fa5dcb87e29406ad0299654"}, + {file = "charset_normalizer-3.4.0-cp38-cp38-win32.whl", hash = "sha256:7706f5850360ac01d80c89bcef1640683cc12ed87f42579dab6c5d3ed6888613"}, + {file = "charset_normalizer-3.4.0-cp38-cp38-win_amd64.whl", hash = "sha256:c3e446d253bd88f6377260d07c895816ebf33ffffd56c1c792b13bff9c3e1ade"}, + {file = "charset_normalizer-3.4.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:980b4f289d1d90ca5efcf07958d3eb38ed9c0b7676bf2831a54d4f66f9c27dfa"}, + {file = "charset_normalizer-3.4.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:f28f891ccd15c514a0981f3b9db9aa23d62fe1a99997512b0491d2ed323d229a"}, + {file = "charset_normalizer-3.4.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:a8aacce6e2e1edcb6ac625fb0f8c3a9570ccc7bfba1f63419b3769ccf6a00ed0"}, + {file = "charset_normalizer-3.4.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bd7af3717683bea4c87acd8c0d3d5b44d56120b26fd3f8a692bdd2d5260c620a"}, + {file = "charset_normalizer-3.4.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5ff2ed8194587faf56555927b3aa10e6fb69d931e33953943bc4f837dfee2242"}, + {file = "charset_normalizer-3.4.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e91f541a85298cf35433bf66f3fab2a4a2cff05c127eeca4af174f6d497f0d4b"}, + {file = "charset_normalizer-3.4.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:309a7de0a0ff3040acaebb35ec45d18db4b28232f21998851cfa709eeff49d62"}, + {file = "charset_normalizer-3.4.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:285e96d9d53422efc0d7a17c60e59f37fbf3dfa942073f666db4ac71e8d726d0"}, + {file = "charset_normalizer-3.4.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:5d447056e2ca60382d460a604b6302d8db69476fd2015c81e7c35417cfabe4cd"}, + {file = "charset_normalizer-3.4.0-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:20587d20f557fe189b7947d8e7ec5afa110ccf72a3128d61a2a387c3313f46be"}, + {file = "charset_normalizer-3.4.0-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:130272c698667a982a5d0e626851ceff662565379baf0ff2cc58067b81d4f11d"}, + {file = "charset_normalizer-3.4.0-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:ab22fbd9765e6954bc0bcff24c25ff71dcbfdb185fcdaca49e81bac68fe724d3"}, + {file = "charset_normalizer-3.4.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:7782afc9b6b42200f7362858f9e73b1f8316afb276d316336c0ec3bd73312742"}, + {file = "charset_normalizer-3.4.0-cp39-cp39-win32.whl", hash = "sha256:2de62e8801ddfff069cd5c504ce3bc9672b23266597d4e4f50eda28846c322f2"}, + {file = "charset_normalizer-3.4.0-cp39-cp39-win_amd64.whl", hash = "sha256:95c3c157765b031331dd4db3c775e58deaee050a3042fcad72cbc4189d7c8dca"}, + {file = "charset_normalizer-3.4.0-py3-none-any.whl", hash = "sha256:fe9f97feb71aa9896b81973a7bbada8c49501dc73e58a10fcef6663af95e5079"}, + {file = "charset_normalizer-3.4.0.tar.gz", hash = "sha256:223217c3d4f82c3ac5e29032b3f1c2eb0fb591b72161f86d93f5719079dae93e"}, ] [[package]] @@ -440,38 +475,38 @@ files = [ [[package]] name = "cryptography" -version = "43.0.1" +version = "43.0.3" description = "cryptography is a package which provides cryptographic recipes and primitives to Python developers." optional = false python-versions = ">=3.7" files = [ - {file = "cryptography-43.0.1-cp37-abi3-macosx_10_9_universal2.whl", hash = "sha256:8385d98f6a3bf8bb2d65a73e17ed87a3ba84f6991c155691c51112075f9ffc5d"}, - {file = "cryptography-43.0.1-cp37-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:27e613d7077ac613e399270253259d9d53872aaf657471473ebfc9a52935c062"}, - {file = "cryptography-43.0.1-cp37-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:68aaecc4178e90719e95298515979814bda0cbada1256a4485414860bd7ab962"}, - {file = "cryptography-43.0.1-cp37-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:de41fd81a41e53267cb020bb3a7212861da53a7d39f863585d13ea11049cf277"}, - {file = "cryptography-43.0.1-cp37-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:f98bf604c82c416bc829e490c700ca1553eafdf2912a91e23a79d97d9801372a"}, - {file = "cryptography-43.0.1-cp37-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:61ec41068b7b74268fa86e3e9e12b9f0c21fcf65434571dbb13d954bceb08042"}, - {file = "cryptography-43.0.1-cp37-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:014f58110f53237ace6a408b5beb6c427b64e084eb451ef25a28308270086494"}, - {file = "cryptography-43.0.1-cp37-abi3-win32.whl", hash = "sha256:2bd51274dcd59f09dd952afb696bf9c61a7a49dfc764c04dd33ef7a6b502a1e2"}, - {file = "cryptography-43.0.1-cp37-abi3-win_amd64.whl", hash = "sha256:666ae11966643886c2987b3b721899d250855718d6d9ce41b521252a17985f4d"}, - {file = "cryptography-43.0.1-cp39-abi3-macosx_10_9_universal2.whl", hash = "sha256:ac119bb76b9faa00f48128b7f5679e1d8d437365c5d26f1c2c3f0da4ce1b553d"}, - {file = "cryptography-43.0.1-cp39-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1bbcce1a551e262dfbafb6e6252f1ae36a248e615ca44ba302df077a846a8806"}, - {file = "cryptography-43.0.1-cp39-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:58d4e9129985185a06d849aa6df265bdd5a74ca6e1b736a77959b498e0505b85"}, - {file = "cryptography-43.0.1-cp39-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:d03a475165f3134f773d1388aeb19c2d25ba88b6a9733c5c590b9ff7bbfa2e0c"}, - {file = "cryptography-43.0.1-cp39-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:511f4273808ab590912a93ddb4e3914dfd8a388fed883361b02dea3791f292e1"}, - {file = "cryptography-43.0.1-cp39-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:80eda8b3e173f0f247f711eef62be51b599b5d425c429b5d4ca6a05e9e856baa"}, - {file = "cryptography-43.0.1-cp39-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:38926c50cff6f533f8a2dae3d7f19541432610d114a70808f0926d5aaa7121e4"}, - {file = "cryptography-43.0.1-cp39-abi3-win32.whl", hash = "sha256:a575913fb06e05e6b4b814d7f7468c2c660e8bb16d8d5a1faf9b33ccc569dd47"}, - {file = "cryptography-43.0.1-cp39-abi3-win_amd64.whl", hash = "sha256:d75601ad10b059ec832e78823b348bfa1a59f6b8d545db3a24fd44362a1564cb"}, - {file = "cryptography-43.0.1-pp310-pypy310_pp73-macosx_10_9_x86_64.whl", hash = "sha256:ea25acb556320250756e53f9e20a4177515f012c9eaea17eb7587a8c4d8ae034"}, - {file = "cryptography-43.0.1-pp310-pypy310_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:c1332724be35d23a854994ff0b66530119500b6053d0bd3363265f7e5e77288d"}, - {file = "cryptography-43.0.1-pp310-pypy310_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:fba1007b3ef89946dbbb515aeeb41e30203b004f0b4b00e5e16078b518563289"}, - {file = "cryptography-43.0.1-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:5b43d1ea6b378b54a1dc99dd8a2b5be47658fe9a7ce0a58ff0b55f4b43ef2b84"}, - {file = "cryptography-43.0.1-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:88cce104c36870d70c49c7c8fd22885875d950d9ee6ab54df2745f83ba0dc365"}, - {file = "cryptography-43.0.1-pp39-pypy39_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:9d3cdb25fa98afdd3d0892d132b8d7139e2c087da1712041f6b762e4f807cc96"}, - {file = "cryptography-43.0.1-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:e710bf40870f4db63c3d7d929aa9e09e4e7ee219e703f949ec4073b4294f6172"}, - {file = "cryptography-43.0.1-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:7c05650fe8023c5ed0d46793d4b7d7e6cd9c04e68eabe5b0aeea836e37bdcec2"}, - {file = "cryptography-43.0.1.tar.gz", hash = "sha256:203e92a75716d8cfb491dc47c79e17d0d9207ccffcbcb35f598fbe463ae3444d"}, + {file = "cryptography-43.0.3-cp37-abi3-macosx_10_9_universal2.whl", hash = "sha256:bf7a1932ac4176486eab36a19ed4c0492da5d97123f1406cf15e41b05e787d2e"}, + {file = "cryptography-43.0.3-cp37-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:63efa177ff54aec6e1c0aefaa1a241232dcd37413835a9b674b6e3f0ae2bfd3e"}, + {file = "cryptography-43.0.3-cp37-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7e1ce50266f4f70bf41a2c6dc4358afadae90e2a1e5342d3c08883df1675374f"}, + {file = "cryptography-43.0.3-cp37-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:443c4a81bb10daed9a8f334365fe52542771f25aedaf889fd323a853ce7377d6"}, + {file = "cryptography-43.0.3-cp37-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:74f57f24754fe349223792466a709f8e0c093205ff0dca557af51072ff47ab18"}, + {file = "cryptography-43.0.3-cp37-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:9762ea51a8fc2a88b70cf2995e5675b38d93bf36bd67d91721c309df184f49bd"}, + {file = "cryptography-43.0.3-cp37-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:81ef806b1fef6b06dcebad789f988d3b37ccaee225695cf3e07648eee0fc6b73"}, + {file = "cryptography-43.0.3-cp37-abi3-win32.whl", hash = "sha256:cbeb489927bd7af4aa98d4b261af9a5bc025bd87f0e3547e11584be9e9427be2"}, + {file = "cryptography-43.0.3-cp37-abi3-win_amd64.whl", hash = "sha256:f46304d6f0c6ab8e52770addfa2fc41e6629495548862279641972b6215451cd"}, + {file = "cryptography-43.0.3-cp39-abi3-macosx_10_9_universal2.whl", hash = "sha256:8ac43ae87929a5982f5948ceda07001ee5e83227fd69cf55b109144938d96984"}, + {file = "cryptography-43.0.3-cp39-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:846da004a5804145a5f441b8530b4bf35afbf7da70f82409f151695b127213d5"}, + {file = "cryptography-43.0.3-cp39-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0f996e7268af62598f2fc1204afa98a3b5712313a55c4c9d434aef49cadc91d4"}, + {file = "cryptography-43.0.3-cp39-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:f7b178f11ed3664fd0e995a47ed2b5ff0a12d893e41dd0494f406d1cf555cab7"}, + {file = "cryptography-43.0.3-cp39-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:c2e6fc39c4ab499049df3bdf567f768a723a5e8464816e8f009f121a5a9f4405"}, + {file = "cryptography-43.0.3-cp39-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:e1be4655c7ef6e1bbe6b5d0403526601323420bcf414598955968c9ef3eb7d16"}, + {file = "cryptography-43.0.3-cp39-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:df6b6c6d742395dd77a23ea3728ab62f98379eff8fb61be2744d4679ab678f73"}, + {file = "cryptography-43.0.3-cp39-abi3-win32.whl", hash = "sha256:d56e96520b1020449bbace2b78b603442e7e378a9b3bd68de65c782db1507995"}, + {file = "cryptography-43.0.3-cp39-abi3-win_amd64.whl", hash = "sha256:0c580952eef9bf68c4747774cde7ec1d85a6e61de97281f2dba83c7d2c806362"}, + {file = "cryptography-43.0.3-pp310-pypy310_pp73-macosx_10_9_x86_64.whl", hash = "sha256:d03b5621a135bffecad2c73e9f4deb1a0f977b9a8ffe6f8e002bf6c9d07b918c"}, + {file = "cryptography-43.0.3-pp310-pypy310_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:a2a431ee15799d6db9fe80c82b055bae5a752bef645bba795e8e52687c69efe3"}, + {file = "cryptography-43.0.3-pp310-pypy310_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:281c945d0e28c92ca5e5930664c1cefd85efe80e5c0d2bc58dd63383fda29f83"}, + {file = "cryptography-43.0.3-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:f18c716be16bc1fea8e95def49edf46b82fccaa88587a45f8dc0ff6ab5d8e0a7"}, + {file = "cryptography-43.0.3-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:4a02ded6cd4f0a5562a8887df8b3bd14e822a90f97ac5e544c162899bc467664"}, + {file = "cryptography-43.0.3-pp39-pypy39_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:53a583b6637ab4c4e3591a15bc9db855b8d9dee9a669b550f311480acab6eb08"}, + {file = "cryptography-43.0.3-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:1ec0bcf7e17c0c5669d881b1cd38c4972fade441b27bda1051665faaa89bdcaa"}, + {file = "cryptography-43.0.3-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:2ce6fae5bdad59577b44e4dfed356944fbf1d925269114c28be377692643b4ff"}, + {file = "cryptography-43.0.3.tar.gz", hash = "sha256:315b9001266a492a6ff443b61238f956b214dbec9910a081ba5b6646a055a805"}, ] [package.dependencies] @@ -484,7 +519,7 @@ nox = ["nox"] pep8test = ["check-sdist", "click", "mypy", "ruff"] sdist = ["build"] ssh = ["bcrypt (>=3.1.5)"] -test = ["certifi", "cryptography-vectors (==43.0.1)", "pretend", "pytest (>=6.2.0)", "pytest-benchmark", "pytest-cov", "pytest-xdist"] +test = ["certifi", "cryptography-vectors (==43.0.3)", "pretend", "pytest (>=6.2.0)", "pytest-benchmark", "pytest-cov", "pytest-xdist"] test-randomorder = ["pytest-randomly"] [[package]] @@ -517,21 +552,21 @@ dev = ["PyTest", "PyTest-Cov", "bump2version (<1)", "sphinx (<2)", "tox"] [[package]] name = "dnspython" -version = "2.6.1" +version = "2.7.0" description = "DNS toolkit" optional = false -python-versions = ">=3.8" +python-versions = ">=3.9" files = [ - {file = "dnspython-2.6.1-py3-none-any.whl", hash = "sha256:5ef3b9680161f6fa89daf8ad451b5f1a33b18ae8a1c6778cdf4b43f08c0a6e50"}, - {file = "dnspython-2.6.1.tar.gz", hash = "sha256:e8f0f9c23a7b7cb99ded64e6c3a6f3e701d78f50c55e002b839dea7225cff7cc"}, + {file = "dnspython-2.7.0-py3-none-any.whl", hash = "sha256:b4c34b7d10b51bcc3a5071e7b8dee77939f1e878477eeecc965e9835f63c6c86"}, + {file = "dnspython-2.7.0.tar.gz", hash = "sha256:ce9c432eda0dc91cf618a5cedf1a4e142651196bbcd2c80e89ed5a907e5cfaf1"}, ] [package.extras] -dev = ["black (>=23.1.0)", "coverage (>=7.0)", "flake8 (>=7)", "mypy (>=1.8)", "pylint (>=3)", "pytest (>=7.4)", "pytest-cov (>=4.1.0)", "sphinx (>=7.2.0)", "twine (>=4.0.0)", "wheel (>=0.42.0)"] -dnssec = ["cryptography (>=41)"] +dev = ["black (>=23.1.0)", "coverage (>=7.0)", "flake8 (>=7)", "hypercorn (>=0.16.0)", "mypy (>=1.8)", "pylint (>=3)", "pytest (>=7.4)", "pytest-cov (>=4.1.0)", "quart-trio (>=0.11.0)", "sphinx (>=7.2.0)", "sphinx-rtd-theme (>=2.0.0)", "twine (>=4.0.0)", "wheel (>=0.42.0)"] +dnssec = ["cryptography (>=43)"] doh = ["h2 (>=4.1.0)", "httpcore (>=1.0.0)", "httpx (>=0.26.0)"] -doq = ["aioquic (>=0.9.25)"] -idna = ["idna (>=3.6)"] +doq = ["aioquic (>=1.0.0)"] +idna = ["idna (>=3.7)"] trio = ["trio (>=0.23)"] wmi = ["wmi (>=1.5.1)"] @@ -591,88 +626,103 @@ boltons = ">=20.0.0" [[package]] name = "frozenlist" -version = "1.4.1" +version = "1.5.0" description = "A list-like structure which implements collections.abc.MutableSequence" optional = false python-versions = ">=3.8" files = [ - {file = "frozenlist-1.4.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:f9aa1878d1083b276b0196f2dfbe00c9b7e752475ed3b682025ff20c1c1f51ac"}, - {file = "frozenlist-1.4.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:29acab3f66f0f24674b7dc4736477bcd4bc3ad4b896f5f45379a67bce8b96868"}, - {file = "frozenlist-1.4.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:74fb4bee6880b529a0c6560885fce4dc95936920f9f20f53d99a213f7bf66776"}, - {file = "frozenlist-1.4.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:590344787a90ae57d62511dd7c736ed56b428f04cd8c161fcc5e7232c130c69a"}, - {file = "frozenlist-1.4.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:068b63f23b17df8569b7fdca5517edef76171cf3897eb68beb01341131fbd2ad"}, - {file = "frozenlist-1.4.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5c849d495bf5154cd8da18a9eb15db127d4dba2968d88831aff6f0331ea9bd4c"}, - {file = "frozenlist-1.4.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9750cc7fe1ae3b1611bb8cfc3f9ec11d532244235d75901fb6b8e42ce9229dfe"}, - {file = "frozenlist-1.4.1-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a9b2de4cf0cdd5bd2dee4c4f63a653c61d2408055ab77b151c1957f221cabf2a"}, - {file = "frozenlist-1.4.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:0633c8d5337cb5c77acbccc6357ac49a1770b8c487e5b3505c57b949b4b82e98"}, - {file = "frozenlist-1.4.1-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:27657df69e8801be6c3638054e202a135c7f299267f1a55ed3a598934f6c0d75"}, - {file = "frozenlist-1.4.1-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:f9a3ea26252bd92f570600098783d1371354d89d5f6b7dfd87359d669f2109b5"}, - {file = "frozenlist-1.4.1-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:4f57dab5fe3407b6c0c1cc907ac98e8a189f9e418f3b6e54d65a718aaafe3950"}, - {file = "frozenlist-1.4.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:e02a0e11cf6597299b9f3bbd3f93d79217cb90cfd1411aec33848b13f5c656cc"}, - {file = "frozenlist-1.4.1-cp310-cp310-win32.whl", hash = "sha256:a828c57f00f729620a442881cc60e57cfcec6842ba38e1b19fd3e47ac0ff8dc1"}, - {file = "frozenlist-1.4.1-cp310-cp310-win_amd64.whl", hash = "sha256:f56e2333dda1fe0f909e7cc59f021eba0d2307bc6f012a1ccf2beca6ba362439"}, - {file = "frozenlist-1.4.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:a0cb6f11204443f27a1628b0e460f37fb30f624be6051d490fa7d7e26d4af3d0"}, - {file = "frozenlist-1.4.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:b46c8ae3a8f1f41a0d2ef350c0b6e65822d80772fe46b653ab6b6274f61d4a49"}, - {file = "frozenlist-1.4.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:fde5bd59ab5357e3853313127f4d3565fc7dad314a74d7b5d43c22c6a5ed2ced"}, - {file = "frozenlist-1.4.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:722e1124aec435320ae01ee3ac7bec11a5d47f25d0ed6328f2273d287bc3abb0"}, - {file = "frozenlist-1.4.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2471c201b70d58a0f0c1f91261542a03d9a5e088ed3dc6c160d614c01649c106"}, - {file = "frozenlist-1.4.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c757a9dd70d72b076d6f68efdbb9bc943665ae954dad2801b874c8c69e185068"}, - {file = "frozenlist-1.4.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f146e0911cb2f1da549fc58fc7bcd2b836a44b79ef871980d605ec392ff6b0d2"}, - {file = "frozenlist-1.4.1-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4f9c515e7914626b2a2e1e311794b4c35720a0be87af52b79ff8e1429fc25f19"}, - {file = "frozenlist-1.4.1-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:c302220494f5c1ebeb0912ea782bcd5e2f8308037b3c7553fad0e48ebad6ad82"}, - {file = "frozenlist-1.4.1-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:442acde1e068288a4ba7acfe05f5f343e19fac87bfc96d89eb886b0363e977ec"}, - {file = "frozenlist-1.4.1-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:1b280e6507ea8a4fa0c0a7150b4e526a8d113989e28eaaef946cc77ffd7efc0a"}, - {file = "frozenlist-1.4.1-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:fe1a06da377e3a1062ae5fe0926e12b84eceb8a50b350ddca72dc85015873f74"}, - {file = "frozenlist-1.4.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:db9e724bebd621d9beca794f2a4ff1d26eed5965b004a97f1f1685a173b869c2"}, - {file = "frozenlist-1.4.1-cp311-cp311-win32.whl", hash = "sha256:e774d53b1a477a67838a904131c4b0eef6b3d8a651f8b138b04f748fccfefe17"}, - {file = "frozenlist-1.4.1-cp311-cp311-win_amd64.whl", hash = "sha256:fb3c2db03683b5767dedb5769b8a40ebb47d6f7f45b1b3e3b4b51ec8ad9d9825"}, - {file = "frozenlist-1.4.1-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:1979bc0aeb89b33b588c51c54ab0161791149f2461ea7c7c946d95d5f93b56ae"}, - {file = "frozenlist-1.4.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:cc7b01b3754ea68a62bd77ce6020afaffb44a590c2289089289363472d13aedb"}, - {file = "frozenlist-1.4.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:c9c92be9fd329ac801cc420e08452b70e7aeab94ea4233a4804f0915c14eba9b"}, - {file = "frozenlist-1.4.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5c3894db91f5a489fc8fa6a9991820f368f0b3cbdb9cd8849547ccfab3392d86"}, - {file = "frozenlist-1.4.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ba60bb19387e13597fb059f32cd4d59445d7b18b69a745b8f8e5db0346f33480"}, - {file = "frozenlist-1.4.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8aefbba5f69d42246543407ed2461db31006b0f76c4e32dfd6f42215a2c41d09"}, - {file = "frozenlist-1.4.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:780d3a35680ced9ce682fbcf4cb9c2bad3136eeff760ab33707b71db84664e3a"}, - {file = "frozenlist-1.4.1-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9acbb16f06fe7f52f441bb6f413ebae6c37baa6ef9edd49cdd567216da8600cd"}, - {file = "frozenlist-1.4.1-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:23b701e65c7b36e4bf15546a89279bd4d8675faabc287d06bbcfac7d3c33e1e6"}, - {file = "frozenlist-1.4.1-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:3e0153a805a98f5ada7e09826255ba99fb4f7524bb81bf6b47fb702666484ae1"}, - {file = "frozenlist-1.4.1-cp312-cp312-musllinux_1_1_ppc64le.whl", hash = "sha256:dd9b1baec094d91bf36ec729445f7769d0d0cf6b64d04d86e45baf89e2b9059b"}, - {file = "frozenlist-1.4.1-cp312-cp312-musllinux_1_1_s390x.whl", hash = "sha256:1a4471094e146b6790f61b98616ab8e44f72661879cc63fa1049d13ef711e71e"}, - {file = "frozenlist-1.4.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:5667ed53d68d91920defdf4035d1cdaa3c3121dc0b113255124bcfada1cfa1b8"}, - {file = "frozenlist-1.4.1-cp312-cp312-win32.whl", hash = "sha256:beee944ae828747fd7cb216a70f120767fc9f4f00bacae8543c14a6831673f89"}, - {file = "frozenlist-1.4.1-cp312-cp312-win_amd64.whl", hash = "sha256:64536573d0a2cb6e625cf309984e2d873979709f2cf22839bf2d61790b448ad5"}, - {file = "frozenlist-1.4.1-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:20b51fa3f588ff2fe658663db52a41a4f7aa6c04f6201449c6c7c476bd255c0d"}, - {file = "frozenlist-1.4.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:410478a0c562d1a5bcc2f7ea448359fcb050ed48b3c6f6f4f18c313a9bdb1826"}, - {file = "frozenlist-1.4.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:c6321c9efe29975232da3bd0af0ad216800a47e93d763ce64f291917a381b8eb"}, - {file = "frozenlist-1.4.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:48f6a4533887e189dae092f1cf981f2e3885175f7a0f33c91fb5b7b682b6bab6"}, - {file = "frozenlist-1.4.1-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:6eb73fa5426ea69ee0e012fb59cdc76a15b1283d6e32e4f8dc4482ec67d1194d"}, - {file = "frozenlist-1.4.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:fbeb989b5cc29e8daf7f976b421c220f1b8c731cbf22b9130d8815418ea45887"}, - {file = "frozenlist-1.4.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:32453c1de775c889eb4e22f1197fe3bdfe457d16476ea407472b9442e6295f7a"}, - {file = "frozenlist-1.4.1-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:693945278a31f2086d9bf3df0fe8254bbeaef1fe71e1351c3bd730aa7d31c41b"}, - {file = "frozenlist-1.4.1-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:1d0ce09d36d53bbbe566fe296965b23b961764c0bcf3ce2fa45f463745c04701"}, - {file = "frozenlist-1.4.1-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:3a670dc61eb0d0eb7080890c13de3066790f9049b47b0de04007090807c776b0"}, - {file = "frozenlist-1.4.1-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:dca69045298ce5c11fd539682cff879cc1e664c245d1c64da929813e54241d11"}, - {file = "frozenlist-1.4.1-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:a06339f38e9ed3a64e4c4e43aec7f59084033647f908e4259d279a52d3757d09"}, - {file = "frozenlist-1.4.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:b7f2f9f912dca3934c1baec2e4585a674ef16fe00218d833856408c48d5beee7"}, - {file = "frozenlist-1.4.1-cp38-cp38-win32.whl", hash = "sha256:e7004be74cbb7d9f34553a5ce5fb08be14fb33bc86f332fb71cbe5216362a497"}, - {file = "frozenlist-1.4.1-cp38-cp38-win_amd64.whl", hash = "sha256:5a7d70357e7cee13f470c7883a063aae5fe209a493c57d86eb7f5a6f910fae09"}, - {file = "frozenlist-1.4.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:bfa4a17e17ce9abf47a74ae02f32d014c5e9404b6d9ac7f729e01562bbee601e"}, - {file = "frozenlist-1.4.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:b7e3ed87d4138356775346e6845cccbe66cd9e207f3cd11d2f0b9fd13681359d"}, - {file = "frozenlist-1.4.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:c99169d4ff810155ca50b4da3b075cbde79752443117d89429595c2e8e37fed8"}, - {file = "frozenlist-1.4.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:edb678da49d9f72c9f6c609fbe41a5dfb9a9282f9e6a2253d5a91e0fc382d7c0"}, - {file = "frozenlist-1.4.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:6db4667b187a6742b33afbbaf05a7bc551ffcf1ced0000a571aedbb4aa42fc7b"}, - {file = "frozenlist-1.4.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:55fdc093b5a3cb41d420884cdaf37a1e74c3c37a31f46e66286d9145d2063bd0"}, - {file = "frozenlist-1.4.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:82e8211d69a4f4bc360ea22cd6555f8e61a1bd211d1d5d39d3d228b48c83a897"}, - {file = "frozenlist-1.4.1-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:89aa2c2eeb20957be2d950b85974b30a01a762f3308cd02bb15e1ad632e22dc7"}, - {file = "frozenlist-1.4.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:9d3e0c25a2350080e9319724dede4f31f43a6c9779be48021a7f4ebde8b2d742"}, - {file = "frozenlist-1.4.1-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:7268252af60904bf52c26173cbadc3a071cece75f873705419c8681f24d3edea"}, - {file = "frozenlist-1.4.1-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:0c250a29735d4f15321007fb02865f0e6b6a41a6b88f1f523ca1596ab5f50bd5"}, - {file = "frozenlist-1.4.1-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:96ec70beabbd3b10e8bfe52616a13561e58fe84c0101dd031dc78f250d5128b9"}, - {file = "frozenlist-1.4.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:23b2d7679b73fe0e5a4560b672a39f98dfc6f60df63823b0a9970525325b95f6"}, - {file = "frozenlist-1.4.1-cp39-cp39-win32.whl", hash = "sha256:a7496bfe1da7fb1a4e1cc23bb67c58fab69311cc7d32b5a99c2007b4b2a0e932"}, - {file = "frozenlist-1.4.1-cp39-cp39-win_amd64.whl", hash = "sha256:e6a20a581f9ce92d389a8c7d7c3dd47c81fd5d6e655c8dddf341e14aa48659d0"}, - {file = "frozenlist-1.4.1-py3-none-any.whl", hash = "sha256:04ced3e6a46b4cfffe20f9ae482818e34eba9b5fb0ce4056e4cc9b6e212d09b7"}, - {file = "frozenlist-1.4.1.tar.gz", hash = "sha256:c037a86e8513059a2613aaba4d817bb90b9d9b6b69aace3ce9c877e8c8ed402b"}, + {file = "frozenlist-1.5.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:5b6a66c18b5b9dd261ca98dffcb826a525334b2f29e7caa54e182255c5f6a65a"}, + {file = "frozenlist-1.5.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:d1b3eb7b05ea246510b43a7e53ed1653e55c2121019a97e60cad7efb881a97bb"}, + {file = "frozenlist-1.5.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:15538c0cbf0e4fa11d1e3a71f823524b0c46299aed6e10ebb4c2089abd8c3bec"}, + {file = "frozenlist-1.5.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e79225373c317ff1e35f210dd5f1344ff31066ba8067c307ab60254cd3a78ad5"}, + {file = "frozenlist-1.5.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9272fa73ca71266702c4c3e2d4a28553ea03418e591e377a03b8e3659d94fa76"}, + {file = "frozenlist-1.5.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:498524025a5b8ba81695761d78c8dd7382ac0b052f34e66939c42df860b8ff17"}, + {file = "frozenlist-1.5.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:92b5278ed9d50fe610185ecd23c55d8b307d75ca18e94c0e7de328089ac5dcba"}, + {file = "frozenlist-1.5.0-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7f3c8c1dacd037df16e85227bac13cca58c30da836c6f936ba1df0c05d046d8d"}, + {file = "frozenlist-1.5.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:f2ac49a9bedb996086057b75bf93538240538c6d9b38e57c82d51f75a73409d2"}, + {file = "frozenlist-1.5.0-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:e66cc454f97053b79c2ab09c17fbe3c825ea6b4de20baf1be28919460dd7877f"}, + {file = "frozenlist-1.5.0-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:5a3ba5f9a0dfed20337d3e966dc359784c9f96503674c2faf015f7fe8e96798c"}, + {file = "frozenlist-1.5.0-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:6321899477db90bdeb9299ac3627a6a53c7399c8cd58d25da094007402b039ab"}, + {file = "frozenlist-1.5.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:76e4753701248476e6286f2ef492af900ea67d9706a0155335a40ea21bf3b2f5"}, + {file = "frozenlist-1.5.0-cp310-cp310-win32.whl", hash = "sha256:977701c081c0241d0955c9586ffdd9ce44f7a7795df39b9151cd9a6fd0ce4cfb"}, + {file = "frozenlist-1.5.0-cp310-cp310-win_amd64.whl", hash = "sha256:189f03b53e64144f90990d29a27ec4f7997d91ed3d01b51fa39d2dbe77540fd4"}, + {file = "frozenlist-1.5.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:fd74520371c3c4175142d02a976aee0b4cb4a7cc912a60586ffd8d5929979b30"}, + {file = "frozenlist-1.5.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:2f3f7a0fbc219fb4455264cae4d9f01ad41ae6ee8524500f381de64ffaa077d5"}, + {file = "frozenlist-1.5.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:f47c9c9028f55a04ac254346e92977bf0f166c483c74b4232bee19a6697e4778"}, + {file = "frozenlist-1.5.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0996c66760924da6e88922756d99b47512a71cfd45215f3570bf1e0b694c206a"}, + {file = "frozenlist-1.5.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a2fe128eb4edeabe11896cb6af88fca5346059f6c8d807e3b910069f39157869"}, + {file = "frozenlist-1.5.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1a8ea951bbb6cacd492e3948b8da8c502a3f814f5d20935aae74b5df2b19cf3d"}, + {file = "frozenlist-1.5.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:de537c11e4aa01d37db0d403b57bd6f0546e71a82347a97c6a9f0dcc532b3a45"}, + {file = "frozenlist-1.5.0-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9c2623347b933fcb9095841f1cc5d4ff0b278addd743e0e966cb3d460278840d"}, + {file = "frozenlist-1.5.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:cee6798eaf8b1416ef6909b06f7dc04b60755206bddc599f52232606e18179d3"}, + {file = "frozenlist-1.5.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:f5f9da7f5dbc00a604fe74aa02ae7c98bcede8a3b8b9666f9f86fc13993bc71a"}, + {file = "frozenlist-1.5.0-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:90646abbc7a5d5c7c19461d2e3eeb76eb0b204919e6ece342feb6032c9325ae9"}, + {file = "frozenlist-1.5.0-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:bdac3c7d9b705d253b2ce370fde941836a5f8b3c5c2b8fd70940a3ea3af7f4f2"}, + {file = "frozenlist-1.5.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:03d33c2ddbc1816237a67f66336616416e2bbb6beb306e5f890f2eb22b959cdf"}, + {file = "frozenlist-1.5.0-cp311-cp311-win32.whl", hash = "sha256:237f6b23ee0f44066219dae14c70ae38a63f0440ce6750f868ee08775073f942"}, + {file = "frozenlist-1.5.0-cp311-cp311-win_amd64.whl", hash = "sha256:0cc974cc93d32c42e7b0f6cf242a6bd941c57c61b618e78b6c0a96cb72788c1d"}, + {file = "frozenlist-1.5.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:31115ba75889723431aa9a4e77d5f398f5cf976eea3bdf61749731f62d4a4a21"}, + {file = "frozenlist-1.5.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:7437601c4d89d070eac8323f121fcf25f88674627505334654fd027b091db09d"}, + {file = "frozenlist-1.5.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:7948140d9f8ece1745be806f2bfdf390127cf1a763b925c4a805c603df5e697e"}, + {file = "frozenlist-1.5.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:feeb64bc9bcc6b45c6311c9e9b99406660a9c05ca8a5b30d14a78555088b0b3a"}, + {file = "frozenlist-1.5.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:683173d371daad49cffb8309779e886e59c2f369430ad28fe715f66d08d4ab1a"}, + {file = "frozenlist-1.5.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7d57d8f702221405a9d9b40f9da8ac2e4a1a8b5285aac6100f3393675f0a85ee"}, + {file = "frozenlist-1.5.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:30c72000fbcc35b129cb09956836c7d7abf78ab5416595e4857d1cae8d6251a6"}, + {file = "frozenlist-1.5.0-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:000a77d6034fbad9b6bb880f7ec073027908f1b40254b5d6f26210d2dab1240e"}, + {file = "frozenlist-1.5.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:5d7f5a50342475962eb18b740f3beecc685a15b52c91f7d975257e13e029eca9"}, + {file = "frozenlist-1.5.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:87f724d055eb4785d9be84e9ebf0f24e392ddfad00b3fe036e43f489fafc9039"}, + {file = "frozenlist-1.5.0-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:6e9080bb2fb195a046e5177f10d9d82b8a204c0736a97a153c2466127de87784"}, + {file = "frozenlist-1.5.0-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:9b93d7aaa36c966fa42efcaf716e6b3900438632a626fb09c049f6a2f09fc631"}, + {file = "frozenlist-1.5.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:52ef692a4bc60a6dd57f507429636c2af8b6046db8b31b18dac02cbc8f507f7f"}, + {file = "frozenlist-1.5.0-cp312-cp312-win32.whl", hash = "sha256:29d94c256679247b33a3dc96cce0f93cbc69c23bf75ff715919332fdbb6a32b8"}, + {file = "frozenlist-1.5.0-cp312-cp312-win_amd64.whl", hash = "sha256:8969190d709e7c48ea386db202d708eb94bdb29207a1f269bab1196ce0dcca1f"}, + {file = "frozenlist-1.5.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:7a1a048f9215c90973402e26c01d1cff8a209e1f1b53f72b95c13db61b00f953"}, + {file = "frozenlist-1.5.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:dd47a5181ce5fcb463b5d9e17ecfdb02b678cca31280639255ce9d0e5aa67af0"}, + {file = "frozenlist-1.5.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:1431d60b36d15cda188ea222033eec8e0eab488f39a272461f2e6d9e1a8e63c2"}, + {file = "frozenlist-1.5.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6482a5851f5d72767fbd0e507e80737f9c8646ae7fd303def99bfe813f76cf7f"}, + {file = "frozenlist-1.5.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:44c49271a937625619e862baacbd037a7ef86dd1ee215afc298a417ff3270608"}, + {file = "frozenlist-1.5.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:12f78f98c2f1c2429d42e6a485f433722b0061d5c0b0139efa64f396efb5886b"}, + {file = "frozenlist-1.5.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ce3aa154c452d2467487765e3adc730a8c153af77ad84096bc19ce19a2400840"}, + {file = "frozenlist-1.5.0-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9b7dc0c4338e6b8b091e8faf0db3168a37101943e687f373dce00959583f7439"}, + {file = "frozenlist-1.5.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:45e0896250900b5aa25180f9aec243e84e92ac84bd4a74d9ad4138ef3f5c97de"}, + {file = "frozenlist-1.5.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:561eb1c9579d495fddb6da8959fd2a1fca2c6d060d4113f5844b433fc02f2641"}, + {file = "frozenlist-1.5.0-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:df6e2f325bfee1f49f81aaac97d2aa757c7646534a06f8f577ce184afe2f0a9e"}, + {file = "frozenlist-1.5.0-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:140228863501b44b809fb39ec56b5d4071f4d0aa6d216c19cbb08b8c5a7eadb9"}, + {file = "frozenlist-1.5.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:7707a25d6a77f5d27ea7dc7d1fc608aa0a478193823f88511ef5e6b8a48f9d03"}, + {file = "frozenlist-1.5.0-cp313-cp313-win32.whl", hash = "sha256:31a9ac2b38ab9b5a8933b693db4939764ad3f299fcaa931a3e605bc3460e693c"}, + {file = "frozenlist-1.5.0-cp313-cp313-win_amd64.whl", hash = "sha256:11aabdd62b8b9c4b84081a3c246506d1cddd2dd93ff0ad53ede5defec7886b28"}, + {file = "frozenlist-1.5.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:dd94994fc91a6177bfaafd7d9fd951bc8689b0a98168aa26b5f543868548d3ca"}, + {file = "frozenlist-1.5.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:2d0da8bbec082bf6bf18345b180958775363588678f64998c2b7609e34719b10"}, + {file = "frozenlist-1.5.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:73f2e31ea8dd7df61a359b731716018c2be196e5bb3b74ddba107f694fbd7604"}, + {file = "frozenlist-1.5.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:828afae9f17e6de596825cf4228ff28fbdf6065974e5ac1410cecc22f699d2b3"}, + {file = "frozenlist-1.5.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f1577515d35ed5649d52ab4319db757bb881ce3b2b796d7283e6634d99ace307"}, + {file = "frozenlist-1.5.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2150cc6305a2c2ab33299453e2968611dacb970d2283a14955923062c8d00b10"}, + {file = "frozenlist-1.5.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a72b7a6e3cd2725eff67cd64c8f13335ee18fc3c7befc05aed043d24c7b9ccb9"}, + {file = "frozenlist-1.5.0-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c16d2fa63e0800723139137d667e1056bee1a1cf7965153d2d104b62855e9b99"}, + {file = "frozenlist-1.5.0-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:17dcc32fc7bda7ce5875435003220a457bcfa34ab7924a49a1c19f55b6ee185c"}, + {file = "frozenlist-1.5.0-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:97160e245ea33d8609cd2b8fd997c850b56db147a304a262abc2b3be021a9171"}, + {file = "frozenlist-1.5.0-cp38-cp38-musllinux_1_2_ppc64le.whl", hash = "sha256:f1e6540b7fa044eee0bb5111ada694cf3dc15f2b0347ca125ee9ca984d5e9e6e"}, + {file = "frozenlist-1.5.0-cp38-cp38-musllinux_1_2_s390x.whl", hash = "sha256:91d6c171862df0a6c61479d9724f22efb6109111017c87567cfeb7b5d1449fdf"}, + {file = "frozenlist-1.5.0-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:c1fac3e2ace2eb1052e9f7c7db480818371134410e1f5c55d65e8f3ac6d1407e"}, + {file = "frozenlist-1.5.0-cp38-cp38-win32.whl", hash = "sha256:b97f7b575ab4a8af9b7bc1d2ef7f29d3afee2226bd03ca3875c16451ad5a7723"}, + {file = "frozenlist-1.5.0-cp38-cp38-win_amd64.whl", hash = "sha256:374ca2dabdccad8e2a76d40b1d037f5bd16824933bf7bcea3e59c891fd4a0923"}, + {file = "frozenlist-1.5.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:9bbcdfaf4af7ce002694a4e10a0159d5a8d20056a12b05b45cea944a4953f972"}, + {file = "frozenlist-1.5.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:1893f948bf6681733aaccf36c5232c231e3b5166d607c5fa77773611df6dc336"}, + {file = "frozenlist-1.5.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:2b5e23253bb709ef57a8e95e6ae48daa9ac5f265637529e4ce6b003a37b2621f"}, + {file = "frozenlist-1.5.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0f253985bb515ecd89629db13cb58d702035ecd8cfbca7d7a7e29a0e6d39af5f"}, + {file = "frozenlist-1.5.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:04a5c6babd5e8fb7d3c871dc8b321166b80e41b637c31a995ed844a6139942b6"}, + {file = "frozenlist-1.5.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a9fe0f1c29ba24ba6ff6abf688cb0b7cf1efab6b6aa6adc55441773c252f7411"}, + {file = "frozenlist-1.5.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:226d72559fa19babe2ccd920273e767c96a49b9d3d38badd7c91a0fdeda8ea08"}, + {file = "frozenlist-1.5.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:15b731db116ab3aedec558573c1a5eec78822b32292fe4f2f0345b7f697745c2"}, + {file = "frozenlist-1.5.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:366d8f93e3edfe5a918c874702f78faac300209a4d5bf38352b2c1bdc07a766d"}, + {file = "frozenlist-1.5.0-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:1b96af8c582b94d381a1c1f51ffaedeb77c821c690ea5f01da3d70a487dd0a9b"}, + {file = "frozenlist-1.5.0-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:c03eff4a41bd4e38415cbed054bbaff4a075b093e2394b6915dca34a40d1e38b"}, + {file = "frozenlist-1.5.0-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:50cf5e7ee9b98f22bdecbabf3800ae78ddcc26e4a435515fc72d97903e8488e0"}, + {file = "frozenlist-1.5.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:1e76bfbc72353269c44e0bc2cfe171900fbf7f722ad74c9a7b638052afe6a00c"}, + {file = "frozenlist-1.5.0-cp39-cp39-win32.whl", hash = "sha256:666534d15ba8f0fda3f53969117383d5dc021266b3c1a42c9ec4855e4b58b9d3"}, + {file = "frozenlist-1.5.0-cp39-cp39-win_amd64.whl", hash = "sha256:5c28f4b5dbef8a0d8aad0d4de24d1e9e981728628afaf4ea0792f5d0939372f0"}, + {file = "frozenlist-1.5.0-py3-none-any.whl", hash = "sha256:d994863bba198a4a518b467bb971c56e1db3f180a25c6cf7bb1949c267f748c3"}, + {file = "frozenlist-1.5.0.tar.gz", hash = "sha256:81d5af29e61b9c8348e876d442253723928dce6433e0e76cd925cd83f1b4b817"}, ] [[package]] @@ -696,13 +746,13 @@ yaml = ["PyYAML"] [[package]] name = "googleapis-common-protos" -version = "1.63.2" +version = "1.65.0" description = "Common protobufs used in Google APIs" optional = false python-versions = ">=3.7" files = [ - {file = "googleapis-common-protos-1.63.2.tar.gz", hash = "sha256:27c5abdffc4911f28101e635de1533fb4cfd2c37fbaa9174587c799fac90aa87"}, - {file = "googleapis_common_protos-1.63.2-py2.py3-none-any.whl", hash = "sha256:27a2499c7e8aff199665b22741997e485eccc8645aa9176c7c988e6fae507945"}, + {file = "googleapis_common_protos-1.65.0-py2.py3-none-any.whl", hash = "sha256:2972e6c496f435b92590fd54045060867f3fe9be2c82ab148fc8885035479a63"}, + {file = "googleapis_common_protos-1.65.0.tar.gz", hash = "sha256:334a29d07cddc3aa01dee4988f9afd9b2916ee2ff49d6b757155dc0d197852c0"}, ] [package.dependencies] @@ -713,15 +763,18 @@ grpc = ["grpcio (>=1.44.0,<2.0.0.dev0)"] [[package]] name = "idna" -version = "3.7" +version = "3.10" description = "Internationalized Domain Names in Applications (IDNA)" optional = false -python-versions = ">=3.5" +python-versions = ">=3.6" files = [ - {file = "idna-3.7-py3-none-any.whl", hash = "sha256:82fee1fc78add43492d3a1898bfa6d8a904cc97d8427f683ed8e798d07761aa0"}, - {file = "idna-3.7.tar.gz", hash = "sha256:028ff3aadf0609c1fd278d8ea3089299412a7a8b9bd005dd08b9f8285bcb5cfc"}, + {file = "idna-3.10-py3-none-any.whl", hash = "sha256:946d195a0d259cbba61165e88e65941f16e9b36ea6ddb97f00452bae8b1287d3"}, + {file = "idna-3.10.tar.gz", hash = "sha256:12f65c9b470abda6dc35cf8e63cc574b1c52b11df2c86030af0ac09b01b13ea9"}, ] +[package.extras] +all = ["flake8 (>=7.1.1)", "mypy (>=1.11.2)", "pytest (>=8.3.2)", "ruff (>=0.6.2)"] + [[package]] name = "importlib-metadata" version = "7.1.0" @@ -775,13 +828,13 @@ format-nongpl = ["fqdn", "idna", "isoduration", "jsonpointer (>1.13)", "rfc3339- [[package]] name = "jsonschema-specifications" -version = "2023.12.1" +version = "2024.10.1" description = "The JSON Schema meta-schemas and vocabularies, exposed as a Registry" optional = false -python-versions = ">=3.8" +python-versions = ">=3.9" files = [ - {file = "jsonschema_specifications-2023.12.1-py3-none-any.whl", hash = "sha256:87e4fdf3a94858b8a2ba2778d9ba57d8a9cafca7c7489c46ba0d30a8bc6a9c3c"}, - {file = "jsonschema_specifications-2023.12.1.tar.gz", hash = "sha256:48a76787b3e70f5ed53f1160d2b81f586e4ca6d1548c5de7085d1682674764cc"}, + {file = "jsonschema_specifications-2024.10.1-py3-none-any.whl", hash = "sha256:a09a0680616357d9a0ecf05c12ad234479f549239d0f5b55f3deea67475da9bf"}, + {file = "jsonschema_specifications-2024.10.1.tar.gz", hash = "sha256:0f38b83639958ce1152d02a7f062902c41c8fd20d558b0c34344292d417ae272"}, ] [package.dependencies] @@ -798,6 +851,24 @@ files = [ {file = "lockfile-0.12.2.tar.gz", hash = "sha256:6aed02de03cba24efabcd600b30540140634fc06cfa603822d508d5361e9f799"}, ] +[[package]] +name = "loguru" +version = "0.7.2" +description = "Python logging made (stupidly) simple" +optional = false +python-versions = ">=3.5" +files = [ + {file = "loguru-0.7.2-py3-none-any.whl", hash = "sha256:003d71e3d3ed35f0f8984898359d65b79e5b21943f78af86aa5491210429b8eb"}, + {file = "loguru-0.7.2.tar.gz", hash = "sha256:e671a53522515f34fd406340ee968cb9ecafbc4b36c679da03c18fd8d0bd51ac"}, +] + +[package.dependencies] +colorama = {version = ">=0.3.4", markers = "sys_platform == \"win32\""} +win32-setctime = {version = ">=1.0.0", markers = "sys_platform == \"win32\""} + +[package.extras] +dev = ["Sphinx (==7.2.5)", "colorama (==0.4.5)", "colorama (==0.4.6)", "exceptiongroup (==1.1.3)", "freezegun (==1.1.0)", "freezegun (==1.2.2)", "mypy (==v0.910)", "mypy (==v0.971)", "mypy (==v1.4.1)", "mypy (==v1.5.1)", "pre-commit (==3.4.0)", "pytest (==6.1.2)", "pytest (==7.4.0)", "pytest-cov (==2.12.1)", "pytest-cov (==4.1.0)", "pytest-mypy-plugins (==1.9.3)", "pytest-mypy-plugins (==3.0.0)", "sphinx-autobuild (==2021.3.14)", "sphinx-rtd-theme (==1.3.0)", "tox (==3.27.1)", "tox (==4.11.0)"] + [[package]] name = "markdown-it-py" version = "3.0.0" @@ -835,101 +906,103 @@ files = [ [[package]] name = "multidict" -version = "6.0.5" +version = "6.1.0" description = "multidict implementation" optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "multidict-6.0.5-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:228b644ae063c10e7f324ab1ab6b548bdf6f8b47f3ec234fef1093bc2735e5f9"}, - {file = "multidict-6.0.5-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:896ebdcf62683551312c30e20614305f53125750803b614e9e6ce74a96232604"}, - {file = "multidict-6.0.5-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:411bf8515f3be9813d06004cac41ccf7d1cd46dfe233705933dd163b60e37600"}, - {file = "multidict-6.0.5-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1d147090048129ce3c453f0292e7697d333db95e52616b3793922945804a433c"}, - {file = "multidict-6.0.5-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:215ed703caf15f578dca76ee6f6b21b7603791ae090fbf1ef9d865571039ade5"}, - {file = "multidict-6.0.5-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7c6390cf87ff6234643428991b7359b5f59cc15155695deb4eda5c777d2b880f"}, - {file = "multidict-6.0.5-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:21fd81c4ebdb4f214161be351eb5bcf385426bf023041da2fd9e60681f3cebae"}, - {file = "multidict-6.0.5-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3cc2ad10255f903656017363cd59436f2111443a76f996584d1077e43ee51182"}, - {file = "multidict-6.0.5-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:6939c95381e003f54cd4c5516740faba40cf5ad3eeff460c3ad1d3e0ea2549bf"}, - {file = "multidict-6.0.5-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:220dd781e3f7af2c2c1053da9fa96d9cf3072ca58f057f4c5adaaa1cab8fc442"}, - {file = "multidict-6.0.5-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:766c8f7511df26d9f11cd3a8be623e59cca73d44643abab3f8c8c07620524e4a"}, - {file = "multidict-6.0.5-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:fe5d7785250541f7f5019ab9cba2c71169dc7d74d0f45253f8313f436458a4ef"}, - {file = "multidict-6.0.5-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:c1c1496e73051918fcd4f58ff2e0f2f3066d1c76a0c6aeffd9b45d53243702cc"}, - {file = "multidict-6.0.5-cp310-cp310-win32.whl", hash = "sha256:7afcdd1fc07befad18ec4523a782cde4e93e0a2bf71239894b8d61ee578c1319"}, - {file = "multidict-6.0.5-cp310-cp310-win_amd64.whl", hash = "sha256:99f60d34c048c5c2fabc766108c103612344c46e35d4ed9ae0673d33c8fb26e8"}, - {file = "multidict-6.0.5-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:f285e862d2f153a70586579c15c44656f888806ed0e5b56b64489afe4a2dbfba"}, - {file = "multidict-6.0.5-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:53689bb4e102200a4fafa9de9c7c3c212ab40a7ab2c8e474491914d2305f187e"}, - {file = "multidict-6.0.5-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:612d1156111ae11d14afaf3a0669ebf6c170dbb735e510a7438ffe2369a847fd"}, - {file = "multidict-6.0.5-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7be7047bd08accdb7487737631d25735c9a04327911de89ff1b26b81745bd4e3"}, - {file = "multidict-6.0.5-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:de170c7b4fe6859beb8926e84f7d7d6c693dfe8e27372ce3b76f01c46e489fcf"}, - {file = "multidict-6.0.5-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:04bde7a7b3de05732a4eb39c94574db1ec99abb56162d6c520ad26f83267de29"}, - {file = "multidict-6.0.5-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:85f67aed7bb647f93e7520633d8f51d3cbc6ab96957c71272b286b2f30dc70ed"}, - {file = "multidict-6.0.5-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:425bf820055005bfc8aa9a0b99ccb52cc2f4070153e34b701acc98d201693733"}, - {file = "multidict-6.0.5-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:d3eb1ceec286eba8220c26f3b0096cf189aea7057b6e7b7a2e60ed36b373b77f"}, - {file = "multidict-6.0.5-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:7901c05ead4b3fb75113fb1dd33eb1253c6d3ee37ce93305acd9d38e0b5f21a4"}, - {file = "multidict-6.0.5-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:e0e79d91e71b9867c73323a3444724d496c037e578a0e1755ae159ba14f4f3d1"}, - {file = "multidict-6.0.5-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:29bfeb0dff5cb5fdab2023a7a9947b3b4af63e9c47cae2a10ad58394b517fddc"}, - {file = "multidict-6.0.5-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:e030047e85cbcedbfc073f71836d62dd5dadfbe7531cae27789ff66bc551bd5e"}, - {file = "multidict-6.0.5-cp311-cp311-win32.whl", hash = "sha256:2f4848aa3baa109e6ab81fe2006c77ed4d3cd1e0ac2c1fbddb7b1277c168788c"}, - {file = "multidict-6.0.5-cp311-cp311-win_amd64.whl", hash = "sha256:2faa5ae9376faba05f630d7e5e6be05be22913782b927b19d12b8145968a85ea"}, - {file = "multidict-6.0.5-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:51d035609b86722963404f711db441cf7134f1889107fb171a970c9701f92e1e"}, - {file = "multidict-6.0.5-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:cbebcd5bcaf1eaf302617c114aa67569dd3f090dd0ce8ba9e35e9985b41ac35b"}, - {file = "multidict-6.0.5-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:2ffc42c922dbfddb4a4c3b438eb056828719f07608af27d163191cb3e3aa6cc5"}, - {file = "multidict-6.0.5-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ceb3b7e6a0135e092de86110c5a74e46bda4bd4fbfeeb3a3bcec79c0f861e450"}, - {file = "multidict-6.0.5-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:79660376075cfd4b2c80f295528aa6beb2058fd289f4c9252f986751a4cd0496"}, - {file = "multidict-6.0.5-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e4428b29611e989719874670fd152b6625500ad6c686d464e99f5aaeeaca175a"}, - {file = "multidict-6.0.5-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d84a5c3a5f7ce6db1f999fb9438f686bc2e09d38143f2d93d8406ed2dd6b9226"}, - {file = "multidict-6.0.5-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:76c0de87358b192de7ea9649beb392f107dcad9ad27276324c24c91774ca5271"}, - {file = "multidict-6.0.5-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:79a6d2ba910adb2cbafc95dad936f8b9386e77c84c35bc0add315b856d7c3abb"}, - {file = "multidict-6.0.5-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:92d16a3e275e38293623ebf639c471d3e03bb20b8ebb845237e0d3664914caef"}, - {file = "multidict-6.0.5-cp312-cp312-musllinux_1_1_ppc64le.whl", hash = "sha256:fb616be3538599e797a2017cccca78e354c767165e8858ab5116813146041a24"}, - {file = "multidict-6.0.5-cp312-cp312-musllinux_1_1_s390x.whl", hash = "sha256:14c2976aa9038c2629efa2c148022ed5eb4cb939e15ec7aace7ca932f48f9ba6"}, - {file = "multidict-6.0.5-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:435a0984199d81ca178b9ae2c26ec3d49692d20ee29bc4c11a2a8d4514c67eda"}, - {file = "multidict-6.0.5-cp312-cp312-win32.whl", hash = "sha256:9fe7b0653ba3d9d65cbe7698cca585bf0f8c83dbbcc710db9c90f478e175f2d5"}, - {file = "multidict-6.0.5-cp312-cp312-win_amd64.whl", hash = "sha256:01265f5e40f5a17f8241d52656ed27192be03bfa8764d88e8220141d1e4b3556"}, - {file = "multidict-6.0.5-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:19fe01cea168585ba0f678cad6f58133db2aa14eccaf22f88e4a6dccadfad8b3"}, - {file = "multidict-6.0.5-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6bf7a982604375a8d49b6cc1b781c1747f243d91b81035a9b43a2126c04766f5"}, - {file = "multidict-6.0.5-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:107c0cdefe028703fb5dafe640a409cb146d44a6ae201e55b35a4af8e95457dd"}, - {file = "multidict-6.0.5-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:403c0911cd5d5791605808b942c88a8155c2592e05332d2bf78f18697a5fa15e"}, - {file = "multidict-6.0.5-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:aeaf541ddbad8311a87dd695ed9642401131ea39ad7bc8cf3ef3967fd093b626"}, - {file = "multidict-6.0.5-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e4972624066095e52b569e02b5ca97dbd7a7ddd4294bf4e7247d52635630dd83"}, - {file = "multidict-6.0.5-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:d946b0a9eb8aaa590df1fe082cee553ceab173e6cb5b03239716338629c50c7a"}, - {file = "multidict-6.0.5-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:b55358304d7a73d7bdf5de62494aaf70bd33015831ffd98bc498b433dfe5b10c"}, - {file = "multidict-6.0.5-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:a3145cb08d8625b2d3fee1b2d596a8766352979c9bffe5d7833e0503d0f0b5e5"}, - {file = "multidict-6.0.5-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:d65f25da8e248202bd47445cec78e0025c0fe7582b23ec69c3b27a640dd7a8e3"}, - {file = "multidict-6.0.5-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:c9bf56195c6bbd293340ea82eafd0071cb3d450c703d2c93afb89f93b8386ccc"}, - {file = "multidict-6.0.5-cp37-cp37m-win32.whl", hash = "sha256:69db76c09796b313331bb7048229e3bee7928eb62bab5e071e9f7fcc4879caee"}, - {file = "multidict-6.0.5-cp37-cp37m-win_amd64.whl", hash = "sha256:fce28b3c8a81b6b36dfac9feb1de115bab619b3c13905b419ec71d03a3fc1423"}, - {file = "multidict-6.0.5-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:76f067f5121dcecf0d63a67f29080b26c43c71a98b10c701b0677e4a065fbd54"}, - {file = "multidict-6.0.5-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:b82cc8ace10ab5bd93235dfaab2021c70637005e1ac787031f4d1da63d493c1d"}, - {file = "multidict-6.0.5-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:5cb241881eefd96b46f89b1a056187ea8e9ba14ab88ba632e68d7a2ecb7aadf7"}, - {file = "multidict-6.0.5-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e8e94e6912639a02ce173341ff62cc1201232ab86b8a8fcc05572741a5dc7d93"}, - {file = "multidict-6.0.5-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:09a892e4a9fb47331da06948690ae38eaa2426de97b4ccbfafbdcbe5c8f37ff8"}, - {file = "multidict-6.0.5-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:55205d03e8a598cfc688c71ca8ea5f66447164efff8869517f175ea632c7cb7b"}, - {file = "multidict-6.0.5-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:37b15024f864916b4951adb95d3a80c9431299080341ab9544ed148091b53f50"}, - {file = "multidict-6.0.5-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f2a1dee728b52b33eebff5072817176c172050d44d67befd681609b4746e1c2e"}, - {file = "multidict-6.0.5-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:edd08e6f2f1a390bf137080507e44ccc086353c8e98c657e666c017718561b89"}, - {file = "multidict-6.0.5-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:60d698e8179a42ec85172d12f50b1668254628425a6bd611aba022257cac1386"}, - {file = "multidict-6.0.5-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:3d25f19500588cbc47dc19081d78131c32637c25804df8414463ec908631e453"}, - {file = "multidict-6.0.5-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:4cc0ef8b962ac7a5e62b9e826bd0cd5040e7d401bc45a6835910ed699037a461"}, - {file = "multidict-6.0.5-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:eca2e9d0cc5a889850e9bbd68e98314ada174ff6ccd1129500103df7a94a7a44"}, - {file = "multidict-6.0.5-cp38-cp38-win32.whl", hash = "sha256:4a6a4f196f08c58c59e0b8ef8ec441d12aee4125a7d4f4fef000ccb22f8d7241"}, - {file = "multidict-6.0.5-cp38-cp38-win_amd64.whl", hash = "sha256:0275e35209c27a3f7951e1ce7aaf93ce0d163b28948444bec61dd7badc6d3f8c"}, - {file = "multidict-6.0.5-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:e7be68734bd8c9a513f2b0cfd508802d6609da068f40dc57d4e3494cefc92929"}, - {file = "multidict-6.0.5-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:1d9ea7a7e779d7a3561aade7d596649fbecfa5c08a7674b11b423783217933f9"}, - {file = "multidict-6.0.5-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:ea1456df2a27c73ce51120fa2f519f1bea2f4a03a917f4a43c8707cf4cbbae1a"}, - {file = "multidict-6.0.5-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cf590b134eb70629e350691ecca88eac3e3b8b3c86992042fb82e3cb1830d5e1"}, - {file = "multidict-6.0.5-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5c0631926c4f58e9a5ccce555ad7747d9a9f8b10619621f22f9635f069f6233e"}, - {file = "multidict-6.0.5-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:dce1c6912ab9ff5f179eaf6efe7365c1f425ed690b03341911bf4939ef2f3046"}, - {file = "multidict-6.0.5-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c0868d64af83169e4d4152ec612637a543f7a336e4a307b119e98042e852ad9c"}, - {file = "multidict-6.0.5-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:141b43360bfd3bdd75f15ed811850763555a251e38b2405967f8e25fb43f7d40"}, - {file = "multidict-6.0.5-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:7df704ca8cf4a073334e0427ae2345323613e4df18cc224f647f251e5e75a527"}, - {file = "multidict-6.0.5-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:6214c5a5571802c33f80e6c84713b2c79e024995b9c5897f794b43e714daeec9"}, - {file = "multidict-6.0.5-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:cd6c8fca38178e12c00418de737aef1261576bd1b6e8c6134d3e729a4e858b38"}, - {file = "multidict-6.0.5-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:e02021f87a5b6932fa6ce916ca004c4d441509d33bbdbeca70d05dff5e9d2479"}, - {file = "multidict-6.0.5-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:ebd8d160f91a764652d3e51ce0d2956b38efe37c9231cd82cfc0bed2e40b581c"}, - {file = "multidict-6.0.5-cp39-cp39-win32.whl", hash = "sha256:04da1bb8c8dbadf2a18a452639771951c662c5ad03aefe4884775454be322c9b"}, - {file = "multidict-6.0.5-cp39-cp39-win_amd64.whl", hash = "sha256:d6f6d4f185481c9669b9447bf9d9cf3b95a0e9df9d169bbc17e363b7d5487755"}, - {file = "multidict-6.0.5-py3-none-any.whl", hash = "sha256:0d63c74e3d7ab26de115c49bffc92cc77ed23395303d496eae515d4204a625e7"}, - {file = "multidict-6.0.5.tar.gz", hash = "sha256:f7e301075edaf50500f0b341543c41194d8df3ae5caf4702f2095f3ca73dd8da"}, + {file = "multidict-6.1.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:3380252550e372e8511d49481bd836264c009adb826b23fefcc5dd3c69692f60"}, + {file = "multidict-6.1.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:99f826cbf970077383d7de805c0681799491cb939c25450b9b5b3ced03ca99f1"}, + {file = "multidict-6.1.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:a114d03b938376557927ab23f1e950827c3b893ccb94b62fd95d430fd0e5cf53"}, + {file = "multidict-6.1.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b1c416351ee6271b2f49b56ad7f308072f6f44b37118d69c2cad94f3fa8a40d5"}, + {file = "multidict-6.1.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:6b5d83030255983181005e6cfbac1617ce9746b219bc2aad52201ad121226581"}, + {file = "multidict-6.1.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3e97b5e938051226dc025ec80980c285b053ffb1e25a3db2a3aa3bc046bf7f56"}, + {file = "multidict-6.1.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d618649d4e70ac6efcbba75be98b26ef5078faad23592f9b51ca492953012429"}, + {file = "multidict-6.1.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:10524ebd769727ac77ef2278390fb0068d83f3acb7773792a5080f2b0abf7748"}, + {file = "multidict-6.1.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:ff3827aef427c89a25cc96ded1759271a93603aba9fb977a6d264648ebf989db"}, + {file = "multidict-6.1.0-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:06809f4f0f7ab7ea2cabf9caca7d79c22c0758b58a71f9d32943ae13c7ace056"}, + {file = "multidict-6.1.0-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:f179dee3b863ab1c59580ff60f9d99f632f34ccb38bf67a33ec6b3ecadd0fd76"}, + {file = "multidict-6.1.0-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:aaed8b0562be4a0876ee3b6946f6869b7bcdb571a5d1496683505944e268b160"}, + {file = "multidict-6.1.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:3c8b88a2ccf5493b6c8da9076fb151ba106960a2df90c2633f342f120751a9e7"}, + {file = "multidict-6.1.0-cp310-cp310-win32.whl", hash = "sha256:4a9cb68166a34117d6646c0023c7b759bf197bee5ad4272f420a0141d7eb03a0"}, + {file = "multidict-6.1.0-cp310-cp310-win_amd64.whl", hash = "sha256:20b9b5fbe0b88d0bdef2012ef7dee867f874b72528cf1d08f1d59b0e3850129d"}, + {file = "multidict-6.1.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:3efe2c2cb5763f2f1b275ad2bf7a287d3f7ebbef35648a9726e3b69284a4f3d6"}, + {file = "multidict-6.1.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:c7053d3b0353a8b9de430a4f4b4268ac9a4fb3481af37dfe49825bf45ca24156"}, + {file = "multidict-6.1.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:27e5fc84ccef8dfaabb09d82b7d179c7cf1a3fbc8a966f8274fcb4ab2eb4cadb"}, + {file = "multidict-6.1.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0e2b90b43e696f25c62656389d32236e049568b39320e2735d51f08fd362761b"}, + {file = "multidict-6.1.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d83a047959d38a7ff552ff94be767b7fd79b831ad1cd9920662db05fec24fe72"}, + {file = "multidict-6.1.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d1a9dd711d0877a1ece3d2e4fea11a8e75741ca21954c919406b44e7cf971304"}, + {file = "multidict-6.1.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ec2abea24d98246b94913b76a125e855eb5c434f7c46546046372fe60f666351"}, + {file = "multidict-6.1.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4867cafcbc6585e4b678876c489b9273b13e9fff9f6d6d66add5e15d11d926cb"}, + {file = "multidict-6.1.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:5b48204e8d955c47c55b72779802b219a39acc3ee3d0116d5080c388970b76e3"}, + {file = "multidict-6.1.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:d8fff389528cad1618fb4b26b95550327495462cd745d879a8c7c2115248e399"}, + {file = "multidict-6.1.0-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:a7a9541cd308eed5e30318430a9c74d2132e9a8cb46b901326272d780bf2d423"}, + {file = "multidict-6.1.0-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:da1758c76f50c39a2efd5e9859ce7d776317eb1dd34317c8152ac9251fc574a3"}, + {file = "multidict-6.1.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:c943a53e9186688b45b323602298ab727d8865d8c9ee0b17f8d62d14b56f0753"}, + {file = "multidict-6.1.0-cp311-cp311-win32.whl", hash = "sha256:90f8717cb649eea3504091e640a1b8568faad18bd4b9fcd692853a04475a4b80"}, + {file = "multidict-6.1.0-cp311-cp311-win_amd64.whl", hash = "sha256:82176036e65644a6cc5bd619f65f6f19781e8ec2e5330f51aa9ada7504cc1926"}, + {file = "multidict-6.1.0-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:b04772ed465fa3cc947db808fa306d79b43e896beb677a56fb2347ca1a49c1fa"}, + {file = "multidict-6.1.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:6180c0ae073bddeb5a97a38c03f30c233e0a4d39cd86166251617d1bbd0af436"}, + {file = "multidict-6.1.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:071120490b47aa997cca00666923a83f02c7fbb44f71cf7f136df753f7fa8761"}, + {file = "multidict-6.1.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:50b3a2710631848991d0bf7de077502e8994c804bb805aeb2925a981de58ec2e"}, + {file = "multidict-6.1.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b58c621844d55e71c1b7f7c498ce5aa6985d743a1a59034c57a905b3f153c1ef"}, + {file = "multidict-6.1.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:55b6d90641869892caa9ca42ff913f7ff1c5ece06474fbd32fb2cf6834726c95"}, + {file = "multidict-6.1.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4b820514bfc0b98a30e3d85462084779900347e4d49267f747ff54060cc33925"}, + {file = "multidict-6.1.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:10a9b09aba0c5b48c53761b7c720aaaf7cf236d5fe394cd399c7ba662d5f9966"}, + {file = "multidict-6.1.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:1e16bf3e5fc9f44632affb159d30a437bfe286ce9e02754759be5536b169b305"}, + {file = "multidict-6.1.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:76f364861c3bfc98cbbcbd402d83454ed9e01a5224bb3a28bf70002a230f73e2"}, + {file = "multidict-6.1.0-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:820c661588bd01a0aa62a1283f20d2be4281b086f80dad9e955e690c75fb54a2"}, + {file = "multidict-6.1.0-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:0e5f362e895bc5b9e67fe6e4ded2492d8124bdf817827f33c5b46c2fe3ffaca6"}, + {file = "multidict-6.1.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:3ec660d19bbc671e3a6443325f07263be452c453ac9e512f5eb935e7d4ac28b3"}, + {file = "multidict-6.1.0-cp312-cp312-win32.whl", hash = "sha256:58130ecf8f7b8112cdb841486404f1282b9c86ccb30d3519faf301b2e5659133"}, + {file = "multidict-6.1.0-cp312-cp312-win_amd64.whl", hash = "sha256:188215fc0aafb8e03341995e7c4797860181562380f81ed0a87ff455b70bf1f1"}, + {file = "multidict-6.1.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:d569388c381b24671589335a3be6e1d45546c2988c2ebe30fdcada8457a31008"}, + {file = "multidict-6.1.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:052e10d2d37810b99cc170b785945421141bf7bb7d2f8799d431e7db229c385f"}, + {file = "multidict-6.1.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:f90c822a402cb865e396a504f9fc8173ef34212a342d92e362ca498cad308e28"}, + {file = "multidict-6.1.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b225d95519a5bf73860323e633a664b0d85ad3d5bede6d30d95b35d4dfe8805b"}, + {file = "multidict-6.1.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:23bfd518810af7de1116313ebd9092cb9aa629beb12f6ed631ad53356ed6b86c"}, + {file = "multidict-6.1.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5c09fcfdccdd0b57867577b719c69e347a436b86cd83747f179dbf0cc0d4c1f3"}, + {file = "multidict-6.1.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bf6bea52ec97e95560af5ae576bdac3aa3aae0b6758c6efa115236d9e07dae44"}, + {file = "multidict-6.1.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:57feec87371dbb3520da6192213c7d6fc892d5589a93db548331954de8248fd2"}, + {file = "multidict-6.1.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:0c3f390dc53279cbc8ba976e5f8035eab997829066756d811616b652b00a23a3"}, + {file = "multidict-6.1.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:59bfeae4b25ec05b34f1956eaa1cb38032282cd4dfabc5056d0a1ec4d696d3aa"}, + {file = "multidict-6.1.0-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:b2f59caeaf7632cc633b5cf6fc449372b83bbdf0da4ae04d5be36118e46cc0aa"}, + {file = "multidict-6.1.0-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:37bb93b2178e02b7b618893990941900fd25b6b9ac0fa49931a40aecdf083fe4"}, + {file = "multidict-6.1.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:4e9f48f58c2c523d5a06faea47866cd35b32655c46b443f163d08c6d0ddb17d6"}, + {file = "multidict-6.1.0-cp313-cp313-win32.whl", hash = "sha256:3a37ffb35399029b45c6cc33640a92bef403c9fd388acce75cdc88f58bd19a81"}, + {file = "multidict-6.1.0-cp313-cp313-win_amd64.whl", hash = "sha256:e9aa71e15d9d9beaad2c6b9319edcdc0a49a43ef5c0a4c8265ca9ee7d6c67774"}, + {file = "multidict-6.1.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:db7457bac39421addd0c8449933ac32d8042aae84a14911a757ae6ca3eef1392"}, + {file = "multidict-6.1.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:d094ddec350a2fb899fec68d8353c78233debde9b7d8b4beeafa70825f1c281a"}, + {file = "multidict-6.1.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:5845c1fd4866bb5dd3125d89b90e57ed3138241540897de748cdf19de8a2fca2"}, + {file = "multidict-6.1.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9079dfc6a70abe341f521f78405b8949f96db48da98aeb43f9907f342f627cdc"}, + {file = "multidict-6.1.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3914f5aaa0f36d5d60e8ece6a308ee1c9784cd75ec8151062614657a114c4478"}, + {file = "multidict-6.1.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c08be4f460903e5a9d0f76818db3250f12e9c344e79314d1d570fc69d7f4eae4"}, + {file = "multidict-6.1.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d093be959277cb7dee84b801eb1af388b6ad3ca6a6b6bf1ed7585895789d027d"}, + {file = "multidict-6.1.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3702ea6872c5a2a4eeefa6ffd36b042e9773f05b1f37ae3ef7264b1163c2dcf6"}, + {file = "multidict-6.1.0-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:2090f6a85cafc5b2db085124d752757c9d251548cedabe9bd31afe6363e0aff2"}, + {file = "multidict-6.1.0-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:f67f217af4b1ff66c68a87318012de788dd95fcfeb24cc889011f4e1c7454dfd"}, + {file = "multidict-6.1.0-cp38-cp38-musllinux_1_2_ppc64le.whl", hash = "sha256:189f652a87e876098bbc67b4da1049afb5f5dfbaa310dd67c594b01c10388db6"}, + {file = "multidict-6.1.0-cp38-cp38-musllinux_1_2_s390x.whl", hash = "sha256:6bb5992037f7a9eff7991ebe4273ea7f51f1c1c511e6a2ce511d0e7bdb754492"}, + {file = "multidict-6.1.0-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:ac10f4c2b9e770c4e393876e35a7046879d195cd123b4f116d299d442b335bcd"}, + {file = "multidict-6.1.0-cp38-cp38-win32.whl", hash = "sha256:e27bbb6d14416713a8bd7aaa1313c0fc8d44ee48d74497a0ff4c3a1b6ccb5167"}, + {file = "multidict-6.1.0-cp38-cp38-win_amd64.whl", hash = "sha256:22f3105d4fb15c8f57ff3959a58fcab6ce36814486500cd7485651230ad4d4ef"}, + {file = "multidict-6.1.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:4e18b656c5e844539d506a0a06432274d7bd52a7487e6828c63a63d69185626c"}, + {file = "multidict-6.1.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:a185f876e69897a6f3325c3f19f26a297fa058c5e456bfcff8015e9a27e83ae1"}, + {file = "multidict-6.1.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:ab7c4ceb38d91570a650dba194e1ca87c2b543488fe9309b4212694174fd539c"}, + {file = "multidict-6.1.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e617fb6b0b6953fffd762669610c1c4ffd05632c138d61ac7e14ad187870669c"}, + {file = "multidict-6.1.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:16e5f4bf4e603eb1fdd5d8180f1a25f30056f22e55ce51fb3d6ad4ab29f7d96f"}, + {file = "multidict-6.1.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f4c035da3f544b1882bac24115f3e2e8760f10a0107614fc9839fd232200b875"}, + {file = "multidict-6.1.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:957cf8e4b6e123a9eea554fa7ebc85674674b713551de587eb318a2df3e00255"}, + {file = "multidict-6.1.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:483a6aea59cb89904e1ceabd2b47368b5600fb7de78a6e4a2c2987b2d256cf30"}, + {file = "multidict-6.1.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:87701f25a2352e5bf7454caa64757642734da9f6b11384c1f9d1a8e699758057"}, + {file = "multidict-6.1.0-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:682b987361e5fd7a139ed565e30d81fd81e9629acc7d925a205366877d8c8657"}, + {file = "multidict-6.1.0-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:ce2186a7df133a9c895dea3331ddc5ddad42cdd0d1ea2f0a51e5d161e4762f28"}, + {file = "multidict-6.1.0-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:9f636b730f7e8cb19feb87094949ba54ee5357440b9658b2a32a5ce4bce53972"}, + {file = "multidict-6.1.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:73eae06aa53af2ea5270cc066dcaf02cc60d2994bbb2c4ef5764949257d10f43"}, + {file = "multidict-6.1.0-cp39-cp39-win32.whl", hash = "sha256:1ca0083e80e791cffc6efce7660ad24af66c8d4079d2a750b29001b53ff59ada"}, + {file = "multidict-6.1.0-cp39-cp39-win_amd64.whl", hash = "sha256:aa466da5b15ccea564bdab9c89175c762bc12825f4659c11227f515cee76fa4a"}, + {file = "multidict-6.1.0-py3-none-any.whl", hash = "sha256:48e171e52d1c4d33888e529b999e5900356b9ae588c2f09a52dcefb158b27506"}, + {file = "multidict-6.1.0.tar.gz", hash = "sha256:22ae2ebf9b0c69d206c003e2f6a914ea33f0a932d4aa16f236afc049d9958f4a"}, ] [[package]] @@ -1096,12 +1169,12 @@ files = [ [[package]] name = "peewee" -version = "3.17.6" +version = "3.17.7" description = "a little orm" optional = false python-versions = "*" files = [ - {file = "peewee-3.17.6.tar.gz", hash = "sha256:cea5592c6f4da1592b7cff8eaf655be6648a1f5857469e30037bf920c03fb8fb"}, + {file = "peewee-3.17.7.tar.gz", hash = "sha256:6aefc700bd530fc6ac23fa19c9c5b47041751d92985b799169c8e318e97eabaa"}, ] [[package]] @@ -1133,24 +1206,131 @@ files = [ dev = ["pre-commit", "tox"] testing = ["pytest", "pytest-benchmark"] +[[package]] +name = "propcache" +version = "0.2.0" +description = "Accelerated property cache" +optional = false +python-versions = ">=3.8" +files = [ + {file = "propcache-0.2.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:c5869b8fd70b81835a6f187c5fdbe67917a04d7e52b6e7cc4e5fe39d55c39d58"}, + {file = "propcache-0.2.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:952e0d9d07609d9c5be361f33b0d6d650cd2bae393aabb11d9b719364521984b"}, + {file = "propcache-0.2.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:33ac8f098df0585c0b53009f039dfd913b38c1d2edafed0cedcc0c32a05aa110"}, + {file = "propcache-0.2.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:97e48e8875e6c13909c800fa344cd54cc4b2b0db1d5f911f840458a500fde2c2"}, + {file = "propcache-0.2.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:388f3217649d6d59292b722d940d4d2e1e6a7003259eb835724092a1cca0203a"}, + {file = "propcache-0.2.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f571aea50ba5623c308aa146eb650eebf7dbe0fd8c5d946e28343cb3b5aad577"}, + {file = "propcache-0.2.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3dfafb44f7bb35c0c06eda6b2ab4bfd58f02729e7c4045e179f9a861b07c9850"}, + {file = "propcache-0.2.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a3ebe9a75be7ab0b7da2464a77bb27febcb4fab46a34f9288f39d74833db7f61"}, + {file = "propcache-0.2.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:d2f0d0f976985f85dfb5f3d685697ef769faa6b71993b46b295cdbbd6be8cc37"}, + {file = "propcache-0.2.0-cp310-cp310-musllinux_1_2_armv7l.whl", hash = "sha256:a3dc1a4b165283bd865e8f8cb5f0c64c05001e0718ed06250d8cac9bec115b48"}, + {file = "propcache-0.2.0-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:9e0f07b42d2a50c7dd2d8675d50f7343d998c64008f1da5fef888396b7f84630"}, + {file = "propcache-0.2.0-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:e63e3e1e0271f374ed489ff5ee73d4b6e7c60710e1f76af5f0e1a6117cd26394"}, + {file = "propcache-0.2.0-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:56bb5c98f058a41bb58eead194b4db8c05b088c93d94d5161728515bd52b052b"}, + {file = "propcache-0.2.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:7665f04d0c7f26ff8bb534e1c65068409bf4687aa2534faf7104d7182debb336"}, + {file = "propcache-0.2.0-cp310-cp310-win32.whl", hash = "sha256:7cf18abf9764746b9c8704774d8b06714bcb0a63641518a3a89c7f85cc02c2ad"}, + {file = "propcache-0.2.0-cp310-cp310-win_amd64.whl", hash = "sha256:cfac69017ef97db2438efb854edf24f5a29fd09a536ff3a992b75990720cdc99"}, + {file = "propcache-0.2.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:63f13bf09cc3336eb04a837490b8f332e0db41da66995c9fd1ba04552e516354"}, + {file = "propcache-0.2.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:608cce1da6f2672a56b24a015b42db4ac612ee709f3d29f27a00c943d9e851de"}, + {file = "propcache-0.2.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:466c219deee4536fbc83c08d09115249db301550625c7fef1c5563a584c9bc87"}, + {file = "propcache-0.2.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fc2db02409338bf36590aa985a461b2c96fce91f8e7e0f14c50c5fcc4f229016"}, + {file = "propcache-0.2.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a6ed8db0a556343d566a5c124ee483ae113acc9a557a807d439bcecc44e7dfbb"}, + {file = "propcache-0.2.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:91997d9cb4a325b60d4e3f20967f8eb08dfcb32b22554d5ef78e6fd1dda743a2"}, + {file = "propcache-0.2.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4c7dde9e533c0a49d802b4f3f218fa9ad0a1ce21f2c2eb80d5216565202acab4"}, + {file = "propcache-0.2.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ffcad6c564fe6b9b8916c1aefbb37a362deebf9394bd2974e9d84232e3e08504"}, + {file = "propcache-0.2.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:97a58a28bcf63284e8b4d7b460cbee1edaab24634e82059c7b8c09e65284f178"}, + {file = "propcache-0.2.0-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:945db8ee295d3af9dbdbb698cce9bbc5c59b5c3fe328bbc4387f59a8a35f998d"}, + {file = "propcache-0.2.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:39e104da444a34830751715f45ef9fc537475ba21b7f1f5b0f4d71a3b60d7fe2"}, + {file = "propcache-0.2.0-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:c5ecca8f9bab618340c8e848d340baf68bcd8ad90a8ecd7a4524a81c1764b3db"}, + {file = "propcache-0.2.0-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:c436130cc779806bdf5d5fae0d848713105472b8566b75ff70048c47d3961c5b"}, + {file = "propcache-0.2.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:191db28dc6dcd29d1a3e063c3be0b40688ed76434622c53a284e5427565bbd9b"}, + {file = "propcache-0.2.0-cp311-cp311-win32.whl", hash = "sha256:5f2564ec89058ee7c7989a7b719115bdfe2a2fb8e7a4543b8d1c0cc4cf6478c1"}, + {file = "propcache-0.2.0-cp311-cp311-win_amd64.whl", hash = "sha256:6e2e54267980349b723cff366d1e29b138b9a60fa376664a157a342689553f71"}, + {file = "propcache-0.2.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:2ee7606193fb267be4b2e3b32714f2d58cad27217638db98a60f9efb5efeccc2"}, + {file = "propcache-0.2.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:91ee8fc02ca52e24bcb77b234f22afc03288e1dafbb1f88fe24db308910c4ac7"}, + {file = "propcache-0.2.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:2e900bad2a8456d00a113cad8c13343f3b1f327534e3589acc2219729237a2e8"}, + {file = "propcache-0.2.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f52a68c21363c45297aca15561812d542f8fc683c85201df0bebe209e349f793"}, + {file = "propcache-0.2.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1e41d67757ff4fbc8ef2af99b338bfb955010444b92929e9e55a6d4dcc3c4f09"}, + {file = "propcache-0.2.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a64e32f8bd94c105cc27f42d3b658902b5bcc947ece3c8fe7bc1b05982f60e89"}, + {file = "propcache-0.2.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:55346705687dbd7ef0d77883ab4f6fabc48232f587925bdaf95219bae072491e"}, + {file = "propcache-0.2.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:00181262b17e517df2cd85656fcd6b4e70946fe62cd625b9d74ac9977b64d8d9"}, + {file = "propcache-0.2.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:6994984550eaf25dd7fc7bd1b700ff45c894149341725bb4edc67f0ffa94efa4"}, + {file = "propcache-0.2.0-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:56295eb1e5f3aecd516d91b00cfd8bf3a13991de5a479df9e27dd569ea23959c"}, + {file = "propcache-0.2.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:439e76255daa0f8151d3cb325f6dd4a3e93043e6403e6491813bcaaaa8733887"}, + {file = "propcache-0.2.0-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:f6475a1b2ecb310c98c28d271a30df74f9dd436ee46d09236a6b750a7599ce57"}, + {file = "propcache-0.2.0-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:3444cdba6628accf384e349014084b1cacd866fbb88433cd9d279d90a54e0b23"}, + {file = "propcache-0.2.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:4a9d9b4d0a9b38d1c391bb4ad24aa65f306c6f01b512e10a8a34a2dc5675d348"}, + {file = "propcache-0.2.0-cp312-cp312-win32.whl", hash = "sha256:69d3a98eebae99a420d4b28756c8ce6ea5a29291baf2dc9ff9414b42676f61d5"}, + {file = "propcache-0.2.0-cp312-cp312-win_amd64.whl", hash = "sha256:ad9c9b99b05f163109466638bd30ada1722abb01bbb85c739c50b6dc11f92dc3"}, + {file = "propcache-0.2.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:ecddc221a077a8132cf7c747d5352a15ed763b674c0448d811f408bf803d9ad7"}, + {file = "propcache-0.2.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:0e53cb83fdd61cbd67202735e6a6687a7b491c8742dfc39c9e01e80354956763"}, + {file = "propcache-0.2.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:92fe151145a990c22cbccf9ae15cae8ae9eddabfc949a219c9f667877e40853d"}, + {file = "propcache-0.2.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d6a21ef516d36909931a2967621eecb256018aeb11fc48656e3257e73e2e247a"}, + {file = "propcache-0.2.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3f88a4095e913f98988f5b338c1d4d5d07dbb0b6bad19892fd447484e483ba6b"}, + {file = "propcache-0.2.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5a5b3bb545ead161be780ee85a2b54fdf7092815995661947812dde94a40f6fb"}, + {file = "propcache-0.2.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:67aeb72e0f482709991aa91345a831d0b707d16b0257e8ef88a2ad246a7280bf"}, + {file = "propcache-0.2.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3c997f8c44ec9b9b0bcbf2d422cc00a1d9b9c681f56efa6ca149a941e5560da2"}, + {file = "propcache-0.2.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:2a66df3d4992bc1d725b9aa803e8c5a66c010c65c741ad901e260ece77f58d2f"}, + {file = "propcache-0.2.0-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:3ebbcf2a07621f29638799828b8d8668c421bfb94c6cb04269130d8de4fb7136"}, + {file = "propcache-0.2.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:1235c01ddaa80da8235741e80815ce381c5267f96cc49b1477fdcf8c047ef325"}, + {file = "propcache-0.2.0-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:3947483a381259c06921612550867b37d22e1df6d6d7e8361264b6d037595f44"}, + {file = "propcache-0.2.0-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:d5bed7f9805cc29c780f3aee05de3262ee7ce1f47083cfe9f77471e9d6777e83"}, + {file = "propcache-0.2.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:e4a91d44379f45f5e540971d41e4626dacd7f01004826a18cb048e7da7e96544"}, + {file = "propcache-0.2.0-cp313-cp313-win32.whl", hash = "sha256:f902804113e032e2cdf8c71015651c97af6418363bea8d78dc0911d56c335032"}, + {file = "propcache-0.2.0-cp313-cp313-win_amd64.whl", hash = "sha256:8f188cfcc64fb1266f4684206c9de0e80f54622c3f22a910cbd200478aeae61e"}, + {file = "propcache-0.2.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:53d1bd3f979ed529f0805dd35ddaca330f80a9a6d90bc0121d2ff398f8ed8861"}, + {file = "propcache-0.2.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:83928404adf8fb3d26793665633ea79b7361efa0287dfbd372a7e74311d51ee6"}, + {file = "propcache-0.2.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:77a86c261679ea5f3896ec060be9dc8e365788248cc1e049632a1be682442063"}, + {file = "propcache-0.2.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:218db2a3c297a3768c11a34812e63b3ac1c3234c3a086def9c0fee50d35add1f"}, + {file = "propcache-0.2.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:7735e82e3498c27bcb2d17cb65d62c14f1100b71723b68362872bca7d0913d90"}, + {file = "propcache-0.2.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:20a617c776f520c3875cf4511e0d1db847a076d720714ae35ffe0df3e440be68"}, + {file = "propcache-0.2.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:67b69535c870670c9f9b14a75d28baa32221d06f6b6fa6f77a0a13c5a7b0a5b9"}, + {file = "propcache-0.2.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4569158070180c3855e9c0791c56be3ceeb192defa2cdf6a3f39e54319e56b89"}, + {file = "propcache-0.2.0-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:db47514ffdbd91ccdc7e6f8407aac4ee94cc871b15b577c1c324236b013ddd04"}, + {file = "propcache-0.2.0-cp38-cp38-musllinux_1_2_armv7l.whl", hash = "sha256:2a60ad3e2553a74168d275a0ef35e8c0a965448ffbc3b300ab3a5bb9956c2162"}, + {file = "propcache-0.2.0-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:662dd62358bdeaca0aee5761de8727cfd6861432e3bb828dc2a693aa0471a563"}, + {file = "propcache-0.2.0-cp38-cp38-musllinux_1_2_ppc64le.whl", hash = "sha256:25a1f88b471b3bc911d18b935ecb7115dff3a192b6fef46f0bfaf71ff4f12418"}, + {file = "propcache-0.2.0-cp38-cp38-musllinux_1_2_s390x.whl", hash = "sha256:f60f0ac7005b9f5a6091009b09a419ace1610e163fa5deaba5ce3484341840e7"}, + {file = "propcache-0.2.0-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:74acd6e291f885678631b7ebc85d2d4aec458dd849b8c841b57ef04047833bed"}, + {file = "propcache-0.2.0-cp38-cp38-win32.whl", hash = "sha256:d9b6ddac6408194e934002a69bcaadbc88c10b5f38fb9307779d1c629181815d"}, + {file = "propcache-0.2.0-cp38-cp38-win_amd64.whl", hash = "sha256:676135dcf3262c9c5081cc8f19ad55c8a64e3f7282a21266d05544450bffc3a5"}, + {file = "propcache-0.2.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:25c8d773a62ce0451b020c7b29a35cfbc05de8b291163a7a0f3b7904f27253e6"}, + {file = "propcache-0.2.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:375a12d7556d462dc64d70475a9ee5982465fbb3d2b364f16b86ba9135793638"}, + {file = "propcache-0.2.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:1ec43d76b9677637a89d6ab86e1fef70d739217fefa208c65352ecf0282be957"}, + {file = "propcache-0.2.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f45eec587dafd4b2d41ac189c2156461ebd0c1082d2fe7013571598abb8505d1"}, + {file = "propcache-0.2.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:bc092ba439d91df90aea38168e11f75c655880c12782facf5cf9c00f3d42b562"}, + {file = "propcache-0.2.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:fa1076244f54bb76e65e22cb6910365779d5c3d71d1f18b275f1dfc7b0d71b4d"}, + {file = "propcache-0.2.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:682a7c79a2fbf40f5dbb1eb6bfe2cd865376deeac65acf9beb607505dced9e12"}, + {file = "propcache-0.2.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8e40876731f99b6f3c897b66b803c9e1c07a989b366c6b5b475fafd1f7ba3fb8"}, + {file = "propcache-0.2.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:363ea8cd3c5cb6679f1c2f5f1f9669587361c062e4899fce56758efa928728f8"}, + {file = "propcache-0.2.0-cp39-cp39-musllinux_1_2_armv7l.whl", hash = "sha256:140fbf08ab3588b3468932974a9331aff43c0ab8a2ec2c608b6d7d1756dbb6cb"}, + {file = "propcache-0.2.0-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:e70fac33e8b4ac63dfc4c956fd7d85a0b1139adcfc0d964ce288b7c527537fea"}, + {file = "propcache-0.2.0-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:b33d7a286c0dc1a15f5fc864cc48ae92a846df287ceac2dd499926c3801054a6"}, + {file = "propcache-0.2.0-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:f6d5749fdd33d90e34c2efb174c7e236829147a2713334d708746e94c4bde40d"}, + {file = "propcache-0.2.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:22aa8f2272d81d9317ff5756bb108021a056805ce63dd3630e27d042c8092798"}, + {file = "propcache-0.2.0-cp39-cp39-win32.whl", hash = "sha256:73e4b40ea0eda421b115248d7e79b59214411109a5bc47d0d48e4c73e3b8fcf9"}, + {file = "propcache-0.2.0-cp39-cp39-win_amd64.whl", hash = "sha256:9517d5e9e0731957468c29dbfd0f976736a0e55afaea843726e887f36fe017df"}, + {file = "propcache-0.2.0-py3-none-any.whl", hash = "sha256:2ccc28197af5313706511fab3a8b66dcd6da067a1331372c82ea1cb74285e036"}, + {file = "propcache-0.2.0.tar.gz", hash = "sha256:df81779732feb9d01e5d513fad0122efb3d53bbc75f61b2a4f29a020bc985e70"}, +] + [[package]] name = "protobuf" -version = "4.25.4" +version = "4.25.5" description = "" optional = false python-versions = ">=3.8" files = [ - {file = "protobuf-4.25.4-cp310-abi3-win32.whl", hash = "sha256:db9fd45183e1a67722cafa5c1da3e85c6492a5383f127c86c4c4aa4845867dc4"}, - {file = "protobuf-4.25.4-cp310-abi3-win_amd64.whl", hash = "sha256:ba3d8504116a921af46499471c63a85260c1a5fc23333154a427a310e015d26d"}, - {file = "protobuf-4.25.4-cp37-abi3-macosx_10_9_universal2.whl", hash = "sha256:eecd41bfc0e4b1bd3fa7909ed93dd14dd5567b98c941d6c1ad08fdcab3d6884b"}, - {file = "protobuf-4.25.4-cp37-abi3-manylinux2014_aarch64.whl", hash = "sha256:4c8a70fdcb995dcf6c8966cfa3a29101916f7225e9afe3ced4395359955d3835"}, - {file = "protobuf-4.25.4-cp37-abi3-manylinux2014_x86_64.whl", hash = "sha256:3319e073562e2515c6ddc643eb92ce20809f5d8f10fead3332f71c63be6a7040"}, - {file = "protobuf-4.25.4-cp38-cp38-win32.whl", hash = "sha256:7e372cbbda66a63ebca18f8ffaa6948455dfecc4e9c1029312f6c2edcd86c4e1"}, - {file = "protobuf-4.25.4-cp38-cp38-win_amd64.whl", hash = "sha256:051e97ce9fa6067a4546e75cb14f90cf0232dcb3e3d508c448b8d0e4265b61c1"}, - {file = "protobuf-4.25.4-cp39-cp39-win32.whl", hash = "sha256:90bf6fd378494eb698805bbbe7afe6c5d12c8e17fca817a646cd6a1818c696ca"}, - {file = "protobuf-4.25.4-cp39-cp39-win_amd64.whl", hash = "sha256:ac79a48d6b99dfed2729ccccee547b34a1d3d63289c71cef056653a846a2240f"}, - {file = "protobuf-4.25.4-py3-none-any.whl", hash = "sha256:bfbebc1c8e4793cfd58589acfb8a1026be0003e852b9da7db5a4285bde996978"}, - {file = "protobuf-4.25.4.tar.gz", hash = "sha256:0dc4a62cc4052a036ee2204d26fe4d835c62827c855c8a03f29fe6da146b380d"}, + {file = "protobuf-4.25.5-cp310-abi3-win32.whl", hash = "sha256:5e61fd921603f58d2f5acb2806a929b4675f8874ff5f330b7d6f7e2e784bbcd8"}, + {file = "protobuf-4.25.5-cp310-abi3-win_amd64.whl", hash = "sha256:4be0571adcbe712b282a330c6e89eae24281344429ae95c6d85e79e84780f5ea"}, + {file = "protobuf-4.25.5-cp37-abi3-macosx_10_9_universal2.whl", hash = "sha256:b2fde3d805354df675ea4c7c6338c1aecd254dfc9925e88c6d31a2bcb97eb173"}, + {file = "protobuf-4.25.5-cp37-abi3-manylinux2014_aarch64.whl", hash = "sha256:919ad92d9b0310070f8356c24b855c98df2b8bd207ebc1c0c6fcc9ab1e007f3d"}, + {file = "protobuf-4.25.5-cp37-abi3-manylinux2014_x86_64.whl", hash = "sha256:fe14e16c22be926d3abfcb500e60cab068baf10b542b8c858fa27e098123e331"}, + {file = "protobuf-4.25.5-cp38-cp38-win32.whl", hash = "sha256:98d8d8aa50de6a2747efd9cceba361c9034050ecce3e09136f90de37ddba66e1"}, + {file = "protobuf-4.25.5-cp38-cp38-win_amd64.whl", hash = "sha256:b0234dd5a03049e4ddd94b93400b67803c823cfc405689688f59b34e0742381a"}, + {file = "protobuf-4.25.5-cp39-cp39-win32.whl", hash = "sha256:abe32aad8561aa7cc94fc7ba4fdef646e576983edb94a73381b03c53728a626f"}, + {file = "protobuf-4.25.5-cp39-cp39-win_amd64.whl", hash = "sha256:7a183f592dc80aa7c8da7ad9e55091c4ffc9497b3054452d629bb85fa27c2a45"}, + {file = "protobuf-4.25.5-py3-none-any.whl", hash = "sha256:0aebecb809cae990f8129ada5ca273d9d670b76d9bfc9b1809f0a9c02b7dbf41"}, + {file = "protobuf-4.25.5.tar.gz", hash = "sha256:7f8249476b4a9473645db7f8ab42b02fe1488cbe5fb72fddd445e0665afd8584"}, ] [[package]] @@ -1177,18 +1357,18 @@ files = [ [[package]] name = "pydantic" -version = "2.8.2" +version = "2.9.2" description = "Data validation using Python type hints" optional = false python-versions = ">=3.8" files = [ - {file = "pydantic-2.8.2-py3-none-any.whl", hash = "sha256:73ee9fddd406dc318b885c7a2eab8a6472b68b8fb5ba8150949fc3db939f23c8"}, - {file = "pydantic-2.8.2.tar.gz", hash = "sha256:6f62c13d067b0755ad1c21a34bdd06c0c12625a22b0fc09c6b149816604f7c2a"}, + {file = "pydantic-2.9.2-py3-none-any.whl", hash = "sha256:f048cec7b26778210e28a0459867920654d48e5e62db0958433636cde4254f12"}, + {file = "pydantic-2.9.2.tar.gz", hash = "sha256:d155cef71265d1e9807ed1c32b4c8deec042a44a50a4188b25ac67ecd81a9c0f"}, ] [package.dependencies] -annotated-types = ">=0.4.0" -pydantic-core = "2.20.1" +annotated-types = ">=0.6.0" +pydantic-core = "2.23.4" typing-extensions = [ {version = ">=4.12.2", markers = "python_version >= \"3.13\""}, {version = ">=4.6.1", markers = "python_version < \"3.13\""}, @@ -1196,103 +1376,104 @@ typing-extensions = [ [package.extras] email = ["email-validator (>=2.0.0)"] +timezone = ["tzdata"] [[package]] name = "pydantic-core" -version = "2.20.1" +version = "2.23.4" description = "Core functionality for Pydantic validation and serialization" optional = false python-versions = ">=3.8" files = [ - {file = "pydantic_core-2.20.1-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:3acae97ffd19bf091c72df4d726d552c473f3576409b2a7ca36b2f535ffff4a3"}, - {file = "pydantic_core-2.20.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:41f4c96227a67a013e7de5ff8f20fb496ce573893b7f4f2707d065907bffdbd6"}, - {file = "pydantic_core-2.20.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5f239eb799a2081495ea659d8d4a43a8f42cd1fe9ff2e7e436295c38a10c286a"}, - {file = "pydantic_core-2.20.1-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:53e431da3fc53360db73eedf6f7124d1076e1b4ee4276b36fb25514544ceb4a3"}, - {file = "pydantic_core-2.20.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f1f62b2413c3a0e846c3b838b2ecd6c7a19ec6793b2a522745b0869e37ab5bc1"}, - {file = "pydantic_core-2.20.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5d41e6daee2813ecceea8eda38062d69e280b39df793f5a942fa515b8ed67953"}, - {file = "pydantic_core-2.20.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3d482efec8b7dc6bfaedc0f166b2ce349df0011f5d2f1f25537ced4cfc34fd98"}, - {file = "pydantic_core-2.20.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:e93e1a4b4b33daed65d781a57a522ff153dcf748dee70b40c7258c5861e1768a"}, - {file = "pydantic_core-2.20.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:e7c4ea22b6739b162c9ecaaa41d718dfad48a244909fe7ef4b54c0b530effc5a"}, - {file = "pydantic_core-2.20.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:4f2790949cf385d985a31984907fecb3896999329103df4e4983a4a41e13e840"}, - {file = "pydantic_core-2.20.1-cp310-none-win32.whl", hash = "sha256:5e999ba8dd90e93d57410c5e67ebb67ffcaadcea0ad973240fdfd3a135506250"}, - {file = "pydantic_core-2.20.1-cp310-none-win_amd64.whl", hash = "sha256:512ecfbefef6dac7bc5eaaf46177b2de58cdf7acac8793fe033b24ece0b9566c"}, - {file = "pydantic_core-2.20.1-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:d2a8fa9d6d6f891f3deec72f5cc668e6f66b188ab14bb1ab52422fe8e644f312"}, - {file = "pydantic_core-2.20.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:175873691124f3d0da55aeea1d90660a6ea7a3cfea137c38afa0a5ffabe37b88"}, - {file = "pydantic_core-2.20.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:37eee5b638f0e0dcd18d21f59b679686bbd18917b87db0193ae36f9c23c355fc"}, - {file = "pydantic_core-2.20.1-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:25e9185e2d06c16ee438ed39bf62935ec436474a6ac4f9358524220f1b236e43"}, - {file = "pydantic_core-2.20.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:150906b40ff188a3260cbee25380e7494ee85048584998c1e66df0c7a11c17a6"}, - {file = "pydantic_core-2.20.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8ad4aeb3e9a97286573c03df758fc7627aecdd02f1da04516a86dc159bf70121"}, - {file = "pydantic_core-2.20.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d3f3ed29cd9f978c604708511a1f9c2fdcb6c38b9aae36a51905b8811ee5cbf1"}, - {file = "pydantic_core-2.20.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:b0dae11d8f5ded51699c74d9548dcc5938e0804cc8298ec0aa0da95c21fff57b"}, - {file = "pydantic_core-2.20.1-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:faa6b09ee09433b87992fb5a2859efd1c264ddc37280d2dd5db502126d0e7f27"}, - {file = "pydantic_core-2.20.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:9dc1b507c12eb0481d071f3c1808f0529ad41dc415d0ca11f7ebfc666e66a18b"}, - {file = "pydantic_core-2.20.1-cp311-none-win32.whl", hash = "sha256:fa2fddcb7107e0d1808086ca306dcade7df60a13a6c347a7acf1ec139aa6789a"}, - {file = "pydantic_core-2.20.1-cp311-none-win_amd64.whl", hash = "sha256:40a783fb7ee353c50bd3853e626f15677ea527ae556429453685ae32280c19c2"}, - {file = "pydantic_core-2.20.1-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:595ba5be69b35777474fa07f80fc260ea71255656191adb22a8c53aba4479231"}, - {file = "pydantic_core-2.20.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:a4f55095ad087474999ee28d3398bae183a66be4823f753cd7d67dd0153427c9"}, - {file = "pydantic_core-2.20.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f9aa05d09ecf4c75157197f27cdc9cfaeb7c5f15021c6373932bf3e124af029f"}, - {file = "pydantic_core-2.20.1-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:e97fdf088d4b31ff4ba35db26d9cc472ac7ef4a2ff2badeabf8d727b3377fc52"}, - {file = "pydantic_core-2.20.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:bc633a9fe1eb87e250b5c57d389cf28998e4292336926b0b6cdaee353f89a237"}, - {file = "pydantic_core-2.20.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d573faf8eb7e6b1cbbcb4f5b247c60ca8be39fe2c674495df0eb4318303137fe"}, - {file = "pydantic_core-2.20.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:26dc97754b57d2fd00ac2b24dfa341abffc380b823211994c4efac7f13b9e90e"}, - {file = "pydantic_core-2.20.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:33499e85e739a4b60c9dac710c20a08dc73cb3240c9a0e22325e671b27b70d24"}, - {file = "pydantic_core-2.20.1-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:bebb4d6715c814597f85297c332297c6ce81e29436125ca59d1159b07f423eb1"}, - {file = "pydantic_core-2.20.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:516d9227919612425c8ef1c9b869bbbee249bc91912c8aaffb66116c0b447ebd"}, - {file = "pydantic_core-2.20.1-cp312-none-win32.whl", hash = "sha256:469f29f9093c9d834432034d33f5fe45699e664f12a13bf38c04967ce233d688"}, - {file = "pydantic_core-2.20.1-cp312-none-win_amd64.whl", hash = "sha256:035ede2e16da7281041f0e626459bcae33ed998cca6a0a007a5ebb73414ac72d"}, - {file = "pydantic_core-2.20.1-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:0827505a5c87e8aa285dc31e9ec7f4a17c81a813d45f70b1d9164e03a813a686"}, - {file = "pydantic_core-2.20.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:19c0fa39fa154e7e0b7f82f88ef85faa2a4c23cc65aae2f5aea625e3c13c735a"}, - {file = "pydantic_core-2.20.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4aa223cd1e36b642092c326d694d8bf59b71ddddc94cdb752bbbb1c5c91d833b"}, - {file = "pydantic_core-2.20.1-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:c336a6d235522a62fef872c6295a42ecb0c4e1d0f1a3e500fe949415761b8a19"}, - {file = "pydantic_core-2.20.1-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:7eb6a0587eded33aeefea9f916899d42b1799b7b14b8f8ff2753c0ac1741edac"}, - {file = "pydantic_core-2.20.1-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:70c8daf4faca8da5a6d655f9af86faf6ec2e1768f4b8b9d0226c02f3d6209703"}, - {file = "pydantic_core-2.20.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e9fa4c9bf273ca41f940bceb86922a7667cd5bf90e95dbb157cbb8441008482c"}, - {file = "pydantic_core-2.20.1-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:11b71d67b4725e7e2a9f6e9c0ac1239bbc0c48cce3dc59f98635efc57d6dac83"}, - {file = "pydantic_core-2.20.1-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:270755f15174fb983890c49881e93f8f1b80f0b5e3a3cc1394a255706cabd203"}, - {file = "pydantic_core-2.20.1-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:c81131869240e3e568916ef4c307f8b99583efaa60a8112ef27a366eefba8ef0"}, - {file = "pydantic_core-2.20.1-cp313-none-win32.whl", hash = "sha256:b91ced227c41aa29c672814f50dbb05ec93536abf8f43cd14ec9521ea09afe4e"}, - {file = "pydantic_core-2.20.1-cp313-none-win_amd64.whl", hash = "sha256:65db0f2eefcaad1a3950f498aabb4875c8890438bc80b19362cf633b87a8ab20"}, - {file = "pydantic_core-2.20.1-cp38-cp38-macosx_10_12_x86_64.whl", hash = "sha256:4745f4ac52cc6686390c40eaa01d48b18997cb130833154801a442323cc78f91"}, - {file = "pydantic_core-2.20.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:a8ad4c766d3f33ba8fd692f9aa297c9058970530a32c728a2c4bfd2616d3358b"}, - {file = "pydantic_core-2.20.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:41e81317dd6a0127cabce83c0c9c3fbecceae981c8391e6f1dec88a77c8a569a"}, - {file = "pydantic_core-2.20.1-cp38-cp38-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:04024d270cf63f586ad41fff13fde4311c4fc13ea74676962c876d9577bcc78f"}, - {file = "pydantic_core-2.20.1-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:eaad4ff2de1c3823fddf82f41121bdf453d922e9a238642b1dedb33c4e4f98ad"}, - {file = "pydantic_core-2.20.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:26ab812fa0c845df815e506be30337e2df27e88399b985d0bb4e3ecfe72df31c"}, - {file = "pydantic_core-2.20.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3c5ebac750d9d5f2706654c638c041635c385596caf68f81342011ddfa1e5598"}, - {file = "pydantic_core-2.20.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:2aafc5a503855ea5885559eae883978c9b6d8c8993d67766ee73d82e841300dd"}, - {file = "pydantic_core-2.20.1-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:4868f6bd7c9d98904b748a2653031fc9c2f85b6237009d475b1008bfaeb0a5aa"}, - {file = "pydantic_core-2.20.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:aa2f457b4af386254372dfa78a2eda2563680d982422641a85f271c859df1987"}, - {file = "pydantic_core-2.20.1-cp38-none-win32.whl", hash = "sha256:225b67a1f6d602de0ce7f6c1c3ae89a4aa25d3de9be857999e9124f15dab486a"}, - {file = "pydantic_core-2.20.1-cp38-none-win_amd64.whl", hash = "sha256:6b507132dcfc0dea440cce23ee2182c0ce7aba7054576efc65634f080dbe9434"}, - {file = "pydantic_core-2.20.1-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:b03f7941783b4c4a26051846dea594628b38f6940a2fdc0df00b221aed39314c"}, - {file = "pydantic_core-2.20.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:1eedfeb6089ed3fad42e81a67755846ad4dcc14d73698c120a82e4ccf0f1f9f6"}, - {file = "pydantic_core-2.20.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:635fee4e041ab9c479e31edda27fcf966ea9614fff1317e280d99eb3e5ab6fe2"}, - {file = "pydantic_core-2.20.1-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:77bf3ac639c1ff567ae3b47f8d4cc3dc20f9966a2a6dd2311dcc055d3d04fb8a"}, - {file = "pydantic_core-2.20.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:7ed1b0132f24beeec5a78b67d9388656d03e6a7c837394f99257e2d55b461611"}, - {file = "pydantic_core-2.20.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c6514f963b023aeee506678a1cf821fe31159b925c4b76fe2afa94cc70b3222b"}, - {file = "pydantic_core-2.20.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:10d4204d8ca33146e761c79f83cc861df20e7ae9f6487ca290a97702daf56006"}, - {file = "pydantic_core-2.20.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:2d036c7187b9422ae5b262badb87a20a49eb6c5238b2004e96d4da1231badef1"}, - {file = "pydantic_core-2.20.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:9ebfef07dbe1d93efb94b4700f2d278494e9162565a54f124c404a5656d7ff09"}, - {file = "pydantic_core-2.20.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:6b9d9bb600328a1ce523ab4f454859e9d439150abb0906c5a1983c146580ebab"}, - {file = "pydantic_core-2.20.1-cp39-none-win32.whl", hash = "sha256:784c1214cb6dd1e3b15dd8b91b9a53852aed16671cc3fbe4786f4f1db07089e2"}, - {file = "pydantic_core-2.20.1-cp39-none-win_amd64.whl", hash = "sha256:d2fe69c5434391727efa54b47a1e7986bb0186e72a41b203df8f5b0a19a4f669"}, - {file = "pydantic_core-2.20.1-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:a45f84b09ac9c3d35dfcf6a27fd0634d30d183205230a0ebe8373a0e8cfa0906"}, - {file = "pydantic_core-2.20.1-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:d02a72df14dfdbaf228424573a07af10637bd490f0901cee872c4f434a735b94"}, - {file = "pydantic_core-2.20.1-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d2b27e6af28f07e2f195552b37d7d66b150adbaa39a6d327766ffd695799780f"}, - {file = "pydantic_core-2.20.1-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:084659fac3c83fd674596612aeff6041a18402f1e1bc19ca39e417d554468482"}, - {file = "pydantic_core-2.20.1-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:242b8feb3c493ab78be289c034a1f659e8826e2233786e36f2893a950a719bb6"}, - {file = "pydantic_core-2.20.1-pp310-pypy310_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:38cf1c40a921d05c5edc61a785c0ddb4bed67827069f535d794ce6bcded919fc"}, - {file = "pydantic_core-2.20.1-pp310-pypy310_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:e0bbdd76ce9aa5d4209d65f2b27fc6e5ef1312ae6c5333c26db3f5ade53a1e99"}, - {file = "pydantic_core-2.20.1-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:254ec27fdb5b1ee60684f91683be95e5133c994cc54e86a0b0963afa25c8f8a6"}, - {file = "pydantic_core-2.20.1-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:407653af5617f0757261ae249d3fba09504d7a71ab36ac057c938572d1bc9331"}, - {file = "pydantic_core-2.20.1-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:c693e916709c2465b02ca0ad7b387c4f8423d1db7b4649c551f27a529181c5ad"}, - {file = "pydantic_core-2.20.1-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5b5ff4911aea936a47d9376fd3ab17e970cc543d1b68921886e7f64bd28308d1"}, - {file = "pydantic_core-2.20.1-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:177f55a886d74f1808763976ac4efd29b7ed15c69f4d838bbd74d9d09cf6fa86"}, - {file = "pydantic_core-2.20.1-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:964faa8a861d2664f0c7ab0c181af0bea66098b1919439815ca8803ef136fc4e"}, - {file = "pydantic_core-2.20.1-pp39-pypy39_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:4dd484681c15e6b9a977c785a345d3e378d72678fd5f1f3c0509608da24f2ac0"}, - {file = "pydantic_core-2.20.1-pp39-pypy39_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:f6d6cff3538391e8486a431569b77921adfcdef14eb18fbf19b7c0a5294d4e6a"}, - {file = "pydantic_core-2.20.1-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:a6d511cc297ff0883bc3708b465ff82d7560193169a8b93260f74ecb0a5e08a7"}, - {file = "pydantic_core-2.20.1.tar.gz", hash = "sha256:26ca695eeee5f9f1aeeb211ffc12f10bcb6f71e2989988fda61dabd65db878d4"}, + {file = "pydantic_core-2.23.4-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:b10bd51f823d891193d4717448fab065733958bdb6a6b351967bd349d48d5c9b"}, + {file = "pydantic_core-2.23.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:4fc714bdbfb534f94034efaa6eadd74e5b93c8fa6315565a222f7b6f42ca1166"}, + {file = "pydantic_core-2.23.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:63e46b3169866bd62849936de036f901a9356e36376079b05efa83caeaa02ceb"}, + {file = "pydantic_core-2.23.4-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:ed1a53de42fbe34853ba90513cea21673481cd81ed1be739f7f2efb931b24916"}, + {file = "pydantic_core-2.23.4-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:cfdd16ab5e59fc31b5e906d1a3f666571abc367598e3e02c83403acabc092e07"}, + {file = "pydantic_core-2.23.4-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:255a8ef062cbf6674450e668482456abac99a5583bbafb73f9ad469540a3a232"}, + {file = "pydantic_core-2.23.4-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4a7cd62e831afe623fbb7aabbb4fe583212115b3ef38a9f6b71869ba644624a2"}, + {file = "pydantic_core-2.23.4-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:f09e2ff1f17c2b51f2bc76d1cc33da96298f0a036a137f5440ab3ec5360b624f"}, + {file = "pydantic_core-2.23.4-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:e38e63e6f3d1cec5a27e0afe90a085af8b6806ee208b33030e65b6516353f1a3"}, + {file = "pydantic_core-2.23.4-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:0dbd8dbed2085ed23b5c04afa29d8fd2771674223135dc9bc937f3c09284d071"}, + {file = "pydantic_core-2.23.4-cp310-none-win32.whl", hash = "sha256:6531b7ca5f951d663c339002e91aaebda765ec7d61b7d1e3991051906ddde119"}, + {file = "pydantic_core-2.23.4-cp310-none-win_amd64.whl", hash = "sha256:7c9129eb40958b3d4500fa2467e6a83356b3b61bfff1b414c7361d9220f9ae8f"}, + {file = "pydantic_core-2.23.4-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:77733e3892bb0a7fa797826361ce8a9184d25c8dffaec60b7ffe928153680ba8"}, + {file = "pydantic_core-2.23.4-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:1b84d168f6c48fabd1f2027a3d1bdfe62f92cade1fb273a5d68e621da0e44e6d"}, + {file = "pydantic_core-2.23.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:df49e7a0861a8c36d089c1ed57d308623d60416dab2647a4a17fe050ba85de0e"}, + {file = "pydantic_core-2.23.4-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:ff02b6d461a6de369f07ec15e465a88895f3223eb75073ffea56b84d9331f607"}, + {file = "pydantic_core-2.23.4-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:996a38a83508c54c78a5f41456b0103c30508fed9abcad0a59b876d7398f25fd"}, + {file = "pydantic_core-2.23.4-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d97683ddee4723ae8c95d1eddac7c192e8c552da0c73a925a89fa8649bf13eea"}, + {file = "pydantic_core-2.23.4-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:216f9b2d7713eb98cb83c80b9c794de1f6b7e3145eef40400c62e86cee5f4e1e"}, + {file = "pydantic_core-2.23.4-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:6f783e0ec4803c787bcea93e13e9932edab72068f68ecffdf86a99fd5918878b"}, + {file = "pydantic_core-2.23.4-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:d0776dea117cf5272382634bd2a5c1b6eb16767c223c6a5317cd3e2a757c61a0"}, + {file = "pydantic_core-2.23.4-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:d5f7a395a8cf1621939692dba2a6b6a830efa6b3cee787d82c7de1ad2930de64"}, + {file = "pydantic_core-2.23.4-cp311-none-win32.whl", hash = "sha256:74b9127ffea03643e998e0c5ad9bd3811d3dac8c676e47db17b0ee7c3c3bf35f"}, + {file = "pydantic_core-2.23.4-cp311-none-win_amd64.whl", hash = "sha256:98d134c954828488b153d88ba1f34e14259284f256180ce659e8d83e9c05eaa3"}, + {file = "pydantic_core-2.23.4-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:f3e0da4ebaef65158d4dfd7d3678aad692f7666877df0002b8a522cdf088f231"}, + {file = "pydantic_core-2.23.4-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:f69a8e0b033b747bb3e36a44e7732f0c99f7edd5cea723d45bc0d6e95377ffee"}, + {file = "pydantic_core-2.23.4-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:723314c1d51722ab28bfcd5240d858512ffd3116449c557a1336cbe3919beb87"}, + {file = "pydantic_core-2.23.4-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:bb2802e667b7051a1bebbfe93684841cc9351004e2badbd6411bf357ab8d5ac8"}, + {file = "pydantic_core-2.23.4-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d18ca8148bebe1b0a382a27a8ee60350091a6ddaf475fa05ef50dc35b5df6327"}, + {file = "pydantic_core-2.23.4-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:33e3d65a85a2a4a0dc3b092b938a4062b1a05f3a9abde65ea93b233bca0e03f2"}, + {file = "pydantic_core-2.23.4-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:128585782e5bfa515c590ccee4b727fb76925dd04a98864182b22e89a4e6ed36"}, + {file = "pydantic_core-2.23.4-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:68665f4c17edcceecc112dfed5dbe6f92261fb9d6054b47d01bf6371a6196126"}, + {file = "pydantic_core-2.23.4-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:20152074317d9bed6b7a95ade3b7d6054845d70584216160860425f4fbd5ee9e"}, + {file = "pydantic_core-2.23.4-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:9261d3ce84fa1d38ed649c3638feefeae23d32ba9182963e465d58d62203bd24"}, + {file = "pydantic_core-2.23.4-cp312-none-win32.whl", hash = "sha256:4ba762ed58e8d68657fc1281e9bb72e1c3e79cc5d464be146e260c541ec12d84"}, + {file = "pydantic_core-2.23.4-cp312-none-win_amd64.whl", hash = "sha256:97df63000f4fea395b2824da80e169731088656d1818a11b95f3b173747b6cd9"}, + {file = "pydantic_core-2.23.4-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:7530e201d10d7d14abce4fb54cfe5b94a0aefc87da539d0346a484ead376c3cc"}, + {file = "pydantic_core-2.23.4-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:df933278128ea1cd77772673c73954e53a1c95a4fdf41eef97c2b779271bd0bd"}, + {file = "pydantic_core-2.23.4-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0cb3da3fd1b6a5d0279a01877713dbda118a2a4fc6f0d821a57da2e464793f05"}, + {file = "pydantic_core-2.23.4-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:42c6dcb030aefb668a2b7009c85b27f90e51e6a3b4d5c9bc4c57631292015b0d"}, + {file = "pydantic_core-2.23.4-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:696dd8d674d6ce621ab9d45b205df149399e4bb9aa34102c970b721554828510"}, + {file = "pydantic_core-2.23.4-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2971bb5ffe72cc0f555c13e19b23c85b654dd2a8f7ab493c262071377bfce9f6"}, + {file = "pydantic_core-2.23.4-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8394d940e5d400d04cad4f75c0598665cbb81aecefaca82ca85bd28264af7f9b"}, + {file = "pydantic_core-2.23.4-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:0dff76e0602ca7d4cdaacc1ac4c005e0ce0dcfe095d5b5259163a80d3a10d327"}, + {file = "pydantic_core-2.23.4-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:7d32706badfe136888bdea71c0def994644e09fff0bfe47441deaed8e96fdbc6"}, + {file = "pydantic_core-2.23.4-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:ed541d70698978a20eb63d8c5d72f2cc6d7079d9d90f6b50bad07826f1320f5f"}, + {file = "pydantic_core-2.23.4-cp313-none-win32.whl", hash = "sha256:3d5639516376dce1940ea36edf408c554475369f5da2abd45d44621cb616f769"}, + {file = "pydantic_core-2.23.4-cp313-none-win_amd64.whl", hash = "sha256:5a1504ad17ba4210df3a045132a7baeeba5a200e930f57512ee02909fc5c4cb5"}, + {file = "pydantic_core-2.23.4-cp38-cp38-macosx_10_12_x86_64.whl", hash = "sha256:d4488a93b071c04dc20f5cecc3631fc78b9789dd72483ba15d423b5b3689b555"}, + {file = "pydantic_core-2.23.4-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:81965a16b675b35e1d09dd14df53f190f9129c0202356ed44ab2728b1c905658"}, + {file = "pydantic_core-2.23.4-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4ffa2ebd4c8530079140dd2d7f794a9d9a73cbb8e9d59ffe24c63436efa8f271"}, + {file = "pydantic_core-2.23.4-cp38-cp38-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:61817945f2fe7d166e75fbfb28004034b48e44878177fc54d81688e7b85a3665"}, + {file = "pydantic_core-2.23.4-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:29d2c342c4bc01b88402d60189f3df065fb0dda3654744d5a165a5288a657368"}, + {file = "pydantic_core-2.23.4-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5e11661ce0fd30a6790e8bcdf263b9ec5988e95e63cf901972107efc49218b13"}, + {file = "pydantic_core-2.23.4-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9d18368b137c6295db49ce7218b1a9ba15c5bc254c96d7c9f9e924a9bc7825ad"}, + {file = "pydantic_core-2.23.4-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:ec4e55f79b1c4ffb2eecd8a0cfba9955a2588497d96851f4c8f99aa4a1d39b12"}, + {file = "pydantic_core-2.23.4-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:374a5e5049eda9e0a44c696c7ade3ff355f06b1fe0bb945ea3cac2bc336478a2"}, + {file = "pydantic_core-2.23.4-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:5c364564d17da23db1106787675fc7af45f2f7b58b4173bfdd105564e132e6fb"}, + {file = "pydantic_core-2.23.4-cp38-none-win32.whl", hash = "sha256:d7a80d21d613eec45e3d41eb22f8f94ddc758a6c4720842dc74c0581f54993d6"}, + {file = "pydantic_core-2.23.4-cp38-none-win_amd64.whl", hash = "sha256:5f5ff8d839f4566a474a969508fe1c5e59c31c80d9e140566f9a37bba7b8d556"}, + {file = "pydantic_core-2.23.4-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:a4fa4fc04dff799089689f4fd502ce7d59de529fc2f40a2c8836886c03e0175a"}, + {file = "pydantic_core-2.23.4-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:0a7df63886be5e270da67e0966cf4afbae86069501d35c8c1b3b6c168f42cb36"}, + {file = "pydantic_core-2.23.4-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dcedcd19a557e182628afa1d553c3895a9f825b936415d0dbd3cd0bbcfd29b4b"}, + {file = "pydantic_core-2.23.4-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:5f54b118ce5de9ac21c363d9b3caa6c800341e8c47a508787e5868c6b79c9323"}, + {file = "pydantic_core-2.23.4-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:86d2f57d3e1379a9525c5ab067b27dbb8a0642fb5d454e17a9ac434f9ce523e3"}, + {file = "pydantic_core-2.23.4-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:de6d1d1b9e5101508cb37ab0d972357cac5235f5c6533d1071964c47139257df"}, + {file = "pydantic_core-2.23.4-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1278e0d324f6908e872730c9102b0112477a7f7cf88b308e4fc36ce1bdb6d58c"}, + {file = "pydantic_core-2.23.4-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:9a6b5099eeec78827553827f4c6b8615978bb4b6a88e5d9b93eddf8bb6790f55"}, + {file = "pydantic_core-2.23.4-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:e55541f756f9b3ee346b840103f32779c695a19826a4c442b7954550a0972040"}, + {file = "pydantic_core-2.23.4-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:a5c7ba8ffb6d6f8f2ab08743be203654bb1aaa8c9dcb09f82ddd34eadb695605"}, + {file = "pydantic_core-2.23.4-cp39-none-win32.whl", hash = "sha256:37b0fe330e4a58d3c58b24d91d1eb102aeec675a3db4c292ec3928ecd892a9a6"}, + {file = "pydantic_core-2.23.4-cp39-none-win_amd64.whl", hash = "sha256:1498bec4c05c9c787bde9125cfdcc63a41004ff167f495063191b863399b1a29"}, + {file = "pydantic_core-2.23.4-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:f455ee30a9d61d3e1a15abd5068827773d6e4dc513e795f380cdd59932c782d5"}, + {file = "pydantic_core-2.23.4-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:1e90d2e3bd2c3863d48525d297cd143fe541be8bbf6f579504b9712cb6b643ec"}, + {file = "pydantic_core-2.23.4-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2e203fdf807ac7e12ab59ca2bfcabb38c7cf0b33c41efeb00f8e5da1d86af480"}, + {file = "pydantic_core-2.23.4-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e08277a400de01bc72436a0ccd02bdf596631411f592ad985dcee21445bd0068"}, + {file = "pydantic_core-2.23.4-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:f220b0eea5965dec25480b6333c788fb72ce5f9129e8759ef876a1d805d00801"}, + {file = "pydantic_core-2.23.4-pp310-pypy310_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:d06b0c8da4f16d1d1e352134427cb194a0a6e19ad5db9161bf32b2113409e728"}, + {file = "pydantic_core-2.23.4-pp310-pypy310_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:ba1a0996f6c2773bd83e63f18914c1de3c9dd26d55f4ac302a7efe93fb8e7433"}, + {file = "pydantic_core-2.23.4-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:9a5bce9d23aac8f0cf0836ecfc033896aa8443b501c58d0602dbfd5bd5b37753"}, + {file = "pydantic_core-2.23.4-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:78ddaaa81421a29574a682b3179d4cf9e6d405a09b99d93ddcf7e5239c742e21"}, + {file = "pydantic_core-2.23.4-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:883a91b5dd7d26492ff2f04f40fbb652de40fcc0afe07e8129e8ae779c2110eb"}, + {file = "pydantic_core-2.23.4-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:88ad334a15b32a791ea935af224b9de1bf99bcd62fabf745d5f3442199d86d59"}, + {file = "pydantic_core-2.23.4-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:233710f069d251feb12a56da21e14cca67994eab08362207785cf8c598e74577"}, + {file = "pydantic_core-2.23.4-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:19442362866a753485ba5e4be408964644dd6a09123d9416c54cd49171f50744"}, + {file = "pydantic_core-2.23.4-pp39-pypy39_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:624e278a7d29b6445e4e813af92af37820fafb6dcc55c012c834f9e26f9aaaef"}, + {file = "pydantic_core-2.23.4-pp39-pypy39_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:f5ef8f42bec47f21d07668a043f077d507e5bf4e668d5c6dfe6aaba89de1a5b8"}, + {file = "pydantic_core-2.23.4-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:aea443fffa9fbe3af1a9ba721a87f926fe548d32cab71d188a6ede77d0ff244e"}, + {file = "pydantic_core-2.23.4.tar.gz", hash = "sha256:2584f7cf844ac4d970fba483a717dbe10c1c1c96a969bf65d61ffe94df1b2863"}, ] [package.dependencies] @@ -1332,13 +1513,13 @@ dev = ["twine (>=3.4.1)"] [[package]] name = "pytest" -version = "8.3.2" +version = "8.3.3" description = "pytest: simple powerful testing with Python" optional = false python-versions = ">=3.8" files = [ - {file = "pytest-8.3.2-py3-none-any.whl", hash = "sha256:4ba08f9ae7dcf84ded419494d229b48d0903ea6407b030eaec46df5e6a73bba5"}, - {file = "pytest-8.3.2.tar.gz", hash = "sha256:c132345d12ce551242c87269de812483f5bcc87cdbb4722e48487ba194f9fdce"}, + {file = "pytest-8.3.3-py3-none-any.whl", hash = "sha256:a6853c7375b2663155079443d2e45de913a911a11d669df02a50814944db57b2"}, + {file = "pytest-8.3.3.tar.gz", hash = "sha256:70b98107bd648308a7952b06e6ca9a50bc660be218d53c257cc1fc94fda10181"}, ] [package.dependencies] @@ -1470,13 +1651,13 @@ use-chardet-on-py3 = ["chardet (>=3.0.2,<6)"] [[package]] name = "rich" -version = "13.7.1" +version = "13.5.3" description = "Render rich text, tables, progress bars, syntax highlighting, markdown and more to the terminal" optional = false python-versions = ">=3.7.0" files = [ - {file = "rich-13.7.1-py3-none-any.whl", hash = "sha256:4edbae314f59eb482f54e9e30bf00d33350aaa94f4bfcd4e9e3110e64d0d7222"}, - {file = "rich-13.7.1.tar.gz", hash = "sha256:9be308cb1fe2f1f57d67ce99e95af38a1e2bc71ad9813b0e247cf7ffbcc3a432"}, + {file = "rich-13.5.3-py3-none-any.whl", hash = "sha256:9257b468badc3d347e146a4faa268ff229039d4c2d176ab0cffb4c4fbc73d5d9"}, + {file = "rich-13.5.3.tar.gz", hash = "sha256:87b43e0543149efa1253f485cd845bb7ee54df16c9617b8a893650ab84b4acb6"}, ] [package.dependencies] @@ -1618,101 +1799,93 @@ jinja2 = ["ruamel.yaml.jinja2 (>=0.2)"] [[package]] name = "ruamel-yaml-clib" -version = "0.2.8" +version = "0.2.12" description = "C version of reader, parser and emitter for ruamel.yaml derived from libyaml" optional = false -python-versions = ">=3.6" +python-versions = ">=3.9" files = [ - {file = "ruamel.yaml.clib-0.2.8-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:b42169467c42b692c19cf539c38d4602069d8c1505e97b86387fcf7afb766e1d"}, - {file = "ruamel.yaml.clib-0.2.8-cp310-cp310-macosx_13_0_arm64.whl", hash = "sha256:07238db9cbdf8fc1e9de2489a4f68474e70dffcb32232db7c08fa61ca0c7c462"}, - {file = "ruamel.yaml.clib-0.2.8-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:fff3573c2db359f091e1589c3d7c5fc2f86f5bdb6f24252c2d8e539d4e45f412"}, - {file = "ruamel.yaml.clib-0.2.8-cp310-cp310-manylinux_2_24_aarch64.whl", hash = "sha256:aa2267c6a303eb483de8d02db2871afb5c5fc15618d894300b88958f729ad74f"}, - {file = "ruamel.yaml.clib-0.2.8-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:840f0c7f194986a63d2c2465ca63af8ccbbc90ab1c6001b1978f05119b5e7334"}, - {file = "ruamel.yaml.clib-0.2.8-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:024cfe1fc7c7f4e1aff4a81e718109e13409767e4f871443cbff3dba3578203d"}, - {file = "ruamel.yaml.clib-0.2.8-cp310-cp310-win32.whl", hash = "sha256:c69212f63169ec1cfc9bb44723bf2917cbbd8f6191a00ef3410f5a7fe300722d"}, - {file = "ruamel.yaml.clib-0.2.8-cp310-cp310-win_amd64.whl", hash = "sha256:cabddb8d8ead485e255fe80429f833172b4cadf99274db39abc080e068cbcc31"}, - {file = "ruamel.yaml.clib-0.2.8-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:bef08cd86169d9eafb3ccb0a39edb11d8e25f3dae2b28f5c52fd997521133069"}, - {file = "ruamel.yaml.clib-0.2.8-cp311-cp311-macosx_13_0_arm64.whl", hash = "sha256:b16420e621d26fdfa949a8b4b47ade8810c56002f5389970db4ddda51dbff248"}, - {file = "ruamel.yaml.clib-0.2.8-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:25c515e350e5b739842fc3228d662413ef28f295791af5e5110b543cf0b57d9b"}, - {file = "ruamel.yaml.clib-0.2.8-cp311-cp311-manylinux_2_24_aarch64.whl", hash = "sha256:1707814f0d9791df063f8c19bb51b0d1278b8e9a2353abbb676c2f685dee6afe"}, - {file = "ruamel.yaml.clib-0.2.8-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:46d378daaac94f454b3a0e3d8d78cafd78a026b1d71443f4966c696b48a6d899"}, - {file = "ruamel.yaml.clib-0.2.8-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:09b055c05697b38ecacb7ac50bdab2240bfca1a0c4872b0fd309bb07dc9aa3a9"}, - {file = "ruamel.yaml.clib-0.2.8-cp311-cp311-win32.whl", hash = "sha256:53a300ed9cea38cf5a2a9b069058137c2ca1ce658a874b79baceb8f892f915a7"}, - {file = "ruamel.yaml.clib-0.2.8-cp311-cp311-win_amd64.whl", hash = "sha256:c2a72e9109ea74e511e29032f3b670835f8a59bbdc9ce692c5b4ed91ccf1eedb"}, - {file = "ruamel.yaml.clib-0.2.8-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:ebc06178e8821efc9692ea7544aa5644217358490145629914d8020042c24aa1"}, - {file = "ruamel.yaml.clib-0.2.8-cp312-cp312-macosx_13_0_arm64.whl", hash = "sha256:edaef1c1200c4b4cb914583150dcaa3bc30e592e907c01117c08b13a07255ec2"}, - {file = "ruamel.yaml.clib-0.2.8-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:d176b57452ab5b7028ac47e7b3cf644bcfdc8cacfecf7e71759f7f51a59e5c92"}, - {file = "ruamel.yaml.clib-0.2.8-cp312-cp312-manylinux_2_24_aarch64.whl", hash = "sha256:1dc67314e7e1086c9fdf2680b7b6c2be1c0d8e3a8279f2e993ca2a7545fecf62"}, - {file = "ruamel.yaml.clib-0.2.8-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:3213ece08ea033eb159ac52ae052a4899b56ecc124bb80020d9bbceeb50258e9"}, - {file = "ruamel.yaml.clib-0.2.8-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:aab7fd643f71d7946f2ee58cc88c9b7bfc97debd71dcc93e03e2d174628e7e2d"}, - {file = "ruamel.yaml.clib-0.2.8-cp312-cp312-win32.whl", hash = "sha256:5c365d91c88390c8d0a8545df0b5857172824b1c604e867161e6b3d59a827eaa"}, - {file = "ruamel.yaml.clib-0.2.8-cp312-cp312-win_amd64.whl", hash = "sha256:1758ce7d8e1a29d23de54a16ae867abd370f01b5a69e1a3ba75223eaa3ca1a1b"}, - {file = "ruamel.yaml.clib-0.2.8-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:a5aa27bad2bb83670b71683aae140a1f52b0857a2deff56ad3f6c13a017a26ed"}, - {file = "ruamel.yaml.clib-0.2.8-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:c58ecd827313af6864893e7af0a3bb85fd529f862b6adbefe14643947cfe2942"}, - {file = "ruamel.yaml.clib-0.2.8-cp37-cp37m-macosx_12_0_arm64.whl", hash = "sha256:f481f16baec5290e45aebdc2a5168ebc6d35189ae6fea7a58787613a25f6e875"}, - {file = "ruamel.yaml.clib-0.2.8-cp37-cp37m-manylinux_2_24_aarch64.whl", hash = "sha256:77159f5d5b5c14f7c34073862a6b7d34944075d9f93e681638f6d753606c6ce6"}, - {file = "ruamel.yaml.clib-0.2.8-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:7f67a1ee819dc4562d444bbafb135832b0b909f81cc90f7aa00260968c9ca1b3"}, - {file = "ruamel.yaml.clib-0.2.8-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:4ecbf9c3e19f9562c7fdd462e8d18dd902a47ca046a2e64dba80699f0b6c09b7"}, - {file = "ruamel.yaml.clib-0.2.8-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:87ea5ff66d8064301a154b3933ae406b0863402a799b16e4a1d24d9fbbcbe0d3"}, - {file = "ruamel.yaml.clib-0.2.8-cp37-cp37m-win32.whl", hash = "sha256:75e1ed13e1f9de23c5607fe6bd1aeaae21e523b32d83bb33918245361e9cc51b"}, - {file = "ruamel.yaml.clib-0.2.8-cp37-cp37m-win_amd64.whl", hash = "sha256:3f215c5daf6a9d7bbed4a0a4f760f3113b10e82ff4c5c44bec20a68c8014f675"}, - {file = "ruamel.yaml.clib-0.2.8-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:1b617618914cb00bf5c34d4357c37aa15183fa229b24767259657746c9077615"}, - {file = "ruamel.yaml.clib-0.2.8-cp38-cp38-macosx_12_0_arm64.whl", hash = "sha256:a6a9ffd280b71ad062eae53ac1659ad86a17f59a0fdc7699fd9be40525153337"}, - {file = "ruamel.yaml.clib-0.2.8-cp38-cp38-manylinux_2_24_aarch64.whl", hash = "sha256:305889baa4043a09e5b76f8e2a51d4ffba44259f6b4c72dec8ca56207d9c6fe1"}, - {file = "ruamel.yaml.clib-0.2.8-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:700e4ebb569e59e16a976857c8798aee258dceac7c7d6b50cab63e080058df91"}, - {file = "ruamel.yaml.clib-0.2.8-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:e2b4c44b60eadec492926a7270abb100ef9f72798e18743939bdbf037aab8c28"}, - {file = "ruamel.yaml.clib-0.2.8-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:e79e5db08739731b0ce4850bed599235d601701d5694c36570a99a0c5ca41a9d"}, - {file = "ruamel.yaml.clib-0.2.8-cp38-cp38-win32.whl", hash = "sha256:955eae71ac26c1ab35924203fda6220f84dce57d6d7884f189743e2abe3a9fbe"}, - {file = "ruamel.yaml.clib-0.2.8-cp38-cp38-win_amd64.whl", hash = "sha256:56f4252222c067b4ce51ae12cbac231bce32aee1d33fbfc9d17e5b8d6966c312"}, - {file = "ruamel.yaml.clib-0.2.8-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:03d1162b6d1df1caa3a4bd27aa51ce17c9afc2046c31b0ad60a0a96ec22f8001"}, - {file = "ruamel.yaml.clib-0.2.8-cp39-cp39-macosx_12_0_arm64.whl", hash = "sha256:bba64af9fa9cebe325a62fa398760f5c7206b215201b0ec825005f1b18b9bccf"}, - {file = "ruamel.yaml.clib-0.2.8-cp39-cp39-manylinux_2_24_aarch64.whl", hash = "sha256:a1a45e0bb052edf6a1d3a93baef85319733a888363938e1fc9924cb00c8df24c"}, - {file = "ruamel.yaml.clib-0.2.8-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:da09ad1c359a728e112d60116f626cc9f29730ff3e0e7db72b9a2dbc2e4beed5"}, - {file = "ruamel.yaml.clib-0.2.8-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:184565012b60405d93838167f425713180b949e9d8dd0bbc7b49f074407c5a8b"}, - {file = "ruamel.yaml.clib-0.2.8-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:a75879bacf2c987c003368cf14bed0ffe99e8e85acfa6c0bfffc21a090f16880"}, - {file = "ruamel.yaml.clib-0.2.8-cp39-cp39-win32.whl", hash = "sha256:84b554931e932c46f94ab306913ad7e11bba988104c5cff26d90d03f68258cd5"}, - {file = "ruamel.yaml.clib-0.2.8-cp39-cp39-win_amd64.whl", hash = "sha256:25ac8c08322002b06fa1d49d1646181f0b2c72f5cbc15a85e80b4c30a544bb15"}, - {file = "ruamel.yaml.clib-0.2.8.tar.gz", hash = "sha256:beb2e0404003de9a4cab9753a8805a8fe9320ee6673136ed7f04255fe60bb512"}, + {file = "ruamel.yaml.clib-0.2.12-cp310-cp310-macosx_13_0_arm64.whl", hash = "sha256:11f891336688faf5156a36293a9c362bdc7c88f03a8a027c2c1d8e0bcde998e5"}, + {file = "ruamel.yaml.clib-0.2.12-cp310-cp310-manylinux2014_aarch64.whl", hash = "sha256:a606ef75a60ecf3d924613892cc603b154178ee25abb3055db5062da811fd969"}, + {file = "ruamel.yaml.clib-0.2.12-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fd5415dded15c3822597455bc02bcd66e81ef8b7a48cb71a33628fc9fdde39df"}, + {file = "ruamel.yaml.clib-0.2.12-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f66efbc1caa63c088dead1c4170d148eabc9b80d95fb75b6c92ac0aad2437d76"}, + {file = "ruamel.yaml.clib-0.2.12-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:22353049ba4181685023b25b5b51a574bce33e7f51c759371a7422dcae5402a6"}, + {file = "ruamel.yaml.clib-0.2.12-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:932205970b9f9991b34f55136be327501903f7c66830e9760a8ffb15b07f05cd"}, + {file = "ruamel.yaml.clib-0.2.12-cp310-cp310-win32.whl", hash = "sha256:3eac5a91891ceb88138c113f9db04f3cebdae277f5d44eaa3651a4f573e6a5da"}, + {file = "ruamel.yaml.clib-0.2.12-cp310-cp310-win_amd64.whl", hash = "sha256:ab007f2f5a87bd08ab1499bdf96f3d5c6ad4dcfa364884cb4549aa0154b13a28"}, + {file = "ruamel.yaml.clib-0.2.12-cp311-cp311-macosx_13_0_arm64.whl", hash = "sha256:4a6679521a58256a90b0d89e03992c15144c5f3858f40d7c18886023d7943db6"}, + {file = "ruamel.yaml.clib-0.2.12-cp311-cp311-manylinux2014_aarch64.whl", hash = "sha256:d84318609196d6bd6da0edfa25cedfbabd8dbde5140a0a23af29ad4b8f91fb1e"}, + {file = "ruamel.yaml.clib-0.2.12-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bb43a269eb827806502c7c8efb7ae7e9e9d0573257a46e8e952f4d4caba4f31e"}, + {file = "ruamel.yaml.clib-0.2.12-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:811ea1594b8a0fb466172c384267a4e5e367298af6b228931f273b111f17ef52"}, + {file = "ruamel.yaml.clib-0.2.12-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:cf12567a7b565cbf65d438dec6cfbe2917d3c1bdddfce84a9930b7d35ea59642"}, + {file = "ruamel.yaml.clib-0.2.12-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:7dd5adc8b930b12c8fc5b99e2d535a09889941aa0d0bd06f4749e9a9397c71d2"}, + {file = "ruamel.yaml.clib-0.2.12-cp311-cp311-win32.whl", hash = "sha256:bd0a08f0bab19093c54e18a14a10b4322e1eacc5217056f3c063bd2f59853ce4"}, + {file = "ruamel.yaml.clib-0.2.12-cp311-cp311-win_amd64.whl", hash = "sha256:a274fb2cb086c7a3dea4322ec27f4cb5cc4b6298adb583ab0e211a4682f241eb"}, + {file = "ruamel.yaml.clib-0.2.12-cp312-cp312-macosx_14_0_arm64.whl", hash = "sha256:20b0f8dc160ba83b6dcc0e256846e1a02d044e13f7ea74a3d1d56ede4e48c632"}, + {file = "ruamel.yaml.clib-0.2.12-cp312-cp312-manylinux2014_aarch64.whl", hash = "sha256:943f32bc9dedb3abff9879edc134901df92cfce2c3d5c9348f172f62eb2d771d"}, + {file = "ruamel.yaml.clib-0.2.12-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:95c3829bb364fdb8e0332c9931ecf57d9be3519241323c5274bd82f709cebc0c"}, + {file = "ruamel.yaml.clib-0.2.12-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:749c16fcc4a2b09f28843cda5a193e0283e47454b63ec4b81eaa2242f50e4ccd"}, + {file = "ruamel.yaml.clib-0.2.12-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:bf165fef1f223beae7333275156ab2022cffe255dcc51c27f066b4370da81e31"}, + {file = "ruamel.yaml.clib-0.2.12-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:32621c177bbf782ca5a18ba4d7af0f1082a3f6e517ac2a18b3974d4edf349680"}, + {file = "ruamel.yaml.clib-0.2.12-cp312-cp312-win32.whl", hash = "sha256:e8c4ebfcfd57177b572e2040777b8abc537cdef58a2120e830124946aa9b42c5"}, + {file = "ruamel.yaml.clib-0.2.12-cp312-cp312-win_amd64.whl", hash = "sha256:0467c5965282c62203273b838ae77c0d29d7638c8a4e3a1c8bdd3602c10904e4"}, + {file = "ruamel.yaml.clib-0.2.12-cp313-cp313-macosx_14_0_arm64.whl", hash = "sha256:4c8c5d82f50bb53986a5e02d1b3092b03622c02c2eb78e29bec33fd9593bae1a"}, + {file = "ruamel.yaml.clib-0.2.12-cp313-cp313-manylinux2014_aarch64.whl", hash = "sha256:e7e3736715fbf53e9be2a79eb4db68e4ed857017344d697e8b9749444ae57475"}, + {file = "ruamel.yaml.clib-0.2.12-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0b7e75b4965e1d4690e93021adfcecccbca7d61c7bddd8e22406ef2ff20d74ef"}, + {file = "ruamel.yaml.clib-0.2.12-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:96777d473c05ee3e5e3c3e999f5d23c6f4ec5b0c38c098b3a5229085f74236c6"}, + {file = "ruamel.yaml.clib-0.2.12-cp313-cp313-musllinux_1_1_i686.whl", hash = "sha256:3bc2a80e6420ca8b7d3590791e2dfc709c88ab9152c00eeb511c9875ce5778bf"}, + {file = "ruamel.yaml.clib-0.2.12-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:e188d2699864c11c36cdfdada94d781fd5d6b0071cd9c427bceb08ad3d7c70e1"}, + {file = "ruamel.yaml.clib-0.2.12-cp313-cp313-win32.whl", hash = "sha256:6442cb36270b3afb1b4951f060eccca1ce49f3d087ca1ca4563a6eb479cb3de6"}, + {file = "ruamel.yaml.clib-0.2.12-cp313-cp313-win_amd64.whl", hash = "sha256:e5b8daf27af0b90da7bb903a876477a9e6d7270be6146906b276605997c7e9a3"}, + {file = "ruamel.yaml.clib-0.2.12-cp39-cp39-macosx_12_0_arm64.whl", hash = "sha256:fc4b630cd3fa2cf7fce38afa91d7cfe844a9f75d7f0f36393fa98815e911d987"}, + {file = "ruamel.yaml.clib-0.2.12-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:bc5f1e1c28e966d61d2519f2a3d451ba989f9ea0f2307de7bc45baa526de9e45"}, + {file = "ruamel.yaml.clib-0.2.12-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5a0e060aace4c24dcaf71023bbd7d42674e3b230f7e7b97317baf1e953e5b519"}, + {file = "ruamel.yaml.clib-0.2.12-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e2f1c3765db32be59d18ab3953f43ab62a761327aafc1594a2a1fbe038b8b8a7"}, + {file = "ruamel.yaml.clib-0.2.12-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:d85252669dc32f98ebcd5d36768f5d4faeaeaa2d655ac0473be490ecdae3c285"}, + {file = "ruamel.yaml.clib-0.2.12-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:e143ada795c341b56de9418c58d028989093ee611aa27ffb9b7f609c00d813ed"}, + {file = "ruamel.yaml.clib-0.2.12-cp39-cp39-win32.whl", hash = "sha256:beffaed67936fbbeffd10966a4eb53c402fafd3d6833770516bf7314bc6ffa12"}, + {file = "ruamel.yaml.clib-0.2.12-cp39-cp39-win_amd64.whl", hash = "sha256:040ae85536960525ea62868b642bdb0c2cc6021c9f9d507810c0c604e66f5a7b"}, + {file = "ruamel.yaml.clib-0.2.12.tar.gz", hash = "sha256:6c8fbb13ec503f99a91901ab46e0b07ae7941cd527393187039aec586fdfd36f"}, ] [[package]] name = "ruff" -version = "0.3.7" +version = "0.6.9" description = "An extremely fast Python linter and code formatter, written in Rust." optional = false python-versions = ">=3.7" files = [ - {file = "ruff-0.3.7-py3-none-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl", hash = "sha256:0e8377cccb2f07abd25e84fc5b2cbe48eeb0fea9f1719cad7caedb061d70e5ce"}, - {file = "ruff-0.3.7-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:15a4d1cc1e64e556fa0d67bfd388fed416b7f3b26d5d1c3e7d192c897e39ba4b"}, - {file = "ruff-0.3.7-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d28bdf3d7dc71dd46929fafeec98ba89b7c3550c3f0978e36389b5631b793663"}, - {file = "ruff-0.3.7-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:379b67d4f49774ba679593b232dcd90d9e10f04d96e3c8ce4a28037ae473f7bb"}, - {file = "ruff-0.3.7-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c060aea8ad5ef21cdfbbe05475ab5104ce7827b639a78dd55383a6e9895b7c51"}, - {file = "ruff-0.3.7-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:ebf8f615dde968272d70502c083ebf963b6781aacd3079081e03b32adfe4d58a"}, - {file = "ruff-0.3.7-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d48098bd8f5c38897b03604f5428901b65e3c97d40b3952e38637b5404b739a2"}, - {file = "ruff-0.3.7-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:da8a4fda219bf9024692b1bc68c9cff4b80507879ada8769dc7e985755d662ea"}, - {file = "ruff-0.3.7-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6c44e0149f1d8b48c4d5c33d88c677a4aa22fd09b1683d6a7ff55b816b5d074f"}, - {file = "ruff-0.3.7-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:3050ec0af72b709a62ecc2aca941b9cd479a7bf2b36cc4562f0033d688e44fa1"}, - {file = "ruff-0.3.7-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:a29cc38e4c1ab00da18a3f6777f8b50099d73326981bb7d182e54a9a21bb4ff7"}, - {file = "ruff-0.3.7-py3-none-musllinux_1_2_i686.whl", hash = "sha256:5b15cc59c19edca917f51b1956637db47e200b0fc5e6e1878233d3a938384b0b"}, - {file = "ruff-0.3.7-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:e491045781b1e38b72c91247cf4634f040f8d0cb3e6d3d64d38dcf43616650b4"}, - {file = "ruff-0.3.7-py3-none-win32.whl", hash = "sha256:bc931de87593d64fad3a22e201e55ad76271f1d5bfc44e1a1887edd0903c7d9f"}, - {file = "ruff-0.3.7-py3-none-win_amd64.whl", hash = "sha256:5ef0e501e1e39f35e03c2acb1d1238c595b8bb36cf7a170e7c1df1b73da00e74"}, - {file = "ruff-0.3.7-py3-none-win_arm64.whl", hash = "sha256:789e144f6dc7019d1f92a812891c645274ed08af6037d11fc65fcbc183b7d59f"}, - {file = "ruff-0.3.7.tar.gz", hash = "sha256:d5c1aebee5162c2226784800ae031f660c350e7a3402c4d1f8ea4e97e232e3ba"}, + {file = "ruff-0.6.9-py3-none-linux_armv6l.whl", hash = "sha256:064df58d84ccc0ac0fcd63bc3090b251d90e2a372558c0f057c3f75ed73e1ccd"}, + {file = "ruff-0.6.9-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:140d4b5c9f5fc7a7b074908a78ab8d384dd7f6510402267bc76c37195c02a7ec"}, + {file = "ruff-0.6.9-py3-none-macosx_11_0_arm64.whl", hash = "sha256:53fd8ca5e82bdee8da7f506d7b03a261f24cd43d090ea9db9a1dc59d9313914c"}, + {file = "ruff-0.6.9-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:645d7d8761f915e48a00d4ecc3686969761df69fb561dd914a773c1a8266e14e"}, + {file = "ruff-0.6.9-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:eae02b700763e3847595b9d2891488989cac00214da7f845f4bcf2989007d577"}, + {file = "ruff-0.6.9-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7d5ccc9e58112441de8ad4b29dcb7a86dc25c5f770e3c06a9d57e0e5eba48829"}, + {file = "ruff-0.6.9-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:417b81aa1c9b60b2f8edc463c58363075412866ae4e2b9ab0f690dc1e87ac1b5"}, + {file = "ruff-0.6.9-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3c866b631f5fbce896a74a6e4383407ba7507b815ccc52bcedabb6810fdb3ef7"}, + {file = "ruff-0.6.9-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7b118afbb3202f5911486ad52da86d1d52305b59e7ef2031cea3425142b97d6f"}, + {file = "ruff-0.6.9-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a67267654edc23c97335586774790cde402fb6bbdb3c2314f1fc087dee320bfa"}, + {file = "ruff-0.6.9-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:3ef0cc774b00fec123f635ce5c547dac263f6ee9fb9cc83437c5904183b55ceb"}, + {file = "ruff-0.6.9-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:12edd2af0c60fa61ff31cefb90aef4288ac4d372b4962c2864aeea3a1a2460c0"}, + {file = "ruff-0.6.9-py3-none-musllinux_1_2_i686.whl", hash = "sha256:55bb01caeaf3a60b2b2bba07308a02fca6ab56233302406ed5245180a05c5625"}, + {file = "ruff-0.6.9-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:925d26471fa24b0ce5a6cdfab1bb526fb4159952385f386bdcc643813d472039"}, + {file = "ruff-0.6.9-py3-none-win32.whl", hash = "sha256:eb61ec9bdb2506cffd492e05ac40e5bc6284873aceb605503d8494180d6fc84d"}, + {file = "ruff-0.6.9-py3-none-win_amd64.whl", hash = "sha256:785d31851c1ae91f45b3d8fe23b8ae4b5170089021fbb42402d811135f0b7117"}, + {file = "ruff-0.6.9-py3-none-win_arm64.whl", hash = "sha256:a9641e31476d601f83cd602608739a0840e348bda93fec9f1ee816f8b6798b93"}, + {file = "ruff-0.6.9.tar.gz", hash = "sha256:b076ef717a8e5bc819514ee1d602bbdca5b4420ae13a9cf61a0c0a4f53a2baa2"}, ] [[package]] name = "semgrep" -version = "1.85.0" +version = "1.93.0" description = "Lightweight static analysis for many languages. Find bug variants with patterns that look like source code." optional = false python-versions = ">=3.8" files = [ - {file = "semgrep-1.85.0-cp38.cp39.cp310.cp311.py37.py38.py39.py310.py311-none-any.whl", hash = "sha256:91fab3a0aa7f987a6605e01617179a363338350cca51174905d6ad0080a8d08e"}, - {file = "semgrep-1.85.0-cp38.cp39.cp310.cp311.py37.py38.py39.py310.py311-none-macosx_10_14_x86_64.whl", hash = "sha256:a63055b392da70c46947780f43fecf54064fb60d8de11a16902e0cc149350a3e"}, - {file = "semgrep-1.85.0-cp38.cp39.cp310.cp311.py37.py38.py39.py310.py311-none-macosx_11_0_arm64.whl", hash = "sha256:157b7724c35a8bda972921abfaaf252bdb754bbda004b2a82aaa38ac8099e176"}, - {file = "semgrep-1.85.0-cp38.cp39.cp310.cp311.py37.py38.py39.py310.py311-none-musllinux_1_0_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0a6b5d509576bbe0d68245d9ee2973ccecb485ca5907e85a7a8793552bf622cb"}, - {file = "semgrep-1.85.0.tar.gz", hash = "sha256:1a321cca4c5da84eb466ca1a4ceda10223e806225e371c4fef710cfe4b4b1df7"}, + {file = "semgrep-1.93.0-cp38.cp39.cp310.cp311.py37.py38.py39.py310.py311-none-any.whl", hash = "sha256:41c3df47c84e2ef064becad233bf619d98824f46787109a7e247fa1266429732"}, + {file = "semgrep-1.93.0-cp38.cp39.cp310.cp311.py37.py38.py39.py310.py311-none-macosx_10_14_x86_64.whl", hash = "sha256:40ae350c75fa7b8ea949f815b1afc9709449a5a2cc9659c79e1f983a400342db"}, + {file = "semgrep-1.93.0-cp38.cp39.cp310.cp311.py37.py38.py39.py310.py311-none-macosx_11_0_arm64.whl", hash = "sha256:d021e4513fcff7a60cdc4541c443212b5a8165d1e8f49abd8661ab685607dd34"}, + {file = "semgrep-1.93.0-cp38.cp39.cp310.cp311.py37.py38.py39.py310.py311-none-musllinux_1_0_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cde7d4c42a579359f37f3ef19cc04f91886903381ba3cff6ce0d90ea3ca80676"}, + {file = "semgrep-1.93.0.tar.gz", hash = "sha256:b97fd47b303ca1ba6f85a1b50428093b987126d8e4aa7422e5acdcc3787c6628"}, ] [package.dependencies] @@ -1732,7 +1905,7 @@ opentelemetry-sdk = ">=1.25.0,<1.26.0" packaging = ">=21.0" peewee = ">=3.14,<4.0" requests = ">=2.22,<3.0" -rich = ">=12.6.0" +rich = ">=13.5.2,<13.6.0" "ruamel.yaml" = ">=0.16.0,<0.18" tomli = ">=2.0.1,<2.1.0" typing-extensions = ">=4.2,<5.0" @@ -1741,57 +1914,72 @@ wcmatch = ">=8.3,<9.0" [[package]] name = "setuptools" -version = "72.2.0" +version = "75.2.0" description = "Easily download, build, install, upgrade, and uninstall Python packages" optional = false python-versions = ">=3.8" files = [ - {file = "setuptools-72.2.0-py3-none-any.whl", hash = "sha256:f11dd94b7bae3a156a95ec151f24e4637fb4fa19c878e4d191bfb8b2d82728c4"}, - {file = "setuptools-72.2.0.tar.gz", hash = "sha256:80aacbf633704e9c8bfa1d99fa5dd4dc59573efcf9e4042c13d3bcef91ac2ef9"}, + {file = "setuptools-75.2.0-py3-none-any.whl", hash = "sha256:a7fcb66f68b4d9e8e66b42f9876150a3371558f98fa32222ffaa5bced76406f8"}, + {file = "setuptools-75.2.0.tar.gz", hash = "sha256:753bb6ebf1f465a1912e19ed1d41f403a79173a9acf66a42e7e6aec45c3c16ec"}, ] [package.extras] -core = ["importlib-metadata (>=6)", "importlib-resources (>=5.10.2)", "jaraco.text (>=3.7)", "more-itertools (>=8.8)", "ordered-set (>=3.1.1)", "packaging (>=24)", "platformdirs (>=2.6.2)", "tomli (>=2.0.1)", "wheel (>=0.43.0)"] +check = ["pytest-checkdocs (>=2.4)", "pytest-ruff (>=0.2.1)", "ruff (>=0.5.2)"] +core = ["importlib-metadata (>=6)", "importlib-resources (>=5.10.2)", "jaraco.collections", "jaraco.functools", "jaraco.text (>=3.7)", "more-itertools", "more-itertools (>=8.8)", "packaging", "packaging (>=24)", "platformdirs (>=2.6.2)", "tomli (>=2.0.1)", "wheel (>=0.43.0)"] +cover = ["pytest-cov"] doc = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "pygments-github-lexers (==0.0.5)", "pyproject-hooks (!=1.1)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-favicon", "sphinx-inline-tabs", "sphinx-lint", "sphinx-notfound-page (>=1,<2)", "sphinx-reredirects", "sphinxcontrib-towncrier", "towncrier (<24.7)"] -test = ["build[virtualenv] (>=1.0.3)", "filelock (>=3.4.0)", "importlib-metadata", "ini2toml[lite] (>=0.14)", "jaraco.develop (>=7.21)", "jaraco.envs (>=2.2)", "jaraco.path (>=3.2.0)", "jaraco.test", "mypy (==1.11.*)", "packaging (>=23.2)", "pip (>=19.1)", "pyproject-hooks (!=1.1)", "pytest (>=6,!=8.1.*)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-home (>=0.5)", "pytest-mypy", "pytest-perf", "pytest-ruff (<0.4)", "pytest-ruff (>=0.2.1)", "pytest-ruff (>=0.3.2)", "pytest-subprocess", "pytest-timeout", "pytest-xdist (>=3)", "tomli", "tomli-w (>=1.0.0)", "virtualenv (>=13.0.0)", "wheel"] +enabler = ["pytest-enabler (>=2.2)"] +test = ["build[virtualenv] (>=1.0.3)", "filelock (>=3.4.0)", "ini2toml[lite] (>=0.14)", "jaraco.develop (>=7.21)", "jaraco.envs (>=2.2)", "jaraco.path (>=3.2.0)", "jaraco.test", "packaging (>=23.2)", "pip (>=19.1)", "pyproject-hooks (!=1.1)", "pytest (>=6,!=8.1.*)", "pytest-home (>=0.5)", "pytest-perf", "pytest-subprocess", "pytest-timeout", "pytest-xdist (>=3)", "tomli-w (>=1.0.0)", "virtualenv (>=13.0.0)", "wheel (>=0.44.0)"] +type = ["importlib-metadata (>=7.0.2)", "jaraco.develop (>=7.21)", "mypy (==1.11.*)", "pytest-mypy"] [[package]] name = "slack-bolt" -version = "1.20.0" +version = "1.21.1" description = "The Bolt Framework for Python" optional = false python-versions = ">=3.6" files = [ - {file = "slack_bolt-1.20.0-py2.py3-none-any.whl", hash = "sha256:e253dcae69ac7eea189b3270307fba6d733eb0764ae223b494427a9023a57380"}, - {file = "slack_bolt-1.20.0.tar.gz", hash = "sha256:373d76a2b1a8ed91d5fe011bd3f671a05ec8620210c3a6ad99477e39d6b2b7fa"}, + {file = "slack_bolt-1.21.1-py2.py3-none-any.whl", hash = "sha256:feb3c97ed7c388318d6e007a9c1b50dd88b0d59e64ff1f8c4e770db30e890ec8"}, + {file = "slack_bolt-1.21.1.tar.gz", hash = "sha256:f0f1e7223f0e5621a768d1efce470058619b4f4eacbec405625c8c813e489c20"}, ] [package.dependencies] -slack-sdk = ">=3.26.0,<4" +slack-sdk = ">=3.33.1,<4" [[package]] name = "slack-sdk" -version = "3.31.0" +version = "3.33.1" description = "The Slack API Platform SDK for Python" optional = false python-versions = ">=3.6" files = [ - {file = "slack_sdk-3.31.0-py2.py3-none-any.whl", hash = "sha256:a120cc461e8ebb7d9175f171dbe0ded37a6878d9f7b96b28e4bad1227399047b"}, - {file = "slack_sdk-3.31.0.tar.gz", hash = "sha256:740d2f9c49cbfcbd46fca56b4be9d527934c225312aac18fd2c0fca0ef6bc935"}, + {file = "slack_sdk-3.33.1-py2.py3-none-any.whl", hash = "sha256:ef93beec3ce9c8f64da02fd487598a05ec4bc9c92ceed58f122dbe632691cbe2"}, + {file = "slack_sdk-3.33.1.tar.gz", hash = "sha256:e328bb661d95db5f66b993b1d64288ac7c72201a745b4c7cf8848dafb7b74e40"}, ] [package.extras] -optional = ["SQLAlchemy (>=1.4,<3)", "aiodns (>1.0)", "aiohttp (>=3.7.3,<4)", "boto3 (<=2)", "websocket-client (>=1,<2)", "websockets (>=9.1,<13)"] +optional = ["SQLAlchemy (>=1.4,<3)", "aiodns (>1.0)", "aiohttp (>=3.7.3,<4)", "boto3 (<=2)", "websocket-client (>=1,<2)", "websockets (>=9.1,<14)"] + +[[package]] +name = "sniffio" +version = "1.3.1" +description = "Sniff out which async library your code is running under" +optional = false +python-versions = ">=3.7" +files = [ + {file = "sniffio-1.3.1-py3-none-any.whl", hash = "sha256:2f6da418d1f1e0fddd844478f41680e794e6051915791a034ff65e5f100525a2"}, + {file = "sniffio-1.3.1.tar.gz", hash = "sha256:f4324edc670a0f49750a81b895f35c3adb843cca46f0530f79fc1babb23789dc"}, +] [[package]] name = "tomli" -version = "2.0.1" +version = "2.0.2" description = "A lil' TOML parser" optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "tomli-2.0.1-py3-none-any.whl", hash = "sha256:939de3e7a6161af0c887ef91b7d41a53e7c5a1ca976325f429cb46ea9bc30ecc"}, - {file = "tomli-2.0.1.tar.gz", hash = "sha256:de526c12914f0c550d15924c62d72abc48d6fe7364aa87328337a31007fe8a4f"}, + {file = "tomli-2.0.2-py3-none-any.whl", hash = "sha256:2ebe24485c53d303f690b0ec092806a085f07af5a5aa1464f3931eec36caaa38"}, + {file = "tomli-2.0.2.tar.gz", hash = "sha256:d46d457a85337051c36524bc5349dd91b1877838e2979ac5ced3e710ed8a60ed"}, ] [[package]] @@ -1827,13 +2015,13 @@ files = [ [[package]] name = "urllib3" -version = "2.2.2" +version = "2.2.3" description = "HTTP library with thread-safe connection pooling, file post, and more." optional = false python-versions = ">=3.8" files = [ - {file = "urllib3-2.2.2-py3-none-any.whl", hash = "sha256:a448b2f64d686155468037e1ace9f2d2199776e17f0a46610480d311f73e3472"}, - {file = "urllib3-2.2.2.tar.gz", hash = "sha256:dd505485549a7a552833da5e6063639d0d177c04f23bc3864e41e5dc5f612168"}, + {file = "urllib3-2.2.3-py3-none-any.whl", hash = "sha256:ca899ca043dcb1bafa3e262d73aa25c465bfb49e0bd9dd5d59f1d0acba2f8fac"}, + {file = "urllib3-2.2.3.tar.gz", hash = "sha256:e7d814a81dad81e6caf2ec9fdedb284ecc9c73076b62654547cc64ccdcae26e9"}, ] [package.extras] @@ -1856,6 +2044,20 @@ files = [ [package.dependencies] bracex = ">=2.1.1" +[[package]] +name = "win32-setctime" +version = "1.1.0" +description = "A small Python utility to set file creation time on Windows" +optional = false +python-versions = ">=3.5" +files = [ + {file = "win32_setctime-1.1.0-py3-none-any.whl", hash = "sha256:231db239e959c2fe7eb1d7dc129f11172354f98361c4fa2d6d2d7e278baa8aad"}, + {file = "win32_setctime-1.1.0.tar.gz", hash = "sha256:15cf5750465118d6929ae4de4eb46e8edae9a5634350c01ba582df868e932cb2"}, +] + +[package.extras] +dev = ["black (>=19.3b0)", "pytest (>=4.6.2)"] + [[package]] name = "wrapt" version = "1.16.0" @@ -1937,123 +2139,120 @@ files = [ [[package]] name = "yarl" -version = "1.9.4" +version = "1.16.0" description = "Yet another URL library" optional = false -python-versions = ">=3.7" +python-versions = ">=3.9" files = [ - {file = "yarl-1.9.4-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:a8c1df72eb746f4136fe9a2e72b0c9dc1da1cbd23b5372f94b5820ff8ae30e0e"}, - {file = "yarl-1.9.4-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:a3a6ed1d525bfb91b3fc9b690c5a21bb52de28c018530ad85093cc488bee2dd2"}, - {file = "yarl-1.9.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:c38c9ddb6103ceae4e4498f9c08fac9b590c5c71b0370f98714768e22ac6fa66"}, - {file = "yarl-1.9.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d9e09c9d74f4566e905a0b8fa668c58109f7624db96a2171f21747abc7524234"}, - {file = "yarl-1.9.4-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b8477c1ee4bd47c57d49621a062121c3023609f7a13b8a46953eb6c9716ca392"}, - {file = "yarl-1.9.4-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d5ff2c858f5f6a42c2a8e751100f237c5e869cbde669a724f2062d4c4ef93551"}, - {file = "yarl-1.9.4-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:357495293086c5b6d34ca9616a43d329317feab7917518bc97a08f9e55648455"}, - {file = "yarl-1.9.4-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:54525ae423d7b7a8ee81ba189f131054defdb122cde31ff17477951464c1691c"}, - {file = "yarl-1.9.4-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:801e9264d19643548651b9db361ce3287176671fb0117f96b5ac0ee1c3530d53"}, - {file = "yarl-1.9.4-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:e516dc8baf7b380e6c1c26792610230f37147bb754d6426462ab115a02944385"}, - {file = "yarl-1.9.4-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:7d5aaac37d19b2904bb9dfe12cdb08c8443e7ba7d2852894ad448d4b8f442863"}, - {file = "yarl-1.9.4-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:54beabb809ffcacbd9d28ac57b0db46e42a6e341a030293fb3185c409e626b8b"}, - {file = "yarl-1.9.4-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:bac8d525a8dbc2a1507ec731d2867025d11ceadcb4dd421423a5d42c56818541"}, - {file = "yarl-1.9.4-cp310-cp310-win32.whl", hash = "sha256:7855426dfbddac81896b6e533ebefc0af2f132d4a47340cee6d22cac7190022d"}, - {file = "yarl-1.9.4-cp310-cp310-win_amd64.whl", hash = "sha256:848cd2a1df56ddbffeb375535fb62c9d1645dde33ca4d51341378b3f5954429b"}, - {file = "yarl-1.9.4-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:35a2b9396879ce32754bd457d31a51ff0a9d426fd9e0e3c33394bf4b9036b099"}, - {file = "yarl-1.9.4-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:4c7d56b293cc071e82532f70adcbd8b61909eec973ae9d2d1f9b233f3d943f2c"}, - {file = "yarl-1.9.4-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:d8a1c6c0be645c745a081c192e747c5de06e944a0d21245f4cf7c05e457c36e0"}, - {file = "yarl-1.9.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4b3c1ffe10069f655ea2d731808e76e0f452fc6c749bea04781daf18e6039525"}, - {file = "yarl-1.9.4-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:549d19c84c55d11687ddbd47eeb348a89df9cb30e1993f1b128f4685cd0ebbf8"}, - {file = "yarl-1.9.4-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a7409f968456111140c1c95301cadf071bd30a81cbd7ab829169fb9e3d72eae9"}, - {file = "yarl-1.9.4-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e23a6d84d9d1738dbc6e38167776107e63307dfc8ad108e580548d1f2c587f42"}, - {file = "yarl-1.9.4-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d8b889777de69897406c9fb0b76cdf2fd0f31267861ae7501d93003d55f54fbe"}, - {file = "yarl-1.9.4-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:03caa9507d3d3c83bca08650678e25364e1843b484f19986a527630ca376ecce"}, - {file = "yarl-1.9.4-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:4e9035df8d0880b2f1c7f5031f33f69e071dfe72ee9310cfc76f7b605958ceb9"}, - {file = "yarl-1.9.4-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:c0ec0ed476f77db9fb29bca17f0a8fcc7bc97ad4c6c1d8959c507decb22e8572"}, - {file = "yarl-1.9.4-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:ee04010f26d5102399bd17f8df8bc38dc7ccd7701dc77f4a68c5b8d733406958"}, - {file = "yarl-1.9.4-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:49a180c2e0743d5d6e0b4d1a9e5f633c62eca3f8a86ba5dd3c471060e352ca98"}, - {file = "yarl-1.9.4-cp311-cp311-win32.whl", hash = "sha256:81eb57278deb6098a5b62e88ad8281b2ba09f2f1147c4767522353eaa6260b31"}, - {file = "yarl-1.9.4-cp311-cp311-win_amd64.whl", hash = "sha256:d1d2532b340b692880261c15aee4dc94dd22ca5d61b9db9a8a361953d36410b1"}, - {file = "yarl-1.9.4-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:0d2454f0aef65ea81037759be5ca9947539667eecebca092733b2eb43c965a81"}, - {file = "yarl-1.9.4-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:44d8ffbb9c06e5a7f529f38f53eda23e50d1ed33c6c869e01481d3fafa6b8142"}, - {file = "yarl-1.9.4-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:aaaea1e536f98754a6e5c56091baa1b6ce2f2700cc4a00b0d49eca8dea471074"}, - {file = "yarl-1.9.4-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3777ce5536d17989c91696db1d459574e9a9bd37660ea7ee4d3344579bb6f129"}, - {file = "yarl-1.9.4-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9fc5fc1eeb029757349ad26bbc5880557389a03fa6ada41703db5e068881e5f2"}, - {file = "yarl-1.9.4-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:ea65804b5dc88dacd4a40279af0cdadcfe74b3e5b4c897aa0d81cf86927fee78"}, - {file = "yarl-1.9.4-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:aa102d6d280a5455ad6a0f9e6d769989638718e938a6a0a2ff3f4a7ff8c62cc4"}, - {file = "yarl-1.9.4-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:09efe4615ada057ba2d30df871d2f668af661e971dfeedf0c159927d48bbeff0"}, - {file = "yarl-1.9.4-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:008d3e808d03ef28542372d01057fd09168419cdc8f848efe2804f894ae03e51"}, - {file = "yarl-1.9.4-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:6f5cb257bc2ec58f437da2b37a8cd48f666db96d47b8a3115c29f316313654ff"}, - {file = "yarl-1.9.4-cp312-cp312-musllinux_1_1_ppc64le.whl", hash = "sha256:992f18e0ea248ee03b5a6e8b3b4738850ae7dbb172cc41c966462801cbf62cf7"}, - {file = "yarl-1.9.4-cp312-cp312-musllinux_1_1_s390x.whl", hash = "sha256:0e9d124c191d5b881060a9e5060627694c3bdd1fe24c5eecc8d5d7d0eb6faabc"}, - {file = "yarl-1.9.4-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:3986b6f41ad22988e53d5778f91855dc0399b043fc8946d4f2e68af22ee9ff10"}, - {file = "yarl-1.9.4-cp312-cp312-win32.whl", hash = "sha256:4b21516d181cd77ebd06ce160ef8cc2a5e9ad35fb1c5930882baff5ac865eee7"}, - {file = "yarl-1.9.4-cp312-cp312-win_amd64.whl", hash = "sha256:a9bd00dc3bc395a662900f33f74feb3e757429e545d831eef5bb280252631984"}, - {file = "yarl-1.9.4-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:63b20738b5aac74e239622d2fe30df4fca4942a86e31bf47a81a0e94c14df94f"}, - {file = "yarl-1.9.4-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d7d7f7de27b8944f1fee2c26a88b4dabc2409d2fea7a9ed3df79b67277644e17"}, - {file = "yarl-1.9.4-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c74018551e31269d56fab81a728f683667e7c28c04e807ba08f8c9e3bba32f14"}, - {file = "yarl-1.9.4-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:ca06675212f94e7a610e85ca36948bb8fc023e458dd6c63ef71abfd482481aa5"}, - {file = "yarl-1.9.4-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5aef935237d60a51a62b86249839b51345f47564208c6ee615ed2a40878dccdd"}, - {file = "yarl-1.9.4-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2b134fd795e2322b7684155b7855cc99409d10b2e408056db2b93b51a52accc7"}, - {file = "yarl-1.9.4-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:d25039a474c4c72a5ad4b52495056f843a7ff07b632c1b92ea9043a3d9950f6e"}, - {file = "yarl-1.9.4-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:f7d6b36dd2e029b6bcb8a13cf19664c7b8e19ab3a58e0fefbb5b8461447ed5ec"}, - {file = "yarl-1.9.4-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:957b4774373cf6f709359e5c8c4a0af9f6d7875db657adb0feaf8d6cb3c3964c"}, - {file = "yarl-1.9.4-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:d7eeb6d22331e2fd42fce928a81c697c9ee2d51400bd1a28803965883e13cead"}, - {file = "yarl-1.9.4-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:6a962e04b8f91f8c4e5917e518d17958e3bdee71fd1d8b88cdce74dd0ebbf434"}, - {file = "yarl-1.9.4-cp37-cp37m-win32.whl", hash = "sha256:f3bc6af6e2b8f92eced34ef6a96ffb248e863af20ef4fde9448cc8c9b858b749"}, - {file = "yarl-1.9.4-cp37-cp37m-win_amd64.whl", hash = "sha256:ad4d7a90a92e528aadf4965d685c17dacff3df282db1121136c382dc0b6014d2"}, - {file = "yarl-1.9.4-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:ec61d826d80fc293ed46c9dd26995921e3a82146feacd952ef0757236fc137be"}, - {file = "yarl-1.9.4-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:8be9e837ea9113676e5754b43b940b50cce76d9ed7d2461df1af39a8ee674d9f"}, - {file = "yarl-1.9.4-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:bef596fdaa8f26e3d66af846bbe77057237cb6e8efff8cd7cc8dff9a62278bbf"}, - {file = "yarl-1.9.4-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2d47552b6e52c3319fede1b60b3de120fe83bde9b7bddad11a69fb0af7db32f1"}, - {file = "yarl-1.9.4-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:84fc30f71689d7fc9168b92788abc977dc8cefa806909565fc2951d02f6b7d57"}, - {file = "yarl-1.9.4-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4aa9741085f635934f3a2583e16fcf62ba835719a8b2b28fb2917bb0537c1dfa"}, - {file = "yarl-1.9.4-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:206a55215e6d05dbc6c98ce598a59e6fbd0c493e2de4ea6cc2f4934d5a18d130"}, - {file = "yarl-1.9.4-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:07574b007ee20e5c375a8fe4a0789fad26db905f9813be0f9fef5a68080de559"}, - {file = "yarl-1.9.4-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:5a2e2433eb9344a163aced6a5f6c9222c0786e5a9e9cac2c89f0b28433f56e23"}, - {file = "yarl-1.9.4-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:6ad6d10ed9b67a382b45f29ea028f92d25bc0bc1daf6c5b801b90b5aa70fb9ec"}, - {file = "yarl-1.9.4-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:6fe79f998a4052d79e1c30eeb7d6c1c1056ad33300f682465e1b4e9b5a188b78"}, - {file = "yarl-1.9.4-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:a825ec844298c791fd28ed14ed1bffc56a98d15b8c58a20e0e08c1f5f2bea1be"}, - {file = "yarl-1.9.4-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:8619d6915b3b0b34420cf9b2bb6d81ef59d984cb0fde7544e9ece32b4b3043c3"}, - {file = "yarl-1.9.4-cp38-cp38-win32.whl", hash = "sha256:686a0c2f85f83463272ddffd4deb5e591c98aac1897d65e92319f729c320eece"}, - {file = "yarl-1.9.4-cp38-cp38-win_amd64.whl", hash = "sha256:a00862fb23195b6b8322f7d781b0dc1d82cb3bcac346d1e38689370cc1cc398b"}, - {file = "yarl-1.9.4-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:604f31d97fa493083ea21bd9b92c419012531c4e17ea6da0f65cacdcf5d0bd27"}, - {file = "yarl-1.9.4-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:8a854227cf581330ffa2c4824d96e52ee621dd571078a252c25e3a3b3d94a1b1"}, - {file = "yarl-1.9.4-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:ba6f52cbc7809cd8d74604cce9c14868306ae4aa0282016b641c661f981a6e91"}, - {file = "yarl-1.9.4-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a6327976c7c2f4ee6816eff196e25385ccc02cb81427952414a64811037bbc8b"}, - {file = "yarl-1.9.4-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8397a3817d7dcdd14bb266283cd1d6fc7264a48c186b986f32e86d86d35fbac5"}, - {file = "yarl-1.9.4-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e0381b4ce23ff92f8170080c97678040fc5b08da85e9e292292aba67fdac6c34"}, - {file = "yarl-1.9.4-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:23d32a2594cb5d565d358a92e151315d1b2268bc10f4610d098f96b147370136"}, - {file = "yarl-1.9.4-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ddb2a5c08a4eaaba605340fdee8fc08e406c56617566d9643ad8bf6852778fc7"}, - {file = "yarl-1.9.4-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:26a1dc6285e03f3cc9e839a2da83bcbf31dcb0d004c72d0730e755b33466c30e"}, - {file = "yarl-1.9.4-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:18580f672e44ce1238b82f7fb87d727c4a131f3a9d33a5e0e82b793362bf18b4"}, - {file = "yarl-1.9.4-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:29e0f83f37610f173eb7e7b5562dd71467993495e568e708d99e9d1944f561ec"}, - {file = "yarl-1.9.4-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:1f23e4fe1e8794f74b6027d7cf19dc25f8b63af1483d91d595d4a07eca1fb26c"}, - {file = "yarl-1.9.4-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:db8e58b9d79200c76956cefd14d5c90af54416ff5353c5bfd7cbe58818e26ef0"}, - {file = "yarl-1.9.4-cp39-cp39-win32.whl", hash = "sha256:c7224cab95645c7ab53791022ae77a4509472613e839dab722a72abe5a684575"}, - {file = "yarl-1.9.4-cp39-cp39-win_amd64.whl", hash = "sha256:824d6c50492add5da9374875ce72db7a0733b29c2394890aef23d533106e2b15"}, - {file = "yarl-1.9.4-py3-none-any.whl", hash = "sha256:928cecb0ef9d5a7946eb6ff58417ad2fe9375762382f1bf5c55e61645f2c43ad"}, - {file = "yarl-1.9.4.tar.gz", hash = "sha256:566db86717cf8080b99b58b083b773a908ae40f06681e87e589a976faf8246bf"}, + {file = "yarl-1.16.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:32468f41242d72b87ab793a86d92f885355bcf35b3355aa650bfa846a5c60058"}, + {file = "yarl-1.16.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:234f3a3032b505b90e65b5bc6652c2329ea7ea8855d8de61e1642b74b4ee65d2"}, + {file = "yarl-1.16.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:8a0296040e5cddf074c7f5af4a60f3fc42c0237440df7bcf5183be5f6c802ed5"}, + {file = "yarl-1.16.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:de6c14dd7c7c0badba48157474ea1f03ebee991530ba742d381b28d4f314d6f3"}, + {file = "yarl-1.16.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b140e532fe0266003c936d017c1ac301e72ee4a3fd51784574c05f53718a55d8"}, + {file = "yarl-1.16.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:019f5d58093402aa8f6661e60fd82a28746ad6d156f6c5336a70a39bd7b162b9"}, + {file = "yarl-1.16.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8c42998fd1cbeb53cd985bff0e4bc25fbe55fd6eb3a545a724c1012d69d5ec84"}, + {file = "yarl-1.16.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7c7c30fb38c300fe8140df30a046a01769105e4cf4282567a29b5cdb635b66c4"}, + {file = "yarl-1.16.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:e49e0fd86c295e743fd5be69b8b0712f70a686bc79a16e5268386c2defacaade"}, + {file = "yarl-1.16.0-cp310-cp310-musllinux_1_2_armv7l.whl", hash = "sha256:b9ca7b9147eb1365c8bab03c003baa1300599575effad765e0b07dd3501ea9af"}, + {file = "yarl-1.16.0-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:27e11db3f1e6a51081a981509f75617b09810529de508a181319193d320bc5c7"}, + {file = "yarl-1.16.0-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:8994c42f4ca25df5380ddf59f315c518c81df6a68fed5bb0c159c6cb6b92f120"}, + {file = "yarl-1.16.0-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:542fa8e09a581bcdcbb30607c7224beff3fdfb598c798ccd28a8184ffc18b7eb"}, + {file = "yarl-1.16.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:2bd6a51010c7284d191b79d3b56e51a87d8e1c03b0902362945f15c3d50ed46b"}, + {file = "yarl-1.16.0-cp310-cp310-win32.whl", hash = "sha256:178ccb856e265174a79f59721031060f885aca428983e75c06f78aa24b91d929"}, + {file = "yarl-1.16.0-cp310-cp310-win_amd64.whl", hash = "sha256:fe8bba2545427418efc1929c5c42852bdb4143eb8d0a46b09de88d1fe99258e7"}, + {file = "yarl-1.16.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:d8643975a0080f361639787415a038bfc32d29208a4bf6b783ab3075a20b1ef3"}, + {file = "yarl-1.16.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:676d96bafc8c2d0039cea0cd3fd44cee7aa88b8185551a2bb93354668e8315c2"}, + {file = "yarl-1.16.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:d9525f03269e64310416dbe6c68d3b23e5d34aaa8f47193a1c45ac568cecbc49"}, + {file = "yarl-1.16.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8b37d5ec034e668b22cf0ce1074d6c21fd2a08b90d11b1b73139b750a8b0dd97"}, + {file = "yarl-1.16.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4f32c4cb7386b41936894685f6e093c8dfaf0960124d91fe0ec29fe439e201d0"}, + {file = "yarl-1.16.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5b8e265a0545637492a7e12fd7038370d66c9375a61d88c5567d0e044ded9202"}, + {file = "yarl-1.16.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:789a3423f28a5fff46fbd04e339863c169ece97c827b44de16e1a7a42bc915d2"}, + {file = "yarl-1.16.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f1d1f45e3e8d37c804dca99ab3cf4ab3ed2e7a62cd82542924b14c0a4f46d243"}, + {file = "yarl-1.16.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:621280719c4c5dad4c1391160a9b88925bb8b0ff6a7d5af3224643024871675f"}, + {file = "yarl-1.16.0-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:ed097b26f18a1f5ff05f661dc36528c5f6735ba4ce8c9645e83b064665131349"}, + {file = "yarl-1.16.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:2f1fe2b2e3ee418862f5ebc0c0083c97f6f6625781382f828f6d4e9b614eba9b"}, + {file = "yarl-1.16.0-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:87dd10bc0618991c66cee0cc65fa74a45f4ecb13bceec3c62d78ad2e42b27a16"}, + {file = "yarl-1.16.0-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:4199db024b58a8abb2cfcedac7b1292c3ad421684571aeb622a02f242280e8d6"}, + {file = "yarl-1.16.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:99a9dcd4b71dd5f5f949737ab3f356cfc058c709b4f49833aeffedc2652dac56"}, + {file = "yarl-1.16.0-cp311-cp311-win32.whl", hash = "sha256:a9394c65ae0ed95679717d391c862dece9afacd8fa311683fc8b4362ce8a410c"}, + {file = "yarl-1.16.0-cp311-cp311-win_amd64.whl", hash = "sha256:5b9101f528ae0f8f65ac9d64dda2bb0627de8a50344b2f582779f32fda747c1d"}, + {file = "yarl-1.16.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:4ffb7c129707dd76ced0a4a4128ff452cecf0b0e929f2668ea05a371d9e5c104"}, + {file = "yarl-1.16.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:1a5e9d8ce1185723419c487758d81ac2bde693711947032cce600ca7c9cda7d6"}, + {file = "yarl-1.16.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:d743e3118b2640cef7768ea955378c3536482d95550222f908f392167fe62059"}, + {file = "yarl-1.16.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:26768342f256e6e3c37533bf9433f5f15f3e59e3c14b2409098291b3efaceacb"}, + {file = "yarl-1.16.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d1b0796168b953bca6600c5f97f5ed407479889a36ad7d17183366260f29a6b9"}, + {file = "yarl-1.16.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:858728086914f3a407aa7979cab743bbda1fe2bdf39ffcd991469a370dd7414d"}, + {file = "yarl-1.16.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5570e6d47bcb03215baf4c9ad7bf7c013e56285d9d35013541f9ac2b372593e7"}, + {file = "yarl-1.16.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:66ea8311422a7ba1fc79b4c42c2baa10566469fe5a78500d4e7754d6e6db8724"}, + {file = "yarl-1.16.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:649bddcedee692ee8a9b7b6e38582cb4062dc4253de9711568e5620d8707c2a3"}, + {file = "yarl-1.16.0-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:3a91654adb7643cb21b46f04244c5a315a440dcad63213033826549fa2435f71"}, + {file = "yarl-1.16.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:b439cae82034ade094526a8f692b9a2b5ee936452de5e4c5f0f6c48df23f8604"}, + {file = "yarl-1.16.0-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:571f781ae8ac463ce30bacebfaef2c6581543776d5970b2372fbe31d7bf31a07"}, + {file = "yarl-1.16.0-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:aa7943f04f36d6cafc0cf53ea89824ac2c37acbdb4b316a654176ab8ffd0f968"}, + {file = "yarl-1.16.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:1a5cf32539373ff39d97723e39a9283a7277cbf1224f7aef0c56c9598b6486c3"}, + {file = "yarl-1.16.0-cp312-cp312-win32.whl", hash = "sha256:a5b6c09b9b4253d6a208b0f4a2f9206e511ec68dce9198e0fbec4f160137aa67"}, + {file = "yarl-1.16.0-cp312-cp312-win_amd64.whl", hash = "sha256:1208ca14eed2fda324042adf8d6c0adf4a31522fa95e0929027cd487875f0240"}, + {file = "yarl-1.16.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:a5ace0177520bd4caa99295a9b6fb831d0e9a57d8e0501a22ffaa61b4c024283"}, + {file = "yarl-1.16.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:7118bdb5e3ed81acaa2095cba7ec02a0fe74b52a16ab9f9ac8e28e53ee299732"}, + {file = "yarl-1.16.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:38fec8a2a94c58bd47c9a50a45d321ab2285ad133adefbbadf3012c054b7e656"}, + {file = "yarl-1.16.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8791d66d81ee45866a7bb15a517b01a2bcf583a18ebf5d72a84e6064c417e64b"}, + {file = "yarl-1.16.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1cf936ba67bc6c734f3aa1c01391da74ab7fc046a9f8bbfa230b8393b90cf472"}, + {file = "yarl-1.16.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d1aab176dd55b59f77a63b27cffaca67d29987d91a5b615cbead41331e6b7428"}, + {file = "yarl-1.16.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:995d0759004c08abd5d1b81300a91d18c8577c6389300bed1c7c11675105a44d"}, + {file = "yarl-1.16.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1bc22e00edeb068f71967ab99081e9406cd56dbed864fc3a8259442999d71552"}, + {file = "yarl-1.16.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:35b4f7842154176523e0a63c9b871168c69b98065d05a4f637fce342a6a2693a"}, + {file = "yarl-1.16.0-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:7ace71c4b7a0c41f317ae24be62bb61e9d80838d38acb20e70697c625e71f120"}, + {file = "yarl-1.16.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:8f639e3f5795a6568aa4f7d2ac6057c757dcd187593679f035adbf12b892bb00"}, + {file = "yarl-1.16.0-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:e8be3aff14f0120ad049121322b107f8a759be76a6a62138322d4c8a337a9e2c"}, + {file = "yarl-1.16.0-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:122d8e7986043d0549e9eb23c7fd23be078be4b70c9eb42a20052b3d3149c6f2"}, + {file = "yarl-1.16.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:0fd9c227990f609c165f56b46107d0bc34553fe0387818c42c02f77974402c36"}, + {file = "yarl-1.16.0-cp313-cp313-win32.whl", hash = "sha256:595ca5e943baed31d56b33b34736461a371c6ea0038d3baec399949dd628560b"}, + {file = "yarl-1.16.0-cp313-cp313-win_amd64.whl", hash = "sha256:921b81b8d78f0e60242fb3db615ea3f368827a76af095d5a69f1c3366db3f596"}, + {file = "yarl-1.16.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:ab2b2ac232110a1fdb0d3ffcd087783edd3d4a6ced432a1bf75caf7b7be70916"}, + {file = "yarl-1.16.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:7f8713717a09acbfee7c47bfc5777e685539fefdd34fa72faf504c8be2f3df4e"}, + {file = "yarl-1.16.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:cdcffe1dbcb4477d2b4202f63cd972d5baa155ff5a3d9e35801c46a415b7f71a"}, + {file = "yarl-1.16.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9a91217208306d82357c67daeef5162a41a28c8352dab7e16daa82e3718852a7"}, + {file = "yarl-1.16.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3ab3ed42c78275477ea8e917491365e9a9b69bb615cb46169020bd0aa5e2d6d3"}, + {file = "yarl-1.16.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:707ae579ccb3262dfaef093e202b4c3fb23c3810e8df544b1111bd2401fd7b09"}, + {file = "yarl-1.16.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ad7a852d1cd0b8d8b37fc9d7f8581152add917a98cfe2ea6e241878795f917ae"}, + {file = "yarl-1.16.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d3f1cc3d3d4dc574bebc9b387f6875e228ace5748a7c24f49d8f01ac1bc6c31b"}, + {file = "yarl-1.16.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:5ff96da263740779b0893d02b718293cc03400c3a208fc8d8cd79d9b0993e532"}, + {file = "yarl-1.16.0-cp39-cp39-musllinux_1_2_armv7l.whl", hash = "sha256:3d375a19ba2bfe320b6d873f3fb165313b002cef8b7cc0a368ad8b8a57453837"}, + {file = "yarl-1.16.0-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:62c7da0ad93a07da048b500514ca47b759459ec41924143e2ddb5d7e20fd3db5"}, + {file = "yarl-1.16.0-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:147b0fcd0ee33b4b5f6edfea80452d80e419e51b9a3f7a96ce98eaee145c1581"}, + {file = "yarl-1.16.0-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:504e1fe1cc4f170195320eb033d2b0ccf5c6114ce5bf2f617535c01699479bca"}, + {file = "yarl-1.16.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:bdcf667a5dec12a48f669e485d70c54189f0639c2157b538a4cffd24a853624f"}, + {file = "yarl-1.16.0-cp39-cp39-win32.whl", hash = "sha256:e9951afe6557c75a71045148890052cb942689ee4c9ec29f5436240e1fcc73b7"}, + {file = "yarl-1.16.0-cp39-cp39-win_amd64.whl", hash = "sha256:7d7aaa8ff95d0840e289423e7dc35696c2b058d635f945bf05b5cd633146b027"}, + {file = "yarl-1.16.0-py3-none-any.whl", hash = "sha256:e6980a558d8461230c457218bd6c92dfc1d10205548215c2c21d79dc8d0a96f3"}, + {file = "yarl-1.16.0.tar.gz", hash = "sha256:b6f687ced5510a9a2474bbae96a4352e5ace5fa34dc44a217b0537fec1db00b4"}, ] [package.dependencies] idna = ">=2.0" multidict = ">=4.0" +propcache = ">=0.2.0" [[package]] name = "zipp" -version = "3.20.0" +version = "3.20.2" description = "Backport of pathlib-compatible object wrapper for zip files" optional = false python-versions = ">=3.8" files = [ - {file = "zipp-3.20.0-py3-none-any.whl", hash = "sha256:58da6168be89f0be59beb194da1250516fdaa062ccebd30127ac65d30045e10d"}, - {file = "zipp-3.20.0.tar.gz", hash = "sha256:0145e43d89664cfe1a2e533adc75adafed82fe2da404b4bbb6b026c0157bdb31"}, + {file = "zipp-3.20.2-py3-none-any.whl", hash = "sha256:a817ac80d6cf4b23bf7f2828b7cabf326f15a001bea8b1f9b49631780ba28350"}, + {file = "zipp-3.20.2.tar.gz", hash = "sha256:bc9eb26f4506fda01b81bcde0ca78103b6e62f991b381fec825435c836edbc29"}, ] [package.extras] +check = ["pytest-checkdocs (>=2.4)", "pytest-ruff (>=0.2.1)"] +cover = ["pytest-cov"] doc = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-lint"] -test = ["big-O", "importlib-resources", "jaraco.functools", "jaraco.itertools", "jaraco.test", "more-itertools", "pytest (>=6,!=8.1.*)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-ignore-flaky", "pytest-mypy", "pytest-ruff (>=0.2.1)"] +enabler = ["pytest-enabler (>=2.2)"] +test = ["big-O", "importlib-resources", "jaraco.functools", "jaraco.itertools", "jaraco.test", "more-itertools", "pytest (>=6,!=8.1.*)", "pytest-ignore-flaky"] +type = ["pytest-mypy"] [metadata] lock-version = "2.0" python-versions = ">=3.11,<4" -content-hash = "1b4aee3240e687ee7d2e0da059167fb3df780a72a71b6e5bcd1a00d147ebc199" +content-hash = "9e8161320447d7b61416abfb1d60fbeabb713f65f34b927863cf4d2f317af01c" diff --git a/pyproject.toml b/pyproject.toml index 7de452f..c22acac 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -3,11 +3,12 @@ requires = ["poetry-core>=1.0.0"] build-backend = "poetry.core.masonry.api" [project] +name = "boardwalk" requires-python = ">=3.11" [tool.poetry] name = "boardwalk" -version = "0.8.21" +version = "0.8.22" description = "Boardwalk is a linear Ansible workflow engine" readme = "README.md" authors = [ @@ -46,17 +47,25 @@ pydantic = ">=2.4.2" tornado = ">=6.2" slack-bolt = "^1.18.1" aiohttp = "^3.9.3" # Required by slack-bolt's AsyncApp +loguru = "^0.7.2" [tool.poetry.group.dev.dependencies] pyright = "==1.1.350" -semgrep = ">=1.66.0" -ruff = "^0.3.4" +semgrep = ">=1.92.0" +ruff = "^0.6.4" pytest = "^8.1.1" +anyio = "^4.6.2.post1" [tool.poetry.scripts] boardwalk = "boardwalk.cli:cli" boardwalkd = "boardwalkd.cli:cli" +[tool.pytest.ini_options] +filterwarnings = [ + # Not entirely concerned about Pydantic warnings at the moment. + 'ignore:::pydantic.*:', +] + [tool.ruff] line-length = 120 diff --git a/src/boardwalk/__init__.py b/src/boardwalk/__init__.py index e3513d2..8603238 100644 --- a/src/boardwalk/__init__.py +++ b/src/boardwalk/__init__.py @@ -5,6 +5,12 @@ from .manifest import ( Job as Job, ) +from .manifest import ( + PlaybookJob as PlaybookJob, +) +from .manifest import ( + TaskJob as TaskJob, +) from .manifest import ( Workflow as Workflow, ) diff --git a/src/boardwalk/ansible.py b/src/boardwalk/ansible.py index 566d513..3ac998f 100644 --- a/src/boardwalk/ansible.py +++ b/src/boardwalk/ansible.py @@ -5,13 +5,13 @@ from __future__ import annotations import json -import logging import sys from functools import partial from pathlib import Path from typing import TYPE_CHECKING import ansible_runner +from loguru import logger import boardwalk from boardwalk.app_exceptions import BoardwalkException @@ -45,7 +45,9 @@ class RunnerKwargs(TypedDict, total=False): project_dir: str quiet: bool suppress_env_files: bool - playbook: RunnerPlaybook + playbook: RunnerPlaybook | AnsibleTasksType + verbosity: int + extravars: dict | None class RunnerKwargsEnvvars(TypedDict, total=False): ANSIBLE_BECOME_ASK_PASS: str @@ -62,9 +64,6 @@ class RunnerPlaybook(TypedDict, total=False): vars: dict[str, str | bool] -logger = logging.getLogger(__name__) - - def ansible_runner_cancel_callback(ws: Workspace): """ ansible_runner needs a callback to tell it to stop execution. It returns @@ -99,11 +98,11 @@ def ansible_runner_errors_to_output(runner: Runner, include_msg: bool = True) -> try: msg.append(event["event_data"]["res"]["msg"]) except KeyError: - logger.warn("Event error did not contain msg") + logger.warning("Event error did not contain msg") try: msg.append(event["stdout"]) except KeyError: - logger.warn("Event error did not contain stdout") + logger.warning("Event error did not contain stdout") output.append(": ".join(msg)) return "\n".join(output) @@ -111,6 +110,7 @@ def ansible_runner_errors_to_output(runner: Runner, include_msg: bool = True) -> def ansible_runner_run_tasks( hosts: str, invocation_msg: str, + job_type: boardwalk.manifest.JobTypes, tasks: AnsibleTasksType, become: bool = False, become_password: str | None = None, @@ -119,6 +119,7 @@ def ansible_runner_run_tasks( limit: str | None = None, quiet: bool = True, timeout: int | None = None, + verbosity: int = 0, ) -> ansible_runner.Runner: """ Wraps ansible_runner.run to run Ansible tasks with some defaults for @@ -139,6 +140,7 @@ def ansible_runner_run_tasks( "project_dir": str(Path.cwd()), "quiet": quiet, "suppress_env_files": True, + "verbosity": verbosity, } if check: runner_kwargs["cmdline"] = "--check" @@ -147,13 +149,20 @@ def ansible_runner_run_tasks( if timeout: runner_kwargs["envvars"]["ANSIBLE_TASK_TIMEOUT"] = str(timeout) - runner_kwargs["playbook"] = { - "hosts": hosts, - "gather_facts": gather_facts, - "become": become, - "tasks": tasks, - "vars": {"boardwalk_operation": True}, - } + logger.trace(f"Constructing runner_kwargs for job type {job_type.name}") + if job_type == boardwalk.manifest.JobTypes.TASK: + runner_kwargs["playbook"] = { + "hosts": hosts, + "gather_facts": gather_facts, + "become": become, + "tasks": tasks, + "vars": {"boardwalk_operation": True}, + } + if job_type == boardwalk.manifest.JobTypes.PLAYBOOK: + # Executing a (list of) playbook(s) requires some different settings + runner_kwargs["limit"] = hosts + runner_kwargs["extravars"] = {"boardwalk_operation": True} + runner_kwargs["playbook"] = tasks output_msg_prefix = f"{hosts}: ansible_runner invocation" if limit: diff --git a/src/boardwalk/app_exceptions.py b/src/boardwalk/app_exceptions.py index fe1bd4b..0c1877c 100644 --- a/src/boardwalk/app_exceptions.py +++ b/src/boardwalk/app_exceptions.py @@ -2,12 +2,10 @@ Common application exception classes """ -import logging import typing from click import ClickException - -logger = logging.getLogger(__name__) +from loguru import logger class BoardwalkException(ClickException): diff --git a/src/boardwalk/cli.py b/src/boardwalk/cli.py index 3b13b7c..6a8d207 100755 --- a/src/boardwalk/cli.py +++ b/src/boardwalk/cli.py @@ -4,14 +4,13 @@ from __future__ import annotations -import logging -import os import signal import sys from importlib.metadata import version as lib_version -from typing import TYPE_CHECKING, Literal +from typing import TYPE_CHECKING import click +from loguru import logger # noqa: F401 from boardwalk.app_exceptions import BoardwalkException from boardwalk.cli_catch import catch, release @@ -25,12 +24,10 @@ WorkspaceNotFound, get_ws, ) -from boardwalk.utils import strtobool if TYPE_CHECKING: from typing import Any -logger = logging.getLogger(__name__) terminating = False @@ -43,52 +40,41 @@ def handle_signal(sig: int, frame: Any): signals sent to child processes (ansible-playbook) """ global terminating - logger.warn(f"Received signal {sig}") + logger.warning(f"Received signal {sig}") if not terminating: terminating = True raise KeyboardInterrupt else: - logger.warn("Boardwalk is already terminating") + logger.warning("Boardwalk is already terminating") @click.group() @click.option( - "--debug/--no-debug", - "-D/-nD", - help=( - "Whether or not output debug messages. Alternatively may be set with" - " the BOARDWALK_DEBUG=1 environment variable" - ), - default=False, + "-v", + "--verbose", + count=True, + default=0, + envvar="BOARDWALK_VERBOSITY", + help="Whether or not output messages should be verbose. Additional -v's increases the verbosity", show_default=True, + show_envvar=True, + type=click.IntRange(min=0, max=5, clamp=True), ) @click.pass_context -def cli(ctx: click.Context, debug: bool | Literal[0, 1]): +def cli(ctx: click.Context, verbose: int): """ Boardwalk is a linear remote execution workflow engine built on top of Ansible. See the README.md @ https://github.com/Backblaze/boardwalk for more info To see more info about any subcommand, do `boardwalk --help` """ - try: - debug = strtobool(os.environ["BOARDWALK_DEBUG"]) - except KeyError: - pass - except ValueError: - raise BoardwalkException("BOARDWALK_DEBUG env variable has an invalid boolean value") - - if debug: - loglevel = logging.DEBUG - logformat = "%(levelname)s:%(name)s:%(threadName)s:%(message)s" - else: - loglevel = logging.INFO - logformat = "%(levelname)s:%(name)s:%(message)s" - - logging.basicConfig( - format=logformat, - handlers=[logging.StreamHandler(sys.stdout)], - level=loglevel, - ) + ctx.ensure_object(dict) + + loglevel = "INFO" if verbose == 0 else "DEBUG" if verbose == 1 else "TRACE" + ctx.obj["VERBOSITY"] = verbose + logger.remove() + logger.add(sys.stdout, level=loglevel) + logger.info(f"Log level is {loglevel}") signal.signal(signal.SIGINT, handle_signal) signal.signal(signal.SIGHUP, handle_signal) diff --git a/src/boardwalk/cli_catch.py b/src/boardwalk/cli_catch.py index 3fb7b64..b7b963a 100644 --- a/src/boardwalk/cli_catch.py +++ b/src/boardwalk/cli_catch.py @@ -2,15 +2,12 @@ catch and release CLI subcommands """ -import logging - import click +from loguru import logger from boardwalk.app_exceptions import BoardwalkException from boardwalk.manifest import NoActiveWorkspace, get_ws -logger = logging.getLogger(__name__) - @click.command( "catch", diff --git a/src/boardwalk/cli_init.py b/src/boardwalk/cli_init.py index d6dfb8b..1ad7ada 100644 --- a/src/boardwalk/cli_init.py +++ b/src/boardwalk/cli_init.py @@ -4,11 +4,11 @@ from __future__ import annotations -import logging from pathlib import Path from typing import TYPE_CHECKING, TypedDict import click +from loguru import logger from boardwalk.ansible import ( AnsibleRunError, @@ -19,7 +19,7 @@ ) from boardwalk.app_exceptions import BoardwalkException from boardwalk.host import Host -from boardwalk.manifest import NoActiveWorkspace, Workspace, get_ws +from boardwalk.manifest import JobTypes, NoActiveWorkspace, Workspace, get_ws if TYPE_CHECKING: from ansible_runner import RunnerEvent @@ -36,9 +36,6 @@ class runnerKwargs(TypedDict, total=False): timeout: int -logger = logging.getLogger(__name__) - - @click.command(short_help="Inits local workspace state by getting host facts") @click.option( "--limit", @@ -99,7 +96,7 @@ def init(ctx: click.Context, limit: str, retry: bool): # Run Ansible hosts_were_unreachable = False try: - runner = ansible_runner_run_tasks(**runner_kwargs) + runner = ansible_runner_run_tasks(**runner_kwargs, job_type=JobTypes.TASK) except ( AnsibleRunnerFailedHost, AnsibleRunnerGeneralError, @@ -136,7 +133,7 @@ def init(ctx: click.Context, limit: str, retry: bool): # Note if any hosts were unreachable if hosts_were_unreachable: - logger.warn("Some hosts were unreachable. Consider running again with --retry") + logger.warning("Some hosts were unreachable. Consider running again with --retry") # If we didn't find any hosts, raise an exception if len(ws.state.hosts) == 0: @@ -164,9 +161,9 @@ def handle_failed_init_hosts(event: RunnerEvent, retry_file_path: Path): or unreachable hosts to a retry file and writes warnings and errors to stdout""" # Save any unreachable/failed hosts to the retry file if event["event"] == "runner_on_unreachable" or event["event"] == "runner_on_failed": - logger.warn(event["stdout"]) + logger.warning(event["stdout"]) with open(retry_file_path, "a") as file: file.write(f"{event['event_data']['host']}\n") # If no hosts matched or there are warnings, write them out if event["event"] == "warning" or event["event"] == "playbook_on_no_hosts_matched": - logger.warn(event["stdout"]) + logger.warning(event["stdout"]) diff --git a/src/boardwalk/cli_login.py b/src/boardwalk/cli_login.py index dc3a9aa..d47b9e6 100644 --- a/src/boardwalk/cli_login.py +++ b/src/boardwalk/cli_login.py @@ -5,10 +5,10 @@ import asyncio import click -from boardwalkd.protocol import Client from boardwalk.app_exceptions import BoardwalkException from boardwalk.manifest import get_boardwalkd_url +from boardwalkd.protocol import Client @click.command("login") diff --git a/src/boardwalk/cli_run.py b/src/boardwalk/cli_run.py index 3f39825..1e24c77 100644 --- a/src/boardwalk/cli_run.py +++ b/src/boardwalk/cli_run.py @@ -6,7 +6,6 @@ import concurrent.futures import getpass -import logging import os import random import socket @@ -18,12 +17,7 @@ import ansible_runner import click -from boardwalkd.protocol import ( - WorkspaceClient, - WorkspaceDetails, - WorkspaceEvent, - WorkspaceHasMutex, -) +from loguru import logger from tornado.httpclient import HTTPClientError from tornado.simple_httpclient import HTTPTimeoutError @@ -41,13 +35,18 @@ from boardwalk.manifest import NoActiveWorkspace, Workspace, get_boardwalkd_url, get_ws from boardwalk.state import RemoteStateModel, RemoteStateWorkflow, RemoteStateWorkspace from boardwalk.utils import strtobool +from boardwalkd.protocol import ( + WorkspaceClient, + WorkspaceDetails, + WorkspaceEvent, + WorkspaceHasMutex, +) if TYPE_CHECKING: from collections.abc import ItemsView from boardwalk.ansible import HostVarsType, InventoryHostVars -logger = logging.getLogger(__name__) become_password: str | None = None boardwalkd_client: WorkspaceClient | None = None @@ -202,6 +201,7 @@ def run( hosts=hosts_working_list, inventory_vars=inventory_vars, workspace=ws, + verbosity=ctx.obj["VERBOSITY"], ) @@ -258,6 +258,7 @@ def run_workflow( hosts: list[Host], inventory_vars: HostVarsType, workspace: Workspace, + verbosity: int, ): """Runs the workspace's workflow against a list of hosts""" i = 0 @@ -284,7 +285,7 @@ def run_workflow( unreachable_exception = None try: directly_confirm_host_preconditions(host, inventory_vars[host.name], workspace) - execute_host_workflow(host, workspace) + execute_host_workflow(host, workspace, verbosity) except AnsibleRunnerUnreachableHost as e: unreachable_exception = e finally: @@ -438,7 +439,7 @@ def check_host_preconditions_locally( and not boardwalk_state.workspaces[workspace.name].workflow.succeeded ): hosts_meeting_preconditions.append(host) - logger.warn( + logger.warning( f"{host.name}: Host started workflow but never completed." " Job preconditions are ignored for this host" ) @@ -449,7 +450,7 @@ def check_host_preconditions_locally( for job in chain(workflow.i_jobs, workflow.i_exit_jobs): if not job.preconditions(facts=host.ansible_facts, inventory_vars=inventory_vars[host.name]): any_job_preconditions_unmet = True - logger.warn( + logger.warning( f"{host.name}: Job {job.name} preconditions unmet in local state" " and will be skipped. If this is in error, re-run `boardwalk init`" ) @@ -626,7 +627,7 @@ def directly_confirm_host_preconditions(host: Host, inventory_vars: InventoryHos boardwalk_state.workspaces[workspace.name].workflow.started and not boardwalk_state.workspaces[workspace.name].workflow.succeeded ): - logger.warn( + logger.warning( f"{host.name}: Host started workflow but never completed. Job preconditions are ignored for this host" ) return True @@ -638,7 +639,7 @@ def directly_confirm_host_preconditions(host: Host, inventory_vars: InventoryHos for job in chain(workflow.i_jobs, workflow.i_exit_jobs): if not job.preconditions(facts=host.ansible_facts, inventory_vars=inventory_vars): all_job_preconditions_met = False - logger.warn(f"Job {job.name} preconditions unmet on host") + logger.warning(f"Job {job.name} preconditions unmet on host") if boardwalkd_client and not all_job_preconditions_met: boardwalkd_client.queue_event( WorkspaceEvent( @@ -653,7 +654,7 @@ def directly_confirm_host_preconditions(host: Host, inventory_vars: InventoryHos return True -def execute_workflow_jobs(host: Host, workspace: Workspace, job_kind: str): +def execute_workflow_jobs(host: Host, workspace: Workspace, job_kind: str, verbosity: int): """ Executes workflow jobs. Different kinds of job types are specified """ @@ -680,24 +681,26 @@ def execute_workflow_jobs(host: Host, workspace: Workspace, job_kind: str): boardwalkd_client.queue_event( WorkspaceEvent( severity="info", - message=f"{host.name}: Running {job_kind} job {job.name}", + message=f"{host.name}: Running {job_kind} {job.job_type.name} job {job.name}", ), ) # Get tasks (which may also run user-supplied python code locally) tasks = job.tasks() if len(tasks) > 0: host.ansible_run( + verbosity=verbosity, + job_type=job.job_type, become_password=become_password, become=True, check=_check_mode, gather_facts=False, - invocation_msg=f"{job_kind}_Job_{job.name}", + invocation_msg=f"{job_kind}_{job.job_type.name}_Job_{job.name}", quiet=False, tasks=tasks, ) -def execute_host_workflow(host: Host, workspace: Workspace): +def execute_host_workflow(host: Host, workspace: Workspace, verbosity: int): """Handles executing all jobs defined in a workflow against a host""" unreachable_exception = None @@ -725,14 +728,14 @@ def execute_host_workflow(host: Host, workspace: Workspace): broadcast=boardwalkd_send_broadcasts, ) try: - execute_workflow_jobs(host, workspace, job_kind="main") + execute_workflow_jobs(host, workspace, job_kind="main", verbosity=verbosity) except AnsibleRunnerUnreachableHost as e: unreachable_exception = e finally: # If the host was unreachable there's no point in trying to recover here if unreachable_exception: raise unreachable_exception - execute_workflow_jobs(host, workspace, job_kind="exit") + execute_workflow_jobs(host, workspace, job_kind="exit", verbosity=verbosity) logger.info(f"{host.name}: Updating remote state") if boardwalkd_client: diff --git a/src/boardwalk/cli_workspace.py b/src/boardwalk/cli_workspace.py index 635ffa7..0493f4e 100644 --- a/src/boardwalk/cli_workspace.py +++ b/src/boardwalk/cli_workspace.py @@ -2,15 +2,12 @@ workspace CLI subcommand group """ -import logging - import click +from loguru import logger from boardwalk.app_exceptions import BoardwalkException from boardwalk.manifest import ManifestNotFound, NoActiveWorkspace, Workspace, WorkspaceNotFound, get_ws -logger = logging.getLogger(__name__) - @click.group(short_help="Subcommand group for working with workspaces") def workspace(): @@ -30,7 +27,11 @@ def workspace_show(): def workspace_use_completion(ctx, param, incomplete): """Allows click to perform shell completion for workspace names in `boardwalk workspace use`""" try: - get_ws() + try: + get_ws() + except NoActiveWorkspace: + pass + return sorted( [name for name in [i.__qualname__ for i in Workspace.__subclasses__()] if name.startswith(incomplete)] ) diff --git a/src/boardwalk/host.py b/src/boardwalk/host.py index e5b393e..8052e81 100644 --- a/src/boardwalk/host.py +++ b/src/boardwalk/host.py @@ -11,7 +11,7 @@ from datetime import UTC, datetime from typing import TYPE_CHECKING, Any -from pydantic import BaseModel, Extra +from pydantic import BaseModel import boardwalk from boardwalk.ansible import ansible_runner_run_tasks @@ -23,7 +23,7 @@ from boardwalk.ansible import AnsibleTasksType -class Host(BaseModel, extra=Extra.forbid): +class Host(BaseModel, extra="forbid"): """Data and methods for managing an individual host""" ansible_facts: dict[str, Any] @@ -42,6 +42,8 @@ def ansible_run( self, invocation_msg: str, tasks: AnsibleTasksType, + job_type: boardwalk.manifest.JobTypes, + verbosity: int = 0, become: bool = False, become_password: str | None = None, check: bool = False, @@ -52,6 +54,8 @@ def ansible_run( Wraps ansible_runner_run_tasks for performing Ansible tasks against this host """ return ansible_runner_run_tasks( + verbosity=verbosity, + job_type=job_type, hosts=self.name, invocation_msg=invocation_msg, tasks=tasks, @@ -84,6 +88,7 @@ def is_locked(self) -> str | bool: invocation_msg="check_remote_host_lock", gather_facts=False, tasks=tasks, + job_type=boardwalk.manifest.JobTypes.TASK, ) lockfile_stat_exists = False @@ -158,6 +163,7 @@ def lock( gather_facts=False, invocation_msg="lock_remote_host", tasks=tasks, + job_type=boardwalk.manifest.JobTypes.TASK, ) def release(self, become_password: str | None = None, check: bool = False) -> None: @@ -185,6 +191,7 @@ def release(self, become_password: str | None = None, check: bool = False) -> No gather_facts=False, invocation_msg="release_remote_host", tasks=tasks, + job_type=boardwalk.manifest.JobTypes.TASK, ) def gather_facts(self) -> dict[str, Any]: @@ -194,6 +201,7 @@ def gather_facts(self) -> dict[str, Any]: invocation_msg="gather_facts", gather_facts=False, tasks=tasks, + job_type=boardwalk.manifest.JobTypes.TASK, ) facts: dict[str, Any] = {"ansible_local": {}} for event in runner.events: @@ -213,6 +221,7 @@ def get_remote_state(self) -> boardwalk.state.RemoteStateModel: invocation_msg="get_remote_state", gather_facts=False, tasks=tasks, + job_type=boardwalk.manifest.JobTypes.TASK, ) # Get existing boardwalk_state fact, if any @@ -272,6 +281,7 @@ def set_remote_state( gather_facts=False, invocation_msg="set_remote_state", tasks=tasks, + job_type=boardwalk.manifest.JobTypes.TASK, ) if not check: self.ansible_facts["ansible_local"]["boardwalk_state"] = remote_state_obj.dict() diff --git a/src/boardwalk/manifest.py b/src/boardwalk/manifest.py index 12ac22f..fe4f3b2 100644 --- a/src/boardwalk/manifest.py +++ b/src/boardwalk/manifest.py @@ -7,10 +7,12 @@ import os import sys +import warnings from abc import ABC, abstractmethod +from enum import Enum from pathlib import Path from tempfile import NamedTemporaryFile -from typing import TYPE_CHECKING +from typing import TYPE_CHECKING, overload from boardwalk.app_exceptions import BoardwalkException from boardwalk.state import LocalState @@ -60,7 +62,7 @@ def get_ws() -> Workspace: raise ManifestNotFound # Check if there are duplicate class names - class_list = [Job, Workspace, Workflow, WorkspaceConfig] + class_list = [TaskJob, Workspace, Workflow, WorkspaceConfig] for item in class_list: subclasses: list[str] = [] for subclass in item.__subclasses__(): @@ -103,8 +105,15 @@ def get_boardwalkd_url() -> str: return boardwalkd_url -class Job: - """Defines a single Job as methods""" +class JobTypes(Enum): + TASK = 1 + PLAYBOOK = 2 + + +class BaseJob: + """ + The base class for Jobs + """ def __init__(self, options: dict[str, Any] = dict()): self.name = self.__class__.__name__ @@ -120,12 +129,6 @@ def preconditions(self, facts: AnsibleFacts, inventory_vars: InventoryHostVars) """Optional user method. Return True if preconditions are met, else return False""" return True - def tasks(self) -> AnsibleTasksType: - """Optional user method. Return list of Ansible tasks to run. If an - empty list is returned, then the workflow doesn't connect to a host, - however, any code in this method still runs""" - return [] - def _required_options(self) -> tuple[str]: """ Internal helper method. Always returns self.required_options() as a @@ -148,6 +151,55 @@ def _check_options(self, options: dict[str, Any]): raise ValueError(f"Required options missing: {', '.join(missing_options)}") +class TaskJob(BaseJob): + """Defines a single Job as methods, used to execute Tasks""" + + def __init__(self): + super().__init__() + self.job_type = JobTypes.TASK + + def tasks(self) -> AnsibleTasksType: + """Optional user method. Return list of Ansible tasks to run. If an + empty list is returned, then the workflow doesn't connect to a host, + however, any code in this method still runs""" + return [] + + +class Job(TaskJob): + """Defines a single Job as methods, used to execute Tasks. + + Deprecated in favor of TaskJob. + """ + + def __init__(self): + warnings.warn( + "The job type Job is deprecated, and will be removed in a future release. Use TaskJob or PlaybookJob, as appropriate.", + DeprecationWarning, + ) + super().__init__() + + +class PlaybookJob(BaseJob): + """Defines a single Job as methods, used to execute Playbooks""" + + def __init__(self): + super().__init__() + self.job_type = JobTypes.PLAYBOOK + + def tasks(self) -> AnsibleTasksType: + """Helper method used to return the contents of the self.playbooks() function.""" + return self.playbooks() + + def playbooks(self) -> AnsibleTasksType: + """ + Optional user method. Return list of Ansible playbooks to run, in the + format of an ansible.builtin.import_playbook task. If an empty list is + returned, then the workflow doesn't connect to a host, however, any code + in this method still runs + """ + return [] + + class WorkflowConfig: """ Configuration block for Workflows @@ -169,10 +221,10 @@ class Workflow(ABC): def __init__(self): # If user-provided Jobs as a single Job, convert to tuple workflow_jobs = self.jobs() - if isinstance(workflow_jobs, Job): + if isinstance(workflow_jobs, TaskJob) or isinstance(workflow_jobs, PlaybookJob): workflow_jobs = (workflow_jobs,) workflow_exit_jobs = self.exit_jobs() - if isinstance(workflow_exit_jobs, Job): + if isinstance(workflow_exit_jobs, TaskJob) or isinstance(workflow_exit_jobs, PlaybookJob): workflow_exit_jobs = (workflow_exit_jobs,) # self._jobs is the list of initialized Jobs. self.i_jobs = workflow_jobs @@ -185,12 +237,24 @@ def config(self) -> WorkflowConfig: """Optionally-supplied WorkflowConfig options""" return WorkflowConfig() + @overload + @abstractmethod + def jobs(self) -> TaskJob | tuple[TaskJob, ...]: ... + + @overload + @abstractmethod + def jobs(self) -> PlaybookJob | tuple[PlaybookJob, ...]: ... + + @overload + @abstractmethod + def jobs(self) -> tuple[TaskJob | PlaybookJob, ...]: ... + @abstractmethod - def jobs(self) -> Job | tuple[Job, ...]: + def jobs(self): """Required user method. Defines the Jobs in a workflow. Order matters""" raise NotImplementedError - def exit_jobs(self) -> Job | tuple[Job, ...]: + def exit_jobs(self) -> TaskJob | PlaybookJob | tuple[TaskJob | PlaybookJob, ...]: """ Optional user method. Defines Workflow Jobs that we will always try to run, even on failure. Order matters. exit_jobs run after regular Jobs diff --git a/src/boardwalk/state.py b/src/boardwalk/state.py index b78e4cf..588b726 100644 --- a/src/boardwalk/state.py +++ b/src/boardwalk/state.py @@ -2,12 +2,12 @@ This file holds the state model """ -from pydantic import BaseModel, Extra +from pydantic import BaseModel from boardwalk.host import Host -class StateBaseModel(BaseModel, extra=Extra.forbid): +class StateBaseModel(BaseModel, extra="forbid"): """Base model for local and remote state""" diff --git a/src/boardwalkd/__init__.py b/src/boardwalkd/__init__.py index e69de29..1014e0c 100644 --- a/src/boardwalkd/__init__.py +++ b/src/boardwalkd/__init__.py @@ -0,0 +1,3 @@ +from loguru import logger + +logger.disable("boardwalkd") diff --git a/src/boardwalkd/cli.py b/src/boardwalkd/cli.py index c64d3e5..e796a6d 100644 --- a/src/boardwalkd/cli.py +++ b/src/boardwalkd/cli.py @@ -3,18 +3,15 @@ """ import asyncio -import logging import re from importlib.metadata import version as lib_version import click -from boardwalk.app_exceptions import BoardwalkException from email_validator import EmailNotValidError, validate_email +from boardwalk.app_exceptions import BoardwalkException from boardwalkd.server import run -logging.basicConfig(level=logging.INFO) - CONTEXT_SETTINGS: dict = dict( auto_envvar_prefix="BOARDWALKD", ) diff --git a/src/boardwalkd/protocol.py b/src/boardwalkd/protocol.py index 71a511d..d58dc9d 100644 --- a/src/boardwalkd/protocol.py +++ b/src/boardwalkd/protocol.py @@ -6,7 +6,6 @@ import asyncio import concurrent.futures import json -import logging import socket import threading import time @@ -16,7 +15,8 @@ from pathlib import Path from urllib.parse import urljoin, urlparse -from pydantic import BaseModel, Extra, field_validator +from loguru import logger +from pydantic import BaseModel, field_validator from tornado.httpclient import ( HTTPClient, HTTPClientError, @@ -27,10 +27,8 @@ from tornado.simple_httpclient import HTTPTimeoutError from tornado.websocket import websocket_connect -logger = logging.getLogger(__name__) - -class ProtocolBaseModel(BaseModel, extra=Extra.forbid): +class ProtocolBaseModel(BaseModel, extra="forbid"): """BaseModel for protocol usage""" @@ -263,7 +261,7 @@ def workspace_heartbeat_keepalive(self, workspace_name: str, quit: threading.Eve """Tries to post a heartbeat to the server every 5 seconds""" while True: if quit.is_set(): - logging.debug("Heartbeat keepalive thread closing") + logger.debug("Heartbeat keepalive thread closing") return try: self.workspace_post_heartbeat(workspace_name) diff --git a/src/boardwalkd/server.py b/src/boardwalkd/server.py index f45b881..d23f452 100644 --- a/src/boardwalkd/server.py +++ b/src/boardwalkd/server.py @@ -25,14 +25,14 @@ import tornado.httpclient import tornado.web import tornado.websocket -from boardwalk.app_exceptions import BoardwalkException -from boardwalk.utils import strtobool from cryptography.fernet import Fernet from pydantic import ValidationError from tornado.escape import url_escape, url_unescape from tornado.log import access_log, app_log from tornado.routing import HostMatches +from boardwalk.app_exceptions import BoardwalkException +from boardwalk.utils import strtobool from boardwalkd.broadcast import handle_slack_broadcast from boardwalkd.protocol import ApiLoginMessage, WorkspaceDetails, WorkspaceEvent from boardwalkd.state import User, WorkspaceState, load_state, valid_user_roles diff --git a/src/boardwalkd/slack.py b/src/boardwalkd/slack.py index 9926b3e..beaadf7 100644 --- a/src/boardwalkd/slack.py +++ b/src/boardwalkd/slack.py @@ -10,7 +10,6 @@ from logging import Logger from typing import Any -from boardwalk.app_exceptions import BoardwalkException from slack_bolt.adapter.socket_mode.async_handler import AsyncSocketModeHandler from slack_bolt.async_app import AsyncAck, AsyncApp, AsyncBoltContext from slack_sdk.errors import SlackApiError @@ -36,6 +35,7 @@ from slack_sdk.models.views import View from slack_sdk.web.async_client import AsyncWebClient +from boardwalk.app_exceptions import BoardwalkException from boardwalkd.protocol import WorkspaceEvent from boardwalkd.server import SERVER_URL, SLACK_SLASH_COMMAND_PREFIX, SLACK_TOKENS, internal_workspace_event from boardwalkd.server import state as STATE diff --git a/src/boardwalkd/state.py b/src/boardwalkd/state.py index 79ae384..501d735 100644 --- a/src/boardwalkd/state.py +++ b/src/boardwalkd/state.py @@ -7,7 +7,7 @@ from datetime import datetime from pathlib import Path -from pydantic import BaseModel, EmailStr, Extra, field_validator +from pydantic import BaseModel, EmailStr, field_validator from boardwalkd.protocol import WorkspaceDetails, WorkspaceEvent, WorkspaceSemaphores @@ -17,7 +17,7 @@ valid_user_roles = {"default", "admin"} -class StateBaseModel(BaseModel, extra=Extra.forbid): +class StateBaseModel(BaseModel, extra="forbid"): """BaseModel for state usage""" diff --git a/test/boardwalk/test_boardwalk_cli.py b/test/boardwalk/test_boardwalk_cli.py new file mode 100644 index 0000000..c2a0d28 --- /dev/null +++ b/test/boardwalk/test_boardwalk_cli.py @@ -0,0 +1,11 @@ +from importlib.metadata import version as lib_version + +from click.testing import CliRunner + +from boardwalk import cli + + +def test_version(): + runner = CliRunner() + result = runner.invoke(cli=cli.version) + assert result.output.strip() == lib_version("boardwalk") diff --git a/test/boardwalk/test_manifest.py b/test/boardwalk/test_manifest.py new file mode 100644 index 0000000..2f6cfd0 --- /dev/null +++ b/test/boardwalk/test_manifest.py @@ -0,0 +1,16 @@ +import pytest + +from boardwalk import Job + + +def test_using_not_differentiated_Job_class_warns_about_deprecation(): + with pytest.warns( + DeprecationWarning, + match="The job type Job is deprecated, and will be removed in a future release. Use TaskJob or PlaybookJob, as appropriate.", + ): + + class TestJob(Job): + def tasks(self): + return [{"ansible.builtin.debug": {"msg": "Hello, Boardwalk!"}}] + + TestJob() diff --git a/test/boardwalk/test_utils.py b/test/boardwalk/test_utils.py index f8c7550..d236f28 100644 --- a/test/boardwalk/test_utils.py +++ b/test/boardwalk/test_utils.py @@ -1,4 +1,5 @@ import pytest + from boardwalk.utils import strtobool diff --git a/test/boardwalkd/test_boardwalkd_cli.py b/test/boardwalkd/test_boardwalkd_cli.py new file mode 100644 index 0000000..d377458 --- /dev/null +++ b/test/boardwalkd/test_boardwalkd_cli.py @@ -0,0 +1,43 @@ +from importlib.metadata import version as lib_version + +import pytest +from anyio import create_task_group, fail_after, run_process +from click.testing import CliRunner + +from boardwalkd import cli + + +def test_version(): + """Running `boardwalkd version` should return the version of `boardwalk`.""" + runner = CliRunner() + result = runner.invoke(cli=cli.version) + assert result.output.strip() == lib_version("boardwalk") + + +@pytest.mark.anyio +@pytest.mark.parametrize( + ("msg", "options", "expected_rc"), + [ + ("Missing required parameters to serve boardwalkd: --url, --host-header-pattern, --port/--tls-port", [""], 2), + ( + "Missing required parameters to serve boardwalkd: --url, --port/--tls-port", + [r'--host-header-pattern="(localhost|127\.0\.0\.1)"'], + 2, + ), # type: ignore + ( + "Missing required parameters to serve boardwalkd: --port/--tls-port", + [r'--host-header-pattern="(localhost|127\.0\.0\.1)"', '--url="http://localhost:8888"'], + 2, + ), # type: ignore + ], +) +async def test_incomplete_serve_command( + msg: str, options: list[str], expected_rc: int, command: list[str] = ["boardwalkd", "serve"] +): + """Running `boardwalkd serve` without the required parameters shouldn't succeed.""" + command.extend(options) + async with create_task_group(): + with fail_after(delay=10) as scope: + result = await run_process(command=command, check=False) + assert not scope.cancelled_caught + assert result.returncode == expected_rc, msg diff --git a/test/conftest.py b/test/conftest.py new file mode 100644 index 0000000..3cb7f73 --- /dev/null +++ b/test/conftest.py @@ -0,0 +1,33 @@ +import os +import shutil +import tempfile +from getpass import getpass + +import pytest + + +@pytest.fixture(scope="package") +def get_become_password_file_path(): + """Returns a pathlib.Path object with the supplied BECOME/sudo password written to it. + + Required to run the Workspace tests. + """ + val = getpass(prompt="\nBECOME password: ") + with tempfile.NamedTemporaryFile(delete_on_close=False, mode="w") as file: + file.write(val) + file.close() + yield file.name + + +@pytest.fixture +def use_isolated_boardwalk_directory(tmp_path_factory, request): + dir = tmp_path_factory.mktemp("boardwalk") + test_dir = os.path.dirname(__file__) + shutil.copytree(src=os.path.join(test_dir, "server-client"), dst=dir, dirs_exist_ok=True) + os.chdir(dir) + return dir + + +@pytest.fixture +def anyio_backend(): + return "asyncio" diff --git a/test/integration/test_workspaces.py b/test/integration/test_workspaces.py new file mode 100644 index 0000000..9e70175 --- /dev/null +++ b/test/integration/test_workspaces.py @@ -0,0 +1,68 @@ +import os +import signal +from pathlib import Path +from typing import Any + +import pytest +from anyio import create_task_group, fail_after, open_process +from anyio.streams.text import TextReceiveStream + + +@pytest.mark.anyio +@pytest.mark.skipif(condition="CI" in os.environ, reason="Not yet able to execute non-interactively.") +@pytest.mark.parametrize( + ("workspace_name", "failure_expected", "failure_msg"), + [ + pytest.param("ShouldSucceedTestWorkspace", False, ""), + pytest.param("ShouldSucceedPlaybookExecutionTestWorkspace", False, ""), + pytest.param("UITestVeryVeryLongWorkSpaceNameWorkspace", False, ""), + pytest.param( + "ShouldFailTestWorkspace", + True, + "runner_on_failed: ansible.builtin.fail: ansible.builtin.fail: 127.0.0.1: Task failed successfully.: fatal: [127.0.0.1]: FAILED! => changed=false", + ), + pytest.param( + "ShouldFailPlaybookExecutionTestWorkspace", + True, + "runner_on_failed: Fail: ansible.builtin.fail: 127.0.0.1: Task failed successfully!: fatal: [127.0.0.1]: FAILED! => changed=false", + ), + ], +) +async def test_development_workspaces( + workspace_name: str, + failure_expected: bool, + failure_msg: str, + get_become_password_file_path: Path, + use_isolated_boardwalk_directory, +): + envvars: dict[str, Any] = { + "ANSIBLE_BECOME_PASSWORD_FILE": get_become_password_file_path, + "BOARDWALK_VERBOSITY": "2", + } + new_environ = os.environ | envvars + new_environ.pop("ANSIBLE_BECOME_ASK_PASS", None) + commands: tuple[str, ...] = ( + f"boardwalk -vv workspace use {workspace_name}", + "boardwalk init", + "boardwalk run", + ) + output_stdout = [] + output_stderr = [] + os.chdir(use_isolated_boardwalk_directory) + async with create_task_group(): + for command in commands: + with fail_after(delay=90) as scope: + async with await open_process(command=command, env=new_environ) as process: + async for text in TextReceiveStream(process.stdout): # type:ignore + output_stdout.append(text) + if failure_expected and "Waiting for release before continuing" in text: + process.send_signal(signal.SIGINT) + async for text in TextReceiveStream(process.stderr): # type:ignore + output_stderr.append(text) + + assert not scope.cancelled_caught + + if failure_expected: + assert failure_msg in "".join(output_stdout) + else: + assert process.returncode == 0 diff --git a/test/server-client/Boardwalkfile.py b/test/server-client/Boardwalkfile.py index 781d727..48924e9 100644 --- a/test/server-client/Boardwalkfile.py +++ b/test/server-client/Boardwalkfile.py @@ -3,7 +3,7 @@ import os from typing import TYPE_CHECKING -from boardwalk import Job, Workflow, Workspace, WorkspaceConfig, path +from boardwalk import PlaybookJob, TaskJob, Workflow, Workspace, WorkspaceConfig, path if TYPE_CHECKING: from boardwalk import AnsibleTasksType @@ -47,6 +47,30 @@ def config(self): ) +class ShouldSucceedPlaybookExecutionTestWorkspace(Workspace): + def config(self): + return WorkspaceConfig( + host_pattern="localhost", + workflow=ShouldSucceedPlaybookExecutionTestWorkflow(), + ) + + +class ShouldFailPlaybookExecutionTestWorkspace(Workspace): + def config(self): + return WorkspaceConfig( + host_pattern="localhost", + workflow=ShouldFailPlaybookExecutionTestWorkflow(), + ) + + +class ShouldSucceedMixedJobTypesWorkspace(Workspace): + def config(self): + return WorkspaceConfig( + host_pattern="localhost", + workflow=ShouldSucceedMixedJobTypesWorkflow(), + ) + + class UITestVerVeryLongWorkflowNameWorkflow(Workflow): def jobs(self): return TestJob() @@ -70,20 +94,72 @@ def exit_jobs(self): return TestJob() -class TestJob(Job): +class ShouldSucceedPlaybookExecutionTestWorkflow(Workflow): + def jobs(self): + return ShouldSucceedPlaybookExecutionTestJob() + + def exit_jobs(self): + return TestJob() + + +class ShouldFailPlaybookExecutionTestWorkflow(Workflow): + def jobs(self): + return ShouldFailPlaybookExecutionTestJob() + + def exit_jobs(self): + return TestJob() + + +class ShouldSucceedMixedJobTypesWorkflow(Workflow): + def jobs(self): + return [ + TestJob(), + ShouldSucceedPlaybookExecutionTestJob(), + ] + + def exit_jobs(self): + return TestJob() + + +class TestJob(TaskJob): def tasks(self) -> AnsibleTasksType: - return [{"debug": {"msg": "hello test"}}] + return [{"ansible.builtin.debug": {"msg": "Hello, Boardwalk!"}}] -class FailTestJob(Job): +class FailTestJob(TaskJob): def tasks(self) -> AnsibleTasksType: - return [{"fail": {"msg": "failed successfully"}}] + return [{"ansible.builtin.fail": {"msg": "Task failed successfully."}}] -class MalformedYAMLJob(Job): +class MalformedYAMLJob(TaskJob): """ Tests a playbook that has malformed YAML """ def tasks(self) -> AnsibleTasksType: - return [{"import_tasks": path("malformed_playbook.yml")}] + return [{"ansible.builtin.import_tasks": path("malformed_playbook.yml")}] + + +class ShouldSucceedPlaybookExecutionTestJob(PlaybookJob): + """ + Tests importing and running full playbooks against a specified host. + """ + + def playbooks(self) -> AnsibleTasksType: + return [ + {"ansible.builtin.import_playbook": path("playbook-job-test-should-succeed.yml")}, + {"ansible.builtin.import_playbook": path("playbook-job-test-should-be-skipped.yml")}, + ] + + +class ShouldFailPlaybookExecutionTestJob(PlaybookJob): + """ + Tests importing and running full playbooks against a specified host. + """ + + def playbooks(self) -> AnsibleTasksType: + return [ + {"ansible.builtin.import_playbook": path("playbook-job-test-should-succeed.yml")}, + {"ansible.builtin.import_playbook": path("playbook-job-test-should-be-skipped.yml")}, + {"ansible.builtin.import_playbook": path("playbook-job-test-should-fail.yml")}, + ] diff --git a/test/server-client/playbook-job-test-should-be-skipped.yml b/test/server-client/playbook-job-test-should-be-skipped.yml new file mode 100644 index 0000000..e33898d --- /dev/null +++ b/test/server-client/playbook-job-test-should-be-skipped.yml @@ -0,0 +1,7 @@ +--- +- name: Test running playbooks from Boardwalk + hosts: this-wont-ever-execute.invalid + tasks: + - name: If it does execute... + ansible.builtin.debug: + msg: Sad panda. =( diff --git a/test/server-client/playbook-job-test-should-fail.yml b/test/server-client/playbook-job-test-should-fail.yml new file mode 100644 index 0000000..565db17 --- /dev/null +++ b/test/server-client/playbook-job-test-should-fail.yml @@ -0,0 +1,7 @@ +--- +- name: Test running playbooks from Boardwalk + hosts: localhost + tasks: + - name: Fail + ansible.builtin.fail: + msg: Task failed successfully! diff --git a/test/server-client/playbook-job-test-should-succeed.yml b/test/server-client/playbook-job-test-should-succeed.yml new file mode 100644 index 0000000..2cc76d5 --- /dev/null +++ b/test/server-client/playbook-job-test-should-succeed.yml @@ -0,0 +1,7 @@ +--- +- name: Test running playbooks from Boardwalk + hosts: localhost + tasks: + - name: Say hello, Boardwalk... from a playbook! + ansible.builtin.debug: + msg: Hello, Boardwalk! From a playbook!