diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml
index f753527..6ecf140 100644
--- a/.github/workflows/main.yml
+++ b/.github/workflows/main.yml
@@ -11,26 +11,33 @@ jobs:
FUNCTION_SCHEMA_FILE_NAME: functionSchema.json
runs-on: ubuntu-latest
steps:
- - uses: actions/checkout@v4.2.2
- - uses: actions/setup-python@v5
+ # Step 1: Checkout the repository
+ - name: Checkout Repository
+ uses: actions/checkout@v4.2.2
+
+ # Step 2: Set up Python
+ - name: Setup Python
+ uses: actions/setup-python@v5
with:
python-version: '3.11'
- - name: Install poetry
+
+ # Step 3: Install dependencies using pip
+ - name: Install Dependencies
run: |
- pip install poetry==1.8.4 &&
- poetry config virtualenvs.create false &&
- poetry config virtualenvs.in-project false &&
- poetry config installer.parallel true
- - name: Restore dependencies
- run: poetry install --no-root
+ python -m pip install --upgrade pip
+ pip install -r requirements.txt
+
+ # Step 4: Generate the schema
- name: Extract functionInputSchema
id: extract_schema
run: |
- python main.py generate_schema ${HOME}/${{ env.FUNCTION_SCHEMA_FILE_NAME }}
+ python main.py generate_schema "${{ env.FUNCTION_SCHEMA_FILE_NAME }}"
+
+ # Step 5: Build and publish the Speckle function
- name: Speckle Automate Function - Build and Publish
uses: specklesystems/speckle-automate-github-composite-action@0.9.0
with:
- speckle_automate_url: ${{ env.SPECKLE_AUTOMATE_URL || vars.SPECKLE_AUTOMATE_URL || 'https://automate.speckle.dev' }}
+ speckle_automate_url: ${{ env.SPECKLE_AUTOMATE_URL || 'https://automate.speckle.dev' }}
speckle_token: ${{ secrets.SPECKLE_FUNCTION_TOKEN }}
speckle_function_id: ${{ secrets.SPECKLE_FUNCTION_ID }}
speckle_function_input_schema_file_path: ${{ env.FUNCTION_SCHEMA_FILE_NAME }}
diff --git a/.idea/Checker.iml b/.idea/Checker.iml
index de5ac07..7d26e2f 100644
--- a/.idea/Checker.iml
+++ b/.idea/Checker.iml
@@ -1,12 +1,19 @@
-
-
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/misc.xml b/.idea/misc.xml
index 217df23..379246e 100644
--- a/.idea/misc.xml
+++ b/.idea/misc.xml
@@ -1,7 +1,7 @@
-
+
-
+
\ No newline at end of file
diff --git a/.idea/ruff.xml b/.idea/ruff.xml
index 5a28fc5..67c9b85 100644
--- a/.idea/ruff.xml
+++ b/.idea/ruff.xml
@@ -1,7 +1,9 @@
+
+
\ No newline at end of file
diff --git a/.idea/webResources.xml b/.idea/webResources.xml
new file mode 100644
index 0000000..f752b54
--- /dev/null
+++ b/.idea/webResources.xml
@@ -0,0 +1,14 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.python-version b/.python-version
new file mode 100644
index 0000000..e4fba21
--- /dev/null
+++ b/.python-version
@@ -0,0 +1 @@
+3.12
diff --git a/DEVELOPER_README.md b/DEVELOPER_README.md
index 2e28c90..6ceae07 100644
--- a/DEVELOPER_README.md
+++ b/DEVELOPER_README.md
@@ -3,11 +3,13 @@
## Setup
1. Install dependencies:
+
```bash
poetry shell && poetry install
```
2. Configure `.env`:
+
```
SPECKLE_TOKEN=your_speckle_token
SPECKLE_SERVER_URL=app.speckle.systems
@@ -32,7 +34,7 @@ poetry run pytest
## Extending Rules
1. Add new predicate to `input_predicate_mapping` in `rules.py`
-2. Create corresponding method in `RevitRules` class
+2. Create corresponding method in `PropertyRules` class
3. Update tests
## Building
diff --git a/example.function_inputs.json b/example.function_inputs.json
deleted file mode 100644
index 71f3160..0000000
--- a/example.function_inputs.json
+++ /dev/null
@@ -1,20 +0,0 @@
-{
- "speckleToken": "YOUR SPEKCLE TOKEN",
- "functionInputs": {
- "whisperMessage": "you are doing something weird",
- "forbiddenSpeckleType": "wall"
- },
- "automationRunData": {
- "project_id": "project id",
- "speckle_server_url": "https://latest.speckle.systems",
- "automation_id": "automation id",
- "automation_run_id": "automation run id",
- "function_run_id": "function run id",
- "triggers": [
- {
- "payload": { "modelId": "model id", "versionId": "version id" },
- "triggerType": "versionCreation"
- }
- ]
- }
-}
diff --git a/flatten.py b/flatten.py
deleted file mode 100644
index 574c118..0000000
--- a/flatten.py
+++ /dev/null
@@ -1,27 +0,0 @@
-"""Helper module for a simple speckle object tree flattening."""
-
-from collections.abc import Iterable
-
-from specklepy.objects import Base
-
-
-def flatten_base(base: Base) -> Iterable[Base]:
- """Flatten a base object into an iterable of bases.
-
- This function recursively traverses the `elements` or `@elements` attribute of the
- base object, yielding each nested base object.
-
- Args:
- base (Base): The base object to flatten.
-
- Yields:
- Base: Each nested base object in the hierarchy.
- """
- # Attempt to get the elements attribute, fallback to @elements if necessary
- elements = getattr(base, "elements", getattr(base, "@elements", None))
-
- if elements is not None:
- for element in elements:
- yield from flatten_base(element)
-
- yield base
diff --git a/hooks/pre-commit b/hooks/pre-commit
new file mode 100644
index 0000000..efdb38a
--- /dev/null
+++ b/hooks/pre-commit
@@ -0,0 +1,13 @@
+#!/bin/bash
+echo "Running pre-commit hook..."
+
+# Ensure dependencies are installed with uv
+uv pip install --requirement requirements.txt
+
+# Export dependencies with uv (and overwrite requirements.txt)
+uv pip freeze > requirements.txt
+
+# Add generated requirements.txt to git
+git add requirements.txt
+
+echo "Pre-commit hook completed successfully!"
diff --git a/poetry.lock b/poetry.lock
deleted file mode 100644
index d038864..0000000
--- a/poetry.lock
+++ /dev/null
@@ -1,1797 +0,0 @@
-# This file is automatically @generated by Poetry 1.8.3 and should not be changed by hand.
-
-[[package]]
-name = "annotated-types"
-version = "0.7.0"
-description = "Reusable constraint types to use with typing.Annotated"
-optional = false
-python-versions = ">=3.8"
-files = [
- {file = "annotated_types-0.7.0-py3-none-any.whl", hash = "sha256:1f02e8b43a8fbbc3f3e0d4f0f4bfc8131bcb4eebe8849b8e5c773f3a1c582a53"},
- {file = "annotated_types-0.7.0.tar.gz", hash = "sha256:aff07c09a53a08bc8cfccb9c85b05f1aa9a2a6f23728d790723543408344ce89"},
-]
-
-[[package]]
-name = "anyio"
-version = "4.8.0"
-description = "High level compatibility layer for multiple asynchronous event loop implementations"
-optional = false
-python-versions = ">=3.9"
-files = [
- {file = "anyio-4.8.0-py3-none-any.whl", hash = "sha256:b5011f270ab5eb0abf13385f851315585cc37ef330dd88e27ec3d34d651fd47a"},
- {file = "anyio-4.8.0.tar.gz", hash = "sha256:1d9fe889df5212298c0c0723fa20479d1b94883a2df44bd3897aa91083316f7a"},
-]
-
-[package.dependencies]
-idna = ">=2.8"
-sniffio = ">=1.1"
-typing_extensions = {version = ">=4.5", markers = "python_version < \"3.13\""}
-
-[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)", "trustme", "truststore (>=0.9.1)", "uvloop (>=0.21)"]
-trio = ["trio (>=0.26.1)"]
-
-[[package]]
-name = "appdirs"
-version = "1.4.4"
-description = "A small Python module for determining appropriate platform-specific dirs, e.g. a \"user data dir\"."
-optional = false
-python-versions = "*"
-files = [
- {file = "appdirs-1.4.4-py2.py3-none-any.whl", hash = "sha256:a841dacd6b99318a741b166adb07e19ee71a274450e68237b4650ca1055ab128"},
- {file = "appdirs-1.4.4.tar.gz", hash = "sha256:7d5d0167b2b1ba821647616af46a749d1c653740dd0d2415100fe26e27afdf41"},
-]
-
-[[package]]
-name = "attrs"
-version = "23.2.0"
-description = "Classes Without Boilerplate"
-optional = false
-python-versions = ">=3.7"
-files = [
- {file = "attrs-23.2.0-py3-none-any.whl", hash = "sha256:99b87a485a5820b23b879f04c2305b44b951b502fd64be915879d77a7e8fc6f1"},
- {file = "attrs-23.2.0.tar.gz", hash = "sha256:935dc3b529c262f6cf76e50877d35a4bd3c1de194fd41f47a2b7ae8f19971f30"},
-]
-
-[package.extras]
-cov = ["attrs[tests]", "coverage[toml] (>=5.3)"]
-dev = ["attrs[tests]", "pre-commit"]
-docs = ["furo", "myst-parser", "sphinx", "sphinx-notfound-page", "sphinxcontrib-towncrier", "towncrier", "zope-interface"]
-tests = ["attrs[tests-no-zope]", "zope-interface"]
-tests-mypy = ["mypy (>=1.6)", "pytest-mypy-plugins"]
-tests-no-zope = ["attrs[tests-mypy]", "cloudpickle", "hypothesis", "pympler", "pytest (>=4.3.0)", "pytest-xdist[psutil]"]
-
-[[package]]
-name = "backoff"
-version = "2.2.1"
-description = "Function decoration for backoff and retry"
-optional = false
-python-versions = ">=3.7,<4.0"
-files = [
- {file = "backoff-2.2.1-py3-none-any.whl", hash = "sha256:63579f9a0628e06278f7e47b7d7d5b6ce20dc65c5e96a6f3ca99a6adca0396e8"},
- {file = "backoff-2.2.1.tar.gz", hash = "sha256:03f829f5bb1923180821643f8753b0502c3b682293992485b0eef2807afa5cba"},
-]
-
-[[package]]
-name = "black"
-version = "25.1.0"
-description = "The uncompromising code formatter."
-optional = false
-python-versions = ">=3.9"
-files = [
- {file = "black-25.1.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:759e7ec1e050a15f89b770cefbf91ebee8917aac5c20483bc2d80a6c3a04df32"},
- {file = "black-25.1.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:0e519ecf93120f34243e6b0054db49c00a35f84f195d5bce7e9f5cfc578fc2da"},
- {file = "black-25.1.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:055e59b198df7ac0b7efca5ad7ff2516bca343276c466be72eb04a3bcc1f82d7"},
- {file = "black-25.1.0-cp310-cp310-win_amd64.whl", hash = "sha256:db8ea9917d6f8fc62abd90d944920d95e73c83a5ee3383493e35d271aca872e9"},
- {file = "black-25.1.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:a39337598244de4bae26475f77dda852ea00a93bd4c728e09eacd827ec929df0"},
- {file = "black-25.1.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:96c1c7cd856bba8e20094e36e0f948718dc688dba4a9d78c3adde52b9e6c2299"},
- {file = "black-25.1.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:bce2e264d59c91e52d8000d507eb20a9aca4a778731a08cfff7e5ac4a4bb7096"},
- {file = "black-25.1.0-cp311-cp311-win_amd64.whl", hash = "sha256:172b1dbff09f86ce6f4eb8edf9dede08b1fce58ba194c87d7a4f1a5aa2f5b3c2"},
- {file = "black-25.1.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:4b60580e829091e6f9238c848ea6750efed72140b91b048770b64e74fe04908b"},
- {file = "black-25.1.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:1e2978f6df243b155ef5fa7e558a43037c3079093ed5d10fd84c43900f2d8ecc"},
- {file = "black-25.1.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:3b48735872ec535027d979e8dcb20bf4f70b5ac75a8ea99f127c106a7d7aba9f"},
- {file = "black-25.1.0-cp312-cp312-win_amd64.whl", hash = "sha256:ea0213189960bda9cf99be5b8c8ce66bb054af5e9e861249cd23471bd7b0b3ba"},
- {file = "black-25.1.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:8f0b18a02996a836cc9c9c78e5babec10930862827b1b724ddfe98ccf2f2fe4f"},
- {file = "black-25.1.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:afebb7098bfbc70037a053b91ae8437c3857482d3a690fefc03e9ff7aa9a5fd3"},
- {file = "black-25.1.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:030b9759066a4ee5e5aca28c3c77f9c64789cdd4de8ac1df642c40b708be6171"},
- {file = "black-25.1.0-cp313-cp313-win_amd64.whl", hash = "sha256:a22f402b410566e2d1c950708c77ebf5ebd5d0d88a6a2e87c86d9fb48afa0d18"},
- {file = "black-25.1.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:a1ee0a0c330f7b5130ce0caed9936a904793576ef4d2b98c40835d6a65afa6a0"},
- {file = "black-25.1.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:f3df5f1bf91d36002b0a75389ca8663510cf0531cca8aa5c1ef695b46d98655f"},
- {file = "black-25.1.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:d9e6827d563a2c820772b32ce8a42828dc6790f095f441beef18f96aa6f8294e"},
- {file = "black-25.1.0-cp39-cp39-win_amd64.whl", hash = "sha256:bacabb307dca5ebaf9c118d2d2f6903da0d62c9faa82bd21a33eecc319559355"},
- {file = "black-25.1.0-py3-none-any.whl", hash = "sha256:95e8176dae143ba9097f351d174fdaf0ccd29efb414b362ae3fd72bf0f710717"},
- {file = "black-25.1.0.tar.gz", hash = "sha256:33496d5cd1222ad73391352b4ae8da15253c5de89b93a80b3e2c8d9a19ec2666"},
-]
-
-[package.dependencies]
-click = ">=8.0.0"
-mypy-extensions = ">=0.4.3"
-packaging = ">=22.0"
-pathspec = ">=0.9.0"
-platformdirs = ">=2"
-
-[package.extras]
-colorama = ["colorama (>=0.4.3)"]
-d = ["aiohttp (>=3.10)"]
-jupyter = ["ipython (>=7.8.0)", "tokenize-rt (>=3.2.0)"]
-uvloop = ["uvloop (>=0.15.2)"]
-
-[[package]]
-name = "certifi"
-version = "2025.1.31"
-description = "Python package for providing Mozilla's CA Bundle."
-optional = false
-python-versions = ">=3.6"
-files = [
- {file = "certifi-2025.1.31-py3-none-any.whl", hash = "sha256:ca78db4565a652026a4db2bcdf68f2fb589ea80d0be70e03929ed730746b84fe"},
- {file = "certifi-2025.1.31.tar.gz", hash = "sha256:3d5da6925056f6f18f119200434a4780a94263f10d1c21d032a6f6b2baa20651"},
-]
-
-[[package]]
-name = "charset-normalizer"
-version = "3.4.1"
-description = "The Real First Universal Charset Detector. Open, modern and actively maintained alternative to Chardet."
-optional = false
-python-versions = ">=3.7"
-files = [
- {file = "charset_normalizer-3.4.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:91b36a978b5ae0ee86c394f5a54d6ef44db1de0815eb43de826d41d21e4af3de"},
- {file = "charset_normalizer-3.4.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7461baadb4dc00fd9e0acbe254e3d7d2112e7f92ced2adc96e54ef6501c5f176"},
- {file = "charset_normalizer-3.4.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e218488cd232553829be0664c2292d3af2eeeb94b32bea483cf79ac6a694e037"},
- {file = "charset_normalizer-3.4.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:80ed5e856eb7f30115aaf94e4a08114ccc8813e6ed1b5efa74f9f82e8509858f"},
- {file = "charset_normalizer-3.4.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b010a7a4fd316c3c484d482922d13044979e78d1861f0e0650423144c616a46a"},
- {file = "charset_normalizer-3.4.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4532bff1b8421fd0a320463030c7520f56a79c9024a4e88f01c537316019005a"},
- {file = "charset_normalizer-3.4.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:d973f03c0cb71c5ed99037b870f2be986c3c05e63622c017ea9816881d2dd247"},
- {file = "charset_normalizer-3.4.1-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:3a3bd0dcd373514dcec91c411ddb9632c0d7d92aed7093b8c3bbb6d69ca74408"},
- {file = "charset_normalizer-3.4.1-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:d9c3cdf5390dcd29aa8056d13e8e99526cda0305acc038b96b30352aff5ff2bb"},
- {file = "charset_normalizer-3.4.1-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:2bdfe3ac2e1bbe5b59a1a63721eb3b95fc9b6817ae4a46debbb4e11f6232428d"},
- {file = "charset_normalizer-3.4.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:eab677309cdb30d047996b36d34caeda1dc91149e4fdca0b1a039b3f79d9a807"},
- {file = "charset_normalizer-3.4.1-cp310-cp310-win32.whl", hash = "sha256:c0429126cf75e16c4f0ad00ee0eae4242dc652290f940152ca8c75c3a4b6ee8f"},
- {file = "charset_normalizer-3.4.1-cp310-cp310-win_amd64.whl", hash = "sha256:9f0b8b1c6d84c8034a44893aba5e767bf9c7a211e313a9605d9c617d7083829f"},
- {file = "charset_normalizer-3.4.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:8bfa33f4f2672964266e940dd22a195989ba31669bd84629f05fab3ef4e2d125"},
- {file = "charset_normalizer-3.4.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:28bf57629c75e810b6ae989f03c0828d64d6b26a5e205535585f96093e405ed1"},
- {file = "charset_normalizer-3.4.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f08ff5e948271dc7e18a35641d2f11a4cd8dfd5634f55228b691e62b37125eb3"},
- {file = "charset_normalizer-3.4.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:234ac59ea147c59ee4da87a0c0f098e9c8d169f4dc2a159ef720f1a61bbe27cd"},
- {file = "charset_normalizer-3.4.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fd4ec41f914fa74ad1b8304bbc634b3de73d2a0889bd32076342a573e0779e00"},
- {file = "charset_normalizer-3.4.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:eea6ee1db730b3483adf394ea72f808b6e18cf3cb6454b4d86e04fa8c4327a12"},
- {file = "charset_normalizer-3.4.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:c96836c97b1238e9c9e3fe90844c947d5afbf4f4c92762679acfe19927d81d77"},
- {file = "charset_normalizer-3.4.1-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:4d86f7aff21ee58f26dcf5ae81a9addbd914115cdebcbb2217e4f0ed8982e146"},
- {file = "charset_normalizer-3.4.1-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:09b5e6733cbd160dcc09589227187e242a30a49ca5cefa5a7edd3f9d19ed53fd"},
- {file = "charset_normalizer-3.4.1-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:5777ee0881f9499ed0f71cc82cf873d9a0ca8af166dfa0af8ec4e675b7df48e6"},
- {file = "charset_normalizer-3.4.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:237bdbe6159cff53b4f24f397d43c6336c6b0b42affbe857970cefbb620911c8"},
- {file = "charset_normalizer-3.4.1-cp311-cp311-win32.whl", hash = "sha256:8417cb1f36cc0bc7eaba8ccb0e04d55f0ee52df06df3ad55259b9a323555fc8b"},
- {file = "charset_normalizer-3.4.1-cp311-cp311-win_amd64.whl", hash = "sha256:d7f50a1f8c450f3925cb367d011448c39239bb3eb4117c36a6d354794de4ce76"},
- {file = "charset_normalizer-3.4.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:73d94b58ec7fecbc7366247d3b0b10a21681004153238750bb67bd9012414545"},
- {file = "charset_normalizer-3.4.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dad3e487649f498dd991eeb901125411559b22e8d7ab25d3aeb1af367df5efd7"},
- {file = "charset_normalizer-3.4.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c30197aa96e8eed02200a83fba2657b4c3acd0f0aa4bdc9f6c1af8e8962e0757"},
- {file = "charset_normalizer-3.4.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2369eea1ee4a7610a860d88f268eb39b95cb588acd7235e02fd5a5601773d4fa"},
- {file = "charset_normalizer-3.4.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bc2722592d8998c870fa4e290c2eec2c1569b87fe58618e67d38b4665dfa680d"},
- {file = "charset_normalizer-3.4.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ffc9202a29ab3920fa812879e95a9e78b2465fd10be7fcbd042899695d75e616"},
- {file = "charset_normalizer-3.4.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:804a4d582ba6e5b747c625bf1255e6b1507465494a40a2130978bda7b932c90b"},
- {file = "charset_normalizer-3.4.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:0f55e69f030f7163dffe9fd0752b32f070566451afe180f99dbeeb81f511ad8d"},
- {file = "charset_normalizer-3.4.1-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:c4c3e6da02df6fa1410a7680bd3f63d4f710232d3139089536310d027950696a"},
- {file = "charset_normalizer-3.4.1-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:5df196eb874dae23dcfb968c83d4f8fdccb333330fe1fc278ac5ceeb101003a9"},
- {file = "charset_normalizer-3.4.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:e358e64305fe12299a08e08978f51fc21fac060dcfcddd95453eabe5b93ed0e1"},
- {file = "charset_normalizer-3.4.1-cp312-cp312-win32.whl", hash = "sha256:9b23ca7ef998bc739bf6ffc077c2116917eabcc901f88da1b9856b210ef63f35"},
- {file = "charset_normalizer-3.4.1-cp312-cp312-win_amd64.whl", hash = "sha256:6ff8a4a60c227ad87030d76e99cd1698345d4491638dfa6673027c48b3cd395f"},
- {file = "charset_normalizer-3.4.1-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:aabfa34badd18f1da5ec1bc2715cadc8dca465868a4e73a0173466b688f29dda"},
- {file = "charset_normalizer-3.4.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:22e14b5d70560b8dd51ec22863f370d1e595ac3d024cb8ad7d308b4cd95f8313"},
- {file = "charset_normalizer-3.4.1-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8436c508b408b82d87dc5f62496973a1805cd46727c34440b0d29d8a2f50a6c9"},
- {file = "charset_normalizer-3.4.1-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2d074908e1aecee37a7635990b2c6d504cd4766c7bc9fc86d63f9c09af3fa11b"},
- {file = "charset_normalizer-3.4.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:955f8851919303c92343d2f66165294848d57e9bba6cf6e3625485a70a038d11"},
- {file = "charset_normalizer-3.4.1-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:44ecbf16649486d4aebafeaa7ec4c9fed8b88101f4dd612dcaf65d5e815f837f"},
- {file = "charset_normalizer-3.4.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:0924e81d3d5e70f8126529951dac65c1010cdf117bb75eb02dd12339b57749dd"},
- {file = "charset_normalizer-3.4.1-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:2967f74ad52c3b98de4c3b32e1a44e32975e008a9cd2a8cc8966d6a5218c5cb2"},
- {file = "charset_normalizer-3.4.1-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:c75cb2a3e389853835e84a2d8fb2b81a10645b503eca9bcb98df6b5a43eb8886"},
- {file = "charset_normalizer-3.4.1-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:09b26ae6b1abf0d27570633b2b078a2a20419c99d66fb2823173d73f188ce601"},
- {file = "charset_normalizer-3.4.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:fa88b843d6e211393a37219e6a1c1df99d35e8fd90446f1118f4216e307e48cd"},
- {file = "charset_normalizer-3.4.1-cp313-cp313-win32.whl", hash = "sha256:eb8178fe3dba6450a3e024e95ac49ed3400e506fd4e9e5c32d30adda88cbd407"},
- {file = "charset_normalizer-3.4.1-cp313-cp313-win_amd64.whl", hash = "sha256:b1ac5992a838106edb89654e0aebfc24f5848ae2547d22c2c3f66454daa11971"},
- {file = "charset_normalizer-3.4.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f30bf9fd9be89ecb2360c7d94a711f00c09b976258846efe40db3d05828e8089"},
- {file = "charset_normalizer-3.4.1-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:97f68b8d6831127e4787ad15e6757232e14e12060bec17091b85eb1486b91d8d"},
- {file = "charset_normalizer-3.4.1-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7974a0b5ecd505609e3b19742b60cee7aa2aa2fb3151bc917e6e2646d7667dcf"},
- {file = "charset_normalizer-3.4.1-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fc54db6c8593ef7d4b2a331b58653356cf04f67c960f584edb7c3d8c97e8f39e"},
- {file = "charset_normalizer-3.4.1-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:311f30128d7d333eebd7896965bfcfbd0065f1716ec92bd5638d7748eb6f936a"},
- {file = "charset_normalizer-3.4.1-cp37-cp37m-musllinux_1_2_aarch64.whl", hash = "sha256:7d053096f67cd1241601111b698f5cad775f97ab25d81567d3f59219b5f1adbd"},
- {file = "charset_normalizer-3.4.1-cp37-cp37m-musllinux_1_2_i686.whl", hash = "sha256:807f52c1f798eef6cf26beb819eeb8819b1622ddfeef9d0977a8502d4db6d534"},
- {file = "charset_normalizer-3.4.1-cp37-cp37m-musllinux_1_2_ppc64le.whl", hash = "sha256:dccbe65bd2f7f7ec22c4ff99ed56faa1e9f785482b9bbd7c717e26fd723a1d1e"},
- {file = "charset_normalizer-3.4.1-cp37-cp37m-musllinux_1_2_s390x.whl", hash = "sha256:2fb9bd477fdea8684f78791a6de97a953c51831ee2981f8e4f583ff3b9d9687e"},
- {file = "charset_normalizer-3.4.1-cp37-cp37m-musllinux_1_2_x86_64.whl", hash = "sha256:01732659ba9b5b873fc117534143e4feefecf3b2078b0a6a2e925271bb6f4cfa"},
- {file = "charset_normalizer-3.4.1-cp37-cp37m-win32.whl", hash = "sha256:7a4f97a081603d2050bfaffdefa5b02a9ec823f8348a572e39032caa8404a487"},
- {file = "charset_normalizer-3.4.1-cp37-cp37m-win_amd64.whl", hash = "sha256:7b1bef6280950ee6c177b326508f86cad7ad4dff12454483b51d8b7d673a2c5d"},
- {file = "charset_normalizer-3.4.1-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:ecddf25bee22fe4fe3737a399d0d177d72bc22be6913acfab364b40bce1ba83c"},
- {file = "charset_normalizer-3.4.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8c60ca7339acd497a55b0ea5d506b2a2612afb2826560416f6894e8b5770d4a9"},
- {file = "charset_normalizer-3.4.1-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b7b2d86dd06bfc2ade3312a83a5c364c7ec2e3498f8734282c6c3d4b07b346b8"},
- {file = "charset_normalizer-3.4.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:dd78cfcda14a1ef52584dbb008f7ac81c1328c0f58184bf9a84c49c605002da6"},
- {file = "charset_normalizer-3.4.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6e27f48bcd0957c6d4cb9d6fa6b61d192d0b13d5ef563e5f2ae35feafc0d179c"},
- {file = "charset_normalizer-3.4.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:01ad647cdd609225c5350561d084b42ddf732f4eeefe6e678765636791e78b9a"},
- {file = "charset_normalizer-3.4.1-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:619a609aa74ae43d90ed2e89bdd784765de0a25ca761b93e196d938b8fd1dbbd"},
- {file = "charset_normalizer-3.4.1-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:89149166622f4db9b4b6a449256291dc87a99ee53151c74cbd82a53c8c2f6ccd"},
- {file = "charset_normalizer-3.4.1-cp38-cp38-musllinux_1_2_ppc64le.whl", hash = "sha256:7709f51f5f7c853f0fb938bcd3bc59cdfdc5203635ffd18bf354f6967ea0f824"},
- {file = "charset_normalizer-3.4.1-cp38-cp38-musllinux_1_2_s390x.whl", hash = "sha256:345b0426edd4e18138d6528aed636de7a9ed169b4aaf9d61a8c19e39d26838ca"},
- {file = "charset_normalizer-3.4.1-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:0907f11d019260cdc3f94fbdb23ff9125f6b5d1039b76003b5b0ac9d6a6c9d5b"},
- {file = "charset_normalizer-3.4.1-cp38-cp38-win32.whl", hash = "sha256:ea0d8d539afa5eb2728aa1932a988a9a7af94f18582ffae4bc10b3fbdad0626e"},
- {file = "charset_normalizer-3.4.1-cp38-cp38-win_amd64.whl", hash = "sha256:329ce159e82018d646c7ac45b01a430369d526569ec08516081727a20e9e4af4"},
- {file = "charset_normalizer-3.4.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:b97e690a2118911e39b4042088092771b4ae3fc3aa86518f84b8cf6888dbdb41"},
- {file = "charset_normalizer-3.4.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:78baa6d91634dfb69ec52a463534bc0df05dbd546209b79a3880a34487f4b84f"},
- {file = "charset_normalizer-3.4.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1a2bc9f351a75ef49d664206d51f8e5ede9da246602dc2d2726837620ea034b2"},
- {file = "charset_normalizer-3.4.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:75832c08354f595c760a804588b9357d34ec00ba1c940c15e31e96d902093770"},
- {file = "charset_normalizer-3.4.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0af291f4fe114be0280cdd29d533696a77b5b49cfde5467176ecab32353395c4"},
- {file = "charset_normalizer-3.4.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0167ddc8ab6508fe81860a57dd472b2ef4060e8d378f0cc555707126830f2537"},
- {file = "charset_normalizer-3.4.1-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:2a75d49014d118e4198bcee5ee0a6f25856b29b12dbf7cd012791f8a6cc5c496"},
- {file = "charset_normalizer-3.4.1-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:363e2f92b0f0174b2f8238240a1a30142e3db7b957a5dd5689b0e75fb717cc78"},
- {file = "charset_normalizer-3.4.1-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:ab36c8eb7e454e34e60eb55ca5d241a5d18b2c6244f6827a30e451c42410b5f7"},
- {file = "charset_normalizer-3.4.1-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:4c0907b1928a36d5a998d72d64d8eaa7244989f7aaaf947500d3a800c83a3fd6"},
- {file = "charset_normalizer-3.4.1-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:04432ad9479fa40ec0f387795ddad4437a2b50417c69fa275e212933519ff294"},
- {file = "charset_normalizer-3.4.1-cp39-cp39-win32.whl", hash = "sha256:3bed14e9c89dcb10e8f3a29f9ccac4955aebe93c71ae803af79265c9ca5644c5"},
- {file = "charset_normalizer-3.4.1-cp39-cp39-win_amd64.whl", hash = "sha256:49402233c892a461407c512a19435d1ce275543138294f7ef013f0b63d5d3765"},
- {file = "charset_normalizer-3.4.1-py3-none-any.whl", hash = "sha256:d98b1668f06378c6dbefec3b92299716b931cd4e6061f3c875a71ced1780ab85"},
- {file = "charset_normalizer-3.4.1.tar.gz", hash = "sha256:44251f18cd68a75b56585dd00dae26183e102cd5e0f9f1466e6df5da2ed64ea3"},
-]
-
-[[package]]
-name = "click"
-version = "8.1.8"
-description = "Composable command line interface toolkit"
-optional = false
-python-versions = ">=3.7"
-files = [
- {file = "click-8.1.8-py3-none-any.whl", hash = "sha256:63c132bbbed01578a06712a2d1f497bb62d9c1c0d329b7903a866228027263b2"},
- {file = "click-8.1.8.tar.gz", hash = "sha256:ed53c9d8990d83c2a27deae68e4ee337473f6330c040a31d4225c9574d16096a"},
-]
-
-[package.dependencies]
-colorama = {version = "*", markers = "platform_system == \"Windows\""}
-
-[[package]]
-name = "colorama"
-version = "0.4.6"
-description = "Cross-platform colored terminal text."
-optional = false
-python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,!=3.6.*,>=2.7"
-files = [
- {file = "colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6"},
- {file = "colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44"},
-]
-
-[[package]]
-name = "deprecated"
-version = "1.2.18"
-description = "Python @deprecated decorator to deprecate old python classes, functions or methods."
-optional = false
-python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,>=2.7"
-files = [
- {file = "Deprecated-1.2.18-py2.py3-none-any.whl", hash = "sha256:bd5011788200372a32418f888e326a09ff80d0214bd961147cfed01b5c018eec"},
- {file = "deprecated-1.2.18.tar.gz", hash = "sha256:422b6f6d859da6f2ef57857761bfb392480502a64c3028ca9bbe86085d72115d"},
-]
-
-[package.dependencies]
-wrapt = ">=1.10,<2"
-
-[package.extras]
-dev = ["PyTest", "PyTest-Cov", "bump2version (<1)", "setuptools", "tox"]
-
-[[package]]
-name = "gql"
-version = "3.5.0"
-description = "GraphQL client for Python"
-optional = false
-python-versions = "*"
-files = [
- {file = "gql-3.5.0-py2.py3-none-any.whl", hash = "sha256:70dda5694a5b194a8441f077aa5fb70cc94e4ec08016117523f013680901ecb7"},
- {file = "gql-3.5.0.tar.gz", hash = "sha256:ccb9c5db543682b28f577069950488218ed65d4ac70bb03b6929aaadaf636de9"},
-]
-
-[package.dependencies]
-anyio = ">=3.0,<5"
-backoff = ">=1.11.1,<3.0"
-graphql-core = ">=3.2,<3.3"
-requests = {version = ">=2.26,<3", optional = true, markers = "extra == \"requests\""}
-requests-toolbelt = {version = ">=1.0.0,<2", optional = true, markers = "extra == \"requests\""}
-websockets = {version = ">=10,<12", optional = true, markers = "extra == \"websockets\""}
-yarl = ">=1.6,<2.0"
-
-[package.extras]
-aiohttp = ["aiohttp (>=3.8.0,<4)", "aiohttp (>=3.9.0b0,<4)"]
-all = ["aiohttp (>=3.8.0,<4)", "aiohttp (>=3.9.0b0,<4)", "botocore (>=1.21,<2)", "httpx (>=0.23.1,<1)", "requests (>=2.26,<3)", "requests-toolbelt (>=1.0.0,<2)", "websockets (>=10,<12)"]
-botocore = ["botocore (>=1.21,<2)"]
-dev = ["aiofiles", "aiohttp (>=3.8.0,<4)", "aiohttp (>=3.9.0b0,<4)", "black (==22.3.0)", "botocore (>=1.21,<2)", "check-manifest (>=0.42,<1)", "flake8 (==3.8.1)", "httpx (>=0.23.1,<1)", "isort (==4.3.21)", "mock (==4.0.2)", "mypy (==0.910)", "parse (==1.15.0)", "pytest (==7.4.2)", "pytest-asyncio (==0.21.1)", "pytest-console-scripts (==1.3.1)", "pytest-cov (==3.0.0)", "requests (>=2.26,<3)", "requests-toolbelt (>=1.0.0,<2)", "sphinx (>=5.3.0,<6)", "sphinx-argparse (==0.2.5)", "sphinx-rtd-theme (>=0.4,<1)", "types-aiofiles", "types-mock", "types-requests", "vcrpy (==4.4.0)", "websockets (>=10,<12)"]
-httpx = ["httpx (>=0.23.1,<1)"]
-requests = ["requests (>=2.26,<3)", "requests-toolbelt (>=1.0.0,<2)"]
-test = ["aiofiles", "aiohttp (>=3.8.0,<4)", "aiohttp (>=3.9.0b0,<4)", "botocore (>=1.21,<2)", "httpx (>=0.23.1,<1)", "mock (==4.0.2)", "parse (==1.15.0)", "pytest (==7.4.2)", "pytest-asyncio (==0.21.1)", "pytest-console-scripts (==1.3.1)", "pytest-cov (==3.0.0)", "requests (>=2.26,<3)", "requests-toolbelt (>=1.0.0,<2)", "vcrpy (==4.4.0)", "websockets (>=10,<12)"]
-test-no-transport = ["aiofiles", "mock (==4.0.2)", "parse (==1.15.0)", "pytest (==7.4.2)", "pytest-asyncio (==0.21.1)", "pytest-console-scripts (==1.3.1)", "pytest-cov (==3.0.0)", "vcrpy (==4.4.0)"]
-websockets = ["websockets (>=10,<12)"]
-
-[[package]]
-name = "graphql-core"
-version = "3.2.6"
-description = "GraphQL implementation for Python, a port of GraphQL.js, the JavaScript reference implementation for GraphQL."
-optional = false
-python-versions = "<4,>=3.6"
-files = [
- {file = "graphql_core-3.2.6-py3-none-any.whl", hash = "sha256:78b016718c161a6fb20a7d97bbf107f331cd1afe53e45566c59f776ed7f0b45f"},
- {file = "graphql_core-3.2.6.tar.gz", hash = "sha256:c08eec22f9e40f0bd61d805907e3b3b1b9a320bc606e23dc145eebca07c8fbab"},
-]
-
-[[package]]
-name = "h11"
-version = "0.14.0"
-description = "A pure-Python, bring-your-own-I/O implementation of HTTP/1.1"
-optional = false
-python-versions = ">=3.7"
-files = [
- {file = "h11-0.14.0-py3-none-any.whl", hash = "sha256:e3fe4ac4b851c468cc8363d500db52c2ead036020723024a109d37346efaa761"},
- {file = "h11-0.14.0.tar.gz", hash = "sha256:8f19fbbe99e72420ff35c00b27a34cb9937e902a8b810e2c88300c6f0a3b699d"},
-]
-
-[[package]]
-name = "httpcore"
-version = "1.0.7"
-description = "A minimal low-level HTTP client."
-optional = false
-python-versions = ">=3.8"
-files = [
- {file = "httpcore-1.0.7-py3-none-any.whl", hash = "sha256:a3fff8f43dc260d5bd363d9f9cf1830fa3a458b332856f34282de498ed420edd"},
- {file = "httpcore-1.0.7.tar.gz", hash = "sha256:8551cb62a169ec7162ac7be8d4817d561f60e08eaa485234898414bb5a8a0b4c"},
-]
-
-[package.dependencies]
-certifi = "*"
-h11 = ">=0.13,<0.15"
-
-[package.extras]
-asyncio = ["anyio (>=4.0,<5.0)"]
-http2 = ["h2 (>=3,<5)"]
-socks = ["socksio (==1.*)"]
-trio = ["trio (>=0.22.0,<1.0)"]
-
-[[package]]
-name = "httpx"
-version = "0.25.2"
-description = "The next generation HTTP client."
-optional = false
-python-versions = ">=3.8"
-files = [
- {file = "httpx-0.25.2-py3-none-any.whl", hash = "sha256:a05d3d052d9b2dfce0e3896636467f8a5342fb2b902c819428e1ac65413ca118"},
- {file = "httpx-0.25.2.tar.gz", hash = "sha256:8b8fcaa0c8ea7b05edd69a094e63a2094c4efcb48129fb757361bc423c0ad9e8"},
-]
-
-[package.dependencies]
-anyio = "*"
-certifi = "*"
-httpcore = "==1.*"
-idna = "*"
-sniffio = "*"
-
-[package.extras]
-brotli = ["brotli", "brotlicffi"]
-cli = ["click (==8.*)", "pygments (==2.*)", "rich (>=10,<14)"]
-http2 = ["h2 (>=3,<5)"]
-socks = ["socksio (==1.*)"]
-
-[[package]]
-name = "idna"
-version = "3.10"
-description = "Internationalized Domain Names in Applications (IDNA)"
-optional = false
-python-versions = ">=3.6"
-files = [
- {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 = "iniconfig"
-version = "2.0.0"
-description = "brain-dead simple config-ini parsing"
-optional = false
-python-versions = ">=3.7"
-files = [
- {file = "iniconfig-2.0.0-py3-none-any.whl", hash = "sha256:b6a85871a79d2e3b22d2d1b94ac2824226a63c6b741c88f7ae975f18b6778374"},
- {file = "iniconfig-2.0.0.tar.gz", hash = "sha256:2d91e135bf72d31a410b17c16da610a82cb55f6b0477d1a902134b24a455b8b3"},
-]
-
-[[package]]
-name = "levenshtein"
-version = "0.26.1"
-description = "Python extension for computing string edit distances and similarities."
-optional = false
-python-versions = ">=3.9"
-files = [
- {file = "levenshtein-0.26.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:8dc4a4aecad538d944a1264c12769c99e3c0bf8e741fc5e454cc954913befb2e"},
- {file = "levenshtein-0.26.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:ec108f368c12b25787c8b1a4537a1452bc53861c3ee4abc810cc74098278edcd"},
- {file = "levenshtein-0.26.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:69229d651c97ed5b55b7ce92481ed00635cdbb80fbfb282a22636e6945dc52d5"},
- {file = "levenshtein-0.26.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:79dcd157046d62482a7719b08ba9e3ce9ed3fc5b015af8ea989c734c702aedd4"},
- {file = "levenshtein-0.26.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:6f53f9173ae21b650b4ed8aef1d0ad0c37821f367c221a982f4d2922b3044e0d"},
- {file = "levenshtein-0.26.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f3956f3c5c229257dbeabe0b6aacd2c083ebcc1e335842a6ff2217fe6cc03b6b"},
- {file = "levenshtein-0.26.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e1e83af732726987d2c4cd736f415dae8b966ba17b7a2239c8b7ffe70bfb5543"},
- {file = "levenshtein-0.26.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:4f052c55046c2a9c9b5f742f39e02fa6e8db8039048b8c1c9e9fdd27c8a240a1"},
- {file = "levenshtein-0.26.1-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:9895b3a98f6709e293615fde0dcd1bb0982364278fa2072361a1a31b3e388b7a"},
- {file = "levenshtein-0.26.1-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:a3777de1d8bfca054465229beed23994f926311ce666f5a392c8859bb2722f16"},
- {file = "levenshtein-0.26.1-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:81c57e1135c38c5e6e3675b5e2077d8a8d3be32bf0a46c57276c092b1dffc697"},
- {file = "levenshtein-0.26.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:91d5e7d984891df3eff7ea9fec8cf06fdfacc03cd074fd1a410435706f73b079"},
- {file = "levenshtein-0.26.1-cp310-cp310-win32.whl", hash = "sha256:f48abff54054b4142ad03b323e80aa89b1d15cabc48ff49eb7a6ff7621829a56"},
- {file = "levenshtein-0.26.1-cp310-cp310-win_amd64.whl", hash = "sha256:79dd6ad799784ea7b23edd56e3bf94b3ca866c4c6dee845658ee75bb4aefdabf"},
- {file = "levenshtein-0.26.1-cp310-cp310-win_arm64.whl", hash = "sha256:3351ddb105ef010cc2ce474894c5d213c83dddb7abb96400beaa4926b0b745bd"},
- {file = "levenshtein-0.26.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:44c51f5d33b3cfb9db518b36f1288437a509edd82da94c4400f6a681758e0cb6"},
- {file = "levenshtein-0.26.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:56b93203e725f9df660e2afe3d26ba07d71871b6d6e05b8b767e688e23dfb076"},
- {file = "levenshtein-0.26.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:270d36c5da04a0d89990660aea8542227cbd8f5bc34e9fdfadd34916ff904520"},
- {file = "levenshtein-0.26.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:480674c05077eeb0b0f748546d4fcbb386d7c737f9fff0010400da3e8b552942"},
- {file = "levenshtein-0.26.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:13946e37323728695ba7a22f3345c2e907d23f4600bc700bf9b4352fb0c72a48"},
- {file = "levenshtein-0.26.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ceb673f572d1d0dc9b1cd75792bb8bad2ae8eb78a7c6721e23a3867d318cb6f2"},
- {file = "levenshtein-0.26.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:42d6fa242e3b310ce6bfd5af0c83e65ef10b608b885b3bb69863c01fb2fcff98"},
- {file = "levenshtein-0.26.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:b8b68295808893a81e0a1dbc2274c30dd90880f14d23078e8eb4325ee615fc68"},
- {file = "levenshtein-0.26.1-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:b01061d377d1944eb67bc40bef5d4d2f762c6ab01598efd9297ce5d0047eb1b5"},
- {file = "levenshtein-0.26.1-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:9d12c8390f156745e533d01b30773b9753e41d8bbf8bf9dac4b97628cdf16314"},
- {file = "levenshtein-0.26.1-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:48825c9f967f922061329d1481b70e9fee937fc68322d6979bc623f69f75bc91"},
- {file = "levenshtein-0.26.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:d8ec137170b95736842f99c0e7a9fd8f5641d0c1b63b08ce027198545d983e2b"},
- {file = "levenshtein-0.26.1-cp311-cp311-win32.whl", hash = "sha256:798f2b525a2e90562f1ba9da21010dde0d73730e277acaa5c52d2a6364fd3e2a"},
- {file = "levenshtein-0.26.1-cp311-cp311-win_amd64.whl", hash = "sha256:55b1024516c59df55f1cf1a8651659a568f2c5929d863d3da1ce8893753153bd"},
- {file = "levenshtein-0.26.1-cp311-cp311-win_arm64.whl", hash = "sha256:e52575cbc6b9764ea138a6f82d73d3b1bc685fe62e207ff46a963d4c773799f6"},
- {file = "levenshtein-0.26.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:cc741ca406d3704dc331a69c04b061fc952509a069b79cab8287413f434684bd"},
- {file = "levenshtein-0.26.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:821ace3b4e1c2e02b43cf5dc61aac2ea43bdb39837ac890919c225a2c3f2fea4"},
- {file = "levenshtein-0.26.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f92694c9396f55d4c91087efacf81297bef152893806fc54c289fc0254b45384"},
- {file = "levenshtein-0.26.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:51ba374de7a1797d04a14a4f0ad3602d2d71fef4206bb20a6baaa6b6a502da58"},
- {file = "levenshtein-0.26.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f7aa5c3327dda4ef952769bacec09c09ff5bf426e07fdc94478c37955681885b"},
- {file = "levenshtein-0.26.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:33e2517e8d3c221de2d1183f400aed64211fcfc77077b291ed9f3bb64f141cdc"},
- {file = "levenshtein-0.26.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9092b622765c7649dd1d8af0f43354723dd6f4e570ac079ffd90b41033957438"},
- {file = "levenshtein-0.26.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:fc16796c85d7d8b259881d59cc8b5e22e940901928c2ff6924b2c967924e8a0b"},
- {file = "levenshtein-0.26.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:e4370733967f5994ceeed8dc211089bedd45832ee688cecea17bfd35a9eb22b9"},
- {file = "levenshtein-0.26.1-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:3535ecfd88c9b283976b5bc61265855f59bba361881e92ed2b5367b6990c93fe"},
- {file = "levenshtein-0.26.1-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:90236e93d98bdfd708883a6767826fafd976dac8af8fc4a0fb423d4fa08e1bf0"},
- {file = "levenshtein-0.26.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:04b7cabb82edf566b1579b3ed60aac0eec116655af75a3c551fee8754ffce2ea"},
- {file = "levenshtein-0.26.1-cp312-cp312-win32.whl", hash = "sha256:ae382af8c76f6d2a040c0d9ca978baf461702ceb3f79a0a3f6da8d596a484c5b"},
- {file = "levenshtein-0.26.1-cp312-cp312-win_amd64.whl", hash = "sha256:fd091209798cfdce53746f5769987b4108fe941c54fb2e058c016ffc47872918"},
- {file = "levenshtein-0.26.1-cp312-cp312-win_arm64.whl", hash = "sha256:7e82f2ea44a81ad6b30d92a110e04cd3c8c7c6034b629aca30a3067fa174ae89"},
- {file = "levenshtein-0.26.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:790374a9f5d2cbdb30ee780403a62e59bef51453ac020668c1564d1e43438f0e"},
- {file = "levenshtein-0.26.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:7b05c0415c386d00efda83d48db9db68edd02878d6dbc6df01194f12062be1bb"},
- {file = "levenshtein-0.26.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c3114586032361722ddededf28401ce5baf1cf617f9f49fb86b8766a45a423ff"},
- {file = "levenshtein-0.26.1-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2532f8a13b68bf09f152d906f118a88da2063da22f44c90e904b142b0a53d534"},
- {file = "levenshtein-0.26.1-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:219c30be6aa734bf927188d1208b7d78d202a3eb017b1c5f01ab2034d2d4ccca"},
- {file = "levenshtein-0.26.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:397e245e77f87836308bd56305bba630010cd8298c34c4c44bd94990cdb3b7b1"},
- {file = "levenshtein-0.26.1-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:aeff6ea3576f72e26901544c6c55c72a7b79b9983b6f913cba0e9edbf2f87a97"},
- {file = "levenshtein-0.26.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:a19862e3539a697df722a08793994e334cd12791e8144851e8a1dee95a17ff63"},
- {file = "levenshtein-0.26.1-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:dc3b5a64f57c3c078d58b1e447f7d68cad7ae1b23abe689215d03fc434f8f176"},
- {file = "levenshtein-0.26.1-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:bb6c7347424a91317c5e1b68041677e4c8ed3e7823b5bbaedb95bffb3c3497ea"},
- {file = "levenshtein-0.26.1-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:b817376de4195a207cc0e4ca37754c0e1e1078c2a2d35a6ae502afde87212f9e"},
- {file = "levenshtein-0.26.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:7b50c3620ff47c9887debbb4c154aaaac3e46be7fc2e5789ee8dbe128bce6a17"},
- {file = "levenshtein-0.26.1-cp313-cp313-win32.whl", hash = "sha256:9fb859da90262eb474c190b3ca1e61dee83add022c676520f5c05fdd60df902a"},
- {file = "levenshtein-0.26.1-cp313-cp313-win_amd64.whl", hash = "sha256:8adcc90e3a5bfb0a463581d85e599d950fe3c2938ac6247b29388b64997f6e2d"},
- {file = "levenshtein-0.26.1-cp313-cp313-win_arm64.whl", hash = "sha256:c2599407e029865dc66d210b8804c7768cbdbf60f061d993bb488d5242b0b73e"},
- {file = "levenshtein-0.26.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:dc54ced948fc3feafce8ad4ba4239d8ffc733a0d70e40c0363ac2a7ab2b7251e"},
- {file = "levenshtein-0.26.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:e6516f69213ae393a220e904332f1a6bfc299ba22cf27a6520a1663a08eba0fb"},
- {file = "levenshtein-0.26.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f4cfea4eada1746d0c75a864bc7e9e63d4a6e987c852d6cec8d9cb0c83afe25b"},
- {file = "levenshtein-0.26.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a323161dfeeac6800eb13cfe76a8194aec589cd948bcf1cdc03f66cc3ec26b72"},
- {file = "levenshtein-0.26.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2c23e749b68ebc9a20b9047317b5cd2053b5856315bc8636037a8adcbb98bed1"},
- {file = "levenshtein-0.26.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8f80dd7432d4b6cf493d012d22148db7af769017deb31273e43406b1fb7f091c"},
- {file = "levenshtein-0.26.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0ae7cd6e4312c6ef34b2e273836d18f9fff518d84d823feff5ad7c49668256e0"},
- {file = "levenshtein-0.26.1-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:dcdad740e841d791b805421c2b20e859b4ed556396d3063b3aa64cd055be648c"},
- {file = "levenshtein-0.26.1-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:e07afb1613d6f5fd99abd4e53ad3b446b4efaa0f0d8e9dfb1d6d1b9f3f884d32"},
- {file = "levenshtein-0.26.1-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:f1add8f1d83099a98ae4ac472d896b7e36db48c39d3db25adf12b373823cdeff"},
- {file = "levenshtein-0.26.1-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:1010814b1d7a60833a951f2756dfc5c10b61d09976ce96a0edae8fecdfb0ea7c"},
- {file = "levenshtein-0.26.1-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:33fa329d1bb65ce85e83ceda281aea31cee9f2f6e167092cea54f922080bcc66"},
- {file = "levenshtein-0.26.1-cp39-cp39-win32.whl", hash = "sha256:488a945312f2f16460ab61df5b4beb1ea2254c521668fd142ce6298006296c98"},
- {file = "levenshtein-0.26.1-cp39-cp39-win_amd64.whl", hash = "sha256:9f942104adfddd4b336c3997050121328c39479f69de702d7d144abb69ea7ab9"},
- {file = "levenshtein-0.26.1-cp39-cp39-win_arm64.whl", hash = "sha256:c1d8f85b2672939f85086ed75effcf768f6077516a3e299c2ba1f91bc4644c22"},
- {file = "levenshtein-0.26.1-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:6cf8f1efaf90ca585640c5d418c30b7d66d9ac215cee114593957161f63acde0"},
- {file = "levenshtein-0.26.1-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:d5b2953978b8c158dd5cd93af8216a5cfddbf9de66cf5481c2955f44bb20767a"},
- {file = "levenshtein-0.26.1-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b952b3732c4631c49917d4b15d78cb4a2aa006c1d5c12e2a23ba8e18a307a055"},
- {file = "levenshtein-0.26.1-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:07227281e12071168e6ae59238918a56d2a0682e529f747b5431664f302c0b42"},
- {file = "levenshtein-0.26.1-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8191241cd8934feaf4d05d0cc0e5e72877cbb17c53bbf8c92af9f1aedaa247e9"},
- {file = "levenshtein-0.26.1-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:9e70d7ee157a9b698c73014f6e2b160830e7d2d64d2e342fefc3079af3c356fc"},
- {file = "levenshtein-0.26.1-pp39-pypy39_pp73-macosx_10_15_x86_64.whl", hash = "sha256:0eb3059f826f6cb0a5bca4a85928070f01e8202e7ccafcba94453470f83e49d4"},
- {file = "levenshtein-0.26.1-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:6c389e44da12d6fb1d7ba0a709a32a96c9391e9be4160ccb9269f37e040599ee"},
- {file = "levenshtein-0.26.1-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4e9de292f2c51a7d34a0ae23bec05391b8f61f35781cd3e4c6d0533e06250c55"},
- {file = "levenshtein-0.26.1-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9d87215113259efdca8716e53b6d59ab6d6009e119d95d45eccc083148855f33"},
- {file = "levenshtein-0.26.1-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:18f00a3eebf68a82fb651d8d0e810c10bfaa60c555d21dde3ff81350c74fb4c2"},
- {file = "levenshtein-0.26.1-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:b3554c1b59de63d05075577380340c185ff41b028e541c0888fddab3c259a2b4"},
- {file = "levenshtein-0.26.1.tar.gz", hash = "sha256:0d19ba22330d50609b2349021ec3cf7d905c6fe21195a2d0d876a146e7ed2575"},
-]
-
-[package.dependencies]
-rapidfuzz = ">=3.9.0,<4.0.0"
-
-[[package]]
-name = "more-itertools"
-version = "10.6.0"
-description = "More routines for operating on iterables, beyond itertools"
-optional = false
-python-versions = ">=3.9"
-files = [
- {file = "more-itertools-10.6.0.tar.gz", hash = "sha256:2cd7fad1009c31cc9fb6a035108509e6547547a7a738374f10bd49a09eb3ee3b"},
- {file = "more_itertools-10.6.0-py3-none-any.whl", hash = "sha256:6eb054cb4b6db1473f6e15fcc676a08e4732548acd47c708f0e179c2c7c01e89"},
-]
-
-[[package]]
-name = "multidict"
-version = "6.1.0"
-description = "multidict implementation"
-optional = false
-python-versions = ">=3.8"
-files = [
- {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]]
-name = "mypy"
-version = "1.15.0"
-description = "Optional static typing for Python"
-optional = false
-python-versions = ">=3.9"
-files = [
- {file = "mypy-1.15.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:979e4e1a006511dacf628e36fadfecbcc0160a8af6ca7dad2f5025529e082c13"},
- {file = "mypy-1.15.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:c4bb0e1bd29f7d34efcccd71cf733580191e9a264a2202b0239da95984c5b559"},
- {file = "mypy-1.15.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:be68172e9fd9ad8fb876c6389f16d1c1b5f100ffa779f77b1fb2176fcc9ab95b"},
- {file = "mypy-1.15.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:c7be1e46525adfa0d97681432ee9fcd61a3964c2446795714699a998d193f1a3"},
- {file = "mypy-1.15.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:2e2c2e6d3593f6451b18588848e66260ff62ccca522dd231cd4dd59b0160668b"},
- {file = "mypy-1.15.0-cp310-cp310-win_amd64.whl", hash = "sha256:6983aae8b2f653e098edb77f893f7b6aca69f6cffb19b2cc7443f23cce5f4828"},
- {file = "mypy-1.15.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:2922d42e16d6de288022e5ca321cd0618b238cfc5570e0263e5ba0a77dbef56f"},
- {file = "mypy-1.15.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:2ee2d57e01a7c35de00f4634ba1bbf015185b219e4dc5909e281016df43f5ee5"},
- {file = "mypy-1.15.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:973500e0774b85d9689715feeffcc980193086551110fd678ebe1f4342fb7c5e"},
- {file = "mypy-1.15.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:5a95fb17c13e29d2d5195869262f8125dfdb5c134dc8d9a9d0aecf7525b10c2c"},
- {file = "mypy-1.15.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:1905f494bfd7d85a23a88c5d97840888a7bd516545fc5aaedff0267e0bb54e2f"},
- {file = "mypy-1.15.0-cp311-cp311-win_amd64.whl", hash = "sha256:c9817fa23833ff189db061e6d2eff49b2f3b6ed9856b4a0a73046e41932d744f"},
- {file = "mypy-1.15.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:aea39e0583d05124836ea645f412e88a5c7d0fd77a6d694b60d9b6b2d9f184fd"},
- {file = "mypy-1.15.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:2f2147ab812b75e5b5499b01ade1f4a81489a147c01585cda36019102538615f"},
- {file = "mypy-1.15.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ce436f4c6d218a070048ed6a44c0bbb10cd2cc5e272b29e7845f6a2f57ee4464"},
- {file = "mypy-1.15.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:8023ff13985661b50a5928fc7a5ca15f3d1affb41e5f0a9952cb68ef090b31ee"},
- {file = "mypy-1.15.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:1124a18bc11a6a62887e3e137f37f53fbae476dc36c185d549d4f837a2a6a14e"},
- {file = "mypy-1.15.0-cp312-cp312-win_amd64.whl", hash = "sha256:171a9ca9a40cd1843abeca0e405bc1940cd9b305eaeea2dda769ba096932bb22"},
- {file = "mypy-1.15.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:93faf3fdb04768d44bf28693293f3904bbb555d076b781ad2530214ee53e3445"},
- {file = "mypy-1.15.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:811aeccadfb730024c5d3e326b2fbe9249bb7413553f15499a4050f7c30e801d"},
- {file = "mypy-1.15.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:98b7b9b9aedb65fe628c62a6dc57f6d5088ef2dfca37903a7d9ee374d03acca5"},
- {file = "mypy-1.15.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:c43a7682e24b4f576d93072216bf56eeff70d9140241f9edec0c104d0c515036"},
- {file = "mypy-1.15.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:baefc32840a9f00babd83251560e0ae1573e2f9d1b067719479bfb0e987c6357"},
- {file = "mypy-1.15.0-cp313-cp313-win_amd64.whl", hash = "sha256:b9378e2c00146c44793c98b8d5a61039a048e31f429fb0eb546d93f4b000bedf"},
- {file = "mypy-1.15.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:e601a7fa172c2131bff456bb3ee08a88360760d0d2f8cbd7a75a65497e2df078"},
- {file = "mypy-1.15.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:712e962a6357634fef20412699a3655c610110e01cdaa6180acec7fc9f8513ba"},
- {file = "mypy-1.15.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:f95579473af29ab73a10bada2f9722856792a36ec5af5399b653aa28360290a5"},
- {file = "mypy-1.15.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:8f8722560a14cde92fdb1e31597760dc35f9f5524cce17836c0d22841830fd5b"},
- {file = "mypy-1.15.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:1fbb8da62dc352133d7d7ca90ed2fb0e9d42bb1a32724c287d3c76c58cbaa9c2"},
- {file = "mypy-1.15.0-cp39-cp39-win_amd64.whl", hash = "sha256:d10d994b41fb3497719bbf866f227b3489048ea4bbbb5015357db306249f7980"},
- {file = "mypy-1.15.0-py3-none-any.whl", hash = "sha256:5469affef548bd1895d86d3bf10ce2b44e33d86923c29e4d675b3e323437ea3e"},
- {file = "mypy-1.15.0.tar.gz", hash = "sha256:404534629d51d3efea5c800ee7c42b72a6554d6c400e6a79eafe15d11341fd43"},
-]
-
-[package.dependencies]
-mypy_extensions = ">=1.0.0"
-typing_extensions = ">=4.6.0"
-
-[package.extras]
-dmypy = ["psutil (>=4.0)"]
-faster-cache = ["orjson"]
-install-types = ["pip"]
-mypyc = ["setuptools (>=50)"]
-reports = ["lxml"]
-
-[[package]]
-name = "mypy-extensions"
-version = "1.0.0"
-description = "Type system extensions for programs checked with the mypy type checker."
-optional = false
-python-versions = ">=3.5"
-files = [
- {file = "mypy_extensions-1.0.0-py3-none-any.whl", hash = "sha256:4392f6c0eb8a5668a69e23d168ffa70f0be9ccfd32b5cc2d26a34ae5b844552d"},
- {file = "mypy_extensions-1.0.0.tar.gz", hash = "sha256:75dbf8955dc00442a438fc4d0666508a9a97b6bd41aa2f0ffe9d2f2725af0782"},
-]
-
-[[package]]
-name = "numpy"
-version = "2.2.2"
-description = "Fundamental package for array computing in Python"
-optional = false
-python-versions = ">=3.10"
-files = [
- {file = "numpy-2.2.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:7079129b64cb78bdc8d611d1fd7e8002c0a2565da6a47c4df8062349fee90e3e"},
- {file = "numpy-2.2.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:2ec6c689c61df613b783aeb21f945c4cbe6c51c28cb70aae8430577ab39f163e"},
- {file = "numpy-2.2.2-cp310-cp310-macosx_14_0_arm64.whl", hash = "sha256:40c7ff5da22cd391944a28c6a9c638a5eef77fcf71d6e3a79e1d9d9e82752715"},
- {file = "numpy-2.2.2-cp310-cp310-macosx_14_0_x86_64.whl", hash = "sha256:995f9e8181723852ca458e22de5d9b7d3ba4da3f11cc1cb113f093b271d7965a"},
- {file = "numpy-2.2.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b78ea78450fd96a498f50ee096f69c75379af5138f7881a51355ab0e11286c97"},
- {file = "numpy-2.2.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3fbe72d347fbc59f94124125e73fc4976a06927ebc503ec5afbfb35f193cd957"},
- {file = "numpy-2.2.2-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:8e6da5cffbbe571f93588f562ed130ea63ee206d12851b60819512dd3e1ba50d"},
- {file = "numpy-2.2.2-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:09d6a2032faf25e8d0cadde7fd6145118ac55d2740132c1d845f98721b5ebcfd"},
- {file = "numpy-2.2.2-cp310-cp310-win32.whl", hash = "sha256:159ff6ee4c4a36a23fe01b7c3d07bd8c14cc433d9720f977fcd52c13c0098160"},
- {file = "numpy-2.2.2-cp310-cp310-win_amd64.whl", hash = "sha256:64bd6e1762cd7f0986a740fee4dff927b9ec2c5e4d9a28d056eb17d332158014"},
- {file = "numpy-2.2.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:642199e98af1bd2b6aeb8ecf726972d238c9877b0f6e8221ee5ab945ec8a2189"},
- {file = "numpy-2.2.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:6d9fc9d812c81e6168b6d405bf00b8d6739a7f72ef22a9214c4241e0dc70b323"},
- {file = "numpy-2.2.2-cp311-cp311-macosx_14_0_arm64.whl", hash = "sha256:c7d1fd447e33ee20c1f33f2c8e6634211124a9aabde3c617687d8b739aa69eac"},
- {file = "numpy-2.2.2-cp311-cp311-macosx_14_0_x86_64.whl", hash = "sha256:451e854cfae0febe723077bd0cf0a4302a5d84ff25f0bfece8f29206c7bed02e"},
- {file = "numpy-2.2.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bd249bc894af67cbd8bad2c22e7cbcd46cf87ddfca1f1289d1e7e54868cc785c"},
- {file = "numpy-2.2.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:02935e2c3c0c6cbe9c7955a8efa8908dd4221d7755644c59d1bba28b94fd334f"},
- {file = "numpy-2.2.2-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:a972cec723e0563aa0823ee2ab1df0cb196ed0778f173b381c871a03719d4826"},
- {file = "numpy-2.2.2-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:d6d6a0910c3b4368d89dde073e630882cdb266755565155bc33520283b2d9df8"},
- {file = "numpy-2.2.2-cp311-cp311-win32.whl", hash = "sha256:860fd59990c37c3ef913c3ae390b3929d005243acca1a86facb0773e2d8d9e50"},
- {file = "numpy-2.2.2-cp311-cp311-win_amd64.whl", hash = "sha256:da1eeb460ecce8d5b8608826595c777728cdf28ce7b5a5a8c8ac8d949beadcf2"},
- {file = "numpy-2.2.2-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:ac9bea18d6d58a995fac1b2cb4488e17eceeac413af014b1dd26170b766d8467"},
- {file = "numpy-2.2.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:23ae9f0c2d889b7b2d88a3791f6c09e2ef827c2446f1c4a3e3e76328ee4afd9a"},
- {file = "numpy-2.2.2-cp312-cp312-macosx_14_0_arm64.whl", hash = "sha256:3074634ea4d6df66be04f6728ee1d173cfded75d002c75fac79503a880bf3825"},
- {file = "numpy-2.2.2-cp312-cp312-macosx_14_0_x86_64.whl", hash = "sha256:8ec0636d3f7d68520afc6ac2dc4b8341ddb725039de042faf0e311599f54eb37"},
- {file = "numpy-2.2.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2ffbb1acd69fdf8e89dd60ef6182ca90a743620957afb7066385a7bbe88dc748"},
- {file = "numpy-2.2.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0349b025e15ea9d05c3d63f9657707a4e1d471128a3b1d876c095f328f8ff7f0"},
- {file = "numpy-2.2.2-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:463247edcee4a5537841d5350bc87fe8e92d7dd0e8c71c995d2c6eecb8208278"},
- {file = "numpy-2.2.2-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:9dd47ff0cb2a656ad69c38da850df3454da88ee9a6fde0ba79acceee0e79daba"},
- {file = "numpy-2.2.2-cp312-cp312-win32.whl", hash = "sha256:4525b88c11906d5ab1b0ec1f290996c0020dd318af8b49acaa46f198b1ffc283"},
- {file = "numpy-2.2.2-cp312-cp312-win_amd64.whl", hash = "sha256:5acea83b801e98541619af398cc0109ff48016955cc0818f478ee9ef1c5c3dcb"},
- {file = "numpy-2.2.2-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:b208cfd4f5fe34e1535c08983a1a6803fdbc7a1e86cf13dd0c61de0b51a0aadc"},
- {file = "numpy-2.2.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:d0bbe7dd86dca64854f4b6ce2ea5c60b51e36dfd597300057cf473d3615f2369"},
- {file = "numpy-2.2.2-cp313-cp313-macosx_14_0_arm64.whl", hash = "sha256:22ea3bb552ade325530e72a0c557cdf2dea8914d3a5e1fecf58fa5dbcc6f43cd"},
- {file = "numpy-2.2.2-cp313-cp313-macosx_14_0_x86_64.whl", hash = "sha256:128c41c085cab8a85dc29e66ed88c05613dccf6bc28b3866cd16050a2f5448be"},
- {file = "numpy-2.2.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:250c16b277e3b809ac20d1f590716597481061b514223c7badb7a0f9993c7f84"},
- {file = "numpy-2.2.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e0c8854b09bc4de7b041148d8550d3bd712b5c21ff6a8ed308085f190235d7ff"},
- {file = "numpy-2.2.2-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:b6fb9c32a91ec32a689ec6410def76443e3c750e7cfc3fb2206b985ffb2b85f0"},
- {file = "numpy-2.2.2-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:57b4012e04cc12b78590a334907e01b3a85efb2107df2b8733ff1ed05fce71de"},
- {file = "numpy-2.2.2-cp313-cp313-win32.whl", hash = "sha256:4dbd80e453bd34bd003b16bd802fac70ad76bd463f81f0c518d1245b1c55e3d9"},
- {file = "numpy-2.2.2-cp313-cp313-win_amd64.whl", hash = "sha256:5a8c863ceacae696aff37d1fd636121f1a512117652e5dfb86031c8d84836369"},
- {file = "numpy-2.2.2-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:b3482cb7b3325faa5f6bc179649406058253d91ceda359c104dac0ad320e1391"},
- {file = "numpy-2.2.2-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:9491100aba630910489c1d0158034e1c9a6546f0b1340f716d522dc103788e39"},
- {file = "numpy-2.2.2-cp313-cp313t-macosx_14_0_arm64.whl", hash = "sha256:41184c416143defa34cc8eb9d070b0a5ba4f13a0fa96a709e20584638254b317"},
- {file = "numpy-2.2.2-cp313-cp313t-macosx_14_0_x86_64.whl", hash = "sha256:7dca87ca328f5ea7dafc907c5ec100d187911f94825f8700caac0b3f4c384b49"},
- {file = "numpy-2.2.2-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0bc61b307655d1a7f9f4b043628b9f2b721e80839914ede634e3d485913e1fb2"},
- {file = "numpy-2.2.2-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9fad446ad0bc886855ddf5909cbf8cb5d0faa637aaa6277fb4b19ade134ab3c7"},
- {file = "numpy-2.2.2-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:149d1113ac15005652e8d0d3f6fd599360e1a708a4f98e43c9c77834a28238cb"},
- {file = "numpy-2.2.2-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:106397dbbb1896f99e044efc90360d098b3335060375c26aa89c0d8a97c5f648"},
- {file = "numpy-2.2.2-cp313-cp313t-win32.whl", hash = "sha256:0eec19f8af947a61e968d5429f0bd92fec46d92b0008d0a6685b40d6adf8a4f4"},
- {file = "numpy-2.2.2-cp313-cp313t-win_amd64.whl", hash = "sha256:97b974d3ba0fb4612b77ed35d7627490e8e3dff56ab41454d9e8b23448940576"},
- {file = "numpy-2.2.2-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:b0531f0b0e07643eb089df4c509d30d72c9ef40defa53e41363eca8a8cc61495"},
- {file = "numpy-2.2.2-pp310-pypy310_pp73-macosx_14_0_x86_64.whl", hash = "sha256:e9e82dcb3f2ebbc8cb5ce1102d5f1c5ed236bf8a11730fb45ba82e2841ec21df"},
- {file = "numpy-2.2.2-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e0d4142eb40ca6f94539e4db929410f2a46052a0fe7a2c1c59f6179c39938d2a"},
- {file = "numpy-2.2.2-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:356ca982c188acbfa6af0d694284d8cf20e95b1c3d0aefa8929376fea9146f60"},
- {file = "numpy-2.2.2.tar.gz", hash = "sha256:ed6906f61834d687738d25988ae117683705636936cc605be0bb208b23df4d8f"},
-]
-
-[[package]]
-name = "packaging"
-version = "24.2"
-description = "Core utilities for Python packages"
-optional = false
-python-versions = ">=3.8"
-files = [
- {file = "packaging-24.2-py3-none-any.whl", hash = "sha256:09abb1bccd265c01f4a3aa3f7a7db064b36514d2cba19a2f694fe6150451a759"},
- {file = "packaging-24.2.tar.gz", hash = "sha256:c228a6dc5e932d346bc5739379109d49e8853dd8223571c7c5b55260edc0b97f"},
-]
-
-[[package]]
-name = "pandas"
-version = "2.2.3"
-description = "Powerful data structures for data analysis, time series, and statistics"
-optional = false
-python-versions = ">=3.9"
-files = [
- {file = "pandas-2.2.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:1948ddde24197a0f7add2bdc4ca83bf2b1ef84a1bc8ccffd95eda17fd836ecb5"},
- {file = "pandas-2.2.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:381175499d3802cde0eabbaf6324cce0c4f5d52ca6f8c377c29ad442f50f6348"},
- {file = "pandas-2.2.3-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:d9c45366def9a3dd85a6454c0e7908f2b3b8e9c138f5dc38fed7ce720d8453ed"},
- {file = "pandas-2.2.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:86976a1c5b25ae3f8ccae3a5306e443569ee3c3faf444dfd0f41cda24667ad57"},
- {file = "pandas-2.2.3-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:b8661b0238a69d7aafe156b7fa86c44b881387509653fdf857bebc5e4008ad42"},
- {file = "pandas-2.2.3-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:37e0aced3e8f539eccf2e099f65cdb9c8aa85109b0be6e93e2baff94264bdc6f"},
- {file = "pandas-2.2.3-cp310-cp310-win_amd64.whl", hash = "sha256:56534ce0746a58afaf7942ba4863e0ef81c9c50d3f0ae93e9497d6a41a057645"},
- {file = "pandas-2.2.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:66108071e1b935240e74525006034333f98bcdb87ea116de573a6a0dccb6c039"},
- {file = "pandas-2.2.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:7c2875855b0ff77b2a64a0365e24455d9990730d6431b9e0ee18ad8acee13dbd"},
- {file = "pandas-2.2.3-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:cd8d0c3be0515c12fed0bdbae072551c8b54b7192c7b1fda0ba56059a0179698"},
- {file = "pandas-2.2.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c124333816c3a9b03fbeef3a9f230ba9a737e9e5bb4060aa2107a86cc0a497fc"},
- {file = "pandas-2.2.3-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:63cc132e40a2e084cf01adf0775b15ac515ba905d7dcca47e9a251819c575ef3"},
- {file = "pandas-2.2.3-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:29401dbfa9ad77319367d36940cd8a0b3a11aba16063e39632d98b0e931ddf32"},
- {file = "pandas-2.2.3-cp311-cp311-win_amd64.whl", hash = "sha256:3fc6873a41186404dad67245896a6e440baacc92f5b716ccd1bc9ed2995ab2c5"},
- {file = "pandas-2.2.3-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:b1d432e8d08679a40e2a6d8b2f9770a5c21793a6f9f47fdd52c5ce1948a5a8a9"},
- {file = "pandas-2.2.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:a5a1595fe639f5988ba6a8e5bc9649af3baf26df3998a0abe56c02609392e0a4"},
- {file = "pandas-2.2.3-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:5de54125a92bb4d1c051c0659e6fcb75256bf799a732a87184e5ea503965bce3"},
- {file = "pandas-2.2.3-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fffb8ae78d8af97f849404f21411c95062db1496aeb3e56f146f0355c9989319"},
- {file = "pandas-2.2.3-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:6dfcb5ee8d4d50c06a51c2fffa6cff6272098ad6540aed1a76d15fb9318194d8"},
- {file = "pandas-2.2.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:062309c1b9ea12a50e8ce661145c6aab431b1e99530d3cd60640e255778bd43a"},
- {file = "pandas-2.2.3-cp312-cp312-win_amd64.whl", hash = "sha256:59ef3764d0fe818125a5097d2ae867ca3fa64df032331b7e0917cf5d7bf66b13"},
- {file = "pandas-2.2.3-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:f00d1345d84d8c86a63e476bb4955e46458b304b9575dcf71102b5c705320015"},
- {file = "pandas-2.2.3-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:3508d914817e153ad359d7e069d752cdd736a247c322d932eb89e6bc84217f28"},
- {file = "pandas-2.2.3-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:22a9d949bfc9a502d320aa04e5d02feab689d61da4e7764b62c30b991c42c5f0"},
- {file = "pandas-2.2.3-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f3a255b2c19987fbbe62a9dfd6cff7ff2aa9ccab3fc75218fd4b7530f01efa24"},
- {file = "pandas-2.2.3-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:800250ecdadb6d9c78eae4990da62743b857b470883fa27f652db8bdde7f6659"},
- {file = "pandas-2.2.3-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:6374c452ff3ec675a8f46fd9ab25c4ad0ba590b71cf0656f8b6daa5202bca3fb"},
- {file = "pandas-2.2.3-cp313-cp313-win_amd64.whl", hash = "sha256:61c5ad4043f791b61dd4752191d9f07f0ae412515d59ba8f005832a532f8736d"},
- {file = "pandas-2.2.3-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:3b71f27954685ee685317063bf13c7709a7ba74fc996b84fc6821c59b0f06468"},
- {file = "pandas-2.2.3-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:38cf8125c40dae9d5acc10fa66af8ea6fdf760b2714ee482ca691fc66e6fcb18"},
- {file = "pandas-2.2.3-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:ba96630bc17c875161df3818780af30e43be9b166ce51c9a18c1feae342906c2"},
- {file = "pandas-2.2.3-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1db71525a1538b30142094edb9adc10be3f3e176748cd7acc2240c2f2e5aa3a4"},
- {file = "pandas-2.2.3-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:15c0e1e02e93116177d29ff83e8b1619c93ddc9c49083f237d4312337a61165d"},
- {file = "pandas-2.2.3-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:ad5b65698ab28ed8d7f18790a0dc58005c7629f227be9ecc1072aa74c0c1d43a"},
- {file = "pandas-2.2.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:bc6b93f9b966093cb0fd62ff1a7e4c09e6d546ad7c1de191767baffc57628f39"},
- {file = "pandas-2.2.3-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:5dbca4c1acd72e8eeef4753eeca07de9b1db4f398669d5994086f788a5d7cc30"},
- {file = "pandas-2.2.3-cp39-cp39-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:8cd6d7cc958a3910f934ea8dbdf17b2364827bb4dafc38ce6eef6bb3d65ff09c"},
- {file = "pandas-2.2.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:99df71520d25fade9db7c1076ac94eb994f4d2673ef2aa2e86ee039b6746d20c"},
- {file = "pandas-2.2.3-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:31d0ced62d4ea3e231a9f228366919a5ea0b07440d9d4dac345376fd8e1477ea"},
- {file = "pandas-2.2.3-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:7eee9e7cea6adf3e3d24e304ac6b8300646e2a5d1cd3a3c2abed9101b0846761"},
- {file = "pandas-2.2.3-cp39-cp39-win_amd64.whl", hash = "sha256:4850ba03528b6dd51d6c5d273c46f183f39a9baf3f0143e566b89450965b105e"},
- {file = "pandas-2.2.3.tar.gz", hash = "sha256:4f18ba62b61d7e192368b84517265a99b4d7ee8912f8708660fb4a366cc82667"},
-]
-
-[package.dependencies]
-numpy = [
- {version = ">=1.23.2", markers = "python_version == \"3.11\""},
- {version = ">=1.26.0", markers = "python_version >= \"3.12\""},
-]
-python-dateutil = ">=2.8.2"
-pytz = ">=2020.1"
-tzdata = ">=2022.7"
-
-[package.extras]
-all = ["PyQt5 (>=5.15.9)", "SQLAlchemy (>=2.0.0)", "adbc-driver-postgresql (>=0.8.0)", "adbc-driver-sqlite (>=0.8.0)", "beautifulsoup4 (>=4.11.2)", "bottleneck (>=1.3.6)", "dataframe-api-compat (>=0.1.7)", "fastparquet (>=2022.12.0)", "fsspec (>=2022.11.0)", "gcsfs (>=2022.11.0)", "html5lib (>=1.1)", "hypothesis (>=6.46.1)", "jinja2 (>=3.1.2)", "lxml (>=4.9.2)", "matplotlib (>=3.6.3)", "numba (>=0.56.4)", "numexpr (>=2.8.4)", "odfpy (>=1.4.1)", "openpyxl (>=3.1.0)", "pandas-gbq (>=0.19.0)", "psycopg2 (>=2.9.6)", "pyarrow (>=10.0.1)", "pymysql (>=1.0.2)", "pyreadstat (>=1.2.0)", "pytest (>=7.3.2)", "pytest-xdist (>=2.2.0)", "python-calamine (>=0.1.7)", "pyxlsb (>=1.0.10)", "qtpy (>=2.3.0)", "s3fs (>=2022.11.0)", "scipy (>=1.10.0)", "tables (>=3.8.0)", "tabulate (>=0.9.0)", "xarray (>=2022.12.0)", "xlrd (>=2.0.1)", "xlsxwriter (>=3.0.5)", "zstandard (>=0.19.0)"]
-aws = ["s3fs (>=2022.11.0)"]
-clipboard = ["PyQt5 (>=5.15.9)", "qtpy (>=2.3.0)"]
-compression = ["zstandard (>=0.19.0)"]
-computation = ["scipy (>=1.10.0)", "xarray (>=2022.12.0)"]
-consortium-standard = ["dataframe-api-compat (>=0.1.7)"]
-excel = ["odfpy (>=1.4.1)", "openpyxl (>=3.1.0)", "python-calamine (>=0.1.7)", "pyxlsb (>=1.0.10)", "xlrd (>=2.0.1)", "xlsxwriter (>=3.0.5)"]
-feather = ["pyarrow (>=10.0.1)"]
-fss = ["fsspec (>=2022.11.0)"]
-gcp = ["gcsfs (>=2022.11.0)", "pandas-gbq (>=0.19.0)"]
-hdf5 = ["tables (>=3.8.0)"]
-html = ["beautifulsoup4 (>=4.11.2)", "html5lib (>=1.1)", "lxml (>=4.9.2)"]
-mysql = ["SQLAlchemy (>=2.0.0)", "pymysql (>=1.0.2)"]
-output-formatting = ["jinja2 (>=3.1.2)", "tabulate (>=0.9.0)"]
-parquet = ["pyarrow (>=10.0.1)"]
-performance = ["bottleneck (>=1.3.6)", "numba (>=0.56.4)", "numexpr (>=2.8.4)"]
-plot = ["matplotlib (>=3.6.3)"]
-postgresql = ["SQLAlchemy (>=2.0.0)", "adbc-driver-postgresql (>=0.8.0)", "psycopg2 (>=2.9.6)"]
-pyarrow = ["pyarrow (>=10.0.1)"]
-spss = ["pyreadstat (>=1.2.0)"]
-sql-other = ["SQLAlchemy (>=2.0.0)", "adbc-driver-postgresql (>=0.8.0)", "adbc-driver-sqlite (>=0.8.0)"]
-test = ["hypothesis (>=6.46.1)", "pytest (>=7.3.2)", "pytest-xdist (>=2.2.0)"]
-xml = ["lxml (>=4.9.2)"]
-
-[[package]]
-name = "pathspec"
-version = "0.12.1"
-description = "Utility library for gitignore style pattern matching of file paths."
-optional = false
-python-versions = ">=3.8"
-files = [
- {file = "pathspec-0.12.1-py3-none-any.whl", hash = "sha256:a0d503e138a4c123b27490a4f7beda6a01c6f288df0e4a8b79c7eb0dc7b4cc08"},
- {file = "pathspec-0.12.1.tar.gz", hash = "sha256:a482d51503a1ab33b1c67a6c3813a26953dbdc71c31dacaef9a838c4e29f5712"},
-]
-
-[[package]]
-name = "platformdirs"
-version = "4.3.6"
-description = "A small Python package for determining appropriate platform-specific dirs, e.g. a `user data dir`."
-optional = false
-python-versions = ">=3.8"
-files = [
- {file = "platformdirs-4.3.6-py3-none-any.whl", hash = "sha256:73e575e1408ab8103900836b97580d5307456908a03e92031bab39e4554cc3fb"},
- {file = "platformdirs-4.3.6.tar.gz", hash = "sha256:357fb2acbc885b0419afd3ce3ed34564c13c9b95c89360cd9563f73aa5e2b907"},
-]
-
-[package.extras]
-docs = ["furo (>=2024.8.6)", "proselint (>=0.14)", "sphinx (>=8.0.2)", "sphinx-autodoc-typehints (>=2.4)"]
-test = ["appdirs (==1.4.4)", "covdefaults (>=2.3)", "pytest (>=8.3.2)", "pytest-cov (>=5)", "pytest-mock (>=3.14)"]
-type = ["mypy (>=1.11.2)"]
-
-[[package]]
-name = "pluggy"
-version = "1.5.0"
-description = "plugin and hook calling mechanisms for python"
-optional = false
-python-versions = ">=3.8"
-files = [
- {file = "pluggy-1.5.0-py3-none-any.whl", hash = "sha256:44e1ad92c8ca002de6377e165f3e0f1be63266ab4d554740532335b9d75ea669"},
- {file = "pluggy-1.5.0.tar.gz", hash = "sha256:2cffa88e94fdc978c4c574f15f9e59b7f4201d439195c3715ca9e2486f1d0cf1"},
-]
-
-[package.extras]
-dev = ["pre-commit", "tox"]
-testing = ["pytest", "pytest-benchmark"]
-
-[[package]]
-name = "propcache"
-version = "0.2.1"
-description = "Accelerated property cache"
-optional = false
-python-versions = ">=3.9"
-files = [
- {file = "propcache-0.2.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:6b3f39a85d671436ee3d12c017f8fdea38509e4f25b28eb25877293c98c243f6"},
- {file = "propcache-0.2.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:39d51fbe4285d5db5d92a929e3e21536ea3dd43732c5b177c7ef03f918dff9f2"},
- {file = "propcache-0.2.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:6445804cf4ec763dc70de65a3b0d9954e868609e83850a47ca4f0cb64bd79fea"},
- {file = "propcache-0.2.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f9479aa06a793c5aeba49ce5c5692ffb51fcd9a7016e017d555d5e2b0045d212"},
- {file = "propcache-0.2.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d9631c5e8b5b3a0fda99cb0d29c18133bca1e18aea9effe55adb3da1adef80d3"},
- {file = "propcache-0.2.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3156628250f46a0895f1f36e1d4fbe062a1af8718ec3ebeb746f1d23f0c5dc4d"},
- {file = "propcache-0.2.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6b6fb63ae352e13748289f04f37868099e69dba4c2b3e271c46061e82c745634"},
- {file = "propcache-0.2.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:887d9b0a65404929641a9fabb6452b07fe4572b269d901d622d8a34a4e9043b2"},
- {file = "propcache-0.2.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:a96dc1fa45bd8c407a0af03b2d5218392729e1822b0c32e62c5bf7eeb5fb3958"},
- {file = "propcache-0.2.1-cp310-cp310-musllinux_1_2_armv7l.whl", hash = "sha256:a7e65eb5c003a303b94aa2c3852ef130230ec79e349632d030e9571b87c4698c"},
- {file = "propcache-0.2.1-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:999779addc413181912e984b942fbcc951be1f5b3663cd80b2687758f434c583"},
- {file = "propcache-0.2.1-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:19a0f89a7bb9d8048d9c4370c9c543c396e894c76be5525f5e1ad287f1750ddf"},
- {file = "propcache-0.2.1-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:1ac2f5fe02fa75f56e1ad473f1175e11f475606ec9bd0be2e78e4734ad575034"},
- {file = "propcache-0.2.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:574faa3b79e8ebac7cb1d7930f51184ba1ccf69adfdec53a12f319a06030a68b"},
- {file = "propcache-0.2.1-cp310-cp310-win32.whl", hash = "sha256:03ff9d3f665769b2a85e6157ac8b439644f2d7fd17615a82fa55739bc97863f4"},
- {file = "propcache-0.2.1-cp310-cp310-win_amd64.whl", hash = "sha256:2d3af2e79991102678f53e0dbf4c35de99b6b8b58f29a27ca0325816364caaba"},
- {file = "propcache-0.2.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:1ffc3cca89bb438fb9c95c13fc874012f7b9466b89328c3c8b1aa93cdcfadd16"},
- {file = "propcache-0.2.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:f174bbd484294ed9fdf09437f889f95807e5f229d5d93588d34e92106fbf6717"},
- {file = "propcache-0.2.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:70693319e0b8fd35dd863e3e29513875eb15c51945bf32519ef52927ca883bc3"},
- {file = "propcache-0.2.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b480c6a4e1138e1aa137c0079b9b6305ec6dcc1098a8ca5196283e8a49df95a9"},
- {file = "propcache-0.2.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d27b84d5880f6d8aa9ae3edb253c59d9f6642ffbb2c889b78b60361eed449787"},
- {file = "propcache-0.2.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:857112b22acd417c40fa4595db2fe28ab900c8c5fe4670c7989b1c0230955465"},
- {file = "propcache-0.2.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cf6c4150f8c0e32d241436526f3c3f9cbd34429492abddbada2ffcff506c51af"},
- {file = "propcache-0.2.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:66d4cfda1d8ed687daa4bc0274fcfd5267873db9a5bc0418c2da19273040eeb7"},
- {file = "propcache-0.2.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:c2f992c07c0fca81655066705beae35fc95a2fa7366467366db627d9f2ee097f"},
- {file = "propcache-0.2.1-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:4a571d97dbe66ef38e472703067021b1467025ec85707d57e78711c085984e54"},
- {file = "propcache-0.2.1-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:bb6178c241278d5fe853b3de743087be7f5f4c6f7d6d22a3b524d323eecec505"},
- {file = "propcache-0.2.1-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:ad1af54a62ffe39cf34db1aa6ed1a1873bd548f6401db39d8e7cd060b9211f82"},
- {file = "propcache-0.2.1-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:e7048abd75fe40712005bcfc06bb44b9dfcd8e101dda2ecf2f5aa46115ad07ca"},
- {file = "propcache-0.2.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:160291c60081f23ee43d44b08a7e5fb76681221a8e10b3139618c5a9a291b84e"},
- {file = "propcache-0.2.1-cp311-cp311-win32.whl", hash = "sha256:819ce3b883b7576ca28da3861c7e1a88afd08cc8c96908e08a3f4dd64a228034"},
- {file = "propcache-0.2.1-cp311-cp311-win_amd64.whl", hash = "sha256:edc9fc7051e3350643ad929df55c451899bb9ae6d24998a949d2e4c87fb596d3"},
- {file = "propcache-0.2.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:081a430aa8d5e8876c6909b67bd2d937bfd531b0382d3fdedb82612c618bc41a"},
- {file = "propcache-0.2.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:d2ccec9ac47cf4e04897619c0e0c1a48c54a71bdf045117d3a26f80d38ab1fb0"},
- {file = "propcache-0.2.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:14d86fe14b7e04fa306e0c43cdbeebe6b2c2156a0c9ce56b815faacc193e320d"},
- {file = "propcache-0.2.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:049324ee97bb67285b49632132db351b41e77833678432be52bdd0289c0e05e4"},
- {file = "propcache-0.2.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1cd9a1d071158de1cc1c71a26014dcdfa7dd3d5f4f88c298c7f90ad6f27bb46d"},
- {file = "propcache-0.2.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:98110aa363f1bb4c073e8dcfaefd3a5cea0f0834c2aab23dda657e4dab2f53b5"},
- {file = "propcache-0.2.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:647894f5ae99c4cf6bb82a1bb3a796f6e06af3caa3d32e26d2350d0e3e3faf24"},
- {file = "propcache-0.2.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:bfd3223c15bebe26518d58ccf9a39b93948d3dcb3e57a20480dfdd315356baff"},
- {file = "propcache-0.2.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:d71264a80f3fcf512eb4f18f59423fe82d6e346ee97b90625f283df56aee103f"},
- {file = "propcache-0.2.1-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:e73091191e4280403bde6c9a52a6999d69cdfde498f1fdf629105247599b57ec"},
- {file = "propcache-0.2.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:3935bfa5fede35fb202c4b569bb9c042f337ca4ff7bd540a0aa5e37131659348"},
- {file = "propcache-0.2.1-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:f508b0491767bb1f2b87fdfacaba5f7eddc2f867740ec69ece6d1946d29029a6"},
- {file = "propcache-0.2.1-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:1672137af7c46662a1c2be1e8dc78cb6d224319aaa40271c9257d886be4363a6"},
- {file = "propcache-0.2.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:b74c261802d3d2b85c9df2dfb2fa81b6f90deeef63c2db9f0e029a3cac50b518"},
- {file = "propcache-0.2.1-cp312-cp312-win32.whl", hash = "sha256:d09c333d36c1409d56a9d29b3a1b800a42c76a57a5a8907eacdbce3f18768246"},
- {file = "propcache-0.2.1-cp312-cp312-win_amd64.whl", hash = "sha256:c214999039d4f2a5b2073ac506bba279945233da8c786e490d411dfc30f855c1"},
- {file = "propcache-0.2.1-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:aca405706e0b0a44cc6bfd41fbe89919a6a56999157f6de7e182a990c36e37bc"},
- {file = "propcache-0.2.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:12d1083f001ace206fe34b6bdc2cb94be66d57a850866f0b908972f90996b3e9"},
- {file = "propcache-0.2.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:d93f3307ad32a27bda2e88ec81134b823c240aa3abb55821a8da553eed8d9439"},
- {file = "propcache-0.2.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ba278acf14471d36316159c94a802933d10b6a1e117b8554fe0d0d9b75c9d536"},
- {file = "propcache-0.2.1-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4e6281aedfca15301c41f74d7005e6e3f4ca143584ba696ac69df4f02f40d629"},
- {file = "propcache-0.2.1-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5b750a8e5a1262434fb1517ddf64b5de58327f1adc3524a5e44c2ca43305eb0b"},
- {file = "propcache-0.2.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bf72af5e0fb40e9babf594308911436c8efde3cb5e75b6f206c34ad18be5c052"},
- {file = "propcache-0.2.1-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b2d0a12018b04f4cb820781ec0dffb5f7c7c1d2a5cd22bff7fb055a2cb19ebce"},
- {file = "propcache-0.2.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:e800776a79a5aabdb17dcc2346a7d66d0777e942e4cd251defeb084762ecd17d"},
- {file = "propcache-0.2.1-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:4160d9283bd382fa6c0c2b5e017acc95bc183570cd70968b9202ad6d8fc48dce"},
- {file = "propcache-0.2.1-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:30b43e74f1359353341a7adb783c8f1b1c676367b011709f466f42fda2045e95"},
- {file = "propcache-0.2.1-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:58791550b27d5488b1bb52bc96328456095d96206a250d28d874fafe11b3dfaf"},
- {file = "propcache-0.2.1-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:0f022d381747f0dfe27e99d928e31bc51a18b65bb9e481ae0af1380a6725dd1f"},
- {file = "propcache-0.2.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:297878dc9d0a334358f9b608b56d02e72899f3b8499fc6044133f0d319e2ec30"},
- {file = "propcache-0.2.1-cp313-cp313-win32.whl", hash = "sha256:ddfab44e4489bd79bda09d84c430677fc7f0a4939a73d2bba3073036f487a0a6"},
- {file = "propcache-0.2.1-cp313-cp313-win_amd64.whl", hash = "sha256:556fc6c10989f19a179e4321e5d678db8eb2924131e64652a51fe83e4c3db0e1"},
- {file = "propcache-0.2.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:6a9a8c34fb7bb609419a211e59da8887eeca40d300b5ea8e56af98f6fbbb1541"},
- {file = "propcache-0.2.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:ae1aa1cd222c6d205853b3013c69cd04515f9d6ab6de4b0603e2e1c33221303e"},
- {file = "propcache-0.2.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:accb6150ce61c9c4b7738d45550806aa2b71c7668c6942f17b0ac182b6142fd4"},
- {file = "propcache-0.2.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5eee736daafa7af6d0a2dc15cc75e05c64f37fc37bafef2e00d77c14171c2097"},
- {file = "propcache-0.2.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f7a31fc1e1bd362874863fdeed71aed92d348f5336fd84f2197ba40c59f061bd"},
- {file = "propcache-0.2.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:cba4cfa1052819d16699e1d55d18c92b6e094d4517c41dd231a8b9f87b6fa681"},
- {file = "propcache-0.2.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f089118d584e859c62b3da0892b88a83d611c2033ac410e929cb6754eec0ed16"},
- {file = "propcache-0.2.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:781e65134efaf88feb447e8c97a51772aa75e48b794352f94cb7ea717dedda0d"},
- {file = "propcache-0.2.1-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:31f5af773530fd3c658b32b6bdc2d0838543de70eb9a2156c03e410f7b0d3aae"},
- {file = "propcache-0.2.1-cp39-cp39-musllinux_1_2_armv7l.whl", hash = "sha256:a7a078f5d37bee6690959c813977da5291b24286e7b962e62a94cec31aa5188b"},
- {file = "propcache-0.2.1-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:cea7daf9fc7ae6687cf1e2c049752f19f146fdc37c2cc376e7d0032cf4f25347"},
- {file = "propcache-0.2.1-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:8b3489ff1ed1e8315674d0775dc7d2195fb13ca17b3808721b54dbe9fd020faf"},
- {file = "propcache-0.2.1-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:9403db39be1393618dd80c746cb22ccda168efce239c73af13c3763ef56ffc04"},
- {file = "propcache-0.2.1-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:5d97151bc92d2b2578ff7ce779cdb9174337390a535953cbb9452fb65164c587"},
- {file = "propcache-0.2.1-cp39-cp39-win32.whl", hash = "sha256:9caac6b54914bdf41bcc91e7eb9147d331d29235a7c967c150ef5df6464fd1bb"},
- {file = "propcache-0.2.1-cp39-cp39-win_amd64.whl", hash = "sha256:92fc4500fcb33899b05ba73276dfb684a20d31caa567b7cb5252d48f896a91b1"},
- {file = "propcache-0.2.1-py3-none-any.whl", hash = "sha256:52277518d6aae65536e9cea52d4e7fd2f7a66f4aa2d30ed3f2fcea620ace3c54"},
- {file = "propcache-0.2.1.tar.gz", hash = "sha256:3f77ce728b19cb537714499928fe800c3dda29e8d9428778fc7c186da4c09a64"},
-]
-
-[[package]]
-name = "pydantic"
-version = "2.10.6"
-description = "Data validation using Python type hints"
-optional = false
-python-versions = ">=3.8"
-files = [
- {file = "pydantic-2.10.6-py3-none-any.whl", hash = "sha256:427d664bf0b8a2b34ff5dd0f5a18df00591adcee7198fbd71981054cef37b584"},
- {file = "pydantic-2.10.6.tar.gz", hash = "sha256:ca5daa827cce33de7a42be142548b0096bf05a7e7b365aebfa5f8eeec7128236"},
-]
-
-[package.dependencies]
-annotated-types = ">=0.6.0"
-pydantic-core = "2.27.2"
-typing-extensions = ">=4.12.2"
-
-[package.extras]
-email = ["email-validator (>=2.0.0)"]
-timezone = ["tzdata"]
-
-[[package]]
-name = "pydantic-core"
-version = "2.27.2"
-description = "Core functionality for Pydantic validation and serialization"
-optional = false
-python-versions = ">=3.8"
-files = [
- {file = "pydantic_core-2.27.2-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:2d367ca20b2f14095a8f4fa1210f5a7b78b8a20009ecced6b12818f455b1e9fa"},
- {file = "pydantic_core-2.27.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:491a2b73db93fab69731eaee494f320faa4e093dbed776be1a829c2eb222c34c"},
- {file = "pydantic_core-2.27.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7969e133a6f183be60e9f6f56bfae753585680f3b7307a8e555a948d443cc05a"},
- {file = "pydantic_core-2.27.2-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:3de9961f2a346257caf0aa508a4da705467f53778e9ef6fe744c038119737ef5"},
- {file = "pydantic_core-2.27.2-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e2bb4d3e5873c37bb3dd58714d4cd0b0e6238cebc4177ac8fe878f8b3aa8e74c"},
- {file = "pydantic_core-2.27.2-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:280d219beebb0752699480fe8f1dc61ab6615c2046d76b7ab7ee38858de0a4e7"},
- {file = "pydantic_core-2.27.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:47956ae78b6422cbd46f772f1746799cbb862de838fd8d1fbd34a82e05b0983a"},
- {file = "pydantic_core-2.27.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:14d4a5c49d2f009d62a2a7140d3064f686d17a5d1a268bc641954ba181880236"},
- {file = "pydantic_core-2.27.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:337b443af21d488716f8d0b6164de833e788aa6bd7e3a39c005febc1284f4962"},
- {file = "pydantic_core-2.27.2-cp310-cp310-musllinux_1_1_armv7l.whl", hash = "sha256:03d0f86ea3184a12f41a2d23f7ccb79cdb5a18e06993f8a45baa8dfec746f0e9"},
- {file = "pydantic_core-2.27.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:7041c36f5680c6e0f08d922aed302e98b3745d97fe1589db0a3eebf6624523af"},
- {file = "pydantic_core-2.27.2-cp310-cp310-win32.whl", hash = "sha256:50a68f3e3819077be2c98110c1f9dcb3817e93f267ba80a2c05bb4f8799e2ff4"},
- {file = "pydantic_core-2.27.2-cp310-cp310-win_amd64.whl", hash = "sha256:e0fd26b16394ead34a424eecf8a31a1f5137094cabe84a1bcb10fa6ba39d3d31"},
- {file = "pydantic_core-2.27.2-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:8e10c99ef58cfdf2a66fc15d66b16c4a04f62bca39db589ae8cba08bc55331bc"},
- {file = "pydantic_core-2.27.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:26f32e0adf166a84d0cb63be85c562ca8a6fa8de28e5f0d92250c6b7e9e2aff7"},
- {file = "pydantic_core-2.27.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8c19d1ea0673cd13cc2f872f6c9ab42acc4e4f492a7ca9d3795ce2b112dd7e15"},
- {file = "pydantic_core-2.27.2-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:5e68c4446fe0810e959cdff46ab0a41ce2f2c86d227d96dc3847af0ba7def306"},
- {file = "pydantic_core-2.27.2-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d9640b0059ff4f14d1f37321b94061c6db164fbe49b334b31643e0528d100d99"},
- {file = "pydantic_core-2.27.2-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:40d02e7d45c9f8af700f3452f329ead92da4c5f4317ca9b896de7ce7199ea459"},
- {file = "pydantic_core-2.27.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1c1fd185014191700554795c99b347d64f2bb637966c4cfc16998a0ca700d048"},
- {file = "pydantic_core-2.27.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:d81d2068e1c1228a565af076598f9e7451712700b673de8f502f0334f281387d"},
- {file = "pydantic_core-2.27.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:1a4207639fb02ec2dbb76227d7c751a20b1a6b4bc52850568e52260cae64ca3b"},
- {file = "pydantic_core-2.27.2-cp311-cp311-musllinux_1_1_armv7l.whl", hash = "sha256:3de3ce3c9ddc8bbd88f6e0e304dea0e66d843ec9de1b0042b0911c1663ffd474"},
- {file = "pydantic_core-2.27.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:30c5f68ded0c36466acede341551106821043e9afaad516adfb6e8fa80a4e6a6"},
- {file = "pydantic_core-2.27.2-cp311-cp311-win32.whl", hash = "sha256:c70c26d2c99f78b125a3459f8afe1aed4d9687c24fd677c6a4436bc042e50d6c"},
- {file = "pydantic_core-2.27.2-cp311-cp311-win_amd64.whl", hash = "sha256:08e125dbdc505fa69ca7d9c499639ab6407cfa909214d500897d02afb816e7cc"},
- {file = "pydantic_core-2.27.2-cp311-cp311-win_arm64.whl", hash = "sha256:26f0d68d4b235a2bae0c3fc585c585b4ecc51382db0e3ba402a22cbc440915e4"},
- {file = "pydantic_core-2.27.2-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:9e0c8cfefa0ef83b4da9588448b6d8d2a2bf1a53c3f1ae5fca39eb3061e2f0b0"},
- {file = "pydantic_core-2.27.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:83097677b8e3bd7eaa6775720ec8e0405f1575015a463285a92bfdfe254529ef"},
- {file = "pydantic_core-2.27.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:172fce187655fece0c90d90a678424b013f8fbb0ca8b036ac266749c09438cb7"},
- {file = "pydantic_core-2.27.2-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:519f29f5213271eeeeb3093f662ba2fd512b91c5f188f3bb7b27bc5973816934"},
- {file = "pydantic_core-2.27.2-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:05e3a55d124407fffba0dd6b0c0cd056d10e983ceb4e5dbd10dda135c31071d6"},
- {file = "pydantic_core-2.27.2-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9c3ed807c7b91de05e63930188f19e921d1fe90de6b4f5cd43ee7fcc3525cb8c"},
- {file = "pydantic_core-2.27.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6fb4aadc0b9a0c063206846d603b92030eb6f03069151a625667f982887153e2"},
- {file = "pydantic_core-2.27.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:28ccb213807e037460326424ceb8b5245acb88f32f3d2777427476e1b32c48c4"},
- {file = "pydantic_core-2.27.2-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:de3cd1899e2c279b140adde9357c4495ed9d47131b4a4eaff9052f23398076b3"},
- {file = "pydantic_core-2.27.2-cp312-cp312-musllinux_1_1_armv7l.whl", hash = "sha256:220f892729375e2d736b97d0e51466252ad84c51857d4d15f5e9692f9ef12be4"},
- {file = "pydantic_core-2.27.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:a0fcd29cd6b4e74fe8ddd2c90330fd8edf2e30cb52acda47f06dd615ae72da57"},
- {file = "pydantic_core-2.27.2-cp312-cp312-win32.whl", hash = "sha256:1e2cb691ed9834cd6a8be61228471d0a503731abfb42f82458ff27be7b2186fc"},
- {file = "pydantic_core-2.27.2-cp312-cp312-win_amd64.whl", hash = "sha256:cc3f1a99a4f4f9dd1de4fe0312c114e740b5ddead65bb4102884b384c15d8bc9"},
- {file = "pydantic_core-2.27.2-cp312-cp312-win_arm64.whl", hash = "sha256:3911ac9284cd8a1792d3cb26a2da18f3ca26c6908cc434a18f730dc0db7bfa3b"},
- {file = "pydantic_core-2.27.2-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:7d14bd329640e63852364c306f4d23eb744e0f8193148d4044dd3dacdaacbd8b"},
- {file = "pydantic_core-2.27.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:82f91663004eb8ed30ff478d77c4d1179b3563df6cdb15c0817cd1cdaf34d154"},
- {file = "pydantic_core-2.27.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:71b24c7d61131bb83df10cc7e687433609963a944ccf45190cfc21e0887b08c9"},
- {file = "pydantic_core-2.27.2-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:fa8e459d4954f608fa26116118bb67f56b93b209c39b008277ace29937453dc9"},
- {file = "pydantic_core-2.27.2-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ce8918cbebc8da707ba805b7fd0b382816858728ae7fe19a942080c24e5b7cd1"},
- {file = "pydantic_core-2.27.2-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:eda3f5c2a021bbc5d976107bb302e0131351c2ba54343f8a496dc8783d3d3a6a"},
- {file = "pydantic_core-2.27.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bd8086fa684c4775c27f03f062cbb9eaa6e17f064307e86b21b9e0abc9c0f02e"},
- {file = "pydantic_core-2.27.2-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:8d9b3388db186ba0c099a6d20f0604a44eabdeef1777ddd94786cdae158729e4"},
- {file = "pydantic_core-2.27.2-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:7a66efda2387de898c8f38c0cf7f14fca0b51a8ef0b24bfea5849f1b3c95af27"},
- {file = "pydantic_core-2.27.2-cp313-cp313-musllinux_1_1_armv7l.whl", hash = "sha256:18a101c168e4e092ab40dbc2503bdc0f62010e95d292b27827871dc85450d7ee"},
- {file = "pydantic_core-2.27.2-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:ba5dd002f88b78a4215ed2f8ddbdf85e8513382820ba15ad5ad8955ce0ca19a1"},
- {file = "pydantic_core-2.27.2-cp313-cp313-win32.whl", hash = "sha256:1ebaf1d0481914d004a573394f4be3a7616334be70261007e47c2a6fe7e50130"},
- {file = "pydantic_core-2.27.2-cp313-cp313-win_amd64.whl", hash = "sha256:953101387ecf2f5652883208769a79e48db18c6df442568a0b5ccd8c2723abee"},
- {file = "pydantic_core-2.27.2-cp313-cp313-win_arm64.whl", hash = "sha256:ac4dbfd1691affb8f48c2c13241a2e3b60ff23247cbcf981759c768b6633cf8b"},
- {file = "pydantic_core-2.27.2-cp38-cp38-macosx_10_12_x86_64.whl", hash = "sha256:d3e8d504bdd3f10835468f29008d72fc8359d95c9c415ce6e767203db6127506"},
- {file = "pydantic_core-2.27.2-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:521eb9b7f036c9b6187f0b47318ab0d7ca14bd87f776240b90b21c1f4f149320"},
- {file = "pydantic_core-2.27.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:85210c4d99a0114f5a9481b44560d7d1e35e32cc5634c656bc48e590b669b145"},
- {file = "pydantic_core-2.27.2-cp38-cp38-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:d716e2e30c6f140d7560ef1538953a5cd1a87264c737643d481f2779fc247fe1"},
- {file = "pydantic_core-2.27.2-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f66d89ba397d92f840f8654756196d93804278457b5fbede59598a1f9f90b228"},
- {file = "pydantic_core-2.27.2-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:669e193c1c576a58f132e3158f9dfa9662969edb1a250c54d8fa52590045f046"},
- {file = "pydantic_core-2.27.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9fdbe7629b996647b99c01b37f11170a57ae675375b14b8c13b8518b8320ced5"},
- {file = "pydantic_core-2.27.2-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:d262606bf386a5ba0b0af3b97f37c83d7011439e3dc1a9298f21efb292e42f1a"},
- {file = "pydantic_core-2.27.2-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:cabb9bcb7e0d97f74df8646f34fc76fbf793b7f6dc2438517d7a9e50eee4f14d"},
- {file = "pydantic_core-2.27.2-cp38-cp38-musllinux_1_1_armv7l.whl", hash = "sha256:d2d63f1215638d28221f664596b1ccb3944f6e25dd18cd3b86b0a4c408d5ebb9"},
- {file = "pydantic_core-2.27.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:bca101c00bff0adb45a833f8451b9105d9df18accb8743b08107d7ada14bd7da"},
- {file = "pydantic_core-2.27.2-cp38-cp38-win32.whl", hash = "sha256:f6f8e111843bbb0dee4cb6594cdc73e79b3329b526037ec242a3e49012495b3b"},
- {file = "pydantic_core-2.27.2-cp38-cp38-win_amd64.whl", hash = "sha256:fd1aea04935a508f62e0d0ef1f5ae968774a32afc306fb8545e06f5ff5cdf3ad"},
- {file = "pydantic_core-2.27.2-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:c10eb4f1659290b523af58fa7cffb452a61ad6ae5613404519aee4bfbf1df993"},
- {file = "pydantic_core-2.27.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:ef592d4bad47296fb11f96cd7dc898b92e795032b4894dfb4076cfccd43a9308"},
- {file = "pydantic_core-2.27.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c61709a844acc6bf0b7dce7daae75195a10aac96a596ea1b776996414791ede4"},
- {file = "pydantic_core-2.27.2-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:42c5f762659e47fdb7b16956c71598292f60a03aa92f8b6351504359dbdba6cf"},
- {file = "pydantic_core-2.27.2-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4c9775e339e42e79ec99c441d9730fccf07414af63eac2f0e48e08fd38a64d76"},
- {file = "pydantic_core-2.27.2-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:57762139821c31847cfb2df63c12f725788bd9f04bc2fb392790959b8f70f118"},
- {file = "pydantic_core-2.27.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0d1e85068e818c73e048fe28cfc769040bb1f475524f4745a5dc621f75ac7630"},
- {file = "pydantic_core-2.27.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:097830ed52fd9e427942ff3b9bc17fab52913b2f50f2880dc4a5611446606a54"},
- {file = "pydantic_core-2.27.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:044a50963a614ecfae59bb1eaf7ea7efc4bc62f49ed594e18fa1e5d953c40e9f"},
- {file = "pydantic_core-2.27.2-cp39-cp39-musllinux_1_1_armv7l.whl", hash = "sha256:4e0b4220ba5b40d727c7f879eac379b822eee5d8fff418e9d3381ee45b3b0362"},
- {file = "pydantic_core-2.27.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:5e4f4bb20d75e9325cc9696c6802657b58bc1dbbe3022f32cc2b2b632c3fbb96"},
- {file = "pydantic_core-2.27.2-cp39-cp39-win32.whl", hash = "sha256:cca63613e90d001b9f2f9a9ceb276c308bfa2a43fafb75c8031c4f66039e8c6e"},
- {file = "pydantic_core-2.27.2-cp39-cp39-win_amd64.whl", hash = "sha256:77d1bca19b0f7021b3a982e6f903dcd5b2b06076def36a652e3907f596e29f67"},
- {file = "pydantic_core-2.27.2-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:2bf14caea37e91198329b828eae1618c068dfb8ef17bb33287a7ad4b61ac314e"},
- {file = "pydantic_core-2.27.2-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:b0cb791f5b45307caae8810c2023a184c74605ec3bcbb67d13846c28ff731ff8"},
- {file = "pydantic_core-2.27.2-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:688d3fd9fcb71f41c4c015c023d12a79d1c4c0732ec9eb35d96e3388a120dcf3"},
- {file = "pydantic_core-2.27.2-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3d591580c34f4d731592f0e9fe40f9cc1b430d297eecc70b962e93c5c668f15f"},
- {file = "pydantic_core-2.27.2-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:82f986faf4e644ffc189a7f1aafc86e46ef70372bb153e7001e8afccc6e54133"},
- {file = "pydantic_core-2.27.2-pp310-pypy310_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:bec317a27290e2537f922639cafd54990551725fc844249e64c523301d0822fc"},
- {file = "pydantic_core-2.27.2-pp310-pypy310_pp73-musllinux_1_1_armv7l.whl", hash = "sha256:0296abcb83a797db256b773f45773da397da75a08f5fcaef41f2044adec05f50"},
- {file = "pydantic_core-2.27.2-pp310-pypy310_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:0d75070718e369e452075a6017fbf187f788e17ed67a3abd47fa934d001863d9"},
- {file = "pydantic_core-2.27.2-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:7e17b560be3c98a8e3aa66ce828bdebb9e9ac6ad5466fba92eb74c4c95cb1151"},
- {file = "pydantic_core-2.27.2-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:c33939a82924da9ed65dab5a65d427205a73181d8098e79b6b426bdf8ad4e656"},
- {file = "pydantic_core-2.27.2-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:00bad2484fa6bda1e216e7345a798bd37c68fb2d97558edd584942aa41b7d278"},
- {file = "pydantic_core-2.27.2-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c817e2b40aba42bac6f457498dacabc568c3b7a986fc9ba7c8d9d260b71485fb"},
- {file = "pydantic_core-2.27.2-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:251136cdad0cb722e93732cb45ca5299fb56e1344a833640bf93b2803f8d1bfd"},
- {file = "pydantic_core-2.27.2-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:d2088237af596f0a524d3afc39ab3b036e8adb054ee57cbb1dcf8e09da5b29cc"},
- {file = "pydantic_core-2.27.2-pp39-pypy39_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:d4041c0b966a84b4ae7a09832eb691a35aec90910cd2dbe7a208de59be77965b"},
- {file = "pydantic_core-2.27.2-pp39-pypy39_pp73-musllinux_1_1_armv7l.whl", hash = "sha256:8083d4e875ebe0b864ffef72a4304827015cff328a1be6e22cc850753bfb122b"},
- {file = "pydantic_core-2.27.2-pp39-pypy39_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:f141ee28a0ad2123b6611b6ceff018039df17f32ada8b534e6aa039545a3efb2"},
- {file = "pydantic_core-2.27.2-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:7d0c8399fcc1848491f00e0314bd59fb34a9c008761bcb422a057670c3f65e35"},
- {file = "pydantic_core-2.27.2.tar.gz", hash = "sha256:eb026e5a4c1fee05726072337ff51d1efb6f59090b7da90d30ea58625b1ffb39"},
-]
-
-[package.dependencies]
-typing-extensions = ">=4.6.0,<4.7.0 || >4.7.0"
-
-[[package]]
-name = "pydantic-settings"
-version = "2.7.1"
-description = "Settings management using Pydantic"
-optional = false
-python-versions = ">=3.8"
-files = [
- {file = "pydantic_settings-2.7.1-py3-none-any.whl", hash = "sha256:590be9e6e24d06db33a4262829edef682500ef008565a969c73d39d5f8bfb3fd"},
- {file = "pydantic_settings-2.7.1.tar.gz", hash = "sha256:10c9caad35e64bfb3c2fbf70a078c0e25cc92499782e5200747f942a065dec93"},
-]
-
-[package.dependencies]
-pydantic = ">=2.7.0"
-python-dotenv = ">=0.21.0"
-
-[package.extras]
-azure-key-vault = ["azure-identity (>=1.16.0)", "azure-keyvault-secrets (>=4.8.0)"]
-toml = ["tomli (>=2.0.1)"]
-yaml = ["pyyaml (>=6.0.1)"]
-
-[[package]]
-name = "pytest"
-version = "8.3.4"
-description = "pytest: simple powerful testing with Python"
-optional = false
-python-versions = ">=3.8"
-files = [
- {file = "pytest-8.3.4-py3-none-any.whl", hash = "sha256:50e16d954148559c9a74109af1eaf0c945ba2d8f30f0a3d3335edde19788b6f6"},
- {file = "pytest-8.3.4.tar.gz", hash = "sha256:965370d062bce11e73868e0335abac31b4d3de0e82f4007408d242b4f8610761"},
-]
-
-[package.dependencies]
-colorama = {version = "*", markers = "sys_platform == \"win32\""}
-iniconfig = "*"
-packaging = "*"
-pluggy = ">=1.5,<2"
-
-[package.extras]
-dev = ["argcomplete", "attrs (>=19.2)", "hypothesis (>=3.56)", "mock", "pygments (>=2.7.2)", "requests", "setuptools", "xmlschema"]
-
-[[package]]
-name = "python-dateutil"
-version = "2.9.0.post0"
-description = "Extensions to the standard Python datetime module"
-optional = false
-python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,>=2.7"
-files = [
- {file = "python-dateutil-2.9.0.post0.tar.gz", hash = "sha256:37dd54208da7e1cd875388217d5e00ebd4179249f90fb72437e91a35459a0ad3"},
- {file = "python_dateutil-2.9.0.post0-py2.py3-none-any.whl", hash = "sha256:a8b2bc7bffae282281c8140a97d3aa9c14da0b136dfe83f850eea9a5f7470427"},
-]
-
-[package.dependencies]
-six = ">=1.5"
-
-[[package]]
-name = "python-dotenv"
-version = "1.0.1"
-description = "Read key-value pairs from a .env file and set them as environment variables"
-optional = false
-python-versions = ">=3.8"
-files = [
- {file = "python-dotenv-1.0.1.tar.gz", hash = "sha256:e324ee90a023d808f1959c46bcbc04446a10ced277783dc6ee09987c37ec10ca"},
- {file = "python_dotenv-1.0.1-py3-none-any.whl", hash = "sha256:f7b63ef50f1b690dddf550d03497b66d609393b40b564ed0d674909a68ebf16a"},
-]
-
-[package.extras]
-cli = ["click (>=5.0)"]
-
-[[package]]
-name = "python-levenshtein"
-version = "0.26.1"
-description = "Python extension for computing string edit distances and similarities."
-optional = false
-python-versions = ">=3.9"
-files = [
- {file = "python_Levenshtein-0.26.1-py3-none-any.whl", hash = "sha256:8ef5e529dd640fb00f05ee62d998d2ee862f19566b641ace775d5ae16167b2ef"},
- {file = "python_levenshtein-0.26.1.tar.gz", hash = "sha256:24ba578e28058ebb4afa2700057e1678d7adf27e43cd1f17700c09a9009d5d3a"},
-]
-
-[package.dependencies]
-Levenshtein = "0.26.1"
-
-[[package]]
-name = "pytz"
-version = "2025.1"
-description = "World timezone definitions, modern and historical"
-optional = false
-python-versions = "*"
-files = [
- {file = "pytz-2025.1-py2.py3-none-any.whl", hash = "sha256:89dd22dca55b46eac6eda23b2d72721bf1bdfef212645d81513ef5d03038de57"},
- {file = "pytz-2025.1.tar.gz", hash = "sha256:c2db42be2a2518b28e65f9207c4d05e6ff547d1efa4086469ef855e4ab70178e"},
-]
-
-[[package]]
-name = "rapidfuzz"
-version = "3.12.1"
-description = "rapid fuzzy string matching"
-optional = false
-python-versions = ">=3.9"
-files = [
- {file = "rapidfuzz-3.12.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:dbb7ea2fd786e6d66f225ef6eef1728832314f47e82fee877cb2a793ebda9579"},
- {file = "rapidfuzz-3.12.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:1ae41361de05762c1eaa3955e5355de7c4c6f30d1ef1ea23d29bf738a35809ab"},
- {file = "rapidfuzz-3.12.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dc3c39e0317e7f68ba01bac056e210dd13c7a0abf823e7b6a5fe7e451ddfc496"},
- {file = "rapidfuzz-3.12.1-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:69f2520296f1ae1165b724a3aad28c56fd0ac7dd2e4cff101a5d986e840f02d4"},
- {file = "rapidfuzz-3.12.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:34dcbf5a7daecebc242f72e2500665f0bde9dd11b779246c6d64d106a7d57c99"},
- {file = "rapidfuzz-3.12.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:773ab37fccf6e0513891f8eb4393961ddd1053c6eb7e62eaa876e94668fc6d31"},
- {file = "rapidfuzz-3.12.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3ecf0e6de84c0bc2c0f48bc03ba23cef2c5f1245db7b26bc860c11c6fd7a097c"},
- {file = "rapidfuzz-3.12.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:4dc2ebad4adb29d84a661f6a42494df48ad2b72993ff43fad2b9794804f91e45"},
- {file = "rapidfuzz-3.12.1-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:8389d98b9f54cb4f8a95f1fa34bf0ceee639e919807bb931ca479c7a5f2930bf"},
- {file = "rapidfuzz-3.12.1-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:165bcdecbfed9978962da1d3ec9c191b2ff9f1ccc2668fbaf0613a975b9aa326"},
- {file = "rapidfuzz-3.12.1-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:129d536740ab0048c1a06ccff73c683f282a2347c68069affae8dbc423a37c50"},
- {file = "rapidfuzz-3.12.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:1b67e390261ffe98ec86c771b89425a78b60ccb610c3b5874660216fcdbded4b"},
- {file = "rapidfuzz-3.12.1-cp310-cp310-win32.whl", hash = "sha256:a66520180d3426b9dc2f8d312f38e19bc1fc5601f374bae5c916f53fa3534a7d"},
- {file = "rapidfuzz-3.12.1-cp310-cp310-win_amd64.whl", hash = "sha256:82260b20bc7a76556cecb0c063c87dad19246a570425d38f8107b8404ca3ac97"},
- {file = "rapidfuzz-3.12.1-cp310-cp310-win_arm64.whl", hash = "sha256:3a860d103bbb25c69c2e995fdf4fac8cb9f77fb69ec0a00469d7fd87ff148f46"},
- {file = "rapidfuzz-3.12.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:6d9afad7b16d01c9e8929b6a205a18163c7e61b6cd9bcf9c81be77d5afc1067a"},
- {file = "rapidfuzz-3.12.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:bb424ae7240f2d2f7d8dda66a61ebf603f74d92f109452c63b0dbf400204a437"},
- {file = "rapidfuzz-3.12.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:42149e6d13bd6d06437d2a954dae2184dadbbdec0fdb82dafe92860d99f80519"},
- {file = "rapidfuzz-3.12.1-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:760ac95d788f2964b73da01e0bdffbe1bf2ad8273d0437565ce9092ae6ad1fbc"},
- {file = "rapidfuzz-3.12.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2cf27e8e4bf7bf9d92ef04f3d2b769e91c3f30ba99208c29f5b41e77271a2614"},
- {file = "rapidfuzz-3.12.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:00ceb8ff3c44ab0d6014106c71709c85dee9feedd6890eff77c814aa3798952b"},
- {file = "rapidfuzz-3.12.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b8b61c558574fbc093d85940c3264c08c2b857b8916f8e8f222e7b86b0bb7d12"},
- {file = "rapidfuzz-3.12.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:346a2d8f17224e99f9ef988606c83d809d5917d17ad00207237e0965e54f9730"},
- {file = "rapidfuzz-3.12.1-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:d60d1db1b7e470e71ae096b6456e20ec56b52bde6198e2dbbc5e6769fa6797dc"},
- {file = "rapidfuzz-3.12.1-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:2477da227e266f9c712f11393182c69a99d3c8007ea27f68c5afc3faf401cc43"},
- {file = "rapidfuzz-3.12.1-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:8499c7d963ddea8adb6cffac2861ee39a1053e22ca8a5ee9de1197f8dc0275a5"},
- {file = "rapidfuzz-3.12.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:12802e5c4d8ae104fb6efeeb436098325ce0dca33b461c46e8df015c84fbef26"},
- {file = "rapidfuzz-3.12.1-cp311-cp311-win32.whl", hash = "sha256:e1061311d07e7cdcffa92c9b50c2ab4192907e70ca01b2e8e1c0b6b4495faa37"},
- {file = "rapidfuzz-3.12.1-cp311-cp311-win_amd64.whl", hash = "sha256:c6e4ed63e204daa863a802eec09feea5448617981ba5d150f843ad8e3ae071a4"},
- {file = "rapidfuzz-3.12.1-cp311-cp311-win_arm64.whl", hash = "sha256:920733a28c3af47870835d59ca9879579f66238f10de91d2b4b3f809d1ebfc5b"},
- {file = "rapidfuzz-3.12.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:f6235b57ae3faa3f85cb3f90c9fee49b21bd671b76e90fc99e8ca2bdf0b5e4a3"},
- {file = "rapidfuzz-3.12.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:af4585e5812632c357fee5ab781c29f00cd06bea58f8882ff244cc4906ba6c9e"},
- {file = "rapidfuzz-3.12.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5942dc4460e5030c5f9e1d4c9383de2f3564a2503fe25e13e89021bcbfea2f44"},
- {file = "rapidfuzz-3.12.1-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0b31ab59e1a0df5afc21f3109b6cfd77b34040dbf54f1bad3989f885cfae1e60"},
- {file = "rapidfuzz-3.12.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:97c885a7a480b21164f57a706418c9bbc9a496ec6da087e554424358cadde445"},
- {file = "rapidfuzz-3.12.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2d844c0587d969ce36fbf4b7cbf0860380ffeafc9ac5e17a7cbe8abf528d07bb"},
- {file = "rapidfuzz-3.12.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a93c95dce8917bf428064c64024de43ffd34ec5949dd4425780c72bd41f9d969"},
- {file = "rapidfuzz-3.12.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:834f6113d538af358f39296604a1953e55f8eeffc20cb4caf82250edbb8bf679"},
- {file = "rapidfuzz-3.12.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:a940aa71a7f37d7f0daac186066bf6668d4d3b7e7ef464cb50bc7ba89eae1f51"},
- {file = "rapidfuzz-3.12.1-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:ec9eaf73501c9a7de2c6938cb3050392e2ee0c5ca3921482acf01476b85a7226"},
- {file = "rapidfuzz-3.12.1-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:3c5ec360694ac14bfaeb6aea95737cf1a6cf805b5fe8ea7fd28814706c7fa838"},
- {file = "rapidfuzz-3.12.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:6b5e176524653ac46f1802bdd273a4b44a5f8d0054ed5013a8e8a4b72f254599"},
- {file = "rapidfuzz-3.12.1-cp312-cp312-win32.whl", hash = "sha256:6f463c6f1c42ec90e45d12a6379e18eddd5cdf74138804d8215619b6f4d31cea"},
- {file = "rapidfuzz-3.12.1-cp312-cp312-win_amd64.whl", hash = "sha256:b894fa2b30cd6498a29e5c470cb01c6ea898540b7e048a0342775a5000531334"},
- {file = "rapidfuzz-3.12.1-cp312-cp312-win_arm64.whl", hash = "sha256:43bb17056c5d1332f517b888c4e57846c4b5f936ed304917eeb5c9ac85d940d4"},
- {file = "rapidfuzz-3.12.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:97f824c15bc6933a31d6e3cbfa90188ba0e5043cf2b6dd342c2b90ee8b3fd47c"},
- {file = "rapidfuzz-3.12.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:a973b3f5cabf931029a3ae4a0f72e3222e53d412ea85fc37ddc49e1774f00fbf"},
- {file = "rapidfuzz-3.12.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:df7880e012228722dec1be02b9ef3898ed023388b8a24d6fa8213d7581932510"},
- {file = "rapidfuzz-3.12.1-cp313-cp313-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9c78582f50e75e6c2bc38c791ed291cb89cf26a3148c47860c1a04d6e5379c8e"},
- {file = "rapidfuzz-3.12.1-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2d7d9e6a04d8344b0198c96394c28874086888d0a2b2f605f30d1b27b9377b7d"},
- {file = "rapidfuzz-3.12.1-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5620001fd4d6644a2f56880388179cc8f3767670f0670160fcb97c3b46c828af"},
- {file = "rapidfuzz-3.12.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0666ab4c52e500af7ba5cc17389f5d15c0cdad06412c80312088519fdc25686d"},
- {file = "rapidfuzz-3.12.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:27b4d440fa50b50c515a91a01ee17e8ede719dca06eef4c0cccf1a111a4cfad3"},
- {file = "rapidfuzz-3.12.1-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:83dccfd5a754f2a0e8555b23dde31f0f7920601bfa807aa76829391ea81e7c67"},
- {file = "rapidfuzz-3.12.1-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:b572b634740e047c53743ed27a1bb3b4f93cf4abbac258cd7af377b2c4a9ba5b"},
- {file = "rapidfuzz-3.12.1-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:7fa7b81fb52902d5f78dac42b3d6c835a6633b01ddf9b202a3ca8443be4b2d6a"},
- {file = "rapidfuzz-3.12.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:b1d4fbff980cb6baef4ee675963c081f7b5d6580a105d6a4962b20f1f880e1fb"},
- {file = "rapidfuzz-3.12.1-cp313-cp313-win32.whl", hash = "sha256:3fe8da12ea77271097b303fa7624cfaf5afd90261002314e3b0047d36f4afd8d"},
- {file = "rapidfuzz-3.12.1-cp313-cp313-win_amd64.whl", hash = "sha256:6f7e92fc7d2a7f02e1e01fe4f539324dfab80f27cb70a30dd63a95445566946b"},
- {file = "rapidfuzz-3.12.1-cp313-cp313-win_arm64.whl", hash = "sha256:e31be53d7f4905a6a038296d8b773a79da9ee9f0cd19af9490c5c5a22e37d2e5"},
- {file = "rapidfuzz-3.12.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:bef5c91d5db776523530073cda5b2a276283258d2f86764be4a008c83caf7acd"},
- {file = "rapidfuzz-3.12.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:841e0c2a5fbe8fc8b9b1a56e924c871899932c0ece7fbd970aa1c32bfd12d4bf"},
- {file = "rapidfuzz-3.12.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:046fc67f3885d94693a2151dd913aaf08b10931639cbb953dfeef3151cb1027c"},
- {file = "rapidfuzz-3.12.1-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b4d2d39b2e76c17f92edd6d384dc21fa020871c73251cdfa017149358937a41d"},
- {file = "rapidfuzz-3.12.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c5857dda85165b986c26a474b22907db6b93932c99397c818bcdec96340a76d5"},
- {file = "rapidfuzz-3.12.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4c26cd1b9969ea70dbf0dbda3d2b54ab4b2e683d0fd0f17282169a19563efeb1"},
- {file = "rapidfuzz-3.12.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bf56ea4edd69005786e6c80a9049d95003aeb5798803e7a2906194e7a3cb6472"},
- {file = "rapidfuzz-3.12.1-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:fbe7580b5fb2db8ebd53819171ff671124237a55ada3f64d20fc9a149d133960"},
- {file = "rapidfuzz-3.12.1-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:018506a53c3b20dcbda8c93d4484b9eb1764c93d5ea16be103cf6b0d8b11d860"},
- {file = "rapidfuzz-3.12.1-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:325c9c71b737fcd32e2a4e634c430c07dd3d374cfe134eded3fe46e4c6f9bf5d"},
- {file = "rapidfuzz-3.12.1-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:930756639643e3aa02d3136b6fec74e5b9370a24f8796e1065cd8a857a6a6c50"},
- {file = "rapidfuzz-3.12.1-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:0acbd27543b158cb915fde03877383816a9e83257832818f1e803bac9b394900"},
- {file = "rapidfuzz-3.12.1-cp39-cp39-win32.whl", hash = "sha256:80ff9283c54d7d29b2d954181e137deee89bec62f4a54675d8b6dbb6b15d3e03"},
- {file = "rapidfuzz-3.12.1-cp39-cp39-win_amd64.whl", hash = "sha256:fd37e53f0ed239d0cec27b250cec958982a8ba252ce64aa5e6052de3a82fa8db"},
- {file = "rapidfuzz-3.12.1-cp39-cp39-win_arm64.whl", hash = "sha256:4a4422e4f73a579755ab60abccb3ff148b5c224b3c7454a13ca217dfbad54da6"},
- {file = "rapidfuzz-3.12.1-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:b7cba636c32a6fc3a402d1cb2c70c6c9f8e6319380aaf15559db09d868a23e56"},
- {file = "rapidfuzz-3.12.1-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:b79286738a43e8df8420c4b30a92712dec6247430b130f8e015c3a78b6d61ac2"},
- {file = "rapidfuzz-3.12.1-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8dc1937198e7ff67e217e60bfa339f05da268d91bb15fec710452d11fe2fdf60"},
- {file = "rapidfuzz-3.12.1-pp310-pypy310_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b85817a57cf8db32dd5d2d66ccfba656d299b09eaf86234295f89f91be1a0db2"},
- {file = "rapidfuzz-3.12.1-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:04283c6f3e79f13a784f844cd5b1df4f518ad0f70c789aea733d106c26e1b4fb"},
- {file = "rapidfuzz-3.12.1-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:a718f740553aad5f4daef790191511da9c6eae893ee1fc2677627e4b624ae2db"},
- {file = "rapidfuzz-3.12.1-pp39-pypy39_pp73-macosx_10_15_x86_64.whl", hash = "sha256:cbdf145c7e4ebf2e81c794ed7a582c4acad19e886d5ad6676086369bd6760753"},
- {file = "rapidfuzz-3.12.1-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:0d03ad14a26a477be221fddc002954ae68a9e2402b9d85433f2d0a6af01aa2bb"},
- {file = "rapidfuzz-3.12.1-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f1187aeae9c89e838d2a0a2b954b4052e4897e5f62e5794ef42527bf039d469e"},
- {file = "rapidfuzz-3.12.1-pp39-pypy39_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:bd47dfb1bca9673a48b923b3d988b7668ee8efd0562027f58b0f2b7abf27144c"},
- {file = "rapidfuzz-3.12.1-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:187cdb402e223264eebed2fe671e367e636a499a7a9c82090b8d4b75aa416c2a"},
- {file = "rapidfuzz-3.12.1-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:d6899b41bf6c30282179f77096c1939f1454836440a8ab05b48ebf7026a3b590"},
- {file = "rapidfuzz-3.12.1.tar.gz", hash = "sha256:6a98bbca18b4a37adddf2d8201856441c26e9c981d8895491b5bc857b5f780eb"},
-]
-
-[package.extras]
-all = ["numpy"]
-
-[[package]]
-name = "requests"
-version = "2.32.3"
-description = "Python HTTP for Humans."
-optional = false
-python-versions = ">=3.8"
-files = [
- {file = "requests-2.32.3-py3-none-any.whl", hash = "sha256:70761cfe03c773ceb22aa2f671b4757976145175cdfca038c02654d061d6dcc6"},
- {file = "requests-2.32.3.tar.gz", hash = "sha256:55365417734eb18255590a9ff9eb97e9e1da868d4ccd6402399eaf68af20a760"},
-]
-
-[package.dependencies]
-certifi = ">=2017.4.17"
-charset-normalizer = ">=2,<4"
-idna = ">=2.5,<4"
-urllib3 = ">=1.21.1,<3"
-
-[package.extras]
-socks = ["PySocks (>=1.5.6,!=1.5.7)"]
-use-chardet-on-py3 = ["chardet (>=3.0.2,<6)"]
-
-[[package]]
-name = "requests-toolbelt"
-version = "1.0.0"
-description = "A utility belt for advanced users of python-requests"
-optional = false
-python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*"
-files = [
- {file = "requests-toolbelt-1.0.0.tar.gz", hash = "sha256:7681a0a3d047012b5bdc0ee37d7f8f07ebe76ab08caeccfc3921ce23c88d5bc6"},
- {file = "requests_toolbelt-1.0.0-py2.py3-none-any.whl", hash = "sha256:cccfdd665f0a24fcf4726e690f65639d272bb0637b9b92dfd91a5568ccf6bd06"},
-]
-
-[package.dependencies]
-requests = ">=2.0.1,<3.0.0"
-
-[[package]]
-name = "ruff"
-version = "0.9.5"
-description = "An extremely fast Python linter and code formatter, written in Rust."
-optional = false
-python-versions = ">=3.7"
-files = [
- {file = "ruff-0.9.5-py3-none-linux_armv6l.whl", hash = "sha256:d466d2abc05f39018d53f681fa1c0ffe9570e6d73cde1b65d23bb557c846f442"},
- {file = "ruff-0.9.5-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:38840dbcef63948657fa7605ca363194d2fe8c26ce8f9ae12eee7f098c85ac8a"},
- {file = "ruff-0.9.5-py3-none-macosx_11_0_arm64.whl", hash = "sha256:d56ba06da53536b575fbd2b56517f6f95774ff7be0f62c80b9e67430391eeb36"},
- {file = "ruff-0.9.5-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4f7cb2a01da08244c50b20ccfaeb5972e4228c3c3a1989d3ece2bc4b1f996001"},
- {file = "ruff-0.9.5-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:96d5c76358419bc63a671caac70c18732d4fd0341646ecd01641ddda5c39ca0b"},
- {file = "ruff-0.9.5-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:deb8304636ed394211f3a6d46c0e7d9535b016f53adaa8340139859b2359a070"},
- {file = "ruff-0.9.5-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:df455000bf59e62b3e8c7ba5ed88a4a2bc64896f900f311dc23ff2dc38156440"},
- {file = "ruff-0.9.5-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:de92170dfa50c32a2b8206a647949590e752aca8100a0f6b8cefa02ae29dce80"},
- {file = "ruff-0.9.5-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3d28532d73b1f3f627ba88e1456f50748b37f3a345d2be76e4c653bec6c3e393"},
- {file = "ruff-0.9.5-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2c746d7d1df64f31d90503ece5cc34d7007c06751a7a3bbeee10e5f2463d52d2"},
- {file = "ruff-0.9.5-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:11417521d6f2d121fda376f0d2169fb529976c544d653d1d6044f4c5562516ee"},
- {file = "ruff-0.9.5-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:5b9d71c3879eb32de700f2f6fac3d46566f644a91d3130119a6378f9312a38e1"},
- {file = "ruff-0.9.5-py3-none-musllinux_1_2_i686.whl", hash = "sha256:2e36c61145e70febcb78483903c43444c6b9d40f6d2f800b5552fec6e4a7bb9a"},
- {file = "ruff-0.9.5-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:2f71d09aeba026c922aa7aa19a08d7bd27c867aedb2f74285a2639644c1c12f5"},
- {file = "ruff-0.9.5-py3-none-win32.whl", hash = "sha256:134f958d52aa6fdec3b294b8ebe2320a950d10c041473c4316d2e7d7c2544723"},
- {file = "ruff-0.9.5-py3-none-win_amd64.whl", hash = "sha256:78cc6067f6d80b6745b67498fb84e87d32c6fc34992b52bffefbdae3442967d6"},
- {file = "ruff-0.9.5-py3-none-win_arm64.whl", hash = "sha256:18a29f1a005bddb229e580795627d297dfa99f16b30c7039e73278cf6b5f9fa9"},
- {file = "ruff-0.9.5.tar.gz", hash = "sha256:11aecd7a633932875ab3cb05a484c99970b9d52606ce9ea912b690b02653d56c"},
-]
-
-[[package]]
-name = "six"
-version = "1.17.0"
-description = "Python 2 and 3 compatibility utilities"
-optional = false
-python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,>=2.7"
-files = [
- {file = "six-1.17.0-py2.py3-none-any.whl", hash = "sha256:4721f391ed90541fddacab5acf947aa0d3dc7d27b2e1e8eda2be8970586c3274"},
- {file = "six-1.17.0.tar.gz", hash = "sha256:ff70335d468e7eb6ec65b95b99d3a2836546063f63acc5171de367e834932a81"},
-]
-
-[[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 = "specklepy"
-version = "2.21.2"
-description = "The Python SDK for Speckle 2.0"
-optional = false
-python-versions = "<4.0,>=3.9.0"
-files = [
- {file = "specklepy-2.21.2-py3-none-any.whl", hash = "sha256:bb34bb0de56f8731f88ac9a1ada4cddfbf2d71e52d4e9cce07bab95c1dac2b2d"},
- {file = "specklepy-2.21.2.tar.gz", hash = "sha256:ba44bb9167ced32e52ba7e5717d0b1d0ece1aa23ca02243ce75f0eaba08e8107"},
-]
-
-[package.dependencies]
-appdirs = ">=1.4.4,<2.0.0"
-attrs = ">=23.1.0,<24.0.0"
-Deprecated = ">=1.2.13,<2.0.0"
-gql = {version = ">=3.3.0,<4.0.0", extras = ["requests", "websockets"]}
-httpx = ">=0.25.0,<0.26.0"
-pydantic = ">=2.5,<3.0"
-stringcase = ">=1.2.0,<2.0.0"
-ujson = ">=5.3.0,<6.0.0"
-
-[[package]]
-name = "stringcase"
-version = "1.2.0"
-description = "String case converter."
-optional = false
-python-versions = "*"
-files = [
- {file = "stringcase-1.2.0.tar.gz", hash = "sha256:48a06980661908efe8d9d34eab2b6c13aefa2163b3ced26972902e3bdfd87008"},
-]
-
-[[package]]
-name = "typing-extensions"
-version = "4.12.2"
-description = "Backported and Experimental Type Hints for Python 3.8+"
-optional = false
-python-versions = ">=3.8"
-files = [
- {file = "typing_extensions-4.12.2-py3-none-any.whl", hash = "sha256:04e5ca0351e0f3f85c6853954072df659d0d13fac324d0072316b67d7794700d"},
- {file = "typing_extensions-4.12.2.tar.gz", hash = "sha256:1a7ead55c7e559dd4dee8856e3a88b41225abfe1ce8df57b7c13915fe121ffb8"},
-]
-
-[[package]]
-name = "tzdata"
-version = "2025.1"
-description = "Provider of IANA time zone data"
-optional = false
-python-versions = ">=2"
-files = [
- {file = "tzdata-2025.1-py2.py3-none-any.whl", hash = "sha256:7e127113816800496f027041c570f50bcd464a020098a3b6b199517772303639"},
- {file = "tzdata-2025.1.tar.gz", hash = "sha256:24894909e88cdb28bd1636c6887801df64cb485bd593f2fd83ef29075a81d694"},
-]
-
-[[package]]
-name = "ujson"
-version = "5.10.0"
-description = "Ultra fast JSON encoder and decoder for Python"
-optional = false
-python-versions = ">=3.8"
-files = [
- {file = "ujson-5.10.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:2601aa9ecdbee1118a1c2065323bda35e2c5a2cf0797ef4522d485f9d3ef65bd"},
- {file = "ujson-5.10.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:348898dd702fc1c4f1051bc3aacbf894caa0927fe2c53e68679c073375f732cf"},
- {file = "ujson-5.10.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:22cffecf73391e8abd65ef5f4e4dd523162a3399d5e84faa6aebbf9583df86d6"},
- {file = "ujson-5.10.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:26b0e2d2366543c1bb4fbd457446f00b0187a2bddf93148ac2da07a53fe51569"},
- {file = "ujson-5.10.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:caf270c6dba1be7a41125cd1e4fc7ba384bf564650beef0df2dd21a00b7f5770"},
- {file = "ujson-5.10.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:a245d59f2ffe750446292b0094244df163c3dc96b3ce152a2c837a44e7cda9d1"},
- {file = "ujson-5.10.0-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:94a87f6e151c5f483d7d54ceef83b45d3a9cca7a9cb453dbdbb3f5a6f64033f5"},
- {file = "ujson-5.10.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:29b443c4c0a113bcbb792c88bea67b675c7ca3ca80c3474784e08bba01c18d51"},
- {file = "ujson-5.10.0-cp310-cp310-win32.whl", hash = "sha256:c18610b9ccd2874950faf474692deee4223a994251bc0a083c114671b64e6518"},
- {file = "ujson-5.10.0-cp310-cp310-win_amd64.whl", hash = "sha256:924f7318c31874d6bb44d9ee1900167ca32aa9b69389b98ecbde34c1698a250f"},
- {file = "ujson-5.10.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:a5b366812c90e69d0f379a53648be10a5db38f9d4ad212b60af00bd4048d0f00"},
- {file = "ujson-5.10.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:502bf475781e8167f0f9d0e41cd32879d120a524b22358e7f205294224c71126"},
- {file = "ujson-5.10.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5b91b5d0d9d283e085e821651184a647699430705b15bf274c7896f23fe9c9d8"},
- {file = "ujson-5.10.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:129e39af3a6d85b9c26d5577169c21d53821d8cf68e079060602e861c6e5da1b"},
- {file = "ujson-5.10.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f77b74475c462cb8b88680471193064d3e715c7c6074b1c8c412cb526466efe9"},
- {file = "ujson-5.10.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:7ec0ca8c415e81aa4123501fee7f761abf4b7f386aad348501a26940beb1860f"},
- {file = "ujson-5.10.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:ab13a2a9e0b2865a6c6db9271f4b46af1c7476bfd51af1f64585e919b7c07fd4"},
- {file = "ujson-5.10.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:57aaf98b92d72fc70886b5a0e1a1ca52c2320377360341715dd3933a18e827b1"},
- {file = "ujson-5.10.0-cp311-cp311-win32.whl", hash = "sha256:2987713a490ceb27edff77fb184ed09acdc565db700ee852823c3dc3cffe455f"},
- {file = "ujson-5.10.0-cp311-cp311-win_amd64.whl", hash = "sha256:f00ea7e00447918ee0eff2422c4add4c5752b1b60e88fcb3c067d4a21049a720"},
- {file = "ujson-5.10.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:98ba15d8cbc481ce55695beee9f063189dce91a4b08bc1d03e7f0152cd4bbdd5"},
- {file = "ujson-5.10.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:a9d2edbf1556e4f56e50fab7d8ff993dbad7f54bac68eacdd27a8f55f433578e"},
- {file = "ujson-5.10.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6627029ae4f52d0e1a2451768c2c37c0c814ffc04f796eb36244cf16b8e57043"},
- {file = "ujson-5.10.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f8ccb77b3e40b151e20519c6ae6d89bfe3f4c14e8e210d910287f778368bb3d1"},
- {file = "ujson-5.10.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f3caf9cd64abfeb11a3b661329085c5e167abbe15256b3b68cb5d914ba7396f3"},
- {file = "ujson-5.10.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:6e32abdce572e3a8c3d02c886c704a38a1b015a1fb858004e03d20ca7cecbb21"},
- {file = "ujson-5.10.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:a65b6af4d903103ee7b6f4f5b85f1bfd0c90ba4eeac6421aae436c9988aa64a2"},
- {file = "ujson-5.10.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:604a046d966457b6cdcacc5aa2ec5314f0e8c42bae52842c1e6fa02ea4bda42e"},
- {file = "ujson-5.10.0-cp312-cp312-win32.whl", hash = "sha256:6dea1c8b4fc921bf78a8ff00bbd2bfe166345f5536c510671bccececb187c80e"},
- {file = "ujson-5.10.0-cp312-cp312-win_amd64.whl", hash = "sha256:38665e7d8290188b1e0d57d584eb8110951a9591363316dd41cf8686ab1d0abc"},
- {file = "ujson-5.10.0-cp313-cp313-macosx_10_9_x86_64.whl", hash = "sha256:618efd84dc1acbd6bff8eaa736bb6c074bfa8b8a98f55b61c38d4ca2c1f7f287"},
- {file = "ujson-5.10.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:38d5d36b4aedfe81dfe251f76c0467399d575d1395a1755de391e58985ab1c2e"},
- {file = "ujson-5.10.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:67079b1f9fb29ed9a2914acf4ef6c02844b3153913eb735d4bf287ee1db6e557"},
- {file = "ujson-5.10.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d7d0e0ceeb8fe2468c70ec0c37b439dd554e2aa539a8a56365fd761edb418988"},
- {file = "ujson-5.10.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:59e02cd37bc7c44d587a0ba45347cc815fb7a5fe48de16bf05caa5f7d0d2e816"},
- {file = "ujson-5.10.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:2a890b706b64e0065f02577bf6d8ca3b66c11a5e81fb75d757233a38c07a1f20"},
- {file = "ujson-5.10.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:621e34b4632c740ecb491efc7f1fcb4f74b48ddb55e65221995e74e2d00bbff0"},
- {file = "ujson-5.10.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:b9500e61fce0cfc86168b248104e954fead61f9be213087153d272e817ec7b4f"},
- {file = "ujson-5.10.0-cp313-cp313-win32.whl", hash = "sha256:4c4fc16f11ac1612f05b6f5781b384716719547e142cfd67b65d035bd85af165"},
- {file = "ujson-5.10.0-cp313-cp313-win_amd64.whl", hash = "sha256:4573fd1695932d4f619928fd09d5d03d917274381649ade4328091ceca175539"},
- {file = "ujson-5.10.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:a984a3131da7f07563057db1c3020b1350a3e27a8ec46ccbfbf21e5928a43050"},
- {file = "ujson-5.10.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:73814cd1b9db6fc3270e9d8fe3b19f9f89e78ee9d71e8bd6c9a626aeaeaf16bd"},
- {file = "ujson-5.10.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:61e1591ed9376e5eddda202ec229eddc56c612b61ac6ad07f96b91460bb6c2fb"},
- {file = "ujson-5.10.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d2c75269f8205b2690db4572a4a36fe47cd1338e4368bc73a7a0e48789e2e35a"},
- {file = "ujson-5.10.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7223f41e5bf1f919cd8d073e35b229295aa8e0f7b5de07ed1c8fddac63a6bc5d"},
- {file = "ujson-5.10.0-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:d4dc2fd6b3067c0782e7002ac3b38cf48608ee6366ff176bbd02cf969c9c20fe"},
- {file = "ujson-5.10.0-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:232cc85f8ee3c454c115455195a205074a56ff42608fd6b942aa4c378ac14dd7"},
- {file = "ujson-5.10.0-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:cc6139531f13148055d691e442e4bc6601f6dba1e6d521b1585d4788ab0bfad4"},
- {file = "ujson-5.10.0-cp38-cp38-win32.whl", hash = "sha256:e7ce306a42b6b93ca47ac4a3b96683ca554f6d35dd8adc5acfcd55096c8dfcb8"},
- {file = "ujson-5.10.0-cp38-cp38-win_amd64.whl", hash = "sha256:e82d4bb2138ab05e18f089a83b6564fee28048771eb63cdecf4b9b549de8a2cc"},
- {file = "ujson-5.10.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:dfef2814c6b3291c3c5f10065f745a1307d86019dbd7ea50e83504950136ed5b"},
- {file = "ujson-5.10.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:4734ee0745d5928d0ba3a213647f1c4a74a2a28edc6d27b2d6d5bd9fa4319e27"},
- {file = "ujson-5.10.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d47ebb01bd865fdea43da56254a3930a413f0c5590372a1241514abae8aa7c76"},
- {file = "ujson-5.10.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dee5e97c2496874acbf1d3e37b521dd1f307349ed955e62d1d2f05382bc36dd5"},
- {file = "ujson-5.10.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7490655a2272a2d0b072ef16b0b58ee462f4973a8f6bbe64917ce5e0a256f9c0"},
- {file = "ujson-5.10.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:ba17799fcddaddf5c1f75a4ba3fd6441f6a4f1e9173f8a786b42450851bd74f1"},
- {file = "ujson-5.10.0-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:2aff2985cef314f21d0fecc56027505804bc78802c0121343874741650a4d3d1"},
- {file = "ujson-5.10.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:ad88ac75c432674d05b61184178635d44901eb749786c8eb08c102330e6e8996"},
- {file = "ujson-5.10.0-cp39-cp39-win32.whl", hash = "sha256:2544912a71da4ff8c4f7ab5606f947d7299971bdd25a45e008e467ca638d13c9"},
- {file = "ujson-5.10.0-cp39-cp39-win_amd64.whl", hash = "sha256:3ff201d62b1b177a46f113bb43ad300b424b7847f9c5d38b1b4ad8f75d4a282a"},
- {file = "ujson-5.10.0-pp310-pypy310_pp73-macosx_10_9_x86_64.whl", hash = "sha256:5b6fee72fa77dc172a28f21693f64d93166534c263adb3f96c413ccc85ef6e64"},
- {file = "ujson-5.10.0-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:61d0af13a9af01d9f26d2331ce49bb5ac1fb9c814964018ac8df605b5422dcb3"},
- {file = "ujson-5.10.0-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ecb24f0bdd899d368b715c9e6664166cf694d1e57be73f17759573a6986dd95a"},
- {file = "ujson-5.10.0-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fbd8fd427f57a03cff3ad6574b5e299131585d9727c8c366da4624a9069ed746"},
- {file = "ujson-5.10.0-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:beeaf1c48e32f07d8820c705ff8e645f8afa690cca1544adba4ebfa067efdc88"},
- {file = "ujson-5.10.0-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:baed37ea46d756aca2955e99525cc02d9181de67f25515c468856c38d52b5f3b"},
- {file = "ujson-5.10.0-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:7663960f08cd5a2bb152f5ee3992e1af7690a64c0e26d31ba7b3ff5b2ee66337"},
- {file = "ujson-5.10.0-pp38-pypy38_pp73-macosx_11_0_arm64.whl", hash = "sha256:d8640fb4072d36b08e95a3a380ba65779d356b2fee8696afeb7794cf0902d0a1"},
- {file = "ujson-5.10.0-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:78778a3aa7aafb11e7ddca4e29f46bc5139131037ad628cc10936764282d6753"},
- {file = "ujson-5.10.0-pp38-pypy38_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b0111b27f2d5c820e7f2dbad7d48e3338c824e7ac4d2a12da3dc6061cc39c8e6"},
- {file = "ujson-5.10.0-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:c66962ca7565605b355a9ed478292da628b8f18c0f2793021ca4425abf8b01e5"},
- {file = "ujson-5.10.0-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:ba43cc34cce49cf2d4bc76401a754a81202d8aa926d0e2b79f0ee258cb15d3a4"},
- {file = "ujson-5.10.0-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:ac56eb983edce27e7f51d05bc8dd820586c6e6be1c5216a6809b0c668bb312b8"},
- {file = "ujson-5.10.0-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f44bd4b23a0e723bf8b10628288c2c7c335161d6840013d4d5de20e48551773b"},
- {file = "ujson-5.10.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7c10f4654e5326ec14a46bcdeb2b685d4ada6911050aa8baaf3501e57024b804"},
- {file = "ujson-5.10.0-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0de4971a89a762398006e844ae394bd46991f7c385d7a6a3b93ba229e6dac17e"},
- {file = "ujson-5.10.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:e1402f0564a97d2a52310ae10a64d25bcef94f8dd643fcf5d310219d915484f7"},
- {file = "ujson-5.10.0.tar.gz", hash = "sha256:b3cd8f3c5d8c7738257f1018880444f7b7d9b66232c64649f562d7ba86ad4bc1"},
-]
-
-[[package]]
-name = "urllib3"
-version = "2.3.0"
-description = "HTTP library with thread-safe connection pooling, file post, and more."
-optional = false
-python-versions = ">=3.9"
-files = [
- {file = "urllib3-2.3.0-py3-none-any.whl", hash = "sha256:1cee9ad369867bfdbbb48b7dd50374c0967a0bb7710050facf0dd6911440e3df"},
- {file = "urllib3-2.3.0.tar.gz", hash = "sha256:f8c5449b3cf0861679ce7e0503c7b44b5ec981bec0d1d3795a07f1ba96f0204d"},
-]
-
-[package.extras]
-brotli = ["brotli (>=1.0.9)", "brotlicffi (>=0.8.0)"]
-h2 = ["h2 (>=4,<5)"]
-socks = ["pysocks (>=1.5.6,!=1.5.7,<2.0)"]
-zstd = ["zstandard (>=0.18.0)"]
-
-[[package]]
-name = "websockets"
-version = "11.0.3"
-description = "An implementation of the WebSocket Protocol (RFC 6455 & 7692)"
-optional = false
-python-versions = ">=3.7"
-files = [
- {file = "websockets-11.0.3-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:3ccc8a0c387629aec40f2fc9fdcb4b9d5431954f934da3eaf16cdc94f67dbfac"},
- {file = "websockets-11.0.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:d67ac60a307f760c6e65dad586f556dde58e683fab03323221a4e530ead6f74d"},
- {file = "websockets-11.0.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:84d27a4832cc1a0ee07cdcf2b0629a8a72db73f4cf6de6f0904f6661227f256f"},
- {file = "websockets-11.0.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ffd7dcaf744f25f82190856bc26ed81721508fc5cbf2a330751e135ff1283564"},
- {file = "websockets-11.0.3-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7622a89d696fc87af8e8d280d9b421db5133ef5b29d3f7a1ce9f1a7bf7fcfa11"},
- {file = "websockets-11.0.3-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bceab846bac555aff6427d060f2fcfff71042dba6f5fca7dc4f75cac815e57ca"},
- {file = "websockets-11.0.3-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:54c6e5b3d3a8936a4ab6870d46bdd6ec500ad62bde9e44462c32d18f1e9a8e54"},
- {file = "websockets-11.0.3-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:41f696ba95cd92dc047e46b41b26dd24518384749ed0d99bea0a941ca87404c4"},
- {file = "websockets-11.0.3-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:86d2a77fd490ae3ff6fae1c6ceaecad063d3cc2320b44377efdde79880e11526"},
- {file = "websockets-11.0.3-cp310-cp310-win32.whl", hash = "sha256:2d903ad4419f5b472de90cd2d40384573b25da71e33519a67797de17ef849b69"},
- {file = "websockets-11.0.3-cp310-cp310-win_amd64.whl", hash = "sha256:1d2256283fa4b7f4c7d7d3e84dc2ece74d341bce57d5b9bf385df109c2a1a82f"},
- {file = "websockets-11.0.3-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:e848f46a58b9fcf3d06061d17be388caf70ea5b8cc3466251963c8345e13f7eb"},
- {file = "websockets-11.0.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:aa5003845cdd21ac0dc6c9bf661c5beddd01116f6eb9eb3c8e272353d45b3288"},
- {file = "websockets-11.0.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:b58cbf0697721120866820b89f93659abc31c1e876bf20d0b3d03cef14faf84d"},
- {file = "websockets-11.0.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:660e2d9068d2bedc0912af508f30bbeb505bbbf9774d98def45f68278cea20d3"},
- {file = "websockets-11.0.3-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c1f0524f203e3bd35149f12157438f406eff2e4fb30f71221c8a5eceb3617b6b"},
- {file = "websockets-11.0.3-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:def07915168ac8f7853812cc593c71185a16216e9e4fa886358a17ed0fd9fcf6"},
- {file = "websockets-11.0.3-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:b30c6590146e53149f04e85a6e4fcae068df4289e31e4aee1fdf56a0dead8f97"},
- {file = "websockets-11.0.3-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:619d9f06372b3a42bc29d0cd0354c9bb9fb39c2cbc1a9c5025b4538738dbffaf"},
- {file = "websockets-11.0.3-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:01f5567d9cf6f502d655151645d4e8b72b453413d3819d2b6f1185abc23e82dd"},
- {file = "websockets-11.0.3-cp311-cp311-win32.whl", hash = "sha256:e1459677e5d12be8bbc7584c35b992eea142911a6236a3278b9b5ce3326f282c"},
- {file = "websockets-11.0.3-cp311-cp311-win_amd64.whl", hash = "sha256:e7837cb169eca3b3ae94cc5787c4fed99eef74c0ab9506756eea335e0d6f3ed8"},
- {file = "websockets-11.0.3-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:9f59a3c656fef341a99e3d63189852be7084c0e54b75734cde571182c087b152"},
- {file = "websockets-11.0.3-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2529338a6ff0eb0b50c7be33dc3d0e456381157a31eefc561771ee431134a97f"},
- {file = "websockets-11.0.3-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:34fd59a4ac42dff6d4681d8843217137f6bc85ed29722f2f7222bd619d15e95b"},
- {file = "websockets-11.0.3-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:332d126167ddddec94597c2365537baf9ff62dfcc9db4266f263d455f2f031cb"},
- {file = "websockets-11.0.3-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:6505c1b31274723ccaf5f515c1824a4ad2f0d191cec942666b3d0f3aa4cb4007"},
- {file = "websockets-11.0.3-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:f467ba0050b7de85016b43f5a22b46383ef004c4f672148a8abf32bc999a87f0"},
- {file = "websockets-11.0.3-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:9d9acd80072abcc98bd2c86c3c9cd4ac2347b5a5a0cae7ed5c0ee5675f86d9af"},
- {file = "websockets-11.0.3-cp37-cp37m-win32.whl", hash = "sha256:e590228200fcfc7e9109509e4d9125eace2042fd52b595dd22bbc34bb282307f"},
- {file = "websockets-11.0.3-cp37-cp37m-win_amd64.whl", hash = "sha256:b16fff62b45eccb9c7abb18e60e7e446998093cdcb50fed33134b9b6878836de"},
- {file = "websockets-11.0.3-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:fb06eea71a00a7af0ae6aefbb932fb8a7df3cb390cc217d51a9ad7343de1b8d0"},
- {file = "websockets-11.0.3-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:8a34e13a62a59c871064dfd8ffb150867e54291e46d4a7cf11d02c94a5275bae"},
- {file = "websockets-11.0.3-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:4841ed00f1026dfbced6fca7d963c4e7043aa832648671b5138008dc5a8f6d99"},
- {file = "websockets-11.0.3-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1a073fc9ab1c8aff37c99f11f1641e16da517770e31a37265d2755282a5d28aa"},
- {file = "websockets-11.0.3-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:68b977f21ce443d6d378dbd5ca38621755f2063d6fdb3335bda981d552cfff86"},
- {file = "websockets-11.0.3-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e1a99a7a71631f0efe727c10edfba09ea6bee4166a6f9c19aafb6c0b5917d09c"},
- {file = "websockets-11.0.3-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:bee9fcb41db2a23bed96c6b6ead6489702c12334ea20a297aa095ce6d31370d0"},
- {file = "websockets-11.0.3-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:4b253869ea05a5a073ebfdcb5cb3b0266a57c3764cf6fe114e4cd90f4bfa5f5e"},
- {file = "websockets-11.0.3-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:1553cb82942b2a74dd9b15a018dce645d4e68674de2ca31ff13ebc2d9f283788"},
- {file = "websockets-11.0.3-cp38-cp38-win32.whl", hash = "sha256:f61bdb1df43dc9c131791fbc2355535f9024b9a04398d3bd0684fc16ab07df74"},
- {file = "websockets-11.0.3-cp38-cp38-win_amd64.whl", hash = "sha256:03aae4edc0b1c68498f41a6772d80ac7c1e33c06c6ffa2ac1c27a07653e79d6f"},
- {file = "websockets-11.0.3-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:777354ee16f02f643a4c7f2b3eff8027a33c9861edc691a2003531f5da4f6bc8"},
- {file = "websockets-11.0.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:8c82f11964f010053e13daafdc7154ce7385ecc538989a354ccc7067fd7028fd"},
- {file = "websockets-11.0.3-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:3580dd9c1ad0701169e4d6fc41e878ffe05e6bdcaf3c412f9d559389d0c9e016"},
- {file = "websockets-11.0.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6f1a3f10f836fab6ca6efa97bb952300b20ae56b409414ca85bff2ad241d2a61"},
- {file = "websockets-11.0.3-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:df41b9bc27c2c25b486bae7cf42fccdc52ff181c8c387bfd026624a491c2671b"},
- {file = "websockets-11.0.3-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:279e5de4671e79a9ac877427f4ac4ce93751b8823f276b681d04b2156713b9dd"},
- {file = "websockets-11.0.3-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:1fdf26fa8a6a592f8f9235285b8affa72748dc12e964a5518c6c5e8f916716f7"},
- {file = "websockets-11.0.3-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:69269f3a0b472e91125b503d3c0b3566bda26da0a3261c49f0027eb6075086d1"},
- {file = "websockets-11.0.3-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:97b52894d948d2f6ea480171a27122d77af14ced35f62e5c892ca2fae9344311"},
- {file = "websockets-11.0.3-cp39-cp39-win32.whl", hash = "sha256:c7f3cb904cce8e1be667c7e6fef4516b98d1a6a0635a58a57528d577ac18a128"},
- {file = "websockets-11.0.3-cp39-cp39-win_amd64.whl", hash = "sha256:c792ea4eabc0159535608fc5658a74d1a81020eb35195dd63214dcf07556f67e"},
- {file = "websockets-11.0.3-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:f2e58f2c36cc52d41f2659e4c0cbf7353e28c8c9e63e30d8c6d3494dc9fdedcf"},
- {file = "websockets-11.0.3-pp37-pypy37_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:de36fe9c02995c7e6ae6efe2e205816f5f00c22fd1fbf343d4d18c3d5ceac2f5"},
- {file = "websockets-11.0.3-pp37-pypy37_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0ac56b661e60edd453585f4bd68eb6a29ae25b5184fd5ba51e97652580458998"},
- {file = "websockets-11.0.3-pp37-pypy37_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e052b8467dd07d4943936009f46ae5ce7b908ddcac3fda581656b1b19c083d9b"},
- {file = "websockets-11.0.3-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:42cc5452a54a8e46a032521d7365da775823e21bfba2895fb7b77633cce031bb"},
- {file = "websockets-11.0.3-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:e6316827e3e79b7b8e7d8e3b08f4e331af91a48e794d5d8b099928b6f0b85f20"},
- {file = "websockets-11.0.3-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8531fdcad636d82c517b26a448dcfe62f720e1922b33c81ce695d0edb91eb931"},
- {file = "websockets-11.0.3-pp38-pypy38_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c114e8da9b475739dde229fd3bc6b05a6537a88a578358bc8eb29b4030fac9c9"},
- {file = "websockets-11.0.3-pp38-pypy38_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e063b1865974611313a3849d43f2c3f5368093691349cf3c7c8f8f75ad7cb280"},
- {file = "websockets-11.0.3-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:92b2065d642bf8c0a82d59e59053dd2fdde64d4ed44efe4870fa816c1232647b"},
- {file = "websockets-11.0.3-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:0ee68fe502f9031f19d495dae2c268830df2760c0524cbac5d759921ba8c8e82"},
- {file = "websockets-11.0.3-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dcacf2c7a6c3a84e720d1bb2b543c675bf6c40e460300b628bab1b1efc7c034c"},
- {file = "websockets-11.0.3-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b67c6f5e5a401fc56394f191f00f9b3811fe843ee93f4a70df3c389d1adf857d"},
- {file = "websockets-11.0.3-pp39-pypy39_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1d5023a4b6a5b183dc838808087033ec5df77580485fc533e7dab2567851b0a4"},
- {file = "websockets-11.0.3-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:ed058398f55163a79bb9f06a90ef9ccc063b204bb346c4de78efc5d15abfe602"},
- {file = "websockets-11.0.3-py3-none-any.whl", hash = "sha256:6681ba9e7f8f3b19440921e99efbb40fc89f26cd71bf539e45d8c8a25c976dc6"},
- {file = "websockets-11.0.3.tar.gz", hash = "sha256:88fc51d9a26b10fc331be344f1781224a375b78488fc343620184e95a4b27016"},
-]
-
-[[package]]
-name = "wrapt"
-version = "1.17.2"
-description = "Module for decorators, wrappers and monkey patching."
-optional = false
-python-versions = ">=3.8"
-files = [
- {file = "wrapt-1.17.2-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:3d57c572081fed831ad2d26fd430d565b76aa277ed1d30ff4d40670b1c0dd984"},
- {file = "wrapt-1.17.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:b5e251054542ae57ac7f3fba5d10bfff615b6c2fb09abeb37d2f1463f841ae22"},
- {file = "wrapt-1.17.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:80dd7db6a7cb57ffbc279c4394246414ec99537ae81ffd702443335a61dbf3a7"},
- {file = "wrapt-1.17.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0a6e821770cf99cc586d33833b2ff32faebdbe886bd6322395606cf55153246c"},
- {file = "wrapt-1.17.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b60fb58b90c6d63779cb0c0c54eeb38941bae3ecf7a73c764c52c88c2dcb9d72"},
- {file = "wrapt-1.17.2-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b870b5df5b71d8c3359d21be8f0d6c485fa0ebdb6477dda51a1ea54a9b558061"},
- {file = "wrapt-1.17.2-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:4011d137b9955791f9084749cba9a367c68d50ab8d11d64c50ba1688c9b457f2"},
- {file = "wrapt-1.17.2-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:1473400e5b2733e58b396a04eb7f35f541e1fb976d0c0724d0223dd607e0f74c"},
- {file = "wrapt-1.17.2-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:3cedbfa9c940fdad3e6e941db7138e26ce8aad38ab5fe9dcfadfed9db7a54e62"},
- {file = "wrapt-1.17.2-cp310-cp310-win32.whl", hash = "sha256:582530701bff1dec6779efa00c516496968edd851fba224fbd86e46cc6b73563"},
- {file = "wrapt-1.17.2-cp310-cp310-win_amd64.whl", hash = "sha256:58705da316756681ad3c9c73fd15499aa4d8c69f9fd38dc8a35e06c12468582f"},
- {file = "wrapt-1.17.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:ff04ef6eec3eee8a5efef2401495967a916feaa353643defcc03fc74fe213b58"},
- {file = "wrapt-1.17.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:4db983e7bca53819efdbd64590ee96c9213894272c776966ca6306b73e4affda"},
- {file = "wrapt-1.17.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:9abc77a4ce4c6f2a3168ff34b1da9b0f311a8f1cfd694ec96b0603dff1c79438"},
- {file = "wrapt-1.17.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0b929ac182f5ace000d459c59c2c9c33047e20e935f8e39371fa6e3b85d56f4a"},
- {file = "wrapt-1.17.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f09b286faeff3c750a879d336fb6d8713206fc97af3adc14def0cdd349df6000"},
- {file = "wrapt-1.17.2-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1a7ed2d9d039bd41e889f6fb9364554052ca21ce823580f6a07c4ec245c1f5d6"},
- {file = "wrapt-1.17.2-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:129a150f5c445165ff941fc02ee27df65940fcb8a22a61828b1853c98763a64b"},
- {file = "wrapt-1.17.2-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:1fb5699e4464afe5c7e65fa51d4f99e0b2eadcc176e4aa33600a3df7801d6662"},
- {file = "wrapt-1.17.2-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:9a2bce789a5ea90e51a02dfcc39e31b7f1e662bc3317979aa7e5538e3a034f72"},
- {file = "wrapt-1.17.2-cp311-cp311-win32.whl", hash = "sha256:4afd5814270fdf6380616b321fd31435a462019d834f83c8611a0ce7484c7317"},
- {file = "wrapt-1.17.2-cp311-cp311-win_amd64.whl", hash = "sha256:acc130bc0375999da18e3d19e5a86403667ac0c4042a094fefb7eec8ebac7cf3"},
- {file = "wrapt-1.17.2-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:d5e2439eecc762cd85e7bd37161d4714aa03a33c5ba884e26c81559817ca0925"},
- {file = "wrapt-1.17.2-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:3fc7cb4c1c744f8c05cd5f9438a3caa6ab94ce8344e952d7c45a8ed59dd88392"},
- {file = "wrapt-1.17.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:8fdbdb757d5390f7c675e558fd3186d590973244fab0c5fe63d373ade3e99d40"},
- {file = "wrapt-1.17.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5bb1d0dbf99411f3d871deb6faa9aabb9d4e744d67dcaaa05399af89d847a91d"},
- {file = "wrapt-1.17.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d18a4865f46b8579d44e4fe1e2bcbc6472ad83d98e22a26c963d46e4c125ef0b"},
- {file = "wrapt-1.17.2-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bc570b5f14a79734437cb7b0500376b6b791153314986074486e0b0fa8d71d98"},
- {file = "wrapt-1.17.2-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:6d9187b01bebc3875bac9b087948a2bccefe464a7d8f627cf6e48b1bbae30f82"},
- {file = "wrapt-1.17.2-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:9e8659775f1adf02eb1e6f109751268e493c73716ca5761f8acb695e52a756ae"},
- {file = "wrapt-1.17.2-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:e8b2816ebef96d83657b56306152a93909a83f23994f4b30ad4573b00bd11bb9"},
- {file = "wrapt-1.17.2-cp312-cp312-win32.whl", hash = "sha256:468090021f391fe0056ad3e807e3d9034e0fd01adcd3bdfba977b6fdf4213ea9"},
- {file = "wrapt-1.17.2-cp312-cp312-win_amd64.whl", hash = "sha256:ec89ed91f2fa8e3f52ae53cd3cf640d6feff92ba90d62236a81e4e563ac0e991"},
- {file = "wrapt-1.17.2-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:6ed6ffac43aecfe6d86ec5b74b06a5be33d5bb9243d055141e8cabb12aa08125"},
- {file = "wrapt-1.17.2-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:35621ae4c00e056adb0009f8e86e28eb4a41a4bfa8f9bfa9fca7d343fe94f998"},
- {file = "wrapt-1.17.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:a604bf7a053f8362d27eb9fefd2097f82600b856d5abe996d623babd067b1ab5"},
- {file = "wrapt-1.17.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5cbabee4f083b6b4cd282f5b817a867cf0b1028c54d445b7ec7cfe6505057cf8"},
- {file = "wrapt-1.17.2-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:49703ce2ddc220df165bd2962f8e03b84c89fee2d65e1c24a7defff6f988f4d6"},
- {file = "wrapt-1.17.2-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8112e52c5822fc4253f3901b676c55ddf288614dc7011634e2719718eaa187dc"},
- {file = "wrapt-1.17.2-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:9fee687dce376205d9a494e9c121e27183b2a3df18037f89d69bd7b35bcf59e2"},
- {file = "wrapt-1.17.2-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:18983c537e04d11cf027fbb60a1e8dfd5190e2b60cc27bc0808e653e7b218d1b"},
- {file = "wrapt-1.17.2-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:703919b1633412ab54bcf920ab388735832fdcb9f9a00ae49387f0fe67dad504"},
- {file = "wrapt-1.17.2-cp313-cp313-win32.whl", hash = "sha256:abbb9e76177c35d4e8568e58650aa6926040d6a9f6f03435b7a522bf1c487f9a"},
- {file = "wrapt-1.17.2-cp313-cp313-win_amd64.whl", hash = "sha256:69606d7bb691b50a4240ce6b22ebb319c1cfb164e5f6569835058196e0f3a845"},
- {file = "wrapt-1.17.2-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:4a721d3c943dae44f8e243b380cb645a709ba5bd35d3ad27bc2ed947e9c68192"},
- {file = "wrapt-1.17.2-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:766d8bbefcb9e00c3ac3b000d9acc51f1b399513f44d77dfe0eb026ad7c9a19b"},
- {file = "wrapt-1.17.2-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:e496a8ce2c256da1eb98bd15803a79bee00fc351f5dfb9ea82594a3f058309e0"},
- {file = "wrapt-1.17.2-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:40d615e4fe22f4ad3528448c193b218e077656ca9ccb22ce2cb20db730f8d306"},
- {file = "wrapt-1.17.2-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a5aaeff38654462bc4b09023918b7f21790efb807f54c000a39d41d69cf552cb"},
- {file = "wrapt-1.17.2-cp313-cp313t-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9a7d15bbd2bc99e92e39f49a04653062ee6085c0e18b3b7512a4f2fe91f2d681"},
- {file = "wrapt-1.17.2-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:e3890b508a23299083e065f435a492b5435eba6e304a7114d2f919d400888cc6"},
- {file = "wrapt-1.17.2-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:8c8b293cd65ad716d13d8dd3624e42e5a19cc2a2f1acc74b30c2c13f15cb61a6"},
- {file = "wrapt-1.17.2-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:4c82b8785d98cdd9fed4cac84d765d234ed3251bd6afe34cb7ac523cb93e8b4f"},
- {file = "wrapt-1.17.2-cp313-cp313t-win32.whl", hash = "sha256:13e6afb7fe71fe7485a4550a8844cc9ffbe263c0f1a1eea569bc7091d4898555"},
- {file = "wrapt-1.17.2-cp313-cp313t-win_amd64.whl", hash = "sha256:eaf675418ed6b3b31c7a989fd007fa7c3be66ce14e5c3b27336383604c9da85c"},
- {file = "wrapt-1.17.2-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:5c803c401ea1c1c18de70a06a6f79fcc9c5acfc79133e9869e730ad7f8ad8ef9"},
- {file = "wrapt-1.17.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:f917c1180fdb8623c2b75a99192f4025e412597c50b2ac870f156de8fb101119"},
- {file = "wrapt-1.17.2-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:ecc840861360ba9d176d413a5489b9a0aff6d6303d7e733e2c4623cfa26904a6"},
- {file = "wrapt-1.17.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bb87745b2e6dc56361bfde481d5a378dc314b252a98d7dd19a651a3fa58f24a9"},
- {file = "wrapt-1.17.2-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:58455b79ec2661c3600e65c0a716955adc2410f7383755d537584b0de41b1d8a"},
- {file = "wrapt-1.17.2-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b4e42a40a5e164cbfdb7b386c966a588b1047558a990981ace551ed7e12ca9c2"},
- {file = "wrapt-1.17.2-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:91bd7d1773e64019f9288b7a5101f3ae50d3d8e6b1de7edee9c2ccc1d32f0c0a"},
- {file = "wrapt-1.17.2-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:bb90fb8bda722a1b9d48ac1e6c38f923ea757b3baf8ebd0c82e09c5c1a0e7a04"},
- {file = "wrapt-1.17.2-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:08e7ce672e35efa54c5024936e559469436f8b8096253404faeb54d2a878416f"},
- {file = "wrapt-1.17.2-cp38-cp38-win32.whl", hash = "sha256:410a92fefd2e0e10d26210e1dfb4a876ddaf8439ef60d6434f21ef8d87efc5b7"},
- {file = "wrapt-1.17.2-cp38-cp38-win_amd64.whl", hash = "sha256:95c658736ec15602da0ed73f312d410117723914a5c91a14ee4cdd72f1d790b3"},
- {file = "wrapt-1.17.2-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:99039fa9e6306880572915728d7f6c24a86ec57b0a83f6b2491e1d8ab0235b9a"},
- {file = "wrapt-1.17.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:2696993ee1eebd20b8e4ee4356483c4cb696066ddc24bd70bcbb80fa56ff9061"},
- {file = "wrapt-1.17.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:612dff5db80beef9e649c6d803a8d50c409082f1fedc9dbcdfde2983b2025b82"},
- {file = "wrapt-1.17.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:62c2caa1585c82b3f7a7ab56afef7b3602021d6da34fbc1cf234ff139fed3cd9"},
- {file = "wrapt-1.17.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c958bcfd59bacc2d0249dcfe575e71da54f9dcf4a8bdf89c4cb9a68a1170d73f"},
- {file = "wrapt-1.17.2-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fc78a84e2dfbc27afe4b2bd7c80c8db9bca75cc5b85df52bfe634596a1da846b"},
- {file = "wrapt-1.17.2-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:ba0f0eb61ef00ea10e00eb53a9129501f52385c44853dbd6c4ad3f403603083f"},
- {file = "wrapt-1.17.2-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:1e1fe0e6ab7775fd842bc39e86f6dcfc4507ab0ffe206093e76d61cde37225c8"},
- {file = "wrapt-1.17.2-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:c86563182421896d73858e08e1db93afdd2b947a70064b813d515d66549e15f9"},
- {file = "wrapt-1.17.2-cp39-cp39-win32.whl", hash = "sha256:f393cda562f79828f38a819f4788641ac7c4085f30f1ce1a68672baa686482bb"},
- {file = "wrapt-1.17.2-cp39-cp39-win_amd64.whl", hash = "sha256:36ccae62f64235cf8ddb682073a60519426fdd4725524ae38874adf72b5f2aeb"},
- {file = "wrapt-1.17.2-py3-none-any.whl", hash = "sha256:b18f2d1533a71f069c7f82d524a52599053d4c7166e9dd374ae2136b7f40f7c8"},
- {file = "wrapt-1.17.2.tar.gz", hash = "sha256:41388e9d4d1522446fe79d3213196bd9e3b301a336965b9e27ca2788ebd122f3"},
-]
-
-[[package]]
-name = "yarl"
-version = "1.18.3"
-description = "Yet another URL library"
-optional = false
-python-versions = ">=3.9"
-files = [
- {file = "yarl-1.18.3-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:7df647e8edd71f000a5208fe6ff8c382a1de8edfbccdbbfe649d263de07d8c34"},
- {file = "yarl-1.18.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:c69697d3adff5aa4f874b19c0e4ed65180ceed6318ec856ebc423aa5850d84f7"},
- {file = "yarl-1.18.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:602d98f2c2d929f8e697ed274fbadc09902c4025c5a9963bf4e9edfc3ab6f7ed"},
- {file = "yarl-1.18.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c654d5207c78e0bd6d749f6dae1dcbbfde3403ad3a4b11f3c5544d9906969dde"},
- {file = "yarl-1.18.3-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5094d9206c64181d0f6e76ebd8fb2f8fe274950a63890ee9e0ebfd58bf9d787b"},
- {file = "yarl-1.18.3-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:35098b24e0327fc4ebdc8ffe336cee0a87a700c24ffed13161af80124b7dc8e5"},
- {file = "yarl-1.18.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3236da9272872443f81fedc389bace88408f64f89f75d1bdb2256069a8730ccc"},
- {file = "yarl-1.18.3-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e2c08cc9b16f4f4bc522771d96734c7901e7ebef70c6c5c35dd0f10845270bcd"},
- {file = "yarl-1.18.3-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:80316a8bd5109320d38eef8833ccf5f89608c9107d02d2a7f985f98ed6876990"},
- {file = "yarl-1.18.3-cp310-cp310-musllinux_1_2_armv7l.whl", hash = "sha256:c1e1cc06da1491e6734f0ea1e6294ce00792193c463350626571c287c9a704db"},
- {file = "yarl-1.18.3-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:fea09ca13323376a2fdfb353a5fa2e59f90cd18d7ca4eaa1fd31f0a8b4f91e62"},
- {file = "yarl-1.18.3-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:e3b9fd71836999aad54084906f8663dffcd2a7fb5cdafd6c37713b2e72be1760"},
- {file = "yarl-1.18.3-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:757e81cae69244257d125ff31663249b3013b5dc0a8520d73694aed497fb195b"},
- {file = "yarl-1.18.3-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:b1771de9944d875f1b98a745bc547e684b863abf8f8287da8466cf470ef52690"},
- {file = "yarl-1.18.3-cp310-cp310-win32.whl", hash = "sha256:8874027a53e3aea659a6d62751800cf6e63314c160fd607489ba5c2edd753cf6"},
- {file = "yarl-1.18.3-cp310-cp310-win_amd64.whl", hash = "sha256:93b2e109287f93db79210f86deb6b9bbb81ac32fc97236b16f7433db7fc437d8"},
- {file = "yarl-1.18.3-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:8503ad47387b8ebd39cbbbdf0bf113e17330ffd339ba1144074da24c545f0069"},
- {file = "yarl-1.18.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:02ddb6756f8f4517a2d5e99d8b2f272488e18dd0bfbc802f31c16c6c20f22193"},
- {file = "yarl-1.18.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:67a283dd2882ac98cc6318384f565bffc751ab564605959df4752d42483ad889"},
- {file = "yarl-1.18.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d980e0325b6eddc81331d3f4551e2a333999fb176fd153e075c6d1c2530aa8a8"},
- {file = "yarl-1.18.3-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b643562c12680b01e17239be267bc306bbc6aac1f34f6444d1bded0c5ce438ca"},
- {file = "yarl-1.18.3-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c017a3b6df3a1bd45b9fa49a0f54005e53fbcad16633870104b66fa1a30a29d8"},
- {file = "yarl-1.18.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:75674776d96d7b851b6498f17824ba17849d790a44d282929c42dbb77d4f17ae"},
- {file = "yarl-1.18.3-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ccaa3a4b521b780a7e771cc336a2dba389a0861592bbce09a476190bb0c8b4b3"},
- {file = "yarl-1.18.3-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:2d06d3005e668744e11ed80812e61efd77d70bb7f03e33c1598c301eea20efbb"},
- {file = "yarl-1.18.3-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:9d41beda9dc97ca9ab0b9888cb71f7539124bc05df02c0cff6e5acc5a19dcc6e"},
- {file = "yarl-1.18.3-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:ba23302c0c61a9999784e73809427c9dbedd79f66a13d84ad1b1943802eaaf59"},
- {file = "yarl-1.18.3-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:6748dbf9bfa5ba1afcc7556b71cda0d7ce5f24768043a02a58846e4a443d808d"},
- {file = "yarl-1.18.3-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:0b0cad37311123211dc91eadcb322ef4d4a66008d3e1bdc404808992260e1a0e"},
- {file = "yarl-1.18.3-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:0fb2171a4486bb075316ee754c6d8382ea6eb8b399d4ec62fde2b591f879778a"},
- {file = "yarl-1.18.3-cp311-cp311-win32.whl", hash = "sha256:61b1a825a13bef4a5f10b1885245377d3cd0bf87cba068e1d9a88c2ae36880e1"},
- {file = "yarl-1.18.3-cp311-cp311-win_amd64.whl", hash = "sha256:b9d60031cf568c627d028239693fd718025719c02c9f55df0a53e587aab951b5"},
- {file = "yarl-1.18.3-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:1dd4bdd05407ced96fed3d7f25dbbf88d2ffb045a0db60dbc247f5b3c5c25d50"},
- {file = "yarl-1.18.3-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:7c33dd1931a95e5d9a772d0ac5e44cac8957eaf58e3c8da8c1414de7dd27c576"},
- {file = "yarl-1.18.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:25b411eddcfd56a2f0cd6a384e9f4f7aa3efee14b188de13048c25b5e91f1640"},
- {file = "yarl-1.18.3-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:436c4fc0a4d66b2badc6c5fc5ef4e47bb10e4fd9bf0c79524ac719a01f3607c2"},
- {file = "yarl-1.18.3-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e35ef8683211db69ffe129a25d5634319a677570ab6b2eba4afa860f54eeaf75"},
- {file = "yarl-1.18.3-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:84b2deecba4a3f1a398df819151eb72d29bfeb3b69abb145a00ddc8d30094512"},
- {file = "yarl-1.18.3-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:00e5a1fea0fd4f5bfa7440a47eff01d9822a65b4488f7cff83155a0f31a2ecba"},
- {file = "yarl-1.18.3-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d0e883008013c0e4aef84dcfe2a0b172c4d23c2669412cf5b3371003941f72bb"},
- {file = "yarl-1.18.3-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:5a3f356548e34a70b0172d8890006c37be92995f62d95a07b4a42e90fba54272"},
- {file = "yarl-1.18.3-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:ccd17349166b1bee6e529b4add61727d3f55edb7babbe4069b5764c9587a8cc6"},
- {file = "yarl-1.18.3-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:b958ddd075ddba5b09bb0be8a6d9906d2ce933aee81100db289badbeb966f54e"},
- {file = "yarl-1.18.3-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:c7d79f7d9aabd6011004e33b22bc13056a3e3fb54794d138af57f5ee9d9032cb"},
- {file = "yarl-1.18.3-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:4891ed92157e5430874dad17b15eb1fda57627710756c27422200c52d8a4e393"},
- {file = "yarl-1.18.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:ce1af883b94304f493698b00d0f006d56aea98aeb49d75ec7d98cd4a777e9285"},
- {file = "yarl-1.18.3-cp312-cp312-win32.whl", hash = "sha256:f91c4803173928a25e1a55b943c81f55b8872f0018be83e3ad4938adffb77dd2"},
- {file = "yarl-1.18.3-cp312-cp312-win_amd64.whl", hash = "sha256:7e2ee16578af3b52ac2f334c3b1f92262f47e02cc6193c598502bd46f5cd1477"},
- {file = "yarl-1.18.3-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:90adb47ad432332d4f0bc28f83a5963f426ce9a1a8809f5e584e704b82685dcb"},
- {file = "yarl-1.18.3-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:913829534200eb0f789d45349e55203a091f45c37a2674678744ae52fae23efa"},
- {file = "yarl-1.18.3-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:ef9f7768395923c3039055c14334ba4d926f3baf7b776c923c93d80195624782"},
- {file = "yarl-1.18.3-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:88a19f62ff30117e706ebc9090b8ecc79aeb77d0b1f5ec10d2d27a12bc9f66d0"},
- {file = "yarl-1.18.3-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e17c9361d46a4d5addf777c6dd5eab0715a7684c2f11b88c67ac37edfba6c482"},
- {file = "yarl-1.18.3-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1a74a13a4c857a84a845505fd2d68e54826a2cd01935a96efb1e9d86c728e186"},
- {file = "yarl-1.18.3-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:41f7ce59d6ee7741af71d82020346af364949314ed3d87553763a2df1829cc58"},
- {file = "yarl-1.18.3-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f52a265001d830bc425f82ca9eabda94a64a4d753b07d623a9f2863fde532b53"},
- {file = "yarl-1.18.3-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:82123d0c954dc58db301f5021a01854a85bf1f3bb7d12ae0c01afc414a882ca2"},
- {file = "yarl-1.18.3-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:2ec9bbba33b2d00999af4631a3397d1fd78290c48e2a3e52d8dd72db3a067ac8"},
- {file = "yarl-1.18.3-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:fbd6748e8ab9b41171bb95c6142faf068f5ef1511935a0aa07025438dd9a9bc1"},
- {file = "yarl-1.18.3-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:877d209b6aebeb5b16c42cbb377f5f94d9e556626b1bfff66d7b0d115be88d0a"},
- {file = "yarl-1.18.3-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:b464c4ab4bfcb41e3bfd3f1c26600d038376c2de3297760dfe064d2cb7ea8e10"},
- {file = "yarl-1.18.3-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:8d39d351e7faf01483cc7ff7c0213c412e38e5a340238826be7e0e4da450fdc8"},
- {file = "yarl-1.18.3-cp313-cp313-win32.whl", hash = "sha256:61ee62ead9b68b9123ec24bc866cbef297dd266175d53296e2db5e7f797f902d"},
- {file = "yarl-1.18.3-cp313-cp313-win_amd64.whl", hash = "sha256:578e281c393af575879990861823ef19d66e2b1d0098414855dd367e234f5b3c"},
- {file = "yarl-1.18.3-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:61e5e68cb65ac8f547f6b5ef933f510134a6bf31bb178be428994b0cb46c2a04"},
- {file = "yarl-1.18.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:fe57328fbc1bfd0bd0514470ac692630f3901c0ee39052ae47acd1d90a436719"},
- {file = "yarl-1.18.3-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:a440a2a624683108a1b454705ecd7afc1c3438a08e890a1513d468671d90a04e"},
- {file = "yarl-1.18.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:09c7907c8548bcd6ab860e5f513e727c53b4a714f459b084f6580b49fa1b9cee"},
- {file = "yarl-1.18.3-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b4f6450109834af88cb4cc5ecddfc5380ebb9c228695afc11915a0bf82116789"},
- {file = "yarl-1.18.3-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a9ca04806f3be0ac6d558fffc2fdf8fcef767e0489d2684a21912cc4ed0cd1b8"},
- {file = "yarl-1.18.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:77a6e85b90a7641d2e07184df5557132a337f136250caafc9ccaa4a2a998ca2c"},
- {file = "yarl-1.18.3-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6333c5a377c8e2f5fae35e7b8f145c617b02c939d04110c76f29ee3676b5f9a5"},
- {file = "yarl-1.18.3-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:0b3c92fa08759dbf12b3a59579a4096ba9af8dd344d9a813fc7f5070d86bbab1"},
- {file = "yarl-1.18.3-cp39-cp39-musllinux_1_2_armv7l.whl", hash = "sha256:4ac515b860c36becb81bb84b667466885096b5fc85596948548b667da3bf9f24"},
- {file = "yarl-1.18.3-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:045b8482ce9483ada4f3f23b3774f4e1bf4f23a2d5c912ed5170f68efb053318"},
- {file = "yarl-1.18.3-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:a4bb030cf46a434ec0225bddbebd4b89e6471814ca851abb8696170adb163985"},
- {file = "yarl-1.18.3-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:54d6921f07555713b9300bee9c50fb46e57e2e639027089b1d795ecd9f7fa910"},
- {file = "yarl-1.18.3-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:1d407181cfa6e70077df3377938c08012d18893f9f20e92f7d2f314a437c30b1"},
- {file = "yarl-1.18.3-cp39-cp39-win32.whl", hash = "sha256:ac36703a585e0929b032fbaab0707b75dc12703766d0b53486eabd5139ebadd5"},
- {file = "yarl-1.18.3-cp39-cp39-win_amd64.whl", hash = "sha256:ba87babd629f8af77f557b61e49e7c7cac36f22f871156b91e10a6e9d4f829e9"},
- {file = "yarl-1.18.3-py3-none-any.whl", hash = "sha256:b57f4f58099328dfb26c6a771d09fb20dbbae81d20cfb66141251ea063bd101b"},
- {file = "yarl-1.18.3.tar.gz", hash = "sha256:ac1801c45cbf77b6c99242eeff4fffb5e4e73a800b5c4ad4fc0be5def634d2e1"},
-]
-
-[package.dependencies]
-idna = ">=2.0"
-multidict = ">=4.0"
-propcache = ">=0.2.0"
-
-[metadata]
-lock-version = "2.0"
-python-versions = "^3.11"
-content-hash = "21a0f6e687ee3c43ee58824b834c4dfe3731328c3161270e55924ee4de39dc7d"
diff --git a/pyproject.toml b/pyproject.toml
index 349478e..7024309 100644
--- a/pyproject.toml
+++ b/pyproject.toml
@@ -1,39 +1,41 @@
-[tool.poetry]
-name = "speckle-automate-py"
+[project]
+name = "speckle-automate-checker"
version = "0.1.0"
description = "Allows for QAQC property checking with Speckle"
authors = ["Jonathon Broughton "]
readme = "README.md"
-package-mode = false
+requires-python = ">=3.12"
+dependencies = [
+ "more-itertools>=10.6.0",
+ "pandas>=2.2.3",
+ "pydantic==2.10.6",
+ "python-dotenv>=1.0.1",
+ "python-levenshtein>=0.26.1",
+ "specklepy>=2.21.2",
+]
-[tool.poetry.dependencies]
-more-itertools = "^10.6.0"
-pandas = "^2.2.3"
-python = "^3.11"
-python-dotenv = "^1.0.1"
-python-levenshtein = "^0.26.1"
-specklepy = "^2.21.0"
-[tool.poetry.group.dev.dependencies]
-black = "^25.0.0"
-mypy = "^1.3.0"
-pydantic-settings = "^2.3.0"
-pytest = "^8.0.0"
-ruff = "^0.9.5"
-# specklepy = { path = "../specklepy", develop = true }
+[dependency-groups]
+dev = [
+ "pytest-assertcount>=1.0.0",
+ "black>=25.1.0",
+ "mypy>=1.15.0",
+ "pydantic-settings>=2.7.1",
+ "pytest>=8.3.4",
+ "ruff>=0.9.6",
+]
-[build-system]
-requires = ["poetry-core"]
-build-backend = "poetry.core.masonry.api"
[tool.ruff]
select = [
- "E", # pycodestyle
- "F", # pyflakes
- "UP", # pyupgrade
- "D", # pydocstyle
- "I", # isort
+ "E", # pycodestyle
+ "F", # pyflakes
+ "UP", # pyupgrade
+ "D", # pydocstyle
+ "I", # isort
]
+line-length = 120
+ignore = ["F401", "F403"]
[tool.ruff.pydocstyle]
convention = "google"
diff --git a/requirements.txt b/requirements.txt
new file mode 100644
index 0000000..ea5ee7d
--- /dev/null
+++ b/requirements.txt
@@ -0,0 +1,54 @@
+annotated-types==0.7.0
+anyio==4.8.0
+appdirs==1.4.4
+attrs==23.2.0
+backoff==2.2.1
+black==25.1.0
+certifi==2025.1.31
+charset-normalizer==3.4.1
+click==8.1.8
+colorama==0.4.6
+deprecated==1.2.18
+gql==3.5.0
+graphql-core==3.2.6
+h11==0.14.0
+httpcore==1.0.7
+httpx==0.25.2
+idna==3.10
+iniconfig==2.0.0
+levenshtein==0.26.1
+more-itertools==10.6.0
+multidict==6.1.0
+mypy==1.15.0
+mypy-extensions==1.0.0
+numpy==2.2.2
+packaging==24.2
+pandas==2.2.3
+pathspec==0.12.1
+platformdirs==4.3.6
+pluggy==1.5.0
+propcache==0.2.1
+pydantic==2.10.6
+pydantic-core==2.27.2
+pydantic-settings==2.7.1
+pytest==8.3.4
+pytest-assertcount==1.0.0
+python-dateutil==2.9.0.post0
+python-dotenv==1.0.1
+python-levenshtein==0.26.1
+pytz==2025.1
+rapidfuzz==3.12.1
+requests==2.32.3
+requests-toolbelt==1.0.0
+ruff==0.9.6
+six==1.17.0
+sniffio==1.3.1
+specklepy==2.21.2
+stringcase==1.2.0
+typing-extensions==4.12.2
+tzdata==2025.1
+ujson==5.10.0
+urllib3==2.3.0
+websockets==11.0.3
+wrapt==1.17.2
+yarl==1.18.3
diff --git a/setup.sh b/setup.sh
new file mode 100644
index 0000000..e6e5b7c
--- /dev/null
+++ b/setup.sh
@@ -0,0 +1,9 @@
+#!/bin/bash
+
+# Copy the pre-commit hook to the .git/hooks/ directory
+cp hooks/pre-commit .git/hooks/pre-commit
+
+# Ensure the hook is executable
+chmod +x .git/hooks/pre-commit
+
+echo "Git hooks have been set up!"
diff --git a/src/filters.py b/src/filters.py
new file mode 100644
index 0000000..3d9dd96
--- /dev/null
+++ b/src/filters.py
@@ -0,0 +1,31 @@
+from specklepy.objects.base import Base
+
+from src.rules import PropertyRules
+
+
+def filter_objects_by_category(speckle_objects: list[Base], category_input: str) -> tuple[list[Base], list[Base]]:
+ """Filters objects by category value and test.
+
+ This function takes a list of Speckle objects, filters out the objects
+ with a matching category value and satisfies the test, and returns
+ both the matching and non-matching objects.
+
+ Args:
+ speckle_objects (List[Base]): The list of Speckle objects to filter.
+ category_input (str): The category value to match against.
+
+ Returns:
+ Tuple[List[Base], List[Base]]: A tuple containing two lists:
+ - The first list contains objects with matching category and test.
+ - The second list contains objects without matching category or test.
+ """
+ matching_objects = []
+ non_matching_objects = []
+
+ for obj in speckle_objects:
+ if PropertyRules.is_category(obj, category_input):
+ matching_objects.append(obj)
+ else:
+ non_matching_objects.append(obj)
+
+ return matching_objects, non_matching_objects
diff --git a/src/function.py b/src/function.py
index fb17b85..1a2973d 100644
--- a/src/function.py
+++ b/src/function.py
@@ -1,21 +1,24 @@
-"""This module contains the function's business logic.
+# This is the main function that will be executed when the automation is triggered.
+# It will receive the inputs from the user, and the context of the run.
+# It will then apply the rules to the objects in the model, and report back the results.
-Use the automation_context module to wrap your function in an Automate context helper.
-"""
+from pandas import DataFrame
+from speckle_automate import AutomationContext
+from specklepy.objects.base import Base
-from speckle_automate import AutomationContext, AutomateBase
-
-from src.rules import apply_rules_to_objects
-from src.inputs import FunctionInputs
from src.helpers import flatten_base
+from src.inputs import FunctionInputs
+from src.rule_processor import apply_rules_to_objects
from src.spreadsheet import read_rules_from_spreadsheet
+VERSION: int = 2
+
def automate_function(
- automate_context: AutomationContext,
- function_inputs: FunctionInputs,
+ automate_context: AutomationContext,
+ function_inputs: FunctionInputs,
) -> None:
- """This version of the function will add a check for the new provide inputs.
+ """This VERSION of the function will add a check for the new provide inputs.
Args:
automate_context: A context helper object, that carries relevant information
@@ -24,23 +27,32 @@ def automate_function(
It also has convenience methods attach result data to the Speckle model.
function_inputs: An instance object matching the defined schema.
"""
-
- # the context provides a convenient way, to receive the triggering version
- version_root_object = automate_context.receive_version()
+ # the context provides a convenient way, to receive the triggering VERSION
+ version_root_object: Base = automate_context.receive_version()
# We can continue to work with a flattened list of objects.
flat_list_of_objects = list(flatten_base(version_root_object))
+ # If it is a next_gen model, we can get the VERSION from the root object
+ # This function's rules don't make use of this check, but it is here for reference if you want to.
+ global VERSION
+ VERSION = getattr(version_root_object, "version", 2) # noqa: F841SION = getattr(version_root_object,"version", 2) # noqa: F841 # noqa: F841
+
# read the rules from the spreadsheet
- rules = read_rules_from_spreadsheet(function_inputs.spreadsheet_url)
+ rules: DataFrame = read_rules_from_spreadsheet(function_inputs.spreadsheet_url)
+
+ if (rules is None) or (len(rules) == 0):
+ automate_context.mark_run_exception("No rules defined")
+
+ grouped_rules = rules.groupby("Rule Number")
# apply the rules to the objects
- apply_rules_to_objects(flat_list_of_objects, rules, automate_context)
+ apply_rules_to_objects(flat_list_of_objects, grouped_rules, automate_context)
- # set the automation context view, to the original model / version view
+ # set the automation context view, to the original model / VERSION view
automate_context.set_context_view()
# report success
automate_context.mark_run_success(
- f"Successfully applied rules to {len(flat_list_of_objects)} objects."
+ f"Successfully applied {len(grouped_rules)} rules to {len(flat_list_of_objects)} version {VERSION} objects."
)
diff --git a/src/helpers.py b/src/helpers.py
index 9f28bb0..9d6632a 100644
--- a/src/helpers.py
+++ b/src/helpers.py
@@ -1,14 +1,14 @@
"""Helper module for a speckle object tree flattening."""
-from collections.abc import Iterable
-from typing import Optional, Tuple, List
+from collections.abc import Generator, Iterable
+from typing import Any
from specklepy.objects import Base
from specklepy.objects.other import Instance, Transform
def speckle_print(log_string: str = "banana") -> None:
-
+ """Print a string to the console with a green color."""
print("\033[92m" + str(log_string) + "\033[0m")
@@ -21,6 +21,24 @@ def flatten_base(base: Base) -> Iterable[Base]:
yield base
+def get_item(obj: Base | dict[str, Any], key, default=None):
+ """Get an item from a dictionary or an object with a default value."""
+ if isinstance(obj, dict): # If it's a dictionary
+ return obj.get(key, default)
+ elif hasattr(obj, key): # If it's an object with the attribute
+ return getattr(obj, key, default)
+ return default # Return default if it's neither a dict nor an object with the attribute
+
+
+def has_item(obj: Base | dict[str, Any], key: str) -> bool:
+ """Check if an object has a key or an attribute."""
+ if isinstance(obj, dict):
+ return key in obj
+ elif hasattr(obj, key):
+ return True
+ return False
+
+
def flatten_base_thorough(base: Base, parent_type: str = None) -> Iterable[Base]:
"""Take a base and flatten it to an iterable of bases.
@@ -51,9 +69,7 @@ def flatten_base_thorough(base: Base, parent_type: str = None) -> Iterable[Base]
print(category)
if category.startswith("@"):
category_object: Base = getattr(base, category)[0]
- yield from flatten_base_thorough(
- category_object, category_object.speckle_type
- )
+ yield from flatten_base_thorough(category_object, category_object.speckle_type)
except KeyError:
pass
@@ -63,11 +79,13 @@ def flatten_base_thorough(base: Base, parent_type: str = None) -> Iterable[Base]
def extract_base_and_transform(
base: Base,
- inherited_instance_id: Optional[str] = None,
- transform_list: Optional[List[Transform]] = None,
-) -> Tuple[Base, str, Optional[List[Transform]]]:
- """
- Traverses Speckle object hierarchies to yield `Base` objects and their transformations.
+ inherited_instance_id: str | None = None,
+ transform_list: list[Transform] | None = None,
+) -> Generator[
+ Base | str | list[Transform] | None | tuple[Base, Any | None, list[Transform] | None | list[Any]], Any | None, None
+]:
+ """Traverses Speckle object hierarchies to yield `Base` objects and their transformations.
+
Tailored to Speckle's AEC data structures, it covers the newer hierarchical structures
with Collections and also with patterns found in older Revit specific data.
@@ -91,9 +109,7 @@ def extract_base_and_transform(
if base.transform:
transform_list.append(base.transform)
if base.definition:
- yield from extract_base_and_transform(
- base.definition, current_id, transform_list.copy()
- )
+ yield from extract_base_and_transform(base.definition, current_id, transform_list.copy())
else:
# Initial yield for the current `Base` object.
yield base, current_id, transform_list
@@ -103,9 +119,7 @@ def extract_base_and_transform(
for element in elements_attr:
if isinstance(element, Base):
# Recurse into each `Base` object within 'elements' or '@elements'.
- yield from extract_base_and_transform(
- element, current_id, transform_list.copy()
- )
+ yield from extract_base_and_transform(element, current_id, transform_list.copy())
# Recursively process '@'-prefixed properties that are Base objects with 'elements'.
# This is a common pattern in older Speckle data models, such as those used for Revit commits.
@@ -114,6 +128,4 @@ def extract_base_and_transform(
attr_value = getattr(base, attr_name)
# If the attribute is a Base object containing 'elements', recurse into it.
if isinstance(attr_value, Base) and hasattr(attr_value, "elements"):
- yield from extract_base_and_transform(
- attr_value, current_id, transform_list.copy()
- )
+ yield from extract_base_and_transform(attr_value, current_id, transform_list.copy())
diff --git a/src/inputs.py b/src/inputs.py
index f11ec33..45bd24d 100644
--- a/src/inputs.py
+++ b/src/inputs.py
@@ -1,7 +1,14 @@
+from enum import Enum
+
from pydantic import Field
from speckle_automate import AutomateBase
+class PropertyMatchMode(Enum):
+ STRICT = "strict" # Exact parameter path match
+ FUZZY = "fuzzy" # Search all parameters ignoring hierarchy
+ MIXED = "mixed" # Exact match first, fuzzy fallback
+
class FunctionInputs(AutomateBase):
"""These are function author defined values.
@@ -10,8 +17,23 @@ class FunctionInputs(AutomateBase):
https://docs.pydantic.dev/latest/usage/models/
"""
+
+
+
+
+
+
# In this exercise, we will move rules to an external source so not to hardcode them.
spreadsheet_url: str = Field(
title="Spreadsheet URL",
description="This is the URL of the spreadsheet to check. It should be a TSV format data source.",
)
+
+ property_match_mode: PropertyMatchMode = Field(
+ default=PropertyMatchMode.MIXED,
+ title="Property Match Mode",
+ description='Controls how strictly parameter names must match. ' +
+ 'STRICT will only match exact parameter paths, ' +
+ 'FUZZY will search all parameters ignoring hierarchy, ' +
+ 'MIXED will exact match first, fuzzy fallback.'
+ )
diff --git a/src/predicates.py b/src/predicates.py
new file mode 100644
index 0000000..8f3108e
--- /dev/null
+++ b/src/predicates.py
@@ -0,0 +1,19 @@
+"""Configuration module defining mappings between spreadsheet predicates and rule methods."""
+
+from src.rules import PropertyRules
+
+# Mapping of input predicates to the corresponding methods in PropertyRules
+PREDICATE_METHOD_MAP = {
+ "exists": PropertyRules.has_parameter.__name__,
+ "matches": PropertyRules.is_parameter_value.__name__,
+ "greater than": PropertyRules.is_parameter_value_greater_than.__name__,
+ "less than": PropertyRules.is_parameter_value_less_than.__name__,
+ "in range": PropertyRules.is_parameter_value_in_range.__name__,
+ "in list": PropertyRules.is_parameter_value_in_list.__name__,
+ "equal to": PropertyRules.is_equal_value.__name__,
+ "is true": PropertyRules.is_parameter_value_true.__name__,
+ "is false": PropertyRules.is_parameter_value_false.__name__,
+ "is like": PropertyRules.is_parameter_value_like.__name__,
+ "identical to": PropertyRules.is_identical_value.__name__,
+ "not equal": PropertyRules.is_not_equal_value.__name__,
+}
diff --git a/src/rule_processor.py b/src/rule_processor.py
new file mode 100644
index 0000000..dcf2701
--- /dev/null
+++ b/src/rule_processor.py
@@ -0,0 +1,244 @@
+from enum import Enum
+from typing import Any
+
+import pandas as pd
+from pandas.core.groupby import DataFrameGroupBy
+from speckle_automate import AutomationContext, ObjectResultLevel
+from specklepy.objects.base import Base
+
+from src.helpers import speckle_print
+from src.predicates import PREDICATE_METHOD_MAP
+from src.rules import PropertyRules
+
+
+def evaluate_condition(
+ speckle_object: Base, condition: pd.Series, rule_number: str | None = None, case_number: int | None = None
+) -> bool:
+ """Given a Speckle object and a condition, evaluates the condition and returns a boolean value.
+
+ A condition is a pandas Series object with the following keys:
+ - 'Property Name': The name of the property to evaluate.
+ - 'Predicate': The predicate to use for evaluation.
+ - 'Value': The value to compare against.
+
+ Args:
+ rule_number (string): For information the rule number.
+ case_number (int): For information the rule clause number.
+ speckle_object (Base): The Speckle object to evaluate.
+ condition (pd.Series): The condition to evaluate.
+
+ Returns:
+ bool: The result of the evaluation. True if the condition is met, False otherwise.
+ """
+ property_name = condition["Property Name"]
+ predicate_key = condition["Predicate"]
+ value = condition["Value"]
+
+ _ = rule_number
+ _ = case_number
+
+ if predicate_key in PREDICATE_METHOD_MAP:
+ method_name = PREDICATE_METHOD_MAP[predicate_key]
+ method = getattr(PropertyRules, method_name, None)
+
+ if method:
+ check_answer = method(speckle_object, property_name, value)
+
+ return check_answer
+ return False
+
+
+def process_rule(
+ speckle_objects: list[Base], rule_group: pd.DataFrame
+) -> tuple[list[Any], list[Any]] | tuple[list[Base], list[Base]]:
+ """Processes a set of rules against Speckle objects, returning those that pass and fail.
+
+ The first rule is used as a filter ('WHERE'), and subsequent rules as conditions ('AND').
+
+ Args:
+ speckle_objects: List of Speckle objects to be processed.
+ rule_group: DataFrame defining the filter and conditions.
+
+ Returns:
+ A tuple of lists containing objects that passed and failed the rule.
+ """
+ # Extract the 'WHERE' condition and subsequent 'AND' conditions
+ filter_condition = rule_group.iloc[0]
+ subsequent_conditions = rule_group.iloc[1:]
+
+ # get the last row of the rule_group and get the Message and Report Severity
+ rule_info = rule_group.iloc[-1]
+ rule_number = rule_info["Rule Number"]
+
+ # Filter objects based on the 'WHERE' condition
+ filtered_objects = [
+ speckle_object for speckle_object in speckle_objects if evaluate_condition(speckle_object, filter_condition)
+ ]
+
+ if not filtered_objects or len(list(filtered_objects)) == 0:
+ return [], []
+
+ # Initialize lists for passed and failed objects
+ pass_objects, fail_objects = [], []
+
+ # Evaluate each filtered object against the 'AND' conditions
+ for speckle_object in filtered_objects:
+ if all(
+ evaluate_condition(
+ speckle_object=speckle_object, condition=condition, rule_number=rule_number, case_number=index
+ )
+ for index, condition in subsequent_conditions.iterrows()
+ ):
+ pass_objects.append(speckle_object)
+ else:
+ fail_objects.append(speckle_object)
+
+ return pass_objects, fail_objects
+
+
+def apply_rules_to_objects(
+ speckle_objects: list[Base],
+ grouped_rules: DataFrameGroupBy,
+ automate_context: AutomationContext,
+) -> dict[str, tuple[list[Base], list[Base]]]:
+ """Applies defined rules to a list of objects and updates the automate context based on the results.
+
+ Args:
+ speckle_objects (List[Base]): The list of objects to which rules are applied.
+ grouped_rules (pd.DataFrameGroupBy): The DataFrame containing rule definitions.
+ automate_context (Any): Context manager for attaching rule results.
+ """
+ grouped_results = {}
+
+ rules_processed = 0
+
+ for rule_id, rule_group in grouped_rules:
+ rule_id_str = str(rule_id) # Convert rule_id to string
+
+ rules_processed += 1
+
+ # Ensure rule_group has necessary columns
+ if "Message" not in rule_group.columns or "Report Severity" not in rule_group.columns:
+ continue # Or raise an exception if these columns are mandatory
+
+ pass_objects, fail_objects = process_rule(speckle_objects, rule_group)
+
+ attach_results(pass_objects, rule_group.iloc[-1], rule_id_str, automate_context, True)
+ attach_results(fail_objects, rule_group.iloc[-1], rule_id_str, automate_context, False)
+
+ if len(pass_objects) == 0 and len(fail_objects) == 0:
+ automate_context.attach_info_to_objects(
+ category=f"Rule {rule_id_str} Skipped",
+ object_ids=["0"], # This is a hack to get a rule to report with no valid objects
+ message=f"No objects found for rule {rule_id_str}",
+ metadata={},
+ )
+ # pass
+
+ grouped_results[rule_id_str] = (pass_objects, fail_objects)
+
+ # return pass_objects, fail_objects for each rule
+ return grouped_results
+
+
+class SeverityLevel(Enum):
+ """Enum for severity levels."""
+
+ INFO = "Info"
+ WARNING = "Warning"
+ ERROR = "Error"
+
+
+def get_severity(rule_info: pd.Series) -> SeverityLevel:
+ """Convert a string severity level to the corresponding SeverityLevel enum.
+
+ This function normalizes input strings (because processing user entered dead is hard), handling:
+ - Case insensitivity (e.g., "info", "WARNING" → "Info", "Warning")
+ - Shorthand mappings (e.g., "WARN" → "Warning")
+ - Stripping whitespace
+ - Defaults to SeverityLevel.ERROR if the input is invalid
+ """
+ severity = rule_info.get("Report Severity") # Extract severity from input data
+
+ # If severity is None or not a string (e.g., numeric input), default to ERROR
+ if not isinstance(severity, str):
+ return SeverityLevel.ERROR
+
+ severity = severity.strip().upper() # Remove leading/trailing spaces & normalize case
+
+ # Define a mapping for shorthand or alternate spellings
+ alias_map = {
+ "WARN": "WARNING", # Treat "WARN" as "WARNING"
+ }
+
+ # Replace shorthand values if applicable
+ severity = alias_map.get(severity, severity)
+
+ # Attempt to match with an existing SeverityLevel enum value (case-insensitive)
+ return next(
+ (level for level in SeverityLevel if level.value.upper() == severity),
+ SeverityLevel.ERROR, # Default to ERROR if no match is found
+ )
+
+
+def get_metadata(
+ rule_id: str, rule_info: pd.Series, passed: bool, speckle_objects: list[Base]
+) -> dict[str, str | int | Any]:
+ """Function that generates metadata with severity validation."""
+ metadata = {
+ "rule_id": rule_id,
+ "status": "PASS" if passed else "FAIL",
+ "severity": get_severity(rule_info).value, # Keep proper casing
+ "rule_message": rule_info["Message"],
+ "object_count": len(speckle_objects),
+ }
+ return metadata
+
+
+def attach_results(
+ speckle_objects: list[Base],
+ rule_info: pd.Series,
+ rule_id: str,
+ context: AutomationContext,
+ passed: bool,
+) -> None:
+ """Attaches the results of a rule to the objects in the context.
+
+ Args:
+ speckle_objects (List[Base]): The list of objects to which the rule was applied.
+ rule_info (pd.Series): The information about the rule.
+ rule_id (str): The ID of the rule.
+ context (AutomationContext): The context manager for attaching results.
+ passed (bool): Whether the rule passed or failed.
+ """
+ if not speckle_objects:
+ return
+
+ # Create structured metadata for onward data analysis uses
+
+ metadata = get_metadata(rule_id, rule_info, passed, speckle_objects)
+
+ message = f"{rule_info['Message']}"
+
+ if not passed:
+ speckle_print(rule_info["Report Severity"])
+
+ severity = (
+ ObjectResultLevel.WARNING
+ if rule_info["Report Severity"].capitalize() in ["Warning", "Warn"]
+ else ObjectResultLevel.ERROR
+ )
+ context.attach_result_to_objects(
+ category=f"Rule {rule_id}",
+ object_ids=[speckle_object.id for speckle_object in speckle_objects],
+ message=message,
+ level=severity,
+ metadata=metadata,
+ )
+ else:
+ context.attach_info_to_objects(
+ category=f"Rule {rule_id}",
+ object_ids=[speckle_object.id for speckle_object in speckle_objects],
+ message=message,
+ metadata=metadata,
+ )
diff --git a/src/rules.py b/src/rules.py
index ba6e39c..08c07cb 100644
--- a/src/rules.py
+++ b/src/rules.py
@@ -1,59 +1,30 @@
+import math
import re
-from typing import Any, cast
+from typing import Any
-import pandas as pd
from Levenshtein import ratio
-from speckle_automate import AutomationContext, ObjectResultLevel
from specklepy.objects.base import Base
-from src.helpers import speckle_print
-
-# We're going to define a set of rules that will allow us to filter and
-# process parameters in our Speckle objects. These rules will be encapsulated
-# in a class called `ParameterRules`.
+PRIMITIVE_TYPES = (bool, int, float, str, type(None))
class Rules:
- """A collection of rules for processing properties in Speckle objects.
-
- Simple rules can be straightforwardly implemented as static methods that
- return boolean value to be used either as a filter or a condition.
- These can then be abstracted into returning lambda functions that we can
- use in our main processing logic. By encapsulating these rules, we can easily
- extend or modify them in the future.
- """
+ """A collection of rules for processing properties in Speckle objects."""
@staticmethod
def try_get_display_value(
- speckle_object: Base,
+ speckle_object: Base,
) -> list[Base] | None:
- """Try fetching the display value from a Speckle object.
-
- This method encapsulates the logic for attempting to retrieve the display value from a Speckle object.
- It returns a list containing the display values if found, otherwise it returns None.
-
- Args:
- speckle_object (Base): The Speckle object to extract the display value from.
-
- Returns:
- Optional[List[Base]]: A list containing the display values. If no display value is found,
- returns None.
- """
- # Attempt to get the display value from the speckle_object
+ """Try fetching the display value from a Speckle object."""
raw_display_value = getattr(speckle_object, "displayValue", None) or getattr(
speckle_object, "@displayValue", None
)
- # If no display value found, return None
if raw_display_value is None:
return None
- # If display value found, filter out non-Base objects
- display_values = [
- value for value in raw_display_value if isinstance(value, Base)
- ]
+ display_values = [value for value in raw_display_value if isinstance(value, Base)]
- # If no valid display values found, return None
if not display_values:
return None
@@ -61,231 +32,260 @@ class Rules:
@staticmethod
def is_displayable_object(speckle_object: Base) -> bool:
- """Determines if a given Speckle object is displayable.
-
- This method encapsulates the logic for determining if a Speckle object is displayable.
- It checks if the speckle_object has a display value and returns True if it does, otherwise it returns False.
-
- Args:
- speckle_object (Base): The Speckle object to check.
-
- Returns:
- bool: True if the object has a display value, False otherwise.
- """
- # Check for direct displayable state using try_get_display_value
+ """Determines if a given Speckle object is displayable."""
display_values = Rules.try_get_display_value(speckle_object)
if display_values and getattr(speckle_object, "id", None) is not None:
return True
- # Check for displayable state via definition, using try_get_display_value on the definition object
definition = getattr(speckle_object, "definition", None)
if definition:
definition_display_values = Rules.try_get_display_value(definition)
- if (
- definition_display_values
- and getattr(definition, "id", None) is not None
- ):
+ if definition_display_values and getattr(definition, "id", None) is not None:
return True
return False
-
-def get_displayable_objects(flat_list_of_objects: list[Base]) -> list[Base]:
- # modify this lambda from before to use the static method from the Checks class
- return [
- speckle_object
- for speckle_object in flat_list_of_objects
- if Rules.is_displayable_object(speckle_object)
- and getattr(speckle_object, "id", None)
- ]
-
- # and the same logic that could be modified to traverse a tree of objects
-
-
-def filter_objects_by_category(
- speckle_objects: list[Base], category_input: str
-) -> tuple[list[Base], list[Base]]:
- """Filters objects by category value and test.
-
- This function takes a list of Speckle objects, filters out the objects
- with a matching category value and satisfies the test, and returns
- both the matching and non-matching objects.
-
- Args:
- speckle_objects (List[Base]): The list of Speckle objects to filter.
- category_input (str): The category value to match against.
-
- Returns:
- Tuple[List[Base], List[Base]]: A tuple containing two lists:
- - The first list contains objects with matching category and test.
- - The second list contains objects without matching category or test.
- """
- matching_objects = []
- non_matching_objects = []
-
- for obj in speckle_objects:
- if RevitRules.is_category(obj, category_input):
- matching_objects.append(obj)
- else:
- non_matching_objects.append(obj)
-
- return matching_objects, non_matching_objects
-
-
-class RevitRules:
@staticmethod
- def has_parameter(
- speckle_object: Base, parameter_name: str, *_args, **_kwargs
- ) -> bool:
- """Checks if the speckle_object has a Revit parameter with the given name.
+ def get_displayable_objects(flat_list_of_objects: list[Base]) -> list[Base]:
+ """Filters a list of Speckle objects to only include displayable objects."""
+ return [
+ speckle_object
+ for speckle_object in flat_list_of_objects
+ if Rules.is_displayable_object(speckle_object) and getattr(speckle_object, "id", None)
+ ]
- This method checks if the speckle_object has a parameter with the specified name,
- considering the following cases:
- 1. The parameter is a named property at the root object level.
- 2. The parameter is stored as a key in the "parameters" dictionary.
- 3. The parameter is stored as a nested dictionary within the "parameters" property,
- and the parameter name is stored as the value of the "name" property within each nested dictionary.
- If the parameter exists, it returns True; otherwise, it returns False.
+class PropertyRules:
+ """A collection of rules for processing parameters in Speckle objects."""
+
+ @staticmethod
+ def normalize_path(path: str) -> str:
+ """Remove technical path prefixes like 'properties' and 'parameters'."""
+ parts = path.split(".")
+ filtered = [p for p in parts if p.lower() not in ("properties", "parameters")]
+ return ".".join(filtered)
+
+ @staticmethod
+ def convert_revit_boolean(value: Any) -> Any:
+ """Convert Revit-style Yes/No strings to boolean values."""
+ # Handle None case
+ if value is None:
+ return None
+
+ # Already a boolean
+ if isinstance(value, bool):
+ return value
+
+ # Handle string case with proper type checking
+ if isinstance(value, str):
+ value_lower = value.lower()
+ if value_lower == "yes":
+ return True
+ if value_lower == "no":
+ return False
+
+ # Return original value if no conversion applied
+ return value
+
+ @staticmethod
+ def get_obj_value(obj: Any, get_raw: bool = False) -> Any:
+ """Extract appropriate value from an object, handling special cases."""
+ if get_raw:
+ return obj
+
+ # Handle primitive types directly
+ if isinstance(obj, PRIMITIVE_TYPES):
+ return PropertyRules.convert_revit_boolean(obj)
+
+ # Handle dict
+ if isinstance(obj, dict):
+ if "value" in obj:
+ return PropertyRules.convert_revit_boolean(obj["value"])
+ return obj
+
+ # Handle Base object
+ if isinstance(obj, Base):
+ if hasattr(obj, "value"):
+ return PropertyRules.convert_revit_boolean(obj.value)
+ return obj
+
+ return obj
+
+ @staticmethod
+ def search_obj(obj: Any, parts: list[str]) -> tuple[bool, Any]:
+ """Recursively search an object following a path."""
+ if not parts:
+ return True, obj
+
+ current = parts[0]
+ remaining = parts[1:]
+
+ # Handle dict
+ if isinstance(obj, dict):
+ for key in obj:
+ if key.lower() == current.lower():
+ if remaining:
+ return PropertyRules.search_obj(obj[key], remaining)
+ return True, obj[key]
+
+ # Handle Base
+ elif isinstance(obj, Base):
+ for key in obj.get_member_names():
+ if key.lower() == current.lower():
+ if remaining:
+ return PropertyRules.search_obj(getattr(obj, key), remaining)
+ return True, getattr(obj, key)
+
+ return False, None
+
+ @staticmethod
+ def find_property(root: Any, search_path: str, get_raw: bool = False) -> tuple[bool, Any]:
+ """Find a property by searching through nested objects.
Args:
- speckle_object (Base): The Speckle object to check.
- parameter_name (str): The name of the parameter to check for.
- *_args: Extra positional arguments which are ignored.
- **_kwargs: Extra keyword arguments which are ignored.
+ root: The root object to search
+ search_path: Path to the property to find
+ get_raw: Whether to return raw values without conversion
Returns:
- bool: True if the object has the parameter, False otherwise.
+ Tuple of (found: bool, value: Any)
"""
- if hasattr(speckle_object, parameter_name):
- return True
+ # Normalize the search path
+ norm_path = PropertyRules.normalize_path(search_path)
+ parts = norm_path.split(".")
- parameters = cast(Base, getattr(speckle_object, "parameters", None))
+ # Search through object hierarchy
+ def traverse(obj: Any, visited: set[int] | None = None) -> tuple[bool, Any]:
+ if visited is None:
+ visited = set()
- if parameters is None:
- return False
+ # Skip if already visited or not a container type
+ if not isinstance(obj, dict | Base):
+ return False, None
- # the parameters object can function like a dict but isn't one.
- # convert a Base object to a dict
- parameters_dict = {}
+ obj_id = id(obj)
+ if obj_id in visited:
+ return False, None
- for parameter_key in parameters.get_dynamic_member_names():
- parameters_dict[parameter_key] = getattr(parameters, parameter_key, None)
+ visited.add(obj_id)
- if parameter_name in parameters_dict:
- return True
+ # Try direct path match
+ found, value = PropertyRules.search_obj(obj, parts)
+ if found:
+ return True, PropertyRules.get_obj_value(value, get_raw)
- return any(
- getattr(param_value, "name", None) == parameter_name
- for param_value in parameters_dict.values()
- )
+ # Handle dict
+ if isinstance(obj, dict):
+ for key, val in obj.items():
+ if isinstance(val, dict | Base):
+ found, value = traverse(val, visited)
+ if found:
+ return True, value
+
+ # Handle Base
+ elif isinstance(obj, Base):
+ for key in obj.get_member_names():
+ if not key.startswith("_"):
+ val = getattr(obj, key)
+ if isinstance(val, dict | Base):
+ found, value = traverse(val, visited)
+ if found:
+ return True, value
+
+ visited.remove(obj_id) # Clean up visited set
+ return False, None
+
+ return traverse(root)
+
+ @staticmethod
+ def has_parameter(speckle_object: Base, parameter_name: str, *_args, **_kwargs) -> bool:
+ """Check if a parameter exists in the Speckle object."""
+ found, _ = PropertyRules.find_property(speckle_object, parameter_name)
+ return found
@staticmethod
def get_parameter_value(
- speckle_object: Base,
- parameter_name: str,
- default_value: Any = None,
- ) -> Any | None:
- """Retrieves the value of the specified Revit parameter from the speckle_object.
-
- This method checks if the speckle_object has a parameter with the specified name,
- considering the following cases:
- 1. The parameter is a named property at the root object level.
- 2. The parameter is stored as a key in the "parameters" dictionary.
- 3. The parameter is stored as a nested dictionary within the "parameters" property,
- and the parameter name is stored as the value of the "name" property within each nested dictionary.
-
- If the parameter exists and its value is not None or the specified default_value, it returns the value.
- If the parameter does not exist or its value is None or the specified default_value, it returns None.
+ speckle_object: Base,
+ parameter_name: str,
+ default_value: Any = None,
+ get_raw: bool = False,
+ ) -> Any:
+ """Get a parameter value from the Speckle object using strict path matching.
Args:
- speckle_object (Base): The Speckle object to retrieve the parameter value from.
- parameter_name (str): The name of the parameter to retrieve the value for.
- default_value: The default value to compare against. If the parameter value matches this value,
- it will be treated the same as None.
+ speckle_object: The Speckle object to search
+ parameter_name: Exact parameter path to find
+ default_value: Value to return if parameter not found
+ get_raw: Whether to return raw values without conversion
Returns:
- The value of the parameter if it exists and is not None or the specified default_value, or None otherwise.
+ The parameter value if found using exact path matching, otherwise default_value
"""
- # Attempt to retrieve the parameter from the root object level
- value = getattr(speckle_object, parameter_name, None)
- if value not in [None, default_value]:
- return value
-
- # If the "parameters" attribute is a Base object, extract its dynamic members
- parameters = getattr(speckle_object, "parameters", None)
- if parameters is None:
- return None
-
- # Prepare a dictionary of parameter values from the dynamic members of the parameters attribute
- parameters_dict = {
- key: getattr(parameters, key)
- for key in parameters.get_dynamic_member_names()
- }
-
- # Search for a direct match or a nested match in the parameters dictionary
- param_value = parameters_dict.get(parameter_name)
- if param_value is not None:
- if isinstance(param_value, Base):
- # Extract the nested value from a Base object if available
- nested_value = getattr(param_value, "value", None)
- if nested_value not in [None, default_value]:
- return nested_value
- elif param_value not in [None, default_value]:
- return param_value
-
- # Use a generator to find the first matching 'value' for shared parameters stored in Base objects
- return next(
- (
- getattr(p, "value", None)
- for p in parameters_dict.values()
- if isinstance(p, Base) and getattr(p, "name", None) == parameter_name
- ),
- None,
- )
-
- from typing import Any
+ found, value = PropertyRules.find_property(speckle_object, parameter_name, get_raw)
+ return value if found else default_value
@staticmethod
- def is_parameter_value(
- speckle_object: Base, parameter_name: str, value_to_match: Any
- ) -> bool:
- """Checks if the value of the specified parameter matches the given value.
-
- Args:
- speckle_object (Base): The Speckle object to check.
- parameter_name (str): The name of the parameter to check.
- value_to_match (Any): The value to match against.
-
- Returns:
- bool: True if the parameter value matches the given value, False otherwise.
- """
- parameter_value = RevitRules.get_parameter_value(speckle_object, parameter_name)
+ def is_parameter_value(speckle_object: Base, parameter_name: str, value_to_match: Any) -> bool:
+ """Checks if the value of the specified parameter matches the given value."""
+ parameter_value = PropertyRules.get_parameter_value(speckle_object, parameter_name)
return parameter_value == value_to_match
+ @staticmethod
+ def parse_number_from_string(input_string: str):
+ """Attempts to parse a number from a string."""
+ try:
+ return int(input_string)
+ except ValueError:
+ try:
+ return float(input_string)
+ except ValueError:
+ raise ValueError("Input string is not a valid integer or float")
+
+ @staticmethod
+ def is_parameter_value_greater_than(speckle_object: Base, parameter_name: str, threshold: str) -> bool:
+ """Checks if parameter value is greater than threshold."""
+ parameter_value = PropertyRules.get_parameter_value(speckle_object, parameter_name)
+ if parameter_value is None:
+ return False
+ if not isinstance(parameter_value, int | float):
+ raise ValueError(f"Parameter value must be a number, got {type(parameter_value)}")
+ return parameter_value > PropertyRules.parse_number_from_string(threshold)
+
+ @staticmethod
+ def is_parameter_value_less_than(speckle_object: Base, parameter_name: str, threshold: str) -> bool:
+ """Checks if parameter value is less than threshold."""
+ parameter_value = PropertyRules.get_parameter_value(speckle_object, parameter_name)
+ if parameter_value is None:
+ return False
+ if not isinstance(parameter_value, int | float):
+ raise ValueError(f"Parameter value must be a number, got {type(parameter_value)}")
+ return parameter_value < PropertyRules.parse_number_from_string(threshold)
+
+ @staticmethod
+ def is_parameter_value_in_range(speckle_object: Base, parameter_name: str, value_range: str) -> bool:
+ """Checks if parameter value falls within range."""
+ min_value, max_value = value_range.split(",")
+ min_value = PropertyRules.parse_number_from_string(min_value)
+ max_value = PropertyRules.parse_number_from_string(max_value)
+
+ parameter_value = PropertyRules.get_parameter_value(speckle_object, parameter_name)
+ if parameter_value is None:
+ return False
+ if not isinstance(parameter_value, int | float):
+ raise ValueError(f"Parameter value must be a number, got {type(parameter_value)}")
+
+ return min_value <= parameter_value <= max_value
+
@staticmethod
def is_parameter_value_like(
- speckle_object: Base,
- parameter_name: str,
- pattern: str,
- fuzzy: bool = False,
- threshold: float = 0.8,
+ speckle_object: Base,
+ parameter_name: str,
+ pattern: str,
+ fuzzy: bool = False,
+ threshold: float = 0.8,
) -> bool:
- """Checks if the value of the specified parameter matches the given pattern.
-
- Args:
- speckle_object (Base): The Speckle object to check.
- parameter_name (str): The name of the parameter to check.
- pattern (str): The pattern to match against.
- fuzzy (bool): If True, performs fuzzy matching using Levenshtein distance.
- If False (default), performs exact pattern matching using regular expressions.
- threshold (float): The similarity threshold for fuzzy matching (default: 0.8).
- Only applicable when fuzzy=True.
-
- Returns:
- bool: True if the parameter value matches the pattern (exact or fuzzy), False otherwise.
- """
- parameter_value = RevitRules.get_parameter_value(speckle_object, parameter_name)
+ """Checks if parameter value matches pattern."""
+ parameter_value = PropertyRules.get_parameter_value(speckle_object, parameter_name)
if parameter_value is None:
return False
@@ -296,434 +296,210 @@ class RevitRules:
return bool(re.match(pattern, str(parameter_value)))
@staticmethod
- def parse_number_from_string(input_string: str):
- """Attempts to parse an integer or float from a given string.
-
- Args:
- input_string (str): The string containing the number to be parsed.
-
- Returns:
- int or float: The parsed number, or raises ValueError if parsing is not possible.
- """
- try:
- # First try to convert it to an integer
- return int(input_string)
- except ValueError:
- # If it fails to convert to an integer, try to convert to a float
- try:
- return float(input_string)
- except ValueError:
- # Raise an error if neither conversion is possible
- raise ValueError("Input string is not a valid integer or float")
-
- @staticmethod
- def is_parameter_value_greater_than(
- speckle_object: Base, parameter_name: str, threshold: str
- ) -> bool:
- """Checks if the value of the specified parameter is greater than the given threshold.
-
- Args:
- speckle_object (Base): The Speckle object to check.
- parameter_name (str): The name of the parameter to check.
- threshold (Union[int, float]): The threshold value to compare against.
-
- Returns:
- bool: True if the parameter value is greater than the threshold, False otherwise.
- """
- parameter_value = RevitRules.get_parameter_value(speckle_object, parameter_name)
- if parameter_value is None:
- return False
-
- if not isinstance(parameter_value, int | float):
- raise ValueError(
- f"Parameter value must be a number, got {type(parameter_value)}"
- )
- return parameter_value > RevitRules.parse_number_from_string(threshold)
-
- @staticmethod
- def is_parameter_value_less_than(
- speckle_object: Base, parameter_name: str, threshold: str
- ) -> bool:
- """Checks if the value of the specified parameter is less than the given threshold.
-
- Args:
- speckle_object (Base): The Speckle object to check.
- parameter_name (str): The name of the parameter to check.
- threshold (Union[int, float]): The threshold value to compare against.
-
- Returns:
- bool: True if the parameter value is less than the threshold, False otherwise.
- """
- parameter_value = RevitRules.get_parameter_value(speckle_object, parameter_name)
- if parameter_value is None:
- return False
- if not isinstance(parameter_value, int | float):
- raise ValueError(
- f"Parameter value must be a number, got {type(parameter_value)}"
- )
- return parameter_value < RevitRules.parse_number_from_string(threshold)
-
- @staticmethod
- def is_parameter_value_in_range(
- speckle_object: Base, parameter_name: str, range: str
- ) -> bool:
- """Checks if the value of the specified parameter falls within the given range.
-
- Args:
- speckle_object (Base): The Speckle object to check.
- parameter_name (str): The name of the parameter to check.
- range (str): The range to check against, in the format "min_value, max_value".
-
- Returns:
- bool: True if the parameter value falls within the range (inclusive), False otherwise.
- """
- min_value, max_value = range.split(",")
- min_value = RevitRules.parse_number_from_string(min_value)
- max_value = RevitRules.parse_number_from_string(max_value)
-
- parameter_value = RevitRules.get_parameter_value(speckle_object, parameter_name)
- if parameter_value is None:
- return False
- if not isinstance(parameter_value, int | float):
- raise ValueError(
- f"Parameter value must be a number, got {type(parameter_value)}"
- )
-
- return min_value <= parameter_value <= max_value
-
- @staticmethod
- def is_parameter_value_in_range_expanded(
- speckle_object: Base,
- parameter_name: str,
- min_value: int | float,
- max_value: int | float,
- inclusive: bool = True,
- ) -> bool:
- """Checks if the value of the specified parameter falls within the given range.
-
- Args:
- speckle_object (Base): The Speckle object to check.
- parameter_name (str): The name of the parameter to check.
- min_value (Union[int, float]): The minimum value of the range.
- max_value (Union[int, float]): The maximum value of the range.
- inclusive (bool): If True (default), the range is inclusive (min <= value <= max).
- If False, the range is exclusive (min < value < max).
-
- Returns:
- bool: True if the parameter value falls within the range (inclusive), False otherwise.
- """
- parameter_value = RevitRules.get_parameter_value(speckle_object, parameter_name)
- if parameter_value is None:
- return False
- if not isinstance(parameter_value, int | float):
- raise ValueError(
- f"Parameter value must be a number, got {type(parameter_value)}"
- )
-
- return (
- min_value <= parameter_value <= max_value
- if inclusive
- else min_value < parameter_value < max_value
- )
-
- @staticmethod
- def is_parameter_value_in_list(
- speckle_object: Base, parameter_name: str, value_list: list[Any]
- ) -> bool:
- """Checks if the value of the specified parameter is present in the given list of values.
-
- Args:
- speckle_object (Base): The Speckle object to check.
- parameter_name (str): The name of the parameter to check.
- value_list (List[Any]): The list of values to check against.
-
- Returns:
- bool: True if the parameter value is found in the list, False otherwise.
- """
- parameter_value = RevitRules.get_parameter_value(speckle_object, parameter_name)
+ def is_parameter_value_in_list(speckle_object: Base, parameter_name: str, value_list: list[Any] | str) -> bool:
+ """Checks if parameter value is in list."""
+ parameter_value = PropertyRules.get_parameter_value(speckle_object, parameter_name)
if isinstance(value_list, str):
- value_list = [value.strip() for value in value_list.split(",")]
+ value_list = [v.strip() for v in value_list.split(",") if v.strip()]
- # parameter_value is effectively Any type, so to find its value in the value_list
def is_value_in_list(value: Any, my_list: Any) -> bool:
- # Ensure that my_list is actually a list
if isinstance(my_list, list):
return value in my_list or str(value) in my_list
- else:
- speckle_print(f"Expected a list, got {type(my_list)} instead.")
- return False
+ return False
return is_value_in_list(parameter_value, value_list)
+ @staticmethod
+ def _check_boolean_value(value: Any, values_to_match: tuple[str, ...]) -> bool:
+ """Check if a value matches any target value in expected format."""
+ if isinstance(value, bool):
+ return value is (True if "true" in values_to_match else False)
+
+ if isinstance(value, str):
+ return value.lower() in values_to_match
+
+ return False
+
@staticmethod
def is_parameter_value_true(speckle_object: Base, parameter_name: str) -> bool:
- """Checks if the value of the specified parameter is True.
-
- Args:
- speckle_object (Base): The Speckle object to check.
- parameter_name (str): The name of the parameter to check.
-
- Returns:
- bool: True if the parameter value is True, False otherwise.
- """
- parameter_value = RevitRules.get_parameter_value(speckle_object, parameter_name)
- return parameter_value is True
+ """Check if parameter value represents true."""
+ parameter_value = PropertyRules.get_parameter_value(speckle_object, parameter_name)
+ return PropertyRules._check_boolean_value(parameter_value, ("yes", "true", "1"))
@staticmethod
def is_parameter_value_false(speckle_object: Base, parameter_name: str) -> bool:
- """Checks if the value of the specified parameter is False.
-
- Args:
- speckle_object (Base): The Speckle object to check.
- parameter_name (str): The name of the parameter to check.
-
- Returns:
- bool: True if the parameter value is False, False otherwise.
- """
- parameter_value = RevitRules.get_parameter_value(speckle_object, parameter_name)
- return parameter_value is False
+ """Check if parameter value represents false."""
+ parameter_value = PropertyRules.get_parameter_value(speckle_object, parameter_name)
+ return PropertyRules._check_boolean_value(parameter_value, ("no", "false", "0"))
@staticmethod
def has_category(speckle_object: Base) -> bool:
- """Checks if the speckle_object has a 'category' parameter.
-
- This method checks if the speckle_object has a 'category' parameter.
- If the 'category' parameter exists, it returns True; otherwise, it returns False.
-
- Args:
- speckle_object (Base): The Speckle object to check.
-
- Returns:
- bool: True if the object has the 'category' parameter, False otherwise.
- """
- return RevitRules.has_parameter(speckle_object, "category")
+ """Check if object has category."""
+ return PropertyRules.has_parameter(speckle_object, "category")
@staticmethod
def is_category(speckle_object: Base, category_input: str) -> bool:
- """Checks if the value of the 'category' property matches the given input.
-
- This method checks if the 'category' property of the speckle_object
- matches the given category_input. If they match, it returns True;
- otherwise, it returns False.
-
- Args:
- speckle_object (Base): The Speckle object to check.
- category_input (str): The category value to compare against.
-
- Returns:
- bool: True if the 'category' property matches the input, False otherwise.
- """
- category_value = RevitRules.get_parameter_value(speckle_object, "category")
+ """Check if object matches category."""
+ category_value = PropertyRules.get_parameter_value(speckle_object, "category")
return category_value == category_input
@staticmethod
def get_category_value(speckle_object: Base) -> str:
- """Retrieves the value of the 'category' parameter from the speckle_object.
+ """Get object's category value."""
+ return PropertyRules.get_parameter_value(speckle_object, "category")
- This method retrieves the value of the 'category' parameter from the speckle_object.
- If the 'category' parameter exists and its value is not None, it returns the value.
- If the 'category' parameter does not exist or its value is None, it returns an empty string.
+ @staticmethod
+ def _try_boolean_comparison(value1: Any, value2: Any, allow_yes_no: bool) -> tuple[bool, bool]:
+ """Attempts to compare two values as booleans."""
+
+ def strict_convert_boolean(value: Any) -> Any:
+ """Convert 'True'/'False' strings to booleans, and use `convert_revit_boolean` for Yes/No."""
+ if value is None:
+ return None
+ if isinstance(value, bool):
+ return value
+ if isinstance(value, str):
+ value_lower = value.strip().lower()
+ if value_lower == "true":
+ return True
+ if value_lower == "false":
+ return False
+ # Use convert_revit_boolean for Yes/No conversion
+ return PropertyRules.convert_revit_boolean(value) if allow_yes_no else value
+
+ return value
+
+ bool1 = strict_convert_boolean(value1)
+ bool2 = strict_convert_boolean(value2)
+
+ # If both are valid booleans, compare them
+ if isinstance(bool1, bool) and isinstance(bool2, bool):
+ return True, bool1 == bool2
+
+ return False, False
+
+ @staticmethod
+ def _compare_values(
+ value1: Any,
+ value2: Any,
+ case_sensitive: bool = False,
+ tolerance: float = 1e-6,
+ allow_yes_no_bools: bool = True,
+ use_exact: bool = False,
+ ) -> bool:
+ """Core logic for comparing two values with type handling and tolerance.
Args:
- speckle_object (Base): The Speckle object to retrieve the 'category' parameter value from.
+ value1: First value to compare
+ value2: Second value to compare
+ case_sensitive: Whether to perform case-sensitive string comparison
+ tolerance: Tolerance for floating point comparisons
+ allow_yes_no_bools: Whether to convert Yes/No strings to booleans when comparing with boolean values
+ use_exact: Whether to use exact equality for numeric comparisons
+ Returns:
+ bool: True if values are considered equal, False otherwise
+ """
+ # Try boolean comparison first
+ can_compare, result = PropertyRules._try_boolean_comparison(value1, value2, allow_yes_no_bools)
+ if can_compare:
+ return result
+
+ # Handle case where one value is a string that can be interpreted as a number
+ if isinstance(value1, str) and value1.replace(".", "", 1).isdigit():
+ value1 = float(value1)
+ if isinstance(value2, str) and value2.replace(".", "", 1).isdigit():
+ value2 = float(value2)
+
+ # For strings: Allow case insensitivity if specified
+ if isinstance(value1, str) and isinstance(value2, str):
+ if not case_sensitive:
+ return value1.lower() == value2.lower()
+ return value1 == value2
+
+ # For floats and ints, check using math.isclose for floating-point precision
+ if isinstance(value1, float | int) and isinstance(value2, float | int):
+ if use_exact:
+ return value1 == value2 # Strict equality for identical comparisons
+ return math.isclose(value1, value2, abs_tol=tolerance)
+
+ # Fallback: Use regular equality for other cases
+ return value1 == value2
+
+ @staticmethod
+ def is_equal_value(
+ speckle_object: Base,
+ parameter_name: str,
+ value_to_match: Any,
+ case_sensitive: bool = False,
+ tolerance: float = 1e-6,
+ ) -> bool:
+ """Compares a parameter value from a Speckle object with the provided value.
+
+ Args:
+ speckle_object (Base): The Speckle object containing the parameter
+ parameter_name (str): Name of the parameter to compare
+ value_to_match: The value to compare against (float, string, int, etc.)
+ case_sensitive (bool): Whether to perform case-sensitive comparison for strings
+ tolerance (float): Tolerance for floating point comparisons
Returns:
- str: The value of the 'category' parameter if it exists and is not None, or an empty string otherwise.
+ bool: True if values are considered equal, False otherwise
"""
- return RevitRules.get_parameter_value(speckle_object, "category")
+ parameter_value = PropertyRules.get_parameter_value(speckle_object, parameter_name)
+ if parameter_value is None:
+ return False
-
-# Mapping of input predicates to the corresponding methods in RevitRules
-input_predicate_mapping = {
- "exists": "has_parameter",
- "matches": "is_parameter_value",
- "greater than": "is_parameter_value_greater_than",
- "less than": "is_parameter_value_less_than",
- "in range": "is_parameter_value_in_range",
- "in list": "is_parameter_value_in_list",
- "equals": "is_parameter_value",
- "true": "is_parameter_value_true",
- "false": "is_parameter_value_false",
- "is like": "is_parameter_value_like",
-}
-
-
-def evaluate_condition(speckle_object: Base, condition: pd.Series) -> bool:
- """Given a Speckle object and a condition, evaluates the condition and returns a boolean value.
- A condition is a pandas Series object with the following keys:
- - 'Property Name': The name of the property to evaluate.
- - 'Predicate': The predicate to use for evaluation.
- - 'Value': The value to compare against.
-
- Args:
- speckle_object (Base): The Speckle object to evaluate.
- condition (pd.Series): The condition to evaluate.
-
- Returns:
- bool: The result of the evaluation. True if the condition is met, False otherwise.
- """
- property_name = condition["Property Name"]
- predicate_key = condition["Predicate"]
- value = condition["Value"]
-
- if predicate_key in input_predicate_mapping:
- method_name = input_predicate_mapping[predicate_key]
- method = getattr(RevitRules, method_name, None)
-
- # speckle_print(f"Checking {property_name} {predicate_key} {value}")
-
- if method:
- check_answer = method(speckle_object, property_name, value)
-
- return check_answer
- return False
-
-
-def process_rule(
- speckle_objects: list[Base], rule_group: pd.DataFrame
-) -> tuple[list[Base], list[Base]]:
- """Processes a set of rules against Speckle objects, returning those that pass and fail.
- The first rule is used as a filter ('WHERE'), and subsequent rules as conditions ('AND').
-
- Args:
- speckle_objects: List of Speckle objects to be processed.
- rule_group: DataFrame defining the filter and conditions.
-
- Returns:
- A tuple of lists containing objects that passed and failed the rule.
- """
- # Extract the 'WHERE' condition and subsequent 'AND' conditions
- filter_condition = rule_group.iloc[0]
- subsequent_conditions = rule_group.iloc[1:]
-
- # get the last row of the rule_group and get the Message and Report Severity
- rule_info = rule_group.iloc[-1]
-
- # Filter objects based on the 'WHERE' condition
- filtered_objects = [
- speckle_object
- for speckle_object in speckle_objects
- if evaluate_condition(speckle_object, filter_condition)
- ]
-
- rule_number = rule_info["Rule Number"]
-
- speckle_print(
- f"{filter_condition['Logic']} {filter_condition['Property Name']} "
- f"{filter_condition['Predicate']} {filter_condition['Value']}"
- )
-
- speckle_print(
- f"{rule_number}: {len(list(filtered_objects))} objects passed the filter."
- )
-
- # Initialize lists for passed and failed objects
- pass_objects, fail_objects = [], []
-
- # Evaluate each filtered object against the 'AND' conditions
- for speckle_object in filtered_objects:
- if all(
- evaluate_condition(speckle_object, cond)
- for _, cond in subsequent_conditions.iterrows()
- ):
- pass_objects.append(speckle_object)
- else:
- fail_objects.append(speckle_object)
-
- return pass_objects, fail_objects
-
-
-def apply_rules_to_objects(
- speckle_objects: list[Base],
- rules_df: pd.DataFrame,
- automate_context: AutomationContext,
-) -> dict[str, tuple[list[Base], list[Base]]]:
- """Applies defined rules to a list of objects and updates the automate context based on the results.
-
- Args:
- speckle_objects (List[Base]): The list of objects to which rules are applied.
- rules_df (pd.DataFrame): The DataFrame containing rule definitions.
- automate_context (Any): Context manager for attaching rule results.
- """
- grouped_rules = rules_df.groupby("Rule Number")
-
- grouped_results = {}
-
- for rule_id, rule_group in grouped_rules:
- rule_id_str = str(rule_id) # Convert rule_id to string
-
- # Ensure rule_group has necessary columns
- if (
- "Message" not in rule_group.columns
- or "Report Severity" not in rule_group.columns
- ):
- continue # Or raise an exception if these columns are mandatory
-
- pass_objects, fail_objects = process_rule(speckle_objects, rule_group)
-
- attach_results(
- pass_objects, rule_group.iloc[-1], rule_id_str, automate_context, True
- )
- attach_results(
- fail_objects, rule_group.iloc[-1], rule_id_str, automate_context, False
+ return PropertyRules._compare_values(
+ parameter_value, value_to_match, case_sensitive, tolerance, allow_yes_no_bools=True
)
- grouped_results[rule_id_str] = (pass_objects, fail_objects)
+ @staticmethod
+ def is_not_equal_value(
+ speckle_object: Base,
+ parameter_name: str,
+ value_to_match: Any,
+ case_sensitive: bool = False,
+ tolerance: float = 1e-6,
+ ) -> bool:
+ """Checks if a parameter value from a Speckle object is not equal to the provided value.
- # return pass_objects, fail_objects for each rule
- return grouped_results
+ Args:
+ speckle_object (Base): The Speckle object containing the parameter
+ parameter_name (str): Name of the parameter to compare
+ value_to_match: The value to compare against (float, string, int, etc.)
+ case_sensitive (bool): Whether to perform case-sensitive comparison for strings
+ tolerance (float): Tolerance for floating point comparisons
+ Returns:
+ bool: True if values are not equal or parameter doesn't exist, False if they are equal
+ """
+ parameter_value = PropertyRules.get_parameter_value(speckle_object, parameter_name)
+ if parameter_value is None:
+ return True # Non-existent parameters are considered not equal
-def attach_results(
- speckle_objects: list[Base],
- rule_info: pd.Series,
- rule_id: str,
- context: AutomationContext,
- passed: bool,
-) -> None:
- """Attaches the results of a rule to the objects in the context.
-
- Args:
- speckle_objects (List[Base]): The list of objects to which the rule was applied.
- rule_info (pd.Series): The information about the rule.
- rule_id (str): The ID of the rule.
- context (AutomationContext): The context manager for attaching results.
- passed (bool): Whether the rule passed or failed.
- """
- if not speckle_objects:
- return
-
- # Create structured metadata for onward data analysis uses
- metadata = {
- "rule_id": rule_id,
- "status": "PASS" if passed else "FAIL",
- "severity": rule_info["Report Severity"],
- "rule_message": rule_info["Message"],
- "object_count": len(speckle_objects)
- }
-
- message = f"{rule_info['Message']}"
-
- if not passed:
- speckle_print(rule_info["Report Severity"])
-
- severity = (
- ObjectResultLevel.WARNING
- if rule_info["Report Severity"].capitalize() in ["Warning", "Warn"]
- else ObjectResultLevel.ERROR
+ return not PropertyRules._compare_values(
+ parameter_value, value_to_match, case_sensitive, tolerance, allow_yes_no_bools=True
)
- context.attach_result_to_objects(
- category=f"Rule {rule_id}",
- object_ids=[speckle_object.id for speckle_object in speckle_objects],
- message=message,
- level=severity,
- metadata=metadata,
- )
- else:
- context.attach_info_to_objects(
- category=f"Rule {rule_id}",
- object_ids=[speckle_object.id for speckle_object in speckle_objects],
- message=message,
- metadata=metadata,
+
+ @staticmethod
+ def is_identical_value(speckle_object: Base, parameter_name: str, value_to_match: Any) -> bool:
+ """Checks if a parameter value from a Speckle object is exactly identical to the provided value.
+
+ Uses strict comparison with no type coercion, case sensitivity, or Yes/No conversion.
+
+ Args:
+ speckle_object (Base): The Speckle object containing the parameter
+ parameter_name (str): Name of the parameter to compare
+ value_to_match: The value to compare against
+
+ Returns:
+ bool: True if values are identical, False otherwise
+ """
+ parameter_value = PropertyRules.get_parameter_value(speckle_object, parameter_name, get_raw=True)
+ if parameter_value is None:
+ return False
+
+ return PropertyRules._compare_values(
+ parameter_value, value_to_match, case_sensitive=True, tolerance=0, allow_yes_no_bools=False, use_exact=True
)
diff --git a/src/rules_old.py b/src/rules_old.py
new file mode 100644
index 0000000..e445931
--- /dev/null
+++ b/src/rules_old.py
@@ -0,0 +1,756 @@
+# import re
+# from typing import Any
+#
+# from Levenshtein import ratio
+# from specklepy.objects.base import Base
+#
+# from src.helpers import get_item, has_item, speckle_print
+# from src.inputs import PropertyMatchMode
+
+# We're going to define a set of rules that will allow us to filter and
+# process parameters in our Speckle objects. These rules will be encapsulated
+# in a class called `ParameterRules`.
+
+
+# class Rules:
+# """A collection of rules for processing properties in Speckle objects.
+#
+# Simple rules can be straightforwardly implemented as static methods that
+# return boolean value to be used either as a filter or a condition.
+# These can then be abstracted into returning lambda functions that we can
+# use in our main processing logic. By encapsulating these rules, we can easily
+# extend or modify them in the future.
+# """
+#
+# @staticmethod
+# def try_get_display_value(
+# speckle_object: Base,
+# ) -> list[Base] | None:
+# """Try fetching the display value from a Speckle object.
+#
+# This method encapsulates the logic for attempting to retrieve the display value from a
+# Speckle object. It returns a list containing the display values if found,
+# otherwise it returns None.
+#
+# Args:
+# speckle_object (Base): The Speckle object to extract the display value from.
+#
+# Returns:
+# Optional[List[Base]]: A list containing the display values.
+# If no display value is found, returns None.
+# """
+# # Attempt to get the display value from the speckle_object
+# raw_display_value = getattr(speckle_object, "displayValue", None) or getattr(
+# speckle_object, "@displayValue", None
+# )
+#
+# # If no display value found, return None
+# if raw_display_value is None:
+# return None
+#
+# # If display value found, filter out non-Base objects
+# display_values = [value for value in raw_display_value if isinstance(value, Base)]
+#
+# # If no valid display values found, return None
+# if not display_values:
+# return None
+#
+# return display_values
+#
+# @staticmethod
+# def is_displayable_object(speckle_object: Base) -> bool:
+# """Determines if a given Speckle object is displayable.
+#
+# This method encapsulates the logic for determining if a Speckle object is displayable.
+# It checks if the speckle_object has a display value and returns True if it does, otherwise it returns False.
+#
+# Args:
+# speckle_object (Base): The Speckle object to check.
+#
+# Returns:
+# bool: True if the object has a display value, False otherwise.
+# """
+# # Check for direct displayable state using try_get_display_value
+# display_values = Rules.try_get_display_value(speckle_object)
+# if display_values and getattr(speckle_object, "id", None) is not None:
+# return True
+#
+# # Check for displayable state via definition, using try_get_display_value on the definition object
+# definition = getattr(speckle_object, "definition", None)
+# if definition:
+# definition_display_values = Rules.try_get_display_value(definition)
+# if definition_display_values and getattr(definition, "id", None) is not None:
+# return True
+#
+# return False
+#
+# @staticmethod
+# def get_displayable_objects(flat_list_of_objects: list[Base]) -> list[Base]:
+# """Filters a list of Speckle objects to only include displayable objects.
+#
+# This function takes a list of Speckle objects and filters out the objects that are displayable.
+# It returns a list containing only the displayable objects.
+#
+# Args:
+# flat_list_of_objects (List[Base]): The list of Speckle objects to filter.
+# """
+# return [
+# speckle_object
+# for speckle_object in flat_list_of_objects
+# if Rules.is_displayable_object(speckle_object) and getattr(speckle_object, "id", None)
+# ]
+#
+#
+# class PropertyRules:
+# """A collection of rules for processing Revit parameters in Speckle objects."""
+#
+# @staticmethod
+# def has_parameter(speckle_object: Base, parameter_name: str, *_args, **_kwargs) -> bool:
+# """Checks if the speckle_object has a parameter with the given name."""
+# found, _ = ParameterSearch.lookup_parameter(speckle_object, parameter_name)
+# return found
+#
+# @staticmethod
+# def get_parameter_value(
+# speckle_object: Base,
+# parameter_name: str,
+# match_mode: PropertyMatchMode = PropertyMatchMode.MIXED,
+# default_value: Any = None,
+# ) -> Any:
+# """Gets the value of a parameter if it exists."""
+# found, value = ParameterSearch.lookup_parameter(speckle_object, parameter_name, match_mode)
+# return value if found else default_value
+#
+# @staticmethod
+# def is_v3(speckle_object: Base) -> bool:
+# """Determines if a Speckle object uses v3 parameter structure.
+#
+# Args:
+# speckle_object (Base): The Speckle object to check
+#
+# Returns:
+# bool: True if object uses v3 structure, False otherwise
+# """
+# properties = get_item(speckle_object, "properties")
+# return bool(properties and has_item(properties, "Parameters"))
+#
+# # @staticmethod
+# # def has_parameter(speckle_object: Base, parameter_name: str, *_args, **_kwargs) -> bool:
+# # """Checks if the speckle_object has a Revit parameter with the given name.
+# #
+# # First checks direct properties, then determines if it's a v2 or v3 object structure
+# # and searches in the appropriate parameter hierarchy.
+# #
+# # Args:
+# # speckle_object (Base): The Speckle object to check.
+# # parameter_name (str): The name of the parameter to check for.
+# # *_args: Extra positional arguments which are ignored.
+# # **_kwargs: Extra keyword arguments which are ignored.
+# #
+# # Returns:
+# # bool: True if the object has the parameter, False otherwise.
+# # """
+# # # Check direct property first regardless of version
+# # if has_item(speckle_object, parameter_name):
+# # return True
+# #
+# # if PropertyRules.is_v3(speckle_object):
+# # properties = get_item(speckle_object, "properties")
+# # parameters = get_item(properties, "Parameters")
+# # if parameters:
+# #
+# # def search_v3_params(params: dict, search_name: str) -> bool:
+# # for key, value in params.items():
+# # if isinstance(value, dict):
+# # # Check direct name match
+# # if key.lower() == search_name.lower():
+# # return True
+# # # Check nested parameters
+# # if search_v3_params(value, search_name):
+# # return True
+# # return False
+# #
+# # return search_v3_params(parameters, parameter_name)
+# # else:
+# # # Handle v2 structure
+# # parameters = get_item(speckle_object, "parameters")
+# # if not parameters:
+# # return False
+# #
+# # # Check direct parameter name match
+# # if has_item(parameters, parameter_name):
+# # return True
+# #
+# # # Check nested parameters with name property
+# # def check_nested_name(value: Any) -> bool:
+# # if isinstance(value, dict):
+# # return get_item(value, "name") == parameter_name
+# # return get_item(value, "name") == parameter_name if hasattr(value, "name") else False
+# #
+# # return any(check_nested_name(param_value) for param_value in parameters.values() if param_value is not None)
+# #
+# # return False
+# #
+# # @staticmethod
+# # def get_parameter_value(
+# # speckle_object: Base,
+# # parameter_name: str,
+# # match_mode: PropertyMatchMode = PropertyMatchMode.MIXED,
+# # default_value: Any = None,
+# # ) -> Any | None:
+# # """Retrieves the value of the specified parameter from the speckle_object.
+# #
+# # First checks direct properties, then determines if it's a v2 or v3 object structure
+# # and retrieves from the appropriate parameter hierarchy.
+# #
+# # Args:
+# # speckle_object (Base): The Speckle object to retrieve the parameter value from.
+# # parameter_name (str): The name of the parameter to retrieve the value for.
+# # match_mode (PropertyMatchMode): The matching mode to use for parameter lookup
+# # default_value: The default value to return if parameter not found.
+# #
+# # Returns:
+# # The value of the parameter if found, else default_value.
+# # """
+# # # Check direct property first regardless of version
+# # if has_item(speckle_object, parameter_name):
+# # value = get_item(speckle_object, parameter_name)
+# # return value if value is not None else default_value
+# #
+# # if PropertyRules.is_v3(speckle_object):
+# # return PropertyRules.get_v3_parameter(speckle_object, parameter_name, match_mode, default_value)
+# # else:
+# # return PropertyRules.get_v2_parameter(speckle_object, parameter_name, match_mode, default_value)
+#
+# # @staticmethod
+# # def get_v2_parameter(obj: Base, name: str, mode: PropertyMatchMode, default: Any) -> Any:
+# # """Get parameter value from v2 Speckle object structure.
+# #
+# # Args:
+# # obj: Speckle object to get parameter from
+# # name: Parameter name to retrieve
+# # mode: Match mode for parameter lookup
+# # default: Default value if parameter not found
+# #
+# # Returns:
+# # Parameter value if found, else default
+# # """
+# # parameters = get_item(obj, "parameters")
+# # if not parameters:
+# # return default
+# #
+# # if mode == PropertyMatchMode.STRICT:
+# # return PropertyRules.strict_parameter_lookup(name, parameters, default)
+# #
+# # def search_params(param_dict: dict, search_name: str, fuzzy: bool) -> Any:
+# # for key, value in param_dict.items():
+# # key_match = (key.lower() == search_name.lower()) or (fuzzy and search_name.lower() in key.lower())
+# # if key_match:
+# # # Handle both direct values and nested parameter objects
+# # return get_item(value, "value", value)
+# # return None
+# #
+# # result = search_params(parameters, name, mode == PropertyMatchMode.FUZZY)
+# # return result if result is not None else default
+# #
+# # @staticmethod
+# # def get_v3_parameter(obj: Base, name: str, mode: PropertyMatchMode, default: Any) -> Any:
+# # """Get parameter value from v3 Speckle object structure.
+# #
+# # Args:
+# # obj: Speckle object to get parameter from
+# # name: Parameter name to retrieve
+# # mode: Match mode for parameter lookup
+# # default: Default value if parameter not found
+# #
+# # Returns:
+# # Parameter value if found, else default
+# # """
+# # properties = get_item(obj, "properties")
+# # if not properties or not has_item(properties, "Parameters"):
+# # return default
+# #
+# # parameters = get_item(properties, "Parameters")
+# # if not parameters:
+# # return default
+# #
+# # if mode == PropertyMatchMode.STRICT:
+# # return PropertyRules.strict_parameter_lookup(name, parameters, default)
+# #
+# # def search_nested(data: dict, search_name: str, fuzzy: bool) -> Any:
+# # for nested_key, value in data.items():
+# # if isinstance(value, dict):
+# # key_match = (nested_key.lower() == search_name.lower()) or (
+# # fuzzy and search_name.lower() in nested_key.lower()
+# # )
+# #
+# # if key_match and has_item(value, "value"):
+# # return get_item(value, "value")
+# #
+# # nested_result = search_nested(value, search_name, fuzzy)
+# # if nested_result is not None:
+# # return nested_result
+# # return None
+# #
+# # result = search_nested(parameters, name, mode == PropertyMatchMode.FUZZY)
+# # return result if result is not None else default
+# #
+# # @staticmethod
+# # def strict_parameter_lookup(name: str, parameters: dict, default: Any) -> Any:
+# # """Perform strict parameter lookup following exact path.
+# #
+# # Args:
+# # name: Parameter path (dot separated)
+# # parameters: Parameters dictionary
+# # default: Default value if not found
+# #
+# # Returns:
+# # Parameter value if found, else default
+# # """
+# # path_parts = name.split(".")
+# # current = parameters
+# #
+# # for part in path_parts:
+# # if not current or not isinstance(current, dict):
+# # return default
+# #
+# # # Find exact case-insensitive match
+# # key = next((k for k in current.keys() if k.lower() == part.lower()), None)
+# # if not key:
+# # return default
+# #
+# # current = get_item(current, key)
+# #
+# # # Handle both direct values and parameter objects
+# # if isinstance(current, dict):
+# # return get_item(current, "value", current)
+# # return current
+#
+# @staticmethod
+# def is_parameter_value(speckle_object: Base, parameter_name: str, value_to_match: Any) -> bool:
+# """Checks if the value of the specified parameter matches the given value.
+#
+# Args:
+# speckle_object (Base): The Speckle object to check.
+# parameter_name (str): The name of the parameter to check.
+# value_to_match (Any): The value to match against.
+#
+# Returns:
+# bool: True if the parameter value matches the given value, False otherwise.
+# """
+# parameter_value = PropertyRules.get_parameter_value(speckle_object, parameter_name)
+# return parameter_value == value_to_match
+#
+# @staticmethod
+# def is_parameter_value_like(
+# speckle_object: Base,
+# parameter_name: str,
+# pattern: str,
+# fuzzy: bool = False,
+# threshold: float = 0.8,
+# ) -> bool:
+# """Checks if the value of the specified parameter matches the given pattern.
+#
+# Args:
+# speckle_object (Base): The Speckle object to check.
+# parameter_name (str): The name of the parameter to check.
+# pattern (str): The pattern to match against.
+# fuzzy (bool): If True, performs fuzzy matching using Levenshtein distance.
+# If False (default), performs exact pattern matching using regular expressions.
+# threshold (float): The similarity threshold for fuzzy matching (default: 0.8).
+# Only applicable when fuzzy=True.
+#
+# Returns:
+# bool: True if the parameter value matches the pattern (exact or fuzzy), False otherwise.
+# """
+# parameter_value = PropertyRules.get_parameter_value(speckle_object, parameter_name)
+# if parameter_value is None:
+# return False
+#
+# if fuzzy:
+# similarity = ratio(str(parameter_value), pattern)
+# return similarity >= threshold
+# else:
+# return bool(re.match(pattern, str(parameter_value)))
+#
+# @staticmethod
+# def parse_number_from_string(input_string: str):
+# """Attempts to parse an integer or float from a given string.
+#
+# Args:
+# input_string (str): The string containing the number to be parsed.
+#
+# Returns:
+# int or float: The parsed number, or raises ValueError if parsing is not possible.
+# """
+# try:
+# # First try to convert it to an integer
+# return int(input_string)
+# except ValueError:
+# # If it fails to convert to an integer, try to convert to a float
+# try:
+# return float(input_string)
+# except ValueError:
+# # Raise an error if neither conversion is possible
+# raise ValueError("Input string is not a valid integer or float")
+#
+# @staticmethod
+# def is_parameter_value_greater_than(speckle_object: Base, parameter_name: str, threshold: str) -> bool:
+# """Checks if the value of the specified parameter is greater than the given threshold.
+#
+# Args:
+# speckle_object (Base): The Speckle object to check.
+# parameter_name (str): The name of the parameter to check.
+# threshold (Union[int, float]): The threshold value to compare against.
+#
+# Returns:
+# bool: True if the parameter value is greater than the threshold, False otherwise.
+# """
+# parameter_value = PropertyRules.get_parameter_value(speckle_object, parameter_name)
+# if parameter_value is None:
+# return False
+#
+# if not isinstance(parameter_value, int | float):
+# raise ValueError(f"Parameter value must be a number, got {type(parameter_value)}")
+# return parameter_value > PropertyRules.parse_number_from_string(threshold)
+#
+# @staticmethod
+# def is_parameter_value_less_than(speckle_object: Base, parameter_name: str, threshold: str) -> bool:
+# """Checks if the value of the specified parameter is less than the given threshold.
+#
+# Args:
+# speckle_object (Base): The Speckle object to check.
+# parameter_name (str): The name of the parameter to check.
+# threshold (Union[int, float]): The threshold value to compare against.
+#
+# Returns:
+# bool: True if the parameter value is less than the threshold, False otherwise.
+# """
+# parameter_value = PropertyRules.get_parameter_value(speckle_object, parameter_name)
+# if parameter_value is None:
+# return False
+# if not isinstance(parameter_value, int | float):
+# raise ValueError(f"Parameter value must be a number, got {type(parameter_value)}")
+# return parameter_value < PropertyRules.parse_number_from_string(threshold)
+#
+# @staticmethod
+# def is_parameter_value_in_range(speckle_object: Base, parameter_name: str, value_range: str) -> bool:
+# """Checks if the value of the specified parameter falls within the given range.
+#
+# Args:
+# speckle_object (Base): The Speckle object to check.
+# parameter_name (str): The name of the parameter to check.
+# value_range (str): The range to check against, in the format "min_value, max_value".
+#
+# Returns:
+# bool: True if the parameter value falls within the range (inclusive), False otherwise.
+# """
+# min_value, max_value = value_range.split(",")
+# min_value = PropertyRules.parse_number_from_string(min_value)
+# max_value = PropertyRules.parse_number_from_string(max_value)
+#
+# parameter_value = PropertyRules.get_parameter_value(speckle_object, parameter_name)
+# if parameter_value is None:
+# return False
+# if not isinstance(parameter_value, int | float):
+# raise ValueError(f"Parameter value must be a number, got {type(parameter_value)}")
+#
+# return min_value <= parameter_value <= max_value
+#
+# @staticmethod
+# def is_parameter_value_in_range_expanded(
+# speckle_object: Base,
+# parameter_name: str,
+# min_value: int | float,
+# max_value: int | float,
+# inclusive: bool = True,
+# ) -> bool:
+# """Checks if the value of the specified parameter falls within the given range.
+#
+# Args:
+# speckle_object (Base): The Speckle object to check.
+# parameter_name (str): The name of the parameter to check.
+# min_value (Union[int, float]): The minimum value of the range.
+# max_value (Union[int, float]): The maximum value of the range.
+# inclusive (bool): If True (default), the range is inclusive (min <= value <= max).
+# If False, the range is exclusive (min < value < max).
+#
+# Returns:
+# bool: True if the parameter value falls within the range (inclusive), False otherwise.
+# """
+# parameter_value = PropertyRules.get_parameter_value(speckle_object, parameter_name)
+# if parameter_value is None:
+# return False
+# if not isinstance(parameter_value, int | float):
+# raise ValueError(f"Parameter value must be a number, got {type(parameter_value)}")
+#
+# return min_value <= parameter_value <= max_value if inclusive else min_value < parameter_value < max_value
+#
+# @staticmethod
+# def is_parameter_value_in_list(speckle_object: Base, parameter_name: str, value_list: list[Any] | str) -> bool:
+# """Checks if the value of the specified parameter is present in the given list of values.
+#
+# Args:
+# speckle_object (Base): The Speckle object to check.
+# parameter_name (str): The name of the parameter to check.
+# value_list (List[Any]): The list of values to check against.
+#
+# Returns:
+# bool: True if the parameter value is found in the list, False otherwise.
+# """
+# parameter_value = PropertyRules.get_parameter_value(speckle_object, parameter_name)
+#
+# if isinstance(value_list, str):
+# value_list = [value.strip() for value in value_list.split(",")]
+#
+# # parameter_value is effectively Any type, so to find its value in the value_list
+# def is_value_in_list(value: Any, my_list: Any) -> bool:
+# # Ensure that my_list is actually a list
+# if isinstance(my_list, list):
+# return value in my_list or str(value) in my_list
+# else:
+# speckle_print(f"Expected a list, got {type(my_list)} instead.")
+# return False
+#
+# return is_value_in_list(parameter_value, value_list)
+#
+# @staticmethod
+# def _check_boolean_value(value: Any, values_to_match: tuple[str, ...]) -> bool:
+# """Check if a value matches any target value in expected format."""
+# if isinstance(value, bool):
+# return value is (True if "true" in values_to_match else False)
+#
+# if isinstance(value, str):
+# return value.lower() in values_to_match
+#
+# return False
+#
+# @staticmethod
+# def is_parameter_value_true(speckle_object: Base, parameter_name: str) -> bool:
+# """Check if parameter value represents true (boolean True, 'yes', 'true', '1')."""
+# parameter_value = PropertyRules.get_parameter_value(speckle_object, parameter_name)
+# return PropertyRules._check_boolean_value(parameter_value, ("yes", "true", "1"))
+#
+# @staticmethod
+# def is_parameter_value_false(speckle_object: Base, parameter_name: str) -> bool:
+# """Check if parameter value represents false (boolean False, 'no', 'false', '0')."""
+# parameter_value = PropertyRules.get_parameter_value(speckle_object, parameter_name)
+# return PropertyRules._check_boolean_value(parameter_value, ("no", "false", "0"))
+#
+# @staticmethod
+# def has_category(speckle_object: Base) -> bool:
+# """Checks if the speckle_object has a 'category' parameter.
+#
+# This method checks if the speckle_object has a 'category' parameter.
+# If the 'category' parameter exists, it returns True; otherwise, it returns False.
+#
+# Args:
+# speckle_object (Base): The Speckle object to check.
+#
+# Returns:
+# bool: True if the object has the 'category' parameter, False otherwise.
+# """
+# return PropertyRules.has_parameter(speckle_object, "category")
+#
+# @staticmethod
+# def is_category(speckle_object: Base, category_input: str) -> bool:
+# """Checks if the value of the 'category' property matches the given input.
+#
+# This method checks if the 'category' property of the speckle_object
+# matches the given category_input. If they match, it returns True;
+# otherwise, it returns False.
+#
+# Args:
+# speckle_object (Base): The Speckle object to check.
+# category_input (str): The category value to compare against.
+#
+# Returns:
+# bool: True if the 'category' property matches the input, False otherwise.
+# """
+# category_value = PropertyRules.get_parameter_value(speckle_object, "category")
+# return category_value == category_input
+#
+# @staticmethod
+# def get_category_value(speckle_object: Base) -> str:
+# """Retrieves the value of the 'category' parameter from the speckle_object.
+#
+# This method retrieves the value of the 'category' parameter from the speckle_object.
+# If the 'category' parameter exists and its value is not None, it returns the value.
+# If the 'category' parameter does not exist or its value is None, it returns an empty string.
+#
+# Args:
+# speckle_object (Base): The Speckle object to retrieve the 'category' parameter value from.
+#
+# Returns:
+# str: The value of the 'category' parameter if it exists and is not None, or an empty string otherwise.
+# """
+# return PropertyRules.get_parameter_value(speckle_object, "category")
+#
+#
+# class ParameterSearch:
+# """Unified parameter search functionality for Speckle objects."""
+#
+# @staticmethod
+# def convert_revit_boolean(value: Any) -> Any:
+# """Convert Revit-style Yes/No strings to boolean values.
+#
+# Args:
+# value: The value to potentially convert
+#
+# Returns:
+# bool if value is a Revit boolean string, original value otherwise
+# """
+# if isinstance(value, str):
+# if value.lower() == "yes":
+# return True
+# if value.lower() == "no":
+# return False
+# return value
+#
+# @staticmethod
+# def search_parameters(
+# params: dict, search_name: str, mode: PropertyMatchMode = PropertyMatchMode.STRICT
+# ) -> tuple[bool, Any]:
+# """Search for parameters using consistent matching logic.
+#
+# Supports flexible property chain matching that can find paths like "Instance Parameters.Dimensions.Length"
+# within longer chains like "properties.Parameters.Instance Parameters.Dimensions.Length.value".
+# Uses STRICT matching by default for more predictable results.
+#
+# Args:
+# params: Parameter dictionary to search
+# search_name: Name of parameter to find, can be dot-separated chain
+# mode: Matching mode to use (STRICT by default, or FUZZY/MIXED for looser matching)
+#
+# Returns:
+# Tuple of (value_found: bool, value: Any)
+# """
+#
+# def matches_name(match_key: str, target: str, match_mode: PropertyMatchMode) -> bool:
+# if match_mode == PropertyMatchMode.STRICT:
+# return match_key.lower() == target.lower()
+# elif match_mode == PropertyMatchMode.FUZZY:
+# return target.lower() in match_key.lower()
+# else: # MIXED mode
+# return match_key.lower() == target.lower() or target.lower() in match_key.lower()
+#
+# def try_get_value(obj: Any) -> Any:
+# """Extract value from parameter object or return as is.
+#
+# Handles both dict and Base objects, checking for 'value' property in both cases.
+# Returns the 'value' if found, otherwise returns the original object.
+# """
+# # Handle dictionary objects
+# if isinstance(obj, dict):
+# return obj.get("value", obj)
+#
+# # Handle Base objects
+# if isinstance(obj, Base):
+# return getattr(obj, "value", obj)
+#
+# # For all other types, return as is
+# return obj
+#
+# # First try property chain lookup
+# if "." in search_name:
+# search_parts = search_name.split(".")
+#
+# def try_match_path(current: dict, remaining_search_parts: list[str], depth: int = 0) -> tuple[bool, Any]:
+# if not isinstance(current, dict):
+# return False, None
+#
+# if not remaining_search_parts: # We've matched all parts
+# return True, try_get_value(current)
+#
+# current_search = remaining_search_parts[0]
+#
+# # Try each key at current level
+# for key, item_value in current.items():
+# if matches_name(key, current_search, mode):
+# # Found a match for current part, recurse with rest
+# match_found, result = try_match_path(item_value, remaining_search_parts[1:], depth + 1)
+# if match_found:
+# return True, result
+#
+# # If no match found and value is a dict, try searching deeper
+# if isinstance(item_value, dict):
+# match_found, result = try_match_path(item_value, remaining_search_parts, depth)
+# if match_found:
+# return True, result
+#
+# return False, None
+#
+# try:
+# found, value = try_match_path(params, search_parts)
+# if found:
+# return True, value
+# except Exception:
+# pass # Fall through to recursive search if chain lookup fails
+#
+# # Recursive search through nested dictionaries
+# def recursive_search(data: dict | Base, target: str) -> tuple[bool, Any]:
+# if not isinstance(data, dict | Base):
+# return False, None
+#
+# # Handle both dict and Base objects for iteration
+# if isinstance(data, dict):
+# items = data.items()
+# else:
+# items = [(k, getattr(data, k)) for k in dir(data) if not k.startswith("_")]
+#
+# # First check current level
+# for key, item_value in items:
+# if matches_name(key, target, mode):
+# return True, try_get_value(item_value)
+#
+# # Then check nested levels
+# for _, item_value in items:
+# if isinstance(item_value, dict | Base):
+# item_found, result = recursive_search(item_value, target)
+# if item_found:
+# return True, result
+#
+# return False, None
+#
+# return recursive_search(params, search_name.split(".")[-1] if "." in search_name else search_name)
+#
+# @staticmethod
+# def lookup_parameter(
+# obj: Base, param_name: str, mode: PropertyMatchMode = PropertyMatchMode.MIXED
+# ) -> tuple[bool, Any]:
+# """Unified parameter lookup for both checking existence and getting values.
+#
+# Args:
+# obj: Speckle object to search
+# param_name: Parameter name to find
+# mode: Matching mode to use
+#
+# Returns:
+# Tuple of (found: bool, value: Any)
+# """
+# # Check direct property first
+# if has_item(obj, param_name):
+# value = get_item(obj, param_name)
+# # Check if the direct property has a value field
+# if isinstance(value, dict) and "value" in value:
+# return True, value["value"]
+# return True, value
+#
+# # Handle v3 structure
+# if PropertyRules.is_v3(obj):
+# properties = get_item(obj, "properties")
+# if not properties or not has_item(properties, "Parameters"):
+# return False, None
+#
+# parameters = get_item(properties, "Parameters")
+# if not parameters:
+# return False, None
+#
+# return ParameterSearch.search_parameters(parameters, param_name, mode)
+#
+# # Handle v2 structure
+# parameters = get_item(obj, "parameters")
+# if not parameters:
+# return False, None
+#
+# return ParameterSearch.search_parameters(parameters, param_name, mode)
diff --git a/src/spreadsheet.py b/src/spreadsheet.py
index 265d683..f9880a3 100644
--- a/src/spreadsheet.py
+++ b/src/spreadsheet.py
@@ -1,7 +1,8 @@
import pandas as pd
+from pandas import DataFrame
-def read_rules_from_spreadsheet(url):
+def read_rules_from_spreadsheet(url: str) -> DataFrame | None:
"""Reads a TSV file from a provided URL and returns a DataFrame.
Args:
@@ -12,7 +13,26 @@ def read_rules_from_spreadsheet(url):
"""
try:
# Since the output is a TSV, we use `pd.read_csv` with `sep='\t'` to specify tab-separated values.
- return pd.read_csv(url, sep="\t")
+ df = pd.read_csv(url, sep="\t")
+ df = convert_mixed_columns(df)
+
+ # Convert columns to appropriate types based on their content.
+ return df
+
except Exception as e:
print(f"Failed to read the TSV from the URL: {e}")
return None
+
+
+def convert_mixed_columns(df):
+ """Converts columns in a DataFrame to appropriate types based on their content.
+
+ Args:
+ df (DataFrame): The DataFrame whose columns are to be converted.
+
+ Returns:
+ DataFrame: The DataFrame with columns converted to appropriate types.
+ """
+ df = df.apply(lambda c: c.astype(object) if any(str(x).replace(".", "", 1).isdigit() for x in c) else c.astype(str))
+
+ return df
diff --git a/test_data/v2_object.json b/test_data/v2_object.json
new file mode 100644
index 0000000..204eb94
--- /dev/null
+++ b/test_data/v2_object.json
@@ -0,0 +1,3085 @@
+[
+ {
+ "id": "cdb18060dc48281909e94f0f1d8d3cc0",
+ "type": "W30(Fc24)",
+ "level": {
+ "id": "83f0777fe353eb77263ca71578e12dcf",
+ "name": "1FL",
+ "units": "mm",
+ "category": "Levels",
+ "elementId": "3150442",
+ "elevation": 0,
+ "worksetId": "0",
+ "createView": true,
+ "parameters": {
+ "id": "43d0efa83cf272385e920a560e7e9ebf",
+ "IFC_GUID": {
+ "id": "ceb8ed674bbdf0e139c95a628bca09e5",
+ "name": "IfcGUID",
+ "units": null,
+ "value": "3xtuTNAO5BSg6cTEbLBATq",
+ "isShared": false,
+ "isReadOnly": false,
+ "speckle_type": "Objects.BuiltElements.Revit.Parameter",
+ "applicationId": null,
+ "applicationUnit": null,
+ "isTypeParameter": false,
+ "totalChildrenCount": 0,
+ "applicationUnitType": null,
+ "applicationInternalName": "IFC_GUID"
+ },
+ "DATUM_TEXT": {
+ "id": "32f5ba880945a5bc78419171ea58cfa6",
+ "name": "Name",
+ "units": null,
+ "value": "1FL",
+ "isShared": false,
+ "isReadOnly": false,
+ "speckle_type": "Objects.BuiltElements.Revit.Parameter",
+ "applicationId": null,
+ "applicationUnit": null,
+ "isTypeParameter": false,
+ "totalChildrenCount": 0,
+ "applicationUnitType": null,
+ "applicationInternalName": "DATUM_TEXT"
+ },
+ "LEVEL_ELEV": {
+ "id": "4e81dd4ac0c395974f54245b438ae147",
+ "name": "Elevation",
+ "units": "mm",
+ "value": 0,
+ "isShared": false,
+ "isReadOnly": false,
+ "speckle_type": "Objects.BuiltElements.Revit.Parameter",
+ "applicationId": null,
+ "applicationUnit": "autodesk.unit.unit:millimeters-1.0.1",
+ "isTypeParameter": false,
+ "totalChildrenCount": 0,
+ "applicationUnitType": null,
+ "applicationInternalName": "LEVEL_ELEV"
+ },
+ "speckle_type": "Base",
+ "applicationId": null,
+ "ELEM_TYPE_PARAM": {
+ "id": "cb42b32c7f51cde44a287ca1bff0982b",
+ "name": "Type",
+ "units": null,
+ "value": "レベル 上表示",
+ "isShared": false,
+ "isReadOnly": false,
+ "speckle_type": "Objects.BuiltElements.Revit.Parameter",
+ "applicationId": null,
+ "applicationUnit": null,
+ "isTypeParameter": false,
+ "totalChildrenCount": 0,
+ "applicationUnitType": null,
+ "applicationInternalName": "ELEM_TYPE_PARAM"
+ },
+ "SYMBOL_ID_PARAM": {
+ "id": "51f0ee3d4bdbed11d72db3d53cdf3706",
+ "name": "Type Id",
+ "units": null,
+ "value": "レベル 上表示",
+ "isShared": false,
+ "isReadOnly": true,
+ "speckle_type": "Objects.BuiltElements.Revit.Parameter",
+ "applicationId": null,
+ "applicationUnit": null,
+ "isTypeParameter": false,
+ "totalChildrenCount": 0,
+ "applicationUnitType": null,
+ "applicationInternalName": "SYMBOL_ID_PARAM"
+ },
+ "DESIGN_OPTION_ID": {
+ "id": "88f4af03d8e3506766765215a5b87813",
+ "name": "Design Option",
+ "units": null,
+ "value": "-1",
+ "isShared": false,
+ "isReadOnly": true,
+ "speckle_type": "Objects.BuiltElements.Revit.Parameter",
+ "applicationId": null,
+ "applicationUnit": null,
+ "isTypeParameter": false,
+ "totalChildrenCount": 0,
+ "applicationUnitType": null,
+ "applicationInternalName": "DESIGN_OPTION_ID"
+ },
+ "ELEM_FAMILY_PARAM": {
+ "id": "5c94a45c58d4bbfd90819146fb5174a8",
+ "name": "Family",
+ "units": null,
+ "value": "レベル 上表示",
+ "isShared": false,
+ "isReadOnly": false,
+ "speckle_type": "Objects.BuiltElements.Revit.Parameter",
+ "applicationId": null,
+ "applicationUnit": null,
+ "isTypeParameter": false,
+ "totalChildrenCount": 0,
+ "applicationUnitType": null,
+ "applicationInternalName": "ELEM_FAMILY_PARAM"
+ },
+ "LEVEL_UP_TO_LEVEL": {
+ "id": "688a38b54fd75e52da54c164508aeb0f",
+ "name": "Story Above",
+ "units": null,
+ "value": "-1",
+ "isShared": false,
+ "isReadOnly": false,
+ "speckle_type": "Objects.BuiltElements.Revit.Parameter",
+ "applicationId": null,
+ "applicationUnit": null,
+ "isTypeParameter": false,
+ "totalChildrenCount": 0,
+ "applicationUnitType": null,
+ "applicationInternalName": "LEVEL_UP_TO_LEVEL"
+ },
+ "SYMBOL_NAME_PARAM": {
+ "id": "fe43cb940741f29b6cd508611db70c0a",
+ "name": "Type Name",
+ "units": null,
+ "value": null,
+ "isShared": false,
+ "isReadOnly": true,
+ "speckle_type": "Objects.BuiltElements.Revit.Parameter",
+ "applicationId": null,
+ "applicationUnit": null,
+ "isTypeParameter": false,
+ "totalChildrenCount": 0,
+ "applicationUnitType": null,
+ "applicationInternalName": "SYMBOL_NAME_PARAM"
+ },
+ "IFC_EXPORT_ELEMENT": {
+ "id": "ac8493ea527ffedf1d7bcf5826dab455",
+ "name": "Export to IFC",
+ "units": null,
+ "value": 0,
+ "isShared": false,
+ "isReadOnly": false,
+ "speckle_type": "Objects.BuiltElements.Revit.Parameter",
+ "applicationId": null,
+ "applicationUnit": null,
+ "isTypeParameter": false,
+ "totalChildrenCount": 0,
+ "applicationUnitType": null,
+ "applicationInternalName": "IFC_EXPORT_ELEMENT"
+ },
+ "totalChildrenCount": 0,
+ "ELEM_CATEGORY_PARAM": {
+ "id": "9ed3143148c3e478c4d5fa4aad0f84cb",
+ "name": "Category",
+ "units": null,
+ "value": "-2000240",
+ "isShared": false,
+ "isReadOnly": true,
+ "speckle_type": "Objects.BuiltElements.Revit.Parameter",
+ "applicationId": null,
+ "applicationUnit": null,
+ "isTypeParameter": false,
+ "totalChildrenCount": 0,
+ "applicationUnitType": null,
+ "applicationInternalName": "ELEM_CATEGORY_PARAM"
+ },
+ "LEVEL_IS_STRUCTURAL": {
+ "id": "7d81c0e17bc7d3826774591634ee068b",
+ "name": "Structural",
+ "units": null,
+ "value": true,
+ "isShared": false,
+ "isReadOnly": false,
+ "speckle_type": "Objects.BuiltElements.Revit.Parameter",
+ "applicationId": null,
+ "applicationUnit": null,
+ "isTypeParameter": false,
+ "totalChildrenCount": 0,
+ "applicationUnitType": null,
+ "applicationInternalName": "LEVEL_IS_STRUCTURAL"
+ },
+ "ELEM_CATEGORY_PARAM_MT": {
+ "id": "73cbfffc73fd323071a9111d157f9a18",
+ "name": "Category",
+ "units": null,
+ "value": "-2000240",
+ "isShared": false,
+ "isReadOnly": true,
+ "speckle_type": "Objects.BuiltElements.Revit.Parameter",
+ "applicationId": null,
+ "applicationUnit": null,
+ "isTypeParameter": false,
+ "totalChildrenCount": 0,
+ "applicationUnitType": null,
+ "applicationInternalName": "ELEM_CATEGORY_PARAM_MT"
+ },
+ "SPECKLE_Classification": {
+ "id": "2138dca3e3a7c852aeaa3fa65e5a5e8c",
+ "name": "SPECKLE_Classification",
+ "units": null,
+ "value": null,
+ "isShared": false,
+ "isReadOnly": false,
+ "speckle_type": "Objects.BuiltElements.Revit.Parameter",
+ "applicationId": null,
+ "applicationUnit": null,
+ "isTypeParameter": false,
+ "totalChildrenCount": 0,
+ "applicationUnitType": null,
+ "applicationInternalName": "SPECKLE_Classification"
+ },
+ "LEVEL_IS_BUILDING_STORY": {
+ "id": "231a4045f2fd0e013b9b45e71ddb653c",
+ "name": "Building Story",
+ "units": null,
+ "value": true,
+ "isShared": false,
+ "isReadOnly": false,
+ "speckle_type": "Objects.BuiltElements.Revit.Parameter",
+ "applicationId": null,
+ "applicationUnit": null,
+ "isTypeParameter": false,
+ "totalChildrenCount": 0,
+ "applicationUnitType": null,
+ "applicationInternalName": "LEVEL_IS_BUILDING_STORY"
+ },
+ "DATUM_VOLUME_OF_INTEREST": {
+ "id": "695f0dbc445b52836935ac062f46de41",
+ "name": "Scope Box",
+ "units": null,
+ "value": "-1",
+ "isShared": false,
+ "isReadOnly": false,
+ "speckle_type": "Objects.BuiltElements.Revit.Parameter",
+ "applicationId": null,
+ "applicationUnit": null,
+ "isTypeParameter": false,
+ "totalChildrenCount": 0,
+ "applicationUnitType": null,
+ "applicationInternalName": "DATUM_VOLUME_OF_INTEREST"
+ },
+ "SYMBOL_FAMILY_NAME_PARAM": {
+ "id": "a52788d3716a07ca198833a2024a2f04",
+ "name": "Family Name",
+ "units": null,
+ "value": null,
+ "isShared": false,
+ "isReadOnly": true,
+ "speckle_type": "Objects.BuiltElements.Revit.Parameter",
+ "applicationId": null,
+ "applicationUnit": null,
+ "isTypeParameter": false,
+ "totalChildrenCount": 0,
+ "applicationUnitType": null,
+ "applicationInternalName": "SYMBOL_FAMILY_NAME_PARAM"
+ },
+ "ELEM_FAMILY_AND_TYPE_PARAM": {
+ "id": "1bbc8fadc19823adb9a9c99e725102c1",
+ "name": "Family and Type",
+ "units": null,
+ "value": "レベル 上表示",
+ "isShared": false,
+ "isReadOnly": false,
+ "speckle_type": "Objects.BuiltElements.Revit.Parameter",
+ "applicationId": null,
+ "applicationUnit": null,
+ "isTypeParameter": false,
+ "totalChildrenCount": 0,
+ "applicationUnitType": null,
+ "applicationInternalName": "ELEM_FAMILY_AND_TYPE_PARAM"
+ },
+ "LEVEL_ROOM_COMPUTATION_HEIGHT": {
+ "id": "e54df704e19c7a0c73431dc943ce4fc3",
+ "name": "Computation Height",
+ "units": "mm",
+ "value": 0,
+ "isShared": false,
+ "isReadOnly": false,
+ "speckle_type": "Objects.BuiltElements.Revit.Parameter",
+ "applicationId": null,
+ "applicationUnit": "autodesk.unit.unit:millimeters-1.0.1",
+ "isTypeParameter": false,
+ "totalChildrenCount": 0,
+ "applicationUnitType": null,
+ "applicationInternalName": "LEVEL_ROOM_COMPUTATION_HEIGHT"
+ }
+ },
+ "speckle_type": "Objects.BuiltElements.Level:Objects.BuiltElements.Revit.RevitLevel",
+ "applicationId": "fbdf8757-2981-4b72-a1a6-74e9551cb51e-0030126a",
+ "referenceOnly": false,
+ "builtInCategory": "OST_Levels",
+ "isRevitLinkedModel": false,
+ "materialQuantities": [],
+ "totalChildrenCount": 0,
+ "revitLinkedModelPath": "C:\\Program Files\\Autodesk\\Revit 2024\\Samples\\サンプル構造.rvt"
+ },
+ "units": "mm",
+ "family": "Basic Wall",
+ "height": 1400,
+ "flipped": false,
+ "baseLine": {
+ "id": "f1e5d19719cd0c6dd7f95cb68e710696",
+ "end": {
+ "x": 22400.000000000015,
+ "y": 20500,
+ "z": -2000.0000000000002,
+ "id": "e95624f6dede918858ee2ac26d04e0ea",
+ "units": "mm",
+ "speckle_type": "Objects.Geometry.Point",
+ "applicationId": null,
+ "totalChildrenCount": 0
+ },
+ "area": 0,
+ "bbox": null,
+ "start": {
+ "x": 22400.000000000007,
+ "y": 15199.999999999998,
+ "z": -2000.0000000000002,
+ "id": "243d9fbf9c56cc8964b0808af2ca6ec5",
+ "units": "mm",
+ "speckle_type": "Objects.Geometry.Point",
+ "applicationId": null,
+ "totalChildrenCount": 0
+ },
+ "units": "mm",
+ "domain": {
+ "id": "88c63fda9f81bcce66810de695592b69",
+ "end": 17.388451443569522,
+ "start": -3.552713668866051e-14,
+ "speckle_type": "Objects.Primitive.Interval",
+ "applicationId": null,
+ "totalChildrenCount": 0
+ },
+ "length": 5300.000000000002,
+ "speckle_type": "Objects.Geometry.Line",
+ "applicationId": null,
+ "totalChildrenCount": 0
+ },
+ "category": "Walls",
+ "elements": null,
+ "topLevel": {
+ "id": "83f0777fe353eb77263ca71578e12dcf",
+ "name": "1FL",
+ "units": "mm",
+ "category": "Levels",
+ "elementId": "3150442",
+ "elevation": 0,
+ "worksetId": "0",
+ "createView": true,
+ "parameters": {
+ "id": "43d0efa83cf272385e920a560e7e9ebf",
+ "IFC_GUID": {
+ "id": "ceb8ed674bbdf0e139c95a628bca09e5",
+ "name": "IfcGUID",
+ "units": null,
+ "value": "3xtuTNAO5BSg6cTEbLBATq",
+ "isShared": false,
+ "isReadOnly": false,
+ "speckle_type": "Objects.BuiltElements.Revit.Parameter",
+ "applicationId": null,
+ "applicationUnit": null,
+ "isTypeParameter": false,
+ "totalChildrenCount": 0,
+ "applicationUnitType": null,
+ "applicationInternalName": "IFC_GUID"
+ },
+ "DATUM_TEXT": {
+ "id": "32f5ba880945a5bc78419171ea58cfa6",
+ "name": "Name",
+ "units": null,
+ "value": "1FL",
+ "isShared": false,
+ "isReadOnly": false,
+ "speckle_type": "Objects.BuiltElements.Revit.Parameter",
+ "applicationId": null,
+ "applicationUnit": null,
+ "isTypeParameter": false,
+ "totalChildrenCount": 0,
+ "applicationUnitType": null,
+ "applicationInternalName": "DATUM_TEXT"
+ },
+ "LEVEL_ELEV": {
+ "id": "4e81dd4ac0c395974f54245b438ae147",
+ "name": "Elevation",
+ "units": "mm",
+ "value": 0,
+ "isShared": false,
+ "isReadOnly": false,
+ "speckle_type": "Objects.BuiltElements.Revit.Parameter",
+ "applicationId": null,
+ "applicationUnit": "autodesk.unit.unit:millimeters-1.0.1",
+ "isTypeParameter": false,
+ "totalChildrenCount": 0,
+ "applicationUnitType": null,
+ "applicationInternalName": "LEVEL_ELEV"
+ },
+ "speckle_type": "Base",
+ "applicationId": null,
+ "ELEM_TYPE_PARAM": {
+ "id": "cb42b32c7f51cde44a287ca1bff0982b",
+ "name": "Type",
+ "units": null,
+ "value": "レベル 上表示",
+ "isShared": false,
+ "isReadOnly": false,
+ "speckle_type": "Objects.BuiltElements.Revit.Parameter",
+ "applicationId": null,
+ "applicationUnit": null,
+ "isTypeParameter": false,
+ "totalChildrenCount": 0,
+ "applicationUnitType": null,
+ "applicationInternalName": "ELEM_TYPE_PARAM"
+ },
+ "SYMBOL_ID_PARAM": {
+ "id": "51f0ee3d4bdbed11d72db3d53cdf3706",
+ "name": "Type Id",
+ "units": null,
+ "value": "レベル 上表示",
+ "isShared": false,
+ "isReadOnly": true,
+ "speckle_type": "Objects.BuiltElements.Revit.Parameter",
+ "applicationId": null,
+ "applicationUnit": null,
+ "isTypeParameter": false,
+ "totalChildrenCount": 0,
+ "applicationUnitType": null,
+ "applicationInternalName": "SYMBOL_ID_PARAM"
+ },
+ "DESIGN_OPTION_ID": {
+ "id": "88f4af03d8e3506766765215a5b87813",
+ "name": "Design Option",
+ "units": null,
+ "value": "-1",
+ "isShared": false,
+ "isReadOnly": true,
+ "speckle_type": "Objects.BuiltElements.Revit.Parameter",
+ "applicationId": null,
+ "applicationUnit": null,
+ "isTypeParameter": false,
+ "totalChildrenCount": 0,
+ "applicationUnitType": null,
+ "applicationInternalName": "DESIGN_OPTION_ID"
+ },
+ "ELEM_FAMILY_PARAM": {
+ "id": "5c94a45c58d4bbfd90819146fb5174a8",
+ "name": "Family",
+ "units": null,
+ "value": "レベル 上表示",
+ "isShared": false,
+ "isReadOnly": false,
+ "speckle_type": "Objects.BuiltElements.Revit.Parameter",
+ "applicationId": null,
+ "applicationUnit": null,
+ "isTypeParameter": false,
+ "totalChildrenCount": 0,
+ "applicationUnitType": null,
+ "applicationInternalName": "ELEM_FAMILY_PARAM"
+ },
+ "LEVEL_UP_TO_LEVEL": {
+ "id": "688a38b54fd75e52da54c164508aeb0f",
+ "name": "Story Above",
+ "units": null,
+ "value": "-1",
+ "isShared": false,
+ "isReadOnly": false,
+ "speckle_type": "Objects.BuiltElements.Revit.Parameter",
+ "applicationId": null,
+ "applicationUnit": null,
+ "isTypeParameter": false,
+ "totalChildrenCount": 0,
+ "applicationUnitType": null,
+ "applicationInternalName": "LEVEL_UP_TO_LEVEL"
+ },
+ "SYMBOL_NAME_PARAM": {
+ "id": "fe43cb940741f29b6cd508611db70c0a",
+ "name": "Type Name",
+ "units": null,
+ "value": null,
+ "isShared": false,
+ "isReadOnly": true,
+ "speckle_type": "Objects.BuiltElements.Revit.Parameter",
+ "applicationId": null,
+ "applicationUnit": null,
+ "isTypeParameter": false,
+ "totalChildrenCount": 0,
+ "applicationUnitType": null,
+ "applicationInternalName": "SYMBOL_NAME_PARAM"
+ },
+ "IFC_EXPORT_ELEMENT": {
+ "id": "ac8493ea527ffedf1d7bcf5826dab455",
+ "name": "Export to IFC",
+ "units": null,
+ "value": 0,
+ "isShared": false,
+ "isReadOnly": false,
+ "speckle_type": "Objects.BuiltElements.Revit.Parameter",
+ "applicationId": null,
+ "applicationUnit": null,
+ "isTypeParameter": false,
+ "totalChildrenCount": 0,
+ "applicationUnitType": null,
+ "applicationInternalName": "IFC_EXPORT_ELEMENT"
+ },
+ "totalChildrenCount": 0,
+ "ELEM_CATEGORY_PARAM": {
+ "id": "9ed3143148c3e478c4d5fa4aad0f84cb",
+ "name": "Category",
+ "units": null,
+ "value": "-2000240",
+ "isShared": false,
+ "isReadOnly": true,
+ "speckle_type": "Objects.BuiltElements.Revit.Parameter",
+ "applicationId": null,
+ "applicationUnit": null,
+ "isTypeParameter": false,
+ "totalChildrenCount": 0,
+ "applicationUnitType": null,
+ "applicationInternalName": "ELEM_CATEGORY_PARAM"
+ },
+ "LEVEL_IS_STRUCTURAL": {
+ "id": "7d81c0e17bc7d3826774591634ee068b",
+ "name": "Structural",
+ "units": null,
+ "value": true,
+ "isShared": false,
+ "isReadOnly": false,
+ "speckle_type": "Objects.BuiltElements.Revit.Parameter",
+ "applicationId": null,
+ "applicationUnit": null,
+ "isTypeParameter": false,
+ "totalChildrenCount": 0,
+ "applicationUnitType": null,
+ "applicationInternalName": "LEVEL_IS_STRUCTURAL"
+ },
+ "ELEM_CATEGORY_PARAM_MT": {
+ "id": "73cbfffc73fd323071a9111d157f9a18",
+ "name": "Category",
+ "units": null,
+ "value": "-2000240",
+ "isShared": false,
+ "isReadOnly": true,
+ "speckle_type": "Objects.BuiltElements.Revit.Parameter",
+ "applicationId": null,
+ "applicationUnit": null,
+ "isTypeParameter": false,
+ "totalChildrenCount": 0,
+ "applicationUnitType": null,
+ "applicationInternalName": "ELEM_CATEGORY_PARAM_MT"
+ },
+ "SPECKLE_Classification": {
+ "id": "2138dca3e3a7c852aeaa3fa65e5a5e8c",
+ "name": "SPECKLE_Classification",
+ "units": null,
+ "value": null,
+ "isShared": false,
+ "isReadOnly": false,
+ "speckle_type": "Objects.BuiltElements.Revit.Parameter",
+ "applicationId": null,
+ "applicationUnit": null,
+ "isTypeParameter": false,
+ "totalChildrenCount": 0,
+ "applicationUnitType": null,
+ "applicationInternalName": "SPECKLE_Classification"
+ },
+ "LEVEL_IS_BUILDING_STORY": {
+ "id": "231a4045f2fd0e013b9b45e71ddb653c",
+ "name": "Building Story",
+ "units": null,
+ "value": true,
+ "isShared": false,
+ "isReadOnly": false,
+ "speckle_type": "Objects.BuiltElements.Revit.Parameter",
+ "applicationId": null,
+ "applicationUnit": null,
+ "isTypeParameter": false,
+ "totalChildrenCount": 0,
+ "applicationUnitType": null,
+ "applicationInternalName": "LEVEL_IS_BUILDING_STORY"
+ },
+ "DATUM_VOLUME_OF_INTEREST": {
+ "id": "695f0dbc445b52836935ac062f46de41",
+ "name": "Scope Box",
+ "units": null,
+ "value": "-1",
+ "isShared": false,
+ "isReadOnly": false,
+ "speckle_type": "Objects.BuiltElements.Revit.Parameter",
+ "applicationId": null,
+ "applicationUnit": null,
+ "isTypeParameter": false,
+ "totalChildrenCount": 0,
+ "applicationUnitType": null,
+ "applicationInternalName": "DATUM_VOLUME_OF_INTEREST"
+ },
+ "SYMBOL_FAMILY_NAME_PARAM": {
+ "id": "a52788d3716a07ca198833a2024a2f04",
+ "name": "Family Name",
+ "units": null,
+ "value": null,
+ "isShared": false,
+ "isReadOnly": true,
+ "speckle_type": "Objects.BuiltElements.Revit.Parameter",
+ "applicationId": null,
+ "applicationUnit": null,
+ "isTypeParameter": false,
+ "totalChildrenCount": 0,
+ "applicationUnitType": null,
+ "applicationInternalName": "SYMBOL_FAMILY_NAME_PARAM"
+ },
+ "ELEM_FAMILY_AND_TYPE_PARAM": {
+ "id": "1bbc8fadc19823adb9a9c99e725102c1",
+ "name": "Family and Type",
+ "units": null,
+ "value": "レベル 上表示",
+ "isShared": false,
+ "isReadOnly": false,
+ "speckle_type": "Objects.BuiltElements.Revit.Parameter",
+ "applicationId": null,
+ "applicationUnit": null,
+ "isTypeParameter": false,
+ "totalChildrenCount": 0,
+ "applicationUnitType": null,
+ "applicationInternalName": "ELEM_FAMILY_AND_TYPE_PARAM"
+ },
+ "LEVEL_ROOM_COMPUTATION_HEIGHT": {
+ "id": "e54df704e19c7a0c73431dc943ce4fc3",
+ "name": "Computation Height",
+ "units": "mm",
+ "value": 0,
+ "isShared": false,
+ "isReadOnly": false,
+ "speckle_type": "Objects.BuiltElements.Revit.Parameter",
+ "applicationId": null,
+ "applicationUnit": "autodesk.unit.unit:millimeters-1.0.1",
+ "isTypeParameter": false,
+ "totalChildrenCount": 0,
+ "applicationUnitType": null,
+ "applicationInternalName": "LEVEL_ROOM_COMPUTATION_HEIGHT"
+ }
+ },
+ "speckle_type": "Objects.BuiltElements.Level:Objects.BuiltElements.Revit.RevitLevel",
+ "applicationId": "fbdf8757-2981-4b72-a1a6-74e9551cb51e-0030126a",
+ "referenceOnly": false,
+ "builtInCategory": "OST_Levels",
+ "isRevitLinkedModel": false,
+ "materialQuantities": [],
+ "totalChildrenCount": 0,
+ "revitLinkedModelPath": "C:\\Program Files\\Autodesk\\Revit 2024\\Samples\\サンプル構造.rvt"
+ },
+ "__closure": {
+ "210e0ea727c735970c576cd0beab0493": 2,
+ "30ba0a6aba886a2e800b12bb37656ab3": 2,
+ "78b63dbbe244fafafc0a95cf61f1cbc1": 1,
+ "d1b4feed8d71926a25a42d86f9a81209": 1
+ },
+ "elementId": "4479852",
+ "topOffset": -600,
+ "worksetId": "0",
+ "baseOffset": -2000,
+ "parameters": {
+ "id": "8c69297da2b6fb17718cf44fe2388878",
+ "IFC_GUID": {
+ "id": "4cabbecef7398cbdf463f847708318c6",
+ "name": "IfcGUID",
+ "units": null,
+ "value": "0oqavz9$zDZxycDyfZdYsW",
+ "isShared": false,
+ "isReadOnly": false,
+ "speckle_type": "Objects.BuiltElements.Revit.Parameter",
+ "applicationId": null,
+ "applicationUnit": null,
+ "isTypeParameter": false,
+ "totalChildrenCount": 0,
+ "applicationUnitType": null,
+ "applicationInternalName": "IFC_GUID"
+ },
+ "speckle_type": "Base",
+ "幅止筋径": {
+ "id": "51840c4a0fffeac7376571395296647e",
+ "name": "幅止筋径",
+ "units": null,
+ "value": null,
+ "isShared": false,
+ "isReadOnly": false,
+ "speckle_type": "Objects.BuiltElements.Revit.Parameter",
+ "applicationId": null,
+ "applicationUnit": null,
+ "isTypeParameter": true,
+ "totalChildrenCount": 0,
+ "applicationUnitType": null,
+ "applicationInternalName": "幅止筋径"
+ },
+ "鉄筋種別": {
+ "id": "3e5981bc5228393fdc84574037bfb9be",
+ "name": "鉄筋種別",
+ "units": null,
+ "value": null,
+ "isShared": false,
+ "isReadOnly": false,
+ "speckle_type": "Objects.BuiltElements.Revit.Parameter",
+ "applicationId": null,
+ "applicationUnit": null,
+ "isTypeParameter": true,
+ "totalChildrenCount": 0,
+ "applicationUnitType": null,
+ "applicationInternalName": "鉄筋種別"
+ },
+ "ALL_MODEL_URL": {
+ "id": "a261c811f92fec62c296a2265435f559",
+ "name": "URL",
+ "units": null,
+ "value": null,
+ "isShared": false,
+ "isReadOnly": false,
+ "speckle_type": "Objects.BuiltElements.Revit.Parameter",
+ "applicationId": null,
+ "applicationUnit": null,
+ "isTypeParameter": true,
+ "totalChildrenCount": 0,
+ "applicationUnitType": null,
+ "applicationInternalName": "ALL_MODEL_URL"
+ },
+ "IFC_TYPE_GUID": {
+ "id": "5215d1101225d3415a966c4788774948",
+ "name": "Type IfcGUID",
+ "units": null,
+ "value": "0oqavz9$zDZxycDyfZdYh0",
+ "isShared": false,
+ "isReadOnly": false,
+ "speckle_type": "Objects.BuiltElements.Revit.Parameter",
+ "applicationId": null,
+ "applicationUnit": null,
+ "isTypeParameter": true,
+ "totalChildrenCount": 0,
+ "applicationUnitType": null,
+ "applicationInternalName": "IFC_TYPE_GUID"
+ },
+ "KEYNOTE_PARAM": {
+ "id": "bf39776cf4e2104a4622d209b0b26e4b",
+ "name": "Keynote",
+ "units": null,
+ "value": null,
+ "isShared": false,
+ "isReadOnly": true,
+ "speckle_type": "Objects.BuiltElements.Revit.Parameter",
+ "applicationId": null,
+ "applicationUnit": null,
+ "isTypeParameter": true,
+ "totalChildrenCount": 0,
+ "applicationUnitType": null,
+ "applicationInternalName": "KEYNOTE_PARAM"
+ },
+ "PHASE_CREATED": {
+ "id": "17ebb53fa91f8f8ada5c558038c48cc0",
+ "name": "Phase Created",
+ "units": null,
+ "value": "フェーズ1",
+ "isShared": false,
+ "isReadOnly": false,
+ "speckle_type": "Objects.BuiltElements.Revit.Parameter",
+ "applicationId": null,
+ "applicationUnit": null,
+ "isTypeParameter": false,
+ "totalChildrenCount": 0,
+ "applicationUnitType": null,
+ "applicationInternalName": "PHASE_CREATED"
+ },
+ "applicationId": null,
+ "ALL_MODEL_COST": {
+ "id": "8e9a24da6f88b5899ce25d3cd5c5a8ba",
+ "name": "Cost",
+ "units": "฿",
+ "value": null,
+ "isShared": false,
+ "isReadOnly": false,
+ "speckle_type": "Objects.BuiltElements.Revit.Parameter",
+ "applicationId": null,
+ "applicationUnit": "autodesk.unit.unit:currency-1.0.0",
+ "isTypeParameter": true,
+ "totalChildrenCount": 0,
+ "applicationUnitType": null,
+ "applicationInternalName": "ALL_MODEL_COST"
+ },
+ "ALL_MODEL_MARK": {
+ "id": "336e23f6debcf6df695750fa4ee20180",
+ "name": "Mark",
+ "units": null,
+ "value": null,
+ "isShared": false,
+ "isReadOnly": false,
+ "speckle_type": "Objects.BuiltElements.Revit.Parameter",
+ "applicationId": null,
+ "applicationUnit": null,
+ "isTypeParameter": false,
+ "totalChildrenCount": 0,
+ "applicationUnitType": null,
+ "applicationInternalName": "ALL_MODEL_MARK"
+ },
+ "FUNCTION_PARAM": {
+ "id": "4b63739868e772bb7da43d201a3800ea",
+ "name": "Function",
+ "units": null,
+ "value": 0,
+ "isShared": false,
+ "isReadOnly": false,
+ "speckle_type": "Objects.BuiltElements.Revit.Parameter",
+ "applicationId": null,
+ "applicationUnit": null,
+ "isTypeParameter": true,
+ "totalChildrenCount": 0,
+ "applicationUnitType": null,
+ "applicationInternalName": "FUNCTION_PARAM"
+ },
+ "UNIFORMAT_CODE": {
+ "id": "ccb23a319130de9a96ecc397b365e278",
+ "name": "Assembly Code",
+ "units": null,
+ "value": "",
+ "isShared": false,
+ "isReadOnly": false,
+ "speckle_type": "Objects.BuiltElements.Revit.Parameter",
+ "applicationId": null,
+ "applicationUnit": null,
+ "isTypeParameter": true,
+ "totalChildrenCount": 0,
+ "applicationUnitType": null,
+ "applicationInternalName": "UNIFORMAT_CODE"
+ },
+ "WINDOW_TYPE_ID": {
+ "id": "b505347b6abc4073e7c35bc42dcdc6ad",
+ "name": "Type Mark",
+ "units": null,
+ "value": null,
+ "isShared": false,
+ "isReadOnly": false,
+ "speckle_type": "Objects.BuiltElements.Revit.Parameter",
+ "applicationId": null,
+ "applicationUnit": null,
+ "isTypeParameter": true,
+ "totalChildrenCount": 0,
+ "applicationUnitType": null,
+ "applicationInternalName": "WINDOW_TYPE_ID"
+ },
+ "ALL_MODEL_IMAGE": {
+ "id": "0bbd2950d953cd6769260720039799ce",
+ "name": "Image",
+ "units": null,
+ "value": "-1",
+ "isShared": false,
+ "isReadOnly": false,
+ "speckle_type": "Objects.BuiltElements.Revit.Parameter",
+ "applicationId": null,
+ "applicationUnit": null,
+ "isTypeParameter": false,
+ "totalChildrenCount": 0,
+ "applicationUnitType": null,
+ "applicationInternalName": "ALL_MODEL_IMAGE"
+ },
+ "ALL_MODEL_MODEL": {
+ "id": "ed0938df07a2290e25d65b5b300d2552",
+ "name": "Model",
+ "units": null,
+ "value": null,
+ "isShared": false,
+ "isReadOnly": false,
+ "speckle_type": "Objects.BuiltElements.Revit.Parameter",
+ "applicationId": null,
+ "applicationUnit": null,
+ "isTypeParameter": true,
+ "totalChildrenCount": 0,
+ "applicationUnitType": null,
+ "applicationInternalName": "ALL_MODEL_MODEL"
+ },
+ "ELEM_TYPE_PARAM": {
+ "id": "f16829ce4a87b686dcf3aebd8399c93a",
+ "name": "Type",
+ "units": null,
+ "value": "W30(Fc24)",
+ "isShared": false,
+ "isReadOnly": false,
+ "speckle_type": "Objects.BuiltElements.Revit.Parameter",
+ "applicationId": null,
+ "applicationUnit": null,
+ "isTypeParameter": false,
+ "totalChildrenCount": 0,
+ "applicationUnitType": null,
+ "applicationInternalName": "ELEM_TYPE_PARAM"
+ },
+ "RELATED_TO_MASS": {
+ "id": "566cb4feb80d5a985cbdf2eb64f8cce3",
+ "name": "Related to Mass",
+ "units": null,
+ "value": false,
+ "isShared": false,
+ "isReadOnly": true,
+ "speckle_type": "Objects.BuiltElements.Revit.Parameter",
+ "applicationId": null,
+ "applicationUnit": null,
+ "isTypeParameter": false,
+ "totalChildrenCount": 0,
+ "applicationUnitType": null,
+ "applicationInternalName": "RELATED_TO_MASS"
+ },
+ "SYMBOL_ID_PARAM": {
+ "id": "5d10f05ef6db71c2ead565b0a5061af0",
+ "name": "Type Id",
+ "units": null,
+ "value": "W30(Fc24)",
+ "isShared": false,
+ "isReadOnly": true,
+ "speckle_type": "Objects.BuiltElements.Revit.Parameter",
+ "applicationId": null,
+ "applicationUnit": null,
+ "isTypeParameter": false,
+ "totalChildrenCount": 0,
+ "applicationUnitType": null,
+ "applicationInternalName": "SYMBOL_ID_PARAM"
+ },
+ "DESIGN_OPTION_ID": {
+ "id": "88f4af03d8e3506766765215a5b87813",
+ "name": "Design Option",
+ "units": null,
+ "value": "-1",
+ "isShared": false,
+ "isReadOnly": true,
+ "speckle_type": "Objects.BuiltElements.Revit.Parameter",
+ "applicationId": null,
+ "applicationUnit": null,
+ "isTypeParameter": false,
+ "totalChildrenCount": 0,
+ "applicationUnitType": null,
+ "applicationInternalName": "DESIGN_OPTION_ID"
+ },
+ "DOOR_FIRE_RATING": {
+ "id": "879b74bf9a25a16ff9e86ce673536b90",
+ "name": "Fire Rating",
+ "units": null,
+ "value": null,
+ "isShared": false,
+ "isReadOnly": false,
+ "speckle_type": "Objects.BuiltElements.Revit.Parameter",
+ "applicationId": null,
+ "applicationUnit": null,
+ "isTypeParameter": true,
+ "totalChildrenCount": 0,
+ "applicationUnitType": null,
+ "applicationInternalName": "DOOR_FIRE_RATING"
+ },
+ "PHASE_DEMOLISHED": {
+ "id": "49ca987163ba4376ad129ff75ec6921e",
+ "name": "Phase Demolished",
+ "units": null,
+ "value": "-1",
+ "isShared": false,
+ "isReadOnly": false,
+ "speckle_type": "Objects.BuiltElements.Revit.Parameter",
+ "applicationId": null,
+ "applicationUnit": null,
+ "isTypeParameter": false,
+ "totalChildrenCount": 0,
+ "applicationUnitType": null,
+ "applicationInternalName": "PHASE_DEMOLISHED"
+ },
+ "CLEAR_COVER_OTHER": {
+ "id": "e7fe31274592f7688e3b7aed5f49efac",
+ "name": "Rebar Cover - Other Faces",
+ "units": null,
+ "value": "内壁(フレーム、柱、および耐力壁)",
+ "isShared": false,
+ "isReadOnly": false,
+ "speckle_type": "Objects.BuiltElements.Revit.Parameter",
+ "applicationId": null,
+ "applicationUnit": null,
+ "isTypeParameter": false,
+ "totalChildrenCount": 0,
+ "applicationUnitType": null,
+ "applicationInternalName": "CLEAR_COVER_OTHER"
+ },
+ "CURVE_ELEM_LENGTH": {
+ "id": "2068c7dfb9911a544963580bc57701e4",
+ "name": "Length",
+ "units": "mm",
+ "value": 5300.000000000001,
+ "isShared": false,
+ "isReadOnly": true,
+ "speckle_type": "Objects.BuiltElements.Revit.Parameter",
+ "applicationId": null,
+ "applicationUnit": "autodesk.unit.unit:millimeters-1.0.1",
+ "isTypeParameter": false,
+ "totalChildrenCount": 0,
+ "applicationUnitType": null,
+ "applicationInternalName": "CURVE_ELEM_LENGTH"
+ },
+ "ELEM_FAMILY_PARAM": {
+ "id": "d6d47e2729a7d1df6f74acd2bfe10d07",
+ "name": "Family",
+ "units": null,
+ "value": "W30(Fc24)",
+ "isShared": false,
+ "isReadOnly": false,
+ "speckle_type": "Objects.BuiltElements.Revit.Parameter",
+ "applicationId": null,
+ "applicationUnit": null,
+ "isTypeParameter": false,
+ "totalChildrenCount": 0,
+ "applicationUnitType": null,
+ "applicationInternalName": "ELEM_FAMILY_PARAM"
+ },
+ "SYMBOL_NAME_PARAM": {
+ "id": "fe43cb940741f29b6cd508611db70c0a",
+ "name": "Type Name",
+ "units": null,
+ "value": null,
+ "isShared": false,
+ "isReadOnly": true,
+ "speckle_type": "Objects.BuiltElements.Revit.Parameter",
+ "applicationId": null,
+ "applicationUnit": null,
+ "isTypeParameter": false,
+ "totalChildrenCount": 0,
+ "applicationUnitType": null,
+ "applicationInternalName": "SYMBOL_NAME_PARAM"
+ },
+ "横筋 主筋径1": {
+ "id": "d379ca5a49a082cc8ac8b63edb16fae4",
+ "name": "横筋 主筋径1",
+ "units": null,
+ "value": "D13",
+ "isShared": false,
+ "isReadOnly": false,
+ "speckle_type": "Objects.BuiltElements.Revit.Parameter",
+ "applicationId": null,
+ "applicationUnit": null,
+ "isTypeParameter": true,
+ "totalChildrenCount": 0,
+ "applicationUnitType": null,
+ "applicationInternalName": "横筋 主筋径1"
+ },
+ "横筋 主筋径2": {
+ "id": "b38afc05d4877b9a36e4663160e12f51",
+ "name": "横筋 主筋径2",
+ "units": null,
+ "value": "D16",
+ "isShared": false,
+ "isReadOnly": false,
+ "speckle_type": "Objects.BuiltElements.Revit.Parameter",
+ "applicationId": null,
+ "applicationUnit": null,
+ "isTypeParameter": true,
+ "totalChildrenCount": 0,
+ "applicationUnitType": null,
+ "applicationInternalName": "横筋 主筋径2"
+ },
+ "縦筋 主筋径1": {
+ "id": "54201159455aa6bbca506518e4b2ab4e",
+ "name": "縦筋 主筋径1",
+ "units": null,
+ "value": "D13",
+ "isShared": false,
+ "isReadOnly": false,
+ "speckle_type": "Objects.BuiltElements.Revit.Parameter",
+ "applicationId": null,
+ "applicationUnit": null,
+ "isTypeParameter": true,
+ "totalChildrenCount": 0,
+ "applicationUnitType": null,
+ "applicationInternalName": "縦筋 主筋径1"
+ },
+ "縦筋 主筋径2": {
+ "id": "8271e5b08899d0360b78f00413f3d54d",
+ "name": "縦筋 主筋径2",
+ "units": null,
+ "value": "D16",
+ "isShared": false,
+ "isReadOnly": false,
+ "speckle_type": "Objects.BuiltElements.Revit.Parameter",
+ "applicationId": null,
+ "applicationUnit": null,
+ "isTypeParameter": true,
+ "totalChildrenCount": 0,
+ "applicationUnitType": null,
+ "applicationInternalName": "縦筋 主筋径2"
+ },
+ "HOST_AREA_COMPUTED": {
+ "id": "d6a8c04bf4df2b3778c3675963ffe31a",
+ "name": "Area",
+ "units": "m²",
+ "value": 7.630000000000015,
+ "isShared": false,
+ "isReadOnly": true,
+ "speckle_type": "Objects.BuiltElements.Revit.Parameter",
+ "applicationId": null,
+ "applicationUnit": "autodesk.unit.unit:squareMeters-1.0.1",
+ "isTypeParameter": false,
+ "totalChildrenCount": 0,
+ "applicationUnitType": null,
+ "applicationInternalName": "HOST_AREA_COMPUTED"
+ },
+ "IFC_EXPORT_ELEMENT": {
+ "id": "ac8493ea527ffedf1d7bcf5826dab455",
+ "name": "Export to IFC",
+ "units": null,
+ "value": 0,
+ "isShared": false,
+ "isReadOnly": false,
+ "speckle_type": "Objects.BuiltElements.Revit.Parameter",
+ "applicationId": null,
+ "applicationUnit": null,
+ "isTypeParameter": false,
+ "totalChildrenCount": 0,
+ "applicationUnitType": null,
+ "applicationInternalName": "IFC_EXPORT_ELEMENT"
+ },
+ "WALL_CROSS_SECTION": {
+ "id": "698002bd237038be0e85c9f9f97e3bb5",
+ "name": "Cross-Section",
+ "units": null,
+ "value": 1,
+ "isShared": false,
+ "isReadOnly": false,
+ "speckle_type": "Objects.BuiltElements.Revit.Parameter",
+ "applicationId": null,
+ "applicationUnit": null,
+ "isTypeParameter": false,
+ "totalChildrenCount": 0,
+ "applicationUnitType": null,
+ "applicationInternalName": "WALL_CROSS_SECTION"
+ },
+ "WALL_KEY_REF_PARAM": {
+ "id": "3f331fae4795eec71ea562f7482c4902",
+ "name": "Location Line",
+ "units": null,
+ "value": 1,
+ "isShared": false,
+ "isReadOnly": false,
+ "speckle_type": "Objects.BuiltElements.Revit.Parameter",
+ "applicationId": null,
+ "applicationUnit": null,
+ "isTypeParameter": false,
+ "totalChildrenCount": 0,
+ "applicationUnitType": null,
+ "applicationInternalName": "WALL_KEY_REF_PARAM"
+ },
+ "totalChildrenCount": 0,
+ "幅止筋ピッチ": {
+ "id": "34242c23582387b0fe4c654e71bec03f",
+ "name": "幅止筋ピッチ",
+ "units": null,
+ "value": null,
+ "isShared": false,
+ "isReadOnly": false,
+ "speckle_type": "Objects.BuiltElements.Revit.Parameter",
+ "applicationId": null,
+ "applicationUnit": null,
+ "isTypeParameter": true,
+ "totalChildrenCount": 0,
+ "applicationUnitType": null,
+ "applicationInternalName": "幅止筋ピッチ"
+ },
+ "ELEM_CATEGORY_PARAM": {
+ "id": "e2466248896b57cb44bd84d8e03acc85",
+ "name": "Category",
+ "units": null,
+ "value": "-2000011",
+ "isShared": false,
+ "isReadOnly": true,
+ "speckle_type": "Objects.BuiltElements.Revit.Parameter",
+ "applicationId": null,
+ "applicationUnit": null,
+ "isTypeParameter": false,
+ "totalChildrenCount": 0,
+ "applicationUnitType": null,
+ "applicationInternalName": "ELEM_CATEGORY_PARAM"
+ },
+ "ALL_MODEL_TYPE_IMAGE": {
+ "id": "22e221a13bd5fcb3f9a549813cf136ae",
+ "name": "Type Image",
+ "units": null,
+ "value": "-1",
+ "isShared": false,
+ "isReadOnly": true,
+ "speckle_type": "Objects.BuiltElements.Revit.Parameter",
+ "applicationId": null,
+ "applicationUnit": null,
+ "isTypeParameter": true,
+ "totalChildrenCount": 0,
+ "applicationUnitType": null,
+ "applicationInternalName": "ALL_MODEL_TYPE_IMAGE"
+ },
+ "ANALYTICAL_ROUGHNESS": {
+ "id": "fdaeba96e8698f1032f90bd219038cd1",
+ "name": "Roughness",
+ "units": null,
+ "value": 1,
+ "isShared": false,
+ "isReadOnly": false,
+ "speckle_type": "Objects.BuiltElements.Revit.Parameter",
+ "applicationId": null,
+ "applicationUnit": null,
+ "isTypeParameter": true,
+ "totalChildrenCount": 0,
+ "applicationUnitType": null,
+ "applicationInternalName": "ANALYTICAL_ROUGHNESS"
+ },
+ "CLEAR_COVER_EXTERIOR": {
+ "id": "cb380885a1464f46ed4e6eca5ce0903e",
+ "name": "Rebar Cover - Exterior Face",
+ "units": null,
+ "value": "内壁(フレーム、柱、および耐力壁)",
+ "isShared": false,
+ "isReadOnly": false,
+ "speckle_type": "Objects.BuiltElements.Revit.Parameter",
+ "applicationId": null,
+ "applicationUnit": null,
+ "isTypeParameter": false,
+ "totalChildrenCount": 0,
+ "applicationUnitType": null,
+ "applicationInternalName": "CLEAR_COVER_EXTERIOR"
+ },
+ "CLEAR_COVER_INTERIOR": {
+ "id": "72c0b38414d91d0a4c15e4cc55273791",
+ "name": "Rebar Cover - Interior Face",
+ "units": null,
+ "value": "内壁(フレーム、柱、および耐力壁)",
+ "isShared": false,
+ "isReadOnly": false,
+ "speckle_type": "Objects.BuiltElements.Revit.Parameter",
+ "applicationId": null,
+ "applicationUnit": null,
+ "isTypeParameter": false,
+ "totalChildrenCount": 0,
+ "applicationUnitType": null,
+ "applicationInternalName": "CLEAR_COVER_INTERIOR"
+ },
+ "HOST_VOLUME_COMPUTED": {
+ "id": "a58e3bbee4814e42c6f27dd04ec4b2c4",
+ "name": "Volume",
+ "units": "m³",
+ "value": 2.2890000000000135,
+ "isShared": false,
+ "isReadOnly": true,
+ "speckle_type": "Objects.BuiltElements.Revit.Parameter",
+ "applicationId": null,
+ "applicationUnit": "autodesk.unit.unit:cubicMeters-1.0.1",
+ "isTypeParameter": false,
+ "totalChildrenCount": 0,
+ "applicationUnitType": null,
+ "applicationInternalName": "HOST_VOLUME_COMPUTED"
+ },
+ "WALL_TOP_IS_ATTACHED": {
+ "id": "bb79e6923a9a1a5ad7776fcd687e9948",
+ "name": "Top is Attached",
+ "units": null,
+ "value": false,
+ "isShared": false,
+ "isReadOnly": true,
+ "speckle_type": "Objects.BuiltElements.Revit.Parameter",
+ "applicationId": null,
+ "applicationUnit": null,
+ "isTypeParameter": false,
+ "totalChildrenCount": 0,
+ "applicationUnitType": null,
+ "applicationInternalName": "WALL_TOP_IS_ATTACHED"
+ },
+ "ALL_MODEL_DESCRIPTION": {
+ "id": "c674714a0e0f8f3ace46457be507bde7",
+ "name": "Description",
+ "units": null,
+ "value": null,
+ "isShared": false,
+ "isReadOnly": false,
+ "speckle_type": "Objects.BuiltElements.Revit.Parameter",
+ "applicationId": null,
+ "applicationUnit": null,
+ "isTypeParameter": true,
+ "totalChildrenCount": 0,
+ "applicationUnitType": null,
+ "applicationInternalName": "ALL_MODEL_DESCRIPTION"
+ },
+ "IFC_EXPORT_ELEMENT_AS": {
+ "id": "beab0eef32c6a433e7c996a75f6d46d9",
+ "name": "Export to IFC As",
+ "units": null,
+ "value": null,
+ "isShared": false,
+ "isReadOnly": false,
+ "speckle_type": "Objects.BuiltElements.Revit.Parameter",
+ "applicationId": null,
+ "applicationUnit": null,
+ "isTypeParameter": false,
+ "totalChildrenCount": 0,
+ "applicationUnitType": null,
+ "applicationInternalName": "IFC_EXPORT_ELEMENT_AS"
+ },
+ "UNIFORMAT_DESCRIPTION": {
+ "id": "8e056ac453940541c2d6f1b84560967e",
+ "name": "Assembly Description",
+ "units": null,
+ "value": "",
+ "isShared": false,
+ "isReadOnly": true,
+ "speckle_type": "Objects.BuiltElements.Revit.Parameter",
+ "applicationId": null,
+ "applicationUnit": null,
+ "isTypeParameter": true,
+ "totalChildrenCount": 0,
+ "applicationUnitType": null,
+ "applicationInternalName": "UNIFORMAT_DESCRIPTION"
+ },
+ "WALL_ATTR_WIDTH_PARAM": {
+ "id": "6ca4606560c24174ba9e8c29fd8aaa2b",
+ "name": "Width",
+ "units": "mm",
+ "value": 300,
+ "isShared": false,
+ "isReadOnly": true,
+ "speckle_type": "Objects.BuiltElements.Revit.Parameter",
+ "applicationId": null,
+ "applicationUnit": "autodesk.unit.unit:millimeters-1.0.1",
+ "isTypeParameter": true,
+ "totalChildrenCount": 0,
+ "applicationUnitType": null,
+ "applicationInternalName": "WALL_ATTR_WIDTH_PARAM"
+ },
+ "ALL_MODEL_MANUFACTURER": {
+ "id": "6bf6926a1116ba2e3bf17fa8456cc1b1",
+ "name": "Manufacturer",
+ "units": null,
+ "value": null,
+ "isShared": false,
+ "isReadOnly": false,
+ "speckle_type": "Objects.BuiltElements.Revit.Parameter",
+ "applicationId": null,
+ "applicationUnit": null,
+ "isTypeParameter": true,
+ "totalChildrenCount": 0,
+ "applicationUnitType": null,
+ "applicationInternalName": "ALL_MODEL_MANUFACTURER"
+ },
+ "ANALYTICAL_ABSORPTANCE": {
+ "id": "5a8796dffbd22a111b19fc15413c50d9",
+ "name": "Absorptance",
+ "units": null,
+ "value": 0.1,
+ "isShared": false,
+ "isReadOnly": false,
+ "speckle_type": "Objects.BuiltElements.Revit.Parameter",
+ "applicationId": null,
+ "applicationUnit": "autodesk.unit.unit:general-1.0.1",
+ "isTypeParameter": true,
+ "totalChildrenCount": 0,
+ "applicationUnitType": null,
+ "applicationInternalName": "ANALYTICAL_ABSORPTANCE"
+ },
+ "ELEM_CATEGORY_PARAM_MT": {
+ "id": "c251e0548d16c42db1af0881126d5691",
+ "name": "Category",
+ "units": null,
+ "value": "-2000011",
+ "isShared": false,
+ "isReadOnly": true,
+ "speckle_type": "Objects.BuiltElements.Revit.Parameter",
+ "applicationId": null,
+ "applicationUnit": null,
+ "isTypeParameter": false,
+ "totalChildrenCount": 0,
+ "applicationUnitType": null,
+ "applicationInternalName": "ELEM_CATEGORY_PARAM_MT"
+ },
+ "SPECKLE_Classification": {
+ "id": "29dc1191e21fa4dceda0ed60881f32bf",
+ "name": "SPECKLE_Classification",
+ "units": null,
+ "value": "Wall",
+ "isShared": false,
+ "isReadOnly": false,
+ "speckle_type": "Objects.BuiltElements.Revit.Parameter",
+ "applicationId": null,
+ "applicationUnit": null,
+ "isTypeParameter": false,
+ "totalChildrenCount": 0,
+ "applicationUnitType": null,
+ "applicationInternalName": "SPECKLE_Classification"
+ },
+ "WRAPPING_AT_ENDS_PARAM": {
+ "id": "91f83fbeb00a751ed03bcf251aeb0474",
+ "name": "Wrapping at Ends",
+ "units": null,
+ "value": 0,
+ "isShared": false,
+ "isReadOnly": false,
+ "speckle_type": "Objects.BuiltElements.Revit.Parameter",
+ "applicationId": null,
+ "applicationUnit": null,
+ "isTypeParameter": true,
+ "totalChildrenCount": 0,
+ "applicationUnitType": null,
+ "applicationInternalName": "WRAPPING_AT_ENDS_PARAM"
+ },
+ "横筋 主筋ピッチ": {
+ "id": "ad6a3787ecba15b3d8356d970d5d8b2e",
+ "name": "横筋 主筋ピッチ",
+ "units": null,
+ "value": "200",
+ "isShared": false,
+ "isReadOnly": false,
+ "speckle_type": "Objects.BuiltElements.Revit.Parameter",
+ "applicationId": null,
+ "applicationUnit": null,
+ "isTypeParameter": true,
+ "totalChildrenCount": 0,
+ "applicationUnitType": null,
+ "applicationInternalName": "横筋 主筋ピッチ"
+ },
+ "縦筋 主筋ピッチ": {
+ "id": "0381ecfe263b4b47be4fdf1e24d3eb92",
+ "name": "縦筋 主筋ピッチ",
+ "units": null,
+ "value": "200",
+ "isShared": false,
+ "isReadOnly": false,
+ "speckle_type": "Objects.BuiltElements.Revit.Parameter",
+ "applicationId": null,
+ "applicationUnit": null,
+ "isTypeParameter": true,
+ "totalChildrenCount": 0,
+ "applicationUnitType": null,
+ "applicationInternalName": "縦筋 主筋ピッチ"
+ },
+ "ALL_MODEL_TYPE_COMMENTS": {
+ "id": "66ccc5a8cdfe28320bf955039e82d179",
+ "name": "Type Comments",
+ "units": null,
+ "value": null,
+ "isShared": false,
+ "isReadOnly": false,
+ "speckle_type": "Objects.BuiltElements.Revit.Parameter",
+ "applicationId": null,
+ "applicationUnit": null,
+ "isTypeParameter": true,
+ "totalChildrenCount": 0,
+ "applicationUnitType": null,
+ "applicationInternalName": "ALL_MODEL_TYPE_COMMENTS"
+ },
+ "ANALYTICAL_THERMAL_MASS": {
+ "id": "af19fd7af543d723026757132eaaf0e0",
+ "name": "Thermal Mass",
+ "units": "kJ/(m²·K)",
+ "value": null,
+ "isShared": false,
+ "isReadOnly": true,
+ "speckle_type": "Objects.BuiltElements.Revit.Parameter",
+ "applicationId": null,
+ "applicationUnit": "autodesk.unit.unit:kilojoulesPerSquareMeterKelvin-1.0.0",
+ "isTypeParameter": true,
+ "totalChildrenCount": 0,
+ "applicationUnitType": null,
+ "applicationInternalName": "ANALYTICAL_THERMAL_MASS"
+ },
+ "IFC_EXPORT_ELEMENT_TYPE": {
+ "id": "9ec1631edc0b1ea8989dbaadace6f99a",
+ "name": "Export Type to IFC",
+ "units": null,
+ "value": 0,
+ "isShared": false,
+ "isReadOnly": false,
+ "speckle_type": "Objects.BuiltElements.Revit.Parameter",
+ "applicationId": null,
+ "applicationUnit": null,
+ "isTypeParameter": true,
+ "totalChildrenCount": 0,
+ "applicationUnitType": null,
+ "applicationInternalName": "IFC_EXPORT_ELEMENT_TYPE"
+ },
+ "WALL_ATTR_ROOM_BOUNDING": {
+ "id": "392a751844d378da83ff7b7b52350c2f",
+ "name": "Room Bounding",
+ "units": null,
+ "value": true,
+ "isShared": false,
+ "isReadOnly": false,
+ "speckle_type": "Objects.BuiltElements.Revit.Parameter",
+ "applicationId": null,
+ "applicationUnit": null,
+ "isTypeParameter": false,
+ "totalChildrenCount": 0,
+ "applicationUnitType": null,
+ "applicationInternalName": "WALL_ATTR_ROOM_BOUNDING"
+ },
+ "WALL_BOTTOM_IS_ATTACHED": {
+ "id": "bf83fa521e6b4772698625a616b564d6",
+ "name": "Base is Attached",
+ "units": null,
+ "value": false,
+ "isShared": false,
+ "isReadOnly": true,
+ "speckle_type": "Objects.BuiltElements.Revit.Parameter",
+ "applicationId": null,
+ "applicationUnit": null,
+ "isTypeParameter": false,
+ "totalChildrenCount": 0,
+ "applicationUnitType": null,
+ "applicationInternalName": "WALL_BOTTOM_IS_ATTACHED"
+ },
+ "WALL_STRUCTURE_ID_PARAM": {
+ "id": "3f264fcd24517cc263b25c00c67dcb3a",
+ "name": "Structure",
+ "units": null,
+ "value": null,
+ "isShared": false,
+ "isReadOnly": false,
+ "speckle_type": "Objects.BuiltElements.Revit.Parameter",
+ "applicationId": null,
+ "applicationUnit": null,
+ "isTypeParameter": true,
+ "totalChildrenCount": 0,
+ "applicationUnitType": null,
+ "applicationInternalName": "WALL_STRUCTURE_ID_PARAM"
+ },
+ "SYMBOL_FAMILY_NAME_PARAM": {
+ "id": "a52788d3716a07ca198833a2024a2f04",
+ "name": "Family Name",
+ "units": null,
+ "value": null,
+ "isShared": false,
+ "isReadOnly": true,
+ "speckle_type": "Objects.BuiltElements.Revit.Parameter",
+ "applicationId": null,
+ "applicationUnit": null,
+ "isTypeParameter": false,
+ "totalChildrenCount": 0,
+ "applicationUnitType": null,
+ "applicationInternalName": "SYMBOL_FAMILY_NAME_PARAM"
+ },
+ "IFC_EXPORT_PREDEFINEDTYPE": {
+ "id": "bef8079e3ea573218fef71b15b7a3b3d",
+ "name": "IFC Predefined Type",
+ "units": null,
+ "value": null,
+ "isShared": false,
+ "isReadOnly": false,
+ "speckle_type": "Objects.BuiltElements.Revit.Parameter",
+ "applicationId": null,
+ "applicationUnit": null,
+ "isTypeParameter": false,
+ "totalChildrenCount": 0,
+ "applicationUnitType": null,
+ "applicationInternalName": "IFC_EXPORT_PREDEFINEDTYPE"
+ },
+ "STRUCTURAL_MATERIAL_PARAM": {
+ "id": "121e411a45f3bea248cc2f765d8675bb",
+ "name": "Structural Material",
+ "units": null,
+ "value": "Fc24",
+ "isShared": false,
+ "isReadOnly": false,
+ "speckle_type": "Objects.BuiltElements.Revit.Parameter",
+ "applicationId": null,
+ "applicationUnit": null,
+ "isTypeParameter": true,
+ "totalChildrenCount": 0,
+ "applicationUnitType": null,
+ "applicationInternalName": "STRUCTURAL_MATERIAL_PARAM"
+ },
+ "WRAPPING_AT_INSERTS_PARAM": {
+ "id": "6eba8d341daac476193f20335df00061",
+ "name": "Wrapping at Inserts",
+ "units": null,
+ "value": 0,
+ "isShared": false,
+ "isReadOnly": false,
+ "speckle_type": "Objects.BuiltElements.Revit.Parameter",
+ "applicationId": null,
+ "applicationUnit": null,
+ "isTypeParameter": true,
+ "totalChildrenCount": 0,
+ "applicationUnitType": null,
+ "applicationInternalName": "WRAPPING_AT_INSERTS_PARAM"
+ },
+ "開口補強筋 斜筋径": {
+ "id": "31066a58041f9df55276aae87d6cf5ad",
+ "name": "開口補強筋 斜筋径",
+ "units": null,
+ "value": "",
+ "isShared": false,
+ "isReadOnly": false,
+ "speckle_type": "Objects.BuiltElements.Revit.Parameter",
+ "applicationId": null,
+ "applicationUnit": null,
+ "isTypeParameter": true,
+ "totalChildrenCount": 0,
+ "applicationUnitType": null,
+ "applicationInternalName": "開口補強筋 斜筋径"
+ },
+ "開口補強筋 横筋径": {
+ "id": "982eb88059ea7999e47e8f9b8fece66b",
+ "name": "開口補強筋 横筋径",
+ "units": null,
+ "value": "",
+ "isShared": false,
+ "isReadOnly": false,
+ "speckle_type": "Objects.BuiltElements.Revit.Parameter",
+ "applicationId": null,
+ "applicationUnit": null,
+ "isTypeParameter": true,
+ "totalChildrenCount": 0,
+ "applicationUnitType": null,
+ "applicationInternalName": "開口補強筋 横筋径"
+ },
+ "開口補強筋 縦筋径": {
+ "id": "95ce337d39eb9cd006358b01bc3f3867",
+ "name": "開口補強筋 縦筋径",
+ "units": null,
+ "value": "",
+ "isShared": false,
+ "isReadOnly": false,
+ "speckle_type": "Objects.BuiltElements.Revit.Parameter",
+ "applicationId": null,
+ "applicationUnit": null,
+ "isTypeParameter": true,
+ "totalChildrenCount": 0,
+ "applicationUnitType": null,
+ "applicationInternalName": "開口補強筋 縦筋径"
+ },
+ "ELEM_FAMILY_AND_TYPE_PARAM": {
+ "id": "8df6a5d7d61a24f5760864d4ebcccc5a",
+ "name": "Family and Type",
+ "units": null,
+ "value": "W30(Fc24)",
+ "isShared": false,
+ "isReadOnly": false,
+ "speckle_type": "Objects.BuiltElements.Revit.Parameter",
+ "applicationId": null,
+ "applicationUnit": null,
+ "isTypeParameter": false,
+ "totalChildrenCount": 0,
+ "applicationUnitType": null,
+ "applicationInternalName": "ELEM_FAMILY_AND_TYPE_PARAM"
+ },
+ "IFC_EXPORT_ELEMENT_TYPE_AS": {
+ "id": "08ef7fe13e19f78ee030301957ed685f",
+ "name": "Export Type to IFC As",
+ "units": null,
+ "value": null,
+ "isShared": false,
+ "isReadOnly": false,
+ "speckle_type": "Objects.BuiltElements.Revit.Parameter",
+ "applicationId": null,
+ "applicationUnit": null,
+ "isTypeParameter": true,
+ "totalChildrenCount": 0,
+ "applicationUnitType": null,
+ "applicationInternalName": "IFC_EXPORT_ELEMENT_TYPE_AS"
+ },
+ "ALL_MODEL_INSTANCE_COMMENTS": {
+ "id": "a6151cb13456ef39b86fd79c833dd574",
+ "name": "Comments",
+ "units": null,
+ "value": "",
+ "isShared": false,
+ "isReadOnly": false,
+ "speckle_type": "Objects.BuiltElements.Revit.Parameter",
+ "applicationId": null,
+ "applicationUnit": null,
+ "isTypeParameter": false,
+ "totalChildrenCount": 0,
+ "applicationUnitType": null,
+ "applicationInternalName": "ALL_MODEL_INSTANCE_COMMENTS"
+ },
+ "WALL_STRUCTURAL_USAGE_PARAM": {
+ "id": "b8bb8937c07a425ab818632ed1103491",
+ "name": "Structural Usage",
+ "units": null,
+ "value": 1,
+ "isShared": false,
+ "isReadOnly": false,
+ "speckle_type": "Objects.BuiltElements.Revit.Parameter",
+ "applicationId": null,
+ "applicationUnit": null,
+ "isTypeParameter": false,
+ "totalChildrenCount": 0,
+ "applicationUnitType": null,
+ "applicationInternalName": "WALL_STRUCTURAL_USAGE_PARAM"
+ },
+ "横筋 主筋配列タイプ": {
+ "id": "f3e191564aa79490e296764e28f3549d",
+ "name": "横筋 主筋配列タイプ",
+ "units": null,
+ "value": "",
+ "isShared": false,
+ "isReadOnly": false,
+ "speckle_type": "Objects.BuiltElements.Revit.Parameter",
+ "applicationId": null,
+ "applicationUnit": null,
+ "isTypeParameter": true,
+ "totalChildrenCount": 0,
+ "applicationUnitType": null,
+ "applicationInternalName": "横筋 主筋配列タイプ"
+ },
+ "縦筋 主筋配列タイプ": {
+ "id": "134feeab85c34c7c4282287266ada0d3",
+ "name": "縦筋 主筋配列タイプ",
+ "units": null,
+ "value": "",
+ "isShared": false,
+ "isReadOnly": false,
+ "speckle_type": "Objects.BuiltElements.Revit.Parameter",
+ "applicationId": null,
+ "applicationUnit": null,
+ "isTypeParameter": true,
+ "totalChildrenCount": 0,
+ "applicationUnitType": null,
+ "applicationInternalName": "縦筋 主筋配列タイプ"
+ },
+ "ANALYTICAL_THERMAL_RESISTANCE": {
+ "id": "7245343997d68e458c6b381dd279f15c",
+ "name": "Thermal Resistance (R)",
+ "units": "(m²·K)/W",
+ "value": null,
+ "isShared": false,
+ "isReadOnly": true,
+ "speckle_type": "Objects.BuiltElements.Revit.Parameter",
+ "applicationId": null,
+ "applicationUnit": "autodesk.unit.unit:squareMeterKelvinsPerWatt-1.0.1",
+ "isTypeParameter": true,
+ "totalChildrenCount": 0,
+ "applicationUnitType": null,
+ "applicationInternalName": "ANALYTICAL_THERMAL_RESISTANCE"
+ },
+ "WALL_TOP_EXTENSION_DIST_PARAM": {
+ "id": "9b78bb419c97b74813b28719a9bfcaf4",
+ "name": "Top Extension Distance",
+ "units": "mm",
+ "value": 0,
+ "isShared": false,
+ "isReadOnly": true,
+ "speckle_type": "Objects.BuiltElements.Revit.Parameter",
+ "applicationId": null,
+ "applicationUnit": "autodesk.unit.unit:millimeters-1.0.1",
+ "isTypeParameter": false,
+ "totalChildrenCount": 0,
+ "applicationUnitType": null,
+ "applicationInternalName": "WALL_TOP_EXTENSION_DIST_PARAM"
+ },
+ "開口補強筋 斜筋 本数": {
+ "id": "2d4fd7106ab9c96557e51ee988bed498",
+ "name": "開口補強筋 斜筋 本数",
+ "units": null,
+ "value": "―",
+ "isShared": false,
+ "isReadOnly": false,
+ "speckle_type": "Objects.BuiltElements.Revit.Parameter",
+ "applicationId": null,
+ "applicationUnit": null,
+ "isTypeParameter": true,
+ "totalChildrenCount": 0,
+ "applicationUnitType": null,
+ "applicationInternalName": "開口補強筋 斜筋 本数"
+ },
+ "開口補強筋 横筋 本数": {
+ "id": "dc3b743b5b31f35e0f003260dbab5ab7",
+ "name": "開口補強筋 横筋 本数",
+ "units": null,
+ "value": "―",
+ "isShared": false,
+ "isReadOnly": false,
+ "speckle_type": "Objects.BuiltElements.Revit.Parameter",
+ "applicationId": null,
+ "applicationUnit": null,
+ "isTypeParameter": true,
+ "totalChildrenCount": 0,
+ "applicationUnitType": null,
+ "applicationInternalName": "開口補強筋 横筋 本数"
+ },
+ "開口補強筋 縦筋 本数": {
+ "id": "259c67c82b4bda585ee2d63becad3f32",
+ "name": "開口補強筋 縦筋 本数",
+ "units": null,
+ "value": "―",
+ "isShared": false,
+ "isReadOnly": false,
+ "speckle_type": "Objects.BuiltElements.Revit.Parameter",
+ "applicationId": null,
+ "applicationUnit": null,
+ "isTypeParameter": true,
+ "totalChildrenCount": 0,
+ "applicationUnitType": null,
+ "applicationInternalName": "開口補強筋 縦筋 本数"
+ },
+ "IFC_EXPORT_PREDEFINEDTYPE_TYPE": {
+ "id": "f13c388136536408dacc5e0ee89fd9e0",
+ "name": "Type IFC Predefined Type",
+ "units": null,
+ "value": null,
+ "isShared": false,
+ "isReadOnly": false,
+ "speckle_type": "Objects.BuiltElements.Revit.Parameter",
+ "applicationId": null,
+ "applicationUnit": null,
+ "isTypeParameter": true,
+ "totalChildrenCount": 0,
+ "applicationUnitType": null,
+ "applicationInternalName": "IFC_EXPORT_PREDEFINEDTYPE_TYPE"
+ },
+ "COARSE_SCALE_FILL_PATTERN_COLOR": {
+ "id": "cc2dc46bbd456ed85ceae83affbc8d1d",
+ "name": "Coarse Scale Fill Color",
+ "units": null,
+ "value": 0,
+ "isShared": false,
+ "isReadOnly": false,
+ "speckle_type": "Objects.BuiltElements.Revit.Parameter",
+ "applicationId": null,
+ "applicationUnit": null,
+ "isTypeParameter": true,
+ "totalChildrenCount": 0,
+ "applicationUnitType": null,
+ "applicationInternalName": "COARSE_SCALE_FILL_PATTERN_COLOR"
+ },
+ "WALL_BOTTOM_EXTENSION_DIST_PARAM": {
+ "id": "94108dc85de8611fee053504bee85812",
+ "name": "Base Extension Distance",
+ "units": "mm",
+ "value": 0,
+ "isShared": false,
+ "isReadOnly": true,
+ "speckle_type": "Objects.BuiltElements.Revit.Parameter",
+ "applicationId": null,
+ "applicationUnit": "autodesk.unit.unit:millimeters-1.0.1",
+ "isTypeParameter": false,
+ "totalChildrenCount": 0,
+ "applicationUnitType": null,
+ "applicationInternalName": "WALL_BOTTOM_EXTENSION_DIST_PARAM"
+ },
+ "ANALYTICAL_ELEMENT_HAS_ASSOCIATION": {
+ "id": "7b62e323ef4e0c70504e5da33355a8cf",
+ "name": "Has Association",
+ "units": null,
+ "value": true,
+ "isShared": false,
+ "isReadOnly": true,
+ "speckle_type": "Objects.BuiltElements.Revit.Parameter",
+ "applicationId": null,
+ "applicationUnit": null,
+ "isTypeParameter": false,
+ "totalChildrenCount": 0,
+ "applicationUnitType": null,
+ "applicationInternalName": "ANALYTICAL_ELEMENT_HAS_ASSOCIATION"
+ },
+ "COARSE_SCALE_FILL_PATTERN_ID_PARAM": {
+ "id": "04fc11a30d5cee03c44ad04ff8efa3c8",
+ "name": "Coarse Scale Fill Pattern",
+ "units": null,
+ "value": "-1",
+ "isShared": false,
+ "isReadOnly": false,
+ "speckle_type": "Objects.BuiltElements.Revit.Parameter",
+ "applicationId": null,
+ "applicationUnit": null,
+ "isTypeParameter": true,
+ "totalChildrenCount": 0,
+ "applicationUnitType": null,
+ "applicationInternalName": "COARSE_SCALE_FILL_PATTERN_ID_PARAM"
+ },
+ "031a6ed6-93a1-44a6-a9ce-ccb9d550178c": {
+ "id": "3eee0f1c3b6af014e4826800611fe4df",
+ "name": "横筋径1",
+ "units": null,
+ "value": null,
+ "isShared": true,
+ "isReadOnly": false,
+ "speckle_type": "Objects.BuiltElements.Revit.Parameter",
+ "applicationId": null,
+ "applicationUnit": null,
+ "isTypeParameter": true,
+ "totalChildrenCount": 0,
+ "applicationUnitType": null,
+ "applicationInternalName": "031a6ed6-93a1-44a6-a9ce-ccb9d550178c"
+ },
+ "03a6aadb-5f60-4d1e-9664-3a0dfa8a903c": {
+ "id": "f889e20acb8e539be4ec203b7027f253",
+ "name": "配筋タイプ",
+ "units": null,
+ "value": null,
+ "isShared": true,
+ "isReadOnly": false,
+ "speckle_type": "Objects.BuiltElements.Revit.Parameter",
+ "applicationId": null,
+ "applicationUnit": null,
+ "isTypeParameter": true,
+ "totalChildrenCount": 0,
+ "applicationUnitType": null,
+ "applicationInternalName": "03a6aadb-5f60-4d1e-9664-3a0dfa8a903c"
+ },
+ "0560d1bb-007b-45e4-b8c3-87f9c6a3d73c": {
+ "id": "9808b00361e296ccb7e5770c6eed5d56",
+ "name": "構造スリット 下端",
+ "units": null,
+ "value": false,
+ "isShared": true,
+ "isReadOnly": false,
+ "speckle_type": "Objects.BuiltElements.Revit.Parameter",
+ "applicationId": null,
+ "applicationUnit": null,
+ "isTypeParameter": false,
+ "totalChildrenCount": 0,
+ "applicationUnitType": null,
+ "applicationInternalName": "0560d1bb-007b-45e4-b8c3-87f9c6a3d73c"
+ },
+ "3750828c-ca7b-4501-8866-2912e0f9c9c9": {
+ "id": "64254415a3dfb963d9ca89878168e237",
+ "name": "構造スリット 上端",
+ "units": null,
+ "value": null,
+ "isShared": true,
+ "isReadOnly": false,
+ "speckle_type": "Objects.BuiltElements.Revit.Parameter",
+ "applicationId": null,
+ "applicationUnit": null,
+ "isTypeParameter": false,
+ "totalChildrenCount": 0,
+ "applicationUnitType": null,
+ "applicationInternalName": "3750828c-ca7b-4501-8866-2912e0f9c9c9"
+ },
+ "60795a90-8c91-4e11-90a0-b77b819c2403": {
+ "id": "cf84f8413f59389326154a5e3aa72a8c",
+ "name": "構造スリット 始端",
+ "units": null,
+ "value": false,
+ "isShared": true,
+ "isReadOnly": false,
+ "speckle_type": "Objects.BuiltElements.Revit.Parameter",
+ "applicationId": null,
+ "applicationUnit": null,
+ "isTypeParameter": false,
+ "totalChildrenCount": 0,
+ "applicationUnitType": null,
+ "applicationInternalName": "60795a90-8c91-4e11-90a0-b77b819c2403"
+ },
+ "65e579b4-1073-4d12-80da-a40b34734cc0": {
+ "id": "b276b69010e7d152a3afe6826e548d5f",
+ "name": "配置位置情報",
+ "units": null,
+ "value": null,
+ "isShared": true,
+ "isReadOnly": false,
+ "speckle_type": "Objects.BuiltElements.Revit.Parameter",
+ "applicationId": null,
+ "applicationUnit": null,
+ "isTypeParameter": false,
+ "totalChildrenCount": 0,
+ "applicationUnitType": null,
+ "applicationInternalName": "65e579b4-1073-4d12-80da-a40b34734cc0"
+ },
+ "6796d143-ef09-4441-9ecc-3411fe837a65": {
+ "id": "817ec1a0d32f3de0fcca6d7eb5b446d6",
+ "name": "縦筋ピッチ",
+ "units": null,
+ "value": null,
+ "isShared": true,
+ "isReadOnly": false,
+ "speckle_type": "Objects.BuiltElements.Revit.Parameter",
+ "applicationId": null,
+ "applicationUnit": "autodesk.unit.unit:general-1.0.1",
+ "isTypeParameter": true,
+ "totalChildrenCount": 0,
+ "applicationUnitType": null,
+ "applicationInternalName": "6796d143-ef09-4441-9ecc-3411fe837a65"
+ },
+ "99066c2f-d804-4cf9-a413-4d558c2c2c11": {
+ "id": "5703496021b5efda82b890c3f8539ea8",
+ "name": "横筋径2",
+ "units": null,
+ "value": null,
+ "isShared": true,
+ "isReadOnly": false,
+ "speckle_type": "Objects.BuiltElements.Revit.Parameter",
+ "applicationId": null,
+ "applicationUnit": null,
+ "isTypeParameter": true,
+ "totalChildrenCount": 0,
+ "applicationUnitType": null,
+ "applicationInternalName": "99066c2f-d804-4cf9-a413-4d558c2c2c11"
+ },
+ "ANALYTICAL_HEAT_TRANSFER_COEFFICIENT": {
+ "id": "18ca50476c9acc7270223f29480df80d",
+ "name": "Heat Transfer Coefficient (U)",
+ "units": "W/(m²·K)",
+ "value": null,
+ "isShared": false,
+ "isReadOnly": true,
+ "speckle_type": "Objects.BuiltElements.Revit.Parameter",
+ "applicationId": null,
+ "applicationUnit": "autodesk.unit.unit:wattsPerSquareMeterKelvin-1.0.1",
+ "isTypeParameter": true,
+ "totalChildrenCount": 0,
+ "applicationUnitType": null,
+ "applicationInternalName": "ANALYTICAL_HEAT_TRANSFER_COEFFICIENT"
+ },
+ "bd6a1903-5430-45a0-a493-703ff58a94d5": {
+ "id": "4a2083826f7fe05eb467138bef859f6f",
+ "name": "縦筋径2",
+ "units": null,
+ "value": null,
+ "isShared": true,
+ "isReadOnly": false,
+ "speckle_type": "Objects.BuiltElements.Revit.Parameter",
+ "applicationId": null,
+ "applicationUnit": null,
+ "isTypeParameter": true,
+ "totalChildrenCount": 0,
+ "applicationUnitType": null,
+ "applicationInternalName": "bd6a1903-5430-45a0-a493-703ff58a94d5"
+ },
+ "cc4ea676-5014-4905-ae83-a9508800fa35": {
+ "id": "a48e39f9b6ef12235c45e762fdc8dd7d",
+ "name": "縦筋径1",
+ "units": null,
+ "value": null,
+ "isShared": true,
+ "isReadOnly": false,
+ "speckle_type": "Objects.BuiltElements.Revit.Parameter",
+ "applicationId": null,
+ "applicationUnit": null,
+ "isTypeParameter": true,
+ "totalChildrenCount": 0,
+ "applicationUnitType": null,
+ "applicationInternalName": "cc4ea676-5014-4905-ae83-a9508800fa35"
+ },
+ "cd19c040-0788-4424-8a67-7127427e311f": {
+ "id": "67b1bf6c3e8202d72527c2215076e408",
+ "name": "横筋ピッチ",
+ "units": null,
+ "value": null,
+ "isShared": true,
+ "isReadOnly": false,
+ "speckle_type": "Objects.BuiltElements.Revit.Parameter",
+ "applicationId": null,
+ "applicationUnit": "autodesk.unit.unit:general-1.0.1",
+ "isTypeParameter": true,
+ "totalChildrenCount": 0,
+ "applicationUnitType": null,
+ "applicationInternalName": "cd19c040-0788-4424-8a67-7127427e311f"
+ },
+ "e3223f14-6158-4d4f-8697-0de2bcc7f737": {
+ "id": "760ab37568b5c8ade3fbddd92500420c",
+ "name": "構造スリット 終端",
+ "units": null,
+ "value": false,
+ "isShared": true,
+ "isReadOnly": false,
+ "speckle_type": "Objects.BuiltElements.Revit.Parameter",
+ "applicationId": null,
+ "applicationUnit": null,
+ "isTypeParameter": false,
+ "totalChildrenCount": 0,
+ "applicationUnitType": null,
+ "applicationInternalName": "e3223f14-6158-4d4f-8697-0de2bcc7f737"
+ },
+ "ee1f33e1-5506-4a64-b87b-7b98d30aea52": {
+ "id": "27cb51ebdf21d4fe5cb4da8874b801f3",
+ "name": "符号",
+ "units": null,
+ "value": "W30",
+ "isShared": true,
+ "isReadOnly": false,
+ "speckle_type": "Objects.BuiltElements.Revit.Parameter",
+ "applicationId": null,
+ "applicationUnit": null,
+ "isTypeParameter": true,
+ "totalChildrenCount": 0,
+ "applicationUnitType": null,
+ "applicationInternalName": "ee1f33e1-5506-4a64-b87b-7b98d30aea52"
+ }
+ },
+ "structural": true,
+ "displayValue": [
+ {
+ "referencedId": "d1b4feed8d71926a25a42d86f9a81209",
+ "speckle_type": "reference"
+ }
+ ],
+ "phaseCreated": "フェーズ1",
+ "speckle_type": "Objects.BuiltElements.Wall:Objects.BuiltElements.Revit.RevitWall",
+ "applicationId": "32d24e7d-27ff-4d8f-bf26-37ca63da76cc-00445b6c",
+ "builtInCategory": "OST_Walls",
+ "isRevitLinkedModel": false,
+ "materialQuantities": [
+ {
+ "id": "cbc89c0323c9555b9770a1510587a145",
+ "area": 7630000.000000016,
+ "units": "mm",
+ "length": 5300.000000000002,
+ "volume": 2289000000.0000134,
+ "material": {
+ "referencedId": "78b63dbbe244fafafc0a95cf61f1cbc1",
+ "speckle_type": "reference"
+ },
+ "speckle_type": "Objects.Other.MaterialQuantity",
+ "applicationId": null,
+ "totalChildrenCount": 0
+ }
+ ],
+ "totalChildrenCount": null,
+ "revitLinkedModelPath": "C:\\Program Files\\Autodesk\\Revit 2024\\Samples\\サンプル構造.rvt"
+ },
+ {
+ "id": "210e0ea727c735970c576cd0beab0493",
+ "data": [
+ 22550.00031738281,
+ 15049.999969482422,
+ -2000.000015258789,
+ 22550.00031738281,
+ 20274.999645996093,
+ -2000.000015258789,
+ 22550.00031738281,
+ 20499.999865722657,
+ -2000.000015258789,
+ 22550.00031738281,
+ 20499.999865722657,
+ -600.0000045776368,
+ 22550.00031738281,
+ 20274.999645996093,
+ -600.0000045776368,
+ 22550.00031738281,
+ 15049.999969482422,
+ -600.0000045776368,
+ 22250.000024414065,
+ 15049.999969482422,
+ -2000.000015258789,
+ 22250.000024414065,
+ 15049.999969482422,
+ -600.0000045776368,
+ 22250.000024414065,
+ 15350.000262451173,
+ -600.0000045776368,
+ 22250.000024414065,
+ 20274.999645996093,
+ -600.0000045776368,
+ 22250.000024414065,
+ 20499.999865722657,
+ -600.0000045776368,
+ 22250.000024414065,
+ 20499.999865722657,
+ -2000.000015258789,
+ 22250.000024414065,
+ 20274.999645996093,
+ -2000.000015258789,
+ 22250.000024414065,
+ 15350.000262451173,
+ -2000.000015258789,
+ 22550.00031738281,
+ 20499.999865722657,
+ -2000.000015258789,
+ 22550.00031738281,
+ 20274.999645996093,
+ -2000.000015258789,
+ 22550.00031738281,
+ 15049.999969482422,
+ -2000.000015258789,
+ 22250.000024414065,
+ 15049.999969482422,
+ -2000.000015258789,
+ 22250.000024414065,
+ 15350.000262451173,
+ -2000.000015258789,
+ 22250.000024414065,
+ 20274.999645996093,
+ -2000.000015258789,
+ 22250.000024414065,
+ 20499.999865722657,
+ -2000.000015258789,
+ 22550.00031738281,
+ 20499.999865722657,
+ -2000.000015258789,
+ 22250.000024414065,
+ 20499.999865722657,
+ -2000.000015258789,
+ 22250.000024414065,
+ 20499.999865722657,
+ -600.0000045776368,
+ 22550.00031738281,
+ 20499.999865722657,
+ -600.0000045776368,
+ 22550.00031738281,
+ 15049.999969482422,
+ -600.0000045776368,
+ 22550.00031738281,
+ 20274.999645996093,
+ -600.0000045776368,
+ 22550.00031738281,
+ 20499.999865722657,
+ -600.0000045776368,
+ 22250.000024414065,
+ 20499.999865722657,
+ -600.0000045776368,
+ 22250.000024414065,
+ 20274.999645996093,
+ -600.0000045776368,
+ 22250.000024414065,
+ 15350.000262451173,
+ -600.0000045776368,
+ 22250.000024414065,
+ 15049.999969482422,
+ -600.0000045776368,
+ 22550.00031738281,
+ 15049.999969482422,
+ -600.0000045776368,
+ 22250.000024414065,
+ 15049.999969482422,
+ -600.0000045776368,
+ 22250.000024414065,
+ 15049.999969482422,
+ -2000.000015258789,
+ 22550.00031738281,
+ 15049.999969482422,
+ -2000.000015258789
+ ],
+ "speckle_type": "Speckle.Core.Models.DataChunk",
+ "applicationId": null,
+ "totalChildrenCount": 0
+ },
+ {
+ "id": "30ba0a6aba886a2e800b12bb37656ab3",
+ "data": [
+ 3,
+ 5,
+ 0,
+ 1,
+ 3,
+ 5,
+ 1,
+ 4,
+ 3,
+ 4,
+ 2,
+ 3,
+ 3,
+ 2,
+ 4,
+ 1,
+ 3,
+ 11,
+ 12,
+ 9,
+ 3,
+ 9,
+ 10,
+ 11,
+ 3,
+ 12,
+ 13,
+ 9,
+ 3,
+ 13,
+ 6,
+ 8,
+ 3,
+ 7,
+ 8,
+ 6,
+ 3,
+ 13,
+ 8,
+ 9,
+ 3,
+ 15,
+ 16,
+ 18,
+ 3,
+ 14,
+ 15,
+ 19,
+ 3,
+ 17,
+ 18,
+ 16,
+ 3,
+ 19,
+ 20,
+ 14,
+ 3,
+ 18,
+ 19,
+ 15,
+ 3,
+ 21,
+ 22,
+ 23,
+ 3,
+ 23,
+ 24,
+ 21,
+ 3,
+ 26,
+ 27,
+ 29,
+ 3,
+ 25,
+ 26,
+ 30,
+ 3,
+ 28,
+ 29,
+ 27,
+ 3,
+ 30,
+ 31,
+ 25,
+ 3,
+ 29,
+ 30,
+ 26,
+ 3,
+ 32,
+ 33,
+ 34,
+ 3,
+ 34,
+ 35,
+ 32
+ ],
+ "speckle_type": "Speckle.Core.Models.DataChunk",
+ "applicationId": null,
+ "totalChildrenCount": 0
+ },
+ {
+ "id": "78b63dbbe244fafafc0a95cf61f1cbc1",
+ "name": "Fc24",
+ "units": "mm",
+ "category": "Materials",
+ "elementId": "3536906",
+ "shininess": 64,
+ "worksetId": "0",
+ "parameters": {
+ "id": "e12bca490aebaff501c5b406919d815f",
+ "IFC_GUID": {
+ "id": "17c3bf4d76621a920526f6575976399f",
+ "name": "IfcGUID",
+ "units": null,
+ "value": "3Fptj$rfjDy8TIvUXScHaX",
+ "isShared": false,
+ "isReadOnly": false,
+ "speckle_type": "Objects.BuiltElements.Revit.Parameter",
+ "applicationId": null,
+ "applicationUnit": null,
+ "isTypeParameter": false,
+ "totalChildrenCount": 0,
+ "applicationUnitType": null,
+ "applicationInternalName": "IFC_GUID"
+ },
+ "speckle_type": "Base",
+ "ALL_MODEL_URL": {
+ "id": "77d61973d49275f7d998a3571a0a25fa",
+ "name": "URL",
+ "units": null,
+ "value": "",
+ "isShared": false,
+ "isReadOnly": false,
+ "speckle_type": "Objects.BuiltElements.Revit.Parameter",
+ "applicationId": null,
+ "applicationUnit": null,
+ "isTypeParameter": true,
+ "totalChildrenCount": 0,
+ "applicationUnitType": null,
+ "applicationInternalName": "ALL_MODEL_URL"
+ },
+ "KEYNOTE_PARAM": {
+ "id": "914f16b47a4a306b6e82cca879a470d7",
+ "name": "Keynote",
+ "units": null,
+ "value": "",
+ "isShared": false,
+ "isReadOnly": true,
+ "speckle_type": "Objects.BuiltElements.Revit.Parameter",
+ "applicationId": null,
+ "applicationUnit": null,
+ "isTypeParameter": true,
+ "totalChildrenCount": 0,
+ "applicationUnitType": null,
+ "applicationInternalName": "KEYNOTE_PARAM"
+ },
+ "MATERIAL_NAME": {
+ "id": "b8c8d905ba449a911e8be72271a9ed85",
+ "name": "Name",
+ "units": null,
+ "value": "Fc24",
+ "isShared": false,
+ "isReadOnly": true,
+ "speckle_type": "Objects.BuiltElements.Revit.Parameter",
+ "applicationId": null,
+ "applicationUnit": null,
+ "isTypeParameter": false,
+ "totalChildrenCount": 0,
+ "applicationUnitType": null,
+ "applicationInternalName": "MATERIAL_NAME"
+ },
+ "applicationId": null,
+ "ALL_MODEL_COST": {
+ "id": "5f73704463c7c1506d06d8440bc587a9",
+ "name": "Cost",
+ "units": "฿",
+ "value": 0,
+ "isShared": false,
+ "isReadOnly": false,
+ "speckle_type": "Objects.BuiltElements.Revit.Parameter",
+ "applicationId": null,
+ "applicationUnit": "autodesk.unit.unit:currency-1.0.0",
+ "isTypeParameter": true,
+ "totalChildrenCount": 0,
+ "applicationUnitType": null,
+ "applicationInternalName": "ALL_MODEL_COST"
+ },
+ "ALL_MODEL_MARK": {
+ "id": "790542e881b00e4ab74d4901c8c34357",
+ "name": "Mark",
+ "units": null,
+ "value": "",
+ "isShared": false,
+ "isReadOnly": false,
+ "speckle_type": "Objects.BuiltElements.Revit.Parameter",
+ "applicationId": null,
+ "applicationUnit": null,
+ "isTypeParameter": false,
+ "totalChildrenCount": 0,
+ "applicationUnitType": null,
+ "applicationInternalName": "ALL_MODEL_MARK"
+ },
+ "ALL_MODEL_IMAGE": {
+ "id": "0bbd2950d953cd6769260720039799ce",
+ "name": "Image",
+ "units": null,
+ "value": "-1",
+ "isShared": false,
+ "isReadOnly": false,
+ "speckle_type": "Objects.BuiltElements.Revit.Parameter",
+ "applicationId": null,
+ "applicationUnit": null,
+ "isTypeParameter": false,
+ "totalChildrenCount": 0,
+ "applicationUnitType": null,
+ "applicationInternalName": "ALL_MODEL_IMAGE"
+ },
+ "ALL_MODEL_MODEL": {
+ "id": "dda0363a01f2ec975cc16cfba9a53274",
+ "name": "Model",
+ "units": null,
+ "value": "",
+ "isShared": false,
+ "isReadOnly": false,
+ "speckle_type": "Objects.BuiltElements.Revit.Parameter",
+ "applicationId": null,
+ "applicationUnit": null,
+ "isTypeParameter": true,
+ "totalChildrenCount": 0,
+ "applicationUnitType": null,
+ "applicationInternalName": "ALL_MODEL_MODEL"
+ },
+ "DESIGN_OPTION_ID": {
+ "id": "88f4af03d8e3506766765215a5b87813",
+ "name": "Design Option",
+ "units": null,
+ "value": "-1",
+ "isShared": false,
+ "isReadOnly": true,
+ "speckle_type": "Objects.BuiltElements.Revit.Parameter",
+ "applicationId": null,
+ "applicationUnit": null,
+ "isTypeParameter": false,
+ "totalChildrenCount": 0,
+ "applicationUnitType": null,
+ "applicationInternalName": "DESIGN_OPTION_ID"
+ },
+ "SYMBOL_NAME_PARAM": {
+ "id": "fe43cb940741f29b6cd508611db70c0a",
+ "name": "Type Name",
+ "units": null,
+ "value": null,
+ "isShared": false,
+ "isReadOnly": true,
+ "speckle_type": "Objects.BuiltElements.Revit.Parameter",
+ "applicationId": null,
+ "applicationUnit": null,
+ "isTypeParameter": false,
+ "totalChildrenCount": 0,
+ "applicationUnitType": null,
+ "applicationInternalName": "SYMBOL_NAME_PARAM"
+ },
+ "IFC_EXPORT_ELEMENT": {
+ "id": "ac8493ea527ffedf1d7bcf5826dab455",
+ "name": "Export to IFC",
+ "units": null,
+ "value": 0,
+ "isShared": false,
+ "isReadOnly": false,
+ "speckle_type": "Objects.BuiltElements.Revit.Parameter",
+ "applicationId": null,
+ "applicationUnit": null,
+ "isTypeParameter": false,
+ "totalChildrenCount": 0,
+ "applicationUnitType": null,
+ "applicationInternalName": "IFC_EXPORT_ELEMENT"
+ },
+ "totalChildrenCount": 0,
+ "ELEM_CATEGORY_PARAM": {
+ "id": "9afb27a0af34166ffc2fdadfa999b71d",
+ "name": "Category",
+ "units": null,
+ "value": "-2000700",
+ "isShared": false,
+ "isReadOnly": true,
+ "speckle_type": "Objects.BuiltElements.Revit.Parameter",
+ "applicationId": null,
+ "applicationUnit": null,
+ "isTypeParameter": false,
+ "totalChildrenCount": 0,
+ "applicationUnitType": null,
+ "applicationInternalName": "ELEM_CATEGORY_PARAM"
+ },
+ "MATERIAL_PARAM_GLOW": {
+ "id": "07ce2bab8200d4c162d967a56c012b7b",
+ "name": "Glow",
+ "units": null,
+ "value": false,
+ "isShared": false,
+ "isReadOnly": false,
+ "speckle_type": "Objects.BuiltElements.Revit.Parameter",
+ "applicationId": null,
+ "applicationUnit": null,
+ "isTypeParameter": false,
+ "totalChildrenCount": 0,
+ "applicationUnitType": null,
+ "applicationInternalName": "MATERIAL_PARAM_GLOW"
+ },
+ "MATERIAL_PARAM_COLOR": {
+ "id": "249d80bc79d53c21f7a7d90eec4591bc",
+ "name": "Color",
+ "units": null,
+ "value": 13816530,
+ "isShared": false,
+ "isReadOnly": false,
+ "speckle_type": "Objects.BuiltElements.Revit.Parameter",
+ "applicationId": null,
+ "applicationUnit": null,
+ "isTypeParameter": false,
+ "totalChildrenCount": 0,
+ "applicationUnitType": null,
+ "applicationInternalName": "MATERIAL_PARAM_COLOR"
+ },
+ "ALL_MODEL_DESCRIPTION": {
+ "id": "9176e6b7f2fb3fc5e6ec34323ed39851",
+ "name": "Description",
+ "units": null,
+ "value": "",
+ "isShared": false,
+ "isReadOnly": false,
+ "speckle_type": "Objects.BuiltElements.Revit.Parameter",
+ "applicationId": null,
+ "applicationUnit": null,
+ "isTypeParameter": true,
+ "totalChildrenCount": 0,
+ "applicationUnitType": null,
+ "applicationInternalName": "ALL_MODEL_DESCRIPTION"
+ },
+ "IFC_EXPORT_ELEMENT_AS": {
+ "id": "beab0eef32c6a433e7c996a75f6d46d9",
+ "name": "Export to IFC As",
+ "units": null,
+ "value": null,
+ "isShared": false,
+ "isReadOnly": false,
+ "speckle_type": "Objects.BuiltElements.Revit.Parameter",
+ "applicationId": null,
+ "applicationUnit": null,
+ "isTypeParameter": false,
+ "totalChildrenCount": 0,
+ "applicationUnitType": null,
+ "applicationInternalName": "IFC_EXPORT_ELEMENT_AS"
+ },
+ "ALL_MODEL_MANUFACTURER": {
+ "id": "4f80f3bdf4c9fb907121b3514b073700",
+ "name": "Manufacturer",
+ "units": null,
+ "value": "",
+ "isShared": false,
+ "isReadOnly": false,
+ "speckle_type": "Objects.BuiltElements.Revit.Parameter",
+ "applicationId": null,
+ "applicationUnit": null,
+ "isTypeParameter": true,
+ "totalChildrenCount": 0,
+ "applicationUnitType": null,
+ "applicationInternalName": "ALL_MODEL_MANUFACTURER"
+ },
+ "ELEM_CATEGORY_PARAM_MT": {
+ "id": "9b0b5169fad84379d3744cbf899a827b",
+ "name": "Category",
+ "units": null,
+ "value": "-2000700",
+ "isShared": false,
+ "isReadOnly": true,
+ "speckle_type": "Objects.BuiltElements.Revit.Parameter",
+ "applicationId": null,
+ "applicationUnit": null,
+ "isTypeParameter": false,
+ "totalChildrenCount": 0,
+ "applicationUnitType": null,
+ "applicationInternalName": "ELEM_CATEGORY_PARAM_MT"
+ },
+ "SPECKLE_Classification": {
+ "id": "2138dca3e3a7c852aeaa3fa65e5a5e8c",
+ "name": "SPECKLE_Classification",
+ "units": null,
+ "value": null,
+ "isShared": false,
+ "isReadOnly": false,
+ "speckle_type": "Objects.BuiltElements.Revit.Parameter",
+ "applicationId": null,
+ "applicationUnit": null,
+ "isTypeParameter": false,
+ "totalChildrenCount": 0,
+ "applicationUnitType": null,
+ "applicationInternalName": "SPECKLE_Classification"
+ },
+ "PHY_MATERIAL_PARAM_TYPE": {
+ "id": "3a2b1c0217cdf12101ff2d4730ed29a3",
+ "name": "Material Type",
+ "units": null,
+ "value": 2,
+ "isShared": false,
+ "isReadOnly": true,
+ "speckle_type": "Objects.BuiltElements.Revit.Parameter",
+ "applicationId": null,
+ "applicationUnit": null,
+ "isTypeParameter": false,
+ "totalChildrenCount": 0,
+ "applicationUnitType": null,
+ "applicationInternalName": "PHY_MATERIAL_PARAM_TYPE"
+ },
+ "MATERIAL_PARAM_SHININESS": {
+ "id": "048455a2c06efa01c8f54b1ac6ae9d6c",
+ "name": "Shininess",
+ "units": null,
+ "value": 64,
+ "isShared": false,
+ "isReadOnly": false,
+ "speckle_type": "Objects.BuiltElements.Revit.Parameter",
+ "applicationId": null,
+ "applicationUnit": null,
+ "isTypeParameter": false,
+ "totalChildrenCount": 0,
+ "applicationUnitType": null,
+ "applicationInternalName": "MATERIAL_PARAM_SHININESS"
+ },
+ "PHY_MATERIAL_PARAM_CLASS": {
+ "id": "9e21d1a407f3eeb3fa18350d9bdec69d",
+ "name": "Class",
+ "units": null,
+ "value": null,
+ "isShared": false,
+ "isReadOnly": true,
+ "speckle_type": "Objects.BuiltElements.Revit.Parameter",
+ "applicationId": null,
+ "applicationUnit": null,
+ "isTypeParameter": false,
+ "totalChildrenCount": 0,
+ "applicationUnitType": null,
+ "applicationInternalName": "PHY_MATERIAL_PARAM_CLASS"
+ },
+ "SYMBOL_FAMILY_NAME_PARAM": {
+ "id": "a52788d3716a07ca198833a2024a2f04",
+ "name": "Family Name",
+ "units": null,
+ "value": null,
+ "isShared": false,
+ "isReadOnly": true,
+ "speckle_type": "Objects.BuiltElements.Revit.Parameter",
+ "applicationId": null,
+ "applicationUnit": null,
+ "isTypeParameter": false,
+ "totalChildrenCount": 0,
+ "applicationUnitType": null,
+ "applicationInternalName": "SYMBOL_FAMILY_NAME_PARAM"
+ },
+ "IFC_EXPORT_PREDEFINEDTYPE": {
+ "id": "bef8079e3ea573218fef71b15b7a3b3d",
+ "name": "IFC Predefined Type",
+ "units": null,
+ "value": null,
+ "isShared": false,
+ "isReadOnly": false,
+ "speckle_type": "Objects.BuiltElements.Revit.Parameter",
+ "applicationId": null,
+ "applicationUnit": null,
+ "isTypeParameter": false,
+ "totalChildrenCount": 0,
+ "applicationUnitType": null,
+ "applicationInternalName": "IFC_EXPORT_PREDEFINEDTYPE"
+ },
+ "MATERIAL_PARAM_SMOOTHNESS": {
+ "id": "1b829d7baefd372729cd0ffffcc1428b",
+ "name": "Smoothness",
+ "units": null,
+ "value": 50,
+ "isShared": false,
+ "isReadOnly": false,
+ "speckle_type": "Objects.BuiltElements.Revit.Parameter",
+ "applicationId": null,
+ "applicationUnit": null,
+ "isTypeParameter": false,
+ "totalChildrenCount": 0,
+ "applicationUnitType": null,
+ "applicationInternalName": "MATERIAL_PARAM_SMOOTHNESS"
+ },
+ "ALL_MODEL_INSTANCE_COMMENTS": {
+ "id": "a6151cb13456ef39b86fd79c833dd574",
+ "name": "Comments",
+ "units": null,
+ "value": "",
+ "isShared": false,
+ "isReadOnly": false,
+ "speckle_type": "Objects.BuiltElements.Revit.Parameter",
+ "applicationId": null,
+ "applicationUnit": null,
+ "isTypeParameter": false,
+ "totalChildrenCount": 0,
+ "applicationUnitType": null,
+ "applicationInternalName": "ALL_MODEL_INSTANCE_COMMENTS"
+ },
+ "MATERIAL_PARAM_TRANSPARENCY": {
+ "id": "e87ecc901cb24535734c4ec126c3ff42",
+ "name": "Transparency",
+ "units": null,
+ "value": 0,
+ "isShared": false,
+ "isReadOnly": false,
+ "speckle_type": "Objects.BuiltElements.Revit.Parameter",
+ "applicationId": null,
+ "applicationUnit": null,
+ "isTypeParameter": false,
+ "totalChildrenCount": 0,
+ "applicationUnitType": null,
+ "applicationInternalName": "MATERIAL_PARAM_TRANSPARENCY"
+ },
+ "PHY_MATERIAL_PARAM_BEHAVIOR": {
+ "id": "80e17a634518cc49f2395e87276a988a",
+ "name": "Behavior",
+ "units": null,
+ "value": null,
+ "isShared": false,
+ "isReadOnly": false,
+ "speckle_type": "Objects.BuiltElements.Revit.Parameter",
+ "applicationId": null,
+ "applicationUnit": null,
+ "isTypeParameter": false,
+ "totalChildrenCount": 0,
+ "applicationUnitType": null,
+ "applicationInternalName": "PHY_MATERIAL_PARAM_BEHAVIOR"
+ },
+ "PHY_MATERIAL_PARAM_SUBCLASS": {
+ "id": "f6596da11827db5d37f43d8305faa368",
+ "name": "Subclass",
+ "units": null,
+ "value": null,
+ "isShared": false,
+ "isReadOnly": false,
+ "speckle_type": "Objects.BuiltElements.Revit.Parameter",
+ "applicationId": null,
+ "applicationUnit": null,
+ "isTypeParameter": false,
+ "totalChildrenCount": 0,
+ "applicationUnitType": null,
+ "applicationInternalName": "PHY_MATERIAL_PARAM_SUBCLASS"
+ },
+ "PHY_MATERIAL_PARAM_EXP_COEFF1": {
+ "id": "0c7b51a7d39920fbffa32b1f6a227a79",
+ "name": "Thermal expansion coefficient X",
+ "units": "1/°C",
+ "value": null,
+ "isShared": false,
+ "isReadOnly": false,
+ "speckle_type": "Objects.BuiltElements.Revit.Parameter",
+ "applicationId": null,
+ "applicationUnit": "autodesk.unit.unit:inverseDegreesCelsius-1.0.1",
+ "isTypeParameter": false,
+ "totalChildrenCount": 0,
+ "applicationUnitType": null,
+ "applicationInternalName": "PHY_MATERIAL_PARAM_EXP_COEFF1"
+ },
+ "PHY_MATERIAL_PARAM_EXP_COEFF2": {
+ "id": "2f09b81f7ae8a11b9f86cf0d15487b32",
+ "name": "Thermal expansion coefficient Y",
+ "units": "1/°C",
+ "value": null,
+ "isShared": false,
+ "isReadOnly": true,
+ "speckle_type": "Objects.BuiltElements.Revit.Parameter",
+ "applicationId": null,
+ "applicationUnit": "autodesk.unit.unit:inverseDegreesCelsius-1.0.1",
+ "isTypeParameter": false,
+ "totalChildrenCount": 0,
+ "applicationUnitType": null,
+ "applicationInternalName": "PHY_MATERIAL_PARAM_EXP_COEFF2"
+ },
+ "PHY_MATERIAL_PARAM_EXP_COEFF3": {
+ "id": "4bc9d38a99eb309b5a905cf5e012d9ca",
+ "name": "Thermal expansion coefficient Z",
+ "units": "1/°C",
+ "value": null,
+ "isShared": false,
+ "isReadOnly": true,
+ "speckle_type": "Objects.BuiltElements.Revit.Parameter",
+ "applicationId": null,
+ "applicationUnit": "autodesk.unit.unit:inverseDegreesCelsius-1.0.1",
+ "isTypeParameter": false,
+ "totalChildrenCount": 0,
+ "applicationUnitType": null,
+ "applicationInternalName": "PHY_MATERIAL_PARAM_EXP_COEFF3"
+ },
+ "PHY_MATERIAL_PARAM_SHEAR_MOD1": {
+ "id": "89395fb2129a5376c0b3361ca5467a32",
+ "name": "Shear modulus X",
+ "units": "MPa",
+ "value": null,
+ "isShared": false,
+ "isReadOnly": false,
+ "speckle_type": "Objects.BuiltElements.Revit.Parameter",
+ "applicationId": null,
+ "applicationUnit": "autodesk.unit.unit:megapascals-1.0.1",
+ "isTypeParameter": false,
+ "totalChildrenCount": 0,
+ "applicationUnitType": null,
+ "applicationInternalName": "PHY_MATERIAL_PARAM_SHEAR_MOD1"
+ },
+ "PHY_MATERIAL_PARAM_SHEAR_MOD2": {
+ "id": "c716c6a5f3a3ae95c457e65322d983b6",
+ "name": "Shear modulus Y",
+ "units": "MPa",
+ "value": null,
+ "isShared": false,
+ "isReadOnly": true,
+ "speckle_type": "Objects.BuiltElements.Revit.Parameter",
+ "applicationId": null,
+ "applicationUnit": "autodesk.unit.unit:megapascals-1.0.1",
+ "isTypeParameter": false,
+ "totalChildrenCount": 0,
+ "applicationUnitType": null,
+ "applicationInternalName": "PHY_MATERIAL_PARAM_SHEAR_MOD2"
+ },
+ "PHY_MATERIAL_PARAM_SHEAR_MOD3": {
+ "id": "fdfedb97c328d8c33b589aa1f963e7e5",
+ "name": "Shear modulus Z",
+ "units": "MPa",
+ "value": null,
+ "isShared": false,
+ "isReadOnly": true,
+ "speckle_type": "Objects.BuiltElements.Revit.Parameter",
+ "applicationId": null,
+ "applicationUnit": "autodesk.unit.unit:megapascals-1.0.1",
+ "isTypeParameter": false,
+ "totalChildrenCount": 0,
+ "applicationUnitType": null,
+ "applicationInternalName": "PHY_MATERIAL_PARAM_SHEAR_MOD3"
+ },
+ "PHY_MATERIAL_PARAM_YOUNG_MOD1": {
+ "id": "8e6aa66401295da7acd0937d8fd60bf0",
+ "name": "Young modulus X",
+ "units": "MPa",
+ "value": null,
+ "isShared": false,
+ "isReadOnly": false,
+ "speckle_type": "Objects.BuiltElements.Revit.Parameter",
+ "applicationId": null,
+ "applicationUnit": "autodesk.unit.unit:megapascals-1.0.1",
+ "isTypeParameter": false,
+ "totalChildrenCount": 0,
+ "applicationUnitType": null,
+ "applicationInternalName": "PHY_MATERIAL_PARAM_YOUNG_MOD1"
+ },
+ "PHY_MATERIAL_PARAM_YOUNG_MOD2": {
+ "id": "3f397a6665eba57524da0f5710001fd3",
+ "name": "Young modulus Y",
+ "units": "MPa",
+ "value": null,
+ "isShared": false,
+ "isReadOnly": true,
+ "speckle_type": "Objects.BuiltElements.Revit.Parameter",
+ "applicationId": null,
+ "applicationUnit": "autodesk.unit.unit:megapascals-1.0.1",
+ "isTypeParameter": false,
+ "totalChildrenCount": 0,
+ "applicationUnitType": null,
+ "applicationInternalName": "PHY_MATERIAL_PARAM_YOUNG_MOD2"
+ },
+ "PHY_MATERIAL_PARAM_YOUNG_MOD3": {
+ "id": "1ef77b2612c40e2f1c3fbeb60dabaf8c",
+ "name": "Young modulus Z",
+ "units": "MPa",
+ "value": null,
+ "isShared": false,
+ "isReadOnly": true,
+ "speckle_type": "Objects.BuiltElements.Revit.Parameter",
+ "applicationId": null,
+ "applicationUnit": "autodesk.unit.unit:megapascals-1.0.1",
+ "isTypeParameter": false,
+ "totalChildrenCount": 0,
+ "applicationUnitType": null,
+ "applicationInternalName": "PHY_MATERIAL_PARAM_YOUNG_MOD3"
+ },
+ "PHY_MATERIAL_PARAM_UNIT_WEIGHT": {
+ "id": "b896141f21ada1a1b1ef36f2992dec16",
+ "name": "Unit weight",
+ "units": "kN/m³",
+ "value": null,
+ "isShared": false,
+ "isReadOnly": false,
+ "speckle_type": "Objects.BuiltElements.Revit.Parameter",
+ "applicationId": null,
+ "applicationUnit": "autodesk.unit.unit:kilonewtonsPerCubicMeter-1.0.1",
+ "isTypeParameter": false,
+ "totalChildrenCount": 0,
+ "applicationUnitType": null,
+ "applicationInternalName": "PHY_MATERIAL_PARAM_UNIT_WEIGHT"
+ },
+ "PHY_MATERIAL_PARAM_LIGHT_WEIGHT": {
+ "id": "b94f75bc88fb5b1c30d82c9c20de648b",
+ "name": "Lightweight",
+ "units": null,
+ "value": null,
+ "isShared": false,
+ "isReadOnly": false,
+ "speckle_type": "Objects.BuiltElements.Revit.Parameter",
+ "applicationId": null,
+ "applicationUnit": null,
+ "isTypeParameter": false,
+ "totalChildrenCount": 0,
+ "applicationUnitType": null,
+ "applicationInternalName": "PHY_MATERIAL_PARAM_LIGHT_WEIGHT"
+ },
+ "PHY_MATERIAL_PARAM_POISSON_MOD1": {
+ "id": "0c963ab07b678e7a50996ef93eb62523",
+ "name": "Poisson ratio X",
+ "units": null,
+ "value": null,
+ "isShared": false,
+ "isReadOnly": false,
+ "speckle_type": "Objects.BuiltElements.Revit.Parameter",
+ "applicationId": null,
+ "applicationUnit": "autodesk.unit.unit:general-1.0.1",
+ "isTypeParameter": false,
+ "totalChildrenCount": 0,
+ "applicationUnitType": null,
+ "applicationInternalName": "PHY_MATERIAL_PARAM_POISSON_MOD1"
+ },
+ "PHY_MATERIAL_PARAM_POISSON_MOD2": {
+ "id": "86eff39b70fafdf2cc4543e954557118",
+ "name": "Poisson ratio Y",
+ "units": null,
+ "value": null,
+ "isShared": false,
+ "isReadOnly": true,
+ "speckle_type": "Objects.BuiltElements.Revit.Parameter",
+ "applicationId": null,
+ "applicationUnit": "autodesk.unit.unit:general-1.0.1",
+ "isTypeParameter": false,
+ "totalChildrenCount": 0,
+ "applicationUnitType": null,
+ "applicationInternalName": "PHY_MATERIAL_PARAM_POISSON_MOD2"
+ },
+ "PHY_MATERIAL_PARAM_POISSON_MOD3": {
+ "id": "4aa2bc74b0de7c770e2a52eba3334039",
+ "name": "Poisson ratio Z",
+ "units": null,
+ "value": null,
+ "isShared": false,
+ "isReadOnly": true,
+ "speckle_type": "Objects.BuiltElements.Revit.Parameter",
+ "applicationId": null,
+ "applicationUnit": "autodesk.unit.unit:general-1.0.1",
+ "isTypeParameter": false,
+ "totalChildrenCount": 0,
+ "applicationUnitType": null,
+ "applicationInternalName": "PHY_MATERIAL_PARAM_POISSON_MOD3"
+ },
+ "PHY_MATERIAL_PARAM_CONCRETE_COMPRESSION": {
+ "id": "9843373c83b401049b8377f35e518a70",
+ "name": "Concrete compression",
+ "units": "MPa",
+ "value": null,
+ "isShared": false,
+ "isReadOnly": false,
+ "speckle_type": "Objects.BuiltElements.Revit.Parameter",
+ "applicationId": null,
+ "applicationUnit": "autodesk.unit.unit:megapascals-1.0.1",
+ "isTypeParameter": false,
+ "totalChildrenCount": 0,
+ "applicationUnitType": null,
+ "applicationInternalName": "PHY_MATERIAL_PARAM_CONCRETE_COMPRESSION"
+ },
+ "PHY_MATERIAL_PARAM_SHEAR_STRENGTH_REDUCTION": {
+ "id": "487360a05edba93fcddd9e901bd8032b",
+ "name": "Shear strength modification",
+ "units": null,
+ "value": null,
+ "isShared": false,
+ "isReadOnly": true,
+ "speckle_type": "Objects.BuiltElements.Revit.Parameter",
+ "applicationId": null,
+ "applicationUnit": "autodesk.unit.unit:general-1.0.1",
+ "isTypeParameter": false,
+ "totalChildrenCount": 0,
+ "applicationUnitType": null,
+ "applicationInternalName": "PHY_MATERIAL_PARAM_SHEAR_STRENGTH_REDUCTION"
+ }
+ },
+ "smoothness": 50,
+ "speckle_type": "Objects.Other.Material:Objects.Other.Revit.RevitMaterial",
+ "transparency": 0,
+ "applicationId": "cfcf7b7f-d69b-4df0-8752-e5e85cace12b-0035f80a",
+ "materialClass": "コンクリート",
+ "builtInCategory": "OST_Materials",
+ "materialCategory": "コンクリート",
+ "isRevitLinkedModel": false,
+ "materialQuantities": [],
+ "totalChildrenCount": 0,
+ "revitLinkedModelPath": "C:\\Program Files\\Autodesk\\Revit 2024\\Samples\\サンプル構造.rvt"
+ },
+ {
+ "id": "d1b4feed8d71926a25a42d86f9a81209",
+ "area": 0,
+ "bbox": null,
+ "faces": [
+ {
+ "referencedId": "30ba0a6aba886a2e800b12bb37656ab3",
+ "speckle_type": "reference"
+ }
+ ],
+ "units": "mm",
+ "colors": [],
+ "volume": 0,
+ "vertices": [
+ {
+ "referencedId": "210e0ea727c735970c576cd0beab0493",
+ "speckle_type": "reference"
+ }
+ ],
+ "__closure": {
+ "210e0ea727c735970c576cd0beab0493": 1,
+ "30ba0a6aba886a2e800b12bb37656ab3": 1
+ },
+ "speckle_type": "Objects.Geometry.Mesh",
+ "applicationId": null,
+ "renderMaterial": {
+ "id": "91b55219af0a40a47f0213b231f149e2",
+ "name": "Fc24",
+ "diffuse": -2960686,
+ "opacity": 1,
+ "emissive": -16777216,
+ "metalness": 0,
+ "roughness": 1,
+ "speckle_type": "Objects.Other.RenderMaterial",
+ "applicationId": null,
+ "totalChildrenCount": 0
+ },
+ "textureCoordinates": [],
+ "totalChildrenCount": 0
+ }
+]
\ No newline at end of file
diff --git a/test_data/v3_object.json b/test_data/v3_object.json
new file mode 100644
index 0000000..55b259f
--- /dev/null
+++ b/test_data/v3_object.json
@@ -0,0 +1,696 @@
+[
+ {
+ "id": "46f06fef727d64a0bbcbd7ced51e0cd2",
+ "name": "Walls - W30(Fc24)",
+ "type": "W30(Fc24)",
+ "level": {
+ "name": "1FL",
+ "units": "mm",
+ "elevation": 0
+ },
+ "units": "mm",
+ "family": "Basic Wall",
+ "flipped": false,
+ "category": "Walls",
+ "elements": [],
+ "location": {
+ "id": "9c76b8de34382c9052965ee463f8374b",
+ "end": {
+ "x": 22400.000000000015,
+ "y": 20500,
+ "z": 0,
+ "id": "3455575bfd8939f264d295b61e74156f",
+ "units": "mm",
+ "speckle_type": "Objects.Geometry.Point",
+ "applicationId": null
+ },
+ "bbox": null,
+ "start": {
+ "x": 22400.000000000007,
+ "y": 15199.999999999998,
+ "z": 0,
+ "id": "d0c4fdb2e11cc825e7f05f9dc88a0be1",
+ "units": "mm",
+ "speckle_type": "Objects.Geometry.Point",
+ "applicationId": null
+ },
+ "units": "mm",
+ "domain": {
+ "id": "3b97feaad2dbcc2d894c9cec024a9bf2",
+ "end": 17.388451443569522,
+ "start": -3.552713668866051e-14,
+ "speckle_type": "Objects.Primitive.Interval",
+ "applicationId": null
+ },
+ "length": 5300.000000000002,
+ "speckle_type": "Objects.Geometry.Line",
+ "applicationId": null
+ },
+ "topLevel": {
+ "name": "1FL",
+ "units": "mm",
+ "elevation": 0
+ },
+ "__closure": {
+ "0ad4db1fe261a5b640ad9f315a46a6fc": 100,
+ "0d5518a7a3e63fe345e198ad5d6acc4e": 100,
+ "ec2040af4bd9c8619f9029a43df61a2e": 100
+ },
+ "elementId": "4479852",
+ "worksetId": "0",
+ "properties": {
+ "Parameters": {
+ "Type Parameters": {
+ "Text": {
+ "符号": {
+ "name": "符号",
+ "value": "W30",
+ "internalDefinitionName": "ee1f33e1-5506-4a64-b87b-7b98d30aea52"
+ }
+ },
+ "Other": {
+ "Family Name": {
+ "name": "Family Name",
+ "value": "Basic Wall",
+ "internalDefinitionName": "SYMBOL_FAMILY_NAME_PARAM"
+ },
+ "横筋ピッチ": {
+ "name": "横筋ピッチ",
+ "units": "General",
+ "value": 0,
+ "internalDefinitionName": "cd19c040-0788-4424-8a67-7127427e311f"
+ },
+ "縦筋ピッチ": {
+ "name": "縦筋ピッチ",
+ "units": "General",
+ "value": 0,
+ "internalDefinitionName": "6796d143-ef09-4441-9ecc-3411fe837a65"
+ }
+ },
+ "Rebar Set": {
+ "横筋 主筋径1": {
+ "name": "横筋 主筋径1",
+ "value": "D13",
+ "internalDefinitionName": "横筋 主筋径1"
+ },
+ "横筋 主筋径2": {
+ "name": "横筋 主筋径2",
+ "value": "D16",
+ "internalDefinitionName": "横筋 主筋径2"
+ },
+ "縦筋 主筋径1": {
+ "name": "縦筋 主筋径1",
+ "value": "D13",
+ "internalDefinitionName": "縦筋 主筋径1"
+ },
+ "縦筋 主筋径2": {
+ "name": "縦筋 主筋径2",
+ "value": "D16",
+ "internalDefinitionName": "縦筋 主筋径2"
+ },
+ "横筋 主筋ピッチ": {
+ "name": "横筋 主筋ピッチ",
+ "value": "200",
+ "internalDefinitionName": "横筋 主筋ピッチ"
+ },
+ "縦筋 主筋ピッチ": {
+ "name": "縦筋 主筋ピッチ",
+ "value": "200",
+ "internalDefinitionName": "縦筋 主筋ピッチ"
+ },
+ "開口補強筋 斜筋 本数": {
+ "name": "開口補強筋 斜筋 本数",
+ "value": "―",
+ "internalDefinitionName": "開口補強筋 斜筋 本数"
+ },
+ "開口補強筋 横筋 本数": {
+ "name": "開口補強筋 横筋 本数",
+ "value": "―",
+ "internalDefinitionName": "開口補強筋 横筋 本数"
+ },
+ "開口補強筋 縦筋 本数": {
+ "name": "開口補強筋 縦筋 本数",
+ "value": "―",
+ "internalDefinitionName": "開口補強筋 縦筋 本数"
+ }
+ },
+ "Structure": {
+ "Fc24 (0)": {
+ "units": "mm",
+ "function": "Structure",
+ "material": "Fc24",
+ "thickness": 300
+ }
+ },
+ "Construction": {
+ "Width": {
+ "name": "Width",
+ "units": "Millimeters",
+ "value": 300,
+ "internalDefinitionName": "WALL_ATTR_WIDTH_PARAM"
+ },
+ "Function": {
+ "name": "Function",
+ "value": "Interior",
+ "internalDefinitionName": "FUNCTION_PARAM"
+ },
+ "Wrapping at Ends": {
+ "name": "Wrapping at Ends",
+ "value": "None",
+ "internalDefinitionName": "WRAPPING_AT_ENDS_PARAM"
+ },
+ "Wrapping at Inserts": {
+ "name": "Wrapping at Inserts",
+ "value": "Do not wrap",
+ "internalDefinitionName": "WRAPPING_AT_INSERTS_PARAM"
+ }
+ },
+ "Identity Data": {
+ "Cost": {
+ "name": "Cost",
+ "units": "Currency",
+ "value": 0,
+ "internalDefinitionName": "ALL_MODEL_COST"
+ },
+ "Type Name": {
+ "name": "Type Name",
+ "value": "W30(Fc24)",
+ "internalDefinitionName": "SYMBOL_NAME_PARAM"
+ }
+ },
+ "IFC Parameters": {
+ "Type IfcGUID": {
+ "name": "Type IfcGUID",
+ "value": "0oqavz9$zDZxycDyfZdYh0",
+ "internalDefinitionName": "IFC_TYPE_GUID"
+ },
+ "Export Type to IFC": {
+ "name": "Export Type to IFC",
+ "value": "Default",
+ "internalDefinitionName": "IFC_EXPORT_ELEMENT_TYPE"
+ }
+ },
+ "Analytical Properties": {
+ "Roughness": {
+ "name": "Roughness",
+ "value": 1,
+ "internalDefinitionName": "ANALYTICAL_ROUGHNESS"
+ },
+ "Absorptance": {
+ "name": "Absorptance",
+ "units": "General",
+ "value": 0.1,
+ "internalDefinitionName": "ANALYTICAL_ABSORPTANCE"
+ },
+ "Thermal Mass": {
+ "name": "Thermal Mass",
+ "units": "Kilojoules per square meter Kelvin",
+ "value": 0,
+ "internalDefinitionName": "ANALYTICAL_THERMAL_MASS"
+ },
+ "Thermal Resistance (R)": {
+ "name": "Thermal Resistance (R)",
+ "units": "Square meter kelvins per watt",
+ "value": 0,
+ "internalDefinitionName": "ANALYTICAL_THERMAL_RESISTANCE"
+ },
+ "Heat Transfer Coefficient (U)": {
+ "name": "Heat Transfer Coefficient (U)",
+ "units": "Watts per square meter kelvin",
+ "value": 0,
+ "internalDefinitionName": "ANALYTICAL_HEAT_TRANSFER_COEFFICIENT"
+ }
+ },
+ "Materials and Finishes": {
+ "Structural Material": {
+ "name": "Structural Material",
+ "value": "Fc24",
+ "internalDefinitionName": "STRUCTURAL_MATERIAL_PARAM"
+ }
+ }
+ },
+ "Instance Parameters": {
+ "Other": {
+ "Type": {
+ "name": "Type",
+ "value": "W30(Fc24)",
+ "internalDefinitionName": "ELEM_TYPE_PARAM"
+ },
+ "Family": {
+ "name": "Family",
+ "value": "Basic Wall",
+ "internalDefinitionName": "ELEM_FAMILY_PARAM"
+ },
+ "Type Id": {
+ "name": "Type Id",
+ "value": "Basic Wall W30(Fc24)",
+ "internalDefinitionName": "SYMBOL_ID_PARAM"
+ },
+ "Family and Type": {
+ "name": "Family and Type",
+ "value": "Basic Wall W30(Fc24)",
+ "internalDefinitionName": "ELEM_FAMILY_AND_TYPE_PARAM"
+ }
+ },
+ "Phasing": {
+ "Phase Created": {
+ "name": "Phase Created",
+ "value": "フェーズ1",
+ "internalDefinitionName": "PHASE_CREATED"
+ }
+ },
+ "Dimensions": {
+ "Area": {
+ "name": "Area",
+ "units": "Square meters",
+ "value": 7.630000000000015,
+ "internalDefinitionName": "HOST_AREA_COMPUTED"
+ },
+ "Length": {
+ "name": "Length",
+ "units": "Millimeters",
+ "value": 5300.000000000001,
+ "internalDefinitionName": "CURVE_ELEM_LENGTH"
+ },
+ "Volume": {
+ "name": "Volume",
+ "units": "Cubic meters",
+ "value": 2.2890000000000135,
+ "internalDefinitionName": "HOST_VOLUME_COMPUTED"
+ }
+ },
+ "Structural": {
+ "Structural": {
+ "name": "Structural",
+ "value": "Yes",
+ "internalDefinitionName": "WALL_STRUCTURAL_SIGNIFICANT"
+ },
+ "Structural Usage": {
+ "name": "Structural Usage",
+ "value": "Bearing",
+ "internalDefinitionName": "WALL_STRUCTURAL_USAGE_PARAM"
+ },
+ "Rebar Cover - Other Faces": {
+ "name": "Rebar Cover - Other Faces",
+ "value": "Rebar Cover Settings 内壁(フレーム、柱、および耐力壁)",
+ "internalDefinitionName": "CLEAR_COVER_OTHER"
+ },
+ "Rebar Cover - Exterior Face": {
+ "name": "Rebar Cover - Exterior Face",
+ "value": "Rebar Cover Settings 内壁(フレーム、柱、および耐力壁)",
+ "internalDefinitionName": "CLEAR_COVER_EXTERIOR"
+ },
+ "Rebar Cover - Interior Face": {
+ "name": "Rebar Cover - Interior Face",
+ "value": "Rebar Cover Settings 内壁(フレーム、柱、および耐力壁)",
+ "internalDefinitionName": "CLEAR_COVER_INTERIOR"
+ },
+ "構造スリット 下端": {
+ "name": "構造スリット 下端",
+ "value": "No",
+ "internalDefinitionName": "0560d1bb-007b-45e4-b8c3-87f9c6a3d73c"
+ },
+ "構造スリット 始端": {
+ "name": "構造スリット 始端",
+ "value": "No",
+ "internalDefinitionName": "60795a90-8c91-4e11-90a0-b77b819c2403"
+ },
+ "構造スリット 終端": {
+ "name": "構造スリット 終端",
+ "value": "No",
+ "internalDefinitionName": "e3223f14-6158-4d4f-8697-0de2bcc7f737"
+ }
+ },
+ "Constraints": {
+ "Top Offset": {
+ "name": "Top Offset",
+ "units": "Millimeters",
+ "value": -600,
+ "internalDefinitionName": "WALL_TOP_OFFSET"
+ },
+ "Base Offset": {
+ "name": "Base Offset",
+ "units": "Millimeters",
+ "value": -2000,
+ "internalDefinitionName": "WALL_BASE_OFFSET"
+ },
+ "Location Line": {
+ "name": "Location Line",
+ "value": "Core Centerline",
+ "internalDefinitionName": "WALL_KEY_REF_PARAM"
+ },
+ "Room Bounding": {
+ "name": "Room Bounding",
+ "value": "Yes",
+ "internalDefinitionName": "WALL_ATTR_ROOM_BOUNDING"
+ },
+ "Top Constraint": {
+ "name": "Top Constraint",
+ "value": "1FL",
+ "internalDefinitionName": "WALL_HEIGHT_TYPE"
+ },
+ "Base Constraint": {
+ "name": "Base Constraint",
+ "value": "1FL",
+ "internalDefinitionName": "WALL_BASE_CONSTRAINT"
+ },
+ "Related to Mass": {
+ "name": "Related to Mass",
+ "value": "No",
+ "internalDefinitionName": "RELATED_TO_MASS"
+ },
+ "Top is Attached": {
+ "name": "Top is Attached",
+ "value": "No",
+ "internalDefinitionName": "WALL_TOP_IS_ATTACHED"
+ },
+ "Base is Attached": {
+ "name": "Base is Attached",
+ "value": "No",
+ "internalDefinitionName": "WALL_BOTTOM_IS_ATTACHED"
+ },
+ "Unconnected Height": {
+ "name": "Unconnected Height",
+ "units": "Millimeters",
+ "value": 1400,
+ "internalDefinitionName": "WALL_USER_HEIGHT_PARAM"
+ },
+ "Top Extension Distance": {
+ "name": "Top Extension Distance",
+ "units": "Millimeters",
+ "value": 0,
+ "internalDefinitionName": "WALL_TOP_EXTENSION_DIST_PARAM"
+ },
+ "Base Extension Distance": {
+ "name": "Base Extension Distance",
+ "units": "Millimeters",
+ "value": 0,
+ "internalDefinitionName": "WALL_BOTTOM_EXTENSION_DIST_PARAM"
+ }
+ },
+ "Identity Data": {
+ "Has Association": {
+ "name": "Has Association",
+ "value": "Yes",
+ "internalDefinitionName": "ANALYTICAL_ELEMENT_HAS_ASSOCIATION"
+ },
+ "SPECKLE_Classification": {
+ "name": "SPECKLE_Classification",
+ "value": "Wall",
+ "internalDefinitionName": "SPECKLE_Classification"
+ }
+ },
+ "IFC Parameters": {
+ "IfcGUID": {
+ "name": "IfcGUID",
+ "value": "0oqavz9$zDZxycDyfZdYsW",
+ "internalDefinitionName": "IFC_GUID"
+ },
+ "Export to IFC": {
+ "name": "Export to IFC",
+ "value": "By Type",
+ "internalDefinitionName": "IFC_EXPORT_ELEMENT"
+ }
+ },
+ "Cross-Section Definition": {
+ "Cross-Section": {
+ "name": "Cross-Section",
+ "value": "Vertical",
+ "internalDefinitionName": "WALL_CROSS_SECTION"
+ }
+ }
+ }
+ },
+ "Material Quantities": {
+ "Fc24": {
+ "area": 7630000.000000016,
+ "units": "mm",
+ "volume": 2289000000.0000134,
+ "materialName": "Fc24",
+ "materialClass": "コンクリート",
+ "materialCategory": "コンクリート"
+ }
+ }
+ },
+ "worksetName": "ワークセット1",
+ "displayValue": [
+ {
+ "__closure": null,
+ "referencedId": "ec2040af4bd9c8619f9029a43df61a2e",
+ "speckle_type": "reference"
+ }
+ ],
+ "isStructural": true,
+ "speckle_type": "Objects.Data.DataObject:Objects.Data.RevitObject",
+ "applicationId": "32d24e7d-27ff-4d8f-bf26-37ca63da76cc-00445b6c",
+ "builtInCategory": "OST_Walls",
+ "totalChildrenCount": null
+ },
+ {
+ "id": "0ad4db1fe261a5b640ad9f315a46a6fc",
+ "data": [
+ 3,
+ 5,
+ 0,
+ 1,
+ 3,
+ 5,
+ 1,
+ 4,
+ 3,
+ 4,
+ 2,
+ 3,
+ 3,
+ 2,
+ 4,
+ 1,
+ 3,
+ 11,
+ 12,
+ 9,
+ 3,
+ 9,
+ 10,
+ 11,
+ 3,
+ 12,
+ 13,
+ 9,
+ 3,
+ 13,
+ 6,
+ 8,
+ 3,
+ 7,
+ 8,
+ 6,
+ 3,
+ 13,
+ 8,
+ 9,
+ 3,
+ 15,
+ 16,
+ 18,
+ 3,
+ 14,
+ 15,
+ 19,
+ 3,
+ 17,
+ 18,
+ 16,
+ 3,
+ 19,
+ 20,
+ 14,
+ 3,
+ 18,
+ 19,
+ 15,
+ 3,
+ 21,
+ 22,
+ 23,
+ 3,
+ 23,
+ 24,
+ 21,
+ 3,
+ 26,
+ 27,
+ 29,
+ 3,
+ 25,
+ 26,
+ 30,
+ 3,
+ 28,
+ 29,
+ 27,
+ 3,
+ 30,
+ 31,
+ 25,
+ 3,
+ 29,
+ 30,
+ 26,
+ 3,
+ 32,
+ 33,
+ 34,
+ 3,
+ 34,
+ 35,
+ 32
+ ],
+ "speckle_type": "Speckle.Core.Models.DataChunk",
+ "applicationId": null
+ },
+ {
+ "id": "0d5518a7a3e63fe345e198ad5d6acc4e",
+ "data": [
+ 22550.00031738281,
+ 15049.999969482422,
+ -2000.000015258789,
+ 22550.00031738281,
+ 20274.999645996093,
+ -2000.000015258789,
+ 22550.00031738281,
+ 20499.999865722657,
+ -2000.000015258789,
+ 22550.00031738281,
+ 20499.999865722657,
+ -600.0000045776368,
+ 22550.00031738281,
+ 20274.999645996093,
+ -600.0000045776368,
+ 22550.00031738281,
+ 15049.999969482422,
+ -600.0000045776368,
+ 22250.000024414065,
+ 15049.999969482422,
+ -2000.000015258789,
+ 22250.000024414065,
+ 15049.999969482422,
+ -600.0000045776368,
+ 22250.000024414065,
+ 15350.000262451173,
+ -600.0000045776368,
+ 22250.000024414065,
+ 20274.999645996093,
+ -600.0000045776368,
+ 22250.000024414065,
+ 20499.999865722657,
+ -600.0000045776368,
+ 22250.000024414065,
+ 20499.999865722657,
+ -2000.000015258789,
+ 22250.000024414065,
+ 20274.999645996093,
+ -2000.000015258789,
+ 22250.000024414065,
+ 15350.000262451173,
+ -2000.000015258789,
+ 22550.00031738281,
+ 20499.999865722657,
+ -2000.000015258789,
+ 22550.00031738281,
+ 20274.999645996093,
+ -2000.000015258789,
+ 22550.00031738281,
+ 15049.999969482422,
+ -2000.000015258789,
+ 22250.000024414065,
+ 15049.999969482422,
+ -2000.000015258789,
+ 22250.000024414065,
+ 15350.000262451173,
+ -2000.000015258789,
+ 22250.000024414065,
+ 20274.999645996093,
+ -2000.000015258789,
+ 22250.000024414065,
+ 20499.999865722657,
+ -2000.000015258789,
+ 22550.00031738281,
+ 20499.999865722657,
+ -2000.000015258789,
+ 22250.000024414065,
+ 20499.999865722657,
+ -2000.000015258789,
+ 22250.000024414065,
+ 20499.999865722657,
+ -600.0000045776368,
+ 22550.00031738281,
+ 20499.999865722657,
+ -600.0000045776368,
+ 22550.00031738281,
+ 15049.999969482422,
+ -600.0000045776368,
+ 22550.00031738281,
+ 20274.999645996093,
+ -600.0000045776368,
+ 22550.00031738281,
+ 20499.999865722657,
+ -600.0000045776368,
+ 22250.000024414065,
+ 20499.999865722657,
+ -600.0000045776368,
+ 22250.000024414065,
+ 20274.999645996093,
+ -600.0000045776368,
+ 22250.000024414065,
+ 15350.000262451173,
+ -600.0000045776368,
+ 22250.000024414065,
+ 15049.999969482422,
+ -600.0000045776368,
+ 22550.00031738281,
+ 15049.999969482422,
+ -600.0000045776368,
+ 22250.000024414065,
+ 15049.999969482422,
+ -600.0000045776368,
+ 22250.000024414065,
+ 15049.999969482422,
+ -2000.000015258789,
+ 22550.00031738281,
+ 15049.999969482422,
+ -2000.000015258789
+ ],
+ "speckle_type": "Speckle.Core.Models.DataChunk",
+ "applicationId": null
+ },
+ {
+ "id": "ec2040af4bd9c8619f9029a43df61a2e",
+ "area": 0,
+ "bbox": null,
+ "faces": [
+ {
+ "__closure": null,
+ "referencedId": "0ad4db1fe261a5b640ad9f315a46a6fc",
+ "speckle_type": "reference"
+ }
+ ],
+ "units": "mm",
+ "colors": [],
+ "volume": 0,
+ "vertices": [
+ {
+ "__closure": null,
+ "referencedId": "0d5518a7a3e63fe345e198ad5d6acc4e",
+ "speckle_type": "reference"
+ }
+ ],
+ "__closure": {
+ "0ad4db1fe261a5b640ad9f315a46a6fc": 100,
+ "0d5518a7a3e63fe345e198ad5d6acc4e": 100
+ },
+ "speckle_type": "Objects.Geometry.Mesh",
+ "applicationId": "d2c33253-d0ed-4682-9633-e083daaa87db",
+ "textureCoordinates": []
+ }
+]
\ No newline at end of file
diff --git a/tests/conftest.py b/tests/conftest.py
index 3fbff20..4ba9f26 100644
--- a/tests/conftest.py
+++ b/tests/conftest.py
@@ -1,24 +1,132 @@
-import os
-
-from dotenv import load_dotenv
+import pytest
+from specklepy.objects.base import Base
-def pytest_configure(config):
- load_dotenv(dotenv_path=".env")
+@pytest.fixture
+def v2_wall():
+ """Creates a v2-style Speckle wall object."""
+ wall = Base()
+ wall.id = "cdb18060dc48281909e94f0f1d8d3cc0"
+ wall.type = "W30(Fc24)"
+ wall.units = "mm"
+ wall.family = "Basic Wall"
+ wall.height = 1400
+ wall.flipped = False
+ wall.category = "Walls"
+ wall.elementId = "4479852"
+ wall.worksetId = "0"
+ wall.structural = True
+ wall.baseOffset = -2000
+ wall.topOffset = -600
- token_var = "SPECKLE_TOKEN"
- server_var = "SPECKLE_SERVER_URL"
- token = os.getenv(token_var)
- server = os.getenv(server_var)
+ # Create base line geometry
+ wall.baseLine = Base()
+ wall.baseLine.start = Base()
+ wall.baseLine.start.x = 22400.000000000007
+ wall.baseLine.start.y = 15199.999999999998
+ wall.baseLine.start.z = -2000.0000000000002
+ wall.baseLine.end = Base()
+ wall.baseLine.end.x = 22400.000000000015
+ wall.baseLine.end.y = 20500
+ wall.baseLine.end.z = -2000.0000000000002
+ wall.baseLine.units = "mm"
+ wall.baseLine.length = 5300.000000000002
- if not token:
- raise ValueError(f"Cannot run tests without a {token_var} environment variable")
+ # Create parameters structure
+ wall.parameters = Base()
- if not server:
- raise ValueError(
- f"Cannot run tests without a {server_var} environment variable"
- )
+ # Standard parameter
+ wall.parameters["WALL_ATTR_WIDTH_PARAM"] = Base()
+ wall.parameters["WALL_ATTR_WIDTH_PARAM"].name = "Width"
+ wall.parameters["WALL_ATTR_WIDTH_PARAM"].value = 300
+ wall.parameters["WALL_ATTR_WIDTH_PARAM"].units = "mm"
- # Set the token as an attribute on the config object
- config.SPECKLE_TOKEN = token
- config.SPECKLE_SERVER_URL = server
+ # Parameter with GUID key
+ wall.parameters["ee1f33e1-5506-4a64-b87b-7b98d30aea52"] = Base()
+ wall.parameters["ee1f33e1-5506-4a64-b87b-7b98d30aea52"].name = "符号"
+ wall.parameters["ee1f33e1-5506-4a64-b87b-7b98d30aea52"].value = "W30"
+ wall.parameters["ee1f33e1-5506-4a64-b87b-7b98d30aea52"].isShared = True
+ wall.parameters[
+ "ee1f33e1-5506-4a64-b87b-7b98d30aea52"
+ ].internalDefinitionName = "ee1f33e1-5506-4a64-b87b-7b98d30aea52"
+
+ wall.parameters["STRUCTURAL_MATERIAL_PARAM"] = Base()
+ wall.parameters["STRUCTURAL_MATERIAL_PARAM"].name = "Structural Material"
+ wall.parameters["STRUCTURAL_MATERIAL_PARAM"].value = "Fc24"
+
+ # Create basic level reference
+ wall.level = Base()
+ wall.level.name = "1FL"
+ wall.level.elevation = 0
+ wall.level.units = "mm"
+
+ return wall
+
+
+@pytest.fixture
+def v3_wall():
+ """Creates a v3-style Speckle wall object."""
+ wall = Base()
+ wall.id = "46f06fef727d64a0bbcbd7ced51e0cd2"
+ wall.name = "Walls - W30(Fc24)"
+ wall.type = "W30(Fc24)"
+ wall.units = "mm"
+ wall.family = "Basic Wall"
+ wall.flipped = False
+ wall.category = "Walls"
+ wall.elementId = "4479852"
+ wall.worksetId = "0"
+
+ # Create location geometry
+ wall.location = Base()
+ wall.location.start = Base()
+ wall.location.start.x = 22400.000000000007
+ wall.location.start.y = 15199.999999999998
+ wall.location.start.z = 0
+ wall.location.end = Base()
+ wall.location.end.x = 22400.000000000015
+ wall.location.end.y = 20500
+ wall.location.end.z = 0
+ wall.location.units = "mm"
+ wall.location.length = 5300.000000000002
+
+ # Create nested properties structure
+ wall.properties = Base()
+ wall.properties.Parameters = Base()
+
+ # Type Parameters
+ wall.properties.Parameters["Type Parameters"] = Base()
+
+ # Add Text section with GUID parameter
+ wall.properties.Parameters["Type Parameters"].Text = Base()
+ wall.properties.Parameters["Type Parameters"].Text["符号"] = {
+ "name": "符号",
+ "value": "W30",
+ "internalDefinitionName": "ee1f33e1-5506-4a64-b87b-7b98d30aea52",
+ }
+
+ wall.properties.Parameters["Type Parameters"].Structure = Base()
+ wall.properties.Parameters["Type Parameters"].Structure["Fc24 (0)"] = {
+ "units": "mm",
+ "function": "Structure",
+ "material": "Fc24",
+ "thickness": 300,
+ }
+
+ # Instance Parameters
+ wall.properties.Parameters["Instance Parameters"] = Base()
+ wall.properties.Parameters["Instance Parameters"].Structural = Base()
+ wall.properties.Parameters["Instance Parameters"].Structural.Structural = {"name": "Structural", "value": "Yes"}
+
+ # Create basic level references
+ wall.level = Base()
+ wall.level.name = "1FL"
+ wall.level.elevation = 0
+ wall.level.units = "mm"
+
+ wall.topLevel = Base()
+ wall.topLevel.name = "1FL"
+ wall.topLevel.elevation = 0
+ wall.topLevel.units = "mm"
+
+ return wall
diff --git a/tests/localtest.py b/tests/localtest.py
deleted file mode 100644
index e1fbeca..0000000
--- a/tests/localtest.py
+++ /dev/null
@@ -1,32 +0,0 @@
-"""Run integration tests with a speckle server."""
-
-from speckle_automate import (
- AutomationContext,
- AutomationRunData,
- AutomationStatus,
- run_function
-)
-
-from src.inputs import FunctionInputs
-from src.function import automate_function
-
-
-def test_function_run(test_automation_run_data: AutomationRunData, test_automation_token: str):
- """Run an integration test for the automate function."""
- automation_context = AutomationContext.initialize(
- test_automation_run_data, test_automation_token
- )
- default_url: str = (
- "https://docs.google.com/spreadsheets/d/e/2PACX-1vSFmjLfqxPKXJHg-wEs1cp_nJEJJhESGVTLCvWLG_"
- "IgIuRZ4CmMDCSceOYFvuo8IqcmT4sj9qPiLfCx/pub?gid=0&single=true&output=tsv"
- )
-
- automate_sdk = run_function(
- automation_context,
- automate_function,
- FunctionInputs(spreadsheet_url=default_url),
- )
-
- assert automate_sdk.run_status == AutomationStatus.SUCCEEDED
-
-# cli command to run just this test with pytest: pytest tests/local_test_exercise2.py::test_function_run
diff --git a/tests/test_function.py b/tests/test_function.py
index dbc33b1..73ae814 100644
--- a/tests/test_function.py
+++ b/tests/test_function.py
@@ -1,31 +1,41 @@
"""Run integration tests with a speckle server."""
-from pydantic import SecretStr
-
from speckle_automate import (
AutomationContext,
AutomationRunData,
AutomationStatus,
- run_function
+ run_function,
)
+from speckle_automate.fixtures import * # noqa: F401, F403
-from main import FunctionInputs, automate_function
-
-from speckle_automate.fixtures import *
+from src.function import automate_function
+from src.helpers import speckle_print
+from src.inputs import FunctionInputs
def test_function_run(test_automation_run_data: AutomationRunData, test_automation_token: str):
+ """Run an integration test for the automate function.
+
+ Args:
+ test_automation_run_data (AutomationRunData): The automation run data provided by sdk.
+ test_automation_token (str): The automation token.
+
+ """
+ speckle_print(str(test_automation_run_data))
+ speckle_print(str(test_automation_token))
+
"""Run an integration test for the automate function."""
automation_context = AutomationContext.initialize(
test_automation_run_data, test_automation_token
)
+ default_url: str = (
+ "https://drive.google.com/uc?export=download&id=1hiPSw23eOaqd27QD_YsXvZg9PWm7_XBx"
+ )
+
automate_sdk = run_function(
automation_context,
automate_function,
- FunctionInputs(
- forbidden_speckle_type="None",
- whisper_message=SecretStr("testing automatically"),
- ),
+ FunctionInputs(spreadsheet_url=default_url),
)
assert automate_sdk.run_status == AutomationStatus.SUCCEEDED
diff --git a/tests/test_parameters.py b/tests/test_parameters.py
new file mode 100644
index 0000000..15f4f88
--- /dev/null
+++ b/tests/test_parameters.py
@@ -0,0 +1,404 @@
+import os
+from typing import Any
+
+import pytest
+from dotenv import load_dotenv
+from speckle_automate import AutomationContext, AutomationRunData # noqa: F401, F403
+
+# from speckle_automate.fixtures import * # noqa: F401, F403
+from specklepy.api.client import SpeckleClient
+from specklepy.core.api import operations
+from specklepy.objects.base import Base
+from specklepy.transports.server import ServerTransport
+
+from helpers import speckle_print
+from src.rules import PropertyRules
+
+
+def load_test_objects(v2_wall: Any, v3_wall: Any) -> tuple[Base, Base]:
+ """Load test objects from a Speckle server."""
+ client = SpeckleClient(host="https://app.speckle.systems", use_ssl=True)
+
+ load_dotenv(dotenv_path="../.env")
+
+ client.authenticate_with_token(os.getenv("SPECKLE_TOKEN"))
+
+ transport = ServerTransport(client=client, stream_id=os.getenv("SPECKLE_PROJECT_ID"))
+
+ speckle_print(v2_wall)
+ v2_obj = operations.receive("cdb18060dc48281909e94f0f1d8d3cc0", transport)
+ v3_obj = operations.receive("46f06fef727d64a0bbcbd7ced51e0cd2", transport)
+
+ # return v2_wall, v3_wall
+ return v2_obj, v3_obj
+
+
+@pytest.fixture
+def test_objects(v2_wall: Any, v3_wall: Any) -> tuple[Base, Base]:
+ """Pytest fixture to provide test objects."""
+ return load_test_objects(v2_wall, v3_wall)
+
+
+def test_deserialization_structure(test_objects):
+ """Test that objects are properly deserialized with correct structure."""
+ v2_obj, v3_obj = test_objects
+
+ # Check base class type
+ for obj in [v2_obj, v3_obj]:
+ assert isinstance(obj, Base), f"Expected {obj} to be an instance of Base"
+
+ # Check v2 structure
+ assert hasattr(v2_obj, "parameters"), "v2_obj should have 'parameters' attribute"
+ assert v2_obj["parameters"] is not None, "v2_obj['parameters'] should not be None"
+
+ # Check v3 structure
+ assert hasattr(v3_obj, "properties"), "v3_obj should have 'properties' attribute"
+ assert v3_obj["properties"] is not None, "v3_obj['properties'] should not be None"
+ assert "Parameters" in v3_obj["properties"], "'Parameters' key should exist in v3_obj['properties']"
+
+
+@pytest.mark.parametrize(
+ "param_name, expected_result",
+ [
+ ("category", True), # Test parameters that should exist
+ ("WALL_ATTR_WIDTH_PARAM", True), # Test nested parameters
+ ("WALL_ATTR_WIDTH_PARAM.value", True),
+ ("WALL_ATTR_WIDTH_PARAM.id", True),
+ ("WALL_ATTR_WIDTH_PARAM.units", True),
+ ("non_existent_param", False), # Test non-existent parameters
+ ],
+)
+def test_v2_parameter_exists(test_objects, param_name, expected_result):
+ """Test parameter existence checking in v2 objects."""
+ v2_obj, _ = test_objects
+ assert PropertyRules.has_parameter(v2_obj, param_name) == expected_result
+
+
+@pytest.mark.parametrize(
+ "param_name",
+ [
+ "WALL_ATTR_WIDTH_PARAM.id",
+ "WALL_ATTR_WIDTH_PARAM.value",
+ "WALL_ATTR_WIDTH_PARAM",
+ "WALL_ATTR_WIDTH_PARAM.units",
+ ],
+)
+def test_v2_parameter_value_retrieval(test_objects, param_name):
+ """Test parameter value retrieval in v2 objects."""
+ v2_obj, _ = test_objects
+ assert PropertyRules.get_parameter_value(v2_obj, param_name)
+
+
+@pytest.mark.parametrize(
+ "param_name, expected_result",
+ [
+ ("category", True), # Test parameters that should exist
+ ("Width", True), # Test nested parameters
+ ("non_existent_param", False), # Test non-existent parameters
+ ],
+)
+def test_v3_parameter_exists(test_objects, param_name, expected_result):
+ """Test parameter existence checking in v3 objects."""
+ _, v3_obj = test_objects
+ assert PropertyRules.has_parameter(v3_obj, param_name) == expected_result
+
+
+@pytest.mark.parametrize(
+ "param_name_1, param_name_2",
+ [
+ (
+ "properties.Parameters.Instance Parameters.Dimensions.Length.value",
+ "Instance Parameters.Dimensions.Length",
+ ),
+ ],
+)
+def test_v3_parameter_search_equivalence(test_objects, param_name_1, param_name_2):
+ """Test parameter existence checking equivalence in v3 objects."""
+ _, v3_obj = test_objects
+ assert PropertyRules.get_parameter_value(v3_obj, param_name_1) == PropertyRules.get_parameter_value(
+ v3_obj, param_name_2
+ )
+
+
+@pytest.mark.parametrize(
+ "obj_version, param_name, expected_value, default_value",
+ [
+ # Test direct parameters
+ ("v2", "category", "Walls", None),
+ ("v3", "category", "Walls", None),
+ # Test nested parameters - using both internal and friendly names
+ ("v2", "WALL_ATTR_WIDTH_PARAM", 300, None),
+ ("v3", "Construction.Width", 300, None),
+ # Test parameters with units
+ ("v2", "CURVE_ELEM_LENGTH", 5300.000000000001, None),
+ ("v3", "Instance Parameters.Dimensions.Length", 5300.000000000001, None),
+ # Test non-existent parameters with a default value
+ ("v2", "parameters.non_existent", "default", "default"),
+ ("v3", "properties.Parameters.non_existent", "default", "default"),
+ ],
+)
+def test_parameter_value_retrieval(test_objects, obj_version, param_name, expected_value, default_value):
+ """Test parameter value retrieval from both v2 and v3 objects."""
+ v2_obj, v3_obj = test_objects
+ obj = v2_obj if obj_version == "v2" else v3_obj
+ result = PropertyRules.get_parameter_value(obj, param_name, default_value=default_value)
+ assert result == expected_value
+
+
+@pytest.mark.parametrize(
+ "param_name, expected_value, expected_result",
+ [
+ ("category", "Walls", True), # Test exact match
+ ("WALL_ATTR_WIDTH_PARAM", 300, True), # Test numeric match
+ ("category", "Windows", False), # Test non-match
+ ],
+)
+def test_v2_parameter_value_matching(test_objects, param_name, expected_value, expected_result):
+ """Test parameter value matching in v2 objects."""
+ v2_obj, _ = test_objects
+ assert PropertyRules.is_parameter_value(v2_obj, param_name, expected_value) == expected_result
+
+
+@pytest.mark.parametrize(
+ "param_name, expected_value, expected_result",
+ [
+ ("category", "Walls", True), # Test exact match
+ ("Width", 300, True), # Test numeric match
+ ("category", "Windows", False), # Test non-match
+ ],
+)
+def test_v3_parameter_value_matching(test_objects, param_name, expected_value, expected_result):
+ """Test parameter value matching in v3 objects."""
+ _, v3_obj = test_objects
+ assert PropertyRules.is_parameter_value(v3_obj, param_name, expected_value) == expected_result
+
+
+@pytest.mark.parametrize(
+ "comparison_func, param_name, value, expected_result",
+ [
+ (PropertyRules.is_parameter_value_greater_than, "WALL_ATTR_WIDTH_PARAM", "200", True), # Test greater than
+ (PropertyRules.is_parameter_value_less_than, "WALL_ATTR_WIDTH_PARAM", "400", True), # Test less than
+ (PropertyRules.is_parameter_value_in_range, "WALL_ATTR_WIDTH_PARAM", "200,400", True), # Test in range
+ ],
+)
+def test_v2_parameter_numeric_comparisons(test_objects, comparison_func, param_name, value, expected_result):
+ """Test numeric parameter comparisons in v2 objects."""
+ v2_obj, _ = test_objects
+ assert comparison_func(v2_obj, param_name, value) == expected_result
+
+
+@pytest.mark.parametrize(
+ "comparison_func, param_name, value, expected_result",
+ [
+ (PropertyRules.is_parameter_value_greater_than, "Width", "200", True), # Test greater than
+ (PropertyRules.is_parameter_value_less_than, "Width", "400", True), # Test less than
+ (PropertyRules.is_parameter_value_in_range, "Width", "200,400", True), # Test in range
+ ],
+)
+def test_v3_parameter_numeric_comparisons(test_objects, comparison_func, param_name, value, expected_result):
+ """Test numeric parameter comparisons in v3 objects."""
+ _, v3_obj = test_objects
+ assert comparison_func(v3_obj, param_name, value) == expected_result
+
+
+@pytest.mark.parametrize(
+ "param_name, pattern, fuzzy, expected_result",
+ [
+ ("category", "^Walls$", False, True), # Test exact pattern matches
+ ("category", "Walls", True, True), # Test fuzzy matches
+ ("category", "Wall", False, True), # Test partial pattern matches
+ ("category", "^Windows$", False, False), # Test non-matches
+ ],
+)
+def test_v2_parameter_value_like(test_objects, param_name, pattern, fuzzy, expected_result):
+ """Test pattern matching on parameter values in v2 objects."""
+ v2_obj, _ = test_objects
+ assert PropertyRules.is_parameter_value_like(v2_obj, param_name, pattern, fuzzy=fuzzy) == expected_result
+
+
+@pytest.mark.parametrize(
+ "param_name, pattern, fuzzy, expected_result",
+ [
+ ("category", "^Walls$", False, True), # Test exact pattern matches
+ ("category", "Walls", True, True), # Test fuzzy matches
+ ("category", "Wall", False, True), # Test partial pattern matches
+ ("category", "^Windows$", False, False), # Test non-matches
+ ],
+)
+def test_v3_parameter_value_like(test_objects, param_name, pattern, fuzzy, expected_result):
+ """Test pattern matching on parameter values in v3 objects."""
+ _, v3_obj = test_objects
+ assert PropertyRules.is_parameter_value_like(v3_obj, param_name, pattern, fuzzy=fuzzy) == expected_result
+
+
+@pytest.mark.parametrize(
+ "param_name, valid_list, expected_result",
+ [
+ ("category", ["Walls", "Windows", "Doors"], True), # Test value in list
+ ("category", "Walls,Windows,Doors", True), # Test comma-separated string list
+ ("category", ["Windows", "Doors"], False), # Test value not in list
+ ],
+)
+def test_v2_parameter_lists(test_objects, param_name, valid_list, expected_result):
+ """Test list-based parameter checks in v2 objects."""
+ v2_obj, _ = test_objects
+ assert PropertyRules.is_parameter_value_in_list(v2_obj, param_name, valid_list) == expected_result
+
+
+@pytest.mark.parametrize(
+ "param_name, valid_list, expected_result",
+ [
+ ("category", ["Walls", "Windows", "Doors"], True), # Test value in list
+ ("category", "Walls,Windows,Doors", True), # Test comma-separated string list
+ ("category", ["Windows", "Doors"], False), # Test value not in list
+ ],
+)
+def test_v3_parameter_lists(test_objects, param_name, valid_list, expected_result):
+ """Test list-based parameter checks in v3 objects."""
+ _, v3_obj = test_objects
+ assert PropertyRules.is_parameter_value_in_list(v3_obj, param_name, valid_list) == expected_result
+
+
+@pytest.mark.parametrize(
+ "param_name, expected_result",
+ [
+ ("WALL_ATTR_ROOM_BOUNDING.value", True), # Test true values
+ ("wall_top_is_attached", False), # Test false values
+ ],
+)
+def test_v2_boolean_parameters(test_objects, param_name, expected_result):
+ """Test boolean parameter checks in v2 objects."""
+ v2_obj, _ = test_objects
+ if expected_result:
+ assert PropertyRules.is_parameter_value_true(v2_obj, param_name)
+ else:
+ assert PropertyRules.is_parameter_value_false(v2_obj, param_name)
+
+
+@pytest.mark.parametrize(
+ "param_name, expected_result",
+ [
+ ("Room Bounding", True), # Test true values
+ ("top is attached", False), # Test false values
+ ("Top is Attached", False), # Case sensitivity test
+ ],
+)
+def test_v3_boolean_parameters(test_objects, param_name, expected_result):
+ """Test boolean parameter checks in v3 objects."""
+ _, v3_obj = test_objects
+ if expected_result:
+ assert PropertyRules.is_parameter_value_true(v3_obj, param_name)
+ else:
+ assert PropertyRules.is_parameter_value_false(v3_obj, param_name)
+
+
+@pytest.mark.parametrize(
+ "param_name, expected_value, expected_result",
+ [
+ # Test numeric value comparisons
+ ("WALL_ATTR_WIDTH_PARAM", 300, True),
+ ("WALL_ATTR_WIDTH_PARAM.value", 300, True),
+ ("baseLine.length", 5300.000000000002, True),
+ # Test string value comparisons
+ ("STRUCTURAL_MATERIAL_PARAM.value", "Fc24", True),
+ ("ee1f33e1-5506-4a64-b87b-7b98d30aea52.value", "W30", True),
+ # Test non-matches
+ ("WALL_ATTR_WIDTH_PARAM", 301, False),
+ ("nonexistent_param", "any_value", False),
+ ],
+)
+def test_v2_parameter_value_comparisons(v2_wall, param_name, expected_value, expected_result):
+ """Test value comparisons using v2 wall parameters."""
+ assert PropertyRules.is_equal_value(v2_wall, param_name, expected_value) == expected_result
+
+
+@pytest.mark.parametrize(
+ "attribute, value, expected",
+ [
+ # Test numeric value comparisons
+ ("Type Parameters.Structure.Fc24 (0).thickness", 300, True),
+ ("location.length", 5300.000000000002, True),
+ ("location.length", 5300, True),
+ # Test string value comparisons
+ ("Type Parameters.Text.符号.value", "W30", True),
+ ("Instance Parameters.Structural.Structural.value", "Yes", True),
+ # Test non-matches
+ ("Type Parameters.Structure.Fc24 (0).thickness", 301, False),
+ ("nonexistent_param", "any_value", False),
+ ],
+)
+def test_v3_parameter_value_comparisons(v3_wall, attribute, value, expected):
+ """Test value comparisons using v3 wall parameters."""
+ assert PropertyRules.is_equal_value(v3_wall, attribute, value) == expected
+
+
+@pytest.mark.parametrize(
+ "wall, attribute, value, expected",
+ [
+ # V2 wall tests
+ ("v2_wall", "WALL_ATTR_WIDTH_PARAM.value", 300, True),
+ ("v2_wall", "type", "W30(Fc24)", True),
+ ("v2_wall", "WALL_ATTR_WIDTH_PARAM.value", 300.0001, False),
+ # V3 wall tests
+ ("v3_wall", "Type Parameters.Structure.Fc24 (0).thickness", 300, True),
+ ("v3_wall", "type", "W30(Fc24)", True),
+ ("v3_wall", "Type Parameters.Structure.Fc24 (0).thickness", 300.0001, False),
+ ("v3_wall", "location.length", 5300.000000000002, True),
+ ("v3_wall", "location.length", 5300, False),
+ ],
+)
+def test_identical_comparisons(request, wall, attribute, value, expected):
+ """Test identical value comparisons on both wall versions."""
+ wall_instance = request.getfixturevalue(wall)
+ assert PropertyRules.is_identical_value(wall_instance, attribute, value) == expected
+
+
+@pytest.mark.parametrize(
+ "wall, attribute, value",
+ [
+ # V2 wall tests
+ ("v2_wall", "WALL_ATTR_WIDTH_PARAM.value", 301),
+ ("v2_wall", "STRUCTURAL_MATERIAL_PARAM.value", "Fc25"),
+ ("v2_wall", "nonexistent_param", "any_value"),
+ # V3 wall tests
+ ("v3_wall", "Type Parameters.Structure.Fc24 (0).thickness", 301),
+ ("v3_wall", "Type Parameters.Text.符号.value", "W31"),
+ ("v3_wall", "nonexistent_param", "any_value"),
+ ],
+)
+def test_not_equal_comparisons(request, wall, attribute, value):
+ """Test not equal comparisons on both wall versions."""
+ wall_instance = request.getfixturevalue(wall)
+ assert PropertyRules.is_not_equal_value(wall_instance, attribute, value)
+
+
+@pytest.mark.parametrize(
+ "attribute, value, expected_equal, expected_identical",
+ [
+ # Test Yes/No conversion in equals (should convert)
+ ("Instance Parameters.Structural.Structural.value", True, True, False), # Yes vs True
+ ("Instance Parameters.Structural.Structural.value", "Yes", True, True), # Yes vs "Yes"
+ ("Instance Parameters.Structural.Structural.value", "yes", True, False), # Yes vs "yes"
+ ],
+)
+def test_boolean_conversions(v3_wall, attribute, value, expected_equal, expected_identical):
+ """Test conversion of Yes/No strings to boolean values."""
+ assert PropertyRules.is_equal_value(v3_wall, attribute, value) == expected_equal
+ assert PropertyRules.is_identical_value(v3_wall, attribute, value) == expected_identical
+
+
+@pytest.mark.parametrize(
+ "wall, attribute, expected_value",
+ [
+ # V2 wall tests
+ ("v2_wall", "WALL_ATTR_WIDTH_PARAM.value", "300"),
+ ("v2_wall", "baseLine.length", "5300.000000000002"),
+ # V3 wall tests
+ ("v3_wall", "Type Parameters.Structure.Fc24 (0).thickness", "300"),
+ ("v3_wall", "location.length", "5300.000000000002"),
+ ],
+)
+def test_numeric_string_handling(wall, attribute, expected_value, request):
+ """Test handling of numeric strings in both wall versions."""
+ wall_instance = request.getfixturevalue(wall) # Retrieve fixture dynamically
+ assert PropertyRules.is_equal_value(wall_instance, attribute, expected_value)
diff --git a/tests/test_user_entry.py b/tests/test_user_entry.py
new file mode 100644
index 0000000..ca91c3d
--- /dev/null
+++ b/tests/test_user_entry.py
@@ -0,0 +1,33 @@
+import pandas as pd
+import pytest
+
+from src.rule_processor import SeverityLevel, get_severity
+
+
+@pytest.mark.parametrize(
+ "input_severity, expected_enum",
+ [
+ ("INFO", SeverityLevel.INFO),
+ ("info", SeverityLevel.INFO),
+ ("Info", SeverityLevel.INFO),
+ ("WARNING", SeverityLevel.WARNING),
+ ("warning", SeverityLevel.WARNING),
+ ("Warning", SeverityLevel.WARNING),
+ ("ERROR", SeverityLevel.ERROR),
+ ("error", SeverityLevel.ERROR),
+ ("Error", SeverityLevel.ERROR),
+ ("WARN", SeverityLevel.WARNING), # Invalid → Defaults to ERROR
+ ("warn", SeverityLevel.WARNING), # Invalid → Defaults to ERROR
+ ("Critical", SeverityLevel.ERROR), # Invalid → Defaults to ERROR
+ ("Severe", SeverityLevel.ERROR), # Invalid → Defaults to ERROR
+ ("", SeverityLevel.ERROR), # Empty string → Defaults to ERROR
+ (None, SeverityLevel.ERROR), # None → Defaults to ERROR
+ (1.0, SeverityLevel.ERROR), # None → Defaults to ERROR
+ ],
+)
+def test_severity_conversion(input_severity, expected_enum):
+ """Test various user inputs for severity and check expected outputs."""
+ rule_info = pd.Series({"Report Severity": input_severity})
+ severity = get_severity(rule_info)
+
+ assert severity == expected_enum, f"Failed for input: {input_severity}"
diff --git a/uv.lock b/uv.lock
new file mode 100644
index 0000000..4f978b9
--- /dev/null
+++ b/uv.lock
@@ -0,0 +1,977 @@
+version = 1
+requires-python = ">=3.12"
+
+[[package]]
+name = "annotated-types"
+version = "0.7.0"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/ee/67/531ea369ba64dcff5ec9c3402f9f51bf748cec26dde048a2f973a4eea7f5/annotated_types-0.7.0.tar.gz", hash = "sha256:aff07c09a53a08bc8cfccb9c85b05f1aa9a2a6f23728d790723543408344ce89", size = 16081 }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/78/b6/6307fbef88d9b5ee7421e68d78a9f162e0da4900bc5f5793f6d3d0e34fb8/annotated_types-0.7.0-py3-none-any.whl", hash = "sha256:1f02e8b43a8fbbc3f3e0d4f0f4bfc8131bcb4eebe8849b8e5c773f3a1c582a53", size = 13643 },
+]
+
+[[package]]
+name = "anyio"
+version = "4.8.0"
+source = { registry = "https://pypi.org/simple" }
+dependencies = [
+ { name = "idna" },
+ { name = "sniffio" },
+ { name = "typing-extensions", marker = "python_full_version < '3.13'" },
+]
+sdist = { url = "https://files.pythonhosted.org/packages/a3/73/199a98fc2dae33535d6b8e8e6ec01f8c1d76c9adb096c6b7d64823038cde/anyio-4.8.0.tar.gz", hash = "sha256:1d9fe889df5212298c0c0723fa20479d1b94883a2df44bd3897aa91083316f7a", size = 181126 }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/46/eb/e7f063ad1fec6b3178a3cd82d1a3c4de82cccf283fc42746168188e1cdd5/anyio-4.8.0-py3-none-any.whl", hash = "sha256:b5011f270ab5eb0abf13385f851315585cc37ef330dd88e27ec3d34d651fd47a", size = 96041 },
+]
+
+[[package]]
+name = "appdirs"
+version = "1.4.4"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/d7/d8/05696357e0311f5b5c316d7b95f46c669dd9c15aaeecbb48c7d0aeb88c40/appdirs-1.4.4.tar.gz", hash = "sha256:7d5d0167b2b1ba821647616af46a749d1c653740dd0d2415100fe26e27afdf41", size = 13470 }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/3b/00/2344469e2084fb287c2e0b57b72910309874c3245463acd6cf5e3db69324/appdirs-1.4.4-py2.py3-none-any.whl", hash = "sha256:a841dacd6b99318a741b166adb07e19ee71a274450e68237b4650ca1055ab128", size = 9566 },
+]
+
+[[package]]
+name = "attrs"
+version = "23.2.0"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/e3/fc/f800d51204003fa8ae392c4e8278f256206e7a919b708eef054f5f4b650d/attrs-23.2.0.tar.gz", hash = "sha256:935dc3b529c262f6cf76e50877d35a4bd3c1de194fd41f47a2b7ae8f19971f30", size = 780820 }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/e0/44/827b2a91a5816512fcaf3cc4ebc465ccd5d598c45cefa6703fcf4a79018f/attrs-23.2.0-py3-none-any.whl", hash = "sha256:99b87a485a5820b23b879f04c2305b44b951b502fd64be915879d77a7e8fc6f1", size = 60752 },
+]
+
+[[package]]
+name = "backoff"
+version = "2.2.1"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/47/d7/5bbeb12c44d7c4f2fb5b56abce497eb5ed9f34d85701de869acedd602619/backoff-2.2.1.tar.gz", hash = "sha256:03f829f5bb1923180821643f8753b0502c3b682293992485b0eef2807afa5cba", size = 17001 }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/df/73/b6e24bd22e6720ca8ee9a85a0c4a2971af8497d8f3193fa05390cbd46e09/backoff-2.2.1-py3-none-any.whl", hash = "sha256:63579f9a0628e06278f7e47b7d7d5b6ce20dc65c5e96a6f3ca99a6adca0396e8", size = 15148 },
+]
+
+[[package]]
+name = "black"
+version = "25.1.0"
+source = { registry = "https://pypi.org/simple" }
+dependencies = [
+ { name = "click" },
+ { name = "mypy-extensions" },
+ { name = "packaging" },
+ { name = "pathspec" },
+ { name = "platformdirs" },
+]
+sdist = { url = "https://files.pythonhosted.org/packages/94/49/26a7b0f3f35da4b5a65f081943b7bcd22d7002f5f0fb8098ec1ff21cb6ef/black-25.1.0.tar.gz", hash = "sha256:33496d5cd1222ad73391352b4ae8da15253c5de89b93a80b3e2c8d9a19ec2666", size = 649449 }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/83/71/3fe4741df7adf015ad8dfa082dd36c94ca86bb21f25608eb247b4afb15b2/black-25.1.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:4b60580e829091e6f9238c848ea6750efed72140b91b048770b64e74fe04908b", size = 1650988 },
+ { url = "https://files.pythonhosted.org/packages/13/f3/89aac8a83d73937ccd39bbe8fc6ac8860c11cfa0af5b1c96d081facac844/black-25.1.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:1e2978f6df243b155ef5fa7e558a43037c3079093ed5d10fd84c43900f2d8ecc", size = 1453985 },
+ { url = "https://files.pythonhosted.org/packages/6f/22/b99efca33f1f3a1d2552c714b1e1b5ae92efac6c43e790ad539a163d1754/black-25.1.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:3b48735872ec535027d979e8dcb20bf4f70b5ac75a8ea99f127c106a7d7aba9f", size = 1783816 },
+ { url = "https://files.pythonhosted.org/packages/18/7e/a27c3ad3822b6f2e0e00d63d58ff6299a99a5b3aee69fa77cd4b0076b261/black-25.1.0-cp312-cp312-win_amd64.whl", hash = "sha256:ea0213189960bda9cf99be5b8c8ce66bb054af5e9e861249cd23471bd7b0b3ba", size = 1440860 },
+ { url = "https://files.pythonhosted.org/packages/98/87/0edf98916640efa5d0696e1abb0a8357b52e69e82322628f25bf14d263d1/black-25.1.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:8f0b18a02996a836cc9c9c78e5babec10930862827b1b724ddfe98ccf2f2fe4f", size = 1650673 },
+ { url = "https://files.pythonhosted.org/packages/52/e5/f7bf17207cf87fa6e9b676576749c6b6ed0d70f179a3d812c997870291c3/black-25.1.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:afebb7098bfbc70037a053b91ae8437c3857482d3a690fefc03e9ff7aa9a5fd3", size = 1453190 },
+ { url = "https://files.pythonhosted.org/packages/e3/ee/adda3d46d4a9120772fae6de454c8495603c37c4c3b9c60f25b1ab6401fe/black-25.1.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:030b9759066a4ee5e5aca28c3c77f9c64789cdd4de8ac1df642c40b708be6171", size = 1782926 },
+ { url = "https://files.pythonhosted.org/packages/cc/64/94eb5f45dcb997d2082f097a3944cfc7fe87e071907f677e80788a2d7b7a/black-25.1.0-cp313-cp313-win_amd64.whl", hash = "sha256:a22f402b410566e2d1c950708c77ebf5ebd5d0d88a6a2e87c86d9fb48afa0d18", size = 1442613 },
+ { url = "https://files.pythonhosted.org/packages/09/71/54e999902aed72baf26bca0d50781b01838251a462612966e9fc4891eadd/black-25.1.0-py3-none-any.whl", hash = "sha256:95e8176dae143ba9097f351d174fdaf0ccd29efb414b362ae3fd72bf0f710717", size = 207646 },
+]
+
+[[package]]
+name = "certifi"
+version = "2025.1.31"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/1c/ab/c9f1e32b7b1bf505bf26f0ef697775960db7932abeb7b516de930ba2705f/certifi-2025.1.31.tar.gz", hash = "sha256:3d5da6925056f6f18f119200434a4780a94263f10d1c21d032a6f6b2baa20651", size = 167577 }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/38/fc/bce832fd4fd99766c04d1ee0eead6b0ec6486fb100ae5e74c1d91292b982/certifi-2025.1.31-py3-none-any.whl", hash = "sha256:ca78db4565a652026a4db2bcdf68f2fb589ea80d0be70e03929ed730746b84fe", size = 166393 },
+]
+
+[[package]]
+name = "charset-normalizer"
+version = "3.4.1"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/16/b0/572805e227f01586461c80e0fd25d65a2115599cc9dad142fee4b747c357/charset_normalizer-3.4.1.tar.gz", hash = "sha256:44251f18cd68a75b56585dd00dae26183e102cd5e0f9f1466e6df5da2ed64ea3", size = 123188 }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/0a/9a/dd1e1cdceb841925b7798369a09279bd1cf183cef0f9ddf15a3a6502ee45/charset_normalizer-3.4.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:73d94b58ec7fecbc7366247d3b0b10a21681004153238750bb67bd9012414545", size = 196105 },
+ { url = "https://files.pythonhosted.org/packages/d3/8c/90bfabf8c4809ecb648f39794cf2a84ff2e7d2a6cf159fe68d9a26160467/charset_normalizer-3.4.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dad3e487649f498dd991eeb901125411559b22e8d7ab25d3aeb1af367df5efd7", size = 140404 },
+ { url = "https://files.pythonhosted.org/packages/ad/8f/e410d57c721945ea3b4f1a04b74f70ce8fa800d393d72899f0a40526401f/charset_normalizer-3.4.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c30197aa96e8eed02200a83fba2657b4c3acd0f0aa4bdc9f6c1af8e8962e0757", size = 150423 },
+ { url = "https://files.pythonhosted.org/packages/f0/b8/e6825e25deb691ff98cf5c9072ee0605dc2acfca98af70c2d1b1bc75190d/charset_normalizer-3.4.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2369eea1ee4a7610a860d88f268eb39b95cb588acd7235e02fd5a5601773d4fa", size = 143184 },
+ { url = "https://files.pythonhosted.org/packages/3e/a2/513f6cbe752421f16d969e32f3583762bfd583848b763913ddab8d9bfd4f/charset_normalizer-3.4.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bc2722592d8998c870fa4e290c2eec2c1569b87fe58618e67d38b4665dfa680d", size = 145268 },
+ { url = "https://files.pythonhosted.org/packages/74/94/8a5277664f27c3c438546f3eb53b33f5b19568eb7424736bdc440a88a31f/charset_normalizer-3.4.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ffc9202a29ab3920fa812879e95a9e78b2465fd10be7fcbd042899695d75e616", size = 147601 },
+ { url = "https://files.pythonhosted.org/packages/7c/5f/6d352c51ee763623a98e31194823518e09bfa48be2a7e8383cf691bbb3d0/charset_normalizer-3.4.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:804a4d582ba6e5b747c625bf1255e6b1507465494a40a2130978bda7b932c90b", size = 141098 },
+ { url = "https://files.pythonhosted.org/packages/78/d4/f5704cb629ba5ab16d1d3d741396aec6dc3ca2b67757c45b0599bb010478/charset_normalizer-3.4.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:0f55e69f030f7163dffe9fd0752b32f070566451afe180f99dbeeb81f511ad8d", size = 149520 },
+ { url = "https://files.pythonhosted.org/packages/c5/96/64120b1d02b81785f222b976c0fb79a35875457fa9bb40827678e54d1bc8/charset_normalizer-3.4.1-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:c4c3e6da02df6fa1410a7680bd3f63d4f710232d3139089536310d027950696a", size = 152852 },
+ { url = "https://files.pythonhosted.org/packages/84/c9/98e3732278a99f47d487fd3468bc60b882920cef29d1fa6ca460a1fdf4e6/charset_normalizer-3.4.1-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:5df196eb874dae23dcfb968c83d4f8fdccb333330fe1fc278ac5ceeb101003a9", size = 150488 },
+ { url = "https://files.pythonhosted.org/packages/13/0e/9c8d4cb99c98c1007cc11eda969ebfe837bbbd0acdb4736d228ccaabcd22/charset_normalizer-3.4.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:e358e64305fe12299a08e08978f51fc21fac060dcfcddd95453eabe5b93ed0e1", size = 146192 },
+ { url = "https://files.pythonhosted.org/packages/b2/21/2b6b5b860781a0b49427309cb8670785aa543fb2178de875b87b9cc97746/charset_normalizer-3.4.1-cp312-cp312-win32.whl", hash = "sha256:9b23ca7ef998bc739bf6ffc077c2116917eabcc901f88da1b9856b210ef63f35", size = 95550 },
+ { url = "https://files.pythonhosted.org/packages/21/5b/1b390b03b1d16c7e382b561c5329f83cc06623916aab983e8ab9239c7d5c/charset_normalizer-3.4.1-cp312-cp312-win_amd64.whl", hash = "sha256:6ff8a4a60c227ad87030d76e99cd1698345d4491638dfa6673027c48b3cd395f", size = 102785 },
+ { url = "https://files.pythonhosted.org/packages/38/94/ce8e6f63d18049672c76d07d119304e1e2d7c6098f0841b51c666e9f44a0/charset_normalizer-3.4.1-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:aabfa34badd18f1da5ec1bc2715cadc8dca465868a4e73a0173466b688f29dda", size = 195698 },
+ { url = "https://files.pythonhosted.org/packages/24/2e/dfdd9770664aae179a96561cc6952ff08f9a8cd09a908f259a9dfa063568/charset_normalizer-3.4.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:22e14b5d70560b8dd51ec22863f370d1e595ac3d024cb8ad7d308b4cd95f8313", size = 140162 },
+ { url = "https://files.pythonhosted.org/packages/24/4e/f646b9093cff8fc86f2d60af2de4dc17c759de9d554f130b140ea4738ca6/charset_normalizer-3.4.1-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8436c508b408b82d87dc5f62496973a1805cd46727c34440b0d29d8a2f50a6c9", size = 150263 },
+ { url = "https://files.pythonhosted.org/packages/5e/67/2937f8d548c3ef6e2f9aab0f6e21001056f692d43282b165e7c56023e6dd/charset_normalizer-3.4.1-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2d074908e1aecee37a7635990b2c6d504cd4766c7bc9fc86d63f9c09af3fa11b", size = 142966 },
+ { url = "https://files.pythonhosted.org/packages/52/ed/b7f4f07de100bdb95c1756d3a4d17b90c1a3c53715c1a476f8738058e0fa/charset_normalizer-3.4.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:955f8851919303c92343d2f66165294848d57e9bba6cf6e3625485a70a038d11", size = 144992 },
+ { url = "https://files.pythonhosted.org/packages/96/2c/d49710a6dbcd3776265f4c923bb73ebe83933dfbaa841c5da850fe0fd20b/charset_normalizer-3.4.1-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:44ecbf16649486d4aebafeaa7ec4c9fed8b88101f4dd612dcaf65d5e815f837f", size = 147162 },
+ { url = "https://files.pythonhosted.org/packages/b4/41/35ff1f9a6bd380303dea55e44c4933b4cc3c4850988927d4082ada230273/charset_normalizer-3.4.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:0924e81d3d5e70f8126529951dac65c1010cdf117bb75eb02dd12339b57749dd", size = 140972 },
+ { url = "https://files.pythonhosted.org/packages/fb/43/c6a0b685fe6910d08ba971f62cd9c3e862a85770395ba5d9cad4fede33ab/charset_normalizer-3.4.1-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:2967f74ad52c3b98de4c3b32e1a44e32975e008a9cd2a8cc8966d6a5218c5cb2", size = 149095 },
+ { url = "https://files.pythonhosted.org/packages/4c/ff/a9a504662452e2d2878512115638966e75633519ec11f25fca3d2049a94a/charset_normalizer-3.4.1-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:c75cb2a3e389853835e84a2d8fb2b81a10645b503eca9bcb98df6b5a43eb8886", size = 152668 },
+ { url = "https://files.pythonhosted.org/packages/6c/71/189996b6d9a4b932564701628af5cee6716733e9165af1d5e1b285c530ed/charset_normalizer-3.4.1-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:09b26ae6b1abf0d27570633b2b078a2a20419c99d66fb2823173d73f188ce601", size = 150073 },
+ { url = "https://files.pythonhosted.org/packages/e4/93/946a86ce20790e11312c87c75ba68d5f6ad2208cfb52b2d6a2c32840d922/charset_normalizer-3.4.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:fa88b843d6e211393a37219e6a1c1df99d35e8fd90446f1118f4216e307e48cd", size = 145732 },
+ { url = "https://files.pythonhosted.org/packages/cd/e5/131d2fb1b0dddafc37be4f3a2fa79aa4c037368be9423061dccadfd90091/charset_normalizer-3.4.1-cp313-cp313-win32.whl", hash = "sha256:eb8178fe3dba6450a3e024e95ac49ed3400e506fd4e9e5c32d30adda88cbd407", size = 95391 },
+ { url = "https://files.pythonhosted.org/packages/27/f2/4f9a69cc7712b9b5ad8fdb87039fd89abba997ad5cbe690d1835d40405b0/charset_normalizer-3.4.1-cp313-cp313-win_amd64.whl", hash = "sha256:b1ac5992a838106edb89654e0aebfc24f5848ae2547d22c2c3f66454daa11971", size = 102702 },
+ { url = "https://files.pythonhosted.org/packages/0e/f6/65ecc6878a89bb1c23a086ea335ad4bf21a588990c3f535a227b9eea9108/charset_normalizer-3.4.1-py3-none-any.whl", hash = "sha256:d98b1668f06378c6dbefec3b92299716b931cd4e6061f3c875a71ced1780ab85", size = 49767 },
+]
+
+[[package]]
+name = "click"
+version = "8.1.8"
+source = { registry = "https://pypi.org/simple" }
+dependencies = [
+ { name = "colorama", marker = "sys_platform == 'win32'" },
+]
+sdist = { url = "https://files.pythonhosted.org/packages/b9/2e/0090cbf739cee7d23781ad4b89a9894a41538e4fcf4c31dcdd705b78eb8b/click-8.1.8.tar.gz", hash = "sha256:ed53c9d8990d83c2a27deae68e4ee337473f6330c040a31d4225c9574d16096a", size = 226593 }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/7e/d4/7ebdbd03970677812aac39c869717059dbb71a4cfc033ca6e5221787892c/click-8.1.8-py3-none-any.whl", hash = "sha256:63c132bbbed01578a06712a2d1f497bb62d9c1c0d329b7903a866228027263b2", size = 98188 },
+]
+
+[[package]]
+name = "colorama"
+version = "0.4.6"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/d8/53/6f443c9a4a8358a93a6792e2acffb9d9d5cb0a5cfd8802644b7b1c9a02e4/colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44", size = 27697 }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/d1/d6/3965ed04c63042e047cb6a3e6ed1a63a35087b6a609aa3a15ed8ac56c221/colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6", size = 25335 },
+]
+
+[[package]]
+name = "deprecated"
+version = "1.2.18"
+source = { registry = "https://pypi.org/simple" }
+dependencies = [
+ { name = "wrapt" },
+]
+sdist = { url = "https://files.pythonhosted.org/packages/98/97/06afe62762c9a8a86af0cfb7bfdab22a43ad17138b07af5b1a58442690a2/deprecated-1.2.18.tar.gz", hash = "sha256:422b6f6d859da6f2ef57857761bfb392480502a64c3028ca9bbe86085d72115d", size = 2928744 }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/6e/c6/ac0b6c1e2d138f1002bcf799d330bd6d85084fece321e662a14223794041/Deprecated-1.2.18-py2.py3-none-any.whl", hash = "sha256:bd5011788200372a32418f888e326a09ff80d0214bd961147cfed01b5c018eec", size = 9998 },
+]
+
+[[package]]
+name = "gql"
+version = "3.5.0"
+source = { registry = "https://pypi.org/simple" }
+dependencies = [
+ { name = "anyio" },
+ { name = "backoff" },
+ { name = "graphql-core" },
+ { name = "yarl" },
+]
+sdist = { url = "https://files.pythonhosted.org/packages/3d/85/feda24b33adcc6c8463a62a8e2ca2cc3425dc6d687388ff728ceae231204/gql-3.5.0.tar.gz", hash = "sha256:ccb9c5db543682b28f577069950488218ed65d4ac70bb03b6929aaadaf636de9", size = 179939 }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/74/fb/01a200e1c31b79690427c8e983014e4220d2652b4372a46fe4598e1d7a8e/gql-3.5.0-py2.py3-none-any.whl", hash = "sha256:70dda5694a5b194a8441f077aa5fb70cc94e4ec08016117523f013680901ecb7", size = 74001 },
+]
+
+[package.optional-dependencies]
+requests = [
+ { name = "requests" },
+ { name = "requests-toolbelt" },
+]
+websockets = [
+ { name = "websockets" },
+]
+
+[[package]]
+name = "graphql-core"
+version = "3.2.6"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/c4/16/7574029da84834349b60ed71614d66ca3afe46e9bf9c7b9562102acb7d4f/graphql_core-3.2.6.tar.gz", hash = "sha256:c08eec22f9e40f0bd61d805907e3b3b1b9a320bc606e23dc145eebca07c8fbab", size = 505353 }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/ae/4f/7297663840621022bc73c22d7d9d80dbc78b4db6297f764b545cd5dd462d/graphql_core-3.2.6-py3-none-any.whl", hash = "sha256:78b016718c161a6fb20a7d97bbf107f331cd1afe53e45566c59f776ed7f0b45f", size = 203416 },
+]
+
+[[package]]
+name = "h11"
+version = "0.14.0"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/f5/38/3af3d3633a34a3316095b39c8e8fb4853a28a536e55d347bd8d8e9a14b03/h11-0.14.0.tar.gz", hash = "sha256:8f19fbbe99e72420ff35c00b27a34cb9937e902a8b810e2c88300c6f0a3b699d", size = 100418 }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/95/04/ff642e65ad6b90db43e668d70ffb6736436c7ce41fcc549f4e9472234127/h11-0.14.0-py3-none-any.whl", hash = "sha256:e3fe4ac4b851c468cc8363d500db52c2ead036020723024a109d37346efaa761", size = 58259 },
+]
+
+[[package]]
+name = "httpcore"
+version = "1.0.7"
+source = { registry = "https://pypi.org/simple" }
+dependencies = [
+ { name = "certifi" },
+ { name = "h11" },
+]
+sdist = { url = "https://files.pythonhosted.org/packages/6a/41/d7d0a89eb493922c37d343b607bc1b5da7f5be7e383740b4753ad8943e90/httpcore-1.0.7.tar.gz", hash = "sha256:8551cb62a169ec7162ac7be8d4817d561f60e08eaa485234898414bb5a8a0b4c", size = 85196 }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/87/f5/72347bc88306acb359581ac4d52f23c0ef445b57157adedb9aee0cd689d2/httpcore-1.0.7-py3-none-any.whl", hash = "sha256:a3fff8f43dc260d5bd363d9f9cf1830fa3a458b332856f34282de498ed420edd", size = 78551 },
+]
+
+[[package]]
+name = "httpx"
+version = "0.25.2"
+source = { registry = "https://pypi.org/simple" }
+dependencies = [
+ { name = "anyio" },
+ { name = "certifi" },
+ { name = "httpcore" },
+ { name = "idna" },
+ { name = "sniffio" },
+]
+sdist = { url = "https://files.pythonhosted.org/packages/8c/23/911d93a022979d3ea295f659fbe7edb07b3f4561a477e83b3a6d0e0c914e/httpx-0.25.2.tar.gz", hash = "sha256:8b8fcaa0c8ea7b05edd69a094e63a2094c4efcb48129fb757361bc423c0ad9e8", size = 123889 }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/a2/65/6940eeb21dcb2953778a6895281c179efd9100463ff08cb6232bb6480da7/httpx-0.25.2-py3-none-any.whl", hash = "sha256:a05d3d052d9b2dfce0e3896636467f8a5342fb2b902c819428e1ac65413ca118", size = 74980 },
+]
+
+[[package]]
+name = "idna"
+version = "3.10"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/f1/70/7703c29685631f5a7590aa73f1f1d3fa9a380e654b86af429e0934a32f7d/idna-3.10.tar.gz", hash = "sha256:12f65c9b470abda6dc35cf8e63cc574b1c52b11df2c86030af0ac09b01b13ea9", size = 190490 }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/76/c6/c88e154df9c4e1a2a66ccf0005a88dfb2650c1dffb6f5ce603dfbd452ce3/idna-3.10-py3-none-any.whl", hash = "sha256:946d195a0d259cbba61165e88e65941f16e9b36ea6ddb97f00452bae8b1287d3", size = 70442 },
+]
+
+[[package]]
+name = "iniconfig"
+version = "2.0.0"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/d7/4b/cbd8e699e64a6f16ca3a8220661b5f83792b3017d0f79807cb8708d33913/iniconfig-2.0.0.tar.gz", hash = "sha256:2d91e135bf72d31a410b17c16da610a82cb55f6b0477d1a902134b24a455b8b3", size = 4646 }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/ef/a6/62565a6e1cf69e10f5727360368e451d4b7f58beeac6173dc9db836a5b46/iniconfig-2.0.0-py3-none-any.whl", hash = "sha256:b6a85871a79d2e3b22d2d1b94ac2824226a63c6b741c88f7ae975f18b6778374", size = 5892 },
+]
+
+[[package]]
+name = "levenshtein"
+version = "0.26.1"
+source = { registry = "https://pypi.org/simple" }
+dependencies = [
+ { name = "rapidfuzz" },
+]
+sdist = { url = "https://files.pythonhosted.org/packages/97/e6/79807d3b59a67dd78bb77072ca6a28d8db0935161fecf935e6c38c5f6825/levenshtein-0.26.1.tar.gz", hash = "sha256:0d19ba22330d50609b2349021ec3cf7d905c6fe21195a2d0d876a146e7ed2575", size = 374307 }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/4c/53/3685ee7fbe9b8eb4b82d8045255e59dd6943f94e8091697ef3808e7ecf63/levenshtein-0.26.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:cc741ca406d3704dc331a69c04b061fc952509a069b79cab8287413f434684bd", size = 176447 },
+ { url = "https://files.pythonhosted.org/packages/82/7f/7d6fe9b76bd030200f8f9b162f3de862d597804d292af292ec3ce9ae8bee/levenshtein-0.26.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:821ace3b4e1c2e02b43cf5dc61aac2ea43bdb39837ac890919c225a2c3f2fea4", size = 157589 },
+ { url = "https://files.pythonhosted.org/packages/bc/d3/44539e952df93c5d88a95a0edff34af38e4f87330a76e8335bfe2c0f31bf/levenshtein-0.26.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f92694c9396f55d4c91087efacf81297bef152893806fc54c289fc0254b45384", size = 153306 },
+ { url = "https://files.pythonhosted.org/packages/ba/fe/21443c0c50824314e2d2ce7e1e9cd11d21b3643f3c14da156b15b4d399c7/levenshtein-0.26.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:51ba374de7a1797d04a14a4f0ad3602d2d71fef4206bb20a6baaa6b6a502da58", size = 184409 },
+ { url = "https://files.pythonhosted.org/packages/f0/7b/c95066c64bb18628cf7488e0dd6aec2b7cbda307d93ba9ede68a21af2a7b/levenshtein-0.26.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f7aa5c3327dda4ef952769bacec09c09ff5bf426e07fdc94478c37955681885b", size = 193134 },
+ { url = "https://files.pythonhosted.org/packages/36/22/5f9760b135bdefb8cf8d663890756136754db03214f929b73185dfa33f05/levenshtein-0.26.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:33e2517e8d3c221de2d1183f400aed64211fcfc77077b291ed9f3bb64f141cdc", size = 162266 },
+ { url = "https://files.pythonhosted.org/packages/11/50/6b1a5f3600caae40db0928f6775d7efc62c13dec2407d3d540bc4afdb72c/levenshtein-0.26.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9092b622765c7649dd1d8af0f43354723dd6f4e570ac079ffd90b41033957438", size = 246339 },
+ { url = "https://files.pythonhosted.org/packages/26/eb/ede282fcb495570898b39a0d2f21bbc9be5587d604c93a518ece80f3e7dc/levenshtein-0.26.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:fc16796c85d7d8b259881d59cc8b5e22e940901928c2ff6924b2c967924e8a0b", size = 1077937 },
+ { url = "https://files.pythonhosted.org/packages/35/41/eebe1c4a75f592d9bdc3c2595418f083bcad747e0aec52a1a9ffaae93f5c/levenshtein-0.26.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:e4370733967f5994ceeed8dc211089bedd45832ee688cecea17bfd35a9eb22b9", size = 1330607 },
+ { url = "https://files.pythonhosted.org/packages/12/8e/4d34b1857adfd69c2a72d84bca1b8538d4cfaaf6fddd8599573f4281a9d1/levenshtein-0.26.1-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:3535ecfd88c9b283976b5bc61265855f59bba361881e92ed2b5367b6990c93fe", size = 1197505 },
+ { url = "https://files.pythonhosted.org/packages/c0/7b/6afcda1b0a0622cedaa4f7a5b3507c2384a7358fc051ccf619e5d2453bf2/levenshtein-0.26.1-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:90236e93d98bdfd708883a6767826fafd976dac8af8fc4a0fb423d4fa08e1bf0", size = 1352832 },
+ { url = "https://files.pythonhosted.org/packages/21/5e/0ed4e7b5c820b6bc40e2c391633292c3666400339042a3d306f0dc8fdcb4/levenshtein-0.26.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:04b7cabb82edf566b1579b3ed60aac0eec116655af75a3c551fee8754ffce2ea", size = 1135970 },
+ { url = "https://files.pythonhosted.org/packages/c9/91/3ff1abacb58642749dfd130ad855370e01b9c7aeaa73801964361f6e355f/levenshtein-0.26.1-cp312-cp312-win32.whl", hash = "sha256:ae382af8c76f6d2a040c0d9ca978baf461702ceb3f79a0a3f6da8d596a484c5b", size = 87599 },
+ { url = "https://files.pythonhosted.org/packages/7d/f9/727f3ba7843a3fb2a0f3db825358beea2a52bc96258874ee80cb2e5ecabb/levenshtein-0.26.1-cp312-cp312-win_amd64.whl", hash = "sha256:fd091209798cfdce53746f5769987b4108fe941c54fb2e058c016ffc47872918", size = 98809 },
+ { url = "https://files.pythonhosted.org/packages/d4/f4/f87f19222d279dbac429b9bc7ccae271d900fd9c48a581b8bc180ba6cd09/levenshtein-0.26.1-cp312-cp312-win_arm64.whl", hash = "sha256:7e82f2ea44a81ad6b30d92a110e04cd3c8c7c6034b629aca30a3067fa174ae89", size = 88227 },
+ { url = "https://files.pythonhosted.org/packages/7e/d6/b4b522b94d7b387c023d22944590befc0ac6b766ac6d197afd879ddd77fc/levenshtein-0.26.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:790374a9f5d2cbdb30ee780403a62e59bef51453ac020668c1564d1e43438f0e", size = 175836 },
+ { url = "https://files.pythonhosted.org/packages/25/76/06d1e26a8e6d0de68ef4a157dd57f6b342413c03550309e4aa095a453b28/levenshtein-0.26.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:7b05c0415c386d00efda83d48db9db68edd02878d6dbc6df01194f12062be1bb", size = 157036 },
+ { url = "https://files.pythonhosted.org/packages/7e/23/21209a9e96b878aede3bea104533866762ba621e36fc344aa080db5feb02/levenshtein-0.26.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c3114586032361722ddededf28401ce5baf1cf617f9f49fb86b8766a45a423ff", size = 153326 },
+ { url = "https://files.pythonhosted.org/packages/06/38/9fc68685fffd8863b13864552eba8f3eb6a82a4dc558bf2c6553c2347d6c/levenshtein-0.26.1-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2532f8a13b68bf09f152d906f118a88da2063da22f44c90e904b142b0a53d534", size = 183693 },
+ { url = "https://files.pythonhosted.org/packages/f6/82/ccd7bdd7d431329da025e649c63b731df44f8cf31b957e269ae1c1dc9a8e/levenshtein-0.26.1-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:219c30be6aa734bf927188d1208b7d78d202a3eb017b1c5f01ab2034d2d4ccca", size = 190581 },
+ { url = "https://files.pythonhosted.org/packages/6e/c5/57f90b4aea1f89f853872b27a5a5dbce37b89ffeae42c02060b3e82038b2/levenshtein-0.26.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:397e245e77f87836308bd56305bba630010cd8298c34c4c44bd94990cdb3b7b1", size = 162446 },
+ { url = "https://files.pythonhosted.org/packages/fc/da/df6acca738921f896ce2d178821be866b43a583f85e2d1de63a4f8f78080/levenshtein-0.26.1-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:aeff6ea3576f72e26901544c6c55c72a7b79b9983b6f913cba0e9edbf2f87a97", size = 247123 },
+ { url = "https://files.pythonhosted.org/packages/22/fb/f44a4c0d7784ccd32e4166714fea61e50f62b232162ae16332f45cb55ab2/levenshtein-0.26.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:a19862e3539a697df722a08793994e334cd12791e8144851e8a1dee95a17ff63", size = 1077437 },
+ { url = "https://files.pythonhosted.org/packages/f0/5e/d9b9e7daa13cc7e2184a3c2422bb847f05d354ce15ba113b20d83e9ab366/levenshtein-0.26.1-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:dc3b5a64f57c3c078d58b1e447f7d68cad7ae1b23abe689215d03fc434f8f176", size = 1330362 },
+ { url = "https://files.pythonhosted.org/packages/bf/67/480d85bb516798014a6849be0225b246f35df4b54499c348c9c9e311f936/levenshtein-0.26.1-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:bb6c7347424a91317c5e1b68041677e4c8ed3e7823b5bbaedb95bffb3c3497ea", size = 1198721 },
+ { url = "https://files.pythonhosted.org/packages/9a/7d/889ff7d86903b6545665655627113d263c88c6d596c68fb09a640ee4f0a7/levenshtein-0.26.1-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:b817376de4195a207cc0e4ca37754c0e1e1078c2a2d35a6ae502afde87212f9e", size = 1351820 },
+ { url = "https://files.pythonhosted.org/packages/b9/29/cd42273150f08c200ed2d1879486d73502ee35265f162a77952f101d93a0/levenshtein-0.26.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:7b50c3620ff47c9887debbb4c154aaaac3e46be7fc2e5789ee8dbe128bce6a17", size = 1135747 },
+ { url = "https://files.pythonhosted.org/packages/1d/90/cbcfa3dd86023e82036662a19fec2fcb48782d3f9fa322d44dc898d95a5d/levenshtein-0.26.1-cp313-cp313-win32.whl", hash = "sha256:9fb859da90262eb474c190b3ca1e61dee83add022c676520f5c05fdd60df902a", size = 87318 },
+ { url = "https://files.pythonhosted.org/packages/83/73/372edebc79fd09a8b2382cf1244d279ada5b795124f1e1c4fc73d9fbb00f/levenshtein-0.26.1-cp313-cp313-win_amd64.whl", hash = "sha256:8adcc90e3a5bfb0a463581d85e599d950fe3c2938ac6247b29388b64997f6e2d", size = 98418 },
+ { url = "https://files.pythonhosted.org/packages/b2/6d/f0160ea5a7bb7a62b3b3d56e9fc5024b440cb59555a90be2347abf2e7888/levenshtein-0.26.1-cp313-cp313-win_arm64.whl", hash = "sha256:c2599407e029865dc66d210b8804c7768cbdbf60f061d993bb488d5242b0b73e", size = 87792 },
+]
+
+[[package]]
+name = "more-itertools"
+version = "10.6.0"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/88/3b/7fa1fe835e2e93fd6d7b52b2f95ae810cf5ba133e1845f726f5a992d62c2/more-itertools-10.6.0.tar.gz", hash = "sha256:2cd7fad1009c31cc9fb6a035108509e6547547a7a738374f10bd49a09eb3ee3b", size = 125009 }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/23/62/0fe302c6d1be1c777cab0616e6302478251dfbf9055ad426f5d0def75c89/more_itertools-10.6.0-py3-none-any.whl", hash = "sha256:6eb054cb4b6db1473f6e15fcc676a08e4732548acd47c708f0e179c2c7c01e89", size = 63038 },
+]
+
+[[package]]
+name = "multidict"
+version = "6.1.0"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/d6/be/504b89a5e9ca731cd47487e91c469064f8ae5af93b7259758dcfc2b9c848/multidict-6.1.0.tar.gz", hash = "sha256:22ae2ebf9b0c69d206c003e2f6a914ea33f0a932d4aa16f236afc049d9958f4a", size = 64002 }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/fd/16/92057c74ba3b96d5e211b553895cd6dc7cc4d1e43d9ab8fafc727681ef71/multidict-6.1.0-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:b04772ed465fa3cc947db808fa306d79b43e896beb677a56fb2347ca1a49c1fa", size = 48713 },
+ { url = "https://files.pythonhosted.org/packages/94/3d/37d1b8893ae79716179540b89fc6a0ee56b4a65fcc0d63535c6f5d96f217/multidict-6.1.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:6180c0ae073bddeb5a97a38c03f30c233e0a4d39cd86166251617d1bbd0af436", size = 29516 },
+ { url = "https://files.pythonhosted.org/packages/a2/12/adb6b3200c363062f805275b4c1e656be2b3681aada66c80129932ff0bae/multidict-6.1.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:071120490b47aa997cca00666923a83f02c7fbb44f71cf7f136df753f7fa8761", size = 29557 },
+ { url = "https://files.pythonhosted.org/packages/47/e9/604bb05e6e5bce1e6a5cf80a474e0f072e80d8ac105f1b994a53e0b28c42/multidict-6.1.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:50b3a2710631848991d0bf7de077502e8994c804bb805aeb2925a981de58ec2e", size = 130170 },
+ { url = "https://files.pythonhosted.org/packages/7e/13/9efa50801785eccbf7086b3c83b71a4fb501a4d43549c2f2f80b8787d69f/multidict-6.1.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b58c621844d55e71c1b7f7c498ce5aa6985d743a1a59034c57a905b3f153c1ef", size = 134836 },
+ { url = "https://files.pythonhosted.org/packages/bf/0f/93808b765192780d117814a6dfcc2e75de6dcc610009ad408b8814dca3ba/multidict-6.1.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:55b6d90641869892caa9ca42ff913f7ff1c5ece06474fbd32fb2cf6834726c95", size = 133475 },
+ { url = "https://files.pythonhosted.org/packages/d3/c8/529101d7176fe7dfe1d99604e48d69c5dfdcadb4f06561f465c8ef12b4df/multidict-6.1.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4b820514bfc0b98a30e3d85462084779900347e4d49267f747ff54060cc33925", size = 131049 },
+ { url = "https://files.pythonhosted.org/packages/ca/0c/fc85b439014d5a58063e19c3a158a889deec399d47b5269a0f3b6a2e28bc/multidict-6.1.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:10a9b09aba0c5b48c53761b7c720aaaf7cf236d5fe394cd399c7ba662d5f9966", size = 120370 },
+ { url = "https://files.pythonhosted.org/packages/db/46/d4416eb20176492d2258fbd47b4abe729ff3b6e9c829ea4236f93c865089/multidict-6.1.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:1e16bf3e5fc9f44632affb159d30a437bfe286ce9e02754759be5536b169b305", size = 125178 },
+ { url = "https://files.pythonhosted.org/packages/5b/46/73697ad7ec521df7de5531a32780bbfd908ded0643cbe457f981a701457c/multidict-6.1.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:76f364861c3bfc98cbbcbd402d83454ed9e01a5224bb3a28bf70002a230f73e2", size = 119567 },
+ { url = "https://files.pythonhosted.org/packages/cd/ed/51f060e2cb0e7635329fa6ff930aa5cffa17f4c7f5c6c3ddc3500708e2f2/multidict-6.1.0-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:820c661588bd01a0aa62a1283f20d2be4281b086f80dad9e955e690c75fb54a2", size = 129822 },
+ { url = "https://files.pythonhosted.org/packages/df/9e/ee7d1954b1331da3eddea0c4e08d9142da5f14b1321c7301f5014f49d492/multidict-6.1.0-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:0e5f362e895bc5b9e67fe6e4ded2492d8124bdf817827f33c5b46c2fe3ffaca6", size = 128656 },
+ { url = "https://files.pythonhosted.org/packages/77/00/8538f11e3356b5d95fa4b024aa566cde7a38aa7a5f08f4912b32a037c5dc/multidict-6.1.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:3ec660d19bbc671e3a6443325f07263be452c453ac9e512f5eb935e7d4ac28b3", size = 125360 },
+ { url = "https://files.pythonhosted.org/packages/be/05/5d334c1f2462d43fec2363cd00b1c44c93a78c3925d952e9a71caf662e96/multidict-6.1.0-cp312-cp312-win32.whl", hash = "sha256:58130ecf8f7b8112cdb841486404f1282b9c86ccb30d3519faf301b2e5659133", size = 26382 },
+ { url = "https://files.pythonhosted.org/packages/a3/bf/f332a13486b1ed0496d624bcc7e8357bb8053823e8cd4b9a18edc1d97e73/multidict-6.1.0-cp312-cp312-win_amd64.whl", hash = "sha256:188215fc0aafb8e03341995e7c4797860181562380f81ed0a87ff455b70bf1f1", size = 28529 },
+ { url = "https://files.pythonhosted.org/packages/22/67/1c7c0f39fe069aa4e5d794f323be24bf4d33d62d2a348acdb7991f8f30db/multidict-6.1.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:d569388c381b24671589335a3be6e1d45546c2988c2ebe30fdcada8457a31008", size = 48771 },
+ { url = "https://files.pythonhosted.org/packages/3c/25/c186ee7b212bdf0df2519eacfb1981a017bda34392c67542c274651daf23/multidict-6.1.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:052e10d2d37810b99cc170b785945421141bf7bb7d2f8799d431e7db229c385f", size = 29533 },
+ { url = "https://files.pythonhosted.org/packages/67/5e/04575fd837e0958e324ca035b339cea174554f6f641d3fb2b4f2e7ff44a2/multidict-6.1.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:f90c822a402cb865e396a504f9fc8173ef34212a342d92e362ca498cad308e28", size = 29595 },
+ { url = "https://files.pythonhosted.org/packages/d3/b2/e56388f86663810c07cfe4a3c3d87227f3811eeb2d08450b9e5d19d78876/multidict-6.1.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b225d95519a5bf73860323e633a664b0d85ad3d5bede6d30d95b35d4dfe8805b", size = 130094 },
+ { url = "https://files.pythonhosted.org/packages/6c/ee/30ae9b4186a644d284543d55d491fbd4239b015d36b23fea43b4c94f7052/multidict-6.1.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:23bfd518810af7de1116313ebd9092cb9aa629beb12f6ed631ad53356ed6b86c", size = 134876 },
+ { url = "https://files.pythonhosted.org/packages/84/c7/70461c13ba8ce3c779503c70ec9d0345ae84de04521c1f45a04d5f48943d/multidict-6.1.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5c09fcfdccdd0b57867577b719c69e347a436b86cd83747f179dbf0cc0d4c1f3", size = 133500 },
+ { url = "https://files.pythonhosted.org/packages/4a/9f/002af221253f10f99959561123fae676148dd730e2daa2cd053846a58507/multidict-6.1.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bf6bea52ec97e95560af5ae576bdac3aa3aae0b6758c6efa115236d9e07dae44", size = 131099 },
+ { url = "https://files.pythonhosted.org/packages/82/42/d1c7a7301d52af79d88548a97e297f9d99c961ad76bbe6f67442bb77f097/multidict-6.1.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:57feec87371dbb3520da6192213c7d6fc892d5589a93db548331954de8248fd2", size = 120403 },
+ { url = "https://files.pythonhosted.org/packages/68/f3/471985c2c7ac707547553e8f37cff5158030d36bdec4414cb825fbaa5327/multidict-6.1.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:0c3f390dc53279cbc8ba976e5f8035eab997829066756d811616b652b00a23a3", size = 125348 },
+ { url = "https://files.pythonhosted.org/packages/67/2c/e6df05c77e0e433c214ec1d21ddd203d9a4770a1f2866a8ca40a545869a0/multidict-6.1.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:59bfeae4b25ec05b34f1956eaa1cb38032282cd4dfabc5056d0a1ec4d696d3aa", size = 119673 },
+ { url = "https://files.pythonhosted.org/packages/c5/cd/bc8608fff06239c9fb333f9db7743a1b2eafe98c2666c9a196e867a3a0a4/multidict-6.1.0-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:b2f59caeaf7632cc633b5cf6fc449372b83bbdf0da4ae04d5be36118e46cc0aa", size = 129927 },
+ { url = "https://files.pythonhosted.org/packages/44/8e/281b69b7bc84fc963a44dc6e0bbcc7150e517b91df368a27834299a526ac/multidict-6.1.0-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:37bb93b2178e02b7b618893990941900fd25b6b9ac0fa49931a40aecdf083fe4", size = 128711 },
+ { url = "https://files.pythonhosted.org/packages/12/a4/63e7cd38ed29dd9f1881d5119f272c898ca92536cdb53ffe0843197f6c85/multidict-6.1.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:4e9f48f58c2c523d5a06faea47866cd35b32655c46b443f163d08c6d0ddb17d6", size = 125519 },
+ { url = "https://files.pythonhosted.org/packages/38/e0/4f5855037a72cd8a7a2f60a3952d9aa45feedb37ae7831642102604e8a37/multidict-6.1.0-cp313-cp313-win32.whl", hash = "sha256:3a37ffb35399029b45c6cc33640a92bef403c9fd388acce75cdc88f58bd19a81", size = 26426 },
+ { url = "https://files.pythonhosted.org/packages/7e/a5/17ee3a4db1e310b7405f5d25834460073a8ccd86198ce044dfaf69eac073/multidict-6.1.0-cp313-cp313-win_amd64.whl", hash = "sha256:e9aa71e15d9d9beaad2c6b9319edcdc0a49a43ef5c0a4c8265ca9ee7d6c67774", size = 28531 },
+ { url = "https://files.pythonhosted.org/packages/99/b7/b9e70fde2c0f0c9af4cc5277782a89b66d35948ea3369ec9f598358c3ac5/multidict-6.1.0-py3-none-any.whl", hash = "sha256:48e171e52d1c4d33888e529b999e5900356b9ae588c2f09a52dcefb158b27506", size = 10051 },
+]
+
+[[package]]
+name = "mypy"
+version = "1.15.0"
+source = { registry = "https://pypi.org/simple" }
+dependencies = [
+ { name = "mypy-extensions" },
+ { name = "typing-extensions" },
+]
+sdist = { url = "https://files.pythonhosted.org/packages/ce/43/d5e49a86afa64bd3839ea0d5b9c7103487007d728e1293f52525d6d5486a/mypy-1.15.0.tar.gz", hash = "sha256:404534629d51d3efea5c800ee7c42b72a6554d6c400e6a79eafe15d11341fd43", size = 3239717 }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/98/3a/03c74331c5eb8bd025734e04c9840532226775c47a2c39b56a0c8d4f128d/mypy-1.15.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:aea39e0583d05124836ea645f412e88a5c7d0fd77a6d694b60d9b6b2d9f184fd", size = 10793981 },
+ { url = "https://files.pythonhosted.org/packages/f0/1a/41759b18f2cfd568848a37c89030aeb03534411eef981df621d8fad08a1d/mypy-1.15.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:2f2147ab812b75e5b5499b01ade1f4a81489a147c01585cda36019102538615f", size = 9749175 },
+ { url = "https://files.pythonhosted.org/packages/12/7e/873481abf1ef112c582db832740f4c11b2bfa510e829d6da29b0ab8c3f9c/mypy-1.15.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ce436f4c6d218a070048ed6a44c0bbb10cd2cc5e272b29e7845f6a2f57ee4464", size = 11455675 },
+ { url = "https://files.pythonhosted.org/packages/b3/d0/92ae4cde706923a2d3f2d6c39629134063ff64b9dedca9c1388363da072d/mypy-1.15.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:8023ff13985661b50a5928fc7a5ca15f3d1affb41e5f0a9952cb68ef090b31ee", size = 12410020 },
+ { url = "https://files.pythonhosted.org/packages/46/8b/df49974b337cce35f828ba6fda228152d6db45fed4c86ba56ffe442434fd/mypy-1.15.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:1124a18bc11a6a62887e3e137f37f53fbae476dc36c185d549d4f837a2a6a14e", size = 12498582 },
+ { url = "https://files.pythonhosted.org/packages/13/50/da5203fcf6c53044a0b699939f31075c45ae8a4cadf538a9069b165c1050/mypy-1.15.0-cp312-cp312-win_amd64.whl", hash = "sha256:171a9ca9a40cd1843abeca0e405bc1940cd9b305eaeea2dda769ba096932bb22", size = 9366614 },
+ { url = "https://files.pythonhosted.org/packages/6a/9b/fd2e05d6ffff24d912f150b87db9e364fa8282045c875654ce7e32fffa66/mypy-1.15.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:93faf3fdb04768d44bf28693293f3904bbb555d076b781ad2530214ee53e3445", size = 10788592 },
+ { url = "https://files.pythonhosted.org/packages/74/37/b246d711c28a03ead1fd906bbc7106659aed7c089d55fe40dd58db812628/mypy-1.15.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:811aeccadfb730024c5d3e326b2fbe9249bb7413553f15499a4050f7c30e801d", size = 9753611 },
+ { url = "https://files.pythonhosted.org/packages/a6/ac/395808a92e10cfdac8003c3de9a2ab6dc7cde6c0d2a4df3df1b815ffd067/mypy-1.15.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:98b7b9b9aedb65fe628c62a6dc57f6d5088ef2dfca37903a7d9ee374d03acca5", size = 11438443 },
+ { url = "https://files.pythonhosted.org/packages/d2/8b/801aa06445d2de3895f59e476f38f3f8d610ef5d6908245f07d002676cbf/mypy-1.15.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:c43a7682e24b4f576d93072216bf56eeff70d9140241f9edec0c104d0c515036", size = 12402541 },
+ { url = "https://files.pythonhosted.org/packages/c7/67/5a4268782eb77344cc613a4cf23540928e41f018a9a1ec4c6882baf20ab8/mypy-1.15.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:baefc32840a9f00babd83251560e0ae1573e2f9d1b067719479bfb0e987c6357", size = 12494348 },
+ { url = "https://files.pythonhosted.org/packages/83/3e/57bb447f7bbbfaabf1712d96f9df142624a386d98fb026a761532526057e/mypy-1.15.0-cp313-cp313-win_amd64.whl", hash = "sha256:b9378e2c00146c44793c98b8d5a61039a048e31f429fb0eb546d93f4b000bedf", size = 9373648 },
+ { url = "https://files.pythonhosted.org/packages/09/4e/a7d65c7322c510de2c409ff3828b03354a7c43f5a8ed458a7a131b41c7b9/mypy-1.15.0-py3-none-any.whl", hash = "sha256:5469affef548bd1895d86d3bf10ce2b44e33d86923c29e4d675b3e323437ea3e", size = 2221777 },
+]
+
+[[package]]
+name = "mypy-extensions"
+version = "1.0.0"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/98/a4/1ab47638b92648243faf97a5aeb6ea83059cc3624972ab6b8d2316078d3f/mypy_extensions-1.0.0.tar.gz", hash = "sha256:75dbf8955dc00442a438fc4d0666508a9a97b6bd41aa2f0ffe9d2f2725af0782", size = 4433 }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/2a/e2/5d3f6ada4297caebe1a2add3b126fe800c96f56dbe5d1988a2cbe0b267aa/mypy_extensions-1.0.0-py3-none-any.whl", hash = "sha256:4392f6c0eb8a5668a69e23d168ffa70f0be9ccfd32b5cc2d26a34ae5b844552d", size = 4695 },
+]
+
+[[package]]
+name = "numpy"
+version = "2.2.2"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/ec/d0/c12ddfd3a02274be06ffc71f3efc6d0e457b0409c4481596881e748cb264/numpy-2.2.2.tar.gz", hash = "sha256:ed6906f61834d687738d25988ae117683705636936cc605be0bb208b23df4d8f", size = 20233295 }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/0c/e6/847d15770ab7a01e807bdfcd4ead5bdae57c0092b7dc83878171b6af97bb/numpy-2.2.2-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:ac9bea18d6d58a995fac1b2cb4488e17eceeac413af014b1dd26170b766d8467", size = 20912636 },
+ { url = "https://files.pythonhosted.org/packages/d1/af/f83580891577b13bd7e261416120e036d0d8fb508c8a43a73e38928b794b/numpy-2.2.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:23ae9f0c2d889b7b2d88a3791f6c09e2ef827c2446f1c4a3e3e76328ee4afd9a", size = 14098403 },
+ { url = "https://files.pythonhosted.org/packages/2b/86/d019fb60a9d0f1d4cf04b014fe88a9135090adfadcc31c1fadbb071d7fa7/numpy-2.2.2-cp312-cp312-macosx_14_0_arm64.whl", hash = "sha256:3074634ea4d6df66be04f6728ee1d173cfded75d002c75fac79503a880bf3825", size = 5128938 },
+ { url = "https://files.pythonhosted.org/packages/7a/1b/50985edb6f1ec495a1c36452e860476f5b7ecdc3fc59ea89ccad3c4926c5/numpy-2.2.2-cp312-cp312-macosx_14_0_x86_64.whl", hash = "sha256:8ec0636d3f7d68520afc6ac2dc4b8341ddb725039de042faf0e311599f54eb37", size = 6661937 },
+ { url = "https://files.pythonhosted.org/packages/f4/1b/17efd94cad1b9d605c3f8907fb06bcffc4ce4d1d14d46b95316cccccf2b9/numpy-2.2.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2ffbb1acd69fdf8e89dd60ef6182ca90a743620957afb7066385a7bbe88dc748", size = 14049518 },
+ { url = "https://files.pythonhosted.org/packages/5b/73/65d2f0b698df1731e851e3295eb29a5ab8aa06f763f7e4188647a809578d/numpy-2.2.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0349b025e15ea9d05c3d63f9657707a4e1d471128a3b1d876c095f328f8ff7f0", size = 16099146 },
+ { url = "https://files.pythonhosted.org/packages/d5/69/308f55c0e19d4b5057b5df286c5433822e3c8039ede06d4051d96f1c2c4e/numpy-2.2.2-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:463247edcee4a5537841d5350bc87fe8e92d7dd0e8c71c995d2c6eecb8208278", size = 15246336 },
+ { url = "https://files.pythonhosted.org/packages/f0/d8/d8d333ad0d8518d077a21aeea7b7c826eff766a2b1ce1194dea95ca0bacf/numpy-2.2.2-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:9dd47ff0cb2a656ad69c38da850df3454da88ee9a6fde0ba79acceee0e79daba", size = 17863507 },
+ { url = "https://files.pythonhosted.org/packages/82/6e/0b84ad3103ffc16d6673e63b5acbe7901b2af96c2837174c6318c98e27ab/numpy-2.2.2-cp312-cp312-win32.whl", hash = "sha256:4525b88c11906d5ab1b0ec1f290996c0020dd318af8b49acaa46f198b1ffc283", size = 6276491 },
+ { url = "https://files.pythonhosted.org/packages/fc/84/7f801a42a67b9772a883223a0a1e12069a14626c81a732bd70aac57aebc1/numpy-2.2.2-cp312-cp312-win_amd64.whl", hash = "sha256:5acea83b801e98541619af398cc0109ff48016955cc0818f478ee9ef1c5c3dcb", size = 12616372 },
+ { url = "https://files.pythonhosted.org/packages/e1/fe/df5624001f4f5c3e0b78e9017bfab7fdc18a8d3b3d3161da3d64924dd659/numpy-2.2.2-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:b208cfd4f5fe34e1535c08983a1a6803fdbc7a1e86cf13dd0c61de0b51a0aadc", size = 20899188 },
+ { url = "https://files.pythonhosted.org/packages/a9/80/d349c3b5ed66bd3cb0214be60c27e32b90a506946857b866838adbe84040/numpy-2.2.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:d0bbe7dd86dca64854f4b6ce2ea5c60b51e36dfd597300057cf473d3615f2369", size = 14113972 },
+ { url = "https://files.pythonhosted.org/packages/9d/50/949ec9cbb28c4b751edfa64503f0913cbfa8d795b4a251e7980f13a8a655/numpy-2.2.2-cp313-cp313-macosx_14_0_arm64.whl", hash = "sha256:22ea3bb552ade325530e72a0c557cdf2dea8914d3a5e1fecf58fa5dbcc6f43cd", size = 5114294 },
+ { url = "https://files.pythonhosted.org/packages/8d/f3/399c15629d5a0c68ef2aa7621d430b2be22034f01dd7f3c65a9c9666c445/numpy-2.2.2-cp313-cp313-macosx_14_0_x86_64.whl", hash = "sha256:128c41c085cab8a85dc29e66ed88c05613dccf6bc28b3866cd16050a2f5448be", size = 6648426 },
+ { url = "https://files.pythonhosted.org/packages/2c/03/c72474c13772e30e1bc2e558cdffd9123c7872b731263d5648b5c49dd459/numpy-2.2.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:250c16b277e3b809ac20d1f590716597481061b514223c7badb7a0f9993c7f84", size = 14045990 },
+ { url = "https://files.pythonhosted.org/packages/83/9c/96a9ab62274ffafb023f8ee08c88d3d31ee74ca58869f859db6845494fa6/numpy-2.2.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e0c8854b09bc4de7b041148d8550d3bd712b5c21ff6a8ed308085f190235d7ff", size = 16096614 },
+ { url = "https://files.pythonhosted.org/packages/d5/34/cd0a735534c29bec7093544b3a509febc9b0df77718a9b41ffb0809c9f46/numpy-2.2.2-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:b6fb9c32a91ec32a689ec6410def76443e3c750e7cfc3fb2206b985ffb2b85f0", size = 15242123 },
+ { url = "https://files.pythonhosted.org/packages/5e/6d/541717a554a8f56fa75e91886d9b79ade2e595918690eb5d0d3dbd3accb9/numpy-2.2.2-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:57b4012e04cc12b78590a334907e01b3a85efb2107df2b8733ff1ed05fce71de", size = 17859160 },
+ { url = "https://files.pythonhosted.org/packages/b9/a5/fbf1f2b54adab31510728edd06a05c1b30839f37cf8c9747cb85831aaf1b/numpy-2.2.2-cp313-cp313-win32.whl", hash = "sha256:4dbd80e453bd34bd003b16bd802fac70ad76bd463f81f0c518d1245b1c55e3d9", size = 6273337 },
+ { url = "https://files.pythonhosted.org/packages/56/e5/01106b9291ef1d680f82bc47d0c5b5e26dfed15b0754928e8f856c82c881/numpy-2.2.2-cp313-cp313-win_amd64.whl", hash = "sha256:5a8c863ceacae696aff37d1fd636121f1a512117652e5dfb86031c8d84836369", size = 12609010 },
+ { url = "https://files.pythonhosted.org/packages/9f/30/f23d9876de0f08dceb707c4dcf7f8dd7588266745029debb12a3cdd40be6/numpy-2.2.2-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:b3482cb7b3325faa5f6bc179649406058253d91ceda359c104dac0ad320e1391", size = 20924451 },
+ { url = "https://files.pythonhosted.org/packages/6a/ec/6ea85b2da9d5dfa1dbb4cb3c76587fc8ddcae580cb1262303ab21c0926c4/numpy-2.2.2-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:9491100aba630910489c1d0158034e1c9a6546f0b1340f716d522dc103788e39", size = 14122390 },
+ { url = "https://files.pythonhosted.org/packages/68/05/bfbdf490414a7dbaf65b10c78bc243f312c4553234b6d91c94eb7c4b53c2/numpy-2.2.2-cp313-cp313t-macosx_14_0_arm64.whl", hash = "sha256:41184c416143defa34cc8eb9d070b0a5ba4f13a0fa96a709e20584638254b317", size = 5156590 },
+ { url = "https://files.pythonhosted.org/packages/f7/ec/fe2e91b2642b9d6544518388a441bcd65c904cea38d9ff998e2e8ebf808e/numpy-2.2.2-cp313-cp313t-macosx_14_0_x86_64.whl", hash = "sha256:7dca87ca328f5ea7dafc907c5ec100d187911f94825f8700caac0b3f4c384b49", size = 6671958 },
+ { url = "https://files.pythonhosted.org/packages/b1/6f/6531a78e182f194d33ee17e59d67d03d0d5a1ce7f6be7343787828d1bd4a/numpy-2.2.2-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0bc61b307655d1a7f9f4b043628b9f2b721e80839914ede634e3d485913e1fb2", size = 14019950 },
+ { url = "https://files.pythonhosted.org/packages/e1/fb/13c58591d0b6294a08cc40fcc6b9552d239d773d520858ae27f39997f2ae/numpy-2.2.2-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9fad446ad0bc886855ddf5909cbf8cb5d0faa637aaa6277fb4b19ade134ab3c7", size = 16079759 },
+ { url = "https://files.pythonhosted.org/packages/2c/f2/f2f8edd62abb4b289f65a7f6d1f3650273af00b91b7267a2431be7f1aec6/numpy-2.2.2-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:149d1113ac15005652e8d0d3f6fd599360e1a708a4f98e43c9c77834a28238cb", size = 15226139 },
+ { url = "https://files.pythonhosted.org/packages/aa/29/14a177f1a90b8ad8a592ca32124ac06af5eff32889874e53a308f850290f/numpy-2.2.2-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:106397dbbb1896f99e044efc90360d098b3335060375c26aa89c0d8a97c5f648", size = 17856316 },
+ { url = "https://files.pythonhosted.org/packages/95/03/242ae8d7b97f4e0e4ab8dd51231465fb23ed5e802680d629149722e3faf1/numpy-2.2.2-cp313-cp313t-win32.whl", hash = "sha256:0eec19f8af947a61e968d5429f0bd92fec46d92b0008d0a6685b40d6adf8a4f4", size = 6329134 },
+ { url = "https://files.pythonhosted.org/packages/80/94/cd9e9b04012c015cb6320ab3bf43bc615e248dddfeb163728e800a5d96f0/numpy-2.2.2-cp313-cp313t-win_amd64.whl", hash = "sha256:97b974d3ba0fb4612b77ed35d7627490e8e3dff56ab41454d9e8b23448940576", size = 12696208 },
+]
+
+[[package]]
+name = "packaging"
+version = "24.2"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/d0/63/68dbb6eb2de9cb10ee4c9c14a0148804425e13c4fb20d61cce69f53106da/packaging-24.2.tar.gz", hash = "sha256:c228a6dc5e932d346bc5739379109d49e8853dd8223571c7c5b55260edc0b97f", size = 163950 }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/88/ef/eb23f262cca3c0c4eb7ab1933c3b1f03d021f2c48f54763065b6f0e321be/packaging-24.2-py3-none-any.whl", hash = "sha256:09abb1bccd265c01f4a3aa3f7a7db064b36514d2cba19a2f694fe6150451a759", size = 65451 },
+]
+
+[[package]]
+name = "pandas"
+version = "2.2.3"
+source = { registry = "https://pypi.org/simple" }
+dependencies = [
+ { name = "numpy" },
+ { name = "python-dateutil" },
+ { name = "pytz" },
+ { name = "tzdata" },
+]
+sdist = { url = "https://files.pythonhosted.org/packages/9c/d6/9f8431bacc2e19dca897724cd097b1bb224a6ad5433784a44b587c7c13af/pandas-2.2.3.tar.gz", hash = "sha256:4f18ba62b61d7e192368b84517265a99b4d7ee8912f8708660fb4a366cc82667", size = 4399213 }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/17/a3/fb2734118db0af37ea7433f57f722c0a56687e14b14690edff0cdb4b7e58/pandas-2.2.3-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:b1d432e8d08679a40e2a6d8b2f9770a5c21793a6f9f47fdd52c5ce1948a5a8a9", size = 12529893 },
+ { url = "https://files.pythonhosted.org/packages/e1/0c/ad295fd74bfac85358fd579e271cded3ac969de81f62dd0142c426b9da91/pandas-2.2.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:a5a1595fe639f5988ba6a8e5bc9649af3baf26df3998a0abe56c02609392e0a4", size = 11363475 },
+ { url = "https://files.pythonhosted.org/packages/c6/2a/4bba3f03f7d07207481fed47f5b35f556c7441acddc368ec43d6643c5777/pandas-2.2.3-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:5de54125a92bb4d1c051c0659e6fcb75256bf799a732a87184e5ea503965bce3", size = 15188645 },
+ { url = "https://files.pythonhosted.org/packages/38/f8/d8fddee9ed0d0c0f4a2132c1dfcf0e3e53265055da8df952a53e7eaf178c/pandas-2.2.3-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fffb8ae78d8af97f849404f21411c95062db1496aeb3e56f146f0355c9989319", size = 12739445 },
+ { url = "https://files.pythonhosted.org/packages/20/e8/45a05d9c39d2cea61ab175dbe6a2de1d05b679e8de2011da4ee190d7e748/pandas-2.2.3-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:6dfcb5ee8d4d50c06a51c2fffa6cff6272098ad6540aed1a76d15fb9318194d8", size = 16359235 },
+ { url = "https://files.pythonhosted.org/packages/1d/99/617d07a6a5e429ff90c90da64d428516605a1ec7d7bea494235e1c3882de/pandas-2.2.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:062309c1b9ea12a50e8ce661145c6aab431b1e99530d3cd60640e255778bd43a", size = 14056756 },
+ { url = "https://files.pythonhosted.org/packages/29/d4/1244ab8edf173a10fd601f7e13b9566c1b525c4f365d6bee918e68381889/pandas-2.2.3-cp312-cp312-win_amd64.whl", hash = "sha256:59ef3764d0fe818125a5097d2ae867ca3fa64df032331b7e0917cf5d7bf66b13", size = 11504248 },
+ { url = "https://files.pythonhosted.org/packages/64/22/3b8f4e0ed70644e85cfdcd57454686b9057c6c38d2f74fe4b8bc2527214a/pandas-2.2.3-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:f00d1345d84d8c86a63e476bb4955e46458b304b9575dcf71102b5c705320015", size = 12477643 },
+ { url = "https://files.pythonhosted.org/packages/e4/93/b3f5d1838500e22c8d793625da672f3eec046b1a99257666c94446969282/pandas-2.2.3-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:3508d914817e153ad359d7e069d752cdd736a247c322d932eb89e6bc84217f28", size = 11281573 },
+ { url = "https://files.pythonhosted.org/packages/f5/94/6c79b07f0e5aab1dcfa35a75f4817f5c4f677931d4234afcd75f0e6a66ca/pandas-2.2.3-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:22a9d949bfc9a502d320aa04e5d02feab689d61da4e7764b62c30b991c42c5f0", size = 15196085 },
+ { url = "https://files.pythonhosted.org/packages/e8/31/aa8da88ca0eadbabd0a639788a6da13bb2ff6edbbb9f29aa786450a30a91/pandas-2.2.3-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f3a255b2c19987fbbe62a9dfd6cff7ff2aa9ccab3fc75218fd4b7530f01efa24", size = 12711809 },
+ { url = "https://files.pythonhosted.org/packages/ee/7c/c6dbdb0cb2a4344cacfb8de1c5808ca885b2e4dcfde8008266608f9372af/pandas-2.2.3-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:800250ecdadb6d9c78eae4990da62743b857b470883fa27f652db8bdde7f6659", size = 16356316 },
+ { url = "https://files.pythonhosted.org/packages/57/b7/8b757e7d92023b832869fa8881a992696a0bfe2e26f72c9ae9f255988d42/pandas-2.2.3-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:6374c452ff3ec675a8f46fd9ab25c4ad0ba590b71cf0656f8b6daa5202bca3fb", size = 14022055 },
+ { url = "https://files.pythonhosted.org/packages/3b/bc/4b18e2b8c002572c5a441a64826252ce5da2aa738855747247a971988043/pandas-2.2.3-cp313-cp313-win_amd64.whl", hash = "sha256:61c5ad4043f791b61dd4752191d9f07f0ae412515d59ba8f005832a532f8736d", size = 11481175 },
+ { url = "https://files.pythonhosted.org/packages/76/a3/a5d88146815e972d40d19247b2c162e88213ef51c7c25993942c39dbf41d/pandas-2.2.3-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:3b71f27954685ee685317063bf13c7709a7ba74fc996b84fc6821c59b0f06468", size = 12615650 },
+ { url = "https://files.pythonhosted.org/packages/9c/8c/f0fd18f6140ddafc0c24122c8a964e48294acc579d47def376fef12bcb4a/pandas-2.2.3-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:38cf8125c40dae9d5acc10fa66af8ea6fdf760b2714ee482ca691fc66e6fcb18", size = 11290177 },
+ { url = "https://files.pythonhosted.org/packages/ed/f9/e995754eab9c0f14c6777401f7eece0943840b7a9fc932221c19d1abee9f/pandas-2.2.3-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:ba96630bc17c875161df3818780af30e43be9b166ce51c9a18c1feae342906c2", size = 14651526 },
+ { url = "https://files.pythonhosted.org/packages/25/b0/98d6ae2e1abac4f35230aa756005e8654649d305df9a28b16b9ae4353bff/pandas-2.2.3-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1db71525a1538b30142094edb9adc10be3f3e176748cd7acc2240c2f2e5aa3a4", size = 11871013 },
+ { url = "https://files.pythonhosted.org/packages/cc/57/0f72a10f9db6a4628744c8e8f0df4e6e21de01212c7c981d31e50ffc8328/pandas-2.2.3-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:15c0e1e02e93116177d29ff83e8b1619c93ddc9c49083f237d4312337a61165d", size = 15711620 },
+ { url = "https://files.pythonhosted.org/packages/ab/5f/b38085618b950b79d2d9164a711c52b10aefc0ae6833b96f626b7021b2ed/pandas-2.2.3-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:ad5b65698ab28ed8d7f18790a0dc58005c7629f227be9ecc1072aa74c0c1d43a", size = 13098436 },
+]
+
+[[package]]
+name = "pathspec"
+version = "0.12.1"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/ca/bc/f35b8446f4531a7cb215605d100cd88b7ac6f44ab3fc94870c120ab3adbf/pathspec-0.12.1.tar.gz", hash = "sha256:a482d51503a1ab33b1c67a6c3813a26953dbdc71c31dacaef9a838c4e29f5712", size = 51043 }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/cc/20/ff623b09d963f88bfde16306a54e12ee5ea43e9b597108672ff3a408aad6/pathspec-0.12.1-py3-none-any.whl", hash = "sha256:a0d503e138a4c123b27490a4f7beda6a01c6f288df0e4a8b79c7eb0dc7b4cc08", size = 31191 },
+]
+
+[[package]]
+name = "platformdirs"
+version = "4.3.6"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/13/fc/128cc9cb8f03208bdbf93d3aa862e16d376844a14f9a0ce5cf4507372de4/platformdirs-4.3.6.tar.gz", hash = "sha256:357fb2acbc885b0419afd3ce3ed34564c13c9b95c89360cd9563f73aa5e2b907", size = 21302 }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/3c/a6/bc1012356d8ece4d66dd75c4b9fc6c1f6650ddd5991e421177d9f8f671be/platformdirs-4.3.6-py3-none-any.whl", hash = "sha256:73e575e1408ab8103900836b97580d5307456908a03e92031bab39e4554cc3fb", size = 18439 },
+]
+
+[[package]]
+name = "pluggy"
+version = "1.5.0"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/96/2d/02d4312c973c6050a18b314a5ad0b3210edb65a906f868e31c111dede4a6/pluggy-1.5.0.tar.gz", hash = "sha256:2cffa88e94fdc978c4c574f15f9e59b7f4201d439195c3715ca9e2486f1d0cf1", size = 67955 }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/88/5f/e351af9a41f866ac3f1fac4ca0613908d9a41741cfcf2228f4ad853b697d/pluggy-1.5.0-py3-none-any.whl", hash = "sha256:44e1ad92c8ca002de6377e165f3e0f1be63266ab4d554740532335b9d75ea669", size = 20556 },
+]
+
+[[package]]
+name = "propcache"
+version = "0.2.1"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/20/c8/2a13f78d82211490855b2fb303b6721348d0787fdd9a12ac46d99d3acde1/propcache-0.2.1.tar.gz", hash = "sha256:3f77ce728b19cb537714499928fe800c3dda29e8d9428778fc7c186da4c09a64", size = 41735 }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/4c/28/1d205fe49be8b1b4df4c50024e62480a442b1a7b818e734308bb0d17e7fb/propcache-0.2.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:081a430aa8d5e8876c6909b67bd2d937bfd531b0382d3fdedb82612c618bc41a", size = 79588 },
+ { url = "https://files.pythonhosted.org/packages/21/ee/fc4d893f8d81cd4971affef2a6cb542b36617cd1d8ce56b406112cb80bf7/propcache-0.2.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:d2ccec9ac47cf4e04897619c0e0c1a48c54a71bdf045117d3a26f80d38ab1fb0", size = 45825 },
+ { url = "https://files.pythonhosted.org/packages/4a/de/bbe712f94d088da1d237c35d735f675e494a816fd6f54e9db2f61ef4d03f/propcache-0.2.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:14d86fe14b7e04fa306e0c43cdbeebe6b2c2156a0c9ce56b815faacc193e320d", size = 45357 },
+ { url = "https://files.pythonhosted.org/packages/7f/14/7ae06a6cf2a2f1cb382586d5a99efe66b0b3d0c6f9ac2f759e6f7af9d7cf/propcache-0.2.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:049324ee97bb67285b49632132db351b41e77833678432be52bdd0289c0e05e4", size = 241869 },
+ { url = "https://files.pythonhosted.org/packages/cc/59/227a78be960b54a41124e639e2c39e8807ac0c751c735a900e21315f8c2b/propcache-0.2.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1cd9a1d071158de1cc1c71a26014dcdfa7dd3d5f4f88c298c7f90ad6f27bb46d", size = 247884 },
+ { url = "https://files.pythonhosted.org/packages/84/58/f62b4ffaedf88dc1b17f04d57d8536601e4e030feb26617228ef930c3279/propcache-0.2.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:98110aa363f1bb4c073e8dcfaefd3a5cea0f0834c2aab23dda657e4dab2f53b5", size = 248486 },
+ { url = "https://files.pythonhosted.org/packages/1c/07/ebe102777a830bca91bbb93e3479cd34c2ca5d0361b83be9dbd93104865e/propcache-0.2.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:647894f5ae99c4cf6bb82a1bb3a796f6e06af3caa3d32e26d2350d0e3e3faf24", size = 243649 },
+ { url = "https://files.pythonhosted.org/packages/ed/bc/4f7aba7f08f520376c4bb6a20b9a981a581b7f2e385fa0ec9f789bb2d362/propcache-0.2.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:bfd3223c15bebe26518d58ccf9a39b93948d3dcb3e57a20480dfdd315356baff", size = 229103 },
+ { url = "https://files.pythonhosted.org/packages/fe/d5/04ac9cd4e51a57a96f78795e03c5a0ddb8f23ec098b86f92de028d7f2a6b/propcache-0.2.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:d71264a80f3fcf512eb4f18f59423fe82d6e346ee97b90625f283df56aee103f", size = 226607 },
+ { url = "https://files.pythonhosted.org/packages/e3/f0/24060d959ea41d7a7cc7fdbf68b31852331aabda914a0c63bdb0e22e96d6/propcache-0.2.1-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:e73091191e4280403bde6c9a52a6999d69cdfde498f1fdf629105247599b57ec", size = 221153 },
+ { url = "https://files.pythonhosted.org/packages/77/a7/3ac76045a077b3e4de4859a0753010765e45749bdf53bd02bc4d372da1a0/propcache-0.2.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:3935bfa5fede35fb202c4b569bb9c042f337ca4ff7bd540a0aa5e37131659348", size = 222151 },
+ { url = "https://files.pythonhosted.org/packages/e7/af/5e29da6f80cebab3f5a4dcd2a3240e7f56f2c4abf51cbfcc99be34e17f0b/propcache-0.2.1-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:f508b0491767bb1f2b87fdfacaba5f7eddc2f867740ec69ece6d1946d29029a6", size = 233812 },
+ { url = "https://files.pythonhosted.org/packages/8c/89/ebe3ad52642cc5509eaa453e9f4b94b374d81bae3265c59d5c2d98efa1b4/propcache-0.2.1-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:1672137af7c46662a1c2be1e8dc78cb6d224319aaa40271c9257d886be4363a6", size = 238829 },
+ { url = "https://files.pythonhosted.org/packages/e9/2f/6b32f273fa02e978b7577159eae7471b3cfb88b48563b1c2578b2d7ca0bb/propcache-0.2.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:b74c261802d3d2b85c9df2dfb2fa81b6f90deeef63c2db9f0e029a3cac50b518", size = 230704 },
+ { url = "https://files.pythonhosted.org/packages/5c/2e/f40ae6ff5624a5f77edd7b8359b208b5455ea113f68309e2b00a2e1426b6/propcache-0.2.1-cp312-cp312-win32.whl", hash = "sha256:d09c333d36c1409d56a9d29b3a1b800a42c76a57a5a8907eacdbce3f18768246", size = 40050 },
+ { url = "https://files.pythonhosted.org/packages/3b/77/a92c3ef994e47180862b9d7d11e37624fb1c00a16d61faf55115d970628b/propcache-0.2.1-cp312-cp312-win_amd64.whl", hash = "sha256:c214999039d4f2a5b2073ac506bba279945233da8c786e490d411dfc30f855c1", size = 44117 },
+ { url = "https://files.pythonhosted.org/packages/0f/2a/329e0547cf2def8857157f9477669043e75524cc3e6251cef332b3ff256f/propcache-0.2.1-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:aca405706e0b0a44cc6bfd41fbe89919a6a56999157f6de7e182a990c36e37bc", size = 77002 },
+ { url = "https://files.pythonhosted.org/packages/12/2d/c4df5415e2382f840dc2ecbca0eeb2293024bc28e57a80392f2012b4708c/propcache-0.2.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:12d1083f001ace206fe34b6bdc2cb94be66d57a850866f0b908972f90996b3e9", size = 44639 },
+ { url = "https://files.pythonhosted.org/packages/d0/5a/21aaa4ea2f326edaa4e240959ac8b8386ea31dedfdaa636a3544d9e7a408/propcache-0.2.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:d93f3307ad32a27bda2e88ec81134b823c240aa3abb55821a8da553eed8d9439", size = 44049 },
+ { url = "https://files.pythonhosted.org/packages/4e/3e/021b6cd86c0acc90d74784ccbb66808b0bd36067a1bf3e2deb0f3845f618/propcache-0.2.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ba278acf14471d36316159c94a802933d10b6a1e117b8554fe0d0d9b75c9d536", size = 224819 },
+ { url = "https://files.pythonhosted.org/packages/3c/57/c2fdeed1b3b8918b1770a133ba5c43ad3d78e18285b0c06364861ef5cc38/propcache-0.2.1-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4e6281aedfca15301c41f74d7005e6e3f4ca143584ba696ac69df4f02f40d629", size = 229625 },
+ { url = "https://files.pythonhosted.org/packages/9d/81/70d4ff57bf2877b5780b466471bebf5892f851a7e2ca0ae7ffd728220281/propcache-0.2.1-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5b750a8e5a1262434fb1517ddf64b5de58327f1adc3524a5e44c2ca43305eb0b", size = 232934 },
+ { url = "https://files.pythonhosted.org/packages/3c/b9/bb51ea95d73b3fb4100cb95adbd4e1acaf2cbb1fd1083f5468eeb4a099a8/propcache-0.2.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bf72af5e0fb40e9babf594308911436c8efde3cb5e75b6f206c34ad18be5c052", size = 227361 },
+ { url = "https://files.pythonhosted.org/packages/f1/20/3c6d696cd6fd70b29445960cc803b1851a1131e7a2e4ee261ee48e002bcd/propcache-0.2.1-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b2d0a12018b04f4cb820781ec0dffb5f7c7c1d2a5cd22bff7fb055a2cb19ebce", size = 213904 },
+ { url = "https://files.pythonhosted.org/packages/a1/cb/1593bfc5ac6d40c010fa823f128056d6bc25b667f5393781e37d62f12005/propcache-0.2.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:e800776a79a5aabdb17dcc2346a7d66d0777e942e4cd251defeb084762ecd17d", size = 212632 },
+ { url = "https://files.pythonhosted.org/packages/6d/5c/e95617e222be14a34c709442a0ec179f3207f8a2b900273720501a70ec5e/propcache-0.2.1-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:4160d9283bd382fa6c0c2b5e017acc95bc183570cd70968b9202ad6d8fc48dce", size = 207897 },
+ { url = "https://files.pythonhosted.org/packages/8e/3b/56c5ab3dc00f6375fbcdeefdede5adf9bee94f1fab04adc8db118f0f9e25/propcache-0.2.1-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:30b43e74f1359353341a7adb783c8f1b1c676367b011709f466f42fda2045e95", size = 208118 },
+ { url = "https://files.pythonhosted.org/packages/86/25/d7ef738323fbc6ebcbce33eb2a19c5e07a89a3df2fded206065bd5e868a9/propcache-0.2.1-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:58791550b27d5488b1bb52bc96328456095d96206a250d28d874fafe11b3dfaf", size = 217851 },
+ { url = "https://files.pythonhosted.org/packages/b3/77/763e6cef1852cf1ba740590364ec50309b89d1c818e3256d3929eb92fabf/propcache-0.2.1-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:0f022d381747f0dfe27e99d928e31bc51a18b65bb9e481ae0af1380a6725dd1f", size = 222630 },
+ { url = "https://files.pythonhosted.org/packages/4f/e9/0f86be33602089c701696fbed8d8c4c07b6ee9605c5b7536fd27ed540c5b/propcache-0.2.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:297878dc9d0a334358f9b608b56d02e72899f3b8499fc6044133f0d319e2ec30", size = 216269 },
+ { url = "https://files.pythonhosted.org/packages/cc/02/5ac83217d522394b6a2e81a2e888167e7ca629ef6569a3f09852d6dcb01a/propcache-0.2.1-cp313-cp313-win32.whl", hash = "sha256:ddfab44e4489bd79bda09d84c430677fc7f0a4939a73d2bba3073036f487a0a6", size = 39472 },
+ { url = "https://files.pythonhosted.org/packages/f4/33/d6f5420252a36034bc8a3a01171bc55b4bff5df50d1c63d9caa50693662f/propcache-0.2.1-cp313-cp313-win_amd64.whl", hash = "sha256:556fc6c10989f19a179e4321e5d678db8eb2924131e64652a51fe83e4c3db0e1", size = 43363 },
+ { url = "https://files.pythonhosted.org/packages/41/b6/c5319caea262f4821995dca2107483b94a3345d4607ad797c76cb9c36bcc/propcache-0.2.1-py3-none-any.whl", hash = "sha256:52277518d6aae65536e9cea52d4e7fd2f7a66f4aa2d30ed3f2fcea620ace3c54", size = 11818 },
+]
+
+[[package]]
+name = "pydantic"
+version = "2.10.6"
+source = { registry = "https://pypi.org/simple" }
+dependencies = [
+ { name = "annotated-types" },
+ { name = "pydantic-core" },
+ { name = "typing-extensions" },
+]
+sdist = { url = "https://files.pythonhosted.org/packages/b7/ae/d5220c5c52b158b1de7ca89fc5edb72f304a70a4c540c84c8844bf4008de/pydantic-2.10.6.tar.gz", hash = "sha256:ca5daa827cce33de7a42be142548b0096bf05a7e7b365aebfa5f8eeec7128236", size = 761681 }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/f4/3c/8cc1cc84deffa6e25d2d0c688ebb80635dfdbf1dbea3e30c541c8cf4d860/pydantic-2.10.6-py3-none-any.whl", hash = "sha256:427d664bf0b8a2b34ff5dd0f5a18df00591adcee7198fbd71981054cef37b584", size = 431696 },
+]
+
+[[package]]
+name = "pydantic-core"
+version = "2.27.2"
+source = { registry = "https://pypi.org/simple" }
+dependencies = [
+ { name = "typing-extensions" },
+]
+sdist = { url = "https://files.pythonhosted.org/packages/fc/01/f3e5ac5e7c25833db5eb555f7b7ab24cd6f8c322d3a3ad2d67a952dc0abc/pydantic_core-2.27.2.tar.gz", hash = "sha256:eb026e5a4c1fee05726072337ff51d1efb6f59090b7da90d30ea58625b1ffb39", size = 413443 }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/d6/74/51c8a5482ca447871c93e142d9d4a92ead74de6c8dc5e66733e22c9bba89/pydantic_core-2.27.2-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:9e0c8cfefa0ef83b4da9588448b6d8d2a2bf1a53c3f1ae5fca39eb3061e2f0b0", size = 1893127 },
+ { url = "https://files.pythonhosted.org/packages/d3/f3/c97e80721735868313c58b89d2de85fa80fe8dfeeed84dc51598b92a135e/pydantic_core-2.27.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:83097677b8e3bd7eaa6775720ec8e0405f1575015a463285a92bfdfe254529ef", size = 1811340 },
+ { url = "https://files.pythonhosted.org/packages/9e/91/840ec1375e686dbae1bd80a9e46c26a1e0083e1186abc610efa3d9a36180/pydantic_core-2.27.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:172fce187655fece0c90d90a678424b013f8fbb0ca8b036ac266749c09438cb7", size = 1822900 },
+ { url = "https://files.pythonhosted.org/packages/f6/31/4240bc96025035500c18adc149aa6ffdf1a0062a4b525c932065ceb4d868/pydantic_core-2.27.2-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:519f29f5213271eeeeb3093f662ba2fd512b91c5f188f3bb7b27bc5973816934", size = 1869177 },
+ { url = "https://files.pythonhosted.org/packages/fa/20/02fbaadb7808be578317015c462655c317a77a7c8f0ef274bc016a784c54/pydantic_core-2.27.2-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:05e3a55d124407fffba0dd6b0c0cd056d10e983ceb4e5dbd10dda135c31071d6", size = 2038046 },
+ { url = "https://files.pythonhosted.org/packages/06/86/7f306b904e6c9eccf0668248b3f272090e49c275bc488a7b88b0823444a4/pydantic_core-2.27.2-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9c3ed807c7b91de05e63930188f19e921d1fe90de6b4f5cd43ee7fcc3525cb8c", size = 2685386 },
+ { url = "https://files.pythonhosted.org/packages/8d/f0/49129b27c43396581a635d8710dae54a791b17dfc50c70164866bbf865e3/pydantic_core-2.27.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6fb4aadc0b9a0c063206846d603b92030eb6f03069151a625667f982887153e2", size = 1997060 },
+ { url = "https://files.pythonhosted.org/packages/0d/0f/943b4af7cd416c477fd40b187036c4f89b416a33d3cc0ab7b82708a667aa/pydantic_core-2.27.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:28ccb213807e037460326424ceb8b5245acb88f32f3d2777427476e1b32c48c4", size = 2004870 },
+ { url = "https://files.pythonhosted.org/packages/35/40/aea70b5b1a63911c53a4c8117c0a828d6790483f858041f47bab0b779f44/pydantic_core-2.27.2-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:de3cd1899e2c279b140adde9357c4495ed9d47131b4a4eaff9052f23398076b3", size = 1999822 },
+ { url = "https://files.pythonhosted.org/packages/f2/b3/807b94fd337d58effc5498fd1a7a4d9d59af4133e83e32ae39a96fddec9d/pydantic_core-2.27.2-cp312-cp312-musllinux_1_1_armv7l.whl", hash = "sha256:220f892729375e2d736b97d0e51466252ad84c51857d4d15f5e9692f9ef12be4", size = 2130364 },
+ { url = "https://files.pythonhosted.org/packages/fc/df/791c827cd4ee6efd59248dca9369fb35e80a9484462c33c6649a8d02b565/pydantic_core-2.27.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:a0fcd29cd6b4e74fe8ddd2c90330fd8edf2e30cb52acda47f06dd615ae72da57", size = 2158303 },
+ { url = "https://files.pythonhosted.org/packages/9b/67/4e197c300976af185b7cef4c02203e175fb127e414125916bf1128b639a9/pydantic_core-2.27.2-cp312-cp312-win32.whl", hash = "sha256:1e2cb691ed9834cd6a8be61228471d0a503731abfb42f82458ff27be7b2186fc", size = 1834064 },
+ { url = "https://files.pythonhosted.org/packages/1f/ea/cd7209a889163b8dcca139fe32b9687dd05249161a3edda62860430457a5/pydantic_core-2.27.2-cp312-cp312-win_amd64.whl", hash = "sha256:cc3f1a99a4f4f9dd1de4fe0312c114e740b5ddead65bb4102884b384c15d8bc9", size = 1989046 },
+ { url = "https://files.pythonhosted.org/packages/bc/49/c54baab2f4658c26ac633d798dab66b4c3a9bbf47cff5284e9c182f4137a/pydantic_core-2.27.2-cp312-cp312-win_arm64.whl", hash = "sha256:3911ac9284cd8a1792d3cb26a2da18f3ca26c6908cc434a18f730dc0db7bfa3b", size = 1885092 },
+ { url = "https://files.pythonhosted.org/packages/41/b1/9bc383f48f8002f99104e3acff6cba1231b29ef76cfa45d1506a5cad1f84/pydantic_core-2.27.2-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:7d14bd329640e63852364c306f4d23eb744e0f8193148d4044dd3dacdaacbd8b", size = 1892709 },
+ { url = "https://files.pythonhosted.org/packages/10/6c/e62b8657b834f3eb2961b49ec8e301eb99946245e70bf42c8817350cbefc/pydantic_core-2.27.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:82f91663004eb8ed30ff478d77c4d1179b3563df6cdb15c0817cd1cdaf34d154", size = 1811273 },
+ { url = "https://files.pythonhosted.org/packages/ba/15/52cfe49c8c986e081b863b102d6b859d9defc63446b642ccbbb3742bf371/pydantic_core-2.27.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:71b24c7d61131bb83df10cc7e687433609963a944ccf45190cfc21e0887b08c9", size = 1823027 },
+ { url = "https://files.pythonhosted.org/packages/b1/1c/b6f402cfc18ec0024120602bdbcebc7bdd5b856528c013bd4d13865ca473/pydantic_core-2.27.2-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:fa8e459d4954f608fa26116118bb67f56b93b209c39b008277ace29937453dc9", size = 1868888 },
+ { url = "https://files.pythonhosted.org/packages/bd/7b/8cb75b66ac37bc2975a3b7de99f3c6f355fcc4d89820b61dffa8f1e81677/pydantic_core-2.27.2-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ce8918cbebc8da707ba805b7fd0b382816858728ae7fe19a942080c24e5b7cd1", size = 2037738 },
+ { url = "https://files.pythonhosted.org/packages/c8/f1/786d8fe78970a06f61df22cba58e365ce304bf9b9f46cc71c8c424e0c334/pydantic_core-2.27.2-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:eda3f5c2a021bbc5d976107bb302e0131351c2ba54343f8a496dc8783d3d3a6a", size = 2685138 },
+ { url = "https://files.pythonhosted.org/packages/a6/74/d12b2cd841d8724dc8ffb13fc5cef86566a53ed358103150209ecd5d1999/pydantic_core-2.27.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bd8086fa684c4775c27f03f062cbb9eaa6e17f064307e86b21b9e0abc9c0f02e", size = 1997025 },
+ { url = "https://files.pythonhosted.org/packages/a0/6e/940bcd631bc4d9a06c9539b51f070b66e8f370ed0933f392db6ff350d873/pydantic_core-2.27.2-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:8d9b3388db186ba0c099a6d20f0604a44eabdeef1777ddd94786cdae158729e4", size = 2004633 },
+ { url = "https://files.pythonhosted.org/packages/50/cc/a46b34f1708d82498c227d5d80ce615b2dd502ddcfd8376fc14a36655af1/pydantic_core-2.27.2-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:7a66efda2387de898c8f38c0cf7f14fca0b51a8ef0b24bfea5849f1b3c95af27", size = 1999404 },
+ { url = "https://files.pythonhosted.org/packages/ca/2d/c365cfa930ed23bc58c41463bae347d1005537dc8db79e998af8ba28d35e/pydantic_core-2.27.2-cp313-cp313-musllinux_1_1_armv7l.whl", hash = "sha256:18a101c168e4e092ab40dbc2503bdc0f62010e95d292b27827871dc85450d7ee", size = 2130130 },
+ { url = "https://files.pythonhosted.org/packages/f4/d7/eb64d015c350b7cdb371145b54d96c919d4db516817f31cd1c650cae3b21/pydantic_core-2.27.2-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:ba5dd002f88b78a4215ed2f8ddbdf85e8513382820ba15ad5ad8955ce0ca19a1", size = 2157946 },
+ { url = "https://files.pythonhosted.org/packages/a4/99/bddde3ddde76c03b65dfd5a66ab436c4e58ffc42927d4ff1198ffbf96f5f/pydantic_core-2.27.2-cp313-cp313-win32.whl", hash = "sha256:1ebaf1d0481914d004a573394f4be3a7616334be70261007e47c2a6fe7e50130", size = 1834387 },
+ { url = "https://files.pythonhosted.org/packages/71/47/82b5e846e01b26ac6f1893d3c5f9f3a2eb6ba79be26eef0b759b4fe72946/pydantic_core-2.27.2-cp313-cp313-win_amd64.whl", hash = "sha256:953101387ecf2f5652883208769a79e48db18c6df442568a0b5ccd8c2723abee", size = 1990453 },
+ { url = "https://files.pythonhosted.org/packages/51/b2/b2b50d5ecf21acf870190ae5d093602d95f66c9c31f9d5de6062eb329ad1/pydantic_core-2.27.2-cp313-cp313-win_arm64.whl", hash = "sha256:ac4dbfd1691affb8f48c2c13241a2e3b60ff23247cbcf981759c768b6633cf8b", size = 1885186 },
+]
+
+[[package]]
+name = "pydantic-settings"
+version = "2.7.1"
+source = { registry = "https://pypi.org/simple" }
+dependencies = [
+ { name = "pydantic" },
+ { name = "python-dotenv" },
+]
+sdist = { url = "https://files.pythonhosted.org/packages/73/7b/c58a586cd7d9ac66d2ee4ba60ca2d241fa837c02bca9bea80a9a8c3d22a9/pydantic_settings-2.7.1.tar.gz", hash = "sha256:10c9caad35e64bfb3c2fbf70a078c0e25cc92499782e5200747f942a065dec93", size = 79920 }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/b4/46/93416fdae86d40879714f72956ac14df9c7b76f7d41a4d68aa9f71a0028b/pydantic_settings-2.7.1-py3-none-any.whl", hash = "sha256:590be9e6e24d06db33a4262829edef682500ef008565a969c73d39d5f8bfb3fd", size = 29718 },
+]
+
+[[package]]
+name = "pytest"
+version = "8.3.4"
+source = { registry = "https://pypi.org/simple" }
+dependencies = [
+ { name = "colorama", marker = "sys_platform == 'win32'" },
+ { name = "iniconfig" },
+ { name = "packaging" },
+ { name = "pluggy" },
+]
+sdist = { url = "https://files.pythonhosted.org/packages/05/35/30e0d83068951d90a01852cb1cef56e5d8a09d20c7f511634cc2f7e0372a/pytest-8.3.4.tar.gz", hash = "sha256:965370d062bce11e73868e0335abac31b4d3de0e82f4007408d242b4f8610761", size = 1445919 }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/11/92/76a1c94d3afee238333bc0a42b82935dd8f9cf8ce9e336ff87ee14d9e1cf/pytest-8.3.4-py3-none-any.whl", hash = "sha256:50e16d954148559c9a74109af1eaf0c945ba2d8f30f0a3d3335edde19788b6f6", size = 343083 },
+]
+
+[[package]]
+name = "pytest-assertcount"
+version = "1.0.0"
+source = { registry = "https://pypi.org/simple" }
+dependencies = [
+ { name = "pytest" },
+]
+sdist = { url = "https://files.pythonhosted.org/packages/84/9f/e6eee30903096887e2fa359163a4ed0969dfd81b301400f5c46fe3e99a41/pytest-assertcount-1.0.0.tar.gz", hash = "sha256:e8271a284e337f89a28789790e68faa18ab8d5e1ca9aad5bd439a672b836a76b", size = 2652 }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/61/8d/4415383d305c7d79271e8e349dedc62d7a2a00f997d894b12a18b3ec487a/pytest_assertcount-1.0.0-py3-none-any.whl", hash = "sha256:08a2945248f666787ee1413736fff91875e355aee23bf03900d1438bd4bf81ec", size = 3287 },
+]
+
+[[package]]
+name = "python-dateutil"
+version = "2.9.0.post0"
+source = { registry = "https://pypi.org/simple" }
+dependencies = [
+ { name = "six" },
+]
+sdist = { url = "https://files.pythonhosted.org/packages/66/c0/0c8b6ad9f17a802ee498c46e004a0eb49bc148f2fd230864601a86dcf6db/python-dateutil-2.9.0.post0.tar.gz", hash = "sha256:37dd54208da7e1cd875388217d5e00ebd4179249f90fb72437e91a35459a0ad3", size = 342432 }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/ec/57/56b9bcc3c9c6a792fcbaf139543cee77261f3651ca9da0c93f5c1221264b/python_dateutil-2.9.0.post0-py2.py3-none-any.whl", hash = "sha256:a8b2bc7bffae282281c8140a97d3aa9c14da0b136dfe83f850eea9a5f7470427", size = 229892 },
+]
+
+[[package]]
+name = "python-dotenv"
+version = "1.0.1"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/bc/57/e84d88dfe0aec03b7a2d4327012c1627ab5f03652216c63d49846d7a6c58/python-dotenv-1.0.1.tar.gz", hash = "sha256:e324ee90a023d808f1959c46bcbc04446a10ced277783dc6ee09987c37ec10ca", size = 39115 }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/6a/3e/b68c118422ec867fa7ab88444e1274aa40681c606d59ac27de5a5588f082/python_dotenv-1.0.1-py3-none-any.whl", hash = "sha256:f7b63ef50f1b690dddf550d03497b66d609393b40b564ed0d674909a68ebf16a", size = 19863 },
+]
+
+[[package]]
+name = "python-levenshtein"
+version = "0.26.1"
+source = { registry = "https://pypi.org/simple" }
+dependencies = [
+ { name = "levenshtein" },
+]
+sdist = { url = "https://files.pythonhosted.org/packages/31/72/58d77cb80b3c130d94f53a8204ffad9acfddb925b2fb5818ff9af0b3c832/python_levenshtein-0.26.1.tar.gz", hash = "sha256:24ba578e28058ebb4afa2700057e1678d7adf27e43cd1f17700c09a9009d5d3a", size = 12276 }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/0f/d7/03e0453719ed89724664f781f0255949408118093dbf77a2aa2a1198b38e/python_Levenshtein-0.26.1-py3-none-any.whl", hash = "sha256:8ef5e529dd640fb00f05ee62d998d2ee862f19566b641ace775d5ae16167b2ef", size = 9426 },
+]
+
+[[package]]
+name = "pytz"
+version = "2025.1"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/5f/57/df1c9157c8d5a05117e455d66fd7cf6dbc46974f832b1058ed4856785d8a/pytz-2025.1.tar.gz", hash = "sha256:c2db42be2a2518b28e65f9207c4d05e6ff547d1efa4086469ef855e4ab70178e", size = 319617 }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/eb/38/ac33370d784287baa1c3d538978b5e2ea064d4c1b93ffbd12826c190dd10/pytz-2025.1-py2.py3-none-any.whl", hash = "sha256:89dd22dca55b46eac6eda23b2d72721bf1bdfef212645d81513ef5d03038de57", size = 507930 },
+]
+
+[[package]]
+name = "rapidfuzz"
+version = "3.12.1"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/c9/df/c300ead8c2962f54ad87872e6372a6836f0181a7f20b433c987bd106bfce/rapidfuzz-3.12.1.tar.gz", hash = "sha256:6a98bbca18b4a37adddf2d8201856441c26e9c981d8895491b5bc857b5f780eb", size = 57907552 }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/1a/20/6049061411df87f2814a2677db0f15e673bb9795bfeff57dc9708121374d/rapidfuzz-3.12.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:f6235b57ae3faa3f85cb3f90c9fee49b21bd671b76e90fc99e8ca2bdf0b5e4a3", size = 1944328 },
+ { url = "https://files.pythonhosted.org/packages/25/73/199383c4c21ae3b4b6ea6951c6896ab38e9dc96942462fa01f9d3fb047da/rapidfuzz-3.12.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:af4585e5812632c357fee5ab781c29f00cd06bea58f8882ff244cc4906ba6c9e", size = 1430203 },
+ { url = "https://files.pythonhosted.org/packages/7b/51/77ebaeec5413c53c3e6d8b800f2b979551adbed7b5efa094d1fad5c5b751/rapidfuzz-3.12.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5942dc4460e5030c5f9e1d4c9383de2f3564a2503fe25e13e89021bcbfea2f44", size = 1403662 },
+ { url = "https://files.pythonhosted.org/packages/54/06/1fadd2704db0a7eecf78de812e2f4fab37c4ae105a5ce4578c9fc66bb0c5/rapidfuzz-3.12.1-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0b31ab59e1a0df5afc21f3109b6cfd77b34040dbf54f1bad3989f885cfae1e60", size = 5555849 },
+ { url = "https://files.pythonhosted.org/packages/19/45/da128c3952bd09cef2935df58db5273fc4eb67f04a69dcbf9e25af9e4432/rapidfuzz-3.12.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:97c885a7a480b21164f57a706418c9bbc9a496ec6da087e554424358cadde445", size = 1655273 },
+ { url = "https://files.pythonhosted.org/packages/03/ee/bf2b2a95b5af4e6d36105dd9284dc5335fdcc7f0326186d4ab0b5aa4721e/rapidfuzz-3.12.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2d844c0587d969ce36fbf4b7cbf0860380ffeafc9ac5e17a7cbe8abf528d07bb", size = 1678041 },
+ { url = "https://files.pythonhosted.org/packages/7f/4f/36ea4d7f306a23e30ea1a6cabf545d2a794e8ca9603d2ee48384314cde3a/rapidfuzz-3.12.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a93c95dce8917bf428064c64024de43ffd34ec5949dd4425780c72bd41f9d969", size = 3137099 },
+ { url = "https://files.pythonhosted.org/packages/70/ef/48195d94b018e7340a60c9a642ab0081bf9dc64fb0bd01dfafd93757d2a2/rapidfuzz-3.12.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:834f6113d538af358f39296604a1953e55f8eeffc20cb4caf82250edbb8bf679", size = 2307388 },
+ { url = "https://files.pythonhosted.org/packages/e5/cd/53d5dbc4791df3e1a8640fc4ad5e328ebb040cc01c10c66f891aa6b83ed5/rapidfuzz-3.12.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:a940aa71a7f37d7f0daac186066bf6668d4d3b7e7ef464cb50bc7ba89eae1f51", size = 6906504 },
+ { url = "https://files.pythonhosted.org/packages/1b/99/c27e7db1d49cfd77780cb73978f81092682c2bdbc6de75363df6aaa086d6/rapidfuzz-3.12.1-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:ec9eaf73501c9a7de2c6938cb3050392e2ee0c5ca3921482acf01476b85a7226", size = 2684757 },
+ { url = "https://files.pythonhosted.org/packages/02/8c/2474d6282fdd4aae386a6b16272e544a3f9ea2dcdcf2f3b0b286549bc3d5/rapidfuzz-3.12.1-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:3c5ec360694ac14bfaeb6aea95737cf1a6cf805b5fe8ea7fd28814706c7fa838", size = 3229940 },
+ { url = "https://files.pythonhosted.org/packages/ac/27/95d5a8ebe5fcc5462dd0fd265553c8a2ec4a770e079afabcff978442bcb3/rapidfuzz-3.12.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:6b5e176524653ac46f1802bdd273a4b44a5f8d0054ed5013a8e8a4b72f254599", size = 4148489 },
+ { url = "https://files.pythonhosted.org/packages/8d/2c/e509bc24b6514de4d6f2c5480201568e1d9a3c7e4692cc969ef899227ba5/rapidfuzz-3.12.1-cp312-cp312-win32.whl", hash = "sha256:6f463c6f1c42ec90e45d12a6379e18eddd5cdf74138804d8215619b6f4d31cea", size = 1834110 },
+ { url = "https://files.pythonhosted.org/packages/cc/ab/900b8d57090b30269258e3ae31752ec9c31042cd58660fcc96d50728487d/rapidfuzz-3.12.1-cp312-cp312-win_amd64.whl", hash = "sha256:b894fa2b30cd6498a29e5c470cb01c6ea898540b7e048a0342775a5000531334", size = 1612461 },
+ { url = "https://files.pythonhosted.org/packages/a0/df/3f51a0a277185b3f28b2941e071aff62908a6b81527efc67a643bcb59fb8/rapidfuzz-3.12.1-cp312-cp312-win_arm64.whl", hash = "sha256:43bb17056c5d1332f517b888c4e57846c4b5f936ed304917eeb5c9ac85d940d4", size = 864251 },
+ { url = "https://files.pythonhosted.org/packages/62/d2/ceebc2446d1f3d3f2cae2597116982e50c2eed9ff2f5a322a51736981405/rapidfuzz-3.12.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:97f824c15bc6933a31d6e3cbfa90188ba0e5043cf2b6dd342c2b90ee8b3fd47c", size = 1936794 },
+ { url = "https://files.pythonhosted.org/packages/88/38/37f7ea800aa959a4f7a63477fc9ad7f3cd024e46bfadce5d23420af6c7e5/rapidfuzz-3.12.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:a973b3f5cabf931029a3ae4a0f72e3222e53d412ea85fc37ddc49e1774f00fbf", size = 1424155 },
+ { url = "https://files.pythonhosted.org/packages/3f/14/409d0aa84430451488177fcc5cba8babcdf5a45cee772a2a265b9b5f4c7e/rapidfuzz-3.12.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:df7880e012228722dec1be02b9ef3898ed023388b8a24d6fa8213d7581932510", size = 1398013 },
+ { url = "https://files.pythonhosted.org/packages/4b/2c/601e3ad0bbe61e65f99e72c8cefed9713606cf4b297cc4c3876051db7722/rapidfuzz-3.12.1-cp313-cp313-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9c78582f50e75e6c2bc38c791ed291cb89cf26a3148c47860c1a04d6e5379c8e", size = 5526157 },
+ { url = "https://files.pythonhosted.org/packages/97/ce/deb7b00ce6e06713fc4df81336402b7fa062f2393c8a47401c228ee906c3/rapidfuzz-3.12.1-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2d7d9e6a04d8344b0198c96394c28874086888d0a2b2f605f30d1b27b9377b7d", size = 1648446 },
+ { url = "https://files.pythonhosted.org/packages/ec/6f/2b8eae1748a022290815999594b438dbc1e072c38c76178ea996920a6253/rapidfuzz-3.12.1-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5620001fd4d6644a2f56880388179cc8f3767670f0670160fcb97c3b46c828af", size = 1676038 },
+ { url = "https://files.pythonhosted.org/packages/b9/6c/5c831197aca7148ed85c86bbe940e66073fea0fa97f30307bb5850ed8858/rapidfuzz-3.12.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0666ab4c52e500af7ba5cc17389f5d15c0cdad06412c80312088519fdc25686d", size = 3114137 },
+ { url = "https://files.pythonhosted.org/packages/fc/f2/d66ac185eeb0ee3fc0fe208dab1e72feece2c883bc0ab2097570a8159a7b/rapidfuzz-3.12.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:27b4d440fa50b50c515a91a01ee17e8ede719dca06eef4c0cccf1a111a4cfad3", size = 2305754 },
+ { url = "https://files.pythonhosted.org/packages/6c/61/9bf74d7ea9bebc7a1bed707591617bba7901fce414d346a7c5532ef02dbd/rapidfuzz-3.12.1-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:83dccfd5a754f2a0e8555b23dde31f0f7920601bfa807aa76829391ea81e7c67", size = 6901746 },
+ { url = "https://files.pythonhosted.org/packages/81/73/d8dddf73e168f723ef21272e8abb7d34d9244da395eb90ed5a617f870678/rapidfuzz-3.12.1-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:b572b634740e047c53743ed27a1bb3b4f93cf4abbac258cd7af377b2c4a9ba5b", size = 2673947 },
+ { url = "https://files.pythonhosted.org/packages/2e/31/3c473cea7d76af162819a5b84f5e7bdcf53b9e19568fc37cfbdab4f4512a/rapidfuzz-3.12.1-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:7fa7b81fb52902d5f78dac42b3d6c835a6633b01ddf9b202a3ca8443be4b2d6a", size = 3233070 },
+ { url = "https://files.pythonhosted.org/packages/c0/b7/73227dcbf8586f0ca4a77be2720311367288e2db142ae00a1404f42e712d/rapidfuzz-3.12.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:b1d4fbff980cb6baef4ee675963c081f7b5d6580a105d6a4962b20f1f880e1fb", size = 4146828 },
+ { url = "https://files.pythonhosted.org/packages/3a/c8/fea749c662e268d348a77501995b51ac95cdc3624f3f95ba261f30b000ff/rapidfuzz-3.12.1-cp313-cp313-win32.whl", hash = "sha256:3fe8da12ea77271097b303fa7624cfaf5afd90261002314e3b0047d36f4afd8d", size = 1831797 },
+ { url = "https://files.pythonhosted.org/packages/66/18/11052be5984d9972eb04a52e2931e19e95b2e87731d179f60b79707b7efd/rapidfuzz-3.12.1-cp313-cp313-win_amd64.whl", hash = "sha256:6f7e92fc7d2a7f02e1e01fe4f539324dfab80f27cb70a30dd63a95445566946b", size = 1610169 },
+ { url = "https://files.pythonhosted.org/packages/db/c1/66427c618f000298edbd24e46dd3dd2d3fa441a602701ba6a260d41dd62b/rapidfuzz-3.12.1-cp313-cp313-win_arm64.whl", hash = "sha256:e31be53d7f4905a6a038296d8b773a79da9ee9f0cd19af9490c5c5a22e37d2e5", size = 863036 },
+]
+
+[[package]]
+name = "requests"
+version = "2.32.3"
+source = { registry = "https://pypi.org/simple" }
+dependencies = [
+ { name = "certifi" },
+ { name = "charset-normalizer" },
+ { name = "idna" },
+ { name = "urllib3" },
+]
+sdist = { url = "https://files.pythonhosted.org/packages/63/70/2bf7780ad2d390a8d301ad0b550f1581eadbd9a20f896afe06353c2a2913/requests-2.32.3.tar.gz", hash = "sha256:55365417734eb18255590a9ff9eb97e9e1da868d4ccd6402399eaf68af20a760", size = 131218 }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/f9/9b/335f9764261e915ed497fcdeb11df5dfd6f7bf257d4a6a2a686d80da4d54/requests-2.32.3-py3-none-any.whl", hash = "sha256:70761cfe03c773ceb22aa2f671b4757976145175cdfca038c02654d061d6dcc6", size = 64928 },
+]
+
+[[package]]
+name = "requests-toolbelt"
+version = "1.0.0"
+source = { registry = "https://pypi.org/simple" }
+dependencies = [
+ { name = "requests" },
+]
+sdist = { url = "https://files.pythonhosted.org/packages/f3/61/d7545dafb7ac2230c70d38d31cbfe4cc64f7144dc41f6e4e4b78ecd9f5bb/requests-toolbelt-1.0.0.tar.gz", hash = "sha256:7681a0a3d047012b5bdc0ee37d7f8f07ebe76ab08caeccfc3921ce23c88d5bc6", size = 206888 }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/3f/51/d4db610ef29373b879047326cbf6fa98b6c1969d6f6dc423279de2b1be2c/requests_toolbelt-1.0.0-py2.py3-none-any.whl", hash = "sha256:cccfdd665f0a24fcf4726e690f65639d272bb0637b9b92dfd91a5568ccf6bd06", size = 54481 },
+]
+
+[[package]]
+name = "ruff"
+version = "0.9.6"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/2a/e1/e265aba384343dd8ddd3083f5e33536cd17e1566c41453a5517b5dd443be/ruff-0.9.6.tar.gz", hash = "sha256:81761592f72b620ec8fa1068a6fd00e98a5ebee342a3642efd84454f3031dca9", size = 3639454 }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/76/e3/3d2c022e687e18cf5d93d6bfa2722d46afc64eaa438c7fbbdd603b3597be/ruff-0.9.6-py3-none-linux_armv6l.whl", hash = "sha256:2f218f356dd2d995839f1941322ff021c72a492c470f0b26a34f844c29cdf5ba", size = 11714128 },
+ { url = "https://files.pythonhosted.org/packages/e1/22/aff073b70f95c052e5c58153cba735748c9e70107a77d03420d7850710a0/ruff-0.9.6-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:b908ff4df65dad7b251c9968a2e4560836d8f5487c2f0cc238321ed951ea0504", size = 11682539 },
+ { url = "https://files.pythonhosted.org/packages/75/a7/f5b7390afd98a7918582a3d256cd3e78ba0a26165a467c1820084587cbf9/ruff-0.9.6-py3-none-macosx_11_0_arm64.whl", hash = "sha256:b109c0ad2ececf42e75fa99dc4043ff72a357436bb171900714a9ea581ddef83", size = 11132512 },
+ { url = "https://files.pythonhosted.org/packages/a6/e3/45de13ef65047fea2e33f7e573d848206e15c715e5cd56095589a7733d04/ruff-0.9.6-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1de4367cca3dac99bcbd15c161404e849bb0bfd543664db39232648dc00112dc", size = 11929275 },
+ { url = "https://files.pythonhosted.org/packages/7d/f2/23d04cd6c43b2e641ab961ade8d0b5edb212ecebd112506188c91f2a6e6c/ruff-0.9.6-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:ac3ee4d7c2c92ddfdaedf0bf31b2b176fa7aa8950efc454628d477394d35638b", size = 11466502 },
+ { url = "https://files.pythonhosted.org/packages/b5/6f/3a8cf166f2d7f1627dd2201e6cbc4cb81f8b7d58099348f0c1ff7b733792/ruff-0.9.6-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5dc1edd1775270e6aa2386119aea692039781429f0be1e0949ea5884e011aa8e", size = 12676364 },
+ { url = "https://files.pythonhosted.org/packages/f5/c4/db52e2189983c70114ff2b7e3997e48c8318af44fe83e1ce9517570a50c6/ruff-0.9.6-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:4a091729086dffa4bd070aa5dab7e39cc6b9d62eb2bef8f3d91172d30d599666", size = 13335518 },
+ { url = "https://files.pythonhosted.org/packages/66/44/545f8a4d136830f08f4d24324e7db957c5374bf3a3f7a6c0bc7be4623a37/ruff-0.9.6-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d1bbc6808bf7b15796cef0815e1dfb796fbd383e7dbd4334709642649625e7c5", size = 12823287 },
+ { url = "https://files.pythonhosted.org/packages/c5/26/8208ef9ee7431032c143649a9967c3ae1aae4257d95e6f8519f07309aa66/ruff-0.9.6-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:589d1d9f25b5754ff230dce914a174a7c951a85a4e9270613a2b74231fdac2f5", size = 14592374 },
+ { url = "https://files.pythonhosted.org/packages/31/70/e917781e55ff39c5b5208bda384fd397ffd76605e68544d71a7e40944945/ruff-0.9.6-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dc61dd5131742e21103fbbdcad683a8813be0e3c204472d520d9a5021ca8b217", size = 12500173 },
+ { url = "https://files.pythonhosted.org/packages/84/f5/e4ddee07660f5a9622a9c2b639afd8f3104988dc4f6ba0b73ffacffa9a8c/ruff-0.9.6-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:5e2d9126161d0357e5c8f30b0bd6168d2c3872372f14481136d13de9937f79b6", size = 11906555 },
+ { url = "https://files.pythonhosted.org/packages/f1/2b/6ff2fe383667075eef8656b9892e73dd9b119b5e3add51298628b87f6429/ruff-0.9.6-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:68660eab1a8e65babb5229a1f97b46e3120923757a68b5413d8561f8a85d4897", size = 11538958 },
+ { url = "https://files.pythonhosted.org/packages/3c/db/98e59e90de45d1eb46649151c10a062d5707b5b7f76f64eb1e29edf6ebb1/ruff-0.9.6-py3-none-musllinux_1_2_i686.whl", hash = "sha256:c4cae6c4cc7b9b4017c71114115db0445b00a16de3bcde0946273e8392856f08", size = 12117247 },
+ { url = "https://files.pythonhosted.org/packages/ec/bc/54e38f6d219013a9204a5a2015c09e7a8c36cedcd50a4b01ac69a550b9d9/ruff-0.9.6-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:19f505b643228b417c1111a2a536424ddde0db4ef9023b9e04a46ed8a1cb4656", size = 12554647 },
+ { url = "https://files.pythonhosted.org/packages/a5/7d/7b461ab0e2404293c0627125bb70ac642c2e8d55bf590f6fce85f508f1b2/ruff-0.9.6-py3-none-win32.whl", hash = "sha256:194d8402bceef1b31164909540a597e0d913c0e4952015a5b40e28c146121b5d", size = 9949214 },
+ { url = "https://files.pythonhosted.org/packages/ee/30/c3cee10f915ed75a5c29c1e57311282d1a15855551a64795c1b2bbe5cf37/ruff-0.9.6-py3-none-win_amd64.whl", hash = "sha256:03482d5c09d90d4ee3f40d97578423698ad895c87314c4de39ed2af945633caa", size = 10999914 },
+ { url = "https://files.pythonhosted.org/packages/e8/a8/d71f44b93e3aa86ae232af1f2126ca7b95c0f515ec135462b3e1f351441c/ruff-0.9.6-py3-none-win_arm64.whl", hash = "sha256:0e2bb706a2be7ddfea4a4af918562fdc1bcb16df255e5fa595bbd800ce322a5a", size = 10177499 },
+]
+
+[[package]]
+name = "six"
+version = "1.17.0"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/94/e7/b2c673351809dca68a0e064b6af791aa332cf192da575fd474ed7d6f16a2/six-1.17.0.tar.gz", hash = "sha256:ff70335d468e7eb6ec65b95b99d3a2836546063f63acc5171de367e834932a81", size = 34031 }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/b7/ce/149a00dd41f10bc29e5921b496af8b574d8413afcd5e30dfa0ed46c2cc5e/six-1.17.0-py2.py3-none-any.whl", hash = "sha256:4721f391ed90541fddacab5acf947aa0d3dc7d27b2e1e8eda2be8970586c3274", size = 11050 },
+]
+
+[[package]]
+name = "sniffio"
+version = "1.3.1"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/a2/87/a6771e1546d97e7e041b6ae58d80074f81b7d5121207425c964ddf5cfdbd/sniffio-1.3.1.tar.gz", hash = "sha256:f4324edc670a0f49750a81b895f35c3adb843cca46f0530f79fc1babb23789dc", size = 20372 }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/e9/44/75a9c9421471a6c4805dbf2356f7c181a29c1879239abab1ea2cc8f38b40/sniffio-1.3.1-py3-none-any.whl", hash = "sha256:2f6da418d1f1e0fddd844478f41680e794e6051915791a034ff65e5f100525a2", size = 10235 },
+]
+
+[[package]]
+name = "speckle-automate-checker"
+version = "0.1.0"
+source = { virtual = "." }
+dependencies = [
+ { name = "more-itertools" },
+ { name = "pandas" },
+ { name = "pydantic" },
+ { name = "pytest-assertcount" },
+ { name = "python-dotenv" },
+ { name = "python-levenshtein" },
+ { name = "specklepy" },
+]
+
+[package.dev-dependencies]
+dev = [
+ { name = "black" },
+ { name = "mypy" },
+ { name = "pydantic-settings" },
+ { name = "pytest" },
+ { name = "ruff" },
+]
+
+[package.metadata]
+requires-dist = [
+ { name = "more-itertools", specifier = ">=10.6.0" },
+ { name = "pandas", specifier = ">=2.2.3" },
+ { name = "pydantic", specifier = "==2.10.6" },
+ { name = "pytest-assertcount", specifier = ">=1.0.0" },
+ { name = "python-dotenv", specifier = ">=1.0.1" },
+ { name = "python-levenshtein", specifier = ">=0.26.1" },
+ { name = "specklepy", specifier = ">=2.21.2" },
+]
+
+[package.metadata.requires-dev]
+dev = [
+ { name = "black", specifier = ">=25.1.0" },
+ { name = "mypy", specifier = ">=1.15.0" },
+ { name = "pydantic-settings", specifier = ">=2.7.1" },
+ { name = "pytest", specifier = ">=8.3.4" },
+ { name = "ruff", specifier = ">=0.9.6" },
+]
+
+[[package]]
+name = "specklepy"
+version = "2.21.2"
+source = { registry = "https://pypi.org/simple" }
+dependencies = [
+ { name = "appdirs" },
+ { name = "attrs" },
+ { name = "deprecated" },
+ { name = "gql", extra = ["requests", "websockets"] },
+ { name = "httpx" },
+ { name = "pydantic" },
+ { name = "stringcase" },
+ { name = "ujson" },
+]
+sdist = { url = "https://files.pythonhosted.org/packages/18/79/58269be683ca06194a464deaac3655989b094c6a0df0f8dccb24eeb47031/specklepy-2.21.2.tar.gz", hash = "sha256:ba44bb9167ced32e52ba7e5717d0b1d0ece1aa23ca02243ce75f0eaba08e8107", size = 93326 }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/13/89/78eb05af38fc455c695c2ab882db2cca0ef518313c49f73b6536d0cad9e7/specklepy-2.21.2-py3-none-any.whl", hash = "sha256:bb34bb0de56f8731f88ac9a1ada4cddfbf2d71e52d4e9cce07bab95c1dac2b2d", size = 136495 },
+]
+
+[[package]]
+name = "stringcase"
+version = "1.2.0"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/f3/1f/1241aa3d66e8dc1612427b17885f5fcd9c9ee3079fc0d28e9a3aeeb36fa3/stringcase-1.2.0.tar.gz", hash = "sha256:48a06980661908efe8d9d34eab2b6c13aefa2163b3ced26972902e3bdfd87008", size = 2958 }
+
+[[package]]
+name = "typing-extensions"
+version = "4.12.2"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/df/db/f35a00659bc03fec321ba8bce9420de607a1d37f8342eee1863174c69557/typing_extensions-4.12.2.tar.gz", hash = "sha256:1a7ead55c7e559dd4dee8856e3a88b41225abfe1ce8df57b7c13915fe121ffb8", size = 85321 }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/26/9f/ad63fc0248c5379346306f8668cda6e2e2e9c95e01216d2b8ffd9ff037d0/typing_extensions-4.12.2-py3-none-any.whl", hash = "sha256:04e5ca0351e0f3f85c6853954072df659d0d13fac324d0072316b67d7794700d", size = 37438 },
+]
+
+[[package]]
+name = "tzdata"
+version = "2025.1"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/43/0f/fa4723f22942480be4ca9527bbde8d43f6c3f2fe8412f00e7f5f6746bc8b/tzdata-2025.1.tar.gz", hash = "sha256:24894909e88cdb28bd1636c6887801df64cb485bd593f2fd83ef29075a81d694", size = 194950 }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/0f/dd/84f10e23edd882c6f968c21c2434fe67bd4a528967067515feca9e611e5e/tzdata-2025.1-py2.py3-none-any.whl", hash = "sha256:7e127113816800496f027041c570f50bcd464a020098a3b6b199517772303639", size = 346762 },
+]
+
+[[package]]
+name = "ujson"
+version = "5.10.0"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/f0/00/3110fd566786bfa542adb7932d62035e0c0ef662a8ff6544b6643b3d6fd7/ujson-5.10.0.tar.gz", hash = "sha256:b3cd8f3c5d8c7738257f1018880444f7b7d9b66232c64649f562d7ba86ad4bc1", size = 7154885 }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/e8/a6/fd3f8bbd80842267e2d06c3583279555e8354c5986c952385199d57a5b6c/ujson-5.10.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:98ba15d8cbc481ce55695beee9f063189dce91a4b08bc1d03e7f0152cd4bbdd5", size = 55642 },
+ { url = "https://files.pythonhosted.org/packages/a8/47/dd03fd2b5ae727e16d5d18919b383959c6d269c7b948a380fdd879518640/ujson-5.10.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:a9d2edbf1556e4f56e50fab7d8ff993dbad7f54bac68eacdd27a8f55f433578e", size = 51807 },
+ { url = "https://files.pythonhosted.org/packages/25/23/079a4cc6fd7e2655a473ed9e776ddbb7144e27f04e8fc484a0fb45fe6f71/ujson-5.10.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6627029ae4f52d0e1a2451768c2c37c0c814ffc04f796eb36244cf16b8e57043", size = 51972 },
+ { url = "https://files.pythonhosted.org/packages/04/81/668707e5f2177791869b624be4c06fb2473bf97ee33296b18d1cf3092af7/ujson-5.10.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f8ccb77b3e40b151e20519c6ae6d89bfe3f4c14e8e210d910287f778368bb3d1", size = 53686 },
+ { url = "https://files.pythonhosted.org/packages/bd/50/056d518a386d80aaf4505ccf3cee1c40d312a46901ed494d5711dd939bc3/ujson-5.10.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f3caf9cd64abfeb11a3b661329085c5e167abbe15256b3b68cb5d914ba7396f3", size = 58591 },
+ { url = "https://files.pythonhosted.org/packages/fc/d6/aeaf3e2d6fb1f4cfb6bf25f454d60490ed8146ddc0600fae44bfe7eb5a72/ujson-5.10.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:6e32abdce572e3a8c3d02c886c704a38a1b015a1fb858004e03d20ca7cecbb21", size = 997853 },
+ { url = "https://files.pythonhosted.org/packages/f8/d5/1f2a5d2699f447f7d990334ca96e90065ea7f99b142ce96e85f26d7e78e2/ujson-5.10.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:a65b6af4d903103ee7b6f4f5b85f1bfd0c90ba4eeac6421aae436c9988aa64a2", size = 1140689 },
+ { url = "https://files.pythonhosted.org/packages/f2/2c/6990f4ccb41ed93744aaaa3786394bca0875503f97690622f3cafc0adfde/ujson-5.10.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:604a046d966457b6cdcacc5aa2ec5314f0e8c42bae52842c1e6fa02ea4bda42e", size = 1043576 },
+ { url = "https://files.pythonhosted.org/packages/14/f5/a2368463dbb09fbdbf6a696062d0c0f62e4ae6fa65f38f829611da2e8fdd/ujson-5.10.0-cp312-cp312-win32.whl", hash = "sha256:6dea1c8b4fc921bf78a8ff00bbd2bfe166345f5536c510671bccececb187c80e", size = 38764 },
+ { url = "https://files.pythonhosted.org/packages/59/2d/691f741ffd72b6c84438a93749ac57bf1a3f217ac4b0ea4fd0e96119e118/ujson-5.10.0-cp312-cp312-win_amd64.whl", hash = "sha256:38665e7d8290188b1e0d57d584eb8110951a9591363316dd41cf8686ab1d0abc", size = 42211 },
+ { url = "https://files.pythonhosted.org/packages/0d/69/b3e3f924bb0e8820bb46671979770c5be6a7d51c77a66324cdb09f1acddb/ujson-5.10.0-cp313-cp313-macosx_10_9_x86_64.whl", hash = "sha256:618efd84dc1acbd6bff8eaa736bb6c074bfa8b8a98f55b61c38d4ca2c1f7f287", size = 55646 },
+ { url = "https://files.pythonhosted.org/packages/32/8a/9b748eb543c6cabc54ebeaa1f28035b1bd09c0800235b08e85990734c41e/ujson-5.10.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:38d5d36b4aedfe81dfe251f76c0467399d575d1395a1755de391e58985ab1c2e", size = 51806 },
+ { url = "https://files.pythonhosted.org/packages/39/50/4b53ea234413b710a18b305f465b328e306ba9592e13a791a6a6b378869b/ujson-5.10.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:67079b1f9fb29ed9a2914acf4ef6c02844b3153913eb735d4bf287ee1db6e557", size = 51975 },
+ { url = "https://files.pythonhosted.org/packages/b4/9d/8061934f960cdb6dd55f0b3ceeff207fcc48c64f58b43403777ad5623d9e/ujson-5.10.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d7d0e0ceeb8fe2468c70ec0c37b439dd554e2aa539a8a56365fd761edb418988", size = 53693 },
+ { url = "https://files.pythonhosted.org/packages/f5/be/7bfa84b28519ddbb67efc8410765ca7da55e6b93aba84d97764cd5794dbc/ujson-5.10.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:59e02cd37bc7c44d587a0ba45347cc815fb7a5fe48de16bf05caa5f7d0d2e816", size = 58594 },
+ { url = "https://files.pythonhosted.org/packages/48/eb/85d465abafb2c69d9699cfa5520e6e96561db787d36c677370e066c7e2e7/ujson-5.10.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:2a890b706b64e0065f02577bf6d8ca3b66c11a5e81fb75d757233a38c07a1f20", size = 997853 },
+ { url = "https://files.pythonhosted.org/packages/9f/76/2a63409fc05d34dd7d929357b7a45e3a2c96f22b4225cd74becd2ba6c4cb/ujson-5.10.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:621e34b4632c740ecb491efc7f1fcb4f74b48ddb55e65221995e74e2d00bbff0", size = 1140694 },
+ { url = "https://files.pythonhosted.org/packages/45/ed/582c4daba0f3e1688d923b5cb914ada1f9defa702df38a1916c899f7c4d1/ujson-5.10.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:b9500e61fce0cfc86168b248104e954fead61f9be213087153d272e817ec7b4f", size = 1043580 },
+ { url = "https://files.pythonhosted.org/packages/d7/0c/9837fece153051e19c7bade9f88f9b409e026b9525927824cdf16293b43b/ujson-5.10.0-cp313-cp313-win32.whl", hash = "sha256:4c4fc16f11ac1612f05b6f5781b384716719547e142cfd67b65d035bd85af165", size = 38766 },
+ { url = "https://files.pythonhosted.org/packages/d7/72/6cb6728e2738c05bbe9bd522d6fc79f86b9a28402f38663e85a28fddd4a0/ujson-5.10.0-cp313-cp313-win_amd64.whl", hash = "sha256:4573fd1695932d4f619928fd09d5d03d917274381649ade4328091ceca175539", size = 42212 },
+]
+
+[[package]]
+name = "urllib3"
+version = "2.3.0"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/aa/63/e53da845320b757bf29ef6a9062f5c669fe997973f966045cb019c3f4b66/urllib3-2.3.0.tar.gz", hash = "sha256:f8c5449b3cf0861679ce7e0503c7b44b5ec981bec0d1d3795a07f1ba96f0204d", size = 307268 }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/c8/19/4ec628951a74043532ca2cf5d97b7b14863931476d117c471e8e2b1eb39f/urllib3-2.3.0-py3-none-any.whl", hash = "sha256:1cee9ad369867bfdbbb48b7dd50374c0967a0bb7710050facf0dd6911440e3df", size = 128369 },
+]
+
+[[package]]
+name = "websockets"
+version = "11.0.3"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/d8/3b/2ed38e52eed4cf277f9df5f0463a99199a04d9e29c9e227cfafa57bd3993/websockets-11.0.3.tar.gz", hash = "sha256:88fc51d9a26b10fc331be344f1781224a375b78488fc343620184e95a4b27016", size = 104235 }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/47/96/9d5749106ff57629b54360664ae7eb9afd8302fad1680ead385383e33746/websockets-11.0.3-py3-none-any.whl", hash = "sha256:6681ba9e7f8f3b19440921e99efbb40fc89f26cd71bf539e45d8c8a25c976dc6", size = 118056 },
+]
+
+[[package]]
+name = "wrapt"
+version = "1.17.2"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/c3/fc/e91cc220803d7bc4db93fb02facd8461c37364151b8494762cc88b0fbcef/wrapt-1.17.2.tar.gz", hash = "sha256:41388e9d4d1522446fe79d3213196bd9e3b301a336965b9e27ca2788ebd122f3", size = 55531 }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/a1/bd/ab55f849fd1f9a58ed7ea47f5559ff09741b25f00c191231f9f059c83949/wrapt-1.17.2-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:d5e2439eecc762cd85e7bd37161d4714aa03a33c5ba884e26c81559817ca0925", size = 53799 },
+ { url = "https://files.pythonhosted.org/packages/53/18/75ddc64c3f63988f5a1d7e10fb204ffe5762bc663f8023f18ecaf31a332e/wrapt-1.17.2-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:3fc7cb4c1c744f8c05cd5f9438a3caa6ab94ce8344e952d7c45a8ed59dd88392", size = 38821 },
+ { url = "https://files.pythonhosted.org/packages/48/2a/97928387d6ed1c1ebbfd4efc4133a0633546bec8481a2dd5ec961313a1c7/wrapt-1.17.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:8fdbdb757d5390f7c675e558fd3186d590973244fab0c5fe63d373ade3e99d40", size = 38919 },
+ { url = "https://files.pythonhosted.org/packages/73/54/3bfe5a1febbbccb7a2f77de47b989c0b85ed3a6a41614b104204a788c20e/wrapt-1.17.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5bb1d0dbf99411f3d871deb6faa9aabb9d4e744d67dcaaa05399af89d847a91d", size = 88721 },
+ { url = "https://files.pythonhosted.org/packages/25/cb/7262bc1b0300b4b64af50c2720ef958c2c1917525238d661c3e9a2b71b7b/wrapt-1.17.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d18a4865f46b8579d44e4fe1e2bcbc6472ad83d98e22a26c963d46e4c125ef0b", size = 80899 },
+ { url = "https://files.pythonhosted.org/packages/2a/5a/04cde32b07a7431d4ed0553a76fdb7a61270e78c5fd5a603e190ac389f14/wrapt-1.17.2-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bc570b5f14a79734437cb7b0500376b6b791153314986074486e0b0fa8d71d98", size = 89222 },
+ { url = "https://files.pythonhosted.org/packages/09/28/2e45a4f4771fcfb109e244d5dbe54259e970362a311b67a965555ba65026/wrapt-1.17.2-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:6d9187b01bebc3875bac9b087948a2bccefe464a7d8f627cf6e48b1bbae30f82", size = 86707 },
+ { url = "https://files.pythonhosted.org/packages/c6/d2/dcb56bf5f32fcd4bd9aacc77b50a539abdd5b6536872413fd3f428b21bed/wrapt-1.17.2-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:9e8659775f1adf02eb1e6f109751268e493c73716ca5761f8acb695e52a756ae", size = 79685 },
+ { url = "https://files.pythonhosted.org/packages/80/4e/eb8b353e36711347893f502ce91c770b0b0929f8f0bed2670a6856e667a9/wrapt-1.17.2-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:e8b2816ebef96d83657b56306152a93909a83f23994f4b30ad4573b00bd11bb9", size = 87567 },
+ { url = "https://files.pythonhosted.org/packages/17/27/4fe749a54e7fae6e7146f1c7d914d28ef599dacd4416566c055564080fe2/wrapt-1.17.2-cp312-cp312-win32.whl", hash = "sha256:468090021f391fe0056ad3e807e3d9034e0fd01adcd3bdfba977b6fdf4213ea9", size = 36672 },
+ { url = "https://files.pythonhosted.org/packages/15/06/1dbf478ea45c03e78a6a8c4be4fdc3c3bddea5c8de8a93bc971415e47f0f/wrapt-1.17.2-cp312-cp312-win_amd64.whl", hash = "sha256:ec89ed91f2fa8e3f52ae53cd3cf640d6feff92ba90d62236a81e4e563ac0e991", size = 38865 },
+ { url = "https://files.pythonhosted.org/packages/ce/b9/0ffd557a92f3b11d4c5d5e0c5e4ad057bd9eb8586615cdaf901409920b14/wrapt-1.17.2-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:6ed6ffac43aecfe6d86ec5b74b06a5be33d5bb9243d055141e8cabb12aa08125", size = 53800 },
+ { url = "https://files.pythonhosted.org/packages/c0/ef/8be90a0b7e73c32e550c73cfb2fa09db62234227ece47b0e80a05073b375/wrapt-1.17.2-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:35621ae4c00e056adb0009f8e86e28eb4a41a4bfa8f9bfa9fca7d343fe94f998", size = 38824 },
+ { url = "https://files.pythonhosted.org/packages/36/89/0aae34c10fe524cce30fe5fc433210376bce94cf74d05b0d68344c8ba46e/wrapt-1.17.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:a604bf7a053f8362d27eb9fefd2097f82600b856d5abe996d623babd067b1ab5", size = 38920 },
+ { url = "https://files.pythonhosted.org/packages/3b/24/11c4510de906d77e0cfb5197f1b1445d4fec42c9a39ea853d482698ac681/wrapt-1.17.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5cbabee4f083b6b4cd282f5b817a867cf0b1028c54d445b7ec7cfe6505057cf8", size = 88690 },
+ { url = "https://files.pythonhosted.org/packages/71/d7/cfcf842291267bf455b3e266c0c29dcb675b5540ee8b50ba1699abf3af45/wrapt-1.17.2-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:49703ce2ddc220df165bd2962f8e03b84c89fee2d65e1c24a7defff6f988f4d6", size = 80861 },
+ { url = "https://files.pythonhosted.org/packages/d5/66/5d973e9f3e7370fd686fb47a9af3319418ed925c27d72ce16b791231576d/wrapt-1.17.2-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8112e52c5822fc4253f3901b676c55ddf288614dc7011634e2719718eaa187dc", size = 89174 },
+ { url = "https://files.pythonhosted.org/packages/a7/d3/8e17bb70f6ae25dabc1aaf990f86824e4fd98ee9cadf197054e068500d27/wrapt-1.17.2-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:9fee687dce376205d9a494e9c121e27183b2a3df18037f89d69bd7b35bcf59e2", size = 86721 },
+ { url = "https://files.pythonhosted.org/packages/6f/54/f170dfb278fe1c30d0ff864513cff526d624ab8de3254b20abb9cffedc24/wrapt-1.17.2-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:18983c537e04d11cf027fbb60a1e8dfd5190e2b60cc27bc0808e653e7b218d1b", size = 79763 },
+ { url = "https://files.pythonhosted.org/packages/4a/98/de07243751f1c4a9b15c76019250210dd3486ce098c3d80d5f729cba029c/wrapt-1.17.2-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:703919b1633412ab54bcf920ab388735832fdcb9f9a00ae49387f0fe67dad504", size = 87585 },
+ { url = "https://files.pythonhosted.org/packages/f9/f0/13925f4bd6548013038cdeb11ee2cbd4e37c30f8bfd5db9e5a2a370d6e20/wrapt-1.17.2-cp313-cp313-win32.whl", hash = "sha256:abbb9e76177c35d4e8568e58650aa6926040d6a9f6f03435b7a522bf1c487f9a", size = 36676 },
+ { url = "https://files.pythonhosted.org/packages/bf/ae/743f16ef8c2e3628df3ddfd652b7d4c555d12c84b53f3d8218498f4ade9b/wrapt-1.17.2-cp313-cp313-win_amd64.whl", hash = "sha256:69606d7bb691b50a4240ce6b22ebb319c1cfb164e5f6569835058196e0f3a845", size = 38871 },
+ { url = "https://files.pythonhosted.org/packages/3d/bc/30f903f891a82d402ffb5fda27ec1d621cc97cb74c16fea0b6141f1d4e87/wrapt-1.17.2-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:4a721d3c943dae44f8e243b380cb645a709ba5bd35d3ad27bc2ed947e9c68192", size = 56312 },
+ { url = "https://files.pythonhosted.org/packages/8a/04/c97273eb491b5f1c918857cd26f314b74fc9b29224521f5b83f872253725/wrapt-1.17.2-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:766d8bbefcb9e00c3ac3b000d9acc51f1b399513f44d77dfe0eb026ad7c9a19b", size = 40062 },
+ { url = "https://files.pythonhosted.org/packages/4e/ca/3b7afa1eae3a9e7fefe499db9b96813f41828b9fdb016ee836c4c379dadb/wrapt-1.17.2-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:e496a8ce2c256da1eb98bd15803a79bee00fc351f5dfb9ea82594a3f058309e0", size = 40155 },
+ { url = "https://files.pythonhosted.org/packages/89/be/7c1baed43290775cb9030c774bc53c860db140397047cc49aedaf0a15477/wrapt-1.17.2-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:40d615e4fe22f4ad3528448c193b218e077656ca9ccb22ce2cb20db730f8d306", size = 113471 },
+ { url = "https://files.pythonhosted.org/packages/32/98/4ed894cf012b6d6aae5f5cc974006bdeb92f0241775addad3f8cd6ab71c8/wrapt-1.17.2-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a5aaeff38654462bc4b09023918b7f21790efb807f54c000a39d41d69cf552cb", size = 101208 },
+ { url = "https://files.pythonhosted.org/packages/ea/fd/0c30f2301ca94e655e5e057012e83284ce8c545df7661a78d8bfca2fac7a/wrapt-1.17.2-cp313-cp313t-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9a7d15bbd2bc99e92e39f49a04653062ee6085c0e18b3b7512a4f2fe91f2d681", size = 109339 },
+ { url = "https://files.pythonhosted.org/packages/75/56/05d000de894c4cfcb84bcd6b1df6214297b8089a7bd324c21a4765e49b14/wrapt-1.17.2-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:e3890b508a23299083e065f435a492b5435eba6e304a7114d2f919d400888cc6", size = 110232 },
+ { url = "https://files.pythonhosted.org/packages/53/f8/c3f6b2cf9b9277fb0813418e1503e68414cd036b3b099c823379c9575e6d/wrapt-1.17.2-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:8c8b293cd65ad716d13d8dd3624e42e5a19cc2a2f1acc74b30c2c13f15cb61a6", size = 100476 },
+ { url = "https://files.pythonhosted.org/packages/a7/b1/0bb11e29aa5139d90b770ebbfa167267b1fc548d2302c30c8f7572851738/wrapt-1.17.2-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:4c82b8785d98cdd9fed4cac84d765d234ed3251bd6afe34cb7ac523cb93e8b4f", size = 106377 },
+ { url = "https://files.pythonhosted.org/packages/6a/e1/0122853035b40b3f333bbb25f1939fc1045e21dd518f7f0922b60c156f7c/wrapt-1.17.2-cp313-cp313t-win32.whl", hash = "sha256:13e6afb7fe71fe7485a4550a8844cc9ffbe263c0f1a1eea569bc7091d4898555", size = 37986 },
+ { url = "https://files.pythonhosted.org/packages/09/5e/1655cf481e079c1f22d0cabdd4e51733679932718dc23bf2db175f329b76/wrapt-1.17.2-cp313-cp313t-win_amd64.whl", hash = "sha256:eaf675418ed6b3b31c7a989fd007fa7c3be66ce14e5c3b27336383604c9da85c", size = 40750 },
+ { url = "https://files.pythonhosted.org/packages/2d/82/f56956041adef78f849db6b289b282e72b55ab8045a75abad81898c28d19/wrapt-1.17.2-py3-none-any.whl", hash = "sha256:b18f2d1533a71f069c7f82d524a52599053d4c7166e9dd374ae2136b7f40f7c8", size = 23594 },
+]
+
+[[package]]
+name = "yarl"
+version = "1.18.3"
+source = { registry = "https://pypi.org/simple" }
+dependencies = [
+ { name = "idna" },
+ { name = "multidict" },
+ { name = "propcache" },
+]
+sdist = { url = "https://files.pythonhosted.org/packages/b7/9d/4b94a8e6d2b51b599516a5cb88e5bc99b4d8d4583e468057eaa29d5f0918/yarl-1.18.3.tar.gz", hash = "sha256:ac1801c45cbf77b6c99242eeff4fffb5e4e73a800b5c4ad4fc0be5def634d2e1", size = 181062 }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/33/85/bd2e2729752ff4c77338e0102914897512e92496375e079ce0150a6dc306/yarl-1.18.3-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:1dd4bdd05407ced96fed3d7f25dbbf88d2ffb045a0db60dbc247f5b3c5c25d50", size = 142644 },
+ { url = "https://files.pythonhosted.org/packages/ff/74/1178322cc0f10288d7eefa6e4a85d8d2e28187ccab13d5b844e8b5d7c88d/yarl-1.18.3-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:7c33dd1931a95e5d9a772d0ac5e44cac8957eaf58e3c8da8c1414de7dd27c576", size = 94962 },
+ { url = "https://files.pythonhosted.org/packages/be/75/79c6acc0261e2c2ae8a1c41cf12265e91628c8c58ae91f5ff59e29c0787f/yarl-1.18.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:25b411eddcfd56a2f0cd6a384e9f4f7aa3efee14b188de13048c25b5e91f1640", size = 92795 },
+ { url = "https://files.pythonhosted.org/packages/6b/32/927b2d67a412c31199e83fefdce6e645247b4fb164aa1ecb35a0f9eb2058/yarl-1.18.3-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:436c4fc0a4d66b2badc6c5fc5ef4e47bb10e4fd9bf0c79524ac719a01f3607c2", size = 332368 },
+ { url = "https://files.pythonhosted.org/packages/19/e5/859fca07169d6eceeaa4fde1997c91d8abde4e9a7c018e371640c2da2b71/yarl-1.18.3-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e35ef8683211db69ffe129a25d5634319a677570ab6b2eba4afa860f54eeaf75", size = 342314 },
+ { url = "https://files.pythonhosted.org/packages/08/75/76b63ccd91c9e03ab213ef27ae6add2e3400e77e5cdddf8ed2dbc36e3f21/yarl-1.18.3-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:84b2deecba4a3f1a398df819151eb72d29bfeb3b69abb145a00ddc8d30094512", size = 341987 },
+ { url = "https://files.pythonhosted.org/packages/1a/e1/a097d5755d3ea8479a42856f51d97eeff7a3a7160593332d98f2709b3580/yarl-1.18.3-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:00e5a1fea0fd4f5bfa7440a47eff01d9822a65b4488f7cff83155a0f31a2ecba", size = 336914 },
+ { url = "https://files.pythonhosted.org/packages/0b/42/e1b4d0e396b7987feceebe565286c27bc085bf07d61a59508cdaf2d45e63/yarl-1.18.3-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d0e883008013c0e4aef84dcfe2a0b172c4d23c2669412cf5b3371003941f72bb", size = 325765 },
+ { url = "https://files.pythonhosted.org/packages/7e/18/03a5834ccc9177f97ca1bbb245b93c13e58e8225276f01eedc4cc98ab820/yarl-1.18.3-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:5a3f356548e34a70b0172d8890006c37be92995f62d95a07b4a42e90fba54272", size = 344444 },
+ { url = "https://files.pythonhosted.org/packages/c8/03/a713633bdde0640b0472aa197b5b86e90fbc4c5bc05b727b714cd8a40e6d/yarl-1.18.3-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:ccd17349166b1bee6e529b4add61727d3f55edb7babbe4069b5764c9587a8cc6", size = 340760 },
+ { url = "https://files.pythonhosted.org/packages/eb/99/f6567e3f3bbad8fd101886ea0276c68ecb86a2b58be0f64077396cd4b95e/yarl-1.18.3-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:b958ddd075ddba5b09bb0be8a6d9906d2ce933aee81100db289badbeb966f54e", size = 346484 },
+ { url = "https://files.pythonhosted.org/packages/8e/a9/84717c896b2fc6cb15bd4eecd64e34a2f0a9fd6669e69170c73a8b46795a/yarl-1.18.3-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:c7d79f7d9aabd6011004e33b22bc13056a3e3fb54794d138af57f5ee9d9032cb", size = 359864 },
+ { url = "https://files.pythonhosted.org/packages/1e/2e/d0f5f1bef7ee93ed17e739ec8dbcb47794af891f7d165fa6014517b48169/yarl-1.18.3-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:4891ed92157e5430874dad17b15eb1fda57627710756c27422200c52d8a4e393", size = 364537 },
+ { url = "https://files.pythonhosted.org/packages/97/8a/568d07c5d4964da5b02621a517532adb8ec5ba181ad1687191fffeda0ab6/yarl-1.18.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:ce1af883b94304f493698b00d0f006d56aea98aeb49d75ec7d98cd4a777e9285", size = 357861 },
+ { url = "https://files.pythonhosted.org/packages/7d/e3/924c3f64b6b3077889df9a1ece1ed8947e7b61b0a933f2ec93041990a677/yarl-1.18.3-cp312-cp312-win32.whl", hash = "sha256:f91c4803173928a25e1a55b943c81f55b8872f0018be83e3ad4938adffb77dd2", size = 84097 },
+ { url = "https://files.pythonhosted.org/packages/34/45/0e055320daaabfc169b21ff6174567b2c910c45617b0d79c68d7ab349b02/yarl-1.18.3-cp312-cp312-win_amd64.whl", hash = "sha256:7e2ee16578af3b52ac2f334c3b1f92262f47e02cc6193c598502bd46f5cd1477", size = 90399 },
+ { url = "https://files.pythonhosted.org/packages/30/c7/c790513d5328a8390be8f47be5d52e141f78b66c6c48f48d241ca6bd5265/yarl-1.18.3-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:90adb47ad432332d4f0bc28f83a5963f426ce9a1a8809f5e584e704b82685dcb", size = 140789 },
+ { url = "https://files.pythonhosted.org/packages/30/aa/a2f84e93554a578463e2edaaf2300faa61c8701f0898725842c704ba5444/yarl-1.18.3-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:913829534200eb0f789d45349e55203a091f45c37a2674678744ae52fae23efa", size = 94144 },
+ { url = "https://files.pythonhosted.org/packages/c6/fc/d68d8f83714b221a85ce7866832cba36d7c04a68fa6a960b908c2c84f325/yarl-1.18.3-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:ef9f7768395923c3039055c14334ba4d926f3baf7b776c923c93d80195624782", size = 91974 },
+ { url = "https://files.pythonhosted.org/packages/56/4e/d2563d8323a7e9a414b5b25341b3942af5902a2263d36d20fb17c40411e2/yarl-1.18.3-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:88a19f62ff30117e706ebc9090b8ecc79aeb77d0b1f5ec10d2d27a12bc9f66d0", size = 333587 },
+ { url = "https://files.pythonhosted.org/packages/25/c9/cfec0bc0cac8d054be223e9f2c7909d3e8442a856af9dbce7e3442a8ec8d/yarl-1.18.3-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e17c9361d46a4d5addf777c6dd5eab0715a7684c2f11b88c67ac37edfba6c482", size = 344386 },
+ { url = "https://files.pythonhosted.org/packages/ab/5d/4c532190113b25f1364d25f4c319322e86232d69175b91f27e3ebc2caf9a/yarl-1.18.3-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1a74a13a4c857a84a845505fd2d68e54826a2cd01935a96efb1e9d86c728e186", size = 345421 },
+ { url = "https://files.pythonhosted.org/packages/23/d1/6cdd1632da013aa6ba18cee4d750d953104a5e7aac44e249d9410a972bf5/yarl-1.18.3-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:41f7ce59d6ee7741af71d82020346af364949314ed3d87553763a2df1829cc58", size = 339384 },
+ { url = "https://files.pythonhosted.org/packages/9a/c4/6b3c39bec352e441bd30f432cda6ba51681ab19bb8abe023f0d19777aad1/yarl-1.18.3-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f52a265001d830bc425f82ca9eabda94a64a4d753b07d623a9f2863fde532b53", size = 326689 },
+ { url = "https://files.pythonhosted.org/packages/23/30/07fb088f2eefdc0aa4fc1af4e3ca4eb1a3aadd1ce7d866d74c0f124e6a85/yarl-1.18.3-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:82123d0c954dc58db301f5021a01854a85bf1f3bb7d12ae0c01afc414a882ca2", size = 345453 },
+ { url = "https://files.pythonhosted.org/packages/63/09/d54befb48f9cd8eec43797f624ec37783a0266855f4930a91e3d5c7717f8/yarl-1.18.3-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:2ec9bbba33b2d00999af4631a3397d1fd78290c48e2a3e52d8dd72db3a067ac8", size = 341872 },
+ { url = "https://files.pythonhosted.org/packages/91/26/fd0ef9bf29dd906a84b59f0cd1281e65b0c3e08c6aa94b57f7d11f593518/yarl-1.18.3-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:fbd6748e8ab9b41171bb95c6142faf068f5ef1511935a0aa07025438dd9a9bc1", size = 347497 },
+ { url = "https://files.pythonhosted.org/packages/d9/b5/14ac7a256d0511b2ac168d50d4b7d744aea1c1aa20c79f620d1059aab8b2/yarl-1.18.3-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:877d209b6aebeb5b16c42cbb377f5f94d9e556626b1bfff66d7b0d115be88d0a", size = 359981 },
+ { url = "https://files.pythonhosted.org/packages/ca/b3/d493221ad5cbd18bc07e642894030437e405e1413c4236dd5db6e46bcec9/yarl-1.18.3-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:b464c4ab4bfcb41e3bfd3f1c26600d038376c2de3297760dfe064d2cb7ea8e10", size = 366229 },
+ { url = "https://files.pythonhosted.org/packages/04/56/6a3e2a5d9152c56c346df9b8fb8edd2c8888b1e03f96324d457e5cf06d34/yarl-1.18.3-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:8d39d351e7faf01483cc7ff7c0213c412e38e5a340238826be7e0e4da450fdc8", size = 360383 },
+ { url = "https://files.pythonhosted.org/packages/fd/b7/4b3c7c7913a278d445cc6284e59b2e62fa25e72758f888b7a7a39eb8423f/yarl-1.18.3-cp313-cp313-win32.whl", hash = "sha256:61ee62ead9b68b9123ec24bc866cbef297dd266175d53296e2db5e7f797f902d", size = 310152 },
+ { url = "https://files.pythonhosted.org/packages/f5/d5/688db678e987c3e0fb17867970700b92603cadf36c56e5fb08f23e822a0c/yarl-1.18.3-cp313-cp313-win_amd64.whl", hash = "sha256:578e281c393af575879990861823ef19d66e2b1d0098414855dd367e234f5b3c", size = 315723 },
+ { url = "https://files.pythonhosted.org/packages/f5/4b/a06e0ec3d155924f77835ed2d167ebd3b211a7b0853da1cf8d8414d784ef/yarl-1.18.3-py3-none-any.whl", hash = "sha256:b57f4f58099328dfb26c6a771d09fb20dbbae81d20cfb66141251ea063bd101b", size = 45109 },
+]