diff --git a/.dockerignore b/.dockerignore
new file mode 100644
index 0000000..6977c94
--- /dev/null
+++ b/.dockerignore
@@ -0,0 +1,14 @@
+storage/
+tests/
+logs/
+notebooks/
+**/*_*cache*_*
+/.*
+*.lock
+*.ini
+*.toml
+*.md
+!pyproject.toml
+!poetry.lock
+!README.md
+Dockerfile
diff --git a/.editorconfig b/.editorconfig
new file mode 100644
index 0000000..1e1dd28
--- /dev/null
+++ b/.editorconfig
@@ -0,0 +1,34 @@
+root = true
+
+[*]
+end_of_line = lf
+trim_trailing_whitespace = true
+insert_final_newline = true
+charset = utf-8
+indent_style = tab
+indent_size = 2
+
+# YAML doesn't support hard tabs
+# Templates that will be weird with hard tabs in the website editor
+[*.{yml,yaml,md}]
+indent_style = space
+indent_size = 2
+
+# Force python to be as python demands
+[*.{py,ipynb}]
+indent_size = 4
+indent_style = space
+
+[{**.*sh}]
+indent_size = 2
+indent_style = tab
+
+shell_variant = bash
+binary_next_line = false # like -bn
+switch_case_indent = true # like -ci
+space_redirects = true # like -sr
+keep_padding = false # like -kp
+end_of_line = lf
+charset = utf-8
+trim_trailing_whitespace = true
+insert_final_newline = true
diff --git a/.flake8 b/.flake8
new file mode 100644
index 0000000..4de2de7
--- /dev/null
+++ b/.flake8
@@ -0,0 +1,124 @@
+[flake8]
+extend-ignore =
+ # Allow function call as argument default
+ B008,
+ # Do not enforce trailing comma (lets Black decide what is best)
+ C812,C813,C814,C815,C816,C818,C819,
+ # Don't ask for docstring at top of module --- put it in the functions/classes
+ D100,
+ # Do not check for docstring within __init__ method
+ D107,
+ # Ignore whitespace before ';'
+ E203,
+ # Don't ask about line length, Black recommends using bugbear B950 instead
+ E501,
+ # Stop finding commented out code because it's mistaking shape annotations for code
+ E800,
+ # Stop complaining about subprocess, we need it for this project
+ S404,S602,S603,S607,
+ # Stop complaining about using functions from random
+ S311,
+ # Ignore errors for internal mypy traceback, stderr output, or an unmatched line.
+ T499,
+ # Do not complain about line-break before binary operator (caused by Black)
+ W503,
+ # Do not warn on too many imports.
+ WPS201,
+ # Do not warn on too many module members
+ WPS202,
+ # Do not warn when too many arguments in functions
+ WPS211,
+ # Do not warn on too many methods
+ WPS214,
+ # Allow lots of importing from the same module --- it can happen and thats okay!
+ WPS235,
+ # Do not warn on complex f-string
+ WPS237,
+ # Allow relative module references
+ WPS300,
+ # Allow f-strings
+ WPS305,
+ # Do not force base classes to inherit object
+ WPS306,
+ # Allow return statement that simply returns a prior statement
+ WPS331,
+ # Allow new lines to start with a dot (caused by Black)
+ WPS348,
+ # Allow logic in __init__ modules
+ WPS412,
+ # Google Python style is not RST until after processed by Napoleon
+ # See https://github.com/peterjc/flake8-rst-docstrings/issues/17
+ RST201,RST203,RST301,
+extend-select =
+ # Should raise AssertionError instead of assert False
+ B011,
+ # Use of break, continue or return in finally blocks will silence exceptions.
+ B012,
+ # Redundant exception types in except
+ B014,
+ # Pointless comparisons
+ B015,
+ # Cannot raise a literal
+ B016,
+ # Do not use `self.assertRaises(Exception)`
+ B017,
+ # Find useless expressions
+ B018,
+ # Use namedtuple instead of dataclass when only `__init__` attributes are set
+ B903,
+ # Within an except clause, raise exceptions with `raise ... from err` or `raise ...
+ # from None` to distinguish them from errors in exception handling
+ B904,
+ # Counterpart to W503, enforce having the operator at the start of a new line.
+ W504,
+
+max-line-length = 99
+max-complexity = 18
+max-methods = 10
+max-line-complexity = 18
+max-local-variables = 20
+max-expressions = 20
+max-function-expressions = 10
+max-module-expressions = 20
+max-string-usages = 10
+max-annotation-complexity = 4
+min-name-length = 1
+max-try-body-length = 2
+exps-for-one-empty-line = 1
+show-violation-links = true
+format = wemake
+
+# Black enforces double quotes.
+inline-quotes = double
+
+docstring-convention = google
+
+# Darglint
+docstring_style = google
+strictness = long
+
+nested-classes-whitelist =
+ Meta
+ Params
+ Config
+
+allowed-domain-names =
+ data
+ utils
+ util
+ params
+
+per-file-ignores =
+ src/*/_version.py:WPS410
+ src/**/__init__.py:D,F401,WPS436
+ tests/*:D,F401,WPS118,WPS202,WPS204,WPS214,WPS218,WPS226,WPS231,WPS232,WPS235,WPS301,WPS432,WPS437,WPS442,S101
+ scripts/update_torch_cuda.py:S404,S603,S607,WPS323,WPS333,WPS432,WPS433,WPS459
+
+extend-exclude=
+ .venv/,
+ *_cache/,
+ .cache/,
+ logs/,
+ storage/,
+ docs/,
+ src/emma_perception/utils/visualizing_image.py
diff --git a/.github/labels.yml b/.github/labels.yml
new file mode 100644
index 0000000..43c77b3
--- /dev/null
+++ b/.github/labels.yml
@@ -0,0 +1,90 @@
+---
+# Labels names are important as they are used by Release Drafter to decide
+# regarding where to record them in changelog or if to skip them.
+#
+# The repository labels will be automatically configured using this file and
+# the GitHub Action https://github.com/marketplace/actions/github-labeler.
+## more info https://github.com/crazy-max/ghaction-github-labeler
+
+# ------------------------- Conventional Commit types ------------------------ #
+# From https://github.com/commitizen/conventional-commit-types/blob/master/index.json
+
+- name: feature
+ description: A new enhancement or feature
+ color: 0A8844
+ from_name: "enhancement"
+
+- name: fix
+ description: A bug fix
+ color: d23832
+ from_name: "bug"
+
+- name: documentation
+ description: Documentation changes only
+ color: 8AD9F5
+
+- name: style
+ description: Changes that do not affect meaning of code (formatting, etc.)
+ color: F9CD8E
+
+- name: refactor
+ description: Code change that neither fixes a bug nor adds a feature
+ color: FBCA0C
+ from_name: refactoring
+
+- name: performance
+ description: Code change that improves performance
+ color: F2A33C
+
+- name: test
+ description: Adding missing tests or correcting existing tests
+ color: 34FFB3
+
+- name: build
+ description: Changes that affect the build system or external dependencies
+ color: 8F4FBB
+
+- name: continuous integration
+ description: Changes to CI configuration and scripts
+ color: FCBFE3
+
+- name: chore
+ description: Other changes that don't modify src or test files
+ color: d3d3d3
+
+- name: revert
+ description: Revert a previous commit
+ color: 1e1e1e
+
+- name: backwards incompatible
+ description: incompatible changes to how the application works
+ color: AB2232
+
+- name: question
+ description: Further information is requested
+ color: EE328E
+
+# ------------------------------- Dependencies ------------------------------- #
+- name: dependencies
+ description: Pull requests that update dependencies
+ color: 0366d6
+
+# ------------------------------ Utility labels ------------------------------ #
+- name: automerge
+ color: "ffffff"
+ description: "Automerge this PR"
+
+- name: "stale"
+ color: "ffffff"
+ description: ""
+# - name: duplicate
+# description: This issue or pull request already exists
+# color: ffffff
+
+# - name: invalid
+# description: This doesn't seem right
+# color: ffffff
+
+# - name: wontfix
+# description: This will not be worked on
+# color: ffffff
diff --git a/.github/workflows/build-image.yml b/.github/workflows/build-image.yml
new file mode 100644
index 0000000..3ea25ea
--- /dev/null
+++ b/.github/workflows/build-image.yml
@@ -0,0 +1,68 @@
+name: Build and push images
+
+on:
+ workflow_call:
+ workflow_dispatch:
+ release:
+ types: [published]
+
+env:
+ PYTHON_VERSION: 3.9
+ REGISTRY: ghcr.io
+ BASE_IMAGE: emma-heriot-watt/base:latest
+ BUILDER_IMAGE: emma-heriot-watt/builder:latest
+ REPOSITORY: emma-heriot-watt/perception
+
+jobs:
+ build_image:
+ name: Build and push image
+ runs-on: ubuntu-latest
+ strategy:
+ matrix:
+ torch_version_suffix: ["", "+cu113"]
+
+ permissions:
+ contents: read
+ packages: write
+
+ steps:
+ - name: Check out the repository
+ uses: actions/checkout@v4
+
+ - name: Define image suffix
+ id: image-tag
+ env:
+ TORCH_VERSION_SUFFIX: ${{ matrix.torch_version_suffix }}
+ run: |
+ if [ -z "$TORCH_VERSION_SUFFIX" ]; then
+ TORCH_VERSION_SUFFIX="+cpu"
+ fi
+ IMAGE_TAG=$(echo "$TORCH_VERSION_SUFFIX" | tr -d "+")
+ echo "tag=$IMAGE_TAG" >> "$GITHUB_OUTPUT"
+
+ - name: Log in to the Container registry
+ uses: docker/login-action@v3
+ with:
+ registry: ${{ env.REGISTRY }}
+ username: ${{ github.actor }}
+ password: ${{ secrets.GITHUB_TOKEN }}
+
+ - name: Extract metadata (tags, labels) for Docker
+ id: meta
+ uses: docker/metadata-action@v5
+ with:
+ images: ${{ env.REGISTRY }}/${{ env.REPOSITORY }}
+ tags: |
+ ${{ steps.image-tag.outputs.tag }}
+
+ - name: Build and push image
+ uses: docker/build-push-action@v5
+ with:
+ context: .
+ push: true
+ tags: ${{ steps.meta.outputs.tags }}
+ labels: ${{ steps.meta.outputs.labels }}
+ build-args: |
+ BASE_IMAGE_NAME=${{ env.REGISTRY }}/${{ env.BASE_IMAGE }}
+ BUILDER_IMAGE_NAME=${{ env.REGISTRY }}/${{ env.BUILDER_IMAGE }}
+ TORCH_VERSION_SUFFIX=${{ matrix.torch_version_suffix }}
diff --git a/.github/workflows/continuous_integration.yml b/.github/workflows/continuous_integration.yml
new file mode 100644
index 0000000..67bd6ff
--- /dev/null
+++ b/.github/workflows/continuous_integration.yml
@@ -0,0 +1,169 @@
+name: Continuous Integration
+
+on:
+ workflow_dispatch:
+ workflow_call:
+ pull_request:
+ types: [opened, reopened, synchronize, ready_for_review]
+ branches: [main]
+
+env:
+ PYTHON_VERSION: 3.9
+
+jobs:
+ changes:
+ name: Check for Python file changes
+ runs-on: ubuntu-latest
+ if: ${{ !github.event.pull_request.draft }}
+ outputs:
+ python: ${{steps.filter.outputs.python}}
+ steps:
+ - name: Checkout repository
+ uses: actions/checkout@v3
+ - uses: dorny/paths-filter@v2
+ id: filter
+ with:
+ filters: |
+ python:
+ - '**/*.py'
+ - 'pyproject.toml'
+ - 'poetry.lock'
+ - '.github/workflows/continuous_integration.yml'
+ - '.mypy.ini'
+ - '.flake8'
+
+ typecheck:
+ name: Type check Python
+ needs: [changes]
+ if: ${{needs.changes.outputs.python == 'true' && !github.event.pull_request.draft }}
+ runs-on: ubuntu-latest
+ steps:
+ - name: Checkout the repository
+ uses: actions/checkout@v4
+
+ - name: Setup reviewdog
+ uses: reviewdog/action-setup@v1
+
+ - name: Install Poetry
+ run: pipx install poetry
+
+ - name: Set up Python ${{ env.PYTHON_VERSION }}
+ uses: actions/setup-python@v4
+ with:
+ python-version: ${{ env.PYTHON_VERSION }}
+ cache: "poetry"
+
+ - name: Install dependencies
+ run: poetry install
+
+ - name: Load mypy cache
+ uses: actions/cache@v3
+ id: mypy-cache
+ with:
+ path: .mypy_cache
+ key: ${{ runner.os }}-mypy-cache-${{ hashFiles('poetry.lock') }}-${{hashFiles('pyproject.toml') }}
+ restore-keys: |
+ ${{ runner.os }}-mypy-cache-${{ hashFiles('poetry.lock') }}-${{hashFiles('pyproject.toml') }}
+ ${{ runner.os }}-mypy-cache-
+
+ - name: Run mypy with reviewdog
+ env:
+ REVIEWDOG_GITHUB_API_TOKEN: ${{ secrets.GITHUB_TOKEN }}
+ GITHUB_EVENT_NAME: ${{ github.event_name }}
+ run: |
+ exit_val="0"
+ [[ $GITHUB_EVENT_NAME == "pull_request" ]] && reporter="github-pr-review" || reporter="github-check"
+ poetry run mypy \
+ --show-column-numbers \
+ --show-absolute-path \
+ --no-error-summary . 2>&1 | reviewdog \
+ -efm="%f:%l:%c: %t%*[^:]: %m" \
+ -name="mypy" \
+ -filter-mode=nofilter \
+ -fail-on-error \
+ -reporter="${reporter}" || exit_val="$?"
+ if [[ "${exit_val}" -ne '0' ]]; then
+ exit 1
+ fi
+
+ lint:
+ name: Lint Python
+ needs: [changes]
+ if: ${{needs.changes.outputs.python == 'true' && !github.event.pull_request.draft }}
+ runs-on: ubuntu-latest
+ steps:
+ - name: Checkout repository
+ uses: actions/checkout@v4
+
+ - name: Setup reviewdog
+ uses: reviewdog/action-setup@v1
+
+ - name: Install Poetry
+ run: pipx install poetry
+
+ - name: Set up Python ${{ env.PYTHON_VERSION }}
+ uses: actions/setup-python@v4
+ with:
+ python-version: ${{ env.PYTHON_VERSION }}
+ cache: "poetry"
+
+ - name: Install dependencies
+ run: poetry install
+
+ - name: Run flake8
+ env:
+ REVIEWDOG_GITHUB_API_TOKEN: ${{ secrets.GITHUB_TOKEN }}
+ GITHUB_EVENT_NAME: ${{ github.event_name }}
+ run: |
+ exit_val="0"
+ [[ $GITHUB_EVENT_NAME == "pull_request" ]] && reporter="github-pr-review" || reporter="github-check"
+ poetry run flake8 \
+ --format=default . 2>&1 | reviewdog \
+ -f=pep8 \
+ -name="flake8" \
+ -fail-on-error \
+ -filter-mode=file \
+ -reporter="${reporter}" || exit_val="$?"
+ if [[ "${exit_val}" -ne '0' ]]; then
+ exit 1
+ fi
+
+ format:
+ name: Format
+ runs-on: ubuntu-latest
+ if: ${{ !github.event.pull_request.draft }}
+ steps:
+ - name: Checkout repository
+ uses: actions/checkout@v4
+
+ - name: Set up Python ${{ env.PYTHON_VERSION }}
+ uses: actions/setup-python@v4
+ with:
+ python-version: ${{ env.PYTHON_VERSION }}
+ cache: "pip"
+
+ - name: Install pre-commit
+ run: |
+ pip install pre-commit
+
+ - name: Load cached pre-commit environment
+ uses: actions/cache@v3
+ id: pre-commit-cache
+ with:
+ path: ~/.cache/pre-commit
+ key: ${{ runner.os }}-pre-commit-${{ hashFiles('**/.pre-commit-config.yaml') }}
+ restore-keys: |
+ ${{ runner.os }}-pre-commit-
+
+ - name: Run pre-commit hook
+ id: run-pre-commit-hooks
+ run: |
+ git add .pre-commit-config.yaml
+ pre-commit run --color=always --all-files
+
+ - name: Annotate any changes using reviewdog
+ if: ${{ failure() }}
+ id: reviewdog-suggester
+ uses: reviewdog/action-suggester@v1
+ with:
+ tool_name: pre-commit
diff --git a/.github/workflows/pr-lint.yml b/.github/workflows/pr-lint.yml
new file mode 100644
index 0000000..2c917a9
--- /dev/null
+++ b/.github/workflows/pr-lint.yml
@@ -0,0 +1,42 @@
+name: "Lint PR"
+
+on:
+ pull_request_target:
+ types:
+ - opened
+ - edited
+ - synchronize
+
+jobs:
+ main:
+ name: Validate PR title
+ runs-on: ubuntu-latest
+ steps:
+ - name: Validate PR title
+ uses: amannn/action-semantic-pull-request@v5
+ id: lint_pr_title
+ env:
+ GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
+
+ # When the previous steps fails, the workflow would stop. By adding this
+ # condition you can continue the execution with the populated error message.
+ - name: Create error message if validation fails
+ uses: marocchino/sticky-pull-request-comment@v2
+ if: always() && (steps.lint_pr_title.outputs.error_message != null)
+ with:
+ header: pr-title-lint-error
+ message: |
+ Hey there and thank you for opening this pull request! 👋🏼
+ We require pull request titles to follow the [Conventional Commits specification](https://www.conventionalcommits.org/en/v1.0.0/) and it looks like your proposed title needs to be adjusted.
+
+ Details:
+ ```
+ ${{ steps.lint_pr_title.outputs.error_message }}
+ ```
+
+ - name: Delete previous comment when issue is resolved
+ if: ${{ steps.lint_pr_title.outputs.error_message == null }}
+ uses: marocchino/sticky-pull-request-comment@v2
+ with:
+ header: pr-title-lint-error
+ delete: true
diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml
new file mode 100644
index 0000000..045e5d6
--- /dev/null
+++ b/.github/workflows/release.yml
@@ -0,0 +1,35 @@
+name: Releases
+
+on:
+ push:
+ branches: [main]
+
+env:
+ PYTHON_VERSION: 3.9
+
+jobs:
+ labeler:
+ name: Update labels
+ runs-on: ubuntu-latest
+ steps:
+ - name: Check out the repository
+ uses: actions/checkout@v3
+
+ - name: Run Labeler
+ uses: crazy-max/ghaction-github-labeler@v4.1.0
+
+ continuous-integration:
+ name: Continuous Integration
+ uses: "./.github/workflows/continuous_integration.yml"
+ secrets: inherit
+
+ tests:
+ name: Tests
+ uses: "./.github/workflows/tests.yml"
+ secrets: inherit
+
+ build_image:
+ name: Build image
+ uses: "./.github/workflows/build-image.yml"
+ secrets: inherit
+ needs: [continuous-integration, tests]
diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml
new file mode 100644
index 0000000..76d5b5b
--- /dev/null
+++ b/.github/workflows/tests.yml
@@ -0,0 +1,73 @@
+name: Tests
+
+on:
+ workflow_dispatch:
+ workflow_call:
+ pull_request:
+ branches: [main]
+ paths-ignore: ["**/*.md", "**/*.rst"]
+
+env:
+ PYTHON_VERSION: 3.9
+ # Disable tokenizers parallelism because this doesn't help, and can cause issues in distributed tests.
+ TOKENIZERS_PARALLELISM: "false"
+ # Disable multithreading with OMP because this can lead to dead-locks in distributed tests.
+ OMP_NUM_THREADS: "1"
+ # See https://github.com/pytorch/pytorch/issues/37377#issuecomment-677851112.
+ MKL_THREADING_LAYER: "GNU"
+
+jobs:
+ changes:
+ name: Check for Python file changes
+ runs-on: ubuntu-latest
+ if: ${{ !github.event.pull_request.draft }}
+ outputs:
+ python: ${{steps.filter.outputs.python}}
+ steps:
+ - name: Checkout repository
+ uses: actions/checkout@v3
+ - uses: dorny/paths-filter@v2
+ id: filter
+ with:
+ filters: |
+ python:
+ - '**/*.py'
+ - 'storage/fixtures/**/*'
+ - 'pyproject.toml'
+ - 'poetry.lock'
+ - '.github/workflows/tests.yml'
+
+ python:
+ name: Run Python test suite
+ defaults:
+ run:
+ shell: bash
+
+ runs-on: ubuntu-latest
+ needs: [changes]
+ if: ${{needs.changes.outputs.python == 'true' && !github.event.pull_request.draft }}
+ steps:
+ - name: Checkout the repository
+ uses: actions/checkout@v4
+
+ - name: Install Poetry
+ run: pipx install poetry
+
+ - name: Set up Python ${{ env.PYTHON_VERSION }}
+ uses: actions/setup-python@v4
+ with:
+ python-version: ${{ env.PYTHON_VERSION }}
+ cache: "poetry"
+
+ - name: Install dependencies
+ run: poetry install
+
+ - name: Run test suite
+ run: poetry run poe test-everything | tee pytest-coverage.txt
+
+ - name: Comment the coverage
+ if: ${{ always() && github.event_name == 'pull_request' && github.actor != 'dependabot[bot]' }}
+ uses: MishaKav/pytest-coverage-comment@main
+ with:
+ pytest-coverage-path: ./pytest-coverage.txt
+ junitxml-path: ./pytest.xml
diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..87e11df
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,362 @@
+# Created by https://www.toptal.com/developers/gitignore/api/vscode,python,intellij+all
+# Edit at https://www.toptal.com/developers/gitignore?templates=vscode,python,intellij+all
+
+.rtx.toml
+
+### Intellij+all ###
+# Covers JetBrains IDEs: IntelliJ, RubyMine, PhpStorm, AppCode, PyCharm, CLion, Android Studio, WebStorm and Rider
+# Reference: https://intellij-support.jetbrains.com/hc/en-us/articles/206544839
+
+# User-specific stuff
+.idea/**/workspace.xml
+.idea/**/tasks.xml
+.idea/**/usage.statistics.xml
+.idea/**/dictionaries
+.idea/**/shelf
+
+slurm-*
+
+# Generated files
+.idea/**/contentModel.xml
+
+# Sensitive or high-churn files
+.idea/**/dataSources/
+.idea/**/dataSources.ids
+.idea/**/dataSources.local.xml
+.idea/**/sqlDataSources.xml
+.idea/**/dynamic.xml
+.idea/**/uiDesigner.xml
+.idea/**/dbnavigator.xml
+
+# Gradle
+.idea/**/gradle.xml
+.idea/**/libraries
+
+# Gradle and Maven with auto-import
+# When using Gradle or Maven with auto-import, you should exclude module files,
+# since they will be recreated, and may cause churn. Uncomment if using
+# auto-import.
+.idea/artifacts
+.idea/compiler.xml
+.idea/jarRepositories.xml
+.idea/modules.xml
+.idea/*.iml
+.idea/modules
+*.iml
+*.ipr
+
+# CMake
+cmake-build-*/
+
+# Mongo Explorer plugin
+.idea/**/mongoSettings.xml
+
+# File-based project format
+*.iws
+
+# IntelliJ
+out/
+
+# mpeltonen/sbt-idea plugin
+.idea_modules/
+
+# JIRA plugin
+atlassian-ide-plugin.xml
+
+# Cursive Clojure plugin
+.idea/replstate.xml
+
+# Crashlytics plugin (for Android Studio and IntelliJ)
+com_crashlytics_export_strings.xml
+crashlytics.properties
+crashlytics-build.properties
+fabric.properties
+
+# Editor-based Rest Client
+.idea/httpRequests
+
+# Android studio 3.1+ serialized cache file
+.idea/caches/build_file_checksums.ser
+
+### Intellij+all Patch ###
+# Ignores the whole .idea folder and all .iml files
+# See https://github.com/joeblau/gitignore.io/issues/186 and https://github.com/joeblau/gitignore.io/issues/360
+
+.idea/
+
+# Reason: https://github.com/joeblau/gitignore.io/issues/186#issuecomment-249601023
+
+*.iml
+modules.xml
+.idea/misc.xml
+*.ipr
+
+# Sonarlint plugin
+.idea/sonarlint
+
+### Python ###
+# Byte-compiled / optimized / DLL files
+__pycache__/
+*.py[cod]
+*$py.class
+
+# C extensions
+*.so
+
+# Distribution / packaging
+.Python
+build/
+develop-eggs/
+dist/
+downloads/
+eggs/
+.eggs/
+parts/
+sdist/
+var/
+wheels/
+pip-wheel-metadata/
+share/python-wheels/
+*.egg-info/
+.installed.cfg
+*.egg
+MANIFEST
+
+# PyInstaller
+# Usually these files are written by a python script from a template
+# before PyInstaller builds the exe, so as to inject date/other infos into it.
+*.manifest
+*.spec
+
+# Installer logs
+pip-log.txt
+pip-delete-this-directory.txt
+
+# Unit test / coverage reports
+htmlcov/
+.tox/
+.nox/
+.coverage
+.coverage.*
+.cache
+nosetests.xml
+coverage.xml
+*.cover
+*.py,cover
+.hypothesis/
+.pytest_cache/
+pytestdebug.log
+
+# Translations
+*.mo
+*.pot
+
+# Django stuff:
+*.log
+local_settings.py
+db.sqlite3
+db.sqlite3-journal
+
+# Flask stuff:
+instance/
+.webassets-cache
+
+# Scrapy stuff:
+.scrapy
+
+# Sphinx documentation
+docs/_build/
+doc/_build/
+
+# PyBuilder
+target/
+
+# Jupyter Notebook
+.ipynb_checkpoints
+
+# IPython
+profile_default/
+ipython_config.py
+
+# pyenv
+.python-version
+
+# pipenv
+# According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control.
+# However, in case of collaboration, if having platform-specific dependencies or dependencies
+# having no cross-platform support, pipenv may install dependencies that don't work, or not
+# install all needed dependencies.
+#Pipfile.lock
+
+# PEP 582; used by e.g. github.com/David-OConnor/pyflow
+__pypackages__/
+
+# Celery stuff
+celerybeat-schedule
+celerybeat.pid
+
+# SageMath parsed files
+*.sage.py
+
+# Environments
+.env
+.env/
+.venv/
+env/
+venv/
+ENV/
+env.bak/
+venv.bak/
+pythonenv*
+.autoenv
+.envrc
+
+# Spyder project settings
+.spyderproject
+.spyproject
+
+# Rope project settings
+.ropeproject
+
+# mkdocs documentation
+/site
+
+# mypy
+.mypy_cache/
+.dmypy.json
+dmypy.json
+
+# Pyre type checker
+.pyre/
+
+# pytype static type analyzer
+.pytype/
+
+# operating system-related files
+# file properties cache/storage on macOS
+*.DS_Store
+# thumbnail cache on Windows
+Thumbs.db
+
+# profiling data
+.prof
+
+### vscode ###
+.vscode/*
+!.vscode/recommended-settings.json
+!.vscode/tasks.json
+!.vscode/launch.json
+!.vscode/extensions.json
+*.code-workspace
+
+# Lightning-Hydra-Template
+logs/
+
+# End of https://www.toptal.com/developers/gitignore/api/vscode,python,intellij+all
+
+# Created by https://www.toptal.com/developers/gitignore/api/data,images,video
+# Edit at https://www.toptal.com/developers/gitignore?templates=data,images,video
+
+### Data ###
+# *.csv
+*.dat
+*.efx
+*.gbr
+*.key
+*.pps
+*.ppt
+*.pptx
+*.sdf
+*.tax2010
+*.vcf
+*.xml
+
+### Images ###
+# JPEG
+*.jpg
+*.jpeg
+*.jpe
+*.jif
+*.jfif
+*.jfi
+
+# JPEG 2000
+*.jp2
+*.j2k
+*.jpf
+*.jpx
+*.jpm
+*.mj2
+
+# JPEG XR
+*.jxr
+*.hdp
+*.wdp
+
+# Graphics Interchange Format
+*.gif
+
+# RAW
+*.raw
+
+# Web P
+*.webp
+
+# Portable Network Graphics
+*.png
+
+# Animated Portable Network Graphics
+*.apng
+
+# Multiple-image Network Graphics
+*.mng
+
+# Tagged Image File Format
+*.tiff
+*.tif
+
+# Scalable Vector Graphics
+*.svg
+*.svgz
+
+# Portable Document Format
+*.pdf
+
+# X BitMap
+*.xbm
+
+# BMP
+*.bmp
+*.dib
+
+# ICO
+*.ico
+
+# 3D Images
+*.3dm
+*.max
+
+### Video ###
+*.3g2
+*.3gp
+*.asf
+*.asx
+*.avi
+*.flv
+*.mkv
+*.mov
+*.mp4
+*.mpg
+*.ogv
+*.rm
+*.swf
+*.vob
+*.wmv
+*.webm
+
+# Ignoring storage folder
+storage/*
+!storage/fixtures/
+!storage/constants/
+
+# End of https://www.toptal.com/developers/gitignore/api/data,images,video
diff --git a/.kodiak.toml b/.kodiak.toml
new file mode 100644
index 0000000..de128d4
--- /dev/null
+++ b/.kodiak.toml
@@ -0,0 +1,15 @@
+version = 1
+
+[merge.automerge_dependencies]
+# only auto merge "minor" and "patch" version upgrades.
+# do not automerge "major" version upgrades.
+versions = ["minor", "patch"]
+usernames = ["dependabot"]
+
+# allow dependabot to update and close stale dependency upgrades.
+[update]
+ignored_usernames = ["dependabot"]
+
+# Automatically approve when using automerge label
+[approve]
+auto_approve_usernames = ["dependabot"]
diff --git a/.mypy.ini b/.mypy.ini
new file mode 100644
index 0000000..09e815a
--- /dev/null
+++ b/.mypy.ini
@@ -0,0 +1,40 @@
+[mypy]
+
+python_version = 3.9
+exclude = (?x)(configs | storage | logs | docs | src/emma_perception/utils/visualizing_image.py)
+
+# Import discovery
+ignore_missing_imports = true
+namespace_packages = true
+
+# Untyped definitions and calls
+disallow_untyped_defs = true
+disallow_incomplete_defs = true
+check_untyped_defs = true
+disallow_any_generics = true
+disallow_subclassing_any = true
+disallow_untyped_decorators = false
+
+# None and Optional handling
+no_implicit_optional = true
+
+# Warnings
+warn_redundant_casts = true
+warn_unused_ignores = true
+warn_unused_configs = true
+warn_unreachable = true
+
+# Config error messages
+show_error_context = false
+show_column_numbers = true
+show_error_codes = true
+pretty = false
+
+plugins = pydantic.mypy
+
+[mypy-tests.*]
+disallow_untyped_defs = false
+
+[pydantic-mypy]
+init_typed = true
+warn_untyped_fields = true
diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml
new file mode 100644
index 0000000..ad9b343
--- /dev/null
+++ b/.pre-commit-config.yaml
@@ -0,0 +1,148 @@
+# using default_language_version
+default_language_version:
+ node: 16.14.2
+
+repos:
+ # -------------------------- Version control checks -------------------------- #
+ - repo: https://github.com/pre-commit/pre-commit-hooks
+ rev: v4.5.0
+ hooks:
+ - id: check-merge-conflict
+ name: Check for merge conflicts
+ - id: check-vcs-permalinks
+ name: Ensure links to VCS websites are permalinks
+ - id: detect-private-key
+ name: Detect private key
+ - id: check-case-conflict
+ name: Check issues with file name casing
+ - id: check-symlinks
+ name: Check for symlinks which point to nothing
+ - id: destroyed-symlinks
+ name: Check for destroyed symlinks
+
+ - repo: https://github.com/sirosen/check-jsonschema
+ rev: 0.27.2
+ hooks:
+ - id: check-github-workflows
+ name: Validate GitHub workflows
+ types: [yaml]
+
+ # ----------------------------- Check file issues ---------------------------- #
+ - repo: https://github.com/pre-commit/pre-commit-hooks
+ rev: v4.5.0
+ hooks:
+ - id: check-toml
+ name: Check TOML
+ types: [toml]
+ - id: check-yaml
+ name: Check YAML
+ args: [--allow-multiple-documents]
+ types: [yaml]
+ - id: end-of-file-fixer
+ name: Fix end of files
+ types: [text]
+ - id: trailing-whitespace
+ name: Trim trailing whitespace
+ args: [--markdown-linebreak-ext=md]
+ types: [text]
+ - id: mixed-line-ending
+ name: Check line endings
+ - id: fix-encoding-pragma
+ name: Remove any encoding pragma
+ args: [--remove]
+
+ # ------------------------------ Python checking ----------------------------- #
+ - repo: https://github.com/pre-commit/pre-commit-hooks
+ rev: v4.5.0
+ hooks:
+ - id: debug-statements
+ name: Check for debugger statements
+ types: [python]
+
+ - repo: https://github.com/pre-commit/pygrep-hooks
+ rev: v1.10.0
+ hooks:
+ - id: python-use-type-annotations
+ name: Using type annotations over comments
+ types: [python]
+ - id: python-check-blanket-noqa
+ name: Check for blanket `# noqa`
+ types: [python]
+ - id: python-check-blanket-type-ignore
+ name: "Check for blanket `# type: ignore`"
+ types: [python]
+ - id: python-no-log-warn
+ name: Check for deprecated `.warn()` method of python loggers
+ types: [python]
+
+ # ----------------------------- Automatic linters ---------------------------- #
+ - repo: https://github.com/asottile/pyupgrade
+ rev: v3.15.0
+ hooks:
+ - id: pyupgrade
+ name: Update syntax for newer Python
+ types: [python]
+ args: ["--py39-plus"]
+ - repo: https://github.com/sirosen/texthooks
+ rev: 0.6.3
+ hooks:
+ - id: fix-smartquotes
+ name: Fix Smart Quotes
+ - repo: https://github.com/asottile/yesqa
+ rev: v1.5.0
+ hooks:
+ - id: yesqa
+ name: Remove unnecessary `# noqa` comments
+ types: [python]
+ additional_dependencies: [wemake-python-styleguide]
+
+ # ------------------------------ Python imports ------------------------------ #
+ - repo: https://github.com/hakancelik96/unimport
+ rev: 1.1.0
+ hooks:
+ - id: unimport
+ name: Remove any unused imports
+ types: [python]
+ args:
+ [
+ --remove,
+ --exclude,
+ '^.*/?__init__\.py$',
+ --include-star-import,
+ --gitignore,
+ ]
+ - repo: https://github.com/MarcoGorelli/absolufy-imports
+ rev: v0.3.1
+ hooks:
+ - id: absolufy-imports
+ types: [python]
+ name: Convert relative imports to absolute
+ - repo: https://github.com/timothycrosley/isort
+ rev: 5.12.0
+ hooks:
+ - id: isort
+ name: Format imports
+ additional_dependencies: [toml]
+ types: [python]
+ exclude: ^.*/?setup\.py$
+
+ # -------------------------------- Formatting -------------------------------- #
+ - repo: https://github.com/pre-commit/mirrors-prettier
+ rev: v3.1.0
+ hooks:
+ - id: prettier
+ name: Prettier
+ exclude: ^.*/?CHANGELOG\.md$
+ - repo: https://github.com/myint/docformatter
+ rev: v1.7.5
+ hooks:
+ - id: docformatter
+ name: Format docstrings
+ types: [python]
+ args: [--in-place, --wrap-summaries=99, --wrap-descriptions=99]
+ - repo: https://github.com/psf/black
+ rev: 23.11.0
+ hooks:
+ - id: black-jupyter
+ types: [python]
+ name: Format code
diff --git a/.releaserc.js b/.releaserc.js
new file mode 100644
index 0000000..2dc9cc2
--- /dev/null
+++ b/.releaserc.js
@@ -0,0 +1,70 @@
+const RELEASE_BRANCH = process.env.RELEASE_BRANCH || "main";
+const CHANGELOG_FILE = process.env.CHANGELOG_FILE || "CHANGELOG.md";
+const VERSION_FILE = process.env.VERSION_FILE || "src/*/_version.py";
+
+const config = {
+ branches: [RELEASE_BRANCH],
+ plugins: [
+ [
+ "@semantic-release/commit-analyzer",
+ {
+ preset: "conventionalcommits",
+ },
+ ],
+ [
+ "@semantic-release/release-notes-generator",
+ {
+ preset: "conventionalcommits",
+ },
+ ],
+ [
+ "@semantic-release/changelog",
+ {
+ changelogFile: CHANGELOG_FILE,
+ changelogTitle:
+ "# Changelog\n\nAll notable changes to this project will be documented in this file. See\n[Conventional Commits](https://conventionalcommits.org) for commit guidelines.",
+ },
+ ],
+ [
+ "@semantic-release/exec",
+ {
+ prepareCmd: "poetry version ${nextRelease.version}",
+ },
+ ],
+ [
+ "@google/semantic-release-replace-plugin",
+ {
+ replacements: [
+ {
+ files: [VERSION_FILE],
+ ignore: ["test/*", "tests/*"],
+ from: "__version__ = [\"'].*[\"']",
+ to: '__version__ = "${nextRelease.version}"',
+ },
+ ],
+ },
+ ],
+ [
+ "@semantic-release/github",
+ {
+ assets: [
+ { path: "dist/*.tar.gz", label: "sdist" },
+ { path: "dist/*.whl", label: "wheel" },
+ ],
+ successComment: false,
+ failComment: false,
+ releasedLabels: false,
+ failTitle: false,
+ labels: false,
+ },
+ ],
+ [
+ "@semantic-release/git",
+ {
+ assets: ["pyproject.toml", VERSION_FILE, CHANGELOG_FILE],
+ },
+ ],
+ ],
+};
+
+module.exports = config;
diff --git a/.vscode/extensions.json b/.vscode/extensions.json
new file mode 100644
index 0000000..978576d
--- /dev/null
+++ b/.vscode/extensions.json
@@ -0,0 +1,28 @@
+{
+ "recommendations": [
+ "mikestead.dotenv",
+ "editorconfig.editorconfig",
+ "tamasfe.even-better-toml",
+ "redvanworkshop.explorer-exclude-vscode-extension",
+ "eamodio.gitlens",
+ "nhoizey.gremlins",
+ "ms-toolsai.jupyter",
+ "ms-toolsai.jupyter-keymap",
+ "ms-toolsai.jupyter-renderers",
+ "yzhang.markdown-all-in-one",
+ "christian-kohler.path-intellisense",
+ "ms-python.vscode-pylance",
+ "ms-python.python",
+ "njpwerner.autodocstring",
+ "ms-vscode-remote.remote-containers",
+ "ms-vscode-remote.remote-ssh",
+ "ms-vscode-remote.remote-ssh-edit",
+ "ms-vscode-remote.vscode-remote-extensionpack",
+ "stkb.rewrap",
+ "visualstudioexptteam.vscodeintellicode",
+ "kevinkyang.auto-comment-blocks",
+ "redhat.vscode-yaml",
+ "esbenp.prettier-vscode",
+ "foxundermoon.shell-format"
+ ]
+}
diff --git a/.vscode/launch.json b/.vscode/launch.json
new file mode 100644
index 0000000..ecc4587
--- /dev/null
+++ b/.vscode/launch.json
@@ -0,0 +1,36 @@
+{
+ // Use IntelliSense to learn about possible attributes.
+ // Hover to view descriptions of existing attributes.
+ // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
+ "version": "0.2.0",
+ "configurations": [
+ {
+ "name": "Current file",
+ "type": "python",
+ "request": "launch",
+ "program": "${file}",
+ "console": "integratedTerminal",
+ "justMyCode": false,
+ "subProcess": true
+ },
+ {
+ "name": "Debug Run",
+ "type": "python",
+ "request": "launch",
+ "program": "${workspaceFolder}/run.py",
+ "console": "integratedTerminal",
+ "justMyCode": false,
+ "subProcess": true
+ },
+ {
+ "name": "Debug Tests",
+ "type": "python",
+ "request": "launch",
+ "justMyCode": false,
+ "purpose": ["debug-test"],
+ "env": {
+ "_PYTEST_RAISE": "1"
+ }
+ }
+ ]
+}
diff --git a/.vscode/recommended-settings.json b/.vscode/recommended-settings.json
new file mode 100644
index 0000000..4a43f74
--- /dev/null
+++ b/.vscode/recommended-settings.json
@@ -0,0 +1,81 @@
+{
+ "files.exclude": {
+ "**/.git": true,
+ "**/.svn": true,
+ "**/.hg": true,
+ "**/CVS": true,
+ "**/.DS_Store": true,
+ "**/Thumbs.db": true,
+ "**/.idea": true,
+ "**/LICENSE": true,
+ "**/.rsync-filter": true,
+ "**/.coverage*": true,
+ "**/.hypothesis": true,
+ "**/{*.egg-info,*cache*,.venv,*.lock}": true,
+ "**/{.python-version,py.typed}": true,
+ "**/.gitkeep": true,
+ "**/.gitignore": true,
+ "**/.gitattributes": true,
+ ".editorconfig": true,
+ ".pre-commit-config.yaml": true,
+ ".flake8": true,
+ ".dockerignore": true,
+ "Dockerfile": true,
+ "docker-compose.yaml": true,
+ "docker/": true,
+ "Makefile": true,
+ "pyproject.toml": true,
+ ".env*": true,
+ ".github/": true,
+ "*.md": true,
+ ".vscode/": false,
+ "logs/": true,
+ "data": true,
+ "notebooks": true,
+ "scripts": true
+ },
+ "explorerExclude.backup": null,
+ "editor.wordWrapColumn": 99,
+ "editor.rulers": [99],
+ "python.envFile": "${workspaceFolder}/.env",
+ "terminal.integrated.env.linux": {
+ "PYTHONPATH": "${workspaceFolder}"
+ },
+ "git.ignoreLimitWarning": true,
+ "[json,yaml]": {
+ "editor.defaultFormatter": "esbenp.prettier-vscode",
+ "editor.formatOnSave": true
+ },
+ "[python]": {
+ "editor.defaultFormatter": "ms-python.python",
+ "editor.formatOnPaste": false,
+ "editor.formatOnSave": true,
+ "editor.codeActionsOnSave": {
+ "source.organizeImports": true,
+ "source.fixAll": true
+ }
+ },
+ "python.formatting.provider": "black",
+ "python.sortImports.args": ["--atomic"],
+ "python.linting.enabled": true,
+ "python.linting.lintOnSave": true,
+ "python.linting.pylintEnabled": false,
+ "python.linting.mypyEnabled": true,
+ "python.linting.flake8Enabled": true,
+ "python.linting.pydocstyleEnabled": false,
+ "python.testing.pytestEnabled": true,
+ "python.linting.mypyArgs": ["--show-column-numbers", "--show-error-codes"],
+ "jupyter.jupyterServerType": "local",
+ "jupyter.notebookFileRoot": "${workspaceFolder}",
+ "python.pythonPath": ".venv/bin/python3",
+ "python.testing.unittestEnabled": false,
+ "shellformat.useEditorConfig": true,
+ "python.testing.cwd": "${workspaceFolder}",
+ "cSpell.enabled": true,
+ "rewrap.autoWrap.enabled": true,
+ "editor.insertSpaces": false,
+ "autoDocstring.docstringFormat": "google",
+ "python.testing.pytestArgs": ["tests", "-x"],
+ "editor.bracketPairColorization.enabled": true,
+ "editor.guides.bracketPairs": "active"
+}
diff --git a/CHANGELOG.md b/CHANGELOG.md
new file mode 100644
index 0000000..a367f98
--- /dev/null
+++ b/CHANGELOG.md
@@ -0,0 +1,161 @@
+# Changelog
+
+All notable changes to this project will be documented in this file. See
+[Conventional Commits](https://conventionalcommits.org) for commit guidelines.
+
+## [1.13.0](https://github.com/emma-simbot/perception/compare/v1.12.0...v1.13.0) (2023-04-15)
+
+
+### Features
+
+* new entity clf ([#235](https://github.com/emma-simbot/perception/issues/235)) ([99da0ca](https://github.com/emma-simbot/perception/commit/99da0ca2ff773ece1b344320160d6e4cab0b0a90))
+
+## [1.12.0](https://github.com/emma-simbot/perception/compare/v1.11.0...v1.12.0) (2023-03-13)
+
+
+### Features
+
+* replace knn with mlp entity clf ([#232](https://github.com/emma-simbot/perception/issues/232)) ([65a39ed](https://github.com/emma-simbot/perception/commit/65a39ed36897f6b4e9230ecad9c1ff280223dfac))
+
+## [1.11.0](https://github.com/emma-simbot/perception/compare/v1.10.2...v1.11.0) (2023-03-08)
+
+
+### Features
+
+* knn entity clf ([#230](https://github.com/emma-simbot/perception/issues/230)) ([62e18f6](https://github.com/emma-simbot/perception/commit/62e18f6597bf07164fa96321fb8d1b4f38ac0462))
+
+## [1.10.2](https://github.com/emma-simbot/perception/compare/v1.10.1...v1.10.2) (2023-03-03)
+
+
+### Bug Fixes
+
+* round table is mapped to table entity ([#228](https://github.com/emma-simbot/perception/issues/228)) ([568bd7c](https://github.com/emma-simbot/perception/commit/568bd7cbdb97f40ba7a55a8c0851abd78ccffd4a))
+
+## [1.10.1](https://github.com/emma-simbot/perception/compare/v1.10.0...v1.10.1) (2023-02-17)
+
+
+### Bug Fixes
+
+* place entity classifier on correct device ([#226](https://github.com/emma-simbot/perception/issues/226)) ([5f16fb5](https://github.com/emma-simbot/perception/commit/5f16fb538d36ec7918efe2053cda61be3106f2b0))
+
+## [1.10.0](https://github.com/emma-simbot/perception/compare/v1.9.0...v1.10.0) (2023-02-15)
+
+
+### Features
+
+* optimised perception using torch response ([#224](https://github.com/emma-simbot/perception/issues/224)) ([831c680](https://github.com/emma-simbot/perception/commit/831c6800a8210dfa64ef53d00741c28d912ffbfb))
+
+## [1.9.0](https://github.com/emma-simbot/perception/compare/v1.8.2...v1.9.0) (2023-02-14)
+
+
+### Features
+
+* Include object entities ([#223](https://github.com/emma-simbot/perception/issues/223)) ([c0b9d97](https://github.com/emma-simbot/perception/commit/c0b9d974c9acd0a97e71c7b643e920df9dac50bf))
+
+
+### Bug Fixes
+
+* change endpoints to be non-asynchronous ([#221](https://github.com/emma-simbot/perception/issues/221)) ([57f9668](https://github.com/emma-simbot/perception/commit/57f9668aaa899d5932ff13f3cab629cbc701d220))
+
+## [1.8.2](https://github.com/emma-simbot/perception/compare/v1.8.1...v1.8.2) (2023-01-06)
+
+
+### Bug Fixes
+
+* pin numpy to `<1.24` because deprecations break legacy code ([dfe3b47](https://github.com/emma-simbot/perception/commit/dfe3b47dda8518c3ab9376aba732be8fda6af3f0)), closes [#208](https://github.com/emma-simbot/perception/issues/208)
+
+## [1.8.1](https://github.com/emma-simbot/perception/compare/v1.8.0...v1.8.1) (2023-01-05)
+
+
+### Bug Fixes
+
+* Change response_model to response_class ([#206](https://github.com/emma-simbot/perception/issues/206)) ([75119d8](https://github.com/emma-simbot/perception/commit/75119d89277ad72d5527801f6110e4c074db0438))
+
+## [1.8.0](https://github.com/emma-simbot/perception/compare/v1.7.0...v1.8.0) (2023-01-02)
+
+
+### Features
+
+* **telemetry:** include instrumentation and tracking of metrics for requests and the system ([8ae3643](https://github.com/emma-simbot/perception/commit/8ae3643db9bcb85d3c2ca4b853094da0487a4a5b))
+* **telemetry:** More fine-grained tracing during feature extraction ([0f2b513](https://github.com/emma-simbot/perception/commit/0f2b513a3c045db0c2f35c4493067d3815eb9c1d))
+* use orjson to build response and add tracing ([435e89b](https://github.com/emma-simbot/perception/commit/435e89b47cd40ed8883eb070c434d87c64d365d2))
+
+
+### Bug Fixes
+
+* fastapi ORJSONResponse import ([ab3fe3d](https://github.com/emma-simbot/perception/commit/ab3fe3d912e74299f2336395851f06fcd4d8b9df))
+
+## [1.7.0](https://github.com/emma-simbot/perception/compare/v1.6.1...v1.7.0) (2022-12-23)
+
+
+### Features
+
+* added support for tracing ([#203](https://github.com/emma-simbot/perception/issues/203)) ([7529955](https://github.com/emma-simbot/perception/commit/7529955c3e39101c1618f1499ea5238ebd98d61f))
+
+## [1.6.1](https://github.com/emma-simbot/perception/compare/v1.6.0...v1.6.1) (2022-12-22)
+
+
+### Bug Fixes
+
+* **revert:** using Ray Serve to serve Perception ([#200](https://github.com/emma-simbot/perception/issues/200)) ([#202](https://github.com/emma-simbot/perception/issues/202)) ([3091da6](https://github.com/emma-simbot/perception/commit/3091da6a25ca86cf66281884e73757ab9adb2445))
+
+## [1.6.0](https://github.com/emma-simbot/perception/compare/v1.5.1...v1.6.0) (2022-12-21)
+
+
+### Features
+
+* Using Ray Serve to serve Perception ([#200](https://github.com/emma-simbot/perception/issues/200)) ([e83a960](https://github.com/emma-simbot/perception/commit/e83a9602badbf60df1fc7741a668d2ca34508f3b))
+
+## [1.5.1](https://github.com/emma-simbot/perception/compare/v1.5.0...v1.5.1) (2022-12-20)
+
+
+### Bug Fixes
+
+* revert adding tracing for the feature extractor endpoint ([#198](https://github.com/emma-simbot/perception/issues/198)) ([#199](https://github.com/emma-simbot/perception/issues/199)) ([dcaa484](https://github.com/emma-simbot/perception/commit/dcaa484ac233130f8c809846d00296160e7491ea))
+
+## [1.5.0](https://github.com/emma-simbot/perception/compare/v1.4.0...v1.5.0) (2022-12-20)
+
+
+### Features
+
+* setup tracing for the feature extractor endpoint ([#198](https://github.com/emma-simbot/perception/issues/198)) ([b86065d](https://github.com/emma-simbot/perception/commit/b86065d41435cb943fd14f2e423eabf9ac44482e))
+
+## [1.4.0](https://github.com/emma-simbot/perception/compare/v1.3.0...v1.4.0) (2022-11-28)
+
+
+### Features
+
+* Add simbot custom model config ([#191](https://github.com/emma-simbot/perception/issues/191)) ([1793f33](https://github.com/emma-simbot/perception/commit/1793f33a10c65d542b01f416b2dbfdfb87847ba5))
+
+## [1.3.0](https://github.com/emma-simbot/perception/compare/v1.2.0...v1.3.0) (2022-11-28)
+
+
+### Features
+
+* use custom classmap ([#189](https://github.com/emma-simbot/perception/issues/189)) ([864a274](https://github.com/emma-simbot/perception/commit/864a2749cbb168f96681d8790edbce424b0f0269))
+
+## [1.2.0](https://github.com/emma-simbot/perception/compare/v1.1.0...v1.2.0) (2022-11-19)
+
+
+### Features
+
+* Change simbot classmap path ([#187](https://github.com/emma-simbot/perception/issues/187)) ([66dd978](https://github.com/emma-simbot/perception/commit/66dd9788b67b1f1af372a90973ff1e67c327f0b6))
+
+## [1.1.0](https://github.com/emma-simbot/perception/compare/v1.0.0...v1.1.0) (2022-11-04)
+
+
+### Features
+
+* Update simbot classmap config ([#185](https://github.com/emma-simbot/perception/issues/185)) ([4fbcca7](https://github.com/emma-simbot/perception/commit/4fbcca7dc89f3efccd9104748f624ed4d486a72c))
+
+## 1.0.0 (2022-10-28)
+
+
+### Bug Fixes
+
+* use the request body for updating the model device ([8f83fc6](https://github.com/emma-simbot/perception/commit/8f83fc6567b9a77f739826d14e2f6856deebddfe))
+
+
+### Reverts
+
+* Revert "Build(deps): bump actions/setup-python from 3 to 4 (#152)" (#162) ([ee64b1c](https://github.com/emma-simbot/perception/commit/ee64b1c14e8657e1d0ceb0d1314e2e0db017bbc7)), closes [#152](https://github.com/emma-simbot/perception/issues/152) [#162](https://github.com/emma-simbot/perception/issues/162)
diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md
new file mode 100644
index 0000000..de53d78
--- /dev/null
+++ b/CONTRIBUTING.md
@@ -0,0 +1,148 @@
+# Contributing
+
+- [Quick start](#quick-start)
+- [Installing things](#installing-things)
+ - [Poetry](#poetry)
+ - [Managing Python versions...](#managing-python-versions)
+ - [...with pyenv](#with-pyenv)
+ - [...with Anaconda](#with-anaconda)
+- [Developer tooling](#developer-tooling)
+ - [Code style](#code-style)
+ - [Task runner](#task-runner)
+ - [Formatting](#formatting)
+ - [Linting](#linting)
+ - [Type checking](#type-checking)
+ - [Working with branches](#working-with-branches)
+
+## Quick start
+
+Assuming you have [pyenv](https://github.com/pyenv/pyenv) and [Poetry](https://python-poetry.org/), clone the repository and run:
+
+```bash
+# Use Python 3.9.9 in the project
+pyenv local 3.9.9
+
+# Tell Poetry to use pyenv
+poetry env use $(pyenv which python)
+
+# Install dependencies
+poetry install
+
+# Activate the virtual environment
+poetry shell
+
+# Install pre-commit hooks
+pre-commit install
+```
+
+## Installing things
+
+We've tried to keep necessary things as simplistic as possible. However, we need to install some things.
+
+### Poetry
+
+This project uses Poetry for **creating virtual environments** and **managing Python packages**. This should be installed globally and can be done by running:
+
+```bash
+curl -sSL https://install.python-poetry.org | python3 -
+```
+
+You can verify it's installed and accessible by running `poetry --version`.
+
+Once you've got Poetry installed, we think it's best to install Python dependencies into a `.venv/` folder within the cloned repo. Tell Poetry to handle this for you:
+
+```bash
+poetry config virtualenvs.in-project true
+```
+
+For more on how to manage, add, remove, and update dependencies, see the [official Poetry documentation](https://python-poetry.org/docs/basic-usage/).
+
+### Managing Python versions...
+
+There are two ways of managing your Python environments. We recommend [pyenv](https://github.com/pyenv/pyenv), but we have also included instructions for [Anaconda](https://anaconda.com).
+
+#### ...with pyenv
+
+Install pyenv following the [instructions within the official repo](https://github.com/pyenv/pyenv#installation) for your system. **Remember to do step 2**!
+
+You can verify it's installed with `pyenv --version`.
+
+1. Install the Python version you want with `pyenv install 3.9.9`
+2. Go to the cloned repo
+3. Assign the specific Python version to the project by running `pyenv local 3.9.9`
+
+If you want a different version of Python, just change the version in the steps.
+
+#### ...with Anaconda
+
+Install Anaconda using the [instructions on the official website](https://anaconda.com/).
+
+Then create an environment for your project by running:
+
+```bash
+conda create -n PROJECT_NAME python=3.9
+conda activate PROJECT_NAME
+```
+
+## Developer tooling
+
+- Dependency management with [Poetry](https://python-poetry.org/)
+- Easier task running with [Poe the Poet](https://github.com/nat-n/poethepoet)
+- Code formatting with [Black](https://github.com/psf/black) and [Prettier](https://prettier.io/)
+- Linting with [pre-commit](https://pre-commit.com/) and [Flake8](http://flake8.pycqa.org/), using the strict [wemake-python-styleguide](https://wemake-python-stylegui.de/en/latest/)
+- Automated Python Docstring Formatting with [docformatter](https://github.com/myint/docformatter)
+- Continuous integration with [GitHub Actions](https://github.com/features/actions)
+- Testing with [pytest](https://docs.pytest.org/en/latest/)
+- Code coverage with [coverage.oy](https://coverage.readthedocs.io/)
+- Static type-checking with [mypy](http://mypy-lang.org/)
+- Automated Python syntax updates with [pyupgrade](https://github.com/asottile/pyupgrade)
+- Security audit with [Bandit](https://github.com/PyCQA/bandit)
+- Automated release notes with [Release Drafter](https://github.com/release-drafter/release-drafter)
+- Manage project labels with [GitHub Labeler](https://github.com/marketplace/actions/github-labeler)
+- Automated dependency updates with [Dependabot](https://dependabot.com/)
+
+### Code style
+
+To ensure all code is standardized, we use [black](https://github.com/psf/black), along with other automatic formatters. To enforce a consistent coding style, we use [Flake8](https://flake8.pycqa.org/en/latest/) with the [wemake-python-styleguide](https://wemake-python-stylegui.de/en/latest/). To verify and enforce type annotations, we use [mypy](https://mypy.readthedocs.io/en/stable/). Common tasks can be called using [Poe the Poet](https://github.com/nat-n/poethepoet).
+
+#### Task runner
+
+[Poe the Poet](https://github.com/nat-n/poethepoet) is a task runner that works well with Poetry. To see what tasks exist, run `poe` in your terminal. If you want to add more tasks, check [the documentation](https://github.com/nat-n/poethepoet) and [what already exists](https://github.com/emma-simbot/research-base/blob/main/pyproject.toml).
+
+If you have issues getting `poe` to work, make sure that you are already within the activated shell (by running `poetry shell`).
+
+#### Formatting
+
+If you want to automatically format on every commit, you can use [pre-commit](https://pre-commit.com/). As mentioned above, run `pre-commit install` and it will install the hooks.
+
+To manually format all files, run
+
+```bash
+poe format
+```
+
+#### Linting
+
+If you want to check the linting rules on the codebase, run
+
+```bash
+poe lint
+```
+
+#### Type checking
+
+If you want to check types on the codebase, run
+
+```bash
+poe typecheck
+```
+
+#### Working with branches
+
+We've settled on a middle ground when it comes to developing: **keep the `main` branch clean**.
+
+Within branches, you can do whatever you want to do, but you should **never push anything directly to the `main` branch**.
+
+For every PR, an automated set of linters and formatters will check your code to
+see whether it follows the set rules. If it fails, **do not merge** with the
+`main` branch.
diff --git a/Dockerfile b/Dockerfile
new file mode 100644
index 0000000..86cdb9b
--- /dev/null
+++ b/Dockerfile
@@ -0,0 +1,47 @@
+ARG BUILDER_IMAGE_NAME
+ARG BASE_IMAGE_NAME
+
+# ---------------------------------- Builder --------------------------------- #
+# hadolint ignore=DL3006
+FROM ${BUILDER_IMAGE_NAME} as builder
+
+# Install necessary dependencies for OpenCV
+RUN apt-get update -qq \
+ && apt-get upgrade -y --no-install-recommends \
+ ffmpeg libsm6 libxext6 \
+ && apt-get clean \
+ && rm -rf /var/lib/apt/lists/* \
+ && apt-get autoremove -y
+
+ARG TORCH_VERSION_SUFFIX=""
+
+WORKDIR ${PYSETUP_PATH}/repo
+
+COPY . ${PYSETUP_PATH}/repo
+
+SHELL ["/bin/bash", "-o", "pipefail", "-c"]
+RUN poetry install --only main \
+ && TORCH_VERSION="$(pip show torch | grep Version | cut -d ':' -f2 | xargs)${TORCH_VERSION_SUFFIX}" \
+ && TORCHVISION_VERSION="$(pip show torchvision | grep Version | cut -d ':' -f2 | xargs)${TORCH_VERSION_SUFFIX}" \
+ && pip install --no-cache-dir torch=="${TORCH_VERSION}" torchvision=="${TORCHVISION_VERSION}" -f https://download.pytorch.org/whl/torch_stable.html
+
+# ---------------------------------- Runner ---------------------------------- #
+# hadolint ignore=DL3006
+FROM ${BASE_IMAGE_NAME} as runner
+
+# Install necessary dependencies for OpenCV
+RUN apt-get update -qq \
+ && apt-get upgrade -y --no-install-recommends \
+ ffmpeg libsm6 libxext6 \
+ && apt-get clean \
+ && rm -rf /var/lib/apt/lists/* \
+ && apt-get autoremove -y
+
+COPY --from=builder ${PYSETUP_PATH} ${PYSETUP_PATH}
+
+WORKDIR ${PYSETUP_PATH}/repo
+
+# Set the PYTHONPATH
+ENV PYTHONPATH='./src'
+
+ENTRYPOINT ["/bin/bash"]
diff --git a/README.md b/README.md
new file mode 100644
index 0000000..7578532
--- /dev/null
+++ b/README.md
@@ -0,0 +1,90 @@
+
+
+# EMMA: Perception
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+[![Continuous Integration](https://github.com/emma-heriot-watt/perception/actions/workflows/continuous_integration.yml/badge.svg)](https://github.com/emma-heriot-watt/perception/actions/workflows/continuous_integration.yml)
+[![Tests](https://github.com/emma-heriot-watt/perception/actions/workflows/tests.yml/badge.svg)](https://github.com/emma-heriot-watt/perception/actions/workflows/tests.yml)
+[![Build and push images](https://github.com/emma-heriot-watt/perception/actions/workflows/build-image.yml/badge.svg)](https://github.com/emma-heriot-watt/perception/actions/workflows/build-image.yml)
+
+
+
+> [!IMPORTANT]
+> If you have questions or find bugs or anything, you can contact us in our [organisation's discussion](https://github.com/orgs/emma-heriot-watt/discussions).
+
+## About
+
+This repository holds the object detector and feature extractor for running things. Essentially, this is the model that takes an image and returns a series of features for that image. This repository can be used as a standalone to extract features before running things on policy, or used as an API to extract features during inference.
+
+## Writing code and running things
+
+### Run the server for the [Alexa Arena](https://github.com/amazon-science/alexa-arena)
+
+Running this command as is will automatically download and use the [fine-tuned checkpoint from our HF models repo](https://huggingface.co/emma-heriot-watt/models/blob/main/vinvl_finetune_arena.ckpt) and use the same settings we used when we ran experiments within the [Alexa Arena](https://github.com/amazon-science/alexa-arena).
+
+```bash
+python src/emma_perception/commands/run_server.py
+```
+
+### Extracting features
+
+For training things, we need to extract the features for each image.
+
+Here's the command you can use to extract features from images. Obviously, you can change the paths to the folder of images, and the output dir, and whatever else you want.
+
+```bash
+python src/emma_perception/commands/extract_visual_features.py --images_dir --output_dir
+```
+
+
+argparse
arguments for the command
+
+https://github.com/emma-heriot-watt/perception/blob/e20855aacec2d27f5e2b07254bd42d12e81a52e0/src/emma_perception/commands/extract_visual_features.py#L20-L50
+
+
+
+#### Extracting features for the Alexa Arena
+
+If you want to use the fine-tuned model to extract features with the model we trained on the Alexa Arena, just add `--is_arena` onto the above command. This will automatically download and use the [fine-tuned checkpoint from our HF models repo](https://huggingface.co/emma-heriot-watt/models/blob/main/vinvl_finetune_arena.ckpt) and use the same settings we used when we ran experiments within the Alexa Arena.
+
+### Developer tooling
+
+- Dependency management with [Poetry](https://python-poetry.org/)
+- Easier task running with [Poe the Poet](https://github.com/nat-n/poethepoet)
+- Code formatting with [Black](https://github.com/psf/black) and [Prettier](https://prettier.io/)
+- Linting with [pre-commit](https://pre-commit.com/) and [Flake8](http://flake8.pycqa.org/), using the strict [wemake-python-styleguide](https://wemake-python-stylegui.de/en/latest/)
+- Automated Python Docstring Formatting with [docformatter](https://github.com/myint/docformatter)
+- Continuous integration with [GitHub Actions](https://github.com/features/actions)
+- Testing with [pytest](https://docs.pytest.org/en/latest/)
+- Code coverage with [coverage.py](https://coverage.readthedocs.io/)
+- Static type-checking with [mypy](http://mypy-lang.org/)
+- Automated Python syntax updates with [pyupgrade](https://github.com/asottile/pyupgrade)
+- Security audit with [Bandit](https://github.com/PyCQA/bandit)
+- Manage project labels with [GitHub Labeler](https://github.com/marketplace/actions/github-labeler)
diff --git a/poetry.lock b/poetry.lock
new file mode 100644
index 0000000..08c282b
--- /dev/null
+++ b/poetry.lock
@@ -0,0 +1,5514 @@
+# This file is automatically @generated by Poetry 1.7.1 and should not be changed by hand.
+
+[[package]]
+name = "aiohttp"
+version = "3.9.1"
+description = "Async http client/server framework (asyncio)"
+optional = false
+python-versions = ">=3.8"
+files = [
+ {file = "aiohttp-3.9.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:e1f80197f8b0b846a8d5cf7b7ec6084493950d0882cc5537fb7b96a69e3c8590"},
+ {file = "aiohttp-3.9.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:c72444d17777865734aa1a4d167794c34b63e5883abb90356a0364a28904e6c0"},
+ {file = "aiohttp-3.9.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:9b05d5cbe9dafcdc733262c3a99ccf63d2f7ce02543620d2bd8db4d4f7a22f83"},
+ {file = "aiohttp-3.9.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5c4fa235d534b3547184831c624c0b7c1e262cd1de847d95085ec94c16fddcd5"},
+ {file = "aiohttp-3.9.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:289ba9ae8e88d0ba16062ecf02dd730b34186ea3b1e7489046fc338bdc3361c4"},
+ {file = "aiohttp-3.9.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:bff7e2811814fa2271be95ab6e84c9436d027a0e59665de60edf44e529a42c1f"},
+ {file = "aiohttp-3.9.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:81b77f868814346662c96ab36b875d7814ebf82340d3284a31681085c051320f"},
+ {file = "aiohttp-3.9.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3b9c7426923bb7bd66d409da46c41e3fb40f5caf679da624439b9eba92043fa6"},
+ {file = "aiohttp-3.9.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:8d44e7bf06b0c0a70a20f9100af9fcfd7f6d9d3913e37754c12d424179b4e48f"},
+ {file = "aiohttp-3.9.1-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:22698f01ff5653fe66d16ffb7658f582a0ac084d7da1323e39fd9eab326a1f26"},
+ {file = "aiohttp-3.9.1-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:ca7ca5abfbfe8d39e653870fbe8d7710be7a857f8a8386fc9de1aae2e02ce7e4"},
+ {file = "aiohttp-3.9.1-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:8d7f98fde213f74561be1d6d3fa353656197f75d4edfbb3d94c9eb9b0fc47f5d"},
+ {file = "aiohttp-3.9.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:5216b6082c624b55cfe79af5d538e499cd5f5b976820eac31951fb4325974501"},
+ {file = "aiohttp-3.9.1-cp310-cp310-win32.whl", hash = "sha256:0e7ba7ff228c0d9a2cd66194e90f2bca6e0abca810b786901a569c0de082f489"},
+ {file = "aiohttp-3.9.1-cp310-cp310-win_amd64.whl", hash = "sha256:c7e939f1ae428a86e4abbb9a7c4732bf4706048818dfd979e5e2839ce0159f23"},
+ {file = "aiohttp-3.9.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:df9cf74b9bc03d586fc53ba470828d7b77ce51b0582d1d0b5b2fb673c0baa32d"},
+ {file = "aiohttp-3.9.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:ecca113f19d5e74048c001934045a2b9368d77b0b17691d905af18bd1c21275e"},
+ {file = "aiohttp-3.9.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:8cef8710fb849d97c533f259103f09bac167a008d7131d7b2b0e3a33269185c0"},
+ {file = "aiohttp-3.9.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bea94403a21eb94c93386d559bce297381609153e418a3ffc7d6bf772f59cc35"},
+ {file = "aiohttp-3.9.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:91c742ca59045dce7ba76cab6e223e41d2c70d79e82c284a96411f8645e2afff"},
+ {file = "aiohttp-3.9.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:6c93b7c2e52061f0925c3382d5cb8980e40f91c989563d3d32ca280069fd6a87"},
+ {file = "aiohttp-3.9.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ee2527134f95e106cc1653e9ac78846f3a2ec1004cf20ef4e02038035a74544d"},
+ {file = "aiohttp-3.9.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:11ff168d752cb41e8492817e10fb4f85828f6a0142b9726a30c27c35a1835f01"},
+ {file = "aiohttp-3.9.1-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:b8c3a67eb87394386847d188996920f33b01b32155f0a94f36ca0e0c635bf3e3"},
+ {file = "aiohttp-3.9.1-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:c7b5d5d64e2a14e35a9240b33b89389e0035e6de8dbb7ffa50d10d8b65c57449"},
+ {file = "aiohttp-3.9.1-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:69985d50a2b6f709412d944ffb2e97d0be154ea90600b7a921f95a87d6f108a2"},
+ {file = "aiohttp-3.9.1-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:c9110c06eaaac7e1f5562caf481f18ccf8f6fdf4c3323feab28a93d34cc646bd"},
+ {file = "aiohttp-3.9.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:d737e69d193dac7296365a6dcb73bbbf53bb760ab25a3727716bbd42022e8d7a"},
+ {file = "aiohttp-3.9.1-cp311-cp311-win32.whl", hash = "sha256:4ee8caa925aebc1e64e98432d78ea8de67b2272252b0a931d2ac3bd876ad5544"},
+ {file = "aiohttp-3.9.1-cp311-cp311-win_amd64.whl", hash = "sha256:a34086c5cc285be878622e0a6ab897a986a6e8bf5b67ecb377015f06ed316587"},
+ {file = "aiohttp-3.9.1-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:f800164276eec54e0af5c99feb9494c295118fc10a11b997bbb1348ba1a52065"},
+ {file = "aiohttp-3.9.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:500f1c59906cd142d452074f3811614be04819a38ae2b3239a48b82649c08821"},
+ {file = "aiohttp-3.9.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:0b0a6a36ed7e164c6df1e18ee47afbd1990ce47cb428739d6c99aaabfaf1b3af"},
+ {file = "aiohttp-3.9.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:69da0f3ed3496808e8cbc5123a866c41c12c15baaaead96d256477edf168eb57"},
+ {file = "aiohttp-3.9.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:176df045597e674fa950bf5ae536be85699e04cea68fa3a616cf75e413737eb5"},
+ {file = "aiohttp-3.9.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b796b44111f0cab6bbf66214186e44734b5baab949cb5fb56154142a92989aeb"},
+ {file = "aiohttp-3.9.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f27fdaadce22f2ef950fc10dcdf8048407c3b42b73779e48a4e76b3c35bca26c"},
+ {file = "aiohttp-3.9.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:bcb6532b9814ea7c5a6a3299747c49de30e84472fa72821b07f5a9818bce0f66"},
+ {file = "aiohttp-3.9.1-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:54631fb69a6e44b2ba522f7c22a6fb2667a02fd97d636048478db2fd8c4e98fe"},
+ {file = "aiohttp-3.9.1-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:4b4c452d0190c5a820d3f5c0f3cd8a28ace48c54053e24da9d6041bf81113183"},
+ {file = "aiohttp-3.9.1-cp312-cp312-musllinux_1_1_ppc64le.whl", hash = "sha256:cae4c0c2ca800c793cae07ef3d40794625471040a87e1ba392039639ad61ab5b"},
+ {file = "aiohttp-3.9.1-cp312-cp312-musllinux_1_1_s390x.whl", hash = "sha256:565760d6812b8d78d416c3c7cfdf5362fbe0d0d25b82fed75d0d29e18d7fc30f"},
+ {file = "aiohttp-3.9.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:54311eb54f3a0c45efb9ed0d0a8f43d1bc6060d773f6973efd90037a51cd0a3f"},
+ {file = "aiohttp-3.9.1-cp312-cp312-win32.whl", hash = "sha256:85c3e3c9cb1d480e0b9a64c658cd66b3cfb8e721636ab8b0e746e2d79a7a9eed"},
+ {file = "aiohttp-3.9.1-cp312-cp312-win_amd64.whl", hash = "sha256:11cb254e397a82efb1805d12561e80124928e04e9c4483587ce7390b3866d213"},
+ {file = "aiohttp-3.9.1-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:8a22a34bc594d9d24621091d1b91511001a7eea91d6652ea495ce06e27381f70"},
+ {file = "aiohttp-3.9.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:598db66eaf2e04aa0c8900a63b0101fdc5e6b8a7ddd805c56d86efb54eb66672"},
+ {file = "aiohttp-3.9.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:2c9376e2b09895c8ca8b95362283365eb5c03bdc8428ade80a864160605715f1"},
+ {file = "aiohttp-3.9.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:41473de252e1797c2d2293804e389a6d6986ef37cbb4a25208de537ae32141dd"},
+ {file = "aiohttp-3.9.1-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9c5857612c9813796960c00767645cb5da815af16dafb32d70c72a8390bbf690"},
+ {file = "aiohttp-3.9.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:ffcd828e37dc219a72c9012ec44ad2e7e3066bec6ff3aaa19e7d435dbf4032ca"},
+ {file = "aiohttp-3.9.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:219a16763dc0294842188ac8a12262b5671817042b35d45e44fd0a697d8c8361"},
+ {file = "aiohttp-3.9.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f694dc8a6a3112059258a725a4ebe9acac5fe62f11c77ac4dcf896edfa78ca28"},
+ {file = "aiohttp-3.9.1-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:bcc0ea8d5b74a41b621ad4a13d96c36079c81628ccc0b30cfb1603e3dfa3a014"},
+ {file = "aiohttp-3.9.1-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:90ec72d231169b4b8d6085be13023ece8fa9b1bb495e4398d847e25218e0f431"},
+ {file = "aiohttp-3.9.1-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:cf2a0ac0615842b849f40c4d7f304986a242f1e68286dbf3bd7a835e4f83acfd"},
+ {file = "aiohttp-3.9.1-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:0e49b08eafa4f5707ecfb321ab9592717a319e37938e301d462f79b4e860c32a"},
+ {file = "aiohttp-3.9.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:2c59e0076ea31c08553e868cec02d22191c086f00b44610f8ab7363a11a5d9d8"},
+ {file = "aiohttp-3.9.1-cp38-cp38-win32.whl", hash = "sha256:4831df72b053b1eed31eb00a2e1aff6896fb4485301d4ccb208cac264b648db4"},
+ {file = "aiohttp-3.9.1-cp38-cp38-win_amd64.whl", hash = "sha256:3135713c5562731ee18f58d3ad1bf41e1d8883eb68b363f2ffde5b2ea4b84cc7"},
+ {file = "aiohttp-3.9.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:cfeadf42840c1e870dc2042a232a8748e75a36b52d78968cda6736de55582766"},
+ {file = "aiohttp-3.9.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:70907533db712f7aa791effb38efa96f044ce3d4e850e2d7691abd759f4f0ae0"},
+ {file = "aiohttp-3.9.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:cdefe289681507187e375a5064c7599f52c40343a8701761c802c1853a504558"},
+ {file = "aiohttp-3.9.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d7481f581251bb5558ba9f635db70908819caa221fc79ee52a7f58392778c636"},
+ {file = "aiohttp-3.9.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:49f0c1b3c2842556e5de35f122fc0f0b721334ceb6e78c3719693364d4af8499"},
+ {file = "aiohttp-3.9.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:0d406b01a9f5a7e232d1b0d161b40c05275ffbcbd772dc18c1d5a570961a1ca4"},
+ {file = "aiohttp-3.9.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8d8e4450e7fe24d86e86b23cc209e0023177b6d59502e33807b732d2deb6975f"},
+ {file = "aiohttp-3.9.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3c0266cd6f005e99f3f51e583012de2778e65af6b73860038b968a0a8888487a"},
+ {file = "aiohttp-3.9.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:ab221850108a4a063c5b8a70f00dd7a1975e5a1713f87f4ab26a46e5feac5a0e"},
+ {file = "aiohttp-3.9.1-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:c88a15f272a0ad3d7773cf3a37cc7b7d077cbfc8e331675cf1346e849d97a4e5"},
+ {file = "aiohttp-3.9.1-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:237533179d9747080bcaad4d02083ce295c0d2eab3e9e8ce103411a4312991a0"},
+ {file = "aiohttp-3.9.1-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:02ab6006ec3c3463b528374c4cdce86434e7b89ad355e7bf29e2f16b46c7dd6f"},
+ {file = "aiohttp-3.9.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:04fa38875e53eb7e354ece1607b1d2fdee2d175ea4e4d745f6ec9f751fe20c7c"},
+ {file = "aiohttp-3.9.1-cp39-cp39-win32.whl", hash = "sha256:82eefaf1a996060602f3cc1112d93ba8b201dbf5d8fd9611227de2003dddb3b7"},
+ {file = "aiohttp-3.9.1-cp39-cp39-win_amd64.whl", hash = "sha256:9b05d33ff8e6b269e30a7957bd3244ffbce2a7a35a81b81c382629b80af1a8bf"},
+ {file = "aiohttp-3.9.1.tar.gz", hash = "sha256:8fc49a87ac269d4529da45871e2ffb6874e87779c3d0e2ccd813c0899221239d"},
+]
+
+[package.dependencies]
+aiosignal = ">=1.1.2"
+async-timeout = {version = ">=4.0,<5.0", markers = "python_version < \"3.11\""}
+attrs = ">=17.3.0"
+frozenlist = ">=1.1.1"
+multidict = ">=4.5,<7.0"
+yarl = ">=1.0,<2.0"
+
+[package.extras]
+speedups = ["Brotli", "aiodns", "brotlicffi"]
+
+[[package]]
+name = "aiosignal"
+version = "1.3.1"
+description = "aiosignal: a list of registered asynchronous callbacks"
+optional = false
+python-versions = ">=3.7"
+files = [
+ {file = "aiosignal-1.3.1-py3-none-any.whl", hash = "sha256:f8376fb07dd1e86a584e4fcdec80b36b7f81aac666ebc724e2c090300dd83b17"},
+ {file = "aiosignal-1.3.1.tar.gz", hash = "sha256:54cd96e15e1649b75d6c87526a6ff0b6c1b0dd3459f43d9ca11d48c339b68cfc"},
+]
+
+[package.dependencies]
+frozenlist = ">=1.1.0"
+
+[[package]]
+name = "anyio"
+version = "4.1.0"
+description = "High level compatibility layer for multiple asynchronous event loop implementations"
+optional = false
+python-versions = ">=3.8"
+files = [
+ {file = "anyio-4.1.0-py3-none-any.whl", hash = "sha256:56a415fbc462291813a94528a779597226619c8e78af7de0507333f700011e5f"},
+ {file = "anyio-4.1.0.tar.gz", hash = "sha256:5a0bec7085176715be77df87fc66d6c9d70626bd752fcc85f57cdbee5b3760da"},
+]
+
+[package.dependencies]
+exceptiongroup = {version = ">=1.0.2", markers = "python_version < \"3.11\""}
+idna = ">=2.8"
+sniffio = ">=1.1"
+
+[package.extras]
+doc = ["Sphinx (>=7)", "packaging", "sphinx-autodoc-typehints (>=1.2.0)", "sphinx-rtd-theme"]
+test = ["anyio[trio]", "coverage[toml] (>=7)", "exceptiongroup (>=1.2.0)", "hypothesis (>=4.0)", "psutil (>=5.9)", "pytest (>=7.0)", "pytest-mock (>=3.6.1)", "trustme", "uvloop (>=0.17)"]
+trio = ["trio (>=0.23)"]
+
+[[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 = "appnope"
+version = "0.1.3"
+description = "Disable App Nap on macOS >= 10.9"
+optional = false
+python-versions = "*"
+files = [
+ {file = "appnope-0.1.3-py2.py3-none-any.whl", hash = "sha256:265a455292d0bd8a72453494fa24df5a11eb18373a60c7c0430889f22548605e"},
+ {file = "appnope-0.1.3.tar.gz", hash = "sha256:02bd91c4de869fbb1e1c50aafc4098827a7a54ab2f39d9dcba6c9547ed920e24"},
+]
+
+[[package]]
+name = "argon2-cffi"
+version = "23.1.0"
+description = "Argon2 for Python"
+optional = false
+python-versions = ">=3.7"
+files = [
+ {file = "argon2_cffi-23.1.0-py3-none-any.whl", hash = "sha256:c670642b78ba29641818ab2e68bd4e6a78ba53b7eff7b4c3815ae16abf91c7ea"},
+ {file = "argon2_cffi-23.1.0.tar.gz", hash = "sha256:879c3e79a2729ce768ebb7d36d4609e3a78a4ca2ec3a9f12286ca057e3d0db08"},
+]
+
+[package.dependencies]
+argon2-cffi-bindings = "*"
+
+[package.extras]
+dev = ["argon2-cffi[tests,typing]", "tox (>4)"]
+docs = ["furo", "myst-parser", "sphinx", "sphinx-copybutton", "sphinx-notfound-page"]
+tests = ["hypothesis", "pytest"]
+typing = ["mypy"]
+
+[[package]]
+name = "argon2-cffi-bindings"
+version = "21.2.0"
+description = "Low-level CFFI bindings for Argon2"
+optional = false
+python-versions = ">=3.6"
+files = [
+ {file = "argon2-cffi-bindings-21.2.0.tar.gz", hash = "sha256:bb89ceffa6c791807d1305ceb77dbfacc5aa499891d2c55661c6459651fc39e3"},
+ {file = "argon2_cffi_bindings-21.2.0-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:ccb949252cb2ab3a08c02024acb77cfb179492d5701c7cbdbfd776124d4d2367"},
+ {file = "argon2_cffi_bindings-21.2.0-cp36-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9524464572e12979364b7d600abf96181d3541da11e23ddf565a32e70bd4dc0d"},
+ {file = "argon2_cffi_bindings-21.2.0-cp36-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b746dba803a79238e925d9046a63aa26bf86ab2a2fe74ce6b009a1c3f5c8f2ae"},
+ {file = "argon2_cffi_bindings-21.2.0-cp36-abi3-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:58ed19212051f49a523abb1dbe954337dc82d947fb6e5a0da60f7c8471a8476c"},
+ {file = "argon2_cffi_bindings-21.2.0-cp36-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:bd46088725ef7f58b5a1ef7ca06647ebaf0eb4baff7d1d0d177c6cc8744abd86"},
+ {file = "argon2_cffi_bindings-21.2.0-cp36-abi3-musllinux_1_1_i686.whl", hash = "sha256:8cd69c07dd875537a824deec19f978e0f2078fdda07fd5c42ac29668dda5f40f"},
+ {file = "argon2_cffi_bindings-21.2.0-cp36-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:f1152ac548bd5b8bcecfb0b0371f082037e47128653df2e8ba6e914d384f3c3e"},
+ {file = "argon2_cffi_bindings-21.2.0-cp36-abi3-win32.whl", hash = "sha256:603ca0aba86b1349b147cab91ae970c63118a0f30444d4bc80355937c950c082"},
+ {file = "argon2_cffi_bindings-21.2.0-cp36-abi3-win_amd64.whl", hash = "sha256:b2ef1c30440dbbcba7a5dc3e319408b59676e2e039e2ae11a8775ecf482b192f"},
+ {file = "argon2_cffi_bindings-21.2.0-cp38-abi3-macosx_10_9_universal2.whl", hash = "sha256:e415e3f62c8d124ee16018e491a009937f8cf7ebf5eb430ffc5de21b900dad93"},
+ {file = "argon2_cffi_bindings-21.2.0-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:3e385d1c39c520c08b53d63300c3ecc28622f076f4c2b0e6d7e796e9f6502194"},
+ {file = "argon2_cffi_bindings-21.2.0-pp37-pypy37_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2c3e3cc67fdb7d82c4718f19b4e7a87123caf8a93fde7e23cf66ac0337d3cb3f"},
+ {file = "argon2_cffi_bindings-21.2.0-pp37-pypy37_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6a22ad9800121b71099d0fb0a65323810a15f2e292f2ba450810a7316e128ee5"},
+ {file = "argon2_cffi_bindings-21.2.0-pp37-pypy37_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f9f8b450ed0547e3d473fdc8612083fd08dd2120d6ac8f73828df9b7d45bb351"},
+ {file = "argon2_cffi_bindings-21.2.0-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:93f9bf70084f97245ba10ee36575f0c3f1e7d7724d67d8e5b08e61787c320ed7"},
+ {file = "argon2_cffi_bindings-21.2.0-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:3b9ef65804859d335dc6b31582cad2c5166f0c3e7975f324d9ffaa34ee7e6583"},
+ {file = "argon2_cffi_bindings-21.2.0-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d4966ef5848d820776f5f562a7d45fdd70c2f330c961d0d745b784034bd9f48d"},
+ {file = "argon2_cffi_bindings-21.2.0-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:20ef543a89dee4db46a1a6e206cd015360e5a75822f76df533845c3cbaf72670"},
+ {file = "argon2_cffi_bindings-21.2.0-pp38-pypy38_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ed2937d286e2ad0cc79a7087d3c272832865f779430e0cc2b4f3718d3159b0cb"},
+ {file = "argon2_cffi_bindings-21.2.0-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:5e00316dabdaea0b2dd82d141cc66889ced0cdcbfa599e8b471cf22c620c329a"},
+]
+
+[package.dependencies]
+cffi = ">=1.0.1"
+
+[package.extras]
+dev = ["cogapp", "pre-commit", "pytest", "wheel"]
+tests = ["pytest"]
+
+[[package]]
+name = "arrow"
+version = "1.3.0"
+description = "Better dates & times for Python"
+optional = false
+python-versions = ">=3.8"
+files = [
+ {file = "arrow-1.3.0-py3-none-any.whl", hash = "sha256:c728b120ebc00eb84e01882a6f5e7927a53960aa990ce7dd2b10f39005a67f80"},
+ {file = "arrow-1.3.0.tar.gz", hash = "sha256:d4540617648cb5f895730f1ad8c82a65f2dad0166f57b75f3ca54759c4d67a85"},
+]
+
+[package.dependencies]
+python-dateutil = ">=2.7.0"
+types-python-dateutil = ">=2.8.10"
+
+[package.extras]
+doc = ["doc8", "sphinx (>=7.0.0)", "sphinx-autobuild", "sphinx-autodoc-typehints", "sphinx_rtd_theme (>=1.3.0)"]
+test = ["dateparser (==1.*)", "pre-commit", "pytest", "pytest-cov", "pytest-mock", "pytz (==2021.1)", "simplejson (==3.*)"]
+
+[[package]]
+name = "astor"
+version = "0.8.1"
+description = "Read/rewrite/write Python ASTs"
+optional = false
+python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,>=2.7"
+files = [
+ {file = "astor-0.8.1-py2.py3-none-any.whl", hash = "sha256:070a54e890cefb5b3739d19f30f5a5ec840ffc9c50ffa7d23cc9fc1a38ebbfc5"},
+ {file = "astor-0.8.1.tar.gz", hash = "sha256:6a6effda93f4e1ce9f618779b2dd1d9d84f1e32812c23a29b3fff6fd7f63fa5e"},
+]
+
+[[package]]
+name = "asttokens"
+version = "2.4.1"
+description = "Annotate AST trees with source code positions"
+optional = false
+python-versions = "*"
+files = [
+ {file = "asttokens-2.4.1-py2.py3-none-any.whl", hash = "sha256:051ed49c3dcae8913ea7cd08e46a606dba30b79993209636c4875bc1d637bc24"},
+ {file = "asttokens-2.4.1.tar.gz", hash = "sha256:b03869718ba9a6eb027e134bfdf69f38a236d681c83c160d510768af11254ba0"},
+]
+
+[package.dependencies]
+six = ">=1.12.0"
+
+[package.extras]
+astroid = ["astroid (>=1,<2)", "astroid (>=2,<4)"]
+test = ["astroid (>=1,<2)", "astroid (>=2,<4)", "pytest"]
+
+[[package]]
+name = "async-lru"
+version = "2.0.4"
+description = "Simple LRU cache for asyncio"
+optional = false
+python-versions = ">=3.8"
+files = [
+ {file = "async-lru-2.0.4.tar.gz", hash = "sha256:b8a59a5df60805ff63220b2a0c5b5393da5521b113cd5465a44eb037d81a5627"},
+ {file = "async_lru-2.0.4-py3-none-any.whl", hash = "sha256:ff02944ce3c288c5be660c42dbcca0742b32c3b279d6dceda655190240b99224"},
+]
+
+[package.dependencies]
+typing-extensions = {version = ">=4.0.0", markers = "python_version < \"3.11\""}
+
+[[package]]
+name = "async-timeout"
+version = "4.0.3"
+description = "Timeout context manager for asyncio programs"
+optional = false
+python-versions = ">=3.7"
+files = [
+ {file = "async-timeout-4.0.3.tar.gz", hash = "sha256:4640d96be84d82d02ed59ea2b7105a0f7b33abe8703703cd0ab0bf87c427522f"},
+ {file = "async_timeout-4.0.3-py3-none-any.whl", hash = "sha256:7405140ff1230c310e51dc27b3145b9092d659ce68ff733fb0cefe3ee42be028"},
+]
+
+[[package]]
+name = "attrs"
+version = "23.1.0"
+description = "Classes Without Boilerplate"
+optional = false
+python-versions = ">=3.7"
+files = [
+ {file = "attrs-23.1.0-py3-none-any.whl", hash = "sha256:1f28b4522cdc2fb4256ac1a020c78acf9cba2c6b461ccd2c126f3aa8e8335d04"},
+ {file = "attrs-23.1.0.tar.gz", hash = "sha256:6279836d581513a26f1bf235f9acd333bc9115683f14f7e8fae46c98fc50e015"},
+]
+
+[package.extras]
+cov = ["attrs[tests]", "coverage[toml] (>=5.3)"]
+dev = ["attrs[docs,tests]", "pre-commit"]
+docs = ["furo", "myst-parser", "sphinx", "sphinx-notfound-page", "sphinxcontrib-towncrier", "towncrier", "zope-interface"]
+tests = ["attrs[tests-no-zope]", "zope-interface"]
+tests-no-zope = ["cloudpickle", "hypothesis", "mypy (>=1.1.1)", "pympler", "pytest (>=4.3.0)", "pytest-mypy-plugins", "pytest-xdist[psutil]"]
+
+[[package]]
+name = "babel"
+version = "2.13.1"
+description = "Internationalization utilities"
+optional = false
+python-versions = ">=3.7"
+files = [
+ {file = "Babel-2.13.1-py3-none-any.whl", hash = "sha256:7077a4984b02b6727ac10f1f7294484f737443d7e2e66c5e4380e41a3ae0b4ed"},
+ {file = "Babel-2.13.1.tar.gz", hash = "sha256:33e0952d7dd6374af8dbf6768cc4ddf3ccfefc244f9986d4074704f2fbd18900"},
+]
+
+[package.extras]
+dev = ["freezegun (>=1.0,<2.0)", "pytest (>=6.0)", "pytest-cov"]
+
+[[package]]
+name = "bandit"
+version = "1.7.5"
+description = "Security oriented static analyser for python code."
+optional = false
+python-versions = ">=3.7"
+files = [
+ {file = "bandit-1.7.5-py3-none-any.whl", hash = "sha256:75665181dc1e0096369112541a056c59d1c5f66f9bb74a8d686c3c362b83f549"},
+ {file = "bandit-1.7.5.tar.gz", hash = "sha256:bdfc739baa03b880c2d15d0431b31c658ffc348e907fe197e54e0389dd59e11e"},
+]
+
+[package.dependencies]
+colorama = {version = ">=0.3.9", markers = "platform_system == \"Windows\""}
+GitPython = ">=1.0.1"
+PyYAML = ">=5.3.1"
+rich = "*"
+stevedore = ">=1.20.0"
+
+[package.extras]
+test = ["beautifulsoup4 (>=4.8.0)", "coverage (>=4.5.4)", "fixtures (>=3.0.0)", "flake8 (>=4.0.0)", "pylint (==1.9.4)", "stestr (>=2.5.0)", "testscenarios (>=0.5.0)", "testtools (>=2.3.0)", "tomli (>=1.1.0)"]
+toml = ["tomli (>=1.1.0)"]
+yaml = ["PyYAML"]
+
+[[package]]
+name = "beautifulsoup4"
+version = "4.12.2"
+description = "Screen-scraping library"
+optional = false
+python-versions = ">=3.6.0"
+files = [
+ {file = "beautifulsoup4-4.12.2-py3-none-any.whl", hash = "sha256:bd2520ca0d9d7d12694a53d44ac482d181b4ec1888909b035a3dbf40d0f57d4a"},
+ {file = "beautifulsoup4-4.12.2.tar.gz", hash = "sha256:492bbc69dca35d12daac71c4db1bfff0c876c00ef4a2ffacce226d4638eb72da"},
+]
+
+[package.dependencies]
+soupsieve = ">1.2"
+
+[package.extras]
+html5lib = ["html5lib"]
+lxml = ["lxml"]
+
+[[package]]
+name = "bleach"
+version = "6.1.0"
+description = "An easy safelist-based HTML-sanitizing tool."
+optional = false
+python-versions = ">=3.8"
+files = [
+ {file = "bleach-6.1.0-py3-none-any.whl", hash = "sha256:3225f354cfc436b9789c66c4ee030194bee0568fbf9cbdad3bc8b5c26c5f12b6"},
+ {file = "bleach-6.1.0.tar.gz", hash = "sha256:0a31f1837963c41d46bbf1331b8778e1308ea0791db03cc4e7357b97cf42a8fe"},
+]
+
+[package.dependencies]
+six = ">=1.9.0"
+webencodings = "*"
+
+[package.extras]
+css = ["tinycss2 (>=1.1.0,<1.3)"]
+
+[[package]]
+name = "certifi"
+version = "2023.11.17"
+description = "Python package for providing Mozilla's CA Bundle."
+optional = false
+python-versions = ">=3.6"
+files = [
+ {file = "certifi-2023.11.17-py3-none-any.whl", hash = "sha256:e036ab49d5b79556f99cfc2d9320b34cfbe5be05c5871b51de9329f0603b0474"},
+ {file = "certifi-2023.11.17.tar.gz", hash = "sha256:9b469f3a900bf28dc19b8cfbf8019bf47f7fdd1a65a1d4ffb98fc14166beb4d1"},
+]
+
+[[package]]
+name = "cffi"
+version = "1.16.0"
+description = "Foreign Function Interface for Python calling C code."
+optional = false
+python-versions = ">=3.8"
+files = [
+ {file = "cffi-1.16.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:6b3d6606d369fc1da4fd8c357d026317fbb9c9b75d36dc16e90e84c26854b088"},
+ {file = "cffi-1.16.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:ac0f5edd2360eea2f1daa9e26a41db02dd4b0451b48f7c318e217ee092a213e9"},
+ {file = "cffi-1.16.0-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7e61e3e4fa664a8588aa25c883eab612a188c725755afff6289454d6362b9673"},
+ {file = "cffi-1.16.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a72e8961a86d19bdb45851d8f1f08b041ea37d2bd8d4fd19903bc3083d80c896"},
+ {file = "cffi-1.16.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5b50bf3f55561dac5438f8e70bfcdfd74543fd60df5fa5f62d94e5867deca684"},
+ {file = "cffi-1.16.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7651c50c8c5ef7bdb41108b7b8c5a83013bfaa8a935590c5d74627c047a583c7"},
+ {file = "cffi-1.16.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e4108df7fe9b707191e55f33efbcb2d81928e10cea45527879a4749cbe472614"},
+ {file = "cffi-1.16.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:32c68ef735dbe5857c810328cb2481e24722a59a2003018885514d4c09af9743"},
+ {file = "cffi-1.16.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:673739cb539f8cdaa07d92d02efa93c9ccf87e345b9a0b556e3ecc666718468d"},
+ {file = "cffi-1.16.0-cp310-cp310-win32.whl", hash = "sha256:9f90389693731ff1f659e55c7d1640e2ec43ff725cc61b04b2f9c6d8d017df6a"},
+ {file = "cffi-1.16.0-cp310-cp310-win_amd64.whl", hash = "sha256:e6024675e67af929088fda399b2094574609396b1decb609c55fa58b028a32a1"},
+ {file = "cffi-1.16.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:b84834d0cf97e7d27dd5b7f3aca7b6e9263c56308ab9dc8aae9784abb774d404"},
+ {file = "cffi-1.16.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:1b8ebc27c014c59692bb2664c7d13ce7a6e9a629be20e54e7271fa696ff2b417"},
+ {file = "cffi-1.16.0-cp311-cp311-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ee07e47c12890ef248766a6e55bd38ebfb2bb8edd4142d56db91b21ea68b7627"},
+ {file = "cffi-1.16.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d8a9d3ebe49f084ad71f9269834ceccbf398253c9fac910c4fd7053ff1386936"},
+ {file = "cffi-1.16.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e70f54f1796669ef691ca07d046cd81a29cb4deb1e5f942003f401c0c4a2695d"},
+ {file = "cffi-1.16.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5bf44d66cdf9e893637896c7faa22298baebcd18d1ddb6d2626a6e39793a1d56"},
+ {file = "cffi-1.16.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7b78010e7b97fef4bee1e896df8a4bbb6712b7f05b7ef630f9d1da00f6444d2e"},
+ {file = "cffi-1.16.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:c6a164aa47843fb1b01e941d385aab7215563bb8816d80ff3a363a9f8448a8dc"},
+ {file = "cffi-1.16.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:e09f3ff613345df5e8c3667da1d918f9149bd623cd9070c983c013792a9a62eb"},
+ {file = "cffi-1.16.0-cp311-cp311-win32.whl", hash = "sha256:2c56b361916f390cd758a57f2e16233eb4f64bcbeee88a4881ea90fca14dc6ab"},
+ {file = "cffi-1.16.0-cp311-cp311-win_amd64.whl", hash = "sha256:db8e577c19c0fda0beb7e0d4e09e0ba74b1e4c092e0e40bfa12fe05b6f6d75ba"},
+ {file = "cffi-1.16.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:fa3a0128b152627161ce47201262d3140edb5a5c3da88d73a1b790a959126956"},
+ {file = "cffi-1.16.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:68e7c44931cc171c54ccb702482e9fc723192e88d25a0e133edd7aff8fcd1f6e"},
+ {file = "cffi-1.16.0-cp312-cp312-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:abd808f9c129ba2beda4cfc53bde801e5bcf9d6e0f22f095e45327c038bfe68e"},
+ {file = "cffi-1.16.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:88e2b3c14bdb32e440be531ade29d3c50a1a59cd4e51b1dd8b0865c54ea5d2e2"},
+ {file = "cffi-1.16.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:fcc8eb6d5902bb1cf6dc4f187ee3ea80a1eba0a89aba40a5cb20a5087d961357"},
+ {file = "cffi-1.16.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b7be2d771cdba2942e13215c4e340bfd76398e9227ad10402a8767ab1865d2e6"},
+ {file = "cffi-1.16.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e715596e683d2ce000574bae5d07bd522c781a822866c20495e52520564f0969"},
+ {file = "cffi-1.16.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:2d92b25dbf6cae33f65005baf472d2c245c050b1ce709cc4588cdcdd5495b520"},
+ {file = "cffi-1.16.0-cp312-cp312-win32.whl", hash = "sha256:b2ca4e77f9f47c55c194982e10f058db063937845bb2b7a86c84a6cfe0aefa8b"},
+ {file = "cffi-1.16.0-cp312-cp312-win_amd64.whl", hash = "sha256:68678abf380b42ce21a5f2abde8efee05c114c2fdb2e9eef2efdb0257fba1235"},
+ {file = "cffi-1.16.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:0c9ef6ff37e974b73c25eecc13952c55bceed9112be2d9d938ded8e856138bcc"},
+ {file = "cffi-1.16.0-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a09582f178759ee8128d9270cd1344154fd473bb77d94ce0aeb2a93ebf0feaf0"},
+ {file = "cffi-1.16.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e760191dd42581e023a68b758769e2da259b5d52e3103c6060ddc02c9edb8d7b"},
+ {file = "cffi-1.16.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:80876338e19c951fdfed6198e70bc88f1c9758b94578d5a7c4c91a87af3cf31c"},
+ {file = "cffi-1.16.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a6a14b17d7e17fa0d207ac08642c8820f84f25ce17a442fd15e27ea18d67c59b"},
+ {file = "cffi-1.16.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6602bc8dc6f3a9e02b6c22c4fc1e47aa50f8f8e6d3f78a5e16ac33ef5fefa324"},
+ {file = "cffi-1.16.0-cp38-cp38-win32.whl", hash = "sha256:131fd094d1065b19540c3d72594260f118b231090295d8c34e19a7bbcf2e860a"},
+ {file = "cffi-1.16.0-cp38-cp38-win_amd64.whl", hash = "sha256:31d13b0f99e0836b7ff893d37af07366ebc90b678b6664c955b54561fc36ef36"},
+ {file = "cffi-1.16.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:582215a0e9adbe0e379761260553ba11c58943e4bbe9c36430c4ca6ac74b15ed"},
+ {file = "cffi-1.16.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:b29ebffcf550f9da55bec9e02ad430c992a87e5f512cd63388abb76f1036d8d2"},
+ {file = "cffi-1.16.0-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:dc9b18bf40cc75f66f40a7379f6a9513244fe33c0e8aa72e2d56b0196a7ef872"},
+ {file = "cffi-1.16.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9cb4a35b3642fc5c005a6755a5d17c6c8b6bcb6981baf81cea8bfbc8903e8ba8"},
+ {file = "cffi-1.16.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b86851a328eedc692acf81fb05444bdf1891747c25af7529e39ddafaf68a4f3f"},
+ {file = "cffi-1.16.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c0f31130ebc2d37cdd8e44605fb5fa7ad59049298b3f745c74fa74c62fbfcfc4"},
+ {file = "cffi-1.16.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8f8e709127c6c77446a8c0a8c8bf3c8ee706a06cd44b1e827c3e6a2ee6b8c098"},
+ {file = "cffi-1.16.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:748dcd1e3d3d7cd5443ef03ce8685043294ad6bd7c02a38d1bd367cfd968e000"},
+ {file = "cffi-1.16.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:8895613bcc094d4a1b2dbe179d88d7fb4a15cee43c052e8885783fac397d91fe"},
+ {file = "cffi-1.16.0-cp39-cp39-win32.whl", hash = "sha256:ed86a35631f7bfbb28e108dd96773b9d5a6ce4811cf6ea468bb6a359b256b1e4"},
+ {file = "cffi-1.16.0-cp39-cp39-win_amd64.whl", hash = "sha256:3686dffb02459559c74dd3d81748269ffb0eb027c39a6fc99502de37d501faa8"},
+ {file = "cffi-1.16.0.tar.gz", hash = "sha256:bcb3ef43e58665bbda2fb198698fcae6776483e0c4a631aa5647806c25e02cc0"},
+]
+
+[package.dependencies]
+pycparser = "*"
+
+[[package]]
+name = "cfgv"
+version = "3.4.0"
+description = "Validate configuration and produce human readable error messages."
+optional = false
+python-versions = ">=3.8"
+files = [
+ {file = "cfgv-3.4.0-py2.py3-none-any.whl", hash = "sha256:b7265b1f29fd3316bfcd2b330d63d024f2bfd8bcb8b0272f8e19a504856c48f9"},
+ {file = "cfgv-3.4.0.tar.gz", hash = "sha256:e52591d4c5f5dead8e0f673fb16db7949d2cfb3f7da4582893288f0ded8fe560"},
+]
+
+[[package]]
+name = "charset-normalizer"
+version = "3.3.2"
+description = "The Real First Universal Charset Detector. Open, modern and actively maintained alternative to Chardet."
+optional = false
+python-versions = ">=3.7.0"
+files = [
+ {file = "charset-normalizer-3.3.2.tar.gz", hash = "sha256:f30c3cb33b24454a82faecaf01b19c18562b1e89558fb6c56de4d9118a032fd5"},
+ {file = "charset_normalizer-3.3.2-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:25baf083bf6f6b341f4121c2f3c548875ee6f5339300e08be3f2b2ba1721cdd3"},
+ {file = "charset_normalizer-3.3.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:06435b539f889b1f6f4ac1758871aae42dc3a8c0e24ac9e60c2384973ad73027"},
+ {file = "charset_normalizer-3.3.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:9063e24fdb1e498ab71cb7419e24622516c4a04476b17a2dab57e8baa30d6e03"},
+ {file = "charset_normalizer-3.3.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6897af51655e3691ff853668779c7bad41579facacf5fd7253b0133308cf000d"},
+ {file = "charset_normalizer-3.3.2-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1d3193f4a680c64b4b6a9115943538edb896edc190f0b222e73761716519268e"},
+ {file = "charset_normalizer-3.3.2-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:cd70574b12bb8a4d2aaa0094515df2463cb429d8536cfb6c7ce983246983e5a6"},
+ {file = "charset_normalizer-3.3.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8465322196c8b4d7ab6d1e049e4c5cb460d0394da4a27d23cc242fbf0034b6b5"},
+ {file = "charset_normalizer-3.3.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a9a8e9031d613fd2009c182b69c7b2c1ef8239a0efb1df3f7c8da66d5dd3d537"},
+ {file = "charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:beb58fe5cdb101e3a055192ac291b7a21e3b7ef4f67fa1d74e331a7f2124341c"},
+ {file = "charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:e06ed3eb3218bc64786f7db41917d4e686cc4856944f53d5bdf83a6884432e12"},
+ {file = "charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:2e81c7b9c8979ce92ed306c249d46894776a909505d8f5a4ba55b14206e3222f"},
+ {file = "charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:572c3763a264ba47b3cf708a44ce965d98555f618ca42c926a9c1616d8f34269"},
+ {file = "charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:fd1abc0d89e30cc4e02e4064dc67fcc51bd941eb395c502aac3ec19fab46b519"},
+ {file = "charset_normalizer-3.3.2-cp310-cp310-win32.whl", hash = "sha256:3d47fa203a7bd9c5b6cee4736ee84ca03b8ef23193c0d1ca99b5089f72645c73"},
+ {file = "charset_normalizer-3.3.2-cp310-cp310-win_amd64.whl", hash = "sha256:10955842570876604d404661fbccbc9c7e684caf432c09c715ec38fbae45ae09"},
+ {file = "charset_normalizer-3.3.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:802fe99cca7457642125a8a88a084cef28ff0cf9407060f7b93dca5aa25480db"},
+ {file = "charset_normalizer-3.3.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:573f6eac48f4769d667c4442081b1794f52919e7edada77495aaed9236d13a96"},
+ {file = "charset_normalizer-3.3.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:549a3a73da901d5bc3ce8d24e0600d1fa85524c10287f6004fbab87672bf3e1e"},
+ {file = "charset_normalizer-3.3.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f27273b60488abe721a075bcca6d7f3964f9f6f067c8c4c605743023d7d3944f"},
+ {file = "charset_normalizer-3.3.2-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1ceae2f17a9c33cb48e3263960dc5fc8005351ee19db217e9b1bb15d28c02574"},
+ {file = "charset_normalizer-3.3.2-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:65f6f63034100ead094b8744b3b97965785388f308a64cf8d7c34f2f2e5be0c4"},
+ {file = "charset_normalizer-3.3.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:753f10e867343b4511128c6ed8c82f7bec3bd026875576dfd88483c5c73b2fd8"},
+ {file = "charset_normalizer-3.3.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4a78b2b446bd7c934f5dcedc588903fb2f5eec172f3d29e52a9096a43722adfc"},
+ {file = "charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:e537484df0d8f426ce2afb2d0f8e1c3d0b114b83f8850e5f2fbea0e797bd82ae"},
+ {file = "charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:eb6904c354526e758fda7167b33005998fb68c46fbc10e013ca97f21ca5c8887"},
+ {file = "charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:deb6be0ac38ece9ba87dea880e438f25ca3eddfac8b002a2ec3d9183a454e8ae"},
+ {file = "charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:4ab2fe47fae9e0f9dee8c04187ce5d09f48eabe611be8259444906793ab7cbce"},
+ {file = "charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:80402cd6ee291dcb72644d6eac93785fe2c8b9cb30893c1af5b8fdd753b9d40f"},
+ {file = "charset_normalizer-3.3.2-cp311-cp311-win32.whl", hash = "sha256:7cd13a2e3ddeed6913a65e66e94b51d80a041145a026c27e6bb76c31a853c6ab"},
+ {file = "charset_normalizer-3.3.2-cp311-cp311-win_amd64.whl", hash = "sha256:663946639d296df6a2bb2aa51b60a2454ca1cb29835324c640dafb5ff2131a77"},
+ {file = "charset_normalizer-3.3.2-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:0b2b64d2bb6d3fb9112bafa732def486049e63de9618b5843bcdd081d8144cd8"},
+ {file = "charset_normalizer-3.3.2-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:ddbb2551d7e0102e7252db79ba445cdab71b26640817ab1e3e3648dad515003b"},
+ {file = "charset_normalizer-3.3.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:55086ee1064215781fff39a1af09518bc9255b50d6333f2e4c74ca09fac6a8f6"},
+ {file = "charset_normalizer-3.3.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8f4a014bc36d3c57402e2977dada34f9c12300af536839dc38c0beab8878f38a"},
+ {file = "charset_normalizer-3.3.2-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a10af20b82360ab00827f916a6058451b723b4e65030c5a18577c8b2de5b3389"},
+ {file = "charset_normalizer-3.3.2-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8d756e44e94489e49571086ef83b2bb8ce311e730092d2c34ca8f7d925cb20aa"},
+ {file = "charset_normalizer-3.3.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:90d558489962fd4918143277a773316e56c72da56ec7aa3dc3dbbe20fdfed15b"},
+ {file = "charset_normalizer-3.3.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6ac7ffc7ad6d040517be39eb591cac5ff87416c2537df6ba3cba3bae290c0fed"},
+ {file = "charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:7ed9e526742851e8d5cc9e6cf41427dfc6068d4f5a3bb03659444b4cabf6bc26"},
+ {file = "charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:8bdb58ff7ba23002a4c5808d608e4e6c687175724f54a5dade5fa8c67b604e4d"},
+ {file = "charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_ppc64le.whl", hash = "sha256:6b3251890fff30ee142c44144871185dbe13b11bab478a88887a639655be1068"},
+ {file = "charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_s390x.whl", hash = "sha256:b4a23f61ce87adf89be746c8a8974fe1c823c891d8f86eb218bb957c924bb143"},
+ {file = "charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:efcb3f6676480691518c177e3b465bcddf57cea040302f9f4e6e191af91174d4"},
+ {file = "charset_normalizer-3.3.2-cp312-cp312-win32.whl", hash = "sha256:d965bba47ddeec8cd560687584e88cf699fd28f192ceb452d1d7ee807c5597b7"},
+ {file = "charset_normalizer-3.3.2-cp312-cp312-win_amd64.whl", hash = "sha256:96b02a3dc4381e5494fad39be677abcb5e6634bf7b4fa83a6dd3112607547001"},
+ {file = "charset_normalizer-3.3.2-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:95f2a5796329323b8f0512e09dbb7a1860c46a39da62ecb2324f116fa8fdc85c"},
+ {file = "charset_normalizer-3.3.2-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c002b4ffc0be611f0d9da932eb0f704fe2602a9a949d1f738e4c34c75b0863d5"},
+ {file = "charset_normalizer-3.3.2-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a981a536974bbc7a512cf44ed14938cf01030a99e9b3a06dd59578882f06f985"},
+ {file = "charset_normalizer-3.3.2-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3287761bc4ee9e33561a7e058c72ac0938c4f57fe49a09eae428fd88aafe7bb6"},
+ {file = "charset_normalizer-3.3.2-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:42cb296636fcc8b0644486d15c12376cb9fa75443e00fb25de0b8602e64c1714"},
+ {file = "charset_normalizer-3.3.2-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0a55554a2fa0d408816b3b5cedf0045f4b8e1a6065aec45849de2d6f3f8e9786"},
+ {file = "charset_normalizer-3.3.2-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:c083af607d2515612056a31f0a8d9e0fcb5876b7bfc0abad3ecd275bc4ebc2d5"},
+ {file = "charset_normalizer-3.3.2-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:87d1351268731db79e0f8e745d92493ee2841c974128ef629dc518b937d9194c"},
+ {file = "charset_normalizer-3.3.2-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:bd8f7df7d12c2db9fab40bdd87a7c09b1530128315d047a086fa3ae3435cb3a8"},
+ {file = "charset_normalizer-3.3.2-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:c180f51afb394e165eafe4ac2936a14bee3eb10debc9d9e4db8958fe36afe711"},
+ {file = "charset_normalizer-3.3.2-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:8c622a5fe39a48f78944a87d4fb8a53ee07344641b0562c540d840748571b811"},
+ {file = "charset_normalizer-3.3.2-cp37-cp37m-win32.whl", hash = "sha256:db364eca23f876da6f9e16c9da0df51aa4f104a972735574842618b8c6d999d4"},
+ {file = "charset_normalizer-3.3.2-cp37-cp37m-win_amd64.whl", hash = "sha256:86216b5cee4b06df986d214f664305142d9c76df9b6512be2738aa72a2048f99"},
+ {file = "charset_normalizer-3.3.2-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:6463effa3186ea09411d50efc7d85360b38d5f09b870c48e4600f63af490e56a"},
+ {file = "charset_normalizer-3.3.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:6c4caeef8fa63d06bd437cd4bdcf3ffefe6738fb1b25951440d80dc7df8c03ac"},
+ {file = "charset_normalizer-3.3.2-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:37e55c8e51c236f95b033f6fb391d7d7970ba5fe7ff453dad675e88cf303377a"},
+ {file = "charset_normalizer-3.3.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fb69256e180cb6c8a894fee62b3afebae785babc1ee98b81cdf68bbca1987f33"},
+ {file = "charset_normalizer-3.3.2-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ae5f4161f18c61806f411a13b0310bea87f987c7d2ecdbdaad0e94eb2e404238"},
+ {file = "charset_normalizer-3.3.2-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b2b0a0c0517616b6869869f8c581d4eb2dd83a4d79e0ebcb7d373ef9956aeb0a"},
+ {file = "charset_normalizer-3.3.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:45485e01ff4d3630ec0d9617310448a8702f70e9c01906b0d0118bdf9d124cf2"},
+ {file = "charset_normalizer-3.3.2-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:eb00ed941194665c332bf8e078baf037d6c35d7c4f3102ea2d4f16ca94a26dc8"},
+ {file = "charset_normalizer-3.3.2-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:2127566c664442652f024c837091890cb1942c30937add288223dc895793f898"},
+ {file = "charset_normalizer-3.3.2-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:a50aebfa173e157099939b17f18600f72f84eed3049e743b68ad15bd69b6bf99"},
+ {file = "charset_normalizer-3.3.2-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:4d0d1650369165a14e14e1e47b372cfcb31d6ab44e6e33cb2d4e57265290044d"},
+ {file = "charset_normalizer-3.3.2-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:923c0c831b7cfcb071580d3f46c4baf50f174be571576556269530f4bbd79d04"},
+ {file = "charset_normalizer-3.3.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:06a81e93cd441c56a9b65d8e1d043daeb97a3d0856d177d5c90ba85acb3db087"},
+ {file = "charset_normalizer-3.3.2-cp38-cp38-win32.whl", hash = "sha256:6ef1d82a3af9d3eecdba2321dc1b3c238245d890843e040e41e470ffa64c3e25"},
+ {file = "charset_normalizer-3.3.2-cp38-cp38-win_amd64.whl", hash = "sha256:eb8821e09e916165e160797a6c17edda0679379a4be5c716c260e836e122f54b"},
+ {file = "charset_normalizer-3.3.2-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:c235ebd9baae02f1b77bcea61bce332cb4331dc3617d254df3323aa01ab47bd4"},
+ {file = "charset_normalizer-3.3.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:5b4c145409bef602a690e7cfad0a15a55c13320ff7a3ad7ca59c13bb8ba4d45d"},
+ {file = "charset_normalizer-3.3.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:68d1f8a9e9e37c1223b656399be5d6b448dea850bed7d0f87a8311f1ff3dabb0"},
+ {file = "charset_normalizer-3.3.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:22afcb9f253dac0696b5a4be4a1c0f8762f8239e21b99680099abd9b2b1b2269"},
+ {file = "charset_normalizer-3.3.2-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e27ad930a842b4c5eb8ac0016b0a54f5aebbe679340c26101df33424142c143c"},
+ {file = "charset_normalizer-3.3.2-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1f79682fbe303db92bc2b1136016a38a42e835d932bab5b3b1bfcfbf0640e519"},
+ {file = "charset_normalizer-3.3.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b261ccdec7821281dade748d088bb6e9b69e6d15b30652b74cbbac25e280b796"},
+ {file = "charset_normalizer-3.3.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:122c7fa62b130ed55f8f285bfd56d5f4b4a5b503609d181f9ad85e55c89f4185"},
+ {file = "charset_normalizer-3.3.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:d0eccceffcb53201b5bfebb52600a5fb483a20b61da9dbc885f8b103cbe7598c"},
+ {file = "charset_normalizer-3.3.2-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:9f96df6923e21816da7e0ad3fd47dd8f94b2a5ce594e00677c0013018b813458"},
+ {file = "charset_normalizer-3.3.2-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:7f04c839ed0b6b98b1a7501a002144b76c18fb1c1850c8b98d458ac269e26ed2"},
+ {file = "charset_normalizer-3.3.2-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:34d1c8da1e78d2e001f363791c98a272bb734000fcef47a491c1e3b0505657a8"},
+ {file = "charset_normalizer-3.3.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:ff8fa367d09b717b2a17a052544193ad76cd49979c805768879cb63d9ca50561"},
+ {file = "charset_normalizer-3.3.2-cp39-cp39-win32.whl", hash = "sha256:aed38f6e4fb3f5d6bf81bfa990a07806be9d83cf7bacef998ab1a9bd660a581f"},
+ {file = "charset_normalizer-3.3.2-cp39-cp39-win_amd64.whl", hash = "sha256:b01b88d45a6fcb69667cd6d2f7a9aeb4bf53760d7fc536bf679ec94fe9f3ff3d"},
+ {file = "charset_normalizer-3.3.2-py3-none-any.whl", hash = "sha256:3e4d1f6587322d2788836a99c69062fbb091331ec940e02d12d179c1d53e25fc"},
+]
+
+[[package]]
+name = "cityscapesscripts"
+version = "2.2.1"
+description = "Scripts for the Cityscapes Dataset"
+optional = false
+python-versions = "*"
+files = [
+ {file = "cityscapesScripts-2.2.1-py3-none-any.whl", hash = "sha256:dcf3855a9d76869fa510330871c39f6125989e9d87bf2e3077e6a00432238ce1"},
+ {file = "cityscapesScripts-2.2.1.tar.gz", hash = "sha256:a5b9a67d00258181a692e6e971c73a20d50ab45a1f258d6087667cfb52b36a90"},
+]
+
+[package.dependencies]
+appdirs = "*"
+coloredlogs = "*"
+matplotlib = "*"
+numpy = "*"
+pillow = "*"
+pyquaternion = "*"
+tqdm = "*"
+typing = "*"
+
+[package.extras]
+gui = ["PyQt5"]
+
+[[package]]
+name = "click"
+version = "8.1.7"
+description = "Composable command line interface toolkit"
+optional = false
+python-versions = ">=3.7"
+files = [
+ {file = "click-8.1.7-py3-none-any.whl", hash = "sha256:ae74fb96c20a0277a1d615f1e4d73c8414f5a98db8b799a7931d1582f3390c28"},
+ {file = "click-8.1.7.tar.gz", hash = "sha256:ca9853ad459e787e2192211578cc907e7594e294c7ccc834310722b41b9ca6de"},
+]
+
+[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 = "coloredlogs"
+version = "15.0.1"
+description = "Colored terminal output for Python's logging module"
+optional = false
+python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*"
+files = [
+ {file = "coloredlogs-15.0.1-py2.py3-none-any.whl", hash = "sha256:612ee75c546f53e92e70049c9dbfcc18c935a2b9a53b66085ce9ef6a6e5c0934"},
+ {file = "coloredlogs-15.0.1.tar.gz", hash = "sha256:7c991aa71a4577af2f82600d8f8f3a89f936baeaf9b50a9c197da014e5bf16b0"},
+]
+
+[package.dependencies]
+humanfriendly = ">=9.1"
+
+[package.extras]
+cron = ["capturer (>=2.4)"]
+
+[[package]]
+name = "comm"
+version = "0.2.0"
+description = "Jupyter Python Comm implementation, for usage in ipykernel, xeus-python etc."
+optional = false
+python-versions = ">=3.8"
+files = [
+ {file = "comm-0.2.0-py3-none-any.whl", hash = "sha256:2da8d9ebb8dd7bfc247adaff99f24dce705638a8042b85cb995066793e391001"},
+ {file = "comm-0.2.0.tar.gz", hash = "sha256:a517ea2ca28931c7007a7a99c562a0fa5883cfb48963140cf642c41c948498be"},
+]
+
+[package.dependencies]
+traitlets = ">=4"
+
+[package.extras]
+test = ["pytest"]
+
+[[package]]
+name = "contourpy"
+version = "1.2.0"
+description = "Python library for calculating contours of 2D quadrilateral grids"
+optional = false
+python-versions = ">=3.9"
+files = [
+ {file = "contourpy-1.2.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:0274c1cb63625972c0c007ab14dd9ba9e199c36ae1a231ce45d725cbcbfd10a8"},
+ {file = "contourpy-1.2.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:ab459a1cbbf18e8698399c595a01f6dcc5c138220ca3ea9e7e6126232d102bb4"},
+ {file = "contourpy-1.2.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6fdd887f17c2f4572ce548461e4f96396681212d858cae7bd52ba3310bc6f00f"},
+ {file = "contourpy-1.2.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5d16edfc3fc09968e09ddffada434b3bf989bf4911535e04eada58469873e28e"},
+ {file = "contourpy-1.2.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1c203f617abc0dde5792beb586f827021069fb6d403d7f4d5c2b543d87edceb9"},
+ {file = "contourpy-1.2.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b69303ceb2e4d4f146bf82fda78891ef7bcd80c41bf16bfca3d0d7eb545448aa"},
+ {file = "contourpy-1.2.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:884c3f9d42d7218304bc74a8a7693d172685c84bd7ab2bab1ee567b769696df9"},
+ {file = "contourpy-1.2.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:4a1b1208102be6e851f20066bf0e7a96b7d48a07c9b0cfe6d0d4545c2f6cadab"},
+ {file = "contourpy-1.2.0-cp310-cp310-win32.whl", hash = "sha256:34b9071c040d6fe45d9826cbbe3727d20d83f1b6110d219b83eb0e2a01d79488"},
+ {file = "contourpy-1.2.0-cp310-cp310-win_amd64.whl", hash = "sha256:bd2f1ae63998da104f16a8b788f685e55d65760cd1929518fd94cd682bf03e41"},
+ {file = "contourpy-1.2.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:dd10c26b4eadae44783c45ad6655220426f971c61d9b239e6f7b16d5cdaaa727"},
+ {file = "contourpy-1.2.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:5c6b28956b7b232ae801406e529ad7b350d3f09a4fde958dfdf3c0520cdde0dd"},
+ {file = "contourpy-1.2.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ebeac59e9e1eb4b84940d076d9f9a6cec0064e241818bcb6e32124cc5c3e377a"},
+ {file = "contourpy-1.2.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:139d8d2e1c1dd52d78682f505e980f592ba53c9f73bd6be102233e358b401063"},
+ {file = "contourpy-1.2.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1e9dc350fb4c58adc64df3e0703ab076f60aac06e67d48b3848c23647ae4310e"},
+ {file = "contourpy-1.2.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:18fc2b4ed8e4a8fe849d18dce4bd3c7ea637758c6343a1f2bae1e9bd4c9f4686"},
+ {file = "contourpy-1.2.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:16a7380e943a6d52472096cb7ad5264ecee36ed60888e2a3d3814991a0107286"},
+ {file = "contourpy-1.2.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:8d8faf05be5ec8e02a4d86f616fc2a0322ff4a4ce26c0f09d9f7fb5330a35c95"},
+ {file = "contourpy-1.2.0-cp311-cp311-win32.whl", hash = "sha256:67b7f17679fa62ec82b7e3e611c43a016b887bd64fb933b3ae8638583006c6d6"},
+ {file = "contourpy-1.2.0-cp311-cp311-win_amd64.whl", hash = "sha256:99ad97258985328b4f207a5e777c1b44a83bfe7cf1f87b99f9c11d4ee477c4de"},
+ {file = "contourpy-1.2.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:575bcaf957a25d1194903a10bc9f316c136c19f24e0985a2b9b5608bdf5dbfe0"},
+ {file = "contourpy-1.2.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:9e6c93b5b2dbcedad20a2f18ec22cae47da0d705d454308063421a3b290d9ea4"},
+ {file = "contourpy-1.2.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:464b423bc2a009088f19bdf1f232299e8b6917963e2b7e1d277da5041f33a779"},
+ {file = "contourpy-1.2.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:68ce4788b7d93e47f84edd3f1f95acdcd142ae60bc0e5493bfd120683d2d4316"},
+ {file = "contourpy-1.2.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3d7d1f8871998cdff5d2ff6a087e5e1780139abe2838e85b0b46b7ae6cc25399"},
+ {file = "contourpy-1.2.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6e739530c662a8d6d42c37c2ed52a6f0932c2d4a3e8c1f90692ad0ce1274abe0"},
+ {file = "contourpy-1.2.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:247b9d16535acaa766d03037d8e8fb20866d054d3c7fbf6fd1f993f11fc60ca0"},
+ {file = "contourpy-1.2.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:461e3ae84cd90b30f8d533f07d87c00379644205b1d33a5ea03381edc4b69431"},
+ {file = "contourpy-1.2.0-cp312-cp312-win32.whl", hash = "sha256:1c2559d6cffc94890b0529ea7eeecc20d6fadc1539273aa27faf503eb4656d8f"},
+ {file = "contourpy-1.2.0-cp312-cp312-win_amd64.whl", hash = "sha256:491b1917afdd8638a05b611a56d46587d5a632cabead889a5440f7c638bc6ed9"},
+ {file = "contourpy-1.2.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:5fd1810973a375ca0e097dee059c407913ba35723b111df75671a1976efa04bc"},
+ {file = "contourpy-1.2.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:999c71939aad2780f003979b25ac5b8f2df651dac7b38fb8ce6c46ba5abe6ae9"},
+ {file = "contourpy-1.2.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b7caf9b241464c404613512d5594a6e2ff0cc9cb5615c9475cc1d9b514218ae8"},
+ {file = "contourpy-1.2.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:266270c6f6608340f6c9836a0fb9b367be61dde0c9a9a18d5ece97774105ff3e"},
+ {file = "contourpy-1.2.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:dbd50d0a0539ae2e96e537553aff6d02c10ed165ef40c65b0e27e744a0f10af8"},
+ {file = "contourpy-1.2.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:11f8d2554e52f459918f7b8e6aa20ec2a3bce35ce95c1f0ef4ba36fbda306df5"},
+ {file = "contourpy-1.2.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:ce96dd400486e80ac7d195b2d800b03e3e6a787e2a522bfb83755938465a819e"},
+ {file = "contourpy-1.2.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:6d3364b999c62f539cd403f8123ae426da946e142312a514162adb2addd8d808"},
+ {file = "contourpy-1.2.0-cp39-cp39-win32.whl", hash = "sha256:1c88dfb9e0c77612febebb6ac69d44a8d81e3dc60f993215425b62c1161353f4"},
+ {file = "contourpy-1.2.0-cp39-cp39-win_amd64.whl", hash = "sha256:78e6ad33cf2e2e80c5dfaaa0beec3d61face0fb650557100ee36db808bfa6843"},
+ {file = "contourpy-1.2.0-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:be16975d94c320432657ad2402f6760990cb640c161ae6da1363051805fa8108"},
+ {file = "contourpy-1.2.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b95a225d4948b26a28c08307a60ac00fb8671b14f2047fc5476613252a129776"},
+ {file = "contourpy-1.2.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:0d7e03c0f9a4f90dc18d4e77e9ef4ec7b7bbb437f7f675be8e530d65ae6ef956"},
+ {file = "contourpy-1.2.0.tar.gz", hash = "sha256:171f311cb758de7da13fc53af221ae47a5877be5a0843a9fe150818c51ed276a"},
+]
+
+[package.dependencies]
+numpy = ">=1.20,<2.0"
+
+[package.extras]
+bokeh = ["bokeh", "selenium"]
+docs = ["furo", "sphinx (>=7.2)", "sphinx-copybutton"]
+mypy = ["contourpy[bokeh,docs]", "docutils-stubs", "mypy (==1.6.1)", "types-Pillow"]
+test = ["Pillow", "contourpy[test-no-images]", "matplotlib"]
+test-no-images = ["pytest", "pytest-cov", "pytest-xdist", "wurlitzer"]
+
+[[package]]
+name = "coverage"
+version = "7.3.2"
+description = "Code coverage measurement for Python"
+optional = false
+python-versions = ">=3.8"
+files = [
+ {file = "coverage-7.3.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:d872145f3a3231a5f20fd48500274d7df222e291d90baa2026cc5152b7ce86bf"},
+ {file = "coverage-7.3.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:310b3bb9c91ea66d59c53fa4989f57d2436e08f18fb2f421a1b0b6b8cc7fffda"},
+ {file = "coverage-7.3.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f47d39359e2c3779c5331fc740cf4bce6d9d680a7b4b4ead97056a0ae07cb49a"},
+ {file = "coverage-7.3.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:aa72dbaf2c2068404b9870d93436e6d23addd8bbe9295f49cbca83f6e278179c"},
+ {file = "coverage-7.3.2-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:beaa5c1b4777f03fc63dfd2a6bd820f73f036bfb10e925fce067b00a340d0f3f"},
+ {file = "coverage-7.3.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:dbc1b46b92186cc8074fee9d9fbb97a9dd06c6cbbef391c2f59d80eabdf0faa6"},
+ {file = "coverage-7.3.2-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:315a989e861031334d7bee1f9113c8770472db2ac484e5b8c3173428360a9148"},
+ {file = "coverage-7.3.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:d1bc430677773397f64a5c88cb522ea43175ff16f8bfcc89d467d974cb2274f9"},
+ {file = "coverage-7.3.2-cp310-cp310-win32.whl", hash = "sha256:a889ae02f43aa45032afe364c8ae84ad3c54828c2faa44f3bfcafecb5c96b02f"},
+ {file = "coverage-7.3.2-cp310-cp310-win_amd64.whl", hash = "sha256:c0ba320de3fb8c6ec16e0be17ee1d3d69adcda99406c43c0409cb5c41788a611"},
+ {file = "coverage-7.3.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:ac8c802fa29843a72d32ec56d0ca792ad15a302b28ca6203389afe21f8fa062c"},
+ {file = "coverage-7.3.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:89a937174104339e3a3ffcf9f446c00e3a806c28b1841c63edb2b369310fd074"},
+ {file = "coverage-7.3.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e267e9e2b574a176ddb983399dec325a80dbe161f1a32715c780b5d14b5f583a"},
+ {file = "coverage-7.3.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2443cbda35df0d35dcfb9bf8f3c02c57c1d6111169e3c85fc1fcc05e0c9f39a3"},
+ {file = "coverage-7.3.2-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4175e10cc8dda0265653e8714b3174430b07c1dca8957f4966cbd6c2b1b8065a"},
+ {file = "coverage-7.3.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:0cbf38419fb1a347aaf63481c00f0bdc86889d9fbf3f25109cf96c26b403fda1"},
+ {file = "coverage-7.3.2-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:5c913b556a116b8d5f6ef834038ba983834d887d82187c8f73dec21049abd65c"},
+ {file = "coverage-7.3.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:1981f785239e4e39e6444c63a98da3a1db8e971cb9ceb50a945ba6296b43f312"},
+ {file = "coverage-7.3.2-cp311-cp311-win32.whl", hash = "sha256:43668cabd5ca8258f5954f27a3aaf78757e6acf13c17604d89648ecc0cc66640"},
+ {file = "coverage-7.3.2-cp311-cp311-win_amd64.whl", hash = "sha256:e10c39c0452bf6e694511c901426d6b5ac005acc0f78ff265dbe36bf81f808a2"},
+ {file = "coverage-7.3.2-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:4cbae1051ab791debecc4a5dcc4a1ff45fc27b91b9aee165c8a27514dd160836"},
+ {file = "coverage-7.3.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:12d15ab5833a997716d76f2ac1e4b4d536814fc213c85ca72756c19e5a6b3d63"},
+ {file = "coverage-7.3.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3c7bba973ebee5e56fe9251300c00f1579652587a9f4a5ed8404b15a0471f216"},
+ {file = "coverage-7.3.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:fe494faa90ce6381770746077243231e0b83ff3f17069d748f645617cefe19d4"},
+ {file = "coverage-7.3.2-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f6e9589bd04d0461a417562649522575d8752904d35c12907d8c9dfeba588faf"},
+ {file = "coverage-7.3.2-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:d51ac2a26f71da1b57f2dc81d0e108b6ab177e7d30e774db90675467c847bbdf"},
+ {file = "coverage-7.3.2-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:99b89d9f76070237975b315b3d5f4d6956ae354a4c92ac2388a5695516e47c84"},
+ {file = "coverage-7.3.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:fa28e909776dc69efb6ed975a63691bc8172b64ff357e663a1bb06ff3c9b589a"},
+ {file = "coverage-7.3.2-cp312-cp312-win32.whl", hash = "sha256:289fe43bf45a575e3ab10b26d7b6f2ddb9ee2dba447499f5401cfb5ecb8196bb"},
+ {file = "coverage-7.3.2-cp312-cp312-win_amd64.whl", hash = "sha256:7dbc3ed60e8659bc59b6b304b43ff9c3ed858da2839c78b804973f613d3e92ed"},
+ {file = "coverage-7.3.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:f94b734214ea6a36fe16e96a70d941af80ff3bfd716c141300d95ebc85339738"},
+ {file = "coverage-7.3.2-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:af3d828d2c1cbae52d34bdbb22fcd94d1ce715d95f1a012354a75e5913f1bda2"},
+ {file = "coverage-7.3.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:630b13e3036e13c7adc480ca42fa7afc2a5d938081d28e20903cf7fd687872e2"},
+ {file = "coverage-7.3.2-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c9eacf273e885b02a0273bb3a2170f30e2d53a6d53b72dbe02d6701b5296101c"},
+ {file = "coverage-7.3.2-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d8f17966e861ff97305e0801134e69db33b143bbfb36436efb9cfff6ec7b2fd9"},
+ {file = "coverage-7.3.2-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:b4275802d16882cf9c8b3d057a0839acb07ee9379fa2749eca54efbce1535b82"},
+ {file = "coverage-7.3.2-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:72c0cfa5250f483181e677ebc97133ea1ab3eb68645e494775deb6a7f6f83901"},
+ {file = "coverage-7.3.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:cb536f0dcd14149425996821a168f6e269d7dcd2c273a8bff8201e79f5104e76"},
+ {file = "coverage-7.3.2-cp38-cp38-win32.whl", hash = "sha256:307adb8bd3abe389a471e649038a71b4eb13bfd6b7dd9a129fa856f5c695cf92"},
+ {file = "coverage-7.3.2-cp38-cp38-win_amd64.whl", hash = "sha256:88ed2c30a49ea81ea3b7f172e0269c182a44c236eb394718f976239892c0a27a"},
+ {file = "coverage-7.3.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:b631c92dfe601adf8f5ebc7fc13ced6bb6e9609b19d9a8cd59fa47c4186ad1ce"},
+ {file = "coverage-7.3.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:d3d9df4051c4a7d13036524b66ecf7a7537d14c18a384043f30a303b146164e9"},
+ {file = "coverage-7.3.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5f7363d3b6a1119ef05015959ca24a9afc0ea8a02c687fe7e2d557705375c01f"},
+ {file = "coverage-7.3.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2f11cc3c967a09d3695d2a6f03fb3e6236622b93be7a4b5dc09166a861be6d25"},
+ {file = "coverage-7.3.2-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:149de1d2401ae4655c436a3dced6dd153f4c3309f599c3d4bd97ab172eaf02d9"},
+ {file = "coverage-7.3.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:3a4006916aa6fee7cd38db3bfc95aa9c54ebb4ffbfc47c677c8bba949ceba0a6"},
+ {file = "coverage-7.3.2-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:9028a3871280110d6e1aa2df1afd5ef003bab5fb1ef421d6dc748ae1c8ef2ebc"},
+ {file = "coverage-7.3.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:9f805d62aec8eb92bab5b61c0f07329275b6f41c97d80e847b03eb894f38d083"},
+ {file = "coverage-7.3.2-cp39-cp39-win32.whl", hash = "sha256:d1c88ec1a7ff4ebca0219f5b1ef863451d828cccf889c173e1253aa84b1e07ce"},
+ {file = "coverage-7.3.2-cp39-cp39-win_amd64.whl", hash = "sha256:b4767da59464bb593c07afceaddea61b154136300881844768037fd5e859353f"},
+ {file = "coverage-7.3.2-pp38.pp39.pp310-none-any.whl", hash = "sha256:ae97af89f0fbf373400970c0a21eef5aa941ffeed90aee43650b81f7d7f47637"},
+ {file = "coverage-7.3.2.tar.gz", hash = "sha256:be32ad29341b0170e795ca590e1c07e81fc061cb5b10c74ce7203491484404ef"},
+]
+
+[package.dependencies]
+tomli = {version = "*", optional = true, markers = "python_full_version <= \"3.11.0a6\" and extra == \"toml\""}
+
+[package.extras]
+toml = ["tomli"]
+
+[[package]]
+name = "cycler"
+version = "0.12.1"
+description = "Composable style cycles"
+optional = false
+python-versions = ">=3.8"
+files = [
+ {file = "cycler-0.12.1-py3-none-any.whl", hash = "sha256:85cef7cff222d8644161529808465972e51340599459b8ac3ccbac5a854e0d30"},
+ {file = "cycler-0.12.1.tar.gz", hash = "sha256:88bb128f02ba341da8ef447245a9e138fae777f6a23943da4540077d3601eb1c"},
+]
+
+[package.extras]
+docs = ["ipython", "matplotlib", "numpydoc", "sphinx"]
+tests = ["pytest", "pytest-cov", "pytest-xdist"]
+
+[[package]]
+name = "cython"
+version = "3.0.6"
+description = "The Cython compiler for writing C extensions in the Python language."
+optional = false
+python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*"
+files = [
+ {file = "Cython-3.0.6-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:0fcdfbf6fc7d0bd683d55e617c3d5a5f25b28ce8b405bc1e89054fc7c52a97e5"},
+ {file = "Cython-3.0.6-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ccbee314f8d15ee8ddbe270859dda427e1187123f2c7c41526d1f260eee6c8f7"},
+ {file = "Cython-3.0.6-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:14b992f36ffa1294921fca5f6488ea192fadd75770dc64fa25975379382551e9"},
+ {file = "Cython-3.0.6-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2ca2e90a75d405070f3c41e701bb8005892f14d42322f1d8fd00a61d660bbae7"},
+ {file = "Cython-3.0.6-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:4121c1160bc1bd8828546e8ce45906bd9ff27799d14747ce3fbbc9d67efbb1b8"},
+ {file = "Cython-3.0.6-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:519814b8f80869ee5f9ee2cb2363e5c310067c0298cbea291c556b22da1ef6ae"},
+ {file = "Cython-3.0.6-cp310-cp310-win32.whl", hash = "sha256:b029d8c754ef867ab4d67fc2477dde9782bf0409cb8e4024a7d29cf5aff37530"},
+ {file = "Cython-3.0.6-cp310-cp310-win_amd64.whl", hash = "sha256:2262390f453eedf600e084b074144286576ed2a56bb7fbfe15ad8d9499eceb52"},
+ {file = "Cython-3.0.6-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:dfe8c7ac60363769ed8d91fca26398aaa9640368ab999a79b0ccb5e788d3bcf8"},
+ {file = "Cython-3.0.6-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9e31a9b18ec6ce57eb3479df920e6093596fe4ba8010dcc372720040386b4bdb"},
+ {file = "Cython-3.0.6-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bca2542f1f34f0141475b13777df040c31f2073a055097734a0a793ac3a4fb72"},
+ {file = "Cython-3.0.6-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b24c1c38dad4bd85e142ccbe2f88122807f8d5a75352321e1e4baf2b293df7c6"},
+ {file = "Cython-3.0.6-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:dc4b4e76c1414584bb55465dfb6f41dd6bd27fd53fb41ddfcaca9edf00c1f80e"},
+ {file = "Cython-3.0.6-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:805a2c532feee09aeed064eaeb7b6ee35cbab650569d0a3756975f3cc4f246cf"},
+ {file = "Cython-3.0.6-cp311-cp311-win32.whl", hash = "sha256:dcdb9a177c7c385fe0c0709a9a6790b6508847d67dcac76bb65a2c7ea447efe5"},
+ {file = "Cython-3.0.6-cp311-cp311-win_amd64.whl", hash = "sha256:b8640b7f6503292c358cef925df5a69adf230045719893ffe20ad98024fdf7ae"},
+ {file = "Cython-3.0.6-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:16b3b02cc7b3bc42ee1a0118b1465ca46b0f3fb32d003e6f1a3a352a819bb9a3"},
+ {file = "Cython-3.0.6-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:11e1d9b153573c425846b627bef52b3b99cb73d4fbfbb136e500a878d4b5e803"},
+ {file = "Cython-3.0.6-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:85a7a406f78c2f297bf82136ff5deac3150288446005ed1e56552a9e3ac1469f"},
+ {file = "Cython-3.0.6-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:88be4fbc760de8f313df89ca8256098c0963c9ec72f3aa88538384b80ef1a6ef"},
+ {file = "Cython-3.0.6-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:ea2e5a7c503b41618bfb10e4bc610f780ab1c729280531b5cabb24e05aa21cf2"},
+ {file = "Cython-3.0.6-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:2d296b48e1410cab50220a28a834167f2d7ac6c0e7de12834d66e42248a1b0f6"},
+ {file = "Cython-3.0.6-cp312-cp312-win32.whl", hash = "sha256:7f19e99c6e334e9e30dfa844c3ca4ac09931b94dbba406c646bde54687aed758"},
+ {file = "Cython-3.0.6-cp312-cp312-win_amd64.whl", hash = "sha256:9cae02e26967ffb6503c6e91b77010acbadfb7189a5a11d6158d634fb0f73679"},
+ {file = "Cython-3.0.6-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:cb6a54543869a5b0ad009d86eb0ebc0879fab838392bfd253ad6d4f5e0f17d84"},
+ {file = "Cython-3.0.6-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8d2d9e53bf021cc7a5c7b6b537b5b5a7ba466ba7348d498aa17499d0ad12637e"},
+ {file = "Cython-3.0.6-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:05d15854b2b363b35c755d22015c1c2fc590b8128202f8c9eb85578461101d9c"},
+ {file = "Cython-3.0.6-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e5548316497a3b8b2d9da575ea143476472db90dee73c67def061621940f78ae"},
+ {file = "Cython-3.0.6-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:9b853e0855e4b3d164c05b24718e5e2df369e5af54f47cb8d923c4f497dfc92c"},
+ {file = "Cython-3.0.6-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:2c77f97f462a40a319dda7e28c1669370cb26f9175f3e8f9bab99d2f8f3f2f09"},
+ {file = "Cython-3.0.6-cp36-cp36m-win32.whl", hash = "sha256:3ac8b6734f2cad5640f2da21cd33cf88323547d07e445fb7453ab38ec5033b1f"},
+ {file = "Cython-3.0.6-cp36-cp36m-win_amd64.whl", hash = "sha256:8dd5f5f3587909ff71f0562f50e00d4b836c948e56e8f74897b12f38a29e41b9"},
+ {file = "Cython-3.0.6-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:9c0472c6394750469062deb2c166125b10411636f63a0418b5c36a60d0c9a96a"},
+ {file = "Cython-3.0.6-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:97081932c8810bb99cb26b4b0402202a1764b58ee287c8b306071d2848148c24"},
+ {file = "Cython-3.0.6-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e781b3880dfd0d4d37983c9d414bfd5f26c2141f6d763d20ef1964a0a4cb2405"},
+ {file = "Cython-3.0.6-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ef88c46e91e21772a5d3b6b1e70a6da5fe098154ad4768888129b1c05e93bba7"},
+ {file = "Cython-3.0.6-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:a38b9e7a252ec27dbc21ee8f00f09a896e88285eebb6ed99207b2ff1ea6af28e"},
+ {file = "Cython-3.0.6-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:4975cdaf720d29288ec225b76b4f4471ff03f4f8b51841ba85d6587699ab2ad5"},
+ {file = "Cython-3.0.6-cp37-cp37m-win32.whl", hash = "sha256:9b89463ea330318461ca47d3e49b5f606e7e82446b6f37e5c19b60392439674c"},
+ {file = "Cython-3.0.6-cp37-cp37m-win_amd64.whl", hash = "sha256:0ca8f379b47417bfad98faeb14bf8a3966fc92cf69f8aaf7635cf6885e50d001"},
+ {file = "Cython-3.0.6-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:b3dda1e80eb577b9563cee6cf31923a7b88836b9f9be0043ec545b138b95d8e8"},
+ {file = "Cython-3.0.6-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:267e34e9a96f98c379100ef4192994a311678fb5c9af34c83ba5230223577581"},
+ {file = "Cython-3.0.6-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:345d9112fde4ae0347d656f58591fd52017c61a19779c95423bb38735fe4a401"},
+ {file = "Cython-3.0.6-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:25da0e51331ac12ff16cd858d1d836e092c984e1dc45d338166081d3802297c0"},
+ {file = "Cython-3.0.6-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:eebbf09089b4988b9f398ed46f168892e32fcfeec346b15954fdd818aa103456"},
+ {file = "Cython-3.0.6-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:e3ed0c125556324fa49b9e92bea13be7b158fcae6f72599d63c8733688257788"},
+ {file = "Cython-3.0.6-cp38-cp38-win32.whl", hash = "sha256:86e1e5a5c9157a547d0a769de59c98a1fc5e46cfad976f32f60423cc6de11052"},
+ {file = "Cython-3.0.6-cp38-cp38-win_amd64.whl", hash = "sha256:0d45a84a315bd84d1515cd3571415a0ee0709eb4e2cd4b13668ede928af344a7"},
+ {file = "Cython-3.0.6-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:a8e788e64b659bb8fe980bc37da3118e1f7285dec40c5fb293adabc74d4205f2"},
+ {file = "Cython-3.0.6-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9a77a174c7fb13d80754c8bf9912efd3f3696d13285b2f568eca17324263b3f7"},
+ {file = "Cython-3.0.6-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1074e84752cd0daf3226823ddbc37cca8bc45f61c94a1db2a34e641f2b9b0797"},
+ {file = "Cython-3.0.6-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:49d5cae02d56e151e1481e614a1af9a0fe659358f2aa5eca7a18f05aa641db61"},
+ {file = "Cython-3.0.6-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:0b94610fa49e36db068446cfd149a42e3246f38a4256bbe818512ac181446b4b"},
+ {file = "Cython-3.0.6-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:fabb2d14dd71add618a7892c40ffec584d1dae1e477caa193778e52e06821d83"},
+ {file = "Cython-3.0.6-cp39-cp39-win32.whl", hash = "sha256:ce442c0be72ab014c305399d955b78c3d1e69d5a5ce24398122b605691b69078"},
+ {file = "Cython-3.0.6-cp39-cp39-win_amd64.whl", hash = "sha256:8a05f79a0761fc76c42e945e5a9cb5d7986aa9e8e526fdf52bd9ca61a12d4567"},
+ {file = "Cython-3.0.6-py2.py3-none-any.whl", hash = "sha256:5921a175ea20779d4443ef99276cfa9a1a47de0e32d593be7679be741c9ed93b"},
+ {file = "Cython-3.0.6.tar.gz", hash = "sha256:399d185672c667b26eabbdca420c98564583798af3bc47670a8a09e9f19dd660"},
+]
+
+[[package]]
+name = "darglint"
+version = "1.8.1"
+description = "A utility for ensuring Google-style docstrings stay up to date with the source code."
+optional = false
+python-versions = ">=3.6,<4.0"
+files = [
+ {file = "darglint-1.8.1-py3-none-any.whl", hash = "sha256:5ae11c259c17b0701618a20c3da343a3eb98b3bc4b5a83d31cdd94f5ebdced8d"},
+ {file = "darglint-1.8.1.tar.gz", hash = "sha256:080d5106df149b199822e7ee7deb9c012b49891538f14a11be681044f0bb20da"},
+]
+
+[[package]]
+name = "debugpy"
+version = "1.8.0"
+description = "An implementation of the Debug Adapter Protocol for Python"
+optional = false
+python-versions = ">=3.8"
+files = [
+ {file = "debugpy-1.8.0-cp310-cp310-macosx_11_0_x86_64.whl", hash = "sha256:7fb95ca78f7ac43393cd0e0f2b6deda438ec7c5e47fa5d38553340897d2fbdfb"},
+ {file = "debugpy-1.8.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ef9ab7df0b9a42ed9c878afd3eaaff471fce3fa73df96022e1f5c9f8f8c87ada"},
+ {file = "debugpy-1.8.0-cp310-cp310-win32.whl", hash = "sha256:a8b7a2fd27cd9f3553ac112f356ad4ca93338feadd8910277aff71ab24d8775f"},
+ {file = "debugpy-1.8.0-cp310-cp310-win_amd64.whl", hash = "sha256:5d9de202f5d42e62f932507ee8b21e30d49aae7e46d5b1dd5c908db1d7068637"},
+ {file = "debugpy-1.8.0-cp311-cp311-macosx_11_0_universal2.whl", hash = "sha256:ef54404365fae8d45cf450d0544ee40cefbcb9cb85ea7afe89a963c27028261e"},
+ {file = "debugpy-1.8.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:60009b132c91951354f54363f8ebdf7457aeb150e84abba5ae251b8e9f29a8a6"},
+ {file = "debugpy-1.8.0-cp311-cp311-win32.whl", hash = "sha256:8cd0197141eb9e8a4566794550cfdcdb8b3db0818bdf8c49a8e8f8053e56e38b"},
+ {file = "debugpy-1.8.0-cp311-cp311-win_amd64.whl", hash = "sha256:a64093656c4c64dc6a438e11d59369875d200bd5abb8f9b26c1f5f723622e153"},
+ {file = "debugpy-1.8.0-cp38-cp38-macosx_11_0_x86_64.whl", hash = "sha256:b05a6b503ed520ad58c8dc682749113d2fd9f41ffd45daec16e558ca884008cd"},
+ {file = "debugpy-1.8.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3c6fb41c98ec51dd010d7ed650accfd07a87fe5e93eca9d5f584d0578f28f35f"},
+ {file = "debugpy-1.8.0-cp38-cp38-win32.whl", hash = "sha256:46ab6780159eeabb43c1495d9c84cf85d62975e48b6ec21ee10c95767c0590aa"},
+ {file = "debugpy-1.8.0-cp38-cp38-win_amd64.whl", hash = "sha256:bdc5ef99d14b9c0fcb35351b4fbfc06ac0ee576aeab6b2511702e5a648a2e595"},
+ {file = "debugpy-1.8.0-cp39-cp39-macosx_11_0_x86_64.whl", hash = "sha256:61eab4a4c8b6125d41a34bad4e5fe3d2cc145caecd63c3fe953be4cc53e65bf8"},
+ {file = "debugpy-1.8.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:125b9a637e013f9faac0a3d6a82bd17c8b5d2c875fb6b7e2772c5aba6d082332"},
+ {file = "debugpy-1.8.0-cp39-cp39-win32.whl", hash = "sha256:57161629133113c97b387382045649a2b985a348f0c9366e22217c87b68b73c6"},
+ {file = "debugpy-1.8.0-cp39-cp39-win_amd64.whl", hash = "sha256:e3412f9faa9ade82aa64a50b602544efcba848c91384e9f93497a458767e6926"},
+ {file = "debugpy-1.8.0-py2.py3-none-any.whl", hash = "sha256:9c9b0ac1ce2a42888199df1a1906e45e6f3c9555497643a85e0bf2406e3ffbc4"},
+ {file = "debugpy-1.8.0.zip", hash = "sha256:12af2c55b419521e33d5fb21bd022df0b5eb267c3e178f1d374a63a2a6bdccd0"},
+]
+
+[[package]]
+name = "decopatch"
+version = "1.4.10"
+description = "Create decorators easily in python."
+optional = false
+python-versions = "*"
+files = [
+ {file = "decopatch-1.4.10-py2.py3-none-any.whl", hash = "sha256:e151f7f93de2b1b3fd3f3272dcc7cefd1a69f68ec1c2d8e288ecd9deb36dc5f7"},
+ {file = "decopatch-1.4.10.tar.gz", hash = "sha256:957f49c93f4150182c23f8fb51d13bb3213e0f17a79e09c8cca7057598b55720"},
+]
+
+[package.dependencies]
+makefun = ">=1.5.0"
+
+[[package]]
+name = "decorator"
+version = "5.1.1"
+description = "Decorators for Humans"
+optional = false
+python-versions = ">=3.5"
+files = [
+ {file = "decorator-5.1.1-py3-none-any.whl", hash = "sha256:b8c3f85900b9dc423225913c5aace94729fe1fa9763b38939a95226f02d37186"},
+ {file = "decorator-5.1.1.tar.gz", hash = "sha256:637996211036b6385ef91435e4fae22989472f9d571faba8927ba8253acbc330"},
+]
+
+[[package]]
+name = "defusedxml"
+version = "0.7.1"
+description = "XML bomb protection for Python stdlib modules"
+optional = false
+python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*"
+files = [
+ {file = "defusedxml-0.7.1-py2.py3-none-any.whl", hash = "sha256:a352e7e428770286cc899e2542b6cdaedb2b4953ff269a210103ec58f6198a61"},
+ {file = "defusedxml-0.7.1.tar.gz", hash = "sha256:1bb3032db185915b62d7c6209c5a8792be6a32ab2fedacc84e01b52c51aa3e69"},
+]
+
+[[package]]
+name = "distlib"
+version = "0.3.7"
+description = "Distribution utilities"
+optional = false
+python-versions = "*"
+files = [
+ {file = "distlib-0.3.7-py2.py3-none-any.whl", hash = "sha256:2e24928bc811348f0feb63014e97aaae3037f2cf48712d51ae61df7fd6075057"},
+ {file = "distlib-0.3.7.tar.gz", hash = "sha256:9dafe54b34a028eafd95039d5e5d4851a13734540f1331060d31c9916e7147a8"},
+]
+
+[[package]]
+name = "dnspython"
+version = "2.4.2"
+description = "DNS toolkit"
+optional = false
+python-versions = ">=3.8,<4.0"
+files = [
+ {file = "dnspython-2.4.2-py3-none-any.whl", hash = "sha256:57c6fbaaeaaf39c891292012060beb141791735dbb4004798328fc2c467402d8"},
+ {file = "dnspython-2.4.2.tar.gz", hash = "sha256:8dcfae8c7460a2f84b4072e26f1c9f4101ca20c071649cb7c34e8b6a93d58984"},
+]
+
+[package.extras]
+dnssec = ["cryptography (>=2.6,<42.0)"]
+doh = ["h2 (>=4.1.0)", "httpcore (>=0.17.3)", "httpx (>=0.24.1)"]
+doq = ["aioquic (>=0.9.20)"]
+idna = ["idna (>=2.1,<4.0)"]
+trio = ["trio (>=0.14,<0.23)"]
+wmi = ["wmi (>=1.5.1,<2.0.0)"]
+
+[[package]]
+name = "docutils"
+version = "0.20.1"
+description = "Docutils -- Python Documentation Utilities"
+optional = false
+python-versions = ">=3.7"
+files = [
+ {file = "docutils-0.20.1-py3-none-any.whl", hash = "sha256:96f387a2c5562db4476f09f13bbab2192e764cac08ebbf3a34a95d9b1e4a59d6"},
+ {file = "docutils-0.20.1.tar.gz", hash = "sha256:f08a4e276c3a1583a86dce3e34aba3fe04d02bba2dd51ed16106244e8a923e3b"},
+]
+
+[[package]]
+name = "einops"
+version = "0.7.0"
+description = "A new flavour of deep learning operations"
+optional = false
+python-versions = ">=3.8"
+files = [
+ {file = "einops-0.7.0-py3-none-any.whl", hash = "sha256:0f3096f26b914f465f6ff3c66f5478f9a5e380bb367ffc6493a68143fbbf1fd1"},
+ {file = "einops-0.7.0.tar.gz", hash = "sha256:b2b04ad6081a3b227080c9bf5e3ace7160357ff03043cd66cc5b2319eb7031d1"},
+]
+
+[[package]]
+name = "email-validator"
+version = "2.1.0.post1"
+description = "A robust email address syntax and deliverability validation library."
+optional = false
+python-versions = ">=3.8"
+files = [
+ {file = "email_validator-2.1.0.post1-py3-none-any.whl", hash = "sha256:c973053efbeddfef924dc0bd93f6e77a1ea7ee0fce935aea7103c7a3d6d2d637"},
+ {file = "email_validator-2.1.0.post1.tar.gz", hash = "sha256:a4b0bd1cf55f073b924258d19321b1f3aa74b4b5a71a42c305575dba920e1a44"},
+]
+
+[package.dependencies]
+dnspython = ">=2.0.0"
+idna = ">=2.0.0"
+
+[[package]]
+name = "emma-common"
+version = "2.3.1"
+description = "Common modules which are used a lot throughout EMMA repositories"
+optional = false
+python-versions = ">=3.9,<3.11"
+files = []
+develop = false
+
+[package.dependencies]
+fastapi = {version = ">=0.88.0", extras = ["all"]}
+gunicorn = ">=20.1.0"
+httpx = ">=0.23.1"
+huggingface-hub = ">=0.19.4"
+loguru = ">=0.6.0"
+numpy = ">1.22"
+orjson = ">=3.8.3"
+pydantic = {version = ">=1.10.0,<2", extras = ["dotenv"]}
+rich = ">=12.6.0"
+torch = ">=1.10,!=1.13.0,<2"
+
+[package.source]
+type = "git"
+url = "https://github.com/emma-heriot-watt/common.git"
+reference = "HEAD"
+resolved_reference = "c52a5b573306c92f42fd46f70abc00506a58b6f8"
+
+[[package]]
+name = "eradicate"
+version = "2.3.0"
+description = "Removes commented-out code."
+optional = false
+python-versions = "*"
+files = [
+ {file = "eradicate-2.3.0-py3-none-any.whl", hash = "sha256:2b29b3dd27171f209e4ddd8204b70c02f0682ae95eecb353f10e8d72b149c63e"},
+ {file = "eradicate-2.3.0.tar.gz", hash = "sha256:06df115be3b87d0fc1c483db22a2ebb12bcf40585722810d809cc770f5031c37"},
+]
+
+[[package]]
+name = "exceptiongroup"
+version = "1.2.0"
+description = "Backport of PEP 654 (exception groups)"
+optional = false
+python-versions = ">=3.7"
+files = [
+ {file = "exceptiongroup-1.2.0-py3-none-any.whl", hash = "sha256:4bfd3996ac73b41e9b9628b04e079f193850720ea5945fc96a08633c66912f14"},
+ {file = "exceptiongroup-1.2.0.tar.gz", hash = "sha256:91f5c769735f051a4290d52edd0858999b57e5876e9f85937691bd4c9fa3ed68"},
+]
+
+[package.extras]
+test = ["pytest (>=6)"]
+
+[[package]]
+name = "executing"
+version = "2.0.1"
+description = "Get the currently executing AST node of a frame, and other information"
+optional = false
+python-versions = ">=3.5"
+files = [
+ {file = "executing-2.0.1-py2.py3-none-any.whl", hash = "sha256:eac49ca94516ccc753f9fb5ce82603156e590b27525a8bc32cce8ae302eb61bc"},
+ {file = "executing-2.0.1.tar.gz", hash = "sha256:35afe2ce3affba8ee97f2d69927fa823b08b472b7b994e36a52a964b93d16147"},
+]
+
+[package.extras]
+tests = ["asttokens (>=2.1.0)", "coverage", "coverage-enable-subprocess", "ipython", "littleutils", "pytest", "rich"]
+
+[[package]]
+name = "fastapi"
+version = "0.99.1"
+description = "FastAPI framework, high performance, easy to learn, fast to code, ready for production"
+optional = false
+python-versions = ">=3.7"
+files = [
+ {file = "fastapi-0.99.1-py3-none-any.whl", hash = "sha256:976df7bab51ac7beda9f68c4513b8c4490b5c1135c72aafd0a5ee4023ec5282e"},
+ {file = "fastapi-0.99.1.tar.gz", hash = "sha256:ac78f717cd80d657bd183f94d33b9bda84aa376a46a9dab513586b8eef1dc6fc"},
+]
+
+[package.dependencies]
+email-validator = {version = ">=1.1.1", optional = true, markers = "extra == \"all\""}
+httpx = {version = ">=0.23.0", optional = true, markers = "extra == \"all\""}
+itsdangerous = {version = ">=1.1.0", optional = true, markers = "extra == \"all\""}
+jinja2 = {version = ">=2.11.2", optional = true, markers = "extra == \"all\""}
+orjson = {version = ">=3.2.1", optional = true, markers = "extra == \"all\""}
+pydantic = ">=1.7.4,<1.8 || >1.8,<1.8.1 || >1.8.1,<2.0.0"
+python-multipart = {version = ">=0.0.5", optional = true, markers = "extra == \"all\""}
+pyyaml = {version = ">=5.3.1", optional = true, markers = "extra == \"all\""}
+starlette = ">=0.27.0,<0.28.0"
+typing-extensions = ">=4.5.0"
+ujson = {version = ">=4.0.1,<4.0.2 || >4.0.2,<4.1.0 || >4.1.0,<4.2.0 || >4.2.0,<4.3.0 || >4.3.0,<5.0.0 || >5.0.0,<5.1.0 || >5.1.0", optional = true, markers = "extra == \"all\""}
+uvicorn = {version = ">=0.12.0", extras = ["standard"], optional = true, markers = "extra == \"all\""}
+
+[package.extras]
+all = ["email-validator (>=1.1.1)", "httpx (>=0.23.0)", "itsdangerous (>=1.1.0)", "jinja2 (>=2.11.2)", "orjson (>=3.2.1)", "python-multipart (>=0.0.5)", "pyyaml (>=5.3.1)", "ujson (>=4.0.1,!=4.0.2,!=4.1.0,!=4.2.0,!=4.3.0,!=5.0.0,!=5.1.0)", "uvicorn[standard] (>=0.12.0)"]
+
+[[package]]
+name = "fastjsonschema"
+version = "2.19.0"
+description = "Fastest Python implementation of JSON schema"
+optional = false
+python-versions = "*"
+files = [
+ {file = "fastjsonschema-2.19.0-py3-none-any.whl", hash = "sha256:b9fd1a2dd6971dbc7fee280a95bd199ae0dd9ce22beb91cc75e9c1c528a5170e"},
+ {file = "fastjsonschema-2.19.0.tar.gz", hash = "sha256:e25df6647e1bc4a26070b700897b07b542ec898dd4f1f6ea013e7f6a88417225"},
+]
+
+[package.extras]
+devel = ["colorama", "json-spec", "jsonschema", "pylint", "pytest", "pytest-benchmark", "pytest-cache", "validictory"]
+
+[[package]]
+name = "filelock"
+version = "3.13.1"
+description = "A platform independent file lock."
+optional = false
+python-versions = ">=3.8"
+files = [
+ {file = "filelock-3.13.1-py3-none-any.whl", hash = "sha256:57dbda9b35157b05fb3e58ee91448612eb674172fab98ee235ccb0b5bee19a1c"},
+ {file = "filelock-3.13.1.tar.gz", hash = "sha256:521f5f56c50f8426f5e03ad3b281b490a87ef15bc6c526f168290f0c7148d44e"},
+]
+
+[package.extras]
+docs = ["furo (>=2023.9.10)", "sphinx (>=7.2.6)", "sphinx-autodoc-typehints (>=1.24)"]
+testing = ["covdefaults (>=2.3)", "coverage (>=7.3.2)", "diff-cover (>=8)", "pytest (>=7.4.3)", "pytest-cov (>=4.1)", "pytest-mock (>=3.12)", "pytest-timeout (>=2.2)"]
+typing = ["typing-extensions (>=4.8)"]
+
+[[package]]
+name = "flake8"
+version = "6.1.0"
+description = "the modular source code checker: pep8 pyflakes and co"
+optional = false
+python-versions = ">=3.8.1"
+files = [
+ {file = "flake8-6.1.0-py2.py3-none-any.whl", hash = "sha256:ffdfce58ea94c6580c77888a86506937f9a1a227dfcd15f245d694ae20a6b6e5"},
+ {file = "flake8-6.1.0.tar.gz", hash = "sha256:d5b3857f07c030bdb5bf41c7f53799571d75c4491748a3adcd47de929e34cd23"},
+]
+
+[package.dependencies]
+mccabe = ">=0.7.0,<0.8.0"
+pycodestyle = ">=2.11.0,<2.12.0"
+pyflakes = ">=3.1.0,<3.2.0"
+
+[[package]]
+name = "flake8-bandit"
+version = "4.1.1"
+description = "Automated security testing with bandit and flake8."
+optional = false
+python-versions = ">=3.6"
+files = [
+ {file = "flake8_bandit-4.1.1-py3-none-any.whl", hash = "sha256:4c8a53eb48f23d4ef1e59293657181a3c989d0077c9952717e98a0eace43e06d"},
+ {file = "flake8_bandit-4.1.1.tar.gz", hash = "sha256:068e09287189cbfd7f986e92605adea2067630b75380c6b5733dab7d87f9a84e"},
+]
+
+[package.dependencies]
+bandit = ">=1.7.3"
+flake8 = ">=5.0.0"
+
+[[package]]
+name = "flake8-broken-line"
+version = "1.0.0"
+description = "Flake8 plugin to forbid backslashes for line breaks"
+optional = false
+python-versions = ">=3.8,<4.0"
+files = [
+ {file = "flake8_broken_line-1.0.0-py3-none-any.whl", hash = "sha256:96c964336024a5030dc536a9f6fb02aa679e2d2a6b35b80a558b5136c35832a9"},
+ {file = "flake8_broken_line-1.0.0.tar.gz", hash = "sha256:e2c6a17f8d9a129e99c1320fce89b33843e2963871025c4c2bb7b8b8d8732a85"},
+]
+
+[package.dependencies]
+flake8 = ">5"
+
+[[package]]
+name = "flake8-bugbear"
+version = "23.11.28"
+description = "A plugin for flake8 finding likely bugs and design problems in your program. Contains warnings that don't belong in pyflakes and pycodestyle."
+optional = false
+python-versions = ">=3.8.1"
+files = [
+ {file = "flake8-bugbear-23.11.28.tar.gz", hash = "sha256:0ba6c44eaa0e4782da94c5c2607159a0e73569369246cd179cc143a0e16b78ba"},
+ {file = "flake8_bugbear-23.11.28-py3-none-any.whl", hash = "sha256:8d0f351d954fd860851710cd8b5b28742b2339c0e58848b103418dd9cddb9aa4"},
+]
+
+[package.dependencies]
+attrs = ">=19.2.0"
+flake8 = ">=6.0.0"
+
+[package.extras]
+dev = ["coverage", "hypothesis", "hypothesmith (>=0.2)", "pre-commit", "pytest", "tox"]
+
+[[package]]
+name = "flake8-commas"
+version = "2.1.0"
+description = "Flake8 lint for trailing commas."
+optional = false
+python-versions = "*"
+files = [
+ {file = "flake8-commas-2.1.0.tar.gz", hash = "sha256:940441ab8ee544df564ae3b3f49f20462d75d5c7cac2463e0b27436e2050f263"},
+ {file = "flake8_commas-2.1.0-py2.py3-none-any.whl", hash = "sha256:ebb96c31e01d0ef1d0685a21f3f0e2f8153a0381430e748bf0bbbb5d5b453d54"},
+]
+
+[package.dependencies]
+flake8 = ">=2"
+
+[[package]]
+name = "flake8-comprehensions"
+version = "3.14.0"
+description = "A flake8 plugin to help you write better list/set/dict comprehensions."
+optional = false
+python-versions = ">=3.8"
+files = [
+ {file = "flake8_comprehensions-3.14.0-py3-none-any.whl", hash = "sha256:7b9d07d94aa88e62099a6d1931ddf16c344d4157deedf90fe0d8ee2846f30e97"},
+ {file = "flake8_comprehensions-3.14.0.tar.gz", hash = "sha256:81768c61bfc064e1a06222df08a2580d97de10cb388694becaf987c331c6c0cf"},
+]
+
+[package.dependencies]
+flake8 = ">=3.0,<3.2.0 || >3.2.0"
+
+[[package]]
+name = "flake8-debugger"
+version = "4.1.2"
+description = "ipdb/pdb statement checker plugin for flake8"
+optional = false
+python-versions = ">=3.7"
+files = [
+ {file = "flake8-debugger-4.1.2.tar.gz", hash = "sha256:52b002560941e36d9bf806fca2523dc7fb8560a295d5f1a6e15ac2ded7a73840"},
+ {file = "flake8_debugger-4.1.2-py3-none-any.whl", hash = "sha256:0a5e55aeddcc81da631ad9c8c366e7318998f83ff00985a49e6b3ecf61e571bf"},
+]
+
+[package.dependencies]
+flake8 = ">=3.0"
+pycodestyle = "*"
+
+[[package]]
+name = "flake8-docstrings"
+version = "1.7.0"
+description = "Extension for flake8 which uses pydocstyle to check docstrings"
+optional = false
+python-versions = ">=3.7"
+files = [
+ {file = "flake8_docstrings-1.7.0-py2.py3-none-any.whl", hash = "sha256:51f2344026da083fc084166a9353f5082b01f72901df422f74b4d953ae88ac75"},
+ {file = "flake8_docstrings-1.7.0.tar.gz", hash = "sha256:4c8cc748dc16e6869728699e5d0d685da9a10b0ea718e090b1ba088e67a941af"},
+]
+
+[package.dependencies]
+flake8 = ">=3"
+pydocstyle = ">=2.1"
+
+[[package]]
+name = "flake8-eradicate"
+version = "1.5.0"
+description = "Flake8 plugin to find commented out code"
+optional = false
+python-versions = ">=3.8,<4.0"
+files = [
+ {file = "flake8_eradicate-1.5.0-py3-none-any.whl", hash = "sha256:18acc922ad7de623f5247c7d5595da068525ec5437dd53b22ec2259b96ce9d22"},
+ {file = "flake8_eradicate-1.5.0.tar.gz", hash = "sha256:aee636cb9ecb5594a7cd92d67ad73eb69909e5cc7bd81710cf9d00970f3983a6"},
+]
+
+[package.dependencies]
+attrs = "*"
+eradicate = ">=2.0,<3.0"
+flake8 = ">5"
+
+[[package]]
+name = "flake8-isort"
+version = "6.1.1"
+description = "flake8 plugin that integrates isort"
+optional = false
+python-versions = ">=3.8"
+files = [
+ {file = "flake8_isort-6.1.1-py3-none-any.whl", hash = "sha256:0fec4dc3a15aefbdbe4012e51d5531a2eb5fa8b981cdfbc882296a59b54ede12"},
+ {file = "flake8_isort-6.1.1.tar.gz", hash = "sha256:c1f82f3cf06a80c13e1d09bfae460e9666255d5c780b859f19f8318d420370b3"},
+]
+
+[package.dependencies]
+flake8 = "*"
+isort = ">=5.0.0,<6"
+
+[package.extras]
+test = ["pytest"]
+
+[[package]]
+name = "flake8-quotes"
+version = "3.3.2"
+description = "Flake8 lint for quotes."
+optional = false
+python-versions = "*"
+files = [
+ {file = "flake8-quotes-3.3.2.tar.gz", hash = "sha256:6e26892b632dacba517bf27219c459a8396dcfac0f5e8204904c5a4ba9b480e1"},
+]
+
+[package.dependencies]
+flake8 = "*"
+
+[[package]]
+name = "flake8-rst-docstrings"
+version = "0.3.0"
+description = "Python docstring reStructuredText (RST) validator for flake8"
+optional = false
+python-versions = ">=3.7"
+files = [
+ {file = "flake8-rst-docstrings-0.3.0.tar.gz", hash = "sha256:d1ce22b4bd37b73cd86b8d980e946ef198cfcc18ed82fedb674ceaa2f8d1afa4"},
+ {file = "flake8_rst_docstrings-0.3.0-py3-none-any.whl", hash = "sha256:f8c3c6892ff402292651c31983a38da082480ad3ba253743de52989bdc84ca1c"},
+]
+
+[package.dependencies]
+flake8 = ">=3"
+pygments = "*"
+restructuredtext-lint = "*"
+
+[package.extras]
+develop = ["build", "twine"]
+
+[[package]]
+name = "flake8-string-format"
+version = "0.3.0"
+description = "string format checker, plugin for flake8"
+optional = false
+python-versions = "*"
+files = [
+ {file = "flake8-string-format-0.3.0.tar.gz", hash = "sha256:65f3da786a1461ef77fca3780b314edb2853c377f2e35069723348c8917deaa2"},
+ {file = "flake8_string_format-0.3.0-py2.py3-none-any.whl", hash = "sha256:812ff431f10576a74c89be4e85b8e075a705be39bc40c4b4278b5b13e2afa9af"},
+]
+
+[package.dependencies]
+flake8 = "*"
+
+[[package]]
+name = "fonttools"
+version = "4.45.1"
+description = "Tools to manipulate font files"
+optional = false
+python-versions = ">=3.8"
+files = [
+ {file = "fonttools-4.45.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:45fa321c458ea29224067700954ec44493ae869b47e7c5485a350a149a19fb53"},
+ {file = "fonttools-4.45.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:0dc7617d96b1e668eea9250e1c1fe62d0c78c3f69573ce7e3332cc40e6d84356"},
+ {file = "fonttools-4.45.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:03ed3bda541e86725f6b4e1b94213f13ed1ae51a5a1f167028534cedea38c010"},
+ {file = "fonttools-4.45.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c4f4a5870e3b56788fb196da8cf30d0dfd51a76dc3b907861d018165f76ae4c2"},
+ {file = "fonttools-4.45.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:a3c11d9687479f01eddef729aa737abcdea0a44fdaffb62a930a18892f186c9b"},
+ {file = "fonttools-4.45.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:316cec50581e844c3ab69d7c82455b54c7cf18236b2f09e722faf665fbfcac58"},
+ {file = "fonttools-4.45.1-cp310-cp310-win32.whl", hash = "sha256:e2277cba9f0b525e30de2a9ad3cb4219aa4bc697230c1645666b0deee9f914f0"},
+ {file = "fonttools-4.45.1-cp310-cp310-win_amd64.whl", hash = "sha256:1b9e9ad2bcded9a1431afaa57c8d3c39143ac1f050862d66bddd863c515464a2"},
+ {file = "fonttools-4.45.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:ff6a698bdd435d24c379f6e8a54908cd9bb7dda23719084d56bf8c87709bf3bd"},
+ {file = "fonttools-4.45.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:2c980d60cd6ec1376206fe55013d166e5627ad0b149b5c81e74eaa913ab6134f"},
+ {file = "fonttools-4.45.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a12dee6523c02ca78aeedd0a5e12bfa9b7b29896350edd5241542897b072ae23"},
+ {file = "fonttools-4.45.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:37cd1ced6efb3dd6fe82e9f9bf92fd74ac58a5aefc284045f59ecd517a5fb9ab"},
+ {file = "fonttools-4.45.1-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:e3d24248221bd7151dfff0d88b1b5da02dccd7134bd576ce8888199827bbaa19"},
+ {file = "fonttools-4.45.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:ba6c23591427844dfb0a13658f1718489de75de6a46b64234584c0d17573162d"},
+ {file = "fonttools-4.45.1-cp311-cp311-win32.whl", hash = "sha256:cebcddbe9351b67166292b4f71ffdbfcce01ba4b07d4267824eb46b277aeb19a"},
+ {file = "fonttools-4.45.1-cp311-cp311-win_amd64.whl", hash = "sha256:f22eb69996a0bd49f76bdefb30be54ce8dbb89a0d1246874d610f05c2aa2e69e"},
+ {file = "fonttools-4.45.1-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:794de93e83297db7b4943f2431e206d8b1ea69cb3ae14638a49cc50332bf0db8"},
+ {file = "fonttools-4.45.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:4ba17822a6681d06849078daaf6e03eccc9f467efe7c4c60280e28a78e8e5df9"},
+ {file = "fonttools-4.45.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e50f794d09df0675da8d9dbd7c66bfcab2f74a708343aabcad41936d26556891"},
+ {file = "fonttools-4.45.1-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8b07b857d4f9de3199a8c3d1b1bf2078c0f37447891ca1a8d9234106b9a27aff"},
+ {file = "fonttools-4.45.1-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:777ba42b94a27bb7fb2b4082522fccfd345667c32a56011e1c3e105979af5b79"},
+ {file = "fonttools-4.45.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:21e96b99878348c74aa58059b8578d7586f9519cbcdadacf56486737038aa043"},
+ {file = "fonttools-4.45.1-cp312-cp312-win32.whl", hash = "sha256:5cbf02cda8465b69769d07385f5d11e7bba19954e7787792f46fe679ec755ebb"},
+ {file = "fonttools-4.45.1-cp312-cp312-win_amd64.whl", hash = "sha256:800e354e0c3afaeb8d9552769773d02f228e98c37b8cb03041157c3d0687cffc"},
+ {file = "fonttools-4.45.1-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:6eb2c54f7a07c92108daabcf02caf31df97825738db02a28270633946bcda4d0"},
+ {file = "fonttools-4.45.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:43a3d267334109ff849c37cf3629476b5feb392ef1d2e464a167b83de8cd599c"},
+ {file = "fonttools-4.45.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8e1aefc2bf3c43e0f33f995f828a7bbeff4adc9393a7760b11456dbcf14388f6"},
+ {file = "fonttools-4.45.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1f53a19dcdd5737440839b8394eeebb35da9ec8109f7926cb6456639b5b58e47"},
+ {file = "fonttools-4.45.1-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:5a17706b9cc24b27721613fe5773d93331ab7f0ecaca9955aead89c6b843d3a7"},
+ {file = "fonttools-4.45.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:fb36e5f40191274a95938b40c0a1fa7f895e36935aea8709e1d6deff0b2d0d4f"},
+ {file = "fonttools-4.45.1-cp38-cp38-win32.whl", hash = "sha256:46eabddec12066829b8a1efe45ae552ba2f1796981ecf538d5f68284c354c589"},
+ {file = "fonttools-4.45.1-cp38-cp38-win_amd64.whl", hash = "sha256:b6de2f0fcd3302fb82f94801002cb473959e998c14c24ec28234adb674aed345"},
+ {file = "fonttools-4.45.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:392d0e3cc23daee910193625f7cf1b387aff9dd5b6f1a5f4a925680acb6dcbc2"},
+ {file = "fonttools-4.45.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:4b9544b1346d99848ac0e9b05b5d45ee703d7562fc4c9c48cf4b781de9632e57"},
+ {file = "fonttools-4.45.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8717db3e4895e4820ade64ea379187738827ee60748223cb0438ef044ee208c6"},
+ {file = "fonttools-4.45.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e29d5f298d616a93a4c5963682dc6cc8cc09f6d89cad2c29019fc5fb3b4d9472"},
+ {file = "fonttools-4.45.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:cb472905da3049960e80fc1cf808231880d79727a8410e156bf3e5063a1c574f"},
+ {file = "fonttools-4.45.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:ba299f1fbaa2a1e33210aaaf6fa816d4059e4d3cfe2ae9871368d4ab548c1c6a"},
+ {file = "fonttools-4.45.1-cp39-cp39-win32.whl", hash = "sha256:105099968b58a5b4cef6f3eb409db8ea8578b302a9d05e23fecba1b8b0177b5f"},
+ {file = "fonttools-4.45.1-cp39-cp39-win_amd64.whl", hash = "sha256:847f3f49dd3423e5a678c098e2ba92c7f4955d4aab3044f6a507b0bb0ecb07e0"},
+ {file = "fonttools-4.45.1-py3-none-any.whl", hash = "sha256:3bdd7dfca8f6c9f4779384064027e8477ad6a037d6a327b09381f43e0247c6f3"},
+ {file = "fonttools-4.45.1.tar.gz", hash = "sha256:6e441286d55fe7ec7c4fb36812bf914924813776ff514b744b510680fc2733f2"},
+]
+
+[package.extras]
+all = ["brotli (>=1.0.1)", "brotlicffi (>=0.8.0)", "fs (>=2.2.0,<3)", "lxml (>=4.0,<5)", "lz4 (>=1.7.4.2)", "matplotlib", "munkres", "scipy", "skia-pathops (>=0.5.0)", "sympy", "uharfbuzz (>=0.23.0)", "unicodedata2 (>=15.1.0)", "xattr", "zopfli (>=0.1.4)"]
+graphite = ["lz4 (>=1.7.4.2)"]
+interpolatable = ["munkres", "scipy"]
+lxml = ["lxml (>=4.0,<5)"]
+pathops = ["skia-pathops (>=0.5.0)"]
+plot = ["matplotlib"]
+repacker = ["uharfbuzz (>=0.23.0)"]
+symfont = ["sympy"]
+type1 = ["xattr"]
+ufo = ["fs (>=2.2.0,<3)"]
+unicode = ["unicodedata2 (>=15.1.0)"]
+woff = ["brotli (>=1.0.1)", "brotlicffi (>=0.8.0)", "zopfli (>=0.1.4)"]
+
+[[package]]
+name = "fqdn"
+version = "1.5.1"
+description = "Validates fully-qualified domain names against RFC 1123, so that they are acceptable to modern bowsers"
+optional = false
+python-versions = ">=2.7, !=3.0, !=3.1, !=3.2, !=3.3, !=3.4, <4"
+files = [
+ {file = "fqdn-1.5.1-py3-none-any.whl", hash = "sha256:3a179af3761e4df6eb2e026ff9e1a3033d3587bf980a0b1b2e1e5d08d7358014"},
+ {file = "fqdn-1.5.1.tar.gz", hash = "sha256:105ed3677e767fb5ca086a0c1f4bb66ebc3c100be518f0e0d755d9eae164d89f"},
+]
+
+[[package]]
+name = "frozenlist"
+version = "1.4.0"
+description = "A list-like structure which implements collections.abc.MutableSequence"
+optional = false
+python-versions = ">=3.8"
+files = [
+ {file = "frozenlist-1.4.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:764226ceef3125e53ea2cb275000e309c0aa5464d43bd72abd661e27fffc26ab"},
+ {file = "frozenlist-1.4.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:d6484756b12f40003c6128bfcc3fa9f0d49a687e171186c2d85ec82e3758c559"},
+ {file = "frozenlist-1.4.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:9ac08e601308e41eb533f232dbf6b7e4cea762f9f84f6357136eed926c15d12c"},
+ {file = "frozenlist-1.4.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d081f13b095d74b67d550de04df1c756831f3b83dc9881c38985834387487f1b"},
+ {file = "frozenlist-1.4.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:71932b597f9895f011f47f17d6428252fc728ba2ae6024e13c3398a087c2cdea"},
+ {file = "frozenlist-1.4.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:981b9ab5a0a3178ff413bca62526bb784249421c24ad7381e39d67981be2c326"},
+ {file = "frozenlist-1.4.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e41f3de4df3e80de75845d3e743b3f1c4c8613c3997a912dbf0229fc61a8b963"},
+ {file = "frozenlist-1.4.0-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6918d49b1f90821e93069682c06ffde41829c346c66b721e65a5c62b4bab0300"},
+ {file = "frozenlist-1.4.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:0e5c8764c7829343d919cc2dfc587a8db01c4f70a4ebbc49abde5d4b158b007b"},
+ {file = "frozenlist-1.4.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:8d0edd6b1c7fb94922bf569c9b092ee187a83f03fb1a63076e7774b60f9481a8"},
+ {file = "frozenlist-1.4.0-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:e29cda763f752553fa14c68fb2195150bfab22b352572cb36c43c47bedba70eb"},
+ {file = "frozenlist-1.4.0-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:0c7c1b47859ee2cac3846fde1c1dc0f15da6cec5a0e5c72d101e0f83dcb67ff9"},
+ {file = "frozenlist-1.4.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:901289d524fdd571be1c7be054f48b1f88ce8dddcbdf1ec698b27d4b8b9e5d62"},
+ {file = "frozenlist-1.4.0-cp310-cp310-win32.whl", hash = "sha256:1a0848b52815006ea6596c395f87449f693dc419061cc21e970f139d466dc0a0"},
+ {file = "frozenlist-1.4.0-cp310-cp310-win_amd64.whl", hash = "sha256:b206646d176a007466358aa21d85cd8600a415c67c9bd15403336c331a10d956"},
+ {file = "frozenlist-1.4.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:de343e75f40e972bae1ef6090267f8260c1446a1695e77096db6cfa25e759a95"},
+ {file = "frozenlist-1.4.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:ad2a9eb6d9839ae241701d0918f54c51365a51407fd80f6b8289e2dfca977cc3"},
+ {file = "frozenlist-1.4.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:bd7bd3b3830247580de99c99ea2a01416dfc3c34471ca1298bccabf86d0ff4dc"},
+ {file = "frozenlist-1.4.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bdf1847068c362f16b353163391210269e4f0569a3c166bc6a9f74ccbfc7e839"},
+ {file = "frozenlist-1.4.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:38461d02d66de17455072c9ba981d35f1d2a73024bee7790ac2f9e361ef1cd0c"},
+ {file = "frozenlist-1.4.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d5a32087d720c608f42caed0ef36d2b3ea61a9d09ee59a5142d6070da9041b8f"},
+ {file = "frozenlist-1.4.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:dd65632acaf0d47608190a71bfe46b209719bf2beb59507db08ccdbe712f969b"},
+ {file = "frozenlist-1.4.0-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:261b9f5d17cac914531331ff1b1d452125bf5daa05faf73b71d935485b0c510b"},
+ {file = "frozenlist-1.4.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:b89ac9768b82205936771f8d2eb3ce88503b1556324c9f903e7156669f521472"},
+ {file = "frozenlist-1.4.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:008eb8b31b3ea6896da16c38c1b136cb9fec9e249e77f6211d479db79a4eaf01"},
+ {file = "frozenlist-1.4.0-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:e74b0506fa5aa5598ac6a975a12aa8928cbb58e1f5ac8360792ef15de1aa848f"},
+ {file = "frozenlist-1.4.0-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:490132667476f6781b4c9458298b0c1cddf237488abd228b0b3650e5ecba7467"},
+ {file = "frozenlist-1.4.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:76d4711f6f6d08551a7e9ef28c722f4a50dd0fc204c56b4bcd95c6cc05ce6fbb"},
+ {file = "frozenlist-1.4.0-cp311-cp311-win32.whl", hash = "sha256:a02eb8ab2b8f200179b5f62b59757685ae9987996ae549ccf30f983f40602431"},
+ {file = "frozenlist-1.4.0-cp311-cp311-win_amd64.whl", hash = "sha256:515e1abc578dd3b275d6a5114030b1330ba044ffba03f94091842852f806f1c1"},
+ {file = "frozenlist-1.4.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:f0ed05f5079c708fe74bf9027e95125334b6978bf07fd5ab923e9e55e5fbb9d3"},
+ {file = "frozenlist-1.4.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:ca265542ca427bf97aed183c1676e2a9c66942e822b14dc6e5f42e038f92a503"},
+ {file = "frozenlist-1.4.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:491e014f5c43656da08958808588cc6c016847b4360e327a62cb308c791bd2d9"},
+ {file = "frozenlist-1.4.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:17ae5cd0f333f94f2e03aaf140bb762c64783935cc764ff9c82dff626089bebf"},
+ {file = "frozenlist-1.4.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1e78fb68cf9c1a6aa4a9a12e960a5c9dfbdb89b3695197aa7064705662515de2"},
+ {file = "frozenlist-1.4.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d5655a942f5f5d2c9ed93d72148226d75369b4f6952680211972a33e59b1dfdc"},
+ {file = "frozenlist-1.4.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c11b0746f5d946fecf750428a95f3e9ebe792c1ee3b1e96eeba145dc631a9672"},
+ {file = "frozenlist-1.4.0-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e66d2a64d44d50d2543405fb183a21f76b3b5fd16f130f5c99187c3fb4e64919"},
+ {file = "frozenlist-1.4.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:88f7bc0fcca81f985f78dd0fa68d2c75abf8272b1f5c323ea4a01a4d7a614efc"},
+ {file = "frozenlist-1.4.0-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:5833593c25ac59ede40ed4de6d67eb42928cca97f26feea219f21d0ed0959b79"},
+ {file = "frozenlist-1.4.0-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:fec520865f42e5c7f050c2a79038897b1c7d1595e907a9e08e3353293ffc948e"},
+ {file = "frozenlist-1.4.0-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:b826d97e4276750beca7c8f0f1a4938892697a6bcd8ec8217b3312dad6982781"},
+ {file = "frozenlist-1.4.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:ceb6ec0a10c65540421e20ebd29083c50e6d1143278746a4ef6bcf6153171eb8"},
+ {file = "frozenlist-1.4.0-cp38-cp38-win32.whl", hash = "sha256:2b8bcf994563466db019fab287ff390fffbfdb4f905fc77bc1c1d604b1c689cc"},
+ {file = "frozenlist-1.4.0-cp38-cp38-win_amd64.whl", hash = "sha256:a6c8097e01886188e5be3e6b14e94ab365f384736aa1fca6a0b9e35bd4a30bc7"},
+ {file = "frozenlist-1.4.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:6c38721585f285203e4b4132a352eb3daa19121a035f3182e08e437cface44bf"},
+ {file = "frozenlist-1.4.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:a0c6da9aee33ff0b1a451e867da0c1f47408112b3391dd43133838339e410963"},
+ {file = "frozenlist-1.4.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:93ea75c050c5bb3d98016b4ba2497851eadf0ac154d88a67d7a6816206f6fa7f"},
+ {file = "frozenlist-1.4.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f61e2dc5ad442c52b4887f1fdc112f97caeff4d9e6ebe78879364ac59f1663e1"},
+ {file = "frozenlist-1.4.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:aa384489fefeb62321b238e64c07ef48398fe80f9e1e6afeff22e140e0850eef"},
+ {file = "frozenlist-1.4.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:10ff5faaa22786315ef57097a279b833ecab1a0bfb07d604c9cbb1c4cdc2ed87"},
+ {file = "frozenlist-1.4.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:007df07a6e3eb3e33e9a1fe6a9db7af152bbd8a185f9aaa6ece10a3529e3e1c6"},
+ {file = "frozenlist-1.4.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7f4f399d28478d1f604c2ff9119907af9726aed73680e5ed1ca634d377abb087"},
+ {file = "frozenlist-1.4.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:c5374b80521d3d3f2ec5572e05adc94601985cc526fb276d0c8574a6d749f1b3"},
+ {file = "frozenlist-1.4.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:ce31ae3e19f3c902de379cf1323d90c649425b86de7bbdf82871b8a2a0615f3d"},
+ {file = "frozenlist-1.4.0-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:7211ef110a9194b6042449431e08c4d80c0481e5891e58d429df5899690511c2"},
+ {file = "frozenlist-1.4.0-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:556de4430ce324c836789fa4560ca62d1591d2538b8ceb0b4f68fb7b2384a27a"},
+ {file = "frozenlist-1.4.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:7645a8e814a3ee34a89c4a372011dcd817964ce8cb273c8ed6119d706e9613e3"},
+ {file = "frozenlist-1.4.0-cp39-cp39-win32.whl", hash = "sha256:19488c57c12d4e8095a922f328df3f179c820c212940a498623ed39160bc3c2f"},
+ {file = "frozenlist-1.4.0-cp39-cp39-win_amd64.whl", hash = "sha256:6221d84d463fb110bdd7619b69cb43878a11d51cbb9394ae3105d082d5199167"},
+ {file = "frozenlist-1.4.0.tar.gz", hash = "sha256:09163bdf0b2907454042edb19f887c6d33806adc71fbd54afc14908bfdc22251"},
+]
+
+[[package]]
+name = "fsspec"
+version = "2023.10.0"
+description = "File-system specification"
+optional = false
+python-versions = ">=3.8"
+files = [
+ {file = "fsspec-2023.10.0-py3-none-any.whl", hash = "sha256:346a8f024efeb749d2a5fca7ba8854474b1ff9af7c3faaf636a4548781136529"},
+ {file = "fsspec-2023.10.0.tar.gz", hash = "sha256:330c66757591df346ad3091a53bd907e15348c2ba17d63fd54f5c39c4457d2a5"},
+]
+
+[package.dependencies]
+aiohttp = {version = "<4.0.0a0 || >4.0.0a0,<4.0.0a1 || >4.0.0a1", optional = true, markers = "extra == \"http\""}
+requests = {version = "*", optional = true, markers = "extra == \"http\""}
+
+[package.extras]
+abfs = ["adlfs"]
+adl = ["adlfs"]
+arrow = ["pyarrow (>=1)"]
+dask = ["dask", "distributed"]
+devel = ["pytest", "pytest-cov"]
+dropbox = ["dropbox", "dropboxdrivefs", "requests"]
+full = ["adlfs", "aiohttp (!=4.0.0a0,!=4.0.0a1)", "dask", "distributed", "dropbox", "dropboxdrivefs", "fusepy", "gcsfs", "libarchive-c", "ocifs", "panel", "paramiko", "pyarrow (>=1)", "pygit2", "requests", "s3fs", "smbprotocol", "tqdm"]
+fuse = ["fusepy"]
+gcs = ["gcsfs"]
+git = ["pygit2"]
+github = ["requests"]
+gs = ["gcsfs"]
+gui = ["panel"]
+hdfs = ["pyarrow (>=1)"]
+http = ["aiohttp (!=4.0.0a0,!=4.0.0a1)", "requests"]
+libarchive = ["libarchive-c"]
+oci = ["ocifs"]
+s3 = ["s3fs"]
+sftp = ["paramiko"]
+smb = ["smbprotocol"]
+ssh = ["paramiko"]
+tqdm = ["tqdm"]
+
+[[package]]
+name = "gitdb"
+version = "4.0.11"
+description = "Git Object Database"
+optional = false
+python-versions = ">=3.7"
+files = [
+ {file = "gitdb-4.0.11-py3-none-any.whl", hash = "sha256:81a3407ddd2ee8df444cbacea00e2d038e40150acfa3001696fe0dcf1d3adfa4"},
+ {file = "gitdb-4.0.11.tar.gz", hash = "sha256:bf5421126136d6d0af55bc1e7c1af1c397a34f5b7bd79e776cd3e89785c2b04b"},
+]
+
+[package.dependencies]
+smmap = ">=3.0.1,<6"
+
+[[package]]
+name = "gitpython"
+version = "3.1.40"
+description = "GitPython is a Python library used to interact with Git repositories"
+optional = false
+python-versions = ">=3.7"
+files = [
+ {file = "GitPython-3.1.40-py3-none-any.whl", hash = "sha256:cf14627d5a8049ffbf49915732e5eddbe8134c3bdb9d476e6182b676fc573f8a"},
+ {file = "GitPython-3.1.40.tar.gz", hash = "sha256:22b126e9ffb671fdd0c129796343a02bf67bf2994b35449ffc9321aa755e18a4"},
+]
+
+[package.dependencies]
+gitdb = ">=4.0.1,<5"
+
+[package.extras]
+test = ["black", "coverage[toml]", "ddt (>=1.1.1,!=1.4.3)", "mock", "mypy", "pre-commit", "pytest", "pytest-cov", "pytest-instafail", "pytest-subtests", "pytest-sugar"]
+
+[[package]]
+name = "gunicorn"
+version = "21.2.0"
+description = "WSGI HTTP Server for UNIX"
+optional = false
+python-versions = ">=3.5"
+files = [
+ {file = "gunicorn-21.2.0-py3-none-any.whl", hash = "sha256:3213aa5e8c24949e792bcacfc176fef362e7aac80b76c56f6b5122bf350722f0"},
+ {file = "gunicorn-21.2.0.tar.gz", hash = "sha256:88ec8bff1d634f98e61b9f65bc4bf3cd918a90806c6f5c48bc5603849ec81033"},
+]
+
+[package.dependencies]
+packaging = "*"
+
+[package.extras]
+eventlet = ["eventlet (>=0.24.1)"]
+gevent = ["gevent (>=1.4.0)"]
+setproctitle = ["setproctitle"]
+tornado = ["tornado (>=0.2)"]
+
+[[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 = "h5py"
+version = "3.7.0"
+description = "Read and write HDF5 files from Python"
+optional = false
+python-versions = ">=3.7"
+files = [
+ {file = "h5py-3.7.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:d77af42cb751ad6cc44f11bae73075a07429a5cf2094dfde2b1e716e059b3911"},
+ {file = "h5py-3.7.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:63beb8b7b47d0896c50de6efb9a1eaa81dbe211f3767e7dd7db159cea51ba37a"},
+ {file = "h5py-3.7.0-cp310-cp310-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:04e2e1e2fc51b8873e972a08d2f89625ef999b1f2d276199011af57bb9fc7851"},
+ {file = "h5py-3.7.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f73307c876af49aa869ec5df1818e9bb0bdcfcf8a5ba773cc45a4fba5a286a5c"},
+ {file = "h5py-3.7.0-cp310-cp310-win_amd64.whl", hash = "sha256:f514b24cacdd983e61f8d371edac8c1b780c279d0acb8485639e97339c866073"},
+ {file = "h5py-3.7.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:43fed4d13743cf02798a9a03a360a88e589d81285e72b83f47d37bb64ed44881"},
+ {file = "h5py-3.7.0-cp37-cp37m-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:c038399ce09a58ff8d89ec3e62f00aa7cb82d14f34e24735b920e2a811a3a426"},
+ {file = "h5py-3.7.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:03d64fb86bb86b978928bad923b64419a23e836499ec6363e305ad28afd9d287"},
+ {file = "h5py-3.7.0-cp37-cp37m-win_amd64.whl", hash = "sha256:e5b7820b75f9519499d76cc708e27242ccfdd9dfb511d6deb98701961d0445aa"},
+ {file = "h5py-3.7.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:a9351d729ea754db36d175098361b920573fdad334125f86ac1dd3a083355e20"},
+ {file = "h5py-3.7.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:6776d896fb90c5938de8acb925e057e2f9f28755f67ec3edcbc8344832616c38"},
+ {file = "h5py-3.7.0-cp38-cp38-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:0a047fddbe6951bce40e9cde63373c838a978c5e05a011a682db9ba6334b8e85"},
+ {file = "h5py-3.7.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0798a9c0ff45f17d0192e4d7114d734cac9f8b2b2c76dd1d923c4d0923f27bb6"},
+ {file = "h5py-3.7.0-cp38-cp38-win_amd64.whl", hash = "sha256:0d8de8cb619fc597da7cf8cdcbf3b7ff8c5f6db836568afc7dc16d21f59b2b49"},
+ {file = "h5py-3.7.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:f084bbe816907dfe59006756f8f2d16d352faff2d107f4ffeb1d8de126fc5dc7"},
+ {file = "h5py-3.7.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:1fcb11a2dc8eb7ddcae08afd8fae02ba10467753a857fa07a404d700a93f3d53"},
+ {file = "h5py-3.7.0-cp39-cp39-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:ed43e2cc4f511756fd664fb45d6b66c3cbed4e3bd0f70e29c37809b2ae013c44"},
+ {file = "h5py-3.7.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9e7535df5ee3dc3e5d1f408fdfc0b33b46bc9b34db82743c82cd674d8239b9ad"},
+ {file = "h5py-3.7.0-cp39-cp39-win_amd64.whl", hash = "sha256:9e2ad2aa000f5b1e73b5dfe22f358ca46bf1a2b6ca394d9659874d7fc251731a"},
+ {file = "h5py-3.7.0.tar.gz", hash = "sha256:3fcf37884383c5da64846ab510190720027dca0768def34dd8dcb659dbe5cbf3"},
+]
+
+[package.dependencies]
+numpy = ">=1.14.5"
+
+[[package]]
+name = "httpcore"
+version = "1.0.2"
+description = "A minimal low-level HTTP client."
+optional = false
+python-versions = ">=3.8"
+files = [
+ {file = "httpcore-1.0.2-py3-none-any.whl", hash = "sha256:096cc05bca73b8e459a1fc3dcf585148f63e534eae4339559c9b8a8d6399acc7"},
+ {file = "httpcore-1.0.2.tar.gz", hash = "sha256:9fc092e4799b26174648e54b74ed5f683132a464e95643b226e00c2ed2fa6535"},
+]
+
+[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,<0.23.0)"]
+
+[[package]]
+name = "httptools"
+version = "0.6.1"
+description = "A collection of framework independent HTTP protocol utils."
+optional = false
+python-versions = ">=3.8.0"
+files = [
+ {file = "httptools-0.6.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:d2f6c3c4cb1948d912538217838f6e9960bc4a521d7f9b323b3da579cd14532f"},
+ {file = "httptools-0.6.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:00d5d4b68a717765b1fabfd9ca755bd12bf44105eeb806c03d1962acd9b8e563"},
+ {file = "httptools-0.6.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:639dc4f381a870c9ec860ce5c45921db50205a37cc3334e756269736ff0aac58"},
+ {file = "httptools-0.6.1-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e57997ac7fb7ee43140cc03664de5f268813a481dff6245e0075925adc6aa185"},
+ {file = "httptools-0.6.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:0ac5a0ae3d9f4fe004318d64b8a854edd85ab76cffbf7ef5e32920faef62f142"},
+ {file = "httptools-0.6.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:3f30d3ce413088a98b9db71c60a6ada2001a08945cb42dd65a9a9fe228627658"},
+ {file = "httptools-0.6.1-cp310-cp310-win_amd64.whl", hash = "sha256:1ed99a373e327f0107cb513b61820102ee4f3675656a37a50083eda05dc9541b"},
+ {file = "httptools-0.6.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:7a7ea483c1a4485c71cb5f38be9db078f8b0e8b4c4dc0210f531cdd2ddac1ef1"},
+ {file = "httptools-0.6.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:85ed077c995e942b6f1b07583e4eb0a8d324d418954fc6af913d36db7c05a5a0"},
+ {file = "httptools-0.6.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8b0bb634338334385351a1600a73e558ce619af390c2b38386206ac6a27fecfc"},
+ {file = "httptools-0.6.1-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7d9ceb2c957320def533671fc9c715a80c47025139c8d1f3797477decbc6edd2"},
+ {file = "httptools-0.6.1-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:4f0f8271c0a4db459f9dc807acd0eadd4839934a4b9b892f6f160e94da309837"},
+ {file = "httptools-0.6.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:6a4f5ccead6d18ec072ac0b84420e95d27c1cdf5c9f1bc8fbd8daf86bd94f43d"},
+ {file = "httptools-0.6.1-cp311-cp311-win_amd64.whl", hash = "sha256:5cceac09f164bcba55c0500a18fe3c47df29b62353198e4f37bbcc5d591172c3"},
+ {file = "httptools-0.6.1-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:75c8022dca7935cba14741a42744eee13ba05db00b27a4b940f0d646bd4d56d0"},
+ {file = "httptools-0.6.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:48ed8129cd9a0d62cf4d1575fcf90fb37e3ff7d5654d3a5814eb3d55f36478c2"},
+ {file = "httptools-0.6.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6f58e335a1402fb5a650e271e8c2d03cfa7cea46ae124649346d17bd30d59c90"},
+ {file = "httptools-0.6.1-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:93ad80d7176aa5788902f207a4e79885f0576134695dfb0fefc15b7a4648d503"},
+ {file = "httptools-0.6.1-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:9bb68d3a085c2174c2477eb3ffe84ae9fb4fde8792edb7bcd09a1d8467e30a84"},
+ {file = "httptools-0.6.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:b512aa728bc02354e5ac086ce76c3ce635b62f5fbc32ab7082b5e582d27867bb"},
+ {file = "httptools-0.6.1-cp312-cp312-win_amd64.whl", hash = "sha256:97662ce7fb196c785344d00d638fc9ad69e18ee4bfb4000b35a52efe5adcc949"},
+ {file = "httptools-0.6.1-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:8e216a038d2d52ea13fdd9b9c9c7459fb80d78302b257828285eca1c773b99b3"},
+ {file = "httptools-0.6.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:3e802e0b2378ade99cd666b5bffb8b2a7cc8f3d28988685dc300469ea8dd86cb"},
+ {file = "httptools-0.6.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4bd3e488b447046e386a30f07af05f9b38d3d368d1f7b4d8f7e10af85393db97"},
+ {file = "httptools-0.6.1-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fe467eb086d80217b7584e61313ebadc8d187a4d95bb62031b7bab4b205c3ba3"},
+ {file = "httptools-0.6.1-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:3c3b214ce057c54675b00108ac42bacf2ab8f85c58e3f324a4e963bbc46424f4"},
+ {file = "httptools-0.6.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:8ae5b97f690badd2ca27cbf668494ee1b6d34cf1c464271ef7bfa9ca6b83ffaf"},
+ {file = "httptools-0.6.1-cp38-cp38-win_amd64.whl", hash = "sha256:405784577ba6540fa7d6ff49e37daf104e04f4b4ff2d1ac0469eaa6a20fde084"},
+ {file = "httptools-0.6.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:95fb92dd3649f9cb139e9c56604cc2d7c7bf0fc2e7c8d7fbd58f96e35eddd2a3"},
+ {file = "httptools-0.6.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:dcbab042cc3ef272adc11220517278519adf8f53fd3056d0e68f0a6f891ba94e"},
+ {file = "httptools-0.6.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0cf2372e98406efb42e93bfe10f2948e467edfd792b015f1b4ecd897903d3e8d"},
+ {file = "httptools-0.6.1-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:678fcbae74477a17d103b7cae78b74800d795d702083867ce160fc202104d0da"},
+ {file = "httptools-0.6.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:e0b281cf5a125c35f7f6722b65d8542d2e57331be573e9e88bc8b0115c4a7a81"},
+ {file = "httptools-0.6.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:95658c342529bba4e1d3d2b1a874db16c7cca435e8827422154c9da76ac4e13a"},
+ {file = "httptools-0.6.1-cp39-cp39-win_amd64.whl", hash = "sha256:7ebaec1bf683e4bf5e9fbb49b8cc36da482033596a415b3e4ebab5a4c0d7ec5e"},
+ {file = "httptools-0.6.1.tar.gz", hash = "sha256:c6e26c30455600b95d94b1b836085138e82f177351454ee841c148f93a9bad5a"},
+]
+
+[package.extras]
+test = ["Cython (>=0.29.24,<0.30.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 = "huggingface-hub"
+version = "0.19.4"
+description = "Client library to download and publish models, datasets and other repos on the huggingface.co hub"
+optional = false
+python-versions = ">=3.8.0"
+files = [
+ {file = "huggingface_hub-0.19.4-py3-none-any.whl", hash = "sha256:dba013f779da16f14b606492828f3760600a1e1801432d09fe1c33e50b825bb5"},
+ {file = "huggingface_hub-0.19.4.tar.gz", hash = "sha256:176a4fc355a851c17550e7619488f383189727eab209534d7cef2114dae77b22"},
+]
+
+[package.dependencies]
+filelock = "*"
+fsspec = ">=2023.5.0"
+packaging = ">=20.9"
+pyyaml = ">=5.1"
+requests = "*"
+tqdm = ">=4.42.1"
+typing-extensions = ">=3.7.4.3"
+
+[package.extras]
+all = ["InquirerPy (==0.3.4)", "Jinja2", "Pillow", "aiohttp", "gradio", "jedi", "mypy (==1.5.1)", "numpy", "pydantic (>1.1,<2.0)", "pydantic (>1.1,<3.0)", "pytest", "pytest-asyncio", "pytest-cov", "pytest-env", "pytest-vcr", "pytest-xdist", "ruff (>=0.1.3)", "soundfile", "types-PyYAML", "types-requests", "types-simplejson", "types-toml", "types-tqdm", "types-urllib3", "typing-extensions (>=4.8.0)", "urllib3 (<2.0)"]
+cli = ["InquirerPy (==0.3.4)"]
+dev = ["InquirerPy (==0.3.4)", "Jinja2", "Pillow", "aiohttp", "gradio", "jedi", "mypy (==1.5.1)", "numpy", "pydantic (>1.1,<2.0)", "pydantic (>1.1,<3.0)", "pytest", "pytest-asyncio", "pytest-cov", "pytest-env", "pytest-vcr", "pytest-xdist", "ruff (>=0.1.3)", "soundfile", "types-PyYAML", "types-requests", "types-simplejson", "types-toml", "types-tqdm", "types-urllib3", "typing-extensions (>=4.8.0)", "urllib3 (<2.0)"]
+docs = ["InquirerPy (==0.3.4)", "Jinja2", "Pillow", "aiohttp", "gradio", "hf-doc-builder", "jedi", "mypy (==1.5.1)", "numpy", "pydantic (>1.1,<2.0)", "pydantic (>1.1,<3.0)", "pytest", "pytest-asyncio", "pytest-cov", "pytest-env", "pytest-vcr", "pytest-xdist", "ruff (>=0.1.3)", "soundfile", "types-PyYAML", "types-requests", "types-simplejson", "types-toml", "types-tqdm", "types-urllib3", "typing-extensions (>=4.8.0)", "urllib3 (<2.0)", "watchdog"]
+fastai = ["fastai (>=2.4)", "fastcore (>=1.3.27)", "toml"]
+inference = ["aiohttp", "pydantic (>1.1,<2.0)", "pydantic (>1.1,<3.0)"]
+quality = ["mypy (==1.5.1)", "ruff (>=0.1.3)"]
+tensorflow = ["graphviz", "pydot", "tensorflow"]
+testing = ["InquirerPy (==0.3.4)", "Jinja2", "Pillow", "aiohttp", "gradio", "jedi", "numpy", "pydantic (>1.1,<2.0)", "pydantic (>1.1,<3.0)", "pytest", "pytest-asyncio", "pytest-cov", "pytest-env", "pytest-vcr", "pytest-xdist", "soundfile", "urllib3 (<2.0)"]
+torch = ["torch"]
+typing = ["types-PyYAML", "types-requests", "types-simplejson", "types-toml", "types-tqdm", "types-urllib3", "typing-extensions (>=4.8.0)"]
+
+[[package]]
+name = "humanfriendly"
+version = "10.0"
+description = "Human friendly output for text interfaces using Python"
+optional = false
+python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*"
+files = [
+ {file = "humanfriendly-10.0-py2.py3-none-any.whl", hash = "sha256:1697e1a8a8f550fd43c2865cd84542fc175a61dcb779b6fee18cf6b6ccba1477"},
+ {file = "humanfriendly-10.0.tar.gz", hash = "sha256:6b0b831ce8f15f7300721aa49829fc4e83921a9a301cc7f606be6686a2288ddc"},
+]
+
+[package.dependencies]
+pyreadline3 = {version = "*", markers = "sys_platform == \"win32\" and python_version >= \"3.8\""}
+
+[[package]]
+name = "identify"
+version = "2.5.32"
+description = "File identification library for Python"
+optional = false
+python-versions = ">=3.8"
+files = [
+ {file = "identify-2.5.32-py2.py3-none-any.whl", hash = "sha256:0b7656ef6cba81664b783352c73f8c24b39cf82f926f78f4550eda928e5e0545"},
+ {file = "identify-2.5.32.tar.gz", hash = "sha256:5d9979348ec1a21c768ae07e0a652924538e8bce67313a73cb0f681cf08ba407"},
+]
+
+[package.extras]
+license = ["ukkonen"]
+
+[[package]]
+name = "idna"
+version = "3.6"
+description = "Internationalized Domain Names in Applications (IDNA)"
+optional = false
+python-versions = ">=3.5"
+files = [
+ {file = "idna-3.6-py3-none-any.whl", hash = "sha256:c05567e9c24a6b9faaa835c4821bad0590fbb9d5779e7caa6e1cc4978e7eb24f"},
+ {file = "idna-3.6.tar.gz", hash = "sha256:9ecdbbd083b06798ae1e86adcbfe8ab1479cf864e4ee30fe4e46a003d12491ca"},
+]
+
+[[package]]
+name = "importlib-metadata"
+version = "6.8.0"
+description = "Read metadata from Python packages"
+optional = false
+python-versions = ">=3.8"
+files = [
+ {file = "importlib_metadata-6.8.0-py3-none-any.whl", hash = "sha256:3ebb78df84a805d7698245025b975d9d67053cd94c79245ba4b3eb694abe68bb"},
+ {file = "importlib_metadata-6.8.0.tar.gz", hash = "sha256:dbace7892d8c0c4ac1ad096662232f831d4e64f4c4545bd53016a3e9d4654743"},
+]
+
+[package.dependencies]
+zipp = ">=0.5"
+
+[package.extras]
+docs = ["furo", "jaraco.packaging (>=9)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-lint"]
+perf = ["ipython"]
+testing = ["flufl.flake8", "importlib-resources (>=1.3)", "packaging", "pyfakefs", "pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-mypy (>=0.9.1)", "pytest-perf (>=0.9.2)", "pytest-ruff"]
+
+[[package]]
+name = "importlib-resources"
+version = "6.1.1"
+description = "Read resources from Python packages"
+optional = false
+python-versions = ">=3.8"
+files = [
+ {file = "importlib_resources-6.1.1-py3-none-any.whl", hash = "sha256:e8bf90d8213b486f428c9c39714b920041cb02c184686a3dee24905aaa8105d6"},
+ {file = "importlib_resources-6.1.1.tar.gz", hash = "sha256:3893a00122eafde6894c59914446a512f728a0c1a45f9bb9b63721b6bacf0b4a"},
+]
+
+[package.dependencies]
+zipp = {version = ">=3.1.0", markers = "python_version < \"3.10\""}
+
+[package.extras]
+docs = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (<7.2.5)", "sphinx (>=3.5)", "sphinx-lint"]
+testing = ["pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-mypy (>=0.9.1)", "pytest-ruff", "zipp (>=3.17)"]
+
+[[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 = "ipykernel"
+version = "6.27.1"
+description = "IPython Kernel for Jupyter"
+optional = false
+python-versions = ">=3.8"
+files = [
+ {file = "ipykernel-6.27.1-py3-none-any.whl", hash = "sha256:dab88b47f112f9f7df62236511023c9bdeef67abc73af7c652e4ce4441601686"},
+ {file = "ipykernel-6.27.1.tar.gz", hash = "sha256:7d5d594b6690654b4d299edba5e872dc17bb7396a8d0609c97cb7b8a1c605de6"},
+]
+
+[package.dependencies]
+appnope = {version = "*", markers = "platform_system == \"Darwin\""}
+comm = ">=0.1.1"
+debugpy = ">=1.6.5"
+ipython = ">=7.23.1"
+jupyter-client = ">=6.1.12"
+jupyter-core = ">=4.12,<5.0.dev0 || >=5.1.dev0"
+matplotlib-inline = ">=0.1"
+nest-asyncio = "*"
+packaging = "*"
+psutil = "*"
+pyzmq = ">=20"
+tornado = ">=6.1"
+traitlets = ">=5.4.0"
+
+[package.extras]
+cov = ["coverage[toml]", "curio", "matplotlib", "pytest-cov", "trio"]
+docs = ["myst-parser", "pydata-sphinx-theme", "sphinx", "sphinx-autodoc-typehints", "sphinxcontrib-github-alt", "sphinxcontrib-spelling", "trio"]
+pyqt5 = ["pyqt5"]
+pyside6 = ["pyside6"]
+test = ["flaky", "ipyparallel", "pre-commit", "pytest (>=7.0)", "pytest-asyncio", "pytest-cov", "pytest-timeout"]
+
+[[package]]
+name = "ipython"
+version = "8.18.1"
+description = "IPython: Productive Interactive Computing"
+optional = false
+python-versions = ">=3.9"
+files = [
+ {file = "ipython-8.18.1-py3-none-any.whl", hash = "sha256:e8267419d72d81955ec1177f8a29aaa90ac80ad647499201119e2f05e99aa397"},
+ {file = "ipython-8.18.1.tar.gz", hash = "sha256:ca6f079bb33457c66e233e4580ebfc4128855b4cf6370dddd73842a9563e8a27"},
+]
+
+[package.dependencies]
+colorama = {version = "*", markers = "sys_platform == \"win32\""}
+decorator = "*"
+exceptiongroup = {version = "*", markers = "python_version < \"3.11\""}
+jedi = ">=0.16"
+matplotlib-inline = "*"
+pexpect = {version = ">4.3", markers = "sys_platform != \"win32\""}
+prompt-toolkit = ">=3.0.41,<3.1.0"
+pygments = ">=2.4.0"
+stack-data = "*"
+traitlets = ">=5"
+typing-extensions = {version = "*", markers = "python_version < \"3.10\""}
+
+[package.extras]
+all = ["black", "curio", "docrepr", "exceptiongroup", "ipykernel", "ipyparallel", "ipywidgets", "matplotlib", "matplotlib (!=3.2.0)", "nbconvert", "nbformat", "notebook", "numpy (>=1.22)", "pandas", "pickleshare", "pytest (<7)", "pytest (<7.1)", "pytest-asyncio (<0.22)", "qtconsole", "setuptools (>=18.5)", "sphinx (>=1.3)", "sphinx-rtd-theme", "stack-data", "testpath", "trio", "typing-extensions"]
+black = ["black"]
+doc = ["docrepr", "exceptiongroup", "ipykernel", "matplotlib", "pickleshare", "pytest (<7)", "pytest (<7.1)", "pytest-asyncio (<0.22)", "setuptools (>=18.5)", "sphinx (>=1.3)", "sphinx-rtd-theme", "stack-data", "testpath", "typing-extensions"]
+kernel = ["ipykernel"]
+nbconvert = ["nbconvert"]
+nbformat = ["nbformat"]
+notebook = ["ipywidgets", "notebook"]
+parallel = ["ipyparallel"]
+qtconsole = ["qtconsole"]
+test = ["pickleshare", "pytest (<7.1)", "pytest-asyncio (<0.22)", "testpath"]
+test-extra = ["curio", "matplotlib (!=3.2.0)", "nbformat", "numpy (>=1.22)", "pandas", "pickleshare", "pytest (<7.1)", "pytest-asyncio (<0.22)", "testpath", "trio"]
+
+[[package]]
+name = "ipywidgets"
+version = "8.1.1"
+description = "Jupyter interactive widgets"
+optional = false
+python-versions = ">=3.7"
+files = [
+ {file = "ipywidgets-8.1.1-py3-none-any.whl", hash = "sha256:2b88d728656aea3bbfd05d32c747cfd0078f9d7e159cf982433b58ad717eed7f"},
+ {file = "ipywidgets-8.1.1.tar.gz", hash = "sha256:40211efb556adec6fa450ccc2a77d59ca44a060f4f9f136833df59c9f538e6e8"},
+]
+
+[package.dependencies]
+comm = ">=0.1.3"
+ipython = ">=6.1.0"
+jupyterlab-widgets = ">=3.0.9,<3.1.0"
+traitlets = ">=4.3.1"
+widgetsnbextension = ">=4.0.9,<4.1.0"
+
+[package.extras]
+test = ["ipykernel", "jsonschema", "pytest (>=3.6.0)", "pytest-cov", "pytz"]
+
+[[package]]
+name = "isoduration"
+version = "20.11.0"
+description = "Operations with ISO 8601 durations"
+optional = false
+python-versions = ">=3.7"
+files = [
+ {file = "isoduration-20.11.0-py3-none-any.whl", hash = "sha256:b2904c2a4228c3d44f409c8ae8e2370eb21a26f7ac2ec5446df141dde3452042"},
+ {file = "isoduration-20.11.0.tar.gz", hash = "sha256:ac2f9015137935279eac671f94f89eb00584f940f5dc49462a0c4ee692ba1bd9"},
+]
+
+[package.dependencies]
+arrow = ">=0.15.0"
+
+[[package]]
+name = "isort"
+version = "5.12.0"
+description = "A Python utility / library to sort Python imports."
+optional = false
+python-versions = ">=3.8.0"
+files = [
+ {file = "isort-5.12.0-py3-none-any.whl", hash = "sha256:f84c2818376e66cf843d497486ea8fed8700b340f308f076c6fb1229dff318b6"},
+ {file = "isort-5.12.0.tar.gz", hash = "sha256:8bef7dde241278824a6d83f44a544709b065191b95b6e50894bdc722fcba0504"},
+]
+
+[package.extras]
+colors = ["colorama (>=0.4.3)"]
+pipfile-deprecated-finder = ["pip-shims (>=0.5.2)", "pipreqs", "requirementslib"]
+plugins = ["setuptools"]
+requirements-deprecated-finder = ["pip-api", "pipreqs"]
+
+[[package]]
+name = "itsdangerous"
+version = "2.1.2"
+description = "Safely pass data to untrusted environments and back."
+optional = false
+python-versions = ">=3.7"
+files = [
+ {file = "itsdangerous-2.1.2-py3-none-any.whl", hash = "sha256:2c2349112351b88699d8d4b6b075022c0808887cb7ad10069318a8b0bc88db44"},
+ {file = "itsdangerous-2.1.2.tar.gz", hash = "sha256:5dbbc68b317e5e42f327f9021763545dc3fc3bfe22e6deb96aaf1fc38874156a"},
+]
+
+[[package]]
+name = "jedi"
+version = "0.19.1"
+description = "An autocompletion tool for Python that can be used for text editors."
+optional = false
+python-versions = ">=3.6"
+files = [
+ {file = "jedi-0.19.1-py2.py3-none-any.whl", hash = "sha256:e983c654fe5c02867aef4cdfce5a2fbb4a50adc0af145f70504238f18ef5e7e0"},
+ {file = "jedi-0.19.1.tar.gz", hash = "sha256:cf0496f3651bc65d7174ac1b7d043eff454892c708a87d1b683e57b569927ffd"},
+]
+
+[package.dependencies]
+parso = ">=0.8.3,<0.9.0"
+
+[package.extras]
+docs = ["Jinja2 (==2.11.3)", "MarkupSafe (==1.1.1)", "Pygments (==2.8.1)", "alabaster (==0.7.12)", "babel (==2.9.1)", "chardet (==4.0.0)", "commonmark (==0.8.1)", "docutils (==0.17.1)", "future (==0.18.2)", "idna (==2.10)", "imagesize (==1.2.0)", "mock (==1.0.1)", "packaging (==20.9)", "pyparsing (==2.4.7)", "pytz (==2021.1)", "readthedocs-sphinx-ext (==2.1.4)", "recommonmark (==0.5.0)", "requests (==2.25.1)", "six (==1.15.0)", "snowballstemmer (==2.1.0)", "sphinx (==1.8.5)", "sphinx-rtd-theme (==0.4.3)", "sphinxcontrib-serializinghtml (==1.1.4)", "sphinxcontrib-websupport (==1.2.4)", "urllib3 (==1.26.4)"]
+qa = ["flake8 (==5.0.4)", "mypy (==0.971)", "types-setuptools (==67.2.0.1)"]
+testing = ["Django", "attrs", "colorama", "docopt", "pytest (<7.0.0)"]
+
+[[package]]
+name = "jinja2"
+version = "3.1.2"
+description = "A very fast and expressive template engine."
+optional = false
+python-versions = ">=3.7"
+files = [
+ {file = "Jinja2-3.1.2-py3-none-any.whl", hash = "sha256:6088930bfe239f0e6710546ab9c19c9ef35e29792895fed6e6e31a023a182a61"},
+ {file = "Jinja2-3.1.2.tar.gz", hash = "sha256:31351a702a408a9e7595a8fc6150fc3f43bb6bf7e319770cbc0db9df9437e852"},
+]
+
+[package.dependencies]
+MarkupSafe = ">=2.0"
+
+[package.extras]
+i18n = ["Babel (>=2.7)"]
+
+[[package]]
+name = "joblib"
+version = "1.2.0"
+description = "Lightweight pipelining with Python functions"
+optional = false
+python-versions = ">=3.7"
+files = [
+ {file = "joblib-1.2.0-py3-none-any.whl", hash = "sha256:091138ed78f800342968c523bdde947e7a305b8594b910a0fea2ab83c3c6d385"},
+ {file = "joblib-1.2.0.tar.gz", hash = "sha256:e1cee4a79e4af22881164f218d4311f60074197fb707e082e803b61f6d137018"},
+]
+
+[[package]]
+name = "json5"
+version = "0.9.14"
+description = "A Python implementation of the JSON5 data format."
+optional = false
+python-versions = "*"
+files = [
+ {file = "json5-0.9.14-py2.py3-none-any.whl", hash = "sha256:740c7f1b9e584a468dbb2939d8d458db3427f2c93ae2139d05f47e453eae964f"},
+ {file = "json5-0.9.14.tar.gz", hash = "sha256:9ed66c3a6ca3510a976a9ef9b8c0787de24802724ab1860bc0153c7fdd589b02"},
+]
+
+[package.extras]
+dev = ["hypothesis"]
+
+[[package]]
+name = "jsonpointer"
+version = "2.4"
+description = "Identify specific nodes in a JSON document (RFC 6901)"
+optional = false
+python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, !=3.5.*, !=3.6.*"
+files = [
+ {file = "jsonpointer-2.4-py2.py3-none-any.whl", hash = "sha256:15d51bba20eea3165644553647711d150376234112651b4f1811022aecad7d7a"},
+ {file = "jsonpointer-2.4.tar.gz", hash = "sha256:585cee82b70211fa9e6043b7bb89db6e1aa49524340dde8ad6b63206ea689d88"},
+]
+
+[[package]]
+name = "jsonschema"
+version = "4.20.0"
+description = "An implementation of JSON Schema validation for Python"
+optional = false
+python-versions = ">=3.8"
+files = [
+ {file = "jsonschema-4.20.0-py3-none-any.whl", hash = "sha256:ed6231f0429ecf966f5bc8dfef245998220549cbbcf140f913b7464c52c3b6b3"},
+ {file = "jsonschema-4.20.0.tar.gz", hash = "sha256:4f614fd46d8d61258610998997743ec5492a648b33cf478c1ddc23ed4598a5fa"},
+]
+
+[package.dependencies]
+attrs = ">=22.2.0"
+fqdn = {version = "*", optional = true, markers = "extra == \"format-nongpl\""}
+idna = {version = "*", optional = true, markers = "extra == \"format-nongpl\""}
+isoduration = {version = "*", optional = true, markers = "extra == \"format-nongpl\""}
+jsonpointer = {version = ">1.13", optional = true, markers = "extra == \"format-nongpl\""}
+jsonschema-specifications = ">=2023.03.6"
+referencing = ">=0.28.4"
+rfc3339-validator = {version = "*", optional = true, markers = "extra == \"format-nongpl\""}
+rfc3986-validator = {version = ">0.1.0", optional = true, markers = "extra == \"format-nongpl\""}
+rpds-py = ">=0.7.1"
+uri-template = {version = "*", optional = true, markers = "extra == \"format-nongpl\""}
+webcolors = {version = ">=1.11", optional = true, markers = "extra == \"format-nongpl\""}
+
+[package.extras]
+format = ["fqdn", "idna", "isoduration", "jsonpointer (>1.13)", "rfc3339-validator", "rfc3987", "uri-template", "webcolors (>=1.11)"]
+format-nongpl = ["fqdn", "idna", "isoduration", "jsonpointer (>1.13)", "rfc3339-validator", "rfc3986-validator (>0.1.0)", "uri-template", "webcolors (>=1.11)"]
+
+[[package]]
+name = "jsonschema-specifications"
+version = "2023.11.2"
+description = "The JSON Schema meta-schemas and vocabularies, exposed as a Registry"
+optional = false
+python-versions = ">=3.8"
+files = [
+ {file = "jsonschema_specifications-2023.11.2-py3-none-any.whl", hash = "sha256:e74ba7c0a65e8cb49dc26837d6cfe576557084a8b423ed16a420984228104f93"},
+ {file = "jsonschema_specifications-2023.11.2.tar.gz", hash = "sha256:9472fc4fea474cd74bea4a2b190daeccb5a9e4db2ea80efcf7a1b582fc9a81b8"},
+]
+
+[package.dependencies]
+referencing = ">=0.31.0"
+
+[[package]]
+name = "jupyter"
+version = "1.0.0"
+description = "Jupyter metapackage. Install all the Jupyter components in one go."
+optional = false
+python-versions = "*"
+files = [
+ {file = "jupyter-1.0.0-py2.py3-none-any.whl", hash = "sha256:5b290f93b98ffbc21c0c7e749f054b3267782166d72fa5e3ed1ed4eaf34a2b78"},
+ {file = "jupyter-1.0.0.tar.gz", hash = "sha256:d9dc4b3318f310e34c82951ea5d6683f67bed7def4b259fafbfe4f1beb1d8e5f"},
+ {file = "jupyter-1.0.0.zip", hash = "sha256:3e1f86076bbb7c8c207829390305a2b1fe836d471ed54be66a3b8c41e7f46cc7"},
+]
+
+[package.dependencies]
+ipykernel = "*"
+ipywidgets = "*"
+jupyter-console = "*"
+nbconvert = "*"
+notebook = "*"
+qtconsole = "*"
+
+[[package]]
+name = "jupyter-client"
+version = "8.6.0"
+description = "Jupyter protocol implementation and client libraries"
+optional = false
+python-versions = ">=3.8"
+files = [
+ {file = "jupyter_client-8.6.0-py3-none-any.whl", hash = "sha256:909c474dbe62582ae62b758bca86d6518c85234bdee2d908c778db6d72f39d99"},
+ {file = "jupyter_client-8.6.0.tar.gz", hash = "sha256:0642244bb83b4764ae60d07e010e15f0e2d275ec4e918a8f7b80fbbef3ca60c7"},
+]
+
+[package.dependencies]
+importlib-metadata = {version = ">=4.8.3", markers = "python_version < \"3.10\""}
+jupyter-core = ">=4.12,<5.0.dev0 || >=5.1.dev0"
+python-dateutil = ">=2.8.2"
+pyzmq = ">=23.0"
+tornado = ">=6.2"
+traitlets = ">=5.3"
+
+[package.extras]
+docs = ["ipykernel", "myst-parser", "pydata-sphinx-theme", "sphinx (>=4)", "sphinx-autodoc-typehints", "sphinxcontrib-github-alt", "sphinxcontrib-spelling"]
+test = ["coverage", "ipykernel (>=6.14)", "mypy", "paramiko", "pre-commit", "pytest", "pytest-cov", "pytest-jupyter[client] (>=0.4.1)", "pytest-timeout"]
+
+[[package]]
+name = "jupyter-console"
+version = "6.6.3"
+description = "Jupyter terminal console"
+optional = false
+python-versions = ">=3.7"
+files = [
+ {file = "jupyter_console-6.6.3-py3-none-any.whl", hash = "sha256:309d33409fcc92ffdad25f0bcdf9a4a9daa61b6f341177570fdac03de5352485"},
+ {file = "jupyter_console-6.6.3.tar.gz", hash = "sha256:566a4bf31c87adbfadf22cdf846e3069b59a71ed5da71d6ba4d8aaad14a53539"},
+]
+
+[package.dependencies]
+ipykernel = ">=6.14"
+ipython = "*"
+jupyter-client = ">=7.0.0"
+jupyter-core = ">=4.12,<5.0.dev0 || >=5.1.dev0"
+prompt-toolkit = ">=3.0.30"
+pygments = "*"
+pyzmq = ">=17"
+traitlets = ">=5.4"
+
+[package.extras]
+test = ["flaky", "pexpect", "pytest"]
+
+[[package]]
+name = "jupyter-core"
+version = "5.5.0"
+description = "Jupyter core package. A base package on which Jupyter projects rely."
+optional = false
+python-versions = ">=3.8"
+files = [
+ {file = "jupyter_core-5.5.0-py3-none-any.whl", hash = "sha256:e11e02cd8ae0a9de5c6c44abf5727df9f2581055afe00b22183f621ba3585805"},
+ {file = "jupyter_core-5.5.0.tar.gz", hash = "sha256:880b86053bf298a8724994f95e99b99130659022a4f7f45f563084b6223861d3"},
+]
+
+[package.dependencies]
+platformdirs = ">=2.5"
+pywin32 = {version = ">=300", markers = "sys_platform == \"win32\" and platform_python_implementation != \"PyPy\""}
+traitlets = ">=5.3"
+
+[package.extras]
+docs = ["myst-parser", "pydata-sphinx-theme", "sphinx-autodoc-typehints", "sphinxcontrib-github-alt", "sphinxcontrib-spelling", "traitlets"]
+test = ["ipykernel", "pre-commit", "pytest", "pytest-cov", "pytest-timeout"]
+
+[[package]]
+name = "jupyter-events"
+version = "0.9.0"
+description = "Jupyter Event System library"
+optional = false
+python-versions = ">=3.8"
+files = [
+ {file = "jupyter_events-0.9.0-py3-none-any.whl", hash = "sha256:d853b3c10273ff9bc8bb8b30076d65e2c9685579db736873de6c2232dde148bf"},
+ {file = "jupyter_events-0.9.0.tar.gz", hash = "sha256:81ad2e4bc710881ec274d31c6c50669d71bbaa5dd9d01e600b56faa85700d399"},
+]
+
+[package.dependencies]
+jsonschema = {version = ">=4.18.0", extras = ["format-nongpl"]}
+python-json-logger = ">=2.0.4"
+pyyaml = ">=5.3"
+referencing = "*"
+rfc3339-validator = "*"
+rfc3986-validator = ">=0.1.1"
+traitlets = ">=5.3"
+
+[package.extras]
+cli = ["click", "rich"]
+docs = ["jupyterlite-sphinx", "myst-parser", "pydata-sphinx-theme", "sphinxcontrib-spelling"]
+test = ["click", "pre-commit", "pytest (>=7.0)", "pytest-asyncio (>=0.19.0)", "pytest-console-scripts", "rich"]
+
+[[package]]
+name = "jupyter-lsp"
+version = "2.2.1"
+description = "Multi-Language Server WebSocket proxy for Jupyter Notebook/Lab server"
+optional = false
+python-versions = ">=3.8"
+files = [
+ {file = "jupyter-lsp-2.2.1.tar.gz", hash = "sha256:b17fab6d70fe83c8896b0cff59237640038247c196056b43684a0902b6a9e0fb"},
+ {file = "jupyter_lsp-2.2.1-py3-none-any.whl", hash = "sha256:17a689910c5e4ae5e7d334b02f31d08ffbe98108f6f658fb05e4304b4345368b"},
+]
+
+[package.dependencies]
+importlib-metadata = {version = ">=4.8.3", markers = "python_version < \"3.10\""}
+jupyter-server = ">=1.1.2"
+
+[[package]]
+name = "jupyter-server"
+version = "2.11.1"
+description = "The backend—i.e. core services, APIs, and REST endpoints—to Jupyter web applications."
+optional = false
+python-versions = ">=3.8"
+files = [
+ {file = "jupyter_server-2.11.1-py3-none-any.whl", hash = "sha256:4b3a16e3ed16fd202588890f10b8ca589bd3e29405d128beb95935f059441373"},
+ {file = "jupyter_server-2.11.1.tar.gz", hash = "sha256:fe80bab96493acf5f7d6cd9a1575af8fbd253dc2591aa4d015131a1e03b5799a"},
+]
+
+[package.dependencies]
+anyio = ">=3.1.0"
+argon2-cffi = "*"
+jinja2 = "*"
+jupyter-client = ">=7.4.4"
+jupyter-core = ">=4.12,<5.0.dev0 || >=5.1.dev0"
+jupyter-events = ">=0.9.0"
+jupyter-server-terminals = "*"
+nbconvert = ">=6.4.4"
+nbformat = ">=5.3.0"
+overrides = "*"
+packaging = "*"
+prometheus-client = "*"
+pywinpty = {version = "*", markers = "os_name == \"nt\""}
+pyzmq = ">=24"
+send2trash = ">=1.8.2"
+terminado = ">=0.8.3"
+tornado = ">=6.2.0"
+traitlets = ">=5.6.0"
+websocket-client = "*"
+
+[package.extras]
+docs = ["ipykernel", "jinja2", "jupyter-client", "jupyter-server", "myst-parser", "nbformat", "prometheus-client", "pydata-sphinx-theme", "send2trash", "sphinx-autodoc-typehints", "sphinxcontrib-github-alt", "sphinxcontrib-openapi (>=0.8.0)", "sphinxcontrib-spelling", "sphinxemoji", "tornado", "typing-extensions"]
+test = ["flaky", "ipykernel", "pre-commit", "pytest (>=7.0)", "pytest-console-scripts", "pytest-jupyter[server] (>=0.4)", "pytest-timeout", "requests"]
+
+[[package]]
+name = "jupyter-server-terminals"
+version = "0.4.4"
+description = "A Jupyter Server Extension Providing Terminals."
+optional = false
+python-versions = ">=3.8"
+files = [
+ {file = "jupyter_server_terminals-0.4.4-py3-none-any.whl", hash = "sha256:75779164661cec02a8758a5311e18bb8eb70c4e86c6b699403100f1585a12a36"},
+ {file = "jupyter_server_terminals-0.4.4.tar.gz", hash = "sha256:57ab779797c25a7ba68e97bcfb5d7740f2b5e8a83b5e8102b10438041a7eac5d"},
+]
+
+[package.dependencies]
+pywinpty = {version = ">=2.0.3", markers = "os_name == \"nt\""}
+terminado = ">=0.8.3"
+
+[package.extras]
+docs = ["jinja2", "jupyter-server", "mistune (<3.0)", "myst-parser", "nbformat", "packaging", "pydata-sphinx-theme", "sphinxcontrib-github-alt", "sphinxcontrib-openapi", "sphinxcontrib-spelling", "sphinxemoji", "tornado"]
+test = ["coverage", "jupyter-server (>=2.0.0)", "pytest (>=7.0)", "pytest-cov", "pytest-jupyter[server] (>=0.5.3)", "pytest-timeout"]
+
+[[package]]
+name = "jupyterlab"
+version = "4.0.9"
+description = "JupyterLab computational environment"
+optional = false
+python-versions = ">=3.8"
+files = [
+ {file = "jupyterlab-4.0.9-py3-none-any.whl", hash = "sha256:9f6f8e36d543fdbcc3df961a1d6a3f524b4a4001be0327a398f68fa4e534107c"},
+ {file = "jupyterlab-4.0.9.tar.gz", hash = "sha256:9ebada41d52651f623c0c9f069ddb8a21d6848e4c887d8e5ddc0613166ed5c0b"},
+]
+
+[package.dependencies]
+async-lru = ">=1.0.0"
+importlib-metadata = {version = ">=4.8.3", markers = "python_version < \"3.10\""}
+ipykernel = "*"
+jinja2 = ">=3.0.3"
+jupyter-core = "*"
+jupyter-lsp = ">=2.0.0"
+jupyter-server = ">=2.4.0,<3"
+jupyterlab-server = ">=2.19.0,<3"
+notebook-shim = ">=0.2"
+packaging = "*"
+tomli = {version = "*", markers = "python_version < \"3.11\""}
+tornado = ">=6.2.0"
+traitlets = "*"
+
+[package.extras]
+dev = ["black[jupyter] (==23.10.1)", "build", "bump2version", "coverage", "hatch", "pre-commit", "pytest-cov", "ruff (==0.1.4)"]
+docs = ["jsx-lexer", "myst-parser", "pydata-sphinx-theme (>=0.13.0)", "pytest", "pytest-check-links", "pytest-tornasync", "sphinx (>=1.8,<7.2.0)", "sphinx-copybutton"]
+docs-screenshots = ["altair (==5.0.1)", "ipython (==8.14.0)", "ipywidgets (==8.0.6)", "jupyterlab-geojson (==3.4.0)", "jupyterlab-language-pack-zh-cn (==4.0.post0)", "matplotlib (==3.7.1)", "nbconvert (>=7.0.0)", "pandas (==2.0.2)", "scipy (==1.10.1)", "vega-datasets (==0.9.0)"]
+test = ["coverage", "pytest (>=7.0)", "pytest-check-links (>=0.7)", "pytest-console-scripts", "pytest-cov", "pytest-jupyter (>=0.5.3)", "pytest-timeout", "pytest-tornasync", "requests", "requests-cache", "virtualenv"]
+
+[[package]]
+name = "jupyterlab-pygments"
+version = "0.3.0"
+description = "Pygments theme using JupyterLab CSS variables"
+optional = false
+python-versions = ">=3.8"
+files = [
+ {file = "jupyterlab_pygments-0.3.0-py3-none-any.whl", hash = "sha256:841a89020971da1d8693f1a99997aefc5dc424bb1b251fd6322462a1b8842780"},
+ {file = "jupyterlab_pygments-0.3.0.tar.gz", hash = "sha256:721aca4d9029252b11cfa9d185e5b5af4d54772bb8072f9b7036f4170054d35d"},
+]
+
+[[package]]
+name = "jupyterlab-server"
+version = "2.25.2"
+description = "A set of server components for JupyterLab and JupyterLab like applications."
+optional = false
+python-versions = ">=3.8"
+files = [
+ {file = "jupyterlab_server-2.25.2-py3-none-any.whl", hash = "sha256:5b1798c9cc6a44f65c757de9f97fc06fc3d42535afbf47d2ace5e964ab447aaf"},
+ {file = "jupyterlab_server-2.25.2.tar.gz", hash = "sha256:bd0ec7a99ebcedc8bcff939ef86e52c378e44c2707e053fcd81d046ce979ee63"},
+]
+
+[package.dependencies]
+babel = ">=2.10"
+importlib-metadata = {version = ">=4.8.3", markers = "python_version < \"3.10\""}
+jinja2 = ">=3.0.3"
+json5 = ">=0.9.0"
+jsonschema = ">=4.18.0"
+jupyter-server = ">=1.21,<3"
+packaging = ">=21.3"
+requests = ">=2.31"
+
+[package.extras]
+docs = ["autodoc-traits", "jinja2 (<3.2.0)", "mistune (<4)", "myst-parser", "pydata-sphinx-theme", "sphinx", "sphinx-copybutton", "sphinxcontrib-openapi (>0.8)"]
+openapi = ["openapi-core (>=0.18.0,<0.19.0)", "ruamel-yaml"]
+test = ["hatch", "ipykernel", "openapi-core (>=0.18.0,<0.19.0)", "openapi-spec-validator (>=0.6.0,<0.8.0)", "pytest (>=7.0)", "pytest-console-scripts", "pytest-cov", "pytest-jupyter[server] (>=0.6.2)", "pytest-timeout", "requests-mock", "ruamel-yaml", "sphinxcontrib-spelling", "strict-rfc3339", "werkzeug"]
+
+[[package]]
+name = "jupyterlab-widgets"
+version = "3.0.9"
+description = "Jupyter interactive widgets for JupyterLab"
+optional = false
+python-versions = ">=3.7"
+files = [
+ {file = "jupyterlab_widgets-3.0.9-py3-none-any.whl", hash = "sha256:3cf5bdf5b897bf3bccf1c11873aa4afd776d7430200f765e0686bd352487b58d"},
+ {file = "jupyterlab_widgets-3.0.9.tar.gz", hash = "sha256:6005a4e974c7beee84060fdfba341a3218495046de8ae3ec64888e5fe19fdb4c"},
+]
+
+[[package]]
+name = "kiwisolver"
+version = "1.4.5"
+description = "A fast implementation of the Cassowary constraint solver"
+optional = false
+python-versions = ">=3.7"
+files = [
+ {file = "kiwisolver-1.4.5-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:05703cf211d585109fcd72207a31bb170a0f22144d68298dc5e61b3c946518af"},
+ {file = "kiwisolver-1.4.5-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:146d14bebb7f1dc4d5fbf74f8a6cb15ac42baadee8912eb84ac0b3b2a3dc6ac3"},
+ {file = "kiwisolver-1.4.5-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:6ef7afcd2d281494c0a9101d5c571970708ad911d028137cd558f02b851c08b4"},
+ {file = "kiwisolver-1.4.5-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:9eaa8b117dc8337728e834b9c6e2611f10c79e38f65157c4c38e9400286f5cb1"},
+ {file = "kiwisolver-1.4.5-cp310-cp310-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:ec20916e7b4cbfb1f12380e46486ec4bcbaa91a9c448b97023fde0d5bbf9e4ff"},
+ {file = "kiwisolver-1.4.5-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:39b42c68602539407884cf70d6a480a469b93b81b7701378ba5e2328660c847a"},
+ {file = "kiwisolver-1.4.5-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:aa12042de0171fad672b6c59df69106d20d5596e4f87b5e8f76df757a7c399aa"},
+ {file = "kiwisolver-1.4.5-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2a40773c71d7ccdd3798f6489aaac9eee213d566850a9533f8d26332d626b82c"},
+ {file = "kiwisolver-1.4.5-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:19df6e621f6d8b4b9c4d45f40a66839294ff2bb235e64d2178f7522d9170ac5b"},
+ {file = "kiwisolver-1.4.5-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:83d78376d0d4fd884e2c114d0621624b73d2aba4e2788182d286309ebdeed770"},
+ {file = "kiwisolver-1.4.5-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:e391b1f0a8a5a10ab3b9bb6afcfd74f2175f24f8975fb87ecae700d1503cdee0"},
+ {file = "kiwisolver-1.4.5-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:852542f9481f4a62dbb5dd99e8ab7aedfeb8fb6342349a181d4036877410f525"},
+ {file = "kiwisolver-1.4.5-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:59edc41b24031bc25108e210c0def6f6c2191210492a972d585a06ff246bb79b"},
+ {file = "kiwisolver-1.4.5-cp310-cp310-win32.whl", hash = "sha256:a6aa6315319a052b4ee378aa171959c898a6183f15c1e541821c5c59beaa0238"},
+ {file = "kiwisolver-1.4.5-cp310-cp310-win_amd64.whl", hash = "sha256:d0ef46024e6a3d79c01ff13801cb19d0cad7fd859b15037aec74315540acc276"},
+ {file = "kiwisolver-1.4.5-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:11863aa14a51fd6ec28688d76f1735f8f69ab1fabf388851a595d0721af042f5"},
+ {file = "kiwisolver-1.4.5-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:8ab3919a9997ab7ef2fbbed0cc99bb28d3c13e6d4b1ad36e97e482558a91be90"},
+ {file = "kiwisolver-1.4.5-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:fcc700eadbbccbf6bc1bcb9dbe0786b4b1cb91ca0dcda336eef5c2beed37b797"},
+ {file = "kiwisolver-1.4.5-cp311-cp311-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:dfdd7c0b105af050eb3d64997809dc21da247cf44e63dc73ff0fd20b96be55a9"},
+ {file = "kiwisolver-1.4.5-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:76c6a5964640638cdeaa0c359382e5703e9293030fe730018ca06bc2010c4437"},
+ {file = "kiwisolver-1.4.5-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:bbea0db94288e29afcc4c28afbf3a7ccaf2d7e027489c449cf7e8f83c6346eb9"},
+ {file = "kiwisolver-1.4.5-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:ceec1a6bc6cab1d6ff5d06592a91a692f90ec7505d6463a88a52cc0eb58545da"},
+ {file = "kiwisolver-1.4.5-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:040c1aebeda72197ef477a906782b5ab0d387642e93bda547336b8957c61022e"},
+ {file = "kiwisolver-1.4.5-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:f91de7223d4c7b793867797bacd1ee53bfe7359bd70d27b7b58a04efbb9436c8"},
+ {file = "kiwisolver-1.4.5-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:faae4860798c31530dd184046a900e652c95513796ef51a12bc086710c2eec4d"},
+ {file = "kiwisolver-1.4.5-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:b0157420efcb803e71d1b28e2c287518b8808b7cf1ab8af36718fd0a2c453eb0"},
+ {file = "kiwisolver-1.4.5-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:06f54715b7737c2fecdbf140d1afb11a33d59508a47bf11bb38ecf21dc9ab79f"},
+ {file = "kiwisolver-1.4.5-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:fdb7adb641a0d13bdcd4ef48e062363d8a9ad4a182ac7647ec88f695e719ae9f"},
+ {file = "kiwisolver-1.4.5-cp311-cp311-win32.whl", hash = "sha256:bb86433b1cfe686da83ce32a9d3a8dd308e85c76b60896d58f082136f10bffac"},
+ {file = "kiwisolver-1.4.5-cp311-cp311-win_amd64.whl", hash = "sha256:6c08e1312a9cf1074d17b17728d3dfce2a5125b2d791527f33ffbe805200a355"},
+ {file = "kiwisolver-1.4.5-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:32d5cf40c4f7c7b3ca500f8985eb3fb3a7dfc023215e876f207956b5ea26632a"},
+ {file = "kiwisolver-1.4.5-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:f846c260f483d1fd217fe5ed7c173fb109efa6b1fc8381c8b7552c5781756192"},
+ {file = "kiwisolver-1.4.5-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:5ff5cf3571589b6d13bfbfd6bcd7a3f659e42f96b5fd1c4830c4cf21d4f5ef45"},
+ {file = "kiwisolver-1.4.5-cp312-cp312-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7269d9e5f1084a653d575c7ec012ff57f0c042258bf5db0954bf551c158466e7"},
+ {file = "kiwisolver-1.4.5-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:da802a19d6e15dffe4b0c24b38b3af68e6c1a68e6e1d8f30148c83864f3881db"},
+ {file = "kiwisolver-1.4.5-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3aba7311af82e335dd1e36ffff68aaca609ca6290c2cb6d821a39aa075d8e3ff"},
+ {file = "kiwisolver-1.4.5-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:763773d53f07244148ccac5b084da5adb90bfaee39c197554f01b286cf869228"},
+ {file = "kiwisolver-1.4.5-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2270953c0d8cdab5d422bee7d2007f043473f9d2999631c86a223c9db56cbd16"},
+ {file = "kiwisolver-1.4.5-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:d099e745a512f7e3bbe7249ca835f4d357c586d78d79ae8f1dcd4d8adeb9bda9"},
+ {file = "kiwisolver-1.4.5-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:74db36e14a7d1ce0986fa104f7d5637aea5c82ca6326ed0ec5694280942d1162"},
+ {file = "kiwisolver-1.4.5-cp312-cp312-musllinux_1_1_ppc64le.whl", hash = "sha256:7e5bab140c309cb3a6ce373a9e71eb7e4873c70c2dda01df6820474f9889d6d4"},
+ {file = "kiwisolver-1.4.5-cp312-cp312-musllinux_1_1_s390x.whl", hash = "sha256:0f114aa76dc1b8f636d077979c0ac22e7cd8f3493abbab152f20eb8d3cda71f3"},
+ {file = "kiwisolver-1.4.5-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:88a2df29d4724b9237fc0c6eaf2a1adae0cdc0b3e9f4d8e7dc54b16812d2d81a"},
+ {file = "kiwisolver-1.4.5-cp312-cp312-win32.whl", hash = "sha256:72d40b33e834371fd330fb1472ca19d9b8327acb79a5821d4008391db8e29f20"},
+ {file = "kiwisolver-1.4.5-cp312-cp312-win_amd64.whl", hash = "sha256:2c5674c4e74d939b9d91dda0fae10597ac7521768fec9e399c70a1f27e2ea2d9"},
+ {file = "kiwisolver-1.4.5-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:3a2b053a0ab7a3960c98725cfb0bf5b48ba82f64ec95fe06f1d06c99b552e130"},
+ {file = "kiwisolver-1.4.5-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3cd32d6c13807e5c66a7cbb79f90b553642f296ae4518a60d8d76243b0ad2898"},
+ {file = "kiwisolver-1.4.5-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:59ec7b7c7e1a61061850d53aaf8e93db63dce0c936db1fda2658b70e4a1be709"},
+ {file = "kiwisolver-1.4.5-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:da4cfb373035def307905d05041c1d06d8936452fe89d464743ae7fb8371078b"},
+ {file = "kiwisolver-1.4.5-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:2400873bccc260b6ae184b2b8a4fec0e4082d30648eadb7c3d9a13405d861e89"},
+ {file = "kiwisolver-1.4.5-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:1b04139c4236a0f3aff534479b58f6f849a8b351e1314826c2d230849ed48985"},
+ {file = "kiwisolver-1.4.5-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:4e66e81a5779b65ac21764c295087de82235597a2293d18d943f8e9e32746265"},
+ {file = "kiwisolver-1.4.5-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:7931d8f1f67c4be9ba1dd9c451fb0eeca1a25b89e4d3f89e828fe12a519b782a"},
+ {file = "kiwisolver-1.4.5-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:b3f7e75f3015df442238cca659f8baa5f42ce2a8582727981cbfa15fee0ee205"},
+ {file = "kiwisolver-1.4.5-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:bbf1d63eef84b2e8c89011b7f2235b1e0bf7dacc11cac9431fc6468e99ac77fb"},
+ {file = "kiwisolver-1.4.5-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:4c380469bd3f970ef677bf2bcba2b6b0b4d5c75e7a020fb863ef75084efad66f"},
+ {file = "kiwisolver-1.4.5-cp37-cp37m-win32.whl", hash = "sha256:9408acf3270c4b6baad483865191e3e582b638b1654a007c62e3efe96f09a9a3"},
+ {file = "kiwisolver-1.4.5-cp37-cp37m-win_amd64.whl", hash = "sha256:5b94529f9b2591b7af5f3e0e730a4e0a41ea174af35a4fd067775f9bdfeee01a"},
+ {file = "kiwisolver-1.4.5-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:11c7de8f692fc99816e8ac50d1d1aef4f75126eefc33ac79aac02c099fd3db71"},
+ {file = "kiwisolver-1.4.5-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:53abb58632235cd154176ced1ae8f0d29a6657aa1aa9decf50b899b755bc2b93"},
+ {file = "kiwisolver-1.4.5-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:88b9f257ca61b838b6f8094a62418421f87ac2a1069f7e896c36a7d86b5d4c29"},
+ {file = "kiwisolver-1.4.5-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3195782b26fc03aa9c6913d5bad5aeb864bdc372924c093b0f1cebad603dd712"},
+ {file = "kiwisolver-1.4.5-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:fc579bf0f502e54926519451b920e875f433aceb4624a3646b3252b5caa9e0b6"},
+ {file = "kiwisolver-1.4.5-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5a580c91d686376f0f7c295357595c5a026e6cbc3d77b7c36e290201e7c11ecb"},
+ {file = "kiwisolver-1.4.5-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:cfe6ab8da05c01ba6fbea630377b5da2cd9bcbc6338510116b01c1bc939a2c18"},
+ {file = "kiwisolver-1.4.5-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:d2e5a98f0ec99beb3c10e13b387f8db39106d53993f498b295f0c914328b1333"},
+ {file = "kiwisolver-1.4.5-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:a51a263952b1429e429ff236d2f5a21c5125437861baeed77f5e1cc2d2c7c6da"},
+ {file = "kiwisolver-1.4.5-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:3edd2fa14e68c9be82c5b16689e8d63d89fe927e56debd6e1dbce7a26a17f81b"},
+ {file = "kiwisolver-1.4.5-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:74d1b44c6cfc897df648cc9fdaa09bc3e7679926e6f96df05775d4fb3946571c"},
+ {file = "kiwisolver-1.4.5-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:76d9289ed3f7501012e05abb8358bbb129149dbd173f1f57a1bf1c22d19ab7cc"},
+ {file = "kiwisolver-1.4.5-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:92dea1ffe3714fa8eb6a314d2b3c773208d865a0e0d35e713ec54eea08a66250"},
+ {file = "kiwisolver-1.4.5-cp38-cp38-win32.whl", hash = "sha256:5c90ae8c8d32e472be041e76f9d2f2dbff4d0b0be8bd4041770eddb18cf49a4e"},
+ {file = "kiwisolver-1.4.5-cp38-cp38-win_amd64.whl", hash = "sha256:c7940c1dc63eb37a67721b10d703247552416f719c4188c54e04334321351ced"},
+ {file = "kiwisolver-1.4.5-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:9407b6a5f0d675e8a827ad8742e1d6b49d9c1a1da5d952a67d50ef5f4170b18d"},
+ {file = "kiwisolver-1.4.5-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:15568384086b6df3c65353820a4473575dbad192e35010f622c6ce3eebd57af9"},
+ {file = "kiwisolver-1.4.5-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:0dc9db8e79f0036e8173c466d21ef18e1befc02de8bf8aa8dc0813a6dc8a7046"},
+ {file = "kiwisolver-1.4.5-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:cdc8a402aaee9a798b50d8b827d7ecf75edc5fb35ea0f91f213ff927c15f4ff0"},
+ {file = "kiwisolver-1.4.5-cp39-cp39-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:6c3bd3cde54cafb87d74d8db50b909705c62b17c2099b8f2e25b461882e544ff"},
+ {file = "kiwisolver-1.4.5-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:955e8513d07a283056b1396e9a57ceddbd272d9252c14f154d450d227606eb54"},
+ {file = "kiwisolver-1.4.5-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:346f5343b9e3f00b8db8ba359350eb124b98c99efd0b408728ac6ebf38173958"},
+ {file = "kiwisolver-1.4.5-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b9098e0049e88c6a24ff64545cdfc50807818ba6c1b739cae221bbbcbc58aad3"},
+ {file = "kiwisolver-1.4.5-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:00bd361b903dc4bbf4eb165f24d1acbee754fce22ded24c3d56eec268658a5cf"},
+ {file = "kiwisolver-1.4.5-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:7b8b454bac16428b22560d0a1cf0a09875339cab69df61d7805bf48919415901"},
+ {file = "kiwisolver-1.4.5-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:f1d072c2eb0ad60d4c183f3fb44ac6f73fb7a8f16a2694a91f988275cbf352f9"},
+ {file = "kiwisolver-1.4.5-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:31a82d498054cac9f6d0b53d02bb85811185bcb477d4b60144f915f3b3126342"},
+ {file = "kiwisolver-1.4.5-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:6512cb89e334e4700febbffaaa52761b65b4f5a3cf33f960213d5656cea36a77"},
+ {file = "kiwisolver-1.4.5-cp39-cp39-win32.whl", hash = "sha256:9db8ea4c388fdb0f780fe91346fd438657ea602d58348753d9fb265ce1bca67f"},
+ {file = "kiwisolver-1.4.5-cp39-cp39-win_amd64.whl", hash = "sha256:59415f46a37f7f2efeec758353dd2eae1b07640d8ca0f0c42548ec4125492635"},
+ {file = "kiwisolver-1.4.5-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:5c7b3b3a728dc6faf3fc372ef24f21d1e3cee2ac3e9596691d746e5a536de920"},
+ {file = "kiwisolver-1.4.5-pp37-pypy37_pp73-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:620ced262a86244e2be10a676b646f29c34537d0d9cc8eb26c08f53d98013390"},
+ {file = "kiwisolver-1.4.5-pp37-pypy37_pp73-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:378a214a1e3bbf5ac4a8708304318b4f890da88c9e6a07699c4ae7174c09a68d"},
+ {file = "kiwisolver-1.4.5-pp37-pypy37_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:aaf7be1207676ac608a50cd08f102f6742dbfc70e8d60c4db1c6897f62f71523"},
+ {file = "kiwisolver-1.4.5-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:ba55dce0a9b8ff59495ddd050a0225d58bd0983d09f87cfe2b6aec4f2c1234e4"},
+ {file = "kiwisolver-1.4.5-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:fd32ea360bcbb92d28933fc05ed09bffcb1704ba3fc7942e81db0fd4f81a7892"},
+ {file = "kiwisolver-1.4.5-pp38-pypy38_pp73-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:5e7139af55d1688f8b960ee9ad5adafc4ac17c1c473fe07133ac092310d76544"},
+ {file = "kiwisolver-1.4.5-pp38-pypy38_pp73-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:dced8146011d2bc2e883f9bd68618b8247387f4bbec46d7392b3c3b032640126"},
+ {file = "kiwisolver-1.4.5-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c9bf3325c47b11b2e51bca0824ea217c7cd84491d8ac4eefd1e409705ef092bd"},
+ {file = "kiwisolver-1.4.5-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:5794cf59533bc3f1b1c821f7206a3617999db9fbefc345360aafe2e067514929"},
+ {file = "kiwisolver-1.4.5-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:e368f200bbc2e4f905b8e71eb38b3c04333bddaa6a2464a6355487b02bb7fb09"},
+ {file = "kiwisolver-1.4.5-pp39-pypy39_pp73-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e5d706eba36b4c4d5bc6c6377bb6568098765e990cfc21ee16d13963fab7b3e7"},
+ {file = "kiwisolver-1.4.5-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:85267bd1aa8880a9c88a8cb71e18d3d64d2751a790e6ca6c27b8ccc724bcd5ad"},
+ {file = "kiwisolver-1.4.5-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:210ef2c3a1f03272649aff1ef992df2e724748918c4bc2d5a90352849eb40bea"},
+ {file = "kiwisolver-1.4.5-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:11d011a7574eb3b82bcc9c1a1d35c1d7075677fdd15de527d91b46bd35e935ee"},
+ {file = "kiwisolver-1.4.5.tar.gz", hash = "sha256:e57e563a57fb22a142da34f38acc2fc1a5c864bc29ca1517a88abc963e60d6ec"},
+]
+
+[[package]]
+name = "lightning-utilities"
+version = "0.10.0"
+description = "PyTorch Lightning Sample project."
+optional = false
+python-versions = ">=3.7"
+files = [
+ {file = "lightning-utilities-0.10.0.tar.gz", hash = "sha256:9e31617eccbbadc6b737a2432fd7076ff8e24957f9c63aeba2530b189e19319c"},
+ {file = "lightning_utilities-0.10.0-py3-none-any.whl", hash = "sha256:84d09b11fe9bc16c803ae5e412874748239d73ad2f3d1b90862f99ce15a03aa0"},
+]
+
+[package.dependencies]
+packaging = ">=17.1"
+setuptools = "*"
+typing-extensions = "*"
+
+[package.extras]
+cli = ["fire"]
+docs = ["requests (>=2.0.0)"]
+typing = ["mypy (>=1.0.0)", "types-setuptools"]
+
+[[package]]
+name = "loguru"
+version = "0.7.2"
+description = "Python logging made (stupidly) simple"
+optional = false
+python-versions = ">=3.5"
+files = [
+ {file = "loguru-0.7.2-py3-none-any.whl", hash = "sha256:003d71e3d3ed35f0f8984898359d65b79e5b21943f78af86aa5491210429b8eb"},
+ {file = "loguru-0.7.2.tar.gz", hash = "sha256:e671a53522515f34fd406340ee968cb9ecafbc4b36c679da03c18fd8d0bd51ac"},
+]
+
+[package.dependencies]
+colorama = {version = ">=0.3.4", markers = "sys_platform == \"win32\""}
+win32-setctime = {version = ">=1.0.0", markers = "sys_platform == \"win32\""}
+
+[package.extras]
+dev = ["Sphinx (==7.2.5)", "colorama (==0.4.5)", "colorama (==0.4.6)", "exceptiongroup (==1.1.3)", "freezegun (==1.1.0)", "freezegun (==1.2.2)", "mypy (==v0.910)", "mypy (==v0.971)", "mypy (==v1.4.1)", "mypy (==v1.5.1)", "pre-commit (==3.4.0)", "pytest (==6.1.2)", "pytest (==7.4.0)", "pytest-cov (==2.12.1)", "pytest-cov (==4.1.0)", "pytest-mypy-plugins (==1.9.3)", "pytest-mypy-plugins (==3.0.0)", "sphinx-autobuild (==2021.3.14)", "sphinx-rtd-theme (==1.3.0)", "tox (==3.27.1)", "tox (==4.11.0)"]
+
+[[package]]
+name = "makefun"
+version = "1.15.2"
+description = "Small library to dynamically create python functions."
+optional = false
+python-versions = "*"
+files = [
+ {file = "makefun-1.15.2-py2.py3-none-any.whl", hash = "sha256:1c83abfaefb6c3c7c83ed4a993b4a310af80adf6db15625b184b1f0f7545a041"},
+ {file = "makefun-1.15.2.tar.gz", hash = "sha256:16f2a2b34d9ee0c2b578c960a1808c974e2822cf79f6e9b9c455aace10882d45"},
+]
+
+[[package]]
+name = "markdown-it-py"
+version = "3.0.0"
+description = "Python port of markdown-it. Markdown parsing, done right!"
+optional = false
+python-versions = ">=3.8"
+files = [
+ {file = "markdown-it-py-3.0.0.tar.gz", hash = "sha256:e3f60a94fa066dc52ec76661e37c851cb232d92f9886b15cb560aaada2df8feb"},
+ {file = "markdown_it_py-3.0.0-py3-none-any.whl", hash = "sha256:355216845c60bd96232cd8d8c40e8f9765cc86f46880e43a8fd22dc1a1a8cab1"},
+]
+
+[package.dependencies]
+mdurl = ">=0.1,<1.0"
+
+[package.extras]
+benchmarking = ["psutil", "pytest", "pytest-benchmark"]
+code-style = ["pre-commit (>=3.0,<4.0)"]
+compare = ["commonmark (>=0.9,<1.0)", "markdown (>=3.4,<4.0)", "mistletoe (>=1.0,<2.0)", "mistune (>=2.0,<3.0)", "panflute (>=2.3,<3.0)"]
+linkify = ["linkify-it-py (>=1,<3)"]
+plugins = ["mdit-py-plugins"]
+profiling = ["gprof2dot"]
+rtd = ["jupyter_sphinx", "mdit-py-plugins", "myst-parser", "pyyaml", "sphinx", "sphinx-copybutton", "sphinx-design", "sphinx_book_theme"]
+testing = ["coverage", "pytest", "pytest-cov", "pytest-regressions"]
+
+[[package]]
+name = "markupsafe"
+version = "2.1.3"
+description = "Safely add untrusted strings to HTML/XML markup."
+optional = false
+python-versions = ">=3.7"
+files = [
+ {file = "MarkupSafe-2.1.3-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:cd0f502fe016460680cd20aaa5a76d241d6f35a1c3350c474bac1273803893fa"},
+ {file = "MarkupSafe-2.1.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:e09031c87a1e51556fdcb46e5bd4f59dfb743061cf93c4d6831bf894f125eb57"},
+ {file = "MarkupSafe-2.1.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:68e78619a61ecf91e76aa3e6e8e33fc4894a2bebe93410754bd28fce0a8a4f9f"},
+ {file = "MarkupSafe-2.1.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:65c1a9bcdadc6c28eecee2c119465aebff8f7a584dd719facdd9e825ec61ab52"},
+ {file = "MarkupSafe-2.1.3-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:525808b8019e36eb524b8c68acdd63a37e75714eac50e988180b169d64480a00"},
+ {file = "MarkupSafe-2.1.3-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:962f82a3086483f5e5f64dbad880d31038b698494799b097bc59c2edf392fce6"},
+ {file = "MarkupSafe-2.1.3-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:aa7bd130efab1c280bed0f45501b7c8795f9fdbeb02e965371bbef3523627779"},
+ {file = "MarkupSafe-2.1.3-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:c9c804664ebe8f83a211cace637506669e7890fec1b4195b505c214e50dd4eb7"},
+ {file = "MarkupSafe-2.1.3-cp310-cp310-win32.whl", hash = "sha256:10bbfe99883db80bdbaff2dcf681dfc6533a614f700da1287707e8a5d78a8431"},
+ {file = "MarkupSafe-2.1.3-cp310-cp310-win_amd64.whl", hash = "sha256:1577735524cdad32f9f694208aa75e422adba74f1baee7551620e43a3141f559"},
+ {file = "MarkupSafe-2.1.3-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:ad9e82fb8f09ade1c3e1b996a6337afac2b8b9e365f926f5a61aacc71adc5b3c"},
+ {file = "MarkupSafe-2.1.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:3c0fae6c3be832a0a0473ac912810b2877c8cb9d76ca48de1ed31e1c68386575"},
+ {file = "MarkupSafe-2.1.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b076b6226fb84157e3f7c971a47ff3a679d837cf338547532ab866c57930dbee"},
+ {file = "MarkupSafe-2.1.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bfce63a9e7834b12b87c64d6b155fdd9b3b96191b6bd334bf37db7ff1fe457f2"},
+ {file = "MarkupSafe-2.1.3-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:338ae27d6b8745585f87218a3f23f1512dbf52c26c28e322dbe54bcede54ccb9"},
+ {file = "MarkupSafe-2.1.3-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:e4dd52d80b8c83fdce44e12478ad2e85c64ea965e75d66dbeafb0a3e77308fcc"},
+ {file = "MarkupSafe-2.1.3-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:df0be2b576a7abbf737b1575f048c23fb1d769f267ec4358296f31c2479db8f9"},
+ {file = "MarkupSafe-2.1.3-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:5bbe06f8eeafd38e5d0a4894ffec89378b6c6a625ff57e3028921f8ff59318ac"},
+ {file = "MarkupSafe-2.1.3-cp311-cp311-win32.whl", hash = "sha256:dd15ff04ffd7e05ffcb7fe79f1b98041b8ea30ae9234aed2a9168b5797c3effb"},
+ {file = "MarkupSafe-2.1.3-cp311-cp311-win_amd64.whl", hash = "sha256:134da1eca9ec0ae528110ccc9e48041e0828d79f24121a1a146161103c76e686"},
+ {file = "MarkupSafe-2.1.3-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:f698de3fd0c4e6972b92290a45bd9b1536bffe8c6759c62471efaa8acb4c37bc"},
+ {file = "MarkupSafe-2.1.3-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:aa57bd9cf8ae831a362185ee444e15a93ecb2e344c8e52e4d721ea3ab6ef1823"},
+ {file = "MarkupSafe-2.1.3-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ffcc3f7c66b5f5b7931a5aa68fc9cecc51e685ef90282f4a82f0f5e9b704ad11"},
+ {file = "MarkupSafe-2.1.3-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:47d4f1c5f80fc62fdd7777d0d40a2e9dda0a05883ab11374334f6c4de38adffd"},
+ {file = "MarkupSafe-2.1.3-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1f67c7038d560d92149c060157d623c542173016c4babc0c1913cca0564b9939"},
+ {file = "MarkupSafe-2.1.3-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:9aad3c1755095ce347e26488214ef77e0485a3c34a50c5a5e2471dff60b9dd9c"},
+ {file = "MarkupSafe-2.1.3-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:14ff806850827afd6b07a5f32bd917fb7f45b046ba40c57abdb636674a8b559c"},
+ {file = "MarkupSafe-2.1.3-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:8f9293864fe09b8149f0cc42ce56e3f0e54de883a9de90cd427f191c346eb2e1"},
+ {file = "MarkupSafe-2.1.3-cp312-cp312-win32.whl", hash = "sha256:715d3562f79d540f251b99ebd6d8baa547118974341db04f5ad06d5ea3eb8007"},
+ {file = "MarkupSafe-2.1.3-cp312-cp312-win_amd64.whl", hash = "sha256:1b8dd8c3fd14349433c79fa8abeb573a55fc0fdd769133baac1f5e07abf54aeb"},
+ {file = "MarkupSafe-2.1.3-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:8e254ae696c88d98da6555f5ace2279cf7cd5b3f52be2b5cf97feafe883b58d2"},
+ {file = "MarkupSafe-2.1.3-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cb0932dc158471523c9637e807d9bfb93e06a95cbf010f1a38b98623b929ef2b"},
+ {file = "MarkupSafe-2.1.3-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9402b03f1a1b4dc4c19845e5c749e3ab82d5078d16a2a4c2cd2df62d57bb0707"},
+ {file = "MarkupSafe-2.1.3-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ca379055a47383d02a5400cb0d110cef0a776fc644cda797db0c5696cfd7e18e"},
+ {file = "MarkupSafe-2.1.3-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:b7ff0f54cb4ff66dd38bebd335a38e2c22c41a8ee45aa608efc890ac3e3931bc"},
+ {file = "MarkupSafe-2.1.3-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:c011a4149cfbcf9f03994ec2edffcb8b1dc2d2aede7ca243746df97a5d41ce48"},
+ {file = "MarkupSafe-2.1.3-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:56d9f2ecac662ca1611d183feb03a3fa4406469dafe241673d521dd5ae92a155"},
+ {file = "MarkupSafe-2.1.3-cp37-cp37m-win32.whl", hash = "sha256:8758846a7e80910096950b67071243da3e5a20ed2546e6392603c096778d48e0"},
+ {file = "MarkupSafe-2.1.3-cp37-cp37m-win_amd64.whl", hash = "sha256:787003c0ddb00500e49a10f2844fac87aa6ce977b90b0feaaf9de23c22508b24"},
+ {file = "MarkupSafe-2.1.3-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:2ef12179d3a291be237280175b542c07a36e7f60718296278d8593d21ca937d4"},
+ {file = "MarkupSafe-2.1.3-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:2c1b19b3aaacc6e57b7e25710ff571c24d6c3613a45e905b1fde04d691b98ee0"},
+ {file = "MarkupSafe-2.1.3-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8afafd99945ead6e075b973fefa56379c5b5c53fd8937dad92c662da5d8fd5ee"},
+ {file = "MarkupSafe-2.1.3-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8c41976a29d078bb235fea9b2ecd3da465df42a562910f9022f1a03107bd02be"},
+ {file = "MarkupSafe-2.1.3-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d080e0a5eb2529460b30190fcfcc4199bd7f827663f858a226a81bc27beaa97e"},
+ {file = "MarkupSafe-2.1.3-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:69c0f17e9f5a7afdf2cc9fb2d1ce6aabdb3bafb7f38017c0b77862bcec2bbad8"},
+ {file = "MarkupSafe-2.1.3-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:504b320cd4b7eff6f968eddf81127112db685e81f7e36e75f9f84f0df46041c3"},
+ {file = "MarkupSafe-2.1.3-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:42de32b22b6b804f42c5d98be4f7e5e977ecdd9ee9b660fda1a3edf03b11792d"},
+ {file = "MarkupSafe-2.1.3-cp38-cp38-win32.whl", hash = "sha256:ceb01949af7121f9fc39f7d27f91be8546f3fb112c608bc4029aef0bab86a2a5"},
+ {file = "MarkupSafe-2.1.3-cp38-cp38-win_amd64.whl", hash = "sha256:1b40069d487e7edb2676d3fbdb2b0829ffa2cd63a2ec26c4938b2d34391b4ecc"},
+ {file = "MarkupSafe-2.1.3-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:8023faf4e01efadfa183e863fefde0046de576c6f14659e8782065bcece22198"},
+ {file = "MarkupSafe-2.1.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:6b2b56950d93e41f33b4223ead100ea0fe11f8e6ee5f641eb753ce4b77a7042b"},
+ {file = "MarkupSafe-2.1.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9dcdfd0eaf283af041973bff14a2e143b8bd64e069f4c383416ecd79a81aab58"},
+ {file = "MarkupSafe-2.1.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:05fb21170423db021895e1ea1e1f3ab3adb85d1c2333cbc2310f2a26bc77272e"},
+ {file = "MarkupSafe-2.1.3-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:282c2cb35b5b673bbcadb33a585408104df04f14b2d9b01d4c345a3b92861c2c"},
+ {file = "MarkupSafe-2.1.3-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:ab4a0df41e7c16a1392727727e7998a467472d0ad65f3ad5e6e765015df08636"},
+ {file = "MarkupSafe-2.1.3-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:7ef3cb2ebbf91e330e3bb937efada0edd9003683db6b57bb108c4001f37a02ea"},
+ {file = "MarkupSafe-2.1.3-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:0a4e4a1aff6c7ac4cd55792abf96c915634c2b97e3cc1c7129578aa68ebd754e"},
+ {file = "MarkupSafe-2.1.3-cp39-cp39-win32.whl", hash = "sha256:fec21693218efe39aa7f8599346e90c705afa52c5b31ae019b2e57e8f6542bb2"},
+ {file = "MarkupSafe-2.1.3-cp39-cp39-win_amd64.whl", hash = "sha256:3fd4abcb888d15a94f32b75d8fd18ee162ca0c064f35b11134be77050296d6ba"},
+ {file = "MarkupSafe-2.1.3.tar.gz", hash = "sha256:af598ed32d6ae86f1b747b82783958b1a4ab8f617b06fe68795c7f026abbdcad"},
+]
+
+[[package]]
+name = "maskrcnn-benchmark"
+version = "0.1"
+description = "object detection in pytorch"
+optional = false
+python-versions = "*"
+files = []
+develop = false
+
+[package.dependencies]
+torch = "*"
+torchvision = "*"
+
+[package.source]
+type = "git"
+url = "https://github.com/emma-heriot-watt/scene-graph-benchmark.git"
+reference = "HEAD"
+resolved_reference = "07864b610cd7f5248e134af0cf416e037b81bf13"
+
+[[package]]
+name = "matplotlib"
+version = "3.8.2"
+description = "Python plotting package"
+optional = false
+python-versions = ">=3.9"
+files = [
+ {file = "matplotlib-3.8.2-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:09796f89fb71a0c0e1e2f4bdaf63fb2cefc84446bb963ecdeb40dfee7dfa98c7"},
+ {file = "matplotlib-3.8.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:6f9c6976748a25e8b9be51ea028df49b8e561eed7809146da7a47dbecebab367"},
+ {file = "matplotlib-3.8.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b78e4f2cedf303869b782071b55fdde5987fda3038e9d09e58c91cc261b5ad18"},
+ {file = "matplotlib-3.8.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4e208f46cf6576a7624195aa047cb344a7f802e113bb1a06cfd4bee431de5e31"},
+ {file = "matplotlib-3.8.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:46a569130ff53798ea5f50afce7406e91fdc471ca1e0e26ba976a8c734c9427a"},
+ {file = "matplotlib-3.8.2-cp310-cp310-win_amd64.whl", hash = "sha256:830f00640c965c5b7f6bc32f0d4ce0c36dfe0379f7dd65b07a00c801713ec40a"},
+ {file = "matplotlib-3.8.2-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:d86593ccf546223eb75a39b44c32788e6f6440d13cfc4750c1c15d0fcb850b63"},
+ {file = "matplotlib-3.8.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:9a5430836811b7652991939012f43d2808a2db9b64ee240387e8c43e2e5578c8"},
+ {file = "matplotlib-3.8.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b9576723858a78751d5aacd2497b8aef29ffea6d1c95981505877f7ac28215c6"},
+ {file = "matplotlib-3.8.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5ba9cbd8ac6cf422f3102622b20f8552d601bf8837e49a3afed188d560152788"},
+ {file = "matplotlib-3.8.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:03f9d160a29e0b65c0790bb07f4f45d6a181b1ac33eb1bb0dd225986450148f0"},
+ {file = "matplotlib-3.8.2-cp311-cp311-win_amd64.whl", hash = "sha256:3773002da767f0a9323ba1a9b9b5d00d6257dbd2a93107233167cfb581f64717"},
+ {file = "matplotlib-3.8.2-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:4c318c1e95e2f5926fba326f68177dee364aa791d6df022ceb91b8221bd0a627"},
+ {file = "matplotlib-3.8.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:091275d18d942cf1ee9609c830a1bc36610607d8223b1b981c37d5c9fc3e46a4"},
+ {file = "matplotlib-3.8.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1b0f3b8ea0e99e233a4bcc44590f01604840d833c280ebb8fe5554fd3e6cfe8d"},
+ {file = "matplotlib-3.8.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d7b1704a530395aaf73912be741c04d181f82ca78084fbd80bc737be04848331"},
+ {file = "matplotlib-3.8.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:533b0e3b0c6768eef8cbe4b583731ce25a91ab54a22f830db2b031e83cca9213"},
+ {file = "matplotlib-3.8.2-cp312-cp312-win_amd64.whl", hash = "sha256:0f4fc5d72b75e2c18e55eb32292659cf731d9d5b312a6eb036506304f4675630"},
+ {file = "matplotlib-3.8.2-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:deaed9ad4da0b1aea77fe0aa0cebb9ef611c70b3177be936a95e5d01fa05094f"},
+ {file = "matplotlib-3.8.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:172f4d0fbac3383d39164c6caafd3255ce6fa58f08fc392513a0b1d3b89c4f89"},
+ {file = "matplotlib-3.8.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c7d36c2209d9136cd8e02fab1c0ddc185ce79bc914c45054a9f514e44c787917"},
+ {file = "matplotlib-3.8.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5864bdd7da445e4e5e011b199bb67168cdad10b501750367c496420f2ad00843"},
+ {file = "matplotlib-3.8.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:ef8345b48e95cee45ff25192ed1f4857273117917a4dcd48e3905619bcd9c9b8"},
+ {file = "matplotlib-3.8.2-cp39-cp39-win_amd64.whl", hash = "sha256:7c48d9e221b637c017232e3760ed30b4e8d5dfd081daf327e829bf2a72c731b4"},
+ {file = "matplotlib-3.8.2-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:aa11b3c6928a1e496c1a79917d51d4cd5d04f8a2e75f21df4949eeefdf697f4b"},
+ {file = "matplotlib-3.8.2-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d1095fecf99eeb7384dabad4bf44b965f929a5f6079654b681193edf7169ec20"},
+ {file = "matplotlib-3.8.2-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:bddfb1db89bfaa855912261c805bd0e10218923cc262b9159a49c29a7a1c1afa"},
+ {file = "matplotlib-3.8.2.tar.gz", hash = "sha256:01a978b871b881ee76017152f1f1a0cbf6bd5f7b8ff8c96df0df1bd57d8755a1"},
+]
+
+[package.dependencies]
+contourpy = ">=1.0.1"
+cycler = ">=0.10"
+fonttools = ">=4.22.0"
+importlib-resources = {version = ">=3.2.0", markers = "python_version < \"3.10\""}
+kiwisolver = ">=1.3.1"
+numpy = ">=1.21,<2"
+packaging = ">=20.0"
+pillow = ">=8"
+pyparsing = ">=2.3.1"
+python-dateutil = ">=2.7"
+
+[[package]]
+name = "matplotlib-inline"
+version = "0.1.6"
+description = "Inline Matplotlib backend for Jupyter"
+optional = false
+python-versions = ">=3.5"
+files = [
+ {file = "matplotlib-inline-0.1.6.tar.gz", hash = "sha256:f887e5f10ba98e8d2b150ddcf4702c1e5f8b3a20005eb0f74bfdbd360ee6f304"},
+ {file = "matplotlib_inline-0.1.6-py3-none-any.whl", hash = "sha256:f1f41aab5328aa5aaea9b16d083b128102f8712542f819fe7e6a420ff581b311"},
+]
+
+[package.dependencies]
+traitlets = "*"
+
+[[package]]
+name = "mccabe"
+version = "0.7.0"
+description = "McCabe checker, plugin for flake8"
+optional = false
+python-versions = ">=3.6"
+files = [
+ {file = "mccabe-0.7.0-py2.py3-none-any.whl", hash = "sha256:6c2d30ab6be0e4a46919781807b4f0d834ebdd6c6e3dca0bda5a15f863427b6e"},
+ {file = "mccabe-0.7.0.tar.gz", hash = "sha256:348e0240c33b60bbdf4e523192ef919f28cb2c3d7d5c7794f74009290f236325"},
+]
+
+[[package]]
+name = "mdurl"
+version = "0.1.2"
+description = "Markdown URL utilities"
+optional = false
+python-versions = ">=3.7"
+files = [
+ {file = "mdurl-0.1.2-py3-none-any.whl", hash = "sha256:84008a41e51615a49fc9966191ff91509e3c40b939176e643fd50a5c2196b8f8"},
+ {file = "mdurl-0.1.2.tar.gz", hash = "sha256:bb413d29f5eea38f31dd4754dd7377d4465116fb207585f97bf925588687c1ba"},
+]
+
+[[package]]
+name = "mistune"
+version = "3.0.2"
+description = "A sane and fast Markdown parser with useful plugins and renderers"
+optional = false
+python-versions = ">=3.7"
+files = [
+ {file = "mistune-3.0.2-py3-none-any.whl", hash = "sha256:71481854c30fdbc938963d3605b72501f5c10a9320ecd412c121c163a1c7d205"},
+ {file = "mistune-3.0.2.tar.gz", hash = "sha256:fc7f93ded930c92394ef2cb6f04a8aabab4117a91449e72dcc8dfa646a508be8"},
+]
+
+[[package]]
+name = "multidict"
+version = "6.0.4"
+description = "multidict implementation"
+optional = false
+python-versions = ">=3.7"
+files = [
+ {file = "multidict-6.0.4-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:0b1a97283e0c85772d613878028fec909f003993e1007eafa715b24b377cb9b8"},
+ {file = "multidict-6.0.4-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:eeb6dcc05e911516ae3d1f207d4b0520d07f54484c49dfc294d6e7d63b734171"},
+ {file = "multidict-6.0.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:d6d635d5209b82a3492508cf5b365f3446afb65ae7ebd755e70e18f287b0adf7"},
+ {file = "multidict-6.0.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c048099e4c9e9d615545e2001d3d8a4380bd403e1a0578734e0d31703d1b0c0b"},
+ {file = "multidict-6.0.4-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ea20853c6dbbb53ed34cb4d080382169b6f4554d394015f1bef35e881bf83547"},
+ {file = "multidict-6.0.4-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:16d232d4e5396c2efbbf4f6d4df89bfa905eb0d4dc5b3549d872ab898451f569"},
+ {file = "multidict-6.0.4-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:36c63aaa167f6c6b04ef2c85704e93af16c11d20de1d133e39de6a0e84582a93"},
+ {file = "multidict-6.0.4-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:64bdf1086b6043bf519869678f5f2757f473dee970d7abf6da91ec00acb9cb98"},
+ {file = "multidict-6.0.4-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:43644e38f42e3af682690876cff722d301ac585c5b9e1eacc013b7a3f7b696a0"},
+ {file = "multidict-6.0.4-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:7582a1d1030e15422262de9f58711774e02fa80df0d1578995c76214f6954988"},
+ {file = "multidict-6.0.4-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:ddff9c4e225a63a5afab9dd15590432c22e8057e1a9a13d28ed128ecf047bbdc"},
+ {file = "multidict-6.0.4-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:ee2a1ece51b9b9e7752e742cfb661d2a29e7bcdba2d27e66e28a99f1890e4fa0"},
+ {file = "multidict-6.0.4-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:a2e4369eb3d47d2034032a26c7a80fcb21a2cb22e1173d761a162f11e562caa5"},
+ {file = "multidict-6.0.4-cp310-cp310-win32.whl", hash = "sha256:574b7eae1ab267e5f8285f0fe881f17efe4b98c39a40858247720935b893bba8"},
+ {file = "multidict-6.0.4-cp310-cp310-win_amd64.whl", hash = "sha256:4dcbb0906e38440fa3e325df2359ac6cb043df8e58c965bb45f4e406ecb162cc"},
+ {file = "multidict-6.0.4-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:0dfad7a5a1e39c53ed00d2dd0c2e36aed4650936dc18fd9a1826a5ae1cad6f03"},
+ {file = "multidict-6.0.4-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:64da238a09d6039e3bd39bb3aee9c21a5e34f28bfa5aa22518581f910ff94af3"},
+ {file = "multidict-6.0.4-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:ff959bee35038c4624250473988b24f846cbeb2c6639de3602c073f10410ceba"},
+ {file = "multidict-6.0.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:01a3a55bd90018c9c080fbb0b9f4891db37d148a0a18722b42f94694f8b6d4c9"},
+ {file = "multidict-6.0.4-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c5cb09abb18c1ea940fb99360ea0396f34d46566f157122c92dfa069d3e0e982"},
+ {file = "multidict-6.0.4-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:666daae833559deb2d609afa4490b85830ab0dfca811a98b70a205621a6109fe"},
+ {file = "multidict-6.0.4-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:11bdf3f5e1518b24530b8241529d2050014c884cf18b6fc69c0c2b30ca248710"},
+ {file = "multidict-6.0.4-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7d18748f2d30f94f498e852c67d61261c643b349b9d2a581131725595c45ec6c"},
+ {file = "multidict-6.0.4-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:458f37be2d9e4c95e2d8866a851663cbc76e865b78395090786f6cd9b3bbf4f4"},
+ {file = "multidict-6.0.4-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:b1a2eeedcead3a41694130495593a559a668f382eee0727352b9a41e1c45759a"},
+ {file = "multidict-6.0.4-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:7d6ae9d593ef8641544d6263c7fa6408cc90370c8cb2bbb65f8d43e5b0351d9c"},
+ {file = "multidict-6.0.4-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:5979b5632c3e3534e42ca6ff856bb24b2e3071b37861c2c727ce220d80eee9ed"},
+ {file = "multidict-6.0.4-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:dcfe792765fab89c365123c81046ad4103fcabbc4f56d1c1997e6715e8015461"},
+ {file = "multidict-6.0.4-cp311-cp311-win32.whl", hash = "sha256:3601a3cece3819534b11d4efc1eb76047488fddd0c85a3948099d5da4d504636"},
+ {file = "multidict-6.0.4-cp311-cp311-win_amd64.whl", hash = "sha256:81a4f0b34bd92df3da93315c6a59034df95866014ac08535fc819f043bfd51f0"},
+ {file = "multidict-6.0.4-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:67040058f37a2a51ed8ea8f6b0e6ee5bd78ca67f169ce6122f3e2ec80dfe9b78"},
+ {file = "multidict-6.0.4-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:853888594621e6604c978ce2a0444a1e6e70c8d253ab65ba11657659dcc9100f"},
+ {file = "multidict-6.0.4-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:39ff62e7d0f26c248b15e364517a72932a611a9b75f35b45be078d81bdb86603"},
+ {file = "multidict-6.0.4-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:af048912e045a2dc732847d33821a9d84ba553f5c5f028adbd364dd4765092ac"},
+ {file = "multidict-6.0.4-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b1e8b901e607795ec06c9e42530788c45ac21ef3aaa11dbd0c69de543bfb79a9"},
+ {file = "multidict-6.0.4-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:62501642008a8b9871ddfccbf83e4222cf8ac0d5aeedf73da36153ef2ec222d2"},
+ {file = "multidict-6.0.4-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:99b76c052e9f1bc0721f7541e5e8c05db3941eb9ebe7b8553c625ef88d6eefde"},
+ {file = "multidict-6.0.4-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:509eac6cf09c794aa27bcacfd4d62c885cce62bef7b2c3e8b2e49d365b5003fe"},
+ {file = "multidict-6.0.4-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:21a12c4eb6ddc9952c415f24eef97e3e55ba3af61f67c7bc388dcdec1404a067"},
+ {file = "multidict-6.0.4-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:5cad9430ab3e2e4fa4a2ef4450f548768400a2ac635841bc2a56a2052cdbeb87"},
+ {file = "multidict-6.0.4-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:ab55edc2e84460694295f401215f4a58597f8f7c9466faec545093045476327d"},
+ {file = "multidict-6.0.4-cp37-cp37m-win32.whl", hash = "sha256:5a4dcf02b908c3b8b17a45fb0f15b695bf117a67b76b7ad18b73cf8e92608775"},
+ {file = "multidict-6.0.4-cp37-cp37m-win_amd64.whl", hash = "sha256:6ed5f161328b7df384d71b07317f4d8656434e34591f20552c7bcef27b0ab88e"},
+ {file = "multidict-6.0.4-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:5fc1b16f586f049820c5c5b17bb4ee7583092fa0d1c4e28b5239181ff9532e0c"},
+ {file = "multidict-6.0.4-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:1502e24330eb681bdaa3eb70d6358e818e8e8f908a22a1851dfd4e15bc2f8161"},
+ {file = "multidict-6.0.4-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:b692f419760c0e65d060959df05f2a531945af31fda0c8a3b3195d4efd06de11"},
+ {file = "multidict-6.0.4-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:45e1ecb0379bfaab5eef059f50115b54571acfbe422a14f668fc8c27ba410e7e"},
+ {file = "multidict-6.0.4-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ddd3915998d93fbcd2566ddf9cf62cdb35c9e093075f862935573d265cf8f65d"},
+ {file = "multidict-6.0.4-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:59d43b61c59d82f2effb39a93c48b845efe23a3852d201ed2d24ba830d0b4cf2"},
+ {file = "multidict-6.0.4-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cc8e1d0c705233c5dd0c5e6460fbad7827d5d36f310a0fadfd45cc3029762258"},
+ {file = "multidict-6.0.4-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d6aa0418fcc838522256761b3415822626f866758ee0bc6632c9486b179d0b52"},
+ {file = "multidict-6.0.4-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:6748717bb10339c4760c1e63da040f5f29f5ed6e59d76daee30305894069a660"},
+ {file = "multidict-6.0.4-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:4d1a3d7ef5e96b1c9e92f973e43aa5e5b96c659c9bc3124acbbd81b0b9c8a951"},
+ {file = "multidict-6.0.4-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:4372381634485bec7e46718edc71528024fcdc6f835baefe517b34a33c731d60"},
+ {file = "multidict-6.0.4-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:fc35cb4676846ef752816d5be2193a1e8367b4c1397b74a565a9d0389c433a1d"},
+ {file = "multidict-6.0.4-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:4b9d9e4e2b37daddb5c23ea33a3417901fa7c7b3dee2d855f63ee67a0b21e5b1"},
+ {file = "multidict-6.0.4-cp38-cp38-win32.whl", hash = "sha256:e41b7e2b59679edfa309e8db64fdf22399eec4b0b24694e1b2104fb789207779"},
+ {file = "multidict-6.0.4-cp38-cp38-win_amd64.whl", hash = "sha256:d6c254ba6e45d8e72739281ebc46ea5eb5f101234f3ce171f0e9f5cc86991480"},
+ {file = "multidict-6.0.4-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:16ab77bbeb596e14212e7bab8429f24c1579234a3a462105cda4a66904998664"},
+ {file = "multidict-6.0.4-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:bc779e9e6f7fda81b3f9aa58e3a6091d49ad528b11ed19f6621408806204ad35"},
+ {file = "multidict-6.0.4-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:4ceef517eca3e03c1cceb22030a3e39cb399ac86bff4e426d4fc6ae49052cc60"},
+ {file = "multidict-6.0.4-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:281af09f488903fde97923c7744bb001a9b23b039a909460d0f14edc7bf59706"},
+ {file = "multidict-6.0.4-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:52f2dffc8acaba9a2f27174c41c9e57f60b907bb9f096b36b1a1f3be71c6284d"},
+ {file = "multidict-6.0.4-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b41156839806aecb3641f3208c0dafd3ac7775b9c4c422d82ee2a45c34ba81ca"},
+ {file = "multidict-6.0.4-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d5e3fc56f88cc98ef8139255cf8cd63eb2c586531e43310ff859d6bb3a6b51f1"},
+ {file = "multidict-6.0.4-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8316a77808c501004802f9beebde51c9f857054a0c871bd6da8280e718444449"},
+ {file = "multidict-6.0.4-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:f70b98cd94886b49d91170ef23ec5c0e8ebb6f242d734ed7ed677b24d50c82cf"},
+ {file = "multidict-6.0.4-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:bf6774e60d67a9efe02b3616fee22441d86fab4c6d335f9d2051d19d90a40063"},
+ {file = "multidict-6.0.4-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:e69924bfcdda39b722ef4d9aa762b2dd38e4632b3641b1d9a57ca9cd18f2f83a"},
+ {file = "multidict-6.0.4-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:6b181d8c23da913d4ff585afd1155a0e1194c0b50c54fcfe286f70cdaf2b7176"},
+ {file = "multidict-6.0.4-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:52509b5be062d9eafc8170e53026fbc54cf3b32759a23d07fd935fb04fc22d95"},
+ {file = "multidict-6.0.4-cp39-cp39-win32.whl", hash = "sha256:27c523fbfbdfd19c6867af7346332b62b586eed663887392cff78d614f9ec313"},
+ {file = "multidict-6.0.4-cp39-cp39-win_amd64.whl", hash = "sha256:33029f5734336aa0d4c0384525da0387ef89148dc7191aae00ca5fb23d7aafc2"},
+ {file = "multidict-6.0.4.tar.gz", hash = "sha256:3666906492efb76453c0e7b97f2cf459b0682e7402c0489a95484965dbc1da49"},
+]
+
+[[package]]
+name = "mypy"
+version = "1.7.1"
+description = "Optional static typing for Python"
+optional = false
+python-versions = ">=3.8"
+files = [
+ {file = "mypy-1.7.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:12cce78e329838d70a204293e7b29af9faa3ab14899aec397798a4b41be7f340"},
+ {file = "mypy-1.7.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:1484b8fa2c10adf4474f016e09d7a159602f3239075c7bf9f1627f5acf40ad49"},
+ {file = "mypy-1.7.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:31902408f4bf54108bbfb2e35369877c01c95adc6192958684473658c322c8a5"},
+ {file = "mypy-1.7.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:f2c2521a8e4d6d769e3234350ba7b65ff5d527137cdcde13ff4d99114b0c8e7d"},
+ {file = "mypy-1.7.1-cp310-cp310-win_amd64.whl", hash = "sha256:fcd2572dd4519e8a6642b733cd3a8cfc1ef94bafd0c1ceed9c94fe736cb65b6a"},
+ {file = "mypy-1.7.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:4b901927f16224d0d143b925ce9a4e6b3a758010673eeded9b748f250cf4e8f7"},
+ {file = "mypy-1.7.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:2f7f6985d05a4e3ce8255396df363046c28bea790e40617654e91ed580ca7c51"},
+ {file = "mypy-1.7.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:944bdc21ebd620eafefc090cdf83158393ec2b1391578359776c00de00e8907a"},
+ {file = "mypy-1.7.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:9c7ac372232c928fff0645d85f273a726970c014749b924ce5710d7d89763a28"},
+ {file = "mypy-1.7.1-cp311-cp311-win_amd64.whl", hash = "sha256:f6efc9bd72258f89a3816e3a98c09d36f079c223aa345c659622f056b760ab42"},
+ {file = "mypy-1.7.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:6dbdec441c60699288adf051f51a5d512b0d818526d1dcfff5a41f8cd8b4aaf1"},
+ {file = "mypy-1.7.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:4fc3d14ee80cd22367caaaf6e014494415bf440980a3045bf5045b525680ac33"},
+ {file = "mypy-1.7.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2c6e4464ed5f01dc44dc9821caf67b60a4e5c3b04278286a85c067010653a0eb"},
+ {file = "mypy-1.7.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:d9b338c19fa2412f76e17525c1b4f2c687a55b156320acb588df79f2e6fa9fea"},
+ {file = "mypy-1.7.1-cp312-cp312-win_amd64.whl", hash = "sha256:204e0d6de5fd2317394a4eff62065614c4892d5a4d1a7ee55b765d7a3d9e3f82"},
+ {file = "mypy-1.7.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:84860e06ba363d9c0eeabd45ac0fde4b903ad7aa4f93cd8b648385a888e23200"},
+ {file = "mypy-1.7.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:8c5091ebd294f7628eb25ea554852a52058ac81472c921150e3a61cdd68f75a7"},
+ {file = "mypy-1.7.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:40716d1f821b89838589e5b3106ebbc23636ffdef5abc31f7cd0266db936067e"},
+ {file = "mypy-1.7.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:5cf3f0c5ac72139797953bd50bc6c95ac13075e62dbfcc923571180bebb662e9"},
+ {file = "mypy-1.7.1-cp38-cp38-win_amd64.whl", hash = "sha256:78e25b2fd6cbb55ddfb8058417df193f0129cad5f4ee75d1502248e588d9e0d7"},
+ {file = "mypy-1.7.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:75c4d2a6effd015786c87774e04331b6da863fc3fc4e8adfc3b40aa55ab516fe"},
+ {file = "mypy-1.7.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:2643d145af5292ee956aa0a83c2ce1038a3bdb26e033dadeb2f7066fb0c9abce"},
+ {file = "mypy-1.7.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:75aa828610b67462ffe3057d4d8a4112105ed211596b750b53cbfe182f44777a"},
+ {file = "mypy-1.7.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:ee5d62d28b854eb61889cde4e1dbc10fbaa5560cb39780c3995f6737f7e82120"},
+ {file = "mypy-1.7.1-cp39-cp39-win_amd64.whl", hash = "sha256:72cf32ce7dd3562373f78bd751f73c96cfb441de147cc2448a92c1a308bd0ca6"},
+ {file = "mypy-1.7.1-py3-none-any.whl", hash = "sha256:f7c5d642db47376a0cc130f0de6d055056e010debdaf0707cd2b0fc7e7ef30ea"},
+ {file = "mypy-1.7.1.tar.gz", hash = "sha256:fcb6d9afb1b6208b4c712af0dafdc650f518836065df0d4fb1d800f5d6773db2"},
+]
+
+[package.dependencies]
+mypy-extensions = ">=1.0.0"
+tomli = {version = ">=1.1.0", markers = "python_version < \"3.11\""}
+typing-extensions = ">=4.1.0"
+
+[package.extras]
+dmypy = ["psutil (>=4.0)"]
+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 = "nbclient"
+version = "0.9.0"
+description = "A client library for executing notebooks. Formerly nbconvert's ExecutePreprocessor."
+optional = false
+python-versions = ">=3.8.0"
+files = [
+ {file = "nbclient-0.9.0-py3-none-any.whl", hash = "sha256:a3a1ddfb34d4a9d17fc744d655962714a866639acd30130e9be84191cd97cd15"},
+ {file = "nbclient-0.9.0.tar.gz", hash = "sha256:4b28c207877cf33ef3a9838cdc7a54c5ceff981194a82eac59d558f05487295e"},
+]
+
+[package.dependencies]
+jupyter-client = ">=6.1.12"
+jupyter-core = ">=4.12,<5.0.dev0 || >=5.1.dev0"
+nbformat = ">=5.1"
+traitlets = ">=5.4"
+
+[package.extras]
+dev = ["pre-commit"]
+docs = ["autodoc-traits", "mock", "moto", "myst-parser", "nbclient[test]", "sphinx (>=1.7)", "sphinx-book-theme", "sphinxcontrib-spelling"]
+test = ["flaky", "ipykernel (>=6.19.3)", "ipython", "ipywidgets", "nbconvert (>=7.0.0)", "pytest (>=7.0)", "pytest-asyncio", "pytest-cov (>=4.0)", "testpath", "xmltodict"]
+
+[[package]]
+name = "nbconvert"
+version = "7.11.0"
+description = "Converting Jupyter Notebooks"
+optional = false
+python-versions = ">=3.8"
+files = [
+ {file = "nbconvert-7.11.0-py3-none-any.whl", hash = "sha256:d1d417b7f34a4e38887f8da5bdfd12372adf3b80f995d57556cb0972c68909fe"},
+ {file = "nbconvert-7.11.0.tar.gz", hash = "sha256:abedc01cf543177ffde0bfc2a69726d5a478f6af10a332fc1bf29fcb4f0cf000"},
+]
+
+[package.dependencies]
+beautifulsoup4 = "*"
+bleach = "!=5.0.0"
+defusedxml = "*"
+importlib-metadata = {version = ">=3.6", markers = "python_version < \"3.10\""}
+jinja2 = ">=3.0"
+jupyter-core = ">=4.7"
+jupyterlab-pygments = "*"
+markupsafe = ">=2.0"
+mistune = ">=2.0.3,<4"
+nbclient = ">=0.5.0"
+nbformat = ">=5.7"
+packaging = "*"
+pandocfilters = ">=1.4.1"
+pygments = ">=2.4.1"
+tinycss2 = "*"
+traitlets = ">=5.1"
+
+[package.extras]
+all = ["nbconvert[docs,qtpdf,serve,test,webpdf]"]
+docs = ["ipykernel", "ipython", "myst-parser", "nbsphinx (>=0.2.12)", "pydata-sphinx-theme", "sphinx (==5.0.2)", "sphinxcontrib-spelling"]
+qtpdf = ["nbconvert[qtpng]"]
+qtpng = ["pyqtwebengine (>=5.15)"]
+serve = ["tornado (>=6.1)"]
+test = ["flaky", "ipykernel", "ipywidgets (>=7)", "pytest"]
+webpdf = ["playwright"]
+
+[[package]]
+name = "nbformat"
+version = "5.9.2"
+description = "The Jupyter Notebook format"
+optional = false
+python-versions = ">=3.8"
+files = [
+ {file = "nbformat-5.9.2-py3-none-any.whl", hash = "sha256:1c5172d786a41b82bcfd0c23f9e6b6f072e8fb49c39250219e4acfff1efe89e9"},
+ {file = "nbformat-5.9.2.tar.gz", hash = "sha256:5f98b5ba1997dff175e77e0c17d5c10a96eaed2cbd1de3533d1fc35d5e111192"},
+]
+
+[package.dependencies]
+fastjsonschema = "*"
+jsonschema = ">=2.6"
+jupyter-core = "*"
+traitlets = ">=5.1"
+
+[package.extras]
+docs = ["myst-parser", "pydata-sphinx-theme", "sphinx", "sphinxcontrib-github-alt", "sphinxcontrib-spelling"]
+test = ["pep440", "pre-commit", "pytest", "testpath"]
+
+[[package]]
+name = "nest-asyncio"
+version = "1.5.8"
+description = "Patch asyncio to allow nested event loops"
+optional = false
+python-versions = ">=3.5"
+files = [
+ {file = "nest_asyncio-1.5.8-py3-none-any.whl", hash = "sha256:accda7a339a70599cb08f9dd09a67e0c2ef8d8d6f4c07f96ab203f2ae254e48d"},
+ {file = "nest_asyncio-1.5.8.tar.gz", hash = "sha256:25aa2ca0d2a5b5531956b9e273b45cf664cae2b145101d73b86b199978d48fdb"},
+]
+
+[[package]]
+name = "ninja"
+version = "1.11.1"
+description = "Ninja is a small build system with a focus on speed"
+optional = false
+python-versions = "*"
+files = [
+ {file = "ninja-1.11.1-py2.py3-none-macosx_10_9_universal2.macosx_10_9_x86_64.macosx_11_0_arm64.macosx_11_0_universal2.whl", hash = "sha256:f48c3c6eea204062f6bbf089dfc63e1ad41a08640e1da46ef2b30fa426f7ce23"},
+ {file = "ninja-1.11.1-py2.py3-none-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:edec1053e141253076b2df7ec03a246ff581e9270aa1ca9759397b21e2760e57"},
+ {file = "ninja-1.11.1-py2.py3-none-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:817e2aee2a4d28a708a67bcfba1817ae502c32c6d8ef80e50d63b0f23adf3a08"},
+ {file = "ninja-1.11.1-py2.py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:df11b8afea0501883e33faeb1c43d2ef67f466d5f4bd85f9c376e9a93a43a277"},
+ {file = "ninja-1.11.1-py2.py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a7a564fe755ddfbdbccb07b0b758e3f8460e5f8ba1adaab40a5eaa2f8c01ce68"},
+ {file = "ninja-1.11.1-py2.py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1c474326e11fba3f8c2582715d79216292e327d3335367c0e87e9647a002cc4a"},
+ {file = "ninja-1.11.1-py2.py3-none-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:6f6465a7efe6473a2a34edab83633594de19d59406a727316e1367ebcc528908"},
+ {file = "ninja-1.11.1-py2.py3-none-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:642cb64d859276998f14972724850e0c5b7febbc1bce3d2065b7e0cb7d3a0b79"},
+ {file = "ninja-1.11.1-py2.py3-none-musllinux_1_1_aarch64.whl", hash = "sha256:60179bb4f22c88279c53a5402bb5fe81c97c627a28d93c737d1fa067d892115d"},
+ {file = "ninja-1.11.1-py2.py3-none-musllinux_1_1_i686.whl", hash = "sha256:34753459493543782d87267e4cad63dd4639b07f8394ffe6d4417e9eda05c8a8"},
+ {file = "ninja-1.11.1-py2.py3-none-musllinux_1_1_ppc64le.whl", hash = "sha256:779f228e407c54a8b6e4cbf8f835489998dd250f67bf1b9bd7b8a8ab6bdcdc7b"},
+ {file = "ninja-1.11.1-py2.py3-none-musllinux_1_1_s390x.whl", hash = "sha256:ba50a32424912e5f3ee40d791b506a160dc0eeda7de5ad8faebe7aa8006244dc"},
+ {file = "ninja-1.11.1-py2.py3-none-musllinux_1_1_x86_64.whl", hash = "sha256:3b28b595ed580752240ade7821b6cb7a5a4c6a604c865dc474bd38f06e2eb7f5"},
+ {file = "ninja-1.11.1-py2.py3-none-win32.whl", hash = "sha256:3329b4b7c1694730772522a3ba0ba40fd15c012476ed3e1c9f0fd9e76190394e"},
+ {file = "ninja-1.11.1-py2.py3-none-win_amd64.whl", hash = "sha256:4e547bc759c570773d83d110c41fd5ca9a94c0a9a8388f5a3ea37bdf97d002b0"},
+ {file = "ninja-1.11.1-py2.py3-none-win_arm64.whl", hash = "sha256:8cf96f92ccc851c600cb3e1251c34db06f1dd682de79188ad490c33cddc66981"},
+ {file = "ninja-1.11.1.tar.gz", hash = "sha256:c833a47d39b2d1eee3f9ca886fa1581efd5be6068b82734ac229961ee8748f90"},
+]
+
+[package.extras]
+test = ["codecov (>=2.0.5)", "coverage (>=4.2)", "flake8 (>=3.0.4)", "pytest (>=4.5.0)", "pytest-cov (>=2.7.1)", "pytest-runner (>=5.1)", "pytest-virtualenv (>=1.7.0)", "virtualenv (>=15.0.3)"]
+
+[[package]]
+name = "nltk"
+version = "3.8"
+description = "Natural Language Toolkit"
+optional = false
+python-versions = ">=3.7"
+files = [
+ {file = "nltk-3.8-py3-none-any.whl", hash = "sha256:3306502f487aa9fb0566e23443fa287a85a8d8d0821e2ef1655b4e3f0ea4aeee"},
+ {file = "nltk-3.8.zip", hash = "sha256:74b30826a37d78d53427105bbd037dd880251be269fca64ee530838a46ed55fc"},
+]
+
+[package.dependencies]
+click = "*"
+joblib = "*"
+regex = ">=2021.8.3"
+tqdm = "*"
+
+[package.extras]
+all = ["matplotlib", "numpy", "pyparsing", "python-crfsuite", "requests", "scikit-learn", "scipy", "twython"]
+corenlp = ["requests"]
+machine-learning = ["numpy", "python-crfsuite", "scikit-learn", "scipy"]
+plot = ["matplotlib"]
+tgrep = ["pyparsing"]
+twitter = ["twython"]
+
+[[package]]
+name = "nodeenv"
+version = "1.8.0"
+description = "Node.js virtual environment builder"
+optional = false
+python-versions = ">=2.7,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,!=3.6.*"
+files = [
+ {file = "nodeenv-1.8.0-py2.py3-none-any.whl", hash = "sha256:df865724bb3c3adc86b3876fa209771517b0cfe596beff01a92700e0e8be4cec"},
+ {file = "nodeenv-1.8.0.tar.gz", hash = "sha256:d51e0c37e64fbf47d017feac3145cdbb58836d7eee8c6f6d3b6880c5456227d2"},
+]
+
+[package.dependencies]
+setuptools = "*"
+
+[[package]]
+name = "notebook"
+version = "7.0.6"
+description = "Jupyter Notebook - A web-based notebook environment for interactive computing"
+optional = false
+python-versions = ">=3.8"
+files = [
+ {file = "notebook-7.0.6-py3-none-any.whl", hash = "sha256:0fe8f67102fea3744fedf652e4c15339390902ca70c5a31c4f547fa23da697cc"},
+ {file = "notebook-7.0.6.tar.gz", hash = "sha256:ec6113b06529019f7f287819af06c97a2baf7a95ac21a8f6e32192898e9f9a58"},
+]
+
+[package.dependencies]
+jupyter-server = ">=2.4.0,<3"
+jupyterlab = ">=4.0.2,<5"
+jupyterlab-server = ">=2.22.1,<3"
+notebook-shim = ">=0.2,<0.3"
+tornado = ">=6.2.0"
+
+[package.extras]
+dev = ["hatch", "pre-commit"]
+docs = ["myst-parser", "nbsphinx", "pydata-sphinx-theme", "sphinx (>=1.3.6)", "sphinxcontrib-github-alt", "sphinxcontrib-spelling"]
+test = ["importlib-resources (>=5.0)", "ipykernel", "jupyter-server[test] (>=2.4.0,<3)", "jupyterlab-server[test] (>=2.22.1,<3)", "nbval", "pytest (>=7.0)", "pytest-console-scripts", "pytest-timeout", "pytest-tornasync", "requests"]
+
+[[package]]
+name = "notebook-shim"
+version = "0.2.3"
+description = "A shim layer for notebook traits and config"
+optional = false
+python-versions = ">=3.7"
+files = [
+ {file = "notebook_shim-0.2.3-py3-none-any.whl", hash = "sha256:a83496a43341c1674b093bfcebf0fe8e74cbe7eda5fd2bbc56f8e39e1486c0c7"},
+ {file = "notebook_shim-0.2.3.tar.gz", hash = "sha256:f69388ac283ae008cd506dda10d0288b09a017d822d5e8c7129a152cbd3ce7e9"},
+]
+
+[package.dependencies]
+jupyter-server = ">=1.8,<3"
+
+[package.extras]
+test = ["pytest", "pytest-console-scripts", "pytest-jupyter", "pytest-tornasync"]
+
+[[package]]
+name = "numpy"
+version = "1.23.5"
+description = "NumPy is the fundamental package for array computing with Python."
+optional = false
+python-versions = ">=3.8"
+files = [
+ {file = "numpy-1.23.5-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:9c88793f78fca17da0145455f0d7826bcb9f37da4764af27ac945488116efe63"},
+ {file = "numpy-1.23.5-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:e9f4c4e51567b616be64e05d517c79a8a22f3606499941d97bb76f2ca59f982d"},
+ {file = "numpy-1.23.5-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7903ba8ab592b82014713c491f6c5d3a1cde5b4a3bf116404e08f5b52f6daf43"},
+ {file = "numpy-1.23.5-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5e05b1c973a9f858c74367553e236f287e749465f773328c8ef31abe18f691e1"},
+ {file = "numpy-1.23.5-cp310-cp310-win32.whl", hash = "sha256:522e26bbf6377e4d76403826ed689c295b0b238f46c28a7251ab94716da0b280"},
+ {file = "numpy-1.23.5-cp310-cp310-win_amd64.whl", hash = "sha256:dbee87b469018961d1ad79b1a5d50c0ae850000b639bcb1b694e9981083243b6"},
+ {file = "numpy-1.23.5-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:ce571367b6dfe60af04e04a1834ca2dc5f46004ac1cc756fb95319f64c095a96"},
+ {file = "numpy-1.23.5-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:56e454c7833e94ec9769fa0f86e6ff8e42ee38ce0ce1fa4cbb747ea7e06d56aa"},
+ {file = "numpy-1.23.5-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5039f55555e1eab31124a5768898c9e22c25a65c1e0037f4d7c495a45778c9f2"},
+ {file = "numpy-1.23.5-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:58f545efd1108e647604a1b5aa809591ccd2540f468a880bedb97247e72db387"},
+ {file = "numpy-1.23.5-cp311-cp311-win32.whl", hash = "sha256:b2a9ab7c279c91974f756c84c365a669a887efa287365a8e2c418f8b3ba73fb0"},
+ {file = "numpy-1.23.5-cp311-cp311-win_amd64.whl", hash = "sha256:0cbe9848fad08baf71de1a39e12d1b6310f1d5b2d0ea4de051058e6e1076852d"},
+ {file = "numpy-1.23.5-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:f063b69b090c9d918f9df0a12116029e274daf0181df392839661c4c7ec9018a"},
+ {file = "numpy-1.23.5-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:0aaee12d8883552fadfc41e96b4c82ee7d794949e2a7c3b3a7201e968c7ecab9"},
+ {file = "numpy-1.23.5-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:92c8c1e89a1f5028a4c6d9e3ccbe311b6ba53694811269b992c0b224269e2398"},
+ {file = "numpy-1.23.5-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d208a0f8729f3fb790ed18a003f3a57895b989b40ea4dce4717e9cf4af62c6bb"},
+ {file = "numpy-1.23.5-cp38-cp38-win32.whl", hash = "sha256:06005a2ef6014e9956c09ba07654f9837d9e26696a0470e42beedadb78c11b07"},
+ {file = "numpy-1.23.5-cp38-cp38-win_amd64.whl", hash = "sha256:ca51fcfcc5f9354c45f400059e88bc09215fb71a48d3768fb80e357f3b457e1e"},
+ {file = "numpy-1.23.5-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:8969bfd28e85c81f3f94eb4a66bc2cf1dbdc5c18efc320af34bffc54d6b1e38f"},
+ {file = "numpy-1.23.5-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:a7ac231a08bb37f852849bbb387a20a57574a97cfc7b6cabb488a4fc8be176de"},
+ {file = "numpy-1.23.5-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bf837dc63ba5c06dc8797c398db1e223a466c7ece27a1f7b5232ba3466aafe3d"},
+ {file = "numpy-1.23.5-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:33161613d2269025873025b33e879825ec7b1d831317e68f4f2f0f84ed14c719"},
+ {file = "numpy-1.23.5-cp39-cp39-win32.whl", hash = "sha256:af1da88f6bc3d2338ebbf0e22fe487821ea4d8e89053e25fa59d1d79786e7481"},
+ {file = "numpy-1.23.5-cp39-cp39-win_amd64.whl", hash = "sha256:09b7847f7e83ca37c6e627682f145856de331049013853f344f37b0c9690e3df"},
+ {file = "numpy-1.23.5-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:abdde9f795cf292fb9651ed48185503a2ff29be87770c3b8e2a14b0cd7aa16f8"},
+ {file = "numpy-1.23.5-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f9a909a8bae284d46bbfdefbdd4a262ba19d3bc9921b1e76126b1d21c3c34135"},
+ {file = "numpy-1.23.5-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:01dd17cbb340bf0fc23981e52e1d18a9d4050792e8fb8363cecbf066a84b827d"},
+ {file = "numpy-1.23.5.tar.gz", hash = "sha256:1b1766d6f397c18153d40015ddfc79ddb715cabadc04d2d228d4e5a8bc4ded1a"},
+]
+
+[[package]]
+name = "opencv-python-headless"
+version = "4.8.1.78"
+description = "Wrapper package for OpenCV python bindings."
+optional = false
+python-versions = ">=3.6"
+files = [
+ {file = "opencv-python-headless-4.8.1.78.tar.gz", hash = "sha256:bc7197b42352f6f865c302a49140b889ec7cd957dd697e2d7fc016ad0d3f28f1"},
+ {file = "opencv_python_headless-4.8.1.78-cp37-abi3-macosx_10_16_x86_64.whl", hash = "sha256:f3a33f644249f9ce1c913eac580e4b3ef4ce7cab0a71900274708959c2feb5e3"},
+ {file = "opencv_python_headless-4.8.1.78-cp37-abi3-macosx_11_0_arm64.whl", hash = "sha256:2c7d45721df9801c4dcd34683a15caa0e30f38b185263fec04a6eb274bc720f0"},
+ {file = "opencv_python_headless-4.8.1.78-cp37-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3b6bd6e1132b6f5dcb3a5bfe30fc4d341a7bfb26134da349a06c9255288ded94"},
+ {file = "opencv_python_headless-4.8.1.78-cp37-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:58e70d2f0915fe23e02c6e405588276c9397844a47d38b9c87fac5f7f9ba2dcc"},
+ {file = "opencv_python_headless-4.8.1.78-cp37-abi3-win32.whl", hash = "sha256:382f8c7a6a14f80091284eecedd52cee4812231ee0eff1118592197b538d9252"},
+ {file = "opencv_python_headless-4.8.1.78-cp37-abi3-win_amd64.whl", hash = "sha256:0a0f1e9f836f7d5bad1dd164694944c8761711cbdf4b36ebbd4815a8ef731079"},
+]
+
+[package.dependencies]
+numpy = [
+ {version = ">=1.21.0", markers = "python_version == \"3.9\" and platform_system == \"Darwin\" and platform_machine == \"arm64\""},
+ {version = ">=1.19.3", markers = "platform_system == \"Linux\" and platform_machine == \"aarch64\" and python_version >= \"3.8\" or python_version > \"3.9\" or python_version >= \"3.9\" and platform_system != \"Darwin\" or python_version >= \"3.9\" and platform_machine != \"arm64\""},
+]
+
+[[package]]
+name = "orjson"
+version = "3.9.10"
+description = "Fast, correct Python JSON library supporting dataclasses, datetimes, and numpy"
+optional = false
+python-versions = ">=3.8"
+files = [
+ {file = "orjson-3.9.10-cp310-cp310-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:c18a4da2f50050a03d1da5317388ef84a16013302a5281d6f64e4a3f406aabc4"},
+ {file = "orjson-3.9.10-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5148bab4d71f58948c7c39d12b14a9005b6ab35a0bdf317a8ade9a9e4d9d0bd5"},
+ {file = "orjson-3.9.10-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:4cf7837c3b11a2dfb589f8530b3cff2bd0307ace4c301e8997e95c7468c1378e"},
+ {file = "orjson-3.9.10-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c62b6fa2961a1dcc51ebe88771be5319a93fd89bd247c9ddf732bc250507bc2b"},
+ {file = "orjson-3.9.10-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:deeb3922a7a804755bbe6b5be9b312e746137a03600f488290318936c1a2d4dc"},
+ {file = "orjson-3.9.10-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1234dc92d011d3554d929b6cf058ac4a24d188d97be5e04355f1b9223e98bbe9"},
+ {file = "orjson-3.9.10-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:06ad5543217e0e46fd7ab7ea45d506c76f878b87b1b4e369006bdb01acc05a83"},
+ {file = "orjson-3.9.10-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:4fd72fab7bddce46c6826994ce1e7de145ae1e9e106ebb8eb9ce1393ca01444d"},
+ {file = "orjson-3.9.10-cp310-none-win32.whl", hash = "sha256:b5b7d4a44cc0e6ff98da5d56cde794385bdd212a86563ac321ca64d7f80c80d1"},
+ {file = "orjson-3.9.10-cp310-none-win_amd64.whl", hash = "sha256:61804231099214e2f84998316f3238c4c2c4aaec302df12b21a64d72e2a135c7"},
+ {file = "orjson-3.9.10-cp311-cp311-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:cff7570d492bcf4b64cc862a6e2fb77edd5e5748ad715f487628f102815165e9"},
+ {file = "orjson-3.9.10-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ed8bc367f725dfc5cabeed1ae079d00369900231fbb5a5280cf0736c30e2adf7"},
+ {file = "orjson-3.9.10-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:c812312847867b6335cfb264772f2a7e85b3b502d3a6b0586aa35e1858528ab1"},
+ {file = "orjson-3.9.10-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9edd2856611e5050004f4722922b7b1cd6268da34102667bd49d2a2b18bafb81"},
+ {file = "orjson-3.9.10-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:674eb520f02422546c40401f4efaf8207b5e29e420c17051cddf6c02783ff5ca"},
+ {file = "orjson-3.9.10-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1d0dc4310da8b5f6415949bd5ef937e60aeb0eb6b16f95041b5e43e6200821fb"},
+ {file = "orjson-3.9.10-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:e99c625b8c95d7741fe057585176b1b8783d46ed4b8932cf98ee145c4facf499"},
+ {file = "orjson-3.9.10-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:ec6f18f96b47299c11203edfbdc34e1b69085070d9a3d1f302810cc23ad36bf3"},
+ {file = "orjson-3.9.10-cp311-none-win32.whl", hash = "sha256:ce0a29c28dfb8eccd0f16219360530bc3cfdf6bf70ca384dacd36e6c650ef8e8"},
+ {file = "orjson-3.9.10-cp311-none-win_amd64.whl", hash = "sha256:cf80b550092cc480a0cbd0750e8189247ff45457e5a023305f7ef1bcec811616"},
+ {file = "orjson-3.9.10-cp312-cp312-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:602a8001bdf60e1a7d544be29c82560a7b49319a0b31d62586548835bbe2c862"},
+ {file = "orjson-3.9.10-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f295efcd47b6124b01255d1491f9e46f17ef40d3d7eabf7364099e463fb45f0f"},
+ {file = "orjson-3.9.10-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:92af0d00091e744587221e79f68d617b432425a7e59328ca4c496f774a356071"},
+ {file = "orjson-3.9.10-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c5a02360e73e7208a872bf65a7554c9f15df5fe063dc047f79738998b0506a14"},
+ {file = "orjson-3.9.10-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:858379cbb08d84fe7583231077d9a36a1a20eb72f8c9076a45df8b083724ad1d"},
+ {file = "orjson-3.9.10-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:666c6fdcaac1f13eb982b649e1c311c08d7097cbda24f32612dae43648d8db8d"},
+ {file = "orjson-3.9.10-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:3fb205ab52a2e30354640780ce4587157a9563a68c9beaf52153e1cea9aa0921"},
+ {file = "orjson-3.9.10-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:7ec960b1b942ee3c69323b8721df2a3ce28ff40e7ca47873ae35bfafeb4555ca"},
+ {file = "orjson-3.9.10-cp312-none-win_amd64.whl", hash = "sha256:3e892621434392199efb54e69edfff9f699f6cc36dd9553c5bf796058b14b20d"},
+ {file = "orjson-3.9.10-cp38-cp38-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:8b9ba0ccd5a7f4219e67fbbe25e6b4a46ceef783c42af7dbc1da548eb28b6531"},
+ {file = "orjson-3.9.10-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2e2ecd1d349e62e3960695214f40939bbfdcaeaaa62ccc638f8e651cf0970e5f"},
+ {file = "orjson-3.9.10-cp38-cp38-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:7f433be3b3f4c66016d5a20e5b4444ef833a1f802ced13a2d852c637f69729c1"},
+ {file = "orjson-3.9.10-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4689270c35d4bb3102e103ac43c3f0b76b169760aff8bcf2d401a3e0e58cdb7f"},
+ {file = "orjson-3.9.10-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4bd176f528a8151a6efc5359b853ba3cc0e82d4cd1fab9c1300c5d957dc8f48c"},
+ {file = "orjson-3.9.10-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3a2ce5ea4f71681623f04e2b7dadede3c7435dfb5e5e2d1d0ec25b35530e277b"},
+ {file = "orjson-3.9.10-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:49f8ad582da6e8d2cf663c4ba5bf9f83cc052570a3a767487fec6af839b0e777"},
+ {file = "orjson-3.9.10-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:2a11b4b1a8415f105d989876a19b173f6cdc89ca13855ccc67c18efbd7cbd1f8"},
+ {file = "orjson-3.9.10-cp38-none-win32.whl", hash = "sha256:a353bf1f565ed27ba71a419b2cd3db9d6151da426b61b289b6ba1422a702e643"},
+ {file = "orjson-3.9.10-cp38-none-win_amd64.whl", hash = "sha256:e28a50b5be854e18d54f75ef1bb13e1abf4bc650ab9d635e4258c58e71eb6ad5"},
+ {file = "orjson-3.9.10-cp39-cp39-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:ee5926746232f627a3be1cc175b2cfad24d0170d520361f4ce3fa2fd83f09e1d"},
+ {file = "orjson-3.9.10-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0a73160e823151f33cdc05fe2cea557c5ef12fdf276ce29bb4f1c571c8368a60"},
+ {file = "orjson-3.9.10-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:c338ed69ad0b8f8f8920c13f529889fe0771abbb46550013e3c3d01e5174deef"},
+ {file = "orjson-3.9.10-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5869e8e130e99687d9e4be835116c4ebd83ca92e52e55810962446d841aba8de"},
+ {file = "orjson-3.9.10-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d2c1e559d96a7f94a4f581e2a32d6d610df5840881a8cba8f25e446f4d792df3"},
+ {file = "orjson-3.9.10-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:81a3a3a72c9811b56adf8bcc829b010163bb2fc308877e50e9910c9357e78521"},
+ {file = "orjson-3.9.10-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:7f8fb7f5ecf4f6355683ac6881fd64b5bb2b8a60e3ccde6ff799e48791d8f864"},
+ {file = "orjson-3.9.10-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:c943b35ecdf7123b2d81d225397efddf0bce2e81db2f3ae633ead38e85cd5ade"},
+ {file = "orjson-3.9.10-cp39-none-win32.whl", hash = "sha256:fb0b361d73f6b8eeceba47cd37070b5e6c9de5beaeaa63a1cb35c7e1a73ef088"},
+ {file = "orjson-3.9.10-cp39-none-win_amd64.whl", hash = "sha256:b90f340cb6397ec7a854157fac03f0c82b744abdd1c0941a024c3c29d1340aff"},
+ {file = "orjson-3.9.10.tar.gz", hash = "sha256:9ebbdbd6a046c304b1845e96fbcc5559cd296b4dfd3ad2509e33c4d9ce07d6a1"},
+]
+
+[[package]]
+name = "overrides"
+version = "7.4.0"
+description = "A decorator to automatically detect mismatch when overriding a method."
+optional = false
+python-versions = ">=3.6"
+files = [
+ {file = "overrides-7.4.0-py3-none-any.whl", hash = "sha256:3ad24583f86d6d7a49049695efe9933e67ba62f0c7625d53c59fa832ce4b8b7d"},
+ {file = "overrides-7.4.0.tar.gz", hash = "sha256:9502a3cca51f4fac40b5feca985b6703a5c1f6ad815588a7ca9e285b9dca6757"},
+]
+
+[[package]]
+name = "packaging"
+version = "23.2"
+description = "Core utilities for Python packages"
+optional = false
+python-versions = ">=3.7"
+files = [
+ {file = "packaging-23.2-py3-none-any.whl", hash = "sha256:8c491190033a9af7e1d931d0b5dacc2ef47509b34dd0de67ed209b5203fc88c7"},
+ {file = "packaging-23.2.tar.gz", hash = "sha256:048fb0e9405036518eaaf48a55953c750c11e1a1b68e0dd1a9d62ed0c092cfc5"},
+]
+
+[[package]]
+name = "pandas"
+version = "1.5.3"
+description = "Powerful data structures for data analysis, time series, and statistics"
+optional = false
+python-versions = ">=3.8"
+files = [
+ {file = "pandas-1.5.3-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:3749077d86e3a2f0ed51367f30bf5b82e131cc0f14260c4d3e499186fccc4406"},
+ {file = "pandas-1.5.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:972d8a45395f2a2d26733eb8d0f629b2f90bebe8e8eddbb8829b180c09639572"},
+ {file = "pandas-1.5.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:50869a35cbb0f2e0cd5ec04b191e7b12ed688874bd05dd777c19b28cbea90996"},
+ {file = "pandas-1.5.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c3ac844a0fe00bfaeb2c9b51ab1424e5c8744f89860b138434a363b1f620f354"},
+ {file = "pandas-1.5.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7a0a56cef15fd1586726dace5616db75ebcfec9179a3a55e78f72c5639fa2a23"},
+ {file = "pandas-1.5.3-cp310-cp310-win_amd64.whl", hash = "sha256:478ff646ca42b20376e4ed3fa2e8d7341e8a63105586efe54fa2508ee087f328"},
+ {file = "pandas-1.5.3-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:6973549c01ca91ec96199e940495219c887ea815b2083722821f1d7abfa2b4dc"},
+ {file = "pandas-1.5.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:c39a8da13cede5adcd3be1182883aea1c925476f4e84b2807a46e2775306305d"},
+ {file = "pandas-1.5.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:f76d097d12c82a535fda9dfe5e8dd4127952b45fea9b0276cb30cca5ea313fbc"},
+ {file = "pandas-1.5.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e474390e60ed609cec869b0da796ad94f420bb057d86784191eefc62b65819ae"},
+ {file = "pandas-1.5.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5f2b952406a1588ad4cad5b3f55f520e82e902388a6d5a4a91baa8d38d23c7f6"},
+ {file = "pandas-1.5.3-cp311-cp311-win_amd64.whl", hash = "sha256:bc4c368f42b551bf72fac35c5128963a171b40dce866fb066540eeaf46faa003"},
+ {file = "pandas-1.5.3-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:14e45300521902689a81f3f41386dc86f19b8ba8dd5ac5a3c7010ef8d2932813"},
+ {file = "pandas-1.5.3-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:9842b6f4b8479e41968eced654487258ed81df7d1c9b7b870ceea24ed9459b31"},
+ {file = "pandas-1.5.3-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:26d9c71772c7afb9d5046e6e9cf42d83dd147b5cf5bcb9d97252077118543792"},
+ {file = "pandas-1.5.3-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5fbcb19d6fceb9e946b3e23258757c7b225ba450990d9ed63ccceeb8cae609f7"},
+ {file = "pandas-1.5.3-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:565fa34a5434d38e9d250af3c12ff931abaf88050551d9fbcdfafca50d62babf"},
+ {file = "pandas-1.5.3-cp38-cp38-win32.whl", hash = "sha256:87bd9c03da1ac870a6d2c8902a0e1fd4267ca00f13bc494c9e5a9020920e1d51"},
+ {file = "pandas-1.5.3-cp38-cp38-win_amd64.whl", hash = "sha256:41179ce559943d83a9b4bbacb736b04c928b095b5f25dd2b7389eda08f46f373"},
+ {file = "pandas-1.5.3-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:c74a62747864ed568f5a82a49a23a8d7fe171d0c69038b38cedf0976831296fa"},
+ {file = "pandas-1.5.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:c4c00e0b0597c8e4f59e8d461f797e5d70b4d025880516a8261b2817c47759ee"},
+ {file = "pandas-1.5.3-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:a50d9a4336a9621cab7b8eb3fb11adb82de58f9b91d84c2cd526576b881a0c5a"},
+ {file = "pandas-1.5.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dd05f7783b3274aa206a1af06f0ceed3f9b412cf665b7247eacd83be41cf7bf0"},
+ {file = "pandas-1.5.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9f69c4029613de47816b1bb30ff5ac778686688751a5e9c99ad8c7031f6508e5"},
+ {file = "pandas-1.5.3-cp39-cp39-win32.whl", hash = "sha256:7cec0bee9f294e5de5bbfc14d0573f65526071029d036b753ee6507d2a21480a"},
+ {file = "pandas-1.5.3-cp39-cp39-win_amd64.whl", hash = "sha256:dfd681c5dc216037e0b0a2c821f5ed99ba9f03ebcf119c7dac0e9a7b960b9ec9"},
+ {file = "pandas-1.5.3.tar.gz", hash = "sha256:74a3fd7e5a7ec052f183273dc7b0acd3a863edf7520f5d3a1765c04ffdb3b0b1"},
+]
+
+[package.dependencies]
+numpy = {version = ">=1.20.3", markers = "python_version < \"3.10\""}
+python-dateutil = ">=2.8.1"
+pytz = ">=2020.1"
+
+[package.extras]
+test = ["hypothesis (>=5.5.3)", "pytest (>=6.0)", "pytest-xdist (>=1.31)"]
+
+[[package]]
+name = "pandocfilters"
+version = "1.5.0"
+description = "Utilities for writing pandoc filters in python"
+optional = false
+python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*"
+files = [
+ {file = "pandocfilters-1.5.0-py2.py3-none-any.whl", hash = "sha256:33aae3f25fd1a026079f5d27bdd52496f0e0803b3469282162bafdcbdf6ef14f"},
+ {file = "pandocfilters-1.5.0.tar.gz", hash = "sha256:0b679503337d233b4339a817bfc8c50064e2eff681314376a47cb582305a7a38"},
+]
+
+[[package]]
+name = "parso"
+version = "0.8.3"
+description = "A Python Parser"
+optional = false
+python-versions = ">=3.6"
+files = [
+ {file = "parso-0.8.3-py2.py3-none-any.whl", hash = "sha256:c001d4636cd3aecdaf33cbb40aebb59b094be2a74c556778ef5576c175e19e75"},
+ {file = "parso-0.8.3.tar.gz", hash = "sha256:8c07be290bb59f03588915921e29e8a50002acaf2cdc5fa0e0114f91709fafa0"},
+]
+
+[package.extras]
+qa = ["flake8 (==3.8.3)", "mypy (==0.782)"]
+testing = ["docopt", "pytest (<6.0.0)"]
+
+[[package]]
+name = "pastel"
+version = "0.2.1"
+description = "Bring colors to your terminal."
+optional = false
+python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*"
+files = [
+ {file = "pastel-0.2.1-py2.py3-none-any.whl", hash = "sha256:4349225fcdf6c2bb34d483e523475de5bb04a5c10ef711263452cb37d7dd4364"},
+ {file = "pastel-0.2.1.tar.gz", hash = "sha256:e6581ac04e973cac858828c6202c1e1e81fee1dc7de7683f3e1ffe0bfd8a573d"},
+]
+
+[[package]]
+name = "pbr"
+version = "6.0.0"
+description = "Python Build Reasonableness"
+optional = false
+python-versions = ">=2.6"
+files = [
+ {file = "pbr-6.0.0-py2.py3-none-any.whl", hash = "sha256:4a7317d5e3b17a3dccb6a8cfe67dab65b20551404c52c8ed41279fa4f0cb4cda"},
+ {file = "pbr-6.0.0.tar.gz", hash = "sha256:d1377122a5a00e2f940ee482999518efe16d745d423a670c27773dfbc3c9a7d9"},
+]
+
+[[package]]
+name = "pep8-naming"
+version = "0.13.3"
+description = "Check PEP-8 naming conventions, plugin for flake8"
+optional = false
+python-versions = ">=3.7"
+files = [
+ {file = "pep8-naming-0.13.3.tar.gz", hash = "sha256:1705f046dfcd851378aac3be1cd1551c7c1e5ff363bacad707d43007877fa971"},
+ {file = "pep8_naming-0.13.3-py3-none-any.whl", hash = "sha256:1a86b8c71a03337c97181917e2b472f0f5e4ccb06844a0d6f0a33522549e7a80"},
+]
+
+[package.dependencies]
+flake8 = ">=5.0.0"
+
+[[package]]
+name = "pexpect"
+version = "4.9.0"
+description = "Pexpect allows easy control of interactive console applications."
+optional = false
+python-versions = "*"
+files = [
+ {file = "pexpect-4.9.0-py2.py3-none-any.whl", hash = "sha256:7236d1e080e4936be2dc3e326cec0af72acf9212a7e1d060210e70a47e253523"},
+ {file = "pexpect-4.9.0.tar.gz", hash = "sha256:ee7d41123f3c9911050ea2c2dac107568dc43b2d3b0c7557a33212c398ead30f"},
+]
+
+[package.dependencies]
+ptyprocess = ">=0.5"
+
+[[package]]
+name = "pillow"
+version = "10.1.0"
+description = "Python Imaging Library (Fork)"
+optional = false
+python-versions = ">=3.8"
+files = [
+ {file = "Pillow-10.1.0-cp310-cp310-macosx_10_10_x86_64.whl", hash = "sha256:1ab05f3db77e98f93964697c8efc49c7954b08dd61cff526b7f2531a22410106"},
+ {file = "Pillow-10.1.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:6932a7652464746fcb484f7fc3618e6503d2066d853f68a4bd97193a3996e273"},
+ {file = "Pillow-10.1.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a5f63b5a68daedc54c7c3464508d8c12075e56dcfbd42f8c1bf40169061ae666"},
+ {file = "Pillow-10.1.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c0949b55eb607898e28eaccb525ab104b2d86542a85c74baf3a6dc24002edec2"},
+ {file = "Pillow-10.1.0-cp310-cp310-manylinux_2_28_aarch64.whl", hash = "sha256:ae88931f93214777c7a3aa0a8f92a683f83ecde27f65a45f95f22d289a69e593"},
+ {file = "Pillow-10.1.0-cp310-cp310-manylinux_2_28_x86_64.whl", hash = "sha256:b0eb01ca85b2361b09480784a7931fc648ed8b7836f01fb9241141b968feb1db"},
+ {file = "Pillow-10.1.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:d27b5997bdd2eb9fb199982bb7eb6164db0426904020dc38c10203187ae2ff2f"},
+ {file = "Pillow-10.1.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:7df5608bc38bd37ef585ae9c38c9cd46d7c81498f086915b0f97255ea60c2818"},
+ {file = "Pillow-10.1.0-cp310-cp310-win_amd64.whl", hash = "sha256:41f67248d92a5e0a2076d3517d8d4b1e41a97e2df10eb8f93106c89107f38b57"},
+ {file = "Pillow-10.1.0-cp311-cp311-macosx_10_10_x86_64.whl", hash = "sha256:1fb29c07478e6c06a46b867e43b0bcdb241b44cc52be9bc25ce5944eed4648e7"},
+ {file = "Pillow-10.1.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:2cdc65a46e74514ce742c2013cd4a2d12e8553e3a2563c64879f7c7e4d28bce7"},
+ {file = "Pillow-10.1.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:50d08cd0a2ecd2a8657bd3d82c71efd5a58edb04d9308185d66c3a5a5bed9610"},
+ {file = "Pillow-10.1.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:062a1610e3bc258bff2328ec43f34244fcec972ee0717200cb1425214fe5b839"},
+ {file = "Pillow-10.1.0-cp311-cp311-manylinux_2_28_aarch64.whl", hash = "sha256:61f1a9d247317fa08a308daaa8ee7b3f760ab1809ca2da14ecc88ae4257d6172"},
+ {file = "Pillow-10.1.0-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:a646e48de237d860c36e0db37ecaecaa3619e6f3e9d5319e527ccbc8151df061"},
+ {file = "Pillow-10.1.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:47e5bf85b80abc03be7455c95b6d6e4896a62f6541c1f2ce77a7d2bb832af262"},
+ {file = "Pillow-10.1.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:a92386125e9ee90381c3369f57a2a50fa9e6aa8b1cf1d9c4b200d41a7dd8e992"},
+ {file = "Pillow-10.1.0-cp311-cp311-win_amd64.whl", hash = "sha256:0f7c276c05a9767e877a0b4c5050c8bee6a6d960d7f0c11ebda6b99746068c2a"},
+ {file = "Pillow-10.1.0-cp312-cp312-macosx_10_10_x86_64.whl", hash = "sha256:a89b8312d51715b510a4fe9fc13686283f376cfd5abca8cd1c65e4c76e21081b"},
+ {file = "Pillow-10.1.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:00f438bb841382b15d7deb9a05cc946ee0f2c352653c7aa659e75e592f6fa17d"},
+ {file = "Pillow-10.1.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3d929a19f5469b3f4df33a3df2983db070ebb2088a1e145e18facbc28cae5b27"},
+ {file = "Pillow-10.1.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9a92109192b360634a4489c0c756364c0c3a2992906752165ecb50544c251312"},
+ {file = "Pillow-10.1.0-cp312-cp312-manylinux_2_28_aarch64.whl", hash = "sha256:0248f86b3ea061e67817c47ecbe82c23f9dd5d5226200eb9090b3873d3ca32de"},
+ {file = "Pillow-10.1.0-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:9882a7451c680c12f232a422730f986a1fcd808da0fd428f08b671237237d651"},
+ {file = "Pillow-10.1.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:1c3ac5423c8c1da5928aa12c6e258921956757d976405e9467c5f39d1d577a4b"},
+ {file = "Pillow-10.1.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:806abdd8249ba3953c33742506fe414880bad78ac25cc9a9b1c6ae97bedd573f"},
+ {file = "Pillow-10.1.0-cp312-cp312-win_amd64.whl", hash = "sha256:eaed6977fa73408b7b8a24e8b14e59e1668cfc0f4c40193ea7ced8e210adf996"},
+ {file = "Pillow-10.1.0-cp38-cp38-macosx_10_10_x86_64.whl", hash = "sha256:fe1e26e1ffc38be097f0ba1d0d07fcade2bcfd1d023cda5b29935ae8052bd793"},
+ {file = "Pillow-10.1.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:7a7e3daa202beb61821c06d2517428e8e7c1aab08943e92ec9e5755c2fc9ba5e"},
+ {file = "Pillow-10.1.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:24fadc71218ad2b8ffe437b54876c9382b4a29e030a05a9879f615091f42ffc2"},
+ {file = "Pillow-10.1.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fa1d323703cfdac2036af05191b969b910d8f115cf53093125e4058f62012c9a"},
+ {file = "Pillow-10.1.0-cp38-cp38-manylinux_2_28_aarch64.whl", hash = "sha256:912e3812a1dbbc834da2b32299b124b5ddcb664ed354916fd1ed6f193f0e2d01"},
+ {file = "Pillow-10.1.0-cp38-cp38-manylinux_2_28_x86_64.whl", hash = "sha256:7dbaa3c7de82ef37e7708521be41db5565004258ca76945ad74a8e998c30af8d"},
+ {file = "Pillow-10.1.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:9d7bc666bd8c5a4225e7ac71f2f9d12466ec555e89092728ea0f5c0c2422ea80"},
+ {file = "Pillow-10.1.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:baada14941c83079bf84c037e2d8b7506ce201e92e3d2fa0d1303507a8538212"},
+ {file = "Pillow-10.1.0-cp38-cp38-win_amd64.whl", hash = "sha256:2ef6721c97894a7aa77723740a09547197533146fba8355e86d6d9a4a1056b14"},
+ {file = "Pillow-10.1.0-cp39-cp39-macosx_10_10_x86_64.whl", hash = "sha256:0a026c188be3b443916179f5d04548092e253beb0c3e2ee0a4e2cdad72f66099"},
+ {file = "Pillow-10.1.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:04f6f6149f266a100374ca3cc368b67fb27c4af9f1cc8cb6306d849dcdf12616"},
+ {file = "Pillow-10.1.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bb40c011447712d2e19cc261c82655f75f32cb724788df315ed992a4d65696bb"},
+ {file = "Pillow-10.1.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1a8413794b4ad9719346cd9306118450b7b00d9a15846451549314a58ac42219"},
+ {file = "Pillow-10.1.0-cp39-cp39-manylinux_2_28_aarch64.whl", hash = "sha256:c9aeea7b63edb7884b031a35305629a7593272b54f429a9869a4f63a1bf04c34"},
+ {file = "Pillow-10.1.0-cp39-cp39-manylinux_2_28_x86_64.whl", hash = "sha256:b4005fee46ed9be0b8fb42be0c20e79411533d1fd58edabebc0dd24626882cfd"},
+ {file = "Pillow-10.1.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:4d0152565c6aa6ebbfb1e5d8624140a440f2b99bf7afaafbdbf6430426497f28"},
+ {file = "Pillow-10.1.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:d921bc90b1defa55c9917ca6b6b71430e4286fc9e44c55ead78ca1a9f9eba5f2"},
+ {file = "Pillow-10.1.0-cp39-cp39-win_amd64.whl", hash = "sha256:cfe96560c6ce2f4c07d6647af2d0f3c54cc33289894ebd88cfbb3bcd5391e256"},
+ {file = "Pillow-10.1.0-pp310-pypy310_pp73-macosx_10_10_x86_64.whl", hash = "sha256:937bdc5a7f5343d1c97dc98149a0be7eb9704e937fe3dc7140e229ae4fc572a7"},
+ {file = "Pillow-10.1.0-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b1c25762197144e211efb5f4e8ad656f36c8d214d390585d1d21281f46d556ba"},
+ {file = "Pillow-10.1.0-pp310-pypy310_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:afc8eef765d948543a4775f00b7b8c079b3321d6b675dde0d02afa2ee23000b4"},
+ {file = "Pillow-10.1.0-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:883f216eac8712b83a63f41b76ddfb7b2afab1b74abbb413c5df6680f071a6b9"},
+ {file = "Pillow-10.1.0-pp39-pypy39_pp73-macosx_10_10_x86_64.whl", hash = "sha256:b920e4d028f6442bea9a75b7491c063f0b9a3972520731ed26c83e254302eb1e"},
+ {file = "Pillow-10.1.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1c41d960babf951e01a49c9746f92c5a7e0d939d1652d7ba30f6b3090f27e412"},
+ {file = "Pillow-10.1.0-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:1fafabe50a6977ac70dfe829b2d5735fd54e190ab55259ec8aea4aaea412fa0b"},
+ {file = "Pillow-10.1.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:3b834f4b16173e5b92ab6566f0473bfb09f939ba14b23b8da1f54fa63e4b623f"},
+ {file = "Pillow-10.1.0.tar.gz", hash = "sha256:e6bf8de6c36ed96c86ea3b6e1d5273c53f46ef518a062464cd7ef5dd2cf92e38"},
+]
+
+[package.extras]
+docs = ["furo", "olefile", "sphinx (>=2.4)", "sphinx-copybutton", "sphinx-inline-tabs", "sphinx-removed-in", "sphinxext-opengraph"]
+tests = ["check-manifest", "coverage", "defusedxml", "markdown2", "olefile", "packaging", "pyroma", "pytest", "pytest-cov", "pytest-timeout"]
+
+[[package]]
+name = "platformdirs"
+version = "4.0.0"
+description = "A small Python package for determining appropriate platform-specific dirs, e.g. a \"user data dir\"."
+optional = false
+python-versions = ">=3.7"
+files = [
+ {file = "platformdirs-4.0.0-py3-none-any.whl", hash = "sha256:118c954d7e949b35437270383a3f2531e99dd93cf7ce4dc8340d3356d30f173b"},
+ {file = "platformdirs-4.0.0.tar.gz", hash = "sha256:cb633b2bcf10c51af60beb0ab06d2f1d69064b43abf4c185ca6b28865f3f9731"},
+]
+
+[package.extras]
+docs = ["furo (>=2023.7.26)", "proselint (>=0.13)", "sphinx (>=7.1.1)", "sphinx-autodoc-typehints (>=1.24)"]
+test = ["appdirs (==1.4.4)", "covdefaults (>=2.3)", "pytest (>=7.4)", "pytest-cov (>=4.1)", "pytest-mock (>=3.11.1)"]
+
+[[package]]
+name = "pluggy"
+version = "1.3.0"
+description = "plugin and hook calling mechanisms for python"
+optional = false
+python-versions = ">=3.8"
+files = [
+ {file = "pluggy-1.3.0-py3-none-any.whl", hash = "sha256:d89c696a773f8bd377d18e5ecda92b7a3793cbe66c87060a6fb58c7b6e1061f7"},
+ {file = "pluggy-1.3.0.tar.gz", hash = "sha256:cf61ae8f126ac6f7c451172cf30e3e43d3ca77615509771b3a984a0730651e12"},
+]
+
+[package.extras]
+dev = ["pre-commit", "tox"]
+testing = ["pytest", "pytest-benchmark"]
+
+[[package]]
+name = "poethepoet"
+version = "0.24.4"
+description = "A task runner that works well with poetry."
+optional = false
+python-versions = ">=3.8"
+files = [
+ {file = "poethepoet-0.24.4-py3-none-any.whl", hash = "sha256:fb4ea35d7f40fe2081ea917d2e4102e2310fda2cde78974050ca83896e229075"},
+ {file = "poethepoet-0.24.4.tar.gz", hash = "sha256:ff4220843a87c888cbcb5312c8905214701d0af60ac7271795baa8369b428fef"},
+]
+
+[package.dependencies]
+pastel = ">=0.2.1,<0.3.0"
+tomli = ">=1.2.2"
+
+[package.extras]
+poetry-plugin = ["poetry (>=1.0,<2.0)"]
+
+[[package]]
+name = "pre-commit"
+version = "3.5.0"
+description = "A framework for managing and maintaining multi-language pre-commit hooks."
+optional = false
+python-versions = ">=3.8"
+files = [
+ {file = "pre_commit-3.5.0-py2.py3-none-any.whl", hash = "sha256:841dc9aef25daba9a0238cd27984041fa0467b4199fc4852e27950664919f660"},
+ {file = "pre_commit-3.5.0.tar.gz", hash = "sha256:5804465c675b659b0862f07907f96295d490822a450c4c40e747d0b1c6ebcb32"},
+]
+
+[package.dependencies]
+cfgv = ">=2.0.0"
+identify = ">=1.0.0"
+nodeenv = ">=0.11.1"
+pyyaml = ">=5.1"
+virtualenv = ">=20.10.0"
+
+[[package]]
+name = "prometheus-client"
+version = "0.19.0"
+description = "Python client for the Prometheus monitoring system."
+optional = false
+python-versions = ">=3.8"
+files = [
+ {file = "prometheus_client-0.19.0-py3-none-any.whl", hash = "sha256:c88b1e6ecf6b41cd8fb5731c7ae919bf66df6ec6fafa555cd6c0e16ca169ae92"},
+ {file = "prometheus_client-0.19.0.tar.gz", hash = "sha256:4585b0d1223148c27a225b10dbec5ae9bc4c81a99a3fa80774fa6209935324e1"},
+]
+
+[package.extras]
+twisted = ["twisted"]
+
+[[package]]
+name = "prompt-toolkit"
+version = "3.0.41"
+description = "Library for building powerful interactive command lines in Python"
+optional = false
+python-versions = ">=3.7.0"
+files = [
+ {file = "prompt_toolkit-3.0.41-py3-none-any.whl", hash = "sha256:f36fe301fafb7470e86aaf90f036eef600a3210be4decf461a5b1ca8403d3cb2"},
+ {file = "prompt_toolkit-3.0.41.tar.gz", hash = "sha256:941367d97fc815548822aa26c2a269fdc4eb21e9ec05fc5d447cf09bad5d75f0"},
+]
+
+[package.dependencies]
+wcwidth = "*"
+
+[[package]]
+name = "psutil"
+version = "5.9.6"
+description = "Cross-platform lib for process and system monitoring in Python."
+optional = false
+python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, !=3.5.*"
+files = [
+ {file = "psutil-5.9.6-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:fb8a697f11b0f5994550555fcfe3e69799e5b060c8ecf9e2f75c69302cc35c0d"},
+ {file = "psutil-5.9.6-cp27-cp27m-manylinux2010_i686.whl", hash = "sha256:91ecd2d9c00db9817a4b4192107cf6954addb5d9d67a969a4f436dbc9200f88c"},
+ {file = "psutil-5.9.6-cp27-cp27m-manylinux2010_x86_64.whl", hash = "sha256:10e8c17b4f898d64b121149afb136c53ea8b68c7531155147867b7b1ac9e7e28"},
+ {file = "psutil-5.9.6-cp27-cp27mu-manylinux2010_i686.whl", hash = "sha256:18cd22c5db486f33998f37e2bb054cc62fd06646995285e02a51b1e08da97017"},
+ {file = "psutil-5.9.6-cp27-cp27mu-manylinux2010_x86_64.whl", hash = "sha256:ca2780f5e038379e520281e4c032dddd086906ddff9ef0d1b9dcf00710e5071c"},
+ {file = "psutil-5.9.6-cp27-none-win32.whl", hash = "sha256:70cb3beb98bc3fd5ac9ac617a327af7e7f826373ee64c80efd4eb2856e5051e9"},
+ {file = "psutil-5.9.6-cp27-none-win_amd64.whl", hash = "sha256:51dc3d54607c73148f63732c727856f5febec1c7c336f8f41fcbd6315cce76ac"},
+ {file = "psutil-5.9.6-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:c69596f9fc2f8acd574a12d5f8b7b1ba3765a641ea5d60fb4736bf3c08a8214a"},
+ {file = "psutil-5.9.6-cp36-abi3-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:92e0cc43c524834af53e9d3369245e6cc3b130e78e26100d1f63cdb0abeb3d3c"},
+ {file = "psutil-5.9.6-cp36-abi3-manylinux_2_12_x86_64.manylinux2010_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:748c9dd2583ed86347ed65d0035f45fa8c851e8d90354c122ab72319b5f366f4"},
+ {file = "psutil-5.9.6-cp36-cp36m-win32.whl", hash = "sha256:3ebf2158c16cc69db777e3c7decb3c0f43a7af94a60d72e87b2823aebac3d602"},
+ {file = "psutil-5.9.6-cp36-cp36m-win_amd64.whl", hash = "sha256:ff18b8d1a784b810df0b0fff3bcb50ab941c3b8e2c8de5726f9c71c601c611aa"},
+ {file = "psutil-5.9.6-cp37-abi3-win32.whl", hash = "sha256:a6f01f03bf1843280f4ad16f4bde26b817847b4c1a0db59bf6419807bc5ce05c"},
+ {file = "psutil-5.9.6-cp37-abi3-win_amd64.whl", hash = "sha256:6e5fb8dc711a514da83098bc5234264e551ad980cec5f85dabf4d38ed6f15e9a"},
+ {file = "psutil-5.9.6-cp38-abi3-macosx_11_0_arm64.whl", hash = "sha256:daecbcbd29b289aac14ece28eca6a3e60aa361754cf6da3dfb20d4d32b6c7f57"},
+ {file = "psutil-5.9.6.tar.gz", hash = "sha256:e4b92ddcd7dd4cdd3f900180ea1e104932c7bce234fb88976e2a3b296441225a"},
+]
+
+[package.extras]
+test = ["enum34", "ipaddress", "mock", "pywin32", "wmi"]
+
+[[package]]
+name = "ptyprocess"
+version = "0.7.0"
+description = "Run a subprocess in a pseudo terminal"
+optional = false
+python-versions = "*"
+files = [
+ {file = "ptyprocess-0.7.0-py2.py3-none-any.whl", hash = "sha256:4b41f3967fce3af57cc7e94b888626c18bf37a083e3651ca8feeb66d492fef35"},
+ {file = "ptyprocess-0.7.0.tar.gz", hash = "sha256:5c5d0a3b48ceee0b48485e0c26037c0acd7d29765ca3fbb5cb3831d347423220"},
+]
+
+[[package]]
+name = "pudb"
+version = "2023.1"
+description = "A full-screen, console-based Python debugger"
+optional = false
+python-versions = "~=3.8"
+files = [
+ {file = "pudb-2023.1.tar.gz", hash = "sha256:15df3c603aba87a918a666ef8e1bf63f764238cc3589db3c5b7a5f1b01ea2f03"},
+]
+
+[package.dependencies]
+jedi = ">=0.18,<1"
+packaging = ">=20.0"
+pygments = ">=2.7.4"
+urwid = ">=1.1.1"
+urwid_readline = "*"
+
+[package.extras]
+completion = ["shtab"]
+
+[[package]]
+name = "pure-eval"
+version = "0.2.2"
+description = "Safely evaluate AST nodes without side effects"
+optional = false
+python-versions = "*"
+files = [
+ {file = "pure_eval-0.2.2-py3-none-any.whl", hash = "sha256:01eaab343580944bc56080ebe0a674b39ec44a945e6d09ba7db3cb8cec289350"},
+ {file = "pure_eval-0.2.2.tar.gz", hash = "sha256:2b45320af6dfaa1750f543d714b6d1c520a1688dec6fd24d339063ce0aaa9ac3"},
+]
+
+[package.extras]
+tests = ["pytest"]
+
+[[package]]
+name = "pycocotools"
+version = "2.0.6"
+description = "Official APIs for the MS-COCO dataset"
+optional = false
+python-versions = ">=3.5"
+files = [
+ {file = "pycocotools-2.0.6.tar.gz", hash = "sha256:7fe089b05cc18e806dcf3bd764708d86dab922a100f3734eb77fb77a70a1d18c"},
+]
+
+[package.dependencies]
+matplotlib = ">=2.1.0"
+numpy = "*"
+
+[[package]]
+name = "pycodestyle"
+version = "2.11.1"
+description = "Python style guide checker"
+optional = false
+python-versions = ">=3.8"
+files = [
+ {file = "pycodestyle-2.11.1-py2.py3-none-any.whl", hash = "sha256:44fe31000b2d866f2e41841b18528a505fbd7fef9017b04eff4e2648a0fadc67"},
+ {file = "pycodestyle-2.11.1.tar.gz", hash = "sha256:41ba0e7afc9752dfb53ced5489e89f8186be00e599e712660695b7a75ff2663f"},
+]
+
+[[package]]
+name = "pycparser"
+version = "2.21"
+description = "C parser in Python"
+optional = false
+python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*"
+files = [
+ {file = "pycparser-2.21-py2.py3-none-any.whl", hash = "sha256:8ee45429555515e1f6b185e78100aea234072576aa43ab53aefcae078162fca9"},
+ {file = "pycparser-2.21.tar.gz", hash = "sha256:e644fdec12f7872f86c58ff790da456218b10f863970249516d60a5eaca77206"},
+]
+
+[[package]]
+name = "pydantic"
+version = "1.10.13"
+description = "Data validation and settings management using python type hints"
+optional = false
+python-versions = ">=3.7"
+files = [
+ {file = "pydantic-1.10.13-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:efff03cc7a4f29d9009d1c96ceb1e7a70a65cfe86e89d34e4a5f2ab1e5693737"},
+ {file = "pydantic-1.10.13-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:3ecea2b9d80e5333303eeb77e180b90e95eea8f765d08c3d278cd56b00345d01"},
+ {file = "pydantic-1.10.13-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1740068fd8e2ef6eb27a20e5651df000978edce6da6803c2bef0bc74540f9548"},
+ {file = "pydantic-1.10.13-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:84bafe2e60b5e78bc64a2941b4c071a4b7404c5c907f5f5a99b0139781e69ed8"},
+ {file = "pydantic-1.10.13-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:bc0898c12f8e9c97f6cd44c0ed70d55749eaf783716896960b4ecce2edfd2d69"},
+ {file = "pydantic-1.10.13-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:654db58ae399fe6434e55325a2c3e959836bd17a6f6a0b6ca8107ea0571d2e17"},
+ {file = "pydantic-1.10.13-cp310-cp310-win_amd64.whl", hash = "sha256:75ac15385a3534d887a99c713aa3da88a30fbd6204a5cd0dc4dab3d770b9bd2f"},
+ {file = "pydantic-1.10.13-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:c553f6a156deb868ba38a23cf0df886c63492e9257f60a79c0fd8e7173537653"},
+ {file = "pydantic-1.10.13-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:5e08865bc6464df8c7d61439ef4439829e3ab62ab1669cddea8dd00cd74b9ffe"},
+ {file = "pydantic-1.10.13-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e31647d85a2013d926ce60b84f9dd5300d44535a9941fe825dc349ae1f760df9"},
+ {file = "pydantic-1.10.13-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:210ce042e8f6f7c01168b2d84d4c9eb2b009fe7bf572c2266e235edf14bacd80"},
+ {file = "pydantic-1.10.13-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:8ae5dd6b721459bfa30805f4c25880e0dd78fc5b5879f9f7a692196ddcb5a580"},
+ {file = "pydantic-1.10.13-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:f8e81fc5fb17dae698f52bdd1c4f18b6ca674d7068242b2aff075f588301bbb0"},
+ {file = "pydantic-1.10.13-cp311-cp311-win_amd64.whl", hash = "sha256:61d9dce220447fb74f45e73d7ff3b530e25db30192ad8d425166d43c5deb6df0"},
+ {file = "pydantic-1.10.13-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:4b03e42ec20286f052490423682016fd80fda830d8e4119f8ab13ec7464c0132"},
+ {file = "pydantic-1.10.13-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f59ef915cac80275245824e9d771ee939133be38215555e9dc90c6cb148aaeb5"},
+ {file = "pydantic-1.10.13-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5a1f9f747851338933942db7af7b6ee8268568ef2ed86c4185c6ef4402e80ba8"},
+ {file = "pydantic-1.10.13-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:97cce3ae7341f7620a0ba5ef6cf043975cd9d2b81f3aa5f4ea37928269bc1b87"},
+ {file = "pydantic-1.10.13-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:854223752ba81e3abf663d685f105c64150873cc6f5d0c01d3e3220bcff7d36f"},
+ {file = "pydantic-1.10.13-cp37-cp37m-win_amd64.whl", hash = "sha256:b97c1fac8c49be29486df85968682b0afa77e1b809aff74b83081cc115e52f33"},
+ {file = "pydantic-1.10.13-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:c958d053453a1c4b1c2062b05cd42d9d5c8eb67537b8d5a7e3c3032943ecd261"},
+ {file = "pydantic-1.10.13-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:4c5370a7edaac06daee3af1c8b1192e305bc102abcbf2a92374b5bc793818599"},
+ {file = "pydantic-1.10.13-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7d6f6e7305244bddb4414ba7094ce910560c907bdfa3501e9db1a7fd7eaea127"},
+ {file = "pydantic-1.10.13-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d3a3c792a58e1622667a2837512099eac62490cdfd63bd407993aaf200a4cf1f"},
+ {file = "pydantic-1.10.13-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:c636925f38b8db208e09d344c7aa4f29a86bb9947495dd6b6d376ad10334fb78"},
+ {file = "pydantic-1.10.13-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:678bcf5591b63cc917100dc50ab6caebe597ac67e8c9ccb75e698f66038ea953"},
+ {file = "pydantic-1.10.13-cp38-cp38-win_amd64.whl", hash = "sha256:6cf25c1a65c27923a17b3da28a0bdb99f62ee04230c931d83e888012851f4e7f"},
+ {file = "pydantic-1.10.13-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:8ef467901d7a41fa0ca6db9ae3ec0021e3f657ce2c208e98cd511f3161c762c6"},
+ {file = "pydantic-1.10.13-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:968ac42970f57b8344ee08837b62f6ee6f53c33f603547a55571c954a4225691"},
+ {file = "pydantic-1.10.13-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9849f031cf8a2f0a928fe885e5a04b08006d6d41876b8bbd2fc68a18f9f2e3fd"},
+ {file = "pydantic-1.10.13-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:56e3ff861c3b9c6857579de282ce8baabf443f42ffba355bf070770ed63e11e1"},
+ {file = "pydantic-1.10.13-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:9f00790179497767aae6bcdc36355792c79e7bbb20b145ff449700eb076c5f96"},
+ {file = "pydantic-1.10.13-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:75b297827b59bc229cac1a23a2f7a4ac0031068e5be0ce385be1462e7e17a35d"},
+ {file = "pydantic-1.10.13-cp39-cp39-win_amd64.whl", hash = "sha256:e70ca129d2053fb8b728ee7d1af8e553a928d7e301a311094b8a0501adc8763d"},
+ {file = "pydantic-1.10.13-py3-none-any.whl", hash = "sha256:b87326822e71bd5f313e7d3bfdc77ac3247035ac10b0c0618bd99dcf95b1e687"},
+ {file = "pydantic-1.10.13.tar.gz", hash = "sha256:32c8b48dcd3b2ac4e78b0ba4af3a2c2eb6048cb75202f0ea7b34feb740efc340"},
+]
+
+[package.dependencies]
+python-dotenv = {version = ">=0.10.4", optional = true, markers = "extra == \"dotenv\""}
+typing-extensions = ">=4.2.0"
+
+[package.extras]
+dotenv = ["python-dotenv (>=0.10.4)"]
+email = ["email-validator (>=1.0.3)"]
+
+[[package]]
+name = "pydocstyle"
+version = "6.3.0"
+description = "Python docstring style checker"
+optional = false
+python-versions = ">=3.6"
+files = [
+ {file = "pydocstyle-6.3.0-py3-none-any.whl", hash = "sha256:118762d452a49d6b05e194ef344a55822987a462831ade91ec5c06fd2169d019"},
+ {file = "pydocstyle-6.3.0.tar.gz", hash = "sha256:7ce43f0c0ac87b07494eb9c0b462c0b73e6ff276807f204d6b53edc72b7e44e1"},
+]
+
+[package.dependencies]
+snowballstemmer = ">=2.2.0"
+
+[package.extras]
+toml = ["tomli (>=1.2.3)"]
+
+[[package]]
+name = "pyflakes"
+version = "3.1.0"
+description = "passive checker of Python programs"
+optional = false
+python-versions = ">=3.8"
+files = [
+ {file = "pyflakes-3.1.0-py2.py3-none-any.whl", hash = "sha256:4132f6d49cb4dae6819e5379898f2b8cce3c5f23994194c24b77d5da2e36f774"},
+ {file = "pyflakes-3.1.0.tar.gz", hash = "sha256:a0aae034c444db0071aa077972ba4768d40c830d9539fd45bf4cd3f8f6992efc"},
+]
+
+[[package]]
+name = "pygments"
+version = "2.17.2"
+description = "Pygments is a syntax highlighting package written in Python."
+optional = false
+python-versions = ">=3.7"
+files = [
+ {file = "pygments-2.17.2-py3-none-any.whl", hash = "sha256:b27c2826c47d0f3219f29554824c30c5e8945175d888647acd804ddd04af846c"},
+ {file = "pygments-2.17.2.tar.gz", hash = "sha256:da46cec9fd2de5be3a8a784f434e4c4ab670b4ff54d605c4c2717e9d49c4c367"},
+]
+
+[package.extras]
+plugins = ["importlib-metadata"]
+windows-terminal = ["colorama (>=0.4.6)"]
+
+[[package]]
+name = "pyparsing"
+version = "3.1.1"
+description = "pyparsing module - Classes and methods to define and execute parsing grammars"
+optional = false
+python-versions = ">=3.6.8"
+files = [
+ {file = "pyparsing-3.1.1-py3-none-any.whl", hash = "sha256:32c7c0b711493c72ff18a981d24f28aaf9c1fb7ed5e9667c9e84e3db623bdbfb"},
+ {file = "pyparsing-3.1.1.tar.gz", hash = "sha256:ede28a1a32462f5a9705e07aea48001a08f7cf81a021585011deba701581a0db"},
+]
+
+[package.extras]
+diagrams = ["jinja2", "railroad-diagrams"]
+
+[[package]]
+name = "pyquaternion"
+version = "0.9.9"
+description = "A fully featured, pythonic library for representing and using quaternions."
+optional = false
+python-versions = "*"
+files = [
+ {file = "pyquaternion-0.9.9-py2-none-any.whl", hash = "sha256:d0eb69219ca99bfcbc25c1e2c4f82e58c61dce3e907e929f13c5f3615e4b6518"},
+ {file = "pyquaternion-0.9.9-py3-none-any.whl", hash = "sha256:e65f6e3f7b1fdf1a9e23f82434334a1ae84f14223eee835190cd2e841f8172ec"},
+ {file = "pyquaternion-0.9.9.tar.gz", hash = "sha256:b1f61af219cb2fe966b5fb79a192124f2e63a3f7a777ac3cadf2957b1a81bea8"},
+]
+
+[package.dependencies]
+numpy = "*"
+
+[package.extras]
+dev = ["mkdocs"]
+test = ["nose"]
+
+[[package]]
+name = "pyreadline3"
+version = "3.4.1"
+description = "A python implementation of GNU readline."
+optional = false
+python-versions = "*"
+files = [
+ {file = "pyreadline3-3.4.1-py3-none-any.whl", hash = "sha256:b0efb6516fd4fb07b45949053826a62fa4cb353db5be2bbb4a7aa1fdd1e345fb"},
+ {file = "pyreadline3-3.4.1.tar.gz", hash = "sha256:6f3d1f7b8a31ba32b73917cefc1f28cc660562f39aea8646d30bd6eff21f7bae"},
+]
+
+[[package]]
+name = "pytest"
+version = "7.4.3"
+description = "pytest: simple powerful testing with Python"
+optional = false
+python-versions = ">=3.7"
+files = [
+ {file = "pytest-7.4.3-py3-none-any.whl", hash = "sha256:0d009c083ea859a71b76adf7c1d502e4bc170b80a8ef002da5806527b9591fac"},
+ {file = "pytest-7.4.3.tar.gz", hash = "sha256:d989d136982de4e3b29dabcc838ad581c64e8ed52c11fbe86ddebd9da0818cd5"},
+]
+
+[package.dependencies]
+colorama = {version = "*", markers = "sys_platform == \"win32\""}
+exceptiongroup = {version = ">=1.0.0rc8", markers = "python_version < \"3.11\""}
+iniconfig = "*"
+packaging = "*"
+pluggy = ">=0.12,<2.0"
+tomli = {version = ">=1.0.0", markers = "python_version < \"3.11\""}
+
+[package.extras]
+testing = ["argcomplete", "attrs (>=19.2.0)", "hypothesis (>=3.56)", "mock", "nose", "pygments (>=2.7.2)", "requests", "setuptools", "xmlschema"]
+
+[[package]]
+name = "pytest-cases"
+version = "3.8.1"
+description = "Separate test code from test cases in pytest."
+optional = false
+python-versions = "*"
+files = [
+ {file = "pytest-cases-3.8.1.tar.gz", hash = "sha256:49d7f6f8ad534e5a6e73fb8f5fd38986606f17b46ee55f7ebee07a55c677ca01"},
+ {file = "pytest_cases-3.8.1-py2.py3-none-any.whl", hash = "sha256:595553f5a522ad6525778a35e0fcb4a46f8eb069e0abe108de02e1d4fb136b85"},
+]
+
+[package.dependencies]
+decopatch = "*"
+makefun = ">=1.15.1"
+packaging = "*"
+
+[[package]]
+name = "pytest-cov"
+version = "4.1.0"
+description = "Pytest plugin for measuring coverage."
+optional = false
+python-versions = ">=3.7"
+files = [
+ {file = "pytest-cov-4.1.0.tar.gz", hash = "sha256:3904b13dfbfec47f003b8e77fd5b589cd11904a21ddf1ab38a64f204d6a10ef6"},
+ {file = "pytest_cov-4.1.0-py3-none-any.whl", hash = "sha256:6ba70b9e97e69fcc3fb45bfeab2d0a138fb65c4d0d6a41ef33983ad114be8c3a"},
+]
+
+[package.dependencies]
+coverage = {version = ">=5.2.1", extras = ["toml"]}
+pytest = ">=4.6"
+
+[package.extras]
+testing = ["fields", "hunter", "process-tests", "pytest-xdist", "six", "virtualenv"]
+
+[[package]]
+name = "python-dateutil"
+version = "2.8.2"
+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.8.2.tar.gz", hash = "sha256:0123cacc1627ae19ddf3c27a5de5bd67ee4586fbdd6440d9748f8abb483d3e86"},
+ {file = "python_dateutil-2.8.2-py2.py3-none-any.whl", hash = "sha256:961d03dc3453ebbc59dbdea9e4e11c5651520a876d0f4db161e8674aae935da9"},
+]
+
+[package.dependencies]
+six = ">=1.5"
+
+[[package]]
+name = "python-dotenv"
+version = "1.0.0"
+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.0.tar.gz", hash = "sha256:a8df96034aae6d2d50a4ebe8216326c61c3eb64836776504fcca410e5937a3ba"},
+ {file = "python_dotenv-1.0.0-py3-none-any.whl", hash = "sha256:f5971a9226b701070a4bf2c38c89e5a3f0d64de8debda981d1db98583009122a"},
+]
+
+[package.extras]
+cli = ["click (>=5.0)"]
+
+[[package]]
+name = "python-json-logger"
+version = "2.0.7"
+description = "A python library adding a json log formatter"
+optional = false
+python-versions = ">=3.6"
+files = [
+ {file = "python-json-logger-2.0.7.tar.gz", hash = "sha256:23e7ec02d34237c5aa1e29a070193a4ea87583bb4e7f8fd06d3de8264c4b2e1c"},
+ {file = "python_json_logger-2.0.7-py3-none-any.whl", hash = "sha256:f380b826a991ebbe3de4d897aeec42760035ac760345e57b812938dc8b35e2bd"},
+]
+
+[[package]]
+name = "python-multipart"
+version = "0.0.6"
+description = "A streaming multipart parser for Python"
+optional = false
+python-versions = ">=3.7"
+files = [
+ {file = "python_multipart-0.0.6-py3-none-any.whl", hash = "sha256:ee698bab5ef148b0a760751c261902cd096e57e10558e11aca17646b74ee1c18"},
+ {file = "python_multipart-0.0.6.tar.gz", hash = "sha256:e9925a80bb668529f1b67c7fdb0a5dacdd7cbfc6fb0bff3ea443fe22bdd62132"},
+]
+
+[package.extras]
+dev = ["atomicwrites (==1.2.1)", "attrs (==19.2.0)", "coverage (==6.5.0)", "hatch", "invoke (==1.7.3)", "more-itertools (==4.3.0)", "pbr (==4.3.0)", "pluggy (==1.0.0)", "py (==1.11.0)", "pytest (==7.2.0)", "pytest-cov (==4.0.0)", "pytest-timeout (==2.1.0)", "pyyaml (==5.1)"]
+
+[[package]]
+name = "pytorch-lightning"
+version = "1.9.5"
+description = "PyTorch Lightning is the lightweight PyTorch wrapper for ML researchers. Scale your models. Write less boilerplate."
+optional = false
+python-versions = ">=3.7"
+files = [
+ {file = "pytorch-lightning-1.9.5.tar.gz", hash = "sha256:925fe7b80ddf04859fa385aa493b260be4000b11a2f22447afb4a932d1f07d26"},
+ {file = "pytorch_lightning-1.9.5-py3-none-any.whl", hash = "sha256:06821558158623c5d2ecf5d3d0374dc8bd661e0acd3acf54a6d6f71737c156c5"},
+]
+
+[package.dependencies]
+fsspec = {version = ">2021.06.0", extras = ["http"]}
+lightning-utilities = ">=0.6.0.post0"
+numpy = ">=1.17.2"
+packaging = ">=17.1"
+PyYAML = ">=5.4"
+torch = ">=1.10.0"
+torchmetrics = ">=0.7.0"
+tqdm = ">=4.57.0"
+typing-extensions = ">=4.0.0"
+
+[package.extras]
+all = ["colossalai (>=0.2.0)", "deepspeed (>=0.6.0)", "fairscale (>=0.4.5)", "gym[classic-control] (>=0.17.0)", "hivemind (==1.1.5)", "horovod (>=0.21.2,!=0.24.0)", "hydra-core (>=1.0.5)", "ipython[all] (<8.7.1)", "jsonargparse[signatures] (>=4.18.0)", "matplotlib (>3.1)", "omegaconf (>=2.0.5)", "rich (>=10.14.0,!=10.15.0.a)", "tensorboardX (>=2.2)", "torchmetrics (>=0.10.0)", "torchvision (>=0.11.1)"]
+colossalai = ["colossalai (>=0.2.0)"]
+deepspeed = ["deepspeed (>=0.6.0)"]
+dev = ["cloudpickle (>=1.3)", "codecov (==2.1.12)", "colossalai (>=0.2.0)", "coverage (==6.5.0)", "deepspeed (>=0.6.0)", "fairscale (>=0.4.5)", "fastapi (<0.87.0)", "gym[classic-control] (>=0.17.0)", "hivemind (==1.1.5)", "horovod (>=0.21.2,!=0.24.0)", "hydra-core (>=1.0.5)", "ipython[all] (<8.7.1)", "jsonargparse[signatures] (>=4.18.0)", "matplotlib (>3.1)", "omegaconf (>=2.0.5)", "onnx (<1.14.0)", "onnxruntime (<1.14.0)", "pandas (>1.0)", "pre-commit (==2.20.0)", "protobuf (<=3.20.1)", "psutil (<5.9.5)", "pytest (==7.2.0)", "pytest-cov (==4.0.0)", "pytest-forked (==1.4.0)", "pytest-rerunfailures (==10.3)", "rich (>=10.14.0,!=10.15.0.a)", "scikit-learn (>0.22.1)", "tensorboard (>=2.9.1)", "tensorboardX (>=2.2)", "torchmetrics (>=0.10.0)", "torchvision (>=0.11.1)", "uvicorn (<0.19.1)"]
+examples = ["gym[classic-control] (>=0.17.0)", "ipython[all] (<8.7.1)", "torchmetrics (>=0.10.0)", "torchvision (>=0.11.1)"]
+extra = ["hydra-core (>=1.0.5)", "jsonargparse[signatures] (>=4.18.0)", "matplotlib (>3.1)", "omegaconf (>=2.0.5)", "rich (>=10.14.0,!=10.15.0.a)", "tensorboardX (>=2.2)"]
+fairscale = ["fairscale (>=0.4.5)"]
+hivemind = ["hivemind (==1.1.5)"]
+horovod = ["horovod (>=0.21.2,!=0.24.0)"]
+strategies = ["colossalai (>=0.2.0)", "deepspeed (>=0.6.0)", "fairscale (>=0.4.5)", "hivemind (==1.1.5)", "horovod (>=0.21.2,!=0.24.0)"]
+test = ["cloudpickle (>=1.3)", "codecov (==2.1.12)", "coverage (==6.5.0)", "fastapi (<0.87.0)", "onnx (<1.14.0)", "onnxruntime (<1.14.0)", "pandas (>1.0)", "pre-commit (==2.20.0)", "protobuf (<=3.20.1)", "psutil (<5.9.5)", "pytest (==7.2.0)", "pytest-cov (==4.0.0)", "pytest-forked (==1.4.0)", "pytest-rerunfailures (==10.3)", "scikit-learn (>0.22.1)", "tensorboard (>=2.9.1)", "uvicorn (<0.19.1)"]
+
+[[package]]
+name = "pytz"
+version = "2023.3.post1"
+description = "World timezone definitions, modern and historical"
+optional = false
+python-versions = "*"
+files = [
+ {file = "pytz-2023.3.post1-py2.py3-none-any.whl", hash = "sha256:ce42d816b81b68506614c11e8937d3aa9e41007ceb50bfdcb0749b921bf646c7"},
+ {file = "pytz-2023.3.post1.tar.gz", hash = "sha256:7b4fddbeb94a1eba4b557da24f19fdf9db575192544270a9101d8509f9f43d7b"},
+]
+
+[[package]]
+name = "pywin32"
+version = "306"
+description = "Python for Window Extensions"
+optional = false
+python-versions = "*"
+files = [
+ {file = "pywin32-306-cp310-cp310-win32.whl", hash = "sha256:06d3420a5155ba65f0b72f2699b5bacf3109f36acbe8923765c22938a69dfc8d"},
+ {file = "pywin32-306-cp310-cp310-win_amd64.whl", hash = "sha256:84f4471dbca1887ea3803d8848a1616429ac94a4a8d05f4bc9c5dcfd42ca99c8"},
+ {file = "pywin32-306-cp311-cp311-win32.whl", hash = "sha256:e65028133d15b64d2ed8f06dd9fbc268352478d4f9289e69c190ecd6818b6407"},
+ {file = "pywin32-306-cp311-cp311-win_amd64.whl", hash = "sha256:a7639f51c184c0272e93f244eb24dafca9b1855707d94c192d4a0b4c01e1100e"},
+ {file = "pywin32-306-cp311-cp311-win_arm64.whl", hash = "sha256:70dba0c913d19f942a2db25217d9a1b726c278f483a919f1abfed79c9cf64d3a"},
+ {file = "pywin32-306-cp312-cp312-win32.whl", hash = "sha256:383229d515657f4e3ed1343da8be101000562bf514591ff383ae940cad65458b"},
+ {file = "pywin32-306-cp312-cp312-win_amd64.whl", hash = "sha256:37257794c1ad39ee9be652da0462dc2e394c8159dfd913a8a4e8eb6fd346da0e"},
+ {file = "pywin32-306-cp312-cp312-win_arm64.whl", hash = "sha256:5821ec52f6d321aa59e2db7e0a35b997de60c201943557d108af9d4ae1ec7040"},
+ {file = "pywin32-306-cp37-cp37m-win32.whl", hash = "sha256:1c73ea9a0d2283d889001998059f5eaaba3b6238f767c9cf2833b13e6a685f65"},
+ {file = "pywin32-306-cp37-cp37m-win_amd64.whl", hash = "sha256:72c5f621542d7bdd4fdb716227be0dd3f8565c11b280be6315b06ace35487d36"},
+ {file = "pywin32-306-cp38-cp38-win32.whl", hash = "sha256:e4c092e2589b5cf0d365849e73e02c391c1349958c5ac3e9d5ccb9a28e017b3a"},
+ {file = "pywin32-306-cp38-cp38-win_amd64.whl", hash = "sha256:e8ac1ae3601bee6ca9f7cb4b5363bf1c0badb935ef243c4733ff9a393b1690c0"},
+ {file = "pywin32-306-cp39-cp39-win32.whl", hash = "sha256:e25fd5b485b55ac9c057f67d94bc203f3f6595078d1fb3b458c9c28b7153a802"},
+ {file = "pywin32-306-cp39-cp39-win_amd64.whl", hash = "sha256:39b61c15272833b5c329a2989999dcae836b1eed650252ab1b7bfbe1d59f30f4"},
+]
+
+[[package]]
+name = "pywinpty"
+version = "2.0.12"
+description = "Pseudo terminal support for Windows from Python."
+optional = false
+python-versions = ">=3.8"
+files = [
+ {file = "pywinpty-2.0.12-cp310-none-win_amd64.whl", hash = "sha256:21319cd1d7c8844fb2c970fb3a55a3db5543f112ff9cfcd623746b9c47501575"},
+ {file = "pywinpty-2.0.12-cp311-none-win_amd64.whl", hash = "sha256:853985a8f48f4731a716653170cd735da36ffbdc79dcb4c7b7140bce11d8c722"},
+ {file = "pywinpty-2.0.12-cp312-none-win_amd64.whl", hash = "sha256:1617b729999eb6713590e17665052b1a6ae0ad76ee31e60b444147c5b6a35dca"},
+ {file = "pywinpty-2.0.12-cp38-none-win_amd64.whl", hash = "sha256:189380469ca143d06e19e19ff3fba0fcefe8b4a8cc942140a6b863aed7eebb2d"},
+ {file = "pywinpty-2.0.12-cp39-none-win_amd64.whl", hash = "sha256:7520575b6546db23e693cbd865db2764097bd6d4ef5dc18c92555904cd62c3d4"},
+ {file = "pywinpty-2.0.12.tar.gz", hash = "sha256:8197de460ae8ebb7f5d1701dfa1b5df45b157bb832e92acba316305e18ca00dd"},
+]
+
+[[package]]
+name = "pyyaml"
+version = "6.0.1"
+description = "YAML parser and emitter for Python"
+optional = false
+python-versions = ">=3.6"
+files = [
+ {file = "PyYAML-6.0.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:d858aa552c999bc8a8d57426ed01e40bef403cd8ccdd0fc5f6f04a00414cac2a"},
+ {file = "PyYAML-6.0.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:fd66fc5d0da6d9815ba2cebeb4205f95818ff4b79c3ebe268e75d961704af52f"},
+ {file = "PyYAML-6.0.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:69b023b2b4daa7548bcfbd4aa3da05b3a74b772db9e23b982788168117739938"},
+ {file = "PyYAML-6.0.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:81e0b275a9ecc9c0c0c07b4b90ba548307583c125f54d5b6946cfee6360c733d"},
+ {file = "PyYAML-6.0.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ba336e390cd8e4d1739f42dfe9bb83a3cc2e80f567d8805e11b46f4a943f5515"},
+ {file = "PyYAML-6.0.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:326c013efe8048858a6d312ddd31d56e468118ad4cdeda36c719bf5bb6192290"},
+ {file = "PyYAML-6.0.1-cp310-cp310-win32.whl", hash = "sha256:bd4af7373a854424dabd882decdc5579653d7868b8fb26dc7d0e99f823aa5924"},
+ {file = "PyYAML-6.0.1-cp310-cp310-win_amd64.whl", hash = "sha256:fd1592b3fdf65fff2ad0004b5e363300ef59ced41c2e6b3a99d4089fa8c5435d"},
+ {file = "PyYAML-6.0.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:6965a7bc3cf88e5a1c3bd2e0b5c22f8d677dc88a455344035f03399034eb3007"},
+ {file = "PyYAML-6.0.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:f003ed9ad21d6a4713f0a9b5a7a0a79e08dd0f221aff4525a2be4c346ee60aab"},
+ {file = "PyYAML-6.0.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:42f8152b8dbc4fe7d96729ec2b99c7097d656dc1213a3229ca5383f973a5ed6d"},
+ {file = "PyYAML-6.0.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:062582fca9fabdd2c8b54a3ef1c978d786e0f6b3a1510e0ac93ef59e0ddae2bc"},
+ {file = "PyYAML-6.0.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d2b04aac4d386b172d5b9692e2d2da8de7bfb6c387fa4f801fbf6fb2e6ba4673"},
+ {file = "PyYAML-6.0.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:e7d73685e87afe9f3b36c799222440d6cf362062f78be1013661b00c5c6f678b"},
+ {file = "PyYAML-6.0.1-cp311-cp311-win32.whl", hash = "sha256:1635fd110e8d85d55237ab316b5b011de701ea0f29d07611174a1b42f1444741"},
+ {file = "PyYAML-6.0.1-cp311-cp311-win_amd64.whl", hash = "sha256:bf07ee2fef7014951eeb99f56f39c9bb4af143d8aa3c21b1677805985307da34"},
+ {file = "PyYAML-6.0.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:855fb52b0dc35af121542a76b9a84f8d1cd886ea97c84703eaa6d88e37a2ad28"},
+ {file = "PyYAML-6.0.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:40df9b996c2b73138957fe23a16a4f0ba614f4c0efce1e9406a184b6d07fa3a9"},
+ {file = "PyYAML-6.0.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6c22bec3fbe2524cde73d7ada88f6566758a8f7227bfbf93a408a9d86bcc12a0"},
+ {file = "PyYAML-6.0.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:8d4e9c88387b0f5c7d5f281e55304de64cf7f9c0021a3525bd3b1c542da3b0e4"},
+ {file = "PyYAML-6.0.1-cp312-cp312-win32.whl", hash = "sha256:d483d2cdf104e7c9fa60c544d92981f12ad66a457afae824d146093b8c294c54"},
+ {file = "PyYAML-6.0.1-cp312-cp312-win_amd64.whl", hash = "sha256:0d3304d8c0adc42be59c5f8a4d9e3d7379e6955ad754aa9d6ab7a398b59dd1df"},
+ {file = "PyYAML-6.0.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:50550eb667afee136e9a77d6dc71ae76a44df8b3e51e41b77f6de2932bfe0f47"},
+ {file = "PyYAML-6.0.1-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1fe35611261b29bd1de0070f0b2f47cb6ff71fa6595c077e42bd0c419fa27b98"},
+ {file = "PyYAML-6.0.1-cp36-cp36m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:704219a11b772aea0d8ecd7058d0082713c3562b4e271b849ad7dc4a5c90c13c"},
+ {file = "PyYAML-6.0.1-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:afd7e57eddb1a54f0f1a974bc4391af8bcce0b444685d936840f125cf046d5bd"},
+ {file = "PyYAML-6.0.1-cp36-cp36m-win32.whl", hash = "sha256:fca0e3a251908a499833aa292323f32437106001d436eca0e6e7833256674585"},
+ {file = "PyYAML-6.0.1-cp36-cp36m-win_amd64.whl", hash = "sha256:f22ac1c3cac4dbc50079e965eba2c1058622631e526bd9afd45fedd49ba781fa"},
+ {file = "PyYAML-6.0.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:b1275ad35a5d18c62a7220633c913e1b42d44b46ee12554e5fd39c70a243d6a3"},
+ {file = "PyYAML-6.0.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:18aeb1bf9a78867dc38b259769503436b7c72f7a1f1f4c93ff9a17de54319b27"},
+ {file = "PyYAML-6.0.1-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:596106435fa6ad000c2991a98fa58eeb8656ef2325d7e158344fb33864ed87e3"},
+ {file = "PyYAML-6.0.1-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:baa90d3f661d43131ca170712d903e6295d1f7a0f595074f151c0aed377c9b9c"},
+ {file = "PyYAML-6.0.1-cp37-cp37m-win32.whl", hash = "sha256:9046c58c4395dff28dd494285c82ba00b546adfc7ef001486fbf0324bc174fba"},
+ {file = "PyYAML-6.0.1-cp37-cp37m-win_amd64.whl", hash = "sha256:4fb147e7a67ef577a588a0e2c17b6db51dda102c71de36f8549b6816a96e1867"},
+ {file = "PyYAML-6.0.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:1d4c7e777c441b20e32f52bd377e0c409713e8bb1386e1099c2415f26e479595"},
+ {file = "PyYAML-6.0.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a0cd17c15d3bb3fa06978b4e8958dcdc6e0174ccea823003a106c7d4d7899ac5"},
+ {file = "PyYAML-6.0.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:28c119d996beec18c05208a8bd78cbe4007878c6dd15091efb73a30e90539696"},
+ {file = "PyYAML-6.0.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7e07cbde391ba96ab58e532ff4803f79c4129397514e1413a7dc761ccd755735"},
+ {file = "PyYAML-6.0.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:49a183be227561de579b4a36efbb21b3eab9651dd81b1858589f796549873dd6"},
+ {file = "PyYAML-6.0.1-cp38-cp38-win32.whl", hash = "sha256:184c5108a2aca3c5b3d3bf9395d50893a7ab82a38004c8f61c258d4428e80206"},
+ {file = "PyYAML-6.0.1-cp38-cp38-win_amd64.whl", hash = "sha256:1e2722cc9fbb45d9b87631ac70924c11d3a401b2d7f410cc0e3bbf249f2dca62"},
+ {file = "PyYAML-6.0.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:9eb6caa9a297fc2c2fb8862bc5370d0303ddba53ba97e71f08023b6cd73d16a8"},
+ {file = "PyYAML-6.0.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:c8098ddcc2a85b61647b2590f825f3db38891662cfc2fc776415143f599bb859"},
+ {file = "PyYAML-6.0.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5773183b6446b2c99bb77e77595dd486303b4faab2b086e7b17bc6bef28865f6"},
+ {file = "PyYAML-6.0.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b786eecbdf8499b9ca1d697215862083bd6d2a99965554781d0d8d1ad31e13a0"},
+ {file = "PyYAML-6.0.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bc1bf2925a1ecd43da378f4db9e4f799775d6367bdb94671027b73b393a7c42c"},
+ {file = "PyYAML-6.0.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:04ac92ad1925b2cff1db0cfebffb6ffc43457495c9b3c39d3fcae417d7125dc5"},
+ {file = "PyYAML-6.0.1-cp39-cp39-win32.whl", hash = "sha256:faca3bdcf85b2fc05d06ff3fbc1f83e1391b3e724afa3feba7d13eeab355484c"},
+ {file = "PyYAML-6.0.1-cp39-cp39-win_amd64.whl", hash = "sha256:510c9deebc5c0225e8c96813043e62b680ba2f9c50a08d3724c7f28a747d1486"},
+ {file = "PyYAML-6.0.1.tar.gz", hash = "sha256:bfdf460b1736c775f2ba9f6a92bca30bc2095067b8a9d77876d1fad6cc3b4a43"},
+]
+
+[[package]]
+name = "pyzmq"
+version = "25.1.1"
+description = "Python bindings for 0MQ"
+optional = false
+python-versions = ">=3.6"
+files = [
+ {file = "pyzmq-25.1.1-cp310-cp310-macosx_10_15_universal2.whl", hash = "sha256:381469297409c5adf9a0e884c5eb5186ed33137badcbbb0560b86e910a2f1e76"},
+ {file = "pyzmq-25.1.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:955215ed0604dac5b01907424dfa28b40f2b2292d6493445dd34d0dfa72586a8"},
+ {file = "pyzmq-25.1.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:985bbb1316192b98f32e25e7b9958088431d853ac63aca1d2c236f40afb17c83"},
+ {file = "pyzmq-25.1.1-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:afea96f64efa98df4da6958bae37f1cbea7932c35878b185e5982821bc883369"},
+ {file = "pyzmq-25.1.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:76705c9325d72a81155bb6ab48d4312e0032bf045fb0754889133200f7a0d849"},
+ {file = "pyzmq-25.1.1-cp310-cp310-manylinux_2_28_x86_64.whl", hash = "sha256:77a41c26205d2353a4c94d02be51d6cbdf63c06fbc1295ea57dad7e2d3381b71"},
+ {file = "pyzmq-25.1.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:12720a53e61c3b99d87262294e2b375c915fea93c31fc2336898c26d7aed34cd"},
+ {file = "pyzmq-25.1.1-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:57459b68e5cd85b0be8184382cefd91959cafe79ae019e6b1ae6e2ba8a12cda7"},
+ {file = "pyzmq-25.1.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:292fe3fc5ad4a75bc8df0dfaee7d0babe8b1f4ceb596437213821f761b4589f9"},
+ {file = "pyzmq-25.1.1-cp310-cp310-win32.whl", hash = "sha256:35b5ab8c28978fbbb86ea54958cd89f5176ce747c1fb3d87356cf698048a7790"},
+ {file = "pyzmq-25.1.1-cp310-cp310-win_amd64.whl", hash = "sha256:11baebdd5fc5b475d484195e49bae2dc64b94a5208f7c89954e9e354fc609d8f"},
+ {file = "pyzmq-25.1.1-cp311-cp311-macosx_10_15_universal2.whl", hash = "sha256:d20a0ddb3e989e8807d83225a27e5c2eb2260eaa851532086e9e0fa0d5287d83"},
+ {file = "pyzmq-25.1.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:e1c1be77bc5fb77d923850f82e55a928f8638f64a61f00ff18a67c7404faf008"},
+ {file = "pyzmq-25.1.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d89528b4943d27029a2818f847c10c2cecc79fa9590f3cb1860459a5be7933eb"},
+ {file = "pyzmq-25.1.1-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:90f26dc6d5f241ba358bef79be9ce06de58d477ca8485e3291675436d3827cf8"},
+ {file = "pyzmq-25.1.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c2b92812bd214018e50b6380ea3ac0c8bb01ac07fcc14c5f86a5bb25e74026e9"},
+ {file = "pyzmq-25.1.1-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:2f957ce63d13c28730f7fd6b72333814221c84ca2421298f66e5143f81c9f91f"},
+ {file = "pyzmq-25.1.1-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:047a640f5c9c6ade7b1cc6680a0e28c9dd5a0825135acbd3569cc96ea00b2505"},
+ {file = "pyzmq-25.1.1-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:7f7e58effd14b641c5e4dec8c7dab02fb67a13df90329e61c869b9cc607ef752"},
+ {file = "pyzmq-25.1.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:c2910967e6ab16bf6fbeb1f771c89a7050947221ae12a5b0b60f3bca2ee19bca"},
+ {file = "pyzmq-25.1.1-cp311-cp311-win32.whl", hash = "sha256:76c1c8efb3ca3a1818b837aea423ff8a07bbf7aafe9f2f6582b61a0458b1a329"},
+ {file = "pyzmq-25.1.1-cp311-cp311-win_amd64.whl", hash = "sha256:44e58a0554b21fc662f2712814a746635ed668d0fbc98b7cb9d74cb798d202e6"},
+ {file = "pyzmq-25.1.1-cp312-cp312-macosx_10_15_universal2.whl", hash = "sha256:e1ffa1c924e8c72778b9ccd386a7067cddf626884fd8277f503c48bb5f51c762"},
+ {file = "pyzmq-25.1.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:1af379b33ef33757224da93e9da62e6471cf4a66d10078cf32bae8127d3d0d4a"},
+ {file = "pyzmq-25.1.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cff084c6933680d1f8b2f3b4ff5bbb88538a4aac00d199ac13f49d0698727ecb"},
+ {file = "pyzmq-25.1.1-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e2400a94f7dd9cb20cd012951a0cbf8249e3d554c63a9c0cdfd5cbb6c01d2dec"},
+ {file = "pyzmq-25.1.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2d81f1ddae3858b8299d1da72dd7d19dd36aab654c19671aa8a7e7fb02f6638a"},
+ {file = "pyzmq-25.1.1-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:255ca2b219f9e5a3a9ef3081512e1358bd4760ce77828e1028b818ff5610b87b"},
+ {file = "pyzmq-25.1.1-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:a882ac0a351288dd18ecae3326b8a49d10c61a68b01419f3a0b9a306190baf69"},
+ {file = "pyzmq-25.1.1-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:724c292bb26365659fc434e9567b3f1adbdb5e8d640c936ed901f49e03e5d32e"},
+ {file = "pyzmq-25.1.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:4ca1ed0bb2d850aa8471387882247c68f1e62a4af0ce9c8a1dbe0d2bf69e41fb"},
+ {file = "pyzmq-25.1.1-cp312-cp312-win32.whl", hash = "sha256:b3451108ab861040754fa5208bca4a5496c65875710f76789a9ad27c801a0075"},
+ {file = "pyzmq-25.1.1-cp312-cp312-win_amd64.whl", hash = "sha256:eadbefd5e92ef8a345f0525b5cfd01cf4e4cc651a2cffb8f23c0dd184975d787"},
+ {file = "pyzmq-25.1.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:db0b2af416ba735c6304c47f75d348f498b92952f5e3e8bff449336d2728795d"},
+ {file = "pyzmq-25.1.1-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c7c133e93b405eb0d36fa430c94185bdd13c36204a8635470cccc200723c13bb"},
+ {file = "pyzmq-25.1.1-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:273bc3959bcbff3f48606b28229b4721716598d76b5aaea2b4a9d0ab454ec062"},
+ {file = "pyzmq-25.1.1-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:cbc8df5c6a88ba5ae385d8930da02201165408dde8d8322072e3e5ddd4f68e22"},
+ {file = "pyzmq-25.1.1-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:18d43df3f2302d836f2a56f17e5663e398416e9dd74b205b179065e61f1a6edf"},
+ {file = "pyzmq-25.1.1-cp36-cp36m-musllinux_1_1_i686.whl", hash = "sha256:73461eed88a88c866656e08f89299720a38cb4e9d34ae6bf5df6f71102570f2e"},
+ {file = "pyzmq-25.1.1-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:34c850ce7976d19ebe7b9d4b9bb8c9dfc7aac336c0958e2651b88cbd46682123"},
+ {file = "pyzmq-25.1.1-cp36-cp36m-win32.whl", hash = "sha256:d2045d6d9439a0078f2a34b57c7b18c4a6aef0bee37f22e4ec9f32456c852c71"},
+ {file = "pyzmq-25.1.1-cp36-cp36m-win_amd64.whl", hash = "sha256:458dea649f2f02a0b244ae6aef8dc29325a2810aa26b07af8374dc2a9faf57e3"},
+ {file = "pyzmq-25.1.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:7cff25c5b315e63b07a36f0c2bab32c58eafbe57d0dce61b614ef4c76058c115"},
+ {file = "pyzmq-25.1.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b1579413ae492b05de5a6174574f8c44c2b9b122a42015c5292afa4be2507f28"},
+ {file = "pyzmq-25.1.1-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:3d0a409d3b28607cc427aa5c30a6f1e4452cc44e311f843e05edb28ab5e36da0"},
+ {file = "pyzmq-25.1.1-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:21eb4e609a154a57c520e3d5bfa0d97e49b6872ea057b7c85257b11e78068222"},
+ {file = "pyzmq-25.1.1-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:034239843541ef7a1aee0c7b2cb7f6aafffb005ede965ae9cbd49d5ff4ff73cf"},
+ {file = "pyzmq-25.1.1-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:f8115e303280ba09f3898194791a153862cbf9eef722ad8f7f741987ee2a97c7"},
+ {file = "pyzmq-25.1.1-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:1a5d26fe8f32f137e784f768143728438877d69a586ddeaad898558dc971a5ae"},
+ {file = "pyzmq-25.1.1-cp37-cp37m-win32.whl", hash = "sha256:f32260e556a983bc5c7ed588d04c942c9a8f9c2e99213fec11a031e316874c7e"},
+ {file = "pyzmq-25.1.1-cp37-cp37m-win_amd64.whl", hash = "sha256:abf34e43c531bbb510ae7e8f5b2b1f2a8ab93219510e2b287a944432fad135f3"},
+ {file = "pyzmq-25.1.1-cp38-cp38-macosx_10_15_universal2.whl", hash = "sha256:87e34f31ca8f168c56d6fbf99692cc8d3b445abb5bfd08c229ae992d7547a92a"},
+ {file = "pyzmq-25.1.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:c9c6c9b2c2f80747a98f34ef491c4d7b1a8d4853937bb1492774992a120f475d"},
+ {file = "pyzmq-25.1.1-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:5619f3f5a4db5dbb572b095ea3cb5cc035335159d9da950830c9c4db2fbb6995"},
+ {file = "pyzmq-25.1.1-cp38-cp38-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:5a34d2395073ef862b4032343cf0c32a712f3ab49d7ec4f42c9661e0294d106f"},
+ {file = "pyzmq-25.1.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:25f0e6b78220aba09815cd1f3a32b9c7cb3e02cb846d1cfc526b6595f6046618"},
+ {file = "pyzmq-25.1.1-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:3669cf8ee3520c2f13b2e0351c41fea919852b220988d2049249db10046a7afb"},
+ {file = "pyzmq-25.1.1-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:2d163a18819277e49911f7461567bda923461c50b19d169a062536fffe7cd9d2"},
+ {file = "pyzmq-25.1.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:df27ffddff4190667d40de7beba4a950b5ce78fe28a7dcc41d6f8a700a80a3c0"},
+ {file = "pyzmq-25.1.1-cp38-cp38-win32.whl", hash = "sha256:a382372898a07479bd34bda781008e4a954ed8750f17891e794521c3e21c2e1c"},
+ {file = "pyzmq-25.1.1-cp38-cp38-win_amd64.whl", hash = "sha256:52533489f28d62eb1258a965f2aba28a82aa747202c8fa5a1c7a43b5db0e85c1"},
+ {file = "pyzmq-25.1.1-cp39-cp39-macosx_10_15_universal2.whl", hash = "sha256:03b3f49b57264909aacd0741892f2aecf2f51fb053e7d8ac6767f6c700832f45"},
+ {file = "pyzmq-25.1.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:330f9e188d0d89080cde66dc7470f57d1926ff2fb5576227f14d5be7ab30b9fa"},
+ {file = "pyzmq-25.1.1-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:2ca57a5be0389f2a65e6d3bb2962a971688cbdd30b4c0bd188c99e39c234f414"},
+ {file = "pyzmq-25.1.1-cp39-cp39-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:d457aed310f2670f59cc5b57dcfced452aeeed77f9da2b9763616bd57e4dbaae"},
+ {file = "pyzmq-25.1.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c56d748ea50215abef7030c72b60dd723ed5b5c7e65e7bc2504e77843631c1a6"},
+ {file = "pyzmq-25.1.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:8f03d3f0d01cb5a018debeb412441996a517b11c5c17ab2001aa0597c6d6882c"},
+ {file = "pyzmq-25.1.1-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:820c4a08195a681252f46926de10e29b6bbf3e17b30037bd4250d72dd3ddaab8"},
+ {file = "pyzmq-25.1.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:17ef5f01d25b67ca8f98120d5fa1d21efe9611604e8eb03a5147360f517dd1e2"},
+ {file = "pyzmq-25.1.1-cp39-cp39-win32.whl", hash = "sha256:04ccbed567171579ec2cebb9c8a3e30801723c575601f9a990ab25bcac6b51e2"},
+ {file = "pyzmq-25.1.1-cp39-cp39-win_amd64.whl", hash = "sha256:e61f091c3ba0c3578411ef505992d356a812fb200643eab27f4f70eed34a29ef"},
+ {file = "pyzmq-25.1.1-pp310-pypy310_pp73-macosx_10_9_x86_64.whl", hash = "sha256:ade6d25bb29c4555d718ac6d1443a7386595528c33d6b133b258f65f963bb0f6"},
+ {file = "pyzmq-25.1.1-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e0c95ddd4f6e9fca4e9e3afaa4f9df8552f0ba5d1004e89ef0a68e1f1f9807c7"},
+ {file = "pyzmq-25.1.1-pp310-pypy310_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:48e466162a24daf86f6b5ca72444d2bf39a5e58da5f96370078be67c67adc978"},
+ {file = "pyzmq-25.1.1-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:abc719161780932c4e11aaebb203be3d6acc6b38d2f26c0f523b5b59d2fc1996"},
+ {file = "pyzmq-25.1.1-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:1ccf825981640b8c34ae54231b7ed00271822ea1c6d8ba1090ebd4943759abf5"},
+ {file = "pyzmq-25.1.1-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:c2f20ce161ebdb0091a10c9ca0372e023ce24980d0e1f810f519da6f79c60800"},
+ {file = "pyzmq-25.1.1-pp37-pypy37_pp73-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:deee9ca4727f53464daf089536e68b13e6104e84a37820a88b0a057b97bba2d2"},
+ {file = "pyzmq-25.1.1-pp37-pypy37_pp73-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:aa8d6cdc8b8aa19ceb319aaa2b660cdaccc533ec477eeb1309e2a291eaacc43a"},
+ {file = "pyzmq-25.1.1-pp37-pypy37_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:019e59ef5c5256a2c7378f2fb8560fc2a9ff1d315755204295b2eab96b254d0a"},
+ {file = "pyzmq-25.1.1-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:b9af3757495c1ee3b5c4e945c1df7be95562277c6e5bccc20a39aec50f826cd0"},
+ {file = "pyzmq-25.1.1-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:548d6482dc8aadbe7e79d1b5806585c8120bafa1ef841167bc9090522b610fa6"},
+ {file = "pyzmq-25.1.1-pp38-pypy38_pp73-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:057e824b2aae50accc0f9a0570998adc021b372478a921506fddd6c02e60308e"},
+ {file = "pyzmq-25.1.1-pp38-pypy38_pp73-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:2243700cc5548cff20963f0ca92d3e5e436394375ab8a354bbea2b12911b20b0"},
+ {file = "pyzmq-25.1.1-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:79986f3b4af059777111409ee517da24a529bdbd46da578b33f25580adcff728"},
+ {file = "pyzmq-25.1.1-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:11d58723d44d6ed4dd677c5615b2ffb19d5c426636345567d6af82be4dff8a55"},
+ {file = "pyzmq-25.1.1-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:49d238cf4b69652257db66d0c623cd3e09b5d2e9576b56bc067a396133a00d4a"},
+ {file = "pyzmq-25.1.1-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fedbdc753827cf014c01dbbee9c3be17e5a208dcd1bf8641ce2cd29580d1f0d4"},
+ {file = "pyzmq-25.1.1-pp39-pypy39_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:bc16ac425cc927d0a57d242589f87ee093884ea4804c05a13834d07c20db203c"},
+ {file = "pyzmq-25.1.1-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:11c1d2aed9079c6b0c9550a7257a836b4a637feb334904610f06d70eb44c56d2"},
+ {file = "pyzmq-25.1.1-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:e8a701123029cc240cea61dd2d16ad57cab4691804143ce80ecd9286b464d180"},
+ {file = "pyzmq-25.1.1-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:61706a6b6c24bdece85ff177fec393545a3191eeda35b07aaa1458a027ad1304"},
+ {file = "pyzmq-25.1.1.tar.gz", hash = "sha256:259c22485b71abacdfa8bf79720cd7bcf4b9d128b30ea554f01ae71fdbfdaa23"},
+]
+
+[package.dependencies]
+cffi = {version = "*", markers = "implementation_name == \"pypy\""}
+
+[[package]]
+name = "qtconsole"
+version = "5.5.1"
+description = "Jupyter Qt console"
+optional = false
+python-versions = ">= 3.8"
+files = [
+ {file = "qtconsole-5.5.1-py3-none-any.whl", hash = "sha256:8c75fa3e9b4ed884880ff7cea90a1b67451219279ec33deaee1d59e3df1a5d2b"},
+ {file = "qtconsole-5.5.1.tar.gz", hash = "sha256:a0e806c6951db9490628e4df80caec9669b65149c7ba40f9bf033c025a5b56bc"},
+]
+
+[package.dependencies]
+ipykernel = ">=4.1"
+jupyter-client = ">=4.1"
+jupyter-core = "*"
+packaging = "*"
+pygments = "*"
+pyzmq = ">=17.1"
+qtpy = ">=2.4.0"
+traitlets = "<5.2.1 || >5.2.1,<5.2.2 || >5.2.2"
+
+[package.extras]
+doc = ["Sphinx (>=1.3)"]
+test = ["flaky", "pytest", "pytest-qt"]
+
+[[package]]
+name = "qtpy"
+version = "2.4.1"
+description = "Provides an abstraction layer on top of the various Qt bindings (PyQt5/6 and PySide2/6)."
+optional = false
+python-versions = ">=3.7"
+files = [
+ {file = "QtPy-2.4.1-py3-none-any.whl", hash = "sha256:1c1d8c4fa2c884ae742b069151b0abe15b3f70491f3972698c683b8e38de839b"},
+ {file = "QtPy-2.4.1.tar.gz", hash = "sha256:a5a15ffd519550a1361bdc56ffc07fda56a6af7292f17c7b395d4083af632987"},
+]
+
+[package.dependencies]
+packaging = "*"
+
+[package.extras]
+test = ["pytest (>=6,!=7.0.0,!=7.0.1)", "pytest-cov (>=3.0.0)", "pytest-qt"]
+
+[[package]]
+name = "referencing"
+version = "0.31.1"
+description = "JSON Referencing + Python"
+optional = false
+python-versions = ">=3.8"
+files = [
+ {file = "referencing-0.31.1-py3-none-any.whl", hash = "sha256:c19c4d006f1757e3dd75c4f784d38f8698d87b649c54f9ace14e5e8c9667c01d"},
+ {file = "referencing-0.31.1.tar.gz", hash = "sha256:81a1471c68c9d5e3831c30ad1dd9815c45b558e596653db751a2bfdd17b3b9ec"},
+]
+
+[package.dependencies]
+attrs = ">=22.2.0"
+rpds-py = ">=0.7.0"
+
+[[package]]
+name = "regex"
+version = "2023.10.3"
+description = "Alternative regular expression module, to replace re."
+optional = false
+python-versions = ">=3.7"
+files = [
+ {file = "regex-2023.10.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:4c34d4f73ea738223a094d8e0ffd6d2c1a1b4c175da34d6b0de3d8d69bee6bcc"},
+ {file = "regex-2023.10.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:a8f4e49fc3ce020f65411432183e6775f24e02dff617281094ba6ab079ef0915"},
+ {file = "regex-2023.10.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4cd1bccf99d3ef1ab6ba835308ad85be040e6a11b0977ef7ea8c8005f01a3c29"},
+ {file = "regex-2023.10.3-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:81dce2ddc9f6e8f543d94b05d56e70d03a0774d32f6cca53e978dc01e4fc75b8"},
+ {file = "regex-2023.10.3-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9c6b4d23c04831e3ab61717a707a5d763b300213db49ca680edf8bf13ab5d91b"},
+ {file = "regex-2023.10.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c15ad0aee158a15e17e0495e1e18741573d04eb6da06d8b84af726cfc1ed02ee"},
+ {file = "regex-2023.10.3-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6239d4e2e0b52c8bd38c51b760cd870069f0bdf99700a62cd509d7a031749a55"},
+ {file = "regex-2023.10.3-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:4a8bf76e3182797c6b1afa5b822d1d5802ff30284abe4599e1247be4fd6b03be"},
+ {file = "regex-2023.10.3-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:d9c727bbcf0065cbb20f39d2b4f932f8fa1631c3e01fcedc979bd4f51fe051c5"},
+ {file = "regex-2023.10.3-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:3ccf2716add72f80714b9a63899b67fa711b654be3fcdd34fa391d2d274ce767"},
+ {file = "regex-2023.10.3-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:107ac60d1bfdc3edb53be75e2a52aff7481b92817cfdddd9b4519ccf0e54a6ff"},
+ {file = "regex-2023.10.3-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:00ba3c9818e33f1fa974693fb55d24cdc8ebafcb2e4207680669d8f8d7cca79a"},
+ {file = "regex-2023.10.3-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:f0a47efb1dbef13af9c9a54a94a0b814902e547b7f21acb29434504d18f36e3a"},
+ {file = "regex-2023.10.3-cp310-cp310-win32.whl", hash = "sha256:36362386b813fa6c9146da6149a001b7bd063dabc4d49522a1f7aa65b725c7ec"},
+ {file = "regex-2023.10.3-cp310-cp310-win_amd64.whl", hash = "sha256:c65a3b5330b54103e7d21cac3f6bf3900d46f6d50138d73343d9e5b2900b2353"},
+ {file = "regex-2023.10.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:90a79bce019c442604662d17bf69df99090e24cdc6ad95b18b6725c2988a490e"},
+ {file = "regex-2023.10.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:c7964c2183c3e6cce3f497e3a9f49d182e969f2dc3aeeadfa18945ff7bdd7051"},
+ {file = "regex-2023.10.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4ef80829117a8061f974b2fda8ec799717242353bff55f8a29411794d635d964"},
+ {file = "regex-2023.10.3-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5addc9d0209a9afca5fc070f93b726bf7003bd63a427f65ef797a931782e7edc"},
+ {file = "regex-2023.10.3-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c148bec483cc4b421562b4bcedb8e28a3b84fcc8f0aa4418e10898f3c2c0eb9b"},
+ {file = "regex-2023.10.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8d1f21af4c1539051049796a0f50aa342f9a27cde57318f2fc41ed50b0dbc4ac"},
+ {file = "regex-2023.10.3-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0b9ac09853b2a3e0d0082104036579809679e7715671cfbf89d83c1cb2a30f58"},
+ {file = "regex-2023.10.3-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:ebedc192abbc7fd13c5ee800e83a6df252bec691eb2c4bedc9f8b2e2903f5e2a"},
+ {file = "regex-2023.10.3-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:d8a993c0a0ffd5f2d3bda23d0cd75e7086736f8f8268de8a82fbc4bd0ac6791e"},
+ {file = "regex-2023.10.3-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:be6b7b8d42d3090b6c80793524fa66c57ad7ee3fe9722b258aec6d0672543fd0"},
+ {file = "regex-2023.10.3-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:4023e2efc35a30e66e938de5aef42b520c20e7eda7bb5fb12c35e5d09a4c43f6"},
+ {file = "regex-2023.10.3-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:0d47840dc05e0ba04fe2e26f15126de7c755496d5a8aae4a08bda4dd8d646c54"},
+ {file = "regex-2023.10.3-cp311-cp311-win32.whl", hash = "sha256:9145f092b5d1977ec8c0ab46e7b3381b2fd069957b9862a43bd383e5c01d18c2"},
+ {file = "regex-2023.10.3-cp311-cp311-win_amd64.whl", hash = "sha256:b6104f9a46bd8743e4f738afef69b153c4b8b592d35ae46db07fc28ae3d5fb7c"},
+ {file = "regex-2023.10.3-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:bff507ae210371d4b1fe316d03433ac099f184d570a1a611e541923f78f05037"},
+ {file = "regex-2023.10.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:be5e22bbb67924dea15039c3282fa4cc6cdfbe0cbbd1c0515f9223186fc2ec5f"},
+ {file = "regex-2023.10.3-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4a992f702c9be9c72fa46f01ca6e18d131906a7180950958f766c2aa294d4b41"},
+ {file = "regex-2023.10.3-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:7434a61b158be563c1362d9071358f8ab91b8d928728cd2882af060481244c9e"},
+ {file = "regex-2023.10.3-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c2169b2dcabf4e608416f7f9468737583ce5f0a6e8677c4efbf795ce81109d7c"},
+ {file = "regex-2023.10.3-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a9e908ef5889cda4de038892b9accc36d33d72fb3e12c747e2799a0e806ec841"},
+ {file = "regex-2023.10.3-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:12bd4bc2c632742c7ce20db48e0d99afdc05e03f0b4c1af90542e05b809a03d9"},
+ {file = "regex-2023.10.3-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:bc72c231f5449d86d6c7d9cc7cd819b6eb30134bb770b8cfdc0765e48ef9c420"},
+ {file = "regex-2023.10.3-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:bce8814b076f0ce5766dc87d5a056b0e9437b8e0cd351b9a6c4e1134a7dfbda9"},
+ {file = "regex-2023.10.3-cp312-cp312-musllinux_1_1_ppc64le.whl", hash = "sha256:ba7cd6dc4d585ea544c1412019921570ebd8a597fabf475acc4528210d7c4a6f"},
+ {file = "regex-2023.10.3-cp312-cp312-musllinux_1_1_s390x.whl", hash = "sha256:b0c7d2f698e83f15228ba41c135501cfe7d5740181d5903e250e47f617eb4292"},
+ {file = "regex-2023.10.3-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:5a8f91c64f390ecee09ff793319f30a0f32492e99f5dc1c72bc361f23ccd0a9a"},
+ {file = "regex-2023.10.3-cp312-cp312-win32.whl", hash = "sha256:ad08a69728ff3c79866d729b095872afe1e0557251da4abb2c5faff15a91d19a"},
+ {file = "regex-2023.10.3-cp312-cp312-win_amd64.whl", hash = "sha256:39cdf8d141d6d44e8d5a12a8569d5a227f645c87df4f92179bd06e2e2705e76b"},
+ {file = "regex-2023.10.3-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:4a3ee019a9befe84fa3e917a2dd378807e423d013377a884c1970a3c2792d293"},
+ {file = "regex-2023.10.3-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:76066d7ff61ba6bf3cb5efe2428fc82aac91802844c022d849a1f0f53820502d"},
+ {file = "regex-2023.10.3-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:bfe50b61bab1b1ec260fa7cd91106fa9fece57e6beba05630afe27c71259c59b"},
+ {file = "regex-2023.10.3-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9fd88f373cb71e6b59b7fa597e47e518282455c2734fd4306a05ca219a1991b0"},
+ {file = "regex-2023.10.3-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b3ab05a182c7937fb374f7e946f04fb23a0c0699c0450e9fb02ef567412d2fa3"},
+ {file = "regex-2023.10.3-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:dac37cf08fcf2094159922edc7a2784cfcc5c70f8354469f79ed085f0328ebdf"},
+ {file = "regex-2023.10.3-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:e54ddd0bb8fb626aa1f9ba7b36629564544954fff9669b15da3610c22b9a0991"},
+ {file = "regex-2023.10.3-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:3367007ad1951fde612bf65b0dffc8fd681a4ab98ac86957d16491400d661302"},
+ {file = "regex-2023.10.3-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:16f8740eb6dbacc7113e3097b0a36065a02e37b47c936b551805d40340fb9971"},
+ {file = "regex-2023.10.3-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:f4f2ca6df64cbdd27f27b34f35adb640b5d2d77264228554e68deda54456eb11"},
+ {file = "regex-2023.10.3-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:39807cbcbe406efca2a233884e169d056c35aa7e9f343d4e78665246a332f597"},
+ {file = "regex-2023.10.3-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:7eece6fbd3eae4a92d7c748ae825cbc1ee41a89bb1c3db05b5578ed3cfcfd7cb"},
+ {file = "regex-2023.10.3-cp37-cp37m-win32.whl", hash = "sha256:ce615c92d90df8373d9e13acddd154152645c0dc060871abf6bd43809673d20a"},
+ {file = "regex-2023.10.3-cp37-cp37m-win_amd64.whl", hash = "sha256:0f649fa32fe734c4abdfd4edbb8381c74abf5f34bc0b3271ce687b23729299ed"},
+ {file = "regex-2023.10.3-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:9b98b7681a9437262947f41c7fac567c7e1f6eddd94b0483596d320092004533"},
+ {file = "regex-2023.10.3-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:91dc1d531f80c862441d7b66c4505cd6ea9d312f01fb2f4654f40c6fdf5cc37a"},
+ {file = "regex-2023.10.3-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:82fcc1f1cc3ff1ab8a57ba619b149b907072e750815c5ba63e7aa2e1163384a4"},
+ {file = "regex-2023.10.3-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:7979b834ec7a33aafae34a90aad9f914c41fd6eaa8474e66953f3f6f7cbd4368"},
+ {file = "regex-2023.10.3-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:ef71561f82a89af6cfcbee47f0fabfdb6e63788a9258e913955d89fdd96902ab"},
+ {file = "regex-2023.10.3-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dd829712de97753367153ed84f2de752b86cd1f7a88b55a3a775eb52eafe8a94"},
+ {file = "regex-2023.10.3-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:00e871d83a45eee2f8688d7e6849609c2ca2a04a6d48fba3dff4deef35d14f07"},
+ {file = "regex-2023.10.3-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:706e7b739fdd17cb89e1fbf712d9dc21311fc2333f6d435eac2d4ee81985098c"},
+ {file = "regex-2023.10.3-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:cc3f1c053b73f20c7ad88b0d1d23be7e7b3901229ce89f5000a8399746a6e039"},
+ {file = "regex-2023.10.3-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:6f85739e80d13644b981a88f529d79c5bdf646b460ba190bffcaf6d57b2a9863"},
+ {file = "regex-2023.10.3-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:741ba2f511cc9626b7561a440f87d658aabb3d6b744a86a3c025f866b4d19e7f"},
+ {file = "regex-2023.10.3-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:e77c90ab5997e85901da85131fd36acd0ed2221368199b65f0d11bca44549711"},
+ {file = "regex-2023.10.3-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:979c24cbefaf2420c4e377ecd1f165ea08cc3d1fbb44bdc51bccbbf7c66a2cb4"},
+ {file = "regex-2023.10.3-cp38-cp38-win32.whl", hash = "sha256:58837f9d221744d4c92d2cf7201c6acd19623b50c643b56992cbd2b745485d3d"},
+ {file = "regex-2023.10.3-cp38-cp38-win_amd64.whl", hash = "sha256:c55853684fe08d4897c37dfc5faeff70607a5f1806c8be148f1695be4a63414b"},
+ {file = "regex-2023.10.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:2c54e23836650bdf2c18222c87f6f840d4943944146ca479858404fedeb9f9af"},
+ {file = "regex-2023.10.3-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:69c0771ca5653c7d4b65203cbfc5e66db9375f1078689459fe196fe08b7b4930"},
+ {file = "regex-2023.10.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6ac965a998e1388e6ff2e9781f499ad1eaa41e962a40d11c7823c9952c77123e"},
+ {file = "regex-2023.10.3-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1c0e8fae5b27caa34177bdfa5a960c46ff2f78ee2d45c6db15ae3f64ecadde14"},
+ {file = "regex-2023.10.3-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:6c56c3d47da04f921b73ff9415fbaa939f684d47293f071aa9cbb13c94afc17d"},
+ {file = "regex-2023.10.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7ef1e014eed78ab650bef9a6a9cbe50b052c0aebe553fb2881e0453717573f52"},
+ {file = "regex-2023.10.3-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d29338556a59423d9ff7b6eb0cb89ead2b0875e08fe522f3e068b955c3e7b59b"},
+ {file = "regex-2023.10.3-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:9c6d0ced3c06d0f183b73d3c5920727268d2201aa0fe6d55c60d68c792ff3588"},
+ {file = "regex-2023.10.3-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:994645a46c6a740ee8ce8df7911d4aee458d9b1bc5639bc968226763d07f00fa"},
+ {file = "regex-2023.10.3-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:66e2fe786ef28da2b28e222c89502b2af984858091675044d93cb50e6f46d7af"},
+ {file = "regex-2023.10.3-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:11175910f62b2b8c055f2b089e0fedd694fe2be3941b3e2633653bc51064c528"},
+ {file = "regex-2023.10.3-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:06e9abc0e4c9ab4779c74ad99c3fc10d3967d03114449acc2c2762ad4472b8ca"},
+ {file = "regex-2023.10.3-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:fb02e4257376ae25c6dd95a5aec377f9b18c09be6ebdefa7ad209b9137b73d48"},
+ {file = "regex-2023.10.3-cp39-cp39-win32.whl", hash = "sha256:3b2c3502603fab52d7619b882c25a6850b766ebd1b18de3df23b2f939360e1bd"},
+ {file = "regex-2023.10.3-cp39-cp39-win_amd64.whl", hash = "sha256:adbccd17dcaff65704c856bd29951c58a1bd4b2b0f8ad6b826dbd543fe740988"},
+ {file = "regex-2023.10.3.tar.gz", hash = "sha256:3fef4f844d2290ee0ba57addcec17eec9e3df73f10a2748485dfd6a3a188cc0f"},
+]
+
+[[package]]
+name = "requests"
+version = "2.31.0"
+description = "Python HTTP for Humans."
+optional = false
+python-versions = ">=3.7"
+files = [
+ {file = "requests-2.31.0-py3-none-any.whl", hash = "sha256:58cd2187c01e70e6e26505bca751777aa9f2ee0b7f4300988b709f44e013003f"},
+ {file = "requests-2.31.0.tar.gz", hash = "sha256:942c5a758f98d790eaed1a29cb6eefc7ffb0d1cf7af05c3d2791656dbd6ad1e1"},
+]
+
+[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 = "restructuredtext-lint"
+version = "1.4.0"
+description = "reStructuredText linter"
+optional = false
+python-versions = "*"
+files = [
+ {file = "restructuredtext_lint-1.4.0.tar.gz", hash = "sha256:1b235c0c922341ab6c530390892eb9e92f90b9b75046063e047cacfb0f050c45"},
+]
+
+[package.dependencies]
+docutils = ">=0.11,<1.0"
+
+[[package]]
+name = "rfc3339-validator"
+version = "0.1.4"
+description = "A pure python RFC3339 validator"
+optional = false
+python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*"
+files = [
+ {file = "rfc3339_validator-0.1.4-py2.py3-none-any.whl", hash = "sha256:24f6ec1eda14ef823da9e36ec7113124b39c04d50a4d3d3a3c2859577e7791fa"},
+ {file = "rfc3339_validator-0.1.4.tar.gz", hash = "sha256:138a2abdf93304ad60530167e51d2dfb9549521a836871b88d7f4695d0022f6b"},
+]
+
+[package.dependencies]
+six = "*"
+
+[[package]]
+name = "rfc3986-validator"
+version = "0.1.1"
+description = "Pure python rfc3986 validator"
+optional = false
+python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*"
+files = [
+ {file = "rfc3986_validator-0.1.1-py2.py3-none-any.whl", hash = "sha256:2f235c432ef459970b4306369336b9d5dbdda31b510ca1e327636e01f528bfa9"},
+ {file = "rfc3986_validator-0.1.1.tar.gz", hash = "sha256:3d44bde7921b3b9ec3ae4e3adca370438eccebc676456449b145d533b240d055"},
+]
+
+[[package]]
+name = "rich"
+version = "13.7.0"
+description = "Render rich text, tables, progress bars, syntax highlighting, markdown and more to the terminal"
+optional = false
+python-versions = ">=3.7.0"
+files = [
+ {file = "rich-13.7.0-py3-none-any.whl", hash = "sha256:6da14c108c4866ee9520bbffa71f6fe3962e193b7da68720583850cd4548e235"},
+ {file = "rich-13.7.0.tar.gz", hash = "sha256:5cb5123b5cf9ee70584244246816e9114227e0b98ad9176eede6ad54bf5403fa"},
+]
+
+[package.dependencies]
+markdown-it-py = ">=2.2.0"
+pygments = ">=2.13.0,<3.0.0"
+
+[package.extras]
+jupyter = ["ipywidgets (>=7.5.1,<9)"]
+
+[[package]]
+name = "rpds-py"
+version = "0.13.2"
+description = "Python bindings to Rust's persistent data structures (rpds)"
+optional = false
+python-versions = ">=3.8"
+files = [
+ {file = "rpds_py-0.13.2-cp310-cp310-macosx_10_7_x86_64.whl", hash = "sha256:1ceebd0ae4f3e9b2b6b553b51971921853ae4eebf3f54086be0565d59291e53d"},
+ {file = "rpds_py-0.13.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:46e1ed994a0920f350a4547a38471217eb86f57377e9314fbaaa329b71b7dfe3"},
+ {file = "rpds_py-0.13.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ee353bb51f648924926ed05e0122b6a0b1ae709396a80eb583449d5d477fcdf7"},
+ {file = "rpds_py-0.13.2-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:530190eb0cd778363bbb7596612ded0bb9fef662daa98e9d92a0419ab27ae914"},
+ {file = "rpds_py-0.13.2-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:29d311e44dd16d2434d5506d57ef4d7036544fc3c25c14b6992ef41f541b10fb"},
+ {file = "rpds_py-0.13.2-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2e72f750048b32d39e87fc85c225c50b2a6715034848dbb196bf3348aa761fa1"},
+ {file = "rpds_py-0.13.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:db09b98c7540df69d4b47218da3fbd7cb466db0fb932e971c321f1c76f155266"},
+ {file = "rpds_py-0.13.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:2ac26f50736324beb0282c819668328d53fc38543fa61eeea2c32ea8ea6eab8d"},
+ {file = "rpds_py-0.13.2-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:12ecf89bd54734c3c2c79898ae2021dca42750c7bcfb67f8fb3315453738ac8f"},
+ {file = "rpds_py-0.13.2-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:3a44c8440183b43167fd1a0819e8356692bf5db1ad14ce140dbd40a1485f2dea"},
+ {file = "rpds_py-0.13.2-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:bcef4f2d3dc603150421de85c916da19471f24d838c3c62a4f04c1eb511642c1"},
+ {file = "rpds_py-0.13.2-cp310-none-win32.whl", hash = "sha256:ee6faebb265e28920a6f23a7d4c362414b3f4bb30607141d718b991669e49ddc"},
+ {file = "rpds_py-0.13.2-cp310-none-win_amd64.whl", hash = "sha256:ac96d67b37f28e4b6ecf507c3405f52a40658c0a806dffde624a8fcb0314d5fd"},
+ {file = "rpds_py-0.13.2-cp311-cp311-macosx_10_7_x86_64.whl", hash = "sha256:b5f6328e8e2ae8238fc767703ab7b95785521c42bb2b8790984e3477d7fa71ad"},
+ {file = "rpds_py-0.13.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:729408136ef8d45a28ee9a7411917c9e3459cf266c7e23c2f7d4bb8ef9e0da42"},
+ {file = "rpds_py-0.13.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:65cfed9c807c27dee76407e8bb29e6f4e391e436774bcc769a037ff25ad8646e"},
+ {file = "rpds_py-0.13.2-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:aefbdc934115d2f9278f153952003ac52cd2650e7313750390b334518c589568"},
+ {file = "rpds_py-0.13.2-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d48db29bd47814671afdd76c7652aefacc25cf96aad6daefa82d738ee87461e2"},
+ {file = "rpds_py-0.13.2-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3c55d7f2d817183d43220738270efd3ce4e7a7b7cbdaefa6d551ed3d6ed89190"},
+ {file = "rpds_py-0.13.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6aadae3042f8e6db3376d9e91f194c606c9a45273c170621d46128f35aef7cd0"},
+ {file = "rpds_py-0.13.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:5feae2f9aa7270e2c071f488fab256d768e88e01b958f123a690f1cc3061a09c"},
+ {file = "rpds_py-0.13.2-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:51967a67ea0d7b9b5cd86036878e2d82c0b6183616961c26d825b8c994d4f2c8"},
+ {file = "rpds_py-0.13.2-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:4d0c10d803549427f427085ed7aebc39832f6e818a011dcd8785e9c6a1ba9b3e"},
+ {file = "rpds_py-0.13.2-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:603d5868f7419081d616dab7ac3cfa285296735e7350f7b1e4f548f6f953ee7d"},
+ {file = "rpds_py-0.13.2-cp311-none-win32.whl", hash = "sha256:b8996ffb60c69f677245f5abdbcc623e9442bcc91ed81b6cd6187129ad1fa3e7"},
+ {file = "rpds_py-0.13.2-cp311-none-win_amd64.whl", hash = "sha256:5379e49d7e80dca9811b36894493d1c1ecb4c57de05c36f5d0dd09982af20211"},
+ {file = "rpds_py-0.13.2-cp312-cp312-macosx_10_7_x86_64.whl", hash = "sha256:8a776a29b77fe0cc28fedfd87277b0d0f7aa930174b7e504d764e0b43a05f381"},
+ {file = "rpds_py-0.13.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:2a1472956c5bcc49fb0252b965239bffe801acc9394f8b7c1014ae9258e4572b"},
+ {file = "rpds_py-0.13.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f252dfb4852a527987a9156cbcae3022a30f86c9d26f4f17b8c967d7580d65d2"},
+ {file = "rpds_py-0.13.2-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:f0d320e70b6b2300ff6029e234e79fe44e9dbbfc7b98597ba28e054bd6606a57"},
+ {file = "rpds_py-0.13.2-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ade2ccb937060c299ab0dfb2dea3d2ddf7e098ed63ee3d651ebfc2c8d1e8632a"},
+ {file = "rpds_py-0.13.2-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b9d121be0217787a7d59a5c6195b0842d3f701007333426e5154bf72346aa658"},
+ {file = "rpds_py-0.13.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8fa6bd071ec6d90f6e7baa66ae25820d57a8ab1b0a3c6d3edf1834d4b26fafa2"},
+ {file = "rpds_py-0.13.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:c918621ee0a3d1fe61c313f2489464f2ae3d13633e60f520a8002a5e910982ee"},
+ {file = "rpds_py-0.13.2-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:25b28b3d33ec0a78e944aaaed7e5e2a94ac811bcd68b557ca48a0c30f87497d2"},
+ {file = "rpds_py-0.13.2-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:31e220a040b89a01505128c2f8a59ee74732f666439a03e65ccbf3824cdddae7"},
+ {file = "rpds_py-0.13.2-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:15253fff410873ebf3cfba1cc686a37711efcd9b8cb30ea21bb14a973e393f60"},
+ {file = "rpds_py-0.13.2-cp312-none-win32.whl", hash = "sha256:b981a370f8f41c4024c170b42fbe9e691ae2dbc19d1d99151a69e2c84a0d194d"},
+ {file = "rpds_py-0.13.2-cp312-none-win_amd64.whl", hash = "sha256:4c4e314d36d4f31236a545696a480aa04ea170a0b021e9a59ab1ed94d4c3ef27"},
+ {file = "rpds_py-0.13.2-cp38-cp38-macosx_10_7_x86_64.whl", hash = "sha256:80e5acb81cb49fd9f2d5c08f8b74ffff14ee73b10ca88297ab4619e946bcb1e1"},
+ {file = "rpds_py-0.13.2-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:efe093acc43e869348f6f2224df7f452eab63a2c60a6c6cd6b50fd35c4e075ba"},
+ {file = "rpds_py-0.13.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8c2a61c0e4811012b0ba9f6cdcb4437865df5d29eab5d6018ba13cee1c3064a0"},
+ {file = "rpds_py-0.13.2-cp38-cp38-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:751758d9dd04d548ec679224cc00e3591f5ebf1ff159ed0d4aba6a0746352452"},
+ {file = "rpds_py-0.13.2-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:6ba8858933f0c1a979781272a5f65646fca8c18c93c99c6ddb5513ad96fa54b1"},
+ {file = "rpds_py-0.13.2-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:bfdfbe6a36bc3059fff845d64c42f2644cf875c65f5005db54f90cdfdf1df815"},
+ {file = "rpds_py-0.13.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:aa0379c1935c44053c98826bc99ac95f3a5355675a297ac9ce0dfad0ce2d50ca"},
+ {file = "rpds_py-0.13.2-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:d5593855b5b2b73dd8413c3fdfa5d95b99d657658f947ba2c4318591e745d083"},
+ {file = "rpds_py-0.13.2-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:2a7bef6977043673750a88da064fd513f89505111014b4e00fbdd13329cd4e9a"},
+ {file = "rpds_py-0.13.2-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:3ab96754d23372009638a402a1ed12a27711598dd49d8316a22597141962fe66"},
+ {file = "rpds_py-0.13.2-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:e06cfea0ece444571d24c18ed465bc93afb8c8d8d74422eb7026662f3d3f779b"},
+ {file = "rpds_py-0.13.2-cp38-none-win32.whl", hash = "sha256:5493569f861fb7b05af6d048d00d773c6162415ae521b7010197c98810a14cab"},
+ {file = "rpds_py-0.13.2-cp38-none-win_amd64.whl", hash = "sha256:b07501b720cf060c5856f7b5626e75b8e353b5f98b9b354a21eb4bfa47e421b1"},
+ {file = "rpds_py-0.13.2-cp39-cp39-macosx_10_7_x86_64.whl", hash = "sha256:881df98f0a8404d32b6de0fd33e91c1b90ed1516a80d4d6dc69d414b8850474c"},
+ {file = "rpds_py-0.13.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:d79c159adea0f1f4617f54aa156568ac69968f9ef4d1e5fefffc0a180830308e"},
+ {file = "rpds_py-0.13.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:38d4f822ee2f338febcc85aaa2547eb5ba31ba6ff68d10b8ec988929d23bb6b4"},
+ {file = "rpds_py-0.13.2-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:5d75d6d220d55cdced2f32cc22f599475dbe881229aeddba6c79c2e9df35a2b3"},
+ {file = "rpds_py-0.13.2-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5d97e9ae94fb96df1ee3cb09ca376c34e8a122f36927230f4c8a97f469994bff"},
+ {file = "rpds_py-0.13.2-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:67a429520e97621a763cf9b3ba27574779c4e96e49a27ff8a1aa99ee70beb28a"},
+ {file = "rpds_py-0.13.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:188435794405c7f0573311747c85a96b63c954a5f2111b1df8018979eca0f2f0"},
+ {file = "rpds_py-0.13.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:38f9bf2ad754b4a45b8210a6c732fe876b8a14e14d5992a8c4b7c1ef78740f53"},
+ {file = "rpds_py-0.13.2-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:a6ba2cb7d676e9415b9e9ac7e2aae401dc1b1e666943d1f7bc66223d3d73467b"},
+ {file = "rpds_py-0.13.2-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:eaffbd8814bb1b5dc3ea156a4c5928081ba50419f9175f4fc95269e040eff8f0"},
+ {file = "rpds_py-0.13.2-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:5a4c1058cdae6237d97af272b326e5f78ee7ee3bbffa6b24b09db4d828810468"},
+ {file = "rpds_py-0.13.2-cp39-none-win32.whl", hash = "sha256:b5267feb19070bef34b8dea27e2b504ebd9d31748e3ecacb3a4101da6fcb255c"},
+ {file = "rpds_py-0.13.2-cp39-none-win_amd64.whl", hash = "sha256:ddf23960cb42b69bce13045d5bc66f18c7d53774c66c13f24cf1b9c144ba3141"},
+ {file = "rpds_py-0.13.2-pp310-pypy310_pp73-macosx_10_7_x86_64.whl", hash = "sha256:97163a1ab265a1073a6372eca9f4eeb9f8c6327457a0b22ddfc4a17dcd613e74"},
+ {file = "rpds_py-0.13.2-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:25ea41635d22b2eb6326f58e608550e55d01df51b8a580ea7e75396bafbb28e9"},
+ {file = "rpds_py-0.13.2-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:76d59d4d451ba77f08cb4cd9268dec07be5bc65f73666302dbb5061989b17198"},
+ {file = "rpds_py-0.13.2-pp310-pypy310_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:e7c564c58cf8f248fe859a4f0fe501b050663f3d7fbc342172f259124fb59933"},
+ {file = "rpds_py-0.13.2-pp310-pypy310_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:61dbc1e01dc0c5875da2f7ae36d6e918dc1b8d2ce04e871793976594aad8a57a"},
+ {file = "rpds_py-0.13.2-pp310-pypy310_pp73-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:fdb82eb60d31b0c033a8e8ee9f3fc7dfbaa042211131c29da29aea8531b4f18f"},
+ {file = "rpds_py-0.13.2-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d204957169f0b3511fb95395a9da7d4490fb361763a9f8b32b345a7fe119cb45"},
+ {file = "rpds_py-0.13.2-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:c45008ca79bad237cbc03c72bc5205e8c6f66403773929b1b50f7d84ef9e4d07"},
+ {file = "rpds_py-0.13.2-pp310-pypy310_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:79bf58c08f0756adba691d480b5a20e4ad23f33e1ae121584cf3a21717c36dfa"},
+ {file = "rpds_py-0.13.2-pp310-pypy310_pp73-musllinux_1_2_i686.whl", hash = "sha256:e86593bf8637659e6a6ed58854b6c87ec4e9e45ee8a4adfd936831cef55c2d21"},
+ {file = "rpds_py-0.13.2-pp310-pypy310_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:d329896c40d9e1e5c7715c98529e4a188a1f2df51212fd65102b32465612b5dc"},
+ {file = "rpds_py-0.13.2-pp38-pypy38_pp73-macosx_10_7_x86_64.whl", hash = "sha256:4a5375c5fff13f209527cd886dc75394f040c7d1ecad0a2cb0627f13ebe78a12"},
+ {file = "rpds_py-0.13.2-pp38-pypy38_pp73-macosx_11_0_arm64.whl", hash = "sha256:06d218e4464d31301e943b65b2c6919318ea6f69703a351961e1baaf60347276"},
+ {file = "rpds_py-0.13.2-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c1f41d32a2ddc5a94df4b829b395916a4b7f103350fa76ba6de625fcb9e773ac"},
+ {file = "rpds_py-0.13.2-pp38-pypy38_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:6bc568b05e02cd612be53900c88aaa55012e744930ba2eeb56279db4c6676eb3"},
+ {file = "rpds_py-0.13.2-pp38-pypy38_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9d94d78418203904730585efa71002286ac4c8ac0689d0eb61e3c465f9e608ff"},
+ {file = "rpds_py-0.13.2-pp38-pypy38_pp73-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:bed0252c85e21cf73d2d033643c945b460d6a02fc4a7d644e3b2d6f5f2956c64"},
+ {file = "rpds_py-0.13.2-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:244e173bb6d8f3b2f0c4d7370a1aa341f35da3e57ffd1798e5b2917b91731fd3"},
+ {file = "rpds_py-0.13.2-pp38-pypy38_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:7f55cd9cf1564b7b03f238e4c017ca4794c05b01a783e9291065cb2858d86ce4"},
+ {file = "rpds_py-0.13.2-pp38-pypy38_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:f03a1b3a4c03e3e0161642ac5367f08479ab29972ea0ffcd4fa18f729cd2be0a"},
+ {file = "rpds_py-0.13.2-pp38-pypy38_pp73-musllinux_1_2_i686.whl", hash = "sha256:f5f4424cb87a20b016bfdc157ff48757b89d2cc426256961643d443c6c277007"},
+ {file = "rpds_py-0.13.2-pp38-pypy38_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:c82bbf7e03748417c3a88c1b0b291288ce3e4887a795a3addaa7a1cfd9e7153e"},
+ {file = "rpds_py-0.13.2-pp39-pypy39_pp73-macosx_10_7_x86_64.whl", hash = "sha256:c0095b8aa3e432e32d372e9a7737e65b58d5ed23b9620fea7cb81f17672f1fa1"},
+ {file = "rpds_py-0.13.2-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:4c2d26aa03d877c9730bf005621c92da263523a1e99247590abbbe252ccb7824"},
+ {file = "rpds_py-0.13.2-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:96f2975fb14f39c5fe75203f33dd3010fe37d1c4e33177feef1107b5ced750e3"},
+ {file = "rpds_py-0.13.2-pp39-pypy39_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:4dcc5ee1d0275cb78d443fdebd0241e58772a354a6d518b1d7af1580bbd2c4e8"},
+ {file = "rpds_py-0.13.2-pp39-pypy39_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:61d42d2b08430854485135504f672c14d4fc644dd243a9c17e7c4e0faf5ed07e"},
+ {file = "rpds_py-0.13.2-pp39-pypy39_pp73-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d3a61e928feddc458a55110f42f626a2a20bea942ccedb6fb4cee70b4830ed41"},
+ {file = "rpds_py-0.13.2-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7de12b69d95072394998c622cfd7e8cea8f560db5fca6a62a148f902a1029f8b"},
+ {file = "rpds_py-0.13.2-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:87a90f5545fd61f6964e65eebde4dc3fa8660bb7d87adb01d4cf17e0a2b484ad"},
+ {file = "rpds_py-0.13.2-pp39-pypy39_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:9c95a1a290f9acf7a8f2ebbdd183e99215d491beea52d61aa2a7a7d2c618ddc6"},
+ {file = "rpds_py-0.13.2-pp39-pypy39_pp73-musllinux_1_2_i686.whl", hash = "sha256:35f53c76a712e323c779ca39b9a81b13f219a8e3bc15f106ed1e1462d56fcfe9"},
+ {file = "rpds_py-0.13.2-pp39-pypy39_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:96fb0899bb2ab353f42e5374c8f0789f54e0a94ef2f02b9ac7149c56622eaf31"},
+ {file = "rpds_py-0.13.2.tar.gz", hash = "sha256:f8eae66a1304de7368932b42d801c67969fd090ddb1a7a24f27b435ed4bed68f"},
+]
+
+[[package]]
+name = "scipy"
+version = "1.9.3"
+description = "Fundamental algorithms for scientific computing in Python"
+optional = false
+python-versions = ">=3.8"
+files = [
+ {file = "scipy-1.9.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:1884b66a54887e21addf9c16fb588720a8309a57b2e258ae1c7986d4444d3bc0"},
+ {file = "scipy-1.9.3-cp310-cp310-macosx_12_0_arm64.whl", hash = "sha256:83b89e9586c62e787f5012e8475fbb12185bafb996a03257e9675cd73d3736dd"},
+ {file = "scipy-1.9.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1a72d885fa44247f92743fc20732ae55564ff2a519e8302fb7e18717c5355a8b"},
+ {file = "scipy-1.9.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d01e1dd7b15bd2449c8bfc6b7cc67d630700ed655654f0dfcf121600bad205c9"},
+ {file = "scipy-1.9.3-cp310-cp310-win_amd64.whl", hash = "sha256:68239b6aa6f9c593da8be1509a05cb7f9efe98b80f43a5861cd24c7557e98523"},
+ {file = "scipy-1.9.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:b41bc822679ad1c9a5f023bc93f6d0543129ca0f37c1ce294dd9d386f0a21096"},
+ {file = "scipy-1.9.3-cp311-cp311-macosx_12_0_arm64.whl", hash = "sha256:90453d2b93ea82a9f434e4e1cba043e779ff67b92f7a0e85d05d286a3625df3c"},
+ {file = "scipy-1.9.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:83c06e62a390a9167da60bedd4575a14c1f58ca9dfde59830fc42e5197283dab"},
+ {file = "scipy-1.9.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:abaf921531b5aeaafced90157db505e10345e45038c39e5d9b6c7922d68085cb"},
+ {file = "scipy-1.9.3-cp311-cp311-win_amd64.whl", hash = "sha256:06d2e1b4c491dc7d8eacea139a1b0b295f74e1a1a0f704c375028f8320d16e31"},
+ {file = "scipy-1.9.3-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:5a04cd7d0d3eff6ea4719371cbc44df31411862b9646db617c99718ff68d4840"},
+ {file = "scipy-1.9.3-cp38-cp38-macosx_12_0_arm64.whl", hash = "sha256:545c83ffb518094d8c9d83cce216c0c32f8c04aaf28b92cc8283eda0685162d5"},
+ {file = "scipy-1.9.3-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0d54222d7a3ba6022fdf5773931b5d7c56efe41ede7f7128c7b1637700409108"},
+ {file = "scipy-1.9.3-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cff3a5295234037e39500d35316a4c5794739433528310e117b8a9a0c76d20fc"},
+ {file = "scipy-1.9.3-cp38-cp38-win_amd64.whl", hash = "sha256:2318bef588acc7a574f5bfdff9c172d0b1bf2c8143d9582e05f878e580a3781e"},
+ {file = "scipy-1.9.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:d644a64e174c16cb4b2e41dfea6af722053e83d066da7343f333a54dae9bc31c"},
+ {file = "scipy-1.9.3-cp39-cp39-macosx_12_0_arm64.whl", hash = "sha256:da8245491d73ed0a994ed9c2e380fd058ce2fa8a18da204681f2fe1f57f98f95"},
+ {file = "scipy-1.9.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4db5b30849606a95dcf519763dd3ab6fe9bd91df49eba517359e450a7d80ce2e"},
+ {file = "scipy-1.9.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c68db6b290cbd4049012990d7fe71a2abd9ffbe82c0056ebe0f01df8be5436b0"},
+ {file = "scipy-1.9.3-cp39-cp39-win_amd64.whl", hash = "sha256:5b88e6d91ad9d59478fafe92a7c757d00c59e3bdc3331be8ada76a4f8d683f58"},
+ {file = "scipy-1.9.3.tar.gz", hash = "sha256:fbc5c05c85c1a02be77b1ff591087c83bc44579c6d2bd9fb798bb64ea5e1a027"},
+]
+
+[package.dependencies]
+numpy = ">=1.18.5,<1.26.0"
+
+[package.extras]
+dev = ["flake8", "mypy", "pycodestyle", "typing_extensions"]
+doc = ["matplotlib (>2)", "numpydoc", "pydata-sphinx-theme (==0.9.0)", "sphinx (!=4.1.0)", "sphinx-panels (>=0.5.2)", "sphinx-tabs"]
+test = ["asv", "gmpy2", "mpmath", "pytest", "pytest-cov", "pytest-xdist", "scikit-umfpack", "threadpoolctl"]
+
+[[package]]
+name = "send2trash"
+version = "1.8.2"
+description = "Send file to trash natively under Mac OS X, Windows and Linux"
+optional = false
+python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,>=2.7"
+files = [
+ {file = "Send2Trash-1.8.2-py3-none-any.whl", hash = "sha256:a384719d99c07ce1eefd6905d2decb6f8b7ed054025bb0e618919f945de4f679"},
+ {file = "Send2Trash-1.8.2.tar.gz", hash = "sha256:c132d59fa44b9ca2b1699af5c86f57ce9f4c5eb56629d5d55fbb7a35f84e2312"},
+]
+
+[package.extras]
+nativelib = ["pyobjc-framework-Cocoa", "pywin32"]
+objc = ["pyobjc-framework-Cocoa"]
+win32 = ["pywin32"]
+
+[[package]]
+name = "setuptools"
+version = "69.0.2"
+description = "Easily download, build, install, upgrade, and uninstall Python packages"
+optional = false
+python-versions = ">=3.8"
+files = [
+ {file = "setuptools-69.0.2-py3-none-any.whl", hash = "sha256:1e8fdff6797d3865f37397be788a4e3cba233608e9b509382a2777d25ebde7f2"},
+ {file = "setuptools-69.0.2.tar.gz", hash = "sha256:735896e78a4742605974de002ac60562d286fa8051a7e2299445e8e8fbb01aa6"},
+]
+
+[package.extras]
+docs = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "pygments-github-lexers (==0.0.5)", "rst.linker (>=1.9)", "sphinx (<7.2.5)", "sphinx (>=3.5)", "sphinx-favicon", "sphinx-inline-tabs", "sphinx-lint", "sphinx-notfound-page (>=1,<2)", "sphinx-reredirects", "sphinxcontrib-towncrier"]
+testing = ["build[virtualenv]", "filelock (>=3.4.0)", "flake8-2020", "ini2toml[lite] (>=0.9)", "jaraco.develop (>=7.21)", "jaraco.envs (>=2.2)", "jaraco.path (>=3.2.0)", "pip (>=19.1)", "pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-mypy (>=0.9.1)", "pytest-perf", "pytest-ruff", "pytest-timeout", "pytest-xdist", "tomli-w (>=1.0.0)", "virtualenv (>=13.0.0)", "wheel"]
+testing-integration = ["build[virtualenv] (>=1.0.3)", "filelock (>=3.4.0)", "jaraco.envs (>=2.2)", "jaraco.path (>=3.2.0)", "packaging (>=23.1)", "pytest", "pytest-enabler", "pytest-xdist", "tomli", "virtualenv (>=13.0.0)", "wheel"]
+
+[[package]]
+name = "six"
+version = "1.16.0"
+description = "Python 2 and 3 compatibility utilities"
+optional = false
+python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*"
+files = [
+ {file = "six-1.16.0-py2.py3-none-any.whl", hash = "sha256:8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254"},
+ {file = "six-1.16.0.tar.gz", hash = "sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926"},
+]
+
+[[package]]
+name = "smmap"
+version = "5.0.1"
+description = "A pure Python implementation of a sliding window memory map manager"
+optional = false
+python-versions = ">=3.7"
+files = [
+ {file = "smmap-5.0.1-py3-none-any.whl", hash = "sha256:e6d8668fa5f93e706934a62d7b4db19c8d9eb8cf2adbb75ef1b675aa332b69da"},
+ {file = "smmap-5.0.1.tar.gz", hash = "sha256:dceeb6c0028fdb6734471eb07c0cd2aae706ccaecab45965ee83f11c8d3b1f62"},
+]
+
+[[package]]
+name = "sniffio"
+version = "1.3.0"
+description = "Sniff out which async library your code is running under"
+optional = false
+python-versions = ">=3.7"
+files = [
+ {file = "sniffio-1.3.0-py3-none-any.whl", hash = "sha256:eecefdce1e5bbfb7ad2eeaabf7c1eeb404d7757c379bd1f7e5cce9d8bf425384"},
+ {file = "sniffio-1.3.0.tar.gz", hash = "sha256:e60305c5e5d314f5389259b7f22aaa33d8f7dee49763119234af3755c55b9101"},
+]
+
+[[package]]
+name = "snowballstemmer"
+version = "2.2.0"
+description = "This package provides 29 stemmers for 28 languages generated from Snowball algorithms."
+optional = false
+python-versions = "*"
+files = [
+ {file = "snowballstemmer-2.2.0-py2.py3-none-any.whl", hash = "sha256:c8e1716e83cc398ae16824e5572ae04e0d9fc2c6b985fb0f900f5f0c96ecba1a"},
+ {file = "snowballstemmer-2.2.0.tar.gz", hash = "sha256:09b16deb8547d3412ad7b590689584cd0fe25ec8db3be37788be3810cbf19cb1"},
+]
+
+[[package]]
+name = "soupsieve"
+version = "2.5"
+description = "A modern CSS selector implementation for Beautiful Soup."
+optional = false
+python-versions = ">=3.8"
+files = [
+ {file = "soupsieve-2.5-py3-none-any.whl", hash = "sha256:eaa337ff55a1579b6549dc679565eac1e3d000563bcb1c8ab0d0fefbc0c2cdc7"},
+ {file = "soupsieve-2.5.tar.gz", hash = "sha256:5663d5a7b3bfaeee0bc4372e7fc48f9cff4940b3eec54a6451cc5299f1097690"},
+]
+
+[[package]]
+name = "stack-data"
+version = "0.6.3"
+description = "Extract data from python stack frames and tracebacks for informative displays"
+optional = false
+python-versions = "*"
+files = [
+ {file = "stack_data-0.6.3-py3-none-any.whl", hash = "sha256:d5558e0c25a4cb0853cddad3d77da9891a08cb85dd9f9f91b9f8cd66e511e695"},
+ {file = "stack_data-0.6.3.tar.gz", hash = "sha256:836a778de4fec4dcd1dcd89ed8abff8a221f58308462e1c4aa2a3cf30148f0b9"},
+]
+
+[package.dependencies]
+asttokens = ">=2.1.0"
+executing = ">=1.2.0"
+pure-eval = "*"
+
+[package.extras]
+tests = ["cython", "littleutils", "pygments", "pytest", "typeguard"]
+
+[[package]]
+name = "starlette"
+version = "0.27.0"
+description = "The little ASGI library that shines."
+optional = false
+python-versions = ">=3.7"
+files = [
+ {file = "starlette-0.27.0-py3-none-any.whl", hash = "sha256:918416370e846586541235ccd38a474c08b80443ed31c578a418e2209b3eef91"},
+ {file = "starlette-0.27.0.tar.gz", hash = "sha256:6a6b0d042acb8d469a01eba54e9cda6cbd24ac602c4cd016723117d6a7e73b75"},
+]
+
+[package.dependencies]
+anyio = ">=3.4.0,<5"
+typing-extensions = {version = ">=3.10.0", markers = "python_version < \"3.10\""}
+
+[package.extras]
+full = ["httpx (>=0.22.0)", "itsdangerous", "jinja2", "python-multipart", "pyyaml"]
+
+[[package]]
+name = "stevedore"
+version = "5.1.0"
+description = "Manage dynamic plugins for Python applications"
+optional = false
+python-versions = ">=3.8"
+files = [
+ {file = "stevedore-5.1.0-py3-none-any.whl", hash = "sha256:8cc040628f3cea5d7128f2e76cf486b2251a4e543c7b938f58d9a377f6694a2d"},
+ {file = "stevedore-5.1.0.tar.gz", hash = "sha256:a54534acf9b89bc7ed264807013b505bf07f74dbe4bcfa37d32bd063870b087c"},
+]
+
+[package.dependencies]
+pbr = ">=2.0.0,<2.1.0 || >2.1.0"
+
+[[package]]
+name = "terminado"
+version = "0.18.0"
+description = "Tornado websocket backend for the Xterm.js Javascript terminal emulator library."
+optional = false
+python-versions = ">=3.8"
+files = [
+ {file = "terminado-0.18.0-py3-none-any.whl", hash = "sha256:87b0d96642d0fe5f5abd7783857b9cab167f221a39ff98e3b9619a788a3c0f2e"},
+ {file = "terminado-0.18.0.tar.gz", hash = "sha256:1ea08a89b835dd1b8c0c900d92848147cef2537243361b2e3f4dc15df9b6fded"},
+]
+
+[package.dependencies]
+ptyprocess = {version = "*", markers = "os_name != \"nt\""}
+pywinpty = {version = ">=1.1.0", markers = "os_name == \"nt\""}
+tornado = ">=6.1.0"
+
+[package.extras]
+docs = ["myst-parser", "pydata-sphinx-theme", "sphinx"]
+test = ["pre-commit", "pytest (>=7.0)", "pytest-timeout"]
+typing = ["mypy (>=1.6,<2.0)", "traitlets (>=5.11.1)"]
+
+[[package]]
+name = "timm"
+version = "0.5.4"
+description = "(Unofficial) PyTorch Image Models"
+optional = false
+python-versions = ">=3.6"
+files = [
+ {file = "timm-0.5.4-py3-none-any.whl", hash = "sha256:0592c8fd2d46d0769c0b7e954b3dacea93769eee40dabb4bd7f2acb85243b588"},
+ {file = "timm-0.5.4.tar.gz", hash = "sha256:5d7b92e66a76c432009aba90d515ea7a882aae573415a7c5269e3617df901c1f"},
+]
+
+[package.dependencies]
+torch = ">=1.4"
+torchvision = "*"
+
+[[package]]
+name = "tinycss2"
+version = "1.2.1"
+description = "A tiny CSS parser"
+optional = false
+python-versions = ">=3.7"
+files = [
+ {file = "tinycss2-1.2.1-py3-none-any.whl", hash = "sha256:2b80a96d41e7c3914b8cda8bc7f705a4d9c49275616e886103dd839dfc847847"},
+ {file = "tinycss2-1.2.1.tar.gz", hash = "sha256:8cff3a8f066c2ec677c06dbc7b45619804a6938478d9d73c284b29d14ecb0627"},
+]
+
+[package.dependencies]
+webencodings = ">=0.4"
+
+[package.extras]
+doc = ["sphinx", "sphinx_rtd_theme"]
+test = ["flake8", "isort", "pytest"]
+
+[[package]]
+name = "tomli"
+version = "2.0.1"
+description = "A lil' TOML parser"
+optional = false
+python-versions = ">=3.7"
+files = [
+ {file = "tomli-2.0.1-py3-none-any.whl", hash = "sha256:939de3e7a6161af0c887ef91b7d41a53e7c5a1ca976325f429cb46ea9bc30ecc"},
+ {file = "tomli-2.0.1.tar.gz", hash = "sha256:de526c12914f0c550d15924c62d72abc48d6fe7364aa87328337a31007fe8a4f"},
+]
+
+[[package]]
+name = "torch"
+version = "1.10.2"
+description = "Tensors and Dynamic neural networks in Python with strong GPU acceleration"
+optional = false
+python-versions = ">=3.6.2"
+files = [
+ {file = "torch-1.10.2-cp310-cp310-manylinux2014_aarch64.whl", hash = "sha256:8f3fd2e3ffc3bb867133fdf7fbcc8a0bb2e62a5c0696396f51856f5abf9045a8"},
+ {file = "torch-1.10.2-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:258a0729fb77a3457d5822d84b536057cd119b08049a8d3c41dc3dcdeb48d56e"},
+ {file = "torch-1.10.2-cp36-cp36m-manylinux2014_aarch64.whl", hash = "sha256:935e5ac804c5093c79f23a7e6ca5b912c166071aa9d8b4a0a3d6a85126d6a47b"},
+ {file = "torch-1.10.2-cp36-cp36m-win_amd64.whl", hash = "sha256:65fd02ed889c63fd82bf1a440c5a94c1310c29f3e6f9f62add416d34da355d97"},
+ {file = "torch-1.10.2-cp36-none-macosx_10_9_x86_64.whl", hash = "sha256:6a81f886823bbd15edc2dc0908fa214070df61c9f7ab8831f0a03630275cca5a"},
+ {file = "torch-1.10.2-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:3eee3cf53c1f8fb3f1fe107a22025a8501fc6440d14e09599ba7153002531f84"},
+ {file = "torch-1.10.2-cp37-cp37m-manylinux2014_aarch64.whl", hash = "sha256:ef99b8cca5f9358119b07956915faf6e7906f433ab4a603c160ae9de88918371"},
+ {file = "torch-1.10.2-cp37-cp37m-win_amd64.whl", hash = "sha256:d43bc3f3a2d89ae185ef96d903c935c335219231e57685658648396984e2a67a"},
+ {file = "torch-1.10.2-cp37-none-macosx_10_9_x86_64.whl", hash = "sha256:6da1b877880435440a5aa9678ef0f01986d4886416844db1d97ebfb7fd1778d0"},
+ {file = "torch-1.10.2-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:ab77a9f838874f295ed5410c0686fa22547456e0116efb281c66ef5f9d46fe28"},
+ {file = "torch-1.10.2-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:9ef4c004f9e5168bd1c1930c6aff25fed5b097de81db6271ffbb2e4fb8b89319"},
+ {file = "torch-1.10.2-cp38-cp38-win_amd64.whl", hash = "sha256:376fc18407add20daa6bbaaffc5a5e06d733abe53bcbd60ef2532bfed34bc091"},
+ {file = "torch-1.10.2-cp38-none-macosx_10_9_x86_64.whl", hash = "sha256:f281438ee99bd72ad65c0bba1026a32e45c3b636bc067fc145ad291e9ea2faab"},
+ {file = "torch-1.10.2-cp38-none-macosx_11_0_arm64.whl", hash = "sha256:3592d3dd62b32760c82624e7586222747fe2281240e8653970b35f1d6d4a434c"},
+ {file = "torch-1.10.2-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:fbaf18c1b3e0b31af194a9d853e3739464cf982d279df9d34dd18f1c2a471878"},
+ {file = "torch-1.10.2-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:97b7b0c667e8b0dd1fc70137a36e0a4841ec10ef850bda60500ad066bef3e2de"},
+ {file = "torch-1.10.2-cp39-cp39-win_amd64.whl", hash = "sha256:901b52787baeb2e9e1357ca7037da0028bc6ad743f530e0040ae96ef8e27156c"},
+ {file = "torch-1.10.2-cp39-none-macosx_10_9_x86_64.whl", hash = "sha256:5b68e9108bd7ebd99eee941686046c517cfaac5331f757bcf440fe02f2e3ced1"},
+ {file = "torch-1.10.2-cp39-none-macosx_11_0_arm64.whl", hash = "sha256:b07ef01e36b716d0d65ca60c4db0ac9d094a0e797d9b55290da4dcda91463b6c"},
+]
+
+[package.dependencies]
+typing-extensions = "*"
+
+[[package]]
+name = "torchmetrics"
+version = "1.2.0"
+description = "PyTorch native Metrics"
+optional = false
+python-versions = ">=3.8"
+files = [
+ {file = "torchmetrics-1.2.0-py3-none-any.whl", hash = "sha256:da2cb18822b285786d082c40efb9e1d861aac425f58230234fe6ce233cf002f8"},
+ {file = "torchmetrics-1.2.0.tar.gz", hash = "sha256:7eb28340bde45e13187a9ad54a4a7010a50417815d8181a5df6131f116ffe1b7"},
+]
+
+[package.dependencies]
+lightning-utilities = ">=0.8.0"
+numpy = ">1.20.0"
+torch = ">=1.8.1"
+
+[package.extras]
+all = ["SciencePlots (>=2.0.0)", "lpips (<=0.1.4)", "matplotlib (>=3.2.0)", "mypy (==1.5.1)", "nltk (>=3.6)", "piq (<=0.8.0)", "pycocotools (>2.0.0)", "pystoi (>=0.3.0)", "regex (>=2021.9.24)", "scipy (>1.0.0)", "torch-fidelity (<=0.4.0)", "torchaudio (>=0.10.0)", "torchvision (>=0.8)", "tqdm (>=4.41.0)", "transformers (>4.4.0)", "transformers (>=4.10.0)", "types-PyYAML", "types-emoji", "types-protobuf", "types-requests", "types-setuptools", "types-six", "types-tabulate"]
+audio = ["pystoi (>=0.3.0)", "torchaudio (>=0.10.0)"]
+detection = ["pycocotools (>2.0.0)", "torchvision (>=0.8)"]
+dev = ["SciencePlots (>=2.0.0)", "bert-score (==0.3.13)", "cloudpickle (>1.3)", "coverage (==7.3.1)", "dython (<=0.7.4)", "fairlearn", "fast-bss-eval (>=0.1.0)", "faster-coco-eval (>=1.3.3)", "fire (<=0.5.0)", "huggingface-hub (<0.18)", "jiwer (>=2.3.0)", "kornia (>=0.6.7)", "lpips (<=0.1.4)", "matplotlib (>=3.2.0)", "mir-eval (>=0.6)", "mypy (==1.5.1)", "netcal (>1.0.0)", "nltk (>=3.6)", "numpy (<1.25.0)", "pandas (>1.0.0)", "pandas (>=1.4.0)", "phmdoctest (==1.4.0)", "piq (<=0.8.0)", "psutil (<=5.9.5)", "pycocotools (>2.0.0)", "pystoi (>=0.3.0)", "pytest (==7.4.2)", "pytest-cov (==4.1.0)", "pytest-doctestplus (==1.0.0)", "pytest-rerunfailures (==12.0)", "pytest-timeout (==2.1.0)", "pytorch-msssim (==1.0.0)", "regex (>=2021.9.24)", "requests (<=2.31.0)", "rouge-score (>0.1.0)", "sacrebleu (>=2.0.0)", "scikit-image (>=0.19.0)", "scikit-learn (>=1.1.1)", "scipy (>1.0.0)", "sewar (>=0.4.4)", "statsmodels (>0.13.5)", "torch-complex (<=0.4.3)", "torch-fidelity (<=0.4.0)", "torchaudio (>=0.10.0)", "torchvision (>=0.8)", "tqdm (>=4.41.0)", "transformers (>4.4.0)", "transformers (>=4.10.0)", "types-PyYAML", "types-emoji", "types-protobuf", "types-requests", "types-setuptools", "types-six", "types-tabulate"]
+image = ["lpips (<=0.1.4)", "scipy (>1.0.0)", "torch-fidelity (<=0.4.0)", "torchvision (>=0.8)"]
+multimodal = ["piq (<=0.8.0)", "transformers (>=4.10.0)"]
+test = ["bert-score (==0.3.13)", "cloudpickle (>1.3)", "coverage (==7.3.1)", "dython (<=0.7.4)", "fairlearn", "fast-bss-eval (>=0.1.0)", "faster-coco-eval (>=1.3.3)", "fire (<=0.5.0)", "huggingface-hub (<0.18)", "jiwer (>=2.3.0)", "kornia (>=0.6.7)", "mir-eval (>=0.6)", "netcal (>1.0.0)", "numpy (<1.25.0)", "pandas (>1.0.0)", "pandas (>=1.4.0)", "phmdoctest (==1.4.0)", "psutil (<=5.9.5)", "pytest (==7.4.2)", "pytest-cov (==4.1.0)", "pytest-doctestplus (==1.0.0)", "pytest-rerunfailures (==12.0)", "pytest-timeout (==2.1.0)", "pytorch-msssim (==1.0.0)", "requests (<=2.31.0)", "rouge-score (>0.1.0)", "sacrebleu (>=2.0.0)", "scikit-image (>=0.19.0)", "scikit-learn (>=1.1.1)", "scipy (>1.0.0)", "sewar (>=0.4.4)", "statsmodels (>0.13.5)", "torch-complex (<=0.4.3)"]
+text = ["nltk (>=3.6)", "regex (>=2021.9.24)", "tqdm (>=4.41.0)", "transformers (>4.4.0)"]
+typing = ["mypy (==1.5.1)", "types-PyYAML", "types-emoji", "types-protobuf", "types-requests", "types-setuptools", "types-six", "types-tabulate"]
+visual = ["SciencePlots (>=2.0.0)", "matplotlib (>=3.2.0)"]
+
+[[package]]
+name = "torchvision"
+version = "0.11.3"
+description = "image and video datasets and models for torch deep learning"
+optional = false
+python-versions = "*"
+files = [
+ {file = "torchvision-0.11.3-cp310-cp310-manylinux2014_aarch64.whl", hash = "sha256:8bc8a7db80c97ca254be362ba883a202192e361ba2f6dff7ff5bb010d4bfc23a"},
+ {file = "torchvision-0.11.3-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:55c226803d0ab17972e3f61054ba5d931ca005846c34ec0ae219c17289600813"},
+ {file = "torchvision-0.11.3-cp36-cp36m-manylinux2014_aarch64.whl", hash = "sha256:abb8ace93194a1bc93a6fc5609d6e9518451c5c82b559abfdc77b758014276d1"},
+ {file = "torchvision-0.11.3-cp36-cp36m-win_amd64.whl", hash = "sha256:870496b022c49f1c200ac26881481e8c3916360fe86185ae86b950a7ecbef7dc"},
+ {file = "torchvision-0.11.3-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:6137eb2694688adf863134dc04336159b3326c30a5de66bb773634ea10ef837e"},
+ {file = "torchvision-0.11.3-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:253e389529df26d39a934512b57bd3fafd7a2a79c3bcad70d3dacab64de95d17"},
+ {file = "torchvision-0.11.3-cp37-cp37m-manylinux2014_aarch64.whl", hash = "sha256:a8cafd5fd5e583730532b40587149d39f9e496023019f1cd86b083e3ca219e6d"},
+ {file = "torchvision-0.11.3-cp37-cp37m-win_amd64.whl", hash = "sha256:7a2ea29054274aa391f4acb403c55a9bafc0df7c0395c811522a9bbb18044fa8"},
+ {file = "torchvision-0.11.3-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:63647dfb9b0354bc8c5bb120f2dc15a123cee7f5fd6a8e84561da46cc2c89e3a"},
+ {file = "torchvision-0.11.3-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:a82d7d383fabb45fb54aa569ab216b87b98f9eb9de75b3cbfedab555a71209fa"},
+ {file = "torchvision-0.11.3-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:0eda00afc5176b35e69eddd018ee633e3e3d74bbcf139eccdc150781c4ae83a7"},
+ {file = "torchvision-0.11.3-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:b237b39e1c558ad5c9043b6e56bc568ee745f7f064f53270a3fceb53b9725c4b"},
+ {file = "torchvision-0.11.3-cp38-cp38-win_amd64.whl", hash = "sha256:dc144114d5991a33bf8909277b02ea082d99cee4cdcf3f7a9c6b48f0c6c8ddde"},
+ {file = "torchvision-0.11.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:3380211bf061d114c380f52fb33f55d2fbe483e2fd297f6aa596803f7cbdb408"},
+ {file = "torchvision-0.11.3-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:a3997b63bd8fac985323b6068e689c9617b0b36e1126616f7b380e17c501aefa"},
+ {file = "torchvision-0.11.3-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:eca0b0f7a0e462bdecf7926d89faae6dcd51da418ca0cf70e725981ed775a11b"},
+ {file = "torchvision-0.11.3-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:25e72231be8ce03467a77806d9c3f5fd34b9cd23b9543d3e999bf57622377532"},
+ {file = "torchvision-0.11.3-cp39-cp39-win_amd64.whl", hash = "sha256:5263770a9a91011206b3566b33bbba040b92932885c63cfe5ac9c720ed1fdaca"},
+]
+
+[package.dependencies]
+numpy = "*"
+pillow = ">=5.3.0,<8.3.0 || >8.3.0"
+torch = "1.10.2"
+
+[package.extras]
+scipy = ["scipy"]
+
+[[package]]
+name = "tornado"
+version = "6.4"
+description = "Tornado is a Python web framework and asynchronous networking library, originally developed at FriendFeed."
+optional = false
+python-versions = ">= 3.8"
+files = [
+ {file = "tornado-6.4-cp38-abi3-macosx_10_9_universal2.whl", hash = "sha256:02ccefc7d8211e5a7f9e8bc3f9e5b0ad6262ba2fbb683a6443ecc804e5224ce0"},
+ {file = "tornado-6.4-cp38-abi3-macosx_10_9_x86_64.whl", hash = "sha256:27787de946a9cffd63ce5814c33f734c627a87072ec7eed71f7fc4417bb16263"},
+ {file = "tornado-6.4-cp38-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f7894c581ecdcf91666a0912f18ce5e757213999e183ebfc2c3fdbf4d5bd764e"},
+ {file = "tornado-6.4-cp38-abi3-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e43bc2e5370a6a8e413e1e1cd0c91bedc5bd62a74a532371042a18ef19e10579"},
+ {file = "tornado-6.4-cp38-abi3-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f0251554cdd50b4b44362f73ad5ba7126fc5b2c2895cc62b14a1c2d7ea32f212"},
+ {file = "tornado-6.4-cp38-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:fd03192e287fbd0899dd8f81c6fb9cbbc69194d2074b38f384cb6fa72b80e9c2"},
+ {file = "tornado-6.4-cp38-abi3-musllinux_1_1_i686.whl", hash = "sha256:88b84956273fbd73420e6d4b8d5ccbe913c65d31351b4c004ae362eba06e1f78"},
+ {file = "tornado-6.4-cp38-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:71ddfc23a0e03ef2df1c1397d859868d158c8276a0603b96cf86892bff58149f"},
+ {file = "tornado-6.4-cp38-abi3-win32.whl", hash = "sha256:6f8a6c77900f5ae93d8b4ae1196472d0ccc2775cc1dfdc9e7727889145c45052"},
+ {file = "tornado-6.4-cp38-abi3-win_amd64.whl", hash = "sha256:10aeaa8006333433da48dec9fe417877f8bcc21f48dda8d661ae79da357b2a63"},
+ {file = "tornado-6.4.tar.gz", hash = "sha256:72291fa6e6bc84e626589f1c29d90a5a6d593ef5ae68052ee2ef000dfd273dee"},
+]
+
+[[package]]
+name = "tqdm"
+version = "4.66.1"
+description = "Fast, Extensible Progress Meter"
+optional = false
+python-versions = ">=3.7"
+files = [
+ {file = "tqdm-4.66.1-py3-none-any.whl", hash = "sha256:d302b3c5b53d47bce91fea46679d9c3c6508cf6332229aa1e7d8653723793386"},
+ {file = "tqdm-4.66.1.tar.gz", hash = "sha256:d88e651f9db8d8551a62556d3cff9e3034274ca5d66e93197cf2490e2dcb69c7"},
+]
+
+[package.dependencies]
+colorama = {version = "*", markers = "platform_system == \"Windows\""}
+
+[package.extras]
+dev = ["pytest (>=6)", "pytest-cov", "pytest-timeout", "pytest-xdist"]
+notebook = ["ipywidgets (>=6)"]
+slack = ["slack-sdk"]
+telegram = ["requests"]
+
+[[package]]
+name = "traitlets"
+version = "5.14.0"
+description = "Traitlets Python configuration system"
+optional = false
+python-versions = ">=3.8"
+files = [
+ {file = "traitlets-5.14.0-py3-none-any.whl", hash = "sha256:f14949d23829023013c47df20b4a76ccd1a85effb786dc060f34de7948361b33"},
+ {file = "traitlets-5.14.0.tar.gz", hash = "sha256:fcdaa8ac49c04dfa0ed3ee3384ef6dfdb5d6f3741502be247279407679296772"},
+]
+
+[package.extras]
+docs = ["myst-parser", "pydata-sphinx-theme", "sphinx"]
+test = ["argcomplete (>=3.0.3)", "mypy (>=1.7.0)", "pre-commit", "pytest (>=7.0,<7.5)", "pytest-mock", "pytest-mypy-testing"]
+
+[[package]]
+name = "types-python-dateutil"
+version = "2.8.19.14"
+description = "Typing stubs for python-dateutil"
+optional = false
+python-versions = "*"
+files = [
+ {file = "types-python-dateutil-2.8.19.14.tar.gz", hash = "sha256:1f4f10ac98bb8b16ade9dbee3518d9ace017821d94b057a425b069f834737f4b"},
+ {file = "types_python_dateutil-2.8.19.14-py3-none-any.whl", hash = "sha256:f977b8de27787639986b4e28963263fd0e5158942b3ecef91b9335c130cb1ce9"},
+]
+
+[[package]]
+name = "types-requests"
+version = "2.31.0.10"
+description = "Typing stubs for requests"
+optional = false
+python-versions = ">=3.7"
+files = [
+ {file = "types-requests-2.31.0.10.tar.gz", hash = "sha256:dc5852a76f1eaf60eafa81a2e50aefa3d1f015c34cf0cba130930866b1b22a92"},
+ {file = "types_requests-2.31.0.10-py3-none-any.whl", hash = "sha256:b32b9a86beffa876c0c3ac99a4cd3b8b51e973fb8e3bd4e0a6bb32c7efad80fc"},
+]
+
+[package.dependencies]
+urllib3 = ">=2"
+
+[[package]]
+name = "typing"
+version = "3.7.4.3"
+description = "Type Hints for Python"
+optional = false
+python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*"
+files = [
+ {file = "typing-3.7.4.3-py2-none-any.whl", hash = "sha256:283d868f5071ab9ad873e5e52268d611e851c870a2ba354193026f2dfb29d8b5"},
+ {file = "typing-3.7.4.3.tar.gz", hash = "sha256:1187fb9c82fd670d10aa07bbb6cfcfe4bdda42d6fab8d5134f04e8c4d0b71cc9"},
+]
+
+[[package]]
+name = "typing-extensions"
+version = "4.8.0"
+description = "Backported and Experimental Type Hints for Python 3.8+"
+optional = false
+python-versions = ">=3.8"
+files = [
+ {file = "typing_extensions-4.8.0-py3-none-any.whl", hash = "sha256:8f92fc8806f9a6b641eaa5318da32b44d401efaac0f6678c9bc448ba3605faa0"},
+ {file = "typing_extensions-4.8.0.tar.gz", hash = "sha256:df8e4339e9cb77357558cbdbceca33c303714cf861d1eef15e1070055ae8b7ef"},
+]
+
+[[package]]
+name = "ujson"
+version = "5.8.0"
+description = "Ultra fast JSON encoder and decoder for Python"
+optional = false
+python-versions = ">=3.8"
+files = [
+ {file = "ujson-5.8.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:f4511560d75b15ecb367eef561554959b9d49b6ec3b8d5634212f9fed74a6df1"},
+ {file = "ujson-5.8.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:9399eaa5d1931a0ead49dce3ffacbea63f3177978588b956036bfe53cdf6af75"},
+ {file = "ujson-5.8.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c4e7bb7eba0e1963f8b768f9c458ecb193e5bf6977090182e2b4f4408f35ac76"},
+ {file = "ujson-5.8.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:40931d7c08c4ce99adc4b409ddb1bbb01635a950e81239c2382cfe24251b127a"},
+ {file = "ujson-5.8.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d53039d39de65360e924b511c7ca1a67b0975c34c015dd468fca492b11caa8f7"},
+ {file = "ujson-5.8.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:bdf04c6af3852161be9613e458a1fb67327910391de8ffedb8332e60800147a2"},
+ {file = "ujson-5.8.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:a70f776bda2e5072a086c02792c7863ba5833d565189e09fabbd04c8b4c3abba"},
+ {file = "ujson-5.8.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:f26629ac531d712f93192c233a74888bc8b8212558bd7d04c349125f10199fcf"},
+ {file = "ujson-5.8.0-cp310-cp310-win32.whl", hash = "sha256:7ecc33b107ae88405aebdb8d82c13d6944be2331ebb04399134c03171509371a"},
+ {file = "ujson-5.8.0-cp310-cp310-win_amd64.whl", hash = "sha256:3b27a8da7a080add559a3b73ec9ebd52e82cc4419f7c6fb7266e62439a055ed0"},
+ {file = "ujson-5.8.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:193349a998cd821483a25f5df30b44e8f495423840ee11b3b28df092ddfd0f7f"},
+ {file = "ujson-5.8.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:4ddeabbc78b2aed531f167d1e70387b151900bc856d61e9325fcdfefb2a51ad8"},
+ {file = "ujson-5.8.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5ce24909a9c25062e60653073dd6d5e6ec9d6ad7ed6e0069450d5b673c854405"},
+ {file = "ujson-5.8.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:27a2a3c7620ebe43641e926a1062bc04e92dbe90d3501687957d71b4bdddaec4"},
+ {file = "ujson-5.8.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2b852bdf920fe9f84e2a2c210cc45f1b64f763b4f7d01468b33f7791698e455e"},
+ {file = "ujson-5.8.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:20768961a6a706170497129960762ded9c89fb1c10db2989c56956b162e2a8a3"},
+ {file = "ujson-5.8.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:e0147d41e9fb5cd174207c4a2895c5e24813204499fd0839951d4c8784a23bf5"},
+ {file = "ujson-5.8.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:e3673053b036fd161ae7a5a33358ccae6793ee89fd499000204676baafd7b3aa"},
+ {file = "ujson-5.8.0-cp311-cp311-win32.whl", hash = "sha256:a89cf3cd8bf33a37600431b7024a7ccf499db25f9f0b332947fbc79043aad879"},
+ {file = "ujson-5.8.0-cp311-cp311-win_amd64.whl", hash = "sha256:3659deec9ab9eb19e8646932bfe6fe22730757c4addbe9d7d5544e879dc1b721"},
+ {file = "ujson-5.8.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:102bf31c56f59538cccdfec45649780ae00657e86247c07edac434cb14d5388c"},
+ {file = "ujson-5.8.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:299a312c3e85edee1178cb6453645217ba23b4e3186412677fa48e9a7f986de6"},
+ {file = "ujson-5.8.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f2e385a7679b9088d7bc43a64811a7713cc7c33d032d020f757c54e7d41931ae"},
+ {file = "ujson-5.8.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ad24ec130855d4430a682c7a60ca0bc158f8253ec81feed4073801f6b6cb681b"},
+ {file = "ujson-5.8.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:16fde596d5e45bdf0d7de615346a102510ac8c405098e5595625015b0d4b5296"},
+ {file = "ujson-5.8.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:6d230d870d1ce03df915e694dcfa3f4e8714369cce2346686dbe0bc8e3f135e7"},
+ {file = "ujson-5.8.0-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:9571de0c53db5cbc265945e08f093f093af2c5a11e14772c72d8e37fceeedd08"},
+ {file = "ujson-5.8.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:7cba16b26efe774c096a5e822e4f27097b7c81ed6fb5264a2b3f5fd8784bab30"},
+ {file = "ujson-5.8.0-cp312-cp312-win32.whl", hash = "sha256:48c7d373ff22366eecfa36a52b9b55b0ee5bd44c2b50e16084aa88b9de038916"},
+ {file = "ujson-5.8.0-cp312-cp312-win_amd64.whl", hash = "sha256:5ac97b1e182d81cf395ded620528c59f4177eee024b4b39a50cdd7b720fdeec6"},
+ {file = "ujson-5.8.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:2a64cc32bb4a436e5813b83f5aab0889927e5ea1788bf99b930fad853c5625cb"},
+ {file = "ujson-5.8.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:e54578fa8838ddc722539a752adfce9372474114f8c127bb316db5392d942f8b"},
+ {file = "ujson-5.8.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9721cd112b5e4687cb4ade12a7b8af8b048d4991227ae8066d9c4b3a6642a582"},
+ {file = "ujson-5.8.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9d9707e5aacf63fb919f6237d6490c4e0244c7f8d3dc2a0f84d7dec5db7cb54c"},
+ {file = "ujson-5.8.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0be81bae295f65a6896b0c9030b55a106fb2dec69ef877253a87bc7c9c5308f7"},
+ {file = "ujson-5.8.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:ae7f4725c344bf437e9b881019c558416fe84ad9c6b67426416c131ad577df67"},
+ {file = "ujson-5.8.0-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:9ab282d67ef3097105552bf151438b551cc4bedb3f24d80fada830f2e132aeb9"},
+ {file = "ujson-5.8.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:94c7bd9880fa33fcf7f6d7f4cc032e2371adee3c5dba2922b918987141d1bf07"},
+ {file = "ujson-5.8.0-cp38-cp38-win32.whl", hash = "sha256:bf5737dbcfe0fa0ac8fa599eceafae86b376492c8f1e4b84e3adf765f03fb564"},
+ {file = "ujson-5.8.0-cp38-cp38-win_amd64.whl", hash = "sha256:11da6bed916f9bfacf13f4fc6a9594abd62b2bb115acfb17a77b0f03bee4cfd5"},
+ {file = "ujson-5.8.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:69b3104a2603bab510497ceabc186ba40fef38ec731c0ccaa662e01ff94a985c"},
+ {file = "ujson-5.8.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:9249fdefeb021e00b46025e77feed89cd91ffe9b3a49415239103fc1d5d9c29a"},
+ {file = "ujson-5.8.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2873d196725a8193f56dde527b322c4bc79ed97cd60f1d087826ac3290cf9207"},
+ {file = "ujson-5.8.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6a4dafa9010c366589f55afb0fd67084acd8added1a51251008f9ff2c3e44042"},
+ {file = "ujson-5.8.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7a42baa647a50fa8bed53d4e242be61023bd37b93577f27f90ffe521ac9dc7a3"},
+ {file = "ujson-5.8.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:f3554eaadffe416c6f543af442066afa6549edbc34fe6a7719818c3e72ebfe95"},
+ {file = "ujson-5.8.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:fb87decf38cc82bcdea1d7511e73629e651bdec3a43ab40985167ab8449b769c"},
+ {file = "ujson-5.8.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:407d60eb942c318482bbfb1e66be093308bb11617d41c613e33b4ce5be789adc"},
+ {file = "ujson-5.8.0-cp39-cp39-win32.whl", hash = "sha256:0fe1b7edaf560ca6ab023f81cbeaf9946a240876a993b8c5a21a1c539171d903"},
+ {file = "ujson-5.8.0-cp39-cp39-win_amd64.whl", hash = "sha256:3f9b63530a5392eb687baff3989d0fb5f45194ae5b1ca8276282fb647f8dcdb3"},
+ {file = "ujson-5.8.0-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:efeddf950fb15a832376c0c01d8d7713479fbeceaed1eaecb2665aa62c305aec"},
+ {file = "ujson-5.8.0-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7d8283ac5d03e65f488530c43d6610134309085b71db4f675e9cf5dff96a8282"},
+ {file = "ujson-5.8.0-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:eb0142f6f10f57598655340a3b2c70ed4646cbe674191da195eb0985a9813b83"},
+ {file = "ujson-5.8.0-pp38-pypy38_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:07d459aca895eb17eb463b00441986b021b9312c6c8cc1d06880925c7f51009c"},
+ {file = "ujson-5.8.0-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:d524a8c15cfc863705991d70bbec998456a42c405c291d0f84a74ad7f35c5109"},
+ {file = "ujson-5.8.0-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:d6f84a7a175c75beecde53a624881ff618e9433045a69fcfb5e154b73cdaa377"},
+ {file = "ujson-5.8.0-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b748797131ac7b29826d1524db1cc366d2722ab7afacc2ce1287cdafccddbf1f"},
+ {file = "ujson-5.8.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2e72ba76313d48a1a3a42e7dc9d1db32ea93fac782ad8dde6f8b13e35c229130"},
+ {file = "ujson-5.8.0-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f504117a39cb98abba4153bf0b46b4954cc5d62f6351a14660201500ba31fe7f"},
+ {file = "ujson-5.8.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:a8c91b6f4bf23f274af9002b128d133b735141e867109487d17e344d38b87d94"},
+ {file = "ujson-5.8.0.tar.gz", hash = "sha256:78e318def4ade898a461b3d92a79f9441e7e0e4d2ad5419abed4336d702c7425"},
+]
+
+[[package]]
+name = "uri-template"
+version = "1.3.0"
+description = "RFC 6570 URI Template Processor"
+optional = false
+python-versions = ">=3.7"
+files = [
+ {file = "uri-template-1.3.0.tar.gz", hash = "sha256:0e00f8eb65e18c7de20d595a14336e9f337ead580c70934141624b6d1ffdacc7"},
+ {file = "uri_template-1.3.0-py3-none-any.whl", hash = "sha256:a44a133ea12d44a0c0f06d7d42a52d71282e77e2f937d8abd5655b8d56fc1363"},
+]
+
+[package.extras]
+dev = ["flake8", "flake8-annotations", "flake8-bandit", "flake8-bugbear", "flake8-commas", "flake8-comprehensions", "flake8-continuation", "flake8-datetimez", "flake8-docstrings", "flake8-import-order", "flake8-literal", "flake8-modern-annotations", "flake8-noqa", "flake8-pyproject", "flake8-requirements", "flake8-typechecking-import", "flake8-use-fstring", "mypy", "pep8-naming", "types-PyYAML"]
+
+[[package]]
+name = "urllib3"
+version = "2.1.0"
+description = "HTTP library with thread-safe connection pooling, file post, and more."
+optional = false
+python-versions = ">=3.8"
+files = [
+ {file = "urllib3-2.1.0-py3-none-any.whl", hash = "sha256:55901e917a5896a349ff771be919f8bd99aff50b79fe58fec595eb37bbc56bb3"},
+ {file = "urllib3-2.1.0.tar.gz", hash = "sha256:df7aa8afb0148fa78488e7899b2c59b5f4ffcfa82e6c54ccb9dd37c1d7b52d54"},
+]
+
+[package.extras]
+brotli = ["brotli (>=1.0.9)", "brotlicffi (>=0.8.0)"]
+socks = ["pysocks (>=1.5.6,!=1.5.7,<2.0)"]
+zstd = ["zstandard (>=0.18.0)"]
+
+[[package]]
+name = "urwid"
+version = "2.2.3"
+description = "A full-featured console (xterm et al.) user interface library"
+optional = false
+python-versions = ">=3.7.0"
+files = [
+ {file = "urwid-2.2.3-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:7bbc35b54546975df692ab198a272eb459f883dc9b20a19d56eb19ff50838e9a"},
+ {file = "urwid-2.2.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:64a3d49f5a8d083198a6bd80ea4c93f45ab1e0cc0735433217925b5df7c32c86"},
+ {file = "urwid-2.2.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:c1c9c088dc9aff393489c61edd35e3a16930f9b62da3c78e419fc0880aa1291f"},
+ {file = "urwid-2.2.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:746dfc58c745360705d004f75c8799fa6782ebb635666ad36f6e0e3e5fada8fe"},
+ {file = "urwid-2.2.3-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:604facd127f7d9b535885291154144611fa0aad52f144e88e92e676e4fa09792"},
+ {file = "urwid-2.2.3-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4e241ea0cc3b9f62e74749a143118877cc04a49c00688acd0ecd97cfc907027b"},
+ {file = "urwid-2.2.3-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:0607961f0ce4a60fd4701138bcd198579caafdc020c11fff2db8c7d295786817"},
+ {file = "urwid-2.2.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:b17dd1dd21926ca1dfbb7b0cfd43f18afe087fba2f488d29795d05a1fe763449"},
+ {file = "urwid-2.2.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:deb48828224cdc8a70269973ebe2830de5ab05d9837651af529418ec0de06355"},
+ {file = "urwid-2.2.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7264f82f765339218297b09441d35f5bf90e3bb800a413b5116949729f91ba04"},
+ {file = "urwid-2.2.3-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1bbb1a2b8beecdaea4b2f6657efb6ca62c53e4156cfae156cb96bab90c738147"},
+ {file = "urwid-2.2.3-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cc1b894918813f170dff2a3f0127e972cfb7c6def3f1fb819a09d903d1383d15"},
+ {file = "urwid-2.2.3-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:b3aab4fedbb2fa1b7c0d8fb1c537285c16a46e6c72b54ca4423b779306662f7f"},
+ {file = "urwid-2.2.3-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:8f73bb89aa79fd4604d24d59c3093adc6d472a22f604fad4df140b124ee9edcd"},
+ {file = "urwid-2.2.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:f7a9fb6d13595fa2f51a2c9927559c9d3706e1a788cbaf2d661631c65b5162bd"},
+ {file = "urwid-2.2.3-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:efcff1822c71d4f9980c75bbfd91f9b45739c629b0b881646f9fa9dcf8bac27c"},
+ {file = "urwid-2.2.3-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0719114584eeda539e4dd649e8e434a64d0a38ba9769fe4f80d1286e19850713"},
+ {file = "urwid-2.2.3-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5706994d3197124ffc57762e8d088b492b2e89f4d1b21cf51a9199d67355c4f3"},
+ {file = "urwid-2.2.3-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:b0f9f62a82df0cfb15e8a23ae1f6e6fa856c3415677d98724bc2b8a5702477d1"},
+ {file = "urwid-2.2.3-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:36a856fd0cb38c05fda2ee785f395684ea4f682b1f830ccdab7d0784543f9d13"},
+ {file = "urwid-2.2.3-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f55eb74095dcbeb0f53dc32b7d809d5c34792c7b9b372c3d24fe1ffaaef1863b"},
+ {file = "urwid-2.2.3-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:59dac9f19020f53a9400f8a0ba2b18b4389fd1deeab88c8319736fd108244d72"},
+ {file = "urwid-2.2.3-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:5a4ee4072e64b414075f32373fc5f63967a4686708ada3e8f8df52d4a2ada8a7"},
+ {file = "urwid-2.2.3-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:bd036997b600c84b33c7bc49b98f029990f49a70d4b21d3399ae7aeba73f0c4e"},
+ {file = "urwid-2.2.3-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:c094b9d00aeb95496372bc27d5c3a2127546f2efc75cafcad019a99c4ab98d9b"},
+ {file = "urwid-2.2.3-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:42224c6aca61459b992c30b6740cbe9f4f0f420e8770a9345b7f3f09f19b2409"},
+ {file = "urwid-2.2.3-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:efc234c8d74bf839896eeae9333be91e0fa832dee552f2c764e300080d06d2e2"},
+ {file = "urwid-2.2.3-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bf7819bd19ceaa9c1baa5bd50d304b5d4d759591e6a2a7edb1727d1a9f16782d"},
+ {file = "urwid-2.2.3-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:cd8c5f617807f2a8bb5750f851edd3305fb0417230c04b84f4782c51c58c19ea"},
+ {file = "urwid-2.2.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:b50c7a06a620320b5c124fb3af7d339f7720fec29bf49d5486ec4115ec3df8ff"},
+ {file = "urwid-2.2.3-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:58950a17f3917b4a4a44e167d2ed1d59931f71a1be927c4d0204a035c51ebfd2"},
+ {file = "urwid-2.2.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c4352f2a971c7b9dc236d5fce7c4492858441344ead85ce4b1cb1dd513098bbe"},
+ {file = "urwid-2.2.3-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:80260cf2bd4be3eca611e978ee2926fc0338e9550702c77932efc80ca6b0b09d"},
+ {file = "urwid-2.2.3-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:238ec0be47cbca99320f12864143638e4ebd1722a509f8037ff92ef66b0e9394"},
+ {file = "urwid-2.2.3.tar.gz", hash = "sha256:e4516d55dcee6bd012b3e72a10c75f2866c63a740f0ec4e1ada05c1e1cc02e34"},
+]
+
+[package.extras]
+glib = ["PyGObject"]
+lcd = ["pyserial"]
+serial = ["pyserial"]
+tornado = ["tornado"]
+trio = ["trio"]
+twisted = ["twisted"]
+zmq = ["zmq"]
+
+[[package]]
+name = "urwid-readline"
+version = "0.13"
+description = "A textbox edit widget for urwid that supports readline shortcuts"
+optional = false
+python-versions = "*"
+files = [
+ {file = "urwid_readline-0.13.tar.gz", hash = "sha256:018020cbc864bb5ed87be17dc26b069eae2755cb29f3a9c569aac3bded1efaf4"},
+]
+
+[package.dependencies]
+urwid = "*"
+
+[package.extras]
+dev = ["black", "pytest"]
+
+[[package]]
+name = "uvicorn"
+version = "0.24.0.post1"
+description = "The lightning-fast ASGI server."
+optional = false
+python-versions = ">=3.8"
+files = [
+ {file = "uvicorn-0.24.0.post1-py3-none-any.whl", hash = "sha256:7c84fea70c619d4a710153482c0d230929af7bcf76c7bfa6de151f0a3a80121e"},
+ {file = "uvicorn-0.24.0.post1.tar.gz", hash = "sha256:09c8e5a79dc466bdf28dead50093957db184de356fcdc48697bad3bde4c2588e"},
+]
+
+[package.dependencies]
+click = ">=7.0"
+colorama = {version = ">=0.4", optional = true, markers = "sys_platform == \"win32\" and extra == \"standard\""}
+h11 = ">=0.8"
+httptools = {version = ">=0.5.0", optional = true, markers = "extra == \"standard\""}
+python-dotenv = {version = ">=0.13", optional = true, markers = "extra == \"standard\""}
+pyyaml = {version = ">=5.1", optional = true, markers = "extra == \"standard\""}
+typing-extensions = {version = ">=4.0", markers = "python_version < \"3.11\""}
+uvloop = {version = ">=0.14.0,<0.15.0 || >0.15.0,<0.15.1 || >0.15.1", optional = true, markers = "(sys_platform != \"win32\" and sys_platform != \"cygwin\") and platform_python_implementation != \"PyPy\" and extra == \"standard\""}
+watchfiles = {version = ">=0.13", optional = true, markers = "extra == \"standard\""}
+websockets = {version = ">=10.4", optional = true, markers = "extra == \"standard\""}
+
+[package.extras]
+standard = ["colorama (>=0.4)", "httptools (>=0.5.0)", "python-dotenv (>=0.13)", "pyyaml (>=5.1)", "uvloop (>=0.14.0,!=0.15.0,!=0.15.1)", "watchfiles (>=0.13)", "websockets (>=10.4)"]
+
+[[package]]
+name = "uvloop"
+version = "0.19.0"
+description = "Fast implementation of asyncio event loop on top of libuv"
+optional = false
+python-versions = ">=3.8.0"
+files = [
+ {file = "uvloop-0.19.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:de4313d7f575474c8f5a12e163f6d89c0a878bc49219641d49e6f1444369a90e"},
+ {file = "uvloop-0.19.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:5588bd21cf1fcf06bded085f37e43ce0e00424197e7c10e77afd4bbefffef428"},
+ {file = "uvloop-0.19.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7b1fd71c3843327f3bbc3237bedcdb6504fd50368ab3e04d0410e52ec293f5b8"},
+ {file = "uvloop-0.19.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5a05128d315e2912791de6088c34136bfcdd0c7cbc1cf85fd6fd1bb321b7c849"},
+ {file = "uvloop-0.19.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:cd81bdc2b8219cb4b2556eea39d2e36bfa375a2dd021404f90a62e44efaaf957"},
+ {file = "uvloop-0.19.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:5f17766fb6da94135526273080f3455a112f82570b2ee5daa64d682387fe0dcd"},
+ {file = "uvloop-0.19.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:4ce6b0af8f2729a02a5d1575feacb2a94fc7b2e983868b009d51c9a9d2149bef"},
+ {file = "uvloop-0.19.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:31e672bb38b45abc4f26e273be83b72a0d28d074d5b370fc4dcf4c4eb15417d2"},
+ {file = "uvloop-0.19.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:570fc0ed613883d8d30ee40397b79207eedd2624891692471808a95069a007c1"},
+ {file = "uvloop-0.19.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5138821e40b0c3e6c9478643b4660bd44372ae1e16a322b8fc07478f92684e24"},
+ {file = "uvloop-0.19.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:91ab01c6cd00e39cde50173ba4ec68a1e578fee9279ba64f5221810a9e786533"},
+ {file = "uvloop-0.19.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:47bf3e9312f63684efe283f7342afb414eea4d3011542155c7e625cd799c3b12"},
+ {file = "uvloop-0.19.0-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:da8435a3bd498419ee8c13c34b89b5005130a476bda1d6ca8cfdde3de35cd650"},
+ {file = "uvloop-0.19.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:02506dc23a5d90e04d4f65c7791e65cf44bd91b37f24cfc3ef6cf2aff05dc7ec"},
+ {file = "uvloop-0.19.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2693049be9d36fef81741fddb3f441673ba12a34a704e7b4361efb75cf30befc"},
+ {file = "uvloop-0.19.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7010271303961c6f0fe37731004335401eb9075a12680738731e9c92ddd96ad6"},
+ {file = "uvloop-0.19.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:5daa304d2161d2918fa9a17d5635099a2f78ae5b5960e742b2fcfbb7aefaa593"},
+ {file = "uvloop-0.19.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:7207272c9520203fea9b93843bb775d03e1cf88a80a936ce760f60bb5add92f3"},
+ {file = "uvloop-0.19.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:78ab247f0b5671cc887c31d33f9b3abfb88d2614b84e4303f1a63b46c046c8bd"},
+ {file = "uvloop-0.19.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:472d61143059c84947aa8bb74eabbace30d577a03a1805b77933d6bd13ddebbd"},
+ {file = "uvloop-0.19.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:45bf4c24c19fb8a50902ae37c5de50da81de4922af65baf760f7c0c42e1088be"},
+ {file = "uvloop-0.19.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:271718e26b3e17906b28b67314c45d19106112067205119dddbd834c2b7ce797"},
+ {file = "uvloop-0.19.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:34175c9fd2a4bc3adc1380e1261f60306344e3407c20a4d684fd5f3be010fa3d"},
+ {file = "uvloop-0.19.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:e27f100e1ff17f6feeb1f33968bc185bf8ce41ca557deee9d9bbbffeb72030b7"},
+ {file = "uvloop-0.19.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:13dfdf492af0aa0a0edf66807d2b465607d11c4fa48f4a1fd41cbea5b18e8e8b"},
+ {file = "uvloop-0.19.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:6e3d4e85ac060e2342ff85e90d0c04157acb210b9ce508e784a944f852a40e67"},
+ {file = "uvloop-0.19.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8ca4956c9ab567d87d59d49fa3704cf29e37109ad348f2d5223c9bf761a332e7"},
+ {file = "uvloop-0.19.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f467a5fd23b4fc43ed86342641f3936a68ded707f4627622fa3f82a120e18256"},
+ {file = "uvloop-0.19.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:492e2c32c2af3f971473bc22f086513cedfc66a130756145a931a90c3958cb17"},
+ {file = "uvloop-0.19.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:2df95fca285a9f5bfe730e51945ffe2fa71ccbfdde3b0da5772b4ee4f2e770d5"},
+ {file = "uvloop-0.19.0.tar.gz", hash = "sha256:0246f4fd1bf2bf702e06b0d45ee91677ee5c31242f39aab4ea6fe0c51aedd0fd"},
+]
+
+[package.extras]
+docs = ["Sphinx (>=4.1.2,<4.2.0)", "sphinx-rtd-theme (>=0.5.2,<0.6.0)", "sphinxcontrib-asyncio (>=0.3.0,<0.4.0)"]
+test = ["Cython (>=0.29.36,<0.30.0)", "aiohttp (==3.9.0b0)", "aiohttp (>=3.8.1)", "flake8 (>=5.0,<6.0)", "mypy (>=0.800)", "psutil", "pyOpenSSL (>=23.0.0,<23.1.0)", "pycodestyle (>=2.9.0,<2.10.0)"]
+
+[[package]]
+name = "virtualenv"
+version = "20.24.7"
+description = "Virtual Python Environment builder"
+optional = false
+python-versions = ">=3.7"
+files = [
+ {file = "virtualenv-20.24.7-py3-none-any.whl", hash = "sha256:a18b3fd0314ca59a2e9f4b556819ed07183b3e9a3702ecfe213f593d44f7b3fd"},
+ {file = "virtualenv-20.24.7.tar.gz", hash = "sha256:69050ffb42419c91f6c1284a7b24e0475d793447e35929b488bf6a0aade39353"},
+]
+
+[package.dependencies]
+distlib = ">=0.3.7,<1"
+filelock = ">=3.12.2,<4"
+platformdirs = ">=3.9.1,<5"
+
+[package.extras]
+docs = ["furo (>=2023.7.26)", "proselint (>=0.13)", "sphinx (>=7.1.2)", "sphinx-argparse (>=0.4)", "sphinxcontrib-towncrier (>=0.2.1a0)", "towncrier (>=23.6)"]
+test = ["covdefaults (>=2.3)", "coverage (>=7.2.7)", "coverage-enable-subprocess (>=1)", "flaky (>=3.7)", "packaging (>=23.1)", "pytest (>=7.4)", "pytest-env (>=0.8.2)", "pytest-freezer (>=0.4.8)", "pytest-mock (>=3.11.1)", "pytest-randomly (>=3.12)", "pytest-timeout (>=2.1)", "setuptools (>=68)", "time-machine (>=2.10)"]
+
+[[package]]
+name = "watchfiles"
+version = "0.21.0"
+description = "Simple, modern and high performance file watching and code reload in python."
+optional = false
+python-versions = ">=3.8"
+files = [
+ {file = "watchfiles-0.21.0-cp310-cp310-macosx_10_7_x86_64.whl", hash = "sha256:27b4035013f1ea49c6c0b42d983133b136637a527e48c132d368eb19bf1ac6aa"},
+ {file = "watchfiles-0.21.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:c81818595eff6e92535ff32825f31c116f867f64ff8cdf6562cd1d6b2e1e8f3e"},
+ {file = "watchfiles-0.21.0-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:6c107ea3cf2bd07199d66f156e3ea756d1b84dfd43b542b2d870b77868c98c03"},
+ {file = "watchfiles-0.21.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0d9ac347653ebd95839a7c607608703b20bc07e577e870d824fa4801bc1cb124"},
+ {file = "watchfiles-0.21.0-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:5eb86c6acb498208e7663ca22dbe68ca2cf42ab5bf1c776670a50919a56e64ab"},
+ {file = "watchfiles-0.21.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f564bf68404144ea6b87a78a3f910cc8de216c6b12a4cf0b27718bf4ec38d303"},
+ {file = "watchfiles-0.21.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3d0f32ebfaa9c6011f8454994f86108c2eb9c79b8b7de00b36d558cadcedaa3d"},
+ {file = "watchfiles-0.21.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b6d45d9b699ecbac6c7bd8e0a2609767491540403610962968d258fd6405c17c"},
+ {file = "watchfiles-0.21.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:aff06b2cac3ef4616e26ba17a9c250c1fe9dd8a5d907d0193f84c499b1b6e6a9"},
+ {file = "watchfiles-0.21.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:d9792dff410f266051025ecfaa927078b94cc7478954b06796a9756ccc7e14a9"},
+ {file = "watchfiles-0.21.0-cp310-none-win32.whl", hash = "sha256:214cee7f9e09150d4fb42e24919a1e74d8c9b8a9306ed1474ecaddcd5479c293"},
+ {file = "watchfiles-0.21.0-cp310-none-win_amd64.whl", hash = "sha256:1ad7247d79f9f55bb25ab1778fd47f32d70cf36053941f07de0b7c4e96b5d235"},
+ {file = "watchfiles-0.21.0-cp311-cp311-macosx_10_7_x86_64.whl", hash = "sha256:668c265d90de8ae914f860d3eeb164534ba2e836811f91fecc7050416ee70aa7"},
+ {file = "watchfiles-0.21.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:3a23092a992e61c3a6a70f350a56db7197242f3490da9c87b500f389b2d01eef"},
+ {file = "watchfiles-0.21.0-cp311-cp311-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:e7941bbcfdded9c26b0bf720cb7e6fd803d95a55d2c14b4bd1f6a2772230c586"},
+ {file = "watchfiles-0.21.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:11cd0c3100e2233e9c53106265da31d574355c288e15259c0d40a4405cbae317"},
+ {file = "watchfiles-0.21.0-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:d78f30cbe8b2ce770160d3c08cff01b2ae9306fe66ce899b73f0409dc1846c1b"},
+ {file = "watchfiles-0.21.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:6674b00b9756b0af620aa2a3346b01f8e2a3dc729d25617e1b89cf6af4a54eb1"},
+ {file = "watchfiles-0.21.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:fd7ac678b92b29ba630d8c842d8ad6c555abda1b9ef044d6cc092dacbfc9719d"},
+ {file = "watchfiles-0.21.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9c873345680c1b87f1e09e0eaf8cf6c891b9851d8b4d3645e7efe2ec20a20cc7"},
+ {file = "watchfiles-0.21.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:49f56e6ecc2503e7dbe233fa328b2be1a7797d31548e7a193237dcdf1ad0eee0"},
+ {file = "watchfiles-0.21.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:02d91cbac553a3ad141db016e3350b03184deaafeba09b9d6439826ee594b365"},
+ {file = "watchfiles-0.21.0-cp311-none-win32.whl", hash = "sha256:ebe684d7d26239e23d102a2bad2a358dedf18e462e8808778703427d1f584400"},
+ {file = "watchfiles-0.21.0-cp311-none-win_amd64.whl", hash = "sha256:4566006aa44cb0d21b8ab53baf4b9c667a0ed23efe4aaad8c227bfba0bf15cbe"},
+ {file = "watchfiles-0.21.0-cp311-none-win_arm64.whl", hash = "sha256:c550a56bf209a3d987d5a975cdf2063b3389a5d16caf29db4bdddeae49f22078"},
+ {file = "watchfiles-0.21.0-cp312-cp312-macosx_10_7_x86_64.whl", hash = "sha256:51ddac60b96a42c15d24fbdc7a4bfcd02b5a29c047b7f8bf63d3f6f5a860949a"},
+ {file = "watchfiles-0.21.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:511f0b034120cd1989932bf1e9081aa9fb00f1f949fbd2d9cab6264916ae89b1"},
+ {file = "watchfiles-0.21.0-cp312-cp312-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:cfb92d49dbb95ec7a07511bc9efb0faff8fe24ef3805662b8d6808ba8409a71a"},
+ {file = "watchfiles-0.21.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3f92944efc564867bbf841c823c8b71bb0be75e06b8ce45c084b46411475a915"},
+ {file = "watchfiles-0.21.0-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:642d66b75eda909fd1112d35c53816d59789a4b38c141a96d62f50a3ef9b3360"},
+ {file = "watchfiles-0.21.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d23bcd6c8eaa6324fe109d8cac01b41fe9a54b8c498af9ce464c1aeeb99903d6"},
+ {file = "watchfiles-0.21.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:18d5b4da8cf3e41895b34e8c37d13c9ed294954907929aacd95153508d5d89d7"},
+ {file = "watchfiles-0.21.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1b8d1eae0f65441963d805f766c7e9cd092f91e0c600c820c764a4ff71a0764c"},
+ {file = "watchfiles-0.21.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:1fd9a5205139f3c6bb60d11f6072e0552f0a20b712c85f43d42342d162be1235"},
+ {file = "watchfiles-0.21.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:a1e3014a625bcf107fbf38eece0e47fa0190e52e45dc6eee5a8265ddc6dc5ea7"},
+ {file = "watchfiles-0.21.0-cp312-none-win32.whl", hash = "sha256:9d09869f2c5a6f2d9df50ce3064b3391d3ecb6dced708ad64467b9e4f2c9bef3"},
+ {file = "watchfiles-0.21.0-cp312-none-win_amd64.whl", hash = "sha256:18722b50783b5e30a18a8a5db3006bab146d2b705c92eb9a94f78c72beb94094"},
+ {file = "watchfiles-0.21.0-cp312-none-win_arm64.whl", hash = "sha256:a3b9bec9579a15fb3ca2d9878deae789df72f2b0fdaf90ad49ee389cad5edab6"},
+ {file = "watchfiles-0.21.0-cp38-cp38-macosx_10_7_x86_64.whl", hash = "sha256:4ea10a29aa5de67de02256a28d1bf53d21322295cb00bd2d57fcd19b850ebd99"},
+ {file = "watchfiles-0.21.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:40bca549fdc929b470dd1dbfcb47b3295cb46a6d2c90e50588b0a1b3bd98f429"},
+ {file = "watchfiles-0.21.0-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:9b37a7ba223b2f26122c148bb8d09a9ff312afca998c48c725ff5a0a632145f7"},
+ {file = "watchfiles-0.21.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ec8c8900dc5c83650a63dd48c4d1d245343f904c4b64b48798c67a3767d7e165"},
+ {file = "watchfiles-0.21.0-cp38-cp38-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:8ad3fe0a3567c2f0f629d800409cd528cb6251da12e81a1f765e5c5345fd0137"},
+ {file = "watchfiles-0.21.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9d353c4cfda586db2a176ce42c88f2fc31ec25e50212650c89fdd0f560ee507b"},
+ {file = "watchfiles-0.21.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:83a696da8922314ff2aec02987eefb03784f473281d740bf9170181829133765"},
+ {file = "watchfiles-0.21.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5a03651352fc20975ee2a707cd2d74a386cd303cc688f407296064ad1e6d1562"},
+ {file = "watchfiles-0.21.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:3ad692bc7792be8c32918c699638b660c0de078a6cbe464c46e1340dadb94c19"},
+ {file = "watchfiles-0.21.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:06247538e8253975bdb328e7683f8515ff5ff041f43be6c40bff62d989b7d0b0"},
+ {file = "watchfiles-0.21.0-cp38-none-win32.whl", hash = "sha256:9a0aa47f94ea9a0b39dd30850b0adf2e1cd32a8b4f9c7aa443d852aacf9ca214"},
+ {file = "watchfiles-0.21.0-cp38-none-win_amd64.whl", hash = "sha256:8d5f400326840934e3507701f9f7269247f7c026d1b6cfd49477d2be0933cfca"},
+ {file = "watchfiles-0.21.0-cp39-cp39-macosx_10_7_x86_64.whl", hash = "sha256:7f762a1a85a12cc3484f77eee7be87b10f8c50b0b787bb02f4e357403cad0c0e"},
+ {file = "watchfiles-0.21.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:6e9be3ef84e2bb9710f3f777accce25556f4a71e15d2b73223788d528fcc2052"},
+ {file = "watchfiles-0.21.0-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:4c48a10d17571d1275701e14a601e36959ffada3add8cdbc9e5061a6e3579a5d"},
+ {file = "watchfiles-0.21.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6c889025f59884423428c261f212e04d438de865beda0b1e1babab85ef4c0f01"},
+ {file = "watchfiles-0.21.0-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:66fac0c238ab9a2e72d026b5fb91cb902c146202bbd29a9a1a44e8db7b710b6f"},
+ {file = "watchfiles-0.21.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b4a21f71885aa2744719459951819e7bf5a906a6448a6b2bbce8e9cc9f2c8128"},
+ {file = "watchfiles-0.21.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1c9198c989f47898b2c22201756f73249de3748e0fc9de44adaf54a8b259cc0c"},
+ {file = "watchfiles-0.21.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d8f57c4461cd24fda22493109c45b3980863c58a25b8bec885ca8bea6b8d4b28"},
+ {file = "watchfiles-0.21.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:853853cbf7bf9408b404754b92512ebe3e3a83587503d766d23e6bf83d092ee6"},
+ {file = "watchfiles-0.21.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:d5b1dc0e708fad9f92c296ab2f948af403bf201db8fb2eb4c8179db143732e49"},
+ {file = "watchfiles-0.21.0-cp39-none-win32.whl", hash = "sha256:59137c0c6826bd56c710d1d2bda81553b5e6b7c84d5a676747d80caf0409ad94"},
+ {file = "watchfiles-0.21.0-cp39-none-win_amd64.whl", hash = "sha256:6cb8fdc044909e2078c248986f2fc76f911f72b51ea4a4fbbf472e01d14faa58"},
+ {file = "watchfiles-0.21.0-pp310-pypy310_pp73-macosx_10_7_x86_64.whl", hash = "sha256:ab03a90b305d2588e8352168e8c5a1520b721d2d367f31e9332c4235b30b8994"},
+ {file = "watchfiles-0.21.0-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:927c589500f9f41e370b0125c12ac9e7d3a2fd166b89e9ee2828b3dda20bfe6f"},
+ {file = "watchfiles-0.21.0-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1bd467213195e76f838caf2c28cd65e58302d0254e636e7c0fca81efa4a2e62c"},
+ {file = "watchfiles-0.21.0-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:02b73130687bc3f6bb79d8a170959042eb56eb3a42df3671c79b428cd73f17cc"},
+ {file = "watchfiles-0.21.0-pp38-pypy38_pp73-macosx_10_7_x86_64.whl", hash = "sha256:08dca260e85ffae975448e344834d765983237ad6dc308231aa16e7933db763e"},
+ {file = "watchfiles-0.21.0-pp38-pypy38_pp73-macosx_11_0_arm64.whl", hash = "sha256:3ccceb50c611c433145502735e0370877cced72a6c70fd2410238bcbc7fe51d8"},
+ {file = "watchfiles-0.21.0-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:57d430f5fb63fea141ab71ca9c064e80de3a20b427ca2febcbfcef70ff0ce895"},
+ {file = "watchfiles-0.21.0-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0dd5fad9b9c0dd89904bbdea978ce89a2b692a7ee8a0ce19b940e538c88a809c"},
+ {file = "watchfiles-0.21.0-pp39-pypy39_pp73-macosx_10_7_x86_64.whl", hash = "sha256:be6dd5d52b73018b21adc1c5d28ac0c68184a64769052dfeb0c5d9998e7f56a2"},
+ {file = "watchfiles-0.21.0-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:b3cab0e06143768499384a8a5efb9c4dc53e19382952859e4802f294214f36ec"},
+ {file = "watchfiles-0.21.0-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8c6ed10c2497e5fedadf61e465b3ca12a19f96004c15dcffe4bd442ebadc2d85"},
+ {file = "watchfiles-0.21.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:43babacef21c519bc6631c5fce2a61eccdfc011b4bcb9047255e9620732c8097"},
+ {file = "watchfiles-0.21.0.tar.gz", hash = "sha256:c76c635fabf542bb78524905718c39f736a98e5ab25b23ec6d4abede1a85a6a3"},
+]
+
+[package.dependencies]
+anyio = ">=3.0.0"
+
+[[package]]
+name = "wcwidth"
+version = "0.2.12"
+description = "Measures the displayed width of unicode strings in a terminal"
+optional = false
+python-versions = "*"
+files = [
+ {file = "wcwidth-0.2.12-py2.py3-none-any.whl", hash = "sha256:f26ec43d96c8cbfed76a5075dac87680124fa84e0855195a6184da9c187f133c"},
+ {file = "wcwidth-0.2.12.tar.gz", hash = "sha256:f01c104efdf57971bcb756f054dd58ddec5204dd15fa31d6503ea57947d97c02"},
+]
+
+[[package]]
+name = "webcolors"
+version = "1.13"
+description = "A library for working with the color formats defined by HTML and CSS."
+optional = false
+python-versions = ">=3.7"
+files = [
+ {file = "webcolors-1.13-py3-none-any.whl", hash = "sha256:29bc7e8752c0a1bd4a1f03c14d6e6a72e93d82193738fa860cbff59d0fcc11bf"},
+ {file = "webcolors-1.13.tar.gz", hash = "sha256:c225b674c83fa923be93d235330ce0300373d02885cef23238813b0d5668304a"},
+]
+
+[package.extras]
+docs = ["furo", "sphinx", "sphinx-copybutton", "sphinx-inline-tabs", "sphinx-notfound-page", "sphinxext-opengraph"]
+tests = ["pytest", "pytest-cov"]
+
+[[package]]
+name = "webencodings"
+version = "0.5.1"
+description = "Character encoding aliases for legacy web content"
+optional = false
+python-versions = "*"
+files = [
+ {file = "webencodings-0.5.1-py2.py3-none-any.whl", hash = "sha256:a0af1213f3c2226497a97e2b3aa01a7e4bee4f403f95be16fc9acd2947514a78"},
+ {file = "webencodings-0.5.1.tar.gz", hash = "sha256:b36a1c245f2d304965eb4e0a82848379241dc04b865afcc4aab16748587e1923"},
+]
+
+[[package]]
+name = "websocket-client"
+version = "1.6.4"
+description = "WebSocket client for Python with low level API options"
+optional = false
+python-versions = ">=3.8"
+files = [
+ {file = "websocket-client-1.6.4.tar.gz", hash = "sha256:b3324019b3c28572086c4a319f91d1dcd44e6e11cd340232978c684a7650d0df"},
+ {file = "websocket_client-1.6.4-py3-none-any.whl", hash = "sha256:084072e0a7f5f347ef2ac3d8698a5e0b4ffbfcab607628cadabc650fc9a83a24"},
+]
+
+[package.extras]
+docs = ["Sphinx (>=6.0)", "sphinx-rtd-theme (>=1.1.0)"]
+optional = ["python-socks", "wsaccel"]
+test = ["websockets"]
+
+[[package]]
+name = "websockets"
+version = "12.0"
+description = "An implementation of the WebSocket Protocol (RFC 6455 & 7692)"
+optional = false
+python-versions = ">=3.8"
+files = [
+ {file = "websockets-12.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:d554236b2a2006e0ce16315c16eaa0d628dab009c33b63ea03f41c6107958374"},
+ {file = "websockets-12.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:2d225bb6886591b1746b17c0573e29804619c8f755b5598d875bb4235ea639be"},
+ {file = "websockets-12.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:eb809e816916a3b210bed3c82fb88eaf16e8afcf9c115ebb2bacede1797d2547"},
+ {file = "websockets-12.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c588f6abc13f78a67044c6b1273a99e1cf31038ad51815b3b016ce699f0d75c2"},
+ {file = "websockets-12.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5aa9348186d79a5f232115ed3fa9020eab66d6c3437d72f9d2c8ac0c6858c558"},
+ {file = "websockets-12.0-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6350b14a40c95ddd53e775dbdbbbc59b124a5c8ecd6fbb09c2e52029f7a9f480"},
+ {file = "websockets-12.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:70ec754cc2a769bcd218ed8d7209055667b30860ffecb8633a834dde27d6307c"},
+ {file = "websockets-12.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:6e96f5ed1b83a8ddb07909b45bd94833b0710f738115751cdaa9da1fb0cb66e8"},
+ {file = "websockets-12.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:4d87be612cbef86f994178d5186add3d94e9f31cc3cb499a0482b866ec477603"},
+ {file = "websockets-12.0-cp310-cp310-win32.whl", hash = "sha256:befe90632d66caaf72e8b2ed4d7f02b348913813c8b0a32fae1cc5fe3730902f"},
+ {file = "websockets-12.0-cp310-cp310-win_amd64.whl", hash = "sha256:363f57ca8bc8576195d0540c648aa58ac18cf85b76ad5202b9f976918f4219cf"},
+ {file = "websockets-12.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:5d873c7de42dea355d73f170be0f23788cf3fa9f7bed718fd2830eefedce01b4"},
+ {file = "websockets-12.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:3f61726cae9f65b872502ff3c1496abc93ffbe31b278455c418492016e2afc8f"},
+ {file = "websockets-12.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:ed2fcf7a07334c77fc8a230755c2209223a7cc44fc27597729b8ef5425aa61a3"},
+ {file = "websockets-12.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8e332c210b14b57904869ca9f9bf4ca32f5427a03eeb625da9b616c85a3a506c"},
+ {file = "websockets-12.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5693ef74233122f8ebab026817b1b37fe25c411ecfca084b29bc7d6efc548f45"},
+ {file = "websockets-12.0-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6e9e7db18b4539a29cc5ad8c8b252738a30e2b13f033c2d6e9d0549b45841c04"},
+ {file = "websockets-12.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:6e2df67b8014767d0f785baa98393725739287684b9f8d8a1001eb2839031447"},
+ {file = "websockets-12.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:bea88d71630c5900690fcb03161ab18f8f244805c59e2e0dc4ffadae0a7ee0ca"},
+ {file = "websockets-12.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:dff6cdf35e31d1315790149fee351f9e52978130cef6c87c4b6c9b3baf78bc53"},
+ {file = "websockets-12.0-cp311-cp311-win32.whl", hash = "sha256:3e3aa8c468af01d70332a382350ee95f6986db479ce7af14d5e81ec52aa2b402"},
+ {file = "websockets-12.0-cp311-cp311-win_amd64.whl", hash = "sha256:25eb766c8ad27da0f79420b2af4b85d29914ba0edf69f547cc4f06ca6f1d403b"},
+ {file = "websockets-12.0-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:0e6e2711d5a8e6e482cacb927a49a3d432345dfe7dea8ace7b5790df5932e4df"},
+ {file = "websockets-12.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:dbcf72a37f0b3316e993e13ecf32f10c0e1259c28ffd0a85cee26e8549595fbc"},
+ {file = "websockets-12.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:12743ab88ab2af1d17dd4acb4645677cb7063ef4db93abffbf164218a5d54c6b"},
+ {file = "websockets-12.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7b645f491f3c48d3f8a00d1fce07445fab7347fec54a3e65f0725d730d5b99cb"},
+ {file = "websockets-12.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9893d1aa45a7f8b3bc4510f6ccf8db8c3b62120917af15e3de247f0780294b92"},
+ {file = "websockets-12.0-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1f38a7b376117ef7aff996e737583172bdf535932c9ca021746573bce40165ed"},
+ {file = "websockets-12.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:f764ba54e33daf20e167915edc443b6f88956f37fb606449b4a5b10ba42235a5"},
+ {file = "websockets-12.0-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:1e4b3f8ea6a9cfa8be8484c9221ec0257508e3a1ec43c36acdefb2a9c3b00aa2"},
+ {file = "websockets-12.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:9fdf06fd06c32205a07e47328ab49c40fc1407cdec801d698a7c41167ea45113"},
+ {file = "websockets-12.0-cp312-cp312-win32.whl", hash = "sha256:baa386875b70cbd81798fa9f71be689c1bf484f65fd6fb08d051a0ee4e79924d"},
+ {file = "websockets-12.0-cp312-cp312-win_amd64.whl", hash = "sha256:ae0a5da8f35a5be197f328d4727dbcfafa53d1824fac3d96cdd3a642fe09394f"},
+ {file = "websockets-12.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:5f6ffe2c6598f7f7207eef9a1228b6f5c818f9f4d53ee920aacd35cec8110438"},
+ {file = "websockets-12.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:9edf3fc590cc2ec20dc9d7a45108b5bbaf21c0d89f9fd3fd1685e223771dc0b2"},
+ {file = "websockets-12.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:8572132c7be52632201a35f5e08348137f658e5ffd21f51f94572ca6c05ea81d"},
+ {file = "websockets-12.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:604428d1b87edbf02b233e2c207d7d528460fa978f9e391bd8aaf9c8311de137"},
+ {file = "websockets-12.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1a9d160fd080c6285e202327aba140fc9a0d910b09e423afff4ae5cbbf1c7205"},
+ {file = "websockets-12.0-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:87b4aafed34653e465eb77b7c93ef058516cb5acf3eb21e42f33928616172def"},
+ {file = "websockets-12.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:b2ee7288b85959797970114deae81ab41b731f19ebcd3bd499ae9ca0e3f1d2c8"},
+ {file = "websockets-12.0-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:7fa3d25e81bfe6a89718e9791128398a50dec6d57faf23770787ff441d851967"},
+ {file = "websockets-12.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:a571f035a47212288e3b3519944f6bf4ac7bc7553243e41eac50dd48552b6df7"},
+ {file = "websockets-12.0-cp38-cp38-win32.whl", hash = "sha256:3c6cc1360c10c17463aadd29dd3af332d4a1adaa8796f6b0e9f9df1fdb0bad62"},
+ {file = "websockets-12.0-cp38-cp38-win_amd64.whl", hash = "sha256:1bf386089178ea69d720f8db6199a0504a406209a0fc23e603b27b300fdd6892"},
+ {file = "websockets-12.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:ab3d732ad50a4fbd04a4490ef08acd0517b6ae6b77eb967251f4c263011a990d"},
+ {file = "websockets-12.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:a1d9697f3337a89691e3bd8dc56dea45a6f6d975f92e7d5f773bc715c15dde28"},
+ {file = "websockets-12.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:1df2fbd2c8a98d38a66f5238484405b8d1d16f929bb7a33ed73e4801222a6f53"},
+ {file = "websockets-12.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:23509452b3bc38e3a057382c2e941d5ac2e01e251acce7adc74011d7d8de434c"},
+ {file = "websockets-12.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2e5fc14ec6ea568200ea4ef46545073da81900a2b67b3e666f04adf53ad452ec"},
+ {file = "websockets-12.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:46e71dbbd12850224243f5d2aeec90f0aaa0f2dde5aeeb8fc8df21e04d99eff9"},
+ {file = "websockets-12.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:b81f90dcc6c85a9b7f29873beb56c94c85d6f0dac2ea8b60d995bd18bf3e2aae"},
+ {file = "websockets-12.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:a02413bc474feda2849c59ed2dfb2cddb4cd3d2f03a2fedec51d6e959d9b608b"},
+ {file = "websockets-12.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:bbe6013f9f791944ed31ca08b077e26249309639313fff132bfbf3ba105673b9"},
+ {file = "websockets-12.0-cp39-cp39-win32.whl", hash = "sha256:cbe83a6bbdf207ff0541de01e11904827540aa069293696dd528a6640bd6a5f6"},
+ {file = "websockets-12.0-cp39-cp39-win_amd64.whl", hash = "sha256:fc4e7fa5414512b481a2483775a8e8be7803a35b30ca805afa4998a84f9fd9e8"},
+ {file = "websockets-12.0-pp310-pypy310_pp73-macosx_10_9_x86_64.whl", hash = "sha256:248d8e2446e13c1d4326e0a6a4e9629cb13a11195051a73acf414812700badbd"},
+ {file = "websockets-12.0-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f44069528d45a933997a6fef143030d8ca8042f0dfaad753e2906398290e2870"},
+ {file = "websockets-12.0-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c4e37d36f0d19f0a4413d3e18c0d03d0c268ada2061868c1e6f5ab1a6d575077"},
+ {file = "websockets-12.0-pp310-pypy310_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3d829f975fc2e527a3ef2f9c8f25e553eb7bc779c6665e8e1d52aa22800bb38b"},
+ {file = "websockets-12.0-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:2c71bd45a777433dd9113847af751aae36e448bc6b8c361a566cb043eda6ec30"},
+ {file = "websockets-12.0-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:0bee75f400895aef54157b36ed6d3b308fcab62e5260703add87f44cee9c82a6"},
+ {file = "websockets-12.0-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:423fc1ed29f7512fceb727e2d2aecb952c46aa34895e9ed96071821309951123"},
+ {file = "websockets-12.0-pp38-pypy38_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:27a5e9964ef509016759f2ef3f2c1e13f403725a5e6a1775555994966a66e931"},
+ {file = "websockets-12.0-pp38-pypy38_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c3181df4583c4d3994d31fb235dc681d2aaad744fbdbf94c4802485ececdecf2"},
+ {file = "websockets-12.0-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:b067cb952ce8bf40115f6c19f478dc71c5e719b7fbaa511359795dfd9d1a6468"},
+ {file = "websockets-12.0-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:00700340c6c7ab788f176d118775202aadea7602c5cc6be6ae127761c16d6b0b"},
+ {file = "websockets-12.0-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e469d01137942849cff40517c97a30a93ae79917752b34029f0ec72df6b46399"},
+ {file = "websockets-12.0-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ffefa1374cd508d633646d51a8e9277763a9b78ae71324183693959cf94635a7"},
+ {file = "websockets-12.0-pp39-pypy39_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ba0cab91b3956dfa9f512147860783a1829a8d905ee218a9837c18f683239611"},
+ {file = "websockets-12.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:2cb388a5bfb56df4d9a406783b7f9dbefb888c09b71629351cc6b036e9259370"},
+ {file = "websockets-12.0-py3-none-any.whl", hash = "sha256:dc284bbc8d7c78a6c69e0c7325ab46ee5e40bb4d50e494d8131a07ef47500e9e"},
+ {file = "websockets-12.0.tar.gz", hash = "sha256:81df9cbcbb6c260de1e007e58c011bfebe2dafc8435107b0537f393dd38c8b1b"},
+]
+
+[[package]]
+name = "wemake-python-styleguide"
+version = "0.18.0"
+description = "The strictest and most opinionated python linter ever"
+optional = false
+python-versions = ">=3.8.1,<4.0"
+files = [
+ {file = "wemake_python_styleguide-0.18.0-py3-none-any.whl", hash = "sha256:2219be145185edcd5e01f4ce49e3dea11acc34f2c377face0c175bb6ea6ac988"},
+ {file = "wemake_python_styleguide-0.18.0.tar.gz", hash = "sha256:69139858cf5b2a9ba09dac136e2873a4685515768f68fdef2684ebefd7b1dafd"},
+]
+
+[package.dependencies]
+astor = ">=0.8,<0.9"
+attrs = "*"
+darglint = ">=1.2,<2.0"
+flake8 = ">5"
+flake8-bandit = ">=4.1,<5.0"
+flake8-broken-line = ">=1.0,<2.0"
+flake8-bugbear = ">=23.5,<24.0"
+flake8-commas = ">=2.0,<3.0"
+flake8-comprehensions = ">=3.1,<4.0"
+flake8-debugger = ">=4.0,<5.0"
+flake8-docstrings = ">=1.3,<2.0"
+flake8-eradicate = ">=1.5,<2.0"
+flake8-isort = ">=6.0,<7.0"
+flake8-quotes = ">=3.0,<4.0"
+flake8-rst-docstrings = ">=0.3,<0.4"
+flake8-string-format = ">=0.3,<0.4"
+pep8-naming = ">=0.13,<0.14"
+pygments = ">=2.4,<3.0"
+setuptools = "*"
+typing_extensions = ">=4.0,<5.0"
+
+[[package]]
+name = "widgetsnbextension"
+version = "4.0.9"
+description = "Jupyter interactive widgets for Jupyter Notebook"
+optional = false
+python-versions = ">=3.7"
+files = [
+ {file = "widgetsnbextension-4.0.9-py3-none-any.whl", hash = "sha256:91452ca8445beb805792f206e560c1769284267a30ceb1cec9f5bcc887d15175"},
+ {file = "widgetsnbextension-4.0.9.tar.gz", hash = "sha256:3c1f5e46dc1166dfd40a42d685e6a51396fd34ff878742a3e47c6f0cc4a2a385"},
+]
+
+[[package]]
+name = "win32-setctime"
+version = "1.1.0"
+description = "A small Python utility to set file creation time on Windows"
+optional = false
+python-versions = ">=3.5"
+files = [
+ {file = "win32_setctime-1.1.0-py3-none-any.whl", hash = "sha256:231db239e959c2fe7eb1d7dc129f11172354f98361c4fa2d6d2d7e278baa8aad"},
+ {file = "win32_setctime-1.1.0.tar.gz", hash = "sha256:15cf5750465118d6929ae4de4eb46e8edae9a5634350c01ba582df868e932cb2"},
+]
+
+[package.extras]
+dev = ["black (>=19.3b0)", "pytest (>=4.6.2)"]
+
+[[package]]
+name = "yacs"
+version = "0.1.8"
+description = "Yet Another Configuration System"
+optional = false
+python-versions = "*"
+files = [
+ {file = "yacs-0.1.8-py2-none-any.whl", hash = "sha256:d43d1854c1ffc4634c5b349d1c1120f86f05c3a294c9d141134f282961ab5d94"},
+ {file = "yacs-0.1.8-py3-none-any.whl", hash = "sha256:99f893e30497a4b66842821bac316386f7bd5c4f47ad35c9073ef089aa33af32"},
+ {file = "yacs-0.1.8.tar.gz", hash = "sha256:efc4c732942b3103bea904ee89af98bcd27d01f0ac12d8d4d369f1e7a2914384"},
+]
+
+[package.dependencies]
+PyYAML = "*"
+
+[[package]]
+name = "yarl"
+version = "1.9.3"
+description = "Yet another URL library"
+optional = false
+python-versions = ">=3.7"
+files = [
+ {file = "yarl-1.9.3-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:32435d134414e01d937cd9d6cc56e8413a8d4741dea36af5840c7750f04d16ab"},
+ {file = "yarl-1.9.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:9a5211de242754b5e612557bca701f39f8b1a9408dff73c6db623f22d20f470e"},
+ {file = "yarl-1.9.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:525cd69eff44833b01f8ef39aa33a9cc53a99ff7f9d76a6ef6a9fb758f54d0ff"},
+ {file = "yarl-1.9.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fc94441bcf9cb8c59f51f23193316afefbf3ff858460cb47b5758bf66a14d130"},
+ {file = "yarl-1.9.3-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e36021db54b8a0475805acc1d6c4bca5d9f52c3825ad29ae2d398a9d530ddb88"},
+ {file = "yarl-1.9.3-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e0f17d1df951336a02afc8270c03c0c6e60d1f9996fcbd43a4ce6be81de0bd9d"},
+ {file = "yarl-1.9.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c5f3faeb8100a43adf3e7925d556801d14b5816a0ac9e75e22948e787feec642"},
+ {file = "yarl-1.9.3-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:aed37db837ecb5962469fad448aaae0f0ee94ffce2062cf2eb9aed13328b5196"},
+ {file = "yarl-1.9.3-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:721ee3fc292f0d069a04016ef2c3a25595d48c5b8ddc6029be46f6158d129c92"},
+ {file = "yarl-1.9.3-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:b8bc5b87a65a4e64bc83385c05145ea901b613d0d3a434d434b55511b6ab0067"},
+ {file = "yarl-1.9.3-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:dd952b9c64f3b21aedd09b8fe958e4931864dba69926d8a90c90d36ac4e28c9a"},
+ {file = "yarl-1.9.3-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:c405d482c320a88ab53dcbd98d6d6f32ada074f2d965d6e9bf2d823158fa97de"},
+ {file = "yarl-1.9.3-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:9df9a0d4c5624790a0dea2e02e3b1b3c69aed14bcb8650e19606d9df3719e87d"},
+ {file = "yarl-1.9.3-cp310-cp310-win32.whl", hash = "sha256:d34c4f80956227f2686ddea5b3585e109c2733e2d4ef12eb1b8b4e84f09a2ab6"},
+ {file = "yarl-1.9.3-cp310-cp310-win_amd64.whl", hash = "sha256:cf7a4e8de7f1092829caef66fd90eaf3710bc5efd322a816d5677b7664893c93"},
+ {file = "yarl-1.9.3-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:d61a0ca95503867d4d627517bcfdc28a8468c3f1b0b06c626f30dd759d3999fd"},
+ {file = "yarl-1.9.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:73cc83f918b69110813a7d95024266072d987b903a623ecae673d1e71579d566"},
+ {file = "yarl-1.9.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:d81657b23e0edb84b37167e98aefb04ae16cbc5352770057893bd222cdc6e45f"},
+ {file = "yarl-1.9.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:26a1a8443091c7fbc17b84a0d9f38de34b8423b459fb853e6c8cdfab0eacf613"},
+ {file = "yarl-1.9.3-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:fe34befb8c765b8ce562f0200afda3578f8abb159c76de3ab354c80b72244c41"},
+ {file = "yarl-1.9.3-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2c757f64afe53a422e45e3e399e1e3cf82b7a2f244796ce80d8ca53e16a49b9f"},
+ {file = "yarl-1.9.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:72a57b41a0920b9a220125081c1e191b88a4cdec13bf9d0649e382a822705c65"},
+ {file = "yarl-1.9.3-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:632c7aeb99df718765adf58eacb9acb9cbc555e075da849c1378ef4d18bf536a"},
+ {file = "yarl-1.9.3-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:b0b8c06afcf2bac5a50b37f64efbde978b7f9dc88842ce9729c020dc71fae4ce"},
+ {file = "yarl-1.9.3-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:1d93461e2cf76c4796355494f15ffcb50a3c198cc2d601ad8d6a96219a10c363"},
+ {file = "yarl-1.9.3-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:4003f380dac50328c85e85416aca6985536812c082387255c35292cb4b41707e"},
+ {file = "yarl-1.9.3-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:4d6d74a97e898c1c2df80339aa423234ad9ea2052f66366cef1e80448798c13d"},
+ {file = "yarl-1.9.3-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:b61e64b06c3640feab73fa4ff9cb64bd8182de52e5dc13038e01cfe674ebc321"},
+ {file = "yarl-1.9.3-cp311-cp311-win32.whl", hash = "sha256:29beac86f33d6c7ab1d79bd0213aa7aed2d2f555386856bb3056d5fdd9dab279"},
+ {file = "yarl-1.9.3-cp311-cp311-win_amd64.whl", hash = "sha256:f7271d6bd8838c49ba8ae647fc06469137e1c161a7ef97d778b72904d9b68696"},
+ {file = "yarl-1.9.3-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:dd318e6b75ca80bff0b22b302f83a8ee41c62b8ac662ddb49f67ec97e799885d"},
+ {file = "yarl-1.9.3-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:c4b1efb11a8acd13246ffb0bee888dd0e8eb057f8bf30112e3e21e421eb82d4a"},
+ {file = "yarl-1.9.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:c6f034386e5550b5dc8ded90b5e2ff7db21f0f5c7de37b6efc5dac046eb19c10"},
+ {file = "yarl-1.9.3-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cd49a908cb6d387fc26acee8b7d9fcc9bbf8e1aca890c0b2fdfd706057546080"},
+ {file = "yarl-1.9.3-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:aa4643635f26052401750bd54db911b6342eb1a9ac3e74f0f8b58a25d61dfe41"},
+ {file = "yarl-1.9.3-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e741bd48e6a417bdfbae02e088f60018286d6c141639359fb8df017a3b69415a"},
+ {file = "yarl-1.9.3-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7c86d0d0919952d05df880a1889a4f0aeb6868e98961c090e335671dea5c0361"},
+ {file = "yarl-1.9.3-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3d5434b34100b504aabae75f0622ebb85defffe7b64ad8f52b8b30ec6ef6e4b9"},
+ {file = "yarl-1.9.3-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:79e1df60f7c2b148722fb6cafebffe1acd95fd8b5fd77795f56247edaf326752"},
+ {file = "yarl-1.9.3-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:44e91a669c43f03964f672c5a234ae0d7a4d49c9b85d1baa93dec28afa28ffbd"},
+ {file = "yarl-1.9.3-cp312-cp312-musllinux_1_1_ppc64le.whl", hash = "sha256:3cfa4dbe17b2e6fca1414e9c3bcc216f6930cb18ea7646e7d0d52792ac196808"},
+ {file = "yarl-1.9.3-cp312-cp312-musllinux_1_1_s390x.whl", hash = "sha256:88d2c3cc4b2f46d1ba73d81c51ec0e486f59cc51165ea4f789677f91a303a9a7"},
+ {file = "yarl-1.9.3-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:cccdc02e46d2bd7cb5f38f8cc3d9db0d24951abd082b2f242c9e9f59c0ab2af3"},
+ {file = "yarl-1.9.3-cp312-cp312-win32.whl", hash = "sha256:96758e56dceb8a70f8a5cff1e452daaeff07d1cc9f11e9b0c951330f0a2396a7"},
+ {file = "yarl-1.9.3-cp312-cp312-win_amd64.whl", hash = "sha256:c4472fe53ebf541113e533971bd8c32728debc4c6d8cc177f2bff31d011ec17e"},
+ {file = "yarl-1.9.3-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:126638ab961633f0940a06e1c9d59919003ef212a15869708dcb7305f91a6732"},
+ {file = "yarl-1.9.3-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c99ddaddb2fbe04953b84d1651149a0d85214780e4d0ee824e610ab549d98d92"},
+ {file = "yarl-1.9.3-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8dab30b21bd6fb17c3f4684868c7e6a9e8468078db00f599fb1c14e324b10fca"},
+ {file = "yarl-1.9.3-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:828235a2a169160ee73a2fcfb8a000709edf09d7511fccf203465c3d5acc59e4"},
+ {file = "yarl-1.9.3-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fc391e3941045fd0987c77484b2799adffd08e4b6735c4ee5f054366a2e1551d"},
+ {file = "yarl-1.9.3-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:51382c72dd5377861b573bd55dcf680df54cea84147c8648b15ac507fbef984d"},
+ {file = "yarl-1.9.3-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:28a108cb92ce6cf867690a962372996ca332d8cda0210c5ad487fe996e76b8bb"},
+ {file = "yarl-1.9.3-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:8f18a7832ff85dfcd77871fe677b169b1bc60c021978c90c3bb14f727596e0ae"},
+ {file = "yarl-1.9.3-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:7eaf13af79950142ab2bbb8362f8d8d935be9aaf8df1df89c86c3231e4ff238a"},
+ {file = "yarl-1.9.3-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:66a6dbf6ca7d2db03cc61cafe1ee6be838ce0fbc97781881a22a58a7c5efef42"},
+ {file = "yarl-1.9.3-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:1a0a4f3aaa18580038cfa52a7183c8ffbbe7d727fe581300817efc1e96d1b0e9"},
+ {file = "yarl-1.9.3-cp37-cp37m-win32.whl", hash = "sha256:946db4511b2d815979d733ac6a961f47e20a29c297be0d55b6d4b77ee4b298f6"},
+ {file = "yarl-1.9.3-cp37-cp37m-win_amd64.whl", hash = "sha256:2dad8166d41ebd1f76ce107cf6a31e39801aee3844a54a90af23278b072f1ccf"},
+ {file = "yarl-1.9.3-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:bb72d2a94481e7dc7a0c522673db288f31849800d6ce2435317376a345728225"},
+ {file = "yarl-1.9.3-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:9a172c3d5447b7da1680a1a2d6ecdf6f87a319d21d52729f45ec938a7006d5d8"},
+ {file = "yarl-1.9.3-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:2dc72e891672343b99db6d497024bf8b985537ad6c393359dc5227ef653b2f17"},
+ {file = "yarl-1.9.3-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b8d51817cf4b8d545963ec65ff06c1b92e5765aa98831678d0e2240b6e9fd281"},
+ {file = "yarl-1.9.3-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:53ec65f7eee8655bebb1f6f1607760d123c3c115a324b443df4f916383482a67"},
+ {file = "yarl-1.9.3-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:cfd77e8e5cafba3fb584e0f4b935a59216f352b73d4987be3af51f43a862c403"},
+ {file = "yarl-1.9.3-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e73db54c967eb75037c178a54445c5a4e7461b5203b27c45ef656a81787c0c1b"},
+ {file = "yarl-1.9.3-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:09c19e5f4404574fcfb736efecf75844ffe8610606f3fccc35a1515b8b6712c4"},
+ {file = "yarl-1.9.3-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:6280353940f7e5e2efaaabd686193e61351e966cc02f401761c4d87f48c89ea4"},
+ {file = "yarl-1.9.3-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:c25ec06e4241e162f5d1f57c370f4078797ade95c9208bd0c60f484834f09c96"},
+ {file = "yarl-1.9.3-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:7217234b10c64b52cc39a8d82550342ae2e45be34f5bff02b890b8c452eb48d7"},
+ {file = "yarl-1.9.3-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:4ce77d289f8d40905c054b63f29851ecbfd026ef4ba5c371a158cfe6f623663e"},
+ {file = "yarl-1.9.3-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:5f74b015c99a5eac5ae589de27a1201418a5d9d460e89ccb3366015c6153e60a"},
+ {file = "yarl-1.9.3-cp38-cp38-win32.whl", hash = "sha256:8a2538806be846ea25e90c28786136932ec385c7ff3bc1148e45125984783dc6"},
+ {file = "yarl-1.9.3-cp38-cp38-win_amd64.whl", hash = "sha256:6465d36381af057d0fab4e0f24ef0e80ba61f03fe43e6eeccbe0056e74aadc70"},
+ {file = "yarl-1.9.3-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:2f3c8822bc8fb4a347a192dd6a28a25d7f0ea3262e826d7d4ef9cc99cd06d07e"},
+ {file = "yarl-1.9.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:b7831566595fe88ba17ea80e4b61c0eb599f84c85acaa14bf04dd90319a45b90"},
+ {file = "yarl-1.9.3-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:ff34cb09a332832d1cf38acd0f604c068665192c6107a439a92abfd8acf90fe2"},
+ {file = "yarl-1.9.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fe8080b4f25dfc44a86bedd14bc4f9d469dfc6456e6f3c5d9077e81a5fedfba7"},
+ {file = "yarl-1.9.3-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8535e111a064f3bdd94c0ed443105934d6f005adad68dd13ce50a488a0ad1bf3"},
+ {file = "yarl-1.9.3-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:0d155a092bf0ebf4a9f6f3b7a650dc5d9a5bbb585ef83a52ed36ba46f55cc39d"},
+ {file = "yarl-1.9.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:778df71c8d0c8c9f1b378624b26431ca80041660d7be7c3f724b2c7a6e65d0d6"},
+ {file = "yarl-1.9.3-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b9f9cafaf031c34d95c1528c16b2fa07b710e6056b3c4e2e34e9317072da5d1a"},
+ {file = "yarl-1.9.3-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:ca6b66f69e30f6e180d52f14d91ac854b8119553b524e0e28d5291a724f0f423"},
+ {file = "yarl-1.9.3-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:e0e7e83f31e23c5d00ff618045ddc5e916f9e613d33c5a5823bc0b0a0feb522f"},
+ {file = "yarl-1.9.3-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:af52725c7c39b0ee655befbbab5b9a1b209e01bb39128dce0db226a10014aacc"},
+ {file = "yarl-1.9.3-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:0ab5baaea8450f4a3e241ef17e3d129b2143e38a685036b075976b9c415ea3eb"},
+ {file = "yarl-1.9.3-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:6d350388ba1129bc867c6af1cd17da2b197dff0d2801036d2d7d83c2d771a682"},
+ {file = "yarl-1.9.3-cp39-cp39-win32.whl", hash = "sha256:e2a16ef5fa2382af83bef4a18c1b3bcb4284c4732906aa69422cf09df9c59f1f"},
+ {file = "yarl-1.9.3-cp39-cp39-win_amd64.whl", hash = "sha256:d92d897cb4b4bf915fbeb5e604c7911021a8456f0964f3b8ebbe7f9188b9eabb"},
+ {file = "yarl-1.9.3-py3-none-any.whl", hash = "sha256:271d63396460b6607b588555ea27a1a02b717ca2e3f2cf53bdde4013d7790929"},
+ {file = "yarl-1.9.3.tar.gz", hash = "sha256:4a14907b597ec55740f63e52d7fee0e9ee09d5b9d57a4f399a7423268e457b57"},
+]
+
+[package.dependencies]
+idna = ">=2.0"
+multidict = ">=4.0"
+
+[[package]]
+name = "zipp"
+version = "3.17.0"
+description = "Backport of pathlib-compatible object wrapper for zip files"
+optional = false
+python-versions = ">=3.8"
+files = [
+ {file = "zipp-3.17.0-py3-none-any.whl", hash = "sha256:0e923e726174922dce09c53c59ad483ff7bbb8e572e00c7f7c46b88556409f31"},
+ {file = "zipp-3.17.0.tar.gz", hash = "sha256:84e64a1c28cf7e91ed2078bb8cc8c259cb19b76942096c8d7b84947690cabaf0"},
+]
+
+[package.extras]
+docs = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (<7.2.5)", "sphinx (>=3.5)", "sphinx-lint"]
+testing = ["big-O", "jaraco.functools", "jaraco.itertools", "more-itertools", "pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-ignore-flaky", "pytest-mypy (>=0.9.1)", "pytest-ruff"]
+
+[metadata]
+lock-version = "2.0"
+python-versions = ">=3.9,<3.10"
+content-hash = "9d63553871750d24ee34f83c41abaee93b4562f52709fa3f11d094a67a6feb17"
diff --git a/pyproject.toml b/pyproject.toml
new file mode 100644
index 0000000..dd8bbb6
--- /dev/null
+++ b/pyproject.toml
@@ -0,0 +1,104 @@
+[tool.poetry]
+name = "emma-perception"
+version = "1.13.0"
+description = ""
+authors = [
+ "Amit Parekh ",
+ "Alessandro Suglia ",
+]
+readme = "README.md"
+repository = "https://github.com/emma-simbot/perception"
+
+packages = [{ include = "emma_perception", from = "src" }]
+
+[tool.poe.tasks]
+
+[tool.poe.tasks.format]
+help = "Format using the pre-commit hooks"
+cmd = "pre-commit run --all-files"
+
+[tool.poe.tasks.typecheck]
+help = "Check types with mypy"
+cmd = "mypy ."
+
+[tool.poe.tasks.lint]
+help = "Lint with flake8"
+cmd = "flake8 ."
+
+[tool.poe.tasks.test]
+help = "Run the fast Python tests"
+cmd = "pytest --cov=src -m 'not slow'"
+
+[tool.poe.tasks.test-everything]
+help = "Run all the tests and get the coverage"
+cmd = "pytest -v --junitxml=pytest.xml --cov=src -m 'not slow and not multiprocessing'"
+
+
+[tool.poe.tasks.install-correct-torch-wheel]
+## See https://github.com/python-poetry/poetry/issues/2543
+help = "Update torch to use the latest CUDA version"
+shell = "python scripts/update_torch_cuda.py"
+
+
+[tool.poetry.dependencies]
+python = ">=3.9,<3.10"
+torch = "1.10.2"
+torchvision = "0.11.3"
+pytorch-lightning = ">=1.5,<2"
+pydantic = { extras = ["dotenv"], version = ">=1.9.0,<2" }
+rich = ">=12.2.0"
+overrides = ">=6.1.0"
+requests = ">=2.27.1"
+fastapi = ">=0.88.0"
+h5py = "3.7.0"
+nltk = "3.8"
+joblib = "1.2.0"
+pandas = ">=1.4.2,<2"
+scipy = "1.9.3"
+ninja = "1.11.1"
+yacs = "0.1.8"
+Cython = ">=0.29.28"
+tqdm = ">=4.64.0"
+numpy = "<1.24"
+einops = ">=0.4.1"
+timm = "0.5.4"
+pycocotools = "2.0.6"
+cityscapesScripts = "2.2.1"
+opencv-python-headless = ">=4.5.5,<5"
+orjson = ">=3.8.3"
+maskrcnn-benchmark = { git = "https://github.com/emma-heriot-watt/scene-graph-benchmark.git" }
+emma-common = { git = "https://github.com/emma-heriot-watt/common.git" }
+
+
+[tool.poetry.group.dev.dependencies]
+wemake-python-styleguide = ">=0.16.1"
+flake8 = ">=4.0"
+mypy = ">=0.942"
+pytest = ">=7.1.2"
+ipykernel = ">=6.13.0"
+pre-commit = ">=2.18.1"
+poethepoet = ">=0.13.1"
+pytest-cov = ">=3.0.0"
+pudb = ">=2022.1"
+isort = ">=5.10.1"
+pytest-cases = ">=3.6.11"
+types-requests = ">=2.27.16"
+jupyterlab = ">=3.3.3"
+jupyter = ">=1.0.0"
+ipython = ">=8.2.0"
+matplotlib = ">=3.5.1,<4"
+
+
+[tool.black]
+line-length = 99
+
+[tool.isort]
+profile = "black"
+combine_as_imports = true
+lines_after_imports = 2
+line_length = 99
+known_first_party = ["emma_perception"]
+
+[build-system]
+requires = ["poetry-core>=1.0.0", "setuptools"]
+build-backend = "poetry.core.masonry.api"
diff --git a/pytest.ini b/pytest.ini
new file mode 100644
index 0000000..e367cf0
--- /dev/null
+++ b/pytest.ini
@@ -0,0 +1,12 @@
+[pytest]
+
+testpaths =
+ tests
+
+filterwarnings =
+ ignore::UserWarning
+ ignore::DeprecationWarning
+
+markers =
+ slow: mark test as slow
+ multiprocessing: mark test as using multiprocessing
diff --git a/scripts/.gitkeep b/scripts/.gitkeep
new file mode 100644
index 0000000..e69de29
diff --git a/scripts/merge_nlvr_image_features.py b/scripts/merge_nlvr_image_features.py
new file mode 100644
index 0000000..a6ab153
--- /dev/null
+++ b/scripts/merge_nlvr_image_features.py
@@ -0,0 +1,58 @@
+import argparse
+import glob
+from pathlib import Path, PurePath
+
+import torch
+from tqdm import tqdm
+
+
+def merge_nlvr_image_features(input_path: Path, output_path: Path) -> None:
+ """Merge NLVR image features into video features."""
+ output_path.mkdir(exist_ok=True)
+
+ img_left_paths = sorted(glob.glob(str(input_path.joinpath("*img0.pt"))))
+ img_right_paths = sorted(glob.glob(str(input_path.joinpath("*img1.pt"))))
+ if len(img_left_paths) != len(img_right_paths):
+ raise AssertionError(
+ f"The number of 0-indexed images {len(img_left_paths)} should match the number of 1-indexed images {len(img_right_paths)}"
+ )
+
+ img_file_paths = list(zip(img_left_paths, img_right_paths))
+ for img_left_path, img_right_path in tqdm(img_file_paths):
+ if img_left_path.split("img0")[0] != img_right_path.split("img1")[0]:
+ raise AssertionError(f"Found unpaired images {img_left_path} {img_right_path}")
+ img_left_features = torch.load(img_left_path)
+ img_right_features = torch.load(img_right_path)
+
+ features_dict = {
+ "frames": [
+ {"image": PurePath(img_left_path).name, "features": img_left_features},
+ {"image": PurePath(img_right_path).name, "features": img_right_features},
+ ]
+ }
+
+ output_file_path = output_path.joinpath(
+ PurePath(f"{img_left_path.split('img0')[0][:-1]}.pt").name
+ )
+ torch.save(features_dict, output_file_path)
+
+
+if __name__ == "__main__":
+ parser = argparse.ArgumentParser()
+
+ parser.add_argument(
+ "--input_path",
+ type=Path,
+ help="Path to input nlvr image features",
+ required=True,
+ )
+
+ parser.add_argument(
+ "--output_path",
+ type=Path,
+ help="Path to input nlvr image features",
+ required=True,
+ )
+
+ args = parser.parse_args()
+ merge_nlvr_image_features(input_path=args.input_path, output_path=args.output_path)
diff --git a/scripts/update_torch_cuda.py b/scripts/update_torch_cuda.py
new file mode 100644
index 0000000..cc7e177
--- /dev/null
+++ b/scripts/update_torch_cuda.py
@@ -0,0 +1,164 @@
+import logging
+import subprocess
+import sys
+from typing import Optional
+
+from rich.console import Console
+from rich.logging import RichHandler
+
+
+console = Console()
+
+logging.basicConfig(
+ level="NOTSET",
+ format="%(message)s",
+ datefmt="[%X]",
+ handlers=[RichHandler(console=console, markup=True, rich_tracebacks=True)],
+)
+log = logging.getLogger("rich")
+
+
+def is_cuda_available() -> bool:
+ """Check if CUDA is available, without global torch import."""
+ import torch
+
+ return torch.cuda.is_available()
+
+
+def get_torch_version() -> tuple[str, Optional[str]]:
+ """Get the current version of PyTorch, without global torch import.
+
+ If it is for a specific version, it will have the '+cu11x' suffix.
+ """
+ import torch
+
+ version = torch.__version__
+
+ log.info(f"Current `torch` verison: {version}")
+
+ if "+" not in version:
+ return version, None
+
+ return version.split("+")[0], version.split("+")[1]
+
+
+def get_torchvision_version() -> tuple[str, Optional[str]]:
+ """Get the current version of torchvision, without global importing.
+
+ If it is for a specific version, it will have the '+cu11x' suffix.
+ """
+ import torchvision
+
+ version = torchvision.__version__
+
+ log.info(f"Current `torchvision` verison: {version}")
+
+ if "+" not in version:
+ return version, None
+
+ return version.split("+")[0], version.split("+")[1]
+
+
+def get_supported_cuda_version() -> float:
+ """Get the highest supported CUDA version.
+
+ NVIDIA-SMI seems to be the most consistent version display, so needed to use subprocess to get
+ it out.
+ """
+ nvidia_smi_process = subprocess.Popen(
+ ["nvidia-smi"], stdout=subprocess.PIPE, stderr=subprocess.PIPE
+ )
+
+ nvidia_smi_stdout, _ = nvidia_smi_process.communicate()
+
+ cuda_version_line = nvidia_smi_stdout.decode().split("\n")[2]
+ cuda_version_list = list(filter(None, cuda_version_line.split(" ")))
+ cuda_version = float(cuda_version_list[-2])
+
+ log.info(f"Supported CUDA version: {cuda_version}")
+
+ return cuda_version
+
+
+def get_torch_cuda_suffix(cuda_version: float) -> str:
+ """Get the relevant CUDA suffix from the version."""
+ if cuda_version > 11 and cuda_version < 11.3:
+ return "cu111"
+ if cuda_version > 11.3:
+ return "cu113"
+
+ return ""
+
+
+def update_torch(torch_version: tuple[str, str], torchvision_version: tuple[str, str]) -> None:
+ """Install the desired torch and torchvision versions."""
+ torch_package_version = f"{torch_version[0]}+{torch_version[1]}"
+ torchvision_package_version = f"{torchvision_version[0]}+{torchvision_version[1]}"
+ log.info(
+ f"Installing torch=={torch_package_version} and torchvision=={torchvision_package_version}"
+ )
+
+ process_args = [
+ sys.executable,
+ "-m",
+ "pip",
+ "install",
+ f"torch=={torch_package_version}",
+ f"torchvision=={torchvision_package_version}",
+ "-f",
+ "https://download.pytorch.org/whl/torch_stable.html",
+ ]
+
+ with subprocess.Popen(
+ process_args, stdout=subprocess.PIPE, universal_newlines=True
+ ) as process:
+ if process.stdout is not None:
+ for line in iter(process.stdout.readlines()):
+ console.log(line)
+
+
+def main(force_update: bool = False) -> None:
+ """Run the script."""
+ if not is_cuda_available():
+ log.warning("CUDA is not available. Are you sure about running this script?")
+ return
+
+ if force_update:
+ log.info("`force_update` is True")
+
+ should_update = force_update
+
+ log.debug("Get supported CUDA version")
+ supported_cuda_version = get_supported_cuda_version()
+
+ log.debug("Getting ideal torch suffix.")
+ torch_suffix = get_torch_cuda_suffix(supported_cuda_version)
+
+ log.debug("Getting torch version")
+ torch_version = get_torch_version()
+
+ log.debug("Getting torchvision version")
+ torchvision_version = get_torchvision_version()
+
+ if torch_version[1] != torch_suffix or should_update:
+ should_update = True
+ torch_version = (torch_version[0], torch_suffix)
+
+ if torchvision_version[1] != torch_suffix or should_update:
+ should_update = True
+ torchvision_version = (torchvision_version[0], torch_suffix)
+
+ if should_update:
+ log.debug("Updating torch and torchvision")
+ update_torch(torch_version, torchvision_version) # type: ignore[arg-type]
+
+ if not should_update:
+ log.info(
+ "No update to torch is needed. The best wheel for the current CUDA version is already installed."
+ )
+
+ log.info("Done")
+
+
+if __name__ == "__main__":
+ main(True)
diff --git a/src/emma_perception/__init__.py b/src/emma_perception/__init__.py
new file mode 100644
index 0000000..46a88aa
--- /dev/null
+++ b/src/emma_perception/__init__.py
@@ -0,0 +1 @@
+from emma_perception._version import __version__
diff --git a/src/emma_perception/_version.py b/src/emma_perception/_version.py
new file mode 100644
index 0000000..6099c81
--- /dev/null
+++ b/src/emma_perception/_version.py
@@ -0,0 +1,7 @@
+# Store the version here so:
+# 1) we don't load dependencies by storing it in __init__.py
+# 2) we can import it in setup.py for the same reason
+# 3) we can import it into your module module
+#
+# This is automatic, therefore DO NOT manually change this file!
+__version__ = "1.13.0"
diff --git a/src/emma_perception/api/__init__.py b/src/emma_perception/api/__init__.py
new file mode 100644
index 0000000..59dc94f
--- /dev/null
+++ b/src/emma_perception/api/__init__.py
@@ -0,0 +1,3 @@
+from emma_perception.api.api_dataset import ApiDataset
+from emma_perception.api.datamodels import ApiSettings, ApiStore, parse_api_args
+from emma_perception.api.extract_features import extract_features_for_batch
diff --git a/src/emma_perception/api/api_dataset.py b/src/emma_perception/api/api_dataset.py
new file mode 100644
index 0000000..f68d0da
--- /dev/null
+++ b/src/emma_perception/api/api_dataset.py
@@ -0,0 +1,42 @@
+import random
+import string
+from typing import Optional, Union
+
+from PIL.Image import Image
+from torch.utils.data import Dataset
+
+from emma_perception.datamodules.visual_extraction_dataset import DatasetReturn
+from emma_perception.models.vinvl_extractor import VinVLTransform
+
+
+class ApiDataset(Dataset[DatasetReturn]):
+ """Simple dataset of images from an API call."""
+
+ def __init__(
+ self, images: Union[Image, list[Image]], transform: Optional[VinVLTransform] = None
+ ) -> None:
+ if not isinstance(images, list):
+ images = [images]
+
+ self.dataset = images
+ self.dataset_size = len(self.dataset)
+ self.transform = transform
+
+ def __len__(self) -> int:
+ """Return dataset size."""
+ return self.dataset_size
+
+ def __getitem__(self, idx: int) -> DatasetReturn:
+ """Return a sample."""
+ img = self.dataset[idx]
+ img_size = img.size
+
+ if self.transform is not None:
+ img = self.transform(img)
+
+ return DatasetReturn(
+ img=img, ids=self._make_sample_id(), width=img_size[0], height=img_size[1]
+ )
+
+ def _make_sample_id(self, num_charas: int = 12) -> str:
+ return "".join(random.sample(string.ascii_lowercase, num_charas))
diff --git a/src/emma_perception/api/datamodels.py b/src/emma_perception/api/datamodels.py
new file mode 100644
index 0000000..3427d7c
--- /dev/null
+++ b/src/emma_perception/api/datamodels.py
@@ -0,0 +1,83 @@
+import argparse
+import json
+from dataclasses import dataclass
+from typing import Literal, Optional, TypedDict
+
+import torch
+from pydantic import BaseSettings
+
+from emma_perception.constants import (
+ VINVL_ALFRED_CLASS_MAP_PATH,
+ VINVL_CLASS_MAP_PATH,
+ VINVL_SIMBOT_CLASS_MAP_PATH,
+ VINVL_SIMBOT_CONFIG_PATH,
+)
+from emma_perception.models.simbot_entity_classifier import SimBotMLPEntityClassifier
+from emma_perception.models.vinvl_extractor import VinVLExtractor, VinVLTransform
+
+
+ClassmapType = Literal["alfred", "original", "simbot"]
+
+
+class AlfredClassMap(TypedDict):
+ """Classmap for class to idx."""
+
+ label_to_idx: dict[str, int]
+ idx_to_label: dict[str, str]
+
+
+class ApiSettings(BaseSettings):
+ """Common settings, which can also be got from the environment vars."""
+
+ port: int = 5500
+ host: str = "0.0.0.0" # noqa: S104
+ num_workers: int = 1
+ # Use a positive number to index the GPU, or a negative number for the CPU
+ device_id: int = -1
+ log_level: str = "info"
+ # Dictionary containing the class information for the object detector
+ classmap_type: ClassmapType = "simbot"
+ # batch size used to extract visual features
+ batch_size: int = 2
+
+ def object_classmap(self) -> AlfredClassMap:
+ """Get the mapping of objects to class indices."""
+ if self.classmap_type == "alfred":
+ classmap_file = VINVL_ALFRED_CLASS_MAP_PATH
+ elif self.classmap_type == "original":
+ classmap_file = VINVL_CLASS_MAP_PATH
+ elif self.classmap_type == "simbot":
+ classmap_file = VINVL_SIMBOT_CLASS_MAP_PATH
+ else:
+ raise ValueError(f"Invalid classmap type: {self.classmap_type}")
+
+ with open(classmap_file) as in_file:
+ return json.load(in_file)
+
+
+@dataclass(init=False)
+class ApiStore:
+ """Common state for the API."""
+
+ extractor: VinVLExtractor
+ transform: VinVLTransform
+ device: torch.device
+ entity_classifier: Optional[SimBotMLPEntityClassifier] = None
+
+
+def parse_api_args() -> argparse.Namespace:
+ """Defines arguments."""
+ parser = argparse.ArgumentParser()
+ parser.add_argument(
+ "--config_file",
+ metavar="FILE",
+ help="path to VinVL config file",
+ default=VINVL_SIMBOT_CONFIG_PATH.as_posix(),
+ )
+ parser.add_argument(
+ "opts",
+ default=None,
+ nargs=argparse.REMAINDER,
+ help="Modify config options using the command-line. Used for VinVL extraction",
+ )
+ return parser.parse_args()
diff --git a/src/emma_perception/api/extract_features.py b/src/emma_perception/api/extract_features.py
new file mode 100644
index 0000000..8f9d44e
--- /dev/null
+++ b/src/emma_perception/api/extract_features.py
@@ -0,0 +1,86 @@
+from typing import Optional, Union
+
+import torch
+from emma_common.datamodels import EmmaExtractedFeatures
+from loguru import logger
+from PIL import Image
+from torch.utils.data import DataLoader
+
+from emma_perception.api.api_dataset import ApiDataset
+from emma_perception.api.datamodels import ApiSettings, ApiStore
+from emma_perception.models.simbot_entity_classifier import SimBotMLPEntityClassifier
+from emma_perception.models.vinvl_extractor import VinVLExtractor
+
+
+settings = ApiSettings()
+object_classmap = settings.object_classmap()
+
+
+@torch.inference_mode()
+def get_batch_features(
+ extractor: VinVLExtractor,
+ batch: dict[str, torch.Tensor],
+ device: torch.device,
+ entity_classifier: Optional[SimBotMLPEntityClassifier] = None,
+) -> list[EmmaExtractedFeatures]:
+ """Low-level implementation of the visual feature extraction process."""
+ logger.debug("Inference step")
+ cnn_features: list[torch.Tensor] = []
+ hook = extractor.extractor.backbone.register_forward_hook(
+ lambda module, inp, output: cnn_features.append(output)
+ )
+
+ batch_predictions = extractor.extractor(batch["img"].to(device))
+ hook.remove()
+ cnn_feats = cnn_features[0][0]
+
+ batch_features: list[EmmaExtractedFeatures] = []
+
+ logger.debug("Post-process batch")
+ for batch_idx, predictions in enumerate(batch_predictions):
+ # assumes that all the images have the same size
+ predictions = predictions.resize((batch["width"][batch_idx], batch["height"][batch_idx]))
+
+ bbox_probas = predictions.get_field("scores_all")
+ idx_labels = bbox_probas.argmax(dim=1)
+ class_labels = [object_classmap["idx_to_label"][str(idx.item())] for idx in idx_labels]
+ entity_labels = None
+ bbox_features = predictions.get_field("box_features")
+
+ if entity_classifier is not None:
+ entity_labels = entity_classifier(bbox_features, class_labels)
+
+ features = EmmaExtractedFeatures(
+ bbox_features=bbox_features,
+ bbox_coords=predictions.bbox,
+ bbox_probas=bbox_probas,
+ cnn_features=cnn_feats[batch_idx].mean(dim=(-2, -1)),
+ class_labels=class_labels,
+ entity_labels=entity_labels,
+ width=int(batch["width"][batch_idx].item()),
+ height=int(batch["height"][batch_idx].item()),
+ )
+
+ batch_features.append(features)
+
+ return batch_features
+
+
+def extract_features_for_batch(
+ images: Union[Image.Image, list[Image.Image]], api_store: ApiStore, batch_size: int = 2
+) -> list[EmmaExtractedFeatures]:
+ """Extracts visual features for a batch of images."""
+ logger.debug("Build dataloader")
+ dataset = ApiDataset(images, transform=api_store.transform)
+ loader = DataLoader(dataset, batch_size=batch_size)
+
+ all_features: list[EmmaExtractedFeatures] = []
+
+ for batch in loader:
+ all_features.extend(
+ get_batch_features(
+ api_store.extractor, batch, api_store.device, api_store.entity_classifier
+ )
+ )
+
+ return all_features
diff --git a/src/emma_perception/callbacks/__init__.py b/src/emma_perception/callbacks/__init__.py
new file mode 100644
index 0000000..e69de29
diff --git a/src/emma_perception/callbacks/callbacks.py b/src/emma_perception/callbacks/callbacks.py
new file mode 100644
index 0000000..40becc1
--- /dev/null
+++ b/src/emma_perception/callbacks/callbacks.py
@@ -0,0 +1,40 @@
+import os
+from typing import Any
+
+import pytorch_lightning as pl
+import torch
+from pytorch_lightning.callbacks import Callback
+
+
+class VisualExtractionCacheCallback(Callback):
+ """A simple callback used for caching predictions."""
+
+ def __init__(self, cache_dir: str = "image_cache", cache_suffix: str = ".pt") -> None:
+ self.cache_dir = cache_dir
+ self.cache_suffix = cache_suffix
+
+ os.makedirs(self.cache_dir, exist_ok=True)
+
+ def on_predict_batch_end(
+ self,
+ trainer: pl.Trainer,
+ pl_module: pl.LightningModule,
+ outputs: Any,
+ batch: Any,
+ batch_idx: int,
+ dataloader_idx: int,
+ ) -> None:
+ """Store the predictions for a batch."""
+ for ex_id, output in outputs.items():
+ cache_fname = os.path.join(
+ self.cache_dir, os.path.splitext(ex_id)[0] + self.cache_suffix
+ )
+ features_dict = {
+ "bbox_features": output["bbox_features"].to("cpu"),
+ "bbox_coords": output["bbox_coords"].to("cpu"),
+ "bbox_probas": output["bbox_probas"].to("cpu"),
+ "cnn_features": output["cnn_features"].to("cpu"),
+ "width": output["width"].to("cpu").item(),
+ "height": output["height"].to("cpu").item(),
+ }
+ torch.save(features_dict, cache_fname)
diff --git a/src/emma_perception/commands/__init__.py b/src/emma_perception/commands/__init__.py
new file mode 100644
index 0000000..e69de29
diff --git a/src/emma_perception/commands/download_checkpoints.py b/src/emma_perception/commands/download_checkpoints.py
new file mode 100644
index 0000000..84058b3
--- /dev/null
+++ b/src/emma_perception/commands/download_checkpoints.py
@@ -0,0 +1,27 @@
+from pathlib import Path
+
+from emma_common import logger
+from emma_common.hf import download_file
+
+
+HF_REPO_ID = "emma-heriot-watt/models"
+VINVL_CHECKPOINT_NAME = "vinvl_pretrained.pth"
+ARENA_CHECKPOINT_NAME = "vinvl_finetune_arena.ckpt"
+
+
+def download_arena_checkpoint(
+ *, hf_repo_id: str = HF_REPO_ID, file_name: str = ARENA_CHECKPOINT_NAME
+) -> Path:
+ """Download the fine-tuned checkpoint on the Alexa Arena."""
+ file_path = download_file(repo_id=hf_repo_id, repo_type="model", filename=file_name)
+ logger.info(f"Downloaded {file_name}")
+ return file_path
+
+
+def download_vinvl_checkpoint(
+ *, hf_repo_id: str = HF_REPO_ID, file_name: str = VINVL_CHECKPOINT_NAME
+) -> Path:
+ """Download the pre-trained VinVL checkpoint."""
+ file_path = download_file(repo_id=hf_repo_id, repo_type="model", filename=file_name)
+ logger.info(f"Downloaded {file_name}")
+ return file_path
diff --git a/src/emma_perception/commands/extract_visual_features.py b/src/emma_perception/commands/extract_visual_features.py
new file mode 100644
index 0000000..a2ddee5
--- /dev/null
+++ b/src/emma_perception/commands/extract_visual_features.py
@@ -0,0 +1,83 @@
+import argparse
+
+from maskrcnn_benchmark.config import cfg
+from pytorch_lightning import Trainer
+from scene_graph_benchmark.config import sg_cfg
+
+from emma_perception.callbacks.callbacks import VisualExtractionCacheCallback
+from emma_perception.commands.download_checkpoints import (
+ download_arena_checkpoint,
+ download_vinvl_checkpoint,
+)
+from emma_perception.datamodules.visual_extraction_dataset import ImageDataset, PredictDataModule
+from emma_perception.models.vinvl_extractor import VinVLExtractor, VinVLTransform
+
+
+def parse_args() -> argparse.Namespace:
+ """Defines arguments."""
+ parser = argparse.ArgumentParser()
+ parser = Trainer.add_argparse_args(parser) # type: ignore[assignment]
+ parser.add_argument(
+ "-i",
+ "--images_dir",
+ required=True,
+ help="Path to a folder of images to extract features from",
+ )
+ parser.add_argument(
+ "--is_arena",
+ action="store_true",
+ help="If we are extracting features from the Arena images, use the Arena checkpoint",
+ )
+ parser.add_argument("-b", "--batch_size", type=int, default=2)
+ parser.add_argument("-w", "--num_workers", type=int, default=0)
+ parser.add_argument(
+ "-c", "--output_dir", default="storage/data/cache", help="Path to store visual features"
+ )
+ parser.add_argument(
+ "--num_gpus",
+ type=int,
+ default=None,
+ help="Number of GPUs to use for visual feature extraction",
+ )
+ parser.add_argument(
+ "opts",
+ default=None,
+ nargs=argparse.REMAINDER,
+ help="Modify config options using the command-line. Used for VinVL extraction",
+ )
+
+ return parser.parse_args()
+
+
+def main() -> None:
+ """Main function for visual feature extraction."""
+ args = parse_args()
+
+ cfg.set_new_allowed(True)
+ cfg.merge_from_other_cfg(sg_cfg)
+ cfg.set_new_allowed(False)
+ cfg.merge_from_file(args.config_file)
+ cfg.merge_from_list(args.opts)
+ cfg.freeze()
+
+ if args.is_arena:
+ cfg.MODEL.WEIGHT = download_arena_checkpoint().as_posix()
+ else:
+ cfg.MODEL.WEIGHT = download_vinvl_checkpoint().as_posix()
+
+ dataset = ImageDataset(
+ input_path=args.images_dir, preprocess_transform=VinVLTransform(cfg=cfg)
+ )
+ dm = PredictDataModule(
+ dataset=dataset, batch_size=args.batch_size, num_workers=args.num_workers
+ )
+ extractor = VinVLExtractor(cfg=cfg)
+ trainer = Trainer(
+ gpus=args.num_gpus,
+ callbacks=[VisualExtractionCacheCallback(cache_dir=args.output_dir, cache_suffix=".pt")],
+ )
+ trainer.predict(extractor, dm)
+
+
+if __name__ == "__main__":
+ main()
diff --git a/src/emma_perception/commands/run_server.py b/src/emma_perception/commands/run_server.py
new file mode 100644
index 0000000..1d55bd5
--- /dev/null
+++ b/src/emma_perception/commands/run_server.py
@@ -0,0 +1,210 @@
+from io import BytesIO
+from pathlib import Path
+
+import torch
+import uvicorn
+from emma_common.api.response import TorchResponse
+from emma_common.logging import logger, setup_rich_logging
+from fastapi import FastAPI, HTTPException, Response, UploadFile, status
+from maskrcnn_benchmark.config import cfg
+from PIL import Image
+from pydantic import BaseModel
+from scene_graph_benchmark.config import sg_cfg
+
+from emma_perception.api import ApiSettings, ApiStore, extract_features_for_batch, parse_api_args
+from emma_perception.commands.download_checkpoints import download_arena_checkpoint
+from emma_perception.constants import (
+ SIMBOT_ENTITY_MLPCLASSIFIER_CLASSMAP_PATH,
+ SIMBOT_ENTITY_MLPCLASSIFIER_PATH,
+)
+from emma_perception.models.simbot_entity_classifier import SimBotMLPEntityClassifier
+from emma_perception.models.vinvl_extractor import VinVLExtractor, VinVLTransform
+
+
+settings = ApiSettings()
+api_store = ApiStore()
+app = FastAPI()
+
+
+@app.on_event("startup")
+async def startup_event() -> None:
+ """Run specific functions when starting up the API."""
+ args = parse_api_args()
+ cfg.set_new_allowed(True)
+ cfg.merge_from_other_cfg(sg_cfg)
+ cfg.set_new_allowed(False)
+ cfg.merge_from_file(args.config_file)
+ cfg.merge_from_list(args.opts)
+
+ model_path = Path(cfg.MODEL.WEIGHT)
+ if not model_path.exists():
+ cfg.MODEL.WEIGHT = download_arena_checkpoint().as_posix()
+
+ if torch.cuda.is_available() and settings.device_id != -1:
+ num_gpus = torch.cuda.device_count()
+
+ if settings.device_id >= num_gpus:
+ msg = f"You selected {settings.device_id} gpu but there are only {num_gpus} available"
+ raise OSError(msg)
+
+ device = torch.device(settings.device_id)
+ cfg.MODEL.DEVICE = settings.device_id
+ else:
+ device = torch.device("cpu")
+ cfg.MODEL.DEVICE = "cpu"
+
+ cfg.freeze()
+ logger.info(f"Config:{cfg}")
+
+ api_store.device = device
+
+ logger.info(f"Setting up VinVL Extractor on device: {device}")
+ extractor = VinVLExtractor(cfg=cfg)
+ extractor.to(device)
+ extractor.eval()
+
+ logger.info("Setting up the VinVL transform")
+ transform = VinVLTransform(cfg=cfg)
+
+ api_store.extractor = extractor
+ api_store.transform = transform
+ if settings.classmap_type == "simbot":
+ api_store.entity_classifier = SimBotMLPEntityClassifier(
+ model_path=SIMBOT_ENTITY_MLPCLASSIFIER_PATH,
+ classmap_path=SIMBOT_ENTITY_MLPCLASSIFIER_CLASSMAP_PATH,
+ device=device,
+ )
+
+ logger.info("Setup complete!")
+
+
+@app.get("/")
+@app.get("/ping")
+@app.get("/test")
+async def root(response: Response) -> str:
+ """Ping the API to make sure it is responding."""
+ response.status_code = status.HTTP_200_OK
+ return "success"
+
+
+class DeviceRequestBody(BaseModel):
+ """Pydantic model for the request body when updating the model device.
+
+ This is used because the device is passed as a request body.
+ """
+
+ device: str
+
+
+@app.post("/update_model_device", status_code=status.HTTP_200_OK)
+async def update_model_device(device: DeviceRequestBody) -> str:
+ """Update the device used by the model."""
+ new_device = torch.device(device.device)
+ try:
+ api_store.extractor.to(new_device)
+ except Exception as err:
+ raise HTTPException(
+ status_code=status.HTTP_500_INTERNAL_SERVER_ERROR,
+ detail="Failed to change the model device from {current_device} to {requested_device}".format(
+ current_device=api_store.extractor.device, requested_device=device.device
+ ),
+ ) from err
+
+ if api_store.entity_classifier is not None:
+ try:
+ api_store.entity_classifier.move_to_device(new_device)
+ except Exception as other_err:
+ raise HTTPException(
+ status_code=status.HTTP_500_INTERNAL_SERVER_ERROR,
+ detail="Failed to change the entity classifier device from {current_device} to {requested_device}".format(
+ current_device=api_store.entity_classifier.device,
+ requested_device=device.device,
+ ),
+ ) from other_err
+
+ return "success"
+
+
+@app.post("/features", response_class=TorchResponse)
+def get_features_for_image(input_file: UploadFile) -> TorchResponse:
+ """Endpoint for receiving features for a binary image.
+
+ Example:
+ import requests
+ url = "http://127.0.0.1:8000/features"
+ files = {"input_file": open("cat.jpg", "rb")}
+ response = requests.post(url, files=files)
+ data = response.json()
+
+ Args:
+ input_file (UploadFile): The binary image received from a post request
+
+ Returns:
+ features (ExtractedFeaturesAPI): A pydantic BaseModel with the features of the bounding boxes
+ coordinates, and their probabilities as well as the global cnn features.
+ """
+ logger.debug("Load image")
+ image_bytes = input_file.file.read()
+ pil_image = Image.open(BytesIO(image_bytes))
+
+ features = extract_features_for_batch(pil_image, api_store, settings.batch_size)
+
+ logger.debug("Build response")
+ response = TorchResponse(features[0])
+
+ return response
+
+
+@app.post("/batch_features", response_class=TorchResponse)
+def get_features_for_images(images: list[UploadFile]) -> TorchResponse:
+ """Endpoint for receiving features for a batch of binary images.
+
+ Example:
+ import requests
+ url = "http://127.0.0.1:8000/batch_features"
+ files = [
+ ("images", ("file1", open("storage/data/alfred/000000000.jpg", "rb"))),
+ ("images", ("file2", open("storage/data/alfred/000000001.jpg", "rb")))
+ ]
+ response = requests.post(url, files=files)
+ data = response.json()
+
+ Args:
+ images (list[UploadFile]): A batch of binary images received from a post request. Assumes they all have the same size.
+
+ Returns:
+ features (ExtractedFeaturesAPI): A pydantic BaseModel with the features of the bounding boxes
+ coordinates, and their probabilities as well as the global cnn features.
+ """
+ open_images: list[Image.Image] = []
+
+ logger.debug("Load images")
+ for input_file in images:
+ byte_image = input_file.file.read()
+ io_image = BytesIO(byte_image)
+ io_image.seek(0)
+ open_images.append(Image.open(io_image))
+
+ extracted_features = extract_features_for_batch(open_images, api_store, settings.batch_size)
+
+ logger.debug("Build response")
+ response = TorchResponse(extracted_features)
+
+ return response
+
+
+def main() -> None:
+ """Run the API, exactly the same as the way TEACh does it."""
+ setup_rich_logging(rich_traceback_show_locals=False)
+
+ uvicorn.run(
+ app,
+ host=settings.host,
+ port=settings.port,
+ log_level=settings.log_level,
+ workers=settings.num_workers,
+ )
+
+
+if __name__ == "__main__":
+ main()
diff --git a/src/emma_perception/constants/__init__.py b/src/emma_perception/constants/__init__.py
new file mode 100644
index 0000000..05e8ef4
--- /dev/null
+++ b/src/emma_perception/constants/__init__.py
@@ -0,0 +1,23 @@
+from pathlib import Path
+
+
+CONSTANTS_DIR_PATH = Path(__file__).parent.resolve()
+
+
+VINVL_CONFIG_PATH = CONSTANTS_DIR_PATH.joinpath("vinvl_x152c4.yaml")
+VINVL_ALFRED_CONFIG_PATH = CONSTANTS_DIR_PATH.joinpath("vinvl_x152c4_alfred.yaml")
+VINVL_SIMBOT_CONFIG_PATH = CONSTANTS_DIR_PATH.joinpath("vinvl_x152c4_simbot_customised.yaml")
+
+
+VINVL_ALFRED_CLASS_MAP_PATH = CONSTANTS_DIR_PATH.joinpath("vinvl_x152c4_alfred_classmap.json")
+VINVL_CLASS_MAP_PATH = CONSTANTS_DIR_PATH.joinpath("vinvl_x152c4_classmap.json")
+# VINVL_SIMBOT_CLASS_MAP_PATH = CONSTANTS_DIR_PATH.joinpath("vinvl_x152c4_simbot_classmap.json")
+# VINVL_SIMBOT_CLASS_MAP_PATH = CONSTANTS_DIR_PATH.joinpath("vinvl_x152c4_simbot_classmap_v124.json")
+VINVL_SIMBOT_CLASS_MAP_PATH = CONSTANTS_DIR_PATH.joinpath(
+ "vinvl_x152c4_simbot_classmap_v124_customised.json"
+)
+SIMBOT_ENTITY_CLASSIFER_CENTROID_PATH = CONSTANTS_DIR_PATH.joinpath("entity_centroids.pt")
+SIMBOT_ENTITY_MLPCLASSIFIER_PATH = CONSTANTS_DIR_PATH.joinpath("entity_classifier.ckpt")
+SIMBOT_ENTITY_MLPCLASSIFIER_CLASSMAP_PATH = CONSTANTS_DIR_PATH.joinpath(
+ "entity_classlabel_map.json"
+)
diff --git a/src/emma_perception/constants/entity_centroids.pt b/src/emma_perception/constants/entity_centroids.pt
new file mode 100644
index 0000000..ce14a75
Binary files /dev/null and b/src/emma_perception/constants/entity_centroids.pt differ
diff --git a/src/emma_perception/constants/entity_centroids_knn.pt b/src/emma_perception/constants/entity_centroids_knn.pt
new file mode 100644
index 0000000..12c4d89
Binary files /dev/null and b/src/emma_perception/constants/entity_centroids_knn.pt differ
diff --git a/src/emma_perception/constants/entity_classifier.ckpt b/src/emma_perception/constants/entity_classifier.ckpt
new file mode 100644
index 0000000..e903d2c
Binary files /dev/null and b/src/emma_perception/constants/entity_classifier.ckpt differ
diff --git a/src/emma_perception/constants/entity_classlabel_map.json b/src/emma_perception/constants/entity_classlabel_map.json
new file mode 100644
index 0000000..14ff558
--- /dev/null
+++ b/src/emma_perception/constants/entity_classlabel_map.json
@@ -0,0 +1,53 @@
+{
+ "label2idx": {
+ "Blue Button": "0",
+ "Blue Desk": "1",
+ "Bookshelf": "2",
+ "Button": "3",
+ "Computer": "4",
+ "Desk": "5",
+ "Embiggenator Monitor": "6",
+ "Emotion Tester": "7",
+ "Freeze Ray Monitor": "8",
+ "Freeze Ray Shelf": "9",
+ "Gravity Monitor": "10",
+ "Green Button": "11",
+ "Green Desk": "12",
+ "Laser Monitor": "13",
+ "Laser Shelf": "14",
+ "Portal Generator Monitor": "15",
+ "Reception Desk": "16",
+ "Red Button": "17",
+ "Red Desk": "18",
+ "Security Button": "19",
+ "Shelf": "20",
+ "Table": "21",
+ "Yellow Desk": "22"
+ },
+ "idx2label": {
+ "0": "Blue Button",
+ "1": "Blue Desk",
+ "2": "Bookshelf",
+ "3": "Button",
+ "4": "Computer",
+ "5": "Desk",
+ "6": "Embiggenator Monitor",
+ "7": "Emotion Tester",
+ "8": "Freeze Ray Monitor",
+ "9": "Freeze Ray Shelf",
+ "10": "Gravity Monitor",
+ "11": "Green Button",
+ "12": "Green Desk",
+ "13": "Laser Monitor",
+ "14": "Laser Shelf",
+ "15": "Portal Generator Monitor",
+ "16": "Reception Desk",
+ "17": "Red Button",
+ "18": "Red Desk",
+ "19": "Security Button",
+ "20": "Shelf",
+ "21": "Table",
+ "22": "Yellow Desk"
+ },
+ "class_labels": ["Button", "Computer", "Shelf", "Table", "Wall Shelf"]
+}
diff --git a/src/emma_perception/constants/vinvl_x152c4.yaml b/src/emma_perception/constants/vinvl_x152c4.yaml
new file mode 100644
index 0000000..fbb0e7e
--- /dev/null
+++ b/src/emma_perception/constants/vinvl_x152c4.yaml
@@ -0,0 +1,59 @@
+MODEL:
+ META_ARCHITECTURE: "AttrRCNN"
+ WEIGHT: "storage/model/vinvl_vg_x152c4.pth"
+ BACKBONE:
+ CONV_BODY: "R-152-C4"
+ RESNETS:
+ BACKBONE_OUT_CHANNELS: 1024
+ STRIDE_IN_1X1: False
+ NUM_GROUPS: 32
+ WIDTH_PER_GROUP: 8
+ RPN:
+ PRE_NMS_TOP_N_TEST: 6000
+ POST_NMS_TOP_N_TEST: 300
+ ROI_HEADS:
+ BATCH_SIZE_PER_IMAGE: 384 # 512
+ POSITIVE_FRACTION: 0.5 # 0.25
+ SCORE_THRESH: 0.2 # 0.0001
+ DETECTIONS_PER_IMG: 36 # 600
+ MIN_DETECTIONS_PER_IMG: 10
+ NMS_FILTER: 1
+ ROI_BOX_HEAD:
+ NUM_CLASSES: 1595
+ ROI_ATTRIBUTE_HEAD:
+ NUM_ATTRIBUTES: 525
+ POSTPROCESS_ATTRIBUTES_THRESHOLD: 0.05
+ ATTRIBUTE_ON: True
+INPUT:
+ MIN_SIZE_TEST: 600
+ MAX_SIZE_TEST: 1000
+ PIXEL_MEAN: [103.530, 116.280, 123.675]
+DATASETS:
+ # FACTORY_TEST: ("ODTSVDataset",)
+ # TEST: ("flickr30k/tsv/flickr30k.yaml",)
+ LABELMAP_FILE: "visualgenome/VG-SGG-dicts-vgoi6-clipped.json"
+ TRAIN: ("visualgenome/train_vgoi6_clipped.yaml",)
+ TEST: ("visualgenome/test_vgoi6_clipped.yaml",)
+ FACTORY_TRAIN: ("VGTSVDataset",)
+ FACTORY_TEST: ("VGTSVDataset",)
+DATALOADER:
+ NUM_WORKERS: 0
+SOLVER:
+ BASE_LR: 0.01
+ WEIGHT_DECAY: 0.0001
+ MAX_ITER: 90000
+ STEPS: (49000, 65000)
+ IMS_PER_BATCH: 1
+ CHECKPOINT_PERIOD: 10000
+TEST:
+ IMS_PER_BATCH: 1
+ SKIP_PERFORMANCE_EVAL: True
+ SAVE_PREDICTIONS: True
+ SAVE_RESULTS_TO_TSV: True
+ TSV_SAVE_SUBSET: ["rect", "class", "conf", "feature"]
+ OUTPUT_FEATURE: True
+ GATHER_ON_CPU: True
+ IGNORE_BOX_REGRESSION: False
+OUTPUT_DIR: "./output/X152C5_test"
+DATA_DIR: "./datasets"
+DISTRIBUTED_BACKEND: "gloo"
diff --git a/src/emma_perception/constants/vinvl_x152c4_alfred.yaml b/src/emma_perception/constants/vinvl_x152c4_alfred.yaml
new file mode 100644
index 0000000..f80084d
--- /dev/null
+++ b/src/emma_perception/constants/vinvl_x152c4_alfred.yaml
@@ -0,0 +1,55 @@
+MODEL:
+ META_ARCHITECTURE: "AttrRCNN"
+ WEIGHT: "pretrained/vinvl_vg_x152c4.pth"
+ BACKBONE:
+ CONV_BODY: "R-152-C4"
+ RESNETS:
+ BACKBONE_OUT_CHANNELS: 1024
+ STRIDE_IN_1X1: False
+ NUM_GROUPS: 32
+ WIDTH_PER_GROUP: 8
+ RPN:
+ PRE_NMS_TOP_N_TEST: 6000
+ POST_NMS_TOP_N_TEST: 300
+ ROI_HEADS:
+ BATCH_SIZE_PER_IMAGE: 384 # 512
+ POSITIVE_FRACTION: 0.5 # 0.25
+ SCORE_THRESH: 0.1 # 0.0001
+ DETECTIONS_PER_IMG: 36 # 600
+ MIN_DETECTIONS_PER_IMG: 1
+ ROI_BOX_HEAD:
+ NUM_CLASSES: 117
+ ATTRIBUTE_ON: False
+ RELATION_ON: False
+INPUT:
+ MIN_SIZE_TEST: 800
+ MAX_SIZE_TEST: 1200
+ PIXEL_MEAN: [103.530, 116.280, 123.675]
+DATASETS:
+ # FACTORY_TEST: ("ODTSVDataset",)
+ # TEST: ("flickr30k/tsv/flickr30k.yaml",)
+ TRAIN: ("train/train.yaml",)
+ TEST: ("valid_seen/train.yaml",)
+ FACTORY_TRAIN: ("VGTSVDataset",)
+ FACTORY_TEST: ("VGTSVDataset",)
+DATALOADER:
+ NUM_WORKERS: 0
+SOLVER:
+ BASE_LR: 0.0001
+ WEIGHT_DECAY: 0.00001
+ MAX_ITER: 36000
+ STEPS: (15000, 25000)
+ IMS_PER_BATCH: 16
+ CHECKPOINT_PERIOD: 5000
+ TEST_PERIOD: 4000
+TEST:
+ IMS_PER_BATCH: 16
+ SKIP_PERFORMANCE_EVAL: False
+ SAVE_PREDICTIONS: True
+ SAVE_RESULTS_TO_TSV: True
+ TSV_SAVE_SUBSET: ["rect", "class", "conf", "feature"]
+ GATHER_ON_CPU: False
+ OUTPUT_FEATURE: True
+OUTPUT_DIR: "./output/X152C4_test_weight_e2"
+DATA_DIR: "datasets/alfred/"
+DISTRIBUTED_BACKEND: "gloo"
diff --git a/src/emma_perception/constants/vinvl_x152c4_alfred_classmap.json b/src/emma_perception/constants/vinvl_x152c4_alfred_classmap.json
new file mode 100644
index 0000000..8a26dfd
--- /dev/null
+++ b/src/emma_perception/constants/vinvl_x152c4_alfred_classmap.json
@@ -0,0 +1,240 @@
+{
+ "label_to_idx": {
+ "Background": 0,
+ "AlarmClock": 1,
+ "Apple": 2,
+ "AppleSliced": 3,
+ "ArmChair": 4,
+ "BaseballBat": 5,
+ "BasketBall": 6,
+ "Bathtub": 7,
+ "BathtubBasin": 8,
+ "Bed": 9,
+ "Blinds": 10,
+ "Book": 11,
+ "Boots": 12,
+ "Bowl": 13,
+ "Box": 14,
+ "Bread": 15,
+ "BreadSliced": 16,
+ "ButterKnife": 17,
+ "CD": 18,
+ "Cabinet": 19,
+ "Candle": 20,
+ "Cart": 21,
+ "CellPhone": 22,
+ "Chair": 23,
+ "Cloth": 24,
+ "CoffeeMachine": 25,
+ "CoffeeTable": 26,
+ "CounterTop": 27,
+ "CreditCard": 28,
+ "Cup": 29,
+ "Curtains": 30,
+ "Desk": 31,
+ "DeskLamp": 32,
+ "DiningTable": 33,
+ "DishSponge": 34,
+ "Drawer": 35,
+ "Dresser": 36,
+ "Egg": 37,
+ "EggCracked": 38,
+ "Faucet": 39,
+ "FloorLamp": 40,
+ "Footstool": 41,
+ "Fork": 42,
+ "Fridge": 43,
+ "GarbageCan": 44,
+ "Glassbottle": 45,
+ "HandTowel": 46,
+ "HandTowelHolder": 47,
+ "HousePlant": 48,
+ "Kettle": 49,
+ "KeyChain": 50,
+ "Knife": 51,
+ "Ladle": 52,
+ "Lamp": 53,
+ "Laptop": 54,
+ "LaundryHamper": 55,
+ "LaundryHamperLid": 56,
+ "Lettuce": 57,
+ "LettuceSliced": 58,
+ "LightSwitch": 59,
+ "Microwave": 60,
+ "Mirror": 61,
+ "Mug": 62,
+ "Newspaper": 63,
+ "Ottoman": 64,
+ "Painting": 65,
+ "Pan": 66,
+ "PaperTowelRoll": 67,
+ "Pen": 68,
+ "Pencil": 69,
+ "PepperShaker": 70,
+ "Pillow": 71,
+ "Plate": 72,
+ "Plunger": 73,
+ "Poster": 74,
+ "Pot": 75,
+ "Potato": 76,
+ "PotatoSliced": 77,
+ "RemoteControl": 78,
+ "Safe": 79,
+ "SaltShaker": 80,
+ "ScrubBrush": 81,
+ "Shelf": 82,
+ "ShowerCurtain": 83,
+ "ShowerDoor": 84,
+ "ShowerGlass": 85,
+ "ShowerHead": 86,
+ "SideTable": 87,
+ "Sink": 88,
+ "SinkBasin": 89,
+ "SoapBar": 90,
+ "SoapBottle": 91,
+ "Sofa": 92,
+ "Spatula": 93,
+ "Spoon": 94,
+ "SprayBottle": 95,
+ "Statue": 96,
+ "StoveBurner": 97,
+ "StoveKnob": 98,
+ "TVStand": 99,
+ "TeddyBear": 100,
+ "Television": 101,
+ "TennisRacket": 102,
+ "TissueBox": 103,
+ "Toaster": 104,
+ "Toilet": 105,
+ "ToiletPaper": 106,
+ "ToiletPaperHanger": 107,
+ "Tomato": 108,
+ "TomatoSliced": 109,
+ "Towel": 110,
+ "TowelHolder": 111,
+ "Vase": 112,
+ "Watch": 113,
+ "WateringCan": 114,
+ "Window": 115,
+ "WineBottle": 116
+ },
+ "idx_to_label": {
+ "0": "Background",
+ "1": "AlarmClock",
+ "2": "Apple",
+ "3": "AppleSliced",
+ "4": "ArmChair",
+ "5": "BaseballBat",
+ "6": "BasketBall",
+ "7": "Bathtub",
+ "8": "BathtubBasin",
+ "9": "Bed",
+ "10": "Blinds",
+ "11": "Book",
+ "12": "Boots",
+ "13": "Bowl",
+ "14": "Box",
+ "15": "Bread",
+ "16": "BreadSliced",
+ "17": "ButterKnife",
+ "18": "CD",
+ "19": "Cabinet",
+ "20": "Candle",
+ "21": "Cart",
+ "22": "CellPhone",
+ "23": "Chair",
+ "24": "Cloth",
+ "25": "CoffeeMachine",
+ "26": "CoffeeTable",
+ "27": "CounterTop",
+ "28": "CreditCard",
+ "29": "Cup",
+ "30": "Curtains",
+ "31": "Desk",
+ "32": "DeskLamp",
+ "33": "DiningTable",
+ "34": "DishSponge",
+ "35": "Drawer",
+ "36": "Dresser",
+ "37": "Egg",
+ "38": "EggCracked",
+ "39": "Faucet",
+ "40": "FloorLamp",
+ "41": "Footstool",
+ "42": "Fork",
+ "43": "Fridge",
+ "44": "GarbageCan",
+ "45": "Glassbottle",
+ "46": "HandTowel",
+ "47": "HandTowelHolder",
+ "48": "HousePlant",
+ "49": "Kettle",
+ "50": "KeyChain",
+ "51": "Knife",
+ "52": "Ladle",
+ "53": "Lamp",
+ "54": "Laptop",
+ "55": "LaundryHamper",
+ "56": "LaundryHamperLid",
+ "57": "Lettuce",
+ "58": "LettuceSliced",
+ "59": "LightSwitch",
+ "60": "Microwave",
+ "61": "Mirror",
+ "62": "Mug",
+ "63": "Newspaper",
+ "64": "Ottoman",
+ "65": "Painting",
+ "66": "Pan",
+ "67": "PaperTowelRoll",
+ "68": "Pen",
+ "69": "Pencil",
+ "70": "PepperShaker",
+ "71": "Pillow",
+ "72": "Plate",
+ "73": "Plunger",
+ "74": "Poster",
+ "75": "Pot",
+ "76": "Potato",
+ "77": "PotatoSliced",
+ "78": "RemoteControl",
+ "79": "Safe",
+ "80": "SaltShaker",
+ "81": "ScrubBrush",
+ "82": "Shelf",
+ "83": "ShowerCurtain",
+ "84": "ShowerDoor",
+ "85": "ShowerGlass",
+ "86": "ShowerHead",
+ "87": "SideTable",
+ "88": "Sink",
+ "89": "SinkBasin",
+ "90": "SoapBar",
+ "91": "SoapBottle",
+ "92": "Sofa",
+ "93": "Spatula",
+ "94": "Spoon",
+ "95": "SprayBottle",
+ "96": "Statue",
+ "97": "StoveBurner",
+ "98": "StoveKnob",
+ "99": "TVStand",
+ "100": "TeddyBear",
+ "101": "Television",
+ "102": "TennisRacket",
+ "103": "TissueBox",
+ "104": "Toaster",
+ "105": "Toilet",
+ "106": "ToiletPaper",
+ "107": "ToiletPaperHanger",
+ "108": "Tomato",
+ "109": "TomatoSliced",
+ "110": "Towel",
+ "111": "TowelHolder",
+ "112": "Vase",
+ "113": "Watch",
+ "114": "WateringCan",
+ "115": "Window",
+ "116": "WineBottle"
+ }
+}
diff --git a/src/emma_perception/constants/vinvl_x152c4_classmap.json b/src/emma_perception/constants/vinvl_x152c4_classmap.json
new file mode 100644
index 0000000..36f9077
--- /dev/null
+++ b/src/emma_perception/constants/vinvl_x152c4_classmap.json
@@ -0,0 +1,6526 @@
+{
+ "label_to_idx": {
+ "unknown": 0,
+ "ad": 1,
+ "adult": 2,
+ "advertisement": 3,
+ "air": 4,
+ "air conditioner": 5,
+ "air vent": 6,
+ "aircraft": 7,
+ "airplane": 8,
+ "airport": 9,
+ "alarm clock": 10,
+ "alcohol": 11,
+ "alley": 12,
+ "almond": 13,
+ "ambulance": 14,
+ "american flag": 15,
+ "animal": 16,
+ "ankle": 17,
+ "antelope": 18,
+ "antenna": 19,
+ "apartment": 20,
+ "apartment building": 21,
+ "apple": 22,
+ "apple logo": 23,
+ "appliance": 24,
+ "apron": 25,
+ "aquarium": 26,
+ "arch": 27,
+ "archway": 28,
+ "area": 29,
+ "area rug": 30,
+ "arm": 31,
+ "armchair": 32,
+ "armrest": 33,
+ "arrow": 34,
+ "art": 35,
+ "artichoke": 36,
+ "artwork": 37,
+ "asparagus": 38,
+ "asphalt": 39,
+ "athlete": 40,
+ "athletic shoe": 41,
+ "audience": 42,
+ "avocado": 43,
+ "awning": 44,
+ "baby": 45,
+ "back": 46,
+ "back pack": 47,
+ "background": 48,
+ "backpack": 49,
+ "backsplash": 50,
+ "backyard": 51,
+ "bacon": 52,
+ "badge": 53,
+ "bag": 54,
+ "bagel": 55,
+ "baked good": 56,
+ "balcony": 57,
+ "ball": 58,
+ "ball cap": 59,
+ "balloon": 60,
+ "bamboo": 61,
+ "banana": 62,
+ "banana bunch": 63,
+ "banana peel": 64,
+ "banana slice": 65,
+ "band": 66,
+ "bandage": 67,
+ "bandana": 68,
+ "bang": 69,
+ "bank": 70,
+ "banner": 71,
+ "bar": 72,
+ "bar stool": 73,
+ "bark": 74,
+ "barn": 75,
+ "barrel": 76,
+ "barricade": 77,
+ "barrier": 78,
+ "base": 79,
+ "baseball": 80,
+ "baseball bat": 81,
+ "baseball cap": 82,
+ "baseball field": 83,
+ "baseball game": 84,
+ "baseball glove": 85,
+ "baseball mitt": 86,
+ "baseball player": 87,
+ "baseball players": 88,
+ "baseball uniform": 89,
+ "baseboard": 90,
+ "baseline": 91,
+ "basil": 92,
+ "basin": 93,
+ "basket": 94,
+ "bat": 95,
+ "bath towel": 96,
+ "bath tub": 97,
+ "bathing suit": 98,
+ "bathroom": 99,
+ "bathroom sink": 100,
+ "bathtub": 101,
+ "batter": 102,
+ "battery": 103,
+ "beach": 104,
+ "beach chair": 105,
+ "beach umbrella": 106,
+ "bead": 107,
+ "beak": 108,
+ "beam": 109,
+ "bean": 110,
+ "beanie": 111,
+ "bear": 112,
+ "beard": 113,
+ "bed": 114,
+ "bed frame": 115,
+ "bedding": 116,
+ "bedroom": 117,
+ "bedspread": 118,
+ "beef": 119,
+ "beer": 120,
+ "beer bottle": 121,
+ "beet": 122,
+ "bell": 123,
+ "belt": 124,
+ "bench": 125,
+ "berry": 126,
+ "beverage": 127,
+ "bib": 128,
+ "bicycle": 129,
+ "bicyclist": 130,
+ "bike": 131,
+ "bike rack": 132,
+ "biker": 133,
+ "bikini": 134,
+ "billboard": 135,
+ "bin": 136,
+ "binder": 137,
+ "bird": 138,
+ "bird cage": 139,
+ "birthday cake": 140,
+ "biscuit": 141,
+ "black": 142,
+ "blackberry": 143,
+ "blade": 144,
+ "blanket": 145,
+ "blazer": 146,
+ "bleacher": 147,
+ "blender": 148,
+ "blind": 149,
+ "block": 150,
+ "blood": 151,
+ "blossom": 152,
+ "blouse": 153,
+ "blueberry": 154,
+ "board": 155,
+ "boardwalk": 156,
+ "boat": 157,
+ "body": 158,
+ "bolt": 159,
+ "bone": 160,
+ "book": 161,
+ "book shelf": 162,
+ "bookcase": 163,
+ "bookshelf": 164,
+ "boot": 165,
+ "booth": 166,
+ "border": 167,
+ "bottle": 168,
+ "bottle cap": 169,
+ "bottom": 170,
+ "boulder": 171,
+ "bouquet": 172,
+ "bow": 173,
+ "bow tie": 174,
+ "bowl": 175,
+ "box": 176,
+ "boy": 177,
+ "bracelet": 178,
+ "bracket": 179,
+ "brake light": 180,
+ "branch": 181,
+ "bread": 182,
+ "breakfast": 183,
+ "breast": 184,
+ "brick": 185,
+ "brick wall": 186,
+ "bride": 187,
+ "bridge": 188,
+ "bridle": 189,
+ "briefcase": 190,
+ "brim": 191,
+ "broccoli": 192,
+ "brocolli": 193,
+ "broom": 194,
+ "brownie": 195,
+ "brush": 196,
+ "bubble": 197,
+ "bucket": 198,
+ "buckle": 199,
+ "bud": 200,
+ "buffalo": 201,
+ "bug": 202,
+ "building": 203,
+ "bull": 204,
+ "bumper": 205,
+ "bun": 206,
+ "bunch": 207,
+ "bunny": 208,
+ "buoy": 209,
+ "burger": 210,
+ "burner": 211,
+ "bus": 212,
+ "bus driver": 213,
+ "bus stop": 214,
+ "bush": 215,
+ "butter": 216,
+ "butter knife": 217,
+ "butterfly": 218,
+ "button": 219,
+ "cab": 220,
+ "cabbage": 221,
+ "cabin": 222,
+ "cabinet": 223,
+ "cabinet door": 224,
+ "cable": 225,
+ "caboose": 226,
+ "cactus": 227,
+ "cafe": 228,
+ "cage": 229,
+ "cake": 230,
+ "calculator": 231,
+ "calendar": 232,
+ "calf": 233,
+ "camera": 234,
+ "can": 235,
+ "canal": 236,
+ "candle": 237,
+ "candle holder": 238,
+ "candy": 239,
+ "cane": 240,
+ "canister": 241,
+ "canoe": 242,
+ "canopy": 243,
+ "cap": 244,
+ "car": 245,
+ "card": 246,
+ "cardboard": 247,
+ "cardboard box": 248,
+ "cargo": 249,
+ "carpet": 250,
+ "carriage": 251,
+ "carrot": 252,
+ "cart": 253,
+ "carton": 254,
+ "case": 255,
+ "castle": 256,
+ "cat": 257,
+ "catcher": 258,
+ "catchers mitt": 259,
+ "cattle": 260,
+ "cauliflower": 261,
+ "cd": 262,
+ "ceiling": 263,
+ "ceiling fan": 264,
+ "ceiling light": 265,
+ "celery": 266,
+ "cell phone": 267,
+ "cellphone": 268,
+ "cement": 269,
+ "cereal": 270,
+ "chain": 271,
+ "chair": 272,
+ "chalkboard": 273,
+ "chandelier": 274,
+ "character": 275,
+ "charger": 276,
+ "cheek": 277,
+ "cheese": 278,
+ "chef": 279,
+ "cherry": 280,
+ "chest": 281,
+ "chicken": 282,
+ "child": 283,
+ "chili": 284,
+ "chimney": 285,
+ "chin": 286,
+ "chip": 287,
+ "chocolate": 288,
+ "chopstick": 289,
+ "christmas light": 290,
+ "christmas tree": 291,
+ "church": 292,
+ "cigarette": 293,
+ "circle": 294,
+ "city": 295,
+ "classroom": 296,
+ "claw": 297,
+ "clay": 298,
+ "cleat": 299,
+ "cliff": 300,
+ "clock": 301,
+ "clock face": 302,
+ "clock hand": 303,
+ "clock tower": 304,
+ "closet": 305,
+ "cloth": 306,
+ "clothes": 307,
+ "clothing": 308,
+ "cloud": 309,
+ "coach": 310,
+ "coaster": 311,
+ "coat": 312,
+ "cockpit": 313,
+ "coconut": 314,
+ "coffee": 315,
+ "coffee cup": 316,
+ "coffee maker": 317,
+ "coffee mug": 318,
+ "coffee pot": 319,
+ "coffee table": 320,
+ "coin": 321,
+ "coin slot": 322,
+ "coke": 323,
+ "collar": 324,
+ "column": 325,
+ "comb": 326,
+ "comforter": 327,
+ "computer": 328,
+ "computer desk": 329,
+ "computer keyboard": 330,
+ "computer monitor": 331,
+ "computer mouse": 332,
+ "computer screen": 333,
+ "concrete": 334,
+ "condiment": 335,
+ "conductor": 336,
+ "cone": 337,
+ "console": 338,
+ "container": 339,
+ "control": 340,
+ "control panel": 341,
+ "controller": 342,
+ "cooker": 343,
+ "cookie": 344,
+ "cooking utensil": 345,
+ "cooler": 346,
+ "copyright": 347,
+ "cord": 348,
+ "corn": 349,
+ "costume": 350,
+ "couch": 351,
+ "countertop": 352,
+ "couple": 353,
+ "court": 354,
+ "courtyard": 355,
+ "cover": 356,
+ "cow": 357,
+ "cowboy": 358,
+ "cowboy hat": 359,
+ "cpu": 360,
+ "crab": 361,
+ "cracker": 362,
+ "crane": 363,
+ "crate": 364,
+ "cream": 365,
+ "croissant": 366,
+ "cross": 367,
+ "crosswalk": 368,
+ "crowd": 369,
+ "crown": 370,
+ "crumb": 371,
+ "crust": 372,
+ "cub": 373,
+ "cucumber": 374,
+ "cuff": 375,
+ "cup": 376,
+ "cupboard": 377,
+ "cupcake": 378,
+ "curb": 379,
+ "curtain": 380,
+ "cushion": 381,
+ "customer": 382,
+ "cutting board": 383,
+ "cycle": 384,
+ "cyclist": 385,
+ "daisy": 386,
+ "dashboard": 387,
+ "date": 388,
+ "day": 389,
+ "decal": 390,
+ "deck": 391,
+ "decoration": 392,
+ "deer": 393,
+ "desert": 394,
+ "design": 395,
+ "desk": 396,
+ "desk lamp": 397,
+ "dessert": 398,
+ "device": 399,
+ "dial": 400,
+ "diamond": 401,
+ "dining room": 402,
+ "dining table": 403,
+ "dinner": 404,
+ "dinosaur": 405,
+ "dip": 406,
+ "dirt": 407,
+ "dirt bike": 408,
+ "dirt road": 409,
+ "disc": 410,
+ "dish": 411,
+ "dish soap": 412,
+ "dishwasher": 413,
+ "dispenser": 414,
+ "display": 415,
+ "display case": 416,
+ "distance": 417,
+ "dock": 418,
+ "dog": 419,
+ "doll": 420,
+ "dome": 421,
+ "donkey": 422,
+ "donut": 423,
+ "door": 424,
+ "door frame": 425,
+ "door handle": 426,
+ "door knob": 427,
+ "doorknob": 428,
+ "doorway": 429,
+ "dot": 430,
+ "dough": 431,
+ "dragon": 432,
+ "drain": 433,
+ "drape": 434,
+ "drawer": 435,
+ "drawing": 436,
+ "dress": 437,
+ "dress shirt": 438,
+ "dresser": 439,
+ "dressing": 440,
+ "drink": 441,
+ "driver": 442,
+ "driveway": 443,
+ "drum": 444,
+ "dryer": 445,
+ "duck": 446,
+ "dugout": 447,
+ "dumpster": 448,
+ "dvd": 449,
+ "dvd player": 450,
+ "eagle": 451,
+ "ear": 452,
+ "earphone": 453,
+ "earring": 454,
+ "easel": 455,
+ "egg": 456,
+ "eggplant": 457,
+ "elbow": 458,
+ "elbow pad": 459,
+ "electrical outlet": 460,
+ "electronics": 461,
+ "elephant": 462,
+ "emblem": 463,
+ "employee": 464,
+ "enclosure": 465,
+ "end": 466,
+ "end table": 467,
+ "engine": 468,
+ "engineer": 469,
+ "entertainment center": 470,
+ "entrance": 471,
+ "envelope": 472,
+ "exhaust pipe": 473,
+ "eye": 474,
+ "eyebrow": 475,
+ "face": 476,
+ "face mask": 477,
+ "facial hair": 478,
+ "family": 479,
+ "fan": 480,
+ "farm": 481,
+ "father": 482,
+ "faucet": 483,
+ "feather": 484,
+ "feeder": 485,
+ "female": 486,
+ "fence": 487,
+ "fence post": 488,
+ "fencing": 489,
+ "fender": 490,
+ "fern": 491,
+ "field": 492,
+ "figure": 493,
+ "figurine": 494,
+ "fin": 495,
+ "finger": 496,
+ "fingernail": 497,
+ "fire": 498,
+ "fire escape": 499,
+ "fire extinguisher": 500,
+ "fire hydrant": 501,
+ "fire truck": 502,
+ "fireplace": 503,
+ "fish": 504,
+ "fixture": 505,
+ "flag": 506,
+ "flame": 507,
+ "flamingo": 508,
+ "flip flop": 509,
+ "floor": 510,
+ "floor lamp": 511,
+ "flooring": 512,
+ "floret": 513,
+ "flour": 514,
+ "flower": 515,
+ "flower pot": 516,
+ "foam": 517,
+ "fog": 518,
+ "foil": 519,
+ "folder": 520,
+ "folding chair": 521,
+ "foliage": 522,
+ "food": 523,
+ "food truck": 524,
+ "foot": 525,
+ "foot print": 526,
+ "football": 527,
+ "footboard": 528,
+ "footprint": 529,
+ "foreground": 530,
+ "forehead": 531,
+ "forest": 532,
+ "fork": 533,
+ "fountain": 534,
+ "frame": 535,
+ "freezer": 536,
+ "french fries": 537,
+ "french fry": 538,
+ "frisbee": 539,
+ "frog": 540,
+ "front": 541,
+ "front legs": 542,
+ "front window": 543,
+ "frosting": 544,
+ "fruit": 545,
+ "fruit stand": 546,
+ "fry": 547,
+ "fur": 548,
+ "furniture": 549,
+ "fuselage": 550,
+ "gadget": 551,
+ "game": 552,
+ "game controller": 553,
+ "garage": 554,
+ "garage door": 555,
+ "garbage can": 556,
+ "garden": 557,
+ "garland": 558,
+ "garlic": 559,
+ "garment": 560,
+ "garnish": 561,
+ "gas station": 562,
+ "gas tank": 563,
+ "gate": 564,
+ "gazebo": 565,
+ "gazelle": 566,
+ "gear": 567,
+ "gentleman": 568,
+ "gift": 569,
+ "giraffe": 570,
+ "giraffe head": 571,
+ "girl": 572,
+ "glass": 573,
+ "glass door": 574,
+ "glass window": 575,
+ "glasses": 576,
+ "glaze": 577,
+ "globe": 578,
+ "glove": 579,
+ "goal": 580,
+ "goat": 581,
+ "goatee": 582,
+ "goggles": 583,
+ "goose": 584,
+ "gown": 585,
+ "graffiti": 586,
+ "grafitti": 587,
+ "grape": 588,
+ "grapefruit": 589,
+ "grass": 590,
+ "grass field": 591,
+ "grate": 592,
+ "gravel": 593,
+ "gravy": 594,
+ "green": 595,
+ "grill": 596,
+ "grinder": 597,
+ "groom": 598,
+ "ground": 599,
+ "group": 600,
+ "guard rail": 601,
+ "guitar": 602,
+ "gun": 603,
+ "guy": 604,
+ "hair": 605,
+ "hair dryer": 606,
+ "half": 607,
+ "hallway": 608,
+ "halter": 609,
+ "ham": 610,
+ "hamburger": 611,
+ "hammer": 612,
+ "hand": 613,
+ "hand towel": 614,
+ "handbag": 615,
+ "handle": 616,
+ "handle bars": 617,
+ "handlebar": 618,
+ "hangar": 619,
+ "hanger": 620,
+ "harbor": 621,
+ "harness": 622,
+ "hat": 623,
+ "hay": 624,
+ "head": 625,
+ "head band": 626,
+ "head light": 627,
+ "headband": 628,
+ "headboard": 629,
+ "headlight": 630,
+ "headphone": 631,
+ "heart": 632,
+ "heater": 633,
+ "hedge": 634,
+ "heel": 635,
+ "helicopter": 636,
+ "helmet": 637,
+ "herb": 638,
+ "herd": 639,
+ "highway": 640,
+ "hill": 641,
+ "hill side": 642,
+ "hillside": 643,
+ "hilltop": 644,
+ "holder": 645,
+ "hole": 646,
+ "home": 647,
+ "home plate": 648,
+ "honey": 649,
+ "hood": 650,
+ "hoodie": 651,
+ "hoof": 652,
+ "hook": 653,
+ "horizon": 654,
+ "horn": 655,
+ "horse": 656,
+ "hose": 657,
+ "hot dog": 658,
+ "hotel": 659,
+ "hotel room": 660,
+ "hour hand": 661,
+ "house": 662,
+ "hubcap": 663,
+ "hurdle": 664,
+ "hut": 665,
+ "ice": 666,
+ "ice cream": 667,
+ "icing": 668,
+ "icon": 669,
+ "image": 670,
+ "infield": 671,
+ "ingredient": 672,
+ "inside": 673,
+ "instruction": 674,
+ "instrument": 675,
+ "intersection": 676,
+ "iphone": 677,
+ "ipod": 678,
+ "island": 679,
+ "item": 680,
+ "ivy": 681,
+ "jacket": 682,
+ "jar": 683,
+ "jean": 684,
+ "jeep": 685,
+ "jersey": 686,
+ "jet": 687,
+ "jet engine": 688,
+ "jockey": 689,
+ "jug": 690,
+ "juice": 691,
+ "jumpsuit": 692,
+ "kayak": 693,
+ "ketchup": 694,
+ "ketchup bottle": 695,
+ "kettle": 696,
+ "key": 697,
+ "keyboard": 698,
+ "keypad": 699,
+ "kickstand": 700,
+ "kid": 701,
+ "kiosk": 702,
+ "kitchen": 703,
+ "kite": 704,
+ "kitten": 705,
+ "kitty": 706,
+ "kiwi": 707,
+ "knee": 708,
+ "knee pad": 709,
+ "kneepad": 710,
+ "knife": 711,
+ "knife block": 712,
+ "knob": 713,
+ "knot": 714,
+ "label": 715,
+ "ladder": 716,
+ "ladle": 717,
+ "lady": 718,
+ "lake": 719,
+ "lamb": 720,
+ "lamp": 721,
+ "lamp post": 722,
+ "lamp shade": 723,
+ "lampshade": 724,
+ "land": 725,
+ "landing gear": 726,
+ "landscape": 727,
+ "lane": 728,
+ "lantern": 729,
+ "lanyard": 730,
+ "lapel": 731,
+ "laptop": 732,
+ "laptop computer": 733,
+ "latch": 734,
+ "lawn": 735,
+ "layer": 736,
+ "leaf": 737,
+ "leash": 738,
+ "ledge": 739,
+ "leg": 740,
+ "legging": 741,
+ "lemon": 742,
+ "letter": 743,
+ "lettering": 744,
+ "lettuce": 745,
+ "license": 746,
+ "license plate": 747,
+ "lid": 748,
+ "life jacket": 749,
+ "life preserver": 750,
+ "life vest": 751,
+ "lift": 752,
+ "light": 753,
+ "light bulb": 754,
+ "light fixture": 755,
+ "light pole": 756,
+ "light post": 757,
+ "light switch": 758,
+ "lighter": 759,
+ "lighthouse": 760,
+ "limb": 761,
+ "lime": 762,
+ "line": 763,
+ "lion": 764,
+ "lip": 765,
+ "lipstick": 766,
+ "liquid": 767,
+ "little girl": 768,
+ "living room": 769,
+ "lock": 770,
+ "locomotive": 771,
+ "log": 772,
+ "logo": 773,
+ "lot": 774,
+ "lotion": 775,
+ "lounge chair": 776,
+ "luggage": 777,
+ "luggage cart": 778,
+ "lunch": 779,
+ "macaroni": 780,
+ "machine": 781,
+ "magazine": 782,
+ "magnet": 783,
+ "mailbox": 784,
+ "male": 785,
+ "man": 786,
+ "mane": 787,
+ "mango": 788,
+ "manhole": 789,
+ "manhole cover": 790,
+ "mannequin": 791,
+ "mantle": 792,
+ "map": 793,
+ "marina": 794,
+ "marker": 795,
+ "market": 796,
+ "mask": 797,
+ "mast": 798,
+ "mat": 799,
+ "match": 800,
+ "mattress": 801,
+ "meadow": 802,
+ "meal": 803,
+ "meat": 804,
+ "meatball": 805,
+ "median": 806,
+ "medicine cabinet": 807,
+ "melon": 808,
+ "menu": 809,
+ "mesh": 810,
+ "metal": 811,
+ "meter": 812,
+ "microphone": 813,
+ "microwave": 814,
+ "milk": 815,
+ "minivan": 816,
+ "minute hand": 817,
+ "mirror": 818,
+ "mitt": 819,
+ "mitten": 820,
+ "mixer": 821,
+ "mixing bowl": 822,
+ "money": 823,
+ "monitor": 824,
+ "monkey": 825,
+ "monument": 826,
+ "moon": 827,
+ "moped": 828,
+ "moss": 829,
+ "mother": 830,
+ "motor": 831,
+ "motor bike": 832,
+ "motorbike": 833,
+ "motorcycle": 834,
+ "motorcyclist": 835,
+ "mound": 836,
+ "mountain": 837,
+ "mountain range": 838,
+ "mountain side": 839,
+ "mountain top": 840,
+ "mountainside": 841,
+ "mouse": 842,
+ "mouse pad": 843,
+ "mousepad": 844,
+ "moustache": 845,
+ "mouth": 846,
+ "mozzarella": 847,
+ "mud": 848,
+ "muffin": 849,
+ "muffler": 850,
+ "mug": 851,
+ "mulch": 852,
+ "museum": 853,
+ "mushroom": 854,
+ "mustache": 855,
+ "mustard": 856,
+ "muzzle": 857,
+ "nail": 858,
+ "name": 859,
+ "name tag": 860,
+ "napkin": 861,
+ "neck": 862,
+ "neck tie": 863,
+ "necklace": 864,
+ "necktie": 865,
+ "nest": 866,
+ "net": 867,
+ "netting": 868,
+ "newspaper": 869,
+ "night": 870,
+ "nightstand": 871,
+ "noodle": 872,
+ "nose": 873,
+ "nostril": 874,
+ "notebook": 875,
+ "notepad": 876,
+ "number": 877,
+ "numeral": 878,
+ "nut": 879,
+ "oar": 880,
+ "object": 881,
+ "obstacle": 882,
+ "ocean": 883,
+ "ocean water": 884,
+ "office": 885,
+ "office chair": 886,
+ "officer": 887,
+ "oil": 888,
+ "olive": 889,
+ "onion": 890,
+ "onion ring": 891,
+ "orange": 892,
+ "ornament": 893,
+ "ostrich": 894,
+ "ottoman": 895,
+ "outfield": 896,
+ "outfit": 897,
+ "outlet": 898,
+ "outside": 899,
+ "oven": 900,
+ "oven door": 901,
+ "overall": 902,
+ "overhang": 903,
+ "overpass": 904,
+ "owl": 905,
+ "ox": 906,
+ "pack": 907,
+ "package": 908,
+ "packet": 909,
+ "pad": 910,
+ "paddle": 911,
+ "page": 912,
+ "paint": 913,
+ "painting": 914,
+ "pajama": 915,
+ "palm": 916,
+ "palm tree": 917,
+ "pan": 918,
+ "pancake": 919,
+ "panda": 920,
+ "pane": 921,
+ "panel": 922,
+ "pant": 923,
+ "paper": 924,
+ "paper plate": 925,
+ "paper towel": 926,
+ "parachute": 927,
+ "parade": 928,
+ "parasail": 929,
+ "parasol": 930,
+ "park": 931,
+ "park bench": 932,
+ "parking lot": 933,
+ "parking meter": 934,
+ "parking sign": 935,
+ "parrot": 936,
+ "parsley": 937,
+ "passenger": 938,
+ "passenger car": 939,
+ "passenger train": 940,
+ "pasta": 941,
+ "pastry": 942,
+ "pasture": 943,
+ "patch": 944,
+ "path": 945,
+ "pathway": 946,
+ "patio": 947,
+ "pavement": 948,
+ "paw": 949,
+ "pea": 950,
+ "peach": 951,
+ "peak": 952,
+ "peanut": 953,
+ "pear": 954,
+ "pebble": 955,
+ "pedal": 956,
+ "pedestrian": 957,
+ "peel": 958,
+ "pen": 959,
+ "pencil": 960,
+ "penguin": 961,
+ "pepper": 962,
+ "pepper shaker": 963,
+ "pepperoni": 964,
+ "person": 965,
+ "petal": 966,
+ "phone": 967,
+ "photo": 968,
+ "photograph": 969,
+ "photographer": 970,
+ "piano": 971,
+ "pickle": 972,
+ "pickup truck": 973,
+ "picnic table": 974,
+ "picture": 975,
+ "picture frame": 976,
+ "pie": 977,
+ "piece": 978,
+ "pier": 979,
+ "pig": 980,
+ "pigeon": 981,
+ "pile": 982,
+ "pillar": 983,
+ "pillow": 984,
+ "pillow case": 985,
+ "pillowcase": 986,
+ "pilot": 987,
+ "pin": 988,
+ "pine tree": 989,
+ "pineapple": 990,
+ "pipe": 991,
+ "pitcher": 992,
+ "pitchers mound": 993,
+ "pizza": 994,
+ "pizza box": 995,
+ "pizza crust": 996,
+ "pizza cutter": 997,
+ "pizza slice": 998,
+ "placemat": 999,
+ "plain": 1000,
+ "plant": 1001,
+ "plantain": 1002,
+ "planter": 1003,
+ "plaque": 1004,
+ "plastic": 1005,
+ "plate": 1006,
+ "platform": 1007,
+ "platter": 1008,
+ "player": 1009,
+ "playground": 1010,
+ "plug": 1011,
+ "plumbing": 1012,
+ "pocket": 1013,
+ "polar bear": 1014,
+ "pole": 1015,
+ "police": 1016,
+ "police car": 1017,
+ "police officer": 1018,
+ "policeman": 1019,
+ "polo shirt": 1020,
+ "pond": 1021,
+ "pony": 1022,
+ "pony tail": 1023,
+ "ponytail": 1024,
+ "pool": 1025,
+ "porch": 1026,
+ "portrait": 1027,
+ "post": 1028,
+ "poster": 1029,
+ "pot": 1030,
+ "potato": 1031,
+ "pouch": 1032,
+ "powder": 1033,
+ "powdered sugar": 1034,
+ "power line": 1035,
+ "power pole": 1036,
+ "price tag": 1037,
+ "print": 1038,
+ "printer": 1039,
+ "produce": 1040,
+ "product": 1041,
+ "projector": 1042,
+ "prong": 1043,
+ "propeller": 1044,
+ "puddle": 1045,
+ "pump": 1046,
+ "pumpkin": 1047,
+ "puppy": 1048,
+ "purse": 1049,
+ "quilt": 1050,
+ "rabbit": 1051,
+ "racer": 1052,
+ "rack": 1053,
+ "racket": 1054,
+ "radiator": 1055,
+ "radio": 1056,
+ "radish": 1057,
+ "raft": 1058,
+ "rail": 1059,
+ "railing": 1060,
+ "railroad": 1061,
+ "railroad tracks": 1062,
+ "railway": 1063,
+ "rain": 1064,
+ "rainbow": 1065,
+ "raincoat": 1066,
+ "raisin": 1067,
+ "ram": 1068,
+ "ramp": 1069,
+ "range": 1070,
+ "raspberry": 1071,
+ "receipt": 1072,
+ "recliner": 1073,
+ "referee": 1074,
+ "reflection": 1075,
+ "reflector": 1076,
+ "refrigerator": 1077,
+ "reign": 1078,
+ "remote": 1079,
+ "remote control": 1080,
+ "restaurant": 1081,
+ "restroom": 1082,
+ "rib": 1083,
+ "ribbon": 1084,
+ "rice": 1085,
+ "rider": 1086,
+ "rim": 1087,
+ "ring": 1088,
+ "ripple": 1089,
+ "river": 1090,
+ "road": 1091,
+ "roadside": 1092,
+ "roadway": 1093,
+ "robe": 1094,
+ "rock": 1095,
+ "rock wall": 1096,
+ "rod": 1097,
+ "roll": 1098,
+ "roman numeral": 1099,
+ "roman numerals": 1100,
+ "roof": 1101,
+ "rooftop": 1102,
+ "room": 1103,
+ "rope": 1104,
+ "rose": 1105,
+ "router": 1106,
+ "rug": 1107,
+ "runway": 1108,
+ "sack": 1109,
+ "saddle": 1110,
+ "safety cone": 1111,
+ "safety jacket": 1112,
+ "sail": 1113,
+ "sailboat": 1114,
+ "salad": 1115,
+ "salt": 1116,
+ "salt shaker": 1117,
+ "sand": 1118,
+ "sandal": 1119,
+ "sandwhich": 1120,
+ "sandwich": 1121,
+ "satellite dish": 1122,
+ "sauce": 1123,
+ "saucer": 1124,
+ "sausage": 1125,
+ "scaffolding": 1126,
+ "scale": 1127,
+ "scarf": 1128,
+ "scene": 1129,
+ "school bus": 1130,
+ "scissor": 1131,
+ "scissors": 1132,
+ "sconce": 1133,
+ "scooter": 1134,
+ "scoreboard": 1135,
+ "screen": 1136,
+ "screw": 1137,
+ "sculpture": 1138,
+ "sea": 1139,
+ "sea foam": 1140,
+ "seagull": 1141,
+ "seal": 1142,
+ "seasoning": 1143,
+ "seat": 1144,
+ "seaweed": 1145,
+ "second floor": 1146,
+ "sedan": 1147,
+ "seed": 1148,
+ "serving tray": 1149,
+ "shack": 1150,
+ "shade": 1151,
+ "shadow": 1152,
+ "shaker": 1153,
+ "shampoo": 1154,
+ "she": 1155,
+ "shed": 1156,
+ "sheep": 1157,
+ "sheet": 1158,
+ "shelf": 1159,
+ "shelter": 1160,
+ "shield": 1161,
+ "shin guard": 1162,
+ "shin guards": 1163,
+ "shingle": 1164,
+ "ship": 1165,
+ "shirt": 1166,
+ "shoe": 1167,
+ "shoelace": 1168,
+ "shop": 1169,
+ "shopping bag": 1170,
+ "shore": 1171,
+ "shoreline": 1172,
+ "short": 1173,
+ "shoulder": 1174,
+ "shovel": 1175,
+ "shower": 1176,
+ "shower curtain": 1177,
+ "shower door": 1178,
+ "shower head": 1179,
+ "shrimp": 1180,
+ "shrub": 1181,
+ "shutter": 1182,
+ "side mirror": 1183,
+ "side table": 1184,
+ "side window": 1185,
+ "sidewalk": 1186,
+ "sign": 1187,
+ "sign post": 1188,
+ "signal": 1189,
+ "signal light": 1190,
+ "silverware": 1191,
+ "sink": 1192,
+ "skate park": 1193,
+ "skateboard": 1194,
+ "skateboard ramp": 1195,
+ "skateboarder": 1196,
+ "skatepark": 1197,
+ "skater": 1198,
+ "ski": 1199,
+ "ski boot": 1200,
+ "ski boots": 1201,
+ "ski goggles": 1202,
+ "ski jacket": 1203,
+ "ski lift": 1204,
+ "ski pants": 1205,
+ "ski pole": 1206,
+ "ski poles": 1207,
+ "ski slope": 1208,
+ "ski suit": 1209,
+ "ski tracks": 1210,
+ "skier": 1211,
+ "skiier": 1212,
+ "skiis": 1213,
+ "skillet": 1214,
+ "skin": 1215,
+ "skirt": 1216,
+ "skull": 1217,
+ "sky": 1218,
+ "skylight": 1219,
+ "skyscraper": 1220,
+ "slab": 1221,
+ "slack": 1222,
+ "slat": 1223,
+ "sled": 1224,
+ "sleeve": 1225,
+ "slice": 1226,
+ "slope": 1227,
+ "slot": 1228,
+ "smartphone": 1229,
+ "smile": 1230,
+ "smoke": 1231,
+ "smoke stack": 1232,
+ "snack": 1233,
+ "sneaker": 1234,
+ "snout": 1235,
+ "snow": 1236,
+ "snow board": 1237,
+ "snow pants": 1238,
+ "snow suit": 1239,
+ "snowboard": 1240,
+ "snowboarder": 1241,
+ "snowflake": 1242,
+ "snowman": 1243,
+ "snowsuit": 1244,
+ "soap": 1245,
+ "soap bottle": 1246,
+ "soap dish": 1247,
+ "soap dispenser": 1248,
+ "soccer ball": 1249,
+ "soccer field": 1250,
+ "soccer player": 1251,
+ "sock": 1252,
+ "socket": 1253,
+ "soda": 1254,
+ "soda bottle": 1255,
+ "soda can": 1256,
+ "sofa": 1257,
+ "soil": 1258,
+ "soldier": 1259,
+ "soup": 1260,
+ "spatula": 1261,
+ "speaker": 1262,
+ "spear": 1263,
+ "spectator": 1264,
+ "spice": 1265,
+ "spinach": 1266,
+ "spire": 1267,
+ "splash": 1268,
+ "spoke": 1269,
+ "sponge": 1270,
+ "spoon": 1271,
+ "spot": 1272,
+ "spray": 1273,
+ "spray bottle": 1274,
+ "sprinkle": 1275,
+ "squash": 1276,
+ "stabilizer": 1277,
+ "stack": 1278,
+ "stadium": 1279,
+ "stage": 1280,
+ "stain": 1281,
+ "stair": 1282,
+ "staircase": 1283,
+ "stairway": 1284,
+ "stall": 1285,
+ "stand": 1286,
+ "stapler": 1287,
+ "star": 1288,
+ "station": 1289,
+ "station wagon": 1290,
+ "statue": 1291,
+ "steak": 1292,
+ "steam": 1293,
+ "steeple": 1294,
+ "steering wheel": 1295,
+ "stem": 1296,
+ "step": 1297,
+ "stereo": 1298,
+ "stick": 1299,
+ "sticker": 1300,
+ "stone": 1301,
+ "stone wall": 1302,
+ "stool": 1303,
+ "stop": 1304,
+ "stop light": 1305,
+ "stop sign": 1306,
+ "stoplight": 1307,
+ "store": 1308,
+ "storefront": 1309,
+ "stove": 1310,
+ "stove top": 1311,
+ "strap": 1312,
+ "straw": 1313,
+ "strawberry": 1314,
+ "stream": 1315,
+ "streamer": 1316,
+ "street": 1317,
+ "street lamp": 1318,
+ "street light": 1319,
+ "street sign": 1320,
+ "string": 1321,
+ "strip": 1322,
+ "stripe": 1323,
+ "stroller": 1324,
+ "structure": 1325,
+ "student": 1326,
+ "stuffed animal": 1327,
+ "stuffed bear": 1328,
+ "stump": 1329,
+ "sugar": 1330,
+ "suit": 1331,
+ "suit jacket": 1332,
+ "suitcase": 1333,
+ "sun": 1334,
+ "sunflower": 1335,
+ "sunglasses": 1336,
+ "sunset": 1337,
+ "surf": 1338,
+ "surface": 1339,
+ "surfboard": 1340,
+ "surfer": 1341,
+ "surfing": 1342,
+ "suspender": 1343,
+ "suv": 1344,
+ "swan": 1345,
+ "sweat band": 1346,
+ "sweatband": 1347,
+ "sweater": 1348,
+ "sweatpants": 1349,
+ "sweatshirt": 1350,
+ "sweet potato": 1351,
+ "swim trunks": 1352,
+ "swimming pool": 1353,
+ "swimsuit": 1354,
+ "switch": 1355,
+ "sword": 1356,
+ "symbol": 1357,
+ "syrup": 1358,
+ "table": 1359,
+ "table cloth": 1360,
+ "table lamp": 1361,
+ "tablecloth": 1362,
+ "tablet": 1363,
+ "tabletop": 1364,
+ "tag": 1365,
+ "tail": 1366,
+ "tail feathers": 1367,
+ "tail fin": 1368,
+ "tail light": 1369,
+ "tail lights": 1370,
+ "tail wing": 1371,
+ "tangerine": 1372,
+ "tank": 1373,
+ "tank top": 1374,
+ "tap": 1375,
+ "tape": 1376,
+ "tarmac": 1377,
+ "tarp": 1378,
+ "tattoo": 1379,
+ "taxi": 1380,
+ "taxi cab": 1381,
+ "tea": 1382,
+ "tea kettle": 1383,
+ "tea pot": 1384,
+ "team": 1385,
+ "teapot": 1386,
+ "teddy": 1387,
+ "teddy bear": 1388,
+ "tee shirt": 1389,
+ "teeth": 1390,
+ "telephone": 1391,
+ "telephone pole": 1392,
+ "television": 1393,
+ "tennis": 1394,
+ "tennis ball": 1395,
+ "tennis court": 1396,
+ "tennis match": 1397,
+ "tennis net": 1398,
+ "tennis player": 1399,
+ "tennis racket": 1400,
+ "tennis shoe": 1401,
+ "tent": 1402,
+ "terminal": 1403,
+ "text": 1404,
+ "throw pillow": 1405,
+ "thumb": 1406,
+ "tie": 1407,
+ "tiger": 1408,
+ "tights": 1409,
+ "tile": 1410,
+ "tile floor": 1411,
+ "tine": 1412,
+ "tire": 1413,
+ "tissue": 1414,
+ "tissue box": 1415,
+ "toast": 1416,
+ "toaster": 1417,
+ "toaster oven": 1418,
+ "toddler": 1419,
+ "toe": 1420,
+ "tofu": 1421,
+ "toilet": 1422,
+ "toilet bowl": 1423,
+ "toilet brush": 1424,
+ "toilet lid": 1425,
+ "toilet paper": 1426,
+ "toilet seat": 1427,
+ "toilet tank": 1428,
+ "toiletry": 1429,
+ "tomato": 1430,
+ "tomato sauce": 1431,
+ "tomato slice": 1432,
+ "tongs": 1433,
+ "tongue": 1434,
+ "tool": 1435,
+ "toothbrush": 1436,
+ "toothpaste": 1437,
+ "toothpick": 1438,
+ "top": 1439,
+ "topping": 1440,
+ "tortilla": 1441,
+ "touchpad": 1442,
+ "tourist": 1443,
+ "towel": 1444,
+ "towel rack": 1445,
+ "tower": 1446,
+ "town": 1447,
+ "toy": 1448,
+ "track": 1449,
+ "tractor": 1450,
+ "traffic": 1451,
+ "traffic cone": 1452,
+ "traffic light": 1453,
+ "traffic sign": 1454,
+ "traffic signal": 1455,
+ "trail": 1456,
+ "trailer": 1457,
+ "train": 1458,
+ "train car": 1459,
+ "train cars": 1460,
+ "train engine": 1461,
+ "train front": 1462,
+ "train platform": 1463,
+ "train station": 1464,
+ "train track": 1465,
+ "train tracks": 1466,
+ "trash": 1467,
+ "trash bag": 1468,
+ "trash bin": 1469,
+ "trash can": 1470,
+ "trashcan": 1471,
+ "tray": 1472,
+ "tree": 1473,
+ "tree branch": 1474,
+ "tree leaves": 1475,
+ "tree line": 1476,
+ "tree trunk": 1477,
+ "triangle": 1478,
+ "trick": 1479,
+ "tripod": 1480,
+ "trolley": 1481,
+ "trough": 1482,
+ "trousers": 1483,
+ "truck": 1484,
+ "trunk": 1485,
+ "tshirt": 1486,
+ "tub": 1487,
+ "tube": 1488,
+ "tulip": 1489,
+ "tunnel": 1490,
+ "turbine": 1491,
+ "turf": 1492,
+ "turkey": 1493,
+ "tusk": 1494,
+ "tv stand": 1495,
+ "twig": 1496,
+ "umbrella": 1497,
+ "umpire": 1498,
+ "undershirt": 1499,
+ "underwear": 1500,
+ "uniform": 1501,
+ "urinal": 1502,
+ "urn": 1503,
+ "utensil": 1504,
+ "utility pole": 1505,
+ "valley": 1506,
+ "van": 1507,
+ "vane": 1508,
+ "vanity": 1509,
+ "vase": 1510,
+ "vegetable": 1511,
+ "veggie": 1512,
+ "vehicle": 1513,
+ "vending machine": 1514,
+ "vent": 1515,
+ "vest": 1516,
+ "video camera": 1517,
+ "video game": 1518,
+ "view": 1519,
+ "village": 1520,
+ "vine": 1521,
+ "visor": 1522,
+ "wagon": 1523,
+ "waist": 1524,
+ "wake": 1525,
+ "walkway": 1526,
+ "wall": 1527,
+ "wallet": 1528,
+ "wallpaper": 1529,
+ "walnut": 1530,
+ "washer": 1531,
+ "washing machine": 1532,
+ "waste basket": 1533,
+ "watch": 1534,
+ "water": 1535,
+ "water bottle": 1536,
+ "water tank": 1537,
+ "waterfall": 1538,
+ "watermark": 1539,
+ "watermelon": 1540,
+ "wave": 1541,
+ "weather": 1542,
+ "weather vane": 1543,
+ "website": 1544,
+ "weed": 1545,
+ "wet suit": 1546,
+ "wetsuit": 1547,
+ "wheel": 1548,
+ "wheelchair": 1549,
+ "whipped cream": 1550,
+ "whisk": 1551,
+ "whisker": 1552,
+ "whiteboard": 1553,
+ "wig": 1554,
+ "wii": 1555,
+ "wii controller": 1556,
+ "wii remote": 1557,
+ "wild": 1558,
+ "wildflower": 1559,
+ "window": 1560,
+ "window frame": 1561,
+ "window sill": 1562,
+ "windowsill": 1563,
+ "windshield": 1564,
+ "windshield wiper": 1565,
+ "windshield wipers": 1566,
+ "wine": 1567,
+ "wine bottle": 1568,
+ "wing": 1569,
+ "wiper": 1570,
+ "wire": 1571,
+ "wire fence": 1572,
+ "woman": 1573,
+ "wood": 1574,
+ "wool": 1575,
+ "word": 1576,
+ "worker": 1577,
+ "wrapper": 1578,
+ "wrist": 1579,
+ "wrist band": 1580,
+ "wrist watch": 1581,
+ "wristband": 1582,
+ "wristwatch": 1583,
+ "writing": 1584,
+ "yacht": 1585,
+ "yard": 1586,
+ "yellow": 1587,
+ "yogurt": 1588,
+ "yolk": 1589,
+ "young man": 1590,
+ "zebra": 1591,
+ "zipper": 1592,
+ "zoo": 1593,
+ "zucchini": 1594
+ },
+ "idx_to_label": {
+ "0": "unknown",
+ "1": "ad",
+ "2": "adult",
+ "3": "advertisement",
+ "4": "air",
+ "5": "air conditioner",
+ "6": "air vent",
+ "7": "aircraft",
+ "8": "airplane",
+ "9": "airport",
+ "10": "alarm clock",
+ "11": "alcohol",
+ "12": "alley",
+ "13": "almond",
+ "14": "ambulance",
+ "15": "american flag",
+ "16": "animal",
+ "17": "ankle",
+ "18": "antelope",
+ "19": "antenna",
+ "20": "apartment",
+ "21": "apartment building",
+ "22": "apple",
+ "23": "apple logo",
+ "24": "appliance",
+ "25": "apron",
+ "26": "aquarium",
+ "27": "arch",
+ "28": "archway",
+ "29": "area",
+ "30": "area rug",
+ "31": "arm",
+ "32": "armchair",
+ "33": "armrest",
+ "34": "arrow",
+ "35": "art",
+ "36": "artichoke",
+ "37": "artwork",
+ "38": "asparagus",
+ "39": "asphalt",
+ "40": "athlete",
+ "41": "athletic shoe",
+ "42": "audience",
+ "43": "avocado",
+ "44": "awning",
+ "45": "baby",
+ "46": "back",
+ "47": "back pack",
+ "48": "background",
+ "49": "backpack",
+ "50": "backsplash",
+ "51": "backyard",
+ "52": "bacon",
+ "53": "badge",
+ "54": "bag",
+ "55": "bagel",
+ "56": "baked good",
+ "57": "balcony",
+ "58": "ball",
+ "59": "ball cap",
+ "60": "balloon",
+ "61": "bamboo",
+ "62": "banana",
+ "63": "banana bunch",
+ "64": "banana peel",
+ "65": "banana slice",
+ "66": "band",
+ "67": "bandage",
+ "68": "bandana",
+ "69": "bang",
+ "70": "bank",
+ "71": "banner",
+ "72": "bar",
+ "73": "bar stool",
+ "74": "bark",
+ "75": "barn",
+ "76": "barrel",
+ "77": "barricade",
+ "78": "barrier",
+ "79": "base",
+ "80": "baseball",
+ "81": "baseball bat",
+ "82": "baseball cap",
+ "83": "baseball field",
+ "84": "baseball game",
+ "85": "baseball glove",
+ "86": "baseball mitt",
+ "87": "baseball player",
+ "88": "baseball players",
+ "89": "baseball uniform",
+ "90": "baseboard",
+ "91": "baseline",
+ "92": "basil",
+ "93": "basin",
+ "94": "basket",
+ "95": "bat",
+ "96": "bath towel",
+ "97": "bath tub",
+ "98": "bathing suit",
+ "99": "bathroom",
+ "100": "bathroom sink",
+ "101": "bathtub",
+ "102": "batter",
+ "103": "battery",
+ "104": "beach",
+ "105": "beach chair",
+ "106": "beach umbrella",
+ "107": "bead",
+ "108": "beak",
+ "109": "beam",
+ "110": "bean",
+ "111": "beanie",
+ "112": "bear",
+ "113": "beard",
+ "114": "bed",
+ "115": "bed frame",
+ "116": "bedding",
+ "117": "bedroom",
+ "118": "bedspread",
+ "119": "beef",
+ "120": "beer",
+ "121": "beer bottle",
+ "122": "beet",
+ "123": "bell",
+ "124": "belt",
+ "125": "bench",
+ "126": "berry",
+ "127": "beverage",
+ "128": "bib",
+ "129": "bicycle",
+ "130": "bicyclist",
+ "131": "bike",
+ "132": "bike rack",
+ "133": "biker",
+ "134": "bikini",
+ "135": "billboard",
+ "136": "bin",
+ "137": "binder",
+ "138": "bird",
+ "139": "bird cage",
+ "140": "birthday cake",
+ "141": "biscuit",
+ "142": "black",
+ "143": "blackberry",
+ "144": "blade",
+ "145": "blanket",
+ "146": "blazer",
+ "147": "bleacher",
+ "148": "blender",
+ "149": "blind",
+ "150": "block",
+ "151": "blood",
+ "152": "blossom",
+ "153": "blouse",
+ "154": "blueberry",
+ "155": "board",
+ "156": "boardwalk",
+ "157": "boat",
+ "158": "body",
+ "159": "bolt",
+ "160": "bone",
+ "161": "book",
+ "162": "book shelf",
+ "163": "bookcase",
+ "164": "bookshelf",
+ "165": "boot",
+ "166": "booth",
+ "167": "border",
+ "168": "bottle",
+ "169": "bottle cap",
+ "170": "bottom",
+ "171": "boulder",
+ "172": "bouquet",
+ "173": "bow",
+ "174": "bow tie",
+ "175": "bowl",
+ "176": "box",
+ "177": "boy",
+ "178": "bracelet",
+ "179": "bracket",
+ "180": "brake light",
+ "181": "branch",
+ "182": "bread",
+ "183": "breakfast",
+ "184": "breast",
+ "185": "brick",
+ "186": "brick wall",
+ "187": "bride",
+ "188": "bridge",
+ "189": "bridle",
+ "190": "briefcase",
+ "191": "brim",
+ "192": "broccoli",
+ "193": "brocolli",
+ "194": "broom",
+ "195": "brownie",
+ "196": "brush",
+ "197": "bubble",
+ "198": "bucket",
+ "199": "buckle",
+ "200": "bud",
+ "201": "buffalo",
+ "202": "bug",
+ "203": "building",
+ "204": "bull",
+ "205": "bumper",
+ "206": "bun",
+ "207": "bunch",
+ "208": "bunny",
+ "209": "buoy",
+ "210": "burger",
+ "211": "burner",
+ "212": "bus",
+ "213": "bus driver",
+ "214": "bus stop",
+ "215": "bush",
+ "216": "butter",
+ "217": "butter knife",
+ "218": "butterfly",
+ "219": "button",
+ "220": "cab",
+ "221": "cabbage",
+ "222": "cabin",
+ "223": "cabinet",
+ "224": "cabinet door",
+ "225": "cable",
+ "226": "caboose",
+ "227": "cactus",
+ "228": "cafe",
+ "229": "cage",
+ "230": "cake",
+ "231": "calculator",
+ "232": "calendar",
+ "233": "calf",
+ "234": "camera",
+ "235": "can",
+ "236": "canal",
+ "237": "candle",
+ "238": "candle holder",
+ "239": "candy",
+ "240": "cane",
+ "241": "canister",
+ "242": "canoe",
+ "243": "canopy",
+ "244": "cap",
+ "245": "car",
+ "246": "card",
+ "247": "cardboard",
+ "248": "cardboard box",
+ "249": "cargo",
+ "250": "carpet",
+ "251": "carriage",
+ "252": "carrot",
+ "253": "cart",
+ "254": "carton",
+ "255": "case",
+ "256": "castle",
+ "257": "cat",
+ "258": "catcher",
+ "259": "catchers mitt",
+ "260": "cattle",
+ "261": "cauliflower",
+ "262": "cd",
+ "263": "ceiling",
+ "264": "ceiling fan",
+ "265": "ceiling light",
+ "266": "celery",
+ "267": "cell phone",
+ "268": "cellphone",
+ "269": "cement",
+ "270": "cereal",
+ "271": "chain",
+ "272": "chair",
+ "273": "chalkboard",
+ "274": "chandelier",
+ "275": "character",
+ "276": "charger",
+ "277": "cheek",
+ "278": "cheese",
+ "279": "chef",
+ "280": "cherry",
+ "281": "chest",
+ "282": "chicken",
+ "283": "child",
+ "284": "chili",
+ "285": "chimney",
+ "286": "chin",
+ "287": "chip",
+ "288": "chocolate",
+ "289": "chopstick",
+ "290": "christmas light",
+ "291": "christmas tree",
+ "292": "church",
+ "293": "cigarette",
+ "294": "circle",
+ "295": "city",
+ "296": "classroom",
+ "297": "claw",
+ "298": "clay",
+ "299": "cleat",
+ "300": "cliff",
+ "301": "clock",
+ "302": "clock face",
+ "303": "clock hand",
+ "304": "clock tower",
+ "305": "closet",
+ "306": "cloth",
+ "307": "clothes",
+ "308": "clothing",
+ "309": "cloud",
+ "310": "coach",
+ "311": "coaster",
+ "312": "coat",
+ "313": "cockpit",
+ "314": "coconut",
+ "315": "coffee",
+ "316": "coffee cup",
+ "317": "coffee maker",
+ "318": "coffee mug",
+ "319": "coffee pot",
+ "320": "coffee table",
+ "321": "coin",
+ "322": "coin slot",
+ "323": "coke",
+ "324": "collar",
+ "325": "column",
+ "326": "comb",
+ "327": "comforter",
+ "328": "computer",
+ "329": "computer desk",
+ "330": "computer keyboard",
+ "331": "computer monitor",
+ "332": "computer mouse",
+ "333": "computer screen",
+ "334": "concrete",
+ "335": "condiment",
+ "336": "conductor",
+ "337": "cone",
+ "338": "console",
+ "339": "container",
+ "340": "control",
+ "341": "control panel",
+ "342": "controller",
+ "343": "cooker",
+ "344": "cookie",
+ "345": "cooking utensil",
+ "346": "cooler",
+ "347": "copyright",
+ "348": "cord",
+ "349": "corn",
+ "350": "costume",
+ "351": "couch",
+ "352": "countertop",
+ "353": "couple",
+ "354": "court",
+ "355": "courtyard",
+ "356": "cover",
+ "357": "cow",
+ "358": "cowboy",
+ "359": "cowboy hat",
+ "360": "cpu",
+ "361": "crab",
+ "362": "cracker",
+ "363": "crane",
+ "364": "crate",
+ "365": "cream",
+ "366": "croissant",
+ "367": "cross",
+ "368": "crosswalk",
+ "369": "crowd",
+ "370": "crown",
+ "371": "crumb",
+ "372": "crust",
+ "373": "cub",
+ "374": "cucumber",
+ "375": "cuff",
+ "376": "cup",
+ "377": "cupboard",
+ "378": "cupcake",
+ "379": "curb",
+ "380": "curtain",
+ "381": "cushion",
+ "382": "customer",
+ "383": "cutting board",
+ "384": "cycle",
+ "385": "cyclist",
+ "386": "daisy",
+ "387": "dashboard",
+ "388": "date",
+ "389": "day",
+ "390": "decal",
+ "391": "deck",
+ "392": "decoration",
+ "393": "deer",
+ "394": "desert",
+ "395": "design",
+ "396": "desk",
+ "397": "desk lamp",
+ "398": "dessert",
+ "399": "device",
+ "400": "dial",
+ "401": "diamond",
+ "402": "dining room",
+ "403": "dining table",
+ "404": "dinner",
+ "405": "dinosaur",
+ "406": "dip",
+ "407": "dirt",
+ "408": "dirt bike",
+ "409": "dirt road",
+ "410": "disc",
+ "411": "dish",
+ "412": "dish soap",
+ "413": "dishwasher",
+ "414": "dispenser",
+ "415": "display",
+ "416": "display case",
+ "417": "distance",
+ "418": "dock",
+ "419": "dog",
+ "420": "doll",
+ "421": "dome",
+ "422": "donkey",
+ "423": "donut",
+ "424": "door",
+ "425": "door frame",
+ "426": "door handle",
+ "427": "door knob",
+ "428": "doorknob",
+ "429": "doorway",
+ "430": "dot",
+ "431": "dough",
+ "432": "dragon",
+ "433": "drain",
+ "434": "drape",
+ "435": "drawer",
+ "436": "drawing",
+ "437": "dress",
+ "438": "dress shirt",
+ "439": "dresser",
+ "440": "dressing",
+ "441": "drink",
+ "442": "driver",
+ "443": "driveway",
+ "444": "drum",
+ "445": "dryer",
+ "446": "duck",
+ "447": "dugout",
+ "448": "dumpster",
+ "449": "dvd",
+ "450": "dvd player",
+ "451": "eagle",
+ "452": "ear",
+ "453": "earphone",
+ "454": "earring",
+ "455": "easel",
+ "456": "egg",
+ "457": "eggplant",
+ "458": "elbow",
+ "459": "elbow pad",
+ "460": "electrical outlet",
+ "461": "electronics",
+ "462": "elephant",
+ "463": "emblem",
+ "464": "employee",
+ "465": "enclosure",
+ "466": "end",
+ "467": "end table",
+ "468": "engine",
+ "469": "engineer",
+ "470": "entertainment center",
+ "471": "entrance",
+ "472": "envelope",
+ "473": "exhaust pipe",
+ "474": "eye",
+ "475": "eyebrow",
+ "476": "face",
+ "477": "face mask",
+ "478": "facial hair",
+ "479": "family",
+ "480": "fan",
+ "481": "farm",
+ "482": "father",
+ "483": "faucet",
+ "484": "feather",
+ "485": "feeder",
+ "486": "female",
+ "487": "fence",
+ "488": "fence post",
+ "489": "fencing",
+ "490": "fender",
+ "491": "fern",
+ "492": "field",
+ "493": "figure",
+ "494": "figurine",
+ "495": "fin",
+ "496": "finger",
+ "497": "fingernail",
+ "498": "fire",
+ "499": "fire escape",
+ "500": "fire extinguisher",
+ "501": "fire hydrant",
+ "502": "fire truck",
+ "503": "fireplace",
+ "504": "fish",
+ "505": "fixture",
+ "506": "flag",
+ "507": "flame",
+ "508": "flamingo",
+ "509": "flip flop",
+ "510": "floor",
+ "511": "floor lamp",
+ "512": "flooring",
+ "513": "floret",
+ "514": "flour",
+ "515": "flower",
+ "516": "flower pot",
+ "517": "foam",
+ "518": "fog",
+ "519": "foil",
+ "520": "folder",
+ "521": "folding chair",
+ "522": "foliage",
+ "523": "food",
+ "524": "food truck",
+ "525": "foot",
+ "526": "foot print",
+ "527": "football",
+ "528": "footboard",
+ "529": "footprint",
+ "530": "foreground",
+ "531": "forehead",
+ "532": "forest",
+ "533": "fork",
+ "534": "fountain",
+ "535": "frame",
+ "536": "freezer",
+ "537": "french fries",
+ "538": "french fry",
+ "539": "frisbee",
+ "540": "frog",
+ "541": "front",
+ "542": "front legs",
+ "543": "front window",
+ "544": "frosting",
+ "545": "fruit",
+ "546": "fruit stand",
+ "547": "fry",
+ "548": "fur",
+ "549": "furniture",
+ "550": "fuselage",
+ "551": "gadget",
+ "552": "game",
+ "553": "game controller",
+ "554": "garage",
+ "555": "garage door",
+ "556": "garbage can",
+ "557": "garden",
+ "558": "garland",
+ "559": "garlic",
+ "560": "garment",
+ "561": "garnish",
+ "562": "gas station",
+ "563": "gas tank",
+ "564": "gate",
+ "565": "gazebo",
+ "566": "gazelle",
+ "567": "gear",
+ "568": "gentleman",
+ "569": "gift",
+ "570": "giraffe",
+ "571": "giraffe head",
+ "572": "girl",
+ "573": "glass",
+ "574": "glass door",
+ "575": "glass window",
+ "576": "glasses",
+ "577": "glaze",
+ "578": "globe",
+ "579": "glove",
+ "580": "goal",
+ "581": "goat",
+ "582": "goatee",
+ "583": "goggles",
+ "584": "goose",
+ "585": "gown",
+ "586": "graffiti",
+ "587": "grafitti",
+ "588": "grape",
+ "589": "grapefruit",
+ "590": "grass",
+ "591": "grass field",
+ "592": "grate",
+ "593": "gravel",
+ "594": "gravy",
+ "595": "green",
+ "596": "grill",
+ "597": "grinder",
+ "598": "groom",
+ "599": "ground",
+ "600": "group",
+ "601": "guard rail",
+ "602": "guitar",
+ "603": "gun",
+ "604": "guy",
+ "605": "hair",
+ "606": "hair dryer",
+ "607": "half",
+ "608": "hallway",
+ "609": "halter",
+ "610": "ham",
+ "611": "hamburger",
+ "612": "hammer",
+ "613": "hand",
+ "614": "hand towel",
+ "615": "handbag",
+ "616": "handle",
+ "617": "handle bars",
+ "618": "handlebar",
+ "619": "hangar",
+ "620": "hanger",
+ "621": "harbor",
+ "622": "harness",
+ "623": "hat",
+ "624": "hay",
+ "625": "head",
+ "626": "head band",
+ "627": "head light",
+ "628": "headband",
+ "629": "headboard",
+ "630": "headlight",
+ "631": "headphone",
+ "632": "heart",
+ "633": "heater",
+ "634": "hedge",
+ "635": "heel",
+ "636": "helicopter",
+ "637": "helmet",
+ "638": "herb",
+ "639": "herd",
+ "640": "highway",
+ "641": "hill",
+ "642": "hill side",
+ "643": "hillside",
+ "644": "hilltop",
+ "645": "holder",
+ "646": "hole",
+ "647": "home",
+ "648": "home plate",
+ "649": "honey",
+ "650": "hood",
+ "651": "hoodie",
+ "652": "hoof",
+ "653": "hook",
+ "654": "horizon",
+ "655": "horn",
+ "656": "horse",
+ "657": "hose",
+ "658": "hot dog",
+ "659": "hotel",
+ "660": "hotel room",
+ "661": "hour hand",
+ "662": "house",
+ "663": "hubcap",
+ "664": "hurdle",
+ "665": "hut",
+ "666": "ice",
+ "667": "ice cream",
+ "668": "icing",
+ "669": "icon",
+ "670": "image",
+ "671": "infield",
+ "672": "ingredient",
+ "673": "inside",
+ "674": "instruction",
+ "675": "instrument",
+ "676": "intersection",
+ "677": "iphone",
+ "678": "ipod",
+ "679": "island",
+ "680": "item",
+ "681": "ivy",
+ "682": "jacket",
+ "683": "jar",
+ "684": "jean",
+ "685": "jeep",
+ "686": "jersey",
+ "687": "jet",
+ "688": "jet engine",
+ "689": "jockey",
+ "690": "jug",
+ "691": "juice",
+ "692": "jumpsuit",
+ "693": "kayak",
+ "694": "ketchup",
+ "695": "ketchup bottle",
+ "696": "kettle",
+ "697": "key",
+ "698": "keyboard",
+ "699": "keypad",
+ "700": "kickstand",
+ "701": "kid",
+ "702": "kiosk",
+ "703": "kitchen",
+ "704": "kite",
+ "705": "kitten",
+ "706": "kitty",
+ "707": "kiwi",
+ "708": "knee",
+ "709": "knee pad",
+ "710": "kneepad",
+ "711": "knife",
+ "712": "knife block",
+ "713": "knob",
+ "714": "knot",
+ "715": "label",
+ "716": "ladder",
+ "717": "ladle",
+ "718": "lady",
+ "719": "lake",
+ "720": "lamb",
+ "721": "lamp",
+ "722": "lamp post",
+ "723": "lamp shade",
+ "724": "lampshade",
+ "725": "land",
+ "726": "landing gear",
+ "727": "landscape",
+ "728": "lane",
+ "729": "lantern",
+ "730": "lanyard",
+ "731": "lapel",
+ "732": "laptop",
+ "733": "laptop computer",
+ "734": "latch",
+ "735": "lawn",
+ "736": "layer",
+ "737": "leaf",
+ "738": "leash",
+ "739": "ledge",
+ "740": "leg",
+ "741": "legging",
+ "742": "lemon",
+ "743": "letter",
+ "744": "lettering",
+ "745": "lettuce",
+ "746": "license",
+ "747": "license plate",
+ "748": "lid",
+ "749": "life jacket",
+ "750": "life preserver",
+ "751": "life vest",
+ "752": "lift",
+ "753": "light",
+ "754": "light bulb",
+ "755": "light fixture",
+ "756": "light pole",
+ "757": "light post",
+ "758": "light switch",
+ "759": "lighter",
+ "760": "lighthouse",
+ "761": "limb",
+ "762": "lime",
+ "763": "line",
+ "764": "lion",
+ "765": "lip",
+ "766": "lipstick",
+ "767": "liquid",
+ "768": "little girl",
+ "769": "living room",
+ "770": "lock",
+ "771": "locomotive",
+ "772": "log",
+ "773": "logo",
+ "774": "lot",
+ "775": "lotion",
+ "776": "lounge chair",
+ "777": "luggage",
+ "778": "luggage cart",
+ "779": "lunch",
+ "780": "macaroni",
+ "781": "machine",
+ "782": "magazine",
+ "783": "magnet",
+ "784": "mailbox",
+ "785": "male",
+ "786": "man",
+ "787": "mane",
+ "788": "mango",
+ "789": "manhole",
+ "790": "manhole cover",
+ "791": "mannequin",
+ "792": "mantle",
+ "793": "map",
+ "794": "marina",
+ "795": "marker",
+ "796": "market",
+ "797": "mask",
+ "798": "mast",
+ "799": "mat",
+ "800": "match",
+ "801": "mattress",
+ "802": "meadow",
+ "803": "meal",
+ "804": "meat",
+ "805": "meatball",
+ "806": "median",
+ "807": "medicine cabinet",
+ "808": "melon",
+ "809": "menu",
+ "810": "mesh",
+ "811": "metal",
+ "812": "meter",
+ "813": "microphone",
+ "814": "microwave",
+ "815": "milk",
+ "816": "minivan",
+ "817": "minute hand",
+ "818": "mirror",
+ "819": "mitt",
+ "820": "mitten",
+ "821": "mixer",
+ "822": "mixing bowl",
+ "823": "money",
+ "824": "monitor",
+ "825": "monkey",
+ "826": "monument",
+ "827": "moon",
+ "828": "moped",
+ "829": "moss",
+ "830": "mother",
+ "831": "motor",
+ "832": "motor bike",
+ "833": "motorbike",
+ "834": "motorcycle",
+ "835": "motorcyclist",
+ "836": "mound",
+ "837": "mountain",
+ "838": "mountain range",
+ "839": "mountain side",
+ "840": "mountain top",
+ "841": "mountainside",
+ "842": "mouse",
+ "843": "mouse pad",
+ "844": "mousepad",
+ "845": "moustache",
+ "846": "mouth",
+ "847": "mozzarella",
+ "848": "mud",
+ "849": "muffin",
+ "850": "muffler",
+ "851": "mug",
+ "852": "mulch",
+ "853": "museum",
+ "854": "mushroom",
+ "855": "mustache",
+ "856": "mustard",
+ "857": "muzzle",
+ "858": "nail",
+ "859": "name",
+ "860": "name tag",
+ "861": "napkin",
+ "862": "neck",
+ "863": "neck tie",
+ "864": "necklace",
+ "865": "necktie",
+ "866": "nest",
+ "867": "net",
+ "868": "netting",
+ "869": "newspaper",
+ "870": "night",
+ "871": "nightstand",
+ "872": "noodle",
+ "873": "nose",
+ "874": "nostril",
+ "875": "notebook",
+ "876": "notepad",
+ "877": "number",
+ "878": "numeral",
+ "879": "nut",
+ "880": "oar",
+ "881": "object",
+ "882": "obstacle",
+ "883": "ocean",
+ "884": "ocean water",
+ "885": "office",
+ "886": "office chair",
+ "887": "officer",
+ "888": "oil",
+ "889": "olive",
+ "890": "onion",
+ "891": "onion ring",
+ "892": "orange",
+ "893": "ornament",
+ "894": "ostrich",
+ "895": "ottoman",
+ "896": "outfield",
+ "897": "outfit",
+ "898": "outlet",
+ "899": "outside",
+ "900": "oven",
+ "901": "oven door",
+ "902": "overall",
+ "903": "overhang",
+ "904": "overpass",
+ "905": "owl",
+ "906": "ox",
+ "907": "pack",
+ "908": "package",
+ "909": "packet",
+ "910": "pad",
+ "911": "paddle",
+ "912": "page",
+ "913": "paint",
+ "914": "painting",
+ "915": "pajama",
+ "916": "palm",
+ "917": "palm tree",
+ "918": "pan",
+ "919": "pancake",
+ "920": "panda",
+ "921": "pane",
+ "922": "panel",
+ "923": "pant",
+ "924": "paper",
+ "925": "paper plate",
+ "926": "paper towel",
+ "927": "parachute",
+ "928": "parade",
+ "929": "parasail",
+ "930": "parasol",
+ "931": "park",
+ "932": "park bench",
+ "933": "parking lot",
+ "934": "parking meter",
+ "935": "parking sign",
+ "936": "parrot",
+ "937": "parsley",
+ "938": "passenger",
+ "939": "passenger car",
+ "940": "passenger train",
+ "941": "pasta",
+ "942": "pastry",
+ "943": "pasture",
+ "944": "patch",
+ "945": "path",
+ "946": "pathway",
+ "947": "patio",
+ "948": "pavement",
+ "949": "paw",
+ "950": "pea",
+ "951": "peach",
+ "952": "peak",
+ "953": "peanut",
+ "954": "pear",
+ "955": "pebble",
+ "956": "pedal",
+ "957": "pedestrian",
+ "958": "peel",
+ "959": "pen",
+ "960": "pencil",
+ "961": "penguin",
+ "962": "pepper",
+ "963": "pepper shaker",
+ "964": "pepperoni",
+ "965": "person",
+ "966": "petal",
+ "967": "phone",
+ "968": "photo",
+ "969": "photograph",
+ "970": "photographer",
+ "971": "piano",
+ "972": "pickle",
+ "973": "pickup truck",
+ "974": "picnic table",
+ "975": "picture",
+ "976": "picture frame",
+ "977": "pie",
+ "978": "piece",
+ "979": "pier",
+ "980": "pig",
+ "981": "pigeon",
+ "982": "pile",
+ "983": "pillar",
+ "984": "pillow",
+ "985": "pillow case",
+ "986": "pillowcase",
+ "987": "pilot",
+ "988": "pin",
+ "989": "pine tree",
+ "990": "pineapple",
+ "991": "pipe",
+ "992": "pitcher",
+ "993": "pitchers mound",
+ "994": "pizza",
+ "995": "pizza box",
+ "996": "pizza crust",
+ "997": "pizza cutter",
+ "998": "pizza slice",
+ "999": "placemat",
+ "1000": "plain",
+ "1001": "plant",
+ "1002": "plantain",
+ "1003": "planter",
+ "1004": "plaque",
+ "1005": "plastic",
+ "1006": "plate",
+ "1007": "platform",
+ "1008": "platter",
+ "1009": "player",
+ "1010": "playground",
+ "1011": "plug",
+ "1012": "plumbing",
+ "1013": "pocket",
+ "1014": "polar bear",
+ "1015": "pole",
+ "1016": "police",
+ "1017": "police car",
+ "1018": "police officer",
+ "1019": "policeman",
+ "1020": "polo shirt",
+ "1021": "pond",
+ "1022": "pony",
+ "1023": "pony tail",
+ "1024": "ponytail",
+ "1025": "pool",
+ "1026": "porch",
+ "1027": "portrait",
+ "1028": "post",
+ "1029": "poster",
+ "1030": "pot",
+ "1031": "potato",
+ "1032": "pouch",
+ "1033": "powder",
+ "1034": "powdered sugar",
+ "1035": "power line",
+ "1036": "power pole",
+ "1037": "price tag",
+ "1038": "print",
+ "1039": "printer",
+ "1040": "produce",
+ "1041": "product",
+ "1042": "projector",
+ "1043": "prong",
+ "1044": "propeller",
+ "1045": "puddle",
+ "1046": "pump",
+ "1047": "pumpkin",
+ "1048": "puppy",
+ "1049": "purse",
+ "1050": "quilt",
+ "1051": "rabbit",
+ "1052": "racer",
+ "1053": "rack",
+ "1054": "racket",
+ "1055": "radiator",
+ "1056": "radio",
+ "1057": "radish",
+ "1058": "raft",
+ "1059": "rail",
+ "1060": "railing",
+ "1061": "railroad",
+ "1062": "railroad tracks",
+ "1063": "railway",
+ "1064": "rain",
+ "1065": "rainbow",
+ "1066": "raincoat",
+ "1067": "raisin",
+ "1068": "ram",
+ "1069": "ramp",
+ "1070": "range",
+ "1071": "raspberry",
+ "1072": "receipt",
+ "1073": "recliner",
+ "1074": "referee",
+ "1075": "reflection",
+ "1076": "reflector",
+ "1077": "refrigerator",
+ "1078": "reign",
+ "1079": "remote",
+ "1080": "remote control",
+ "1081": "restaurant",
+ "1082": "restroom",
+ "1083": "rib",
+ "1084": "ribbon",
+ "1085": "rice",
+ "1086": "rider",
+ "1087": "rim",
+ "1088": "ring",
+ "1089": "ripple",
+ "1090": "river",
+ "1091": "road",
+ "1092": "roadside",
+ "1093": "roadway",
+ "1094": "robe",
+ "1095": "rock",
+ "1096": "rock wall",
+ "1097": "rod",
+ "1098": "roll",
+ "1099": "roman numeral",
+ "1100": "roman numerals",
+ "1101": "roof",
+ "1102": "rooftop",
+ "1103": "room",
+ "1104": "rope",
+ "1105": "rose",
+ "1106": "router",
+ "1107": "rug",
+ "1108": "runway",
+ "1109": "sack",
+ "1110": "saddle",
+ "1111": "safety cone",
+ "1112": "safety jacket",
+ "1113": "sail",
+ "1114": "sailboat",
+ "1115": "salad",
+ "1116": "salt",
+ "1117": "salt shaker",
+ "1118": "sand",
+ "1119": "sandal",
+ "1120": "sandwhich",
+ "1121": "sandwich",
+ "1122": "satellite dish",
+ "1123": "sauce",
+ "1124": "saucer",
+ "1125": "sausage",
+ "1126": "scaffolding",
+ "1127": "scale",
+ "1128": "scarf",
+ "1129": "scene",
+ "1130": "school bus",
+ "1131": "scissor",
+ "1132": "scissors",
+ "1133": "sconce",
+ "1134": "scooter",
+ "1135": "scoreboard",
+ "1136": "screen",
+ "1137": "screw",
+ "1138": "sculpture",
+ "1139": "sea",
+ "1140": "sea foam",
+ "1141": "seagull",
+ "1142": "seal",
+ "1143": "seasoning",
+ "1144": "seat",
+ "1145": "seaweed",
+ "1146": "second floor",
+ "1147": "sedan",
+ "1148": "seed",
+ "1149": "serving tray",
+ "1150": "shack",
+ "1151": "shade",
+ "1152": "shadow",
+ "1153": "shaker",
+ "1154": "shampoo",
+ "1155": "she",
+ "1156": "shed",
+ "1157": "sheep",
+ "1158": "sheet",
+ "1159": "shelf",
+ "1160": "shelter",
+ "1161": "shield",
+ "1162": "shin guard",
+ "1163": "shin guards",
+ "1164": "shingle",
+ "1165": "ship",
+ "1166": "shirt",
+ "1167": "shoe",
+ "1168": "shoelace",
+ "1169": "shop",
+ "1170": "shopping bag",
+ "1171": "shore",
+ "1172": "shoreline",
+ "1173": "short",
+ "1174": "shoulder",
+ "1175": "shovel",
+ "1176": "shower",
+ "1177": "shower curtain",
+ "1178": "shower door",
+ "1179": "shower head",
+ "1180": "shrimp",
+ "1181": "shrub",
+ "1182": "shutter",
+ "1183": "side mirror",
+ "1184": "side table",
+ "1185": "side window",
+ "1186": "sidewalk",
+ "1187": "sign",
+ "1188": "sign post",
+ "1189": "signal",
+ "1190": "signal light",
+ "1191": "silverware",
+ "1192": "sink",
+ "1193": "skate park",
+ "1194": "skateboard",
+ "1195": "skateboard ramp",
+ "1196": "skateboarder",
+ "1197": "skatepark",
+ "1198": "skater",
+ "1199": "ski",
+ "1200": "ski boot",
+ "1201": "ski boots",
+ "1202": "ski goggles",
+ "1203": "ski jacket",
+ "1204": "ski lift",
+ "1205": "ski pants",
+ "1206": "ski pole",
+ "1207": "ski poles",
+ "1208": "ski slope",
+ "1209": "ski suit",
+ "1210": "ski tracks",
+ "1211": "skier",
+ "1212": "skiier",
+ "1213": "skiis",
+ "1214": "skillet",
+ "1215": "skin",
+ "1216": "skirt",
+ "1217": "skull",
+ "1218": "sky",
+ "1219": "skylight",
+ "1220": "skyscraper",
+ "1221": "slab",
+ "1222": "slack",
+ "1223": "slat",
+ "1224": "sled",
+ "1225": "sleeve",
+ "1226": "slice",
+ "1227": "slope",
+ "1228": "slot",
+ "1229": "smartphone",
+ "1230": "smile",
+ "1231": "smoke",
+ "1232": "smoke stack",
+ "1233": "snack",
+ "1234": "sneaker",
+ "1235": "snout",
+ "1236": "snow",
+ "1237": "snow board",
+ "1238": "snow pants",
+ "1239": "snow suit",
+ "1240": "snowboard",
+ "1241": "snowboarder",
+ "1242": "snowflake",
+ "1243": "snowman",
+ "1244": "snowsuit",
+ "1245": "soap",
+ "1246": "soap bottle",
+ "1247": "soap dish",
+ "1248": "soap dispenser",
+ "1249": "soccer ball",
+ "1250": "soccer field",
+ "1251": "soccer player",
+ "1252": "sock",
+ "1253": "socket",
+ "1254": "soda",
+ "1255": "soda bottle",
+ "1256": "soda can",
+ "1257": "sofa",
+ "1258": "soil",
+ "1259": "soldier",
+ "1260": "soup",
+ "1261": "spatula",
+ "1262": "speaker",
+ "1263": "spear",
+ "1264": "spectator",
+ "1265": "spice",
+ "1266": "spinach",
+ "1267": "spire",
+ "1268": "splash",
+ "1269": "spoke",
+ "1270": "sponge",
+ "1271": "spoon",
+ "1272": "spot",
+ "1273": "spray",
+ "1274": "spray bottle",
+ "1275": "sprinkle",
+ "1276": "squash",
+ "1277": "stabilizer",
+ "1278": "stack",
+ "1279": "stadium",
+ "1280": "stage",
+ "1281": "stain",
+ "1282": "stair",
+ "1283": "staircase",
+ "1284": "stairway",
+ "1285": "stall",
+ "1286": "stand",
+ "1287": "stapler",
+ "1288": "star",
+ "1289": "station",
+ "1290": "station wagon",
+ "1291": "statue",
+ "1292": "steak",
+ "1293": "steam",
+ "1294": "steeple",
+ "1295": "steering wheel",
+ "1296": "stem",
+ "1297": "step",
+ "1298": "stereo",
+ "1299": "stick",
+ "1300": "sticker",
+ "1301": "stone",
+ "1302": "stone wall",
+ "1303": "stool",
+ "1304": "stop",
+ "1305": "stop light",
+ "1306": "stop sign",
+ "1307": "stoplight",
+ "1308": "store",
+ "1309": "storefront",
+ "1310": "stove",
+ "1311": "stove top",
+ "1312": "strap",
+ "1313": "straw",
+ "1314": "strawberry",
+ "1315": "stream",
+ "1316": "streamer",
+ "1317": "street",
+ "1318": "street lamp",
+ "1319": "street light",
+ "1320": "street sign",
+ "1321": "string",
+ "1322": "strip",
+ "1323": "stripe",
+ "1324": "stroller",
+ "1325": "structure",
+ "1326": "student",
+ "1327": "stuffed animal",
+ "1328": "stuffed bear",
+ "1329": "stump",
+ "1330": "sugar",
+ "1331": "suit",
+ "1332": "suit jacket",
+ "1333": "suitcase",
+ "1334": "sun",
+ "1335": "sunflower",
+ "1336": "sunglasses",
+ "1337": "sunset",
+ "1338": "surf",
+ "1339": "surface",
+ "1340": "surfboard",
+ "1341": "surfer",
+ "1342": "surfing",
+ "1343": "suspender",
+ "1344": "suv",
+ "1345": "swan",
+ "1346": "sweat band",
+ "1347": "sweatband",
+ "1348": "sweater",
+ "1349": "sweatpants",
+ "1350": "sweatshirt",
+ "1351": "sweet potato",
+ "1352": "swim trunks",
+ "1353": "swimming pool",
+ "1354": "swimsuit",
+ "1355": "switch",
+ "1356": "sword",
+ "1357": "symbol",
+ "1358": "syrup",
+ "1359": "table",
+ "1360": "table cloth",
+ "1361": "table lamp",
+ "1362": "tablecloth",
+ "1363": "tablet",
+ "1364": "tabletop",
+ "1365": "tag",
+ "1366": "tail",
+ "1367": "tail feathers",
+ "1368": "tail fin",
+ "1369": "tail light",
+ "1370": "tail lights",
+ "1371": "tail wing",
+ "1372": "tangerine",
+ "1373": "tank",
+ "1374": "tank top",
+ "1375": "tap",
+ "1376": "tape",
+ "1377": "tarmac",
+ "1378": "tarp",
+ "1379": "tattoo",
+ "1380": "taxi",
+ "1381": "taxi cab",
+ "1382": "tea",
+ "1383": "tea kettle",
+ "1384": "tea pot",
+ "1385": "team",
+ "1386": "teapot",
+ "1387": "teddy",
+ "1388": "teddy bear",
+ "1389": "tee shirt",
+ "1390": "teeth",
+ "1391": "telephone",
+ "1392": "telephone pole",
+ "1393": "television",
+ "1394": "tennis",
+ "1395": "tennis ball",
+ "1396": "tennis court",
+ "1397": "tennis match",
+ "1398": "tennis net",
+ "1399": "tennis player",
+ "1400": "tennis racket",
+ "1401": "tennis shoe",
+ "1402": "tent",
+ "1403": "terminal",
+ "1404": "text",
+ "1405": "throw pillow",
+ "1406": "thumb",
+ "1407": "tie",
+ "1408": "tiger",
+ "1409": "tights",
+ "1410": "tile",
+ "1411": "tile floor",
+ "1412": "tine",
+ "1413": "tire",
+ "1414": "tissue",
+ "1415": "tissue box",
+ "1416": "toast",
+ "1417": "toaster",
+ "1418": "toaster oven",
+ "1419": "toddler",
+ "1420": "toe",
+ "1421": "tofu",
+ "1422": "toilet",
+ "1423": "toilet bowl",
+ "1424": "toilet brush",
+ "1425": "toilet lid",
+ "1426": "toilet paper",
+ "1427": "toilet seat",
+ "1428": "toilet tank",
+ "1429": "toiletry",
+ "1430": "tomato",
+ "1431": "tomato sauce",
+ "1432": "tomato slice",
+ "1433": "tongs",
+ "1434": "tongue",
+ "1435": "tool",
+ "1436": "toothbrush",
+ "1437": "toothpaste",
+ "1438": "toothpick",
+ "1439": "top",
+ "1440": "topping",
+ "1441": "tortilla",
+ "1442": "touchpad",
+ "1443": "tourist",
+ "1444": "towel",
+ "1445": "towel rack",
+ "1446": "tower",
+ "1447": "town",
+ "1448": "toy",
+ "1449": "track",
+ "1450": "tractor",
+ "1451": "traffic",
+ "1452": "traffic cone",
+ "1453": "traffic light",
+ "1454": "traffic sign",
+ "1455": "traffic signal",
+ "1456": "trail",
+ "1457": "trailer",
+ "1458": "train",
+ "1459": "train car",
+ "1460": "train cars",
+ "1461": "train engine",
+ "1462": "train front",
+ "1463": "train platform",
+ "1464": "train station",
+ "1465": "train track",
+ "1466": "train tracks",
+ "1467": "trash",
+ "1468": "trash bag",
+ "1469": "trash bin",
+ "1470": "trash can",
+ "1471": "trashcan",
+ "1472": "tray",
+ "1473": "tree",
+ "1474": "tree branch",
+ "1475": "tree leaves",
+ "1476": "tree line",
+ "1477": "tree trunk",
+ "1478": "triangle",
+ "1479": "trick",
+ "1480": "tripod",
+ "1481": "trolley",
+ "1482": "trough",
+ "1483": "trousers",
+ "1484": "truck",
+ "1485": "trunk",
+ "1486": "tshirt",
+ "1487": "tub",
+ "1488": "tube",
+ "1489": "tulip",
+ "1490": "tunnel",
+ "1491": "turbine",
+ "1492": "turf",
+ "1493": "turkey",
+ "1494": "tusk",
+ "1495": "tv stand",
+ "1496": "twig",
+ "1497": "umbrella",
+ "1498": "umpire",
+ "1499": "undershirt",
+ "1500": "underwear",
+ "1501": "uniform",
+ "1502": "urinal",
+ "1503": "urn",
+ "1504": "utensil",
+ "1505": "utility pole",
+ "1506": "valley",
+ "1507": "van",
+ "1508": "vane",
+ "1509": "vanity",
+ "1510": "vase",
+ "1511": "vegetable",
+ "1512": "veggie",
+ "1513": "vehicle",
+ "1514": "vending machine",
+ "1515": "vent",
+ "1516": "vest",
+ "1517": "video camera",
+ "1518": "video game",
+ "1519": "view",
+ "1520": "village",
+ "1521": "vine",
+ "1522": "visor",
+ "1523": "wagon",
+ "1524": "waist",
+ "1525": "wake",
+ "1526": "walkway",
+ "1527": "wall",
+ "1528": "wallet",
+ "1529": "wallpaper",
+ "1530": "walnut",
+ "1531": "washer",
+ "1532": "washing machine",
+ "1533": "waste basket",
+ "1534": "watch",
+ "1535": "water",
+ "1536": "water bottle",
+ "1537": "water tank",
+ "1538": "waterfall",
+ "1539": "watermark",
+ "1540": "watermelon",
+ "1541": "wave",
+ "1542": "weather",
+ "1543": "weather vane",
+ "1544": "website",
+ "1545": "weed",
+ "1546": "wet suit",
+ "1547": "wetsuit",
+ "1548": "wheel",
+ "1549": "wheelchair",
+ "1550": "whipped cream",
+ "1551": "whisk",
+ "1552": "whisker",
+ "1553": "whiteboard",
+ "1554": "wig",
+ "1555": "wii",
+ "1556": "wii controller",
+ "1557": "wii remote",
+ "1558": "wild",
+ "1559": "wildflower",
+ "1560": "window",
+ "1561": "window frame",
+ "1562": "window sill",
+ "1563": "windowsill",
+ "1564": "windshield",
+ "1565": "windshield wiper",
+ "1566": "windshield wipers",
+ "1567": "wine",
+ "1568": "wine bottle",
+ "1569": "wing",
+ "1570": "wiper",
+ "1571": "wire",
+ "1572": "wire fence",
+ "1573": "woman",
+ "1574": "wood",
+ "1575": "wool",
+ "1576": "word",
+ "1577": "worker",
+ "1578": "wrapper",
+ "1579": "wrist",
+ "1580": "wrist band",
+ "1581": "wrist watch",
+ "1582": "wristband",
+ "1583": "wristwatch",
+ "1584": "writing",
+ "1585": "yacht",
+ "1586": "yard",
+ "1587": "yellow",
+ "1588": "yogurt",
+ "1589": "yolk",
+ "1590": "young man",
+ "1591": "zebra",
+ "1592": "zipper",
+ "1593": "zoo",
+ "1594": "zucchini"
+ },
+ "attribute_to_idx": {
+ "above": 1,
+ "adult": 2,
+ "airborne": 3,
+ "alone": 4,
+ "aluminum": 5,
+ "american": 6,
+ "antique": 7,
+ "apple": 8,
+ "arched": 9,
+ "asian": 10,
+ "asphalt": 11,
+ "assorted": 12,
+ "athletic": 13,
+ "attached": 14,
+ "baby": 15,
+ "back": 16,
+ "backwards": 17,
+ "baked": 18,
+ "bald": 19,
+ "balding": 20,
+ "bare": 21,
+ "barefoot": 22,
+ "barren": 23,
+ "baseball": 24,
+ "bathroom": 25,
+ "batting": 26,
+ "beautiful": 27,
+ "beige": 28,
+ "bending": 29,
+ "bending over": 30,
+ "bent": 31,
+ "big": 32,
+ "birthday": 33,
+ "black": 34,
+ "black and white": 35,
+ "blank": 36,
+ "blond": 37,
+ "blowing": 38,
+ "blue": 39,
+ "blurry": 40,
+ "brake": 41,
+ "brass": 42,
+ "brick": 43,
+ "bricked": 44,
+ "bright": 45,
+ "bright blue": 46,
+ "broken": 47,
+ "brown": 48,
+ "browned": 49,
+ "brunette": 50,
+ "bunch": 51,
+ "bunched": 52,
+ "burgundy": 53,
+ "burned": 54,
+ "burnt": 55,
+ "bushy": 56,
+ "busy": 57,
+ "cake": 58,
+ "calm": 59,
+ "camouflage": 60,
+ "cardboard": 61,
+ "cargo": 62,
+ "carpeted": 63,
+ "cast": 64,
+ "caucasian": 65,
+ "cement": 66,
+ "ceramic": 67,
+ "chain link": 68,
+ "chalk": 69,
+ "checkered": 70,
+ "cheese": 71,
+ "chinese": 72,
+ "chipped": 73,
+ "chocolate": 74,
+ "chopped": 75,
+ "choppy": 76,
+ "christmas": 77,
+ "chrome": 78,
+ "circular": 79,
+ "clay": 80,
+ "clean": 81,
+ "clear": 82,
+ "clock": 83,
+ "closed": 84,
+ "cloudless": 85,
+ "cloudy": 86,
+ "cluttered": 87,
+ "coffee": 88,
+ "collared": 89,
+ "colorful": 90,
+ "computer": 91,
+ "concrete": 92,
+ "cooked": 93,
+ "cooking": 94,
+ "copper": 95,
+ "cotton": 96,
+ "covered": 97,
+ "covering": 98,
+ "cracked": 99,
+ "crashing": 100,
+ "cream colored": 101,
+ "crispy": 102,
+ "crossed": 103,
+ "crouched": 104,
+ "crouching": 105,
+ "crumpled": 106,
+ "crying": 107,
+ "curled": 108,
+ "curly": 109,
+ "curved": 110,
+ "cut": 111,
+ "dark": 112,
+ "dark blue": 113,
+ "dark brown": 114,
+ "dark colored": 115,
+ "daytime": 116,
+ "dead": 117,
+ "decorated": 118,
+ "decorative": 119,
+ "deep": 120,
+ "deep blue": 121,
+ "delicious": 122,
+ "denim": 123,
+ "designed": 124,
+ "digital": 125,
+ "dirt": 126,
+ "dirty": 127,
+ "displayed": 128,
+ "distant": 129,
+ "docked": 130,
+ "door": 131,
+ "dotted": 132,
+ "double decker": 133,
+ "down": 134,
+ "dress": 135,
+ "dried": 136,
+ "drinking": 137,
+ "driving": 138,
+ "dry": 139,
+ "dusty": 140,
+ "eating": 141,
+ "elderly": 142,
+ "electric": 143,
+ "electrical": 144,
+ "electronic": 145,
+ "elevated": 146,
+ "empty": 147,
+ "evergreen": 148,
+ "extended": 149,
+ "faded": 150,
+ "fake": 151,
+ "fallen": 152,
+ "fancy": 153,
+ "fat": 154,
+ "female": 155,
+ "filled": 156,
+ "fire": 157,
+ "flat": 158,
+ "flat screen": 159,
+ "floating": 160,
+ "floppy": 161,
+ "floral": 162,
+ "flowered": 163,
+ "flowing": 164,
+ "fluffy": 165,
+ "fluorescent": 166,
+ "flying": 167,
+ "foamy": 168,
+ "foggy": 169,
+ "folded": 170,
+ "for sale": 171,
+ "framed": 172,
+ "fresh": 173,
+ "fried": 174,
+ "frosted": 175,
+ "fruit": 176,
+ "full": 177,
+ "furry": 178,
+ "fuzzy": 179,
+ "giant": 180,
+ "glass": 181,
+ "glazed": 182,
+ "glowing": 183,
+ "gold": 184,
+ "golden": 185,
+ "golden brown": 186,
+ "granite": 187,
+ "grass": 188,
+ "grassy": 189,
+ "gravel": 190,
+ "gray": 191,
+ "grazing": 192,
+ "green": 193,
+ "greenish": 194,
+ "grilled": 195,
+ "grouped": 196,
+ "growing": 197,
+ "hairy": 198,
+ "half": 199,
+ "half full": 200,
+ "halved": 201,
+ "hanging": 202,
+ "happy": 203,
+ "hard": 204,
+ "hardwood": 205,
+ "hazy": 206,
+ "healthy": 207,
+ "heavy": 208,
+ "herd": 209,
+ "high": 210,
+ "hilly": 211,
+ "hitting": 212,
+ "holding": 213,
+ "home": 214,
+ "horizontal": 215,
+ "huge": 216,
+ "illuminated": 217,
+ "in air": 218,
+ "indoors": 219,
+ "iron": 220,
+ "ivory": 221,
+ "jumping": 222,
+ "khaki": 223,
+ "kitchen": 224,
+ "kneeling": 225,
+ "knit": 226,
+ "landing": 227,
+ "laptop": 228,
+ "large": 229,
+ "laughing": 230,
+ "laying": 231,
+ "leafless": 232,
+ "leafy": 233,
+ "leaning": 234,
+ "leather": 235,
+ "letter": 236,
+ "license": 237,
+ "light": 238,
+ "light blue": 239,
+ "light brown": 240,
+ "light colored": 241,
+ "lighted": 242,
+ "lime green": 243,
+ "lined": 244,
+ "lit": 245,
+ "little": 246,
+ "long": 247,
+ "long sleeved": 248,
+ "looking": 249,
+ "looking down": 250,
+ "loose": 251,
+ "low": 252,
+ "lush": 253,
+ "lying": 254,
+ "made": 255,
+ "male": 256,
+ "manicured": 257,
+ "marble": 258,
+ "maroon": 259,
+ "massive": 260,
+ "melted": 261,
+ "mesh": 262,
+ "messy": 263,
+ "metal": 264,
+ "metallic": 265,
+ "military": 266,
+ "modern": 267,
+ "mountain": 268,
+ "mounted": 269,
+ "moving": 270,
+ "muddy": 271,
+ "multi colored": 272,
+ "murky": 273,
+ "muscular": 274,
+ "narrow": 275,
+ "navy": 276,
+ "neon": 277,
+ "neon green": 278,
+ "new": 279,
+ "night": 280,
+ "nike": 281,
+ "number": 282,
+ "numbered": 283,
+ "ocean": 284,
+ "octagonal": 285,
+ "off": 286,
+ "old": 287,
+ "old fashioned": 288,
+ "older": 289,
+ "on": 290,
+ "one way": 291,
+ "open": 292,
+ "opened": 293,
+ "orange": 294,
+ "ornate": 295,
+ "outdoor": 296,
+ "outdoors": 297,
+ "outstretched": 298,
+ "oval": 299,
+ "overcast": 300,
+ "overgrown": 301,
+ "overhead": 302,
+ "padded": 303,
+ "painted": 304,
+ "pale": 305,
+ "palm": 306,
+ "paper": 307,
+ "park": 308,
+ "parked": 309,
+ "parking": 310,
+ "patchy": 311,
+ "patterned": 312,
+ "paved": 313,
+ "peeled": 314,
+ "peeling": 315,
+ "perched": 316,
+ "performing": 317,
+ "pile": 318,
+ "piled": 319,
+ "pine": 320,
+ "pink": 321,
+ "plaid": 322,
+ "plain": 323,
+ "plastic": 324,
+ "playing": 325,
+ "playing tennis": 326,
+ "plush": 327,
+ "pointed": 328,
+ "pointing": 329,
+ "pointy": 330,
+ "polar": 331,
+ "police": 332,
+ "polka dot": 333,
+ "porcelain": 334,
+ "posing": 335,
+ "potted": 336,
+ "powdered": 337,
+ "power": 338,
+ "pretty": 339,
+ "printed": 340,
+ "protective": 341,
+ "public": 342,
+ "puffy": 343,
+ "pulled back": 344,
+ "purple": 345,
+ "racing": 346,
+ "railroad": 347,
+ "rainbow colored": 348,
+ "raised": 349,
+ "raw": 350,
+ "reaching": 351,
+ "reading": 352,
+ "recessed": 353,
+ "rectangular": 354,
+ "red": 355,
+ "reflected": 356,
+ "reflecting": 357,
+ "reflective": 358,
+ "resting": 359,
+ "riding": 360,
+ "ripe": 361,
+ "rippled": 362,
+ "rock": 363,
+ "rocky": 364,
+ "roll": 365,
+ "rolled": 366,
+ "rolling": 367,
+ "roman": 368,
+ "rough": 369,
+ "round": 370,
+ "rounded": 371,
+ "rubber": 372,
+ "running": 373,
+ "rusted": 374,
+ "rusty": 375,
+ "safety": 376,
+ "salt": 377,
+ "sand": 378,
+ "sandy": 379,
+ "scattered": 380,
+ "seasoned": 381,
+ "serving": 382,
+ "shaded": 383,
+ "shaggy": 384,
+ "shallow": 385,
+ "shaped": 386,
+ "sharp": 387,
+ "shaved": 388,
+ "sheer": 389,
+ "shining": 390,
+ "shiny": 391,
+ "shirtless": 392,
+ "short": 393,
+ "short sleeved": 394,
+ "shredded": 395,
+ "side view": 396,
+ "silver": 397,
+ "singing": 398,
+ "sitting": 399,
+ "skate": 400,
+ "skateboarding": 401,
+ "skating": 402,
+ "ski": 403,
+ "skiing": 404,
+ "skinny": 405,
+ "slanted": 406,
+ "sleeping": 407,
+ "sleeveless": 408,
+ "slice": 409,
+ "sliced": 410,
+ "sliding": 411,
+ "small": 412,
+ "smiling": 413,
+ "smooth": 414,
+ "snow": 415,
+ "snow covered": 416,
+ "snowboarding": 417,
+ "snowy": 418,
+ "soap": 419,
+ "soccer": 420,
+ "soda": 421,
+ "soft": 422,
+ "sparse": 423,
+ "speckled": 424,
+ "spiky": 425,
+ "splashing": 426,
+ "spotted": 427,
+ "spread": 428,
+ "square": 429,
+ "squatting": 430,
+ "stack": 431,
+ "stacked": 432,
+ "stained": 433,
+ "stainless": 434,
+ "stainless steel": 435,
+ "standing": 436,
+ "staring": 437,
+ "statue": 438,
+ "steamed": 439,
+ "steel": 440,
+ "steep": 441,
+ "sticking out": 442,
+ "still": 443,
+ "stone": 444,
+ "stop": 445,
+ "straight": 446,
+ "straw": 447,
+ "street": 448,
+ "striped": 449,
+ "stripes": 450,
+ "stuffed": 451,
+ "styrofoam": 452,
+ "sunny": 453,
+ "surfing": 454,
+ "swimming": 455,
+ "swinging": 456,
+ "taking off": 457,
+ "talking": 458,
+ "tall": 459,
+ "tan": 460,
+ "tarmacked": 461,
+ "teal": 462,
+ "telephone": 463,
+ "tennis": 464,
+ "textile": 465,
+ "textured": 466,
+ "thick": 467,
+ "thin": 468,
+ "throwing": 469,
+ "tied": 470,
+ "tile": 471,
+ "tiled": 472,
+ "tilted": 473,
+ "tinted": 474,
+ "tiny": 475,
+ "toasted": 476,
+ "toilet": 477,
+ "toilet paper": 478,
+ "tomato": 479,
+ "toy": 480,
+ "traffic": 481,
+ "train": 482,
+ "transparent": 483,
+ "triangle": 484,
+ "triangular": 485,
+ "trimmed": 486,
+ "turned": 487,
+ "unmade": 488,
+ "unripe": 489,
+ "up": 490,
+ "upside down": 491,
+ "used": 492,
+ "vertical": 493,
+ "vintage": 494,
+ "waiting": 495,
+ "walking": 496,
+ "warm": 497,
+ "watching": 498,
+ "water": 499,
+ "waving": 500,
+ "wavy": 501,
+ "wearing": 502,
+ "wet": 503,
+ "white": 504,
+ "whole": 505,
+ "wicker": 506,
+ "wide": 507,
+ "wii": 508,
+ "wild": 509,
+ "windshield": 510,
+ "wine": 511,
+ "winter": 512,
+ "wire": 513,
+ "wireless": 514,
+ "wispy": 515,
+ "wood": 516,
+ "worn": 517,
+ "woven": 518,
+ "wrapped": 519,
+ "wrinkled": 520,
+ "wrist": 521,
+ "written": 522,
+ "yellow": 523,
+ "young": 524
+ },
+ "idx_to_attribute": {
+ "1": "above",
+ "2": "adult",
+ "3": "airborne",
+ "4": "alone",
+ "5": "aluminum",
+ "6": "american",
+ "7": "antique",
+ "8": "apple",
+ "9": "arched",
+ "10": "asian",
+ "11": "asphalt",
+ "12": "assorted",
+ "13": "athletic",
+ "14": "attached",
+ "15": "baby",
+ "16": "back",
+ "17": "backwards",
+ "18": "baked",
+ "19": "bald",
+ "20": "balding",
+ "21": "bare",
+ "22": "barefoot",
+ "23": "barren",
+ "24": "baseball",
+ "25": "bathroom",
+ "26": "batting",
+ "27": "beautiful",
+ "28": "beige",
+ "29": "bending",
+ "30": "bending over",
+ "31": "bent",
+ "32": "big",
+ "33": "birthday",
+ "34": "black",
+ "35": "black and white",
+ "36": "blank",
+ "37": "blond",
+ "38": "blowing",
+ "39": "blue",
+ "40": "blurry",
+ "41": "brake",
+ "42": "brass",
+ "43": "brick",
+ "44": "bricked",
+ "45": "bright",
+ "46": "bright blue",
+ "47": "broken",
+ "48": "brown",
+ "49": "browned",
+ "50": "brunette",
+ "51": "bunch",
+ "52": "bunched",
+ "53": "burgundy",
+ "54": "burned",
+ "55": "burnt",
+ "56": "bushy",
+ "57": "busy",
+ "58": "cake",
+ "59": "calm",
+ "60": "camouflage",
+ "61": "cardboard",
+ "62": "cargo",
+ "63": "carpeted",
+ "64": "cast",
+ "65": "caucasian",
+ "66": "cement",
+ "67": "ceramic",
+ "68": "chain link",
+ "69": "chalk",
+ "70": "checkered",
+ "71": "cheese",
+ "72": "chinese",
+ "73": "chipped",
+ "74": "chocolate",
+ "75": "chopped",
+ "76": "choppy",
+ "77": "christmas",
+ "78": "chrome",
+ "79": "circular",
+ "80": "clay",
+ "81": "clean",
+ "82": "clear",
+ "83": "clock",
+ "84": "closed",
+ "85": "cloudless",
+ "86": "cloudy",
+ "87": "cluttered",
+ "88": "coffee",
+ "89": "collared",
+ "90": "colorful",
+ "91": "computer",
+ "92": "concrete",
+ "93": "cooked",
+ "94": "cooking",
+ "95": "copper",
+ "96": "cotton",
+ "97": "covered",
+ "98": "covering",
+ "99": "cracked",
+ "100": "crashing",
+ "101": "cream colored",
+ "102": "crispy",
+ "103": "crossed",
+ "104": "crouched",
+ "105": "crouching",
+ "106": "crumpled",
+ "107": "crying",
+ "108": "curled",
+ "109": "curly",
+ "110": "curved",
+ "111": "cut",
+ "112": "dark",
+ "113": "dark blue",
+ "114": "dark brown",
+ "115": "dark colored",
+ "116": "daytime",
+ "117": "dead",
+ "118": "decorated",
+ "119": "decorative",
+ "120": "deep",
+ "121": "deep blue",
+ "122": "delicious",
+ "123": "denim",
+ "124": "designed",
+ "125": "digital",
+ "126": "dirt",
+ "127": "dirty",
+ "128": "displayed",
+ "129": "distant",
+ "130": "docked",
+ "131": "door",
+ "132": "dotted",
+ "133": "double decker",
+ "134": "down",
+ "135": "dress",
+ "136": "dried",
+ "137": "drinking",
+ "138": "driving",
+ "139": "dry",
+ "140": "dusty",
+ "141": "eating",
+ "142": "elderly",
+ "143": "electric",
+ "144": "electrical",
+ "145": "electronic",
+ "146": "elevated",
+ "147": "empty",
+ "148": "evergreen",
+ "149": "extended",
+ "150": "faded",
+ "151": "fake",
+ "152": "fallen",
+ "153": "fancy",
+ "154": "fat",
+ "155": "female",
+ "156": "filled",
+ "157": "fire",
+ "158": "flat",
+ "159": "flat screen",
+ "160": "floating",
+ "161": "floppy",
+ "162": "floral",
+ "163": "flowered",
+ "164": "flowing",
+ "165": "fluffy",
+ "166": "fluorescent",
+ "167": "flying",
+ "168": "foamy",
+ "169": "foggy",
+ "170": "folded",
+ "171": "for sale",
+ "172": "framed",
+ "173": "fresh",
+ "174": "fried",
+ "175": "frosted",
+ "176": "fruit",
+ "177": "full",
+ "178": "furry",
+ "179": "fuzzy",
+ "180": "giant",
+ "181": "glass",
+ "182": "glazed",
+ "183": "glowing",
+ "184": "gold",
+ "185": "golden",
+ "186": "golden brown",
+ "187": "granite",
+ "188": "grass",
+ "189": "grassy",
+ "190": "gravel",
+ "191": "gray",
+ "192": "grazing",
+ "193": "green",
+ "194": "greenish",
+ "195": "grilled",
+ "196": "grouped",
+ "197": "growing",
+ "198": "hairy",
+ "199": "half",
+ "200": "half full",
+ "201": "halved",
+ "202": "hanging",
+ "203": "happy",
+ "204": "hard",
+ "205": "hardwood",
+ "206": "hazy",
+ "207": "healthy",
+ "208": "heavy",
+ "209": "herd",
+ "210": "high",
+ "211": "hilly",
+ "212": "hitting",
+ "213": "holding",
+ "214": "home",
+ "215": "horizontal",
+ "216": "huge",
+ "217": "illuminated",
+ "218": "in air",
+ "219": "indoors",
+ "220": "iron",
+ "221": "ivory",
+ "222": "jumping",
+ "223": "khaki",
+ "224": "kitchen",
+ "225": "kneeling",
+ "226": "knit",
+ "227": "landing",
+ "228": "laptop",
+ "229": "large",
+ "230": "laughing",
+ "231": "laying",
+ "232": "leafless",
+ "233": "leafy",
+ "234": "leaning",
+ "235": "leather",
+ "236": "letter",
+ "237": "license",
+ "238": "light",
+ "239": "light blue",
+ "240": "light brown",
+ "241": "light colored",
+ "242": "lighted",
+ "243": "lime green",
+ "244": "lined",
+ "245": "lit",
+ "246": "little",
+ "247": "long",
+ "248": "long sleeved",
+ "249": "looking",
+ "250": "looking down",
+ "251": "loose",
+ "252": "low",
+ "253": "lush",
+ "254": "lying",
+ "255": "made",
+ "256": "male",
+ "257": "manicured",
+ "258": "marble",
+ "259": "maroon",
+ "260": "massive",
+ "261": "melted",
+ "262": "mesh",
+ "263": "messy",
+ "264": "metal",
+ "265": "metallic",
+ "266": "military",
+ "267": "modern",
+ "268": "mountain",
+ "269": "mounted",
+ "270": "moving",
+ "271": "muddy",
+ "272": "multi colored",
+ "273": "murky",
+ "274": "muscular",
+ "275": "narrow",
+ "276": "navy",
+ "277": "neon",
+ "278": "neon green",
+ "279": "new",
+ "280": "night",
+ "281": "nike",
+ "282": "number",
+ "283": "numbered",
+ "284": "ocean",
+ "285": "octagonal",
+ "286": "off",
+ "287": "old",
+ "288": "old fashioned",
+ "289": "older",
+ "290": "on",
+ "291": "one way",
+ "292": "open",
+ "293": "opened",
+ "294": "orange",
+ "295": "ornate",
+ "296": "outdoor",
+ "297": "outdoors",
+ "298": "outstretched",
+ "299": "oval",
+ "300": "overcast",
+ "301": "overgrown",
+ "302": "overhead",
+ "303": "padded",
+ "304": "painted",
+ "305": "pale",
+ "306": "palm",
+ "307": "paper",
+ "308": "park",
+ "309": "parked",
+ "310": "parking",
+ "311": "patchy",
+ "312": "patterned",
+ "313": "paved",
+ "314": "peeled",
+ "315": "peeling",
+ "316": "perched",
+ "317": "performing",
+ "318": "pile",
+ "319": "piled",
+ "320": "pine",
+ "321": "pink",
+ "322": "plaid",
+ "323": "plain",
+ "324": "plastic",
+ "325": "playing",
+ "326": "playing tennis",
+ "327": "plush",
+ "328": "pointed",
+ "329": "pointing",
+ "330": "pointy",
+ "331": "polar",
+ "332": "police",
+ "333": "polka dot",
+ "334": "porcelain",
+ "335": "posing",
+ "336": "potted",
+ "337": "powdered",
+ "338": "power",
+ "339": "pretty",
+ "340": "printed",
+ "341": "protective",
+ "342": "public",
+ "343": "puffy",
+ "344": "pulled back",
+ "345": "purple",
+ "346": "racing",
+ "347": "railroad",
+ "348": "rainbow colored",
+ "349": "raised",
+ "350": "raw",
+ "351": "reaching",
+ "352": "reading",
+ "353": "recessed",
+ "354": "rectangular",
+ "355": "red",
+ "356": "reflected",
+ "357": "reflecting",
+ "358": "reflective",
+ "359": "resting",
+ "360": "riding",
+ "361": "ripe",
+ "362": "rippled",
+ "363": "rock",
+ "364": "rocky",
+ "365": "roll",
+ "366": "rolled",
+ "367": "rolling",
+ "368": "roman",
+ "369": "rough",
+ "370": "round",
+ "371": "rounded",
+ "372": "rubber",
+ "373": "running",
+ "374": "rusted",
+ "375": "rusty",
+ "376": "safety",
+ "377": "salt",
+ "378": "sand",
+ "379": "sandy",
+ "380": "scattered",
+ "381": "seasoned",
+ "382": "serving",
+ "383": "shaded",
+ "384": "shaggy",
+ "385": "shallow",
+ "386": "shaped",
+ "387": "sharp",
+ "388": "shaved",
+ "389": "sheer",
+ "390": "shining",
+ "391": "shiny",
+ "392": "shirtless",
+ "393": "short",
+ "394": "short sleeved",
+ "395": "shredded",
+ "396": "side view",
+ "397": "silver",
+ "398": "singing",
+ "399": "sitting",
+ "400": "skate",
+ "401": "skateboarding",
+ "402": "skating",
+ "403": "ski",
+ "404": "skiing",
+ "405": "skinny",
+ "406": "slanted",
+ "407": "sleeping",
+ "408": "sleeveless",
+ "409": "slice",
+ "410": "sliced",
+ "411": "sliding",
+ "412": "small",
+ "413": "smiling",
+ "414": "smooth",
+ "415": "snow",
+ "416": "snow covered",
+ "417": "snowboarding",
+ "418": "snowy",
+ "419": "soap",
+ "420": "soccer",
+ "421": "soda",
+ "422": "soft",
+ "423": "sparse",
+ "424": "speckled",
+ "425": "spiky",
+ "426": "splashing",
+ "427": "spotted",
+ "428": "spread",
+ "429": "square",
+ "430": "squatting",
+ "431": "stack",
+ "432": "stacked",
+ "433": "stained",
+ "434": "stainless",
+ "435": "stainless steel",
+ "436": "standing",
+ "437": "staring",
+ "438": "statue",
+ "439": "steamed",
+ "440": "steel",
+ "441": "steep",
+ "442": "sticking out",
+ "443": "still",
+ "444": "stone",
+ "445": "stop",
+ "446": "straight",
+ "447": "straw",
+ "448": "street",
+ "449": "striped",
+ "450": "stripes",
+ "451": "stuffed",
+ "452": "styrofoam",
+ "453": "sunny",
+ "454": "surfing",
+ "455": "swimming",
+ "456": "swinging",
+ "457": "taking off",
+ "458": "talking",
+ "459": "tall",
+ "460": "tan",
+ "461": "tarmacked",
+ "462": "teal",
+ "463": "telephone",
+ "464": "tennis",
+ "465": "textile",
+ "466": "textured",
+ "467": "thick",
+ "468": "thin",
+ "469": "throwing",
+ "470": "tied",
+ "471": "tile",
+ "472": "tiled",
+ "473": "tilted",
+ "474": "tinted",
+ "475": "tiny",
+ "476": "toasted",
+ "477": "toilet",
+ "478": "toilet paper",
+ "479": "tomato",
+ "480": "toy",
+ "481": "traffic",
+ "482": "train",
+ "483": "transparent",
+ "484": "triangle",
+ "485": "triangular",
+ "486": "trimmed",
+ "487": "turned",
+ "488": "unmade",
+ "489": "unripe",
+ "490": "up",
+ "491": "upside down",
+ "492": "used",
+ "493": "vertical",
+ "494": "vintage",
+ "495": "waiting",
+ "496": "walking",
+ "497": "warm",
+ "498": "watching",
+ "499": "water",
+ "500": "waving",
+ "501": "wavy",
+ "502": "wearing",
+ "503": "wet",
+ "504": "white",
+ "505": "whole",
+ "506": "wicker",
+ "507": "wide",
+ "508": "wii",
+ "509": "wild",
+ "510": "windshield",
+ "511": "wine",
+ "512": "winter",
+ "513": "wire",
+ "514": "wireless",
+ "515": "wispy",
+ "516": "wood",
+ "517": "worn",
+ "518": "woven",
+ "519": "wrapped",
+ "520": "wrinkled",
+ "521": "wrist",
+ "522": "written",
+ "523": "yellow",
+ "524": "young"
+ },
+ "predicate_to_idx": {
+ "above": 1,
+ "across": 2,
+ "against": 3,
+ "along": 4,
+ "and": 5,
+ "at": 6,
+ "attached to": 7,
+ "behind": 8,
+ "belonging to": 9,
+ "between": 10,
+ "carrying": 11,
+ "covered in": 12,
+ "covering": 13,
+ "eating": 14,
+ "flying in": 15,
+ "for": 16,
+ "from": 17,
+ "growing on": 18,
+ "hanging from": 19,
+ "has": 20,
+ "holding": 21,
+ "in": 22,
+ "in front of": 23,
+ "laying on": 24,
+ "looking at": 25,
+ "lying on": 26,
+ "made of": 27,
+ "mounted on": 28,
+ "near": 29,
+ "of": 30,
+ "on": 31,
+ "on back of": 32,
+ "over": 33,
+ "painted on": 34,
+ "parked on": 35,
+ "part of": 36,
+ "playing": 37,
+ "riding": 38,
+ "says": 39,
+ "sitting on": 40,
+ "standing on": 41,
+ "to": 42,
+ "under": 43,
+ "using": 44,
+ "walking in": 45,
+ "walking on": 46,
+ "watching": 47,
+ "wearing": 48,
+ "wears": 49,
+ "with": 50
+ },
+ "idx_to_predicate": {
+ "1": "above",
+ "2": "across",
+ "3": "against",
+ "4": "along",
+ "5": "and",
+ "6": "at",
+ "7": "attached to",
+ "8": "behind",
+ "9": "belonging to",
+ "10": "between",
+ "11": "carrying",
+ "12": "covered in",
+ "13": "covering",
+ "14": "eating",
+ "15": "flying in",
+ "16": "for",
+ "17": "from",
+ "18": "growing on",
+ "19": "hanging from",
+ "20": "has",
+ "21": "holding",
+ "22": "in",
+ "23": "in front of",
+ "24": "laying on",
+ "25": "looking at",
+ "26": "lying on",
+ "27": "made of",
+ "28": "mounted on",
+ "29": "near",
+ "30": "of",
+ "31": "on",
+ "32": "on back of",
+ "33": "over",
+ "34": "painted on",
+ "35": "parked on",
+ "36": "part of",
+ "37": "playing",
+ "38": "riding",
+ "39": "says",
+ "40": "sitting on",
+ "41": "standing on",
+ "42": "to",
+ "43": "under",
+ "44": "using",
+ "45": "walking in",
+ "46": "walking on",
+ "47": "watching",
+ "48": "wearing",
+ "49": "wears",
+ "50": "with"
+ },
+ "object_count": {
+ "window": 53848,
+ "tree": 50339,
+ "man": 47202,
+ "person": 43031,
+ "shirt": 38238,
+ "wall": 33657,
+ "building": 32011,
+ "sky": 28823,
+ "ground": 28021,
+ "sign": 26645,
+ "leg": 24309,
+ "pole": 24135,
+ "head": 23661,
+ "hand": 23461,
+ "grass": 22855,
+ "light": 22109,
+ "leaf": 20743,
+ "hair": 20318,
+ "car": 18932,
+ "table": 18437,
+ "woman": 18051,
+ "cloud": 17308,
+ "ear": 16695,
+ "line": 16635,
+ "water": 15336,
+ "shoe": 14865,
+ "pant": 14288,
+ "door": 14049,
+ "wheel": 13405,
+ "eye": 13383,
+ "shadow": 13378,
+ "letter": 12170,
+ "fence": 12104,
+ "chair": 12089,
+ "plate": 11608,
+ "floor": 11555,
+ "flower": 11411,
+ "arm": 11410,
+ "jacket": 11082,
+ "stripe": 10799,
+ "handle": 10577,
+ "hat": 10481,
+ "road": 10247,
+ "nose": 10003,
+ "rock": 9815,
+ "tail": 9552,
+ "foot": 9536,
+ "face": 9501,
+ "street": 9438,
+ "snow": 9299,
+ "sidewalk": 9077,
+ "short": 8764,
+ "tile": 8438,
+ "bag": 7944,
+ "field": 7780,
+ "tire": 7698,
+ "helmet": 7646,
+ "bush": 7557,
+ "glass": 7440,
+ "spot": 7322,
+ "boy": 7270,
+ "number": 6968,
+ "background": 6935,
+ "bottle": 6930,
+ "post": 6872,
+ "roof": 6846,
+ "umbrella": 6843,
+ "track": 6665,
+ "plant": 6554,
+ "branch": 6423,
+ "boat": 6422,
+ "logo": 6404,
+ "jean": 6403,
+ "glasses": 6177,
+ "girl": 6147,
+ "picture": 6083,
+ "train": 5928,
+ "brick": 5846,
+ "top": 5793,
+ "box": 5778,
+ "bench": 5773,
+ "shelf": 5703,
+ "wave": 5692,
+ "cap": 5625,
+ "food": 5587,
+ "dirt": 5551,
+ "countertop": 5464,
+ "mouth": 5425,
+ "glove": 5319,
+ "pillow": 5310,
+ "bowl": 5288,
+ "mirror": 5270,
+ "clock": 5235,
+ "horse": 5226,
+ "trunk": 5180,
+ "banana": 5168,
+ "bus": 5140,
+ "bird": 5084,
+ "book": 5047,
+ "airplane": 5043,
+ "neck": 4943,
+ "house": 4850,
+ "paper": 4808,
+ "writing": 4777,
+ "board": 4718,
+ "reflection": 4691,
+ "coat": 4643,
+ "wing": 4592,
+ "elephant": 4558,
+ "cup": 4537,
+ "mountain": 4531,
+ "seat": 4519,
+ "button": 4500,
+ "sock": 4485,
+ "giraffe": 4477,
+ "cabinet": 4473,
+ "kite": 4419,
+ "lamp": 4394,
+ "hill": 4376,
+ "dog": 4366,
+ "cow": 4278,
+ "truck": 4270,
+ "flag": 4231,
+ "headlight": 4230,
+ "bike": 4220,
+ "surfboard": 4108,
+ "frame": 3981,
+ "sand": 3978,
+ "wire": 3963,
+ "zebra": 3962,
+ "sheep": 3957,
+ "skateboard": 3950,
+ "motorcycle": 3949,
+ "word": 3900,
+ "ski": 3829,
+ "finger": 3820,
+ "back": 3682,
+ "ceiling": 3646,
+ "beach": 3605,
+ "design": 3544,
+ "animal": 3478,
+ "sink": 3450,
+ "ball": 3409,
+ "cat": 3407,
+ "pizza": 3326,
+ "container": 3323,
+ "curtain": 3270,
+ "bed": 3265,
+ "bear": 3193,
+ "sunglasses": 3133,
+ "windshield": 3120,
+ "towel": 3116,
+ "player": 3095,
+ "boot": 3071,
+ "vehicle": 3000,
+ "vase": 2986,
+ "railing": 2977,
+ "wood": 2977,
+ "paw": 2955,
+ "ocean": 2933,
+ "desk": 2887,
+ "tie": 2884,
+ "donut": 2875,
+ "stand": 2859,
+ "engine": 2847,
+ "racket": 2846,
+ "child": 2836,
+ "tower": 2789,
+ "photo": 2783,
+ "pot": 2736,
+ "stone": 2733,
+ "lady": 2711,
+ "phone": 2697,
+ "orange": 2691,
+ "basket": 2690,
+ "horn": 2680,
+ "laptop": 2644,
+ "lettering": 2643,
+ "collar": 2640,
+ "bar": 2624,
+ "drawer": 2621,
+ "stem": 2588,
+ "toilet": 2571,
+ "apple": 2568,
+ "backpack": 2550,
+ "strap": 2549,
+ "lid": 2547,
+ "knob": 2545,
+ "sticker": 2539,
+ "fruit": 2508,
+ "sleeve": 2501,
+ "uniform": 2478,
+ "fork": 2428,
+ "cord": 2427,
+ "blanket": 2410,
+ "cheese": 2397,
+ "screen": 2383,
+ "fur": 2378,
+ "napkin": 2367,
+ "air": 2357,
+ "dress": 2353,
+ "knife": 2344,
+ "rail": 2334,
+ "mane": 2317,
+ "bicycle": 2309,
+ "guy": 2298,
+ "room": 2284,
+ "hoof": 2281,
+ "keyboard": 2280,
+ "sneaker": 2278,
+ "carrot": 2256,
+ "object": 2245,
+ "sweater": 2210,
+ "patch": 2209,
+ "wrist": 2201,
+ "bat": 2196,
+ "curb": 2189,
+ "couch": 2172,
+ "cake": 2168,
+ "suit": 2146,
+ "arrow": 2139,
+ "tag": 2129,
+ "vegetable": 2126,
+ "front": 2125,
+ "hole": 2123,
+ "tray": 2115,
+ "faucet": 2112,
+ "base": 2097,
+ "tomato": 2094,
+ "frisbee": 2065,
+ "bread": 2059,
+ "key": 2055,
+ "street light": 2023,
+ "knee": 2015,
+ "pipe": 2014,
+ "pavement": 2003,
+ "watch": 1999,
+ "court": 1987,
+ "broccoli": 1940,
+ "camera": 1926,
+ "tshirt": 1922,
+ "television": 1922,
+ "platform": 1920,
+ "circle": 1893,
+ "ripple": 1870,
+ "bathroom": 1863,
+ "stick": 1858,
+ "rope": 1858,
+ "cloth": 1839,
+ "distance": 1835,
+ "paint": 1832,
+ "suitcase": 1828,
+ "cone": 1827,
+ "step": 1824,
+ "belt": 1817,
+ "banner": 1811,
+ "dish": 1810,
+ "traffic light": 1803,
+ "computer": 1800,
+ "area": 1794,
+ "shade": 1787,
+ "bridge": 1782,
+ "vest": 1782,
+ "van": 1774,
+ "carpet": 1771,
+ "sauce": 1765,
+ "license plate": 1759,
+ "rack": 1736,
+ "spoon": 1729,
+ "pillar": 1693,
+ "string": 1689,
+ "black": 1675,
+ "can": 1649,
+ "balcony": 1647,
+ "candle": 1637,
+ "surface": 1631,
+ "meat": 1627,
+ "label": 1612,
+ "body": 1585,
+ "chain": 1574,
+ "onion": 1555,
+ "jersey": 1538,
+ "feather": 1536,
+ "bottom": 1533,
+ "gravel": 1519,
+ "weed": 1518,
+ "pepper": 1516,
+ "sandwich": 1511,
+ "awning": 1508,
+ "column": 1501,
+ "fire hydrant": 1500,
+ "item": 1498,
+ "goggles": 1479,
+ "skier": 1478,
+ "kitchen": 1477,
+ "cover": 1473,
+ "skirt": 1473,
+ "stair": 1452,
+ "shoulder": 1449,
+ "park": 1437,
+ "band": 1436,
+ "stove": 1427,
+ "name": 1419,
+ "rug": 1416,
+ "refrigerator": 1412,
+ "spectator": 1394,
+ "ramp": 1390,
+ "snowboard": 1376,
+ "monitor": 1375,
+ "tree trunk": 1371,
+ "whisker": 1371,
+ "gate": 1368,
+ "panel": 1365,
+ "pocket": 1364,
+ "luggage": 1360,
+ "statue": 1339,
+ "blind": 1327,
+ "shore": 1312,
+ "clothes": 1308,
+ "ring": 1307,
+ "metal": 1304,
+ "beak": 1304,
+ "purse": 1293,
+ "concrete": 1277,
+ "log": 1275,
+ "kid": 1272,
+ "cell phone": 1271,
+ "pen": 1270,
+ "bracelet": 1268,
+ "scarf": 1264,
+ "graffiti": 1256,
+ "crust": 1255,
+ "green": 1251,
+ "ski pole": 1237,
+ "cushion": 1230,
+ "wetsuit": 1230,
+ "mouse": 1228,
+ "hot dog": 1223,
+ "necklace": 1219,
+ "doorway": 1217,
+ "piece": 1213,
+ "shrub": 1209,
+ "net": 1187,
+ "palm tree": 1180,
+ "path": 1179,
+ "beard": 1165,
+ "oven": 1155,
+ "holder": 1153,
+ "advertisement": 1151,
+ "wine": 1146,
+ "sheet": 1146,
+ "tusk": 1145,
+ "sun": 1138,
+ "topping": 1135,
+ "pan": 1132,
+ "walkway": 1132,
+ "remote": 1129,
+ "structure": 1125,
+ "cart": 1120,
+ "slice": 1119,
+ "tennis court": 1099,
+ "vent": 1097,
+ "hood": 1094,
+ "group": 1089,
+ "catcher": 1089,
+ "speaker": 1088,
+ "scene": 1084,
+ "sandal": 1084,
+ "forest": 1082,
+ "rim": 1076,
+ "bun": 1076,
+ "painting": 1074,
+ "tennis racket": 1068,
+ "outlet": 1064,
+ "poster": 1056,
+ "tent": 1053,
+ "star": 1052,
+ "chimney": 1051,
+ "runway": 1049,
+ "street sign": 1044,
+ "cable": 1042,
+ "text": 1037,
+ "outfit": 1036,
+ "bolt": 1022,
+ "jar": 1019,
+ "cellphone": 1008,
+ "city": 998,
+ "decoration": 997,
+ "river": 973,
+ "surfer": 971,
+ "elbow": 970,
+ "wiper": 968,
+ "slope": 966,
+ "block": 958,
+ "frosting": 950,
+ "bucket": 950,
+ "bumper": 950,
+ "trash can": 947,
+ "tank": 947,
+ "lettuce": 936,
+ "fan": 936,
+ "teddy bear": 935,
+ "store": 932,
+ "parking lot": 925,
+ "tablecloth": 923,
+ "dot": 923,
+ "utensil": 917,
+ "case": 906,
+ "power line": 894,
+ "border": 893,
+ "petal": 892,
+ "pane": 890,
+ "controller": 889,
+ "eyebrow": 887,
+ "microwave": 885,
+ "ribbon": 885,
+ "propeller": 882,
+ "crowd": 879,
+ "clothing": 876,
+ "chest": 876,
+ "cockpit": 876,
+ "slat": 875,
+ "display": 862,
+ "baby": 859,
+ "thumb": 858,
+ "symbol": 856,
+ "liquid": 850,
+ "baseball player": 847,
+ "beam": 843,
+ "batter": 839,
+ "foam": 833,
+ "pepperoni": 829,
+ "toy": 823,
+ "train car": 818,
+ "couple": 816,
+ "olive": 811,
+ "teeth": 809,
+ "footprint": 808,
+ "print": 805,
+ "lip": 804,
+ "hoodie": 804,
+ "sofa": 803,
+ "straw": 800,
+ "skin": 800,
+ "lamp post": 799,
+ "land": 795,
+ "wristband": 794,
+ "headboard": 793,
+ "blade": 783,
+ "umpire": 782,
+ "mug": 775,
+ "mushroom": 773,
+ "potato": 771,
+ "brush": 767,
+ "cleat": 763,
+ "signal": 750,
+ "ladder": 749,
+ "barrier": 748,
+ "arch": 740,
+ "pile": 738,
+ "dock": 732,
+ "game": 731,
+ "bin": 730,
+ "hillside": 729,
+ "cement": 728,
+ "ledge": 723,
+ "planter": 721,
+ "drink": 720,
+ "mat": 712,
+ "smoke": 711,
+ "egg": 709,
+ "grill": 709,
+ "mask": 703,
+ "shutter": 701,
+ "jet": 701,
+ "pad": 697,
+ "suv": 695,
+ "strip": 694,
+ "canopy": 694,
+ "toothbrush": 692,
+ "spoke": 685,
+ "baseball": 682,
+ "station": 679,
+ "lake": 672,
+ "burner": 670,
+ "tail light": 667,
+ "ponytail": 666,
+ "handlebar": 665,
+ "image": 664,
+ "crosswalk": 660,
+ "numeral": 660,
+ "tank top": 657,
+ "rod": 656,
+ "airport": 656,
+ "chicken": 655,
+ "zipper": 655,
+ "hay": 654,
+ "pond": 651,
+ "stain": 646,
+ "headband": 645,
+ "tongue": 635,
+ "nail": 634,
+ "duck": 634,
+ "tennis shoe": 631,
+ "scissors": 626,
+ "stool": 626,
+ "trash": 625,
+ "pitcher": 622,
+ "landing gear": 622,
+ "lot": 621,
+ "yellow": 621,
+ "stop sign": 619,
+ "tarmac": 615,
+ "chin": 613,
+ "drain": 613,
+ "boulder": 613,
+ "bow": 611,
+ "pine tree": 606,
+ "train tracks": 604,
+ "foliage": 598,
+ "claw": 596,
+ "nostril": 594,
+ "skateboarder": 594,
+ "strawberry": 590,
+ "tarp": 586,
+ "light pole": 585,
+ "enclosure": 585,
+ "passenger": 583,
+ "horizon": 580,
+ "grape": 574,
+ "crate": 573,
+ "twig": 573,
+ "emblem": 572,
+ "rose": 571,
+ "toilet paper": 570,
+ "cross": 567,
+ "sprinkle": 567,
+ "icing": 565,
+ "lawn": 560,
+ "leash": 560,
+ "tub": 559,
+ "wet suit": 555,
+ "roll": 553,
+ "visor": 552,
+ "magnet": 551,
+ "roman numeral": 550,
+ "earring": 549,
+ "salad": 548,
+ "beer": 547,
+ "bean": 547,
+ "balloon": 546,
+ "tape": 544,
+ "sweatshirt": 537,
+ "sail": 533,
+ "end": 529,
+ "tennis ball": 529,
+ "smile": 525,
+ "antenna": 524,
+ "plastic": 523,
+ "apron": 521,
+ "meter": 514,
+ "home plate": 514,
+ "lemon": 513,
+ "shower": 512,
+ "moss": 512,
+ "pastry": 510,
+ "tree branch": 509,
+ "screw": 509,
+ "outside": 508,
+ "yard": 507,
+ "mound": 507,
+ "hook": 506,
+ "nightstand": 505,
+ "cupcake": 504,
+ "magazine": 500,
+ "heart": 500,
+ "tattoo": 500,
+ "fixture": 498,
+ "bunch": 497,
+ "mitt": 496,
+ "fencing": 494,
+ "asphalt": 493,
+ "grate": 493,
+ "soap": 491,
+ "crumb": 488,
+ "fireplace": 488,
+ "gear": 488,
+ "trail": 487,
+ "switch": 485,
+ "bark": 481,
+ "puddle": 480,
+ "goat": 479,
+ "dispenser": 476,
+ "bathtub": 475,
+ "saddle": 474,
+ "cupboard": 473,
+ "hose": 472,
+ "baseball field": 471,
+ "motorbike": 470,
+ "tennis": 470,
+ "fry": 467,
+ "stack": 466,
+ "comforter": 466,
+ "driver": 466,
+ "entrance": 464,
+ "deck": 464,
+ "restaurant": 464,
+ "fin": 464,
+ "hedge": 462,
+ "archway": 459,
+ "mast": 458,
+ "street lamp": 456,
+ "harness": 455,
+ "billboard": 454,
+ "zoo": 452,
+ "saucer": 451,
+ "baseball bat": 451,
+ "rice": 444,
+ "coffee table": 443,
+ "baseball cap": 443,
+ "trailer": 443,
+ "snout": 443,
+ "dresser": 441,
+ "scooter": 439,
+ "steeple": 438,
+ "fingernail": 437,
+ "ice": 436,
+ "machine": 433,
+ "cab": 433,
+ "forehead": 431,
+ "barrel": 430,
+ "coffee": 427,
+ "toilet seat": 427,
+ "drawing": 427,
+ "pasture": 426,
+ "snowboarder": 425,
+ "light fixture": 419,
+ "ketchup": 417,
+ "cookie": 415,
+ "blouse": 413,
+ "table cloth": 412,
+ "home": 411,
+ "marker": 410,
+ "sausage": 410,
+ "chip": 410,
+ "bedroom": 409,
+ "card": 408,
+ "art": 407,
+ "glass window": 407,
+ "juice": 405,
+ "bell": 405,
+ "ski poles": 405,
+ "pedestrian": 404,
+ "crane": 402,
+ "day": 401,
+ "mustache": 401,
+ "cucumber": 399,
+ "fish": 398,
+ "bookshelf": 397,
+ "menu": 396,
+ "flip flop": 396,
+ "rider": 396,
+ "parking meter": 392,
+ "lock": 392,
+ "knot": 389,
+ "mud": 388,
+ "intersection": 387,
+ "plug": 384,
+ "tissue": 384,
+ "dugout": 383,
+ "traffic": 381,
+ "living room": 381,
+ "reflector": 381,
+ "bracket": 381,
+ "stuffed animal": 381,
+ "windshield wiper": 380,
+ "fender": 379,
+ "bleacher": 375,
+ "traffic signal": 374,
+ "brick wall": 373,
+ "pier": 372,
+ "figure": 372,
+ "clock face": 371,
+ "ad": 368,
+ "bacon": 368,
+ "stroller": 367,
+ "cooler": 367,
+ "knee pad": 365,
+ "cutting board": 364,
+ "cabinet door": 364,
+ "foreground": 364,
+ "newspaper": 363,
+ "dome": 362,
+ "light switch": 362,
+ "nut": 362,
+ "cage": 361,
+ "carriage": 359,
+ "ship": 358,
+ "stop": 358,
+ "toe": 358,
+ "diamond": 356,
+ "wool": 356,
+ "triangle": 355,
+ "porch": 354,
+ "sailboat": 352,
+ "light post": 352,
+ "chocolate": 351,
+ "dessert": 349,
+ "spinach": 347,
+ "sea": 347,
+ "tennis player": 347,
+ "shop": 346,
+ "pickle": 346,
+ "headphone": 345,
+ "silverware": 345,
+ "control": 343,
+ "limb": 342,
+ "buckle": 342,
+ "noodle": 341,
+ "cheek": 341,
+ "trousers": 340,
+ "spire": 340,
+ "shoreline": 340,
+ "fence post": 340,
+ "mustard": 339,
+ "garbage can": 339,
+ "bubble": 339,
+ "staircase": 337,
+ "lamb": 337,
+ "clock tower": 336,
+ "splash": 336,
+ "male": 335,
+ "lamp shade": 335,
+ "pebble": 332,
+ "water bottle": 331,
+ "telephone": 328,
+ "island": 328,
+ "urinal": 327,
+ "dial": 324,
+ "wrist band": 324,
+ "pedal": 323,
+ "bridle": 321,
+ "tube": 318,
+ "front legs": 318,
+ "placemat": 316,
+ "female": 315,
+ "microphone": 313,
+ "vine": 312,
+ "kickstand": 312,
+ "doll": 312,
+ "photograph": 312,
+ "shoelace": 312,
+ "computer monitor": 311,
+ "bank": 311,
+ "bedspread": 311,
+ "train station": 311,
+ "church": 310,
+ "artwork": 309,
+ "waist": 307,
+ "figurine": 306,
+ "candy": 306,
+ "mattress": 306,
+ "meal": 304,
+ "dishwasher": 303,
+ "adult": 303,
+ "berry": 302,
+ "device": 301,
+ "character": 301,
+ "bull": 300,
+ "remote control": 299,
+ "decal": 299,
+ "platter": 299,
+ "flooring": 297,
+ "sculpture": 297,
+ "cliff": 296,
+ "plaque": 294,
+ "cream": 294,
+ "soup": 292,
+ "garage": 290,
+ "trashcan": 289,
+ "shaker": 289,
+ "seed": 289,
+ "armrest": 288,
+ "wine bottle": 288,
+ "pigeon": 288,
+ "view": 285,
+ "hanger": 285,
+ "paper towel": 284,
+ "ham": 282,
+ "driveway": 281,
+ "veggie": 281,
+ "lampshade": 280,
+ "furniture": 280,
+ "paddle": 280,
+ "package": 277,
+ "kettle": 277,
+ "french fry": 276,
+ "soda": 274,
+ "globe": 273,
+ "drape": 272,
+ "tool": 272,
+ "beverage": 272,
+ "beanie": 272,
+ "ornament": 271,
+ "wrapper": 270,
+ "cabin": 269,
+ "barn": 268,
+ "ski lift": 268,
+ "toilet bowl": 267,
+ "sugar": 265,
+ "landscape": 265,
+ "coffee cup": 264,
+ "roman numerals": 264,
+ "cd": 263,
+ "inside": 263,
+ "corn": 262,
+ "bookcase": 261,
+ "spice": 261,
+ "bandana": 259,
+ "taxi": 257,
+ "pool": 257,
+ "cuff": 256,
+ "patio": 255,
+ "wallpaper": 254,
+ "window sill": 252,
+ "garden": 252,
+ "door handle": 252,
+ "bus stop": 249,
+ "spatula": 248,
+ "skyscraper": 247,
+ "blender": 247,
+ "pineapple": 247,
+ "soil": 244,
+ "steering wheel": 243,
+ "video game": 243,
+ "icon": 243,
+ "bead": 243,
+ "muzzle": 243,
+ "wii": 243,
+ "buoy": 242,
+ "pea": 242,
+ "palm": 241,
+ "aircraft": 241,
+ "pony tail": 240,
+ "baseball glove": 238,
+ "pathway": 237,
+ "latch": 237,
+ "carton": 236,
+ "stump": 236,
+ "spray": 236,
+ "oar": 235,
+ "stove top": 234,
+ "traffic sign": 234,
+ "slab": 234,
+ "heel": 234,
+ "handbag": 233,
+ "foil": 233,
+ "tunnel": 233,
+ "american flag": 233,
+ "moped": 232,
+ "side mirror": 232,
+ "stadium": 232,
+ "highway": 231,
+ "skater": 231,
+ "notebook": 230,
+ "chandelier": 230,
+ "watermark": 230,
+ "bikini": 230,
+ "tee shirt": 230,
+ "appliance": 228,
+ "pear": 228,
+ "rain": 228,
+ "family": 227,
+ "blueberry": 226,
+ "seagull": 226,
+ "butter": 225,
+ "railroad": 225,
+ "baseboard": 224,
+ "mantle": 224,
+ "stop light": 223,
+ "hubcap": 223,
+ "necktie": 223,
+ "costume": 223,
+ "calf": 223,
+ "herd": 223,
+ "herb": 222,
+ "train track": 222,
+ "shed": 221,
+ "telephone pole": 221,
+ "condiment": 221,
+ "milk": 220,
+ "wagon": 220,
+ "peak": 218,
+ "picture frame": 217,
+ "wake": 215,
+ "booth": 214,
+ "skiis": 214,
+ "shingle": 213,
+ "cattle": 213,
+ "lift": 213,
+ "mouse pad": 212,
+ "bang": 211,
+ "lanyard": 211,
+ "ski slope": 210,
+ "air conditioner": 209,
+ "motor": 209,
+ "roadway": 208,
+ "pencil": 208,
+ "stoplight": 207,
+ "toaster": 206,
+ "cabbage": 206,
+ "brake light": 206,
+ "pumpkin": 204,
+ "bouquet": 204,
+ "netting": 204,
+ "trick": 204,
+ "median": 202,
+ "stairway": 201,
+ "jug": 201,
+ "kitten": 201,
+ "canister": 200,
+ "cardboard": 200,
+ "pie": 199,
+ "flame": 198,
+ "coaster": 197,
+ "manhole": 197,
+ "radiator": 195,
+ "audience": 195,
+ "socket": 194,
+ "storefront": 194,
+ "freezer": 194,
+ "front window": 193,
+ "bud": 193,
+ "ankle": 193,
+ "ottoman": 191,
+ "badge": 191,
+ "cherry": 191,
+ "market": 191,
+ "guitar": 190,
+ "french fries": 190,
+ "handle bars": 190,
+ "basin": 190,
+ "officer": 190,
+ "biker": 190,
+ "muffin": 190,
+ "facial hair": 189,
+ "head light": 188,
+ "steam": 188,
+ "fountain": 187,
+ "dvd": 187,
+ "picnic table": 187,
+ "range": 187,
+ "date": 186,
+ "peel": 186,
+ "seaweed": 184,
+ "toothpick": 184,
+ "stall": 184,
+ "barricade": 183,
+ "shower head": 183,
+ "skate park": 183,
+ "lime": 182,
+ "end table": 180,
+ "jeep": 180,
+ "map": 180,
+ "lane": 180,
+ "mountain range": 180,
+ "train engine": 179,
+ "packet": 176,
+ "coffee mug": 176,
+ "stone wall": 176,
+ "sunset": 176,
+ "basil": 176,
+ "coffee maker": 175,
+ "pasta": 174,
+ "bagel": 173,
+ "shower curtain": 173,
+ "lantern": 171,
+ "salt shaker": 171,
+ "tine": 171,
+ "seasoning": 171,
+ "computer mouse": 170,
+ "pack": 170,
+ "soccer ball": 169,
+ "overpass": 169,
+ "computer screen": 168,
+ "robe": 168,
+ "shelter": 168,
+ "roadside": 168,
+ "gas tank": 168,
+ "valley": 168,
+ "utility pole": 168,
+ "sedan": 167,
+ "shrimp": 167,
+ "office": 166,
+ "town": 166,
+ "crown": 166,
+ "parasail": 166,
+ "flower pot": 165,
+ "mailbox": 165,
+ "baseball game": 165,
+ "peach": 165,
+ "harbor": 164,
+ "worker": 164,
+ "half": 164,
+ "towel rack": 162,
+ "window frame": 162,
+ "disc": 161,
+ "door knob": 161,
+ "stabilizer": 161,
+ "plain": 161,
+ "pin": 160,
+ "pizza slice": 160,
+ "vanity": 159,
+ "bow tie": 158,
+ "produce": 157,
+ "scale": 156,
+ "turf": 156,
+ "door frame": 155,
+ "binder": 155,
+ "sweatband": 155,
+ "printer": 154,
+ "undershirt": 154,
+ "pilot": 154,
+ "cauliflower": 153,
+ "blazer": 153,
+ "windowsill": 153,
+ "feeder": 152,
+ "fire truck": 152,
+ "mousepad": 151,
+ "folder": 151,
+ "hotel": 151,
+ "doorknob": 151,
+ "soap dispenser": 151,
+ "fog": 150,
+ "stream": 150,
+ "skull": 149,
+ "hallway": 148,
+ "prong": 148,
+ "streamer": 148,
+ "ski boot": 148,
+ "paper plate": 148,
+ "mannequin": 147,
+ "ivy": 147,
+ "tongs": 147,
+ "locomotive": 147,
+ "exhaust pipe": 147,
+ "layer": 147,
+ "calendar": 146,
+ "slot": 146,
+ "desert": 146,
+ "side window": 145,
+ "hour hand": 145,
+ "she": 144,
+ "canoe": 144,
+ "goatee": 144,
+ "squash": 144,
+ "toast": 144,
+ "electrical outlet": 143,
+ "tabletop": 143,
+ "breast": 143,
+ "bib": 143,
+ "butterfly": 142,
+ "chopstick": 142,
+ "candle holder": 142,
+ "dough": 142,
+ "toilet lid": 142,
+ "guard rail": 141,
+ "briefcase": 141,
+ "back pack": 141,
+ "cigarette": 141,
+ "wii remote": 141,
+ "avocado": 141,
+ "celery": 141,
+ "minivan": 140,
+ "scoreboard": 140,
+ "legging": 140,
+ "watermelon": 140,
+ "toothpaste": 140,
+ "clay": 139,
+ "foot print": 139,
+ "terminal": 139,
+ "snowsuit": 139,
+ "minute hand": 139,
+ "mesh": 139,
+ "trash bin": 138,
+ "mulch": 138,
+ "pancake": 138,
+ "toiletry": 138,
+ "quilt": 138,
+ "glaze": 138,
+ "ceiling light": 137,
+ "manhole cover": 137,
+ "face mask": 137,
+ "teapot": 136,
+ "salt": 136,
+ "garage door": 136,
+ "ram": 136,
+ "fire": 135,
+ "goose": 135,
+ "windshield wipers": 135,
+ "ice cream": 135,
+ "stage": 134,
+ "toilet tank": 134,
+ "fern": 134,
+ "tap": 132,
+ "railroad tracks": 132,
+ "backsplash": 131,
+ "overhang": 131,
+ "brocolli": 131,
+ "photographer": 131,
+ "beef": 131,
+ "lighthouse": 130,
+ "ski pants": 128,
+ "wristwatch": 127,
+ "name tag": 126,
+ "wallet": 125,
+ "side table": 124,
+ "closet": 124,
+ "cane": 124,
+ "page": 124,
+ "muffler": 124,
+ "hut": 124,
+ "rooftop": 124,
+ "shin guard": 124,
+ "wii controller": 124,
+ "heater": 123,
+ "apartment": 123,
+ "shield": 123,
+ "jockey": 123,
+ "team": 123,
+ "charger": 122,
+ "radio": 122,
+ "light bulb": 122,
+ "garnish": 122,
+ "raft": 122,
+ "website": 122,
+ "sign post": 121,
+ "oven door": 121,
+ "parsley": 121,
+ "skylight": 120,
+ "oil": 120,
+ "brim": 120,
+ "polar bear": 120,
+ "tangerine": 120,
+ "toddler": 119,
+ "policeman": 119,
+ "entertainment center": 118,
+ "swimsuit": 118,
+ "dumpster": 118,
+ "floret": 118,
+ "ski boots": 117,
+ "surf": 117,
+ "burger": 116,
+ "cardboard box": 116,
+ "game controller": 116,
+ "chef": 116,
+ "farm": 116,
+ "ipod": 116,
+ "flamingo": 116,
+ "lapel": 115,
+ "bike rack": 115,
+ "cycle": 115,
+ "night": 114,
+ "overall": 114,
+ "snowflake": 114,
+ "trolley": 114,
+ "outfield": 114,
+ "conductor": 114,
+ "cereal": 113,
+ "sponge": 113,
+ "baseball uniform": 113,
+ "cactus": 112,
+ "easel": 112,
+ "armchair": 112,
+ "tractor": 112,
+ "radish": 112,
+ "sack": 111,
+ "mother": 111,
+ "smoke stack": 111,
+ "moustache": 111,
+ "pump": 111,
+ "tea": 111,
+ "banana bunch": 111,
+ "kneepad": 111,
+ "moon": 110,
+ "boardwalk": 110,
+ "reign": 110,
+ "christmas tree": 110,
+ "ski tracks": 110,
+ "pajama": 110,
+ "ocean water": 110,
+ "castle": 109,
+ "soap dish": 109,
+ "tail feathers": 109,
+ "beer bottle": 109,
+ "elbow pad": 109,
+ "floor lamp": 108,
+ "meadow": 108,
+ "snack": 108,
+ "railway": 108,
+ "dinner": 108,
+ "suspender": 108,
+ "match": 108,
+ "parasol": 108,
+ "tablet": 107,
+ "goal": 107,
+ "cargo": 107,
+ "bathing suit": 107,
+ "gun": 107,
+ "syrup": 107,
+ "copyright": 107,
+ "tennis net": 107,
+ "cowboy hat": 107,
+ "rock wall": 106,
+ "powder": 106,
+ "envelope": 105,
+ "piano": 105,
+ "gravy": 105,
+ "skatepark": 105,
+ "deer": 104,
+ "pepper shaker": 104,
+ "keypad": 103,
+ "monkey": 103,
+ "scaffolding": 103,
+ "monument": 103,
+ "tv stand": 103,
+ "grass field": 103,
+ "life jacket": 102,
+ "snow board": 102,
+ "melon": 102,
+ "sunflower": 101,
+ "product": 101,
+ "bride": 101,
+ "pickup truck": 100,
+ "mountainside": 100,
+ "kayak": 100,
+ "coach": 100,
+ "broom": 99,
+ "cracker": 98,
+ "book shelf": 98,
+ "ceiling fan": 98,
+ "lunch": 98,
+ "drum": 98,
+ "train cars": 98,
+ "fuselage": 98,
+ "tomato sauce": 98,
+ "lipstick": 97,
+ "dryer": 97,
+ "tripod": 97,
+ "coffee pot": 97,
+ "bed frame": 97,
+ "life preserver": 97,
+ "hill side": 97,
+ "mango": 97,
+ "breakfast": 96,
+ "parachute": 96,
+ "mitten": 96,
+ "daisy": 96,
+ "sandwhich": 96,
+ "beach chair": 96,
+ "lion": 95,
+ "tree line": 95,
+ "police officer": 95,
+ "dressing": 95,
+ "license": 95,
+ "garlic": 95,
+ "dip": 94,
+ "flour": 94,
+ "playground": 94,
+ "bedding": 94,
+ "bath tub": 94,
+ "tourist": 94,
+ "tail wing": 94,
+ "coin": 93,
+ "tree leaves": 93,
+ "weather vane": 93,
+ "control panel": 93,
+ "wild": 93,
+ "surfing": 93,
+ "head band": 93,
+ "dress shirt": 92,
+ "tights": 92,
+ "turbine": 92,
+ "tissue box": 91,
+ "tail lights": 91,
+ "alarm clock": 91,
+ "traffic cone": 91,
+ "mountain top": 91,
+ "scissor": 91,
+ "air vent": 91,
+ "antelope": 91,
+ "ball cap": 91,
+ "clock hand": 91,
+ "fire escape": 90,
+ "wrist watch": 90,
+ "swan": 90,
+ "neck tie": 90,
+ "courtyard": 89,
+ "glass door": 89,
+ "butter knife": 89,
+ "groom": 89,
+ "motorcyclist": 89,
+ "tulip": 88,
+ "portrait": 88,
+ "blossom": 88,
+ "safety jacket": 88,
+ "pony": 88,
+ "signal light": 87,
+ "mixer": 87,
+ "catchers mitt": 87,
+ "snow pants": 87,
+ "ski suit": 87,
+ "tile floor": 86,
+ "pillowcase": 86,
+ "slack": 85,
+ "kiwi": 84,
+ "puppy": 84,
+ "electronics": 84,
+ "customer": 84,
+ "asparagus": 84,
+ "zucchini": 83,
+ "plantain": 83,
+ "bathroom sink": 82,
+ "footboard": 82,
+ "grafitti": 82,
+ "canal": 82,
+ "tomato slice": 82,
+ "biscuit": 82,
+ "police": 82,
+ "comb": 81,
+ "swim trunks": 81,
+ "dvd player": 81,
+ "dashboard": 81,
+ "passenger car": 81,
+ "baseline": 81,
+ "second floor": 80,
+ "soda can": 80,
+ "birthday cake": 80,
+ "skiier": 80,
+ "plumbing": 80,
+ "jet engine": 80,
+ "trough": 79,
+ "tail fin": 79,
+ "toilet brush": 79,
+ "panda": 79,
+ "shopping bag": 78,
+ "chalkboard": 78,
+ "cyclist": 78,
+ "rainbow": 78,
+ "suit jacket": 78,
+ "tea kettle": 78,
+ "pillow case": 78,
+ "athlete": 78,
+ "life vest": 78,
+ "passenger train": 78,
+ "tennis match": 78,
+ "bamboo": 78,
+ "restroom": 77,
+ "dining table": 77,
+ "fire extinguisher": 77,
+ "train platform": 77,
+ "train front": 77,
+ "hand towel": 76,
+ "safety cone": 76,
+ "soldier": 76,
+ "student": 76,
+ "pitchers mound": 76,
+ "shin guards": 76,
+ "bone": 76,
+ "hamburger": 76,
+ "computer keyboard": 75,
+ "gown": 75,
+ "console": 74,
+ "parrot": 74,
+ "raspberry": 74,
+ "pouch": 74,
+ "shower door": 74,
+ "snow suit": 74,
+ "dirt road": 74,
+ "display case": 73,
+ "gas station": 73,
+ "weather": 73,
+ "lotion": 72,
+ "marina": 72,
+ "gazebo": 72,
+ "steak": 72,
+ "referee": 72,
+ "skillet": 72,
+ "baseball players": 72,
+ "giraffe head": 72,
+ "pizza crust": 72,
+ "bar stool": 71,
+ "throw pillow": 71,
+ "tea pot": 71,
+ "receipt": 71,
+ "gazelle": 71,
+ "rib": 71,
+ "halter": 71,
+ "caboose": 71,
+ "jumpsuit": 71,
+ "infield": 71,
+ "brownie": 71,
+ "notepad": 70,
+ "alley": 70,
+ "battery": 70,
+ "turkey": 70,
+ "ingredient": 70,
+ "owl": 70,
+ "shovel": 69,
+ "power pole": 69,
+ "wheelchair": 69,
+ "hangar": 69,
+ "trash bag": 69,
+ "coconut": 69,
+ "yolk": 69,
+ "area rug": 68,
+ "food truck": 68,
+ "garment": 68,
+ "instruction": 68,
+ "bandage": 67,
+ "parade": 67,
+ "powdered sugar": 67,
+ "blood": 67,
+ "price tag": 66,
+ "urn": 66,
+ "gentleman": 66,
+ "whipped cream": 66,
+ "museum": 66,
+ "tortilla": 66,
+ "bicyclist": 66,
+ "stapler": 65,
+ "dinosaur": 65,
+ "penguin": 65,
+ "dining room": 64,
+ "croissant": 64,
+ "touchpad": 64,
+ "stereo": 64,
+ "soccer field": 64,
+ "buffalo": 63,
+ "alcohol": 63,
+ "vane": 63,
+ "sword": 63,
+ "raisin": 63,
+ "cafe": 62,
+ "apartment building": 62,
+ "raincoat": 62,
+ "chili": 62,
+ "beet": 62,
+ "eagle": 62,
+ "baseball mitt": 62,
+ "satellite dish": 61,
+ "donkey": 61,
+ "stuffed bear": 61,
+ "pizza box": 61,
+ "ostrich": 61,
+ "projector": 60,
+ "park bench": 60,
+ "dragon": 60,
+ "waterfall": 60,
+ "cowboy": 60,
+ "bus driver": 60,
+ "ski jacket": 60,
+ "ladle": 60,
+ "seal": 59,
+ "luggage cart": 59,
+ "earphone": 59,
+ "fruit stand": 59,
+ "yacht": 58,
+ "employee": 58,
+ "folding chair": 57,
+ "parking sign": 57,
+ "lighter": 57,
+ "macaroni": 57,
+ "knife block": 56,
+ "coin slot": 56,
+ "meatball": 56,
+ "apple logo": 56,
+ "grapefruit": 56,
+ "ox": 56,
+ "eggplant": 56,
+ "wire fence": 56,
+ "washer": 55,
+ "kiosk": 55,
+ "table lamp": 55,
+ "shack": 55,
+ "sea foam": 55,
+ "frog": 55,
+ "ski goggles": 55,
+ "teddy": 55,
+ "mozzarella": 55,
+ "almond": 55,
+ "polo shirt": 54,
+ "sweat band": 54,
+ "desk lamp": 53,
+ "laptop computer": 53,
+ "instrument": 53,
+ "school bus": 53,
+ "backyard": 53,
+ "hilltop": 53,
+ "bunny": 53,
+ "wig": 53,
+ "motor bike": 52,
+ "cooker": 52,
+ "football": 52,
+ "underwear": 52,
+ "onion ring": 52,
+ "money": 52,
+ "shampoo": 52,
+ "soccer player": 52,
+ "cpu": 51,
+ "calculator": 51,
+ "garland": 51,
+ "skateboard ramp": 51,
+ "young man": 51,
+ "office chair": 50,
+ "beach umbrella": 50,
+ "sconce": 49,
+ "coke": 49,
+ "baked good": 49,
+ "village": 49,
+ "water tank": 49,
+ "snowman": 49,
+ "yogurt": 49,
+ "banana slice": 49,
+ "recliner": 48,
+ "little girl": 48,
+ "sweatpants": 48,
+ "racer": 48,
+ "blackberry": 48,
+ "banana peel": 48,
+ "gift": 47,
+ "helicopter": 47,
+ "wildflower": 47,
+ "sled": 47,
+ "hair dryer": 46,
+ "father": 46,
+ "pig": 46,
+ "tiger": 45,
+ "hotel room": 45,
+ "engineer": 45,
+ "peanut": 44,
+ "video camera": 44,
+ "bird cage": 44,
+ "pizza cutter": 44,
+ "honey": 44,
+ "tofu": 44,
+ "taxi cab": 43,
+ "artichoke": 43,
+ "medicine cabinet": 42,
+ "vending machine": 42,
+ "waste basket": 42,
+ "spear": 42,
+ "sweet potato": 42,
+ "iphone": 42,
+ "bottle cap": 42,
+ "toaster oven": 41,
+ "classroom": 41,
+ "computer desk": 41,
+ "router": 41,
+ "mountain side": 41,
+ "rabbit": 41,
+ "bug": 41,
+ "police car": 41,
+ "station wagon": 40,
+ "nest": 40,
+ "smartphone": 40,
+ "obstacle": 40,
+ "walnut": 40,
+ "athletic shoe": 38,
+ "crab": 38,
+ "lounge chair": 37,
+ "ambulance": 37,
+ "gadget": 37,
+ "grinder": 37,
+ "dirt bike": 37,
+ "hurdle": 37,
+ "whiteboard": 36,
+ "washing machine": 36,
+ "dish soap": 36,
+ "spray bottle": 36,
+ "aquarium": 36,
+ "hammer": 35,
+ "christmas light": 35,
+ "bath towel": 33,
+ "whisk": 31,
+ "ketchup bottle": 30,
+ "cub": 29,
+ "soda bottle": 28,
+ "soap bottle": 28,
+ "kitty": 27,
+ "cooking utensil": 26,
+ "serving tray": 25,
+ "swimming pool": 22,
+ "mixing bowl": 16
+ },
+ "attribute_count": {
+ "white": 311225,
+ "black": 198963,
+ "blue": 121164,
+ "green": 117792,
+ "red": 109934,
+ "brown": 95534,
+ "yellow": 62068,
+ "gray": 60190,
+ "small": 44843,
+ "large": 43857,
+ "wood": 41159,
+ "silver": 32077,
+ "metal": 31196,
+ "orange": 30394,
+ "tall": 23224,
+ "long": 21305,
+ "dark": 20622,
+ "pink": 19990,
+ "clear": 14137,
+ "standing": 13755,
+ "round": 12712,
+ "tan": 11974,
+ "purple": 10506,
+ "glass": 10498,
+ "open": 10146,
+ "big": 9614,
+ "short": 9336,
+ "plastic": 9178,
+ "parked": 8772,
+ "sitting": 8502,
+ "walking": 7619,
+ "striped": 7562,
+ "brick": 7024,
+ "young": 6984,
+ "gold": 6583,
+ "old": 5966,
+ "hanging": 5960,
+ "empty": 5898,
+ "on": 5502,
+ "bright": 4976,
+ "concrete": 4954,
+ "blond": 4788,
+ "cloudy": 4773,
+ "colorful": 4730,
+ "beige": 4469,
+ "bare": 4436,
+ "wet": 4377,
+ "light": 4313,
+ "square": 4280,
+ "little": 4170,
+ "closed": 4147,
+ "stone": 4142,
+ "shiny": 3899,
+ "thin": 3627,
+ "dirty": 3597,
+ "flying": 3424,
+ "smiling": 3415,
+ "painted": 3403,
+ "thick": 3398,
+ "sliced": 2973,
+ "playing": 2918,
+ "tennis": 2870,
+ "calm": 2833,
+ "leather": 2819,
+ "distant": 2781,
+ "rectangular": 2727,
+ "looking": 2714,
+ "grassy": 2670,
+ "dry": 2664,
+ "multi colored": 2601,
+ "light brown": 2582,
+ "cement": 2485,
+ "leafy": 2470,
+ "wearing": 2432,
+ "light blue": 2350,
+ "tiled": 2345,
+ "cooked": 2327,
+ "baseball": 2325,
+ "curved": 2252,
+ "decorative": 2221,
+ "dead": 2216,
+ "eating": 2145,
+ "paper": 2124,
+ "paved": 2123,
+ "fluffy": 2120,
+ "lit": 2094,
+ "back": 2089,
+ "framed": 2056,
+ "plaid": 2036,
+ "dirt": 2025,
+ "watching": 2005,
+ "stuffed": 1969,
+ "dark brown": 1960,
+ "circular": 1959,
+ "clean": 1956,
+ "steel": 1874,
+ "stacked": 1866,
+ "covered": 1834,
+ "full": 1814,
+ "flat": 1786,
+ "street": 1785,
+ "skiing": 1756,
+ "baby": 1751,
+ "black and white": 1708,
+ "dark blue": 1699,
+ "beautiful": 1682,
+ "laying": 1670,
+ "ceramic": 1665,
+ "grazing": 1641,
+ "golden": 1627,
+ "sandy": 1627,
+ "blurry": 1613,
+ "chocolate": 1590,
+ "wide": 1548,
+ "growing": 1541,
+ "chrome": 1529,
+ "cut": 1497,
+ "bent": 1484,
+ "train": 1483,
+ "holding": 1456,
+ "water": 1448,
+ "up": 1419,
+ "arched": 1409,
+ "chain link": 1400,
+ "metallic": 1398,
+ "snowy": 1384,
+ "spotted": 1381,
+ "folded": 1371,
+ "electrical": 1358,
+ "pointy": 1348,
+ "leafless": 1341,
+ "running": 1341,
+ "electric": 1334,
+ "rusty": 1326,
+ "ripe": 1319,
+ "furry": 1312,
+ "traffic": 1305,
+ "rocky": 1291,
+ "tiny": 1290,
+ "down": 1287,
+ "fresh": 1279,
+ "snow covered": 1276,
+ "floral": 1270,
+ "stainless steel": 1252,
+ "high": 1240,
+ "surfing": 1240,
+ "off": 1235,
+ "leaning": 1223,
+ "moving": 1212,
+ "huge": 1181,
+ "checkered": 1164,
+ "maroon": 1152,
+ "broken": 1149,
+ "iron": 1143,
+ "patterned": 1123,
+ "worn": 1123,
+ "ski": 1096,
+ "overcast": 1089,
+ "waiting": 1086,
+ "rubber": 1067,
+ "riding": 1065,
+ "long sleeved": 1048,
+ "skinny": 1044,
+ "grass": 1033,
+ "porcelain": 1029,
+ "adult": 1017,
+ "wire": 1013,
+ "cloudless": 1013,
+ "curly": 1007,
+ "cardboard": 984,
+ "jumping": 983,
+ "tile": 979,
+ "pointed": 976,
+ "double decker": 972,
+ "light colored": 957,
+ "male": 951,
+ "smooth": 937,
+ "hazy": 932,
+ "computer": 912,
+ "older": 906,
+ "pine": 906,
+ "raised": 901,
+ "bald": 894,
+ "reflective": 886,
+ "narrow": 885,
+ "skateboarding": 885,
+ "khaki": 876,
+ "extended": 872,
+ "roman": 872,
+ "american": 860,
+ "puffy": 854,
+ "shining": 850,
+ "lush": 838,
+ "driving": 832,
+ "overhead": 823,
+ "piled": 822,
+ "opened": 808,
+ "wine": 805,
+ "sleeping": 798,
+ "rusted": 795,
+ "outdoors": 787,
+ "evergreen": 780,
+ "airborne": 779,
+ "oval": 778,
+ "vertical": 766,
+ "low": 765,
+ "illuminated": 756,
+ "stop": 754,
+ "marble": 750,
+ "melted": 744,
+ "talking": 742,
+ "wrinkled": 742,
+ "reflecting": 740,
+ "grouped": 739,
+ "resting": 739,
+ "splashing": 738,
+ "dark colored": 737,
+ "palm": 730,
+ "hardwood": 721,
+ "sharp": 708,
+ "straight": 701,
+ "asian": 699,
+ "sunny": 698,
+ "wicker": 696,
+ "upside down": 694,
+ "dried": 691,
+ "ornate": 683,
+ "shirtless": 672,
+ "posing": 668,
+ "written": 667,
+ "female": 666,
+ "snow": 659,
+ "wavy": 658,
+ "chopped": 655,
+ "rock": 654,
+ "glazed": 653,
+ "glowing": 651,
+ "bushy": 651,
+ "slice": 648,
+ "fried": 647,
+ "above": 639,
+ "rough": 637,
+ "decorated": 628,
+ "nike": 628,
+ "hairy": 626,
+ "happy": 626,
+ "wild": 619,
+ "in air": 616,
+ "triangular": 614,
+ "bathroom": 610,
+ "toilet": 608,
+ "toy": 607,
+ "textile": 606,
+ "coffee": 603,
+ "fuzzy": 602,
+ "muddy": 602,
+ "curled": 597,
+ "neon": 594,
+ "short sleeved": 593,
+ "printed": 592,
+ "horizontal": 590,
+ "daytime": 586,
+ "digital": 582,
+ "asphalt": 577,
+ "parking": 571,
+ "crashing": 569,
+ "burgundy": 562,
+ "denim": 554,
+ "bunch": 550,
+ "displayed": 547,
+ "outdoor": 542,
+ "brass": 540,
+ "teal": 536,
+ "plain": 535,
+ "fire": 534,
+ "floating": 527,
+ "fake": 525,
+ "burnt": 525,
+ "delicious": 525,
+ "ocean": 524,
+ "clay": 523,
+ "reflected": 523,
+ "pointing": 519,
+ "faded": 514,
+ "rounded": 514,
+ "swinging": 514,
+ "number": 514,
+ "filled": 512,
+ "hard": 509,
+ "drinking": 508,
+ "kitchen": 507,
+ "antique": 504,
+ "potted": 503,
+ "lined": 502,
+ "pale": 497,
+ "choppy": 497,
+ "soft": 494,
+ "frosted": 494,
+ "alone": 492,
+ "toasted": 491,
+ "apple": 490,
+ "lying": 483,
+ "rolling": 478,
+ "aluminum": 478,
+ "attached": 476,
+ "tinted": 471,
+ "bright blue": 469,
+ "barefoot": 469,
+ "skating": 469,
+ "deep": 466,
+ "playing tennis": 466,
+ "clock": 464,
+ "healthy": 462,
+ "grilled": 456,
+ "rainbow colored": 453,
+ "power": 452,
+ "crossed": 451,
+ "electronic": 448,
+ "foamy": 447,
+ "swimming": 441,
+ "trimmed": 441,
+ "heavy": 441,
+ "fancy": 439,
+ "baked": 438,
+ "giant": 437,
+ "tied": 432,
+ "crouching": 430,
+ "modern": 424,
+ "athletic": 422,
+ "soccer": 416,
+ "murky": 415,
+ "bending": 409,
+ "mounted": 408,
+ "floppy": 408,
+ "pile": 407,
+ "cracked": 406,
+ "safety": 405,
+ "rolled": 404,
+ "pretty": 404,
+ "snowboarding": 403,
+ "sleeveless": 400,
+ "still": 400,
+ "granite": 399,
+ "wispy": 398,
+ "straw": 397,
+ "wrapped": 396,
+ "protective": 394,
+ "bricked": 392,
+ "cream colored": 387,
+ "outstretched": 383,
+ "busy": 382,
+ "flat screen": 382,
+ "slanted": 382,
+ "cheese": 382,
+ "patchy": 378,
+ "vintage": 377,
+ "used": 375,
+ "half": 373,
+ "messy": 370,
+ "docked": 367,
+ "navy": 367,
+ "stainless": 363,
+ "fat": 363,
+ "kneeling": 360,
+ "shallow": 354,
+ "transparent": 352,
+ "cooking": 350,
+ "old fashioned": 345,
+ "license": 344,
+ "fallen": 340,
+ "whole": 335,
+ "ivory": 333,
+ "shredded": 332,
+ "gravel": 330,
+ "landing": 329,
+ "wii": 324,
+ "rippled": 323,
+ "laptop": 322,
+ "backwards": 314,
+ "lime green": 313,
+ "staring": 312,
+ "cotton": 312,
+ "stained": 311,
+ "designed": 310,
+ "crouched": 310,
+ "for sale": 310,
+ "new": 309,
+ "lighted": 306,
+ "balding": 303,
+ "stack": 300,
+ "woven": 299,
+ "barren": 296,
+ "letter": 296,
+ "plush": 295,
+ "turned": 295,
+ "sparse": 291,
+ "dusty": 290,
+ "chinese": 289,
+ "mesh": 289,
+ "knit": 289,
+ "squatting": 288,
+ "carpeted": 286,
+ "winter": 280,
+ "door": 278,
+ "flowered": 277,
+ "waving": 275,
+ "looking down": 271,
+ "shaggy": 270,
+ "reading": 269,
+ "sticking out": 268,
+ "shaded": 266,
+ "military": 265,
+ "railroad": 265,
+ "home": 265,
+ "brunette": 263,
+ "sand": 263,
+ "raw": 262,
+ "golden brown": 261,
+ "crispy": 259,
+ "serving": 258,
+ "polar": 258,
+ "overgrown": 257,
+ "copper": 257,
+ "scattered": 254,
+ "dotted": 254,
+ "public": 253,
+ "elderly": 252,
+ "assorted": 252,
+ "wireless": 251,
+ "roll": 250,
+ "sliding": 249,
+ "speckled": 248,
+ "crumpled": 246,
+ "styrofoam": 243,
+ "foggy": 243,
+ "triangle": 242,
+ "warm": 241,
+ "elevated": 239,
+ "peeled": 238,
+ "caucasian": 235,
+ "telephone": 233,
+ "tilted": 233,
+ "sheer": 233,
+ "covering": 233,
+ "recessed": 232,
+ "tomato": 231,
+ "shaped": 229,
+ "bunched": 228,
+ "fruit": 225,
+ "textured": 224,
+ "loose": 223,
+ "made": 223,
+ "collared": 223,
+ "steep": 220,
+ "peeling": 219,
+ "batting": 218,
+ "statue": 216,
+ "unripe": 216,
+ "one way": 214,
+ "police": 214,
+ "padded": 211,
+ "reaching": 208,
+ "halved": 206,
+ "cast": 204,
+ "cluttered": 202,
+ "park": 202,
+ "indoors": 201,
+ "chipped": 199,
+ "dress": 197,
+ "manicured": 193,
+ "christmas": 192,
+ "polka dot": 192,
+ "racing": 190,
+ "octagonal": 189,
+ "soda": 187,
+ "blowing": 187,
+ "chalk": 185,
+ "laughing": 183,
+ "spread": 182,
+ "stripes": 182,
+ "windshield": 182,
+ "burned": 177,
+ "seasoned": 177,
+ "cargo": 176,
+ "birthday": 176,
+ "salt": 175,
+ "herd": 175,
+ "spiky": 173,
+ "powdered": 173,
+ "half full": 172,
+ "side view": 172,
+ "numbered": 172,
+ "taking off": 171,
+ "perched": 169,
+ "soap": 165,
+ "camouflage": 164,
+ "fluorescent": 163,
+ "massive": 162,
+ "performing": 159,
+ "deep blue": 158,
+ "throwing": 158,
+ "wrist": 156,
+ "steamed": 156,
+ "cake": 155,
+ "shaved": 152,
+ "night": 149,
+ "blank": 148,
+ "mountain": 148,
+ "flowing": 147,
+ "neon green": 145,
+ "greenish": 144,
+ "hitting": 143,
+ "bending over": 137,
+ "skate": 135,
+ "browned": 133,
+ "pulled back": 129,
+ "tarmacked": 118,
+ "muscular": 115,
+ "toilet paper": 112,
+ "hilly": 110,
+ "brake": 109,
+ "unmade": 100,
+ "singing": 31,
+ "crying": 7
+ },
+ "predicate_count": {
+ "on": 712409,
+ "has": 277936,
+ "in": 251756,
+ "of": 146339,
+ "wearing": 136099,
+ "near": 96589,
+ "with": 66425,
+ "above": 47341,
+ "holding": 42722,
+ "behind": 41356,
+ "under": 22596,
+ "sitting on": 18643,
+ "wears": 15457,
+ "standing on": 14185,
+ "in front of": 13715,
+ "attached to": 10190,
+ "at": 9903,
+ "hanging from": 9894,
+ "over": 9317,
+ "for": 9145,
+ "riding": 8856,
+ "carrying": 5213,
+ "eating": 4688,
+ "walking on": 4613,
+ "playing": 3810,
+ "covering": 3806,
+ "laying on": 3739,
+ "along": 3624,
+ "watching": 3490,
+ "and": 3477,
+ "between": 3411,
+ "belonging to": 3288,
+ "painted on": 3095,
+ "against": 3092,
+ "looking at": 3083,
+ "from": 2945,
+ "parked on": 2721,
+ "to": 2517,
+ "made of": 2380,
+ "covered in": 2312,
+ "mounted on": 2253,
+ "says": 2241,
+ "part of": 2065,
+ "across": 1996,
+ "flying in": 1973,
+ "using": 1925,
+ "on back of": 1914,
+ "lying on": 1869,
+ "growing on": 1853,
+ "walking in": 1740
+ }
+}
diff --git a/src/emma_perception/constants/vinvl_x152c4_forced_boxes.yaml b/src/emma_perception/constants/vinvl_x152c4_forced_boxes.yaml
new file mode 100644
index 0000000..2e631fe
--- /dev/null
+++ b/src/emma_perception/constants/vinvl_x152c4_forced_boxes.yaml
@@ -0,0 +1,60 @@
+MODEL:
+ META_ARCHITECTURE: "AttrRCNN"
+ WEIGHT: "./storage/model/original_vinvl_model.pth"
+ BACKBONE:
+ CONV_BODY: "R-152-C4"
+ RESNETS:
+ BACKBONE_OUT_CHANNELS: 1024
+ STRIDE_IN_1X1: False
+ NUM_GROUPS: 32
+ WIDTH_PER_GROUP: 8
+ RPN:
+ PRE_NMS_TOP_N_TEST: 6000
+ POST_NMS_TOP_N_TEST: 300
+ FORCE_BOXES: True
+ ROI_HEADS:
+ BATCH_SIZE_PER_IMAGE: 384 # 512
+ POSITIVE_FRACTION: 0.25
+ SCORE_THRESH: 0.0001
+ DETECTIONS_PER_IMG: 36 # 600
+ MIN_DETECTIONS_PER_IMG: 1
+ NMS_FILTER: 1
+ ROI_BOX_HEAD:
+ NUM_CLASSES: 1595
+ FORCE_BOXES: True
+ ROI_ATTRIBUTE_HEAD:
+ NUM_ATTRIBUTES: 525
+ POSTPROCESS_ATTRIBUTES_THRESHOLD: 0.05
+ ATTRIBUTE_ON: True
+INPUT:
+ MIN_SIZE_TEST: 600
+ MAX_SIZE_TEST: 1000
+ PIXEL_MEAN: [103.530, 116.280, 123.675]
+DATASETS:
+ # FACTORY_TEST: ("ODTSVDataset",)
+ TEST: ("coco_2014_train",)
+ LABELMAP_FILE: "./src/emma_perception/constants/vinvl_x152c4_classmap.json"
+ TRAIN: ("visualgenome/train_vgoi6_clipped.yaml",)
+ # TEST: ("visualgenome/test_vgoi6_clipped.yaml",)
+ FACTORY_TRAIN: ("VGTSVDataset",)
+ FACTORY_TEST: ("COCODataset",)
+DATALOADER:
+ NUM_WORKERS: 0
+SOLVER:
+ BASE_LR: 0.01
+ WEIGHT_DECAY: 0.0001
+ MAX_ITER: 90000
+ STEPS: (49000, 65000)
+ IMS_PER_BATCH: 1
+ CHECKPOINT_PERIOD: 10000
+TEST:
+ IMS_PER_BATCH: 1
+ SKIP_PERFORMANCE_EVAL: True
+ SAVE_PREDICTIONS: True
+ SAVE_RESULTS_TO_TSV: False
+ TSV_SAVE_SUBSET: ["rect", "class", "conf", "feature"]
+ OUTPUT_FEATURE: True
+ GATHER_ON_CPU: True
+OUTPUT_DIR: "./output/X152C5_test"
+DATA_DIR: "./datasets"
+DISTRIBUTED_BACKEND: "gloo"
diff --git a/src/emma_perception/constants/vinvl_x152c4_simbot.yaml b/src/emma_perception/constants/vinvl_x152c4_simbot.yaml
new file mode 100644
index 0000000..7ef8860
--- /dev/null
+++ b/src/emma_perception/constants/vinvl_x152c4_simbot.yaml
@@ -0,0 +1,55 @@
+MODEL:
+ META_ARCHITECTURE: "AttrRCNN"
+ WEIGHT: "pre-trained/model_0220000.pth"
+ BACKBONE:
+ CONV_BODY: "R-152-C4"
+ RESNETS:
+ BACKBONE_OUT_CHANNELS: 1024
+ STRIDE_IN_1X1: False
+ NUM_GROUPS: 32
+ WIDTH_PER_GROUP: 8
+ RPN:
+ PRE_NMS_TOP_N_TEST: 6000
+ POST_NMS_TOP_N_TEST: 300
+ ROI_HEADS:
+ BATCH_SIZE_PER_IMAGE: 384 # 512
+ POSITIVE_FRACTION: 0.5 # 0.25
+ SCORE_THRESH: 0.1# 0.0001
+ DETECTIONS_PER_IMG: 36 # 600
+ MIN_DETECTIONS_PER_IMG: 1
+ ROI_BOX_HEAD:
+ NUM_CLASSES: 136
+ ATTRIBUTE_ON: False
+ RELATION_ON: False
+INPUT:
+ MIN_SIZE_TEST: 800
+ MAX_SIZE_TEST: 1333
+ PIXEL_MEAN: [103.530, 116.280, 123.675]
+DATASETS:
+ # FACTORY_TEST: ("ODTSVDataset",)
+ # TEST: ("flickr30k/tsv/flickr30k.yaml",)
+ TRAIN: ("train/train.yaml",)
+ TEST: ("validation/valid.yaml",)
+ FACTORY_TRAIN: ("VGTSVDataset",)
+ FACTORY_TEST: ("VGTSVDataset",)
+DATALOADER:
+ NUM_WORKERS: 0
+SOLVER:
+ BASE_LR: 0.0001
+ WEIGHT_DECAY: 0.00001
+ MAX_ITER: 312000
+ STEPS: (55000, 75000)
+ IMS_PER_BATCH: 4
+ CHECKPOINT_PERIOD: 10000
+ TEST_PERIOD: 20000000
+TEST:
+ IMS_PER_BATCH: 4
+ SKIP_PERFORMANCE_EVAL: False
+ SAVE_PREDICTIONS: True
+ SAVE_RESULTS_TO_TSV: True
+ TSV_SAVE_SUBSET: ["rect", "class", "conf", "feature"]
+ GATHER_ON_CPU: False
+ OUTPUT_FEATURE: True
+OUTPUT_DIR: "./output/TL_X152C4_800-1333_lr1e-4_st1e-1_dpi36_bspi384_v7"
+DATA_DIR: "datasets/teach/"
+DISTRIBUTED_BACKEND: "gloo"
diff --git a/src/emma_perception/constants/vinvl_x152c4_simbot_classmap.json b/src/emma_perception/constants/vinvl_x152c4_simbot_classmap.json
new file mode 100644
index 0000000..1106fb9
--- /dev/null
+++ b/src/emma_perception/constants/vinvl_x152c4_simbot_classmap.json
@@ -0,0 +1,278 @@
+{
+ "label_to_idx": {
+ "Background": 0,
+ "Action Figure": 1,
+ "Apple": 2,
+ "Banana": 3,
+ "Battery": 4,
+ "Blinds": 5,
+ "Board": 6,
+ "Books": 7,
+ "Bowl": 8,
+ "Boxes": 9,
+ "Bread Slice": 10,
+ "Button": 11,
+ "Cabinet": 12,
+ "Cable": 13,
+ "Cake": 14,
+ "Calendar": 15,
+ "Can": 16,
+ "Candy Bar": 17,
+ "Cardboard Box": 18,
+ "Carrot": 19,
+ "Cart": 20,
+ "Cereal Box": 21,
+ "Certificate": 22,
+ "Chair": 23,
+ "Circuit Board": 24,
+ "Clamp": 25,
+ "Clipboard": 26,
+ "Clock": 27,
+ "Coffee Beans": 28,
+ "Coffee Maker": 29,
+ "Coffee Pot": 30,
+ "Coffee Unmaker": 31,
+ "Color Changer": 32,
+ "Computer": 33,
+ "Control Panel": 34,
+ "Cooler": 35,
+ "Couch": 36,
+ "Counter": 37,
+ "Crates": 38,
+ "Cutting Board": 39,
+ "Dart": 40,
+ "Dart Board": 41,
+ "Desk": 42,
+ "Dolly": 43,
+ "Donut": 44,
+ "Door": 45,
+ "Drawer": 46,
+ "Drill Chuck": 47,
+ "Embiggenator": 48,
+ "Everything's A Carrot Machine": 49,
+ "Fan": 50,
+ "Fire Alarm": 51,
+ "Fire Extinguisher": 52,
+ "Floppy Disk": 53,
+ "Folder": 54,
+ "Folder Holder": 55,
+ "Fork": 56,
+ "Forklift": 57,
+ "Freeze Ray": 58,
+ "Freezer": 59,
+ "Fridge": 60,
+ "Fuse Box": 61,
+ "Generator": 62,
+ "Golf Ball": 63,
+ "Golf Club": 64,
+ "Gravity Pad": 65,
+ "Hammer": 66,
+ "Handsaw": 67,
+ "Jar": 68,
+ "Jelly": 69,
+ "Keyboard": 70,
+ "Knife": 71,
+ "Laser": 72,
+ "Laser Tip": 73,
+ "Laser Toy": 74,
+ "Lever": 75,
+ "Lid": 76,
+ "Light": 77,
+ "Light Bulb": 78,
+ "Light Switch": 79,
+ "Machine Panel": 80,
+ "Map": 81,
+ "Microwave": 82,
+ "Milk": 83,
+ "Mug": 84,
+ "Notepad": 85,
+ "Outlet": 86,
+ "Pallets": 87,
+ "Paper": 88,
+ "Paper Tray": 89,
+ "Peanut Butter": 90,
+ "Pear": 91,
+ "Pen": 92,
+ "Photocopier": 93,
+ "Pie": 94,
+ "Plant": 95,
+ "Plate": 96,
+ "Poster": 97,
+ "Power Boxes": 98,
+ "Print Tube": 99,
+ "Printer": 100,
+ "Printer Cartridge": 101,
+ "Puddle": 102,
+ "Radio": 103,
+ "Record": 104,
+ "Robot Arm": 105,
+ "Sandwich": 106,
+ "Scale": 107,
+ "Screw Driver": 108,
+ "Server": 109,
+ "Shelf": 110,
+ "Sign": 111,
+ "Sink": 112,
+ "Spoon": 113,
+ "Sticky Note": 114,
+ "Stool": 115,
+ "TAM Prototype": 116,
+ "Table": 117,
+ "Tank": 118,
+ "Tape": 119,
+ "Target": 120,
+ "Tesla Coil": 121,
+ "Time Machine": 122,
+ "Toast": 123,
+ "Toaster": 124,
+ "Tool Board": 125,
+ "Tool Box": 126,
+ "Trash": 127,
+ "Trash Can": 128,
+ "Tray": 129,
+ "Trophy": 130,
+ "Vending Machine": 131,
+ "Vent": 132,
+ "Water Barrel": 133,
+ "Water Tank": 134,
+ "Wire Coil": 135
+ },
+ "idx_to_label": {
+ "0": "Background",
+ "1": "Action Figure",
+ "2": "Apple",
+ "3": "Banana",
+ "4": "Battery",
+ "5": "Blinds",
+ "6": "Board",
+ "7": "Books",
+ "8": "Bowl",
+ "9": "Boxes",
+ "10": "Bread Slice",
+ "11": "Button",
+ "12": "Cabinet",
+ "13": "Cable",
+ "14": "Cake",
+ "15": "Calendar",
+ "16": "Can",
+ "17": "Candy Bar",
+ "18": "Cardboard Box",
+ "19": "Carrot",
+ "20": "Cart",
+ "21": "Cereal Box",
+ "22": "Certificate",
+ "23": "Chair",
+ "24": "Circuit Board",
+ "25": "Clamp",
+ "26": "Clipboard",
+ "27": "Clock",
+ "28": "Coffee Beans",
+ "29": "Coffee Maker",
+ "30": "Coffee Pot",
+ "31": "Coffee Unmaker",
+ "32": "Color Changer",
+ "33": "Computer",
+ "34": "Control Panel",
+ "35": "Cooler",
+ "36": "Couch",
+ "37": "Counter",
+ "38": "Crates",
+ "39": "Cutting Board",
+ "40": "Dart",
+ "41": "Dart Board",
+ "42": "Desk",
+ "43": "Dolly",
+ "44": "Donut",
+ "45": "Door",
+ "46": "Drawer",
+ "47": "Drill Chuck",
+ "48": "Embiggenator",
+ "49": "Everything's A Carrot Machine",
+ "50": "Fan",
+ "51": "Fire Alarm",
+ "52": "Fire Extinguisher",
+ "53": "Floppy Disk",
+ "54": "Folder",
+ "55": "Folder Holder",
+ "56": "Fork",
+ "57": "Forklift",
+ "58": "Freeze Ray",
+ "59": "Freezer",
+ "60": "Fridge",
+ "61": "Fuse Box",
+ "62": "Generator",
+ "63": "Golf Ball",
+ "64": "Golf Club",
+ "65": "Gravity Pad",
+ "66": "Hammer",
+ "67": "Handsaw",
+ "68": "Jar",
+ "69": "Jelly",
+ "70": "Keyboard",
+ "71": "Knife",
+ "72": "Laser",
+ "73": "Laser Tip",
+ "74": "Laser Toy",
+ "75": "Lever",
+ "76": "Lid",
+ "77": "Light",
+ "78": "Light Bulb",
+ "79": "Light Switch",
+ "80": "Machine Panel",
+ "81": "Map",
+ "82": "Microwave",
+ "83": "Milk",
+ "84": "Mug",
+ "85": "Notepad",
+ "86": "Outlet",
+ "87": "Pallets",
+ "88": "Paper",
+ "89": "Paper Tray",
+ "90": "Peanut Butter",
+ "91": "Pear",
+ "92": "Pen",
+ "93": "Photocopier",
+ "94": "Pie",
+ "95": "Plant",
+ "96": "Plate",
+ "97": "Poster",
+ "98": "Power Boxes",
+ "99": "Print Tube",
+ "100": "Printer",
+ "101": "Printer Cartridge",
+ "102": "Puddle",
+ "103": "Radio",
+ "104": "Record",
+ "105": "Robot Arm",
+ "106": "Sandwich",
+ "107": "Scale",
+ "108": "Screw Driver",
+ "109": "Server",
+ "110": "Shelf",
+ "111": "Sign",
+ "112": "Sink",
+ "113": "Spoon",
+ "114": "Sticky Note",
+ "115": "Stool",
+ "116": "TAM Prototype",
+ "117": "Table",
+ "118": "Tank",
+ "119": "Tape",
+ "120": "Target",
+ "121": "Tesla Coil",
+ "122": "Time Machine",
+ "123": "Toast",
+ "124": "Toaster",
+ "125": "Tool Board",
+ "126": "Tool Box",
+ "127": "Trash",
+ "128": "Trash Can",
+ "129": "Tray",
+ "130": "Trophy",
+ "131": "Vending Machine",
+ "132": "Vent",
+ "133": "Water Barrel",
+ "134": "Water Tank",
+ "135": "Wire Coil"
+ }
+}
diff --git a/src/emma_perception/constants/vinvl_x152c4_simbot_classmap_v124.json b/src/emma_perception/constants/vinvl_x152c4_simbot_classmap_v124.json
new file mode 100644
index 0000000..4e6c706
--- /dev/null
+++ b/src/emma_perception/constants/vinvl_x152c4_simbot_classmap_v124.json
@@ -0,0 +1,274 @@
+{
+ "label_to_idx": {
+ "Background": 0,
+ "Action Figure": 1,
+ "Apple": 2,
+ "Banana": 3,
+ "Battery": 4,
+ "Blinds": 5,
+ "Board": 6,
+ "Books": 7,
+ "Bowl": 8,
+ "Boxes": 9,
+ "Bread Slice": 10,
+ "Button": 11,
+ "Cabinet": 12,
+ "Cable": 13,
+ "Cake": 14,
+ "Calendar": 15,
+ "Can": 16,
+ "Candy Bar": 17,
+ "Cardboard Box": 18,
+ "Carrot": 19,
+ "Cart": 20,
+ "Cereal Box": 21,
+ "Chair": 22,
+ "Circuit Board": 23,
+ "Clamp": 24,
+ "Clipboard": 25,
+ "Clock": 26,
+ "Coffee Beans": 27,
+ "Coffee Maker": 28,
+ "Coffee Pot": 29,
+ "Coffee Unmaker": 30,
+ "Color Changer": 31,
+ "Computer": 32,
+ "Control Panel": 33,
+ "Cooler": 34,
+ "Couch": 35,
+ "Counter": 36,
+ "Crates": 37,
+ "Cutting Board": 38,
+ "Dart": 39,
+ "Dart Board": 40,
+ "Desk": 41,
+ "Dolly": 42,
+ "Donut": 43,
+ "Door": 44,
+ "Drawer": 45,
+ "Drill Chuck": 46,
+ "Embiggenator": 47,
+ "Everything's A Carrot Machine": 48,
+ "Fan": 49,
+ "Fire Alarm": 50,
+ "Fire Extinguisher": 51,
+ "Floppy Disk": 52,
+ "Folder": 53,
+ "Folder Holder": 54,
+ "Fork": 55,
+ "Forklift": 56,
+ "Freeze Ray": 57,
+ "Freezer": 58,
+ "Fridge": 59,
+ "Fuse Box": 60,
+ "Generator": 61,
+ "Golf Ball": 62,
+ "Golf Club": 63,
+ "Gravity Pad": 64,
+ "Hammer": 65,
+ "Handsaw": 66,
+ "Jar": 67,
+ "Jelly": 68,
+ "Keyboard": 69,
+ "Knife": 70,
+ "Laser": 71,
+ "Laser Tip": 72,
+ "Laser Toy": 73,
+ "Lever": 74,
+ "Lid": 75,
+ "Light": 76,
+ "Light Bulb": 77,
+ "Light Switch": 78,
+ "Machine Panel": 79,
+ "Map": 80,
+ "Microwave": 81,
+ "Milk": 82,
+ "Mug": 83,
+ "Notepad": 84,
+ "Outlet": 85,
+ "Pallets": 86,
+ "Paper": 87,
+ "Peanut Butter": 88,
+ "Pear": 89,
+ "Pen": 90,
+ "Photocopier": 91,
+ "Pie": 92,
+ "Plant": 93,
+ "Plate": 94,
+ "Poster": 95,
+ "Power Boxes": 96,
+ "Print Tube": 97,
+ "Printer": 98,
+ "Printer Cartridge": 99,
+ "Puddle": 100,
+ "Radio": 101,
+ "Record": 102,
+ "Robot Arm": 103,
+ "Sandwich": 104,
+ "Scale": 105,
+ "Screw Driver": 106,
+ "Shelf": 107,
+ "Sign": 108,
+ "Sink": 109,
+ "Spoon": 110,
+ "Sticky Note": 111,
+ "Stool": 112,
+ "TAM Prototype": 113,
+ "Table": 114,
+ "Tank": 115,
+ "Tape": 116,
+ "Target": 117,
+ "Tesla Coil": 118,
+ "Time Machine": 119,
+ "Toast": 120,
+ "Toaster": 121,
+ "Tool Board": 122,
+ "Tool Box": 123,
+ "Trash": 124,
+ "Trash Can": 125,
+ "Tray": 126,
+ "Trophy": 127,
+ "Vending Machine": 128,
+ "Vent": 129,
+ "Water Barrel": 130,
+ "Water Tank": 131,
+ "Wire Coil": 132,
+ "Unassigned": 133
+ },
+ "idx_to_label": {
+ "0": "Background",
+ "1": "Action Figure",
+ "2": "Apple",
+ "3": "Banana",
+ "4": "Battery",
+ "5": "Blinds",
+ "6": "Board",
+ "7": "Books",
+ "8": "Bowl",
+ "9": "Boxes",
+ "10": "Bread Slice",
+ "11": "Button",
+ "12": "Cabinet",
+ "13": "Cable",
+ "14": "Cake",
+ "15": "Calendar",
+ "16": "Can",
+ "17": "Candy Bar",
+ "18": "Cardboard Box",
+ "19": "Carrot",
+ "20": "Cart",
+ "21": "Cereal Box",
+ "22": "Chair",
+ "23": "Circuit Board",
+ "24": "Clamp",
+ "25": "Clipboard",
+ "26": "Clock",
+ "27": "Coffee Beans",
+ "28": "Coffee Maker",
+ "29": "Coffee Pot",
+ "30": "Coffee Unmaker",
+ "31": "Color Changer",
+ "32": "Computer",
+ "33": "Control Panel",
+ "34": "Cooler",
+ "35": "Couch",
+ "36": "Counter",
+ "37": "Crates",
+ "38": "Cutting Board",
+ "39": "Dart",
+ "40": "Dart Board",
+ "41": "Desk",
+ "42": "Dolly",
+ "43": "Donut",
+ "44": "Door",
+ "45": "Drawer",
+ "46": "Drill Chuck",
+ "47": "Embiggenator",
+ "48": "Everything's A Carrot Machine",
+ "49": "Fan",
+ "50": "Fire Alarm",
+ "51": "Fire Extinguisher",
+ "52": "Floppy Disk",
+ "53": "Folder",
+ "54": "Folder Holder",
+ "55": "Fork",
+ "56": "Forklift",
+ "57": "Freeze Ray",
+ "58": "Freezer",
+ "59": "Fridge",
+ "60": "Fuse Box",
+ "61": "Generator",
+ "62": "Golf Ball",
+ "63": "Golf Club",
+ "64": "Gravity Pad",
+ "65": "Hammer",
+ "66": "Handsaw",
+ "67": "Jar",
+ "68": "Jelly",
+ "69": "Keyboard",
+ "70": "Knife",
+ "71": "Laser",
+ "72": "Laser Tip",
+ "73": "Laser Toy",
+ "74": "Lever",
+ "75": "Lid",
+ "76": "Light",
+ "77": "Light Bulb",
+ "78": "Light Switch",
+ "79": "Machine Panel",
+ "80": "Map",
+ "81": "Microwave",
+ "82": "Milk",
+ "83": "Mug",
+ "84": "Notepad",
+ "85": "Outlet",
+ "86": "Pallets",
+ "87": "Paper",
+ "88": "Peanut Butter",
+ "89": "Pear",
+ "90": "Pen",
+ "91": "Photocopier",
+ "92": "Pie",
+ "93": "Plant",
+ "94": "Plate",
+ "95": "Poster",
+ "96": "Power Boxes",
+ "97": "Print Tube",
+ "98": "Printer",
+ "99": "Printer Cartridge",
+ "100": "Puddle",
+ "101": "Radio",
+ "102": "Record",
+ "103": "Robot Arm",
+ "104": "Sandwich",
+ "105": "Scale",
+ "106": "Screw Driver",
+ "107": "Shelf",
+ "108": "Sign",
+ "109": "Sink",
+ "110": "Spoon",
+ "111": "Sticky Note",
+ "112": "Stool",
+ "113": "TAM Prototype",
+ "114": "Table",
+ "115": "Tank",
+ "116": "Tape",
+ "117": "Target",
+ "118": "Tesla Coil",
+ "119": "Time Machine",
+ "120": "Toast",
+ "121": "Toaster",
+ "122": "Tool Board",
+ "123": "Tool Box",
+ "124": "Trash",
+ "125": "Trash Can",
+ "126": "Tray",
+ "127": "Trophy",
+ "128": "Vending Machine",
+ "129": "Vent",
+ "130": "Water Barrel",
+ "131": "Water Tank",
+ "132": "Wire Coil",
+ "133": "Unassigned"
+ }
+}
diff --git a/src/emma_perception/constants/vinvl_x152c4_simbot_classmap_v124_customised.json b/src/emma_perception/constants/vinvl_x152c4_simbot_classmap_v124_customised.json
new file mode 100644
index 0000000..72c177e
--- /dev/null
+++ b/src/emma_perception/constants/vinvl_x152c4_simbot_classmap_v124_customised.json
@@ -0,0 +1,272 @@
+{
+ "label_to_idx": {
+ "Background": 0,
+ "Action Figure": 1,
+ "Apple": 2,
+ "Banana": 3,
+ "Battery": 4,
+ "Bed Toy": 5,
+ "Blinds": 6,
+ "Board": 7,
+ "Books": 8,
+ "Bowl": 9,
+ "Boxes": 10,
+ "Bread": 11,
+ "Burger": 12,
+ "Button": 13,
+ "Cabinet": 14,
+ "Cable": 15,
+ "Cake": 16,
+ "Calendar": 17,
+ "Can": 18,
+ "Candy Bar": 19,
+ "Carrot": 20,
+ "Cart": 21,
+ "Cereal Box": 22,
+ "Chair": 23,
+ "Circuit Board": 24,
+ "Clamp": 25,
+ "Clipboard": 26,
+ "Clock": 27,
+ "Coffee Beans": 28,
+ "Coffee Maker": 29,
+ "Coffee Pot": 30,
+ "Coffee Unmaker": 31,
+ "Color Changer": 32,
+ "Computer": 33,
+ "Control Panel": 34,
+ "Cooler": 35,
+ "Couch": 36,
+ "Counter": 37,
+ "Counter Top": 38,
+ "Crate": 39,
+ "Cup": 40,
+ "Cutting Board": 41,
+ "Dart": 42,
+ "Dart Board": 43,
+ "Donut": 44,
+ "Door": 45,
+ "Door Sign": 46,
+ "Drawer": 47,
+ "Drill Chuck": 48,
+ "Embiggenator": 49,
+ "Everything's A Carrot Machine": 50,
+ "Fan": 51,
+ "Fire Alarm": 52,
+ "Fire Extinguisher": 53,
+ "Floppy Disk": 54,
+ "Folder": 55,
+ "Folder Holder": 56,
+ "Fork": 57,
+ "Forklift": 58,
+ "Freeze Ray": 59,
+ "Freezer": 60,
+ "Fridge": 61,
+ "Fuse Box": 62,
+ "Generator": 63,
+ "Golf Ball": 64,
+ "Golf Club": 65,
+ "Gravity Pad": 66,
+ "Hammer": 67,
+ "Handsaw": 68,
+ "Jar": 69,
+ "Keyboard": 70,
+ "Knife": 71,
+ "Laser": 72,
+ "Laser Tip": 73,
+ "Laser Toy": 74,
+ "Lever": 75,
+ "Lid": 76,
+ "Light": 77,
+ "Light Bulb": 78,
+ "Light Switch": 79,
+ "Machine Panel": 80,
+ "Map": 81,
+ "Microwave": 82,
+ "Milk": 83,
+ "Mug": 84,
+ "Notepad": 85,
+ "Oxygen Tank": 86,
+ "Pallets": 87,
+ "Paper": 88,
+ "Pear": 89,
+ "Pen": 90,
+ "Photocopier": 91,
+ "Pie": 92,
+ "Plant": 93,
+ "Plate": 94,
+ "Poster": 95,
+ "Power Boxes": 96,
+ "Print Tube": 97,
+ "Printer": 98,
+ "Printer Cartridge": 99,
+ "Puddle": 100,
+ "Radio": 101,
+ "Record": 102,
+ "Robot Arm": 103,
+ "Sandwich": 104,
+ "Scale": 105,
+ "Screwdriver": 106,
+ "Server": 107,
+ "Shelf": 108,
+ "Sink": 109,
+ "Spoon": 110,
+ "Sticky Note": 111,
+ "Stool": 112,
+ "Table": 113,
+ "Tank": 114,
+ "Tape": 115,
+ "Target": 116,
+ "Tesla Coil": 117,
+ "Time Machine": 118,
+ "Toaster": 119,
+ "Tool Board": 120,
+ "Toolbox": 121,
+ "Trash Can": 122,
+ "Tray": 123,
+ "Trolley": 124,
+ "Trophy": 125,
+ "Vending Machine": 126,
+ "Vent": 127,
+ "Wall Shelf": 128,
+ "Warning Sign": 129,
+ "Water Barrel": 130,
+ "Whiteboard": 131,
+ "Unassigned": 132
+ },
+ "idx_to_label": {
+ "0": "Background",
+ "1": "Action Figure",
+ "2": "Apple",
+ "3": "Banana",
+ "4": "Battery",
+ "5": "Bed Toy",
+ "6": "Blinds",
+ "7": "Board",
+ "8": "Books",
+ "9": "Bowl",
+ "10": "Boxes",
+ "11": "Bread",
+ "12": "Burger",
+ "13": "Button",
+ "14": "Cabinet",
+ "15": "Cable",
+ "16": "Cake",
+ "17": "Calendar",
+ "18": "Can",
+ "19": "Candy Bar",
+ "20": "Carrot",
+ "21": "Cart",
+ "22": "Cereal Box",
+ "23": "Chair",
+ "24": "Circuit Board",
+ "25": "Clamp",
+ "26": "Clipboard",
+ "27": "Clock",
+ "28": "Coffee Beans",
+ "29": "Coffee Maker",
+ "30": "Coffee Pot",
+ "31": "Coffee Unmaker",
+ "32": "Color Changer",
+ "33": "Computer",
+ "34": "Control Panel",
+ "35": "Cooler",
+ "36": "Couch",
+ "37": "Counter",
+ "38": "Counter Top",
+ "39": "Crate",
+ "40": "Cup",
+ "41": "Cutting Board",
+ "42": "Dart",
+ "43": "Dart Board",
+ "44": "Donut",
+ "45": "Door",
+ "46": "Door Sign",
+ "47": "Drawer",
+ "48": "Drill Chuck",
+ "49": "Embiggenator",
+ "50": "Everything's A Carrot Machine",
+ "51": "Fan",
+ "52": "Fire Alarm",
+ "53": "Fire Extinguisher",
+ "54": "Floppy Disk",
+ "55": "Folder",
+ "56": "Folder Holder",
+ "57": "Fork",
+ "58": "Forklift",
+ "59": "Freeze Ray",
+ "60": "Freezer",
+ "61": "Fridge",
+ "62": "Fuse Box",
+ "63": "Generator",
+ "64": "Golf Ball",
+ "65": "Golf Club",
+ "66": "Gravity Pad",
+ "67": "Hammer",
+ "68": "Handsaw",
+ "69": "Jar",
+ "70": "Keyboard",
+ "71": "Knife",
+ "72": "Laser",
+ "73": "Laser Tip",
+ "74": "Laser Toy",
+ "75": "Lever",
+ "76": "Lid",
+ "77": "Light",
+ "78": "Light Bulb",
+ "79": "Light Switch",
+ "80": "Machine Panel",
+ "81": "Map",
+ "82": "Microwave",
+ "83": "Milk",
+ "84": "Mug",
+ "85": "Notepad",
+ "86": "Oxygen Tank",
+ "87": "Pallets",
+ "88": "Paper",
+ "89": "Pear",
+ "90": "Pen",
+ "91": "Photocopier",
+ "92": "Pie",
+ "93": "Plant",
+ "94": "Plate",
+ "95": "Poster",
+ "96": "Power Boxes",
+ "97": "Print Tube",
+ "98": "Printer",
+ "99": "Printer Cartridge",
+ "100": "Puddle",
+ "101": "Radio",
+ "102": "Record",
+ "103": "Robot Arm",
+ "104": "Sandwich",
+ "105": "Scale",
+ "106": "Screwdriver",
+ "107": "Server",
+ "108": "Shelf",
+ "109": "Sink",
+ "110": "Spoon",
+ "111": "Sticky Note",
+ "112": "Stool",
+ "113": "Table",
+ "114": "Tank",
+ "115": "Tape",
+ "116": "Target",
+ "117": "Tesla Coil",
+ "118": "Time Machine",
+ "119": "Toaster",
+ "120": "Tool Board",
+ "121": "Toolbox",
+ "122": "Trash Can",
+ "123": "Tray",
+ "124": "Trolley",
+ "125": "Trophy",
+ "126": "Vending Machine",
+ "127": "Vent",
+ "128": "Wall Shelf",
+ "129": "Warning Sign",
+ "130": "Water Barrel",
+ "131": "Whiteboard",
+ "132": "Unassigned"
+ }
+}
diff --git a/src/emma_perception/constants/vinvl_x152c4_simbot_customised.yaml b/src/emma_perception/constants/vinvl_x152c4_simbot_customised.yaml
new file mode 100644
index 0000000..a4b20ff
--- /dev/null
+++ b/src/emma_perception/constants/vinvl_x152c4_simbot_customised.yaml
@@ -0,0 +1,55 @@
+MODEL:
+ META_ARCHITECTURE: "AttrRCNN"
+ WEIGHT: "pre-trained/vinvl_vg_x152c4.pth"
+ BACKBONE:
+ CONV_BODY: "R-152-C4"
+ RESNETS:
+ BACKBONE_OUT_CHANNELS: 1024
+ STRIDE_IN_1X1: False
+ NUM_GROUPS: 32
+ WIDTH_PER_GROUP: 8
+ RPN:
+ PRE_NMS_TOP_N_TEST: 6000
+ POST_NMS_TOP_N_TEST: 300
+ ROI_HEADS:
+ BATCH_SIZE_PER_IMAGE: 384 # 512
+ POSITIVE_FRACTION: 0.5 # 0.25
+ SCORE_THRESH: 0.2 # 0.0001
+ DETECTIONS_PER_IMG: 36 # 600
+ MIN_DETECTIONS_PER_IMG: 1
+ NMS_FILTER: "1"
+ ROI_BOX_HEAD:
+ NUM_CLASSES: 133
+ ATTRIBUTE_ON: False
+ RELATION_ON: False
+INPUT:
+ MIN_SIZE_TEST: 800
+ MAX_SIZE_TEST: 1333
+ PIXEL_MEAN: [103.530, 116.280, 123.675]
+DATASETS:
+ TRAIN: ("train/train.yaml",)
+ TEST: ("validation/validation.yaml",)
+ FACTORY_TRAIN: ("VGTSVDataset",)
+ FACTORY_TEST: ("VGTSVDataset",)
+DATALOADER:
+ NUM_WORKERS: 0
+SOLVER:
+ BASE_LR: 0.0001
+ WEIGHT_DECAY: 0.00001
+ MAX_ITER: 600000
+ STEPS: (55000, 75000)
+ IMS_PER_BATCH: 4
+ CHECKPOINT_PERIOD: 10000
+ TEST_PERIOD: 20000000
+TEST:
+ IMS_PER_BATCH: 4
+ SKIP_PERFORMANCE_EVAL: False
+ SAVE_PREDICTIONS: True
+ SAVE_RESULTS_TO_TSV: True
+ TSV_SAVE_SUBSET: ["rect", "class", "conf", "feature"]
+ GATHER_ON_CPU: False
+ OUTPUT_FEATURE: True
+ IGNORE_BOX_REGRESSION: False
+OUTPUT_DIR: "./output/v8_customized/"
+DATA_DIR: "./datasets/teach/v8_customized"
+DISTRIBUTED_BACKEND: "gloo"
diff --git a/src/emma_perception/datamodels/__init__.py b/src/emma_perception/datamodels/__init__.py
new file mode 100644
index 0000000..24ae82b
--- /dev/null
+++ b/src/emma_perception/datamodels/__init__.py
@@ -0,0 +1 @@
+from emma_perception.datamodels.datamodels import ExtractedFeatures
diff --git a/src/emma_perception/datamodels/datamodels.py b/src/emma_perception/datamodels/datamodels.py
new file mode 100644
index 0000000..36bec19
--- /dev/null
+++ b/src/emma_perception/datamodels/datamodels.py
@@ -0,0 +1,17 @@
+from typing import Optional
+
+import torch
+from pydantic import BaseModel
+
+
+class ExtractedFeatures(BaseModel, arbitrary_types_allowed=True):
+ """Datamodel for returning extracted features."""
+
+ bbox_features: torch.Tensor
+ bbox_coords: torch.Tensor
+ bbox_probas: torch.Tensor
+ cnn_features: torch.Tensor
+ entity_labels: Optional[list[str]] = None
+ class_labels: list[str]
+ width: int
+ height: int
diff --git a/src/emma_perception/datamodules/__init__.py b/src/emma_perception/datamodules/__init__.py
new file mode 100644
index 0000000..e69de29
diff --git a/src/emma_perception/datamodules/parsers.py b/src/emma_perception/datamodules/parsers.py
new file mode 100644
index 0000000..3514c85
--- /dev/null
+++ b/src/emma_perception/datamodules/parsers.py
@@ -0,0 +1,70 @@
+import csv
+import os
+
+import numpy as np
+from tqdm import tqdm
+
+
+class EpicKitchensParser:
+ """Parser for EpicKitchens annotations."""
+
+ def __init__(self, annotation_csv: str, downsample: int = 0) -> None:
+ self.metadata = self.parse_annotations(annotation_csv)
+ self.downsample = downsample
+
+ def parse_annotations(self, ann_csv: str) -> dict[str, dict[int, int]]:
+ """Parsers the annotation csv file into a dictionary.
+
+ Currently storing only start and end times of annotations.
+ """
+ metadata = {}
+ with open(ann_csv) as fp:
+ csv_reader = csv.reader(fp)
+ header = next(csv_reader)
+ indices = list(range(len(header)))
+ idx2column = dict(zip(header, indices))
+ for row in tqdm(csv_reader, desc="Parsing epic kitchens annotations"):
+ video_id = row[idx2column["video_id"]]
+ start = int(row[idx2column["start_frame"]])
+ end = int(row[idx2column["stop_frame"]])
+ if video_id not in metadata:
+ metadata[video_id] = {start: end}
+ else:
+ metadata[video_id][start] = end
+ return metadata
+
+ def valid(self, video_id: str, frame_file: str) -> bool:
+ """Checks if a frame corresponds to an annotation."""
+ valid = False
+ if video_id in self.metadata.keys():
+ start_fr, end_fr = (
+ list(self.metadata[video_id].keys()),
+ list(self.metadata[video_id].values()),
+ )
+ bname = os.path.splitext(os.path.basename(frame_file))[0]
+ frame_id = int(bname.split("_")[-1])
+ start_valid = [start - 1 < frame_id for start in start_fr]
+ end_valid = [frame_id < end + 1 for end in end_fr]
+ overlap = [start and end for start, end in zip(start_valid, end_valid)]
+ valid = any(overlap)
+
+ if self.downsample and valid:
+ overlap_indices = np.where(overlap)[0]
+ for idx in overlap_indices:
+ start, end = start_fr[idx], end_fr[idx]
+ num_frames = len(np.arange(start, end + 1))
+ tick = float(num_frames / self.downsample)
+ downsampled_frames = [
+ start + int(tick * idx) for idx in range(self.downsample)
+ ]
+ valid = frame_id in downsampled_frames
+ return valid
+
+ def get_frames(self, video_path: str) -> list[str]:
+ """Return the frames that correspond to annotated segments for a given video."""
+ frames = sorted(os.listdir(video_path))
+ return [
+ os.path.join(video_path, frame)
+ for frame in frames
+ if self.valid(os.path.basename(video_path), frame)
+ ]
diff --git a/src/emma_perception/datamodules/visual_extraction_dataset.py b/src/emma_perception/datamodules/visual_extraction_dataset.py
new file mode 100644
index 0000000..088401d
--- /dev/null
+++ b/src/emma_perception/datamodules/visual_extraction_dataset.py
@@ -0,0 +1,239 @@
+import os
+from typing import Any, Literal, Optional
+
+import cv2
+import torch
+from maskrcnn_benchmark.structures.image_list import to_image_list # noqa: WPS347
+from PIL import Image, UnidentifiedImageError
+from pytorch_lightning import LightningDataModule
+from torch.utils.data import DataLoader, Dataset
+from torchvision.transforms import Compose
+
+from emma_perception.datamodules.parsers import EpicKitchensParser
+from emma_perception.utils import get_logger
+
+
+log = get_logger(__name__)
+
+
+class DatasetReturn(dict[str, Any]):
+ """Dictionary class for accessing samples from ImageDataset and VideoDataset."""
+
+ img: torch.Tensor
+ ids: str
+ width: int
+ height: int
+
+
+ImageLoaderType = Literal["cv2", "pil"]
+
+
+class ImageDataset(Dataset[DatasetReturn]):
+ """Simple dataset of images."""
+
+ def __init__(
+ self,
+ input_path: str,
+ image_loader: ImageLoaderType = "pil",
+ preprocess_transform: Optional[Compose] = None,
+ ) -> None:
+ self.input_path = input_path
+ self.dataset: list[str] = []
+ self.image_loader = self._make_loader(image_loader)
+ for fname in os.listdir(self.input_path):
+ try:
+ Image.open(os.path.join(self.input_path, fname))
+ except UnidentifiedImageError:
+ log.error(f"Could not read {os.path.join(self.input_path, fname)}")
+ continue
+ self.dataset.append(os.path.join(self.input_path, fname))
+ self.dataset_size = len(self.dataset)
+ self.transform = preprocess_transform
+
+ def __len__(self) -> int:
+ """Return dataset size."""
+ return self.dataset_size
+
+ def __getitem__(self, idx: int) -> DatasetReturn:
+ """Return a sample."""
+ fname = self.dataset[idx]
+ img = self.image_loader(fname)
+ img_size = img.size
+
+ if self.transform is not None:
+ img = self.transform(img)
+ return DatasetReturn(
+ img=img, ids=self._make_sample_id(fname), width=img_size[0], height=img_size[1]
+ )
+
+ def _make_loader(self, image_loader: ImageLoaderType) -> Any:
+ image_loader_func = None
+ if image_loader == "pil":
+ image_loader_func = self._pilimage
+ elif image_loader == "cv2":
+ image_loader_func = self._cv2image
+ else:
+ raise NotImplementedError(f"Unsupported image loader {image_loader}")
+ return image_loader_func
+
+ def _pilimage(self, img_name: str) -> Image:
+ return Image.open(img_name).convert("RGB")
+
+ def _cv2image(self, img_name: str) -> Image:
+ cv2_img = cv2.imread(img_name)
+ img = cv2.cvtColor(cv2_img, cv2.COLOR_BGR2RGB)
+ img = Image.fromarray(img)
+ return img
+
+ def _make_sample_id(self, fname: str) -> str:
+ return os.path.basename(fname)
+
+
+class VideoFrameDataset(Dataset[DatasetReturn]):
+ """Simple dataset of video frames."""
+
+ def __init__(
+ self,
+ input_path: str,
+ ann_csv: str,
+ ann_type: str,
+ image_loader: ImageLoaderType = "pil",
+ downsample: int = 0,
+ preprocess_transform: Optional[Compose] = None,
+ ) -> None:
+ self.input_path = input_path
+ self.dataset: list[str] = []
+ self.image_loader = self._make_loader(image_loader)
+ self.parser = self.parse_annotations(ann_csv, ann_type, downsample)
+
+ for _, dirnames, _ in os.walk(self.input_path):
+ for dirname in dirnames:
+ dirpath = os.path.join(self.input_path, dirname)
+ if self.parser:
+ files = self.parser.get_frames(dirpath)
+ else:
+ files = [os.path.join(dirpath, fname) for fname in os.listdir(dirpath)]
+ self.append_to_dataset(files)
+
+ self.dataset_size = len(self.dataset)
+ self.transform = preprocess_transform
+
+ def append_to_dataset(self, files: list[str]) -> None:
+ """Appends a list of files to the dataset."""
+ for fname in files:
+ try:
+ Image.open(fname)
+ except UnidentifiedImageError:
+ log.error(f"Could not read {os.path.join(self.input_path, fname)}")
+ continue
+ self.dataset.append(fname)
+
+ def parse_annotations(
+ self, ann_csv: str, ann_type: str, downsample: int
+ ) -> EpicKitchensParser:
+ """Parses the annotations of a video dataset with one of the available parsers."""
+ parser = None
+ if ann_csv is not None:
+ if ann_type == "epic_kitchens":
+ parser = EpicKitchensParser(ann_csv, downsample)
+ else:
+ raise NotImplementedError(f"Unsupported annotation type {ann_type}")
+ return parser
+
+ def __len__(self) -> int:
+ """Return dataset size."""
+ return self.dataset_size
+
+ def __getitem__(self, idx: int) -> DatasetReturn:
+ """Return a sample."""
+ fname = self.dataset[idx]
+ img = self.image_loader(fname)
+ img_size = img.size
+ if self.transform is not None:
+ img = self.transform(img)
+ return DatasetReturn(
+ img=img, ids=self._make_sample_id(fname), width=img_size[0], height=img_size[1]
+ )
+
+ def _make_loader(self, image_loader: ImageLoaderType) -> Any:
+ image_loader_func = None
+ if image_loader == "pil":
+ image_loader_func = self._pilimage
+ elif image_loader == "cv2":
+ image_loader_func = self._cv2image
+ else:
+ raise NotImplementedError(f"Unsupported image loader {image_loader}")
+ return image_loader_func
+
+ def _pilimage(self, img_name: str) -> Image:
+ return Image.open(img_name).convert("RGB")
+
+ def _cv2image(self, img_name: str) -> Image:
+ cv2_img = cv2.imread(img_name)
+ img = cv2.cvtColor(cv2_img, cv2.COLOR_BGR2RGB)
+ img = Image.fromarray(img)
+ return img
+
+ def _make_sample_id(self, fname: str) -> str:
+ prefix = os.path.basename(os.path.dirname(fname))
+ return f"{prefix}_{os.path.basename(fname)}"
+
+
+class BatchCollator:
+ """From a list of samples from the dataset, returns the batched images and targets.
+
+ This should be passed to the DataLoader
+ """
+
+ def __init__(self, size_divisible: int = 0) -> None:
+ self.size_divisible = size_divisible
+
+ def __call__(self, batch: list[DatasetReturn]) -> dict[str, Any]:
+ """Creates a batch of images potentially having varying sizes."""
+ images = []
+ img_ids = []
+ width = []
+ height = []
+
+ for elem in batch:
+ images.append(elem["img"])
+ img_ids.append(elem["ids"])
+ width.append(elem["width"])
+ height.append(elem["height"])
+
+ images = to_image_list(images, self.size_divisible)
+
+ return {
+ "img": images,
+ "ids": img_ids,
+ "width": torch.tensor(width),
+ "height": torch.tensor(height),
+ }
+
+
+class PredictDataModule(LightningDataModule):
+ """A simple data module for predictions."""
+
+ def __init__(
+ self,
+ dataset: Dataset[DatasetReturn],
+ batch_size: int = 42,
+ num_workers: int = 0,
+ pin_memory: bool = False,
+ ) -> None:
+ super().__init__()
+ self.batch_size = batch_size
+ self.dataset = dataset
+ self.num_workers = num_workers
+ self.pin_memory = pin_memory
+
+ def predict_dataloader(self) -> DataLoader: # type: ignore[type-arg]
+ """Defines the dataset to make predictions."""
+ dataset_predict = DataLoader(
+ self.dataset,
+ self.batch_size,
+ num_workers=self.num_workers,
+ pin_memory=self.pin_memory,
+ collate_fn=BatchCollator(),
+ )
+ return dataset_predict
diff --git a/src/emma_perception/models/__init__.py b/src/emma_perception/models/__init__.py
new file mode 100644
index 0000000..81cabac
--- /dev/null
+++ b/src/emma_perception/models/__init__.py
@@ -0,0 +1 @@
+from emma_perception.models.attrcnn_global_features import AttrRCNNGlobalFeatures
diff --git a/src/emma_perception/models/attrcnn_global_features.py b/src/emma_perception/models/attrcnn_global_features.py
new file mode 100644
index 0000000..ab98409
--- /dev/null
+++ b/src/emma_perception/models/attrcnn_global_features.py
@@ -0,0 +1,23 @@
+from typing import Optional
+
+from maskrcnn_benchmark.structures.bounding_box import BoxList
+from maskrcnn_benchmark.structures.image_list import ImageList
+from scene_graph_benchmark.AttrRCNN import AttrRCNN
+
+
+class AttrRCNNGlobalFeatures(AttrRCNN): # type: ignore[misc]
+ """AttrRCNN model extended to additionally return scene features."""
+
+ def forward(self, images: ImageList, targets: Optional[tuple[BoxList]] = None) -> None:
+ """Extract AttrRCNN and scene features."""
+ cnn_features = []
+ hook = self.backbone.register_forward_hook(
+ lambda module, inp, output: cnn_features.append(output)
+ )
+ predictions = super().forward(images, targets)
+ hook.remove()
+ cnn_features = cnn_features[0][0]
+ for pred, feats in zip(predictions, cnn_features):
+ pred.add_field("cnn_features", feats.mean(dim=(-2, -1)))
+
+ return predictions
diff --git a/src/emma_perception/models/simbot_entity_classifier.py b/src/emma_perception/models/simbot_entity_classifier.py
new file mode 100644
index 0000000..b3ab5b2
--- /dev/null
+++ b/src/emma_perception/models/simbot_entity_classifier.py
@@ -0,0 +1,208 @@
+import json
+from collections import Counter
+from pathlib import Path
+
+import numpy as np
+import pytorch_lightning as pl
+import torch
+from numpy import typing
+from torch.nn import BatchNorm1d, CosineSimilarity, Dropout, Linear, Module, Sequential
+
+
+class SimBotEntityClassifier:
+ """SimBotEntityClassifer class."""
+
+ default_tensor_device: torch.device = torch.device("cpu")
+
+ def __init__(
+ self,
+ class_centroids_path: Path,
+ device: torch.device = default_tensor_device,
+ ) -> None:
+ self.device = device
+ (centroids_vectors, centroids_names) = self._load_centroids(class_centroids_path)
+ self.centroids_vectors = centroids_vectors
+ self.centroids_names = centroids_names
+ self._cosine_distance = CosineSimilarity()
+
+ def __call__(self, bbox_features: torch.Tensor, class_labels: list[str]) -> list[str]:
+ """Find the object entity for all detected objects."""
+ entities = []
+ for idx, class_label in enumerate(class_labels):
+ centroid_vectors = self.centroids_vectors.get(class_label, None)
+ if centroid_vectors is not None:
+ entity_index = self._cosine_distance(bbox_features[idx], centroid_vectors).argmax()
+ # TODO: remove this with the new entity classifier
+ entity = self.centroids_names[class_label][entity_index]
+ if entity == "Round Table":
+ entity = "Table"
+ entities.append(entity)
+ else:
+ entities.append(class_label)
+ return entities
+
+ def move_to_device(self, device: torch.device) -> None:
+ """Moves all the centroids to the specified device."""
+ for key, tensor in self.centroids_vectors.items():
+ self.centroids_vectors[key] = tensor.to(device)
+
+ def _load_centroids(
+ self, class_centroids_path: Path
+ ) -> tuple[dict[str, torch.Tensor], dict[str, list[str]]]:
+ centroids = torch.load(class_centroids_path, map_location=self.device)
+ object_class_centroids_vectors = {}
+ object_class_centroids_names = {}
+ for object_class, centroid_dict in centroids.items():
+ vectors = torch.stack(list(centroid_dict.values()))
+ names_list = list(centroid_dict.keys())
+ object_class_centroids_vectors[object_class] = vectors
+ object_class_centroids_names[object_class] = names_list
+ return object_class_centroids_vectors, object_class_centroids_names
+
+
+class SimBotKNNEntityClassifier:
+ """SimBotKNNEntityClassifier class."""
+
+ default_tensor_device: torch.device = torch.device("cpu")
+
+ def __init__(
+ self,
+ class_centroids_path: Path,
+ device: torch.device = default_tensor_device,
+ neighbors: int = 5,
+ ) -> None:
+ self.device = device
+ (centroids_vectors, centroids_names) = self._load_centroids(class_centroids_path)
+ self.centroids_vectors = centroids_vectors
+ self.centroids_names = centroids_names
+ self._cosine_distance = CosineSimilarity()
+ self._neighbors = neighbors
+
+ def __call__(self, bbox_features: torch.Tensor, class_labels: list[str]) -> list[str]:
+ """Find the object entity for all detected objects."""
+ entities = []
+ for idx, class_label in enumerate(class_labels):
+ centroid_vectors = self.centroids_vectors.get(class_label, None)
+ if centroid_vectors is not None:
+ distances = self._cosine_distance(bbox_features[idx], centroid_vectors)
+ knn = distances.topk(self._neighbors, largest=True)
+ labels = self.centroids_names[class_label][knn.indices.tolist()]
+ entity: str = Counter(labels).most_common(1)[0][0]
+
+ # TODO: remove this with the new entity classifier
+ if entity == "Round Table":
+ entity = "Table"
+ entities.append(entity)
+ else:
+ entities.append(class_label)
+ return entities
+
+ def move_to_device(self, device: torch.device) -> None:
+ """Moves all the centroids to the specified device."""
+ for key, tensor in self.centroids_vectors.items():
+ self.centroids_vectors[key] = tensor.to(device)
+
+ def _load_centroids(
+ self, class_centroids_path: Path
+ ) -> tuple[dict[str, torch.Tensor], dict[str, typing.NDArray[np.str_]]]:
+ centroids = torch.load(class_centroids_path, map_location=self.device)
+ centroid_vectors = {}
+ centroid_names = {}
+ for object_class, object_dict in centroids.items():
+ centroid_vectors[object_class] = object_dict["features"]
+ centroid_names[object_class] = np.array(object_dict["labels"])
+ return centroid_vectors, centroid_names
+
+
+class SimBotMLPEntityClassifier:
+ """SimBotMLPEntityClassifier class."""
+
+ default_tensor_device: torch.device = torch.device("cpu")
+
+ def __init__(
+ self,
+ model_path: Path,
+ classmap_path: Path,
+ device: torch.device = default_tensor_device,
+ ) -> None:
+ self.device = device
+ self.classifier = EntityPolicy.load_from_checkpoint(str(model_path))
+ self.classifier.to(device)
+ self.classifier.eval()
+ with open(classmap_path) as fp:
+ self.classmap = json.load(fp)
+
+ def __call__(self, bbox_features: torch.Tensor, class_labels: list[str]) -> list[str]:
+ """Find the object entity for all detected objects."""
+ with torch.no_grad():
+ predictions = self.classifier.inference_step({"features": bbox_features})
+
+ entities = []
+ for idx, class_label in enumerate(class_labels):
+ if class_label in self.classmap["class_labels"]:
+ entity_int = predictions[idx]
+ entity_str = self.classmap["idx2label"][str(entity_int.item())]
+
+ # TODO: remove this with the new entity classifier
+ if entity_str == "Round Table":
+ entity_str = "Table"
+ entities.append(entity_str)
+ else:
+ entities.append(class_label)
+ return entities
+
+ def move_to_device(self, device: torch.device) -> None:
+ """Moves the mlp to the specified device."""
+ self.classifier.to(device)
+ self.classifier.eval()
+
+
+class EntityClassifier(Module):
+ """EntiyClassifer MLP."""
+
+ def __init__(
+ self,
+ in_features: int = 2048,
+ hidden_dim: int = 64,
+ dropout: float = 0.2,
+ num_classes: int = 23,
+ ):
+ super().__init__()
+ self._in_features = in_features
+ self._hidden_dim = hidden_dim
+ self._num_classes = num_classes
+ self._dropout = dropout
+
+ self.classifier = self.make_layers()
+
+ def make_layers(self) -> Sequential:
+ """Make a simple 2 layer MLP."""
+ layers: list[torch.nn.Module] = []
+
+ layers.append(Linear(self._in_features, self._hidden_dim))
+ layers.append(BatchNorm1d(self._hidden_dim))
+ layers.append(Dropout(self._dropout))
+ layers.append(Linear(self._hidden_dim, self._num_classes))
+
+ return Sequential(*layers)
+
+ def forward(self, batch: dict[str, torch.Tensor]) -> dict[str, torch.Tensor]:
+ """Forward pass."""
+ out = self.classifier(batch["features"])
+ return {"out": out}
+
+
+class EntityPolicy(pl.LightningModule):
+ """Entity Lightning Module."""
+
+ def __init__(self, num_classes: int = 23) -> None:
+ super().__init__()
+
+ self.classifier = EntityClassifier(num_classes=num_classes)
+
+ def inference_step(self, batch: dict[str, torch.Tensor]) -> torch.Tensor:
+ """Inference step."""
+ output = self.classifier(batch)
+ out = output["out"]
+
+ return torch.argmax(out, dim=1)
diff --git a/src/emma_perception/models/vinvl_extractor.py b/src/emma_perception/models/vinvl_extractor.py
new file mode 100644
index 0000000..46cb9a0
--- /dev/null
+++ b/src/emma_perception/models/vinvl_extractor.py
@@ -0,0 +1,67 @@
+from typing import Any
+
+import torch
+from maskrcnn_benchmark.data.transforms import build_transforms
+from maskrcnn_benchmark.utils.checkpoint import DetectronCheckpointer
+from overrides import overrides
+from pytorch_lightning import LightningModule
+from scene_graph_benchmark.AttrRCNN import AttrRCNN
+from scene_graph_benchmark.scene_parser import SceneParser
+
+
+class VinVLTransform:
+ """VinVL preprocessing transform."""
+
+ def __init__(self, cfg: Any) -> None:
+ self.transforms = build_transforms(cfg, is_train=False)
+
+ def __call__(self, img: Any) -> torch.Tensor:
+ """Apply preprocessing transformations to image."""
+ img_transf, _ = self.transforms(img, target=None)
+ return img_transf
+
+
+class VinVLExtractor(LightningModule):
+ """VinVL object detector wrapped in a lightining module."""
+
+ def __init__(self, cfg: Any) -> None:
+ super().__init__()
+
+ if "OUTPUT_FEATURE" not in cfg.TEST and cfg.TEST.OUTPUT_FEATURE:
+ raise AttributeError("TEST.OUTPUT_FEATURE must be set to True on configuration file")
+
+ if cfg.MODEL.META_ARCHITECTURE == "SceneParser":
+ model = SceneParser(cfg)
+ elif cfg.MODEL.META_ARCHITECTURE == "AttrRCNN":
+ model = AttrRCNN(cfg)
+
+ checkpointer = DetectronCheckpointer(cfg, model, save_dir=cfg.OUTPUT_DIR)
+ checkpointer.load(cfg.MODEL.WEIGHT)
+
+ self.extractor = model
+
+ @overrides(check_signature=False)
+ def forward(self, batch: dict[str, Any]) -> dict[str, Any]:
+ """Extracts features, coordinates, and class probabilities for bounding boxes."""
+ output = {}
+ cnn_features = []
+
+ hook = self.extractor.backbone.register_forward_hook(
+ lambda module, inp, output: cnn_features.append(output)
+ )
+ predictions = self.extractor(batch["img"].to(self.device))
+ hook.remove()
+ cnn_features = cnn_features[0][0]
+ out = zip(batch["ids"], batch["width"], batch["height"], predictions, cnn_features)
+
+ for b_id, width, height, pred, cnn_feats in out:
+ pred = pred.resize((width, height))
+ output[b_id] = {
+ "bbox_features": pred.get_field("box_features"),
+ "bbox_coords": pred.bbox,
+ "bbox_probas": pred.get_field("scores_all"),
+ "cnn_features": cnn_feats.mean(dim=(-2, -1)),
+ "width": width,
+ "height": height,
+ }
+ return output
diff --git a/src/emma_perception/utils/__init__.py b/src/emma_perception/utils/__init__.py
new file mode 100644
index 0000000..377a76c
--- /dev/null
+++ b/src/emma_perception/utils/__init__.py
@@ -0,0 +1 @@
+from emma_perception.utils.get_logger import get_logger
diff --git a/src/emma_perception/utils/forced_bbox_extraction.py b/src/emma_perception/utils/forced_bbox_extraction.py
new file mode 100644
index 0000000..dc59a12
--- /dev/null
+++ b/src/emma_perception/utils/forced_bbox_extraction.py
@@ -0,0 +1,62 @@
+import argparse
+from pathlib import Path
+
+import torch
+from maskrcnn_benchmark.config import cfg
+from maskrcnn_benchmark.utils.miscellaneous import mkdir
+from scene_graph_benchmark.config import sg_cfg
+from torch.utils.data import DataLoader
+
+
+def prepare_configs(args: argparse.Namespace) -> None:
+ """Prepare the config."""
+ cfg.set_new_allowed(True)
+ cfg.merge_from_other_cfg(sg_cfg)
+ cfg.set_new_allowed(False)
+ cfg.merge_from_file(args.config_file)
+ cfg.merge_from_list(args.opts)
+ cfg.freeze()
+
+
+def make_output_folders(
+ dataset_names: list[str],
+ model_name: str,
+ output_dir: Path,
+) -> list[Path]:
+ """Prepare the list of output folders."""
+ output_folders = []
+ if len(dataset_names) == 1:
+ output_folder = output_dir.joinpath("inference", model_name)
+ mkdir(output_folder)
+ output_folders = [output_folder]
+ else:
+ for dataset_name in dataset_names:
+ dataset_name1 = dataset_name.replace("/", "_")
+ output_folder = output_dir.joinpath("inference", dataset_name1, model_name)
+
+ mkdir(output_folder)
+ output_folders.append(output_folder)
+ return output_folders
+
+
+def post_process_outputs(dataloader: DataLoader, output_folder: Path) -> None: # type: ignore[type-arg]
+ """Post process predictions from a single file to one file per image."""
+ id_to_img_map = dataloader.dataset.id_to_img_map
+ predictions = torch.load(output_folder.joinpath("predictions.pth"))
+ features_path = output_folder.joinpath("image_features_forced_bboxes")
+ Path.mkdir(features_path, exist_ok=True)
+ for idx, pred in predictions.items():
+ image_info = dataloader.dataset.get_img_info(idx)
+ width = image_info["width"]
+ height = image_info["height"]
+ pred = pred.resize((width, height))
+ feature_dict = {
+ "bbox_features": pred.get_field("box_features"),
+ "bbox_coords": pred.bbox,
+ "bbox_probas": pred.get_field("scores_all"),
+ "cnn_features": pred.get_field("cnn_features"),
+ "width": width,
+ "height": height,
+ }
+ features_file_name = f"{str(id_to_img_map[idx]).zfill(12)}.pt" # noqa: WPS432
+ torch.save(feature_dict, features_path.joinpath(features_file_name))
diff --git a/src/emma_perception/utils/get_logger.py b/src/emma_perception/utils/get_logger.py
new file mode 100644
index 0000000..058c1f7
--- /dev/null
+++ b/src/emma_perception/utils/get_logger.py
@@ -0,0 +1,29 @@
+import logging
+from typing import Optional
+
+from pytorch_lightning.utilities import rank_zero_only
+
+
+LOG_LEVELS = (
+ "debug",
+ "info",
+ "warning",
+ "error",
+ "exception",
+ "fatal",
+ "critical",
+)
+
+
+def get_logger(name: Optional[str] = None) -> logging.Logger:
+ """Create logger with multi-GPU-friendly python command line logger.
+
+ Ensure all logging levels get marked with the rank zero decorator, otherwise logs would get
+ multiplied for each GPU process in multi-GPU setup.
+ """
+ logger = logging.getLogger(name)
+
+ for level in LOG_LEVELS:
+ setattr(logger, level, rank_zero_only(getattr(logger, level)))
+
+ return logger
diff --git a/src/emma_perception/utils/visualizing_image.py b/src/emma_perception/utils/visualizing_image.py
new file mode 100644
index 0000000..301bfed
--- /dev/null
+++ b/src/emma_perception/utils/visualizing_image.py
@@ -0,0 +1,523 @@
+"""Coding=utf-8 Copyright 2018, Antonio Mendoza Hao Tan, Mohit Bansal Adapted From Facebook Inc,
+Detectron2.
+
+Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in
+compliance with the License. You may obtain a copy of the License at
+
+http://www.apache.org/licenses/LICENSE-2.0
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.import copy
+"""
+import colorsys
+import io
+import os
+
+import cv2
+import matplotlib as mpl
+import matplotlib.colors as mplc
+import matplotlib.figure as mplfigure
+import numpy as np
+import requests
+import torch
+from matplotlib.backends.backend_agg import FigureCanvasAgg
+from PIL import Image
+
+
+def get_image_from_url(url):
+ """Returns an image from a URL."""
+ response = requests.get(url)
+ img = Image.open(io.BytesIO(response.content))
+ return img
+
+
+def img_tensorize(im, input_format="RGB"):
+ """Returns an array of the image in the given image format."""
+ assert isinstance(im, str)
+ if os.path.isfile(im):
+ img = cv2.imread(im)
+ else:
+ img = get_image_from_url(im)
+ assert img is not None, f"could not connect to: {im}"
+ img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
+ if input_format == "RGB":
+ img = img[:, :, ::-1]
+ return img
+
+
+_SMALL_OBJ = 1000
+
+
+class SingleImageViz:
+ def __init__(
+ self,
+ img,
+ scale: float = 1.2,
+ edgecolor: str = "g",
+ alpha: float = 0.5,
+ linestyle: str = "-",
+ saveas: str = "test_out.jpg",
+ rgb: bool = True,
+ pynb: bool = False,
+ id2obj=None,
+ id2attr=None,
+ pad=0.7,
+ ):
+ """
+ img: an RGB image of shape (H, W, 3).
+ """
+ if isinstance(img, torch.Tensor):
+ img = img.numpy().astype("np.uint8")
+ if isinstance(img, str):
+ img = img_tensorize(img)
+ assert isinstance(img, np.ndarray)
+
+ width, height = img.shape[1], img.shape[0]
+ fig = mplfigure.Figure(frameon=False)
+ dpi = fig.get_dpi()
+ width_in = (width * scale + 1e-2) / dpi
+ height_in = (height * scale + 1e-2) / dpi
+ fig.set_size_inches(width_in, height_in)
+ ax = fig.add_axes([0.0, 0.0, 1.0, 1.0])
+ ax.axis("off")
+ ax.set_xlim(0.0, width)
+ ax.set_ylim(height)
+
+ self.saveas = saveas
+ self.rgb = rgb
+ self.pynb = pynb
+ self.img = img
+ self.edgecolor = edgecolor
+ self.alpha = 0.5
+ self.linestyle = linestyle
+ self.font_size = int(np.sqrt(min(height, width)) * scale // 3)
+ self.width = width
+ self.height = height
+ self.scale = scale
+ self.fig = fig
+ self.ax = ax
+ self.pad = pad
+ self.id2obj = id2obj
+ self.id2attr = id2attr
+ self.canvas = FigureCanvasAgg(fig)
+
+ def add_box(self, box, color=None):
+ if color is None:
+ color = self.edgecolor
+ (x0, y0, x1, y1) = box
+ width = x1 - x0
+ height = y1 - y0
+ self.ax.add_patch(
+ mpl.patches.Rectangle(
+ (x0, y0),
+ width,
+ height,
+ fill=False,
+ edgecolor=color,
+ linewidth=self.font_size // 3,
+ alpha=self.alpha,
+ linestyle=self.linestyle,
+ )
+ )
+
+ def draw_boxes(self, boxes, obj_ids=None, obj_scores=None, attr_ids=None, attr_scores=None):
+ if len(boxes.shape) > 2:
+ boxes = boxes[0]
+ if len(obj_ids.shape) > 1:
+ obj_ids = obj_ids[0]
+ if len(obj_scores.shape) > 1:
+ obj_scores = obj_scores[0]
+ if attr_ids is not None and len(attr_ids.shape) > 1:
+ attr_ids = attr_ids[0]
+ if attr_scores is not None and len(attr_scores.shape) > 1:
+ attr_scores = attr_scores[0]
+ if isinstance(boxes, torch.Tensor):
+ boxes = boxes.numpy()
+ if isinstance(boxes, list):
+ boxes = np.array(boxes)
+ assert isinstance(boxes, np.ndarray)
+ areas = np.prod(boxes[:, 2:] - boxes[:, :2], axis=1)
+ sorted_idxs = np.argsort(-areas).tolist()
+ boxes = boxes[sorted_idxs] if boxes is not None else None
+ obj_ids = obj_ids[sorted_idxs] if obj_ids is not None else None
+ obj_scores = obj_scores[sorted_idxs] if obj_scores is not None else None
+ attr_ids = attr_ids[sorted_idxs] if attr_ids is not None else None
+ attr_scores = attr_scores[sorted_idxs] if attr_scores is not None else None
+
+ assigned_colors = [self._random_color(maximum=1) for _ in range(len(boxes))]
+ assigned_colors = [assigned_colors[idx] for idx in sorted_idxs]
+ if obj_ids is not None:
+ if attr_ids is not None and attr_scores is not None:
+ labels = self._create_text_labels_attr(obj_ids, obj_scores, attr_ids, attr_scores)
+ else:
+ labels = self._create_text_labels(obj_ids, obj_scores)
+
+ for i in range(len(boxes)):
+ color = assigned_colors[i]
+ self.add_box(boxes[i], color)
+ self.draw_labels(labels[i], boxes[i], color)
+
+ def draw_labels(self, label, box, color):
+ x0, y0, x1, y1 = box
+ text_pos = (x0, y0)
+ instance_area = (y1 - y0) * (x1 - x0)
+ small = _SMALL_OBJ * self.scale
+ if instance_area < small or y1 - y0 < 40 * self.scale:
+ if y1 >= self.height - 5:
+ text_pos = (x1, y0)
+ else:
+ text_pos = (x0, y1)
+
+ height_ratio = (y1 - y0) / np.sqrt(self.height * self.width)
+ lighter_color = self._change_color_brightness(color, brightness_factor=0.7)
+ font_size = np.clip((height_ratio - 0.02) / 0.08 + 1, 1.2, 2)
+ font_size *= 0.75 * self.font_size
+
+ self.draw_text(
+ text=label,
+ position=text_pos,
+ color=lighter_color,
+ )
+
+ def draw_text(
+ self,
+ text,
+ position,
+ color="g",
+ ha="left",
+ ):
+ rotation = 0
+ font_size = self.font_size
+ color = np.maximum(list(mplc.to_rgb(color)), 0.2)
+ color[np.argmax(color)] = max(0.8, np.max(color))
+ bbox = {
+ "facecolor": "black",
+ "alpha": self.alpha,
+ "pad": self.pad,
+ "edgecolor": "none",
+ }
+ x, y = position
+ self.ax.text(
+ x,
+ y,
+ text,
+ size=font_size * self.scale,
+ family="sans-serif",
+ bbox=bbox,
+ verticalalignment="top",
+ horizontalalignment=ha,
+ color=color,
+ zorder=10,
+ rotation=rotation,
+ )
+
+ def save(self, saveas=None):
+ if saveas is None:
+ saveas = self.saveas
+ if saveas.lower().endswith(".jpg") or saveas.lower().endswith(".png"):
+ cv2.imwrite(
+ saveas,
+ self._get_buffer()[:, :, ::-1],
+ )
+ else:
+ self.fig.savefig(saveas)
+
+ def _create_text_labels_attr(self, classes, scores, attr_classes, attr_scores):
+ labels = [self.id2obj[i] for i in classes]
+ attr_labels = [self.id2attr[i] for i in attr_classes]
+ labels = [
+ f"{label} {score:.2f} {attr} {attr_score:.2f}"
+ for label, score, attr, attr_score in zip(labels, scores, attr_labels, attr_scores)
+ ]
+ return labels
+
+ def _create_text_labels(self, classes, scores):
+ labels = [self.id2obj[i] for i in classes]
+ if scores is not None:
+ if labels is None:
+ labels = [f"{s * 100:.0f}%" for s in scores]
+ else:
+ labels = [f"{li} {s * 100:.0f}%" for li, s in zip(labels, scores)]
+ return labels
+
+ def _random_color(self, maximum=255):
+ idx = np.random.randint(0, len(_COLORS))
+ ret = _COLORS[idx] * maximum
+ if not self.rgb:
+ ret = ret[::-1]
+ return ret
+
+ def _get_buffer(self):
+ if not self.pynb:
+ s, (width, height) = self.canvas.print_to_buffer()
+ if (width, height) != (self.width, self.height):
+ img = cv2.resize(self.img, (width, height))
+ else:
+ img = self.img
+ else:
+ buf = io.BytesIO() # works for cairo backend
+ self.canvas.print_rgba(buf)
+ width, height = self.width, self.height
+ s = buf.getvalue()
+ img = self.img
+
+ buffer = np.frombuffer(s, dtype="uint8")
+ img_rgba = buffer.reshape(height, width, 4)
+ rgb, alpha = np.split(img_rgba, [3], axis=2)
+
+ try:
+ import numexpr as ne # fuse them with numexpr
+
+ visualized_image = ne.evaluate("img * (1 - alpha / 255.0) + rgb * (alpha / 255.0)")
+ except ImportError:
+ alpha = alpha.astype("float32") / 255.0
+ visualized_image = img * (1 - alpha) + rgb * alpha
+
+ return visualized_image.astype("uint8")
+
+ def _change_color_brightness(self, color, brightness_factor):
+ assert brightness_factor >= -1.0 and brightness_factor <= 1.0
+ color = mplc.to_rgb(color)
+ polygon_color = colorsys.rgb_to_hls(*mplc.to_rgb(color))
+ modified_lightness = polygon_color[1] + (brightness_factor * polygon_color[1])
+ modified_lightness = 0.0 if modified_lightness < 0.0 else modified_lightness
+ modified_lightness = 1.0 if modified_lightness > 1.0 else modified_lightness
+ modified_color = colorsys.hls_to_rgb(
+ polygon_color[0], modified_lightness, polygon_color[2]
+ )
+ return modified_color
+
+
+# Color map
+_COLORS = (
+ np.array(
+ [
+ 0.000,
+ 0.447,
+ 0.741,
+ 0.850,
+ 0.325,
+ 0.098,
+ 0.929,
+ 0.694,
+ 0.125,
+ 0.494,
+ 0.184,
+ 0.556,
+ 0.466,
+ 0.674,
+ 0.188,
+ 0.301,
+ 0.745,
+ 0.933,
+ 0.635,
+ 0.078,
+ 0.184,
+ 0.300,
+ 0.300,
+ 0.300,
+ 0.600,
+ 0.600,
+ 0.600,
+ 1.000,
+ 0.000,
+ 0.000,
+ 1.000,
+ 0.500,
+ 0.000,
+ 0.749,
+ 0.749,
+ 0.000,
+ 0.000,
+ 1.000,
+ 0.000,
+ 0.000,
+ 0.000,
+ 1.000,
+ 0.667,
+ 0.000,
+ 1.000,
+ 0.333,
+ 0.333,
+ 0.000,
+ 0.333,
+ 0.667,
+ 0.000,
+ 0.333,
+ 1.000,
+ 0.000,
+ 0.667,
+ 0.333,
+ 0.000,
+ 0.667,
+ 0.667,
+ 0.000,
+ 0.667,
+ 1.000,
+ 0.000,
+ 1.000,
+ 0.333,
+ 0.000,
+ 1.000,
+ 0.667,
+ 0.000,
+ 1.000,
+ 1.000,
+ 0.000,
+ 0.000,
+ 0.333,
+ 0.500,
+ 0.000,
+ 0.667,
+ 0.500,
+ 0.000,
+ 1.000,
+ 0.500,
+ 0.333,
+ 0.000,
+ 0.500,
+ 0.333,
+ 0.333,
+ 0.500,
+ 0.333,
+ 0.667,
+ 0.500,
+ 0.333,
+ 1.000,
+ 0.500,
+ 0.667,
+ 0.000,
+ 0.500,
+ 0.667,
+ 0.333,
+ 0.500,
+ 0.667,
+ 0.667,
+ 0.500,
+ 0.667,
+ 1.000,
+ 0.500,
+ 1.000,
+ 0.000,
+ 0.500,
+ 1.000,
+ 0.333,
+ 0.500,
+ 1.000,
+ 0.667,
+ 0.500,
+ 1.000,
+ 1.000,
+ 0.500,
+ 0.000,
+ 0.333,
+ 1.000,
+ 0.000,
+ 0.667,
+ 1.000,
+ 0.000,
+ 1.000,
+ 1.000,
+ 0.333,
+ 0.000,
+ 1.000,
+ 0.333,
+ 0.333,
+ 1.000,
+ 0.333,
+ 0.667,
+ 1.000,
+ 0.333,
+ 1.000,
+ 1.000,
+ 0.667,
+ 0.000,
+ 1.000,
+ 0.667,
+ 0.333,
+ 1.000,
+ 0.667,
+ 0.667,
+ 1.000,
+ 0.667,
+ 1.000,
+ 1.000,
+ 1.000,
+ 0.000,
+ 1.000,
+ 1.000,
+ 0.333,
+ 1.000,
+ 1.000,
+ 0.667,
+ 1.000,
+ 0.333,
+ 0.000,
+ 0.000,
+ 0.500,
+ 0.000,
+ 0.000,
+ 0.667,
+ 0.000,
+ 0.000,
+ 0.833,
+ 0.000,
+ 0.000,
+ 1.000,
+ 0.000,
+ 0.000,
+ 0.000,
+ 0.167,
+ 0.000,
+ 0.000,
+ 0.333,
+ 0.000,
+ 0.000,
+ 0.500,
+ 0.000,
+ 0.000,
+ 0.667,
+ 0.000,
+ 0.000,
+ 0.833,
+ 0.000,
+ 0.000,
+ 1.000,
+ 0.000,
+ 0.000,
+ 0.000,
+ 0.167,
+ 0.000,
+ 0.000,
+ 0.333,
+ 0.000,
+ 0.000,
+ 0.500,
+ 0.000,
+ 0.000,
+ 0.667,
+ 0.000,
+ 0.000,
+ 0.833,
+ 0.000,
+ 0.000,
+ 1.000,
+ 0.000,
+ 0.000,
+ 0.000,
+ 0.143,
+ 0.143,
+ 0.143,
+ 0.857,
+ 0.857,
+ 0.857,
+ 1.000,
+ 1.000,
+ 1.000,
+ ]
+ )
+ .astype(np.float32)
+ .reshape(-1, 3)
+)
diff --git a/storage/.gitkeep b/storage/.gitkeep
new file mode 100644
index 0000000..e69de29
diff --git a/storage/data/.gitkeep b/storage/data/.gitkeep
new file mode 100644
index 0000000..e69de29
diff --git a/storage/model/.gitkeep b/storage/model/.gitkeep
new file mode 100644
index 0000000..e69de29
diff --git a/tests/__init__.py b/tests/__init__.py
new file mode 100644
index 0000000..f90f7a6
--- /dev/null
+++ b/tests/__init__.py
@@ -0,0 +1,6 @@
+from pathlib import Path
+
+
+PROJECT_ROOT = Path.joinpath(Path(__file__).parent, "..").resolve()
+TESTS_ROOT = Path.joinpath(PROJECT_ROOT, "tests")
+FIXTURES_ROOT = Path.joinpath(PROJECT_ROOT, "storage", "fixtures")
diff --git a/tests/conftest.py b/tests/conftest.py
new file mode 100644
index 0000000..96ef9a7
--- /dev/null
+++ b/tests/conftest.py
@@ -0,0 +1,14 @@
+import os
+
+import pytest
+
+
+if os.getenv("_PYTEST_RAISE", "0") != "0":
+
+ @pytest.hookimpl(tryfirst=True)
+ def pytest_exception_interact(call):
+ raise call.excinfo.value
+
+ @pytest.hookimpl(tryfirst=True)
+ def pytest_internalerror(excinfo):
+ raise excinfo.value
diff --git a/tests/test_example.py b/tests/test_example.py
new file mode 100644
index 0000000..886acc4
--- /dev/null
+++ b/tests/test_example.py
@@ -0,0 +1,3 @@
+def test_pytest_works():
+ """Verify that pytest works, and give basic test to pass CI."""
+ assert True # noqa: WPS444