diff --git a/.github/workflows/manual_tests_CPU.yml b/.github/workflows/manual_tests_CPU.yml index 20c4fb9..736e87c 100644 --- a/.github/workflows/manual_tests_CPU.yml +++ b/.github/workflows/manual_tests_CPU.yml @@ -25,18 +25,18 @@ jobs: with: miniforge-version: latest python-version: "3.10" - - name: pip install - run: | - pip install wakis['notebook'] - pip uninstall vtk -y - pip install --extra-index-url https://wheels.vtk.org vtk-osmesa - - name: Print versions run: conda list - name: Checkout wakis uses: actions/checkout@v4 with: path: wakis + - name: pip install + run: | + cd wakis + pip install .[notebook,tests] + pip uninstall vtk -y + pip install --extra-index-url https://wheels.vtk.org vtk-osmesa - name: Run pytest run: | cd wakis diff --git a/.github/workflows/manual_tests_MPI.yml b/.github/workflows/manual_tests_MPI.yml index f5abe98..e5f4d36 100644 --- a/.github/workflows/manual_tests_MPI.yml +++ b/.github/workflows/manual_tests_MPI.yml @@ -29,16 +29,16 @@ jobs: run: | conda install -c conda-forge openmpi conda install -c conda-forge mpi4py - - name: pip install - run: | - pip install wakis['notebook'] - - name: Print versions run: conda list - name: Checkout wakis uses: actions/checkout@v4 with: path: wakis + - name: pip install + run: | + cd wakis + pip install .[notebook,tests] - name: Run pytest run: | cd wakis diff --git a/.github/workflows/nightly_codecov_CPU.yml b/.github/workflows/nightly_codecov_CPU.yml index 8a295a6..b2eb781 100644 --- a/.github/workflows/nightly_codecov_CPU.yml +++ b/.github/workflows/nightly_codecov_CPU.yml @@ -24,16 +24,16 @@ jobs: with: miniforge-version: latest python-version: "3.10" - - name: pip install - run: | - pip install wakis['notebook'] - pip install pytest pytest-cov - name: Print versions run: conda list - name: Checkout wakis uses: actions/checkout@v4 with: path: wakis + - name: pip install + run: | + cd wakis + pip install .[notebook,tests] - name: Run pytest run: | cd wakis diff --git a/.github/workflows/nightly_tests_CPU.yml b/.github/workflows/nightly_tests_CPU.yml index a39594d..7ce31f2 100644 --- a/.github/workflows/nightly_tests_CPU.yml +++ b/.github/workflows/nightly_tests_CPU.yml @@ -25,17 +25,18 @@ jobs: with: miniforge-version: latest python-version: "3.10" - - name: pip install - run: | - pip install wakis['notebook'] - pip uninstall vtk -y - pip install --extra-index-url https://wheels.vtk.org vtk-osmesa - name: Print versions run: conda list - name: Checkout wakis uses: actions/checkout@v4 with: path: wakis + - name: pip install + run: | + cd wakis + pip install .[notebook,tests] + pip uninstall vtk -y + pip install --extra-index-url https://wheels.vtk.org vtk-osmesa - name: Run pytest run: | cd wakis diff --git a/.github/workflows/pull_request_CPU.yml b/.github/workflows/pull_request_CPU.yml index f361773..2017169 100644 --- a/.github/workflows/pull_request_CPU.yml +++ b/.github/workflows/pull_request_CPU.yml @@ -31,7 +31,7 @@ jobs: - name: Install wakis run: | cd wakis - pip install .['notebook'] + pip install .[notebook,tests] pip uninstall vtk -y pip install --extra-index-url https://wheels.vtk.org vtk-osmesa diff --git a/.github/workflows/pull_request_MPI.yml b/.github/workflows/pull_request_MPI.yml index c0dede8..5cb34be 100644 --- a/.github/workflows/pull_request_MPI.yml +++ b/.github/workflows/pull_request_MPI.yml @@ -24,26 +24,25 @@ jobs: # Steps represent a sequence of tasks that will be executed as part of the job steps: - - name: Checkout repository - uses: actions/checkout@v4 - with: - path: wakis - - name: Setup Miniforge - uses: conda-incubator/setup-miniconda@v2 - with: - miniforge-version: latest - python-version: "3.11" - - name: mpi install - run: | - conda install -c conda-forge openmpi - conda install -c conda-forge mpi4py - - name: pip install - run: | - cd wakis - pip install .['notebook'] - - name: Print versions - run: conda list - - name: Run pytest - run: | - cd wakis - mpiexec -n 2 python -m pytest --color=yes -v -s tests/test_007_mpi_lossy_cavity.py + - name: Checkout repository + uses: actions/checkout@v4 + with: + path: wakis + - name: Setup Miniforge + uses: conda-incubator/setup-miniconda@v2 + with: + miniforge-version: latest + python-version: "3.11" + - name: mpi install + run: | + conda install -c conda-forge openmpi mpi4py + - name: pip install + run: | + cd wakis + pip install .[notebook,tests] + - name: Print versions + run: conda list + - name: Run pytest + run: | + cd wakis + mpiexec -n 2 python -m pytest --color=yes -v -s tests/test_007_mpi_lossy_cavity.py diff --git a/.gitignore b/.gitignore index f0f746a..5583995 100644 --- a/.gitignore +++ b/.gitignore @@ -21,4 +21,16 @@ ECT_* *.PNG _build/ dist/ -wakis.egg-info/ \ No newline at end of file +wakis.egg-info/ +.venv +.coverage +coverage.xml +*.pyc +*.pyo +*.pyd +*.so +.Python +*.ipynb_checkpoints +htmlcov/ +uv.lock +build \ No newline at end of file diff --git a/MANIFEST.in b/MANIFEST.in index 33576ac..346766b 100644 --- a/MANIFEST.in +++ b/MANIFEST.in @@ -4,7 +4,4 @@ include pyproject.toml include *.md # Include the license file -include LICENSE.txt - -# Include requirements -include requirements.txt \ No newline at end of file +include LICENSE diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..42a7e60 --- /dev/null +++ b/Makefile @@ -0,0 +1,52 @@ +# wakis Makefile + + +# Colors for output +RED := \033[0;31m +GREEN := \033[0;32m +YELLOW := \033[1;33m +NC := \033[0m # No Color + +.PHONY: help install install-gpu clean docs + +# Based on https://gist.github.com/prwhite/8168133?permalink_comment_id=4718682#gistcomment-4718682 + +## (Default) Print listing of key targets with their descriptions +help: + @printf "\n\033[1;33mwakis Makefile\033[0m\n" + @printf "\n\033[1;34mUsage:\033[0m \033[1;33mmake \033[0m\n\n" + @awk '\ + /^## / { \ + desc = substr($$0, 4); \ + getline nextline; \ + if (match(nextline, /^([a-zA-Z0-9._-]+):/)) { \ + target = substr(nextline, RSTART, RLENGTH-1); \ + printf " \033[34m%-20s\033[0m %s\n", target, desc; \ + } \ + } \ + ' $(MAKEFILE_LIST) + +## Install Python dependencies +install: + @echo -e "Installing Python dependencies..." + @pip install -e .[full] + +## Install Python dependencies +install-gpu: + @echo -e "Installing Python dependencies with GPU support..." + @pip install -e .[full-gpu] + +## Remove temporary and generated files +clean: + @echo -e "Cleaning up directory..." + @rm -rf __pycache__ .ruff_cache .pytest_cache *.egg-info .html *.html coverage.xml .coverage .mypy_cache results + @ cd docs && make -s clean + + +## Run Python tests +test: + pytest -s + +## Build documentation +docs: + cd docs && make html diff --git a/README.md b/README.md index 8fba629..a6e302a 100644 --- a/README.md +++ b/README.md @@ -99,8 +99,7 @@ Create a dedicated **conda environment** and install dependencies: cd wakis/ conda create --name wakis-env python=3.11 conda activate wakis-env -pip install -r requirements.txt -pip install -e . # install wakis in editable mode +pip install -e .[notebook, tests, docs] # install wakis in editable mode pip install neffint iddefix bihc # Optional tools ``` 🛠️ **Want to contribute?** To merge your changes into `main`, create a **Pull Request (PR)** following our [PR template](https://github.com/ImpedanCEI/wakis/blob/main/.github/pull_request_template.md). diff --git a/docs/conf.py b/docs/conf.py index 9097da8..93cef14 100644 --- a/docs/conf.py +++ b/docs/conf.py @@ -10,71 +10,74 @@ # add these directories to sys.path here. If the directory is relative to the # documentation root, use os.path.abspath to make it absolute, like shown here. # -import sys, os -sys.path.insert(0, os.path.abspath('../../wakis/')) -#sys.path.insert(0, os.path.abspath("../wakis")) +import sys +import os + +sys.path.insert(0, os.path.abspath("../../wakis/")) +# sys.path.insert(0, os.path.abspath("../wakis")) sys.path.insert(0, os.path.abspath("../")) -sys.path.append(os.path.abspath('..')) +sys.path.append(os.path.abspath("..")) # -- Project information ----------------------------------------------------- -project = 'wakis' -copyright = '2024, CERN, BE-ABP-CEI' -author = 'Elena de la Fuente, Lorenzo Giacomel, Giovanni Iadarola, Carlo Zannini' +project = "wakis" +copyright = "2024, CERN, BE-ABP-CEI" +author = "Elena de la Fuente, Lorenzo Giacomel, Giovanni Iadarola, Carlo Zannini" # The full version, including alpha/beta/rc tags -release = '1.0' +release = "1.0" # -- General configuration --------------------------------------------------- # Add any Sphinx extension module names here, as strings. They can be # extensions coming with Sphinx (named 'sphinx.ext.*') or your custom # ones. -extensions = ['sphinx.ext.autodoc', - 'sphinx.ext.autosummary', - 'sphinx.ext.doctest', - 'sphinx.ext.extlinks', - 'sphinx.ext.intersphinx', - 'sphinx.ext.mathjax', #for eqs - 'sphinx.ext.napoleon', - 'sphinx.ext.todo', - 'sphinx.ext.viewcode', - 'sphinx.ext.githubpages', - 'sphinx_copybutton', - #'sphinxemoji', - 'myst_parser', #for markdown - 'sphinx_design', - 'sphinx_last_updated_by_git', -] - -autodoc_preserve_defaults = True #preserves default args as in source code +extensions = [ + "sphinx.ext.autodoc", + "sphinx.ext.autosummary", + "sphinx.ext.doctest", + "sphinx.ext.extlinks", + "sphinx.ext.intersphinx", + "sphinx.ext.mathjax", # for eqs + "sphinx.ext.napoleon", + "sphinx.ext.todo", + "sphinx.ext.viewcode", + "sphinx.ext.githubpages", + "sphinx_copybutton", + #'sphinxemoji', + "myst_parser", # for markdown + "sphinx_design", + "sphinx_last_updated_by_git", +] + +autodoc_preserve_defaults = True # preserves default args as in source code # Add any paths that contain templates here, relative to this directory. -templates_path = ['_templates'] -myst_enable_extensions = ["dollarmath","html_admonition", "colon_fence"] -#myst_enable_extensions = ["deflist", "dollarmath"] +templates_path = ["_templates"] +myst_enable_extensions = ["dollarmath", "html_admonition", "colon_fence"] +# myst_enable_extensions = ["deflist", "dollarmath"] # The suffix of source filenames. source_suffix = { - '.rst': 'restructuredtext', - '.md': 'markdown', + ".rst": "restructuredtext", + ".md": "markdown", } # List of patterns, relative to source directory, that match files and # directories to ignore when looking for source files. # This pattern also affects html_static_path and html_extra_path. -exclude_patterns = ['_build', 'Thumbs.db', '.DS_Store'] +exclude_patterns = ["_build", "Thumbs.db", ".DS_Store"] # The master toctree document. -master_doc = 'index' +master_doc = "index" # General information about the project. -#project = u'wakis' -#copyright = u'2024, CERN, BE-ABP-CEI' +# project = u'wakis' +# copyright = u'2024, CERN, BE-ABP-CEI' # The name of the Pygments (syntax highlighting) style to use. -pygments_style = 'sphinx' +pygments_style = "sphinx" # -- Options for HTML output ------------------------------------------------- @@ -82,15 +85,15 @@ # The theme to use for HTML and HTML Help pages. See the documentation for # a list of builtin themes. # -html_theme = 'sphinx_rtd_theme' -html_static_path = ['img'] +html_theme = "sphinx_rtd_theme" +html_static_path = ["img"] html_logo = "img/wakis-logo-pinkwhite.png" html_theme_options = { - 'logo_only': True, - 'home_page_in_toc': True, - 'display_version': False, - 'collapse_navigation': False, - 'navigation_depth': 1, + "logo_only": True, + "home_page_in_toc": True, + "display_version": False, + "collapse_navigation": False, + "navigation_depth": 1, } # Add any paths that contain custom static files (such as style sheets) here, @@ -99,50 +102,48 @@ # html_static_path = ['_static'] # Output file base name for HTML help builder. -htmlhelp_basename = 'ReadtheDocsTemplatedoc' +htmlhelp_basename = "ReadtheDocsTemplatedoc" # -- Options for LaTeX output --------------------------------------------- latex_elements = { -# The paper size ('letterpaper' or 'a4paper'). -#'papersize': 'letterpaper', - -# The font size ('10pt', '11pt' or '12pt'). -#'pointsize': '10pt', - -# Additional stuff for the LaTeX preamble. -#'preamble': '', + # The paper size ('letterpaper' or 'a4paper'). + #'papersize': 'letterpaper', + # The font size ('10pt', '11pt' or '12pt'). + #'pointsize': '10pt', + # Additional stuff for the LaTeX preamble. + #'preamble': '', } # Grouping the document tree into LaTeX files. List of tuples # (source start file, target name, title, # author, documentclass [howto, manual, or own class]). -''' +""" latex_documents = [ ('index', 'ReadtheDocsTemplate.tex', u'Read the Docs Template Documentation', u'Read the Docs', 'manual'), ] -''' +""" # The name of an image file (relative to this directory) to place at the top of # the title page. -#latex_logo = None +# latex_logo = None # For "manual" documents, if this is true, then toplevel headings are parts, # not chapters. -#latex_use_parts = False +# latex_use_parts = False # If true, show page references after internal links. -#latex_show_pagerefs = False +# latex_show_pagerefs = False # If true, show URL addresses after external links. -#latex_show_urls = False +# latex_show_urls = False # Documents to append as an appendix to all manuals. -#latex_appendices = [] +# latex_appendices = [] # If false, no module index is generated. -#latex_domain_indices = True +# latex_domain_indices = True # -- Options for Texinfo output ------------------------------------------- @@ -150,24 +151,24 @@ # Grouping the document tree into Texinfo files. List of tuples # (source start file, target name, title, author, # dir menu entry, description, category) -''' +""" texinfo_documents = [ ('index', 'ReadtheDocsTemplate', u'Read the Docs Template Documentation', u'Read the Docs', 'ReadtheDocsTemplate', 'One line description of project.', 'Miscellaneous'), ] -''' +""" # Documents to append as an appendix to all manuals. -#texinfo_appendices = [] +# texinfo_appendices = [] # If false, no module index is generated. -#texinfo_domain_indices = True +# texinfo_domain_indices = True # How to display URL addresses: 'footnote', 'no', or 'inline'. -#texinfo_show_urls = 'footnote' +# texinfo_show_urls = 'footnote' # If true, do not generate a @detailmenu in the "Top" node's menu. -#texinfo_no_detailmenu = False +# texinfo_no_detailmenu = False -# -- Extension configuration ------------------------------------------------- \ No newline at end of file +# -- Extension configuration ------------------------------------------------- diff --git a/docs/installation.md b/docs/installation.md index 1dcfd2c..07bf8df 100644 --- a/docs/installation.md +++ b/docs/installation.md @@ -2,7 +2,7 @@ This section covers how to install `wakis` package for developers and users. -The installation guide is writen for Linux, but `wakis` code and dependencies are 100% python so it can run in other operating systems. For developers using Windows, we recommend checking the [WSL setup guide](https://learn.microsoft.com/en-us/windows/wsl/install) to install and setup the Windows subsystem for linux. +The installation guide is written for Linux, but `wakis` code and dependencies are 100% python, so it can run in other operating systems. For developers using Windows, we recommend checking the [WSL setup guide](https://learn.microsoft.com/en-us/windows/wsl/install) to install and set up the Windows subsystem for linux. ```{contents} :depth: 3 @@ -29,19 +29,34 @@ git clone git@github.com:ImpedanCEI/wakis.git git clone https://github.com/ImpedanCEI/wakis.git ``` -On a previously created conda environment, one can proceed installing the dependencies. On `wakis` main directory do: +On a previously created conda environment, one can proceed installing the dependencies. On `wakis` main directory do: ``` -pip install -r requirements.txt +pip install .[full] ``` -You can also pip install wakis on editable mode [RECOMMENDED]: +You may also want to install the GPU dependencies, see [GPU setup](#gpu-setup): + + +``` +pip install .[full-gpu] +``` + + + + +You can also pip install wakis in editable mode [RECOMMENDED]: ``` git clone git@github.com:ImpedanCEI/wakis.git cd wakis -pip install -e . +pip install -e .[full] +``` + +To use the GPU setup run: +``` +pip install -e .[full-gpu] ``` -If you would like to improve and push changes to `wakis`, we encorage to create a [fork](https://github.com/ImpedanCEI/wakis/fork) from wakis' `main` branch: https://github.com/ImpedanCEI/wakis on your personal GitHub. +If you would like to improve and push changes to `wakis`, we encourage to create a [fork](https://github.com/ImpedanCEI/wakis/fork) from wakis' `main` branch: https://github.com/ImpedanCEI/wakis on your personal GitHub. To contribute, first fork the repository, create a new branch, and submit a pull request. Step-by-step: @@ -55,7 +70,7 @@ To contribute, first fork the repository, create a new branch, and submit a pull ## Dependencies -`wakis` is a 100% pyhton code that relies only on a few renowed python packages: +`wakis` is a 100% pyhton code that relies only on a few renowned python packages: * `numpy`: Used for numerical operations, especially for matrix operations. * `scipy`: Provides additional functionality for sparse matrices and other scientific computations. @@ -64,15 +79,15 @@ To contribute, first fork the repository, create a new branch, and submit a pull * `tqdm`: This package is used for displaying progress bars in loops. * `pyvista`: For handling and visualizing 3D CAD geometries and vtk-based 3D plotting. -To install only the dependencies in a conda python environment, simply run: +To install wakis and the dependencies in a conda python environment, simply run: ``` -pip install -r requirements.txt +pip install -e .[] ``` ## Python installation -If a python installation has not been setup yet, we recommend using [miniforge](https://conda-forge.org/download/) (free of license) or [miniconda](https://docs.anaconda.com/free/miniconda/index.html) [^2]. +If a python installation has not been setup yet, we recommend using [miniforge](https://conda-forge.org/download/) (free of licence) or [miniconda](https://docs.anaconda.com/free/miniconda/index.html) [^2]. Miniforge executable can be obtained from the website (Windows/Linux) [https://conda-forge.org/download/](https://conda-forge.org/download/), or from the terminal (Linux): diff --git a/docs/requirements.txt b/docs/requirements.txt deleted file mode 100644 index 8e187b5..0000000 --- a/docs/requirements.txt +++ /dev/null @@ -1,13 +0,0 @@ -sphinx==5.0.0 -sphinx_rtd_theme==1.0.0 -readthedocs-sphinx-search==0.1.1 -sphinx-copybutton -myst-parser>=0.18.1 -sphinx-design -numpy>=1.21.0 -scipy>=1.7.0 -matplotlib>=3.4.0 -pyvista>=0.32.0 -h5py>=3.6.0 -tqdm>=4.62.0 -sphinx-last-updated-by-git \ No newline at end of file diff --git a/examples/001_CPU_wakefield_simulation.py b/examples/001_CPU_wakefield_simulation.py index 9d8c391..b7c01bf 100644 --- a/examples/001_CPU_wakefield_simulation.py +++ b/examples/001_CPU_wakefield_simulation.py @@ -5,29 +5,32 @@ # (!) If using MKL intel backend only import os -os.environ["MKL_NUM_THREADS"] = "1" # change the number of threads to be used in the simualtion + +os.environ["MKL_NUM_THREADS"] = ( + "1" # change the number of threads to be used in the simualtion +) import numpy as np import pyvista as pv import matplotlib.pyplot as plt from wakis import SolverFIT3D -from wakis import GridFIT3D +from wakis import GridFIT3D from wakis import WakeSolver +from matplotlib.colors import LinearSegmentedColormap # ---------- Domain setup --------- # Geometry & Materials -solid_1 = 'data/001_vacuum_cavity.stl' -solid_2 = 'data/001_lossymetal_shell.stl' +solid_1 = "data/001_vacuum_cavity.stl" +solid_2 = "data/001_lossymetal_shell.stl" -stl_solids = {'cavity': solid_1, - 'shell': solid_2 - } +stl_solids = {"cavity": solid_1, "shell": solid_2} -stl_materials = {'cavity': 'vacuum', - 'shell': [30, 1.0, 30] #[eps_r, mu_r, sigma[S/m]] - } +stl_materials = { + "cavity": "vacuum", + "shell": [30, 1.0, 30], # [eps_r, mu_r, sigma[S/m]] +} # BONUS: Visualize geometry - Uncomment for plotting! # pl = pv.Plotter() @@ -46,72 +49,93 @@ Nz = 141 # set grid and geometry -grid = GridFIT3D(xmin, xmax, ymin, ymax, zmin, zmax, - Nx, Ny, Nz, - stl_solids=stl_solids, - stl_materials=stl_materials, - stl_scale=1.0, - stl_rotate=[0,0,0], - stl_translate=[0,0,0], - verbose=1) +grid = GridFIT3D( + xmin, + xmax, + ymin, + ymax, + zmin, + zmax, + Nx, + Ny, + Nz, + stl_solids=stl_solids, + stl_materials=stl_materials, + stl_scale=1.0, + stl_rotate=[0, 0, 0], + stl_translate=[0, 0, 0], + verbose=1, +) # BONUS: Visualize grid - Uncomment for plotting! -grid.inspect(add_stl=['cavity', 'shell'], stl_opacity=1.0) +grid.inspect(add_stl=["cavity", "shell"], stl_opacity=1.0) # BONUS: Visualize imported solids - Uncomment for plotting! grid.plot_solids(bounding_box=True, opacity=1.0, specular=0.5, anti_aliasing=None) # ------------ Beam source & Wake ---------------- # Beam parameters -sigmaz = 10e-2 #[m] -> 2 GHz -q = 1e-9 #[C] -beta = 1.0 # beam beta -xs = 0. # x source position [m] -ys = 0. # y source position [m] -xt = 0. # x test position [m] -yt = 0. # y test position [m] -# [DEFAULT] tinj = 8.53*sigmaz/c_light # injection time offset [s] +sigmaz = 10e-2 # [m] -> 2 GHz +q = 1e-9 # [C] +beta = 1.0 # beam beta +xs = 0.0 # x source position [m] +ys = 0.0 # y source position [m] +xt = 0.0 # x test position [m] +yt = 0.0 # y test position [m] +# [DEFAULT] tinj = 8.53*sigmaz/c_light # injection time offset [s] # Simualtion -wakelength = 10. # [m] -add_space = 10 # no. cells to skip from boundaries - removes BC artifacts - -results_folder = '001_results_float64/' -wake = WakeSolver(q=q, - sigmaz=sigmaz, - beta=beta, - xsource=xs, ysource=ys, - xtest=xt, ytest=yt, - add_space=add_space, - results_folder=results_folder, - Ez_file=results_folder+'001_Ez.h5') +wakelength = 10.0 # [m] +add_space = 10 # no. cells to skip from boundaries - removes BC artifacts + +results_folder = "001_results_float64/" +wake = WakeSolver( + q=q, + sigmaz=sigmaz, + beta=beta, + xsource=xs, + ysource=ys, + xtest=xt, + ytest=yt, + add_space=add_space, + results_folder=results_folder, + Ez_file=results_folder + "001_Ez.h5", +) # ----------- Solver & Simulation ---------- # boundary conditions`` -bc_low=['pec', 'pec', 'pec'] -bc_high=['pec', 'pec', 'pec'] +bc_low = ["pec", "pec", "pec"] +bc_high = ["pec", "pec", "pec"] # on-the-fly plotting parameters -if not os.path.exists('001_img/'): - os.mkdir('001_img/') - -plotkw2D = {'title':'001_img/Ez', - 'add_patch':'cavity', 'patch_alpha':1.0, - 'patch_reverse' : True, # patch logical_not('cavity') - 'vmin':-1e3, 'vmax':1e3, # colormap limits - 'cmap': 'rainbow', - 'plane': [int(Nx/2), # x - slice(0, Ny), # y - slice(add_space, -add_space)]} # z +if not os.path.exists("001_img/"): + os.mkdir("001_img/") + +plotkw2D = { + "title": "001_img/Ez", + "add_patch": "cavity", + "patch_alpha": 1.0, + "patch_reverse": True, # patch logical_not('cavity') + "vmin": -1e3, + "vmax": 1e3, # colormap limits + "cmap": "rainbow", + "plane": [ + int(Nx / 2), # x + slice(0, Ny), # y + slice(add_space, -add_space), + ], +} # z # Solver setup -solver = SolverFIT3D(grid, wake, - bc_low=bc_low, - bc_high=bc_high, - use_stl=True, - bg='pec', # Background material - dtype=np.float64, # support for single-precision np.float32 - ) +solver = SolverFIT3D( + grid, + wake, + bc_low=bc_low, + bc_high=bc_high, + use_stl=True, + bg="pec", # Background material + dtype=np.float64, # support for single-precision np.float32 +) # BONUS: Inspect material tensors - Uncomment to show! # solver.ieps.inspect(plane='YZ', cmap='bwr', dpi=100) # [1/eps] permittivity tensor ^-1 @@ -125,80 +149,102 @@ # solver.J[:,10,10, 'x'] = 10 # introduces a line perturbation in Jx component of 10 A/m2 # Solver run -solver.wakesolve(wakelength=wakelength, - add_space=add_space, - plot=True, # turn False for speedup - plot_every=30, plot_until=3000, **plotkw2D - ) +solver.wakesolve( + wakelength=wakelength, + add_space=add_space, + plot=True, # turn False for speedup + plot_every=30, + plot_until=3000, + **plotkw2D, +) # ----------- 1d plot results -------------------- # Plot longitudinal wake potential and impedance -fig1, ax = plt.subplots(1,2, figsize=[12,4], dpi=150) -ax[0].plot(wake.s*1e2, wake.WP, c='r', lw=1.5, label='Wakis') -ax[0].set_xlabel('s [cm]') -ax[0].set_ylabel('Longitudinal wake potential [V/pC]', color='r') +fig1, ax = plt.subplots(1, 2, figsize=[12, 4], dpi=150) +ax[0].plot(wake.s * 1e2, wake.WP, c="r", lw=1.5, label="Wakis") +ax[0].set_xlabel("s [cm]") +ax[0].set_ylabel("Longitudinal wake potential [V/pC]", color="r") ax[0].legend() -ax[0].set_xlim(xmax=wakelength*1e2) +ax[0].set_xlim(xmax=wakelength * 1e2) -ax[1].plot(wake.f*1e-9, np.abs(wake.Z), c='b', lw=1.5, label='Wakis') -ax[1].set_xlabel('f [GHz]') -ax[1].set_ylabel('Longitudinal impedance [Abs][$\Omega$]', color='b') +ax[1].plot(wake.f * 1e-9, np.abs(wake.Z), c="b", lw=1.5, label="Wakis") +ax[1].set_xlabel("f [GHz]") +ax[1].set_ylabel("Longitudinal impedance [Abs][$\Omega$]", color="b") ax[1].legend() fig1.tight_layout() -fig1.savefig(results_folder+'001_longitudinal.png') +fig1.savefig(results_folder + "001_longitudinal.png") plt.show() # Plot transverse x wake potential and impedance -fig2, ax = plt.subplots(1,2, figsize=[12,4], dpi=150) -ax[0].plot(wake.s*1e2, wake.WPx, c='r', lw=1.5, label='Wakis') -ax[0].set_xlabel('s [cm]') -ax[0].set_ylabel('Transverse wake potential X [V/pC]', color='r') +fig2, ax = plt.subplots(1, 2, figsize=[12, 4], dpi=150) +ax[0].plot(wake.s * 1e2, wake.WPx, c="r", lw=1.5, label="Wakis") +ax[0].set_xlabel("s [cm]") +ax[0].set_ylabel("Transverse wake potential X [V/pC]", color="r") ax[0].legend() -ax[0].set_xlim(xmax=wakelength*1e2) +ax[0].set_xlim(xmax=wakelength * 1e2) -ax[1].plot(wake.f*1e-9, np.abs(wake.Zx), c='b', lw=1.5, label='Wakis') -ax[1].set_xlabel('f [GHz]') -ax[1].set_ylabel('Transverse impedance X [Abs][$\Omega$]', color='b') +ax[1].plot(wake.f * 1e-9, np.abs(wake.Zx), c="b", lw=1.5, label="Wakis") +ax[1].set_xlabel("f [GHz]") +ax[1].set_ylabel("Transverse impedance X [Abs][$\Omega$]", color="b") ax[1].legend() fig2.tight_layout() -fig2.savefig(results_folder+'001_transverse_x.png') +fig2.savefig(results_folder + "001_transverse_x.png") plt.show() # Plot transverse y wake potential and impedance -fig3, ax = plt.subplots(1,2, figsize=[12,4], dpi=150) -ax[0].plot(wake.s*1e2, wake.WPy, c='r', lw=1.5, label='Wakis') -ax[0].set_xlabel('s [cm]') -ax[0].set_ylabel('Transverse wake potential Y [V/pC]', color='r') +fig3, ax = plt.subplots(1, 2, figsize=[12, 4], dpi=150) +ax[0].plot(wake.s * 1e2, wake.WPy, c="r", lw=1.5, label="Wakis") +ax[0].set_xlabel("s [cm]") +ax[0].set_ylabel("Transverse wake potential Y [V/pC]", color="r") ax[0].legend() -ax[0].set_xlim(xmax=wakelength*1e2) +ax[0].set_xlim(xmax=wakelength * 1e2) -ax[1].plot(wake.f*1e-9, np.abs(wake.Zy), c='b', lw=1.5, label='Wakis') -ax[1].set_xlabel('f [GHz]') -ax[1].set_ylabel('Transverse impedance Y [Abs][$\Omega$]', color='b') +ax[1].plot(wake.f * 1e-9, np.abs(wake.Zy), c="b", lw=1.5, label="Wakis") +ax[1].set_xlabel("f [GHz]") +ax[1].set_ylabel("Transverse impedance Y [Abs][$\Omega$]", color="b") ax[1].legend() fig3.tight_layout() -fig3.savefig(results_folder+'001_transverse_y.png') +fig3.savefig(results_folder + "001_transverse_y.png") plt.show() # Plot Electric field component in 2D using imshow -solver.plot1D(field='E', component='z', - line='z', pos=0.5, xscale='linear', yscale='linear', - off_screen=True, title='001_img/Ez1d') +solver.plot1D( + field="E", + component="z", + line="z", + pos=0.5, + xscale="linear", + yscale="linear", + off_screen=True, + title="001_img/Ez1d", +) plt.show() # ----------- 2d plots results -------------------- -from matplotlib.colors import LinearSegmentedColormap -cmap = LinearSegmentedColormap.from_list('name', plt.cm.jet(np.linspace(0.1, 0.9))) # CST's colormap + +cmap = LinearSegmentedColormap.from_list( + "name", plt.cm.jet(np.linspace(0.1, 0.9)) +) # CST's colormap # Plot Electric field component in 2D using imshow -solver.plot2D(field='E', component='z', - plane='XY', pos=0.5, - cmap=cmap, vmin=-500, vmax=500., interpolation='hanning', - add_patch='cavity', patch_reverse=True, patch_alpha=0.8, - off_screen=True, title='001_img/Ez2d') +solver.plot2D( + field="E", + component="z", + plane="XY", + pos=0.5, + cmap=cmap, + vmin=-500, + vmax=500.0, + interpolation="hanning", + add_patch="cavity", + patch_reverse=True, + patch_alpha=0.8, + off_screen=True, + title="001_img/Ez2d", +) plt.show() @@ -208,16 +254,30 @@ # ----------- 3d plots results -------------------- # Plot Electric field component in 3D using pyvista.plotter -solver.plot3D('E', component='Abs', - cmap='rainbow', clim=[0, 500], - add_stl=['cavity', 'shell'], stl_opacity=0.1, - clip_interactive=True, clip_normal='-y') +solver.plot3D( + "E", + component="Abs", + cmap="rainbow", + clim=[0, 500], + add_stl=["cavity", "shell"], + stl_opacity=0.1, + clip_interactive=True, + clip_normal="-y", +) # Plot Abs Electric field on STL solid `cavity` -solver.plot3DonSTL('E', component='Abs', - cmap='rainbow', clim=[0, 500], - stl_with_field='cavity', field_opacity=1.0, - stl_transparent='shell', stl_opacity=0.1, stl_colors='white', - #clip_plane=True, clip_normal='-y', clip_origin=[0,0,0], #coming in v0.5.0 - off_screen=False, zoom=1.2, title='001_img/Ez3d') - \ No newline at end of file +solver.plot3DonSTL( + "E", + component="Abs", + cmap="rainbow", + clim=[0, 500], + stl_with_field="cavity", + field_opacity=1.0, + stl_transparent="shell", + stl_opacity=0.1, + stl_colors="white", + # clip_plane=True, clip_normal='-y', clip_origin=[0,0,0], #coming in v0.5.0 + off_screen=False, + zoom=1.2, + title="001_img/Ez3d", +) diff --git a/examples/002_GPU_wakefield_simulation.py b/examples/002_GPU_wakefield_simulation.py index fd083fb..ec6bd93 100644 --- a/examples/002_GPU_wakefield_simulation.py +++ b/examples/002_GPU_wakefield_simulation.py @@ -9,22 +9,22 @@ import matplotlib.pyplot as plt from wakis import SolverFIT3D -from wakis import GridFIT3D +from wakis import GridFIT3D from wakis import WakeSolver +from matplotlib.colors import LinearSegmentedColormap # ---------- Domain setup --------- # Geometry & Materials -solid_1 = 'data/001_vacuum_cavity.stl' -solid_2 = 'data/001_lossymetal_shell.stl' +solid_1 = "data/001_vacuum_cavity.stl" +solid_2 = "data/001_lossymetal_shell.stl" -stl_solids = {'cavity': solid_1, - 'shell': solid_2 - } +stl_solids = {"cavity": solid_1, "shell": solid_2} -stl_materials = {'cavity': 'vacuum', - 'shell': [30, 1.0, 30] #[eps_r, mu_r, sigma[S/m]] - } +stl_materials = { + "cavity": "vacuum", + "shell": [30, 1.0, 30], # [eps_r, mu_r, sigma[S/m]] +} # BONUS: Visualize geomEtry - Uncomment for plotting! # pl = pv.Plotter() @@ -43,14 +43,23 @@ Nz = 141 # set grid and geometry -grid = GridFIT3D(xmin, xmax, ymin, ymax, zmin, zmax, - Nx, Ny, Nz, - stl_solids=stl_solids, - stl_materials=stl_materials, - stl_scale=1.0, - stl_rotate=[0,0,0], - stl_translate=[0,0,0], - verbose=1) +grid = GridFIT3D( + xmin, + xmax, + ymin, + ymax, + zmin, + zmax, + Nx, + Ny, + Nz, + stl_solids=stl_solids, + stl_materials=stl_materials, + stl_scale=1.0, + stl_rotate=[0, 0, 0], + stl_translate=[0, 0, 0], + verbose=1, +) # BONUS: Visualize grid - Uncomment for plotting! # grid.inspect(add_stl=[solid_1, solid_2], @@ -59,54 +68,66 @@ # ------------ Beam source & Wake ---------------- # Beam parameters -sigmaz = 10e-2 #[m] -> 2 GHz -q = 1e-9 #[C] -beta = 1.0 # beam beta -xs = 0. # x source position [m] -ys = 0. # y source position [m] -xt = 0. # x test position [m] -yt = 0. # y test position [m] -# [DEFAULT] tinj = 8.53*sigmaz/c_light # injection time offset [s] +sigmaz = 10e-2 # [m] -> 2 GHz +q = 1e-9 # [C] +beta = 1.0 # beam beta +xs = 0.0 # x source position [m] +ys = 0.0 # y source position [m] +xt = 0.0 # x test position [m] +yt = 0.0 # y test position [m] +# [DEFAULT] tinj = 8.53*sigmaz/c_light # injection time offset [s] # Simualtion -wakelength = 10. # [m] -add_space = 10 # no. cells to skip from boundaries - removes BC artifacts - -wake = WakeSolver(q=q, - sigmaz=sigmaz, - beta=beta, - xsource=xs, ysource=ys, - xtest=xt, ytest=yt, - add_space=add_space, - results_folder='002_results/', - Ez_file='002_results/002_Ez.h5') +wakelength = 10.0 # [m] +add_space = 10 # no. cells to skip from boundaries - removes BC artifacts + +wake = WakeSolver( + q=q, + sigmaz=sigmaz, + beta=beta, + xsource=xs, + ysource=ys, + xtest=xt, + ytest=yt, + add_space=add_space, + results_folder="002_results/", + Ez_file="002_results/002_Ez.h5", +) # ----------- Solver & Simulation ---------- # boundary conditions`` -bc_low=['pec', 'pec', 'pec'] -bc_high=['pec', 'pec', 'pec'] +bc_low = ["pec", "pec", "pec"] +bc_high = ["pec", "pec", "pec"] # on-the-fly plotting parameters -if not os.path.exists('002_img/'): - os.mkdir('002_img/') - -plotkw2D = {'title':'002_img/Ez', - 'add_patch':'cavity', 'patch_alpha':1.0, - 'patch_reverse' : True, # patch logical_not('cavity') - 'vmin':-1e3, 'vmax':1e3, # colormap limits - 'cmap': 'rainbow', - 'plane': [int(Nx/2), # x - slice(0, Ny), # y - slice(add_space, -add_space)]} # z +if not os.path.exists("002_img/"): + os.mkdir("002_img/") + +plotkw2D = { + "title": "002_img/Ez", + "add_patch": "cavity", + "patch_alpha": 1.0, + "patch_reverse": True, # patch logical_not('cavity') + "vmin": -1e3, + "vmax": 1e3, # colormap limits + "cmap": "rainbow", + "plane": [ + int(Nx / 2), # x + slice(0, Ny), # y + slice(add_space, -add_space), + ], +} # z # Solver setup -solver = SolverFIT3D(grid, wake, - bc_low=bc_low, - bc_high=bc_high, - use_stl=True, - bg='pec', # Background material - use_gpu=True, #Turn on GPU acceleration! - ) +solver = SolverFIT3D( + grid, + wake, + bc_low=bc_low, + bc_high=bc_high, + use_stl=True, + bg="pec", # Background material + use_gpu=True, # Turn on GPU acceleration! +) # BONUS: Inspect material tensors - Uncomment to show! # solver.ieps.inspect(plane='YZ', cmap='bwr', dpi=100) # [1/eps] permittivity tensor ^-1 @@ -120,85 +141,105 @@ # solver.J[:,10,10, 'x'] = 10 # introduces a line perturbation in Jx component of 10 A/m2 # Solver run -solver.wakesolve(wakelength=wakelength, - add_space=add_space, - plot=False, # turn False for speedup - plot_every=30, plot_until=3000, **plotkw2D - ) +solver.wakesolve( + wakelength=wakelength, + add_space=add_space, + plot=False, # turn False for speedup + plot_every=30, + plot_until=3000, + **plotkw2D, +) # ----------- 1d plot results -------------------- # Plot longitudinal wake potential and impedance -fig1, ax = plt.subplots(1,2, figsize=[12,4], dpi=150) -ax[0].plot(wake.s*1e2, wake.WP, c='r', lw=1.5, label='Wakis') -ax[0].set_xlabel('s [cm]') -ax[0].set_ylabel('Longitudinal wake potential [V/pC]', color='r') +fig1, ax = plt.subplots(1, 2, figsize=[12, 4], dpi=150) +ax[0].plot(wake.s * 1e2, wake.WP, c="r", lw=1.5, label="Wakis") +ax[0].set_xlabel("s [cm]") +ax[0].set_ylabel("Longitudinal wake potential [V/pC]", color="r") ax[0].legend() -ax[0].set_xlim(xmax=wakelength*1e2) +ax[0].set_xlim(xmax=wakelength * 1e2) -ax[1].plot(wake.f*1e-9, np.abs(wake.Z), c='b', lw=1.5, label='Wakis') -ax[1].set_xlabel('f [GHz]') -ax[1].set_ylabel('Longitudinal impedance [Abs][$\Omega$]', color='b') +ax[1].plot(wake.f * 1e-9, np.abs(wake.Z), c="b", lw=1.5, label="Wakis") +ax[1].set_xlabel("f [GHz]") +ax[1].set_ylabel("Longitudinal impedance [Abs][$\Omega$]", color="b") ax[1].legend() fig1.tight_layout() -fig1.savefig('002_results/002_longitudinal.png') -#plt.show() +fig1.savefig("002_results/002_longitudinal.png") +# plt.show() # Plot transverse x wake potential and impedance -fig2, ax = plt.subplots(1,2, figsize=[12,4], dpi=150) -ax[0].plot(wake.s*1e2, wake.WPx, c='r', lw=1.5, label='Wakis') -ax[0].set_xlabel('s [cm]') -ax[0].set_ylabel('Transverse wake potential X [V/pC]', color='r') +fig2, ax = plt.subplots(1, 2, figsize=[12, 4], dpi=150) +ax[0].plot(wake.s * 1e2, wake.WPx, c="r", lw=1.5, label="Wakis") +ax[0].set_xlabel("s [cm]") +ax[0].set_ylabel("Transverse wake potential X [V/pC]", color="r") ax[0].legend() -ax[0].set_xlim(xmax=wakelength*1e2) +ax[0].set_xlim(xmax=wakelength * 1e2) -ax[1].plot(wake.f*1e-9, np.abs(wake.Zx), c='b', lw=1.5, label='Wakis') -ax[1].set_xlabel('f [GHz]') -ax[1].set_ylabel('Transverse impedance X [Abs][$\Omega$]', color='b') +ax[1].plot(wake.f * 1e-9, np.abs(wake.Zx), c="b", lw=1.5, label="Wakis") +ax[1].set_xlabel("f [GHz]") +ax[1].set_ylabel("Transverse impedance X [Abs][$\Omega$]", color="b") ax[1].legend() fig2.tight_layout() -fig2.savefig('002_results/002_transverse_x.png') -#plt.show() +fig2.savefig("002_results/002_transverse_x.png") +# plt.show() # Plot transverse y wake potential and impedance -fig3, ax = plt.subplots(1,2, figsize=[12,4], dpi=150) -ax[0].plot(wake.s*1e2, wake.WPy, c='r', lw=1.5, label='Wakis') -ax[0].set_xlabel('s [cm]') -ax[0].set_ylabel('Transverse wake potential Y [V/pC]', color='r') +fig3, ax = plt.subplots(1, 2, figsize=[12, 4], dpi=150) +ax[0].plot(wake.s * 1e2, wake.WPy, c="r", lw=1.5, label="Wakis") +ax[0].set_xlabel("s [cm]") +ax[0].set_ylabel("Transverse wake potential Y [V/pC]", color="r") ax[0].legend() -ax[0].set_xlim(xmax=wakelength*1e2) +ax[0].set_xlim(xmax=wakelength * 1e2) -ax[1].plot(wake.f*1e-9, np.abs(wake.Zy), c='b', lw=1.5, label='Wakis') -ax[1].set_xlabel('f [GHz]') -ax[1].set_ylabel('Transverse impedance Y [Abs][$\Omega$]', color='b') +ax[1].plot(wake.f * 1e-9, np.abs(wake.Zy), c="b", lw=1.5, label="Wakis") +ax[1].set_xlabel("f [GHz]") +ax[1].set_ylabel("Transverse impedance Y [Abs][$\Omega$]", color="b") ax[1].legend() fig3.tight_layout() -fig3.savefig('002_results/002_transverse_y.png') -#plt.show() +fig3.savefig("002_results/002_transverse_y.png") +# plt.show() # Plot Electric field component in 2D using imshow -solver.plot1D(field='E', component='z', - line='z', pos=0.5, xscale='linear', yscale='linear', - off_screen=True, title='002_img/Ez1d') -#plt.show() +solver.plot1D( + field="E", + component="z", + line="z", + pos=0.5, + xscale="linear", + yscale="linear", + off_screen=True, + title="002_img/Ez1d", +) +# plt.show() # ----------- 2d plots results -------------------- -from matplotlib.colors import LinearSegmentedColormap -cmap = LinearSegmentedColormap.from_list('name', plt.cm.jet(np.linspace(0.1, 0.9))) # CST's colormap + +cmap = LinearSegmentedColormap.from_list( + "name", plt.cm.jet(np.linspace(0.1, 0.9)) +) # CST's colormap # Plot Electric field component in 2D using imshow -solver.plot2D(field='E', component='z', - plane='XY', pos=0.5, - cmap=cmap, vmin=-500, vmax=500., interpolation='hanning', - add_patch='cavity', patch_reverse=True, patch_alpha=0.8, - off_screen=True, title='002_img/Ez2d') -#plt.show() +solver.plot2D( + field="E", + component="z", + plane="XY", + pos=0.5, + cmap=cmap, + vmin=-500, + vmax=500.0, + interpolation="hanning", + add_patch="cavity", + patch_reverse=True, + patch_alpha=0.8, + off_screen=True, + title="002_img/Ez2d", +) +# plt.show() # BONUS: Generate an animation from the plots generated during the simulation # Needs imagemagick package -> `apt install imagemagick` # os.system('convert -loop 0 -delay 5 002_img/Ez_*.png 002_img/Ez_sim.gif') - - \ No newline at end of file diff --git a/examples/003_MPI_wakefield_simulation.py b/examples/003_MPI_wakefield_simulation.py index 6a0e65d..c5c3bae 100644 --- a/examples/003_MPI_wakefield_simulation.py +++ b/examples/003_MPI_wakefield_simulation.py @@ -13,14 +13,15 @@ import matplotlib.pyplot as plt from mpl_toolkits.axes_grid1 import make_axes_locatable -import sys -sys.path.append('../') - from wakis import SolverFIT3D from wakis import GridFIT3D from wakis import WakeSolver from tqdm import tqdm +from wakis.sources import Beam +from scipy.constants import c + +from matplotlib.colors import LinearSegmentedColormap # ---------- MPI setup ------------ # can be skipped since it is handled inside GridFIT3D @@ -33,16 +34,15 @@ # ---------- Domain setup --------- # Geometry & Materials -solid_1 = 'data/001_vacuum_cavity.stl' -solid_2 = 'data/001_lossymetal_shell.stl' +solid_1 = "data/001_vacuum_cavity.stl" +solid_2 = "data/001_lossymetal_shell.stl" -stl_solids = {'cavity': solid_1, - 'shell': solid_2 - } +stl_solids = {"cavity": solid_1, "shell": solid_2} -stl_materials = {'cavity': 'vacuum', - 'shell': [30, 1.0, 30] #[eps_r, mu_r, sigma[S/m]] - } +stl_materials = { + "cavity": "vacuum", + "shell": [30, 1.0, 30], # [eps_r, mu_r, sigma[S/m]] +} # Extract domain bounds from geometry solids = pv.read(solid_1) + pv.read(solid_2) @@ -53,51 +53,60 @@ Ny = 80 NZ = 140 -grid = GridFIT3D(xmin, xmax, ymin, ymax, ZMIN, ZMAX, - Nx, Ny, NZ, - use_mpi=True, # Enables MPI subdivision of the domain - stl_solids=stl_solids, - stl_materials=stl_materials, - stl_scale=1.0, - stl_rotate=[0,0,0], - stl_translate=[0,0,0], - verbose=1) - -print(f"Process {rank}: Handling Z range {grid.zmin} to {grid.zmax} with {grid.Nz} cells") +grid = GridFIT3D( + xmin, + xmax, + ymin, + ymax, + ZMIN, + ZMAX, + Nx, + Ny, + NZ, + use_mpi=True, # Enables MPI subdivision of the domain + stl_solids=stl_solids, + stl_materials=stl_materials, + stl_scale=1.0, + stl_rotate=[0, 0, 0], + stl_translate=[0, 0, 0], + verbose=1, +) + +print( + f"Process {rank}: Handling Z range {grid.zmin} to {grid.zmax} with {grid.Nz} cells" +) # ------------ Beam source & Wake ---------------- # Beam parameters -sigmaz = 10e-2 #[m] -> 2 GHz -q = 1e-9 #[C] -beta = 1.0 # beam beta -xs = 0. # x source position [m] -ys = 0. # y source position [m] -xt = 0. # x test position [m] -yt = 0. # y test position [m] +sigmaz = 10e-2 # [m] -> 2 GHz +q = 1e-9 # [C] +beta = 1.0 # beam beta +xs = 0.0 # x source position [m] +ys = 0.0 # y source position [m] +xt = 0.0 # x test position [m] +yt = 0.0 # y test position [m] # [DEFAULT] tinj = 8.53*sigmaz/c_light # injection time offset [s] -from wakis.sources import Beam -from scipy.constants import c -beam = Beam(q=q, sigmaz=sigmaz, beta=beta, - xsource=xs, ysource=ys, ti=3*sigmaz/c) +beam = Beam(q=q, sigmaz=sigmaz, beta=beta, xsource=xs, ysource=ys, ti=3 * sigmaz / c) -results_folder = f'003_results_n{rank}/' +results_folder = f"003_results_n{rank}/" # ----------- Solver & Simulation ---------- # boundary conditions -bc_low=['pec', 'pec', 'pec'] -bc_high=['pec', 'pec', 'pec'] +bc_low = ["pec", "pec", "pec"] +bc_high = ["pec", "pec", "pec"] # Solver setup -solver = SolverFIT3D(grid, - bc_low=bc_low, - bc_high=bc_high, - use_stl=True, - use_mpi=True, # Activate MPI - bg='pec' # Background material - ) - -img_folder = '003_img/' +solver = SolverFIT3D( + grid, + bc_low=bc_low, + bc_high=bc_high, + use_stl=True, + use_mpi=True, # Activate MPI + bg="pec", # Background material +) + +img_folder = "003_img/" if not os.path.exists(img_folder): os.mkdir(img_folder) @@ -113,151 +122,199 @@ plot_1D = False for n in tqdm(range(Nt)): - - beam.update(solver, n*solver.dt) + beam.update(solver, n * solver.dt) solver.mpi_one_step() # Plot inspect every 20 timesteps - if n%20 == 0 and plot_inspect: - E = solver.mpi_gather_asField('E') + if n % 20 == 0 and plot_inspect: + E = solver.mpi_gather_asField("E") if rank == 0: - fig, ax = E.inspect(figsize=[20,6], plane='YZ', show=False, handles=True) - fig.savefig(img_folder+'Einspect_'+str(n).zfill(4)+'.png') + fig, ax = E.inspect( + figsize=[20, 6], plane="YZ", show=False, handles=True + ) + fig.savefig(img_folder + "Einspect_" + str(n).zfill(4) + ".png") plt.close(fig) # Plot E abs in 2D every 20 timesteps - if n%20 == 0 and plot_2D: - solver.plot2D(field='E', component='Abs', - plane='YZ', pos=0.5, - cmap='rainbow', vmin=0, vmax=500., interpolation='hanning', - off_screen=True, title=img_folder+'Ez2d', n=n) + if n % 20 == 0 and plot_2D: + solver.plot2D( + field="E", + component="Abs", + plane="YZ", + pos=0.5, + cmap="rainbow", + vmin=0, + vmax=500.0, + interpolation="hanning", + off_screen=True, + title=img_folder + "Ez2d", + n=n, + ) # Plot E z in 1D at diferent transverse positions `pos` every 20 timesteps - if n%20 == 0 and plot_1D: - solver.plot1D(field='E', component='z', - line='z', pos=[0.45, 0.5, 0.55], - xscale='linear', yscale='linear', - off_screen=True, title=img_folder+'Ez1d', n=n) + if n % 20 == 0 and plot_1D: + solver.plot1D( + field="E", + component="z", + line="z", + pos=[0.45, 0.5, 0.55], + xscale="linear", + yscale="linear", + off_screen=True, + title=img_folder + "Ez1d", + n=n, + ) # -------------- using Wakefield routine ----------------- run_wakefield = False if run_wakefield: - # ------------ Beam source ---------------- # Beam parameters - sigmaz = 10e-2 #[m] -> 2 GHz - q = 1e-9 #[C] - beta = 1.0 # beam beta - xs = 0. # x source position [m] - ys = 0. # y source position [m] - xt = 0. # x test position [m] - yt = 0. # y test position [m] + sigmaz = 10e-2 # [m] -> 2 GHz + q = 1e-9 # [C] + beta = 1.0 # beam beta + xs = 0.0 # x source position [m] + ys = 0.0 # y source position [m] + xt = 0.0 # x test position [m] + yt = 0.0 # y test position [m] # [DEFAULT] tinj = 8.53*sigmaz/c_light # injection time offset [s] - # ----------- Wake Solver setup ---------- # Wakefield post-processor - wakelength = 10. # [m] -> Partially decayed + wakelength = 10.0 # [m] -> Partially decayed skip_cells = 10 # no. cells to skip at zlo/zhi for wake integration - results_folder = '003_results/' - wake = WakeSolver(q=q, sigmaz=sigmaz, beta=beta, - xsource=xs, ysource=ys, xtest=xt, ytest=yt, - skip_cells=10, - results_folder=results_folder, - Ez_file=results_folder+'Ez.h5',) + results_folder = "003_results/" + wake = WakeSolver( + q=q, + sigmaz=sigmaz, + beta=beta, + xsource=xs, + ysource=ys, + xtest=xt, + ytest=yt, + skip_cells=10, + results_folder=results_folder, + Ez_file=results_folder + "Ez.h5", + ) # Reset fields solver.reset_fields() # Solver run - plotkw2D = {'title': img_folder+'Ez', - 'add_patch':'cavity', 'patch_alpha':1.0, - 'patch_reverse' : True, # patch logical_not('cavity') - 'vmin':-1e3, 'vmax':1e3, # colormap limits - 'cmap': 'rainbow', - 'plane': [int(Nx/2), # x - slice(0, Ny), # y - slice(skip_cells, -skip_cells)]} # z - - solver.wakesolve(wakelength=wakelength, - wake=wake, - plot=False, # turn False for speedup - plot_every=30, plot_until=3000, **plotkw2D - ) + plotkw2D = { + "title": img_folder + "Ez", + "add_patch": "cavity", + "patch_alpha": 1.0, + "patch_reverse": True, # patch logical_not('cavity') + "vmin": -1e3, + "vmax": 1e3, # colormap limits + "cmap": "rainbow", + "plane": [ + int(Nx / 2), # x + slice(0, Ny), # y + slice(skip_cells, -skip_cells), + ], + } # z + + solver.wakesolve( + wakelength=wakelength, + wake=wake, + plot=False, # turn False for speedup + plot_every=30, + plot_until=3000, + **plotkw2D, + ) if solver.rank == 0: # ----------- 1d plot results -------------------- # Plot longitudinal wake potential and impedance - fig1, ax = plt.subplots(1,2, figsize=[12,4], dpi=150) - ax[0].plot(wake.s*1e2, wake.WP, c='r', lw=1.5, label='Wakis') - ax[0].set_xlabel('s [cm]') - ax[0].set_ylabel('Longitudinal wake potential [V/pC]', color='r') + fig1, ax = plt.subplots(1, 2, figsize=[12, 4], dpi=150) + ax[0].plot(wake.s * 1e2, wake.WP, c="r", lw=1.5, label="Wakis") + ax[0].set_xlabel("s [cm]") + ax[0].set_ylabel("Longitudinal wake potential [V/pC]", color="r") ax[0].legend() - ax[0].set_xlim(xmax=wakelength*1e2) + ax[0].set_xlim(xmax=wakelength * 1e2) - ax[1].plot(wake.f*1e-9, np.abs(wake.Z), c='b', lw=1.5, label='Wakis') - ax[1].set_xlabel('f [GHz]') - ax[1].set_ylabel('Longitudinal impedance [Abs][$\Omega$]', color='b') + ax[1].plot(wake.f * 1e-9, np.abs(wake.Z), c="b", lw=1.5, label="Wakis") + ax[1].set_xlabel("f [GHz]") + ax[1].set_ylabel("Longitudinal impedance [Abs][$\Omega$]", color="b") ax[1].legend() fig1.tight_layout() - fig1.savefig('003_results/longitudinal.png') - #plt.show() + fig1.savefig("003_results/longitudinal.png") + # plt.show() # Plot transverse x wake potential and impedance - fig2, ax = plt.subplots(1,2, figsize=[12,4], dpi=150) - ax[0].plot(wake.s*1e2, wake.WPx, c='r', lw=1.5, label='Wakis') - ax[0].set_xlabel('s [cm]') - ax[0].set_ylabel('Transverse wake potential X [V/pC]', color='r') + fig2, ax = plt.subplots(1, 2, figsize=[12, 4], dpi=150) + ax[0].plot(wake.s * 1e2, wake.WPx, c="r", lw=1.5, label="Wakis") + ax[0].set_xlabel("s [cm]") + ax[0].set_ylabel("Transverse wake potential X [V/pC]", color="r") ax[0].legend() - ax[0].set_xlim(xmax=wakelength*1e2) + ax[0].set_xlim(xmax=wakelength * 1e2) - ax[1].plot(wake.f*1e-9, np.abs(wake.Zx), c='b', lw=1.5, label='Wakis') - ax[1].set_xlabel('f [GHz]') - ax[1].set_ylabel('Transverse impedance X [Abs][$\Omega$]', color='b') + ax[1].plot(wake.f * 1e-9, np.abs(wake.Zx), c="b", lw=1.5, label="Wakis") + ax[1].set_xlabel("f [GHz]") + ax[1].set_ylabel("Transverse impedance X [Abs][$\Omega$]", color="b") ax[1].legend() fig2.tight_layout() - fig2.savefig('003_results/transverse_x.png') - #plt.show() + fig2.savefig("003_results/transverse_x.png") + # plt.show() # Plot transverse y wake potential and impedance - fig3, ax = plt.subplots(1,2, figsize=[12,4], dpi=150) - ax[0].plot(wake.s*1e2, wake.WPy, c='r', lw=1.5, label='Wakis') - ax[0].set_xlabel('s [cm]') - ax[0].set_ylabel('Transverse wake potential Y [V/pC]', color='r') + fig3, ax = plt.subplots(1, 2, figsize=[12, 4], dpi=150) + ax[0].plot(wake.s * 1e2, wake.WPy, c="r", lw=1.5, label="Wakis") + ax[0].set_xlabel("s [cm]") + ax[0].set_ylabel("Transverse wake potential Y [V/pC]", color="r") ax[0].legend() - ax[0].set_xlim(xmax=wakelength*1e2) + ax[0].set_xlim(xmax=wakelength * 1e2) - ax[1].plot(wake.f*1e-9, np.abs(wake.Zy), c='b', lw=1.5, label='Wakis') - ax[1].set_xlabel('f [GHz]') - ax[1].set_ylabel('Transverse impedance Y [Abs][$\Omega$]', color='b') + ax[1].plot(wake.f * 1e-9, np.abs(wake.Zy), c="b", lw=1.5, label="Wakis") + ax[1].set_xlabel("f [GHz]") + ax[1].set_ylabel("Transverse impedance Y [Abs][$\Omega$]", color="b") ax[1].legend() fig3.tight_layout() - fig3.savefig('003_results/transverse_y.png') - #plt.show() + fig3.savefig("003_results/transverse_y.png") + # plt.show() # Plot Electric field component in 1D for several transverse positions - solver.plot1D(field='E', component='z', - line='z', pos=[0.4, 0.5, 0.6], - xscale='linear', yscale='linear', - off_screen=True, title=img_folder+'Ez1d') - #plt.show() + solver.plot1D( + field="E", + component="z", + line="z", + pos=[0.4, 0.5, 0.6], + xscale="linear", + yscale="linear", + off_screen=True, + title=img_folder + "Ez1d", + ) + # plt.show() # ----------- 2d plots results -------------------- - from matplotlib.colors import LinearSegmentedColormap - cmap = LinearSegmentedColormap.from_list('name', plt.cm.jet(np.linspace(0.1, 0.9))) # CST's colormap - # Plot Electric field component in 2D using imshow - solver.plot2D(field='E', component='z', - plane='XY', pos=0.5, - cmap=cmap, vmin=-500, vmax=500., interpolation='hanning', - add_patch='cavity', patch_reverse=True, patch_alpha=0.8, - off_screen=True, title=img_folder+'Ez2d') - #plt.show() + cmap = LinearSegmentedColormap.from_list( + "name", plt.cm.jet(np.linspace(0.1, 0.9)) + ) # CST's colormap + # Plot Electric field component in 2D using imshow + solver.plot2D( + field="E", + component="z", + plane="XY", + pos=0.5, + cmap=cmap, + vmin=-500, + vmax=500.0, + interpolation="hanning", + add_patch="cavity", + patch_reverse=True, + patch_alpha=0.8, + off_screen=True, + title=img_folder + "Ez2d", + ) + # plt.show() # BONUS: Generate an animation from the plots generated during the simulation # Needs imagemagick package -> `apt install imagemagick` @@ -265,56 +322,87 @@ # ----------- 3d plots results -------------------- # Plot Electric field component in 3D using pyvista.plotter - solver.plot3D('E', component='Abs', - cmap='rainbow', clim=[0, 500], - add_stl=['cavity', 'shell'], stl_opacity=0.1, - clip_interactive=True, clip_normal='-y') + solver.plot3D( + "E", + component="Abs", + cmap="rainbow", + clim=[0, 500], + add_stl=["cavity", "shell"], + stl_opacity=0.1, + clip_interactive=True, + clip_normal="-y", + ) # Plot Abs Electric field on STL solid `cavity` - solver.plot3DonSTL('E', component='Abs', - cmap='rainbow', clim=[0, 500], - stl_with_field='cavity', field_opacity=1.0, - stl_transparent='shell', stl_opacity=0.1, stl_colors='white', - #clip_plane=True, clip_normal='-y', clip_origin=[0,0,0], #coming in v0.5.0 - off_screen=False, zoom=1.2, title='003_img/Ez3d') + solver.plot3DonSTL( + "E", + component="Abs", + cmap="rainbow", + clim=[0, 500], + stl_with_field="cavity", + field_opacity=1.0, + stl_transparent="shell", + stl_opacity=0.1, + stl_colors="white", + # clip_plane=True, clip_normal='-y', clip_origin=[0,0,0], #coming in v0.5.0 + off_screen=False, + zoom=1.2, + title="003_img/Ez3d", + ) # --------------------- Extra ----------------------- # Callback plotting functions for debugging # Need to gather field before, e.g.: Ez = solver.mpi_gather('Ez', x=Nx//2) # Need to be plotted in rank 0 only e.g.: if rank == 0: plot1D_field(Ez, 'Ez', n=n, results_folder=img_folder, vmin=-800, vmax=800) -def plot1D_field(field, name='E', y=Ny//2, n=None, results_folder='img/', vmin=None, vmax=None,): +def plot1D_field( + field, + name="E", + y=Ny // 2, + n=None, + results_folder="img/", + vmin=None, + vmax=None, +): if vmin is None: vmin = -field.max() if ymax is None: vmax = field.max() fig, ax = plt.subplots() - ax.plot(field[y, :], c='g') - ax.set_title(f'{name} at timestep={n}') - ax.set_xlabel('z [m]') - ax.set_ylabel('Field amplitude') + ax.plot(field[y, :], c="g") + ax.set_title(f"{name} at timestep={n}") + ax.set_xlabel("z [m]") + ax.set_ylabel("Field amplitude") ax.set_ylim((vmin, vmax)) - #plot vertical lines at subdomain borders + # plot vertical lines at subdomain borders for r in range(size): if r == 0: - ax.axvline(NZ//size*(r+1)+grid.n_ghosts, c='red', alpha=0.5) - ax.axvline(NZ//size*(r), c='blue', alpha=0.5) - elif r == (size-1): - ax.axvline(NZ//size*(r+1), c='red', alpha=0.5) - ax.axvline(NZ//size*(r)-grid.n_ghosts, c='blue', alpha=0.5) - else: #outside subdomains - ax.axvline(NZ//size*(r+1)+grid.n_ghosts, c='red', alpha=0.5) - ax.axvline(NZ//size*(r)-grid.n_ghosts, c='blue', alpha=0.5) + ax.axvline(NZ // size * (r + 1) + grid.n_ghosts, c="red", alpha=0.5) + ax.axvline(NZ // size * (r), c="blue", alpha=0.5) + elif r == (size - 1): + ax.axvline(NZ // size * (r + 1), c="red", alpha=0.5) + ax.axvline(NZ // size * (r) - grid.n_ghosts, c="blue", alpha=0.5) + else: # outside subdomains + ax.axvline(NZ // size * (r + 1) + grid.n_ghosts, c="red", alpha=0.5) + ax.axvline(NZ // size * (r) - grid.n_ghosts, c="blue", alpha=0.5) fig.tight_layout() - fig.savefig(results_folder+name+'1d_'+str(n).zfill(4)+'.png') + fig.savefig(results_folder + name + "1d_" + str(n).zfill(4) + ".png") plt.clf() plt.close(fig) -def plot2D_field(field, name='E', n=None, results_folder='img/', vmin=None, vmax=None,): + +def plot2D_field( + field, + name="E", + n=None, + results_folder="img/", + vmin=None, + vmax=None, +): extent = (0, NZ, 0, Ny) if vmin is None: vmin = -field.max() @@ -322,25 +410,27 @@ def plot2D_field(field, name='E', n=None, results_folder='img/', vmin=None, vmax vmax = field.max() fig, ax = plt.subplots() - im = ax.imshow(field, cmap='rainbow', extent=extent, vmin=vmin, vmax=vmax) - fig.colorbar(im, cax=make_axes_locatable(ax).append_axes('right', size='5%', pad=0.05)) - ax.set_title(f'{name} at timestep={n}') - ax.set_xlabel('z [id]') - ax.set_ylabel('y [id]') - - #plot vertical lines at subdomain borders + im = ax.imshow(field, cmap="rainbow", extent=extent, vmin=vmin, vmax=vmax) + fig.colorbar( + im, cax=make_axes_locatable(ax).append_axes("right", size="5%", pad=0.05) + ) + ax.set_title(f"{name} at timestep={n}") + ax.set_xlabel("z [id]") + ax.set_ylabel("y [id]") + + # plot vertical lines at subdomain borders for r in range(size): if r == 0: - ax.axvline(NZ//size*(r+1)+grid.n_ghosts, c='red', alpha=0.5) - ax.axvline(NZ//size*(r), c='blue', alpha=0.5) - elif r == (size-1): - ax.axvline(NZ//size*(r+1), c='red', alpha=0.5) - ax.axvline(NZ//size*(r)-grid.n_ghosts, c='blue', alpha=0.5) - else: #outside subdomains - ax.axvline(NZ//size*(r+1)+grid.n_ghosts, c='red', alpha=0.5) - ax.axvline(NZ//size*(r)-grid.n_ghosts, c='blue', alpha=0.5) - - #plot fill rectangles for each subdomain + ax.axvline(NZ // size * (r + 1) + grid.n_ghosts, c="red", alpha=0.5) + ax.axvline(NZ // size * (r), c="blue", alpha=0.5) + elif r == (size - 1): + ax.axvline(NZ // size * (r + 1), c="red", alpha=0.5) + ax.axvline(NZ // size * (r) - grid.n_ghosts, c="blue", alpha=0.5) + else: # outside subdomains + ax.axvline(NZ // size * (r + 1) + grid.n_ghosts, c="red", alpha=0.5) + ax.axvline(NZ // size * (r) - grid.n_ghosts, c="blue", alpha=0.5) + + # plot fill rectangles for each subdomain # for r in range(size): # if r == 0: # ax.axvspan(NZ//size*(r), NZ//size*(r+1)+grid.n_ghosts, color='darkorange', alpha=0.1) @@ -350,20 +440,21 @@ def plot2D_field(field, name='E', n=None, results_folder='img/', vmin=None, vmax # ax.axvspan(NZ//size*(r)-grid.n_ghosts, NZ//size*(r+1)+grid.n_ghosts, color='green', alpha=0.1) fig.tight_layout(h_pad=0.3) - fig.savefig(results_folder+name+'2d_'+str(n).zfill(4)+'.png') + fig.savefig(results_folder + name + "2d_" + str(n).zfill(4) + ".png") plt.clf() plt.close(fig) + # # Check global material tensors inside loop if False: ieps = solver.mpi_gather_asField(solver.ieps) - sigma = solver.mpi_gather(solver.sigma, 'z', x=Nx//2) + sigma = solver.mpi_gather(solver.sigma, "z", x=Nx // 2) if rank == 0: # Plot eps^-1 tensor - fig, ax = ieps.inspect(figsize=[20,6], plane='YZ', show=False, handles=True) - fig.savefig(img_folder+'ieps_inspect.png') + fig, ax = ieps.inspect(figsize=[20, 6], plane="YZ", show=False, handles=True) + fig.savefig(img_folder + "ieps_inspect.png") plt.close(fig) # Plot - plot2D_field(sigma, 'sigmaz_', results_folder=img_folder) \ No newline at end of file + plot2D_field(sigma, "sigmaz_", results_folder=img_folder) diff --git a/examples/004_MPI+GPU_wakefield_simulation.py b/examples/004_MPI+GPU_wakefield_simulation.py index ceb2e7e..7b3658e 100644 --- a/examples/004_MPI+GPU_wakefield_simulation.py +++ b/examples/004_MPI+GPU_wakefield_simulation.py @@ -13,39 +13,38 @@ import matplotlib.pyplot as plt from mpl_toolkits.axes_grid1 import make_axes_locatable -import sys -sys.path.append('../') - from wakis import SolverFIT3D -from wakis import GridFIT3D +from wakis import GridFIT3D from wakis import WakeSolver from tqdm import tqdm +from wakis.sources import Beam +from scipy.constants import c + # ---------- MPI setup ------------ # can be skipped since it is handled inside GridFIT3D -from mpi4py import MPI +from mpi4py import MPI comm = MPI.COMM_WORLD # Get MPI communicator rank = comm.Get_rank() # Process ID size = comm.Get_size() # Total number of MPI processes # ------- GPU setup -------------- -os.environ['CUDA_VISIBLE_DEVICES']=str(rank+2) +os.environ["CUDA_VISIBLE_DEVICES"] = str(rank + 2) # ---------- Domain setup --------- # Geometry & Materials -solid_1 = 'data/001_vacuum_cavity.stl' -solid_2 = 'data/001_lossymetal_shell.stl' +solid_1 = "data/001_vacuum_cavity.stl" +solid_2 = "data/001_lossymetal_shell.stl" -stl_solids = {'cavity': solid_1, - 'shell': solid_2 - } +stl_solids = {"cavity": solid_1, "shell": solid_2} -stl_materials = {'cavity': 'vacuum', - 'shell': [30, 1.0, 30] #[eps_r, mu_r, sigma[S/m]] - } +stl_materials = { + "cavity": "vacuum", + "shell": [30, 1.0, 30], # [eps_r, mu_r, sigma[S/m]] +} # Extract domain bounds from geometry solids = pv.read(solid_1) + pv.read(solid_2) @@ -56,53 +55,63 @@ Ny = 80 NZ = 140 -grid = GridFIT3D(xmin, xmax, ymin, ymax, ZMIN, ZMAX, - Nx, Ny, NZ, - use_mpi=True, # Enables MPI subdivision of the domain - stl_solids=stl_solids, - stl_materials=stl_materials, - stl_scale=1.0, - stl_rotate=[0,0,0], - stl_translate=[0,0,0], - verbose=1) - -print(f"Process {rank}: Handling Z range {grid.zmin} to {grid.zmax} with {grid.Nz} cells") +grid = GridFIT3D( + xmin, + xmax, + ymin, + ymax, + ZMIN, + ZMAX, + Nx, + Ny, + NZ, + use_mpi=True, # Enables MPI subdivision of the domain + stl_solids=stl_solids, + stl_materials=stl_materials, + stl_scale=1.0, + stl_rotate=[0, 0, 0], + stl_translate=[0, 0, 0], + verbose=1, +) + +print( + f"Process {rank}: Handling Z range {grid.zmin} to {grid.zmax} with {grid.Nz} cells" +) # ------------ Beam source & Wake ---------------- # Beam parameters -sigmaz = 10e-2 #[m] -> 2 GHz -q = 1e-9 #[C] -beta = 1.0 # beam beta -xs = 0. # x source position [m] -ys = 0. # y source position [m] -xt = 0. # x test position [m] -yt = 0. # y test position [m] -# [DEFAULT] tinj = 8.53*sigmaz/c_light # injection time offset [s] +sigmaz = 10e-2 # [m] -> 2 GHz +q = 1e-9 # [C] +beta = 1.0 # beam beta +xs = 0.0 # x source position [m] +ys = 0.0 # y source position [m] +xt = 0.0 # x test position [m] +yt = 0.0 # y test position [m] +# [DEFAULT] tinj = 8.53*sigmaz/c_light # injection time offset [s] -from wakis.sources import Beam -from scipy.constants import c -beam = Beam(q=q, sigmaz=sigmaz, beta=beta, - xsource=xs, ysource=ys, ti=3*sigmaz/c) + +beam = Beam(q=q, sigmaz=sigmaz, beta=beta, xsource=xs, ysource=ys, ti=3 * sigmaz / c) # ----------- Solver & Simulation ---------- # boundary conditions -bc_low=['pec', 'pec', 'pec'] -bc_high=['pec', 'pec', 'pec'] +bc_low = ["pec", "pec", "pec"] +bc_high = ["pec", "pec", "pec"] # Solver setup -solver = SolverFIT3D(grid, - bc_low=bc_low, - bc_high=bc_high, - use_stl=True, - use_mpi=True, # Activate MPI - use_gpu=True, - bg='pec' # Background material - ) - -img_folder = '004_img/' -if not os.path.exists(img_folder) and rank == 0: +solver = SolverFIT3D( + grid, + bc_low=bc_low, + bc_high=bc_high, + use_stl=True, + use_mpi=True, # Activate MPI + use_gpu=True, + bg="pec", # Background material +) + +img_folder = "004_img/" +if not os.path.exists(img_folder) and rank == 0: os.mkdir(img_folder) - + # -------------- Custom time loop ----------------- run_timeloop = False if run_timeloop: @@ -115,151 +124,200 @@ plot_1D = False for n in tqdm(range(Nt)): - - beam.update(solver, n*solver.dt) + beam.update(solver, n * solver.dt) solver.mpi_one_step() # Plot inspect every 20 timesteps - if n%20 == 0 and plot_inspect: - E = solver.mpi_gather_asField('E') + if n % 20 == 0 and plot_inspect: + E = solver.mpi_gather_asField("E") if rank == 0: - fig, ax = E.inspect(figsize=[20,6], plane='YZ', show=False, handles=True) - fig.savefig(img_folder+'Einspect_'+str(n).zfill(4)+'.png') + fig, ax = E.inspect( + figsize=[20, 6], plane="YZ", show=False, handles=True + ) + fig.savefig(img_folder + "Einspect_" + str(n).zfill(4) + ".png") plt.close(fig) # Plot E abs in 2D every 20 timesteps - if n%20 == 0 and plot_2D: - solver.plot2D(field='E', component='Abs', - plane='YZ', pos=0.5, - cmap='rainbow', vmin=0, vmax=500., interpolation='hanning', - off_screen=True, title=img_folder+'Ez2d', n=n) + if n % 20 == 0 and plot_2D: + solver.plot2D( + field="E", + component="Abs", + plane="YZ", + pos=0.5, + cmap="rainbow", + vmin=0, + vmax=500.0, + interpolation="hanning", + off_screen=True, + title=img_folder + "Ez2d", + n=n, + ) # Plot E z in 1D at diferent transverse positions `pos` every 20 timesteps - if n%20 == 0 and plot_1D: - solver.plot1D(field='E', component='z', - line='z', pos=[0.45, 0.5, 0.55], - xscale='linear', yscale='linear', - off_screen=True, title=img_folder+'Ez1d', n=n) - + if n % 20 == 0 and plot_1D: + solver.plot1D( + field="E", + component="z", + line="z", + pos=[0.45, 0.5, 0.55], + xscale="linear", + yscale="linear", + off_screen=True, + title=img_folder + "Ez1d", + n=n, + ) + # -------------- using Wakefield routine ----------------- run_wakefield = True if run_wakefield: - # ------------ Beam source ---------------- # Beam parameters - sigmaz = 10e-2 #[m] -> 2 GHz - q = 1e-9 #[C] - beta = 1.0 # beam beta - xs = 0. # x source position [m] - ys = 0. # y source position [m] - xt = 0. # x test position [m] - yt = 0. # y test position [m] - # [DEFAULT] tinj = 8.53*sigmaz/c_light # injection time offset [s] - + sigmaz = 10e-2 # [m] -> 2 GHz + q = 1e-9 # [C] + beta = 1.0 # beam beta + xs = 0.0 # x source position [m] + ys = 0.0 # y source position [m] + xt = 0.0 # x test position [m] + yt = 0.0 # y test position [m] + # [DEFAULT] tinj = 8.53*sigmaz/c_light # injection time offset [s] # ----------- Wake Solver setup ---------- # Wakefield post-processor - wakelength = 10. # [m] -> Partially decayed + wakelength = 10.0 # [m] -> Partially decayed skip_cells = 10 # no. cells to skip at zlo/zhi for wake integration - results_folder = '004_results/' - wake = WakeSolver(q=q, sigmaz=sigmaz, beta=beta, - xsource=xs, ysource=ys, xtest=xt, ytest=yt, - skip_cells=10, - results_folder=results_folder, - Ez_file=results_folder+'Ez.h5',) + results_folder = "004_results/" + wake = WakeSolver( + q=q, + sigmaz=sigmaz, + beta=beta, + xsource=xs, + ysource=ys, + xtest=xt, + ytest=yt, + skip_cells=10, + results_folder=results_folder, + Ez_file=results_folder + "Ez.h5", + ) # Reset fields solver.reset_fields() # Solver run - plotkw2D = {'title': img_folder+'Ez', - 'add_patch':'cavity', 'patch_alpha':1.0, - 'patch_reverse' : True, # patch logical_not('cavity') - 'vmin':-1e3, 'vmax':1e3, # colormap limits - 'cmap': 'rainbow', - 'plane': [int(Nx/2), # x - slice(0, Ny), # y - slice(skip_cells, -skip_cells)]} # z - - solver.wakesolve(wakelength=wakelength, - wake=wake, - plot=False, # turn False for speedup - plot_every=30, plot_until=3000, **plotkw2D - ) + plotkw2D = { + "title": img_folder + "Ez", + "add_patch": "cavity", + "patch_alpha": 1.0, + "patch_reverse": True, # patch logical_not('cavity') + "vmin": -1e3, + "vmax": 1e3, # colormap limits + "cmap": "rainbow", + "plane": [ + int(Nx / 2), # x + slice(0, Ny), # y + slice(skip_cells, -skip_cells), + ], + } # z + + solver.wakesolve( + wakelength=wakelength, + wake=wake, + plot=False, # turn False for speedup + plot_every=30, + plot_until=3000, + **plotkw2D, + ) if solver.rank == 0: # ----------- 1d plot results -------------------- # Plot longitudinal wake potential and impedance - fig1, ax = plt.subplots(1,2, figsize=[12,4], dpi=150) - ax[0].plot(wake.s*1e2, wake.WP, c='r', lw=1.5, label='Wakis') - ax[0].set_xlabel('s [cm]') - ax[0].set_ylabel('Longitudinal wake potential [V/pC]', color='r') + fig1, ax = plt.subplots(1, 2, figsize=[12, 4], dpi=150) + ax[0].plot(wake.s * 1e2, wake.WP, c="r", lw=1.5, label="Wakis") + ax[0].set_xlabel("s [cm]") + ax[0].set_ylabel("Longitudinal wake potential [V/pC]", color="r") ax[0].legend() - ax[0].set_xlim(xmax=wakelength*1e2) + ax[0].set_xlim(xmax=wakelength * 1e2) - ax[1].plot(wake.f*1e-9, np.abs(wake.Z), c='b', lw=1.5, label='Wakis') - ax[1].set_xlabel('f [GHz]') - ax[1].set_ylabel('Longitudinal impedance [Abs][$\Omega$]', color='b') + ax[1].plot(wake.f * 1e-9, np.abs(wake.Z), c="b", lw=1.5, label="Wakis") + ax[1].set_xlabel("f [GHz]") + ax[1].set_ylabel("Longitudinal impedance [Abs][$\Omega$]", color="b") ax[1].legend() fig1.tight_layout() - fig1.savefig('004_results/longitudinal.png') - #plt.show() + fig1.savefig("004_results/longitudinal.png") + # plt.show() # Plot transverse x wake potential and impedance - fig2, ax = plt.subplots(1,2, figsize=[12,4], dpi=150) - ax[0].plot(wake.s*1e2, wake.WPx, c='r', lw=1.5, label='Wakis') - ax[0].set_xlabel('s [cm]') - ax[0].set_ylabel('Transverse wake potential X [V/pC]', color='r') + fig2, ax = plt.subplots(1, 2, figsize=[12, 4], dpi=150) + ax[0].plot(wake.s * 1e2, wake.WPx, c="r", lw=1.5, label="Wakis") + ax[0].set_xlabel("s [cm]") + ax[0].set_ylabel("Transverse wake potential X [V/pC]", color="r") ax[0].legend() - ax[0].set_xlim(xmax=wakelength*1e2) + ax[0].set_xlim(xmax=wakelength * 1e2) - ax[1].plot(wake.f*1e-9, np.abs(wake.Zx), c='b', lw=1.5, label='Wakis') - ax[1].set_xlabel('f [GHz]') - ax[1].set_ylabel('Transverse impedance X [Abs][$\Omega$]', color='b') + ax[1].plot(wake.f * 1e-9, np.abs(wake.Zx), c="b", lw=1.5, label="Wakis") + ax[1].set_xlabel("f [GHz]") + ax[1].set_ylabel("Transverse impedance X [Abs][$\Omega$]", color="b") ax[1].legend() fig2.tight_layout() - fig2.savefig('004_results/transverse_x.png') - #plt.show() + fig2.savefig("004_results/transverse_x.png") + # plt.show() # Plot transverse y wake potential and impedance - fig3, ax = plt.subplots(1,2, figsize=[12,4], dpi=150) - ax[0].plot(wake.s*1e2, wake.WPy, c='r', lw=1.5, label='Wakis') - ax[0].set_xlabel('s [cm]') - ax[0].set_ylabel('Transverse wake potential Y [V/pC]', color='r') + fig3, ax = plt.subplots(1, 2, figsize=[12, 4], dpi=150) + ax[0].plot(wake.s * 1e2, wake.WPy, c="r", lw=1.5, label="Wakis") + ax[0].set_xlabel("s [cm]") + ax[0].set_ylabel("Transverse wake potential Y [V/pC]", color="r") ax[0].legend() - ax[0].set_xlim(xmax=wakelength*1e2) + ax[0].set_xlim(xmax=wakelength * 1e2) - ax[1].plot(wake.f*1e-9, np.abs(wake.Zy), c='b', lw=1.5, label='Wakis') - ax[1].set_xlabel('f [GHz]') - ax[1].set_ylabel('Transverse impedance Y [Abs][$\Omega$]', color='b') + ax[1].plot(wake.f * 1e-9, np.abs(wake.Zy), c="b", lw=1.5, label="Wakis") + ax[1].set_xlabel("f [GHz]") + ax[1].set_ylabel("Transverse impedance Y [Abs][$\Omega$]", color="b") ax[1].legend() fig3.tight_layout() - fig3.savefig('004_results/transverse_y.png') - #plt.show() + fig3.savefig("004_results/transverse_y.png") + # plt.show() # Plot Electric field component in 1D for several transverse positions - solver.plot1D(field='E', component='z', - line='z', pos=[0.4, 0.5, 0.6], - xscale='linear', yscale='linear', - off_screen=True, title=img_folder+'Ez1d') - #plt.show() + solver.plot1D( + field="E", + component="z", + line="z", + pos=[0.4, 0.5, 0.6], + xscale="linear", + yscale="linear", + off_screen=True, + title=img_folder + "Ez1d", + ) + # plt.show() # ----------- 2d plots results -------------------- from matplotlib.colors import LinearSegmentedColormap - cmap = LinearSegmentedColormap.from_list('name', plt.cm.jet(np.linspace(0.1, 0.9))) # CST's colormap - # Plot Electric field component in 2D using imshow - solver.plot2D(field='E', component='z', - plane='XY', pos=0.5, - cmap=cmap, vmin=-500, vmax=500., interpolation='hanning', - add_patch='cavity', patch_reverse=True, patch_alpha=0.8, - off_screen=True, title=img_folder+'Ez2d') - #plt.show() + cmap = LinearSegmentedColormap.from_list( + "name", plt.cm.jet(np.linspace(0.1, 0.9)) + ) # CST's colormap + # Plot Electric field component in 2D using imshow + solver.plot2D( + field="E", + component="z", + plane="XY", + pos=0.5, + cmap=cmap, + vmin=-500, + vmax=500.0, + interpolation="hanning", + add_patch="cavity", + patch_reverse=True, + patch_alpha=0.8, + off_screen=True, + title=img_folder + "Ez2d", + ) + # plt.show() # BONUS: Generate an animation from the plots generated during the simulation # Needs imagemagick package -> `apt install imagemagick` @@ -267,71 +325,87 @@ # ----------- 3d plots results -------------------- # Plot Electric field component in 3D using pyvista.plotter - solver.plot3D('E', component='Abs', - cmap='rainbow', clim=[0, 500], - add_stl=['cavity', 'shell'], stl_opacity=0.1, - clip_interactive=True, clip_normal='-y') + solver.plot3D( + "E", + component="Abs", + cmap="rainbow", + clim=[0, 500], + add_stl=["cavity", "shell"], + stl_opacity=0.1, + clip_interactive=True, + clip_normal="-y", + ) # Plot Abs Electric field on STL solid `cavity` - solver.plot3DonSTL('E', component='Abs', - cmap='rainbow', clim=[0, 500], - stl_with_field='cavity', field_opacity=1.0, - stl_transparent='shell', stl_opacity=0.1, stl_colors='white', - #clip_plane=True, clip_normal='-y', clip_origin=[0,0,0], #coming in v0.5.0 - off_screen=False, zoom=1.2, title='004_img/Ez3d') - - -# --------------------- Extra ----------------------- -# # Check global material tensors -if False: - ieps = solver.mpi_gather_asField(solver.ieps) - sigma = solver.mpi_gather(solver.sigma, 'z', x=Nx//2) - if rank == 0: - # Plot eps^-1 tensor - fig, ax = ieps.inspect(figsize=[20,6], plane='YZ', show=False, handles=True) - fig.savefig(img_folder+'ieps_inspect.png') - plt.close(fig) - - # Plot - plot2D_field(sigma, 'sigmaz_', results_folder=img_folder) + solver.plot3DonSTL( + "E", + component="Abs", + cmap="rainbow", + clim=[0, 500], + stl_with_field="cavity", + field_opacity=1.0, + stl_transparent="shell", + stl_opacity=0.1, + stl_colors="white", + # clip_plane=True, clip_normal='-y', clip_origin=[0,0,0], #coming in v0.5.0 + off_screen=False, + zoom=1.2, + title="004_img/Ez3d", + ) # Callback plotting functions for debugging # Need to gather field before, e.g.: Ez = solver.mpi_gather('Ez', x=Nx//2) # Need to be plotted in rank 0 only e.g.: if rank == 0: plot1D_field(Ez, 'Ez', n=n, results_folder=img_folder, vmin=-800, vmax=800) if False: - def plot1D_field(field, name='E', y=Ny//2, n=None, results_folder='img/', vmin=None, vmax=None,): + + def plot1D_field( + field, + name="E", + y=Ny // 2, + n=None, + results_folder="img/", + vmin=None, + vmax=None, + ): if vmin is None: vmin = -field.max() if ymax is None: vmax = field.max() fig, ax = plt.subplots() - ax.plot(field[y, :], c='g') - ax.set_title(f'{name} at timestep={n}') - ax.set_xlabel('z [m]') - ax.set_ylabel('Field amplitude') + ax.plot(field[y, :], c="g") + ax.set_title(f"{name} at timestep={n}") + ax.set_xlabel("z [m]") + ax.set_ylabel("Field amplitude") ax.set_ylim((vmin, vmax)) - #plot vertical lines at subdomain borders + # plot vertical lines at subdomain borders for r in range(size): if r == 0: - ax.axvline(NZ//size*(r+1)+grid.n_ghosts, c='red', alpha=0.5) - ax.axvline(NZ//size*(r), c='blue', alpha=0.5) - elif r == (size-1): - ax.axvline(NZ//size*(r+1), c='red', alpha=0.5) - ax.axvline(NZ//size*(r)-grid.n_ghosts, c='blue', alpha=0.5) - else: #outside subdomains - ax.axvline(NZ//size*(r+1)+grid.n_ghosts, c='red', alpha=0.5) - ax.axvline(NZ//size*(r)-grid.n_ghosts, c='blue', alpha=0.5) + ax.axvline(NZ // size * (r + 1) + grid.n_ghosts, c="red", alpha=0.5) + ax.axvline(NZ // size * (r), c="blue", alpha=0.5) + elif r == (size - 1): + ax.axvline(NZ // size * (r + 1), c="red", alpha=0.5) + ax.axvline(NZ // size * (r) - grid.n_ghosts, c="blue", alpha=0.5) + else: # outside subdomains + ax.axvline(NZ // size * (r + 1) + grid.n_ghosts, c="red", alpha=0.5) + ax.axvline(NZ // size * (r) - grid.n_ghosts, c="blue", alpha=0.5) fig.tight_layout() - fig.savefig(results_folder+name+'1d_'+str(n).zfill(4)+'.png') + fig.savefig(results_folder + name + "1d_" + str(n).zfill(4) + ".png") plt.clf() plt.close(fig) - def plot2D_field(field, name='E', n=None, results_folder='img/', vmin=None, vmax=None,): + def plot2D_field( + field, + name="E", + n=None, + results_folder="img/", + vmin=None, + vmax=None, + ): extent = (0, NZ, 0, Ny) if vmin is None: vmin = -field.max() @@ -339,37 +413,69 @@ def plot2D_field(field, name='E', n=None, results_folder='img/', vmin=None, vmax vmax = field.max() fig, ax = plt.subplots() - im = ax.imshow(field, cmap='rainbow', extent=extent, vmin=vmin, vmax=vmax) - fig.colorbar(im, cax=make_axes_locatable(ax).append_axes('right', size='5%', pad=0.05)) - ax.set_title(f'{name} at timestep={n}') - ax.set_xlabel('z [id]') - ax.set_ylabel('y [id]') - - #plot vertical lines at subdomain borders + im = ax.imshow(field, cmap="rainbow", extent=extent, vmin=vmin, vmax=vmax) + fig.colorbar( + im, cax=make_axes_locatable(ax).append_axes("right", size="5%", pad=0.05) + ) + ax.set_title(f"{name} at timestep={n}") + ax.set_xlabel("z [id]") + ax.set_ylabel("y [id]") + + # plot vertical lines at subdomain borders if True: for r in range(size): if r == 0: - ax.axvline(NZ//size*(r+1)+grid.n_ghosts, c='red', alpha=0.5) - ax.axvline(NZ//size*(r), c='blue', alpha=0.5) - elif r == (size-1): - ax.axvline(NZ//size*(r+1), c='red', alpha=0.5) - ax.axvline(NZ//size*(r)-grid.n_ghosts, c='blue', alpha=0.5) - else: #outside subdomains - ax.axvline(NZ//size*(r+1)+grid.n_ghosts, c='red', alpha=0.5) - ax.axvline(NZ//size*(r)-grid.n_ghosts, c='blue', alpha=0.5) - - #plot fill rectangles for each subdomain + ax.axvline(NZ // size * (r + 1) + grid.n_ghosts, c="red", alpha=0.5) + ax.axvline(NZ // size * (r), c="blue", alpha=0.5) + elif r == (size - 1): + ax.axvline(NZ // size * (r + 1), c="red", alpha=0.5) + ax.axvline(NZ // size * (r) - grid.n_ghosts, c="blue", alpha=0.5) + else: # outside subdomains + ax.axvline(NZ // size * (r + 1) + grid.n_ghosts, c="red", alpha=0.5) + ax.axvline(NZ // size * (r) - grid.n_ghosts, c="blue", alpha=0.5) + + # plot fill rectangles for each subdomain if False: for r in range(size): if r == 0: - ax.axvspan(NZ//size*(r), NZ//size*(r+1)+grid.n_ghosts, color='darkorange', alpha=0.1) - elif r == (size-1): - ax.axvspan(NZ//size*(r)-grid.n_ghosts, NZ//size*(r+1), color='darkorange', alpha=0.1) - else: #outside subdomains - ax.axvspan(NZ//size*(r)-grid.n_ghosts, NZ//size*(r+1)+grid.n_ghosts, color='green', alpha=0.1) + ax.axvspan( + NZ // size * (r), + NZ // size * (r + 1) + grid.n_ghosts, + color="darkorange", + alpha=0.1, + ) + elif r == (size - 1): + ax.axvspan( + NZ // size * (r) - grid.n_ghosts, + NZ // size * (r + 1), + color="darkorange", + alpha=0.1, + ) + else: # outside subdomains + ax.axvspan( + NZ // size * (r) - grid.n_ghosts, + NZ // size * (r + 1) + grid.n_ghosts, + color="green", + alpha=0.1, + ) fig.tight_layout(h_pad=0.3) - fig.savefig(results_folder+name+'2d_'+str(n).zfill(4)+'.png') + fig.savefig(results_folder + name + "2d_" + str(n).zfill(4) + ".png") plt.clf() - plt.close(fig) \ No newline at end of file + plt.close(fig) + + +# --------------------- Extra ----------------------- +# # Check global material tensors +if False: + ieps = solver.mpi_gather_asField(solver.ieps) + sigma = solver.mpi_gather(solver.sigma, "z", x=Nx // 2) + if rank == 0: + # Plot eps^-1 tensor + fig, ax = ieps.inspect(figsize=[20, 6], plane="YZ", show=False, handles=True) + fig.savefig(img_folder + "ieps_inspect.png") + plt.close(fig) + + # Plot + plot2D_field(sigma, "sigmaz_", results_folder=img_folder) diff --git a/examples/005_CPU_with_field_monitor.py b/examples/005_CPU_with_field_monitor.py index 3e085c3..4d4b64f 100644 --- a/examples/005_CPU_with_field_monitor.py +++ b/examples/005_CPU_with_field_monitor.py @@ -15,16 +15,15 @@ # ---------- Domain setup --------- # Geometry & Materials -solid_1 = '../examples/data/001_vacuum_cavity.stl' -solid_2 = '../examples/data/001_lossymetal_shell.stl' +solid_1 = "../examples/data/001_vacuum_cavity.stl" +solid_2 = "../examples/data/001_lossymetal_shell.stl" -stl_solids = {'cavity': solid_1, - 'shell': solid_2 - } +stl_solids = {"cavity": solid_1, "shell": solid_2} -stl_materials = {'cavity': 'vacuum', - 'shell': [30, 1.0, 30] # [eps_r, mu_r, sigma[S/m]] - } +stl_materials = { + "cavity": "vacuum", + "shell": [30, 1.0, 30], # [eps_r, mu_r, sigma[S/m]] +} # Extract domain bounds from geometry @@ -37,14 +36,23 @@ Nz = 141 # set grid and geometry -grid = GridFIT3D(xmin, xmax, ymin, ymax, zmin, zmax, - Nx, Ny, Nz, - stl_solids=stl_solids, - stl_materials=stl_materials, - stl_scale=1.0, - stl_rotate=[0, 0, 0], - stl_translate=[0, 0, 0], - verbose=1) +grid = GridFIT3D( + xmin, + xmax, + ymin, + ymax, + zmin, + zmax, + Nx, + Ny, + Nz, + stl_solids=stl_solids, + stl_materials=stl_materials, + stl_scale=1.0, + stl_rotate=[0, 0, 0], + stl_translate=[0, 0, 0], + verbose=1, +) # ------------ Beam source & Wake ---------------- @@ -52,67 +60,81 @@ sigmaz = 10e-2 # [m] -> 2 GHz q = 1e-9 # [C] beta = 1.0 # beam beta -xs = 0. # x source position [m] -ys = 0. # y source position [m] -xt = 0. # x test position [m] -yt = 0. # y test position [m] +xs = 0.0 # x source position [m] +ys = 0.0 # y source position [m] +xt = 0.0 # x test position [m] +yt = 0.0 # y test position [m] # [DEFAULT] tinj = 8.53*sigmaz/c_light # injection time offset [s] # Simualtion -wakelength = 10. # [m] +wakelength = 10.0 # [m] add_space = 10 # no. cells to skip from boundaries - removes BC artifacts -wake = WakeSolver(q=q, - sigmaz=sigmaz, - beta=beta, - xsource=xs, ysource=ys, - xtest=xt, ytest=yt, - add_space=add_space, - results_folder='005_results/', - Ez_file='005_results/005_Ez.h5') +wake = WakeSolver( + q=q, + sigmaz=sigmaz, + beta=beta, + xsource=xs, + ysource=ys, + xtest=xt, + ytest=yt, + add_space=add_space, + results_folder="005_results/", + Ez_file="005_results/005_Ez.h5", +) # ----------- Solver & Simulation ---------- # boundary conditions`` -bc_low = ['pec', 'pec', 'pec'] -bc_high = ['pec', 'pec', 'pec'] +bc_low = ["pec", "pec", "pec"] +bc_high = ["pec", "pec", "pec"] # Solver setup -solver = SolverFIT3D(grid, wake, - bc_low=bc_low, - bc_high=bc_high, - use_stl=True, - bg='pec' # Background material - ) +solver = SolverFIT3D( + grid, + wake, + bc_low=bc_low, + bc_high=bc_high, + use_stl=True, + bg="pec", # Background material +) # CREATE field monitor -monitor = FieldMonitor(frequencies=[0.549e9]) # we assume we already found the fundamental mode frequency +monitor = FieldMonitor( + frequencies=[0.549e9] +) # we assume we already found the fundamental mode frequency # Solver run -solver.wakesolve(wakelength=wakelength, - add_space=add_space, - plot=True, # turn False for speedup - plot_every=30, plot_until=3000, - use_field_monitor=True, # argument for if to use field monitor - field_monitor=monitor # add field monitor - ) - -results_folder = '005_results/' +solver.wakesolve( + wakelength=wakelength, + add_space=add_space, + plot=True, # turn False for speedup + plot_every=30, + plot_until=3000, + use_field_monitor=True, # argument for if to use field monitor + field_monitor=monitor, # add field monitor +) + +results_folder = "005_results/" if not os.path.exists(results_folder): os.mkdir(results_folder) freq_field = monitor.get_components() -np.savez('./005_results/field_at_frequencies.npz', Ex=freq_field['Ex'], Ey=freq_field['Ey'], Ez=freq_field['Ez']) +np.savez( + "./005_results/field_at_frequencies.npz", + Ex=freq_field["Ex"], + Ey=freq_field["Ey"], + Ez=freq_field["Ez"], +) -Ez = freq_field['Ez'][0]# Z field at the first frequency (only frequency in our case) -Ez_flat = np.reshape(Ez, solver.N) # +Ez = freq_field["Ez"][0] # Z field at the first frequency (only frequency in our case) +Ez_flat = np.reshape(Ez, solver.N) # -solver.grid.grid.cell_data['Ez_mag'] = np.real(Ez_flat) +solver.grid.grid.cell_data["Ez_mag"] = np.real(Ez_flat) # interactive slice pl = pv.Plotter() -pl.add_mesh_clip_plane(solver.grid.grid, scalars='Ez_mag', cmap='inferno', show_scalar_bar=True) +pl.add_mesh_clip_plane( + solver.grid.grid, scalars="Ez_mag", cmap="inferno", show_scalar_bar=True +) pl.show() - - - diff --git a/examples/006_CPU_counter_moving_field_monitor.py b/examples/006_CPU_counter_moving_field_monitor.py index d0ea775..477a070 100644 --- a/examples/006_CPU_counter_moving_field_monitor.py +++ b/examples/006_CPU_counter_moving_field_monitor.py @@ -13,23 +13,22 @@ from wakis.field_monitors import FieldMonitor - # ---------- Geometry Parameters (in mm) ---------- rc = 100e-3 # Cavity radius -rp = 10e-3 # Beam pipe radius -L = 60e-3 # Cavity lengt# # -l = 10e-3 # Beam pipe length -shell_thickness = 1e-3 # Shell thickness (e.g., 5 mm metal wall) +rp = 10e-3 # Beam pipe radius +L = 60e-3 # Cavity lengt# # +l_pipe = 10e-3 # Beam pipe length +shell_thickness = 1e-3 # Shell thickness (e.g., 5 mm metal wall) extra_shell = 1e-3 cavity = trimesh.creation.cylinder(radius=rc, height=L, sections=128) -pipe_left = trimesh.creation.cylinder(radius=rp, height=l, sections=128) -pipe_left.apply_translation([0, 0, -L / 2 - l / 2]) +pipe_left = trimesh.creation.cylinder(radius=rp, height=l_pipe, sections=128) +pipe_left.apply_translation([0, 0, -L / 2 - l_pipe / 2]) -pipe_right = trimesh.creation.cylinder(radius=rp, height=l, sections=128) -pipe_right.apply_translation([0, 0, L / 2 + l / 2]) +pipe_right = trimesh.creation.cylinder(radius=rp, height=l_pipe, sections=128) +pipe_right.apply_translation([0, 0, L / 2 + l_pipe / 2]) # Combine into one vacuum structure solid_cavity = trimesh.util.concatenate([pipe_left, cavity, pipe_right]) @@ -39,42 +38,60 @@ rc_outer = rc + shell_thickness rp_outer = rp + shell_thickness -shell_cavity = trimesh.creation.cylinder(radius=rc_outer, height=L+shell_thickness*2, sections=128) -shell_cavity = trimesh.boolean.difference([shell_cavity, cavity], engine='manifold') -shell_hole = trimesh.creation.cylinder(radius=rp_outer, height=L + shell_thickness*2, sections=128) -shell_cavity = trimesh.boolean.difference([shell_cavity, shell_hole], engine='manifold') +shell_cavity = trimesh.creation.cylinder( + radius=rc_outer, height=L + shell_thickness * 2, sections=128 +) +shell_cavity = trimesh.boolean.difference([shell_cavity, cavity], engine="manifold") +shell_hole = trimesh.creation.cylinder( + radius=rp_outer, height=L + shell_thickness * 2, sections=128 +) +shell_cavity = trimesh.boolean.difference([shell_cavity, shell_hole], engine="manifold") # Hollow beam pipes (outer shell - inner hole) -outer_pipe_left = trimesh.creation.cylinder(radius=rp_outer, height=l, sections=128) -inner_pipe_left = trimesh.creation.cylinder(radius=rp, height=l + extra_shell, sections=128) - -hollow_pipe_left = trimesh.boolean.difference([outer_pipe_left, inner_pipe_left], engine='manifold') -hollow_pipe_left.apply_translation([0, 0, -L / 2 - l / 2]) - -outer_pipe_right = trimesh.creation.cylinder(radius=rp_outer, height=l, sections=128) -inner_pipe_right = trimesh.creation.cylinder(radius=rp, height=l + extra_shell, sections=128) - -hollow_pipe_right = trimesh.boolean.difference([outer_pipe_right, inner_pipe_right], engine='manifold') -hollow_pipe_right.apply_translation([0, 0, L / 2 + l / 2]) +outer_pipe_left = trimesh.creation.cylinder( + radius=rp_outer, height=l_pipe, sections=128 +) +inner_pipe_left = trimesh.creation.cylinder( + radius=rp, height=l_pipe + extra_shell, sections=128 +) + +hollow_pipe_left = trimesh.boolean.difference( + [outer_pipe_left, inner_pipe_left], engine="manifold" +) +hollow_pipe_left.apply_translation([0, 0, -L / 2 - l_pipe / 2]) + +outer_pipe_right = trimesh.creation.cylinder( + radius=rp_outer, height=l_pipe, sections=128 +) +inner_pipe_right = trimesh.creation.cylinder( + radius=rp, height=l_pipe + extra_shell, sections=128 +) + +hollow_pipe_right = trimesh.boolean.difference( + [outer_pipe_right, inner_pipe_right], engine="manifold" +) +hollow_pipe_right.apply_translation([0, 0, L / 2 + l_pipe / 2]) # Combine into one outer shell structure -solid_shell = trimesh.util.concatenate([hollow_pipe_left, shell_cavity, hollow_pipe_right]) +solid_shell = trimesh.util.concatenate( + [hollow_pipe_left, shell_cavity, hollow_pipe_right] +) # Save meshes as STL -solid_cavity.export('./data/hollow_cavity.stl') -solid_shell.export('./data/hollow_shell.stl') +solid_cavity.export("./data/hollow_cavity.stl") +solid_shell.export("./data/hollow_shell.stl") # Geometry & Materials -solid_1 = './data/hollow_cavity.stl' -solid_2 = './data/hollow_shell.stl' -stl_solids = {'cavity': solid_1, - 'shell': solid_2} +solid_1 = "./data/hollow_cavity.stl" +solid_2 = "./data/hollow_shell.stl" +stl_solids = {"cavity": solid_1, "shell": solid_2} -stl_materials = {'cavity': 'vacuum', - 'shell': [1e3, 1.0, 1e3] # [eps_r, mu_r, sigma[S/m]] - } +stl_materials = { + "cavity": "vacuum", + "shell": [1e3, 1.0, 1e3], # [eps_r, mu_r, sigma[S/m]] +} # Extract domain bounds from geometry solids = pv.read(solid_1) + pv.read(solid_2) @@ -86,115 +103,155 @@ Nz = 41 # set grid and geometry -grid = GridFIT3D(xmin, xmax, ymin, ymax, zmin, zmax, - Nx, Ny, Nz, - stl_solids=stl_solids, - stl_materials=stl_materials, - stl_scale=1, - stl_rotate=[0, 0, 0], - stl_translate=[0, 0, 0], - verbose=1, - stl_tol=1e-4) +grid = GridFIT3D( + xmin, + xmax, + ymin, + ymax, + zmin, + zmax, + Nx, + Ny, + Nz, + stl_solids=stl_solids, + stl_materials=stl_materials, + stl_scale=1, + stl_rotate=[0, 0, 0], + stl_translate=[0, 0, 0], + verbose=1, + stl_tol=1e-4, +) # ------------ Beam source & Wake ---------------- # Beam parameters sigmaz = 20e-3 # [m] -> 2 GHz q = 4.5e-8 # [C] beta = 1.0 # beam beta -xs = 0. # x source position [m] -ys = 0. # y source position [m] -xt = 0. # x test position [m] -yt = 0. # y test position [m] +xs = 0.0 # x source position [m] +ys = 0.0 # y source position [m] +xt = 0.0 # x test position [m] +yt = 0.0 # y test position [m] # Simualtion -wakelength = 100. # [m] +wakelength = 100.0 # [m] add_space = 10 # no. cells to skip from boundaries - removes BC artifacts -wake = WakeSolver(q=q, - sigmaz=sigmaz, - beta=beta, - xsource=xs, ysource=ys, - xtest=xt, ytest=yt, - add_space=add_space, - counter_moving=True, - results_folder='006_results/', - Ez_file='006_results/006_Ez.h5') +wake = WakeSolver( + q=q, + sigmaz=sigmaz, + beta=beta, + xsource=xs, + ysource=ys, + xtest=xt, + ytest=yt, + add_space=add_space, + counter_moving=True, + results_folder="006_results/", + Ez_file="006_results/006_Ez.h5", +) # ----------- Solver & Simulation ---------- # boundary conditions`` -bc_low = ['pec', 'pec', 'pec'] -bc_high = ['pec', 'pec', 'pec'] +bc_low = ["pec", "pec", "pec"] +bc_high = ["pec", "pec", "pec"] -frequencies = [1.14325797e+09, 2.60602907e+09, 3.55458372e+09, 4.06380779e+09, 4.70782647e+09] +frequencies = [ + 1.14325797e09, + 2.60602907e09, + 3.55458372e09, + 4.06380779e09, + 4.70782647e09, +] -monitor = FieldMonitor(frequencies=frequencies) # we assume we already found the fundamental mode frequency +monitor = FieldMonitor( + frequencies=frequencies +) # we assume we already found the fundamental mode frequency # Solver setup -solver = SolverFIT3D(grid, wake, - bc_low=bc_low, - bc_high=bc_high, - use_stl=True, - bg='pec' # Background material - ) +solver = SolverFIT3D( + grid, + wake, + bc_low=bc_low, + bc_high=bc_high, + use_stl=True, + bg="pec", # Background material +) solver.ieps.inspect() # Solver run -solver.wakesolve(wakelength=wakelength, - add_space=add_space, - plot=False, # turn False for speedup - plot_every=30, plot_until=3000, - use_field_monitor=True, - field_monitor=monitor - ) +solver.wakesolve( + wakelength=wakelength, + add_space=add_space, + plot=False, # turn False for speedup + plot_every=30, + plot_until=3000, + use_field_monitor=True, + field_monitor=monitor, +) solver.ieps.inspect() freq_field = monitor.get_components() -np.savez('./006_results/field_at_frequencies.npz', Ex=freq_field['Ex'], Ey=freq_field['Ey'], Ez=freq_field['Ez']) - -Ez = freq_field['Ez'][0] # Z field at the first frequency (only frequency in our case) +np.savez( + "./006_results/field_at_frequencies.npz", + Ex=freq_field["Ex"], + Ey=freq_field["Ey"], + Ez=freq_field["Ez"], +) + +Ez = freq_field["Ez"][0] # Z field at the first frequency (only frequency in our case) Ez_flat = np.reshape(Ez, solver.N) -solver.grid.grid.cell_data['Ez_mag'] = np.real(Ez_flat) +solver.grid.grid.cell_data["Ez_mag"] = np.real(Ez_flat) # interactive slice pl = pv.Plotter() -pl.add_mesh_clip_plane(solver.grid.grid, scalars='Ez_mag', cmap='inferno', show_scalar_bar=True) +pl.add_mesh_clip_plane( + solver.grid.grid, scalars="Ez_mag", cmap="inferno", show_scalar_bar=True +) pl.show() -Ez = freq_field['Ez'][1] # Z field at the first frequency (only frequency in our case) +Ez = freq_field["Ez"][1] # Z field at the first frequency (only frequency in our case) Ez_flat = np.reshape(Ez, solver.N) -solver.grid.grid.cell_data['Ez_mag'] = np.real(Ez_flat) +solver.grid.grid.cell_data["Ez_mag"] = np.real(Ez_flat) # interactive slice pl = pv.Plotter() -pl.add_mesh_clip_plane(solver.grid.grid, scalars='Ez_mag', cmap='inferno', show_scalar_bar=True) +pl.add_mesh_clip_plane( + solver.grid.grid, scalars="Ez_mag", cmap="inferno", show_scalar_bar=True +) pl.show() -Ez = freq_field['Ez'][2] # Z field at the first frequency (only frequency in our case) +Ez = freq_field["Ez"][2] # Z field at the first frequency (only frequency in our case) Ez_flat = np.reshape(Ez, solver.N) -solver.grid.grid.cell_data['Ez_mag'] = np.real(Ez_flat) +solver.grid.grid.cell_data["Ez_mag"] = np.real(Ez_flat) # interactive slice pl = pv.Plotter() -pl.add_mesh_clip_plane(solver.grid.grid, scalars='Ez_mag', cmap='inferno', show_scalar_bar=True) +pl.add_mesh_clip_plane( + solver.grid.grid, scalars="Ez_mag", cmap="inferno", show_scalar_bar=True +) pl.show() -Ez = freq_field['Ez'][3] # Z field at the first frequency (only frequency in our case) +Ez = freq_field["Ez"][3] # Z field at the first frequency (only frequency in our case) Ez_flat = np.reshape(Ez, solver.N) -solver.grid.grid.cell_data['Ez_mag'] = np.real(Ez_flat) +solver.grid.grid.cell_data["Ez_mag"] = np.real(Ez_flat) # interactive slice pl = pv.Plotter() -pl.add_mesh_clip_plane(solver.grid.grid, scalars='Ez_mag', cmap='inferno', show_scalar_bar=True) +pl.add_mesh_clip_plane( + solver.grid.grid, scalars="Ez_mag", cmap="inferno", show_scalar_bar=True +) pl.show() -Ez = freq_field['Ez'][4] # Z field at the first frequency (only frequency in our case) +Ez = freq_field["Ez"][4] # Z field at the first frequency (only frequency in our case) Ez_flat = np.reshape(Ez, solver.N) -solver.grid.grid.cell_data['Ez_mag'] = np.real(Ez_flat) +solver.grid.grid.cell_data["Ez_mag"] = np.real(Ez_flat) # interactive slice pl = pv.Plotter() -pl.add_mesh_clip_plane(solver.grid.grid, scalars='Ez_mag', cmap='inferno', show_scalar_bar=True) -pl.show() \ No newline at end of file +pl.add_mesh_clip_plane( + solver.grid.grid, scalars="Ez_mag", cmap="inferno", show_scalar_bar=True +) +pl.show() diff --git a/examples/fdtd/script.py b/examples/fdtd/script.py index 826407c..371e86a 100644 --- a/examples/fdtd/script.py +++ b/examples/fdtd/script.py @@ -1,15 +1,14 @@ import numpy as np -from scipy.constants import c as c_light, epsilon_0 as eps_0, mu_0 as mu_0 +from scipy.constants import c as c_light, mu_0 as mu_0 import matplotlib.pyplot as plt -from matplotlib import patches import os from tqdm import tqdm from solver2D import EMSolver2D from grid import Grid -from conductors import OutRect, Plane, ConductorsAssembly, InCircle, OutCircle +from conductors import OutRect, Plane, ConductorsAssembly, OutCircle from scipy.special import jv -L = 1. +L = 1.0 # Number of mesh cells N = 100 Nx = N @@ -19,13 +18,13 @@ dt = 0.01 -flag_i_inside = np.zeros(Nx + 2, 'bool') -flag_j_inside = np.zeros(Ny + 2, 'bool') +flag_i_inside = np.zeros(Nx + 2, "bool") +flag_j_inside = np.zeros(Ny + 2, "bool") -flag_in_conductors = np.zeros((Nx, Ny), dtype='bool') +flag_in_conductors = np.zeros((Nx, Ny), dtype="bool") -x_circ = 0. -y_circ = 0. +x_circ = 0.0 +y_circ = 0.0 r_circ = 0.4 xmin = -L / 2 xmax = L / 2 @@ -33,8 +32,8 @@ ymax = L / 2 Lx = L - 4 * dx Ly = L - 4 * dy -x_cent = 0. -y_cent = 0. +x_cent = 0.0 +y_cent = 0.0 rect = OutRect(Lx, Ly, x_cent, y_cent) circ = OutCircle(r_circ, x_circ, y_circ) @@ -42,11 +41,11 @@ q_plane = dx / 5 # -dx/3+2*dx plane = Plane(m_plane, q_plane, tol=0) conductors = ConductorsAssembly([circ]) -sol_type = 'FDTD' +sol_type = "FDTD" grid = Grid(xmin, xmax, ymin, ymax, Nx, Ny, conductors, sol_type) -i_s = int(1 * Nx / 2.) -j_s = int(1 * Ny / 2.) +i_s = int(1 * Nx / 2.0) +j_s = int(1 * Ny / 2.0) NCFL = 0.9 solver = EMSolver2D(grid, sol_type, NCFL, i_s, j_s) @@ -65,11 +64,11 @@ Nborrow[ii, jj] = len(grid.borrowing[ii, jj]) Nlend[ii, jj] = len(grid.lending[ii, jj]) -k = 8.5363/r_circ +k = 8.5363 / r_circ for ii in range(Nx): for jj in range(Ny): - x = (ii+0.5)*dx + xmin - y = (jj+0.5)*dy + ymin + x = (ii + 0.5) * dx + xmin + y = (jj + 0.5) * dy + ymin if abs(x) > 1e-14: thetacane = np.arctan(np.divide(y, x)) if x > 0 and y > 0: @@ -81,15 +80,17 @@ else: theta = -thetacane else: - theta = np.pi/2 + theta = np.pi / 2 r = np.sqrt(np.square(x) + np.square(y)) - if grid.flag_int_cell[ii,jj]: - solver.Hz[ii, jj] = jv(1, r*k)*np.cos(theta)*np.cos(0) # -k*c_light*solver.dt/2) + if grid.flag_int_cell[ii, jj]: + solver.Hz[ii, jj] = ( + jv(1, r * k) * np.cos(theta) * np.cos(0) + ) # -k*c_light*solver.dt/2) max_sol = solver.Hz -t_f = 1.1*2*np.pi/(k*c_light) -Nt = int(t_f/solver.dt) +t_f = 1.1 * 2 * np.pi / (k * c_light) +Nt = int(t_f / solver.dt) def gauss_space(x): @@ -97,12 +98,14 @@ def gauss_space(x): return 1 / (sigma * np.sqrt(2 * np.pi)) * np.exp(-np.square(x) / (2 * sigma)) -kappa = 8.5363/r_circ -w_t = c_light*kappa -freq_t = w_t/(2*np.pi) -per = 1/freq_t +kappa = 8.5363 / r_circ +w_t = c_light * kappa +freq_t = w_t / (2 * np.pi) +per = 1 / freq_t -ramp = lambda tt: 0.5 * (1 - np.cos(np.pi * tt)) + +def ramp(tt): + return 0.5 * (1 - np.cos(np.pi * tt)) def modulation(tt, r_time): @@ -117,7 +120,7 @@ def ramped_sine(tt, r_time): for t in tqdm(range(Nt)): - ''' + """ for ii in range(-6, 7): for jj in range(-6, 7): iii = solver.i_s + ii @@ -133,24 +136,29 @@ def ramped_sine(tt, r_time): solver.Jx[iii, jjj] = amp #solver.Jy[iii, jjj] = amp - ''' + """ fig, axs = plt.subplots(1, 3, figsize=(16, 5)) fig.subplots_adjust(left=0.05, bottom=0.1, right=0.97, top=0.94, wspace=0.15) - im1 = axs[0].imshow(solver.Ex, cmap='jet', vmax=80, vmin=-80) # ,extent=[0, L , 0, L ]) - axs[0].set_xlabel('x [m]') - axs[0].set_ylabel('y [m]') - axs[0].set_title('Ex [V/m]') - fig.colorbar(im1, ax=axs[0], ) - im1 = axs[1].imshow(solver.Ey, cmap='jet', vmax=150, vmin=-150) - axs[1].set_xlabel('x [m]') - axs[1].set_ylabel('y [m]') - axs[1].set_title('Ey [V/m]') + im1 = axs[0].imshow( + solver.Ex, cmap="jet", vmax=80, vmin=-80 + ) # ,extent=[0, L , 0, L ]) + axs[0].set_xlabel("x [m]") + axs[0].set_ylabel("y [m]") + axs[0].set_title("Ex [V/m]") + fig.colorbar( + im1, + ax=axs[0], + ) + im1 = axs[1].imshow(solver.Ey, cmap="jet", vmax=150, vmin=-150) + axs[1].set_xlabel("x [m]") + axs[1].set_ylabel("y [m]") + axs[1].set_title("Ey [V/m]") fig.colorbar(im1, ax=axs[1]) - im1 = axs[2].imshow(solver.Hz, cmap='jet' , vmax=0.5, vmin=-0.5) - axs[2].set_xlabel('x [m]') - axs[2].set_ylabel('y [m]') - axs[2].set_title('Hz [A/m]') + im1 = axs[2].imshow(solver.Hz, cmap="jet", vmax=0.5, vmin=-0.5) + axs[2].set_xlabel("x [m]") + axs[2].set_ylabel("y [m]") + axs[2].set_title("Hz [A/m]") fig.colorbar(im1, ax=axs[2]) plt.suptitle(str(solver.time)) # im1 = axs[1,0].imshow(Hx.T,cmap='jet',origin='lower')#,extent=[0, L , 0, L ]) @@ -168,11 +176,11 @@ def ramped_sine(tt, r_time): # axs[1,2].set_ylabel('y [m]') # axs[1,2].set_title('Ez [V/m]') # fig.colorbar(im1, ax=axs[1,2]) - folder = 'CFDTD_images' + folder = "CFDTD_images" if not os.path.exists(folder): os.mkdir(folder) - filename = folder + '/%d.png' % t + filename = folder + "/%d.png" % t plt.savefig(filename) plt.close(fig) @@ -183,8 +191,8 @@ def ramped_sine(tt, r_time): for ii in range(Nx + 1): for jj in range(Ny + 1): - x = (ii+0.5)*dx + xmin - y = (jj+0.5)*dy + ymin + x = (ii + 0.5) * dx + xmin + y = (jj + 0.5) * dy + ymin if abs(x) > 1e-14: thetacane = np.arctan(np.divide(y, x)) if x > 0 and y > 0: @@ -196,9 +204,9 @@ def ramped_sine(tt, r_time): else: theta = -thetacane else: - theta = np.pi/2 + theta = np.pi / 2 r = np.sqrt(np.square(x) + np.square(y)) - sol[ii, jj] = jv(1, r * k) * np.cos(theta) * np.cos(-k*c_light*solver.time) + sol[ii, jj] = jv(1, r * k) * np.cos(theta) * np.cos(-k * c_light * solver.time) -err = np.linalg.norm(solver.Hz - sol)*dx*dy/np.linalg.norm(max_sol) +err = np.linalg.norm(solver.Hz - sol) * dx * dy / np.linalg.norm(max_sol) print(err) diff --git a/examples/fdtd/script_circ_cav.py b/examples/fdtd/script_circ_cav.py index 03079d2..010965a 100644 --- a/examples/fdtd/script_circ_cav.py +++ b/examples/fdtd/script_circ_cav.py @@ -1,15 +1,14 @@ import numpy as np -from scipy.constants import c as c_light, epsilon_0 as eps_0, mu_0 as mu_0 +from scipy.constants import c as c_light, mu_0 as mu_0 import matplotlib.pyplot as plt -from matplotlib import patches import os from tqdm import tqdm from solver2D import EMSolver2D from grid2D import Grid2D -from conductors import OutRect, Plane, ConductorsAssembly, InCircle, OutCircle +from conductors import OutRect, Plane, ConductorsAssembly, OutCircle from scipy.special import jv -L = 1. +L = 1.0 # Number of mesh cells N = 50 Nx = N @@ -19,13 +18,13 @@ dt = 0.01 -flag_i_inside = np.zeros(Nx + 2, 'bool') -flag_j_inside = np.zeros(Ny + 2, 'bool') +flag_i_inside = np.zeros(Nx + 2, "bool") +flag_j_inside = np.zeros(Ny + 2, "bool") -flag_in_conductors = np.zeros((Nx, Ny), dtype='bool') +flag_in_conductors = np.zeros((Nx, Ny), dtype="bool") -x_circ = 0. -y_circ = 0. +x_circ = 0.0 +y_circ = 0.0 r_circ = 0.4 xmin = -L / 2 xmax = L / 2 @@ -33,8 +32,8 @@ ymax = L / 2 Lx = L - 4 * dx Ly = L - 4 * dy -x_cent = 0. -y_cent = 0. +x_cent = 0.0 +y_cent = 0.0 rect = OutRect(Lx, Ly, x_cent, y_cent) circ = OutCircle(r_circ, x_circ, y_circ) @@ -42,15 +41,15 @@ q_plane = dx / 5 # -dx/3+2*dx plane = Plane(m_plane, q_plane, tol=0) conductors = ConductorsAssembly([circ]) -sol_type = 'ECT' +sol_type = "ECT" grid = Grid2D(xmin, xmax, ymin, ymax, Nx, Ny, conductors, sol_type) -i_s = int(1 * Nx / 2.) -j_s = int(1 * Ny / 2.) +i_s = int(1 * Nx / 2.0) +j_s = int(1 * Ny / 2.0) NCFL = 0.99 -bc_low = ['dirichlet', 'dirichlet', 'dirichlet'] -bc_high = ['dirichlet', 'dirichlet', 'dirichlet'] +bc_low = ["dirichlet", "dirichlet", "dirichlet"] +bc_high = ["dirichlet", "dirichlet", "dirichlet"] solver = EMSolver2D(grid, sol_type, NCFL, i_s, j_s, bc_low, bc_low) Nt = 5000 @@ -63,16 +62,16 @@ Nborrow = np.zeros((Nx, Ny)) Nlend = np.zeros((Nx, Ny)) -#for ii in range(Nx): +# for ii in range(Nx): # for jj in range(Ny): # Nborrow[ii, jj] = len(grid.borrowing[ii, jj]) # Nlend[ii, jj] = len(grid.lending[ii, jj]) -k = 8.5363/r_circ +k = 8.5363 / r_circ for ii in range(Nx): for jj in range(Ny): - x = (ii+0.5)*dx + xmin - y = (jj+0.5)*dy + ymin + x = (ii + 0.5) * dx + xmin + y = (jj + 0.5) * dy + ymin if abs(x) > 1e-14: thetacane = np.arctan(np.divide(y, x)) if x > 0 and y > 0: @@ -84,28 +83,33 @@ else: theta = -thetacane else: - theta = np.pi/2 + theta = np.pi / 2 r = np.sqrt(np.square(x) + np.square(y)) - if grid.flag_int_cell[ii,jj]: - solver.Hz[ii, jj] = jv(1, r*k)*np.cos(theta)*np.cos(0) # -k*c_light*solver.dt/2) + if grid.flag_int_cell[ii, jj]: + solver.Hz[ii, jj] = ( + jv(1, r * k) * np.cos(theta) * np.cos(0) + ) # -k*c_light*solver.dt/2) max_sol = solver.Hz -t_f = 1.1*2*np.pi/(k*c_light) -Nt = int(t_f/solver.dt) -#Nt = 0 +t_f = 1.1 * 2 * np.pi / (k * c_light) +Nt = int(t_f / solver.dt) +# Nt = 0 + def gauss_space(x): sigma = dx / 10 return 1 / (sigma * np.sqrt(2 * np.pi)) * np.exp(-np.square(x) / (2 * sigma)) -kappa = 8.5363/r_circ -w_t = c_light*kappa -freq_t = w_t/(2*np.pi) -per = 1/freq_t +kappa = 8.5363 / r_circ +w_t = c_light * kappa +freq_t = w_t / (2 * np.pi) +per = 1 / freq_t + -ramp = lambda tt: 0.5 * (1 - np.cos(np.pi * tt)) +def ramp(tt): + return 0.5 * (1 - np.cos(np.pi * tt)) def modulation(tt, r_time): @@ -120,7 +124,7 @@ def ramped_sine(tt, r_time): for t in tqdm(range(Nt)): - ''' + """ for ii in range(-6, 7): for jj in range(-6, 7): iii = solver.i_s + ii @@ -136,24 +140,29 @@ def ramped_sine(tt, r_time): solver.Jx[iii, jjj] = amp #solver.Jy[iii, jjj] = amp - ''' + """ fig, axs = plt.subplots(1, 3, figsize=(16, 5)) fig.subplots_adjust(left=0.05, bottom=0.1, right=0.97, top=0.94, wspace=0.15) - im1 = axs[0].imshow(solver.Ex, cmap='jet', vmax=80, vmin=-80) # ,extent=[0, L , 0, L ]) - axs[0].set_xlabel('x [m]') - axs[0].set_ylabel('y [m]') - axs[0].set_title('Ex [V/m]') - fig.colorbar(im1, ax=axs[0], ) - im1 = axs[1].imshow(solver.Ey, cmap='jet', vmax=150, vmin=-150) - axs[1].set_xlabel('x [m]') - axs[1].set_ylabel('y [m]') - axs[1].set_title('Ey [V/m]') + im1 = axs[0].imshow( + solver.Ex, cmap="jet", vmax=80, vmin=-80 + ) # ,extent=[0, L , 0, L ]) + axs[0].set_xlabel("x [m]") + axs[0].set_ylabel("y [m]") + axs[0].set_title("Ex [V/m]") + fig.colorbar( + im1, + ax=axs[0], + ) + im1 = axs[1].imshow(solver.Ey, cmap="jet", vmax=150, vmin=-150) + axs[1].set_xlabel("x [m]") + axs[1].set_ylabel("y [m]") + axs[1].set_title("Ey [V/m]") fig.colorbar(im1, ax=axs[1]) - im1 = axs[2].imshow(solver.Hz, cmap='jet' , vmax=0.5, vmin=-0.5) - axs[2].set_xlabel('x [m]') - axs[2].set_ylabel('y [m]') - axs[2].set_title('Hz [A/m]') + im1 = axs[2].imshow(solver.Hz, cmap="jet", vmax=0.5, vmin=-0.5) + axs[2].set_xlabel("x [m]") + axs[2].set_ylabel("y [m]") + axs[2].set_title("Hz [A/m]") fig.colorbar(im1, ax=axs[2]) plt.suptitle(str(solver.time)) # im1 = axs[1,0].imshow(Hx.T,cmap='jet',origin='lower')#,extent=[0, L , 0, L ]) @@ -171,11 +180,11 @@ def ramped_sine(tt, r_time): # axs[1,2].set_ylabel('y [m]') # axs[1,2].set_title('Ez [V/m]') # fig.colorbar(im1, ax=axs[1,2]) - folder = 'CFDTD_images' + folder = "CFDTD_images" if not os.path.exists(folder): os.mkdir(folder) - filename = folder + '/%d.png' % t + filename = folder + "/%d.png" % t plt.savefig(filename) plt.close(fig) @@ -186,8 +195,8 @@ def ramped_sine(tt, r_time): for ii in range(Nx + 1): for jj in range(Ny + 1): - x = (ii+0.5)*dx + xmin - y = (jj+0.5)*dy + ymin + x = (ii + 0.5) * dx + xmin + y = (jj + 0.5) * dy + ymin if abs(x) > 1e-14: thetacane = np.arctan(np.divide(y, x)) if x > 0 and y > 0: @@ -199,9 +208,9 @@ def ramped_sine(tt, r_time): else: theta = -thetacane else: - theta = np.pi/2 + theta = np.pi / 2 r = np.sqrt(np.square(x) + np.square(y)) - sol[ii, jj] = jv(1, r * k) * np.cos(theta) * np.cos(-k*c_light*solver.time) + sol[ii, jj] = jv(1, r * k) * np.cos(theta) * np.cos(-k * c_light * solver.time) -err = np.linalg.norm(solver.Hz - sol)*dx*dy/np.linalg.norm(max_sol) +err = np.linalg.norm(solver.Hz - sol) * dx * dy / np.linalg.norm(max_sol) print(err) diff --git a/examples/fdtd/script_cube_cav.py b/examples/fdtd/script_cube_cav.py index 855edef..ea73f71 100644 --- a/examples/fdtd/script_cube_cav.py +++ b/examples/fdtd/script_cube_cav.py @@ -1,19 +1,17 @@ import numpy as np from scipy.constants import c as c_light, epsilon_0 as eps_0, mu_0 as mu_0 -import matplotlib + # matplotlib.use('Agg') from matplotlib import pyplot as plt -from matplotlib import patches import os from tqdm import tqdm from solver3D import EMSolver3D from grid3D import Grid3D from conductors3d import InCube, ConductorsAssembly, InSphere -from scipy.special import jv Z0 = np.sqrt(mu_0 / eps_0) -L = 1. +L = 1.0 # Number of mesh cells N = 50 Nx = N @@ -26,29 +24,29 @@ dy = L / Ny dz = L / Nz -LL = dx*3 - 0.3*dx +LL = dx * 3 - 0.3 * dx r_circ = 0.3 -xmin = -Lx/2 + dx / 2 -xmax = Lx/2 + dx / 2 -ymin = - Ly/2 + dx / 2 -ymax = Ly/2 + dx / 2 -zmin = - Lz/2 + dx / 2 -zmax = Lz/2 + dx / 2 - -lx = Lx*0.4 -ly = Ly*0.4 -lz = Lz*0.4 +xmin = -Lx / 2 + dx / 2 +xmax = Lx / 2 + dx / 2 +ymin = -Ly / 2 + dx / 2 +ymax = Ly / 2 + dx / 2 +zmin = -Lz / 2 + dx / 2 +zmax = Lz / 2 + dx / 2 + +lx = Lx * 0.4 +ly = Ly * 0.4 +lz = Lz * 0.4 x_cent = 0 y_cent = 0 z_cent = 0 cube = InCube(lx, ly, lz, x_cent, y_cent, z_cent) -theta = np.pi/8 +theta = np.pi / 8 sphere = InSphere(r_circ, x_cent, y_cent, z_cent) conductors = ConductorsAssembly([cube]) # conductors = cube -sol_type = 'FDTD' +sol_type = "FDTD" grid = Grid3D(xmin, xmax, ymin, ymax, zmin, zmax, Nx, Ny, Nz, conductors, sol_type) i_s = int(Nx / 2) @@ -76,7 +74,7 @@ Nlend = np.zeros((Nx, Ny)) minpatch = np.ones((Nx, Ny)) small_patch = np.ones((Nx, Ny), dtype=bool) -''' +""" Nborrow = np.zeros((Nx, Ny, Nz)) Nlend = np.zeros((Nx, Ny, Nz)) @@ -85,39 +83,75 @@ for kk in range(Nz): Nborrow[ii, jj, kk] = len(grid.borrowing_xy[ii, jj, kk]) Nlend[ii, jj, kk] = len(grid.lending_xy[ii, jj, kk]) -''' +""" m = 1 n = 0 p = 1 def analytic_sol_Hz(x, y, z, t): - Rm = np.array([[np.cos(-theta), - np.sin(-theta), 0],[np.sin(-theta), np.cos(-theta), 0], [0, 0, 1]]) + Rm = np.array( + [ + [np.cos(-theta), -np.sin(-theta), 0], + [np.sin(-theta), np.cos(-theta), 0], + [0, 0, 1], + ] + ) [x_0, y_0, z_0] = np.dot(Rm, np.array([x, y, z])) - return np.cos(m * np.pi / lx * (x_0 - lx/2)) * np.cos(n * np.pi / ly * (y_0 - ly/2)) * np.sin( - p * np.pi / lz * (z_0 - lz/2)) * np.cos(np.sqrt(2) * np.pi / lx * c_light * t) + return ( + np.cos(m * np.pi / lx * (x_0 - lx / 2)) + * np.cos(n * np.pi / ly * (y_0 - ly / 2)) + * np.sin(p * np.pi / lz * (z_0 - lz / 2)) + * np.cos(np.sqrt(2) * np.pi / lx * c_light * t) + ) h_2 = (m * np.pi / lx) ** 2 + (n * np.pi / ly) ** 2 + (p * np.pi / lz) ** 2 def analytic_sol_Hy(x, y, z, t): - Rm = np.array([[np.cos(-theta), - np.sin(-theta), 0],[np.sin(-theta), np.cos(-theta), 0], [0, 0, 1]]) + Rm = np.array( + [ + [np.cos(-theta), -np.sin(-theta), 0], + [np.sin(-theta), np.cos(-theta), 0], + [0, 0, 1], + ] + ) [x_0, y_0, z_0] = np.dot(Rm, np.array([x, y, z])) - return -2 / h_2 * (n * np.pi / ly) * (p * np.pi / lz) * np.cos(m * np.pi / lx * (x_0 - lx/2)) * np.sin( - n * np.pi / ly * (y_0 - ly/2)) * np.cos(p * np.pi / lz * (z_0 - lz/2)) * np.cos( - np.sqrt(2) * np.pi / lx * c_light * t) + return ( + -2 + / h_2 + * (n * np.pi / ly) + * (p * np.pi / lz) + * np.cos(m * np.pi / lx * (x_0 - lx / 2)) + * np.sin(n * np.pi / ly * (y_0 - ly / 2)) + * np.cos(p * np.pi / lz * (z_0 - lz / 2)) + * np.cos(np.sqrt(2) * np.pi / lx * c_light * t) + ) # return -0.9994120256621584*np.cos(m*np.pi/lx*(x_0 + lx/2))*np.sin(n*np.pi/ly*(y_0 + ly/2))*np.cos(p*np.pi/lz*(z_0 + lz/2))*np.cos(np.sqrt(2)*np.pi/lx*c_light*t) def analytic_sol_Hx(x, y, z, t): - Rm = np.array([[np.cos(-theta), - np.sin(-theta), 0],[np.sin(-theta), np.cos(-theta), 0], [0, 0, 1]]) + Rm = np.array( + [ + [np.cos(-theta), -np.sin(-theta), 0], + [np.sin(-theta), np.cos(-theta), 0], + [0, 0, 1], + ] + ) [x_0, y_0, z_0] = np.dot(Rm, np.array([x, y, z])) - return -2 / h_2 * (m * np.pi / lx) * (p * np.pi / lz) * np.sin(m * np.pi / lx * (x_0 - lx/2)) * np.cos( - n * np.pi / ly * (y_0 - ly/2)) * np.cos(p * np.pi / lz * (z_0 - lz/2)) * np.cos( - np.sqrt(2) * np.pi / lx * c_light * t) + return ( + -2 + / h_2 + * (m * np.pi / lx) + * (p * np.pi / lz) + * np.sin(m * np.pi / lx * (x_0 - lx / 2)) + * np.cos(n * np.pi / ly * (y_0 - ly / 2)) + * np.cos(p * np.pi / lz * (z_0 - lz / 2)) + * np.cos(np.sqrt(2) * np.pi / lx * c_light * t) + ) k = 2.7437 / r_circ @@ -125,7 +159,9 @@ def analytic_sol_Hx(x, y, z, t): for ii in range(Nx): for jj in range(Ny): for kk in range(Nz): - if grid.flag_int_cell_xy[ii, jj, kk]: # and not grid.flag_bound_cell_xy[ii, jj, kk]: + if grid.flag_int_cell_xy[ + ii, jj, kk + ]: # and not grid.flag_bound_cell_xy[ii, jj, kk]: x = (ii + 0.5) * dx + xmin y = (jj + 0.5) * dy + ymin z = kk * dz + zmin @@ -138,15 +174,15 @@ def analytic_sol_Hx(x, y, z, t): solver.Hy[ii, jj, kk] = analytic_sol_Hy(x, y, z, -0.5 * solver.dt) if grid.flag_int_cell_yz[ii, jj, kk]: - x = ii*dx + xmin - y = (jj + 0.5)*dy + ymin - z = (kk + 0.5)*dz + zmin + x = ii * dx + xmin + y = (jj + 0.5) * dy + ymin + z = (kk + 0.5) * dz + zmin solver.Hx[ii, jj, kk] = analytic_sol_Hx(x, y, z, -0.5 * solver.dt) -a = lx*np.sqrt(2)/3 -Tf = 1.1*np.sqrt(2)*(a/c_light) -Nt = int(Tf/solver.dt) +a = lx * np.sqrt(2) / 3 +Tf = 1.1 * np.sqrt(2) * (a / c_light) +Nt = int(Tf / solver.dt) res_Hy = np.zeros(Nt) res_Ex = np.zeros(Nt) @@ -158,62 +194,82 @@ def analytic_sol_Hx(x, y, z, t): if fields_norms: fig, axs = plt.subplots(1, 2, figsize=(16, 8)) fig.subplots_adjust(left=0.05, bottom=0.1, right=0.97, top=0.94, wspace=0.15) - norme = np.sqrt(np.square(solver.Ex[:, :, k_s]) + np.square(solver.Ey[:, :, k_s]) + np.square(solver.Ez[:, :, k_s])) - normh = np.sqrt(np.square(solver.Hx[:, :, k_s]) + np.square(solver.Hy[:, :, k_s]) + np.square(solver.Hz[:, :, k_s])) - - im1 = axs[0].imshow(norme, cmap='jet', vmax=530, vmin=-530) # ,extent=[0, L , 0, L ]) - axs[0].set_xlabel('x [m]') - axs[0].set_ylabel('y [m]') - axs[0].set_title('||E|| [V/m]') + norme = np.sqrt( + np.square(solver.Ex[:, :, k_s]) + + np.square(solver.Ey[:, :, k_s]) + + np.square(solver.Ez[:, :, k_s]) + ) + normh = np.sqrt( + np.square(solver.Hx[:, :, k_s]) + + np.square(solver.Hy[:, :, k_s]) + + np.square(solver.Hz[:, :, k_s]) + ) + + im1 = axs[0].imshow( + norme, cmap="jet", vmax=530, vmin=-530 + ) # ,extent=[0, L , 0, L ]) + axs[0].set_xlabel("x [m]") + axs[0].set_ylabel("y [m]") + axs[0].set_title("||E|| [V/m]") fig.colorbar(im1, ax=axs[0]) - im1 = axs[1].imshow(normh, cmap='jet', vmax=1, vmin=-1) - axs[1].set_xlabel('x [m]') - axs[1].set_ylabel('y [m]') - axs[1].set_title('||H|| [V/m]') + im1 = axs[1].imshow(normh, cmap="jet", vmax=1, vmin=-1) + axs[1].set_xlabel("x [m]") + axs[1].set_ylabel("y [m]") + axs[1].set_title("||H|| [V/m]") fig.colorbar(im1, ax=axs[1]) else: fig, axs = plt.subplots(2, 3, figsize=(16, 10)) fig.subplots_adjust(left=0.05, bottom=0.1, right=0.97, top=0.94, wspace=0.15) - im1 = axs[0, 0].imshow(solver.Ex[:, :, k_s], cmap='jet', vmax=530, vmin=-530) # ,extent=[0, L , 0, L ]) - axs[0, 0].set_xlabel('x [m]') - axs[0, 0].set_ylabel('y [m]') - axs[0, 0].set_title('Ex [V/m]') - fig.colorbar(im1, ax=axs[0, 0], ) - im1 = axs[0, 1].imshow(solver.Ey[:, :, k_s], cmap='jet', vmax=530, vmin=-530) - axs[0, 1].set_xlabel('x [m]') - axs[0, 1].set_ylabel('y [m]') - axs[0, 1].set_title('Ey [V/m]') + im1 = axs[0, 0].imshow( + solver.Ex[:, :, k_s], cmap="jet", vmax=530, vmin=-530 + ) # ,extent=[0, L , 0, L ]) + axs[0, 0].set_xlabel("x [m]") + axs[0, 0].set_ylabel("y [m]") + axs[0, 0].set_title("Ex [V/m]") + fig.colorbar( + im1, + ax=axs[0, 0], + ) + im1 = axs[0, 1].imshow(solver.Ey[:, :, k_s], cmap="jet", vmax=530, vmin=-530) + axs[0, 1].set_xlabel("x [m]") + axs[0, 1].set_ylabel("y [m]") + axs[0, 1].set_title("Ey [V/m]") fig.colorbar(im1, ax=axs[0, 1]) - im1 = axs[0, 2].imshow(solver.Ez[:, :, k_s], cmap='jet', vmax=530, vmin=-530) - axs[0, 2].set_xlabel('x [m]') - axs[0, 2].set_ylabel('y [m]') - axs[0, 2].set_title('Ez [V/m]') + im1 = axs[0, 2].imshow(solver.Ez[:, :, k_s], cmap="jet", vmax=530, vmin=-530) + axs[0, 2].set_xlabel("x [m]") + axs[0, 2].set_ylabel("y [m]") + axs[0, 2].set_title("Ez [V/m]") fig.colorbar(im1, ax=axs[0, 2]) - im1 = axs[1, 0].imshow(solver.Hx[:, :, k_s], cmap='jet', vmax=0.1, vmin=-0.1) # ,extent=[0, L , 0, L ]) - axs[1, 0].set_xlabel('x [m]') - axs[1, 0].set_ylabel('y [m]') - axs[1, 0].set_title('Hx [A/m]') - fig.colorbar(im1, ax=axs[1, 0], ) - im1 = axs[1, 1].imshow(solver.Hy[:, :, k_s], cmap='jet', vmax=0.17, vmin=-0.17) - axs[1, 1].set_xlabel('x [m]') - axs[1, 1].set_ylabel('y [m]') - axs[1, 1].set_title('Hy [A/m]') + im1 = axs[1, 0].imshow( + solver.Hx[:, :, k_s], cmap="jet", vmax=0.1, vmin=-0.1 + ) # ,extent=[0, L , 0, L ]) + axs[1, 0].set_xlabel("x [m]") + axs[1, 0].set_ylabel("y [m]") + axs[1, 0].set_title("Hx [A/m]") + fig.colorbar( + im1, + ax=axs[1, 0], + ) + im1 = axs[1, 1].imshow(solver.Hy[:, :, k_s], cmap="jet", vmax=0.17, vmin=-0.17) + axs[1, 1].set_xlabel("x [m]") + axs[1, 1].set_ylabel("y [m]") + axs[1, 1].set_title("Hy [A/m]") fig.colorbar(im1, ax=axs[1, 1]) - im1 = axs[1, 2].imshow(solver.Hz[:, :, k_s], cmap='jet', vmax=1, vmin=-1) - axs[1, 2].set_xlabel('x [m]') - axs[1, 2].set_ylabel('y [m]') - axs[1, 2].set_title('Hz [A/m]') + im1 = axs[1, 2].imshow(solver.Hz[:, :, k_s], cmap="jet", vmax=1, vmin=-1) + axs[1, 2].set_xlabel("x [m]") + axs[1, 2].set_ylabel("y [m]") + axs[1, 2].set_title("Hz [A/m]") fig.colorbar(im1, ax=axs[1, 2]) plt.suptitle(str(solver.time)) - - folder = sol_type + '_images_cube' + + folder = sol_type + "_images_cube" if not os.path.exists(folder): os.mkdir(folder) - filename = folder + '/%d.png' % t + filename = folder + "/%d.png" % t plt.savefig(filename) - plt.close(fig) + plt.close(fig) res_Hy[t] = solver.Hy[i_s, j_s, 5] res_Hz[t] = solver.Hz[i_s, 5, k_s] @@ -223,7 +279,7 @@ def analytic_sol_Hx(x, y, z, t): # solver.Jx[i_s, j_s, k_s] = solver.gauss(solver.time) # solver.Hz[i_s, j_s, k_s] += solver.gauss(solver.time) # solver.Jz[i_s, j_s, k_s] = solver.gauss(solver.time) -''' +""" fig, axs = plt.subplots(2, 3, figsize=(16, 10)) fig.subplots_adjust(left=0.05, bottom=0.1, right=0.97, top=0.94, wspace=0.15) axs[0, 0].imshow(grid.flag_int_cell_xy[:, :, k_s]) @@ -232,4 +288,4 @@ def analytic_sol_Hx(x, y, z, t): axs[1, 0].imshow(solver.Hz[:, :, k_s], cmap='jet') axs[1, 1].imshow(solver.Hx[:, :, k_s], cmap='jet') axs[1, 2].imshow(solver.Hy[:, :, k_s], cmap='jet') -''' +""" diff --git a/examples/fdtd/script_open_space.py b/examples/fdtd/script_open_space.py index 4a5262e..73c4f45 100644 --- a/examples/fdtd/script_open_space.py +++ b/examples/fdtd/script_open_space.py @@ -1,54 +1,51 @@ import numpy as np -from scipy.constants import c as c_light, epsilon_0 as eps_0, mu_0 as mu_0 -import matplotlib +from scipy.constants import epsilon_0 as eps_0, mu_0 as mu_0 + # matplotlib.use('Agg') from matplotlib import pyplot as plt -from matplotlib import patches import os from tqdm import tqdm from solver3D import EMSolver3D from grid3D import Grid3D from conductors3d import ConductorsAssembly, InSphere -from scipy.special import spherical_jn Z0 = np.sqrt(mu_0 / eps_0) -L = 1. +L = 1.0 # Number of mesh cells N = 50 Nx = N Ny = N Nz = N -Lx = 0.5*L -Ly = 0.5*L -Lz = 0.5*L +Lx = 0.5 * L +Ly = 0.5 * L +Lz = 0.5 * L dx = L / Nx dy = L / Ny dz = L / Nz N_radius = 5 -r_sphere = 0.15 #N_radius*dx -xmin = -L / 2 # + dx / 2 -xmax = L / 2 #+ dx / 2 -ymin = -L / 2 #+ dy / 2 -ymax = L / 2 #+ dy / 2 -zmin = -L / 2 #+ dz / 2 -zmax = L / 2 #+ dz / 2 +r_sphere = 0.15 # N_radius*dx +xmin = -L / 2 # + dx / 2 +xmax = L / 2 # + dx / 2 +ymin = -L / 2 # + dy / 2 +ymax = L / 2 # + dy / 2 +zmin = -L / 2 # + dz / 2 +zmax = L / 2 # + dz / 2 x_cent = 0 y_cent = 0 z_cent = 0 - sphere = InSphere(r_sphere, x_cent, y_cent, z_cent) conductors = ConductorsAssembly([sphere]) -#cond = noConductor() -#conductors = ConductorsAssembly([cond]) +# cond = noConductor() +# conductors = ConductorsAssembly([cond]) # conductors = cube -sol_type = 'ECT' +sol_type = "ECT" grid = Grid3D(xmin, xmax, ymin, ymax, zmin, zmax, Nx, Ny, Nz, conductors, sol_type) i_s = int(Nx / 4) @@ -58,8 +55,8 @@ flag_in_conductor = np.zeros((Nx, Ny, Nz), dtype=bool) -bc_low = ['pml', 'pml', 'pml'] -bc_high = ['pml', 'pml', 'pml'] +bc_low = ["pml", "pml", "pml"] +bc_high = ["pml", "pml", "pml"] solver = EMSolver3D(grid, sol_type, NCFL, i_s, j_s, k_s, bc_low, bc_high) # Constants @@ -78,159 +75,162 @@ res_Ex = np.zeros(Nt) res_Hz = np.zeros(Nt) -Px = np.sqrt(2)/2 -Py = np.sqrt(2)/2 +Px = np.sqrt(2) / 2 +Py = np.sqrt(2) / 2 fields_norms = False + def get_field_x_plane(field_str, solver, i_cut): bc_low = solver.bc_low bc_high = solver.bc_high - if bc_low[1] is 'pml' and bc_low[2] is 'pml': + if bc_low[1] == "pml" and bc_low[2] == "pml": f00 = solver.blocks_mat[1, 0, 0].__getattribute__(field_str)[i_cut, :, :] - if bc_low[2] is 'pml': + if bc_low[2] == "pml": f10 = solver.blocks_mat[1, 1, 0].__getattribute__(field_str)[i_cut, :, :] - if bc_high[1] is 'pml' and bc_low[2] is 'pml': + if bc_high[1] == "pml" and bc_low[2] == "pml": f20 = solver.blocks_mat[1, 2, 0].__getattribute__(field_str)[i_cut, :, :] - if bc_low[1] is 'pml': + if bc_low[1] == "pml": f01 = solver.blocks_mat[1, 0, 1].__getattribute__(field_str)[i_cut, :, :] f11 = solver.__getattribute__(field_str)[i_cut, :, :] - if bc_high[1] is 'pml': + if bc_high[1] == "pml": f21 = solver.blocks_mat[1, 2, 1].__getattribute__(field_str)[i_cut, :, :] - if bc_low[1] is 'pml' and bc_high[2] is 'pml': + if bc_low[1] == "pml" and bc_high[2] == "pml": f02 = solver.blocks_mat[1, 0, 2].__getattribute__(field_str)[i_cut, :, :] - if bc_high[2] is 'pml': + if bc_high[2] == "pml": f12 = solver.blocks_mat[1, 1, 2].__getattribute__(field_str)[i_cut, :, :] - if bc_high[1] is 'pml' and bc_high[2] is 'pml': + if bc_high[1] == "pml" and bc_high[2] == "pml": f22 = solver.blocks_mat[1, 2, 2].__getattribute__(field_str)[i_cut, :, :] f = f11 - if bc_low[1] is 'pml': + if bc_low[1] == "pml": f = np.concatenate((f01, f), axis=0) - if bc_high[1] is 'pml': + if bc_high[1] == "pml": f = np.concatenate((f, f21), axis=0) - if bc_low[2] is 'pml': + if bc_low[2] == "pml": f3 = f10 - if bc_low[1] is 'pml': + if bc_low[1] == "pml": f3 = np.concatenate((f00, f3), axis=0) - if bc_high[1] is 'pml': + if bc_high[1] == "pml": f3 = np.concatenate((f3, f20), axis=0) f = np.concatenate((f3, f), axis=1) - if bc_high[2] is 'pml': + if bc_high[2] == "pml": f3 = f12 - if bc_low[1] is 'pml': + if bc_low[1] == "pml": f3 = np.concatenate((f02, f3), axis=0) - if bc_high[1] is 'pml': + if bc_high[1] == "pml": f3 = np.concatenate((f3, f22), axis=0) f = np.concatenate((f, f3), axis=1) return f + def get_field_y_plane(field_str, solver, j_cut): bc_low = solver.bc_low bc_high = solver.bc_high - if bc_low[0] is 'pml' and bc_low[2] is 'pml': + if bc_low[0] == "pml" and bc_low[2] == "pml": f00 = solver.blocks_mat[0, 1, 0].__getattribute__(field_str)[:, j_cut, :] - if bc_low[2] is 'pml': + if bc_low[2] == "pml": f10 = solver.blocks_mat[1, 1, 0].__getattribute__(field_str)[:, j_cut, :] - if bc_high[0] is 'pml' and bc_low[2] is 'pml': + if bc_high[0] == "pml" and bc_low[2] == "pml": f20 = solver.blocks_mat[2, 1, 0].__getattribute__(field_str)[:, j_cut, :] - if bc_low[0] is 'pml': + if bc_low[0] == "pml": f01 = solver.blocks_mat[0, 1, 1].__getattribute__(field_str)[:, j_cut, :] f11 = solver.__getattribute__(field_str)[:, j_cut, :] - if bc_high[0] is 'pml': + if bc_high[0] == "pml": f21 = solver.blocks_mat[2, 1, 1].__getattribute__(field_str)[:, j_cut, :] - if bc_low[0] is 'pml' and bc_high[2] is 'pml': + if bc_low[0] == "pml" and bc_high[2] == "pml": f02 = solver.blocks_mat[0, 1, 2].__getattribute__(field_str)[:, j_cut, :] - if bc_high[2] is 'pml': + if bc_high[2] == "pml": f12 = solver.blocks_mat[1, 1, 2].__getattribute__(field_str)[:, j_cut, :] - if bc_high[0] is 'pml' and bc_high[2] is 'pml': + if bc_high[0] == "pml" and bc_high[2] == "pml": f22 = solver.blocks_mat[2, 1, 2].__getattribute__(field_str)[:, j_cut, :] f = f11 - if bc_low[0] is 'pml': + if bc_low[0] == "pml": f = np.concatenate((f01, f), axis=0) - if bc_high[0] is 'pml': + if bc_high[0] == "pml": f = np.concatenate((f, f21), axis=0) - if bc_low[2] is 'pml': + if bc_low[2] == "pml": f3 = f10 - if bc_low[0] is 'pml': + if bc_low[0] == "pml": f3 = np.concatenate((f00, f3), axis=0) - if bc_high[0] is 'pml': + if bc_high[0] == "pml": f3 = np.concatenate((f3, f20), axis=0) f = np.concatenate((f3, f), axis=1) - if bc_high[2] is 'pml': + if bc_high[2] == "pml": f3 = f12 - if bc_low[0] is 'pml': + if bc_low[0] == "pml": f3 = np.concatenate((f02, f3), axis=0) - if bc_high[0] is 'pml': + if bc_high[0] == "pml": f3 = np.concatenate((f3, f22), axis=0) f = np.concatenate((f, f3), axis=1) return f -def get_field_z_plane(field_str, solver, k_cut, pml = False): + +def get_field_z_plane(field_str, solver, k_cut, pml=False): if pml: bc_low = solver.bc_low bc_high = solver.bc_high - if bc_low[0] is 'pml' and bc_low[1] is 'pml': + if bc_low[0] == "pml" and bc_low[1] == "pml": f00 = solver.blocks_mat[0, 0, 1].__getattribute__(field_str)[:, :, k_cut] - if bc_low[1] is 'pml': + if bc_low[1] == "pml": f10 = solver.blocks_mat[1, 0, 1].__getattribute__(field_str)[:, :, k_cut] - if bc_high[0] is 'pml' and bc_low[1] is 'pml': + if bc_high[0] == "pml" and bc_low[1] == "pml": f20 = solver.blocks_mat[2, 0, 1].__getattribute__(field_str)[:, :, k_cut] - if bc_low[0] is 'pml': + if bc_low[0] == "pml": f01 = solver.blocks_mat[0, 1, 1].__getattribute__(field_str)[:, :, k_cut] f11 = solver.__getattribute__(field_str)[:, :, k_cut] - if bc_high[0] is 'pml': + if bc_high[0] == "pml": f21 = solver.blocks_mat[2, 1, 1].__getattribute__(field_str)[:, :, k_cut] - if bc_low[0] is 'pml' and bc_high[1] is 'pml': + if bc_low[0] == "pml" and bc_high[1] == "pml": f02 = solver.blocks_mat[0, 2, 1].__getattribute__(field_str)[:, :, k_cut] - if bc_high[1] is 'pml': + if bc_high[1] == "pml": f12 = solver.blocks_mat[1, 2, 1].__getattribute__(field_str)[:, :, k_cut] - if bc_high[0] is 'pml' and bc_high[1] is 'pml': + if bc_high[0] == "pml" and bc_high[1] == "pml": f22 = solver.blocks_mat[2, 2, 1].__getattribute__(field_str)[:, :, k_cut] f = f11 - if bc_low[0] is 'pml': + if bc_low[0] == "pml": f = np.concatenate((f01, f), axis=0) - if bc_high[0] is 'pml': + if bc_high[0] == "pml": f = np.concatenate((f, f21), axis=0) - if bc_low[1] is 'pml': + if bc_low[1] == "pml": f3 = f10 - if bc_low[0] is 'pml': + if bc_low[0] == "pml": f3 = np.concatenate((f00, f3), axis=0) - if bc_high[0] is 'pml': + if bc_high[0] == "pml": f3 = np.concatenate((f3, f20), axis=0) f = np.concatenate((f3, f), axis=1) - if bc_high[1] is 'pml': + if bc_high[1] == "pml": f3 = f12 - if bc_low[0] is 'pml': + if bc_low[0] == "pml": f3 = np.concatenate((f02, f3), axis=0) - if bc_high[0] is 'pml': + if bc_high[0] == "pml": f3 = np.concatenate((f3, f22), axis=0) f = np.concatenate((f, f3), axis=1) @@ -240,115 +240,141 @@ def get_field_z_plane(field_str, solver, k_cut, pml = False): else: return solver.__getattribute__(field_str)[:, :, k_cut] + get_field_plane = get_field_z_plane for t in tqdm(range(Nt)): if fields_norms: fig, axs = plt.subplots(1, 2, figsize=(16, 8)) fig.subplots_adjust(left=0.05, bottom=0.1, right=0.97, top=0.94, wspace=0.15) - norme = np.sqrt(np.square(solver.Ex[:, :, k_s]) + np.square(solver.Ey[:, :, k_s]) + np.square(solver.Ez[:, :, k_s])) - normh = np.sqrt(np.square(solver.Hx[:, :, k_s]) + np.square(solver.Hy[:, :, k_s]) + np.square(solver.Hz[:, :, k_s])) - - im1 = axs[0].imshow(norme, cmap='jet', vmax=530, vmin=-530) # ,extent=[0, L , 0, L ]) - axs[0].set_xlabel('x [m]') - axs[0].set_ylabel('y [m]') - axs[0].set_title('||E|| [V/m]') + norme = np.sqrt( + np.square(solver.Ex[:, :, k_s]) + + np.square(solver.Ey[:, :, k_s]) + + np.square(solver.Ez[:, :, k_s]) + ) + normh = np.sqrt( + np.square(solver.Hx[:, :, k_s]) + + np.square(solver.Hy[:, :, k_s]) + + np.square(solver.Hz[:, :, k_s]) + ) + + im1 = axs[0].imshow( + norme, cmap="jet", vmax=530, vmin=-530 + ) # ,extent=[0, L , 0, L ]) + axs[0].set_xlabel("x [m]") + axs[0].set_ylabel("y [m]") + axs[0].set_title("||E|| [V/m]") fig.colorbar(im1, ax=axs[0]) - im1 = axs[1].imshow(normh, cmap='jet', vmax=1, vmin=-1) - axs[1].set_xlabel('x [m]') - axs[1].set_ylabel('y [m]') - axs[1].set_title('||H|| [V/m]') + im1 = axs[1].imshow(normh, cmap="jet", vmax=1, vmin=-1) + axs[1].set_xlabel("x [m]") + axs[1].set_ylabel("y [m]") + axs[1].set_title("||H|| [V/m]") fig.colorbar(im1, ax=axs[1]) else: fig, axs = plt.subplots(2, 3, figsize=(16, 10)) fig.subplots_adjust(left=0.05, bottom=0.1, right=0.97, top=0.94, wspace=0.15) - #E1 = np.concatenate((solver.blocks_mat[1, 0, 0].Ex, solver.blocks_mat[1, 1, 0].Ex, solver.blocks_mat[1, 2, 0].Ex), axis=1) - #E2 = np.concatenate((solver.blocks_mat[1, 0, 1].Ex, solver.Ex, solver.blocks_mat[1, 2, 1].Ex), axis=1) - #E3 = np.concatenate((solver.blocks_mat[1, 0, 2].Ex, solver.blocks_mat[1, 1, 2].Ex, solver.blocks_mat[1, 2, 2].Ex), axis=1) - #Ex = np.concatenate((E1, E2, E3), axis=2) - Ex = get_field_plane('Ex', solver, k_s) - im1 = axs[0, 0].imshow(Ex, cmap='jet', vmax=4, vmin=-4) #, vmax=120, vmin=-120) # ,extent=[0, L , 0, L ]) - axs[0, 0].set_xlabel('x [m]') - axs[0, 0].set_ylabel('y [m]') - axs[0, 0].set_title('Ex [V/m]') + # E1 = np.concatenate((solver.blocks_mat[1, 0, 0].Ex, solver.blocks_mat[1, 1, 0].Ex, solver.blocks_mat[1, 2, 0].Ex), axis=1) + # E2 = np.concatenate((solver.blocks_mat[1, 0, 1].Ex, solver.Ex, solver.blocks_mat[1, 2, 1].Ex), axis=1) + # E3 = np.concatenate((solver.blocks_mat[1, 0, 2].Ex, solver.blocks_mat[1, 1, 2].Ex, solver.blocks_mat[1, 2, 2].Ex), axis=1) + # Ex = np.concatenate((E1, E2, E3), axis=2) + Ex = get_field_plane("Ex", solver, k_s) + im1 = axs[0, 0].imshow( + Ex, cmap="jet", vmax=4, vmin=-4 + ) # , vmax=120, vmin=-120) # ,extent=[0, L , 0, L ]) + axs[0, 0].set_xlabel("x [m]") + axs[0, 0].set_ylabel("y [m]") + axs[0, 0].set_title("Ex [V/m]") fig.colorbar(im1, ax=axs[0, 0]) - #E1 = np.concatenate((solver.blocks_mat[1, 0, 0].Ey, solver.blocks_mat[1, 1, 0].Ey, solver.blocks_mat[1, 2, 0].Ey), axis=1) - #E2 = np.concatenate((solver.blocks_mat[1, 0, 1].Ey, solver.Ey, solver.blocks_mat[1, 2, 1].Ey), axis=1) - #E3 = np.concatenate((solver.blocks_mat[1, 0, 2].Ey, solver.blocks_mat[1, 1, 2].Ey, solver.blocks_mat[1, 2, 2].Ey), axis=1) - #Ey = np.concatenate((E1, E2, E3), axis=2) - Ey = get_field_plane('Ey', solver, k_s) - im1 = axs[0, 1].imshow(Ey, cmap='jet', vmax=4, vmin=-4) #, vmax=1e-5, vmin=-1e-5) - axs[0, 1].set_xlabel('x [m]') - axs[0, 1].set_ylabel('y [m]') - axs[0, 1].set_title('Ey [V/m]') + # E1 = np.concatenate((solver.blocks_mat[1, 0, 0].Ey, solver.blocks_mat[1, 1, 0].Ey, solver.blocks_mat[1, 2, 0].Ey), axis=1) + # E2 = np.concatenate((solver.blocks_mat[1, 0, 1].Ey, solver.Ey, solver.blocks_mat[1, 2, 1].Ey), axis=1) + # E3 = np.concatenate((solver.blocks_mat[1, 0, 2].Ey, solver.blocks_mat[1, 1, 2].Ey, solver.blocks_mat[1, 2, 2].Ey), axis=1) + # Ey = np.concatenate((E1, E2, E3), axis=2) + Ey = get_field_plane("Ey", solver, k_s) + im1 = axs[0, 1].imshow( + Ey, cmap="jet", vmax=4, vmin=-4 + ) # , vmax=1e-5, vmin=-1e-5) + axs[0, 1].set_xlabel("x [m]") + axs[0, 1].set_ylabel("y [m]") + axs[0, 1].set_title("Ey [V/m]") fig.colorbar(im1, ax=axs[0, 1]) - #E1 = np.concatenate((solver.blocks_mat[1, 0, 0].Ez, solver.blocks_mat[1, 1, 0].Ez, solver.blocks_mat[1, 2, 0].Ez), axis=1) - #E2 = np.concatenate((solver.blocks_mat[1, 0, 1].Ez, solver.Ez, solver.blocks_mat[1, 2, 1].Ez), axis=1) - #E3 = np.concatenate((solver.blocks_mat[1, 0, 2].Ez, solver.blocks_mat[1, 1, 2].Ez, solver.blocks_mat[1, 2, 2].Ez), axis=1) - #Ez = np.concatenate((E1, E2, E3), axis=2) - Ez = get_field_plane('Ez', solver, k_s) - im1 = axs[0, 2].imshow(Ez, cmap='jet', vmax=4, vmin=-4) #, vmax=5000, vmin=-5000) - axs[0, 2].set_xlabel('x [m]') - axs[0, 2].set_ylabel('y [m]') - axs[0, 2].set_title('Ez [V/m]') + # E1 = np.concatenate((solver.blocks_mat[1, 0, 0].Ez, solver.blocks_mat[1, 1, 0].Ez, solver.blocks_mat[1, 2, 0].Ez), axis=1) + # E2 = np.concatenate((solver.blocks_mat[1, 0, 1].Ez, solver.Ez, solver.blocks_mat[1, 2, 1].Ez), axis=1) + # E3 = np.concatenate((solver.blocks_mat[1, 0, 2].Ez, solver.blocks_mat[1, 1, 2].Ez, solver.blocks_mat[1, 2, 2].Ez), axis=1) + # Ez = np.concatenate((E1, E2, E3), axis=2) + Ez = get_field_plane("Ez", solver, k_s) + im1 = axs[0, 2].imshow( + Ez, cmap="jet", vmax=4, vmin=-4 + ) # , vmax=5000, vmin=-5000) + axs[0, 2].set_xlabel("x [m]") + axs[0, 2].set_ylabel("y [m]") + axs[0, 2].set_title("Ez [V/m]") fig.colorbar(im1, ax=axs[0, 2]) - #E1 = np.concatenate((solver.blocks_mat[1, 0, 0].Hx, solver.blocks_mat[1, 1, 0].Hx, solver.blocks_mat[1, 2, 0].Hx), axis=1) - #E2 = np.concatenate((solver.blocks_mat[1, 0, 1].Hx, solver.Hx, solver.blocks_mat[1, 2, 1].Hx), axis=1) - #E3 = np.concatenate((solver.blocks_mat[1, 0, 2].Hx, solver.blocks_mat[1, 1, 2].Hx, solver.blocks_mat[1, 2, 2].Hx), axis=1) - #Hx = np.concatenate((E1, E2, E3), axis=2) - Hx = get_field_plane('Hx', solver, k_s) - im1 = axs[1, 0].imshow(Hx, cmap='jet', vmax=0.01, vmin=-0.01) # ,extent=[0, L , 0, L ]) - axs[1, 0].set_xlabel('x [m]') - axs[1, 0].set_ylabel('y [m]') - axs[1, 0].set_title('Hx [A/m]') - #E1 = np.concatenate((solver.blocks_mat[1, 0, 0].Hy, solver.blocks_mat[1, 1, 0].Hy, solver.blocks_mat[1, 2, 0].Hy), axis=1) - #E2 = np.concatenate((solver.blocks_mat[1, 0, 1].Hy, solver.Hy, solver.blocks_mat[1, 2, 1].Hy), axis=1) - #E3 = np.concatenate((solver.blocks_mat[1, 0, 2].Hy, solver.blocks_mat[1, 1, 2].Hy, solver.blocks_mat[1, 2, 2].Hy), axis=1) - #Hy = np.concatenate((E1, E2, E3), axis=2) - Hy = get_field_plane('Hy', solver, k_s) - fig.colorbar(im1, ax=axs[1, 0], ) - im1 = axs[1, 1].imshow(Hy, cmap='jet', vmax=0.01, vmin=-0.01) #, vmax=0.35, vmin=-0.35) - axs[1, 1].set_xlabel('x [m]') - axs[1, 1].set_ylabel('y [m]') - axs[1, 1].set_title('Hy [A/m]') + # E1 = np.concatenate((solver.blocks_mat[1, 0, 0].Hx, solver.blocks_mat[1, 1, 0].Hx, solver.blocks_mat[1, 2, 0].Hx), axis=1) + # E2 = np.concatenate((solver.blocks_mat[1, 0, 1].Hx, solver.Hx, solver.blocks_mat[1, 2, 1].Hx), axis=1) + # E3 = np.concatenate((solver.blocks_mat[1, 0, 2].Hx, solver.blocks_mat[1, 1, 2].Hx, solver.blocks_mat[1, 2, 2].Hx), axis=1) + # Hx = np.concatenate((E1, E2, E3), axis=2) + Hx = get_field_plane("Hx", solver, k_s) + im1 = axs[1, 0].imshow( + Hx, cmap="jet", vmax=0.01, vmin=-0.01 + ) # ,extent=[0, L , 0, L ]) + axs[1, 0].set_xlabel("x [m]") + axs[1, 0].set_ylabel("y [m]") + axs[1, 0].set_title("Hx [A/m]") + # E1 = np.concatenate((solver.blocks_mat[1, 0, 0].Hy, solver.blocks_mat[1, 1, 0].Hy, solver.blocks_mat[1, 2, 0].Hy), axis=1) + # E2 = np.concatenate((solver.blocks_mat[1, 0, 1].Hy, solver.Hy, solver.blocks_mat[1, 2, 1].Hy), axis=1) + # E3 = np.concatenate((solver.blocks_mat[1, 0, 2].Hy, solver.blocks_mat[1, 1, 2].Hy, solver.blocks_mat[1, 2, 2].Hy), axis=1) + # Hy = np.concatenate((E1, E2, E3), axis=2) + Hy = get_field_plane("Hy", solver, k_s) + fig.colorbar( + im1, + ax=axs[1, 0], + ) + im1 = axs[1, 1].imshow( + Hy, cmap="jet", vmax=0.01, vmin=-0.01 + ) # , vmax=0.35, vmin=-0.35) + axs[1, 1].set_xlabel("x [m]") + axs[1, 1].set_ylabel("y [m]") + axs[1, 1].set_title("Hy [A/m]") fig.colorbar(im1, ax=axs[1, 1]) - #E1 = np.concatenate((solver.blocks_mat[1, 0, 0].Hz, solver.blocks_mat[1, 1, 0].Hz, solver.blocks_mat[1, 2, 0].Hz), axis=1) - #E2 = np.concatenate((solver.blocks_mat[1, 0, 1].Hz, solver.Hz, solver.blocks_mat[1, 2, 1].Hz), axis=1) - #E3 = np.concatenate((solver.blocks_mat[1, 0, 2].Hz, solver.blocks_mat[1, 1, 2].Hz, solver.blocks_mat[1, 2, 2].Hz), axis=1) - #Hz = np.concatenate((E1, E2, E3), axis=2) - Hz = get_field_plane('Hz', solver, k_s) - im1 = axs[1, 2].imshow(Hz, cmap='jet', vmax=0.01, vmin=-0.01) - axs[1, 2].set_xlabel('x [m]') - axs[1, 2].set_ylabel('y [m]') - axs[1, 2].set_title('Hz [A/m]') + # E1 = np.concatenate((solver.blocks_mat[1, 0, 0].Hz, solver.blocks_mat[1, 1, 0].Hz, solver.blocks_mat[1, 2, 0].Hz), axis=1) + # E2 = np.concatenate((solver.blocks_mat[1, 0, 1].Hz, solver.Hz, solver.blocks_mat[1, 2, 1].Hz), axis=1) + # E3 = np.concatenate((solver.blocks_mat[1, 0, 2].Hz, solver.blocks_mat[1, 1, 2].Hz, solver.blocks_mat[1, 2, 2].Hz), axis=1) + # Hz = np.concatenate((E1, E2, E3), axis=2) + Hz = get_field_plane("Hz", solver, k_s) + im1 = axs[1, 2].imshow(Hz, cmap="jet", vmax=0.01, vmin=-0.01) + axs[1, 2].set_xlabel("x [m]") + axs[1, 2].set_ylabel("y [m]") + axs[1, 2].set_title("Hz [A/m]") fig.colorbar(im1, ax=axs[1, 2]) plt.suptitle(str(solver.time)) - folder = sol_type + '_open_space' + folder = sol_type + "_open_space" if not os.path.exists(folder): os.mkdir(folder) - filename = folder + '/%d.png' % t + filename = folder + "/%d.png" % t plt.savefig(filename) plt.close(fig) - i_probe = int(Nx/2) - j_probe = int(Ny/2) - k_probe = int(Nz/2) + i_probe = int(Nx / 2) + j_probe = int(Ny / 2) + k_probe = int(Nz / 2) res_Hy[t] = solver.Hy[i_probe, j_probe, k_probe] res_Hz[t] = solver.Hz[i_probe, k_probe, k_probe] res_Ex[t] = solver.Ex[i_probe, j_probe, k_probe] - #print(solver.blocks_mat[1,1,2].Ex[0, 0, 0]) + # print(solver.blocks_mat[1,1,2].Ex[0, 0, 0]) solver.one_step() # solver.Jx[i_s, j_s, k_s] = solver.gauss(solver.time) - #solver.Ex[:, :, k_s] += Px*solver.gauss(solver.time) - #solver.Ey[:, :, k_s] += Py*solver.gauss(solver.time) - #solver.Hx[:, :, k_s] += -Py*np.sqrt(eps_0/mu_0)*solver.gauss(solver.time + solver.dt) - #solver.Hy[:, :, k_s] += Px*np.sqrt(eps_0/mu_0)*solver.gauss(solver.time + solver.dt) - solver.Hz[i_s, j_s, :] += np.sqrt(eps_0/mu_0)*solver.gauss(solver.time + solver.dt) + # solver.Ex[:, :, k_s] += Px*solver.gauss(solver.time) + # solver.Ey[:, :, k_s] += Py*solver.gauss(solver.time) + # solver.Hx[:, :, k_s] += -Py*np.sqrt(eps_0/mu_0)*solver.gauss(solver.time + solver.dt) + # solver.Hy[:, :, k_s] += Px*np.sqrt(eps_0/mu_0)*solver.gauss(solver.time + solver.dt) + solver.Hz[i_s, j_s, :] += np.sqrt(eps_0 / mu_0) * solver.gauss( + solver.time + solver.dt + ) # solver.Hz[i_s, j_s, k_s] += solver.gauss(solver.time) # solver.Jz[i_s, j_s, k_s] = solver.gauss(solver.time) -''' +""" fig, axs = plt.subplots(2, 3, figsize=(16, 10)) fig.subplots_adjust(left=0.05, bottom=0.1, right=0.97, top=0.94, wspace=0.15) axs[0, 0].imshow(grid.flag_int_cell_xy[:, :, k_s]) @@ -357,4 +383,4 @@ def get_field_z_plane(field_str, solver, k_cut, pml = False): axs[1, 0].imshow(solver.Hz[:, :, k_s], cmap='jet') axs[1, 1].imshow(solver.Hx[:, :, k_s], cmap='jet') axs[1, 2].imshow(solver.Hy[:, :, k_s], cmap='jet') -''' \ No newline at end of file +""" diff --git a/examples/fdtd/script_pml.py b/examples/fdtd/script_pml.py index c26a8a2..25cfe81 100644 --- a/examples/fdtd/script_pml.py +++ b/examples/fdtd/script_pml.py @@ -1,15 +1,13 @@ import numpy as np -from scipy.constants import c as c_light, epsilon_0 as eps_0, mu_0 as mu_0 +from scipy.constants import mu_0 as mu_0 import matplotlib.pyplot as plt -from matplotlib import patches import os from tqdm import tqdm from solver2D import EMSolver2D from grid2D import Grid2D -from conductors import OutRect, Plane, ConductorsAssembly, InCircle, OutCircle, noConductor -from scipy.special import jv +from conductors import OutRect, Plane, ConductorsAssembly, noConductor -L = 1. +L = 1.0 # Number of mesh cells N = 50 Nx = N @@ -22,22 +20,22 @@ xmax = L / 2 ymin = -L / 2 ymax = L / 2 -Lx = L*0.75 -Ly = L*0.75 +Lx = L * 0.75 +Ly = L * 0.75 x_cent = 0 y_cent = 0 rect = OutRect(Lx, Ly, x_cent, y_cent) -theta = np.pi/2*0.25 +theta = np.pi / 2 * 0.25 m_plane1 = np.tan(theta) -q_plane1 = Ly/ 2 +q_plane1 = Ly / 2 m_plane2 = np.tan(theta) -q_plane2 = -Ly/2 -m_plane3 = -1/np.tan(theta) -q_plane3 = (Ly / 2)/np.tan(theta) -m_plane4 = -1/np.tan(theta) -q_plane4 = -(Ly / 2)/np.tan(theta) +q_plane2 = -Ly / 2 +m_plane3 = -1 / np.tan(theta) +q_plane3 = (Ly / 2) / np.tan(theta) +m_plane4 = -1 / np.tan(theta) +q_plane4 = -(Ly / 2) / np.tan(theta) # -dx/3+2*dx plane1 = Plane(m_plane1, q_plane1, tol=0, sign=1) plane2 = Plane(m_plane2, q_plane2, tol=0, sign=-1) @@ -45,24 +43,23 @@ plane4 = Plane(m_plane4, q_plane4, tol=0, sign=-1) - conductors = ConductorsAssembly([noConductor()]) -#theta = 0 -#conductors = ConductorsAssembly([rect]) -sol_type = 'DM' +# theta = 0 +# conductors = ConductorsAssembly([rect]) +sol_type = "DM" grid = Grid2D(xmin, xmax, ymin, ymax, Nx, Ny, conductors, sol_type) -i_s = int(1 * Nx / 2.) -j_s = int(1 * Ny / 2.) +i_s = int(1 * Nx / 2.0) +j_s = int(1 * Ny / 2.0) NCFL = 1 -bc_low = ['pml', 'pml', 'pml'] -bc_high = ['pml', 'pml', 'pml'] +bc_low = ["pml", "pml", "pml"] +bc_high = ["pml", "pml", "pml"] solver = EMSolver2D(grid, sol_type, NCFL, i_s, j_s, bc_low, bc_high) Nt = 300 -''' +""" solver.pml_lxly.Hz = 1*np.ones_like(solver.pml_lxly.Hz) solver.pml_ly.Hz = 2*np.ones_like(solver.pml_ly.Hz) solver.pml_rxly.Hz = 3*np.ones_like(solver.pml_rxly.Hz) @@ -97,9 +94,9 @@ plt.imshow(sigma_star_y, cmap='jet') plt.colorbar() plt.show() -''' +""" for t in tqdm(range(Nt)): - ''' + """ for ii in range(-6, 7): for jj in range(-6, 7): iii = solver.i_s + ii @@ -115,45 +112,86 @@ solver.Jx[iii, jjj] = amp #solver.Jy[iii, jjj] = amp - ''' - #for ii in range(Nx + 1): + """ + # for ii in range(Nx + 1): # for jj in range(Ny + 1): # x = (ii + 0.5) * dx + xmin # y = (jj + 0.5) * dy + ymin # solver.Hz[ii, jj] = analytic_sol(x, y, t*solver.dt) - E1 = np.concatenate((solver.pml_lxly.Ex[:,:-1], solver.pml_ly.Ex[:,:-1], solver.pml_rxly.Ex[:,:-1]), axis=0) - E2 = np.concatenate((solver.pml_lx.Ex[:,:-1], solver.Ex[:,:-1], solver.pml_rx.Ex[:,:-1]), axis=0) - E3 = np.concatenate((solver.pml_lxry.Ex[:,:-1], solver.pml_ry.Ex[:,:-1], solver.pml_rxry.Ex[:,:-1]), axis=0) + E1 = np.concatenate( + ( + solver.pml_lxly.Ex[:, :-1], + solver.pml_ly.Ex[:, :-1], + solver.pml_rxly.Ex[:, :-1], + ), + axis=0, + ) + E2 = np.concatenate( + (solver.pml_lx.Ex[:, :-1], solver.Ex[:, :-1], solver.pml_rx.Ex[:, :-1]), axis=0 + ) + E3 = np.concatenate( + ( + solver.pml_lxry.Ex[:, :-1], + solver.pml_ry.Ex[:, :-1], + solver.pml_rxry.Ex[:, :-1], + ), + axis=0, + ) Ex = np.concatenate((E1, E2, E3), axis=1) - #Ex = np.concatenate((solver.pml_lx.Ex[:, :-1], solver.Ex[:, :-1])) + # Ex = np.concatenate((solver.pml_lx.Ex[:, :-1], solver.Ex[:, :-1])) fig, axs = plt.subplots(1, 3, figsize=(16, 5)) fig.subplots_adjust(left=0.05, bottom=0.1, right=0.97, top=0.94, wspace=0.15) - im1 = axs[0].imshow(Ex.T, cmap='jet', vmax=1000, vmin=-1000, origin = 'lower') # ,extent=[0, L , 0, L ]) - axs[0].set_xlabel('x [m]') - axs[0].set_ylabel('y [m]') - axs[0].set_title('Ex [V/m]') - fig.colorbar(im1, ax=axs[0], ) - E1 = np.concatenate((solver.pml_lxly.Ey[:-1,:], solver.pml_ly.Ey[:-1,:], solver.pml_rxly.Ey[:-1,:]), axis=0) - E2 = np.concatenate((solver.pml_lx.Ey[:-1,:], solver.Ey[:-1,:], solver.pml_rx.Ey[:-1,:]), axis=0) - E3 = np.concatenate((solver.pml_lxry.Ey[:-1,:], solver.pml_ry.Ey[:-1,:], solver.pml_rxry.Ey[:-1,:]), axis=0) + im1 = axs[0].imshow( + Ex.T, cmap="jet", vmax=1000, vmin=-1000, origin="lower" + ) # ,extent=[0, L , 0, L ]) + axs[0].set_xlabel("x [m]") + axs[0].set_ylabel("y [m]") + axs[0].set_title("Ex [V/m]") + fig.colorbar( + im1, + ax=axs[0], + ) + E1 = np.concatenate( + ( + solver.pml_lxly.Ey[:-1, :], + solver.pml_ly.Ey[:-1, :], + solver.pml_rxly.Ey[:-1, :], + ), + axis=0, + ) + E2 = np.concatenate( + (solver.pml_lx.Ey[:-1, :], solver.Ey[:-1, :], solver.pml_rx.Ey[:-1, :]), axis=0 + ) + E3 = np.concatenate( + ( + solver.pml_lxry.Ey[:-1, :], + solver.pml_ry.Ey[:-1, :], + solver.pml_rxry.Ey[:-1, :], + ), + axis=0, + ) Ey = np.concatenate((E1, E2, E3), axis=1) - #Ey = np.concatenate((solver.pml_lx.Ey[:-1,:],solver.Ey[:-1,:])) - im1 = axs[1].imshow(Ey.T, cmap='jet', vmax=1000, vmin=-1000, origin = 'lower') - axs[1].set_xlabel('x [m]') - axs[1].set_ylabel('y [m]') - axs[1].set_title('Ey [V/m]') + # Ey = np.concatenate((solver.pml_lx.Ey[:-1,:],solver.Ey[:-1,:])) + im1 = axs[1].imshow(Ey.T, cmap="jet", vmax=1000, vmin=-1000, origin="lower") + axs[1].set_xlabel("x [m]") + axs[1].set_ylabel("y [m]") + axs[1].set_title("Ey [V/m]") fig.colorbar(im1, ax=axs[1]) - E1 = np.concatenate((solver.pml_lxly.Hz, solver.pml_ly.Hz, solver.pml_rxly.Hz), axis=0) + E1 = np.concatenate( + (solver.pml_lxly.Hz, solver.pml_ly.Hz, solver.pml_rxly.Hz), axis=0 + ) E2 = np.concatenate((solver.pml_lx.Hz, solver.Hz, solver.pml_rx.Hz), axis=0) - E3 = np.concatenate((solver.pml_lxry.Hz, solver.pml_ry.Hz, solver.pml_rxry.Hz), axis=0) + E3 = np.concatenate( + (solver.pml_lxry.Hz, solver.pml_ry.Hz, solver.pml_rxry.Hz), axis=0 + ) Hz = np.concatenate((E1, E2, E3), axis=1) - #Hz = np.concatenate((solver.pml_lx.Hz,solver.Hz)) - im1 = axs[2].imshow(Hz.T, cmap='jet', vmax=2, vmin=-2, origin = 'lower') - axs[2].set_xlabel('x [m]') - axs[2].set_ylabel('y [m]') - axs[2].set_title('Hz [A/m]') + # Hz = np.concatenate((solver.pml_lx.Hz,solver.Hz)) + im1 = axs[2].imshow(Hz.T, cmap="jet", vmax=2, vmin=-2, origin="lower") + axs[2].set_xlabel("x [m]") + axs[2].set_ylabel("y [m]") + axs[2].set_title("Hz [A/m]") fig.colorbar(im1, ax=axs[2]) plt.suptitle(str(solver.time)) # im1 = axs[1,0].imshow(Hx.T,cmap='jet',origin='lower')#,extent=[0, L , 0, L ]) @@ -171,13 +209,12 @@ # axs[1,2].set_ylabel('y [m]') # axs[1,2].set_title('Ez [V/m]') # fig.colorbar(im1, ax=axs[1,2]) - folder = sol_type + '_images_pml' + folder = sol_type + "_images_pml" if not os.path.exists(folder): os.mkdir(folder) - filename = folder + '/%d.png' % t + filename = folder + "/%d.png" % t plt.savefig(filename) plt.close(fig) solver.one_step() solver.Hz[i_s, j_s] += solver.gauss(solver.time) - diff --git a/examples/fdtd/script_rect_cav.py b/examples/fdtd/script_rect_cav.py index d9fe54c..573a0e5 100644 --- a/examples/fdtd/script_rect_cav.py +++ b/examples/fdtd/script_rect_cav.py @@ -1,15 +1,13 @@ import numpy as np -from scipy.constants import c as c_light, epsilon_0 as eps_0, mu_0 as mu_0 +from scipy.constants import c as c_light, mu_0 as mu_0 import matplotlib.pyplot as plt -from matplotlib import patches import os from tqdm import tqdm from solver2D import EMSolver2D from grid2D import Grid2D -from conductors import OutRect, Plane, ConductorsAssembly, InCircle, OutCircle -from scipy.special import jv +from conductors import OutRect, Plane, ConductorsAssembly -L = 1. +L = 1.0 # Number of mesh cells N = 50 Nx = N @@ -22,22 +20,22 @@ xmax = L / 2 ymin = -L / 2 ymax = L / 2 -Lx = L*0.75 -Ly = L*0.75 +Lx = L * 0.75 +Ly = L * 0.75 x_cent = 0 y_cent = 0 rect = OutRect(Lx, Ly, x_cent, y_cent) -theta = np.pi/2*0.25 +theta = np.pi / 2 * 0.25 m_plane1 = np.tan(theta) -q_plane1 = Ly/ 2 +q_plane1 = Ly / 2 m_plane2 = np.tan(theta) -q_plane2 = -Ly/2 -m_plane3 = -1/np.tan(theta) -q_plane3 = (Ly / 2)/np.tan(theta) -m_plane4 = -1/np.tan(theta) -q_plane4 = -(Ly / 2)/np.tan(theta) +q_plane2 = -Ly / 2 +m_plane3 = -1 / np.tan(theta) +q_plane3 = (Ly / 2) / np.tan(theta) +m_plane4 = -1 / np.tan(theta) +q_plane4 = -(Ly / 2) / np.tan(theta) # -dx/3+2*dx plane1 = Plane(m_plane1, q_plane1, tol=0, sign=1) plane2 = Plane(m_plane2, q_plane2, tol=0, sign=-1) @@ -46,16 +44,16 @@ conductors = ConductorsAssembly([plane1, plane2, plane3, plane4]) -#theta = 0 -#conductors = ConductorsAssembly([rect]) -sol_type = 'ECT' +# theta = 0 +# conductors = ConductorsAssembly([rect]) +sol_type = "ECT" grid = Grid2D(xmin, xmax, ymin, ymax, Nx, Ny, conductors, sol_type) -i_s = int(1 * Nx / 2.) -j_s = int(1 * Ny / 2.) +i_s = int(1 * Nx / 2.0) +j_s = int(1 * Ny / 2.0) NCFL = 1 -bc_low = ['dirichlet', 'dirichlet', 'dirichlet'] -bc_high = ['dirichlet', 'dirichlet', 'dirichlet'] +bc_low = ["dirichlet", "dirichlet", "dirichlet"] +bc_high = ["dirichlet", "dirichlet", "dirichlet"] solver = EMSolver2D(grid, sol_type, NCFL, i_s, j_s, bc_low, bc_high) @@ -66,8 +64,8 @@ Nborrow = np.zeros((Nx, Ny)) Nlend = np.zeros((Nx, Ny)) minpatch = np.ones((Nx, Ny)) -small_patch = np.ones((Nx, Ny), dtype = bool) -''' +small_patch = np.ones((Nx, Ny), dtype=bool) +""" for ii in range(Nx): for jj in range(Ny): Nborrow[ii, jj] = len(grid.borrowing[ii, jj]) @@ -76,17 +74,21 @@ for (_, _, patch, _) in grid.borrowing[ii, jj]: if patch < minpatch[ii, jj]: minpatch[ii, jj] = patch -''' +""" for ii in range(Nx): for jj in range(Ny): small_patch[ii, jj] = minpatch[ii, jj] < grid.S_stab[ii, jj] def analytic_sol(x, y, t): - Rm = np.array([[np.cos(-theta), - np.sin(-theta)],[np.sin(-theta), np.cos(-theta)]]) + Rm = np.array([[np.cos(-theta), -np.sin(-theta)], [np.sin(-theta), np.cos(-theta)]]) [x_0, y_0] = np.dot(Rm, np.array([x, y])) - return np.cos(np.pi/Lx*(x_0 - Lx/2))*np.cos(np.pi/Ly*(y_0 - Lx/2))*np.cos(np.sqrt(2)*np.pi/Lx*c_light*t) + return ( + np.cos(np.pi / Lx * (x_0 - Lx / 2)) + * np.cos(np.pi / Ly * (y_0 - Lx / 2)) + * np.cos(np.sqrt(2) * np.pi / Lx * c_light * t) + ) for ii in range(Nx): @@ -100,14 +102,14 @@ def analytic_sol(x, y, t): max_sol = solver.Hz -t_f = 1.1*np.sqrt(2)*Lx/c_light -Nt = int(t_f/solver.dt) -#Nt = 100 +t_f = 1.1 * np.sqrt(2) * Lx / c_light +Nt = int(t_f / solver.dt) +# Nt = 100 sol = np.zeros_like(solver.Hz) for t in tqdm(range(Nt)): - ''' + """ for ii in range(-6, 7): for jj in range(-6, 7): iii = solver.i_s + ii @@ -123,8 +125,8 @@ def analytic_sol(x, y, t): solver.Jx[iii, jjj] = amp #solver.Jy[iii, jjj] = amp - ''' - #for ii in range(Nx + 1): + """ + # for ii in range(Nx + 1): # for jj in range(Ny + 1): # x = (ii + 0.5) * dx + xmin # y = (jj + 0.5) * dy + ymin @@ -132,20 +134,25 @@ def analytic_sol(x, y, t): fig, axs = plt.subplots(1, 3, figsize=(16, 5)) fig.subplots_adjust(left=0.05, bottom=0.1, right=0.97, top=0.94, wspace=0.15) - im1 = axs[0].imshow(solver.Ex, cmap='jet', vmax=200, vmin=-200) # ,extent=[0, L , 0, L ]) - axs[0].set_xlabel('x [m]') - axs[0].set_ylabel('y [m]') - axs[0].set_title('Ex [V/m]') - fig.colorbar(im1, ax=axs[0], ) - im1 = axs[1].imshow(solver.Ey, cmap='jet', vmax=200, vmin=-200) - axs[1].set_xlabel('x [m]') - axs[1].set_ylabel('y [m]') - axs[1].set_title('Ey [V/m]') + im1 = axs[0].imshow( + solver.Ex, cmap="jet", vmax=200, vmin=-200 + ) # ,extent=[0, L , 0, L ]) + axs[0].set_xlabel("x [m]") + axs[0].set_ylabel("y [m]") + axs[0].set_title("Ex [V/m]") + fig.colorbar( + im1, + ax=axs[0], + ) + im1 = axs[1].imshow(solver.Ey, cmap="jet", vmax=200, vmin=-200) + axs[1].set_xlabel("x [m]") + axs[1].set_ylabel("y [m]") + axs[1].set_title("Ey [V/m]") fig.colorbar(im1, ax=axs[1]) - im1 = axs[2].imshow(solver.Hz, cmap='jet', vmax=1, vmin=-1) - axs[2].set_xlabel('x [m]') - axs[2].set_ylabel('y [m]') - axs[2].set_title('Hz [A/m]') + im1 = axs[2].imshow(solver.Hz, cmap="jet", vmax=1, vmin=-1) + axs[2].set_xlabel("x [m]") + axs[2].set_ylabel("y [m]") + axs[2].set_title("Hz [A/m]") fig.colorbar(im1, ax=axs[2]) plt.suptitle(str(solver.time)) # im1 = axs[1,0].imshow(Hx.T,cmap='jet',origin='lower')#,extent=[0, L , 0, L ]) @@ -163,16 +170,16 @@ def analytic_sol(x, y, t): # axs[1,2].set_ylabel('y [m]') # axs[1,2].set_title('Ez [V/m]') # fig.colorbar(im1, ax=axs[1,2]) - folder = sol_type + '_images_rect' + folder = sol_type + "_images_rect" if not os.path.exists(folder): os.mkdir(folder) - filename = folder + '/%d.png' % t + filename = folder + "/%d.png" % t plt.savefig(filename) plt.close(fig) solver.time += solver.dt solver.one_step() - #solver.Hz[i_s, j_s] += solver.gauss(solver.time) + # solver.Hz[i_s, j_s] += solver.gauss(solver.time) # Compute the analytic solution sol = np.zeros_like(solver.Hz) diff --git a/examples/fdtd/script_rot_cube_cav.py b/examples/fdtd/script_rot_cube_cav.py index 08ced4a..1f8dc6f 100644 --- a/examples/fdtd/script_rot_cube_cav.py +++ b/examples/fdtd/script_rot_cube_cav.py @@ -1,38 +1,36 @@ import numpy as np from scipy.constants import c as c_light, epsilon_0 as eps_0, mu_0 as mu_0 -import matplotlib + # matplotlib.use('Agg') from matplotlib import pyplot as plt -from matplotlib import patches import os from tqdm import tqdm from solver3D import EMSolver3D from grid3D import Grid3D -from conductors3d import InCube, ConductorsAssembly, InSphere, Plane -from scipy.special import jv +from conductors3d import ConductorsAssembly, Plane Z0 = np.sqrt(mu_0 / eps_0) -L = 1. +L = 1.0 # Number of mesh cells N = 50 Nx = N Ny = N Nz = N -Lx = 0.5*L -Ly = 0.5*L -Lz = 0.5*L +Lx = 0.5 * L +Ly = 0.5 * L +Lz = 0.5 * L dx = L / Nx dy = L / Ny dz = L / Nz r_circ = 0.3 -xmin = -L / 2 # + dx / 2 -xmax = L / 2 #+ dx / 2 -ymin = -L / 2 #+ dy / 2 -ymax = L / 2 #+ dy / 2 -zmin = -L / 2 #+ dz / 2 -zmax = L / 2 #+ dz / 2 +xmin = -L / 2 # + dx / 2 +xmax = L / 2 # + dx / 2 +ymin = -L / 2 # + dy / 2 +ymax = L / 2 # + dy / 2 +zmin = -L / 2 # + dz / 2 +zmax = L / 2 # + dz / 2 x_cent = 0 y_cent = 0 @@ -47,18 +45,25 @@ n6 = np.array([0, 0, 1]) - -R_theta = np.array([[np.cos(theta), - np.sin(theta), 0], [np.sin(theta), np.cos(theta), 0], [0, 0, 1]]) -R_rect = np.array([[np.cos(np.pi / 2), - np.sin(np.pi / 2), 0], [np.sin(np.pi / 2), np.cos(np.pi / 2), 0], [0, 0, 1]]) +R_theta = np.array( + [[np.cos(theta), -np.sin(theta), 0], [np.sin(theta), np.cos(theta), 0], [0, 0, 1]] +) +R_rect = np.array( + [ + [np.cos(np.pi / 2), -np.sin(np.pi / 2), 0], + [np.sin(np.pi / 2), np.cos(np.pi / 2), 0], + [0, 0, 1], + ] +) l_side = Lx -#l = l_side*np.cos(theta) +# l = l_side*np.cos(theta) -p1 = np.dot(R_theta, np.array([l_side/2, l_side/2, 0])) -p2 = np.dot(R_theta, np.array([-l_side/2, l_side/2, 0])) -p3 = np.dot(R_theta, np.array([-l_side/2, -l_side/2, 0])) -p4 = np.dot(R_theta, np.array([l_side/2, -l_side/2, 0])) +p1 = np.dot(R_theta, np.array([l_side / 2, l_side / 2, 0])) +p2 = np.dot(R_theta, np.array([-l_side / 2, l_side / 2, 0])) +p3 = np.dot(R_theta, np.array([-l_side / 2, -l_side / 2, 0])) +p4 = np.dot(R_theta, np.array([l_side / 2, -l_side / 2, 0])) p5 = np.array([0, 0, l_side / 2]) p6 = np.array([0, 0, -l_side / 2]) @@ -69,18 +74,18 @@ plane5 = Plane(p5, n5) plane6 = Plane(p6, n6) -#cube = InCube(lx, ly, lz, x_cent, y_cent, z_cent) -#sphere = InSphere(r_circ, x_cent, y_cent, z_cent) +# cube = InCube(lx, ly, lz, x_cent, y_cent, z_cent) +# sphere = InSphere(r_circ, x_cent, y_cent, z_cent) conductors = ConductorsAssembly([plane1, plane2, plane3, plane4, plane5, plane6]) # conductors = ConductorsAssembly([cube]) # conductors = cube -sol_type = 'FDTD' +sol_type = "FDTD" grid = Grid3D(xmin, xmax, ymin, ymax, zmin, zmax, Nx, Ny, Nz, conductors, sol_type) i_s = int(Nx / 2) j_s = int(Ny / 2) -k_s = int(Nz / 2)+10 +k_s = int(Nz / 2) + 10 NCFL = 1 flag_in_conductor = np.zeros((Nx, Ny, Nz), dtype=bool) @@ -97,13 +102,13 @@ Nborrow = np.zeros((Nx, Ny, Nz)) Nlend = np.zeros((Nx, Ny, Nz)) -''' +""" for ii in range(Nx): for jj in range(Ny): for kk in range(Nz): Nborrow[ii, jj, kk] = len(grid.borrowing_xy[ii, jj, kk]) Nlend[ii, jj, kk] = len(grid.lending_xy[ii, jj, kk]) -''' +""" m = 0 n = 1 @@ -111,31 +116,67 @@ def analytic_sol_Hz(x, y, z, t): - Rm = np.array([[np.cos(-theta), - np.sin(-theta), 0], [np.sin(-theta), np.cos(-theta), 0], [0, 0, 1]]) + Rm = np.array( + [ + [np.cos(-theta), -np.sin(-theta), 0], + [np.sin(-theta), np.cos(-theta), 0], + [0, 0, 1], + ] + ) [x_0, y_0, z_0] = np.dot(Rm, np.array([x, y, z])) - return np.cos(m * np.pi / Lx * (x_0 - Lx / 2)) * np.cos(n * np.pi / Ly * (y_0 - Ly / 2)) * np.sin( - p * np.pi / Lz * (z_0 - Lz / 2)) * np.cos(np.sqrt(2) * np.pi / Lx * c_light * t) + return ( + np.cos(m * np.pi / Lx * (x_0 - Lx / 2)) + * np.cos(n * np.pi / Ly * (y_0 - Ly / 2)) + * np.sin(p * np.pi / Lz * (z_0 - Lz / 2)) + * np.cos(np.sqrt(2) * np.pi / Lx * c_light * t) + ) h_2 = (m * np.pi / Lx) ** 2 + (n * np.pi / Ly) ** 2 + (p * np.pi / Lz) ** 2 def analytic_sol_Hy(x, y, z, t): - Rm = np.array([[np.cos(-theta), - np.sin(-theta), 0], [np.sin(-theta), np.cos(-theta), 0], [0, 0, 1]]) + Rm = np.array( + [ + [np.cos(-theta), -np.sin(-theta), 0], + [np.sin(-theta), np.cos(-theta), 0], + [0, 0, 1], + ] + ) [x_0, y_0, z_0] = np.dot(Rm, np.array([x, y, z])) - return -2 / h_2 * (n * np.pi / Ly) * (p * np.pi / Lz) * np.cos(m * np.pi / Lx * (x_0 - Lx / 2)) * np.sin( - n * np.pi / Ly * (y_0 - Ly / 2)) * np.cos(p * np.pi / Lz * (z_0 - Lz / 2)) * np.cos( - np.sqrt(2) * np.pi / Lx * c_light * t) + return ( + -2 + / h_2 + * (n * np.pi / Ly) + * (p * np.pi / Lz) + * np.cos(m * np.pi / Lx * (x_0 - Lx / 2)) + * np.sin(n * np.pi / Ly * (y_0 - Ly / 2)) + * np.cos(p * np.pi / Lz * (z_0 - Lz / 2)) + * np.cos(np.sqrt(2) * np.pi / Lx * c_light * t) + ) # return -0.9994120256621584*np.cos(m*np.pi/lx*(x_0 - lx/2))*np.sin(n*np.pi/ly*(y_0 - ly/2))*np.cos(p*np.pi/lz*(z_0 - lz/2))*np.cos(np.sqrt(2)*np.pi/lx*c_light*t) def analytic_sol_Hx(x, y, z, t): - Rm = np.array([[np.cos(-theta), - np.sin(-theta), 0], [np.sin(-theta), np.cos(-theta), 0], [0, 0, 1]]) + Rm = np.array( + [ + [np.cos(-theta), -np.sin(-theta), 0], + [np.sin(-theta), np.cos(-theta), 0], + [0, 0, 1], + ] + ) [x_0, y_0, z_0] = np.dot(Rm, np.array([x, y, z])) - return -2 / h_2 * (m * np.pi / Lx) * (p * np.pi / Lz) * np.sin(m * np.pi / Lx * (x_0 - Lx / 2)) * np.cos( - n * np.pi / l_side * (y_0 - Ly / 2)) * np.cos(p * np.pi / Lz * (z_0 - Lz / 2)) * np.cos( - np.sqrt(2) * np.pi / Lx * c_light * t) + return ( + -2 + / h_2 + * (m * np.pi / Lx) + * (p * np.pi / Lz) + * np.sin(m * np.pi / Lx * (x_0 - Lx / 2)) + * np.cos(n * np.pi / l_side * (y_0 - Ly / 2)) + * np.cos(p * np.pi / Lz * (z_0 - Lz / 2)) + * np.cos(np.sqrt(2) * np.pi / Lx * c_light * t) + ) k = 2.7437 / r_circ @@ -164,7 +205,7 @@ def analytic_sol_Hx(x, y, z, t): a = l_side * np.sqrt(2) / 3 Tf = 6 * np.sqrt(2) * (a / c_light) Nt = int(Tf / solver.dt) -#Nt = 1 +# Nt = 1 res_Hy = np.zeros(Nt) res_Ex = np.zeros(Nt) @@ -173,70 +214,89 @@ def analytic_sol_Hx(x, y, z, t): fields_norms = False for t in tqdm(range(Nt)): - if fields_norms: fig, axs = plt.subplots(1, 2, figsize=(16, 8)) fig.subplots_adjust(left=0.05, bottom=0.1, right=0.97, top=0.94, wspace=0.15) - norme = np.sqrt(np.square(solver.Ex[:, :, k_s]) + np.square(solver.Ey[:, :, k_s]) + np.square(solver.Ez[:, :, k_s])) - normh = np.sqrt(np.square(solver.Hx[:, :, k_s]) + np.square(solver.Hy[:, :, k_s]) + np.square(solver.Hz[:, :, k_s])) - - im1 = axs[0].imshow(norme, cmap='jet', vmax=530, vmin=-530) # ,extent=[0, L , 0, L ]) - axs[0].set_xlabel('x [m]') - axs[0].set_ylabel('y [m]') - axs[0].set_title('||E|| [V/m]') + norme = np.sqrt( + np.square(solver.Ex[:, :, k_s]) + + np.square(solver.Ey[:, :, k_s]) + + np.square(solver.Ez[:, :, k_s]) + ) + normh = np.sqrt( + np.square(solver.Hx[:, :, k_s]) + + np.square(solver.Hy[:, :, k_s]) + + np.square(solver.Hz[:, :, k_s]) + ) + + im1 = axs[0].imshow( + norme, cmap="jet", vmax=530, vmin=-530 + ) # ,extent=[0, L , 0, L ]) + axs[0].set_xlabel("x [m]") + axs[0].set_ylabel("y [m]") + axs[0].set_title("||E|| [V/m]") fig.colorbar(im1, ax=axs[0]) - im1 = axs[1].imshow(normh, cmap='jet', vmax=1, vmin=-1) - axs[1].set_xlabel('x [m]') - axs[1].set_ylabel('y [m]') - axs[1].set_title('||H|| [V/m]') + im1 = axs[1].imshow(normh, cmap="jet", vmax=1, vmin=-1) + axs[1].set_xlabel("x [m]") + axs[1].set_ylabel("y [m]") + axs[1].set_title("||H|| [V/m]") fig.colorbar(im1, ax=axs[1]) else: fig, axs = plt.subplots(2, 3, figsize=(16, 10)) fig.subplots_adjust(left=0.05, bottom=0.1, right=0.97, top=0.94, wspace=0.15) - im1 = axs[0, 0].imshow(solver.Ex[:, :, k_s], cmap='jet', vmax=530, vmin=-530) # ,extent=[0, L , 0, L ]) - axs[0, 0].set_xlabel('x [m]') - axs[0, 0].set_ylabel('y [m]') - axs[0, 0].set_title('Ex [V/m]') - fig.colorbar(im1, ax=axs[0, 0], ) - im1 = axs[0, 1].imshow(solver.Ey[:, :, k_s], cmap='jet', vmax=530, vmin=-530) - axs[0, 1].set_xlabel('x [m]') - axs[0, 1].set_ylabel('y [m]') - axs[0, 1].set_title('Ey [V/m]') + im1 = axs[0, 0].imshow( + solver.Ex[:, :, k_s], cmap="jet", vmax=530, vmin=-530 + ) # ,extent=[0, L , 0, L ]) + axs[0, 0].set_xlabel("x [m]") + axs[0, 0].set_ylabel("y [m]") + axs[0, 0].set_title("Ex [V/m]") + fig.colorbar( + im1, + ax=axs[0, 0], + ) + im1 = axs[0, 1].imshow(solver.Ey[:, :, k_s], cmap="jet", vmax=530, vmin=-530) + axs[0, 1].set_xlabel("x [m]") + axs[0, 1].set_ylabel("y [m]") + axs[0, 1].set_title("Ey [V/m]") fig.colorbar(im1, ax=axs[0, 1]) - im1 = axs[0, 2].imshow(solver.Ez[:, :, k_s], cmap='jet', vmax=530, vmin=-530) - axs[0, 2].set_xlabel('x [m]') - axs[0, 2].set_ylabel('y [m]') - axs[0, 2].set_title('Ez [V/m]') + im1 = axs[0, 2].imshow(solver.Ez[:, :, k_s], cmap="jet", vmax=530, vmin=-530) + axs[0, 2].set_xlabel("x [m]") + axs[0, 2].set_ylabel("y [m]") + axs[0, 2].set_title("Ez [V/m]") fig.colorbar(im1, ax=axs[0, 2]) - im1 = axs[1, 0].imshow(solver.Hx[:, :, k_s], cmap='jet', vmax=0.1, vmin=-0.1) # ,extent=[0, L , 0, L ]) - axs[1, 0].set_xlabel('x [m]') - axs[1, 0].set_ylabel('y [m]') - axs[1, 0].set_title('Hx [A/m]') - fig.colorbar(im1, ax=axs[1, 0], ) - im1 = axs[1, 1].imshow(solver.Hy[:, :, k_s], cmap='jet', vmax=0.17, vmin=-0.17) - axs[1, 1].set_xlabel('x [m]') - axs[1, 1].set_ylabel('y [m]') - axs[1, 1].set_title('Hy [A/m]') + im1 = axs[1, 0].imshow( + solver.Hx[:, :, k_s], cmap="jet", vmax=0.1, vmin=-0.1 + ) # ,extent=[0, L , 0, L ]) + axs[1, 0].set_xlabel("x [m]") + axs[1, 0].set_ylabel("y [m]") + axs[1, 0].set_title("Hx [A/m]") + fig.colorbar( + im1, + ax=axs[1, 0], + ) + im1 = axs[1, 1].imshow(solver.Hy[:, :, k_s], cmap="jet", vmax=0.17, vmin=-0.17) + axs[1, 1].set_xlabel("x [m]") + axs[1, 1].set_ylabel("y [m]") + axs[1, 1].set_title("Hy [A/m]") fig.colorbar(im1, ax=axs[1, 1]) - im1 = axs[1, 2].imshow(solver.Hz[:, :, k_s], cmap='jet', vmax=1, vmin=-1) - axs[1, 2].set_xlabel('x [m]') - axs[1, 2].set_ylabel('y [m]') - axs[1, 2].set_title('Hz [A/m]') + im1 = axs[1, 2].imshow(solver.Hz[:, :, k_s], cmap="jet", vmax=1, vmin=-1) + axs[1, 2].set_xlabel("x [m]") + axs[1, 2].set_ylabel("y [m]") + axs[1, 2].set_title("Hz [A/m]") fig.colorbar(im1, ax=axs[1, 2]) plt.suptitle(str(solver.time)) - folder = sol_type + '_images_rot_cube' + folder = sol_type + "_images_rot_cube" if not os.path.exists(folder): os.mkdir(folder) - filename = folder + '/%d.png' % t + filename = folder + "/%d.png" % t plt.savefig(filename) plt.close(fig) - i_probe = int(Nx/2)-10 - j_probe = int(Ny/2)-10 - k_probe = int(Nz/2) + i_probe = int(Nx / 2) - 10 + j_probe = int(Ny / 2) - 10 + k_probe = int(Nz / 2) res_Hy[t] = solver.Hy[i_probe, j_probe, k_probe] res_Hz[t] = solver.Hz[i_probe, k_probe, k_probe] res_Ex[t] = solver.Ex[i_probe, j_probe, k_probe] @@ -245,7 +305,7 @@ def analytic_sol_Hx(x, y, z, t): # solver.Jx[i_s, j_s, k_s] = solver.gauss(solver.time) # solver.Hz[i_s, j_s, k_s] += solver.gauss(solver.time) # solver.Jz[i_s, j_s, k_s] = solver.gauss(solver.time) -''' +""" fig, axs = plt.subplots(2, 3, figsize=(16, 10)) fig.subplots_adjust(left=0.05, bottom=0.1, right=0.97, top=0.94, wspace=0.15) axs[0, 0].imshow(grid.flag_int_cell_xy[:, :, k_s]) @@ -254,4 +314,4 @@ def analytic_sol_Hx(x, y, z, t): axs[1, 0].imshow(solver.Hz[:, :, k_s], cmap='jet') axs[1, 1].imshow(solver.Hx[:, :, k_s], cmap='jet') axs[1, 2].imshow(solver.Hy[:, :, k_s], cmap='jet') -''' +""" diff --git a/examples/fdtd/script_scatter_circle.py b/examples/fdtd/script_scatter_circle.py index e20a974..e926a9f 100644 --- a/examples/fdtd/script_scatter_circle.py +++ b/examples/fdtd/script_scatter_circle.py @@ -1,16 +1,13 @@ -import numpy as np -from scipy.constants import c as c_light, epsilon_0 as eps_0, mu_0 as mu_0 +from scipy.constants import mu_0 as mu_0 import matplotlib.pyplot as plt -from matplotlib import patches import os from tqdm import tqdm from solver2D import EMSolver2D from grid2D import Grid2D -from conductors import OutRect, Plane, ConductorsAssembly, InCircle, OutCircle, noConductor -from scipy.special import jv +from conductors import ConductorsAssembly, InCircle from matplotlib.patches import Circle -L = 1. +L = 1.0 # Number of mesh cells N = 100 Nx = N @@ -19,13 +16,13 @@ dy = L / Ny N_radius = 15 -r_circ = N_radius*dx +r_circ = N_radius * dx xmin = -L / 2 xmax = L / 2 ymin = -L / 2 ymax = L / 2 -Lx = L*0.75 -Ly = L*0.75 +Lx = L * 0.75 +Ly = L * 0.75 x_cent = 0 y_cent = 0 @@ -33,21 +30,21 @@ conductors = ConductorsAssembly([circ]) -#theta = 0 -#conductors = ConductorsAssembly([rect]) -sol_type = 'FDTD' +# theta = 0 +# conductors = ConductorsAssembly([rect]) +sol_type = "FDTD" grid = Grid2D(xmin, xmax, ymin, ymax, Nx, Ny, conductors, sol_type) -i_s = int(1 * Nx / 4.) -j_s = int(1 * Ny / 4.) +i_s = int(1 * Nx / 4.0) +j_s = int(1 * Ny / 4.0) NCFL = 1 -bc_low = ['pml', 'pml', 'pml'] -bc_high = ['pml', 'pml', 'pml'] +bc_low = ["pml", "pml", "pml"] +bc_high = ["pml", "pml", "pml"] solver = EMSolver2D(grid, sol_type, NCFL, i_s, j_s, bc_low, bc_high) Nt = 300 -''' +""" solver.pml_lxly.Hz = 1*np.ones_like(solver.pml_lxly.Hz) solver.pml_ly.Hz = 2*np.ones_like(solver.pml_ly.Hz) solver.pml_rxly.Hz = 3*np.ones_like(solver.pml_rxly.Hz) @@ -82,9 +79,9 @@ plt.imshow(sigma_star_y, cmap='jet') plt.colorbar() plt.show() -''' +""" for t in tqdm(range(Nt)): - ''' + """ for ii in range(-6, 7): for jj in range(-6, 7): iii = solver.i_s + ii @@ -100,53 +97,58 @@ solver.Jx[iii, jjj] = amp #solver.Jy[iii, jjj] = amp - ''' - #for ii in range(Nx + 1): + """ + # for ii in range(Nx + 1): # for jj in range(Ny + 1): # x = (ii + 0.5) * dx + xmin # y = (jj + 0.5) * dy + ymin # solver.Hz[ii, jj] = analytic_sol(x, y, t*solver.dt) - #E1 = np.concatenate((solver.pml_lxly.Ex[:,:-1], solver.pml_ly.Ex[:,:-1], solver.pml_rxly.Ex[:,:-1]), axis=0) - #E2 = np.concatenate((solver.pml_lx.Ex[:,:-1], solver.Ex[:,:-1], solver.pml_rx.Ex[:,:-1]), axis=0) - #E3 = np.concatenate((solver.pml_lxry.Ex[:,:-1], solver.pml_ry.Ex[:,:-1], solver.pml_rxry.Ex[:,:-1]), axis=0) - #Ex = np.concatenate((E1, E2, E3), axis=1) - #Ex = np.concatenate((solver.pml_lx.Ex[:, :-1], solver.Ex[:, :-1])) + # E1 = np.concatenate((solver.pml_lxly.Ex[:,:-1], solver.pml_ly.Ex[:,:-1], solver.pml_rxly.Ex[:,:-1]), axis=0) + # E2 = np.concatenate((solver.pml_lx.Ex[:,:-1], solver.Ex[:,:-1], solver.pml_rx.Ex[:,:-1]), axis=0) + # E3 = np.concatenate((solver.pml_lxry.Ex[:,:-1], solver.pml_ry.Ex[:,:-1], solver.pml_rxry.Ex[:,:-1]), axis=0) + # Ex = np.concatenate((E1, E2, E3), axis=1) + # Ex = np.concatenate((solver.pml_lx.Ex[:, :-1], solver.Ex[:, :-1])) fig, axs = plt.subplots(1, 3, figsize=(16, 5)) fig.subplots_adjust(left=0.05, bottom=0.1, right=0.97, top=0.94, wspace=0.15) - im1 = axs[0].imshow(solver.Ex.T, cmap='jet', vmax=1000, vmin=-1000, origin = 'lower') # ,extent=[0, L , 0, L ]) - circ0 = Circle((Nx/2, Ny/2), N_radius, facecolor='None', edgecolor='r', lw=1) - circ1 = Circle((Nx/2, Ny/2), N_radius, facecolor='None', edgecolor='r', lw=1) - circ2 = Circle((Nx/2, Ny/2), N_radius, facecolor='None', edgecolor='r', lw=1) + im1 = axs[0].imshow( + solver.Ex.T, cmap="jet", vmax=1000, vmin=-1000, origin="lower" + ) # ,extent=[0, L , 0, L ]) + circ0 = Circle((Nx / 2, Ny / 2), N_radius, facecolor="None", edgecolor="r", lw=1) + circ1 = Circle((Nx / 2, Ny / 2), N_radius, facecolor="None", edgecolor="r", lw=1) + circ2 = Circle((Nx / 2, Ny / 2), N_radius, facecolor="None", edgecolor="r", lw=1) axs[0].add_patch(circ0) - axs[0].set_xlabel('x [m]') - axs[0].set_ylabel('y [m]') - axs[0].set_title('Ex [V/m]') - fig.colorbar(im1, ax=axs[0], ) - #E1 = np.concatenate((solver.pml_lxly.Ey[:-1,:], solver.pml_ly.Ey[:-1,:], solver.pml_rxly.Ey[:-1,:]), axis=0) - #E2 = np.concatenate((solver.pml_lx.Ey[:-1,:], solver.Ey[:-1,:], solver.pml_rx.Ey[:-1,:]), axis=0) - #E3 = np.concatenate((solver.pml_lxry.Ey[:-1,:], solver.pml_ry.Ey[:-1,:], solver.pml_rxry.Ey[:-1,:]), axis=0) - #Ey = np.concatenate((E1, E2, E3), axis=1) - #Ey = np.concatenate((solver.pml_lx.Ey[:-1,:],solver.Ey[:-1,:])) - im1 = axs[1].imshow(solver.Ey.T, cmap='jet', vmax=1000, vmin=-1000, origin = 'lower') + axs[0].set_xlabel("x [m]") + axs[0].set_ylabel("y [m]") + axs[0].set_title("Ex [V/m]") + fig.colorbar( + im1, + ax=axs[0], + ) + # E1 = np.concatenate((solver.pml_lxly.Ey[:-1,:], solver.pml_ly.Ey[:-1,:], solver.pml_rxly.Ey[:-1,:]), axis=0) + # E2 = np.concatenate((solver.pml_lx.Ey[:-1,:], solver.Ey[:-1,:], solver.pml_rx.Ey[:-1,:]), axis=0) + # E3 = np.concatenate((solver.pml_lxry.Ey[:-1,:], solver.pml_ry.Ey[:-1,:], solver.pml_rxry.Ey[:-1,:]), axis=0) + # Ey = np.concatenate((E1, E2, E3), axis=1) + # Ey = np.concatenate((solver.pml_lx.Ey[:-1,:],solver.Ey[:-1,:])) + im1 = axs[1].imshow(solver.Ey.T, cmap="jet", vmax=1000, vmin=-1000, origin="lower") axs[1].add_patch(circ1) - axs[1].set_xlabel('x [m]') - axs[1].set_ylabel('y [m]') - axs[1].set_title('Ey [V/m]') + axs[1].set_xlabel("x [m]") + axs[1].set_ylabel("y [m]") + axs[1].set_title("Ey [V/m]") fig.colorbar(im1, ax=axs[1]) - #E1 = np.concatenate((solver.pml_lxly.Hz, solver.pml_ly.Hz, solver.pml_rxly.Hz), axis=0) - #E2 = np.concatenate((solver.pml_lx.Hz, solver.Hz, solver.pml_rx.Hz), axis=0) - #E3 = np.concatenate((solver.pml_lxry.Hz, solver.pml_ry.Hz, solver.pml_rxry.Hz), axis=0) - #Hz = np.concatenate((E1, E2, E3), axis=1) - #Hz = np.concatenate((solver.pml_lx.Hz,solver.Hz)) - im1 = axs[2].imshow(solver.Hz.T, cmap='jet', vmax=2, vmin=-2, origin = 'lower') + # E1 = np.concatenate((solver.pml_lxly.Hz, solver.pml_ly.Hz, solver.pml_rxly.Hz), axis=0) + # E2 = np.concatenate((solver.pml_lx.Hz, solver.Hz, solver.pml_rx.Hz), axis=0) + # E3 = np.concatenate((solver.pml_lxry.Hz, solver.pml_ry.Hz, solver.pml_rxry.Hz), axis=0) + # Hz = np.concatenate((E1, E2, E3), axis=1) + # Hz = np.concatenate((solver.pml_lx.Hz,solver.Hz)) + im1 = axs[2].imshow(solver.Hz.T, cmap="jet", vmax=2, vmin=-2, origin="lower") axs[2].add_patch(circ2) - axs[2].set_xlabel('x [m]') - axs[2].set_ylabel('y [m]') - axs[2].set_title('Hz [A/m]') + axs[2].set_xlabel("x [m]") + axs[2].set_ylabel("y [m]") + axs[2].set_title("Hz [A/m]") fig.colorbar(im1, ax=axs[2]) plt.suptitle(str(solver.time)) @@ -165,13 +167,12 @@ # axs[1,2].set_ylabel('y [m]') # axs[1,2].set_title('Ez [V/m]') # fig.colorbar(im1, ax=axs[1,2]) - folder = sol_type + '_scatter_circle' + folder = sol_type + "_scatter_circle" if not os.path.exists(folder): os.mkdir(folder) - filename = folder + '/%d.png' % t + filename = folder + "/%d.png" % t plt.savefig(filename) plt.close(fig) solver.one_step() solver.Hz[i_s, j_s] += solver.gauss(solver.time) - diff --git a/examples/fdtd/script_sphere.py b/examples/fdtd/script_sphere.py index 69b34ec..65b77e2 100644 --- a/examples/fdtd/script_sphere.py +++ b/examples/fdtd/script_sphere.py @@ -1,53 +1,51 @@ import numpy as np from scipy.constants import c as c_light, epsilon_0 as eps_0, mu_0 as mu_0 -import matplotlib + # matplotlib.use('Agg') from matplotlib import pyplot as plt -from matplotlib import patches import os from tqdm import tqdm from solver3D import EMSolver3D from grid3D import Grid3D -from conductors3d import InCube, ConductorsAssembly, OutSphere, Plane, noConductor +from conductors3d import ConductorsAssembly, OutSphere from scipy.special import spherical_jn Z0 = np.sqrt(mu_0 / eps_0) -L = 1. +L = 1.0 # Number of mesh cells N = 50 Nx = N Ny = N Nz = N -Lx = 0.5*L -Ly = 0.5*L -Lz = 0.5*L +Lx = 0.5 * L +Ly = 0.5 * L +Lz = 0.5 * L dx = L / Nx dy = L / Ny dz = L / Nz r_sphere = 0.3 -xmin = -L / 2 # + dx / 2 -xmax = L / 2 #+ dx / 2 -ymin = -L / 2 #+ dy / 2 -ymax = L / 2 #+ dy / 2 -zmin = -L / 2 #+ dz / 2 -zmax = L / 2 #+ dz / 2 +xmin = -L / 2 # + dx / 2 +xmax = L / 2 # + dx / 2 +ymin = -L / 2 # + dy / 2 +ymax = L / 2 # + dy / 2 +zmin = -L / 2 # + dz / 2 +zmax = L / 2 # + dz / 2 x_cent = 0 y_cent = 0 z_cent = 0 - sphere = OutSphere(r_sphere, x_cent, y_cent, z_cent) conductors = ConductorsAssembly([sphere]) -#sphere = noConductor() -#conductors = ConductorsAssembly([sphere]) +# sphere = noConductor() +# conductors = ConductorsAssembly([sphere]) # conductors = cube -sol_type = 'FDTD' +sol_type = "FDTD" grid = Grid3D(xmin, xmax, ymin, ymax, zmin, zmax, Nx, Ny, Nz, conductors, sol_type) i_s = int(Nx / 2) @@ -57,8 +55,8 @@ flag_in_conductor = np.zeros((Nx, Ny, Nz), dtype=bool) -bc_low = ['dirichlet', 'dirichlet', 'dirichlet'] -bc_high = ['dirichlet', 'dirichlet', 'dirichlet'] +bc_low = ["dirichlet", "dirichlet", "dirichlet"] +bc_high = ["dirichlet", "dirichlet", "dirichlet"] solver = EMSolver3D(grid, sol_type, NCFL, i_s, j_s, k_s, bc_low, bc_high) # Constants @@ -71,38 +69,53 @@ Nborrow = np.zeros((Nx, Ny, Nz)) Nlend = np.zeros((Nx, Ny, Nz)) -''' +""" for ii in range(Nx): for jj in range(Ny): for kk in range(Nz): Nborrow[ii, jj, kk] = len(grid.borrowing_xy[ii, jj, kk]) Nlend[ii, jj, kk] = len(grid.lending_xy[ii, jj, kk]) -''' +""" m = 0 n = 1 p = 1 -k=2.7437/r_sphere +k = 2.7437 / r_sphere + def analytic_H(x, y, z, t): - r = np.sqrt(np.square(x)+np.square(y)+np.square(z)) - theta = np.arctan2(np.sqrt(np.square(x)+ np.square(y)), z) + r = np.sqrt(np.square(x) + np.square(y) + np.square(z)) + theta = np.arctan2(np.sqrt(np.square(x) + np.square(y)), z) phi = np.arctan2(y, x) H_r = 0 H_theta = 0 - H_phi = k/(r_sphere*mu_r)*spherical_jn(1, k*r)*np.sin(theta)*np.cos(k*c_light*t) - - H_x = H_r * np.sin(theta)*np.cos(phi) + H_theta * np.cos(theta)*np.cos(phi) - H_phi*np.sin(phi) - H_y = H_r * np.cos(theta)*np.cos(phi) + H_theta * np.cos(theta)*np.sin(phi) + H_phi*np.cos(phi) - H_z = H_r*np.cos(theta) - H_theta*np.sin(theta) + H_phi = ( + k + / (r_sphere * mu_r) + * spherical_jn(1, k * r) + * np.sin(theta) + * np.cos(k * c_light * t) + ) + + H_x = ( + H_r * np.sin(theta) * np.cos(phi) + + H_theta * np.cos(theta) * np.cos(phi) + - H_phi * np.sin(phi) + ) + H_y = ( + H_r * np.cos(theta) * np.cos(phi) + + H_theta * np.cos(theta) * np.sin(phi) + + H_phi * np.cos(phi) + ) + H_z = H_r * np.cos(theta) - H_theta * np.sin(theta) return H_x, H_y, H_z + for ii in range(Nx): for jj in range(Ny): for kk in range(Nz): - if grid.flag_int_cell_xy[ii, jj, kk]: x = (ii + 0.5) * dx + xmin y = (jj + 0.5) * dy + ymin @@ -123,79 +136,98 @@ def analytic_H(x, y, z, t): Tf = 6 * np.sqrt(2) * (r_sphere / c_light) Nt = int(Tf / solver.dt) -#Nt = 1 +# Nt = 1 res_Hy = np.zeros(Nt) res_Ex = np.zeros(Nt) res_Hz = np.zeros(Nt) fields_norms = False -#Nt = 1 +# Nt = 1 for t in tqdm(range(Nt)): - if fields_norms: fig, axs = plt.subplots(1, 2, figsize=(16, 8)) fig.subplots_adjust(left=0.05, bottom=0.1, right=0.97, top=0.94, wspace=0.15) - norme = np.sqrt(np.square(solver.Ex[:, :, k_s]) + np.square(solver.Ey[:, :, k_s]) + np.square(solver.Ez[:, :, k_s])) - normh = np.sqrt(np.square(solver.Hx[:, :, k_s]) + np.square(solver.Hy[:, :, k_s]) + np.square(solver.Hz[:, :, k_s])) - - im1 = axs[0].imshow(norme, cmap='jet', vmax=530, vmin=-530) # ,extent=[0, L , 0, L ]) - axs[0].set_xlabel('x [m]') - axs[0].set_ylabel('y [m]') - axs[0].set_title('||E|| [V/m]') + norme = np.sqrt( + np.square(solver.Ex[:, :, k_s]) + + np.square(solver.Ey[:, :, k_s]) + + np.square(solver.Ez[:, :, k_s]) + ) + normh = np.sqrt( + np.square(solver.Hx[:, :, k_s]) + + np.square(solver.Hy[:, :, k_s]) + + np.square(solver.Hz[:, :, k_s]) + ) + + im1 = axs[0].imshow( + norme, cmap="jet", vmax=530, vmin=-530 + ) # ,extent=[0, L , 0, L ]) + axs[0].set_xlabel("x [m]") + axs[0].set_ylabel("y [m]") + axs[0].set_title("||E|| [V/m]") fig.colorbar(im1, ax=axs[0]) - im1 = axs[1].imshow(normh, cmap='jet', vmax=1, vmin=-1) - axs[1].set_xlabel('x [m]') - axs[1].set_ylabel('y [m]') - axs[1].set_title('||H|| [V/m]') + im1 = axs[1].imshow(normh, cmap="jet", vmax=1, vmin=-1) + axs[1].set_xlabel("x [m]") + axs[1].set_ylabel("y [m]") + axs[1].set_title("||H|| [V/m]") fig.colorbar(im1, ax=axs[1]) else: fig, axs = plt.subplots(2, 3, figsize=(16, 10)) fig.subplots_adjust(left=0.05, bottom=0.1, right=0.97, top=0.94, wspace=0.15) - im1 = axs[0, 0].imshow(solver.Ex[:, :, k_s], cmap='jet', vmax=1500, vmin=-1500) # ,extent=[0, L , 0, L ]) - axs[0, 0].set_xlabel('x [m]') - axs[0, 0].set_ylabel('y [m]') - axs[0, 0].set_title('Ex [V/m]') - fig.colorbar(im1, ax=axs[0, 0], ) - im1 = axs[0, 1].imshow(solver.Ey[:, :, k_s], cmap='jet', vmax=1500, vmin=-1500) - axs[0, 1].set_xlabel('x [m]') - axs[0, 1].set_ylabel('y [m]') - axs[0, 1].set_title('Ey [V/m]') + im1 = axs[0, 0].imshow( + solver.Ex[:, :, k_s], cmap="jet", vmax=1500, vmin=-1500 + ) # ,extent=[0, L , 0, L ]) + axs[0, 0].set_xlabel("x [m]") + axs[0, 0].set_ylabel("y [m]") + axs[0, 0].set_title("Ex [V/m]") + fig.colorbar( + im1, + ax=axs[0, 0], + ) + im1 = axs[0, 1].imshow(solver.Ey[:, :, k_s], cmap="jet", vmax=1500, vmin=-1500) + axs[0, 1].set_xlabel("x [m]") + axs[0, 1].set_ylabel("y [m]") + axs[0, 1].set_title("Ey [V/m]") fig.colorbar(im1, ax=axs[0, 1]) - im1 = axs[0, 2].imshow(solver.Ez[:, :, k_s], cmap='jet', vmax=5000, vmin=-5000) - axs[0, 2].set_xlabel('x [m]') - axs[0, 2].set_ylabel('y [m]') - axs[0, 2].set_title('Ez [V/m]') + im1 = axs[0, 2].imshow(solver.Ez[:, :, k_s], cmap="jet", vmax=5000, vmin=-5000) + axs[0, 2].set_xlabel("x [m]") + axs[0, 2].set_ylabel("y [m]") + axs[0, 2].set_title("Ez [V/m]") fig.colorbar(im1, ax=axs[0, 2]) - im1 = axs[1, 0].imshow(solver.Hx[:, :, k_s], cmap='jet', vmax=8, vmin=-8) # ,extent=[0, L , 0, L ]) - axs[1, 0].set_xlabel('x [m]') - axs[1, 0].set_ylabel('y [m]') - axs[1, 0].set_title('Hx [A/m]') - fig.colorbar(im1, ax=axs[1, 0], ) - im1 = axs[1, 1].imshow(solver.Hy[:, :, k_s], cmap='jet', vmax=8, vmin=-8) - axs[1, 1].set_xlabel('x [m]') - axs[1, 1].set_ylabel('y [m]') - axs[1, 1].set_title('Hy [A/m]') + im1 = axs[1, 0].imshow( + solver.Hx[:, :, k_s], cmap="jet", vmax=8, vmin=-8 + ) # ,extent=[0, L , 0, L ]) + axs[1, 0].set_xlabel("x [m]") + axs[1, 0].set_ylabel("y [m]") + axs[1, 0].set_title("Hx [A/m]") + fig.colorbar( + im1, + ax=axs[1, 0], + ) + im1 = axs[1, 1].imshow(solver.Hy[:, :, k_s], cmap="jet", vmax=8, vmin=-8) + axs[1, 1].set_xlabel("x [m]") + axs[1, 1].set_ylabel("y [m]") + axs[1, 1].set_title("Hy [A/m]") fig.colorbar(im1, ax=axs[1, 1]) - im1 = axs[1, 2].imshow(solver.Hz[:, :, k_s], cmap='jet', vmax=8, vmin=-8) - axs[1, 2].set_xlabel('x [m]') - axs[1, 2].set_ylabel('y [m]') - axs[1, 2].set_title('Hz [A/m]') + im1 = axs[1, 2].imshow(solver.Hz[:, :, k_s], cmap="jet", vmax=8, vmin=-8) + axs[1, 2].set_xlabel("x [m]") + axs[1, 2].set_ylabel("y [m]") + axs[1, 2].set_title("Hz [A/m]") fig.colorbar(im1, ax=axs[1, 2]) plt.suptitle(str(solver.time)) - folder = sol_type + '_sphere' + folder = sol_type + "_sphere" if not os.path.exists(folder): os.mkdir(folder) - filename = folder + '/%d.png' % t + filename = folder + "/%d.png" % t plt.savefig(filename) plt.close(fig) - i_probe = int(Nx/2) - j_probe = int(Ny/2) - k_probe = int(Nz/2) + i_probe = int(Nx / 2) + j_probe = int(Ny / 2) + k_probe = int(Nz / 2) res_Hy[t] = solver.Hy[i_probe, j_probe, k_probe] res_Hz[t] = solver.Hz[i_probe, k_probe, k_probe] res_Ex[t] = solver.Ex[i_probe, j_probe, k_probe] @@ -204,7 +236,7 @@ def analytic_H(x, y, z, t): # solver.Jx[i_s, j_s, k_s] = solver.gauss(solver.time) # solver.Hz[i_s, j_s, k_s] += solver.gauss(solver.time) # solver.Jz[i_s, j_s, k_s] = solver.gauss(solver.time) -''' +""" fig, axs = plt.subplots(2, 3, figsize=(16, 10)) fig.subplots_adjust(left=0.05, bottom=0.1, right=0.97, top=0.94, wspace=0.15) axs[0, 0].imshow(grid.flag_int_cell_xy[:, :, k_s]) @@ -213,4 +245,4 @@ def analytic_H(x, y, z, t): axs[1, 0].imshow(solver.Hz[:, :, k_s], cmap='jet') axs[1, 1].imshow(solver.Hx[:, :, k_s], cmap='jet') axs[1, 2].imshow(solver.Hy[:, :, k_s], cmap='jet') -''' +""" diff --git a/examples/fit/script_2solids_fit.py b/examples/fit/script_2solids_fit.py index 0358785..c37b3d5 100644 --- a/examples/fit/script_2solids_fit.py +++ b/examples/fit/script_2solids_fit.py @@ -1,16 +1,12 @@ import numpy as np import matplotlib.pyplot as plt -import os, sys import pyvista as pv from tqdm import tqdm from mpl_toolkits.axes_grid1 import make_axes_locatable from scipy.constants import c as c_light -sys.path.append('../') - from solverFIT3D import SolverFIT3D -from gridFIT3D import GridFIT3D -from field import Field +from gridFIT3D import GridFIT3D # ---------- Domain setup --------- @@ -20,138 +16,164 @@ Nz = 200 # Embedded boundaries -stl_file1 = 'stl/rect.stl' -stl_file2 = 'stl/wakis.stl' -stl_solids = {'Solid 1': stl_file1, 'Solid 2': stl_file2 } +stl_file1 = "stl/rect.stl" +stl_file2 = "stl/wakis.stl" +stl_solids = {"Solid 1": stl_file1, "Solid 2": stl_file2} stl_rotate = [0, -90, 0] -stl_translate = {'Solid 1': [0,0,0], 'Solid 2': [-5, 0, 0]} +stl_translate = {"Solid 1": [0, 0, 0], "Solid 2": [-5, 0, 0]} stl_scale = 1e-3 # Materials: [eps_r, mu_r] -stl_materials = {'Solid 1': [5., 1.], 'Solid 2': 'PEC'} +stl_materials = {"Solid 1": [5.0, 1.0], "Solid 2": "PEC"} # Domain bounds (from stl_file1) surf1 = pv.read(stl_file1) surf1 = surf1.rotate_x(stl_rotate[0]).rotate_y(stl_rotate[1]).rotate_z(stl_rotate[2]) -surf1 = surf1.translate(stl_translate['Solid 1']) +surf1 = surf1.translate(stl_translate["Solid 1"]) surf1 = surf1.scale(stl_scale) surf2 = pv.read(stl_file2) surf2 = surf2.rotate_x(stl_rotate[0]).rotate_y(stl_rotate[1]).rotate_z(stl_rotate[2]) -surf2 = surf2.translate(stl_translate['Solid 2']) +surf2 = surf2.translate(stl_translate["Solid 2"]) surf2 = surf2.scale(stl_scale) xmin, xmax, ymin, ymax, zmin, zmax = surf1.bounds -padx, pady, padz = (xmax-xmin)*0.1, (ymax-ymin)*0.2, (zmax-zmin)*0.1 +padx, pady, padz = (xmax - xmin) * 0.1, (ymax - ymin) * 0.2, (zmax - zmin) * 0.1 -xmin, ymin, zmin = (xmin-padx), (ymin-pady), (zmin-padz) -xmax, ymax, zmax = (xmax+padx), (ymax+pady), (zmax+padz) +xmin, ymin, zmin = (xmin - padx), (ymin - pady), (zmin - padz) +xmax, ymax, zmax = (xmax + padx), (ymax + pady), (zmax + padz) # boundary conditions -bc_low=['pec', 'pec', 'pec'] -bc_high=['pec', 'pec', 'pec'] +bc_low = ["pec", "pec", "pec"] +bc_high = ["pec", "pec", "pec"] # set FIT solver -grid = GridFIT3D(xmin, xmax, ymin, ymax, zmin, zmax, Nx, Ny, Nz, - stl_solids=stl_solids, - stl_rotate=stl_rotate, - stl_scale=stl_scale, - stl_materials=stl_materials) - -solver = SolverFIT3D(grid, - bc_low=bc_low, bc_high=bc_high, - use_stl=True) +grid = GridFIT3D( + xmin, + xmax, + ymin, + ymax, + zmin, + zmax, + Nx, + Ny, + Nz, + stl_solids=stl_solids, + stl_rotate=stl_rotate, + stl_scale=stl_scale, + stl_materials=stl_materials, +) + +solver = SolverFIT3D(grid, bc_low=bc_low, bc_high=bc_high, use_stl=True) # Plot geometry plot_geometry = False if plot_geometry: pl = pv.Plotter() - pl.add_mesh(grid.grid, show_edges=True, style='wireframe', color='w', opacity=0.15) - pl.add_mesh(surf1, show_edges=False, color='b', opacity=0.25) - pl.add_mesh(surf2, show_edges=False, color='r', opacity=0.55) + pl.add_mesh(grid.grid, show_edges=True, style="wireframe", color="w", opacity=0.15) + pl.add_mesh(surf1, show_edges=False, color="b", opacity=0.25) + pl.add_mesh(surf2, show_edges=False, color="r", opacity=0.55) pl.show() # ------------ Plot functions --------------- -plane = 'YZ' - -if plane == 'XY': - x, y, z = slice(0,Nx), slice(0,Ny), int(Nz//2) #plane XY - title = '(x,y,Nz/2)' - xax, yax = 'y', 'x' - extent = [0,Ny,0,Nx] +plane = "YZ" -if plane == 'YZ': - x, y, z = int(Nx//2), slice(0,Ny), slice(0,Nz) #plane YZ - title = '(Nx/2,y,z)' - xax, yax = 'z', 'y' - extent = [0,Nz,0,Ny] +if plane == "XY": + x, y, z = slice(0, Nx), slice(0, Ny), int(Nz // 2) # plane XY + title = "(x,y,Nz/2)" + xax, yax = "y", "x" + extent = [0, Ny, 0, Nx] -def plot_E_field(solver, n, patch_stl=False): +if plane == "YZ": + x, y, z = int(Nx // 2), slice(0, Ny), slice(0, Nz) # plane YZ + title = "(Nx/2,y,z)" + xax, yax = "z", "y" + extent = [0, Nz, 0, Ny] - fig, ax = plt.subplots(1,1,figsize=[8,4], dpi=150) - vmin, vmax = 0., 1.e6 - im = ax.imshow(solver.E.get_abs()[x, y, z], cmap='jet', extent=extent, origin='lower', vmin=vmin, vmax=vmax,) - fig.colorbar(im, cax=make_axes_locatable(ax).append_axes('right', size='5%', pad=0.05)) - ax.set_title(f'FIT Abs(E){title}, timestep={n}') +def plot_E_field(solver, n, patch_stl=False): + fig, ax = plt.subplots(1, 1, figsize=[8, 4], dpi=150) + vmin, vmax = 0.0, 1.0e6 + + im = ax.imshow( + solver.E.get_abs()[x, y, z], + cmap="jet", + extent=extent, + origin="lower", + vmin=vmin, + vmax=vmax, + ) + fig.colorbar( + im, cax=make_axes_locatable(ax).append_axes("right", size="5%", pad=0.05) + ) + ax.set_title(f"FIT Abs(E){title}, timestep={n}") ax.set_xlabel(xax) ax.set_ylabel(yax) # Patch stl if patch_stl: - mask = np.reshape(grid.grid['Solid 2'], (Nx, Ny, Nz)) + mask = np.reshape(grid.grid["Solid 2"], (Nx, Ny, Nz)) patch = np.ones((Nx, Ny, Nz)) patch[np.logical_not(mask)] = np.nan - ax.imshow(patch[x,y,z], cmap='Greys', extent=extent, origin='lower', alpha=0.2) + ax.imshow( + patch[x, y, z], cmap="Greys", extent=extent, origin="lower", alpha=0.2 + ) - #fig.suptitle(f'Abs(E) field, timestep={n}') + # fig.suptitle(f'Abs(E) field, timestep={n}') fig.tight_layout() - fig.savefig('imgAbsE/'+str(n).zfill(4)+'.png') + fig.savefig("imgAbsE/" + str(n).zfill(4) + ".png") plt.clf() plt.close(fig) -def plot_H_field(solver, n, patch_stl=False): - fig, ax = plt.subplots(1,1, figsize=[8,4]) - vmin, vmax = 0, 1.e3 - - im = ax.imshow(solver.H.get_abs()[x, y, z], cmap='jet', extent=extent, origin='lower', vmin=vmin, vmax=vmax) - fig.colorbar(im, cax=make_axes_locatable(ax).append_axes('right', size='5%', pad=0.05)) - ax.set_title(f'FIT Abs(H){title}, timestep={n}') +def plot_H_field(solver, n, patch_stl=False): + fig, ax = plt.subplots(1, 1, figsize=[8, 4]) + vmin, vmax = 0, 1.0e3 + + im = ax.imshow( + solver.H.get_abs()[x, y, z], + cmap="jet", + extent=extent, + origin="lower", + vmin=vmin, + vmax=vmax, + ) + fig.colorbar( + im, cax=make_axes_locatable(ax).append_axes("right", size="5%", pad=0.05) + ) + ax.set_title(f"FIT Abs(H){title}, timestep={n}") ax.set_xlabel(xax) ax.set_ylabel(yax) # Patch stl if patch_stl: - mask = np.reshape(grid.grid['Solid 2'], (Nx, Ny, Nz)) + mask = np.reshape(grid.grid["Solid 2"], (Nx, Ny, Nz)) patch = np.ones((Nx, Ny, Nz)) patch[np.logical_not(mask)] = np.nan - ax.imshow(patch[x,y,z], cmap='Greys', extent=extent, origin='lower', alpha=0.2) - - #fig.suptitle(f'Abs(H) field, timestep={n}') + ax.imshow( + patch[x, y, z], cmap="Greys", extent=extent, origin="lower", alpha=0.2 + ) + + # fig.suptitle(f'Abs(H) field, timestep={n}') fig.tight_layout() - fig.savefig('imgAbsH/'+str(n).zfill(4)+'.png') + fig.savefig("imgAbsH/" + str(n).zfill(4) + ".png") plt.clf() plt.close(fig) # ------------ Time loop ---------------- -solver.J[int(Nx/2), int(Ny/2), 0, 'z'] = 1.0*c_light -solver.J[int(Nx/2), int(Ny/2), Nz-2, 'z'] = 1.0*c_light -solver.J[int(Nx/2), 1, int(Nz/2), 'z'] = 1.0*c_light -solver.J[int(Nx/2), Ny-2, int(Nz/2), 'z'] = 1.0*c_light +solver.J[int(Nx / 2), int(Ny / 2), 0, "z"] = 1.0 * c_light +solver.J[int(Nx / 2), int(Ny / 2), Nz - 2, "z"] = 1.0 * c_light +solver.J[int(Nx / 2), 1, int(Nz / 2), "z"] = 1.0 * c_light +solver.J[int(Nx / 2), Ny - 2, int(Nz / 2), "z"] = 1.0 * c_light Nt = 1000 for n in tqdm(range(Nt)): - # Advance solver.one_step() # Plot - if n%10 == 0: + if n % 10 == 0: plot_E_field(solver, n) plot_H_field(solver, n) - - - diff --git a/examples/fit/script_PML_fit.py b/examples/fit/script_PML_fit.py index 19de398..9630c95 100644 --- a/examples/fit/script_PML_fit.py +++ b/examples/fit/script_PML_fit.py @@ -1,14 +1,13 @@ import numpy as np import matplotlib.pyplot as plt -import os, sys import h5py from tqdm import tqdm -from scipy.constants import c as c_light, epsilon_0 as eps_0, mu_0 as mu_0 +from scipy.constants import c as c_light, mu_0 as mu_0 from mpl_toolkits.mplot3d import Axes3D -sys.path.append('../') + from solverFIT3D import SolverFIT3D -from gridFIT3D import GridFIT3D +from gridFIT3D import GridFIT3D from sources import Pulse # ---------- Domain setup --------- @@ -20,116 +19,157 @@ Nz = 20 # boundary conditions -bcx = 'pml' -bcy = 'pec' -bc_low=[bcx, bcy, 'pec'] -bc_high=[bcx, bcy, 'pec'] +bcx = "pml" +bcy = "pec" +bc_low = [bcx, bcy, "pec"] +bc_high = [bcx, bcy, "pec"] -if bcx == 'pml': - bcx += 'v3' +if bcx == "pml": + bcx += "v3" n_pml = 30 Nx += n_pml -# set grid -xmin, xmax, ymin, ymax, zmin, zmax = -Nx/2, Nx/2, -Ny/2, Ny/2, -Nz/2, Nz/2 -grid = GridFIT3D(xmin, xmax, ymin, ymax, zmin, zmax, Nx, Ny, Nz) +# set grid +xmin, xmax, ymin, ymax, zmin, zmax = -Nx / 2, Nx / 2, -Ny / 2, Ny / 2, -Nz / 2, Nz / 2 +grid = GridFIT3D(xmin, xmax, ymin, ymax, zmin, zmax, Nx, Ny, Nz) # set solver -solver = SolverFIT3D(grid, dt=0.5*grid.dx/c_light, - bc_low=bc_low, bc_high=bc_high) +solver = SolverFIT3D(grid, dt=0.5 * grid.dx / c_light, bc_low=bc_low, bc_high=bc_high) # set source -source = Pulse(field='Ez', - xs=25+n_pml, ys=100, zs=slice(0,Nz), #zs=int(Nz/2), - shape='harris', L=50*solver.dx) +source = Pulse( + field="Ez", + xs=25 + n_pml, + ys=100, + zs=slice(0, Nz), # zs=int(Nz/2), + shape="harris", + L=50 * solver.dx, +) # ------------ Time loop ---------------- run = True if run: - Nt = 200 + Nt = 200 plot = True for n in tqdm(range(Nt)): # Advance solver.one_step() # Update source - source.update(solver, n*solver.dt) + source.update(solver, n * solver.dt) # Clean z-dir - #for k in range(1,Nz-1): + # for k in range(1,Nz-1): # solver.E[:,:,k,'z'] = solver.E[:,:,int(Nz/2),'z'] # Plot - if plot and n%5==0: - solver.plot2D(field='E', component='Abs', plane='XY', pos=0.5, - norm=None, vmin=0, vmax=1.e-1, figsize=[8,4], cmap='jet', - title='imgEpml/Ez', off_screen=True, n=n, interpolation='spline36') + if plot and n % 5 == 0: + solver.plot2D( + field="E", + component="Abs", + plane="XY", + pos=0.5, + norm=None, + vmin=0, + vmax=1.0e-1, + figsize=[8, 4], + cmap="jet", + title="imgEpml/Ez", + off_screen=True, + n=n, + interpolation="spline36", + ) # Plot 2D plot = False if plot: Y_r, X_r = np.meshgrid(solver.y, solver.x) - #hf = h5py.File(f'Ez_test_pec.h5', 'r') - field = np.abs(solver.E[:,:,int(Nz/2),'z']) #- np.abs(hf['Ez']) + # hf = h5py.File(f'Ez_test_pec.h5', 'r') + field = np.abs(solver.E[:, :, int(Nz / 2), "z"]) # - np.abs(hf['Ez']) fig = plt.figure(1, tight_layout=False, dpi=200) - ax = fig.add_subplot(111, projection='3d') - - #ax.plot_surface(X_R, Y_R, abs(R), cmap='jet', rstride=1, cstride=1, linewidth=0, alpha=1, antialiased=False) - ax.plot_surface(X_r, Y_r, field, cmap='jet', rstride=1, cstride=1, linewidth=0, alpha=1, antialiased=False) - - ax.set_xlabel('x [a.u.]', labelpad=10) - ax.set_ylabel('y [a.u.]', labelpad=20) - ax.set_zlabel('Ez [V/m]', labelpad=10) - ax.set_xlim(-50-n_pml/2,50+n_pml/2) - ax.set_ylim(-100,100) - ax.set_zticks(np.linspace(0, np.max(field), 2), labels= ['0', '{:.2e}'.format(np.max(field))]) + ax = fig.add_subplot(111, projection="3d") + + # ax.plot_surface(X_R, Y_R, abs(R), cmap='jet', rstride=1, cstride=1, linewidth=0, alpha=1, antialiased=False) + ax.plot_surface( + X_r, + Y_r, + field, + cmap="jet", + rstride=1, + cstride=1, + linewidth=0, + alpha=1, + antialiased=False, + ) + + ax.set_xlabel("x [a.u.]", labelpad=10) + ax.set_ylabel("y [a.u.]", labelpad=20) + ax.set_zlabel("Ez [V/m]", labelpad=10) + ax.set_xlim(-50 - n_pml / 2, 50 + n_pml / 2) + ax.set_ylim(-100, 100) + ax.set_zticks( + np.linspace(0, np.max(field), 2), + labels=["0", "{:.2e}".format(np.max(field))], + ) ax.get_proj = lambda: np.dot(Axes3D.get_proj(ax), np.diag([1.0, 1.0, 0.4, 1])) - #fig.savefig(f'imgEpml/Ezsurf_{str(n).zfill(5)}') - #plt.close() + # fig.savefig(f'imgEpml/Ezsurf_{str(n).zfill(5)}') + # plt.close() plt.show() # Save - hf = h5py.File(f'Ez_test_{bcx}.h5', 'w') - hf['x'], hf['y'], hf['z'] = solver.x, solver.y, solver.z - hf['t'] = np.arange(0, Nt*solver.dt, solver.dt) - hf['Ez'] = solver.E[:,:,int(Nz/2),'z'] + hf = h5py.File(f"Ez_test_{bcx}.h5", "w") + hf["x"], hf["y"], hf["z"] = solver.x, solver.y, solver.z + hf["t"] = np.arange(0, Nt * solver.dt, solver.dt) + hf["Ez"] = solver.E[:, :, int(Nz / 2), "z"] hf.close() # ------------ Compute reflection ---------------- -ht = h5py.File(f'Ez_test_{bcx}.h5', 'r') -hr = h5py.File('Ez_ref.h5', 'r') +ht = h5py.File(f"Ez_test_{bcx}.h5", "r") +hr = h5py.File("Ez_ref.h5", "r") -R = np.abs(ht['Ez'][0+n_pml:76+n_pml, :]) - np.abs(hr['Ez'][75:151, :]) #[76x201] -R = R/np.max(np.abs(hr['Ez']))*100 +R = np.abs(ht["Ez"][0 + n_pml : 76 + n_pml, :]) - np.abs( + hr["Ez"][75:151, :] +) # [76x201] +R = R / np.max(np.abs(hr["Ez"])) * 100 ht.close() hr.close() # Save -hres = h5py.File('R.h5', 'w') +hres = h5py.File("R.h5", "w") hres[bcx] = R hres.close() plot = True if plot: - Y_r, X_r = np.meshgrid(solver.y, solver.x[0+n_pml:76+n_pml]) + Y_r, X_r = np.meshgrid(solver.y, solver.x[0 + n_pml : 76 + n_pml]) field = np.abs(R) fig = plt.figure(1, tight_layout=True, dpi=200) - ax = fig.add_subplot(111, projection='3d') - - #ax.plot_surface(X_R, Y_R, abs(R), cmap='jet', rstride=1, cstride=1, linewidth=0, alpha=1, antialiased=False) - ax.plot_surface(X_r, Y_r, field, cmap='plasma', rstride=1, cstride=1, linewidth=0, alpha=1, antialiased=False) - - ax.set_xlabel('x [a.u.]', labelpad=10) - ax.set_ylabel('y [a.u.]', labelpad=20) - ax.set_zlabel('R [%]', labelpad=10) - ax.set_xlim(-50+n_pml/2,25+n_pml/2) - ax.set_ylim(-100,100) - ax.set_zticks(np.linspace(0, np.max(field), 3)) - ax.get_proj = lambda: np.dot(Axes3D.get_proj(ax), np.diag([1.0, 1.0, 0.4, 1.])) - - fig.savefig('imgEpml/R.png') + ax = fig.add_subplot(111, projection="3d") + + # ax.plot_surface(X_R, Y_R, abs(R), cmap='jet', rstride=1, cstride=1, linewidth=0, alpha=1, antialiased=False) + ax.plot_surface( + X_r, + Y_r, + field, + cmap="plasma", + rstride=1, + cstride=1, + linewidth=0, + alpha=1, + antialiased=False, + ) + + ax.set_xlabel("x [a.u.]", labelpad=10) + ax.set_ylabel("y [a.u.]", labelpad=20) + ax.set_zlabel("R [%]", labelpad=10) + ax.set_xlim(-50 + n_pml / 2, 25 + n_pml / 2) + ax.set_ylim(-100, 100) + ax.set_zticks(np.linspace(0, np.max(field), 3)) + ax.get_proj = lambda: np.dot(Axes3D.get_proj(ax), np.diag([1.0, 1.0, 0.4, 1.0])) + + fig.savefig("imgEpml/R.png") plt.show() diff --git a/examples/fit/script_PMLref_fit.py b/examples/fit/script_PMLref_fit.py index f9ed1bc..1d4ce37 100644 --- a/examples/fit/script_PMLref_fit.py +++ b/examples/fit/script_PMLref_fit.py @@ -1,14 +1,13 @@ import numpy as np import matplotlib.pyplot as plt -import os, sys import h5py from tqdm import tqdm -from scipy.constants import c as c_light, epsilon_0 as eps_0, mu_0 as mu_0 +from scipy.constants import c as c_light, mu_0 as mu_0 from mpl_toolkits.mplot3d import Axes3D -sys.path.append('../') + from solverFIT3D import SolverFIT3D -from gridFIT3D import GridFIT3D +from gridFIT3D import GridFIT3D from sources import Pulse # ---------- Domain setup --------- @@ -19,71 +18,99 @@ Nz = 20 # Domain bounds: box 10cmx10cmx30cm -xmin, xmax, ymin, ymax, zmin, zmax = -Nx/2, Nx/2, -Ny/2, Ny/2, -Nz/2, Nz/2 +xmin, xmax, ymin, ymax, zmin, zmax = -Nx / 2, Nx / 2, -Ny / 2, Ny / 2, -Nz / 2, Nz / 2 # boundary conditions -bc_low=['pec', 'pec', 'pec'] -bc_high=['pec', 'pec', 'pec'] +bc_low = ["pec", "pec", "pec"] +bc_high = ["pec", "pec", "pec"] -# set grid -grid = GridFIT3D(xmin, xmax, ymin, ymax, zmin, zmax, Nx, Ny, Nz) +# set grid +grid = GridFIT3D(xmin, xmax, ymin, ymax, zmin, zmax, Nx, Ny, Nz) # set solver -solver = SolverFIT3D(grid, dt=0.5*grid.dx/c_light, - bc_low=bc_low, bc_high=bc_high) +solver = SolverFIT3D(grid, dt=0.5 * grid.dx / c_light, bc_low=bc_low, bc_high=bc_high) # set source -source = Pulse(field='Ez', - xs=int(Nx/2), ys=int(Ny/2), zs=slice(0,Nz), #zs=int(Nz/2), - shape='harris', L=50*solver.dx) +source = Pulse( + field="Ez", + xs=int(Nx / 2), + ys=int(Ny / 2), + zs=slice(0, Nz), # zs=int(Nz/2), + shape="harris", + L=50 * solver.dx, +) # ------------ Time loop ---------------- -Nt = 200 +Nt = 200 plot = False for n in tqdm(range(Nt)): # Advance solver.one_step() # Update source - source.update(solver, n*solver.dt) + source.update(solver, n * solver.dt) # Clean z-dir - #for k in range(1,Nz-1): + # for k in range(1,Nz-1): # solver.E[:,:,k,'z'] = solver.E[:,:,int(Nz/2),'z'] # Plot - if plot and n%2==0: - solver.plot2D(field='E', component='Abs', plane='XY', pos=0.5, - norm=None, vmin=0, vmax=None, figsize=[8,4], cmap='jet', - title='imgEpml/Ez', off_screen=True, n=n, interpolation='spline36') + if plot and n % 2 == 0: + solver.plot2D( + field="E", + component="Abs", + plane="XY", + pos=0.5, + norm=None, + vmin=0, + vmax=None, + figsize=[8, 4], + cmap="jet", + title="imgEpml/Ez", + off_screen=True, + n=n, + interpolation="spline36", + ) # Save -hf = h5py.File('Ez.h5', 'w') -hf['x'], hf['y'], hf['z'] = solver.x, solver.y, solver.z -hf['t'] = np.arange(0, Nt*solver.dt, solver.dt) -hf['Ez'] = solver.E[:,:,int(Nz/2),'z'] +hf = h5py.File("Ez.h5", "w") +hf["x"], hf["y"], hf["z"] = solver.x, solver.y, solver.z +hf["t"] = np.arange(0, Nt * solver.dt, solver.dt) +hf["Ez"] = solver.E[:, :, int(Nz / 2), "z"] hf.close() # Plot 2D plot = True if plot: Y_r, X_r = np.meshgrid(solver.y, solver.x) - field = np.abs(solver.E[:,:,int(Nz/2),'z']) + field = np.abs(solver.E[:, :, int(Nz / 2), "z"]) fig = plt.figure(1, tight_layout=True, dpi=200) - ax = fig.add_subplot(111, projection='3d') - - #ax.plot_surface(X_R, Y_R, abs(R), cmap='jet', rstride=1, cstride=1, linewidth=0, alpha=1, antialiased=False) - ax.plot_surface(X_r, Y_r, field, cmap='jet', rstride=1, cstride=1, linewidth=0, alpha=1, antialiased=False) - - ax.set_xlabel('x [a.u.]', labelpad=10) - ax.set_ylabel('y [a.u.]', labelpad=20) - ax.set_zlabel('Ez [V/m]', labelpad=10) - ax.set_xlim(-100,100) - ax.set_ylim(-100,100) - ax.set_zticks(np.linspace(0, np.max(field), 2), labels= ['0', '{:.2e}'.format(np.max(field))]) + ax = fig.add_subplot(111, projection="3d") + + # ax.plot_surface(X_R, Y_R, abs(R), cmap='jet', rstride=1, cstride=1, linewidth=0, alpha=1, antialiased=False) + ax.plot_surface( + X_r, + Y_r, + field, + cmap="jet", + rstride=1, + cstride=1, + linewidth=0, + alpha=1, + antialiased=False, + ) + + ax.set_xlabel("x [a.u.]", labelpad=10) + ax.set_ylabel("y [a.u.]", labelpad=20) + ax.set_zlabel("Ez [V/m]", labelpad=10) + ax.set_xlim(-100, 100) + ax.set_ylim(-100, 100) + ax.set_zticks( + np.linspace(0, np.max(field), 2), labels=["0", "{:.2e}".format(np.max(field))] + ) ax.get_proj = lambda: np.dot(Axes3D.get_proj(ax), np.diag([1.0, 1.0, 0.4, 1])) - plt.show() \ No newline at end of file + plt.show() diff --git a/examples/fit/script_cubcavity_fit.py b/examples/fit/script_cubcavity_fit.py index aa40d03..7cf6a14 100644 --- a/examples/fit/script_cubcavity_fit.py +++ b/examples/fit/script_cubcavity_fit.py @@ -1,15 +1,13 @@ import numpy as np import matplotlib.pyplot as plt -import os, sys import pyvista as pv import h5py from tqdm import tqdm from scipy.constants import c as c_light -sys.path.append('../') - from solverFIT3D import SolverFIT3D -from gridFIT3D import GridFIT3D +from gridFIT3D import GridFIT3D +from wakeSolver import WakeSolver # ---------- Domain setup --------- # Number of mesh cells @@ -18,92 +16,116 @@ Nz = 150 # Embedded boundaries -stl_file = 'stl/cubcavity.stl' +stl_file = "stl/cubcavity.stl" surf = pv.read(stl_file) -stl_solids = {'Cavity': stl_file} -stl_materials = {'Cavity': 'vacuum'} +stl_solids = {"Cavity": stl_file} +stl_materials = {"Cavity": "vacuum"} # Domain bounds xmin, xmax, ymin, ymax, zmin, zmax = surf.bounds -Lx, Ly, Lz = (xmax-xmin), (ymax-ymin), (zmax-zmin) +Lx, Ly, Lz = (xmax - xmin), (ymax - ymin), (zmax - zmin) # boundary conditions -bc_low=['pec', 'pec', 'abc'] -bc_high=['pec', 'pec', 'abc'] +bc_low = ["pec", "pec", "abc"] +bc_high = ["pec", "pec", "abc"] # set FIT solver -grid = GridFIT3D(xmin, xmax, ymin, ymax, zmin, zmax, Nx, Ny, Nz, - stl_solids=stl_solids, - stl_materials=stl_materials) - -solver = SolverFIT3D(grid, - bc_low=bc_low, bc_high=bc_high, - use_stl=True, bg='pec') - +grid = GridFIT3D( + xmin, + xmax, + ymin, + ymax, + zmin, + zmax, + Nx, + Ny, + Nz, + stl_solids=stl_solids, + stl_materials=stl_materials, +) + +solver = SolverFIT3D(grid, bc_low=bc_low, bc_high=bc_high, use_stl=True, bg="pec") + # ------------ Beam source ---------------- # Beam parameters -sigmaz = 18.5e-3 #[m] -q = 1e-9 #[C] -beta = 1.0 # beam beta -xs = 0. # x source position [m] -ys = 0. # y source position [m] -xt = 0. # x test position [m] -yt = 0. # y test position [m] -tinj = 8.53*sigmaz/c_light # injection time offset [s] +sigmaz = 18.5e-3 # [m] +q = 1e-9 # [C] +beta = 1.0 # beam beta +xs = 0.0 # x source position [m] +ys = 0.0 # y source position [m] +xt = 0.0 # x test position [m] +yt = 0.0 # y test position [m] +tinj = 8.53 * sigmaz / c_light # injection time offset [s] x, y, z = solver.x, solver.y, solver.z -ixs, iys = np.abs(x-xs).argmin(), np.abs(y-ys).argmin() -ixt, iyt = np.abs(x-xt).argmin(), np.abs(y-yt).argmin() +ixs, iys = np.abs(x - xs).argmin(), np.abs(y - ys).argmin() +ixt, iyt = np.abs(x - xt).argmin(), np.abs(y - yt).argmin() + def beam(solver, t): # Define gaussian - s0 = z.min()-c_light*tinj - s = z-c_light*t - profile = 1/np.sqrt(2*np.pi*sigmaz**2)*np.exp(-(s-s0)**2/(2*sigmaz**2)) + s0 = z.min() - c_light * tinj + s = z - c_light * t + profile = ( + 1 / np.sqrt(2 * np.pi * sigmaz**2) * np.exp(-((s - s0) ** 2) / (2 * sigmaz**2)) + ) # Update current - current = q*c_light*profile/solver.dx/solver.dy - solver.J[ixs,iys,:,'z'] = current + current = q * c_light * profile / solver.dx / solver.dy + solver.J[ixs, iys, :, "z"] = current + # ------------ Time loop ---------------- # Define wake length -wakelength = 1000*1e-3 #[m] +wakelength = 1000 * 1e-3 # [m] # Obtain simulation time -tmax = (wakelength + tinj*c_light + (zmax-zmin))/c_light #[s] -Nt = int(tmax/solver.dt) -t = np.arange(0, Nt*solver.dt, solver.dt) -ninj = int(tinj/solver.dt) +tmax = (wakelength + tinj * c_light + (zmax - zmin)) / c_light # [s] +Nt = int(tmax / solver.dt) +t = np.arange(0, Nt * solver.dt, solver.dt) +ninj = int(tinj / solver.dt) # Prepare save files save = True plot = False if save: - hf = h5py.File('results/Ez.h5', 'w') - hf2 = h5py.File('results/Jz.h5', 'w') - hf['x'], hf['y'], hf['z'], hf['t'] = x, y, z, t + hf = h5py.File("results/Ez.h5", "w") + hf2 = h5py.File("results/Jz.h5", "w") + hf["x"], hf["y"], hf["z"], hf["t"] = x, y, z, t for n in tqdm(range(Nt)): - # Initial condition - beam(solver, n*solver.dt) + beam(solver, n * solver.dt) # Advance solver.one_step() # Plot 2D on-the-fly - if n>ninj and n%10 == 0 and plot: - solver.plot2D(field='E', component='y', plane='ZY', pos=0.5, norm=None, - vmin=-5e5, vmax=5e5, cmap='rainbow', patch_alpha=0.5, - add_patch='Cavity', patch_reverse=True, title='imgCav/Ey', off_screen=True, - n=n, interpolation='spline36') - + if n > ninj and n % 10 == 0 and plot: + solver.plot2D( + field="E", + component="y", + plane="ZY", + pos=0.5, + norm=None, + vmin=-5e5, + vmax=5e5, + cmap="rainbow", + patch_alpha=0.5, + add_patch="Cavity", + patch_reverse=True, + title="imgCav/Ey", + off_screen=True, + n=n, + interpolation="spline36", + ) + # Save in hdf5 format (needed for Impedance) if save: - hf['#'+str(n).zfill(5)]=solver.E[ixt, iyt, :, 'z'] - #hf2['#'+str(n).zfill(5)]=solver.J[ixt, iyt, :, 'z'] + hf["#" + str(n).zfill(5)] = solver.E[ixt, iyt, :, "z"] + # hf2['#'+str(n).zfill(5)]=solver.J[ixt, iyt, :, 'z'] # Close save file if save: @@ -113,17 +135,38 @@ def beam(solver, t): # Plot 3D built-in plot3d = False if plot3d: - solver.plot3D(field='E', component='Abs', clim=None, add_stl='Cavity', stl_opacity=0.0, - stl_colors='white', field_on_stl=True, nan_opacity=1.0, field_opacity=1.0, - cmap='rainbow', off_screen=False, zoom=1.0, n=n) + solver.plot3D( + field="E", + component="Abs", + clim=None, + add_stl="Cavity", + stl_opacity=0.0, + stl_colors="white", + field_on_stl=True, + nan_opacity=1.0, + field_opacity=1.0, + cmap="rainbow", + off_screen=False, + zoom=1.0, + n=n, + ) # ------------ Beam-coupling Impedance ---------------- -from wakeSolver import WakeSolver # Initialize wake solver with beam information -wake = WakeSolver(q=q, sigmaz=sigmaz, beta=beta, ti=tinj, - xsource=xs, ysource=ys, xtest=xt, ytest=yt, - save=True, logfile=True, Ez_file='results/Ez.h5') +wake = WakeSolver( + q=q, + sigmaz=sigmaz, + beta=beta, + ti=tinj, + xsource=xs, + ysource=ys, + xtest=xt, + ytest=yt, + save=True, + logfile=True, + Ez_file="results/Ez.h5", +) # Compute beam-coupling impedance and wake potential wake.calc_long_WP() @@ -131,16 +174,16 @@ def beam(solver, t): plot = True if plot: - fig, ax = plt.subplots(1,2, figsize=[12,4], dpi=150) - ax[0].plot(wake.s*1e3, wake.WP, c='r', lw=1.5) - ax[0].set_xlabel('s [mm]') - ax[0].set_ylabel('Longitudinal wake potential [V/pC]', color='r') + fig, ax = plt.subplots(1, 2, figsize=[12, 4], dpi=150) + ax[0].plot(wake.s * 1e3, wake.WP, c="r", lw=1.5) + ax[0].set_xlabel("s [mm]") + ax[0].set_ylabel("Longitudinal wake potential [V/pC]", color="r") - ax[1].plot(wake.f*1e-9, np.abs(wake.Z), c='b', lw=1.5) - ax[1].set_xlabel('f [GHz]') - ax[1].set_ylabel('Longitudinal impedance [Abs][$\Omega$]', color='b') + ax[1].plot(wake.f * 1e-9, np.abs(wake.Z), c="b", lw=1.5) + ax[1].set_xlabel("f [GHz]") + ax[1].set_ylabel("Longitudinal impedance [Abs][$\Omega$]", color="b") fig.tight_layout() - fig.savefig('results/longitudinal.png') + fig.savefig("results/longitudinal.png") plt.show() diff --git a/examples/fit/script_cube_fit.py b/examples/fit/script_cube_fit.py index 3785433..72e6c86 100644 --- a/examples/fit/script_cube_fit.py +++ b/examples/fit/script_cube_fit.py @@ -1,25 +1,20 @@ import numpy as np from scipy.constants import c as c_light, epsilon_0 as eps_0, mu_0 as mu_0 -import matplotlib + # matplotlib.use('Agg') from matplotlib import pyplot as plt -from matplotlib import patches -import os, sys from tqdm import tqdm from mpl_toolkits.axes_grid1 import make_axes_locatable -sys.path.append('../') from solverFIT3D import SolverFIT3D from solver3D import EMSolver3D from grid3D import Grid3D -from conductors3d import noConductor, InCube, ConductorsAssembly -from scipy.special import jv -from field import Field +from conductors3d import InCube, ConductorsAssembly Z0 = np.sqrt(mu_0 / eps_0) -L = 1. +L = 1.0 # Number of mesh cells N = 50 Nx = N @@ -32,146 +27,184 @@ dy = L / Ny dz = L / Nz -xmin = -Lx/2 -xmax = Lx/2 -ymin = - Ly/2 -ymax = Ly/2 -zmin = - Lz/2 -zmax = Lz/2 - -#Embedded cube -lx = Lx*0.7 -ly = Ly*0.7 -lz = Lz*0.7 +xmin = -Lx / 2 +xmax = Lx / 2 +ymin = -Ly / 2 +ymax = Ly / 2 +zmin = -Lz / 2 +zmax = Lz / 2 + +# Embedded cube +lx = Lx * 0.7 +ly = Ly * 0.7 +lz = Lz * 0.7 x_cent = 0 y_cent = 0 z_cent = 0 -cube = InCube(lx, ly, lz, x_cent, y_cent, z_cent) #noConductor() +cube = InCube(lx, ly, lz, x_cent, y_cent, z_cent) # noConductor() conductors = ConductorsAssembly([cube]) NCFL = 1 # set FIT solver -gridFIT = Grid3D(xmin, xmax, ymin, ymax, zmin, zmax, Nx, Ny, Nz, conductors, 'FIT') +gridFIT = Grid3D(xmin, xmax, ymin, ymax, zmin, zmax, Nx, Ny, Nz, conductors, "FIT") solverFIT = SolverFIT3D(gridFIT) # set FDTD solver -gridFDTD = Grid3D(xmin, xmax, ymin, ymax, zmin, zmax, Nx, Ny, Nz, conductors, 'FDTD') -solverFDTD = EMSolver3D(gridFDTD, 'FDTD', NCFL) +gridFDTD = Grid3D(xmin, xmax, ymin, ymax, zmin, zmax, Nx, Ny, Nz, conductors, "FDTD") +solverFDTD = EMSolver3D(gridFDTD, "FDTD", NCFL) # Initial conditions -solverFIT.E[int(Nx/2), int(Ny/2), int(Nz/2), 'z'] = 1.0*c_light -solverFDTD.Ez[int(Nx/2), int(Ny/2), int(Nz/2)] = 1.0*c_light +solverFIT.E[int(Nx / 2), int(Ny / 2), int(Nz / 2), "z"] = 1.0 * c_light +solverFDTD.Ez[int(Nx / 2), int(Ny / 2), int(Nz / 2)] = 1.0 * c_light Nt = 50 -plane = 'XY' +plane = "XY" -if plane == 'XY': - x, y, z = slice(0,Nx), slice(0,Ny), int(Nz//2) #plane XY - title = '(x,y,Nz/2)' - xax, yax = 'y', 'x' +if plane == "XY": + x, y, z = slice(0, Nx), slice(0, Ny), int(Nz // 2) # plane XY + title = "(x,y,Nz/2)" + xax, yax = "y", "x" -if plane == 'YZ': - x, y, z = int(Nx//2), slice(0,Ny), slice(0,Nz) #plane YZ - title = '(Nx/2,y,z)' - xax, yax = 'z', 'y' +if plane == "YZ": + x, y, z = int(Nx // 2), slice(0, Ny), slice(0, Nz) # plane YZ + title = "(Nx/2,y,z)" + xax, yax = "z", "y" -def plot_E_field(solverFIT, solverFDTD, n): - fig, axs = plt.subplots(2,3, tight_layout=True, figsize=[8,6]) - dims = {0:'x', 1:'y', 2:'z'} - vmin, vmax = -1.e6, 1.e6 - #FIT +def plot_E_field(solverFIT, solverFDTD, n): + fig, axs = plt.subplots(2, 3, tight_layout=True, figsize=[8, 6]) + dims = {0: "x", 1: "y", 2: "z"} + vmin, vmax = -1.0e6, 1.0e6 + # FIT extent = (0, N, 0, N) - for i, ax in enumerate(axs[0,:]): - #vmin, vmax = -np.max(np.abs(solverFIT.E[x, y, z, dims[i]])), np.max(np.abs(solverFIT.E[x, y, z, dims[i]])) - im = ax.imshow(solverFIT.E[x, y, z, dims[i]], cmap='rainbow', vmin=vmin, vmax=vmax, extent=extent) - fig.colorbar(im, cax=make_axes_locatable(ax).append_axes('right', size='5%', pad=0.05)) - ax.set_title(f'FIT E{dims[i]}{title}') + for i, ax in enumerate(axs[0, :]): + # vmin, vmax = -np.max(np.abs(solverFIT.E[x, y, z, dims[i]])), np.max(np.abs(solverFIT.E[x, y, z, dims[i]])) + im = ax.imshow( + solverFIT.E[x, y, z, dims[i]], + cmap="rainbow", + vmin=vmin, + vmax=vmax, + extent=extent, + ) + fig.colorbar( + im, cax=make_axes_locatable(ax).append_axes("right", size="5%", pad=0.05) + ) + ax.set_title(f"FIT E{dims[i]}{title}") ax.set_xlabel(xax) ax.set_ylabel(yax) - #FDTD - ax = axs[1,0] + # FDTD + ax = axs[1, 0] extent = (0, N, 0, N) - #vmin, vmax = -np.max(np.abs(solverFDTD.Ex[x, y, z])), np.max(np.abs(solverFDTD.Ex[x, y, z])) - im = ax.imshow(solverFDTD.Ex[x, y, z], cmap='rainbow', vmin=vmin, vmax=vmax, extent=extent) - fig.colorbar(im, cax=make_axes_locatable(ax).append_axes('right', size='5%', pad=0.05)) - ax.set_title(f'FDTD Ex{title}') + # vmin, vmax = -np.max(np.abs(solverFDTD.Ex[x, y, z])), np.max(np.abs(solverFDTD.Ex[x, y, z])) + im = ax.imshow( + solverFDTD.Ex[x, y, z], cmap="rainbow", vmin=vmin, vmax=vmax, extent=extent + ) + fig.colorbar( + im, cax=make_axes_locatable(ax).append_axes("right", size="5%", pad=0.05) + ) + ax.set_title(f"FDTD Ex{title}") ax.set_xlabel(xax) ax.set_ylabel(yax) - ax = axs[1,1] + ax = axs[1, 1] extent = (0, N, 0, N) - #vmin, vmax = -np.max(np.abs(solverFDTD.Ey[x, y, z])), np.max(np.abs(solverFDTD.Ey[x, y, z])) - im = ax.imshow(solverFDTD.Ey[x, y, z], cmap='rainbow', vmin=vmin, vmax=vmax, extent=extent) - fig.colorbar(im, cax=make_axes_locatable(ax).append_axes('right', size='5%', pad=0.05)) - ax.set_title(f'FDTD Ey{title}') + # vmin, vmax = -np.max(np.abs(solverFDTD.Ey[x, y, z])), np.max(np.abs(solverFDTD.Ey[x, y, z])) + im = ax.imshow( + solverFDTD.Ey[x, y, z], cmap="rainbow", vmin=vmin, vmax=vmax, extent=extent + ) + fig.colorbar( + im, cax=make_axes_locatable(ax).append_axes("right", size="5%", pad=0.05) + ) + ax.set_title(f"FDTD Ey{title}") ax.set_xlabel(xax) ax.set_ylabel(yax) - ax = axs[1,2] + ax = axs[1, 2] extent = (0, N, 0, N) - #vmin, vmax = -np.max(np.abs(solverFDTD.Ez[x, y, z])), np.max(np.abs(solverFDTD.Ez[x, y, z])) - im = ax.imshow(solverFDTD.Ez[x, y, z], cmap='rainbow', vmin=vmin, vmax=vmax, extent=extent) - fig.colorbar(im, cax=make_axes_locatable(ax).append_axes('right', size='5%', pad=0.05)) - ax.set_title(f'FDTD Ez{title}') + # vmin, vmax = -np.max(np.abs(solverFDTD.Ez[x, y, z])), np.max(np.abs(solverFDTD.Ez[x, y, z])) + im = ax.imshow( + solverFDTD.Ez[x, y, z], cmap="rainbow", vmin=vmin, vmax=vmax, extent=extent + ) + fig.colorbar( + im, cax=make_axes_locatable(ax).append_axes("right", size="5%", pad=0.05) + ) + ax.set_title(f"FDTD Ez{title}") ax.set_xlabel(xax) ax.set_ylabel(yax) - - fig.suptitle(f'E field, timestep={n}') - fig.savefig('imgE/'+str(n).zfill(4)+'.png') + fig.suptitle(f"E field, timestep={n}") + fig.savefig("imgE/" + str(n).zfill(4) + ".png") plt.clf() plt.close(fig) -def plot_H_field(solverFIT, solverFDTD, n): - fig, axs = plt.subplots(2,3, tight_layout=True, figsize=[8,6]) - dims = {0:'x', 1:'y', 2:'z'} +def plot_H_field(solverFIT, solverFDTD, n): + fig, axs = plt.subplots(2, 3, tight_layout=True, figsize=[8, 6]) + dims = {0: "x", 1: "y", 2: "z"} extent = (0, N, 0, N) vmin, vmax = -5e3, 5e3 - #FIT - for i, ax in enumerate(axs[0,:]): - #vmin, vmax = -np.max(np.abs(solverFIT.H[x, y, z, dims[i]])), np.max(np.abs(solverFIT.H[x, y, z, dims[i]])) - im = ax.imshow(solverFIT.H[x, y, z, dims[i]], cmap='rainbow', vmin=vmin, vmax=vmax, extent=extent) - fig.colorbar(im, cax=make_axes_locatable(ax).append_axes('right', size='5%', pad=0.05)) - ax.set_title(f'FIT H{dims[i]}{title}') - - #FDTD - ax = axs[1,0] - #vmin, vmax = -np.max(np.abs(solverFDTD.Hx[x, y, z])), np.max(np.abs(solverFDTD.Hx[x, y, z])) - im = ax.imshow(solverFDTD.Hx[x, y, z], cmap='rainbow', vmin=vmin, vmax=vmax, extent=extent) - fig.colorbar(im, cax=make_axes_locatable(ax).append_axes('right', size='5%', pad=0.05)) - ax.set_title(f'FDTD Hx{title}') - - ax = axs[1,1] - #vmin, vmax = -np.max(np.abs(solverFDTD.Hy[x, y, z])), np.max(np.abs(solverFDTD.Hy[x, y, z])) - im = ax.imshow(solverFDTD.Hy[x, y, z], cmap='rainbow', vmin=vmin, vmax=vmax, extent=extent) - fig.colorbar(im, cax=make_axes_locatable(ax).append_axes('right', size='5%', pad=0.05)) - ax.set_title(f'FDTD Hy{title}') - - ax = axs[1,2] - #vmin, vmax = -np.max(np.abs(solverFDTD.Hz[x, y, z])), np.max(np.abs(solverFDTD.Hz[x, y, z])) - im = ax.imshow(solverFDTD.Hz[x, y, z], cmap='rainbow', vmin=vmin, vmax=vmax, extent=extent) - fig.colorbar(im, cax=make_axes_locatable(ax).append_axes('right', size='5%', pad=0.05)) - ax.set_title(f'FDTD Hz{title}') - - fig.suptitle(f'H field, timestep={n}') - fig.savefig('imgH/'+str(n).zfill(4)+'.png') + # FIT + for i, ax in enumerate(axs[0, :]): + # vmin, vmax = -np.max(np.abs(solverFIT.H[x, y, z, dims[i]])), np.max(np.abs(solverFIT.H[x, y, z, dims[i]])) + im = ax.imshow( + solverFIT.H[x, y, z, dims[i]], + cmap="rainbow", + vmin=vmin, + vmax=vmax, + extent=extent, + ) + fig.colorbar( + im, cax=make_axes_locatable(ax).append_axes("right", size="5%", pad=0.05) + ) + ax.set_title(f"FIT H{dims[i]}{title}") + + # FDTD + ax = axs[1, 0] + # vmin, vmax = -np.max(np.abs(solverFDTD.Hx[x, y, z])), np.max(np.abs(solverFDTD.Hx[x, y, z])) + im = ax.imshow( + solverFDTD.Hx[x, y, z], cmap="rainbow", vmin=vmin, vmax=vmax, extent=extent + ) + fig.colorbar( + im, cax=make_axes_locatable(ax).append_axes("right", size="5%", pad=0.05) + ) + ax.set_title(f"FDTD Hx{title}") + + ax = axs[1, 1] + # vmin, vmax = -np.max(np.abs(solverFDTD.Hy[x, y, z])), np.max(np.abs(solverFDTD.Hy[x, y, z])) + im = ax.imshow( + solverFDTD.Hy[x, y, z], cmap="rainbow", vmin=vmin, vmax=vmax, extent=extent + ) + fig.colorbar( + im, cax=make_axes_locatable(ax).append_axes("right", size="5%", pad=0.05) + ) + ax.set_title(f"FDTD Hy{title}") + + ax = axs[1, 2] + # vmin, vmax = -np.max(np.abs(solverFDTD.Hz[x, y, z])), np.max(np.abs(solverFDTD.Hz[x, y, z])) + im = ax.imshow( + solverFDTD.Hz[x, y, z], cmap="rainbow", vmin=vmin, vmax=vmax, extent=extent + ) + fig.colorbar( + im, cax=make_axes_locatable(ax).append_axes("right", size="5%", pad=0.05) + ) + ax.set_title(f"FDTD Hz{title}") + + fig.suptitle(f"H field, timestep={n}") + fig.savefig("imgH/" + str(n).zfill(4) + ".png") plt.clf() plt.close(fig) for n in tqdm(range(Nt)): - solverFIT.one_step() solverFDTD.one_step() plot_E_field(solverFIT, solverFDTD, n) plot_H_field(solverFIT, solverFDTD, n) -''' +""" for n in tqdm(range(Nt), 'FIT:'): solverFIT.one_step() @@ -179,5 +212,4 @@ def plot_H_field(solverFIT, solverFDTD, n): for n in tqdm(range(Nt), 'FDTD:'): solverFDTD.one_step() -''' - +""" diff --git a/examples/fit/script_cube_resonator_fit.py b/examples/fit/script_cube_resonator_fit.py index 0ad8e8f..d94aaf2 100644 --- a/examples/fit/script_cube_resonator_fit.py +++ b/examples/fit/script_cube_resonator_fit.py @@ -1,62 +1,97 @@ import numpy as np from scipy.constants import c as c_light, epsilon_0 as eps_0, mu_0 as mu_0 -import matplotlib + # matplotlib.use('Agg') from matplotlib import pyplot as plt -from matplotlib import patches -import os, sys + from tqdm import tqdm from mpl_toolkits.axes_grid1 import make_axes_locatable -sys.path.append('../') - from solverFIT3D import SolverFIT3D from solver3D import EMSolver3D from grid3D import Grid3D -from conductors3d import noConductor, InCube, ConductorsAssembly -from scipy.special import jv -from field import Field +from conductors3d import InCube, ConductorsAssembly -#----- Funtions -----# +# ----- Funtions -----# m = 1 n = 0 p = 1 -theta = 0 #np.pi/8 +theta = 0 # np.pi/8 # Analytic solution of cubic resonator # Ref: http://faculty.pccu.edu.tw/~meng/new%20EM6.pdf pp.20/24 + def analytic_sol_Hz(x, y, z, t): - Rm = np.array([[np.cos(-theta), - np.sin(-theta), 0],[np.sin(-theta), np.cos(-theta), 0], [0, 0, 1]]) + Rm = np.array( + [ + [np.cos(-theta), -np.sin(-theta), 0], + [np.sin(-theta), np.cos(-theta), 0], + [0, 0, 1], + ] + ) [x_0, y_0, z_0] = np.dot(Rm, np.array([x, y, z])) - return np.cos(m * np.pi / Lx * (x_0 - Lx/2)) * np.cos(n * np.pi / Ly * (y_0 - Ly/2)) * np.sin( - p * np.pi / Lz * (z_0 - Lz/2)) * np.cos(np.sqrt(2) * np.pi / Lx * c_light * t) + return ( + np.cos(m * np.pi / Lx * (x_0 - Lx / 2)) + * np.cos(n * np.pi / Ly * (y_0 - Ly / 2)) + * np.sin(p * np.pi / Lz * (z_0 - Lz / 2)) + * np.cos(np.sqrt(2) * np.pi / Lx * c_light * t) + ) + def analytic_sol_Hy(x, y, z, t): - Rm = np.array([[np.cos(-theta), - np.sin(-theta), 0],[np.sin(-theta), np.cos(-theta), 0], [0, 0, 1]]) + Rm = np.array( + [ + [np.cos(-theta), -np.sin(-theta), 0], + [np.sin(-theta), np.cos(-theta), 0], + [0, 0, 1], + ] + ) [x_0, y_0, z_0] = np.dot(Rm, np.array([x, y, z])) h_2 = (m * np.pi / Lx) ** 2 + (n * np.pi / Ly) ** 2 + (p * np.pi / Lz) ** 2 - return -2 / h_2 * (n * np.pi / Ly) * (p * np.pi / Lz) * np.cos(m * np.pi / Lx * (x_0 - Lx/2)) * np.sin( - n * np.pi / Ly * (y_0 - Ly/2)) * np.cos(p * np.pi / Lz * (z_0 - Lz/2)) * np.cos( - np.sqrt(2) * np.pi / Lx * c_light * t) + return ( + -2 + / h_2 + * (n * np.pi / Ly) + * (p * np.pi / Lz) + * np.cos(m * np.pi / Lx * (x_0 - Lx / 2)) + * np.sin(n * np.pi / Ly * (y_0 - Ly / 2)) + * np.cos(p * np.pi / Lz * (z_0 - Lz / 2)) + * np.cos(np.sqrt(2) * np.pi / Lx * c_light * t) + ) + def analytic_sol_Hx(x, y, z, t): - Rm = np.array([[np.cos(-theta), - np.sin(-theta), 0],[np.sin(-theta), np.cos(-theta), 0], [0, 0, 1]]) + Rm = np.array( + [ + [np.cos(-theta), -np.sin(-theta), 0], + [np.sin(-theta), np.cos(-theta), 0], + [0, 0, 1], + ] + ) [x_0, y_0, z_0] = np.dot(Rm, np.array([x, y, z])) h_2 = (m * np.pi / Lx) ** 2 + (n * np.pi / Ly) ** 2 + (p * np.pi / Lz) ** 2 - return -2 / h_2 * (m * np.pi / Lx) * (p * np.pi / Lz) * np.sin(m * np.pi / Lx * (x_0 - Lx/2)) * np.cos( - n * np.pi / Ly * (y_0 - Ly/2)) * np.cos(p * np.pi / Lz * (z_0 - Lz/2)) * np.cos( - np.sqrt(2) * np.pi / Lx * c_light * t) + return ( + -2 + / h_2 + * (m * np.pi / Lx) + * (p * np.pi / Lz) + * np.sin(m * np.pi / Lx * (x_0 - Lx / 2)) + * np.cos(n * np.pi / Ly * (y_0 - Ly / 2)) + * np.cos(p * np.pi / Lz * (z_0 - Lz / 2)) + * np.cos(np.sqrt(2) * np.pi / Lx * c_light * t) + ) + -#---- Domain definition ----# +# ---- Domain definition ----# Z0 = np.sqrt(mu_0 / eps_0) -L = 1. # Domain length -N = 30 # Number of mesh cells +L = 1.0 # Domain length +N = 30 # Number of mesh cells Nx = N Ny = N @@ -68,315 +103,393 @@ def analytic_sol_Hx(x, y, z, t): dy = L / Ny dz = L / Nz -xmin = -Lx/2 -xmax = Lx/2 -ymin = - Ly/2 -ymax = Ly/2 -zmin = - Lz/2 -zmax = Lz/2 - -#Embedded cube -lx = Lx*0.7 -ly = Ly*0.7 -lz = Lz*0.7 +xmin = -Lx / 2 +xmax = Lx / 2 +ymin = -Ly / 2 +ymax = Ly / 2 +zmin = -Lz / 2 +zmax = Lz / 2 + +# Embedded cube +lx = Lx * 0.7 +ly = Ly * 0.7 +lz = Lz * 0.7 x_cent = 0 y_cent = 0 z_cent = 0 -cube = InCube(lx, ly, lz, x_cent, y_cent, z_cent) #noConductor() +cube = InCube(lx, ly, lz, x_cent, y_cent, z_cent) # noConductor() conductors = ConductorsAssembly([cube]) -#conductors = noConductor() +# conductors = noConductor() -bc_low=['pec', 'pec', 'pec'] -bc_high=['pec', 'pec', 'pec'] +bc_low = ["pec", "pec", "pec"] +bc_high = ["pec", "pec", "pec"] -NCFL=1.0 -gridFIT = Grid3D(xmin, xmax, ymin, ymax, zmin, zmax, Nx, Ny, Nz, conductors, 'FIT') +NCFL = 1.0 +gridFIT = Grid3D(xmin, xmax, ymin, ymax, zmin, zmax, Nx, Ny, Nz, conductors, "FIT") solverFIT = SolverFIT3D(gridFIT, NCFL, bc_low=bc_low, bc_high=bc_high) -gridFDTD = Grid3D(xmin, xmax, ymin, ymax, zmin, zmax, Nx, Ny, Nz, conductors, 'FDTD') -solverFDTD = EMSolver3D(gridFDTD, 'FDTD', NCFL) +gridFDTD = Grid3D(xmin, xmax, ymin, ymax, zmin, zmax, Nx, Ny, Nz, conductors, "FDTD") +solverFDTD = EMSolver3D(gridFDTD, "FDTD", NCFL) # Plotting functions -folder ='imgRes' -plane = 'XY' +folder = "imgRes" +plane = "XY" -if plane == 'XY': - xx, yy, zz = slice(0,Nx), slice(0,Ny), int(Nz//2) #plane XY - title = '(x,y,Nz/2)' - xax, yax = 'y', 'x' +if plane == "XY": + xx, yy, zz = slice(0, Nx), slice(0, Ny), int(Nz // 2) # plane XY + title = "(x,y,Nz/2)" + xax, yax = "y", "x" -if plane == 'YZ': - xx, yy, zz = int(Nx//2), slice(0,Ny), slice(0,Nz) #plane YZ - title = '(Nx/2,y,z)' - xax, yax = 'z', 'y' +if plane == "YZ": + xx, yy, zz = int(Nx // 2), slice(0, Ny), slice(0, Nz) # plane YZ + title = "(Nx/2,y,z)" + xax, yax = "z", "y" def plot_E_field(solverFIT, solverFDTD, n): - - fig, axs = plt.subplots(2,3, tight_layout=True, figsize=[8,6]) - dims = {0:'x', 1:'y', 2:'z'} + fig, axs = plt.subplots(2, 3, tight_layout=True, figsize=[8, 6]) + dims = {0: "x", 1: "y", 2: "z"} lims = {0: 500, 1: 500, 2: 500} - #FIT - for i, ax in enumerate(axs[0,:]): + # FIT + for i, ax in enumerate(axs[0, :]): vmin, vmax = -lims[i], lims[i] - #vmin, vmax = -np.max(np.abs(solverFIT.E[:,:,int(Nz/2), dims[i]])), np.max(np.abs(solverFIT.E[:,:,int(Nz/2), dims[i]])) - im = ax.imshow(solverFIT.E[xx, yy, zz, dims[i]], cmap='rainbow', vmin=vmin, vmax=vmax) - fig.colorbar(im, cax=make_axes_locatable(ax).append_axes('right', size='5%', pad=0.05)) - ax.set_title(f'FIT E{dims[i]}(x,y,Nz/2)') - - #FDTD - ax = axs[1,0] + # vmin, vmax = -np.max(np.abs(solverFIT.E[:,:,int(Nz/2), dims[i]])), np.max(np.abs(solverFIT.E[:,:,int(Nz/2), dims[i]])) + im = ax.imshow( + solverFIT.E[xx, yy, zz, dims[i]], cmap="rainbow", vmin=vmin, vmax=vmax + ) + fig.colorbar( + im, cax=make_axes_locatable(ax).append_axes("right", size="5%", pad=0.05) + ) + ax.set_title(f"FIT E{dims[i]}(x,y,Nz/2)") + + # FDTD + ax = axs[1, 0] vmin, vmax = -lims[0], lims[0] - #vmin, vmax = -np.max(np.abs(solverFDTD.Ex[xx, yy, zz])), np.max(np.abs(solverFDTD.Ex[xx, yy, zz])) - im = ax.imshow(solverFDTD.Ex[xx, yy, zz], cmap='rainbow', vmin=vmin, vmax=vmax) - fig.colorbar(im, cax=make_axes_locatable(ax).append_axes('right', size='5%', pad=0.05)) - ax.set_title(f'FDTD Ex(x,y,Nz/2)') - - ax = axs[1,1] + # vmin, vmax = -np.max(np.abs(solverFDTD.Ex[xx, yy, zz])), np.max(np.abs(solverFDTD.Ex[xx, yy, zz])) + im = ax.imshow(solverFDTD.Ex[xx, yy, zz], cmap="rainbow", vmin=vmin, vmax=vmax) + fig.colorbar( + im, cax=make_axes_locatable(ax).append_axes("right", size="5%", pad=0.05) + ) + ax.set_title("FDTD Ex(x,y,Nz/2)") + + ax = axs[1, 1] vmin, vmax = -lims[1], lims[1] - #vmin, vmax = -np.max(np.abs(solverFDTD.Ey[xx, yy, zz])), np.max(np.abs(solverFDTD.Ey[xx, yy, zz])) - im = ax.imshow(solverFDTD.Ey[xx, yy, zz], cmap='rainbow', vmin=vmin, vmax=vmax) - fig.colorbar(im, cax=make_axes_locatable(ax).append_axes('right', size='5%', pad=0.05)) - ax.set_title(f'FDTD Ey(x,y,Nz/2)') - - ax = axs[1,2] + # vmin, vmax = -np.max(np.abs(solverFDTD.Ey[xx, yy, zz])), np.max(np.abs(solverFDTD.Ey[xx, yy, zz])) + im = ax.imshow(solverFDTD.Ey[xx, yy, zz], cmap="rainbow", vmin=vmin, vmax=vmax) + fig.colorbar( + im, cax=make_axes_locatable(ax).append_axes("right", size="5%", pad=0.05) + ) + ax.set_title("FDTD Ey(x,y,Nz/2)") + + ax = axs[1, 2] vmin, vmax = -lims[2], lims[2] - #vmin, vmax = -np.max(np.abs(solverFDTD.Ez[xx, yy, zz])), np.max(np.abs(solverFDTD.Ez[xx, yy, zz])) - im = ax.imshow(solverFDTD.Ez[xx, yy, zz], cmap='rainbow', vmin=vmin, vmax=vmax) - fig.colorbar(im, cax=make_axes_locatable(ax).append_axes('right', size='5%', pad=0.05)) - ax.set_title(f'FDTD Ez(x,y,Nz/2)') - - fig.suptitle(f'E field, timestep={n}') - fig.savefig(f'{folder}E/'+str(n).zfill(4)+'.png') + # vmin, vmax = -np.max(np.abs(solverFDTD.Ez[xx, yy, zz])), np.max(np.abs(solverFDTD.Ez[xx, yy, zz])) + im = ax.imshow(solverFDTD.Ez[xx, yy, zz], cmap="rainbow", vmin=vmin, vmax=vmax) + fig.colorbar( + im, cax=make_axes_locatable(ax).append_axes("right", size="5%", pad=0.05) + ) + ax.set_title("FDTD Ez(x,y,Nz/2)") + + fig.suptitle(f"E field, timestep={n}") + fig.savefig(f"{folder}E/" + str(n).zfill(4) + ".png") plt.clf() plt.close(fig) -def plot_H_field(solverFIT, solverFDTD, n): - fig, axs = plt.subplots(2,3, tight_layout=True, figsize=[8,6]) - dims = {0:'x', 1:'y', 2:'z'} +def plot_H_field(solverFIT, solverFDTD, n): + fig, axs = plt.subplots(2, 3, tight_layout=True, figsize=[8, 6]) + dims = {0: "x", 1: "y", 2: "z"} lims = {0: 0.05, 1: 0.05, 2: 1} - #FIT - for i, ax in enumerate(axs[0,:]): + # FIT + for i, ax in enumerate(axs[0, :]): vmin, vmax = -lims[i], lims[i] - #vmin, vmax = -np.max(np.abs(solverFIT.H[xx, yy, zz, dims[i]])), np.max(np.abs(solverFIT.H[xx, yy, zz, dims[i]])) - im = ax.imshow(solverFIT.H[xx, yy, zz, dims[i]], cmap='rainbow', vmin=vmin, vmax=vmax) - fig.colorbar(im, cax=make_axes_locatable(ax).append_axes('right', size='5%', pad=0.05)) - ax.set_title(f'FIT H{dims[i]}(x,y,Nz/2)') - - #FDTD - ax = axs[1,0] + # vmin, vmax = -np.max(np.abs(solverFIT.H[xx, yy, zz, dims[i]])), np.max(np.abs(solverFIT.H[xx, yy, zz, dims[i]])) + im = ax.imshow( + solverFIT.H[xx, yy, zz, dims[i]], cmap="rainbow", vmin=vmin, vmax=vmax + ) + fig.colorbar( + im, cax=make_axes_locatable(ax).append_axes("right", size="5%", pad=0.05) + ) + ax.set_title(f"FIT H{dims[i]}(x,y,Nz/2)") + + # FDTD + ax = axs[1, 0] vmin, vmax = -lims[0], lims[0] - #vmin, vmax = -np.max(np.abs(solverFDTD.Hx[xx, yy, zz])), np.max(np.abs(solverFDTD.Hx[xx, yy, zz])) - im = ax.imshow(solverFDTD.Hx[xx, yy, zz], cmap='rainbow', vmin=vmin, vmax=vmax) - fig.colorbar(im, cax=make_axes_locatable(ax).append_axes('right', size='5%', pad=0.05)) - ax.set_title(f'FDTD Hx(x,y,Nz/2)') - - ax = axs[1,1] + # vmin, vmax = -np.max(np.abs(solverFDTD.Hx[xx, yy, zz])), np.max(np.abs(solverFDTD.Hx[xx, yy, zz])) + im = ax.imshow(solverFDTD.Hx[xx, yy, zz], cmap="rainbow", vmin=vmin, vmax=vmax) + fig.colorbar( + im, cax=make_axes_locatable(ax).append_axes("right", size="5%", pad=0.05) + ) + ax.set_title("FDTD Hx(x,y,Nz/2)") + + ax = axs[1, 1] vmin, vmax = -lims[1], lims[1] - #vmin, vmax = -np.max(np.abs(solverFDTD.Hy[:,:,int(Nz/2)])), np.max(np.abs(solverFDTD.Hy[:,:,int(Nz/2)])) - im = ax.imshow(solverFDTD.Hy[:,:,int(Nz/2)], cmap='rainbow', vmin=vmin, vmax=vmax) - fig.colorbar(im, cax=make_axes_locatable(ax).append_axes('right', size='5%', pad=0.05)) - ax.set_title(f'FDTD Hy(x,y,Nz/2)') - - ax = axs[1,2] + # vmin, vmax = -np.max(np.abs(solverFDTD.Hy[:,:,int(Nz/2)])), np.max(np.abs(solverFDTD.Hy[:,:,int(Nz/2)])) + im = ax.imshow( + solverFDTD.Hy[:, :, int(Nz / 2)], cmap="rainbow", vmin=vmin, vmax=vmax + ) + fig.colorbar( + im, cax=make_axes_locatable(ax).append_axes("right", size="5%", pad=0.05) + ) + ax.set_title("FDTD Hy(x,y,Nz/2)") + + ax = axs[1, 2] vmin, vmax = -lims[2], lims[2] - #vmin, vmax = -np.max(np.abs(solverFDTD.Hz[:,:,int(Nz/2)])), np.max(np.abs(solverFDTD.Hz[:,:,int(Nz/2)])) - im = ax.imshow(solverFDTD.Hz[:,:,int(Nz/2)], cmap='rainbow', vmin=vmin, vmax=vmax) - fig.colorbar(im, cax=make_axes_locatable(ax).append_axes('right', size='5%', pad=0.05)) - ax.set_title(f'FDTD Hz(x,y,Nz/2)') - - fig.suptitle(f'H field, timestep={n}') - fig.savefig(f'{folder}H/'+str(n).zfill(4)+'.png') + # vmin, vmax = -np.max(np.abs(solverFDTD.Hz[:,:,int(Nz/2)])), np.max(np.abs(solverFDTD.Hz[:,:,int(Nz/2)])) + im = ax.imshow( + solverFDTD.Hz[:, :, int(Nz / 2)], cmap="rainbow", vmin=vmin, vmax=vmax + ) + fig.colorbar( + im, cax=make_axes_locatable(ax).append_axes("right", size="5%", pad=0.05) + ) + ax.set_title("FDTD Hz(x,y,Nz/2)") + + fig.suptitle(f"H field, timestep={n}") + fig.savefig(f"{folder}H/" + str(n).zfill(4) + ".png") plt.clf() plt.close(fig) -#---- Initial conditions -----# +# ---- Initial conditions -----# for ii in range(Nx): for jj in range(Ny): for kk in range(Nz): - if gridFDTD.flag_int_cell_xy[ii, jj, kk]: x = (ii) * dx + xmin y = (jj) * dy + ymin z = kk * dz + zmin - solverFDTD.Hz[ii, jj, kk] = analytic_sol_Hz(x, y, z, -0.5 * solverFDTD.dt) + solverFDTD.Hz[ii, jj, kk] = analytic_sol_Hz( + x, y, z, -0.5 * solverFDTD.dt + ) x = ii * dx + xmin y = jj * dy + ymin z = kk * dz + zmin - solverFIT.H[ii, jj, kk, 'z'] = analytic_sol_Hz(x, y, z, -0.5 * solverFDTD.dt) + solverFIT.H[ii, jj, kk, "z"] = analytic_sol_Hz( + x, y, z, -0.5 * solverFDTD.dt + ) if gridFDTD.flag_int_cell_zx[ii, jj, kk]: x = (ii) * dx + xmin y = jj * dy + ymin z = (kk) * dz + zmin - solverFDTD.Hy[ii, jj, kk] = analytic_sol_Hy(x, y, z, -0.5 * solverFDTD.dt) + solverFDTD.Hy[ii, jj, kk] = analytic_sol_Hy( + x, y, z, -0.5 * solverFDTD.dt + ) x = ii * dx + xmin y = jj * dy + ymin z = kk * dz + zmin - solverFIT.H[ii, jj, kk, 'y'] = analytic_sol_Hy(x, y, z, -0.5 * solverFIT.dt) + solverFIT.H[ii, jj, kk, "y"] = analytic_sol_Hy(x, y, z, -0.5 * solverFIT.dt) if gridFDTD.flag_int_cell_yz[ii, jj, kk]: - x = ii*dx + xmin - y = (jj)*dy + ymin - z = (kk)*dz + zmin - solverFDTD.Hx[ii, jj, kk] = analytic_sol_Hx(x, y, z, -0.5 * solverFDTD.dt) + x = ii * dx + xmin + y = (jj) * dy + ymin + z = (kk) * dz + zmin + solverFDTD.Hx[ii, jj, kk] = analytic_sol_Hx( + x, y, z, -0.5 * solverFDTD.dt + ) x = ii * dx + xmin y = jj * dy + ymin z = kk * dz + zmin - solverFIT.H[ii, jj, kk, 'x'] = analytic_sol_Hx(x, y, z, -0.5 * solverFIT.dt) + solverFIT.H[ii, jj, kk, "x"] = analytic_sol_Hx(x, y, z, -0.5 * solverFIT.dt) -#----- Time loop -----# +# ----- Time loop -----# Nt = 200 for nt in tqdm(range(Nt)): - solverFIT.one_step() solverFDTD.one_step() - if nt%2: + if nt % 2: plot_E_field(solverFIT, solverFDTD, nt) plot_H_field(solverFIT, solverFDTD, nt) -#----- Compare -----# +# ----- Compare -----# -analytic = EMSolver3D(gridFDTD, 'FDTD', NCFL) +analytic = EMSolver3D(gridFDTD, "FDTD", NCFL) for ii in range(Nx): for jj in range(Ny): for kk in range(Nz): - x = (ii) * dx + xmin y = (jj) * dy + ymin z = kk * dz + zmin - analytic.Hz[ii, jj, kk] = analytic_sol_Hz(x, y, z, (Nt-0.5) * analytic.dt) + analytic.Hz[ii, jj, kk] = analytic_sol_Hz(x, y, z, (Nt - 0.5) * analytic.dt) x = (ii) * dx + xmin y = jj * dy + ymin z = (kk) * dz + zmin - analytic.Hy[ii, jj, kk] = analytic_sol_Hy(x, y, z, (Nt-0.5) * analytic.dt) + analytic.Hy[ii, jj, kk] = analytic_sol_Hy(x, y, z, (Nt - 0.5) * analytic.dt) - x = ii*dx + xmin - y = (jj)*dy + ymin - z = (kk)*dz + zmin - analytic.Hx[ii, jj, kk] = analytic_sol_Hx(x, y, z, (Nt-0.5) * analytic.dt) + x = ii * dx + xmin + y = (jj) * dy + ymin + z = (kk) * dz + zmin + analytic.Hx[ii, jj, kk] = analytic_sol_Hx(x, y, z, (Nt - 0.5) * analytic.dt) # Plot fields -fig, axs = plt.subplots(3,3, tight_layout=True, figsize=[8,6]) -dims = {0:'x', 1:'y', 2:'z'} - -#FIT -for i, ax in enumerate(axs[0,:]): - vmin, vmax = -np.max(np.abs(solverFIT.H[:,:,int(Nz/2), dims[i]])), np.max(np.abs(solverFIT.H[:,:,int(Nz/2), dims[i]])) - im = ax.imshow(solverFIT.H[:,:,int(Nz/2), dims[i]], cmap='rainbow', vmin=vmin, vmax=vmax) - fig.colorbar(im, cax=make_axes_locatable(ax).append_axes('right', size='5%', pad=0.05)) - ax.set_title(f'FIT H{dims[i]}(x,y,Nz/2)') - -#FDTD -ax = axs[1,0] -vmin, vmax = -np.max(np.abs(solverFDTD.Hx[:,:,int(Nz/2)])), np.max(np.abs(solverFDTD.Hx[:,:,int(Nz/2)])) -im = ax.imshow(solverFDTD.Hx[:,:,int(Nz/2)], cmap='rainbow', vmin=vmin, vmax=vmax) -fig.colorbar(im, cax=make_axes_locatable(ax).append_axes('right', size='5%', pad=0.05)) -ax.set_title(f'FDTD Hx(x,y,Nz/2)') - -ax = axs[1,1] -vmin, vmax = -np.max(np.abs(solverFDTD.Hy[:,:,int(Nz/2)])), np.max(np.abs(solverFDTD.Hy[:,:,int(Nz/2)])) -im = ax.imshow(solverFDTD.Hy[:,:,int(Nz/2)], cmap='rainbow', vmin=vmin, vmax=vmax) -fig.colorbar(im, cax=make_axes_locatable(ax).append_axes('right', size='5%', pad=0.05)) -ax.set_title(f'FDTD Hy(x,y,Nz/2)') - -ax = axs[1,2] -vmin, vmax = -np.max(np.abs(solverFDTD.Hz[:,:,int(Nz/2)])), np.max(np.abs(solverFDTD.Hz[:,:,int(Nz/2)])) -im = ax.imshow(solverFDTD.Hz[:,:,int(Nz/2)], cmap='rainbow', vmin=vmin, vmax=vmax) -fig.colorbar(im, cax=make_axes_locatable(ax).append_axes('right', size='5%', pad=0.05)) -ax.set_title(f'FDTD Hz(x,y,Nz/2)') - -#Analytic -ax = axs[2,0] -vmin, vmax = -np.max(np.abs(analytic.Hx[:,:,int(Nz/2)])), np.max(np.abs(analytic.Hx[:,:,int(Nz/2)])) -im = ax.imshow(analytic.Hx[:,:,int(Nz/2)], cmap='rainbow', vmin=vmin, vmax=vmax) -fig.colorbar(im, cax=make_axes_locatable(ax).append_axes('right', size='5%', pad=0.05)) -ax.set_title(f'Analytic Hx(x,y,Nz/2)') - -ax = axs[2,1] -vmin, vmax = -np.max(np.abs(analytic.Hy[:,:,int(Nz/2)])), np.max(np.abs(analytic.Hy[:,:,int(Nz/2)])) -im = ax.imshow(analytic.Hy[:,:,int(Nz/2)], cmap='rainbow', vmin=vmin, vmax=vmax) -fig.colorbar(im, cax=make_axes_locatable(ax).append_axes('right', size='5%', pad=0.05)) -ax.set_title(f'Analytic Hy(x,y,Nz/2)') - -ax = axs[2,2] -vmin, vmax = -np.max(np.abs(analytic.Hz[:,:,int(Nz/2)])), np.max(np.abs(analytic.Hz[:,:,int(Nz/2)])) -im = ax.imshow(analytic.Hz[:,:,int(Nz/2)], cmap='rainbow', vmin=vmin, vmax=vmax) -fig.colorbar(im, cax=make_axes_locatable(ax).append_axes('right', size='5%', pad=0.05)) -ax.set_title(f'Analytic Hz(x,y,Nz/2)') - -fig.suptitle(f'H field, timestep={Nt}') -fig.savefig('analyticXY.png') +fig, axs = plt.subplots(3, 3, tight_layout=True, figsize=[8, 6]) +dims = {0: "x", 1: "y", 2: "z"} + +# FIT +for i, ax in enumerate(axs[0, :]): + vmin, vmax = ( + -np.max(np.abs(solverFIT.H[:, :, int(Nz / 2), dims[i]])), + np.max(np.abs(solverFIT.H[:, :, int(Nz / 2), dims[i]])), + ) + im = ax.imshow( + solverFIT.H[:, :, int(Nz / 2), dims[i]], cmap="rainbow", vmin=vmin, vmax=vmax + ) + fig.colorbar( + im, cax=make_axes_locatable(ax).append_axes("right", size="5%", pad=0.05) + ) + ax.set_title(f"FIT H{dims[i]}(x,y,Nz/2)") + +# FDTD +ax = axs[1, 0] +vmin, vmax = ( + -np.max(np.abs(solverFDTD.Hx[:, :, int(Nz / 2)])), + np.max(np.abs(solverFDTD.Hx[:, :, int(Nz / 2)])), +) +im = ax.imshow(solverFDTD.Hx[:, :, int(Nz / 2)], cmap="rainbow", vmin=vmin, vmax=vmax) +fig.colorbar(im, cax=make_axes_locatable(ax).append_axes("right", size="5%", pad=0.05)) +ax.set_title("FDTD Hx(x,y,Nz/2)") + +ax = axs[1, 1] +vmin, vmax = ( + -np.max(np.abs(solverFDTD.Hy[:, :, int(Nz / 2)])), + np.max(np.abs(solverFDTD.Hy[:, :, int(Nz / 2)])), +) +im = ax.imshow(solverFDTD.Hy[:, :, int(Nz / 2)], cmap="rainbow", vmin=vmin, vmax=vmax) +fig.colorbar(im, cax=make_axes_locatable(ax).append_axes("right", size="5%", pad=0.05)) +ax.set_title("FDTD Hy(x,y,Nz/2)") + +ax = axs[1, 2] +vmin, vmax = ( + -np.max(np.abs(solverFDTD.Hz[:, :, int(Nz / 2)])), + np.max(np.abs(solverFDTD.Hz[:, :, int(Nz / 2)])), +) +im = ax.imshow(solverFDTD.Hz[:, :, int(Nz / 2)], cmap="rainbow", vmin=vmin, vmax=vmax) +fig.colorbar(im, cax=make_axes_locatable(ax).append_axes("right", size="5%", pad=0.05)) +ax.set_title("FDTD Hz(x,y,Nz/2)") + +# Analytic +ax = axs[2, 0] +vmin, vmax = ( + -np.max(np.abs(analytic.Hx[:, :, int(Nz / 2)])), + np.max(np.abs(analytic.Hx[:, :, int(Nz / 2)])), +) +im = ax.imshow(analytic.Hx[:, :, int(Nz / 2)], cmap="rainbow", vmin=vmin, vmax=vmax) +fig.colorbar(im, cax=make_axes_locatable(ax).append_axes("right", size="5%", pad=0.05)) +ax.set_title("Analytic Hx(x,y,Nz/2)") + +ax = axs[2, 1] +vmin, vmax = ( + -np.max(np.abs(analytic.Hy[:, :, int(Nz / 2)])), + np.max(np.abs(analytic.Hy[:, :, int(Nz / 2)])), +) +im = ax.imshow(analytic.Hy[:, :, int(Nz / 2)], cmap="rainbow", vmin=vmin, vmax=vmax) +fig.colorbar(im, cax=make_axes_locatable(ax).append_axes("right", size="5%", pad=0.05)) +ax.set_title("Analytic Hy(x,y,Nz/2)") + +ax = axs[2, 2] +vmin, vmax = ( + -np.max(np.abs(analytic.Hz[:, :, int(Nz / 2)])), + np.max(np.abs(analytic.Hz[:, :, int(Nz / 2)])), +) +im = ax.imshow(analytic.Hz[:, :, int(Nz / 2)], cmap="rainbow", vmin=vmin, vmax=vmax) +fig.colorbar(im, cax=make_axes_locatable(ax).append_axes("right", size="5%", pad=0.05)) +ax.set_title("Analytic Hz(x,y,Nz/2)") + +fig.suptitle(f"H field, timestep={Nt}") +fig.savefig("analyticXY.png") plt.clf() plt.close(fig) # Plot fields -fig, axs = plt.subplots(3,3, tight_layout=True, figsize=[8,6]) -dims = {0:'x', 1:'y', 2:'z'} - -#FIT -for i, ax in enumerate(axs[0,:]): - vmin, vmax = -np.max(np.abs(solverFIT.H[int(Nx/2),:,:, dims[i]])), np.max(np.abs(solverFIT.H[int(Nx/2),:,:, dims[i]])) - im = ax.imshow(solverFIT.H[int(Nx/2),:,:, dims[i]], cmap='rainbow', vmin=vmin, vmax=vmax) - fig.colorbar(im, cax=make_axes_locatable(ax).append_axes('right', size='5%', pad=0.05)) - ax.set_title(f'FIT H{dims[i]}(Nx/2,y,z)') - -#FDTD -ax = axs[1,0] -vmin, vmax = -np.max(np.abs(solverFDTD.Hx[int(Nx/2),:,:])), np.max(np.abs(solverFDTD.Hx[int(Nx/2),:,:])) -im = ax.imshow(solverFDTD.Hx[int(Nx/2),:,:], cmap='rainbow', vmin=vmin, vmax=vmax) -fig.colorbar(im, cax=make_axes_locatable(ax).append_axes('right', size='5%', pad=0.05)) -ax.set_title(f'FDTD Hx(Nx/2,y,z)') - -ax = axs[1,1] -vmin, vmax = -np.max(np.abs(solverFDTD.Hy[int(Nx/2),:,:])), np.max(np.abs(solverFDTD.Hy[int(Nx/2),:,:])) -im = ax.imshow(solverFDTD.Hy[int(Nx/2),:,:], cmap='rainbow', vmin=vmin, vmax=vmax) -fig.colorbar(im, cax=make_axes_locatable(ax).append_axes('right', size='5%', pad=0.05)) -ax.set_title(f'FDTD Hy(Nx/2,y,z)') - -ax = axs[1,2] -vmin, vmax = -np.max(np.abs(solverFDTD.Hz[int(Nx/2),:,:])), np.max(np.abs(solverFDTD.Hz[int(Nx/2),:,:])) -im = ax.imshow(solverFDTD.Hz[int(Nx/2),:,:], cmap='rainbow', vmin=vmin, vmax=vmax) -fig.colorbar(im, cax=make_axes_locatable(ax).append_axes('right', size='5%', pad=0.05)) -ax.set_title(f'FDTD Hz(Nx/2,y,z)') - -#Analytic -ax = axs[2,0] -vmin, vmax = -np.max(np.abs(analytic.Hx[int(Nx/2),:,:])), np.max(np.abs(analytic.Hx[int(Nx/2),:,:])) -im = ax.imshow(analytic.Hx[int(Nx/2),:,:], cmap='rainbow', vmin=vmin, vmax=vmax) -fig.colorbar(im, cax=make_axes_locatable(ax).append_axes('right', size='5%', pad=0.05)) -ax.set_title(f'Analytic Hx(Nx/2,y,z)') - -ax = axs[2,1] -vmin, vmax = -np.max(np.abs(analytic.Hy[int(Nx/2),:,:])), np.max(np.abs(analytic.Hy[int(Nx/2),:,:])) -im = ax.imshow(analytic.Hy[int(Nx/2),:,:], cmap='rainbow', vmin=vmin, vmax=vmax) -fig.colorbar(im, cax=make_axes_locatable(ax).append_axes('right', size='5%', pad=0.05)) -ax.set_title(f'Analytic Hy(Nx/2,y,z)') - -ax = axs[2,2] -vmin, vmax = -np.max(np.abs(analytic.Hz[int(Nx/2),:,:])), np.max(np.abs(analytic.Hz[int(Nx/2),:,:])) -im = ax.imshow(analytic.Hz[int(Nx/2),:,:], cmap='rainbow', vmin=vmin, vmax=vmax) -fig.colorbar(im, cax=make_axes_locatable(ax).append_axes('right', size='5%', pad=0.05)) -ax.set_title(f'Analytic Hz(Nx/2,y,z)') - -fig.suptitle(f'H field, timestep={Nt}') -fig.savefig('analyticYZ.png') +fig, axs = plt.subplots(3, 3, tight_layout=True, figsize=[8, 6]) +dims = {0: "x", 1: "y", 2: "z"} + +# FIT +for i, ax in enumerate(axs[0, :]): + vmin, vmax = ( + -np.max(np.abs(solverFIT.H[int(Nx / 2), :, :, dims[i]])), + np.max(np.abs(solverFIT.H[int(Nx / 2), :, :, dims[i]])), + ) + im = ax.imshow( + solverFIT.H[int(Nx / 2), :, :, dims[i]], cmap="rainbow", vmin=vmin, vmax=vmax + ) + fig.colorbar( + im, cax=make_axes_locatable(ax).append_axes("right", size="5%", pad=0.05) + ) + ax.set_title(f"FIT H{dims[i]}(Nx/2,y,z)") + +# FDTD +ax = axs[1, 0] +vmin, vmax = ( + -np.max(np.abs(solverFDTD.Hx[int(Nx / 2), :, :])), + np.max(np.abs(solverFDTD.Hx[int(Nx / 2), :, :])), +) +im = ax.imshow(solverFDTD.Hx[int(Nx / 2), :, :], cmap="rainbow", vmin=vmin, vmax=vmax) +fig.colorbar(im, cax=make_axes_locatable(ax).append_axes("right", size="5%", pad=0.05)) +ax.set_title("FDTD Hx(Nx/2,y,z)") + +ax = axs[1, 1] +vmin, vmax = ( + -np.max(np.abs(solverFDTD.Hy[int(Nx / 2), :, :])), + np.max(np.abs(solverFDTD.Hy[int(Nx / 2), :, :])), +) +im = ax.imshow(solverFDTD.Hy[int(Nx / 2), :, :], cmap="rainbow", vmin=vmin, vmax=vmax) +fig.colorbar(im, cax=make_axes_locatable(ax).append_axes("right", size="5%", pad=0.05)) +ax.set_title("FDTD Hy(Nx/2,y,z)") + +ax = axs[1, 2] +vmin, vmax = ( + -np.max(np.abs(solverFDTD.Hz[int(Nx / 2), :, :])), + np.max(np.abs(solverFDTD.Hz[int(Nx / 2), :, :])), +) +im = ax.imshow(solverFDTD.Hz[int(Nx / 2), :, :], cmap="rainbow", vmin=vmin, vmax=vmax) +fig.colorbar(im, cax=make_axes_locatable(ax).append_axes("right", size="5%", pad=0.05)) +ax.set_title("FDTD Hz(Nx/2,y,z)") + +# Analytic +ax = axs[2, 0] +vmin, vmax = ( + -np.max(np.abs(analytic.Hx[int(Nx / 2), :, :])), + np.max(np.abs(analytic.Hx[int(Nx / 2), :, :])), +) +im = ax.imshow(analytic.Hx[int(Nx / 2), :, :], cmap="rainbow", vmin=vmin, vmax=vmax) +fig.colorbar(im, cax=make_axes_locatable(ax).append_axes("right", size="5%", pad=0.05)) +ax.set_title("Analytic Hx(Nx/2,y,z)") + +ax = axs[2, 1] +vmin, vmax = ( + -np.max(np.abs(analytic.Hy[int(Nx / 2), :, :])), + np.max(np.abs(analytic.Hy[int(Nx / 2), :, :])), +) +im = ax.imshow(analytic.Hy[int(Nx / 2), :, :], cmap="rainbow", vmin=vmin, vmax=vmax) +fig.colorbar(im, cax=make_axes_locatable(ax).append_axes("right", size="5%", pad=0.05)) +ax.set_title("Analytic Hy(Nx/2,y,z)") + +ax = axs[2, 2] +vmin, vmax = ( + -np.max(np.abs(analytic.Hz[int(Nx / 2), :, :])), + np.max(np.abs(analytic.Hz[int(Nx / 2), :, :])), +) +im = ax.imshow(analytic.Hz[int(Nx / 2), :, :], cmap="rainbow", vmin=vmin, vmax=vmax) +fig.colorbar(im, cax=make_axes_locatable(ax).append_axes("right", size="5%", pad=0.05)) +ax.set_title("Analytic Hz(Nx/2,y,z)") + +fig.suptitle(f"H field, timestep={Nt}") +fig.savefig("analyticYZ.png") plt.clf() plt.close(fig) #!convert -delay 10 -loop 0 imgResH/*.png imgResH/H_ResCube.gif #!convert -delay 10 -loop 0 imgResE/*.png imgResE/E_ResCube.gif #!rm imgResH/*.png -#!rm imgResE/*.png \ No newline at end of file +#!rm imgResE/*.png diff --git a/examples/fit/script_cubestl_resonator_fit.py b/examples/fit/script_cubestl_resonator_fit.py index d2cb959..b56448c 100644 --- a/examples/fit/script_cubestl_resonator_fit.py +++ b/examples/fit/script_cubestl_resonator_fit.py @@ -1,52 +1,89 @@ import numpy as np import matplotlib.pyplot as plt -import os, sys import pyvista as pv from tqdm import tqdm from mpl_toolkits.axes_grid1 import make_axes_locatable from scipy.constants import c as c_light -sys.path.append('../') from solverFIT3D import SolverFIT3D -from gridFIT3D import GridFIT3D -from field import Field +from gridFIT3D import GridFIT3D -#----- Funtions -----# +# ----- Funtions -----# m = 1 n = 0 p = 1 -theta = 0 #np.pi/8 +theta = 0 # np.pi/8 # Analytic solution of cubic resonator # Ref: http://faculty.pccu.edu.tw/~meng/new%20EM6.pdf pp.20/24 + def analytic_sol_Hz(x, y, z, t): - Rm = np.array([[np.cos(-theta), - np.sin(-theta), 0],[np.sin(-theta), np.cos(-theta), 0], [0, 0, 1]]) + Rm = np.array( + [ + [np.cos(-theta), -np.sin(-theta), 0], + [np.sin(-theta), np.cos(-theta), 0], + [0, 0, 1], + ] + ) [x_0, y_0, z_0] = np.dot(Rm, np.array([x, y, z])) - return np.cos(m * np.pi / Lx * (x_0 - Lx/2)) * np.cos(n * np.pi / Ly * (y_0 - Ly/2)) * np.sin( - p * np.pi / Lz * (z_0 - Lz/2)) * np.cos(np.sqrt(2) * np.pi / Lx * c_light * t) + return ( + np.cos(m * np.pi / Lx * (x_0 - Lx / 2)) + * np.cos(n * np.pi / Ly * (y_0 - Ly / 2)) + * np.sin(p * np.pi / Lz * (z_0 - Lz / 2)) + * np.cos(np.sqrt(2) * np.pi / Lx * c_light * t) + ) + def analytic_sol_Hy(x, y, z, t): - Rm = np.array([[np.cos(-theta), - np.sin(-theta), 0],[np.sin(-theta), np.cos(-theta), 0], [0, 0, 1]]) + Rm = np.array( + [ + [np.cos(-theta), -np.sin(-theta), 0], + [np.sin(-theta), np.cos(-theta), 0], + [0, 0, 1], + ] + ) [x_0, y_0, z_0] = np.dot(Rm, np.array([x, y, z])) h_2 = (m * np.pi / Lx) ** 2 + (n * np.pi / Ly) ** 2 + (p * np.pi / Lz) ** 2 - return -2 / h_2 * (n * np.pi / Ly) * (p * np.pi / Lz) * np.cos(m * np.pi / Lx * (x_0 - Lx/2)) * np.sin( - n * np.pi / Ly * (y_0 - Ly/2)) * np.cos(p * np.pi / Lz * (z_0 - Lz/2)) * np.cos( - np.sqrt(2) * np.pi / Lx * c_light * t) + return ( + -2 + / h_2 + * (n * np.pi / Ly) + * (p * np.pi / Lz) + * np.cos(m * np.pi / Lx * (x_0 - Lx / 2)) + * np.sin(n * np.pi / Ly * (y_0 - Ly / 2)) + * np.cos(p * np.pi / Lz * (z_0 - Lz / 2)) + * np.cos(np.sqrt(2) * np.pi / Lx * c_light * t) + ) + def analytic_sol_Hx(x, y, z, t): - Rm = np.array([[np.cos(-theta), - np.sin(-theta), 0],[np.sin(-theta), np.cos(-theta), 0], [0, 0, 1]]) + Rm = np.array( + [ + [np.cos(-theta), -np.sin(-theta), 0], + [np.sin(-theta), np.cos(-theta), 0], + [0, 0, 1], + ] + ) [x_0, y_0, z_0] = np.dot(Rm, np.array([x, y, z])) h_2 = (m * np.pi / Lx) ** 2 + (n * np.pi / Ly) ** 2 + (p * np.pi / Lz) ** 2 - return -2 / h_2 * (m * np.pi / Lx) * (p * np.pi / Lz) * np.sin(m * np.pi / Lx * (x_0 - Lx/2)) * np.cos( - n * np.pi / Ly * (y_0 - Ly/2)) * np.cos(p * np.pi / Lz * (z_0 - Lz/2)) * np.cos( - np.sqrt(2) * np.pi / Lx * c_light * t) + return ( + -2 + / h_2 + * (m * np.pi / Lx) + * (p * np.pi / Lz) + * np.sin(m * np.pi / Lx * (x_0 - Lx / 2)) + * np.cos(n * np.pi / Ly * (y_0 - Ly / 2)) + * np.cos(p * np.pi / Lz * (z_0 - Lz / 2)) + * np.cos(np.sqrt(2) * np.pi / Lx * c_light * t) + ) + -#---- Domain definition ----# +# ---- Domain definition ----# # Number of mesh cells Nx = 50 @@ -54,11 +91,11 @@ def analytic_sol_Hx(x, y, z, t): Nz = 50 # Embedded boundaries -stl_file = 'stl/cube.stl' +stl_file = "stl/cube.stl" surf = pv.read(stl_file) -stl_solids = {'Solid 1': stl_file} -stl_materials = {'Solid 1': 'vacuum'} +stl_solids = {"Solid 1": stl_file} +stl_materials = {"Solid 1": "vacuum"} stl_rotate = [0, 0, 0] stl_translate = -np.array(surf.center) stl_scale = 1.0 @@ -71,50 +108,61 @@ def analytic_sol_Hx(x, y, z, t): # Domain bounds xmin, xmax, ymin, ymax, zmin, zmax = surf.bounds -Lx, Ly, Lz = (xmax-xmin), (ymax-ymin), (zmax-zmin) -padx, pady, padz = Lx*0.2, Ly*0.2, Lz*0.2 +Lx, Ly, Lz = (xmax - xmin), (ymax - ymin), (zmax - zmin) +padx, pady, padz = Lx * 0.2, Ly * 0.2, Lz * 0.2 -xmin, ymin, zmin = (xmin-padx), (ymin-pady), (zmin-padz) -xmax, ymax, zmax = (xmax+padx), (ymax+pady), (zmax+padz) +xmin, ymin, zmin = (xmin - padx), (ymin - pady), (zmin - padz) +xmax, ymax, zmax = (xmax + padx), (ymax + pady), (zmax + padz) # boundary conditions -bc_low=['pec', 'pec', 'pec'] -bc_high=['pec', 'pec', 'pec'] +bc_low = ["pec", "pec", "pec"] +bc_high = ["pec", "pec", "pec"] # set FIT solver -grid = GridFIT3D(xmin, xmax, ymin, ymax, zmin, zmax, Nx, Ny, Nz, - stl_solids=stl_solids, - stl_rotate=stl_rotate, - stl_scale=stl_scale, - stl_translate=stl_translate, - stl_materials=stl_materials) - -solver = SolverFIT3D(grid, - bc_low=bc_low, bc_high=bc_high, - use_stl=True, bg=[np.inf, 1.0]) #PEC backgroung +grid = GridFIT3D( + xmin, + xmax, + ymin, + ymax, + zmin, + zmax, + Nx, + Ny, + Nz, + stl_solids=stl_solids, + stl_rotate=stl_rotate, + stl_scale=stl_scale, + stl_translate=stl_translate, + stl_materials=stl_materials, +) + +solver = SolverFIT3D( + grid, bc_low=bc_low, bc_high=bc_high, use_stl=True, bg=[np.inf, 1.0] +) # PEC backgroung analytic = SolverFIT3D(grid, bc_low=bc_low, bc_high=bc_high, use_conductors=False) dx, dy, dz = solver.dx, solver.dy, solver.dz # Plotting functions -folder ='imgRes' -plane = 'ZX' +folder = "imgRes" +plane = "ZX" + +if plane == "XY": + xx, yy, zz = slice(0, Nx), slice(0, Ny), int(Nz // 2) # plane XY + title = "(x,y,Nz/2)" + xax, yax = "ny", "nx" -if plane == 'XY': - xx, yy, zz = slice(0,Nx), slice(0,Ny), int(Nz//2) #plane XY - title = '(x,y,Nz/2)' - xax, yax = 'ny', 'nx' +if plane == "ZY": + xx, yy, zz = int(Nx // 2), slice(0, Ny), slice(0, Nz) # plane YZ + title = "(Nx/2,y,z)" + xax, yax = "nz", "ny" -if plane == 'ZY': - xx, yy, zz = int(Nx//2), slice(0,Ny), slice(0,Nz) #plane YZ - title = '(Nx/2,y,z)' - xax, yax = 'nz', 'ny' +if plane == "ZX": + xx, yy, zz = slice(0, Nx), int(Ny // 2), slice(0, Nz) # plane ZX + title = "(x,Ny/2,z)" + xax, yax = "nz", "nx" -if plane == 'ZX': - xx, yy, zz = slice(0,Nx), int(Ny//2), slice(0,Nz) #plane ZX - title = '(x,Ny/2,z)' - xax, yax = 'nz', 'nx' def get_analytic_H(analytic, n): dx, dy, dz = analytic.dx, analytic.dy, analytic.dz @@ -124,124 +172,137 @@ def get_analytic_H(analytic, n): for ii in range(Nx): for jj in range(Ny): for kk in range(Nz): - - if mask[ii,jj,kk]: - - x = (ii+0.5) * dx + xmin - y = (jj+0.5) * dy + ymin - z = (kk+0.5) * dz + zmin - analytic.H[ii, jj, kk, 'z'] = analytic_sol_Hz(x, y, z, (n-0.5) * solver.dt) - analytic.H[ii, jj, kk, 'y'] = analytic_sol_Hy(x, y, z, (n-0.5) * solver.dt) - analytic.H[ii, jj, kk, 'x'] = analytic_sol_Hx(x, y, z, (n-0.5) * solver.dt) + if mask[ii, jj, kk]: + x = (ii + 0.5) * dx + xmin + y = (jj + 0.5) * dy + ymin + z = (kk + 0.5) * dz + zmin + analytic.H[ii, jj, kk, "z"] = analytic_sol_Hz( + x, y, z, (n - 0.5) * solver.dt + ) + analytic.H[ii, jj, kk, "y"] = analytic_sol_Hy( + x, y, z, (n - 0.5) * solver.dt + ) + analytic.H[ii, jj, kk, "x"] = analytic_sol_Hx( + x, y, z, (n - 0.5) * solver.dt + ) def plot_E_field(solver, n): - - fig, axs = plt.subplots(1,3, tight_layout=True, figsize=[8,6]) - dims = {0:'x', 1:'y', 2:'z'} + fig, axs = plt.subplots(1, 3, tight_layout=True, figsize=[8, 6]) + dims = {0: "x", 1: "y", 2: "z"} lims = {0: 50, 1: 50, 2: 50} - #FIT + # FIT for i, ax in enumerate(axs[:]): vmin, vmax = -lims[i], lims[i] - #vmin, vmax = -np.max(np.abs(solver.E[:,:,int(Nz/2), dims[i]])), np.max(np.abs(solver.E[:,:,int(Nz/2), dims[i]])) - im = ax.imshow(solver.E[xx, yy, zz, dims[i]], cmap='rainbow', vmin=vmin, vmax=vmax) - fig.colorbar(im, cax=make_axes_locatable(ax).append_axes('right', size='5%', pad=0.05)) - ax.set_title(f'FIT E{dims[i]}{title}') + # vmin, vmax = -np.max(np.abs(solver.E[:,:,int(Nz/2), dims[i]])), np.max(np.abs(solver.E[:,:,int(Nz/2), dims[i]])) + im = ax.imshow( + solver.E[xx, yy, zz, dims[i]], cmap="rainbow", vmin=vmin, vmax=vmax + ) + fig.colorbar( + im, cax=make_axes_locatable(ax).append_axes("right", size="5%", pad=0.05) + ) + ax.set_title(f"FIT E{dims[i]}{title}") ax.set_xlabel(xax) ax.set_ylabel(yax) - fig.suptitle(f'E field, timestep={n}') - fig.savefig(f'{folder}E/'+str(n).zfill(4)+'.png') + fig.suptitle(f"E field, timestep={n}") + fig.savefig(f"{folder}E/" + str(n).zfill(4) + ".png") plt.clf() plt.close(fig) -def plot_H_field(solver, analytic, n): - fig, axs = plt.subplots(2,3, tight_layout=True, figsize=[8,6]) - dims = {0:'x', 1:'y', 2:'z'} +def plot_H_field(solver, analytic, n): + fig, axs = plt.subplots(2, 3, tight_layout=True, figsize=[8, 6]) + dims = {0: "x", 1: "y", 2: "z"} lims = {0: 1.0, 1: 0.1, 2: 1} - #FIT - for i, ax in enumerate(axs[0,:]): + # FIT + for i, ax in enumerate(axs[0, :]): vmin, vmax = -lims[i], lims[i] - #vmin, vmax = -np.max(np.abs(solver.H[xx, yy, zz, dims[i]])), np.max(np.abs(solver.H[xx, yy, zz, dims[i]])) - im = ax.imshow(solver.H[xx, yy, zz, dims[i]], cmap='rainbow', vmin=vmin, vmax=vmax) - fig.colorbar(im, cax=make_axes_locatable(ax).append_axes('right', size='5%', pad=0.05)) - ax.set_title(f'FIT H{dims[i]}{title}') + # vmin, vmax = -np.max(np.abs(solver.H[xx, yy, zz, dims[i]])), np.max(np.abs(solver.H[xx, yy, zz, dims[i]])) + im = ax.imshow( + solver.H[xx, yy, zz, dims[i]], cmap="rainbow", vmin=vmin, vmax=vmax + ) + fig.colorbar( + im, cax=make_axes_locatable(ax).append_axes("right", size="5%", pad=0.05) + ) + ax.set_title(f"FIT H{dims[i]}{title}") ax.set_xlabel(xax) ax.set_ylabel(yax) - #Analytic + # Analytic get_analytic_H(analytic, n) - for i, ax in enumerate(axs[1,:]): + for i, ax in enumerate(axs[1, :]): vmin, vmax = -lims[i], lims[i] - im = ax.imshow(analytic.H[xx, yy, zz, dims[i]], cmap='rainbow', vmin=vmin, vmax=vmax) - fig.colorbar(im, cax=make_axes_locatable(ax).append_axes('right', size='5%', pad=0.05)) - ax.set_title(f'Analytic H{dims[i]}{title}') + im = ax.imshow( + analytic.H[xx, yy, zz, dims[i]], cmap="rainbow", vmin=vmin, vmax=vmax + ) + fig.colorbar( + im, cax=make_axes_locatable(ax).append_axes("right", size="5%", pad=0.05) + ) + ax.set_title(f"Analytic H{dims[i]}{title}") ax.set_xlabel(xax) ax.set_ylabel(yax) - fig.suptitle(f'H field, timestep={n}') - fig.savefig(f'{folder}H/'+str(n).zfill(4)+'.png') + fig.suptitle(f"H field, timestep={n}") + fig.savefig(f"{folder}H/" + str(n).zfill(4) + ".png") plt.clf() plt.close(fig) -#---- Initial conditions -----# -mask = np.reshape(solver.grid.grid['Solid 1'], (solver.Nx, solver.Ny, solver.Nz)) -#mask_x = mask -#mask_y = mask -#mask_z = mask +# ---- Initial conditions -----# +mask = np.reshape(solver.grid.grid["Solid 1"], (solver.Nx, solver.Ny, solver.Nz)) +# mask_x = mask +# mask_y = mask +# mask_z = mask -#mask_x = np.roll(mask, [-1, -1], axis=[1,2] ) -#mask_y = np.roll(mask, [-1, -1], axis=[0,2] ) -#mask_z = np.roll(mask, [-1, -1], axis=[0,1] ) +# mask_x = np.roll(mask, [-1, -1], axis=[1,2] ) +# mask_y = np.roll(mask, [-1, -1], axis=[0,2] ) +# mask_z = np.roll(mask, [-1, -1], axis=[0,1] ) -#mask_x = np.roll(mask, [-1], axis=[0] ) -#mask_y = np.roll(mask, [-1], axis=[1] ) -#mask_z = np.roll(mask, [-1], axis=[2] ) +# mask_x = np.roll(mask, [-1], axis=[0] ) +# mask_y = np.roll(mask, [-1], axis=[1] ) +# mask_z = np.roll(mask, [-1], axis=[2] ) # No zero waves for E IC -mask_x = np.roll(mask, [-1], axis=[1])+np.roll(mask, [+1], axis=[1]) -mask_y = np.roll(mask, [-1], axis=[0])+np.roll(mask, [+1], axis=[0]) -mask_z = mask_x+mask_y +mask_x = np.roll(mask, [-1], axis=[1]) + np.roll(mask, [+1], axis=[1]) +mask_y = np.roll(mask, [-1], axis=[0]) + np.roll(mask, [+1], axis=[0]) +mask_z = mask_x + mask_y # -#mask_x = np.roll(mask, [-1], axis=[1])+np.roll(mask, [+1], axis=[1]) -#mask_y = np.roll(mask, [-1], axis=[0])+np.roll(mask, [+1], axis=[0]) -#mask_z = mask_x+mask_y +# mask_x = np.roll(mask, [-1], axis=[1])+np.roll(mask, [+1], axis=[1]) +# mask_y = np.roll(mask, [-1], axis=[0])+np.roll(mask, [+1], axis=[0]) +# mask_z = mask_x+mask_y for ii in range(Nx): for jj in range(Ny): for kk in range(Nz): - - x = (ii+0.5) * dx + xmin - y = (jj+0.5) * dy + ymin - z = (kk+0.5) * dz + zmin - - if mask_x[ii,jj,kk]: - solver.H[ii, jj, kk, 'x'] = analytic_sol_Hx(x, y, z, -0.5 * solver.dt) - if mask_y[ii,jj,kk]: - solver.H[ii, jj, kk, 'y'] = analytic_sol_Hy(x, y, z, -0.5 * solver.dt) - if mask_z[ii,jj,kk]: - solver.H[ii, jj, kk, 'z'] = analytic_sol_Hz(x, y, z, -0.5 * solver.dt) - -#----- Time loop -----# + x = (ii + 0.5) * dx + xmin + y = (jj + 0.5) * dy + ymin + z = (kk + 0.5) * dz + zmin + + if mask_x[ii, jj, kk]: + solver.H[ii, jj, kk, "x"] = analytic_sol_Hx(x, y, z, -0.5 * solver.dt) + if mask_y[ii, jj, kk]: + solver.H[ii, jj, kk, "y"] = analytic_sol_Hy(x, y, z, -0.5 * solver.dt) + if mask_z[ii, jj, kk]: + solver.H[ii, jj, kk, "z"] = analytic_sol_Hz(x, y, z, -0.5 * solver.dt) + +# ----- Time loop -----# Nt = 100 for nt in tqdm(range(Nt)): - solver.one_step() - if nt%2: + if nt % 2: plot_E_field(solver, nt) plot_H_field(solver, analytic, nt) -#convert -delay 5 -loop 0 imgRes/*.png imgRes/.gif -''' +# convert -delay 5 -loop 0 imgRes/*.png imgRes/.gif +""" solver.plot3D(field='H', component='z', clim=None, hide_solids=None, show_solids=None, add_stl='Solid 1', stl_opacity=0.1, stl_colors='white', title=None, cmap='rainbow', clip_volume=True, clip_normal='-z', clip_box=False, clip_bounds=None, off_screen=False, zoom=0.4, n=nt) -''' \ No newline at end of file +""" diff --git a/examples/fit/script_cubestl_resonator_fit_v2.py b/examples/fit/script_cubestl_resonator_fit_v2.py index f4e3584..7e36f5c 100644 --- a/examples/fit/script_cubestl_resonator_fit_v2.py +++ b/examples/fit/script_cubestl_resonator_fit_v2.py @@ -1,52 +1,88 @@ import numpy as np import matplotlib.pyplot as plt -import os, sys import pyvista as pv from tqdm import tqdm from mpl_toolkits.axes_grid1 import make_axes_locatable from scipy.constants import c as c_light -sys.path.append('../') - from solverFIT3D import SolverFIT3D -from gridFIT3D import GridFIT3D -from field import Field +from gridFIT3D import GridFIT3D -#----- Funtions -----# +# ----- Funtions -----# m = 1 n = 0 p = 1 -theta = 0 #np.pi/8 +theta = 0 # np.pi/8 # Analytic solution of cubic resonator # Ref: http://faculty.pccu.edu.tw/~meng/new%20EM6.pdf pp.20/24 + def analytic_sol_Hz(x, y, z, t): - Rm = np.array([[np.cos(-theta), - np.sin(-theta), 0],[np.sin(-theta), np.cos(-theta), 0], [0, 0, 1]]) + Rm = np.array( + [ + [np.cos(-theta), -np.sin(-theta), 0], + [np.sin(-theta), np.cos(-theta), 0], + [0, 0, 1], + ] + ) [x_0, y_0, z_0] = np.dot(Rm, np.array([x, y, z])) - return np.cos(m * np.pi / Lx * (x_0 - Lx/2)) * np.cos(n * np.pi / Ly * (y_0 - Ly/2)) * np.sin( - p * np.pi / Lz * (z_0 - Lz/2)) * np.cos(np.sqrt(2) * np.pi / Lx * c_light * t) + return ( + np.cos(m * np.pi / Lx * (x_0 - Lx / 2)) + * np.cos(n * np.pi / Ly * (y_0 - Ly / 2)) + * np.sin(p * np.pi / Lz * (z_0 - Lz / 2)) + * np.cos(np.sqrt(2) * np.pi / Lx * c_light * t) + ) + def analytic_sol_Hy(x, y, z, t): - Rm = np.array([[np.cos(-theta), - np.sin(-theta), 0],[np.sin(-theta), np.cos(-theta), 0], [0, 0, 1]]) + Rm = np.array( + [ + [np.cos(-theta), -np.sin(-theta), 0], + [np.sin(-theta), np.cos(-theta), 0], + [0, 0, 1], + ] + ) [x_0, y_0, z_0] = np.dot(Rm, np.array([x, y, z])) h_2 = (m * np.pi / Lx) ** 2 + (n * np.pi / Ly) ** 2 + (p * np.pi / Lz) ** 2 - return -2 / h_2 * (n * np.pi / Ly) * (p * np.pi / Lz) * np.cos(m * np.pi / Lx * (x_0 - Lx/2)) * np.sin( - n * np.pi / Ly * (y_0 - Ly/2)) * np.cos(p * np.pi / Lz * (z_0 - Lz/2)) * np.cos( - np.sqrt(2) * np.pi / Lx * c_light * t) + return ( + -2 + / h_2 + * (n * np.pi / Ly) + * (p * np.pi / Lz) + * np.cos(m * np.pi / Lx * (x_0 - Lx / 2)) + * np.sin(n * np.pi / Ly * (y_0 - Ly / 2)) + * np.cos(p * np.pi / Lz * (z_0 - Lz / 2)) + * np.cos(np.sqrt(2) * np.pi / Lx * c_light * t) + ) + def analytic_sol_Hx(x, y, z, t): - Rm = np.array([[np.cos(-theta), - np.sin(-theta), 0],[np.sin(-theta), np.cos(-theta), 0], [0, 0, 1]]) + Rm = np.array( + [ + [np.cos(-theta), -np.sin(-theta), 0], + [np.sin(-theta), np.cos(-theta), 0], + [0, 0, 1], + ] + ) [x_0, y_0, z_0] = np.dot(Rm, np.array([x, y, z])) h_2 = (m * np.pi / Lx) ** 2 + (n * np.pi / Ly) ** 2 + (p * np.pi / Lz) ** 2 - return -2 / h_2 * (m * np.pi / Lx) * (p * np.pi / Lz) * np.sin(m * np.pi / Lx * (x_0 - Lx/2)) * np.cos( - n * np.pi / Ly * (y_0 - Ly/2)) * np.cos(p * np.pi / Lz * (z_0 - Lz/2)) * np.cos( - np.sqrt(2) * np.pi / Lx * c_light * t) + return ( + -2 + / h_2 + * (m * np.pi / Lx) + * (p * np.pi / Lz) + * np.sin(m * np.pi / Lx * (x_0 - Lx / 2)) + * np.cos(n * np.pi / Ly * (y_0 - Ly / 2)) + * np.cos(p * np.pi / Lz * (z_0 - Lz / 2)) + * np.cos(np.sqrt(2) * np.pi / Lx * c_light * t) + ) + -#---- Domain definition ----# +# ---- Domain definition ----# # Number of mesh cells Nx = 30 @@ -54,11 +90,11 @@ def analytic_sol_Hx(x, y, z, t): Nz = 30 # Embedded boundaries -stl_file = 'stl/cube.stl' +stl_file = "stl/cube.stl" surf = pv.read(stl_file) -stl_solids = {'Solid 1': stl_file} -stl_materials = {'Solid 1': 'vacuum'} +stl_solids = {"Solid 1": stl_file} +stl_materials = {"Solid 1": "vacuum"} stl_rotate = [0, 0, 0] stl_translate = -np.array(surf.center) stl_scale = 1.0 @@ -71,57 +107,68 @@ def analytic_sol_Hx(x, y, z, t): # Domain bounds xmin, xmax, ymin, ymax, zmin, zmax = surf.bounds -Lx, Ly, Lz = (xmax-xmin), (ymax-ymin), (zmax-zmin) -padx, pady, padz = Lx*0.2, Ly*0.2, Lz*0.2 +Lx, Ly, Lz = (xmax - xmin), (ymax - ymin), (zmax - zmin) +padx, pady, padz = Lx * 0.2, Ly * 0.2, Lz * 0.2 -xmin, ymin, zmin = (xmin-padx), (ymin-pady), (zmin-padz) -xmax, ymax, zmax = (xmax+padx), (ymax+pady), (zmax+padz) +xmin, ymin, zmin = (xmin - padx), (ymin - pady), (zmin - padz) +xmax, ymax, zmax = (xmax + padx), (ymax + pady), (zmax + padz) # boundary conditions -bc_low=['pec', 'pec', 'pec'] -bc_high=['pec', 'pec', 'pec'] +bc_low = ["pec", "pec", "pec"] +bc_high = ["pec", "pec", "pec"] # set FIT solver -grid = GridFIT3D(xmin, xmax, ymin, ymax, zmin, zmax, Nx, Ny, Nz, - stl_solids=stl_solids, - stl_rotate=stl_rotate, - stl_scale=stl_scale, - stl_translate=stl_translate, - stl_materials=stl_materials) - -solver = SolverFIT3D(grid, - bc_low=bc_low, bc_high=bc_high, - use_stl=True, bg=[np.inf, 1.0]) #PEC backgroung +grid = GridFIT3D( + xmin, + xmax, + ymin, + ymax, + zmin, + zmax, + Nx, + Ny, + Nz, + stl_solids=stl_solids, + stl_rotate=stl_rotate, + stl_scale=stl_scale, + stl_translate=stl_translate, + stl_materials=stl_materials, +) + +solver = SolverFIT3D( + grid, bc_low=bc_low, bc_high=bc_high, use_stl=True, bg=[np.inf, 1.0] +) # PEC backgroung analytic = SolverFIT3D(grid, bc_low=bc_low, bc_high=bc_high, use_conductors=False) dx, dy, dz = solver.dx, solver.dy, solver.dz # Plotting functions -folder ='imgRes' +folder = "imgRes" + def get_slice(plane): - if plane == 'XY': - xx, yy, zz = slice(0,Nx), slice(0,Ny), int(Nz//2) #plane XY - title = '(x,y,Nz/2)' - xax, yax = 'ny', 'nx' + if plane == "XY": + xx, yy, zz = slice(0, Nx), slice(0, Ny), int(Nz // 2) # plane XY + title = "(x,y,Nz/2)" + xax, yax = "ny", "nx" lims = {0: 0.1, 1: 0.1, 2: 1} - extent = [0, Ny, 0, Nx] - if plane == 'ZY': - xx, yy, zz = int(Nx//2), slice(0,Ny), slice(0,Nz) #plane YZ - title = '(Nx/2,y,z)' - xax, yax = 'nz', 'ny' + if plane == "ZY": + xx, yy, zz = int(Nx // 2), slice(0, Ny), slice(0, Nz) # plane YZ + title = "(Nx/2,y,z)" + xax, yax = "nz", "ny" lims = {0: 1.0, 1: 0.1, 2: 0.1} - if plane == 'ZX': - xx, yy, zz = slice(0,Nx), int(Ny//2), slice(0,Nz) #plane ZX - title = '(x,Ny/2,z)' - xax, yax = 'nz', 'nx' + if plane == "ZX": + xx, yy, zz = slice(0, Nx), int(Ny // 2), slice(0, Nz) # plane ZX + title = "(x,Ny/2,z)" + xax, yax = "nz", "nx" lims = {0: 1.0, 1: 0.1, 2: 1} - + return xx, yy, zz, title, xax, yax, lims + def get_analytic_H(analytic, n): dx, dy, dz = analytic.dx, analytic.dy, analytic.dz xmin, ymin, zmin = analytic.grid.xmin, analytic.grid.ymin, analytic.grid.zmin @@ -130,159 +177,177 @@ def get_analytic_H(analytic, n): for ii in range(Nx): for jj in range(Ny): for kk in range(Nz): - - if mask[ii,jj,kk]: - - x = (ii+0.5) * dx + xmin - y = (jj+0.5) * dy + ymin - z = (kk+0.5) * dz + zmin - analytic.H[ii, jj, kk, 'z'] = analytic_sol_Hz(x, y, z, (n-0.5) * solver.dt) - analytic.H[ii, jj, kk, 'y'] = analytic_sol_Hy(x, y, z, (n-0.5) * solver.dt) - analytic.H[ii, jj, kk, 'x'] = analytic_sol_Hx(x, y, z, (n-0.5) * solver.dt) + if mask[ii, jj, kk]: + x = (ii + 0.5) * dx + xmin + y = (jj + 0.5) * dy + ymin + z = (kk + 0.5) * dz + zmin + analytic.H[ii, jj, kk, "z"] = analytic_sol_Hz( + x, y, z, (n - 0.5) * solver.dt + ) + analytic.H[ii, jj, kk, "y"] = analytic_sol_Hy( + x, y, z, (n - 0.5) * solver.dt + ) + analytic.H[ii, jj, kk, "x"] = analytic_sol_Hx( + x, y, z, (n - 0.5) * solver.dt + ) def plot_E_field(solver, n): - - fig, axs = plt.subplots(3,3, tight_layout=True, figsize=[8,6]) - dims = {0:'x', 1:'y', 2:'z'} + fig, axs = plt.subplots(3, 3, tight_layout=True, figsize=[8, 6]) + dims = {0: "x", 1: "y", 2: "z"} lims = {0: 50, 1: 50, 2: 50} - #FIT - for j, plane in enumerate(['XY','ZY','ZX']): - for i, ax in enumerate(axs[j,:]): + # FIT + for j, plane in enumerate(["XY", "ZY", "ZX"]): + for i, ax in enumerate(axs[j, :]): xx, yy, zz, title, xax, yax, _ = get_slice(plane) vmin, vmax = -lims[i], lims[i] - im = ax.imshow(solver.E[xx, yy, zz, dims[i]], cmap='rainbow', vmin=vmin, vmax=vmax) - fig.colorbar(im, cax=make_axes_locatable(ax).append_axes('right', size='5%', pad=0.05)) - ax.set_title(f'FIT E{dims[i]}{title}') + im = ax.imshow( + solver.E[xx, yy, zz, dims[i]], cmap="rainbow", vmin=vmin, vmax=vmax + ) + fig.colorbar( + im, + cax=make_axes_locatable(ax).append_axes("right", size="5%", pad=0.05), + ) + ax.set_title(f"FIT E{dims[i]}{title}") ax.set_xlabel(xax) ax.set_ylabel(yax) - fig.suptitle(f'E field, timestep={n}') - fig.savefig(f'{folder}E/'+str(n).zfill(4)+'.png') + fig.suptitle(f"E field, timestep={n}") + fig.savefig(f"{folder}E/" + str(n).zfill(4) + ".png") plt.clf() plt.close(fig) -def plot_H_field(solver, n): - fig, axs = plt.subplots(3,3, tight_layout=True, figsize=[8,6]) - dims = {0:'x', 1:'y', 2:'z'} +def plot_H_field(solver, n): + fig, axs = plt.subplots(3, 3, tight_layout=True, figsize=[8, 6]) + dims = {0: "x", 1: "y", 2: "z"} - #FIT - for j, plane in enumerate(['XY','ZY','ZX']): - for i, ax in enumerate(axs[j,:]): + # FIT + for j, plane in enumerate(["XY", "ZY", "ZX"]): + for i, ax in enumerate(axs[j, :]): xx, yy, zz, title, xax, yax, lims = get_slice(plane) vmin, vmax = -lims[i], lims[i] - im = ax.imshow(solver.H[xx, yy, zz, dims[i]], cmap='rainbow', vmin=vmin, vmax=vmax) - fig.colorbar(im, cax=make_axes_locatable(ax).append_axes('right', size='5%', pad=0.05)) - ax.set_title(f'FIT H{dims[i]}{title}') + im = ax.imshow( + solver.H[xx, yy, zz, dims[i]], cmap="rainbow", vmin=vmin, vmax=vmax + ) + fig.colorbar( + im, + cax=make_axes_locatable(ax).append_axes("right", size="5%", pad=0.05), + ) + ax.set_title(f"FIT H{dims[i]}{title}") ax.set_xlabel(xax) ax.set_ylabel(yax) - fig.suptitle(f'H field, timestep={n}') - fig.savefig(f'{folder}H/'+str(n).zfill(4)+'.png') + fig.suptitle(f"H field, timestep={n}") + fig.savefig(f"{folder}H/" + str(n).zfill(4) + ".png") plt.clf() plt.close(fig) + def plot_analytic(solver, n): - fig, axs = plt.subplots(3,3, tight_layout=True, figsize=[8,6]) - dims = {0:'x', 1:'y', 2:'z'} + fig, axs = plt.subplots(3, 3, tight_layout=True, figsize=[8, 6]) + dims = {0: "x", 1: "y", 2: "z"} - #FIT + # FIT get_analytic_H(solver, n) - for j, plane in enumerate(['XY','ZY','ZX']): - for i, ax in enumerate(axs[j,:]): + for j, plane in enumerate(["XY", "ZY", "ZX"]): + for i, ax in enumerate(axs[j, :]): xx, yy, zz, title, xax, yax, lims = get_slice(plane) vmin, vmax = -lims[i], lims[i] - im = ax.imshow(solver.H[xx, yy, zz, dims[i]], cmap='rainbow', vmin=vmin, vmax=vmax) - fig.colorbar(im, cax=make_axes_locatable(ax).append_axes('right', size='5%', pad=0.05)) - ax.set_title(f'FIT H{dims[i]}{title}') + im = ax.imshow( + solver.H[xx, yy, zz, dims[i]], cmap="rainbow", vmin=vmin, vmax=vmax + ) + fig.colorbar( + im, + cax=make_axes_locatable(ax).append_axes("right", size="5%", pad=0.05), + ) + ax.set_title(f"FIT H{dims[i]}{title}") ax.set_xlabel(xax) ax.set_ylabel(yax) - fig.suptitle(f'Analytic H, timestep={n}') - fig.savefig(f'{folder}H/'+str(n).zfill(4)+'.png') + fig.suptitle(f"Analytic H, timestep={n}") + fig.savefig(f"{folder}H/" + str(n).zfill(4) + ".png") plt.clf() plt.close(fig) -#---- Initial conditions -----# -mask = np.reshape(solver.grid.grid['Solid 1'], (solver.Nx, solver.Ny, solver.Nz)) + +# ---- Initial conditions -----# +mask = np.reshape(solver.grid.grid["Solid 1"], (solver.Nx, solver.Ny, solver.Nz)) mask_x = mask mask_y = mask -mask_z = mask # v7 +mask_z = mask # v7 -#mask_x = np.roll(mask, [-1, -1], axis=[1,2] ) -#mask_y = np.roll(mask, [-1, -1], axis=[0,2] ) -#mask_z = np.roll(mask, [-1, -1], axis=[0,1] ) +# mask_x = np.roll(mask, [-1, -1], axis=[1,2] ) +# mask_y = np.roll(mask, [-1, -1], axis=[0,2] ) +# mask_z = np.roll(mask, [-1, -1], axis=[0,1] ) -#mask_x = np.roll(mask, [-1], axis=[0] ) -#mask_y = np.roll(mask, [-1], axis=[1] ) -#mask_z = np.roll(mask, [-1], axis=[2] ) +# mask_x = np.roll(mask, [-1], axis=[0] ) +# mask_y = np.roll(mask, [-1], axis=[1] ) +# mask_z = np.roll(mask, [-1], axis=[2] ) # No zero waves for E IC, zero waves visible in ZY/ZX on Hx field (v5), (v6 + analytic=1) -#mask_x = np.roll(mask, [-1], axis=[1])+np.roll(mask, [+1], axis=[1]) -#mask_y = np.roll(mask, [-1], axis=[0])+np.roll(mask, [+1], axis=[0]) -#mask_z = mask_x+mask_y - -#v8 - only a corner was missing, issues in Hy -#mask_x = mask + np.roll(mask, [-1], axis=[1]) + np.roll(mask, [-1], axis=[2]) -#mask_y = mask -#mask_z = mask + np.roll(mask, [-1], axis=[0]) + np.roll(mask, [-1], axis=[1]) - -#v9 issues with corner hi-hi, issues in Hy -#mask_x = np.roll(mask + np.roll(mask, [-1], axis=[1]), [-1], axis=[2]) + mask -#mask_y = mask -#mask_z = np.roll(mask + np.roll(mask, [-1], axis=[0]), [-1], axis=[1]) + mask - -#v10 - best so far, no corners, only some waves in E starting from low y in Ex and Ez -#mask_x = mask + np.roll(mask, [-1], axis=[1]) + np.roll(mask, [-1], axis=[2]) -#mask_y = mask + np.roll(mask, [-1], axis=[0]) + np.roll(mask, [-1], axis=[2]) -#mask_z = mask + np.roll(mask, [-1], axis=[0]) + np.roll(mask, [-1], axis=[1]) - -#v11 - issues with corners hi hi, same waves, coming from HzXY and HX YZ -#mask_x = mask + np.roll(mask + np.roll(mask, [-1], axis=[1]), [-1], axis=[2]) -#mask_y = mask + np.roll(mask + np.roll(mask, [-1], axis=[0]), [-1], axis=[2]) -#mask_z = mask + np.roll(mask + np.roll(mask, [-1], axis=[0]), [-1], axis=[1]) - -#v12 -mask_x = mask + np.roll(mask, [-1], axis=[1]) +# mask_x = np.roll(mask, [-1], axis=[1])+np.roll(mask, [+1], axis=[1]) +# mask_y = np.roll(mask, [-1], axis=[0])+np.roll(mask, [+1], axis=[0]) +# mask_z = mask_x+mask_y + +# v8 - only a corner was missing, issues in Hy +# mask_x = mask + np.roll(mask, [-1], axis=[1]) + np.roll(mask, [-1], axis=[2]) +# mask_y = mask +# mask_z = mask + np.roll(mask, [-1], axis=[0]) + np.roll(mask, [-1], axis=[1]) + +# v9 issues with corner hi-hi, issues in Hy +# mask_x = np.roll(mask + np.roll(mask, [-1], axis=[1]), [-1], axis=[2]) + mask +# mask_y = mask +# mask_z = np.roll(mask + np.roll(mask, [-1], axis=[0]), [-1], axis=[1]) + mask + +# v10 - best so far, no corners, only some waves in E starting from low y in Ex and Ez +# mask_x = mask + np.roll(mask, [-1], axis=[1]) + np.roll(mask, [-1], axis=[2]) +# mask_y = mask + np.roll(mask, [-1], axis=[0]) + np.roll(mask, [-1], axis=[2]) +# mask_z = mask + np.roll(mask, [-1], axis=[0]) + np.roll(mask, [-1], axis=[1]) + +# v11 - issues with corners hi hi, same waves, coming from HzXY and HX YZ +# mask_x = mask + np.roll(mask + np.roll(mask, [-1], axis=[1]), [-1], axis=[2]) +# mask_y = mask + np.roll(mask + np.roll(mask, [-1], axis=[0]), [-1], axis=[2]) +# mask_z = mask + np.roll(mask + np.roll(mask, [-1], axis=[0]), [-1], axis=[1]) + +# v12 +mask_x = mask + np.roll(mask, [-1], axis=[1]) mask_x += np.roll(mask_x, [-1], axis=[2]) -mask_y = mask + np.roll(mask, [-1], axis=[0]) +mask_y = mask + np.roll(mask, [-1], axis=[0]) mask_y += np.roll(mask_y, [-1], axis=[2]) -mask_z = mask + np.roll(mask, [-1], axis=[0]) +mask_z = mask + np.roll(mask, [-1], axis=[0]) mask_z += np.roll(mask_z, [-1], axis=[1]) for ii in range(Nx): for jj in range(Ny): for kk in range(Nz): - - x = (ii+0.5) * dx + xmin - y = (jj+0.5) * dy + ymin - z = (kk+0.5) * dz + zmin - - if mask_x[ii,jj,kk]: - solver.H[ii, jj, kk, 'x'] = analytic_sol_Hx(x, y, z, -0.5 * solver.dt) - if mask_y[ii,jj,kk]: - solver.H[ii, jj, kk, 'y'] = analytic_sol_Hy(x, y, z, -0.5 * solver.dt) - if mask_z[ii,jj,kk]: - solver.H[ii, jj, kk, 'z'] = analytic_sol_Hz(x, y, z, -0.5 * solver.dt) - -#----- Time loop -----# + x = (ii + 0.5) * dx + xmin + y = (jj + 0.5) * dy + ymin + z = (kk + 0.5) * dz + zmin + + if mask_x[ii, jj, kk]: + solver.H[ii, jj, kk, "x"] = analytic_sol_Hx(x, y, z, -0.5 * solver.dt) + if mask_y[ii, jj, kk]: + solver.H[ii, jj, kk, "y"] = analytic_sol_Hy(x, y, z, -0.5 * solver.dt) + if mask_z[ii, jj, kk]: + solver.H[ii, jj, kk, "z"] = analytic_sol_Hz(x, y, z, -0.5 * solver.dt) + +# ----- Time loop -----# Nt = 100 for nt in tqdm(range(Nt)): - solver.one_step() - if nt%2: + if nt % 2: plot_E_field(solver, nt) plot_H_field(solver, nt) - #plot_analytic(analytic, nt) + # plot_analytic(analytic, nt) -#convert -delay 5 -loop 0 imgRes/*.png imgRes/.gif -''' +# convert -delay 5 -loop 0 imgRes/*.png imgRes/.gif +""" solver.plot3D(field='H', component='z', clim=None, hide_solids=None, show_solids=None, add_stl='Solid 1', stl_opacity=0.1, stl_colors='white', title=None, cmap='rainbow', clip_volume=True, clip_normal='-z', clip_box=False, clip_bounds=None, off_screen=False, zoom=0.4, n=nt) -''' \ No newline at end of file +""" diff --git a/examples/fit/script_injection_fit.py b/examples/fit/script_injection_fit.py index 03a88d3..6d15662 100644 --- a/examples/fit/script_injection_fit.py +++ b/examples/fit/script_injection_fit.py @@ -1,16 +1,11 @@ import numpy as np -import matplotlib.pyplot as plt -import os, sys -import pyvista as pv import h5py from tqdm import tqdm from scipy.constants import c as c_light -from scipy.constants import epsilon_0 -sys.path.append('../') from solverFIT3D import SolverFIT3D -from gridFIT3D import GridFIT3D +from gridFIT3D import GridFIT3D # ---------- Domain setup --------- # Number of mesh cells @@ -19,88 +14,102 @@ Nz = 100 # Domain bounds -xmin, xmax = -2.5e-2, +2.5e-2 +xmin, xmax = -2.5e-2, +2.5e-2 ymin, ymax = -2.5e-2, +2.5e-2 -zmin, zmax = -5e-2, +5e-2 -Lx, Ly, Lz = (xmax-xmin), (ymax-ymin), (zmax-zmin) +zmin, zmax = -5e-2, +5e-2 +Lx, Ly, Lz = (xmax - xmin), (ymax - ymin), (zmax - zmin) # boundary conditions -bc_low=['pec', 'pec', 'abc'] -bc_high=['pec', 'pec', 'abc'] +bc_low = ["pec", "pec", "abc"] +bc_high = ["pec", "pec", "abc"] # set FIT solver grid = GridFIT3D(xmin, xmax, ymin, ymax, zmin, zmax, Nx, Ny, Nz) -solver = SolverFIT3D(grid, bc_low=bc_low, bc_high=bc_high, bg='vacuum') +solver = SolverFIT3D(grid, bc_low=bc_low, bc_high=bc_high, bg="vacuum") # ------------ Beam source ---------------- # Beam parameters -sigmaz = 5e-2 #[m] -q = 1e-9 #[C] -beta = 1.0 # beam beta -xs = 0. # x source position [m] -ys = 0. # y source position [m] -xt = 0. # x test position [m] -yt = 0. # y test position [m] -tinj = 8.53*sigmaz/c_light # injection time offset [s] +sigmaz = 5e-2 # [m] +q = 1e-9 # [C] +beta = 1.0 # beam beta +xs = 0.0 # x source position [m] +ys = 0.0 # y source position [m] +xt = 0.0 # x test position [m] +yt = 0.0 # y test position [m] +tinj = 8.53 * sigmaz / c_light # injection time offset [s] x, y, z = solver.x, solver.y, solver.z -ixs, iys = np.abs(x-xs).argmin(), np.abs(y-ys).argmin() -ixt, iyt = np.abs(x-xt).argmin(), np.abs(y-yt).argmin() +ixs, iys = np.abs(x - xs).argmin(), np.abs(y - ys).argmin() +ixt, iyt = np.abs(x - xt).argmin(), np.abs(y - yt).argmin() + def beam(solver, t, gap=0): # Define gaussian if gap == 0: - izs = slice(0,Nz) - else: - izs = slice(gap,Nz-gap) + izs = slice(0, Nz) + else: + izs = slice(gap, Nz - gap) z = solver.z[izs] - s0 = z.min()-c_light*tinj - s = z-c_light*t - profile = 1/np.sqrt(2*np.pi*sigmaz**2)*np.exp(-(s-s0)**2/(2*sigmaz**2)) + s0 = z.min() - c_light * tinj + s = z - c_light * t + profile = ( + 1 / np.sqrt(2 * np.pi * sigmaz**2) * np.exp(-((s - s0) ** 2) / (2 * sigmaz**2)) + ) # Update current - current = q*c_light*profile/solver.dx/solver.dy - solver.J[ixs,iys,izs,'z'] = current + current = q * c_light * profile / solver.dx / solver.dy + solver.J[ixs, iys, izs, "z"] = current + # ------------ Time loop ---------------- # Define wake length -wakelength = 10*1e-2 #[m] +wakelength = 10 * 1e-2 # [m] # Obtain simulation time -tmax = (wakelength + tinj*c_light + (zmax-zmin))/c_light #[s] -Nt = int(tmax/solver.dt) -t = np.arange(0, Nt*solver.dt, solver.dt) -ninj = int(tinj/solver.dt) +tmax = (wakelength + tinj * c_light + (zmax - zmin)) / c_light # [s] +Nt = int(tmax / solver.dt) +t = np.arange(0, Nt * solver.dt, solver.dt) +ninj = int(tinj / solver.dt) # Prepare save files save = False plot = True if save: - hf = h5py.File('imgInj/Ez_gap0_pec.h5', 'w') - hf2 = h5py.File('imgInj/Jz.h5', 'w') - hf['x'], hf['y'], hf['z'], hf['t'] = x, y, z, t + hf = h5py.File("imgInj/Ez_gap0_pec.h5", "w") + hf2 = h5py.File("imgInj/Jz.h5", "w") + hf["x"], hf["y"], hf["z"], hf["t"] = x, y, z, t for n in tqdm(range(Nt)): - # Initial condition - beam(solver, n*solver.dt) + beam(solver, n * solver.dt) # Advance solver.one_step() # Plot 2D - if n>(ninj-1000) and n%20 == 0 and plot: - solver.plot2D(field='E', component='y', plane='ZY', pos=0.5, norm=None, - vmin=-5e5, vmax=5e5, cmap='bwr', title='imgInj/Ez', off_screen=True, - n=n, interpolation='spline36') - + if n > (ninj - 1000) and n % 20 == 0 and plot: + solver.plot2D( + field="E", + component="y", + plane="ZY", + pos=0.5, + norm=None, + vmin=-5e5, + vmax=5e5, + cmap="bwr", + title="imgInj/Ez", + off_screen=True, + n=n, + interpolation="spline36", + ) + # Save if save: - hf['#'+str(n).zfill(5)]=solver.E[ixt, iyt, :, 'z'] - hf2['#'+str(n).zfill(5)]=solver.J[ixt, iyt, :, 'z'] + hf["#" + str(n).zfill(5)] = solver.E[ixt, iyt, :, "z"] + hf2["#" + str(n).zfill(5)] = solver.J[ixt, iyt, :, "z"] # Close save file if save: @@ -110,4 +119,4 @@ def beam(solver, t, gap=0): # Compare results TODO if plot: - pass \ No newline at end of file + pass diff --git a/examples/fit/script_letters_fit.py b/examples/fit/script_letters_fit.py index 29206b6..6c5e5ea 100644 --- a/examples/fit/script_letters_fit.py +++ b/examples/fit/script_letters_fit.py @@ -1,16 +1,12 @@ import numpy as np import matplotlib.pyplot as plt -import os, sys import pyvista as pv from tqdm import tqdm from mpl_toolkits.axes_grid1 import make_axes_locatable from scipy.constants import c as c_light -sys.path.append('../') - from solverFIT3D import SolverFIT3D -from gridFIT3D import GridFIT3D -from field import Field +from gridFIT3D import GridFIT3D # ---------- Domain setup --------- @@ -20,11 +16,11 @@ Nz = 200 # Embedded boundaries -stl_file = 'stl/ceiheart.stl' +stl_file = "stl/ceiheart.stl" surf = pv.read(stl_file) -stl_solids = {'Solid 1': stl_file} -stl_materials = {'Solid 1': 'PEC'} +stl_solids = {"Solid 1": stl_file} +stl_materials = {"Solid 1": "PEC"} stl_rotate = [0, -90, 0] stl_scale = 1e-3 @@ -35,114 +31,136 @@ # Domain bounds xmin, xmax, ymin, ymax, zmin, zmax = surf.bounds -padx, pady, padz = (xmax-xmin)*0.1, (ymax-ymin)*0.3, (zmax-zmin)*0.1 +padx, pady, padz = (xmax - xmin) * 0.1, (ymax - ymin) * 0.3, (zmax - zmin) * 0.1 -xmin, ymin, zmin = (xmin-padx), (ymin-pady), (zmin-padz) -xmax, ymax, zmax = (xmax+padx), (ymax+pady), (zmax+padz) +xmin, ymin, zmin = (xmin - padx), (ymin - pady), (zmin - padz) +xmax, ymax, zmax = (xmax + padx), (ymax + pady), (zmax + padz) # boundary conditions -bc_low=['pec', 'pec', 'pec'] -bc_high=['pec', 'pec', 'pec'] +bc_low = ["pec", "pec", "pec"] +bc_high = ["pec", "pec", "pec"] # set FIT solver -grid = GridFIT3D(xmin, xmax, ymin, ymax, zmin, zmax, Nx, Ny, Nz, - stl_solids=stl_solids, - stl_rotate=stl_rotate, - stl_scale=stl_scale, - stl_materials=stl_materials) - -solver = SolverFIT3D(grid, - bc_low=bc_low, bc_high=bc_high, - use_stl=True) +grid = GridFIT3D( + xmin, + xmax, + ymin, + ymax, + zmin, + zmax, + Nx, + Ny, + Nz, + stl_solids=stl_solids, + stl_rotate=stl_rotate, + stl_scale=stl_scale, + stl_materials=stl_materials, +) + +solver = SolverFIT3D(grid, bc_low=bc_low, bc_high=bc_high, use_stl=True) # ------------ Plot functions --------------- -plane = 'YZ' +plane = "YZ" -if plane == 'XY': - x, y, z = slice(0,Nx), slice(0,Ny), int(Nz//2) #plane XY - title = '(x,y,Nz/2)' - xax, yax = 'y', 'x' - extent = [0,Ny,0,Nx] +if plane == "XY": + x, y, z = slice(0, Nx), slice(0, Ny), int(Nz // 2) # plane XY + title = "(x,y,Nz/2)" + xax, yax = "y", "x" + extent = [0, Ny, 0, Nx] -if plane == 'YZ': - x, y, z = int(Nx//2), slice(0,Ny), slice(0,Nz) #plane YZ - title = '(Nx/2,y,z)' - xax, yax = 'z', 'y' - extent = [0,Nz,0,Ny] - -def plot_E_field(solver, n): +if plane == "YZ": + x, y, z = int(Nx // 2), slice(0, Ny), slice(0, Nz) # plane YZ + title = "(Nx/2,y,z)" + xax, yax = "z", "y" + extent = [0, Nz, 0, Ny] - fig, ax = plt.subplots(1,1, figsize=[8,4]) - vmin, vmax = 0., 1.e6 - im = ax.imshow(solver.E.get_abs()[x, y, z], cmap='jet', extent=extent, origin='lower', vmin=vmin, vmax=vmax,) - fig.colorbar(im, cax=make_axes_locatable(ax).append_axes('right', size='5%', pad=0.05)) - ax.set_title(f'FIT Abs(E){title}, timestep={n}') +def plot_E_field(solver, n): + fig, ax = plt.subplots(1, 1, figsize=[8, 4]) + vmin, vmax = 0.0, 1.0e6 + + im = ax.imshow( + solver.E.get_abs()[x, y, z], + cmap="jet", + extent=extent, + origin="lower", + vmin=vmin, + vmax=vmax, + ) + fig.colorbar( + im, cax=make_axes_locatable(ax).append_axes("right", size="5%", pad=0.05) + ) + ax.set_title(f"FIT Abs(E){title}, timestep={n}") ax.set_xlabel(xax) ax.set_ylabel(yax) # Patch stl - mask = np.reshape(grid.grid['Solid 1'], (Nx, Ny, Nz)) + mask = np.reshape(grid.grid["Solid 1"], (Nx, Ny, Nz)) patch = np.ones((Nx, Ny, Nz)) patch[np.logical_not(mask)] = np.nan - ax.imshow(patch[x,y,z], cmap='Greys', extent=extent, origin='lower', alpha=0.2) + ax.imshow(patch[x, y, z], cmap="Greys", extent=extent, origin="lower", alpha=0.2) - #fig.suptitle(f'Abs(E) field, timestep={n}') + # fig.suptitle(f'Abs(E) field, timestep={n}') fig.tight_layout() - fig.savefig('imgAbsE/'+str(n).zfill(4)+'.png') + fig.savefig("imgAbsE/" + str(n).zfill(4) + ".png") plt.clf() plt.close(fig) -def plot_H_field(solver, n): - fig, ax = plt.subplots(1,1, figsize=[8,4]) - vmin, vmax = 0, 2.e3 - - im = ax.imshow(solver.H.get_abs()[x, y, z], cmap='jet', extent=extent, origin='lower', vmin=vmin, vmax=vmax) - fig.colorbar(im, cax=make_axes_locatable(ax).append_axes('right', size='5%', pad=0.05)) - ax.set_title(f'FIT Abs(H){title}, timestep={n}') +def plot_H_field(solver, n): + fig, ax = plt.subplots(1, 1, figsize=[8, 4]) + vmin, vmax = 0, 2.0e3 + + im = ax.imshow( + solver.H.get_abs()[x, y, z], + cmap="jet", + extent=extent, + origin="lower", + vmin=vmin, + vmax=vmax, + ) + fig.colorbar( + im, cax=make_axes_locatable(ax).append_axes("right", size="5%", pad=0.05) + ) + ax.set_title(f"FIT Abs(H){title}, timestep={n}") ax.set_xlabel(xax) ax.set_ylabel(yax) # Patch stl - ''' + """ mask = np.reshape(grid.grid['Solid 1'], (Nx, Ny, Nz)) patch = np.ones((Nx, Ny, Nz)) patch[np.logical_not(mask)] = np.nan ax.imshow(patch[x,y,z], cmap='Greys', extent=extent, origin='lower', alpha=0.2) - ''' - - #fig.suptitle(f'Abs(H) field, timestep={n}') + """ + + # fig.suptitle(f'Abs(H) field, timestep={n}') fig.tight_layout() - fig.savefig('imgAbsH/'+str(n).zfill(4)+'.png') + fig.savefig("imgAbsH/" + str(n).zfill(4) + ".png") plt.clf() plt.close(fig) # ------------ Time loop ---------------- -#solver.J[int(Nx/2), Ny-1, 1, 'z'] = 1.0*c_light +# solver.J[int(Nx/2), Ny-1, 1, 'z'] = 1.0*c_light Nt = 800 for n in tqdm(range(Nt)): - # Initial conditions - zpos = int(Nz*n/(200)) + zpos = int(Nz * n / (200)) if zpos < Nz: - solver.J[int(Nx/2), Ny-10, zpos, 'z'] = 1.0*c_light - solver.J[int(Nx/2), 10, Nz-1-zpos, 'z'] = 1.0*c_light + solver.J[int(Nx / 2), Ny - 10, zpos, "z"] = 1.0 * c_light + solver.J[int(Nx / 2), 10, Nz - 1 - zpos, "z"] = 1.0 * c_light # Advance solver.one_step() if zpos < Nz: - solver.J[int(Nx/2), Ny-10, zpos, 'z'] = 0.0 - solver.J[int(Nx/2), 10, Nz-1-zpos, 'z'] = 0. + solver.J[int(Nx / 2), Ny - 10, zpos, "z"] = 0.0 + solver.J[int(Nx / 2), 10, Nz - 1 - zpos, "z"] = 0.0 # Plot - if n%10 == 0: - #plot_E_field(solver, n) + if n % 10 == 0: + # plot_E_field(solver, n) plot_H_field(solver, n) - - - diff --git a/examples/fit/script_noeb_fit.py b/examples/fit/script_noeb_fit.py index 75ce8fc..304408b 100644 --- a/examples/fit/script_noeb_fit.py +++ b/examples/fit/script_noeb_fit.py @@ -1,25 +1,20 @@ import numpy as np from scipy.constants import c as c_light, epsilon_0 as eps_0, mu_0 as mu_0 -import matplotlib + # matplotlib.use('Agg') from matplotlib import pyplot as plt -from matplotlib import patches -import os, sys from tqdm import tqdm from mpl_toolkits.axes_grid1 import make_axes_locatable -sys.path.append('../') from solverFIT3D import SolverFIT3D from solver3D import EMSolver3D from grid3D import Grid3D from conductors3d import noConductor -from scipy.special import jv -from field import Field Z0 = np.sqrt(mu_0 / eps_0) -L = 1. +L = 1.0 # Number of mesh cells N = 50 Nx = N @@ -32,147 +27,185 @@ dy = L / Ny dz = L / Nz -xmin = -Lx/2 + dx / 2 -xmax = Lx/2 + dx / 2 -ymin = - Ly/2 + dx / 2 -ymax = Ly/2 + dx / 2 -zmin = - Lz/2 + dx / 2 -zmax = Lz/2 + dx / 2 +xmin = -Lx / 2 + dx / 2 +xmax = Lx / 2 + dx / 2 +ymin = -Ly / 2 + dx / 2 +ymax = Ly / 2 + dx / 2 +zmin = -Lz / 2 + dx / 2 +zmax = Lz / 2 + dx / 2 conductors = noConductor() -bc_low=['Periodic', 'Periodic', 'Periodic'] -bc_high=['Periodic', 'Periodic', 'Periodic'] +bc_low = ["Periodic", "Periodic", "Periodic"] +bc_high = ["Periodic", "Periodic", "Periodic"] -#bc_low=['pec', 'pec', 'pec'] -#bc_high=['pec', 'pec', 'pec'] +# bc_low=['pec', 'pec', 'pec'] +# bc_high=['pec', 'pec', 'pec'] NCFL = 0.5 # set FIT solver -gridFIT = Grid3D(xmin, xmax, ymin, ymax, zmin, zmax, Nx, Ny, Nz, conductors, 'FIT') +gridFIT = Grid3D(xmin, xmax, ymin, ymax, zmin, zmax, Nx, Ny, Nz, conductors, "FIT") solverFIT = SolverFIT3D(gridFIT, bc_low=bc_low, bc_high=bc_high) # set FDTD solver -gridFDTD = Grid3D(xmin, xmax, ymin, ymax, zmin, zmax, Nx, Ny, Nz, conductors, 'FDTD') -solverFDTD = EMSolver3D(gridFDTD, 'FDTD', NCFL, bc_low=bc_low, bc_high=bc_high) +gridFDTD = Grid3D(xmin, xmax, ymin, ymax, zmin, zmax, Nx, Ny, Nz, conductors, "FDTD") +solverFDTD = EMSolver3D(gridFDTD, "FDTD", NCFL, bc_low=bc_low, bc_high=bc_high) # set source -xs, ys, zs = int(3*Nx/4), int(3*Ny/4), int(Nz//2) -solverFIT.E[xs, ys, zs, 'z'] = 1.0*c_light -solverFDTD.Ez[xs, ys, zs] = 1.0*c_light +xs, ys, zs = int(3 * Nx / 4), int(3 * Ny / 4), int(Nz // 2) +solverFIT.E[xs, ys, zs, "z"] = 1.0 * c_light +solverFDTD.Ez[xs, ys, zs] = 1.0 * c_light Nt = 150 -plane = 'XY' +plane = "XY" -if plane == 'XY': - x, y, z = slice(0,Nx), slice(0,Ny), int(Nz//2) #plane XY - title = '(x,y,Nz/2)' - xax, yax = 'y', 'x' +if plane == "XY": + x, y, z = slice(0, Nx), slice(0, Ny), int(Nz // 2) # plane XY + title = "(x,y,Nz/2)" + xax, yax = "y", "x" -if plane == 'YZ': - x, y, z = int(Nx//2), slice(0,Ny), slice(0,Nz) #plane YZ - title = '(Nx/2,y,z)' - xax, yax = 'z', 'y' +if plane == "YZ": + x, y, z = int(Nx // 2), slice(0, Ny), slice(0, Nz) # plane YZ + title = "(Nx/2,y,z)" + xax, yax = "z", "y" -def plot_E_field(solverFIT, solverFDTD, n): - fig, axs = plt.subplots(2,3, tight_layout=True, figsize=[8,6]) - dims = {0:'x', 1:'y', 2:'z'} - vmin, vmax = -1.e6, 1.e6 - #FIT +def plot_E_field(solverFIT, solverFDTD, n): + fig, axs = plt.subplots(2, 3, tight_layout=True, figsize=[8, 6]) + dims = {0: "x", 1: "y", 2: "z"} + vmin, vmax = -1.0e6, 1.0e6 + # FIT extent = (0, N, 0, N) - for i, ax in enumerate(axs[0,:]): - #vmin, vmax = -np.max(np.abs(solverFIT.E[x, y, z, dims[i]])), np.max(np.abs(solverFIT.E[x, y, z, dims[i]])) - im = ax.imshow(solverFIT.E[x, y, z, dims[i]], cmap='rainbow', vmin=vmin, vmax=vmax, extent=extent) - fig.colorbar(im, cax=make_axes_locatable(ax).append_axes('right', size='5%', pad=0.05)) - ax.set_title(f'FIT E{dims[i]}{title}') + for i, ax in enumerate(axs[0, :]): + # vmin, vmax = -np.max(np.abs(solverFIT.E[x, y, z, dims[i]])), np.max(np.abs(solverFIT.E[x, y, z, dims[i]])) + im = ax.imshow( + solverFIT.E[x, y, z, dims[i]], + cmap="rainbow", + vmin=vmin, + vmax=vmax, + extent=extent, + ) + fig.colorbar( + im, cax=make_axes_locatable(ax).append_axes("right", size="5%", pad=0.05) + ) + ax.set_title(f"FIT E{dims[i]}{title}") ax.set_xlabel(xax) ax.set_ylabel(yax) - #FDTD - ax = axs[1,0] + # FDTD + ax = axs[1, 0] extent = (0, N, 0, N) - #vmin, vmax = -np.max(np.abs(solverFDTD.Ex[x, y, z])), np.max(np.abs(solverFDTD.Ex[x, y, z])) - im = ax.imshow(solverFDTD.Ex[x, y, z], cmap='rainbow', vmin=vmin, vmax=vmax, extent=extent) - fig.colorbar(im, cax=make_axes_locatable(ax).append_axes('right', size='5%', pad=0.05)) - ax.set_title(f'FDTD Ex{title}') + # vmin, vmax = -np.max(np.abs(solverFDTD.Ex[x, y, z])), np.max(np.abs(solverFDTD.Ex[x, y, z])) + im = ax.imshow( + solverFDTD.Ex[x, y, z], cmap="rainbow", vmin=vmin, vmax=vmax, extent=extent + ) + fig.colorbar( + im, cax=make_axes_locatable(ax).append_axes("right", size="5%", pad=0.05) + ) + ax.set_title(f"FDTD Ex{title}") ax.set_xlabel(xax) ax.set_ylabel(yax) - ax = axs[1,1] + ax = axs[1, 1] extent = (0, N, 0, N) - #vmin, vmax = -np.max(np.abs(solverFDTD.Ey[x, y, z])), np.max(np.abs(solverFDTD.Ey[x, y, z])) - im = ax.imshow(solverFDTD.Ey[x, y, z], cmap='rainbow', vmin=vmin, vmax=vmax, extent=extent) - fig.colorbar(im, cax=make_axes_locatable(ax).append_axes('right', size='5%', pad=0.05)) - ax.set_title(f'FDTD Ey{title}') + # vmin, vmax = -np.max(np.abs(solverFDTD.Ey[x, y, z])), np.max(np.abs(solverFDTD.Ey[x, y, z])) + im = ax.imshow( + solverFDTD.Ey[x, y, z], cmap="rainbow", vmin=vmin, vmax=vmax, extent=extent + ) + fig.colorbar( + im, cax=make_axes_locatable(ax).append_axes("right", size="5%", pad=0.05) + ) + ax.set_title(f"FDTD Ey{title}") ax.set_xlabel(xax) ax.set_ylabel(yax) - ax = axs[1,2] + ax = axs[1, 2] extent = (0, N, 0, N) - #vmin, vmax = -np.max(np.abs(solverFDTD.Ez[x, y, z])), np.max(np.abs(solverFDTD.Ez[x, y, z])) - im = ax.imshow(solverFDTD.Ez[x, y, z], cmap='rainbow', vmin=vmin, vmax=vmax, extent=extent) - fig.colorbar(im, cax=make_axes_locatable(ax).append_axes('right', size='5%', pad=0.05)) - ax.set_title(f'FDTD Ez{title}') + # vmin, vmax = -np.max(np.abs(solverFDTD.Ez[x, y, z])), np.max(np.abs(solverFDTD.Ez[x, y, z])) + im = ax.imshow( + solverFDTD.Ez[x, y, z], cmap="rainbow", vmin=vmin, vmax=vmax, extent=extent + ) + fig.colorbar( + im, cax=make_axes_locatable(ax).append_axes("right", size="5%", pad=0.05) + ) + ax.set_title(f"FDTD Ez{title}") ax.set_xlabel(xax) ax.set_ylabel(yax) - - fig.suptitle(f'E field, timestep={n}') - fig.savefig('imgE/'+str(n).zfill(4)+'.png') + fig.suptitle(f"E field, timestep={n}") + fig.savefig("imgE/" + str(n).zfill(4) + ".png") plt.clf() plt.close(fig) -def plot_H_field(solverFIT, solverFDTD, n): - fig, axs = plt.subplots(2,3, tight_layout=True, figsize=[8,6]) - dims = {0:'x', 1:'y', 2:'z'} +def plot_H_field(solverFIT, solverFDTD, n): + fig, axs = plt.subplots(2, 3, tight_layout=True, figsize=[8, 6]) + dims = {0: "x", 1: "y", 2: "z"} extent = (0, N, 0, N) vmin, vmax = -5e3, 5e3 - #FIT - for i, ax in enumerate(axs[0,:]): - #vmin, vmax = -np.max(np.abs(solverFIT.H[x, y, z, dims[i]])), np.max(np.abs(solverFIT.H[x, y, z, dims[i]])) - im = ax.imshow(solverFIT.H[x, y, z, dims[i]], cmap='rainbow', vmin=vmin, vmax=vmax, extent=extent) - fig.colorbar(im, cax=make_axes_locatable(ax).append_axes('right', size='5%', pad=0.05)) - ax.set_title(f'FIT H{dims[i]}{title}') + # FIT + for i, ax in enumerate(axs[0, :]): + # vmin, vmax = -np.max(np.abs(solverFIT.H[x, y, z, dims[i]])), np.max(np.abs(solverFIT.H[x, y, z, dims[i]])) + im = ax.imshow( + solverFIT.H[x, y, z, dims[i]], + cmap="rainbow", + vmin=vmin, + vmax=vmax, + extent=extent, + ) + fig.colorbar( + im, cax=make_axes_locatable(ax).append_axes("right", size="5%", pad=0.05) + ) + ax.set_title(f"FIT H{dims[i]}{title}") ax.set_xlabel(xax) ax.set_ylabel(yax) - #FDTD - ax = axs[1,0] - #vmin, vmax = -np.max(np.abs(solverFDTD.Hx[x, y, z])), np.max(np.abs(solverFDTD.Hx[x, y, z])) - im = ax.imshow(solverFDTD.Hx[x, y, z], cmap='rainbow', vmin=vmin, vmax=vmax, extent=extent) - fig.colorbar(im, cax=make_axes_locatable(ax).append_axes('right', size='5%', pad=0.05)) - ax.set_title(f'FDTD Hx{title}') + # FDTD + ax = axs[1, 0] + # vmin, vmax = -np.max(np.abs(solverFDTD.Hx[x, y, z])), np.max(np.abs(solverFDTD.Hx[x, y, z])) + im = ax.imshow( + solverFDTD.Hx[x, y, z], cmap="rainbow", vmin=vmin, vmax=vmax, extent=extent + ) + fig.colorbar( + im, cax=make_axes_locatable(ax).append_axes("right", size="5%", pad=0.05) + ) + ax.set_title(f"FDTD Hx{title}") ax.set_xlabel(xax) ax.set_ylabel(yax) - ax = axs[1,1] - #vmin, vmax = -np.max(np.abs(solverFDTD.Hy[x, y, z])), np.max(np.abs(solverFDTD.Hy[x, y, z])) - im = ax.imshow(solverFDTD.Hy[x, y, z], cmap='rainbow', vmin=vmin, vmax=vmax, extent=extent) - fig.colorbar(im, cax=make_axes_locatable(ax).append_axes('right', size='5%', pad=0.05)) - ax.set_title(f'FDTD Hy{title}') + ax = axs[1, 1] + # vmin, vmax = -np.max(np.abs(solverFDTD.Hy[x, y, z])), np.max(np.abs(solverFDTD.Hy[x, y, z])) + im = ax.imshow( + solverFDTD.Hy[x, y, z], cmap="rainbow", vmin=vmin, vmax=vmax, extent=extent + ) + fig.colorbar( + im, cax=make_axes_locatable(ax).append_axes("right", size="5%", pad=0.05) + ) + ax.set_title(f"FDTD Hy{title}") ax.set_xlabel(xax) ax.set_ylabel(yax) - ax = axs[1,2] - #vmin, vmax = -np.max(np.abs(solverFDTD.Hz[x, y, z])), np.max(np.abs(solverFDTD.Hz[x, y, z])) - im = ax.imshow(solverFDTD.Hz[x, y, z], cmap='rainbow', vmin=vmin, vmax=vmax, extent=extent) - fig.colorbar(im, cax=make_axes_locatable(ax).append_axes('right', size='5%', pad=0.05)) - ax.set_title(f'FDTD Hz{title}') + ax = axs[1, 2] + # vmin, vmax = -np.max(np.abs(solverFDTD.Hz[x, y, z])), np.max(np.abs(solverFDTD.Hz[x, y, z])) + im = ax.imshow( + solverFDTD.Hz[x, y, z], cmap="rainbow", vmin=vmin, vmax=vmax, extent=extent + ) + fig.colorbar( + im, cax=make_axes_locatable(ax).append_axes("right", size="5%", pad=0.05) + ) + ax.set_title(f"FDTD Hz{title}") ax.set_xlabel(xax) ax.set_ylabel(yax) - fig.suptitle(f'H field, timestep={n}') - fig.savefig('imgH/'+str(n).zfill(4)+'.png') + fig.suptitle(f"H field, timestep={n}") + fig.savefig("imgH/" + str(n).zfill(4) + ".png") plt.clf() plt.close(fig) -for n in tqdm(range(Nt)): +for n in tqdm(range(Nt)): solverFIT.one_step() solverFDTD.one_step() plot_E_field(solverFIT, solverFDTD, n) plot_H_field(solverFIT, solverFDTD, n) - diff --git a/examples/fit/script_noeb_resonator_analytic.py b/examples/fit/script_noeb_resonator_analytic.py index 7f611b9..5d0b21d 100644 --- a/examples/fit/script_noeb_resonator_analytic.py +++ b/examples/fit/script_noeb_resonator_analytic.py @@ -1,63 +1,97 @@ import numpy as np from scipy.constants import c as c_light, epsilon_0 as eps_0, mu_0 as mu_0 -import matplotlib + # matplotlib.use('Agg') from matplotlib import pyplot as plt -from matplotlib import patches -import os, sys from tqdm import tqdm from mpl_toolkits.axes_grid1 import make_axes_locatable -sys.path.append('../') from solverFIT3D import SolverFIT3D from solver3D import EMSolver3D from grid3D import Grid3D -from conductors3d import noConductor, InCube, ConductorsAssembly -from scipy.special import jv -from field import Field +from conductors3d import noConductor -#----- TE Funtions -----# +# ----- TE Funtions -----# m = 1 n = 0 p = 1 -theta = 0 #np.pi/8 +theta = 0 # np.pi/8 # Analytic solution of cubic resonator # Ref: http://faculty.pccu.edu.tw/~meng/new%20EM6.pdf pp.20/24 + def analytic_sol_Hz(x, y, z, t): - Rm = np.array([[np.cos(-theta), - np.sin(-theta), 0],[np.sin(-theta), np.cos(-theta), 0], [0, 0, 1]]) + Rm = np.array( + [ + [np.cos(-theta), -np.sin(-theta), 0], + [np.sin(-theta), np.cos(-theta), 0], + [0, 0, 1], + ] + ) [x_0, y_0, z_0] = np.dot(Rm, np.array([x, y, z])) - return np.cos(m * np.pi / Lx * (x_0 - Lx/2)) * np.cos(n * np.pi / Ly * (y_0 - Ly/2)) * np.sin( - p * np.pi / Lz * (z_0 - Lz/2)) * np.cos(np.sqrt(2) * np.pi / Lx * c_light * t) + return ( + np.cos(m * np.pi / Lx * (x_0 - Lx / 2)) + * np.cos(n * np.pi / Ly * (y_0 - Ly / 2)) + * np.sin(p * np.pi / Lz * (z_0 - Lz / 2)) + * np.cos(np.sqrt(2) * np.pi / Lx * c_light * t) + ) + def analytic_sol_Hy(x, y, z, t): - Rm = np.array([[np.cos(-theta), - np.sin(-theta), 0],[np.sin(-theta), np.cos(-theta), 0], [0, 0, 1]]) + Rm = np.array( + [ + [np.cos(-theta), -np.sin(-theta), 0], + [np.sin(-theta), np.cos(-theta), 0], + [0, 0, 1], + ] + ) [x_0, y_0, z_0] = np.dot(Rm, np.array([x, y, z])) h_2 = (m * np.pi / Lx) ** 2 + (n * np.pi / Ly) ** 2 + (p * np.pi / Lz) ** 2 - return -2 / h_2 * (n * np.pi / Ly) * (p * np.pi / Lz) * np.cos(m * np.pi / Lx * (x_0 - Lx/2)) * np.sin( - n * np.pi / Ly * (y_0 - Ly/2)) * np.cos(p * np.pi / Lz * (z_0 - Lz/2)) * np.cos( - np.sqrt(2) * np.pi / Lx * c_light * t) + return ( + -2 + / h_2 + * (n * np.pi / Ly) + * (p * np.pi / Lz) + * np.cos(m * np.pi / Lx * (x_0 - Lx / 2)) + * np.sin(n * np.pi / Ly * (y_0 - Ly / 2)) + * np.cos(p * np.pi / Lz * (z_0 - Lz / 2)) + * np.cos(np.sqrt(2) * np.pi / Lx * c_light * t) + ) + def analytic_sol_Hx(x, y, z, t): - Rm = np.array([[np.cos(-theta), - np.sin(-theta), 0],[np.sin(-theta), np.cos(-theta), 0], [0, 0, 1]]) + Rm = np.array( + [ + [np.cos(-theta), -np.sin(-theta), 0], + [np.sin(-theta), np.cos(-theta), 0], + [0, 0, 1], + ] + ) [x_0, y_0, z_0] = np.dot(Rm, np.array([x, y, z])) h_2 = (m * np.pi / Lx) ** 2 + (n * np.pi / Ly) ** 2 + (p * np.pi / Lz) ** 2 - return -2 / h_2 * (m * np.pi / Lx) * (p * np.pi / Lz) * np.sin(m * np.pi / Lx * (x_0 - Lx/2)) * np.cos( - n * np.pi / Ly * (y_0 - Ly/2)) * np.cos(p * np.pi / Lz * (z_0 - Lz/2)) * np.cos( - np.sqrt(2) * np.pi / Lx * c_light * t) + return ( + -2 + / h_2 + * (m * np.pi / Lx) + * (p * np.pi / Lz) + * np.sin(m * np.pi / Lx * (x_0 - Lx / 2)) + * np.cos(n * np.pi / Ly * (y_0 - Ly / 2)) + * np.cos(p * np.pi / Lz * (z_0 - Lz / 2)) + * np.cos(np.sqrt(2) * np.pi / Lx * c_light * t) + ) -#---- Domain definition ----# +# ---- Domain definition ----# Z0 = np.sqrt(mu_0 / eps_0) -L = 1. # Domain length -N = 50 # Number of mesh cells +L = 1.0 # Domain length +N = 50 # Number of mesh cells Nx = N Ny = N @@ -69,26 +103,27 @@ def analytic_sol_Hx(x, y, z, t): dy = L / Ny dz = L / Nz -xmin = -Lx/2 -xmax = Lx/2 -ymin = - Ly/2 -ymax = Ly/2 -zmin = - Lz/2 -zmax = Lz/2 +xmin = -Lx / 2 +xmax = Lx / 2 +ymin = -Ly / 2 +ymax = Ly / 2 +zmin = -Lz / 2 +zmax = Lz / 2 -#---- Plotting functions ----# -folder ='imgRes' -plane = 'XY' +# ---- Plotting functions ----# +folder = "imgRes" +plane = "XY" -if plane == 'XY': - xx, yy, zz = slice(0,Nx), slice(0,Ny), int(Nz//2) #plane XY - title = '(x,y,Nz/2)' - xax, yax = 'y', 'x' +if plane == "XY": + xx, yy, zz = slice(0, Nx), slice(0, Ny), int(Nz // 2) # plane XY + title = "(x,y,Nz/2)" + xax, yax = "y", "x" + +if plane == "YZ": + xx, yy, zz = int(Nx // 2), slice(0, Ny), slice(0, Nz) # plane YZ + title = "(Nx/2,y,z)" + xax, yax = "z", "y" -if plane == 'YZ': - xx, yy, zz = int(Nx//2), slice(0,Ny), slice(0,Nz) #plane YZ - title = '(Nx/2,y,z)' - xax, yax = 'z', 'y' def get_analytic_H(analytic, n): dx, dy, dz = analytic.dx, analytic.dy, analytic.dz @@ -98,123 +133,165 @@ def get_analytic_H(analytic, n): for ii in range(Nx): for jj in range(Ny): for kk in range(Nz): + x = (ii + 0.5) * dx + xmin + y = (jj + 0.5) * dy + ymin + z = (kk + 0.5) * dz + zmin + analytic.H[ii, jj, kk, "z"] = analytic_sol_Hz( + x, y, z, (n - 0.5) * solverFIT.dt + ) + analytic.H[ii, jj, kk, "y"] = analytic_sol_Hy( + x, y, z, (n - 0.5) * solverFIT.dt + ) + analytic.H[ii, jj, kk, "x"] = analytic_sol_Hx( + x, y, z, (n - 0.5) * solverFIT.dt + ) - x = (ii+0.5) * dx + xmin - y = (jj+0.5) * dy + ymin - z = (kk+0.5) * dz + zmin - analytic.H[ii, jj, kk, 'z'] = analytic_sol_Hz(x, y, z, (n-0.5) * solverFIT.dt) - analytic.H[ii, jj, kk, 'y'] = analytic_sol_Hy(x, y, z, (n-0.5) * solverFIT.dt) - analytic.H[ii, jj, kk, 'x'] = analytic_sol_Hx(x, y, z, (n-0.5) * solverFIT.dt) def plot_E_field(solverFIT, solverFDTD, n): + fig, axs = plt.subplots(2, 3, figsize=[8, 6]) + dims = {0: "x", 1: "y", 2: "z"} + vmin, vmax = -500.0, 500.0 - fig, axs = plt.subplots(2,3, figsize=[8,6]) - dims = {0:'x', 1:'y', 2:'z'} - vmin, vmax = -500., 500. - - #FIT + # FIT extent = (0, N, 0, N) - for i, ax in enumerate(axs[0,:]): - #vmin, vmax = -np.max(np.abs(solverFIT.E[xx, yy, zz, dims[i]])), np.max(np.abs(solverFIT.E[xx, yy, zz, dims[i]])) - im = ax.imshow(solverFIT.E[xx, yy, zz, dims[i]], cmap='rainbow', vmin=vmin, vmax=vmax, extent=extent) - fig.colorbar(im, cax=make_axes_locatable(ax).append_axes('right', size='5%', pad=0.05)) - ax.set_title(f'FIT E{dims[i]}{title}') + for i, ax in enumerate(axs[0, :]): + # vmin, vmax = -np.max(np.abs(solverFIT.E[xx, yy, zz, dims[i]])), np.max(np.abs(solverFIT.E[xx, yy, zz, dims[i]])) + im = ax.imshow( + solverFIT.E[xx, yy, zz, dims[i]], + cmap="rainbow", + vmin=vmin, + vmax=vmax, + extent=extent, + ) + fig.colorbar( + im, cax=make_axes_locatable(ax).append_axes("right", size="5%", pad=0.05) + ) + ax.set_title(f"FIT E{dims[i]}{title}") ax.set_xlabel(xax) ax.set_ylabel(yax) - #FDTD - ax = axs[1,0] + # FDTD + ax = axs[1, 0] extent = (0, N, 0, N) - #vmin, vmax = -np.max(np.abs(solverFDTD.Ex[xx, yy, zz])), np.max(np.abs(solverFDTD.Ex[xx, yy, zz])) - im = ax.imshow(solverFDTD.Ex[xx, yy, zz], cmap='rainbow', vmin=vmin, vmax=vmax, extent=extent) - fig.colorbar(im, cax=make_axes_locatable(ax).append_axes('right', size='5%', pad=0.05)) - ax.set_title(f'FDTD Ex{title}') + # vmin, vmax = -np.max(np.abs(solverFDTD.Ex[xx, yy, zz])), np.max(np.abs(solverFDTD.Ex[xx, yy, zz])) + im = ax.imshow( + solverFDTD.Ex[xx, yy, zz], cmap="rainbow", vmin=vmin, vmax=vmax, extent=extent + ) + fig.colorbar( + im, cax=make_axes_locatable(ax).append_axes("right", size="5%", pad=0.05) + ) + ax.set_title(f"FDTD Ex{title}") ax.set_xlabel(xax) ax.set_ylabel(yax) - ax = axs[1,1] + ax = axs[1, 1] extent = (0, N, 0, N) - #vmin, vmax = -np.max(np.abs(solverFDTD.Ey[xx, yy, zz])), np.max(np.abs(solverFDTD.Ey[xx, yy, zz])) - im = ax.imshow(solverFDTD.Ey[xx, yy, zz], cmap='rainbow', vmin=vmin, vmax=vmax, extent=extent) - fig.colorbar(im, cax=make_axes_locatable(ax).append_axes('right', size='5%', pad=0.05)) - ax.set_title(f'FDTD Ey{title}') + # vmin, vmax = -np.max(np.abs(solverFDTD.Ey[xx, yy, zz])), np.max(np.abs(solverFDTD.Ey[xx, yy, zz])) + im = ax.imshow( + solverFDTD.Ey[xx, yy, zz], cmap="rainbow", vmin=vmin, vmax=vmax, extent=extent + ) + fig.colorbar( + im, cax=make_axes_locatable(ax).append_axes("right", size="5%", pad=0.05) + ) + ax.set_title(f"FDTD Ey{title}") ax.set_xlabel(xax) ax.set_ylabel(yax) - ax = axs[1,2] + ax = axs[1, 2] extent = (0, N, 0, N) - #vmin, vmax = -np.max(np.abs(solverFDTD.Ez[xx, yy, zz])), np.max(np.abs(solverFDTD.Ez[xx, yy, zz])) - im = ax.imshow(solverFDTD.Ez[xx, yy, zz], cmap='rainbow', vmin=vmin, vmax=vmax, extent=extent) - fig.colorbar(im, cax=make_axes_locatable(ax).append_axes('right', size='5%', pad=0.05)) - ax.set_title(f'FDTD Ez{title}') + # vmin, vmax = -np.max(np.abs(solverFDTD.Ez[xx, yy, zz])), np.max(np.abs(solverFDTD.Ez[xx, yy, zz])) + im = ax.imshow( + solverFDTD.Ez[xx, yy, zz], cmap="rainbow", vmin=vmin, vmax=vmax, extent=extent + ) + fig.colorbar( + im, cax=make_axes_locatable(ax).append_axes("right", size="5%", pad=0.05) + ) + ax.set_title(f"FDTD Ez{title}") ax.set_xlabel(xax) ax.set_ylabel(yax) fig.tight_layout(h_pad=0.3) - fig.suptitle(f'E field, timestep={n}') - fig.savefig(f'{folder}E/'+str(n).zfill(4)+'.png') + fig.suptitle(f"E field, timestep={n}") + fig.savefig(f"{folder}E/" + str(n).zfill(4) + ".png") plt.clf() plt.close(fig) + def plot_H_field(solverFIT, solverFDTD, analytic, n): - get_analytic_H(analytic, n) - fig, axs = plt.subplots(3,3, tight_layout=True, figsize=[8,6]) - dims = {0:'x', 1:'y', 2:'z'} - #lims = {0: np.max(np.abs(analytic.Hx[xx, yy, zz])), 1: np.max(np.abs(analytic.Hy[xx, yy, zz])), 2: np.max(np.abs(analytic.Hz[xx, yy, zz]))} - lims = {0: 0.1, 1: 0.01, 2: 1.} - #vmin, vmax = -1., 1. + fig, axs = plt.subplots(3, 3, tight_layout=True, figsize=[8, 6]) + dims = {0: "x", 1: "y", 2: "z"} + # lims = {0: np.max(np.abs(analytic.Hx[xx, yy, zz])), 1: np.max(np.abs(analytic.Hy[xx, yy, zz])), 2: np.max(np.abs(analytic.Hz[xx, yy, zz]))} + lims = {0: 0.1, 1: 0.01, 2: 1.0} + # vmin, vmax = -1., 1. - #FIT - for i, ax in enumerate(axs[0,:]): - #vmin, vmax = -np.max(np.abs(solverFIT.H[xx, yy, zz, dims[i]])), np.max(np.abs(solverFIT.H[xx, yy, zz, dims[i]])) + # FIT + for i, ax in enumerate(axs[0, :]): + # vmin, vmax = -np.max(np.abs(solverFIT.H[xx, yy, zz, dims[i]])), np.max(np.abs(solverFIT.H[xx, yy, zz, dims[i]])) vmin, vmax = -lims[i], lims[i] - im = ax.imshow(solverFIT.H[xx, yy, int(Nz//2-1), dims[i]], cmap='rainbow', vmin=vmin, vmax=vmax) - fig.colorbar(im, cax=make_axes_locatable(ax).append_axes('right', size='5%', pad=0.05)) - ax.set_title(f'FIT H{dims[i]}{title}') + im = ax.imshow( + solverFIT.H[xx, yy, int(Nz // 2 - 1), dims[i]], + cmap="rainbow", + vmin=vmin, + vmax=vmax, + ) + fig.colorbar( + im, cax=make_axes_locatable(ax).append_axes("right", size="5%", pad=0.05) + ) + ax.set_title(f"FIT H{dims[i]}{title}") ax.set_xlabel(xax) ax.set_ylabel(yax) - #FDTD - ax = axs[1,0] - #vmin, vmax = -np.max(np.abs(solverFDTD.Hx[xx, yy, zz])), np.max(np.abs(solverFDTD.Hx[xx, yy, zz])) + # FDTD + ax = axs[1, 0] + # vmin, vmax = -np.max(np.abs(solverFDTD.Hx[xx, yy, zz])), np.max(np.abs(solverFDTD.Hx[xx, yy, zz])) vmin, vmax = -lims[0], lims[0] - im = ax.imshow(solverFDTD.Hx[xx, yy, zz], cmap='rainbow', vmin=vmin, vmax=vmax) - fig.colorbar(im, cax=make_axes_locatable(ax).append_axes('right', size='5%', pad=0.05)) - ax.set_title(f'FDTD Hx{title}') + im = ax.imshow(solverFDTD.Hx[xx, yy, zz], cmap="rainbow", vmin=vmin, vmax=vmax) + fig.colorbar( + im, cax=make_axes_locatable(ax).append_axes("right", size="5%", pad=0.05) + ) + ax.set_title(f"FDTD Hx{title}") ax.set_xlabel(xax) ax.set_ylabel(yax) - ax = axs[1,1] + ax = axs[1, 1] vmin, vmax = -lims[1], lims[1] - #vmin, vmax = -np.max(np.abs(solverFDTD.Hy[xx, yy, zz])), np.max(np.abs(solverFDTD.Hy[xx, yy, zz])) - im = ax.imshow(solverFDTD.Hy[xx, yy, zz], cmap='rainbow', vmin=vmin, vmax=vmax) - fig.colorbar(im, cax=make_axes_locatable(ax).append_axes('right', size='5%', pad=0.05)) - ax.set_title(f'FDTD Hy{title}') + # vmin, vmax = -np.max(np.abs(solverFDTD.Hy[xx, yy, zz])), np.max(np.abs(solverFDTD.Hy[xx, yy, zz])) + im = ax.imshow(solverFDTD.Hy[xx, yy, zz], cmap="rainbow", vmin=vmin, vmax=vmax) + fig.colorbar( + im, cax=make_axes_locatable(ax).append_axes("right", size="5%", pad=0.05) + ) + ax.set_title(f"FDTD Hy{title}") ax.set_xlabel(xax) ax.set_ylabel(yax) - ax = axs[1,2] + ax = axs[1, 2] vmin, vmax = -lims[2], lims[2] - #vmin, vmax = -np.max(np.abs(solverFDTD.Hz[xx, yy, zz])), np.max(np.abs(solverFDTD.Hz[xx, yy, zz])) - im = ax.imshow(solverFDTD.Hz[xx, yy, zz], cmap='rainbow', vmin=vmin, vmax=vmax) - fig.colorbar(im, cax=make_axes_locatable(ax).append_axes('right', size='5%', pad=0.05)) - ax.set_title(f'FDTD Hz{title}') + # vmin, vmax = -np.max(np.abs(solverFDTD.Hz[xx, yy, zz])), np.max(np.abs(solverFDTD.Hz[xx, yy, zz])) + im = ax.imshow(solverFDTD.Hz[xx, yy, zz], cmap="rainbow", vmin=vmin, vmax=vmax) + fig.colorbar( + im, cax=make_axes_locatable(ax).append_axes("right", size="5%", pad=0.05) + ) + ax.set_title(f"FDTD Hz{title}") ax.set_xlabel(xax) ax.set_ylabel(yax) - #Analytic - for i, ax in enumerate(axs[2,:]): + # Analytic + for i, ax in enumerate(axs[2, :]): vmin, vmax = -lims[i], lims[i] - im = ax.imshow(analytic.H[xx, yy, zz, dims[i]], cmap='rainbow', vmin=vmin, vmax=vmax) - fig.colorbar(im, cax=make_axes_locatable(ax).append_axes('right', size='5%', pad=0.05)) - ax.set_title(f'Analytic H{dims[i]}{title}') + im = ax.imshow( + analytic.H[xx, yy, zz, dims[i]], cmap="rainbow", vmin=vmin, vmax=vmax + ) + fig.colorbar( + im, cax=make_axes_locatable(ax).append_axes("right", size="5%", pad=0.05) + ) + ax.set_title(f"Analytic H{dims[i]}{title}") ax.set_xlabel(xax) ax.set_ylabel(yax) - fig.suptitle(f'H Field, timestep={n}') - fig.savefig(f'{folder}H/'+str(n).zfill(4)+'.png') + fig.suptitle(f"H Field, timestep={n}") + fig.savefig(f"{folder}H/" + str(n).zfill(4) + ".png") plt.clf() plt.close(fig) @@ -222,23 +299,25 @@ def plot_H_field(solverFIT, solverFDTD, analytic, n): # ---- Grid definitions ---------# conductors = noConductor() -bc_low=['pec', 'pec', 'pec'] -bc_high=['pec', 'pec', 'pec'] +bc_low = ["pec", "pec", "pec"] +bc_high = ["pec", "pec", "pec"] -gridFDTD = Grid3D(xmin, xmax, ymin, ymax, zmin, zmax, Nx, Ny, Nz, conductors, 'FDTD') -solverFDTD = EMSolver3D(gridFDTD, 'FDTD') +gridFDTD = Grid3D(xmin, xmax, ymin, ymax, zmin, zmax, Nx, Ny, Nz, conductors, "FDTD") +solverFDTD = EMSolver3D(gridFDTD, "FDTD") del gridFDTD -grid = Grid3D(xmin, xmax, ymin, ymax, zmin, zmax, Nx, Ny, Nz, conductors, 'FIT') +grid = Grid3D(xmin, xmax, ymin, ymax, zmin, zmax, Nx, Ny, Nz, conductors, "FIT") analytic = SolverFIT3D(grid, bc_low=bc_low, bc_high=bc_high) del grid -gridFIT = Grid3D(xmin, xmax, ymin, ymax, zmin, zmax, Nx+1, Ny+1, Nz+1, conductors, 'FIT') +gridFIT = Grid3D( + xmin, xmax, ymin, ymax, zmin, zmax, Nx + 1, Ny + 1, Nz + 1, conductors, "FIT" +) solverFIT = SolverFIT3D(gridFIT, bc_low=bc_low, bc_high=bc_high) del gridFIT solverFIT.dt = solverFDTD.dt -#---- Initial conditions ------------# +# ---- Initial conditions ------------# for ii in range(Nx): for jj in range(Ny): @@ -251,7 +330,7 @@ def plot_H_field(solverFIT, solverFDTD, analytic, n): x = (ii + 0.5) * dx + xmin y = (jj + 0.5) * dy + ymin z = (kk + 0.5) * dz + zmin - solverFIT.H[ii, jj, kk, 'z'] = analytic_sol_Hz(x, y, z, -0.5 * solverFIT.dt) + solverFIT.H[ii, jj, kk, "z"] = analytic_sol_Hz(x, y, z, -0.5 * solverFIT.dt) x = (ii + 0.5) * dx + xmin y = (jj + 0.5) * dy + ymin @@ -261,9 +340,9 @@ def plot_H_field(solverFIT, solverFDTD, analytic, n): x = (ii + 0.5) * dx + xmin y = (jj + 0.5) * dy + ymin z = (kk + 0.5) * dz + zmin - solverFIT.H[ii, jj, kk, 'y'] = analytic_sol_Hy(x, y, z, -0.5 * solverFIT.dt) + solverFIT.H[ii, jj, kk, "y"] = analytic_sol_Hy(x, y, z, -0.5 * solverFIT.dt) - x = ii*dx + xmin + x = ii * dx + xmin y = (jj + 0.5) * dy + ymin z = (kk + 0.5) * dz + zmin solverFDTD.Hx[ii, jj, kk] = analytic_sol_Hx(x, y, z, -0.5 * solverFDTD.dt) @@ -271,18 +350,17 @@ def plot_H_field(solverFIT, solverFDTD, analytic, n): x = (ii + 0.5) * dx + xmin y = (jj + 0.5) * dy + ymin z = (kk + 0.5) * dz + zmin - solverFIT.H[ii, jj, kk, 'x'] = analytic_sol_Hx(x, y, z, -0.5 * solverFIT.dt) + solverFIT.H[ii, jj, kk, "x"] = analytic_sol_Hx(x, y, z, -0.5 * solverFIT.dt) -#----- Time loop -----# +# ----- Time loop -----# Nt = 260 for nt in tqdm(range(Nt)): - solverFIT.one_step() solverFDTD.one_step() - #plot_E_field(solverFIT, solverFDTD, nt) - if nt%2 == 0: + # plot_E_field(solverFIT, solverFDTD, nt) + if nt % 2 == 0: plot_H_field(solverFIT, solverFDTD, analytic, nt) -#convert -delay 5 -loop 0 *.png H_noeb.gif \ No newline at end of file +# convert -delay 5 -loop 0 *.png H_noeb.gif diff --git a/examples/fit/script_noeb_resonator_fit.py b/examples/fit/script_noeb_resonator_fit.py index 95453eb..2a3da1d 100644 --- a/examples/fit/script_noeb_resonator_fit.py +++ b/examples/fit/script_noeb_resonator_fit.py @@ -1,63 +1,97 @@ import numpy as np from scipy.constants import c as c_light, epsilon_0 as eps_0, mu_0 as mu_0 -import matplotlib + # matplotlib.use('Agg') from matplotlib import pyplot as plt -from matplotlib import patches -import os, sys from tqdm import tqdm from mpl_toolkits.axes_grid1 import make_axes_locatable -sys.path.append('../') from solverFIT3D import SolverFIT3D from solver3D import EMSolver3D from grid3D import Grid3D -from conductors3d import noConductor, InCube, ConductorsAssembly -from scipy.special import jv -from field import Field +from conductors3d import noConductor -#----- TE Funtions -----# +# ----- TE Funtions -----# m = 1 n = 1 p = 1 -theta = 0 #np.pi/8 +theta = 0 # np.pi/8 # Analytic solution of cubic resonator # Ref: http://faculty.pccu.edu.tw/~meng/new%20EM6.pdf pp.20/24 + def analytic_sol_Hz(x, y, z, t): - Rm = np.array([[np.cos(-theta), - np.sin(-theta), 0],[np.sin(-theta), np.cos(-theta), 0], [0, 0, 1]]) + Rm = np.array( + [ + [np.cos(-theta), -np.sin(-theta), 0], + [np.sin(-theta), np.cos(-theta), 0], + [0, 0, 1], + ] + ) [x_0, y_0, z_0] = np.dot(Rm, np.array([x, y, z])) - return np.cos(m * np.pi / Lx * (x_0 - Lx/2)) * np.cos(n * np.pi / Ly * (y_0 - Ly/2)) * np.sin( - p * np.pi / Lz * (z_0 - Lz/2)) * np.cos(np.sqrt(2) * np.pi / Lx * c_light * t) + return ( + np.cos(m * np.pi / Lx * (x_0 - Lx / 2)) + * np.cos(n * np.pi / Ly * (y_0 - Ly / 2)) + * np.sin(p * np.pi / Lz * (z_0 - Lz / 2)) + * np.cos(np.sqrt(2) * np.pi / Lx * c_light * t) + ) + def analytic_sol_Hy(x, y, z, t): - Rm = np.array([[np.cos(-theta), - np.sin(-theta), 0],[np.sin(-theta), np.cos(-theta), 0], [0, 0, 1]]) + Rm = np.array( + [ + [np.cos(-theta), -np.sin(-theta), 0], + [np.sin(-theta), np.cos(-theta), 0], + [0, 0, 1], + ] + ) [x_0, y_0, z_0] = np.dot(Rm, np.array([x, y, z])) h_2 = (m * np.pi / Lx) ** 2 + (n * np.pi / Ly) ** 2 + (p * np.pi / Lz) ** 2 - return -2 / h_2 * (n * np.pi / Ly) * (p * np.pi / Lz) * np.cos(m * np.pi / Lx * (x_0 - Lx/2)) * np.sin( - n * np.pi / Ly * (y_0 - Ly/2)) * np.cos(p * np.pi / Lz * (z_0 - Lz/2)) * np.cos( - np.sqrt(2) * np.pi / Lx * c_light * t) + return ( + -2 + / h_2 + * (n * np.pi / Ly) + * (p * np.pi / Lz) + * np.cos(m * np.pi / Lx * (x_0 - Lx / 2)) + * np.sin(n * np.pi / Ly * (y_0 - Ly / 2)) + * np.cos(p * np.pi / Lz * (z_0 - Lz / 2)) + * np.cos(np.sqrt(2) * np.pi / Lx * c_light * t) + ) + def analytic_sol_Hx(x, y, z, t): - Rm = np.array([[np.cos(-theta), - np.sin(-theta), 0],[np.sin(-theta), np.cos(-theta), 0], [0, 0, 1]]) + Rm = np.array( + [ + [np.cos(-theta), -np.sin(-theta), 0], + [np.sin(-theta), np.cos(-theta), 0], + [0, 0, 1], + ] + ) [x_0, y_0, z_0] = np.dot(Rm, np.array([x, y, z])) h_2 = (m * np.pi / Lx) ** 2 + (n * np.pi / Ly) ** 2 + (p * np.pi / Lz) ** 2 - return -2 / h_2 * (m * np.pi / Lx) * (p * np.pi / Lz) * np.sin(m * np.pi / Lx * (x_0 - Lx/2)) * np.cos( - n * np.pi / Ly * (y_0 - Ly/2)) * np.cos(p * np.pi / Lz * (z_0 - Lz/2)) * np.cos( - np.sqrt(2) * np.pi / Lx * c_light * t) + return ( + -2 + / h_2 + * (m * np.pi / Lx) + * (p * np.pi / Lz) + * np.sin(m * np.pi / Lx * (x_0 - Lx / 2)) + * np.cos(n * np.pi / Ly * (y_0 - Ly / 2)) + * np.cos(p * np.pi / Lz * (z_0 - Lz / 2)) + * np.cos(np.sqrt(2) * np.pi / Lx * c_light * t) + ) -#---- Domain definition ----# +# ---- Domain definition ----# Z0 = np.sqrt(mu_0 / eps_0) -L = 1. # Domain length -N = 30 # Number of mesh cells +L = 1.0 # Domain length +N = 30 # Number of mesh cells Nx = N Ny = N @@ -69,138 +103,181 @@ def analytic_sol_Hx(x, y, z, t): dy = L / Ny dz = L / Nz -xmin = -Lx/2 + dx / 2 -xmax = Lx/2 + dx / 2 -ymin = - Ly/2 + dy / 2 -ymax = Ly/2 + dy / 2 -zmin = - Lz/2 + dz / 2 -zmax = Lz/2 + dz / 2 +xmin = -Lx / 2 + dx / 2 +xmax = Lx / 2 + dx / 2 +ymin = -Ly / 2 + dy / 2 +ymax = Ly / 2 + dy / 2 +zmin = -Lz / 2 + dz / 2 +zmax = Lz / 2 + dz / 2 -#---- Plotting functions ----# -folder ='imgRes' -plane = 'XY' +# ---- Plotting functions ----# +folder = "imgRes" +plane = "XY" -if plane == 'XY': - xx, yy, zz = slice(0,Nx), slice(0,Ny), int(Nz//2) #plane XY - title = '(x,y,Nz/2)' - xax, yax = 'y', 'x' +if plane == "XY": + xx, yy, zz = slice(0, Nx), slice(0, Ny), int(Nz // 2) # plane XY + title = "(x,y,Nz/2)" + xax, yax = "y", "x" -if plane == 'YZ': - xx, yy, zz = int(Nx//2), slice(0,Ny), slice(0,Nz) #plane YZ - title = '(Nx/2,y,z)' - xax, yax = 'z', 'y' +if plane == "YZ": + xx, yy, zz = int(Nx // 2), slice(0, Ny), slice(0, Nz) # plane YZ + title = "(Nx/2,y,z)" + xax, yax = "z", "y" -def plot_E_field(solverFIT, solverFDTD, n): - fig, axs = plt.subplots(2,3, figsize=[8,6]) - dims = {0:'x', 1:'y', 2:'z'} - vmin, vmax = -500., 500. +def plot_E_field(solverFIT, solverFDTD, n): + fig, axs = plt.subplots(2, 3, figsize=[8, 6]) + dims = {0: "x", 1: "y", 2: "z"} + vmin, vmax = -500.0, 500.0 - #FIT + # FIT extent = (0, N, 0, N) - for i, ax in enumerate(axs[0,:]): - #vmin, vmax = -np.max(np.abs(solverFIT.E[xx, yy, zz, dims[i]])), np.max(np.abs(solverFIT.E[xx, yy, zz, dims[i]])) - im = ax.imshow(solverFIT.E[xx, yy, zz, dims[i]], cmap='rainbow', vmin=vmin, vmax=vmax, extent=extent) - fig.colorbar(im, cax=make_axes_locatable(ax).append_axes('right', size='5%', pad=0.05)) - ax.set_title(f'FIT E{dims[i]}{title}') + for i, ax in enumerate(axs[0, :]): + # vmin, vmax = -np.max(np.abs(solverFIT.E[xx, yy, zz, dims[i]])), np.max(np.abs(solverFIT.E[xx, yy, zz, dims[i]])) + im = ax.imshow( + solverFIT.E[xx, yy, zz, dims[i]], + cmap="rainbow", + vmin=vmin, + vmax=vmax, + extent=extent, + ) + fig.colorbar( + im, cax=make_axes_locatable(ax).append_axes("right", size="5%", pad=0.05) + ) + ax.set_title(f"FIT E{dims[i]}{title}") ax.set_xlabel(xax) ax.set_ylabel(yax) - #FDTD - ax = axs[1,0] + # FDTD + ax = axs[1, 0] extent = (0, N, 0, N) - #vmin, vmax = -np.max(np.abs(solverFDTD.Ex[xx, yy, zz])), np.max(np.abs(solverFDTD.Ex[xx, yy, zz])) - im = ax.imshow(solverFDTD.Ex[xx, yy, zz], cmap='rainbow', vmin=vmin, vmax=vmax, extent=extent) - fig.colorbar(im, cax=make_axes_locatable(ax).append_axes('right', size='5%', pad=0.05)) - ax.set_title(f'FDTD Ex{title}') + # vmin, vmax = -np.max(np.abs(solverFDTD.Ex[xx, yy, zz])), np.max(np.abs(solverFDTD.Ex[xx, yy, zz])) + im = ax.imshow( + solverFDTD.Ex[xx, yy, zz], cmap="rainbow", vmin=vmin, vmax=vmax, extent=extent + ) + fig.colorbar( + im, cax=make_axes_locatable(ax).append_axes("right", size="5%", pad=0.05) + ) + ax.set_title(f"FDTD Ex{title}") ax.set_xlabel(xax) ax.set_ylabel(yax) - ax = axs[1,1] + ax = axs[1, 1] extent = (0, N, 0, N) - #vmin, vmax = -np.max(np.abs(solverFDTD.Ey[xx, yy, zz])), np.max(np.abs(solverFDTD.Ey[xx, yy, zz])) - im = ax.imshow(solverFDTD.Ey[xx, yy, zz], cmap='rainbow', vmin=vmin, vmax=vmax, extent=extent) - fig.colorbar(im, cax=make_axes_locatable(ax).append_axes('right', size='5%', pad=0.05)) - ax.set_title(f'FDTD Ey{title}') + # vmin, vmax = -np.max(np.abs(solverFDTD.Ey[xx, yy, zz])), np.max(np.abs(solverFDTD.Ey[xx, yy, zz])) + im = ax.imshow( + solverFDTD.Ey[xx, yy, zz], cmap="rainbow", vmin=vmin, vmax=vmax, extent=extent + ) + fig.colorbar( + im, cax=make_axes_locatable(ax).append_axes("right", size="5%", pad=0.05) + ) + ax.set_title(f"FDTD Ey{title}") ax.set_xlabel(xax) ax.set_ylabel(yax) - ax = axs[1,2] + ax = axs[1, 2] extent = (0, N, 0, N) - #vmin, vmax = -np.max(np.abs(solverFDTD.Ez[xx, yy, zz])), np.max(np.abs(solverFDTD.Ez[xx, yy, zz])) - im = ax.imshow(solverFDTD.Ez[xx, yy, zz], cmap='rainbow', vmin=vmin, vmax=vmax, extent=extent) - fig.colorbar(im, cax=make_axes_locatable(ax).append_axes('right', size='5%', pad=0.05)) - ax.set_title(f'FDTD Ez{title}') + # vmin, vmax = -np.max(np.abs(solverFDTD.Ez[xx, yy, zz])), np.max(np.abs(solverFDTD.Ez[xx, yy, zz])) + im = ax.imshow( + solverFDTD.Ez[xx, yy, zz], cmap="rainbow", vmin=vmin, vmax=vmax, extent=extent + ) + fig.colorbar( + im, cax=make_axes_locatable(ax).append_axes("right", size="5%", pad=0.05) + ) + ax.set_title(f"FDTD Ez{title}") ax.set_xlabel(xax) ax.set_ylabel(yax) fig.tight_layout(h_pad=0.3) - fig.suptitle(f'E field, timestep={n}') - fig.savefig(f'{folder}E/'+str(n).zfill(4)+'.png') + fig.suptitle(f"E field, timestep={n}") + fig.savefig(f"{folder}E/" + str(n).zfill(4) + ".png") plt.clf() plt.close(fig) -def plot_H_field(solverFIT, solverFDTD, n): - fig, axs = plt.subplots(2,3, tight_layout=True, figsize=[8,6]) - dims = {0:'x', 1:'y', 2:'z'} - vmin, vmax = -1., 1. - #FIT - for i, ax in enumerate(axs[0,:]): - #vmin, vmax = -np.max(np.abs(solverFIT.H[xx, yy, zz, dims[i]])), np.max(np.abs(solverFIT.H[xx, yy, zz, dims[i]])) - im = ax.imshow(solverFIT.H[xx, yy, zz, dims[i]], cmap='rainbow', vmin=vmin, vmax=vmax) - fig.colorbar(im, cax=make_axes_locatable(ax).append_axes('right', size='5%', pad=0.05)) - ax.set_title(f'FIT H{dims[i]}{title}') +def plot_H_field(solverFIT, solverFDTD, n): + fig, axs = plt.subplots(2, 3, tight_layout=True, figsize=[8, 6]) + dims = {0: "x", 1: "y", 2: "z"} + vmin, vmax = -1.0, 1.0 + # FIT + for i, ax in enumerate(axs[0, :]): + # vmin, vmax = -np.max(np.abs(solverFIT.H[xx, yy, zz, dims[i]])), np.max(np.abs(solverFIT.H[xx, yy, zz, dims[i]])) + im = ax.imshow( + solverFIT.H[xx, yy, zz, dims[i]], cmap="rainbow", vmin=vmin, vmax=vmax + ) + fig.colorbar( + im, cax=make_axes_locatable(ax).append_axes("right", size="5%", pad=0.05) + ) + ax.set_title(f"FIT H{dims[i]}{title}") ax.set_xlabel(xax) ax.set_ylabel(yax) - #FDTD - ax = axs[1,0] - #vmin, vmax = -np.max(np.abs(solverFDTD.Hx[xx, yy, zz])), np.max(np.abs(solverFDTD.Hx[xx, yy, zz])) - im = ax.imshow(solverFDTD.Hx[xx, yy, zz], cmap='rainbow', vmin=vmin, vmax=vmax) - fig.colorbar(im, cax=make_axes_locatable(ax).append_axes('right', size='5%', pad=0.05)) - ax.set_title(f'FDTD Hx{title}') + # FDTD + ax = axs[1, 0] + # vmin, vmax = -np.max(np.abs(solverFDTD.Hx[xx, yy, zz])), np.max(np.abs(solverFDTD.Hx[xx, yy, zz])) + im = ax.imshow(solverFDTD.Hx[xx, yy, zz], cmap="rainbow", vmin=vmin, vmax=vmax) + fig.colorbar( + im, cax=make_axes_locatable(ax).append_axes("right", size="5%", pad=0.05) + ) + ax.set_title(f"FDTD Hx{title}") ax.set_xlabel(xax) ax.set_ylabel(yax) - ax = axs[1,1] - #vmin, vmax = -np.max(np.abs(solverFDTD.Hy[xx, yy, zz])), np.max(np.abs(solverFDTD.Hy[xx, yy, zz])) - im = ax.imshow(solverFDTD.Hy[xx, yy, zz], cmap='rainbow', vmin=vmin, vmax=vmax) - fig.colorbar(im, cax=make_axes_locatable(ax).append_axes('right', size='5%', pad=0.05)) - ax.set_title(f'FDTD Hy{title}') + ax = axs[1, 1] + # vmin, vmax = -np.max(np.abs(solverFDTD.Hy[xx, yy, zz])), np.max(np.abs(solverFDTD.Hy[xx, yy, zz])) + im = ax.imshow(solverFDTD.Hy[xx, yy, zz], cmap="rainbow", vmin=vmin, vmax=vmax) + fig.colorbar( + im, cax=make_axes_locatable(ax).append_axes("right", size="5%", pad=0.05) + ) + ax.set_title(f"FDTD Hy{title}") ax.set_xlabel(xax) ax.set_ylabel(yax) - ax = axs[1,2] - #vmin, vmax = -np.max(np.abs(solverFDTD.Hz[xx, yy, zz])), np.max(np.abs(solverFDTD.Hz[xx, yy, zz])) - im = ax.imshow(solverFDTD.Hz[xx, yy, zz], cmap='rainbow', vmin=vmin, vmax=vmax) - fig.colorbar(im, cax=make_axes_locatable(ax).append_axes('right', size='5%', pad=0.05)) - ax.set_title(f'FDTD Hz{title}') + ax = axs[1, 2] + # vmin, vmax = -np.max(np.abs(solverFDTD.Hz[xx, yy, zz])), np.max(np.abs(solverFDTD.Hz[xx, yy, zz])) + im = ax.imshow(solverFDTD.Hz[xx, yy, zz], cmap="rainbow", vmin=vmin, vmax=vmax) + fig.colorbar( + im, cax=make_axes_locatable(ax).append_axes("right", size="5%", pad=0.05) + ) + ax.set_title(f"FDTD Hz{title}") ax.set_xlabel(xax) ax.set_ylabel(yax) - fig.suptitle(f'H field, timestep={n}') - fig.savefig(f'{folder}H/'+str(n).zfill(4)+'.png') + fig.suptitle(f"H field, timestep={n}") + fig.savefig(f"{folder}H/" + str(n).zfill(4) + ".png") plt.clf() plt.close(fig) + # ---- Solver definitions ---------# conductors = noConductor() -bc_low=['pec', 'pec', 'pec'] -bc_high=['pec', 'pec', 'pec'] - -NCFL=1.0 - -gridFIT = Grid3D(xmin, xmax, ymin, ymax, zmin, zmax, Nx, Ny, Nz, conductors, 'FIT') -tgridFIT = Grid3D(xmin + dx/2, xmax + dx/2, ymin + dy/2, ymax + dy/2, zmin + dz/2, zmax + dz/2, Nx, Ny, Nz, conductors, 'FIT') -#solverFIT = SolverFIT3D(gridFIT, bc_low=bc_low, bc_high=bc_high) +bc_low = ["pec", "pec", "pec"] +bc_high = ["pec", "pec", "pec"] + +NCFL = 1.0 + +gridFIT = Grid3D(xmin, xmax, ymin, ymax, zmin, zmax, Nx, Ny, Nz, conductors, "FIT") +tgridFIT = Grid3D( + xmin + dx / 2, + xmax + dx / 2, + ymin + dy / 2, + ymax + dy / 2, + zmin + dz / 2, + zmax + dz / 2, + Nx, + Ny, + Nz, + conductors, + "FIT", +) +# solverFIT = SolverFIT3D(gridFIT, bc_low=bc_low, bc_high=bc_high) solverFIT = SolverFIT3D(gridFIT, tgridFIT, bc_low=bc_low, bc_high=bc_high) -gridFDTD = Grid3D(xmin, xmax, ymin, ymax, zmin, zmax, Nx, Ny, Nz, conductors, 'FDTD') -solverFDTD = EMSolver3D(gridFDTD, 'FDTD', NCFL) +gridFDTD = Grid3D(xmin, xmax, ymin, ymax, zmin, zmax, Nx, Ny, Nz, conductors, "FDTD") +solverFDTD = EMSolver3D(gridFDTD, "FDTD", NCFL) -#---- Initial conditions ------------# +# ---- Initial conditions ------------# for ii in range(Nx): for jj in range(Ny): @@ -213,7 +290,7 @@ def plot_H_field(solverFIT, solverFDTD, n): x = ii * dx + xmin y = jj * dy + ymin z = kk * dz + zmin - solverFIT.H[ii, jj, kk, 'z'] = analytic_sol_Hz(x, y, z, -0.5 * solverFIT.dt) + solverFIT.H[ii, jj, kk, "z"] = analytic_sol_Hz(x, y, z, -0.5 * solverFIT.dt) x = (ii + 0.5) * dx + xmin y = jj * dy + ymin @@ -223,185 +300,208 @@ def plot_H_field(solverFIT, solverFDTD, n): x = ii * dx + xmin y = jj * dy + ymin z = kk * dz + zmin - solverFIT.H[ii, jj, kk, 'y'] = analytic_sol_Hy(x, y, z, -0.5 * solverFIT.dt) + solverFIT.H[ii, jj, kk, "y"] = analytic_sol_Hy(x, y, z, -0.5 * solverFIT.dt) - x = ii*dx + xmin - y = (jj + 0.5)*dy + ymin - z = (kk + 0.5)*dz + zmin + x = ii * dx + xmin + y = (jj + 0.5) * dy + ymin + z = (kk + 0.5) * dz + zmin solverFDTD.Hx[ii, jj, kk] = analytic_sol_Hx(x, y, z, -0.5 * solverFDTD.dt) x = ii * dx + xmin y = jj * dy + ymin z = kk * dz + zmin - solverFIT.H[ii, jj, kk, 'x'] = analytic_sol_Hx(x, y, z, -0.5 * solverFIT.dt) + solverFIT.H[ii, jj, kk, "x"] = analytic_sol_Hx(x, y, z, -0.5 * solverFIT.dt) -#----- Time loop -----# +# ----- Time loop -----# Nt = 50 for nt in tqdm(range(Nt)): - solverFIT.one_step() solverFDTD.one_step() plot_E_field(solverFIT, solverFDTD, nt) plot_H_field(solverFIT, solverFDTD, nt) -#----- Compare -----# +# ----- Compare -----# -analytic = EMSolver3D(gridFDTD, 'FDTD', NCFL) +analytic = EMSolver3D(gridFDTD, "FDTD", NCFL) for ii in range(Nx): for jj in range(Ny): for kk in range(Nz): - x = (ii + 0.5) * dx + xmin y = (jj + 0.5) * dy + ymin z = kk * dz + zmin - analytic.Hz[ii, jj, kk] = analytic_sol_Hz(x, y, z, (Nt-0.5) * analytic.dt) + analytic.Hz[ii, jj, kk] = analytic_sol_Hz(x, y, z, (Nt - 0.5) * analytic.dt) - x = (ii + 0.5) * dx + xmin + x = (ii + 0.5) * dx + xmin y = jj * dy + ymin z = (kk + 0.5) * dz + zmin - analytic.Hy[ii, jj, kk] = analytic_sol_Hy(x, y, z, (Nt-0.5) * analytic.dt) + analytic.Hy[ii, jj, kk] = analytic_sol_Hy(x, y, z, (Nt - 0.5) * analytic.dt) - x = ii*dx + xmin - y = (jj + 0.5)*dy + ymin - z = (kk + 0.5)*dz + zmin - analytic.Hx[ii, jj, kk] = analytic_sol_Hx(x, y, z, (Nt-0.5) * analytic.dt) + x = ii * dx + xmin + y = (jj + 0.5) * dy + ymin + z = (kk + 0.5) * dz + zmin + analytic.Hx[ii, jj, kk] = analytic_sol_Hx(x, y, z, (Nt - 0.5) * analytic.dt) # Plot fields -plane = 'XY' -if plane == 'XY': - xx, yy, zz = slice(0,Nx), slice(0,Ny), int(Nz//2) #plane XY - title = '(x,y,Nz/2)' - xax, yax = 'y', 'x' - -fig, axs = plt.subplots(3,3, tight_layout=True, figsize=[8,6]) -dims = {0:'x', 1:'y', 2:'z'} -lims = {0: np.max(np.abs(analytic.Hx[xx, yy, zz])), 1: np.max(np.abs(analytic.Hy[xx, yy, zz])), 2: np.max(np.abs(analytic.Hz[xx, yy, zz]))} -#FIT -for i, ax in enumerate(axs[0,:]): - #vmin, vmax = -np.max(np.abs(solverFIT.H[xx, yy, zz, dims[i]])), np.max(np.abs(solverFIT.H[xx, yy, zz, dims[i]])) +plane = "XY" +if plane == "XY": + xx, yy, zz = slice(0, Nx), slice(0, Ny), int(Nz // 2) # plane XY + title = "(x,y,Nz/2)" + xax, yax = "y", "x" + +fig, axs = plt.subplots(3, 3, tight_layout=True, figsize=[8, 6]) +dims = {0: "x", 1: "y", 2: "z"} +lims = { + 0: np.max(np.abs(analytic.Hx[xx, yy, zz])), + 1: np.max(np.abs(analytic.Hy[xx, yy, zz])), + 2: np.max(np.abs(analytic.Hz[xx, yy, zz])), +} +# FIT +for i, ax in enumerate(axs[0, :]): + # vmin, vmax = -np.max(np.abs(solverFIT.H[xx, yy, zz, dims[i]])), np.max(np.abs(solverFIT.H[xx, yy, zz, dims[i]])) vmin, vmax = -lims[i], lims[i] - im = ax.imshow(solverFIT.H[xx, yy, zz, dims[i]], cmap='rainbow', vmin=-lims[i], vmax=lims[i]) - fig.colorbar(im, cax=make_axes_locatable(ax).append_axes('right', size='5%', pad=0.05)) - ax.set_title(f'FIT H{dims[i]}{title}') + im = ax.imshow( + solverFIT.H[xx, yy, zz, dims[i]], cmap="rainbow", vmin=-lims[i], vmax=lims[i] + ) + fig.colorbar( + im, cax=make_axes_locatable(ax).append_axes("right", size="5%", pad=0.05) + ) + ax.set_title(f"FIT H{dims[i]}{title}") -#FDTD -ax = axs[1,0] +# FDTD +ax = axs[1, 0] vmin, vmax = -lims[0], lims[0] -im = ax.imshow(solverFDTD.Hx[xx, yy, zz], cmap='rainbow', vmin=vmin, vmax=vmax) -fig.colorbar(im, cax=make_axes_locatable(ax).append_axes('right', size='5%', pad=0.05)) -ax.set_title(f'FDTD Hx{title}') +im = ax.imshow(solverFDTD.Hx[xx, yy, zz], cmap="rainbow", vmin=vmin, vmax=vmax) +fig.colorbar(im, cax=make_axes_locatable(ax).append_axes("right", size="5%", pad=0.05)) +ax.set_title(f"FDTD Hx{title}") -ax = axs[1,1] +ax = axs[1, 1] vmin, vmax = -lims[1], lims[1] -im = ax.imshow(solverFDTD.Hy[xx, yy, zz], cmap='rainbow', vmin=vmin, vmax=vmax) -fig.colorbar(im, cax=make_axes_locatable(ax).append_axes('right', size='5%', pad=0.05)) -ax.set_title(f'FDTD Hy{title}') +im = ax.imshow(solverFDTD.Hy[xx, yy, zz], cmap="rainbow", vmin=vmin, vmax=vmax) +fig.colorbar(im, cax=make_axes_locatable(ax).append_axes("right", size="5%", pad=0.05)) +ax.set_title(f"FDTD Hy{title}") -ax = axs[1,2] +ax = axs[1, 2] vmin, vmax = -lims[2], lims[2] -im = ax.imshow(solverFDTD.Hz[xx, yy, zz], cmap='rainbow', vmin=vmin, vmax=vmax) -fig.colorbar(im, cax=make_axes_locatable(ax).append_axes('right', size='5%', pad=0.05)) -ax.set_title(f'FDTD Hz{title}') +im = ax.imshow(solverFDTD.Hz[xx, yy, zz], cmap="rainbow", vmin=vmin, vmax=vmax) +fig.colorbar(im, cax=make_axes_locatable(ax).append_axes("right", size="5%", pad=0.05)) +ax.set_title(f"FDTD Hz{title}") ax.set_xlabel(xax) ax.set_ylabel(yax) -#Analytic -ax = axs[2,0] -vmin, vmax = -np.max(np.abs(analytic.Hx[xx, yy, zz])), np.max(np.abs(analytic.Hx[xx, yy, zz])) -im = ax.imshow(analytic.Hx[xx, yy, zz], cmap='rainbow', vmin=vmin, vmax=vmax) -fig.colorbar(im, cax=make_axes_locatable(ax).append_axes('right', size='5%', pad=0.05)) -ax.set_title(f'Analytic Hx{title}') +# Analytic +ax = axs[2, 0] +vmin, vmax = ( + -np.max(np.abs(analytic.Hx[xx, yy, zz])), + np.max(np.abs(analytic.Hx[xx, yy, zz])), +) +im = ax.imshow(analytic.Hx[xx, yy, zz], cmap="rainbow", vmin=vmin, vmax=vmax) +fig.colorbar(im, cax=make_axes_locatable(ax).append_axes("right", size="5%", pad=0.05)) +ax.set_title(f"Analytic Hx{title}") ax.set_xlabel(xax) ax.set_ylabel(yax) -ax = axs[2,1] -vmin, vmax = -np.max(np.abs(analytic.Hy[xx, yy, zz])), np.max(np.abs(analytic.Hy[xx, yy, zz])) -im = ax.imshow(analytic.Hy[xx, yy, zz], cmap='rainbow', vmin=vmin, vmax=vmax) -fig.colorbar(im, cax=make_axes_locatable(ax).append_axes('right', size='5%', pad=0.05)) -ax.set_title(f'Analytic Hy{title}') +ax = axs[2, 1] +vmin, vmax = ( + -np.max(np.abs(analytic.Hy[xx, yy, zz])), + np.max(np.abs(analytic.Hy[xx, yy, zz])), +) +im = ax.imshow(analytic.Hy[xx, yy, zz], cmap="rainbow", vmin=vmin, vmax=vmax) +fig.colorbar(im, cax=make_axes_locatable(ax).append_axes("right", size="5%", pad=0.05)) +ax.set_title(f"Analytic Hy{title}") ax.set_xlabel(xax) ax.set_ylabel(yax) -ax = axs[2,2] -vmin, vmax = -np.max(np.abs(analytic.Hz[xx, yy, zz])), np.max(np.abs(analytic.Hz[xx, yy, zz])) -im = ax.imshow(analytic.Hz[xx, yy, zz], cmap='rainbow', vmin=vmin, vmax=vmax) -fig.colorbar(im, cax=make_axes_locatable(ax).append_axes('right', size='5%', pad=0.05)) -ax.set_title(f'Analytic Hz{title}') +ax = axs[2, 2] +vmin, vmax = ( + -np.max(np.abs(analytic.Hz[xx, yy, zz])), + np.max(np.abs(analytic.Hz[xx, yy, zz])), +) +im = ax.imshow(analytic.Hz[xx, yy, zz], cmap="rainbow", vmin=vmin, vmax=vmax) +fig.colorbar(im, cax=make_axes_locatable(ax).append_axes("right", size="5%", pad=0.05)) +ax.set_title(f"Analytic Hz{title}") ax.set_xlabel(xax) ax.set_ylabel(yax) -fig.suptitle(f'H field, timestep={Nt}') -fig.savefig(f'imgResH/analytic{plane}_TE{m}{n}{p}.png') +fig.suptitle(f"H field, timestep={Nt}") +fig.savefig(f"imgResH/analytic{plane}_TE{m}{n}{p}.png") plt.clf() plt.close(fig) -plane = 'YZ' -if plane == 'YZ': - xx, yy, zz = int(Nx//2), slice(0,Ny), slice(0,Nz) #plane YZ - title = '(Nx/2,y,z)' - xax, yax = 'z', 'y' - -fig, axs = plt.subplots(3,3, tight_layout=True, figsize=[8,6]) -dims = {0:'x', 1:'y', 2:'z'} -lims = {0: np.max(np.abs(analytic.Hx[xx, yy, zz])), 1: np.max(np.abs(analytic.Hy[xx, yy, zz])), 2: np.max(np.abs(analytic.Hz[xx, yy, zz]))} -#FIT -for i, ax in enumerate(axs[0,:]): - #vmin, vmax = -np.max(np.abs(solverFIT.H[xx, yy, zz, dims[i]])), np.max(np.abs(solverFIT.H[xx, yy, zz, dims[i]])) - im = ax.imshow(solverFIT.H[xx, yy, zz, dims[i]], cmap='rainbow', vmin=-lims[i], vmax=lims[i]) - fig.colorbar(im, cax=make_axes_locatable(ax).append_axes('right', size='5%', pad=0.05)) - ax.set_title(f'FIT H{dims[i]}{title}') - -#FDTD -ax = axs[1,0] +plane = "YZ" +if plane == "YZ": + xx, yy, zz = int(Nx // 2), slice(0, Ny), slice(0, Nz) # plane YZ + title = "(Nx/2,y,z)" + xax, yax = "z", "y" + +fig, axs = plt.subplots(3, 3, tight_layout=True, figsize=[8, 6]) +dims = {0: "x", 1: "y", 2: "z"} +lims = { + 0: np.max(np.abs(analytic.Hx[xx, yy, zz])), + 1: np.max(np.abs(analytic.Hy[xx, yy, zz])), + 2: np.max(np.abs(analytic.Hz[xx, yy, zz])), +} +# FIT +for i, ax in enumerate(axs[0, :]): + # vmin, vmax = -np.max(np.abs(solverFIT.H[xx, yy, zz, dims[i]])), np.max(np.abs(solverFIT.H[xx, yy, zz, dims[i]])) + im = ax.imshow( + solverFIT.H[xx, yy, zz, dims[i]], cmap="rainbow", vmin=-lims[i], vmax=lims[i] + ) + fig.colorbar( + im, cax=make_axes_locatable(ax).append_axes("right", size="5%", pad=0.05) + ) + ax.set_title(f"FIT H{dims[i]}{title}") + +# FDTD +ax = axs[1, 0] vmin, vmax = -lims[0], lims[0] -im = ax.imshow(solverFDTD.Hx[xx, yy, zz], cmap='rainbow', vmin=vmin, vmax=vmax) -fig.colorbar(im, cax=make_axes_locatable(ax).append_axes('right', size='5%', pad=0.05)) -ax.set_title(f'FDTD Hx{title}') +im = ax.imshow(solverFDTD.Hx[xx, yy, zz], cmap="rainbow", vmin=vmin, vmax=vmax) +fig.colorbar(im, cax=make_axes_locatable(ax).append_axes("right", size="5%", pad=0.05)) +ax.set_title(f"FDTD Hx{title}") -ax = axs[1,1] +ax = axs[1, 1] vmin, vmax = -lims[1], lims[1] -im = ax.imshow(solverFDTD.Hy[xx, yy, zz], cmap='rainbow', vmin=vmin, vmax=vmax) -fig.colorbar(im, cax=make_axes_locatable(ax).append_axes('right', size='5%', pad=0.05)) -ax.set_title(f'FDTD Hy{title}') +im = ax.imshow(solverFDTD.Hy[xx, yy, zz], cmap="rainbow", vmin=vmin, vmax=vmax) +fig.colorbar(im, cax=make_axes_locatable(ax).append_axes("right", size="5%", pad=0.05)) +ax.set_title(f"FDTD Hy{title}") -ax = axs[1,2] +ax = axs[1, 2] vmin, vmax = -lims[2], lims[2] -im = ax.imshow(solverFDTD.Hz[xx, yy, zz], cmap='rainbow', vmin=vmin, vmax=vmax) -fig.colorbar(im, cax=make_axes_locatable(ax).append_axes('right', size='5%', pad=0.05)) -ax.set_title(f'FDTD Hz{title}') +im = ax.imshow(solverFDTD.Hz[xx, yy, zz], cmap="rainbow", vmin=vmin, vmax=vmax) +fig.colorbar(im, cax=make_axes_locatable(ax).append_axes("right", size="5%", pad=0.05)) +ax.set_title(f"FDTD Hz{title}") ax.set_xlabel(xax) ax.set_ylabel(yax) -#Analytic -ax = axs[2,0] +# Analytic +ax = axs[2, 0] vmin, vmax = -lims[0], lims[0] -im = ax.imshow(analytic.Hx[xx, yy, zz], cmap='rainbow', vmin=vmin, vmax=vmax) -fig.colorbar(im, cax=make_axes_locatable(ax).append_axes('right', size='5%', pad=0.05)) -ax.set_title(f'Analytic Hx{title}') +im = ax.imshow(analytic.Hx[xx, yy, zz], cmap="rainbow", vmin=vmin, vmax=vmax) +fig.colorbar(im, cax=make_axes_locatable(ax).append_axes("right", size="5%", pad=0.05)) +ax.set_title(f"Analytic Hx{title}") ax.set_xlabel(xax) ax.set_ylabel(yax) -ax = axs[2,1] +ax = axs[2, 1] vmin, vmax = -lims[1], lims[1] -im = ax.imshow(analytic.Hy[xx, yy, zz], cmap='rainbow', vmin=vmin, vmax=vmax) -fig.colorbar(im, cax=make_axes_locatable(ax).append_axes('right', size='5%', pad=0.05)) -ax.set_title(f'Analytic Hy{title}') +im = ax.imshow(analytic.Hy[xx, yy, zz], cmap="rainbow", vmin=vmin, vmax=vmax) +fig.colorbar(im, cax=make_axes_locatable(ax).append_axes("right", size="5%", pad=0.05)) +ax.set_title(f"Analytic Hy{title}") ax.set_xlabel(xax) ax.set_ylabel(yax) -ax = axs[2,2] +ax = axs[2, 2] vmin, vmax = -lims[2], lims[2] -im = ax.imshow(analytic.Hz[xx, yy, zz], cmap='rainbow', vmin=vmin, vmax=vmax) -fig.colorbar(im, cax=make_axes_locatable(ax).append_axes('right', size='5%', pad=0.05)) -ax.set_title(f'Analytic Hz{title}') +im = ax.imshow(analytic.Hz[xx, yy, zz], cmap="rainbow", vmin=vmin, vmax=vmax) +fig.colorbar(im, cax=make_axes_locatable(ax).append_axes("right", size="5%", pad=0.05)) +ax.set_title(f"Analytic Hz{title}") ax.set_xlabel(xax) ax.set_ylabel(yax) -fig.suptitle(f'H field, timestep={Nt}') -fig.savefig(f'imgResH/analytic{plane}_TE{m}{n}{p}.png') +fig.suptitle(f"H field, timestep={Nt}") +fig.savefig(f"imgResH/analytic{plane}_TE{m}{n}{p}.png") plt.clf() -plt.close(fig) \ No newline at end of file +plt.close(fig) diff --git a/examples/fit/script_noeb_resonator_fit_diff.py b/examples/fit/script_noeb_resonator_fit_diff.py index 6da858c..750ae1b 100644 --- a/examples/fit/script_noeb_resonator_fit_diff.py +++ b/examples/fit/script_noeb_resonator_fit_diff.py @@ -1,63 +1,97 @@ import numpy as np from scipy.constants import c as c_light, epsilon_0 as eps_0, mu_0 as mu_0 -import matplotlib + # matplotlib.use('Agg') from matplotlib import pyplot as plt -from matplotlib import patches -import os, sys from tqdm import tqdm from mpl_toolkits.axes_grid1 import make_axes_locatable -sys.path.append('../') from solverFIT3D import SolverFIT3D -from solver3D import EMSolver3D from grid3D import Grid3D -from conductors3d import noConductor, InCube, ConductorsAssembly -from scipy.special import jv -from field import Field +from conductors3d import noConductor +from field import Field -#----- TE Funtions -----# +# ----- TE Funtions -----# m = 1 n = 1 p = 1 -theta = 0 #np.pi/8 +theta = 0 # np.pi/8 # Analytic solution of cubic resonator # Ref: http://faculty.pccu.edu.tw/~meng/new%20EM6.pdf pp.20/24 + def analytic_sol_Hz(x, y, z, t): - Rm = np.array([[np.cos(-theta), - np.sin(-theta), 0],[np.sin(-theta), np.cos(-theta), 0], [0, 0, 1]]) + Rm = np.array( + [ + [np.cos(-theta), -np.sin(-theta), 0], + [np.sin(-theta), np.cos(-theta), 0], + [0, 0, 1], + ] + ) [x_0, y_0, z_0] = np.dot(Rm, np.array([x, y, z])) - return np.cos(m * np.pi / Lx * (x_0 - Lx/2)) * np.cos(n * np.pi / Ly * (y_0 - Ly/2)) * np.sin( - p * np.pi / Lz * (z_0 - Lz/2)) * np.cos(np.sqrt(2) * np.pi / Lx * c_light * t) + return ( + np.cos(m * np.pi / Lx * (x_0 - Lx / 2)) + * np.cos(n * np.pi / Ly * (y_0 - Ly / 2)) + * np.sin(p * np.pi / Lz * (z_0 - Lz / 2)) + * np.cos(np.sqrt(2) * np.pi / Lx * c_light * t) + ) + def analytic_sol_Hy(x, y, z, t): - Rm = np.array([[np.cos(-theta), - np.sin(-theta), 0],[np.sin(-theta), np.cos(-theta), 0], [0, 0, 1]]) + Rm = np.array( + [ + [np.cos(-theta), -np.sin(-theta), 0], + [np.sin(-theta), np.cos(-theta), 0], + [0, 0, 1], + ] + ) [x_0, y_0, z_0] = np.dot(Rm, np.array([x, y, z])) h_2 = (m * np.pi / Lx) ** 2 + (n * np.pi / Ly) ** 2 + (p * np.pi / Lz) ** 2 - return -2 / h_2 * (n * np.pi / Ly) * (p * np.pi / Lz) * np.cos(m * np.pi / Lx * (x_0 - Lx/2)) * np.sin( - n * np.pi / Ly * (y_0 - Ly/2)) * np.cos(p * np.pi / Lz * (z_0 - Lz/2)) * np.cos( - np.sqrt(2) * np.pi / Lx * c_light * t) + return ( + -2 + / h_2 + * (n * np.pi / Ly) + * (p * np.pi / Lz) + * np.cos(m * np.pi / Lx * (x_0 - Lx / 2)) + * np.sin(n * np.pi / Ly * (y_0 - Ly / 2)) + * np.cos(p * np.pi / Lz * (z_0 - Lz / 2)) + * np.cos(np.sqrt(2) * np.pi / Lx * c_light * t) + ) + def analytic_sol_Hx(x, y, z, t): - Rm = np.array([[np.cos(-theta), - np.sin(-theta), 0],[np.sin(-theta), np.cos(-theta), 0], [0, 0, 1]]) + Rm = np.array( + [ + [np.cos(-theta), -np.sin(-theta), 0], + [np.sin(-theta), np.cos(-theta), 0], + [0, 0, 1], + ] + ) [x_0, y_0, z_0] = np.dot(Rm, np.array([x, y, z])) h_2 = (m * np.pi / Lx) ** 2 + (n * np.pi / Ly) ** 2 + (p * np.pi / Lz) ** 2 - return -2 / h_2 * (m * np.pi / Lx) * (p * np.pi / Lz) * np.sin(m * np.pi / Lx * (x_0 - Lx/2)) * np.cos( - n * np.pi / Ly * (y_0 - Ly/2)) * np.cos(p * np.pi / Lz * (z_0 - Lz/2)) * np.cos( - np.sqrt(2) * np.pi / Lx * c_light * t) + return ( + -2 + / h_2 + * (m * np.pi / Lx) + * (p * np.pi / Lz) + * np.sin(m * np.pi / Lx * (x_0 - Lx / 2)) + * np.cos(n * np.pi / Ly * (y_0 - Ly / 2)) + * np.cos(p * np.pi / Lz * (z_0 - Lz / 2)) + * np.cos(np.sqrt(2) * np.pi / Lx * c_light * t) + ) -#---- Domain definition ----# +# ---- Domain definition ----# Z0 = np.sqrt(mu_0 / eps_0) -L = 1. # Domain length -N = 50 # Number of mesh cells +L = 1.0 # Domain length +N = 50 # Number of mesh cells Nx = N Ny = N @@ -69,55 +103,60 @@ def analytic_sol_Hx(x, y, z, t): dy = L / Ny dz = L / Nz -xmin = -Lx/2 #+ dx / 2 -xmax = Lx/2 #+ dx / 2 -ymin = - Ly/2 #+ dy / 2 -ymax = Ly/2 #+ dy / 2 -zmin = - Lz/2 #+ dz / 2 -zmax = Lz/2 #+ dz / 2 +xmin = -Lx / 2 # + dx / 2 +xmax = Lx / 2 # + dx / 2 +ymin = -Ly / 2 # + dy / 2 +ymax = Ly / 2 # + dy / 2 +zmin = -Lz / 2 # + dz / 2 +zmax = Lz / 2 # + dz / 2 # ---- Solver definitions ---------# conductors = noConductor() -bc_low=['pec', 'pec', 'pec'] -bc_high=['pec', 'pec', 'pec'] +bc_low = ["pec", "pec", "pec"] +bc_high = ["pec", "pec", "pec"] -NCFL=1.0 +NCFL = 1.0 -gridFIT = Grid3D(xmin, xmax, ymin, ymax, zmin, zmax, Nx, Ny, Nz, conductors, 'FIT') +gridFIT = Grid3D(xmin, xmax, ymin, ymax, zmin, zmax, Nx, Ny, Nz, conductors, "FIT") solverFIT = SolverFIT3D(gridFIT, bc_low=bc_low, bc_high=bc_high) -#---- Initial conditions ------------# +# ---- Initial conditions ------------# for ii in range(Nx): for jj in range(Ny): for kk in range(Nz): + x = (ii + 0.5) * dx + xmin + y = (jj + 0.5) * dy + ymin + z = (kk + 0.5) * dz + zmin + solverFIT.H[ii, jj, kk, "z"] = analytic_sol_Hz( + x, y, z, (-0.5) * solverFIT.dt + ) - x = (ii+0.5) * dx + xmin - y = (jj+0.5) * dy + ymin - z = (kk+0.5) * dz + zmin - solverFIT.H[ii, jj, kk, 'z'] = analytic_sol_Hz(x, y, z, (-0.5) * solverFIT.dt) - - x = (ii+0.5) * dx + xmin - y = (jj+0.5) * dy + ymin - z = (kk+0.5) * dz + zmin - solverFIT.H[ii, jj, kk, 'y'] = analytic_sol_Hy(x, y, z, (-0.5) * solverFIT.dt) + x = (ii + 0.5) * dx + xmin + y = (jj + 0.5) * dy + ymin + z = (kk + 0.5) * dz + zmin + solverFIT.H[ii, jj, kk, "y"] = analytic_sol_Hy( + x, y, z, (-0.5) * solverFIT.dt + ) - x = (ii+0.5) * dx + xmin - y = (jj+0.5) * dy + ymin - z = (kk+0.5) * dz + zmin - solverFIT.H[ii, jj, kk, 'x'] = analytic_sol_Hx(x, y, z, (-0.5) * solverFIT.dt) + x = (ii + 0.5) * dx + xmin + y = (jj + 0.5) * dy + ymin + z = (kk + 0.5) * dz + zmin + solverFIT.H[ii, jj, kk, "x"] = analytic_sol_Hx( + x, y, z, (-0.5) * solverFIT.dt + ) -#----- Time loop -----# +# ----- Time loop -----# Nt = 30 for nt in tqdm(range(Nt)): solverFIT.one_step() -#----- Compare -----# +# ----- Compare -----# -''' # Equivalent to using FDTD +""" # Equivalent to using FDTD analyticHx = np.zeros((Nx, Ny, Nz)) analyticHy = np.zeros((Nx, Ny, Nz)) analyticHz = np.zeros((Nx, Ny, Nz)) @@ -140,31 +179,36 @@ def analytic_sol_Hx(x, y, z, t): y = (jj+0.5) * dy + ymin z = (kk+0.5) * dz + zmin analyticHx[ii, jj, kk] = analytic_sol_Hx(x, y, z, (Nt-0.5) * solverFIT.dt) -''' +""" - # Equivalent to using FDTD +# Equivalent to using FDTD analyticH = Field(Nx, Ny, Nz) for ii in range(Nx): for jj in range(Ny): for kk in range(Nz): + x = (ii + 0.5) * dx + xmin + y = (jj + 0.5) * dy + ymin + z = (kk + 0.5) * dz + zmin + analyticH[ii, jj, kk, "z"] = analytic_sol_Hz( + x, y, z, (Nt - 0.5) * solverFIT.dt + ) - x = (ii+0.5) * dx + xmin - y = (jj+0.5) * dy + ymin - z = (kk+0.5) * dz + zmin - analyticH[ii, jj, kk, 'z'] = analytic_sol_Hz(x, y, z, (Nt-0.5) * solverFIT.dt) - - x = (ii+0.5) * dx + xmin - y = (jj+0.5) * dy + ymin - z = (kk+0.5) * dz + zmin - analyticH[ii, jj, kk, 'y'] = analytic_sol_Hy(x, y, z, (Nt-0.5) * solverFIT.dt) + x = (ii + 0.5) * dx + xmin + y = (jj + 0.5) * dy + ymin + z = (kk + 0.5) * dz + zmin + analyticH[ii, jj, kk, "y"] = analytic_sol_Hy( + x, y, z, (Nt - 0.5) * solverFIT.dt + ) - x = (ii+0.5) * dx + xmin - y = (jj+0.5) * dy + ymin - z = (kk+0.5) * dz + zmin - analyticH[ii, jj, kk, 'x'] = analytic_sol_Hx(x, y, z, (Nt-0.5) * solverFIT.dt) + x = (ii + 0.5) * dx + xmin + y = (jj + 0.5) * dy + ymin + z = (kk + 0.5) * dz + zmin + analyticH[ii, jj, kk, "x"] = analytic_sol_Hx( + x, y, z, (Nt - 0.5) * solverFIT.dt + ) -''' +""" gridFDTD = Grid3D(xmin, xmax, ymin, ymax, zmin, zmax, Nx, Ny, Nz, conductors, 'FDTD') analytic = EMSolver3D(gridFDTD, 'FDTD', NCFL) @@ -186,52 +230,57 @@ def analytic_sol_Hx(x, y, z, t): y = (jj + 0.5)*dy + ymin z = (kk + 0.5)*dz + zmin analytic.Hx[ii, jj, kk] = analytic_sol_Hx(x, y, z, (Nt-0.5) * analytic.dt) -''' +""" # Plot fields -planes = ['XY', 'YZ', 'XZ'] +planes = ["XY", "YZ", "XZ"] -fig, axs = plt.subplots(3,3, dpi=100, figsize=[8,6]) -dims = {0:'x', 1:'y', 2:'z'} +fig, axs = plt.subplots(3, 3, dpi=100, figsize=[8, 6]) +dims = {0: "x", 1: "y", 2: "z"} for j, plane in enumerate(planes): - if plane == 'YZ': - xx, yy, zz = int(Nx//2), slice(0,Ny), slice(0,Nz) #plane YZ - title = '(Nx/2,y,z)' - xax, yax = 'z', 'y' + if plane == "YZ": + xx, yy, zz = int(Nx // 2), slice(0, Ny), slice(0, Nz) # plane YZ + title = "(Nx/2,y,z)" + xax, yax = "z", "y" extent = (0, Nz, 0, Ny) - if plane == 'XY': - xx, yy, zz = slice(0,Nx), slice(0,Ny), int(Nz//2) #plane XY - title = '(x,y,Nz/2)' - xax, yax = 'y', 'x' + if plane == "XY": + xx, yy, zz = slice(0, Nx), slice(0, Ny), int(Nz // 2) # plane XY + title = "(x,y,Nz/2)" + xax, yax = "y", "x" extent = (0, Ny, 0, Nx) - if plane == 'XZ': - xx, yy, zz = slice(0,Nx), int(Ny//2), slice(0,Nz) #plane ZX - title = '(x,Ny/2,z)' - xax, yax = 'z', 'x' + if plane == "XZ": + xx, yy, zz = slice(0, Nx), int(Ny // 2), slice(0, Nz) # plane ZX + title = "(x,Ny/2,z)" + xax, yax = "z", "x" extent = (0, Nz, 0, Nx) - for i, ax in enumerate(axs[j,:]): - - field2plot = (solverFIT.H[xx, yy, zz, dims[i]] - analyticH[xx, yy, zz, dims[i]])/np.max(np.abs(solverFIT.H[xx, yy, zz, dims[i]])) - - im = ax.imshow(field2plot, cmap='bwr', vmin=-1., vmax=1., extent=extent) - fig.colorbar(im, label=r'$\varepsilon_{rel}$', cax=make_axes_locatable(ax).append_axes('right', size='5%', pad=0.05)) - ax.set_title(f'FIT H{dims[i]}{title}') + for i, ax in enumerate(axs[j, :]): + field2plot = ( + solverFIT.H[xx, yy, zz, dims[i]] - analyticH[xx, yy, zz, dims[i]] + ) / np.max(np.abs(solverFIT.H[xx, yy, zz, dims[i]])) + + im = ax.imshow(field2plot, cmap="bwr", vmin=-1.0, vmax=1.0, extent=extent) + fig.colorbar( + im, + label=r"$\varepsilon_{rel}$", + cax=make_axes_locatable(ax).append_axes("right", size="5%", pad=0.05), + ) + ax.set_title(f"FIT H{dims[i]}{title}") ax.set_xlabel(xax) ax.set_ylabel(yax) fig.tight_layout(pad=0.05, rect=[0, 0, 1, 0.92]) -fig.suptitle(f'H field, timestep={Nt}') -fig.savefig(f'imgResH/diff_TE{m}{n}{p}.png') +fig.suptitle(f"H field, timestep={Nt}") +fig.savefig(f"imgResH/diff_TE{m}{n}{p}.png") plt.show() -#solverFIT.H.inspect3D(cmap='rainbow', show=False, xmax=Nx-1, ymax=Ny-1, zmax=Nz-1) -#analyticH.inspect3D(cmap='rainbow') +# solverFIT.H.inspect3D(cmap='rainbow', show=False, xmax=Nx-1, ymax=Ny-1, zmax=Nz-1) +# analyticH.inspect3D(cmap='rainbow') -''' +""" plt.imshow((solverFIT.C).toarray(), cmap='bwr') plt.title('C matrix') plt.show() @@ -247,4 +296,4 @@ def analytic_sol_Hx(x, y, z, t): plt.imshow((solverFIT.C*solverFIT.iMmu).toarray(), cmap='bwr') plt.title('C * iMmu matrix') plt.show() -''' +""" diff --git a/examples/fit/script_planewave_fit.py b/examples/fit/script_planewave_fit.py index 11e3093..a30f867 100644 --- a/examples/fit/script_planewave_fit.py +++ b/examples/fit/script_planewave_fit.py @@ -1,16 +1,11 @@ import numpy as np -import matplotlib.pyplot as plt -import os, sys import pyvista as pv from tqdm import tqdm -from mpl_toolkits.axes_grid1 import make_axes_locatable -from scipy.constants import c as c_light, epsilon_0 as eps_0, mu_0 as mu_0 +from scipy.constants import c as c_light, mu_0 as mu_0 -sys.path.append('../') from solverFIT3D import SolverFIT3D -from gridFIT3D import GridFIT3D -from field import Field +from gridFIT3D import GridFIT3D # ---------- Domain setup --------- @@ -20,11 +15,11 @@ Nz = 160 # Embedded boundaries -stl_file = 'stl/sphere.stl' +stl_file = "stl/sphere.stl" surf = pv.read(stl_file) -stl_solids = {'Solid 1': stl_file} -stl_materials = {'Solid 1': 'pec'} +stl_solids = {"Solid 1": stl_file} +stl_materials = {"Solid 1": "pec"} stl_rotate = [0, 0, 0] stl_scale = 1e-3 @@ -32,74 +27,106 @@ surf = surf.rotate_y(stl_rotate[1]) surf = surf.rotate_z(stl_rotate[2]) surf = surf.scale(stl_scale) -#surf.plot() +# surf.plot() # Domain bounds xmin, xmax, ymin, ymax, zmin, zmax = surf.bounds -padx, pady, padz = (xmax-xmin)*0.2, (ymax-ymin)*0.2, (zmax-zmin)*1.0 +padx, pady, padz = (xmax - xmin) * 0.2, (ymax - ymin) * 0.2, (zmax - zmin) * 1.0 -xmin, ymin, zmin = (xmin-padx), (ymin-pady), (zmin-padz) -xmax, ymax, zmax = (xmax+padx), (ymax+pady), (zmax+padz) +xmin, ymin, zmin = (xmin - padx), (ymin - pady), (zmin - padz) +xmax, ymax, zmax = (xmax + padx), (ymax + pady), (zmax + padz) -Lx, Ly, Lz = (xmax-xmin), (ymax-ymin), (zmax-zmin) +Lx, Ly, Lz = (xmax - xmin), (ymax - ymin), (zmax - zmin) # boundary conditions -bc_low=['periodic', 'periodic', 'pec'] -bc_high=['periodic', 'periodic', 'pec'] +bc_low = ["periodic", "periodic", "pec"] +bc_high = ["periodic", "periodic", "pec"] # set FIT solver -grid = GridFIT3D(xmin, xmax, ymin, ymax, zmin, zmax, Nx, Ny, Nz, - stl_solids=stl_solids, - stl_rotate=stl_rotate, - stl_scale=stl_scale, - stl_materials=stl_materials) - -solver = SolverFIT3D(grid, - bc_low=bc_low, bc_high=bc_high, - use_stl=False) +grid = GridFIT3D( + xmin, + xmax, + ymin, + ymax, + zmin, + zmax, + Nx, + Ny, + Nz, + stl_solids=stl_solids, + stl_rotate=stl_rotate, + stl_scale=stl_scale, + stl_materials=stl_materials, +) + +solver = SolverFIT3D(grid, bc_low=bc_low, bc_high=bc_high, use_stl=False) # ------------ Time loop ---------------- + # Initial conditions def plane_wave(solver, t, nodes=15, f=None, beta=1.0): - if f is None: - T = (solver.z.max()-solver.z.min())/c_light - f = nodes/T + T = (solver.z.max() - solver.z.min()) / c_light + f = nodes / T - vp = beta*c_light # wavefront velocity beta*c - w = 2*np.pi*f # ang. frequency - kz = w/c_light # wave number + vp = beta * c_light # wavefront velocity beta*c + w = 2 * np.pi * f # ang. frequency + kz = w / c_light # wave number - solver.H[:,:,0,'y'] = -1.0 * np.cos(w*t) - solver.E[:,:,0,'x'] = 1.0 * np.cos(w*t) /(kz/(mu_0*vp)) + solver.H[:, :, 0, "y"] = -1.0 * np.cos(w * t) + solver.E[:, :, 0, "x"] = 1.0 * np.cos(w * t) / (kz / (mu_0 * vp)) -#Nt = 300 -Nt = int((zmax-zmin)/(solver.dt*c_light))+300 +# Nt = 300 +Nt = int((zmax - zmin) / (solver.dt * c_light)) + 300 plot2D = True -plot1D = False +plot1D = False for n in tqdm(range(Nt)): - # Initial condition - if n < int((zmax-zmin)/(solver.dt*c_light)): - plane_wave(solver, n*solver.dt, nodes=15) + if n < int((zmax - zmin) / (solver.dt * c_light)): + plane_wave(solver, n * solver.dt, nodes=15) # Advance solver.one_step() # Plot - if plot2D and n%10 == 0: - solver.plot2D(field='H', component='y', plane='ZX', pos=0.5, norm=None, - vmin=-1, vmax=1, figsize=[8,4], cmap='rainbow', patch_alpha=0.1, - add_patch=None, title='imgPwH/Hy', off_screen=True, n=n, interpolation='spline36') - if plot1D and n%15 == 0: - solver.plot1D(field='E', component='x', line='z', pos=0.5, - xscale='linear', yscale='linear', xlim=None, ylim=(-2.0*500,2.0*500), - figsize=[8,4], title='imgPwH/Ex1d', off_screen=True, n=n) - + if plot2D and n % 10 == 0: + solver.plot2D( + field="H", + component="y", + plane="ZX", + pos=0.5, + norm=None, + vmin=-1, + vmax=1, + figsize=[8, 4], + cmap="rainbow", + patch_alpha=0.1, + add_patch=None, + title="imgPwH/Hy", + off_screen=True, + n=n, + interpolation="spline36", + ) + if plot1D and n % 15 == 0: + solver.plot1D( + field="E", + component="x", + line="z", + pos=0.5, + xscale="linear", + yscale="linear", + xlim=None, + ylim=(-2.0 * 500, 2.0 * 500), + figsize=[8, 4], + title="imgPwH/Ex1d", + off_screen=True, + n=n, + ) + # Plot 3D built-in -''' +""" solver.plot3D(field='H', component='z', clim=None, hide_solids=None, show_solids=None, add_stl=None, stl_opacity=0.1, stl_colors='white', title=None, cmap='rainbow', clip_volume=False, clip_normal='-y', @@ -108,4 +135,4 @@ def plane_wave(solver, t, nodes=15, f=None, beta=1.0): solver.plot2D(field='E', component='x', plane='ZY', pos=0.5, norm=None, vmin=None, vmax=None, figsize=[8,4], cmap='jet', patch_alpha=0.1, add_patch=False, title=None, off_screen=True, n=n, interpolation='spline36') -''' \ No newline at end of file +""" diff --git a/examples/fit/script_wavepacket_fit.py b/examples/fit/script_wavepacket_fit.py index f22fd03..274a553 100644 --- a/examples/fit/script_wavepacket_fit.py +++ b/examples/fit/script_wavepacket_fit.py @@ -1,16 +1,10 @@ import numpy as np -import matplotlib.pyplot as plt -import os, sys -import pyvista as pv from tqdm import tqdm -from mpl_toolkits.axes_grid1 import make_axes_locatable -from scipy.constants import c as c_light, epsilon_0 as eps_0, mu_0 as mu_0 +from scipy.constants import c as c_light, mu_0 as mu_0 -sys.path.append('../') from solverFIT3D import SolverFIT3D -from gridFIT3D import GridFIT3D -from field import Field +from gridFIT3D import GridFIT3D # ---------- Domain setup --------- @@ -21,73 +15,99 @@ Nz = 150 # Domain bounds: box 10cmx10cmx30cm -xmin, xmax, ymin, ymax, zmin, zmax = -1.e-1, 1.e-1, -1.e-1, 1.e-1, -2.e-1, 2.e-1 -Lx, Ly, Lz = (xmax-xmin), (ymax-ymin), (zmax-zmin) +xmin, xmax, ymin, ymax, zmin, zmax = -1.0e-1, 1.0e-1, -1.0e-1, 1.0e-1, -2.0e-1, 2.0e-1 +Lx, Ly, Lz = (xmax - xmin), (ymax - ymin), (zmax - zmin) # boundary conditions -bc_low=['periodic', 'periodic', 'pec'] -bc_high=['periodic', 'periodic', 'pec'] +bc_low = ["periodic", "periodic", "pec"] +bc_high = ["periodic", "periodic", "pec"] # set FIT solver -grid = GridFIT3D(xmin, xmax, ymin, ymax, zmin, zmax, Nx, Ny, Nz) +grid = GridFIT3D(xmin, xmax, ymin, ymax, zmin, zmax, Nx, Ny, Nz) solver = SolverFIT3D(grid, bc_low=bc_low, bc_high=bc_high) # ------------ Source ---------------- + def wave_packet(solver, t, wavelength=10, sigma_z=10, sigma_x=5, beta=1.0, f=None): - '''2d gaussian wave packet - - * Note: params `sigma_z` and `wavelength` are expressed as - multiples of `solver.dz`. - ** Note: Param `sigma_x` is expressed as - multiple of `solver.dx`. - ''' - wavelength = wavelength*solver.dz - sigma_z = sigma_z*solver.dz - sigma_x = sigma_x*solver.dx + """2d gaussian wave packet + + * Note: params `sigma_z` and `wavelength` are expressed as + multiples of `solver.dz`. + ** Note: Param `sigma_x` is expressed as + multiple of `solver.dx`. + """ + wavelength = wavelength * solver.dz + sigma_z = sigma_z * solver.dz + sigma_x = sigma_x * solver.dx if f is None: - f = c_light/wavelength + f = c_light / wavelength + + w = 2 * np.pi * f # ang. frequency + s0 = solver.z.min() - 6 * sigma_z + s = solver.z.min() - beta * c_light * t - w = 2*np.pi*f # ang. frequency - s0 = solver.z.min()-6*sigma_z - s = solver.z.min()-beta*c_light*t - X, Y = np.meshgrid(solver.x, solver.y) - gaussxy = np.exp(-(X**2+Y**2)/(2*sigma_x**2)) - gausst = np.exp(-(s-s0)**2/(2*sigma_z**2)) + gaussxy = np.exp(-(X**2 + Y**2) / (2 * sigma_x**2)) + gausst = np.exp(-((s - s0) ** 2) / (2 * sigma_z**2)) - solver.H[:,:,0,'y'] = -1.0*np.cos(w*t)*gaussxy*gausst - solver.E[:,:,0,'x'] = 1.0*mu_0*c_light*np.cos(w*t)*gaussxy*gausst + solver.H[:, :, 0, "y"] = -1.0 * np.cos(w * t) * gaussxy * gausst + solver.E[:, :, 0, "x"] = 1.0 * mu_0 * c_light * np.cos(w * t) * gaussxy * gausst # ------------ Time loop ---------------- -Nt = int((zmax-zmin)/(solver.dt*c_light))*2 +Nt = int((zmax - zmin) / (solver.dt * c_light)) * 2 plot2D = False -plot1D = True +plot1D = True for n in tqdm(range(Nt)): - # Initial condition - if n < int((zmax-zmin)/(solver.dt*c_light)): - wave_packet(solver, n*solver.dt) + if n < int((zmax - zmin) / (solver.dt * c_light)): + wave_packet(solver, n * solver.dt) # Advance solver.one_step() # Plot - if plot2D and n%10 == 0: - solver.plot2D(field='H', component='y', plane='ZY', pos=0.5, norm='symlog', - vmin=-1, vmax=1, figsize=[8,4], cmap='RdBu', patch_alpha=0.1, - add_patch=None, title='imgGWP/Hy', off_screen=True, n=n, interpolation='spline36') - if plot1D and n%15 == 0: - solver.plot1D(field='H', component='y', line='z', pos=0.5, - xscale='linear', yscale='linear', xlim=None, ylim=(-1,1), - figsize=[8,4], title='imgGWP/Hy1d', off_screen=True, n=n, c='b') - + if plot2D and n % 10 == 0: + solver.plot2D( + field="H", + component="y", + plane="ZY", + pos=0.5, + norm="symlog", + vmin=-1, + vmax=1, + figsize=[8, 4], + cmap="RdBu", + patch_alpha=0.1, + add_patch=None, + title="imgGWP/Hy", + off_screen=True, + n=n, + interpolation="spline36", + ) + if plot1D and n % 15 == 0: + solver.plot1D( + field="H", + component="y", + line="z", + pos=0.5, + xscale="linear", + yscale="linear", + xlim=None, + ylim=(-1, 1), + figsize=[8, 4], + title="imgGWP/Hy1d", + off_screen=True, + n=n, + c="b", + ) + # Plot 3D built-in -''' +""" solver.plot3D(field='H', component='z', clim=None, hide_solids=None, show_solids=None, add_stl=None, stl_opacity=0.1, stl_colors='white', title=None, cmap='rainbow', clip_volume=True, clip_normal='-y', @@ -96,4 +116,4 @@ def wave_packet(solver, t, wavelength=10, sigma_z=10, sigma_x=5, beta=1.0, f=Non solver.plot2D(field='E', component='x', plane='ZY', pos=0.5, norm=None, vmin=None, vmax=None, figsize=[8,4], cmap='jet', patch_alpha=0.1, add_patch=False, title=None, off_screen=True, n=n, interpolation='spline36') -''' \ No newline at end of file +""" diff --git a/notebooks/001_dielectric_barriers.ipynb b/notebooks/001_dielectric_barriers.ipynb index ddd9c76..c6f2df9 100644 --- a/notebooks/001_dielectric_barriers.ipynb +++ b/notebooks/001_dielectric_barriers.ipynb @@ -39,7 +39,7 @@ }, { "cell_type": "code", - "execution_count": 1, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -47,10 +47,6 @@ "import numpy as np\n", "from tqdm import tqdm\n", "\n", - "# import wakis package (local)\n", - "import sys\n", - "sys.path.append('../wakis/')\n", - "\n", "from wakis.solverFIT3D import SolverFIT3D\n", "from wakis.gridFIT3D import GridFIT3D\n", "from wakis.sources import WavePacket\n", @@ -63,8 +59,9 @@ "import pyvista as pv\n", "import matplotlib.animation\n", "import matplotlib.pyplot as plt\n", + "\n", "plt.rcParams[\"animation.html\"] = \"jshtml\"\n", - "plt.rcParams['figure.dpi'] = 150 \n", + "plt.rcParams[\"figure.dpi\"] = 150\n", "plt.ioff()\n", "\n", "%matplotlib ipympl" @@ -100,12 +97,12 @@ "source": [ "# Barriers\n", "barrier = {}\n", - "barrier[1] = pv.Cube(x_length=5, y_length=5, center=(0,0,3)) #1x1x1 m\n", - "barrier[2] = pv.Cube(x_length=5, y_length=5, center=(0,0,5))\n", - "barrier[3] = pv.Cube(x_length=5, y_length=5, center=(0,0,7))\n", + "barrier[1] = pv.Cube(x_length=5, y_length=5, center=(0, 0, 3)) # 1x1x1 m\n", + "barrier[2] = pv.Cube(x_length=5, y_length=5, center=(0, 0, 5))\n", + "barrier[3] = pv.Cube(x_length=5, y_length=5, center=(0, 0, 7))\n", "barriers = barrier[1] + barrier[2] + barrier[3]\n", "\n", - "barriers.save('barriers.stl')\n", + "barriers.save(\"barriers.stl\")\n", "barriers.plot()" ] }, @@ -139,25 +136,34 @@ } ], "source": [ - "# Number of mesh cells - Feel free to cranck it up!! \n", + "# Number of mesh cells - Feel free to cranck it up!!\n", "Nx = 50\n", "Ny = 50\n", "Nz = 150\n", "\n", "# Stl input\n", - "stl_solids = {'barriers' : 'barriers.stl'}\n", - "stl_materials = {'barriers' : [5.0, 1.0]} #[eps, mu]\n", + "stl_solids = {\"barriers\": \"barriers.stl\"}\n", + "stl_materials = {\"barriers\": [5.0, 1.0]} # [eps, mu]\n", "\n", "# Domain bounds\n", "print(barriers.bounds)\n", "xmin, xmax, ymin, ymax, zmin, zmax = barriers.bounds\n", - "zmin, zmax = 0., 10.\n", + "zmin, zmax = 0.0, 10.0\n", "\n", "# Simulation grid\n", - "grid = GridFIT3D(xmin, xmax, ymin, ymax, zmin, zmax, \n", - " Nx, Ny, Nz, \n", - " stl_solids=stl_solids, \n", - " stl_materials=stl_materials)\n", + "grid = GridFIT3D(\n", + " xmin,\n", + " xmax,\n", + " ymin,\n", + " ymax,\n", + " zmin,\n", + " zmax,\n", + " Nx,\n", + " Ny,\n", + " Nz,\n", + " stl_solids=stl_solids,\n", + " stl_materials=stl_materials,\n", + ")\n", "grid.inspect()" ] }, @@ -188,16 +194,17 @@ ], "source": [ "# boundary conditions\n", - "bc_low=['periodic', 'periodic', 'pec'] \n", - "bc_high=['periodic', 'periodic', 'pec']\n", - "\n", - "solver = SolverFIT3D(grid=grid, # pass grid object\n", - " cfln=0.5, # Default if no dt is defined\n", - " bc_low=bc_low, \n", - " bc_high=bc_high, \n", - " use_stl=True, # Enables or disables geometry import\n", - " bg='vacuum', # Background material \n", - " )\n" + "bc_low = [\"periodic\", \"periodic\", \"pec\"]\n", + "bc_high = [\"periodic\", \"periodic\", \"pec\"]\n", + "\n", + "solver = SolverFIT3D(\n", + " grid=grid, # pass grid object\n", + " cfln=0.5, # Default if no dt is defined\n", + " bc_low=bc_low,\n", + " bc_high=bc_high,\n", + " use_stl=True, # Enables or disables geometry import\n", + " bg=\"vacuum\", # Background material\n", + ")" ] }, { @@ -232,7 +239,7 @@ } ], "source": [ - "solver.ieps.inspect(plane='YZ', dpi=100)" + "solver.ieps.inspect(plane=\"YZ\", dpi=100)" ] }, { @@ -310,20 +317,18 @@ ], "source": [ "# Add Gaussian wavepacket\n", - "source = WavePacket(xs=slice(0,Nx), ys=slice(0,Ny),\n", - " sigmaxy=0.7,\n", - " sigmaz=0.8,\n", - " wavelength=1.2,\n", - " tinj=3)\n", + "source = WavePacket(\n", + " xs=slice(0, Nx), ys=slice(0, Ny), sigmaxy=0.7, sigmaz=0.8, wavelength=1.2, tinj=3\n", + ")\n", "\n", - "t = np.arange(0,2000*solver.dt, solver.dt)\n", + "t = np.arange(0, 2000 * solver.dt, solver.dt)\n", "source.plot(t)\n", "\n", "# plot 2d\n", "X, Y = np.meshgrid(solver.x, solver.y)\n", - "gaussxy = np.exp(-(X**2+Y**2)/(2*source.sigmaxy**2))\n", + "gaussxy = np.exp(-(X**2 + Y**2) / (2 * source.sigmaxy**2))\n", "plt.figure()\n", - "plt.contourf(X,Y,gaussxy)" + "plt.contourf(X, Y, gaussxy)" ] }, { @@ -391,8 +396,8 @@ ], "source": [ "# First we check that all the fields are initialized to zero\n", - "solver.E.inspect(plane='YZ')\n", - "solver.H.inspect(plane='YZ')" + "solver.E.inspect(plane=\"YZ\")\n", + "solver.H.inspect(plane=\"YZ\")" ] }, { @@ -401,14 +406,14 @@ "metadata": {}, "outputs": [], "source": [ - "# We define the metric \n", + "# We define the metric\n", "def energy(solver):\n", - " E2 = solver.E.get_abs()**2\n", - " H2 = solver.H.get_abs()**2 \n", - " eps = 1/solver.ieps.get_abs()\n", - " mu = 1/solver.imu.get_abs() \n", + " E2 = solver.E.get_abs() ** 2\n", + " H2 = solver.H.get_abs() ** 2\n", + " eps = 1 / solver.ieps.get_abs()\n", + " mu = 1 / solver.imu.get_abs()\n", "\n", - " return 0.5*(eps*E2 + mu*H2)" + " return 0.5 * (eps * E2 + mu * H2)" ] }, { @@ -425,35 +430,47 @@ } ], "source": [ - "#initialize to 0\n", - "for d in ['x','y','z']:\n", - " solver.E[:,:,:,d] = 0.\n", - " solver.H[:,:,:,d] = 0.\n", + "# initialize to 0\n", + "for d in [\"x\", \"y\", \"z\"]:\n", + " solver.E[:, :, :, d] = 0.0\n", + " solver.H[:, :, :, d] = 0.0\n", "\n", "\n", "Hy, U = {}, {}\n", - "plot2D=False\n", + "plot2D = False\n", "\n", "# Time-stepping: wavepacket will go to zmax and back\n", - "N1 = 2*int((zmax-zmin)/c_light/solver.dt) \n", + "N1 = 2 * int((zmax - zmin) / c_light / solver.dt)\n", "for n in tqdm(range(N1)):\n", + " # apply source\n", + " source.update(solver, solver.dt * n)\n", "\n", - " #apply source\n", - " source.update(solver, solver.dt*n)\n", - "\n", - " #Advance fields\n", + " # Advance fields\n", " solver.one_step()\n", "\n", - " if n%30 == 0:\n", - " Hy[n] = solver.H[Nx//2, Ny//2, :, 'y']\n", + " if n % 30 == 0:\n", + " Hy[n] = solver.H[Nx // 2, Ny // 2, :, \"y\"]\n", " U[n] = np.sum(energy(solver))\n", "\n", " # Plot every 50 timesteps\n", - " if plot2D and n%50 == 0:\n", - " solver.plot2D(field='H', component='y', plane='ZY', pos=0.5, norm='symlog', \n", - " vmin=-1, vmax=1, figsize=[8,4], cmap='RdBu', patch_alpha=0.1, \n", - " add_patch=None, title='Hy', off_screen=True, n=n, interpolation='spline36')\n", - " " + " if plot2D and n % 50 == 0:\n", + " solver.plot2D(\n", + " field=\"H\",\n", + " component=\"y\",\n", + " plane=\"ZY\",\n", + " pos=0.5,\n", + " norm=\"symlog\",\n", + " vmin=-1,\n", + " vmax=1,\n", + " figsize=[8, 4],\n", + " cmap=\"RdBu\",\n", + " patch_alpha=0.1,\n", + " add_patch=None,\n", + " title=\"Hy\",\n", + " off_screen=True,\n", + " n=n,\n", + " interpolation=\"spline36\",\n", + " )" ] }, { @@ -521,8 +538,8 @@ ], "source": [ "# Now we can see the state of the fields after the simulations\n", - "solver.E.inspect(plane='YZ')\n", - "solver.H.inspect(plane='YZ')" + "solver.E.inspect(plane=\"YZ\")\n", + "solver.H.inspect(plane=\"YZ\")" ] }, { @@ -558,7 +575,7 @@ ], "source": [ "# quick plotting\n", - "solver.plot1D('Hy', pos=[0.5, 0.4, 0.6], colors=['tab:green', 'tab:red', 'tab:blue'])" + "solver.plot1D(\"Hy\", pos=[0.5, 0.4, 0.6], colors=[\"tab:green\", \"tab:red\", \"tab:blue\"])" ] }, { @@ -595,10 +612,21 @@ "source": [ "# Quick plotting, now in 2D\n", "plt.close()\n", - "solver.plot2D(field='H', component='y', plane='ZY', pos=0.5, norm='symlog',\n", - " figsize=[8,4], cmap='RdBu', interpolation='spline36',\n", - " add_patch=['barriers'], patch_alpha=0.6,\n", - " title='Hy', off_screen=False, n=n, )" + "solver.plot2D(\n", + " field=\"H\",\n", + " component=\"y\",\n", + " plane=\"ZY\",\n", + " pos=0.5,\n", + " norm=\"symlog\",\n", + " figsize=[8, 4],\n", + " cmap=\"RdBu\",\n", + " interpolation=\"spline36\",\n", + " add_patch=[\"barriers\"],\n", + " patch_alpha=0.6,\n", + " title=\"Hy\",\n", + " off_screen=False,\n", + " n=n,\n", + ")" ] }, { @@ -641,28 +669,30 @@ ], "source": [ "# frames animation\n", - "fig, ax = plt.subplots(figsize=[8,3])\n", + "fig, ax = plt.subplots(figsize=[8, 3])\n", + "\n", "\n", "def animate(frame):\n", " plt.cla()\n", "\n", " # field\n", " t = list(Hy.keys())\n", - " plt.plot(solver.z, Hy[t[frame]], c='r')\n", + " plt.plot(solver.z, Hy[t[frame]], c=\"r\")\n", " plt.ylim((-1, 1))\n", - " plt.xlim((0,10))\n", - " \n", + " plt.xlim((0, 10))\n", + "\n", " # barriers\n", " for b in barrier.values():\n", " xlo, xhi, ylo, yhi, zlo, zhi = b.bounds\n", - " plt.axvspan(zlo, zhi, color='g', alpha=0.3)\n", + " plt.axvspan(zlo, zhi, color=\"g\", alpha=0.3)\n", + "\n", + " plt.xlabel(\"z [m]\")\n", + " plt.ylabel(\"Magnetic field Hy [A/m]\")\n", "\n", - " plt.xlabel('z [m]')\n", - " plt.ylabel('Magnetic field Hy [A/m]')\n", "\n", "anim = matplotlib.animation.FuncAnimation(fig, animate, frames=len(Hy.keys()))\n", - "anim.save(f'dielectric_barriers.gif')\n", - "#plt.close(fig)" + "anim.save(\"dielectric_barriers.gif\")\n", + "# plt.close(fig)" ] }, { @@ -709,11 +739,13 @@ "source": [ "# plot of the energy\n", "plt.figure()\n", - "plt.plot(np.array(list(U.keys()))*solver.dt, list(U.values()), '-ob')\n", - "plt.xlim(0,N1*solver.dt)\n", - "plt.ylabel('Total Energy ', c='b')\n", - "plt.xlabel('Time [s]')\n", - "plt.title(r'Total energy $= \\frac{1}{2}\\left( \\varepsilon |E|^2 + \\mu |H|^2 \\right)$')" + "plt.plot(np.array(list(U.keys())) * solver.dt, list(U.values()), \"-ob\")\n", + "plt.xlim(0, N1 * solver.dt)\n", + "plt.ylabel(\"Total Energy \", c=\"b\")\n", + "plt.xlabel(\"Time [s]\")\n", + "plt.title(\n", + " r\"Total energy $= \\frac{1}{2}\\left( \\varepsilon |E|^2 + \\mu |H|^2 \\right)$\"\n", + ")" ] }, { diff --git a/notebooks/002_Wakefield_simulation.ipynb b/notebooks/002_Wakefield_simulation.ipynb index c34bc43..3d5b783 100644 --- a/notebooks/002_Wakefield_simulation.ipynb +++ b/notebooks/002_Wakefield_simulation.ipynb @@ -79,13 +79,19 @@ ], "source": [ "# Read geometry -change path if errors are found!\n", - "stl_cavity = 'data/002_vacuum_cavity.stl'\n", - "stl_shell = 'data/002_lossymetal_shell.stl'\n", + "stl_cavity = \"data/002_vacuum_cavity.stl\"\n", + "stl_shell = \"data/002_lossymetal_shell.stl\"\n", "\n", "pl = pv.Plotter()\n", - "pl.add_mesh(pv.read(stl_shell),color='tab:orange', specular=0.5, smooth_shading=True)\n", - "pl.add_mesh(pv.read(stl_cavity),color='tab:blue', opacity=0.5, specular=0.5, smooth_shading=True)\n", - "pl.set_background('mistyrose', top='white')\n", + "pl.add_mesh(pv.read(stl_shell), color=\"tab:orange\", specular=0.5, smooth_shading=True)\n", + "pl.add_mesh(\n", + " pv.read(stl_cavity),\n", + " color=\"tab:blue\",\n", + " opacity=0.5,\n", + " specular=0.5,\n", + " smooth_shading=True,\n", + ")\n", + "pl.set_background(\"mistyrose\", top=\"white\")\n", "pl.show()" ] }, @@ -110,21 +116,31 @@ "Nx = 100\n", "Ny = 100\n", "Nz = 101\n", - "#dt = 2.187760221e-12 # like CST\n", + "# dt = 2.187760221e-12 # like CST\n", "\n", - "stl_solids = {'cavity': stl_cavity, 'shell': stl_shell}\n", - "stl_materials = {'cavity': 'vacuum', 'shell': [30, 1.0, 30]}\n", + "stl_solids = {\"cavity\": stl_cavity, \"shell\": stl_shell}\n", + "stl_materials = {\"cavity\": \"vacuum\", \"shell\": [30, 1.0, 30]}\n", "\n", "# Domain bounds\n", "surf = pv.read(stl_shell) + pv.read(stl_cavity)\n", "xmin, xmax, ymin, ymax, zmin, zmax = surf.bounds\n", - "Lx, Ly, Lz = (xmax-xmin), (ymax-ymin), (zmax-zmin)\n", + "Lx, Ly, Lz = (xmax - xmin), (ymax - ymin), (zmax - zmin)\n", "\n", "# set grid and geometry\n", - "grid = GridFIT3D(xmin, xmax, ymin, ymax, zmin, zmax, Nx, Ny, Nz,\n", - " stl_solids=stl_solids,\n", - " stl_materials=stl_materials,\n", - " stl_scale=1.0)" + "grid = GridFIT3D(\n", + " xmin,\n", + " xmax,\n", + " ymin,\n", + " ymax,\n", + " zmin,\n", + " zmax,\n", + " Nx,\n", + " Ny,\n", + " Nz,\n", + " stl_solids=stl_solids,\n", + " stl_materials=stl_materials,\n", + " stl_scale=1.0,\n", + ")" ] }, { @@ -148,9 +164,9 @@ } ], "source": [ - "grid.plot_stl_mask('shell', add_stl='all',\n", - " stl_opacity=0.2,\n", - " show_grid=False, bounding_box=False)" + "grid.plot_stl_mask(\n", + " \"shell\", add_stl=\"all\", stl_opacity=0.2, show_grid=False, bounding_box=False\n", + ")" ] }, { @@ -218,7 +234,7 @@ ], "source": [ "# [OPTIONAL] Save grid to HDF5 file for later use\n", - "grid.save_to_h5('grid.h5')\n", + "grid.save_to_h5(\"grid.h5\")\n", "\n", "# [OPTIONAL] Load grid from HDF5 file or re-instantiate the class from file\n", "# grid.load_from_h5('grid.h5')\n", @@ -253,16 +269,18 @@ ], "source": [ "# boundary conditions\n", - "bc_low=['pec', 'pec', 'pec']\n", - "bc_high=['pec', 'pec', 'pec']\n", + "bc_low = [\"pec\", \"pec\", \"pec\"]\n", + "bc_high = [\"pec\", \"pec\", \"pec\"]\n", "\n", - "solver = SolverFIT3D(grid,\n", - " bc_low=bc_low, bc_high=bc_high,\n", - " use_stl=True,\n", - " bg='pec', #background material\n", - " use_gpu=False,\n", - " dtype=np.float32,\n", - " )" + "solver = SolverFIT3D(\n", + " grid,\n", + " bc_low=bc_low,\n", + " bc_high=bc_high,\n", + " use_stl=True,\n", + " bg=\"pec\", # background material\n", + " use_gpu=False,\n", + " dtype=np.float32,\n", + ")" ] }, { @@ -293,7 +311,7 @@ } ], "source": [ - "solver.sigma.inspect3D(field='x', ymax=0, grid=grid, show_grid=False, backend='pyvista')" + "solver.sigma.inspect3D(field=\"x\", ymax=0, grid=grid, show_grid=False, backend=\"pyvista\")" ] }, { @@ -329,7 +347,9 @@ ], "source": [ "# Inspect the material tensors before running the simulations\n", - "solver.ieps.inspect(plane='XY',)" + "solver.ieps.inspect(\n", + " plane=\"XY\",\n", + ")" ] }, { @@ -365,9 +385,9 @@ ], "source": [ "# Modify the field to add initial conditions and quickly inspect the modifications\n", - "solver.E[10,20:75,:,'z'] = 1.0\n", - "solver.E.inspect(plane='XY')\n", - "solver.E[10,20:40,:,'z'] = 0.0 # And restore it back!" + "solver.E[10, 20:75, :, \"z\"] = 1.0\n", + "solver.E.inspect(plane=\"XY\")\n", + "solver.E[10, 20:40, :, \"z\"] = 0.0 # And restore it back!" ] }, { @@ -392,26 +412,33 @@ "source": [ "# ------------ Beam source ----------------\n", "# Beam parameters\n", - "sigmaz = 10e-2 #[m] -> 2 GHz\n", - "q = 1e-9 #[C]\n", - "beta = 1.0 # beam beta\n", - "xs = 0. # x source position [m]\n", - "ys = 0. # y source position [m]\n", - "xt = 0. # x test position [m]\n", - "yt = 0. # y test position [m]\n", + "sigmaz = 10e-2 # [m] -> 2 GHz\n", + "q = 1e-9 # [C]\n", + "beta = 1.0 # beam beta\n", + "xs = 0.0 # x source position [m]\n", + "ys = 0.0 # y source position [m]\n", + "xt = 0.0 # x test position [m]\n", + "yt = 0.0 # y test position [m]\n", "# [DEFAULT] tinj = 8.53*sigmaz/c_light # injection time offset [s]\n", "\n", "\n", "# ----------- Solver setup ----------\n", "# Wakefield post-processor\n", - "wakelength = 60. #[m]\n", - "add_space = 10 # no. cells\n", + "wakelength = 60.0 # [m]\n", + "add_space = 10 # no. cells\n", "\n", - "wake = WakeSolver(q=q, sigmaz=sigmaz, beta=beta,\n", - " xsource=xs, ysource=ys, xtest=xt, ytest=yt,\n", - " add_space=add_space,\n", - " results_folder='002_results/',\n", - " Ez_file='002_results/Ez.h5',)" + "wake = WakeSolver(\n", + " q=q,\n", + " sigmaz=sigmaz,\n", + " beta=beta,\n", + " xsource=xs,\n", + " ysource=ys,\n", + " xtest=xt,\n", + " ytest=yt,\n", + " add_space=add_space,\n", + " results_folder=\"002_results/\",\n", + " Ez_file=\"002_results/Ez.h5\",\n", + ")" ] }, { @@ -442,9 +469,14 @@ } ], "source": [ - "pl = solver.inspect(wake=wake, opacity=1.0, add_silhouette=True,\n", - " off_screen=False, specular=0.,\n", - " smooth_shading=False )\n", + "pl = solver.inspect(\n", + " wake=wake,\n", + " opacity=1.0,\n", + " add_silhouette=True,\n", + " off_screen=False,\n", + " specular=0.0,\n", + " smooth_shading=False,\n", + ")\n", "\n", "# If off_screen = True, we can save the scene in HTML or as a screenshot\n", "# pl.export_html('002_inspect.html')\n", @@ -464,10 +496,7 @@ "metadata": {}, "outputs": [], "source": [ - "solver.wakesolve(wakelength=wakelength,\n", - " wake=wake,\n", - " add_space=add_space,\n", - " plot=False)" + "solver.wakesolve(wakelength=wakelength, wake=wake, add_space=add_space, plot=False)" ] }, { @@ -504,27 +533,27 @@ "# Compare to benchmark data, if available\n", "compare_to_CST = False\n", "\n", - "fig, ax = plt.subplots(1,2, figsize=[12,4], dpi=150)\n", - "ax[0].plot(wake.s*1e2, wake.WP, c='r', lw=1.5, label='Wakis')\n", - "ax[0].set_xlabel('s [cm]')\n", - "ax[0].set_ylabel('Longitudinal wake potential [V/pC]', color='r')\n", + "fig, ax = plt.subplots(1, 2, figsize=[12, 4], dpi=150)\n", + "ax[0].plot(wake.s * 1e2, wake.WP, c=\"r\", lw=1.5, label=\"Wakis\")\n", + "ax[0].set_xlabel(\"s [cm]\")\n", + "ax[0].set_ylabel(\"Longitudinal wake potential [V/pC]\", color=\"r\")\n", "ax[0].legend()\n", "\n", - "ax[1].plot(wake.f*1e-9, np.abs(wake.Z), c='b', lw=1.5, label='Wakis')\n", - "ax[1].set_xlabel('f [GHz]')\n", - "ax[1].set_ylabel('Longitudinal impedance [Abs][$\\Omega$]', color='b')\n", + "ax[1].plot(wake.f * 1e-9, np.abs(wake.Z), c=\"b\", lw=1.5, label=\"Wakis\")\n", + "ax[1].set_xlabel(\"f [GHz]\")\n", + "ax[1].set_ylabel(\"Longitudinal impedance [Abs][$\\Omega$]\", color=\"b\")\n", "ax[1].legend()\n", "\n", "if compare_to_CST:\n", " # CST wake and impedace data:\n", - " cstWP = wake.read_txt('cst/WP.txt')\n", - " cstZ = wake.read_txt('cst/Z.txt')\n", - " ax[0].plot(cstWP[0], cstWP[1], c='k', ls='--', lw=1.5, label='CST')\n", - " ax[1].plot(cstZ[0], cstZ[1], c='k', ls='--', lw=1.5, label='CST')\n", - " fig.suptitle('Benchmark with CST Wakefield Solver')\n", + " cstWP = wake.read_txt(\"cst/WP.txt\")\n", + " cstZ = wake.read_txt(\"cst/Z.txt\")\n", + " ax[0].plot(cstWP[0], cstWP[1], c=\"k\", ls=\"--\", lw=1.5, label=\"CST\")\n", + " ax[1].plot(cstZ[0], cstZ[1], c=\"k\", ls=\"--\", lw=1.5, label=\"CST\")\n", + " fig.suptitle(\"Benchmark with CST Wakefield Solver\")\n", "\n", "fig.tight_layout()\n", - "fig.savefig('002_results/benchmark.png')" + "fig.savefig(\"002_results/benchmark.png\")" ] }, { @@ -540,7 +569,7 @@ "metadata": {}, "outputs": [], "source": [ - "wake.load_results(folder='002_results/')" + "wake.load_results(folder=\"002_results/\")" ] }, { @@ -574,20 +603,31 @@ "from wakis.sources import Beam\n", "from tqdm import tqdm\n", "\n", - "beam = Beam(q=q, sigmaz=sigmaz, beta=beta,\n", - " xsource=xs, ysource=ys)\n", + "beam = Beam(q=q, sigmaz=sigmaz, beta=beta, xsource=xs, ysource=ys)\n", "\n", "Nt = 3000\n", "for n in tqdm(range(Nt)):\n", + " beam.update(solver, n * solver.dt)\n", "\n", - " beam.update(solver, n*solver.dt)\n", - "\n", - " if n%500 == 0 and n>3000:\n", - " solver.plot3DonSTL('E', component='Abs', cmap='rainbow', clim=[0, 500],\n", - " stl_with_field='cavity', field_opacity=1.0,\n", - " stl_transparent='shell', stl_opacity=0.1, stl_colors='white',\n", - " clip_plane=True, clip_normal='-y', clip_origin=[0,0,0],\n", - " off_screen=True, zoom=1.2, n=n, title='002_img/Ez')\n", + " if n % 500 == 0 and n > 3000:\n", + " solver.plot3DonSTL(\n", + " \"E\",\n", + " component=\"Abs\",\n", + " cmap=\"rainbow\",\n", + " clim=[0, 500],\n", + " stl_with_field=\"cavity\",\n", + " field_opacity=1.0,\n", + " stl_transparent=\"shell\",\n", + " stl_opacity=0.1,\n", + " stl_colors=\"white\",\n", + " clip_plane=True,\n", + " clip_normal=\"-y\",\n", + " clip_origin=[0, 0, 0],\n", + " off_screen=True,\n", + " zoom=1.2,\n", + " n=n,\n", + " title=\"002_img/Ez\",\n", + " )\n", "\n", " solver.one_step()" ] @@ -614,23 +654,26 @@ "outputs": [], "source": [ "from matplotlib.colors import LinearSegmentedColormap\n", - "cmap = LinearSegmentedColormap.from_list('name', plt.cm.jet(np.linspace(0.1, 0.9))) # CST's colormap\n", "\n", - "plotkw2D = {'title':'002_img/Ez',\n", - " 'add_patch':['cavity'], 'patch_alpha':1.0,\n", - " 'patch_reverse' : True,\n", - " 'vmin':-1e3, 'vmax':1e3,\n", - " 'cmap': cmap,\n", - " 'plane': [int(Nx/2), slice(0, Ny), slice(add_space, -add_space)]}\n", + "cmap = LinearSegmentedColormap.from_list(\n", + " \"name\", plt.cm.jet(np.linspace(0.1, 0.9))\n", + ") # CST's colormap\n", "\n", + "plotkw2D = {\n", + " \"title\": \"002_img/Ez\",\n", + " \"add_patch\": [\"cavity\"],\n", + " \"patch_alpha\": 1.0,\n", + " \"patch_reverse\": True,\n", + " \"vmin\": -1e3,\n", + " \"vmax\": 1e3,\n", + " \"cmap\": cmap,\n", + " \"plane\": [int(Nx / 2), slice(0, Ny), slice(add_space, -add_space)],\n", + "}\n", "\n", - "from wakis.sources import Beam\n", - "beam = Beam(q=q, sigmaz=sigmaz, beta=beta,\n", - " xsource=xs, ysource=ys)\n", "\n", - "solver.emsolve(Nt=8000, source=beam,\n", - " plot=True, plot_every=100,\n", - " **plotkw2D)" + "beam = Beam(q=q, sigmaz=sigmaz, beta=beta, xsource=xs, ysource=ys)\n", + "\n", + "solver.emsolve(Nt=8000, source=beam, plot=True, plot_every=100, **plotkw2D)" ] }, { @@ -646,17 +689,16 @@ "metadata": {}, "outputs": [], "source": [ - "plotkw3D = {'title':'002_img/Ez3d',\n", - " 'add_stl':'shell',\n", - " 'field_opacity':0.5,}\n", + "plotkw3D = {\n", + " \"title\": \"002_img/Ez3d\",\n", + " \"add_stl\": \"shell\",\n", + " \"field_opacity\": 0.5,\n", + "}\n", "\n", - "from wakis.sources import Beam\n", - "beam = Beam(q=q, sigmaz=sigmaz, beta=beta,\n", - " xsource=xs, ysource=ys)\n", "\n", - "solver.emsolve(Nt=8000, source=beam,\n", - " plot3d=True, plot_every=100,\n", - " **plotkw3D)" + "beam = Beam(q=q, sigmaz=sigmaz, beta=beta, xsource=xs, ysource=ys)\n", + "\n", + "solver.emsolve(Nt=8000, source=beam, plot3d=True, plot_every=100, **plotkw3D)" ] } ], diff --git a/notebooks/003_PML_absorption1d.ipynb b/notebooks/003_PML_absorption1d.ipynb index 13e1582..c8c0acb 100644 --- a/notebooks/003_PML_absorption1d.ipynb +++ b/notebooks/003_PML_absorption1d.ipynb @@ -37,12 +37,13 @@ "import pyvista as pv\n", "import matplotlib.animation\n", "import matplotlib.pyplot as plt\n", + "\n", "plt.rcParams[\"animation.html\"] = \"jshtml\"\n", - "plt.rcParams['figure.dpi'] = 150 \n", + "plt.rcParams[\"figure.dpi\"] = 150\n", "plt.ioff()\n", "\n", "%matplotlib ipympl\n", - "pv.set_jupyter_backend('html') " + "pv.set_jupyter_backend(\"html\")" ] }, { @@ -59,10 +60,17 @@ "outputs": [], "source": [ "# barrier dimensions\n", - "lx, ly, lz = 5., 5., 10.\n", + "lx, ly, lz = 5.0, 5.0, 10.0\n", "\n", "# Domain bounds\n", - "xmin, xmax, ymin, ymax, zmin, zmax = -lx/2., lx/2., -ly/2., ly/2., -lz/2.,lz/2.\n", + "xmin, xmax, ymin, ymax, zmin, zmax = (\n", + " -lx / 2.0,\n", + " lx / 2.0,\n", + " -ly / 2.0,\n", + " ly / 2.0,\n", + " -lz / 2.0,\n", + " lz / 2.0,\n", + ")\n", "\n", "# Number of mesh cells\n", "Nx = 4\n", @@ -70,7 +78,7 @@ "Nz = 800\n", "\n", "# cell size\n", - "dx, dy, dz = lx/Nx, ly/Ny, lz/Nz\n", + "dx, dy, dz = lx / Nx, ly / Ny, lz / Nz\n", "\n", "# Barriers\n", "barrier = {}\n", @@ -78,22 +86,33 @@ "stl_materials = {}\n", "\n", "n = 16\n", - "ss = np.linspace( np.sqrt(1.e-4), np.sqrt(1.e-1), n, )\n", - "ss = ss*ss\n", + "ss = np.linspace(\n", + " np.sqrt(1.0e-4),\n", + " np.sqrt(1.0e-1),\n", + " n,\n", + ")\n", + "ss = ss * ss\n", "\n", - "width = 2.*dz\n", - "pos_z_begin = zmax - n*width\n", + "width = 2.0 * dz\n", + "pos_z_begin = zmax - n * width\n", "\n", "for k, si in enumerate(ss):\n", - " \n", - " name = f'b{k}'\n", - " file_name = f'notebooks/data/003_barrier{k}.stl'\n", - " \n", - " barrier[k] = pv.Cube( x_length=lx, y_length=ly, z_length=width, center=(0,0,pos_z_begin+k*width))\n", - " barrier[k].save( file_name, )\n", + " name = f\"b{k}\"\n", + " file_name = f\"notebooks/data/003_barrier{k}.stl\"\n", + "\n", + " barrier[k] = pv.Cube(\n", + " x_length=lx, y_length=ly, z_length=width, center=(0, 0, pos_z_begin + k * width)\n", + " )\n", + " barrier[k].save(\n", + " file_name,\n", + " )\n", "\n", " stl_solids[name] = file_name\n", - " stl_materials[name] = [ 1.+si, 1., si, ]" + " stl_materials[name] = [\n", + " 1.0 + si,\n", + " 1.0,\n", + " si,\n", + " ]" ] }, { @@ -126,12 +145,21 @@ ], "source": [ "# Simulation grid\n", - "grid = GridFIT3D(xmin, xmax, ymin, ymax, zmin, zmax, \n", - " Nx, Ny, Nz, \n", - " stl_solids=stl_solids, \n", - " stl_materials=stl_materials)\n", + "grid = GridFIT3D(\n", + " xmin,\n", + " xmax,\n", + " ymin,\n", + " ymax,\n", + " zmin,\n", + " zmax,\n", + " Nx,\n", + " Ny,\n", + " Nz,\n", + " stl_solids=stl_solids,\n", + " stl_materials=stl_materials,\n", + ")\n", "for k in grid.stl_colors:\n", - " grid.stl_colors[k] = 'tab:red'\n", + " grid.stl_colors[k] = \"tab:red\"\n", "grid.plot_solids(bounding_box=True)" ] }, @@ -161,17 +189,18 @@ ], "source": [ "# boundary conditions\n", - "bc_low=['periodic', 'periodic', 'pec'] \n", - "bc_high=['periodic', 'periodic', 'pec']\n", - "\n", - "solver = SolverFIT3D(grid=grid, # pass grid object\n", - " cfln=0.50, # Default if no dt is defined\n", - " bc_low=bc_low, \n", - " bc_high=bc_high, \n", - " use_stl=True, # Enables or disables geometry import\n", - " bg='vacuum', # Background material \n", - " use_gpu=False,\n", - " )\n" + "bc_low = [\"periodic\", \"periodic\", \"pec\"]\n", + "bc_high = [\"periodic\", \"periodic\", \"pec\"]\n", + "\n", + "solver = SolverFIT3D(\n", + " grid=grid, # pass grid object\n", + " cfln=0.50, # Default if no dt is defined\n", + " bc_low=bc_low,\n", + " bc_high=bc_high,\n", + " use_stl=True, # Enables or disables geometry import\n", + " bg=\"vacuum\", # Background material\n", + " use_gpu=False,\n", + ")" ] }, { @@ -214,23 +243,28 @@ ], "source": [ "# Add Gaussian wavepacket\n", - "source = WavePacket(xs=slice(0,Nx), ys=slice(0,Ny),\n", - " sigmaxy=100.,\n", - " sigmaz=.4,\n", - " wavelength=16.*dz,\n", - " tinj=2.0,\n", - " amplitude=1.)\n", - "\n", - "t = np.arange(0,(zmax-zmin)/c_light, solver.dt)\n", + "source = WavePacket(\n", + " xs=slice(0, Nx),\n", + " ys=slice(0, Ny),\n", + " sigmaxy=100.0,\n", + " sigmaz=0.4,\n", + " wavelength=16.0 * dz,\n", + " tinj=2.0,\n", + " amplitude=1.0,\n", + ")\n", + "\n", + "t = np.arange(0, (zmax - zmin) / c_light, solver.dt)\n", "\n", "# Plot source in time\n", - "source.plot( t, )\n", + "source.plot(\n", + " t,\n", + ")\n", "\n", "# plot 2d\n", "X, Y = np.meshgrid(solver.x, solver.y)\n", - "gaussxy = np.exp(-(X**2+Y**2)/(2*source.sigmaxy**2))\n", - "#plt.figure()\n", - "#plt.contourf(X,Y,gaussxy)" + "gaussxy = np.exp(-(X**2 + Y**2) / (2 * source.sigmaxy**2))\n", + "# plt.figure()\n", + "# plt.contourf(X,Y,gaussxy)" ] }, { @@ -254,38 +288,50 @@ } ], "source": [ - "#initialize to 0\n", - "for d in ['x','y','z']:\n", - " solver.E[:,:,:,d] = 0.\n", - " solver.H[:,:,:,d] = 0.\n", - " solver.J[:,:,:,d] = 0.\n", + "# initialize to 0\n", + "for d in [\"x\", \"y\", \"z\"]:\n", + " solver.E[:, :, :, d] = 0.0\n", + " solver.H[:, :, :, d] = 0.0\n", + " solver.J[:, :, :, d] = 0.0\n", "\n", "# Fields to save\n", "Ex, Ey, Hx, Hy, Jz = [], [], [], [], []\n", "\n", - "plot2D=False #Turn on to generate 2d plots on-the-fly!\n", + "plot2D = False # Turn on to generate 2d plots on-the-fly!\n", "\n", - "N1 = 5*int((2+zmax-zmin)/c_light/solver.dt)\n", + "N1 = 5 * int((2 + zmax - zmin) / c_light / solver.dt)\n", "for n in tqdm(range(N1)):\n", + " # apply source\n", + " source.update(solver, solver.dt * n)\n", "\n", - " #apply source\n", - " source.update(solver, solver.dt*n)\n", - "\n", - " #Advance fields\n", + " # Advance fields\n", " solver.one_step()\n", "\n", - " if n%100 == 0:\n", - " Ex.append(solver.E[Nx//2, Ny//2, :, 'x'])\n", - " Ey.append(solver.E[Nx//2, Ny//2, :, 'y'])\n", - " Hx.append(solver.H[Nx//2, Ny//2, :, 'x'])\n", - " Hy.append(solver.H[Nx//2, Ny//2, :, 'y'])\n", - " Jz.append(solver.J[Nx//2, Ny//2, :, 'z'])\n", - "\n", - " if plot2D and n%100 == 0:\n", - " solver.plot2D(field='H', component='y', plane='ZY', pos=0.5, norm='symlog', \n", - " vmin=-1, vmax=1, figsize=[8,4], cmap='RdBu', patch_alpha=0.1, \n", - " add_patch=False, off_screen=True, n=n, interpolation='spline36',\n", - " title='notebooks/data/003_Hy',)" + " if n % 100 == 0:\n", + " Ex.append(solver.E[Nx // 2, Ny // 2, :, \"x\"])\n", + " Ey.append(solver.E[Nx // 2, Ny // 2, :, \"y\"])\n", + " Hx.append(solver.H[Nx // 2, Ny // 2, :, \"x\"])\n", + " Hy.append(solver.H[Nx // 2, Ny // 2, :, \"y\"])\n", + " Jz.append(solver.J[Nx // 2, Ny // 2, :, \"z\"])\n", + "\n", + " if plot2D and n % 100 == 0:\n", + " solver.plot2D(\n", + " field=\"H\",\n", + " component=\"y\",\n", + " plane=\"ZY\",\n", + " pos=0.5,\n", + " norm=\"symlog\",\n", + " vmin=-1,\n", + " vmax=1,\n", + " figsize=[8, 4],\n", + " cmap=\"RdBu\",\n", + " patch_alpha=0.1,\n", + " add_patch=False,\n", + " off_screen=True,\n", + " n=n,\n", + " interpolation=\"spline36\",\n", + " title=\"notebooks/data/003_Hy\",\n", + " )" ] }, { @@ -317,7 +363,9 @@ ], "source": [ "# quick 3d plotting\n", - "solver.plot3D( 'Hy', add_stl='b1', clip_interactive=True, stl_opacity=0.4, cmap='gnuplot' )" + "solver.plot3D(\n", + " \"Hy\", add_stl=\"b1\", clip_interactive=True, stl_opacity=0.4, cmap=\"gnuplot\"\n", + ")" ] }, { @@ -360,43 +408,87 @@ ], "source": [ "from argparse import Namespace as NS\n", - "fields = { \n", - " 'Ex': NS( values=np.array(Ex), units='', ), \n", - " 'Ey': NS( values=np.array(Ey), units='', ), \n", - " 'Hx': NS( values=np.array(Hx), units='', ),\n", - " 'Hy': NS( values=np.array(Hy), units='', ),\n", - " 'Jz': NS( values=np.array(Jz), units='', ),\n", + "\n", + "fields = {\n", + " \"Ex\": NS(\n", + " values=np.array(Ex),\n", + " units=\"\",\n", + " ),\n", + " \"Ey\": NS(\n", + " values=np.array(Ey),\n", + " units=\"\",\n", + " ),\n", + " \"Hx\": NS(\n", + " values=np.array(Hx),\n", + " units=\"\",\n", + " ),\n", + " \"Hy\": NS(\n", + " values=np.array(Hy),\n", + " units=\"\",\n", + " ),\n", + " \"Jz\": NS(\n", + " values=np.array(Jz),\n", + " units=\"\",\n", + " ),\n", "}\n", "\n", "# frames animation\n", - "fig, axs = plt.subplots( len(fields), 1, figsize=[8,8], dpi=150, )\n", - "\n", - "axs[-1].set_xlabel(f'z [m]')\n", - "for ax, ( ki, vi, ) in zip(axs,fields.items()):\n", - "\n", - " ax.set_ylabel(f'Field {ki} {vi.units}')\n", - "\n", - " q = np.abs(vi.values).max()\n", - " ax.set_ylim((-q,q))\n", - " ax.set_xlim((zmin,zmax))\n", - " \n", - " # barriers\n", - " for b, si in zip(barrier.values(),ss):\n", - " xlo, xhi, ylo, yhi, zlo, zhi = b.bounds\n", - " ax.axvspan(zlo, zhi, color='g', alpha=.1 + .6*si/ss.max())\n", - "\n", - " ls = [ ax.plot(solver.z, np.full_like( solver.z, np.nan, ), c='r')[0] for ax in axs ]\n", - "\n", - "def animate(frame,ls,fields,axs):\n", - " fig.gca()\n", - " axs[0].set_title(f'frame {frame:6d}')\n", - " # field\n", - " for li, ( ki, vi, ) in zip(ls,fields.items()):\n", - " li.set( data=(solver.z,vi.values[frame]), )\n", - " return ls\n", - "\n", - "anim = matplotlib.animation.FuncAnimation(fig, lambda frame: animate(frame,ls,fields,axs), frames=len(vi.values), )\n", - "anim.save(f'notebooks/data/003_movie.gif')" + "fig, axs = plt.subplots(\n", + " len(fields),\n", + " 1,\n", + " figsize=[8, 8],\n", + " dpi=150,\n", + ")\n", + "\n", + "axs[-1].set_xlabel(\"z [m]\")\n", + "for ax, (\n", + " ki,\n", + " vi,\n", + ") in zip(axs, fields.items()):\n", + " ax.set_ylabel(f\"Field {ki} {vi.units}\")\n", + "\n", + " q = np.abs(vi.values).max()\n", + " ax.set_ylim((-q, q))\n", + " ax.set_xlim((zmin, zmax))\n", + "\n", + " # barriers\n", + " for b, si in zip(barrier.values(), ss):\n", + " xlo, xhi, ylo, yhi, zlo, zhi = b.bounds\n", + " ax.axvspan(zlo, zhi, color=\"g\", alpha=0.1 + 0.6 * si / ss.max())\n", + "\n", + " ls = [\n", + " ax.plot(\n", + " solver.z,\n", + " np.full_like(\n", + " solver.z,\n", + " np.nan,\n", + " ),\n", + " c=\"r\",\n", + " )[0]\n", + " for ax in axs\n", + " ]\n", + "\n", + "\n", + "def animate(frame, ls, fields, axs):\n", + " fig.gca()\n", + " axs[0].set_title(f\"frame {frame:6d}\")\n", + " # field\n", + " for li, (\n", + " ki,\n", + " vi,\n", + " ) in zip(ls, fields.items()):\n", + " li.set(\n", + " data=(solver.z, vi.values[frame]),\n", + " )\n", + " return ls\n", + "\n", + "\n", + "anim = matplotlib.animation.FuncAnimation(\n", + " fig,\n", + " lambda frame: animate(frame, ls, fields, axs),\n", + " frames=len(vi.values),\n", + ")\n", + "anim.save(\"notebooks/data/003_movie.gif\")" ] }, { @@ -421,17 +513,23 @@ } ], "source": [ - "def metric_area( f, ):\n", + "def metric_area(\n", + " f,\n", + "):\n", " return np.sum(np.abs(f))\n", "\n", - "def metric_length( f, ):\n", + "\n", + "def metric_length(\n", + " f,\n", + "):\n", " df = np.diff(f)\n", - " return np.sum(np.sqrt(1. + df*df))/len(df) - 1\n", + " return np.sum(np.sqrt(1.0 + df * df)) / len(df) - 1\n", + "\n", "\n", "for vi in fields.values():\n", - " vi.area = np.array([ metric_area(fs) for fs in vi.values ])\n", + " vi.area = np.array([metric_area(fs) for fs in vi.values])\n", " vi.area /= vi.area.max()\n", - " vi.length = np.array([ metric_length(fs) for fs in vi.values ])\n", + " vi.length = np.array([metric_length(fs) for fs in vi.values])\n", " vi.length /= vi.length.max()" ] }, @@ -478,11 +576,27 @@ } ], "source": [ - "fig, ( ax1, ax2, ) = plt.subplots( 1, 2, tight_layout=True, )\n", + "(\n", + " fig,\n", + " (\n", + " ax1,\n", + " ax2,\n", + " ),\n", + ") = plt.subplots(\n", + " 1,\n", + " 2,\n", + " tight_layout=True,\n", + ")\n", "\n", "for ki, vi in fields.items():\n", - " ax1.plot( vi.area, label=ki, )\n", - " ax2.plot( vi.length, label=ki, )\n", + " ax1.plot(\n", + " vi.area,\n", + " label=ki,\n", + " )\n", + " ax2.plot(\n", + " vi.length,\n", + " label=ki,\n", + " )\n", "\n", "ax1.legend(), ax2.legend()" ] diff --git a/notebooks/004_Wakefield_simulation_and_extrapolation.ipynb b/notebooks/004_Wakefield_simulation_and_extrapolation.ipynb index 37b7d7e..329e5fe 100644 --- a/notebooks/004_Wakefield_simulation_and_extrapolation.ipynb +++ b/notebooks/004_Wakefield_simulation_and_extrapolation.ipynb @@ -24,11 +24,11 @@ "import matplotlib.pyplot as plt\n", "\n", "from wakis import SolverFIT3D\n", - "from wakis import GridFIT3D \n", + "from wakis import GridFIT3D\n", "from wakis import WakeSolver\n", "\n", "%matplotlib ipympl\n", - "pv.set_jupyter_backend('client')" + "pv.set_jupyter_backend(\"client\")" ] }, { @@ -62,17 +62,17 @@ "source": [ "# ---------- Domain setup ---------\n", "# Read geometry -change path if errors are found!\n", - "stl_cavity = 'notebooks/data/002_vacuum_cavity.stl' \n", - "stl_shell = 'notebooks/data/002_lossymetal_shell.stl'\n", + "stl_cavity = \"notebooks/data/002_vacuum_cavity.stl\"\n", + "stl_shell = \"notebooks/data/002_lossymetal_shell.stl\"\n", "\n", "# Set up geometry & materials dictionaries\n", - "stl_solids = {'cavity': stl_cavity, 'shell': stl_shell}\n", - "stl_materials = {'cavity': 'vacuum', 'shell': [30, 1.0, 30]}\n", + "stl_solids = {\"cavity\": stl_cavity, \"shell\": stl_shell}\n", + "stl_materials = {\"cavity\": \"vacuum\", \"shell\": [30, 1.0, 30]}\n", "\n", "# Domain bounds\n", "surf = pv.read(stl_shell) + pv.read(stl_cavity)\n", "xmin, xmax, ymin, ymax, zmin, zmax = surf.bounds\n", - "Lx, Ly, Lz = (xmax-xmin), (ymax-ymin), (zmax-zmin)\n", + "Lx, Ly, Lz = (xmax - xmin), (ymax - ymin), (zmax - zmin)\n", "\n", "# Number of mesh cells\n", "Nx = 80\n", @@ -80,10 +80,20 @@ "Nz = 161\n", "\n", "# set grid and geometry\n", - "grid = GridFIT3D(xmin, xmax, ymin, ymax, zmin, zmax, Nx, Ny, Nz, \n", - " stl_solids=stl_solids, \n", - " stl_materials=stl_materials,\n", - " stl_scale=1.0)" + "grid = GridFIT3D(\n", + " xmin,\n", + " xmax,\n", + " ymin,\n", + " ymax,\n", + " zmin,\n", + " zmax,\n", + " Nx,\n", + " Ny,\n", + " Nz,\n", + " stl_solids=stl_solids,\n", + " stl_materials=stl_materials,\n", + " stl_scale=1.0,\n", + ")" ] }, { @@ -124,14 +134,13 @@ ], "source": [ "# boundary conditions\n", - "bc_low=['pec', 'pec', 'pml']\n", - "bc_high=['pec', 'pec', 'pml']\n", + "bc_low = [\"pec\", \"pec\", \"pml\"]\n", + "bc_high = [\"pec\", \"pec\", \"pml\"]\n", "\n", - "n_pml = 10 # number of PML layers\n", - "solver = SolverFIT3D(grid, \n", - " bc_low=bc_low, bc_high=bc_high, \n", - " use_stl=True, bg='pec',\n", - " n_pml=n_pml)" + "n_pml = 10 # number of PML layers\n", + "solver = SolverFIT3D(\n", + " grid, bc_low=bc_low, bc_high=bc_high, use_stl=True, bg=\"pec\", n_pml=n_pml\n", + ")" ] }, { @@ -156,26 +165,34 @@ "source": [ "# ------------ Beam source ----------------\n", "# Beam parameters\n", - "sigmaz = 10e-2 #[m] -> 2 GHz\n", - "q = 1e-9 #[C]\n", - "beta = 1.0 # beam beta \n", - "xs = 0. # x source position [m]\n", - "ys = 0. # y source position [m]\n", - "xt = 0. # x test position [m]\n", - "yt = 0. # y test position [m]\n", - "# [DEFAULT] tinj = 8.53*sigmaz/c_light # injection time offset [s] \n", + "sigmaz = 10e-2 # [m] -> 2 GHz\n", + "q = 1e-9 # [C]\n", + "beta = 1.0 # beam beta\n", + "xs = 0.0 # x source position [m]\n", + "ys = 0.0 # y source position [m]\n", + "xt = 0.0 # x test position [m]\n", + "yt = 0.0 # y test position [m]\n", + "# [DEFAULT] tinj = 8.53*sigmaz/c_light # injection time offset [s]\n", "\n", "\n", "# ----------- Solver setup ----------\n", "# Wakefield post-processor\n", - "wakelength = 10. # [m] -> Partially decayed\n", + "wakelength = 10.0 # [m] -> Partially decayed\n", "skip_cells = n_pml + 2 # no. cells to skip from wake integration (>= PML cells)\n", "\n", - "wake = WakeSolver(q=q, sigmaz=sigmaz, beta=beta,\n", - " xsource=xs, ysource=ys, xtest=xt, ytest=yt,\n", - " skip_cells=skip_cells, wakelength=wakelength,\n", - " results_folder='notebooks/004_results/',\n", - " Ez_file='notebooks/004_results/Ez.h5',)" + "wake = WakeSolver(\n", + " q=q,\n", + " sigmaz=sigmaz,\n", + " beta=beta,\n", + " xsource=xs,\n", + " ysource=ys,\n", + " xtest=xt,\n", + " ytest=yt,\n", + " skip_cells=skip_cells,\n", + " wakelength=wakelength,\n", + " results_folder=\"notebooks/004_results/\",\n", + " Ez_file=\"notebooks/004_results/Ez.h5\",\n", + ")" ] }, { @@ -192,9 +209,7 @@ "outputs": [], "source": [ "if False:\n", - " solver.wakesolve(wakelength=wakelength, \n", - " wake=wake, \n", - " plot=False)" + " solver.wakesolve(wakelength=wakelength, wake=wake, plot=False)" ] }, { @@ -292,14 +307,14 @@ } ], "source": [ - "fig, ax = plt.subplots(2,1, figsize=[8,8], dpi=100)\n", - "ax[0].plot(wake.s*1e2, wake.WP, c='r', lw=1.5, label='Wakis')\n", - "ax[0].set_xlabel('s [cm]')\n", - "ax[0].set_ylabel('Longitudinal wake potential [V/pC]', color='r')\n", + "fig, ax = plt.subplots(2, 1, figsize=[8, 8], dpi=100)\n", + "ax[0].plot(wake.s * 1e2, wake.WP, c=\"r\", lw=1.5, label=\"Wakis\")\n", + "ax[0].set_xlabel(\"s [cm]\")\n", + "ax[0].set_ylabel(\"Longitudinal wake potential [V/pC]\", color=\"r\")\n", "\n", - "ax[1].plot(wake.f*1e-9, np.abs(wake.Z), c='b', lw=1.5, label='Wakis')\n", - "ax[1].set_xlabel('f [GHz]')\n", - "ax[1].set_ylabel('Longitudinal impedance [Abs][$\\Omega$]', color='b')\n", + "ax[1].plot(wake.f * 1e-9, np.abs(wake.Z), c=\"b\", lw=1.5, label=\"Wakis\")\n", + "ax[1].set_xlabel(\"f [GHz]\")\n", + "ax[1].set_ylabel(\"Longitudinal impedance [Abs][$\\Omega$]\", color=\"b\")\n", "\n", "fig.tight_layout()" ] @@ -364,10 +379,16 @@ ], "source": [ "# get bounds for the Differential Evolution fitting\n", - "bounds = wake.get_SmartBounds(freq_data=wake.f, impedance_data=wake.Z,\n", - " minimum_peak_height=500, distance=3, inspect_bounds=True,\n", - " Rs_bounds=[0.8, 10], Q_bounds=[0.5, 5], fres_bounds=[-0.01e9, +0.01e9]\n", - " )" + "bounds = wake.get_SmartBounds(\n", + " freq_data=wake.f,\n", + " impedance_data=wake.Z,\n", + " minimum_peak_height=500,\n", + " distance=3,\n", + " inspect_bounds=True,\n", + " Rs_bounds=[0.8, 10],\n", + " Q_bounds=[0.5, 5],\n", + " fres_bounds=[-0.01e9, +0.01e9],\n", + ")" ] }, { @@ -546,11 +567,21 @@ } ], "source": [ - "DE_model = wake.get_DEmodel_fitting(freq_data=wake.f, impedance_data=wake.Z, \n", - " plane='longitudinal', dim='z', \n", - " parameterBounds=bounds.parameterBounds, N_resonators=bounds.N_resonators, \n", - " DE_kernel='CMAES', maxiter=1e5, cmaes_sigma=0.01, popsize=150, tol=1e-3,\n", - " use_minimization=True, minimization_margin=[0.3, 0.2, 0.01])" + "DE_model = wake.get_DEmodel_fitting(\n", + " freq_data=wake.f,\n", + " impedance_data=wake.Z,\n", + " plane=\"longitudinal\",\n", + " dim=\"z\",\n", + " parameterBounds=bounds.parameterBounds,\n", + " N_resonators=bounds.N_resonators,\n", + " DE_kernel=\"CMAES\",\n", + " maxiter=1e5,\n", + " cmaes_sigma=0.01,\n", + " popsize=150,\n", + " tol=1e-3,\n", + " use_minimization=True,\n", + " minimization_margin=[0.3, 0.2, 0.01],\n", + ")" ] }, { @@ -567,8 +598,13 @@ "outputs": [], "source": [ "from scipy.constants import c as c_light\n", - "s, wake_potential = wake.get_extrapolated_wake(wakelength=100, sigma=sigmaz/c_light, use_minimization=True)\n", - "t, wake_function = wake.get_extrapolated_wake_function(wakelength=100, use_minimization=True)\n", + "\n", + "s, wake_potential = wake.get_extrapolated_wake(\n", + " wakelength=100, sigma=sigmaz / c_light, use_minimization=True\n", + ")\n", + "t, wake_function = wake.get_extrapolated_wake_function(\n", + " wakelength=100, use_minimization=True\n", + ")\n", "f, impedance = wake.get_extrapolated_impedance(wakelength=100, use_minimization=True)" ] }, @@ -604,20 +640,29 @@ } ], "source": [ + "fig, ax = plt.subplots(2, 1, figsize=[8, 8], dpi=100)\n", + "ax[0].plot(wake.s * 1e2, wake.WP, c=\"r\", lw=1.5, label=\"Wakis\")\n", + "ax[0].plot(\n", + " s * 1e2, wake_potential, c=\"r\", lw=3, alpha=0.5, label=\"Wakis DE extrapolation\"\n", + ")\n", + "ax[0].set_xlabel(\"s [cm]\")\n", + "ax[0].set_ylabel(\"Longitudinal wake potential [V/pC]\", color=\"r\")\n", "\n", - "fig, ax = plt.subplots(2,1, figsize=[8,8], dpi=100)\n", - "ax[0].plot(wake.s*1e2, wake.WP, c='r', lw=1.5, label='Wakis')\n", - "ax[0].plot(s*1e2, wake_potential, c='r', lw=3, alpha=0.5, label='Wakis DE extrapolation')\n", - "ax[0].set_xlabel('s [cm]')\n", - "ax[0].set_ylabel('Longitudinal wake potential [V/pC]', color='r')\n", - "\n", - "ax[1].plot(wake.f*1e-9, np.real(wake.Z), c='b', lw=1.5, label='Wakis - Re')\n", - "ax[1].plot(wake.f*1e-9, np.imag(wake.Z), c='b', lw=1.5, ls='--', label='Wakis - Imag')\n", + "ax[1].plot(wake.f * 1e-9, np.real(wake.Z), c=\"b\", lw=1.5, label=\"Wakis - Re\")\n", + "ax[1].plot(wake.f * 1e-9, np.imag(wake.Z), c=\"b\", lw=1.5, ls=\"--\", label=\"Wakis - Imag\")\n", "\n", - "ax[1].plot(f*1e-9, np.real(impedance), c='b', lw=3, alpha=0.5, label='Wakis DE - Re')\n", - "ax[1].plot(f*1e-9, np.imag(impedance), c='b', lw=3, ls='--', alpha=0.5, label='Wakis DE - Imag')\n", - "ax[1].set_xlabel('f [GHz]')\n", - "ax[1].set_ylabel('Longitudinal impedance [Abs][$\\Omega$]', color='b')\n", + "ax[1].plot(f * 1e-9, np.real(impedance), c=\"b\", lw=3, alpha=0.5, label=\"Wakis DE - Re\")\n", + "ax[1].plot(\n", + " f * 1e-9,\n", + " np.imag(impedance),\n", + " c=\"b\",\n", + " lw=3,\n", + " ls=\"--\",\n", + " alpha=0.5,\n", + " label=\"Wakis DE - Imag\",\n", + ")\n", + "ax[1].set_xlabel(\"f [GHz]\")\n", + "ax[1].set_ylabel(\"Longitudinal impedance [Abs][$\\Omega$]\", color=\"b\")\n", "\n", "fig.tight_layout()" ] @@ -672,12 +717,14 @@ ], "source": [ "plt.figure(figsize=(10, 6))\n", - "DEfitted_wake = np.abs(wake.DE_model.get_impedance_from_fitFunction(wake.f, use_minimization=True))\n", + "DEfitted_wake = np.abs(\n", + " wake.DE_model.get_impedance_from_fitFunction(wake.f, use_minimization=True)\n", + ")\n", "\n", - "plt.plot(wake.f, np.abs(wake.Z), lw=5, label='Wakis simulated', color='black')\n", - "plt.plot(wake.f, np.abs(DEfitted_wake), lw=2, label='DE + Min. - Res. fitting')\n", - "plt.xlabel('Frequency [Hz]')\n", - "plt.ylabel('Impedance [Ohm]')\n", + "plt.plot(wake.f, np.abs(wake.Z), lw=5, label=\"Wakis simulated\", color=\"black\")\n", + "plt.plot(wake.f, np.abs(DEfitted_wake), lw=2, label=\"DE + Min. - Res. fitting\")\n", + "plt.xlabel(\"Frequency [Hz]\")\n", + "plt.ylabel(\"Impedance [Ohm]\")\n", "plt.legend()" ] }, diff --git a/notebooks/005_MPI_simulation.ipynb b/notebooks/005_MPI_simulation.ipynb index 5fef9d1..d1711c0 100644 --- a/notebooks/005_MPI_simulation.ipynb +++ b/notebooks/005_MPI_simulation.ipynb @@ -38,6 +38,7 @@ ], "source": [ "import ipyparallel as ipp\n", + "\n", "cluster = ipp.Cluster(engines=\"mpi\", n=2).start_and_connect_sync()" ] }, @@ -464,6 +465,7 @@ "outputs": [], "source": [ "from IPython.display import HTML\n", + "\n", "HTML('')" ] }, @@ -626,7 +628,6 @@ "source": [ "import numpy as np\n", "import matplotlib.pyplot as plt\n", - "import iddefix\n", "\n", "from wakis import WakeSolver\n", "from scipy.constants import c" @@ -645,7 +646,7 @@ "metadata": {}, "outputs": [], "source": [ - "results_folder='results'\n", + "results_folder = \"results\"\n", "wake = WakeSolver()\n", "wake.load_results(results_folder)" ] @@ -667,10 +668,16 @@ "outputs": [], "source": [ "# get bounds for the Differential Evolution fitting\n", - "bounds = wake.get_SmartBounds(freq_data=wake.f, impedance_data=wake.Z,\n", - " minimum_peak_height=330, distance=20, inspect_bounds=True,\n", - " Rs_bounds=[0.8, 10], Q_bounds=[0.5, 5], fres_bounds=[-0.01e9, +0.01e9]\n", - " )" + "bounds = wake.get_SmartBounds(\n", + " freq_data=wake.f,\n", + " impedance_data=wake.Z,\n", + " minimum_peak_height=330,\n", + " distance=20,\n", + " inspect_bounds=True,\n", + " Rs_bounds=[0.8, 10],\n", + " Q_bounds=[0.5, 5],\n", + " fres_bounds=[-0.01e9, +0.01e9],\n", + ")" ] }, { @@ -686,11 +693,21 @@ "metadata": {}, "outputs": [], "source": [ - "DE_model = wake.get_DEmodel_fitting(freq_data=wake.f, impedance_data=wake.Z, \n", - " plane='longitudinal', dim='z', \n", - " parameterBounds=bounds.parameterBounds, N_resonators=bounds.N_resonators, \n", - " DE_kernel='CMAES', maxiter=1e5, cmaes_sigma=0.01, popsize=150, tol=1e-3,\n", - " use_minimization=True, minimization_margin=[0.3, 0.2, 0.01])" + "DE_model = wake.get_DEmodel_fitting(\n", + " freq_data=wake.f,\n", + " impedance_data=wake.Z,\n", + " plane=\"longitudinal\",\n", + " dim=\"z\",\n", + " parameterBounds=bounds.parameterBounds,\n", + " N_resonators=bounds.N_resonators,\n", + " DE_kernel=\"CMAES\",\n", + " maxiter=1e5,\n", + " cmaes_sigma=0.01,\n", + " popsize=150,\n", + " tol=1e-3,\n", + " use_minimization=True,\n", + " minimization_margin=[0.3, 0.2, 0.01],\n", + ")" ] }, { @@ -706,37 +723,56 @@ "metadata": {}, "outputs": [], "source": [ - "#%matplotlib ipympl\n", + "# %matplotlib ipympl\n", "\n", "# Retrieve partially decayed wake potential\n", - "WP_pd = DE_model.get_wake_potential(wake.s/c, sigma=10e-2/c, use_minimization=False)\n", - "WP_pd_min = DE_model.get_wake_potential(wake.s/c, sigma=10e-2/c)\n", + "WP_pd = DE_model.get_wake_potential(wake.s / c, sigma=10e-2 / c, use_minimization=False)\n", + "WP_pd_min = DE_model.get_wake_potential(wake.s / c, sigma=10e-2 / c)\n", "\n", "# Retrieve partially decayed impedance\n", "f_pd = np.linspace(0, 1.2e9, 10000)\n", "Z_pd = DE_model.get_impedance_from_fitFunction(f_pd, use_minimization=False)\n", "Z_pd_min = DE_model.get_impedance_from_fitFunction(f_pd, use_minimization=True)\n", "\n", - "fig1, ax = plt.subplots(1,2, figsize=[12,4], dpi=150)\n", - "\n", - "ax[0].plot(wake.s, wake.WP, c='k', alpha=0.8, label='Wakis wl=30 m')\n", - "ax[0].plot(wake.s, -WP_pd*1e-12, c='tab:blue', alpha=0.8, lw=1.5, label='DE wake potential')\n", - "ax[0].plot(wake.s, -WP_pd_min*1e-12, c='tab:red', alpha=0.6, lw=1.5, label='DE+min wake potential')\n", - "ax[0].set_xlabel('s [cm]')\n", - "ax[0].set_ylabel('Longitudinal wake potential [V/pC]', color='tab:red')\n", + "fig1, ax = plt.subplots(1, 2, figsize=[12, 4], dpi=150)\n", + "\n", + "ax[0].plot(wake.s, wake.WP, c=\"k\", alpha=0.8, label=\"Wakis wl=30 m\")\n", + "ax[0].plot(\n", + " wake.s, -WP_pd * 1e-12, c=\"tab:blue\", alpha=0.8, lw=1.5, label=\"DE wake potential\"\n", + ")\n", + "ax[0].plot(\n", + " wake.s,\n", + " -WP_pd_min * 1e-12,\n", + " c=\"tab:red\",\n", + " alpha=0.6,\n", + " lw=1.5,\n", + " label=\"DE+min wake potential\",\n", + ")\n", + "ax[0].set_xlabel(\"s [cm]\")\n", + "ax[0].set_ylabel(\"Longitudinal wake potential [V/pC]\", color=\"tab:red\")\n", "ax[0].legend()\n", "\n", - "ax[1].plot(wake.f*1e-9, np.real(wake.Z), ls='-', c='k', lw=1.5, label='Real')\n", - "#ax[1].plot(f*1e-9, np.imag(Z), ls=':', c='k', lw=1.5, label='Imag')\n", - "#ax[1].plot(f*1e-9, np.real(Z_pd), c='tab:blue', label='Abs')\n", - "\n", - "ax[1].plot(f_pd*1e-9, np.real(Z_pd), ls='-', c='tab:blue', alpha=0.8, lw=1.5, label='DE Real')\n", - "#ax[1].plot(f_pd*1e-9, np.imag(Z_pd), ls=':', c='tab:blue', alpha=0.6, lw=1.5, label='DE Imag')\n", - "\n", - "ax[1].plot(f_pd*1e-9, np.real(Z_pd_min), ls='-', c='tab:red', alpha=0.6, lw=1.5, label='DE+min Real')\n", - "\n", - "ax[1].set_xlabel('f [GHz]')\n", - "ax[1].set_ylabel('Longitudinal impedance [Abs][$\\Omega$]', color='tab:blue')\n", + "ax[1].plot(wake.f * 1e-9, np.real(wake.Z), ls=\"-\", c=\"k\", lw=1.5, label=\"Real\")\n", + "# ax[1].plot(f*1e-9, np.imag(Z), ls=':', c='k', lw=1.5, label='Imag')\n", + "# ax[1].plot(f*1e-9, np.real(Z_pd), c='tab:blue', label='Abs')\n", + "\n", + "ax[1].plot(\n", + " f_pd * 1e-9, np.real(Z_pd), ls=\"-\", c=\"tab:blue\", alpha=0.8, lw=1.5, label=\"DE Real\"\n", + ")\n", + "# ax[1].plot(f_pd*1e-9, np.imag(Z_pd), ls=':', c='tab:blue', alpha=0.6, lw=1.5, label='DE Imag')\n", + "\n", + "ax[1].plot(\n", + " f_pd * 1e-9,\n", + " np.real(Z_pd_min),\n", + " ls=\"-\",\n", + " c=\"tab:red\",\n", + " alpha=0.6,\n", + " lw=1.5,\n", + " label=\"DE+min Real\",\n", + ")\n", + "\n", + "ax[1].set_xlabel(\"f [GHz]\")\n", + "ax[1].set_ylabel(\"Longitudinal impedance [Abs][$\\Omega$]\", color=\"tab:blue\")\n", "ax[1].legend()\n", "\n", "fig1.tight_layout()" @@ -756,12 +792,18 @@ "outputs": [], "source": [ "# retrieve the wake potential, function and impedance analytically using the resonator formalism\n", - "new_wakelength = 100 # [m]\n", - "sigmaz = 10e-2 #[m], the one used in the simulation\n", + "new_wakelength = 100 # [m]\n", + "sigmaz = 10e-2 # [m], the one used in the simulation\n", "\n", - "s, wake_potential = wake.get_extrapolated_wake(wakelength=new_wakelength, sigma=sigmaz/c, use_minimization=True)\n", - "t, wake_function = wake.get_extrapolated_wake_function(wakelength=new_wakelength, use_minimization=True)\n", - "f, impedance = wake.get_extrapolated_impedance(wakelength=new_wakelength, use_minimization=True)" + "s, wake_potential = wake.get_extrapolated_wake(\n", + " wakelength=new_wakelength, sigma=sigmaz / c, use_minimization=True\n", + ")\n", + "t, wake_function = wake.get_extrapolated_wake_function(\n", + " wakelength=new_wakelength, use_minimization=True\n", + ")\n", + "f, impedance = wake.get_extrapolated_impedance(\n", + " wakelength=new_wakelength, use_minimization=True\n", + ")" ] }, { @@ -770,20 +812,30 @@ "metadata": {}, "outputs": [], "source": [ - "fig, ax = plt.subplots(2,1, figsize=[8,8], dpi=100)\n", - "ax[0].plot(wake.s*1e2, wake.WP, c='r', lw=1.5, label='Wakis')\n", - "ax[0].plot(s*1e2, wake_potential, c='r', lw=3, alpha=0.5, label='Wakis DE extrapolation')\n", - "#ax[0].plot(t*c_light*1e2, wake_function/c_light, c='grey', lw=1.5, alpha=0.5, label='Wakis DE extrapolation')\n", - "ax[0].set_xlabel('s [cm]')\n", - "ax[0].set_ylabel('Longitudinal wake potential [V/pC]', color='r')\n", - "\n", - "ax[1].plot(wake.f*1e-9, np.real(wake.Z), c='b', lw=1.5, label='Wakis - Re')\n", - "ax[1].plot(wake.f*1e-9, np.imag(wake.Z), c='b', lw=1.5, ls='--', label='Wakis - Imag')\n", - "\n", - "ax[1].plot(f*1e-9, np.real(impedance), c='b', lw=3, alpha=0.5, label='Wakis DE - Re')\n", - "ax[1].plot(f*1e-9, np.imag(impedance), c='b', lw=3, ls='--', alpha=0.5, label='Wakis DE - Imag')\n", - "ax[1].set_xlabel('f [GHz]')\n", - "ax[1].set_ylabel('Longitudinal impedance [Abs][$\\Omega$]', color='b')\n", + "fig, ax = plt.subplots(2, 1, figsize=[8, 8], dpi=100)\n", + "ax[0].plot(wake.s * 1e2, wake.WP, c=\"r\", lw=1.5, label=\"Wakis\")\n", + "ax[0].plot(\n", + " s * 1e2, wake_potential, c=\"r\", lw=3, alpha=0.5, label=\"Wakis DE extrapolation\"\n", + ")\n", + "# ax[0].plot(t*c_light*1e2, wake_function/c_light, c='grey', lw=1.5, alpha=0.5, label='Wakis DE extrapolation')\n", + "ax[0].set_xlabel(\"s [cm]\")\n", + "ax[0].set_ylabel(\"Longitudinal wake potential [V/pC]\", color=\"r\")\n", + "\n", + "ax[1].plot(wake.f * 1e-9, np.real(wake.Z), c=\"b\", lw=1.5, label=\"Wakis - Re\")\n", + "ax[1].plot(wake.f * 1e-9, np.imag(wake.Z), c=\"b\", lw=1.5, ls=\"--\", label=\"Wakis - Imag\")\n", + "\n", + "ax[1].plot(f * 1e-9, np.real(impedance), c=\"b\", lw=3, alpha=0.5, label=\"Wakis DE - Re\")\n", + "ax[1].plot(\n", + " f * 1e-9,\n", + " np.imag(impedance),\n", + " c=\"b\",\n", + " lw=3,\n", + " ls=\"--\",\n", + " alpha=0.5,\n", + " label=\"Wakis DE - Imag\",\n", + ")\n", + "ax[1].set_xlabel(\"f [GHz]\")\n", + "ax[1].set_ylabel(\"Longitudinal impedance [Abs][$\\Omega$]\", color=\"b\")\n", "\n", "fig.tight_layout()" ] diff --git a/notebooks/006_dipolarWakefield_mesh_refinement.ipynb b/notebooks/006_dipolarWakefield_mesh_refinement.ipynb index 5591ac2..7fc0c1e 100644 --- a/notebooks/006_dipolarWakefield_mesh_refinement.ipynb +++ b/notebooks/006_dipolarWakefield_mesh_refinement.ipynb @@ -43,34 +43,38 @@ "outputs": [], "source": [ "# Generate beam pipe\n", - "r_pipe = 24e-3 # pipe radius [m]\n", - "l_pipe = 320e-3 # pipe length [m]\n", - "pipe = pv.Cylinder(center=(0,0,0), direction=(0,0,1), radius=r_pipe, height=l_pipe)\n", + "r_pipe = 24e-3 # pipe radius [m]\n", + "l_pipe = 320e-3 # pipe length [m]\n", + "pipe = pv.Cylinder(center=(0, 0, 0), direction=(0, 0, 1), radius=r_pipe, height=l_pipe)\n", "\n", "# Generate bellow convolutions\n", "r_conv = 30e-3 # convolution radius [m]\n", "l_conv = 4e-3 # length of each convolution [m]\n", - "n_conv = 15 # number of convolutions\n", + "n_conv = 15 # number of convolutions\n", "l_between_conv = 4e-3 # length between convolutions [m]\n", - "z_start = n_conv//2*(l_conv + l_between_conv) - l_conv # start of the convolutions [m]\n", + "z_start = (\n", + " n_conv // 2 * (l_conv + l_between_conv) - l_conv\n", + ") # start of the convolutions [m]\n", "convolutions = []\n", "\n", "for n in range(n_conv):\n", - " z_start_n_conv = -z_start+n*(l_conv+l_between_conv)\n", - " conv = pv.Cylinder(center=(0,0,z_start_n_conv), # center of the convolution\n", - " direction=(0,0,1), # z-direction\n", - " radius=r_conv,\n", - " height=l_conv)\n", + " z_start_n_conv = -z_start + n * (l_conv + l_between_conv)\n", + " conv = pv.Cylinder(\n", + " center=(0, 0, z_start_n_conv), # center of the convolution\n", + " direction=(0, 0, 1), # z-direction\n", + " radius=r_conv,\n", + " height=l_conv,\n", + " )\n", " convolutions.append(conv) # append to list\n", "\n", "# Sum the generated geometry\n", - "pipe = pipe.triangulate() # triangulate pipe\n", + "pipe = pipe.triangulate() # triangulate pipe\n", "convolutions = np.sum(convolutions).triangulate() # triangulate convolutions\n", "bellow = pipe | convolutions # union of meshes without internal faces\n", "\n", "# Save it to STL file\n", - "stl_file = 'data/006_LHC_Bellow_generated.stl'\n", - "bellow.save(stl_file) #save in [m]\n", + "stl_file = \"data/006_LHC_Bellow_generated.stl\"\n", + "bellow.save(stl_file) # save in [m]\n", "# bellow.scale(1e3).save(stl_file) #save in [mm]" ] }, @@ -100,8 +104,8 @@ "source": [ "# ---------- Domain setup ---------\n", "# Set up geometry & materials dictionaries\n", - "stl_solids = {'bellow': stl_file}\n", - "stl_materials = {'bellow': 'vacuum'}\n", + "stl_solids = {\"bellow\": stl_file}\n", + "stl_materials = {\"bellow\": \"vacuum\"}\n", "\n", "# Domain bounds\n", "xmin, xmax, ymin, ymax, zmin, zmax = bellow.bounds\n", @@ -110,7 +114,7 @@ "Nx = 60\n", "Ny = 60\n", "Nz = 400\n", - "print(f'Total number of mesh cells: {Nx*Ny*Nz}')\n", + "print(f\"Total number of mesh cells: {Nx * Ny * Nz}\")\n", "\n", "# set grid and geometry\n", "grid = GridFIT3D(xmin, xmax, ymin, ymax, zmin, zmax, Nx, Ny, Nz,\n", @@ -148,7 +152,7 @@ "outputs": [], "source": [ "# [OPTIONAL] Save grid to HDF5 file\n", - "grid.save_to_h5('grid.h5')" + "grid.save_to_h5(\"grid.h5\")" ] }, { @@ -159,7 +163,7 @@ "source": [ "# [OPTIONAL] Load grid from HDF5 file or re-instantiate grid from file\n", "# grid.load_from_h5('data/006_bellow_grid.h5')\n", - "grid = GridFIT3D(load_from_h5='grid.h5', verbose=2)" + "grid = GridFIT3D(load_from_h5=\"grid.h5\", verbose=2)" ] }, { @@ -169,7 +173,7 @@ "outputs": [], "source": [ "# Inspect the cells occupied by the imported solid\n", - "grid.plot_stl_mask(stl_solid='bellow', stl_opacity=0.2, ymax=0)" + "grid.plot_stl_mask(stl_solid=\"bellow\", stl_opacity=0.2, ymax=0)" ] }, { @@ -186,17 +190,19 @@ "outputs": [], "source": [ "# boundary conditions\n", - "bc_low=['pec', 'pec', 'pml']\n", - "bc_high=['pec', 'pec', 'pml']\n", + "bc_low = [\"pec\", \"pec\", \"pml\"]\n", + "bc_high = [\"pec\", \"pec\", \"pml\"]\n", "\n", - "n_pml = 10 # number of PML layers\n", - "solver = SolverFIT3D(grid,\n", - " bc_low=bc_low, bc_high=bc_high,\n", - " use_stl=True,\n", - " bg='pec', # background material\n", - " n_pml=n_pml,\n", - " dtype=np.float32,\n", - " )" + "n_pml = 10 # number of PML layers\n", + "solver = SolverFIT3D(\n", + " grid,\n", + " bc_low=bc_low,\n", + " bc_high=bc_high,\n", + " use_stl=True,\n", + " bg=\"pec\", # background material\n", + " n_pml=n_pml,\n", + " dtype=np.float32,\n", + ")" ] }, { @@ -221,26 +227,34 @@ "source": [ "# ------------ Beam source ----------------\n", "# Beam parameters\n", - "sigmaz = 30e-3 #[m] 50mm -> 2 GHz\n", - "q = 1e-9 #[C]\n", - "beta = 1.0 # beam beta\n", - "xs = 8e-3 # x source position [m]\n", - "ys = 0. # y source position [m]\n", - "xt = 0. # x test position [m]\n", - "yt = 0. # y test position [m]\n", + "sigmaz = 30e-3 # [m] 50mm -> 2 GHz\n", + "q = 1e-9 # [C]\n", + "beta = 1.0 # beam beta\n", + "xs = 8e-3 # x source position [m]\n", + "ys = 0.0 # y source position [m]\n", + "xt = 0.0 # x test position [m]\n", + "yt = 0.0 # y test position [m]\n", "# [DEFAULT] tinj = 8.53*sigmaz/c_light # injection time offset [s]\n", "\n", "# ----------- Solver setup ----------\n", "# Wakefield post-processor\n", - "wakelength = 10. # [m] -> Partially decayed\n", + "wakelength = 10.0 # [m] -> Partially decayed\n", "skip_cells = n_pml + 10 # no. cells to skip from wake integration (>= PML cells)\n", "\n", - "results_folder = f'006_results_{int(sigmaz*1e3)}/'\n", - "wake = WakeSolver(q=q, sigmaz=sigmaz, beta=beta,\n", - " xsource=xs, ysource=ys, xtest=xt, ytest=yt,\n", - " skip_cells=skip_cells, wakelength=wakelength,\n", - " results_folder=results_folder,\n", - " Ez_file=results_folder+'Ez.h5',)" + "results_folder = f\"006_results_{int(sigmaz * 1e3)}/\"\n", + "wake = WakeSolver(\n", + " q=q,\n", + " sigmaz=sigmaz,\n", + " beta=beta,\n", + " xsource=xs,\n", + " ysource=ys,\n", + " xtest=xt,\n", + " ytest=yt,\n", + " skip_cells=skip_cells,\n", + " wakelength=wakelength,\n", + " results_folder=results_folder,\n", + " Ez_file=results_folder + \"Ez.h5\",\n", + ")" ] }, { @@ -251,21 +265,28 @@ "source": [ "# Plot settings\n", "import os\n", - "if not os.path.exists(results_folder+'img/'):\n", - " os.mkdir(results_folder+'img/')\n", "\n", - "plotkw = {'title':results_folder+'img/Ez',\n", - " 'add_patch':'bellow', 'patch_alpha':0.3,\n", - " 'vmin':-1e4, 'vmax':1e4,\n", - " 'plane': [int(grid.Nx/2), slice(0, grid.Ny), slice(0, grid.Nz)],}\n", + "if not os.path.exists(results_folder + \"img/\"):\n", + " os.mkdir(results_folder + \"img/\")\n", "\n", - "solver.wakesolve(wakelength=wakelength,\n", - " wake=wake,\n", - " plot=False,\n", - " plot_from=1000,\n", - " plot_every=50,\n", - " plot_until=6000,\n", - " **plotkw)" + "plotkw = {\n", + " \"title\": results_folder + \"img/Ez\",\n", + " \"add_patch\": \"bellow\",\n", + " \"patch_alpha\": 0.3,\n", + " \"vmin\": -1e4,\n", + " \"vmax\": 1e4,\n", + " \"plane\": [int(grid.Nx / 2), slice(0, grid.Ny), slice(0, grid.Nz)],\n", + "}\n", + "\n", + "solver.wakesolve(\n", + " wakelength=wakelength,\n", + " wake=wake,\n", + " plot=False,\n", + " plot_from=1000,\n", + " plot_every=50,\n", + " plot_until=6000,\n", + " **plotkw,\n", + ")" ] }, { @@ -284,7 +305,7 @@ "source": [ "# Load previously computed results\n", "wake = WakeSolver(sigmaz=15e-3, xsource=8e-3)\n", - "wake.load_results('006_results_sigma15')\n", + "wake.load_results(\"006_results_sigma15\")\n", "\n", "# Recompute wake potential and impedance (longitudinal and transverse)\n", "# Modify the number of cells skip from the boundary during integration\n", @@ -318,23 +339,23 @@ "outputs": [], "source": [ "# Plot longitudinal wake potential and impedance\n", - "fig1, ax = plt.subplots(2,1, figsize=[8,8], dpi=150)\n", - "ax[0].plot(wake.s*1e2, wake.WP, c='tab:red', lw=1.5, label='Wakis')\n", - "ax[0].set_xlabel('s [cm]')\n", - "ax[0].set_ylabel('Longitudinal wake potential [V/pC]', color='tab:red')\n", + "fig1, ax = plt.subplots(2, 1, figsize=[8, 8], dpi=150)\n", + "ax[0].plot(wake.s * 1e2, wake.WP, c=\"tab:red\", lw=1.5, label=\"Wakis\")\n", + "ax[0].set_xlabel(\"s [cm]\")\n", + "ax[0].set_ylabel(\"Longitudinal wake potential [V/pC]\", color=\"tab:red\")\n", "ax[0].legend()\n", - "ax[0].set_xlim(xmax=wake.wakelength*1e2)\n", + "ax[0].set_xlim(xmax=wake.wakelength * 1e2)\n", "\n", - "ax[1].plot(wake.f*1e-9, np.abs(wake.Z), c='tab:blue', alpha=0.8, lw=2, label='Abs')\n", - "ax[1].plot(wake.f*1e-9, np.real(wake.Z), ls='--', c='tab:blue', lw=1.5, label='Real')\n", - "ax[1].plot(wake.f*1e-9, np.imag(wake.Z), ls=':', c='tab:blue', lw=1.5, label='Imag')\n", - "ax[1].set_xlabel('f [GHz]')\n", - "ax[1].set_ylabel(r'Longitudinal impedance [Abs][$\\Omega$]', color='tab:blue')\n", + "ax[1].plot(wake.f * 1e-9, np.abs(wake.Z), c=\"tab:blue\", alpha=0.8, lw=2, label=\"Abs\")\n", + "ax[1].plot(wake.f * 1e-9, np.real(wake.Z), ls=\"--\", c=\"tab:blue\", lw=1.5, label=\"Real\")\n", + "ax[1].plot(wake.f * 1e-9, np.imag(wake.Z), ls=\":\", c=\"tab:blue\", lw=1.5, label=\"Imag\")\n", + "ax[1].set_xlabel(\"f [GHz]\")\n", + "ax[1].set_ylabel(r\"Longitudinal impedance [Abs][$\\Omega$]\", color=\"tab:blue\")\n", "ax[1].legend()\n", "\n", "fig1.tight_layout()\n", - "#fig1.savefig(results_folder+'longitudinal.png')\n", - "#plt.show()" + "# fig1.savefig(results_folder+'longitudinal.png')\n", + "# plt.show()" ] }, { @@ -344,23 +365,25 @@ "outputs": [], "source": [ "# Plot transverse x wake potential and impedance\n", - "fig2, ax = plt.subplots(2,1, figsize=[8,8], dpi=150)\n", - "ax[0].plot(wake.s*1e2, wake.WPx, c='tab:orange', lw=1.5, label='Wakis')\n", - "ax[0].set_xlabel('s [cm]')\n", - "ax[0].set_ylabel('Transverse wake potential X [V/pC]', color='tab:orange')\n", + "fig2, ax = plt.subplots(2, 1, figsize=[8, 8], dpi=150)\n", + "ax[0].plot(wake.s * 1e2, wake.WPx, c=\"tab:orange\", lw=1.5, label=\"Wakis\")\n", + "ax[0].set_xlabel(\"s [cm]\")\n", + "ax[0].set_ylabel(\"Transverse wake potential X [V/pC]\", color=\"tab:orange\")\n", "ax[0].legend()\n", - "ax[0].set_xlim(xmax=wake.wakelength*1e2)\n", + "ax[0].set_xlim(xmax=wake.wakelength * 1e2)\n", "\n", - "ax[1].plot(wake.f*1e-9, np.abs(wake.Zx), c='tab:green', lw=2, label='Abs')\n", - "ax[1].plot(wake.f*1e-9, np.real(wake.Zx), c='tab:green', ls='--', lw=1.5, label='Real')\n", - "ax[1].plot(wake.f*1e-9, np.imag(wake.Zx), c='tab:green', ls=':', lw=1.5, label='Imag')\n", - "ax[1].set_xlabel('f [GHz]')\n", - "ax[1].set_ylabel(r'Transverse impedance X [Abs][$\\Omega$]', color='tab:green')\n", + "ax[1].plot(wake.f * 1e-9, np.abs(wake.Zx), c=\"tab:green\", lw=2, label=\"Abs\")\n", + "ax[1].plot(\n", + " wake.f * 1e-9, np.real(wake.Zx), c=\"tab:green\", ls=\"--\", lw=1.5, label=\"Real\"\n", + ")\n", + "ax[1].plot(wake.f * 1e-9, np.imag(wake.Zx), c=\"tab:green\", ls=\":\", lw=1.5, label=\"Imag\")\n", + "ax[1].set_xlabel(\"f [GHz]\")\n", + "ax[1].set_ylabel(r\"Transverse impedance X [Abs][$\\Omega$]\", color=\"tab:green\")\n", "ax[1].legend()\n", "\n", "fig2.tight_layout()\n", - "#fig2.savefig(results_folder+'transverse_x.png')\n", - "#plt.show()" + "# fig2.savefig(results_folder+'transverse_x.png')\n", + "# plt.show()" ] }, { @@ -370,23 +393,23 @@ "outputs": [], "source": [ "# Plot transverse y wake potential and impedance\n", - "fig3, ax = plt.subplots(2,1, figsize=[8,8], dpi=150)\n", - "ax[0].plot(wake.s*1e2, wake.WPy, c='tab:brown', lw=1.5, label='Wakis')\n", - "ax[0].set_xlabel('s [cm]')\n", - "ax[0].set_ylabel('Transverse wake potential Y [V/pC]', color='tab:brown')\n", + "fig3, ax = plt.subplots(2, 1, figsize=[8, 8], dpi=150)\n", + "ax[0].plot(wake.s * 1e2, wake.WPy, c=\"tab:brown\", lw=1.5, label=\"Wakis\")\n", + "ax[0].set_xlabel(\"s [cm]\")\n", + "ax[0].set_ylabel(\"Transverse wake potential Y [V/pC]\", color=\"tab:brown\")\n", "ax[0].legend()\n", - "ax[0].set_xlim(xmax=wake.wakelength*1e2)\n", + "ax[0].set_xlim(xmax=wake.wakelength * 1e2)\n", "\n", - "ax[1].plot(wake.f*1e-9, np.abs(wake.Zy), c='tab:pink', lw=2, label='Abs')\n", - "ax[1].plot(wake.f*1e-9, np.real(wake.Zy), c='tab:pink', ls='--', lw=1.5, label='Real')\n", - "ax[1].plot(wake.f*1e-9, np.imag(wake.Zy), c='tab:pink', ls=':', lw=1.5, label='Imag')\n", - "ax[1].set_xlabel('f [GHz]')\n", - "ax[1].set_ylabel(r'Transverse impedance Y [Abs][$\\Omega$]', color='tab:pink')\n", + "ax[1].plot(wake.f * 1e-9, np.abs(wake.Zy), c=\"tab:pink\", lw=2, label=\"Abs\")\n", + "ax[1].plot(wake.f * 1e-9, np.real(wake.Zy), c=\"tab:pink\", ls=\"--\", lw=1.5, label=\"Real\")\n", + "ax[1].plot(wake.f * 1e-9, np.imag(wake.Zy), c=\"tab:pink\", ls=\":\", lw=1.5, label=\"Imag\")\n", + "ax[1].set_xlabel(\"f [GHz]\")\n", + "ax[1].set_ylabel(r\"Transverse impedance Y [Abs][$\\Omega$]\", color=\"tab:pink\")\n", "ax[1].legend()\n", "\n", "fig3.tight_layout()\n", - "#fig3.savefig(results_folder+'transverse_y.png')\n", - "#plt.show()" + "# fig3.savefig(results_folder+'transverse_y.png')\n", + "# plt.show()" ] }, { @@ -402,8 +425,8 @@ "metadata": {}, "outputs": [], "source": [ - "WP_cst = wake.read_txt('data/dipolar_x_wake.txt')\n", - "Zx_cst = wake.read_txt('data/dipolar_x_impedance.txt')" + "WP_cst = wake.read_txt(\"data/dipolar_x_wake.txt\")\n", + "Zx_cst = wake.read_txt(\"data/dipolar_x_impedance.txt\")" ] }, { @@ -412,22 +435,32 @@ "metadata": {}, "outputs": [], "source": [ - "fig, ax = plt.subplots(2,1, figsize=[8,8], dpi=100)\n", + "fig, ax = plt.subplots(2, 1, figsize=[8, 8], dpi=100)\n", "\n", - "ax[0].plot(WP_cst[0], WP_cst[1], c='k', lw=1.5, label='WPx CST')\n", + "ax[0].plot(WP_cst[0], WP_cst[1], c=\"k\", lw=1.5, label=\"WPx CST\")\n", "\n", - "ax[0].plot(wake.s*1e3, wake.WPx, c='darkgreen', lw=1.5, alpha=0.5, label='WPx Wakis')\n", - "ax[0].set_xlabel('s [mm]')\n", - "ax[0].set_ylabel('Transverse wake potential X [V/pC]', color='darkgreen')\n", + "ax[0].plot(wake.s * 1e3, wake.WPx, c=\"darkgreen\", lw=1.5, alpha=0.5, label=\"WPx Wakis\")\n", + "ax[0].set_xlabel(\"s [mm]\")\n", + "ax[0].set_ylabel(\"Transverse wake potential X [V/pC]\", color=\"darkgreen\")\n", "\n", - "ax[1].plot(Zx_cst[0], -1*Zx_cst[1], c='k', lw=1.5, label='Re(Zx) CST')\n", - "ax[1].plot(Zx_cst[0], -1*Zx_cst[2], c='k', ls='--', lw=1.5, label='Im(Zx) CST')\n", + "ax[1].plot(Zx_cst[0], -1 * Zx_cst[1], c=\"k\", lw=1.5, label=\"Re(Zx) CST\")\n", + "ax[1].plot(Zx_cst[0], -1 * Zx_cst[2], c=\"k\", ls=\"--\", lw=1.5, label=\"Im(Zx) CST\")\n", "\n", - "ax[1].plot(wake.f*1e-9, np.real(wake.Zx), c='g', alpha=0.5, lw=1.5, label='Re(Zx) Wakis')\n", - "ax[1].plot(wake.f*1e-9, np.imag(wake.Zx), c='g', ls='--', alpha=0.5, lw=1.5, label='Im(Zx) Wakis')\n", + "ax[1].plot(\n", + " wake.f * 1e-9, np.real(wake.Zx), c=\"g\", alpha=0.5, lw=1.5, label=\"Re(Zx) Wakis\"\n", + ")\n", + "ax[1].plot(\n", + " wake.f * 1e-9,\n", + " np.imag(wake.Zx),\n", + " c=\"g\",\n", + " ls=\"--\",\n", + " alpha=0.5,\n", + " lw=1.5,\n", + " label=\"Im(Zx) Wakis\",\n", + ")\n", "ax[1].legend()\n", - "ax[1].set_xlabel('f [GHz]')\n", - "ax[1].set_ylabel(r'Transverse impedance X [Re/Im][$\\Omega$]', color='g')\n", + "ax[1].set_xlabel(\"f [GHz]\")\n", + "ax[1].set_ylabel(r\"Transverse impedance X [Re/Im][$\\Omega$]\", color=\"g\")\n", "\n", "fig.tight_layout()" ] diff --git a/pyproject.toml b/pyproject.toml index ef8f234..bf06379 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,11 +1,80 @@ [build-system] -build-backend = 'setuptools.build_meta' -requires = [ - 'setuptools>=64', - 'numpy', - ] +requires = ["setuptools>=61.0", "wheel"] +build-backend = "setuptools.build_meta" + +[project] +name = "wakis" +dynamic = ["version"] +description = "3D Electromagnetic Time-Domain wake and impedance solver" +readme = "README.md" +requires-python = ">=3.8" +license = { text = "Apache-2.0" } +authors = [ + { name = "Elena de la Fuente et al.", email = "elena.de.la.fuente.garcia@cern.ch" }, +] +classifiers = [ + "Development Status :: 4 - Beta", + "Programming Language :: Python", + "Programming Language :: Python :: 3", + "Programming Language :: Python :: 3.8", + "Programming Language :: Python :: 3.9", + "Programming Language :: Python :: 3.10", + "Programming Language :: Python :: 3.11", + "Operating System :: OS Independent", + "Intended Audience :: Science/Research", + "Topic :: Scientific/Engineering :: Physics", +] +dependencies = ["numpy<2.0", "scipy", "pyvista", "h5py", "tqdm"] + +[project.optional-dependencies] +notebook = [ + "pyvista[jupyter]", + "jupyterlab", + "ipykernel", + "ipywidgets", + "matplotlib", +] +gpu = ["cupy"] +tests = ["pytest", "pytest-cov"] +docs = [ + "sphinx", + "sphinx_rtd_theme", + "readthedocs-sphinx-search", + "sphinx-copybutton", + "myst-parser>=0.18.1", + "sphinx-design", + "sphinx-last-updated-by-git", + "matplotlib>=3.4.0", +] +dev = ["build", "twine"] + +full = ["wakis[notebook, tests, docs]"] +full-gpu = ["wakis[notebook, tests, docs, gpu]"] + +[project.urls] +Homepage = "https://wakis.readthedocs.io/" +"Bug Tracker" = "https://github.com/ImpedanCEI/wakis/issues" +Documentation = "https://wakis.readthedocs.io/en/latest/index.html" +Repository = "https://github.com/ImpedanCEI/wakis/wakis" + +[tool.setuptools] +include-package-data = true + +[tool.setuptools.packages.find] +where = ["."] + +[tool.setuptools.dynamic] +version = { attr = "wakis._version.__version__" } [tool.pytest.ini_options] +addopts = [ + "--cov=wakis", + "--cov-report=term", + "--cov-report=xml", +] +testpaths = [ + "tests", +] markers = [ "slow: marks tests as slow (deselect with '-m \"not slow\"')", "serial", diff --git a/readthedocs.yml b/readthedocs.yml index f569e82..bd1248c 100644 --- a/readthedocs.yml +++ b/readthedocs.yml @@ -7,7 +7,10 @@ build: python: install: - - requirements: docs/requirements.txt + - method: pip + path: . + extra_requirements: + - docs sphinx: configuration: docs/conf.py \ No newline at end of file diff --git a/release.sh b/release.sh old mode 100644 new mode 100755 index 22a51a0..e7e3bde --- a/release.sh +++ b/release.sh @@ -1,20 +1,34 @@ -#!/bin/bash -set -euo pipefail; IFS=$'\n\t' +#!/usr/bin/env bash +set -euo pipefail +IFS=$'\n\t' + +# Extract project metadata from pyproject.toml (PEP 621) +NAME="wakis" +VER=$(python -c "from wakis._version import __version__; print(__version__)") -NAME=$( python setup.py --name ) -VER=$( python setup.py --version ) echo "========================================================================" echo "Tagging $NAME v$VER" echo "========================================================================" -git tag -a v$VER -git push origin v$VER +git tag -a "v$VER" -m "Release $VER" +git push origin "v$VER" + +echo "========================================================================" +echo "Building $NAME v$VER" +echo "========================================================================" + +# Clean old artifacts +rm -rf dist build *.egg-info + +# Build wheel + sdist (PEP 517) +python -m build echo "========================================================================" -echo "Releasing $NAME v$VER on PyPI" +echo "Uploading $NAME v$VER to PyPI" echo "========================================================================" -python setup.py sdist twine upload dist/* -rm -r dist/ *.egg-info \ No newline at end of file + + +rm -r dist/ *.egg-info/ build/ \ No newline at end of file diff --git a/requirements.txt b/requirements.txt deleted file mode 100644 index 6411672..0000000 --- a/requirements.txt +++ /dev/null @@ -1,140 +0,0 @@ -aiohttp==3.9.5 -aiosignal==1.3.1 -anyio==4.4.0 -argon2-cffi==23.1.0 -argon2-cffi-bindings==21.2.0 -arrow==1.3.0 -asttokens==2.4.1 -async-lru==2.0.4 -async-timeout==4.0.3 -attrs==23.2.0 -Babel==2.15.0 -beautifulsoup4==4.12.3 -bleach==6.1.0 -certifi==2024.6.2 -cffi==1.16.0 -charset-normalizer==3.3.2 -cmocean==4.0.3 -colorcet==3.1.0 -comm==0.2.2 -contourpy==1.2.1 -cycler==0.12.1 -debugpy==1.8.2 -decorator==5.1.1 -defusedxml==0.7.1 -exceptiongroup==1.2.1 -executing==2.0.1 -fastjsonschema==2.20.0 -fonttools==4.53.0 -fqdn==1.5.1 -frozenlist==1.4.1 -h11==0.14.0 -h5py==3.11.0 -httpcore==1.0.5 -httpx==0.27.0 -idna==3.7 -imageio==2.34.2 -importlib_metadata==8.0.0 -importlib_resources==6.4.0 -ipykernel==6.29.4 -ipython==8.18.1 -ipywidgets==8.1.3 -ipympl==0.9.6 -isoduration==20.11.0 -jedi==0.19.1 -Jinja2==3.1.4 -json5==0.9.25 -jsonpointer==3.0.0 -jsonschema==4.22.0 -jsonschema-specifications==2023.12.1 -jupyter-events==0.10.0 -jupyter-lsp==2.2.5 -jupyter_client==8.6.2 -jupyter_core==5.7.2 -jupyter_server==2.14.1 -jupyter_server_proxy==4.2.0 -jupyter_server_terminals==0.5.3 -jupyterlab==4.2.3 -jupyterlab_pygments==0.3.0 -jupyterlab_server==2.27.2 -jupyterlab_widgets==3.0.11 -kiwisolver==1.4.5 -markdown-it-py==3.0.0 -MarkupSafe==2.1.5 -matplotlib==3.9.0 -matplotlib-inline==0.1.7 -mdurl==0.1.2 -meshio==5.3.5 -mistune==3.0.2 -more-itertools==10.3.0 -msgpack==1.0.8 -multidict==6.0.5 -nbclient==0.10.0 -nbconvert==7.16.4 -nbformat==5.10.4 -nest-asyncio==1.6.0 -notebook_shim==0.2.4 -numpy==1.26.4 -overrides==7.7.0 -packaging==24.1 -pandocfilters==1.5.1 -parso==0.8.4 -pexpect==4.9.0 -pillow==10.3.0 -platformdirs==4.2.2 -pooch==1.8.2 -prometheus_client==0.20.0 -prompt_toolkit==3.0.47 -psutil==6.0.0 -ptyprocess==0.7.0 -pure-eval==0.2.2 -pycparser==2.22 -Pygments==2.18.0 -pyparsing==3.1.2 -pytest -python-dateutil==2.9.0.post0 -python-json-logger==2.0.7 -pyvista==0.45.2 -PyYAML==6.0.1 -pyzmq==26.0.3 -referencing==0.35.1 -requests==2.32.3 -rfc3339-validator==0.1.4 -rfc3986-validator==0.1.1 -rich==13.7.1 -rpds-py==0.18.1 -scipy==1.16.3 -scooby==0.10.0 -Send2Trash==1.8.3 -simpervisor==1.0.0 -six==1.16.0 -sniffio==1.3.1 -soupsieve==2.5 -stack-data==0.6.3 -terminado==0.18.1 -tinycss2==1.3.0 -tomli==2.0.1 -tornado==6.4.1 -tqdm==4.66.4 -traitlets==5.14.3 -trame==3.6.3 -trame-client==3.2.0 -trame-server==3.0.2 -trame-vtk==2.8.9 -trame-vuetify==2.6.0 -types-python-dateutil==2.9.0.20240316 -typing_extensions==4.12.2 -uri-template==1.3.0 -urllib3==2.2.2 -vtk==9.3.0 -wcwidth==0.2.13 -webcolors==24.6.0 -webencodings==0.5.1 -websocket-client==1.8.0 -widgetsnbextension==4.0.11 -wslink==2.1.1 -yarl==1.9.4 -zipp==3.19.2 -iddefix -bihc -neffint diff --git a/setup.py b/setup.py deleted file mode 100644 index 5552244..0000000 --- a/setup.py +++ /dev/null @@ -1,65 +0,0 @@ -# copyright ################################# # -# This file is part of the wakis Package. # -# Copyright (c) CERN, 2024. # -# ########################################### # - -from setuptools import setup, find_packages -from pathlib import Path - -# read version -version_file = Path(__file__).parent / 'wakis/_version.py' -dd = {} -with open(version_file.absolute(), 'r') as fp: - exec(fp.read(), dd) -__version__ = dd['__version__'] - -# read long_description -long_description = (Path(__file__).parent / "README.md").read_text(encoding="utf-8") - -# read requirements.txt for extras_require -with open('requirements.txt') as f: - notebook_required = f.read().splitlines() - -setup( - name='wakis', - version=__version__, - description="3D Electromagnetic Time-Domain wake and impedance solver", - long_description=long_description, - long_description_content_type='text/markdown', - url='https://wakis.readthedocs.io/', - author='Elena de la Fuente et al.', - author_email="elena.de.la.fuente.garcia@cern.ch", - license='Apache 2.0', - download_url="https://pypi.python.org/pypi/wakis", - project_urls={ - "Bug Tracker": "https://github.com/ImpedanCEI/wakis/issues", - "Documentation": "https://wakis.readthedocs.io/en/latest/index.html", - "Source Code": "https://github.com/ImpedanCEI/wakis/wakis", - }, - packages=find_packages(), - include_package_data=True, - classifiers=[ - "Development Status :: 4 - Beta", - 'Programming Language :: Python', - 'Programming Language :: Python :: 3', - 'Programming Language :: Python :: 3.8', - 'Programming Language :: Python :: 3.9', - 'Programming Language :: Python :: 3.10', - 'Programming Language :: Python :: 3.11', - "Operating System :: OS Independent", - "Intended Audience :: Science/Research", - "Topic :: Scientific/Engineering :: Physics", - ], - install_requires=[ - 'numpy<2.0', - 'scipy', - 'pyvista', - 'h5py', - 'tqdm', - ], - extras_require={ - 'gpu': ['cupy'], - 'notebook': notebook_required, - }, - tests_require=['pytest'], - ) diff --git a/tests/_test_005_pml_boundaries.py b/tests/_test_005_pml_boundaries.py index a5fa07f..780614d 100644 --- a/tests/_test_005_pml_boundaries.py +++ b/tests/_test_005_pml_boundaries.py @@ -1,82 +1,99 @@ -import sys import numpy as np -import matplotlib.pyplot as plt from scipy.constants import c from tqdm import tqdm -sys.path.append('../') + import wakis -n_pml_arr = [5,10,15,20,25,30] -lo_pml_arr = [1e-5,5e-5,]#1.e-4,5.e-4,1.e-3,5.e-3,1.e-2,5.e-2,1.e-1] +n_pml_arr = [5, 10, 15, 20, 25, 30] +lo_pml_arr = [ + 1e-5, + 5e-5, +] # 1.e-4,5.e-4,1.e-3,5.e-3,1.e-2,5.e-2,1.e-1] -#for n_pml in n_pml_arr: +# for n_pml in n_pml_arr: for lo_pml in lo_pml_arr: - print("\n---------- Initializing simulation ------------------") # Domain bounds and grid - xmin, xmax = -1., 1. - ymin, ymax = -1., 1. - zmin, zmax = 0., 10. + xmin, xmax = -1.0, 1.0 + ymin, ymax = -1.0, 1.0 + zmin, zmax = 0.0, 10.0 Nx, Ny = 20, 20 Nz = 200 - grid = wakis.GridFIT3D(xmin, xmax, ymin, ymax, zmin, zmax, - Nx, Ny, Nz) + grid = wakis.GridFIT3D(xmin, xmax, ymin, ymax, zmin, zmax, Nx, Ny, Nz) # Source - amplitude = 100. + amplitude = 100.0 nodes = 15 - planeWave = wakis.sources.PlaneWave(xs=slice(0, Nx), ys=slice(0,Ny), zs=0, - nodes=nodes, beta=1.0, amplitude=amplitude) - + planeWave = wakis.sources.PlaneWave( + xs=slice(0, Nx), + ys=slice(0, Ny), + zs=0, + nodes=nodes, + beta=1.0, + amplitude=amplitude, + ) # Boundary conditions and solver - bc_low = ['pec', 'pec', 'pec'] - bc_high = ['pec', 'pec', 'pml'] - + bc_low = ["pec", "pec", "pec"] + bc_high = ["pec", "pec", "pml"] - solver = wakis.SolverFIT3D(grid, use_stl=False, - bc_low=bc_low, bc_high=bc_high, - n_pml=10) + solver = wakis.SolverFIT3D( + grid, use_stl=False, bc_low=bc_low, bc_high=bc_high, n_pml=10 + ) - solver.pml_lo = lo_pml #np.sqrt(1.e-4) - solver.pml_hi = np.sqrt(1.e-1) + solver.pml_lo = lo_pml # np.sqrt(1.e-4) + solver.pml_hi = np.sqrt(1.0e-1) solver.pml_func = np.geomspace solver.fill_pml_sigmas() - solver.update_tensors('sigma') + solver.update_tensors("sigma") # Simulation - Nt = int(2.0*(zmax-zmin)/c/solver.dt) + Nt = int(2.0 * (zmax - zmin) / c / solver.dt) for n in tqdm(range(Nt)): - - if n < Nt/4: # Fill half the domain - planeWave.update(solver, n*solver.dt) + if n < Nt / 4: # Fill half the domain + planeWave.update(solver, n * solver.dt) solver.one_step() - if False: #n == 1000: + if False: # n == 1000: Hi = solver.H.copy() Ei = solver.E.copy() - if n%3500 == 0 and n !=0: - solver.plot2D('Hy', plane='ZY', pos=0.5, cmap='bwr', - interpolation='spline36', n=n, vmin=-amplitude, vmax=amplitude, - off_screen=True, title=f'005_img/Hy_lin_n{solver.n_pml}_{solver.pml_lo:.1e}') - + if n % 3500 == 0 and n != 0: + solver.plot2D( + "Hy", + plane="ZY", + pos=0.5, + cmap="bwr", + interpolation="spline36", + n=n, + vmin=-amplitude, + vmax=amplitude, + off_screen=True, + title=f"005_img/Hy_lin_n{solver.n_pml}_{solver.pml_lo:.1e}", + ) + if n == 3500: Hf = solver.H.copy() Ef = solver.E.copy() - reflection = Hf.get_abs()[:,:,20:].max() - results = np.array([[solver.n_pml, - f"{solver.pml_lo:.1e}", - f"{solver.pml_hi:.1e}", - solver.pml_func.__name__, - reflection]], - dtype=object) - - with open('005_results.txt', "a") as f: + reflection = Hf.get_abs()[:, :, 20:].max() + results = np.array( + [ + [ + solver.n_pml, + f"{solver.pml_lo:.1e}", + f"{solver.pml_hi:.1e}", + solver.pml_func.__name__, + reflection, + ] + ], + dtype=object, + ) + + with open("005_results.txt", "a") as f: np.savetxt(f, results, fmt="%s", delimiter=" ") diff --git a/tests/_test_008_planewave_ABC.py b/tests/_test_008_planewave_ABC.py index 480df04..457415d 100644 --- a/tests/_test_008_planewave_ABC.py +++ b/tests/_test_008_planewave_ABC.py @@ -1,16 +1,12 @@ -import os, sys -import numpy as np import pyvista as pv -import matplotlib.pyplot as plt from scipy.constants import c -sys.path.append('../wakis') - + + from wakis import SolverFIT3D -from wakis import GridFIT3D -from wakis.sources import PlaneWave, WavePacket +from wakis import GridFIT3D +from wakis.sources import WavePacket -import pytest print("\n---------- Initializing simulation ------------------") # Number of mesh cells @@ -19,11 +15,11 @@ Nz = 200 # Embedded boundaries -stl_file = 'tests/stl/003_sphere.stl' +stl_file = "tests/stl/003_sphere.stl" surf = pv.read(stl_file) -stl_solids = {'Sphere': stl_file} -stl_materials = {'Sphere': [10.0, 1.0]} #dielectric [eps_r, mu_r] +stl_solids = {"Sphere": stl_file} +stl_materials = {"Sphere": [10.0, 1.0]} # dielectric [eps_r, mu_r] stl_rotate = [0, 0, 0] stl_scale = 1e-3 @@ -34,58 +30,96 @@ # Domain bounds and grid xmin, xmax, ymin, ymax, zmin, zmax = surf.bounds -padx, pady, padz = (xmax-xmin)*0.2, (ymax-ymin)*0.2, (zmax-zmin)*1.0 +padx, pady, padz = (xmax - xmin) * 0.2, (ymax - ymin) * 0.2, (zmax - zmin) * 1.0 -xmin, ymin, zmin = (xmin-padx), (ymin-pady), (zmin-padz) -xmax, ymax, zmax = (xmax+padx), (ymax+pady), (zmax+padz) +xmin, ymin, zmin = (xmin - padx), (ymin - pady), (zmin - padz) +xmax, ymax, zmax = (xmax + padx), (ymax + pady), (zmax + padz) global grid -grid = GridFIT3D(xmin, xmax, ymin, ymax, zmin, zmax, Nx, Ny, Nz, - stl_solids=stl_solids, - stl_rotate=stl_rotate, - stl_scale=stl_scale, - stl_materials=stl_materials) +grid = GridFIT3D( + xmin, + xmax, + ymin, + ymax, + zmin, + zmax, + Nx, + Ny, + Nz, + stl_solids=stl_solids, + stl_rotate=stl_rotate, + stl_scale=stl_scale, + stl_materials=stl_materials, +) -# Boundary conditions -bc_low=['periodic', 'periodic', 'pec'] -bc_high=['periodic', 'periodic', 'abc'] +# Boundary conditions +bc_low = ["periodic", "periodic", "pec"] +bc_high = ["periodic", "periodic", "abc"] # solver setup global solver -solver = SolverFIT3D(grid, use_stl=False, - bc_low=bc_low, - bc_high=bc_high, - bg='vacuum', - dt=0.5*grid.dz/c) +solver = SolverFIT3D( + grid, + use_stl=False, + bc_low=bc_low, + bc_high=bc_high, + bg="vacuum", + dt=0.5 * grid.dz / c, +) # source -f = 15/((solver.z.max()-solver.z.min())/c) -#source = PlaneWave(xs=slice(1, Nx), ys=slice(1,Ny), zs=1, +f = 15 / ((solver.z.max() - solver.z.min()) / c) +# source = PlaneWave(xs=slice(1, Nx), ys=slice(1,Ny), zs=1, # f=f, beta=1.0) -source = WavePacket(xs=slice(0, Nx), ys=slice(0,Ny), zs=0, - sigmaz=(grid.zmax-grid.zmin)/6, - f=f, tinj=(grid.zmax-grid.zmin)) +source = WavePacket( + xs=slice(0, Nx), + ys=slice(0, Ny), + zs=0, + sigmaz=(grid.zmax - grid.zmin) / 6, + f=f, + tinj=(grid.zmax - grid.zmin), +) # plotting -kwargs = {'field':'H', 'component':'y', - 'plane':'ZY', 'pos':0.5, - 'title':'tests/008_img/Hy', 'vmin':-2, 'vmax':2, - 'cmap':'rainbow', 'patch_reverse':False, - 'off_screen': True, 'interpolation':'spline36'} +kwargs = { + "field": "H", + "component": "y", + "plane": "ZY", + "pos": 0.5, + "title": "tests/008_img/Hy", + "vmin": -2, + "vmax": 2, + "cmap": "rainbow", + "patch_reverse": False, + "off_screen": True, + "interpolation": "spline36", +} + def callback(solver, t): - n = int(t/solver.dt) + n = int(t / solver.dt) if n % 20 == 0: - solver.plot1D(field='H', component='y', line='z', pos=[0.6, 0.5, 0.4], - xscale='linear', yscale='linear', xlim=None, #ylim=(-2, 2), - figsize=[8,4], title='tests/008_img/Hy1d', off_screen=True, n=n) - + solver.plot1D( + field="H", + component="y", + line="z", + pos=[0.6, 0.5, 0.4], + xscale="linear", + yscale="linear", + xlim=None, # ylim=(-2, 2), + figsize=[8, 4], + title="tests/008_img/Hy1d", + off_screen=True, + n=n, + ) + # fig, ax = solver.H.inspect(show=False, handles=True) # fig.savefig('tests/008_img/Hy_inspect'+str(n).zfill(5)) # plt.close(fig) -Nt = int(2.0*(solver.z.max()-solver.z.min())/c/solver.dt+(grid.zmax-grid.zmin)/c/solver.dt) -solver.emsolve(Nt, source, callback, - plot=True, - plot_every=20, - **kwargs) + +Nt = int( + 2.0 * (solver.z.max() - solver.z.min()) / c / solver.dt + + (grid.zmax - grid.zmin) / c / solver.dt +) +solver.emsolve(Nt, source, callback, plot=True, plot_every=20, **kwargs) diff --git a/tests/_test_009_mpithreads.py b/tests/_test_009_mpithreads.py index f173df5..8d61682 100644 --- a/tests/_test_009_mpithreads.py +++ b/tests/_test_009_mpithreads.py @@ -1,77 +1,93 @@ import subprocess -sockets, cores = map(int, subprocess.check_output( - "lscpu | awk -F: '/Socket\\(s\\)/{s=$2} /Core\\(s\\) per socket/{c=$2} END{print s,c}'", - shell=True).split()) -print(f"Sockets={sockets}, Cores/Socket={cores}") - +import importlib.util import os +from mpi4py import MPI + +sockets, cores = map( + int, + subprocess.check_output( + "lscpu | awk -F: '/Socket\\(s\\)/{s=$2} /Core\\(s\\) per socket/{c=$2} END{print s,c}'", + shell=True, + ).split(), +) +print(f"Sockets={sockets}, Cores/Socket={cores}") # Set before importing numpy/scipy/mkl modules -os.environ["OMP_NUM_THREADS"] = str(cores) # Number of OpenMP threads +os.environ["OMP_NUM_THREADS"] = str(cores) # Number of OpenMP threads os.environ["KMP_AFFINITY"] = "balanced,granularity=fine" -from mpi4py import MPI -import numpy as np -from scipy.sparse import csc_matrix as sparse_mat, diags, vstack, hstack -try: +import numpy as np # noqa: E402 +from scipy.sparse import csc_matrix as sparse_mat, diags, vstack, hstack # noqa: E402 +# noqa: E402 + +if importlib.util.find_spec("sparse_dot_mkl") is not None: from sparse_dot_mkl import csr_matrix, dot_product_mkl -except: pass -from threadpoolctl import threadpool_limits -from threadpoolctl import threadpool_info -import timeit + + SPARSE_DOT_MKL_AVAILABLE = True +else: + SPARSE_DOT_MKL_AVAILABLE = False + + +from threadpoolctl import threadpool_info # noqa: E402 +import timeit # noqa: E402 comm = MPI.COMM_WORLD my_rank = comm.Get_rank() p = comm.Get_size() -nt = 1//p #int(os.environ['SLURM_CPUS_PER_TASK']) # num threads per task -user_api = threadpool_info()[0]['user_api'] -#threadctl = threadpool_limits(limits=nt, user_api='blas') -#threadctl = threadpool_limits(limits=nt, user_api='openmp') -N = 80000000//p # Matrix size +nt = 1 // p # int(os.environ['SLURM_CPUS_PER_TASK']) # num threads per task +user_api = threadpool_info()[0]["user_api"] +# threadctl = threadpool_limits(limits=nt, user_api='blas') +# threadctl = threadpool_limits(limits=nt, user_api='openmp') +N = 80000000 // p # Matrix size # Build curl Px = diags([-1, 1], [0, 1], shape=(N, N), dtype=np.int8) Py = diags([-1, 1], [0, 10], shape=(N, N), dtype=np.int8) Pz = diags([-1, 1], [0, 100], shape=(N, N), dtype=np.int8) -A = vstack([ - hstack([sparse_mat((N,N)), -Pz, Py]), - hstack([Pz, sparse_mat((N,N)), -Px]), - hstack([-Py, Px, sparse_mat((N,N))]) - ], dtype=np.float64) +A = vstack( + [ + hstack([sparse_mat((N, N)), -Pz, Py]), + hstack([Pz, sparse_mat((N, N)), -Px]), + hstack([-Py, Px, sparse_mat((N, N))]), + ], + dtype=np.float64, +) -B = np.random.rand(3*N) +B = np.random.rand(3 * N) -try: - print('Using MKL backend') +if SPARSE_DOT_MKL_AVAILABLE: + print("Using MKL backend") A = csr_matrix(A) -except: - print('Using Scipy backend') - A = A.tocsr() +else: + print("Using Scipy backend") + A = A.tocsr() print(B.shape) + def test_matmul(): - #with threadpool_limits(limits=nt, user_api='blas'): - #print(threadpool_info()) - #A = np.random.rand(N, N) - #B = np.random.rand(1, N) - #C = np.matmul(A, B) - - try: - C = dot_product_mkl(A,B) - except: + # with threadpool_limits(limits=nt, user_api='blas'): + # print(threadpool_info()) + # A = np.random.rand(N, N) + # B = np.random.rand(1, N) + # C = np.matmul(A, B) + + if SPARSE_DOT_MKL_AVAILABLE: + C = dot_product_mkl(A, B) + else: C = A.dot(B) print(C.shape) -#if my_rank == 0: + +# if my_rank == 0: n_runs = 10 -t = timeit.timeit("test_matmul()", - setup="from __main__ import test_matmul", - number=n_runs) +t = timeit.timeit( + "test_matmul()", setup="from __main__ import test_matmul", number=n_runs +) -print(f"Rank {my_rank}: Average time over {n_runs} runs: {t/n_runs:.4f} seconds") +print(f"Rank {my_rank}: Average time over {n_runs} runs: {t / n_runs:.4f} seconds") MPI.Finalize() diff --git a/tests/_test_010_SIBC.py b/tests/_test_010_SIBC.py index 3ca81e8..e8f67ee 100644 --- a/tests/_test_010_SIBC.py +++ b/tests/_test_010_SIBC.py @@ -1,12 +1,10 @@ import pyvista as pv import numpy as np -import matplotlib.pyplot as plt from wakis import GridFIT3D -from wakis import SolverFIT3D # Read solid -surf = pv.read('stl/007_lossymetal_shell.stl') +surf = pv.read("stl/007_lossymetal_shell.stl") # Generate grid Nx = 50 @@ -14,26 +12,39 @@ Nz = 50 xmin, xmax, ymin, ymax, zmin, zmax = surf.bounds -grid = GridFIT3D(xmin, xmax, ymin, ymax, zmin, zmax, - Nx, Ny, Nz, - stl_solids={'shell': 'stl/007_lossymetal_shell.stl'}, - stl_materials={'shell': [1.0, 1.0, 10]}, - verbose=1) +grid = GridFIT3D( + xmin, + xmax, + ymin, + ymax, + zmin, + zmax, + Nx, + Ny, + Nz, + stl_solids={"shell": "stl/007_lossymetal_shell.stl"}, + stl_materials={"shell": [1.0, 1.0, 10]}, + verbose=1, +) # using numpy gradient -#mask = np.reshape(grid.grid['shell'], (Nx, Ny, Nz)).astype(int) -#dsc_dx, dsc_dy, dsc_dz = np.gradient(mask, grid.dx, grid.dy, grid.dz) -#grad = np.sqrt(dsc_dx**2 + dsc_dy**2 + dsc_dz**2) -#grid.grid["grad_mag"] = grad.ravel(order="F") +# mask = np.reshape(grid.grid['shell'], (Nx, Ny, Nz)).astype(int) +# dsc_dx, dsc_dy, dsc_dz = np.gradient(mask, grid.dx, grid.dy, grid.dz) +# grad = np.sqrt(dsc_dx**2 + dsc_dy**2 + dsc_dz**2) +# grid.grid["grad_mag"] = grad.ravel(order="F") # using pyvista gradient: du/dx, du/dy, du/dz -grad = np.array(grid.grid.compute_derivative(scalars='shell', gradient='gradient')['gradient']) -grad = np.sqrt(grad[:, 0]**2 + grad[:, 1]**2 + grad[:, 2]**2) -grid.grid['grad'] = grad.astype(bool) +grad = np.array( + grid.grid.compute_derivative(scalars="shell", gradient="gradient")["gradient"] +) +grad = np.sqrt(grad[:, 0] ** 2 + grad[:, 1] ** 2 + grad[:, 2] ** 2) +grid.grid["grad"] = grad.astype(bool) # --- Interactive plotting routine --- pl = pv.Plotter() -pl.add_mesh(grid.grid, scalars=None, style='wireframe', color='grey', opacity=0.2) -_ = pl.add_mesh_clip_box(grid.grid, scalars="grad", cmap="viridis", rotation_enabled=False) +pl.add_mesh(grid.grid, scalars=None, style="wireframe", color="grey", opacity=0.2) +_ = pl.add_mesh_clip_box( + grid.grid, scalars="grad", cmap="viridis", rotation_enabled=False +) pl.show() diff --git a/tests/test_000_imports.py b/tests/test_000_imports.py index 688d189..5d9a451 100644 --- a/tests/test_000_imports.py +++ b/tests/test_000_imports.py @@ -1,5 +1,4 @@ -import os, sys -import pytest + def test_dependency_imports(): import scipy @@ -9,7 +8,6 @@ def test_dependency_imports(): from tqdm import tqdm def test_module_imports(): - sys.path.append('../wakis') from wakis import SolverFIT3D from wakis import GridFIT3D @@ -20,6 +18,4 @@ def test_module_imports(): from wakis.sources import Beam from wakis.sources import PlaneWave from wakis.sources import Pulse - from wakis.sources import WavePacket - - + from wakis.sources import WavePacket \ No newline at end of file diff --git a/tests/test_001_pec_cubic_cavity.py b/tests/test_001_pec_cubic_cavity.py index 4f46f87..606c110 100644 --- a/tests/test_001_pec_cubic_cavity.py +++ b/tests/test_001_pec_cubic_cavity.py @@ -1,8 +1,8 @@ -import os, sys +import os import numpy as np import pyvista as pv -sys.path.append('../wakis') + from wakis import SolverFIT3D from wakis import GridFIT3D @@ -10,59 +10,165 @@ import pytest + @pytest.mark.slow class TestPecCubicCavity: # Regression data - WP = np.array([-9.95458549e-17, -2.05046155e-14, -3.13946919e-12, -3.06897233e-10, - -1.92003072e-08, -7.69621207e-07, -1.97695468e-05, -3.25246046e-04, - -3.42179648e-03, -2.29496511e-02, -9.74681785e-02, -2.57605933e-01, - -4.00433017e-01, -2.77971803e-01, 1.74965578e-01, 6.06108048e-01, - 5.93615999e-01, 1.48213195e-01, -3.13849000e-01, -4.18423138e-01, - -1.06055653e-01, 3.46718391e-01, 4.61725985e-01, 3.75969195e-02, - -4.69307323e-01, -4.22517889e-01, 1.27354182e-01, 4.95498135e-01, - 2.86543650e-01, -1.93994231e-01, -4.36868927e-01, -2.46039348e-01, - 2.00696576e-01, 4.77730108e-01, 2.34450998e-01, -3.20973718e-01, - -5.21458944e-01, -9.21702645e-02, 4.30032192e-01, 4.24952714e-01, - -3.23271769e-02, -4.05244228e-01, -3.54719092e-01, 4.29930706e-02, - 4.24183971e-01, 3.76540160e-01, -1.24009110e-01, -5.21691624e-01, - -3.01353114e-01, 2.80371055e-01, 5.06105865e-01, 1.51118487e-01, - -3.21008872e-01, -4.24863392e-01, -1.10982371e-01, 3.19529863e-01, - 4.50130203e-01, 8.10542918e-02, -4.30801702e-01, -4.55687907e-01, - 7.42336927e-02, 5.03432059e-01, 3.27840927e-01, -1.83622835e-01, - -4.48129076e-01, -2.50575523e-01, 1.85580579e-01, 4.54734769e-01, - 2.54338635e-01, -2.70248891e-01, -5.22500181e-01, -1.50415469e-01, - 4.07080605e-01, 4.65165698e-01, -3.17568505e-03, -4.15589815e-01, - -3.64899855e-01, 3.59083120e-02, 4.01596031e-01, 3.75713287e-01, - -7.75370758e-02, -4.96148372e-01, -3.45729644e-01, 2.34144828e-01, - 5.27290473e-01, 1.94868331e-01, -3.18596495e-01, -4.42170990e-01, - -1.17578617e-01, 3.06112222e-01, 4.35816760e-01, 1.08211242e-01, - -3.86427725e-01, -4.71772210e-01, 1.47990082e-02, 4.94782071e-01]) - - Z = np.array([-5.24909426e+00 +0.j, 8.16923909e-01 +6.02403378j, - -2.06427345e+00 +3.71312638j, -4.10217932e+00 +13.95118407j, - 2.23378636e+00 +14.14187912j, -5.17574116e+00 +15.86678186j, - -1.00358385e+00 +26.794005j , 1.37326004e+00 +21.99028187j, - -7.10389218e+00 +30.57858605j, 3.05622057e+00 +37.71516299j, - -1.95199677e+00 +31.30903732j, -6.53120427e+00 +47.29988326j, - 6.54902893e+00 +46.49366121j, -7.14109397e+00 +44.00962949j, - -2.54551548e+00 +64.83955663j, 7.60232249e+00 +53.80472334j, - -1.26928769e+01 +61.90508678j, 5.01436094e+00 +81.51964238j, - 4.29051965e+00 +61.54320948j, -1.61542604e+01 +86.39397846j, - 1.51663301e+01 +95.48299727j, -4.94965599e+00 +73.20543895j, - -1.41345777e+01 +118.11203214j, 2.53102053e+01 +105.23943652j, - -2.07262234e+01 +94.44891956j, -2.36795665e+00 +156.58071027j, - 3.05472038e+01 +110.65179411j, -4.17823007e+01 +134.21338547j, - 2.42858032e+01 +199.91670612j, 2.23451222e+01 +114.95217815j, - -6.33013844e+01 +207.77796539j, 7.23884153e+01 +244.76270925j, - -1.53485068e+01 +130.05803814j, -7.23435365e+01 +347.87989904j, - 1.53530144e+02 +287.02245535j, -1.23514190e+02 +197.90812683j, - -2.61806726e+01 +665.33665972j, 3.12540412e+02 +327.7072119j , - -5.30405716e+02 +579.26803187j, 4.86001847e+02+2327.59151824j, - 3.23055241e+03 +878.05386917j, 1.87824258e+03-2309.86790488j, - -8.08239099e+02-1285.08243448j, 5.88954657e+01 +217.25217304j, - 3.56057712e+02 -686.69210039j, -4.64168091e+02 -233.95310497j, - 2.46994361e+02 +172.91480762j, 7.19317366e+01 -481.61037549j, - -3.19808635e+02 +104.88892043j, 3.25327940e+02 +79.96383153j]) + WP = np.array( + [ + -9.95458549e-17, + -2.05046155e-14, + -3.13946919e-12, + -3.06897233e-10, + -1.92003072e-08, + -7.69621207e-07, + -1.97695468e-05, + -3.25246046e-04, + -3.42179648e-03, + -2.29496511e-02, + -9.74681785e-02, + -2.57605933e-01, + -4.00433017e-01, + -2.77971803e-01, + 1.74965578e-01, + 6.06108048e-01, + 5.93615999e-01, + 1.48213195e-01, + -3.13849000e-01, + -4.18423138e-01, + -1.06055653e-01, + 3.46718391e-01, + 4.61725985e-01, + 3.75969195e-02, + -4.69307323e-01, + -4.22517889e-01, + 1.27354182e-01, + 4.95498135e-01, + 2.86543650e-01, + -1.93994231e-01, + -4.36868927e-01, + -2.46039348e-01, + 2.00696576e-01, + 4.77730108e-01, + 2.34450998e-01, + -3.20973718e-01, + -5.21458944e-01, + -9.21702645e-02, + 4.30032192e-01, + 4.24952714e-01, + -3.23271769e-02, + -4.05244228e-01, + -3.54719092e-01, + 4.29930706e-02, + 4.24183971e-01, + 3.76540160e-01, + -1.24009110e-01, + -5.21691624e-01, + -3.01353114e-01, + 2.80371055e-01, + 5.06105865e-01, + 1.51118487e-01, + -3.21008872e-01, + -4.24863392e-01, + -1.10982371e-01, + 3.19529863e-01, + 4.50130203e-01, + 8.10542918e-02, + -4.30801702e-01, + -4.55687907e-01, + 7.42336927e-02, + 5.03432059e-01, + 3.27840927e-01, + -1.83622835e-01, + -4.48129076e-01, + -2.50575523e-01, + 1.85580579e-01, + 4.54734769e-01, + 2.54338635e-01, + -2.70248891e-01, + -5.22500181e-01, + -1.50415469e-01, + 4.07080605e-01, + 4.65165698e-01, + -3.17568505e-03, + -4.15589815e-01, + -3.64899855e-01, + 3.59083120e-02, + 4.01596031e-01, + 3.75713287e-01, + -7.75370758e-02, + -4.96148372e-01, + -3.45729644e-01, + 2.34144828e-01, + 5.27290473e-01, + 1.94868331e-01, + -3.18596495e-01, + -4.42170990e-01, + -1.17578617e-01, + 3.06112222e-01, + 4.35816760e-01, + 1.08211242e-01, + -3.86427725e-01, + -4.71772210e-01, + 1.47990082e-02, + 4.94782071e-01, + ] + ) + + Z = np.array( + [ + -5.24909426e00 + 0.0j, + 8.16923909e-01 + 6.02403378j, + -2.06427345e00 + 3.71312638j, + -4.10217932e00 + 13.95118407j, + 2.23378636e00 + 14.14187912j, + -5.17574116e00 + 15.86678186j, + -1.00358385e00 + 26.794005j, + 1.37326004e00 + 21.99028187j, + -7.10389218e00 + 30.57858605j, + 3.05622057e00 + 37.71516299j, + -1.95199677e00 + 31.30903732j, + -6.53120427e00 + 47.29988326j, + 6.54902893e00 + 46.49366121j, + -7.14109397e00 + 44.00962949j, + -2.54551548e00 + 64.83955663j, + 7.60232249e00 + 53.80472334j, + -1.26928769e01 + 61.90508678j, + 5.01436094e00 + 81.51964238j, + 4.29051965e00 + 61.54320948j, + -1.61542604e01 + 86.39397846j, + 1.51663301e01 + 95.48299727j, + -4.94965599e00 + 73.20543895j, + -1.41345777e01 + 118.11203214j, + 2.53102053e01 + 105.23943652j, + -2.07262234e01 + 94.44891956j, + -2.36795665e00 + 156.58071027j, + 3.05472038e01 + 110.65179411j, + -4.17823007e01 + 134.21338547j, + 2.42858032e01 + 199.91670612j, + 2.23451222e01 + 114.95217815j, + -6.33013844e01 + 207.77796539j, + 7.23884153e01 + 244.76270925j, + -1.53485068e01 + 130.05803814j, + -7.23435365e01 + 347.87989904j, + 1.53530144e02 + 287.02245535j, + -1.23514190e02 + 197.90812683j, + -2.61806726e01 + 665.33665972j, + 3.12540412e02 + 327.7072119j, + -5.30405716e02 + 579.26803187j, + 4.86001847e02 + 2327.59151824j, + 3.23055241e03 + 878.05386917j, + 1.87824258e03 - 2309.86790488j, + -8.08239099e02 - 1285.08243448j, + 5.88954657e01 + 217.25217304j, + 3.56057712e02 - 686.69210039j, + -4.64168091e02 - 233.95310497j, + 2.46994361e02 + 172.91480762j, + 7.19317366e01 - 481.61037549j, + -3.19808635e02 + 104.88892043j, + 3.25327940e02 + 79.96383153j, + ] + ) def test_simulation(self): print("\n---------- Initializing simulation ------------------") @@ -72,76 +178,103 @@ def test_simulation(self): Nz = 150 # Embedded boundaries - stl_file = 'tests/stl/001_cubic_cavity.stl' + stl_file = "tests/stl/001_cubic_cavity.stl" surf = pv.read(stl_file) - stl_solids = {'cavity': stl_file} - stl_materials = {'cavity': 'vacuum'} + stl_solids = {"cavity": stl_file} + stl_materials = {"cavity": "vacuum"} # Domain bounds xmin, xmax, ymin, ymax, zmin, zmax = surf.bounds # set grid and geometry global grid - grid = GridFIT3D(xmin, xmax, ymin, ymax, zmin, zmax, Nx, Ny, Nz, - stl_solids=stl_solids, - stl_materials=stl_materials) + grid = GridFIT3D( + xmin, + xmax, + ymin, + ymax, + zmin, + zmax, + Nx, + Ny, + Nz, + stl_solids=stl_solids, + stl_materials=stl_materials, + ) # Beam parameters - beta = 1. # beam beta - sigmaz = 18.5e-3*beta #[m] - q = 1e-9 #[C] - xs = 0. # x source position [m] - ys = 0. # y source position [m] - xt = 0. # x test position [m] - yt = 0. # y test position [m] + beta = 1.0 # beam beta + sigmaz = 18.5e-3 * beta # [m] + q = 1e-9 # [C] + xs = 0.0 # x source position [m] + ys = 0.0 # y source position [m] + xt = 0.0 # x test position [m] + yt = 0.0 # y test position [m] global wake skip_cells = 12 # no. cells to skip in WP integration - wake = WakeSolver(q=q, sigmaz=sigmaz, beta=beta, - xsource=xs, ysource=ys, xtest=xt, ytest=yt, - save=False, Ez_file='tests/001_Ez.h5', - skip_cells=skip_cells, - ) + wake = WakeSolver( + q=q, + sigmaz=sigmaz, + beta=beta, + xsource=xs, + ysource=ys, + xtest=xt, + ytest=yt, + save=False, + Ez_file="tests/001_Ez.h5", + skip_cells=skip_cells, + ) # boundary conditions - bc_low=['pec', 'pec', 'pec'] - bc_high=['pec', 'pec', 'pec'] + bc_low = ["pec", "pec", "pec"] + bc_high = ["pec", "pec", "pec"] # set Solver object - solver = SolverFIT3D(grid, wake, - bc_low=bc_low, bc_high=bc_high, - use_stl=True, bg='pec') + solver = SolverFIT3D( + grid, wake, bc_low=bc_low, bc_high=bc_high, use_stl=True, bg="pec" + ) - wakelength = 1. #[m] + wakelength = 1.0 # [m] solver.wakesolve(wakelength=wakelength, save_J=False) - os.remove('tests/001_Ez.h5') + os.remove("tests/001_Ez.h5") def test_long_wake_potential(self): global wake assert np.allclose(wake.WP[::50], self.WP), "Wake potential samples failed" - assert np.cumsum(np.abs(wake.WP))[-1] == pytest.approx(1325.6968037037557, 0.1), "Wake potential cumsum failed" + assert np.cumsum(np.abs(wake.WP))[-1] == pytest.approx( + 1325.6968037037557, 0.1 + ), "Wake potential cumsum failed" def test_long_impedance(self): global wake - assert np.allclose(np.abs(wake.Z)[::20], np.abs(self.Z)), "Abs Impedance samples failed" - assert np.allclose(np.real(wake.Z)[::20], np.real(self.Z)), "Real Impedance samples failed" - assert np.allclose(np.imag(wake.Z)[::20], np.imag(self.Z)), "Imag Impedance samples failed" - assert np.cumsum(np.abs(wake.Z))[-1] == pytest.approx(372019.59123029554, 0.1), "Abs Impedance cumsum failed" + assert np.allclose(np.abs(wake.Z)[::20], np.abs(self.Z)), ( + "Abs Impedance samples failed" + ) + assert np.allclose(np.real(wake.Z)[::20], np.real(self.Z)), ( + "Real Impedance samples failed" + ) + assert np.allclose(np.imag(wake.Z)[::20], np.imag(self.Z)), ( + "Imag Impedance samples failed" + ) + assert np.cumsum(np.abs(wake.Z))[-1] == pytest.approx( + 372019.59123029554, 0.1 + ), "Abs Impedance cumsum failed" def test_grid_save_to_h5(self): global grid - grid.save_to_h5('tests/001_grid.h5') - assert os.path.exists('tests/001_grid.h5'), "Grid save_to_h5 failed" + grid.save_to_h5("tests/001_grid.h5") + assert os.path.exists("tests/001_grid.h5"), "Grid save_to_h5 failed" def test_grid_load_from_h5(self): global grid - grid2 = GridFIT3D(load_from_h5='tests/001_grid.h5', - verbose=2) + grid2 = GridFIT3D(load_from_h5="tests/001_grid.h5", verbose=2) assert np.array_equal(grid.x, grid2.x), "Grid load_from_h5 x-coords failed" assert np.array_equal(grid.y, grid2.y), "Grid load_from_h5 y-coords failed" assert np.array_equal(grid.z, grid2.z), "Grid load_from_h5 z-coords failed" - assert np.array_equal(grid.grid['cavity'], grid2.grid['cavity']), "Grid load_from_h5 solid mask failed" - os.remove('tests/001_grid.h5') - + assert np.array_equal(grid.grid["cavity"], grid2.grid["cavity"]), ( + "Grid load_from_h5 solid mask failed" + ) + os.remove("tests/001_grid.h5") diff --git a/tests/test_002_analytic_resonator.py b/tests/test_002_analytic_resonator.py index 9a50de0..9f160cc 100644 --- a/tests/test_002_analytic_resonator.py +++ b/tests/test_002_analytic_resonator.py @@ -1,50 +1,86 @@ -import sys -import pytest + +import pytest import numpy as np from scipy.constants import c as c_light from tqdm import tqdm -sys.path.append('../../wakis') from wakis import SolverFIT3D -from wakis import GridFIT3D +from wakis import GridFIT3D + def test_mode_101(): m = 1 n = 0 p = 1 - theta = 0 + theta = 0 # Analytic solution of cubic resonator # Ref: http://faculty.pccu.edu.tw/~meng/new%20EM6.pdf pp.20/24 def analytic_sol_Hz(x, y, z, t): - Rm = np.array([[np.cos(-theta), - np.sin(-theta), 0],[np.sin(-theta), np.cos(-theta), 0], [0, 0, 1]]) + Rm = np.array( + [ + [np.cos(-theta), -np.sin(-theta), 0], + [np.sin(-theta), np.cos(-theta), 0], + [0, 0, 1], + ] + ) [x_0, y_0, z_0] = np.dot(Rm, np.array([x, y, z])) - return np.cos(m * np.pi / Lx * (x_0 - Lx/2)) * np.cos(n * np.pi / Ly * (y_0 - Ly/2)) * np.sin( - p * np.pi / Lz * (z_0 - Lz/2)) * np.cos(np.sqrt(2) * np.pi / Lx * c_light * t) + return ( + np.cos(m * np.pi / Lx * (x_0 - Lx / 2)) + * np.cos(n * np.pi / Ly * (y_0 - Ly / 2)) + * np.sin(p * np.pi / Lz * (z_0 - Lz / 2)) + * np.cos(np.sqrt(2) * np.pi / Lx * c_light * t) + ) def analytic_sol_Hy(x, y, z, t): - Rm = np.array([[np.cos(-theta), - np.sin(-theta), 0],[np.sin(-theta), np.cos(-theta), 0], [0, 0, 1]]) + Rm = np.array( + [ + [np.cos(-theta), -np.sin(-theta), 0], + [np.sin(-theta), np.cos(-theta), 0], + [0, 0, 1], + ] + ) [x_0, y_0, z_0] = np.dot(Rm, np.array([x, y, z])) h_2 = (m * np.pi / Lx) ** 2 + (n * np.pi / Ly) ** 2 + (p * np.pi / Lz) ** 2 - return -2 / h_2 * (n * np.pi / Ly) * (p * np.pi / Lz) * np.cos(m * np.pi / Lx * (x_0 - Lx/2)) * np.sin( - n * np.pi / Ly * (y_0 - Ly/2)) * np.cos(p * np.pi / Lz * (z_0 - Lz/2)) * np.cos( - np.sqrt(2) * np.pi / Lx * c_light * t) + return ( + -2 + / h_2 + * (n * np.pi / Ly) + * (p * np.pi / Lz) + * np.cos(m * np.pi / Lx * (x_0 - Lx / 2)) + * np.sin(n * np.pi / Ly * (y_0 - Ly / 2)) + * np.cos(p * np.pi / Lz * (z_0 - Lz / 2)) + * np.cos(np.sqrt(2) * np.pi / Lx * c_light * t) + ) def analytic_sol_Hx(x, y, z, t): - Rm = np.array([[np.cos(-theta), - np.sin(-theta), 0],[np.sin(-theta), np.cos(-theta), 0], [0, 0, 1]]) + Rm = np.array( + [ + [np.cos(-theta), -np.sin(-theta), 0], + [np.sin(-theta), np.cos(-theta), 0], + [0, 0, 1], + ] + ) [x_0, y_0, z_0] = np.dot(Rm, np.array([x, y, z])) h_2 = (m * np.pi / Lx) ** 2 + (n * np.pi / Ly) ** 2 + (p * np.pi / Lz) ** 2 - return -2 / h_2 * (m * np.pi / Lx) * (p * np.pi / Lz) * np.sin(m * np.pi / Lx * (x_0 - Lx/2)) * np.cos( - n * np.pi / Ly * (y_0 - Ly/2)) * np.cos(p * np.pi / Lz * (z_0 - Lz/2)) * np.cos( - np.sqrt(2) * np.pi / Lx * c_light * t) - - #---- Domain definition ----# - L = 1. # Domain length - N = 30 # Number of mesh cells + return ( + -2 + / h_2 + * (m * np.pi / Lx) + * (p * np.pi / Lz) + * np.sin(m * np.pi / Lx * (x_0 - Lx / 2)) + * np.cos(n * np.pi / Ly * (y_0 - Ly / 2)) + * np.cos(p * np.pi / Lz * (z_0 - Lz / 2)) + * np.cos(np.sqrt(2) * np.pi / Lx * c_light * t) + ) + + # ---- Domain definition ----# + L = 1.0 # Domain length + N = 30 # Number of mesh cells Nx = N Ny = N @@ -56,48 +92,52 @@ def analytic_sol_Hx(x, y, z, t): dy = L / Ny dz = L / Nz - xmin = -Lx/2 + dx / 2 - xmax = Lx/2 + dx / 2 - ymin = - Ly/2 + dy / 2 - ymax = Ly/2 + dy / 2 - zmin = - Lz/2 + dz / 2 - zmax = Lz/2 + dz / 2 + xmin = -Lx / 2 + dx / 2 + xmax = Lx / 2 + dx / 2 + ymin = -Ly / 2 + dy / 2 + ymax = Ly / 2 + dy / 2 + zmin = -Lz / 2 + dz / 2 + zmax = Lz / 2 + dz / 2 print("\n---------- Initializing simulation ------------------") grid = GridFIT3D(xmin, xmax, ymin, ymax, zmin, zmax, Nx, Ny, Nz) - solver = SolverFIT3D(grid, bc_low=['pec', 'pec', 'pec'], bc_high=['pec', 'pec', 'pec']) + solver = SolverFIT3D( + grid, bc_low=["pec", "pec", "pec"], bc_high=["pec", "pec", "pec"] + ) - #---- Initial conditions ------------# + # ---- Initial conditions ------------# for ii in range(Nx): for jj in range(Ny): for kk in range(Nz): x = ii * dx + xmin y = jj * dy + ymin z = kk * dz + zmin - solver.H[ii, jj, kk, 'z'] = analytic_sol_Hz(x, y, z, -0.5 * solver.dt) + solver.H[ii, jj, kk, "z"] = analytic_sol_Hz(x, y, z, -0.5 * solver.dt) x = ii * dx + xmin y = jj * dy + ymin z = kk * dz + zmin - solver.H[ii, jj, kk, 'y'] = analytic_sol_Hy(x, y, z, -0.5 * solver.dt) + solver.H[ii, jj, kk, "y"] = analytic_sol_Hy(x, y, z, -0.5 * solver.dt) x = ii * dx + xmin y = jj * dy + ymin z = kk * dz + zmin - solver.H[ii, jj, kk, 'x'] = analytic_sol_Hx(x, y, z, -0.5 * solver.dt) + solver.H[ii, jj, kk, "x"] = analytic_sol_Hx(x, y, z, -0.5 * solver.dt) - #----- Time loop -----# - #global Ey_000 + # ----- Time loop -----# + # global Ey_000 Ey_000 = [] for nt in tqdm(range(5000)): - Ey_000.append(solver.E[Nx//2, Ny//2, Nz//2, 'y']) + Ey_000.append(solver.E[Nx // 2, Ny // 2, Nz // 2, "y"]) solver.one_step() - - #------ Resonator frequency -------# + + # ------ Resonator frequency -------# Ey_000 = np.array(Ey_000) - FEy_000 = np.fft.fftshift(np.fft.fft(Ey_000))[len(Ey_000)//2:] - freqs = np.fft.fftshift(np.fft.fftfreq(len(Ey_000), d=solver.dt))[len(Ey_000)//2:] + FEy_000 = np.fft.fftshift(np.fft.fft(Ey_000))[len(Ey_000) // 2 :] + freqs = np.fft.fftshift(np.fft.fftfreq(len(Ey_000), d=solver.dt))[ + len(Ey_000) // 2 : + ] resonator_f = freqs[np.argmax(FEy_000)] # analytic frequency: https://learnemc.com/ext/calculators/cavity_resonance/rect-res.html - assert resonator_f == pytest.approx(2.121e8, 0.05), "Ey frequency error >5%" \ No newline at end of file + assert resonator_f == pytest.approx(2.121e8, 0.05), "Ey frequency error >5%" diff --git a/tests/test_003_planewave_sphere.py b/tests/test_003_planewave_sphere.py index cfea172..928cf12 100644 --- a/tests/test_003_planewave_sphere.py +++ b/tests/test_003_planewave_sphere.py @@ -1,10 +1,7 @@ import os -import sys import pyvista as pv -import matplotlib.pyplot as plt from scipy.constants import c -sys.path.append('../wakis') from wakis import SolverFIT3D from wakis import GridFIT3D @@ -15,9 +12,9 @@ # Turn False when running local flag_offscreen = True -class TestPlanewave: - img_folder = 'tests/003_img/' +class TestPlanewave: + img_folder = "tests/003_img/" def test_simulation(self): print("\n---------- Initializing simulation ------------------") @@ -27,11 +24,11 @@ def test_simulation(self): Nz = 120 # Embedded boundaries - stl_file = 'tests/stl/003_sphere.stl' + stl_file = "tests/stl/003_sphere.stl" surf = pv.read(stl_file) - stl_solids = {'Sphere': stl_file} - stl_materials = {'Sphere': [10.0, 1.0]} #dielectric [eps_r, mu_r] + stl_solids = {"Sphere": stl_file} + stl_materials = {"Sphere": [10.0, 1.0]} # dielectric [eps_r, mu_r] stl_rotate = [0, 0, 0] stl_scale = 1e-3 @@ -42,21 +39,31 @@ def test_simulation(self): # Domain bounds and grid xmin, xmax, ymin, ymax, zmin, zmax = surf.bounds - padx, pady, padz = (xmax-xmin)*0.2, (ymax-ymin)*0.2, (zmax-zmin)*1.0 + padx, pady, padz = (xmax - xmin) * 0.2, (ymax - ymin) * 0.2, (zmax - zmin) * 1.0 - xmin, ymin, zmin = (xmin-padx), (ymin-pady), (zmin-padz) - xmax, ymax, zmax = (xmax+padx), (ymax+pady), (zmax+padz) + xmin, ymin, zmin = (xmin - padx), (ymin - pady), (zmin - padz) + xmax, ymax, zmax = (xmax + padx), (ymax + pady), (zmax + padz) global grid - grid = GridFIT3D(xmin, xmax, ymin, ymax, zmin, zmax, Nx, Ny, Nz, - stl_solids=stl_solids, - stl_rotate=stl_rotate, - stl_scale=stl_scale, - stl_materials=stl_materials) + grid = GridFIT3D( + xmin, + xmax, + ymin, + ymax, + zmin, + zmax, + Nx, + Ny, + Nz, + stl_solids=stl_solids, + stl_rotate=stl_rotate, + stl_scale=stl_scale, + stl_materials=stl_materials, + ) # Boundary conditions and - bc_low=['periodic', 'periodic', 'pec'] - bc_high=['periodic', 'periodic', 'pml'] + bc_low = ["periodic", "periodic", "pec"] + bc_high = ["periodic", "periodic", "pml"] # -------------- Output folder --------------------- if not os.path.exists(self.img_folder): @@ -67,11 +74,12 @@ def test_simulation(self): solver = SolverFIT3D(grid, use_stl=True, bc_low=bc_low, bc_high=bc_high) # source - f = 15/((solver.z.max()-solver.z.min())/c) - source = PlaneWave(xs=slice(1, Nx-1), ys=slice(1,Ny-1), zs=1, - f=f, beta=1.0) + f = 15 / ((solver.z.max() - solver.z.min()) / c) + source = PlaneWave( + xs=slice(1, Nx - 1), ys=slice(1, Ny - 1), zs=1, f=f, beta=1.0 + ) - Nt = int(1.0*(solver.z.max()-solver.z.min())/c/solver.dt) + Nt = int(1.0 * (solver.z.max() - solver.z.min()) / c / solver.dt) solver.emsolve(Nt, source) def test_field_inspect(self): @@ -85,47 +93,91 @@ def test_field_inspect(self): def test_plot1D(self): global solver - solver.plot1D('Ex', line='z', pos=[0.7, 0.6, 0.5, 0.4, 0.3, 0.2], - xscale='linear', yscale='linear', - off_screen=flag_offscreen, n=solver.Nt, - colors=['#5ccfe6', '#fdb6d0', '#ffae57', '#bae67e', '#ffd580', '#a2aabc'], - title=self.img_folder+'1Dplot_Ex') + solver.plot1D( + "Ex", + line="z", + pos=[0.7, 0.6, 0.5, 0.4, 0.3, 0.2], + xscale="linear", + yscale="linear", + off_screen=flag_offscreen, + n=solver.Nt, + colors=["#5ccfe6", "#fdb6d0", "#ffae57", "#bae67e", "#ffd580", "#a2aabc"], + title=self.img_folder + "1Dplot_Ex", + ) def test_plot2D(self): global solver - solver.plot2D('Hy', plane='ZY', pos=0.5, cmap='bwr', - add_patch='Sphere', patch_alpha=0.1, interpolation='spline36', - off_screen=flag_offscreen, n=solver.Nt, - title=self.img_folder+'2Dplot_Hy') + solver.plot2D( + "Hy", + plane="ZY", + pos=0.5, + cmap="bwr", + add_patch="Sphere", + patch_alpha=0.1, + interpolation="spline36", + off_screen=flag_offscreen, + n=solver.Nt, + title=self.img_folder + "2Dplot_Hy", + ) @pytest.mark.skipif(flag_offscreen, reason="Requires interactive plotting") def test_plot3D_interactive(self): global solver - solver.plot3D(field='E', component='x', cmap='jet', - add_stl='Sphere', stl_opacity=0.1, stl_colors='white', - clip_interactive=True, clip_normal='-y', - off_screen=False) + solver.plot3D( + field="E", + component="x", + cmap="jet", + add_stl="Sphere", + stl_opacity=0.1, + stl_colors="white", + clip_interactive=True, + clip_normal="-y", + off_screen=False, + ) def test_plot3D_offscreen(self): global solver - solver.plot3D(field='H', component='y', cmap='bwr', - add_stl='Sphere', stl_opacity=0.1, stl_colors='white', - clip_box=True, clip_bounds=None, - off_screen=flag_offscreen, title=self.img_folder+'3Dplot_Hy') + solver.plot3D( + field="H", + component="y", + cmap="bwr", + add_stl="Sphere", + stl_opacity=0.1, + stl_colors="white", + clip_box=True, + clip_bounds=None, + off_screen=flag_offscreen, + title=self.img_folder + "3Dplot_Hy", + ) @pytest.mark.skipif(flag_offscreen, reason="Requires interactive plotting") def test_plot3DonSTL_interactive(self): global solver - solver.plot3DonSTL('Ex', cmap='jet', - stl_with_field='Sphere', field_opacity=1., - stl_transparent='Sphere', stl_opacity=0.3, stl_colors='white', - clip_interactive=True, clip_normal='-y', - off_screen=False, zoom=1.0) + solver.plot3DonSTL( + "Ex", + cmap="jet", + stl_with_field="Sphere", + field_opacity=1.0, + stl_transparent="Sphere", + stl_opacity=0.3, + stl_colors="white", + clip_interactive=True, + clip_normal="-y", + off_screen=False, + zoom=1.0, + ) def test_plot3DonSTL_offscreen(self): global solver - solver.plot3DonSTL('Ex', cmap='jet', - stl_with_field='Sphere', field_opacity=1., - stl_transparent=None, stl_opacity=0., stl_colors=None, - off_screen=flag_offscreen, zoom=1.0, - title=self.img_folder+'3DplotOnSTL_Hy') + solver.plot3DonSTL( + "Ex", + cmap="jet", + stl_with_field="Sphere", + field_opacity=1.0, + stl_transparent=None, + stl_opacity=0.0, + stl_colors=None, + off_screen=flag_offscreen, + zoom=1.0, + title=self.img_folder + "3DplotOnSTL_Hy", + ) diff --git a/tests/test_004_wakes_and_impedances.py b/tests/test_004_wakes_and_impedances.py index 306b4d1..c69c273 100644 --- a/tests/test_004_wakes_and_impedances.py +++ b/tests/test_004_wakes_and_impedances.py @@ -1,65 +1,78 @@ -import os, sys import numpy as np import matplotlib.pyplot as plt -sys.path.append('../wakis') + from wakis import WakeSolver as wk + class TestImpedancesAndWakes: def test_sin_wake(self): fr = 0.5e9 A = 100 - t = np.linspace(0, 100*1e-9, 3000) - wake = A*np.sin(2*np.pi*fr*t) + t = np.linspace(0, 100 * 1e-9, 3000) + wake = A * np.sin(2 * np.pi * fr * t) f, Z = wk.calc_impedance_from_wake([t, wake]) tt, wwake = wk.calc_wake_from_impedance([f, Z], samples=3000) - ff, Zz = wk.calc_impedance_from_wake([tt, wwake],) - ttt, wwwake = wk.calc_wake_from_impedance([ff,Zz], samples=3000) + ff, Zz = wk.calc_impedance_from_wake( + [tt, wwake], + ) + ttt, wwwake = wk.calc_wake_from_impedance([ff, Zz], samples=3000) - assert np.allclose(wake, wwake, atol=1), '1st Transformed wake failed' - assert np.allclose(wake, wwwake, atol=1), '2nd Transformed wake failed' + assert np.allclose(wake, wwake, atol=1), "1st Transformed wake failed" + assert np.allclose(wake, wwwake, atol=1), "2nd Transformed wake failed" def test_sin_impedance(self): fr = 0.5e9 A = 100 - t = np.linspace(0, 100*1e-9, 3000) - wake = A*np.sin(2*np.pi*fr*t) + t = np.linspace(0, 100 * 1e-9, 3000) + wake = A * np.sin(2 * np.pi * fr * t) f, Z = wk.calc_impedance_from_wake([t, wake]) tt, wwake = wk.calc_wake_from_impedance([f, Z], samples=3000) - ff, Zz = wk.calc_impedance_from_wake([tt, wwake],) + ff, Zz = wk.calc_impedance_from_wake( + [tt, wwake], + ) - assert np.allclose(np.max(np.abs(Z)), A, atol=1), '1st Transformed impedance Max. failed' - assert np.allclose(np.max(np.abs(Zz)), A, atol=1), '2nd Transformed impedance Max. failed' + assert np.allclose(np.max(np.abs(Z)), A, atol=1), ( + "1st Transformed impedance Max. failed" + ) + assert np.allclose(np.max(np.abs(Zz)), A, atol=1), ( + "2nd Transformed impedance Max. failed" + ) - assert np.allclose(f[np.argmax(Z)], fr, atol=1e6), '1st Transformed impedance fr failed' - assert np.allclose(ff[np.argmax(Zz)], fr, atol=1e6), '2nd Transformed impedance fr. failed' + assert np.allclose(f[np.argmax(Z)], fr, atol=1e6), ( + "1st Transformed impedance fr failed" + ) + assert np.allclose(ff[np.argmax(Zz)], fr, atol=1e6), ( + "2nd Transformed impedance fr. failed" + ) def plot_sin(self): fr = 0.5e9 A = 100 - t = np.linspace(0, 100*1e-9, 3000) - wake = A*np.sin(2*np.pi*fr*t) - + t = np.linspace(0, 100 * 1e-9, 3000) + wake = A * np.sin(2 * np.pi * fr * t) + f, Z = wk.calc_impedance_from_wake([t, wake]) tt, wwake = wk.calc_wake_from_impedance([f, Z], samples=3000) - ff, Zz = wk.calc_impedance_from_wake([tt, wwake],) - ttt, wwwake = wk.calc_wake_from_impedance([ff,Zz], samples=3000) + ff, Zz = wk.calc_impedance_from_wake( + [tt, wwake], + ) + ttt, wwwake = wk.calc_wake_from_impedance([ff, Zz], samples=3000) - fig, (ax1,ax2) = plt.subplots(2,1) - ax1.plot(t, wake, '-g', alpha=0.8, label='analytic') - ax1.plot(tt, wwake, '--r', alpha=0.5, label='calc') - ax1.plot(ttt, wwwake, '--b', alpha=0.5, label='calc, iter2') - ax1.set_xlabel('time [s]') + fig, (ax1, ax2) = plt.subplots(2, 1) + ax1.plot(t, wake, "-g", alpha=0.8, label="analytic") + ax1.plot(tt, wwake, "--r", alpha=0.5, label="calc") + ax1.plot(ttt, wwwake, "--b", alpha=0.5, label="calc, iter2") + ax1.set_xlabel("time [s]") - ax2.plot([fr,fr], [0., A], '-g', alpha=0.8, label='analytic') - ax2.plot(f, np.abs(Z), '--r', alpha=0.5, label='calc') - ax2.plot(ff, np.abs(Zz), '--b', alpha=0.5, label='calc, iter2') - ax2.set_xlabel('frequency [Hz]') + ax2.plot([fr, fr], [0.0, A], "-g", alpha=0.8, label="analytic") + ax2.plot(f, np.abs(Z), "--r", alpha=0.5, label="calc") + ax2.plot(ff, np.abs(Zz), "--b", alpha=0.5, label="calc, iter2") + ax2.set_xlabel("frequency [Hz]") ax2.legend() fig.tight_layout() - fig.savefig('test_004_sin.png') + fig.savefig("test_004_sin.png") plt.show() - diff --git a/tests/test_005_pml_boundaries.py b/tests/test_005_pml_boundaries.py index ca063ca..c49892d 100644 --- a/tests/test_005_pml_boundaries.py +++ b/tests/test_005_pml_boundaries.py @@ -1,19 +1,19 @@ -import sys,os +import os import numpy as np -from scipy.constants import c, mu_0, epsilon_0 +from scipy.constants import c, mu_0 from tqdm import tqdm -sys.path.append('../') + import wakis import pytest -flag_interactive = False # Set to true to run plot tests +flag_interactive = False # Set to true to run plot tests -class TestPML: +class TestPML: def test_timestep(self): - #TODO: check for dt < relaxation time + # TODO: check for dt < relaxation time pass def test_reflection_planewave(self): @@ -26,12 +26,7 @@ def test_reflection_planewave(self): Nx, Ny = 20, 20 Nz = 200 - grid = wakis.GridFIT3D(xmin, xmax, ymin, ymax, zmin, zmax, - Nx, Ny, Nz) - - # Boundary conditions and solver - bc_low = ['periodic', 'periodic', 'pec'] - bc_high = ['periodic', 'periodic', 'pml'] + grid = wakis.GridFIT3D(xmin, xmax, ymin, ymax, zmin, zmax, Nx, Ny, Nz) # Test different eps_r and sigma case eps_r = 1.0 @@ -118,13 +113,20 @@ def test_reflection_planewave_resistive_material(self): n_pml=30) # Source - amplitude = 100. + amplitude = 100.0 nodes = 7 - f = 15/((solver.z.max()-solver.z.min())/c) - planeWave = wakis.sources.PlaneWave(xs=slice(0, Nx), ys=slice(0,Ny), zs=0, - beta=1.0, amplitude=amplitude, - f=f, nodes=nodes, phase=np.pi/2) - solver.dt = 1/f/200 #ensure right amplitude + f = 15 / ((solver.z.max() - solver.z.min()) / c) + planeWave = wakis.sources.PlaneWave( + xs=slice(0, Nx), + ys=slice(0, Ny), + zs=0, + beta=1.0, + amplitude=amplitude, + f=f, + nodes=nodes, + phase=np.pi / 2, + ) + solver.dt = 1 / f / 200 # ensure right amplitude # Simulation @@ -136,7 +138,7 @@ def test_reflection_planewave_resistive_material(self): Nt = int(eps_r*2.0*(zmax-zmin-z_pml)/c/solver.dt) for n in tqdm(range(Nt)): - planeWave.update(solver, n*solver.dt) + planeWave.update(solver, n * solver.dt) solver.one_step() if flag_interactive and n%int(Nt/100) == 0: @@ -240,47 +242,45 @@ def test_reflection_planewave_high_resistivity_material(self): off_screen=True, title=f'005_Hy2d') def _pml_func(): - pml_lo = 0.005 pml_hi = 0.1 n_pml = 10 lin = np.linspace(pml_lo, pml_hi, n_pml) - geom = np.geomspace(pml_lo, pml_hi, n_pml) #r=(pml_hi/pml_lo)**(1/(n_pml-1)) + geom = np.geomspace(pml_lo, pml_hi, n_pml) # r=(pml_hi/pml_lo)**(1/(n_pml-1)) - x = np.linspace(0,1, n_pml) - quad = pml_lo + (pml_hi - pml_lo)*x**2 - cub = pml_lo + (pml_hi - pml_lo)*x**3 - quart = pml_lo + (pml_hi - pml_lo)*x**4 - quint = pml_lo + (pml_hi - pml_lo)*x**5 + x = np.linspace(0, 1, n_pml) + quad = pml_lo + (pml_hi - pml_lo) * x**2 + cub = pml_lo + (pml_hi - pml_lo) * x**3 + quart = pml_lo + (pml_hi - pml_lo) * x**4 + quint = pml_lo + (pml_hi - pml_lo) * x**5 # Plot func profiles import matplotlib.pyplot as plt + fig, ax = plt.subplots() - ax.plot(lin, label='linspace') - ax.plot(geom, label='geomspace') - ax.plot(quad, label='quadratic') - ax.plot(cub, label='cubic') - ax.plot(quart, label='quartic') - ax.plot(quint, label='quintic') - ax.set_xlabel('PML cells n') - ax.set_ylabel(r'conductivity profile $\sigma(n)$') + ax.plot(lin, label="linspace") + ax.plot(geom, label="geomspace") + ax.plot(quad, label="quadratic") + ax.plot(cub, label="cubic") + ax.plot(quart, label="quartic") + ax.plot(quint, label="quintic") + ax.set_xlabel("PML cells n") + ax.set_ylabel(r"conductivity profile $\sigma(n)$") ax.legend() - #plt.show() + # plt.show() # Plot func derivative fig, ax = plt.subplots(dpi=200) - ax.plot(lin[1:]-lin[:-1], label='linspace') - ax.plot(geom[1:]-geom[:-1], label='geomspace') - ax.plot(quad[1:]-quad[:-1], label='quadratic') - ax.plot(cub[1:]-cub[:-1], label='cubic') - ax.plot(quart[1:]-quart[:-1], label='quartic') - ax.plot(quint[1:]-quint[:-1], label='quintic') - ax.set_xlabel('PML cells n') - ax.set_ylabel(r'gradient of conductivity profile $\sigma(n)$') + ax.plot(lin[1:] - lin[:-1], label="linspace") + ax.plot(geom[1:] - geom[:-1], label="geomspace") + ax.plot(quad[1:] - quad[:-1], label="quadratic") + ax.plot(cub[1:] - cub[:-1], label="cubic") + ax.plot(quart[1:] - quart[:-1], label="quartic") + ax.plot(quint[1:] - quint[:-1], label="quintic") + ax.set_xlabel("PML cells n") + ax.set_ylabel(r"gradient of conductivity profile $\sigma(n)$") ax.legend() - - diff --git a/tests/test_006_geometry_utils.py b/tests/test_006_geometry_utils.py index e0255e4..fdb66f0 100644 --- a/tests/test_006_geometry_utils.py +++ b/tests/test_006_geometry_utils.py @@ -1,39 +1,51 @@ -import sys -sys.path.append('../wakis') - -from wakis import geometry -import pytest + + +from wakis import geometry class TestGeometryUtils: - #Compare data - STP_FILE = 'tests/stl/006_muonCavity.stp' - - COLORS = {'000_Vacuum-Half_cell_dx': [0.5, 0.800000011920929, 1.0], - '001_Be-windows-Be-window-left': [0.752941012382507, 0.752941012382507, 0.752941012382507], - '002_Be-windows-Be-window-right': [0.752941012382507, 0.752941012382507, 0.752941012382507], - '003_Walls-Cavity-walls': [1.0, 0.615685999393463, 0.235293999314308], - '004_Vacuum-Half_cell_sx': [0.5, 0.800000011920929, 1.0]} - - MATERIALS = {'000_Vacuum-Half_cell_dx': 'vacuum', - '001_Be-windows-Be-window-left': 'berillium', - '002_Be-windows-Be-window-right': 'berillium', - '003_Walls-Cavity-walls': 'copper--annealed-', - '004_Vacuum-Half_cell_sx': 'vacuum'} - - SOLIDS = {'000_Vacuum-Half_cell_dx': '000_Vacuum-Half_cell_dx_Vacuum.stl', - '001_Be-windows-Be-window-left': '001_Be-windows-Be-window-left_Berillium.stl', - '002_Be-windows-Be-window-right': '002_Be-windows-Be-window-right_Berillium.stl', - '003_Walls-Cavity-walls': '003_Walls-Cavity-walls_Copper--annealed-.stl', - '004_Vacuum-Half_cell_sx': '004_Vacuum-Half_cell_sx_Vacuum.stl'} + # Compare data + STP_FILE = "tests/stl/006_muonCavity.stp" + + COLORS = { + "000_Vacuum-Half_cell_dx": [0.5, 0.800000011920929, 1.0], + "001_Be-windows-Be-window-left": [ + 0.752941012382507, + 0.752941012382507, + 0.752941012382507, + ], + "002_Be-windows-Be-window-right": [ + 0.752941012382507, + 0.752941012382507, + 0.752941012382507, + ], + "003_Walls-Cavity-walls": [1.0, 0.615685999393463, 0.235293999314308], + "004_Vacuum-Half_cell_sx": [0.5, 0.800000011920929, 1.0], + } + + MATERIALS = { + "000_Vacuum-Half_cell_dx": "vacuum", + "001_Be-windows-Be-window-left": "berillium", + "002_Be-windows-Be-window-right": "berillium", + "003_Walls-Cavity-walls": "copper--annealed-", + "004_Vacuum-Half_cell_sx": "vacuum", + } + + SOLIDS = { + "000_Vacuum-Half_cell_dx": "000_Vacuum-Half_cell_dx_Vacuum.stl", + "001_Be-windows-Be-window-left": "001_Be-windows-Be-window-left_Berillium.stl", + "002_Be-windows-Be-window-right": "002_Be-windows-Be-window-right_Berillium.stl", + "003_Walls-Cavity-walls": "003_Walls-Cavity-walls_Copper--annealed-.stl", + "004_Vacuum-Half_cell_sx": "004_Vacuum-Half_cell_sx_Vacuum.stl", + } UNITS = 0.001 def test_colors(self): colors = geometry.extract_colors_from_stp(self.STP_FILE) assert colors == self.COLORS - + def test_materials(self): materials = geometry.extract_materials_from_stp(self.STP_FILE) assert materials == self.MATERIALS @@ -45,4 +57,3 @@ def test_solids(self): def test_units(self): units = geometry.get_stp_unit_scale(self.STP_FILE) assert units == self.UNITS - diff --git a/tests/test_007_mpi_lossy_cavity.py b/tests/test_007_mpi_lossy_cavity.py index 815c7da..676d916 100644 --- a/tests/test_007_mpi_lossy_cavity.py +++ b/tests/test_007_mpi_lossy_cavity.py @@ -1,10 +1,9 @@ import os -import sys import numpy as np import pyvista as pv import matplotlib.pyplot as plt -sys.path.append('../wakis') + from tqdm import tqdm from scipy.constants import c @@ -22,88 +21,256 @@ # Turn true when running local flag_plot_3D = False + @pytest.mark.slow class TestMPILossyCavity: # Regression data - WP = np.array([-1.20513623e-18 ,-3.43161145e-14 ,-9.12255548e-11 ,-5.96997512e-08, - -1.14173019e-05 ,-6.67499094e-04 ,-1.20239747e-02 ,-6.53062215e-02, - -9.26520639e-02 , 2.78321623e-02 ,1.25518516e-01 , 7.30670041e-02, - -1.90239810e-02 ,-4.85596408e-02 ,-3.20357619e-02 ,-1.41604640e-02, - 6.08356174e-02 , 8.46570691e-02 ,-5.47181776e-02 ,-1.16180823e-01, - 1.96111216e-02 , 9.92679050e-02 , 2.71878152e-02 ,-5.20035156e-02, - -4.06137472e-02 ,-1.13185667e-02 , 1.23530805e-02 , 7.68524041e-02, - 2.25859758e-02 ,-9.37436643e-02 ,-5.75287185e-02 , 6.39890431e-02, - 8.01280003e-02 ,-2.25671230e-02 ,-5.80154107e-02 ,-1.67525750e-02, - 1.87720028e-03 , 4.10247646e-02 ,5.36731566e-02 ,-3.30682943e-02, - -8.35234400e-02 ,-3.49965114e-03 , 8.57976513e-02 , 3.52580927e-02, - -5.59291793e-02 ,-3.74168173e-02 ,-1.57790071e-03 , 2.16477574e-02, - 4.65687493e-02 , 1.13356268e-02 ,-5.61946649e-02 ,-5.45040228e-02, - 4.41993189e-02 ,7.38920452e-02 ,-1.60854441e-02 ,-5.54896162e-02, - -1.77145556e-02 , 1.61884877e-02 , 3.33170207e-02 , 2.63165394e-02, - -1.83733826e-02 ,-5.94726314e-02 ,-1.15493543e-02 , 6.90379083e-02, - 3.30361171e-02 ,-4.32087737e-02 ,-4.14862834e-02 , 2.95742481e-03, - 3.11653273e-02 , 2.43513549e-02 , 5.17266702e-03 ,-3.70591561e-02, - -4.24818163e-02 , 3.09681557e-02 , 5.76902933e-02 ,-4.78519848e-03, - -5.02625318e-02 ,-2.09821868e-02 , 2.46893459e-02 , 2.77009485e-02, - 1.12395692e-02 ,-1.34117335e-02 ,-4.22375110e-02 ,-8.34037808e-03, - 4.81709861e-02 , 3.05819110e-02 ,-2.98222467e-02 ,-4.38079436e-02, - 6.51694708e-03 , 3.11637911e-02 , 1.61475003e-02 ,-1.03231050e-03, - -2.84581274e-02 ,-2.64695160e-02 ,1.92431962e-02 , 4.34036616e-02, - 3.00897180e-03 ,-4.36364833e-02 ,-2.09601909e-02 , 2.48741294e-02, - 2.47321674e-02 ,5.34334063e-03 ,-1.56819510e-02 ,-2.75503078e-02]) - - Z = np.array([ 7.77970188e+00 -0.j , -3.85415882e+00 +14.7587971j, - -3.61177110e+00 +4.52999754j, 1.11502695e+01 +16.94389961j, - -1.48367615e+00 +31.13414676j ,-2.42369181e+00 +20.20481814j, - 1.32631009e+01 +32.26388931j , 7.84469425e-02 +48.06727516j, - -2.04548300e+00 +36.16821013j , 1.55741147e+01 +48.44883647j, - 1.37311998e+00 +66.93221773j ,-2.19747672e+00 +53.47374311j, - 1.86245241e+01 +66.56951352j ,2.65234275e+00 +89.33983678j, - -2.94989399e+00 +73.40544312j , 2.31553338e+01 +88.22587886j, - 4.16269453e+00 +118.22389548j ,-4.66524583e+00 +98.31868989j, - 3.07626943e+01 +116.67578417j , 6.41211027e+00 +160.3569522j, - -8.36053398e+00 +133.90634108j , 4.61970915e+01 +160.6857645j, - 1.14408149e+01 +237.02472112j ,-1.72907188e+01 +200.58798515j, - 9.34171798e+01 +257.88692816j , 4.19201258e+01 +475.3131594j, - -3.28372915e+01 +498.40274299j , 1.47161715e+03 +896.91077291j, - 4.46726052e+02-1074.75272128j , 1.48368867e+02 -150.95840903j, - -7.65707535e+01 -95.4006897j , 4.13011813e+01 -115.5293095j, - 5.96957058e+01 +64.38392007j ,-4.17351813e+01 +65.90769948j, - 4.16431845e+01 +45.42941094j , 5.22637205e+01 +182.75009977j, - -2.42252500e+01 +183.45582422j , 8.56170191e+01 +206.784262j, - 9.77958353e+01 +444.21692899j , 8.26325734e+01 +560.54204926j, - 1.44414393e+03 +765.73788438j , 7.29867370e+02-1096.11716581j, - 1.17986711e+02 -317.31632024j ,-4.56173056e+01 -277.3675436j, - 7.54525872e+01 -200.5232469j , 2.20725250e+01 -36.10606952j, - -3.94369541e+01 -81.45040661j , 6.08389766e+01 -53.3224972j, - 1.97319998e+01 +64.35491532j ,-1.82274232e+01 +4.8794245j]) - - Ez = np.array([ 2.21799580e+01, -5.78362380e+00 ,-6.00531608e+00 ,-1.01718118e+00, - 1.73468186e+00 , 1.29313000e+00 ,-9.69312994e+00 ,-2.59107426e+01, - -4.73006858e+01 ,-7.11016384e+01 ,-9.36971115e+01 ,-1.12676454e+02, - -1.28296571e+02 ,-1.40866374e+02 ,-1.48363099e+02 ,-1.51635428e+02, - -1.48185125e+02 ,-1.37740237e+02 ,-1.19948398e+02 ,-9.23354987e+01, - -6.04105997e+01 ,-3.06532160e+01 ,-1.17749936e+01 ,-3.12574866e+00, - -7.35339521e-01 ,-1.13085658e-01 , 7.18247535e-01 , 8.73829036e-02]) - - gridLogs = {'use_mesh_refinement': False, 'Nx': 60, 'Ny': 60, 'Nz': 140, 'dx': 0.00866666634877522, - 'dy': 0.00866666634877522, 'dz': 0.005714285799435207, - 'xmin': -0.25999999046325684, 'xmax': 0.25999999046325684, - 'ymin': -0.25999999046325684, 'ymax': 0.25999999046325684, - 'zmin': -0.25, 'zmax': 0.550000011920929, - 'stl_solids': {'cavity': 'tests/stl/007_vacuum_cavity.stl', 'shell': 'tests/stl/007_lossymetal_shell.stl'}, - 'stl_materials': {'cavity': 'vacuum', 'shell': [30, 1.0, 30]}, - 'gridInitializationTime': 0} - - solverLogs = {'use_gpu': False, 'use_mpi': False, 'background': 'pec', - 'bc_low': ['pec', 'pec', 'pec'], 'bc_high': ['pec', 'pec', 'pec'], - 'dt': 6.970326728398966e-12, 'solverInitializationTime': 0} - - wakeSolverLogs = {'ti': 2.8516132094735135e-09, 'q': 1e-09, 'sigmaz': 0.1, 'beta': 1.0, - 'xsource': 0.0, 'ysource': 0.0, 'xtest': 0.0, 'ytest': 0.0, 'chargedist': None, - 'skip_cells': 10, 'results_folder': 'tests/007_results/', 'wakelength': 10.0, 'simulationTime': 0} - - img_folder = 'tests/007_img/' + WP = np.array( + [ + -1.20513623e-18, + -3.43161145e-14, + -9.12255548e-11, + -5.96997512e-08, + -1.14173019e-05, + -6.67499094e-04, + -1.20239747e-02, + -6.53062215e-02, + -9.26520639e-02, + 2.78321623e-02, + 1.25518516e-01, + 7.30670041e-02, + -1.90239810e-02, + -4.85596408e-02, + -3.20357619e-02, + -1.41604640e-02, + 6.08356174e-02, + 8.46570691e-02, + -5.47181776e-02, + -1.16180823e-01, + 1.96111216e-02, + 9.92679050e-02, + 2.71878152e-02, + -5.20035156e-02, + -4.06137472e-02, + -1.13185667e-02, + 1.23530805e-02, + 7.68524041e-02, + 2.25859758e-02, + -9.37436643e-02, + -5.75287185e-02, + 6.39890431e-02, + 8.01280003e-02, + -2.25671230e-02, + -5.80154107e-02, + -1.67525750e-02, + 1.87720028e-03, + 4.10247646e-02, + 5.36731566e-02, + -3.30682943e-02, + -8.35234400e-02, + -3.49965114e-03, + 8.57976513e-02, + 3.52580927e-02, + -5.59291793e-02, + -3.74168173e-02, + -1.57790071e-03, + 2.16477574e-02, + 4.65687493e-02, + 1.13356268e-02, + -5.61946649e-02, + -5.45040228e-02, + 4.41993189e-02, + 7.38920452e-02, + -1.60854441e-02, + -5.54896162e-02, + -1.77145556e-02, + 1.61884877e-02, + 3.33170207e-02, + 2.63165394e-02, + -1.83733826e-02, + -5.94726314e-02, + -1.15493543e-02, + 6.90379083e-02, + 3.30361171e-02, + -4.32087737e-02, + -4.14862834e-02, + 2.95742481e-03, + 3.11653273e-02, + 2.43513549e-02, + 5.17266702e-03, + -3.70591561e-02, + -4.24818163e-02, + 3.09681557e-02, + 5.76902933e-02, + -4.78519848e-03, + -5.02625318e-02, + -2.09821868e-02, + 2.46893459e-02, + 2.77009485e-02, + 1.12395692e-02, + -1.34117335e-02, + -4.22375110e-02, + -8.34037808e-03, + 4.81709861e-02, + 3.05819110e-02, + -2.98222467e-02, + -4.38079436e-02, + 6.51694708e-03, + 3.11637911e-02, + 1.61475003e-02, + -1.03231050e-03, + -2.84581274e-02, + -2.64695160e-02, + 1.92431962e-02, + 4.34036616e-02, + 3.00897180e-03, + -4.36364833e-02, + -2.09601909e-02, + 2.48741294e-02, + 2.47321674e-02, + 5.34334063e-03, + -1.56819510e-02, + -2.75503078e-02, + ] + ) + + Z = np.array( + [ + 7.77970188e00 - 0.0j, + -3.85415882e00 + 14.7587971j, + -3.61177110e00 + 4.52999754j, + 1.11502695e01 + 16.94389961j, + -1.48367615e00 + 31.13414676j, + -2.42369181e00 + 20.20481814j, + 1.32631009e01 + 32.26388931j, + 7.84469425e-02 + 48.06727516j, + -2.04548300e00 + 36.16821013j, + 1.55741147e01 + 48.44883647j, + 1.37311998e00 + 66.93221773j, + -2.19747672e00 + 53.47374311j, + 1.86245241e01 + 66.56951352j, + 2.65234275e00 + 89.33983678j, + -2.94989399e00 + 73.40544312j, + 2.31553338e01 + 88.22587886j, + 4.16269453e00 + 118.22389548j, + -4.66524583e00 + 98.31868989j, + 3.07626943e01 + 116.67578417j, + 6.41211027e00 + 160.3569522j, + -8.36053398e00 + 133.90634108j, + 4.61970915e01 + 160.6857645j, + 1.14408149e01 + 237.02472112j, + -1.72907188e01 + 200.58798515j, + 9.34171798e01 + 257.88692816j, + 4.19201258e01 + 475.3131594j, + -3.28372915e01 + 498.40274299j, + 1.47161715e03 + 896.91077291j, + 4.46726052e02 - 1074.75272128j, + 1.48368867e02 - 150.95840903j, + -7.65707535e01 - 95.4006897j, + 4.13011813e01 - 115.5293095j, + 5.96957058e01 + 64.38392007j, + -4.17351813e01 + 65.90769948j, + 4.16431845e01 + 45.42941094j, + 5.22637205e01 + 182.75009977j, + -2.42252500e01 + 183.45582422j, + 8.56170191e01 + 206.784262j, + 9.77958353e01 + 444.21692899j, + 8.26325734e01 + 560.54204926j, + 1.44414393e03 + 765.73788438j, + 7.29867370e02 - 1096.11716581j, + 1.17986711e02 - 317.31632024j, + -4.56173056e01 - 277.3675436j, + 7.54525872e01 - 200.5232469j, + 2.20725250e01 - 36.10606952j, + -3.94369541e01 - 81.45040661j, + 6.08389766e01 - 53.3224972j, + 1.97319998e01 + 64.35491532j, + -1.82274232e01 + 4.8794245j, + ] + ) + + Ez = np.array( + [ + 2.21799580e01, + -5.78362380e00, + -6.00531608e00, + -1.01718118e00, + 1.73468186e00, + 1.29313000e00, + -9.69312994e00, + -2.59107426e01, + -4.73006858e01, + -7.11016384e01, + -9.36971115e01, + -1.12676454e02, + -1.28296571e02, + -1.40866374e02, + -1.48363099e02, + -1.51635428e02, + -1.48185125e02, + -1.37740237e02, + -1.19948398e02, + -9.23354987e01, + -6.04105997e01, + -3.06532160e01, + -1.17749936e01, + -3.12574866e00, + -7.35339521e-01, + -1.13085658e-01, + 7.18247535e-01, + 8.73829036e-02, + ] + ) + + gridLogs = { + "use_mesh_refinement": False, + "Nx": 60, + "Ny": 60, + "Nz": 140, + "dx": 0.00866666634877522, + "dy": 0.00866666634877522, + "dz": 0.005714285799435207, + "xmin": -0.25999999046325684, + "xmax": 0.25999999046325684, + "ymin": -0.25999999046325684, + "ymax": 0.25999999046325684, + "zmin": -0.25, + "zmax": 0.550000011920929, + "stl_solids": { + "cavity": "tests/stl/007_vacuum_cavity.stl", + "shell": "tests/stl/007_lossymetal_shell.stl", + }, + "stl_materials": {"cavity": "vacuum", "shell": [30, 1.0, 30]}, + "gridInitializationTime": 0, + } + + solverLogs = { + "use_gpu": False, + "use_mpi": False, + "background": "pec", + "bc_low": ["pec", "pec", "pec"], + "bc_high": ["pec", "pec", "pec"], + "dt": 6.970326728398966e-12, + "solverInitializationTime": 0, + } + + wakeSolverLogs = { + "ti": 2.8516132094735135e-09, + "q": 1e-09, + "sigmaz": 0.1, + "beta": 1.0, + "xsource": 0.0, + "ysource": 0.0, + "xtest": 0.0, + "ytest": 0.0, + "chargedist": None, + "skip_cells": 10, + "results_folder": "tests/007_results/", + "wakelength": 10.0, + "simulationTime": 0, + } + + img_folder = "tests/007_img/" def test_mpi_import(self): # ---------- MPI setup ------------ @@ -125,20 +292,18 @@ def test_mpi_import(self): print(f"Using mpi: {use_mpi}") def test_mpi_simulation(self): - # ---------- Domain setup --------- # Geometry & Materials - solid_1 = 'tests/stl/007_vacuum_cavity.stl' - solid_2 = 'tests/stl/007_lossymetal_shell.stl' + solid_1 = "tests/stl/007_vacuum_cavity.stl" + solid_2 = "tests/stl/007_lossymetal_shell.stl" - stl_solids = {'cavity': solid_1, - 'shell': solid_2 - } + stl_solids = {"cavity": solid_1, "shell": solid_2} - stl_materials = {'cavity': 'vacuum', - 'shell': [30, 1.0, 30] #[eps_r, mu_r, sigma[S/m]] - } + stl_materials = { + "cavity": "vacuum", + "shell": [30, 1.0, 30], # [eps_r, mu_r, sigma[S/m]] + } # Extract domain bounds from geometry solids = pv.read(solid_1) + pv.read(solid_2) @@ -149,44 +314,55 @@ def test_mpi_simulation(self): Ny = 60 NZ = 140 global use_mpi - grid = GridFIT3D(xmin, xmax, ymin, ymax, ZMIN, ZMAX, - Nx, Ny, NZ, - use_mpi=use_mpi, # Enables MPI subdivision of the domain - stl_solids=stl_solids, - stl_materials=stl_materials, - stl_scale=1.0, - stl_rotate=[0,0,0], - stl_translate=[0,0,0], - verbose=1) + grid = GridFIT3D( + xmin, + xmax, + ymin, + ymax, + ZMIN, + ZMAX, + Nx, + Ny, + NZ, + use_mpi=use_mpi, # Enables MPI subdivision of the domain + stl_solids=stl_solids, + stl_materials=stl_materials, + stl_scale=1.0, + stl_rotate=[0, 0, 0], + stl_translate=[0, 0, 0], + verbose=1, + ) if use_mpi: - print(f"Process {grid.rank}: Handling Z range {grid.zmin} to {grid.zmax} with {grid.Nz} cells") + print( + f"Process {grid.rank}: Handling Z range {grid.zmin} to {grid.zmax} with {grid.Nz} cells" + ) # ------------ Beam source & Wake ---------------- # Beam parameters - sigmaz = 10e-2 #[m] -> 2 GHz - q = 1e-9 #[C] - beta = 1.0 # beam beta - xs = 0. # x source position [m] - ys = 0. # y source position [m] - ti = 3*sigmaz/c # injection time [s] + sigmaz = 10e-2 # [m] -> 2 GHz + q = 1e-9 # [C] + beta = 1.0 # beam beta + xs = 0.0 # x source position [m] + ys = 0.0 # y source position [m] + ti = 3 * sigmaz / c # injection time [s] - beam = Beam(q=q, sigmaz=sigmaz, beta=beta, - xsource=xs, ysource=ys, ti=ti) + beam = Beam(q=q, sigmaz=sigmaz, beta=beta, xsource=xs, ysource=ys, ti=ti) # ----------- Solver & Simulation ---------- # boundary conditions - bc_low=['pec', 'pec', 'pec'] - bc_high=['pec', 'pec', 'pec'] + bc_low = ["pec", "pec", "pec"] + bc_high = ["pec", "pec", "pec"] # Solver setup global solver - solver = SolverFIT3D(grid, - bc_low=bc_low, - bc_high=bc_high, - use_stl=True, - use_mpi=use_mpi, # Activate MPI - bg='pec' # Background material - ) + solver = SolverFIT3D( + grid, + bc_low=bc_low, + bc_high=bc_high, + use_stl=True, + use_mpi=use_mpi, # Activate MPI + bg="pec", # Background material + ) # -------------- Output folder --------------------- if use_mpi and solver.rank == 0: @@ -200,57 +376,81 @@ def test_mpi_simulation(self): if use_mpi: Nt = 3000 for n in tqdm(range(Nt)): - - beam.update(solver, n*solver.dt) + beam.update(solver, n * solver.dt) solver.mpi_one_step() - Ez = solver.mpi_gather('Ez', x=int(Nx/2), y=int(Ny/2)) + Ez = solver.mpi_gather("Ez", x=int(Nx / 2), y=int(Ny / 2)) if solver.rank == 0: - #print(Ez) + # print(Ez) print(len(Ez)) assert len(Ez) == NZ, "Electric field Ez samples length mismatch" - assert np.allclose(Ez[np.s_[::5]], self.Ez, rtol=0.1), "Electric field Ez samples MPI failed" + assert np.allclose(Ez[np.s_[::5]], self.Ez, rtol=0.1), ( + "Electric field Ez samples MPI failed" + ) else: Nt = 3000 for n in tqdm(range(Nt)): - - beam.update(solver, n*solver.dt) + beam.update(solver, n * solver.dt) solver.one_step() - Ez = solver.E[int(Nx/2), int(Ny/2), np.s_[::5], 'z'] - #print(Ez) - assert len(solver.E[int(Nx/2), int(Ny/2), :, 'z']) == NZ, "Electric field Ez samples length mismatch" - assert np.allclose(Ez, self.Ez, rtol=0.1), "Electric field Ez samples failed" + Ez = solver.E[int(Nx / 2), int(Ny / 2), np.s_[::5], "z"] + # print(Ez) + assert len(solver.E[int(Nx / 2), int(Ny / 2), :, "z"]) == NZ, ( + "Electric field Ez samples length mismatch" + ) + assert np.allclose(Ez, self.Ez, rtol=0.1), ( + "Electric field Ez samples failed" + ) def test_mpi_gather_asField(self): # Plot inspect after mpi gather global solver if use_mpi: - E = solver.mpi_gather_asField('E') - if solver.rank == 0: #custom plots go in rank 0 - fig, ax = E.inspect(figsize=[20,6], plane='YZ', show=False, handles=True) - fig.savefig(self.img_folder+'Einspect_'+str(3000).zfill(4)+'.png') + E = solver.mpi_gather_asField("E") + if solver.rank == 0: # custom plots go in rank 0 + fig, ax = E.inspect( + figsize=[20, 6], plane="YZ", show=False, handles=True + ) + fig.savefig(self.img_folder + "Einspect_" + str(3000).zfill(4) + ".png") plt.close(fig) else: - fig, ax = solver.E.inspect(figsize=[20,6], plane='YZ', show=False, handles=True) - fig.savefig(self.img_folder+'Einspect_'+str(3000).zfill(4)+'.png') + fig, ax = solver.E.inspect( + figsize=[20, 6], plane="YZ", show=False, handles=True + ) + fig.savefig(self.img_folder + "Einspect_" + str(3000).zfill(4) + ".png") plt.close(fig) def test_mpi_plot2D(self): # Plot E abs in 2D every 20 timesteps global solver - solver.plot2D(field='E', component='Abs', - plane='YZ', pos=0.5, - cmap='rainbow', vmin=0, vmax=500., interpolation='hanning', - off_screen=True, title=self.img_folder+'Ez2d', n=3000) + solver.plot2D( + field="E", + component="Abs", + plane="YZ", + pos=0.5, + cmap="rainbow", + vmin=0, + vmax=500.0, + interpolation="hanning", + off_screen=True, + title=self.img_folder + "Ez2d", + n=3000, + ) def test_mpi_plot1D(self): # Plot E z in 1D at diferent transverse positions `pos` every 20 timesteps global solver - solver.plot1D(field='E', component='z', - line='z', pos=[0.45, 0.5, 0.55], - xscale='linear', yscale='linear', - off_screen=True, title=self.img_folder+'Ez1d', n=3000) + solver.plot1D( + field="E", + component="z", + line="z", + pos=[0.45, 0.5, 0.55], + xscale="linear", + yscale="linear", + off_screen=True, + title=self.img_folder + "Ez1d", + n=3000, + ) def test_mpi_wakefield(self): # Reset fields @@ -259,62 +459,84 @@ def test_mpi_wakefield(self): # ------------ Beam source ---------------- # Beam parameters - sigmaz = 10e-2 #[m] -> 2 GHz - q = 1e-9 #[C] - beta = 1.0 # beam beta - xs = 0. # x source position [m] - ys = 0. # y source position [m] - xt = 0. # x test position [m] - yt = 0. # y test position [m] + sigmaz = 10e-2 # [m] -> 2 GHz + q = 1e-9 # [C] + beta = 1.0 # beam beta + xs = 0.0 # x source position [m] + ys = 0.0 # y source position [m] + xt = 0.0 # x test position [m] + yt = 0.0 # y test position [m] # [DEFAULT] tinj = 8.53*sigmaz/c_light # injection time offset [s] # ----------- Wake Solver setup ---------- # Wakefield post-processor - wakelength = 10. # [m] -> Partially decayed + wakelength = 10.0 # [m] -> Partially decayed skip_cells = 10 # no. cells to skip at zlo/zhi for wake integration - results_folder = 'tests/007_results/' + results_folder = "tests/007_results/" global wake - wake = WakeSolver(q=q, sigmaz=sigmaz, beta=beta, - xsource=xs, ysource=ys, xtest=xt, ytest=yt, - skip_cells=skip_cells, - results_folder=results_folder, - Ez_file=results_folder+'Ez.h5',) + wake = WakeSolver( + q=q, + sigmaz=sigmaz, + beta=beta, + xsource=xs, + ysource=ys, + xtest=xt, + ytest=yt, + skip_cells=skip_cells, + results_folder=results_folder, + Ez_file=results_folder + "Ez.h5", + ) # Run simulation - solver.wakesolve(wakelength=wakelength, - wake=wake) + solver.wakesolve(wakelength=wakelength, wake=wake) def test_long_wake_potential(self): global wake global solver if use_mpi: if solver.rank == 0: - #print(wake.WP[::50]) + # print(wake.WP[::50]) print(len(wake.WP)) assert len(wake.WP) == 5195, "Wake potential samples length mismatch" - assert np.allclose(wake.WP[::50], self.WP, rtol=0.1), "Wake potential samples failed" - assert np.cumsum(np.abs(wake.WP))[-1] == pytest.approx(184.43818552913254, 0.1), "Wake potential cumsum MPI failed" + assert np.allclose(wake.WP[::50], self.WP, rtol=0.1), ( + "Wake potential samples failed" + ) + assert np.cumsum(np.abs(wake.WP))[-1] == pytest.approx( + 184.43818552913254, 0.1 + ), "Wake potential cumsum MPI failed" else: - #print(wake.WP[::50]) + # print(wake.WP[::50]) assert len(wake.WP) == 5195, "Wake potential samples length mismatch" - assert np.allclose(wake.WP[::50], self.WP, rtol=0.1), "Wake potential samples failed" - assert np.cumsum(np.abs(wake.WP))[-1] == pytest.approx(184.43818552913254, 0.1), "Wake potential cumsum MPI failed" + assert np.allclose(wake.WP[::50], self.WP, rtol=0.1), ( + "Wake potential samples failed" + ) + assert np.cumsum(np.abs(wake.WP))[-1] == pytest.approx( + 184.43818552913254, 0.1 + ), "Wake potential cumsum MPI failed" def test_long_impedance(self): global wake global solver if use_mpi: if solver.rank == 0: - #print(wake.Z[::20]) + # print(wake.Z[::20]) print(len(wake.Z)) assert len(wake.Z) == 998, "Impedance samples length mismatch" - assert np.allclose(np.abs(wake.Z)[::20], np.abs(self.Z), rtol=0.1), "Abs Impedance samples MPI failed" - assert np.allclose(np.real(wake.Z)[::20], np.real(self.Z), rtol=0.1), "Real Impedance samples MPI failed" - assert np.allclose(np.imag(wake.Z)[::20], np.imag(self.Z), rtol=0.1), "Imag Impedance samples MPI failed" - assert np.cumsum(np.abs(wake.Z))[-1] == pytest.approx(250910.51090497518, 0.1), "Abs Impedance cumsum MPI failed" + assert np.allclose(np.abs(wake.Z)[::20], np.abs(self.Z), rtol=0.1), ( + "Abs Impedance samples MPI failed" + ) + assert np.allclose(np.real(wake.Z)[::20], np.real(self.Z), rtol=0.1), ( + "Real Impedance samples MPI failed" + ) + assert np.allclose(np.imag(wake.Z)[::20], np.imag(self.Z), rtol=0.1), ( + "Imag Impedance samples MPI failed" + ) + assert np.cumsum(np.abs(wake.Z))[-1] == pytest.approx( + 250910.51090497518, 0.1 + ), "Abs Impedance cumsum MPI failed" else: - #print(wake.Z[::20]) + # print(wake.Z[::20]) assert len(wake.Z) == 998, "Impedance samples length mismatch" assert np.allclose(np.abs(wake.Z)[::20], np.abs(self.Z), rtol=0.1), "Abs Impedance samples failed" assert np.allclose(np.real(wake.Z)[::20], np.real(self.Z), rtol=0.1), "Real Impedance samples failed" @@ -324,8 +546,9 @@ def test_long_impedance(self): def test_log_file(self): # Helper function to compare nested dicts with float tolerance def assert_dict_allclose(d1, d2, rtol=1e-6, atol=1e-12, path=""): - assert set(d1.keys()) == set(d2.keys()), \ + assert set(d1.keys()) == set(d2.keys()), ( f"Key mismatch at {path}: {set(d1.keys())} != {set(d2.keys())}" + ) for k in d1: v1, v2 = d1[k], d2[k] @@ -348,8 +571,9 @@ def assert_dict_allclose(d1, d2, rtol=1e-6, atol=1e-12, path=""): assert len(v1) == len(v2), f"Length mismatch at {p}" for i, (a, b) in enumerate(zip(v1, v2)): if isinstance(a, float) and isinstance(b, float): - assert np.isclose(a, b, rtol=rtol, atol=atol), \ + assert np.isclose(a, b, rtol=rtol, atol=atol), ( f"Float mismatch at {p}[{i}]: {a} != {b}" + ) else: assert a == b, f"Value mismatch at {p}[{i}]: {a} != {b}" @@ -373,7 +597,7 @@ def assert_dict_allclose(d1, d2, rtol=1e-6, atol=1e-12, path=""): solver.logger.grid["gridInitializationTime"] = 0 solver.logger.solver["solverInitializationTime"] = 0 solver.logger.wakeSolver["simulationTime"] = 0 - self.solverLogs['use_mpi'] = use_mpi + self.solverLogs["use_mpi"] = use_mpi # Check log file exists logfile = os.path.join(solver.logger.wakeSolver["results_folder"], "wakis.log") diff --git a/tests/test_008_3D_plotting.py b/tests/test_008_3D_plotting.py index 6660c50..098bc82 100644 --- a/tests/test_008_3D_plotting.py +++ b/tests/test_008_3D_plotting.py @@ -1,8 +1,7 @@ import os -import sys import pyvista as pv -sys.path.append('../wakis') + from tqdm import tqdm from scipy.constants import c @@ -17,29 +16,26 @@ # Turn False when running local flag_offscreen = True + @pytest.mark.slow class Test3Dplotting: - - img_folder = 'tests/008_img/' + img_folder = "tests/008_img/" def test_simulation(self): - # ---------- Domain setup --------- # Geometry & Materials - solid_1 = 'tests/stl/007_vacuum_cavity.stl' - solid_2 = 'tests/stl/007_lossymetal_shell.stl' + solid_1 = "tests/stl/007_vacuum_cavity.stl" + solid_2 = "tests/stl/007_lossymetal_shell.stl" - stl_solids = {'cavity': solid_1, - 'shell': solid_2 - } + stl_solids = {"cavity": solid_1, "shell": solid_2} - stl_materials = {'cavity': 'vacuum', - 'shell': [30, 1.0, 30] #[eps_r, mu_r, sigma[S/m]] - } + stl_materials = { + "cavity": "vacuum", + "shell": [30, 1.0, 30], # [eps_r, mu_r, sigma[S/m]] + } - stl_colors = {'cavity': 'tab:blue', - 'shell': 'silver'} + stl_colors = {"cavity": "tab:blue", "shell": "silver"} # Extract domain bounds from geometry solids = pv.read(solid_1) + pv.read(solid_2) @@ -50,46 +46,55 @@ def test_simulation(self): Ny = 60 NZ = 140 - grid = GridFIT3D(xmin, xmax, ymin, ymax, ZMIN, ZMAX, - Nx, Ny, NZ, - use_mpi=False, # Enables MPI subdivision of the domain - stl_solids=stl_solids, - stl_materials=stl_materials, - stl_colors=stl_colors, - stl_scale=1.0, - stl_rotate=[0,0,0], - stl_translate=[0,0,0], - verbose=1) + grid = GridFIT3D( + xmin, + xmax, + ymin, + ymax, + ZMIN, + ZMAX, + Nx, + Ny, + NZ, + use_mpi=False, # Enables MPI subdivision of the domain + stl_solids=stl_solids, + stl_materials=stl_materials, + stl_colors=stl_colors, + stl_scale=1.0, + stl_rotate=[0, 0, 0], + stl_translate=[0, 0, 0], + verbose=1, + ) # ------------ Beam source & Wake ---------------- # Beam parameters - sigmaz = 10e-2 #[m] -> 2 GHz - q = 1e-9 #[C] - beta = 1.0 # beam beta - xs = 0. # x source position [m] - ys = 1e-2 # y source position [m] - ti = 3*sigmaz/c # injection time [s] + sigmaz = 10e-2 # [m] -> 2 GHz + q = 1e-9 # [C] + beta = 1.0 # beam beta + xs = 0.0 # x source position [m] + ys = 1e-2 # y source position [m] + ti = 3 * sigmaz / c # injection time [s] - beam = Beam(q=q, sigmaz=sigmaz, beta=beta, - xsource=xs, ysource=ys, ti=ti) + beam = Beam(q=q, sigmaz=sigmaz, beta=beta, xsource=xs, ysource=ys, ti=ti) - wake = WakeSolver(q=q, sigmaz=sigmaz, beta=beta, - xsource=xs, ysource=ys, ti=ti) + wake = WakeSolver(q=q, sigmaz=sigmaz, beta=beta, xsource=xs, ysource=ys, ti=ti) # ----------- Solver & Simulation ---------- # boundary conditions - bc_low=['pec', 'pec', 'pec'] - bc_high=['pec', 'pec', 'pec'] + bc_low = ["pec", "pec", "pec"] + bc_high = ["pec", "pec", "pec"] # Solver setup global solver - solver = SolverFIT3D(grid, wake, - bc_low=bc_low, - bc_high=bc_high, - use_stl=True, - use_mpi=False, # Activate MPI - bg='pec' # Background material - ) + solver = SolverFIT3D( + grid, + wake, + bc_low=bc_low, + bc_high=bc_high, + use_stl=True, + use_mpi=False, # Activate MPI + bg="pec", # Background material + ) # -------------- Output folder --------------------- if not os.path.exists(self.img_folder): @@ -98,67 +103,96 @@ def test_simulation(self): # -------------- Custom time loop ----------------- Nt = 1000 for n in tqdm(range(Nt)): - beam.update(solver, n*solver.dt) + beam.update(solver, n * solver.dt) solver.one_step() def test_grid_inspect(self): # Plot grid and imported solids global solver - pl = solver.grid.inspect(add_stl=['cavity', 'shell'], - stl_opacity=0.1, off_screen=flag_offscreen, - anti_aliasing='ssaa') + pl = solver.grid.inspect( + add_stl=["cavity", "shell"], + stl_opacity=0.1, + off_screen=flag_offscreen, + anti_aliasing="ssaa", + ) if flag_offscreen: - #pl.screenshot(self.img_folder+'grid_inspect.png') - pl.export_html(self.img_folder+'grid_inspect.html') + # pl.screenshot(self.img_folder+'grid_inspect.png') + pl.export_html(self.img_folder + "grid_inspect.html") def test_grid_plot_solids(self): # Plot only imported solids global solver - solver.grid.plot_solids(bounding_box=True, - show_grid=False, - opacity=1, - specular=0.5, - smooth_shading=False, - off_screen=flag_offscreen,) + solver.grid.plot_solids( + bounding_box=True, + show_grid=False, + opacity=1, + specular=0.5, + smooth_shading=False, + off_screen=flag_offscreen, + ) def test_grid_stl_mask(self): # Plot STL solid masks in the grid global solver - solver.grid.plot_stl_mask(stl_solid='cavity', - cmap='viridis', - add_stl='all', - stl_opacity=0.5, - smooth_shading=False, - anti_aliasing='ssaa', - ymax=0.0, - off_screen=flag_offscreen,) + solver.grid.plot_stl_mask( + stl_solid="cavity", + cmap="viridis", + add_stl="all", + stl_opacity=0.5, + smooth_shading=False, + anti_aliasing="ssaa", + ymax=0.0, + off_screen=flag_offscreen, + ) def test_solver_inspect(self): # Plot imported solids and beam source and integraiton path global solver - pl = solver.inspect(window_size=(1200,800), off_screen=flag_offscreen, - specular=0., opacity=1, inactive_opacity=0.1, - add_silhouette=True,) + pl = solver.inspect( + window_size=(1200, 800), + off_screen=flag_offscreen, + specular=0.0, + opacity=1, + inactive_opacity=0.1, + add_silhouette=True, + ) if flag_offscreen: - #pl.screenshot(self.img_folder+'solver_inspect.png') - pl.export_html(self.img_folder+'solver_inspect.html') + # pl.screenshot(self.img_folder+'solver_inspect.png') + pl.export_html(self.img_folder + "solver_inspect.html") def test_plot3D(self): # Plot Abs Electric field on domain global solver - solver.plot3D('E', component='z', - cmap='rainbow', clim=[0, 500], - add_stl=['cavity', 'shell'], stl_opacity=0.1, - clip_interactive=True, clip_normal='-y', - title=self.img_folder+'Ez3d', - off_screen=flag_offscreen) + solver.plot3D( + "E", + component="z", + cmap="rainbow", + clim=[0, 500], + add_stl=["cavity", "shell"], + stl_opacity=0.1, + clip_interactive=True, + clip_normal="-y", + title=self.img_folder + "Ez3d", + off_screen=flag_offscreen, + ) def test_plot3DonSTL(self): # Plot Abs Electric field on STL solid `cavity` global solver - solver.plot3DonSTL('E', component='Abs', - cmap='rainbow', clim=[0, 500], - stl_with_field='cavity', field_opacity=1.0, - stl_transparent='shell', stl_opacity=0.1, stl_colors='white', - clip_plane=True, clip_normal='-y', clip_origin=[0,0,0], - off_screen=flag_offscreen, zoom=1.2, title=self.img_folder+'EAbs3donSTL') + solver.plot3DonSTL( + "E", + component="Abs", + cmap="rainbow", + clim=[0, 500], + stl_with_field="cavity", + field_opacity=1.0, + stl_transparent="shell", + stl_opacity=0.1, + stl_colors="white", + clip_plane=True, + clip_normal="-y", + clip_origin=[0, 0, 0], + off_screen=flag_offscreen, + zoom=1.2, + title=self.img_folder + "EAbs3donSTL", + ) diff --git a/uv.lock b/uv.lock new file mode 100644 index 0000000..66360a7 --- /dev/null +++ b/uv.lock @@ -0,0 +1,8581 @@ +version = 1 +revision = 3 +requires-python = ">=3.8" +resolution-markers = [ + "python_full_version >= '3.14'", + "python_full_version >= '3.11' and python_full_version < '3.14'", + "python_full_version == '3.10.*'", + "python_full_version == '3.9.*'", + "python_full_version < '3.9'", +] + +[[package]] +name = "aiohappyeyeballs" +version = "2.4.4" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version < '3.9'", +] +sdist = { url = "https://files.pythonhosted.org/packages/7f/55/e4373e888fdacb15563ef6fa9fa8c8252476ea071e96fb46defac9f18bf2/aiohappyeyeballs-2.4.4.tar.gz", hash = "sha256:5fdd7d87889c63183afc18ce9271f9b0a7d32c2303e394468dd45d514a757745", size = 21977, upload-time = "2024-11-30T18:44:00.701Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/b9/74/fbb6559de3607b3300b9be3cc64e97548d55678e44623db17820dbd20002/aiohappyeyeballs-2.4.4-py3-none-any.whl", hash = "sha256:a980909d50efcd44795c4afeca523296716d50cd756ddca6af8c65b996e27de8", size = 14756, upload-time = "2024-11-30T18:43:39.849Z" }, +] + +[[package]] +name = "aiohappyeyeballs" +version = "2.6.1" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version >= '3.14'", + "python_full_version >= '3.11' and python_full_version < '3.14'", + "python_full_version == '3.10.*'", + "python_full_version == '3.9.*'", +] +sdist = { url = "https://files.pythonhosted.org/packages/26/30/f84a107a9c4331c14b2b586036f40965c128aa4fee4dda5d3d51cb14ad54/aiohappyeyeballs-2.6.1.tar.gz", hash = "sha256:c3f9d0113123803ccadfdf3f0faa505bc78e6a72d1cc4806cbd719826e943558", size = 22760, upload-time = "2025-03-12T01:42:48.764Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/0f/15/5bf3b99495fb160b63f95972b81750f18f7f4e02ad051373b669d17d44f2/aiohappyeyeballs-2.6.1-py3-none-any.whl", hash = "sha256:f349ba8f4b75cb25c99c5c2d84e997e485204d2902a9597802b0371f09331fb8", size = 15265, upload-time = "2025-03-12T01:42:47.083Z" }, +] + +[[package]] +name = "aiohttp" +version = "3.10.11" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version < '3.9'", +] +dependencies = [ + { name = "aiohappyeyeballs", version = "2.4.4", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.9'" }, + { name = "aiosignal", version = "1.3.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.9'" }, + { name = "async-timeout", marker = "python_full_version < '3.9'" }, + { name = "attrs", version = "25.3.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.9'" }, + { name = "frozenlist", version = "1.5.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.9'" }, + { name = "multidict", version = "6.1.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.9'" }, + { name = "yarl", version = "1.15.2", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.9'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/25/a8/8e2ba36c6e3278d62e0c88aa42bb92ddbef092ac363b390dab4421da5cf5/aiohttp-3.10.11.tar.gz", hash = "sha256:9dc2b8f3dcab2e39e0fa309c8da50c3b55e6f34ab25f1a71d3288f24924d33a7", size = 7551886, upload-time = "2024-11-13T16:40:33.335Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/11/c7/575f9e82d7ef13cb1b45b9db8a5b8fadb35107fb12e33809356ae0155223/aiohttp-3.10.11-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:5077b1a5f40ffa3ba1f40d537d3bec4383988ee51fbba6b74aa8fb1bc466599e", size = 588218, upload-time = "2024-11-13T16:36:38.461Z" }, + { url = "https://files.pythonhosted.org/packages/12/7b/a800dadbd9a47b7f921bfddcd531371371f39b9cd05786c3638bfe2e1175/aiohttp-3.10.11-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:8d6a14a4d93b5b3c2891fca94fa9d41b2322a68194422bef0dd5ec1e57d7d298", size = 400815, upload-time = "2024-11-13T16:36:40.547Z" }, + { url = "https://files.pythonhosted.org/packages/cb/28/7dbd53ab10b0ded397feed914880f39ce075bd39393b8dfc322909754a0a/aiohttp-3.10.11-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:ffbfde2443696345e23a3c597049b1dd43049bb65337837574205e7368472177", size = 392099, upload-time = "2024-11-13T16:36:43.918Z" }, + { url = "https://files.pythonhosted.org/packages/6a/2e/c6390f49e67911711c2229740e261c501685fe7201f7f918d6ff2fd1cfb0/aiohttp-3.10.11-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:20b3d9e416774d41813bc02fdc0663379c01817b0874b932b81c7f777f67b217", size = 1224854, upload-time = "2024-11-13T16:36:46.473Z" }, + { url = "https://files.pythonhosted.org/packages/69/68/c96afae129201bff4edbece52b3e1abf3a8af57529a42700669458b00b9f/aiohttp-3.10.11-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2b943011b45ee6bf74b22245c6faab736363678e910504dd7531a58c76c9015a", size = 1259641, upload-time = "2024-11-13T16:36:48.28Z" }, + { url = "https://files.pythonhosted.org/packages/63/89/bedd01456442747946114a8c2f30ff1b23d3b2ea0c03709f854c4f354a5a/aiohttp-3.10.11-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:48bc1d924490f0d0b3658fe5c4b081a4d56ebb58af80a6729d4bd13ea569797a", size = 1295412, upload-time = "2024-11-13T16:36:50.286Z" }, + { url = "https://files.pythonhosted.org/packages/9b/4d/942198e2939efe7bfa484781590f082135e9931b8bcafb4bba62cf2d8f2f/aiohttp-3.10.11-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e12eb3f4b1f72aaaf6acd27d045753b18101524f72ae071ae1c91c1cd44ef115", size = 1218311, upload-time = "2024-11-13T16:36:53.721Z" }, + { url = "https://files.pythonhosted.org/packages/a3/5b/8127022912f1fa72dfc39cf37c36f83e0b56afc3b93594b1cf377b6e4ffc/aiohttp-3.10.11-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f14ebc419a568c2eff3c1ed35f634435c24ead2fe19c07426af41e7adb68713a", size = 1189448, upload-time = "2024-11-13T16:36:55.844Z" }, + { url = "https://files.pythonhosted.org/packages/af/12/752878033c8feab3362c0890a4d24e9895921729a53491f6f6fad64d3287/aiohttp-3.10.11-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:72b191cdf35a518bfc7ca87d770d30941decc5aaf897ec8b484eb5cc8c7706f3", size = 1186484, upload-time = "2024-11-13T16:36:58.472Z" }, + { url = "https://files.pythonhosted.org/packages/61/24/1d91c304fca47d5e5002ca23abab9b2196ac79d5c531258e048195b435b2/aiohttp-3.10.11-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:5ab2328a61fdc86424ee540d0aeb8b73bbcad7351fb7cf7a6546fc0bcffa0038", size = 1183864, upload-time = "2024-11-13T16:37:00.737Z" }, + { url = "https://files.pythonhosted.org/packages/c1/70/022d28b898314dac4cb5dd52ead2a372563c8590b1eaab9c5ed017eefb1e/aiohttp-3.10.11-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:aa93063d4af05c49276cf14e419550a3f45258b6b9d1f16403e777f1addf4519", size = 1241460, upload-time = "2024-11-13T16:37:03.175Z" }, + { url = "https://files.pythonhosted.org/packages/c3/15/2b43853330f82acf180602de0f68be62a2838d25d03d2ed40fecbe82479e/aiohttp-3.10.11-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:30283f9d0ce420363c24c5c2421e71a738a2155f10adbb1a11a4d4d6d2715cfc", size = 1258521, upload-time = "2024-11-13T16:37:06.013Z" }, + { url = "https://files.pythonhosted.org/packages/28/38/9ef2076cb06dcc155e7f02275f5da403a3e7c9327b6b075e999f0eb73613/aiohttp-3.10.11-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:e5358addc8044ee49143c546d2182c15b4ac3a60be01c3209374ace05af5733d", size = 1207329, upload-time = "2024-11-13T16:37:08.091Z" }, + { url = "https://files.pythonhosted.org/packages/c2/5f/c5329d67a2c83d8ae17a84e11dec14da5773520913bfc191caaf4cd57e50/aiohttp-3.10.11-cp310-cp310-win32.whl", hash = "sha256:e1ffa713d3ea7cdcd4aea9cddccab41edf6882fa9552940344c44e59652e1120", size = 363835, upload-time = "2024-11-13T16:37:10.017Z" }, + { url = "https://files.pythonhosted.org/packages/0f/c6/ca5d70eea2fdbe283dbc1e7d30649a1a5371b2a2a9150db192446f645789/aiohttp-3.10.11-cp310-cp310-win_amd64.whl", hash = "sha256:778cbd01f18ff78b5dd23c77eb82987ee4ba23408cbed233009fd570dda7e674", size = 382169, upload-time = "2024-11-13T16:37:12.603Z" }, + { url = "https://files.pythonhosted.org/packages/73/96/221ec59bc38395a6c205cbe8bf72c114ce92694b58abc8c3c6b7250efa7f/aiohttp-3.10.11-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:80ff08556c7f59a7972b1e8919f62e9c069c33566a6d28586771711e0eea4f07", size = 587742, upload-time = "2024-11-13T16:37:14.469Z" }, + { url = "https://files.pythonhosted.org/packages/24/17/4e606c969b19de5c31a09b946bd4c37e30c5288ca91d4790aa915518846e/aiohttp-3.10.11-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:2c8f96e9ee19f04c4914e4e7a42a60861066d3e1abf05c726f38d9d0a466e695", size = 400357, upload-time = "2024-11-13T16:37:16.482Z" }, + { url = "https://files.pythonhosted.org/packages/a2/e5/433f59b87ba69736e446824710dd7f26fcd05b24c6647cb1e76554ea5d02/aiohttp-3.10.11-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:fb8601394d537da9221947b5d6e62b064c9a43e88a1ecd7414d21a1a6fba9c24", size = 392099, upload-time = "2024-11-13T16:37:20.013Z" }, + { url = "https://files.pythonhosted.org/packages/d2/a3/3be340f5063970bb9e47f065ee8151edab639d9c2dce0d9605a325ab035d/aiohttp-3.10.11-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2ea224cf7bc2d8856d6971cea73b1d50c9c51d36971faf1abc169a0d5f85a382", size = 1300367, upload-time = "2024-11-13T16:37:22.645Z" }, + { url = "https://files.pythonhosted.org/packages/ba/7d/a3043918466cbee9429792ebe795f92f70eeb40aee4ccbca14c38ee8fa4d/aiohttp-3.10.11-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:db9503f79e12d5d80b3efd4d01312853565c05367493379df76d2674af881caa", size = 1339448, upload-time = "2024-11-13T16:37:24.834Z" }, + { url = "https://files.pythonhosted.org/packages/2c/60/192b378bd9d1ae67716b71ae63c3e97c48b134aad7675915a10853a0b7de/aiohttp-3.10.11-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:0f449a50cc33f0384f633894d8d3cd020e3ccef81879c6e6245c3c375c448625", size = 1374875, upload-time = "2024-11-13T16:37:26.799Z" }, + { url = "https://files.pythonhosted.org/packages/e0/d7/cd58bd17f5277d9cc32ecdbb0481ca02c52fc066412de413aa01268dc9b4/aiohttp-3.10.11-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:82052be3e6d9e0c123499127782a01a2b224b8af8c62ab46b3f6197035ad94e9", size = 1285626, upload-time = "2024-11-13T16:37:29.02Z" }, + { url = "https://files.pythonhosted.org/packages/bb/b2/da4953643b7dcdcd29cc99f98209f3653bf02023d95ce8a8fd57ffba0f15/aiohttp-3.10.11-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:20063c7acf1eec550c8eb098deb5ed9e1bb0521613b03bb93644b810986027ac", size = 1246120, upload-time = "2024-11-13T16:37:31.268Z" }, + { url = "https://files.pythonhosted.org/packages/6c/22/1217b3c773055f0cb172e3b7108274a74c0fe9900c716362727303931cbb/aiohttp-3.10.11-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:489cced07a4c11488f47aab1f00d0c572506883f877af100a38f1fedaa884c3a", size = 1265177, upload-time = "2024-11-13T16:37:33.348Z" }, + { url = "https://files.pythonhosted.org/packages/63/5e/3827ad7e61544ed1e73e4fdea7bb87ea35ac59a362d7eb301feb5e859780/aiohttp-3.10.11-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:ea9b3bab329aeaa603ed3bf605f1e2a6f36496ad7e0e1aa42025f368ee2dc07b", size = 1257238, upload-time = "2024-11-13T16:37:35.753Z" }, + { url = "https://files.pythonhosted.org/packages/53/31/951f78751d403da6086b662760e6e8b08201b0dcf5357969f48261b4d0e1/aiohttp-3.10.11-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:ca117819d8ad113413016cb29774b3f6d99ad23c220069789fc050267b786c16", size = 1315944, upload-time = "2024-11-13T16:37:38.317Z" }, + { url = "https://files.pythonhosted.org/packages/0d/79/06ef7a2a69880649261818b135b245de5a4e89fed5a6987c8645428563fc/aiohttp-3.10.11-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:2dfb612dcbe70fb7cdcf3499e8d483079b89749c857a8f6e80263b021745c730", size = 1332065, upload-time = "2024-11-13T16:37:40.725Z" }, + { url = "https://files.pythonhosted.org/packages/10/39/a273857c2d0bbf2152a4201fbf776931c2dac74aa399c6683ed4c286d1d1/aiohttp-3.10.11-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:f9b615d3da0d60e7d53c62e22b4fd1c70f4ae5993a44687b011ea3a2e49051b8", size = 1291882, upload-time = "2024-11-13T16:37:43.209Z" }, + { url = "https://files.pythonhosted.org/packages/49/39/7aa387f88403febc96e0494101763afaa14d342109329a01b413b2bac075/aiohttp-3.10.11-cp311-cp311-win32.whl", hash = "sha256:29103f9099b6068bbdf44d6a3d090e0a0b2be6d3c9f16a070dd9d0d910ec08f9", size = 363409, upload-time = "2024-11-13T16:37:45.143Z" }, + { url = "https://files.pythonhosted.org/packages/6f/e9/8eb3dc095ce48499d867ad461d02f1491686b79ad92e4fad4df582f6be7b/aiohttp-3.10.11-cp311-cp311-win_amd64.whl", hash = "sha256:236b28ceb79532da85d59aa9b9bf873b364e27a0acb2ceaba475dc61cffb6f3f", size = 382644, upload-time = "2024-11-13T16:37:47.685Z" }, + { url = "https://files.pythonhosted.org/packages/01/16/077057ef3bd684dbf9a8273a5299e182a8d07b4b252503712ff8b5364fd1/aiohttp-3.10.11-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:7480519f70e32bfb101d71fb9a1f330fbd291655a4c1c922232a48c458c52710", size = 584830, upload-time = "2024-11-13T16:37:49.608Z" }, + { url = "https://files.pythonhosted.org/packages/2c/cf/348b93deb9597c61a51b6682e81f7c7d79290249e886022ef0705d858d90/aiohttp-3.10.11-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:f65267266c9aeb2287a6622ee2bb39490292552f9fbf851baabc04c9f84e048d", size = 397090, upload-time = "2024-11-13T16:37:51.539Z" }, + { url = "https://files.pythonhosted.org/packages/70/bf/903df5cd739dfaf5b827b3d8c9d68ff4fcea16a0ca1aeb948c9da30f56c8/aiohttp-3.10.11-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:7400a93d629a0608dc1d6c55f1e3d6e07f7375745aaa8bd7f085571e4d1cee97", size = 392361, upload-time = "2024-11-13T16:37:53.586Z" }, + { url = "https://files.pythonhosted.org/packages/fb/97/e4792675448a2ac5bd56f377a095233b805dd1315235c940c8ba5624e3cb/aiohttp-3.10.11-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f34b97e4b11b8d4eb2c3a4f975be626cc8af99ff479da7de49ac2c6d02d35725", size = 1309839, upload-time = "2024-11-13T16:37:55.68Z" }, + { url = "https://files.pythonhosted.org/packages/96/d0/ba19b1260da6fbbda4d5b1550d8a53ba3518868f2c143d672aedfdbc6172/aiohttp-3.10.11-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1e7b825da878464a252ccff2958838f9caa82f32a8dbc334eb9b34a026e2c636", size = 1348116, upload-time = "2024-11-13T16:37:58.232Z" }, + { url = "https://files.pythonhosted.org/packages/b3/b9/15100ee7113a2638bfdc91aecc54641609a92a7ce4fe533ebeaa8d43ff93/aiohttp-3.10.11-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f9f92a344c50b9667827da308473005f34767b6a2a60d9acff56ae94f895f385", size = 1391402, upload-time = "2024-11-13T16:38:00.522Z" }, + { url = "https://files.pythonhosted.org/packages/c5/36/831522618ac0dcd0b28f327afd18df7fb6bbf3eaf302f912a40e87714846/aiohttp-3.10.11-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bc6f1ab987a27b83c5268a17218463c2ec08dbb754195113867a27b166cd6087", size = 1304239, upload-time = "2024-11-13T16:38:04.195Z" }, + { url = "https://files.pythonhosted.org/packages/60/9f/b7230d0c48b076500ae57adb717aa0656432acd3d8febb1183dedfaa4e75/aiohttp-3.10.11-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1dc0f4ca54842173d03322793ebcf2c8cc2d34ae91cc762478e295d8e361e03f", size = 1256565, upload-time = "2024-11-13T16:38:07.218Z" }, + { url = "https://files.pythonhosted.org/packages/63/c2/35c7b4699f4830b3b0a5c3d5619df16dca8052ae8b488e66065902d559f6/aiohttp-3.10.11-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:7ce6a51469bfaacff146e59e7fb61c9c23006495d11cc24c514a455032bcfa03", size = 1269285, upload-time = "2024-11-13T16:38:09.396Z" }, + { url = "https://files.pythonhosted.org/packages/51/48/bc20ea753909bdeb09f9065260aefa7453e3a57f6a51f56f5216adc1a5e7/aiohttp-3.10.11-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:aad3cd91d484d065ede16f3cf15408254e2469e3f613b241a1db552c5eb7ab7d", size = 1276716, upload-time = "2024-11-13T16:38:12.039Z" }, + { url = "https://files.pythonhosted.org/packages/0c/7b/a8708616b3810f55ead66f8e189afa9474795760473aea734bbea536cd64/aiohttp-3.10.11-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:f4df4b8ca97f658c880fb4b90b1d1ec528315d4030af1ec763247ebfd33d8b9a", size = 1315023, upload-time = "2024-11-13T16:38:15.155Z" }, + { url = "https://files.pythonhosted.org/packages/2a/d6/dfe9134a921e05b01661a127a37b7d157db93428905450e32f9898eef27d/aiohttp-3.10.11-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:2e4e18a0a2d03531edbc06c366954e40a3f8d2a88d2b936bbe78a0c75a3aab3e", size = 1342735, upload-time = "2024-11-13T16:38:17.539Z" }, + { url = "https://files.pythonhosted.org/packages/ca/1a/3bd7f18e3909eabd57e5d17ecdbf5ea4c5828d91341e3676a07de7c76312/aiohttp-3.10.11-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:6ce66780fa1a20e45bc753cda2a149daa6dbf1561fc1289fa0c308391c7bc0a4", size = 1302618, upload-time = "2024-11-13T16:38:19.865Z" }, + { url = "https://files.pythonhosted.org/packages/cf/51/d063133781cda48cfdd1e11fc8ef45ab3912b446feba41556385b3ae5087/aiohttp-3.10.11-cp312-cp312-win32.whl", hash = "sha256:a919c8957695ea4c0e7a3e8d16494e3477b86f33067478f43106921c2fef15bb", size = 360497, upload-time = "2024-11-13T16:38:21.996Z" }, + { url = "https://files.pythonhosted.org/packages/55/4e/f29def9ed39826fe8f85955f2e42fe5cc0cbe3ebb53c97087f225368702e/aiohttp-3.10.11-cp312-cp312-win_amd64.whl", hash = "sha256:b5e29706e6389a2283a91611c91bf24f218962717c8f3b4e528ef529d112ee27", size = 380577, upload-time = "2024-11-13T16:38:24.247Z" }, + { url = "https://files.pythonhosted.org/packages/1f/63/654c185dfe3cf5d4a0d35b6ee49ee6ca91922c694eaa90732e1ba4b40ef1/aiohttp-3.10.11-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:703938e22434d7d14ec22f9f310559331f455018389222eed132808cd8f44127", size = 577381, upload-time = "2024-11-13T16:38:26.708Z" }, + { url = "https://files.pythonhosted.org/packages/4e/c4/ee9c350acb202ba2eb0c44b0f84376b05477e870444192a9f70e06844c28/aiohttp-3.10.11-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:9bc50b63648840854e00084c2b43035a62e033cb9b06d8c22b409d56eb098413", size = 393289, upload-time = "2024-11-13T16:38:29.207Z" }, + { url = "https://files.pythonhosted.org/packages/3d/7c/30d161a7e3b208cef1b922eacf2bbb8578b7e5a62266a6a2245a1dd044dc/aiohttp-3.10.11-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:5f0463bf8b0754bc744e1feb61590706823795041e63edf30118a6f0bf577461", size = 388859, upload-time = "2024-11-13T16:38:31.567Z" }, + { url = "https://files.pythonhosted.org/packages/79/10/8d050e04be447d3d39e5a4a910fa289d930120cebe1b893096bd3ee29063/aiohttp-3.10.11-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f6c6dec398ac5a87cb3a407b068e1106b20ef001c344e34154616183fe684288", size = 1280983, upload-time = "2024-11-13T16:38:33.738Z" }, + { url = "https://files.pythonhosted.org/packages/31/b3/977eca40afe643dcfa6b8d8bb9a93f4cba1d8ed1ead22c92056b08855c7a/aiohttp-3.10.11-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:bcaf2d79104d53d4dcf934f7ce76d3d155302d07dae24dff6c9fffd217568067", size = 1317132, upload-time = "2024-11-13T16:38:35.999Z" }, + { url = "https://files.pythonhosted.org/packages/1a/43/b5ee8e697ed0f96a2b3d80b3058fa7590cda508e9cd256274246ba1cf37a/aiohttp-3.10.11-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:25fd5470922091b5a9aeeb7e75be609e16b4fba81cdeaf12981393fb240dd10e", size = 1362630, upload-time = "2024-11-13T16:38:39.016Z" }, + { url = "https://files.pythonhosted.org/packages/28/20/3ae8e993b2990fa722987222dea74d6bac9331e2f530d086f309b4aa8847/aiohttp-3.10.11-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bbde2ca67230923a42161b1f408c3992ae6e0be782dca0c44cb3206bf330dee1", size = 1276865, upload-time = "2024-11-13T16:38:41.423Z" }, + { url = "https://files.pythonhosted.org/packages/02/08/1afb0ab7dcff63333b683e998e751aa2547d1ff897b577d2244b00e6fe38/aiohttp-3.10.11-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:249c8ff8d26a8b41a0f12f9df804e7c685ca35a207e2410adbd3e924217b9006", size = 1230448, upload-time = "2024-11-13T16:38:43.962Z" }, + { url = "https://files.pythonhosted.org/packages/c6/fd/ccd0ff842c62128d164ec09e3dd810208a84d79cd402358a3038ae91f3e9/aiohttp-3.10.11-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:878ca6a931ee8c486a8f7b432b65431d095c522cbeb34892bee5be97b3481d0f", size = 1244626, upload-time = "2024-11-13T16:38:47.089Z" }, + { url = "https://files.pythonhosted.org/packages/9f/75/30e9537ab41ed7cb062338d8df7c4afb0a715b3551cd69fc4ea61cfa5a95/aiohttp-3.10.11-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:8663f7777ce775f0413324be0d96d9730959b2ca73d9b7e2c2c90539139cbdd6", size = 1243608, upload-time = "2024-11-13T16:38:49.47Z" }, + { url = "https://files.pythonhosted.org/packages/c2/e0/3e7a62d99b9080793affddc12a82b11c9bc1312916ad849700d2bddf9786/aiohttp-3.10.11-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:6cd3f10b01f0c31481fba8d302b61603a2acb37b9d30e1d14e0f5a58b7b18a31", size = 1286158, upload-time = "2024-11-13T16:38:51.947Z" }, + { url = "https://files.pythonhosted.org/packages/71/b8/df67886802e71e976996ed9324eb7dc379e53a7d972314e9c7fe3f6ac6bc/aiohttp-3.10.11-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:4e8d8aad9402d3aa02fdc5ca2fe68bcb9fdfe1f77b40b10410a94c7f408b664d", size = 1313636, upload-time = "2024-11-13T16:38:54.424Z" }, + { url = "https://files.pythonhosted.org/packages/3c/3b/aea9c3e70ff4e030f46902df28b4cdf486695f4d78fd9c6698827e2bafab/aiohttp-3.10.11-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:38e3c4f80196b4f6c3a85d134a534a56f52da9cb8d8e7af1b79a32eefee73a00", size = 1273772, upload-time = "2024-11-13T16:38:56.846Z" }, + { url = "https://files.pythonhosted.org/packages/e9/9e/4b4c5705270d1c4ee146516ad288af720798d957ba46504aaf99b86e85d9/aiohttp-3.10.11-cp313-cp313-win32.whl", hash = "sha256:fc31820cfc3b2863c6e95e14fcf815dc7afe52480b4dc03393c4873bb5599f71", size = 358679, upload-time = "2024-11-13T16:38:59.787Z" }, + { url = "https://files.pythonhosted.org/packages/28/1d/18ef37549901db94717d4389eb7be807acbfbdeab48a73ff2993fc909118/aiohttp-3.10.11-cp313-cp313-win_amd64.whl", hash = "sha256:4996ff1345704ffdd6d75fb06ed175938c133425af616142e7187f28dc75f14e", size = 378073, upload-time = "2024-11-13T16:39:02.065Z" }, + { url = "https://files.pythonhosted.org/packages/dd/f2/59165bee7bba0b0634525834c622f152a30715a1d8280f6291a0cb86b1e6/aiohttp-3.10.11-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:74baf1a7d948b3d640badeac333af581a367ab916b37e44cf90a0334157cdfd2", size = 592135, upload-time = "2024-11-13T16:39:04.774Z" }, + { url = "https://files.pythonhosted.org/packages/2e/0e/b3555c504745af66efbf89d16811148ff12932b86fad529d115538fe2739/aiohttp-3.10.11-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:473aebc3b871646e1940c05268d451f2543a1d209f47035b594b9d4e91ce8339", size = 402913, upload-time = "2024-11-13T16:39:08.065Z" }, + { url = "https://files.pythonhosted.org/packages/31/bb/2890a3c77126758ef58536ca9f7476a12ba2021e0cd074108fb99b8c8747/aiohttp-3.10.11-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:c2f746a6968c54ab2186574e15c3f14f3e7f67aef12b761e043b33b89c5b5f95", size = 394013, upload-time = "2024-11-13T16:39:10.638Z" }, + { url = "https://files.pythonhosted.org/packages/74/82/0ab5199b473558846d72901a714b6afeb6f6a6a6a4c3c629e2c107418afd/aiohttp-3.10.11-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d110cabad8360ffa0dec8f6ec60e43286e9d251e77db4763a87dcfe55b4adb92", size = 1255578, upload-time = "2024-11-13T16:39:13.14Z" }, + { url = "https://files.pythonhosted.org/packages/f8/b2/f232477dd3c0e95693a903c4815bfb8d831f6a1a67e27ad14d30a774eeda/aiohttp-3.10.11-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e0099c7d5d7afff4202a0c670e5b723f7718810000b4abcbc96b064129e64bc7", size = 1298780, upload-time = "2024-11-13T16:39:15.721Z" }, + { url = "https://files.pythonhosted.org/packages/34/8c/11972235a6b53d5b69098f2ee6629ff8f99cd9592dcaa620c7868deb5673/aiohttp-3.10.11-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:0316e624b754dbbf8c872b62fe6dcb395ef20c70e59890dfa0de9eafccd2849d", size = 1336093, upload-time = "2024-11-13T16:39:19.11Z" }, + { url = "https://files.pythonhosted.org/packages/03/be/7ad9a6cd2312221cf7b6837d8e2d8e4660fbd4f9f15bccf79ef857f41f4d/aiohttp-3.10.11-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5a5f7ab8baf13314e6b2485965cbacb94afff1e93466ac4d06a47a81c50f9cca", size = 1250296, upload-time = "2024-11-13T16:39:22.363Z" }, + { url = "https://files.pythonhosted.org/packages/bb/8d/a3885a582d9fc481bccb155d082f83a7a846942e36e4a4bba061e3d6b95e/aiohttp-3.10.11-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c891011e76041e6508cbfc469dd1a8ea09bc24e87e4c204e05f150c4c455a5fa", size = 1215020, upload-time = "2024-11-13T16:39:25.205Z" }, + { url = "https://files.pythonhosted.org/packages/bb/e7/09a1736b7264316dc3738492d9b559f2a54b985660f21d76095c9890a62e/aiohttp-3.10.11-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:9208299251370ee815473270c52cd3f7069ee9ed348d941d574d1457d2c73e8b", size = 1210591, upload-time = "2024-11-13T16:39:28.311Z" }, + { url = "https://files.pythonhosted.org/packages/58/b1/ee684631f6af98065d49ac8416db7a8e74ea33e1378bc75952ab0522342f/aiohttp-3.10.11-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:459f0f32c8356e8125f45eeff0ecf2b1cb6db1551304972702f34cd9e6c44658", size = 1211255, upload-time = "2024-11-13T16:39:30.799Z" }, + { url = "https://files.pythonhosted.org/packages/8f/55/e21e312fd6c581f244dd2ed077ccb784aade07c19416a6316b1453f02c4e/aiohttp-3.10.11-cp38-cp38-musllinux_1_2_ppc64le.whl", hash = "sha256:14cdc8c1810bbd4b4b9f142eeee23cda528ae4e57ea0923551a9af4820980e39", size = 1278114, upload-time = "2024-11-13T16:39:34.141Z" }, + { url = "https://files.pythonhosted.org/packages/d8/7f/ff6df0e90df6759693f52720ebedbfa10982d97aa1fd02c6ca917a6399ea/aiohttp-3.10.11-cp38-cp38-musllinux_1_2_s390x.whl", hash = "sha256:971aa438a29701d4b34e4943e91b5e984c3ae6ccbf80dd9efaffb01bd0b243a9", size = 1292714, upload-time = "2024-11-13T16:39:37.216Z" }, + { url = "https://files.pythonhosted.org/packages/3a/45/63f35367dfffae41e7abd0603f92708b5b3655fda55c08388ac2c7fb127b/aiohttp-3.10.11-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:9a309c5de392dfe0f32ee57fa43ed8fc6ddf9985425e84bd51ed66bb16bce3a7", size = 1233734, upload-time = "2024-11-13T16:39:40.599Z" }, + { url = "https://files.pythonhosted.org/packages/ec/ee/74b0696c0e84e06c43beab9302f353d97dc9f0cccd7ccf3ee648411b849b/aiohttp-3.10.11-cp38-cp38-win32.whl", hash = "sha256:9ec1628180241d906a0840b38f162a3215114b14541f1a8711c368a8739a9be4", size = 365350, upload-time = "2024-11-13T16:39:43.852Z" }, + { url = "https://files.pythonhosted.org/packages/21/0c/74c895688db09a2852056abf32d128991ec2fb41e5f57a1fe0928e15151c/aiohttp-3.10.11-cp38-cp38-win_amd64.whl", hash = "sha256:9c6e0ffd52c929f985c7258f83185d17c76d4275ad22e90aa29f38e211aacbec", size = 384542, upload-time = "2024-11-13T16:39:47.093Z" }, + { url = "https://files.pythonhosted.org/packages/cc/df/aa0d1548db818395a372b5f90e62072677ce786d6b19680c49dd4da3825f/aiohttp-3.10.11-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:cdc493a2e5d8dc79b2df5bec9558425bcd39aff59fc949810cbd0832e294b106", size = 589833, upload-time = "2024-11-13T16:39:49.72Z" }, + { url = "https://files.pythonhosted.org/packages/75/7c/d11145784b3fa29c0421a3883a4b91ee8c19acb40332b1d2e39f47be4e5b/aiohttp-3.10.11-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:b3e70f24e7d0405be2348da9d5a7836936bf3a9b4fd210f8c37e8d48bc32eca6", size = 401685, upload-time = "2024-11-13T16:39:52.263Z" }, + { url = "https://files.pythonhosted.org/packages/e2/67/1b5f93babeb060cb683d23104b243be1d6299fe6cd807dcb56cf67d2e62c/aiohttp-3.10.11-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:968b8fb2a5eee2770eda9c7b5581587ef9b96fbdf8dcabc6b446d35ccc69df01", size = 392957, upload-time = "2024-11-13T16:39:54.668Z" }, + { url = "https://files.pythonhosted.org/packages/e1/4d/441df53aafd8dd97b8cfe9e467c641fa19cb5113e7601a7f77f2124518e0/aiohttp-3.10.11-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:deef4362af9493d1382ef86732ee2e4cbc0d7c005947bd54ad1a9a16dd59298e", size = 1229754, upload-time = "2024-11-13T16:39:57.166Z" }, + { url = "https://files.pythonhosted.org/packages/4d/cc/f1397a2501b95cb94580de7051395e85af95a1e27aed1f8af73459ddfa22/aiohttp-3.10.11-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:686b03196976e327412a1b094f4120778c7c4b9cff9bce8d2fdfeca386b89829", size = 1266246, upload-time = "2024-11-13T16:40:00.723Z" }, + { url = "https://files.pythonhosted.org/packages/c2/b5/7d33dae7630b4e9f90d634c6a90cb0923797e011b71cd9b10fe685aec3f6/aiohttp-3.10.11-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3bf6d027d9d1d34e1c2e1645f18a6498c98d634f8e373395221121f1c258ace8", size = 1301720, upload-time = "2024-11-13T16:40:04.111Z" }, + { url = "https://files.pythonhosted.org/packages/51/36/f917bcc63bc489aa3f534fa81efbf895fa5286745dcd8bbd0eb9dbc923a1/aiohttp-3.10.11-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:099fd126bf960f96d34a760e747a629c27fb3634da5d05c7ef4d35ef4ea519fc", size = 1221527, upload-time = "2024-11-13T16:40:06.851Z" }, + { url = "https://files.pythonhosted.org/packages/32/c2/1a303a072b4763d99d4b0664a3a8b952869e3fbb660d4239826bd0c56cc1/aiohttp-3.10.11-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c73c4d3dae0b4644bc21e3de546530531d6cdc88659cdeb6579cd627d3c206aa", size = 1192309, upload-time = "2024-11-13T16:40:09.65Z" }, + { url = "https://files.pythonhosted.org/packages/62/ef/d62f705dc665382b78ef171e5ba2616c395220ac7c1f452f0d2dcad3f9f5/aiohttp-3.10.11-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:0c5580f3c51eea91559db3facd45d72e7ec970b04528b4709b1f9c2555bd6d0b", size = 1189481, upload-time = "2024-11-13T16:40:12.77Z" }, + { url = "https://files.pythonhosted.org/packages/40/22/3e3eb4f97e5c4f52ccd198512b583c0c9135aa4e989c7ade97023c4cd282/aiohttp-3.10.11-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:fdf6429f0caabfd8a30c4e2eaecb547b3c340e4730ebfe25139779b9815ba138", size = 1187877, upload-time = "2024-11-13T16:40:15.985Z" }, + { url = "https://files.pythonhosted.org/packages/b5/73/77475777fbe2b3efaceb49db2859f1a22c96fd5869d736e80375db05bbf4/aiohttp-3.10.11-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:d97187de3c276263db3564bb9d9fad9e15b51ea10a371ffa5947a5ba93ad6777", size = 1246006, upload-time = "2024-11-13T16:40:19.17Z" }, + { url = "https://files.pythonhosted.org/packages/ef/f7/5b060d19065473da91838b63d8fd4d20ef8426a7d905cc8f9cd11eabd780/aiohttp-3.10.11-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:0acafb350cfb2eba70eb5d271f55e08bd4502ec35e964e18ad3e7d34d71f7261", size = 1260403, upload-time = "2024-11-13T16:40:21.761Z" }, + { url = "https://files.pythonhosted.org/packages/6c/ea/e9ad224815cd83c8dfda686d2bafa2cab5b93d7232e09470a8d2a158acde/aiohttp-3.10.11-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:c13ed0c779911c7998a58e7848954bd4d63df3e3575f591e321b19a2aec8df9f", size = 1208643, upload-time = "2024-11-13T16:40:24.803Z" }, + { url = "https://files.pythonhosted.org/packages/ba/c1/e1c6bba72f379adbd52958601a8642546ed0807964afba3b1b5b8cfb1bc0/aiohttp-3.10.11-cp39-cp39-win32.whl", hash = "sha256:22b7c540c55909140f63ab4f54ec2c20d2635c0289cdd8006da46f3327f971b9", size = 364419, upload-time = "2024-11-13T16:40:27.817Z" }, + { url = "https://files.pythonhosted.org/packages/30/24/50862e06e86cd263c60661e00b9d2c8d7fdece4fe95454ed5aa21ecf8036/aiohttp-3.10.11-cp39-cp39-win_amd64.whl", hash = "sha256:7b26b1551e481012575dab8e3727b16fe7dd27eb2711d2e63ced7368756268fb", size = 382857, upload-time = "2024-11-13T16:40:30.427Z" }, +] + +[[package]] +name = "aiohttp" +version = "3.13.2" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version >= '3.14'", + "python_full_version >= '3.11' and python_full_version < '3.14'", + "python_full_version == '3.10.*'", + "python_full_version == '3.9.*'", +] +dependencies = [ + { name = "aiohappyeyeballs", version = "2.6.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.9'" }, + { name = "aiosignal", version = "1.4.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.9'" }, + { name = "async-timeout", marker = "python_full_version >= '3.9' and python_full_version < '3.11'" }, + { name = "attrs", version = "25.4.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.9'" }, + { name = "frozenlist", version = "1.8.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.9'" }, + { name = "multidict", version = "6.7.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.9'" }, + { name = "propcache", version = "0.4.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.9'" }, + { name = "yarl", version = "1.22.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.9'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/1c/ce/3b83ebba6b3207a7135e5fcaba49706f8a4b6008153b4e30540c982fae26/aiohttp-3.13.2.tar.gz", hash = "sha256:40176a52c186aefef6eb3cad2cdd30cd06e3afbe88fe8ab2af9c0b90f228daca", size = 7837994, upload-time = "2025-10-28T20:59:39.937Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/6d/34/939730e66b716b76046dedfe0842995842fa906ccc4964bba414ff69e429/aiohttp-3.13.2-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:2372b15a5f62ed37789a6b383ff7344fc5b9f243999b0cd9b629d8bc5f5b4155", size = 736471, upload-time = "2025-10-28T20:55:27.924Z" }, + { url = "https://files.pythonhosted.org/packages/fd/cf/dcbdf2df7f6ca72b0bb4c0b4509701f2d8942cf54e29ca197389c214c07f/aiohttp-3.13.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:e7f8659a48995edee7229522984bd1009c1213929c769c2daa80b40fe49a180c", size = 493985, upload-time = "2025-10-28T20:55:29.456Z" }, + { url = "https://files.pythonhosted.org/packages/9d/87/71c8867e0a1d0882dcbc94af767784c3cb381c1c4db0943ab4aae4fed65e/aiohttp-3.13.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:939ced4a7add92296b0ad38892ce62b98c619288a081170695c6babe4f50e636", size = 489274, upload-time = "2025-10-28T20:55:31.134Z" }, + { url = "https://files.pythonhosted.org/packages/38/0f/46c24e8dae237295eaadd113edd56dee96ef6462adf19b88592d44891dc5/aiohttp-3.13.2-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6315fb6977f1d0dd41a107c527fee2ed5ab0550b7d885bc15fee20ccb17891da", size = 1668171, upload-time = "2025-10-28T20:55:36.065Z" }, + { url = "https://files.pythonhosted.org/packages/eb/c6/4cdfb4440d0e28483681a48f69841fa5e39366347d66ef808cbdadddb20e/aiohttp-3.13.2-cp310-cp310-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:6e7352512f763f760baaed2637055c49134fd1d35b37c2dedfac35bfe5cf8725", size = 1636036, upload-time = "2025-10-28T20:55:37.576Z" }, + { url = "https://files.pythonhosted.org/packages/84/37/8708cf678628216fb678ab327a4e1711c576d6673998f4f43e86e9ae90dd/aiohttp-3.13.2-cp310-cp310-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:e09a0a06348a2dd73e7213353c90d709502d9786219f69b731f6caa0efeb46f5", size = 1727975, upload-time = "2025-10-28T20:55:39.457Z" }, + { url = "https://files.pythonhosted.org/packages/e6/2e/3ebfe12fdcb9b5f66e8a0a42dffcd7636844c8a018f261efb2419f68220b/aiohttp-3.13.2-cp310-cp310-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:a09a6d073fb5789456545bdee2474d14395792faa0527887f2f4ec1a486a59d3", size = 1815823, upload-time = "2025-10-28T20:55:40.958Z" }, + { url = "https://files.pythonhosted.org/packages/a1/4f/ca2ef819488cbb41844c6cf92ca6dd15b9441e6207c58e5ae0e0fc8d70ad/aiohttp-3.13.2-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:b59d13c443f8e049d9e94099c7e412e34610f1f49be0f230ec656a10692a5802", size = 1669374, upload-time = "2025-10-28T20:55:42.745Z" }, + { url = "https://files.pythonhosted.org/packages/f8/fe/1fe2e1179a0d91ce09c99069684aab619bf2ccde9b20bd6ca44f8837203e/aiohttp-3.13.2-cp310-cp310-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:20db2d67985d71ca033443a1ba2001c4b5693fe09b0e29f6d9358a99d4d62a8a", size = 1555315, upload-time = "2025-10-28T20:55:44.264Z" }, + { url = "https://files.pythonhosted.org/packages/5a/2b/f3781899b81c45d7cbc7140cddb8a3481c195e7cbff8e36374759d2ab5a5/aiohttp-3.13.2-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:960c2fc686ba27b535f9fd2b52d87ecd7e4fd1cf877f6a5cba8afb5b4a8bd204", size = 1639140, upload-time = "2025-10-28T20:55:46.626Z" }, + { url = "https://files.pythonhosted.org/packages/72/27/c37e85cd3ece6f6c772e549bd5a253d0c122557b25855fb274224811e4f2/aiohttp-3.13.2-cp310-cp310-musllinux_1_2_armv7l.whl", hash = "sha256:6c00dbcf5f0d88796151e264a8eab23de2997c9303dd7c0bf622e23b24d3ce22", size = 1645496, upload-time = "2025-10-28T20:55:48.933Z" }, + { url = "https://files.pythonhosted.org/packages/66/20/3af1ab663151bd3780b123e907761cdb86ec2c4e44b2d9b195ebc91fbe37/aiohttp-3.13.2-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:fed38a5edb7945f4d1bcabe2fcd05db4f6ec7e0e82560088b754f7e08d93772d", size = 1697625, upload-time = "2025-10-28T20:55:50.377Z" }, + { url = "https://files.pythonhosted.org/packages/95/eb/ae5cab15efa365e13d56b31b0d085a62600298bf398a7986f8388f73b598/aiohttp-3.13.2-cp310-cp310-musllinux_1_2_riscv64.whl", hash = "sha256:b395bbca716c38bef3c764f187860e88c724b342c26275bc03e906142fc5964f", size = 1542025, upload-time = "2025-10-28T20:55:51.861Z" }, + { url = "https://files.pythonhosted.org/packages/e9/2d/1683e8d67ec72d911397fe4e575688d2a9b8f6a6e03c8fdc9f3fd3d4c03f/aiohttp-3.13.2-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:204ffff2426c25dfda401ba08da85f9c59525cdc42bda26660463dd1cbcfec6f", size = 1714918, upload-time = "2025-10-28T20:55:53.515Z" }, + { url = "https://files.pythonhosted.org/packages/99/a2/ffe8e0e1c57c5e542d47ffa1fcf95ef2b3ea573bf7c4d2ee877252431efc/aiohttp-3.13.2-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:05c4dd3c48fb5f15db31f57eb35374cb0c09afdde532e7fb70a75aede0ed30f6", size = 1656113, upload-time = "2025-10-28T20:55:55.438Z" }, + { url = "https://files.pythonhosted.org/packages/0d/42/d511aff5c3a2b06c09d7d214f508a4ad8ac7799817f7c3d23e7336b5e896/aiohttp-3.13.2-cp310-cp310-win32.whl", hash = "sha256:e574a7d61cf10351d734bcddabbe15ede0eaa8a02070d85446875dc11189a251", size = 432290, upload-time = "2025-10-28T20:55:56.96Z" }, + { url = "https://files.pythonhosted.org/packages/8b/ea/1c2eb7098b5bad4532994f2b7a8228d27674035c9b3234fe02c37469ef14/aiohttp-3.13.2-cp310-cp310-win_amd64.whl", hash = "sha256:364f55663085d658b8462a1c3f17b2b84a5c2e1ba858e1b79bff7b2e24ad1514", size = 455075, upload-time = "2025-10-28T20:55:58.373Z" }, + { url = "https://files.pythonhosted.org/packages/35/74/b321e7d7ca762638cdf8cdeceb39755d9c745aff7a64c8789be96ddf6e96/aiohttp-3.13.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:4647d02df098f6434bafd7f32ad14942f05a9caa06c7016fdcc816f343997dd0", size = 743409, upload-time = "2025-10-28T20:56:00.354Z" }, + { url = "https://files.pythonhosted.org/packages/99/3d/91524b905ec473beaf35158d17f82ef5a38033e5809fe8742e3657cdbb97/aiohttp-3.13.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:e3403f24bcb9c3b29113611c3c16a2a447c3953ecf86b79775e7be06f7ae7ccb", size = 497006, upload-time = "2025-10-28T20:56:01.85Z" }, + { url = "https://files.pythonhosted.org/packages/eb/d3/7f68bc02a67716fe80f063e19adbd80a642e30682ce74071269e17d2dba1/aiohttp-3.13.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:43dff14e35aba17e3d6d5ba628858fb8cb51e30f44724a2d2f0c75be492c55e9", size = 493195, upload-time = "2025-10-28T20:56:03.314Z" }, + { url = "https://files.pythonhosted.org/packages/98/31/913f774a4708775433b7375c4f867d58ba58ead833af96c8af3621a0d243/aiohttp-3.13.2-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:e2a9ea08e8c58bb17655630198833109227dea914cd20be660f52215f6de5613", size = 1747759, upload-time = "2025-10-28T20:56:04.904Z" }, + { url = "https://files.pythonhosted.org/packages/e8/63/04efe156f4326f31c7c4a97144f82132c3bb21859b7bb84748d452ccc17c/aiohttp-3.13.2-cp311-cp311-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:53b07472f235eb80e826ad038c9d106c2f653584753f3ddab907c83f49eedead", size = 1704456, upload-time = "2025-10-28T20:56:06.986Z" }, + { url = "https://files.pythonhosted.org/packages/8e/02/4e16154d8e0a9cf4ae76f692941fd52543bbb148f02f098ca73cab9b1c1b/aiohttp-3.13.2-cp311-cp311-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:e736c93e9c274fce6419af4aac199984d866e55f8a4cec9114671d0ea9688780", size = 1807572, upload-time = "2025-10-28T20:56:08.558Z" }, + { url = "https://files.pythonhosted.org/packages/34/58/b0583defb38689e7f06798f0285b1ffb3a6fb371f38363ce5fd772112724/aiohttp-3.13.2-cp311-cp311-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:ff5e771f5dcbc81c64898c597a434f7682f2259e0cd666932a913d53d1341d1a", size = 1895954, upload-time = "2025-10-28T20:56:10.545Z" }, + { url = "https://files.pythonhosted.org/packages/6b/f3/083907ee3437425b4e376aa58b2c915eb1a33703ec0dc30040f7ae3368c6/aiohttp-3.13.2-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:a3b6fb0c207cc661fa0bf8c66d8d9b657331ccc814f4719468af61034b478592", size = 1747092, upload-time = "2025-10-28T20:56:12.118Z" }, + { url = "https://files.pythonhosted.org/packages/ac/61/98a47319b4e425cc134e05e5f3fc512bf9a04bf65aafd9fdcda5d57ec693/aiohttp-3.13.2-cp311-cp311-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:97a0895a8e840ab3520e2288db7cace3a1981300d48babeb50e7425609e2e0ab", size = 1606815, upload-time = "2025-10-28T20:56:14.191Z" }, + { url = "https://files.pythonhosted.org/packages/97/4b/e78b854d82f66bb974189135d31fce265dee0f5344f64dd0d345158a5973/aiohttp-3.13.2-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:9e8f8afb552297aca127c90cb840e9a1d4bfd6a10d7d8f2d9176e1acc69bad30", size = 1723789, upload-time = "2025-10-28T20:56:16.101Z" }, + { url = "https://files.pythonhosted.org/packages/ed/fc/9d2ccc794fc9b9acd1379d625c3a8c64a45508b5091c546dea273a41929e/aiohttp-3.13.2-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:ed2f9c7216e53c3df02264f25d824b079cc5914f9e2deba94155190ef648ee40", size = 1718104, upload-time = "2025-10-28T20:56:17.655Z" }, + { url = "https://files.pythonhosted.org/packages/66/65/34564b8765ea5c7d79d23c9113135d1dd3609173da13084830f1507d56cf/aiohttp-3.13.2-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:99c5280a329d5fa18ef30fd10c793a190d996567667908bef8a7f81f8202b948", size = 1785584, upload-time = "2025-10-28T20:56:19.238Z" }, + { url = "https://files.pythonhosted.org/packages/30/be/f6a7a426e02fc82781afd62016417b3948e2207426d90a0e478790d1c8a4/aiohttp-3.13.2-cp311-cp311-musllinux_1_2_riscv64.whl", hash = "sha256:2ca6ffef405fc9c09a746cb5d019c1672cd7f402542e379afc66b370833170cf", size = 1595126, upload-time = "2025-10-28T20:56:20.836Z" }, + { url = "https://files.pythonhosted.org/packages/e5/c7/8e22d5d28f94f67d2af496f14a83b3c155d915d1fe53d94b66d425ec5b42/aiohttp-3.13.2-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:47f438b1a28e926c37632bff3c44df7d27c9b57aaf4e34b1def3c07111fdb782", size = 1800665, upload-time = "2025-10-28T20:56:22.922Z" }, + { url = "https://files.pythonhosted.org/packages/d1/11/91133c8b68b1da9fc16555706aa7276fdf781ae2bb0876c838dd86b8116e/aiohttp-3.13.2-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:9acda8604a57bb60544e4646a4615c1866ee6c04a8edef9b8ee6fd1d8fa2ddc8", size = 1739532, upload-time = "2025-10-28T20:56:25.924Z" }, + { url = "https://files.pythonhosted.org/packages/17/6b/3747644d26a998774b21a616016620293ddefa4d63af6286f389aedac844/aiohttp-3.13.2-cp311-cp311-win32.whl", hash = "sha256:868e195e39b24aaa930b063c08bb0c17924899c16c672a28a65afded9c46c6ec", size = 431876, upload-time = "2025-10-28T20:56:27.524Z" }, + { url = "https://files.pythonhosted.org/packages/c3/63/688462108c1a00eb9f05765331c107f95ae86f6b197b865d29e930b7e462/aiohttp-3.13.2-cp311-cp311-win_amd64.whl", hash = "sha256:7fd19df530c292542636c2a9a85854fab93474396a52f1695e799186bbd7f24c", size = 456205, upload-time = "2025-10-28T20:56:29.062Z" }, + { url = "https://files.pythonhosted.org/packages/29/9b/01f00e9856d0a73260e86dd8ed0c2234a466c5c1712ce1c281548df39777/aiohttp-3.13.2-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:b1e56bab2e12b2b9ed300218c351ee2a3d8c8fdab5b1ec6193e11a817767e47b", size = 737623, upload-time = "2025-10-28T20:56:30.797Z" }, + { url = "https://files.pythonhosted.org/packages/5a/1b/4be39c445e2b2bd0aab4ba736deb649fabf14f6757f405f0c9685019b9e9/aiohttp-3.13.2-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:364e25edaabd3d37b1db1f0cbcee8c73c9a3727bfa262b83e5e4cf3489a2a9dc", size = 492664, upload-time = "2025-10-28T20:56:32.708Z" }, + { url = "https://files.pythonhosted.org/packages/28/66/d35dcfea8050e131cdd731dff36434390479b4045a8d0b9d7111b0a968f1/aiohttp-3.13.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:c5c94825f744694c4b8db20b71dba9a257cd2ba8e010a803042123f3a25d50d7", size = 491808, upload-time = "2025-10-28T20:56:34.57Z" }, + { url = "https://files.pythonhosted.org/packages/00/29/8e4609b93e10a853b65f8291e64985de66d4f5848c5637cddc70e98f01f8/aiohttp-3.13.2-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ba2715d842ffa787be87cbfce150d5e88c87a98e0b62e0f5aa489169a393dbbb", size = 1738863, upload-time = "2025-10-28T20:56:36.377Z" }, + { url = "https://files.pythonhosted.org/packages/9d/fa/4ebdf4adcc0def75ced1a0d2d227577cd7b1b85beb7edad85fcc87693c75/aiohttp-3.13.2-cp312-cp312-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:585542825c4bc662221fb257889e011a5aa00f1ae4d75d1d246a5225289183e3", size = 1700586, upload-time = "2025-10-28T20:56:38.034Z" }, + { url = "https://files.pythonhosted.org/packages/da/04/73f5f02ff348a3558763ff6abe99c223381b0bace05cd4530a0258e52597/aiohttp-3.13.2-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:39d02cb6025fe1aabca329c5632f48c9532a3dabccd859e7e2f110668972331f", size = 1768625, upload-time = "2025-10-28T20:56:39.75Z" }, + { url = "https://files.pythonhosted.org/packages/f8/49/a825b79ffec124317265ca7d2344a86bcffeb960743487cb11988ffb3494/aiohttp-3.13.2-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:e67446b19e014d37342f7195f592a2a948141d15a312fe0e700c2fd2f03124f6", size = 1867281, upload-time = "2025-10-28T20:56:41.471Z" }, + { url = "https://files.pythonhosted.org/packages/b9/48/adf56e05f81eac31edcfae45c90928f4ad50ef2e3ea72cb8376162a368f8/aiohttp-3.13.2-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:4356474ad6333e41ccefd39eae869ba15a6c5299c9c01dfdcfdd5c107be4363e", size = 1752431, upload-time = "2025-10-28T20:56:43.162Z" }, + { url = "https://files.pythonhosted.org/packages/30/ab/593855356eead019a74e862f21523db09c27f12fd24af72dbc3555b9bfd9/aiohttp-3.13.2-cp312-cp312-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:eeacf451c99b4525f700f078becff32c32ec327b10dcf31306a8a52d78166de7", size = 1562846, upload-time = "2025-10-28T20:56:44.85Z" }, + { url = "https://files.pythonhosted.org/packages/39/0f/9f3d32271aa8dc35036e9668e31870a9d3b9542dd6b3e2c8a30931cb27ae/aiohttp-3.13.2-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:d8a9b889aeabd7a4e9af0b7f4ab5ad94d42e7ff679aaec6d0db21e3b639ad58d", size = 1699606, upload-time = "2025-10-28T20:56:46.519Z" }, + { url = "https://files.pythonhosted.org/packages/2c/3c/52d2658c5699b6ef7692a3f7128b2d2d4d9775f2a68093f74bca06cf01e1/aiohttp-3.13.2-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:fa89cb11bc71a63b69568d5b8a25c3ca25b6d54c15f907ca1c130d72f320b76b", size = 1720663, upload-time = "2025-10-28T20:56:48.528Z" }, + { url = "https://files.pythonhosted.org/packages/9b/d4/8f8f3ff1fb7fb9e3f04fcad4e89d8a1cd8fc7d05de67e3de5b15b33008ff/aiohttp-3.13.2-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:8aa7c807df234f693fed0ecd507192fc97692e61fee5702cdc11155d2e5cadc8", size = 1737939, upload-time = "2025-10-28T20:56:50.77Z" }, + { url = "https://files.pythonhosted.org/packages/03/d3/ddd348f8a27a634daae39a1b8e291ff19c77867af438af844bf8b7e3231b/aiohttp-3.13.2-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:9eb3e33fdbe43f88c3c75fa608c25e7c47bbd80f48d012763cb67c47f39a7e16", size = 1555132, upload-time = "2025-10-28T20:56:52.568Z" }, + { url = "https://files.pythonhosted.org/packages/39/b8/46790692dc46218406f94374903ba47552f2f9f90dad554eed61bfb7b64c/aiohttp-3.13.2-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:9434bc0d80076138ea986833156c5a48c9c7a8abb0c96039ddbb4afc93184169", size = 1764802, upload-time = "2025-10-28T20:56:54.292Z" }, + { url = "https://files.pythonhosted.org/packages/ba/e4/19ce547b58ab2a385e5f0b8aa3db38674785085abcf79b6e0edd1632b12f/aiohttp-3.13.2-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:ff15c147b2ad66da1f2cbb0622313f2242d8e6e8f9b79b5206c84523a4473248", size = 1719512, upload-time = "2025-10-28T20:56:56.428Z" }, + { url = "https://files.pythonhosted.org/packages/70/30/6355a737fed29dcb6dfdd48682d5790cb5eab050f7b4e01f49b121d3acad/aiohttp-3.13.2-cp312-cp312-win32.whl", hash = "sha256:27e569eb9d9e95dbd55c0fc3ec3a9335defbf1d8bc1d20171a49f3c4c607b93e", size = 426690, upload-time = "2025-10-28T20:56:58.736Z" }, + { url = "https://files.pythonhosted.org/packages/0a/0d/b10ac09069973d112de6ef980c1f6bb31cb7dcd0bc363acbdad58f927873/aiohttp-3.13.2-cp312-cp312-win_amd64.whl", hash = "sha256:8709a0f05d59a71f33fd05c17fc11fcb8c30140506e13c2f5e8ee1b8964e1b45", size = 453465, upload-time = "2025-10-28T20:57:00.795Z" }, + { url = "https://files.pythonhosted.org/packages/bf/78/7e90ca79e5aa39f9694dcfd74f4720782d3c6828113bb1f3197f7e7c4a56/aiohttp-3.13.2-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:7519bdc7dfc1940d201651b52bf5e03f5503bda45ad6eacf64dda98be5b2b6be", size = 732139, upload-time = "2025-10-28T20:57:02.455Z" }, + { url = "https://files.pythonhosted.org/packages/db/ed/1f59215ab6853fbaa5c8495fa6cbc39edfc93553426152b75d82a5f32b76/aiohttp-3.13.2-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:088912a78b4d4f547a1f19c099d5a506df17eacec3c6f4375e2831ec1d995742", size = 490082, upload-time = "2025-10-28T20:57:04.784Z" }, + { url = "https://files.pythonhosted.org/packages/68/7b/fe0fe0f5e05e13629d893c760465173a15ad0039c0a5b0d0040995c8075e/aiohttp-3.13.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:5276807b9de9092af38ed23ce120539ab0ac955547b38563a9ba4f5b07b95293", size = 489035, upload-time = "2025-10-28T20:57:06.894Z" }, + { url = "https://files.pythonhosted.org/packages/d2/04/db5279e38471b7ac801d7d36a57d1230feeee130bbe2a74f72731b23c2b1/aiohttp-3.13.2-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:1237c1375eaef0db4dcd7c2559f42e8af7b87ea7d295b118c60c36a6e61cb811", size = 1720387, upload-time = "2025-10-28T20:57:08.685Z" }, + { url = "https://files.pythonhosted.org/packages/31/07/8ea4326bd7dae2bd59828f69d7fdc6e04523caa55e4a70f4a8725a7e4ed2/aiohttp-3.13.2-cp313-cp313-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:96581619c57419c3d7d78703d5b78c1e5e5fc0172d60f555bdebaced82ded19a", size = 1688314, upload-time = "2025-10-28T20:57:10.693Z" }, + { url = "https://files.pythonhosted.org/packages/48/ab/3d98007b5b87ffd519d065225438cc3b668b2f245572a8cb53da5dd2b1bc/aiohttp-3.13.2-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:a2713a95b47374169409d18103366de1050fe0ea73db358fc7a7acb2880422d4", size = 1756317, upload-time = "2025-10-28T20:57:12.563Z" }, + { url = "https://files.pythonhosted.org/packages/97/3d/801ca172b3d857fafb7b50c7c03f91b72b867a13abca982ed6b3081774ef/aiohttp-3.13.2-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:228a1cd556b3caca590e9511a89444925da87d35219a49ab5da0c36d2d943a6a", size = 1858539, upload-time = "2025-10-28T20:57:14.623Z" }, + { url = "https://files.pythonhosted.org/packages/f7/0d/4764669bdf47bd472899b3d3db91fffbe925c8e3038ec591a2fd2ad6a14d/aiohttp-3.13.2-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:ac6cde5fba8d7d8c6ac963dbb0256a9854e9fafff52fbcc58fdf819357892c3e", size = 1739597, upload-time = "2025-10-28T20:57:16.399Z" }, + { url = "https://files.pythonhosted.org/packages/c4/52/7bd3c6693da58ba16e657eb904a5b6decfc48ecd06e9ac098591653b1566/aiohttp-3.13.2-cp313-cp313-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:f2bef8237544f4e42878c61cef4e2839fee6346dc60f5739f876a9c50be7fcdb", size = 1555006, upload-time = "2025-10-28T20:57:18.288Z" }, + { url = "https://files.pythonhosted.org/packages/48/30/9586667acec5993b6f41d2ebcf96e97a1255a85f62f3c653110a5de4d346/aiohttp-3.13.2-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:16f15a4eac3bc2d76c45f7ebdd48a65d41b242eb6c31c2245463b40b34584ded", size = 1683220, upload-time = "2025-10-28T20:57:20.241Z" }, + { url = "https://files.pythonhosted.org/packages/71/01/3afe4c96854cfd7b30d78333852e8e851dceaec1c40fd00fec90c6402dd2/aiohttp-3.13.2-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:bb7fb776645af5cc58ab804c58d7eba545a97e047254a52ce89c157b5af6cd0b", size = 1712570, upload-time = "2025-10-28T20:57:22.253Z" }, + { url = "https://files.pythonhosted.org/packages/11/2c/22799d8e720f4697a9e66fd9c02479e40a49de3de2f0bbe7f9f78a987808/aiohttp-3.13.2-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:e1b4951125ec10c70802f2cb09736c895861cd39fd9dcb35107b4dc8ae6220b8", size = 1733407, upload-time = "2025-10-28T20:57:24.37Z" }, + { url = "https://files.pythonhosted.org/packages/34/cb/90f15dd029f07cebbd91f8238a8b363978b530cd128488085b5703683594/aiohttp-3.13.2-cp313-cp313-musllinux_1_2_riscv64.whl", hash = "sha256:550bf765101ae721ee1d37d8095f47b1f220650f85fe1af37a90ce75bab89d04", size = 1550093, upload-time = "2025-10-28T20:57:26.257Z" }, + { url = "https://files.pythonhosted.org/packages/69/46/12dce9be9d3303ecbf4d30ad45a7683dc63d90733c2d9fe512be6716cd40/aiohttp-3.13.2-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:fe91b87fc295973096251e2d25a811388e7d8adf3bd2b97ef6ae78bc4ac6c476", size = 1758084, upload-time = "2025-10-28T20:57:28.349Z" }, + { url = "https://files.pythonhosted.org/packages/f9/c8/0932b558da0c302ffd639fc6362a313b98fdf235dc417bc2493da8394df7/aiohttp-3.13.2-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:e0c8e31cfcc4592cb200160344b2fb6ae0f9e4effe06c644b5a125d4ae5ebe23", size = 1716987, upload-time = "2025-10-28T20:57:30.233Z" }, + { url = "https://files.pythonhosted.org/packages/5d/8b/f5bd1a75003daed099baec373aed678f2e9b34f2ad40d85baa1368556396/aiohttp-3.13.2-cp313-cp313-win32.whl", hash = "sha256:0740f31a60848d6edb296a0df827473eede90c689b8f9f2a4cdde74889eb2254", size = 425859, upload-time = "2025-10-28T20:57:32.105Z" }, + { url = "https://files.pythonhosted.org/packages/5d/28/a8a9fc6957b2cee8902414e41816b5ab5536ecf43c3b1843c10e82c559b2/aiohttp-3.13.2-cp313-cp313-win_amd64.whl", hash = "sha256:a88d13e7ca367394908f8a276b89d04a3652044612b9a408a0bb22a5ed976a1a", size = 452192, upload-time = "2025-10-28T20:57:34.166Z" }, + { url = "https://files.pythonhosted.org/packages/9b/36/e2abae1bd815f01c957cbf7be817b3043304e1c87bad526292a0410fdcf9/aiohttp-3.13.2-cp314-cp314-macosx_10_13_universal2.whl", hash = "sha256:2475391c29230e063ef53a66669b7b691c9bfc3f1426a0f7bcdf1216bdbac38b", size = 735234, upload-time = "2025-10-28T20:57:36.415Z" }, + { url = "https://files.pythonhosted.org/packages/ca/e3/1ee62dde9b335e4ed41db6bba02613295a0d5b41f74a783c142745a12763/aiohttp-3.13.2-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:f33c8748abef4d8717bb20e8fb1b3e07c6adacb7fd6beaae971a764cf5f30d61", size = 490733, upload-time = "2025-10-28T20:57:38.205Z" }, + { url = "https://files.pythonhosted.org/packages/1a/aa/7a451b1d6a04e8d15a362af3e9b897de71d86feac3babf8894545d08d537/aiohttp-3.13.2-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:ae32f24bbfb7dbb485a24b30b1149e2f200be94777232aeadba3eecece4d0aa4", size = 491303, upload-time = "2025-10-28T20:57:40.122Z" }, + { url = "https://files.pythonhosted.org/packages/57/1e/209958dbb9b01174870f6a7538cd1f3f28274fdbc88a750c238e2c456295/aiohttp-3.13.2-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:5d7f02042c1f009ffb70067326ef183a047425bb2ff3bc434ead4dd4a4a66a2b", size = 1717965, upload-time = "2025-10-28T20:57:42.28Z" }, + { url = "https://files.pythonhosted.org/packages/08/aa/6a01848d6432f241416bc4866cae8dc03f05a5a884d2311280f6a09c73d6/aiohttp-3.13.2-cp314-cp314-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:93655083005d71cd6c072cdab54c886e6570ad2c4592139c3fb967bfc19e4694", size = 1667221, upload-time = "2025-10-28T20:57:44.869Z" }, + { url = "https://files.pythonhosted.org/packages/87/4f/36c1992432d31bbc789fa0b93c768d2e9047ec8c7177e5cd84ea85155f36/aiohttp-3.13.2-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:0db1e24b852f5f664cd728db140cf11ea0e82450471232a394b3d1a540b0f906", size = 1757178, upload-time = "2025-10-28T20:57:47.216Z" }, + { url = "https://files.pythonhosted.org/packages/ac/b4/8e940dfb03b7e0f68a82b88fd182b9be0a65cb3f35612fe38c038c3112cf/aiohttp-3.13.2-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:b009194665bcd128e23eaddef362e745601afa4641930848af4c8559e88f18f9", size = 1838001, upload-time = "2025-10-28T20:57:49.337Z" }, + { url = "https://files.pythonhosted.org/packages/d7/ef/39f3448795499c440ab66084a9db7d20ca7662e94305f175a80f5b7e0072/aiohttp-3.13.2-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:c038a8fdc8103cd51dbd986ecdce141473ffd9775a7a8057a6ed9c3653478011", size = 1716325, upload-time = "2025-10-28T20:57:51.327Z" }, + { url = "https://files.pythonhosted.org/packages/d7/51/b311500ffc860b181c05d91c59a1313bdd05c82960fdd4035a15740d431e/aiohttp-3.13.2-cp314-cp314-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:66bac29b95a00db411cd758fea0e4b9bdba6d549dfe333f9a945430f5f2cc5a6", size = 1547978, upload-time = "2025-10-28T20:57:53.554Z" }, + { url = "https://files.pythonhosted.org/packages/31/64/b9d733296ef79815226dab8c586ff9e3df41c6aff2e16c06697b2d2e6775/aiohttp-3.13.2-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:4ebf9cfc9ba24a74cf0718f04aac2a3bbe745902cc7c5ebc55c0f3b5777ef213", size = 1682042, upload-time = "2025-10-28T20:57:55.617Z" }, + { url = "https://files.pythonhosted.org/packages/3f/30/43d3e0f9d6473a6db7d472104c4eff4417b1e9df01774cb930338806d36b/aiohttp-3.13.2-cp314-cp314-musllinux_1_2_armv7l.whl", hash = "sha256:a4b88ebe35ce54205c7074f7302bd08a4cb83256a3e0870c72d6f68a3aaf8e49", size = 1680085, upload-time = "2025-10-28T20:57:57.59Z" }, + { url = "https://files.pythonhosted.org/packages/16/51/c709f352c911b1864cfd1087577760ced64b3e5bee2aa88b8c0c8e2e4972/aiohttp-3.13.2-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:98c4fb90bb82b70a4ed79ca35f656f4281885be076f3f970ce315402b53099ae", size = 1728238, upload-time = "2025-10-28T20:57:59.525Z" }, + { url = "https://files.pythonhosted.org/packages/19/e2/19bd4c547092b773caeb48ff5ae4b1ae86756a0ee76c16727fcfd281404b/aiohttp-3.13.2-cp314-cp314-musllinux_1_2_riscv64.whl", hash = "sha256:ec7534e63ae0f3759df3a1ed4fa6bc8f75082a924b590619c0dd2f76d7043caa", size = 1544395, upload-time = "2025-10-28T20:58:01.914Z" }, + { url = "https://files.pythonhosted.org/packages/cf/87/860f2803b27dfc5ed7be532832a3498e4919da61299b4a1f8eb89b8ff44d/aiohttp-3.13.2-cp314-cp314-musllinux_1_2_s390x.whl", hash = "sha256:5b927cf9b935a13e33644cbed6c8c4b2d0f25b713d838743f8fe7191b33829c4", size = 1742965, upload-time = "2025-10-28T20:58:03.972Z" }, + { url = "https://files.pythonhosted.org/packages/67/7f/db2fc7618925e8c7a601094d5cbe539f732df4fb570740be88ed9e40e99a/aiohttp-3.13.2-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:88d6c017966a78c5265d996c19cdb79235be5e6412268d7e2ce7dee339471b7a", size = 1697585, upload-time = "2025-10-28T20:58:06.189Z" }, + { url = "https://files.pythonhosted.org/packages/0c/07/9127916cb09bb38284db5036036042b7b2c514c8ebaeee79da550c43a6d6/aiohttp-3.13.2-cp314-cp314-win32.whl", hash = "sha256:f7c183e786e299b5d6c49fb43a769f8eb8e04a2726a2bd5887b98b5cc2d67940", size = 431621, upload-time = "2025-10-28T20:58:08.636Z" }, + { url = "https://files.pythonhosted.org/packages/fb/41/554a8a380df6d3a2bba8a7726429a23f4ac62aaf38de43bb6d6cde7b4d4d/aiohttp-3.13.2-cp314-cp314-win_amd64.whl", hash = "sha256:fe242cd381e0fb65758faf5ad96c2e460df6ee5b2de1072fe97e4127927e00b4", size = 457627, upload-time = "2025-10-28T20:58:11Z" }, + { url = "https://files.pythonhosted.org/packages/c7/8e/3824ef98c039d3951cb65b9205a96dd2b20f22241ee17d89c5701557c826/aiohttp-3.13.2-cp314-cp314t-macosx_10_13_universal2.whl", hash = "sha256:f10d9c0b0188fe85398c61147bbd2a657d616c876863bfeff43376e0e3134673", size = 767360, upload-time = "2025-10-28T20:58:13.358Z" }, + { url = "https://files.pythonhosted.org/packages/a4/0f/6a03e3fc7595421274fa34122c973bde2d89344f8a881b728fa8c774e4f1/aiohttp-3.13.2-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:e7c952aefdf2460f4ae55c5e9c3e80aa72f706a6317e06020f80e96253b1accd", size = 504616, upload-time = "2025-10-28T20:58:15.339Z" }, + { url = "https://files.pythonhosted.org/packages/c6/aa/ed341b670f1bc8a6f2c6a718353d13b9546e2cef3544f573c6a1ff0da711/aiohttp-3.13.2-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:c20423ce14771d98353d2e25e83591fa75dfa90a3c1848f3d7c68243b4fbded3", size = 509131, upload-time = "2025-10-28T20:58:17.693Z" }, + { url = "https://files.pythonhosted.org/packages/7f/f0/c68dac234189dae5c4bbccc0f96ce0cc16b76632cfc3a08fff180045cfa4/aiohttp-3.13.2-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:e96eb1a34396e9430c19d8338d2ec33015e4a87ef2b4449db94c22412e25ccdf", size = 1864168, upload-time = "2025-10-28T20:58:20.113Z" }, + { url = "https://files.pythonhosted.org/packages/8f/65/75a9a76db8364b5d0e52a0c20eabc5d52297385d9af9c35335b924fafdee/aiohttp-3.13.2-cp314-cp314t-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:23fb0783bc1a33640036465019d3bba069942616a6a2353c6907d7fe1ccdaf4e", size = 1719200, upload-time = "2025-10-28T20:58:22.583Z" }, + { url = "https://files.pythonhosted.org/packages/f5/55/8df2ed78d7f41d232f6bd3ff866b6f617026551aa1d07e2f03458f964575/aiohttp-3.13.2-cp314-cp314t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:2e1a9bea6244a1d05a4e57c295d69e159a5c50d8ef16aa390948ee873478d9a5", size = 1843497, upload-time = "2025-10-28T20:58:24.672Z" }, + { url = "https://files.pythonhosted.org/packages/e9/e0/94d7215e405c5a02ccb6a35c7a3a6cfff242f457a00196496935f700cde5/aiohttp-3.13.2-cp314-cp314t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:0a3d54e822688b56e9f6b5816fb3de3a3a64660efac64e4c2dc435230ad23bad", size = 1935703, upload-time = "2025-10-28T20:58:26.758Z" }, + { url = "https://files.pythonhosted.org/packages/0b/78/1eeb63c3f9b2d1015a4c02788fb543141aad0a03ae3f7a7b669b2483f8d4/aiohttp-3.13.2-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:7a653d872afe9f33497215745da7a943d1dc15b728a9c8da1c3ac423af35178e", size = 1792738, upload-time = "2025-10-28T20:58:29.787Z" }, + { url = "https://files.pythonhosted.org/packages/41/75/aaf1eea4c188e51538c04cc568040e3082db263a57086ea74a7d38c39e42/aiohttp-3.13.2-cp314-cp314t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:56d36e80d2003fa3fc0207fac644216d8532e9504a785ef9a8fd013f84a42c61", size = 1624061, upload-time = "2025-10-28T20:58:32.529Z" }, + { url = "https://files.pythonhosted.org/packages/9b/c2/3b6034de81fbcc43de8aeb209073a2286dfb50b86e927b4efd81cf848197/aiohttp-3.13.2-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:78cd586d8331fb8e241c2dd6b2f4061778cc69e150514b39a9e28dd050475661", size = 1789201, upload-time = "2025-10-28T20:58:34.618Z" }, + { url = "https://files.pythonhosted.org/packages/c9/38/c15dcf6d4d890217dae79d7213988f4e5fe6183d43893a9cf2fe9e84ca8d/aiohttp-3.13.2-cp314-cp314t-musllinux_1_2_armv7l.whl", hash = "sha256:20b10bbfbff766294fe99987f7bb3b74fdd2f1a2905f2562132641ad434dcf98", size = 1776868, upload-time = "2025-10-28T20:58:38.835Z" }, + { url = "https://files.pythonhosted.org/packages/04/75/f74fd178ac81adf4f283a74847807ade5150e48feda6aef024403716c30c/aiohttp-3.13.2-cp314-cp314t-musllinux_1_2_ppc64le.whl", hash = "sha256:9ec49dff7e2b3c85cdeaa412e9d438f0ecd71676fde61ec57027dd392f00c693", size = 1790660, upload-time = "2025-10-28T20:58:41.507Z" }, + { url = "https://files.pythonhosted.org/packages/e7/80/7368bd0d06b16b3aba358c16b919e9c46cf11587dc572091031b0e9e3ef0/aiohttp-3.13.2-cp314-cp314t-musllinux_1_2_riscv64.whl", hash = "sha256:94f05348c4406450f9d73d38efb41d669ad6cd90c7ee194810d0eefbfa875a7a", size = 1617548, upload-time = "2025-10-28T20:58:43.674Z" }, + { url = "https://files.pythonhosted.org/packages/7d/4b/a6212790c50483cb3212e507378fbe26b5086d73941e1ec4b56a30439688/aiohttp-3.13.2-cp314-cp314t-musllinux_1_2_s390x.whl", hash = "sha256:fa4dcb605c6f82a80c7f95713c2b11c3b8e9893b3ebd2bc9bde93165ed6107be", size = 1817240, upload-time = "2025-10-28T20:58:45.787Z" }, + { url = "https://files.pythonhosted.org/packages/ff/f7/ba5f0ba4ea8d8f3c32850912944532b933acbf0f3a75546b89269b9b7dde/aiohttp-3.13.2-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:cf00e5db968c3f67eccd2778574cf64d8b27d95b237770aa32400bd7a1ca4f6c", size = 1762334, upload-time = "2025-10-28T20:58:47.936Z" }, + { url = "https://files.pythonhosted.org/packages/7e/83/1a5a1856574588b1cad63609ea9ad75b32a8353ac995d830bf5da9357364/aiohttp-3.13.2-cp314-cp314t-win32.whl", hash = "sha256:d23b5fe492b0805a50d3371e8a728a9134d8de5447dce4c885f5587294750734", size = 464685, upload-time = "2025-10-28T20:58:50.642Z" }, + { url = "https://files.pythonhosted.org/packages/9f/4d/d22668674122c08f4d56972297c51a624e64b3ed1efaa40187607a7cb66e/aiohttp-3.13.2-cp314-cp314t-win_amd64.whl", hash = "sha256:ff0a7b0a82a7ab905cbda74006318d1b12e37c797eb1b0d4eb3e316cf47f658f", size = 498093, upload-time = "2025-10-28T20:58:52.782Z" }, + { url = "https://files.pythonhosted.org/packages/04/4a/3da532fdf51b5e58fffa1a86d6569184cb1bf4bf81cd4434b6541a8d14fd/aiohttp-3.13.2-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:7fbdf5ad6084f1940ce88933de34b62358d0f4a0b6ec097362dcd3e5a65a4989", size = 739009, upload-time = "2025-10-28T20:58:55.682Z" }, + { url = "https://files.pythonhosted.org/packages/89/74/fefa6f7939cdc1d77e5cad712004e675a8847dccc589dcc3abca7feaed73/aiohttp-3.13.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:7c3a50345635a02db61792c85bb86daffac05330f6473d524f1a4e3ef9d0046d", size = 495308, upload-time = "2025-10-28T20:58:58.408Z" }, + { url = "https://files.pythonhosted.org/packages/4e/b4/a0638ae1f12d09a0dc558870968a2f19a1eba1b10ad0a85ef142ddb40b50/aiohttp-3.13.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:0e87dff73f46e969af38ab3f7cb75316a7c944e2e574ff7c933bc01b10def7f5", size = 490624, upload-time = "2025-10-28T20:59:00.479Z" }, + { url = "https://files.pythonhosted.org/packages/02/73/361cd4cac9d98a5a4183d1f26faf7b777330f8dba838c5aae2412862bdd0/aiohttp-3.13.2-cp39-cp39-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:2adebd4577724dcae085665f294cc57c8701ddd4d26140504db622b8d566d7aa", size = 1662968, upload-time = "2025-10-28T20:59:03.105Z" }, + { url = "https://files.pythonhosted.org/packages/9e/93/ce2ca7584555a6c7dd78f2e6b539a96c5172d88815e13a05a576e14a5a22/aiohttp-3.13.2-cp39-cp39-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:e036a3a645fe92309ec34b918394bb377950cbb43039a97edae6c08db64b23e2", size = 1627117, upload-time = "2025-10-28T20:59:05.274Z" }, + { url = "https://files.pythonhosted.org/packages/a6/42/7ee0e699111f5fc20a69b3203e8f5d5da0b681f270b90bc088d15e339980/aiohttp-3.13.2-cp39-cp39-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:23ad365e30108c422d0b4428cf271156dd56790f6dd50d770b8e360e6c5ab2e6", size = 1724037, upload-time = "2025-10-28T20:59:07.522Z" }, + { url = "https://files.pythonhosted.org/packages/66/88/67ad5ff11dd61dd1d7882cda39f085d5fca31cf7e2143f5173429d8a591e/aiohttp-3.13.2-cp39-cp39-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:1f9b2c2d4b9d958b1f9ae0c984ec1dd6b6689e15c75045be8ccb4011426268ca", size = 1812899, upload-time = "2025-10-28T20:59:11.698Z" }, + { url = "https://files.pythonhosted.org/packages/60/1b/a46f6e1c2a347b9c7a789292279c159b327fadecbf8340f3b05fffff1151/aiohttp-3.13.2-cp39-cp39-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:3a92cf4b9bea33e15ecbaa5c59921be0f23222608143d025c989924f7e3e0c07", size = 1660961, upload-time = "2025-10-28T20:59:14.425Z" }, + { url = "https://files.pythonhosted.org/packages/44/cc/1af9e466eafd9b5d8922238c69aaf95b656137add4c5db65f63ee129bf3c/aiohttp-3.13.2-cp39-cp39-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:070599407f4954021509193404c4ac53153525a19531051661440644728ba9a7", size = 1553851, upload-time = "2025-10-28T20:59:17.044Z" }, + { url = "https://files.pythonhosted.org/packages/e5/d1/9e5f4f40f9d0ee5668e9b5e7ebfb0eaf371cc09da03785decdc5da56f4b3/aiohttp-3.13.2-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:29562998ec66f988d49fb83c9b01694fa927186b781463f376c5845c121e4e0b", size = 1634260, upload-time = "2025-10-28T20:59:19.378Z" }, + { url = "https://files.pythonhosted.org/packages/83/2e/5d065091c4ae8b55a153f458f19308191bad3b62a89496aa081385486338/aiohttp-3.13.2-cp39-cp39-musllinux_1_2_armv7l.whl", hash = "sha256:4dd3db9d0f4ebca1d887d76f7cdbcd1116ac0d05a9221b9dad82c64a62578c4d", size = 1639499, upload-time = "2025-10-28T20:59:22.013Z" }, + { url = "https://files.pythonhosted.org/packages/a3/de/58ae6dc73691a51ff16f69a94d13657bf417456fa0fdfed2b59dd6b4c293/aiohttp-3.13.2-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:d7bc4b7f9c4921eba72677cd9fedd2308f4a4ca3e12fab58935295ad9ea98700", size = 1694087, upload-time = "2025-10-28T20:59:24.773Z" }, + { url = "https://files.pythonhosted.org/packages/45/fe/4d9df516268867d83041b6c073ee15cd532dbea58b82d675a7e1cf2ec24c/aiohttp-3.13.2-cp39-cp39-musllinux_1_2_riscv64.whl", hash = "sha256:dacd50501cd017f8cccb328da0c90823511d70d24a323196826d923aad865901", size = 1540532, upload-time = "2025-10-28T20:59:27.982Z" }, + { url = "https://files.pythonhosted.org/packages/24/e7/a802619308232499482bf30b3530efb5d141481cfd61850368350fb1acb5/aiohttp-3.13.2-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:8b2f1414f6a1e0683f212ec80e813f4abef94c739fd090b66c9adf9d2a05feac", size = 1710369, upload-time = "2025-10-28T20:59:30.363Z" }, + { url = "https://files.pythonhosted.org/packages/62/08/e8593f39f025efe96ef59550d17cf097222d84f6f84798bedac5bf037fce/aiohttp-3.13.2-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:04c3971421576ed24c191f610052bcb2f059e395bc2489dd99e397f9bc466329", size = 1649296, upload-time = "2025-10-28T20:59:33.285Z" }, + { url = "https://files.pythonhosted.org/packages/e5/fd/ffbc1b6aa46fc6c284af4a438b2c7eab79af1c8ac4b6d2ced185c17f403e/aiohttp-3.13.2-cp39-cp39-win32.whl", hash = "sha256:9f377d0a924e5cc94dc620bc6366fc3e889586a7f18b748901cf016c916e2084", size = 432980, upload-time = "2025-10-28T20:59:35.515Z" }, + { url = "https://files.pythonhosted.org/packages/ad/a9/d47e7873175a4d8aed425f2cdea2df700b2dd44fac024ffbd83455a69a50/aiohttp-3.13.2-cp39-cp39-win_amd64.whl", hash = "sha256:9c705601e16c03466cb72011bd1af55d68fa65b045356d8f96c216e5f6db0fa5", size = 456021, upload-time = "2025-10-28T20:59:37.659Z" }, +] + +[[package]] +name = "aiosignal" +version = "1.3.1" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version < '3.9'", +] +dependencies = [ + { name = "frozenlist", version = "1.5.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.9'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/ae/67/0952ed97a9793b4958e5736f6d2b346b414a2cd63e82d05940032f45b32f/aiosignal-1.3.1.tar.gz", hash = "sha256:54cd96e15e1649b75d6c87526a6ff0b6c1b0dd3459f43d9ca11d48c339b68cfc", size = 19422, upload-time = "2022-11-08T16:03:58.806Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/76/ac/a7305707cb852b7e16ff80eaf5692309bde30e2b1100a1fcacdc8f731d97/aiosignal-1.3.1-py3-none-any.whl", hash = "sha256:f8376fb07dd1e86a584e4fcdec80b36b7f81aac666ebc724e2c090300dd83b17", size = 7617, upload-time = "2022-11-08T16:03:57.483Z" }, +] + +[[package]] +name = "aiosignal" +version = "1.4.0" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version >= '3.14'", + "python_full_version >= '3.11' and python_full_version < '3.14'", + "python_full_version == '3.10.*'", + "python_full_version == '3.9.*'", +] +dependencies = [ + { name = "frozenlist", version = "1.8.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.9'" }, + { name = "typing-extensions", version = "4.15.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.9' and python_full_version < '3.13'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/61/62/06741b579156360248d1ec624842ad0edf697050bbaf7c3e46394e106ad1/aiosignal-1.4.0.tar.gz", hash = "sha256:f47eecd9468083c2029cc99945502cb7708b082c232f9aca65da147157b251c7", size = 25007, upload-time = "2025-07-03T22:54:43.528Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/fb/76/641ae371508676492379f16e2fa48f4e2c11741bd63c48be4b12a6b09cba/aiosignal-1.4.0-py3-none-any.whl", hash = "sha256:053243f8b92b990551949e63930a839ff0cf0b0ebbe0597b0f3fb19e1a0fe82e", size = 7490, upload-time = "2025-07-03T22:54:42.156Z" }, +] + +[[package]] +name = "alabaster" +version = "0.7.13" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version < '3.9'", +] +sdist = { url = "https://files.pythonhosted.org/packages/94/71/a8ee96d1fd95ca04a0d2e2d9c4081dac4c2d2b12f7ddb899c8cb9bfd1532/alabaster-0.7.13.tar.gz", hash = "sha256:a27a4a084d5e690e16e01e03ad2b2e552c61a65469419b907243193de1a84ae2", size = 11454, upload-time = "2023-01-13T06:42:53.797Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/64/88/c7083fc61120ab661c5d0b82cb77079fc1429d3f913a456c1c82cf4658f7/alabaster-0.7.13-py3-none-any.whl", hash = "sha256:1ee19aca801bbabb5ba3f5f258e4422dfa86f82f3e9cefb0859b283cdd7f62a3", size = 13857, upload-time = "2023-01-13T06:42:52.336Z" }, +] + +[[package]] +name = "alabaster" +version = "0.7.16" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version == '3.9.*'", +] +sdist = { url = "https://files.pythonhosted.org/packages/c9/3e/13dd8e5ed9094e734ac430b5d0eb4f2bb001708a8b7856cbf8e084e001ba/alabaster-0.7.16.tar.gz", hash = "sha256:75a8b99c28a5dad50dd7f8ccdd447a121ddb3892da9e53d1ca5cca3106d58d65", size = 23776, upload-time = "2024-01-10T00:56:10.189Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/32/34/d4e1c02d3bee589efb5dfa17f88ea08bdb3e3eac12bc475462aec52ed223/alabaster-0.7.16-py3-none-any.whl", hash = "sha256:b46733c07dce03ae4e150330b975c75737fa60f0a7c591b6c8bf4928a28e2c92", size = 13511, upload-time = "2024-01-10T00:56:08.388Z" }, +] + +[[package]] +name = "alabaster" +version = "1.0.0" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version >= '3.14'", + "python_full_version >= '3.11' and python_full_version < '3.14'", + "python_full_version == '3.10.*'", +] +sdist = { url = "https://files.pythonhosted.org/packages/a6/f8/d9c74d0daf3f742840fd818d69cfae176fa332022fd44e3469487d5a9420/alabaster-1.0.0.tar.gz", hash = "sha256:c00dca57bca26fa62a6d7d0a9fcce65f3e026e9bfe33e9c538fd3fbb2144fd9e", size = 24210, upload-time = "2024-07-26T18:15:03.762Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/7e/b3/6b4067be973ae96ba0d615946e314c5ae35f9f993eca561b356540bb0c2b/alabaster-1.0.0-py3-none-any.whl", hash = "sha256:fc6786402dc3fcb2de3cabd5fe455a2db534b371124f1f21de8731783dec828b", size = 13929, upload-time = "2024-07-26T18:15:02.05Z" }, +] + +[[package]] +name = "anyio" +version = "4.5.2" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version < '3.9'", +] +dependencies = [ + { name = "exceptiongroup", marker = "python_full_version < '3.9'" }, + { name = "idna", marker = "python_full_version < '3.9'" }, + { name = "sniffio", marker = "python_full_version < '3.9'" }, + { name = "typing-extensions", version = "4.13.2", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.9'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/4d/f9/9a7ce600ebe7804daf90d4d48b1c0510a4561ddce43a596be46676f82343/anyio-4.5.2.tar.gz", hash = "sha256:23009af4ed04ce05991845451e11ef02fc7c5ed29179ac9a420e5ad0ac7ddc5b", size = 171293, upload-time = "2024-10-13T22:18:03.307Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/1b/b4/f7e396030e3b11394436358ca258a81d6010106582422f23443c16ca1873/anyio-4.5.2-py3-none-any.whl", hash = "sha256:c011ee36bc1e8ba40e5a81cb9df91925c218fe9b778554e0b56a21e1b5d4716f", size = 89766, upload-time = "2024-10-13T22:18:01.524Z" }, +] + +[[package]] +name = "anyio" +version = "4.12.0" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version >= '3.14'", + "python_full_version >= '3.11' and python_full_version < '3.14'", + "python_full_version == '3.10.*'", + "python_full_version == '3.9.*'", +] +dependencies = [ + { name = "exceptiongroup", marker = "python_full_version >= '3.9' and python_full_version < '3.11'" }, + { name = "idna", marker = "python_full_version >= '3.9'" }, + { name = "typing-extensions", version = "4.15.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.9' and python_full_version < '3.13'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/16/ce/8a777047513153587e5434fd752e89334ac33e379aa3497db860eeb60377/anyio-4.12.0.tar.gz", hash = "sha256:73c693b567b0c55130c104d0b43a9baf3aa6a31fc6110116509f27bf75e21ec0", size = 228266, upload-time = "2025-11-28T23:37:38.911Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/7f/9c/36c5c37947ebfb8c7f22e0eb6e4d188ee2d53aa3880f3f2744fb894f0cb1/anyio-4.12.0-py3-none-any.whl", hash = "sha256:dad2376a628f98eeca4881fc56cd06affd18f659b17a747d3ff0307ced94b1bb", size = 113362, upload-time = "2025-11-28T23:36:57.897Z" }, +] + +[[package]] +name = "appnope" +version = "0.1.4" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/35/5d/752690df9ef5b76e169e68d6a129fa6d08a7100ca7f754c89495db3c6019/appnope-0.1.4.tar.gz", hash = "sha256:1de3860566df9caf38f01f86f65e0e13e379af54f9e4bee1e66b48f2efffd1ee", size = 4170, upload-time = "2024-02-06T09:43:11.258Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/81/29/5ecc3a15d5a33e31b26c11426c45c501e439cb865d0bff96315d86443b78/appnope-0.1.4-py2.py3-none-any.whl", hash = "sha256:502575ee11cd7a28c0205f379b525beefebab9d161b7c964670864014ed7213c", size = 4321, upload-time = "2024-02-06T09:43:09.663Z" }, +] + +[[package]] +name = "argcomplete" +version = "3.6.3" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/38/61/0b9ae6399dd4a58d8c1b1dc5a27d6f2808023d0b5dd3104bb99f45a33ff6/argcomplete-3.6.3.tar.gz", hash = "sha256:62e8ed4fd6a45864acc8235409461b72c9a28ee785a2011cc5eb78318786c89c", size = 73754, upload-time = "2025-10-20T03:33:34.741Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/74/f5/9373290775639cb67a2fce7f629a1c240dce9f12fe927bc32b2736e16dfc/argcomplete-3.6.3-py3-none-any.whl", hash = "sha256:f5007b3a600ccac5d25bbce33089211dfd49eab4a7718da3f10e3082525a92ce", size = 43846, upload-time = "2025-10-20T03:33:33.021Z" }, +] + +[[package]] +name = "argon2-cffi" +version = "25.1.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "argon2-cffi-bindings", version = "21.2.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.9'" }, + { name = "argon2-cffi-bindings", version = "25.1.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.9'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/0e/89/ce5af8a7d472a67cc819d5d998aa8c82c5d860608c4db9f46f1162d7dab9/argon2_cffi-25.1.0.tar.gz", hash = "sha256:694ae5cc8a42f4c4e2bf2ca0e64e51e23a040c6a517a85074683d3959e1346c1", size = 45706, upload-time = "2025-06-03T06:55:32.073Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/4f/d3/a8b22fa575b297cd6e3e3b0155c7e25db170edf1c74783d6a31a2490b8d9/argon2_cffi-25.1.0-py3-none-any.whl", hash = "sha256:fdc8b074db390fccb6eb4a3604ae7231f219aa669a2652e0f20e16ba513d5741", size = 14657, upload-time = "2025-06-03T06:55:30.804Z" }, +] + +[[package]] +name = "argon2-cffi-bindings" +version = "21.2.0" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version < '3.9'", +] +dependencies = [ + { name = "cffi", version = "1.17.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.9'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/b9/e9/184b8ccce6683b0aa2fbb7ba5683ea4b9c5763f1356347f1312c32e3c66e/argon2-cffi-bindings-21.2.0.tar.gz", hash = "sha256:bb89ceffa6c791807d1305ceb77dbfacc5aa499891d2c55661c6459651fc39e3", size = 1779911, upload-time = "2021-12-01T08:52:55.68Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/d4/13/838ce2620025e9666aa8f686431f67a29052241692a3dd1ae9d3692a89d3/argon2_cffi_bindings-21.2.0-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:ccb949252cb2ab3a08c02024acb77cfb179492d5701c7cbdbfd776124d4d2367", size = 29658, upload-time = "2021-12-01T09:09:17.016Z" }, + { url = "https://files.pythonhosted.org/packages/b3/02/f7f7bb6b6af6031edb11037639c697b912e1dea2db94d436e681aea2f495/argon2_cffi_bindings-21.2.0-cp36-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9524464572e12979364b7d600abf96181d3541da11e23ddf565a32e70bd4dc0d", size = 80583, upload-time = "2021-12-01T09:09:19.546Z" }, + { url = "https://files.pythonhosted.org/packages/ec/f7/378254e6dd7ae6f31fe40c8649eea7d4832a42243acaf0f1fff9083b2bed/argon2_cffi_bindings-21.2.0-cp36-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b746dba803a79238e925d9046a63aa26bf86ab2a2fe74ce6b009a1c3f5c8f2ae", size = 86168, upload-time = "2021-12-01T09:09:21.445Z" }, + { url = "https://files.pythonhosted.org/packages/74/f6/4a34a37a98311ed73bb80efe422fed95f2ac25a4cacc5ae1d7ae6a144505/argon2_cffi_bindings-21.2.0-cp36-abi3-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:58ed19212051f49a523abb1dbe954337dc82d947fb6e5a0da60f7c8471a8476c", size = 82709, upload-time = "2021-12-01T09:09:18.182Z" }, + { url = "https://files.pythonhosted.org/packages/74/2b/73d767bfdaab25484f7e7901379d5f8793cccbb86c6e0cbc4c1b96f63896/argon2_cffi_bindings-21.2.0-cp36-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:bd46088725ef7f58b5a1ef7ca06647ebaf0eb4baff7d1d0d177c6cc8744abd86", size = 83613, upload-time = "2021-12-01T09:09:22.741Z" }, + { url = "https://files.pythonhosted.org/packages/4f/fd/37f86deef67ff57c76f137a67181949c2d408077e2e3dd70c6c42912c9bf/argon2_cffi_bindings-21.2.0-cp36-abi3-musllinux_1_1_i686.whl", hash = "sha256:8cd69c07dd875537a824deec19f978e0f2078fdda07fd5c42ac29668dda5f40f", size = 84583, upload-time = "2021-12-01T09:09:24.177Z" }, + { url = "https://files.pythonhosted.org/packages/6f/52/5a60085a3dae8fded8327a4f564223029f5f54b0cb0455a31131b5363a01/argon2_cffi_bindings-21.2.0-cp36-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:f1152ac548bd5b8bcecfb0b0371f082037e47128653df2e8ba6e914d384f3c3e", size = 88475, upload-time = "2021-12-01T09:09:26.673Z" }, + { url = "https://files.pythonhosted.org/packages/8b/95/143cd64feb24a15fa4b189a3e1e7efbaeeb00f39a51e99b26fc62fbacabd/argon2_cffi_bindings-21.2.0-cp36-abi3-win32.whl", hash = "sha256:603ca0aba86b1349b147cab91ae970c63118a0f30444d4bc80355937c950c082", size = 27698, upload-time = "2021-12-01T09:09:27.87Z" }, + { url = "https://files.pythonhosted.org/packages/37/2c/e34e47c7dee97ba6f01a6203e0383e15b60fb85d78ac9a15cd066f6fe28b/argon2_cffi_bindings-21.2.0-cp36-abi3-win_amd64.whl", hash = "sha256:b2ef1c30440dbbcba7a5dc3e319408b59676e2e039e2ae11a8775ecf482b192f", size = 30817, upload-time = "2021-12-01T09:09:30.267Z" }, + { url = "https://files.pythonhosted.org/packages/5a/e4/bf8034d25edaa495da3c8a3405627d2e35758e44ff6eaa7948092646fdcc/argon2_cffi_bindings-21.2.0-cp38-abi3-macosx_10_9_universal2.whl", hash = "sha256:e415e3f62c8d124ee16018e491a009937f8cf7ebf5eb430ffc5de21b900dad93", size = 53104, upload-time = "2021-12-01T09:09:31.335Z" }, + { url = "https://files.pythonhosted.org/packages/34/da/d105a3235ae86c1c1a80c1e9c46953e6e53cc8c4c61fb3c5ac8a39bbca48/argon2_cffi_bindings-21.2.0-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:3b9ef65804859d335dc6b31582cad2c5166f0c3e7975f324d9ffaa34ee7e6583", size = 23689, upload-time = "2021-12-01T09:09:40.511Z" }, + { url = "https://files.pythonhosted.org/packages/43/f3/20bc53a6e50471dfea16a63dc9b69d2a9ec78fd2b9532cc25f8317e121d9/argon2_cffi_bindings-21.2.0-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d4966ef5848d820776f5f562a7d45fdd70c2f330c961d0d745b784034bd9f48d", size = 28122, upload-time = "2021-12-01T09:09:42.818Z" }, + { url = "https://files.pythonhosted.org/packages/2e/f1/48888db30b6a4a0c78ab7bc7444058a1135b223b6a2a5f2ac7d6780e7443/argon2_cffi_bindings-21.2.0-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:20ef543a89dee4db46a1a6e206cd015360e5a75822f76df533845c3cbaf72670", size = 27882, upload-time = "2021-12-01T09:09:43.93Z" }, + { url = "https://files.pythonhosted.org/packages/ee/0f/a2260a207f21ce2ff4cad00a417c31597f08eafb547e00615bcbf403d8ea/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", size = 30745, upload-time = "2021-12-01T09:09:41.73Z" }, + { url = "https://files.pythonhosted.org/packages/ed/55/f8ba268bc9005d0ca57a862e8f1b55bf1775e97a36bd30b0a8fb568c265c/argon2_cffi_bindings-21.2.0-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:5e00316dabdaea0b2dd82d141cc66889ced0cdcbfa599e8b471cf22c620c329a", size = 28587, upload-time = "2021-12-01T09:09:45.508Z" }, +] + +[[package]] +name = "argon2-cffi-bindings" +version = "25.1.0" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version >= '3.14'", + "python_full_version >= '3.11' and python_full_version < '3.14'", + "python_full_version == '3.10.*'", + "python_full_version == '3.9.*'", +] +dependencies = [ + { name = "cffi", version = "2.0.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.9'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/5c/2d/db8af0df73c1cf454f71b2bbe5e356b8c1f8041c979f505b3d3186e520a9/argon2_cffi_bindings-25.1.0.tar.gz", hash = "sha256:b957f3e6ea4d55d820e40ff76f450952807013d361a65d7f28acc0acbf29229d", size = 1783441, upload-time = "2025-07-30T10:02:05.147Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/60/97/3c0a35f46e52108d4707c44b95cfe2afcafc50800b5450c197454569b776/argon2_cffi_bindings-25.1.0-cp314-cp314t-macosx_10_13_universal2.whl", hash = "sha256:3d3f05610594151994ca9ccb3c771115bdb4daef161976a266f0dd8aa9996b8f", size = 54393, upload-time = "2025-07-30T10:01:40.97Z" }, + { url = "https://files.pythonhosted.org/packages/9d/f4/98bbd6ee89febd4f212696f13c03ca302b8552e7dbf9c8efa11ea4a388c3/argon2_cffi_bindings-25.1.0-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:8b8efee945193e667a396cbc7b4fb7d357297d6234d30a489905d96caabde56b", size = 29328, upload-time = "2025-07-30T10:01:41.916Z" }, + { url = "https://files.pythonhosted.org/packages/43/24/90a01c0ef12ac91a6be05969f29944643bc1e5e461155ae6559befa8f00b/argon2_cffi_bindings-25.1.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:3c6702abc36bf3ccba3f802b799505def420a1b7039862014a65db3205967f5a", size = 31269, upload-time = "2025-07-30T10:01:42.716Z" }, + { url = "https://files.pythonhosted.org/packages/d4/d3/942aa10782b2697eee7af5e12eeff5ebb325ccfb86dd8abda54174e377e4/argon2_cffi_bindings-25.1.0-cp314-cp314t-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:a1c70058c6ab1e352304ac7e3b52554daadacd8d453c1752e547c76e9c99ac44", size = 86558, upload-time = "2025-07-30T10:01:43.943Z" }, + { url = "https://files.pythonhosted.org/packages/0d/82/b484f702fec5536e71836fc2dbc8c5267b3f6e78d2d539b4eaa6f0db8bf8/argon2_cffi_bindings-25.1.0-cp314-cp314t-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:e2fd3bfbff3c5d74fef31a722f729bf93500910db650c925c2d6ef879a7e51cb", size = 92364, upload-time = "2025-07-30T10:01:44.887Z" }, + { url = "https://files.pythonhosted.org/packages/c9/c1/a606ff83b3f1735f3759ad0f2cd9e038a0ad11a3de3b6c673aa41c24bb7b/argon2_cffi_bindings-25.1.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:c4f9665de60b1b0e99bcd6be4f17d90339698ce954cfd8d9cf4f91c995165a92", size = 85637, upload-time = "2025-07-30T10:01:46.225Z" }, + { url = "https://files.pythonhosted.org/packages/44/b4/678503f12aceb0262f84fa201f6027ed77d71c5019ae03b399b97caa2f19/argon2_cffi_bindings-25.1.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:ba92837e4a9aa6a508c8d2d7883ed5a8f6c308c89a4790e1e447a220deb79a85", size = 91934, upload-time = "2025-07-30T10:01:47.203Z" }, + { url = "https://files.pythonhosted.org/packages/f0/c7/f36bd08ef9bd9f0a9cff9428406651f5937ce27b6c5b07b92d41f91ae541/argon2_cffi_bindings-25.1.0-cp314-cp314t-win32.whl", hash = "sha256:84a461d4d84ae1295871329b346a97f68eade8c53b6ed9a7ca2d7467f3c8ff6f", size = 28158, upload-time = "2025-07-30T10:01:48.341Z" }, + { url = "https://files.pythonhosted.org/packages/b3/80/0106a7448abb24a2c467bf7d527fe5413b7fdfa4ad6d6a96a43a62ef3988/argon2_cffi_bindings-25.1.0-cp314-cp314t-win_amd64.whl", hash = "sha256:b55aec3565b65f56455eebc9b9f34130440404f27fe21c3b375bf1ea4d8fbae6", size = 32597, upload-time = "2025-07-30T10:01:49.112Z" }, + { url = "https://files.pythonhosted.org/packages/05/b8/d663c9caea07e9180b2cb662772865230715cbd573ba3b5e81793d580316/argon2_cffi_bindings-25.1.0-cp314-cp314t-win_arm64.whl", hash = "sha256:87c33a52407e4c41f3b70a9c2d3f6056d88b10dad7695be708c5021673f55623", size = 28231, upload-time = "2025-07-30T10:01:49.92Z" }, + { url = "https://files.pythonhosted.org/packages/1d/57/96b8b9f93166147826da5f90376e784a10582dd39a393c99bb62cfcf52f0/argon2_cffi_bindings-25.1.0-cp39-abi3-macosx_10_9_universal2.whl", hash = "sha256:aecba1723ae35330a008418a91ea6cfcedf6d31e5fbaa056a166462ff066d500", size = 54121, upload-time = "2025-07-30T10:01:50.815Z" }, + { url = "https://files.pythonhosted.org/packages/0a/08/a9bebdb2e0e602dde230bdde8021b29f71f7841bd54801bcfd514acb5dcf/argon2_cffi_bindings-25.1.0-cp39-abi3-macosx_10_9_x86_64.whl", hash = "sha256:2630b6240b495dfab90aebe159ff784d08ea999aa4b0d17efa734055a07d2f44", size = 29177, upload-time = "2025-07-30T10:01:51.681Z" }, + { url = "https://files.pythonhosted.org/packages/b6/02/d297943bcacf05e4f2a94ab6f462831dc20158614e5d067c35d4e63b9acb/argon2_cffi_bindings-25.1.0-cp39-abi3-macosx_11_0_arm64.whl", hash = "sha256:7aef0c91e2c0fbca6fc68e7555aa60ef7008a739cbe045541e438373bc54d2b0", size = 31090, upload-time = "2025-07-30T10:01:53.184Z" }, + { url = "https://files.pythonhosted.org/packages/c1/93/44365f3d75053e53893ec6d733e4a5e3147502663554b4d864587c7828a7/argon2_cffi_bindings-25.1.0-cp39-abi3-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:1e021e87faa76ae0d413b619fe2b65ab9a037f24c60a1e6cc43457ae20de6dc6", size = 81246, upload-time = "2025-07-30T10:01:54.145Z" }, + { url = "https://files.pythonhosted.org/packages/09/52/94108adfdd6e2ddf58be64f959a0b9c7d4ef2fa71086c38356d22dc501ea/argon2_cffi_bindings-25.1.0-cp39-abi3-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:d3e924cfc503018a714f94a49a149fdc0b644eaead5d1f089330399134fa028a", size = 87126, upload-time = "2025-07-30T10:01:55.074Z" }, + { url = "https://files.pythonhosted.org/packages/72/70/7a2993a12b0ffa2a9271259b79cc616e2389ed1a4d93842fac5a1f923ffd/argon2_cffi_bindings-25.1.0-cp39-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:c87b72589133f0346a1cb8d5ecca4b933e3c9b64656c9d175270a000e73b288d", size = 80343, upload-time = "2025-07-30T10:01:56.007Z" }, + { url = "https://files.pythonhosted.org/packages/78/9a/4e5157d893ffc712b74dbd868c7f62365618266982b64accab26bab01edc/argon2_cffi_bindings-25.1.0-cp39-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:1db89609c06afa1a214a69a462ea741cf735b29a57530478c06eb81dd403de99", size = 86777, upload-time = "2025-07-30T10:01:56.943Z" }, + { url = "https://files.pythonhosted.org/packages/74/cd/15777dfde1c29d96de7f18edf4cc94c385646852e7c7b0320aa91ccca583/argon2_cffi_bindings-25.1.0-cp39-abi3-win32.whl", hash = "sha256:473bcb5f82924b1becbb637b63303ec8d10e84c8d241119419897a26116515d2", size = 27180, upload-time = "2025-07-30T10:01:57.759Z" }, + { url = "https://files.pythonhosted.org/packages/e2/c6/a759ece8f1829d1f162261226fbfd2c6832b3ff7657384045286d2afa384/argon2_cffi_bindings-25.1.0-cp39-abi3-win_amd64.whl", hash = "sha256:a98cd7d17e9f7ce244c0803cad3c23a7d379c301ba618a5fa76a67d116618b98", size = 31715, upload-time = "2025-07-30T10:01:58.56Z" }, + { url = "https://files.pythonhosted.org/packages/42/b9/f8d6fa329ab25128b7e98fd83a3cb34d9db5b059a9847eddb840a0af45dd/argon2_cffi_bindings-25.1.0-cp39-abi3-win_arm64.whl", hash = "sha256:b0fdbcf513833809c882823f98dc2f931cf659d9a1429616ac3adebb49f5db94", size = 27149, upload-time = "2025-07-30T10:01:59.329Z" }, + { url = "https://files.pythonhosted.org/packages/11/2d/ba4e4ca8d149f8dcc0d952ac0967089e1d759c7e5fcf0865a317eb680fbb/argon2_cffi_bindings-25.1.0-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:6dca33a9859abf613e22733131fc9194091c1fa7cb3e131c143056b4856aa47e", size = 24549, upload-time = "2025-07-30T10:02:00.101Z" }, + { url = "https://files.pythonhosted.org/packages/5c/82/9b2386cc75ac0bd3210e12a44bfc7fd1632065ed8b80d573036eecb10442/argon2_cffi_bindings-25.1.0-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:21378b40e1b8d1655dd5310c84a40fc19a9aa5e6366e835ceb8576bf0fea716d", size = 25539, upload-time = "2025-07-30T10:02:00.929Z" }, + { url = "https://files.pythonhosted.org/packages/31/db/740de99a37aa727623730c90d92c22c9e12585b3c98c54b7960f7810289f/argon2_cffi_bindings-25.1.0-pp310-pypy310_pp73-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:5d588dec224e2a83edbdc785a5e6f3c6cd736f46bfd4b441bbb5aa1f5085e584", size = 28467, upload-time = "2025-07-30T10:02:02.08Z" }, + { url = "https://files.pythonhosted.org/packages/71/7a/47c4509ea18d755f44e2b92b7178914f0c113946d11e16e626df8eaa2b0b/argon2_cffi_bindings-25.1.0-pp310-pypy310_pp73-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:5acb4e41090d53f17ca1110c3427f0a130f944b896fc8c83973219c97f57b690", size = 27355, upload-time = "2025-07-30T10:02:02.867Z" }, + { url = "https://files.pythonhosted.org/packages/ee/82/82745642d3c46e7cea25e1885b014b033f4693346ce46b7f47483cf5d448/argon2_cffi_bindings-25.1.0-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:da0c79c23a63723aa5d782250fbf51b768abca630285262fb5144ba5ae01e520", size = 29187, upload-time = "2025-07-30T10:02:03.674Z" }, +] + +[[package]] +name = "arrow" +version = "1.4.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "backports-zoneinfo", marker = "python_full_version < '3.9'" }, + { name = "python-dateutil" }, + { name = "tzdata", marker = "python_full_version >= '3.9'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/b9/33/032cdc44182491aa708d06a68b62434140d8c50820a087fac7af37703357/arrow-1.4.0.tar.gz", hash = "sha256:ed0cc050e98001b8779e84d461b0098c4ac597e88704a655582b21d116e526d7", size = 152931, upload-time = "2025-10-18T17:46:46.761Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ed/c9/d7977eaacb9df673210491da99e6a247e93df98c715fc43fd136ce1d3d33/arrow-1.4.0-py3-none-any.whl", hash = "sha256:749f0769958ebdc79c173ff0b0670d59051a535fa26e8eba02953dc19eb43205", size = 68797, upload-time = "2025-10-18T17:46:45.663Z" }, +] + +[[package]] +name = "asttokens" +version = "3.0.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/be/a5/8e3f9b6771b0b408517c82d97aed8f2036509bc247d46114925e32fe33f0/asttokens-3.0.1.tar.gz", hash = "sha256:71a4ee5de0bde6a31d64f6b13f2293ac190344478f081c3d1bccfcf5eacb0cb7", size = 62308, upload-time = "2025-11-15T16:43:48.578Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/d2/39/e7eaf1799466a4aef85b6a4fe7bd175ad2b1c6345066aa33f1f58d4b18d0/asttokens-3.0.1-py3-none-any.whl", hash = "sha256:15a3ebc0f43c2d0a50eeafea25e19046c68398e487b9f1f5b517f7c0f40f976a", size = 27047, upload-time = "2025-11-15T16:43:16.109Z" }, +] + +[[package]] +name = "async-lru" +version = "2.0.4" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version < '3.9'", +] +dependencies = [ + { name = "typing-extensions", version = "4.13.2", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.9'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/80/e2/2b4651eff771f6fd900d233e175ddc5e2be502c7eb62c0c42f975c6d36cd/async-lru-2.0.4.tar.gz", hash = "sha256:b8a59a5df60805ff63220b2a0c5b5393da5521b113cd5465a44eb037d81a5627", size = 10019, upload-time = "2023-07-27T19:12:18.631Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/fa/9f/3c3503693386c4b0f245eaf5ca6198e3b28879ca0a40bde6b0e319793453/async_lru-2.0.4-py3-none-any.whl", hash = "sha256:ff02944ce3c288c5be660c42dbcca0742b32c3b279d6dceda655190240b99224", size = 6111, upload-time = "2023-07-27T19:12:17.164Z" }, +] + +[[package]] +name = "async-lru" +version = "2.0.5" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version >= '3.14'", + "python_full_version >= '3.11' and python_full_version < '3.14'", + "python_full_version == '3.10.*'", + "python_full_version == '3.9.*'", +] +dependencies = [ + { name = "typing-extensions", version = "4.15.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.9' and python_full_version < '3.11'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/b2/4d/71ec4d3939dc755264f680f6c2b4906423a304c3d18e96853f0a595dfe97/async_lru-2.0.5.tar.gz", hash = "sha256:481d52ccdd27275f42c43a928b4a50c3bfb2d67af4e78b170e3e0bb39c66e5bb", size = 10380, upload-time = "2025-03-16T17:25:36.919Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/03/49/d10027df9fce941cb8184e78a02857af36360d33e1721df81c5ed2179a1a/async_lru-2.0.5-py3-none-any.whl", hash = "sha256:ab95404d8d2605310d345932697371a5f40def0487c03d6d0ad9138de52c9943", size = 6069, upload-time = "2025-03-16T17:25:35.422Z" }, +] + +[[package]] +name = "async-timeout" +version = "5.0.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/a5/ae/136395dfbfe00dfc94da3f3e136d0b13f394cba8f4841120e34226265780/async_timeout-5.0.1.tar.gz", hash = "sha256:d9321a7a3d5a6a5e187e824d2fa0793ce379a202935782d555d6e9d2735677d3", size = 9274, upload-time = "2024-11-06T16:41:39.6Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/fe/ba/e2081de779ca30d473f21f5b30e0e737c438205440784c7dfc81efc2b029/async_timeout-5.0.1-py3-none-any.whl", hash = "sha256:39e3809566ff85354557ec2398b55e096c8364bacac9405a7a1fa429e77fe76c", size = 6233, upload-time = "2024-11-06T16:41:37.9Z" }, +] + +[[package]] +name = "attrs" +version = "25.3.0" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version < '3.9'", +] +sdist = { url = "https://files.pythonhosted.org/packages/5a/b0/1367933a8532ee6ff8d63537de4f1177af4bff9f3e829baf7331f595bb24/attrs-25.3.0.tar.gz", hash = "sha256:75d7cefc7fb576747b2c81b4442d4d4a1ce0900973527c011d1030fd3bf4af1b", size = 812032, upload-time = "2025-03-13T11:10:22.779Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/77/06/bb80f5f86020c4551da315d78b3ab75e8228f89f0162f2c3a819e407941a/attrs-25.3.0-py3-none-any.whl", hash = "sha256:427318ce031701fea540783410126f03899a97ffc6f61596ad581ac2e40e3bc3", size = 63815, upload-time = "2025-03-13T11:10:21.14Z" }, +] + +[[package]] +name = "attrs" +version = "25.4.0" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version >= '3.14'", + "python_full_version >= '3.11' and python_full_version < '3.14'", + "python_full_version == '3.10.*'", + "python_full_version == '3.9.*'", +] +sdist = { url = "https://files.pythonhosted.org/packages/6b/5c/685e6633917e101e5dcb62b9dd76946cbb57c26e133bae9e0cd36033c0a9/attrs-25.4.0.tar.gz", hash = "sha256:16d5969b87f0859ef33a48b35d55ac1be6e42ae49d5e853b597db70c35c57e11", size = 934251, upload-time = "2025-10-06T13:54:44.725Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/3a/2a/7cc015f5b9f5db42b7d48157e23356022889fc354a2813c15934b7cb5c0e/attrs-25.4.0-py3-none-any.whl", hash = "sha256:adcf7e2a1fb3b36ac48d97835bb6d8ade15b8dcce26aba8bf1d14847b57a3373", size = 67615, upload-time = "2025-10-06T13:54:43.17Z" }, +] + +[[package]] +name = "babel" +version = "2.17.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pytz", marker = "python_full_version < '3.9'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/7d/6b/d52e42361e1aa00709585ecc30b3f9684b3ab62530771402248b1b1d6240/babel-2.17.0.tar.gz", hash = "sha256:0c54cffb19f690cdcc52a3b50bcbf71e07a808d1c80d549f2459b9d2cf0afb9d", size = 9951852, upload-time = "2025-02-01T15:17:41.026Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/b7/b8/3fe70c75fe32afc4bb507f75563d39bc5642255d1d94f1f23604725780bf/babel-2.17.0-py3-none-any.whl", hash = "sha256:4d0b53093fdfb4b21c92b5213dba5a1b23885afa8383709427046b21c366e5f2", size = 10182537, upload-time = "2025-02-01T15:17:37.39Z" }, +] + +[[package]] +name = "backcall" +version = "0.2.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/a2/40/764a663805d84deee23043e1426a9175567db89c8b3287b5c2ad9f71aa93/backcall-0.2.0.tar.gz", hash = "sha256:5cbdbf27be5e7cfadb448baf0aa95508f91f2bbc6c6437cd9cd06e2a4c215e1e", size = 18041, upload-time = "2020-06-09T15:11:32.931Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/4c/1c/ff6546b6c12603d8dd1070aa3c3d273ad4c07f5771689a7b69a550e8c951/backcall-0.2.0-py2.py3-none-any.whl", hash = "sha256:fbbce6a29f263178a1f7915c1940bde0ec2b2a967566fe1c65c1dfb7422bd255", size = 11157, upload-time = "2020-06-09T15:11:30.87Z" }, +] + +[[package]] +name = "backports-tarfile" +version = "1.2.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/86/72/cd9b395f25e290e633655a100af28cb253e4393396264a98bd5f5951d50f/backports_tarfile-1.2.0.tar.gz", hash = "sha256:d75e02c268746e1b8144c278978b6e98e85de6ad16f8e4b0844a154557eca991", size = 86406, upload-time = "2024-05-28T17:01:54.731Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/b9/fa/123043af240e49752f1c4bd24da5053b6bd00cad78c2be53c0d1e8b975bc/backports.tarfile-1.2.0-py3-none-any.whl", hash = "sha256:77e284d754527b01fb1e6fa8a1afe577858ebe4e9dad8919e34c862cb399bc34", size = 30181, upload-time = "2024-05-28T17:01:53.112Z" }, +] + +[[package]] +name = "backports-zoneinfo" +version = "0.2.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/ad/85/475e514c3140937cf435954f78dedea1861aeab7662d11de232bdaa90655/backports.zoneinfo-0.2.1.tar.gz", hash = "sha256:fadbfe37f74051d024037f223b8e001611eac868b5c5b06144ef4d8b799862f2", size = 74098, upload-time = "2020-06-23T13:51:22.041Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/4a/6d/eca004eeadcbf8bd64cc96feb9e355536147f0577420b44d80c7cac70767/backports.zoneinfo-0.2.1-cp38-cp38-macosx_10_14_x86_64.whl", hash = "sha256:8961c0f32cd0336fb8e8ead11a1f8cd99ec07145ec2931122faaac1c8f7fd987", size = 35816, upload-time = "2020-06-23T13:51:21.244Z" }, + { url = "https://files.pythonhosted.org/packages/c1/8f/9b1b920a6a95652463143943fa3b8c000cb0b932ab463764a6f2a2416560/backports.zoneinfo-0.2.1-cp38-cp38-manylinux1_i686.whl", hash = "sha256:e81b76cace8eda1fca50e345242ba977f9be6ae3945af8d46326d776b4cf78d1", size = 72147, upload-time = "2020-06-23T13:51:17.562Z" }, + { url = "https://files.pythonhosted.org/packages/1a/ab/3e941e3fcf1b7d3ab3d0233194d99d6a0ed6b24f8f956fc81e47edc8c079/backports.zoneinfo-0.2.1-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:7b0a64cda4145548fed9efc10322770f929b944ce5cee6c0dfe0c87bf4c0c8c9", size = 74033, upload-time = "2020-06-23T13:51:14.592Z" }, + { url = "https://files.pythonhosted.org/packages/c0/34/5fdb0a3a28841d215c255be8fc60b8666257bb6632193c86fd04b63d4a31/backports.zoneinfo-0.2.1-cp38-cp38-win32.whl", hash = "sha256:1b13e654a55cd45672cb54ed12148cd33628f672548f373963b0bff67b217328", size = 36803, upload-time = "2020-06-23T13:51:07.517Z" }, + { url = "https://files.pythonhosted.org/packages/78/cc/e27fd6493bbce8dbea7e6c1bc861fe3d3bc22c4f7c81f4c3befb8ff5bfaf/backports.zoneinfo-0.2.1-cp38-cp38-win_amd64.whl", hash = "sha256:4a0f800587060bf8880f954dbef70de6c11bbe59c673c3d818921f042f9954a6", size = 38967, upload-time = "2020-06-23T13:51:13.735Z" }, +] + +[[package]] +name = "beautifulsoup4" +version = "4.14.3" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "soupsieve", version = "2.7", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.9'" }, + { name = "soupsieve", version = "2.8", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.9'" }, + { name = "typing-extensions", version = "4.13.2", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.9'" }, + { name = "typing-extensions", version = "4.15.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.9'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/c3/b0/1c6a16426d389813b48d95e26898aff79abbde42ad353958ad95cc8c9b21/beautifulsoup4-4.14.3.tar.gz", hash = "sha256:6292b1c5186d356bba669ef9f7f051757099565ad9ada5dd630bd9de5fa7fb86", size = 627737, upload-time = "2025-11-30T15:08:26.084Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/1a/39/47f9197bdd44df24d67ac8893641e16f386c984a0619ef2ee4c51fbbc019/beautifulsoup4-4.14.3-py3-none-any.whl", hash = "sha256:0918bfe44902e6ad8d57732ba310582e98da931428d231a5ecb9e7c703a735bb", size = 107721, upload-time = "2025-11-30T15:08:24.087Z" }, +] + +[[package]] +name = "bleach" +version = "6.1.0" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version < '3.9'", +] +dependencies = [ + { name = "six", marker = "python_full_version < '3.9'" }, + { name = "webencodings", marker = "python_full_version < '3.9'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/6d/10/77f32b088738f40d4f5be801daa5f327879eadd4562f36a2b5ab975ae571/bleach-6.1.0.tar.gz", hash = "sha256:0a31f1837963c41d46bbf1331b8778e1308ea0791db03cc4e7357b97cf42a8fe", size = 202119, upload-time = "2023-10-06T19:30:51.304Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ea/63/da7237f805089ecc28a3f36bca6a21c31fcbc2eb380f3b8f1be3312abd14/bleach-6.1.0-py3-none-any.whl", hash = "sha256:3225f354cfc436b9789c66c4ee030194bee0568fbf9cbdad3bc8b5c26c5f12b6", size = 162750, upload-time = "2023-10-06T19:30:49.408Z" }, +] + +[package.optional-dependencies] +css = [ + { name = "tinycss2", version = "1.2.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.9'" }, +] + +[[package]] +name = "bleach" +version = "6.2.0" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version == '3.9.*'", +] +dependencies = [ + { name = "webencodings", marker = "python_full_version == '3.9.*'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/76/9a/0e33f5054c54d349ea62c277191c020c2d6ef1d65ab2cb1993f91ec846d1/bleach-6.2.0.tar.gz", hash = "sha256:123e894118b8a599fd80d3ec1a6d4cc7ce4e5882b1317a7e1ba69b56e95f991f", size = 203083, upload-time = "2024-10-29T18:30:40.477Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/fc/55/96142937f66150805c25c4d0f31ee4132fd33497753400734f9dfdcbdc66/bleach-6.2.0-py3-none-any.whl", hash = "sha256:117d9c6097a7c3d22fd578fcd8d35ff1e125df6736f554da4e432fdd63f31e5e", size = 163406, upload-time = "2024-10-29T18:30:38.186Z" }, +] + +[package.optional-dependencies] +css = [ + { name = "tinycss2", version = "1.4.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version == '3.9.*'" }, +] + +[[package]] +name = "bleach" +version = "6.3.0" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version >= '3.14'", + "python_full_version >= '3.11' and python_full_version < '3.14'", + "python_full_version == '3.10.*'", +] +dependencies = [ + { name = "webencodings", marker = "python_full_version >= '3.10'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/07/18/3c8523962314be6bf4c8989c79ad9531c825210dd13a8669f6b84336e8bd/bleach-6.3.0.tar.gz", hash = "sha256:6f3b91b1c0a02bb9a78b5a454c92506aa0fdf197e1d5e114d2e00c6f64306d22", size = 203533, upload-time = "2025-10-27T17:57:39.211Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/cd/3a/577b549de0cc09d95f11087ee63c739bba856cd3952697eec4c4bb91350a/bleach-6.3.0-py3-none-any.whl", hash = "sha256:fe10ec77c93ddf3d13a73b035abaac7a9f5e436513864ccdad516693213c65d6", size = 164437, upload-time = "2025-10-27T17:57:37.538Z" }, +] + +[package.optional-dependencies] +css = [ + { name = "tinycss2", version = "1.4.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.10'" }, +] + +[[package]] +name = "build" +version = "1.2.2.post1" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version < '3.9'", +] +dependencies = [ + { name = "colorama", marker = "python_full_version < '3.9' and os_name == 'nt'" }, + { name = "importlib-metadata", version = "8.5.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.9'" }, + { name = "packaging", marker = "python_full_version < '3.9'" }, + { name = "pyproject-hooks", marker = "python_full_version < '3.9'" }, + { name = "tomli", marker = "python_full_version < '3.9'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/7d/46/aeab111f8e06793e4f0e421fcad593d547fb8313b50990f31681ee2fb1ad/build-1.2.2.post1.tar.gz", hash = "sha256:b36993e92ca9375a219c99e606a122ff365a760a2d4bba0caa09bd5278b608b7", size = 46701, upload-time = "2024-10-06T17:22:25.251Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/84/c2/80633736cd183ee4a62107413def345f7e6e3c01563dbca1417363cf957e/build-1.2.2.post1-py3-none-any.whl", hash = "sha256:1d61c0887fa860c01971625baae8bdd338e517b836a2f70dd1f7aa3a6b2fc5b5", size = 22950, upload-time = "2024-10-06T17:22:23.299Z" }, +] + +[[package]] +name = "build" +version = "1.3.0" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version >= '3.14'", + "python_full_version >= '3.11' and python_full_version < '3.14'", + "python_full_version == '3.10.*'", + "python_full_version == '3.9.*'", +] +dependencies = [ + { name = "colorama", marker = "python_full_version >= '3.9' and os_name == 'nt'" }, + { name = "importlib-metadata", version = "8.7.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.9' and python_full_version < '3.10.2'" }, + { name = "packaging", marker = "python_full_version >= '3.9'" }, + { name = "pyproject-hooks", marker = "python_full_version >= '3.9'" }, + { name = "tomli", marker = "python_full_version >= '3.9' and python_full_version < '3.11'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/25/1c/23e33405a7c9eac261dff640926b8b5adaed6a6eb3e1767d441ed611d0c0/build-1.3.0.tar.gz", hash = "sha256:698edd0ea270bde950f53aed21f3a0135672206f3911e0176261a31e0e07b397", size = 48544, upload-time = "2025-08-01T21:27:09.268Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/cb/8c/2b30c12155ad8de0cf641d76a8b396a16d2c36bc6d50b621a62b7c4567c1/build-1.3.0-py3-none-any.whl", hash = "sha256:7145f0b5061ba90a1500d60bd1b13ca0a8a4cebdd0cc16ed8adf1c0e739f43b4", size = 23382, upload-time = "2025-08-01T21:27:07.844Z" }, +] + +[[package]] +name = "certifi" +version = "2025.11.12" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/a2/8c/58f469717fa48465e4a50c014a0400602d3c437d7c0c468e17ada824da3a/certifi-2025.11.12.tar.gz", hash = "sha256:d8ab5478f2ecd78af242878415affce761ca6bc54a22a27e026d7c25357c3316", size = 160538, upload-time = "2025-11-12T02:54:51.517Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/70/7d/9bc192684cea499815ff478dfcdc13835ddf401365057044fb721ec6bddb/certifi-2025.11.12-py3-none-any.whl", hash = "sha256:97de8790030bbd5c2d96b7ec782fc2f7820ef8dba6db909ccf95449f2d062d4b", size = 159438, upload-time = "2025-11-12T02:54:49.735Z" }, +] + +[[package]] +name = "cffi" +version = "1.17.1" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version < '3.9'", +] +dependencies = [ + { name = "pycparser", marker = "python_full_version < '3.9'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/fc/97/c783634659c2920c3fc70419e3af40972dbaf758daa229a7d6ea6135c90d/cffi-1.17.1.tar.gz", hash = "sha256:1c39c6016c32bc48dd54561950ebd6836e1670f2ae46128f67cf49e789c52824", size = 516621, upload-time = "2024-09-04T20:45:21.852Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/90/07/f44ca684db4e4f08a3fdc6eeb9a0d15dc6883efc7b8c90357fdbf74e186c/cffi-1.17.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:df8b1c11f177bc2313ec4b2d46baec87a5f3e71fc8b45dab2ee7cae86d9aba14", size = 182191, upload-time = "2024-09-04T20:43:30.027Z" }, + { url = "https://files.pythonhosted.org/packages/08/fd/cc2fedbd887223f9f5d170c96e57cbf655df9831a6546c1727ae13fa977a/cffi-1.17.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:8f2cdc858323644ab277e9bb925ad72ae0e67f69e804f4898c070998d50b1a67", size = 178592, upload-time = "2024-09-04T20:43:32.108Z" }, + { url = "https://files.pythonhosted.org/packages/de/cc/4635c320081c78d6ffc2cab0a76025b691a91204f4aa317d568ff9280a2d/cffi-1.17.1-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:edae79245293e15384b51f88b00613ba9f7198016a5948b5dddf4917d4d26382", size = 426024, upload-time = "2024-09-04T20:43:34.186Z" }, + { url = "https://files.pythonhosted.org/packages/b6/7b/3b2b250f3aab91abe5f8a51ada1b717935fdaec53f790ad4100fe2ec64d1/cffi-1.17.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:45398b671ac6d70e67da8e4224a065cec6a93541bb7aebe1b198a61b58c7b702", size = 448188, upload-time = "2024-09-04T20:43:36.286Z" }, + { url = "https://files.pythonhosted.org/packages/d3/48/1b9283ebbf0ec065148d8de05d647a986c5f22586b18120020452fff8f5d/cffi-1.17.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ad9413ccdeda48c5afdae7e4fa2192157e991ff761e7ab8fdd8926f40b160cc3", size = 455571, upload-time = "2024-09-04T20:43:38.586Z" }, + { url = "https://files.pythonhosted.org/packages/40/87/3b8452525437b40f39ca7ff70276679772ee7e8b394934ff60e63b7b090c/cffi-1.17.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5da5719280082ac6bd9aa7becb3938dc9f9cbd57fac7d2871717b1feb0902ab6", size = 436687, upload-time = "2024-09-04T20:43:40.084Z" }, + { url = "https://files.pythonhosted.org/packages/8d/fb/4da72871d177d63649ac449aec2e8a29efe0274035880c7af59101ca2232/cffi-1.17.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2bb1a08b8008b281856e5971307cc386a8e9c5b625ac297e853d36da6efe9c17", size = 446211, upload-time = "2024-09-04T20:43:41.526Z" }, + { url = "https://files.pythonhosted.org/packages/ab/a0/62f00bcb411332106c02b663b26f3545a9ef136f80d5df746c05878f8c4b/cffi-1.17.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:045d61c734659cc045141be4bae381a41d89b741f795af1dd018bfb532fd0df8", size = 461325, upload-time = "2024-09-04T20:43:43.117Z" }, + { url = "https://files.pythonhosted.org/packages/36/83/76127035ed2e7e27b0787604d99da630ac3123bfb02d8e80c633f218a11d/cffi-1.17.1-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:6883e737d7d9e4899a8a695e00ec36bd4e5e4f18fabe0aca0efe0a4b44cdb13e", size = 438784, upload-time = "2024-09-04T20:43:45.256Z" }, + { url = "https://files.pythonhosted.org/packages/21/81/a6cd025db2f08ac88b901b745c163d884641909641f9b826e8cb87645942/cffi-1.17.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:6b8b4a92e1c65048ff98cfe1f735ef8f1ceb72e3d5f0c25fdb12087a23da22be", size = 461564, upload-time = "2024-09-04T20:43:46.779Z" }, + { url = "https://files.pythonhosted.org/packages/f8/fe/4d41c2f200c4a457933dbd98d3cf4e911870877bd94d9656cc0fcb390681/cffi-1.17.1-cp310-cp310-win32.whl", hash = "sha256:c9c3d058ebabb74db66e431095118094d06abf53284d9c81f27300d0e0d8bc7c", size = 171804, upload-time = "2024-09-04T20:43:48.186Z" }, + { url = "https://files.pythonhosted.org/packages/d1/b6/0b0f5ab93b0df4acc49cae758c81fe4e5ef26c3ae2e10cc69249dfd8b3ab/cffi-1.17.1-cp310-cp310-win_amd64.whl", hash = "sha256:0f048dcf80db46f0098ccac01132761580d28e28bc0f78ae0d58048063317e15", size = 181299, upload-time = "2024-09-04T20:43:49.812Z" }, + { url = "https://files.pythonhosted.org/packages/6b/f4/927e3a8899e52a27fa57a48607ff7dc91a9ebe97399b357b85a0c7892e00/cffi-1.17.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:a45e3c6913c5b87b3ff120dcdc03f6131fa0065027d0ed7ee6190736a74cd401", size = 182264, upload-time = "2024-09-04T20:43:51.124Z" }, + { url = "https://files.pythonhosted.org/packages/6c/f5/6c3a8efe5f503175aaddcbea6ad0d2c96dad6f5abb205750d1b3df44ef29/cffi-1.17.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:30c5e0cb5ae493c04c8b42916e52ca38079f1b235c2f8ae5f4527b963c401caf", size = 178651, upload-time = "2024-09-04T20:43:52.872Z" }, + { url = "https://files.pythonhosted.org/packages/94/dd/a3f0118e688d1b1a57553da23b16bdade96d2f9bcda4d32e7d2838047ff7/cffi-1.17.1-cp311-cp311-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f75c7ab1f9e4aca5414ed4d8e5c0e303a34f4421f8a0d47a4d019ceff0ab6af4", size = 445259, upload-time = "2024-09-04T20:43:56.123Z" }, + { url = "https://files.pythonhosted.org/packages/2e/ea/70ce63780f096e16ce8588efe039d3c4f91deb1dc01e9c73a287939c79a6/cffi-1.17.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a1ed2dd2972641495a3ec98445e09766f077aee98a1c896dcb4ad0d303628e41", size = 469200, upload-time = "2024-09-04T20:43:57.891Z" }, + { url = "https://files.pythonhosted.org/packages/1c/a0/a4fa9f4f781bda074c3ddd57a572b060fa0df7655d2a4247bbe277200146/cffi-1.17.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:46bf43160c1a35f7ec506d254e5c890f3c03648a4dbac12d624e4490a7046cd1", size = 477235, upload-time = "2024-09-04T20:44:00.18Z" }, + { url = "https://files.pythonhosted.org/packages/62/12/ce8710b5b8affbcdd5c6e367217c242524ad17a02fe5beec3ee339f69f85/cffi-1.17.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a24ed04c8ffd54b0729c07cee15a81d964e6fee0e3d4d342a27b020d22959dc6", size = 459721, upload-time = "2024-09-04T20:44:01.585Z" }, + { url = "https://files.pythonhosted.org/packages/ff/6b/d45873c5e0242196f042d555526f92aa9e0c32355a1be1ff8c27f077fd37/cffi-1.17.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:610faea79c43e44c71e1ec53a554553fa22321b65fae24889706c0a84d4ad86d", size = 467242, upload-time = "2024-09-04T20:44:03.467Z" }, + { url = "https://files.pythonhosted.org/packages/1a/52/d9a0e523a572fbccf2955f5abe883cfa8bcc570d7faeee06336fbd50c9fc/cffi-1.17.1-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:a9b15d491f3ad5d692e11f6b71f7857e7835eb677955c00cc0aefcd0669adaf6", size = 477999, upload-time = "2024-09-04T20:44:05.023Z" }, + { url = "https://files.pythonhosted.org/packages/44/74/f2a2460684a1a2d00ca799ad880d54652841a780c4c97b87754f660c7603/cffi-1.17.1-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:de2ea4b5833625383e464549fec1bc395c1bdeeb5f25c4a3a82b5a8c756ec22f", size = 454242, upload-time = "2024-09-04T20:44:06.444Z" }, + { url = "https://files.pythonhosted.org/packages/f8/4a/34599cac7dfcd888ff54e801afe06a19c17787dfd94495ab0c8d35fe99fb/cffi-1.17.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:fc48c783f9c87e60831201f2cce7f3b2e4846bf4d8728eabe54d60700b318a0b", size = 478604, upload-time = "2024-09-04T20:44:08.206Z" }, + { url = "https://files.pythonhosted.org/packages/34/33/e1b8a1ba29025adbdcda5fb3a36f94c03d771c1b7b12f726ff7fef2ebe36/cffi-1.17.1-cp311-cp311-win32.whl", hash = "sha256:85a950a4ac9c359340d5963966e3e0a94a676bd6245a4b55bc43949eee26a655", size = 171727, upload-time = "2024-09-04T20:44:09.481Z" }, + { url = "https://files.pythonhosted.org/packages/3d/97/50228be003bb2802627d28ec0627837ac0bf35c90cf769812056f235b2d1/cffi-1.17.1-cp311-cp311-win_amd64.whl", hash = "sha256:caaf0640ef5f5517f49bc275eca1406b0ffa6aa184892812030f04c2abf589a0", size = 181400, upload-time = "2024-09-04T20:44:10.873Z" }, + { url = "https://files.pythonhosted.org/packages/5a/84/e94227139ee5fb4d600a7a4927f322e1d4aea6fdc50bd3fca8493caba23f/cffi-1.17.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:805b4371bf7197c329fcb3ead37e710d1bca9da5d583f5073b799d5c5bd1eee4", size = 183178, upload-time = "2024-09-04T20:44:12.232Z" }, + { url = "https://files.pythonhosted.org/packages/da/ee/fb72c2b48656111c4ef27f0f91da355e130a923473bf5ee75c5643d00cca/cffi-1.17.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:733e99bc2df47476e3848417c5a4540522f234dfd4ef3ab7fafdf555b082ec0c", size = 178840, upload-time = "2024-09-04T20:44:13.739Z" }, + { url = "https://files.pythonhosted.org/packages/cc/b6/db007700f67d151abadf508cbfd6a1884f57eab90b1bb985c4c8c02b0f28/cffi-1.17.1-cp312-cp312-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1257bdabf294dceb59f5e70c64a3e2f462c30c7ad68092d01bbbfb1c16b1ba36", size = 454803, upload-time = "2024-09-04T20:44:15.231Z" }, + { url = "https://files.pythonhosted.org/packages/1a/df/f8d151540d8c200eb1c6fba8cd0dfd40904f1b0682ea705c36e6c2e97ab3/cffi-1.17.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:da95af8214998d77a98cc14e3a3bd00aa191526343078b530ceb0bd710fb48a5", size = 478850, upload-time = "2024-09-04T20:44:17.188Z" }, + { url = "https://files.pythonhosted.org/packages/28/c0/b31116332a547fd2677ae5b78a2ef662dfc8023d67f41b2a83f7c2aa78b1/cffi-1.17.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d63afe322132c194cf832bfec0dc69a99fb9bb6bbd550f161a49e9e855cc78ff", size = 485729, upload-time = "2024-09-04T20:44:18.688Z" }, + { url = "https://files.pythonhosted.org/packages/91/2b/9a1ddfa5c7f13cab007a2c9cc295b70fbbda7cb10a286aa6810338e60ea1/cffi-1.17.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f79fc4fc25f1c8698ff97788206bb3c2598949bfe0fef03d299eb1b5356ada99", size = 471256, upload-time = "2024-09-04T20:44:20.248Z" }, + { url = "https://files.pythonhosted.org/packages/b2/d5/da47df7004cb17e4955df6a43d14b3b4ae77737dff8bf7f8f333196717bf/cffi-1.17.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b62ce867176a75d03a665bad002af8e6d54644fad99a3c70905c543130e39d93", size = 479424, upload-time = "2024-09-04T20:44:21.673Z" }, + { url = "https://files.pythonhosted.org/packages/0b/ac/2a28bcf513e93a219c8a4e8e125534f4f6db03e3179ba1c45e949b76212c/cffi-1.17.1-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:386c8bf53c502fff58903061338ce4f4950cbdcb23e2902d86c0f722b786bbe3", size = 484568, upload-time = "2024-09-04T20:44:23.245Z" }, + { url = "https://files.pythonhosted.org/packages/d4/38/ca8a4f639065f14ae0f1d9751e70447a261f1a30fa7547a828ae08142465/cffi-1.17.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:4ceb10419a9adf4460ea14cfd6bc43d08701f0835e979bf821052f1805850fe8", size = 488736, upload-time = "2024-09-04T20:44:24.757Z" }, + { url = "https://files.pythonhosted.org/packages/86/c5/28b2d6f799ec0bdecf44dced2ec5ed43e0eb63097b0f58c293583b406582/cffi-1.17.1-cp312-cp312-win32.whl", hash = "sha256:a08d7e755f8ed21095a310a693525137cfe756ce62d066e53f502a83dc550f65", size = 172448, upload-time = "2024-09-04T20:44:26.208Z" }, + { url = "https://files.pythonhosted.org/packages/50/b9/db34c4755a7bd1cb2d1603ac3863f22bcecbd1ba29e5ee841a4bc510b294/cffi-1.17.1-cp312-cp312-win_amd64.whl", hash = "sha256:51392eae71afec0d0c8fb1a53b204dbb3bcabcb3c9b807eedf3e1e6ccf2de903", size = 181976, upload-time = "2024-09-04T20:44:27.578Z" }, + { url = "https://files.pythonhosted.org/packages/8d/f8/dd6c246b148639254dad4d6803eb6a54e8c85c6e11ec9df2cffa87571dbe/cffi-1.17.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:f3a2b4222ce6b60e2e8b337bb9596923045681d71e5a082783484d845390938e", size = 182989, upload-time = "2024-09-04T20:44:28.956Z" }, + { url = "https://files.pythonhosted.org/packages/8b/f1/672d303ddf17c24fc83afd712316fda78dc6fce1cd53011b839483e1ecc8/cffi-1.17.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:0984a4925a435b1da406122d4d7968dd861c1385afe3b45ba82b750f229811e2", size = 178802, upload-time = "2024-09-04T20:44:30.289Z" }, + { url = "https://files.pythonhosted.org/packages/0e/2d/eab2e858a91fdff70533cab61dcff4a1f55ec60425832ddfdc9cd36bc8af/cffi-1.17.1-cp313-cp313-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d01b12eeeb4427d3110de311e1774046ad344f5b1a7403101878976ecd7a10f3", size = 454792, upload-time = "2024-09-04T20:44:32.01Z" }, + { url = "https://files.pythonhosted.org/packages/75/b2/fbaec7c4455c604e29388d55599b99ebcc250a60050610fadde58932b7ee/cffi-1.17.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:706510fe141c86a69c8ddc029c7910003a17353970cff3b904ff0686a5927683", size = 478893, upload-time = "2024-09-04T20:44:33.606Z" }, + { url = "https://files.pythonhosted.org/packages/4f/b7/6e4a2162178bf1935c336d4da8a9352cccab4d3a5d7914065490f08c0690/cffi-1.17.1-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:de55b766c7aa2e2a3092c51e0483d700341182f08e67c63630d5b6f200bb28e5", size = 485810, upload-time = "2024-09-04T20:44:35.191Z" }, + { url = "https://files.pythonhosted.org/packages/c7/8a/1d0e4a9c26e54746dc08c2c6c037889124d4f59dffd853a659fa545f1b40/cffi-1.17.1-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c59d6e989d07460165cc5ad3c61f9fd8f1b4796eacbd81cee78957842b834af4", size = 471200, upload-time = "2024-09-04T20:44:36.743Z" }, + { url = "https://files.pythonhosted.org/packages/26/9f/1aab65a6c0db35f43c4d1b4f580e8df53914310afc10ae0397d29d697af4/cffi-1.17.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dd398dbc6773384a17fe0d3e7eeb8d1a21c2200473ee6806bb5e6a8e62bb73dd", size = 479447, upload-time = "2024-09-04T20:44:38.492Z" }, + { url = "https://files.pythonhosted.org/packages/5f/e4/fb8b3dd8dc0e98edf1135ff067ae070bb32ef9d509d6cb0f538cd6f7483f/cffi-1.17.1-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:3edc8d958eb099c634dace3c7e16560ae474aa3803a5df240542b305d14e14ed", size = 484358, upload-time = "2024-09-04T20:44:40.046Z" }, + { url = "https://files.pythonhosted.org/packages/f1/47/d7145bf2dc04684935d57d67dff9d6d795b2ba2796806bb109864be3a151/cffi-1.17.1-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:72e72408cad3d5419375fc87d289076ee319835bdfa2caad331e377589aebba9", size = 488469, upload-time = "2024-09-04T20:44:41.616Z" }, + { url = "https://files.pythonhosted.org/packages/bf/ee/f94057fa6426481d663b88637a9a10e859e492c73d0384514a17d78ee205/cffi-1.17.1-cp313-cp313-win32.whl", hash = "sha256:e03eab0a8677fa80d646b5ddece1cbeaf556c313dcfac435ba11f107ba117b5d", size = 172475, upload-time = "2024-09-04T20:44:43.733Z" }, + { url = "https://files.pythonhosted.org/packages/7c/fc/6a8cb64e5f0324877d503c854da15d76c1e50eb722e320b15345c4d0c6de/cffi-1.17.1-cp313-cp313-win_amd64.whl", hash = "sha256:f6a16c31041f09ead72d69f583767292f750d24913dadacf5756b966aacb3f1a", size = 182009, upload-time = "2024-09-04T20:44:45.309Z" }, + { url = "https://files.pythonhosted.org/packages/48/08/15bf6b43ae9bd06f6b00ad8a91f5a8fe1069d4c9fab550a866755402724e/cffi-1.17.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:636062ea65bd0195bc012fea9321aca499c0504409f413dc88af450b57ffd03b", size = 182457, upload-time = "2024-09-04T20:44:47.892Z" }, + { url = "https://files.pythonhosted.org/packages/c2/5b/f1523dd545f92f7df468e5f653ffa4df30ac222f3c884e51e139878f1cb5/cffi-1.17.1-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c7eac2ef9b63c79431bc4b25f1cd649d7f061a28808cbc6c47b534bd789ef964", size = 425932, upload-time = "2024-09-04T20:44:49.491Z" }, + { url = "https://files.pythonhosted.org/packages/53/93/7e547ab4105969cc8c93b38a667b82a835dd2cc78f3a7dad6130cfd41e1d/cffi-1.17.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e221cf152cff04059d011ee126477f0d9588303eb57e88923578ace7baad17f9", size = 448585, upload-time = "2024-09-04T20:44:51.671Z" }, + { url = "https://files.pythonhosted.org/packages/56/c4/a308f2c332006206bb511de219efeff090e9d63529ba0a77aae72e82248b/cffi-1.17.1-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:31000ec67d4221a71bd3f67df918b1f88f676f1c3b535a7eb473255fdc0b83fc", size = 456268, upload-time = "2024-09-04T20:44:53.51Z" }, + { url = "https://files.pythonhosted.org/packages/ca/5b/b63681518265f2f4060d2b60755c1c77ec89e5e045fc3773b72735ddaad5/cffi-1.17.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:6f17be4345073b0a7b8ea599688f692ac3ef23ce28e5df79c04de519dbc4912c", size = 436592, upload-time = "2024-09-04T20:44:55.085Z" }, + { url = "https://files.pythonhosted.org/packages/bb/19/b51af9f4a4faa4a8ac5a0e5d5c2522dcd9703d07fac69da34a36c4d960d3/cffi-1.17.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0e2b1fac190ae3ebfe37b979cc1ce69c81f4e4fe5746bb401dca63a9062cdaf1", size = 446512, upload-time = "2024-09-04T20:44:57.135Z" }, + { url = "https://files.pythonhosted.org/packages/e2/63/2bed8323890cb613bbecda807688a31ed11a7fe7afe31f8faaae0206a9a3/cffi-1.17.1-cp38-cp38-win32.whl", hash = "sha256:7596d6620d3fa590f677e9ee430df2958d2d6d6de2feeae5b20e82c00b76fbf8", size = 171576, upload-time = "2024-09-04T20:44:58.535Z" }, + { url = "https://files.pythonhosted.org/packages/2f/70/80c33b044ebc79527447fd4fbc5455d514c3bb840dede4455de97da39b4d/cffi-1.17.1-cp38-cp38-win_amd64.whl", hash = "sha256:78122be759c3f8a014ce010908ae03364d00a1f81ab5c7f4a7a5120607ea56e1", size = 181229, upload-time = "2024-09-04T20:44:59.963Z" }, + { url = "https://files.pythonhosted.org/packages/b9/ea/8bb50596b8ffbc49ddd7a1ad305035daa770202a6b782fc164647c2673ad/cffi-1.17.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:b2ab587605f4ba0bf81dc0cb08a41bd1c0a5906bd59243d56bad7668a6fc6c16", size = 182220, upload-time = "2024-09-04T20:45:01.577Z" }, + { url = "https://files.pythonhosted.org/packages/ae/11/e77c8cd24f58285a82c23af484cf5b124a376b32644e445960d1a4654c3a/cffi-1.17.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:28b16024becceed8c6dfbc75629e27788d8a3f9030691a1dbf9821a128b22c36", size = 178605, upload-time = "2024-09-04T20:45:03.837Z" }, + { url = "https://files.pythonhosted.org/packages/ed/65/25a8dc32c53bf5b7b6c2686b42ae2ad58743f7ff644844af7cdb29b49361/cffi-1.17.1-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1d599671f396c4723d016dbddb72fe8e0397082b0a77a4fab8028923bec050e8", size = 424910, upload-time = "2024-09-04T20:45:05.315Z" }, + { url = "https://files.pythonhosted.org/packages/42/7a/9d086fab7c66bd7c4d0f27c57a1b6b068ced810afc498cc8c49e0088661c/cffi-1.17.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ca74b8dbe6e8e8263c0ffd60277de77dcee6c837a3d0881d8c1ead7268c9e576", size = 447200, upload-time = "2024-09-04T20:45:06.903Z" }, + { url = "https://files.pythonhosted.org/packages/da/63/1785ced118ce92a993b0ec9e0d0ac8dc3e5dbfbcaa81135be56c69cabbb6/cffi-1.17.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f7f5baafcc48261359e14bcd6d9bff6d4b28d9103847c9e136694cb0501aef87", size = 454565, upload-time = "2024-09-04T20:45:08.975Z" }, + { url = "https://files.pythonhosted.org/packages/74/06/90b8a44abf3556599cdec107f7290277ae8901a58f75e6fe8f970cd72418/cffi-1.17.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:98e3969bcff97cae1b2def8ba499ea3d6f31ddfdb7635374834cf89a1a08ecf0", size = 435635, upload-time = "2024-09-04T20:45:10.64Z" }, + { url = "https://files.pythonhosted.org/packages/bd/62/a1f468e5708a70b1d86ead5bab5520861d9c7eacce4a885ded9faa7729c3/cffi-1.17.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cdf5ce3acdfd1661132f2a9c19cac174758dc2352bfe37d98aa7512c6b7178b3", size = 445218, upload-time = "2024-09-04T20:45:12.366Z" }, + { url = "https://files.pythonhosted.org/packages/5b/95/b34462f3ccb09c2594aa782d90a90b045de4ff1f70148ee79c69d37a0a5a/cffi-1.17.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:9755e4345d1ec879e3849e62222a18c7174d65a6a92d5b346b1863912168b595", size = 460486, upload-time = "2024-09-04T20:45:13.935Z" }, + { url = "https://files.pythonhosted.org/packages/fc/fc/a1e4bebd8d680febd29cf6c8a40067182b64f00c7d105f8f26b5bc54317b/cffi-1.17.1-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:f1e22e8c4419538cb197e4dd60acc919d7696e5ef98ee4da4e01d3f8cfa4cc5a", size = 437911, upload-time = "2024-09-04T20:45:15.696Z" }, + { url = "https://files.pythonhosted.org/packages/e6/c3/21cab7a6154b6a5ea330ae80de386e7665254835b9e98ecc1340b3a7de9a/cffi-1.17.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:c03e868a0b3bc35839ba98e74211ed2b05d2119be4e8a0f224fba9384f1fe02e", size = 460632, upload-time = "2024-09-04T20:45:17.284Z" }, + { url = "https://files.pythonhosted.org/packages/cb/b5/fd9f8b5a84010ca169ee49f4e4ad6f8c05f4e3545b72ee041dbbcb159882/cffi-1.17.1-cp39-cp39-win32.whl", hash = "sha256:e31ae45bc2e29f6b2abd0de1cc3b9d5205aa847cafaecb8af1476a609a2f6eb7", size = 171820, upload-time = "2024-09-04T20:45:18.762Z" }, + { url = "https://files.pythonhosted.org/packages/8c/52/b08750ce0bce45c143e1b5d7357ee8c55341b52bdef4b0f081af1eb248c2/cffi-1.17.1-cp39-cp39-win_amd64.whl", hash = "sha256:d016c76bdd850f3c626af19b0542c9677ba156e4ee4fccfdd7848803533ef662", size = 181290, upload-time = "2024-09-04T20:45:20.226Z" }, +] + +[[package]] +name = "cffi" +version = "2.0.0" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version >= '3.14'", + "python_full_version >= '3.11' and python_full_version < '3.14'", + "python_full_version == '3.10.*'", + "python_full_version == '3.9.*'", +] +dependencies = [ + { name = "pycparser", marker = "python_full_version >= '3.9' and implementation_name != 'PyPy'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/eb/56/b1ba7935a17738ae8453301356628e8147c79dbb825bcbc73dc7401f9846/cffi-2.0.0.tar.gz", hash = "sha256:44d1b5909021139fe36001ae048dbdde8214afa20200eda0f64c068cac5d5529", size = 523588, upload-time = "2025-09-08T23:24:04.541Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/93/d7/516d984057745a6cd96575eea814fe1edd6646ee6efd552fb7b0921dec83/cffi-2.0.0-cp310-cp310-macosx_10_13_x86_64.whl", hash = "sha256:0cf2d91ecc3fcc0625c2c530fe004f82c110405f101548512cce44322fa8ac44", size = 184283, upload-time = "2025-09-08T23:22:08.01Z" }, + { url = "https://files.pythonhosted.org/packages/9e/84/ad6a0b408daa859246f57c03efd28e5dd1b33c21737c2db84cae8c237aa5/cffi-2.0.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:f73b96c41e3b2adedc34a7356e64c8eb96e03a3782b535e043a986276ce12a49", size = 180504, upload-time = "2025-09-08T23:22:10.637Z" }, + { url = "https://files.pythonhosted.org/packages/50/bd/b1a6362b80628111e6653c961f987faa55262b4002fcec42308cad1db680/cffi-2.0.0-cp310-cp310-manylinux1_i686.manylinux2014_i686.manylinux_2_17_i686.manylinux_2_5_i686.whl", hash = "sha256:53f77cbe57044e88bbd5ed26ac1d0514d2acf0591dd6bb02a3ae37f76811b80c", size = 208811, upload-time = "2025-09-08T23:22:12.267Z" }, + { url = "https://files.pythonhosted.org/packages/4f/27/6933a8b2562d7bd1fb595074cf99cc81fc3789f6a6c05cdabb46284a3188/cffi-2.0.0-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:3e837e369566884707ddaf85fc1744b47575005c0a229de3327f8f9a20f4efeb", size = 216402, upload-time = "2025-09-08T23:22:13.455Z" }, + { url = "https://files.pythonhosted.org/packages/05/eb/b86f2a2645b62adcfff53b0dd97e8dfafb5c8aa864bd0d9a2c2049a0d551/cffi-2.0.0-cp310-cp310-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:5eda85d6d1879e692d546a078b44251cdd08dd1cfb98dfb77b670c97cee49ea0", size = 203217, upload-time = "2025-09-08T23:22:14.596Z" }, + { url = "https://files.pythonhosted.org/packages/9f/e0/6cbe77a53acf5acc7c08cc186c9928864bd7c005f9efd0d126884858a5fe/cffi-2.0.0-cp310-cp310-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:9332088d75dc3241c702d852d4671613136d90fa6881da7d770a483fd05248b4", size = 203079, upload-time = "2025-09-08T23:22:15.769Z" }, + { url = "https://files.pythonhosted.org/packages/98/29/9b366e70e243eb3d14a5cb488dfd3a0b6b2f1fb001a203f653b93ccfac88/cffi-2.0.0-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:fc7de24befaeae77ba923797c7c87834c73648a05a4bde34b3b7e5588973a453", size = 216475, upload-time = "2025-09-08T23:22:17.427Z" }, + { url = "https://files.pythonhosted.org/packages/21/7a/13b24e70d2f90a322f2900c5d8e1f14fa7e2a6b3332b7309ba7b2ba51a5a/cffi-2.0.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:cf364028c016c03078a23b503f02058f1814320a56ad535686f90565636a9495", size = 218829, upload-time = "2025-09-08T23:22:19.069Z" }, + { url = "https://files.pythonhosted.org/packages/60/99/c9dc110974c59cc981b1f5b66e1d8af8af764e00f0293266824d9c4254bc/cffi-2.0.0-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:e11e82b744887154b182fd3e7e8512418446501191994dbf9c9fc1f32cc8efd5", size = 211211, upload-time = "2025-09-08T23:22:20.588Z" }, + { url = "https://files.pythonhosted.org/packages/49/72/ff2d12dbf21aca1b32a40ed792ee6b40f6dc3a9cf1644bd7ef6e95e0ac5e/cffi-2.0.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:8ea985900c5c95ce9db1745f7933eeef5d314f0565b27625d9a10ec9881e1bfb", size = 218036, upload-time = "2025-09-08T23:22:22.143Z" }, + { url = "https://files.pythonhosted.org/packages/e2/cc/027d7fb82e58c48ea717149b03bcadcbdc293553edb283af792bd4bcbb3f/cffi-2.0.0-cp310-cp310-win32.whl", hash = "sha256:1f72fb8906754ac8a2cc3f9f5aaa298070652a0ffae577e0ea9bd480dc3c931a", size = 172184, upload-time = "2025-09-08T23:22:23.328Z" }, + { url = "https://files.pythonhosted.org/packages/33/fa/072dd15ae27fbb4e06b437eb6e944e75b068deb09e2a2826039e49ee2045/cffi-2.0.0-cp310-cp310-win_amd64.whl", hash = "sha256:b18a3ed7d5b3bd8d9ef7a8cb226502c6bf8308df1525e1cc676c3680e7176739", size = 182790, upload-time = "2025-09-08T23:22:24.752Z" }, + { url = "https://files.pythonhosted.org/packages/12/4a/3dfd5f7850cbf0d06dc84ba9aa00db766b52ca38d8b86e3a38314d52498c/cffi-2.0.0-cp311-cp311-macosx_10_13_x86_64.whl", hash = "sha256:b4c854ef3adc177950a8dfc81a86f5115d2abd545751a304c5bcf2c2c7283cfe", size = 184344, upload-time = "2025-09-08T23:22:26.456Z" }, + { url = "https://files.pythonhosted.org/packages/4f/8b/f0e4c441227ba756aafbe78f117485b25bb26b1c059d01f137fa6d14896b/cffi-2.0.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:2de9a304e27f7596cd03d16f1b7c72219bd944e99cc52b84d0145aefb07cbd3c", size = 180560, upload-time = "2025-09-08T23:22:28.197Z" }, + { url = "https://files.pythonhosted.org/packages/b1/b7/1200d354378ef52ec227395d95c2576330fd22a869f7a70e88e1447eb234/cffi-2.0.0-cp311-cp311-manylinux1_i686.manylinux2014_i686.manylinux_2_17_i686.manylinux_2_5_i686.whl", hash = "sha256:baf5215e0ab74c16e2dd324e8ec067ef59e41125d3eade2b863d294fd5035c92", size = 209613, upload-time = "2025-09-08T23:22:29.475Z" }, + { url = "https://files.pythonhosted.org/packages/b8/56/6033f5e86e8cc9bb629f0077ba71679508bdf54a9a5e112a3c0b91870332/cffi-2.0.0-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:730cacb21e1bdff3ce90babf007d0a0917cc3e6492f336c2f0134101e0944f93", size = 216476, upload-time = "2025-09-08T23:22:31.063Z" }, + { url = "https://files.pythonhosted.org/packages/dc/7f/55fecd70f7ece178db2f26128ec41430d8720f2d12ca97bf8f0a628207d5/cffi-2.0.0-cp311-cp311-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:6824f87845e3396029f3820c206e459ccc91760e8fa24422f8b0c3d1731cbec5", size = 203374, upload-time = "2025-09-08T23:22:32.507Z" }, + { url = "https://files.pythonhosted.org/packages/84/ef/a7b77c8bdc0f77adc3b46888f1ad54be8f3b7821697a7b89126e829e676a/cffi-2.0.0-cp311-cp311-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:9de40a7b0323d889cf8d23d1ef214f565ab154443c42737dfe52ff82cf857664", size = 202597, upload-time = "2025-09-08T23:22:34.132Z" }, + { url = "https://files.pythonhosted.org/packages/d7/91/500d892b2bf36529a75b77958edfcd5ad8e2ce4064ce2ecfeab2125d72d1/cffi-2.0.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:8941aaadaf67246224cee8c3803777eed332a19d909b47e29c9842ef1e79ac26", size = 215574, upload-time = "2025-09-08T23:22:35.443Z" }, + { url = "https://files.pythonhosted.org/packages/44/64/58f6255b62b101093d5df22dcb752596066c7e89dd725e0afaed242a61be/cffi-2.0.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:a05d0c237b3349096d3981b727493e22147f934b20f6f125a3eba8f994bec4a9", size = 218971, upload-time = "2025-09-08T23:22:36.805Z" }, + { url = "https://files.pythonhosted.org/packages/ab/49/fa72cebe2fd8a55fbe14956f9970fe8eb1ac59e5df042f603ef7c8ba0adc/cffi-2.0.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:94698a9c5f91f9d138526b48fe26a199609544591f859c870d477351dc7b2414", size = 211972, upload-time = "2025-09-08T23:22:38.436Z" }, + { url = "https://files.pythonhosted.org/packages/0b/28/dd0967a76aab36731b6ebfe64dec4e981aff7e0608f60c2d46b46982607d/cffi-2.0.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:5fed36fccc0612a53f1d4d9a816b50a36702c28a2aa880cb8a122b3466638743", size = 217078, upload-time = "2025-09-08T23:22:39.776Z" }, + { url = "https://files.pythonhosted.org/packages/2b/c0/015b25184413d7ab0a410775fdb4a50fca20f5589b5dab1dbbfa3baad8ce/cffi-2.0.0-cp311-cp311-win32.whl", hash = "sha256:c649e3a33450ec82378822b3dad03cc228b8f5963c0c12fc3b1e0ab940f768a5", size = 172076, upload-time = "2025-09-08T23:22:40.95Z" }, + { url = "https://files.pythonhosted.org/packages/ae/8f/dc5531155e7070361eb1b7e4c1a9d896d0cb21c49f807a6c03fd63fc877e/cffi-2.0.0-cp311-cp311-win_amd64.whl", hash = "sha256:66f011380d0e49ed280c789fbd08ff0d40968ee7b665575489afa95c98196ab5", size = 182820, upload-time = "2025-09-08T23:22:42.463Z" }, + { url = "https://files.pythonhosted.org/packages/95/5c/1b493356429f9aecfd56bc171285a4c4ac8697f76e9bbbbb105e537853a1/cffi-2.0.0-cp311-cp311-win_arm64.whl", hash = "sha256:c6638687455baf640e37344fe26d37c404db8b80d037c3d29f58fe8d1c3b194d", size = 177635, upload-time = "2025-09-08T23:22:43.623Z" }, + { url = "https://files.pythonhosted.org/packages/ea/47/4f61023ea636104d4f16ab488e268b93008c3d0bb76893b1b31db1f96802/cffi-2.0.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:6d02d6655b0e54f54c4ef0b94eb6be0607b70853c45ce98bd278dc7de718be5d", size = 185271, upload-time = "2025-09-08T23:22:44.795Z" }, + { url = "https://files.pythonhosted.org/packages/df/a2/781b623f57358e360d62cdd7a8c681f074a71d445418a776eef0aadb4ab4/cffi-2.0.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:8eca2a813c1cb7ad4fb74d368c2ffbbb4789d377ee5bb8df98373c2cc0dee76c", size = 181048, upload-time = "2025-09-08T23:22:45.938Z" }, + { url = "https://files.pythonhosted.org/packages/ff/df/a4f0fbd47331ceeba3d37c2e51e9dfc9722498becbeec2bd8bc856c9538a/cffi-2.0.0-cp312-cp312-manylinux1_i686.manylinux2014_i686.manylinux_2_17_i686.manylinux_2_5_i686.whl", hash = "sha256:21d1152871b019407d8ac3985f6775c079416c282e431a4da6afe7aefd2bccbe", size = 212529, upload-time = "2025-09-08T23:22:47.349Z" }, + { url = "https://files.pythonhosted.org/packages/d5/72/12b5f8d3865bf0f87cf1404d8c374e7487dcf097a1c91c436e72e6badd83/cffi-2.0.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:b21e08af67b8a103c71a250401c78d5e0893beff75e28c53c98f4de42f774062", size = 220097, upload-time = "2025-09-08T23:22:48.677Z" }, + { url = "https://files.pythonhosted.org/packages/c2/95/7a135d52a50dfa7c882ab0ac17e8dc11cec9d55d2c18dda414c051c5e69e/cffi-2.0.0-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:1e3a615586f05fc4065a8b22b8152f0c1b00cdbc60596d187c2a74f9e3036e4e", size = 207983, upload-time = "2025-09-08T23:22:50.06Z" }, + { url = "https://files.pythonhosted.org/packages/3a/c8/15cb9ada8895957ea171c62dc78ff3e99159ee7adb13c0123c001a2546c1/cffi-2.0.0-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:81afed14892743bbe14dacb9e36d9e0e504cd204e0b165062c488942b9718037", size = 206519, upload-time = "2025-09-08T23:22:51.364Z" }, + { url = "https://files.pythonhosted.org/packages/78/2d/7fa73dfa841b5ac06c7b8855cfc18622132e365f5b81d02230333ff26e9e/cffi-2.0.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:3e17ed538242334bf70832644a32a7aae3d83b57567f9fd60a26257e992b79ba", size = 219572, upload-time = "2025-09-08T23:22:52.902Z" }, + { url = "https://files.pythonhosted.org/packages/07/e0/267e57e387b4ca276b90f0434ff88b2c2241ad72b16d31836adddfd6031b/cffi-2.0.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:3925dd22fa2b7699ed2617149842d2e6adde22b262fcbfada50e3d195e4b3a94", size = 222963, upload-time = "2025-09-08T23:22:54.518Z" }, + { url = "https://files.pythonhosted.org/packages/b6/75/1f2747525e06f53efbd878f4d03bac5b859cbc11c633d0fb81432d98a795/cffi-2.0.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:2c8f814d84194c9ea681642fd164267891702542f028a15fc97d4674b6206187", size = 221361, upload-time = "2025-09-08T23:22:55.867Z" }, + { url = "https://files.pythonhosted.org/packages/7b/2b/2b6435f76bfeb6bbf055596976da087377ede68df465419d192acf00c437/cffi-2.0.0-cp312-cp312-win32.whl", hash = "sha256:da902562c3e9c550df360bfa53c035b2f241fed6d9aef119048073680ace4a18", size = 172932, upload-time = "2025-09-08T23:22:57.188Z" }, + { url = "https://files.pythonhosted.org/packages/f8/ed/13bd4418627013bec4ed6e54283b1959cf6db888048c7cf4b4c3b5b36002/cffi-2.0.0-cp312-cp312-win_amd64.whl", hash = "sha256:da68248800ad6320861f129cd9c1bf96ca849a2771a59e0344e88681905916f5", size = 183557, upload-time = "2025-09-08T23:22:58.351Z" }, + { url = "https://files.pythonhosted.org/packages/95/31/9f7f93ad2f8eff1dbc1c3656d7ca5bfd8fb52c9d786b4dcf19b2d02217fa/cffi-2.0.0-cp312-cp312-win_arm64.whl", hash = "sha256:4671d9dd5ec934cb9a73e7ee9676f9362aba54f7f34910956b84d727b0d73fb6", size = 177762, upload-time = "2025-09-08T23:22:59.668Z" }, + { url = "https://files.pythonhosted.org/packages/4b/8d/a0a47a0c9e413a658623d014e91e74a50cdd2c423f7ccfd44086ef767f90/cffi-2.0.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:00bdf7acc5f795150faa6957054fbbca2439db2f775ce831222b66f192f03beb", size = 185230, upload-time = "2025-09-08T23:23:00.879Z" }, + { url = "https://files.pythonhosted.org/packages/4a/d2/a6c0296814556c68ee32009d9c2ad4f85f2707cdecfd7727951ec228005d/cffi-2.0.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:45d5e886156860dc35862657e1494b9bae8dfa63bf56796f2fb56e1679fc0bca", size = 181043, upload-time = "2025-09-08T23:23:02.231Z" }, + { url = "https://files.pythonhosted.org/packages/b0/1e/d22cc63332bd59b06481ceaac49d6c507598642e2230f201649058a7e704/cffi-2.0.0-cp313-cp313-manylinux1_i686.manylinux2014_i686.manylinux_2_17_i686.manylinux_2_5_i686.whl", hash = "sha256:07b271772c100085dd28b74fa0cd81c8fb1a3ba18b21e03d7c27f3436a10606b", size = 212446, upload-time = "2025-09-08T23:23:03.472Z" }, + { url = "https://files.pythonhosted.org/packages/a9/f5/a2c23eb03b61a0b8747f211eb716446c826ad66818ddc7810cc2cc19b3f2/cffi-2.0.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:d48a880098c96020b02d5a1f7d9251308510ce8858940e6fa99ece33f610838b", size = 220101, upload-time = "2025-09-08T23:23:04.792Z" }, + { url = "https://files.pythonhosted.org/packages/f2/7f/e6647792fc5850d634695bc0e6ab4111ae88e89981d35ac269956605feba/cffi-2.0.0-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:f93fd8e5c8c0a4aa1f424d6173f14a892044054871c771f8566e4008eaa359d2", size = 207948, upload-time = "2025-09-08T23:23:06.127Z" }, + { url = "https://files.pythonhosted.org/packages/cb/1e/a5a1bd6f1fb30f22573f76533de12a00bf274abcdc55c8edab639078abb6/cffi-2.0.0-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:dd4f05f54a52fb558f1ba9f528228066954fee3ebe629fc1660d874d040ae5a3", size = 206422, upload-time = "2025-09-08T23:23:07.753Z" }, + { url = "https://files.pythonhosted.org/packages/98/df/0a1755e750013a2081e863e7cd37e0cdd02664372c754e5560099eb7aa44/cffi-2.0.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:c8d3b5532fc71b7a77c09192b4a5a200ea992702734a2e9279a37f2478236f26", size = 219499, upload-time = "2025-09-08T23:23:09.648Z" }, + { url = "https://files.pythonhosted.org/packages/50/e1/a969e687fcf9ea58e6e2a928ad5e2dd88cc12f6f0ab477e9971f2309b57c/cffi-2.0.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:d9b29c1f0ae438d5ee9acb31cadee00a58c46cc9c0b2f9038c6b0b3470877a8c", size = 222928, upload-time = "2025-09-08T23:23:10.928Z" }, + { url = "https://files.pythonhosted.org/packages/36/54/0362578dd2c9e557a28ac77698ed67323ed5b9775ca9d3fe73fe191bb5d8/cffi-2.0.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:6d50360be4546678fc1b79ffe7a66265e28667840010348dd69a314145807a1b", size = 221302, upload-time = "2025-09-08T23:23:12.42Z" }, + { url = "https://files.pythonhosted.org/packages/eb/6d/bf9bda840d5f1dfdbf0feca87fbdb64a918a69bca42cfa0ba7b137c48cb8/cffi-2.0.0-cp313-cp313-win32.whl", hash = "sha256:74a03b9698e198d47562765773b4a8309919089150a0bb17d829ad7b44b60d27", size = 172909, upload-time = "2025-09-08T23:23:14.32Z" }, + { url = "https://files.pythonhosted.org/packages/37/18/6519e1ee6f5a1e579e04b9ddb6f1676c17368a7aba48299c3759bbc3c8b3/cffi-2.0.0-cp313-cp313-win_amd64.whl", hash = "sha256:19f705ada2530c1167abacb171925dd886168931e0a7b78f5bffcae5c6b5be75", size = 183402, upload-time = "2025-09-08T23:23:15.535Z" }, + { url = "https://files.pythonhosted.org/packages/cb/0e/02ceeec9a7d6ee63bb596121c2c8e9b3a9e150936f4fbef6ca1943e6137c/cffi-2.0.0-cp313-cp313-win_arm64.whl", hash = "sha256:256f80b80ca3853f90c21b23ee78cd008713787b1b1e93eae9f3d6a7134abd91", size = 177780, upload-time = "2025-09-08T23:23:16.761Z" }, + { url = "https://files.pythonhosted.org/packages/92/c4/3ce07396253a83250ee98564f8d7e9789fab8e58858f35d07a9a2c78de9f/cffi-2.0.0-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:fc33c5141b55ed366cfaad382df24fe7dcbc686de5be719b207bb248e3053dc5", size = 185320, upload-time = "2025-09-08T23:23:18.087Z" }, + { url = "https://files.pythonhosted.org/packages/59/dd/27e9fa567a23931c838c6b02d0764611c62290062a6d4e8ff7863daf9730/cffi-2.0.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:c654de545946e0db659b3400168c9ad31b5d29593291482c43e3564effbcee13", size = 181487, upload-time = "2025-09-08T23:23:19.622Z" }, + { url = "https://files.pythonhosted.org/packages/d6/43/0e822876f87ea8a4ef95442c3d766a06a51fc5298823f884ef87aaad168c/cffi-2.0.0-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:24b6f81f1983e6df8db3adc38562c83f7d4a0c36162885ec7f7b77c7dcbec97b", size = 220049, upload-time = "2025-09-08T23:23:20.853Z" }, + { url = "https://files.pythonhosted.org/packages/b4/89/76799151d9c2d2d1ead63c2429da9ea9d7aac304603de0c6e8764e6e8e70/cffi-2.0.0-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:12873ca6cb9b0f0d3a0da705d6086fe911591737a59f28b7936bdfed27c0d47c", size = 207793, upload-time = "2025-09-08T23:23:22.08Z" }, + { url = "https://files.pythonhosted.org/packages/bb/dd/3465b14bb9e24ee24cb88c9e3730f6de63111fffe513492bf8c808a3547e/cffi-2.0.0-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:d9b97165e8aed9272a6bb17c01e3cc5871a594a446ebedc996e2397a1c1ea8ef", size = 206300, upload-time = "2025-09-08T23:23:23.314Z" }, + { url = "https://files.pythonhosted.org/packages/47/d9/d83e293854571c877a92da46fdec39158f8d7e68da75bf73581225d28e90/cffi-2.0.0-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:afb8db5439b81cf9c9d0c80404b60c3cc9c3add93e114dcae767f1477cb53775", size = 219244, upload-time = "2025-09-08T23:23:24.541Z" }, + { url = "https://files.pythonhosted.org/packages/2b/0f/1f177e3683aead2bb00f7679a16451d302c436b5cbf2505f0ea8146ef59e/cffi-2.0.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:737fe7d37e1a1bffe70bd5754ea763a62a066dc5913ca57e957824b72a85e205", size = 222828, upload-time = "2025-09-08T23:23:26.143Z" }, + { url = "https://files.pythonhosted.org/packages/c6/0f/cafacebd4b040e3119dcb32fed8bdef8dfe94da653155f9d0b9dc660166e/cffi-2.0.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:38100abb9d1b1435bc4cc340bb4489635dc2f0da7456590877030c9b3d40b0c1", size = 220926, upload-time = "2025-09-08T23:23:27.873Z" }, + { url = "https://files.pythonhosted.org/packages/3e/aa/df335faa45b395396fcbc03de2dfcab242cd61a9900e914fe682a59170b1/cffi-2.0.0-cp314-cp314-win32.whl", hash = "sha256:087067fa8953339c723661eda6b54bc98c5625757ea62e95eb4898ad5e776e9f", size = 175328, upload-time = "2025-09-08T23:23:44.61Z" }, + { url = "https://files.pythonhosted.org/packages/bb/92/882c2d30831744296ce713f0feb4c1cd30f346ef747b530b5318715cc367/cffi-2.0.0-cp314-cp314-win_amd64.whl", hash = "sha256:203a48d1fb583fc7d78a4c6655692963b860a417c0528492a6bc21f1aaefab25", size = 185650, upload-time = "2025-09-08T23:23:45.848Z" }, + { url = "https://files.pythonhosted.org/packages/9f/2c/98ece204b9d35a7366b5b2c6539c350313ca13932143e79dc133ba757104/cffi-2.0.0-cp314-cp314-win_arm64.whl", hash = "sha256:dbd5c7a25a7cb98f5ca55d258b103a2054f859a46ae11aaf23134f9cc0d356ad", size = 180687, upload-time = "2025-09-08T23:23:47.105Z" }, + { url = "https://files.pythonhosted.org/packages/3e/61/c768e4d548bfa607abcda77423448df8c471f25dbe64fb2ef6d555eae006/cffi-2.0.0-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:9a67fc9e8eb39039280526379fb3a70023d77caec1852002b4da7e8b270c4dd9", size = 188773, upload-time = "2025-09-08T23:23:29.347Z" }, + { url = "https://files.pythonhosted.org/packages/2c/ea/5f76bce7cf6fcd0ab1a1058b5af899bfbef198bea4d5686da88471ea0336/cffi-2.0.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:7a66c7204d8869299919db4d5069a82f1561581af12b11b3c9f48c584eb8743d", size = 185013, upload-time = "2025-09-08T23:23:30.63Z" }, + { url = "https://files.pythonhosted.org/packages/be/b4/c56878d0d1755cf9caa54ba71e5d049479c52f9e4afc230f06822162ab2f/cffi-2.0.0-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:7cc09976e8b56f8cebd752f7113ad07752461f48a58cbba644139015ac24954c", size = 221593, upload-time = "2025-09-08T23:23:31.91Z" }, + { url = "https://files.pythonhosted.org/packages/e0/0d/eb704606dfe8033e7128df5e90fee946bbcb64a04fcdaa97321309004000/cffi-2.0.0-cp314-cp314t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:92b68146a71df78564e4ef48af17551a5ddd142e5190cdf2c5624d0c3ff5b2e8", size = 209354, upload-time = "2025-09-08T23:23:33.214Z" }, + { url = "https://files.pythonhosted.org/packages/d8/19/3c435d727b368ca475fb8742ab97c9cb13a0de600ce86f62eab7fa3eea60/cffi-2.0.0-cp314-cp314t-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:b1e74d11748e7e98e2f426ab176d4ed720a64412b6a15054378afdb71e0f37dc", size = 208480, upload-time = "2025-09-08T23:23:34.495Z" }, + { url = "https://files.pythonhosted.org/packages/d0/44/681604464ed9541673e486521497406fadcc15b5217c3e326b061696899a/cffi-2.0.0-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:28a3a209b96630bca57cce802da70c266eb08c6e97e5afd61a75611ee6c64592", size = 221584, upload-time = "2025-09-08T23:23:36.096Z" }, + { url = "https://files.pythonhosted.org/packages/25/8e/342a504ff018a2825d395d44d63a767dd8ebc927ebda557fecdaca3ac33a/cffi-2.0.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:7553fb2090d71822f02c629afe6042c299edf91ba1bf94951165613553984512", size = 224443, upload-time = "2025-09-08T23:23:37.328Z" }, + { url = "https://files.pythonhosted.org/packages/e1/5e/b666bacbbc60fbf415ba9988324a132c9a7a0448a9a8f125074671c0f2c3/cffi-2.0.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:6c6c373cfc5c83a975506110d17457138c8c63016b563cc9ed6e056a82f13ce4", size = 223437, upload-time = "2025-09-08T23:23:38.945Z" }, + { url = "https://files.pythonhosted.org/packages/a0/1d/ec1a60bd1a10daa292d3cd6bb0b359a81607154fb8165f3ec95fe003b85c/cffi-2.0.0-cp314-cp314t-win32.whl", hash = "sha256:1fc9ea04857caf665289b7a75923f2c6ed559b8298a1b8c49e59f7dd95c8481e", size = 180487, upload-time = "2025-09-08T23:23:40.423Z" }, + { url = "https://files.pythonhosted.org/packages/bf/41/4c1168c74fac325c0c8156f04b6749c8b6a8f405bbf91413ba088359f60d/cffi-2.0.0-cp314-cp314t-win_amd64.whl", hash = "sha256:d68b6cef7827e8641e8ef16f4494edda8b36104d79773a334beaa1e3521430f6", size = 191726, upload-time = "2025-09-08T23:23:41.742Z" }, + { url = "https://files.pythonhosted.org/packages/ae/3a/dbeec9d1ee0844c679f6bb5d6ad4e9f198b1224f4e7a32825f47f6192b0c/cffi-2.0.0-cp314-cp314t-win_arm64.whl", hash = "sha256:0a1527a803f0a659de1af2e1fd700213caba79377e27e4693648c2923da066f9", size = 184195, upload-time = "2025-09-08T23:23:43.004Z" }, + { url = "https://files.pythonhosted.org/packages/c0/cc/08ed5a43f2996a16b462f64a7055c6e962803534924b9b2f1371d8c00b7b/cffi-2.0.0-cp39-cp39-macosx_10_13_x86_64.whl", hash = "sha256:fe562eb1a64e67dd297ccc4f5addea2501664954f2692b69a76449ec7913ecbf", size = 184288, upload-time = "2025-09-08T23:23:48.404Z" }, + { url = "https://files.pythonhosted.org/packages/3d/de/38d9726324e127f727b4ecc376bc85e505bfe61ef130eaf3f290c6847dd4/cffi-2.0.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:de8dad4425a6ca6e4e5e297b27b5c824ecc7581910bf9aee86cb6835e6812aa7", size = 180509, upload-time = "2025-09-08T23:23:49.73Z" }, + { url = "https://files.pythonhosted.org/packages/9b/13/c92e36358fbcc39cf0962e83223c9522154ee8630e1df7c0b3a39a8124e2/cffi-2.0.0-cp39-cp39-manylinux1_i686.manylinux2014_i686.manylinux_2_17_i686.manylinux_2_5_i686.whl", hash = "sha256:4647afc2f90d1ddd33441e5b0e85b16b12ddec4fca55f0d9671fef036ecca27c", size = 208813, upload-time = "2025-09-08T23:23:51.263Z" }, + { url = "https://files.pythonhosted.org/packages/15/12/a7a79bd0df4c3bff744b2d7e52cc1b68d5e7e427b384252c42366dc1ecbc/cffi-2.0.0-cp39-cp39-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:3f4d46d8b35698056ec29bca21546e1551a205058ae1a181d871e278b0b28165", size = 216498, upload-time = "2025-09-08T23:23:52.494Z" }, + { url = "https://files.pythonhosted.org/packages/a3/ad/5c51c1c7600bdd7ed9a24a203ec255dccdd0ebf4527f7b922a0bde2fb6ed/cffi-2.0.0-cp39-cp39-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:e6e73b9e02893c764e7e8d5bb5ce277f1a009cd5243f8228f75f842bf937c534", size = 203243, upload-time = "2025-09-08T23:23:53.836Z" }, + { url = "https://files.pythonhosted.org/packages/32/f2/81b63e288295928739d715d00952c8c6034cb6c6a516b17d37e0c8be5600/cffi-2.0.0-cp39-cp39-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:cb527a79772e5ef98fb1d700678fe031e353e765d1ca2d409c92263c6d43e09f", size = 203158, upload-time = "2025-09-08T23:23:55.169Z" }, + { url = "https://files.pythonhosted.org/packages/1f/74/cc4096ce66f5939042ae094e2e96f53426a979864aa1f96a621ad128be27/cffi-2.0.0-cp39-cp39-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:61d028e90346df14fedc3d1e5441df818d095f3b87d286825dfcbd6459b7ef63", size = 216548, upload-time = "2025-09-08T23:23:56.506Z" }, + { url = "https://files.pythonhosted.org/packages/e8/be/f6424d1dc46b1091ffcc8964fa7c0ab0cd36839dd2761b49c90481a6ba1b/cffi-2.0.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:0f6084a0ea23d05d20c3edcda20c3d006f9b6f3fefeac38f59262e10cef47ee2", size = 218897, upload-time = "2025-09-08T23:23:57.825Z" }, + { url = "https://files.pythonhosted.org/packages/f7/e0/dda537c2309817edf60109e39265f24f24aa7f050767e22c98c53fe7f48b/cffi-2.0.0-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:1cd13c99ce269b3ed80b417dcd591415d3372bcac067009b6e0f59c7d4015e65", size = 211249, upload-time = "2025-09-08T23:23:59.139Z" }, + { url = "https://files.pythonhosted.org/packages/2b/e7/7c769804eb75e4c4b35e658dba01de1640a351a9653c3d49ca89d16ccc91/cffi-2.0.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:89472c9762729b5ae1ad974b777416bfda4ac5642423fa93bd57a09204712322", size = 218041, upload-time = "2025-09-08T23:24:00.496Z" }, + { url = "https://files.pythonhosted.org/packages/aa/d9/6218d78f920dcd7507fc16a766b5ef8f3b913cc7aa938e7fc80b9978d089/cffi-2.0.0-cp39-cp39-win32.whl", hash = "sha256:2081580ebb843f759b9f617314a24ed5738c51d2aee65d31e02f6f7a2b97707a", size = 172138, upload-time = "2025-09-08T23:24:01.7Z" }, + { url = "https://files.pythonhosted.org/packages/54/8f/a1e836f82d8e32a97e6b29cc8f641779181ac7363734f12df27db803ebda/cffi-2.0.0-cp39-cp39-win_amd64.whl", hash = "sha256:b882b3df248017dba09d6b16defe9b5c407fe32fc7c65a9c69798e6175601be9", size = 182794, upload-time = "2025-09-08T23:24:02.943Z" }, +] + +[[package]] +name = "charset-normalizer" +version = "3.4.4" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/13/69/33ddede1939fdd074bce5434295f38fae7136463422fe4fd3e0e89b98062/charset_normalizer-3.4.4.tar.gz", hash = "sha256:94537985111c35f28720e43603b8e7b43a6ecfb2ce1d3058bbe955b73404e21a", size = 129418, upload-time = "2025-10-14T04:42:32.879Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/1f/b8/6d51fc1d52cbd52cd4ccedd5b5b2f0f6a11bbf6765c782298b0f3e808541/charset_normalizer-3.4.4-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:e824f1492727fa856dd6eda4f7cee25f8518a12f3c4a56a74e8095695089cf6d", size = 209709, upload-time = "2025-10-14T04:40:11.385Z" }, + { url = "https://files.pythonhosted.org/packages/5c/af/1f9d7f7faafe2ddfb6f72a2e07a548a629c61ad510fe60f9630309908fef/charset_normalizer-3.4.4-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:4bd5d4137d500351a30687c2d3971758aac9a19208fc110ccb9d7188fbe709e8", size = 148814, upload-time = "2025-10-14T04:40:13.135Z" }, + { url = "https://files.pythonhosted.org/packages/79/3d/f2e3ac2bbc056ca0c204298ea4e3d9db9b4afe437812638759db2c976b5f/charset_normalizer-3.4.4-cp310-cp310-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:027f6de494925c0ab2a55eab46ae5129951638a49a34d87f4c3eda90f696b4ad", size = 144467, upload-time = "2025-10-14T04:40:14.728Z" }, + { url = "https://files.pythonhosted.org/packages/ec/85/1bf997003815e60d57de7bd972c57dc6950446a3e4ccac43bc3070721856/charset_normalizer-3.4.4-cp310-cp310-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:f820802628d2694cb7e56db99213f930856014862f3fd943d290ea8438d07ca8", size = 162280, upload-time = "2025-10-14T04:40:16.14Z" }, + { url = "https://files.pythonhosted.org/packages/3e/8e/6aa1952f56b192f54921c436b87f2aaf7c7a7c3d0d1a765547d64fd83c13/charset_normalizer-3.4.4-cp310-cp310-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:798d75d81754988d2565bff1b97ba5a44411867c0cf32b77a7e8f8d84796b10d", size = 159454, upload-time = "2025-10-14T04:40:17.567Z" }, + { url = "https://files.pythonhosted.org/packages/36/3b/60cbd1f8e93aa25d1c669c649b7a655b0b5fb4c571858910ea9332678558/charset_normalizer-3.4.4-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:9d1bb833febdff5c8927f922386db610b49db6e0d4f4ee29601d71e7c2694313", size = 153609, upload-time = "2025-10-14T04:40:19.08Z" }, + { url = "https://files.pythonhosted.org/packages/64/91/6a13396948b8fd3c4b4fd5bc74d045f5637d78c9675585e8e9fbe5636554/charset_normalizer-3.4.4-cp310-cp310-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:9cd98cdc06614a2f768d2b7286d66805f94c48cde050acdbbb7db2600ab3197e", size = 151849, upload-time = "2025-10-14T04:40:20.607Z" }, + { url = "https://files.pythonhosted.org/packages/b7/7a/59482e28b9981d105691e968c544cc0df3b7d6133152fb3dcdc8f135da7a/charset_normalizer-3.4.4-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:077fbb858e903c73f6c9db43374fd213b0b6a778106bc7032446a8e8b5b38b93", size = 151586, upload-time = "2025-10-14T04:40:21.719Z" }, + { url = "https://files.pythonhosted.org/packages/92/59/f64ef6a1c4bdd2baf892b04cd78792ed8684fbc48d4c2afe467d96b4df57/charset_normalizer-3.4.4-cp310-cp310-musllinux_1_2_armv7l.whl", hash = "sha256:244bfb999c71b35de57821b8ea746b24e863398194a4014e4c76adc2bbdfeff0", size = 145290, upload-time = "2025-10-14T04:40:23.069Z" }, + { url = "https://files.pythonhosted.org/packages/6b/63/3bf9f279ddfa641ffa1962b0db6a57a9c294361cc2f5fcac997049a00e9c/charset_normalizer-3.4.4-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:64b55f9dce520635f018f907ff1b0df1fdc31f2795a922fb49dd14fbcdf48c84", size = 163663, upload-time = "2025-10-14T04:40:24.17Z" }, + { url = "https://files.pythonhosted.org/packages/ed/09/c9e38fc8fa9e0849b172b581fd9803bdf6e694041127933934184e19f8c3/charset_normalizer-3.4.4-cp310-cp310-musllinux_1_2_riscv64.whl", hash = "sha256:faa3a41b2b66b6e50f84ae4a68c64fcd0c44355741c6374813a800cd6695db9e", size = 151964, upload-time = "2025-10-14T04:40:25.368Z" }, + { url = "https://files.pythonhosted.org/packages/d2/d1/d28b747e512d0da79d8b6a1ac18b7ab2ecfd81b2944c4c710e166d8dd09c/charset_normalizer-3.4.4-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:6515f3182dbe4ea06ced2d9e8666d97b46ef4c75e326b79bb624110f122551db", size = 161064, upload-time = "2025-10-14T04:40:26.806Z" }, + { url = "https://files.pythonhosted.org/packages/bb/9a/31d62b611d901c3b9e5500c36aab0ff5eb442043fb3a1c254200d3d397d9/charset_normalizer-3.4.4-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:cc00f04ed596e9dc0da42ed17ac5e596c6ccba999ba6bd92b0e0aef2f170f2d6", size = 155015, upload-time = "2025-10-14T04:40:28.284Z" }, + { url = "https://files.pythonhosted.org/packages/1f/f3/107e008fa2bff0c8b9319584174418e5e5285fef32f79d8ee6a430d0039c/charset_normalizer-3.4.4-cp310-cp310-win32.whl", hash = "sha256:f34be2938726fc13801220747472850852fe6b1ea75869a048d6f896838c896f", size = 99792, upload-time = "2025-10-14T04:40:29.613Z" }, + { url = "https://files.pythonhosted.org/packages/eb/66/e396e8a408843337d7315bab30dbf106c38966f1819f123257f5520f8a96/charset_normalizer-3.4.4-cp310-cp310-win_amd64.whl", hash = "sha256:a61900df84c667873b292c3de315a786dd8dac506704dea57bc957bd31e22c7d", size = 107198, upload-time = "2025-10-14T04:40:30.644Z" }, + { url = "https://files.pythonhosted.org/packages/b5/58/01b4f815bf0312704c267f2ccb6e5d42bcc7752340cd487bc9f8c3710597/charset_normalizer-3.4.4-cp310-cp310-win_arm64.whl", hash = "sha256:cead0978fc57397645f12578bfd2d5ea9138ea0fac82b2f63f7f7c6877986a69", size = 100262, upload-time = "2025-10-14T04:40:32.108Z" }, + { url = "https://files.pythonhosted.org/packages/ed/27/c6491ff4954e58a10f69ad90aca8a1b6fe9c5d3c6f380907af3c37435b59/charset_normalizer-3.4.4-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:6e1fcf0720908f200cd21aa4e6750a48ff6ce4afe7ff5a79a90d5ed8a08296f8", size = 206988, upload-time = "2025-10-14T04:40:33.79Z" }, + { url = "https://files.pythonhosted.org/packages/94/59/2e87300fe67ab820b5428580a53cad894272dbb97f38a7a814a2a1ac1011/charset_normalizer-3.4.4-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:5f819d5fe9234f9f82d75bdfa9aef3a3d72c4d24a6e57aeaebba32a704553aa0", size = 147324, upload-time = "2025-10-14T04:40:34.961Z" }, + { url = "https://files.pythonhosted.org/packages/07/fb/0cf61dc84b2b088391830f6274cb57c82e4da8bbc2efeac8c025edb88772/charset_normalizer-3.4.4-cp311-cp311-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:a59cb51917aa591b1c4e6a43c132f0cdc3c76dbad6155df4e28ee626cc77a0a3", size = 142742, upload-time = "2025-10-14T04:40:36.105Z" }, + { url = "https://files.pythonhosted.org/packages/62/8b/171935adf2312cd745d290ed93cf16cf0dfe320863ab7cbeeae1dcd6535f/charset_normalizer-3.4.4-cp311-cp311-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:8ef3c867360f88ac904fd3f5e1f902f13307af9052646963ee08ff4f131adafc", size = 160863, upload-time = "2025-10-14T04:40:37.188Z" }, + { url = "https://files.pythonhosted.org/packages/09/73/ad875b192bda14f2173bfc1bc9a55e009808484a4b256748d931b6948442/charset_normalizer-3.4.4-cp311-cp311-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:d9e45d7faa48ee908174d8fe84854479ef838fc6a705c9315372eacbc2f02897", size = 157837, upload-time = "2025-10-14T04:40:38.435Z" }, + { url = "https://files.pythonhosted.org/packages/6d/fc/de9cce525b2c5b94b47c70a4b4fb19f871b24995c728e957ee68ab1671ea/charset_normalizer-3.4.4-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:840c25fb618a231545cbab0564a799f101b63b9901f2569faecd6b222ac72381", size = 151550, upload-time = "2025-10-14T04:40:40.053Z" }, + { url = "https://files.pythonhosted.org/packages/55/c2/43edd615fdfba8c6f2dfbd459b25a6b3b551f24ea21981e23fb768503ce1/charset_normalizer-3.4.4-cp311-cp311-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:ca5862d5b3928c4940729dacc329aa9102900382fea192fc5e52eb69d6093815", size = 149162, upload-time = "2025-10-14T04:40:41.163Z" }, + { url = "https://files.pythonhosted.org/packages/03/86/bde4ad8b4d0e9429a4e82c1e8f5c659993a9a863ad62c7df05cf7b678d75/charset_normalizer-3.4.4-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:d9c7f57c3d666a53421049053eaacdd14bbd0a528e2186fcb2e672effd053bb0", size = 150019, upload-time = "2025-10-14T04:40:42.276Z" }, + { url = "https://files.pythonhosted.org/packages/1f/86/a151eb2af293a7e7bac3a739b81072585ce36ccfb4493039f49f1d3cae8c/charset_normalizer-3.4.4-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:277e970e750505ed74c832b4bf75dac7476262ee2a013f5574dd49075879e161", size = 143310, upload-time = "2025-10-14T04:40:43.439Z" }, + { url = "https://files.pythonhosted.org/packages/b5/fe/43dae6144a7e07b87478fdfc4dbe9efd5defb0e7ec29f5f58a55aeef7bf7/charset_normalizer-3.4.4-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:31fd66405eaf47bb62e8cd575dc621c56c668f27d46a61d975a249930dd5e2a4", size = 162022, upload-time = "2025-10-14T04:40:44.547Z" }, + { url = "https://files.pythonhosted.org/packages/80/e6/7aab83774f5d2bca81f42ac58d04caf44f0cc2b65fc6db2b3b2e8a05f3b3/charset_normalizer-3.4.4-cp311-cp311-musllinux_1_2_riscv64.whl", hash = "sha256:0d3d8f15c07f86e9ff82319b3d9ef6f4bf907608f53fe9d92b28ea9ae3d1fd89", size = 149383, upload-time = "2025-10-14T04:40:46.018Z" }, + { url = "https://files.pythonhosted.org/packages/4f/e8/b289173b4edae05c0dde07f69f8db476a0b511eac556dfe0d6bda3c43384/charset_normalizer-3.4.4-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:9f7fcd74d410a36883701fafa2482a6af2ff5ba96b9a620e9e0721e28ead5569", size = 159098, upload-time = "2025-10-14T04:40:47.081Z" }, + { url = "https://files.pythonhosted.org/packages/d8/df/fe699727754cae3f8478493c7f45f777b17c3ef0600e28abfec8619eb49c/charset_normalizer-3.4.4-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:ebf3e58c7ec8a8bed6d66a75d7fb37b55e5015b03ceae72a8e7c74495551e224", size = 152991, upload-time = "2025-10-14T04:40:48.246Z" }, + { url = "https://files.pythonhosted.org/packages/1a/86/584869fe4ddb6ffa3bd9f491b87a01568797fb9bd8933f557dba9771beaf/charset_normalizer-3.4.4-cp311-cp311-win32.whl", hash = "sha256:eecbc200c7fd5ddb9a7f16c7decb07b566c29fa2161a16cf67b8d068bd21690a", size = 99456, upload-time = "2025-10-14T04:40:49.376Z" }, + { url = "https://files.pythonhosted.org/packages/65/f6/62fdd5feb60530f50f7e38b4f6a1d5203f4d16ff4f9f0952962c044e919a/charset_normalizer-3.4.4-cp311-cp311-win_amd64.whl", hash = "sha256:5ae497466c7901d54b639cf42d5b8c1b6a4fead55215500d2f486d34db48d016", size = 106978, upload-time = "2025-10-14T04:40:50.844Z" }, + { url = "https://files.pythonhosted.org/packages/7a/9d/0710916e6c82948b3be62d9d398cb4fcf4e97b56d6a6aeccd66c4b2f2bd5/charset_normalizer-3.4.4-cp311-cp311-win_arm64.whl", hash = "sha256:65e2befcd84bc6f37095f5961e68a6f077bf44946771354a28ad434c2cce0ae1", size = 99969, upload-time = "2025-10-14T04:40:52.272Z" }, + { url = "https://files.pythonhosted.org/packages/f3/85/1637cd4af66fa687396e757dec650f28025f2a2f5a5531a3208dc0ec43f2/charset_normalizer-3.4.4-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:0a98e6759f854bd25a58a73fa88833fba3b7c491169f86ce1180c948ab3fd394", size = 208425, upload-time = "2025-10-14T04:40:53.353Z" }, + { url = "https://files.pythonhosted.org/packages/9d/6a/04130023fef2a0d9c62d0bae2649b69f7b7d8d24ea5536feef50551029df/charset_normalizer-3.4.4-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b5b290ccc2a263e8d185130284f8501e3e36c5e02750fc6b6bdeb2e9e96f1e25", size = 148162, upload-time = "2025-10-14T04:40:54.558Z" }, + { url = "https://files.pythonhosted.org/packages/78/29/62328d79aa60da22c9e0b9a66539feae06ca0f5a4171ac4f7dc285b83688/charset_normalizer-3.4.4-cp312-cp312-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:74bb723680f9f7a6234dcf67aea57e708ec1fbdf5699fb91dfd6f511b0a320ef", size = 144558, upload-time = "2025-10-14T04:40:55.677Z" }, + { url = "https://files.pythonhosted.org/packages/86/bb/b32194a4bf15b88403537c2e120b817c61cd4ecffa9b6876e941c3ee38fe/charset_normalizer-3.4.4-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:f1e34719c6ed0b92f418c7c780480b26b5d9c50349e9a9af7d76bf757530350d", size = 161497, upload-time = "2025-10-14T04:40:57.217Z" }, + { url = "https://files.pythonhosted.org/packages/19/89/a54c82b253d5b9b111dc74aca196ba5ccfcca8242d0fb64146d4d3183ff1/charset_normalizer-3.4.4-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:2437418e20515acec67d86e12bf70056a33abdacb5cb1655042f6538d6b085a8", size = 159240, upload-time = "2025-10-14T04:40:58.358Z" }, + { url = "https://files.pythonhosted.org/packages/c0/10/d20b513afe03acc89ec33948320a5544d31f21b05368436d580dec4e234d/charset_normalizer-3.4.4-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:11d694519d7f29d6cd09f6ac70028dba10f92f6cdd059096db198c283794ac86", size = 153471, upload-time = "2025-10-14T04:40:59.468Z" }, + { url = "https://files.pythonhosted.org/packages/61/fa/fbf177b55bdd727010f9c0a3c49eefa1d10f960e5f09d1d887bf93c2e698/charset_normalizer-3.4.4-cp312-cp312-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:ac1c4a689edcc530fc9d9aa11f5774b9e2f33f9a0c6a57864e90908f5208d30a", size = 150864, upload-time = "2025-10-14T04:41:00.623Z" }, + { url = "https://files.pythonhosted.org/packages/05/12/9fbc6a4d39c0198adeebbde20b619790e9236557ca59fc40e0e3cebe6f40/charset_normalizer-3.4.4-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:21d142cc6c0ec30d2efee5068ca36c128a30b0f2c53c1c07bd78cb6bc1d3be5f", size = 150647, upload-time = "2025-10-14T04:41:01.754Z" }, + { url = "https://files.pythonhosted.org/packages/ad/1f/6a9a593d52e3e8c5d2b167daf8c6b968808efb57ef4c210acb907c365bc4/charset_normalizer-3.4.4-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:5dbe56a36425d26d6cfb40ce79c314a2e4dd6211d51d6d2191c00bed34f354cc", size = 145110, upload-time = "2025-10-14T04:41:03.231Z" }, + { url = "https://files.pythonhosted.org/packages/30/42/9a52c609e72471b0fc54386dc63c3781a387bb4fe61c20231a4ebcd58bdd/charset_normalizer-3.4.4-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:5bfbb1b9acf3334612667b61bd3002196fe2a1eb4dd74d247e0f2a4d50ec9bbf", size = 162839, upload-time = "2025-10-14T04:41:04.715Z" }, + { url = "https://files.pythonhosted.org/packages/c4/5b/c0682bbf9f11597073052628ddd38344a3d673fda35a36773f7d19344b23/charset_normalizer-3.4.4-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:d055ec1e26e441f6187acf818b73564e6e6282709e9bcb5b63f5b23068356a15", size = 150667, upload-time = "2025-10-14T04:41:05.827Z" }, + { url = "https://files.pythonhosted.org/packages/e4/24/a41afeab6f990cf2daf6cb8c67419b63b48cf518e4f56022230840c9bfb2/charset_normalizer-3.4.4-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:af2d8c67d8e573d6de5bc30cdb27e9b95e49115cd9baad5ddbd1a6207aaa82a9", size = 160535, upload-time = "2025-10-14T04:41:06.938Z" }, + { url = "https://files.pythonhosted.org/packages/2a/e5/6a4ce77ed243c4a50a1fecca6aaaab419628c818a49434be428fe24c9957/charset_normalizer-3.4.4-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:780236ac706e66881f3b7f2f32dfe90507a09e67d1d454c762cf642e6e1586e0", size = 154816, upload-time = "2025-10-14T04:41:08.101Z" }, + { url = "https://files.pythonhosted.org/packages/a8/ef/89297262b8092b312d29cdb2517cb1237e51db8ecef2e9af5edbe7b683b1/charset_normalizer-3.4.4-cp312-cp312-win32.whl", hash = "sha256:5833d2c39d8896e4e19b689ffc198f08ea58116bee26dea51e362ecc7cd3ed26", size = 99694, upload-time = "2025-10-14T04:41:09.23Z" }, + { url = "https://files.pythonhosted.org/packages/3d/2d/1e5ed9dd3b3803994c155cd9aacb60c82c331bad84daf75bcb9c91b3295e/charset_normalizer-3.4.4-cp312-cp312-win_amd64.whl", hash = "sha256:a79cfe37875f822425b89a82333404539ae63dbdddf97f84dcbc3d339aae9525", size = 107131, upload-time = "2025-10-14T04:41:10.467Z" }, + { url = "https://files.pythonhosted.org/packages/d0/d9/0ed4c7098a861482a7b6a95603edce4c0d9db2311af23da1fb2b75ec26fc/charset_normalizer-3.4.4-cp312-cp312-win_arm64.whl", hash = "sha256:376bec83a63b8021bb5c8ea75e21c4ccb86e7e45ca4eb81146091b56599b80c3", size = 100390, upload-time = "2025-10-14T04:41:11.915Z" }, + { url = "https://files.pythonhosted.org/packages/97/45/4b3a1239bbacd321068ea6e7ac28875b03ab8bc0aa0966452db17cd36714/charset_normalizer-3.4.4-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:e1f185f86a6f3403aa2420e815904c67b2f9ebc443f045edd0de921108345794", size = 208091, upload-time = "2025-10-14T04:41:13.346Z" }, + { url = "https://files.pythonhosted.org/packages/7d/62/73a6d7450829655a35bb88a88fca7d736f9882a27eacdca2c6d505b57e2e/charset_normalizer-3.4.4-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6b39f987ae8ccdf0d2642338faf2abb1862340facc796048b604ef14919e55ed", size = 147936, upload-time = "2025-10-14T04:41:14.461Z" }, + { url = "https://files.pythonhosted.org/packages/89/c5/adb8c8b3d6625bef6d88b251bbb0d95f8205831b987631ab0c8bb5d937c2/charset_normalizer-3.4.4-cp313-cp313-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:3162d5d8ce1bb98dd51af660f2121c55d0fa541b46dff7bb9b9f86ea1d87de72", size = 144180, upload-time = "2025-10-14T04:41:15.588Z" }, + { url = "https://files.pythonhosted.org/packages/91/ed/9706e4070682d1cc219050b6048bfd293ccf67b3d4f5a4f39207453d4b99/charset_normalizer-3.4.4-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:81d5eb2a312700f4ecaa977a8235b634ce853200e828fbadf3a9c50bab278328", size = 161346, upload-time = "2025-10-14T04:41:16.738Z" }, + { url = "https://files.pythonhosted.org/packages/d5/0d/031f0d95e4972901a2f6f09ef055751805ff541511dc1252ba3ca1f80cf5/charset_normalizer-3.4.4-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:5bd2293095d766545ec1a8f612559f6b40abc0eb18bb2f5d1171872d34036ede", size = 158874, upload-time = "2025-10-14T04:41:17.923Z" }, + { url = "https://files.pythonhosted.org/packages/f5/83/6ab5883f57c9c801ce5e5677242328aa45592be8a00644310a008d04f922/charset_normalizer-3.4.4-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:a8a8b89589086a25749f471e6a900d3f662d1d3b6e2e59dcecf787b1cc3a1894", size = 153076, upload-time = "2025-10-14T04:41:19.106Z" }, + { url = "https://files.pythonhosted.org/packages/75/1e/5ff781ddf5260e387d6419959ee89ef13878229732732ee73cdae01800f2/charset_normalizer-3.4.4-cp313-cp313-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:bc7637e2f80d8530ee4a78e878bce464f70087ce73cf7c1caf142416923b98f1", size = 150601, upload-time = "2025-10-14T04:41:20.245Z" }, + { url = "https://files.pythonhosted.org/packages/d7/57/71be810965493d3510a6ca79b90c19e48696fb1ff964da319334b12677f0/charset_normalizer-3.4.4-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:f8bf04158c6b607d747e93949aa60618b61312fe647a6369f88ce2ff16043490", size = 150376, upload-time = "2025-10-14T04:41:21.398Z" }, + { url = "https://files.pythonhosted.org/packages/e5/d5/c3d057a78c181d007014feb7e9f2e65905a6c4ef182c0ddf0de2924edd65/charset_normalizer-3.4.4-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:554af85e960429cf30784dd47447d5125aaa3b99a6f0683589dbd27e2f45da44", size = 144825, upload-time = "2025-10-14T04:41:22.583Z" }, + { url = "https://files.pythonhosted.org/packages/e6/8c/d0406294828d4976f275ffbe66f00266c4b3136b7506941d87c00cab5272/charset_normalizer-3.4.4-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:74018750915ee7ad843a774364e13a3db91682f26142baddf775342c3f5b1133", size = 162583, upload-time = "2025-10-14T04:41:23.754Z" }, + { url = "https://files.pythonhosted.org/packages/d7/24/e2aa1f18c8f15c4c0e932d9287b8609dd30ad56dbe41d926bd846e22fb8d/charset_normalizer-3.4.4-cp313-cp313-musllinux_1_2_riscv64.whl", hash = "sha256:c0463276121fdee9c49b98908b3a89c39be45d86d1dbaa22957e38f6321d4ce3", size = 150366, upload-time = "2025-10-14T04:41:25.27Z" }, + { url = "https://files.pythonhosted.org/packages/e4/5b/1e6160c7739aad1e2df054300cc618b06bf784a7a164b0f238360721ab86/charset_normalizer-3.4.4-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:362d61fd13843997c1c446760ef36f240cf81d3ebf74ac62652aebaf7838561e", size = 160300, upload-time = "2025-10-14T04:41:26.725Z" }, + { url = "https://files.pythonhosted.org/packages/7a/10/f882167cd207fbdd743e55534d5d9620e095089d176d55cb22d5322f2afd/charset_normalizer-3.4.4-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:9a26f18905b8dd5d685d6d07b0cdf98a79f3c7a918906af7cc143ea2e164c8bc", size = 154465, upload-time = "2025-10-14T04:41:28.322Z" }, + { url = "https://files.pythonhosted.org/packages/89/66/c7a9e1b7429be72123441bfdbaf2bc13faab3f90b933f664db506dea5915/charset_normalizer-3.4.4-cp313-cp313-win32.whl", hash = "sha256:9b35f4c90079ff2e2edc5b26c0c77925e5d2d255c42c74fdb70fb49b172726ac", size = 99404, upload-time = "2025-10-14T04:41:29.95Z" }, + { url = "https://files.pythonhosted.org/packages/c4/26/b9924fa27db384bdcd97ab83b4f0a8058d96ad9626ead570674d5e737d90/charset_normalizer-3.4.4-cp313-cp313-win_amd64.whl", hash = "sha256:b435cba5f4f750aa6c0a0d92c541fb79f69a387c91e61f1795227e4ed9cece14", size = 107092, upload-time = "2025-10-14T04:41:31.188Z" }, + { url = "https://files.pythonhosted.org/packages/af/8f/3ed4bfa0c0c72a7ca17f0380cd9e4dd842b09f664e780c13cff1dcf2ef1b/charset_normalizer-3.4.4-cp313-cp313-win_arm64.whl", hash = "sha256:542d2cee80be6f80247095cc36c418f7bddd14f4a6de45af91dfad36d817bba2", size = 100408, upload-time = "2025-10-14T04:41:32.624Z" }, + { url = "https://files.pythonhosted.org/packages/2a/35/7051599bd493e62411d6ede36fd5af83a38f37c4767b92884df7301db25d/charset_normalizer-3.4.4-cp314-cp314-macosx_10_13_universal2.whl", hash = "sha256:da3326d9e65ef63a817ecbcc0df6e94463713b754fe293eaa03da99befb9a5bd", size = 207746, upload-time = "2025-10-14T04:41:33.773Z" }, + { url = "https://files.pythonhosted.org/packages/10/9a/97c8d48ef10d6cd4fcead2415523221624bf58bcf68a802721a6bc807c8f/charset_normalizer-3.4.4-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:8af65f14dc14a79b924524b1e7fffe304517b2bff5a58bf64f30b98bbc5079eb", size = 147889, upload-time = "2025-10-14T04:41:34.897Z" }, + { url = "https://files.pythonhosted.org/packages/10/bf/979224a919a1b606c82bd2c5fa49b5c6d5727aa47b4312bb27b1734f53cd/charset_normalizer-3.4.4-cp314-cp314-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:74664978bb272435107de04e36db5a9735e78232b85b77d45cfb38f758efd33e", size = 143641, upload-time = "2025-10-14T04:41:36.116Z" }, + { url = "https://files.pythonhosted.org/packages/ba/33/0ad65587441fc730dc7bd90e9716b30b4702dc7b617e6ba4997dc8651495/charset_normalizer-3.4.4-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:752944c7ffbfdd10c074dc58ec2d5a8a4cd9493b314d367c14d24c17684ddd14", size = 160779, upload-time = "2025-10-14T04:41:37.229Z" }, + { url = "https://files.pythonhosted.org/packages/67/ed/331d6b249259ee71ddea93f6f2f0a56cfebd46938bde6fcc6f7b9a3d0e09/charset_normalizer-3.4.4-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:d1f13550535ad8cff21b8d757a3257963e951d96e20ec82ab44bc64aeb62a191", size = 159035, upload-time = "2025-10-14T04:41:38.368Z" }, + { url = "https://files.pythonhosted.org/packages/67/ff/f6b948ca32e4f2a4576aa129d8bed61f2e0543bf9f5f2b7fc3758ed005c9/charset_normalizer-3.4.4-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:ecaae4149d99b1c9e7b88bb03e3221956f68fd6d50be2ef061b2381b61d20838", size = 152542, upload-time = "2025-10-14T04:41:39.862Z" }, + { url = "https://files.pythonhosted.org/packages/16/85/276033dcbcc369eb176594de22728541a925b2632f9716428c851b149e83/charset_normalizer-3.4.4-cp314-cp314-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:cb6254dc36b47a990e59e1068afacdcd02958bdcce30bb50cc1700a8b9d624a6", size = 149524, upload-time = "2025-10-14T04:41:41.319Z" }, + { url = "https://files.pythonhosted.org/packages/9e/f2/6a2a1f722b6aba37050e626530a46a68f74e63683947a8acff92569f979a/charset_normalizer-3.4.4-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:c8ae8a0f02f57a6e61203a31428fa1d677cbe50c93622b4149d5c0f319c1d19e", size = 150395, upload-time = "2025-10-14T04:41:42.539Z" }, + { url = "https://files.pythonhosted.org/packages/60/bb/2186cb2f2bbaea6338cad15ce23a67f9b0672929744381e28b0592676824/charset_normalizer-3.4.4-cp314-cp314-musllinux_1_2_armv7l.whl", hash = "sha256:47cc91b2f4dd2833fddaedd2893006b0106129d4b94fdb6af1f4ce5a9965577c", size = 143680, upload-time = "2025-10-14T04:41:43.661Z" }, + { url = "https://files.pythonhosted.org/packages/7d/a5/bf6f13b772fbb2a90360eb620d52ed8f796f3c5caee8398c3b2eb7b1c60d/charset_normalizer-3.4.4-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:82004af6c302b5d3ab2cfc4cc5f29db16123b1a8417f2e25f9066f91d4411090", size = 162045, upload-time = "2025-10-14T04:41:44.821Z" }, + { url = "https://files.pythonhosted.org/packages/df/c5/d1be898bf0dc3ef9030c3825e5d3b83f2c528d207d246cbabe245966808d/charset_normalizer-3.4.4-cp314-cp314-musllinux_1_2_riscv64.whl", hash = "sha256:2b7d8f6c26245217bd2ad053761201e9f9680f8ce52f0fcd8d0755aeae5b2152", size = 149687, upload-time = "2025-10-14T04:41:46.442Z" }, + { url = "https://files.pythonhosted.org/packages/a5/42/90c1f7b9341eef50c8a1cb3f098ac43b0508413f33affd762855f67a410e/charset_normalizer-3.4.4-cp314-cp314-musllinux_1_2_s390x.whl", hash = "sha256:799a7a5e4fb2d5898c60b640fd4981d6a25f1c11790935a44ce38c54e985f828", size = 160014, upload-time = "2025-10-14T04:41:47.631Z" }, + { url = "https://files.pythonhosted.org/packages/76/be/4d3ee471e8145d12795ab655ece37baed0929462a86e72372fd25859047c/charset_normalizer-3.4.4-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:99ae2cffebb06e6c22bdc25801d7b30f503cc87dbd283479e7b606f70aff57ec", size = 154044, upload-time = "2025-10-14T04:41:48.81Z" }, + { url = "https://files.pythonhosted.org/packages/b0/6f/8f7af07237c34a1defe7defc565a9bc1807762f672c0fde711a4b22bf9c0/charset_normalizer-3.4.4-cp314-cp314-win32.whl", hash = "sha256:f9d332f8c2a2fcbffe1378594431458ddbef721c1769d78e2cbc06280d8155f9", size = 99940, upload-time = "2025-10-14T04:41:49.946Z" }, + { url = "https://files.pythonhosted.org/packages/4b/51/8ade005e5ca5b0d80fb4aff72a3775b325bdc3d27408c8113811a7cbe640/charset_normalizer-3.4.4-cp314-cp314-win_amd64.whl", hash = "sha256:8a6562c3700cce886c5be75ade4a5db4214fda19fede41d9792d100288d8f94c", size = 107104, upload-time = "2025-10-14T04:41:51.051Z" }, + { url = "https://files.pythonhosted.org/packages/da/5f/6b8f83a55bb8278772c5ae54a577f3099025f9ade59d0136ac24a0df4bde/charset_normalizer-3.4.4-cp314-cp314-win_arm64.whl", hash = "sha256:de00632ca48df9daf77a2c65a484531649261ec9f25489917f09e455cb09ddb2", size = 100743, upload-time = "2025-10-14T04:41:52.122Z" }, + { url = "https://files.pythonhosted.org/packages/0a/4e/3926a1c11f0433791985727965263f788af00db3482d89a7545ca5ecc921/charset_normalizer-3.4.4-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:ce8a0633f41a967713a59c4139d29110c07e826d131a316b50ce11b1d79b4f84", size = 198599, upload-time = "2025-10-14T04:41:53.213Z" }, + { url = "https://files.pythonhosted.org/packages/ec/7c/b92d1d1dcffc34592e71ea19c882b6709e43d20fa498042dea8b815638d7/charset_normalizer-3.4.4-cp38-cp38-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:eaabd426fe94daf8fd157c32e571c85cb12e66692f15516a83a03264b08d06c3", size = 143090, upload-time = "2025-10-14T04:41:54.385Z" }, + { url = "https://files.pythonhosted.org/packages/84/ce/61a28d3bb77281eb24107b937a497f3c43089326d27832a63dcedaab0478/charset_normalizer-3.4.4-cp38-cp38-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:c4ef880e27901b6cc782f1b95f82da9313c0eb95c3af699103088fa0ac3ce9ac", size = 139490, upload-time = "2025-10-14T04:41:55.551Z" }, + { url = "https://files.pythonhosted.org/packages/c0/bd/c9e59a91b2061c6f8bb98a150670cb16d4cd7c4ba7d11ad0cdf789155f41/charset_normalizer-3.4.4-cp38-cp38-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:2aaba3b0819274cc41757a1da876f810a3e4d7b6eb25699253a4effef9e8e4af", size = 155334, upload-time = "2025-10-14T04:41:56.724Z" }, + { url = "https://files.pythonhosted.org/packages/bf/37/f17ae176a80f22ff823456af91ba3bc59df308154ff53aef0d39eb3d3419/charset_normalizer-3.4.4-cp38-cp38-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:778d2e08eda00f4256d7f672ca9fef386071c9202f5e4607920b86d7803387f2", size = 152823, upload-time = "2025-10-14T04:41:58.236Z" }, + { url = "https://files.pythonhosted.org/packages/bf/fa/cf5bb2409a385f78750e78c8d2e24780964976acdaaed65dbd6083ae5b40/charset_normalizer-3.4.4-cp38-cp38-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:f155a433c2ec037d4e8df17d18922c3a0d9b3232a396690f17175d2946f0218d", size = 147618, upload-time = "2025-10-14T04:41:59.409Z" }, + { url = "https://files.pythonhosted.org/packages/9b/63/579784a65bc7de2d4518d40bb8f1870900163e86f17f21fd1384318c459d/charset_normalizer-3.4.4-cp38-cp38-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:a8bf8d0f749c5757af2142fe7903a9df1d2e8aa3841559b2bad34b08d0e2bcf3", size = 145516, upload-time = "2025-10-14T04:42:00.579Z" }, + { url = "https://files.pythonhosted.org/packages/a3/a9/94ec6266cd394e8f93a4d69cca651d61bf6ac58d2a0422163b30c698f2c7/charset_normalizer-3.4.4-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:194f08cbb32dc406d6e1aea671a68be0823673db2832b38405deba2fb0d88f63", size = 145266, upload-time = "2025-10-14T04:42:01.684Z" }, + { url = "https://files.pythonhosted.org/packages/09/14/d6626eb97764b58c2779fa7928fa7d1a49adb8ce687c2dbba4db003c1939/charset_normalizer-3.4.4-cp38-cp38-musllinux_1_2_armv7l.whl", hash = "sha256:6aee717dcfead04c6eb1ce3bd29ac1e22663cdea57f943c87d1eab9a025438d7", size = 139559, upload-time = "2025-10-14T04:42:02.902Z" }, + { url = "https://files.pythonhosted.org/packages/09/01/ddbe6b01313ba191dbb0a43c7563bc770f2448c18127f9ea4b119c44dff0/charset_normalizer-3.4.4-cp38-cp38-musllinux_1_2_ppc64le.whl", hash = "sha256:cd4b7ca9984e5e7985c12bc60a6f173f3c958eae74f3ef6624bb6b26e2abbae4", size = 156653, upload-time = "2025-10-14T04:42:04.005Z" }, + { url = "https://files.pythonhosted.org/packages/95/c8/d05543378bea89296e9af4510b44c704626e191da447235c8fdedfc5b7b2/charset_normalizer-3.4.4-cp38-cp38-musllinux_1_2_riscv64.whl", hash = "sha256:b7cf1017d601aa35e6bb650b6ad28652c9cd78ee6caff19f3c28d03e1c80acbf", size = 145644, upload-time = "2025-10-14T04:42:05.211Z" }, + { url = "https://files.pythonhosted.org/packages/72/01/2866c4377998ef8a1f6802f6431e774a4c8ebe75b0a6e569ceec55c9cbfb/charset_normalizer-3.4.4-cp38-cp38-musllinux_1_2_s390x.whl", hash = "sha256:e912091979546adf63357d7e2ccff9b44f026c075aeaf25a52d0e95ad2281074", size = 153964, upload-time = "2025-10-14T04:42:06.341Z" }, + { url = "https://files.pythonhosted.org/packages/4a/66/66c72468a737b4cbd7851ba2c522fe35c600575fbeac944460b4fd4a06fe/charset_normalizer-3.4.4-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:5cb4d72eea50c8868f5288b7f7f33ed276118325c1dfd3957089f6b519e1382a", size = 148777, upload-time = "2025-10-14T04:42:07.535Z" }, + { url = "https://files.pythonhosted.org/packages/50/94/d0d56677fdddbffa8ca00ec411f67bb8c947f9876374ddc9d160d4f2c4b3/charset_normalizer-3.4.4-cp38-cp38-win32.whl", hash = "sha256:837c2ce8c5a65a2035be9b3569c684358dfbf109fd3b6969630a87535495ceaa", size = 98687, upload-time = "2025-10-14T04:42:08.678Z" }, + { url = "https://files.pythonhosted.org/packages/00/64/c3bc303d1b586480b1c8e6e1e2191a6d6dd40255244e5cf16763dcec52e6/charset_normalizer-3.4.4-cp38-cp38-win_amd64.whl", hash = "sha256:44c2a8734b333e0578090c4cd6b16f275e07aa6614ca8715e6c038e865e70576", size = 106115, upload-time = "2025-10-14T04:42:09.793Z" }, + { url = "https://files.pythonhosted.org/packages/46/7c/0c4760bccf082737ca7ab84a4c2034fcc06b1f21cf3032ea98bd6feb1725/charset_normalizer-3.4.4-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:a9768c477b9d7bd54bc0c86dbaebdec6f03306675526c9927c0e8a04e8f94af9", size = 209609, upload-time = "2025-10-14T04:42:10.922Z" }, + { url = "https://files.pythonhosted.org/packages/bb/a4/69719daef2f3d7f1819de60c9a6be981b8eeead7542d5ec4440f3c80e111/charset_normalizer-3.4.4-cp39-cp39-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:1bee1e43c28aa63cb16e5c14e582580546b08e535299b8b6158a7c9c768a1f3d", size = 149029, upload-time = "2025-10-14T04:42:12.38Z" }, + { url = "https://files.pythonhosted.org/packages/e6/21/8d4e1d6c1e6070d3672908b8e4533a71b5b53e71d16828cc24d0efec564c/charset_normalizer-3.4.4-cp39-cp39-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:fd44c878ea55ba351104cb93cc85e74916eb8fa440ca7903e57575e97394f608", size = 144580, upload-time = "2025-10-14T04:42:13.549Z" }, + { url = "https://files.pythonhosted.org/packages/a7/0a/a616d001b3f25647a9068e0b9199f697ce507ec898cacb06a0d5a1617c99/charset_normalizer-3.4.4-cp39-cp39-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:0f04b14ffe5fdc8c4933862d8306109a2c51e0704acfa35d51598eb45a1e89fc", size = 162340, upload-time = "2025-10-14T04:42:14.892Z" }, + { url = "https://files.pythonhosted.org/packages/85/93/060b52deb249a5450460e0585c88a904a83aec474ab8e7aba787f45e79f2/charset_normalizer-3.4.4-cp39-cp39-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:cd09d08005f958f370f539f186d10aec3377d55b9eeb0d796025d4886119d76e", size = 159619, upload-time = "2025-10-14T04:42:16.676Z" }, + { url = "https://files.pythonhosted.org/packages/dd/21/0274deb1cc0632cd587a9a0ec6b4674d9108e461cb4cd40d457adaeb0564/charset_normalizer-3.4.4-cp39-cp39-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:4fe7859a4e3e8457458e2ff592f15ccb02f3da787fcd31e0183879c3ad4692a1", size = 153980, upload-time = "2025-10-14T04:42:17.917Z" }, + { url = "https://files.pythonhosted.org/packages/28/2b/e3d7d982858dccc11b31906976323d790dded2017a0572f093ff982d692f/charset_normalizer-3.4.4-cp39-cp39-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:fa09f53c465e532f4d3db095e0c55b615f010ad81803d383195b6b5ca6cbf5f3", size = 152174, upload-time = "2025-10-14T04:42:19.018Z" }, + { url = "https://files.pythonhosted.org/packages/6e/ff/4a269f8e35f1e58b2df52c131a1fa019acb7ef3f8697b7d464b07e9b492d/charset_normalizer-3.4.4-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:7fa17817dc5625de8a027cb8b26d9fefa3ea28c8253929b8d6649e705d2835b6", size = 151666, upload-time = "2025-10-14T04:42:20.171Z" }, + { url = "https://files.pythonhosted.org/packages/da/c9/ec39870f0b330d58486001dd8e532c6b9a905f5765f58a6f8204926b4a93/charset_normalizer-3.4.4-cp39-cp39-musllinux_1_2_armv7l.whl", hash = "sha256:5947809c8a2417be3267efc979c47d76a079758166f7d43ef5ae8e9f92751f88", size = 145550, upload-time = "2025-10-14T04:42:21.324Z" }, + { url = "https://files.pythonhosted.org/packages/75/8f/d186ab99e40e0ed9f82f033d6e49001701c81244d01905dd4a6924191a30/charset_normalizer-3.4.4-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:4902828217069c3c5c71094537a8e623f5d097858ac6ca8252f7b4d10b7560f1", size = 163721, upload-time = "2025-10-14T04:42:22.46Z" }, + { url = "https://files.pythonhosted.org/packages/96/b1/6047663b9744df26a7e479ac1e77af7134b1fcf9026243bb48ee2d18810f/charset_normalizer-3.4.4-cp39-cp39-musllinux_1_2_riscv64.whl", hash = "sha256:7c308f7e26e4363d79df40ca5b2be1c6ba9f02bdbccfed5abddb7859a6ce72cf", size = 152127, upload-time = "2025-10-14T04:42:23.712Z" }, + { url = "https://files.pythonhosted.org/packages/59/78/e5a6eac9179f24f704d1be67d08704c3c6ab9f00963963524be27c18ed87/charset_normalizer-3.4.4-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:2c9d3c380143a1fedbff95a312aa798578371eb29da42106a29019368a475318", size = 161175, upload-time = "2025-10-14T04:42:24.87Z" }, + { url = "https://files.pythonhosted.org/packages/e5/43/0e626e42d54dd2f8dd6fc5e1c5ff00f05fbca17cb699bedead2cae69c62f/charset_normalizer-3.4.4-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:cb01158d8b88ee68f15949894ccc6712278243d95f344770fa7593fa2d94410c", size = 155375, upload-time = "2025-10-14T04:42:27.246Z" }, + { url = "https://files.pythonhosted.org/packages/e9/91/d9615bf2e06f35e4997616ff31248c3657ed649c5ab9d35ea12fce54e380/charset_normalizer-3.4.4-cp39-cp39-win32.whl", hash = "sha256:2677acec1a2f8ef614c6888b5b4ae4060cc184174a938ed4e8ef690e15d3e505", size = 99692, upload-time = "2025-10-14T04:42:28.425Z" }, + { url = "https://files.pythonhosted.org/packages/d1/a9/6c040053909d9d1ef4fcab45fddec083aedc9052c10078339b47c8573ea8/charset_normalizer-3.4.4-cp39-cp39-win_amd64.whl", hash = "sha256:f8e160feb2aed042cd657a72acc0b481212ed28b1b9a95c0cee1621b524e1966", size = 107192, upload-time = "2025-10-14T04:42:29.482Z" }, + { url = "https://files.pythonhosted.org/packages/f0/c6/4fa536b2c0cd3edfb7ccf8469fa0f363ea67b7213a842b90909ca33dd851/charset_normalizer-3.4.4-cp39-cp39-win_arm64.whl", hash = "sha256:b5d84d37db046c5ca74ee7bb47dd6cbc13f80665fdde3e8040bdd3fb015ecb50", size = 100220, upload-time = "2025-10-14T04:42:30.632Z" }, + { url = "https://files.pythonhosted.org/packages/0a/4c/925909008ed5a988ccbb72dcc897407e5d6d3bd72410d69e051fc0c14647/charset_normalizer-3.4.4-py3-none-any.whl", hash = "sha256:7a32c560861a02ff789ad905a2fe94e3f840803362c84fecf1851cb4cf3dc37f", size = 53402, upload-time = "2025-10-14T04:42:31.76Z" }, +] + +[[package]] +name = "colorama" +version = "0.4.6" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/d8/53/6f443c9a4a8358a93a6792e2acffb9d9d5cb0a5cfd8802644b7b1c9a02e4/colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44", size = 27697, upload-time = "2022-10-25T02:36:22.414Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/d1/d6/3965ed04c63042e047cb6a3e6ed1a63a35087b6a609aa3a15ed8ac56c221/colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6", size = 25335, upload-time = "2022-10-25T02:36:20.889Z" }, +] + +[[package]] +name = "comm" +version = "0.2.3" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/4c/13/7d740c5849255756bc17888787313b61fd38a0a8304fc4f073dfc46122aa/comm-0.2.3.tar.gz", hash = "sha256:2dc8048c10962d55d7ad693be1e7045d891b7ce8d999c97963a5e3e99c055971", size = 6319, upload-time = "2025-07-25T14:02:04.452Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/60/97/891a0971e1e4a8c5d2b20bbe0e524dc04548d2307fee33cdeba148fd4fc7/comm-0.2.3-py3-none-any.whl", hash = "sha256:c615d91d75f7f04f095b30d1c1711babd43bdc6419c1be9886a85f2f4e489417", size = 7294, upload-time = "2025-07-25T14:02:02.896Z" }, +] + +[[package]] +name = "contourpy" +version = "1.1.1" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version < '3.9'", +] +dependencies = [ + { name = "numpy", version = "1.24.4", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.9'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/b1/7d/087ee4295e7580d3f7eb8a8a4e0ec8c7847e60f34135248ccf831cf5bbfc/contourpy-1.1.1.tar.gz", hash = "sha256:96ba37c2e24b7212a77da85004c38e7c4d155d3e72a45eeaf22c1f03f607e8ab", size = 13433167, upload-time = "2023-09-16T10:25:49.501Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/fb/7f/c44a51a83a093bf5c84e07dd1e3cfe9f68c47b6499bd05a9de0c6dbdc2bc/contourpy-1.1.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:46e24f5412c948d81736509377e255f6040e94216bf1a9b5ea1eaa9d29f6ec1b", size = 247207, upload-time = "2023-09-16T10:20:32.848Z" }, + { url = "https://files.pythonhosted.org/packages/a9/65/544d66da0716b20084874297ff7596704e435cf011512f8e576638e83db2/contourpy-1.1.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:0e48694d6a9c5a26ee85b10130c77a011a4fedf50a7279fa0bdaf44bafb4299d", size = 232428, upload-time = "2023-09-16T10:20:36.337Z" }, + { url = "https://files.pythonhosted.org/packages/5b/e6/697085cc34a294bd399548fd99562537a75408f113e3a815807e206246f0/contourpy-1.1.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a66045af6cf00e19d02191ab578a50cb93b2028c3eefed999793698e9ea768ae", size = 285304, upload-time = "2023-09-16T10:20:40.182Z" }, + { url = "https://files.pythonhosted.org/packages/69/4b/52d0d2e85c59f00f6ddbd6fea819f267008c58ee7708da96d112a293e91c/contourpy-1.1.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4ebf42695f75ee1a952f98ce9775c873e4971732a87334b099dde90b6af6a916", size = 322655, upload-time = "2023-09-16T10:20:44.175Z" }, + { url = "https://files.pythonhosted.org/packages/82/fc/3decc656a547a6d5d5b4249f81c72668a1f3259a62b2def2504120d38746/contourpy-1.1.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f6aec19457617ef468ff091669cca01fa7ea557b12b59a7908b9474bb9674cf0", size = 296430, upload-time = "2023-09-16T10:20:47.767Z" }, + { url = "https://files.pythonhosted.org/packages/f1/6b/e4b0f8708f22dd7c321f87eadbb98708975e115ac6582eb46d1f32197ce6/contourpy-1.1.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:462c59914dc6d81e0b11f37e560b8a7c2dbab6aca4f38be31519d442d6cde1a1", size = 301672, upload-time = "2023-09-16T10:20:51.395Z" }, + { url = "https://files.pythonhosted.org/packages/c3/87/201410522a756e605069078833d806147cad8532fdc164a96689d05c5afc/contourpy-1.1.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:6d0a8efc258659edc5299f9ef32d8d81de8b53b45d67bf4bfa3067f31366764d", size = 820145, upload-time = "2023-09-16T10:20:58.426Z" }, + { url = "https://files.pythonhosted.org/packages/b4/d9/42680a17d43edda04ab2b3f11125cf97b61bce5d3b52721a42960bf748bd/contourpy-1.1.1-cp310-cp310-win32.whl", hash = "sha256:d6ab42f223e58b7dac1bb0af32194a7b9311065583cc75ff59dcf301afd8a431", size = 399542, upload-time = "2023-09-16T10:21:02.719Z" }, + { url = "https://files.pythonhosted.org/packages/55/14/0dc1884e3c04f9b073a47283f5d424926644250891db392a07c56f05e5c5/contourpy-1.1.1-cp310-cp310-win_amd64.whl", hash = "sha256:549174b0713d49871c6dee90a4b499d3f12f5e5f69641cd23c50a4542e2ca1eb", size = 477974, upload-time = "2023-09-16T10:21:07.565Z" }, + { url = "https://files.pythonhosted.org/packages/8b/4f/be28a39cd5e988b8d3c2cc642c2c7ffeeb28fe80a86df71b6d1e473c5038/contourpy-1.1.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:407d864db716a067cc696d61fa1ef6637fedf03606e8417fe2aeed20a061e6b2", size = 248613, upload-time = "2023-09-16T10:21:10.695Z" }, + { url = "https://files.pythonhosted.org/packages/2c/8e/656f8e7cd316aa68d9824744773e90dbd71f847429d10c82001e927480a2/contourpy-1.1.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:dfe80c017973e6a4c367e037cb31601044dd55e6bfacd57370674867d15a899b", size = 233603, upload-time = "2023-09-16T10:21:13.771Z" }, + { url = "https://files.pythonhosted.org/packages/60/2a/4d4bd4541212ab98f3411f21bf58b0b246f333ae996e9f57e1acf12bcc45/contourpy-1.1.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e30aaf2b8a2bac57eb7e1650df1b3a4130e8d0c66fc2f861039d507a11760e1b", size = 287037, upload-time = "2023-09-16T10:21:17.622Z" }, + { url = "https://files.pythonhosted.org/packages/24/67/8abf919443381585a4eee74069e311c736350549dae02d3d014fef93d50a/contourpy-1.1.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3de23ca4f381c3770dee6d10ead6fff524d540c0f662e763ad1530bde5112532", size = 323274, upload-time = "2023-09-16T10:21:21.404Z" }, + { url = "https://files.pythonhosted.org/packages/2a/e5/6da11329dd35a2f2e404a95e5374b5702de6ac52e776e8b87dd6ea4b29d0/contourpy-1.1.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:566f0e41df06dfef2431defcfaa155f0acfa1ca4acbf8fd80895b1e7e2ada40e", size = 297801, upload-time = "2023-09-16T10:21:25.155Z" }, + { url = "https://files.pythonhosted.org/packages/b7/f6/78f60fa0b6ae64971178e2542e8b3ad3ba5f4f379b918ab7b18038a3f897/contourpy-1.1.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b04c2f0adaf255bf756cf08ebef1be132d3c7a06fe6f9877d55640c5e60c72c5", size = 302821, upload-time = "2023-09-16T10:21:28.663Z" }, + { url = "https://files.pythonhosted.org/packages/da/25/6062395a1c6a06f46a577da821318886b8b939453a098b9cd61671bb497b/contourpy-1.1.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:d0c188ae66b772d9d61d43c6030500344c13e3f73a00d1dc241da896f379bb62", size = 820121, upload-time = "2023-09-16T10:21:36.251Z" }, + { url = "https://files.pythonhosted.org/packages/41/5e/64e78b1e8682cbab10c13fc1a2c070d30acedb805ab2f42afbd3d88f7225/contourpy-1.1.1-cp311-cp311-win32.whl", hash = "sha256:0683e1ae20dc038075d92e0e0148f09ffcefab120e57f6b4c9c0f477ec171f33", size = 401590, upload-time = "2023-09-16T10:21:40.42Z" }, + { url = "https://files.pythonhosted.org/packages/e5/76/94bc17eb868f8c7397f8fdfdeae7661c1b9a35f3a7219da308596e8c252a/contourpy-1.1.1-cp311-cp311-win_amd64.whl", hash = "sha256:8636cd2fc5da0fb102a2504fa2c4bea3cbc149533b345d72cdf0e7a924decc45", size = 480534, upload-time = "2023-09-16T10:21:45.724Z" }, + { url = "https://files.pythonhosted.org/packages/94/0f/07a5e26fec7176658f6aecffc615900ff1d303baa2b67bc37fd98ce67c87/contourpy-1.1.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:560f1d68a33e89c62da5da4077ba98137a5e4d3a271b29f2f195d0fba2adcb6a", size = 249799, upload-time = "2023-09-16T10:21:48.797Z" }, + { url = "https://files.pythonhosted.org/packages/32/0b/d7baca3f60d3b3a77c9ba1307c7792befd3c1c775a26c649dca1bfa9b6ba/contourpy-1.1.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:24216552104ae8f3b34120ef84825400b16eb6133af2e27a190fdc13529f023e", size = 232739, upload-time = "2023-09-16T10:21:51.854Z" }, + { url = "https://files.pythonhosted.org/packages/6d/62/a385b4d4b5718e3a933de5791528f45f1f5b364d3c79172ad0309c832041/contourpy-1.1.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:56de98a2fb23025882a18b60c7f0ea2d2d70bbbcfcf878f9067234b1c4818442", size = 282171, upload-time = "2023-09-16T10:21:55.794Z" }, + { url = "https://files.pythonhosted.org/packages/91/21/8c6819747fea53557f3963ca936035b3e8bed87d591f5278ad62516a059d/contourpy-1.1.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:07d6f11dfaf80a84c97f1a5ba50d129d9303c5b4206f776e94037332e298dda8", size = 321182, upload-time = "2023-09-16T10:21:59.576Z" }, + { url = "https://files.pythonhosted.org/packages/22/29/d75da9002f9df09c755b12cf0357eb91b081c858e604f4e92b4b8bfc3c15/contourpy-1.1.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f1eaac5257a8f8a047248d60e8f9315c6cff58f7803971170d952555ef6344a7", size = 295869, upload-time = "2023-09-16T10:22:03.248Z" }, + { url = "https://files.pythonhosted.org/packages/a7/47/4e7e66159f881c131e3b97d1cc5c0ea72be62bdd292c7f63fd13937d07f4/contourpy-1.1.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:19557fa407e70f20bfaba7d55b4d97b14f9480856c4fb65812e8a05fe1c6f9bf", size = 298756, upload-time = "2023-09-16T10:22:06.663Z" }, + { url = "https://files.pythonhosted.org/packages/d3/bb/bffc99bc3172942b5eda8027ca0cb80ddd336fcdd634d68adce957d37231/contourpy-1.1.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:081f3c0880712e40effc5f4c3b08feca6d064cb8cfbb372ca548105b86fd6c3d", size = 818441, upload-time = "2023-09-16T10:22:13.805Z" }, + { url = "https://files.pythonhosted.org/packages/da/1b/904baf0aaaf6c6e2247801dcd1ff0d7bf84352839927d356b28ae804cbb0/contourpy-1.1.1-cp312-cp312-win32.whl", hash = "sha256:059c3d2a94b930f4dafe8105bcdc1b21de99b30b51b5bce74c753686de858cb6", size = 410294, upload-time = "2023-09-16T10:22:18.055Z" }, + { url = "https://files.pythonhosted.org/packages/75/d4/c3b7a9a0d1f99b528e5a46266b0b9f13aad5a0dd1156d071418df314c427/contourpy-1.1.1-cp312-cp312-win_amd64.whl", hash = "sha256:f44d78b61740e4e8c71db1cf1fd56d9050a4747681c59ec1094750a658ceb970", size = 486678, upload-time = "2023-09-16T10:22:23.249Z" }, + { url = "https://files.pythonhosted.org/packages/02/7e/ffaba1bf3719088be3ad6983a5e85e1fc9edccd7b406b98e433436ecef74/contourpy-1.1.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:70e5a10f8093d228bb2b552beeb318b8928b8a94763ef03b858ef3612b29395d", size = 247023, upload-time = "2023-09-16T10:22:26.954Z" }, + { url = "https://files.pythonhosted.org/packages/a6/82/29f5ff4ae074c3230e266bc9efef449ebde43721a727b989dd8ef8f97d73/contourpy-1.1.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:8394e652925a18ef0091115e3cc191fef350ab6dc3cc417f06da66bf98071ae9", size = 232380, upload-time = "2023-09-16T10:22:30.423Z" }, + { url = "https://files.pythonhosted.org/packages/9b/cb/08f884c4c2efd433a38876b1b8069bfecef3f2d21ff0ce635d455962f70f/contourpy-1.1.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c5bd5680f844c3ff0008523a71949a3ff5e4953eb7701b28760805bc9bcff217", size = 285830, upload-time = "2023-09-16T10:22:33.787Z" }, + { url = "https://files.pythonhosted.org/packages/8e/57/cd4d4c99d999a25e9d518f628b4793e64b1ecb8ad3147f8469d8d4a80678/contourpy-1.1.1-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:66544f853bfa85c0d07a68f6c648b2ec81dafd30f272565c37ab47a33b220684", size = 322038, upload-time = "2023-09-16T10:22:37.627Z" }, + { url = "https://files.pythonhosted.org/packages/32/b6/c57ed305a6f86731107fc183e97c7e6a6005d145f5c5228a44718082ad12/contourpy-1.1.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e0c02b75acfea5cab07585d25069207e478d12309557f90a61b5a3b4f77f46ce", size = 295797, upload-time = "2023-09-16T10:22:41.952Z" }, + { url = "https://files.pythonhosted.org/packages/8e/71/7f20855592cc929bc206810432b991ec4c702dc26b0567b132e52c85536f/contourpy-1.1.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:41339b24471c58dc1499e56783fedc1afa4bb018bcd035cfb0ee2ad2a7501ef8", size = 301124, upload-time = "2023-09-16T10:22:45.993Z" }, + { url = "https://files.pythonhosted.org/packages/86/6d/52c2fc80f433e7cdc8624d82e1422ad83ad461463cf16a1953bbc7d10eb1/contourpy-1.1.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:f29fb0b3f1217dfe9362ec55440d0743fe868497359f2cf93293f4b2701b8251", size = 819787, upload-time = "2023-09-16T10:22:53.511Z" }, + { url = "https://files.pythonhosted.org/packages/d0/b0/f8d4548e89f929d6c5ca329df9afad6190af60079ec77d8c31eb48cf6f82/contourpy-1.1.1-cp38-cp38-win32.whl", hash = "sha256:f9dc7f933975367251c1b34da882c4f0e0b2e24bb35dc906d2f598a40b72bfc7", size = 400031, upload-time = "2023-09-16T10:22:57.78Z" }, + { url = "https://files.pythonhosted.org/packages/96/1b/b05cd42c8d21767a0488b883b38658fb9a45f86c293b7b42521a8113dc5d/contourpy-1.1.1-cp38-cp38-win_amd64.whl", hash = "sha256:498e53573e8b94b1caeb9e62d7c2d053c263ebb6aa259c81050766beb50ff8d9", size = 477949, upload-time = "2023-09-16T10:23:02.587Z" }, + { url = "https://files.pythonhosted.org/packages/16/d9/8a15ff67fc27c65939e454512955e1b240ec75cd201d82e115b3b63ef76d/contourpy-1.1.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:ba42e3810999a0ddd0439e6e5dbf6d034055cdc72b7c5c839f37a7c274cb4eba", size = 247396, upload-time = "2023-09-16T10:23:06.429Z" }, + { url = "https://files.pythonhosted.org/packages/09/fe/086e6847ee53da10ddf0b6c5e5f877ab43e68e355d2f4c85f67561ee8a57/contourpy-1.1.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:6c06e4c6e234fcc65435223c7b2a90f286b7f1b2733058bdf1345d218cc59e34", size = 232598, upload-time = "2023-09-16T10:23:11.009Z" }, + { url = "https://files.pythonhosted.org/packages/a3/9c/662925239e1185c6cf1da8c334e4c61bddcfa8e528f4b51083b613003170/contourpy-1.1.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ca6fab080484e419528e98624fb5c4282148b847e3602dc8dbe0cb0669469887", size = 286436, upload-time = "2023-09-16T10:23:14.624Z" }, + { url = "https://files.pythonhosted.org/packages/d3/7e/417cdf65da7140981079eda6a81ecd593ae0239bf8c738f2e2b3f6df8920/contourpy-1.1.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:93df44ab351119d14cd1e6b52a5063d3336f0754b72736cc63db59307dabb718", size = 322629, upload-time = "2023-09-16T10:23:18.203Z" }, + { url = "https://files.pythonhosted.org/packages/a8/22/ffd88aef74cc045698c5e5c400e8b7cd62311199c109245ac7827290df2c/contourpy-1.1.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:eafbef886566dc1047d7b3d4b14db0d5b7deb99638d8e1be4e23a7c7ac59ff0f", size = 297117, upload-time = "2023-09-16T10:23:21.586Z" }, + { url = "https://files.pythonhosted.org/packages/2b/c0/24c34c41a180f875419b536125799c61e2330b997d77a5a818a3bc3e08cd/contourpy-1.1.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:efe0fab26d598e1ec07d72cf03eaeeba8e42b4ecf6b9ccb5a356fde60ff08b85", size = 301855, upload-time = "2023-09-16T10:23:25.584Z" }, + { url = "https://files.pythonhosted.org/packages/bf/ec/f9877f6378a580cd683bd76c8a781dcd972e82965e0da951a739d3364677/contourpy-1.1.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:f08e469821a5e4751c97fcd34bcb586bc243c39c2e39321822060ba902eac49e", size = 820597, upload-time = "2023-09-16T10:23:33.133Z" }, + { url = "https://files.pythonhosted.org/packages/e1/3a/c41f4bc7122d3a06388acae1bed6f50a665c1031863ca42bd701094dcb1f/contourpy-1.1.1-cp39-cp39-win32.whl", hash = "sha256:bfc8a5e9238232a45ebc5cb3bfee71f1167064c8d382cadd6076f0d51cff1da0", size = 400031, upload-time = "2023-09-16T10:23:37.546Z" }, + { url = "https://files.pythonhosted.org/packages/87/2b/9b49451f7412cc1a79198e94a771a4e52d65c479aae610b1161c0290ef2c/contourpy-1.1.1-cp39-cp39-win_amd64.whl", hash = "sha256:c84fdf3da00c2827d634de4fcf17e3e067490c4aea82833625c4c8e6cdea0887", size = 435965, upload-time = "2023-09-16T10:23:42.512Z" }, + { url = "https://files.pythonhosted.org/packages/e6/3c/fc36884b6793e2066a6ff25c86e21b8bd62553456b07e964c260bcf22711/contourpy-1.1.1-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:229a25f68046c5cf8067d6d6351c8b99e40da11b04d8416bf8d2b1d75922521e", size = 246493, upload-time = "2023-09-16T10:23:45.721Z" }, + { url = "https://files.pythonhosted.org/packages/3d/85/f4c5b09ce79828ed4553a8ae2ebdf937794f57b45848b1f5c95d9744ecc2/contourpy-1.1.1-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a10dab5ea1bd4401c9483450b5b0ba5416be799bbd50fc7a6cc5e2a15e03e8a3", size = 289240, upload-time = "2023-09-16T10:23:49.207Z" }, + { url = "https://files.pythonhosted.org/packages/18/d3/9d7c0a372baf5130c1417a4b8275079d5379c11355436cb9fc78af7d7559/contourpy-1.1.1-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:4f9147051cb8fdb29a51dc2482d792b3b23e50f8f57e3720ca2e3d438b7adf23", size = 476043, upload-time = "2023-09-16T10:23:54.495Z" }, + { url = "https://files.pythonhosted.org/packages/e7/12/643242c3d9b031ca19f9a440f63e568dd883a04711056ca5d607f9bda888/contourpy-1.1.1-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:a75cc163a5f4531a256f2c523bd80db509a49fc23721b36dd1ef2f60ff41c3cb", size = 246247, upload-time = "2023-09-16T10:23:58.204Z" }, + { url = "https://files.pythonhosted.org/packages/e1/37/95716fe235bf441422059e4afcd4b9b7c5821851c2aee992a06d1e9f831a/contourpy-1.1.1-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3b53d5769aa1f2d4ea407c65f2d1d08002952fac1d9e9d307aa2e1023554a163", size = 289029, upload-time = "2023-09-16T10:24:02.085Z" }, + { url = "https://files.pythonhosted.org/packages/e5/fd/14852c4a688031e0d8a20d9a1b60078d45507186ef17042093835be2f01a/contourpy-1.1.1-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:11b836b7dbfb74e049c302bbf74b4b8f6cb9d0b6ca1bf86cfa8ba144aedadd9c", size = 476043, upload-time = "2023-09-16T10:24:07.292Z" }, +] + +[[package]] +name = "contourpy" +version = "1.3.0" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version == '3.9.*'", +] +dependencies = [ + { name = "numpy", version = "1.26.4", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version == '3.9.*'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/f5/f6/31a8f28b4a2a4fa0e01085e542f3081ab0588eff8e589d39d775172c9792/contourpy-1.3.0.tar.gz", hash = "sha256:7ffa0db17717a8ffb127efd0c95a4362d996b892c2904db72428d5b52e1938a4", size = 13464370, upload-time = "2024-08-27T21:00:03.328Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/6c/e0/be8dcc796cfdd96708933e0e2da99ba4bb8f9b2caa9d560a50f3f09a65f3/contourpy-1.3.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:880ea32e5c774634f9fcd46504bf9f080a41ad855f4fef54f5380f5133d343c7", size = 265366, upload-time = "2024-08-27T20:50:09.947Z" }, + { url = "https://files.pythonhosted.org/packages/50/d6/c953b400219443535d412fcbbc42e7a5e823291236bc0bb88936e3cc9317/contourpy-1.3.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:76c905ef940a4474a6289c71d53122a4f77766eef23c03cd57016ce19d0f7b42", size = 249226, upload-time = "2024-08-27T20:50:16.1Z" }, + { url = "https://files.pythonhosted.org/packages/6f/b4/6fffdf213ffccc28483c524b9dad46bb78332851133b36ad354b856ddc7c/contourpy-1.3.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:92f8557cbb07415a4d6fa191f20fd9d2d9eb9c0b61d1b2f52a8926e43c6e9af7", size = 308460, upload-time = "2024-08-27T20:50:22.536Z" }, + { url = "https://files.pythonhosted.org/packages/cf/6c/118fc917b4050f0afe07179a6dcbe4f3f4ec69b94f36c9e128c4af480fb8/contourpy-1.3.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:36f965570cff02b874773c49bfe85562b47030805d7d8360748f3eca570f4cab", size = 347623, upload-time = "2024-08-27T20:50:28.806Z" }, + { url = "https://files.pythonhosted.org/packages/f9/a4/30ff110a81bfe3abf7b9673284d21ddce8cc1278f6f77393c91199da4c90/contourpy-1.3.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:cacd81e2d4b6f89c9f8a5b69b86490152ff39afc58a95af002a398273e5ce589", size = 317761, upload-time = "2024-08-27T20:50:35.126Z" }, + { url = "https://files.pythonhosted.org/packages/99/e6/d11966962b1aa515f5586d3907ad019f4b812c04e4546cc19ebf62b5178e/contourpy-1.3.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:69375194457ad0fad3a839b9e29aa0b0ed53bb54db1bfb6c3ae43d111c31ce41", size = 322015, upload-time = "2024-08-27T20:50:40.318Z" }, + { url = "https://files.pythonhosted.org/packages/4d/e3/182383743751d22b7b59c3c753277b6aee3637049197624f333dac5b4c80/contourpy-1.3.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:7a52040312b1a858b5e31ef28c2e865376a386c60c0e248370bbea2d3f3b760d", size = 1262672, upload-time = "2024-08-27T20:50:55.643Z" }, + { url = "https://files.pythonhosted.org/packages/78/53/974400c815b2e605f252c8fb9297e2204347d1755a5374354ee77b1ea259/contourpy-1.3.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:3faeb2998e4fcb256542e8a926d08da08977f7f5e62cf733f3c211c2a5586223", size = 1321688, upload-time = "2024-08-27T20:51:11.293Z" }, + { url = "https://files.pythonhosted.org/packages/52/29/99f849faed5593b2926a68a31882af98afbeac39c7fdf7de491d9c85ec6a/contourpy-1.3.0-cp310-cp310-win32.whl", hash = "sha256:36e0cff201bcb17a0a8ecc7f454fe078437fa6bda730e695a92f2d9932bd507f", size = 171145, upload-time = "2024-08-27T20:51:15.2Z" }, + { url = "https://files.pythonhosted.org/packages/a9/97/3f89bba79ff6ff2b07a3cbc40aa693c360d5efa90d66e914f0ff03b95ec7/contourpy-1.3.0-cp310-cp310-win_amd64.whl", hash = "sha256:87ddffef1dbe5e669b5c2440b643d3fdd8622a348fe1983fad7a0f0ccb1cd67b", size = 216019, upload-time = "2024-08-27T20:51:19.365Z" }, + { url = "https://files.pythonhosted.org/packages/b3/1f/9375917786cb39270b0ee6634536c0e22abf225825602688990d8f5c6c19/contourpy-1.3.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:0fa4c02abe6c446ba70d96ece336e621efa4aecae43eaa9b030ae5fb92b309ad", size = 266356, upload-time = "2024-08-27T20:51:24.146Z" }, + { url = "https://files.pythonhosted.org/packages/05/46/9256dd162ea52790c127cb58cfc3b9e3413a6e3478917d1f811d420772ec/contourpy-1.3.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:834e0cfe17ba12f79963861e0f908556b2cedd52e1f75e6578801febcc6a9f49", size = 250915, upload-time = "2024-08-27T20:51:28.683Z" }, + { url = "https://files.pythonhosted.org/packages/e1/5d/3056c167fa4486900dfbd7e26a2fdc2338dc58eee36d490a0ed3ddda5ded/contourpy-1.3.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dbc4c3217eee163fa3984fd1567632b48d6dfd29216da3ded3d7b844a8014a66", size = 310443, upload-time = "2024-08-27T20:51:33.675Z" }, + { url = "https://files.pythonhosted.org/packages/ca/c2/1a612e475492e07f11c8e267ea5ec1ce0d89971be496c195e27afa97e14a/contourpy-1.3.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4865cd1d419e0c7a7bf6de1777b185eebdc51470800a9f42b9e9decf17762081", size = 348548, upload-time = "2024-08-27T20:51:39.322Z" }, + { url = "https://files.pythonhosted.org/packages/45/cf/2c2fc6bb5874158277b4faf136847f0689e1b1a1f640a36d76d52e78907c/contourpy-1.3.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:303c252947ab4b14c08afeb52375b26781ccd6a5ccd81abcdfc1fafd14cf93c1", size = 319118, upload-time = "2024-08-27T20:51:44.717Z" }, + { url = "https://files.pythonhosted.org/packages/03/33/003065374f38894cdf1040cef474ad0546368eea7e3a51d48b8a423961f8/contourpy-1.3.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:637f674226be46f6ba372fd29d9523dd977a291f66ab2a74fbeb5530bb3f445d", size = 323162, upload-time = "2024-08-27T20:51:49.683Z" }, + { url = "https://files.pythonhosted.org/packages/42/80/e637326e85e4105a802e42959f56cff2cd39a6b5ef68d5d9aee3ea5f0e4c/contourpy-1.3.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:76a896b2f195b57db25d6b44e7e03f221d32fe318d03ede41f8b4d9ba1bff53c", size = 1265396, upload-time = "2024-08-27T20:52:04.926Z" }, + { url = "https://files.pythonhosted.org/packages/7c/3b/8cbd6416ca1bbc0202b50f9c13b2e0b922b64be888f9d9ee88e6cfabfb51/contourpy-1.3.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:e1fd23e9d01591bab45546c089ae89d926917a66dceb3abcf01f6105d927e2cb", size = 1324297, upload-time = "2024-08-27T20:52:21.843Z" }, + { url = "https://files.pythonhosted.org/packages/4d/2c/021a7afaa52fe891f25535506cc861c30c3c4e5a1c1ce94215e04b293e72/contourpy-1.3.0-cp311-cp311-win32.whl", hash = "sha256:d402880b84df3bec6eab53cd0cf802cae6a2ef9537e70cf75e91618a3801c20c", size = 171808, upload-time = "2024-08-27T20:52:25.163Z" }, + { url = "https://files.pythonhosted.org/packages/8d/2f/804f02ff30a7fae21f98198828d0857439ec4c91a96e20cf2d6c49372966/contourpy-1.3.0-cp311-cp311-win_amd64.whl", hash = "sha256:6cb6cc968059db9c62cb35fbf70248f40994dfcd7aa10444bbf8b3faeb7c2d67", size = 217181, upload-time = "2024-08-27T20:52:29.13Z" }, + { url = "https://files.pythonhosted.org/packages/c9/92/8e0bbfe6b70c0e2d3d81272b58c98ac69ff1a4329f18c73bd64824d8b12e/contourpy-1.3.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:570ef7cf892f0afbe5b2ee410c507ce12e15a5fa91017a0009f79f7d93a1268f", size = 267838, upload-time = "2024-08-27T20:52:33.911Z" }, + { url = "https://files.pythonhosted.org/packages/e3/04/33351c5d5108460a8ce6d512307690b023f0cfcad5899499f5c83b9d63b1/contourpy-1.3.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:da84c537cb8b97d153e9fb208c221c45605f73147bd4cadd23bdae915042aad6", size = 251549, upload-time = "2024-08-27T20:52:39.179Z" }, + { url = "https://files.pythonhosted.org/packages/51/3d/aa0fe6ae67e3ef9f178389e4caaaa68daf2f9024092aa3c6032e3d174670/contourpy-1.3.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0be4d8425bfa755e0fd76ee1e019636ccc7c29f77a7c86b4328a9eb6a26d0639", size = 303177, upload-time = "2024-08-27T20:52:44.789Z" }, + { url = "https://files.pythonhosted.org/packages/56/c3/c85a7e3e0cab635575d3b657f9535443a6f5d20fac1a1911eaa4bbe1aceb/contourpy-1.3.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9c0da700bf58f6e0b65312d0a5e695179a71d0163957fa381bb3c1f72972537c", size = 341735, upload-time = "2024-08-27T20:52:51.05Z" }, + { url = "https://files.pythonhosted.org/packages/dd/8d/20f7a211a7be966a53f474bc90b1a8202e9844b3f1ef85f3ae45a77151ee/contourpy-1.3.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:eb8b141bb00fa977d9122636b16aa67d37fd40a3d8b52dd837e536d64b9a4d06", size = 314679, upload-time = "2024-08-27T20:52:58.473Z" }, + { url = "https://files.pythonhosted.org/packages/6e/be/524e377567defac0e21a46e2a529652d165fed130a0d8a863219303cee18/contourpy-1.3.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3634b5385c6716c258d0419c46d05c8aa7dc8cb70326c9a4fb66b69ad2b52e09", size = 320549, upload-time = "2024-08-27T20:53:06.593Z" }, + { url = "https://files.pythonhosted.org/packages/0f/96/fdb2552a172942d888915f3a6663812e9bc3d359d53dafd4289a0fb462f0/contourpy-1.3.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:0dce35502151b6bd35027ac39ba6e5a44be13a68f55735c3612c568cac3805fd", size = 1263068, upload-time = "2024-08-27T20:53:23.442Z" }, + { url = "https://files.pythonhosted.org/packages/2a/25/632eab595e3140adfa92f1322bf8915f68c932bac468e89eae9974cf1c00/contourpy-1.3.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:aea348f053c645100612b333adc5983d87be69acdc6d77d3169c090d3b01dc35", size = 1322833, upload-time = "2024-08-27T20:53:39.243Z" }, + { url = "https://files.pythonhosted.org/packages/73/e3/69738782e315a1d26d29d71a550dbbe3eb6c653b028b150f70c1a5f4f229/contourpy-1.3.0-cp312-cp312-win32.whl", hash = "sha256:90f73a5116ad1ba7174341ef3ea5c3150ddf20b024b98fb0c3b29034752c8aeb", size = 172681, upload-time = "2024-08-27T20:53:43.05Z" }, + { url = "https://files.pythonhosted.org/packages/0c/89/9830ba00d88e43d15e53d64931e66b8792b46eb25e2050a88fec4a0df3d5/contourpy-1.3.0-cp312-cp312-win_amd64.whl", hash = "sha256:b11b39aea6be6764f84360fce6c82211a9db32a7c7de8fa6dd5397cf1d079c3b", size = 218283, upload-time = "2024-08-27T20:53:47.232Z" }, + { url = "https://files.pythonhosted.org/packages/53/a1/d20415febfb2267af2d7f06338e82171824d08614084714fb2c1dac9901f/contourpy-1.3.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:3e1c7fa44aaae40a2247e2e8e0627f4bea3dd257014764aa644f319a5f8600e3", size = 267879, upload-time = "2024-08-27T20:53:51.597Z" }, + { url = "https://files.pythonhosted.org/packages/aa/45/5a28a3570ff6218d8bdfc291a272a20d2648104815f01f0177d103d985e1/contourpy-1.3.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:364174c2a76057feef647c802652f00953b575723062560498dc7930fc9b1cb7", size = 251573, upload-time = "2024-08-27T20:53:55.659Z" }, + { url = "https://files.pythonhosted.org/packages/39/1c/d3f51540108e3affa84f095c8b04f0aa833bb797bc8baa218a952a98117d/contourpy-1.3.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:32b238b3b3b649e09ce9aaf51f0c261d38644bdfa35cbaf7b263457850957a84", size = 303184, upload-time = "2024-08-27T20:54:00.225Z" }, + { url = "https://files.pythonhosted.org/packages/00/56/1348a44fb6c3a558c1a3a0cd23d329d604c99d81bf5a4b58c6b71aab328f/contourpy-1.3.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d51fca85f9f7ad0b65b4b9fe800406d0d77017d7270d31ec3fb1cc07358fdea0", size = 340262, upload-time = "2024-08-27T20:54:05.234Z" }, + { url = "https://files.pythonhosted.org/packages/2b/23/00d665ba67e1bb666152131da07e0f24c95c3632d7722caa97fb61470eca/contourpy-1.3.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:732896af21716b29ab3e988d4ce14bc5133733b85956316fb0c56355f398099b", size = 313806, upload-time = "2024-08-27T20:54:09.889Z" }, + { url = "https://files.pythonhosted.org/packages/5a/42/3cf40f7040bb8362aea19af9a5fb7b32ce420f645dd1590edcee2c657cd5/contourpy-1.3.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d73f659398a0904e125280836ae6f88ba9b178b2fed6884f3b1f95b989d2c8da", size = 319710, upload-time = "2024-08-27T20:54:14.536Z" }, + { url = "https://files.pythonhosted.org/packages/05/32/f3bfa3fc083b25e1a7ae09197f897476ee68e7386e10404bdf9aac7391f0/contourpy-1.3.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:c6c7c2408b7048082932cf4e641fa3b8ca848259212f51c8c59c45aa7ac18f14", size = 1264107, upload-time = "2024-08-27T20:54:29.735Z" }, + { url = "https://files.pythonhosted.org/packages/1c/1e/1019d34473a736664f2439542b890b2dc4c6245f5c0d8cdfc0ccc2cab80c/contourpy-1.3.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:f317576606de89da6b7e0861cf6061f6146ead3528acabff9236458a6ba467f8", size = 1322458, upload-time = "2024-08-27T20:54:45.507Z" }, + { url = "https://files.pythonhosted.org/packages/22/85/4f8bfd83972cf8909a4d36d16b177f7b8bdd942178ea4bf877d4a380a91c/contourpy-1.3.0-cp313-cp313-win32.whl", hash = "sha256:31cd3a85dbdf1fc002280c65caa7e2b5f65e4a973fcdf70dd2fdcb9868069294", size = 172643, upload-time = "2024-08-27T20:55:52.754Z" }, + { url = "https://files.pythonhosted.org/packages/cc/4a/fb3c83c1baba64ba90443626c228ca14f19a87c51975d3b1de308dd2cf08/contourpy-1.3.0-cp313-cp313-win_amd64.whl", hash = "sha256:4553c421929ec95fb07b3aaca0fae668b2eb5a5203d1217ca7c34c063c53d087", size = 218301, upload-time = "2024-08-27T20:55:56.509Z" }, + { url = "https://files.pythonhosted.org/packages/76/65/702f4064f397821fea0cb493f7d3bc95a5d703e20954dce7d6d39bacf378/contourpy-1.3.0-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:345af746d7766821d05d72cb8f3845dfd08dd137101a2cb9b24de277d716def8", size = 278972, upload-time = "2024-08-27T20:54:50.347Z" }, + { url = "https://files.pythonhosted.org/packages/80/85/21f5bba56dba75c10a45ec00ad3b8190dbac7fd9a8a8c46c6116c933e9cf/contourpy-1.3.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:3bb3808858a9dc68f6f03d319acd5f1b8a337e6cdda197f02f4b8ff67ad2057b", size = 263375, upload-time = "2024-08-27T20:54:54.909Z" }, + { url = "https://files.pythonhosted.org/packages/0a/64/084c86ab71d43149f91ab3a4054ccf18565f0a8af36abfa92b1467813ed6/contourpy-1.3.0-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:420d39daa61aab1221567b42eecb01112908b2cab7f1b4106a52caaec8d36973", size = 307188, upload-time = "2024-08-27T20:55:00.184Z" }, + { url = "https://files.pythonhosted.org/packages/3d/ff/d61a4c288dc42da0084b8d9dc2aa219a850767165d7d9a9c364ff530b509/contourpy-1.3.0-cp313-cp313t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4d63ee447261e963af02642ffcb864e5a2ee4cbfd78080657a9880b8b1868e18", size = 345644, upload-time = "2024-08-27T20:55:05.673Z" }, + { url = "https://files.pythonhosted.org/packages/ca/aa/00d2313d35ec03f188e8f0786c2fc61f589306e02fdc158233697546fd58/contourpy-1.3.0-cp313-cp313t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:167d6c890815e1dac9536dca00828b445d5d0df4d6a8c6adb4a7ec3166812fa8", size = 317141, upload-time = "2024-08-27T20:55:11.047Z" }, + { url = "https://files.pythonhosted.org/packages/8d/6a/b5242c8cb32d87f6abf4f5e3044ca397cb1a76712e3fa2424772e3ff495f/contourpy-1.3.0-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:710a26b3dc80c0e4febf04555de66f5fd17e9cf7170a7b08000601a10570bda6", size = 323469, upload-time = "2024-08-27T20:55:15.914Z" }, + { url = "https://files.pythonhosted.org/packages/6f/a6/73e929d43028a9079aca4bde107494864d54f0d72d9db508a51ff0878593/contourpy-1.3.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:75ee7cb1a14c617f34a51d11fa7524173e56551646828353c4af859c56b766e2", size = 1260894, upload-time = "2024-08-27T20:55:31.553Z" }, + { url = "https://files.pythonhosted.org/packages/2b/1e/1e726ba66eddf21c940821df8cf1a7d15cb165f0682d62161eaa5e93dae1/contourpy-1.3.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:33c92cdae89ec5135d036e7218e69b0bb2851206077251f04a6c4e0e21f03927", size = 1314829, upload-time = "2024-08-27T20:55:47.837Z" }, + { url = "https://files.pythonhosted.org/packages/b3/e3/b9f72758adb6ef7397327ceb8b9c39c75711affb220e4f53c745ea1d5a9a/contourpy-1.3.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:a11077e395f67ffc2c44ec2418cfebed032cd6da3022a94fc227b6faf8e2acb8", size = 265518, upload-time = "2024-08-27T20:56:01.333Z" }, + { url = "https://files.pythonhosted.org/packages/ec/22/19f5b948367ab5260fb41d842c7a78dae645603881ea6bc39738bcfcabf6/contourpy-1.3.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:e8134301d7e204c88ed7ab50028ba06c683000040ede1d617298611f9dc6240c", size = 249350, upload-time = "2024-08-27T20:56:05.432Z" }, + { url = "https://files.pythonhosted.org/packages/26/76/0c7d43263dd00ae21a91a24381b7e813d286a3294d95d179ef3a7b9fb1d7/contourpy-1.3.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e12968fdfd5bb45ffdf6192a590bd8ddd3ba9e58360b29683c6bb71a7b41edca", size = 309167, upload-time = "2024-08-27T20:56:10.034Z" }, + { url = "https://files.pythonhosted.org/packages/96/3b/cadff6773e89f2a5a492c1a8068e21d3fccaf1a1c1df7d65e7c8e3ef60ba/contourpy-1.3.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:fd2a0fc506eccaaa7595b7e1418951f213cf8255be2600f1ea1b61e46a60c55f", size = 348279, upload-time = "2024-08-27T20:56:15.41Z" }, + { url = "https://files.pythonhosted.org/packages/e1/86/158cc43aa549d2081a955ab11c6bdccc7a22caacc2af93186d26f5f48746/contourpy-1.3.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4cfb5c62ce023dfc410d6059c936dcf96442ba40814aefbfa575425a3a7f19dc", size = 318519, upload-time = "2024-08-27T20:56:21.813Z" }, + { url = "https://files.pythonhosted.org/packages/05/11/57335544a3027e9b96a05948c32e566328e3a2f84b7b99a325b7a06d2b06/contourpy-1.3.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:68a32389b06b82c2fdd68276148d7b9275b5f5cf13e5417e4252f6d1a34f72a2", size = 321922, upload-time = "2024-08-27T20:56:26.983Z" }, + { url = "https://files.pythonhosted.org/packages/0b/e3/02114f96543f4a1b694333b92a6dcd4f8eebbefcc3a5f3bbb1316634178f/contourpy-1.3.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:94e848a6b83da10898cbf1311a815f770acc9b6a3f2d646f330d57eb4e87592e", size = 1258017, upload-time = "2024-08-27T20:56:42.246Z" }, + { url = "https://files.pythonhosted.org/packages/f3/3b/bfe4c81c6d5881c1c643dde6620be0b42bf8aab155976dd644595cfab95c/contourpy-1.3.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:d78ab28a03c854a873787a0a42254a0ccb3cb133c672f645c9f9c8f3ae9d0800", size = 1316773, upload-time = "2024-08-27T20:56:58.58Z" }, + { url = "https://files.pythonhosted.org/packages/f1/17/c52d2970784383cafb0bd918b6fb036d98d96bbf0bc1befb5d1e31a07a70/contourpy-1.3.0-cp39-cp39-win32.whl", hash = "sha256:81cb5ed4952aae6014bc9d0421dec7c5835c9c8c31cdf51910b708f548cf58e5", size = 171353, upload-time = "2024-08-27T20:57:02.718Z" }, + { url = "https://files.pythonhosted.org/packages/53/23/db9f69676308e094d3c45f20cc52e12d10d64f027541c995d89c11ad5c75/contourpy-1.3.0-cp39-cp39-win_amd64.whl", hash = "sha256:14e262f67bd7e6eb6880bc564dcda30b15e351a594657e55b7eec94b6ef72843", size = 211817, upload-time = "2024-08-27T20:57:06.328Z" }, + { url = "https://files.pythonhosted.org/packages/d1/09/60e486dc2b64c94ed33e58dcfb6f808192c03dfc5574c016218b9b7680dc/contourpy-1.3.0-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:fe41b41505a5a33aeaed2a613dccaeaa74e0e3ead6dd6fd3a118fb471644fd6c", size = 261886, upload-time = "2024-08-27T20:57:10.863Z" }, + { url = "https://files.pythonhosted.org/packages/19/20/b57f9f7174fcd439a7789fb47d764974ab646fa34d1790551de386457a8e/contourpy-1.3.0-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:eca7e17a65f72a5133bdbec9ecf22401c62bcf4821361ef7811faee695799779", size = 311008, upload-time = "2024-08-27T20:57:15.588Z" }, + { url = "https://files.pythonhosted.org/packages/74/fc/5040d42623a1845d4f17a418e590fd7a79ae8cb2bad2b2f83de63c3bdca4/contourpy-1.3.0-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:1ec4dc6bf570f5b22ed0d7efba0dfa9c5b9e0431aeea7581aa217542d9e809a4", size = 215690, upload-time = "2024-08-27T20:57:19.321Z" }, + { url = "https://files.pythonhosted.org/packages/2b/24/dc3dcd77ac7460ab7e9d2b01a618cb31406902e50e605a8d6091f0a8f7cc/contourpy-1.3.0-pp39-pypy39_pp73-macosx_10_15_x86_64.whl", hash = "sha256:00ccd0dbaad6d804ab259820fa7cb0b8036bda0686ef844d24125d8287178ce0", size = 261894, upload-time = "2024-08-27T20:57:23.873Z" }, + { url = "https://files.pythonhosted.org/packages/b1/db/531642a01cfec39d1682e46b5457b07cf805e3c3c584ec27e2a6223f8f6c/contourpy-1.3.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8ca947601224119117f7c19c9cdf6b3ab54c5726ef1d906aa4a69dfb6dd58102", size = 311099, upload-time = "2024-08-27T20:57:28.58Z" }, + { url = "https://files.pythonhosted.org/packages/38/1e/94bda024d629f254143a134eead69e21c836429a2a6ce82209a00ddcb79a/contourpy-1.3.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:c6ec93afeb848a0845a18989da3beca3eec2c0f852322efe21af1931147d12cb", size = 215838, upload-time = "2024-08-27T20:57:32.913Z" }, +] + +[[package]] +name = "contourpy" +version = "1.3.2" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version == '3.10.*'", +] +dependencies = [ + { name = "numpy", version = "1.26.4", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version == '3.10.*'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/66/54/eb9bfc647b19f2009dd5c7f5ec51c4e6ca831725f1aea7a993034f483147/contourpy-1.3.2.tar.gz", hash = "sha256:b6945942715a034c671b7fc54f9588126b0b8bf23db2696e3ca8328f3ff0ab54", size = 13466130, upload-time = "2025-04-15T17:47:53.79Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/12/a3/da4153ec8fe25d263aa48c1a4cbde7f49b59af86f0b6f7862788c60da737/contourpy-1.3.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:ba38e3f9f330af820c4b27ceb4b9c7feee5fe0493ea53a8720f4792667465934", size = 268551, upload-time = "2025-04-15T17:34:46.581Z" }, + { url = "https://files.pythonhosted.org/packages/2f/6c/330de89ae1087eb622bfca0177d32a7ece50c3ef07b28002de4757d9d875/contourpy-1.3.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:dc41ba0714aa2968d1f8674ec97504a8f7e334f48eeacebcaa6256213acb0989", size = 253399, upload-time = "2025-04-15T17:34:51.427Z" }, + { url = "https://files.pythonhosted.org/packages/c1/bd/20c6726b1b7f81a8bee5271bed5c165f0a8e1f572578a9d27e2ccb763cb2/contourpy-1.3.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9be002b31c558d1ddf1b9b415b162c603405414bacd6932d031c5b5a8b757f0d", size = 312061, upload-time = "2025-04-15T17:34:55.961Z" }, + { url = "https://files.pythonhosted.org/packages/22/fc/a9665c88f8a2473f823cf1ec601de9e5375050f1958cbb356cdf06ef1ab6/contourpy-1.3.2-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8d2e74acbcba3bfdb6d9d8384cdc4f9260cae86ed9beee8bd5f54fee49a430b9", size = 351956, upload-time = "2025-04-15T17:35:00.992Z" }, + { url = "https://files.pythonhosted.org/packages/25/eb/9f0a0238f305ad8fb7ef42481020d6e20cf15e46be99a1fcf939546a177e/contourpy-1.3.2-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e259bced5549ac64410162adc973c5e2fb77f04df4a439d00b478e57a0e65512", size = 320872, upload-time = "2025-04-15T17:35:06.177Z" }, + { url = "https://files.pythonhosted.org/packages/32/5c/1ee32d1c7956923202f00cf8d2a14a62ed7517bdc0ee1e55301227fc273c/contourpy-1.3.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ad687a04bc802cbe8b9c399c07162a3c35e227e2daccf1668eb1f278cb698631", size = 325027, upload-time = "2025-04-15T17:35:11.244Z" }, + { url = "https://files.pythonhosted.org/packages/83/bf/9baed89785ba743ef329c2b07fd0611d12bfecbedbdd3eeecf929d8d3b52/contourpy-1.3.2-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:cdd22595308f53ef2f891040ab2b93d79192513ffccbd7fe19be7aa773a5e09f", size = 1306641, upload-time = "2025-04-15T17:35:26.701Z" }, + { url = "https://files.pythonhosted.org/packages/d4/cc/74e5e83d1e35de2d28bd97033426b450bc4fd96e092a1f7a63dc7369b55d/contourpy-1.3.2-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:b4f54d6a2defe9f257327b0f243612dd051cc43825587520b1bf74a31e2f6ef2", size = 1374075, upload-time = "2025-04-15T17:35:43.204Z" }, + { url = "https://files.pythonhosted.org/packages/0c/42/17f3b798fd5e033b46a16f8d9fcb39f1aba051307f5ebf441bad1ecf78f8/contourpy-1.3.2-cp310-cp310-win32.whl", hash = "sha256:f939a054192ddc596e031e50bb13b657ce318cf13d264f095ce9db7dc6ae81c0", size = 177534, upload-time = "2025-04-15T17:35:46.554Z" }, + { url = "https://files.pythonhosted.org/packages/54/ec/5162b8582f2c994721018d0c9ece9dc6ff769d298a8ac6b6a652c307e7df/contourpy-1.3.2-cp310-cp310-win_amd64.whl", hash = "sha256:c440093bbc8fc21c637c03bafcbef95ccd963bc6e0514ad887932c18ca2a759a", size = 221188, upload-time = "2025-04-15T17:35:50.064Z" }, + { url = "https://files.pythonhosted.org/packages/b3/b9/ede788a0b56fc5b071639d06c33cb893f68b1178938f3425debebe2dab78/contourpy-1.3.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:6a37a2fb93d4df3fc4c0e363ea4d16f83195fc09c891bc8ce072b9d084853445", size = 269636, upload-time = "2025-04-15T17:35:54.473Z" }, + { url = "https://files.pythonhosted.org/packages/e6/75/3469f011d64b8bbfa04f709bfc23e1dd71be54d05b1b083be9f5b22750d1/contourpy-1.3.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:b7cd50c38f500bbcc9b6a46643a40e0913673f869315d8e70de0438817cb7773", size = 254636, upload-time = "2025-04-15T17:35:58.283Z" }, + { url = "https://files.pythonhosted.org/packages/8d/2f/95adb8dae08ce0ebca4fd8e7ad653159565d9739128b2d5977806656fcd2/contourpy-1.3.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d6658ccc7251a4433eebd89ed2672c2ed96fba367fd25ca9512aa92a4b46c4f1", size = 313053, upload-time = "2025-04-15T17:36:03.235Z" }, + { url = "https://files.pythonhosted.org/packages/c3/a6/8ccf97a50f31adfa36917707fe39c9a0cbc24b3bbb58185577f119736cc9/contourpy-1.3.2-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:70771a461aaeb335df14deb6c97439973d253ae70660ca085eec25241137ef43", size = 352985, upload-time = "2025-04-15T17:36:08.275Z" }, + { url = "https://files.pythonhosted.org/packages/1d/b6/7925ab9b77386143f39d9c3243fdd101621b4532eb126743201160ffa7e6/contourpy-1.3.2-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:65a887a6e8c4cd0897507d814b14c54a8c2e2aa4ac9f7686292f9769fcf9a6ab", size = 323750, upload-time = "2025-04-15T17:36:13.29Z" }, + { url = "https://files.pythonhosted.org/packages/c2/f3/20c5d1ef4f4748e52d60771b8560cf00b69d5c6368b5c2e9311bcfa2a08b/contourpy-1.3.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3859783aefa2b8355697f16642695a5b9792e7a46ab86da1118a4a23a51a33d7", size = 326246, upload-time = "2025-04-15T17:36:18.329Z" }, + { url = "https://files.pythonhosted.org/packages/8c/e5/9dae809e7e0b2d9d70c52b3d24cba134dd3dad979eb3e5e71f5df22ed1f5/contourpy-1.3.2-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:eab0f6db315fa4d70f1d8ab514e527f0366ec021ff853d7ed6a2d33605cf4b83", size = 1308728, upload-time = "2025-04-15T17:36:33.878Z" }, + { url = "https://files.pythonhosted.org/packages/e2/4a/0058ba34aeea35c0b442ae61a4f4d4ca84d6df8f91309bc2d43bb8dd248f/contourpy-1.3.2-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:d91a3ccc7fea94ca0acab82ceb77f396d50a1f67412efe4c526f5d20264e6ecd", size = 1375762, upload-time = "2025-04-15T17:36:51.295Z" }, + { url = "https://files.pythonhosted.org/packages/09/33/7174bdfc8b7767ef2c08ed81244762d93d5c579336fc0b51ca57b33d1b80/contourpy-1.3.2-cp311-cp311-win32.whl", hash = "sha256:1c48188778d4d2f3d48e4643fb15d8608b1d01e4b4d6b0548d9b336c28fc9b6f", size = 178196, upload-time = "2025-04-15T17:36:55.002Z" }, + { url = "https://files.pythonhosted.org/packages/5e/fe/4029038b4e1c4485cef18e480b0e2cd2d755448bb071eb9977caac80b77b/contourpy-1.3.2-cp311-cp311-win_amd64.whl", hash = "sha256:5ebac872ba09cb8f2131c46b8739a7ff71de28a24c869bcad554477eb089a878", size = 222017, upload-time = "2025-04-15T17:36:58.576Z" }, + { url = "https://files.pythonhosted.org/packages/34/f7/44785876384eff370c251d58fd65f6ad7f39adce4a093c934d4a67a7c6b6/contourpy-1.3.2-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:4caf2bcd2969402bf77edc4cb6034c7dd7c0803213b3523f111eb7460a51b8d2", size = 271580, upload-time = "2025-04-15T17:37:03.105Z" }, + { url = "https://files.pythonhosted.org/packages/93/3b/0004767622a9826ea3d95f0e9d98cd8729015768075d61f9fea8eeca42a8/contourpy-1.3.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:82199cb78276249796419fe36b7386bd8d2cc3f28b3bc19fe2454fe2e26c4c15", size = 255530, upload-time = "2025-04-15T17:37:07.026Z" }, + { url = "https://files.pythonhosted.org/packages/e7/bb/7bd49e1f4fa805772d9fd130e0d375554ebc771ed7172f48dfcd4ca61549/contourpy-1.3.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:106fab697af11456fcba3e352ad50effe493a90f893fca6c2ca5c033820cea92", size = 307688, upload-time = "2025-04-15T17:37:11.481Z" }, + { url = "https://files.pythonhosted.org/packages/fc/97/e1d5dbbfa170725ef78357a9a0edc996b09ae4af170927ba8ce977e60a5f/contourpy-1.3.2-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d14f12932a8d620e307f715857107b1d1845cc44fdb5da2bc8e850f5ceba9f87", size = 347331, upload-time = "2025-04-15T17:37:18.212Z" }, + { url = "https://files.pythonhosted.org/packages/6f/66/e69e6e904f5ecf6901be3dd16e7e54d41b6ec6ae3405a535286d4418ffb4/contourpy-1.3.2-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:532fd26e715560721bb0d5fc7610fce279b3699b018600ab999d1be895b09415", size = 318963, upload-time = "2025-04-15T17:37:22.76Z" }, + { url = "https://files.pythonhosted.org/packages/a8/32/b8a1c8965e4f72482ff2d1ac2cd670ce0b542f203c8e1d34e7c3e6925da7/contourpy-1.3.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f26b383144cf2d2c29f01a1e8170f50dacf0eac02d64139dcd709a8ac4eb3cfe", size = 323681, upload-time = "2025-04-15T17:37:33.001Z" }, + { url = "https://files.pythonhosted.org/packages/30/c6/12a7e6811d08757c7162a541ca4c5c6a34c0f4e98ef2b338791093518e40/contourpy-1.3.2-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:c49f73e61f1f774650a55d221803b101d966ca0c5a2d6d5e4320ec3997489441", size = 1308674, upload-time = "2025-04-15T17:37:48.64Z" }, + { url = "https://files.pythonhosted.org/packages/2a/8a/bebe5a3f68b484d3a2b8ffaf84704b3e343ef1addea528132ef148e22b3b/contourpy-1.3.2-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:3d80b2c0300583228ac98d0a927a1ba6a2ba6b8a742463c564f1d419ee5b211e", size = 1380480, upload-time = "2025-04-15T17:38:06.7Z" }, + { url = "https://files.pythonhosted.org/packages/34/db/fcd325f19b5978fb509a7d55e06d99f5f856294c1991097534360b307cf1/contourpy-1.3.2-cp312-cp312-win32.whl", hash = "sha256:90df94c89a91b7362e1142cbee7568f86514412ab8a2c0d0fca72d7e91b62912", size = 178489, upload-time = "2025-04-15T17:38:10.338Z" }, + { url = "https://files.pythonhosted.org/packages/01/c8/fadd0b92ffa7b5eb5949bf340a63a4a496a6930a6c37a7ba0f12acb076d6/contourpy-1.3.2-cp312-cp312-win_amd64.whl", hash = "sha256:8c942a01d9163e2e5cfb05cb66110121b8d07ad438a17f9e766317bcb62abf73", size = 223042, upload-time = "2025-04-15T17:38:14.239Z" }, + { url = "https://files.pythonhosted.org/packages/2e/61/5673f7e364b31e4e7ef6f61a4b5121c5f170f941895912f773d95270f3a2/contourpy-1.3.2-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:de39db2604ae755316cb5967728f4bea92685884b1e767b7c24e983ef5f771cb", size = 271630, upload-time = "2025-04-15T17:38:19.142Z" }, + { url = "https://files.pythonhosted.org/packages/ff/66/a40badddd1223822c95798c55292844b7e871e50f6bfd9f158cb25e0bd39/contourpy-1.3.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:3f9e896f447c5c8618f1edb2bafa9a4030f22a575ec418ad70611450720b5b08", size = 255670, upload-time = "2025-04-15T17:38:23.688Z" }, + { url = "https://files.pythonhosted.org/packages/1e/c7/cf9fdee8200805c9bc3b148f49cb9482a4e3ea2719e772602a425c9b09f8/contourpy-1.3.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:71e2bd4a1c4188f5c2b8d274da78faab884b59df20df63c34f74aa1813c4427c", size = 306694, upload-time = "2025-04-15T17:38:28.238Z" }, + { url = "https://files.pythonhosted.org/packages/dd/e7/ccb9bec80e1ba121efbffad7f38021021cda5be87532ec16fd96533bb2e0/contourpy-1.3.2-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:de425af81b6cea33101ae95ece1f696af39446db9682a0b56daaa48cfc29f38f", size = 345986, upload-time = "2025-04-15T17:38:33.502Z" }, + { url = "https://files.pythonhosted.org/packages/dc/49/ca13bb2da90391fa4219fdb23b078d6065ada886658ac7818e5441448b78/contourpy-1.3.2-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:977e98a0e0480d3fe292246417239d2d45435904afd6d7332d8455981c408b85", size = 318060, upload-time = "2025-04-15T17:38:38.672Z" }, + { url = "https://files.pythonhosted.org/packages/c8/65/5245ce8c548a8422236c13ffcdcdada6a2a812c361e9e0c70548bb40b661/contourpy-1.3.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:434f0adf84911c924519d2b08fc10491dd282b20bdd3fa8f60fd816ea0b48841", size = 322747, upload-time = "2025-04-15T17:38:43.712Z" }, + { url = "https://files.pythonhosted.org/packages/72/30/669b8eb48e0a01c660ead3752a25b44fdb2e5ebc13a55782f639170772f9/contourpy-1.3.2-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:c66c4906cdbc50e9cba65978823e6e00b45682eb09adbb78c9775b74eb222422", size = 1308895, upload-time = "2025-04-15T17:39:00.224Z" }, + { url = "https://files.pythonhosted.org/packages/05/5a/b569f4250decee6e8d54498be7bdf29021a4c256e77fe8138c8319ef8eb3/contourpy-1.3.2-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:8b7fc0cd78ba2f4695fd0a6ad81a19e7e3ab825c31b577f384aa9d7817dc3bef", size = 1379098, upload-time = "2025-04-15T17:43:29.649Z" }, + { url = "https://files.pythonhosted.org/packages/19/ba/b227c3886d120e60e41b28740ac3617b2f2b971b9f601c835661194579f1/contourpy-1.3.2-cp313-cp313-win32.whl", hash = "sha256:15ce6ab60957ca74cff444fe66d9045c1fd3e92c8936894ebd1f3eef2fff075f", size = 178535, upload-time = "2025-04-15T17:44:44.532Z" }, + { url = "https://files.pythonhosted.org/packages/12/6e/2fed56cd47ca739b43e892707ae9a13790a486a3173be063681ca67d2262/contourpy-1.3.2-cp313-cp313-win_amd64.whl", hash = "sha256:e1578f7eafce927b168752ed7e22646dad6cd9bca673c60bff55889fa236ebf9", size = 223096, upload-time = "2025-04-15T17:44:48.194Z" }, + { url = "https://files.pythonhosted.org/packages/54/4c/e76fe2a03014a7c767d79ea35c86a747e9325537a8b7627e0e5b3ba266b4/contourpy-1.3.2-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:0475b1f6604896bc7c53bb070e355e9321e1bc0d381735421a2d2068ec56531f", size = 285090, upload-time = "2025-04-15T17:43:34.084Z" }, + { url = "https://files.pythonhosted.org/packages/7b/e2/5aba47debd55d668e00baf9651b721e7733975dc9fc27264a62b0dd26eb8/contourpy-1.3.2-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:c85bb486e9be652314bb5b9e2e3b0d1b2e643d5eec4992c0fbe8ac71775da739", size = 268643, upload-time = "2025-04-15T17:43:38.626Z" }, + { url = "https://files.pythonhosted.org/packages/a1/37/cd45f1f051fe6230f751cc5cdd2728bb3a203f5619510ef11e732109593c/contourpy-1.3.2-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:745b57db7758f3ffc05a10254edd3182a2a83402a89c00957a8e8a22f5582823", size = 310443, upload-time = "2025-04-15T17:43:44.522Z" }, + { url = "https://files.pythonhosted.org/packages/8b/a2/36ea6140c306c9ff6dd38e3bcec80b3b018474ef4d17eb68ceecd26675f4/contourpy-1.3.2-cp313-cp313t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:970e9173dbd7eba9b4e01aab19215a48ee5dd3f43cef736eebde064a171f89a5", size = 349865, upload-time = "2025-04-15T17:43:49.545Z" }, + { url = "https://files.pythonhosted.org/packages/95/b7/2fc76bc539693180488f7b6cc518da7acbbb9e3b931fd9280504128bf956/contourpy-1.3.2-cp313-cp313t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c6c4639a9c22230276b7bffb6a850dfc8258a2521305e1faefe804d006b2e532", size = 321162, upload-time = "2025-04-15T17:43:54.203Z" }, + { url = "https://files.pythonhosted.org/packages/f4/10/76d4f778458b0aa83f96e59d65ece72a060bacb20cfbee46cf6cd5ceba41/contourpy-1.3.2-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cc829960f34ba36aad4302e78eabf3ef16a3a100863f0d4eeddf30e8a485a03b", size = 327355, upload-time = "2025-04-15T17:44:01.025Z" }, + { url = "https://files.pythonhosted.org/packages/43/a3/10cf483ea683f9f8ab096c24bad3cce20e0d1dd9a4baa0e2093c1c962d9d/contourpy-1.3.2-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:d32530b534e986374fc19eaa77fcb87e8a99e5431499949b828312bdcd20ac52", size = 1307935, upload-time = "2025-04-15T17:44:17.322Z" }, + { url = "https://files.pythonhosted.org/packages/78/73/69dd9a024444489e22d86108e7b913f3528f56cfc312b5c5727a44188471/contourpy-1.3.2-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:e298e7e70cf4eb179cc1077be1c725b5fd131ebc81181bf0c03525c8abc297fd", size = 1372168, upload-time = "2025-04-15T17:44:33.43Z" }, + { url = "https://files.pythonhosted.org/packages/0f/1b/96d586ccf1b1a9d2004dd519b25fbf104a11589abfd05484ff12199cca21/contourpy-1.3.2-cp313-cp313t-win32.whl", hash = "sha256:d0e589ae0d55204991450bb5c23f571c64fe43adaa53f93fc902a84c96f52fe1", size = 189550, upload-time = "2025-04-15T17:44:37.092Z" }, + { url = "https://files.pythonhosted.org/packages/b0/e6/6000d0094e8a5e32ad62591c8609e269febb6e4db83a1c75ff8868b42731/contourpy-1.3.2-cp313-cp313t-win_amd64.whl", hash = "sha256:78e9253c3de756b3f6a5174d024c4835acd59eb3f8e2ca13e775dbffe1558f69", size = 238214, upload-time = "2025-04-15T17:44:40.827Z" }, + { url = "https://files.pythonhosted.org/packages/33/05/b26e3c6ecc05f349ee0013f0bb850a761016d89cec528a98193a48c34033/contourpy-1.3.2-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:fd93cc7f3139b6dd7aab2f26a90dde0aa9fc264dbf70f6740d498a70b860b82c", size = 265681, upload-time = "2025-04-15T17:44:59.314Z" }, + { url = "https://files.pythonhosted.org/packages/2b/25/ac07d6ad12affa7d1ffed11b77417d0a6308170f44ff20fa1d5aa6333f03/contourpy-1.3.2-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:107ba8a6a7eec58bb475329e6d3b95deba9440667c4d62b9b6063942b61d7f16", size = 315101, upload-time = "2025-04-15T17:45:04.165Z" }, + { url = "https://files.pythonhosted.org/packages/8f/4d/5bb3192bbe9d3f27e3061a6a8e7733c9120e203cb8515767d30973f71030/contourpy-1.3.2-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:ded1706ed0c1049224531b81128efbd5084598f18d8a2d9efae833edbd2b40ad", size = 220599, upload-time = "2025-04-15T17:45:08.456Z" }, + { url = "https://files.pythonhosted.org/packages/ff/c0/91f1215d0d9f9f343e4773ba6c9b89e8c0cc7a64a6263f21139da639d848/contourpy-1.3.2-pp311-pypy311_pp73-macosx_10_15_x86_64.whl", hash = "sha256:5f5964cdad279256c084b69c3f412b7801e15356b16efa9d78aa974041903da0", size = 266807, upload-time = "2025-04-15T17:45:15.535Z" }, + { url = "https://files.pythonhosted.org/packages/d4/79/6be7e90c955c0487e7712660d6cead01fa17bff98e0ea275737cc2bc8e71/contourpy-1.3.2-pp311-pypy311_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:49b65a95d642d4efa8f64ba12558fcb83407e58a2dfba9d796d77b63ccfcaff5", size = 318729, upload-time = "2025-04-15T17:45:20.166Z" }, + { url = "https://files.pythonhosted.org/packages/87/68/7f46fb537958e87427d98a4074bcde4b67a70b04900cfc5ce29bc2f556c1/contourpy-1.3.2-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:8c5acb8dddb0752bf252e01a3035b21443158910ac16a3b0d20e7fed7d534ce5", size = 221791, upload-time = "2025-04-15T17:45:24.794Z" }, +] + +[[package]] +name = "contourpy" +version = "1.3.3" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version >= '3.14'", + "python_full_version >= '3.11' and python_full_version < '3.14'", +] +dependencies = [ + { name = "numpy", version = "1.26.4", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/58/01/1253e6698a07380cd31a736d248a3f2a50a7c88779a1813da27503cadc2a/contourpy-1.3.3.tar.gz", hash = "sha256:083e12155b210502d0bca491432bb04d56dc3432f95a979b429f2848c3dbe880", size = 13466174, upload-time = "2025-07-26T12:03:12.549Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/91/2e/c4390a31919d8a78b90e8ecf87cd4b4c4f05a5b48d05ec17db8e5404c6f4/contourpy-1.3.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:709a48ef9a690e1343202916450bc48b9e51c049b089c7f79a267b46cffcdaa1", size = 288773, upload-time = "2025-07-26T12:01:02.277Z" }, + { url = "https://files.pythonhosted.org/packages/0d/44/c4b0b6095fef4dc9c420e041799591e3b63e9619e3044f7f4f6c21c0ab24/contourpy-1.3.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:23416f38bfd74d5d28ab8429cc4d63fa67d5068bd711a85edb1c3fb0c3e2f381", size = 270149, upload-time = "2025-07-26T12:01:04.072Z" }, + { url = "https://files.pythonhosted.org/packages/30/2e/dd4ced42fefac8470661d7cb7e264808425e6c5d56d175291e93890cce09/contourpy-1.3.3-cp311-cp311-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:929ddf8c4c7f348e4c0a5a3a714b5c8542ffaa8c22954862a46ca1813b667ee7", size = 329222, upload-time = "2025-07-26T12:01:05.688Z" }, + { url = "https://files.pythonhosted.org/packages/f2/74/cc6ec2548e3d276c71389ea4802a774b7aa3558223b7bade3f25787fafc2/contourpy-1.3.3-cp311-cp311-manylinux_2_26_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:9e999574eddae35f1312c2b4b717b7885d4edd6cb46700e04f7f02db454e67c1", size = 377234, upload-time = "2025-07-26T12:01:07.054Z" }, + { url = "https://files.pythonhosted.org/packages/03/b3/64ef723029f917410f75c09da54254c5f9ea90ef89b143ccadb09df14c15/contourpy-1.3.3-cp311-cp311-manylinux_2_26_s390x.manylinux_2_28_s390x.whl", hash = "sha256:0bf67e0e3f482cb69779dd3061b534eb35ac9b17f163d851e2a547d56dba0a3a", size = 380555, upload-time = "2025-07-26T12:01:08.801Z" }, + { url = "https://files.pythonhosted.org/packages/5f/4b/6157f24ca425b89fe2eb7e7be642375711ab671135be21e6faa100f7448c/contourpy-1.3.3-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:51e79c1f7470158e838808d4a996fa9bac72c498e93d8ebe5119bc1e6becb0db", size = 355238, upload-time = "2025-07-26T12:01:10.319Z" }, + { url = "https://files.pythonhosted.org/packages/98/56/f914f0dd678480708a04cfd2206e7c382533249bc5001eb9f58aa693e200/contourpy-1.3.3-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:598c3aaece21c503615fd59c92a3598b428b2f01bfb4b8ca9c4edeecc2438620", size = 1326218, upload-time = "2025-07-26T12:01:12.659Z" }, + { url = "https://files.pythonhosted.org/packages/fb/d7/4a972334a0c971acd5172389671113ae82aa7527073980c38d5868ff1161/contourpy-1.3.3-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:322ab1c99b008dad206d406bb61d014cf0174df491ae9d9d0fac6a6fda4f977f", size = 1392867, upload-time = "2025-07-26T12:01:15.533Z" }, + { url = "https://files.pythonhosted.org/packages/75/3e/f2cc6cd56dc8cff46b1a56232eabc6feea52720083ea71ab15523daab796/contourpy-1.3.3-cp311-cp311-win32.whl", hash = "sha256:fd907ae12cd483cd83e414b12941c632a969171bf90fc937d0c9f268a31cafff", size = 183677, upload-time = "2025-07-26T12:01:17.088Z" }, + { url = "https://files.pythonhosted.org/packages/98/4b/9bd370b004b5c9d8045c6c33cf65bae018b27aca550a3f657cdc99acdbd8/contourpy-1.3.3-cp311-cp311-win_amd64.whl", hash = "sha256:3519428f6be58431c56581f1694ba8e50626f2dd550af225f82fb5f5814d2a42", size = 225234, upload-time = "2025-07-26T12:01:18.256Z" }, + { url = "https://files.pythonhosted.org/packages/d9/b6/71771e02c2e004450c12b1120a5f488cad2e4d5b590b1af8bad060360fe4/contourpy-1.3.3-cp311-cp311-win_arm64.whl", hash = "sha256:15ff10bfada4bf92ec8b31c62bf7c1834c244019b4a33095a68000d7075df470", size = 193123, upload-time = "2025-07-26T12:01:19.848Z" }, + { url = "https://files.pythonhosted.org/packages/be/45/adfee365d9ea3d853550b2e735f9d66366701c65db7855cd07621732ccfc/contourpy-1.3.3-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:b08a32ea2f8e42cf1d4be3169a98dd4be32bafe4f22b6c4cb4ba810fa9e5d2cb", size = 293419, upload-time = "2025-07-26T12:01:21.16Z" }, + { url = "https://files.pythonhosted.org/packages/53/3e/405b59cfa13021a56bba395a6b3aca8cec012b45bf177b0eaf7a202cde2c/contourpy-1.3.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:556dba8fb6f5d8742f2923fe9457dbdd51e1049c4a43fd3986a0b14a1d815fc6", size = 273979, upload-time = "2025-07-26T12:01:22.448Z" }, + { url = "https://files.pythonhosted.org/packages/d4/1c/a12359b9b2ca3a845e8f7f9ac08bdf776114eb931392fcad91743e2ea17b/contourpy-1.3.3-cp312-cp312-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:92d9abc807cf7d0e047b95ca5d957cf4792fcd04e920ca70d48add15c1a90ea7", size = 332653, upload-time = "2025-07-26T12:01:24.155Z" }, + { url = "https://files.pythonhosted.org/packages/63/12/897aeebfb475b7748ea67b61e045accdfcf0d971f8a588b67108ed7f5512/contourpy-1.3.3-cp312-cp312-manylinux_2_26_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:b2e8faa0ed68cb29af51edd8e24798bb661eac3bd9f65420c1887b6ca89987c8", size = 379536, upload-time = "2025-07-26T12:01:25.91Z" }, + { url = "https://files.pythonhosted.org/packages/43/8a/a8c584b82deb248930ce069e71576fc09bd7174bbd35183b7943fb1064fd/contourpy-1.3.3-cp312-cp312-manylinux_2_26_s390x.manylinux_2_28_s390x.whl", hash = "sha256:626d60935cf668e70a5ce6ff184fd713e9683fb458898e4249b63be9e28286ea", size = 384397, upload-time = "2025-07-26T12:01:27.152Z" }, + { url = "https://files.pythonhosted.org/packages/cc/8f/ec6289987824b29529d0dfda0d74a07cec60e54b9c92f3c9da4c0ac732de/contourpy-1.3.3-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:4d00e655fcef08aba35ec9610536bfe90267d7ab5ba944f7032549c55a146da1", size = 362601, upload-time = "2025-07-26T12:01:28.808Z" }, + { url = "https://files.pythonhosted.org/packages/05/0a/a3fe3be3ee2dceb3e615ebb4df97ae6f3828aa915d3e10549ce016302bd1/contourpy-1.3.3-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:451e71b5a7d597379ef572de31eeb909a87246974d960049a9848c3bc6c41bf7", size = 1331288, upload-time = "2025-07-26T12:01:31.198Z" }, + { url = "https://files.pythonhosted.org/packages/33/1d/acad9bd4e97f13f3e2b18a3977fe1b4a37ecf3d38d815333980c6c72e963/contourpy-1.3.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:459c1f020cd59fcfe6650180678a9993932d80d44ccde1fa1868977438f0b411", size = 1403386, upload-time = "2025-07-26T12:01:33.947Z" }, + { url = "https://files.pythonhosted.org/packages/cf/8f/5847f44a7fddf859704217a99a23a4f6417b10e5ab1256a179264561540e/contourpy-1.3.3-cp312-cp312-win32.whl", hash = "sha256:023b44101dfe49d7d53932be418477dba359649246075c996866106da069af69", size = 185018, upload-time = "2025-07-26T12:01:35.64Z" }, + { url = "https://files.pythonhosted.org/packages/19/e8/6026ed58a64563186a9ee3f29f41261fd1828f527dd93d33b60feca63352/contourpy-1.3.3-cp312-cp312-win_amd64.whl", hash = "sha256:8153b8bfc11e1e4d75bcb0bff1db232f9e10b274e0929de9d608027e0d34ff8b", size = 226567, upload-time = "2025-07-26T12:01:36.804Z" }, + { url = "https://files.pythonhosted.org/packages/d1/e2/f05240d2c39a1ed228d8328a78b6f44cd695f7ef47beb3e684cf93604f86/contourpy-1.3.3-cp312-cp312-win_arm64.whl", hash = "sha256:07ce5ed73ecdc4a03ffe3e1b3e3c1166db35ae7584be76f65dbbe28a7791b0cc", size = 193655, upload-time = "2025-07-26T12:01:37.999Z" }, + { url = "https://files.pythonhosted.org/packages/68/35/0167aad910bbdb9599272bd96d01a9ec6852f36b9455cf2ca67bd4cc2d23/contourpy-1.3.3-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:177fb367556747a686509d6fef71d221a4b198a3905fe824430e5ea0fda54eb5", size = 293257, upload-time = "2025-07-26T12:01:39.367Z" }, + { url = "https://files.pythonhosted.org/packages/96/e4/7adcd9c8362745b2210728f209bfbcf7d91ba868a2c5f40d8b58f54c509b/contourpy-1.3.3-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:d002b6f00d73d69333dac9d0b8d5e84d9724ff9ef044fd63c5986e62b7c9e1b1", size = 274034, upload-time = "2025-07-26T12:01:40.645Z" }, + { url = "https://files.pythonhosted.org/packages/73/23/90e31ceeed1de63058a02cb04b12f2de4b40e3bef5e082a7c18d9c8ae281/contourpy-1.3.3-cp313-cp313-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:348ac1f5d4f1d66d3322420f01d42e43122f43616e0f194fc1c9f5d830c5b286", size = 334672, upload-time = "2025-07-26T12:01:41.942Z" }, + { url = "https://files.pythonhosted.org/packages/ed/93/b43d8acbe67392e659e1d984700e79eb67e2acb2bd7f62012b583a7f1b55/contourpy-1.3.3-cp313-cp313-manylinux_2_26_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:655456777ff65c2c548b7c454af9c6f33f16c8884f11083244b5819cc214f1b5", size = 381234, upload-time = "2025-07-26T12:01:43.499Z" }, + { url = "https://files.pythonhosted.org/packages/46/3b/bec82a3ea06f66711520f75a40c8fc0b113b2a75edb36aa633eb11c4f50f/contourpy-1.3.3-cp313-cp313-manylinux_2_26_s390x.manylinux_2_28_s390x.whl", hash = "sha256:644a6853d15b2512d67881586bd03f462c7ab755db95f16f14d7e238f2852c67", size = 385169, upload-time = "2025-07-26T12:01:45.219Z" }, + { url = "https://files.pythonhosted.org/packages/4b/32/e0f13a1c5b0f8572d0ec6ae2f6c677b7991fafd95da523159c19eff0696a/contourpy-1.3.3-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:4debd64f124ca62069f313a9cb86656ff087786016d76927ae2cf37846b006c9", size = 362859, upload-time = "2025-07-26T12:01:46.519Z" }, + { url = "https://files.pythonhosted.org/packages/33/71/e2a7945b7de4e58af42d708a219f3b2f4cff7386e6b6ab0a0fa0033c49a9/contourpy-1.3.3-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:a15459b0f4615b00bbd1e91f1b9e19b7e63aea7483d03d804186f278c0af2659", size = 1332062, upload-time = "2025-07-26T12:01:48.964Z" }, + { url = "https://files.pythonhosted.org/packages/12/fc/4e87ac754220ccc0e807284f88e943d6d43b43843614f0a8afa469801db0/contourpy-1.3.3-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:ca0fdcd73925568ca027e0b17ab07aad764be4706d0a925b89227e447d9737b7", size = 1403932, upload-time = "2025-07-26T12:01:51.979Z" }, + { url = "https://files.pythonhosted.org/packages/a6/2e/adc197a37443f934594112222ac1aa7dc9a98faf9c3842884df9a9d8751d/contourpy-1.3.3-cp313-cp313-win32.whl", hash = "sha256:b20c7c9a3bf701366556e1b1984ed2d0cedf999903c51311417cf5f591d8c78d", size = 185024, upload-time = "2025-07-26T12:01:53.245Z" }, + { url = "https://files.pythonhosted.org/packages/18/0b/0098c214843213759692cc638fce7de5c289200a830e5035d1791d7a2338/contourpy-1.3.3-cp313-cp313-win_amd64.whl", hash = "sha256:1cadd8b8969f060ba45ed7c1b714fe69185812ab43bd6b86a9123fe8f99c3263", size = 226578, upload-time = "2025-07-26T12:01:54.422Z" }, + { url = "https://files.pythonhosted.org/packages/8a/9a/2f6024a0c5995243cd63afdeb3651c984f0d2bc727fd98066d40e141ad73/contourpy-1.3.3-cp313-cp313-win_arm64.whl", hash = "sha256:fd914713266421b7536de2bfa8181aa8c699432b6763a0ea64195ebe28bff6a9", size = 193524, upload-time = "2025-07-26T12:01:55.73Z" }, + { url = "https://files.pythonhosted.org/packages/c0/b3/f8a1a86bd3298513f500e5b1f5fd92b69896449f6cab6a146a5d52715479/contourpy-1.3.3-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:88df9880d507169449d434c293467418b9f6cbe82edd19284aa0409e7fdb933d", size = 306730, upload-time = "2025-07-26T12:01:57.051Z" }, + { url = "https://files.pythonhosted.org/packages/3f/11/4780db94ae62fc0c2053909b65dc3246bd7cecfc4f8a20d957ad43aa4ad8/contourpy-1.3.3-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:d06bb1f751ba5d417047db62bca3c8fde202b8c11fb50742ab3ab962c81e8216", size = 287897, upload-time = "2025-07-26T12:01:58.663Z" }, + { url = "https://files.pythonhosted.org/packages/ae/15/e59f5f3ffdd6f3d4daa3e47114c53daabcb18574a26c21f03dc9e4e42ff0/contourpy-1.3.3-cp313-cp313t-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:e4e6b05a45525357e382909a4c1600444e2a45b4795163d3b22669285591c1ae", size = 326751, upload-time = "2025-07-26T12:02:00.343Z" }, + { url = "https://files.pythonhosted.org/packages/0f/81/03b45cfad088e4770b1dcf72ea78d3802d04200009fb364d18a493857210/contourpy-1.3.3-cp313-cp313t-manylinux_2_26_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:ab3074b48c4e2cf1a960e6bbeb7f04566bf36b1861d5c9d4d8ac04b82e38ba20", size = 375486, upload-time = "2025-07-26T12:02:02.128Z" }, + { url = "https://files.pythonhosted.org/packages/0c/ba/49923366492ffbdd4486e970d421b289a670ae8cf539c1ea9a09822b371a/contourpy-1.3.3-cp313-cp313t-manylinux_2_26_s390x.manylinux_2_28_s390x.whl", hash = "sha256:6c3d53c796f8647d6deb1abe867daeb66dcc8a97e8455efa729516b997b8ed99", size = 388106, upload-time = "2025-07-26T12:02:03.615Z" }, + { url = "https://files.pythonhosted.org/packages/9f/52/5b00ea89525f8f143651f9f03a0df371d3cbd2fccd21ca9b768c7a6500c2/contourpy-1.3.3-cp313-cp313t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:50ed930df7289ff2a8d7afeb9603f8289e5704755c7e5c3bbd929c90c817164b", size = 352548, upload-time = "2025-07-26T12:02:05.165Z" }, + { url = "https://files.pythonhosted.org/packages/32/1d/a209ec1a3a3452d490f6b14dd92e72280c99ae3d1e73da74f8277d4ee08f/contourpy-1.3.3-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:4feffb6537d64b84877da813a5c30f1422ea5739566abf0bd18065ac040e120a", size = 1322297, upload-time = "2025-07-26T12:02:07.379Z" }, + { url = "https://files.pythonhosted.org/packages/bc/9e/46f0e8ebdd884ca0e8877e46a3f4e633f6c9c8c4f3f6e72be3fe075994aa/contourpy-1.3.3-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:2b7e9480ffe2b0cd2e787e4df64270e3a0440d9db8dc823312e2c940c167df7e", size = 1391023, upload-time = "2025-07-26T12:02:10.171Z" }, + { url = "https://files.pythonhosted.org/packages/b9/70/f308384a3ae9cd2209e0849f33c913f658d3326900d0ff5d378d6a1422d2/contourpy-1.3.3-cp313-cp313t-win32.whl", hash = "sha256:283edd842a01e3dcd435b1c5116798d661378d83d36d337b8dde1d16a5fc9ba3", size = 196157, upload-time = "2025-07-26T12:02:11.488Z" }, + { url = "https://files.pythonhosted.org/packages/b2/dd/880f890a6663b84d9e34a6f88cded89d78f0091e0045a284427cb6b18521/contourpy-1.3.3-cp313-cp313t-win_amd64.whl", hash = "sha256:87acf5963fc2b34825e5b6b048f40e3635dd547f590b04d2ab317c2619ef7ae8", size = 240570, upload-time = "2025-07-26T12:02:12.754Z" }, + { url = "https://files.pythonhosted.org/packages/80/99/2adc7d8ffead633234817ef8e9a87115c8a11927a94478f6bb3d3f4d4f7d/contourpy-1.3.3-cp313-cp313t-win_arm64.whl", hash = "sha256:3c30273eb2a55024ff31ba7d052dde990d7d8e5450f4bbb6e913558b3d6c2301", size = 199713, upload-time = "2025-07-26T12:02:14.4Z" }, + { url = "https://files.pythonhosted.org/packages/72/8b/4546f3ab60f78c514ffb7d01a0bd743f90de36f0019d1be84d0a708a580a/contourpy-1.3.3-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:fde6c716d51c04b1c25d0b90364d0be954624a0ee9d60e23e850e8d48353d07a", size = 292189, upload-time = "2025-07-26T12:02:16.095Z" }, + { url = "https://files.pythonhosted.org/packages/fd/e1/3542a9cb596cadd76fcef413f19c79216e002623158befe6daa03dbfa88c/contourpy-1.3.3-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:cbedb772ed74ff5be440fa8eee9bd49f64f6e3fc09436d9c7d8f1c287b121d77", size = 273251, upload-time = "2025-07-26T12:02:17.524Z" }, + { url = "https://files.pythonhosted.org/packages/b1/71/f93e1e9471d189f79d0ce2497007731c1e6bf9ef6d1d61b911430c3db4e5/contourpy-1.3.3-cp314-cp314-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:22e9b1bd7a9b1d652cd77388465dc358dafcd2e217d35552424aa4f996f524f5", size = 335810, upload-time = "2025-07-26T12:02:18.9Z" }, + { url = "https://files.pythonhosted.org/packages/91/f9/e35f4c1c93f9275d4e38681a80506b5510e9327350c51f8d4a5a724d178c/contourpy-1.3.3-cp314-cp314-manylinux_2_26_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:a22738912262aa3e254e4f3cb079a95a67132fc5a063890e224393596902f5a4", size = 382871, upload-time = "2025-07-26T12:02:20.418Z" }, + { url = "https://files.pythonhosted.org/packages/b5/71/47b512f936f66a0a900d81c396a7e60d73419868fba959c61efed7a8ab46/contourpy-1.3.3-cp314-cp314-manylinux_2_26_s390x.manylinux_2_28_s390x.whl", hash = "sha256:afe5a512f31ee6bd7d0dda52ec9864c984ca3d66664444f2d72e0dc4eb832e36", size = 386264, upload-time = "2025-07-26T12:02:21.916Z" }, + { url = "https://files.pythonhosted.org/packages/04/5f/9ff93450ba96b09c7c2b3f81c94de31c89f92292f1380261bd7195bea4ea/contourpy-1.3.3-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:f64836de09927cba6f79dcd00fdd7d5329f3fccc633468507079c829ca4db4e3", size = 363819, upload-time = "2025-07-26T12:02:23.759Z" }, + { url = "https://files.pythonhosted.org/packages/3e/a6/0b185d4cc480ee494945cde102cb0149ae830b5fa17bf855b95f2e70ad13/contourpy-1.3.3-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:1fd43c3be4c8e5fd6e4f2baeae35ae18176cf2e5cced681cca908addf1cdd53b", size = 1333650, upload-time = "2025-07-26T12:02:26.181Z" }, + { url = "https://files.pythonhosted.org/packages/43/d7/afdc95580ca56f30fbcd3060250f66cedbde69b4547028863abd8aa3b47e/contourpy-1.3.3-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:6afc576f7b33cf00996e5c1102dc2a8f7cc89e39c0b55df93a0b78c1bd992b36", size = 1404833, upload-time = "2025-07-26T12:02:28.782Z" }, + { url = "https://files.pythonhosted.org/packages/e2/e2/366af18a6d386f41132a48f033cbd2102e9b0cf6345d35ff0826cd984566/contourpy-1.3.3-cp314-cp314-win32.whl", hash = "sha256:66c8a43a4f7b8df8b71ee1840e4211a3c8d93b214b213f590e18a1beca458f7d", size = 189692, upload-time = "2025-07-26T12:02:30.128Z" }, + { url = "https://files.pythonhosted.org/packages/7d/c2/57f54b03d0f22d4044b8afb9ca0e184f8b1afd57b4f735c2fa70883dc601/contourpy-1.3.3-cp314-cp314-win_amd64.whl", hash = "sha256:cf9022ef053f2694e31d630feaacb21ea24224be1c3ad0520b13d844274614fd", size = 232424, upload-time = "2025-07-26T12:02:31.395Z" }, + { url = "https://files.pythonhosted.org/packages/18/79/a9416650df9b525737ab521aa181ccc42d56016d2123ddcb7b58e926a42c/contourpy-1.3.3-cp314-cp314-win_arm64.whl", hash = "sha256:95b181891b4c71de4bb404c6621e7e2390745f887f2a026b2d99e92c17892339", size = 198300, upload-time = "2025-07-26T12:02:32.956Z" }, + { url = "https://files.pythonhosted.org/packages/1f/42/38c159a7d0f2b7b9c04c64ab317042bb6952b713ba875c1681529a2932fe/contourpy-1.3.3-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:33c82d0138c0a062380332c861387650c82e4cf1747aaa6938b9b6516762e772", size = 306769, upload-time = "2025-07-26T12:02:34.2Z" }, + { url = "https://files.pythonhosted.org/packages/c3/6c/26a8205f24bca10974e77460de68d3d7c63e282e23782f1239f226fcae6f/contourpy-1.3.3-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:ea37e7b45949df430fe649e5de8351c423430046a2af20b1c1961cae3afcda77", size = 287892, upload-time = "2025-07-26T12:02:35.807Z" }, + { url = "https://files.pythonhosted.org/packages/66/06/8a475c8ab718ebfd7925661747dbb3c3ee9c82ac834ccb3570be49d129f4/contourpy-1.3.3-cp314-cp314t-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:d304906ecc71672e9c89e87c4675dc5c2645e1f4269a5063b99b0bb29f232d13", size = 326748, upload-time = "2025-07-26T12:02:37.193Z" }, + { url = "https://files.pythonhosted.org/packages/b4/a3/c5ca9f010a44c223f098fccd8b158bb1cb287378a31ac141f04730dc49be/contourpy-1.3.3-cp314-cp314t-manylinux_2_26_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:ca658cd1a680a5c9ea96dc61cdbae1e85c8f25849843aa799dfd3cb370ad4fbe", size = 375554, upload-time = "2025-07-26T12:02:38.894Z" }, + { url = "https://files.pythonhosted.org/packages/80/5b/68bd33ae63fac658a4145088c1e894405e07584a316738710b636c6d0333/contourpy-1.3.3-cp314-cp314t-manylinux_2_26_s390x.manylinux_2_28_s390x.whl", hash = "sha256:ab2fd90904c503739a75b7c8c5c01160130ba67944a7b77bbf36ef8054576e7f", size = 388118, upload-time = "2025-07-26T12:02:40.642Z" }, + { url = "https://files.pythonhosted.org/packages/40/52/4c285a6435940ae25d7410a6c36bda5145839bc3f0beb20c707cda18b9d2/contourpy-1.3.3-cp314-cp314t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:b7301b89040075c30e5768810bc96a8e8d78085b47d8be6e4c3f5a0b4ed478a0", size = 352555, upload-time = "2025-07-26T12:02:42.25Z" }, + { url = "https://files.pythonhosted.org/packages/24/ee/3e81e1dd174f5c7fefe50e85d0892de05ca4e26ef1c9a59c2a57e43b865a/contourpy-1.3.3-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:2a2a8b627d5cc6b7c41a4beff6c5ad5eb848c88255fda4a8745f7e901b32d8e4", size = 1322295, upload-time = "2025-07-26T12:02:44.668Z" }, + { url = "https://files.pythonhosted.org/packages/3c/b2/6d913d4d04e14379de429057cd169e5e00f6c2af3bb13e1710bcbdb5da12/contourpy-1.3.3-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:fd6ec6be509c787f1caf6b247f0b1ca598bef13f4ddeaa126b7658215529ba0f", size = 1391027, upload-time = "2025-07-26T12:02:47.09Z" }, + { url = "https://files.pythonhosted.org/packages/93/8a/68a4ec5c55a2971213d29a9374913f7e9f18581945a7a31d1a39b5d2dfe5/contourpy-1.3.3-cp314-cp314t-win32.whl", hash = "sha256:e74a9a0f5e3fff48fb5a7f2fd2b9b70a3fe014a67522f79b7cca4c0c7e43c9ae", size = 202428, upload-time = "2025-07-26T12:02:48.691Z" }, + { url = "https://files.pythonhosted.org/packages/fa/96/fd9f641ffedc4fa3ace923af73b9d07e869496c9cc7a459103e6e978992f/contourpy-1.3.3-cp314-cp314t-win_amd64.whl", hash = "sha256:13b68d6a62db8eafaebb8039218921399baf6e47bf85006fd8529f2a08ef33fc", size = 250331, upload-time = "2025-07-26T12:02:50.137Z" }, + { url = "https://files.pythonhosted.org/packages/ae/8c/469afb6465b853afff216f9528ffda78a915ff880ed58813ba4faf4ba0b6/contourpy-1.3.3-cp314-cp314t-win_arm64.whl", hash = "sha256:b7448cb5a725bb1e35ce88771b86fba35ef418952474492cf7c764059933ff8b", size = 203831, upload-time = "2025-07-26T12:02:51.449Z" }, + { url = "https://files.pythonhosted.org/packages/a5/29/8dcfe16f0107943fa92388c23f6e05cff0ba58058c4c95b00280d4c75a14/contourpy-1.3.3-pp311-pypy311_pp73-macosx_10_15_x86_64.whl", hash = "sha256:cd5dfcaeb10f7b7f9dc8941717c6c2ade08f587be2226222c12b25f0483ed497", size = 278809, upload-time = "2025-07-26T12:02:52.74Z" }, + { url = "https://files.pythonhosted.org/packages/85/a9/8b37ef4f7dafeb335daee3c8254645ef5725be4d9c6aa70b50ec46ef2f7e/contourpy-1.3.3-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:0c1fc238306b35f246d61a1d416a627348b5cf0648648a031e14bb8705fcdfe8", size = 261593, upload-time = "2025-07-26T12:02:54.037Z" }, + { url = "https://files.pythonhosted.org/packages/0a/59/ebfb8c677c75605cc27f7122c90313fd2f375ff3c8d19a1694bda74aaa63/contourpy-1.3.3-pp311-pypy311_pp73-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:70f9aad7de812d6541d29d2bbf8feb22ff7e1c299523db288004e3157ff4674e", size = 302202, upload-time = "2025-07-26T12:02:55.947Z" }, + { url = "https://files.pythonhosted.org/packages/3c/37/21972a15834d90bfbfb009b9d004779bd5a07a0ec0234e5ba8f64d5736f4/contourpy-1.3.3-pp311-pypy311_pp73-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:5ed3657edf08512fc3fe81b510e35c2012fbd3081d2e26160f27ca28affec989", size = 329207, upload-time = "2025-07-26T12:02:57.468Z" }, + { url = "https://files.pythonhosted.org/packages/0c/58/bd257695f39d05594ca4ad60df5bcb7e32247f9951fd09a9b8edb82d1daa/contourpy-1.3.3-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:3d1a3799d62d45c18bafd41c5fa05120b96a28079f2393af559b843d1a966a77", size = 225315, upload-time = "2025-07-26T12:02:58.801Z" }, +] + +[[package]] +name = "coverage" +version = "7.6.1" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version < '3.9'", +] +sdist = { url = "https://files.pythonhosted.org/packages/f7/08/7e37f82e4d1aead42a7443ff06a1e406aabf7302c4f00a546e4b320b994c/coverage-7.6.1.tar.gz", hash = "sha256:953510dfb7b12ab69d20135a0662397f077c59b1e6379a768e97c59d852ee51d", size = 798791, upload-time = "2024-08-04T19:45:30.9Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/7e/61/eb7ce5ed62bacf21beca4937a90fe32545c91a3c8a42a30c6616d48fc70d/coverage-7.6.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:b06079abebbc0e89e6163b8e8f0e16270124c154dc6e4a47b413dd538859af16", size = 206690, upload-time = "2024-08-04T19:43:07.695Z" }, + { url = "https://files.pythonhosted.org/packages/7d/73/041928e434442bd3afde5584bdc3f932fb4562b1597629f537387cec6f3d/coverage-7.6.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:cf4b19715bccd7ee27b6b120e7e9dd56037b9c0681dcc1adc9ba9db3d417fa36", size = 207127, upload-time = "2024-08-04T19:43:10.15Z" }, + { url = "https://files.pythonhosted.org/packages/c7/c8/6ca52b5147828e45ad0242388477fdb90df2c6cbb9a441701a12b3c71bc8/coverage-7.6.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e61c0abb4c85b095a784ef23fdd4aede7a2628478e7baba7c5e3deba61070a02", size = 235654, upload-time = "2024-08-04T19:43:12.405Z" }, + { url = "https://files.pythonhosted.org/packages/d5/da/9ac2b62557f4340270942011d6efeab9833648380109e897d48ab7c1035d/coverage-7.6.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:fd21f6ae3f08b41004dfb433fa895d858f3f5979e7762d052b12aef444e29afc", size = 233598, upload-time = "2024-08-04T19:43:14.078Z" }, + { url = "https://files.pythonhosted.org/packages/53/23/9e2c114d0178abc42b6d8d5281f651a8e6519abfa0ef460a00a91f80879d/coverage-7.6.1-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8f59d57baca39b32db42b83b2a7ba6f47ad9c394ec2076b084c3f029b7afca23", size = 234732, upload-time = "2024-08-04T19:43:16.632Z" }, + { url = "https://files.pythonhosted.org/packages/0f/7e/a0230756fb133343a52716e8b855045f13342b70e48e8ad41d8a0d60ab98/coverage-7.6.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:a1ac0ae2b8bd743b88ed0502544847c3053d7171a3cff9228af618a068ed9c34", size = 233816, upload-time = "2024-08-04T19:43:19.049Z" }, + { url = "https://files.pythonhosted.org/packages/28/7c/3753c8b40d232b1e5eeaed798c875537cf3cb183fb5041017c1fdb7ec14e/coverage-7.6.1-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:e6a08c0be454c3b3beb105c0596ebdc2371fab6bb90c0c0297f4e58fd7e1012c", size = 232325, upload-time = "2024-08-04T19:43:21.246Z" }, + { url = "https://files.pythonhosted.org/packages/57/e3/818a2b2af5b7573b4b82cf3e9f137ab158c90ea750a8f053716a32f20f06/coverage-7.6.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:f5796e664fe802da4f57a168c85359a8fbf3eab5e55cd4e4569fbacecc903959", size = 233418, upload-time = "2024-08-04T19:43:22.945Z" }, + { url = "https://files.pythonhosted.org/packages/c8/fb/4532b0b0cefb3f06d201648715e03b0feb822907edab3935112b61b885e2/coverage-7.6.1-cp310-cp310-win32.whl", hash = "sha256:7bb65125fcbef8d989fa1dd0e8a060999497629ca5b0efbca209588a73356232", size = 209343, upload-time = "2024-08-04T19:43:25.121Z" }, + { url = "https://files.pythonhosted.org/packages/5a/25/af337cc7421eca1c187cc9c315f0a755d48e755d2853715bfe8c418a45fa/coverage-7.6.1-cp310-cp310-win_amd64.whl", hash = "sha256:3115a95daa9bdba70aea750db7b96b37259a81a709223c8448fa97727d546fe0", size = 210136, upload-time = "2024-08-04T19:43:26.851Z" }, + { url = "https://files.pythonhosted.org/packages/ad/5f/67af7d60d7e8ce61a4e2ddcd1bd5fb787180c8d0ae0fbd073f903b3dd95d/coverage-7.6.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:7dea0889685db8550f839fa202744652e87c60015029ce3f60e006f8c4462c93", size = 206796, upload-time = "2024-08-04T19:43:29.115Z" }, + { url = "https://files.pythonhosted.org/packages/e1/0e/e52332389e057daa2e03be1fbfef25bb4d626b37d12ed42ae6281d0a274c/coverage-7.6.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:ed37bd3c3b063412f7620464a9ac1314d33100329f39799255fb8d3027da50d3", size = 207244, upload-time = "2024-08-04T19:43:31.285Z" }, + { url = "https://files.pythonhosted.org/packages/aa/cd/766b45fb6e090f20f8927d9c7cb34237d41c73a939358bc881883fd3a40d/coverage-7.6.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d85f5e9a5f8b73e2350097c3756ef7e785f55bd71205defa0bfdaf96c31616ff", size = 239279, upload-time = "2024-08-04T19:43:33.581Z" }, + { url = "https://files.pythonhosted.org/packages/70/6c/a9ccd6fe50ddaf13442a1e2dd519ca805cbe0f1fcd377fba6d8339b98ccb/coverage-7.6.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9bc572be474cafb617672c43fe989d6e48d3c83af02ce8de73fff1c6bb3c198d", size = 236859, upload-time = "2024-08-04T19:43:35.301Z" }, + { url = "https://files.pythonhosted.org/packages/14/6f/8351b465febb4dbc1ca9929505202db909c5a635c6fdf33e089bbc3d7d85/coverage-7.6.1-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0c0420b573964c760df9e9e86d1a9a622d0d27f417e1a949a8a66dd7bcee7bc6", size = 238549, upload-time = "2024-08-04T19:43:37.578Z" }, + { url = "https://files.pythonhosted.org/packages/68/3c/289b81fa18ad72138e6d78c4c11a82b5378a312c0e467e2f6b495c260907/coverage-7.6.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:1f4aa8219db826ce6be7099d559f8ec311549bfc4046f7f9fe9b5cea5c581c56", size = 237477, upload-time = "2024-08-04T19:43:39.92Z" }, + { url = "https://files.pythonhosted.org/packages/ed/1c/aa1efa6459d822bd72c4abc0b9418cf268de3f60eeccd65dc4988553bd8d/coverage-7.6.1-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:fc5a77d0c516700ebad189b587de289a20a78324bc54baee03dd486f0855d234", size = 236134, upload-time = "2024-08-04T19:43:41.453Z" }, + { url = "https://files.pythonhosted.org/packages/fb/c8/521c698f2d2796565fe9c789c2ee1ccdae610b3aa20b9b2ef980cc253640/coverage-7.6.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:b48f312cca9621272ae49008c7f613337c53fadca647d6384cc129d2996d1133", size = 236910, upload-time = "2024-08-04T19:43:43.037Z" }, + { url = "https://files.pythonhosted.org/packages/7d/30/033e663399ff17dca90d793ee8a2ea2890e7fdf085da58d82468b4220bf7/coverage-7.6.1-cp311-cp311-win32.whl", hash = "sha256:1125ca0e5fd475cbbba3bb67ae20bd2c23a98fac4e32412883f9bcbaa81c314c", size = 209348, upload-time = "2024-08-04T19:43:44.787Z" }, + { url = "https://files.pythonhosted.org/packages/20/05/0d1ccbb52727ccdadaa3ff37e4d2dc1cd4d47f0c3df9eb58d9ec8508ca88/coverage-7.6.1-cp311-cp311-win_amd64.whl", hash = "sha256:8ae539519c4c040c5ffd0632784e21b2f03fc1340752af711f33e5be83a9d6c6", size = 210230, upload-time = "2024-08-04T19:43:46.707Z" }, + { url = "https://files.pythonhosted.org/packages/7e/d4/300fc921dff243cd518c7db3a4c614b7e4b2431b0d1145c1e274fd99bd70/coverage-7.6.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:95cae0efeb032af8458fc27d191f85d1717b1d4e49f7cb226cf526ff28179778", size = 206983, upload-time = "2024-08-04T19:43:49.082Z" }, + { url = "https://files.pythonhosted.org/packages/e1/ab/6bf00de5327ecb8db205f9ae596885417a31535eeda6e7b99463108782e1/coverage-7.6.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:5621a9175cf9d0b0c84c2ef2b12e9f5f5071357c4d2ea6ca1cf01814f45d2391", size = 207221, upload-time = "2024-08-04T19:43:52.15Z" }, + { url = "https://files.pythonhosted.org/packages/92/8f/2ead05e735022d1a7f3a0a683ac7f737de14850395a826192f0288703472/coverage-7.6.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:260933720fdcd75340e7dbe9060655aff3af1f0c5d20f46b57f262ab6c86a5e8", size = 240342, upload-time = "2024-08-04T19:43:53.746Z" }, + { url = "https://files.pythonhosted.org/packages/0f/ef/94043e478201ffa85b8ae2d2c79b4081e5a1b73438aafafccf3e9bafb6b5/coverage-7.6.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:07e2ca0ad381b91350c0ed49d52699b625aab2b44b65e1b4e02fa9df0e92ad2d", size = 237371, upload-time = "2024-08-04T19:43:55.993Z" }, + { url = "https://files.pythonhosted.org/packages/1f/0f/c890339dd605f3ebc269543247bdd43b703cce6825b5ed42ff5f2d6122c7/coverage-7.6.1-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c44fee9975f04b33331cb8eb272827111efc8930cfd582e0320613263ca849ca", size = 239455, upload-time = "2024-08-04T19:43:57.618Z" }, + { url = "https://files.pythonhosted.org/packages/d1/04/7fd7b39ec7372a04efb0f70c70e35857a99b6a9188b5205efb4c77d6a57a/coverage-7.6.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:877abb17e6339d96bf08e7a622d05095e72b71f8afd8a9fefc82cf30ed944163", size = 238924, upload-time = "2024-08-04T19:44:00.012Z" }, + { url = "https://files.pythonhosted.org/packages/ed/bf/73ce346a9d32a09cf369f14d2a06651329c984e106f5992c89579d25b27e/coverage-7.6.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:3e0cadcf6733c09154b461f1ca72d5416635e5e4ec4e536192180d34ec160f8a", size = 237252, upload-time = "2024-08-04T19:44:01.713Z" }, + { url = "https://files.pythonhosted.org/packages/86/74/1dc7a20969725e917b1e07fe71a955eb34bc606b938316bcc799f228374b/coverage-7.6.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:c3c02d12f837d9683e5ab2f3d9844dc57655b92c74e286c262e0fc54213c216d", size = 238897, upload-time = "2024-08-04T19:44:03.898Z" }, + { url = "https://files.pythonhosted.org/packages/b6/e9/d9cc3deceb361c491b81005c668578b0dfa51eed02cd081620e9a62f24ec/coverage-7.6.1-cp312-cp312-win32.whl", hash = "sha256:e05882b70b87a18d937ca6768ff33cc3f72847cbc4de4491c8e73880766718e5", size = 209606, upload-time = "2024-08-04T19:44:05.532Z" }, + { url = "https://files.pythonhosted.org/packages/47/c8/5a2e41922ea6740f77d555c4d47544acd7dc3f251fe14199c09c0f5958d3/coverage-7.6.1-cp312-cp312-win_amd64.whl", hash = "sha256:b5d7b556859dd85f3a541db6a4e0167b86e7273e1cdc973e5b175166bb634fdb", size = 210373, upload-time = "2024-08-04T19:44:07.079Z" }, + { url = "https://files.pythonhosted.org/packages/8c/f9/9aa4dfb751cb01c949c990d136a0f92027fbcc5781c6e921df1cb1563f20/coverage-7.6.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:a4acd025ecc06185ba2b801f2de85546e0b8ac787cf9d3b06e7e2a69f925b106", size = 207007, upload-time = "2024-08-04T19:44:09.453Z" }, + { url = "https://files.pythonhosted.org/packages/b9/67/e1413d5a8591622a46dd04ff80873b04c849268831ed5c304c16433e7e30/coverage-7.6.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:a6d3adcf24b624a7b778533480e32434a39ad8fa30c315208f6d3e5542aeb6e9", size = 207269, upload-time = "2024-08-04T19:44:11.045Z" }, + { url = "https://files.pythonhosted.org/packages/14/5b/9dec847b305e44a5634d0fb8498d135ab1d88330482b74065fcec0622224/coverage-7.6.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d0c212c49b6c10e6951362f7c6df3329f04c2b1c28499563d4035d964ab8e08c", size = 239886, upload-time = "2024-08-04T19:44:12.83Z" }, + { url = "https://files.pythonhosted.org/packages/7b/b7/35760a67c168e29f454928f51f970342d23cf75a2bb0323e0f07334c85f3/coverage-7.6.1-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6e81d7a3e58882450ec4186ca59a3f20a5d4440f25b1cff6f0902ad890e6748a", size = 237037, upload-time = "2024-08-04T19:44:15.393Z" }, + { url = "https://files.pythonhosted.org/packages/f7/95/d2fd31f1d638df806cae59d7daea5abf2b15b5234016a5ebb502c2f3f7ee/coverage-7.6.1-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:78b260de9790fd81e69401c2dc8b17da47c8038176a79092a89cb2b7d945d060", size = 239038, upload-time = "2024-08-04T19:44:17.466Z" }, + { url = "https://files.pythonhosted.org/packages/6e/bd/110689ff5752b67924efd5e2aedf5190cbbe245fc81b8dec1abaffba619d/coverage-7.6.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:a78d169acd38300060b28d600344a803628c3fd585c912cacc9ea8790fe96862", size = 238690, upload-time = "2024-08-04T19:44:19.336Z" }, + { url = "https://files.pythonhosted.org/packages/d3/a8/08d7b38e6ff8df52331c83130d0ab92d9c9a8b5462f9e99c9f051a4ae206/coverage-7.6.1-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:2c09f4ce52cb99dd7505cd0fc8e0e37c77b87f46bc9c1eb03fe3bc9991085388", size = 236765, upload-time = "2024-08-04T19:44:20.994Z" }, + { url = "https://files.pythonhosted.org/packages/d6/6a/9cf96839d3147d55ae713eb2d877f4d777e7dc5ba2bce227167d0118dfe8/coverage-7.6.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:6878ef48d4227aace338d88c48738a4258213cd7b74fd9a3d4d7582bb1d8a155", size = 238611, upload-time = "2024-08-04T19:44:22.616Z" }, + { url = "https://files.pythonhosted.org/packages/74/e4/7ff20d6a0b59eeaab40b3140a71e38cf52547ba21dbcf1d79c5a32bba61b/coverage-7.6.1-cp313-cp313-win32.whl", hash = "sha256:44df346d5215a8c0e360307d46ffaabe0f5d3502c8a1cefd700b34baf31d411a", size = 209671, upload-time = "2024-08-04T19:44:24.418Z" }, + { url = "https://files.pythonhosted.org/packages/35/59/1812f08a85b57c9fdb6d0b383d779e47b6f643bc278ed682859512517e83/coverage-7.6.1-cp313-cp313-win_amd64.whl", hash = "sha256:8284cf8c0dd272a247bc154eb6c95548722dce90d098c17a883ed36e67cdb129", size = 210368, upload-time = "2024-08-04T19:44:26.276Z" }, + { url = "https://files.pythonhosted.org/packages/9c/15/08913be1c59d7562a3e39fce20661a98c0a3f59d5754312899acc6cb8a2d/coverage-7.6.1-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:d3296782ca4eab572a1a4eca686d8bfb00226300dcefdf43faa25b5242ab8a3e", size = 207758, upload-time = "2024-08-04T19:44:29.028Z" }, + { url = "https://files.pythonhosted.org/packages/c4/ae/b5d58dff26cade02ada6ca612a76447acd69dccdbb3a478e9e088eb3d4b9/coverage-7.6.1-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:502753043567491d3ff6d08629270127e0c31d4184c4c8d98f92c26f65019962", size = 208035, upload-time = "2024-08-04T19:44:30.673Z" }, + { url = "https://files.pythonhosted.org/packages/b8/d7/62095e355ec0613b08dfb19206ce3033a0eedb6f4a67af5ed267a8800642/coverage-7.6.1-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6a89ecca80709d4076b95f89f308544ec8f7b4727e8a547913a35f16717856cb", size = 250839, upload-time = "2024-08-04T19:44:32.412Z" }, + { url = "https://files.pythonhosted.org/packages/7c/1e/c2967cb7991b112ba3766df0d9c21de46b476d103e32bb401b1b2adf3380/coverage-7.6.1-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a318d68e92e80af8b00fa99609796fdbcdfef3629c77c6283566c6f02c6d6704", size = 246569, upload-time = "2024-08-04T19:44:34.547Z" }, + { url = "https://files.pythonhosted.org/packages/8b/61/a7a6a55dd266007ed3b1df7a3386a0d760d014542d72f7c2c6938483b7bd/coverage-7.6.1-cp313-cp313t-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:13b0a73a0896988f053e4fbb7de6d93388e6dd292b0d87ee51d106f2c11b465b", size = 248927, upload-time = "2024-08-04T19:44:36.313Z" }, + { url = "https://files.pythonhosted.org/packages/c8/fa/13a6f56d72b429f56ef612eb3bc5ce1b75b7ee12864b3bd12526ab794847/coverage-7.6.1-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:4421712dbfc5562150f7554f13dde997a2e932a6b5f352edcce948a815efee6f", size = 248401, upload-time = "2024-08-04T19:44:38.155Z" }, + { url = "https://files.pythonhosted.org/packages/75/06/0429c652aa0fb761fc60e8c6b291338c9173c6aa0f4e40e1902345b42830/coverage-7.6.1-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:166811d20dfea725e2e4baa71fffd6c968a958577848d2131f39b60043400223", size = 246301, upload-time = "2024-08-04T19:44:39.883Z" }, + { url = "https://files.pythonhosted.org/packages/52/76/1766bb8b803a88f93c3a2d07e30ffa359467810e5cbc68e375ebe6906efb/coverage-7.6.1-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:225667980479a17db1048cb2bf8bfb39b8e5be8f164b8f6628b64f78a72cf9d3", size = 247598, upload-time = "2024-08-04T19:44:41.59Z" }, + { url = "https://files.pythonhosted.org/packages/66/8b/f54f8db2ae17188be9566e8166ac6df105c1c611e25da755738025708d54/coverage-7.6.1-cp313-cp313t-win32.whl", hash = "sha256:170d444ab405852903b7d04ea9ae9b98f98ab6d7e63e1115e82620807519797f", size = 210307, upload-time = "2024-08-04T19:44:43.301Z" }, + { url = "https://files.pythonhosted.org/packages/9f/b0/e0dca6da9170aefc07515cce067b97178cefafb512d00a87a1c717d2efd5/coverage-7.6.1-cp313-cp313t-win_amd64.whl", hash = "sha256:b9f222de8cded79c49bf184bdbc06630d4c58eec9459b939b4a690c82ed05657", size = 211453, upload-time = "2024-08-04T19:44:45.677Z" }, + { url = "https://files.pythonhosted.org/packages/81/d0/d9e3d554e38beea5a2e22178ddb16587dbcbe9a1ef3211f55733924bf7fa/coverage-7.6.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:6db04803b6c7291985a761004e9060b2bca08da6d04f26a7f2294b8623a0c1a0", size = 206674, upload-time = "2024-08-04T19:44:47.694Z" }, + { url = "https://files.pythonhosted.org/packages/38/ea/cab2dc248d9f45b2b7f9f1f596a4d75a435cb364437c61b51d2eb33ceb0e/coverage-7.6.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:f1adfc8ac319e1a348af294106bc6a8458a0f1633cc62a1446aebc30c5fa186a", size = 207101, upload-time = "2024-08-04T19:44:49.32Z" }, + { url = "https://files.pythonhosted.org/packages/ca/6f/f82f9a500c7c5722368978a5390c418d2a4d083ef955309a8748ecaa8920/coverage-7.6.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a95324a9de9650a729239daea117df21f4b9868ce32e63f8b650ebe6cef5595b", size = 236554, upload-time = "2024-08-04T19:44:51.631Z" }, + { url = "https://files.pythonhosted.org/packages/a6/94/d3055aa33d4e7e733d8fa309d9adf147b4b06a82c1346366fc15a2b1d5fa/coverage-7.6.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b43c03669dc4618ec25270b06ecd3ee4fa94c7f9b3c14bae6571ca00ef98b0d3", size = 234440, upload-time = "2024-08-04T19:44:53.464Z" }, + { url = "https://files.pythonhosted.org/packages/e4/6e/885bcd787d9dd674de4a7d8ec83faf729534c63d05d51d45d4fa168f7102/coverage-7.6.1-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8929543a7192c13d177b770008bc4e8119f2e1f881d563fc6b6305d2d0ebe9de", size = 235889, upload-time = "2024-08-04T19:44:55.165Z" }, + { url = "https://files.pythonhosted.org/packages/f4/63/df50120a7744492710854860783d6819ff23e482dee15462c9a833cc428a/coverage-7.6.1-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:a09ece4a69cf399510c8ab25e0950d9cf2b42f7b3cb0374f95d2e2ff594478a6", size = 235142, upload-time = "2024-08-04T19:44:57.269Z" }, + { url = "https://files.pythonhosted.org/packages/3a/5d/9d0acfcded2b3e9ce1c7923ca52ccc00c78a74e112fc2aee661125b7843b/coverage-7.6.1-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:9054a0754de38d9dbd01a46621636689124d666bad1936d76c0341f7d71bf569", size = 233805, upload-time = "2024-08-04T19:44:59.033Z" }, + { url = "https://files.pythonhosted.org/packages/c4/56/50abf070cb3cd9b1dd32f2c88f083aab561ecbffbcd783275cb51c17f11d/coverage-7.6.1-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:0dbde0f4aa9a16fa4d754356a8f2e36296ff4d83994b2c9d8398aa32f222f989", size = 234655, upload-time = "2024-08-04T19:45:01.398Z" }, + { url = "https://files.pythonhosted.org/packages/25/ee/b4c246048b8485f85a2426ef4abab88e48c6e80c74e964bea5cd4cd4b115/coverage-7.6.1-cp38-cp38-win32.whl", hash = "sha256:da511e6ad4f7323ee5702e6633085fb76c2f893aaf8ce4c51a0ba4fc07580ea7", size = 209296, upload-time = "2024-08-04T19:45:03.819Z" }, + { url = "https://files.pythonhosted.org/packages/5c/1c/96cf86b70b69ea2b12924cdf7cabb8ad10e6130eab8d767a1099fbd2a44f/coverage-7.6.1-cp38-cp38-win_amd64.whl", hash = "sha256:3f1156e3e8f2872197af3840d8ad307a9dd18e615dc64d9ee41696f287c57ad8", size = 210137, upload-time = "2024-08-04T19:45:06.25Z" }, + { url = "https://files.pythonhosted.org/packages/19/d3/d54c5aa83268779d54c86deb39c1c4566e5d45c155369ca152765f8db413/coverage-7.6.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:abd5fd0db5f4dc9289408aaf34908072f805ff7792632250dcb36dc591d24255", size = 206688, upload-time = "2024-08-04T19:45:08.358Z" }, + { url = "https://files.pythonhosted.org/packages/a5/fe/137d5dca72e4a258b1bc17bb04f2e0196898fe495843402ce826a7419fe3/coverage-7.6.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:547f45fa1a93154bd82050a7f3cddbc1a7a4dd2a9bf5cb7d06f4ae29fe94eaf8", size = 207120, upload-time = "2024-08-04T19:45:11.526Z" }, + { url = "https://files.pythonhosted.org/packages/78/5b/a0a796983f3201ff5485323b225d7c8b74ce30c11f456017e23d8e8d1945/coverage-7.6.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:645786266c8f18a931b65bfcefdbf6952dd0dea98feee39bd188607a9d307ed2", size = 235249, upload-time = "2024-08-04T19:45:13.202Z" }, + { url = "https://files.pythonhosted.org/packages/4e/e1/76089d6a5ef9d68f018f65411fcdaaeb0141b504587b901d74e8587606ad/coverage-7.6.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9e0b2df163b8ed01d515807af24f63de04bebcecbd6c3bfeff88385789fdf75a", size = 233237, upload-time = "2024-08-04T19:45:14.961Z" }, + { url = "https://files.pythonhosted.org/packages/9a/6f/eef79b779a540326fee9520e5542a8b428cc3bfa8b7c8f1022c1ee4fc66c/coverage-7.6.1-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:609b06f178fe8e9f89ef676532760ec0b4deea15e9969bf754b37f7c40326dbc", size = 234311, upload-time = "2024-08-04T19:45:16.924Z" }, + { url = "https://files.pythonhosted.org/packages/75/e1/656d65fb126c29a494ef964005702b012f3498db1a30dd562958e85a4049/coverage-7.6.1-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:702855feff378050ae4f741045e19a32d57d19f3e0676d589df0575008ea5004", size = 233453, upload-time = "2024-08-04T19:45:18.672Z" }, + { url = "https://files.pythonhosted.org/packages/68/6a/45f108f137941a4a1238c85f28fd9d048cc46b5466d6b8dda3aba1bb9d4f/coverage-7.6.1-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:2bdb062ea438f22d99cba0d7829c2ef0af1d768d1e4a4f528087224c90b132cb", size = 231958, upload-time = "2024-08-04T19:45:20.63Z" }, + { url = "https://files.pythonhosted.org/packages/9b/e7/47b809099168b8b8c72ae311efc3e88c8d8a1162b3ba4b8da3cfcdb85743/coverage-7.6.1-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:9c56863d44bd1c4fe2abb8a4d6f5371d197f1ac0ebdee542f07f35895fc07f36", size = 232938, upload-time = "2024-08-04T19:45:23.062Z" }, + { url = "https://files.pythonhosted.org/packages/52/80/052222ba7058071f905435bad0ba392cc12006380731c37afaf3fe749b88/coverage-7.6.1-cp39-cp39-win32.whl", hash = "sha256:6e2cd258d7d927d09493c8df1ce9174ad01b381d4729a9d8d4e38670ca24774c", size = 209352, upload-time = "2024-08-04T19:45:25.042Z" }, + { url = "https://files.pythonhosted.org/packages/b8/d8/1b92e0b3adcf384e98770a00ca095da1b5f7b483e6563ae4eb5e935d24a1/coverage-7.6.1-cp39-cp39-win_amd64.whl", hash = "sha256:06a737c882bd26d0d6ee7269b20b12f14a8704807a01056c80bb881a4b2ce6ca", size = 210153, upload-time = "2024-08-04T19:45:27.079Z" }, + { url = "https://files.pythonhosted.org/packages/a5/2b/0354ed096bca64dc8e32a7cbcae28b34cb5ad0b1fe2125d6d99583313ac0/coverage-7.6.1-pp38.pp39.pp310-none-any.whl", hash = "sha256:e9a6e0eb86070e8ccaedfbd9d38fec54864f3125ab95419970575b42af7541df", size = 198926, upload-time = "2024-08-04T19:45:28.875Z" }, +] + +[package.optional-dependencies] +toml = [ + { name = "tomli", marker = "python_full_version < '3.9'" }, +] + +[[package]] +name = "coverage" +version = "7.10.7" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version == '3.9.*'", +] +sdist = { url = "https://files.pythonhosted.org/packages/51/26/d22c300112504f5f9a9fd2297ce33c35f3d353e4aeb987c8419453b2a7c2/coverage-7.10.7.tar.gz", hash = "sha256:f4ab143ab113be368a3e9b795f9cd7906c5ef407d6173fe9675a902e1fffc239", size = 827704, upload-time = "2025-09-21T20:03:56.815Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/e5/6c/3a3f7a46888e69d18abe3ccc6fe4cb16cccb1e6a2f99698931dafca489e6/coverage-7.10.7-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:fc04cc7a3db33664e0c2d10eb8990ff6b3536f6842c9590ae8da4c614b9ed05a", size = 217987, upload-time = "2025-09-21T20:00:57.218Z" }, + { url = "https://files.pythonhosted.org/packages/03/94/952d30f180b1a916c11a56f5c22d3535e943aa22430e9e3322447e520e1c/coverage-7.10.7-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:e201e015644e207139f7e2351980feb7040e6f4b2c2978892f3e3789d1c125e5", size = 218388, upload-time = "2025-09-21T20:01:00.081Z" }, + { url = "https://files.pythonhosted.org/packages/50/2b/9e0cf8ded1e114bcd8b2fd42792b57f1c4e9e4ea1824cde2af93a67305be/coverage-7.10.7-cp310-cp310-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:240af60539987ced2c399809bd34f7c78e8abe0736af91c3d7d0e795df633d17", size = 245148, upload-time = "2025-09-21T20:01:01.768Z" }, + { url = "https://files.pythonhosted.org/packages/19/20/d0384ac06a6f908783d9b6aa6135e41b093971499ec488e47279f5b846e6/coverage-7.10.7-cp310-cp310-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:8421e088bc051361b01c4b3a50fd39a4b9133079a2229978d9d30511fd05231b", size = 246958, upload-time = "2025-09-21T20:01:03.355Z" }, + { url = "https://files.pythonhosted.org/packages/60/83/5c283cff3d41285f8eab897651585db908a909c572bdc014bcfaf8a8b6ae/coverage-7.10.7-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6be8ed3039ae7f7ac5ce058c308484787c86e8437e72b30bf5e88b8ea10f3c87", size = 248819, upload-time = "2025-09-21T20:01:04.968Z" }, + { url = "https://files.pythonhosted.org/packages/60/22/02eb98fdc5ff79f423e990d877693e5310ae1eab6cb20ae0b0b9ac45b23b/coverage-7.10.7-cp310-cp310-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:e28299d9f2e889e6d51b1f043f58d5f997c373cc12e6403b90df95b8b047c13e", size = 245754, upload-time = "2025-09-21T20:01:06.321Z" }, + { url = "https://files.pythonhosted.org/packages/b4/bc/25c83bcf3ad141b32cd7dc45485ef3c01a776ca3aa8ef0a93e77e8b5bc43/coverage-7.10.7-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:c4e16bd7761c5e454f4efd36f345286d6f7c5fa111623c355691e2755cae3b9e", size = 246860, upload-time = "2025-09-21T20:01:07.605Z" }, + { url = "https://files.pythonhosted.org/packages/3c/b7/95574702888b58c0928a6e982038c596f9c34d52c5e5107f1eef729399b5/coverage-7.10.7-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:b1c81d0e5e160651879755c9c675b974276f135558cf4ba79fee7b8413a515df", size = 244877, upload-time = "2025-09-21T20:01:08.829Z" }, + { url = "https://files.pythonhosted.org/packages/47/b6/40095c185f235e085df0e0b158f6bd68cc6e1d80ba6c7721dc81d97ec318/coverage-7.10.7-cp310-cp310-musllinux_1_2_riscv64.whl", hash = "sha256:606cc265adc9aaedcc84f1f064f0e8736bc45814f15a357e30fca7ecc01504e0", size = 245108, upload-time = "2025-09-21T20:01:10.527Z" }, + { url = "https://files.pythonhosted.org/packages/c8/50/4aea0556da7a4b93ec9168420d170b55e2eb50ae21b25062513d020c6861/coverage-7.10.7-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:10b24412692df990dbc34f8fb1b6b13d236ace9dfdd68df5b28c2e39cafbba13", size = 245752, upload-time = "2025-09-21T20:01:11.857Z" }, + { url = "https://files.pythonhosted.org/packages/6a/28/ea1a84a60828177ae3b100cb6723838523369a44ec5742313ed7db3da160/coverage-7.10.7-cp310-cp310-win32.whl", hash = "sha256:b51dcd060f18c19290d9b8a9dd1e0181538df2ce0717f562fff6cf74d9fc0b5b", size = 220497, upload-time = "2025-09-21T20:01:13.459Z" }, + { url = "https://files.pythonhosted.org/packages/fc/1a/a81d46bbeb3c3fd97b9602ebaa411e076219a150489bcc2c025f151bd52d/coverage-7.10.7-cp310-cp310-win_amd64.whl", hash = "sha256:3a622ac801b17198020f09af3eaf45666b344a0d69fc2a6ffe2ea83aeef1d807", size = 221392, upload-time = "2025-09-21T20:01:14.722Z" }, + { url = "https://files.pythonhosted.org/packages/d2/5d/c1a17867b0456f2e9ce2d8d4708a4c3a089947d0bec9c66cdf60c9e7739f/coverage-7.10.7-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:a609f9c93113be646f44c2a0256d6ea375ad047005d7f57a5c15f614dc1b2f59", size = 218102, upload-time = "2025-09-21T20:01:16.089Z" }, + { url = "https://files.pythonhosted.org/packages/54/f0/514dcf4b4e3698b9a9077f084429681bf3aad2b4a72578f89d7f643eb506/coverage-7.10.7-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:65646bb0359386e07639c367a22cf9b5bf6304e8630b565d0626e2bdf329227a", size = 218505, upload-time = "2025-09-21T20:01:17.788Z" }, + { url = "https://files.pythonhosted.org/packages/20/f6/9626b81d17e2a4b25c63ac1b425ff307ecdeef03d67c9a147673ae40dc36/coverage-7.10.7-cp311-cp311-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:5f33166f0dfcce728191f520bd2692914ec70fac2713f6bf3ce59c3deacb4699", size = 248898, upload-time = "2025-09-21T20:01:19.488Z" }, + { url = "https://files.pythonhosted.org/packages/b0/ef/bd8e719c2f7417ba03239052e099b76ea1130ac0cbb183ee1fcaa58aaff3/coverage-7.10.7-cp311-cp311-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:35f5e3f9e455bb17831876048355dca0f758b6df22f49258cb5a91da23ef437d", size = 250831, upload-time = "2025-09-21T20:01:20.817Z" }, + { url = "https://files.pythonhosted.org/packages/a5/b6/bf054de41ec948b151ae2b79a55c107f5760979538f5fb80c195f2517718/coverage-7.10.7-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:4da86b6d62a496e908ac2898243920c7992499c1712ff7c2b6d837cc69d9467e", size = 252937, upload-time = "2025-09-21T20:01:22.171Z" }, + { url = "https://files.pythonhosted.org/packages/0f/e5/3860756aa6f9318227443c6ce4ed7bf9e70bb7f1447a0353f45ac5c7974b/coverage-7.10.7-cp311-cp311-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:6b8b09c1fad947c84bbbc95eca841350fad9cbfa5a2d7ca88ac9f8d836c92e23", size = 249021, upload-time = "2025-09-21T20:01:23.907Z" }, + { url = "https://files.pythonhosted.org/packages/26/0f/bd08bd042854f7fd07b45808927ebcce99a7ed0f2f412d11629883517ac2/coverage-7.10.7-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:4376538f36b533b46f8971d3a3e63464f2c7905c9800db97361c43a2b14792ab", size = 250626, upload-time = "2025-09-21T20:01:25.721Z" }, + { url = "https://files.pythonhosted.org/packages/8e/a7/4777b14de4abcc2e80c6b1d430f5d51eb18ed1d75fca56cbce5f2db9b36e/coverage-7.10.7-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:121da30abb574f6ce6ae09840dae322bef734480ceafe410117627aa54f76d82", size = 248682, upload-time = "2025-09-21T20:01:27.105Z" }, + { url = "https://files.pythonhosted.org/packages/34/72/17d082b00b53cd45679bad682fac058b87f011fd8b9fe31d77f5f8d3a4e4/coverage-7.10.7-cp311-cp311-musllinux_1_2_riscv64.whl", hash = "sha256:88127d40df529336a9836870436fc2751c339fbaed3a836d42c93f3e4bd1d0a2", size = 248402, upload-time = "2025-09-21T20:01:28.629Z" }, + { url = "https://files.pythonhosted.org/packages/81/7a/92367572eb5bdd6a84bfa278cc7e97db192f9f45b28c94a9ca1a921c3577/coverage-7.10.7-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:ba58bbcd1b72f136080c0bccc2400d66cc6115f3f906c499013d065ac33a4b61", size = 249320, upload-time = "2025-09-21T20:01:30.004Z" }, + { url = "https://files.pythonhosted.org/packages/2f/88/a23cc185f6a805dfc4fdf14a94016835eeb85e22ac3a0e66d5e89acd6462/coverage-7.10.7-cp311-cp311-win32.whl", hash = "sha256:972b9e3a4094b053a4e46832b4bc829fc8a8d347160eb39d03f1690316a99c14", size = 220536, upload-time = "2025-09-21T20:01:32.184Z" }, + { url = "https://files.pythonhosted.org/packages/fe/ef/0b510a399dfca17cec7bc2f05ad8bd78cf55f15c8bc9a73ab20c5c913c2e/coverage-7.10.7-cp311-cp311-win_amd64.whl", hash = "sha256:a7b55a944a7f43892e28ad4bc0561dfd5f0d73e605d1aa5c3c976b52aea121d2", size = 221425, upload-time = "2025-09-21T20:01:33.557Z" }, + { url = "https://files.pythonhosted.org/packages/51/7f/023657f301a276e4ba1850f82749bc136f5a7e8768060c2e5d9744a22951/coverage-7.10.7-cp311-cp311-win_arm64.whl", hash = "sha256:736f227fb490f03c6488f9b6d45855f8e0fd749c007f9303ad30efab0e73c05a", size = 220103, upload-time = "2025-09-21T20:01:34.929Z" }, + { url = "https://files.pythonhosted.org/packages/13/e4/eb12450f71b542a53972d19117ea5a5cea1cab3ac9e31b0b5d498df1bd5a/coverage-7.10.7-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:7bb3b9ddb87ef7725056572368040c32775036472d5a033679d1fa6c8dc08417", size = 218290, upload-time = "2025-09-21T20:01:36.455Z" }, + { url = "https://files.pythonhosted.org/packages/37/66/593f9be12fc19fb36711f19a5371af79a718537204d16ea1d36f16bd78d2/coverage-7.10.7-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:18afb24843cbc175687225cab1138c95d262337f5473512010e46831aa0c2973", size = 218515, upload-time = "2025-09-21T20:01:37.982Z" }, + { url = "https://files.pythonhosted.org/packages/66/80/4c49f7ae09cafdacc73fbc30949ffe77359635c168f4e9ff33c9ebb07838/coverage-7.10.7-cp312-cp312-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:399a0b6347bcd3822be369392932884b8216d0944049ae22925631a9b3d4ba4c", size = 250020, upload-time = "2025-09-21T20:01:39.617Z" }, + { url = "https://files.pythonhosted.org/packages/a6/90/a64aaacab3b37a17aaedd83e8000142561a29eb262cede42d94a67f7556b/coverage-7.10.7-cp312-cp312-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:314f2c326ded3f4b09be11bc282eb2fc861184bc95748ae67b360ac962770be7", size = 252769, upload-time = "2025-09-21T20:01:41.341Z" }, + { url = "https://files.pythonhosted.org/packages/98/2e/2dda59afd6103b342e096f246ebc5f87a3363b5412609946c120f4e7750d/coverage-7.10.7-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c41e71c9cfb854789dee6fc51e46743a6d138b1803fab6cb860af43265b42ea6", size = 253901, upload-time = "2025-09-21T20:01:43.042Z" }, + { url = "https://files.pythonhosted.org/packages/53/dc/8d8119c9051d50f3119bb4a75f29f1e4a6ab9415cd1fa8bf22fcc3fb3b5f/coverage-7.10.7-cp312-cp312-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:bc01f57ca26269c2c706e838f6422e2a8788e41b3e3c65e2f41148212e57cd59", size = 250413, upload-time = "2025-09-21T20:01:44.469Z" }, + { url = "https://files.pythonhosted.org/packages/98/b3/edaff9c5d79ee4d4b6d3fe046f2b1d799850425695b789d491a64225d493/coverage-7.10.7-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:a6442c59a8ac8b85812ce33bc4d05bde3fb22321fa8294e2a5b487c3505f611b", size = 251820, upload-time = "2025-09-21T20:01:45.915Z" }, + { url = "https://files.pythonhosted.org/packages/11/25/9a0728564bb05863f7e513e5a594fe5ffef091b325437f5430e8cfb0d530/coverage-7.10.7-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:78a384e49f46b80fb4c901d52d92abe098e78768ed829c673fbb53c498bef73a", size = 249941, upload-time = "2025-09-21T20:01:47.296Z" }, + { url = "https://files.pythonhosted.org/packages/e0/fd/ca2650443bfbef5b0e74373aac4df67b08180d2f184b482c41499668e258/coverage-7.10.7-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:5e1e9802121405ede4b0133aa4340ad8186a1d2526de5b7c3eca519db7bb89fb", size = 249519, upload-time = "2025-09-21T20:01:48.73Z" }, + { url = "https://files.pythonhosted.org/packages/24/79/f692f125fb4299b6f963b0745124998ebb8e73ecdfce4ceceb06a8c6bec5/coverage-7.10.7-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:d41213ea25a86f69efd1575073d34ea11aabe075604ddf3d148ecfec9e1e96a1", size = 251375, upload-time = "2025-09-21T20:01:50.529Z" }, + { url = "https://files.pythonhosted.org/packages/5e/75/61b9bbd6c7d24d896bfeec57acba78e0f8deac68e6baf2d4804f7aae1f88/coverage-7.10.7-cp312-cp312-win32.whl", hash = "sha256:77eb4c747061a6af8d0f7bdb31f1e108d172762ef579166ec84542f711d90256", size = 220699, upload-time = "2025-09-21T20:01:51.941Z" }, + { url = "https://files.pythonhosted.org/packages/ca/f3/3bf7905288b45b075918d372498f1cf845b5b579b723c8fd17168018d5f5/coverage-7.10.7-cp312-cp312-win_amd64.whl", hash = "sha256:f51328ffe987aecf6d09f3cd9d979face89a617eacdaea43e7b3080777f647ba", size = 221512, upload-time = "2025-09-21T20:01:53.481Z" }, + { url = "https://files.pythonhosted.org/packages/5c/44/3e32dbe933979d05cf2dac5e697c8599cfe038aaf51223ab901e208d5a62/coverage-7.10.7-cp312-cp312-win_arm64.whl", hash = "sha256:bda5e34f8a75721c96085903c6f2197dc398c20ffd98df33f866a9c8fd95f4bf", size = 220147, upload-time = "2025-09-21T20:01:55.2Z" }, + { url = "https://files.pythonhosted.org/packages/9a/94/b765c1abcb613d103b64fcf10395f54d69b0ef8be6a0dd9c524384892cc7/coverage-7.10.7-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:981a651f543f2854abd3b5fcb3263aac581b18209be49863ba575de6edf4c14d", size = 218320, upload-time = "2025-09-21T20:01:56.629Z" }, + { url = "https://files.pythonhosted.org/packages/72/4f/732fff31c119bb73b35236dd333030f32c4bfe909f445b423e6c7594f9a2/coverage-7.10.7-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:73ab1601f84dc804f7812dc297e93cd99381162da39c47040a827d4e8dafe63b", size = 218575, upload-time = "2025-09-21T20:01:58.203Z" }, + { url = "https://files.pythonhosted.org/packages/87/02/ae7e0af4b674be47566707777db1aa375474f02a1d64b9323e5813a6cdd5/coverage-7.10.7-cp313-cp313-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:a8b6f03672aa6734e700bbcd65ff050fd19cddfec4b031cc8cf1c6967de5a68e", size = 249568, upload-time = "2025-09-21T20:01:59.748Z" }, + { url = "https://files.pythonhosted.org/packages/a2/77/8c6d22bf61921a59bce5471c2f1f7ac30cd4ac50aadde72b8c48d5727902/coverage-7.10.7-cp313-cp313-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:10b6ba00ab1132a0ce4428ff68cf50a25efd6840a42cdf4239c9b99aad83be8b", size = 252174, upload-time = "2025-09-21T20:02:01.192Z" }, + { url = "https://files.pythonhosted.org/packages/b1/20/b6ea4f69bbb52dac0aebd62157ba6a9dddbfe664f5af8122dac296c3ee15/coverage-7.10.7-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c79124f70465a150e89340de5963f936ee97097d2ef76c869708c4248c63ca49", size = 253447, upload-time = "2025-09-21T20:02:02.701Z" }, + { url = "https://files.pythonhosted.org/packages/f9/28/4831523ba483a7f90f7b259d2018fef02cb4d5b90bc7c1505d6e5a84883c/coverage-7.10.7-cp313-cp313-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:69212fbccdbd5b0e39eac4067e20a4a5256609e209547d86f740d68ad4f04911", size = 249779, upload-time = "2025-09-21T20:02:04.185Z" }, + { url = "https://files.pythonhosted.org/packages/a7/9f/4331142bc98c10ca6436d2d620c3e165f31e6c58d43479985afce6f3191c/coverage-7.10.7-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:7ea7c6c9d0d286d04ed3541747e6597cbe4971f22648b68248f7ddcd329207f0", size = 251604, upload-time = "2025-09-21T20:02:06.034Z" }, + { url = "https://files.pythonhosted.org/packages/ce/60/bda83b96602036b77ecf34e6393a3836365481b69f7ed7079ab85048202b/coverage-7.10.7-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:b9be91986841a75042b3e3243d0b3cb0b2434252b977baaf0cd56e960fe1e46f", size = 249497, upload-time = "2025-09-21T20:02:07.619Z" }, + { url = "https://files.pythonhosted.org/packages/5f/af/152633ff35b2af63977edd835d8e6430f0caef27d171edf2fc76c270ef31/coverage-7.10.7-cp313-cp313-musllinux_1_2_riscv64.whl", hash = "sha256:b281d5eca50189325cfe1f365fafade89b14b4a78d9b40b05ddd1fc7d2a10a9c", size = 249350, upload-time = "2025-09-21T20:02:10.34Z" }, + { url = "https://files.pythonhosted.org/packages/9d/71/d92105d122bd21cebba877228990e1646d862e34a98bb3374d3fece5a794/coverage-7.10.7-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:99e4aa63097ab1118e75a848a28e40d68b08a5e19ce587891ab7fd04475e780f", size = 251111, upload-time = "2025-09-21T20:02:12.122Z" }, + { url = "https://files.pythonhosted.org/packages/a2/9e/9fdb08f4bf476c912f0c3ca292e019aab6712c93c9344a1653986c3fd305/coverage-7.10.7-cp313-cp313-win32.whl", hash = "sha256:dc7c389dce432500273eaf48f410b37886be9208b2dd5710aaf7c57fd442c698", size = 220746, upload-time = "2025-09-21T20:02:13.919Z" }, + { url = "https://files.pythonhosted.org/packages/b1/b1/a75fd25df44eab52d1931e89980d1ada46824c7a3210be0d3c88a44aaa99/coverage-7.10.7-cp313-cp313-win_amd64.whl", hash = "sha256:cac0fdca17b036af3881a9d2729a850b76553f3f716ccb0360ad4dbc06b3b843", size = 221541, upload-time = "2025-09-21T20:02:15.57Z" }, + { url = "https://files.pythonhosted.org/packages/14/3a/d720d7c989562a6e9a14b2c9f5f2876bdb38e9367126d118495b89c99c37/coverage-7.10.7-cp313-cp313-win_arm64.whl", hash = "sha256:4b6f236edf6e2f9ae8fcd1332da4e791c1b6ba0dc16a2dc94590ceccb482e546", size = 220170, upload-time = "2025-09-21T20:02:17.395Z" }, + { url = "https://files.pythonhosted.org/packages/bb/22/e04514bf2a735d8b0add31d2b4ab636fc02370730787c576bb995390d2d5/coverage-7.10.7-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:a0ec07fd264d0745ee396b666d47cef20875f4ff2375d7c4f58235886cc1ef0c", size = 219029, upload-time = "2025-09-21T20:02:18.936Z" }, + { url = "https://files.pythonhosted.org/packages/11/0b/91128e099035ece15da3445d9015e4b4153a6059403452d324cbb0a575fa/coverage-7.10.7-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:dd5e856ebb7bfb7672b0086846db5afb4567a7b9714b8a0ebafd211ec7ce6a15", size = 219259, upload-time = "2025-09-21T20:02:20.44Z" }, + { url = "https://files.pythonhosted.org/packages/8b/51/66420081e72801536a091a0c8f8c1f88a5c4bf7b9b1bdc6222c7afe6dc9b/coverage-7.10.7-cp313-cp313t-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:f57b2a3c8353d3e04acf75b3fed57ba41f5c0646bbf1d10c7c282291c97936b4", size = 260592, upload-time = "2025-09-21T20:02:22.313Z" }, + { url = "https://files.pythonhosted.org/packages/5d/22/9b8d458c2881b22df3db5bb3e7369e63d527d986decb6c11a591ba2364f7/coverage-7.10.7-cp313-cp313t-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:1ef2319dd15a0b009667301a3f84452a4dc6fddfd06b0c5c53ea472d3989fbf0", size = 262768, upload-time = "2025-09-21T20:02:24.287Z" }, + { url = "https://files.pythonhosted.org/packages/f7/08/16bee2c433e60913c610ea200b276e8eeef084b0d200bdcff69920bd5828/coverage-7.10.7-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:83082a57783239717ceb0ad584de3c69cf581b2a95ed6bf81ea66034f00401c0", size = 264995, upload-time = "2025-09-21T20:02:26.133Z" }, + { url = "https://files.pythonhosted.org/packages/20/9d/e53eb9771d154859b084b90201e5221bca7674ba449a17c101a5031d4054/coverage-7.10.7-cp313-cp313t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:50aa94fb1fb9a397eaa19c0d5ec15a5edd03a47bf1a3a6111a16b36e190cff65", size = 259546, upload-time = "2025-09-21T20:02:27.716Z" }, + { url = "https://files.pythonhosted.org/packages/ad/b0/69bc7050f8d4e56a89fb550a1577d5d0d1db2278106f6f626464067b3817/coverage-7.10.7-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:2120043f147bebb41c85b97ac45dd173595ff14f2a584f2963891cbcc3091541", size = 262544, upload-time = "2025-09-21T20:02:29.216Z" }, + { url = "https://files.pythonhosted.org/packages/ef/4b/2514b060dbd1bc0aaf23b852c14bb5818f244c664cb16517feff6bb3a5ab/coverage-7.10.7-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:2fafd773231dd0378fdba66d339f84904a8e57a262f583530f4f156ab83863e6", size = 260308, upload-time = "2025-09-21T20:02:31.226Z" }, + { url = "https://files.pythonhosted.org/packages/54/78/7ba2175007c246d75e496f64c06e94122bdb914790a1285d627a918bd271/coverage-7.10.7-cp313-cp313t-musllinux_1_2_riscv64.whl", hash = "sha256:0b944ee8459f515f28b851728ad224fa2d068f1513ef6b7ff1efafeb2185f999", size = 258920, upload-time = "2025-09-21T20:02:32.823Z" }, + { url = "https://files.pythonhosted.org/packages/c0/b3/fac9f7abbc841409b9a410309d73bfa6cfb2e51c3fada738cb607ce174f8/coverage-7.10.7-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:4b583b97ab2e3efe1b3e75248a9b333bd3f8b0b1b8e5b45578e05e5850dfb2c2", size = 261434, upload-time = "2025-09-21T20:02:34.86Z" }, + { url = "https://files.pythonhosted.org/packages/ee/51/a03bec00d37faaa891b3ff7387192cef20f01604e5283a5fabc95346befa/coverage-7.10.7-cp313-cp313t-win32.whl", hash = "sha256:2a78cd46550081a7909b3329e2266204d584866e8d97b898cd7fb5ac8d888b1a", size = 221403, upload-time = "2025-09-21T20:02:37.034Z" }, + { url = "https://files.pythonhosted.org/packages/53/22/3cf25d614e64bf6d8e59c7c669b20d6d940bb337bdee5900b9ca41c820bb/coverage-7.10.7-cp313-cp313t-win_amd64.whl", hash = "sha256:33a5e6396ab684cb43dc7befa386258acb2d7fae7f67330ebb85ba4ea27938eb", size = 222469, upload-time = "2025-09-21T20:02:39.011Z" }, + { url = "https://files.pythonhosted.org/packages/49/a1/00164f6d30d8a01c3c9c48418a7a5be394de5349b421b9ee019f380df2a0/coverage-7.10.7-cp313-cp313t-win_arm64.whl", hash = "sha256:86b0e7308289ddde73d863b7683f596d8d21c7d8664ce1dee061d0bcf3fbb4bb", size = 220731, upload-time = "2025-09-21T20:02:40.939Z" }, + { url = "https://files.pythonhosted.org/packages/23/9c/5844ab4ca6a4dd97a1850e030a15ec7d292b5c5cb93082979225126e35dd/coverage-7.10.7-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:b06f260b16ead11643a5a9f955bd4b5fd76c1a4c6796aeade8520095b75de520", size = 218302, upload-time = "2025-09-21T20:02:42.527Z" }, + { url = "https://files.pythonhosted.org/packages/f0/89/673f6514b0961d1f0e20ddc242e9342f6da21eaba3489901b565c0689f34/coverage-7.10.7-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:212f8f2e0612778f09c55dd4872cb1f64a1f2b074393d139278ce902064d5b32", size = 218578, upload-time = "2025-09-21T20:02:44.468Z" }, + { url = "https://files.pythonhosted.org/packages/05/e8/261cae479e85232828fb17ad536765c88dd818c8470aca690b0ac6feeaa3/coverage-7.10.7-cp314-cp314-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:3445258bcded7d4aa630ab8296dea4d3f15a255588dd535f980c193ab6b95f3f", size = 249629, upload-time = "2025-09-21T20:02:46.503Z" }, + { url = "https://files.pythonhosted.org/packages/82/62/14ed6546d0207e6eda876434e3e8475a3e9adbe32110ce896c9e0c06bb9a/coverage-7.10.7-cp314-cp314-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:bb45474711ba385c46a0bfe696c695a929ae69ac636cda8f532be9e8c93d720a", size = 252162, upload-time = "2025-09-21T20:02:48.689Z" }, + { url = "https://files.pythonhosted.org/packages/ff/49/07f00db9ac6478e4358165a08fb41b469a1b053212e8a00cb02f0d27a05f/coverage-7.10.7-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:813922f35bd800dca9994c5971883cbc0d291128a5de6b167c7aa697fcf59360", size = 253517, upload-time = "2025-09-21T20:02:50.31Z" }, + { url = "https://files.pythonhosted.org/packages/a2/59/c5201c62dbf165dfbc91460f6dbbaa85a8b82cfa6131ac45d6c1bfb52deb/coverage-7.10.7-cp314-cp314-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:93c1b03552081b2a4423091d6fb3787265b8f86af404cff98d1b5342713bdd69", size = 249632, upload-time = "2025-09-21T20:02:51.971Z" }, + { url = "https://files.pythonhosted.org/packages/07/ae/5920097195291a51fb00b3a70b9bbd2edbfe3c84876a1762bd1ef1565ebc/coverage-7.10.7-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:cc87dd1b6eaf0b848eebb1c86469b9f72a1891cb42ac7adcfbce75eadb13dd14", size = 251520, upload-time = "2025-09-21T20:02:53.858Z" }, + { url = "https://files.pythonhosted.org/packages/b9/3c/a815dde77a2981f5743a60b63df31cb322c944843e57dbd579326625a413/coverage-7.10.7-cp314-cp314-musllinux_1_2_i686.whl", hash = "sha256:39508ffda4f343c35f3236fe8d1a6634a51f4581226a1262769d7f970e73bffe", size = 249455, upload-time = "2025-09-21T20:02:55.807Z" }, + { url = "https://files.pythonhosted.org/packages/aa/99/f5cdd8421ea656abefb6c0ce92556709db2265c41e8f9fc6c8ae0f7824c9/coverage-7.10.7-cp314-cp314-musllinux_1_2_riscv64.whl", hash = "sha256:925a1edf3d810537c5a3abe78ec5530160c5f9a26b1f4270b40e62cc79304a1e", size = 249287, upload-time = "2025-09-21T20:02:57.784Z" }, + { url = "https://files.pythonhosted.org/packages/c3/7a/e9a2da6a1fc5d007dd51fca083a663ab930a8c4d149c087732a5dbaa0029/coverage-7.10.7-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:2c8b9a0636f94c43cd3576811e05b89aa9bc2d0a85137affc544ae5cb0e4bfbd", size = 250946, upload-time = "2025-09-21T20:02:59.431Z" }, + { url = "https://files.pythonhosted.org/packages/ef/5b/0b5799aa30380a949005a353715095d6d1da81927d6dbed5def2200a4e25/coverage-7.10.7-cp314-cp314-win32.whl", hash = "sha256:b7b8288eb7cdd268b0304632da8cb0bb93fadcfec2fe5712f7b9cc8f4d487be2", size = 221009, upload-time = "2025-09-21T20:03:01.324Z" }, + { url = "https://files.pythonhosted.org/packages/da/b0/e802fbb6eb746de006490abc9bb554b708918b6774b722bb3a0e6aa1b7de/coverage-7.10.7-cp314-cp314-win_amd64.whl", hash = "sha256:1ca6db7c8807fb9e755d0379ccc39017ce0a84dcd26d14b5a03b78563776f681", size = 221804, upload-time = "2025-09-21T20:03:03.4Z" }, + { url = "https://files.pythonhosted.org/packages/9e/e8/71d0c8e374e31f39e3389bb0bd19e527d46f00ea8571ec7ec8fd261d8b44/coverage-7.10.7-cp314-cp314-win_arm64.whl", hash = "sha256:097c1591f5af4496226d5783d036bf6fd6cd0cbc132e071b33861de756efb880", size = 220384, upload-time = "2025-09-21T20:03:05.111Z" }, + { url = "https://files.pythonhosted.org/packages/62/09/9a5608d319fa3eba7a2019addeacb8c746fb50872b57a724c9f79f146969/coverage-7.10.7-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:a62c6ef0d50e6de320c270ff91d9dd0a05e7250cac2a800b7784bae474506e63", size = 219047, upload-time = "2025-09-21T20:03:06.795Z" }, + { url = "https://files.pythonhosted.org/packages/f5/6f/f58d46f33db9f2e3647b2d0764704548c184e6f5e014bef528b7f979ef84/coverage-7.10.7-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:9fa6e4dd51fe15d8738708a973470f67a855ca50002294852e9571cdbd9433f2", size = 219266, upload-time = "2025-09-21T20:03:08.495Z" }, + { url = "https://files.pythonhosted.org/packages/74/5c/183ffc817ba68e0b443b8c934c8795553eb0c14573813415bd59941ee165/coverage-7.10.7-cp314-cp314t-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:8fb190658865565c549b6b4706856d6a7b09302c797eb2cf8e7fe9dabb043f0d", size = 260767, upload-time = "2025-09-21T20:03:10.172Z" }, + { url = "https://files.pythonhosted.org/packages/0f/48/71a8abe9c1ad7e97548835e3cc1adbf361e743e9d60310c5f75c9e7bf847/coverage-7.10.7-cp314-cp314t-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:affef7c76a9ef259187ef31599a9260330e0335a3011732c4b9effa01e1cd6e0", size = 262931, upload-time = "2025-09-21T20:03:11.861Z" }, + { url = "https://files.pythonhosted.org/packages/84/fd/193a8fb132acfc0a901f72020e54be5e48021e1575bb327d8ee1097a28fd/coverage-7.10.7-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6e16e07d85ca0cf8bafe5f5d23a0b850064e8e945d5677492b06bbe6f09cc699", size = 265186, upload-time = "2025-09-21T20:03:13.539Z" }, + { url = "https://files.pythonhosted.org/packages/b1/8f/74ecc30607dd95ad50e3034221113ccb1c6d4e8085cc761134782995daae/coverage-7.10.7-cp314-cp314t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:03ffc58aacdf65d2a82bbeb1ffe4d01ead4017a21bfd0454983b88ca73af94b9", size = 259470, upload-time = "2025-09-21T20:03:15.584Z" }, + { url = "https://files.pythonhosted.org/packages/0f/55/79ff53a769f20d71b07023ea115c9167c0bb56f281320520cf64c5298a96/coverage-7.10.7-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:1b4fd784344d4e52647fd7857b2af5b3fbe6c239b0b5fa63e94eb67320770e0f", size = 262626, upload-time = "2025-09-21T20:03:17.673Z" }, + { url = "https://files.pythonhosted.org/packages/88/e2/dac66c140009b61ac3fc13af673a574b00c16efdf04f9b5c740703e953c0/coverage-7.10.7-cp314-cp314t-musllinux_1_2_i686.whl", hash = "sha256:0ebbaddb2c19b71912c6f2518e791aa8b9f054985a0769bdb3a53ebbc765c6a1", size = 260386, upload-time = "2025-09-21T20:03:19.36Z" }, + { url = "https://files.pythonhosted.org/packages/a2/f1/f48f645e3f33bb9ca8a496bc4a9671b52f2f353146233ebd7c1df6160440/coverage-7.10.7-cp314-cp314t-musllinux_1_2_riscv64.whl", hash = "sha256:a2d9a3b260cc1d1dbdb1c582e63ddcf5363426a1a68faa0f5da28d8ee3c722a0", size = 258852, upload-time = "2025-09-21T20:03:21.007Z" }, + { url = "https://files.pythonhosted.org/packages/bb/3b/8442618972c51a7affeead957995cfa8323c0c9bcf8fa5a027421f720ff4/coverage-7.10.7-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:a3cc8638b2480865eaa3926d192e64ce6c51e3d29c849e09d5b4ad95efae5399", size = 261534, upload-time = "2025-09-21T20:03:23.12Z" }, + { url = "https://files.pythonhosted.org/packages/b2/dc/101f3fa3a45146db0cb03f5b4376e24c0aac818309da23e2de0c75295a91/coverage-7.10.7-cp314-cp314t-win32.whl", hash = "sha256:67f8c5cbcd3deb7a60b3345dffc89a961a484ed0af1f6f73de91705cc6e31235", size = 221784, upload-time = "2025-09-21T20:03:24.769Z" }, + { url = "https://files.pythonhosted.org/packages/4c/a1/74c51803fc70a8a40d7346660379e144be772bab4ac7bb6e6b905152345c/coverage-7.10.7-cp314-cp314t-win_amd64.whl", hash = "sha256:e1ed71194ef6dea7ed2d5cb5f7243d4bcd334bfb63e59878519be558078f848d", size = 222905, upload-time = "2025-09-21T20:03:26.93Z" }, + { url = "https://files.pythonhosted.org/packages/12/65/f116a6d2127df30bcafbceef0302d8a64ba87488bf6f73a6d8eebf060873/coverage-7.10.7-cp314-cp314t-win_arm64.whl", hash = "sha256:7fe650342addd8524ca63d77b2362b02345e5f1a093266787d210c70a50b471a", size = 220922, upload-time = "2025-09-21T20:03:28.672Z" }, + { url = "https://files.pythonhosted.org/packages/a3/ad/d1c25053764b4c42eb294aae92ab617d2e4f803397f9c7c8295caa77a260/coverage-7.10.7-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:fff7b9c3f19957020cac546c70025331113d2e61537f6e2441bc7657913de7d3", size = 217978, upload-time = "2025-09-21T20:03:30.362Z" }, + { url = "https://files.pythonhosted.org/packages/52/2f/b9f9daa39b80ece0b9548bbb723381e29bc664822d9a12c2135f8922c22b/coverage-7.10.7-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:bc91b314cef27742da486d6839b677b3f2793dfe52b51bbbb7cf736d5c29281c", size = 218370, upload-time = "2025-09-21T20:03:32.147Z" }, + { url = "https://files.pythonhosted.org/packages/dd/6e/30d006c3b469e58449650642383dddf1c8fb63d44fdf92994bfd46570695/coverage-7.10.7-cp39-cp39-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:567f5c155eda8df1d3d439d40a45a6a5f029b429b06648235f1e7e51b522b396", size = 244802, upload-time = "2025-09-21T20:03:33.919Z" }, + { url = "https://files.pythonhosted.org/packages/b0/49/8a070782ce7e6b94ff6a0b6d7c65ba6bc3091d92a92cef4cd4eb0767965c/coverage-7.10.7-cp39-cp39-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:2af88deffcc8a4d5974cf2d502251bc3b2db8461f0b66d80a449c33757aa9f40", size = 246625, upload-time = "2025-09-21T20:03:36.09Z" }, + { url = "https://files.pythonhosted.org/packages/6a/92/1c1c5a9e8677ce56d42b97bdaca337b2d4d9ebe703d8c174ede52dbabd5f/coverage-7.10.7-cp39-cp39-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c7315339eae3b24c2d2fa1ed7d7a38654cba34a13ef19fbcb9425da46d3dc594", size = 248399, upload-time = "2025-09-21T20:03:38.342Z" }, + { url = "https://files.pythonhosted.org/packages/c0/54/b140edee7257e815de7426d5d9846b58505dffc29795fff2dfb7f8a1c5a0/coverage-7.10.7-cp39-cp39-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:912e6ebc7a6e4adfdbb1aec371ad04c68854cd3bf3608b3514e7ff9062931d8a", size = 245142, upload-time = "2025-09-21T20:03:40.591Z" }, + { url = "https://files.pythonhosted.org/packages/e4/9e/6d6b8295940b118e8b7083b29226c71f6154f7ff41e9ca431f03de2eac0d/coverage-7.10.7-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:f49a05acd3dfe1ce9715b657e28d138578bc40126760efb962322c56e9ca344b", size = 246284, upload-time = "2025-09-21T20:03:42.355Z" }, + { url = "https://files.pythonhosted.org/packages/db/e5/5e957ca747d43dbe4d9714358375c7546cb3cb533007b6813fc20fce37ad/coverage-7.10.7-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:cce2109b6219f22ece99db7644b9622f54a4e915dad65660ec435e89a3ea7cc3", size = 244353, upload-time = "2025-09-21T20:03:44.218Z" }, + { url = "https://files.pythonhosted.org/packages/9a/45/540fc5cc92536a1b783b7ef99450bd55a4b3af234aae35a18a339973ce30/coverage-7.10.7-cp39-cp39-musllinux_1_2_riscv64.whl", hash = "sha256:f3c887f96407cea3916294046fc7dab611c2552beadbed4ea901cbc6a40cc7a0", size = 244430, upload-time = "2025-09-21T20:03:46.065Z" }, + { url = "https://files.pythonhosted.org/packages/75/0b/8287b2e5b38c8fe15d7e3398849bb58d382aedc0864ea0fa1820e8630491/coverage-7.10.7-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:635adb9a4507c9fd2ed65f39693fa31c9a3ee3a8e6dc64df033e8fdf52a7003f", size = 245311, upload-time = "2025-09-21T20:03:48.19Z" }, + { url = "https://files.pythonhosted.org/packages/0c/1d/29724999984740f0c86d03e6420b942439bf5bd7f54d4382cae386a9d1e9/coverage-7.10.7-cp39-cp39-win32.whl", hash = "sha256:5a02d5a850e2979b0a014c412573953995174743a3f7fa4ea5a6e9a3c5617431", size = 220500, upload-time = "2025-09-21T20:03:50.024Z" }, + { url = "https://files.pythonhosted.org/packages/43/11/4b1e6b129943f905ca54c339f343877b55b365ae2558806c1be4f7476ed5/coverage-7.10.7-cp39-cp39-win_amd64.whl", hash = "sha256:c134869d5ffe34547d14e174c866fd8fe2254918cc0a95e99052903bc1543e07", size = 221408, upload-time = "2025-09-21T20:03:51.803Z" }, + { url = "https://files.pythonhosted.org/packages/ec/16/114df1c291c22cac3b0c127a73e0af5c12ed7bbb6558d310429a0ae24023/coverage-7.10.7-py3-none-any.whl", hash = "sha256:f7941f6f2fe6dd6807a1208737b8a0cbcf1cc6d7b07d24998ad2d63590868260", size = 209952, upload-time = "2025-09-21T20:03:53.918Z" }, +] + +[package.optional-dependencies] +toml = [ + { name = "tomli", marker = "python_full_version == '3.9.*'" }, +] + +[[package]] +name = "coverage" +version = "7.12.0" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version >= '3.14'", + "python_full_version >= '3.11' and python_full_version < '3.14'", + "python_full_version == '3.10.*'", +] +sdist = { url = "https://files.pythonhosted.org/packages/89/26/4a96807b193b011588099c3b5c89fbb05294e5b90e71018e065465f34eb6/coverage-7.12.0.tar.gz", hash = "sha256:fc11e0a4e372cb5f282f16ef90d4a585034050ccda536451901abfb19a57f40c", size = 819341, upload-time = "2025-11-18T13:34:20.766Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/26/4a/0dc3de1c172d35abe512332cfdcc43211b6ebce629e4cc42e6cd25ed8f4d/coverage-7.12.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:32b75c2ba3f324ee37af3ccee5b30458038c50b349ad9b88cee85096132a575b", size = 217409, upload-time = "2025-11-18T13:31:53.122Z" }, + { url = "https://files.pythonhosted.org/packages/01/c3/086198b98db0109ad4f84241e8e9ea7e5fb2db8c8ffb787162d40c26cc76/coverage-7.12.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:cb2a1b6ab9fe833714a483a915de350abc624a37149649297624c8d57add089c", size = 217927, upload-time = "2025-11-18T13:31:54.458Z" }, + { url = "https://files.pythonhosted.org/packages/5d/5f/34614dbf5ce0420828fc6c6f915126a0fcb01e25d16cf141bf5361e6aea6/coverage-7.12.0-cp310-cp310-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:5734b5d913c3755e72f70bf6cc37a0518d4f4745cde760c5d8e12005e62f9832", size = 244678, upload-time = "2025-11-18T13:31:55.805Z" }, + { url = "https://files.pythonhosted.org/packages/55/7b/6b26fb32e8e4a6989ac1d40c4e132b14556131493b1d06bc0f2be169c357/coverage-7.12.0-cp310-cp310-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:b527a08cdf15753279b7afb2339a12073620b761d79b81cbe2cdebdb43d90daa", size = 246507, upload-time = "2025-11-18T13:31:57.05Z" }, + { url = "https://files.pythonhosted.org/packages/06/42/7d70e6603d3260199b90fb48b537ca29ac183d524a65cc31366b2e905fad/coverage-7.12.0-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:9bb44c889fb68004e94cab71f6a021ec83eac9aeabdbb5a5a88821ec46e1da73", size = 248366, upload-time = "2025-11-18T13:31:58.362Z" }, + { url = "https://files.pythonhosted.org/packages/2d/4a/d86b837923878424c72458c5b25e899a3c5ca73e663082a915f5b3c4d749/coverage-7.12.0-cp310-cp310-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:4b59b501455535e2e5dde5881739897967b272ba25988c89145c12d772810ccb", size = 245366, upload-time = "2025-11-18T13:31:59.572Z" }, + { url = "https://files.pythonhosted.org/packages/e6/c2/2adec557e0aa9721875f06ced19730fdb7fc58e31b02b5aa56f2ebe4944d/coverage-7.12.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:d8842f17095b9868a05837b7b1b73495293091bed870e099521ada176aa3e00e", size = 246408, upload-time = "2025-11-18T13:32:00.784Z" }, + { url = "https://files.pythonhosted.org/packages/5a/4b/8bd1f1148260df11c618e535fdccd1e5aaf646e55b50759006a4f41d8a26/coverage-7.12.0-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:c5a6f20bf48b8866095c6820641e7ffbe23f2ac84a2efc218d91235e404c7777", size = 244416, upload-time = "2025-11-18T13:32:01.963Z" }, + { url = "https://files.pythonhosted.org/packages/0e/13/3a248dd6a83df90414c54a4e121fd081fb20602ca43955fbe1d60e2312a9/coverage-7.12.0-cp310-cp310-musllinux_1_2_riscv64.whl", hash = "sha256:5f3738279524e988d9da2893f307c2093815c623f8d05a8f79e3eff3a7a9e553", size = 244681, upload-time = "2025-11-18T13:32:03.408Z" }, + { url = "https://files.pythonhosted.org/packages/76/30/aa833827465a5e8c938935f5d91ba055f70516941078a703740aaf1aa41f/coverage-7.12.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:e0d68c1f7eabbc8abe582d11fa393ea483caf4f44b0af86881174769f185c94d", size = 245300, upload-time = "2025-11-18T13:32:04.686Z" }, + { url = "https://files.pythonhosted.org/packages/38/24/f85b3843af1370fb3739fa7571819b71243daa311289b31214fe3e8c9d68/coverage-7.12.0-cp310-cp310-win32.whl", hash = "sha256:7670d860e18b1e3ee5930b17a7d55ae6287ec6e55d9799982aa103a2cc1fa2ef", size = 220008, upload-time = "2025-11-18T13:32:05.806Z" }, + { url = "https://files.pythonhosted.org/packages/3a/a2/c7da5b9566f7164db9eefa133d17761ecb2c2fde9385d754e5b5c80f710d/coverage-7.12.0-cp310-cp310-win_amd64.whl", hash = "sha256:f999813dddeb2a56aab5841e687b68169da0d3f6fc78ccf50952fa2463746022", size = 220943, upload-time = "2025-11-18T13:32:07.166Z" }, + { url = "https://files.pythonhosted.org/packages/5a/0c/0dfe7f0487477d96432e4815537263363fb6dd7289743a796e8e51eabdf2/coverage-7.12.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:aa124a3683d2af98bd9d9c2bfa7a5076ca7e5ab09fdb96b81fa7d89376ae928f", size = 217535, upload-time = "2025-11-18T13:32:08.812Z" }, + { url = "https://files.pythonhosted.org/packages/9b/f5/f9a4a053a5bbff023d3bec259faac8f11a1e5a6479c2ccf586f910d8dac7/coverage-7.12.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:d93fbf446c31c0140208dcd07c5d882029832e8ed7891a39d6d44bd65f2316c3", size = 218044, upload-time = "2025-11-18T13:32:10.329Z" }, + { url = "https://files.pythonhosted.org/packages/95/c5/84fc3697c1fa10cd8571919bf9693f693b7373278daaf3b73e328d502bc8/coverage-7.12.0-cp311-cp311-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:52ca620260bd8cd6027317bdd8b8ba929be1d741764ee765b42c4d79a408601e", size = 248440, upload-time = "2025-11-18T13:32:12.536Z" }, + { url = "https://files.pythonhosted.org/packages/f4/36/2d93fbf6a04670f3874aed397d5a5371948a076e3249244a9e84fb0e02d6/coverage-7.12.0-cp311-cp311-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:f3433ffd541380f3a0e423cff0f4926d55b0cc8c1d160fdc3be24a4c03aa65f7", size = 250361, upload-time = "2025-11-18T13:32:13.852Z" }, + { url = "https://files.pythonhosted.org/packages/5d/49/66dc65cc456a6bfc41ea3d0758c4afeaa4068a2b2931bf83be6894cf1058/coverage-7.12.0-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:f7bbb321d4adc9f65e402c677cd1c8e4c2d0105d3ce285b51b4d87f1d5db5245", size = 252472, upload-time = "2025-11-18T13:32:15.068Z" }, + { url = "https://files.pythonhosted.org/packages/35/1f/ebb8a18dffd406db9fcd4b3ae42254aedcaf612470e8712f12041325930f/coverage-7.12.0-cp311-cp311-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:22a7aade354a72dff3b59c577bfd18d6945c61f97393bc5fb7bd293a4237024b", size = 248592, upload-time = "2025-11-18T13:32:16.328Z" }, + { url = "https://files.pythonhosted.org/packages/da/a8/67f213c06e5ea3b3d4980df7dc344d7fea88240b5fe878a5dcbdfe0e2315/coverage-7.12.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:3ff651dcd36d2fea66877cd4a82de478004c59b849945446acb5baf9379a1b64", size = 250167, upload-time = "2025-11-18T13:32:17.687Z" }, + { url = "https://files.pythonhosted.org/packages/f0/00/e52aef68154164ea40cc8389c120c314c747fe63a04b013a5782e989b77f/coverage-7.12.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:31b8b2e38391a56e3cea39d22a23faaa7c3fc911751756ef6d2621d2a9daf742", size = 248238, upload-time = "2025-11-18T13:32:19.2Z" }, + { url = "https://files.pythonhosted.org/packages/1f/a4/4d88750bcf9d6d66f77865e5a05a20e14db44074c25fd22519777cb69025/coverage-7.12.0-cp311-cp311-musllinux_1_2_riscv64.whl", hash = "sha256:297bc2da28440f5ae51c845a47c8175a4db0553a53827886e4fb25c66633000c", size = 247964, upload-time = "2025-11-18T13:32:21.027Z" }, + { url = "https://files.pythonhosted.org/packages/a7/6b/b74693158899d5b47b0bf6238d2c6722e20ba749f86b74454fac0696bb00/coverage-7.12.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:6ff7651cc01a246908eac162a6a86fc0dbab6de1ad165dfb9a1e2ec660b44984", size = 248862, upload-time = "2025-11-18T13:32:22.304Z" }, + { url = "https://files.pythonhosted.org/packages/18/de/6af6730227ce0e8ade307b1cc4a08e7f51b419a78d02083a86c04ccceb29/coverage-7.12.0-cp311-cp311-win32.whl", hash = "sha256:313672140638b6ddb2c6455ddeda41c6a0b208298034544cfca138978c6baed6", size = 220033, upload-time = "2025-11-18T13:32:23.714Z" }, + { url = "https://files.pythonhosted.org/packages/e2/a1/e7f63021a7c4fe20994359fcdeae43cbef4a4d0ca36a5a1639feeea5d9e1/coverage-7.12.0-cp311-cp311-win_amd64.whl", hash = "sha256:a1783ed5bd0d5938d4435014626568dc7f93e3cb99bc59188cc18857c47aa3c4", size = 220966, upload-time = "2025-11-18T13:32:25.599Z" }, + { url = "https://files.pythonhosted.org/packages/77/e8/deae26453f37c20c3aa0c4433a1e32cdc169bf415cce223a693117aa3ddd/coverage-7.12.0-cp311-cp311-win_arm64.whl", hash = "sha256:4648158fd8dd9381b5847622df1c90ff314efbfc1df4550092ab6013c238a5fc", size = 219637, upload-time = "2025-11-18T13:32:27.265Z" }, + { url = "https://files.pythonhosted.org/packages/02/bf/638c0427c0f0d47638242e2438127f3c8ee3cfc06c7fdeb16778ed47f836/coverage-7.12.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:29644c928772c78512b48e14156b81255000dcfd4817574ff69def189bcb3647", size = 217704, upload-time = "2025-11-18T13:32:28.906Z" }, + { url = "https://files.pythonhosted.org/packages/08/e1/706fae6692a66c2d6b871a608bbde0da6281903fa0e9f53a39ed441da36a/coverage-7.12.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:8638cbb002eaa5d7c8d04da667813ce1067080b9a91099801a0053086e52b736", size = 218064, upload-time = "2025-11-18T13:32:30.161Z" }, + { url = "https://files.pythonhosted.org/packages/a9/8b/eb0231d0540f8af3ffda39720ff43cb91926489d01524e68f60e961366e4/coverage-7.12.0-cp312-cp312-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:083631eeff5eb9992c923e14b810a179798bb598e6a0dd60586819fc23be6e60", size = 249560, upload-time = "2025-11-18T13:32:31.835Z" }, + { url = "https://files.pythonhosted.org/packages/e9/a1/67fb52af642e974d159b5b379e4d4c59d0ebe1288677fbd04bbffe665a82/coverage-7.12.0-cp312-cp312-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:99d5415c73ca12d558e07776bd957c4222c687b9f1d26fa0e1b57e3598bdcde8", size = 252318, upload-time = "2025-11-18T13:32:33.178Z" }, + { url = "https://files.pythonhosted.org/packages/41/e5/38228f31b2c7665ebf9bdfdddd7a184d56450755c7e43ac721c11a4b8dab/coverage-7.12.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:e949ebf60c717c3df63adb4a1a366c096c8d7fd8472608cd09359e1bd48ef59f", size = 253403, upload-time = "2025-11-18T13:32:34.45Z" }, + { url = "https://files.pythonhosted.org/packages/ec/4b/df78e4c8188f9960684267c5a4897836f3f0f20a20c51606ee778a1d9749/coverage-7.12.0-cp312-cp312-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:6d907ddccbca819afa2cd014bc69983b146cca2735a0b1e6259b2a6c10be1e70", size = 249984, upload-time = "2025-11-18T13:32:35.747Z" }, + { url = "https://files.pythonhosted.org/packages/ba/51/bb163933d195a345c6f63eab9e55743413d064c291b6220df754075c2769/coverage-7.12.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:b1518ecbad4e6173f4c6e6c4a46e49555ea5679bf3feda5edb1b935c7c44e8a0", size = 251339, upload-time = "2025-11-18T13:32:37.352Z" }, + { url = "https://files.pythonhosted.org/packages/15/40/c9b29cdb8412c837cdcbc2cfa054547dd83affe6cbbd4ce4fdb92b6ba7d1/coverage-7.12.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:51777647a749abdf6f6fd8c7cffab12de68ab93aab15efc72fbbb83036c2a068", size = 249489, upload-time = "2025-11-18T13:32:39.212Z" }, + { url = "https://files.pythonhosted.org/packages/c8/da/b3131e20ba07a0de4437a50ef3b47840dfabf9293675b0cd5c2c7f66dd61/coverage-7.12.0-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:42435d46d6461a3b305cdfcad7cdd3248787771f53fe18305548cba474e6523b", size = 249070, upload-time = "2025-11-18T13:32:40.598Z" }, + { url = "https://files.pythonhosted.org/packages/70/81/b653329b5f6302c08d683ceff6785bc60a34be9ae92a5c7b63ee7ee7acec/coverage-7.12.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:5bcead88c8423e1855e64b8057d0544e33e4080b95b240c2a355334bb7ced937", size = 250929, upload-time = "2025-11-18T13:32:42.915Z" }, + { url = "https://files.pythonhosted.org/packages/a3/00/250ac3bca9f252a5fb1338b5ad01331ebb7b40223f72bef5b1b2cb03aa64/coverage-7.12.0-cp312-cp312-win32.whl", hash = "sha256:dcbb630ab034e86d2a0f79aefd2be07e583202f41e037602d438c80044957baa", size = 220241, upload-time = "2025-11-18T13:32:44.665Z" }, + { url = "https://files.pythonhosted.org/packages/64/1c/77e79e76d37ce83302f6c21980b45e09f8aa4551965213a10e62d71ce0ab/coverage-7.12.0-cp312-cp312-win_amd64.whl", hash = "sha256:2fd8354ed5d69775ac42986a691fbf68b4084278710cee9d7c3eaa0c28fa982a", size = 221051, upload-time = "2025-11-18T13:32:46.008Z" }, + { url = "https://files.pythonhosted.org/packages/31/f5/641b8a25baae564f9e52cac0e2667b123de961985709a004e287ee7663cc/coverage-7.12.0-cp312-cp312-win_arm64.whl", hash = "sha256:737c3814903be30695b2de20d22bcc5428fdae305c61ba44cdc8b3252984c49c", size = 219692, upload-time = "2025-11-18T13:32:47.372Z" }, + { url = "https://files.pythonhosted.org/packages/b8/14/771700b4048774e48d2c54ed0c674273702713c9ee7acdfede40c2666747/coverage-7.12.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:47324fffca8d8eae7e185b5bb20c14645f23350f870c1649003618ea91a78941", size = 217725, upload-time = "2025-11-18T13:32:49.22Z" }, + { url = "https://files.pythonhosted.org/packages/17/a7/3aa4144d3bcb719bf67b22d2d51c2d577bf801498c13cb08f64173e80497/coverage-7.12.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:ccf3b2ede91decd2fb53ec73c1f949c3e034129d1e0b07798ff1d02ea0c8fa4a", size = 218098, upload-time = "2025-11-18T13:32:50.78Z" }, + { url = "https://files.pythonhosted.org/packages/fc/9c/b846bbc774ff81091a12a10203e70562c91ae71badda00c5ae5b613527b1/coverage-7.12.0-cp313-cp313-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:b365adc70a6936c6b0582dc38746b33b2454148c02349345412c6e743efb646d", size = 249093, upload-time = "2025-11-18T13:32:52.554Z" }, + { url = "https://files.pythonhosted.org/packages/76/b6/67d7c0e1f400b32c883e9342de4a8c2ae7c1a0b57c5de87622b7262e2309/coverage-7.12.0-cp313-cp313-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:bc13baf85cd8a4cfcf4a35c7bc9d795837ad809775f782f697bf630b7e200211", size = 251686, upload-time = "2025-11-18T13:32:54.862Z" }, + { url = "https://files.pythonhosted.org/packages/cc/75/b095bd4b39d49c3be4bffbb3135fea18a99a431c52dd7513637c0762fecb/coverage-7.12.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:099d11698385d572ceafb3288a5b80fe1fc58bf665b3f9d362389de488361d3d", size = 252930, upload-time = "2025-11-18T13:32:56.417Z" }, + { url = "https://files.pythonhosted.org/packages/6e/f3/466f63015c7c80550bead3093aacabf5380c1220a2a93c35d374cae8f762/coverage-7.12.0-cp313-cp313-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:473dc45d69694069adb7680c405fb1e81f60b2aff42c81e2f2c3feaf544d878c", size = 249296, upload-time = "2025-11-18T13:32:58.074Z" }, + { url = "https://files.pythonhosted.org/packages/27/86/eba2209bf2b7e28c68698fc13437519a295b2d228ba9e0ec91673e09fa92/coverage-7.12.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:583f9adbefd278e9de33c33d6846aa8f5d164fa49b47144180a0e037f0688bb9", size = 251068, upload-time = "2025-11-18T13:32:59.646Z" }, + { url = "https://files.pythonhosted.org/packages/ec/55/ca8ae7dbba962a3351f18940b359b94c6bafdd7757945fdc79ec9e452dc7/coverage-7.12.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:b2089cc445f2dc0af6f801f0d1355c025b76c24481935303cf1af28f636688f0", size = 249034, upload-time = "2025-11-18T13:33:01.481Z" }, + { url = "https://files.pythonhosted.org/packages/7a/d7/39136149325cad92d420b023b5fd900dabdd1c3a0d1d5f148ef4a8cedef5/coverage-7.12.0-cp313-cp313-musllinux_1_2_riscv64.whl", hash = "sha256:950411f1eb5d579999c5f66c62a40961f126fc71e5e14419f004471957b51508", size = 248853, upload-time = "2025-11-18T13:33:02.935Z" }, + { url = "https://files.pythonhosted.org/packages/fe/b6/76e1add8b87ef60e00643b0b7f8f7bb73d4bf5249a3be19ebefc5793dd25/coverage-7.12.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:b1aab7302a87bafebfe76b12af681b56ff446dc6f32ed178ff9c092ca776e6bc", size = 250619, upload-time = "2025-11-18T13:33:04.336Z" }, + { url = "https://files.pythonhosted.org/packages/95/87/924c6dc64f9203f7a3c1832a6a0eee5a8335dbe5f1bdadcc278d6f1b4d74/coverage-7.12.0-cp313-cp313-win32.whl", hash = "sha256:d7e0d0303c13b54db495eb636bc2465b2fb8475d4c8bcec8fe4b5ca454dfbae8", size = 220261, upload-time = "2025-11-18T13:33:06.493Z" }, + { url = "https://files.pythonhosted.org/packages/91/77/dd4aff9af16ff776bf355a24d87eeb48fc6acde54c907cc1ea89b14a8804/coverage-7.12.0-cp313-cp313-win_amd64.whl", hash = "sha256:ce61969812d6a98a981d147d9ac583a36ac7db7766f2e64a9d4d059c2fe29d07", size = 221072, upload-time = "2025-11-18T13:33:07.926Z" }, + { url = "https://files.pythonhosted.org/packages/70/49/5c9dc46205fef31b1b226a6e16513193715290584317fd4df91cdaf28b22/coverage-7.12.0-cp313-cp313-win_arm64.whl", hash = "sha256:bcec6f47e4cb8a4c2dc91ce507f6eefc6a1b10f58df32cdc61dff65455031dfc", size = 219702, upload-time = "2025-11-18T13:33:09.631Z" }, + { url = "https://files.pythonhosted.org/packages/9b/62/f87922641c7198667994dd472a91e1d9b829c95d6c29529ceb52132436ad/coverage-7.12.0-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:459443346509476170d553035e4a3eed7b860f4fe5242f02de1010501956ce87", size = 218420, upload-time = "2025-11-18T13:33:11.153Z" }, + { url = "https://files.pythonhosted.org/packages/85/dd/1cc13b2395ef15dbb27d7370a2509b4aee77890a464fb35d72d428f84871/coverage-7.12.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:04a79245ab2b7a61688958f7a855275997134bc84f4a03bc240cf64ff132abf6", size = 218773, upload-time = "2025-11-18T13:33:12.569Z" }, + { url = "https://files.pythonhosted.org/packages/74/40/35773cc4bb1e9d4658d4fb669eb4195b3151bef3bbd6f866aba5cd5dac82/coverage-7.12.0-cp313-cp313t-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:09a86acaaa8455f13d6a99221d9654df249b33937b4e212b4e5a822065f12aa7", size = 260078, upload-time = "2025-11-18T13:33:14.037Z" }, + { url = "https://files.pythonhosted.org/packages/ec/ee/231bb1a6ffc2905e396557585ebc6bdc559e7c66708376d245a1f1d330fc/coverage-7.12.0-cp313-cp313t-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:907e0df1b71ba77463687a74149c6122c3f6aac56c2510a5d906b2f368208560", size = 262144, upload-time = "2025-11-18T13:33:15.601Z" }, + { url = "https://files.pythonhosted.org/packages/28/be/32f4aa9f3bf0b56f3971001b56508352c7753915345d45fab4296a986f01/coverage-7.12.0-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:9b57e2d0ddd5f0582bae5437c04ee71c46cd908e7bc5d4d0391f9a41e812dd12", size = 264574, upload-time = "2025-11-18T13:33:17.354Z" }, + { url = "https://files.pythonhosted.org/packages/68/7c/00489fcbc2245d13ab12189b977e0cf06ff3351cb98bc6beba8bd68c5902/coverage-7.12.0-cp313-cp313t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:58c1c6aa677f3a1411fe6fb28ec3a942e4f665df036a3608816e0847fad23296", size = 259298, upload-time = "2025-11-18T13:33:18.958Z" }, + { url = "https://files.pythonhosted.org/packages/96/b4/f0760d65d56c3bea95b449e02570d4abd2549dc784bf39a2d4721a2d8ceb/coverage-7.12.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:4c589361263ab2953e3c4cd2a94db94c4ad4a8e572776ecfbad2389c626e4507", size = 262150, upload-time = "2025-11-18T13:33:20.644Z" }, + { url = "https://files.pythonhosted.org/packages/c5/71/9a9314df00f9326d78c1e5a910f520d599205907432d90d1c1b7a97aa4b1/coverage-7.12.0-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:91b810a163ccad2e43b1faa11d70d3cf4b6f3d83f9fd5f2df82a32d47b648e0d", size = 259763, upload-time = "2025-11-18T13:33:22.189Z" }, + { url = "https://files.pythonhosted.org/packages/10/34/01a0aceed13fbdf925876b9a15d50862eb8845454301fe3cdd1df08b2182/coverage-7.12.0-cp313-cp313t-musllinux_1_2_riscv64.whl", hash = "sha256:40c867af715f22592e0d0fb533a33a71ec9e0f73a6945f722a0c85c8c1cbe3a2", size = 258653, upload-time = "2025-11-18T13:33:24.239Z" }, + { url = "https://files.pythonhosted.org/packages/8d/04/81d8fd64928acf1574bbb0181f66901c6c1c6279c8ccf5f84259d2c68ae9/coverage-7.12.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:68b0d0a2d84f333de875666259dadf28cc67858bc8fd8b3f1eae84d3c2bec455", size = 260856, upload-time = "2025-11-18T13:33:26.365Z" }, + { url = "https://files.pythonhosted.org/packages/f2/76/fa2a37bfaeaf1f766a2d2360a25a5297d4fb567098112f6517475eee120b/coverage-7.12.0-cp313-cp313t-win32.whl", hash = "sha256:73f9e7fbd51a221818fd11b7090eaa835a353ddd59c236c57b2199486b116c6d", size = 220936, upload-time = "2025-11-18T13:33:28.165Z" }, + { url = "https://files.pythonhosted.org/packages/f9/52/60f64d932d555102611c366afb0eb434b34266b1d9266fc2fe18ab641c47/coverage-7.12.0-cp313-cp313t-win_amd64.whl", hash = "sha256:24cff9d1f5743f67db7ba46ff284018a6e9aeb649b67aa1e70c396aa1b7cb23c", size = 222001, upload-time = "2025-11-18T13:33:29.656Z" }, + { url = "https://files.pythonhosted.org/packages/77/df/c303164154a5a3aea7472bf323b7c857fed93b26618ed9fc5c2955566bb0/coverage-7.12.0-cp313-cp313t-win_arm64.whl", hash = "sha256:c87395744f5c77c866d0f5a43d97cc39e17c7f1cb0115e54a2fe67ca75c5d14d", size = 220273, upload-time = "2025-11-18T13:33:31.415Z" }, + { url = "https://files.pythonhosted.org/packages/bf/2e/fc12db0883478d6e12bbd62d481210f0c8daf036102aa11434a0c5755825/coverage-7.12.0-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:a1c59b7dc169809a88b21a936eccf71c3895a78f5592051b1af8f4d59c2b4f92", size = 217777, upload-time = "2025-11-18T13:33:32.86Z" }, + { url = "https://files.pythonhosted.org/packages/1f/c1/ce3e525d223350c6ec16b9be8a057623f54226ef7f4c2fee361ebb6a02b8/coverage-7.12.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:8787b0f982e020adb732b9f051f3e49dd5054cebbc3f3432061278512a2b1360", size = 218100, upload-time = "2025-11-18T13:33:34.532Z" }, + { url = "https://files.pythonhosted.org/packages/15/87/113757441504aee3808cb422990ed7c8bcc2d53a6779c66c5adef0942939/coverage-7.12.0-cp314-cp314-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:5ea5a9f7dc8877455b13dd1effd3202e0bca72f6f3ab09f9036b1bcf728f69ac", size = 249151, upload-time = "2025-11-18T13:33:36.135Z" }, + { url = "https://files.pythonhosted.org/packages/d9/1d/9529d9bd44049b6b05bb319c03a3a7e4b0a8a802d28fa348ad407e10706d/coverage-7.12.0-cp314-cp314-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:fdba9f15849534594f60b47c9a30bc70409b54947319a7c4fd0e8e3d8d2f355d", size = 251667, upload-time = "2025-11-18T13:33:37.996Z" }, + { url = "https://files.pythonhosted.org/packages/11/bb/567e751c41e9c03dc29d3ce74b8c89a1e3396313e34f255a2a2e8b9ebb56/coverage-7.12.0-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:a00594770eb715854fb1c57e0dea08cce6720cfbc531accdb9850d7c7770396c", size = 253003, upload-time = "2025-11-18T13:33:39.553Z" }, + { url = "https://files.pythonhosted.org/packages/e4/b3/c2cce2d8526a02fb9e9ca14a263ca6fc074449b33a6afa4892838c903528/coverage-7.12.0-cp314-cp314-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:5560c7e0d82b42eb1951e4f68f071f8017c824ebfd5a6ebe42c60ac16c6c2434", size = 249185, upload-time = "2025-11-18T13:33:42.086Z" }, + { url = "https://files.pythonhosted.org/packages/0e/a7/967f93bb66e82c9113c66a8d0b65ecf72fc865adfba5a145f50c7af7e58d/coverage-7.12.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:d6c2e26b481c9159c2773a37947a9718cfdc58893029cdfb177531793e375cfc", size = 251025, upload-time = "2025-11-18T13:33:43.634Z" }, + { url = "https://files.pythonhosted.org/packages/b9/b2/f2f6f56337bc1af465d5b2dc1ee7ee2141b8b9272f3bf6213fcbc309a836/coverage-7.12.0-cp314-cp314-musllinux_1_2_i686.whl", hash = "sha256:6e1a8c066dabcde56d5d9fed6a66bc19a2883a3fe051f0c397a41fc42aedd4cc", size = 248979, upload-time = "2025-11-18T13:33:46.04Z" }, + { url = "https://files.pythonhosted.org/packages/f4/7a/bf4209f45a4aec09d10a01a57313a46c0e0e8f4c55ff2965467d41a92036/coverage-7.12.0-cp314-cp314-musllinux_1_2_riscv64.whl", hash = "sha256:f7ba9da4726e446d8dd8aae5a6cd872511184a5d861de80a86ef970b5dacce3e", size = 248800, upload-time = "2025-11-18T13:33:47.546Z" }, + { url = "https://files.pythonhosted.org/packages/b8/b7/1e01b8696fb0521810f60c5bbebf699100d6754183e6cc0679bf2ed76531/coverage-7.12.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:e0f483ab4f749039894abaf80c2f9e7ed77bbf3c737517fb88c8e8e305896a17", size = 250460, upload-time = "2025-11-18T13:33:49.537Z" }, + { url = "https://files.pythonhosted.org/packages/71/ae/84324fb9cb46c024760e706353d9b771a81b398d117d8c1fe010391c186f/coverage-7.12.0-cp314-cp314-win32.whl", hash = "sha256:76336c19a9ef4a94b2f8dc79f8ac2da3f193f625bb5d6f51a328cd19bfc19933", size = 220533, upload-time = "2025-11-18T13:33:51.16Z" }, + { url = "https://files.pythonhosted.org/packages/e2/71/1033629deb8460a8f97f83e6ac4ca3b93952e2b6f826056684df8275e015/coverage-7.12.0-cp314-cp314-win_amd64.whl", hash = "sha256:7c1059b600aec6ef090721f8f633f60ed70afaffe8ecab85b59df748f24b31fe", size = 221348, upload-time = "2025-11-18T13:33:52.776Z" }, + { url = "https://files.pythonhosted.org/packages/0a/5f/ac8107a902f623b0c251abdb749be282dc2ab61854a8a4fcf49e276fce2f/coverage-7.12.0-cp314-cp314-win_arm64.whl", hash = "sha256:172cf3a34bfef42611963e2b661302a8931f44df31629e5b1050567d6b90287d", size = 219922, upload-time = "2025-11-18T13:33:54.316Z" }, + { url = "https://files.pythonhosted.org/packages/79/6e/f27af2d4da367f16077d21ef6fe796c874408219fa6dd3f3efe7751bd910/coverage-7.12.0-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:aa7d48520a32cb21c7a9b31f81799e8eaec7239db36c3b670be0fa2403828d1d", size = 218511, upload-time = "2025-11-18T13:33:56.343Z" }, + { url = "https://files.pythonhosted.org/packages/67/dd/65fd874aa460c30da78f9d259400d8e6a4ef457d61ab052fd248f0050558/coverage-7.12.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:90d58ac63bc85e0fb919f14d09d6caa63f35a5512a2205284b7816cafd21bb03", size = 218771, upload-time = "2025-11-18T13:33:57.966Z" }, + { url = "https://files.pythonhosted.org/packages/55/e0/7c6b71d327d8068cb79c05f8f45bf1b6145f7a0de23bbebe63578fe5240a/coverage-7.12.0-cp314-cp314t-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:ca8ecfa283764fdda3eae1bdb6afe58bf78c2c3ec2b2edcb05a671f0bba7b3f9", size = 260151, upload-time = "2025-11-18T13:33:59.597Z" }, + { url = "https://files.pythonhosted.org/packages/49/ce/4697457d58285b7200de6b46d606ea71066c6e674571a946a6ea908fb588/coverage-7.12.0-cp314-cp314t-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:874fe69a0785d96bd066059cd4368022cebbec1a8958f224f0016979183916e6", size = 262257, upload-time = "2025-11-18T13:34:01.166Z" }, + { url = "https://files.pythonhosted.org/packages/2f/33/acbc6e447aee4ceba88c15528dbe04a35fb4d67b59d393d2e0d6f1e242c1/coverage-7.12.0-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:5b3c889c0b8b283a24d721a9eabc8ccafcfc3aebf167e4cd0d0e23bf8ec4e339", size = 264671, upload-time = "2025-11-18T13:34:02.795Z" }, + { url = "https://files.pythonhosted.org/packages/87/ec/e2822a795c1ed44d569980097be839c5e734d4c0c1119ef8e0a073496a30/coverage-7.12.0-cp314-cp314t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:8bb5b894b3ec09dcd6d3743229dc7f2c42ef7787dc40596ae04c0edda487371e", size = 259231, upload-time = "2025-11-18T13:34:04.397Z" }, + { url = "https://files.pythonhosted.org/packages/72/c5/a7ec5395bb4a49c9b7ad97e63f0c92f6bf4a9e006b1393555a02dae75f16/coverage-7.12.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:79a44421cd5fba96aa57b5e3b5a4d3274c449d4c622e8f76882d76635501fd13", size = 262137, upload-time = "2025-11-18T13:34:06.068Z" }, + { url = "https://files.pythonhosted.org/packages/67/0c/02c08858b764129f4ecb8e316684272972e60777ae986f3865b10940bdd6/coverage-7.12.0-cp314-cp314t-musllinux_1_2_i686.whl", hash = "sha256:33baadc0efd5c7294f436a632566ccc1f72c867f82833eb59820ee37dc811c6f", size = 259745, upload-time = "2025-11-18T13:34:08.04Z" }, + { url = "https://files.pythonhosted.org/packages/5a/04/4fd32b7084505f3829a8fe45c1a74a7a728cb251aaadbe3bec04abcef06d/coverage-7.12.0-cp314-cp314t-musllinux_1_2_riscv64.whl", hash = "sha256:c406a71f544800ef7e9e0000af706b88465f3573ae8b8de37e5f96c59f689ad1", size = 258570, upload-time = "2025-11-18T13:34:09.676Z" }, + { url = "https://files.pythonhosted.org/packages/48/35/2365e37c90df4f5342c4fa202223744119fe31264ee2924f09f074ea9b6d/coverage-7.12.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:e71bba6a40883b00c6d571599b4627f50c360b3d0d02bfc658168936be74027b", size = 260899, upload-time = "2025-11-18T13:34:11.259Z" }, + { url = "https://files.pythonhosted.org/packages/05/56/26ab0464ca733fa325e8e71455c58c1c374ce30f7c04cebb88eabb037b18/coverage-7.12.0-cp314-cp314t-win32.whl", hash = "sha256:9157a5e233c40ce6613dead4c131a006adfda70e557b6856b97aceed01b0e27a", size = 221313, upload-time = "2025-11-18T13:34:12.863Z" }, + { url = "https://files.pythonhosted.org/packages/da/1c/017a3e1113ed34d998b27d2c6dba08a9e7cb97d362f0ec988fcd873dcf81/coverage-7.12.0-cp314-cp314t-win_amd64.whl", hash = "sha256:e84da3a0fd233aeec797b981c51af1cabac74f9bd67be42458365b30d11b5291", size = 222423, upload-time = "2025-11-18T13:34:15.14Z" }, + { url = "https://files.pythonhosted.org/packages/4c/36/bcc504fdd5169301b52568802bb1b9cdde2e27a01d39fbb3b4b508ab7c2c/coverage-7.12.0-cp314-cp314t-win_arm64.whl", hash = "sha256:01d24af36fedda51c2b1aca56e4330a3710f83b02a5ff3743a6b015ffa7c9384", size = 220459, upload-time = "2025-11-18T13:34:17.222Z" }, + { url = "https://files.pythonhosted.org/packages/ce/a3/43b749004e3c09452e39bb56347a008f0a0668aad37324a99b5c8ca91d9e/coverage-7.12.0-py3-none-any.whl", hash = "sha256:159d50c0b12e060b15ed3d39f87ed43d4f7f7ad40b8a534f4dd331adbb51104a", size = 209503, upload-time = "2025-11-18T13:34:18.892Z" }, +] + +[package.optional-dependencies] +toml = [ + { name = "tomli", marker = "python_full_version >= '3.10' and python_full_version <= '3.11'" }, +] + +[[package]] +name = "cryptography" +version = "46.0.3" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "cffi", version = "1.17.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.9' and platform_python_implementation != 'PyPy'" }, + { name = "cffi", version = "2.0.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.9' and platform_python_implementation != 'PyPy'" }, + { name = "typing-extensions", version = "4.13.2", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.9'" }, + { name = "typing-extensions", version = "4.15.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.9' and python_full_version < '3.11'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/9f/33/c00162f49c0e2fe8064a62cb92b93e50c74a72bc370ab92f86112b33ff62/cryptography-46.0.3.tar.gz", hash = "sha256:a8b17438104fed022ce745b362294d9ce35b4c2e45c1d958ad4a4b019285f4a1", size = 749258, upload-time = "2025-10-15T23:18:31.74Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/1c/67/38769ca6b65f07461eb200e85fc1639b438bdc667be02cf7f2cd6a64601c/cryptography-46.0.3-cp311-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:09859af8466b69bc3c27bdf4f5d84a665e0f7ab5088412e9e2ec49758eca5cbc", size = 4296667, upload-time = "2025-10-15T23:16:54.369Z" }, + { url = "https://files.pythonhosted.org/packages/5c/49/498c86566a1d80e978b42f0d702795f69887005548c041636df6ae1ca64c/cryptography-46.0.3-cp311-abi3-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:01ca9ff2885f3acc98c29f1860552e37f6d7c7d013d7334ff2a9de43a449315d", size = 4450807, upload-time = "2025-10-15T23:16:56.414Z" }, + { url = "https://files.pythonhosted.org/packages/4b/0a/863a3604112174c8624a2ac3c038662d9e59970c7f926acdcfaed8d61142/cryptography-46.0.3-cp311-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:6eae65d4c3d33da080cff9c4ab1f711b15c1d9760809dad6ea763f3812d254cb", size = 4299615, upload-time = "2025-10-15T23:16:58.442Z" }, + { url = "https://files.pythonhosted.org/packages/64/02/b73a533f6b64a69f3cd3872acb6ebc12aef924d8d103133bb3ea750dc703/cryptography-46.0.3-cp311-abi3-manylinux_2_28_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:e5bf0ed4490068a2e72ac03d786693adeb909981cc596425d09032d372bcc849", size = 4016800, upload-time = "2025-10-15T23:17:00.378Z" }, + { url = "https://files.pythonhosted.org/packages/25/d5/16e41afbfa450cde85a3b7ec599bebefaef16b5c6ba4ec49a3532336ed72/cryptography-46.0.3-cp311-abi3-manylinux_2_28_ppc64le.whl", hash = "sha256:5ecfccd2329e37e9b7112a888e76d9feca2347f12f37918facbb893d7bb88ee8", size = 4984707, upload-time = "2025-10-15T23:17:01.98Z" }, + { url = "https://files.pythonhosted.org/packages/c9/56/e7e69b427c3878352c2fb9b450bd0e19ed552753491d39d7d0a2f5226d41/cryptography-46.0.3-cp311-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:a2c0cd47381a3229c403062f764160d57d4d175e022c1df84e168c6251a22eec", size = 4482541, upload-time = "2025-10-15T23:17:04.078Z" }, + { url = "https://files.pythonhosted.org/packages/78/f6/50736d40d97e8483172f1bb6e698895b92a223dba513b0ca6f06b2365339/cryptography-46.0.3-cp311-abi3-manylinux_2_34_aarch64.whl", hash = "sha256:549e234ff32571b1f4076ac269fcce7a808d3bf98b76c8dd560e42dbc66d7d91", size = 4299464, upload-time = "2025-10-15T23:17:05.483Z" }, + { url = "https://files.pythonhosted.org/packages/00/de/d8e26b1a855f19d9994a19c702fa2e93b0456beccbcfe437eda00e0701f2/cryptography-46.0.3-cp311-abi3-manylinux_2_34_ppc64le.whl", hash = "sha256:c0a7bb1a68a5d3471880e264621346c48665b3bf1c3759d682fc0864c540bd9e", size = 4950838, upload-time = "2025-10-15T23:17:07.425Z" }, + { url = "https://files.pythonhosted.org/packages/8f/29/798fc4ec461a1c9e9f735f2fc58741b0daae30688f41b2497dcbc9ed1355/cryptography-46.0.3-cp311-abi3-manylinux_2_34_x86_64.whl", hash = "sha256:10b01676fc208c3e6feeb25a8b83d81767e8059e1fe86e1dc62d10a3018fa926", size = 4481596, upload-time = "2025-10-15T23:17:09.343Z" }, + { url = "https://files.pythonhosted.org/packages/15/8d/03cd48b20a573adfff7652b76271078e3045b9f49387920e7f1f631d125e/cryptography-46.0.3-cp311-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:0abf1ffd6e57c67e92af68330d05760b7b7efb243aab8377e583284dbab72c71", size = 4426782, upload-time = "2025-10-15T23:17:11.22Z" }, + { url = "https://files.pythonhosted.org/packages/fa/b1/ebacbfe53317d55cf33165bda24c86523497a6881f339f9aae5c2e13e57b/cryptography-46.0.3-cp311-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:a04bee9ab6a4da801eb9b51f1b708a1b5b5c9eb48c03f74198464c66f0d344ac", size = 4698381, upload-time = "2025-10-15T23:17:12.829Z" }, + { url = "https://files.pythonhosted.org/packages/73/dc/9aa866fbdbb95b02e7f9d086f1fccfeebf8953509b87e3f28fff927ff8a0/cryptography-46.0.3-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:c8daeb2d2174beb4575b77482320303f3d39b8e81153da4f0fb08eb5fe86a6c5", size = 4288728, upload-time = "2025-10-15T23:17:21.527Z" }, + { url = "https://files.pythonhosted.org/packages/c5/fd/bc1daf8230eaa075184cbbf5f8cd00ba9db4fd32d63fb83da4671b72ed8a/cryptography-46.0.3-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:39b6755623145ad5eff1dab323f4eae2a32a77a7abef2c5089a04a3d04366715", size = 4435078, upload-time = "2025-10-15T23:17:23.042Z" }, + { url = "https://files.pythonhosted.org/packages/82/98/d3bd5407ce4c60017f8ff9e63ffee4200ab3e23fe05b765cab805a7db008/cryptography-46.0.3-cp314-cp314t-manylinux_2_28_aarch64.whl", hash = "sha256:db391fa7c66df6762ee3f00c95a89e6d428f4d60e7abc8328f4fe155b5ac6e54", size = 4293460, upload-time = "2025-10-15T23:17:24.885Z" }, + { url = "https://files.pythonhosted.org/packages/26/e9/e23e7900983c2b8af7a08098db406cf989d7f09caea7897e347598d4cd5b/cryptography-46.0.3-cp314-cp314t-manylinux_2_28_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:78a97cf6a8839a48c49271cdcbd5cf37ca2c1d6b7fdd86cc864f302b5e9bf459", size = 3995237, upload-time = "2025-10-15T23:17:26.449Z" }, + { url = "https://files.pythonhosted.org/packages/91/15/af68c509d4a138cfe299d0d7ddb14afba15233223ebd933b4bbdbc7155d3/cryptography-46.0.3-cp314-cp314t-manylinux_2_28_ppc64le.whl", hash = "sha256:dfb781ff7eaa91a6f7fd41776ec37c5853c795d3b358d4896fdbb5df168af422", size = 4967344, upload-time = "2025-10-15T23:17:28.06Z" }, + { url = "https://files.pythonhosted.org/packages/ca/e3/8643d077c53868b681af077edf6b3cb58288b5423610f21c62aadcbe99f4/cryptography-46.0.3-cp314-cp314t-manylinux_2_28_x86_64.whl", hash = "sha256:6f61efb26e76c45c4a227835ddeae96d83624fb0d29eb5df5b96e14ed1a0afb7", size = 4466564, upload-time = "2025-10-15T23:17:29.665Z" }, + { url = "https://files.pythonhosted.org/packages/0e/43/c1e8726fa59c236ff477ff2b5dc071e54b21e5a1e51aa2cee1676f1c986f/cryptography-46.0.3-cp314-cp314t-manylinux_2_34_aarch64.whl", hash = "sha256:23b1a8f26e43f47ceb6d6a43115f33a5a37d57df4ea0ca295b780ae8546e8044", size = 4292415, upload-time = "2025-10-15T23:17:31.686Z" }, + { url = "https://files.pythonhosted.org/packages/42/f9/2f8fefdb1aee8a8e3256a0568cffc4e6d517b256a2fe97a029b3f1b9fe7e/cryptography-46.0.3-cp314-cp314t-manylinux_2_34_ppc64le.whl", hash = "sha256:b419ae593c86b87014b9be7396b385491ad7f320bde96826d0dd174459e54665", size = 4931457, upload-time = "2025-10-15T23:17:33.478Z" }, + { url = "https://files.pythonhosted.org/packages/79/30/9b54127a9a778ccd6d27c3da7563e9f2d341826075ceab89ae3b41bf5be2/cryptography-46.0.3-cp314-cp314t-manylinux_2_34_x86_64.whl", hash = "sha256:50fc3343ac490c6b08c0cf0d704e881d0d660be923fd3076db3e932007e726e3", size = 4466074, upload-time = "2025-10-15T23:17:35.158Z" }, + { url = "https://files.pythonhosted.org/packages/ac/68/b4f4a10928e26c941b1b6a179143af9f4d27d88fe84a6a3c53592d2e76bf/cryptography-46.0.3-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:22d7e97932f511d6b0b04f2bfd818d73dcd5928db509460aaf48384778eb6d20", size = 4420569, upload-time = "2025-10-15T23:17:37.188Z" }, + { url = "https://files.pythonhosted.org/packages/a3/49/3746dab4c0d1979888f125226357d3262a6dd40e114ac29e3d2abdf1ec55/cryptography-46.0.3-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:d55f3dffadd674514ad19451161118fd010988540cee43d8bc20675e775925de", size = 4681941, upload-time = "2025-10-15T23:17:39.236Z" }, + { url = "https://files.pythonhosted.org/packages/27/32/b68d27471372737054cbd34c84981f9edbc24fe67ca225d389799614e27f/cryptography-46.0.3-cp38-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:4b7387121ac7d15e550f5cb4a43aef2559ed759c35df7336c402bb8275ac9683", size = 4294089, upload-time = "2025-10-15T23:17:48.269Z" }, + { url = "https://files.pythonhosted.org/packages/26/42/fa8389d4478368743e24e61eea78846a0006caffaf72ea24a15159215a14/cryptography-46.0.3-cp38-abi3-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:15ab9b093e8f09daab0f2159bb7e47532596075139dd74365da52ecc9cb46c5d", size = 4440029, upload-time = "2025-10-15T23:17:49.837Z" }, + { url = "https://files.pythonhosted.org/packages/5f/eb/f483db0ec5ac040824f269e93dd2bd8a21ecd1027e77ad7bdf6914f2fd80/cryptography-46.0.3-cp38-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:46acf53b40ea38f9c6c229599a4a13f0d46a6c3fa9ef19fc1a124d62e338dfa0", size = 4297222, upload-time = "2025-10-15T23:17:51.357Z" }, + { url = "https://files.pythonhosted.org/packages/fd/cf/da9502c4e1912cb1da3807ea3618a6829bee8207456fbbeebc361ec38ba3/cryptography-46.0.3-cp38-abi3-manylinux_2_28_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:10ca84c4668d066a9878890047f03546f3ae0a6b8b39b697457b7757aaf18dbc", size = 4012280, upload-time = "2025-10-15T23:17:52.964Z" }, + { url = "https://files.pythonhosted.org/packages/6b/8f/9adb86b93330e0df8b3dcf03eae67c33ba89958fc2e03862ef1ac2b42465/cryptography-46.0.3-cp38-abi3-manylinux_2_28_ppc64le.whl", hash = "sha256:36e627112085bb3b81b19fed209c05ce2a52ee8b15d161b7c643a7d5a88491f3", size = 4978958, upload-time = "2025-10-15T23:17:54.965Z" }, + { url = "https://files.pythonhosted.org/packages/d1/a0/5fa77988289c34bdb9f913f5606ecc9ada1adb5ae870bd0d1054a7021cc4/cryptography-46.0.3-cp38-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:1000713389b75c449a6e979ffc7dcc8ac90b437048766cef052d4d30b8220971", size = 4473714, upload-time = "2025-10-15T23:17:56.754Z" }, + { url = "https://files.pythonhosted.org/packages/14/e5/fc82d72a58d41c393697aa18c9abe5ae1214ff6f2a5c18ac470f92777895/cryptography-46.0.3-cp38-abi3-manylinux_2_34_aarch64.whl", hash = "sha256:b02cf04496f6576afffef5ddd04a0cb7d49cf6be16a9059d793a30b035f6b6ac", size = 4296970, upload-time = "2025-10-15T23:17:58.588Z" }, + { url = "https://files.pythonhosted.org/packages/78/06/5663ed35438d0b09056973994f1aec467492b33bd31da36e468b01ec1097/cryptography-46.0.3-cp38-abi3-manylinux_2_34_ppc64le.whl", hash = "sha256:71e842ec9bc7abf543b47cf86b9a743baa95f4677d22baa4c7d5c69e49e9bc04", size = 4940236, upload-time = "2025-10-15T23:18:00.897Z" }, + { url = "https://files.pythonhosted.org/packages/fc/59/873633f3f2dcd8a053b8dd1d38f783043b5fce589c0f6988bf55ef57e43e/cryptography-46.0.3-cp38-abi3-manylinux_2_34_x86_64.whl", hash = "sha256:402b58fc32614f00980b66d6e56a5b4118e6cb362ae8f3fda141ba4689bd4506", size = 4472642, upload-time = "2025-10-15T23:18:02.749Z" }, + { url = "https://files.pythonhosted.org/packages/3d/39/8e71f3930e40f6877737d6f69248cf74d4e34b886a3967d32f919cc50d3b/cryptography-46.0.3-cp38-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:ef639cb3372f69ec44915fafcd6698b6cc78fbe0c2ea41be867f6ed612811963", size = 4423126, upload-time = "2025-10-15T23:18:04.85Z" }, + { url = "https://files.pythonhosted.org/packages/cd/c7/f65027c2810e14c3e7268353b1681932b87e5a48e65505d8cc17c99e36ae/cryptography-46.0.3-cp38-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:3b51b8ca4f1c6453d8829e1eb7299499ca7f313900dd4d89a24b8b87c0a780d4", size = 4686573, upload-time = "2025-10-15T23:18:06.908Z" }, + { url = "https://files.pythonhosted.org/packages/da/38/f59940ec4ee91e93d3311f7532671a5cef5570eb04a144bf203b58552d11/cryptography-46.0.3-pp311-pypy311_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:191bb60a7be5e6f54e30ba16fdfae78ad3a342a0599eb4193ba88e3f3d6e185b", size = 4243992, upload-time = "2025-10-15T23:18:18.695Z" }, + { url = "https://files.pythonhosted.org/packages/b0/0c/35b3d92ddebfdfda76bb485738306545817253d0a3ded0bfe80ef8e67aa5/cryptography-46.0.3-pp311-pypy311_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:c70cc23f12726be8f8bc72e41d5065d77e4515efae3690326764ea1b07845cfb", size = 4409944, upload-time = "2025-10-15T23:18:20.597Z" }, + { url = "https://files.pythonhosted.org/packages/99/55/181022996c4063fc0e7666a47049a1ca705abb9c8a13830f074edb347495/cryptography-46.0.3-pp311-pypy311_pp73-manylinux_2_34_aarch64.whl", hash = "sha256:9394673a9f4de09e28b5356e7fff97d778f8abad85c9d5ac4a4b7e25a0de7717", size = 4242957, upload-time = "2025-10-15T23:18:22.18Z" }, + { url = "https://files.pythonhosted.org/packages/ba/af/72cd6ef29f9c5f731251acadaeb821559fe25f10852f44a63374c9ca08c1/cryptography-46.0.3-pp311-pypy311_pp73-manylinux_2_34_x86_64.whl", hash = "sha256:94cd0549accc38d1494e1f8de71eca837d0509d0d44bf11d158524b0e12cebf9", size = 4409447, upload-time = "2025-10-15T23:18:24.209Z" }, +] + +[[package]] +name = "cycler" +version = "0.12.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/a9/95/a3dbbb5028f35eafb79008e7522a75244477d2838f38cbb722248dabc2a8/cycler-0.12.1.tar.gz", hash = "sha256:88bb128f02ba341da8ef447245a9e138fae777f6a23943da4540077d3601eb1c", size = 7615, upload-time = "2023-10-07T05:32:18.335Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/e7/05/c19819d5e3d95294a6f5947fb9b9629efb316b96de511b418c53d245aae6/cycler-0.12.1-py3-none-any.whl", hash = "sha256:85cef7cff222d8644161529808465972e51340599459b8ac3ccbac5a854e0d30", size = 8321, upload-time = "2023-10-07T05:32:16.783Z" }, +] + +[[package]] +name = "debugpy" +version = "1.8.17" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/15/ad/71e708ff4ca377c4230530d6a7aa7992592648c122a2cd2b321cf8b35a76/debugpy-1.8.17.tar.gz", hash = "sha256:fd723b47a8c08892b1a16b2c6239a8b96637c62a59b94bb5dab4bac592a58a8e", size = 1644129, upload-time = "2025-09-17T16:33:20.633Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/38/36/b57c6e818d909f6e59c0182252921cf435e0951126a97e11de37e72ab5e1/debugpy-1.8.17-cp310-cp310-macosx_15_0_x86_64.whl", hash = "sha256:c41d2ce8bbaddcc0009cc73f65318eedfa3dbc88a8298081deb05389f1ab5542", size = 2098021, upload-time = "2025-09-17T16:33:22.556Z" }, + { url = "https://files.pythonhosted.org/packages/be/01/0363c7efdd1e9febd090bb13cee4fb1057215b157b2979a4ca5ccb678217/debugpy-1.8.17-cp310-cp310-manylinux_2_34_x86_64.whl", hash = "sha256:1440fd514e1b815edd5861ca394786f90eb24960eb26d6f7200994333b1d79e3", size = 3087399, upload-time = "2025-09-17T16:33:24.292Z" }, + { url = "https://files.pythonhosted.org/packages/79/bc/4a984729674aa9a84856650438b9665f9a1d5a748804ac6f37932ce0d4aa/debugpy-1.8.17-cp310-cp310-win32.whl", hash = "sha256:3a32c0af575749083d7492dc79f6ab69f21b2d2ad4cd977a958a07d5865316e4", size = 5230292, upload-time = "2025-09-17T16:33:26.137Z" }, + { url = "https://files.pythonhosted.org/packages/5d/19/2b9b3092d0cf81a5aa10c86271999453030af354d1a5a7d6e34c574515d7/debugpy-1.8.17-cp310-cp310-win_amd64.whl", hash = "sha256:a3aad0537cf4d9c1996434be68c6c9a6d233ac6f76c2a482c7803295b4e4f99a", size = 5261885, upload-time = "2025-09-17T16:33:27.592Z" }, + { url = "https://files.pythonhosted.org/packages/d8/53/3af72b5c159278c4a0cf4cffa518675a0e73bdb7d1cac0239b815502d2ce/debugpy-1.8.17-cp311-cp311-macosx_15_0_universal2.whl", hash = "sha256:d3fce3f0e3de262a3b67e69916d001f3e767661c6e1ee42553009d445d1cd840", size = 2207154, upload-time = "2025-09-17T16:33:29.457Z" }, + { url = "https://files.pythonhosted.org/packages/8f/6d/204f407df45600e2245b4a39860ed4ba32552330a0b3f5f160ae4cc30072/debugpy-1.8.17-cp311-cp311-manylinux_2_34_x86_64.whl", hash = "sha256:c6bdf134457ae0cac6fb68205776be635d31174eeac9541e1d0c062165c6461f", size = 3170322, upload-time = "2025-09-17T16:33:30.837Z" }, + { url = "https://files.pythonhosted.org/packages/f2/13/1b8f87d39cf83c6b713de2620c31205299e6065622e7dd37aff4808dd410/debugpy-1.8.17-cp311-cp311-win32.whl", hash = "sha256:e79a195f9e059edfe5d8bf6f3749b2599452d3e9380484cd261f6b7cd2c7c4da", size = 5155078, upload-time = "2025-09-17T16:33:33.331Z" }, + { url = "https://files.pythonhosted.org/packages/c2/c5/c012c60a2922cc91caa9675d0ddfbb14ba59e1e36228355f41cab6483469/debugpy-1.8.17-cp311-cp311-win_amd64.whl", hash = "sha256:b532282ad4eca958b1b2d7dbcb2b7218e02cb934165859b918e3b6ba7772d3f4", size = 5179011, upload-time = "2025-09-17T16:33:35.711Z" }, + { url = "https://files.pythonhosted.org/packages/08/2b/9d8e65beb2751876c82e1aceb32f328c43ec872711fa80257c7674f45650/debugpy-1.8.17-cp312-cp312-macosx_15_0_universal2.whl", hash = "sha256:f14467edef672195c6f6b8e27ce5005313cb5d03c9239059bc7182b60c176e2d", size = 2549522, upload-time = "2025-09-17T16:33:38.466Z" }, + { url = "https://files.pythonhosted.org/packages/b4/78/eb0d77f02971c05fca0eb7465b18058ba84bd957062f5eec82f941ac792a/debugpy-1.8.17-cp312-cp312-manylinux_2_34_x86_64.whl", hash = "sha256:24693179ef9dfa20dca8605905a42b392be56d410c333af82f1c5dff807a64cc", size = 4309417, upload-time = "2025-09-17T16:33:41.299Z" }, + { url = "https://files.pythonhosted.org/packages/37/42/c40f1d8cc1fed1e75ea54298a382395b8b937d923fcf41ab0797a554f555/debugpy-1.8.17-cp312-cp312-win32.whl", hash = "sha256:6a4e9dacf2cbb60d2514ff7b04b4534b0139facbf2abdffe0639ddb6088e59cf", size = 5277130, upload-time = "2025-09-17T16:33:43.554Z" }, + { url = "https://files.pythonhosted.org/packages/72/22/84263b205baad32b81b36eac076de0cdbe09fe2d0637f5b32243dc7c925b/debugpy-1.8.17-cp312-cp312-win_amd64.whl", hash = "sha256:e8f8f61c518952fb15f74a302e068b48d9c4691768ade433e4adeea961993464", size = 5319053, upload-time = "2025-09-17T16:33:53.033Z" }, + { url = "https://files.pythonhosted.org/packages/50/76/597e5cb97d026274ba297af8d89138dfd9e695767ba0e0895edb20963f40/debugpy-1.8.17-cp313-cp313-macosx_15_0_universal2.whl", hash = "sha256:857c1dd5d70042502aef1c6d1c2801211f3ea7e56f75e9c335f434afb403e464", size = 2538386, upload-time = "2025-09-17T16:33:54.594Z" }, + { url = "https://files.pythonhosted.org/packages/5f/60/ce5c34fcdfec493701f9d1532dba95b21b2f6394147234dce21160bd923f/debugpy-1.8.17-cp313-cp313-manylinux_2_34_x86_64.whl", hash = "sha256:3bea3b0b12f3946e098cce9b43c3c46e317b567f79570c3f43f0b96d00788088", size = 4292100, upload-time = "2025-09-17T16:33:56.353Z" }, + { url = "https://files.pythonhosted.org/packages/e8/95/7873cf2146577ef71d2a20bf553f12df865922a6f87b9e8ee1df04f01785/debugpy-1.8.17-cp313-cp313-win32.whl", hash = "sha256:e34ee844c2f17b18556b5bbe59e1e2ff4e86a00282d2a46edab73fd7f18f4a83", size = 5277002, upload-time = "2025-09-17T16:33:58.231Z" }, + { url = "https://files.pythonhosted.org/packages/46/11/18c79a1cee5ff539a94ec4aa290c1c069a5580fd5cfd2fb2e282f8e905da/debugpy-1.8.17-cp313-cp313-win_amd64.whl", hash = "sha256:6c5cd6f009ad4fca8e33e5238210dc1e5f42db07d4b6ab21ac7ffa904a196420", size = 5319047, upload-time = "2025-09-17T16:34:00.586Z" }, + { url = "https://files.pythonhosted.org/packages/de/45/115d55b2a9da6de812696064ceb505c31e952c5d89c4ed1d9bb983deec34/debugpy-1.8.17-cp314-cp314-macosx_15_0_universal2.whl", hash = "sha256:045290c010bcd2d82bc97aa2daf6837443cd52f6328592698809b4549babcee1", size = 2536899, upload-time = "2025-09-17T16:34:02.657Z" }, + { url = "https://files.pythonhosted.org/packages/5a/73/2aa00c7f1f06e997ef57dc9b23d61a92120bec1437a012afb6d176585197/debugpy-1.8.17-cp314-cp314-manylinux_2_34_x86_64.whl", hash = "sha256:b69b6bd9dba6a03632534cdf67c760625760a215ae289f7489a452af1031fe1f", size = 4268254, upload-time = "2025-09-17T16:34:04.486Z" }, + { url = "https://files.pythonhosted.org/packages/86/b5/ed3e65c63c68a6634e3ba04bd10255c8e46ec16ebed7d1c79e4816d8a760/debugpy-1.8.17-cp314-cp314-win32.whl", hash = "sha256:5c59b74aa5630f3a5194467100c3b3d1c77898f9ab27e3f7dc5d40fc2f122670", size = 5277203, upload-time = "2025-09-17T16:34:06.65Z" }, + { url = "https://files.pythonhosted.org/packages/b0/26/394276b71c7538445f29e792f589ab7379ae70fd26ff5577dfde71158e96/debugpy-1.8.17-cp314-cp314-win_amd64.whl", hash = "sha256:893cba7bb0f55161de4365584b025f7064e1f88913551bcd23be3260b231429c", size = 5318493, upload-time = "2025-09-17T16:34:08.483Z" }, + { url = "https://files.pythonhosted.org/packages/5b/07/f2b5ccea27c7b97b3cc303c0b28f020ef2449d789ab093e984c66dc17e7b/debugpy-1.8.17-cp38-cp38-macosx_15_0_x86_64.whl", hash = "sha256:8deb4e31cd575c9f9370042876e078ca118117c1b5e1f22c32befcfbb6955f0c", size = 2098177, upload-time = "2025-09-17T16:34:10.229Z" }, + { url = "https://files.pythonhosted.org/packages/c7/48/cee2a26ef95a28770ae80d2bbac839b7704f839fb9deee7d6324bd43d0cb/debugpy-1.8.17-cp38-cp38-manylinux_2_34_x86_64.whl", hash = "sha256:b75868b675949a96ab51abc114c7163f40ff0d8f7d6d5fd63f8932fd38e9c6d7", size = 3169313, upload-time = "2025-09-17T16:34:12.385Z" }, + { url = "https://files.pythonhosted.org/packages/6a/f2/a01ee8f20faad5f7d089383cb3d5def425789e765088037d5557d8e14d64/debugpy-1.8.17-cp38-cp38-win32.whl", hash = "sha256:17e456da14848d618662354e1dccfd5e5fb75deec3d1d48dc0aa0baacda55860", size = 5234508, upload-time = "2025-09-17T16:34:14.454Z" }, + { url = "https://files.pythonhosted.org/packages/c5/a7/6bd5440287cffa866ad4edabc6137b9805470dce0dbd331741adacc28312/debugpy-1.8.17-cp38-cp38-win_amd64.whl", hash = "sha256:e851beb536a427b5df8aa7d0c7835b29a13812f41e46292ff80b2ef77327355a", size = 5267243, upload-time = "2025-09-17T16:34:16.388Z" }, + { url = "https://files.pythonhosted.org/packages/16/ee/0e9a08878f1b525f85c4e47723ea1f17b1bad69672c84fa910210604e3f8/debugpy-1.8.17-cp39-cp39-macosx_15_0_x86_64.whl", hash = "sha256:f2ac8055a0c4a09b30b931100996ba49ef334c6947e7ae365cdd870416d7513e", size = 2099309, upload-time = "2025-09-17T16:34:17.935Z" }, + { url = "https://files.pythonhosted.org/packages/b3/b5/0327b27efd8826ca92a256a3a250e80ccad6a834b4d12bd9cbd491f2da03/debugpy-1.8.17-cp39-cp39-manylinux_2_34_x86_64.whl", hash = "sha256:eaa85bce251feca8e4c87ce3b954aba84b8c645b90f0e6a515c00394a9f5c0e7", size = 3080100, upload-time = "2025-09-17T16:34:19.885Z" }, + { url = "https://files.pythonhosted.org/packages/0f/f0/2e210fa8884d2ab452fa31ffd1402e13010eaacfa67063d0565d97ac9e0e/debugpy-1.8.17-cp39-cp39-win32.whl", hash = "sha256:b13eea5587e44f27f6c48588b5ad56dcb74a4f3a5f89250443c94587f3eb2ea1", size = 5231016, upload-time = "2025-09-17T16:34:21.887Z" }, + { url = "https://files.pythonhosted.org/packages/d6/9b/6a45fb1553d09b618c9441bcbbf72b651246b83b5618b2f95c0e4cf1b8bd/debugpy-1.8.17-cp39-cp39-win_amd64.whl", hash = "sha256:bb1bbf92317e1f35afcf3ef0450219efb3afe00be79d8664b250ac0933b9015f", size = 5262778, upload-time = "2025-09-17T16:34:24.026Z" }, + { url = "https://files.pythonhosted.org/packages/b0/d0/89247ec250369fc76db477720a26b2fce7ba079ff1380e4ab4529d2fe233/debugpy-1.8.17-py2.py3-none-any.whl", hash = "sha256:60c7dca6571efe660ccb7a9508d73ca14b8796c4ed484c2002abba714226cfef", size = 5283210, upload-time = "2025-09-17T16:34:25.835Z" }, +] + +[[package]] +name = "decorator" +version = "5.2.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/43/fa/6d96a0978d19e17b68d634497769987b16c8f4cd0a7a05048bec693caa6b/decorator-5.2.1.tar.gz", hash = "sha256:65f266143752f734b0a7cc83c46f4618af75b8c5911b00ccb61d0ac9b6da0360", size = 56711, upload-time = "2025-02-24T04:41:34.073Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/4e/8c/f3147f5c4b73e7550fe5f9352eaa956ae838d5c51eb58e7a25b9f3e2643b/decorator-5.2.1-py3-none-any.whl", hash = "sha256:d316bb415a2d9e2d2b3abcc4084c6502fc09240e292cd76a76afc106a1c8e04a", size = 9190, upload-time = "2025-02-24T04:41:32.565Z" }, +] + +[[package]] +name = "defusedxml" +version = "0.7.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/0f/d5/c66da9b79e5bdb124974bfe172b4daf3c984ebd9c2a06e2b8a4dc7331c72/defusedxml-0.7.1.tar.gz", hash = "sha256:1bb3032db185915b62d7c6209c5a8792be6a32ab2fedacc84e01b52c51aa3e69", size = 75520, upload-time = "2021-03-08T10:59:26.269Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/07/6c/aa3f2f849e01cb6a001cd8554a88d4c77c5c1a31c95bdf1cf9301e6d9ef4/defusedxml-0.7.1-py2.py3-none-any.whl", hash = "sha256:a352e7e428770286cc899e2542b6cdaedb2b4953ff269a210103ec58f6198a61", size = 25604, upload-time = "2021-03-08T10:59:24.45Z" }, +] + +[[package]] +name = "docutils" +version = "0.20.1" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version < '3.9'", +] +sdist = { url = "https://files.pythonhosted.org/packages/1f/53/a5da4f2c5739cf66290fac1431ee52aff6851c7c8ffd8264f13affd7bcdd/docutils-0.20.1.tar.gz", hash = "sha256:f08a4e276c3a1583a86dce3e34aba3fe04d02bba2dd51ed16106244e8a923e3b", size = 2058365, upload-time = "2023-05-16T23:39:19.748Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/26/87/f238c0670b94533ac0353a4e2a1a771a0cc73277b88bff23d3ae35a256c1/docutils-0.20.1-py3-none-any.whl", hash = "sha256:96f387a2c5562db4476f09f13bbab2192e764cac08ebbf3a34a95d9b1e4a59d6", size = 572666, upload-time = "2023-05-16T23:39:15.976Z" }, +] + +[[package]] +name = "docutils" +version = "0.21.2" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version >= '3.14'", + "python_full_version >= '3.11' and python_full_version < '3.14'", + "python_full_version == '3.10.*'", + "python_full_version == '3.9.*'", +] +sdist = { url = "https://files.pythonhosted.org/packages/ae/ed/aefcc8cd0ba62a0560c3c18c33925362d46c6075480bfa4df87b28e169a9/docutils-0.21.2.tar.gz", hash = "sha256:3a6b18732edf182daa3cd12775bbb338cf5691468f91eeeb109deff6ebfa986f", size = 2204444, upload-time = "2024-04-23T18:57:18.24Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/8f/d7/9322c609343d929e75e7e5e6255e614fcc67572cfd083959cdef3b7aad79/docutils-0.21.2-py3-none-any.whl", hash = "sha256:dafca5b9e384f0e419294eb4d2ff9fa826435bf15f15b7bd45723e8ad76811b2", size = 587408, upload-time = "2024-04-23T18:57:14.835Z" }, +] + +[[package]] +name = "exceptiongroup" +version = "1.3.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "typing-extensions", version = "4.13.2", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.9'" }, + { name = "typing-extensions", version = "4.15.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.9' and python_full_version < '3.11'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/50/79/66800aadf48771f6b62f7eb014e352e5d06856655206165d775e675a02c9/exceptiongroup-1.3.1.tar.gz", hash = "sha256:8b412432c6055b0b7d14c310000ae93352ed6754f70fa8f7c34141f91c4e3219", size = 30371, upload-time = "2025-11-21T23:01:54.787Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/8a/0e/97c33bf5009bdbac74fd2beace167cab3f978feb69cc36f1ef79360d6c4e/exceptiongroup-1.3.1-py3-none-any.whl", hash = "sha256:a7a39a3bd276781e98394987d3a5701d0c4edffb633bb7a5144577f82c773598", size = 16740, upload-time = "2025-11-21T23:01:53.443Z" }, +] + +[[package]] +name = "executing" +version = "2.2.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/cc/28/c14e053b6762b1044f34a13aab6859bbf40456d37d23aa286ac24cfd9a5d/executing-2.2.1.tar.gz", hash = "sha256:3632cc370565f6648cc328b32435bd120a1e4ebb20c77e3fdde9a13cd1e533c4", size = 1129488, upload-time = "2025-09-01T09:48:10.866Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/c1/ea/53f2148663b321f21b5a606bd5f191517cf40b7072c0497d3c92c4a13b1e/executing-2.2.1-py2.py3-none-any.whl", hash = "sha256:760643d3452b4d777d295bb167ccc74c64a81df23fb5e08eff250c425a4b2017", size = 28317, upload-time = "2025-09-01T09:48:08.5Z" }, +] + +[[package]] +name = "fastjsonschema" +version = "2.21.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/20/b5/23b216d9d985a956623b6bd12d4086b60f0059b27799f23016af04a74ea1/fastjsonschema-2.21.2.tar.gz", hash = "sha256:b1eb43748041c880796cd077f1a07c3d94e93ae84bba5ed36800a33554ae05de", size = 374130, upload-time = "2025-08-14T18:49:36.666Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/cb/a8/20d0723294217e47de6d9e2e40fd4a9d2f7c4b6ef974babd482a59743694/fastjsonschema-2.21.2-py3-none-any.whl", hash = "sha256:1c797122d0a86c5cace2e54bf4e819c36223b552017172f32c5c024a6b77e463", size = 24024, upload-time = "2025-08-14T18:49:34.776Z" }, +] + +[[package]] +name = "fonttools" +version = "4.57.0" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version < '3.9'", +] +sdist = { url = "https://files.pythonhosted.org/packages/03/2d/a9a0b6e3a0cf6bd502e64fc16d894269011930cabfc89aee20d1635b1441/fonttools-4.57.0.tar.gz", hash = "sha256:727ece10e065be2f9dd239d15dd5d60a66e17eac11aea47d447f9f03fdbc42de", size = 3492448, upload-time = "2025-04-03T11:07:13.898Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/db/17/3ddfd1881878b3f856065130bb603f5922e81ae8a4eb53bce0ea78f765a8/fonttools-4.57.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:babe8d1eb059a53e560e7bf29f8e8f4accc8b6cfb9b5fd10e485bde77e71ef41", size = 2756260, upload-time = "2025-04-03T11:05:28.582Z" }, + { url = "https://files.pythonhosted.org/packages/26/2b/6957890c52c030b0bf9e0add53e5badab4682c6ff024fac9a332bb2ae063/fonttools-4.57.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:81aa97669cd726349eb7bd43ca540cf418b279ee3caba5e2e295fb4e8f841c02", size = 2284691, upload-time = "2025-04-03T11:05:31.526Z" }, + { url = "https://files.pythonhosted.org/packages/cc/8e/c043b4081774e5eb06a834cedfdb7d432b4935bc8c4acf27207bdc34dfc4/fonttools-4.57.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f0e9618630edd1910ad4f07f60d77c184b2f572c8ee43305ea3265675cbbfe7e", size = 4566077, upload-time = "2025-04-03T11:05:33.559Z" }, + { url = "https://files.pythonhosted.org/packages/59/bc/e16ae5d9eee6c70830ce11d1e0b23d6018ddfeb28025fda092cae7889c8b/fonttools-4.57.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:34687a5d21f1d688d7d8d416cb4c5b9c87fca8a1797ec0d74b9fdebfa55c09ab", size = 4608729, upload-time = "2025-04-03T11:05:35.49Z" }, + { url = "https://files.pythonhosted.org/packages/25/13/e557bf10bb38e4e4c436d3a9627aadf691bc7392ae460910447fda5fad2b/fonttools-4.57.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:69ab81b66ebaa8d430ba56c7a5f9abe0183afefd3a2d6e483060343398b13fb1", size = 4759646, upload-time = "2025-04-03T11:05:37.963Z" }, + { url = "https://files.pythonhosted.org/packages/bc/c9/5e2952214d4a8e31026bf80beb18187199b7001e60e99a6ce19773249124/fonttools-4.57.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:d639397de852f2ccfb3134b152c741406752640a266d9c1365b0f23d7b88077f", size = 4941652, upload-time = "2025-04-03T11:05:40.089Z" }, + { url = "https://files.pythonhosted.org/packages/df/04/e80242b3d9ec91a1f785d949edc277a13ecfdcfae744de4b170df9ed77d8/fonttools-4.57.0-cp310-cp310-win32.whl", hash = "sha256:cc066cb98b912f525ae901a24cd381a656f024f76203bc85f78fcc9e66ae5aec", size = 2159432, upload-time = "2025-04-03T11:05:41.754Z" }, + { url = "https://files.pythonhosted.org/packages/33/ba/e858cdca275daf16e03c0362aa43734ea71104c3b356b2100b98543dba1b/fonttools-4.57.0-cp310-cp310-win_amd64.whl", hash = "sha256:7a64edd3ff6a7f711a15bd70b4458611fb240176ec11ad8845ccbab4fe6745db", size = 2203869, upload-time = "2025-04-03T11:05:43.712Z" }, + { url = "https://files.pythonhosted.org/packages/81/1f/e67c99aa3c6d3d2f93d956627e62a57ae0d35dc42f26611ea2a91053f6d6/fonttools-4.57.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:3871349303bdec958360eedb619169a779956503ffb4543bb3e6211e09b647c4", size = 2757392, upload-time = "2025-04-03T11:05:45.715Z" }, + { url = "https://files.pythonhosted.org/packages/aa/f1/f75770d0ddc67db504850898d96d75adde238c35313409bfcd8db4e4a5fe/fonttools-4.57.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:c59375e85126b15a90fcba3443eaac58f3073ba091f02410eaa286da9ad80ed8", size = 2285609, upload-time = "2025-04-03T11:05:47.977Z" }, + { url = "https://files.pythonhosted.org/packages/f5/d3/bc34e4953cb204bae0c50b527307dce559b810e624a733351a654cfc318e/fonttools-4.57.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:967b65232e104f4b0f6370a62eb33089e00024f2ce143aecbf9755649421c683", size = 4873292, upload-time = "2025-04-03T11:05:49.921Z" }, + { url = "https://files.pythonhosted.org/packages/41/b8/d5933559303a4ab18c799105f4c91ee0318cc95db4a2a09e300116625e7a/fonttools-4.57.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:39acf68abdfc74e19de7485f8f7396fa4d2418efea239b7061d6ed6a2510c746", size = 4902503, upload-time = "2025-04-03T11:05:52.17Z" }, + { url = "https://files.pythonhosted.org/packages/32/13/acb36bfaa316f481153ce78de1fa3926a8bad42162caa3b049e1afe2408b/fonttools-4.57.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:9d077f909f2343daf4495ba22bb0e23b62886e8ec7c109ee8234bdbd678cf344", size = 5077351, upload-time = "2025-04-03T11:05:54.162Z" }, + { url = "https://files.pythonhosted.org/packages/b5/23/6d383a2ca83b7516d73975d8cca9d81a01acdcaa5e4db8579e4f3de78518/fonttools-4.57.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:46370ac47a1e91895d40e9ad48effbe8e9d9db1a4b80888095bc00e7beaa042f", size = 5275067, upload-time = "2025-04-03T11:05:57.375Z" }, + { url = "https://files.pythonhosted.org/packages/bc/ca/31b8919c6da0198d5d522f1d26c980201378c087bdd733a359a1e7485769/fonttools-4.57.0-cp311-cp311-win32.whl", hash = "sha256:ca2aed95855506b7ae94e8f1f6217b7673c929e4f4f1217bcaa236253055cb36", size = 2158263, upload-time = "2025-04-03T11:05:59.567Z" }, + { url = "https://files.pythonhosted.org/packages/13/4c/de2612ea2216eb45cfc8eb91a8501615dd87716feaf5f8fb65cbca576289/fonttools-4.57.0-cp311-cp311-win_amd64.whl", hash = "sha256:17168a4670bbe3775f3f3f72d23ee786bd965395381dfbb70111e25e81505b9d", size = 2204968, upload-time = "2025-04-03T11:06:02.16Z" }, + { url = "https://files.pythonhosted.org/packages/cb/98/d4bc42d43392982eecaaca117d79845734d675219680cd43070bb001bc1f/fonttools-4.57.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:889e45e976c74abc7256d3064aa7c1295aa283c6bb19810b9f8b604dfe5c7f31", size = 2751824, upload-time = "2025-04-03T11:06:03.782Z" }, + { url = "https://files.pythonhosted.org/packages/1a/62/7168030eeca3742fecf45f31e63b5ef48969fa230a672216b805f1d61548/fonttools-4.57.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:0425c2e052a5f1516c94e5855dbda706ae5a768631e9fcc34e57d074d1b65b92", size = 2283072, upload-time = "2025-04-03T11:06:05.533Z" }, + { url = "https://files.pythonhosted.org/packages/5d/82/121a26d9646f0986ddb35fbbaf58ef791c25b59ecb63ffea2aab0099044f/fonttools-4.57.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:44c26a311be2ac130f40a96769264809d3b0cb297518669db437d1cc82974888", size = 4788020, upload-time = "2025-04-03T11:06:07.249Z" }, + { url = "https://files.pythonhosted.org/packages/5b/26/e0f2fb662e022d565bbe280a3cfe6dafdaabf58889ff86fdef2d31ff1dde/fonttools-4.57.0-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:84c41ba992df5b8d680b89fd84c6a1f2aca2b9f1ae8a67400c8930cd4ea115f6", size = 4859096, upload-time = "2025-04-03T11:06:09.469Z" }, + { url = "https://files.pythonhosted.org/packages/9e/44/9075e323347b1891cdece4b3f10a3b84a8f4c42a7684077429d9ce842056/fonttools-4.57.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:ea1e9e43ca56b0c12440a7c689b1350066595bebcaa83baad05b8b2675129d98", size = 4964356, upload-time = "2025-04-03T11:06:11.294Z" }, + { url = "https://files.pythonhosted.org/packages/48/28/caa8df32743462fb966be6de6a79d7f30393859636d7732e82efa09fbbb4/fonttools-4.57.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:84fd56c78d431606332a0627c16e2a63d243d0d8b05521257d77c6529abe14d8", size = 5226546, upload-time = "2025-04-03T11:06:13.6Z" }, + { url = "https://files.pythonhosted.org/packages/f6/46/95ab0f0d2e33c5b1a4fc1c0efe5e286ba9359602c0a9907adb1faca44175/fonttools-4.57.0-cp312-cp312-win32.whl", hash = "sha256:f4376819c1c778d59e0a31db5dc6ede854e9edf28bbfa5b756604727f7f800ac", size = 2146776, upload-time = "2025-04-03T11:06:15.643Z" }, + { url = "https://files.pythonhosted.org/packages/06/5d/1be5424bb305880e1113631f49a55ea7c7da3a5fe02608ca7c16a03a21da/fonttools-4.57.0-cp312-cp312-win_amd64.whl", hash = "sha256:57e30241524879ea10cdf79c737037221f77cc126a8cdc8ff2c94d4a522504b9", size = 2193956, upload-time = "2025-04-03T11:06:17.534Z" }, + { url = "https://files.pythonhosted.org/packages/e9/2f/11439f3af51e4bb75ac9598c29f8601aa501902dcedf034bdc41f47dd799/fonttools-4.57.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:408ce299696012d503b714778d89aa476f032414ae57e57b42e4b92363e0b8ef", size = 2739175, upload-time = "2025-04-03T11:06:19.583Z" }, + { url = "https://files.pythonhosted.org/packages/25/52/677b55a4c0972dc3820c8dba20a29c358197a78229daa2ea219fdb19e5d5/fonttools-4.57.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:bbceffc80aa02d9e8b99f2a7491ed8c4a783b2fc4020119dc405ca14fb5c758c", size = 2276583, upload-time = "2025-04-03T11:06:21.753Z" }, + { url = "https://files.pythonhosted.org/packages/64/79/184555f8fa77b827b9460a4acdbbc0b5952bb6915332b84c615c3a236826/fonttools-4.57.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f022601f3ee9e1f6658ed6d184ce27fa5216cee5b82d279e0f0bde5deebece72", size = 4766437, upload-time = "2025-04-03T11:06:23.521Z" }, + { url = "https://files.pythonhosted.org/packages/f8/ad/c25116352f456c0d1287545a7aa24e98987b6d99c5b0456c4bd14321f20f/fonttools-4.57.0-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4dea5893b58d4637ffa925536462ba626f8a1b9ffbe2f5c272cdf2c6ebadb817", size = 4838431, upload-time = "2025-04-03T11:06:25.423Z" }, + { url = "https://files.pythonhosted.org/packages/53/ae/398b2a833897297797a44f519c9af911c2136eb7aa27d3f1352c6d1129fa/fonttools-4.57.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:dff02c5c8423a657c550b48231d0a48d7e2b2e131088e55983cfe74ccc2c7cc9", size = 4951011, upload-time = "2025-04-03T11:06:27.41Z" }, + { url = "https://files.pythonhosted.org/packages/b7/5d/7cb31c4bc9ffb9a2bbe8b08f8f53bad94aeb158efad75da645b40b62cb73/fonttools-4.57.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:767604f244dc17c68d3e2dbf98e038d11a18abc078f2d0f84b6c24571d9c0b13", size = 5205679, upload-time = "2025-04-03T11:06:29.804Z" }, + { url = "https://files.pythonhosted.org/packages/4c/e4/6934513ec2c4d3d69ca1bc3bd34d5c69dafcbf68c15388dd3bb062daf345/fonttools-4.57.0-cp313-cp313-win32.whl", hash = "sha256:8e2e12d0d862f43d51e5afb8b9751c77e6bec7d2dc00aad80641364e9df5b199", size = 2144833, upload-time = "2025-04-03T11:06:31.737Z" }, + { url = "https://files.pythonhosted.org/packages/c4/0d/2177b7fdd23d017bcfb702fd41e47d4573766b9114da2fddbac20dcc4957/fonttools-4.57.0-cp313-cp313-win_amd64.whl", hash = "sha256:f1d6bc9c23356908db712d282acb3eebd4ae5ec6d8b696aa40342b1d84f8e9e3", size = 2190799, upload-time = "2025-04-03T11:06:34.784Z" }, + { url = "https://files.pythonhosted.org/packages/8a/3f/c16dbbec7221783f37dcc2022d5a55f0d704ffc9feef67930f6eb517e8ce/fonttools-4.57.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:9d57b4e23ebbe985125d3f0cabbf286efa191ab60bbadb9326091050d88e8213", size = 2753756, upload-time = "2025-04-03T11:06:36.875Z" }, + { url = "https://files.pythonhosted.org/packages/48/9f/5b4a3d6aed5430b159dd3494bb992d4e45102affa3725f208e4f0aedc6a3/fonttools-4.57.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:579ba873d7f2a96f78b2e11028f7472146ae181cae0e4d814a37a09e93d5c5cc", size = 2283179, upload-time = "2025-04-03T11:06:39.095Z" }, + { url = "https://files.pythonhosted.org/packages/17/b2/4e887b674938b4c3848029a4134ac90dd8653ea80b4f464fa1edeae37f25/fonttools-4.57.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6e3e1ec10c29bae0ea826b61f265ec5c858c5ba2ce2e69a71a62f285cf8e4595", size = 4647139, upload-time = "2025-04-03T11:06:41.315Z" }, + { url = "https://files.pythonhosted.org/packages/a5/0e/b6314a09a4d561aaa7e09de43fa700917be91e701f07df6178865962666c/fonttools-4.57.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a1968f2a2003c97c4ce6308dc2498d5fd4364ad309900930aa5a503c9851aec8", size = 4691211, upload-time = "2025-04-03T11:06:43.566Z" }, + { url = "https://files.pythonhosted.org/packages/bf/1d/b9f4b70d165c25f5c9aee61eb6ae90b0e9b5787b2c0a45e4f3e50a839274/fonttools-4.57.0-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:aff40f8ac6763d05c2c8f6d240c6dac4bb92640a86d9b0c3f3fff4404f34095c", size = 4873755, upload-time = "2025-04-03T11:06:45.457Z" }, + { url = "https://files.pythonhosted.org/packages/3b/fa/a731c8f42ae2c6761d1c22bd3c90241d5b2b13cabb70598abc74a828b51f/fonttools-4.57.0-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:d07f1b64008e39fceae7aa99e38df8385d7d24a474a8c9872645c4397b674481", size = 5070072, upload-time = "2025-04-03T11:06:47.853Z" }, + { url = "https://files.pythonhosted.org/packages/1f/1e/6a988230109a2ba472e5de0a4c3936d49718cfc4b700b6bad53eca414bcf/fonttools-4.57.0-cp38-cp38-win32.whl", hash = "sha256:51d8482e96b28fb28aa8e50b5706f3cee06de85cbe2dce80dbd1917ae22ec5a6", size = 1484098, upload-time = "2025-04-03T11:06:50.167Z" }, + { url = "https://files.pythonhosted.org/packages/dc/7a/2b3666e8c13d035adf656a8ae391380656144760353c97f74747c64fd3e5/fonttools-4.57.0-cp38-cp38-win_amd64.whl", hash = "sha256:03290e818782e7edb159474144fca11e36a8ed6663d1fcbd5268eb550594fd8e", size = 1529536, upload-time = "2025-04-03T11:06:52.468Z" }, + { url = "https://files.pythonhosted.org/packages/d2/c7/3bddafbb95447f6fbabdd0b399bf468649321fd4029e356b4f6bd70fbc1b/fonttools-4.57.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:7339e6a3283e4b0ade99cade51e97cde3d54cd6d1c3744459e886b66d630c8b3", size = 2758942, upload-time = "2025-04-03T11:06:54.679Z" }, + { url = "https://files.pythonhosted.org/packages/d4/a2/8dd7771022e365c90e428b1607174c3297d5c0a2cc2cf4cdccb2221945b7/fonttools-4.57.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:05efceb2cb5f6ec92a4180fcb7a64aa8d3385fd49cfbbe459350229d1974f0b1", size = 2285959, upload-time = "2025-04-03T11:06:56.792Z" }, + { url = "https://files.pythonhosted.org/packages/58/5a/2fd29c5e38b14afe1fae7d472373e66688e7c7a98554252f3cf44371e033/fonttools-4.57.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a97bb05eb24637714a04dee85bdf0ad1941df64fe3b802ee4ac1c284a5f97b7c", size = 4571677, upload-time = "2025-04-03T11:06:59.002Z" }, + { url = "https://files.pythonhosted.org/packages/bf/30/b77cf81923f1a67ff35d6765a9db4718c0688eb8466c464c96a23a2e28d4/fonttools-4.57.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:541cb48191a19ceb1a2a4b90c1fcebd22a1ff7491010d3cf840dd3a68aebd654", size = 4616644, upload-time = "2025-04-03T11:07:01.238Z" }, + { url = "https://files.pythonhosted.org/packages/06/33/376605898d8d553134144dff167506a49694cb0e0cf684c14920fbc1e99f/fonttools-4.57.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:cdef9a056c222d0479a1fdb721430f9efd68268014c54e8166133d2643cb05d9", size = 4761314, upload-time = "2025-04-03T11:07:03.162Z" }, + { url = "https://files.pythonhosted.org/packages/48/e4/e0e48f5bae04bc1a1c6b4fcd7d1ca12b29f1fe74221534b7ff83ed0db8fe/fonttools-4.57.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:3cf97236b192a50a4bf200dc5ba405aa78d4f537a2c6e4c624bb60466d5b03bd", size = 4945563, upload-time = "2025-04-03T11:07:05.313Z" }, + { url = "https://files.pythonhosted.org/packages/61/98/2dacfc6d70f2d93bde1bbf814286be343cb17f53057130ad3b843144dd00/fonttools-4.57.0-cp39-cp39-win32.whl", hash = "sha256:e952c684274a7714b3160f57ec1d78309f955c6335c04433f07d36c5eb27b1f9", size = 2159997, upload-time = "2025-04-03T11:07:07.467Z" }, + { url = "https://files.pythonhosted.org/packages/93/fa/e61cc236f40d504532d2becf90c297bfed8e40abc0c8b08375fbb83eff29/fonttools-4.57.0-cp39-cp39-win_amd64.whl", hash = "sha256:a2a722c0e4bfd9966a11ff55c895c817158fcce1b2b6700205a376403b546ad9", size = 2204508, upload-time = "2025-04-03T11:07:09.632Z" }, + { url = "https://files.pythonhosted.org/packages/90/27/45f8957c3132917f91aaa56b700bcfc2396be1253f685bd5c68529b6f610/fonttools-4.57.0-py3-none-any.whl", hash = "sha256:3122c604a675513c68bd24c6a8f9091f1c2376d18e8f5fe5a101746c81b3e98f", size = 1093605, upload-time = "2025-04-03T11:07:11.341Z" }, +] + +[[package]] +name = "fonttools" +version = "4.60.1" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version == '3.9.*'", +] +sdist = { url = "https://files.pythonhosted.org/packages/4b/42/97a13e47a1e51a5a7142475bbcf5107fe3a68fc34aef331c897d5fb98ad0/fonttools-4.60.1.tar.gz", hash = "sha256:ef00af0439ebfee806b25f24c8f92109157ff3fac5731dc7867957812e87b8d9", size = 3559823, upload-time = "2025-09-29T21:13:27.129Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/26/70/03e9d89a053caff6ae46053890eba8e4a5665a7c5638279ed4492e6d4b8b/fonttools-4.60.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:9a52f254ce051e196b8fe2af4634c2d2f02c981756c6464dc192f1b6050b4e28", size = 2810747, upload-time = "2025-09-29T21:10:59.653Z" }, + { url = "https://files.pythonhosted.org/packages/6f/41/449ad5aff9670ab0df0f61ee593906b67a36d7e0b4d0cd7fa41ac0325bf5/fonttools-4.60.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:c7420a2696a44650120cdd269a5d2e56a477e2bfa9d95e86229059beb1c19e15", size = 2346909, upload-time = "2025-09-29T21:11:02.882Z" }, + { url = "https://files.pythonhosted.org/packages/9a/18/e5970aa96c8fad1cb19a9479cc3b7602c0c98d250fcdc06a5da994309c50/fonttools-4.60.1-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ee0c0b3b35b34f782afc673d503167157094a16f442ace7c6c5e0ca80b08f50c", size = 4864572, upload-time = "2025-09-29T21:11:05.096Z" }, + { url = "https://files.pythonhosted.org/packages/ce/20/9b2b4051b6ec6689480787d506b5003f72648f50972a92d04527a456192c/fonttools-4.60.1-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:282dafa55f9659e8999110bd8ed422ebe1c8aecd0dc396550b038e6c9a08b8ea", size = 4794635, upload-time = "2025-09-29T21:11:08.651Z" }, + { url = "https://files.pythonhosted.org/packages/10/52/c791f57347c1be98f8345e3dca4ac483eb97666dd7c47f3059aeffab8b59/fonttools-4.60.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:4ba4bd646e86de16160f0fb72e31c3b9b7d0721c3e5b26b9fa2fc931dfdb2652", size = 4843878, upload-time = "2025-09-29T21:11:10.893Z" }, + { url = "https://files.pythonhosted.org/packages/69/e9/35c24a8d01644cee8c090a22fad34d5b61d1e0a8ecbc9945ad785ebf2e9e/fonttools-4.60.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:0b0835ed15dd5b40d726bb61c846a688f5b4ce2208ec68779bc81860adb5851a", size = 4954555, upload-time = "2025-09-29T21:11:13.24Z" }, + { url = "https://files.pythonhosted.org/packages/f7/86/fb1e994971be4bdfe3a307de6373ef69a9df83fb66e3faa9c8114893d4cc/fonttools-4.60.1-cp310-cp310-win32.whl", hash = "sha256:1525796c3ffe27bb6268ed2a1bb0dcf214d561dfaf04728abf01489eb5339dce", size = 2232019, upload-time = "2025-09-29T21:11:15.73Z" }, + { url = "https://files.pythonhosted.org/packages/40/84/62a19e2bd56f0e9fb347486a5b26376bade4bf6bbba64dda2c103bd08c94/fonttools-4.60.1-cp310-cp310-win_amd64.whl", hash = "sha256:268ecda8ca6cb5c4f044b1fb9b3b376e8cd1b361cef275082429dc4174907038", size = 2276803, upload-time = "2025-09-29T21:11:18.152Z" }, + { url = "https://files.pythonhosted.org/packages/ea/85/639aa9bface1537e0fb0f643690672dde0695a5bbbc90736bc571b0b1941/fonttools-4.60.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:7b4c32e232a71f63a5d00259ca3d88345ce2a43295bb049d21061f338124246f", size = 2831872, upload-time = "2025-09-29T21:11:20.329Z" }, + { url = "https://files.pythonhosted.org/packages/6b/47/3c63158459c95093be9618794acb1067b3f4d30dcc5c3e8114b70e67a092/fonttools-4.60.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:3630e86c484263eaac71d117085d509cbcf7b18f677906824e4bace598fb70d2", size = 2356990, upload-time = "2025-09-29T21:11:22.754Z" }, + { url = "https://files.pythonhosted.org/packages/94/dd/1934b537c86fcf99f9761823f1fc37a98fbd54568e8e613f29a90fed95a9/fonttools-4.60.1-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:5c1015318e4fec75dd4943ad5f6a206d9727adf97410d58b7e32ab644a807914", size = 5042189, upload-time = "2025-09-29T21:11:25.061Z" }, + { url = "https://files.pythonhosted.org/packages/d2/d2/9f4e4c4374dd1daa8367784e1bd910f18ba886db1d6b825b12edf6db3edc/fonttools-4.60.1-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:e6c58beb17380f7c2ea181ea11e7db8c0ceb474c9dd45f48e71e2cb577d146a1", size = 4978683, upload-time = "2025-09-29T21:11:27.693Z" }, + { url = "https://files.pythonhosted.org/packages/cc/c4/0fb2dfd1ecbe9a07954cc13414713ed1eab17b1c0214ef07fc93df234a47/fonttools-4.60.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:ec3681a0cb34c255d76dd9d865a55f260164adb9fa02628415cdc2d43ee2c05d", size = 5021372, upload-time = "2025-09-29T21:11:30.257Z" }, + { url = "https://files.pythonhosted.org/packages/0c/d5/495fc7ae2fab20223cc87179a8f50f40f9a6f821f271ba8301ae12bb580f/fonttools-4.60.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:f4b5c37a5f40e4d733d3bbaaef082149bee5a5ea3156a785ff64d949bd1353fa", size = 5132562, upload-time = "2025-09-29T21:11:32.737Z" }, + { url = "https://files.pythonhosted.org/packages/bc/fa/021dab618526323c744e0206b3f5c8596a2e7ae9aa38db5948a131123e83/fonttools-4.60.1-cp311-cp311-win32.whl", hash = "sha256:398447f3d8c0c786cbf1209711e79080a40761eb44b27cdafffb48f52bcec258", size = 2230288, upload-time = "2025-09-29T21:11:35.015Z" }, + { url = "https://files.pythonhosted.org/packages/bb/78/0e1a6d22b427579ea5c8273e1c07def2f325b977faaf60bb7ddc01456cb1/fonttools-4.60.1-cp311-cp311-win_amd64.whl", hash = "sha256:d066ea419f719ed87bc2c99a4a4bfd77c2e5949cb724588b9dd58f3fd90b92bf", size = 2278184, upload-time = "2025-09-29T21:11:37.434Z" }, + { url = "https://files.pythonhosted.org/packages/e3/f7/a10b101b7a6f8836a5adb47f2791f2075d044a6ca123f35985c42edc82d8/fonttools-4.60.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:7b0c6d57ab00dae9529f3faf187f2254ea0aa1e04215cf2f1a8ec277c96661bc", size = 2832953, upload-time = "2025-09-29T21:11:39.616Z" }, + { url = "https://files.pythonhosted.org/packages/ed/fe/7bd094b59c926acf2304d2151354ddbeb74b94812f3dc943c231db09cb41/fonttools-4.60.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:839565cbf14645952d933853e8ade66a463684ed6ed6c9345d0faf1f0e868877", size = 2352706, upload-time = "2025-09-29T21:11:41.826Z" }, + { url = "https://files.pythonhosted.org/packages/c0/ca/4bb48a26ed95a1e7eba175535fe5805887682140ee0a0d10a88e1de84208/fonttools-4.60.1-cp312-cp312-manylinux1_x86_64.manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:8177ec9676ea6e1793c8a084a90b65a9f778771998eb919d05db6d4b1c0b114c", size = 4923716, upload-time = "2025-09-29T21:11:43.893Z" }, + { url = "https://files.pythonhosted.org/packages/b8/9f/2cb82999f686c1d1ddf06f6ae1a9117a880adbec113611cc9d22b2fdd465/fonttools-4.60.1-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:996a4d1834524adbb423385d5a629b868ef9d774670856c63c9a0408a3063401", size = 4968175, upload-time = "2025-09-29T21:11:46.439Z" }, + { url = "https://files.pythonhosted.org/packages/18/79/be569699e37d166b78e6218f2cde8c550204f2505038cdd83b42edc469b9/fonttools-4.60.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:a46b2f450bc79e06ef3b6394f0c68660529ed51692606ad7f953fc2e448bc903", size = 4911031, upload-time = "2025-09-29T21:11:48.977Z" }, + { url = "https://files.pythonhosted.org/packages/cc/9f/89411cc116effaec5260ad519162f64f9c150e5522a27cbb05eb62d0c05b/fonttools-4.60.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:6ec722ee589e89a89f5b7574f5c45604030aa6ae24cb2c751e2707193b466fed", size = 5062966, upload-time = "2025-09-29T21:11:54.344Z" }, + { url = "https://files.pythonhosted.org/packages/62/a1/f888221934b5731d46cb9991c7a71f30cb1f97c0ef5fcf37f8da8fce6c8e/fonttools-4.60.1-cp312-cp312-win32.whl", hash = "sha256:b2cf105cee600d2de04ca3cfa1f74f1127f8455b71dbad02b9da6ec266e116d6", size = 2218750, upload-time = "2025-09-29T21:11:56.601Z" }, + { url = "https://files.pythonhosted.org/packages/88/8f/a55b5550cd33cd1028601df41acd057d4be20efa5c958f417b0c0613924d/fonttools-4.60.1-cp312-cp312-win_amd64.whl", hash = "sha256:992775c9fbe2cf794786fa0ffca7f09f564ba3499b8fe9f2f80bd7197db60383", size = 2267026, upload-time = "2025-09-29T21:11:58.852Z" }, + { url = "https://files.pythonhosted.org/packages/7c/5b/cdd2c612277b7ac7ec8c0c9bc41812c43dc7b2d5f2b0897e15fdf5a1f915/fonttools-4.60.1-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:6f68576bb4bbf6060c7ab047b1574a1ebe5c50a17de62830079967b211059ebb", size = 2825777, upload-time = "2025-09-29T21:12:01.22Z" }, + { url = "https://files.pythonhosted.org/packages/d6/8a/de9cc0540f542963ba5e8f3a1f6ad48fa211badc3177783b9d5cadf79b5d/fonttools-4.60.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:eedacb5c5d22b7097482fa834bda0dafa3d914a4e829ec83cdea2a01f8c813c4", size = 2348080, upload-time = "2025-09-29T21:12:03.785Z" }, + { url = "https://files.pythonhosted.org/packages/2d/8b/371ab3cec97ee3fe1126b3406b7abd60c8fec8975fd79a3c75cdea0c3d83/fonttools-4.60.1-cp313-cp313-manylinux1_x86_64.manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:b33a7884fabd72bdf5f910d0cf46be50dce86a0362a65cfc746a4168c67eb96c", size = 4903082, upload-time = "2025-09-29T21:12:06.382Z" }, + { url = "https://files.pythonhosted.org/packages/04/05/06b1455e4bc653fcb2117ac3ef5fa3a8a14919b93c60742d04440605d058/fonttools-4.60.1-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:2409d5fb7b55fd70f715e6d34e7a6e4f7511b8ad29a49d6df225ee76da76dd77", size = 4960125, upload-time = "2025-09-29T21:12:09.314Z" }, + { url = "https://files.pythonhosted.org/packages/8e/37/f3b840fcb2666f6cb97038793606bdd83488dca2d0b0fc542ccc20afa668/fonttools-4.60.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:c8651e0d4b3bdeda6602b85fdc2abbefc1b41e573ecb37b6779c4ca50753a199", size = 4901454, upload-time = "2025-09-29T21:12:11.931Z" }, + { url = "https://files.pythonhosted.org/packages/fd/9e/eb76f77e82f8d4a46420aadff12cec6237751b0fb9ef1de373186dcffb5f/fonttools-4.60.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:145daa14bf24824b677b9357c5e44fd8895c2a8f53596e1b9ea3496081dc692c", size = 5044495, upload-time = "2025-09-29T21:12:15.241Z" }, + { url = "https://files.pythonhosted.org/packages/f8/b3/cede8f8235d42ff7ae891bae8d619d02c8ac9fd0cfc450c5927a6200c70d/fonttools-4.60.1-cp313-cp313-win32.whl", hash = "sha256:2299df884c11162617a66b7c316957d74a18e3758c0274762d2cc87df7bc0272", size = 2217028, upload-time = "2025-09-29T21:12:17.96Z" }, + { url = "https://files.pythonhosted.org/packages/75/4d/b022c1577807ce8b31ffe055306ec13a866f2337ecee96e75b24b9b753ea/fonttools-4.60.1-cp313-cp313-win_amd64.whl", hash = "sha256:a3db56f153bd4c5c2b619ab02c5db5192e222150ce5a1bc10f16164714bc39ac", size = 2266200, upload-time = "2025-09-29T21:12:20.14Z" }, + { url = "https://files.pythonhosted.org/packages/9a/83/752ca11c1aa9a899b793a130f2e466b79ea0cf7279c8d79c178fc954a07b/fonttools-4.60.1-cp314-cp314-macosx_10_13_universal2.whl", hash = "sha256:a884aef09d45ba1206712c7dbda5829562d3fea7726935d3289d343232ecb0d3", size = 2822830, upload-time = "2025-09-29T21:12:24.406Z" }, + { url = "https://files.pythonhosted.org/packages/57/17/bbeab391100331950a96ce55cfbbff27d781c1b85ebafb4167eae50d9fe3/fonttools-4.60.1-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:8a44788d9d91df72d1a5eac49b31aeb887a5f4aab761b4cffc4196c74907ea85", size = 2345524, upload-time = "2025-09-29T21:12:26.819Z" }, + { url = "https://files.pythonhosted.org/packages/3d/2e/d4831caa96d85a84dd0da1d9f90d81cec081f551e0ea216df684092c6c97/fonttools-4.60.1-cp314-cp314-manylinux1_x86_64.manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:e852d9dda9f93ad3651ae1e3bb770eac544ec93c3807888798eccddf84596537", size = 4843490, upload-time = "2025-09-29T21:12:29.123Z" }, + { url = "https://files.pythonhosted.org/packages/49/13/5e2ea7c7a101b6fc3941be65307ef8df92cbbfa6ec4804032baf1893b434/fonttools-4.60.1-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:154cb6ee417e417bf5f7c42fe25858c9140c26f647c7347c06f0cc2d47eff003", size = 4944184, upload-time = "2025-09-29T21:12:31.414Z" }, + { url = "https://files.pythonhosted.org/packages/0c/2b/cf9603551c525b73fc47c52ee0b82a891579a93d9651ed694e4e2cd08bb8/fonttools-4.60.1-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:5664fd1a9ea7f244487ac8f10340c4e37664675e8667d6fee420766e0fb3cf08", size = 4890218, upload-time = "2025-09-29T21:12:33.936Z" }, + { url = "https://files.pythonhosted.org/packages/fd/2f/933d2352422e25f2376aae74f79eaa882a50fb3bfef3c0d4f50501267101/fonttools-4.60.1-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:583b7f8e3c49486e4d489ad1deacfb8d5be54a8ef34d6df824f6a171f8511d99", size = 4999324, upload-time = "2025-09-29T21:12:36.637Z" }, + { url = "https://files.pythonhosted.org/packages/38/99/234594c0391221f66216bc2c886923513b3399a148defaccf81dc3be6560/fonttools-4.60.1-cp314-cp314-win32.whl", hash = "sha256:66929e2ea2810c6533a5184f938502cfdaea4bc3efb7130d8cc02e1c1b4108d6", size = 2220861, upload-time = "2025-09-29T21:12:39.108Z" }, + { url = "https://files.pythonhosted.org/packages/3e/1d/edb5b23726dde50fc4068e1493e4fc7658eeefcaf75d4c5ffce067d07ae5/fonttools-4.60.1-cp314-cp314-win_amd64.whl", hash = "sha256:f3d5be054c461d6a2268831f04091dc82753176f6ea06dc6047a5e168265a987", size = 2270934, upload-time = "2025-09-29T21:12:41.339Z" }, + { url = "https://files.pythonhosted.org/packages/fb/da/1392aaa2170adc7071fe7f9cfd181a5684a7afcde605aebddf1fb4d76df5/fonttools-4.60.1-cp314-cp314t-macosx_10_13_universal2.whl", hash = "sha256:b6379e7546ba4ae4b18f8ae2b9bc5960936007a1c0e30b342f662577e8bc3299", size = 2894340, upload-time = "2025-09-29T21:12:43.774Z" }, + { url = "https://files.pythonhosted.org/packages/bf/a7/3b9f16e010d536ce567058b931a20b590d8f3177b2eda09edd92e392375d/fonttools-4.60.1-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:9d0ced62b59e0430b3690dbc5373df1c2aa7585e9a8ce38eff87f0fd993c5b01", size = 2375073, upload-time = "2025-09-29T21:12:46.437Z" }, + { url = "https://files.pythonhosted.org/packages/9b/b5/e9bcf51980f98e59bb5bb7c382a63c6f6cac0eec5f67de6d8f2322382065/fonttools-4.60.1-cp314-cp314t-manylinux1_x86_64.manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:875cb7764708b3132637f6c5fb385b16eeba0f7ac9fa45a69d35e09b47045801", size = 4849758, upload-time = "2025-09-29T21:12:48.694Z" }, + { url = "https://files.pythonhosted.org/packages/e3/dc/1d2cf7d1cba82264b2f8385db3f5960e3d8ce756b4dc65b700d2c496f7e9/fonttools-4.60.1-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:a184b2ea57b13680ab6d5fbde99ccef152c95c06746cb7718c583abd8f945ccc", size = 5085598, upload-time = "2025-09-29T21:12:51.081Z" }, + { url = "https://files.pythonhosted.org/packages/5d/4d/279e28ba87fb20e0c69baf72b60bbf1c4d873af1476806a7b5f2b7fac1ff/fonttools-4.60.1-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:026290e4ec76583881763fac284aca67365e0be9f13a7fb137257096114cb3bc", size = 4957603, upload-time = "2025-09-29T21:12:53.423Z" }, + { url = "https://files.pythonhosted.org/packages/78/d4/ff19976305e0c05aa3340c805475abb00224c954d3c65e82c0a69633d55d/fonttools-4.60.1-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:f0e8817c7d1a0c2eedebf57ef9a9896f3ea23324769a9a2061a80fe8852705ed", size = 4974184, upload-time = "2025-09-29T21:12:55.962Z" }, + { url = "https://files.pythonhosted.org/packages/63/22/8553ff6166f5cd21cfaa115aaacaa0dc73b91c079a8cfd54a482cbc0f4f5/fonttools-4.60.1-cp314-cp314t-win32.whl", hash = "sha256:1410155d0e764a4615774e5c2c6fc516259fe3eca5882f034eb9bfdbee056259", size = 2282241, upload-time = "2025-09-29T21:12:58.179Z" }, + { url = "https://files.pythonhosted.org/packages/8a/cb/fa7b4d148e11d5a72761a22e595344133e83a9507a4c231df972e657579b/fonttools-4.60.1-cp314-cp314t-win_amd64.whl", hash = "sha256:022beaea4b73a70295b688f817ddc24ed3e3418b5036ffcd5658141184ef0d0c", size = 2345760, upload-time = "2025-09-29T21:13:00.375Z" }, + { url = "https://files.pythonhosted.org/packages/a4/7f/1c9a6cc6e7374ab59bbe91cb3b8a65ce0907c59f8f35368bb3bf941bd458/fonttools-4.60.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:122e1a8ada290423c493491d002f622b1992b1ab0b488c68e31c413390dc7eb2", size = 2816178, upload-time = "2025-09-29T21:13:02.915Z" }, + { url = "https://files.pythonhosted.org/packages/ca/ac/acb4dcf1932566c0b57b5261f93a8b97cb3ebae08d07aff1288e7c9d7faa/fonttools-4.60.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:a140761c4ff63d0cb9256ac752f230460ee225ccef4ad8f68affc723c88e2036", size = 2349175, upload-time = "2025-09-29T21:13:05.432Z" }, + { url = "https://files.pythonhosted.org/packages/3e/ac/0b2f8d62c857adfe96551d56abbbc3d2eda2e4715a2e91c5eb7815bb38e1/fonttools-4.60.1-cp39-cp39-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:0eae96373e4b7c9e45d099d7a523444e3554360927225c1cdae221a58a45b856", size = 4840452, upload-time = "2025-09-29T21:13:08.679Z" }, + { url = "https://files.pythonhosted.org/packages/2d/e1/b2e2ae805f263507e050f1ebfc2fb3654124161f3bea466a1b2a4485c705/fonttools-4.60.1-cp39-cp39-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:596ecaca36367027d525b3b426d8a8208169d09edcf8c7506aceb3a38bfb55c7", size = 4774040, upload-time = "2025-09-29T21:13:11.424Z" }, + { url = "https://files.pythonhosted.org/packages/9d/91/05949ba6f757014f343632b142543576eb100aeb261c036b86e7d1fc50f0/fonttools-4.60.1-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:2ee06fc57512144d8b0445194c2da9f190f61ad51e230f14836286470c99f854", size = 4823746, upload-time = "2025-09-29T21:13:14.08Z" }, + { url = "https://files.pythonhosted.org/packages/1b/cf/db9a1bd8d835dc17f09104f83b9d8c078d7bebbaaa9bd41378bf10f025de/fonttools-4.60.1-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:b42d86938e8dda1cd9a1a87a6d82f1818eaf933348429653559a458d027446da", size = 4934001, upload-time = "2025-09-29T21:13:16.435Z" }, + { url = "https://files.pythonhosted.org/packages/87/4a/c58503524f7e6c73eb33b944f27535460e1050a58c99bd5b441242fcca86/fonttools-4.60.1-cp39-cp39-win32.whl", hash = "sha256:8b4eb332f9501cb1cd3d4d099374a1e1306783ff95489a1026bde9eb02ccc34a", size = 1499091, upload-time = "2025-09-29T21:13:19.072Z" }, + { url = "https://files.pythonhosted.org/packages/69/8f/3394936411aec5f26a1fdf8d7fdc1da7c276e0c627cd71b7b266b2431681/fonttools-4.60.1-cp39-cp39-win_amd64.whl", hash = "sha256:7473a8ed9ed09aeaa191301244a5a9dbe46fe0bf54f9d6cd21d83044c3321217", size = 1543835, upload-time = "2025-09-29T21:13:21.606Z" }, + { url = "https://files.pythonhosted.org/packages/c7/93/0dd45cd283c32dea1545151d8c3637b4b8c53cdb3a625aeb2885b184d74d/fonttools-4.60.1-py3-none-any.whl", hash = "sha256:906306ac7afe2156fcf0042173d6ebbb05416af70f6b370967b47f8f00103bbb", size = 1143175, upload-time = "2025-09-29T21:13:24.134Z" }, +] + +[[package]] +name = "fonttools" +version = "4.61.0" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version >= '3.14'", + "python_full_version >= '3.11' and python_full_version < '3.14'", + "python_full_version == '3.10.*'", +] +sdist = { url = "https://files.pythonhosted.org/packages/33/f9/0e84d593c0e12244150280a630999835a64f2852276161b62a0f98318de0/fonttools-4.61.0.tar.gz", hash = "sha256:ec520a1f0c7758d7a858a00f090c1745f6cde6a7c5e76fb70ea4044a15f712e7", size = 3561884, upload-time = "2025-11-28T17:05:49.491Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/29/f3/91bba2721fb173fc68e09d15b6ccf3ad4f83d127fbff579be7e5984888a6/fonttools-4.61.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:dc25a4a9c1225653e4431a9413d0381b1c62317b0f543bdcec24e1991f612f33", size = 2850151, upload-time = "2025-11-28T17:04:14.214Z" }, + { url = "https://files.pythonhosted.org/packages/f5/8c/a1691dec01038ac7e7bb3ab83300dcc5087b11d8f48640928c02a873eb92/fonttools-4.61.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:6b493c32d2555e9944ec1b911ea649ff8f01a649ad9cba6c118d6798e932b3f0", size = 2389769, upload-time = "2025-11-28T17:04:16.443Z" }, + { url = "https://files.pythonhosted.org/packages/2d/dd/5bb369a44319d92ba25612511eb8ed2a6fa75239979e0388907525626902/fonttools-4.61.0-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ad751319dc532a79bdf628b8439af167181b4210a0cd28a8935ca615d9fdd727", size = 4893189, upload-time = "2025-11-28T17:04:18.398Z" }, + { url = "https://files.pythonhosted.org/packages/5e/02/51373fa8846bd22bb54e5efb30a824b417b058083f775a194a432f21a45f/fonttools-4.61.0-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:2de14557d113faa5fb519f7f29c3abe4d69c17fe6a5a2595cc8cda7338029219", size = 4854415, upload-time = "2025-11-28T17:04:20.421Z" }, + { url = "https://files.pythonhosted.org/packages/8b/64/9cdbbb804577a7e6191448851c57e6a36eb02aa4bf6a9668b528c968e44e/fonttools-4.61.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:59587bbe455dbdf75354a9dbca1697a35a8903e01fab4248d6b98a17032cee52", size = 4870927, upload-time = "2025-11-28T17:04:22.625Z" }, + { url = "https://files.pythonhosted.org/packages/92/68/e40b22919dc96dc30a70b58fec609ab85112de950bdecfadf8dd478c5a88/fonttools-4.61.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:46cb3d9279f758ac0cf671dc3482da877104b65682679f01b246515db03dbb72", size = 4988674, upload-time = "2025-11-28T17:04:24.675Z" }, + { url = "https://files.pythonhosted.org/packages/9b/5c/e857349ce8aedb2451b9448282e86544b2b7f1c8b10ea0fe49b7cb369b72/fonttools-4.61.0-cp310-cp310-win32.whl", hash = "sha256:58b4f1b78dfbfe855bb8a6801b31b8cdcca0e2847ec769ad8e0b0b692832dd3b", size = 1497663, upload-time = "2025-11-28T17:04:26.598Z" }, + { url = "https://files.pythonhosted.org/packages/f9/0c/62961d5fe6f764d6cbc387ef2c001f5f610808c7aded837409836c0b3e7c/fonttools-4.61.0-cp310-cp310-win_amd64.whl", hash = "sha256:68704a8bbe0b61976262b255e90cde593dc0fe3676542d9b4d846bad2a890a76", size = 1546143, upload-time = "2025-11-28T17:04:28.432Z" }, + { url = "https://files.pythonhosted.org/packages/fd/be/5aa89cdddf2863d8afbdc19eb8ec5d8d35d40eeeb8e6cf52c5ff1c2dbd33/fonttools-4.61.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:a32a16951cbf113d38f1dd8551b277b6e06e0f6f776fece0f99f746d739e1be3", size = 2847553, upload-time = "2025-11-28T17:04:30.539Z" }, + { url = "https://files.pythonhosted.org/packages/0d/3e/6ff643b07cead1236a534f51291ae2981721cf419135af5b740c002a66dd/fonttools-4.61.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:328a9c227984bebaf69f3ac9062265f8f6acc7ddf2e4e344c63358579af0aa3d", size = 2388298, upload-time = "2025-11-28T17:04:32.161Z" }, + { url = "https://files.pythonhosted.org/packages/c3/15/fca8dfbe7b482e6f240b1aad0ed7c6e2e75e7a28efa3d3a03b570617b5e5/fonttools-4.61.0-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:2f0bafc8a3b3749c69cc610e5aa3da832d39c2a37a68f03d18ec9a02ecaac04a", size = 5054133, upload-time = "2025-11-28T17:04:34.035Z" }, + { url = "https://files.pythonhosted.org/packages/6a/a2/821c61c691b21fd09e07528a9a499cc2b075ac83ddb644aa16c9875a64bc/fonttools-4.61.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:b5ca59b7417d149cf24e4c1933c9f44b2957424fc03536f132346d5242e0ebe5", size = 5031410, upload-time = "2025-11-28T17:04:36.141Z" }, + { url = "https://files.pythonhosted.org/packages/e8/f6/8b16339e93d03c732c8a23edefe3061b17a5f9107ddc47a3215ecd054cac/fonttools-4.61.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:df8cbce85cf482eb01f4551edca978c719f099c623277bda8332e5dbe7dba09d", size = 5030005, upload-time = "2025-11-28T17:04:38.314Z" }, + { url = "https://files.pythonhosted.org/packages/ac/eb/d4e150427bdaa147755239c931bbce829a88149ade5bfd8a327afe565567/fonttools-4.61.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:7fb5b84f48a6a733ca3d7f41aa9551908ccabe8669ffe79586560abcc00a9cfd", size = 5154026, upload-time = "2025-11-28T17:04:40.34Z" }, + { url = "https://files.pythonhosted.org/packages/7f/5f/3dd00ce0dba6759943c707b1830af8c0bcf6f8f1a9fe46cb82e7ac2aaa74/fonttools-4.61.0-cp311-cp311-win32.whl", hash = "sha256:787ef9dfd1ea9fe49573c272412ae5f479d78e671981819538143bec65863865", size = 2276035, upload-time = "2025-11-28T17:04:42.59Z" }, + { url = "https://files.pythonhosted.org/packages/4e/44/798c472f096ddf12955eddb98f4f7c906e7497695d04ce073ddf7161d134/fonttools-4.61.0-cp311-cp311-win_amd64.whl", hash = "sha256:14fafda386377b6131d9e448af42d0926bad47e038de0e5ba1d58c25d621f028", size = 2327290, upload-time = "2025-11-28T17:04:44.57Z" }, + { url = "https://files.pythonhosted.org/packages/00/5d/19e5939f773c7cb05480fe2e881d63870b63ee2b4bdb9a77d55b1d36c7b9/fonttools-4.61.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:e24a1565c4e57111ec7f4915f8981ecbb61adf66a55f378fdc00e206059fcfef", size = 2846930, upload-time = "2025-11-28T17:04:46.639Z" }, + { url = "https://files.pythonhosted.org/packages/25/b2/0658faf66f705293bd7e739a4f038302d188d424926be9c59bdad945664b/fonttools-4.61.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:e2bfacb5351303cae9f072ccf3fc6ecb437a6f359c0606bae4b1ab6715201d87", size = 2383016, upload-time = "2025-11-28T17:04:48.525Z" }, + { url = "https://files.pythonhosted.org/packages/29/a3/1fa90b95b690f0d7541f48850adc40e9019374d896c1b8148d15012b2458/fonttools-4.61.0-cp312-cp312-manylinux1_x86_64.manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:0bdcf2e29d65c26299cc3d502f4612365e8b90a939f46cd92d037b6cb7bb544a", size = 4949425, upload-time = "2025-11-28T17:04:50.482Z" }, + { url = "https://files.pythonhosted.org/packages/af/00/acf18c00f6c501bd6e05ee930f926186f8a8e268265407065688820f1c94/fonttools-4.61.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:e6cd0d9051b8ddaf7385f99dd82ec2a058e2b46cf1f1961e68e1ff20fcbb61af", size = 4999632, upload-time = "2025-11-28T17:04:52.508Z" }, + { url = "https://files.pythonhosted.org/packages/5f/e0/19a2b86e54109b1d2ee8743c96a1d297238ae03243897bc5345c0365f34d/fonttools-4.61.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:e074bc07c31406f45c418e17c1722e83560f181d122c412fa9e815df0ff74810", size = 4939438, upload-time = "2025-11-28T17:04:54.437Z" }, + { url = "https://files.pythonhosted.org/packages/04/35/7b57a5f57d46286360355eff8d6b88c64ab6331107f37a273a71c803798d/fonttools-4.61.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:5a9b78da5d5faa17e63b2404b77feeae105c1b7e75f26020ab7a27b76e02039f", size = 5088960, upload-time = "2025-11-28T17:04:56.348Z" }, + { url = "https://files.pythonhosted.org/packages/3e/0e/6c5023eb2e0fe5d1ababc7e221e44acd3ff668781489cc1937a6f83d620a/fonttools-4.61.0-cp312-cp312-win32.whl", hash = "sha256:9821ed77bb676736b88fa87a737c97b6af06e8109667e625a4f00158540ce044", size = 2264404, upload-time = "2025-11-28T17:04:58.149Z" }, + { url = "https://files.pythonhosted.org/packages/36/0b/63273128c7c5df19b1e4cd92e0a1e6ea5bb74a400c4905054c96ad60a675/fonttools-4.61.0-cp312-cp312-win_amd64.whl", hash = "sha256:0011d640afa61053bc6590f9a3394bd222de7cfde19346588beabac374e9d8ac", size = 2314427, upload-time = "2025-11-28T17:04:59.812Z" }, + { url = "https://files.pythonhosted.org/packages/17/45/334f0d7f181e5473cfb757e1b60f4e60e7fc64f28d406e5d364a952718c0/fonttools-4.61.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:ba774b8cbd8754f54b8eb58124e8bd45f736b2743325ab1a5229698942b9b433", size = 2841801, upload-time = "2025-11-28T17:05:01.621Z" }, + { url = "https://files.pythonhosted.org/packages/cc/63/97b9c78e1f79bc741d4efe6e51f13872d8edb2b36e1b9fb2bab0d4491bb7/fonttools-4.61.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:c84b430616ed73ce46e9cafd0bf0800e366a3e02fb7e1ad7c1e214dbe3862b1f", size = 2379024, upload-time = "2025-11-28T17:05:03.668Z" }, + { url = "https://files.pythonhosted.org/packages/4e/80/c87bc524a90dbeb2a390eea23eae448286983da59b7e02c67fa0ca96a8c5/fonttools-4.61.0-cp313-cp313-manylinux1_x86_64.manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:b2b734d8391afe3c682320840c8191de9bd24e7eb85768dd4dc06ed1b63dbb1b", size = 4923706, upload-time = "2025-11-28T17:05:05.494Z" }, + { url = "https://files.pythonhosted.org/packages/6d/f6/a3b0374811a1de8c3f9207ec88f61ad1bb96f938ed89babae26c065c2e46/fonttools-4.61.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:a5c5fff72bf31b0e558ed085e4fd7ed96eb85881404ecc39ed2a779e7cf724eb", size = 4979751, upload-time = "2025-11-28T17:05:07.665Z" }, + { url = "https://files.pythonhosted.org/packages/a5/3b/30f63b4308b449091573285f9d27619563a84f399946bca3eadc9554afbe/fonttools-4.61.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:14a290c5c93fcab76b7f451e6a4b7721b712d90b3b5ed6908f1abcf794e90d6d", size = 4921113, upload-time = "2025-11-28T17:05:09.551Z" }, + { url = "https://files.pythonhosted.org/packages/41/6c/58e6e9b7d9d8bf2d7010bd7bb493060b39b02a12d1cda64a8bfb116ce760/fonttools-4.61.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:13e3e20a5463bfeb77b3557d04b30bd6a96a6bb5c15c7b2e7908903e69d437a0", size = 5063183, upload-time = "2025-11-28T17:05:11.677Z" }, + { url = "https://files.pythonhosted.org/packages/3f/e3/52c790ab2b07492df059947a1fd7778e105aac5848c0473029a4d20481a2/fonttools-4.61.0-cp313-cp313-win32.whl", hash = "sha256:6781e7a4bb010be1cd69a29927b0305c86b843395f2613bdabe115f7d6ea7f34", size = 2263159, upload-time = "2025-11-28T17:05:13.292Z" }, + { url = "https://files.pythonhosted.org/packages/e9/1f/116013b200fbeba871046554d5d2a45fefa69a05c40e9cdfd0d4fff53edc/fonttools-4.61.0-cp313-cp313-win_amd64.whl", hash = "sha256:c53b47834ae41e8e4829171cc44fec0fdf125545a15f6da41776b926b9645a9a", size = 2313530, upload-time = "2025-11-28T17:05:14.848Z" }, + { url = "https://files.pythonhosted.org/packages/d3/99/59b1e25987787cb714aa9457cee4c9301b7c2153f0b673e2b8679d37669d/fonttools-4.61.0-cp314-cp314-macosx_10_15_universal2.whl", hash = "sha256:96dfc9bc1f2302224e48e6ee37e656eddbab810b724b52e9d9c13a57a6abad01", size = 2841429, upload-time = "2025-11-28T17:05:16.671Z" }, + { url = "https://files.pythonhosted.org/packages/2b/b2/4c1911d4332c8a144bb3b44416e274ccca0e297157c971ea1b3fbb855590/fonttools-4.61.0-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:3b2065d94e5d63aafc2591c8b6ccbdb511001d9619f1bca8ad39b745ebeb5efa", size = 2378987, upload-time = "2025-11-28T17:05:18.69Z" }, + { url = "https://files.pythonhosted.org/packages/24/b0/f442e90fde5d2af2ae0cb54008ab6411edc557ee33b824e13e1d04925ac9/fonttools-4.61.0-cp314-cp314-manylinux1_x86_64.manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:e0d87e81e4d869549585ba0beb3f033718501c1095004f5e6aef598d13ebc216", size = 4873270, upload-time = "2025-11-28T17:05:20.625Z" }, + { url = "https://files.pythonhosted.org/packages/bb/04/f5d5990e33053c8a59b90b1d7e10ad9b97a73f42c745304da0e709635fab/fonttools-4.61.0-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:1cfa2eb9bae650e58f0e8ad53c49d19a844d6034d6b259f30f197238abc1ccee", size = 4968270, upload-time = "2025-11-28T17:05:22.515Z" }, + { url = "https://files.pythonhosted.org/packages/94/9f/2091402e0d27c9c8c4bab5de0e5cd146d9609a2d7d1c666bbb75c0011c1a/fonttools-4.61.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:4238120002e68296d55e091411c09eab94e111c8ce64716d17df53fd0eb3bb3d", size = 4919799, upload-time = "2025-11-28T17:05:24.437Z" }, + { url = "https://files.pythonhosted.org/packages/a8/72/86adab22fde710b829f8ffbc8f264df01928e5b7a8f6177fa29979ebf256/fonttools-4.61.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:b6ceac262cc62bec01b3bb59abccf41b24ef6580869e306a4e88b7e56bb4bdda", size = 5030966, upload-time = "2025-11-28T17:05:26.115Z" }, + { url = "https://files.pythonhosted.org/packages/e8/a7/7c8e31b003349e845b853f5e0a67b95ff6b052fa4f5224f8b72624f5ac69/fonttools-4.61.0-cp314-cp314-win32.whl", hash = "sha256:adbb4ecee1a779469a77377bbe490565effe8fce6fb2e6f95f064de58f8bac85", size = 2267243, upload-time = "2025-11-28T17:05:27.807Z" }, + { url = "https://files.pythonhosted.org/packages/20/ee/f434fe7749360497c52b7dcbcfdbccdaab0a71c59f19d572576066717122/fonttools-4.61.0-cp314-cp314-win_amd64.whl", hash = "sha256:02bdf8e04d1a70476564b8640380f04bb4ac74edc1fc71f1bacb840b3e398ee9", size = 2318822, upload-time = "2025-11-28T17:05:29.882Z" }, + { url = "https://files.pythonhosted.org/packages/33/b3/c16255320255e5c1863ca2b2599bb61a46e2f566db0bbb9948615a8fe692/fonttools-4.61.0-cp314-cp314t-macosx_10_15_universal2.whl", hash = "sha256:627216062d90ab0d98215176d8b9562c4dd5b61271d35f130bcd30f6a8aaa33a", size = 2924917, upload-time = "2025-11-28T17:05:31.46Z" }, + { url = "https://files.pythonhosted.org/packages/e2/b8/08067ae21de705a817777c02ef36ab0b953cbe91d8adf134f9c2da75ed6d/fonttools-4.61.0-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:7b446623c9cd5f14a59493818eaa80255eec2468c27d2c01b56e05357c263195", size = 2413576, upload-time = "2025-11-28T17:05:33.343Z" }, + { url = "https://files.pythonhosted.org/packages/42/f1/96ff43f92addce2356780fdc203f2966206f3d22ea20e242c27826fd7442/fonttools-4.61.0-cp314-cp314t-manylinux1_x86_64.manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:70e2a0c0182ee75e493ef33061bfebf140ea57e035481d2f95aa03b66c7a0e05", size = 4877447, upload-time = "2025-11-28T17:05:35.278Z" }, + { url = "https://files.pythonhosted.org/packages/d0/1e/a3d8e51ed9ccfd7385e239ae374b78d258a0fb82d82cab99160a014a45d1/fonttools-4.61.0-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:9064b0f55b947e929ac669af5311ab1f26f750214db6dd9a0c97e091e918f486", size = 5095681, upload-time = "2025-11-28T17:05:37.142Z" }, + { url = "https://files.pythonhosted.org/packages/eb/f6/d256bd6c1065c146a0bdddf1c62f542e08ae5b3405dbf3fcc52be272f674/fonttools-4.61.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:2cb5e45a824ce14b90510024d0d39dae51bd4fbb54c42a9334ea8c8cf4d95cbe", size = 4974140, upload-time = "2025-11-28T17:05:39.5Z" }, + { url = "https://files.pythonhosted.org/packages/5d/0c/96633eb4b26f138cc48561c6e0c44b4ea48acea56b20b507d6b14f8e80ce/fonttools-4.61.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:6e5ca8c62efdec7972dfdfd454415c4db49b89aeaefaaacada432f3b7eea9866", size = 5001741, upload-time = "2025-11-28T17:05:41.424Z" }, + { url = "https://files.pythonhosted.org/packages/6f/9a/3b536bad3be4f26186f296e749ff17bad3e6d57232c104d752d24b2e265b/fonttools-4.61.0-cp314-cp314t-win32.whl", hash = "sha256:63c7125d31abe3e61d7bb917329b5543c5b3448db95f24081a13aaf064360fc8", size = 2330707, upload-time = "2025-11-28T17:05:43.548Z" }, + { url = "https://files.pythonhosted.org/packages/18/ea/e6b9ac610451ee9f04477c311ad126de971f6112cb579fa391d2a8edb00b/fonttools-4.61.0-cp314-cp314t-win_amd64.whl", hash = "sha256:67d841aa272be5500de7f447c40d1d8452783af33b4c3599899319f6ef9ad3c1", size = 2395950, upload-time = "2025-11-28T17:05:45.638Z" }, + { url = "https://files.pythonhosted.org/packages/0c/14/634f7daea5ffe6a5f7a0322ba8e1a0e23c9257b80aa91458107896d1dfc7/fonttools-4.61.0-py3-none-any.whl", hash = "sha256:276f14c560e6f98d24ef7f5f44438e55ff5a67f78fa85236b218462c9f5d0635", size = 1144485, upload-time = "2025-11-28T17:05:47.573Z" }, +] + +[[package]] +name = "fqdn" +version = "1.5.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/30/3e/a80a8c077fd798951169626cde3e239adeba7dab75deb3555716415bd9b0/fqdn-1.5.1.tar.gz", hash = "sha256:105ed3677e767fb5ca086a0c1f4bb66ebc3c100be518f0e0d755d9eae164d89f", size = 6015, upload-time = "2021-03-11T07:16:29.08Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/cf/58/8acf1b3e91c58313ce5cb67df61001fc9dcd21be4fadb76c1a2d540e09ed/fqdn-1.5.1-py3-none-any.whl", hash = "sha256:3a179af3761e4df6eb2e026ff9e1a3033d3587bf980a0b1b2e1e5d08d7358014", size = 9121, upload-time = "2021-03-11T07:16:28.351Z" }, +] + +[[package]] +name = "frozenlist" +version = "1.5.0" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version < '3.9'", +] +sdist = { url = "https://files.pythonhosted.org/packages/8f/ed/0f4cec13a93c02c47ec32d81d11c0c1efbadf4a471e3f3ce7cad366cbbd3/frozenlist-1.5.0.tar.gz", hash = "sha256:81d5af29e61b9c8348e876d442253723928dce6433e0e76cd925cd83f1b4b817", size = 39930, upload-time = "2024-10-23T09:48:29.903Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/54/79/29d44c4af36b2b240725dce566b20f63f9b36ef267aaaa64ee7466f4f2f8/frozenlist-1.5.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:5b6a66c18b5b9dd261ca98dffcb826a525334b2f29e7caa54e182255c5f6a65a", size = 94451, upload-time = "2024-10-23T09:46:20.558Z" }, + { url = "https://files.pythonhosted.org/packages/47/47/0c999aeace6ead8a44441b4f4173e2261b18219e4ad1fe9a479871ca02fc/frozenlist-1.5.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:d1b3eb7b05ea246510b43a7e53ed1653e55c2121019a97e60cad7efb881a97bb", size = 54301, upload-time = "2024-10-23T09:46:21.759Z" }, + { url = "https://files.pythonhosted.org/packages/8d/60/107a38c1e54176d12e06e9d4b5d755b677d71d1219217cee063911b1384f/frozenlist-1.5.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:15538c0cbf0e4fa11d1e3a71f823524b0c46299aed6e10ebb4c2089abd8c3bec", size = 52213, upload-time = "2024-10-23T09:46:22.993Z" }, + { url = "https://files.pythonhosted.org/packages/17/62/594a6829ac5679c25755362a9dc93486a8a45241394564309641425d3ff6/frozenlist-1.5.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e79225373c317ff1e35f210dd5f1344ff31066ba8067c307ab60254cd3a78ad5", size = 240946, upload-time = "2024-10-23T09:46:24.661Z" }, + { url = "https://files.pythonhosted.org/packages/7e/75/6c8419d8f92c80dd0ee3f63bdde2702ce6398b0ac8410ff459f9b6f2f9cb/frozenlist-1.5.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9272fa73ca71266702c4c3e2d4a28553ea03418e591e377a03b8e3659d94fa76", size = 264608, upload-time = "2024-10-23T09:46:26.017Z" }, + { url = "https://files.pythonhosted.org/packages/88/3e/82a6f0b84bc6fb7e0be240e52863c6d4ab6098cd62e4f5b972cd31e002e8/frozenlist-1.5.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:498524025a5b8ba81695761d78c8dd7382ac0b052f34e66939c42df860b8ff17", size = 261361, upload-time = "2024-10-23T09:46:27.787Z" }, + { url = "https://files.pythonhosted.org/packages/fd/85/14e5f9ccac1b64ff2f10c927b3ffdf88772aea875882406f9ba0cec8ad84/frozenlist-1.5.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:92b5278ed9d50fe610185ecd23c55d8b307d75ca18e94c0e7de328089ac5dcba", size = 231649, upload-time = "2024-10-23T09:46:28.992Z" }, + { url = "https://files.pythonhosted.org/packages/ee/59/928322800306f6529d1852323014ee9008551e9bb027cc38d276cbc0b0e7/frozenlist-1.5.0-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7f3c8c1dacd037df16e85227bac13cca58c30da836c6f936ba1df0c05d046d8d", size = 241853, upload-time = "2024-10-23T09:46:30.211Z" }, + { url = "https://files.pythonhosted.org/packages/7d/bd/e01fa4f146a6f6c18c5d34cab8abdc4013774a26c4ff851128cd1bd3008e/frozenlist-1.5.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:f2ac49a9bedb996086057b75bf93538240538c6d9b38e57c82d51f75a73409d2", size = 243652, upload-time = "2024-10-23T09:46:31.758Z" }, + { url = "https://files.pythonhosted.org/packages/a5/bd/e4771fd18a8ec6757033f0fa903e447aecc3fbba54e3630397b61596acf0/frozenlist-1.5.0-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:e66cc454f97053b79c2ab09c17fbe3c825ea6b4de20baf1be28919460dd7877f", size = 241734, upload-time = "2024-10-23T09:46:33.044Z" }, + { url = "https://files.pythonhosted.org/packages/21/13/c83821fa5544af4f60c5d3a65d054af3213c26b14d3f5f48e43e5fb48556/frozenlist-1.5.0-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:5a3ba5f9a0dfed20337d3e966dc359784c9f96503674c2faf015f7fe8e96798c", size = 260959, upload-time = "2024-10-23T09:46:34.916Z" }, + { url = "https://files.pythonhosted.org/packages/71/f3/1f91c9a9bf7ed0e8edcf52698d23f3c211d8d00291a53c9f115ceb977ab1/frozenlist-1.5.0-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:6321899477db90bdeb9299ac3627a6a53c7399c8cd58d25da094007402b039ab", size = 262706, upload-time = "2024-10-23T09:46:36.159Z" }, + { url = "https://files.pythonhosted.org/packages/4c/22/4a256fdf5d9bcb3ae32622c796ee5ff9451b3a13a68cfe3f68e2c95588ce/frozenlist-1.5.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:76e4753701248476e6286f2ef492af900ea67d9706a0155335a40ea21bf3b2f5", size = 250401, upload-time = "2024-10-23T09:46:37.327Z" }, + { url = "https://files.pythonhosted.org/packages/af/89/c48ebe1f7991bd2be6d5f4ed202d94960c01b3017a03d6954dd5fa9ea1e8/frozenlist-1.5.0-cp310-cp310-win32.whl", hash = "sha256:977701c081c0241d0955c9586ffdd9ce44f7a7795df39b9151cd9a6fd0ce4cfb", size = 45498, upload-time = "2024-10-23T09:46:38.552Z" }, + { url = "https://files.pythonhosted.org/packages/28/2f/cc27d5f43e023d21fe5c19538e08894db3d7e081cbf582ad5ed366c24446/frozenlist-1.5.0-cp310-cp310-win_amd64.whl", hash = "sha256:189f03b53e64144f90990d29a27ec4f7997d91ed3d01b51fa39d2dbe77540fd4", size = 51622, upload-time = "2024-10-23T09:46:39.513Z" }, + { url = "https://files.pythonhosted.org/packages/79/43/0bed28bf5eb1c9e4301003b74453b8e7aa85fb293b31dde352aac528dafc/frozenlist-1.5.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:fd74520371c3c4175142d02a976aee0b4cb4a7cc912a60586ffd8d5929979b30", size = 94987, upload-time = "2024-10-23T09:46:40.487Z" }, + { url = "https://files.pythonhosted.org/packages/bb/bf/b74e38f09a246e8abbe1e90eb65787ed745ccab6eaa58b9c9308e052323d/frozenlist-1.5.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:2f3f7a0fbc219fb4455264cae4d9f01ad41ae6ee8524500f381de64ffaa077d5", size = 54584, upload-time = "2024-10-23T09:46:41.463Z" }, + { url = "https://files.pythonhosted.org/packages/2c/31/ab01375682f14f7613a1ade30149f684c84f9b8823a4391ed950c8285656/frozenlist-1.5.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:f47c9c9028f55a04ac254346e92977bf0f166c483c74b4232bee19a6697e4778", size = 52499, upload-time = "2024-10-23T09:46:42.451Z" }, + { url = "https://files.pythonhosted.org/packages/98/a8/d0ac0b9276e1404f58fec3ab6e90a4f76b778a49373ccaf6a563f100dfbc/frozenlist-1.5.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0996c66760924da6e88922756d99b47512a71cfd45215f3570bf1e0b694c206a", size = 276357, upload-time = "2024-10-23T09:46:44.166Z" }, + { url = "https://files.pythonhosted.org/packages/ad/c9/c7761084fa822f07dac38ac29f841d4587570dd211e2262544aa0b791d21/frozenlist-1.5.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a2fe128eb4edeabe11896cb6af88fca5346059f6c8d807e3b910069f39157869", size = 287516, upload-time = "2024-10-23T09:46:45.369Z" }, + { url = "https://files.pythonhosted.org/packages/a1/ff/cd7479e703c39df7bdab431798cef89dc75010d8aa0ca2514c5b9321db27/frozenlist-1.5.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1a8ea951bbb6cacd492e3948b8da8c502a3f814f5d20935aae74b5df2b19cf3d", size = 283131, upload-time = "2024-10-23T09:46:46.654Z" }, + { url = "https://files.pythonhosted.org/packages/59/a0/370941beb47d237eca4fbf27e4e91389fd68699e6f4b0ebcc95da463835b/frozenlist-1.5.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:de537c11e4aa01d37db0d403b57bd6f0546e71a82347a97c6a9f0dcc532b3a45", size = 261320, upload-time = "2024-10-23T09:46:47.825Z" }, + { url = "https://files.pythonhosted.org/packages/b8/5f/c10123e8d64867bc9b4f2f510a32042a306ff5fcd7e2e09e5ae5100ee333/frozenlist-1.5.0-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9c2623347b933fcb9095841f1cc5d4ff0b278addd743e0e966cb3d460278840d", size = 274877, upload-time = "2024-10-23T09:46:48.989Z" }, + { url = "https://files.pythonhosted.org/packages/fa/79/38c505601ae29d4348f21706c5d89755ceded02a745016ba2f58bd5f1ea6/frozenlist-1.5.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:cee6798eaf8b1416ef6909b06f7dc04b60755206bddc599f52232606e18179d3", size = 269592, upload-time = "2024-10-23T09:46:50.235Z" }, + { url = "https://files.pythonhosted.org/packages/19/e2/39f3a53191b8204ba9f0bb574b926b73dd2efba2a2b9d2d730517e8f7622/frozenlist-1.5.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:f5f9da7f5dbc00a604fe74aa02ae7c98bcede8a3b8b9666f9f86fc13993bc71a", size = 265934, upload-time = "2024-10-23T09:46:51.829Z" }, + { url = "https://files.pythonhosted.org/packages/d5/c9/3075eb7f7f3a91f1a6b00284af4de0a65a9ae47084930916f5528144c9dd/frozenlist-1.5.0-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:90646abbc7a5d5c7c19461d2e3eeb76eb0b204919e6ece342feb6032c9325ae9", size = 283859, upload-time = "2024-10-23T09:46:52.947Z" }, + { url = "https://files.pythonhosted.org/packages/05/f5/549f44d314c29408b962fa2b0e69a1a67c59379fb143b92a0a065ffd1f0f/frozenlist-1.5.0-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:bdac3c7d9b705d253b2ce370fde941836a5f8b3c5c2b8fd70940a3ea3af7f4f2", size = 287560, upload-time = "2024-10-23T09:46:54.162Z" }, + { url = "https://files.pythonhosted.org/packages/9d/f8/cb09b3c24a3eac02c4c07a9558e11e9e244fb02bf62c85ac2106d1eb0c0b/frozenlist-1.5.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:03d33c2ddbc1816237a67f66336616416e2bbb6beb306e5f890f2eb22b959cdf", size = 277150, upload-time = "2024-10-23T09:46:55.361Z" }, + { url = "https://files.pythonhosted.org/packages/37/48/38c2db3f54d1501e692d6fe058f45b6ad1b358d82cd19436efab80cfc965/frozenlist-1.5.0-cp311-cp311-win32.whl", hash = "sha256:237f6b23ee0f44066219dae14c70ae38a63f0440ce6750f868ee08775073f942", size = 45244, upload-time = "2024-10-23T09:46:56.578Z" }, + { url = "https://files.pythonhosted.org/packages/ca/8c/2ddffeb8b60a4bce3b196c32fcc30d8830d4615e7b492ec2071da801b8ad/frozenlist-1.5.0-cp311-cp311-win_amd64.whl", hash = "sha256:0cc974cc93d32c42e7b0f6cf242a6bd941c57c61b618e78b6c0a96cb72788c1d", size = 51634, upload-time = "2024-10-23T09:46:57.6Z" }, + { url = "https://files.pythonhosted.org/packages/79/73/fa6d1a96ab7fd6e6d1c3500700963eab46813847f01ef0ccbaa726181dd5/frozenlist-1.5.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:31115ba75889723431aa9a4e77d5f398f5cf976eea3bdf61749731f62d4a4a21", size = 94026, upload-time = "2024-10-23T09:46:58.601Z" }, + { url = "https://files.pythonhosted.org/packages/ab/04/ea8bf62c8868b8eada363f20ff1b647cf2e93377a7b284d36062d21d81d1/frozenlist-1.5.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:7437601c4d89d070eac8323f121fcf25f88674627505334654fd027b091db09d", size = 54150, upload-time = "2024-10-23T09:46:59.608Z" }, + { url = "https://files.pythonhosted.org/packages/d0/9a/8e479b482a6f2070b26bda572c5e6889bb3ba48977e81beea35b5ae13ece/frozenlist-1.5.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:7948140d9f8ece1745be806f2bfdf390127cf1a763b925c4a805c603df5e697e", size = 51927, upload-time = "2024-10-23T09:47:00.625Z" }, + { url = "https://files.pythonhosted.org/packages/e3/12/2aad87deb08a4e7ccfb33600871bbe8f0e08cb6d8224371387f3303654d7/frozenlist-1.5.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:feeb64bc9bcc6b45c6311c9e9b99406660a9c05ca8a5b30d14a78555088b0b3a", size = 282647, upload-time = "2024-10-23T09:47:01.992Z" }, + { url = "https://files.pythonhosted.org/packages/77/f2/07f06b05d8a427ea0060a9cef6e63405ea9e0d761846b95ef3fb3be57111/frozenlist-1.5.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:683173d371daad49cffb8309779e886e59c2f369430ad28fe715f66d08d4ab1a", size = 289052, upload-time = "2024-10-23T09:47:04.039Z" }, + { url = "https://files.pythonhosted.org/packages/bd/9f/8bf45a2f1cd4aa401acd271b077989c9267ae8463e7c8b1eb0d3f561b65e/frozenlist-1.5.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7d57d8f702221405a9d9b40f9da8ac2e4a1a8b5285aac6100f3393675f0a85ee", size = 291719, upload-time = "2024-10-23T09:47:05.58Z" }, + { url = "https://files.pythonhosted.org/packages/41/d1/1f20fd05a6c42d3868709b7604c9f15538a29e4f734c694c6bcfc3d3b935/frozenlist-1.5.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:30c72000fbcc35b129cb09956836c7d7abf78ab5416595e4857d1cae8d6251a6", size = 267433, upload-time = "2024-10-23T09:47:07.807Z" }, + { url = "https://files.pythonhosted.org/packages/af/f2/64b73a9bb86f5a89fb55450e97cd5c1f84a862d4ff90d9fd1a73ab0f64a5/frozenlist-1.5.0-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:000a77d6034fbad9b6bb880f7ec073027908f1b40254b5d6f26210d2dab1240e", size = 283591, upload-time = "2024-10-23T09:47:09.645Z" }, + { url = "https://files.pythonhosted.org/packages/29/e2/ffbb1fae55a791fd6c2938dd9ea779509c977435ba3940b9f2e8dc9d5316/frozenlist-1.5.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:5d7f5a50342475962eb18b740f3beecc685a15b52c91f7d975257e13e029eca9", size = 273249, upload-time = "2024-10-23T09:47:10.808Z" }, + { url = "https://files.pythonhosted.org/packages/2e/6e/008136a30798bb63618a114b9321b5971172a5abddff44a100c7edc5ad4f/frozenlist-1.5.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:87f724d055eb4785d9be84e9ebf0f24e392ddfad00b3fe036e43f489fafc9039", size = 271075, upload-time = "2024-10-23T09:47:11.938Z" }, + { url = "https://files.pythonhosted.org/packages/ae/f0/4e71e54a026b06724cec9b6c54f0b13a4e9e298cc8db0f82ec70e151f5ce/frozenlist-1.5.0-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:6e9080bb2fb195a046e5177f10d9d82b8a204c0736a97a153c2466127de87784", size = 285398, upload-time = "2024-10-23T09:47:14.071Z" }, + { url = "https://files.pythonhosted.org/packages/4d/36/70ec246851478b1c0b59f11ef8ade9c482ff447c1363c2bd5fad45098b12/frozenlist-1.5.0-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:9b93d7aaa36c966fa42efcaf716e6b3900438632a626fb09c049f6a2f09fc631", size = 294445, upload-time = "2024-10-23T09:47:15.318Z" }, + { url = "https://files.pythonhosted.org/packages/37/e0/47f87544055b3349b633a03c4d94b405956cf2437f4ab46d0928b74b7526/frozenlist-1.5.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:52ef692a4bc60a6dd57f507429636c2af8b6046db8b31b18dac02cbc8f507f7f", size = 280569, upload-time = "2024-10-23T09:47:17.149Z" }, + { url = "https://files.pythonhosted.org/packages/f9/7c/490133c160fb6b84ed374c266f42800e33b50c3bbab1652764e6e1fc498a/frozenlist-1.5.0-cp312-cp312-win32.whl", hash = "sha256:29d94c256679247b33a3dc96cce0f93cbc69c23bf75ff715919332fdbb6a32b8", size = 44721, upload-time = "2024-10-23T09:47:19.012Z" }, + { url = "https://files.pythonhosted.org/packages/b1/56/4e45136ffc6bdbfa68c29ca56ef53783ef4c2fd395f7cbf99a2624aa9aaa/frozenlist-1.5.0-cp312-cp312-win_amd64.whl", hash = "sha256:8969190d709e7c48ea386db202d708eb94bdb29207a1f269bab1196ce0dcca1f", size = 51329, upload-time = "2024-10-23T09:47:20.177Z" }, + { url = "https://files.pythonhosted.org/packages/da/3b/915f0bca8a7ea04483622e84a9bd90033bab54bdf485479556c74fd5eaf5/frozenlist-1.5.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:7a1a048f9215c90973402e26c01d1cff8a209e1f1b53f72b95c13db61b00f953", size = 91538, upload-time = "2024-10-23T09:47:21.176Z" }, + { url = "https://files.pythonhosted.org/packages/c7/d1/a7c98aad7e44afe5306a2b068434a5830f1470675f0e715abb86eb15f15b/frozenlist-1.5.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:dd47a5181ce5fcb463b5d9e17ecfdb02b678cca31280639255ce9d0e5aa67af0", size = 52849, upload-time = "2024-10-23T09:47:22.439Z" }, + { url = "https://files.pythonhosted.org/packages/3a/c8/76f23bf9ab15d5f760eb48701909645f686f9c64fbb8982674c241fbef14/frozenlist-1.5.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:1431d60b36d15cda188ea222033eec8e0eab488f39a272461f2e6d9e1a8e63c2", size = 50583, upload-time = "2024-10-23T09:47:23.44Z" }, + { url = "https://files.pythonhosted.org/packages/1f/22/462a3dd093d11df623179d7754a3b3269de3b42de2808cddef50ee0f4f48/frozenlist-1.5.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6482a5851f5d72767fbd0e507e80737f9c8646ae7fd303def99bfe813f76cf7f", size = 265636, upload-time = "2024-10-23T09:47:24.82Z" }, + { url = "https://files.pythonhosted.org/packages/80/cf/e075e407fc2ae7328155a1cd7e22f932773c8073c1fc78016607d19cc3e5/frozenlist-1.5.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:44c49271a937625619e862baacbd037a7ef86dd1ee215afc298a417ff3270608", size = 270214, upload-time = "2024-10-23T09:47:26.156Z" }, + { url = "https://files.pythonhosted.org/packages/a1/58/0642d061d5de779f39c50cbb00df49682832923f3d2ebfb0fedf02d05f7f/frozenlist-1.5.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:12f78f98c2f1c2429d42e6a485f433722b0061d5c0b0139efa64f396efb5886b", size = 273905, upload-time = "2024-10-23T09:47:27.741Z" }, + { url = "https://files.pythonhosted.org/packages/ab/66/3fe0f5f8f2add5b4ab7aa4e199f767fd3b55da26e3ca4ce2cc36698e50c4/frozenlist-1.5.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ce3aa154c452d2467487765e3adc730a8c153af77ad84096bc19ce19a2400840", size = 250542, upload-time = "2024-10-23T09:47:28.938Z" }, + { url = "https://files.pythonhosted.org/packages/f6/b8/260791bde9198c87a465224e0e2bb62c4e716f5d198fc3a1dacc4895dbd1/frozenlist-1.5.0-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9b7dc0c4338e6b8b091e8faf0db3168a37101943e687f373dce00959583f7439", size = 267026, upload-time = "2024-10-23T09:47:30.283Z" }, + { url = "https://files.pythonhosted.org/packages/2e/a4/3d24f88c527f08f8d44ade24eaee83b2627793fa62fa07cbb7ff7a2f7d42/frozenlist-1.5.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:45e0896250900b5aa25180f9aec243e84e92ac84bd4a74d9ad4138ef3f5c97de", size = 257690, upload-time = "2024-10-23T09:47:32.388Z" }, + { url = "https://files.pythonhosted.org/packages/de/9a/d311d660420b2beeff3459b6626f2ab4fb236d07afbdac034a4371fe696e/frozenlist-1.5.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:561eb1c9579d495fddb6da8959fd2a1fca2c6d060d4113f5844b433fc02f2641", size = 253893, upload-time = "2024-10-23T09:47:34.274Z" }, + { url = "https://files.pythonhosted.org/packages/c6/23/e491aadc25b56eabd0f18c53bb19f3cdc6de30b2129ee0bc39cd387cd560/frozenlist-1.5.0-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:df6e2f325bfee1f49f81aaac97d2aa757c7646534a06f8f577ce184afe2f0a9e", size = 267006, upload-time = "2024-10-23T09:47:35.499Z" }, + { url = "https://files.pythonhosted.org/packages/08/c4/ab918ce636a35fb974d13d666dcbe03969592aeca6c3ab3835acff01f79c/frozenlist-1.5.0-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:140228863501b44b809fb39ec56b5d4071f4d0aa6d216c19cbb08b8c5a7eadb9", size = 276157, upload-time = "2024-10-23T09:47:37.522Z" }, + { url = "https://files.pythonhosted.org/packages/c0/29/3b7a0bbbbe5a34833ba26f686aabfe982924adbdcafdc294a7a129c31688/frozenlist-1.5.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:7707a25d6a77f5d27ea7dc7d1fc608aa0a478193823f88511ef5e6b8a48f9d03", size = 264642, upload-time = "2024-10-23T09:47:38.75Z" }, + { url = "https://files.pythonhosted.org/packages/ab/42/0595b3dbffc2e82d7fe658c12d5a5bafcd7516c6bf2d1d1feb5387caa9c1/frozenlist-1.5.0-cp313-cp313-win32.whl", hash = "sha256:31a9ac2b38ab9b5a8933b693db4939764ad3f299fcaa931a3e605bc3460e693c", size = 44914, upload-time = "2024-10-23T09:47:40.145Z" }, + { url = "https://files.pythonhosted.org/packages/17/c4/b7db1206a3fea44bf3b838ca61deb6f74424a8a5db1dd53ecb21da669be6/frozenlist-1.5.0-cp313-cp313-win_amd64.whl", hash = "sha256:11aabdd62b8b9c4b84081a3c246506d1cddd2dd93ff0ad53ede5defec7886b28", size = 51167, upload-time = "2024-10-23T09:47:41.812Z" }, + { url = "https://files.pythonhosted.org/packages/33/b5/00fcbe8e7e7e172829bf4addc8227d8f599a3d5def3a4e9aa2b54b3145aa/frozenlist-1.5.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:dd94994fc91a6177bfaafd7d9fd951bc8689b0a98168aa26b5f543868548d3ca", size = 95648, upload-time = "2024-10-23T09:47:43.118Z" }, + { url = "https://files.pythonhosted.org/packages/1e/69/e4a32fc4b2fa8e9cb6bcb1bad9c7eeb4b254bc34da475b23f93264fdc306/frozenlist-1.5.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:2d0da8bbec082bf6bf18345b180958775363588678f64998c2b7609e34719b10", size = 54888, upload-time = "2024-10-23T09:47:44.832Z" }, + { url = "https://files.pythonhosted.org/packages/76/a3/c08322a91e73d1199901a77ce73971cffa06d3c74974270ff97aed6e152a/frozenlist-1.5.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:73f2e31ea8dd7df61a359b731716018c2be196e5bb3b74ddba107f694fbd7604", size = 52975, upload-time = "2024-10-23T09:47:46.579Z" }, + { url = "https://files.pythonhosted.org/packages/fc/60/a315321d8ada167b578ff9d2edc147274ead6129523b3a308501b6621b4f/frozenlist-1.5.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:828afae9f17e6de596825cf4228ff28fbdf6065974e5ac1410cecc22f699d2b3", size = 241912, upload-time = "2024-10-23T09:47:47.687Z" }, + { url = "https://files.pythonhosted.org/packages/bd/d0/1f0980987bca4f94f9e8bae01980b23495ffc2e5049a3da4d9b7d2762bee/frozenlist-1.5.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f1577515d35ed5649d52ab4319db757bb881ce3b2b796d7283e6634d99ace307", size = 259433, upload-time = "2024-10-23T09:47:49.339Z" }, + { url = "https://files.pythonhosted.org/packages/28/e7/d00600c072eec8f18a606e281afdf0e8606e71a4882104d0438429b02468/frozenlist-1.5.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2150cc6305a2c2ab33299453e2968611dacb970d2283a14955923062c8d00b10", size = 255576, upload-time = "2024-10-23T09:47:50.519Z" }, + { url = "https://files.pythonhosted.org/packages/82/71/993c5f45dba7be347384ddec1ebc1b4d998291884e7690c06aa6ba755211/frozenlist-1.5.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a72b7a6e3cd2725eff67cd64c8f13335ee18fc3c7befc05aed043d24c7b9ccb9", size = 233349, upload-time = "2024-10-23T09:47:53.197Z" }, + { url = "https://files.pythonhosted.org/packages/66/30/f9c006223feb2ac87f1826b57f2367b60aacc43092f562dab60d2312562e/frozenlist-1.5.0-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c16d2fa63e0800723139137d667e1056bee1a1cf7965153d2d104b62855e9b99", size = 243126, upload-time = "2024-10-23T09:47:54.432Z" }, + { url = "https://files.pythonhosted.org/packages/b5/34/e4219c9343f94b81068d0018cbe37948e66c68003b52bf8a05e9509d09ec/frozenlist-1.5.0-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:17dcc32fc7bda7ce5875435003220a457bcfa34ab7924a49a1c19f55b6ee185c", size = 241261, upload-time = "2024-10-23T09:47:56.01Z" }, + { url = "https://files.pythonhosted.org/packages/48/96/9141758f6a19f2061a51bb59b9907c92f9bda1ac7b2baaf67a6e352b280f/frozenlist-1.5.0-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:97160e245ea33d8609cd2b8fd997c850b56db147a304a262abc2b3be021a9171", size = 240203, upload-time = "2024-10-23T09:47:57.337Z" }, + { url = "https://files.pythonhosted.org/packages/f9/71/0ef5970e68d181571a050958e84c76a061ca52f9c6f50257d9bfdd84c7f7/frozenlist-1.5.0-cp38-cp38-musllinux_1_2_ppc64le.whl", hash = "sha256:f1e6540b7fa044eee0bb5111ada694cf3dc15f2b0347ca125ee9ca984d5e9e6e", size = 267539, upload-time = "2024-10-23T09:47:58.874Z" }, + { url = "https://files.pythonhosted.org/packages/ab/bd/6e7d450c5d993b413591ad9cdab6dcdfa2c6ab2cd835b2b5c1cfeb0323bf/frozenlist-1.5.0-cp38-cp38-musllinux_1_2_s390x.whl", hash = "sha256:91d6c171862df0a6c61479d9724f22efb6109111017c87567cfeb7b5d1449fdf", size = 268518, upload-time = "2024-10-23T09:48:00.771Z" }, + { url = "https://files.pythonhosted.org/packages/cc/3d/5a7c4dfff1ae57ca2cbbe9041521472ecd9446d49e7044a0e9bfd0200fd0/frozenlist-1.5.0-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:c1fac3e2ace2eb1052e9f7c7db480818371134410e1f5c55d65e8f3ac6d1407e", size = 248114, upload-time = "2024-10-23T09:48:02.625Z" }, + { url = "https://files.pythonhosted.org/packages/f7/41/2342ec4c714349793f1a1e7bd5c4aeec261e24e697fa9a5499350c3a2415/frozenlist-1.5.0-cp38-cp38-win32.whl", hash = "sha256:b97f7b575ab4a8af9b7bc1d2ef7f29d3afee2226bd03ca3875c16451ad5a7723", size = 45648, upload-time = "2024-10-23T09:48:03.895Z" }, + { url = "https://files.pythonhosted.org/packages/0c/90/85bb3547c327f5975078c1be018478d5e8d250a540c828f8f31a35d2a1bd/frozenlist-1.5.0-cp38-cp38-win_amd64.whl", hash = "sha256:374ca2dabdccad8e2a76d40b1d037f5bd16824933bf7bcea3e59c891fd4a0923", size = 51930, upload-time = "2024-10-23T09:48:05.293Z" }, + { url = "https://files.pythonhosted.org/packages/da/4d/d94ff0fb0f5313902c132817c62d19cdc5bdcd0c195d392006ef4b779fc6/frozenlist-1.5.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:9bbcdfaf4af7ce002694a4e10a0159d5a8d20056a12b05b45cea944a4953f972", size = 95319, upload-time = "2024-10-23T09:48:06.405Z" }, + { url = "https://files.pythonhosted.org/packages/8c/1b/d90e554ca2b483d31cb2296e393f72c25bdc38d64526579e95576bfda587/frozenlist-1.5.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:1893f948bf6681733aaccf36c5232c231e3b5166d607c5fa77773611df6dc336", size = 54749, upload-time = "2024-10-23T09:48:07.48Z" }, + { url = "https://files.pythonhosted.org/packages/f8/66/7fdecc9ef49f8db2aa4d9da916e4ecf357d867d87aea292efc11e1b2e932/frozenlist-1.5.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:2b5e23253bb709ef57a8e95e6ae48daa9ac5f265637529e4ce6b003a37b2621f", size = 52718, upload-time = "2024-10-23T09:48:08.725Z" }, + { url = "https://files.pythonhosted.org/packages/08/04/e2fddc92135276e07addbc1cf413acffa0c2d848b3e54cacf684e146df49/frozenlist-1.5.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0f253985bb515ecd89629db13cb58d702035ecd8cfbca7d7a7e29a0e6d39af5f", size = 241756, upload-time = "2024-10-23T09:48:09.843Z" }, + { url = "https://files.pythonhosted.org/packages/c6/52/be5ff200815d8a341aee5b16b6b707355e0ca3652953852238eb92b120c2/frozenlist-1.5.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:04a5c6babd5e8fb7d3c871dc8b321166b80e41b637c31a995ed844a6139942b6", size = 267718, upload-time = "2024-10-23T09:48:11.828Z" }, + { url = "https://files.pythonhosted.org/packages/88/be/4bd93a58be57a3722fc544c36debdf9dcc6758f761092e894d78f18b8f20/frozenlist-1.5.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a9fe0f1c29ba24ba6ff6abf688cb0b7cf1efab6b6aa6adc55441773c252f7411", size = 263494, upload-time = "2024-10-23T09:48:13.424Z" }, + { url = "https://files.pythonhosted.org/packages/32/ba/58348b90193caa096ce9e9befea6ae67f38dabfd3aacb47e46137a6250a8/frozenlist-1.5.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:226d72559fa19babe2ccd920273e767c96a49b9d3d38badd7c91a0fdeda8ea08", size = 232838, upload-time = "2024-10-23T09:48:14.792Z" }, + { url = "https://files.pythonhosted.org/packages/f6/33/9f152105227630246135188901373c4f322cc026565ca6215b063f4c82f4/frozenlist-1.5.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:15b731db116ab3aedec558573c1a5eec78822b32292fe4f2f0345b7f697745c2", size = 242912, upload-time = "2024-10-23T09:48:16.249Z" }, + { url = "https://files.pythonhosted.org/packages/a0/10/3db38fb3ccbafadd80a1b0d6800c987b0e3fe3ef2d117c6ced0246eea17a/frozenlist-1.5.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:366d8f93e3edfe5a918c874702f78faac300209a4d5bf38352b2c1bdc07a766d", size = 244763, upload-time = "2024-10-23T09:48:17.781Z" }, + { url = "https://files.pythonhosted.org/packages/e2/cd/1df468fdce2f66a4608dffe44c40cdc35eeaa67ef7fd1d813f99a9a37842/frozenlist-1.5.0-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:1b96af8c582b94d381a1c1f51ffaedeb77c821c690ea5f01da3d70a487dd0a9b", size = 242841, upload-time = "2024-10-23T09:48:19.507Z" }, + { url = "https://files.pythonhosted.org/packages/ee/5f/16097a5ca0bb6b6779c02cc9379c72fe98d56115d4c54d059fb233168fb6/frozenlist-1.5.0-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:c03eff4a41bd4e38415cbed054bbaff4a075b093e2394b6915dca34a40d1e38b", size = 263407, upload-time = "2024-10-23T09:48:21.467Z" }, + { url = "https://files.pythonhosted.org/packages/0f/f7/58cd220ee1c2248ee65a32f5b4b93689e3fe1764d85537eee9fc392543bc/frozenlist-1.5.0-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:50cf5e7ee9b98f22bdecbabf3800ae78ddcc26e4a435515fc72d97903e8488e0", size = 265083, upload-time = "2024-10-23T09:48:22.725Z" }, + { url = "https://files.pythonhosted.org/packages/62/b8/49768980caabf81ac4a2d156008f7cbd0107e6b36d08a313bb31035d9201/frozenlist-1.5.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:1e76bfbc72353269c44e0bc2cfe171900fbf7f722ad74c9a7b638052afe6a00c", size = 251564, upload-time = "2024-10-23T09:48:24.272Z" }, + { url = "https://files.pythonhosted.org/packages/cb/83/619327da3b86ef957ee7a0cbf3c166a09ed1e87a3f7f1ff487d7d0284683/frozenlist-1.5.0-cp39-cp39-win32.whl", hash = "sha256:666534d15ba8f0fda3f53969117383d5dc021266b3c1a42c9ec4855e4b58b9d3", size = 45691, upload-time = "2024-10-23T09:48:26.317Z" }, + { url = "https://files.pythonhosted.org/packages/8b/28/407bc34a745151ed2322c690b6e7d83d7101472e81ed76e1ebdac0b70a78/frozenlist-1.5.0-cp39-cp39-win_amd64.whl", hash = "sha256:5c28f4b5dbef8a0d8aad0d4de24d1e9e981728628afaf4ea0792f5d0939372f0", size = 51767, upload-time = "2024-10-23T09:48:27.427Z" }, + { url = "https://files.pythonhosted.org/packages/c6/c8/a5be5b7550c10858fcf9b0ea054baccab474da77d37f1e828ce043a3a5d4/frozenlist-1.5.0-py3-none-any.whl", hash = "sha256:d994863bba198a4a518b467bb971c56e1db3f180a25c6cf7bb1949c267f748c3", size = 11901, upload-time = "2024-10-23T09:48:28.851Z" }, +] + +[[package]] +name = "frozenlist" +version = "1.8.0" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version >= '3.14'", + "python_full_version >= '3.11' and python_full_version < '3.14'", + "python_full_version == '3.10.*'", + "python_full_version == '3.9.*'", +] +sdist = { url = "https://files.pythonhosted.org/packages/2d/f5/c831fac6cc817d26fd54c7eaccd04ef7e0288806943f7cc5bbf69f3ac1f0/frozenlist-1.8.0.tar.gz", hash = "sha256:3ede829ed8d842f6cd48fc7081d7a41001a56f1f38603f9d49bf3020d59a31ad", size = 45875, upload-time = "2025-10-06T05:38:17.865Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/83/4a/557715d5047da48d54e659203b9335be7bfaafda2c3f627b7c47e0b3aaf3/frozenlist-1.8.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:b37f6d31b3dcea7deb5e9696e529a6aa4a898adc33db82da12e4c60a7c4d2011", size = 86230, upload-time = "2025-10-06T05:35:23.699Z" }, + { url = "https://files.pythonhosted.org/packages/a2/fb/c85f9fed3ea8fe8740e5b46a59cc141c23b842eca617da8876cfce5f760e/frozenlist-1.8.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:ef2b7b394f208233e471abc541cc6991f907ffd47dc72584acee3147899d6565", size = 49621, upload-time = "2025-10-06T05:35:25.341Z" }, + { url = "https://files.pythonhosted.org/packages/63/70/26ca3f06aace16f2352796b08704338d74b6d1a24ca38f2771afbb7ed915/frozenlist-1.8.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:a88f062f072d1589b7b46e951698950e7da00442fc1cacbe17e19e025dc327ad", size = 49889, upload-time = "2025-10-06T05:35:26.797Z" }, + { url = "https://files.pythonhosted.org/packages/5d/ed/c7895fd2fde7f3ee70d248175f9b6cdf792fb741ab92dc59cd9ef3bd241b/frozenlist-1.8.0-cp310-cp310-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:f57fb59d9f385710aa7060e89410aeb5058b99e62f4d16b08b91986b9a2140c2", size = 219464, upload-time = "2025-10-06T05:35:28.254Z" }, + { url = "https://files.pythonhosted.org/packages/6b/83/4d587dccbfca74cb8b810472392ad62bfa100bf8108c7223eb4c4fa2f7b3/frozenlist-1.8.0-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:799345ab092bee59f01a915620b5d014698547afd011e691a208637312db9186", size = 221649, upload-time = "2025-10-06T05:35:29.454Z" }, + { url = "https://files.pythonhosted.org/packages/6a/c6/fd3b9cd046ec5fff9dab66831083bc2077006a874a2d3d9247dea93ddf7e/frozenlist-1.8.0-cp310-cp310-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:c23c3ff005322a6e16f71bf8692fcf4d5a304aaafe1e262c98c6d4adc7be863e", size = 219188, upload-time = "2025-10-06T05:35:30.951Z" }, + { url = "https://files.pythonhosted.org/packages/ce/80/6693f55eb2e085fc8afb28cf611448fb5b90e98e068fa1d1b8d8e66e5c7d/frozenlist-1.8.0-cp310-cp310-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:8a76ea0f0b9dfa06f254ee06053d93a600865b3274358ca48a352ce4f0798450", size = 231748, upload-time = "2025-10-06T05:35:32.101Z" }, + { url = "https://files.pythonhosted.org/packages/97/d6/e9459f7c5183854abd989ba384fe0cc1a0fb795a83c033f0571ec5933ca4/frozenlist-1.8.0-cp310-cp310-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:c7366fe1418a6133d5aa824ee53d406550110984de7637d65a178010f759c6ef", size = 236351, upload-time = "2025-10-06T05:35:33.834Z" }, + { url = "https://files.pythonhosted.org/packages/97/92/24e97474b65c0262e9ecd076e826bfd1d3074adcc165a256e42e7b8a7249/frozenlist-1.8.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:13d23a45c4cebade99340c4165bd90eeb4a56c6d8a9d8aa49568cac19a6d0dc4", size = 218767, upload-time = "2025-10-06T05:35:35.205Z" }, + { url = "https://files.pythonhosted.org/packages/ee/bf/dc394a097508f15abff383c5108cb8ad880d1f64a725ed3b90d5c2fbf0bb/frozenlist-1.8.0-cp310-cp310-musllinux_1_2_armv7l.whl", hash = "sha256:e4a3408834f65da56c83528fb52ce7911484f0d1eaf7b761fc66001db1646eff", size = 235887, upload-time = "2025-10-06T05:35:36.354Z" }, + { url = "https://files.pythonhosted.org/packages/40/90/25b201b9c015dbc999a5baf475a257010471a1fa8c200c843fd4abbee725/frozenlist-1.8.0-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:42145cd2748ca39f32801dad54aeea10039da6f86e303659db90db1c4b614c8c", size = 228785, upload-time = "2025-10-06T05:35:37.949Z" }, + { url = "https://files.pythonhosted.org/packages/84/f4/b5bc148df03082f05d2dd30c089e269acdbe251ac9a9cf4e727b2dbb8a3d/frozenlist-1.8.0-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:e2de870d16a7a53901e41b64ffdf26f2fbb8917b3e6ebf398098d72c5b20bd7f", size = 230312, upload-time = "2025-10-06T05:35:39.178Z" }, + { url = "https://files.pythonhosted.org/packages/db/4b/87e95b5d15097c302430e647136b7d7ab2398a702390cf4c8601975709e7/frozenlist-1.8.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:20e63c9493d33ee48536600d1a5c95eefc870cd71e7ab037763d1fbb89cc51e7", size = 217650, upload-time = "2025-10-06T05:35:40.377Z" }, + { url = "https://files.pythonhosted.org/packages/e5/70/78a0315d1fea97120591a83e0acd644da638c872f142fd72a6cebee825f3/frozenlist-1.8.0-cp310-cp310-win32.whl", hash = "sha256:adbeebaebae3526afc3c96fad434367cafbfd1b25d72369a9e5858453b1bb71a", size = 39659, upload-time = "2025-10-06T05:35:41.863Z" }, + { url = "https://files.pythonhosted.org/packages/66/aa/3f04523fb189a00e147e60c5b2205126118f216b0aa908035c45336e27e4/frozenlist-1.8.0-cp310-cp310-win_amd64.whl", hash = "sha256:667c3777ca571e5dbeb76f331562ff98b957431df140b54c85fd4d52eea8d8f6", size = 43837, upload-time = "2025-10-06T05:35:43.205Z" }, + { url = "https://files.pythonhosted.org/packages/39/75/1135feecdd7c336938bd55b4dc3b0dfc46d85b9be12ef2628574b28de776/frozenlist-1.8.0-cp310-cp310-win_arm64.whl", hash = "sha256:80f85f0a7cc86e7a54c46d99c9e1318ff01f4687c172ede30fd52d19d1da1c8e", size = 39989, upload-time = "2025-10-06T05:35:44.596Z" }, + { url = "https://files.pythonhosted.org/packages/bc/03/077f869d540370db12165c0aa51640a873fb661d8b315d1d4d67b284d7ac/frozenlist-1.8.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:09474e9831bc2b2199fad6da3c14c7b0fbdd377cce9d3d77131be28906cb7d84", size = 86912, upload-time = "2025-10-06T05:35:45.98Z" }, + { url = "https://files.pythonhosted.org/packages/df/b5/7610b6bd13e4ae77b96ba85abea1c8cb249683217ef09ac9e0ae93f25a91/frozenlist-1.8.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:17c883ab0ab67200b5f964d2b9ed6b00971917d5d8a92df149dc2c9779208ee9", size = 50046, upload-time = "2025-10-06T05:35:47.009Z" }, + { url = "https://files.pythonhosted.org/packages/6e/ef/0e8f1fe32f8a53dd26bdd1f9347efe0778b0fddf62789ea683f4cc7d787d/frozenlist-1.8.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:fa47e444b8ba08fffd1c18e8cdb9a75db1b6a27f17507522834ad13ed5922b93", size = 50119, upload-time = "2025-10-06T05:35:48.38Z" }, + { url = "https://files.pythonhosted.org/packages/11/b1/71a477adc7c36e5fb628245dfbdea2166feae310757dea848d02bd0689fd/frozenlist-1.8.0-cp311-cp311-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:2552f44204b744fba866e573be4c1f9048d6a324dfe14475103fd51613eb1d1f", size = 231067, upload-time = "2025-10-06T05:35:49.97Z" }, + { url = "https://files.pythonhosted.org/packages/45/7e/afe40eca3a2dc19b9904c0f5d7edfe82b5304cb831391edec0ac04af94c2/frozenlist-1.8.0-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:957e7c38f250991e48a9a73e6423db1bb9dd14e722a10f6b8bb8e16a0f55f695", size = 233160, upload-time = "2025-10-06T05:35:51.729Z" }, + { url = "https://files.pythonhosted.org/packages/a6/aa/7416eac95603ce428679d273255ffc7c998d4132cfae200103f164b108aa/frozenlist-1.8.0-cp311-cp311-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:8585e3bb2cdea02fc88ffa245069c36555557ad3609e83be0ec71f54fd4abb52", size = 228544, upload-time = "2025-10-06T05:35:53.246Z" }, + { url = "https://files.pythonhosted.org/packages/8b/3d/2a2d1f683d55ac7e3875e4263d28410063e738384d3adc294f5ff3d7105e/frozenlist-1.8.0-cp311-cp311-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:edee74874ce20a373d62dc28b0b18b93f645633c2943fd90ee9d898550770581", size = 243797, upload-time = "2025-10-06T05:35:54.497Z" }, + { url = "https://files.pythonhosted.org/packages/78/1e/2d5565b589e580c296d3bb54da08d206e797d941a83a6fdea42af23be79c/frozenlist-1.8.0-cp311-cp311-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:c9a63152fe95756b85f31186bddf42e4c02c6321207fd6601a1c89ebac4fe567", size = 247923, upload-time = "2025-10-06T05:35:55.861Z" }, + { url = "https://files.pythonhosted.org/packages/aa/c3/65872fcf1d326a7f101ad4d86285c403c87be7d832b7470b77f6d2ed5ddc/frozenlist-1.8.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:b6db2185db9be0a04fecf2f241c70b63b1a242e2805be291855078f2b404dd6b", size = 230886, upload-time = "2025-10-06T05:35:57.399Z" }, + { url = "https://files.pythonhosted.org/packages/a0/76/ac9ced601d62f6956f03cc794f9e04c81719509f85255abf96e2510f4265/frozenlist-1.8.0-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:f4be2e3d8bc8aabd566f8d5b8ba7ecc09249d74ba3c9ed52e54dc23a293f0b92", size = 245731, upload-time = "2025-10-06T05:35:58.563Z" }, + { url = "https://files.pythonhosted.org/packages/b9/49/ecccb5f2598daf0b4a1415497eba4c33c1e8ce07495eb07d2860c731b8d5/frozenlist-1.8.0-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:c8d1634419f39ea6f5c427ea2f90ca85126b54b50837f31497f3bf38266e853d", size = 241544, upload-time = "2025-10-06T05:35:59.719Z" }, + { url = "https://files.pythonhosted.org/packages/53/4b/ddf24113323c0bbcc54cb38c8b8916f1da7165e07b8e24a717b4a12cbf10/frozenlist-1.8.0-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:1a7fa382a4a223773ed64242dbe1c9c326ec09457e6b8428efb4118c685c3dfd", size = 241806, upload-time = "2025-10-06T05:36:00.959Z" }, + { url = "https://files.pythonhosted.org/packages/a7/fb/9b9a084d73c67175484ba2789a59f8eebebd0827d186a8102005ce41e1ba/frozenlist-1.8.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:11847b53d722050808926e785df837353bd4d75f1d494377e59b23594d834967", size = 229382, upload-time = "2025-10-06T05:36:02.22Z" }, + { url = "https://files.pythonhosted.org/packages/95/a3/c8fb25aac55bf5e12dae5c5aa6a98f85d436c1dc658f21c3ac73f9fa95e5/frozenlist-1.8.0-cp311-cp311-win32.whl", hash = "sha256:27c6e8077956cf73eadd514be8fb04d77fc946a7fe9f7fe167648b0b9085cc25", size = 39647, upload-time = "2025-10-06T05:36:03.409Z" }, + { url = "https://files.pythonhosted.org/packages/0a/f5/603d0d6a02cfd4c8f2a095a54672b3cf967ad688a60fb9faf04fc4887f65/frozenlist-1.8.0-cp311-cp311-win_amd64.whl", hash = "sha256:ac913f8403b36a2c8610bbfd25b8013488533e71e62b4b4adce9c86c8cea905b", size = 44064, upload-time = "2025-10-06T05:36:04.368Z" }, + { url = "https://files.pythonhosted.org/packages/5d/16/c2c9ab44e181f043a86f9a8f84d5124b62dbcb3a02c0977ec72b9ac1d3e0/frozenlist-1.8.0-cp311-cp311-win_arm64.whl", hash = "sha256:d4d3214a0f8394edfa3e303136d0575eece0745ff2b47bd2cb2e66dd92d4351a", size = 39937, upload-time = "2025-10-06T05:36:05.669Z" }, + { url = "https://files.pythonhosted.org/packages/69/29/948b9aa87e75820a38650af445d2ef2b6b8a6fab1a23b6bb9e4ef0be2d59/frozenlist-1.8.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:78f7b9e5d6f2fdb88cdde9440dc147259b62b9d3b019924def9f6478be254ac1", size = 87782, upload-time = "2025-10-06T05:36:06.649Z" }, + { url = "https://files.pythonhosted.org/packages/64/80/4f6e318ee2a7c0750ed724fa33a4bdf1eacdc5a39a7a24e818a773cd91af/frozenlist-1.8.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:229bf37d2e4acdaf808fd3f06e854a4a7a3661e871b10dc1f8f1896a3b05f18b", size = 50594, upload-time = "2025-10-06T05:36:07.69Z" }, + { url = "https://files.pythonhosted.org/packages/2b/94/5c8a2b50a496b11dd519f4a24cb5496cf125681dd99e94c604ccdea9419a/frozenlist-1.8.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:f833670942247a14eafbb675458b4e61c82e002a148f49e68257b79296e865c4", size = 50448, upload-time = "2025-10-06T05:36:08.78Z" }, + { url = "https://files.pythonhosted.org/packages/6a/bd/d91c5e39f490a49df14320f4e8c80161cfcce09f1e2cde1edd16a551abb3/frozenlist-1.8.0-cp312-cp312-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:494a5952b1c597ba44e0e78113a7266e656b9794eec897b19ead706bd7074383", size = 242411, upload-time = "2025-10-06T05:36:09.801Z" }, + { url = "https://files.pythonhosted.org/packages/8f/83/f61505a05109ef3293dfb1ff594d13d64a2324ac3482be2cedc2be818256/frozenlist-1.8.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:96f423a119f4777a4a056b66ce11527366a8bb92f54e541ade21f2374433f6d4", size = 243014, upload-time = "2025-10-06T05:36:11.394Z" }, + { url = "https://files.pythonhosted.org/packages/d8/cb/cb6c7b0f7d4023ddda30cf56b8b17494eb3a79e3fda666bf735f63118b35/frozenlist-1.8.0-cp312-cp312-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:3462dd9475af2025c31cc61be6652dfa25cbfb56cbbf52f4ccfe029f38decaf8", size = 234909, upload-time = "2025-10-06T05:36:12.598Z" }, + { url = "https://files.pythonhosted.org/packages/31/c5/cd7a1f3b8b34af009fb17d4123c5a778b44ae2804e3ad6b86204255f9ec5/frozenlist-1.8.0-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:c4c800524c9cd9bac5166cd6f55285957fcfc907db323e193f2afcd4d9abd69b", size = 250049, upload-time = "2025-10-06T05:36:14.065Z" }, + { url = "https://files.pythonhosted.org/packages/c0/01/2f95d3b416c584a1e7f0e1d6d31998c4a795f7544069ee2e0962a4b60740/frozenlist-1.8.0-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:d6a5df73acd3399d893dafc71663ad22534b5aa4f94e8a2fabfe856c3c1b6a52", size = 256485, upload-time = "2025-10-06T05:36:15.39Z" }, + { url = "https://files.pythonhosted.org/packages/ce/03/024bf7720b3abaebcff6d0793d73c154237b85bdf67b7ed55e5e9596dc9a/frozenlist-1.8.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:405e8fe955c2280ce66428b3ca55e12b3c4e9c336fb2103a4937e891c69a4a29", size = 237619, upload-time = "2025-10-06T05:36:16.558Z" }, + { url = "https://files.pythonhosted.org/packages/69/fa/f8abdfe7d76b731f5d8bd217827cf6764d4f1d9763407e42717b4bed50a0/frozenlist-1.8.0-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:908bd3f6439f2fef9e85031b59fd4f1297af54415fb60e4254a95f75b3cab3f3", size = 250320, upload-time = "2025-10-06T05:36:17.821Z" }, + { url = "https://files.pythonhosted.org/packages/f5/3c/b051329f718b463b22613e269ad72138cc256c540f78a6de89452803a47d/frozenlist-1.8.0-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:294e487f9ec720bd8ffcebc99d575f7eff3568a08a253d1ee1a0378754b74143", size = 246820, upload-time = "2025-10-06T05:36:19.046Z" }, + { url = "https://files.pythonhosted.org/packages/0f/ae/58282e8f98e444b3f4dd42448ff36fa38bef29e40d40f330b22e7108f565/frozenlist-1.8.0-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:74c51543498289c0c43656701be6b077f4b265868fa7f8a8859c197006efb608", size = 250518, upload-time = "2025-10-06T05:36:20.763Z" }, + { url = "https://files.pythonhosted.org/packages/8f/96/007e5944694d66123183845a106547a15944fbbb7154788cbf7272789536/frozenlist-1.8.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:776f352e8329135506a1d6bf16ac3f87bc25b28e765949282dcc627af36123aa", size = 239096, upload-time = "2025-10-06T05:36:22.129Z" }, + { url = "https://files.pythonhosted.org/packages/66/bb/852b9d6db2fa40be96f29c0d1205c306288f0684df8fd26ca1951d461a56/frozenlist-1.8.0-cp312-cp312-win32.whl", hash = "sha256:433403ae80709741ce34038da08511d4a77062aa924baf411ef73d1146e74faf", size = 39985, upload-time = "2025-10-06T05:36:23.661Z" }, + { url = "https://files.pythonhosted.org/packages/b8/af/38e51a553dd66eb064cdf193841f16f077585d4d28394c2fa6235cb41765/frozenlist-1.8.0-cp312-cp312-win_amd64.whl", hash = "sha256:34187385b08f866104f0c0617404c8eb08165ab1272e884abc89c112e9c00746", size = 44591, upload-time = "2025-10-06T05:36:24.958Z" }, + { url = "https://files.pythonhosted.org/packages/a7/06/1dc65480ab147339fecc70797e9c2f69d9cea9cf38934ce08df070fdb9cb/frozenlist-1.8.0-cp312-cp312-win_arm64.whl", hash = "sha256:fe3c58d2f5db5fbd18c2987cba06d51b0529f52bc3a6cdc33d3f4eab725104bd", size = 40102, upload-time = "2025-10-06T05:36:26.333Z" }, + { url = "https://files.pythonhosted.org/packages/2d/40/0832c31a37d60f60ed79e9dfb5a92e1e2af4f40a16a29abcc7992af9edff/frozenlist-1.8.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:8d92f1a84bb12d9e56f818b3a746f3efba93c1b63c8387a73dde655e1e42282a", size = 85717, upload-time = "2025-10-06T05:36:27.341Z" }, + { url = "https://files.pythonhosted.org/packages/30/ba/b0b3de23f40bc55a7057bd38434e25c34fa48e17f20ee273bbde5e0650f3/frozenlist-1.8.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:96153e77a591c8adc2ee805756c61f59fef4cf4073a9275ee86fe8cba41241f7", size = 49651, upload-time = "2025-10-06T05:36:28.855Z" }, + { url = "https://files.pythonhosted.org/packages/0c/ab/6e5080ee374f875296c4243c381bbdef97a9ac39c6e3ce1d5f7d42cb78d6/frozenlist-1.8.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:f21f00a91358803399890ab167098c131ec2ddd5f8f5fd5fe9c9f2c6fcd91e40", size = 49417, upload-time = "2025-10-06T05:36:29.877Z" }, + { url = "https://files.pythonhosted.org/packages/d5/4e/e4691508f9477ce67da2015d8c00acd751e6287739123113a9fca6f1604e/frozenlist-1.8.0-cp313-cp313-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:fb30f9626572a76dfe4293c7194a09fb1fe93ba94c7d4f720dfae3b646b45027", size = 234391, upload-time = "2025-10-06T05:36:31.301Z" }, + { url = "https://files.pythonhosted.org/packages/40/76/c202df58e3acdf12969a7895fd6f3bc016c642e6726aa63bd3025e0fc71c/frozenlist-1.8.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:eaa352d7047a31d87dafcacbabe89df0aa506abb5b1b85a2fb91bc3faa02d822", size = 233048, upload-time = "2025-10-06T05:36:32.531Z" }, + { url = "https://files.pythonhosted.org/packages/f9/c0/8746afb90f17b73ca5979c7a3958116e105ff796e718575175319b5bb4ce/frozenlist-1.8.0-cp313-cp313-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:03ae967b4e297f58f8c774c7eabcce57fe3c2434817d4385c50661845a058121", size = 226549, upload-time = "2025-10-06T05:36:33.706Z" }, + { url = "https://files.pythonhosted.org/packages/7e/eb/4c7eefc718ff72f9b6c4893291abaae5fbc0c82226a32dcd8ef4f7a5dbef/frozenlist-1.8.0-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:f6292f1de555ffcc675941d65fffffb0a5bcd992905015f85d0592201793e0e5", size = 239833, upload-time = "2025-10-06T05:36:34.947Z" }, + { url = "https://files.pythonhosted.org/packages/c2/4e/e5c02187cf704224f8b21bee886f3d713ca379535f16893233b9d672ea71/frozenlist-1.8.0-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:29548f9b5b5e3460ce7378144c3010363d8035cea44bc0bf02d57f5a685e084e", size = 245363, upload-time = "2025-10-06T05:36:36.534Z" }, + { url = "https://files.pythonhosted.org/packages/1f/96/cb85ec608464472e82ad37a17f844889c36100eed57bea094518bf270692/frozenlist-1.8.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:ec3cc8c5d4084591b4237c0a272cc4f50a5b03396a47d9caaf76f5d7b38a4f11", size = 229314, upload-time = "2025-10-06T05:36:38.582Z" }, + { url = "https://files.pythonhosted.org/packages/5d/6f/4ae69c550e4cee66b57887daeebe006fe985917c01d0fff9caab9883f6d0/frozenlist-1.8.0-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:517279f58009d0b1f2e7c1b130b377a349405da3f7621ed6bfae50b10adf20c1", size = 243365, upload-time = "2025-10-06T05:36:40.152Z" }, + { url = "https://files.pythonhosted.org/packages/7a/58/afd56de246cf11780a40a2c28dc7cbabbf06337cc8ddb1c780a2d97e88d8/frozenlist-1.8.0-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:db1e72ede2d0d7ccb213f218df6a078a9c09a7de257c2fe8fcef16d5925230b1", size = 237763, upload-time = "2025-10-06T05:36:41.355Z" }, + { url = "https://files.pythonhosted.org/packages/cb/36/cdfaf6ed42e2644740d4a10452d8e97fa1c062e2a8006e4b09f1b5fd7d63/frozenlist-1.8.0-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:b4dec9482a65c54a5044486847b8a66bf10c9cb4926d42927ec4e8fd5db7fed8", size = 240110, upload-time = "2025-10-06T05:36:42.716Z" }, + { url = "https://files.pythonhosted.org/packages/03/a8/9ea226fbefad669f11b52e864c55f0bd57d3c8d7eb07e9f2e9a0b39502e1/frozenlist-1.8.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:21900c48ae04d13d416f0e1e0c4d81f7931f73a9dfa0b7a8746fb2fe7dd970ed", size = 233717, upload-time = "2025-10-06T05:36:44.251Z" }, + { url = "https://files.pythonhosted.org/packages/1e/0b/1b5531611e83ba7d13ccc9988967ea1b51186af64c42b7a7af465dcc9568/frozenlist-1.8.0-cp313-cp313-win32.whl", hash = "sha256:8b7b94a067d1c504ee0b16def57ad5738701e4ba10cec90529f13fa03c833496", size = 39628, upload-time = "2025-10-06T05:36:45.423Z" }, + { url = "https://files.pythonhosted.org/packages/d8/cf/174c91dbc9cc49bc7b7aab74d8b734e974d1faa8f191c74af9b7e80848e6/frozenlist-1.8.0-cp313-cp313-win_amd64.whl", hash = "sha256:878be833caa6a3821caf85eb39c5ba92d28e85df26d57afb06b35b2efd937231", size = 43882, upload-time = "2025-10-06T05:36:46.796Z" }, + { url = "https://files.pythonhosted.org/packages/c1/17/502cd212cbfa96eb1388614fe39a3fc9ab87dbbe042b66f97acb57474834/frozenlist-1.8.0-cp313-cp313-win_arm64.whl", hash = "sha256:44389d135b3ff43ba8cc89ff7f51f5a0bb6b63d829c8300f79a2fe4fe61bcc62", size = 39676, upload-time = "2025-10-06T05:36:47.8Z" }, + { url = "https://files.pythonhosted.org/packages/d2/5c/3bbfaa920dfab09e76946a5d2833a7cbdf7b9b4a91c714666ac4855b88b4/frozenlist-1.8.0-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:e25ac20a2ef37e91c1b39938b591457666a0fa835c7783c3a8f33ea42870db94", size = 89235, upload-time = "2025-10-06T05:36:48.78Z" }, + { url = "https://files.pythonhosted.org/packages/d2/d6/f03961ef72166cec1687e84e8925838442b615bd0b8854b54923ce5b7b8a/frozenlist-1.8.0-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:07cdca25a91a4386d2e76ad992916a85038a9b97561bf7a3fd12d5d9ce31870c", size = 50742, upload-time = "2025-10-06T05:36:49.837Z" }, + { url = "https://files.pythonhosted.org/packages/1e/bb/a6d12b7ba4c3337667d0e421f7181c82dda448ce4e7ad7ecd249a16fa806/frozenlist-1.8.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:4e0c11f2cc6717e0a741f84a527c52616140741cd812a50422f83dc31749fb52", size = 51725, upload-time = "2025-10-06T05:36:50.851Z" }, + { url = "https://files.pythonhosted.org/packages/bc/71/d1fed0ffe2c2ccd70b43714c6cab0f4188f09f8a67a7914a6b46ee30f274/frozenlist-1.8.0-cp313-cp313t-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:b3210649ee28062ea6099cfda39e147fa1bc039583c8ee4481cb7811e2448c51", size = 284533, upload-time = "2025-10-06T05:36:51.898Z" }, + { url = "https://files.pythonhosted.org/packages/c9/1f/fb1685a7b009d89f9bf78a42d94461bc06581f6e718c39344754a5d9bada/frozenlist-1.8.0-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:581ef5194c48035a7de2aefc72ac6539823bb71508189e5de01d60c9dcd5fa65", size = 292506, upload-time = "2025-10-06T05:36:53.101Z" }, + { url = "https://files.pythonhosted.org/packages/e6/3b/b991fe1612703f7e0d05c0cf734c1b77aaf7c7d321df4572e8d36e7048c8/frozenlist-1.8.0-cp313-cp313t-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:3ef2d026f16a2b1866e1d86fc4e1291e1ed8a387b2c333809419a2f8b3a77b82", size = 274161, upload-time = "2025-10-06T05:36:54.309Z" }, + { url = "https://files.pythonhosted.org/packages/ca/ec/c5c618767bcdf66e88945ec0157d7f6c4a1322f1473392319b7a2501ded7/frozenlist-1.8.0-cp313-cp313t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:5500ef82073f599ac84d888e3a8c1f77ac831183244bfd7f11eaa0289fb30714", size = 294676, upload-time = "2025-10-06T05:36:55.566Z" }, + { url = "https://files.pythonhosted.org/packages/7c/ce/3934758637d8f8a88d11f0585d6495ef54b2044ed6ec84492a91fa3b27aa/frozenlist-1.8.0-cp313-cp313t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:50066c3997d0091c411a66e710f4e11752251e6d2d73d70d8d5d4c76442a199d", size = 300638, upload-time = "2025-10-06T05:36:56.758Z" }, + { url = "https://files.pythonhosted.org/packages/fc/4f/a7e4d0d467298f42de4b41cbc7ddaf19d3cfeabaf9ff97c20c6c7ee409f9/frozenlist-1.8.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:5c1c8e78426e59b3f8005e9b19f6ff46e5845895adbde20ece9218319eca6506", size = 283067, upload-time = "2025-10-06T05:36:57.965Z" }, + { url = "https://files.pythonhosted.org/packages/dc/48/c7b163063d55a83772b268e6d1affb960771b0e203b632cfe09522d67ea5/frozenlist-1.8.0-cp313-cp313t-musllinux_1_2_armv7l.whl", hash = "sha256:eefdba20de0d938cec6a89bd4d70f346a03108a19b9df4248d3cf0d88f1b0f51", size = 292101, upload-time = "2025-10-06T05:36:59.237Z" }, + { url = "https://files.pythonhosted.org/packages/9f/d0/2366d3c4ecdc2fd391e0afa6e11500bfba0ea772764d631bbf82f0136c9d/frozenlist-1.8.0-cp313-cp313t-musllinux_1_2_ppc64le.whl", hash = "sha256:cf253e0e1c3ceb4aaff6df637ce033ff6535fb8c70a764a8f46aafd3d6ab798e", size = 289901, upload-time = "2025-10-06T05:37:00.811Z" }, + { url = "https://files.pythonhosted.org/packages/b8/94/daff920e82c1b70e3618a2ac39fbc01ae3e2ff6124e80739ce5d71c9b920/frozenlist-1.8.0-cp313-cp313t-musllinux_1_2_s390x.whl", hash = "sha256:032efa2674356903cd0261c4317a561a6850f3ac864a63fc1583147fb05a79b0", size = 289395, upload-time = "2025-10-06T05:37:02.115Z" }, + { url = "https://files.pythonhosted.org/packages/e3/20/bba307ab4235a09fdcd3cc5508dbabd17c4634a1af4b96e0f69bfe551ebd/frozenlist-1.8.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:6da155091429aeba16851ecb10a9104a108bcd32f6c1642867eadaee401c1c41", size = 283659, upload-time = "2025-10-06T05:37:03.711Z" }, + { url = "https://files.pythonhosted.org/packages/fd/00/04ca1c3a7a124b6de4f8a9a17cc2fcad138b4608e7a3fc5877804b8715d7/frozenlist-1.8.0-cp313-cp313t-win32.whl", hash = "sha256:0f96534f8bfebc1a394209427d0f8a63d343c9779cda6fc25e8e121b5fd8555b", size = 43492, upload-time = "2025-10-06T05:37:04.915Z" }, + { url = "https://files.pythonhosted.org/packages/59/5e/c69f733a86a94ab10f68e496dc6b7e8bc078ebb415281d5698313e3af3a1/frozenlist-1.8.0-cp313-cp313t-win_amd64.whl", hash = "sha256:5d63a068f978fc69421fb0e6eb91a9603187527c86b7cd3f534a5b77a592b888", size = 48034, upload-time = "2025-10-06T05:37:06.343Z" }, + { url = "https://files.pythonhosted.org/packages/16/6c/be9d79775d8abe79b05fa6d23da99ad6e7763a1d080fbae7290b286093fd/frozenlist-1.8.0-cp313-cp313t-win_arm64.whl", hash = "sha256:bf0a7e10b077bf5fb9380ad3ae8ce20ef919a6ad93b4552896419ac7e1d8e042", size = 41749, upload-time = "2025-10-06T05:37:07.431Z" }, + { url = "https://files.pythonhosted.org/packages/f1/c8/85da824b7e7b9b6e7f7705b2ecaf9591ba6f79c1177f324c2735e41d36a2/frozenlist-1.8.0-cp314-cp314-macosx_10_13_universal2.whl", hash = "sha256:cee686f1f4cadeb2136007ddedd0aaf928ab95216e7691c63e50a8ec066336d0", size = 86127, upload-time = "2025-10-06T05:37:08.438Z" }, + { url = "https://files.pythonhosted.org/packages/8e/e8/a1185e236ec66c20afd72399522f142c3724c785789255202d27ae992818/frozenlist-1.8.0-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:119fb2a1bd47307e899c2fac7f28e85b9a543864df47aa7ec9d3c1b4545f096f", size = 49698, upload-time = "2025-10-06T05:37:09.48Z" }, + { url = "https://files.pythonhosted.org/packages/a1/93/72b1736d68f03fda5fdf0f2180fb6caaae3894f1b854d006ac61ecc727ee/frozenlist-1.8.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:4970ece02dbc8c3a92fcc5228e36a3e933a01a999f7094ff7c23fbd2beeaa67c", size = 49749, upload-time = "2025-10-06T05:37:10.569Z" }, + { url = "https://files.pythonhosted.org/packages/a7/b2/fabede9fafd976b991e9f1b9c8c873ed86f202889b864756f240ce6dd855/frozenlist-1.8.0-cp314-cp314-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:cba69cb73723c3f329622e34bdbf5ce1f80c21c290ff04256cff1cd3c2036ed2", size = 231298, upload-time = "2025-10-06T05:37:11.993Z" }, + { url = "https://files.pythonhosted.org/packages/3a/3b/d9b1e0b0eed36e70477ffb8360c49c85c8ca8ef9700a4e6711f39a6e8b45/frozenlist-1.8.0-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:778a11b15673f6f1df23d9586f83c4846c471a8af693a22e066508b77d201ec8", size = 232015, upload-time = "2025-10-06T05:37:13.194Z" }, + { url = "https://files.pythonhosted.org/packages/dc/94/be719d2766c1138148564a3960fc2c06eb688da592bdc25adcf856101be7/frozenlist-1.8.0-cp314-cp314-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:0325024fe97f94c41c08872db482cf8ac4800d80e79222c6b0b7b162d5b13686", size = 225038, upload-time = "2025-10-06T05:37:14.577Z" }, + { url = "https://files.pythonhosted.org/packages/e4/09/6712b6c5465f083f52f50cf74167b92d4ea2f50e46a9eea0523d658454ae/frozenlist-1.8.0-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:97260ff46b207a82a7567b581ab4190bd4dfa09f4db8a8b49d1a958f6aa4940e", size = 240130, upload-time = "2025-10-06T05:37:15.781Z" }, + { url = "https://files.pythonhosted.org/packages/f8/d4/cd065cdcf21550b54f3ce6a22e143ac9e4836ca42a0de1022da8498eac89/frozenlist-1.8.0-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:54b2077180eb7f83dd52c40b2750d0a9f175e06a42e3213ce047219de902717a", size = 242845, upload-time = "2025-10-06T05:37:17.037Z" }, + { url = "https://files.pythonhosted.org/packages/62/c3/f57a5c8c70cd1ead3d5d5f776f89d33110b1addae0ab010ad774d9a44fb9/frozenlist-1.8.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:2f05983daecab868a31e1da44462873306d3cbfd76d1f0b5b69c473d21dbb128", size = 229131, upload-time = "2025-10-06T05:37:18.221Z" }, + { url = "https://files.pythonhosted.org/packages/6c/52/232476fe9cb64f0742f3fde2b7d26c1dac18b6d62071c74d4ded55e0ef94/frozenlist-1.8.0-cp314-cp314-musllinux_1_2_armv7l.whl", hash = "sha256:33f48f51a446114bc5d251fb2954ab0164d5be02ad3382abcbfe07e2531d650f", size = 240542, upload-time = "2025-10-06T05:37:19.771Z" }, + { url = "https://files.pythonhosted.org/packages/5f/85/07bf3f5d0fb5414aee5f47d33c6f5c77bfe49aac680bfece33d4fdf6a246/frozenlist-1.8.0-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:154e55ec0655291b5dd1b8731c637ecdb50975a2ae70c606d100750a540082f7", size = 237308, upload-time = "2025-10-06T05:37:20.969Z" }, + { url = "https://files.pythonhosted.org/packages/11/99/ae3a33d5befd41ac0ca2cc7fd3aa707c9c324de2e89db0e0f45db9a64c26/frozenlist-1.8.0-cp314-cp314-musllinux_1_2_s390x.whl", hash = "sha256:4314debad13beb564b708b4a496020e5306c7333fa9a3ab90374169a20ffab30", size = 238210, upload-time = "2025-10-06T05:37:22.252Z" }, + { url = "https://files.pythonhosted.org/packages/b2/60/b1d2da22f4970e7a155f0adde9b1435712ece01b3cd45ba63702aea33938/frozenlist-1.8.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:073f8bf8becba60aa931eb3bc420b217bb7d5b8f4750e6f8b3be7f3da85d38b7", size = 231972, upload-time = "2025-10-06T05:37:23.5Z" }, + { url = "https://files.pythonhosted.org/packages/3f/ab/945b2f32de889993b9c9133216c068b7fcf257d8595a0ac420ac8677cab0/frozenlist-1.8.0-cp314-cp314-win32.whl", hash = "sha256:bac9c42ba2ac65ddc115d930c78d24ab8d4f465fd3fc473cdedfccadb9429806", size = 40536, upload-time = "2025-10-06T05:37:25.581Z" }, + { url = "https://files.pythonhosted.org/packages/59/ad/9caa9b9c836d9ad6f067157a531ac48b7d36499f5036d4141ce78c230b1b/frozenlist-1.8.0-cp314-cp314-win_amd64.whl", hash = "sha256:3e0761f4d1a44f1d1a47996511752cf3dcec5bbdd9cc2b4fe595caf97754b7a0", size = 44330, upload-time = "2025-10-06T05:37:26.928Z" }, + { url = "https://files.pythonhosted.org/packages/82/13/e6950121764f2676f43534c555249f57030150260aee9dcf7d64efda11dd/frozenlist-1.8.0-cp314-cp314-win_arm64.whl", hash = "sha256:d1eaff1d00c7751b7c6662e9c5ba6eb2c17a2306ba5e2a37f24ddf3cc953402b", size = 40627, upload-time = "2025-10-06T05:37:28.075Z" }, + { url = "https://files.pythonhosted.org/packages/c0/c7/43200656ecc4e02d3f8bc248df68256cd9572b3f0017f0a0c4e93440ae23/frozenlist-1.8.0-cp314-cp314t-macosx_10_13_universal2.whl", hash = "sha256:d3bb933317c52d7ea5004a1c442eef86f426886fba134ef8cf4226ea6ee1821d", size = 89238, upload-time = "2025-10-06T05:37:29.373Z" }, + { url = "https://files.pythonhosted.org/packages/d1/29/55c5f0689b9c0fb765055629f472c0de484dcaf0acee2f7707266ae3583c/frozenlist-1.8.0-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:8009897cdef112072f93a0efdce29cd819e717fd2f649ee3016efd3cd885a7ed", size = 50738, upload-time = "2025-10-06T05:37:30.792Z" }, + { url = "https://files.pythonhosted.org/packages/ba/7d/b7282a445956506fa11da8c2db7d276adcbf2b17d8bb8407a47685263f90/frozenlist-1.8.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:2c5dcbbc55383e5883246d11fd179782a9d07a986c40f49abe89ddf865913930", size = 51739, upload-time = "2025-10-06T05:37:32.127Z" }, + { url = "https://files.pythonhosted.org/packages/62/1c/3d8622e60d0b767a5510d1d3cf21065b9db874696a51ea6d7a43180a259c/frozenlist-1.8.0-cp314-cp314t-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:39ecbc32f1390387d2aa4f5a995e465e9e2f79ba3adcac92d68e3e0afae6657c", size = 284186, upload-time = "2025-10-06T05:37:33.21Z" }, + { url = "https://files.pythonhosted.org/packages/2d/14/aa36d5f85a89679a85a1d44cd7a6657e0b1c75f61e7cad987b203d2daca8/frozenlist-1.8.0-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:92db2bf818d5cc8d9c1f1fc56b897662e24ea5adb36ad1f1d82875bd64e03c24", size = 292196, upload-time = "2025-10-06T05:37:36.107Z" }, + { url = "https://files.pythonhosted.org/packages/05/23/6bde59eb55abd407d34f77d39a5126fb7b4f109a3f611d3929f14b700c66/frozenlist-1.8.0-cp314-cp314t-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:2dc43a022e555de94c3b68a4ef0b11c4f747d12c024a520c7101709a2144fb37", size = 273830, upload-time = "2025-10-06T05:37:37.663Z" }, + { url = "https://files.pythonhosted.org/packages/d2/3f/22cff331bfad7a8afa616289000ba793347fcd7bc275f3b28ecea2a27909/frozenlist-1.8.0-cp314-cp314t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:cb89a7f2de3602cfed448095bab3f178399646ab7c61454315089787df07733a", size = 294289, upload-time = "2025-10-06T05:37:39.261Z" }, + { url = "https://files.pythonhosted.org/packages/a4/89/5b057c799de4838b6c69aa82b79705f2027615e01be996d2486a69ca99c4/frozenlist-1.8.0-cp314-cp314t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:33139dc858c580ea50e7e60a1b0ea003efa1fd42e6ec7fdbad78fff65fad2fd2", size = 300318, upload-time = "2025-10-06T05:37:43.213Z" }, + { url = "https://files.pythonhosted.org/packages/30/de/2c22ab3eb2a8af6d69dc799e48455813bab3690c760de58e1bf43b36da3e/frozenlist-1.8.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:168c0969a329b416119507ba30b9ea13688fafffac1b7822802537569a1cb0ef", size = 282814, upload-time = "2025-10-06T05:37:45.337Z" }, + { url = "https://files.pythonhosted.org/packages/59/f7/970141a6a8dbd7f556d94977858cfb36fa9b66e0892c6dd780d2219d8cd8/frozenlist-1.8.0-cp314-cp314t-musllinux_1_2_armv7l.whl", hash = "sha256:28bd570e8e189d7f7b001966435f9dac6718324b5be2990ac496cf1ea9ddb7fe", size = 291762, upload-time = "2025-10-06T05:37:46.657Z" }, + { url = "https://files.pythonhosted.org/packages/c1/15/ca1adae83a719f82df9116d66f5bb28bb95557b3951903d39135620ef157/frozenlist-1.8.0-cp314-cp314t-musllinux_1_2_ppc64le.whl", hash = "sha256:b2a095d45c5d46e5e79ba1e5b9cb787f541a8dee0433836cea4b96a2c439dcd8", size = 289470, upload-time = "2025-10-06T05:37:47.946Z" }, + { url = "https://files.pythonhosted.org/packages/ac/83/dca6dc53bf657d371fbc88ddeb21b79891e747189c5de990b9dfff2ccba1/frozenlist-1.8.0-cp314-cp314t-musllinux_1_2_s390x.whl", hash = "sha256:eab8145831a0d56ec9c4139b6c3e594c7a83c2c8be25d5bcf2d86136a532287a", size = 289042, upload-time = "2025-10-06T05:37:49.499Z" }, + { url = "https://files.pythonhosted.org/packages/96/52/abddd34ca99be142f354398700536c5bd315880ed0a213812bc491cff5e4/frozenlist-1.8.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:974b28cf63cc99dfb2188d8d222bc6843656188164848c4f679e63dae4b0708e", size = 283148, upload-time = "2025-10-06T05:37:50.745Z" }, + { url = "https://files.pythonhosted.org/packages/af/d3/76bd4ed4317e7119c2b7f57c3f6934aba26d277acc6309f873341640e21f/frozenlist-1.8.0-cp314-cp314t-win32.whl", hash = "sha256:342c97bf697ac5480c0a7ec73cd700ecfa5a8a40ac923bd035484616efecc2df", size = 44676, upload-time = "2025-10-06T05:37:52.222Z" }, + { url = "https://files.pythonhosted.org/packages/89/76/c615883b7b521ead2944bb3480398cbb07e12b7b4e4d073d3752eb721558/frozenlist-1.8.0-cp314-cp314t-win_amd64.whl", hash = "sha256:06be8f67f39c8b1dc671f5d83aaefd3358ae5cdcf8314552c57e7ed3e6475bdd", size = 49451, upload-time = "2025-10-06T05:37:53.425Z" }, + { url = "https://files.pythonhosted.org/packages/e0/a3/5982da14e113d07b325230f95060e2169f5311b1017ea8af2a29b374c289/frozenlist-1.8.0-cp314-cp314t-win_arm64.whl", hash = "sha256:102e6314ca4da683dca92e3b1355490fed5f313b768500084fbe6371fddfdb79", size = 42507, upload-time = "2025-10-06T05:37:54.513Z" }, + { url = "https://files.pythonhosted.org/packages/c2/59/ae5cdac87a00962122ea37bb346d41b66aec05f9ce328fa2b9e216f8967b/frozenlist-1.8.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:d8b7138e5cd0647e4523d6685b0eac5d4be9a184ae9634492f25c6eb38c12a47", size = 86967, upload-time = "2025-10-06T05:37:55.607Z" }, + { url = "https://files.pythonhosted.org/packages/8a/10/17059b2db5a032fd9323c41c39e9d1f5f9d0c8f04d1e4e3e788573086e61/frozenlist-1.8.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:a6483e309ca809f1efd154b4d37dc6d9f61037d6c6a81c2dc7a15cb22c8c5dca", size = 49984, upload-time = "2025-10-06T05:37:57.049Z" }, + { url = "https://files.pythonhosted.org/packages/4b/de/ad9d82ca8e5fa8f0c636e64606553c79e2b859ad253030b62a21fe9986f5/frozenlist-1.8.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:1b9290cf81e95e93fdf90548ce9d3c1211cf574b8e3f4b3b7cb0537cf2227068", size = 50240, upload-time = "2025-10-06T05:37:58.145Z" }, + { url = "https://files.pythonhosted.org/packages/4e/45/3dfb7767c2a67d123650122b62ce13c731b6c745bc14424eea67678b508c/frozenlist-1.8.0-cp39-cp39-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:59a6a5876ca59d1b63af8cd5e7ffffb024c3dc1e9cf9301b21a2e76286505c95", size = 219472, upload-time = "2025-10-06T05:37:59.239Z" }, + { url = "https://files.pythonhosted.org/packages/0b/bf/5bf23d913a741b960d5c1dac7c1985d8a2a1d015772b2d18ea168b08e7ff/frozenlist-1.8.0-cp39-cp39-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6dc4126390929823e2d2d9dc79ab4046ed74680360fc5f38b585c12c66cdf459", size = 221531, upload-time = "2025-10-06T05:38:00.521Z" }, + { url = "https://files.pythonhosted.org/packages/d0/03/27ec393f3b55860859f4b74cdc8c2a4af3dbf3533305e8eacf48a4fd9a54/frozenlist-1.8.0-cp39-cp39-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:332db6b2563333c5671fecacd085141b5800cb866be16d5e3eb15a2086476675", size = 219211, upload-time = "2025-10-06T05:38:01.842Z" }, + { url = "https://files.pythonhosted.org/packages/3a/ad/0fd00c404fa73fe9b169429e9a972d5ed807973c40ab6b3cf9365a33d360/frozenlist-1.8.0-cp39-cp39-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:9ff15928d62a0b80bb875655c39bf517938c7d589554cbd2669be42d97c2cb61", size = 231775, upload-time = "2025-10-06T05:38:03.384Z" }, + { url = "https://files.pythonhosted.org/packages/8a/c3/86962566154cb4d2995358bc8331bfc4ea19d07db1a96f64935a1607f2b6/frozenlist-1.8.0-cp39-cp39-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:7bf6cdf8e07c8151fba6fe85735441240ec7f619f935a5205953d58009aef8c6", size = 236631, upload-time = "2025-10-06T05:38:04.609Z" }, + { url = "https://files.pythonhosted.org/packages/ea/9e/6ffad161dbd83782d2c66dc4d378a9103b31770cb1e67febf43aea42d202/frozenlist-1.8.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:48e6d3f4ec5c7273dfe83ff27c91083c6c9065af655dc2684d2c200c94308bb5", size = 218632, upload-time = "2025-10-06T05:38:05.917Z" }, + { url = "https://files.pythonhosted.org/packages/58/b2/4677eee46e0a97f9b30735e6ad0bf6aba3e497986066eb68807ac85cf60f/frozenlist-1.8.0-cp39-cp39-musllinux_1_2_armv7l.whl", hash = "sha256:1a7607e17ad33361677adcd1443edf6f5da0ce5e5377b798fba20fae194825f3", size = 235967, upload-time = "2025-10-06T05:38:07.614Z" }, + { url = "https://files.pythonhosted.org/packages/05/f3/86e75f8639c5a93745ca7addbbc9de6af56aebb930d233512b17e46f6493/frozenlist-1.8.0-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:5a3a935c3a4e89c733303a2d5a7c257ea44af3a56c8202df486b7f5de40f37e1", size = 228799, upload-time = "2025-10-06T05:38:08.845Z" }, + { url = "https://files.pythonhosted.org/packages/30/00/39aad3a7f0d98f5eb1d99a3c311215674ed87061aecee7851974b335c050/frozenlist-1.8.0-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:940d4a017dbfed9daf46a3b086e1d2167e7012ee297fef9e1c545c4d022f5178", size = 230566, upload-time = "2025-10-06T05:38:10.52Z" }, + { url = "https://files.pythonhosted.org/packages/0d/4d/aa144cac44568d137846ddc4d5210fb5d9719eb1d7ec6fa2728a54b5b94a/frozenlist-1.8.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:b9be22a69a014bc47e78072d0ecae716f5eb56c15238acca0f43d6eb8e4a5bda", size = 217715, upload-time = "2025-10-06T05:38:11.832Z" }, + { url = "https://files.pythonhosted.org/packages/64/4c/8f665921667509d25a0dd72540513bc86b356c95541686f6442a3283019f/frozenlist-1.8.0-cp39-cp39-win32.whl", hash = "sha256:1aa77cb5697069af47472e39612976ed05343ff2e84a3dcf15437b232cbfd087", size = 39933, upload-time = "2025-10-06T05:38:13.061Z" }, + { url = "https://files.pythonhosted.org/packages/79/bd/bcc926f87027fad5e59926ff12d136e1082a115025d33c032d1cd69ab377/frozenlist-1.8.0-cp39-cp39-win_amd64.whl", hash = "sha256:7398c222d1d405e796970320036b1b563892b65809d9e5261487bb2c7f7b5c6a", size = 44121, upload-time = "2025-10-06T05:38:14.572Z" }, + { url = "https://files.pythonhosted.org/packages/4c/07/9c2e4eb7584af4b705237b971b89a4155a8e57599c4483a131a39256a9a0/frozenlist-1.8.0-cp39-cp39-win_arm64.whl", hash = "sha256:b4f3b365f31c6cd4af24545ca0a244a53688cad8834e32f56831c4923b50a103", size = 40312, upload-time = "2025-10-06T05:38:15.699Z" }, + { url = "https://files.pythonhosted.org/packages/9a/9a/e35b4a917281c0b8419d4207f4334c8e8c5dbf4f3f5f9ada73958d937dcc/frozenlist-1.8.0-py3-none-any.whl", hash = "sha256:0c18a16eab41e82c295618a77502e17b195883241c563b00f0aa5106fc4eaa0d", size = 13409, upload-time = "2025-10-06T05:38:16.721Z" }, +] + +[[package]] +name = "h11" +version = "0.16.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/01/ee/02a2c011bdab74c6fb3c75474d40b3052059d95df7e73351460c8588d963/h11-0.16.0.tar.gz", hash = "sha256:4e35b956cf45792e4caa5885e69fba00bdbc6ffafbfa020300e549b208ee5ff1", size = 101250, upload-time = "2025-04-24T03:35:25.427Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/04/4b/29cac41a4d98d144bf5f6d33995617b185d14b22401f75ca86f384e87ff1/h11-0.16.0-py3-none-any.whl", hash = "sha256:63cf8bbe7522de3bf65932fda1d9c2772064ffb3dae62d55932da54b31cb6c86", size = 37515, upload-time = "2025-04-24T03:35:24.344Z" }, +] + +[[package]] +name = "h5py" +version = "3.11.0" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version < '3.9'", +] +dependencies = [ + { name = "numpy", version = "1.24.4", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.9'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/52/8f/e557819155a282da36fb21f8de4730cfd10a964b52b3ae8d20157ac1c668/h5py-3.11.0.tar.gz", hash = "sha256:7b7e8f78072a2edec87c9836f25f34203fd492a4475709a18b417a33cfb21fa9", size = 406519, upload-time = "2024-04-10T10:52:39.585Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ac/25/a1cc81b3a742b73f9409bafe4762c9de0940cce0955d4b6754698fd5ce44/h5py-3.11.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:1625fd24ad6cfc9c1ccd44a66dac2396e7ee74940776792772819fc69f3a3731", size = 3477113, upload-time = "2024-04-10T10:48:28.323Z" }, + { url = "https://files.pythonhosted.org/packages/d4/03/bbb9a992fb43d3ce46687b7c14107f0fa56e6c8704c9ca945a9392cbc8ce/h5py-3.11.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:c072655ad1d5fe9ef462445d3e77a8166cbfa5e599045f8aa3c19b75315f10e5", size = 2939879, upload-time = "2024-04-10T10:48:38.094Z" }, + { url = "https://files.pythonhosted.org/packages/94/00/94bf8573e7487b7c37f2b613fc381880d48ec2311f2e859b8a5817deb4df/h5py-3.11.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:77b19a40788e3e362b54af4dcf9e6fde59ca016db2c61360aa30b47c7b7cef00", size = 5306122, upload-time = "2024-04-10T10:48:51.581Z" }, + { url = "https://files.pythonhosted.org/packages/bb/0d/fbadb9c69e2a31f641bc24e8d21671129ef3b73f0c61bb16b094fadf1385/h5py-3.11.0-cp310-cp310-win_amd64.whl", hash = "sha256:ef4e2f338fc763f50a8113890f455e1a70acd42a4d083370ceb80c463d803972", size = 2968816, upload-time = "2024-04-10T10:49:07.091Z" }, + { url = "https://files.pythonhosted.org/packages/a0/52/38bb74cc4362738cc7ef819503fc54d70f0c3a7378519ccb0ac309389122/h5py-3.11.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:bbd732a08187a9e2a6ecf9e8af713f1d68256ee0f7c8b652a32795670fb481ba", size = 3489913, upload-time = "2024-04-10T10:49:15.92Z" }, + { url = "https://files.pythonhosted.org/packages/f0/af/dfbea0c69fe725e9e77259d42f4e14eb582eb094200aaf697feb36f513d8/h5py-3.11.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:75bd7b3d93fbeee40860fd70cdc88df4464e06b70a5ad9ce1446f5f32eb84007", size = 2946912, upload-time = "2024-04-10T10:49:25.757Z" }, + { url = "https://files.pythonhosted.org/packages/af/26/f231ee425c8df93c1abbead3d90ea4a5ff3d6aa49e0edfd3b4c017e74844/h5py-3.11.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:52c416f8eb0daae39dabe71415cb531f95dce2d81e1f61a74537a50c63b28ab3", size = 5420165, upload-time = "2024-04-10T10:49:57.203Z" }, + { url = "https://files.pythonhosted.org/packages/d8/5e/b7b83cfe60504cc4d24746aed04353af7ea8ec104e597e5ae71b8d0390cb/h5py-3.11.0-cp311-cp311-win_amd64.whl", hash = "sha256:083e0329ae534a264940d6513f47f5ada617da536d8dccbafc3026aefc33c90e", size = 2979079, upload-time = "2024-04-10T10:50:11.4Z" }, + { url = "https://files.pythonhosted.org/packages/58/a9/2655d4b8355d0ee783dc89dd40b5f0780e6f54a4c9b60721dc235fd6c457/h5py-3.11.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:a76cae64080210389a571c7d13c94a1a6cf8cb75153044fd1f822a962c97aeab", size = 3466468, upload-time = "2024-04-10T10:50:30.236Z" }, + { url = "https://files.pythonhosted.org/packages/9d/3f/cf80ef55e0a9b18aae96c763fbd275c54d0723e0f2cc54f954f87cc5c69a/h5py-3.11.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:f3736fe21da2b7d8a13fe8fe415f1272d2a1ccdeff4849c1421d2fb30fd533bc", size = 2943214, upload-time = "2024-04-10T10:50:42.532Z" }, + { url = "https://files.pythonhosted.org/packages/db/7e/fedac8bb8c4729409e2dec5e4136a289116d701d54f69ce73c5617afc5f0/h5py-3.11.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:aa6ae84a14103e8dc19266ef4c3e5d7c00b68f21d07f2966f0ca7bdb6c2761fb", size = 5378375, upload-time = "2024-04-10T10:50:55.591Z" }, + { url = "https://files.pythonhosted.org/packages/2b/b2/0ee327933ffa37af1fc7915df7fc067e6009adcd8445d55ad07a9bec11b5/h5py-3.11.0-cp312-cp312-win_amd64.whl", hash = "sha256:21dbdc5343f53b2e25404673c4f00a3335aef25521bd5fa8c707ec3833934892", size = 2970991, upload-time = "2024-04-10T10:51:01.555Z" }, + { url = "https://files.pythonhosted.org/packages/33/97/c1a8f28329ad794d18fc61bf251268ac03959bf93b82fdd7701ac6931fed/h5py-3.11.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:754c0c2e373d13d6309f408325343b642eb0f40f1a6ad21779cfa9502209e150", size = 3470228, upload-time = "2024-04-10T10:51:14.716Z" }, + { url = "https://files.pythonhosted.org/packages/a4/1d/fd0b88c51c37bc8aeedecc4f4b48397f7ce13c87073aaf6912faec06e9f6/h5py-3.11.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:731839240c59ba219d4cb3bc5880d438248533366f102402cfa0621b71796b62", size = 2935809, upload-time = "2024-04-10T10:51:33.125Z" }, + { url = "https://files.pythonhosted.org/packages/86/43/fd0bd74462b3c3fb35d98568935d3e5a435c8ec24d45ef408ac8869166af/h5py-3.11.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8ec9df3dd2018904c4cc06331951e274f3f3fd091e6d6cc350aaa90fa9b42a76", size = 5309045, upload-time = "2024-04-10T10:51:44.58Z" }, + { url = "https://files.pythonhosted.org/packages/15/9a/b5456e1acc4abb382938d4a730600823bfe77a4bbfd29140ccbf01ba5596/h5py-3.11.0-cp38-cp38-win_amd64.whl", hash = "sha256:55106b04e2c83dfb73dc8732e9abad69d83a436b5b82b773481d95d17b9685e1", size = 2989172, upload-time = "2024-04-10T10:51:56.815Z" }, + { url = "https://files.pythonhosted.org/packages/c2/1f/36a84945616881bd47e6c40dcdca7e929bc811725d78d001eddba6864185/h5py-3.11.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:f4e025e852754ca833401777c25888acb96889ee2c27e7e629a19aee288833f0", size = 3490090, upload-time = "2024-04-10T10:52:08.237Z" }, + { url = "https://files.pythonhosted.org/packages/3c/fb/e213586de5ea56f1747a843e725c62eef350512be57452186996ba660d52/h5py-3.11.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:6c4b760082626120031d7902cd983d8c1f424cdba2809f1067511ef283629d4b", size = 2951710, upload-time = "2024-04-10T10:52:20.066Z" }, + { url = "https://files.pythonhosted.org/packages/71/28/69a881e01f198ccdb65c36f7adcfef22bfe85e38ffbfdf833af24f58eb5e/h5py-3.11.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:67462d0669f8f5459529de179f7771bd697389fcb3faab54d63bf788599a48ea", size = 5326481, upload-time = "2024-04-10T10:52:30.029Z" }, + { url = "https://files.pythonhosted.org/packages/c3/61/0b35ad9aac0ab0a33365879556fdb824fc83013df69b247386690db59015/h5py-3.11.0-cp39-cp39-win_amd64.whl", hash = "sha256:d9c944d364688f827dc889cf83f1fca311caf4fa50b19f009d1f2b525edd33a3", size = 2978689, upload-time = "2024-04-10T10:52:37.283Z" }, +] + +[[package]] +name = "h5py" +version = "3.14.0" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version == '3.9.*'", +] +dependencies = [ + { name = "numpy", version = "1.26.4", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version == '3.9.*'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/5d/57/dfb3c5c3f1bf5f5ef2e59a22dec4ff1f3d7408b55bfcefcfb0ea69ef21c6/h5py-3.14.0.tar.gz", hash = "sha256:2372116b2e0d5d3e5e705b7f663f7c8d96fa79a4052d250484ef91d24d6a08f4", size = 424323, upload-time = "2025-06-06T14:06:15.01Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/52/89/06cbb421e01dea2e338b3154326523c05d9698f89a01f9d9b65e1ec3fb18/h5py-3.14.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:24df6b2622f426857bda88683b16630014588a0e4155cba44e872eb011c4eaed", size = 3332522, upload-time = "2025-06-06T14:04:13.775Z" }, + { url = "https://files.pythonhosted.org/packages/c3/e7/6c860b002329e408348735bfd0459e7b12f712c83d357abeef3ef404eaa9/h5py-3.14.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:6ff2389961ee5872de697054dd5a033b04284afc3fb52dc51d94561ece2c10c6", size = 2831051, upload-time = "2025-06-06T14:04:18.206Z" }, + { url = "https://files.pythonhosted.org/packages/fa/cd/3dd38cdb7cc9266dc4d85f27f0261680cb62f553f1523167ad7454e32b11/h5py-3.14.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:016e89d3be4c44f8d5e115fab60548e518ecd9efe9fa5c5324505a90773e6f03", size = 4324677, upload-time = "2025-06-06T14:04:23.438Z" }, + { url = "https://files.pythonhosted.org/packages/b1/45/e1a754dc7cd465ba35e438e28557119221ac89b20aaebef48282654e3dc7/h5py-3.14.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1223b902ef0b5d90bcc8a4778218d6d6cd0f5561861611eda59fa6c52b922f4d", size = 4557272, upload-time = "2025-06-06T14:04:28.863Z" }, + { url = "https://files.pythonhosted.org/packages/5c/06/f9506c1531645829d302c420851b78bb717af808dde11212c113585fae42/h5py-3.14.0-cp310-cp310-win_amd64.whl", hash = "sha256:852b81f71df4bb9e27d407b43071d1da330d6a7094a588efa50ef02553fa7ce4", size = 2866734, upload-time = "2025-06-06T14:04:33.5Z" }, + { url = "https://files.pythonhosted.org/packages/61/1b/ad24a8ce846cf0519695c10491e99969d9d203b9632c4fcd5004b1641c2e/h5py-3.14.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:f30dbc58f2a0efeec6c8836c97f6c94afd769023f44e2bb0ed7b17a16ec46088", size = 3352382, upload-time = "2025-06-06T14:04:37.95Z" }, + { url = "https://files.pythonhosted.org/packages/36/5b/a066e459ca48b47cc73a5c668e9924d9619da9e3c500d9fb9c29c03858ec/h5py-3.14.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:543877d7f3d8f8a9828ed5df6a0b78ca3d8846244b9702e99ed0d53610b583a8", size = 2852492, upload-time = "2025-06-06T14:04:42.092Z" }, + { url = "https://files.pythonhosted.org/packages/08/0c/5e6aaf221557314bc15ba0e0da92e40b24af97ab162076c8ae009320a42b/h5py-3.14.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8c497600c0496548810047257e36360ff551df8b59156d3a4181072eed47d8ad", size = 4298002, upload-time = "2025-06-06T14:04:47.106Z" }, + { url = "https://files.pythonhosted.org/packages/21/d4/d461649cafd5137088fb7f8e78fdc6621bb0c4ff2c090a389f68e8edc136/h5py-3.14.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:723a40ee6505bd354bfd26385f2dae7bbfa87655f4e61bab175a49d72ebfc06b", size = 4516618, upload-time = "2025-06-06T14:04:52.467Z" }, + { url = "https://files.pythonhosted.org/packages/db/0c/6c3f879a0f8e891625817637fad902da6e764e36919ed091dc77529004ac/h5py-3.14.0-cp311-cp311-win_amd64.whl", hash = "sha256:d2744b520440a996f2dae97f901caa8a953afc055db4673a993f2d87d7f38713", size = 2874888, upload-time = "2025-06-06T14:04:56.95Z" }, + { url = "https://files.pythonhosted.org/packages/3e/77/8f651053c1843391e38a189ccf50df7e261ef8cd8bfd8baba0cbe694f7c3/h5py-3.14.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:e0045115d83272090b0717c555a31398c2c089b87d212ceba800d3dc5d952e23", size = 3312740, upload-time = "2025-06-06T14:05:01.193Z" }, + { url = "https://files.pythonhosted.org/packages/ff/10/20436a6cf419b31124e59fefc78d74cb061ccb22213226a583928a65d715/h5py-3.14.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:6da62509b7e1d71a7d110478aa25d245dd32c8d9a1daee9d2a42dba8717b047a", size = 2829207, upload-time = "2025-06-06T14:05:05.061Z" }, + { url = "https://files.pythonhosted.org/packages/3f/19/c8bfe8543bfdd7ccfafd46d8cfd96fce53d6c33e9c7921f375530ee1d39a/h5py-3.14.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:554ef0ced3571366d4d383427c00c966c360e178b5fb5ee5bb31a435c424db0c", size = 4708455, upload-time = "2025-06-06T14:05:11.528Z" }, + { url = "https://files.pythonhosted.org/packages/86/f9/f00de11c82c88bfc1ef22633557bfba9e271e0cb3189ad704183fc4a2644/h5py-3.14.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0cbd41f4e3761f150aa5b662df991868ca533872c95467216f2bec5fcad84882", size = 4929422, upload-time = "2025-06-06T14:05:18.399Z" }, + { url = "https://files.pythonhosted.org/packages/7a/6d/6426d5d456f593c94b96fa942a9b3988ce4d65ebaf57d7273e452a7222e8/h5py-3.14.0-cp312-cp312-win_amd64.whl", hash = "sha256:bf4897d67e613ecf5bdfbdab39a1158a64df105827da70ea1d90243d796d367f", size = 2862845, upload-time = "2025-06-06T14:05:23.699Z" }, + { url = "https://files.pythonhosted.org/packages/6c/c2/7efe82d09ca10afd77cd7c286e42342d520c049a8c43650194928bcc635c/h5py-3.14.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:aa4b7bbce683379b7bf80aaba68e17e23396100336a8d500206520052be2f812", size = 3289245, upload-time = "2025-06-06T14:05:28.24Z" }, + { url = "https://files.pythonhosted.org/packages/4f/31/f570fab1239b0d9441024b92b6ad03bb414ffa69101a985e4c83d37608bd/h5py-3.14.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:ef9603a501a04fcd0ba28dd8f0995303d26a77a980a1f9474b3417543d4c6174", size = 2807335, upload-time = "2025-06-06T14:05:31.997Z" }, + { url = "https://files.pythonhosted.org/packages/0d/ce/3a21d87896bc7e3e9255e0ad5583ae31ae9e6b4b00e0bcb2a67e2b6acdbc/h5py-3.14.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e8cbaf6910fa3983c46172666b0b8da7b7bd90d764399ca983236f2400436eeb", size = 4700675, upload-time = "2025-06-06T14:05:37.38Z" }, + { url = "https://files.pythonhosted.org/packages/e7/ec/86f59025306dcc6deee5fda54d980d077075b8d9889aac80f158bd585f1b/h5py-3.14.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d90e6445ab7c146d7f7981b11895d70bc1dd91278a4f9f9028bc0c95e4a53f13", size = 4921632, upload-time = "2025-06-06T14:05:43.464Z" }, + { url = "https://files.pythonhosted.org/packages/3f/6d/0084ed0b78d4fd3e7530c32491f2884140d9b06365dac8a08de726421d4a/h5py-3.14.0-cp313-cp313-win_amd64.whl", hash = "sha256:ae18e3de237a7a830adb76aaa68ad438d85fe6e19e0d99944a3ce46b772c69b3", size = 2852929, upload-time = "2025-06-06T14:05:47.659Z" }, + { url = "https://files.pythonhosted.org/packages/ec/ac/9ea82488c8790ee5b6ad1a807cd7dc3b9dadfece1cd0e0e369f68a7a8937/h5py-3.14.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:f5cc1601e78027cedfec6dd50efb4802f018551754191aeb58d948bd3ec3bd7a", size = 3345097, upload-time = "2025-06-06T14:05:51.984Z" }, + { url = "https://files.pythonhosted.org/packages/6c/bc/a172ecaaf287e3af2f837f23b470b0a2229c79555a0da9ac8b5cc5bed078/h5py-3.14.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:5e59d2136a8b302afd25acdf7a89b634e0eb7c66b1a211ef2d0457853768a2ef", size = 2843320, upload-time = "2025-06-06T14:05:55.754Z" }, + { url = "https://files.pythonhosted.org/packages/66/40/b423b57696514e05aa7bb06150ef96667d0e0006cc6de7ab52c71734ab51/h5py-3.14.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:573c33ad056ac7c1ab6d567b6db9df3ffc401045e3f605736218f96c1e0490c6", size = 4326368, upload-time = "2025-06-06T14:06:00.782Z" }, + { url = "https://files.pythonhosted.org/packages/f7/07/e088f89f04fdbe57ddf9de377f857158d3daa38cf5d0fb20ef9bd489e313/h5py-3.14.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ccbe17dc187c0c64178f1a10aa274ed3a57d055117588942b8a08793cc448216", size = 4559686, upload-time = "2025-06-06T14:06:07.416Z" }, + { url = "https://files.pythonhosted.org/packages/b4/e4/fb8032d0e5480b1db9b419b5b50737b61bb3c7187c49d809975d62129fb0/h5py-3.14.0-cp39-cp39-win_amd64.whl", hash = "sha256:4f025cf30ae738c4c4e38c7439a761a71ccfcce04c2b87b2a2ac64e8c5171d43", size = 2877166, upload-time = "2025-06-06T14:06:13.05Z" }, +] + +[[package]] +name = "h5py" +version = "3.15.1" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version >= '3.14'", + "python_full_version >= '3.11' and python_full_version < '3.14'", + "python_full_version == '3.10.*'", +] +dependencies = [ + { name = "numpy", version = "1.26.4", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.10'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/4d/6a/0d79de0b025aa85dc8864de8e97659c94cf3d23148394a954dc5ca52f8c8/h5py-3.15.1.tar.gz", hash = "sha256:c86e3ed45c4473564de55aa83b6fc9e5ead86578773dfbd93047380042e26b69", size = 426236, upload-time = "2025-10-16T10:35:27.404Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/86/30/8fa61698b438dd751fa46a359792e801191dadab560d0a5f1c709443ef8e/h5py-3.15.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:67e59f6c2f19a32973a40f43d9a088ae324fe228c8366e25ebc57ceebf093a6b", size = 3414477, upload-time = "2025-10-16T10:33:24.201Z" }, + { url = "https://files.pythonhosted.org/packages/16/16/db2f63302937337c4e9e51d97a5984b769bdb7488e3d37632a6ac297f8ef/h5py-3.15.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:0e2f471688402c3404fa4e13466e373e622fd4b74b47b56cfdff7cc688209422", size = 2850298, upload-time = "2025-10-16T10:33:27.747Z" }, + { url = "https://files.pythonhosted.org/packages/fc/2e/f1bb7de9b05112bfd14d5206090f0f92f1e75bbb412fbec5d4653c3d44dd/h5py-3.15.1-cp310-cp310-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:4c45802bcb711e128a6839cb6c01e9ac648dc55df045c9542a675c771f15c8d5", size = 4523605, upload-time = "2025-10-16T10:33:31.168Z" }, + { url = "https://files.pythonhosted.org/packages/05/8a/63f4b08f3628171ce8da1a04681a65ee7ac338fde3cb3e9e3c9f7818e4da/h5py-3.15.1-cp310-cp310-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:64ce3f6470adb87c06e3a8dd1b90e973699f1759ad79bfa70c230939bff356c9", size = 4735346, upload-time = "2025-10-16T10:33:34.759Z" }, + { url = "https://files.pythonhosted.org/packages/74/48/f16d12d9de22277605bcc11c0dcab5e35f06a54be4798faa2636b5d44b3c/h5py-3.15.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:4411c1867b9899a25e983fff56d820a66f52ac326bbe10c7cdf7d832c9dcd883", size = 4175305, upload-time = "2025-10-16T10:33:38.83Z" }, + { url = "https://files.pythonhosted.org/packages/d6/2f/47cdbff65b2ce53c27458c6df63a232d7bb1644b97df37b2342442342c84/h5py-3.15.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:2cbc4104d3d4aca9d6db8c0c694555e255805bfeacf9eb1349bda871e26cacbe", size = 4653602, upload-time = "2025-10-16T10:33:42.188Z" }, + { url = "https://files.pythonhosted.org/packages/c3/28/dc08de359c2f43a67baa529cb70d7f9599848750031975eed92d6ae78e1d/h5py-3.15.1-cp310-cp310-win_amd64.whl", hash = "sha256:01f55111ca516f5568ae7a7fc8247dfce607de331b4467ee8a9a6ed14e5422c7", size = 2873601, upload-time = "2025-10-16T10:33:45.323Z" }, + { url = "https://files.pythonhosted.org/packages/41/fd/8349b48b15b47768042cff06ad6e1c229f0a4bd89225bf6b6894fea27e6d/h5py-3.15.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:5aaa330bcbf2830150c50897ea5dcbed30b5b6d56897289846ac5b9e529ec243", size = 3434135, upload-time = "2025-10-16T10:33:47.954Z" }, + { url = "https://files.pythonhosted.org/packages/c1/b0/1c628e26a0b95858f54aba17e1599e7f6cd241727596cc2580b72cb0a9bf/h5py-3.15.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:c970fb80001fffabb0109eaf95116c8e7c0d3ca2de854e0901e8a04c1f098509", size = 2870958, upload-time = "2025-10-16T10:33:50.907Z" }, + { url = "https://files.pythonhosted.org/packages/f9/e3/c255cafc9b85e6ea04e2ad1bba1416baa1d7f57fc98a214be1144087690c/h5py-3.15.1-cp311-cp311-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:80e5bb5b9508d5d9da09f81fd00abbb3f85da8143e56b1585d59bc8ceb1dba8b", size = 4504770, upload-time = "2025-10-16T10:33:54.357Z" }, + { url = "https://files.pythonhosted.org/packages/8b/23/4ab1108e87851ccc69694b03b817d92e142966a6c4abd99e17db77f2c066/h5py-3.15.1-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:5b849ba619a066196169763c33f9f0f02e381156d61c03e000bb0100f9950faf", size = 4700329, upload-time = "2025-10-16T10:33:57.616Z" }, + { url = "https://files.pythonhosted.org/packages/a4/e4/932a3a8516e4e475b90969bf250b1924dbe3612a02b897e426613aed68f4/h5py-3.15.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:e7f6c841efd4e6e5b7e82222eaf90819927b6d256ab0f3aca29675601f654f3c", size = 4152456, upload-time = "2025-10-16T10:34:00.843Z" }, + { url = "https://files.pythonhosted.org/packages/2a/0a/f74d589883b13737021b2049ac796328f188dbb60c2ed35b101f5b95a3fc/h5py-3.15.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:ca8a3a22458956ee7b40d8e39c9a9dc01f82933e4c030c964f8b875592f4d831", size = 4617295, upload-time = "2025-10-16T10:34:04.154Z" }, + { url = "https://files.pythonhosted.org/packages/23/95/499b4e56452ef8b6c95a271af0dde08dac4ddb70515a75f346d4f400579b/h5py-3.15.1-cp311-cp311-win_amd64.whl", hash = "sha256:550e51131376889656feec4aff2170efc054a7fe79eb1da3bb92e1625d1ac878", size = 2882129, upload-time = "2025-10-16T10:34:06.886Z" }, + { url = "https://files.pythonhosted.org/packages/ce/bb/cfcc70b8a42222ba3ad4478bcef1791181ea908e2adbd7d53c66395edad5/h5py-3.15.1-cp311-cp311-win_arm64.whl", hash = "sha256:b39239947cb36a819147fc19e86b618dcb0953d1cd969f5ed71fc0de60392427", size = 2477121, upload-time = "2025-10-16T10:34:09.579Z" }, + { url = "https://files.pythonhosted.org/packages/62/b8/c0d9aa013ecfa8b7057946c080c0c07f6fa41e231d2e9bd306a2f8110bdc/h5py-3.15.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:316dd0f119734f324ca7ed10b5627a2de4ea42cc4dfbcedbee026aaa361c238c", size = 3399089, upload-time = "2025-10-16T10:34:12.135Z" }, + { url = "https://files.pythonhosted.org/packages/a4/5e/3c6f6e0430813c7aefe784d00c6711166f46225f5d229546eb53032c3707/h5py-3.15.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:b51469890e58e85d5242e43aab29f5e9c7e526b951caab354f3ded4ac88e7b76", size = 2847803, upload-time = "2025-10-16T10:34:14.564Z" }, + { url = "https://files.pythonhosted.org/packages/00/69/ba36273b888a4a48d78f9268d2aee05787e4438557450a8442946ab8f3ec/h5py-3.15.1-cp312-cp312-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:8a33bfd5dfcea037196f7778534b1ff7e36a7f40a89e648c8f2967292eb6898e", size = 4914884, upload-time = "2025-10-16T10:34:18.452Z" }, + { url = "https://files.pythonhosted.org/packages/3a/30/d1c94066343a98bb2cea40120873193a4fed68c4ad7f8935c11caf74c681/h5py-3.15.1-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:25c8843fec43b2cc368aa15afa1cdf83fc5e17b1c4e10cd3771ef6c39b72e5ce", size = 5109965, upload-time = "2025-10-16T10:34:21.853Z" }, + { url = "https://files.pythonhosted.org/packages/81/3d/d28172116eafc3bc9f5991b3cb3fd2c8a95f5984f50880adfdf991de9087/h5py-3.15.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:a308fd8681a864c04423c0324527237a0484e2611e3441f8089fd00ed56a8171", size = 4561870, upload-time = "2025-10-16T10:34:26.69Z" }, + { url = "https://files.pythonhosted.org/packages/a5/83/393a7226024238b0f51965a7156004eaae1fcf84aa4bfecf7e582676271b/h5py-3.15.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:f4a016df3f4a8a14d573b496e4d1964deb380e26031fc85fb40e417e9131888a", size = 5037161, upload-time = "2025-10-16T10:34:30.383Z" }, + { url = "https://files.pythonhosted.org/packages/cf/51/329e7436bf87ca6b0fe06dd0a3795c34bebe4ed8d6c44450a20565d57832/h5py-3.15.1-cp312-cp312-win_amd64.whl", hash = "sha256:59b25cf02411bf12e14f803fef0b80886444c7fe21a5ad17c6a28d3f08098a1e", size = 2874165, upload-time = "2025-10-16T10:34:33.461Z" }, + { url = "https://files.pythonhosted.org/packages/09/a8/2d02b10a66747c54446e932171dd89b8b4126c0111b440e6bc05a7c852ec/h5py-3.15.1-cp312-cp312-win_arm64.whl", hash = "sha256:61d5a58a9851e01ee61c932bbbb1c98fe20aba0a5674776600fb9a361c0aa652", size = 2458214, upload-time = "2025-10-16T10:34:35.733Z" }, + { url = "https://files.pythonhosted.org/packages/88/b3/40207e0192415cbff7ea1d37b9f24b33f6d38a5a2f5d18a678de78f967ae/h5py-3.15.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:c8440fd8bee9500c235ecb7aa1917a0389a2adb80c209fa1cc485bd70e0d94a5", size = 3376511, upload-time = "2025-10-16T10:34:38.596Z" }, + { url = "https://files.pythonhosted.org/packages/31/96/ba99a003c763998035b0de4c299598125df5fc6c9ccf834f152ddd60e0fb/h5py-3.15.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:ab2219dbc6fcdb6932f76b548e2b16f34a1f52b7666e998157a4dfc02e2c4123", size = 2826143, upload-time = "2025-10-16T10:34:41.342Z" }, + { url = "https://files.pythonhosted.org/packages/6a/c2/fc6375d07ea3962df7afad7d863fe4bde18bb88530678c20d4c90c18de1d/h5py-3.15.1-cp313-cp313-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:d8cb02c3a96255149ed3ac811eeea25b655d959c6dd5ce702c9a95ff11859eb5", size = 4908316, upload-time = "2025-10-16T10:34:44.619Z" }, + { url = "https://files.pythonhosted.org/packages/d9/69/4402ea66272dacc10b298cca18ed73e1c0791ff2ae9ed218d3859f9698ac/h5py-3.15.1-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:121b2b7a4c1915d63737483b7bff14ef253020f617c2fb2811f67a4bed9ac5e8", size = 5103710, upload-time = "2025-10-16T10:34:48.639Z" }, + { url = "https://files.pythonhosted.org/packages/e0/f6/11f1e2432d57d71322c02a97a5567829a75f223a8c821764a0e71a65cde8/h5py-3.15.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:59b0d63b318bf3cc06687def2b45afd75926bbc006f7b8cd2b1a231299fc8599", size = 4556042, upload-time = "2025-10-16T10:34:51.841Z" }, + { url = "https://files.pythonhosted.org/packages/18/88/3eda3ef16bfe7a7dbc3d8d6836bbaa7986feb5ff091395e140dc13927bcc/h5py-3.15.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:e02fe77a03f652500d8bff288cbf3675f742fc0411f5a628fa37116507dc7cc0", size = 5030639, upload-time = "2025-10-16T10:34:55.257Z" }, + { url = "https://files.pythonhosted.org/packages/e5/ea/fbb258a98863f99befb10ed727152b4ae659f322e1d9c0576f8a62754e81/h5py-3.15.1-cp313-cp313-win_amd64.whl", hash = "sha256:dea78b092fd80a083563ed79a3171258d4a4d307492e7cf8b2313d464c82ba52", size = 2864363, upload-time = "2025-10-16T10:34:58.099Z" }, + { url = "https://files.pythonhosted.org/packages/5d/c9/35021cc9cd2b2915a7da3026e3d77a05bed1144a414ff840953b33937fb9/h5py-3.15.1-cp313-cp313-win_arm64.whl", hash = "sha256:c256254a8a81e2bddc0d376e23e2a6d2dc8a1e8a2261835ed8c1281a0744cd97", size = 2449570, upload-time = "2025-10-16T10:35:00.473Z" }, + { url = "https://files.pythonhosted.org/packages/a0/2c/926eba1514e4d2e47d0e9eb16c784e717d8b066398ccfca9b283917b1bfb/h5py-3.15.1-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:5f4fb0567eb8517c3ecd6b3c02c4f4e9da220c8932604960fd04e24ee1254763", size = 3380368, upload-time = "2025-10-16T10:35:03.117Z" }, + { url = "https://files.pythonhosted.org/packages/65/4b/d715ed454d3baa5f6ae1d30b7eca4c7a1c1084f6a2edead9e801a1541d62/h5py-3.15.1-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:954e480433e82d3872503104f9b285d369048c3a788b2b1a00e53d1c47c98dd2", size = 2833793, upload-time = "2025-10-16T10:35:05.623Z" }, + { url = "https://files.pythonhosted.org/packages/ef/d4/ef386c28e4579314610a8bffebbee3b69295b0237bc967340b7c653c6c10/h5py-3.15.1-cp314-cp314-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:fd125c131889ebbef0849f4a0e29cf363b48aba42f228d08b4079913b576bb3a", size = 4903199, upload-time = "2025-10-16T10:35:08.972Z" }, + { url = "https://files.pythonhosted.org/packages/33/5d/65c619e195e0b5e54ea5a95c1bb600c8ff8715e0d09676e4cce56d89f492/h5py-3.15.1-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:28a20e1a4082a479b3d7db2169f3a5034af010b90842e75ebbf2e9e49eb4183e", size = 5097224, upload-time = "2025-10-16T10:35:12.808Z" }, + { url = "https://files.pythonhosted.org/packages/30/30/5273218400bf2da01609e1292f562c94b461fcb73c7a9e27fdadd43abc0a/h5py-3.15.1-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:fa8df5267f545b4946df8ca0d93d23382191018e4cda2deda4c2cedf9a010e13", size = 4551207, upload-time = "2025-10-16T10:35:16.24Z" }, + { url = "https://files.pythonhosted.org/packages/d3/39/a7ef948ddf4d1c556b0b2b9559534777bccc318543b3f5a1efdf6b556c9c/h5py-3.15.1-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:99d374a21f7321a4c6ab327c4ab23bd925ad69821aeb53a1e75dd809d19f67fa", size = 5025426, upload-time = "2025-10-16T10:35:19.831Z" }, + { url = "https://files.pythonhosted.org/packages/b6/d8/7368679b8df6925b8415f9dcc9ab1dab01ddc384d2b2c24aac9191bd9ceb/h5py-3.15.1-cp314-cp314-win_amd64.whl", hash = "sha256:9c73d1d7cdb97d5b17ae385153472ce118bed607e43be11e9a9deefaa54e0734", size = 2865704, upload-time = "2025-10-16T10:35:22.658Z" }, + { url = "https://files.pythonhosted.org/packages/d3/b7/4a806f85d62c20157e62e58e03b27513dc9c55499768530acc4f4c5ce4be/h5py-3.15.1-cp314-cp314-win_arm64.whl", hash = "sha256:a6d8c5a05a76aca9a494b4c53ce8a9c29023b7f64f625c6ce1841e92a362ccdf", size = 2465544, upload-time = "2025-10-16T10:35:25.695Z" }, +] + +[[package]] +name = "httpcore" +version = "1.0.9" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "certifi" }, + { name = "h11" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/06/94/82699a10bca87a5556c9c59b5963f2d039dbd239f25bc2a63907a05a14cb/httpcore-1.0.9.tar.gz", hash = "sha256:6e34463af53fd2ab5d807f399a9b45ea31c3dfa2276f15a2c3f00afff6e176e8", size = 85484, upload-time = "2025-04-24T22:06:22.219Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/7e/f5/f66802a942d491edb555dd61e3a9961140fd64c90bce1eafd741609d334d/httpcore-1.0.9-py3-none-any.whl", hash = "sha256:2d400746a40668fc9dec9810239072b40b4484b640a8c38fd654a024c7a1bf55", size = 78784, upload-time = "2025-04-24T22:06:20.566Z" }, +] + +[[package]] +name = "httpx" +version = "0.28.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "anyio", version = "4.5.2", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.9'" }, + { name = "anyio", version = "4.12.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.9'" }, + { name = "certifi" }, + { name = "httpcore" }, + { name = "idna" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/b1/df/48c586a5fe32a0f01324ee087459e112ebb7224f646c0b5023f5e79e9956/httpx-0.28.1.tar.gz", hash = "sha256:75e98c5f16b0f35b567856f597f06ff2270a374470a5c2392242528e3e3e42fc", size = 141406, upload-time = "2024-12-06T15:37:23.222Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/2a/39/e50c7c3a983047577ee07d2a9e53faf5a69493943ec3f6a384bdc792deb2/httpx-0.28.1-py3-none-any.whl", hash = "sha256:d909fcccc110f8c7faf814ca82a9a4d816bc5a6dbfea25d6591d6985b8ba59ad", size = 73517, upload-time = "2024-12-06T15:37:21.509Z" }, +] + +[[package]] +name = "id" +version = "1.5.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "requests", version = "2.32.4", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.9'" }, + { name = "requests", version = "2.32.5", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.9'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/22/11/102da08f88412d875fa2f1a9a469ff7ad4c874b0ca6fed0048fe385bdb3d/id-1.5.0.tar.gz", hash = "sha256:292cb8a49eacbbdbce97244f47a97b4c62540169c976552e497fd57df0734c1d", size = 15237, upload-time = "2024-12-04T19:53:05.575Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/9f/cb/18326d2d89ad3b0dd143da971e77afd1e6ca6674f1b1c3df4b6bec6279fc/id-1.5.0-py3-none-any.whl", hash = "sha256:f1434e1cef91f2cbb8a4ec64663d5a23b9ed43ef44c4c957d02583d61714c658", size = 13611, upload-time = "2024-12-04T19:53:03.02Z" }, +] + +[[package]] +name = "idna" +version = "3.11" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/6f/6d/0703ccc57f3a7233505399edb88de3cbd678da106337b9fcde432b65ed60/idna-3.11.tar.gz", hash = "sha256:795dafcc9c04ed0c1fb032c2aa73654d8e8c5023a7df64a53f39190ada629902", size = 194582, upload-time = "2025-10-12T14:55:20.501Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/0e/61/66938bbb5fc52dbdf84594873d5b51fb1f7c7794e9c0f5bd885f30bc507b/idna-3.11-py3-none-any.whl", hash = "sha256:771a87f49d9defaf64091e6e6fe9c18d4833f140bd19464795bc32d966ca37ea", size = 71008, upload-time = "2025-10-12T14:55:18.883Z" }, +] + +[[package]] +name = "imagesize" +version = "1.4.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/a7/84/62473fb57d61e31fef6e36d64a179c8781605429fd927b5dd608c997be31/imagesize-1.4.1.tar.gz", hash = "sha256:69150444affb9cb0d5cc5a92b3676f0b2fb7cd9ae39e947a5e11a36b4497cd4a", size = 1280026, upload-time = "2022-07-01T12:21:05.687Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ff/62/85c4c919272577931d407be5ba5d71c20f0b616d31a0befe0ae45bb79abd/imagesize-1.4.1-py2.py3-none-any.whl", hash = "sha256:0d8d18d08f840c19d0ee7ca1fd82490fdc3729b7ac93f49870406ddde8ef8d8b", size = 8769, upload-time = "2022-07-01T12:21:02.467Z" }, +] + +[[package]] +name = "importlib-metadata" +version = "8.5.0" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version < '3.9'", +] +dependencies = [ + { name = "zipp", version = "3.20.2", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.9'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/cd/12/33e59336dca5be0c398a7482335911a33aa0e20776128f038019f1a95f1b/importlib_metadata-8.5.0.tar.gz", hash = "sha256:71522656f0abace1d072b9e5481a48f07c138e00f079c38c8f883823f9c26bd7", size = 55304, upload-time = "2024-09-11T14:56:08.937Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/a0/d9/a1e041c5e7caa9a05c925f4bdbdfb7f006d1f74996af53467bc394c97be7/importlib_metadata-8.5.0-py3-none-any.whl", hash = "sha256:45e54197d28b7a7f1559e60b95e7c567032b602131fbd588f1497f47880aa68b", size = 26514, upload-time = "2024-09-11T14:56:07.019Z" }, +] + +[[package]] +name = "importlib-metadata" +version = "8.7.0" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version >= '3.11' and python_full_version < '3.14'", + "python_full_version == '3.10.*'", + "python_full_version == '3.9.*'", +] +dependencies = [ + { name = "zipp", version = "3.23.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.9'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/76/66/650a33bd90f786193e4de4b3ad86ea60b53c89b669a5c7be931fac31cdb0/importlib_metadata-8.7.0.tar.gz", hash = "sha256:d13b81ad223b890aa16c5471f2ac3056cf76c5f10f82d6f9292f0b415f389000", size = 56641, upload-time = "2025-04-27T15:29:01.736Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/20/b0/36bd937216ec521246249be3bf9855081de4c5e06a0c9b4219dbeda50373/importlib_metadata-8.7.0-py3-none-any.whl", hash = "sha256:e5dd1551894c77868a30651cef00984d50e1002d06942a7101d34870c5f02afd", size = 27656, upload-time = "2025-04-27T15:29:00.214Z" }, +] + +[[package]] +name = "importlib-resources" +version = "6.4.5" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version < '3.9'", +] +dependencies = [ + { name = "zipp", version = "3.20.2", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.9'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/98/be/f3e8c6081b684f176b761e6a2fef02a0be939740ed6f54109a2951d806f3/importlib_resources-6.4.5.tar.gz", hash = "sha256:980862a1d16c9e147a59603677fa2aa5fd82b87f223b6cb870695bcfce830065", size = 43372, upload-time = "2024-09-09T17:03:14.677Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/e1/6a/4604f9ae2fa62ef47b9de2fa5ad599589d28c9fd1d335f32759813dfa91e/importlib_resources-6.4.5-py3-none-any.whl", hash = "sha256:ac29d5f956f01d5e4bb63102a5a19957f1b9175e45649977264a1416783bb717", size = 36115, upload-time = "2024-09-09T17:03:13.39Z" }, +] + +[[package]] +name = "importlib-resources" +version = "6.5.2" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version == '3.9.*'", +] +dependencies = [ + { name = "zipp", version = "3.23.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version == '3.9.*'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/cf/8c/f834fbf984f691b4f7ff60f50b514cc3de5cc08abfc3295564dd89c5e2e7/importlib_resources-6.5.2.tar.gz", hash = "sha256:185f87adef5bcc288449d98fb4fba07cea78bc036455dd44c5fc4a2fe78fed2c", size = 44693, upload-time = "2025-01-03T18:51:56.698Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/a4/ed/1f1afb2e9e7f38a545d628f864d562a5ae64fe6f7a10e28ffb9b185b4e89/importlib_resources-6.5.2-py3-none-any.whl", hash = "sha256:789cfdc3ed28c78b67a06acb8126751ced69a3d5f79c095a98298cd8a760ccec", size = 37461, upload-time = "2025-01-03T18:51:54.306Z" }, +] + +[[package]] +name = "iniconfig" +version = "2.1.0" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version == '3.9.*'", + "python_full_version < '3.9'", +] +sdist = { url = "https://files.pythonhosted.org/packages/f2/97/ebf4da567aa6827c909642694d71c9fcf53e5b504f2d96afea02718862f3/iniconfig-2.1.0.tar.gz", hash = "sha256:3abbd2e30b36733fee78f9c7f7308f2d0050e88f0087fd25c2645f63c773e1c7", size = 4793, upload-time = "2025-03-19T20:09:59.721Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/2c/e1/e6716421ea10d38022b952c159d5161ca1193197fb744506875fbb87ea7b/iniconfig-2.1.0-py3-none-any.whl", hash = "sha256:9deba5723312380e77435581c6bf4935c94cbfab9b1ed33ef8d238ea168eb760", size = 6050, upload-time = "2025-03-19T20:10:01.071Z" }, +] + +[[package]] +name = "iniconfig" +version = "2.3.0" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version >= '3.14'", + "python_full_version >= '3.11' and python_full_version < '3.14'", + "python_full_version == '3.10.*'", +] +sdist = { url = "https://files.pythonhosted.org/packages/72/34/14ca021ce8e5dfedc35312d08ba8bf51fdd999c576889fc2c24cb97f4f10/iniconfig-2.3.0.tar.gz", hash = "sha256:c76315c77db068650d49c5b56314774a7804df16fee4402c1f19d6d15d8c4730", size = 20503, upload-time = "2025-10-18T21:55:43.219Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/cb/b1/3846dd7f199d53cb17f49cba7e651e9ce294d8497c8c150530ed11865bb8/iniconfig-2.3.0-py3-none-any.whl", hash = "sha256:f631c04d2c48c52b84d0d0549c99ff3859c98df65b3101406327ecc7d53fbf12", size = 7484, upload-time = "2025-10-18T21:55:41.639Z" }, +] + +[[package]] +name = "ipykernel" +version = "6.29.5" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version < '3.9'", +] +dependencies = [ + { name = "appnope", marker = "python_full_version < '3.9' and sys_platform == 'darwin'" }, + { name = "comm", marker = "python_full_version < '3.9'" }, + { name = "debugpy", marker = "python_full_version < '3.9'" }, + { name = "ipython", version = "8.12.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.9'" }, + { name = "jupyter-client", marker = "python_full_version < '3.9'" }, + { name = "jupyter-core", version = "5.8.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.9'" }, + { name = "matplotlib-inline", version = "0.1.7", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.9'" }, + { name = "nest-asyncio", marker = "python_full_version < '3.9'" }, + { name = "packaging", marker = "python_full_version < '3.9'" }, + { name = "psutil", marker = "python_full_version < '3.9'" }, + { name = "pyzmq", marker = "python_full_version < '3.9'" }, + { name = "tornado", version = "6.4.2", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.9'" }, + { name = "traitlets", marker = "python_full_version < '3.9'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/e9/5c/67594cb0c7055dc50814b21731c22a601101ea3b1b50a9a1b090e11f5d0f/ipykernel-6.29.5.tar.gz", hash = "sha256:f093a22c4a40f8828f8e330a9c297cb93dcab13bd9678ded6de8e5cf81c56215", size = 163367, upload-time = "2024-07-01T14:07:22.543Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/94/5c/368ae6c01c7628438358e6d337c19b05425727fbb221d2a3c4303c372f42/ipykernel-6.29.5-py3-none-any.whl", hash = "sha256:afdb66ba5aa354b09b91379bac28ae4afebbb30e8b39510c9690afb7a10421b5", size = 117173, upload-time = "2024-07-01T14:07:19.603Z" }, +] + +[[package]] +name = "ipykernel" +version = "6.31.0" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version == '3.9.*'", +] +dependencies = [ + { name = "appnope", marker = "python_full_version == '3.9.*' and sys_platform == 'darwin'" }, + { name = "comm", marker = "python_full_version == '3.9.*'" }, + { name = "debugpy", marker = "python_full_version == '3.9.*'" }, + { name = "ipython", version = "8.18.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version == '3.9.*'" }, + { name = "jupyter-client", marker = "python_full_version == '3.9.*'" }, + { name = "jupyter-core", version = "5.8.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version == '3.9.*'" }, + { name = "matplotlib-inline", version = "0.2.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version == '3.9.*'" }, + { name = "nest-asyncio", marker = "python_full_version == '3.9.*'" }, + { name = "packaging", marker = "python_full_version == '3.9.*'" }, + { name = "psutil", marker = "python_full_version == '3.9.*'" }, + { name = "pyzmq", marker = "python_full_version == '3.9.*'" }, + { name = "tornado", version = "6.5.2", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version == '3.9.*'" }, + { name = "traitlets", marker = "python_full_version == '3.9.*'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/a5/1d/d5ba6edbfe6fae4c3105bca3a9c889563cc752c7f2de45e333164c7f4846/ipykernel-6.31.0.tar.gz", hash = "sha256:2372ce8bc1ff4f34e58cafed3a0feb2194b91fc7cad0fc72e79e47b45ee9e8f6", size = 167493, upload-time = "2025-10-20T11:42:39.948Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/f6/d8/502954a4ec0efcf264f99b65b41c3c54e65a647d9f0d6f62cd02227d242c/ipykernel-6.31.0-py3-none-any.whl", hash = "sha256:abe5386f6ced727a70e0eb0cf1da801fa7c5fa6ff82147747d5a0406cd8c94af", size = 117003, upload-time = "2025-10-20T11:42:37.502Z" }, +] + +[[package]] +name = "ipykernel" +version = "7.1.0" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version >= '3.14'", + "python_full_version >= '3.11' and python_full_version < '3.14'", + "python_full_version == '3.10.*'", +] +dependencies = [ + { name = "appnope", marker = "python_full_version >= '3.10' and sys_platform == 'darwin'" }, + { name = "comm", marker = "python_full_version >= '3.10'" }, + { name = "debugpy", marker = "python_full_version >= '3.10'" }, + { name = "ipython", version = "8.37.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version == '3.10.*'" }, + { name = "ipython", version = "9.8.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, + { name = "jupyter-client", marker = "python_full_version >= '3.10'" }, + { name = "jupyter-core", version = "5.9.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.10'" }, + { name = "matplotlib-inline", version = "0.2.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.10'" }, + { name = "nest-asyncio", marker = "python_full_version >= '3.10'" }, + { name = "packaging", marker = "python_full_version >= '3.10'" }, + { name = "psutil", marker = "python_full_version >= '3.10'" }, + { name = "pyzmq", marker = "python_full_version >= '3.10'" }, + { name = "tornado", version = "6.5.2", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.10'" }, + { name = "traitlets", marker = "python_full_version >= '3.10'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/b9/a4/4948be6eb88628505b83a1f2f40d90254cab66abf2043b3c40fa07dfce0f/ipykernel-7.1.0.tar.gz", hash = "sha256:58a3fc88533d5930c3546dc7eac66c6d288acde4f801e2001e65edc5dc9cf0db", size = 174579, upload-time = "2025-10-27T09:46:39.471Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/a3/17/20c2552266728ceba271967b87919664ecc0e33efca29c3efc6baf88c5f9/ipykernel-7.1.0-py3-none-any.whl", hash = "sha256:763b5ec6c5b7776f6a8d7ce09b267693b4e5ce75cb50ae696aaefb3c85e1ea4c", size = 117968, upload-time = "2025-10-27T09:46:37.805Z" }, +] + +[[package]] +name = "ipython" +version = "8.12.3" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version < '3.9'", +] +dependencies = [ + { name = "appnope", marker = "python_full_version < '3.9' and sys_platform == 'darwin'" }, + { name = "backcall", marker = "python_full_version < '3.9'" }, + { name = "colorama", marker = "python_full_version < '3.9' and sys_platform == 'win32'" }, + { name = "decorator", marker = "python_full_version < '3.9'" }, + { name = "jedi", marker = "python_full_version < '3.9'" }, + { name = "matplotlib-inline", version = "0.1.7", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.9'" }, + { name = "pexpect", marker = "python_full_version < '3.9' and sys_platform != 'win32'" }, + { name = "pickleshare", marker = "python_full_version < '3.9'" }, + { name = "prompt-toolkit", marker = "python_full_version < '3.9'" }, + { name = "pygments", marker = "python_full_version < '3.9'" }, + { name = "stack-data", marker = "python_full_version < '3.9'" }, + { name = "traitlets", marker = "python_full_version < '3.9'" }, + { name = "typing-extensions", version = "4.13.2", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.9'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/9e/6a/44ef299b1762f5a73841e87fae8a73a8cc8aee538d6dc8c77a5afe1fd2ce/ipython-8.12.3.tar.gz", hash = "sha256:3910c4b54543c2ad73d06579aa771041b7d5707b033bd488669b4cf544e3b363", size = 5470171, upload-time = "2023-09-29T09:14:37.468Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/8d/97/8fe103906cd81bc42d3b0175b5534a9f67dccae47d6451131cf8d0d70bb2/ipython-8.12.3-py3-none-any.whl", hash = "sha256:b0340d46a933d27c657b211a329d0be23793c36595acf9e6ef4164bc01a1804c", size = 798307, upload-time = "2023-09-29T09:14:34.431Z" }, +] + +[[package]] +name = "ipython" +version = "8.18.1" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version == '3.9.*'", +] +dependencies = [ + { name = "colorama", marker = "python_full_version == '3.9.*' and sys_platform == 'win32'" }, + { name = "decorator", marker = "python_full_version == '3.9.*'" }, + { name = "exceptiongroup", marker = "python_full_version == '3.9.*'" }, + { name = "jedi", marker = "python_full_version == '3.9.*'" }, + { name = "matplotlib-inline", version = "0.2.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version == '3.9.*'" }, + { name = "pexpect", marker = "python_full_version == '3.9.*' and sys_platform != 'win32'" }, + { name = "prompt-toolkit", marker = "python_full_version == '3.9.*'" }, + { name = "pygments", marker = "python_full_version == '3.9.*'" }, + { name = "stack-data", marker = "python_full_version == '3.9.*'" }, + { name = "traitlets", marker = "python_full_version == '3.9.*'" }, + { name = "typing-extensions", version = "4.15.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version == '3.9.*'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/b1/b9/3ba6c45a6df813c09a48bac313c22ff83efa26cbb55011218d925a46e2ad/ipython-8.18.1.tar.gz", hash = "sha256:ca6f079bb33457c66e233e4580ebfc4128855b4cf6370dddd73842a9563e8a27", size = 5486330, upload-time = "2023-11-27T09:58:34.596Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/47/6b/d9fdcdef2eb6a23f391251fde8781c38d42acd82abe84d054cb74f7863b0/ipython-8.18.1-py3-none-any.whl", hash = "sha256:e8267419d72d81955ec1177f8a29aaa90ac80ad647499201119e2f05e99aa397", size = 808161, upload-time = "2023-11-27T09:58:30.538Z" }, +] + +[[package]] +name = "ipython" +version = "8.37.0" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version == '3.10.*'", +] +dependencies = [ + { name = "colorama", marker = "python_full_version == '3.10.*' and sys_platform == 'win32'" }, + { name = "decorator", marker = "python_full_version == '3.10.*'" }, + { name = "exceptiongroup", marker = "python_full_version == '3.10.*'" }, + { name = "jedi", marker = "python_full_version == '3.10.*'" }, + { name = "matplotlib-inline", version = "0.2.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version == '3.10.*'" }, + { name = "pexpect", marker = "python_full_version == '3.10.*' and sys_platform != 'emscripten' and sys_platform != 'win32'" }, + { name = "prompt-toolkit", marker = "python_full_version == '3.10.*'" }, + { name = "pygments", marker = "python_full_version == '3.10.*'" }, + { name = "stack-data", marker = "python_full_version == '3.10.*'" }, + { name = "traitlets", marker = "python_full_version == '3.10.*'" }, + { name = "typing-extensions", version = "4.15.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version == '3.10.*'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/85/31/10ac88f3357fc276dc8a64e8880c82e80e7459326ae1d0a211b40abf6665/ipython-8.37.0.tar.gz", hash = "sha256:ca815841e1a41a1e6b73a0b08f3038af9b2252564d01fc405356d34033012216", size = 5606088, upload-time = "2025-05-31T16:39:09.613Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/91/d0/274fbf7b0b12643cbbc001ce13e6a5b1607ac4929d1b11c72460152c9fc3/ipython-8.37.0-py3-none-any.whl", hash = "sha256:ed87326596b878932dbcb171e3e698845434d8c61b8d8cd474bf663041a9dcf2", size = 831864, upload-time = "2025-05-31T16:39:06.38Z" }, +] + +[[package]] +name = "ipython" +version = "9.8.0" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version >= '3.14'", + "python_full_version >= '3.11' and python_full_version < '3.14'", +] +dependencies = [ + { name = "colorama", marker = "python_full_version >= '3.11' and sys_platform == 'win32'" }, + { name = "decorator", marker = "python_full_version >= '3.11'" }, + { name = "ipython-pygments-lexers", marker = "python_full_version >= '3.11'" }, + { name = "jedi", marker = "python_full_version >= '3.11'" }, + { name = "matplotlib-inline", version = "0.2.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, + { name = "pexpect", marker = "python_full_version >= '3.11' and sys_platform != 'emscripten' and sys_platform != 'win32'" }, + { name = "prompt-toolkit", marker = "python_full_version >= '3.11'" }, + { name = "pygments", marker = "python_full_version >= '3.11'" }, + { name = "stack-data", marker = "python_full_version >= '3.11'" }, + { name = "traitlets", marker = "python_full_version >= '3.11'" }, + { name = "typing-extensions", version = "4.15.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version == '3.11.*'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/12/51/a703c030f4928646d390b4971af4938a1b10c9dfce694f0d99a0bb073cb2/ipython-9.8.0.tar.gz", hash = "sha256:8e4ce129a627eb9dd221c41b1d2cdaed4ef7c9da8c17c63f6f578fe231141f83", size = 4424940, upload-time = "2025-12-03T10:18:24.353Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/f1/df/8ee1c5dd1e3308b5d5b2f2dfea323bb2f3827da8d654abb6642051199049/ipython-9.8.0-py3-none-any.whl", hash = "sha256:ebe6d1d58d7d988fbf23ff8ff6d8e1622cfdb194daf4b7b73b792c4ec3b85385", size = 621374, upload-time = "2025-12-03T10:18:22.335Z" }, +] + +[[package]] +name = "ipython-pygments-lexers" +version = "1.1.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pygments", marker = "python_full_version >= '3.11'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/ef/4c/5dd1d8af08107f88c7f741ead7a40854b8ac24ddf9ae850afbcf698aa552/ipython_pygments_lexers-1.1.1.tar.gz", hash = "sha256:09c0138009e56b6854f9535736f4171d855c8c08a563a0dcd8022f78355c7e81", size = 8393, upload-time = "2025-01-17T11:24:34.505Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/d9/33/1f075bf72b0b747cb3288d011319aaf64083cf2efef8354174e3ed4540e2/ipython_pygments_lexers-1.1.1-py3-none-any.whl", hash = "sha256:a9462224a505ade19a605f71f8fa63c2048833ce50abc86768a0d81d876dc81c", size = 8074, upload-time = "2025-01-17T11:24:33.271Z" }, +] + +[[package]] +name = "ipywidgets" +version = "8.1.8" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "comm" }, + { name = "ipython", version = "8.12.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.9'" }, + { name = "ipython", version = "8.18.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version == '3.9.*'" }, + { name = "ipython", version = "8.37.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version == '3.10.*'" }, + { name = "ipython", version = "9.8.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, + { name = "jupyterlab-widgets" }, + { name = "traitlets" }, + { name = "widgetsnbextension" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/4c/ae/c5ce1edc1afe042eadb445e95b0671b03cee61895264357956e61c0d2ac0/ipywidgets-8.1.8.tar.gz", hash = "sha256:61f969306b95f85fba6b6986b7fe45d73124d1d9e3023a8068710d47a22ea668", size = 116739, upload-time = "2025-11-01T21:18:12.393Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/56/6d/0d9848617b9f753b87f214f1c682592f7ca42de085f564352f10f0843026/ipywidgets-8.1.8-py3-none-any.whl", hash = "sha256:ecaca67aed704a338f88f67b1181b58f821ab5dc89c1f0f5ef99db43c1c2921e", size = 139808, upload-time = "2025-11-01T21:18:10.956Z" }, +] + +[[package]] +name = "isoduration" +version = "20.11.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "arrow" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/7c/1a/3c8edc664e06e6bd06cce40c6b22da5f1429aa4224d0c590f3be21c91ead/isoduration-20.11.0.tar.gz", hash = "sha256:ac2f9015137935279eac671f94f89eb00584f940f5dc49462a0c4ee692ba1bd9", size = 11649, upload-time = "2020-11-01T11:00:00.312Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/7b/55/e5326141505c5d5e34c5e0935d2908a74e4561eca44108fbfb9c13d2911a/isoduration-20.11.0-py3-none-any.whl", hash = "sha256:b2904c2a4228c3d44f409c8ae8e2370eb21a26f7ac2ec5446df141dde3452042", size = 11321, upload-time = "2020-11-01T10:59:58.02Z" }, +] + +[[package]] +name = "jaraco-classes" +version = "3.4.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "more-itertools", version = "10.5.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.9'" }, + { name = "more-itertools", version = "10.8.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.9'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/06/c0/ed4a27bc5571b99e3cff68f8a9fa5b56ff7df1c2251cc715a652ddd26402/jaraco.classes-3.4.0.tar.gz", hash = "sha256:47a024b51d0239c0dd8c8540c6c7f484be3b8fcf0b2d85c13825780d3b3f3acd", size = 11780, upload-time = "2024-03-31T07:27:36.643Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/7f/66/b15ce62552d84bbfcec9a4873ab79d993a1dd4edb922cbfccae192bd5b5f/jaraco.classes-3.4.0-py3-none-any.whl", hash = "sha256:f662826b6bed8cace05e7ff873ce0f9283b5c924470fe664fff1c2f00f581790", size = 6777, upload-time = "2024-03-31T07:27:34.792Z" }, +] + +[[package]] +name = "jaraco-context" +version = "6.0.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "backports-tarfile", marker = "python_full_version < '3.12'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/df/ad/f3777b81bf0b6e7bc7514a1656d3e637b2e8e15fab2ce3235730b3e7a4e6/jaraco_context-6.0.1.tar.gz", hash = "sha256:9bae4ea555cf0b14938dc0aee7c9f32ed303aa20a3b73e7dc80111628792d1b3", size = 13912, upload-time = "2024-08-20T03:39:27.358Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ff/db/0c52c4cf5e4bd9f5d7135ec7669a3a767af21b3a308e1ed3674881e52b62/jaraco.context-6.0.1-py3-none-any.whl", hash = "sha256:f797fc481b490edb305122c9181830a3a5b76d84ef6d1aef2fb9b47ab956f9e4", size = 6825, upload-time = "2024-08-20T03:39:25.966Z" }, +] + +[[package]] +name = "jaraco-functools" +version = "4.1.0" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version < '3.9'", +] +dependencies = [ + { name = "more-itertools", version = "10.5.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.9'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/ab/23/9894b3df5d0a6eb44611c36aec777823fc2e07740dabbd0b810e19594013/jaraco_functools-4.1.0.tar.gz", hash = "sha256:70f7e0e2ae076498e212562325e805204fc092d7b4c17e0e86c959e249701a9d", size = 19159, upload-time = "2024-09-27T19:47:09.122Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/9f/4f/24b319316142c44283d7540e76c7b5a6dbd5db623abd86bb7b3491c21018/jaraco.functools-4.1.0-py3-none-any.whl", hash = "sha256:ad159f13428bc4acbf5541ad6dec511f91573b90fba04df61dafa2a1231cf649", size = 10187, upload-time = "2024-09-27T19:47:07.14Z" }, +] + +[[package]] +name = "jaraco-functools" +version = "4.3.0" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version >= '3.14'", + "python_full_version >= '3.11' and python_full_version < '3.14'", + "python_full_version == '3.10.*'", + "python_full_version == '3.9.*'", +] +dependencies = [ + { name = "more-itertools", version = "10.8.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.9'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/f7/ed/1aa2d585304ec07262e1a83a9889880701079dde796ac7b1d1826f40c63d/jaraco_functools-4.3.0.tar.gz", hash = "sha256:cfd13ad0dd2c47a3600b439ef72d8615d482cedcff1632930d6f28924d92f294", size = 19755, upload-time = "2025-08-18T20:05:09.91Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/b4/09/726f168acad366b11e420df31bf1c702a54d373a83f968d94141a8c3fde0/jaraco_functools-4.3.0-py3-none-any.whl", hash = "sha256:227ff8ed6f7b8f62c56deff101545fa7543cf2c8e7b82a7c2116e672f29c26e8", size = 10408, upload-time = "2025-08-18T20:05:08.69Z" }, +] + +[[package]] +name = "jedi" +version = "0.19.2" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "parso" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/72/3a/79a912fbd4d8dd6fbb02bf69afd3bb72cf0c729bb3063c6f4498603db17a/jedi-0.19.2.tar.gz", hash = "sha256:4770dc3de41bde3966b02eb84fbcf557fb33cce26ad23da12c742fb50ecb11f0", size = 1231287, upload-time = "2024-11-11T01:41:42.873Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/c0/5a/9cac0c82afec3d09ccd97c8b6502d48f165f9124db81b4bcb90b4af974ee/jedi-0.19.2-py2.py3-none-any.whl", hash = "sha256:a8ef22bde8490f57fe5c7681a3c83cb58874daf72b4784de3cce5b6ef6edb5b9", size = 1572278, upload-time = "2024-11-11T01:41:40.175Z" }, +] + +[[package]] +name = "jeepney" +version = "0.9.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/7b/6f/357efd7602486741aa73ffc0617fb310a29b588ed0fd69c2399acbb85b0c/jeepney-0.9.0.tar.gz", hash = "sha256:cf0e9e845622b81e4a28df94c40345400256ec608d0e55bb8a3feaa9163f5732", size = 106758, upload-time = "2025-02-27T18:51:01.684Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/b2/a3/e137168c9c44d18eff0376253da9f1e9234d0239e0ee230d2fee6cea8e55/jeepney-0.9.0-py3-none-any.whl", hash = "sha256:97e5714520c16fc0a45695e5365a2e11b81ea79bba796e26f9f1d178cb182683", size = 49010, upload-time = "2025-02-27T18:51:00.104Z" }, +] + +[[package]] +name = "jinja2" +version = "3.1.6" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "markupsafe", version = "2.1.5", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.9'" }, + { name = "markupsafe", version = "3.0.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.9'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/df/bf/f7da0350254c0ed7c72f3e33cef02e048281fec7ecec5f032d4aac52226b/jinja2-3.1.6.tar.gz", hash = "sha256:0137fb05990d35f1275a587e9aee6d56da821fc83491a0fb838183be43f66d6d", size = 245115, upload-time = "2025-03-05T20:05:02.478Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/62/a1/3d680cbfd5f4b8f15abc1d571870c5fc3e594bb582bc3b64ea099db13e56/jinja2-3.1.6-py3-none-any.whl", hash = "sha256:85ece4451f492d0c13c5dd7c13a64681a86afae63a5f347908daf103ce6d2f67", size = 134899, upload-time = "2025-03-05T20:05:00.369Z" }, +] + +[[package]] +name = "json5" +version = "0.12.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/12/ae/929aee9619e9eba9015207a9d2c1c54db18311da7eb4dcf6d41ad6f0eb67/json5-0.12.1.tar.gz", hash = "sha256:b2743e77b3242f8d03c143dd975a6ec7c52e2f2afe76ed934e53503dd4ad4990", size = 52191, upload-time = "2025-08-12T19:47:42.583Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/85/e2/05328bd2621be49a6fed9e3030b1e51a2d04537d3f816d211b9cc53c5262/json5-0.12.1-py3-none-any.whl", hash = "sha256:d9c9b3bc34a5f54d43c35e11ef7cb87d8bdd098c6ace87117a7b7e83e705c1d5", size = 36119, upload-time = "2025-08-12T19:47:41.131Z" }, +] + +[[package]] +name = "jsonpointer" +version = "3.0.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/6a/0a/eebeb1fa92507ea94016a2a790b93c2ae41a7e18778f85471dc54475ed25/jsonpointer-3.0.0.tar.gz", hash = "sha256:2b2d729f2091522d61c3b31f82e11870f60b68f43fbc705cb76bf4b832af59ef", size = 9114, upload-time = "2024-06-10T19:24:42.462Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/71/92/5e77f98553e9e75130c78900d000368476aed74276eb8ae8796f65f00918/jsonpointer-3.0.0-py2.py3-none-any.whl", hash = "sha256:13e088adc14fca8b6aa8177c044e12701e6ad4b28ff10e65f2267a90109c9942", size = 7595, upload-time = "2024-06-10T19:24:40.698Z" }, +] + +[[package]] +name = "jsonschema" +version = "4.23.0" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version < '3.9'", +] +dependencies = [ + { name = "attrs", version = "25.3.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.9'" }, + { name = "importlib-resources", version = "6.4.5", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.9'" }, + { name = "jsonschema-specifications", version = "2023.12.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.9'" }, + { name = "pkgutil-resolve-name", marker = "python_full_version < '3.9'" }, + { name = "referencing", version = "0.35.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.9'" }, + { name = "rpds-py", version = "0.20.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.9'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/38/2e/03362ee4034a4c917f697890ccd4aec0800ccf9ded7f511971c75451deec/jsonschema-4.23.0.tar.gz", hash = "sha256:d71497fef26351a33265337fa77ffeb82423f3ea21283cd9467bb03999266bc4", size = 325778, upload-time = "2024-07-08T18:40:05.546Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/69/4a/4f9dbeb84e8850557c02365a0eee0649abe5eb1d84af92a25731c6c0f922/jsonschema-4.23.0-py3-none-any.whl", hash = "sha256:fbadb6f8b144a8f8cf9f0b89ba94501d143e50411a1278633f56a7acf7fd5566", size = 88462, upload-time = "2024-07-08T18:40:00.165Z" }, +] + +[package.optional-dependencies] +format-nongpl = [ + { name = "fqdn", marker = "python_full_version < '3.9'" }, + { name = "idna", marker = "python_full_version < '3.9'" }, + { name = "isoduration", marker = "python_full_version < '3.9'" }, + { name = "jsonpointer", marker = "python_full_version < '3.9'" }, + { name = "rfc3339-validator", marker = "python_full_version < '3.9'" }, + { name = "rfc3986-validator", marker = "python_full_version < '3.9'" }, + { name = "uri-template", marker = "python_full_version < '3.9'" }, + { name = "webcolors", version = "24.8.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.9'" }, +] + +[[package]] +name = "jsonschema" +version = "4.25.1" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version >= '3.14'", + "python_full_version >= '3.11' and python_full_version < '3.14'", + "python_full_version == '3.10.*'", + "python_full_version == '3.9.*'", +] +dependencies = [ + { name = "attrs", version = "25.4.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.9'" }, + { name = "jsonschema-specifications", version = "2025.9.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.9'" }, + { name = "referencing", version = "0.36.2", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version == '3.9.*'" }, + { name = "referencing", version = "0.37.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.10'" }, + { name = "rpds-py", version = "0.27.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version == '3.9.*'" }, + { name = "rpds-py", version = "0.30.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.10'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/74/69/f7185de793a29082a9f3c7728268ffb31cb5095131a9c139a74078e27336/jsonschema-4.25.1.tar.gz", hash = "sha256:e4a9655ce0da0c0b67a085847e00a3a51449e1157f4f75e9fb5aa545e122eb85", size = 357342, upload-time = "2025-08-18T17:03:50.038Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/bf/9c/8c95d856233c1f82500c2450b8c68576b4cf1c871db3afac5c34ff84e6fd/jsonschema-4.25.1-py3-none-any.whl", hash = "sha256:3fba0169e345c7175110351d456342c364814cfcf3b964ba4587f22915230a63", size = 90040, upload-time = "2025-08-18T17:03:48.373Z" }, +] + +[package.optional-dependencies] +format-nongpl = [ + { name = "fqdn", marker = "python_full_version >= '3.9'" }, + { name = "idna", marker = "python_full_version >= '3.9'" }, + { name = "isoduration", marker = "python_full_version >= '3.9'" }, + { name = "jsonpointer", marker = "python_full_version >= '3.9'" }, + { name = "rfc3339-validator", marker = "python_full_version >= '3.9'" }, + { name = "rfc3986-validator", marker = "python_full_version >= '3.9'" }, + { name = "rfc3987-syntax", marker = "python_full_version >= '3.9'" }, + { name = "uri-template", marker = "python_full_version >= '3.9'" }, + { name = "webcolors", version = "24.11.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version == '3.9.*'" }, + { name = "webcolors", version = "25.10.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.10'" }, +] + +[[package]] +name = "jsonschema-specifications" +version = "2023.12.1" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version < '3.9'", +] +dependencies = [ + { name = "importlib-resources", version = "6.4.5", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.9'" }, + { name = "referencing", version = "0.35.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.9'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/f8/b9/cc0cc592e7c195fb8a650c1d5990b10175cf13b4c97465c72ec841de9e4b/jsonschema_specifications-2023.12.1.tar.gz", hash = "sha256:48a76787b3e70f5ed53f1160d2b81f586e4ca6d1548c5de7085d1682674764cc", size = 13983, upload-time = "2023-12-25T15:16:53.63Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ee/07/44bd408781594c4d0a027666ef27fab1e441b109dc3b76b4f836f8fd04fe/jsonschema_specifications-2023.12.1-py3-none-any.whl", hash = "sha256:87e4fdf3a94858b8a2ba2778d9ba57d8a9cafca7c7489c46ba0d30a8bc6a9c3c", size = 18482, upload-time = "2023-12-25T15:16:51.997Z" }, +] + +[[package]] +name = "jsonschema-specifications" +version = "2025.9.1" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version >= '3.14'", + "python_full_version >= '3.11' and python_full_version < '3.14'", + "python_full_version == '3.10.*'", + "python_full_version == '3.9.*'", +] +dependencies = [ + { name = "referencing", version = "0.36.2", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version == '3.9.*'" }, + { name = "referencing", version = "0.37.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.10'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/19/74/a633ee74eb36c44aa6d1095e7cc5569bebf04342ee146178e2d36600708b/jsonschema_specifications-2025.9.1.tar.gz", hash = "sha256:b540987f239e745613c7a9176f3edb72b832a4ac465cf02712288397832b5e8d", size = 32855, upload-time = "2025-09-08T01:34:59.186Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/41/45/1a4ed80516f02155c51f51e8cedb3c1902296743db0bbc66608a0db2814f/jsonschema_specifications-2025.9.1-py3-none-any.whl", hash = "sha256:98802fee3a11ee76ecaca44429fda8a41bff98b00a0f2838151b113f210cc6fe", size = 18437, upload-time = "2025-09-08T01:34:57.871Z" }, +] + +[[package]] +name = "jupyter-client" +version = "8.6.3" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "importlib-metadata", version = "8.5.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.9'" }, + { name = "importlib-metadata", version = "8.7.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version == '3.9.*'" }, + { name = "jupyter-core", version = "5.8.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.10'" }, + { name = "jupyter-core", version = "5.9.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.10'" }, + { name = "python-dateutil" }, + { name = "pyzmq" }, + { name = "tornado", version = "6.4.2", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.9'" }, + { name = "tornado", version = "6.5.2", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.9'" }, + { name = "traitlets" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/71/22/bf9f12fdaeae18019a468b68952a60fe6dbab5d67cd2a103cac7659b41ca/jupyter_client-8.6.3.tar.gz", hash = "sha256:35b3a0947c4a6e9d589eb97d7d4cd5e90f910ee73101611f01283732bd6d9419", size = 342019, upload-time = "2024-09-17T10:44:17.613Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/11/85/b0394e0b6fcccd2c1eeefc230978a6f8cb0c5df1e4cd3e7625735a0d7d1e/jupyter_client-8.6.3-py3-none-any.whl", hash = "sha256:e8a19cc986cc45905ac3362915f410f3af85424b4c0905e94fa5f2cb08e8f23f", size = 106105, upload-time = "2024-09-17T10:44:15.218Z" }, +] + +[[package]] +name = "jupyter-core" +version = "5.8.1" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version == '3.9.*'", + "python_full_version < '3.9'", +] +dependencies = [ + { name = "platformdirs", version = "4.3.6", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.9'" }, + { name = "platformdirs", version = "4.4.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version == '3.9.*'" }, + { name = "pywin32", marker = "python_full_version < '3.10' and platform_python_implementation != 'PyPy' and sys_platform == 'win32'" }, + { name = "traitlets", marker = "python_full_version < '3.10'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/99/1b/72906d554acfeb588332eaaa6f61577705e9ec752ddb486f302dafa292d9/jupyter_core-5.8.1.tar.gz", hash = "sha256:0a5f9706f70e64786b75acba995988915ebd4601c8a52e534a40b51c95f59941", size = 88923, upload-time = "2025-05-27T07:38:16.655Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/2f/57/6bffd4b20b88da3800c5d691e0337761576ee688eb01299eae865689d2df/jupyter_core-5.8.1-py3-none-any.whl", hash = "sha256:c28d268fc90fb53f1338ded2eb410704c5449a358406e8a948b75706e24863d0", size = 28880, upload-time = "2025-05-27T07:38:15.137Z" }, +] + +[[package]] +name = "jupyter-core" +version = "5.9.1" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version >= '3.14'", + "python_full_version >= '3.11' and python_full_version < '3.14'", + "python_full_version == '3.10.*'", +] +dependencies = [ + { name = "platformdirs", version = "4.5.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.10'" }, + { name = "traitlets", marker = "python_full_version >= '3.10'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/02/49/9d1284d0dc65e2c757b74c6687b6d319b02f822ad039e5c512df9194d9dd/jupyter_core-5.9.1.tar.gz", hash = "sha256:4d09aaff303b9566c3ce657f580bd089ff5c91f5f89cf7d8846c3cdf465b5508", size = 89814, upload-time = "2025-10-16T19:19:18.444Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/e7/e7/80988e32bf6f73919a113473a604f5a8f09094de312b9d52b79c2df7612b/jupyter_core-5.9.1-py3-none-any.whl", hash = "sha256:ebf87fdc6073d142e114c72c9e29a9d7ca03fad818c5d300ce2adc1fb0743407", size = 29032, upload-time = "2025-10-16T19:19:16.783Z" }, +] + +[[package]] +name = "jupyter-events" +version = "0.10.0" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version < '3.9'", +] +dependencies = [ + { name = "jsonschema", version = "4.23.0", source = { registry = "https://pypi.org/simple" }, extra = ["format-nongpl"], marker = "python_full_version < '3.9'" }, + { name = "python-json-logger", marker = "python_full_version < '3.9'" }, + { name = "pyyaml", marker = "python_full_version < '3.9'" }, + { name = "referencing", version = "0.35.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.9'" }, + { name = "rfc3339-validator", marker = "python_full_version < '3.9'" }, + { name = "rfc3986-validator", marker = "python_full_version < '3.9'" }, + { name = "traitlets", marker = "python_full_version < '3.9'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/8d/53/7537a1aa558229bb0b1b178d814c9d68a9c697d3aecb808a1cb2646acf1f/jupyter_events-0.10.0.tar.gz", hash = "sha256:670b8229d3cc882ec782144ed22e0d29e1c2d639263f92ca8383e66682845e22", size = 61516, upload-time = "2024-03-18T17:41:58.642Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/a5/94/059180ea70a9a326e1815176b2370da56376da347a796f8c4f0b830208ef/jupyter_events-0.10.0-py3-none-any.whl", hash = "sha256:4b72130875e59d57716d327ea70d3ebc3af1944d3717e5a498b8a06c6c159960", size = 18777, upload-time = "2024-03-18T17:41:56.155Z" }, +] + +[[package]] +name = "jupyter-events" +version = "0.12.0" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version >= '3.14'", + "python_full_version >= '3.11' and python_full_version < '3.14'", + "python_full_version == '3.10.*'", + "python_full_version == '3.9.*'", +] +dependencies = [ + { name = "jsonschema", version = "4.25.1", source = { registry = "https://pypi.org/simple" }, extra = ["format-nongpl"], marker = "python_full_version >= '3.9'" }, + { name = "packaging", marker = "python_full_version >= '3.9'" }, + { name = "python-json-logger", marker = "python_full_version >= '3.9'" }, + { name = "pyyaml", marker = "python_full_version >= '3.9'" }, + { name = "referencing", version = "0.36.2", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version == '3.9.*'" }, + { name = "referencing", version = "0.37.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.10'" }, + { name = "rfc3339-validator", marker = "python_full_version >= '3.9'" }, + { name = "rfc3986-validator", marker = "python_full_version >= '3.9'" }, + { name = "traitlets", marker = "python_full_version >= '3.9'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/9d/c3/306d090461e4cf3cd91eceaff84bede12a8e52cd821c2d20c9a4fd728385/jupyter_events-0.12.0.tar.gz", hash = "sha256:fc3fce98865f6784c9cd0a56a20644fc6098f21c8c33834a8d9fe383c17e554b", size = 62196, upload-time = "2025-02-03T17:23:41.485Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/e2/48/577993f1f99c552f18a0428731a755e06171f9902fa118c379eb7c04ea22/jupyter_events-0.12.0-py3-none-any.whl", hash = "sha256:6464b2fa5ad10451c3d35fabc75eab39556ae1e2853ad0c0cc31b656731a97fb", size = 19430, upload-time = "2025-02-03T17:23:38.643Z" }, +] + +[[package]] +name = "jupyter-lsp" +version = "2.3.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "importlib-metadata", version = "8.5.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.9'" }, + { name = "importlib-metadata", version = "8.7.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version == '3.9.*'" }, + { name = "jupyter-server", version = "2.14.2", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.9'" }, + { name = "jupyter-server", version = "2.17.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.9'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/eb/5a/9066c9f8e94ee517133cd98dba393459a16cd48bba71a82f16a65415206c/jupyter_lsp-2.3.0.tar.gz", hash = "sha256:458aa59339dc868fb784d73364f17dbce8836e906cd75fd471a325cba02e0245", size = 54823, upload-time = "2025-08-27T17:47:34.671Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/1a/60/1f6cee0c46263de1173894f0fafcb3475ded276c472c14d25e0280c18d6d/jupyter_lsp-2.3.0-py3-none-any.whl", hash = "sha256:e914a3cb2addf48b1c7710914771aaf1819d46b2e5a79b0f917b5478ec93f34f", size = 76687, upload-time = "2025-08-27T17:47:33.15Z" }, +] + +[[package]] +name = "jupyter-server" +version = "2.14.2" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version < '3.9'", +] +dependencies = [ + { name = "anyio", version = "4.5.2", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.9'" }, + { name = "argon2-cffi", marker = "python_full_version < '3.9'" }, + { name = "jinja2", marker = "python_full_version < '3.9'" }, + { name = "jupyter-client", marker = "python_full_version < '3.9'" }, + { name = "jupyter-core", version = "5.8.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.9'" }, + { name = "jupyter-events", version = "0.10.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.9'" }, + { name = "jupyter-server-terminals", marker = "python_full_version < '3.9'" }, + { name = "nbconvert", marker = "python_full_version < '3.9'" }, + { name = "nbformat", marker = "python_full_version < '3.9'" }, + { name = "overrides", marker = "python_full_version < '3.9'" }, + { name = "packaging", marker = "python_full_version < '3.9'" }, + { name = "prometheus-client", version = "0.21.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.9'" }, + { name = "pywinpty", version = "2.0.14", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.9' and os_name == 'nt'" }, + { name = "pyzmq", marker = "python_full_version < '3.9'" }, + { name = "send2trash", marker = "python_full_version < '3.9'" }, + { name = "terminado", marker = "python_full_version < '3.9'" }, + { name = "tornado", version = "6.4.2", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.9'" }, + { name = "traitlets", marker = "python_full_version < '3.9'" }, + { name = "websocket-client", version = "1.8.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.9'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/0c/34/88b47749c7fa9358e10eac356c4b97d94a91a67d5c935a73f69bc4a31118/jupyter_server-2.14.2.tar.gz", hash = "sha256:66095021aa9638ced276c248b1d81862e4c50f292d575920bbe960de1c56b12b", size = 719933, upload-time = "2024-07-12T18:31:43.019Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/57/e1/085edea6187a127ca8ea053eb01f4e1792d778b4d192c74d32eb6730fed6/jupyter_server-2.14.2-py3-none-any.whl", hash = "sha256:47ff506127c2f7851a17bf4713434208fc490955d0e8632e95014a9a9afbeefd", size = 383556, upload-time = "2024-07-12T18:31:39.724Z" }, +] + +[[package]] +name = "jupyter-server" +version = "2.17.0" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version >= '3.14'", + "python_full_version >= '3.11' and python_full_version < '3.14'", + "python_full_version == '3.10.*'", + "python_full_version == '3.9.*'", +] +dependencies = [ + { name = "anyio", version = "4.12.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.9'" }, + { name = "argon2-cffi", marker = "python_full_version >= '3.9'" }, + { name = "jinja2", marker = "python_full_version >= '3.9'" }, + { name = "jupyter-client", marker = "python_full_version >= '3.9'" }, + { name = "jupyter-core", version = "5.8.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version == '3.9.*'" }, + { name = "jupyter-core", version = "5.9.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.10'" }, + { name = "jupyter-events", version = "0.12.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.9'" }, + { name = "jupyter-server-terminals", marker = "python_full_version >= '3.9'" }, + { name = "nbconvert", marker = "python_full_version >= '3.9'" }, + { name = "nbformat", marker = "python_full_version >= '3.9'" }, + { name = "overrides", marker = "python_full_version >= '3.9' and python_full_version < '3.12'" }, + { name = "packaging", marker = "python_full_version >= '3.9'" }, + { name = "prometheus-client", version = "0.23.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.9'" }, + { name = "pywinpty", version = "3.0.2", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.9' and os_name == 'nt'" }, + { name = "pyzmq", marker = "python_full_version >= '3.9'" }, + { name = "send2trash", marker = "python_full_version >= '3.9'" }, + { name = "terminado", marker = "python_full_version >= '3.9'" }, + { name = "tornado", version = "6.5.2", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.9'" }, + { name = "traitlets", marker = "python_full_version >= '3.9'" }, + { name = "websocket-client", version = "1.9.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.9'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/5b/ac/e040ec363d7b6b1f11304cc9f209dac4517ece5d5e01821366b924a64a50/jupyter_server-2.17.0.tar.gz", hash = "sha256:c38ea898566964c888b4772ae1ed58eca84592e88251d2cfc4d171f81f7e99d5", size = 731949, upload-time = "2025-08-21T14:42:54.042Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/92/80/a24767e6ca280f5a49525d987bf3e4d7552bf67c8be07e8ccf20271f8568/jupyter_server-2.17.0-py3-none-any.whl", hash = "sha256:e8cb9c7db4251f51ed307e329b81b72ccf2056ff82d50524debde1ee1870e13f", size = 388221, upload-time = "2025-08-21T14:42:52.034Z" }, +] + +[[package]] +name = "jupyter-server-proxy" +version = "4.4.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "aiohttp", version = "3.10.11", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.9'" }, + { name = "aiohttp", version = "3.13.2", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.9'" }, + { name = "importlib-metadata", version = "8.5.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.9'" }, + { name = "importlib-metadata", version = "8.7.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version == '3.9.*'" }, + { name = "jupyter-server", version = "2.14.2", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.9'" }, + { name = "jupyter-server", version = "2.17.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.9'" }, + { name = "simpervisor" }, + { name = "tornado", version = "6.4.2", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.9'" }, + { name = "tornado", version = "6.5.2", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.9'" }, + { name = "traitlets" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/2a/c8/ff6ecdbf55ac1a9253d53d87c60004ee508cfc852662b15fb33cd6ebfdbc/jupyter_server_proxy-4.4.0.tar.gz", hash = "sha256:e5732eb9c810c0caa997f90a2f15f7d09af638e7eea9c67eb5c43e9c1f0e1157", size = 136830, upload-time = "2024-08-29T12:49:22.906Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/fd/c6/e4a1d9fdd22d40962befd82780a98b20b67ef9cafe87246e4955f44b8f09/jupyter_server_proxy-4.4.0-py3-none-any.whl", hash = "sha256:707b5c84810bb8863d50f6c6d50a386fec216149e11802b7d4c451b54a63a9a6", size = 37567, upload-time = "2024-08-29T12:49:20.89Z" }, +] + +[[package]] +name = "jupyter-server-terminals" +version = "0.5.3" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pywinpty", version = "2.0.14", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.9' and os_name == 'nt'" }, + { name = "pywinpty", version = "3.0.2", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.9' and os_name == 'nt'" }, + { name = "terminado" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/fc/d5/562469734f476159e99a55426d697cbf8e7eb5efe89fb0e0b4f83a3d3459/jupyter_server_terminals-0.5.3.tar.gz", hash = "sha256:5ae0295167220e9ace0edcfdb212afd2b01ee8d179fe6f23c899590e9b8a5269", size = 31430, upload-time = "2024-03-12T14:37:03.049Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/07/2d/2b32cdbe8d2a602f697a649798554e4f072115438e92249624e532e8aca6/jupyter_server_terminals-0.5.3-py3-none-any.whl", hash = "sha256:41ee0d7dc0ebf2809c668e0fc726dfaf258fcd3e769568996ca731b6194ae9aa", size = 13656, upload-time = "2024-03-12T14:37:00.708Z" }, +] + +[[package]] +name = "jupyterlab" +version = "4.3.8" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version < '3.9'", +] +dependencies = [ + { name = "async-lru", version = "2.0.4", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.9'" }, + { name = "httpx", marker = "python_full_version < '3.9'" }, + { name = "importlib-metadata", version = "8.5.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.9'" }, + { name = "importlib-resources", version = "6.4.5", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.9'" }, + { name = "ipykernel", version = "6.29.5", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.9'" }, + { name = "jinja2", marker = "python_full_version < '3.9'" }, + { name = "jupyter-core", version = "5.8.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.9'" }, + { name = "jupyter-lsp", marker = "python_full_version < '3.9'" }, + { name = "jupyter-server", version = "2.14.2", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.9'" }, + { name = "jupyterlab-server", marker = "python_full_version < '3.9'" }, + { name = "notebook-shim", marker = "python_full_version < '3.9'" }, + { name = "packaging", marker = "python_full_version < '3.9'" }, + { name = "setuptools", version = "75.3.2", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.9'" }, + { name = "tomli", marker = "python_full_version < '3.9'" }, + { name = "tornado", version = "6.4.2", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.9'" }, + { name = "traitlets", marker = "python_full_version < '3.9'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/c1/8e/9d3d91a0492be047167850419e43ba72e7950145ba2ff60824366bcae50f/jupyterlab-4.3.8.tar.gz", hash = "sha256:2ffd0e7b82786dba54743f4d1646130642ed81cb9e52f0a31e79416f6e5ba2e7", size = 21826824, upload-time = "2025-06-24T16:49:34.005Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/e6/15/ef346ab227f161cba2dcffe3ffeb8b4e4d2630600408f8276945d49fc868/jupyterlab-4.3.8-py3-none-any.whl", hash = "sha256:8c6451ef224a18b457975fd52010e45a7aef58b719dfb242c5f253e0e48ea047", size = 11682103, upload-time = "2025-06-24T16:49:28.459Z" }, +] + +[[package]] +name = "jupyterlab" +version = "4.5.0" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version >= '3.14'", + "python_full_version >= '3.11' and python_full_version < '3.14'", + "python_full_version == '3.10.*'", + "python_full_version == '3.9.*'", +] +dependencies = [ + { name = "async-lru", version = "2.0.5", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.9'" }, + { name = "httpx", marker = "python_full_version >= '3.9'" }, + { name = "importlib-metadata", version = "8.7.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version == '3.9.*'" }, + { name = "ipykernel", version = "6.31.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version == '3.9.*'" }, + { name = "ipykernel", version = "7.1.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.10'" }, + { name = "jinja2", marker = "python_full_version >= '3.9'" }, + { name = "jupyter-core", version = "5.8.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version == '3.9.*'" }, + { name = "jupyter-core", version = "5.9.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.10'" }, + { name = "jupyter-lsp", marker = "python_full_version >= '3.9'" }, + { name = "jupyter-server", version = "2.17.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.9'" }, + { name = "jupyterlab-server", marker = "python_full_version >= '3.9'" }, + { name = "notebook-shim", marker = "python_full_version >= '3.9'" }, + { name = "packaging", marker = "python_full_version >= '3.9'" }, + { name = "setuptools", version = "80.9.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.9'" }, + { name = "tomli", marker = "python_full_version >= '3.9' and python_full_version < '3.11'" }, + { name = "tornado", version = "6.5.2", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.9'" }, + { name = "traitlets", marker = "python_full_version >= '3.9'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/df/e5/4fa382a796a6d8e2cd867816b64f1ff27f906e43a7a83ad9eb389e448cd8/jupyterlab-4.5.0.tar.gz", hash = "sha256:aec33d6d8f1225b495ee2cf20f0514f45e6df8e360bdd7ac9bace0b7ac5177ea", size = 23989880, upload-time = "2025-11-18T13:19:00.365Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/6c/1e/5a4d5498eba382fee667ed797cf64ae5d1b13b04356df62f067f48bb0f61/jupyterlab-4.5.0-py3-none-any.whl", hash = "sha256:88e157c75c1afff64c7dc4b801ec471450b922a4eae4305211ddd40da8201c8a", size = 12380641, upload-time = "2025-11-18T13:18:56.252Z" }, +] + +[[package]] +name = "jupyterlab-pygments" +version = "0.3.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/90/51/9187be60d989df97f5f0aba133fa54e7300f17616e065d1ada7d7646b6d6/jupyterlab_pygments-0.3.0.tar.gz", hash = "sha256:721aca4d9029252b11cfa9d185e5b5af4d54772bb8072f9b7036f4170054d35d", size = 512900, upload-time = "2023-11-23T09:26:37.44Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/b1/dd/ead9d8ea85bf202d90cc513b533f9c363121c7792674f78e0d8a854b63b4/jupyterlab_pygments-0.3.0-py3-none-any.whl", hash = "sha256:841a89020971da1d8693f1a99997aefc5dc424bb1b251fd6322462a1b8842780", size = 15884, upload-time = "2023-11-23T09:26:34.325Z" }, +] + +[[package]] +name = "jupyterlab-server" +version = "2.28.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "babel" }, + { name = "importlib-metadata", version = "8.5.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.9'" }, + { name = "importlib-metadata", version = "8.7.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version == '3.9.*'" }, + { name = "jinja2" }, + { name = "json5" }, + { name = "jsonschema", version = "4.23.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.9'" }, + { name = "jsonschema", version = "4.25.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.9'" }, + { name = "jupyter-server", version = "2.14.2", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.9'" }, + { name = "jupyter-server", version = "2.17.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.9'" }, + { name = "packaging" }, + { name = "requests", version = "2.32.4", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.9'" }, + { name = "requests", version = "2.32.5", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.9'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/d6/2c/90153f189e421e93c4bb4f9e3f59802a1f01abd2ac5cf40b152d7f735232/jupyterlab_server-2.28.0.tar.gz", hash = "sha256:35baa81898b15f93573e2deca50d11ac0ae407ebb688299d3a5213265033712c", size = 76996, upload-time = "2025-10-22T13:59:18.37Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/e0/07/a000fe835f76b7e1143242ab1122e6362ef1c03f23f83a045c38859c2ae0/jupyterlab_server-2.28.0-py3-none-any.whl", hash = "sha256:e4355b148fdcf34d312bbbc80f22467d6d20460e8b8736bf235577dd18506968", size = 59830, upload-time = "2025-10-22T13:59:16.767Z" }, +] + +[[package]] +name = "jupyterlab-widgets" +version = "3.0.16" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/26/2d/ef58fed122b268c69c0aa099da20bc67657cdfb2e222688d5731bd5b971d/jupyterlab_widgets-3.0.16.tar.gz", hash = "sha256:423da05071d55cf27a9e602216d35a3a65a3e41cdf9c5d3b643b814ce38c19e0", size = 897423, upload-time = "2025-11-01T21:11:29.724Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ab/b5/36c712098e6191d1b4e349304ef73a8d06aed77e56ceaac8c0a306c7bda1/jupyterlab_widgets-3.0.16-py3-none-any.whl", hash = "sha256:45fa36d9c6422cf2559198e4db481aa243c7a32d9926b500781c830c80f7ecf8", size = 914926, upload-time = "2025-11-01T21:11:28.008Z" }, +] + +[[package]] +name = "keyring" +version = "25.5.0" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version < '3.9'", +] +dependencies = [ + { name = "importlib-metadata", version = "8.5.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.9'" }, + { name = "importlib-resources", version = "6.4.5", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.9'" }, + { name = "jaraco-classes", marker = "python_full_version < '3.9'" }, + { name = "jaraco-context", marker = "python_full_version < '3.9'" }, + { name = "jaraco-functools", version = "4.1.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.9'" }, + { name = "jeepney", marker = "python_full_version < '3.9' and sys_platform == 'linux'" }, + { name = "pywin32-ctypes", marker = "python_full_version < '3.9' and sys_platform == 'win32'" }, + { name = "secretstorage", version = "3.3.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.9' and sys_platform == 'linux'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/f6/24/64447b13df6a0e2797b586dad715766d756c932ce8ace7f67bd384d76ae0/keyring-25.5.0.tar.gz", hash = "sha256:4c753b3ec91717fe713c4edd522d625889d8973a349b0e582622f49766de58e6", size = 62675, upload-time = "2024-10-26T15:40:12.344Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/32/c9/353c156fa2f057e669106e5d6bcdecf85ef8d3536ce68ca96f18dc7b6d6f/keyring-25.5.0-py3-none-any.whl", hash = "sha256:e67f8ac32b04be4714b42fe84ce7dad9c40985b9ca827c592cc303e7c26d9741", size = 39096, upload-time = "2024-10-26T15:40:10.296Z" }, +] + +[[package]] +name = "keyring" +version = "25.7.0" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version >= '3.14'", + "python_full_version >= '3.11' and python_full_version < '3.14'", + "python_full_version == '3.10.*'", + "python_full_version == '3.9.*'", +] +dependencies = [ + { name = "importlib-metadata", version = "8.7.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.9' and python_full_version < '3.12'" }, + { name = "jaraco-classes", marker = "python_full_version >= '3.9'" }, + { name = "jaraco-context", marker = "python_full_version >= '3.9'" }, + { name = "jaraco-functools", version = "4.3.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.9'" }, + { name = "jeepney", marker = "python_full_version >= '3.9' and sys_platform == 'linux'" }, + { name = "pywin32-ctypes", marker = "python_full_version >= '3.9' and sys_platform == 'win32'" }, + { name = "secretstorage", version = "3.3.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version == '3.9.*' and sys_platform == 'linux'" }, + { name = "secretstorage", version = "3.5.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.10' and sys_platform == 'linux'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/43/4b/674af6ef2f97d56f0ab5153bf0bfa28ccb6c3ed4d1babf4305449668807b/keyring-25.7.0.tar.gz", hash = "sha256:fe01bd85eb3f8fb3dd0405defdeac9a5b4f6f0439edbb3149577f244a2e8245b", size = 63516, upload-time = "2025-11-16T16:26:09.482Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/81/db/e655086b7f3a705df045bf0933bdd9c2f79bb3c97bfef1384598bb79a217/keyring-25.7.0-py3-none-any.whl", hash = "sha256:be4a0b195f149690c166e850609a477c532ddbfbaed96a404d4e43f8d5e2689f", size = 39160, upload-time = "2025-11-16T16:26:08.402Z" }, +] + +[[package]] +name = "kiwisolver" +version = "1.4.7" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version == '3.9.*'", + "python_full_version < '3.9'", +] +sdist = { url = "https://files.pythonhosted.org/packages/85/4d/2255e1c76304cbd60b48cee302b66d1dde4468dc5b1160e4b7cb43778f2a/kiwisolver-1.4.7.tar.gz", hash = "sha256:9893ff81bd7107f7b685d3017cc6583daadb4fc26e4a888350df530e41980a60", size = 97286, upload-time = "2024-09-04T09:39:44.302Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/97/14/fc943dd65268a96347472b4fbe5dcc2f6f55034516f80576cd0dd3a8930f/kiwisolver-1.4.7-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:8a9c83f75223d5e48b0bc9cb1bf2776cf01563e00ade8775ffe13b0b6e1af3a6", size = 122440, upload-time = "2024-09-04T09:03:44.9Z" }, + { url = "https://files.pythonhosted.org/packages/1e/46/e68fed66236b69dd02fcdb506218c05ac0e39745d696d22709498896875d/kiwisolver-1.4.7-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:58370b1ffbd35407444d57057b57da5d6549d2d854fa30249771775c63b5fe17", size = 65758, upload-time = "2024-09-04T09:03:46.582Z" }, + { url = "https://files.pythonhosted.org/packages/ef/fa/65de49c85838681fc9cb05de2a68067a683717321e01ddafb5b8024286f0/kiwisolver-1.4.7-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:aa0abdf853e09aff551db11fce173e2177d00786c688203f52c87ad7fcd91ef9", size = 64311, upload-time = "2024-09-04T09:03:47.973Z" }, + { url = "https://files.pythonhosted.org/packages/42/9c/cc8d90f6ef550f65443bad5872ffa68f3dee36de4974768628bea7c14979/kiwisolver-1.4.7-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:8d53103597a252fb3ab8b5845af04c7a26d5e7ea8122303dd7a021176a87e8b9", size = 1637109, upload-time = "2024-09-04T09:03:49.281Z" }, + { url = "https://files.pythonhosted.org/packages/55/91/0a57ce324caf2ff5403edab71c508dd8f648094b18cfbb4c8cc0fde4a6ac/kiwisolver-1.4.7-cp310-cp310-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:88f17c5ffa8e9462fb79f62746428dd57b46eb931698e42e990ad63103f35e6c", size = 1617814, upload-time = "2024-09-04T09:03:51.444Z" }, + { url = "https://files.pythonhosted.org/packages/12/5d/c36140313f2510e20207708adf36ae4919416d697ee0236b0ddfb6fd1050/kiwisolver-1.4.7-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:88a9ca9c710d598fd75ee5de59d5bda2684d9db36a9f50b6125eaea3969c2599", size = 1400881, upload-time = "2024-09-04T09:03:53.357Z" }, + { url = "https://files.pythonhosted.org/packages/56/d0/786e524f9ed648324a466ca8df86298780ef2b29c25313d9a4f16992d3cf/kiwisolver-1.4.7-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f4d742cb7af1c28303a51b7a27aaee540e71bb8e24f68c736f6f2ffc82f2bf05", size = 1512972, upload-time = "2024-09-04T09:03:55.082Z" }, + { url = "https://files.pythonhosted.org/packages/67/5a/77851f2f201e6141d63c10a0708e996a1363efaf9e1609ad0441b343763b/kiwisolver-1.4.7-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e28c7fea2196bf4c2f8d46a0415c77a1c480cc0724722f23d7410ffe9842c407", size = 1444787, upload-time = "2024-09-04T09:03:56.588Z" }, + { url = "https://files.pythonhosted.org/packages/06/5f/1f5eaab84355885e224a6fc8d73089e8713dc7e91c121f00b9a1c58a2195/kiwisolver-1.4.7-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:e968b84db54f9d42046cf154e02911e39c0435c9801681e3fc9ce8a3c4130278", size = 2199212, upload-time = "2024-09-04T09:03:58.557Z" }, + { url = "https://files.pythonhosted.org/packages/b5/28/9152a3bfe976a0ae21d445415defc9d1cd8614b2910b7614b30b27a47270/kiwisolver-1.4.7-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:0c18ec74c0472de033e1bebb2911c3c310eef5649133dd0bedf2a169a1b269e5", size = 2346399, upload-time = "2024-09-04T09:04:00.178Z" }, + { url = "https://files.pythonhosted.org/packages/26/f6/453d1904c52ac3b400f4d5e240ac5fec25263716723e44be65f4d7149d13/kiwisolver-1.4.7-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:8f0ea6da6d393d8b2e187e6a5e3fb81f5862010a40c3945e2c6d12ae45cfb2ad", size = 2308688, upload-time = "2024-09-04T09:04:02.216Z" }, + { url = "https://files.pythonhosted.org/packages/5a/9a/d4968499441b9ae187e81745e3277a8b4d7c60840a52dc9d535a7909fac3/kiwisolver-1.4.7-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:f106407dda69ae456dd1227966bf445b157ccc80ba0dff3802bb63f30b74e895", size = 2445493, upload-time = "2024-09-04T09:04:04.571Z" }, + { url = "https://files.pythonhosted.org/packages/07/c9/032267192e7828520dacb64dfdb1d74f292765f179e467c1cba97687f17d/kiwisolver-1.4.7-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:84ec80df401cfee1457063732d90022f93951944b5b58975d34ab56bb150dfb3", size = 2262191, upload-time = "2024-09-04T09:04:05.969Z" }, + { url = "https://files.pythonhosted.org/packages/6c/ad/db0aedb638a58b2951da46ddaeecf204be8b4f5454df020d850c7fa8dca8/kiwisolver-1.4.7-cp310-cp310-win32.whl", hash = "sha256:71bb308552200fb2c195e35ef05de12f0c878c07fc91c270eb3d6e41698c3bcc", size = 46644, upload-time = "2024-09-04T09:04:07.408Z" }, + { url = "https://files.pythonhosted.org/packages/12/ca/d0f7b7ffbb0be1e7c2258b53554efec1fd652921f10d7d85045aff93ab61/kiwisolver-1.4.7-cp310-cp310-win_amd64.whl", hash = "sha256:44756f9fd339de0fb6ee4f8c1696cfd19b2422e0d70b4cefc1cc7f1f64045a8c", size = 55877, upload-time = "2024-09-04T09:04:08.869Z" }, + { url = "https://files.pythonhosted.org/packages/97/6c/cfcc128672f47a3e3c0d918ecb67830600078b025bfc32d858f2e2d5c6a4/kiwisolver-1.4.7-cp310-cp310-win_arm64.whl", hash = "sha256:78a42513018c41c2ffd262eb676442315cbfe3c44eed82385c2ed043bc63210a", size = 48347, upload-time = "2024-09-04T09:04:10.106Z" }, + { url = "https://files.pythonhosted.org/packages/e9/44/77429fa0a58f941d6e1c58da9efe08597d2e86bf2b2cce6626834f49d07b/kiwisolver-1.4.7-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:d2b0e12a42fb4e72d509fc994713d099cbb15ebf1103545e8a45f14da2dfca54", size = 122442, upload-time = "2024-09-04T09:04:11.432Z" }, + { url = "https://files.pythonhosted.org/packages/e5/20/8c75caed8f2462d63c7fd65e16c832b8f76cda331ac9e615e914ee80bac9/kiwisolver-1.4.7-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:2a8781ac3edc42ea4b90bc23e7d37b665d89423818e26eb6df90698aa2287c95", size = 65762, upload-time = "2024-09-04T09:04:12.468Z" }, + { url = "https://files.pythonhosted.org/packages/f4/98/fe010f15dc7230f45bc4cf367b012d651367fd203caaa992fd1f5963560e/kiwisolver-1.4.7-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:46707a10836894b559e04b0fd143e343945c97fd170d69a2d26d640b4e297935", size = 64319, upload-time = "2024-09-04T09:04:13.635Z" }, + { url = "https://files.pythonhosted.org/packages/8b/1b/b5d618f4e58c0675654c1e5051bcf42c776703edb21c02b8c74135541f60/kiwisolver-1.4.7-cp311-cp311-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ef97b8df011141c9b0f6caf23b29379f87dd13183c978a30a3c546d2c47314cb", size = 1334260, upload-time = "2024-09-04T09:04:14.878Z" }, + { url = "https://files.pythonhosted.org/packages/b8/01/946852b13057a162a8c32c4c8d2e9ed79f0bb5d86569a40c0b5fb103e373/kiwisolver-1.4.7-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3ab58c12a2cd0fc769089e6d38466c46d7f76aced0a1f54c77652446733d2d02", size = 1426589, upload-time = "2024-09-04T09:04:16.514Z" }, + { url = "https://files.pythonhosted.org/packages/70/d1/c9f96df26b459e15cf8a965304e6e6f4eb291e0f7a9460b4ad97b047561e/kiwisolver-1.4.7-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:803b8e1459341c1bb56d1c5c010406d5edec8a0713a0945851290a7930679b51", size = 1541080, upload-time = "2024-09-04T09:04:18.322Z" }, + { url = "https://files.pythonhosted.org/packages/d3/73/2686990eb8b02d05f3de759d6a23a4ee7d491e659007dd4c075fede4b5d0/kiwisolver-1.4.7-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f9a9e8a507420fe35992ee9ecb302dab68550dedc0da9e2880dd88071c5fb052", size = 1470049, upload-time = "2024-09-04T09:04:20.266Z" }, + { url = "https://files.pythonhosted.org/packages/a7/4b/2db7af3ed3af7c35f388d5f53c28e155cd402a55432d800c543dc6deb731/kiwisolver-1.4.7-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:18077b53dc3bb490e330669a99920c5e6a496889ae8c63b58fbc57c3d7f33a18", size = 1426376, upload-time = "2024-09-04T09:04:22.419Z" }, + { url = "https://files.pythonhosted.org/packages/05/83/2857317d04ea46dc5d115f0df7e676997bbd968ced8e2bd6f7f19cfc8d7f/kiwisolver-1.4.7-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:6af936f79086a89b3680a280c47ea90b4df7047b5bdf3aa5c524bbedddb9e545", size = 2222231, upload-time = "2024-09-04T09:04:24.526Z" }, + { url = "https://files.pythonhosted.org/packages/0d/b5/866f86f5897cd4ab6d25d22e403404766a123f138bd6a02ecb2cdde52c18/kiwisolver-1.4.7-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:3abc5b19d24af4b77d1598a585b8a719beb8569a71568b66f4ebe1fb0449460b", size = 2368634, upload-time = "2024-09-04T09:04:25.899Z" }, + { url = "https://files.pythonhosted.org/packages/c1/ee/73de8385403faba55f782a41260210528fe3273d0cddcf6d51648202d6d0/kiwisolver-1.4.7-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:933d4de052939d90afbe6e9d5273ae05fb836cc86c15b686edd4b3560cc0ee36", size = 2329024, upload-time = "2024-09-04T09:04:28.523Z" }, + { url = "https://files.pythonhosted.org/packages/a1/e7/cd101d8cd2cdfaa42dc06c433df17c8303d31129c9fdd16c0ea37672af91/kiwisolver-1.4.7-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:65e720d2ab2b53f1f72fb5da5fb477455905ce2c88aaa671ff0a447c2c80e8e3", size = 2468484, upload-time = "2024-09-04T09:04:30.547Z" }, + { url = "https://files.pythonhosted.org/packages/e1/72/84f09d45a10bc57a40bb58b81b99d8f22b58b2040c912b7eb97ebf625bf2/kiwisolver-1.4.7-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:3bf1ed55088f214ba6427484c59553123fdd9b218a42bbc8c6496d6754b1e523", size = 2284078, upload-time = "2024-09-04T09:04:33.218Z" }, + { url = "https://files.pythonhosted.org/packages/d2/d4/71828f32b956612dc36efd7be1788980cb1e66bfb3706e6dec9acad9b4f9/kiwisolver-1.4.7-cp311-cp311-win32.whl", hash = "sha256:4c00336b9dd5ad96d0a558fd18a8b6f711b7449acce4c157e7343ba92dd0cf3d", size = 46645, upload-time = "2024-09-04T09:04:34.371Z" }, + { url = "https://files.pythonhosted.org/packages/a1/65/d43e9a20aabcf2e798ad1aff6c143ae3a42cf506754bcb6a7ed8259c8425/kiwisolver-1.4.7-cp311-cp311-win_amd64.whl", hash = "sha256:929e294c1ac1e9f615c62a4e4313ca1823ba37326c164ec720a803287c4c499b", size = 56022, upload-time = "2024-09-04T09:04:35.786Z" }, + { url = "https://files.pythonhosted.org/packages/35/b3/9f75a2e06f1b4ca00b2b192bc2b739334127d27f1d0625627ff8479302ba/kiwisolver-1.4.7-cp311-cp311-win_arm64.whl", hash = "sha256:e33e8fbd440c917106b237ef1a2f1449dfbb9b6f6e1ce17c94cd6a1e0d438376", size = 48536, upload-time = "2024-09-04T09:04:37.525Z" }, + { url = "https://files.pythonhosted.org/packages/97/9c/0a11c714cf8b6ef91001c8212c4ef207f772dd84540104952c45c1f0a249/kiwisolver-1.4.7-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:5360cc32706dab3931f738d3079652d20982511f7c0ac5711483e6eab08efff2", size = 121808, upload-time = "2024-09-04T09:04:38.637Z" }, + { url = "https://files.pythonhosted.org/packages/f2/d8/0fe8c5f5d35878ddd135f44f2af0e4e1d379e1c7b0716f97cdcb88d4fd27/kiwisolver-1.4.7-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:942216596dc64ddb25adb215c3c783215b23626f8d84e8eff8d6d45c3f29f75a", size = 65531, upload-time = "2024-09-04T09:04:39.694Z" }, + { url = "https://files.pythonhosted.org/packages/80/c5/57fa58276dfdfa612241d640a64ca2f76adc6ffcebdbd135b4ef60095098/kiwisolver-1.4.7-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:48b571ecd8bae15702e4f22d3ff6a0f13e54d3d00cd25216d5e7f658242065ee", size = 63894, upload-time = "2024-09-04T09:04:41.6Z" }, + { url = "https://files.pythonhosted.org/packages/8b/e9/26d3edd4c4ad1c5b891d8747a4f81b1b0aba9fb9721de6600a4adc09773b/kiwisolver-1.4.7-cp312-cp312-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ad42ba922c67c5f219097b28fae965e10045ddf145d2928bfac2eb2e17673640", size = 1369296, upload-time = "2024-09-04T09:04:42.886Z" }, + { url = "https://files.pythonhosted.org/packages/b6/67/3f4850b5e6cffb75ec40577ddf54f7b82b15269cc5097ff2e968ee32ea7d/kiwisolver-1.4.7-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:612a10bdae23404a72941a0fc8fa2660c6ea1217c4ce0dbcab8a8f6543ea9e7f", size = 1461450, upload-time = "2024-09-04T09:04:46.284Z" }, + { url = "https://files.pythonhosted.org/packages/52/be/86cbb9c9a315e98a8dc6b1d23c43cffd91d97d49318854f9c37b0e41cd68/kiwisolver-1.4.7-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9e838bba3a3bac0fe06d849d29772eb1afb9745a59710762e4ba3f4cb8424483", size = 1579168, upload-time = "2024-09-04T09:04:47.91Z" }, + { url = "https://files.pythonhosted.org/packages/0f/00/65061acf64bd5fd34c1f4ae53f20b43b0a017a541f242a60b135b9d1e301/kiwisolver-1.4.7-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:22f499f6157236c19f4bbbd472fa55b063db77a16cd74d49afe28992dff8c258", size = 1507308, upload-time = "2024-09-04T09:04:49.465Z" }, + { url = "https://files.pythonhosted.org/packages/21/e4/c0b6746fd2eb62fe702118b3ca0cb384ce95e1261cfada58ff693aeec08a/kiwisolver-1.4.7-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:693902d433cf585133699972b6d7c42a8b9f8f826ebcaf0132ff55200afc599e", size = 1464186, upload-time = "2024-09-04T09:04:50.949Z" }, + { url = "https://files.pythonhosted.org/packages/0a/0f/529d0a9fffb4d514f2782c829b0b4b371f7f441d61aa55f1de1c614c4ef3/kiwisolver-1.4.7-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:4e77f2126c3e0b0d055f44513ed349038ac180371ed9b52fe96a32aa071a5107", size = 2247877, upload-time = "2024-09-04T09:04:52.388Z" }, + { url = "https://files.pythonhosted.org/packages/d1/e1/66603ad779258843036d45adcbe1af0d1a889a07af4635f8b4ec7dccda35/kiwisolver-1.4.7-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:657a05857bda581c3656bfc3b20e353c232e9193eb167766ad2dc58b56504948", size = 2404204, upload-time = "2024-09-04T09:04:54.385Z" }, + { url = "https://files.pythonhosted.org/packages/8d/61/de5fb1ca7ad1f9ab7970e340a5b833d735df24689047de6ae71ab9d8d0e7/kiwisolver-1.4.7-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:4bfa75a048c056a411f9705856abfc872558e33c055d80af6a380e3658766038", size = 2352461, upload-time = "2024-09-04T09:04:56.307Z" }, + { url = "https://files.pythonhosted.org/packages/ba/d2/0edc00a852e369827f7e05fd008275f550353f1f9bcd55db9363d779fc63/kiwisolver-1.4.7-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:34ea1de54beef1c104422d210c47c7d2a4999bdecf42c7b5718fbe59a4cac383", size = 2501358, upload-time = "2024-09-04T09:04:57.922Z" }, + { url = "https://files.pythonhosted.org/packages/84/15/adc15a483506aec6986c01fb7f237c3aec4d9ed4ac10b756e98a76835933/kiwisolver-1.4.7-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:90da3b5f694b85231cf93586dad5e90e2d71b9428f9aad96952c99055582f520", size = 2314119, upload-time = "2024-09-04T09:04:59.332Z" }, + { url = "https://files.pythonhosted.org/packages/36/08/3a5bb2c53c89660863a5aa1ee236912269f2af8762af04a2e11df851d7b2/kiwisolver-1.4.7-cp312-cp312-win32.whl", hash = "sha256:18e0cca3e008e17fe9b164b55735a325140a5a35faad8de92dd80265cd5eb80b", size = 46367, upload-time = "2024-09-04T09:05:00.804Z" }, + { url = "https://files.pythonhosted.org/packages/19/93/c05f0a6d825c643779fc3c70876bff1ac221f0e31e6f701f0e9578690d70/kiwisolver-1.4.7-cp312-cp312-win_amd64.whl", hash = "sha256:58cb20602b18f86f83a5c87d3ee1c766a79c0d452f8def86d925e6c60fbf7bfb", size = 55884, upload-time = "2024-09-04T09:05:01.924Z" }, + { url = "https://files.pythonhosted.org/packages/d2/f9/3828d8f21b6de4279f0667fb50a9f5215e6fe57d5ec0d61905914f5b6099/kiwisolver-1.4.7-cp312-cp312-win_arm64.whl", hash = "sha256:f5a8b53bdc0b3961f8b6125e198617c40aeed638b387913bf1ce78afb1b0be2a", size = 48528, upload-time = "2024-09-04T09:05:02.983Z" }, + { url = "https://files.pythonhosted.org/packages/c4/06/7da99b04259b0f18b557a4effd1b9c901a747f7fdd84cf834ccf520cb0b2/kiwisolver-1.4.7-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:2e6039dcbe79a8e0f044f1c39db1986a1b8071051efba3ee4d74f5b365f5226e", size = 121913, upload-time = "2024-09-04T09:05:04.072Z" }, + { url = "https://files.pythonhosted.org/packages/97/f5/b8a370d1aa593c17882af0a6f6755aaecd643640c0ed72dcfd2eafc388b9/kiwisolver-1.4.7-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:a1ecf0ac1c518487d9d23b1cd7139a6a65bc460cd101ab01f1be82ecf09794b6", size = 65627, upload-time = "2024-09-04T09:05:05.119Z" }, + { url = "https://files.pythonhosted.org/packages/2a/fc/6c0374f7503522539e2d4d1b497f5ebad3f8ed07ab51aed2af988dd0fb65/kiwisolver-1.4.7-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:7ab9ccab2b5bd5702ab0803676a580fffa2aa178c2badc5557a84cc943fcf750", size = 63888, upload-time = "2024-09-04T09:05:06.191Z" }, + { url = "https://files.pythonhosted.org/packages/bf/3e/0b7172793d0f41cae5c923492da89a2ffcd1adf764c16159ca047463ebd3/kiwisolver-1.4.7-cp313-cp313-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f816dd2277f8d63d79f9c8473a79fe54047bc0467754962840782c575522224d", size = 1369145, upload-time = "2024-09-04T09:05:07.919Z" }, + { url = "https://files.pythonhosted.org/packages/77/92/47d050d6f6aced2d634258123f2688fbfef8ded3c5baf2c79d94d91f1f58/kiwisolver-1.4.7-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cf8bcc23ceb5a1b624572a1623b9f79d2c3b337c8c455405ef231933a10da379", size = 1461448, upload-time = "2024-09-04T09:05:10.01Z" }, + { url = "https://files.pythonhosted.org/packages/9c/1b/8f80b18e20b3b294546a1adb41701e79ae21915f4175f311a90d042301cf/kiwisolver-1.4.7-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:dea0bf229319828467d7fca8c7c189780aa9ff679c94539eed7532ebe33ed37c", size = 1578750, upload-time = "2024-09-04T09:05:11.598Z" }, + { url = "https://files.pythonhosted.org/packages/a4/fe/fe8e72f3be0a844f257cadd72689c0848c6d5c51bc1d60429e2d14ad776e/kiwisolver-1.4.7-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7c06a4c7cf15ec739ce0e5971b26c93638730090add60e183530d70848ebdd34", size = 1507175, upload-time = "2024-09-04T09:05:13.22Z" }, + { url = "https://files.pythonhosted.org/packages/39/fa/cdc0b6105d90eadc3bee525fecc9179e2b41e1ce0293caaf49cb631a6aaf/kiwisolver-1.4.7-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:913983ad2deb14e66d83c28b632fd35ba2b825031f2fa4ca29675e665dfecbe1", size = 1463963, upload-time = "2024-09-04T09:05:15.925Z" }, + { url = "https://files.pythonhosted.org/packages/6e/5c/0c03c4e542720c6177d4f408e56d1c8315899db72d46261a4e15b8b33a41/kiwisolver-1.4.7-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:5337ec7809bcd0f424c6b705ecf97941c46279cf5ed92311782c7c9c2026f07f", size = 2248220, upload-time = "2024-09-04T09:05:17.434Z" }, + { url = "https://files.pythonhosted.org/packages/3d/ee/55ef86d5a574f4e767df7da3a3a7ff4954c996e12d4fbe9c408170cd7dcc/kiwisolver-1.4.7-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:4c26ed10c4f6fa6ddb329a5120ba3b6db349ca192ae211e882970bfc9d91420b", size = 2404463, upload-time = "2024-09-04T09:05:18.997Z" }, + { url = "https://files.pythonhosted.org/packages/0f/6d/73ad36170b4bff4825dc588acf4f3e6319cb97cd1fb3eb04d9faa6b6f212/kiwisolver-1.4.7-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:c619b101e6de2222c1fcb0531e1b17bbffbe54294bfba43ea0d411d428618c27", size = 2352842, upload-time = "2024-09-04T09:05:21.299Z" }, + { url = "https://files.pythonhosted.org/packages/0b/16/fa531ff9199d3b6473bb4d0f47416cdb08d556c03b8bc1cccf04e756b56d/kiwisolver-1.4.7-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:073a36c8273647592ea332e816e75ef8da5c303236ec0167196793eb1e34657a", size = 2501635, upload-time = "2024-09-04T09:05:23.588Z" }, + { url = "https://files.pythonhosted.org/packages/78/7e/aa9422e78419db0cbe75fb86d8e72b433818f2e62e2e394992d23d23a583/kiwisolver-1.4.7-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:3ce6b2b0231bda412463e152fc18335ba32faf4e8c23a754ad50ffa70e4091ee", size = 2314556, upload-time = "2024-09-04T09:05:25.907Z" }, + { url = "https://files.pythonhosted.org/packages/a8/b2/15f7f556df0a6e5b3772a1e076a9d9f6c538ce5f05bd590eca8106508e06/kiwisolver-1.4.7-cp313-cp313-win32.whl", hash = "sha256:f4c9aee212bc89d4e13f58be11a56cc8036cabad119259d12ace14b34476fd07", size = 46364, upload-time = "2024-09-04T09:05:27.184Z" }, + { url = "https://files.pythonhosted.org/packages/0b/db/32e897e43a330eee8e4770bfd2737a9584b23e33587a0812b8e20aac38f7/kiwisolver-1.4.7-cp313-cp313-win_amd64.whl", hash = "sha256:8a3ec5aa8e38fc4c8af308917ce12c536f1c88452ce554027e55b22cbbfbff76", size = 55887, upload-time = "2024-09-04T09:05:28.372Z" }, + { url = "https://files.pythonhosted.org/packages/c8/a4/df2bdca5270ca85fd25253049eb6708d4127be2ed0e5c2650217450b59e9/kiwisolver-1.4.7-cp313-cp313-win_arm64.whl", hash = "sha256:76c8094ac20ec259471ac53e774623eb62e6e1f56cd8690c67ce6ce4fcb05650", size = 48530, upload-time = "2024-09-04T09:05:30.225Z" }, + { url = "https://files.pythonhosted.org/packages/57/d6/620247574d9e26fe24384087879e8399e309f0051782f95238090afa6ccc/kiwisolver-1.4.7-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:5d5abf8f8ec1f4e22882273c423e16cae834c36856cac348cfbfa68e01c40f3a", size = 122325, upload-time = "2024-09-04T09:05:31.648Z" }, + { url = "https://files.pythonhosted.org/packages/bd/c6/572ad7d73dbd898cffa9050ffd7ff7e78a055a1d9b7accd6b4d1f50ec858/kiwisolver-1.4.7-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:aeb3531b196ef6f11776c21674dba836aeea9d5bd1cf630f869e3d90b16cfade", size = 65679, upload-time = "2024-09-04T09:05:32.934Z" }, + { url = "https://files.pythonhosted.org/packages/14/a7/bb8ab10e12cc8764f4da0245d72dee4731cc720bdec0f085d5e9c6005b98/kiwisolver-1.4.7-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:b7d755065e4e866a8086c9bdada157133ff466476a2ad7861828e17b6026e22c", size = 64267, upload-time = "2024-09-04T09:05:34.11Z" }, + { url = "https://files.pythonhosted.org/packages/54/a4/3b5a2542429e182a4df0528214e76803f79d016110f5e67c414a0357cd7d/kiwisolver-1.4.7-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:08471d4d86cbaec61f86b217dd938a83d85e03785f51121e791a6e6689a3be95", size = 1387236, upload-time = "2024-09-04T09:05:35.97Z" }, + { url = "https://files.pythonhosted.org/packages/a6/d7/bc3005e906c1673953a3e31ee4f828157d5e07a62778d835dd937d624ea0/kiwisolver-1.4.7-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:7bbfcb7165ce3d54a3dfbe731e470f65739c4c1f85bb1018ee912bae139e263b", size = 1500555, upload-time = "2024-09-04T09:05:37.552Z" }, + { url = "https://files.pythonhosted.org/packages/09/a7/87cb30741f13b7af08446795dca6003491755805edc9c321fe996c1320b8/kiwisolver-1.4.7-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5d34eb8494bea691a1a450141ebb5385e4b69d38bb8403b5146ad279f4b30fa3", size = 1431684, upload-time = "2024-09-04T09:05:39.75Z" }, + { url = "https://files.pythonhosted.org/packages/37/a4/1e4e2d8cdaa42c73d523413498445247e615334e39401ae49dae74885429/kiwisolver-1.4.7-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:9242795d174daa40105c1d86aba618e8eab7bf96ba8c3ee614da8302a9f95503", size = 1125811, upload-time = "2024-09-04T09:05:41.31Z" }, + { url = "https://files.pythonhosted.org/packages/76/36/ae40d7a3171e06f55ac77fe5536079e7be1d8be2a8210e08975c7f9b4d54/kiwisolver-1.4.7-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:a0f64a48bb81af7450e641e3fe0b0394d7381e342805479178b3d335d60ca7cf", size = 1179987, upload-time = "2024-09-04T09:05:42.893Z" }, + { url = "https://files.pythonhosted.org/packages/d8/5d/6e4894b9fdf836d8bd095729dff123bbbe6ad0346289287b45c800fae656/kiwisolver-1.4.7-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:8e045731a5416357638d1700927529e2b8ab304811671f665b225f8bf8d8f933", size = 2186817, upload-time = "2024-09-04T09:05:44.474Z" }, + { url = "https://files.pythonhosted.org/packages/f0/2d/603079b2c2fd62890be0b0ebfc8bb6dda8a5253ca0758885596565b0dfc1/kiwisolver-1.4.7-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:4322872d5772cae7369f8351da1edf255a604ea7087fe295411397d0cfd9655e", size = 2332538, upload-time = "2024-09-04T09:05:46.206Z" }, + { url = "https://files.pythonhosted.org/packages/bb/2a/9a28279c865c38a27960db38b07179143aafc94877945c209bfc553d9dd3/kiwisolver-1.4.7-cp38-cp38-musllinux_1_2_ppc64le.whl", hash = "sha256:e1631290ee9271dffe3062d2634c3ecac02c83890ada077d225e081aca8aab89", size = 2293890, upload-time = "2024-09-04T09:05:47.819Z" }, + { url = "https://files.pythonhosted.org/packages/1a/4d/4da8967f3bf13c764984b8fbae330683ee5fbd555b4a5624ad2b9decc0ab/kiwisolver-1.4.7-cp38-cp38-musllinux_1_2_s390x.whl", hash = "sha256:edcfc407e4eb17e037bca59be0e85a2031a2ac87e4fed26d3e9df88b4165f92d", size = 2434677, upload-time = "2024-09-04T09:05:49.459Z" }, + { url = "https://files.pythonhosted.org/packages/08/e9/a97a2b6b74dd850fa5974309367e025c06093a143befe9b962d0baebb4f0/kiwisolver-1.4.7-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:4d05d81ecb47d11e7f8932bd8b61b720bf0b41199358f3f5e36d38e28f0532c5", size = 2250339, upload-time = "2024-09-04T09:05:51.165Z" }, + { url = "https://files.pythonhosted.org/packages/8a/e7/55507a387ba1766e69f5e13a79e1aefabdafe0532bee5d1972dfc42b3d16/kiwisolver-1.4.7-cp38-cp38-win32.whl", hash = "sha256:b38ac83d5f04b15e515fd86f312479d950d05ce2368d5413d46c088dda7de90a", size = 46932, upload-time = "2024-09-04T09:05:52.49Z" }, + { url = "https://files.pythonhosted.org/packages/52/77/7e04cca2ff1dc6ee6b7654cebe233de72b7a3ec5616501b6f3144fb70740/kiwisolver-1.4.7-cp38-cp38-win_amd64.whl", hash = "sha256:d83db7cde68459fc803052a55ace60bea2bae361fc3b7a6d5da07e11954e4b09", size = 55836, upload-time = "2024-09-04T09:05:54.078Z" }, + { url = "https://files.pythonhosted.org/packages/11/88/37ea0ea64512997b13d69772db8dcdc3bfca5442cda3a5e4bb943652ee3e/kiwisolver-1.4.7-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:3f9362ecfca44c863569d3d3c033dbe8ba452ff8eed6f6b5806382741a1334bd", size = 122449, upload-time = "2024-09-04T09:05:55.311Z" }, + { url = "https://files.pythonhosted.org/packages/4e/45/5a5c46078362cb3882dcacad687c503089263c017ca1241e0483857791eb/kiwisolver-1.4.7-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:e8df2eb9b2bac43ef8b082e06f750350fbbaf2887534a5be97f6cf07b19d9583", size = 65757, upload-time = "2024-09-04T09:05:56.906Z" }, + { url = "https://files.pythonhosted.org/packages/8a/be/a6ae58978772f685d48dd2e84460937761c53c4bbd84e42b0336473d9775/kiwisolver-1.4.7-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:f32d6edbc638cde7652bd690c3e728b25332acbadd7cad670cc4a02558d9c417", size = 64312, upload-time = "2024-09-04T09:05:58.384Z" }, + { url = "https://files.pythonhosted.org/packages/f4/04/18ef6f452d311e1e1eb180c9bf5589187fa1f042db877e6fe443ef10099c/kiwisolver-1.4.7-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:e2e6c39bd7b9372b0be21456caab138e8e69cc0fc1190a9dfa92bd45a1e6e904", size = 1626966, upload-time = "2024-09-04T09:05:59.855Z" }, + { url = "https://files.pythonhosted.org/packages/21/b1/40655f6c3fa11ce740e8a964fa8e4c0479c87d6a7944b95af799c7a55dfe/kiwisolver-1.4.7-cp39-cp39-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:dda56c24d869b1193fcc763f1284b9126550eaf84b88bbc7256e15028f19188a", size = 1607044, upload-time = "2024-09-04T09:06:02.16Z" }, + { url = "https://files.pythonhosted.org/packages/fd/93/af67dbcfb9b3323bbd2c2db1385a7139d8f77630e4a37bb945b57188eb2d/kiwisolver-1.4.7-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:79849239c39b5e1fd906556c474d9b0439ea6792b637511f3fe3a41158d89ca8", size = 1391879, upload-time = "2024-09-04T09:06:03.908Z" }, + { url = "https://files.pythonhosted.org/packages/40/6f/d60770ef98e77b365d96061d090c0cd9e23418121c55fff188fa4bdf0b54/kiwisolver-1.4.7-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5e3bc157fed2a4c02ec468de4ecd12a6e22818d4f09cde2c31ee3226ffbefab2", size = 1504751, upload-time = "2024-09-04T09:06:05.58Z" }, + { url = "https://files.pythonhosted.org/packages/fa/3a/5f38667d313e983c432f3fcd86932177519ed8790c724e07d77d1de0188a/kiwisolver-1.4.7-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3da53da805b71e41053dc670f9a820d1157aae77b6b944e08024d17bcd51ef88", size = 1436990, upload-time = "2024-09-04T09:06:08.126Z" }, + { url = "https://files.pythonhosted.org/packages/cb/3b/1520301a47326e6a6043b502647e42892be33b3f051e9791cc8bb43f1a32/kiwisolver-1.4.7-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:8705f17dfeb43139a692298cb6637ee2e59c0194538153e83e9ee0c75c2eddde", size = 2191122, upload-time = "2024-09-04T09:06:10.345Z" }, + { url = "https://files.pythonhosted.org/packages/cf/c4/eb52da300c166239a2233f1f9c4a1b767dfab98fae27681bfb7ea4873cb6/kiwisolver-1.4.7-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:82a5c2f4b87c26bb1a0ef3d16b5c4753434633b83d365cc0ddf2770c93829e3c", size = 2338126, upload-time = "2024-09-04T09:06:12.321Z" }, + { url = "https://files.pythonhosted.org/packages/1a/cb/42b92fd5eadd708dd9107c089e817945500685f3437ce1fd387efebc6d6e/kiwisolver-1.4.7-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:ce8be0466f4c0d585cdb6c1e2ed07232221df101a4c6f28821d2aa754ca2d9e2", size = 2298313, upload-time = "2024-09-04T09:06:14.562Z" }, + { url = "https://files.pythonhosted.org/packages/4f/eb/be25aa791fe5fc75a8b1e0c965e00f942496bc04635c9aae8035f6b76dcd/kiwisolver-1.4.7-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:409afdfe1e2e90e6ee7fc896f3df9a7fec8e793e58bfa0d052c8a82f99c37abb", size = 2437784, upload-time = "2024-09-04T09:06:16.767Z" }, + { url = "https://files.pythonhosted.org/packages/c5/22/30a66be7f3368d76ff95689e1c2e28d382383952964ab15330a15d8bfd03/kiwisolver-1.4.7-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:5b9c3f4ee0b9a439d2415012bd1b1cc2df59e4d6a9939f4d669241d30b414327", size = 2253988, upload-time = "2024-09-04T09:06:18.705Z" }, + { url = "https://files.pythonhosted.org/packages/35/d3/5f2ecb94b5211c8a04f218a76133cc8d6d153b0f9cd0b45fad79907f0689/kiwisolver-1.4.7-cp39-cp39-win32.whl", hash = "sha256:a79ae34384df2b615eefca647a2873842ac3b596418032bef9a7283675962644", size = 46980, upload-time = "2024-09-04T09:06:20.106Z" }, + { url = "https://files.pythonhosted.org/packages/ef/17/cd10d020578764ea91740204edc6b3236ed8106228a46f568d716b11feb2/kiwisolver-1.4.7-cp39-cp39-win_amd64.whl", hash = "sha256:cf0438b42121a66a3a667de17e779330fc0f20b0d97d59d2f2121e182b0505e4", size = 55847, upload-time = "2024-09-04T09:06:21.407Z" }, + { url = "https://files.pythonhosted.org/packages/91/84/32232502020bd78d1d12be7afde15811c64a95ed1f606c10456db4e4c3ac/kiwisolver-1.4.7-cp39-cp39-win_arm64.whl", hash = "sha256:764202cc7e70f767dab49e8df52c7455e8de0df5d858fa801a11aa0d882ccf3f", size = 48494, upload-time = "2024-09-04T09:06:22.648Z" }, + { url = "https://files.pythonhosted.org/packages/ac/59/741b79775d67ab67ced9bb38552da688c0305c16e7ee24bba7a2be253fb7/kiwisolver-1.4.7-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:94252291e3fe68001b1dd747b4c0b3be12582839b95ad4d1b641924d68fd4643", size = 59491, upload-time = "2024-09-04T09:06:24.188Z" }, + { url = "https://files.pythonhosted.org/packages/58/cc/fb239294c29a5656e99e3527f7369b174dd9cc7c3ef2dea7cb3c54a8737b/kiwisolver-1.4.7-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:5b7dfa3b546da08a9f622bb6becdb14b3e24aaa30adba66749d38f3cc7ea9706", size = 57648, upload-time = "2024-09-04T09:06:25.559Z" }, + { url = "https://files.pythonhosted.org/packages/3b/ef/2f009ac1f7aab9f81efb2d837301d255279d618d27b6015780115ac64bdd/kiwisolver-1.4.7-pp310-pypy310_pp73-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:bd3de6481f4ed8b734da5df134cd5a6a64fe32124fe83dde1e5b5f29fe30b1e6", size = 84257, upload-time = "2024-09-04T09:06:27.038Z" }, + { url = "https://files.pythonhosted.org/packages/81/e1/c64f50987f85b68b1c52b464bb5bf73e71570c0f7782d626d1eb283ad620/kiwisolver-1.4.7-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a91b5f9f1205845d488c928e8570dcb62b893372f63b8b6e98b863ebd2368ff2", size = 80906, upload-time = "2024-09-04T09:06:28.48Z" }, + { url = "https://files.pythonhosted.org/packages/fd/71/1687c5c0a0be2cee39a5c9c389e546f9c6e215e46b691d00d9f646892083/kiwisolver-1.4.7-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:40fa14dbd66b8b8f470d5fc79c089a66185619d31645f9b0773b88b19f7223c4", size = 79951, upload-time = "2024-09-04T09:06:29.966Z" }, + { url = "https://files.pythonhosted.org/packages/ea/8b/d7497df4a1cae9367adf21665dd1f896c2a7aeb8769ad77b662c5e2bcce7/kiwisolver-1.4.7-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:eb542fe7933aa09d8d8f9d9097ef37532a7df6497819d16efe4359890a2f417a", size = 55715, upload-time = "2024-09-04T09:06:31.489Z" }, + { url = "https://files.pythonhosted.org/packages/64/f3/2403d90821fffe496df16f6996cb328b90b0d80c06d2938a930a7732b4f1/kiwisolver-1.4.7-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:bfa1acfa0c54932d5607e19a2c24646fb4c1ae2694437789129cf099789a3b00", size = 59662, upload-time = "2024-09-04T09:06:33.551Z" }, + { url = "https://files.pythonhosted.org/packages/fa/7d/8f409736a4a6ac04354fa530ebf46682ddb1539b0bae15f4731ff2c575bc/kiwisolver-1.4.7-pp38-pypy38_pp73-macosx_11_0_arm64.whl", hash = "sha256:eee3ea935c3d227d49b4eb85660ff631556841f6e567f0f7bda972df6c2c9935", size = 57753, upload-time = "2024-09-04T09:06:35.095Z" }, + { url = "https://files.pythonhosted.org/packages/4c/a5/3937c9abe8eedb1356071739ad437a0b486cbad27d54f4ec4733d24882ac/kiwisolver-1.4.7-pp38-pypy38_pp73-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:f3160309af4396e0ed04db259c3ccbfdc3621b5559b5453075e5de555e1f3a1b", size = 103564, upload-time = "2024-09-04T09:06:36.756Z" }, + { url = "https://files.pythonhosted.org/packages/b2/18/a5ae23888f010b90d5eb8d196fed30e268056b2ded54d25b38a193bb70e9/kiwisolver-1.4.7-pp38-pypy38_pp73-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:a17f6a29cf8935e587cc8a4dbfc8368c55edc645283db0ce9801016f83526c2d", size = 95264, upload-time = "2024-09-04T09:06:38.786Z" }, + { url = "https://files.pythonhosted.org/packages/f9/d0/c4240ae86306d4395e9701f1d7e6ddcc6d60c28cb0127139176cfcfc9ebe/kiwisolver-1.4.7-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:10849fb2c1ecbfae45a693c070e0320a91b35dd4bcf58172c023b994283a124d", size = 78197, upload-time = "2024-09-04T09:06:40.453Z" }, + { url = "https://files.pythonhosted.org/packages/62/db/62423f0ab66813376a35c1e7da488ebdb4e808fcb54b7cec33959717bda1/kiwisolver-1.4.7-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:ac542bf38a8a4be2dc6b15248d36315ccc65f0743f7b1a76688ffb6b5129a5c2", size = 56080, upload-time = "2024-09-04T09:06:42.061Z" }, + { url = "https://files.pythonhosted.org/packages/d5/df/ce37d9b26f07ab90880923c94d12a6ff4d27447096b4c849bfc4339ccfdf/kiwisolver-1.4.7-pp39-pypy39_pp73-macosx_10_15_x86_64.whl", hash = "sha256:8b01aac285f91ca889c800042c35ad3b239e704b150cfd3382adfc9dcc780e39", size = 58666, upload-time = "2024-09-04T09:06:43.756Z" }, + { url = "https://files.pythonhosted.org/packages/b0/d3/e4b04f43bc629ac8e186b77b2b1a251cdfa5b7610fa189dc0db622672ce6/kiwisolver-1.4.7-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:48be928f59a1f5c8207154f935334d374e79f2b5d212826307d072595ad76a2e", size = 57088, upload-time = "2024-09-04T09:06:45.406Z" }, + { url = "https://files.pythonhosted.org/packages/30/1c/752df58e2d339e670a535514d2db4fe8c842ce459776b8080fbe08ebb98e/kiwisolver-1.4.7-pp39-pypy39_pp73-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f37cfe618a117e50d8c240555331160d73d0411422b59b5ee217843d7b693608", size = 84321, upload-time = "2024-09-04T09:06:47.557Z" }, + { url = "https://files.pythonhosted.org/packages/f0/f8/fe6484e847bc6e238ec9f9828089fb2c0bb53f2f5f3a79351fde5b565e4f/kiwisolver-1.4.7-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:599b5c873c63a1f6ed7eead644a8a380cfbdf5db91dcb6f85707aaab213b1674", size = 80776, upload-time = "2024-09-04T09:06:49.235Z" }, + { url = "https://files.pythonhosted.org/packages/9b/57/d7163c0379f250ef763aba85330a19feefb5ce6cb541ade853aaba881524/kiwisolver-1.4.7-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:801fa7802e5cfabe3ab0c81a34c323a319b097dfb5004be950482d882f3d7225", size = 79984, upload-time = "2024-09-04T09:06:51.336Z" }, + { url = "https://files.pythonhosted.org/packages/8c/95/4a103776c265d13b3d2cd24fb0494d4e04ea435a8ef97e1b2c026d43250b/kiwisolver-1.4.7-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:0c6c43471bc764fad4bc99c5c2d6d16a676b1abf844ca7c8702bdae92df01ee0", size = 55811, upload-time = "2024-09-04T09:06:53.078Z" }, +] + +[[package]] +name = "kiwisolver" +version = "1.4.9" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version >= '3.14'", + "python_full_version >= '3.11' and python_full_version < '3.14'", + "python_full_version == '3.10.*'", +] +sdist = { url = "https://files.pythonhosted.org/packages/5c/3c/85844f1b0feb11ee581ac23fe5fce65cd049a200c1446708cc1b7f922875/kiwisolver-1.4.9.tar.gz", hash = "sha256:c3b22c26c6fd6811b0ae8363b95ca8ce4ea3c202d3d0975b2914310ceb1bcc4d", size = 97564, upload-time = "2025-08-10T21:27:49.279Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/c6/5d/8ce64e36d4e3aac5ca96996457dcf33e34e6051492399a3f1fec5657f30b/kiwisolver-1.4.9-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:b4b4d74bda2b8ebf4da5bd42af11d02d04428b2c32846e4c2c93219df8a7987b", size = 124159, upload-time = "2025-08-10T21:25:35.472Z" }, + { url = "https://files.pythonhosted.org/packages/96/1e/22f63ec454874378175a5f435d6ea1363dd33fb2af832c6643e4ccea0dc8/kiwisolver-1.4.9-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:fb3b8132019ea572f4611d770991000d7f58127560c4889729248eb5852a102f", size = 66578, upload-time = "2025-08-10T21:25:36.73Z" }, + { url = "https://files.pythonhosted.org/packages/41/4c/1925dcfff47a02d465121967b95151c82d11027d5ec5242771e580e731bd/kiwisolver-1.4.9-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:84fd60810829c27ae375114cd379da1fa65e6918e1da405f356a775d49a62bcf", size = 65312, upload-time = "2025-08-10T21:25:37.658Z" }, + { url = "https://files.pythonhosted.org/packages/d4/42/0f333164e6307a0687d1eb9ad256215aae2f4bd5d28f4653d6cd319a3ba3/kiwisolver-1.4.9-cp310-cp310-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:b78efa4c6e804ecdf727e580dbb9cba85624d2e1c6b5cb059c66290063bd99a9", size = 1628458, upload-time = "2025-08-10T21:25:39.067Z" }, + { url = "https://files.pythonhosted.org/packages/86/b6/2dccb977d651943995a90bfe3495c2ab2ba5cd77093d9f2318a20c9a6f59/kiwisolver-1.4.9-cp310-cp310-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:d4efec7bcf21671db6a3294ff301d2fc861c31faa3c8740d1a94689234d1b415", size = 1225640, upload-time = "2025-08-10T21:25:40.489Z" }, + { url = "https://files.pythonhosted.org/packages/50/2b/362ebd3eec46c850ccf2bfe3e30f2fc4c008750011f38a850f088c56a1c6/kiwisolver-1.4.9-cp310-cp310-manylinux_2_24_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:90f47e70293fc3688b71271100a1a5453aa9944a81d27ff779c108372cf5567b", size = 1244074, upload-time = "2025-08-10T21:25:42.221Z" }, + { url = "https://files.pythonhosted.org/packages/6f/bb/f09a1e66dab8984773d13184a10a29fe67125337649d26bdef547024ed6b/kiwisolver-1.4.9-cp310-cp310-manylinux_2_24_s390x.manylinux_2_28_s390x.whl", hash = "sha256:8fdca1def57a2e88ef339de1737a1449d6dbf5fab184c54a1fca01d541317154", size = 1293036, upload-time = "2025-08-10T21:25:43.801Z" }, + { url = "https://files.pythonhosted.org/packages/ea/01/11ecf892f201cafda0f68fa59212edaea93e96c37884b747c181303fccd1/kiwisolver-1.4.9-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:9cf554f21be770f5111a1690d42313e140355e687e05cf82cb23d0a721a64a48", size = 2175310, upload-time = "2025-08-10T21:25:45.045Z" }, + { url = "https://files.pythonhosted.org/packages/7f/5f/bfe11d5b934f500cc004314819ea92427e6e5462706a498c1d4fc052e08f/kiwisolver-1.4.9-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:fc1795ac5cd0510207482c3d1d3ed781143383b8cfd36f5c645f3897ce066220", size = 2270943, upload-time = "2025-08-10T21:25:46.393Z" }, + { url = "https://files.pythonhosted.org/packages/3d/de/259f786bf71f1e03e73d87e2db1a9a3bcab64d7b4fd780167123161630ad/kiwisolver-1.4.9-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:ccd09f20ccdbbd341b21a67ab50a119b64a403b09288c27481575105283c1586", size = 2440488, upload-time = "2025-08-10T21:25:48.074Z" }, + { url = "https://files.pythonhosted.org/packages/1b/76/c989c278faf037c4d3421ec07a5c452cd3e09545d6dae7f87c15f54e4edf/kiwisolver-1.4.9-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:540c7c72324d864406a009d72f5d6856f49693db95d1fbb46cf86febef873634", size = 2246787, upload-time = "2025-08-10T21:25:49.442Z" }, + { url = "https://files.pythonhosted.org/packages/a2/55/c2898d84ca440852e560ca9f2a0d28e6e931ac0849b896d77231929900e7/kiwisolver-1.4.9-cp310-cp310-win_amd64.whl", hash = "sha256:ede8c6d533bc6601a47ad4046080d36b8fc99f81e6f1c17b0ac3c2dc91ac7611", size = 73730, upload-time = "2025-08-10T21:25:51.102Z" }, + { url = "https://files.pythonhosted.org/packages/e8/09/486d6ac523dd33b80b368247f238125d027964cfacb45c654841e88fb2ae/kiwisolver-1.4.9-cp310-cp310-win_arm64.whl", hash = "sha256:7b4da0d01ac866a57dd61ac258c5607b4cd677f63abaec7b148354d2b2cdd536", size = 65036, upload-time = "2025-08-10T21:25:52.063Z" }, + { url = "https://files.pythonhosted.org/packages/6f/ab/c80b0d5a9d8a1a65f4f815f2afff9798b12c3b9f31f1d304dd233dd920e2/kiwisolver-1.4.9-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:eb14a5da6dc7642b0f3a18f13654847cd8b7a2550e2645a5bda677862b03ba16", size = 124167, upload-time = "2025-08-10T21:25:53.403Z" }, + { url = "https://files.pythonhosted.org/packages/a0/c0/27fe1a68a39cf62472a300e2879ffc13c0538546c359b86f149cc19f6ac3/kiwisolver-1.4.9-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:39a219e1c81ae3b103643d2aedb90f1ef22650deb266ff12a19e7773f3e5f089", size = 66579, upload-time = "2025-08-10T21:25:54.79Z" }, + { url = "https://files.pythonhosted.org/packages/31/a2/a12a503ac1fd4943c50f9822678e8015a790a13b5490354c68afb8489814/kiwisolver-1.4.9-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:2405a7d98604b87f3fc28b1716783534b1b4b8510d8142adca34ee0bc3c87543", size = 65309, upload-time = "2025-08-10T21:25:55.76Z" }, + { url = "https://files.pythonhosted.org/packages/66/e1/e533435c0be77c3f64040d68d7a657771194a63c279f55573188161e81ca/kiwisolver-1.4.9-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:dc1ae486f9abcef254b5618dfb4113dd49f94c68e3e027d03cf0143f3f772b61", size = 1435596, upload-time = "2025-08-10T21:25:56.861Z" }, + { url = "https://files.pythonhosted.org/packages/67/1e/51b73c7347f9aabdc7215aa79e8b15299097dc2f8e67dee2b095faca9cb0/kiwisolver-1.4.9-cp311-cp311-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:8a1f570ce4d62d718dce3f179ee78dac3b545ac16c0c04bb363b7607a949c0d1", size = 1246548, upload-time = "2025-08-10T21:25:58.246Z" }, + { url = "https://files.pythonhosted.org/packages/21/aa/72a1c5d1e430294f2d32adb9542719cfb441b5da368d09d268c7757af46c/kiwisolver-1.4.9-cp311-cp311-manylinux_2_24_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:cb27e7b78d716c591e88e0a09a2139c6577865d7f2e152488c2cc6257f460872", size = 1263618, upload-time = "2025-08-10T21:25:59.857Z" }, + { url = "https://files.pythonhosted.org/packages/a3/af/db1509a9e79dbf4c260ce0cfa3903ea8945f6240e9e59d1e4deb731b1a40/kiwisolver-1.4.9-cp311-cp311-manylinux_2_24_s390x.manylinux_2_28_s390x.whl", hash = "sha256:15163165efc2f627eb9687ea5f3a28137217d217ac4024893d753f46bce9de26", size = 1317437, upload-time = "2025-08-10T21:26:01.105Z" }, + { url = "https://files.pythonhosted.org/packages/e0/f2/3ea5ee5d52abacdd12013a94130436e19969fa183faa1e7c7fbc89e9a42f/kiwisolver-1.4.9-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:bdee92c56a71d2b24c33a7d4c2856bd6419d017e08caa7802d2963870e315028", size = 2195742, upload-time = "2025-08-10T21:26:02.675Z" }, + { url = "https://files.pythonhosted.org/packages/6f/9b/1efdd3013c2d9a2566aa6a337e9923a00590c516add9a1e89a768a3eb2fc/kiwisolver-1.4.9-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:412f287c55a6f54b0650bd9b6dce5aceddb95864a1a90c87af16979d37c89771", size = 2290810, upload-time = "2025-08-10T21:26:04.009Z" }, + { url = "https://files.pythonhosted.org/packages/fb/e5/cfdc36109ae4e67361f9bc5b41323648cb24a01b9ade18784657e022e65f/kiwisolver-1.4.9-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:2c93f00dcba2eea70af2be5f11a830a742fe6b579a1d4e00f47760ef13be247a", size = 2461579, upload-time = "2025-08-10T21:26:05.317Z" }, + { url = "https://files.pythonhosted.org/packages/62/86/b589e5e86c7610842213994cdea5add00960076bef4ae290c5fa68589cac/kiwisolver-1.4.9-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:f117e1a089d9411663a3207ba874f31be9ac8eaa5b533787024dc07aeb74f464", size = 2268071, upload-time = "2025-08-10T21:26:06.686Z" }, + { url = "https://files.pythonhosted.org/packages/3b/c6/f8df8509fd1eee6c622febe54384a96cfaf4d43bf2ccec7a0cc17e4715c9/kiwisolver-1.4.9-cp311-cp311-win_amd64.whl", hash = "sha256:be6a04e6c79819c9a8c2373317d19a96048e5a3f90bec587787e86a1153883c2", size = 73840, upload-time = "2025-08-10T21:26:07.94Z" }, + { url = "https://files.pythonhosted.org/packages/e2/2d/16e0581daafd147bc11ac53f032a2b45eabac897f42a338d0a13c1e5c436/kiwisolver-1.4.9-cp311-cp311-win_arm64.whl", hash = "sha256:0ae37737256ba2de764ddc12aed4956460277f00c4996d51a197e72f62f5eec7", size = 65159, upload-time = "2025-08-10T21:26:09.048Z" }, + { url = "https://files.pythonhosted.org/packages/86/c9/13573a747838aeb1c76e3267620daa054f4152444d1f3d1a2324b78255b5/kiwisolver-1.4.9-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:ac5a486ac389dddcc5bef4f365b6ae3ffff2c433324fb38dd35e3fab7c957999", size = 123686, upload-time = "2025-08-10T21:26:10.034Z" }, + { url = "https://files.pythonhosted.org/packages/51/ea/2ecf727927f103ffd1739271ca19c424d0e65ea473fbaeea1c014aea93f6/kiwisolver-1.4.9-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:f2ba92255faa7309d06fe44c3a4a97efe1c8d640c2a79a5ef728b685762a6fd2", size = 66460, upload-time = "2025-08-10T21:26:11.083Z" }, + { url = "https://files.pythonhosted.org/packages/5b/5a/51f5464373ce2aeb5194508298a508b6f21d3867f499556263c64c621914/kiwisolver-1.4.9-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:4a2899935e724dd1074cb568ce7ac0dce28b2cd6ab539c8e001a8578eb106d14", size = 64952, upload-time = "2025-08-10T21:26:12.058Z" }, + { url = "https://files.pythonhosted.org/packages/70/90/6d240beb0f24b74371762873e9b7f499f1e02166a2d9c5801f4dbf8fa12e/kiwisolver-1.4.9-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:f6008a4919fdbc0b0097089f67a1eb55d950ed7e90ce2cc3e640abadd2757a04", size = 1474756, upload-time = "2025-08-10T21:26:13.096Z" }, + { url = "https://files.pythonhosted.org/packages/12/42/f36816eaf465220f683fb711efdd1bbf7a7005a2473d0e4ed421389bd26c/kiwisolver-1.4.9-cp312-cp312-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:67bb8b474b4181770f926f7b7d2f8c0248cbcb78b660fdd41a47054b28d2a752", size = 1276404, upload-time = "2025-08-10T21:26:14.457Z" }, + { url = "https://files.pythonhosted.org/packages/2e/64/bc2de94800adc830c476dce44e9b40fd0809cddeef1fde9fcf0f73da301f/kiwisolver-1.4.9-cp312-cp312-manylinux_2_24_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:2327a4a30d3ee07d2fbe2e7933e8a37c591663b96ce42a00bc67461a87d7df77", size = 1294410, upload-time = "2025-08-10T21:26:15.73Z" }, + { url = "https://files.pythonhosted.org/packages/5f/42/2dc82330a70aa8e55b6d395b11018045e58d0bb00834502bf11509f79091/kiwisolver-1.4.9-cp312-cp312-manylinux_2_24_s390x.manylinux_2_28_s390x.whl", hash = "sha256:7a08b491ec91b1d5053ac177afe5290adacf1f0f6307d771ccac5de30592d198", size = 1343631, upload-time = "2025-08-10T21:26:17.045Z" }, + { url = "https://files.pythonhosted.org/packages/22/fd/f4c67a6ed1aab149ec5a8a401c323cee7a1cbe364381bb6c9c0d564e0e20/kiwisolver-1.4.9-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:d8fc5c867c22b828001b6a38d2eaeb88160bf5783c6cb4a5e440efc981ce286d", size = 2224963, upload-time = "2025-08-10T21:26:18.737Z" }, + { url = "https://files.pythonhosted.org/packages/45/aa/76720bd4cb3713314677d9ec94dcc21ced3f1baf4830adde5bb9b2430a5f/kiwisolver-1.4.9-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:3b3115b2581ea35bb6d1f24a4c90af37e5d9b49dcff267eeed14c3893c5b86ab", size = 2321295, upload-time = "2025-08-10T21:26:20.11Z" }, + { url = "https://files.pythonhosted.org/packages/80/19/d3ec0d9ab711242f56ae0dc2fc5d70e298bb4a1f9dfab44c027668c673a1/kiwisolver-1.4.9-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:858e4c22fb075920b96a291928cb7dea5644e94c0ee4fcd5af7e865655e4ccf2", size = 2487987, upload-time = "2025-08-10T21:26:21.49Z" }, + { url = "https://files.pythonhosted.org/packages/39/e9/61e4813b2c97e86b6fdbd4dd824bf72d28bcd8d4849b8084a357bc0dd64d/kiwisolver-1.4.9-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:ed0fecd28cc62c54b262e3736f8bb2512d8dcfdc2bcf08be5f47f96bf405b145", size = 2291817, upload-time = "2025-08-10T21:26:22.812Z" }, + { url = "https://files.pythonhosted.org/packages/a0/41/85d82b0291db7504da3c2defe35c9a8a5c9803a730f297bd823d11d5fb77/kiwisolver-1.4.9-cp312-cp312-win_amd64.whl", hash = "sha256:f68208a520c3d86ea51acf688a3e3002615a7f0238002cccc17affecc86a8a54", size = 73895, upload-time = "2025-08-10T21:26:24.37Z" }, + { url = "https://files.pythonhosted.org/packages/e2/92/5f3068cf15ee5cb624a0c7596e67e2a0bb2adee33f71c379054a491d07da/kiwisolver-1.4.9-cp312-cp312-win_arm64.whl", hash = "sha256:2c1a4f57df73965f3f14df20b80ee29e6a7930a57d2d9e8491a25f676e197c60", size = 64992, upload-time = "2025-08-10T21:26:25.732Z" }, + { url = "https://files.pythonhosted.org/packages/31/c1/c2686cda909742ab66c7388e9a1a8521a59eb89f8bcfbee28fc980d07e24/kiwisolver-1.4.9-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:a5d0432ccf1c7ab14f9949eec60c5d1f924f17c037e9f8b33352fa05799359b8", size = 123681, upload-time = "2025-08-10T21:26:26.725Z" }, + { url = "https://files.pythonhosted.org/packages/ca/f0/f44f50c9f5b1a1860261092e3bc91ecdc9acda848a8b8c6abfda4a24dd5c/kiwisolver-1.4.9-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:efb3a45b35622bb6c16dbfab491a8f5a391fe0e9d45ef32f4df85658232ca0e2", size = 66464, upload-time = "2025-08-10T21:26:27.733Z" }, + { url = "https://files.pythonhosted.org/packages/2d/7a/9d90a151f558e29c3936b8a47ac770235f436f2120aca41a6d5f3d62ae8d/kiwisolver-1.4.9-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:1a12cf6398e8a0a001a059747a1cbf24705e18fe413bc22de7b3d15c67cffe3f", size = 64961, upload-time = "2025-08-10T21:26:28.729Z" }, + { url = "https://files.pythonhosted.org/packages/e9/e9/f218a2cb3a9ffbe324ca29a9e399fa2d2866d7f348ec3a88df87fc248fc5/kiwisolver-1.4.9-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:b67e6efbf68e077dd71d1a6b37e43e1a99d0bff1a3d51867d45ee8908b931098", size = 1474607, upload-time = "2025-08-10T21:26:29.798Z" }, + { url = "https://files.pythonhosted.org/packages/d9/28/aac26d4c882f14de59041636292bc838db8961373825df23b8eeb807e198/kiwisolver-1.4.9-cp313-cp313-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:5656aa670507437af0207645273ccdfee4f14bacd7f7c67a4306d0dcaeaf6eed", size = 1276546, upload-time = "2025-08-10T21:26:31.401Z" }, + { url = "https://files.pythonhosted.org/packages/8b/ad/8bfc1c93d4cc565e5069162f610ba2f48ff39b7de4b5b8d93f69f30c4bed/kiwisolver-1.4.9-cp313-cp313-manylinux_2_24_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:bfc08add558155345129c7803b3671cf195e6a56e7a12f3dde7c57d9b417f525", size = 1294482, upload-time = "2025-08-10T21:26:32.721Z" }, + { url = "https://files.pythonhosted.org/packages/da/f1/6aca55ff798901d8ce403206d00e033191f63d82dd708a186e0ed2067e9c/kiwisolver-1.4.9-cp313-cp313-manylinux_2_24_s390x.manylinux_2_28_s390x.whl", hash = "sha256:40092754720b174e6ccf9e845d0d8c7d8e12c3d71e7fc35f55f3813e96376f78", size = 1343720, upload-time = "2025-08-10T21:26:34.032Z" }, + { url = "https://files.pythonhosted.org/packages/d1/91/eed031876c595c81d90d0f6fc681ece250e14bf6998c3d7c419466b523b7/kiwisolver-1.4.9-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:497d05f29a1300d14e02e6441cf0f5ee81c1ff5a304b0d9fb77423974684e08b", size = 2224907, upload-time = "2025-08-10T21:26:35.824Z" }, + { url = "https://files.pythonhosted.org/packages/e9/ec/4d1925f2e49617b9cca9c34bfa11adefad49d00db038e692a559454dfb2e/kiwisolver-1.4.9-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:bdd1a81a1860476eb41ac4bc1e07b3f07259e6d55bbf739b79c8aaedcf512799", size = 2321334, upload-time = "2025-08-10T21:26:37.534Z" }, + { url = "https://files.pythonhosted.org/packages/43/cb/450cd4499356f68802750c6ddc18647b8ea01ffa28f50d20598e0befe6e9/kiwisolver-1.4.9-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:e6b93f13371d341afee3be9f7c5964e3fe61d5fa30f6a30eb49856935dfe4fc3", size = 2488313, upload-time = "2025-08-10T21:26:39.191Z" }, + { url = "https://files.pythonhosted.org/packages/71/67/fc76242bd99f885651128a5d4fa6083e5524694b7c88b489b1b55fdc491d/kiwisolver-1.4.9-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:d75aa530ccfaa593da12834b86a0724f58bff12706659baa9227c2ccaa06264c", size = 2291970, upload-time = "2025-08-10T21:26:40.828Z" }, + { url = "https://files.pythonhosted.org/packages/75/bd/f1a5d894000941739f2ae1b65a32892349423ad49c2e6d0771d0bad3fae4/kiwisolver-1.4.9-cp313-cp313-win_amd64.whl", hash = "sha256:dd0a578400839256df88c16abddf9ba14813ec5f21362e1fe65022e00c883d4d", size = 73894, upload-time = "2025-08-10T21:26:42.33Z" }, + { url = "https://files.pythonhosted.org/packages/95/38/dce480814d25b99a391abbddadc78f7c117c6da34be68ca8b02d5848b424/kiwisolver-1.4.9-cp313-cp313-win_arm64.whl", hash = "sha256:d4188e73af84ca82468f09cadc5ac4db578109e52acb4518d8154698d3a87ca2", size = 64995, upload-time = "2025-08-10T21:26:43.889Z" }, + { url = "https://files.pythonhosted.org/packages/e2/37/7d218ce5d92dadc5ebdd9070d903e0c7cf7edfe03f179433ac4d13ce659c/kiwisolver-1.4.9-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:5a0f2724dfd4e3b3ac5a82436a8e6fd16baa7d507117e4279b660fe8ca38a3a1", size = 126510, upload-time = "2025-08-10T21:26:44.915Z" }, + { url = "https://files.pythonhosted.org/packages/23/b0/e85a2b48233daef4b648fb657ebbb6f8367696a2d9548a00b4ee0eb67803/kiwisolver-1.4.9-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:1b11d6a633e4ed84fc0ddafd4ebfd8ea49b3f25082c04ad12b8315c11d504dc1", size = 67903, upload-time = "2025-08-10T21:26:45.934Z" }, + { url = "https://files.pythonhosted.org/packages/44/98/f2425bc0113ad7de24da6bb4dae1343476e95e1d738be7c04d31a5d037fd/kiwisolver-1.4.9-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:61874cdb0a36016354853593cffc38e56fc9ca5aa97d2c05d3dcf6922cd55a11", size = 66402, upload-time = "2025-08-10T21:26:47.101Z" }, + { url = "https://files.pythonhosted.org/packages/98/d8/594657886df9f34c4177cc353cc28ca7e6e5eb562d37ccc233bff43bbe2a/kiwisolver-1.4.9-cp313-cp313t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:60c439763a969a6af93b4881db0eed8fadf93ee98e18cbc35bc8da868d0c4f0c", size = 1582135, upload-time = "2025-08-10T21:26:48.665Z" }, + { url = "https://files.pythonhosted.org/packages/5c/c6/38a115b7170f8b306fc929e166340c24958347308ea3012c2b44e7e295db/kiwisolver-1.4.9-cp313-cp313t-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:92a2f997387a1b79a75e7803aa7ded2cfbe2823852ccf1ba3bcf613b62ae3197", size = 1389409, upload-time = "2025-08-10T21:26:50.335Z" }, + { url = "https://files.pythonhosted.org/packages/bf/3b/e04883dace81f24a568bcee6eb3001da4ba05114afa622ec9b6fafdc1f5e/kiwisolver-1.4.9-cp313-cp313t-manylinux_2_24_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:a31d512c812daea6d8b3be3b2bfcbeb091dbb09177706569bcfc6240dcf8b41c", size = 1401763, upload-time = "2025-08-10T21:26:51.867Z" }, + { url = "https://files.pythonhosted.org/packages/9f/80/20ace48e33408947af49d7d15c341eaee69e4e0304aab4b7660e234d6288/kiwisolver-1.4.9-cp313-cp313t-manylinux_2_24_s390x.manylinux_2_28_s390x.whl", hash = "sha256:52a15b0f35dad39862d376df10c5230155243a2c1a436e39eb55623ccbd68185", size = 1453643, upload-time = "2025-08-10T21:26:53.592Z" }, + { url = "https://files.pythonhosted.org/packages/64/31/6ce4380a4cd1f515bdda976a1e90e547ccd47b67a1546d63884463c92ca9/kiwisolver-1.4.9-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:a30fd6fdef1430fd9e1ba7b3398b5ee4e2887783917a687d86ba69985fb08748", size = 2330818, upload-time = "2025-08-10T21:26:55.051Z" }, + { url = "https://files.pythonhosted.org/packages/fa/e9/3f3fcba3bcc7432c795b82646306e822f3fd74df0ee81f0fa067a1f95668/kiwisolver-1.4.9-cp313-cp313t-musllinux_1_2_ppc64le.whl", hash = "sha256:cc9617b46837c6468197b5945e196ee9ca43057bb7d9d1ae688101e4e1dddf64", size = 2419963, upload-time = "2025-08-10T21:26:56.421Z" }, + { url = "https://files.pythonhosted.org/packages/99/43/7320c50e4133575c66e9f7dadead35ab22d7c012a3b09bb35647792b2a6d/kiwisolver-1.4.9-cp313-cp313t-musllinux_1_2_s390x.whl", hash = "sha256:0ab74e19f6a2b027ea4f845a78827969af45ce790e6cb3e1ebab71bdf9f215ff", size = 2594639, upload-time = "2025-08-10T21:26:57.882Z" }, + { url = "https://files.pythonhosted.org/packages/65/d6/17ae4a270d4a987ef8a385b906d2bdfc9fce502d6dc0d3aea865b47f548c/kiwisolver-1.4.9-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:dba5ee5d3981160c28d5490f0d1b7ed730c22470ff7f6cc26cfcfaacb9896a07", size = 2391741, upload-time = "2025-08-10T21:26:59.237Z" }, + { url = "https://files.pythonhosted.org/packages/2a/8f/8f6f491d595a9e5912971f3f863d81baddccc8a4d0c3749d6a0dd9ffc9df/kiwisolver-1.4.9-cp313-cp313t-win_arm64.whl", hash = "sha256:0749fd8f4218ad2e851e11cc4dc05c7cbc0cbc4267bdfdb31782e65aace4ee9c", size = 68646, upload-time = "2025-08-10T21:27:00.52Z" }, + { url = "https://files.pythonhosted.org/packages/6b/32/6cc0fbc9c54d06c2969faa9c1d29f5751a2e51809dd55c69055e62d9b426/kiwisolver-1.4.9-cp314-cp314-macosx_10_13_universal2.whl", hash = "sha256:9928fe1eb816d11ae170885a74d074f57af3a0d65777ca47e9aeb854a1fba386", size = 123806, upload-time = "2025-08-10T21:27:01.537Z" }, + { url = "https://files.pythonhosted.org/packages/b2/dd/2bfb1d4a4823d92e8cbb420fe024b8d2167f72079b3bb941207c42570bdf/kiwisolver-1.4.9-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:d0005b053977e7b43388ddec89fa567f43d4f6d5c2c0affe57de5ebf290dc552", size = 66605, upload-time = "2025-08-10T21:27:03.335Z" }, + { url = "https://files.pythonhosted.org/packages/f7/69/00aafdb4e4509c2ca6064646cba9cd4b37933898f426756adb2cb92ebbed/kiwisolver-1.4.9-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:2635d352d67458b66fd0667c14cb1d4145e9560d503219034a18a87e971ce4f3", size = 64925, upload-time = "2025-08-10T21:27:04.339Z" }, + { url = "https://files.pythonhosted.org/packages/43/dc/51acc6791aa14e5cb6d8a2e28cefb0dc2886d8862795449d021334c0df20/kiwisolver-1.4.9-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:767c23ad1c58c9e827b649a9ab7809fd5fd9db266a9cf02b0e926ddc2c680d58", size = 1472414, upload-time = "2025-08-10T21:27:05.437Z" }, + { url = "https://files.pythonhosted.org/packages/3d/bb/93fa64a81db304ac8a246f834d5094fae4b13baf53c839d6bb6e81177129/kiwisolver-1.4.9-cp314-cp314-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:72d0eb9fba308b8311685c2268cf7d0a0639a6cd027d8128659f72bdd8a024b4", size = 1281272, upload-time = "2025-08-10T21:27:07.063Z" }, + { url = "https://files.pythonhosted.org/packages/70/e6/6df102916960fb8d05069d4bd92d6d9a8202d5a3e2444494e7cd50f65b7a/kiwisolver-1.4.9-cp314-cp314-manylinux_2_24_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:f68e4f3eeca8fb22cc3d731f9715a13b652795ef657a13df1ad0c7dc0e9731df", size = 1298578, upload-time = "2025-08-10T21:27:08.452Z" }, + { url = "https://files.pythonhosted.org/packages/7c/47/e142aaa612f5343736b087864dbaebc53ea8831453fb47e7521fa8658f30/kiwisolver-1.4.9-cp314-cp314-manylinux_2_24_s390x.manylinux_2_28_s390x.whl", hash = "sha256:d84cd4061ae292d8ac367b2c3fa3aad11cb8625a95d135fe93f286f914f3f5a6", size = 1345607, upload-time = "2025-08-10T21:27:10.125Z" }, + { url = "https://files.pythonhosted.org/packages/54/89/d641a746194a0f4d1a3670fb900d0dbaa786fb98341056814bc3f058fa52/kiwisolver-1.4.9-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:a60ea74330b91bd22a29638940d115df9dc00af5035a9a2a6ad9399ffb4ceca5", size = 2230150, upload-time = "2025-08-10T21:27:11.484Z" }, + { url = "https://files.pythonhosted.org/packages/aa/6b/5ee1207198febdf16ac11f78c5ae40861b809cbe0e6d2a8d5b0b3044b199/kiwisolver-1.4.9-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:ce6a3a4e106cf35c2d9c4fa17c05ce0b180db622736845d4315519397a77beaf", size = 2325979, upload-time = "2025-08-10T21:27:12.917Z" }, + { url = "https://files.pythonhosted.org/packages/fc/ff/b269eefd90f4ae14dcc74973d5a0f6d28d3b9bb1afd8c0340513afe6b39a/kiwisolver-1.4.9-cp314-cp314-musllinux_1_2_s390x.whl", hash = "sha256:77937e5e2a38a7b48eef0585114fe7930346993a88060d0bf886086d2aa49ef5", size = 2491456, upload-time = "2025-08-10T21:27:14.353Z" }, + { url = "https://files.pythonhosted.org/packages/fc/d4/10303190bd4d30de547534601e259a4fbf014eed94aae3e5521129215086/kiwisolver-1.4.9-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:24c175051354f4a28c5d6a31c93906dc653e2bf234e8a4bbfb964892078898ce", size = 2294621, upload-time = "2025-08-10T21:27:15.808Z" }, + { url = "https://files.pythonhosted.org/packages/28/e0/a9a90416fce5c0be25742729c2ea52105d62eda6c4be4d803c2a7be1fa50/kiwisolver-1.4.9-cp314-cp314-win_amd64.whl", hash = "sha256:0763515d4df10edf6d06a3c19734e2566368980d21ebec439f33f9eb936c07b7", size = 75417, upload-time = "2025-08-10T21:27:17.436Z" }, + { url = "https://files.pythonhosted.org/packages/1f/10/6949958215b7a9a264299a7db195564e87900f709db9245e4ebdd3c70779/kiwisolver-1.4.9-cp314-cp314-win_arm64.whl", hash = "sha256:0e4e2bf29574a6a7b7f6cb5fa69293b9f96c928949ac4a53ba3f525dffb87f9c", size = 66582, upload-time = "2025-08-10T21:27:18.436Z" }, + { url = "https://files.pythonhosted.org/packages/ec/79/60e53067903d3bc5469b369fe0dfc6b3482e2133e85dae9daa9527535991/kiwisolver-1.4.9-cp314-cp314t-macosx_10_13_universal2.whl", hash = "sha256:d976bbb382b202f71c67f77b0ac11244021cfa3f7dfd9e562eefcea2df711548", size = 126514, upload-time = "2025-08-10T21:27:19.465Z" }, + { url = "https://files.pythonhosted.org/packages/25/d1/4843d3e8d46b072c12a38c97c57fab4608d36e13fe47d47ee96b4d61ba6f/kiwisolver-1.4.9-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:2489e4e5d7ef9a1c300a5e0196e43d9c739f066ef23270607d45aba368b91f2d", size = 67905, upload-time = "2025-08-10T21:27:20.51Z" }, + { url = "https://files.pythonhosted.org/packages/8c/ae/29ffcbd239aea8b93108de1278271ae764dfc0d803a5693914975f200596/kiwisolver-1.4.9-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:e2ea9f7ab7fbf18fffb1b5434ce7c69a07582f7acc7717720f1d69f3e806f90c", size = 66399, upload-time = "2025-08-10T21:27:21.496Z" }, + { url = "https://files.pythonhosted.org/packages/a1/ae/d7ba902aa604152c2ceba5d352d7b62106bedbccc8e95c3934d94472bfa3/kiwisolver-1.4.9-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:b34e51affded8faee0dfdb705416153819d8ea9250bbbf7ea1b249bdeb5f1122", size = 1582197, upload-time = "2025-08-10T21:27:22.604Z" }, + { url = "https://files.pythonhosted.org/packages/f2/41/27c70d427eddb8bc7e4f16420a20fefc6f480312122a59a959fdfe0445ad/kiwisolver-1.4.9-cp314-cp314t-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:d8aacd3d4b33b772542b2e01beb50187536967b514b00003bdda7589722d2a64", size = 1390125, upload-time = "2025-08-10T21:27:24.036Z" }, + { url = "https://files.pythonhosted.org/packages/41/42/b3799a12bafc76d962ad69083f8b43b12bf4fe78b097b12e105d75c9b8f1/kiwisolver-1.4.9-cp314-cp314t-manylinux_2_24_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:7cf974dd4e35fa315563ac99d6287a1024e4dc2077b8a7d7cd3d2fb65d283134", size = 1402612, upload-time = "2025-08-10T21:27:25.773Z" }, + { url = "https://files.pythonhosted.org/packages/d2/b5/a210ea073ea1cfaca1bb5c55a62307d8252f531beb364e18aa1e0888b5a0/kiwisolver-1.4.9-cp314-cp314t-manylinux_2_24_s390x.manylinux_2_28_s390x.whl", hash = "sha256:85bd218b5ecfbee8c8a82e121802dcb519a86044c9c3b2e4aef02fa05c6da370", size = 1453990, upload-time = "2025-08-10T21:27:27.089Z" }, + { url = "https://files.pythonhosted.org/packages/5f/ce/a829eb8c033e977d7ea03ed32fb3c1781b4fa0433fbadfff29e39c676f32/kiwisolver-1.4.9-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:0856e241c2d3df4efef7c04a1e46b1936b6120c9bcf36dd216e3acd84bc4fb21", size = 2331601, upload-time = "2025-08-10T21:27:29.343Z" }, + { url = "https://files.pythonhosted.org/packages/e0/4b/b5e97eb142eb9cd0072dacfcdcd31b1c66dc7352b0f7c7255d339c0edf00/kiwisolver-1.4.9-cp314-cp314t-musllinux_1_2_ppc64le.whl", hash = "sha256:9af39d6551f97d31a4deebeac6f45b156f9755ddc59c07b402c148f5dbb6482a", size = 2422041, upload-time = "2025-08-10T21:27:30.754Z" }, + { url = "https://files.pythonhosted.org/packages/40/be/8eb4cd53e1b85ba4edc3a9321666f12b83113a178845593307a3e7891f44/kiwisolver-1.4.9-cp314-cp314t-musllinux_1_2_s390x.whl", hash = "sha256:bb4ae2b57fc1d8cbd1cf7b1d9913803681ffa903e7488012be5b76dedf49297f", size = 2594897, upload-time = "2025-08-10T21:27:32.803Z" }, + { url = "https://files.pythonhosted.org/packages/99/dd/841e9a66c4715477ea0abc78da039832fbb09dac5c35c58dc4c41a407b8a/kiwisolver-1.4.9-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:aedff62918805fb62d43a4aa2ecd4482c380dc76cd31bd7c8878588a61bd0369", size = 2391835, upload-time = "2025-08-10T21:27:34.23Z" }, + { url = "https://files.pythonhosted.org/packages/0c/28/4b2e5c47a0da96896fdfdb006340ade064afa1e63675d01ea5ac222b6d52/kiwisolver-1.4.9-cp314-cp314t-win_amd64.whl", hash = "sha256:1fa333e8b2ce4d9660f2cda9c0e1b6bafcfb2457a9d259faa82289e73ec24891", size = 79988, upload-time = "2025-08-10T21:27:35.587Z" }, + { url = "https://files.pythonhosted.org/packages/80/be/3578e8afd18c88cdf9cb4cffde75a96d2be38c5a903f1ed0ceec061bd09e/kiwisolver-1.4.9-cp314-cp314t-win_arm64.whl", hash = "sha256:4a48a2ce79d65d363597ef7b567ce3d14d68783d2b2263d98db3d9477805ba32", size = 70260, upload-time = "2025-08-10T21:27:36.606Z" }, + { url = "https://files.pythonhosted.org/packages/a2/63/fde392691690f55b38d5dd7b3710f5353bf7a8e52de93a22968801ab8978/kiwisolver-1.4.9-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:4d1d9e582ad4d63062d34077a9a1e9f3c34088a2ec5135b1f7190c07cf366527", size = 60183, upload-time = "2025-08-10T21:27:37.669Z" }, + { url = "https://files.pythonhosted.org/packages/27/b1/6aad34edfdb7cced27f371866f211332bba215bfd918ad3322a58f480d8b/kiwisolver-1.4.9-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:deed0c7258ceb4c44ad5ec7d9918f9f14fd05b2be86378d86cf50e63d1e7b771", size = 58675, upload-time = "2025-08-10T21:27:39.031Z" }, + { url = "https://files.pythonhosted.org/packages/9d/1a/23d855a702bb35a76faed5ae2ba3de57d323f48b1f6b17ee2176c4849463/kiwisolver-1.4.9-pp310-pypy310_pp73-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:0a590506f303f512dff6b7f75fd2fd18e16943efee932008fe7140e5fa91d80e", size = 80277, upload-time = "2025-08-10T21:27:40.129Z" }, + { url = "https://files.pythonhosted.org/packages/5a/5b/5239e3c2b8fb5afa1e8508f721bb77325f740ab6994d963e61b2b7abcc1e/kiwisolver-1.4.9-pp310-pypy310_pp73-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:e09c2279a4d01f099f52d5c4b3d9e208e91edcbd1a175c9662a8b16e000fece9", size = 77994, upload-time = "2025-08-10T21:27:41.181Z" }, + { url = "https://files.pythonhosted.org/packages/f9/1c/5d4d468fb16f8410e596ed0eac02d2c68752aa7dc92997fe9d60a7147665/kiwisolver-1.4.9-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:c9e7cdf45d594ee04d5be1b24dd9d49f3d1590959b2271fb30b5ca2b262c00fb", size = 73744, upload-time = "2025-08-10T21:27:42.254Z" }, + { url = "https://files.pythonhosted.org/packages/a3/0f/36d89194b5a32c054ce93e586d4049b6c2c22887b0eb229c61c68afd3078/kiwisolver-1.4.9-pp311-pypy311_pp73-macosx_10_15_x86_64.whl", hash = "sha256:720e05574713db64c356e86732c0f3c5252818d05f9df320f0ad8380641acea5", size = 60104, upload-time = "2025-08-10T21:27:43.287Z" }, + { url = "https://files.pythonhosted.org/packages/52/ba/4ed75f59e4658fd21fe7dde1fee0ac397c678ec3befba3fe6482d987af87/kiwisolver-1.4.9-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:17680d737d5335b552994a2008fab4c851bcd7de33094a82067ef3a576ff02fa", size = 58592, upload-time = "2025-08-10T21:27:44.314Z" }, + { url = "https://files.pythonhosted.org/packages/33/01/a8ea7c5ea32a9b45ceeaee051a04c8ed4320f5add3c51bfa20879b765b70/kiwisolver-1.4.9-pp311-pypy311_pp73-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:85b5352f94e490c028926ea567fc569c52ec79ce131dadb968d3853e809518c2", size = 80281, upload-time = "2025-08-10T21:27:45.369Z" }, + { url = "https://files.pythonhosted.org/packages/da/e3/dbd2ecdce306f1d07a1aaf324817ee993aab7aee9db47ceac757deabafbe/kiwisolver-1.4.9-pp311-pypy311_pp73-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:464415881e4801295659462c49461a24fb107c140de781d55518c4b80cb6790f", size = 78009, upload-time = "2025-08-10T21:27:46.376Z" }, + { url = "https://files.pythonhosted.org/packages/da/e9/0d4add7873a73e462aeb45c036a2dead2562b825aa46ba326727b3f31016/kiwisolver-1.4.9-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:fb940820c63a9590d31d88b815e7a3aa5915cad3ce735ab45f0c730b39547de1", size = 73929, upload-time = "2025-08-10T21:27:48.236Z" }, +] + +[[package]] +name = "lark" +version = "1.3.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/da/34/28fff3ab31ccff1fd4f6c7c7b0ceb2b6968d8ea4950663eadcb5720591a0/lark-1.3.1.tar.gz", hash = "sha256:b426a7a6d6d53189d318f2b6236ab5d6429eaf09259f1ca33eb716eed10d2905", size = 382732, upload-time = "2025-10-27T18:25:56.653Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/82/3d/14ce75ef66813643812f3093ab17e46d3a206942ce7376d31ec2d36229e7/lark-1.3.1-py3-none-any.whl", hash = "sha256:c629b661023a014c37da873b4ff58a817398d12635d3bbb2c5a03be7fe5d1e12", size = 113151, upload-time = "2025-10-27T18:25:54.882Z" }, +] + +[[package]] +name = "markdown-it-py" +version = "3.0.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "mdurl" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/38/71/3b932df36c1a044d397a1f92d1cf91ee0a503d91e470cbd670aa66b07ed0/markdown-it-py-3.0.0.tar.gz", hash = "sha256:e3f60a94fa066dc52ec76661e37c851cb232d92f9886b15cb560aaada2df8feb", size = 74596, upload-time = "2023-06-03T06:41:14.443Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/42/d7/1ec15b46af6af88f19b8e5ffea08fa375d433c998b8a7639e76935c14f1f/markdown_it_py-3.0.0-py3-none-any.whl", hash = "sha256:355216845c60bd96232cd8d8c40e8f9765cc86f46880e43a8fd22dc1a1a8cab1", size = 87528, upload-time = "2023-06-03T06:41:11.019Z" }, +] + +[[package]] +name = "markupsafe" +version = "2.1.5" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version < '3.9'", +] +sdist = { url = "https://files.pythonhosted.org/packages/87/5b/aae44c6655f3801e81aa3eef09dbbf012431987ba564d7231722f68df02d/MarkupSafe-2.1.5.tar.gz", hash = "sha256:d283d37a890ba4c1ae73ffadf8046435c76e7bc2247bbb63c00bd1a709c6544b", size = 19384, upload-time = "2024-02-02T16:31:22.863Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/e4/54/ad5eb37bf9d51800010a74e4665425831a9db4e7c4e0fde4352e391e808e/MarkupSafe-2.1.5-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:a17a92de5231666cfbe003f0e4b9b3a7ae3afb1ec2845aadc2bacc93ff85febc", size = 18206, upload-time = "2024-02-02T16:30:04.105Z" }, + { url = "https://files.pythonhosted.org/packages/6a/4a/a4d49415e600bacae038c67f9fecc1d5433b9d3c71a4de6f33537b89654c/MarkupSafe-2.1.5-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:72b6be590cc35924b02c78ef34b467da4ba07e4e0f0454a2c5907f473fc50ce5", size = 14079, upload-time = "2024-02-02T16:30:06.5Z" }, + { url = "https://files.pythonhosted.org/packages/0a/7b/85681ae3c33c385b10ac0f8dd025c30af83c78cec1c37a6aa3b55e67f5ec/MarkupSafe-2.1.5-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e61659ba32cf2cf1481e575d0462554625196a1f2fc06a1c777d3f48e8865d46", size = 26620, upload-time = "2024-02-02T16:30:08.31Z" }, + { url = "https://files.pythonhosted.org/packages/7c/52/2b1b570f6b8b803cef5ac28fdf78c0da318916c7d2fe9402a84d591b394c/MarkupSafe-2.1.5-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2174c595a0d73a3080ca3257b40096db99799265e1c27cc5a610743acd86d62f", size = 25818, upload-time = "2024-02-02T16:30:09.577Z" }, + { url = "https://files.pythonhosted.org/packages/29/fe/a36ba8c7ca55621620b2d7c585313efd10729e63ef81e4e61f52330da781/MarkupSafe-2.1.5-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ae2ad8ae6ebee9d2d94b17fb62763125f3f374c25618198f40cbb8b525411900", size = 25493, upload-time = "2024-02-02T16:30:11.488Z" }, + { url = "https://files.pythonhosted.org/packages/60/ae/9c60231cdfda003434e8bd27282b1f4e197ad5a710c14bee8bea8a9ca4f0/MarkupSafe-2.1.5-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:075202fa5b72c86ad32dc7d0b56024ebdbcf2048c0ba09f1cde31bfdd57bcfff", size = 30630, upload-time = "2024-02-02T16:30:13.144Z" }, + { url = "https://files.pythonhosted.org/packages/65/dc/1510be4d179869f5dafe071aecb3f1f41b45d37c02329dfba01ff59e5ac5/MarkupSafe-2.1.5-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:598e3276b64aff0e7b3451b72e94fa3c238d452e7ddcd893c3ab324717456bad", size = 29745, upload-time = "2024-02-02T16:30:14.222Z" }, + { url = "https://files.pythonhosted.org/packages/30/39/8d845dd7d0b0613d86e0ef89549bfb5f61ed781f59af45fc96496e897f3a/MarkupSafe-2.1.5-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:fce659a462a1be54d2ffcacea5e3ba2d74daa74f30f5f143fe0c58636e355fdd", size = 30021, upload-time = "2024-02-02T16:30:16.032Z" }, + { url = "https://files.pythonhosted.org/packages/c7/5c/356a6f62e4f3c5fbf2602b4771376af22a3b16efa74eb8716fb4e328e01e/MarkupSafe-2.1.5-cp310-cp310-win32.whl", hash = "sha256:d9fad5155d72433c921b782e58892377c44bd6252b5af2f67f16b194987338a4", size = 16659, upload-time = "2024-02-02T16:30:17.079Z" }, + { url = "https://files.pythonhosted.org/packages/69/48/acbf292615c65f0604a0c6fc402ce6d8c991276e16c80c46a8f758fbd30c/MarkupSafe-2.1.5-cp310-cp310-win_amd64.whl", hash = "sha256:bf50cd79a75d181c9181df03572cdce0fbb75cc353bc350712073108cba98de5", size = 17213, upload-time = "2024-02-02T16:30:18.251Z" }, + { url = "https://files.pythonhosted.org/packages/11/e7/291e55127bb2ae67c64d66cef01432b5933859dfb7d6949daa721b89d0b3/MarkupSafe-2.1.5-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:629ddd2ca402ae6dbedfceeba9c46d5f7b2a61d9749597d4307f943ef198fc1f", size = 18219, upload-time = "2024-02-02T16:30:19.988Z" }, + { url = "https://files.pythonhosted.org/packages/6b/cb/aed7a284c00dfa7c0682d14df85ad4955a350a21d2e3b06d8240497359bf/MarkupSafe-2.1.5-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:5b7b716f97b52c5a14bffdf688f971b2d5ef4029127f1ad7a513973cfd818df2", size = 14098, upload-time = "2024-02-02T16:30:21.063Z" }, + { url = "https://files.pythonhosted.org/packages/1c/cf/35fe557e53709e93feb65575c93927942087e9b97213eabc3fe9d5b25a55/MarkupSafe-2.1.5-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6ec585f69cec0aa07d945b20805be741395e28ac1627333b1c5b0105962ffced", size = 29014, upload-time = "2024-02-02T16:30:22.926Z" }, + { url = "https://files.pythonhosted.org/packages/97/18/c30da5e7a0e7f4603abfc6780574131221d9148f323752c2755d48abad30/MarkupSafe-2.1.5-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b91c037585eba9095565a3556f611e3cbfaa42ca1e865f7b8015fe5c7336d5a5", size = 28220, upload-time = "2024-02-02T16:30:24.76Z" }, + { url = "https://files.pythonhosted.org/packages/0c/40/2e73e7d532d030b1e41180807a80d564eda53babaf04d65e15c1cf897e40/MarkupSafe-2.1.5-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7502934a33b54030eaf1194c21c692a534196063db72176b0c4028e140f8f32c", size = 27756, upload-time = "2024-02-02T16:30:25.877Z" }, + { url = "https://files.pythonhosted.org/packages/18/46/5dca760547e8c59c5311b332f70605d24c99d1303dd9a6e1fc3ed0d73561/MarkupSafe-2.1.5-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:0e397ac966fdf721b2c528cf028494e86172b4feba51d65f81ffd65c63798f3f", size = 33988, upload-time = "2024-02-02T16:30:26.935Z" }, + { url = "https://files.pythonhosted.org/packages/6d/c5/27febe918ac36397919cd4a67d5579cbbfa8da027fa1238af6285bb368ea/MarkupSafe-2.1.5-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:c061bb86a71b42465156a3ee7bd58c8c2ceacdbeb95d05a99893e08b8467359a", size = 32718, upload-time = "2024-02-02T16:30:28.111Z" }, + { url = "https://files.pythonhosted.org/packages/f8/81/56e567126a2c2bc2684d6391332e357589a96a76cb9f8e5052d85cb0ead8/MarkupSafe-2.1.5-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:3a57fdd7ce31c7ff06cdfbf31dafa96cc533c21e443d57f5b1ecc6cdc668ec7f", size = 33317, upload-time = "2024-02-02T16:30:29.214Z" }, + { url = "https://files.pythonhosted.org/packages/00/0b/23f4b2470accb53285c613a3ab9ec19dc944eaf53592cb6d9e2af8aa24cc/MarkupSafe-2.1.5-cp311-cp311-win32.whl", hash = "sha256:397081c1a0bfb5124355710fe79478cdbeb39626492b15d399526ae53422b906", size = 16670, upload-time = "2024-02-02T16:30:30.915Z" }, + { url = "https://files.pythonhosted.org/packages/b7/a2/c78a06a9ec6d04b3445a949615c4c7ed86a0b2eb68e44e7541b9d57067cc/MarkupSafe-2.1.5-cp311-cp311-win_amd64.whl", hash = "sha256:2b7c57a4dfc4f16f7142221afe5ba4e093e09e728ca65c51f5620c9aaeb9a617", size = 17224, upload-time = "2024-02-02T16:30:32.09Z" }, + { url = "https://files.pythonhosted.org/packages/53/bd/583bf3e4c8d6a321938c13f49d44024dbe5ed63e0a7ba127e454a66da974/MarkupSafe-2.1.5-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:8dec4936e9c3100156f8a2dc89c4b88d5c435175ff03413b443469c7c8c5f4d1", size = 18215, upload-time = "2024-02-02T16:30:33.081Z" }, + { url = "https://files.pythonhosted.org/packages/48/d6/e7cd795fc710292c3af3a06d80868ce4b02bfbbf370b7cee11d282815a2a/MarkupSafe-2.1.5-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:3c6b973f22eb18a789b1460b4b91bf04ae3f0c4234a0a6aa6b0a92f6f7b951d4", size = 14069, upload-time = "2024-02-02T16:30:34.148Z" }, + { url = "https://files.pythonhosted.org/packages/51/b5/5d8ec796e2a08fc814a2c7d2584b55f889a55cf17dd1a90f2beb70744e5c/MarkupSafe-2.1.5-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ac07bad82163452a6884fe8fa0963fb98c2346ba78d779ec06bd7a6262132aee", size = 29452, upload-time = "2024-02-02T16:30:35.149Z" }, + { url = "https://files.pythonhosted.org/packages/0a/0d/2454f072fae3b5a137c119abf15465d1771319dfe9e4acbb31722a0fff91/MarkupSafe-2.1.5-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f5dfb42c4604dddc8e4305050aa6deb084540643ed5804d7455b5df8fe16f5e5", size = 28462, upload-time = "2024-02-02T16:30:36.166Z" }, + { url = "https://files.pythonhosted.org/packages/2d/75/fd6cb2e68780f72d47e6671840ca517bda5ef663d30ada7616b0462ad1e3/MarkupSafe-2.1.5-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ea3d8a3d18833cf4304cd2fc9cbb1efe188ca9b5efef2bdac7adc20594a0e46b", size = 27869, upload-time = "2024-02-02T16:30:37.834Z" }, + { url = "https://files.pythonhosted.org/packages/b0/81/147c477391c2750e8fc7705829f7351cf1cd3be64406edcf900dc633feb2/MarkupSafe-2.1.5-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:d050b3361367a06d752db6ead6e7edeb0009be66bc3bae0ee9d97fb326badc2a", size = 33906, upload-time = "2024-02-02T16:30:39.366Z" }, + { url = "https://files.pythonhosted.org/packages/8b/ff/9a52b71839d7a256b563e85d11050e307121000dcebc97df120176b3ad93/MarkupSafe-2.1.5-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:bec0a414d016ac1a18862a519e54b2fd0fc8bbfd6890376898a6c0891dd82e9f", size = 32296, upload-time = "2024-02-02T16:30:40.413Z" }, + { url = "https://files.pythonhosted.org/packages/88/07/2dc76aa51b481eb96a4c3198894f38b480490e834479611a4053fbf08623/MarkupSafe-2.1.5-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:58c98fee265677f63a4385256a6d7683ab1832f3ddd1e66fe948d5880c21a169", size = 33038, upload-time = "2024-02-02T16:30:42.243Z" }, + { url = "https://files.pythonhosted.org/packages/96/0c/620c1fb3661858c0e37eb3cbffd8c6f732a67cd97296f725789679801b31/MarkupSafe-2.1.5-cp312-cp312-win32.whl", hash = "sha256:8590b4ae07a35970728874632fed7bd57b26b0102df2d2b233b6d9d82f6c62ad", size = 16572, upload-time = "2024-02-02T16:30:43.326Z" }, + { url = "https://files.pythonhosted.org/packages/3f/14/c3554d512d5f9100a95e737502f4a2323a1959f6d0d01e0d0997b35f7b10/MarkupSafe-2.1.5-cp312-cp312-win_amd64.whl", hash = "sha256:823b65d8706e32ad2df51ed89496147a42a2a6e01c13cfb6ffb8b1e92bc910bb", size = 17127, upload-time = "2024-02-02T16:30:44.418Z" }, + { url = "https://files.pythonhosted.org/packages/f8/ff/2c942a82c35a49df5de3a630ce0a8456ac2969691b230e530ac12314364c/MarkupSafe-2.1.5-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:656f7526c69fac7f600bd1f400991cc282b417d17539a1b228617081106feb4a", size = 18192, upload-time = "2024-02-02T16:30:57.715Z" }, + { url = "https://files.pythonhosted.org/packages/4f/14/6f294b9c4f969d0c801a4615e221c1e084722ea6114ab2114189c5b8cbe0/MarkupSafe-2.1.5-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:97cafb1f3cbcd3fd2b6fbfb99ae11cdb14deea0736fc2b0952ee177f2b813a46", size = 14072, upload-time = "2024-02-02T16:30:58.844Z" }, + { url = "https://files.pythonhosted.org/packages/81/d4/fd74714ed30a1dedd0b82427c02fa4deec64f173831ec716da11c51a50aa/MarkupSafe-2.1.5-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1f3fbcb7ef1f16e48246f704ab79d79da8a46891e2da03f8783a5b6fa41a9532", size = 26928, upload-time = "2024-02-02T16:30:59.922Z" }, + { url = "https://files.pythonhosted.org/packages/c7/bd/50319665ce81bb10e90d1cf76f9e1aa269ea6f7fa30ab4521f14d122a3df/MarkupSafe-2.1.5-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fa9db3f79de01457b03d4f01b34cf91bc0048eb2c3846ff26f66687c2f6d16ab", size = 26106, upload-time = "2024-02-02T16:31:01.582Z" }, + { url = "https://files.pythonhosted.org/packages/4c/6f/f2b0f675635b05f6afd5ea03c094557bdb8622fa8e673387444fe8d8e787/MarkupSafe-2.1.5-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ffee1f21e5ef0d712f9033568f8344d5da8cc2869dbd08d87c84656e6a2d2f68", size = 25781, upload-time = "2024-02-02T16:31:02.71Z" }, + { url = "https://files.pythonhosted.org/packages/51/e0/393467cf899b34a9d3678e78961c2c8cdf49fb902a959ba54ece01273fb1/MarkupSafe-2.1.5-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:5dedb4db619ba5a2787a94d877bc8ffc0566f92a01c0ef214865e54ecc9ee5e0", size = 30518, upload-time = "2024-02-02T16:31:04.392Z" }, + { url = "https://files.pythonhosted.org/packages/f6/02/5437e2ad33047290dafced9df741d9efc3e716b75583bbd73a9984f1b6f7/MarkupSafe-2.1.5-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:30b600cf0a7ac9234b2638fbc0fb6158ba5bdcdf46aeb631ead21248b9affbc4", size = 29669, upload-time = "2024-02-02T16:31:05.53Z" }, + { url = "https://files.pythonhosted.org/packages/0e/7d/968284145ffd9d726183ed6237c77938c021abacde4e073020f920e060b2/MarkupSafe-2.1.5-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:8dd717634f5a044f860435c1d8c16a270ddf0ef8588d4887037c5028b859b0c3", size = 29933, upload-time = "2024-02-02T16:31:06.636Z" }, + { url = "https://files.pythonhosted.org/packages/bf/f3/ecb00fc8ab02b7beae8699f34db9357ae49d9f21d4d3de6f305f34fa949e/MarkupSafe-2.1.5-cp38-cp38-win32.whl", hash = "sha256:daa4ee5a243f0f20d528d939d06670a298dd39b1ad5f8a72a4275124a7819eff", size = 16656, upload-time = "2024-02-02T16:31:07.767Z" }, + { url = "https://files.pythonhosted.org/packages/92/21/357205f03514a49b293e214ac39de01fadd0970a6e05e4bf1ddd0ffd0881/MarkupSafe-2.1.5-cp38-cp38-win_amd64.whl", hash = "sha256:619bc166c4f2de5caa5a633b8b7326fbe98e0ccbfacabd87268a2b15ff73a029", size = 17206, upload-time = "2024-02-02T16:31:08.843Z" }, + { url = "https://files.pythonhosted.org/packages/0f/31/780bb297db036ba7b7bbede5e1d7f1e14d704ad4beb3ce53fb495d22bc62/MarkupSafe-2.1.5-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:7a68b554d356a91cce1236aa7682dc01df0edba8d043fd1ce607c49dd3c1edcf", size = 18193, upload-time = "2024-02-02T16:31:10.155Z" }, + { url = "https://files.pythonhosted.org/packages/6c/77/d77701bbef72892affe060cdacb7a2ed7fd68dae3b477a8642f15ad3b132/MarkupSafe-2.1.5-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:db0b55e0f3cc0be60c1f19efdde9a637c32740486004f20d1cff53c3c0ece4d2", size = 14073, upload-time = "2024-02-02T16:31:11.442Z" }, + { url = "https://files.pythonhosted.org/packages/d9/a7/1e558b4f78454c8a3a0199292d96159eb4d091f983bc35ef258314fe7269/MarkupSafe-2.1.5-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3e53af139f8579a6d5f7b76549125f0d94d7e630761a2111bc431fd820e163b8", size = 26486, upload-time = "2024-02-02T16:31:12.488Z" }, + { url = "https://files.pythonhosted.org/packages/5f/5a/360da85076688755ea0cceb92472923086993e86b5613bbae9fbc14136b0/MarkupSafe-2.1.5-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:17b950fccb810b3293638215058e432159d2b71005c74371d784862b7e4683f3", size = 25685, upload-time = "2024-02-02T16:31:13.726Z" }, + { url = "https://files.pythonhosted.org/packages/6a/18/ae5a258e3401f9b8312f92b028c54d7026a97ec3ab20bfaddbdfa7d8cce8/MarkupSafe-2.1.5-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4c31f53cdae6ecfa91a77820e8b151dba54ab528ba65dfd235c80b086d68a465", size = 25338, upload-time = "2024-02-02T16:31:14.812Z" }, + { url = "https://files.pythonhosted.org/packages/0b/cc/48206bd61c5b9d0129f4d75243b156929b04c94c09041321456fd06a876d/MarkupSafe-2.1.5-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:bff1b4290a66b490a2f4719358c0cdcd9bafb6b8f061e45c7a2460866bf50c2e", size = 30439, upload-time = "2024-02-02T16:31:15.946Z" }, + { url = "https://files.pythonhosted.org/packages/d1/06/a41c112ab9ffdeeb5f77bc3e331fdadf97fa65e52e44ba31880f4e7f983c/MarkupSafe-2.1.5-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:bc1667f8b83f48511b94671e0e441401371dfd0f0a795c7daa4a3cd1dde55bea", size = 29531, upload-time = "2024-02-02T16:31:17.13Z" }, + { url = "https://files.pythonhosted.org/packages/02/8c/ab9a463301a50dab04d5472e998acbd4080597abc048166ded5c7aa768c8/MarkupSafe-2.1.5-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:5049256f536511ee3f7e1b3f87d1d1209d327e818e6ae1365e8653d7e3abb6a6", size = 29823, upload-time = "2024-02-02T16:31:18.247Z" }, + { url = "https://files.pythonhosted.org/packages/bc/29/9bc18da763496b055d8e98ce476c8e718dcfd78157e17f555ce6dd7d0895/MarkupSafe-2.1.5-cp39-cp39-win32.whl", hash = "sha256:00e046b6dd71aa03a41079792f8473dc494d564611a8f89bbbd7cb93295ebdcf", size = 16658, upload-time = "2024-02-02T16:31:19.583Z" }, + { url = "https://files.pythonhosted.org/packages/f6/f8/4da07de16f10551ca1f640c92b5f316f9394088b183c6a57183df6de5ae4/MarkupSafe-2.1.5-cp39-cp39-win_amd64.whl", hash = "sha256:fa173ec60341d6bb97a89f5ea19c85c5643c1e7dedebc22f5181eb73573142c5", size = 17211, upload-time = "2024-02-02T16:31:20.96Z" }, +] + +[[package]] +name = "markupsafe" +version = "3.0.3" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version >= '3.14'", + "python_full_version >= '3.11' and python_full_version < '3.14'", + "python_full_version == '3.10.*'", + "python_full_version == '3.9.*'", +] +sdist = { url = "https://files.pythonhosted.org/packages/7e/99/7690b6d4034fffd95959cbe0c02de8deb3098cc577c67bb6a24fe5d7caa7/markupsafe-3.0.3.tar.gz", hash = "sha256:722695808f4b6457b320fdc131280796bdceb04ab50fe1795cd540799ebe1698", size = 80313, upload-time = "2025-09-27T18:37:40.426Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/e8/4b/3541d44f3937ba468b75da9eebcae497dcf67adb65caa16760b0a6807ebb/markupsafe-3.0.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:2f981d352f04553a7171b8e44369f2af4055f888dfb147d55e42d29e29e74559", size = 11631, upload-time = "2025-09-27T18:36:05.558Z" }, + { url = "https://files.pythonhosted.org/packages/98/1b/fbd8eed11021cabd9226c37342fa6ca4e8a98d8188a8d9b66740494960e4/markupsafe-3.0.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:e1c1493fb6e50ab01d20a22826e57520f1284df32f2d8601fdd90b6304601419", size = 12057, upload-time = "2025-09-27T18:36:07.165Z" }, + { url = "https://files.pythonhosted.org/packages/40/01/e560d658dc0bb8ab762670ece35281dec7b6c1b33f5fbc09ebb57a185519/markupsafe-3.0.3-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:1ba88449deb3de88bd40044603fafffb7bc2b055d626a330323a9ed736661695", size = 22050, upload-time = "2025-09-27T18:36:08.005Z" }, + { url = "https://files.pythonhosted.org/packages/af/cd/ce6e848bbf2c32314c9b237839119c5a564a59725b53157c856e90937b7a/markupsafe-3.0.3-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:f42d0984e947b8adf7dd6dde396e720934d12c506ce84eea8476409563607591", size = 20681, upload-time = "2025-09-27T18:36:08.881Z" }, + { url = "https://files.pythonhosted.org/packages/c9/2a/b5c12c809f1c3045c4d580b035a743d12fcde53cf685dbc44660826308da/markupsafe-3.0.3-cp310-cp310-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:c0c0b3ade1c0b13b936d7970b1d37a57acde9199dc2aecc4c336773e1d86049c", size = 20705, upload-time = "2025-09-27T18:36:10.131Z" }, + { url = "https://files.pythonhosted.org/packages/cf/e3/9427a68c82728d0a88c50f890d0fc072a1484de2f3ac1ad0bfc1a7214fd5/markupsafe-3.0.3-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:0303439a41979d9e74d18ff5e2dd8c43ed6c6001fd40e5bf2e43f7bd9bbc523f", size = 21524, upload-time = "2025-09-27T18:36:11.324Z" }, + { url = "https://files.pythonhosted.org/packages/bc/36/23578f29e9e582a4d0278e009b38081dbe363c5e7165113fad546918a232/markupsafe-3.0.3-cp310-cp310-musllinux_1_2_riscv64.whl", hash = "sha256:d2ee202e79d8ed691ceebae8e0486bd9a2cd4794cec4824e1c99b6f5009502f6", size = 20282, upload-time = "2025-09-27T18:36:12.573Z" }, + { url = "https://files.pythonhosted.org/packages/56/21/dca11354e756ebd03e036bd8ad58d6d7168c80ce1fe5e75218e4945cbab7/markupsafe-3.0.3-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:177b5253b2834fe3678cb4a5f0059808258584c559193998be2601324fdeafb1", size = 20745, upload-time = "2025-09-27T18:36:13.504Z" }, + { url = "https://files.pythonhosted.org/packages/87/99/faba9369a7ad6e4d10b6a5fbf71fa2a188fe4a593b15f0963b73859a1bbd/markupsafe-3.0.3-cp310-cp310-win32.whl", hash = "sha256:2a15a08b17dd94c53a1da0438822d70ebcd13f8c3a95abe3a9ef9f11a94830aa", size = 14571, upload-time = "2025-09-27T18:36:14.779Z" }, + { url = "https://files.pythonhosted.org/packages/d6/25/55dc3ab959917602c96985cb1253efaa4ff42f71194bddeb61eb7278b8be/markupsafe-3.0.3-cp310-cp310-win_amd64.whl", hash = "sha256:c4ffb7ebf07cfe8931028e3e4c85f0357459a3f9f9490886198848f4fa002ec8", size = 15056, upload-time = "2025-09-27T18:36:16.125Z" }, + { url = "https://files.pythonhosted.org/packages/d0/9e/0a02226640c255d1da0b8d12e24ac2aa6734da68bff14c05dd53b94a0fc3/markupsafe-3.0.3-cp310-cp310-win_arm64.whl", hash = "sha256:e2103a929dfa2fcaf9bb4e7c091983a49c9ac3b19c9061b6d5427dd7d14d81a1", size = 13932, upload-time = "2025-09-27T18:36:17.311Z" }, + { url = "https://files.pythonhosted.org/packages/08/db/fefacb2136439fc8dd20e797950e749aa1f4997ed584c62cfb8ef7c2be0e/markupsafe-3.0.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:1cc7ea17a6824959616c525620e387f6dd30fec8cb44f649e31712db02123dad", size = 11631, upload-time = "2025-09-27T18:36:18.185Z" }, + { url = "https://files.pythonhosted.org/packages/e1/2e/5898933336b61975ce9dc04decbc0a7f2fee78c30353c5efba7f2d6ff27a/markupsafe-3.0.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:4bd4cd07944443f5a265608cc6aab442e4f74dff8088b0dfc8238647b8f6ae9a", size = 12058, upload-time = "2025-09-27T18:36:19.444Z" }, + { url = "https://files.pythonhosted.org/packages/1d/09/adf2df3699d87d1d8184038df46a9c80d78c0148492323f4693df54e17bb/markupsafe-3.0.3-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6b5420a1d9450023228968e7e6a9ce57f65d148ab56d2313fcd589eee96a7a50", size = 24287, upload-time = "2025-09-27T18:36:20.768Z" }, + { url = "https://files.pythonhosted.org/packages/30/ac/0273f6fcb5f42e314c6d8cd99effae6a5354604d461b8d392b5ec9530a54/markupsafe-3.0.3-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:0bf2a864d67e76e5c9a34dc26ec616a66b9888e25e7b9460e1c76d3293bd9dbf", size = 22940, upload-time = "2025-09-27T18:36:22.249Z" }, + { url = "https://files.pythonhosted.org/packages/19/ae/31c1be199ef767124c042c6c3e904da327a2f7f0cd63a0337e1eca2967a8/markupsafe-3.0.3-cp311-cp311-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:bc51efed119bc9cfdf792cdeaa4d67e8f6fcccab66ed4bfdd6bde3e59bfcbb2f", size = 21887, upload-time = "2025-09-27T18:36:23.535Z" }, + { url = "https://files.pythonhosted.org/packages/b2/76/7edcab99d5349a4532a459e1fe64f0b0467a3365056ae550d3bcf3f79e1e/markupsafe-3.0.3-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:068f375c472b3e7acbe2d5318dea141359e6900156b5b2ba06a30b169086b91a", size = 23692, upload-time = "2025-09-27T18:36:24.823Z" }, + { url = "https://files.pythonhosted.org/packages/a4/28/6e74cdd26d7514849143d69f0bf2399f929c37dc2b31e6829fd2045b2765/markupsafe-3.0.3-cp311-cp311-musllinux_1_2_riscv64.whl", hash = "sha256:7be7b61bb172e1ed687f1754f8e7484f1c8019780f6f6b0786e76bb01c2ae115", size = 21471, upload-time = "2025-09-27T18:36:25.95Z" }, + { url = "https://files.pythonhosted.org/packages/62/7e/a145f36a5c2945673e590850a6f8014318d5577ed7e5920a4b3448e0865d/markupsafe-3.0.3-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:f9e130248f4462aaa8e2552d547f36ddadbeaa573879158d721bbd33dfe4743a", size = 22923, upload-time = "2025-09-27T18:36:27.109Z" }, + { url = "https://files.pythonhosted.org/packages/0f/62/d9c46a7f5c9adbeeeda52f5b8d802e1094e9717705a645efc71b0913a0a8/markupsafe-3.0.3-cp311-cp311-win32.whl", hash = "sha256:0db14f5dafddbb6d9208827849fad01f1a2609380add406671a26386cdf15a19", size = 14572, upload-time = "2025-09-27T18:36:28.045Z" }, + { url = "https://files.pythonhosted.org/packages/83/8a/4414c03d3f891739326e1783338e48fb49781cc915b2e0ee052aa490d586/markupsafe-3.0.3-cp311-cp311-win_amd64.whl", hash = "sha256:de8a88e63464af587c950061a5e6a67d3632e36df62b986892331d4620a35c01", size = 15077, upload-time = "2025-09-27T18:36:29.025Z" }, + { url = "https://files.pythonhosted.org/packages/35/73/893072b42e6862f319b5207adc9ae06070f095b358655f077f69a35601f0/markupsafe-3.0.3-cp311-cp311-win_arm64.whl", hash = "sha256:3b562dd9e9ea93f13d53989d23a7e775fdfd1066c33494ff43f5418bc8c58a5c", size = 13876, upload-time = "2025-09-27T18:36:29.954Z" }, + { url = "https://files.pythonhosted.org/packages/5a/72/147da192e38635ada20e0a2e1a51cf8823d2119ce8883f7053879c2199b5/markupsafe-3.0.3-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:d53197da72cc091b024dd97249dfc7794d6a56530370992a5e1a08983ad9230e", size = 11615, upload-time = "2025-09-27T18:36:30.854Z" }, + { url = "https://files.pythonhosted.org/packages/9a/81/7e4e08678a1f98521201c3079f77db69fb552acd56067661f8c2f534a718/markupsafe-3.0.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:1872df69a4de6aead3491198eaf13810b565bdbeec3ae2dc8780f14458ec73ce", size = 12020, upload-time = "2025-09-27T18:36:31.971Z" }, + { url = "https://files.pythonhosted.org/packages/1e/2c/799f4742efc39633a1b54a92eec4082e4f815314869865d876824c257c1e/markupsafe-3.0.3-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:3a7e8ae81ae39e62a41ec302f972ba6ae23a5c5396c8e60113e9066ef893da0d", size = 24332, upload-time = "2025-09-27T18:36:32.813Z" }, + { url = "https://files.pythonhosted.org/packages/3c/2e/8d0c2ab90a8c1d9a24f0399058ab8519a3279d1bd4289511d74e909f060e/markupsafe-3.0.3-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:d6dd0be5b5b189d31db7cda48b91d7e0a9795f31430b7f271219ab30f1d3ac9d", size = 22947, upload-time = "2025-09-27T18:36:33.86Z" }, + { url = "https://files.pythonhosted.org/packages/2c/54/887f3092a85238093a0b2154bd629c89444f395618842e8b0c41783898ea/markupsafe-3.0.3-cp312-cp312-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:94c6f0bb423f739146aec64595853541634bde58b2135f27f61c1ffd1cd4d16a", size = 21962, upload-time = "2025-09-27T18:36:35.099Z" }, + { url = "https://files.pythonhosted.org/packages/c9/2f/336b8c7b6f4a4d95e91119dc8521402461b74a485558d8f238a68312f11c/markupsafe-3.0.3-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:be8813b57049a7dc738189df53d69395eba14fb99345e0a5994914a3864c8a4b", size = 23760, upload-time = "2025-09-27T18:36:36.001Z" }, + { url = "https://files.pythonhosted.org/packages/32/43/67935f2b7e4982ffb50a4d169b724d74b62a3964bc1a9a527f5ac4f1ee2b/markupsafe-3.0.3-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:83891d0e9fb81a825d9a6d61e3f07550ca70a076484292a70fde82c4b807286f", size = 21529, upload-time = "2025-09-27T18:36:36.906Z" }, + { url = "https://files.pythonhosted.org/packages/89/e0/4486f11e51bbba8b0c041098859e869e304d1c261e59244baa3d295d47b7/markupsafe-3.0.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:77f0643abe7495da77fb436f50f8dab76dbc6e5fd25d39589a0f1fe6548bfa2b", size = 23015, upload-time = "2025-09-27T18:36:37.868Z" }, + { url = "https://files.pythonhosted.org/packages/2f/e1/78ee7a023dac597a5825441ebd17170785a9dab23de95d2c7508ade94e0e/markupsafe-3.0.3-cp312-cp312-win32.whl", hash = "sha256:d88b440e37a16e651bda4c7c2b930eb586fd15ca7406cb39e211fcff3bf3017d", size = 14540, upload-time = "2025-09-27T18:36:38.761Z" }, + { url = "https://files.pythonhosted.org/packages/aa/5b/bec5aa9bbbb2c946ca2733ef9c4ca91c91b6a24580193e891b5f7dbe8e1e/markupsafe-3.0.3-cp312-cp312-win_amd64.whl", hash = "sha256:26a5784ded40c9e318cfc2bdb30fe164bdb8665ded9cd64d500a34fb42067b1c", size = 15105, upload-time = "2025-09-27T18:36:39.701Z" }, + { url = "https://files.pythonhosted.org/packages/e5/f1/216fc1bbfd74011693a4fd837e7026152e89c4bcf3e77b6692fba9923123/markupsafe-3.0.3-cp312-cp312-win_arm64.whl", hash = "sha256:35add3b638a5d900e807944a078b51922212fb3dedb01633a8defc4b01a3c85f", size = 13906, upload-time = "2025-09-27T18:36:40.689Z" }, + { url = "https://files.pythonhosted.org/packages/38/2f/907b9c7bbba283e68f20259574b13d005c121a0fa4c175f9bed27c4597ff/markupsafe-3.0.3-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:e1cf1972137e83c5d4c136c43ced9ac51d0e124706ee1c8aa8532c1287fa8795", size = 11622, upload-time = "2025-09-27T18:36:41.777Z" }, + { url = "https://files.pythonhosted.org/packages/9c/d9/5f7756922cdd676869eca1c4e3c0cd0df60ed30199ffd775e319089cb3ed/markupsafe-3.0.3-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:116bb52f642a37c115f517494ea5feb03889e04df47eeff5b130b1808ce7c219", size = 12029, upload-time = "2025-09-27T18:36:43.257Z" }, + { url = "https://files.pythonhosted.org/packages/00/07/575a68c754943058c78f30db02ee03a64b3c638586fba6a6dd56830b30a3/markupsafe-3.0.3-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:133a43e73a802c5562be9bbcd03d090aa5a1fe899db609c29e8c8d815c5f6de6", size = 24374, upload-time = "2025-09-27T18:36:44.508Z" }, + { url = "https://files.pythonhosted.org/packages/a9/21/9b05698b46f218fc0e118e1f8168395c65c8a2c750ae2bab54fc4bd4e0e8/markupsafe-3.0.3-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:ccfcd093f13f0f0b7fdd0f198b90053bf7b2f02a3927a30e63f3ccc9df56b676", size = 22980, upload-time = "2025-09-27T18:36:45.385Z" }, + { url = "https://files.pythonhosted.org/packages/7f/71/544260864f893f18b6827315b988c146b559391e6e7e8f7252839b1b846a/markupsafe-3.0.3-cp313-cp313-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:509fa21c6deb7a7a273d629cf5ec029bc209d1a51178615ddf718f5918992ab9", size = 21990, upload-time = "2025-09-27T18:36:46.916Z" }, + { url = "https://files.pythonhosted.org/packages/c2/28/b50fc2f74d1ad761af2f5dcce7492648b983d00a65b8c0e0cb457c82ebbe/markupsafe-3.0.3-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:a4afe79fb3de0b7097d81da19090f4df4f8d3a2b3adaa8764138aac2e44f3af1", size = 23784, upload-time = "2025-09-27T18:36:47.884Z" }, + { url = "https://files.pythonhosted.org/packages/ed/76/104b2aa106a208da8b17a2fb72e033a5a9d7073c68f7e508b94916ed47a9/markupsafe-3.0.3-cp313-cp313-musllinux_1_2_riscv64.whl", hash = "sha256:795e7751525cae078558e679d646ae45574b47ed6e7771863fcc079a6171a0fc", size = 21588, upload-time = "2025-09-27T18:36:48.82Z" }, + { url = "https://files.pythonhosted.org/packages/b5/99/16a5eb2d140087ebd97180d95249b00a03aa87e29cc224056274f2e45fd6/markupsafe-3.0.3-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:8485f406a96febb5140bfeca44a73e3ce5116b2501ac54fe953e488fb1d03b12", size = 23041, upload-time = "2025-09-27T18:36:49.797Z" }, + { url = "https://files.pythonhosted.org/packages/19/bc/e7140ed90c5d61d77cea142eed9f9c303f4c4806f60a1044c13e3f1471d0/markupsafe-3.0.3-cp313-cp313-win32.whl", hash = "sha256:bdd37121970bfd8be76c5fb069c7751683bdf373db1ed6c010162b2a130248ed", size = 14543, upload-time = "2025-09-27T18:36:51.584Z" }, + { url = "https://files.pythonhosted.org/packages/05/73/c4abe620b841b6b791f2edc248f556900667a5a1cf023a6646967ae98335/markupsafe-3.0.3-cp313-cp313-win_amd64.whl", hash = "sha256:9a1abfdc021a164803f4d485104931fb8f8c1efd55bc6b748d2f5774e78b62c5", size = 15113, upload-time = "2025-09-27T18:36:52.537Z" }, + { url = "https://files.pythonhosted.org/packages/f0/3a/fa34a0f7cfef23cf9500d68cb7c32dd64ffd58a12b09225fb03dd37d5b80/markupsafe-3.0.3-cp313-cp313-win_arm64.whl", hash = "sha256:7e68f88e5b8799aa49c85cd116c932a1ac15caaa3f5db09087854d218359e485", size = 13911, upload-time = "2025-09-27T18:36:53.513Z" }, + { url = "https://files.pythonhosted.org/packages/e4/d7/e05cd7efe43a88a17a37b3ae96e79a19e846f3f456fe79c57ca61356ef01/markupsafe-3.0.3-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:218551f6df4868a8d527e3062d0fb968682fe92054e89978594c28e642c43a73", size = 11658, upload-time = "2025-09-27T18:36:54.819Z" }, + { url = "https://files.pythonhosted.org/packages/99/9e/e412117548182ce2148bdeacdda3bb494260c0b0184360fe0d56389b523b/markupsafe-3.0.3-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:3524b778fe5cfb3452a09d31e7b5adefeea8c5be1d43c4f810ba09f2ceb29d37", size = 12066, upload-time = "2025-09-27T18:36:55.714Z" }, + { url = "https://files.pythonhosted.org/packages/bc/e6/fa0ffcda717ef64a5108eaa7b4f5ed28d56122c9a6d70ab8b72f9f715c80/markupsafe-3.0.3-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:4e885a3d1efa2eadc93c894a21770e4bc67899e3543680313b09f139e149ab19", size = 25639, upload-time = "2025-09-27T18:36:56.908Z" }, + { url = "https://files.pythonhosted.org/packages/96/ec/2102e881fe9d25fc16cb4b25d5f5cde50970967ffa5dddafdb771237062d/markupsafe-3.0.3-cp313-cp313t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:8709b08f4a89aa7586de0aadc8da56180242ee0ada3999749b183aa23df95025", size = 23569, upload-time = "2025-09-27T18:36:57.913Z" }, + { url = "https://files.pythonhosted.org/packages/4b/30/6f2fce1f1f205fc9323255b216ca8a235b15860c34b6798f810f05828e32/markupsafe-3.0.3-cp313-cp313t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:b8512a91625c9b3da6f127803b166b629725e68af71f8184ae7e7d54686a56d6", size = 23284, upload-time = "2025-09-27T18:36:58.833Z" }, + { url = "https://files.pythonhosted.org/packages/58/47/4a0ccea4ab9f5dcb6f79c0236d954acb382202721e704223a8aafa38b5c8/markupsafe-3.0.3-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:9b79b7a16f7fedff2495d684f2b59b0457c3b493778c9eed31111be64d58279f", size = 24801, upload-time = "2025-09-27T18:36:59.739Z" }, + { url = "https://files.pythonhosted.org/packages/6a/70/3780e9b72180b6fecb83a4814d84c3bf4b4ae4bf0b19c27196104149734c/markupsafe-3.0.3-cp313-cp313t-musllinux_1_2_riscv64.whl", hash = "sha256:12c63dfb4a98206f045aa9563db46507995f7ef6d83b2f68eda65c307c6829eb", size = 22769, upload-time = "2025-09-27T18:37:00.719Z" }, + { url = "https://files.pythonhosted.org/packages/98/c5/c03c7f4125180fc215220c035beac6b9cb684bc7a067c84fc69414d315f5/markupsafe-3.0.3-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:8f71bc33915be5186016f675cd83a1e08523649b0e33efdb898db577ef5bb009", size = 23642, upload-time = "2025-09-27T18:37:01.673Z" }, + { url = "https://files.pythonhosted.org/packages/80/d6/2d1b89f6ca4bff1036499b1e29a1d02d282259f3681540e16563f27ebc23/markupsafe-3.0.3-cp313-cp313t-win32.whl", hash = "sha256:69c0b73548bc525c8cb9a251cddf1931d1db4d2258e9599c28c07ef3580ef354", size = 14612, upload-time = "2025-09-27T18:37:02.639Z" }, + { url = "https://files.pythonhosted.org/packages/2b/98/e48a4bfba0a0ffcf9925fe2d69240bfaa19c6f7507b8cd09c70684a53c1e/markupsafe-3.0.3-cp313-cp313t-win_amd64.whl", hash = "sha256:1b4b79e8ebf6b55351f0d91fe80f893b4743f104bff22e90697db1590e47a218", size = 15200, upload-time = "2025-09-27T18:37:03.582Z" }, + { url = "https://files.pythonhosted.org/packages/0e/72/e3cc540f351f316e9ed0f092757459afbc595824ca724cbc5a5d4263713f/markupsafe-3.0.3-cp313-cp313t-win_arm64.whl", hash = "sha256:ad2cf8aa28b8c020ab2fc8287b0f823d0a7d8630784c31e9ee5edea20f406287", size = 13973, upload-time = "2025-09-27T18:37:04.929Z" }, + { url = "https://files.pythonhosted.org/packages/33/8a/8e42d4838cd89b7dde187011e97fe6c3af66d8c044997d2183fbd6d31352/markupsafe-3.0.3-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:eaa9599de571d72e2daf60164784109f19978b327a3910d3e9de8c97b5b70cfe", size = 11619, upload-time = "2025-09-27T18:37:06.342Z" }, + { url = "https://files.pythonhosted.org/packages/b5/64/7660f8a4a8e53c924d0fa05dc3a55c9cee10bbd82b11c5afb27d44b096ce/markupsafe-3.0.3-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:c47a551199eb8eb2121d4f0f15ae0f923d31350ab9280078d1e5f12b249e0026", size = 12029, upload-time = "2025-09-27T18:37:07.213Z" }, + { url = "https://files.pythonhosted.org/packages/da/ef/e648bfd021127bef5fa12e1720ffed0c6cbb8310c8d9bea7266337ff06de/markupsafe-3.0.3-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:f34c41761022dd093b4b6896d4810782ffbabe30f2d443ff5f083e0cbbb8c737", size = 24408, upload-time = "2025-09-27T18:37:09.572Z" }, + { url = "https://files.pythonhosted.org/packages/41/3c/a36c2450754618e62008bf7435ccb0f88053e07592e6028a34776213d877/markupsafe-3.0.3-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:457a69a9577064c05a97c41f4e65148652db078a3a509039e64d3467b9e7ef97", size = 23005, upload-time = "2025-09-27T18:37:10.58Z" }, + { url = "https://files.pythonhosted.org/packages/bc/20/b7fdf89a8456b099837cd1dc21974632a02a999ec9bf7ca3e490aacd98e7/markupsafe-3.0.3-cp314-cp314-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:e8afc3f2ccfa24215f8cb28dcf43f0113ac3c37c2f0f0806d8c70e4228c5cf4d", size = 22048, upload-time = "2025-09-27T18:37:11.547Z" }, + { url = "https://files.pythonhosted.org/packages/9a/a7/591f592afdc734f47db08a75793a55d7fbcc6902a723ae4cfbab61010cc5/markupsafe-3.0.3-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:ec15a59cf5af7be74194f7ab02d0f59a62bdcf1a537677ce67a2537c9b87fcda", size = 23821, upload-time = "2025-09-27T18:37:12.48Z" }, + { url = "https://files.pythonhosted.org/packages/7d/33/45b24e4f44195b26521bc6f1a82197118f74df348556594bd2262bda1038/markupsafe-3.0.3-cp314-cp314-musllinux_1_2_riscv64.whl", hash = "sha256:0eb9ff8191e8498cca014656ae6b8d61f39da5f95b488805da4bb029cccbfbaf", size = 21606, upload-time = "2025-09-27T18:37:13.485Z" }, + { url = "https://files.pythonhosted.org/packages/ff/0e/53dfaca23a69fbfbbf17a4b64072090e70717344c52eaaaa9c5ddff1e5f0/markupsafe-3.0.3-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:2713baf880df847f2bece4230d4d094280f4e67b1e813eec43b4c0e144a34ffe", size = 23043, upload-time = "2025-09-27T18:37:14.408Z" }, + { url = "https://files.pythonhosted.org/packages/46/11/f333a06fc16236d5238bfe74daccbca41459dcd8d1fa952e8fbd5dccfb70/markupsafe-3.0.3-cp314-cp314-win32.whl", hash = "sha256:729586769a26dbceff69f7a7dbbf59ab6572b99d94576a5592625d5b411576b9", size = 14747, upload-time = "2025-09-27T18:37:15.36Z" }, + { url = "https://files.pythonhosted.org/packages/28/52/182836104b33b444e400b14f797212f720cbc9ed6ba34c800639d154e821/markupsafe-3.0.3-cp314-cp314-win_amd64.whl", hash = "sha256:bdc919ead48f234740ad807933cdf545180bfbe9342c2bb451556db2ed958581", size = 15341, upload-time = "2025-09-27T18:37:16.496Z" }, + { url = "https://files.pythonhosted.org/packages/6f/18/acf23e91bd94fd7b3031558b1f013adfa21a8e407a3fdb32745538730382/markupsafe-3.0.3-cp314-cp314-win_arm64.whl", hash = "sha256:5a7d5dc5140555cf21a6fefbdbf8723f06fcd2f63ef108f2854de715e4422cb4", size = 14073, upload-time = "2025-09-27T18:37:17.476Z" }, + { url = "https://files.pythonhosted.org/packages/3c/f0/57689aa4076e1b43b15fdfa646b04653969d50cf30c32a102762be2485da/markupsafe-3.0.3-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:1353ef0c1b138e1907ae78e2f6c63ff67501122006b0f9abad68fda5f4ffc6ab", size = 11661, upload-time = "2025-09-27T18:37:18.453Z" }, + { url = "https://files.pythonhosted.org/packages/89/c3/2e67a7ca217c6912985ec766c6393b636fb0c2344443ff9d91404dc4c79f/markupsafe-3.0.3-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:1085e7fbddd3be5f89cc898938f42c0b3c711fdcb37d75221de2666af647c175", size = 12069, upload-time = "2025-09-27T18:37:19.332Z" }, + { url = "https://files.pythonhosted.org/packages/f0/00/be561dce4e6ca66b15276e184ce4b8aec61fe83662cce2f7d72bd3249d28/markupsafe-3.0.3-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:1b52b4fb9df4eb9ae465f8d0c228a00624de2334f216f178a995ccdcf82c4634", size = 25670, upload-time = "2025-09-27T18:37:20.245Z" }, + { url = "https://files.pythonhosted.org/packages/50/09/c419f6f5a92e5fadde27efd190eca90f05e1261b10dbd8cbcb39cd8ea1dc/markupsafe-3.0.3-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:fed51ac40f757d41b7c48425901843666a6677e3e8eb0abcff09e4ba6e664f50", size = 23598, upload-time = "2025-09-27T18:37:21.177Z" }, + { url = "https://files.pythonhosted.org/packages/22/44/a0681611106e0b2921b3033fc19bc53323e0b50bc70cffdd19f7d679bb66/markupsafe-3.0.3-cp314-cp314t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:f190daf01f13c72eac4efd5c430a8de82489d9cff23c364c3ea822545032993e", size = 23261, upload-time = "2025-09-27T18:37:22.167Z" }, + { url = "https://files.pythonhosted.org/packages/5f/57/1b0b3f100259dc9fffe780cfb60d4be71375510e435efec3d116b6436d43/markupsafe-3.0.3-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:e56b7d45a839a697b5eb268c82a71bd8c7f6c94d6fd50c3d577fa39a9f1409f5", size = 24835, upload-time = "2025-09-27T18:37:23.296Z" }, + { url = "https://files.pythonhosted.org/packages/26/6a/4bf6d0c97c4920f1597cc14dd720705eca0bf7c787aebc6bb4d1bead5388/markupsafe-3.0.3-cp314-cp314t-musllinux_1_2_riscv64.whl", hash = "sha256:f3e98bb3798ead92273dc0e5fd0f31ade220f59a266ffd8a4f6065e0a3ce0523", size = 22733, upload-time = "2025-09-27T18:37:24.237Z" }, + { url = "https://files.pythonhosted.org/packages/14/c7/ca723101509b518797fedc2fdf79ba57f886b4aca8a7d31857ba3ee8281f/markupsafe-3.0.3-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:5678211cb9333a6468fb8d8be0305520aa073f50d17f089b5b4b477ea6e67fdc", size = 23672, upload-time = "2025-09-27T18:37:25.271Z" }, + { url = "https://files.pythonhosted.org/packages/fb/df/5bd7a48c256faecd1d36edc13133e51397e41b73bb77e1a69deab746ebac/markupsafe-3.0.3-cp314-cp314t-win32.whl", hash = "sha256:915c04ba3851909ce68ccc2b8e2cd691618c4dc4c4232fb7982bca3f41fd8c3d", size = 14819, upload-time = "2025-09-27T18:37:26.285Z" }, + { url = "https://files.pythonhosted.org/packages/1a/8a/0402ba61a2f16038b48b39bccca271134be00c5c9f0f623208399333c448/markupsafe-3.0.3-cp314-cp314t-win_amd64.whl", hash = "sha256:4faffd047e07c38848ce017e8725090413cd80cbc23d86e55c587bf979e579c9", size = 15426, upload-time = "2025-09-27T18:37:27.316Z" }, + { url = "https://files.pythonhosted.org/packages/70/bc/6f1c2f612465f5fa89b95bead1f44dcb607670fd42891d8fdcd5d039f4f4/markupsafe-3.0.3-cp314-cp314t-win_arm64.whl", hash = "sha256:32001d6a8fc98c8cb5c947787c5d08b0a50663d139f1305bac5885d98d9b40fa", size = 14146, upload-time = "2025-09-27T18:37:28.327Z" }, + { url = "https://files.pythonhosted.org/packages/56/23/0d8c13a44bde9154821586520840643467aee574d8ce79a17da539ee7fed/markupsafe-3.0.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:15d939a21d546304880945ca1ecb8a039db6b4dc49b2c5a400387cdae6a62e26", size = 11623, upload-time = "2025-09-27T18:37:29.296Z" }, + { url = "https://files.pythonhosted.org/packages/fd/23/07a2cb9a8045d5f3f0890a8c3bc0859d7a47bfd9a560b563899bec7b72ed/markupsafe-3.0.3-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:f71a396b3bf33ecaa1626c255855702aca4d3d9fea5e051b41ac59a9c1c41edc", size = 12049, upload-time = "2025-09-27T18:37:30.234Z" }, + { url = "https://files.pythonhosted.org/packages/bc/e4/6be85eb81503f8e11b61c0b6369b6e077dcf0a74adbd9ebf6b349937b4e9/markupsafe-3.0.3-cp39-cp39-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:0f4b68347f8c5eab4a13419215bdfd7f8c9b19f2b25520968adfad23eb0ce60c", size = 21923, upload-time = "2025-09-27T18:37:31.177Z" }, + { url = "https://files.pythonhosted.org/packages/6f/bc/4dc914ead3fe6ddaef035341fee0fc956949bbd27335b611829292b89ee2/markupsafe-3.0.3-cp39-cp39-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:e8fc20152abba6b83724d7ff268c249fa196d8259ff481f3b1476383f8f24e42", size = 20543, upload-time = "2025-09-27T18:37:32.168Z" }, + { url = "https://files.pythonhosted.org/packages/89/6e/5fe81fbcfba4aef4093d5f856e5c774ec2057946052d18d168219b7bd9f9/markupsafe-3.0.3-cp39-cp39-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:949b8d66bc381ee8b007cd945914c721d9aba8e27f71959d750a46f7c282b20b", size = 20585, upload-time = "2025-09-27T18:37:33.166Z" }, + { url = "https://files.pythonhosted.org/packages/f6/f6/e0e5a3d3ae9c4020f696cd055f940ef86b64fe88de26f3a0308b9d3d048c/markupsafe-3.0.3-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:3537e01efc9d4dccdf77221fb1cb3b8e1a38d5428920e0657ce299b20324d758", size = 21387, upload-time = "2025-09-27T18:37:34.185Z" }, + { url = "https://files.pythonhosted.org/packages/c8/25/651753ef4dea08ea790f4fbb65146a9a44a014986996ca40102e237aa49a/markupsafe-3.0.3-cp39-cp39-musllinux_1_2_riscv64.whl", hash = "sha256:591ae9f2a647529ca990bc681daebdd52c8791ff06c2bfa05b65163e28102ef2", size = 20133, upload-time = "2025-09-27T18:37:35.138Z" }, + { url = "https://files.pythonhosted.org/packages/dc/0a/c3cf2b4fef5f0426e8a6d7fce3cb966a17817c568ce59d76b92a233fdbec/markupsafe-3.0.3-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:a320721ab5a1aba0a233739394eb907f8c8da5c98c9181d1161e77a0c8e36f2d", size = 20588, upload-time = "2025-09-27T18:37:36.096Z" }, + { url = "https://files.pythonhosted.org/packages/cd/1b/a7782984844bd519ad4ffdbebbba2671ec5d0ebbeac34736c15fb86399e8/markupsafe-3.0.3-cp39-cp39-win32.whl", hash = "sha256:df2449253ef108a379b8b5d6b43f4b1a8e81a061d6537becd5582fba5f9196d7", size = 14566, upload-time = "2025-09-27T18:37:37.09Z" }, + { url = "https://files.pythonhosted.org/packages/18/1f/8d9c20e1c9440e215a44be5ab64359e207fcb4f675543f1cf9a2a7f648d0/markupsafe-3.0.3-cp39-cp39-win_amd64.whl", hash = "sha256:7c3fb7d25180895632e5d3148dbdc29ea38ccb7fd210aa27acbd1201a1902c6e", size = 15053, upload-time = "2025-09-27T18:37:38.054Z" }, + { url = "https://files.pythonhosted.org/packages/4e/d3/fe08482b5cd995033556d45041a4f4e76e7f0521112a9c9991d40d39825f/markupsafe-3.0.3-cp39-cp39-win_arm64.whl", hash = "sha256:38664109c14ffc9e7437e86b4dceb442b0096dfe3541d7864d9cbe1da4cf36c8", size = 13928, upload-time = "2025-09-27T18:37:39.037Z" }, +] + +[[package]] +name = "matplotlib" +version = "3.7.5" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version < '3.9'", +] +dependencies = [ + { name = "contourpy", version = "1.1.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.9'" }, + { name = "cycler", marker = "python_full_version < '3.9'" }, + { name = "fonttools", version = "4.57.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.9'" }, + { name = "importlib-resources", version = "6.4.5", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.9'" }, + { name = "kiwisolver", version = "1.4.7", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.9'" }, + { name = "numpy", version = "1.24.4", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.9'" }, + { name = "packaging", marker = "python_full_version < '3.9'" }, + { name = "pillow", version = "10.4.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.9'" }, + { name = "pyparsing", version = "3.1.4", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.9'" }, + { name = "python-dateutil", marker = "python_full_version < '3.9'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/b6/f0/3836719cc3982fbba3b840d18a59db1d0ee9ac7986f24e8c0a092851b67b/matplotlib-3.7.5.tar.gz", hash = "sha256:1e5c971558ebc811aa07f54c7b7c677d78aa518ef4c390e14673a09e0860184a", size = 38098611, upload-time = "2024-02-16T10:50:56.19Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/f5/b0/3808e86c41e5d97822d77e89d7f3cb0890725845c050d87ec53732a8b150/matplotlib-3.7.5-cp310-cp310-macosx_10_12_universal2.whl", hash = "sha256:4a87b69cb1cb20943010f63feb0b2901c17a3b435f75349fd9865713bfa63925", size = 8322924, upload-time = "2024-02-16T10:48:06.184Z" }, + { url = "https://files.pythonhosted.org/packages/5b/05/726623be56391ba1740331ad9f1cd30e1adec61c179ddac134957a6dc2e7/matplotlib-3.7.5-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:d3ce45010fefb028359accebb852ca0c21bd77ec0f281952831d235228f15810", size = 7438436, upload-time = "2024-02-16T10:48:10.294Z" }, + { url = "https://files.pythonhosted.org/packages/15/83/89cdef49ef1e320060ec951ba33c132df211561d866c3ed144c81fd110b2/matplotlib-3.7.5-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:fbea1e762b28400393d71be1a02144aa16692a3c4c676ba0178ce83fc2928fdd", size = 7341849, upload-time = "2024-02-16T10:48:13.249Z" }, + { url = "https://files.pythonhosted.org/packages/94/29/39fc4acdc296dd86e09cecb65c14966e1cf18e0f091b9cbd9bd3f0c19ee4/matplotlib-3.7.5-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ec0e1adc0ad70ba8227e957551e25a9d2995e319c29f94a97575bb90fa1d4469", size = 11354141, upload-time = "2024-02-16T10:48:16.963Z" }, + { url = "https://files.pythonhosted.org/packages/54/36/44c5eeb0d83ae1e3ed34d264d7adee947c4fd56c4a9464ce822de094995a/matplotlib-3.7.5-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6738c89a635ced486c8a20e20111d33f6398a9cbebce1ced59c211e12cd61455", size = 11457668, upload-time = "2024-02-16T10:48:21.339Z" }, + { url = "https://files.pythonhosted.org/packages/b7/e2/f68aeaedf0ef57cbb793637ee82e62e64ea26cee908db0fe4f8e24d502c0/matplotlib-3.7.5-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1210b7919b4ed94b5573870f316bca26de3e3b07ffdb563e79327dc0e6bba515", size = 11580088, upload-time = "2024-02-16T10:48:25.415Z" }, + { url = "https://files.pythonhosted.org/packages/d9/f7/7c88d34afc38943aa5e4e04d27fc9da5289a48c264c0d794f60c9cda0949/matplotlib-3.7.5-cp310-cp310-win32.whl", hash = "sha256:068ebcc59c072781d9dcdb82f0d3f1458271c2de7ca9c78f5bd672141091e9e1", size = 7339332, upload-time = "2024-02-16T10:48:29.319Z" }, + { url = "https://files.pythonhosted.org/packages/91/99/e5f6f7c9438279581c4a2308d264fe24dc98bb80e3b2719f797227e54ddc/matplotlib-3.7.5-cp310-cp310-win_amd64.whl", hash = "sha256:f098ffbaab9df1e3ef04e5a5586a1e6b1791380698e84938d8640961c79b1fc0", size = 7506405, upload-time = "2024-02-16T10:48:32.499Z" }, + { url = "https://files.pythonhosted.org/packages/5e/c6/45d0485e59d70b7a6a81eade5d0aed548b42cc65658c0ce0f813b9249165/matplotlib-3.7.5-cp311-cp311-macosx_10_12_universal2.whl", hash = "sha256:f65342c147572673f02a4abec2d5a23ad9c3898167df9b47c149f32ce61ca078", size = 8325506, upload-time = "2024-02-16T10:48:36.192Z" }, + { url = "https://files.pythonhosted.org/packages/0e/0a/83bd8589f3597745f624fbcc7da1140088b2f4160ca51c71553c561d0df5/matplotlib-3.7.5-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:4ddf7fc0e0dc553891a117aa083039088d8a07686d4c93fb8a810adca68810af", size = 7439905, upload-time = "2024-02-16T10:48:38.951Z" }, + { url = "https://files.pythonhosted.org/packages/84/c1/a7705b24f8f9b4d7ceea0002c13bae50cf9423f299f56d8c47a5cd2627d2/matplotlib-3.7.5-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:0ccb830fc29442360d91be48527809f23a5dcaee8da5f4d9b2d5b867c1b087b8", size = 7342895, upload-time = "2024-02-16T10:48:41.61Z" }, + { url = "https://files.pythonhosted.org/packages/94/6e/55d7d8310c96a7459c883aa4be3f5a9338a108278484cbd5c95d480d1cef/matplotlib-3.7.5-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:efc6bb28178e844d1f408dd4d6341ee8a2e906fc9e0fa3dae497da4e0cab775d", size = 11358830, upload-time = "2024-02-16T10:48:44.984Z" }, + { url = "https://files.pythonhosted.org/packages/55/57/3b36afe104216db1cf2f3889c394b403ea87eda77c4815227c9524462ba8/matplotlib-3.7.5-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3b15c4c2d374f249f324f46e883340d494c01768dd5287f8bc00b65b625ab56c", size = 11462575, upload-time = "2024-02-16T10:48:48.437Z" }, + { url = "https://files.pythonhosted.org/packages/f3/0b/fabcf5f66b12fab5c4110d06a6c0fed875c7e63bc446403f58f9dadc9999/matplotlib-3.7.5-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3d028555421912307845e59e3de328260b26d055c5dac9b182cc9783854e98fb", size = 11584280, upload-time = "2024-02-16T10:48:53.022Z" }, + { url = "https://files.pythonhosted.org/packages/47/a9/1ad7df27a9da70b62109584632f83fe6ef45774701199c44d5777107c240/matplotlib-3.7.5-cp311-cp311-win32.whl", hash = "sha256:fe184b4625b4052fa88ef350b815559dd90cc6cc8e97b62f966e1ca84074aafa", size = 7340429, upload-time = "2024-02-16T10:48:56.505Z" }, + { url = "https://files.pythonhosted.org/packages/e3/b1/1b6c34b89173d6c206dc5a4028e8518b4dfee3569c13bdc0c88d0486cae7/matplotlib-3.7.5-cp311-cp311-win_amd64.whl", hash = "sha256:084f1f0f2f1010868c6f1f50b4e1c6f2fb201c58475494f1e5b66fed66093647", size = 7507112, upload-time = "2024-02-16T10:48:59.659Z" }, + { url = "https://files.pythonhosted.org/packages/75/dc/4e341a3ef36f3e7321aec0741317f12c7a23264be708a97972bf018c34af/matplotlib-3.7.5-cp312-cp312-macosx_10_12_universal2.whl", hash = "sha256:34bceb9d8ddb142055ff27cd7135f539f2f01be2ce0bafbace4117abe58f8fe4", size = 8323797, upload-time = "2024-02-16T10:49:02.872Z" }, + { url = "https://files.pythonhosted.org/packages/af/83/bbb482d678362ceb68cc59ec4fc705dde636025969361dac77be868541ef/matplotlib-3.7.5-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:c5a2134162273eb8cdfd320ae907bf84d171de948e62180fa372a3ca7cf0f433", size = 7439549, upload-time = "2024-02-16T10:49:05.743Z" }, + { url = "https://files.pythonhosted.org/packages/1a/ee/e49a92d9e369b2b9e4373894171cb4e641771cd7f81bde1d8b6fb8c60842/matplotlib-3.7.5-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:039ad54683a814002ff37bf7981aa1faa40b91f4ff84149beb53d1eb64617980", size = 7341788, upload-time = "2024-02-16T10:49:09.143Z" }, + { url = "https://files.pythonhosted.org/packages/48/79/89cb2fc5ddcfc3d440a739df04dbe6e4e72b1153d1ebd32b45d42eb71d27/matplotlib-3.7.5-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4d742ccd1b09e863b4ca58291728db645b51dab343eebb08d5d4b31b308296ce", size = 11356329, upload-time = "2024-02-16T10:49:12.156Z" }, + { url = "https://files.pythonhosted.org/packages/ff/25/84f181cdae5c9eba6fd1c2c35642aec47233425fe3b0d6fccdb323fb36e0/matplotlib-3.7.5-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:743b1c488ca6a2bc7f56079d282e44d236bf375968bfd1b7ba701fd4d0fa32d6", size = 11577813, upload-time = "2024-02-16T10:49:15.986Z" }, + { url = "https://files.pythonhosted.org/packages/9f/24/b2db065d40e58033b3350222fb8bbb0ffcb834029df9c1f9349dd9c7dd45/matplotlib-3.7.5-cp312-cp312-win_amd64.whl", hash = "sha256:fbf730fca3e1f23713bc1fae0a57db386e39dc81ea57dc305c67f628c1d7a342", size = 7507667, upload-time = "2024-02-16T10:49:19.6Z" }, + { url = "https://files.pythonhosted.org/packages/e3/72/50a38c8fd5dc845b06f8e71c9da802db44b81baabf4af8be78bb8a5622ea/matplotlib-3.7.5-cp38-cp38-macosx_10_12_universal2.whl", hash = "sha256:cfff9b838531698ee40e40ea1a8a9dc2c01edb400b27d38de6ba44c1f9a8e3d2", size = 8322659, upload-time = "2024-02-16T10:49:23.206Z" }, + { url = "https://files.pythonhosted.org/packages/b1/ea/129163dcd21db6da5d559a8160c4a74c1dc5f96ac246a3d4248b43c7648d/matplotlib-3.7.5-cp38-cp38-macosx_10_12_x86_64.whl", hash = "sha256:1dbcca4508bca7847fe2d64a05b237a3dcaec1f959aedb756d5b1c67b770c5ee", size = 7438408, upload-time = "2024-02-16T10:49:27.462Z" }, + { url = "https://files.pythonhosted.org/packages/aa/59/4d13e5b6298b1ca5525eea8c68d3806ae93ab6d0bb17ca9846aa3156b92b/matplotlib-3.7.5-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:4cdf4ef46c2a1609a50411b66940b31778db1e4b73d4ecc2eaa40bd588979b13", size = 7341782, upload-time = "2024-02-16T10:49:32.173Z" }, + { url = "https://files.pythonhosted.org/packages/9e/c4/f562df04b08487731743511ff274ae5d31dce2ff3e5621f8b070d20ab54a/matplotlib-3.7.5-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:167200ccfefd1674b60e957186dfd9baf58b324562ad1a28e5d0a6b3bea77905", size = 9196487, upload-time = "2024-02-16T10:49:37.971Z" }, + { url = "https://files.pythonhosted.org/packages/30/33/cc27211d2ffeee4fd7402dca137b6e8a83f6dcae3d4be8d0ad5068555561/matplotlib-3.7.5-cp38-cp38-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:53e64522934df6e1818b25fd48cf3b645b11740d78e6ef765fbb5fa5ce080d02", size = 9213051, upload-time = "2024-02-16T10:49:43.916Z" }, + { url = "https://files.pythonhosted.org/packages/9b/9d/8bd37c86b79312c9dbcfa379dec32303f9b38e8456e0829d7e666a0e0a05/matplotlib-3.7.5-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d3e3bc79b2d7d615067bd010caff9243ead1fc95cf735c16e4b2583173f717eb", size = 11370807, upload-time = "2024-02-16T10:49:47.701Z" }, + { url = "https://files.pythonhosted.org/packages/c0/1e/b24a07a849c8d458f1b3724f49029f0dedf748bdedb4d5f69491314838b6/matplotlib-3.7.5-cp38-cp38-win32.whl", hash = "sha256:6b641b48c6819726ed47c55835cdd330e53747d4efff574109fd79b2d8a13748", size = 7340461, upload-time = "2024-02-16T10:49:51.597Z" }, + { url = "https://files.pythonhosted.org/packages/16/51/58b0b9de42fe1e665736d9286f88b5f1556a0e22bed8a71f468231761083/matplotlib-3.7.5-cp38-cp38-win_amd64.whl", hash = "sha256:f0b60993ed3488b4532ec6b697059897891927cbfc2b8d458a891b60ec03d9d7", size = 7507471, upload-time = "2024-02-16T10:49:54.353Z" }, + { url = "https://files.pythonhosted.org/packages/0d/00/17487e9e8949ca623af87f6c8767408efe7530b7e1f4d6897fa7fa940834/matplotlib-3.7.5-cp39-cp39-macosx_10_12_universal2.whl", hash = "sha256:090964d0afaff9c90e4d8de7836757e72ecfb252fb02884016d809239f715651", size = 8323175, upload-time = "2024-02-16T10:49:57.743Z" }, + { url = "https://files.pythonhosted.org/packages/6a/84/be0acd521fa9d6697657cf35878153f8009a42b4b75237aebc302559a8a9/matplotlib-3.7.5-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:9fc6fcfbc55cd719bc0bfa60bde248eb68cf43876d4c22864603bdd23962ba25", size = 7438737, upload-time = "2024-02-16T10:50:00.683Z" }, + { url = "https://files.pythonhosted.org/packages/17/39/175f36a6d68d0cf47a4fecbae9728048355df23c9feca8688f1476b198e6/matplotlib-3.7.5-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:5e7cc3078b019bb863752b8b60e8b269423000f1603cb2299608231996bd9d54", size = 7341916, upload-time = "2024-02-16T10:50:05.04Z" }, + { url = "https://files.pythonhosted.org/packages/36/c0/9a1c2a79f85c15d41b60877cbc333694ed80605e5c97a33880c4ecfd5bf1/matplotlib-3.7.5-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1e4e9a868e8163abaaa8259842d85f949a919e1ead17644fb77a60427c90473c", size = 11352264, upload-time = "2024-02-16T10:50:08.955Z" }, + { url = "https://files.pythonhosted.org/packages/a6/39/b0204e0e7a899b0676733366a55ccafa723799b719bc7f2e85e5ecde26a0/matplotlib-3.7.5-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:fa7ebc995a7d747dacf0a717d0eb3aa0f0c6a0e9ea88b0194d3a3cd241a1500f", size = 11454722, upload-time = "2024-02-16T10:50:13.231Z" }, + { url = "https://files.pythonhosted.org/packages/d8/39/64dd1d36c79e72e614977db338d180cf204cf658927c05a8ef2d47feb4c0/matplotlib-3.7.5-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3785bfd83b05fc0e0c2ae4c4a90034fe693ef96c679634756c50fe6efcc09856", size = 11576343, upload-time = "2024-02-16T10:50:17.626Z" }, + { url = "https://files.pythonhosted.org/packages/31/b4/e77bc11394d858bdf15e356980fceb4ac9604b0fa8212ef3ca4f1dc166b8/matplotlib-3.7.5-cp39-cp39-win32.whl", hash = "sha256:29b058738c104d0ca8806395f1c9089dfe4d4f0f78ea765c6c704469f3fffc81", size = 7340455, upload-time = "2024-02-16T10:50:21.448Z" }, + { url = "https://files.pythonhosted.org/packages/4a/84/081820c596b9555ecffc6819ee71f847f2fbb0d7c70a42c1eeaa54edf3e0/matplotlib-3.7.5-cp39-cp39-win_amd64.whl", hash = "sha256:fd4028d570fa4b31b7b165d4a685942ae9cdc669f33741e388c01857d9723eab", size = 7507711, upload-time = "2024-02-16T10:50:24.387Z" }, + { url = "https://files.pythonhosted.org/packages/27/6c/1bb10f3d6f337b9faa2e96a251bd87ba5fed85a608df95eb4d69acc109f0/matplotlib-3.7.5-pp38-pypy38_pp73-macosx_10_12_x86_64.whl", hash = "sha256:2a9a3f4d6a7f88a62a6a18c7e6a84aedcaf4faf0708b4ca46d87b19f1b526f88", size = 7397285, upload-time = "2024-02-16T10:50:27.375Z" }, + { url = "https://files.pythonhosted.org/packages/b2/36/66cfea213e9ba91cda9e257542c249ed235d49021af71c2e8007107d7d4c/matplotlib-3.7.5-pp38-pypy38_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b9b3fd853d4a7f008a938df909b96db0b454225f935d3917520305b90680579c", size = 7552612, upload-time = "2024-02-16T10:50:30.65Z" }, + { url = "https://files.pythonhosted.org/packages/77/df/16655199bf984c37c6a816b854bc032b56aef521aadc04f27928422f3c91/matplotlib-3.7.5-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f0ad550da9f160737d7890217c5eeed4337d07e83ca1b2ca6535078f354e7675", size = 7515564, upload-time = "2024-02-16T10:50:33.589Z" }, + { url = "https://files.pythonhosted.org/packages/5b/c8/3534c3705a677b71abb6be33609ba129fdeae2ea4e76b2fd3ab62c86fab3/matplotlib-3.7.5-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:20da7924a08306a861b3f2d1da0d1aa9a6678e480cf8eacffe18b565af2813e7", size = 7521336, upload-time = "2024-02-16T10:50:36.4Z" }, + { url = "https://files.pythonhosted.org/packages/20/a0/c5c0d410798b387ed3a177a5a7eba21055dd9c41d4b15bd0861241a5a60e/matplotlib-3.7.5-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:b45c9798ea6bb920cb77eb7306409756a7fab9db9b463e462618e0559aecb30e", size = 7397931, upload-time = "2024-02-16T10:50:39.477Z" }, + { url = "https://files.pythonhosted.org/packages/c3/2f/9e9509727d4c7d1b8e2c88e9330a97d54a1dd20bd316a0c8d2f8b38c4513/matplotlib-3.7.5-pp39-pypy39_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a99866267da1e561c7776fe12bf4442174b79aac1a47bd7e627c7e4d077ebd83", size = 7553224, upload-time = "2024-02-16T10:50:42.82Z" }, + { url = "https://files.pythonhosted.org/packages/89/0c/5f3e403dcf5c23799c92b0139dd00e41caf23983e9281f5bfeba3065e7d2/matplotlib-3.7.5-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2b6aa62adb6c268fc87d80f963aca39c64615c31830b02697743c95590ce3fbb", size = 7513250, upload-time = "2024-02-16T10:50:46.504Z" }, + { url = "https://files.pythonhosted.org/packages/87/e0/03eba0a8c3775ef910dbb3a287114a64c47abbcaeab2543c59957f155a86/matplotlib-3.7.5-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:e530ab6a0afd082d2e9c17eb1eb064a63c5b09bb607b2b74fa41adbe3e162286", size = 7521729, upload-time = "2024-02-16T10:50:50.063Z" }, +] + +[[package]] +name = "matplotlib" +version = "3.9.4" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version == '3.9.*'", +] +dependencies = [ + { name = "contourpy", version = "1.3.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version == '3.9.*'" }, + { name = "cycler", marker = "python_full_version == '3.9.*'" }, + { name = "fonttools", version = "4.60.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version == '3.9.*'" }, + { name = "importlib-resources", version = "6.5.2", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version == '3.9.*'" }, + { name = "kiwisolver", version = "1.4.7", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version == '3.9.*'" }, + { name = "numpy", version = "1.26.4", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version == '3.9.*'" }, + { name = "packaging", marker = "python_full_version == '3.9.*'" }, + { name = "pillow", version = "11.3.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version == '3.9.*'" }, + { name = "pyparsing", version = "3.2.5", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version == '3.9.*'" }, + { name = "python-dateutil", marker = "python_full_version == '3.9.*'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/df/17/1747b4154034befd0ed33b52538f5eb7752d05bb51c5e2a31470c3bc7d52/matplotlib-3.9.4.tar.gz", hash = "sha256:1e00e8be7393cbdc6fedfa8a6fba02cf3e83814b285db1c60b906a023ba41bc3", size = 36106529, upload-time = "2024-12-13T05:56:34.184Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/7e/94/27d2e2c30d54b56c7b764acc1874a909e34d1965a427fc7092bb6a588b63/matplotlib-3.9.4-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:c5fdd7abfb706dfa8d307af64a87f1a862879ec3cd8d0ec8637458f0885b9c50", size = 7885089, upload-time = "2024-12-13T05:54:24.224Z" }, + { url = "https://files.pythonhosted.org/packages/c6/25/828273307e40a68eb8e9df832b6b2aaad075864fdc1de4b1b81e40b09e48/matplotlib-3.9.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:d89bc4e85e40a71d1477780366c27fb7c6494d293e1617788986f74e2a03d7ff", size = 7770600, upload-time = "2024-12-13T05:54:27.214Z" }, + { url = "https://files.pythonhosted.org/packages/f2/65/f841a422ec994da5123368d76b126acf4fc02ea7459b6e37c4891b555b83/matplotlib-3.9.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ddf9f3c26aae695c5daafbf6b94e4c1a30d6cd617ba594bbbded3b33a1fcfa26", size = 8200138, upload-time = "2024-12-13T05:54:29.497Z" }, + { url = "https://files.pythonhosted.org/packages/07/06/272aca07a38804d93b6050813de41ca7ab0e29ba7a9dd098e12037c919a9/matplotlib-3.9.4-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:18ebcf248030173b59a868fda1fe42397253f6698995b55e81e1f57431d85e50", size = 8312711, upload-time = "2024-12-13T05:54:34.396Z" }, + { url = "https://files.pythonhosted.org/packages/98/37/f13e23b233c526b7e27ad61be0a771894a079e0f7494a10d8d81557e0e9a/matplotlib-3.9.4-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:974896ec43c672ec23f3f8c648981e8bc880ee163146e0312a9b8def2fac66f5", size = 9090622, upload-time = "2024-12-13T05:54:36.808Z" }, + { url = "https://files.pythonhosted.org/packages/4f/8c/b1f5bd2bd70e60f93b1b54c4d5ba7a992312021d0ddddf572f9a1a6d9348/matplotlib-3.9.4-cp310-cp310-win_amd64.whl", hash = "sha256:4598c394ae9711cec135639374e70871fa36b56afae17bdf032a345be552a88d", size = 7828211, upload-time = "2024-12-13T05:54:40.596Z" }, + { url = "https://files.pythonhosted.org/packages/74/4b/65be7959a8fa118a3929b49a842de5b78bb55475236fcf64f3e308ff74a0/matplotlib-3.9.4-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:d4dd29641d9fb8bc4492420c5480398dd40a09afd73aebe4eb9d0071a05fbe0c", size = 7894430, upload-time = "2024-12-13T05:54:44.049Z" }, + { url = "https://files.pythonhosted.org/packages/e9/18/80f70d91896e0a517b4a051c3fd540daa131630fd75e02e250365353b253/matplotlib-3.9.4-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:30e5b22e8bcfb95442bf7d48b0d7f3bdf4a450cbf68986ea45fca3d11ae9d099", size = 7780045, upload-time = "2024-12-13T05:54:46.414Z" }, + { url = "https://files.pythonhosted.org/packages/a2/73/ccb381026e3238c5c25c3609ba4157b2d1a617ec98d65a8b4ee4e1e74d02/matplotlib-3.9.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2bb0030d1d447fd56dcc23b4c64a26e44e898f0416276cac1ebc25522e0ac249", size = 8209906, upload-time = "2024-12-13T05:54:49.459Z" }, + { url = "https://files.pythonhosted.org/packages/ab/33/1648da77b74741c89f5ea95cbf42a291b4b364f2660b316318811404ed97/matplotlib-3.9.4-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:aca90ed222ac3565d2752b83dbb27627480d27662671e4d39da72e97f657a423", size = 8322873, upload-time = "2024-12-13T05:54:53.066Z" }, + { url = "https://files.pythonhosted.org/packages/57/d3/8447ba78bc6593c9044c372d1609f8ea10fb1e071e7a9e0747bea74fc16c/matplotlib-3.9.4-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:a181b2aa2906c608fcae72f977a4a2d76e385578939891b91c2550c39ecf361e", size = 9099566, upload-time = "2024-12-13T05:54:55.522Z" }, + { url = "https://files.pythonhosted.org/packages/23/e1/4f0e237bf349c02ff9d1b6e7109f1a17f745263809b9714a8576dc17752b/matplotlib-3.9.4-cp311-cp311-win_amd64.whl", hash = "sha256:1f6882828231eca17f501c4dcd98a05abb3f03d157fbc0769c6911fe08b6cfd3", size = 7838065, upload-time = "2024-12-13T05:54:58.337Z" }, + { url = "https://files.pythonhosted.org/packages/1a/2b/c918bf6c19d6445d1cefe3d2e42cb740fb997e14ab19d4daeb6a7ab8a157/matplotlib-3.9.4-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:dfc48d67e6661378a21c2983200a654b72b5c5cdbd5d2cf6e5e1ece860f0cc70", size = 7891131, upload-time = "2024-12-13T05:55:02.837Z" }, + { url = "https://files.pythonhosted.org/packages/c1/e5/b4e8fc601ca302afeeabf45f30e706a445c7979a180e3a978b78b2b681a4/matplotlib-3.9.4-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:47aef0fab8332d02d68e786eba8113ffd6f862182ea2999379dec9e237b7e483", size = 7776365, upload-time = "2024-12-13T05:55:05.158Z" }, + { url = "https://files.pythonhosted.org/packages/99/06/b991886c506506476e5d83625c5970c656a491b9f80161458fed94597808/matplotlib-3.9.4-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fba1f52c6b7dc764097f52fd9ab627b90db452c9feb653a59945de16752e965f", size = 8200707, upload-time = "2024-12-13T05:55:09.48Z" }, + { url = "https://files.pythonhosted.org/packages/c3/e2/556b627498cb27e61026f2d1ba86a78ad1b836fef0996bef5440e8bc9559/matplotlib-3.9.4-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:173ac3748acaac21afcc3fa1633924609ba1b87749006bc25051c52c422a5d00", size = 8313761, upload-time = "2024-12-13T05:55:12.95Z" }, + { url = "https://files.pythonhosted.org/packages/58/ff/165af33ec766ff818306ea88e91f9f60d2a6ed543be1eb122a98acbf3b0d/matplotlib-3.9.4-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:320edea0cadc07007765e33f878b13b3738ffa9745c5f707705692df70ffe0e0", size = 9095284, upload-time = "2024-12-13T05:55:16.199Z" }, + { url = "https://files.pythonhosted.org/packages/9f/8b/3d0c7a002db3b1ed702731c2a9a06d78d035f1f2fb0fb936a8e43cc1e9f4/matplotlib-3.9.4-cp312-cp312-win_amd64.whl", hash = "sha256:a4a4cfc82330b27042a7169533da7991e8789d180dd5b3daeaee57d75cd5a03b", size = 7841160, upload-time = "2024-12-13T05:55:19.991Z" }, + { url = "https://files.pythonhosted.org/packages/49/b1/999f89a7556d101b23a2f0b54f1b6e140d73f56804da1398f2f0bc0924bc/matplotlib-3.9.4-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:37eeffeeca3c940985b80f5b9a7b95ea35671e0e7405001f249848d2b62351b6", size = 7891499, upload-time = "2024-12-13T05:55:22.142Z" }, + { url = "https://files.pythonhosted.org/packages/87/7b/06a32b13a684977653396a1bfcd34d4e7539c5d55c8cbfaa8ae04d47e4a9/matplotlib-3.9.4-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:3e7465ac859ee4abcb0d836137cd8414e7bb7ad330d905abced457217d4f0f45", size = 7776802, upload-time = "2024-12-13T05:55:25.947Z" }, + { url = "https://files.pythonhosted.org/packages/65/87/ac498451aff739e515891bbb92e566f3c7ef31891aaa878402a71f9b0910/matplotlib-3.9.4-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f4c12302c34afa0cf061bea23b331e747e5e554b0fa595c96e01c7b75bc3b858", size = 8200802, upload-time = "2024-12-13T05:55:28.461Z" }, + { url = "https://files.pythonhosted.org/packages/f8/6b/9eb761c00e1cb838f6c92e5f25dcda3f56a87a52f6cb8fdfa561e6cf6a13/matplotlib-3.9.4-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2b8c97917f21b75e72108b97707ba3d48f171541a74aa2a56df7a40626bafc64", size = 8313880, upload-time = "2024-12-13T05:55:30.965Z" }, + { url = "https://files.pythonhosted.org/packages/d7/a2/c8eaa600e2085eec7e38cbbcc58a30fc78f8224939d31d3152bdafc01fd1/matplotlib-3.9.4-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:0229803bd7e19271b03cb09f27db76c918c467aa4ce2ae168171bc67c3f508df", size = 9094637, upload-time = "2024-12-13T05:55:33.701Z" }, + { url = "https://files.pythonhosted.org/packages/71/1f/c6e1daea55b7bfeb3d84c6cb1abc449f6a02b181e7e2a5e4db34c3afb793/matplotlib-3.9.4-cp313-cp313-win_amd64.whl", hash = "sha256:7c0d8ef442ebf56ff5e206f8083d08252ee738e04f3dc88ea882853a05488799", size = 7841311, upload-time = "2024-12-13T05:55:36.737Z" }, + { url = "https://files.pythonhosted.org/packages/c0/3a/2757d3f7d388b14dd48f5a83bea65b6d69f000e86b8f28f74d86e0d375bd/matplotlib-3.9.4-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:a04c3b00066a688834356d196136349cb32f5e1003c55ac419e91585168b88fb", size = 7919989, upload-time = "2024-12-13T05:55:39.024Z" }, + { url = "https://files.pythonhosted.org/packages/24/28/f5077c79a4f521589a37fe1062d6a6ea3534e068213f7357e7cfffc2e17a/matplotlib-3.9.4-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:04c519587f6c210626741a1e9a68eefc05966ede24205db8982841826af5871a", size = 7809417, upload-time = "2024-12-13T05:55:42.412Z" }, + { url = "https://files.pythonhosted.org/packages/36/c8/c523fd2963156692916a8eb7d4069084cf729359f7955cf09075deddfeaf/matplotlib-3.9.4-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:308afbf1a228b8b525fcd5cec17f246bbbb63b175a3ef6eb7b4d33287ca0cf0c", size = 8226258, upload-time = "2024-12-13T05:55:47.259Z" }, + { url = "https://files.pythonhosted.org/packages/f6/88/499bf4b8fa9349b6f5c0cf4cead0ebe5da9d67769129f1b5651e5ac51fbc/matplotlib-3.9.4-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ddb3b02246ddcffd3ce98e88fed5b238bc5faff10dbbaa42090ea13241d15764", size = 8335849, upload-time = "2024-12-13T05:55:49.763Z" }, + { url = "https://files.pythonhosted.org/packages/b8/9f/20a4156b9726188646a030774ee337d5ff695a965be45ce4dbcb9312c170/matplotlib-3.9.4-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:8a75287e9cb9eee48cb79ec1d806f75b29c0fde978cb7223a1f4c5848d696041", size = 9102152, upload-time = "2024-12-13T05:55:51.997Z" }, + { url = "https://files.pythonhosted.org/packages/10/11/237f9c3a4e8d810b1759b67ff2da7c32c04f9c80aa475e7beb36ed43a8fb/matplotlib-3.9.4-cp313-cp313t-win_amd64.whl", hash = "sha256:488deb7af140f0ba86da003e66e10d55ff915e152c78b4b66d231638400b1965", size = 7896987, upload-time = "2024-12-13T05:55:55.941Z" }, + { url = "https://files.pythonhosted.org/packages/56/eb/501b465c9fef28f158e414ea3a417913dc2ac748564c7ed41535f23445b4/matplotlib-3.9.4-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:3c3724d89a387ddf78ff88d2a30ca78ac2b4c89cf37f2db4bd453c34799e933c", size = 7885919, upload-time = "2024-12-13T05:55:59.66Z" }, + { url = "https://files.pythonhosted.org/packages/da/36/236fbd868b6c91309a5206bd90c3f881f4f44b2d997cd1d6239ef652f878/matplotlib-3.9.4-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:d5f0a8430ffe23d7e32cfd86445864ccad141797f7d25b7c41759a5b5d17cfd7", size = 7771486, upload-time = "2024-12-13T05:56:04.264Z" }, + { url = "https://files.pythonhosted.org/packages/e0/4b/105caf2d54d5ed11d9f4335398f5103001a03515f2126c936a752ccf1461/matplotlib-3.9.4-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6bb0141a21aef3b64b633dc4d16cbd5fc538b727e4958be82a0e1c92a234160e", size = 8201838, upload-time = "2024-12-13T05:56:06.792Z" }, + { url = "https://files.pythonhosted.org/packages/5d/a7/bb01188fb4013d34d274caf44a2f8091255b0497438e8b6c0a7c1710c692/matplotlib-3.9.4-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:57aa235109e9eed52e2c2949db17da185383fa71083c00c6c143a60e07e0888c", size = 8314492, upload-time = "2024-12-13T05:56:09.964Z" }, + { url = "https://files.pythonhosted.org/packages/33/19/02e1a37f7141fc605b193e927d0a9cdf9dc124a20b9e68793f4ffea19695/matplotlib-3.9.4-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:b18c600061477ccfdd1e6fd050c33d8be82431700f3452b297a56d9ed7037abb", size = 9092500, upload-time = "2024-12-13T05:56:13.55Z" }, + { url = "https://files.pythonhosted.org/packages/57/68/c2feb4667adbf882ffa4b3e0ac9967f848980d9f8b5bebd86644aa67ce6a/matplotlib-3.9.4-cp39-cp39-win_amd64.whl", hash = "sha256:ef5f2d1b67d2d2145ff75e10f8c008bfbf71d45137c4b648c87193e7dd053eac", size = 7822962, upload-time = "2024-12-13T05:56:16.358Z" }, + { url = "https://files.pythonhosted.org/packages/0c/22/2ef6a364cd3f565442b0b055e0599744f1e4314ec7326cdaaa48a4d864d7/matplotlib-3.9.4-pp39-pypy39_pp73-macosx_10_15_x86_64.whl", hash = "sha256:44e0ed786d769d85bc787b0606a53f2d8d2d1d3c8a2608237365e9121c1a338c", size = 7877995, upload-time = "2024-12-13T05:56:18.805Z" }, + { url = "https://files.pythonhosted.org/packages/87/b8/2737456e566e9f4d94ae76b8aa0d953d9acb847714f9a7ad80184474f5be/matplotlib-3.9.4-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:09debb9ce941eb23ecdbe7eab972b1c3e0276dcf01688073faff7b0f61d6c6ca", size = 7769300, upload-time = "2024-12-13T05:56:21.315Z" }, + { url = "https://files.pythonhosted.org/packages/b2/1f/e709c6ec7b5321e6568769baa288c7178e60a93a9da9e682b39450da0e29/matplotlib-3.9.4-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bcc53cf157a657bfd03afab14774d54ba73aa84d42cfe2480c91bd94873952db", size = 8313423, upload-time = "2024-12-13T05:56:26.719Z" }, + { url = "https://files.pythonhosted.org/packages/5e/b6/5a1f868782cd13f053a679984e222007ecff654a9bfbac6b27a65f4eeb05/matplotlib-3.9.4-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:ad45da51be7ad02387801fd154ef74d942f49fe3fcd26a64c94842ba7ec0d865", size = 7854624, upload-time = "2024-12-13T05:56:29.359Z" }, +] + +[[package]] +name = "matplotlib" +version = "3.10.7" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version >= '3.14'", + "python_full_version >= '3.11' and python_full_version < '3.14'", + "python_full_version == '3.10.*'", +] +dependencies = [ + { name = "contourpy", version = "1.3.2", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version == '3.10.*'" }, + { name = "contourpy", version = "1.3.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, + { name = "cycler", marker = "python_full_version >= '3.10'" }, + { name = "fonttools", version = "4.61.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.10'" }, + { name = "kiwisolver", version = "1.4.9", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.10'" }, + { name = "numpy", version = "1.26.4", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.10'" }, + { name = "packaging", marker = "python_full_version >= '3.10'" }, + { name = "pillow", version = "12.0.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.10'" }, + { name = "pyparsing", version = "3.2.5", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.10'" }, + { name = "python-dateutil", marker = "python_full_version >= '3.10'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/ae/e2/d2d5295be2f44c678ebaf3544ba32d20c1f9ef08c49fe47f496180e1db15/matplotlib-3.10.7.tar.gz", hash = "sha256:a06ba7e2a2ef9131c79c49e63dad355d2d878413a0376c1727c8b9335ff731c7", size = 34804865, upload-time = "2025-10-09T00:28:00.669Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/6c/87/3932d5778ab4c025db22710b61f49ccaed3956c5cf46ffb2ffa7492b06d9/matplotlib-3.10.7-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:7ac81eee3b7c266dd92cee1cd658407b16c57eed08c7421fa354ed68234de380", size = 8247141, upload-time = "2025-10-09T00:26:06.023Z" }, + { url = "https://files.pythonhosted.org/packages/45/a8/bfed45339160102bce21a44e38a358a1134a5f84c26166de03fb4a53208f/matplotlib-3.10.7-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:667ecd5d8d37813a845053d8f5bf110b534c3c9f30e69ebd25d4701385935a6d", size = 8107995, upload-time = "2025-10-09T00:26:08.669Z" }, + { url = "https://files.pythonhosted.org/packages/e2/3c/5692a2d9a5ba848fda3f48d2b607037df96460b941a59ef236404b39776b/matplotlib-3.10.7-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:cc1c51b846aca49a5a8b44fbba6a92d583a35c64590ad9e1e950dc88940a4297", size = 8680503, upload-time = "2025-10-09T00:26:10.607Z" }, + { url = "https://files.pythonhosted.org/packages/ab/a0/86ace53c48b05d0e6e9c127b2ace097434901f3e7b93f050791c8243201a/matplotlib-3.10.7-cp310-cp310-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:4a11c2e9e72e7de09b7b72e62f3df23317c888299c875e2b778abf1eda8c0a42", size = 9514982, upload-time = "2025-10-09T00:26:12.594Z" }, + { url = "https://files.pythonhosted.org/packages/a6/81/ead71e2824da8f72640a64166d10e62300df4ae4db01a0bac56c5b39fa51/matplotlib-3.10.7-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:f19410b486fdd139885ace124e57f938c1e6a3210ea13dd29cab58f5d4bc12c7", size = 9566429, upload-time = "2025-10-09T00:26:14.758Z" }, + { url = "https://files.pythonhosted.org/packages/65/7d/954b3067120456f472cce8fdcacaf4a5fcd522478db0c37bb243c7cb59dd/matplotlib-3.10.7-cp310-cp310-win_amd64.whl", hash = "sha256:b498e9e4022f93de2d5a37615200ca01297ceebbb56fe4c833f46862a490f9e3", size = 8108174, upload-time = "2025-10-09T00:26:17.015Z" }, + { url = "https://files.pythonhosted.org/packages/fc/bc/0fb489005669127ec13f51be0c6adc074d7cf191075dab1da9fe3b7a3cfc/matplotlib-3.10.7-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:53b492410a6cd66c7a471de6c924f6ede976e963c0f3097a3b7abfadddc67d0a", size = 8257507, upload-time = "2025-10-09T00:26:19.073Z" }, + { url = "https://files.pythonhosted.org/packages/e2/6a/d42588ad895279ff6708924645b5d2ed54a7fb2dc045c8a804e955aeace1/matplotlib-3.10.7-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:d9749313deb729f08207718d29c86246beb2ea3fdba753595b55901dee5d2fd6", size = 8119565, upload-time = "2025-10-09T00:26:21.023Z" }, + { url = "https://files.pythonhosted.org/packages/10/b7/4aa196155b4d846bd749cf82aa5a4c300cf55a8b5e0dfa5b722a63c0f8a0/matplotlib-3.10.7-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:2222c7ba2cbde7fe63032769f6eb7e83ab3227f47d997a8453377709b7fe3a5a", size = 8692668, upload-time = "2025-10-09T00:26:22.967Z" }, + { url = "https://files.pythonhosted.org/packages/e6/e7/664d2b97016f46683a02d854d730cfcf54ff92c1dafa424beebef50f831d/matplotlib-3.10.7-cp311-cp311-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:e91f61a064c92c307c5a9dc8c05dc9f8a68f0a3be199d9a002a0622e13f874a1", size = 9521051, upload-time = "2025-10-09T00:26:25.041Z" }, + { url = "https://files.pythonhosted.org/packages/a8/a3/37aef1404efa615f49b5758a5e0261c16dd88f389bc1861e722620e4a754/matplotlib-3.10.7-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:6f1851eab59ca082c95df5a500106bad73672645625e04538b3ad0f69471ffcc", size = 9576878, upload-time = "2025-10-09T00:26:27.478Z" }, + { url = "https://files.pythonhosted.org/packages/33/cd/b145f9797126f3f809d177ca378de57c45413c5099c5990de2658760594a/matplotlib-3.10.7-cp311-cp311-win_amd64.whl", hash = "sha256:6516ce375109c60ceec579e699524e9d504cd7578506f01150f7a6bc174a775e", size = 8115142, upload-time = "2025-10-09T00:26:29.774Z" }, + { url = "https://files.pythonhosted.org/packages/2e/39/63bca9d2b78455ed497fcf51a9c71df200a11048f48249038f06447fa947/matplotlib-3.10.7-cp311-cp311-win_arm64.whl", hash = "sha256:b172db79759f5f9bc13ef1c3ef8b9ee7b37b0247f987fbbbdaa15e4f87fd46a9", size = 7992439, upload-time = "2025-10-09T00:26:40.32Z" }, + { url = "https://files.pythonhosted.org/packages/be/b3/09eb0f7796932826ec20c25b517d568627754f6c6462fca19e12c02f2e12/matplotlib-3.10.7-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:7a0edb7209e21840e8361e91ea84ea676658aa93edd5f8762793dec77a4a6748", size = 8272389, upload-time = "2025-10-09T00:26:42.474Z" }, + { url = "https://files.pythonhosted.org/packages/11/0b/1ae80ddafb8652fd8046cb5c8460ecc8d4afccb89e2c6d6bec61e04e1eaf/matplotlib-3.10.7-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:c380371d3c23e0eadf8ebff114445b9f970aff2010198d498d4ab4c3b41eea4f", size = 8128247, upload-time = "2025-10-09T00:26:44.77Z" }, + { url = "https://files.pythonhosted.org/packages/7d/18/95ae2e242d4a5c98bd6e90e36e128d71cf1c7e39b0874feaed3ef782e789/matplotlib-3.10.7-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:d5f256d49fea31f40f166a5e3131235a5d2f4b7f44520b1cf0baf1ce568ccff0", size = 8696996, upload-time = "2025-10-09T00:26:46.792Z" }, + { url = "https://files.pythonhosted.org/packages/7e/3d/5b559efc800bd05cb2033aa85f7e13af51958136a48327f7c261801ff90a/matplotlib-3.10.7-cp312-cp312-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:11ae579ac83cdf3fb72573bb89f70e0534de05266728740d478f0f818983c695", size = 9530153, upload-time = "2025-10-09T00:26:49.07Z" }, + { url = "https://files.pythonhosted.org/packages/88/57/eab4a719fd110312d3c220595d63a3c85ec2a39723f0f4e7fa7e6e3f74ba/matplotlib-3.10.7-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:4c14b6acd16cddc3569a2d515cfdd81c7a68ac5639b76548cfc1a9e48b20eb65", size = 9593093, upload-time = "2025-10-09T00:26:51.067Z" }, + { url = "https://files.pythonhosted.org/packages/31/3c/80816f027b3a4a28cd2a0a6ef7f89a2db22310e945cd886ec25bfb399221/matplotlib-3.10.7-cp312-cp312-win_amd64.whl", hash = "sha256:0d8c32b7ea6fb80b1aeff5a2ceb3fb9778e2759e899d9beff75584714afcc5ee", size = 8122771, upload-time = "2025-10-09T00:26:53.296Z" }, + { url = "https://files.pythonhosted.org/packages/de/77/ef1fc78bfe99999b2675435cc52120887191c566b25017d78beaabef7f2d/matplotlib-3.10.7-cp312-cp312-win_arm64.whl", hash = "sha256:5f3f6d315dcc176ba7ca6e74c7768fb7e4cf566c49cb143f6bc257b62e634ed8", size = 7992812, upload-time = "2025-10-09T00:26:54.882Z" }, + { url = "https://files.pythonhosted.org/packages/02/9c/207547916a02c78f6bdd83448d9b21afbc42f6379ed887ecf610984f3b4e/matplotlib-3.10.7-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:1d9d3713a237970569156cfb4de7533b7c4eacdd61789726f444f96a0d28f57f", size = 8273212, upload-time = "2025-10-09T00:26:56.752Z" }, + { url = "https://files.pythonhosted.org/packages/bc/d0/b3d3338d467d3fc937f0bb7f256711395cae6f78e22cef0656159950adf0/matplotlib-3.10.7-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:37a1fea41153dd6ee061d21ab69c9cf2cf543160b1b85d89cd3d2e2a7902ca4c", size = 8128713, upload-time = "2025-10-09T00:26:59.001Z" }, + { url = "https://files.pythonhosted.org/packages/22/ff/6425bf5c20d79aa5b959d1ce9e65f599632345391381c9a104133fe0b171/matplotlib-3.10.7-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:b3c4ea4948d93c9c29dc01c0c23eef66f2101bf75158c291b88de6525c55c3d1", size = 8698527, upload-time = "2025-10-09T00:27:00.69Z" }, + { url = "https://files.pythonhosted.org/packages/d0/7f/ccdca06f4c2e6c7989270ed7829b8679466682f4cfc0f8c9986241c023b6/matplotlib-3.10.7-cp313-cp313-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:22df30ffaa89f6643206cf13877191c63a50e8f800b038bc39bee9d2d4957632", size = 9529690, upload-time = "2025-10-09T00:27:02.664Z" }, + { url = "https://files.pythonhosted.org/packages/b8/95/b80fc2c1f269f21ff3d193ca697358e24408c33ce2b106a7438a45407b63/matplotlib-3.10.7-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:b69676845a0a66f9da30e87f48be36734d6748024b525ec4710be40194282c84", size = 9593732, upload-time = "2025-10-09T00:27:04.653Z" }, + { url = "https://files.pythonhosted.org/packages/e1/b6/23064a96308b9aeceeffa65e96bcde459a2ea4934d311dee20afde7407a0/matplotlib-3.10.7-cp313-cp313-win_amd64.whl", hash = "sha256:744991e0cc863dd669c8dc9136ca4e6e0082be2070b9d793cbd64bec872a6815", size = 8122727, upload-time = "2025-10-09T00:27:06.814Z" }, + { url = "https://files.pythonhosted.org/packages/b3/a6/2faaf48133b82cf3607759027f82b5c702aa99cdfcefb7f93d6ccf26a424/matplotlib-3.10.7-cp313-cp313-win_arm64.whl", hash = "sha256:fba2974df0bf8ce3c995fa84b79cde38326e0f7b5409e7a3a481c1141340bcf7", size = 7992958, upload-time = "2025-10-09T00:27:08.567Z" }, + { url = "https://files.pythonhosted.org/packages/4a/f0/b018fed0b599bd48d84c08794cb242227fe3341952da102ee9d9682db574/matplotlib-3.10.7-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:932c55d1fa7af4423422cb6a492a31cbcbdbe68fd1a9a3f545aa5e7a143b5355", size = 8316849, upload-time = "2025-10-09T00:27:10.254Z" }, + { url = "https://files.pythonhosted.org/packages/b0/b7/bb4f23856197659f275e11a2a164e36e65e9b48ea3e93c4ec25b4f163198/matplotlib-3.10.7-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:5e38c2d581d62ee729a6e144c47a71b3f42fb4187508dbbf4fe71d5612c3433b", size = 8178225, upload-time = "2025-10-09T00:27:12.241Z" }, + { url = "https://files.pythonhosted.org/packages/62/56/0600609893ff277e6f3ab3c0cef4eafa6e61006c058e84286c467223d4d5/matplotlib-3.10.7-cp313-cp313t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:786656bb13c237bbcebcd402f65f44dd61ead60ee3deb045af429d889c8dbc67", size = 8711708, upload-time = "2025-10-09T00:27:13.879Z" }, + { url = "https://files.pythonhosted.org/packages/d8/1a/6bfecb0cafe94d6658f2f1af22c43b76cf7a1c2f0dc34ef84cbb6809617e/matplotlib-3.10.7-cp313-cp313t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:09d7945a70ea43bf9248f4b6582734c2fe726723204a76eca233f24cffc7ef67", size = 9541409, upload-time = "2025-10-09T00:27:15.684Z" }, + { url = "https://files.pythonhosted.org/packages/08/50/95122a407d7f2e446fd865e2388a232a23f2b81934960ea802f3171518e4/matplotlib-3.10.7-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:d0b181e9fa8daf1d9f2d4c547527b167cb8838fc587deabca7b5c01f97199e84", size = 9594054, upload-time = "2025-10-09T00:27:17.547Z" }, + { url = "https://files.pythonhosted.org/packages/13/76/75b194a43b81583478a81e78a07da8d9ca6ddf50dd0a2ccabf258059481d/matplotlib-3.10.7-cp313-cp313t-win_amd64.whl", hash = "sha256:31963603041634ce1a96053047b40961f7a29eb8f9a62e80cc2c0427aa1d22a2", size = 8200100, upload-time = "2025-10-09T00:27:20.039Z" }, + { url = "https://files.pythonhosted.org/packages/f5/9e/6aefebdc9f8235c12bdeeda44cc0383d89c1e41da2c400caf3ee2073a3ce/matplotlib-3.10.7-cp313-cp313t-win_arm64.whl", hash = "sha256:aebed7b50aa6ac698c90f60f854b47e48cd2252b30510e7a1feddaf5a3f72cbf", size = 8042131, upload-time = "2025-10-09T00:27:21.608Z" }, + { url = "https://files.pythonhosted.org/packages/0d/4b/e5bc2c321b6a7e3a75638d937d19ea267c34bd5a90e12bee76c4d7c7a0d9/matplotlib-3.10.7-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:d883460c43e8c6b173fef244a2341f7f7c0e9725c7fe68306e8e44ed9c8fb100", size = 8273787, upload-time = "2025-10-09T00:27:23.27Z" }, + { url = "https://files.pythonhosted.org/packages/86/ad/6efae459c56c2fbc404da154e13e3a6039129f3c942b0152624f1c621f05/matplotlib-3.10.7-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:07124afcf7a6504eafcb8ce94091c5898bbdd351519a1beb5c45f7a38c67e77f", size = 8131348, upload-time = "2025-10-09T00:27:24.926Z" }, + { url = "https://files.pythonhosted.org/packages/a6/5a/a4284d2958dee4116359cc05d7e19c057e64ece1b4ac986ab0f2f4d52d5a/matplotlib-3.10.7-cp314-cp314-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c17398b709a6cce3d9fdb1595c33e356d91c098cd9486cb2cc21ea2ea418e715", size = 9533949, upload-time = "2025-10-09T00:27:26.704Z" }, + { url = "https://files.pythonhosted.org/packages/de/ff/f3781b5057fa3786623ad8976fc9f7b0d02b2f28534751fd5a44240de4cf/matplotlib-3.10.7-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:7146d64f561498764561e9cd0ed64fcf582e570fc519e6f521e2d0cfd43365e1", size = 9804247, upload-time = "2025-10-09T00:27:28.514Z" }, + { url = "https://files.pythonhosted.org/packages/47/5a/993a59facb8444efb0e197bf55f545ee449902dcee86a4dfc580c3b61314/matplotlib-3.10.7-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:90ad854c0a435da3104c01e2c6f0028d7e719b690998a2333d7218db80950722", size = 9595497, upload-time = "2025-10-09T00:27:30.418Z" }, + { url = "https://files.pythonhosted.org/packages/0d/a5/77c95aaa9bb32c345cbb49626ad8eb15550cba2e6d4c88081a6c2ac7b08d/matplotlib-3.10.7-cp314-cp314-win_amd64.whl", hash = "sha256:4645fc5d9d20ffa3a39361fcdbcec731382763b623b72627806bf251b6388866", size = 8252732, upload-time = "2025-10-09T00:27:32.332Z" }, + { url = "https://files.pythonhosted.org/packages/74/04/45d269b4268d222390d7817dae77b159651909669a34ee9fdee336db5883/matplotlib-3.10.7-cp314-cp314-win_arm64.whl", hash = "sha256:9257be2f2a03415f9105c486d304a321168e61ad450f6153d77c69504ad764bb", size = 8124240, upload-time = "2025-10-09T00:27:33.94Z" }, + { url = "https://files.pythonhosted.org/packages/4b/c7/ca01c607bb827158b439208c153d6f14ddb9fb640768f06f7ca3488ae67b/matplotlib-3.10.7-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:1e4bbad66c177a8fdfa53972e5ef8be72a5f27e6a607cec0d8579abd0f3102b1", size = 8316938, upload-time = "2025-10-09T00:27:35.534Z" }, + { url = "https://files.pythonhosted.org/packages/84/d2/5539e66e9f56d2fdec94bb8436f5e449683b4e199bcc897c44fbe3c99e28/matplotlib-3.10.7-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:d8eb7194b084b12feb19142262165832fc6ee879b945491d1c3d4660748020c4", size = 8178245, upload-time = "2025-10-09T00:27:37.334Z" }, + { url = "https://files.pythonhosted.org/packages/77/b5/e6ca22901fd3e4fe433a82e583436dd872f6c966fca7e63cf806b40356f8/matplotlib-3.10.7-cp314-cp314t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b4d41379b05528091f00e1728004f9a8d7191260f3862178b88e8fd770206318", size = 9541411, upload-time = "2025-10-09T00:27:39.387Z" }, + { url = "https://files.pythonhosted.org/packages/9e/99/a4524db57cad8fee54b7237239a8f8360bfcfa3170d37c9e71c090c0f409/matplotlib-3.10.7-cp314-cp314t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:4a74f79fafb2e177f240579bc83f0b60f82cc47d2f1d260f422a0627207008ca", size = 9803664, upload-time = "2025-10-09T00:27:41.492Z" }, + { url = "https://files.pythonhosted.org/packages/e6/a5/85e2edf76ea0ad4288d174926d9454ea85f3ce5390cc4e6fab196cbf250b/matplotlib-3.10.7-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:702590829c30aada1e8cef0568ddbffa77ca747b4d6e36c6d173f66e301f89cc", size = 9594066, upload-time = "2025-10-09T00:27:43.694Z" }, + { url = "https://files.pythonhosted.org/packages/39/69/9684368a314f6d83fe5c5ad2a4121a3a8e03723d2e5c8ea17b66c1bad0e7/matplotlib-3.10.7-cp314-cp314t-win_amd64.whl", hash = "sha256:f79d5de970fc90cd5591f60053aecfce1fcd736e0303d9f0bf86be649fa68fb8", size = 8342832, upload-time = "2025-10-09T00:27:45.543Z" }, + { url = "https://files.pythonhosted.org/packages/04/5f/e22e08da14bc1a0894184640d47819d2338b792732e20d292bf86e5ab785/matplotlib-3.10.7-cp314-cp314t-win_arm64.whl", hash = "sha256:cb783436e47fcf82064baca52ce748af71725d0352e1d31564cbe9c95df92b9c", size = 8172585, upload-time = "2025-10-09T00:27:47.185Z" }, + { url = "https://files.pythonhosted.org/packages/1e/6c/a9bcf03e9afb2a873e0a5855f79bce476d1023f26f8212969f2b7504756c/matplotlib-3.10.7-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:5c09cf8f2793f81368f49f118b6f9f937456362bee282eac575cca7f84cda537", size = 8241204, upload-time = "2025-10-09T00:27:48.806Z" }, + { url = "https://files.pythonhosted.org/packages/5b/fd/0e6f5aa762ed689d9fa8750b08f1932628ffa7ed30e76423c399d19407d2/matplotlib-3.10.7-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:de66744b2bb88d5cd27e80dfc2ec9f0517d0a46d204ff98fe9e5f2864eb67657", size = 8104607, upload-time = "2025-10-09T00:27:50.876Z" }, + { url = "https://files.pythonhosted.org/packages/b9/a9/21c9439d698fac5f0de8fc68b2405b738ed1f00e1279c76f2d9aa5521ead/matplotlib-3.10.7-pp310-pypy310_pp73-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:53cc80662dd197ece414dd5b66e07370201515a3eaf52e7c518c68c16814773b", size = 8682257, upload-time = "2025-10-09T00:27:52.597Z" }, + { url = "https://files.pythonhosted.org/packages/58/8f/76d5dc21ac64a49e5498d7f0472c0781dae442dd266a67458baec38288ec/matplotlib-3.10.7-pp311-pypy311_pp73-macosx_10_15_x86_64.whl", hash = "sha256:15112bcbaef211bd663fa935ec33313b948e214454d949b723998a43357b17b0", size = 8252283, upload-time = "2025-10-09T00:27:54.739Z" }, + { url = "https://files.pythonhosted.org/packages/27/0d/9c5d4c2317feb31d819e38c9f947c942f42ebd4eb935fc6fd3518a11eaa7/matplotlib-3.10.7-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:d2a959c640cdeecdd2ec3136e8ea0441da59bcaf58d67e9c590740addba2cb68", size = 8116733, upload-time = "2025-10-09T00:27:56.406Z" }, + { url = "https://files.pythonhosted.org/packages/9a/cc/3fe688ff1355010937713164caacf9ed443675ac48a997bab6ed23b3f7c0/matplotlib-3.10.7-pp311-pypy311_pp73-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:3886e47f64611046bc1db523a09dd0a0a6bed6081e6f90e13806dd1d1d1b5e91", size = 8693919, upload-time = "2025-10-09T00:27:58.41Z" }, +] + +[[package]] +name = "matplotlib-inline" +version = "0.1.7" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version < '3.9'", +] +dependencies = [ + { name = "traitlets", marker = "python_full_version < '3.9'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/99/5b/a36a337438a14116b16480db471ad061c36c3694df7c2084a0da7ba538b7/matplotlib_inline-0.1.7.tar.gz", hash = "sha256:8423b23ec666be3d16e16b60bdd8ac4e86e840ebd1dd11a30b9f117f2fa0ab90", size = 8159, upload-time = "2024-04-15T13:44:44.803Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/8f/8e/9ad090d3553c280a8060fbf6e24dc1c0c29704ee7d1c372f0c174aa59285/matplotlib_inline-0.1.7-py3-none-any.whl", hash = "sha256:df192d39a4ff8f21b1895d72e6a13f5fcc5099f00fa84384e0ea28c2cc0653ca", size = 9899, upload-time = "2024-04-15T13:44:43.265Z" }, +] + +[[package]] +name = "matplotlib-inline" +version = "0.2.1" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version >= '3.14'", + "python_full_version >= '3.11' and python_full_version < '3.14'", + "python_full_version == '3.10.*'", + "python_full_version == '3.9.*'", +] +dependencies = [ + { name = "traitlets", marker = "python_full_version >= '3.9'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/c7/74/97e72a36efd4ae2bccb3463284300f8953f199b5ffbc04cbbb0ec78f74b1/matplotlib_inline-0.2.1.tar.gz", hash = "sha256:e1ee949c340d771fc39e241ea75683deb94762c8fa5f2927ec57c83c4dffa9fe", size = 8110, upload-time = "2025-10-23T09:00:22.126Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/af/33/ee4519fa02ed11a94aef9559552f3b17bb863f2ecfe1a35dc7f548cde231/matplotlib_inline-0.2.1-py3-none-any.whl", hash = "sha256:d56ce5156ba6085e00a9d54fead6ed29a9c47e215cd1bba2e976ef39f5710a76", size = 9516, upload-time = "2025-10-23T09:00:20.675Z" }, +] + +[[package]] +name = "mdit-py-plugins" +version = "0.4.2" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version == '3.9.*'", + "python_full_version < '3.9'", +] +dependencies = [ + { name = "markdown-it-py", marker = "python_full_version < '3.10'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/19/03/a2ecab526543b152300717cf232bb4bb8605b6edb946c845016fa9c9c9fd/mdit_py_plugins-0.4.2.tar.gz", hash = "sha256:5f2cd1fdb606ddf152d37ec30e46101a60512bc0e5fa1a7002c36647b09e26b5", size = 43542, upload-time = "2024-09-09T20:27:49.564Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/a7/f7/7782a043553ee469c1ff49cfa1cdace2d6bf99a1f333cf38676b3ddf30da/mdit_py_plugins-0.4.2-py3-none-any.whl", hash = "sha256:0c673c3f889399a33b95e88d2f0d111b4447bdfea7f237dab2d488f459835636", size = 55316, upload-time = "2024-09-09T20:27:48.397Z" }, +] + +[[package]] +name = "mdit-py-plugins" +version = "0.5.0" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version >= '3.14'", + "python_full_version >= '3.11' and python_full_version < '3.14'", + "python_full_version == '3.10.*'", +] +dependencies = [ + { name = "markdown-it-py", marker = "python_full_version >= '3.10'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/b2/fd/a756d36c0bfba5f6e39a1cdbdbfdd448dc02692467d83816dff4592a1ebc/mdit_py_plugins-0.5.0.tar.gz", hash = "sha256:f4918cb50119f50446560513a8e311d574ff6aaed72606ddae6d35716fe809c6", size = 44655, upload-time = "2025-08-11T07:25:49.083Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/fb/86/dd6e5db36df29e76c7a7699123569a4a18c1623ce68d826ed96c62643cae/mdit_py_plugins-0.5.0-py3-none-any.whl", hash = "sha256:07a08422fc1936a5d26d146759e9155ea466e842f5ab2f7d2266dd084c8dab1f", size = 57205, upload-time = "2025-08-11T07:25:47.597Z" }, +] + +[[package]] +name = "mdurl" +version = "0.1.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/d6/54/cfe61301667036ec958cb99bd3efefba235e65cdeb9c84d24a8293ba1d90/mdurl-0.1.2.tar.gz", hash = "sha256:bb413d29f5eea38f31dd4754dd7377d4465116fb207585f97bf925588687c1ba", size = 8729, upload-time = "2022-08-14T12:40:10.846Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/b3/38/89ba8ad64ae25be8de66a6d463314cf1eb366222074cfda9ee839c56a4b4/mdurl-0.1.2-py3-none-any.whl", hash = "sha256:84008a41e51615a49fc9966191ff91509e3c40b939176e643fd50a5c2196b8f8", size = 9979, upload-time = "2022-08-14T12:40:09.779Z" }, +] + +[[package]] +name = "mistune" +version = "3.1.4" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "typing-extensions", version = "4.13.2", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.9'" }, + { name = "typing-extensions", version = "4.15.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.9' and python_full_version < '3.11'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/d7/02/a7fb8b21d4d55ac93cdcde9d3638da5dd0ebdd3a4fed76c7725e10b81cbe/mistune-3.1.4.tar.gz", hash = "sha256:b5a7f801d389f724ec702840c11d8fc48f2b33519102fc7ee739e8177b672164", size = 94588, upload-time = "2025-08-29T07:20:43.594Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/7a/f0/8282d9641415e9e33df173516226b404d367a0fc55e1a60424a152913abc/mistune-3.1.4-py3-none-any.whl", hash = "sha256:93691da911e5d9d2e23bc54472892aff676df27a75274962ff9edc210364266d", size = 53481, upload-time = "2025-08-29T07:20:42.218Z" }, +] + +[[package]] +name = "more-itertools" +version = "10.5.0" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version < '3.9'", +] +sdist = { url = "https://files.pythonhosted.org/packages/51/78/65922308c4248e0eb08ebcbe67c95d48615cc6f27854b6f2e57143e9178f/more-itertools-10.5.0.tar.gz", hash = "sha256:5482bfef7849c25dc3c6dd53a6173ae4795da2a41a80faea6700d9f5846c5da6", size = 121020, upload-time = "2024-09-05T15:28:22.081Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/48/7e/3a64597054a70f7c86eb0a7d4fc315b8c1ab932f64883a297bdffeb5f967/more_itertools-10.5.0-py3-none-any.whl", hash = "sha256:037b0d3203ce90cca8ab1defbbdac29d5f993fc20131f3664dc8d6acfa872aef", size = 60952, upload-time = "2024-09-05T15:28:20.141Z" }, +] + +[[package]] +name = "more-itertools" +version = "10.8.0" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version >= '3.14'", + "python_full_version >= '3.11' and python_full_version < '3.14'", + "python_full_version == '3.10.*'", + "python_full_version == '3.9.*'", +] +sdist = { url = "https://files.pythonhosted.org/packages/ea/5d/38b681d3fce7a266dd9ab73c66959406d565b3e85f21d5e66e1181d93721/more_itertools-10.8.0.tar.gz", hash = "sha256:f638ddf8a1a0d134181275fb5d58b086ead7c6a72429ad725c67503f13ba30bd", size = 137431, upload-time = "2025-09-02T15:23:11.018Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/a4/8e/469e5a4a2f5855992e425f3cb33804cc07bf18d48f2db061aec61ce50270/more_itertools-10.8.0-py3-none-any.whl", hash = "sha256:52d4362373dcf7c52546bc4af9a86ee7c4579df9a8dc268be0a2f949d376cc9b", size = 69667, upload-time = "2025-09-02T15:23:09.635Z" }, +] + +[[package]] +name = "msgpack" +version = "1.1.1" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version < '3.9'", +] +sdist = { url = "https://files.pythonhosted.org/packages/45/b1/ea4f68038a18c77c9467400d166d74c4ffa536f34761f7983a104357e614/msgpack-1.1.1.tar.gz", hash = "sha256:77b79ce34a2bdab2594f490c8e80dd62a02d650b91a75159a63ec413b8d104cd", size = 173555, upload-time = "2025-06-13T06:52:51.324Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/33/52/f30da112c1dc92cf64f57d08a273ac771e7b29dea10b4b30369b2d7e8546/msgpack-1.1.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:353b6fc0c36fde68b661a12949d7d49f8f51ff5fa019c1e47c87c4ff34b080ed", size = 81799, upload-time = "2025-06-13T06:51:37.228Z" }, + { url = "https://files.pythonhosted.org/packages/e4/35/7bfc0def2f04ab4145f7f108e3563f9b4abae4ab0ed78a61f350518cc4d2/msgpack-1.1.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:79c408fcf76a958491b4e3b103d1c417044544b68e96d06432a189b43d1215c8", size = 78278, upload-time = "2025-06-13T06:51:38.534Z" }, + { url = "https://files.pythonhosted.org/packages/e8/c5/df5d6c1c39856bc55f800bf82778fd4c11370667f9b9e9d51b2f5da88f20/msgpack-1.1.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:78426096939c2c7482bf31ef15ca219a9e24460289c00dd0b94411040bb73ad2", size = 402805, upload-time = "2025-06-13T06:51:39.538Z" }, + { url = "https://files.pythonhosted.org/packages/20/8e/0bb8c977efecfe6ea7116e2ed73a78a8d32a947f94d272586cf02a9757db/msgpack-1.1.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8b17ba27727a36cb73aabacaa44b13090feb88a01d012c0f4be70c00f75048b4", size = 408642, upload-time = "2025-06-13T06:51:41.092Z" }, + { url = "https://files.pythonhosted.org/packages/59/a1/731d52c1aeec52006be6d1f8027c49fdc2cfc3ab7cbe7c28335b2910d7b6/msgpack-1.1.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7a17ac1ea6ec3c7687d70201cfda3b1e8061466f28f686c24f627cae4ea8efd0", size = 395143, upload-time = "2025-06-13T06:51:42.575Z" }, + { url = "https://files.pythonhosted.org/packages/2b/92/b42911c52cda2ba67a6418ffa7d08969edf2e760b09015593c8a8a27a97d/msgpack-1.1.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:88d1e966c9235c1d4e2afac21ca83933ba59537e2e2727a999bf3f515ca2af26", size = 395986, upload-time = "2025-06-13T06:51:43.807Z" }, + { url = "https://files.pythonhosted.org/packages/61/dc/8ae165337e70118d4dab651b8b562dd5066dd1e6dd57b038f32ebc3e2f07/msgpack-1.1.1-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:f6d58656842e1b2ddbe07f43f56b10a60f2ba5826164910968f5933e5178af75", size = 402682, upload-time = "2025-06-13T06:51:45.534Z" }, + { url = "https://files.pythonhosted.org/packages/58/27/555851cb98dcbd6ce041df1eacb25ac30646575e9cd125681aa2f4b1b6f1/msgpack-1.1.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:96decdfc4adcbc087f5ea7ebdcfd3dee9a13358cae6e81d54be962efc38f6338", size = 406368, upload-time = "2025-06-13T06:51:46.97Z" }, + { url = "https://files.pythonhosted.org/packages/d4/64/39a26add4ce16f24e99eabb9005e44c663db00e3fce17d4ae1ae9d61df99/msgpack-1.1.1-cp310-cp310-win32.whl", hash = "sha256:6640fd979ca9a212e4bcdf6eb74051ade2c690b862b679bfcb60ae46e6dc4bfd", size = 65004, upload-time = "2025-06-13T06:51:48.582Z" }, + { url = "https://files.pythonhosted.org/packages/7d/18/73dfa3e9d5d7450d39debde5b0d848139f7de23bd637a4506e36c9800fd6/msgpack-1.1.1-cp310-cp310-win_amd64.whl", hash = "sha256:8b65b53204fe1bd037c40c4148d00ef918eb2108d24c9aaa20bc31f9810ce0a8", size = 71548, upload-time = "2025-06-13T06:51:49.558Z" }, + { url = "https://files.pythonhosted.org/packages/7f/83/97f24bf9848af23fe2ba04380388216defc49a8af6da0c28cc636d722502/msgpack-1.1.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:71ef05c1726884e44f8b1d1773604ab5d4d17729d8491403a705e649116c9558", size = 82728, upload-time = "2025-06-13T06:51:50.68Z" }, + { url = "https://files.pythonhosted.org/packages/aa/7f/2eaa388267a78401f6e182662b08a588ef4f3de6f0eab1ec09736a7aaa2b/msgpack-1.1.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:36043272c6aede309d29d56851f8841ba907a1a3d04435e43e8a19928e243c1d", size = 79279, upload-time = "2025-06-13T06:51:51.72Z" }, + { url = "https://files.pythonhosted.org/packages/f8/46/31eb60f4452c96161e4dfd26dbca562b4ec68c72e4ad07d9566d7ea35e8a/msgpack-1.1.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a32747b1b39c3ac27d0670122b57e6e57f28eefb725e0b625618d1b59bf9d1e0", size = 423859, upload-time = "2025-06-13T06:51:52.749Z" }, + { url = "https://files.pythonhosted.org/packages/45/16/a20fa8c32825cc7ae8457fab45670c7a8996d7746ce80ce41cc51e3b2bd7/msgpack-1.1.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8a8b10fdb84a43e50d38057b06901ec9da52baac6983d3f709d8507f3889d43f", size = 429975, upload-time = "2025-06-13T06:51:53.97Z" }, + { url = "https://files.pythonhosted.org/packages/86/ea/6c958e07692367feeb1a1594d35e22b62f7f476f3c568b002a5ea09d443d/msgpack-1.1.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ba0c325c3f485dc54ec298d8b024e134acf07c10d494ffa24373bea729acf704", size = 413528, upload-time = "2025-06-13T06:51:55.507Z" }, + { url = "https://files.pythonhosted.org/packages/75/05/ac84063c5dae79722bda9f68b878dc31fc3059adb8633c79f1e82c2cd946/msgpack-1.1.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:88daaf7d146e48ec71212ce21109b66e06a98e5e44dca47d853cbfe171d6c8d2", size = 413338, upload-time = "2025-06-13T06:51:57.023Z" }, + { url = "https://files.pythonhosted.org/packages/69/e8/fe86b082c781d3e1c09ca0f4dacd457ede60a13119b6ce939efe2ea77b76/msgpack-1.1.1-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:d8b55ea20dc59b181d3f47103f113e6f28a5e1c89fd5b67b9140edb442ab67f2", size = 422658, upload-time = "2025-06-13T06:51:58.419Z" }, + { url = "https://files.pythonhosted.org/packages/3b/2b/bafc9924df52d8f3bb7c00d24e57be477f4d0f967c0a31ef5e2225e035c7/msgpack-1.1.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:4a28e8072ae9779f20427af07f53bbb8b4aa81151054e882aee333b158da8752", size = 427124, upload-time = "2025-06-13T06:51:59.969Z" }, + { url = "https://files.pythonhosted.org/packages/a2/3b/1f717e17e53e0ed0b68fa59e9188f3f610c79d7151f0e52ff3cd8eb6b2dc/msgpack-1.1.1-cp311-cp311-win32.whl", hash = "sha256:7da8831f9a0fdb526621ba09a281fadc58ea12701bc709e7b8cbc362feabc295", size = 65016, upload-time = "2025-06-13T06:52:01.294Z" }, + { url = "https://files.pythonhosted.org/packages/48/45/9d1780768d3b249accecc5a38c725eb1e203d44a191f7b7ff1941f7df60c/msgpack-1.1.1-cp311-cp311-win_amd64.whl", hash = "sha256:5fd1b58e1431008a57247d6e7cc4faa41c3607e8e7d4aaf81f7c29ea013cb458", size = 72267, upload-time = "2025-06-13T06:52:02.568Z" }, + { url = "https://files.pythonhosted.org/packages/e3/26/389b9c593eda2b8551b2e7126ad3a06af6f9b44274eb3a4f054d48ff7e47/msgpack-1.1.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:ae497b11f4c21558d95de9f64fff7053544f4d1a17731c866143ed6bb4591238", size = 82359, upload-time = "2025-06-13T06:52:03.909Z" }, + { url = "https://files.pythonhosted.org/packages/ab/65/7d1de38c8a22cf8b1551469159d4b6cf49be2126adc2482de50976084d78/msgpack-1.1.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:33be9ab121df9b6b461ff91baac6f2731f83d9b27ed948c5b9d1978ae28bf157", size = 79172, upload-time = "2025-06-13T06:52:05.246Z" }, + { url = "https://files.pythonhosted.org/packages/0f/bd/cacf208b64d9577a62c74b677e1ada005caa9b69a05a599889d6fc2ab20a/msgpack-1.1.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6f64ae8fe7ffba251fecb8408540c34ee9df1c26674c50c4544d72dbf792e5ce", size = 425013, upload-time = "2025-06-13T06:52:06.341Z" }, + { url = "https://files.pythonhosted.org/packages/4d/ec/fd869e2567cc9c01278a736cfd1697941ba0d4b81a43e0aa2e8d71dab208/msgpack-1.1.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a494554874691720ba5891c9b0b39474ba43ffb1aaf32a5dac874effb1619e1a", size = 426905, upload-time = "2025-06-13T06:52:07.501Z" }, + { url = "https://files.pythonhosted.org/packages/55/2a/35860f33229075bce803a5593d046d8b489d7ba2fc85701e714fc1aaf898/msgpack-1.1.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:cb643284ab0ed26f6957d969fe0dd8bb17beb567beb8998140b5e38a90974f6c", size = 407336, upload-time = "2025-06-13T06:52:09.047Z" }, + { url = "https://files.pythonhosted.org/packages/8c/16/69ed8f3ada150bf92745fb4921bd621fd2cdf5a42e25eb50bcc57a5328f0/msgpack-1.1.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:d275a9e3c81b1093c060c3837e580c37f47c51eca031f7b5fb76f7b8470f5f9b", size = 409485, upload-time = "2025-06-13T06:52:10.382Z" }, + { url = "https://files.pythonhosted.org/packages/c6/b6/0c398039e4c6d0b2e37c61d7e0e9d13439f91f780686deb8ee64ecf1ae71/msgpack-1.1.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:4fd6b577e4541676e0cc9ddc1709d25014d3ad9a66caa19962c4f5de30fc09ef", size = 412182, upload-time = "2025-06-13T06:52:11.644Z" }, + { url = "https://files.pythonhosted.org/packages/b8/d0/0cf4a6ecb9bc960d624c93effaeaae75cbf00b3bc4a54f35c8507273cda1/msgpack-1.1.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:bb29aaa613c0a1c40d1af111abf025f1732cab333f96f285d6a93b934738a68a", size = 419883, upload-time = "2025-06-13T06:52:12.806Z" }, + { url = "https://files.pythonhosted.org/packages/62/83/9697c211720fa71a2dfb632cad6196a8af3abea56eece220fde4674dc44b/msgpack-1.1.1-cp312-cp312-win32.whl", hash = "sha256:870b9a626280c86cff9c576ec0d9cbcc54a1e5ebda9cd26dab12baf41fee218c", size = 65406, upload-time = "2025-06-13T06:52:14.271Z" }, + { url = "https://files.pythonhosted.org/packages/c0/23/0abb886e80eab08f5e8c485d6f13924028602829f63b8f5fa25a06636628/msgpack-1.1.1-cp312-cp312-win_amd64.whl", hash = "sha256:5692095123007180dca3e788bb4c399cc26626da51629a31d40207cb262e67f4", size = 72558, upload-time = "2025-06-13T06:52:15.252Z" }, + { url = "https://files.pythonhosted.org/packages/a1/38/561f01cf3577430b59b340b51329803d3a5bf6a45864a55f4ef308ac11e3/msgpack-1.1.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:3765afa6bd4832fc11c3749be4ba4b69a0e8d7b728f78e68120a157a4c5d41f0", size = 81677, upload-time = "2025-06-13T06:52:16.64Z" }, + { url = "https://files.pythonhosted.org/packages/09/48/54a89579ea36b6ae0ee001cba8c61f776451fad3c9306cd80f5b5c55be87/msgpack-1.1.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:8ddb2bcfd1a8b9e431c8d6f4f7db0773084e107730ecf3472f1dfe9ad583f3d9", size = 78603, upload-time = "2025-06-13T06:52:17.843Z" }, + { url = "https://files.pythonhosted.org/packages/a0/60/daba2699b308e95ae792cdc2ef092a38eb5ee422f9d2fbd4101526d8a210/msgpack-1.1.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:196a736f0526a03653d829d7d4c5500a97eea3648aebfd4b6743875f28aa2af8", size = 420504, upload-time = "2025-06-13T06:52:18.982Z" }, + { url = "https://files.pythonhosted.org/packages/20/22/2ebae7ae43cd8f2debc35c631172ddf14e2a87ffcc04cf43ff9df9fff0d3/msgpack-1.1.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9d592d06e3cc2f537ceeeb23d38799c6ad83255289bb84c2e5792e5a8dea268a", size = 423749, upload-time = "2025-06-13T06:52:20.211Z" }, + { url = "https://files.pythonhosted.org/packages/40/1b/54c08dd5452427e1179a40b4b607e37e2664bca1c790c60c442c8e972e47/msgpack-1.1.1-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4df2311b0ce24f06ba253fda361f938dfecd7b961576f9be3f3fbd60e87130ac", size = 404458, upload-time = "2025-06-13T06:52:21.429Z" }, + { url = "https://files.pythonhosted.org/packages/2e/60/6bb17e9ffb080616a51f09928fdd5cac1353c9becc6c4a8abd4e57269a16/msgpack-1.1.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:e4141c5a32b5e37905b5940aacbc59739f036930367d7acce7a64e4dec1f5e0b", size = 405976, upload-time = "2025-06-13T06:52:22.995Z" }, + { url = "https://files.pythonhosted.org/packages/ee/97/88983e266572e8707c1f4b99c8fd04f9eb97b43f2db40e3172d87d8642db/msgpack-1.1.1-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:b1ce7f41670c5a69e1389420436f41385b1aa2504c3b0c30620764b15dded2e7", size = 408607, upload-time = "2025-06-13T06:52:24.152Z" }, + { url = "https://files.pythonhosted.org/packages/bc/66/36c78af2efaffcc15a5a61ae0df53a1d025f2680122e2a9eb8442fed3ae4/msgpack-1.1.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:4147151acabb9caed4e474c3344181e91ff7a388b888f1e19ea04f7e73dc7ad5", size = 424172, upload-time = "2025-06-13T06:52:25.704Z" }, + { url = "https://files.pythonhosted.org/packages/8c/87/a75eb622b555708fe0427fab96056d39d4c9892b0c784b3a721088c7ee37/msgpack-1.1.1-cp313-cp313-win32.whl", hash = "sha256:500e85823a27d6d9bba1d057c871b4210c1dd6fb01fbb764e37e4e8847376323", size = 65347, upload-time = "2025-06-13T06:52:26.846Z" }, + { url = "https://files.pythonhosted.org/packages/ca/91/7dc28d5e2a11a5ad804cf2b7f7a5fcb1eb5a4966d66a5d2b41aee6376543/msgpack-1.1.1-cp313-cp313-win_amd64.whl", hash = "sha256:6d489fba546295983abd142812bda76b57e33d0b9f5d5b71c09a583285506f69", size = 72341, upload-time = "2025-06-13T06:52:27.835Z" }, + { url = "https://files.pythonhosted.org/packages/bd/74/b0fcaec0cea3f104c61c646f49571864f12321de7b8705e98a32d29ba2ad/msgpack-1.1.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bba1be28247e68994355e028dcd668316db30c1f758d3241a7b903ac78dcd285", size = 409181, upload-time = "2025-06-13T06:52:28.835Z" }, + { url = "https://files.pythonhosted.org/packages/7e/a4/257806f574f8b4bfb76d428b2406cf4585d9f9b582887a0f466278bf0e2a/msgpack-1.1.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b8f93dcddb243159c9e4109c9750ba5b335ab8d48d9522c5308cd05d7e3ce600", size = 413772, upload-time = "2025-06-13T06:52:29.997Z" }, + { url = "https://files.pythonhosted.org/packages/96/17/46438f4848e86e2f481d46bd3f8b0b0405243b4125bac28ce86dc01e3aeb/msgpack-1.1.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2fbbc0b906a24038c9958a1ba7ae0918ad35b06cb449d398b76a7d08470b0ed9", size = 402772, upload-time = "2025-06-13T06:52:31.195Z" }, + { url = "https://files.pythonhosted.org/packages/1d/72/0ba95da893ddffb09975b4e81fd7b7e612aace0a42ce0d9bdd1a7d802cfe/msgpack-1.1.1-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:61e35a55a546a1690d9d09effaa436c25ae6130573b6ee9829c37ef0f18d5e78", size = 404650, upload-time = "2025-06-13T06:52:32.638Z" }, + { url = "https://files.pythonhosted.org/packages/85/d2/c849832b0c0bfb241efc830ccbe7fb880274bbdbc4780798b835f2cd7b3b/msgpack-1.1.1-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:1abfc6e949b352dadf4bce0eb78023212ec5ac42f6abfd469ce91d783c149c2a", size = 413595, upload-time = "2025-06-13T06:52:33.882Z" }, + { url = "https://files.pythonhosted.org/packages/03/79/ea7cda493ec78afb9bd4c88e3c8bf5bffabca78d1917d8b24cddd0b9f5ee/msgpack-1.1.1-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:996f2609ddf0142daba4cefd767d6db26958aac8439ee41db9cc0db9f4c4c3a6", size = 412830, upload-time = "2025-06-13T06:52:35.431Z" }, + { url = "https://files.pythonhosted.org/packages/e3/80/644311ca3064cfc9a9ecf64074e905e5359da730faefc88c6cfbbaf110ee/msgpack-1.1.1-cp38-cp38-win32.whl", hash = "sha256:4d3237b224b930d58e9d83c81c0dba7aacc20fcc2f89c1e5423aa0529a4cd142", size = 65439, upload-time = "2025-06-13T06:52:36.976Z" }, + { url = "https://files.pythonhosted.org/packages/ce/ec/27d4740fdeea71a7d559b405614b5d9b866028768a949e8dd58abed8474f/msgpack-1.1.1-cp38-cp38-win_amd64.whl", hash = "sha256:da8f41e602574ece93dbbda1fab24650d6bf2a24089f9e9dbb4f5730ec1e58ad", size = 72234, upload-time = "2025-06-13T06:52:37.966Z" }, + { url = "https://files.pythonhosted.org/packages/1f/bd/0792be119d7fe7dc2148689ef65c90507d82d20a204aab3b98c74a1f8684/msgpack-1.1.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:f5be6b6bc52fad84d010cb45433720327ce886009d862f46b26d4d154001994b", size = 81882, upload-time = "2025-06-13T06:52:39.316Z" }, + { url = "https://files.pythonhosted.org/packages/75/77/ce06c8e26a816ae8730a8e030d263c5289adcaff9f0476f9b270bdd7c5c2/msgpack-1.1.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:3a89cd8c087ea67e64844287ea52888239cbd2940884eafd2dcd25754fb72232", size = 78414, upload-time = "2025-06-13T06:52:40.341Z" }, + { url = "https://files.pythonhosted.org/packages/73/27/190576c497677fb4a0d05d896b24aea6cdccd910f206aaa7b511901befed/msgpack-1.1.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1d75f3807a9900a7d575d8d6674a3a47e9f227e8716256f35bc6f03fc597ffbf", size = 400927, upload-time = "2025-06-13T06:52:41.399Z" }, + { url = "https://files.pythonhosted.org/packages/ed/af/6a0aa5a06762e70726ec3c10fb966600d84a7220b52635cb0ab2dc64d32f/msgpack-1.1.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d182dac0221eb8faef2e6f44701812b467c02674a322c739355c39e94730cdbf", size = 405903, upload-time = "2025-06-13T06:52:42.699Z" }, + { url = "https://files.pythonhosted.org/packages/1e/80/3f3da358cecbbe8eb12360814bd1277d59d2608485934742a074d99894a9/msgpack-1.1.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1b13fe0fb4aac1aa5320cd693b297fe6fdef0e7bea5518cbc2dd5299f873ae90", size = 393192, upload-time = "2025-06-13T06:52:43.986Z" }, + { url = "https://files.pythonhosted.org/packages/98/c6/3a0ec7fdebbb4f3f8f254696cd91d491c29c501dbebd86286c17e8f68cd7/msgpack-1.1.1-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:435807eeb1bc791ceb3247d13c79868deb22184e1fc4224808750f0d7d1affc1", size = 393851, upload-time = "2025-06-13T06:52:45.177Z" }, + { url = "https://files.pythonhosted.org/packages/39/37/df50d5f8e68514b60fbe70f6e8337ea2b32ae2be030871bcd9d1cf7d4b62/msgpack-1.1.1-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:4835d17af722609a45e16037bb1d4d78b7bdf19d6c0128116d178956618c4e88", size = 400292, upload-time = "2025-06-13T06:52:46.381Z" }, + { url = "https://files.pythonhosted.org/packages/fc/ec/1e067292e02d2ceb4c8cb5ba222c4f7bb28730eef5676740609dc2627e0f/msgpack-1.1.1-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:a8ef6e342c137888ebbfb233e02b8fbd689bb5b5fcc59b34711ac47ebd504478", size = 401873, upload-time = "2025-06-13T06:52:47.957Z" }, + { url = "https://files.pythonhosted.org/packages/d3/31/e8c9c6b5b58d64c9efa99c8d181fcc25f38ead357b0360379fbc8a4234ad/msgpack-1.1.1-cp39-cp39-win32.whl", hash = "sha256:61abccf9de335d9efd149e2fff97ed5974f2481b3353772e8e2dd3402ba2bd57", size = 65028, upload-time = "2025-06-13T06:52:49.166Z" }, + { url = "https://files.pythonhosted.org/packages/20/d6/cd62cded572e5e25892747a5d27850170bcd03c855e9c69c538e024de6f9/msgpack-1.1.1-cp39-cp39-win_amd64.whl", hash = "sha256:40eae974c873b2992fd36424a5d9407f93e97656d999f43fca9d29f820899084", size = 71700, upload-time = "2025-06-13T06:52:50.244Z" }, +] + +[[package]] +name = "msgpack" +version = "1.1.2" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version >= '3.14'", + "python_full_version >= '3.11' and python_full_version < '3.14'", + "python_full_version == '3.10.*'", + "python_full_version == '3.9.*'", +] +sdist = { url = "https://files.pythonhosted.org/packages/4d/f2/bfb55a6236ed8725a96b0aa3acbd0ec17588e6a2c3b62a93eb513ed8783f/msgpack-1.1.2.tar.gz", hash = "sha256:3b60763c1373dd60f398488069bcdc703cd08a711477b5d480eecc9f9626f47e", size = 173581, upload-time = "2025-10-08T09:15:56.596Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/f5/a2/3b68a9e769db68668b25c6108444a35f9bd163bb848c0650d516761a59c0/msgpack-1.1.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:0051fffef5a37ca2cd16978ae4f0aef92f164df86823871b5162812bebecd8e2", size = 81318, upload-time = "2025-10-08T09:14:38.722Z" }, + { url = "https://files.pythonhosted.org/packages/5b/e1/2b720cc341325c00be44e1ed59e7cfeae2678329fbf5aa68f5bda57fe728/msgpack-1.1.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:a605409040f2da88676e9c9e5853b3449ba8011973616189ea5ee55ddbc5bc87", size = 83786, upload-time = "2025-10-08T09:14:40.082Z" }, + { url = "https://files.pythonhosted.org/packages/71/e5/c2241de64bfceac456b140737812a2ab310b10538a7b34a1d393b748e095/msgpack-1.1.2-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:8b696e83c9f1532b4af884045ba7f3aa741a63b2bc22617293a2c6a7c645f251", size = 398240, upload-time = "2025-10-08T09:14:41.151Z" }, + { url = "https://files.pythonhosted.org/packages/b7/09/2a06956383c0fdebaef5aa9246e2356776f12ea6f2a44bd1368abf0e46c4/msgpack-1.1.2-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:365c0bbe981a27d8932da71af63ef86acc59ed5c01ad929e09a0b88c6294e28a", size = 406070, upload-time = "2025-10-08T09:14:42.821Z" }, + { url = "https://files.pythonhosted.org/packages/0e/74/2957703f0e1ef20637d6aead4fbb314330c26f39aa046b348c7edcf6ca6b/msgpack-1.1.2-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:41d1a5d875680166d3ac5c38573896453bbbea7092936d2e107214daf43b1d4f", size = 393403, upload-time = "2025-10-08T09:14:44.38Z" }, + { url = "https://files.pythonhosted.org/packages/a5/09/3bfc12aa90f77b37322fc33e7a8a7c29ba7c8edeadfa27664451801b9860/msgpack-1.1.2-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:354e81bcdebaab427c3df4281187edc765d5d76bfb3a7c125af9da7a27e8458f", size = 398947, upload-time = "2025-10-08T09:14:45.56Z" }, + { url = "https://files.pythonhosted.org/packages/4b/4f/05fcebd3b4977cb3d840f7ef6b77c51f8582086de5e642f3fefee35c86fc/msgpack-1.1.2-cp310-cp310-win32.whl", hash = "sha256:e64c8d2f5e5d5fda7b842f55dec6133260ea8f53c4257d64494c534f306bf7a9", size = 64769, upload-time = "2025-10-08T09:14:47.334Z" }, + { url = "https://files.pythonhosted.org/packages/d0/3e/b4547e3a34210956382eed1c85935fff7e0f9b98be3106b3745d7dec9c5e/msgpack-1.1.2-cp310-cp310-win_amd64.whl", hash = "sha256:db6192777d943bdaaafb6ba66d44bf65aa0e9c5616fa1d2da9bb08828c6b39aa", size = 71293, upload-time = "2025-10-08T09:14:48.665Z" }, + { url = "https://files.pythonhosted.org/packages/2c/97/560d11202bcd537abca693fd85d81cebe2107ba17301de42b01ac1677b69/msgpack-1.1.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:2e86a607e558d22985d856948c12a3fa7b42efad264dca8a3ebbcfa2735d786c", size = 82271, upload-time = "2025-10-08T09:14:49.967Z" }, + { url = "https://files.pythonhosted.org/packages/83/04/28a41024ccbd67467380b6fb440ae916c1e4f25e2cd4c63abe6835ac566e/msgpack-1.1.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:283ae72fc89da59aa004ba147e8fc2f766647b1251500182fac0350d8af299c0", size = 84914, upload-time = "2025-10-08T09:14:50.958Z" }, + { url = "https://files.pythonhosted.org/packages/71/46/b817349db6886d79e57a966346cf0902a426375aadc1e8e7a86a75e22f19/msgpack-1.1.2-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:61c8aa3bd513d87c72ed0b37b53dd5c5a0f58f2ff9f26e1555d3bd7948fb7296", size = 416962, upload-time = "2025-10-08T09:14:51.997Z" }, + { url = "https://files.pythonhosted.org/packages/da/e0/6cc2e852837cd6086fe7d8406af4294e66827a60a4cf60b86575a4a65ca8/msgpack-1.1.2-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:454e29e186285d2ebe65be34629fa0e8605202c60fbc7c4c650ccd41870896ef", size = 426183, upload-time = "2025-10-08T09:14:53.477Z" }, + { url = "https://files.pythonhosted.org/packages/25/98/6a19f030b3d2ea906696cedd1eb251708e50a5891d0978b012cb6107234c/msgpack-1.1.2-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:7bc8813f88417599564fafa59fd6f95be417179f76b40325b500b3c98409757c", size = 411454, upload-time = "2025-10-08T09:14:54.648Z" }, + { url = "https://files.pythonhosted.org/packages/b7/cd/9098fcb6adb32187a70b7ecaabf6339da50553351558f37600e53a4a2a23/msgpack-1.1.2-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:bafca952dc13907bdfdedfc6a5f579bf4f292bdd506fadb38389afa3ac5b208e", size = 422341, upload-time = "2025-10-08T09:14:56.328Z" }, + { url = "https://files.pythonhosted.org/packages/e6/ae/270cecbcf36c1dc85ec086b33a51a4d7d08fc4f404bdbc15b582255d05ff/msgpack-1.1.2-cp311-cp311-win32.whl", hash = "sha256:602b6740e95ffc55bfb078172d279de3773d7b7db1f703b2f1323566b878b90e", size = 64747, upload-time = "2025-10-08T09:14:57.882Z" }, + { url = "https://files.pythonhosted.org/packages/2a/79/309d0e637f6f37e83c711f547308b91af02b72d2326ddd860b966080ef29/msgpack-1.1.2-cp311-cp311-win_amd64.whl", hash = "sha256:d198d275222dc54244bf3327eb8cbe00307d220241d9cec4d306d49a44e85f68", size = 71633, upload-time = "2025-10-08T09:14:59.177Z" }, + { url = "https://files.pythonhosted.org/packages/73/4d/7c4e2b3d9b1106cd0aa6cb56cc57c6267f59fa8bfab7d91df5adc802c847/msgpack-1.1.2-cp311-cp311-win_arm64.whl", hash = "sha256:86f8136dfa5c116365a8a651a7d7484b65b13339731dd6faebb9a0242151c406", size = 64755, upload-time = "2025-10-08T09:15:00.48Z" }, + { url = "https://files.pythonhosted.org/packages/ad/bd/8b0d01c756203fbab65d265859749860682ccd2a59594609aeec3a144efa/msgpack-1.1.2-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:70a0dff9d1f8da25179ffcf880e10cf1aad55fdb63cd59c9a49a1b82290062aa", size = 81939, upload-time = "2025-10-08T09:15:01.472Z" }, + { url = "https://files.pythonhosted.org/packages/34/68/ba4f155f793a74c1483d4bdef136e1023f7bcba557f0db4ef3db3c665cf1/msgpack-1.1.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:446abdd8b94b55c800ac34b102dffd2f6aa0ce643c55dfc017ad89347db3dbdb", size = 85064, upload-time = "2025-10-08T09:15:03.764Z" }, + { url = "https://files.pythonhosted.org/packages/f2/60/a064b0345fc36c4c3d2c743c82d9100c40388d77f0b48b2f04d6041dbec1/msgpack-1.1.2-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c63eea553c69ab05b6747901b97d620bb2a690633c77f23feb0c6a947a8a7b8f", size = 417131, upload-time = "2025-10-08T09:15:05.136Z" }, + { url = "https://files.pythonhosted.org/packages/65/92/a5100f7185a800a5d29f8d14041f61475b9de465ffcc0f3b9fba606e4505/msgpack-1.1.2-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:372839311ccf6bdaf39b00b61288e0557916c3729529b301c52c2d88842add42", size = 427556, upload-time = "2025-10-08T09:15:06.837Z" }, + { url = "https://files.pythonhosted.org/packages/f5/87/ffe21d1bf7d9991354ad93949286f643b2bb6ddbeab66373922b44c3b8cc/msgpack-1.1.2-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:2929af52106ca73fcb28576218476ffbb531a036c2adbcf54a3664de124303e9", size = 404920, upload-time = "2025-10-08T09:15:08.179Z" }, + { url = "https://files.pythonhosted.org/packages/ff/41/8543ed2b8604f7c0d89ce066f42007faac1eaa7d79a81555f206a5cdb889/msgpack-1.1.2-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:be52a8fc79e45b0364210eef5234a7cf8d330836d0a64dfbb878efa903d84620", size = 415013, upload-time = "2025-10-08T09:15:09.83Z" }, + { url = "https://files.pythonhosted.org/packages/41/0d/2ddfaa8b7e1cee6c490d46cb0a39742b19e2481600a7a0e96537e9c22f43/msgpack-1.1.2-cp312-cp312-win32.whl", hash = "sha256:1fff3d825d7859ac888b0fbda39a42d59193543920eda9d9bea44d958a878029", size = 65096, upload-time = "2025-10-08T09:15:11.11Z" }, + { url = "https://files.pythonhosted.org/packages/8c/ec/d431eb7941fb55a31dd6ca3404d41fbb52d99172df2e7707754488390910/msgpack-1.1.2-cp312-cp312-win_amd64.whl", hash = "sha256:1de460f0403172cff81169a30b9a92b260cb809c4cb7e2fc79ae8d0510c78b6b", size = 72708, upload-time = "2025-10-08T09:15:12.554Z" }, + { url = "https://files.pythonhosted.org/packages/c5/31/5b1a1f70eb0e87d1678e9624908f86317787b536060641d6798e3cf70ace/msgpack-1.1.2-cp312-cp312-win_arm64.whl", hash = "sha256:be5980f3ee0e6bd44f3a9e9dea01054f175b50c3e6cdb692bc9424c0bbb8bf69", size = 64119, upload-time = "2025-10-08T09:15:13.589Z" }, + { url = "https://files.pythonhosted.org/packages/6b/31/b46518ecc604d7edf3a4f94cb3bf021fc62aa301f0cb849936968164ef23/msgpack-1.1.2-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:4efd7b5979ccb539c221a4c4e16aac1a533efc97f3b759bb5a5ac9f6d10383bf", size = 81212, upload-time = "2025-10-08T09:15:14.552Z" }, + { url = "https://files.pythonhosted.org/packages/92/dc/c385f38f2c2433333345a82926c6bfa5ecfff3ef787201614317b58dd8be/msgpack-1.1.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:42eefe2c3e2af97ed470eec850facbe1b5ad1d6eacdbadc42ec98e7dcf68b4b7", size = 84315, upload-time = "2025-10-08T09:15:15.543Z" }, + { url = "https://files.pythonhosted.org/packages/d3/68/93180dce57f684a61a88a45ed13047558ded2be46f03acb8dec6d7c513af/msgpack-1.1.2-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:1fdf7d83102bf09e7ce3357de96c59b627395352a4024f6e2458501f158bf999", size = 412721, upload-time = "2025-10-08T09:15:16.567Z" }, + { url = "https://files.pythonhosted.org/packages/5d/ba/459f18c16f2b3fc1a1ca871f72f07d70c07bf768ad0a507a698b8052ac58/msgpack-1.1.2-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:fac4be746328f90caa3cd4bc67e6fe36ca2bf61d5c6eb6d895b6527e3f05071e", size = 424657, upload-time = "2025-10-08T09:15:17.825Z" }, + { url = "https://files.pythonhosted.org/packages/38/f8/4398c46863b093252fe67368b44edc6c13b17f4e6b0e4929dbf0bdb13f23/msgpack-1.1.2-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:fffee09044073e69f2bad787071aeec727183e7580443dfeb8556cbf1978d162", size = 402668, upload-time = "2025-10-08T09:15:19.003Z" }, + { url = "https://files.pythonhosted.org/packages/28/ce/698c1eff75626e4124b4d78e21cca0b4cc90043afb80a507626ea354ab52/msgpack-1.1.2-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:5928604de9b032bc17f5099496417f113c45bc6bc21b5c6920caf34b3c428794", size = 419040, upload-time = "2025-10-08T09:15:20.183Z" }, + { url = "https://files.pythonhosted.org/packages/67/32/f3cd1667028424fa7001d82e10ee35386eea1408b93d399b09fb0aa7875f/msgpack-1.1.2-cp313-cp313-win32.whl", hash = "sha256:a7787d353595c7c7e145e2331abf8b7ff1e6673a6b974ded96e6d4ec09f00c8c", size = 65037, upload-time = "2025-10-08T09:15:21.416Z" }, + { url = "https://files.pythonhosted.org/packages/74/07/1ed8277f8653c40ebc65985180b007879f6a836c525b3885dcc6448ae6cb/msgpack-1.1.2-cp313-cp313-win_amd64.whl", hash = "sha256:a465f0dceb8e13a487e54c07d04ae3ba131c7c5b95e2612596eafde1dccf64a9", size = 72631, upload-time = "2025-10-08T09:15:22.431Z" }, + { url = "https://files.pythonhosted.org/packages/e5/db/0314e4e2db56ebcf450f277904ffd84a7988b9e5da8d0d61ab2d057df2b6/msgpack-1.1.2-cp313-cp313-win_arm64.whl", hash = "sha256:e69b39f8c0aa5ec24b57737ebee40be647035158f14ed4b40e6f150077e21a84", size = 64118, upload-time = "2025-10-08T09:15:23.402Z" }, + { url = "https://files.pythonhosted.org/packages/22/71/201105712d0a2ff07b7873ed3c220292fb2ea5120603c00c4b634bcdafb3/msgpack-1.1.2-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:e23ce8d5f7aa6ea6d2a2b326b4ba46c985dbb204523759984430db7114f8aa00", size = 81127, upload-time = "2025-10-08T09:15:24.408Z" }, + { url = "https://files.pythonhosted.org/packages/1b/9f/38ff9e57a2eade7bf9dfee5eae17f39fc0e998658050279cbb14d97d36d9/msgpack-1.1.2-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:6c15b7d74c939ebe620dd8e559384be806204d73b4f9356320632d783d1f7939", size = 84981, upload-time = "2025-10-08T09:15:25.812Z" }, + { url = "https://files.pythonhosted.org/packages/8e/a9/3536e385167b88c2cc8f4424c49e28d49a6fc35206d4a8060f136e71f94c/msgpack-1.1.2-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:99e2cb7b9031568a2a5c73aa077180f93dd2e95b4f8d3b8e14a73ae94a9e667e", size = 411885, upload-time = "2025-10-08T09:15:27.22Z" }, + { url = "https://files.pythonhosted.org/packages/2f/40/dc34d1a8d5f1e51fc64640b62b191684da52ca469da9cd74e84936ffa4a6/msgpack-1.1.2-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:180759d89a057eab503cf62eeec0aa61c4ea1200dee709f3a8e9397dbb3b6931", size = 419658, upload-time = "2025-10-08T09:15:28.4Z" }, + { url = "https://files.pythonhosted.org/packages/3b/ef/2b92e286366500a09a67e03496ee8b8ba00562797a52f3c117aa2b29514b/msgpack-1.1.2-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:04fb995247a6e83830b62f0b07bf36540c213f6eac8e851166d8d86d83cbd014", size = 403290, upload-time = "2025-10-08T09:15:29.764Z" }, + { url = "https://files.pythonhosted.org/packages/78/90/e0ea7990abea5764e4655b8177aa7c63cdfa89945b6e7641055800f6c16b/msgpack-1.1.2-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:8e22ab046fa7ede9e36eeb4cfad44d46450f37bb05d5ec482b02868f451c95e2", size = 415234, upload-time = "2025-10-08T09:15:31.022Z" }, + { url = "https://files.pythonhosted.org/packages/72/4e/9390aed5db983a2310818cd7d3ec0aecad45e1f7007e0cda79c79507bb0d/msgpack-1.1.2-cp314-cp314-win32.whl", hash = "sha256:80a0ff7d4abf5fecb995fcf235d4064b9a9a8a40a3ab80999e6ac1e30b702717", size = 66391, upload-time = "2025-10-08T09:15:32.265Z" }, + { url = "https://files.pythonhosted.org/packages/6e/f1/abd09c2ae91228c5f3998dbd7f41353def9eac64253de3c8105efa2082f7/msgpack-1.1.2-cp314-cp314-win_amd64.whl", hash = "sha256:9ade919fac6a3e7260b7f64cea89df6bec59104987cbea34d34a2fa15d74310b", size = 73787, upload-time = "2025-10-08T09:15:33.219Z" }, + { url = "https://files.pythonhosted.org/packages/6a/b0/9d9f667ab48b16ad4115c1935d94023b82b3198064cb84a123e97f7466c1/msgpack-1.1.2-cp314-cp314-win_arm64.whl", hash = "sha256:59415c6076b1e30e563eb732e23b994a61c159cec44deaf584e5cc1dd662f2af", size = 66453, upload-time = "2025-10-08T09:15:34.225Z" }, + { url = "https://files.pythonhosted.org/packages/16/67/93f80545eb1792b61a217fa7f06d5e5cb9e0055bed867f43e2b8e012e137/msgpack-1.1.2-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:897c478140877e5307760b0ea66e0932738879e7aa68144d9b78ea4c8302a84a", size = 85264, upload-time = "2025-10-08T09:15:35.61Z" }, + { url = "https://files.pythonhosted.org/packages/87/1c/33c8a24959cf193966ef11a6f6a2995a65eb066bd681fd085afd519a57ce/msgpack-1.1.2-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:a668204fa43e6d02f89dbe79a30b0d67238d9ec4c5bd8a940fc3a004a47b721b", size = 89076, upload-time = "2025-10-08T09:15:36.619Z" }, + { url = "https://files.pythonhosted.org/packages/fc/6b/62e85ff7193663fbea5c0254ef32f0c77134b4059f8da89b958beb7696f3/msgpack-1.1.2-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:5559d03930d3aa0f3aacb4c42c776af1a2ace2611871c84a75afe436695e6245", size = 435242, upload-time = "2025-10-08T09:15:37.647Z" }, + { url = "https://files.pythonhosted.org/packages/c1/47/5c74ecb4cc277cf09f64e913947871682ffa82b3b93c8dad68083112f412/msgpack-1.1.2-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:70c5a7a9fea7f036b716191c29047374c10721c389c21e9ffafad04df8c52c90", size = 432509, upload-time = "2025-10-08T09:15:38.794Z" }, + { url = "https://files.pythonhosted.org/packages/24/a4/e98ccdb56dc4e98c929a3f150de1799831c0a800583cde9fa022fa90602d/msgpack-1.1.2-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:f2cb069d8b981abc72b41aea1c580ce92d57c673ec61af4c500153a626cb9e20", size = 415957, upload-time = "2025-10-08T09:15:40.238Z" }, + { url = "https://files.pythonhosted.org/packages/da/28/6951f7fb67bc0a4e184a6b38ab71a92d9ba58080b27a77d3e2fb0be5998f/msgpack-1.1.2-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:d62ce1f483f355f61adb5433ebfd8868c5f078d1a52d042b0a998682b4fa8c27", size = 422910, upload-time = "2025-10-08T09:15:41.505Z" }, + { url = "https://files.pythonhosted.org/packages/f0/03/42106dcded51f0a0b5284d3ce30a671e7bd3f7318d122b2ead66ad289fed/msgpack-1.1.2-cp314-cp314t-win32.whl", hash = "sha256:1d1418482b1ee984625d88aa9585db570180c286d942da463533b238b98b812b", size = 75197, upload-time = "2025-10-08T09:15:42.954Z" }, + { url = "https://files.pythonhosted.org/packages/15/86/d0071e94987f8db59d4eeb386ddc64d0bb9b10820a8d82bcd3e53eeb2da6/msgpack-1.1.2-cp314-cp314t-win_amd64.whl", hash = "sha256:5a46bf7e831d09470ad92dff02b8b1ac92175ca36b087f904a0519857c6be3ff", size = 85772, upload-time = "2025-10-08T09:15:43.954Z" }, + { url = "https://files.pythonhosted.org/packages/81/f2/08ace4142eb281c12701fc3b93a10795e4d4dc7f753911d836675050f886/msgpack-1.1.2-cp314-cp314t-win_arm64.whl", hash = "sha256:d99ef64f349d5ec3293688e91486c5fdb925ed03807f64d98d205d2713c60b46", size = 70868, upload-time = "2025-10-08T09:15:44.959Z" }, + { url = "https://files.pythonhosted.org/packages/46/73/85469b4aa71d25e5949fee50d3c2cf46f69cea619fe97cfe309058080f75/msgpack-1.1.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:ea5405c46e690122a76531ab97a079e184c0daf491e588592d6a23d3e32af99e", size = 81529, upload-time = "2025-10-08T09:15:46.069Z" }, + { url = "https://files.pythonhosted.org/packages/6c/3a/7d4077e8ae720b29d2b299a9591969f0d105146960681ea6f4121e6d0f8d/msgpack-1.1.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:9fba231af7a933400238cb357ecccf8ab5d51535ea95d94fc35b7806218ff844", size = 84106, upload-time = "2025-10-08T09:15:47.064Z" }, + { url = "https://files.pythonhosted.org/packages/df/c0/da451c74746ed9388dca1b4ec647c82945f4e2f8ce242c25fb7c0e12181f/msgpack-1.1.2-cp39-cp39-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:a8f6e7d30253714751aa0b0c84ae28948e852ee7fb0524082e6716769124bc23", size = 396656, upload-time = "2025-10-08T09:15:48.118Z" }, + { url = "https://files.pythonhosted.org/packages/e5/a1/20486c29a31ec9f0f88377fdf7eb7a67f30bcb5e0f89b7550f6f16d9373b/msgpack-1.1.2-cp39-cp39-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:94fd7dc7d8cb0a54432f296f2246bc39474e017204ca6f4ff345941d4ed285a7", size = 404722, upload-time = "2025-10-08T09:15:49.328Z" }, + { url = "https://files.pythonhosted.org/packages/ad/ae/e613b0a526d54ce85447d9665c2ff8c3210a784378d50573321d43d324b8/msgpack-1.1.2-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:350ad5353a467d9e3b126d8d1b90fe05ad081e2e1cef5753f8c345217c37e7b8", size = 391838, upload-time = "2025-10-08T09:15:50.517Z" }, + { url = "https://files.pythonhosted.org/packages/49/6a/07f3e10ed4503045b882ef7bf8512d01d8a9e25056950a977bd5f50df1c2/msgpack-1.1.2-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:6bde749afe671dc44893f8d08e83bf475a1a14570d67c4bb5cec5573463c8833", size = 397516, upload-time = "2025-10-08T09:15:51.646Z" }, + { url = "https://files.pythonhosted.org/packages/76/9b/a86828e75986c12a3809c1e5062f5eba8e0cae3dfa2bf724ed2b1bb72b4c/msgpack-1.1.2-cp39-cp39-win32.whl", hash = "sha256:ad09b984828d6b7bb52d1d1d0c9be68ad781fa004ca39216c8a1e63c0f34ba3c", size = 64863, upload-time = "2025-10-08T09:15:53.118Z" }, + { url = "https://files.pythonhosted.org/packages/14/a7/b1992b4fb3da3b413f5fb78a63bad42f256c3be2352eb69273c3789c2c96/msgpack-1.1.2-cp39-cp39-win_amd64.whl", hash = "sha256:67016ae8c8965124fdede9d3769528ad8284f14d635337ffa6a713a580f6c030", size = 71540, upload-time = "2025-10-08T09:15:55.573Z" }, +] + +[[package]] +name = "multidict" +version = "6.1.0" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version < '3.9'", +] +dependencies = [ + { name = "typing-extensions", version = "4.13.2", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.9'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/d6/be/504b89a5e9ca731cd47487e91c469064f8ae5af93b7259758dcfc2b9c848/multidict-6.1.0.tar.gz", hash = "sha256:22ae2ebf9b0c69d206c003e2f6a914ea33f0a932d4aa16f236afc049d9958f4a", size = 64002, upload-time = "2024-09-09T23:49:38.163Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/29/68/259dee7fd14cf56a17c554125e534f6274c2860159692a414d0b402b9a6d/multidict-6.1.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:3380252550e372e8511d49481bd836264c009adb826b23fefcc5dd3c69692f60", size = 48628, upload-time = "2024-09-09T23:47:18.278Z" }, + { url = "https://files.pythonhosted.org/packages/50/79/53ba256069fe5386a4a9e80d4e12857ced9de295baf3e20c68cdda746e04/multidict-6.1.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:99f826cbf970077383d7de805c0681799491cb939c25450b9b5b3ced03ca99f1", size = 29327, upload-time = "2024-09-09T23:47:20.224Z" }, + { url = "https://files.pythonhosted.org/packages/ff/10/71f1379b05b196dae749b5ac062e87273e3f11634f447ebac12a571d90ae/multidict-6.1.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:a114d03b938376557927ab23f1e950827c3b893ccb94b62fd95d430fd0e5cf53", size = 29689, upload-time = "2024-09-09T23:47:21.667Z" }, + { url = "https://files.pythonhosted.org/packages/71/45/70bac4f87438ded36ad4793793c0095de6572d433d98575a5752629ef549/multidict-6.1.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b1c416351ee6271b2f49b56ad7f308072f6f44b37118d69c2cad94f3fa8a40d5", size = 126639, upload-time = "2024-09-09T23:47:23.333Z" }, + { url = "https://files.pythonhosted.org/packages/80/cf/17f35b3b9509b4959303c05379c4bfb0d7dd05c3306039fc79cf035bbac0/multidict-6.1.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:6b5d83030255983181005e6cfbac1617ce9746b219bc2aad52201ad121226581", size = 134315, upload-time = "2024-09-09T23:47:24.99Z" }, + { url = "https://files.pythonhosted.org/packages/ef/1f/652d70ab5effb33c031510a3503d4d6efc5ec93153562f1ee0acdc895a57/multidict-6.1.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3e97b5e938051226dc025ec80980c285b053ffb1e25a3db2a3aa3bc046bf7f56", size = 129471, upload-time = "2024-09-09T23:47:26.305Z" }, + { url = "https://files.pythonhosted.org/packages/a6/64/2dd6c4c681688c0165dea3975a6a4eab4944ea30f35000f8b8af1df3148c/multidict-6.1.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d618649d4e70ac6efcbba75be98b26ef5078faad23592f9b51ca492953012429", size = 124585, upload-time = "2024-09-09T23:47:27.958Z" }, + { url = "https://files.pythonhosted.org/packages/87/56/e6ee5459894c7e554b57ba88f7257dc3c3d2d379cb15baaa1e265b8c6165/multidict-6.1.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:10524ebd769727ac77ef2278390fb0068d83f3acb7773792a5080f2b0abf7748", size = 116957, upload-time = "2024-09-09T23:47:29.376Z" }, + { url = "https://files.pythonhosted.org/packages/36/9e/616ce5e8d375c24b84f14fc263c7ef1d8d5e8ef529dbc0f1df8ce71bb5b8/multidict-6.1.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:ff3827aef427c89a25cc96ded1759271a93603aba9fb977a6d264648ebf989db", size = 128609, upload-time = "2024-09-09T23:47:31.038Z" }, + { url = "https://files.pythonhosted.org/packages/8c/4f/4783e48a38495d000f2124020dc96bacc806a4340345211b1ab6175a6cb4/multidict-6.1.0-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:06809f4f0f7ab7ea2cabf9caca7d79c22c0758b58a71f9d32943ae13c7ace056", size = 123016, upload-time = "2024-09-09T23:47:32.47Z" }, + { url = "https://files.pythonhosted.org/packages/3e/b3/4950551ab8fc39862ba5e9907dc821f896aa829b4524b4deefd3e12945ab/multidict-6.1.0-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:f179dee3b863ab1c59580ff60f9d99f632f34ccb38bf67a33ec6b3ecadd0fd76", size = 133542, upload-time = "2024-09-09T23:47:34.103Z" }, + { url = "https://files.pythonhosted.org/packages/96/4d/f0ce6ac9914168a2a71df117935bb1f1781916acdecbb43285e225b484b8/multidict-6.1.0-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:aaed8b0562be4a0876ee3b6946f6869b7bcdb571a5d1496683505944e268b160", size = 130163, upload-time = "2024-09-09T23:47:35.716Z" }, + { url = "https://files.pythonhosted.org/packages/be/72/17c9f67e7542a49dd252c5ae50248607dfb780bcc03035907dafefb067e3/multidict-6.1.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:3c8b88a2ccf5493b6c8da9076fb151ba106960a2df90c2633f342f120751a9e7", size = 126832, upload-time = "2024-09-09T23:47:37.116Z" }, + { url = "https://files.pythonhosted.org/packages/71/9f/72d719e248cbd755c8736c6d14780533a1606ffb3fbb0fbd77da9f0372da/multidict-6.1.0-cp310-cp310-win32.whl", hash = "sha256:4a9cb68166a34117d6646c0023c7b759bf197bee5ad4272f420a0141d7eb03a0", size = 26402, upload-time = "2024-09-09T23:47:38.863Z" }, + { url = "https://files.pythonhosted.org/packages/04/5a/d88cd5d00a184e1ddffc82aa2e6e915164a6d2641ed3606e766b5d2f275a/multidict-6.1.0-cp310-cp310-win_amd64.whl", hash = "sha256:20b9b5fbe0b88d0bdef2012ef7dee867f874b72528cf1d08f1d59b0e3850129d", size = 28800, upload-time = "2024-09-09T23:47:40.056Z" }, + { url = "https://files.pythonhosted.org/packages/93/13/df3505a46d0cd08428e4c8169a196131d1b0c4b515c3649829258843dde6/multidict-6.1.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:3efe2c2cb5763f2f1b275ad2bf7a287d3f7ebbef35648a9726e3b69284a4f3d6", size = 48570, upload-time = "2024-09-09T23:47:41.36Z" }, + { url = "https://files.pythonhosted.org/packages/f0/e1/a215908bfae1343cdb72f805366592bdd60487b4232d039c437fe8f5013d/multidict-6.1.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:c7053d3b0353a8b9de430a4f4b4268ac9a4fb3481af37dfe49825bf45ca24156", size = 29316, upload-time = "2024-09-09T23:47:42.612Z" }, + { url = "https://files.pythonhosted.org/packages/70/0f/6dc70ddf5d442702ed74f298d69977f904960b82368532c88e854b79f72b/multidict-6.1.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:27e5fc84ccef8dfaabb09d82b7d179c7cf1a3fbc8a966f8274fcb4ab2eb4cadb", size = 29640, upload-time = "2024-09-09T23:47:44.028Z" }, + { url = "https://files.pythonhosted.org/packages/d8/6d/9c87b73a13d1cdea30b321ef4b3824449866bd7f7127eceed066ccb9b9ff/multidict-6.1.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0e2b90b43e696f25c62656389d32236e049568b39320e2735d51f08fd362761b", size = 131067, upload-time = "2024-09-09T23:47:45.617Z" }, + { url = "https://files.pythonhosted.org/packages/cc/1e/1b34154fef373371fd6c65125b3d42ff5f56c7ccc6bfff91b9b3c60ae9e0/multidict-6.1.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d83a047959d38a7ff552ff94be767b7fd79b831ad1cd9920662db05fec24fe72", size = 138507, upload-time = "2024-09-09T23:47:47.429Z" }, + { url = "https://files.pythonhosted.org/packages/fb/e0/0bc6b2bac6e461822b5f575eae85da6aae76d0e2a79b6665d6206b8e2e48/multidict-6.1.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d1a9dd711d0877a1ece3d2e4fea11a8e75741ca21954c919406b44e7cf971304", size = 133905, upload-time = "2024-09-09T23:47:48.878Z" }, + { url = "https://files.pythonhosted.org/packages/ba/af/73d13b918071ff9b2205fcf773d316e0f8fefb4ec65354bbcf0b10908cc6/multidict-6.1.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ec2abea24d98246b94913b76a125e855eb5c434f7c46546046372fe60f666351", size = 129004, upload-time = "2024-09-09T23:47:50.124Z" }, + { url = "https://files.pythonhosted.org/packages/74/21/23960627b00ed39643302d81bcda44c9444ebcdc04ee5bedd0757513f259/multidict-6.1.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4867cafcbc6585e4b678876c489b9273b13e9fff9f6d6d66add5e15d11d926cb", size = 121308, upload-time = "2024-09-09T23:47:51.97Z" }, + { url = "https://files.pythonhosted.org/packages/8b/5c/cf282263ffce4a596ed0bb2aa1a1dddfe1996d6a62d08842a8d4b33dca13/multidict-6.1.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:5b48204e8d955c47c55b72779802b219a39acc3ee3d0116d5080c388970b76e3", size = 132608, upload-time = "2024-09-09T23:47:53.201Z" }, + { url = "https://files.pythonhosted.org/packages/d7/3e/97e778c041c72063f42b290888daff008d3ab1427f5b09b714f5a8eff294/multidict-6.1.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:d8fff389528cad1618fb4b26b95550327495462cd745d879a8c7c2115248e399", size = 127029, upload-time = "2024-09-09T23:47:54.435Z" }, + { url = "https://files.pythonhosted.org/packages/47/ac/3efb7bfe2f3aefcf8d103e9a7162572f01936155ab2f7ebcc7c255a23212/multidict-6.1.0-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:a7a9541cd308eed5e30318430a9c74d2132e9a8cb46b901326272d780bf2d423", size = 137594, upload-time = "2024-09-09T23:47:55.659Z" }, + { url = "https://files.pythonhosted.org/packages/42/9b/6c6e9e8dc4f915fc90a9b7798c44a30773dea2995fdcb619870e705afe2b/multidict-6.1.0-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:da1758c76f50c39a2efd5e9859ce7d776317eb1dd34317c8152ac9251fc574a3", size = 134556, upload-time = "2024-09-09T23:47:56.98Z" }, + { url = "https://files.pythonhosted.org/packages/1d/10/8e881743b26aaf718379a14ac58572a240e8293a1c9d68e1418fb11c0f90/multidict-6.1.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:c943a53e9186688b45b323602298ab727d8865d8c9ee0b17f8d62d14b56f0753", size = 130993, upload-time = "2024-09-09T23:47:58.163Z" }, + { url = "https://files.pythonhosted.org/packages/45/84/3eb91b4b557442802d058a7579e864b329968c8d0ea57d907e7023c677f2/multidict-6.1.0-cp311-cp311-win32.whl", hash = "sha256:90f8717cb649eea3504091e640a1b8568faad18bd4b9fcd692853a04475a4b80", size = 26405, upload-time = "2024-09-09T23:47:59.391Z" }, + { url = "https://files.pythonhosted.org/packages/9f/0b/ad879847ecbf6d27e90a6eabb7eff6b62c129eefe617ea45eae7c1f0aead/multidict-6.1.0-cp311-cp311-win_amd64.whl", hash = "sha256:82176036e65644a6cc5bd619f65f6f19781e8ec2e5330f51aa9ada7504cc1926", size = 28795, upload-time = "2024-09-09T23:48:00.359Z" }, + { url = "https://files.pythonhosted.org/packages/fd/16/92057c74ba3b96d5e211b553895cd6dc7cc4d1e43d9ab8fafc727681ef71/multidict-6.1.0-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:b04772ed465fa3cc947db808fa306d79b43e896beb677a56fb2347ca1a49c1fa", size = 48713, upload-time = "2024-09-09T23:48:01.893Z" }, + { url = "https://files.pythonhosted.org/packages/94/3d/37d1b8893ae79716179540b89fc6a0ee56b4a65fcc0d63535c6f5d96f217/multidict-6.1.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:6180c0ae073bddeb5a97a38c03f30c233e0a4d39cd86166251617d1bbd0af436", size = 29516, upload-time = "2024-09-09T23:48:03.463Z" }, + { url = "https://files.pythonhosted.org/packages/a2/12/adb6b3200c363062f805275b4c1e656be2b3681aada66c80129932ff0bae/multidict-6.1.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:071120490b47aa997cca00666923a83f02c7fbb44f71cf7f136df753f7fa8761", size = 29557, upload-time = "2024-09-09T23:48:04.905Z" }, + { url = "https://files.pythonhosted.org/packages/47/e9/604bb05e6e5bce1e6a5cf80a474e0f072e80d8ac105f1b994a53e0b28c42/multidict-6.1.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:50b3a2710631848991d0bf7de077502e8994c804bb805aeb2925a981de58ec2e", size = 130170, upload-time = "2024-09-09T23:48:06.862Z" }, + { url = "https://files.pythonhosted.org/packages/7e/13/9efa50801785eccbf7086b3c83b71a4fb501a4d43549c2f2f80b8787d69f/multidict-6.1.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b58c621844d55e71c1b7f7c498ce5aa6985d743a1a59034c57a905b3f153c1ef", size = 134836, upload-time = "2024-09-09T23:48:08.537Z" }, + { url = "https://files.pythonhosted.org/packages/bf/0f/93808b765192780d117814a6dfcc2e75de6dcc610009ad408b8814dca3ba/multidict-6.1.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:55b6d90641869892caa9ca42ff913f7ff1c5ece06474fbd32fb2cf6834726c95", size = 133475, upload-time = "2024-09-09T23:48:09.865Z" }, + { url = "https://files.pythonhosted.org/packages/d3/c8/529101d7176fe7dfe1d99604e48d69c5dfdcadb4f06561f465c8ef12b4df/multidict-6.1.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4b820514bfc0b98a30e3d85462084779900347e4d49267f747ff54060cc33925", size = 131049, upload-time = "2024-09-09T23:48:11.115Z" }, + { url = "https://files.pythonhosted.org/packages/ca/0c/fc85b439014d5a58063e19c3a158a889deec399d47b5269a0f3b6a2e28bc/multidict-6.1.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:10a9b09aba0c5b48c53761b7c720aaaf7cf236d5fe394cd399c7ba662d5f9966", size = 120370, upload-time = "2024-09-09T23:48:12.78Z" }, + { url = "https://files.pythonhosted.org/packages/db/46/d4416eb20176492d2258fbd47b4abe729ff3b6e9c829ea4236f93c865089/multidict-6.1.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:1e16bf3e5fc9f44632affb159d30a437bfe286ce9e02754759be5536b169b305", size = 125178, upload-time = "2024-09-09T23:48:14.295Z" }, + { url = "https://files.pythonhosted.org/packages/5b/46/73697ad7ec521df7de5531a32780bbfd908ded0643cbe457f981a701457c/multidict-6.1.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:76f364861c3bfc98cbbcbd402d83454ed9e01a5224bb3a28bf70002a230f73e2", size = 119567, upload-time = "2024-09-09T23:48:16.284Z" }, + { url = "https://files.pythonhosted.org/packages/cd/ed/51f060e2cb0e7635329fa6ff930aa5cffa17f4c7f5c6c3ddc3500708e2f2/multidict-6.1.0-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:820c661588bd01a0aa62a1283f20d2be4281b086f80dad9e955e690c75fb54a2", size = 129822, upload-time = "2024-09-09T23:48:17.835Z" }, + { url = "https://files.pythonhosted.org/packages/df/9e/ee7d1954b1331da3eddea0c4e08d9142da5f14b1321c7301f5014f49d492/multidict-6.1.0-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:0e5f362e895bc5b9e67fe6e4ded2492d8124bdf817827f33c5b46c2fe3ffaca6", size = 128656, upload-time = "2024-09-09T23:48:19.576Z" }, + { url = "https://files.pythonhosted.org/packages/77/00/8538f11e3356b5d95fa4b024aa566cde7a38aa7a5f08f4912b32a037c5dc/multidict-6.1.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:3ec660d19bbc671e3a6443325f07263be452c453ac9e512f5eb935e7d4ac28b3", size = 125360, upload-time = "2024-09-09T23:48:20.957Z" }, + { url = "https://files.pythonhosted.org/packages/be/05/5d334c1f2462d43fec2363cd00b1c44c93a78c3925d952e9a71caf662e96/multidict-6.1.0-cp312-cp312-win32.whl", hash = "sha256:58130ecf8f7b8112cdb841486404f1282b9c86ccb30d3519faf301b2e5659133", size = 26382, upload-time = "2024-09-09T23:48:22.351Z" }, + { url = "https://files.pythonhosted.org/packages/a3/bf/f332a13486b1ed0496d624bcc7e8357bb8053823e8cd4b9a18edc1d97e73/multidict-6.1.0-cp312-cp312-win_amd64.whl", hash = "sha256:188215fc0aafb8e03341995e7c4797860181562380f81ed0a87ff455b70bf1f1", size = 28529, upload-time = "2024-09-09T23:48:23.478Z" }, + { url = "https://files.pythonhosted.org/packages/22/67/1c7c0f39fe069aa4e5d794f323be24bf4d33d62d2a348acdb7991f8f30db/multidict-6.1.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:d569388c381b24671589335a3be6e1d45546c2988c2ebe30fdcada8457a31008", size = 48771, upload-time = "2024-09-09T23:48:24.594Z" }, + { url = "https://files.pythonhosted.org/packages/3c/25/c186ee7b212bdf0df2519eacfb1981a017bda34392c67542c274651daf23/multidict-6.1.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:052e10d2d37810b99cc170b785945421141bf7bb7d2f8799d431e7db229c385f", size = 29533, upload-time = "2024-09-09T23:48:26.187Z" }, + { url = "https://files.pythonhosted.org/packages/67/5e/04575fd837e0958e324ca035b339cea174554f6f641d3fb2b4f2e7ff44a2/multidict-6.1.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:f90c822a402cb865e396a504f9fc8173ef34212a342d92e362ca498cad308e28", size = 29595, upload-time = "2024-09-09T23:48:27.305Z" }, + { url = "https://files.pythonhosted.org/packages/d3/b2/e56388f86663810c07cfe4a3c3d87227f3811eeb2d08450b9e5d19d78876/multidict-6.1.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b225d95519a5bf73860323e633a664b0d85ad3d5bede6d30d95b35d4dfe8805b", size = 130094, upload-time = "2024-09-09T23:48:28.544Z" }, + { url = "https://files.pythonhosted.org/packages/6c/ee/30ae9b4186a644d284543d55d491fbd4239b015d36b23fea43b4c94f7052/multidict-6.1.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:23bfd518810af7de1116313ebd9092cb9aa629beb12f6ed631ad53356ed6b86c", size = 134876, upload-time = "2024-09-09T23:48:30.098Z" }, + { url = "https://files.pythonhosted.org/packages/84/c7/70461c13ba8ce3c779503c70ec9d0345ae84de04521c1f45a04d5f48943d/multidict-6.1.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5c09fcfdccdd0b57867577b719c69e347a436b86cd83747f179dbf0cc0d4c1f3", size = 133500, upload-time = "2024-09-09T23:48:31.793Z" }, + { url = "https://files.pythonhosted.org/packages/4a/9f/002af221253f10f99959561123fae676148dd730e2daa2cd053846a58507/multidict-6.1.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bf6bea52ec97e95560af5ae576bdac3aa3aae0b6758c6efa115236d9e07dae44", size = 131099, upload-time = "2024-09-09T23:48:33.193Z" }, + { url = "https://files.pythonhosted.org/packages/82/42/d1c7a7301d52af79d88548a97e297f9d99c961ad76bbe6f67442bb77f097/multidict-6.1.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:57feec87371dbb3520da6192213c7d6fc892d5589a93db548331954de8248fd2", size = 120403, upload-time = "2024-09-09T23:48:34.942Z" }, + { url = "https://files.pythonhosted.org/packages/68/f3/471985c2c7ac707547553e8f37cff5158030d36bdec4414cb825fbaa5327/multidict-6.1.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:0c3f390dc53279cbc8ba976e5f8035eab997829066756d811616b652b00a23a3", size = 125348, upload-time = "2024-09-09T23:48:36.222Z" }, + { url = "https://files.pythonhosted.org/packages/67/2c/e6df05c77e0e433c214ec1d21ddd203d9a4770a1f2866a8ca40a545869a0/multidict-6.1.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:59bfeae4b25ec05b34f1956eaa1cb38032282cd4dfabc5056d0a1ec4d696d3aa", size = 119673, upload-time = "2024-09-09T23:48:37.588Z" }, + { url = "https://files.pythonhosted.org/packages/c5/cd/bc8608fff06239c9fb333f9db7743a1b2eafe98c2666c9a196e867a3a0a4/multidict-6.1.0-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:b2f59caeaf7632cc633b5cf6fc449372b83bbdf0da4ae04d5be36118e46cc0aa", size = 129927, upload-time = "2024-09-09T23:48:39.128Z" }, + { url = "https://files.pythonhosted.org/packages/44/8e/281b69b7bc84fc963a44dc6e0bbcc7150e517b91df368a27834299a526ac/multidict-6.1.0-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:37bb93b2178e02b7b618893990941900fd25b6b9ac0fa49931a40aecdf083fe4", size = 128711, upload-time = "2024-09-09T23:48:40.55Z" }, + { url = "https://files.pythonhosted.org/packages/12/a4/63e7cd38ed29dd9f1881d5119f272c898ca92536cdb53ffe0843197f6c85/multidict-6.1.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:4e9f48f58c2c523d5a06faea47866cd35b32655c46b443f163d08c6d0ddb17d6", size = 125519, upload-time = "2024-09-09T23:48:42.446Z" }, + { url = "https://files.pythonhosted.org/packages/38/e0/4f5855037a72cd8a7a2f60a3952d9aa45feedb37ae7831642102604e8a37/multidict-6.1.0-cp313-cp313-win32.whl", hash = "sha256:3a37ffb35399029b45c6cc33640a92bef403c9fd388acce75cdc88f58bd19a81", size = 26426, upload-time = "2024-09-09T23:48:43.936Z" }, + { url = "https://files.pythonhosted.org/packages/7e/a5/17ee3a4db1e310b7405f5d25834460073a8ccd86198ce044dfaf69eac073/multidict-6.1.0-cp313-cp313-win_amd64.whl", hash = "sha256:e9aa71e15d9d9beaad2c6b9319edcdc0a49a43ef5c0a4c8265ca9ee7d6c67774", size = 28531, upload-time = "2024-09-09T23:48:45.122Z" }, + { url = "https://files.pythonhosted.org/packages/3e/6a/af41f3aaf5f00fd86cc7d470a2f5b25299b0c84691163b8757f4a1a205f2/multidict-6.1.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:db7457bac39421addd0c8449933ac32d8042aae84a14911a757ae6ca3eef1392", size = 48597, upload-time = "2024-09-09T23:48:46.391Z" }, + { url = "https://files.pythonhosted.org/packages/d9/d6/3d4082760ed11b05734f8bf32a0615b99e7d9d2b3730ad698a4d7377c00a/multidict-6.1.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:d094ddec350a2fb899fec68d8353c78233debde9b7d8b4beeafa70825f1c281a", size = 29338, upload-time = "2024-09-09T23:48:47.891Z" }, + { url = "https://files.pythonhosted.org/packages/9d/7f/5d1ce7f47d44393d429922910afbe88fcd29ee3069babbb47507a4c3a7ea/multidict-6.1.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:5845c1fd4866bb5dd3125d89b90e57ed3138241540897de748cdf19de8a2fca2", size = 29562, upload-time = "2024-09-09T23:48:49.254Z" }, + { url = "https://files.pythonhosted.org/packages/ce/ec/c425257671af9308a9b626e2e21f7f43841616e4551de94eb3c92aca75b2/multidict-6.1.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9079dfc6a70abe341f521f78405b8949f96db48da98aeb43f9907f342f627cdc", size = 130980, upload-time = "2024-09-09T23:48:50.606Z" }, + { url = "https://files.pythonhosted.org/packages/d8/d7/d4220ad2633a89b314593e9b85b5bc9287a7c563c7f9108a4a68d9da5374/multidict-6.1.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3914f5aaa0f36d5d60e8ece6a308ee1c9784cd75ec8151062614657a114c4478", size = 136694, upload-time = "2024-09-09T23:48:52.042Z" }, + { url = "https://files.pythonhosted.org/packages/a1/2a/13e554db5830c8d40185a2e22aa8325516a5de9634c3fb2caf3886a829b3/multidict-6.1.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c08be4f460903e5a9d0f76818db3250f12e9c344e79314d1d570fc69d7f4eae4", size = 131616, upload-time = "2024-09-09T23:48:54.283Z" }, + { url = "https://files.pythonhosted.org/packages/2e/a9/83692e37d8152f104333132105b67100aabfb2e96a87f6bed67f566035a7/multidict-6.1.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d093be959277cb7dee84b801eb1af388b6ad3ca6a6b6bf1ed7585895789d027d", size = 129664, upload-time = "2024-09-09T23:48:55.785Z" }, + { url = "https://files.pythonhosted.org/packages/cc/1c/1718cd518fb9da7e8890d9d1611c1af0ea5e60f68ff415d026e38401ed36/multidict-6.1.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3702ea6872c5a2a4eeefa6ffd36b042e9773f05b1f37ae3ef7264b1163c2dcf6", size = 121855, upload-time = "2024-09-09T23:48:57.333Z" }, + { url = "https://files.pythonhosted.org/packages/2b/92/f6ed67514b0e3894198f0eb42dcde22f0851ea35f4561a1e4acf36c7b1be/multidict-6.1.0-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:2090f6a85cafc5b2db085124d752757c9d251548cedabe9bd31afe6363e0aff2", size = 127928, upload-time = "2024-09-09T23:48:58.778Z" }, + { url = "https://files.pythonhosted.org/packages/f7/30/c66954115a4dc4dc3c84e02c8ae11bb35a43d79ef93122c3c3a40c4d459b/multidict-6.1.0-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:f67f217af4b1ff66c68a87318012de788dd95fcfeb24cc889011f4e1c7454dfd", size = 122793, upload-time = "2024-09-09T23:49:00.244Z" }, + { url = "https://files.pythonhosted.org/packages/62/c9/d386d01b43871e8e1631eb7b3695f6af071b7ae1ab716caf371100f0eb24/multidict-6.1.0-cp38-cp38-musllinux_1_2_ppc64le.whl", hash = "sha256:189f652a87e876098bbc67b4da1049afb5f5dfbaa310dd67c594b01c10388db6", size = 132762, upload-time = "2024-09-09T23:49:02.188Z" }, + { url = "https://files.pythonhosted.org/packages/69/ff/f70cb0a2f7a358acf48e32139ce3a150ff18c961ee9c714cc8c0dc7e3584/multidict-6.1.0-cp38-cp38-musllinux_1_2_s390x.whl", hash = "sha256:6bb5992037f7a9eff7991ebe4273ea7f51f1c1c511e6a2ce511d0e7bdb754492", size = 127872, upload-time = "2024-09-09T23:49:04.389Z" }, + { url = "https://files.pythonhosted.org/packages/89/5b/abea7db3ba4cd07752a9b560f9275a11787cd13f86849b5d99c1ceea921d/multidict-6.1.0-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:ac10f4c2b9e770c4e393876e35a7046879d195cd123b4f116d299d442b335bcd", size = 126161, upload-time = "2024-09-09T23:49:06.306Z" }, + { url = "https://files.pythonhosted.org/packages/22/03/acc77a4667cca4462ee974fc39990803e58fa573d5a923d6e82b7ef6da7e/multidict-6.1.0-cp38-cp38-win32.whl", hash = "sha256:e27bbb6d14416713a8bd7aaa1313c0fc8d44ee48d74497a0ff4c3a1b6ccb5167", size = 26338, upload-time = "2024-09-09T23:49:07.782Z" }, + { url = "https://files.pythonhosted.org/packages/90/bf/3d0c1cc9c8163abc24625fae89c0ade1ede9bccb6eceb79edf8cff3cca46/multidict-6.1.0-cp38-cp38-win_amd64.whl", hash = "sha256:22f3105d4fb15c8f57ff3959a58fcab6ce36814486500cd7485651230ad4d4ef", size = 28736, upload-time = "2024-09-09T23:49:09.126Z" }, + { url = "https://files.pythonhosted.org/packages/e7/c9/9e153a6572b38ac5ff4434113af38acf8d5e9957897cdb1f513b3d6614ed/multidict-6.1.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:4e18b656c5e844539d506a0a06432274d7bd52a7487e6828c63a63d69185626c", size = 48550, upload-time = "2024-09-09T23:49:10.475Z" }, + { url = "https://files.pythonhosted.org/packages/76/f5/79565ddb629eba6c7f704f09a09df085c8dc04643b12506f10f718cee37a/multidict-6.1.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:a185f876e69897a6f3325c3f19f26a297fa058c5e456bfcff8015e9a27e83ae1", size = 29298, upload-time = "2024-09-09T23:49:12.119Z" }, + { url = "https://files.pythonhosted.org/packages/60/1b/9851878b704bc98e641a3e0bce49382ae9e05743dac6d97748feb5b7baba/multidict-6.1.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:ab7c4ceb38d91570a650dba194e1ca87c2b543488fe9309b4212694174fd539c", size = 29641, upload-time = "2024-09-09T23:49:13.714Z" }, + { url = "https://files.pythonhosted.org/packages/89/87/d451d45aab9e422cb0fb2f7720c31a4c1d3012c740483c37f642eba568fb/multidict-6.1.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e617fb6b0b6953fffd762669610c1c4ffd05632c138d61ac7e14ad187870669c", size = 126202, upload-time = "2024-09-09T23:49:15.238Z" }, + { url = "https://files.pythonhosted.org/packages/fa/b4/27cbe9f3e2e469359887653f2e45470272eef7295139916cc21107c6b48c/multidict-6.1.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:16e5f4bf4e603eb1fdd5d8180f1a25f30056f22e55ce51fb3d6ad4ab29f7d96f", size = 133925, upload-time = "2024-09-09T23:49:16.786Z" }, + { url = "https://files.pythonhosted.org/packages/4d/a3/afc841899face8adfd004235ce759a37619f6ec99eafd959650c5ce4df57/multidict-6.1.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f4c035da3f544b1882bac24115f3e2e8760f10a0107614fc9839fd232200b875", size = 129039, upload-time = "2024-09-09T23:49:18.381Z" }, + { url = "https://files.pythonhosted.org/packages/5e/41/0d0fb18c1ad574f807196f5f3d99164edf9de3e169a58c6dc2d6ed5742b9/multidict-6.1.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:957cf8e4b6e123a9eea554fa7ebc85674674b713551de587eb318a2df3e00255", size = 124072, upload-time = "2024-09-09T23:49:20.115Z" }, + { url = "https://files.pythonhosted.org/packages/00/22/defd7a2e71a44e6e5b9a5428f972e5b572e7fe28e404dfa6519bbf057c93/multidict-6.1.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:483a6aea59cb89904e1ceabd2b47368b5600fb7de78a6e4a2c2987b2d256cf30", size = 116532, upload-time = "2024-09-09T23:49:21.685Z" }, + { url = "https://files.pythonhosted.org/packages/91/25/f7545102def0b1d456ab6449388eed2dfd822debba1d65af60194904a23a/multidict-6.1.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:87701f25a2352e5bf7454caa64757642734da9f6b11384c1f9d1a8e699758057", size = 128173, upload-time = "2024-09-09T23:49:23.657Z" }, + { url = "https://files.pythonhosted.org/packages/45/79/3dbe8d35fc99f5ea610813a72ab55f426cb9cf482f860fa8496e5409be11/multidict-6.1.0-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:682b987361e5fd7a139ed565e30d81fd81e9629acc7d925a205366877d8c8657", size = 122654, upload-time = "2024-09-09T23:49:25.7Z" }, + { url = "https://files.pythonhosted.org/packages/97/cb/209e735eeab96e1b160825b5d0b36c56d3862abff828fc43999bb957dcad/multidict-6.1.0-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:ce2186a7df133a9c895dea3331ddc5ddad42cdd0d1ea2f0a51e5d161e4762f28", size = 133197, upload-time = "2024-09-09T23:49:27.906Z" }, + { url = "https://files.pythonhosted.org/packages/e4/3a/a13808a7ada62808afccea67837a79d00ad6581440015ef00f726d064c2d/multidict-6.1.0-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:9f636b730f7e8cb19feb87094949ba54ee5357440b9658b2a32a5ce4bce53972", size = 129754, upload-time = "2024-09-09T23:49:29.508Z" }, + { url = "https://files.pythonhosted.org/packages/77/dd/8540e139eafb240079242da8f8ffdf9d3f4b4ad1aac5a786cd4050923783/multidict-6.1.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:73eae06aa53af2ea5270cc066dcaf02cc60d2994bbb2c4ef5764949257d10f43", size = 126402, upload-time = "2024-09-09T23:49:31.243Z" }, + { url = "https://files.pythonhosted.org/packages/86/99/e82e1a275d8b1ea16d3a251474262258dbbe41c05cce0c01bceda1fc8ea5/multidict-6.1.0-cp39-cp39-win32.whl", hash = "sha256:1ca0083e80e791cffc6efce7660ad24af66c8d4079d2a750b29001b53ff59ada", size = 26421, upload-time = "2024-09-09T23:49:32.648Z" }, + { url = "https://files.pythonhosted.org/packages/86/1c/9fa630272355af7e4446a2c7550c259f11ee422ab2d30ff90a0a71cf3d9e/multidict-6.1.0-cp39-cp39-win_amd64.whl", hash = "sha256:aa466da5b15ccea564bdab9c89175c762bc12825f4659c11227f515cee76fa4a", size = 28791, upload-time = "2024-09-09T23:49:34.725Z" }, + { url = "https://files.pythonhosted.org/packages/99/b7/b9e70fde2c0f0c9af4cc5277782a89b66d35948ea3369ec9f598358c3ac5/multidict-6.1.0-py3-none-any.whl", hash = "sha256:48e171e52d1c4d33888e529b999e5900356b9ae588c2f09a52dcefb158b27506", size = 10051, upload-time = "2024-09-09T23:49:36.506Z" }, +] + +[[package]] +name = "multidict" +version = "6.7.0" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version >= '3.14'", + "python_full_version >= '3.11' and python_full_version < '3.14'", + "python_full_version == '3.10.*'", + "python_full_version == '3.9.*'", +] +dependencies = [ + { name = "typing-extensions", version = "4.15.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.9' and python_full_version < '3.11'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/80/1e/5492c365f222f907de1039b91f922b93fa4f764c713ee858d235495d8f50/multidict-6.7.0.tar.gz", hash = "sha256:c6e99d9a65ca282e578dfea819cfa9c0a62b2499d8677392e09feaf305e9e6f5", size = 101834, upload-time = "2025-10-06T14:52:30.657Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/a9/63/7bdd4adc330abcca54c85728db2327130e49e52e8c3ce685cec44e0f2e9f/multidict-6.7.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:9f474ad5acda359c8758c8accc22032c6abe6dc87a8be2440d097785e27a9349", size = 77153, upload-time = "2025-10-06T14:48:26.409Z" }, + { url = "https://files.pythonhosted.org/packages/3f/bb/b6c35ff175ed1a3142222b78455ee31be71a8396ed3ab5280fbe3ebe4e85/multidict-6.7.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:4b7a9db5a870f780220e931d0002bbfd88fb53aceb6293251e2c839415c1b20e", size = 44993, upload-time = "2025-10-06T14:48:28.4Z" }, + { url = "https://files.pythonhosted.org/packages/e0/1f/064c77877c5fa6df6d346e68075c0f6998547afe952d6471b4c5f6a7345d/multidict-6.7.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:03ca744319864e92721195fa28c7a3b2bc7b686246b35e4078c1e4d0eb5466d3", size = 44607, upload-time = "2025-10-06T14:48:29.581Z" }, + { url = "https://files.pythonhosted.org/packages/04/7a/bf6aa92065dd47f287690000b3d7d332edfccb2277634cadf6a810463c6a/multidict-6.7.0-cp310-cp310-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:f0e77e3c0008bc9316e662624535b88d360c3a5d3f81e15cf12c139a75250046", size = 241847, upload-time = "2025-10-06T14:48:32.107Z" }, + { url = "https://files.pythonhosted.org/packages/94/39/297a8de920f76eda343e4ce05f3b489f0ab3f9504f2576dfb37b7c08ca08/multidict-6.7.0-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:08325c9e5367aa379a3496aa9a022fe8837ff22e00b94db256d3a1378c76ab32", size = 242616, upload-time = "2025-10-06T14:48:34.054Z" }, + { url = "https://files.pythonhosted.org/packages/39/3a/d0eee2898cfd9d654aea6cb8c4addc2f9756e9a7e09391cfe55541f917f7/multidict-6.7.0-cp310-cp310-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:e2862408c99f84aa571ab462d25236ef9cb12a602ea959ba9c9009a54902fc73", size = 222333, upload-time = "2025-10-06T14:48:35.9Z" }, + { url = "https://files.pythonhosted.org/packages/05/48/3b328851193c7a4240815b71eea165b49248867bbb6153a0aee227a0bb47/multidict-6.7.0-cp310-cp310-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:4d72a9a2d885f5c208b0cb91ff2ed43636bb7e345ec839ff64708e04f69a13cc", size = 253239, upload-time = "2025-10-06T14:48:37.302Z" }, + { url = "https://files.pythonhosted.org/packages/b1/ca/0706a98c8d126a89245413225ca4a3fefc8435014de309cf8b30acb68841/multidict-6.7.0-cp310-cp310-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:478cc36476687bac1514d651cbbaa94b86b0732fb6855c60c673794c7dd2da62", size = 251618, upload-time = "2025-10-06T14:48:38.963Z" }, + { url = "https://files.pythonhosted.org/packages/5e/4f/9c7992f245554d8b173f6f0a048ad24b3e645d883f096857ec2c0822b8bd/multidict-6.7.0-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:6843b28b0364dc605f21481c90fadb5f60d9123b442eb8a726bb74feef588a84", size = 241655, upload-time = "2025-10-06T14:48:40.312Z" }, + { url = "https://files.pythonhosted.org/packages/31/79/26a85991ae67efd1c0b1fc2e0c275b8a6aceeb155a68861f63f87a798f16/multidict-6.7.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:23bfeee5316266e5ee2d625df2d2c602b829435fc3a235c2ba2131495706e4a0", size = 239245, upload-time = "2025-10-06T14:48:41.848Z" }, + { url = "https://files.pythonhosted.org/packages/14/1e/75fa96394478930b79d0302eaf9a6c69f34005a1a5251ac8b9c336486ec9/multidict-6.7.0-cp310-cp310-musllinux_1_2_armv7l.whl", hash = "sha256:680878b9f3d45c31e1f730eef731f9b0bc1da456155688c6745ee84eb818e90e", size = 233523, upload-time = "2025-10-06T14:48:43.749Z" }, + { url = "https://files.pythonhosted.org/packages/b2/5e/085544cb9f9c4ad2b5d97467c15f856df8d9bac410cffd5c43991a5d878b/multidict-6.7.0-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:eb866162ef2f45063acc7a53a88ef6fe8bf121d45c30ea3c9cd87ce7e191a8d4", size = 243129, upload-time = "2025-10-06T14:48:45.225Z" }, + { url = "https://files.pythonhosted.org/packages/b9/c3/e9d9e2f20c9474e7a8fcef28f863c5cbd29bb5adce6b70cebe8bdad0039d/multidict-6.7.0-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:df0e3bf7993bdbeca5ac25aa859cf40d39019e015c9c91809ba7093967f7a648", size = 248999, upload-time = "2025-10-06T14:48:46.703Z" }, + { url = "https://files.pythonhosted.org/packages/b5/3f/df171b6efa3239ae33b97b887e42671cd1d94d460614bfb2c30ffdab3b95/multidict-6.7.0-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:661709cdcd919a2ece2234f9bae7174e5220c80b034585d7d8a755632d3e2111", size = 243711, upload-time = "2025-10-06T14:48:48.146Z" }, + { url = "https://files.pythonhosted.org/packages/3c/2f/9b5564888c4e14b9af64c54acf149263721a283aaf4aa0ae89b091d5d8c1/multidict-6.7.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:096f52730c3fb8ed419db2d44391932b63891b2c5ed14850a7e215c0ba9ade36", size = 237504, upload-time = "2025-10-06T14:48:49.447Z" }, + { url = "https://files.pythonhosted.org/packages/6c/3a/0bd6ca0f7d96d790542d591c8c3354c1e1b6bfd2024d4d92dc3d87485ec7/multidict-6.7.0-cp310-cp310-win32.whl", hash = "sha256:afa8a2978ec65d2336305550535c9c4ff50ee527914328c8677b3973ade52b85", size = 41422, upload-time = "2025-10-06T14:48:50.789Z" }, + { url = "https://files.pythonhosted.org/packages/00/35/f6a637ea2c75f0d3b7c7d41b1189189acff0d9deeb8b8f35536bb30f5e33/multidict-6.7.0-cp310-cp310-win_amd64.whl", hash = "sha256:b15b3afff74f707b9275d5ba6a91ae8f6429c3ffb29bbfd216b0b375a56f13d7", size = 46050, upload-time = "2025-10-06T14:48:51.938Z" }, + { url = "https://files.pythonhosted.org/packages/e7/b8/f7bf8329b39893d02d9d95cf610c75885d12fc0f402b1c894e1c8e01c916/multidict-6.7.0-cp310-cp310-win_arm64.whl", hash = "sha256:4b73189894398d59131a66ff157837b1fafea9974be486d036bb3d32331fdbf0", size = 43153, upload-time = "2025-10-06T14:48:53.146Z" }, + { url = "https://files.pythonhosted.org/packages/34/9e/5c727587644d67b2ed479041e4b1c58e30afc011e3d45d25bbe35781217c/multidict-6.7.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:4d409aa42a94c0b3fa617708ef5276dfe81012ba6753a0370fcc9d0195d0a1fc", size = 76604, upload-time = "2025-10-06T14:48:54.277Z" }, + { url = "https://files.pythonhosted.org/packages/17/e4/67b5c27bd17c085a5ea8f1ec05b8a3e5cba0ca734bfcad5560fb129e70ca/multidict-6.7.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:14c9e076eede3b54c636f8ce1c9c252b5f057c62131211f0ceeec273810c9721", size = 44715, upload-time = "2025-10-06T14:48:55.445Z" }, + { url = "https://files.pythonhosted.org/packages/4d/e1/866a5d77be6ea435711bef2a4291eed11032679b6b28b56b4776ab06ba3e/multidict-6.7.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:4c09703000a9d0fa3c3404b27041e574cc7f4df4c6563873246d0e11812a94b6", size = 44332, upload-time = "2025-10-06T14:48:56.706Z" }, + { url = "https://files.pythonhosted.org/packages/31/61/0c2d50241ada71ff61a79518db85ada85fdabfcf395d5968dae1cbda04e5/multidict-6.7.0-cp311-cp311-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:a265acbb7bb33a3a2d626afbe756371dce0279e7b17f4f4eda406459c2b5ff1c", size = 245212, upload-time = "2025-10-06T14:48:58.042Z" }, + { url = "https://files.pythonhosted.org/packages/ac/e0/919666a4e4b57fff1b57f279be1c9316e6cdc5de8a8b525d76f6598fefc7/multidict-6.7.0-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:51cb455de290ae462593e5b1cb1118c5c22ea7f0d3620d9940bf695cea5a4bd7", size = 246671, upload-time = "2025-10-06T14:49:00.004Z" }, + { url = "https://files.pythonhosted.org/packages/a1/cc/d027d9c5a520f3321b65adea289b965e7bcbd2c34402663f482648c716ce/multidict-6.7.0-cp311-cp311-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:db99677b4457c7a5c5a949353e125ba72d62b35f74e26da141530fbb012218a7", size = 225491, upload-time = "2025-10-06T14:49:01.393Z" }, + { url = "https://files.pythonhosted.org/packages/75/c4/bbd633980ce6155a28ff04e6a6492dd3335858394d7bb752d8b108708558/multidict-6.7.0-cp311-cp311-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:f470f68adc395e0183b92a2f4689264d1ea4b40504a24d9882c27375e6662bb9", size = 257322, upload-time = "2025-10-06T14:49:02.745Z" }, + { url = "https://files.pythonhosted.org/packages/4c/6d/d622322d344f1f053eae47e033b0b3f965af01212de21b10bcf91be991fb/multidict-6.7.0-cp311-cp311-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:0db4956f82723cc1c270de9c6e799b4c341d327762ec78ef82bb962f79cc07d8", size = 254694, upload-time = "2025-10-06T14:49:04.15Z" }, + { url = "https://files.pythonhosted.org/packages/a8/9f/78f8761c2705d4c6d7516faed63c0ebdac569f6db1bef95e0d5218fdc146/multidict-6.7.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:3e56d780c238f9e1ae66a22d2adf8d16f485381878250db8d496623cd38b22bd", size = 246715, upload-time = "2025-10-06T14:49:05.967Z" }, + { url = "https://files.pythonhosted.org/packages/78/59/950818e04f91b9c2b95aab3d923d9eabd01689d0dcd889563988e9ea0fd8/multidict-6.7.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:9d14baca2ee12c1a64740d4531356ba50b82543017f3ad6de0deb943c5979abb", size = 243189, upload-time = "2025-10-06T14:49:07.37Z" }, + { url = "https://files.pythonhosted.org/packages/7a/3d/77c79e1934cad2ee74991840f8a0110966d9599b3af95964c0cd79bb905b/multidict-6.7.0-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:295a92a76188917c7f99cda95858c822f9e4aae5824246bba9b6b44004ddd0a6", size = 237845, upload-time = "2025-10-06T14:49:08.759Z" }, + { url = "https://files.pythonhosted.org/packages/63/1b/834ce32a0a97a3b70f86437f685f880136677ac00d8bce0027e9fd9c2db7/multidict-6.7.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:39f1719f57adbb767ef592a50ae5ebb794220d1188f9ca93de471336401c34d2", size = 246374, upload-time = "2025-10-06T14:49:10.574Z" }, + { url = "https://files.pythonhosted.org/packages/23/ef/43d1c3ba205b5dec93dc97f3fba179dfa47910fc73aaaea4f7ceb41cec2a/multidict-6.7.0-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:0a13fb8e748dfc94749f622de065dd5c1def7e0d2216dba72b1d8069a389c6ff", size = 253345, upload-time = "2025-10-06T14:49:12.331Z" }, + { url = "https://files.pythonhosted.org/packages/6b/03/eaf95bcc2d19ead522001f6a650ef32811aa9e3624ff0ad37c445c7a588c/multidict-6.7.0-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:e3aa16de190d29a0ea1b48253c57d99a68492c8dd8948638073ab9e74dc9410b", size = 246940, upload-time = "2025-10-06T14:49:13.821Z" }, + { url = "https://files.pythonhosted.org/packages/e8/df/ec8a5fd66ea6cd6f525b1fcbb23511b033c3e9bc42b81384834ffa484a62/multidict-6.7.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:a048ce45dcdaaf1defb76b2e684f997fb5abf74437b6cb7b22ddad934a964e34", size = 242229, upload-time = "2025-10-06T14:49:15.603Z" }, + { url = "https://files.pythonhosted.org/packages/8a/a2/59b405d59fd39ec86d1142630e9049243015a5f5291ba49cadf3c090c541/multidict-6.7.0-cp311-cp311-win32.whl", hash = "sha256:a90af66facec4cebe4181b9e62a68be65e45ac9b52b67de9eec118701856e7ff", size = 41308, upload-time = "2025-10-06T14:49:16.871Z" }, + { url = "https://files.pythonhosted.org/packages/32/0f/13228f26f8b882c34da36efa776c3b7348455ec383bab4a66390e42963ae/multidict-6.7.0-cp311-cp311-win_amd64.whl", hash = "sha256:95b5ffa4349df2887518bb839409bcf22caa72d82beec453216802f475b23c81", size = 46037, upload-time = "2025-10-06T14:49:18.457Z" }, + { url = "https://files.pythonhosted.org/packages/84/1f/68588e31b000535a3207fd3c909ebeec4fb36b52c442107499c18a896a2a/multidict-6.7.0-cp311-cp311-win_arm64.whl", hash = "sha256:329aa225b085b6f004a4955271a7ba9f1087e39dcb7e65f6284a988264a63912", size = 43023, upload-time = "2025-10-06T14:49:19.648Z" }, + { url = "https://files.pythonhosted.org/packages/c2/9e/9f61ac18d9c8b475889f32ccfa91c9f59363480613fc807b6e3023d6f60b/multidict-6.7.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:8a3862568a36d26e650a19bb5cbbba14b71789032aebc0423f8cc5f150730184", size = 76877, upload-time = "2025-10-06T14:49:20.884Z" }, + { url = "https://files.pythonhosted.org/packages/38/6f/614f09a04e6184f8824268fce4bc925e9849edfa654ddd59f0b64508c595/multidict-6.7.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:960c60b5849b9b4f9dcc9bea6e3626143c252c74113df2c1540aebce70209b45", size = 45467, upload-time = "2025-10-06T14:49:22.054Z" }, + { url = "https://files.pythonhosted.org/packages/b3/93/c4f67a436dd026f2e780c433277fff72be79152894d9fc36f44569cab1a6/multidict-6.7.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:2049be98fb57a31b4ccf870bf377af2504d4ae35646a19037ec271e4c07998aa", size = 43834, upload-time = "2025-10-06T14:49:23.566Z" }, + { url = "https://files.pythonhosted.org/packages/7f/f5/013798161ca665e4a422afbc5e2d9e4070142a9ff8905e482139cd09e4d0/multidict-6.7.0-cp312-cp312-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:0934f3843a1860dd465d38895c17fce1f1cb37295149ab05cd1b9a03afacb2a7", size = 250545, upload-time = "2025-10-06T14:49:24.882Z" }, + { url = "https://files.pythonhosted.org/packages/71/2f/91dbac13e0ba94669ea5119ba267c9a832f0cb65419aca75549fcf09a3dc/multidict-6.7.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b3e34f3a1b8131ba06f1a73adab24f30934d148afcd5f5de9a73565a4404384e", size = 258305, upload-time = "2025-10-06T14:49:26.778Z" }, + { url = "https://files.pythonhosted.org/packages/ef/b0/754038b26f6e04488b48ac621f779c341338d78503fb45403755af2df477/multidict-6.7.0-cp312-cp312-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:efbb54e98446892590dc2458c19c10344ee9a883a79b5cec4bc34d6656e8d546", size = 242363, upload-time = "2025-10-06T14:49:28.562Z" }, + { url = "https://files.pythonhosted.org/packages/87/15/9da40b9336a7c9fa606c4cf2ed80a649dffeb42b905d4f63a1d7eb17d746/multidict-6.7.0-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:a35c5fc61d4f51eb045061e7967cfe3123d622cd500e8868e7c0c592a09fedc4", size = 268375, upload-time = "2025-10-06T14:49:29.96Z" }, + { url = "https://files.pythonhosted.org/packages/82/72/c53fcade0cc94dfaad583105fd92b3a783af2091eddcb41a6d5a52474000/multidict-6.7.0-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:29fe6740ebccba4175af1b9b87bf553e9c15cd5868ee967e010efcf94e4fd0f1", size = 269346, upload-time = "2025-10-06T14:49:31.404Z" }, + { url = "https://files.pythonhosted.org/packages/0d/e2/9baffdae21a76f77ef8447f1a05a96ec4bc0a24dae08767abc0a2fe680b8/multidict-6.7.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:123e2a72e20537add2f33a79e605f6191fba2afda4cbb876e35c1a7074298a7d", size = 256107, upload-time = "2025-10-06T14:49:32.974Z" }, + { url = "https://files.pythonhosted.org/packages/3c/06/3f06f611087dc60d65ef775f1fb5aca7c6d61c6db4990e7cda0cef9b1651/multidict-6.7.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:b284e319754366c1aee2267a2036248b24eeb17ecd5dc16022095e747f2f4304", size = 253592, upload-time = "2025-10-06T14:49:34.52Z" }, + { url = "https://files.pythonhosted.org/packages/20/24/54e804ec7945b6023b340c412ce9c3f81e91b3bf5fa5ce65558740141bee/multidict-6.7.0-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:803d685de7be4303b5a657b76e2f6d1240e7e0a8aa2968ad5811fa2285553a12", size = 251024, upload-time = "2025-10-06T14:49:35.956Z" }, + { url = "https://files.pythonhosted.org/packages/14/48/011cba467ea0b17ceb938315d219391d3e421dfd35928e5dbdc3f4ae76ef/multidict-6.7.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:c04a328260dfd5db8c39538f999f02779012268f54614902d0afc775d44e0a62", size = 251484, upload-time = "2025-10-06T14:49:37.631Z" }, + { url = "https://files.pythonhosted.org/packages/0d/2f/919258b43bb35b99fa127435cfb2d91798eb3a943396631ef43e3720dcf4/multidict-6.7.0-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:8a19cdb57cd3df4cd865849d93ee14920fb97224300c88501f16ecfa2604b4e0", size = 263579, upload-time = "2025-10-06T14:49:39.502Z" }, + { url = "https://files.pythonhosted.org/packages/31/22/a0e884d86b5242b5a74cf08e876bdf299e413016b66e55511f7a804a366e/multidict-6.7.0-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:9b2fd74c52accced7e75de26023b7dccee62511a600e62311b918ec5c168fc2a", size = 259654, upload-time = "2025-10-06T14:49:41.32Z" }, + { url = "https://files.pythonhosted.org/packages/b2/e5/17e10e1b5c5f5a40f2fcbb45953c9b215f8a4098003915e46a93f5fcaa8f/multidict-6.7.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:3e8bfdd0e487acf992407a140d2589fe598238eaeffa3da8448d63a63cd363f8", size = 251511, upload-time = "2025-10-06T14:49:46.021Z" }, + { url = "https://files.pythonhosted.org/packages/e3/9a/201bb1e17e7af53139597069c375e7b0dcbd47594604f65c2d5359508566/multidict-6.7.0-cp312-cp312-win32.whl", hash = "sha256:dd32a49400a2c3d52088e120ee00c1e3576cbff7e10b98467962c74fdb762ed4", size = 41895, upload-time = "2025-10-06T14:49:48.718Z" }, + { url = "https://files.pythonhosted.org/packages/46/e2/348cd32faad84eaf1d20cce80e2bb0ef8d312c55bca1f7fa9865e7770aaf/multidict-6.7.0-cp312-cp312-win_amd64.whl", hash = "sha256:92abb658ef2d7ef22ac9f8bb88e8b6c3e571671534e029359b6d9e845923eb1b", size = 46073, upload-time = "2025-10-06T14:49:50.28Z" }, + { url = "https://files.pythonhosted.org/packages/25/ec/aad2613c1910dce907480e0c3aa306905830f25df2e54ccc9dea450cb5aa/multidict-6.7.0-cp312-cp312-win_arm64.whl", hash = "sha256:490dab541a6a642ce1a9d61a4781656b346a55c13038f0b1244653828e3a83ec", size = 43226, upload-time = "2025-10-06T14:49:52.304Z" }, + { url = "https://files.pythonhosted.org/packages/d2/86/33272a544eeb36d66e4d9a920602d1a2f57d4ebea4ef3cdfe5a912574c95/multidict-6.7.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:bee7c0588aa0076ce77c0ea5d19a68d76ad81fcd9fe8501003b9a24f9d4000f6", size = 76135, upload-time = "2025-10-06T14:49:54.26Z" }, + { url = "https://files.pythonhosted.org/packages/91/1c/eb97db117a1ebe46d457a3d235a7b9d2e6dcab174f42d1b67663dd9e5371/multidict-6.7.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:7ef6b61cad77091056ce0e7ce69814ef72afacb150b7ac6a3e9470def2198159", size = 45117, upload-time = "2025-10-06T14:49:55.82Z" }, + { url = "https://files.pythonhosted.org/packages/f1/d8/6c3442322e41fb1dd4de8bd67bfd11cd72352ac131f6368315617de752f1/multidict-6.7.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:9c0359b1ec12b1d6849c59f9d319610b7f20ef990a6d454ab151aa0e3b9f78ca", size = 43472, upload-time = "2025-10-06T14:49:57.048Z" }, + { url = "https://files.pythonhosted.org/packages/75/3f/e2639e80325af0b6c6febdf8e57cc07043ff15f57fa1ef808f4ccb5ac4cd/multidict-6.7.0-cp313-cp313-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:cd240939f71c64bd658f186330603aac1a9a81bf6273f523fca63673cb7378a8", size = 249342, upload-time = "2025-10-06T14:49:58.368Z" }, + { url = "https://files.pythonhosted.org/packages/5d/cc/84e0585f805cbeaa9cbdaa95f9a3d6aed745b9d25700623ac89a6ecff400/multidict-6.7.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:a60a4d75718a5efa473ebd5ab685786ba0c67b8381f781d1be14da49f1a2dc60", size = 257082, upload-time = "2025-10-06T14:49:59.89Z" }, + { url = "https://files.pythonhosted.org/packages/b0/9c/ac851c107c92289acbbf5cfb485694084690c1b17e555f44952c26ddc5bd/multidict-6.7.0-cp313-cp313-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:53a42d364f323275126aff81fb67c5ca1b7a04fda0546245730a55c8c5f24bc4", size = 240704, upload-time = "2025-10-06T14:50:01.485Z" }, + { url = "https://files.pythonhosted.org/packages/50/cc/5f93e99427248c09da95b62d64b25748a5f5c98c7c2ab09825a1d6af0e15/multidict-6.7.0-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:3b29b980d0ddbecb736735ee5bef69bb2ddca56eff603c86f3f29a1128299b4f", size = 266355, upload-time = "2025-10-06T14:50:02.955Z" }, + { url = "https://files.pythonhosted.org/packages/ec/0c/2ec1d883ceb79c6f7f6d7ad90c919c898f5d1c6ea96d322751420211e072/multidict-6.7.0-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:f8a93b1c0ed2d04b97a5e9336fd2d33371b9a6e29ab7dd6503d63407c20ffbaf", size = 267259, upload-time = "2025-10-06T14:50:04.446Z" }, + { url = "https://files.pythonhosted.org/packages/c6/2d/f0b184fa88d6630aa267680bdb8623fb69cb0d024b8c6f0d23f9a0f406d3/multidict-6.7.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:9ff96e8815eecacc6645da76c413eb3b3d34cfca256c70b16b286a687d013c32", size = 254903, upload-time = "2025-10-06T14:50:05.98Z" }, + { url = "https://files.pythonhosted.org/packages/06/c9/11ea263ad0df7dfabcad404feb3c0dd40b131bc7f232d5537f2fb1356951/multidict-6.7.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:7516c579652f6a6be0e266aec0acd0db80829ca305c3d771ed898538804c2036", size = 252365, upload-time = "2025-10-06T14:50:07.511Z" }, + { url = "https://files.pythonhosted.org/packages/41/88/d714b86ee2c17d6e09850c70c9d310abac3d808ab49dfa16b43aba9d53fd/multidict-6.7.0-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:040f393368e63fb0f3330e70c26bfd336656bed925e5cbe17c9da839a6ab13ec", size = 250062, upload-time = "2025-10-06T14:50:09.074Z" }, + { url = "https://files.pythonhosted.org/packages/15/fe/ad407bb9e818c2b31383f6131ca19ea7e35ce93cf1310fce69f12e89de75/multidict-6.7.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:b3bc26a951007b1057a1c543af845f1c7e3e71cc240ed1ace7bf4484aa99196e", size = 249683, upload-time = "2025-10-06T14:50:10.714Z" }, + { url = "https://files.pythonhosted.org/packages/8c/a4/a89abdb0229e533fb925e7c6e5c40201c2873efebc9abaf14046a4536ee6/multidict-6.7.0-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:7b022717c748dd1992a83e219587aabe45980d88969f01b316e78683e6285f64", size = 261254, upload-time = "2025-10-06T14:50:12.28Z" }, + { url = "https://files.pythonhosted.org/packages/8d/aa/0e2b27bd88b40a4fb8dc53dd74eecac70edaa4c1dd0707eb2164da3675b3/multidict-6.7.0-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:9600082733859f00d79dee64effc7aef1beb26adb297416a4ad2116fd61374bd", size = 257967, upload-time = "2025-10-06T14:50:14.16Z" }, + { url = "https://files.pythonhosted.org/packages/d0/8e/0c67b7120d5d5f6d874ed85a085f9dc770a7f9d8813e80f44a9fec820bb7/multidict-6.7.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:94218fcec4d72bc61df51c198d098ce2b378e0ccbac41ddbed5ef44092913288", size = 250085, upload-time = "2025-10-06T14:50:15.639Z" }, + { url = "https://files.pythonhosted.org/packages/ba/55/b73e1d624ea4b8fd4dd07a3bb70f6e4c7c6c5d9d640a41c6ffe5cdbd2a55/multidict-6.7.0-cp313-cp313-win32.whl", hash = "sha256:a37bd74c3fa9d00be2d7b8eca074dc56bd8077ddd2917a839bd989612671ed17", size = 41713, upload-time = "2025-10-06T14:50:17.066Z" }, + { url = "https://files.pythonhosted.org/packages/32/31/75c59e7d3b4205075b4c183fa4ca398a2daf2303ddf616b04ae6ef55cffe/multidict-6.7.0-cp313-cp313-win_amd64.whl", hash = "sha256:30d193c6cc6d559db42b6bcec8a5d395d34d60c9877a0b71ecd7c204fcf15390", size = 45915, upload-time = "2025-10-06T14:50:18.264Z" }, + { url = "https://files.pythonhosted.org/packages/31/2a/8987831e811f1184c22bc2e45844934385363ee61c0a2dcfa8f71b87e608/multidict-6.7.0-cp313-cp313-win_arm64.whl", hash = "sha256:ea3334cabe4d41b7ccd01e4d349828678794edbc2d3ae97fc162a3312095092e", size = 43077, upload-time = "2025-10-06T14:50:19.853Z" }, + { url = "https://files.pythonhosted.org/packages/e8/68/7b3a5170a382a340147337b300b9eb25a9ddb573bcdfff19c0fa3f31ffba/multidict-6.7.0-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:ad9ce259f50abd98a1ca0aa6e490b58c316a0fce0617f609723e40804add2c00", size = 83114, upload-time = "2025-10-06T14:50:21.223Z" }, + { url = "https://files.pythonhosted.org/packages/55/5c/3fa2d07c84df4e302060f555bbf539310980362236ad49f50eeb0a1c1eb9/multidict-6.7.0-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:07f5594ac6d084cbb5de2df218d78baf55ef150b91f0ff8a21cc7a2e3a5a58eb", size = 48442, upload-time = "2025-10-06T14:50:22.871Z" }, + { url = "https://files.pythonhosted.org/packages/fc/56/67212d33239797f9bd91962bb899d72bb0f4c35a8652dcdb8ed049bef878/multidict-6.7.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:0591b48acf279821a579282444814a2d8d0af624ae0bc600aa4d1b920b6e924b", size = 46885, upload-time = "2025-10-06T14:50:24.258Z" }, + { url = "https://files.pythonhosted.org/packages/46/d1/908f896224290350721597a61a69cd19b89ad8ee0ae1f38b3f5cd12ea2ac/multidict-6.7.0-cp313-cp313t-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:749a72584761531d2b9467cfbdfd29487ee21124c304c4b6cb760d8777b27f9c", size = 242588, upload-time = "2025-10-06T14:50:25.716Z" }, + { url = "https://files.pythonhosted.org/packages/ab/67/8604288bbd68680eee0ab568fdcb56171d8b23a01bcd5cb0c8fedf6e5d99/multidict-6.7.0-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6b4c3d199f953acd5b446bf7c0de1fe25d94e09e79086f8dc2f48a11a129cdf1", size = 249966, upload-time = "2025-10-06T14:50:28.192Z" }, + { url = "https://files.pythonhosted.org/packages/20/33/9228d76339f1ba51e3efef7da3ebd91964d3006217aae13211653193c3ff/multidict-6.7.0-cp313-cp313t-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:9fb0211dfc3b51efea2f349ec92c114d7754dd62c01f81c3e32b765b70c45c9b", size = 228618, upload-time = "2025-10-06T14:50:29.82Z" }, + { url = "https://files.pythonhosted.org/packages/f8/2d/25d9b566d10cab1c42b3b9e5b11ef79c9111eaf4463b8c257a3bd89e0ead/multidict-6.7.0-cp313-cp313t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:a027ec240fe73a8d6281872690b988eed307cd7d91b23998ff35ff577ca688b5", size = 257539, upload-time = "2025-10-06T14:50:31.731Z" }, + { url = "https://files.pythonhosted.org/packages/b6/b1/8d1a965e6637fc33de3c0d8f414485c2b7e4af00f42cab3d84e7b955c222/multidict-6.7.0-cp313-cp313t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:d1d964afecdf3a8288789df2f5751dc0a8261138c3768d9af117ed384e538fad", size = 256345, upload-time = "2025-10-06T14:50:33.26Z" }, + { url = "https://files.pythonhosted.org/packages/ba/0c/06b5a8adbdeedada6f4fb8d8f193d44a347223b11939b42953eeb6530b6b/multidict-6.7.0-cp313-cp313t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:caf53b15b1b7df9fbd0709aa01409000a2b4dd03a5f6f5cc548183c7c8f8b63c", size = 247934, upload-time = "2025-10-06T14:50:34.808Z" }, + { url = "https://files.pythonhosted.org/packages/8f/31/b2491b5fe167ca044c6eb4b8f2c9f3b8a00b24c432c365358eadac5d7625/multidict-6.7.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:654030da3197d927f05a536a66186070e98765aa5142794c9904555d3a9d8fb5", size = 245243, upload-time = "2025-10-06T14:50:36.436Z" }, + { url = "https://files.pythonhosted.org/packages/61/1a/982913957cb90406c8c94f53001abd9eafc271cb3e70ff6371590bec478e/multidict-6.7.0-cp313-cp313t-musllinux_1_2_armv7l.whl", hash = "sha256:2090d3718829d1e484706a2f525e50c892237b2bf9b17a79b059cb98cddc2f10", size = 235878, upload-time = "2025-10-06T14:50:37.953Z" }, + { url = "https://files.pythonhosted.org/packages/be/c0/21435d804c1a1cf7a2608593f4d19bca5bcbd7a81a70b253fdd1c12af9c0/multidict-6.7.0-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:2d2cfeec3f6f45651b3d408c4acec0ebf3daa9bc8a112a084206f5db5d05b754", size = 243452, upload-time = "2025-10-06T14:50:39.574Z" }, + { url = "https://files.pythonhosted.org/packages/54/0a/4349d540d4a883863191be6eb9a928846d4ec0ea007d3dcd36323bb058ac/multidict-6.7.0-cp313-cp313t-musllinux_1_2_ppc64le.whl", hash = "sha256:4ef089f985b8c194d341eb2c24ae6e7408c9a0e2e5658699c92f497437d88c3c", size = 252312, upload-time = "2025-10-06T14:50:41.612Z" }, + { url = "https://files.pythonhosted.org/packages/26/64/d5416038dbda1488daf16b676e4dbfd9674dde10a0cc8f4fc2b502d8125d/multidict-6.7.0-cp313-cp313t-musllinux_1_2_s390x.whl", hash = "sha256:e93a0617cd16998784bf4414c7e40f17a35d2350e5c6f0bd900d3a8e02bd3762", size = 246935, upload-time = "2025-10-06T14:50:43.972Z" }, + { url = "https://files.pythonhosted.org/packages/9f/8c/8290c50d14e49f35e0bd4abc25e1bc7711149ca9588ab7d04f886cdf03d9/multidict-6.7.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:f0feece2ef8ebc42ed9e2e8c78fc4aa3cf455733b507c09ef7406364c94376c6", size = 243385, upload-time = "2025-10-06T14:50:45.648Z" }, + { url = "https://files.pythonhosted.org/packages/ef/a0/f83ae75e42d694b3fbad3e047670e511c138be747bc713cf1b10d5096416/multidict-6.7.0-cp313-cp313t-win32.whl", hash = "sha256:19a1d55338ec1be74ef62440ca9e04a2f001a04d0cc49a4983dc320ff0f3212d", size = 47777, upload-time = "2025-10-06T14:50:47.154Z" }, + { url = "https://files.pythonhosted.org/packages/dc/80/9b174a92814a3830b7357307a792300f42c9e94664b01dee8e457551fa66/multidict-6.7.0-cp313-cp313t-win_amd64.whl", hash = "sha256:3da4fb467498df97e986af166b12d01f05d2e04f978a9c1c680ea1988e0bc4b6", size = 53104, upload-time = "2025-10-06T14:50:48.851Z" }, + { url = "https://files.pythonhosted.org/packages/cc/28/04baeaf0428d95bb7a7bea0e691ba2f31394338ba424fb0679a9ed0f4c09/multidict-6.7.0-cp313-cp313t-win_arm64.whl", hash = "sha256:b4121773c49a0776461f4a904cdf6264c88e42218aaa8407e803ca8025872792", size = 45503, upload-time = "2025-10-06T14:50:50.16Z" }, + { url = "https://files.pythonhosted.org/packages/e2/b1/3da6934455dd4b261d4c72f897e3a5728eba81db59959f3a639245891baa/multidict-6.7.0-cp314-cp314-macosx_10_13_universal2.whl", hash = "sha256:3bab1e4aff7adaa34410f93b1f8e57c4b36b9af0426a76003f441ee1d3c7e842", size = 75128, upload-time = "2025-10-06T14:50:51.92Z" }, + { url = "https://files.pythonhosted.org/packages/14/2c/f069cab5b51d175a1a2cb4ccdf7a2c2dabd58aa5bd933fa036a8d15e2404/multidict-6.7.0-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:b8512bac933afc3e45fb2b18da8e59b78d4f408399a960339598374d4ae3b56b", size = 44410, upload-time = "2025-10-06T14:50:53.275Z" }, + { url = "https://files.pythonhosted.org/packages/42/e2/64bb41266427af6642b6b128e8774ed84c11b80a90702c13ac0a86bb10cc/multidict-6.7.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:79dcf9e477bc65414ebfea98ffd013cb39552b5ecd62908752e0e413d6d06e38", size = 43205, upload-time = "2025-10-06T14:50:54.911Z" }, + { url = "https://files.pythonhosted.org/packages/02/68/6b086fef8a3f1a8541b9236c594f0c9245617c29841f2e0395d979485cde/multidict-6.7.0-cp314-cp314-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:31bae522710064b5cbeddaf2e9f32b1abab70ac6ac91d42572502299e9953128", size = 245084, upload-time = "2025-10-06T14:50:56.369Z" }, + { url = "https://files.pythonhosted.org/packages/15/ee/f524093232007cd7a75c1d132df70f235cfd590a7c9eaccd7ff422ef4ae8/multidict-6.7.0-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:4a0df7ff02397bb63e2fd22af2c87dfa39e8c7f12947bc524dbdc528282c7e34", size = 252667, upload-time = "2025-10-06T14:50:57.991Z" }, + { url = "https://files.pythonhosted.org/packages/02/a5/eeb3f43ab45878f1895118c3ef157a480db58ede3f248e29b5354139c2c9/multidict-6.7.0-cp314-cp314-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:7a0222514e8e4c514660e182d5156a415c13ef0aabbd71682fc714e327b95e99", size = 233590, upload-time = "2025-10-06T14:50:59.589Z" }, + { url = "https://files.pythonhosted.org/packages/6a/1e/76d02f8270b97269d7e3dbd45644b1785bda457b474315f8cf999525a193/multidict-6.7.0-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:2397ab4daaf2698eb51a76721e98db21ce4f52339e535725de03ea962b5a3202", size = 264112, upload-time = "2025-10-06T14:51:01.183Z" }, + { url = "https://files.pythonhosted.org/packages/76/0b/c28a70ecb58963847c2a8efe334904cd254812b10e535aefb3bcce513918/multidict-6.7.0-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:8891681594162635948a636c9fe0ff21746aeb3dd5463f6e25d9bea3a8a39ca1", size = 261194, upload-time = "2025-10-06T14:51:02.794Z" }, + { url = "https://files.pythonhosted.org/packages/b4/63/2ab26e4209773223159b83aa32721b4021ffb08102f8ac7d689c943fded1/multidict-6.7.0-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:18706cc31dbf402a7945916dd5cddf160251b6dab8a2c5f3d6d5a55949f676b3", size = 248510, upload-time = "2025-10-06T14:51:04.724Z" }, + { url = "https://files.pythonhosted.org/packages/93/cd/06c1fa8282af1d1c46fd55c10a7930af652afdce43999501d4d68664170c/multidict-6.7.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:f844a1bbf1d207dd311a56f383f7eda2d0e134921d45751842d8235e7778965d", size = 248395, upload-time = "2025-10-06T14:51:06.306Z" }, + { url = "https://files.pythonhosted.org/packages/99/ac/82cb419dd6b04ccf9e7e61befc00c77614fc8134362488b553402ecd55ce/multidict-6.7.0-cp314-cp314-musllinux_1_2_armv7l.whl", hash = "sha256:d4393e3581e84e5645506923816b9cc81f5609a778c7e7534054091acc64d1c6", size = 239520, upload-time = "2025-10-06T14:51:08.091Z" }, + { url = "https://files.pythonhosted.org/packages/fa/f3/a0f9bf09493421bd8716a362e0cd1d244f5a6550f5beffdd6b47e885b331/multidict-6.7.0-cp314-cp314-musllinux_1_2_i686.whl", hash = "sha256:fbd18dc82d7bf274b37aa48d664534330af744e03bccf696d6f4c6042e7d19e7", size = 245479, upload-time = "2025-10-06T14:51:10.365Z" }, + { url = "https://files.pythonhosted.org/packages/8d/01/476d38fc73a212843f43c852b0eee266b6971f0e28329c2184a8df90c376/multidict-6.7.0-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:b6234e14f9314731ec45c42fc4554b88133ad53a09092cc48a88e771c125dadb", size = 258903, upload-time = "2025-10-06T14:51:12.466Z" }, + { url = "https://files.pythonhosted.org/packages/49/6d/23faeb0868adba613b817d0e69c5f15531b24d462af8012c4f6de4fa8dc3/multidict-6.7.0-cp314-cp314-musllinux_1_2_s390x.whl", hash = "sha256:08d4379f9744d8f78d98c8673c06e202ffa88296f009c71bbafe8a6bf847d01f", size = 252333, upload-time = "2025-10-06T14:51:14.48Z" }, + { url = "https://files.pythonhosted.org/packages/1e/cc/48d02ac22b30fa247f7dad82866e4b1015431092f4ba6ebc7e77596e0b18/multidict-6.7.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:9fe04da3f79387f450fd0061d4dd2e45a72749d31bf634aecc9e27f24fdc4b3f", size = 243411, upload-time = "2025-10-06T14:51:16.072Z" }, + { url = "https://files.pythonhosted.org/packages/4a/03/29a8bf5a18abf1fe34535c88adbdfa88c9fb869b5a3b120692c64abe8284/multidict-6.7.0-cp314-cp314-win32.whl", hash = "sha256:fbafe31d191dfa7c4c51f7a6149c9fb7e914dcf9ffead27dcfd9f1ae382b3885", size = 40940, upload-time = "2025-10-06T14:51:17.544Z" }, + { url = "https://files.pythonhosted.org/packages/82/16/7ed27b680791b939de138f906d5cf2b4657b0d45ca6f5dd6236fdddafb1a/multidict-6.7.0-cp314-cp314-win_amd64.whl", hash = "sha256:2f67396ec0310764b9222a1728ced1ab638f61aadc6226f17a71dd9324f9a99c", size = 45087, upload-time = "2025-10-06T14:51:18.875Z" }, + { url = "https://files.pythonhosted.org/packages/cd/3c/e3e62eb35a1950292fe39315d3c89941e30a9d07d5d2df42965ab041da43/multidict-6.7.0-cp314-cp314-win_arm64.whl", hash = "sha256:ba672b26069957ee369cfa7fc180dde1fc6f176eaf1e6beaf61fbebbd3d9c000", size = 42368, upload-time = "2025-10-06T14:51:20.225Z" }, + { url = "https://files.pythonhosted.org/packages/8b/40/cd499bd0dbc5f1136726db3153042a735fffd0d77268e2ee20d5f33c010f/multidict-6.7.0-cp314-cp314t-macosx_10_13_universal2.whl", hash = "sha256:c1dcc7524066fa918c6a27d61444d4ee7900ec635779058571f70d042d86ed63", size = 82326, upload-time = "2025-10-06T14:51:21.588Z" }, + { url = "https://files.pythonhosted.org/packages/13/8a/18e031eca251c8df76daf0288e6790561806e439f5ce99a170b4af30676b/multidict-6.7.0-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:27e0b36c2d388dc7b6ced3406671b401e84ad7eb0656b8f3a2f46ed0ce483718", size = 48065, upload-time = "2025-10-06T14:51:22.93Z" }, + { url = "https://files.pythonhosted.org/packages/40/71/5e6701277470a87d234e433fb0a3a7deaf3bcd92566e421e7ae9776319de/multidict-6.7.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:2a7baa46a22e77f0988e3b23d4ede5513ebec1929e34ee9495be535662c0dfe2", size = 46475, upload-time = "2025-10-06T14:51:24.352Z" }, + { url = "https://files.pythonhosted.org/packages/fe/6a/bab00cbab6d9cfb57afe1663318f72ec28289ea03fd4e8236bb78429893a/multidict-6.7.0-cp314-cp314t-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:7bf77f54997a9166a2f5675d1201520586439424c2511723a7312bdb4bcc034e", size = 239324, upload-time = "2025-10-06T14:51:25.822Z" }, + { url = "https://files.pythonhosted.org/packages/2a/5f/8de95f629fc22a7769ade8b41028e3e5a822c1f8904f618d175945a81ad3/multidict-6.7.0-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:e011555abada53f1578d63389610ac8a5400fc70ce71156b0aa30d326f1a5064", size = 246877, upload-time = "2025-10-06T14:51:27.604Z" }, + { url = "https://files.pythonhosted.org/packages/23/b4/38881a960458f25b89e9f4a4fdcb02ac101cfa710190db6e5528841e67de/multidict-6.7.0-cp314-cp314t-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:28b37063541b897fd6a318007373930a75ca6d6ac7c940dbe14731ffdd8d498e", size = 225824, upload-time = "2025-10-06T14:51:29.664Z" }, + { url = "https://files.pythonhosted.org/packages/1e/39/6566210c83f8a261575f18e7144736059f0c460b362e96e9cf797a24b8e7/multidict-6.7.0-cp314-cp314t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:05047ada7a2fde2631a0ed706f1fd68b169a681dfe5e4cf0f8e4cb6618bbc2cd", size = 253558, upload-time = "2025-10-06T14:51:31.684Z" }, + { url = "https://files.pythonhosted.org/packages/00/a3/67f18315100f64c269f46e6c0319fa87ba68f0f64f2b8e7fd7c72b913a0b/multidict-6.7.0-cp314-cp314t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:716133f7d1d946a4e1b91b1756b23c088881e70ff180c24e864c26192ad7534a", size = 252339, upload-time = "2025-10-06T14:51:33.699Z" }, + { url = "https://files.pythonhosted.org/packages/c8/2a/1cb77266afee2458d82f50da41beba02159b1d6b1f7973afc9a1cad1499b/multidict-6.7.0-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:d1bed1b467ef657f2a0ae62844a607909ef1c6889562de5e1d505f74457d0b96", size = 244895, upload-time = "2025-10-06T14:51:36.189Z" }, + { url = "https://files.pythonhosted.org/packages/dd/72/09fa7dd487f119b2eb9524946ddd36e2067c08510576d43ff68469563b3b/multidict-6.7.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:ca43bdfa5d37bd6aee89d85e1d0831fb86e25541be7e9d376ead1b28974f8e5e", size = 241862, upload-time = "2025-10-06T14:51:41.291Z" }, + { url = "https://files.pythonhosted.org/packages/65/92/bc1f8bd0853d8669300f732c801974dfc3702c3eeadae2f60cef54dc69d7/multidict-6.7.0-cp314-cp314t-musllinux_1_2_armv7l.whl", hash = "sha256:44b546bd3eb645fd26fb949e43c02a25a2e632e2ca21a35e2e132c8105dc8599", size = 232376, upload-time = "2025-10-06T14:51:43.55Z" }, + { url = "https://files.pythonhosted.org/packages/09/86/ac39399e5cb9d0c2ac8ef6e10a768e4d3bc933ac808d49c41f9dc23337eb/multidict-6.7.0-cp314-cp314t-musllinux_1_2_i686.whl", hash = "sha256:a6ef16328011d3f468e7ebc326f24c1445f001ca1dec335b2f8e66bed3006394", size = 240272, upload-time = "2025-10-06T14:51:45.265Z" }, + { url = "https://files.pythonhosted.org/packages/3d/b6/fed5ac6b8563ec72df6cb1ea8dac6d17f0a4a1f65045f66b6d3bf1497c02/multidict-6.7.0-cp314-cp314t-musllinux_1_2_ppc64le.whl", hash = "sha256:5aa873cbc8e593d361ae65c68f85faadd755c3295ea2c12040ee146802f23b38", size = 248774, upload-time = "2025-10-06T14:51:46.836Z" }, + { url = "https://files.pythonhosted.org/packages/6b/8d/b954d8c0dc132b68f760aefd45870978deec6818897389dace00fcde32ff/multidict-6.7.0-cp314-cp314t-musllinux_1_2_s390x.whl", hash = "sha256:3d7b6ccce016e29df4b7ca819659f516f0bc7a4b3efa3bb2012ba06431b044f9", size = 242731, upload-time = "2025-10-06T14:51:48.541Z" }, + { url = "https://files.pythonhosted.org/packages/16/9d/a2dac7009125d3540c2f54e194829ea18ac53716c61b655d8ed300120b0f/multidict-6.7.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:171b73bd4ee683d307599b66793ac80981b06f069b62eea1c9e29c9241aa66b0", size = 240193, upload-time = "2025-10-06T14:51:50.355Z" }, + { url = "https://files.pythonhosted.org/packages/39/ca/c05f144128ea232ae2178b008d5011d4e2cea86e4ee8c85c2631b1b94802/multidict-6.7.0-cp314-cp314t-win32.whl", hash = "sha256:b2d7f80c4e1fd010b07cb26820aae86b7e73b681ee4889684fb8d2d4537aab13", size = 48023, upload-time = "2025-10-06T14:51:51.883Z" }, + { url = "https://files.pythonhosted.org/packages/ba/8f/0a60e501584145588be1af5cc829265701ba3c35a64aec8e07cbb71d39bb/multidict-6.7.0-cp314-cp314t-win_amd64.whl", hash = "sha256:09929cab6fcb68122776d575e03c6cc64ee0b8fca48d17e135474b042ce515cd", size = 53507, upload-time = "2025-10-06T14:51:53.672Z" }, + { url = "https://files.pythonhosted.org/packages/7f/ae/3148b988a9c6239903e786eac19c889fab607c31d6efa7fb2147e5680f23/multidict-6.7.0-cp314-cp314t-win_arm64.whl", hash = "sha256:cc41db090ed742f32bd2d2c721861725e6109681eddf835d0a82bd3a5c382827", size = 44804, upload-time = "2025-10-06T14:51:55.415Z" }, + { url = "https://files.pythonhosted.org/packages/90/d7/4cf84257902265c4250769ac49f4eaab81c182ee9aff8bf59d2714dbb174/multidict-6.7.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:363eb68a0a59bd2303216d2346e6c441ba10d36d1f9969fcb6f1ba700de7bb5c", size = 77073, upload-time = "2025-10-06T14:51:57.386Z" }, + { url = "https://files.pythonhosted.org/packages/6d/51/194e999630a656e76c2965a1590d12faa5cd528170f2abaa04423e09fe8d/multidict-6.7.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:d874eb056410ca05fed180b6642e680373688efafc7f077b2a2f61811e873a40", size = 44928, upload-time = "2025-10-06T14:51:58.791Z" }, + { url = "https://files.pythonhosted.org/packages/e5/6b/2a195373c33068c9158e0941d0b46cfcc9c1d894ca2eb137d1128081dff0/multidict-6.7.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:8b55d5497b51afdfde55925e04a022f1de14d4f4f25cdfd4f5d9b0aa96166851", size = 44581, upload-time = "2025-10-06T14:52:00.174Z" }, + { url = "https://files.pythonhosted.org/packages/69/7b/7f4f2e644b6978bf011a5fd9a5ebb7c21de3f38523b1f7897d36a1ac1311/multidict-6.7.0-cp39-cp39-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:f8e5c0031b90ca9ce555e2e8fd5c3b02a25f14989cbc310701823832c99eb687", size = 239901, upload-time = "2025-10-06T14:52:02.416Z" }, + { url = "https://files.pythonhosted.org/packages/3c/b5/952c72786710a031aa204a9adf7db66d7f97a2c6573889d58b9e60fe6702/multidict-6.7.0-cp39-cp39-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:9cf41880c991716f3c7cec48e2f19ae4045fc9db5fc9cff27347ada24d710bb5", size = 240534, upload-time = "2025-10-06T14:52:04.105Z" }, + { url = "https://files.pythonhosted.org/packages/f3/ef/109fe1f2471e4c458c74242c7e4a833f2d9fc8a6813cd7ee345b0bad18f9/multidict-6.7.0-cp39-cp39-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:8cfc12a8630a29d601f48d47787bd7eb730e475e83edb5d6c5084317463373eb", size = 219545, upload-time = "2025-10-06T14:52:06.208Z" }, + { url = "https://files.pythonhosted.org/packages/42/bd/327d91288114967f9fe90dc53de70aa3fec1b9073e46aa32c4828f771a87/multidict-6.7.0-cp39-cp39-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:3996b50c3237c4aec17459217c1e7bbdead9a22a0fcd3c365564fbd16439dde6", size = 251187, upload-time = "2025-10-06T14:52:08.049Z" }, + { url = "https://files.pythonhosted.org/packages/f4/13/a8b078ebbaceb7819fd28cd004413c33b98f1b70d542a62e6a00b74fb09f/multidict-6.7.0-cp39-cp39-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:7f5170993a0dd3ab871c74f45c0a21a4e2c37a2f2b01b5f722a2ad9c6650469e", size = 249379, upload-time = "2025-10-06T14:52:09.831Z" }, + { url = "https://files.pythonhosted.org/packages/e3/6d/ab12e1246be4d65d1f55de1e6f6aaa9b8120eddcfdd1d290439c7833d5ce/multidict-6.7.0-cp39-cp39-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:ec81878ddf0e98817def1e77d4f50dae5ef5b0e4fe796fae3bd674304172416e", size = 239241, upload-time = "2025-10-06T14:52:11.561Z" }, + { url = "https://files.pythonhosted.org/packages/bb/d7/079a93625208c173b8fa756396814397c0fd9fee61ef87b75a748820b86e/multidict-6.7.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:9281bf5b34f59afbc6b1e477a372e9526b66ca446f4bf62592839c195a718b32", size = 237418, upload-time = "2025-10-06T14:52:13.671Z" }, + { url = "https://files.pythonhosted.org/packages/c9/29/03777c2212274aa9440918d604dc9d6af0e6b4558c611c32c3dcf1a13870/multidict-6.7.0-cp39-cp39-musllinux_1_2_armv7l.whl", hash = "sha256:68af405971779d8b37198726f2b6fe3955db846fee42db7a4286fc542203934c", size = 232987, upload-time = "2025-10-06T14:52:15.708Z" }, + { url = "https://files.pythonhosted.org/packages/d9/00/11188b68d85a84e8050ee34724d6ded19ad03975caebe0c8dcb2829b37bf/multidict-6.7.0-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:3ba3ef510467abb0667421a286dc906e30eb08569365f5cdb131d7aff7c2dd84", size = 240985, upload-time = "2025-10-06T14:52:17.317Z" }, + { url = "https://files.pythonhosted.org/packages/df/0c/12eef6aeda21859c6cdf7d75bd5516d83be3efe3d8cc45fd1a3037f5b9dc/multidict-6.7.0-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:b61189b29081a20c7e4e0b49b44d5d44bb0dc92be3c6d06a11cc043f81bf9329", size = 246855, upload-time = "2025-10-06T14:52:19.096Z" }, + { url = "https://files.pythonhosted.org/packages/69/f6/076120fd8bb3975f09228e288e08bff6b9f1bfd5166397c7ba284f622ab2/multidict-6.7.0-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:fb287618b9c7aa3bf8d825f02d9201b2f13078a5ed3b293c8f4d953917d84d5e", size = 241804, upload-time = "2025-10-06T14:52:21.166Z" }, + { url = "https://files.pythonhosted.org/packages/5f/51/41bb950c81437b88a93e6ddfca1d8763569ae861e638442838c4375f7497/multidict-6.7.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:521f33e377ff64b96c4c556b81c55d0cfffb96a11c194fd0c3f1e56f3d8dd5a4", size = 235321, upload-time = "2025-10-06T14:52:23.208Z" }, + { url = "https://files.pythonhosted.org/packages/5a/cf/5bbd31f055199d56c1f6b04bbadad3ccb24e6d5d4db75db774fc6d6674b8/multidict-6.7.0-cp39-cp39-win32.whl", hash = "sha256:ce8fdc2dca699f8dbf055a61d73eaa10482569ad20ee3c36ef9641f69afa8c91", size = 41435, upload-time = "2025-10-06T14:52:24.735Z" }, + { url = "https://files.pythonhosted.org/packages/af/01/547ffe9c2faec91c26965c152f3fea6cff068b6037401f61d310cc861ff4/multidict-6.7.0-cp39-cp39-win_amd64.whl", hash = "sha256:7e73299c99939f089dd9b2120a04a516b95cdf8c1cd2b18c53ebf0de80b1f18f", size = 46193, upload-time = "2025-10-06T14:52:26.101Z" }, + { url = "https://files.pythonhosted.org/packages/27/77/cfa5461d1d2651d6fc24216c92b4a21d4e385a41c46e0d9f3b070675167b/multidict-6.7.0-cp39-cp39-win_arm64.whl", hash = "sha256:6bdce131e14b04fd34a809b6380dbfd826065c3e2fe8a50dbae659fa0c390546", size = 43118, upload-time = "2025-10-06T14:52:27.876Z" }, + { url = "https://files.pythonhosted.org/packages/b7/da/7d22601b625e241d4f23ef1ebff8acfc60da633c9e7e7922e24d10f592b3/multidict-6.7.0-py3-none-any.whl", hash = "sha256:394fc5c42a333c9ffc3e421a4c85e08580d990e08b99f6bf35b4132114c5dcb3", size = 12317, upload-time = "2025-10-06T14:52:29.272Z" }, +] + +[[package]] +name = "myst-parser" +version = "3.0.1" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version == '3.9.*'", + "python_full_version < '3.9'", +] +dependencies = [ + { name = "docutils", version = "0.20.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.9'" }, + { name = "docutils", version = "0.21.2", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version == '3.9.*'" }, + { name = "jinja2", marker = "python_full_version < '3.10'" }, + { name = "markdown-it-py", marker = "python_full_version < '3.10'" }, + { name = "mdit-py-plugins", version = "0.4.2", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.10'" }, + { name = "pyyaml", marker = "python_full_version < '3.10'" }, + { name = "sphinx", version = "7.1.2", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.9'" }, + { name = "sphinx", version = "7.4.7", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version == '3.9.*'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/49/64/e2f13dac02f599980798c01156393b781aec983b52a6e4057ee58f07c43a/myst_parser-3.0.1.tar.gz", hash = "sha256:88f0cb406cb363b077d176b51c476f62d60604d68a8dcdf4832e080441301a87", size = 92392, upload-time = "2024-04-28T20:22:42.116Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/e2/de/21aa8394f16add8f7427f0a1326ccd2b3a2a8a3245c9252bc5ac034c6155/myst_parser-3.0.1-py3-none-any.whl", hash = "sha256:6457aaa33a5d474aca678b8ead9b3dc298e89c68e67012e73146ea6fd54babf1", size = 83163, upload-time = "2024-04-28T20:22:39.985Z" }, +] + +[[package]] +name = "myst-parser" +version = "4.0.1" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version >= '3.14'", + "python_full_version >= '3.11' and python_full_version < '3.14'", + "python_full_version == '3.10.*'", +] +dependencies = [ + { name = "docutils", version = "0.21.2", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.10'" }, + { name = "jinja2", marker = "python_full_version >= '3.10'" }, + { name = "markdown-it-py", marker = "python_full_version >= '3.10'" }, + { name = "mdit-py-plugins", version = "0.5.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.10'" }, + { name = "pyyaml", marker = "python_full_version >= '3.10'" }, + { name = "sphinx", version = "8.1.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version == '3.10.*'" }, + { name = "sphinx", version = "8.2.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/66/a5/9626ba4f73555b3735ad86247a8077d4603aa8628537687c839ab08bfe44/myst_parser-4.0.1.tar.gz", hash = "sha256:5cfea715e4f3574138aecbf7d54132296bfd72bb614d31168f48c477a830a7c4", size = 93985, upload-time = "2025-02-12T10:53:03.833Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/5f/df/76d0321c3797b54b60fef9ec3bd6f4cfd124b9e422182156a1dd418722cf/myst_parser-4.0.1-py3-none-any.whl", hash = "sha256:9134e88959ec3b5780aedf8a99680ea242869d012e8821db3126d427edc9c95d", size = 84579, upload-time = "2025-02-12T10:53:02.078Z" }, +] + +[[package]] +name = "nbclient" +version = "0.10.1" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version < '3.9'", +] +dependencies = [ + { name = "jupyter-client", marker = "python_full_version < '3.9'" }, + { name = "jupyter-core", version = "5.8.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.9'" }, + { name = "nbformat", marker = "python_full_version < '3.9'" }, + { name = "traitlets", marker = "python_full_version < '3.9'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/06/db/25929926860ba8a3f6123d2d0a235e558e0e4be7b46e9db063a7dfefa0a2/nbclient-0.10.1.tar.gz", hash = "sha256:3e93e348ab27e712acd46fccd809139e356eb9a31aab641d1a7991a6eb4e6f68", size = 62273, upload-time = "2024-11-29T08:28:38.47Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/26/1a/ed6d1299b1a00c1af4a033fdee565f533926d819e084caf0d2832f6f87c6/nbclient-0.10.1-py3-none-any.whl", hash = "sha256:949019b9240d66897e442888cfb618f69ef23dc71c01cb5fced8499c2cfc084d", size = 25344, upload-time = "2024-11-29T08:28:21.844Z" }, +] + +[[package]] +name = "nbclient" +version = "0.10.2" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version >= '3.14'", + "python_full_version >= '3.11' and python_full_version < '3.14'", + "python_full_version == '3.10.*'", + "python_full_version == '3.9.*'", +] +dependencies = [ + { name = "jupyter-client", marker = "python_full_version >= '3.9'" }, + { name = "jupyter-core", version = "5.8.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version == '3.9.*'" }, + { name = "jupyter-core", version = "5.9.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.10'" }, + { name = "nbformat", marker = "python_full_version >= '3.9'" }, + { name = "traitlets", marker = "python_full_version >= '3.9'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/87/66/7ffd18d58eae90d5721f9f39212327695b749e23ad44b3881744eaf4d9e8/nbclient-0.10.2.tar.gz", hash = "sha256:90b7fc6b810630db87a6d0c2250b1f0ab4cf4d3c27a299b0cde78a4ed3fd9193", size = 62424, upload-time = "2024-12-19T10:32:27.164Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/34/6d/e7fa07f03a4a7b221d94b4d586edb754a9b0dc3c9e2c93353e9fa4e0d117/nbclient-0.10.2-py3-none-any.whl", hash = "sha256:4ffee11e788b4a27fabeb7955547e4318a5298f34342a4bfd01f2e1faaeadc3d", size = 25434, upload-time = "2024-12-19T10:32:24.139Z" }, +] + +[[package]] +name = "nbconvert" +version = "7.16.6" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "beautifulsoup4" }, + { name = "bleach", version = "6.1.0", source = { registry = "https://pypi.org/simple" }, extra = ["css"], marker = "python_full_version < '3.9'" }, + { name = "bleach", version = "6.2.0", source = { registry = "https://pypi.org/simple" }, extra = ["css"], marker = "python_full_version == '3.9.*'" }, + { name = "bleach", version = "6.3.0", source = { registry = "https://pypi.org/simple" }, extra = ["css"], marker = "python_full_version >= '3.10'" }, + { name = "defusedxml" }, + { name = "importlib-metadata", version = "8.5.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.9'" }, + { name = "importlib-metadata", version = "8.7.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version == '3.9.*'" }, + { name = "jinja2" }, + { name = "jupyter-core", version = "5.8.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.10'" }, + { name = "jupyter-core", version = "5.9.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.10'" }, + { name = "jupyterlab-pygments" }, + { name = "markupsafe", version = "2.1.5", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.9'" }, + { name = "markupsafe", version = "3.0.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.9'" }, + { name = "mistune" }, + { name = "nbclient", version = "0.10.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.9'" }, + { name = "nbclient", version = "0.10.2", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.9'" }, + { name = "nbformat" }, + { name = "packaging" }, + { name = "pandocfilters" }, + { name = "pygments" }, + { name = "traitlets" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/a3/59/f28e15fc47ffb73af68a8d9b47367a8630d76e97ae85ad18271b9db96fdf/nbconvert-7.16.6.tar.gz", hash = "sha256:576a7e37c6480da7b8465eefa66c17844243816ce1ccc372633c6b71c3c0f582", size = 857715, upload-time = "2025-01-28T09:29:14.724Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/cc/9a/cd673b2f773a12c992f41309ef81b99da1690426bd2f96957a7ade0d3ed7/nbconvert-7.16.6-py3-none-any.whl", hash = "sha256:1375a7b67e0c2883678c48e506dc320febb57685e5ee67faa51b18a90f3a712b", size = 258525, upload-time = "2025-01-28T09:29:12.551Z" }, +] + +[[package]] +name = "nbformat" +version = "5.10.4" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "fastjsonschema" }, + { name = "jsonschema", version = "4.23.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.9'" }, + { name = "jsonschema", version = "4.25.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.9'" }, + { name = "jupyter-core", version = "5.8.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.10'" }, + { name = "jupyter-core", version = "5.9.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.10'" }, + { name = "traitlets" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/6d/fd/91545e604bc3dad7dca9ed03284086039b294c6b3d75c0d2fa45f9e9caf3/nbformat-5.10.4.tar.gz", hash = "sha256:322168b14f937a5d11362988ecac2a4952d3d8e3a2cbeb2319584631226d5b3a", size = 142749, upload-time = "2024-04-04T11:20:37.371Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/a9/82/0340caa499416c78e5d8f5f05947ae4bc3cba53c9f038ab6e9ed964e22f1/nbformat-5.10.4-py3-none-any.whl", hash = "sha256:3b48d6c8fbca4b299bf3982ea7db1af21580e4fec269ad087b9e81588891200b", size = 78454, upload-time = "2024-04-04T11:20:34.895Z" }, +] + +[[package]] +name = "nest-asyncio" +version = "1.6.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/83/f8/51569ac65d696c8ecbee95938f89d4abf00f47d58d48f6fbabfe8f0baefe/nest_asyncio-1.6.0.tar.gz", hash = "sha256:6f172d5449aca15afd6c646851f4e31e02c598d553a667e38cafa997cfec55fe", size = 7418, upload-time = "2024-01-21T14:25:19.227Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/a0/c4/c2971a3ba4c6103a3d10c4b0f24f461ddc027f0f09763220cf35ca1401b3/nest_asyncio-1.6.0-py3-none-any.whl", hash = "sha256:87af6efd6b5e897c81050477ef65c62e2b2f35d51703cae01aff2905b1852e1c", size = 5195, upload-time = "2024-01-21T14:25:17.223Z" }, +] + +[[package]] +name = "nh3" +version = "0.3.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/ca/a5/34c26015d3a434409f4d2a1cd8821a06c05238703f49283ffeb937bef093/nh3-0.3.2.tar.gz", hash = "sha256:f394759a06df8b685a4ebfb1874fb67a9cbfd58c64fc5ed587a663c0e63ec376", size = 19288, upload-time = "2025-10-30T11:17:45.948Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/5b/01/a1eda067c0ba823e5e2bb033864ae4854549e49fb6f3407d2da949106bfb/nh3-0.3.2-cp314-cp314t-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl", hash = "sha256:d18957a90806d943d141cc5e4a0fefa1d77cf0d7a156878bf9a66eed52c9cc7d", size = 1419839, upload-time = "2025-10-30T11:17:09.956Z" }, + { url = "https://files.pythonhosted.org/packages/30/57/07826ff65d59e7e9cc789ef1dc405f660cabd7458a1864ab58aefa17411b/nh3-0.3.2-cp314-cp314t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:45c953e57028c31d473d6b648552d9cab1efe20a42ad139d78e11d8f42a36130", size = 791183, upload-time = "2025-10-30T11:17:11.99Z" }, + { url = "https://files.pythonhosted.org/packages/af/2f/e8a86f861ad83f3bb5455f596d5c802e34fcdb8c53a489083a70fd301333/nh3-0.3.2-cp314-cp314t-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:2c9850041b77a9147d6bbd6dbbf13eeec7009eb60b44e83f07fcb2910075bf9b", size = 829127, upload-time = "2025-10-30T11:17:13.192Z" }, + { url = "https://files.pythonhosted.org/packages/d8/97/77aef4daf0479754e8e90c7f8f48f3b7b8725a3b8c0df45f2258017a6895/nh3-0.3.2-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:403c11563e50b915d0efdb622866d1d9e4506bce590ef7da57789bf71dd148b5", size = 997131, upload-time = "2025-10-30T11:17:14.677Z" }, + { url = "https://files.pythonhosted.org/packages/41/ee/fd8140e4df9d52143e89951dd0d797f5546004c6043285289fbbe3112293/nh3-0.3.2-cp314-cp314t-musllinux_1_2_armv7l.whl", hash = "sha256:0dca4365db62b2d71ff1620ee4f800c4729849906c5dd504ee1a7b2389558e31", size = 1068783, upload-time = "2025-10-30T11:17:15.861Z" }, + { url = "https://files.pythonhosted.org/packages/87/64/bdd9631779e2d588b08391f7555828f352e7f6427889daf2fa424bfc90c9/nh3-0.3.2-cp314-cp314t-musllinux_1_2_i686.whl", hash = "sha256:0fe7ee035dd7b2290715baf29cb27167dddd2ff70ea7d052c958dbd80d323c99", size = 994732, upload-time = "2025-10-30T11:17:17.155Z" }, + { url = "https://files.pythonhosted.org/packages/79/66/90190033654f1f28ca98e3d76b8be1194505583f9426b0dcde782a3970a2/nh3-0.3.2-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:a40202fd58e49129764f025bbaae77028e420f1d5b3c8e6f6fd3a6490d513868", size = 975997, upload-time = "2025-10-30T11:17:18.77Z" }, + { url = "https://files.pythonhosted.org/packages/34/30/ebf8e2e8d71fdb5a5d5d8836207177aed1682df819cbde7f42f16898946c/nh3-0.3.2-cp314-cp314t-win32.whl", hash = "sha256:1f9ba555a797dbdcd844b89523f29cdc90973d8bd2e836ea6b962cf567cadd93", size = 583364, upload-time = "2025-10-30T11:17:20.286Z" }, + { url = "https://files.pythonhosted.org/packages/94/ae/95c52b5a75da429f11ca8902c2128f64daafdc77758d370e4cc310ecda55/nh3-0.3.2-cp314-cp314t-win_amd64.whl", hash = "sha256:dce4248edc427c9b79261f3e6e2b3ecbdd9b88c267012168b4a7b3fc6fd41d13", size = 589982, upload-time = "2025-10-30T11:17:21.384Z" }, + { url = "https://files.pythonhosted.org/packages/b4/bd/c7d862a4381b95f2469704de32c0ad419def0f4a84b7a138a79532238114/nh3-0.3.2-cp314-cp314t-win_arm64.whl", hash = "sha256:019ecbd007536b67fdf76fab411b648fb64e2257ca3262ec80c3425c24028c80", size = 577126, upload-time = "2025-10-30T11:17:22.755Z" }, + { url = "https://files.pythonhosted.org/packages/b6/3e/f5a5cc2885c24be13e9b937441bd16a012ac34a657fe05e58927e8af8b7a/nh3-0.3.2-cp38-abi3-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl", hash = "sha256:7064ccf5ace75825bd7bf57859daaaf16ed28660c1c6b306b649a9eda4b54b1e", size = 1431980, upload-time = "2025-10-30T11:17:25.457Z" }, + { url = "https://files.pythonhosted.org/packages/7f/f7/529a99324d7ef055de88b690858f4189379708abae92ace799365a797b7f/nh3-0.3.2-cp38-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c8745454cdd28bbbc90861b80a0111a195b0e3961b9fa2e672be89eb199fa5d8", size = 820805, upload-time = "2025-10-30T11:17:26.98Z" }, + { url = "https://files.pythonhosted.org/packages/3d/62/19b7c50ccd1fa7d0764822d2cea8f2a320f2fd77474c7a1805cb22cf69b0/nh3-0.3.2-cp38-abi3-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:72d67c25a84579f4a432c065e8b4274e53b7cf1df8f792cf846abfe2c3090866", size = 803527, upload-time = "2025-10-30T11:17:28.284Z" }, + { url = "https://files.pythonhosted.org/packages/4a/ca/f022273bab5440abff6302731a49410c5ef66b1a9502ba3fbb2df998d9ff/nh3-0.3.2-cp38-abi3-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:13398e676a14d6233f372c75f52d5ae74f98210172991f7a3142a736bd92b131", size = 1051674, upload-time = "2025-10-30T11:17:29.909Z" }, + { url = "https://files.pythonhosted.org/packages/fa/f7/5728e3b32a11daf5bd21cf71d91c463f74305938bc3eb9e0ac1ce141646e/nh3-0.3.2-cp38-abi3-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:03d617e5c8aa7331bd2659c654e021caf9bba704b109e7b2b28b039a00949fe5", size = 1004737, upload-time = "2025-10-30T11:17:31.205Z" }, + { url = "https://files.pythonhosted.org/packages/53/7f/f17e0dba0a99cee29e6cee6d4d52340ef9cb1f8a06946d3a01eb7ec2fb01/nh3-0.3.2-cp38-abi3-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f2f55c4d2d5a207e74eefe4d828067bbb01300e06e2a7436142f915c5928de07", size = 911745, upload-time = "2025-10-30T11:17:32.945Z" }, + { url = "https://files.pythonhosted.org/packages/42/0f/c76bf3dba22c73c38e9b1113b017cf163f7696f50e003404ec5ecdb1e8a6/nh3-0.3.2-cp38-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7bb18403f02b655a1bbe4e3a4696c2ae1d6ae8f5991f7cacb684b1ae27e6c9f7", size = 797184, upload-time = "2025-10-30T11:17:34.226Z" }, + { url = "https://files.pythonhosted.org/packages/08/a1/73d8250f888fb0ddf1b119b139c382f8903d8bb0c5bd1f64afc7e38dad1d/nh3-0.3.2-cp38-abi3-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:6d66f41672eb4060cf87c037f760bdbc6847852ca9ef8e9c5a5da18f090abf87", size = 838556, upload-time = "2025-10-30T11:17:35.875Z" }, + { url = "https://files.pythonhosted.org/packages/d1/09/deb57f1fb656a7a5192497f4a287b0ade5a2ff6b5d5de4736d13ef6d2c1f/nh3-0.3.2-cp38-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:f97f8b25cb2681d25e2338148159447e4d689aafdccfcf19e61ff7db3905768a", size = 1006695, upload-time = "2025-10-30T11:17:37.071Z" }, + { url = "https://files.pythonhosted.org/packages/b6/61/8f4d41c4ccdac30e4b1a4fa7be4b0f9914d8314a5058472f84c8e101a418/nh3-0.3.2-cp38-abi3-musllinux_1_2_armv7l.whl", hash = "sha256:2ab70e8c6c7d2ce953d2a58102eefa90c2d0a5ed7aa40c7e29a487bc5e613131", size = 1075471, upload-time = "2025-10-30T11:17:38.225Z" }, + { url = "https://files.pythonhosted.org/packages/b0/c6/966aec0cb4705e69f6c3580422c239205d5d4d0e50fac380b21e87b6cf1b/nh3-0.3.2-cp38-abi3-musllinux_1_2_i686.whl", hash = "sha256:1710f3901cd6440ca92494ba2eb6dc260f829fa8d9196b659fa10de825610ce0", size = 1002439, upload-time = "2025-10-30T11:17:39.553Z" }, + { url = "https://files.pythonhosted.org/packages/e2/c8/97a2d5f7a314cce2c5c49f30c6f161b7f3617960ade4bfc2fd1ee092cb20/nh3-0.3.2-cp38-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:91e9b001101fb4500a2aafe3e7c92928d85242d38bf5ac0aba0b7480da0a4cd6", size = 987439, upload-time = "2025-10-30T11:17:40.81Z" }, + { url = "https://files.pythonhosted.org/packages/0d/95/2d6fc6461687d7a171f087995247dec33e8749a562bfadd85fb5dbf37a11/nh3-0.3.2-cp38-abi3-win32.whl", hash = "sha256:169db03df90da63286e0560ea0efa9b6f3b59844a9735514a1d47e6bb2c8c61b", size = 589826, upload-time = "2025-10-30T11:17:42.239Z" }, + { url = "https://files.pythonhosted.org/packages/64/9a/1a1c154f10a575d20dd634e5697805e589bbdb7673a0ad00e8da90044ba7/nh3-0.3.2-cp38-abi3-win_amd64.whl", hash = "sha256:562da3dca7a17f9077593214a9781a94b8d76de4f158f8c895e62f09573945fe", size = 596406, upload-time = "2025-10-30T11:17:43.773Z" }, + { url = "https://files.pythonhosted.org/packages/9e/7e/a96255f63b7aef032cbee8fc4d6e37def72e3aaedc1f72759235e8f13cb1/nh3-0.3.2-cp38-abi3-win_arm64.whl", hash = "sha256:cf5964d54edd405e68583114a7cba929468bcd7db5e676ae38ee954de1cfc104", size = 584162, upload-time = "2025-10-30T11:17:44.96Z" }, +] + +[[package]] +name = "notebook-shim" +version = "0.2.4" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "jupyter-server", version = "2.14.2", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.9'" }, + { name = "jupyter-server", version = "2.17.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.9'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/54/d2/92fa3243712b9a3e8bafaf60aac366da1cada3639ca767ff4b5b3654ec28/notebook_shim-0.2.4.tar.gz", hash = "sha256:b4b2cfa1b65d98307ca24361f5b30fe785b53c3fd07b7a47e89acb5e6ac638cb", size = 13167, upload-time = "2024-02-14T23:35:18.353Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/f9/33/bd5b9137445ea4b680023eb0469b2bb969d61303dedb2aac6560ff3d14a1/notebook_shim-0.2.4-py3-none-any.whl", hash = "sha256:411a5be4e9dc882a074ccbcae671eda64cceb068767e9a3419096986560e1cef", size = 13307, upload-time = "2024-02-14T23:35:16.286Z" }, +] + +[[package]] +name = "numpy" +version = "1.24.4" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version < '3.9'", +] +sdist = { url = "https://files.pythonhosted.org/packages/a4/9b/027bec52c633f6556dba6b722d9a0befb40498b9ceddd29cbe67a45a127c/numpy-1.24.4.tar.gz", hash = "sha256:80f5e3a4e498641401868df4208b74581206afbee7cf7b8329daae82676d9463", size = 10911229, upload-time = "2023-06-26T13:39:33.218Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/6b/80/6cdfb3e275d95155a34659163b83c09e3a3ff9f1456880bec6cc63d71083/numpy-1.24.4-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:c0bfb52d2169d58c1cdb8cc1f16989101639b34c7d3ce60ed70b19c63eba0b64", size = 19789140, upload-time = "2023-06-26T13:22:33.184Z" }, + { url = "https://files.pythonhosted.org/packages/64/5f/3f01d753e2175cfade1013eea08db99ba1ee4bdb147ebcf3623b75d12aa7/numpy-1.24.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:ed094d4f0c177b1b8e7aa9cba7d6ceed51c0e569a5318ac0ca9a090680a6a1b1", size = 13854297, upload-time = "2023-06-26T13:22:59.541Z" }, + { url = "https://files.pythonhosted.org/packages/5a/b3/2f9c21d799fa07053ffa151faccdceeb69beec5a010576b8991f614021f7/numpy-1.24.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:79fc682a374c4a8ed08b331bef9c5f582585d1048fa6d80bc6c35bc384eee9b4", size = 13995611, upload-time = "2023-06-26T13:23:22.167Z" }, + { url = "https://files.pythonhosted.org/packages/10/be/ae5bf4737cb79ba437879915791f6f26d92583c738d7d960ad94e5c36adf/numpy-1.24.4-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7ffe43c74893dbf38c2b0a1f5428760a1a9c98285553c89e12d70a96a7f3a4d6", size = 17282357, upload-time = "2023-06-26T13:23:51.446Z" }, + { url = "https://files.pythonhosted.org/packages/c0/64/908c1087be6285f40e4b3e79454552a701664a079321cff519d8c7051d06/numpy-1.24.4-cp310-cp310-win32.whl", hash = "sha256:4c21decb6ea94057331e111a5bed9a79d335658c27ce2adb580fb4d54f2ad9bc", size = 12429222, upload-time = "2023-06-26T13:24:13.849Z" }, + { url = "https://files.pythonhosted.org/packages/22/55/3d5a7c1142e0d9329ad27cece17933b0e2ab4e54ddc5c1861fbfeb3f7693/numpy-1.24.4-cp310-cp310-win_amd64.whl", hash = "sha256:b4bea75e47d9586d31e892a7401f76e909712a0fd510f58f5337bea9572c571e", size = 14841514, upload-time = "2023-06-26T13:24:38.129Z" }, + { url = "https://files.pythonhosted.org/packages/a9/cc/5ed2280a27e5dab12994c884f1f4d8c3bd4d885d02ae9e52a9d213a6a5e2/numpy-1.24.4-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:f136bab9c2cfd8da131132c2cf6cc27331dd6fae65f95f69dcd4ae3c3639c810", size = 19775508, upload-time = "2023-06-26T13:25:08.882Z" }, + { url = "https://files.pythonhosted.org/packages/c0/bc/77635c657a3668cf652806210b8662e1aff84b818a55ba88257abf6637a8/numpy-1.24.4-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:e2926dac25b313635e4d6cf4dc4e51c8c0ebfed60b801c799ffc4c32bf3d1254", size = 13840033, upload-time = "2023-06-26T13:25:33.417Z" }, + { url = "https://files.pythonhosted.org/packages/a7/4c/96cdaa34f54c05e97c1c50f39f98d608f96f0677a6589e64e53104e22904/numpy-1.24.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:222e40d0e2548690405b0b3c7b21d1169117391c2e82c378467ef9ab4c8f0da7", size = 13991951, upload-time = "2023-06-26T13:25:55.725Z" }, + { url = "https://files.pythonhosted.org/packages/22/97/dfb1a31bb46686f09e68ea6ac5c63fdee0d22d7b23b8f3f7ea07712869ef/numpy-1.24.4-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7215847ce88a85ce39baf9e89070cb860c98fdddacbaa6c0da3ffb31b3350bd5", size = 17278923, upload-time = "2023-06-26T13:26:25.658Z" }, + { url = "https://files.pythonhosted.org/packages/35/e2/76a11e54139654a324d107da1d98f99e7aa2a7ef97cfd7c631fba7dbde71/numpy-1.24.4-cp311-cp311-win32.whl", hash = "sha256:4979217d7de511a8d57f4b4b5b2b965f707768440c17cb70fbf254c4b225238d", size = 12422446, upload-time = "2023-06-26T13:26:49.302Z" }, + { url = "https://files.pythonhosted.org/packages/d8/ec/ebef2f7d7c28503f958f0f8b992e7ce606fb74f9e891199329d5f5f87404/numpy-1.24.4-cp311-cp311-win_amd64.whl", hash = "sha256:b7b1fc9864d7d39e28f41d089bfd6353cb5f27ecd9905348c24187a768c79694", size = 14834466, upload-time = "2023-06-26T13:27:16.029Z" }, + { url = "https://files.pythonhosted.org/packages/11/10/943cfb579f1a02909ff96464c69893b1d25be3731b5d3652c2e0cf1281ea/numpy-1.24.4-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:1452241c290f3e2a312c137a9999cdbf63f78864d63c79039bda65ee86943f61", size = 19780722, upload-time = "2023-06-26T13:27:49.573Z" }, + { url = "https://files.pythonhosted.org/packages/a7/ae/f53b7b265fdc701e663fbb322a8e9d4b14d9cb7b2385f45ddfabfc4327e4/numpy-1.24.4-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:04640dab83f7c6c85abf9cd729c5b65f1ebd0ccf9de90b270cd61935eef0197f", size = 13843102, upload-time = "2023-06-26T13:28:12.288Z" }, + { url = "https://files.pythonhosted.org/packages/25/6f/2586a50ad72e8dbb1d8381f837008a0321a3516dfd7cb57fc8cf7e4bb06b/numpy-1.24.4-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a5425b114831d1e77e4b5d812b69d11d962e104095a5b9c3b641a218abcc050e", size = 14039616, upload-time = "2023-06-26T13:28:35.659Z" }, + { url = "https://files.pythonhosted.org/packages/98/5d/5738903efe0ecb73e51eb44feafba32bdba2081263d40c5043568ff60faf/numpy-1.24.4-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dd80e219fd4c71fc3699fc1dadac5dcf4fd882bfc6f7ec53d30fa197b8ee22dc", size = 17316263, upload-time = "2023-06-26T13:29:09.272Z" }, + { url = "https://files.pythonhosted.org/packages/d1/57/8d328f0b91c733aa9aa7ee540dbc49b58796c862b4fbcb1146c701e888da/numpy-1.24.4-cp38-cp38-win32.whl", hash = "sha256:4602244f345453db537be5314d3983dbf5834a9701b7723ec28923e2889e0bb2", size = 12455660, upload-time = "2023-06-26T13:29:33.434Z" }, + { url = "https://files.pythonhosted.org/packages/69/65/0d47953afa0ad569d12de5f65d964321c208492064c38fe3b0b9744f8d44/numpy-1.24.4-cp38-cp38-win_amd64.whl", hash = "sha256:692f2e0f55794943c5bfff12b3f56f99af76f902fc47487bdfe97856de51a706", size = 14868112, upload-time = "2023-06-26T13:29:58.385Z" }, + { url = "https://files.pythonhosted.org/packages/9a/cd/d5b0402b801c8a8b56b04c1e85c6165efab298d2f0ab741c2406516ede3a/numpy-1.24.4-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:2541312fbf09977f3b3ad449c4e5f4bb55d0dbf79226d7724211acc905049400", size = 19816549, upload-time = "2023-06-26T13:30:36.976Z" }, + { url = "https://files.pythonhosted.org/packages/14/27/638aaa446f39113a3ed38b37a66243e21b38110d021bfcb940c383e120f2/numpy-1.24.4-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:9667575fb6d13c95f1b36aca12c5ee3356bf001b714fc354eb5465ce1609e62f", size = 13879950, upload-time = "2023-06-26T13:31:01.787Z" }, + { url = "https://files.pythonhosted.org/packages/8f/27/91894916e50627476cff1a4e4363ab6179d01077d71b9afed41d9e1f18bf/numpy-1.24.4-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f3a86ed21e4f87050382c7bc96571755193c4c1392490744ac73d660e8f564a9", size = 14030228, upload-time = "2023-06-26T13:31:26.696Z" }, + { url = "https://files.pythonhosted.org/packages/7a/7c/d7b2a0417af6428440c0ad7cb9799073e507b1a465f827d058b826236964/numpy-1.24.4-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d11efb4dbecbdf22508d55e48d9c8384db795e1b7b51ea735289ff96613ff74d", size = 17311170, upload-time = "2023-06-26T13:31:56.615Z" }, + { url = "https://files.pythonhosted.org/packages/18/9d/e02ace5d7dfccee796c37b995c63322674daf88ae2f4a4724c5dd0afcc91/numpy-1.24.4-cp39-cp39-win32.whl", hash = "sha256:6620c0acd41dbcb368610bb2f4d83145674040025e5536954782467100aa8835", size = 12454918, upload-time = "2023-06-26T13:32:16.8Z" }, + { url = "https://files.pythonhosted.org/packages/63/38/6cc19d6b8bfa1d1a459daf2b3fe325453153ca7019976274b6f33d8b5663/numpy-1.24.4-cp39-cp39-win_amd64.whl", hash = "sha256:befe2bf740fd8373cf56149a5c23a0f601e82869598d41f8e188a0e9869926f8", size = 14867441, upload-time = "2023-06-26T13:32:40.521Z" }, + { url = "https://files.pythonhosted.org/packages/a4/fd/8dff40e25e937c94257455c237b9b6bf5a30d42dd1cc11555533be099492/numpy-1.24.4-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:31f13e25b4e304632a4619d0e0777662c2ffea99fcae2029556b17d8ff958aef", size = 19156590, upload-time = "2023-06-26T13:33:10.36Z" }, + { url = "https://files.pythonhosted.org/packages/42/e7/4bf953c6e05df90c6d351af69966384fed8e988d0e8c54dad7103b59f3ba/numpy-1.24.4-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:95f7ac6540e95bc440ad77f56e520da5bf877f87dca58bd095288dce8940532a", size = 16705744, upload-time = "2023-06-26T13:33:36.703Z" }, + { url = "https://files.pythonhosted.org/packages/fc/dd/9106005eb477d022b60b3817ed5937a43dad8fd1f20b0610ea8a32fcb407/numpy-1.24.4-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:e98f220aa76ca2a977fe435f5b04d7b3470c0a2e6312907b37ba6068f26787f2", size = 14734290, upload-time = "2023-06-26T13:34:05.409Z" }, +] + +[[package]] +name = "numpy" +version = "1.26.4" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version >= '3.14'", + "python_full_version >= '3.11' and python_full_version < '3.14'", + "python_full_version == '3.10.*'", + "python_full_version == '3.9.*'", +] +sdist = { url = "https://files.pythonhosted.org/packages/65/6e/09db70a523a96d25e115e71cc56a6f9031e7b8cd166c1ac8438307c14058/numpy-1.26.4.tar.gz", hash = "sha256:2a02aba9ed12e4ac4eb3ea9421c420301a0c6460d9830d74a9df87efa4912010", size = 15786129, upload-time = "2024-02-06T00:26:44.495Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/a7/94/ace0fdea5241a27d13543ee117cbc65868e82213fb31a8eb7fe9ff23f313/numpy-1.26.4-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:9ff0f4f29c51e2803569d7a51c2304de5554655a60c5d776e35b4a41413830d0", size = 20631468, upload-time = "2024-02-05T23:48:01.194Z" }, + { url = "https://files.pythonhosted.org/packages/20/f7/b24208eba89f9d1b58c1668bc6c8c4fd472b20c45573cb767f59d49fb0f6/numpy-1.26.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:2e4ee3380d6de9c9ec04745830fd9e2eccb3e6cf790d39d7b98ffd19b0dd754a", size = 13966411, upload-time = "2024-02-05T23:48:29.038Z" }, + { url = "https://files.pythonhosted.org/packages/fc/a5/4beee6488160798683eed5bdb7eead455892c3b4e1f78d79d8d3f3b084ac/numpy-1.26.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d209d8969599b27ad20994c8e41936ee0964e6da07478d6c35016bc386b66ad4", size = 14219016, upload-time = "2024-02-05T23:48:54.098Z" }, + { url = "https://files.pythonhosted.org/packages/4b/d7/ecf66c1cd12dc28b4040b15ab4d17b773b87fa9d29ca16125de01adb36cd/numpy-1.26.4-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ffa75af20b44f8dba823498024771d5ac50620e6915abac414251bd971b4529f", size = 18240889, upload-time = "2024-02-05T23:49:25.361Z" }, + { url = "https://files.pythonhosted.org/packages/24/03/6f229fe3187546435c4f6f89f6d26c129d4f5bed40552899fcf1f0bf9e50/numpy-1.26.4-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:62b8e4b1e28009ef2846b4c7852046736bab361f7aeadeb6a5b89ebec3c7055a", size = 13876746, upload-time = "2024-02-05T23:49:51.983Z" }, + { url = "https://files.pythonhosted.org/packages/39/fe/39ada9b094f01f5a35486577c848fe274e374bbf8d8f472e1423a0bbd26d/numpy-1.26.4-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:a4abb4f9001ad2858e7ac189089c42178fcce737e4169dc61321660f1a96c7d2", size = 18078620, upload-time = "2024-02-05T23:50:22.515Z" }, + { url = "https://files.pythonhosted.org/packages/d5/ef/6ad11d51197aad206a9ad2286dc1aac6a378059e06e8cf22cd08ed4f20dc/numpy-1.26.4-cp310-cp310-win32.whl", hash = "sha256:bfe25acf8b437eb2a8b2d49d443800a5f18508cd811fea3181723922a8a82b07", size = 5972659, upload-time = "2024-02-05T23:50:35.834Z" }, + { url = "https://files.pythonhosted.org/packages/19/77/538f202862b9183f54108557bfda67e17603fc560c384559e769321c9d92/numpy-1.26.4-cp310-cp310-win_amd64.whl", hash = "sha256:b97fe8060236edf3662adfc2c633f56a08ae30560c56310562cb4f95500022d5", size = 15808905, upload-time = "2024-02-05T23:51:03.701Z" }, + { url = "https://files.pythonhosted.org/packages/11/57/baae43d14fe163fa0e4c47f307b6b2511ab8d7d30177c491960504252053/numpy-1.26.4-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:4c66707fabe114439db9068ee468c26bbdf909cac0fb58686a42a24de1760c71", size = 20630554, upload-time = "2024-02-05T23:51:50.149Z" }, + { url = "https://files.pythonhosted.org/packages/1a/2e/151484f49fd03944c4a3ad9c418ed193cfd02724e138ac8a9505d056c582/numpy-1.26.4-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:edd8b5fe47dab091176d21bb6de568acdd906d1887a4584a15a9a96a1dca06ef", size = 13997127, upload-time = "2024-02-05T23:52:15.314Z" }, + { url = "https://files.pythonhosted.org/packages/79/ae/7e5b85136806f9dadf4878bf73cf223fe5c2636818ba3ab1c585d0403164/numpy-1.26.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7ab55401287bfec946ced39700c053796e7cc0e3acbef09993a9ad2adba6ca6e", size = 14222994, upload-time = "2024-02-05T23:52:47.569Z" }, + { url = "https://files.pythonhosted.org/packages/3a/d0/edc009c27b406c4f9cbc79274d6e46d634d139075492ad055e3d68445925/numpy-1.26.4-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:666dbfb6ec68962c033a450943ded891bed2d54e6755e35e5835d63f4f6931d5", size = 18252005, upload-time = "2024-02-05T23:53:15.637Z" }, + { url = "https://files.pythonhosted.org/packages/09/bf/2b1aaf8f525f2923ff6cfcf134ae5e750e279ac65ebf386c75a0cf6da06a/numpy-1.26.4-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:96ff0b2ad353d8f990b63294c8986f1ec3cb19d749234014f4e7eb0112ceba5a", size = 13885297, upload-time = "2024-02-05T23:53:42.16Z" }, + { url = "https://files.pythonhosted.org/packages/df/a0/4e0f14d847cfc2a633a1c8621d00724f3206cfeddeb66d35698c4e2cf3d2/numpy-1.26.4-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:60dedbb91afcbfdc9bc0b1f3f402804070deed7392c23eb7a7f07fa857868e8a", size = 18093567, upload-time = "2024-02-05T23:54:11.696Z" }, + { url = "https://files.pythonhosted.org/packages/d2/b7/a734c733286e10a7f1a8ad1ae8c90f2d33bf604a96548e0a4a3a6739b468/numpy-1.26.4-cp311-cp311-win32.whl", hash = "sha256:1af303d6b2210eb850fcf03064d364652b7120803a0b872f5211f5234b399f20", size = 5968812, upload-time = "2024-02-05T23:54:26.453Z" }, + { url = "https://files.pythonhosted.org/packages/3f/6b/5610004206cf7f8e7ad91c5a85a8c71b2f2f8051a0c0c4d5916b76d6cbb2/numpy-1.26.4-cp311-cp311-win_amd64.whl", hash = "sha256:cd25bcecc4974d09257ffcd1f098ee778f7834c3ad767fe5db785be9a4aa9cb2", size = 15811913, upload-time = "2024-02-05T23:54:53.933Z" }, + { url = "https://files.pythonhosted.org/packages/95/12/8f2020a8e8b8383ac0177dc9570aad031a3beb12e38847f7129bacd96228/numpy-1.26.4-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:b3ce300f3644fb06443ee2222c2201dd3a89ea6040541412b8fa189341847218", size = 20335901, upload-time = "2024-02-05T23:55:32.801Z" }, + { url = "https://files.pythonhosted.org/packages/75/5b/ca6c8bd14007e5ca171c7c03102d17b4f4e0ceb53957e8c44343a9546dcc/numpy-1.26.4-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:03a8c78d01d9781b28a6989f6fa1bb2c4f2d51201cf99d3dd875df6fbd96b23b", size = 13685868, upload-time = "2024-02-05T23:55:56.28Z" }, + { url = "https://files.pythonhosted.org/packages/79/f8/97f10e6755e2a7d027ca783f63044d5b1bc1ae7acb12afe6a9b4286eac17/numpy-1.26.4-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9fad7dcb1aac3c7f0584a5a8133e3a43eeb2fe127f47e3632d43d677c66c102b", size = 13925109, upload-time = "2024-02-05T23:56:20.368Z" }, + { url = "https://files.pythonhosted.org/packages/0f/50/de23fde84e45f5c4fda2488c759b69990fd4512387a8632860f3ac9cd225/numpy-1.26.4-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:675d61ffbfa78604709862923189bad94014bef562cc35cf61d3a07bba02a7ed", size = 17950613, upload-time = "2024-02-05T23:56:56.054Z" }, + { url = "https://files.pythonhosted.org/packages/4c/0c/9c603826b6465e82591e05ca230dfc13376da512b25ccd0894709b054ed0/numpy-1.26.4-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:ab47dbe5cc8210f55aa58e4805fe224dac469cde56b9f731a4c098b91917159a", size = 13572172, upload-time = "2024-02-05T23:57:21.56Z" }, + { url = "https://files.pythonhosted.org/packages/76/8c/2ba3902e1a0fc1c74962ea9bb33a534bb05984ad7ff9515bf8d07527cadd/numpy-1.26.4-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:1dda2e7b4ec9dd512f84935c5f126c8bd8b9f2fc001e9f54af255e8c5f16b0e0", size = 17786643, upload-time = "2024-02-05T23:57:56.585Z" }, + { url = "https://files.pythonhosted.org/packages/28/4a/46d9e65106879492374999e76eb85f87b15328e06bd1550668f79f7b18c6/numpy-1.26.4-cp312-cp312-win32.whl", hash = "sha256:50193e430acfc1346175fcbdaa28ffec49947a06918b7b92130744e81e640110", size = 5677803, upload-time = "2024-02-05T23:58:08.963Z" }, + { url = "https://files.pythonhosted.org/packages/16/2e/86f24451c2d530c88daf997cb8d6ac622c1d40d19f5a031ed68a4b73a374/numpy-1.26.4-cp312-cp312-win_amd64.whl", hash = "sha256:08beddf13648eb95f8d867350f6a018a4be2e5ad54c8d8caed89ebca558b2818", size = 15517754, upload-time = "2024-02-05T23:58:36.364Z" }, + { url = "https://files.pythonhosted.org/packages/7d/24/ce71dc08f06534269f66e73c04f5709ee024a1afe92a7b6e1d73f158e1f8/numpy-1.26.4-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:7349ab0fa0c429c82442a27a9673fc802ffdb7c7775fad780226cb234965e53c", size = 20636301, upload-time = "2024-02-05T23:59:10.976Z" }, + { url = "https://files.pythonhosted.org/packages/ae/8c/ab03a7c25741f9ebc92684a20125fbc9fc1b8e1e700beb9197d750fdff88/numpy-1.26.4-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:52b8b60467cd7dd1e9ed082188b4e6bb35aa5cdd01777621a1658910745b90be", size = 13971216, upload-time = "2024-02-05T23:59:35.472Z" }, + { url = "https://files.pythonhosted.org/packages/6d/64/c3bcdf822269421d85fe0d64ba972003f9bb4aa9a419da64b86856c9961f/numpy-1.26.4-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d5241e0a80d808d70546c697135da2c613f30e28251ff8307eb72ba696945764", size = 14226281, upload-time = "2024-02-05T23:59:59.372Z" }, + { url = "https://files.pythonhosted.org/packages/54/30/c2a907b9443cf42b90c17ad10c1e8fa801975f01cb9764f3f8eb8aea638b/numpy-1.26.4-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f870204a840a60da0b12273ef34f7051e98c3b5961b61b0c2c1be6dfd64fbcd3", size = 18249516, upload-time = "2024-02-06T00:00:32.79Z" }, + { url = "https://files.pythonhosted.org/packages/43/12/01a563fc44c07095996d0129b8899daf89e4742146f7044cdbdb3101c57f/numpy-1.26.4-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:679b0076f67ecc0138fd2ede3a8fd196dddc2ad3254069bcb9faf9a79b1cebcd", size = 13882132, upload-time = "2024-02-06T00:00:58.197Z" }, + { url = "https://files.pythonhosted.org/packages/16/ee/9df80b06680aaa23fc6c31211387e0db349e0e36d6a63ba3bd78c5acdf11/numpy-1.26.4-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:47711010ad8555514b434df65f7d7b076bb8261df1ca9bb78f53d3b2db02e95c", size = 18084181, upload-time = "2024-02-06T00:01:31.21Z" }, + { url = "https://files.pythonhosted.org/packages/28/7d/4b92e2fe20b214ffca36107f1a3e75ef4c488430e64de2d9af5db3a4637d/numpy-1.26.4-cp39-cp39-win32.whl", hash = "sha256:a354325ee03388678242a4d7ebcd08b5c727033fcff3b2f536aea978e15ee9e6", size = 5976360, upload-time = "2024-02-06T00:01:43.013Z" }, + { url = "https://files.pythonhosted.org/packages/b5/42/054082bd8220bbf6f297f982f0a8f5479fcbc55c8b511d928df07b965869/numpy-1.26.4-cp39-cp39-win_amd64.whl", hash = "sha256:3373d5d70a5fe74a2c1bb6d2cfd9609ecf686d47a2d7b1d37a8f3b6bf6003aea", size = 15814633, upload-time = "2024-02-06T00:02:16.694Z" }, + { url = "https://files.pythonhosted.org/packages/3f/72/3df6c1c06fc83d9cfe381cccb4be2532bbd38bf93fbc9fad087b6687f1c0/numpy-1.26.4-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:afedb719a9dcfc7eaf2287b839d8198e06dcd4cb5d276a3df279231138e83d30", size = 20455961, upload-time = "2024-02-06T00:03:05.993Z" }, + { url = "https://files.pythonhosted.org/packages/8e/02/570545bac308b58ffb21adda0f4e220ba716fb658a63c151daecc3293350/numpy-1.26.4-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:95a7476c59002f2f6c590b9b7b998306fba6a5aa646b1e22ddfeaf8f78c3a29c", size = 18061071, upload-time = "2024-02-06T00:03:41.5Z" }, + { url = "https://files.pythonhosted.org/packages/f4/5f/fafd8c51235f60d49f7a88e2275e13971e90555b67da52dd6416caec32fe/numpy-1.26.4-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:7e50d0a0cc3189f9cb0aeb3a6a6af18c16f59f004b866cd2be1c14b36134a4a0", size = 15709730, upload-time = "2024-02-06T00:04:11.719Z" }, +] + +[[package]] +name = "overrides" +version = "7.7.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/36/86/b585f53236dec60aba864e050778b25045f857e17f6e5ea0ae95fe80edd2/overrides-7.7.0.tar.gz", hash = "sha256:55158fa3d93b98cc75299b1e67078ad9003ca27945c76162c1c0766d6f91820a", size = 22812, upload-time = "2024-01-27T21:01:33.423Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/2c/ab/fc8290c6a4c722e5514d80f62b2dc4c4df1a68a41d1364e625c35990fcf3/overrides-7.7.0-py3-none-any.whl", hash = "sha256:c7ed9d062f78b8e4c1a7b70bd8796b35ead4d9f510227ef9c5dc7626c60d7e49", size = 17832, upload-time = "2024-01-27T21:01:31.393Z" }, +] + +[[package]] +name = "packaging" +version = "25.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/a1/d4/1fc4078c65507b51b96ca8f8c3ba19e6a61c8253c72794544580a7b6c24d/packaging-25.0.tar.gz", hash = "sha256:d443872c98d677bf60f6a1f2f8c1cb748e8fe762d2bf9d3148b5599295b0fc4f", size = 165727, upload-time = "2025-04-19T11:48:59.673Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/20/12/38679034af332785aac8774540895e234f4d07f7545804097de4b666afd8/packaging-25.0-py3-none-any.whl", hash = "sha256:29572ef2b1f17581046b3a2227d5c611fb25ec70ca1ba8554b24b0e69331a484", size = 66469, upload-time = "2025-04-19T11:48:57.875Z" }, +] + +[[package]] +name = "pandocfilters" +version = "1.5.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/70/6f/3dd4940bbe001c06a65f88e36bad298bc7a0de5036115639926b0c5c0458/pandocfilters-1.5.1.tar.gz", hash = "sha256:002b4a555ee4ebc03f8b66307e287fa492e4a77b4ea14d3f934328297bb4939e", size = 8454, upload-time = "2024-01-18T20:08:13.726Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ef/af/4fbc8cab944db5d21b7e2a5b8e9211a03a79852b1157e2c102fcc61ac440/pandocfilters-1.5.1-py2.py3-none-any.whl", hash = "sha256:93be382804a9cdb0a7267585f157e5d1731bbe5545a85b268d6f5fe6232de2bc", size = 8663, upload-time = "2024-01-18T20:08:11.28Z" }, +] + +[[package]] +name = "parso" +version = "0.8.5" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/d4/de/53e0bcf53d13e005bd8c92e7855142494f41171b34c2536b86187474184d/parso-0.8.5.tar.gz", hash = "sha256:034d7354a9a018bdce352f48b2a8a450f05e9d6ee85db84764e9b6bd96dafe5a", size = 401205, upload-time = "2025-08-23T15:15:28.028Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/16/32/f8e3c85d1d5250232a5d3477a2a28cc291968ff175caeadaf3cc19ce0e4a/parso-0.8.5-py2.py3-none-any.whl", hash = "sha256:646204b5ee239c396d040b90f9e272e9a8017c630092bf59980beb62fd033887", size = 106668, upload-time = "2025-08-23T15:15:25.663Z" }, +] + +[[package]] +name = "pexpect" +version = "4.9.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "ptyprocess" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/42/92/cc564bf6381ff43ce1f4d06852fc19a2f11d180f23dc32d9588bee2f149d/pexpect-4.9.0.tar.gz", hash = "sha256:ee7d41123f3c9911050ea2c2dac107568dc43b2d3b0c7557a33212c398ead30f", size = 166450, upload-time = "2023-11-25T09:07:26.339Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/9e/c3/059298687310d527a58bb01f3b1965787ee3b40dce76752eda8b44e9a2c5/pexpect-4.9.0-py2.py3-none-any.whl", hash = "sha256:7236d1e080e4936be2dc3e326cec0af72acf9212a7e1d060210e70a47e253523", size = 63772, upload-time = "2023-11-25T06:56:14.81Z" }, +] + +[[package]] +name = "pickleshare" +version = "0.7.5" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/d8/b6/df3c1c9b616e9c0edbc4fbab6ddd09df9535849c64ba51fcb6531c32d4d8/pickleshare-0.7.5.tar.gz", hash = "sha256:87683d47965c1da65cdacaf31c8441d12b8044cdec9aca500cd78fc2c683afca", size = 6161, upload-time = "2018-09-25T19:17:37.249Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/9a/41/220f49aaea88bc6fa6cba8d05ecf24676326156c23b991e80b3f2fc24c77/pickleshare-0.7.5-py2.py3-none-any.whl", hash = "sha256:9649af414d74d4df115d5d718f82acb59c9d418196b7b4290ed47a12ce62df56", size = 6877, upload-time = "2018-09-25T19:17:35.817Z" }, +] + +[[package]] +name = "pillow" +version = "10.4.0" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version < '3.9'", +] +sdist = { url = "https://files.pythonhosted.org/packages/cd/74/ad3d526f3bf7b6d3f408b73fde271ec69dfac8b81341a318ce825f2b3812/pillow-10.4.0.tar.gz", hash = "sha256:166c1cd4d24309b30d61f79f4a9114b7b2313d7450912277855ff5dfd7cd4a06", size = 46555059, upload-time = "2024-07-01T09:48:43.583Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/0e/69/a31cccd538ca0b5272be2a38347f8839b97a14be104ea08b0db92f749c74/pillow-10.4.0-cp310-cp310-macosx_10_10_x86_64.whl", hash = "sha256:4d9667937cfa347525b319ae34375c37b9ee6b525440f3ef48542fcf66f2731e", size = 3509271, upload-time = "2024-07-01T09:45:22.07Z" }, + { url = "https://files.pythonhosted.org/packages/9a/9e/4143b907be8ea0bce215f2ae4f7480027473f8b61fcedfda9d851082a5d2/pillow-10.4.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:543f3dc61c18dafb755773efc89aae60d06b6596a63914107f75459cf984164d", size = 3375658, upload-time = "2024-07-01T09:45:25.292Z" }, + { url = "https://files.pythonhosted.org/packages/8a/25/1fc45761955f9359b1169aa75e241551e74ac01a09f487adaaf4c3472d11/pillow-10.4.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7928ecbf1ece13956b95d9cbcfc77137652b02763ba384d9ab508099a2eca856", size = 4332075, upload-time = "2024-07-01T09:45:27.94Z" }, + { url = "https://files.pythonhosted.org/packages/5e/dd/425b95d0151e1d6c951f45051112394f130df3da67363b6bc75dc4c27aba/pillow-10.4.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e4d49b85c4348ea0b31ea63bc75a9f3857869174e2bf17e7aba02945cd218e6f", size = 4444808, upload-time = "2024-07-01T09:45:30.305Z" }, + { url = "https://files.pythonhosted.org/packages/b1/84/9a15cc5726cbbfe7f9f90bfb11f5d028586595907cd093815ca6644932e3/pillow-10.4.0-cp310-cp310-manylinux_2_28_aarch64.whl", hash = "sha256:6c762a5b0997f5659a5ef2266abc1d8851ad7749ad9a6a5506eb23d314e4f46b", size = 4356290, upload-time = "2024-07-01T09:45:32.868Z" }, + { url = "https://files.pythonhosted.org/packages/b5/5b/6651c288b08df3b8c1e2f8c1152201e0b25d240e22ddade0f1e242fc9fa0/pillow-10.4.0-cp310-cp310-manylinux_2_28_x86_64.whl", hash = "sha256:a985e028fc183bf12a77a8bbf36318db4238a3ded7fa9df1b9a133f1cb79f8fc", size = 4525163, upload-time = "2024-07-01T09:45:35.279Z" }, + { url = "https://files.pythonhosted.org/packages/07/8b/34854bf11a83c248505c8cb0fcf8d3d0b459a2246c8809b967963b6b12ae/pillow-10.4.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:812f7342b0eee081eaec84d91423d1b4650bb9828eb53d8511bcef8ce5aecf1e", size = 4463100, upload-time = "2024-07-01T09:45:37.74Z" }, + { url = "https://files.pythonhosted.org/packages/78/63/0632aee4e82476d9cbe5200c0cdf9ba41ee04ed77887432845264d81116d/pillow-10.4.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:ac1452d2fbe4978c2eec89fb5a23b8387aba707ac72810d9490118817d9c0b46", size = 4592880, upload-time = "2024-07-01T09:45:39.89Z" }, + { url = "https://files.pythonhosted.org/packages/df/56/b8663d7520671b4398b9d97e1ed9f583d4afcbefbda3c6188325e8c297bd/pillow-10.4.0-cp310-cp310-win32.whl", hash = "sha256:bcd5e41a859bf2e84fdc42f4edb7d9aba0a13d29a2abadccafad99de3feff984", size = 2235218, upload-time = "2024-07-01T09:45:42.771Z" }, + { url = "https://files.pythonhosted.org/packages/f4/72/0203e94a91ddb4a9d5238434ae6c1ca10e610e8487036132ea9bf806ca2a/pillow-10.4.0-cp310-cp310-win_amd64.whl", hash = "sha256:ecd85a8d3e79cd7158dec1c9e5808e821feea088e2f69a974db5edf84dc53141", size = 2554487, upload-time = "2024-07-01T09:45:45.176Z" }, + { url = "https://files.pythonhosted.org/packages/bd/52/7e7e93d7a6e4290543f17dc6f7d3af4bd0b3dd9926e2e8a35ac2282bc5f4/pillow-10.4.0-cp310-cp310-win_arm64.whl", hash = "sha256:ff337c552345e95702c5fde3158acb0625111017d0e5f24bf3acdb9cc16b90d1", size = 2243219, upload-time = "2024-07-01T09:45:47.274Z" }, + { url = "https://files.pythonhosted.org/packages/a7/62/c9449f9c3043c37f73e7487ec4ef0c03eb9c9afc91a92b977a67b3c0bbc5/pillow-10.4.0-cp311-cp311-macosx_10_10_x86_64.whl", hash = "sha256:0a9ec697746f268507404647e531e92889890a087e03681a3606d9b920fbee3c", size = 3509265, upload-time = "2024-07-01T09:45:49.812Z" }, + { url = "https://files.pythonhosted.org/packages/f4/5f/491dafc7bbf5a3cc1845dc0430872e8096eb9e2b6f8161509d124594ec2d/pillow-10.4.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:dfe91cb65544a1321e631e696759491ae04a2ea11d36715eca01ce07284738be", size = 3375655, upload-time = "2024-07-01T09:45:52.462Z" }, + { url = "https://files.pythonhosted.org/packages/73/d5/c4011a76f4207a3c151134cd22a1415741e42fa5ddecec7c0182887deb3d/pillow-10.4.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5dc6761a6efc781e6a1544206f22c80c3af4c8cf461206d46a1e6006e4429ff3", size = 4340304, upload-time = "2024-07-01T09:45:55.006Z" }, + { url = "https://files.pythonhosted.org/packages/ac/10/c67e20445a707f7a610699bba4fe050583b688d8cd2d202572b257f46600/pillow-10.4.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5e84b6cc6a4a3d76c153a6b19270b3526a5a8ed6b09501d3af891daa2a9de7d6", size = 4452804, upload-time = "2024-07-01T09:45:58.437Z" }, + { url = "https://files.pythonhosted.org/packages/a9/83/6523837906d1da2b269dee787e31df3b0acb12e3d08f024965a3e7f64665/pillow-10.4.0-cp311-cp311-manylinux_2_28_aarch64.whl", hash = "sha256:bbc527b519bd3aa9d7f429d152fea69f9ad37c95f0b02aebddff592688998abe", size = 4365126, upload-time = "2024-07-01T09:46:00.713Z" }, + { url = "https://files.pythonhosted.org/packages/ba/e5/8c68ff608a4203085158cff5cc2a3c534ec384536d9438c405ed6370d080/pillow-10.4.0-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:76a911dfe51a36041f2e756b00f96ed84677cdeb75d25c767f296c1c1eda1319", size = 4533541, upload-time = "2024-07-01T09:46:03.235Z" }, + { url = "https://files.pythonhosted.org/packages/f4/7c/01b8dbdca5bc6785573f4cee96e2358b0918b7b2c7b60d8b6f3abf87a070/pillow-10.4.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:59291fb29317122398786c2d44427bbd1a6d7ff54017075b22be9d21aa59bd8d", size = 4471616, upload-time = "2024-07-01T09:46:05.356Z" }, + { url = "https://files.pythonhosted.org/packages/c8/57/2899b82394a35a0fbfd352e290945440e3b3785655a03365c0ca8279f351/pillow-10.4.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:416d3a5d0e8cfe4f27f574362435bc9bae57f679a7158e0096ad2beb427b8696", size = 4600802, upload-time = "2024-07-01T09:46:08.145Z" }, + { url = "https://files.pythonhosted.org/packages/4d/d7/a44f193d4c26e58ee5d2d9db3d4854b2cfb5b5e08d360a5e03fe987c0086/pillow-10.4.0-cp311-cp311-win32.whl", hash = "sha256:7086cc1d5eebb91ad24ded9f58bec6c688e9f0ed7eb3dbbf1e4800280a896496", size = 2235213, upload-time = "2024-07-01T09:46:10.211Z" }, + { url = "https://files.pythonhosted.org/packages/c1/d0/5866318eec2b801cdb8c82abf190c8343d8a1cd8bf5a0c17444a6f268291/pillow-10.4.0-cp311-cp311-win_amd64.whl", hash = "sha256:cbed61494057c0f83b83eb3a310f0bf774b09513307c434d4366ed64f4128a91", size = 2554498, upload-time = "2024-07-01T09:46:12.685Z" }, + { url = "https://files.pythonhosted.org/packages/d4/c8/310ac16ac2b97e902d9eb438688de0d961660a87703ad1561fd3dfbd2aa0/pillow-10.4.0-cp311-cp311-win_arm64.whl", hash = "sha256:f5f0c3e969c8f12dd2bb7e0b15d5c468b51e5017e01e2e867335c81903046a22", size = 2243219, upload-time = "2024-07-01T09:46:14.83Z" }, + { url = "https://files.pythonhosted.org/packages/05/cb/0353013dc30c02a8be34eb91d25e4e4cf594b59e5a55ea1128fde1e5f8ea/pillow-10.4.0-cp312-cp312-macosx_10_10_x86_64.whl", hash = "sha256:673655af3eadf4df6b5457033f086e90299fdd7a47983a13827acf7459c15d94", size = 3509350, upload-time = "2024-07-01T09:46:17.177Z" }, + { url = "https://files.pythonhosted.org/packages/e7/cf/5c558a0f247e0bf9cec92bff9b46ae6474dd736f6d906315e60e4075f737/pillow-10.4.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:866b6942a92f56300012f5fbac71f2d610312ee65e22f1aa2609e491284e5597", size = 3374980, upload-time = "2024-07-01T09:46:19.169Z" }, + { url = "https://files.pythonhosted.org/packages/84/48/6e394b86369a4eb68b8a1382c78dc092245af517385c086c5094e3b34428/pillow-10.4.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:29dbdc4207642ea6aad70fbde1a9338753d33fb23ed6956e706936706f52dd80", size = 4343799, upload-time = "2024-07-01T09:46:21.883Z" }, + { url = "https://files.pythonhosted.org/packages/3b/f3/a8c6c11fa84b59b9df0cd5694492da8c039a24cd159f0f6918690105c3be/pillow-10.4.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bf2342ac639c4cf38799a44950bbc2dfcb685f052b9e262f446482afaf4bffca", size = 4459973, upload-time = "2024-07-01T09:46:24.321Z" }, + { url = "https://files.pythonhosted.org/packages/7d/1b/c14b4197b80150fb64453585247e6fb2e1d93761fa0fa9cf63b102fde822/pillow-10.4.0-cp312-cp312-manylinux_2_28_aarch64.whl", hash = "sha256:f5b92f4d70791b4a67157321c4e8225d60b119c5cc9aee8ecf153aace4aad4ef", size = 4370054, upload-time = "2024-07-01T09:46:26.825Z" }, + { url = "https://files.pythonhosted.org/packages/55/77/40daddf677897a923d5d33329acd52a2144d54a9644f2a5422c028c6bf2d/pillow-10.4.0-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:86dcb5a1eb778d8b25659d5e4341269e8590ad6b4e8b44d9f4b07f8d136c414a", size = 4539484, upload-time = "2024-07-01T09:46:29.355Z" }, + { url = "https://files.pythonhosted.org/packages/40/54/90de3e4256b1207300fb2b1d7168dd912a2fb4b2401e439ba23c2b2cabde/pillow-10.4.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:780c072c2e11c9b2c7ca37f9a2ee8ba66f44367ac3e5c7832afcfe5104fd6d1b", size = 4477375, upload-time = "2024-07-01T09:46:31.756Z" }, + { url = "https://files.pythonhosted.org/packages/13/24/1bfba52f44193860918ff7c93d03d95e3f8748ca1de3ceaf11157a14cf16/pillow-10.4.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:37fb69d905be665f68f28a8bba3c6d3223c8efe1edf14cc4cfa06c241f8c81d9", size = 4608773, upload-time = "2024-07-01T09:46:33.73Z" }, + { url = "https://files.pythonhosted.org/packages/55/04/5e6de6e6120451ec0c24516c41dbaf80cce1b6451f96561235ef2429da2e/pillow-10.4.0-cp312-cp312-win32.whl", hash = "sha256:7dfecdbad5c301d7b5bde160150b4db4c659cee2b69589705b6f8a0c509d9f42", size = 2235690, upload-time = "2024-07-01T09:46:36.587Z" }, + { url = "https://files.pythonhosted.org/packages/74/0a/d4ce3c44bca8635bd29a2eab5aa181b654a734a29b263ca8efe013beea98/pillow-10.4.0-cp312-cp312-win_amd64.whl", hash = "sha256:1d846aea995ad352d4bdcc847535bd56e0fd88d36829d2c90be880ef1ee4668a", size = 2554951, upload-time = "2024-07-01T09:46:38.777Z" }, + { url = "https://files.pythonhosted.org/packages/b5/ca/184349ee40f2e92439be9b3502ae6cfc43ac4b50bc4fc6b3de7957563894/pillow-10.4.0-cp312-cp312-win_arm64.whl", hash = "sha256:e553cad5179a66ba15bb18b353a19020e73a7921296a7979c4a2b7f6a5cd57f9", size = 2243427, upload-time = "2024-07-01T09:46:43.15Z" }, + { url = "https://files.pythonhosted.org/packages/c3/00/706cebe7c2c12a6318aabe5d354836f54adff7156fd9e1bd6c89f4ba0e98/pillow-10.4.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:8bc1a764ed8c957a2e9cacf97c8b2b053b70307cf2996aafd70e91a082e70df3", size = 3525685, upload-time = "2024-07-01T09:46:45.194Z" }, + { url = "https://files.pythonhosted.org/packages/cf/76/f658cbfa49405e5ecbfb9ba42d07074ad9792031267e782d409fd8fe7c69/pillow-10.4.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:6209bb41dc692ddfee4942517c19ee81b86c864b626dbfca272ec0f7cff5d9fb", size = 3374883, upload-time = "2024-07-01T09:46:47.331Z" }, + { url = "https://files.pythonhosted.org/packages/46/2b/99c28c4379a85e65378211971c0b430d9c7234b1ec4d59b2668f6299e011/pillow-10.4.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bee197b30783295d2eb680b311af15a20a8b24024a19c3a26431ff83eb8d1f70", size = 4339837, upload-time = "2024-07-01T09:46:49.647Z" }, + { url = "https://files.pythonhosted.org/packages/f1/74/b1ec314f624c0c43711fdf0d8076f82d9d802afd58f1d62c2a86878e8615/pillow-10.4.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1ef61f5dd14c300786318482456481463b9d6b91ebe5ef12f405afbba77ed0be", size = 4455562, upload-time = "2024-07-01T09:46:51.811Z" }, + { url = "https://files.pythonhosted.org/packages/4a/2a/4b04157cb7b9c74372fa867096a1607e6fedad93a44deeff553ccd307868/pillow-10.4.0-cp313-cp313-manylinux_2_28_aarch64.whl", hash = "sha256:297e388da6e248c98bc4a02e018966af0c5f92dfacf5a5ca22fa01cb3179bca0", size = 4366761, upload-time = "2024-07-01T09:46:53.961Z" }, + { url = "https://files.pythonhosted.org/packages/ac/7b/8f1d815c1a6a268fe90481232c98dd0e5fa8c75e341a75f060037bd5ceae/pillow-10.4.0-cp313-cp313-manylinux_2_28_x86_64.whl", hash = "sha256:e4db64794ccdf6cb83a59d73405f63adbe2a1887012e308828596100a0b2f6cc", size = 4536767, upload-time = "2024-07-01T09:46:56.664Z" }, + { url = "https://files.pythonhosted.org/packages/e5/77/05fa64d1f45d12c22c314e7b97398ffb28ef2813a485465017b7978b3ce7/pillow-10.4.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:bd2880a07482090a3bcb01f4265f1936a903d70bc740bfcb1fd4e8a2ffe5cf5a", size = 4477989, upload-time = "2024-07-01T09:46:58.977Z" }, + { url = "https://files.pythonhosted.org/packages/12/63/b0397cfc2caae05c3fb2f4ed1b4fc4fc878f0243510a7a6034ca59726494/pillow-10.4.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:4b35b21b819ac1dbd1233317adeecd63495f6babf21b7b2512d244ff6c6ce309", size = 4610255, upload-time = "2024-07-01T09:47:01.189Z" }, + { url = "https://files.pythonhosted.org/packages/7b/f9/cfaa5082ca9bc4a6de66ffe1c12c2d90bf09c309a5f52b27759a596900e7/pillow-10.4.0-cp313-cp313-win32.whl", hash = "sha256:551d3fd6e9dc15e4c1eb6fc4ba2b39c0c7933fa113b220057a34f4bb3268a060", size = 2235603, upload-time = "2024-07-01T09:47:03.918Z" }, + { url = "https://files.pythonhosted.org/packages/01/6a/30ff0eef6e0c0e71e55ded56a38d4859bf9d3634a94a88743897b5f96936/pillow-10.4.0-cp313-cp313-win_amd64.whl", hash = "sha256:030abdbe43ee02e0de642aee345efa443740aa4d828bfe8e2eb11922ea6a21ea", size = 2554972, upload-time = "2024-07-01T09:47:06.152Z" }, + { url = "https://files.pythonhosted.org/packages/48/2c/2e0a52890f269435eee38b21c8218e102c621fe8d8df8b9dd06fabf879ba/pillow-10.4.0-cp313-cp313-win_arm64.whl", hash = "sha256:5b001114dd152cfd6b23befeb28d7aee43553e2402c9f159807bf55f33af8a8d", size = 2243375, upload-time = "2024-07-01T09:47:09.065Z" }, + { url = "https://files.pythonhosted.org/packages/56/70/f40009702a477ce87d8d9faaa4de51d6562b3445d7a314accd06e4ffb01d/pillow-10.4.0-cp38-cp38-macosx_10_10_x86_64.whl", hash = "sha256:8d4d5063501b6dd4024b8ac2f04962d661222d120381272deea52e3fc52d3736", size = 3509213, upload-time = "2024-07-01T09:47:11.662Z" }, + { url = "https://files.pythonhosted.org/packages/10/43/105823d233c5e5d31cea13428f4474ded9d961652307800979a59d6a4276/pillow-10.4.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:7c1ee6f42250df403c5f103cbd2768a28fe1a0ea1f0f03fe151c8741e1469c8b", size = 3375883, upload-time = "2024-07-01T09:47:14.453Z" }, + { url = "https://files.pythonhosted.org/packages/3c/ad/7850c10bac468a20c918f6a5dbba9ecd106ea1cdc5db3c35e33a60570408/pillow-10.4.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b15e02e9bb4c21e39876698abf233c8c579127986f8207200bc8a8f6bb27acf2", size = 4330810, upload-time = "2024-07-01T09:47:16.695Z" }, + { url = "https://files.pythonhosted.org/packages/84/4c/69bbed9e436ac22f9ed193a2b64f64d68fcfbc9f4106249dc7ed4889907b/pillow-10.4.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7a8d4bade9952ea9a77d0c3e49cbd8b2890a399422258a77f357b9cc9be8d680", size = 4444341, upload-time = "2024-07-01T09:47:19.334Z" }, + { url = "https://files.pythonhosted.org/packages/8f/4f/c183c63828a3f37bf09644ce94cbf72d4929b033b109160a5379c2885932/pillow-10.4.0-cp38-cp38-manylinux_2_28_aarch64.whl", hash = "sha256:43efea75eb06b95d1631cb784aa40156177bf9dd5b4b03ff38979e048258bc6b", size = 4356005, upload-time = "2024-07-01T09:47:21.805Z" }, + { url = "https://files.pythonhosted.org/packages/fb/ad/435fe29865f98a8fbdc64add8875a6e4f8c97749a93577a8919ec6f32c64/pillow-10.4.0-cp38-cp38-manylinux_2_28_x86_64.whl", hash = "sha256:950be4d8ba92aca4b2bb0741285a46bfae3ca699ef913ec8416c1b78eadd64cd", size = 4525201, upload-time = "2024-07-01T09:47:24.457Z" }, + { url = "https://files.pythonhosted.org/packages/80/74/be8bf8acdfd70e91f905a12ae13cfb2e17c0f1da745c40141e26d0971ff5/pillow-10.4.0-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:d7480af14364494365e89d6fddc510a13e5a2c3584cb19ef65415ca57252fb84", size = 4460635, upload-time = "2024-07-01T09:47:26.841Z" }, + { url = "https://files.pythonhosted.org/packages/e4/90/763616e66dc9ad59c9b7fb58f863755e7934ef122e52349f62c7742b82d3/pillow-10.4.0-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:73664fe514b34c8f02452ffb73b7a92c6774e39a647087f83d67f010eb9a0cf0", size = 4590283, upload-time = "2024-07-01T09:47:29.247Z" }, + { url = "https://files.pythonhosted.org/packages/69/66/03002cb5b2c27bb519cba63b9f9aa3709c6f7a5d3b285406c01f03fb77e5/pillow-10.4.0-cp38-cp38-win32.whl", hash = "sha256:e88d5e6ad0d026fba7bdab8c3f225a69f063f116462c49892b0149e21b6c0a0e", size = 2235185, upload-time = "2024-07-01T09:47:32.205Z" }, + { url = "https://files.pythonhosted.org/packages/f2/75/3cb820b2812405fc7feb3d0deb701ef0c3de93dc02597115e00704591bc9/pillow-10.4.0-cp38-cp38-win_amd64.whl", hash = "sha256:5161eef006d335e46895297f642341111945e2c1c899eb406882a6c61a4357ab", size = 2554594, upload-time = "2024-07-01T09:47:34.285Z" }, + { url = "https://files.pythonhosted.org/packages/31/85/955fa5400fa8039921f630372cfe5056eed6e1b8e0430ee4507d7de48832/pillow-10.4.0-cp39-cp39-macosx_10_10_x86_64.whl", hash = "sha256:0ae24a547e8b711ccaaf99c9ae3cd975470e1a30caa80a6aaee9a2f19c05701d", size = 3509283, upload-time = "2024-07-01T09:47:36.394Z" }, + { url = "https://files.pythonhosted.org/packages/23/9c/343827267eb28d41cd82b4180d33b10d868af9077abcec0af9793aa77d2d/pillow-10.4.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:298478fe4f77a4408895605f3482b6cc6222c018b2ce565c2b6b9c354ac3229b", size = 3375691, upload-time = "2024-07-01T09:47:38.853Z" }, + { url = "https://files.pythonhosted.org/packages/60/a3/7ebbeabcd341eab722896d1a5b59a3df98c4b4d26cf4b0385f8aa94296f7/pillow-10.4.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:134ace6dc392116566980ee7436477d844520a26a4b1bd4053f6f47d096997fd", size = 4328295, upload-time = "2024-07-01T09:47:41.765Z" }, + { url = "https://files.pythonhosted.org/packages/32/3f/c02268d0c6fb6b3958bdda673c17b315c821d97df29ae6969f20fb49388a/pillow-10.4.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:930044bb7679ab003b14023138b50181899da3f25de50e9dbee23b61b4de2126", size = 4440810, upload-time = "2024-07-01T09:47:44.27Z" }, + { url = "https://files.pythonhosted.org/packages/67/5d/1c93c8cc35f2fdd3d6cc7e4ad72d203902859a2867de6ad957d9b708eb8d/pillow-10.4.0-cp39-cp39-manylinux_2_28_aarch64.whl", hash = "sha256:c76e5786951e72ed3686e122d14c5d7012f16c8303a674d18cdcd6d89557fc5b", size = 4352283, upload-time = "2024-07-01T09:47:46.673Z" }, + { url = "https://files.pythonhosted.org/packages/bc/a8/8655557c9c7202b8abbd001f61ff36711cefaf750debcaa1c24d154ef602/pillow-10.4.0-cp39-cp39-manylinux_2_28_x86_64.whl", hash = "sha256:b2724fdb354a868ddf9a880cb84d102da914e99119211ef7ecbdc613b8c96b3c", size = 4521800, upload-time = "2024-07-01T09:47:48.813Z" }, + { url = "https://files.pythonhosted.org/packages/58/78/6f95797af64d137124f68af1bdaa13b5332da282b86031f6fa70cf368261/pillow-10.4.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:dbc6ae66518ab3c5847659e9988c3b60dc94ffb48ef9168656e0019a93dbf8a1", size = 4459177, upload-time = "2024-07-01T09:47:52.104Z" }, + { url = "https://files.pythonhosted.org/packages/8a/6d/2b3ce34f1c4266d79a78c9a51d1289a33c3c02833fe294ef0dcbb9cba4ed/pillow-10.4.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:06b2f7898047ae93fad74467ec3d28fe84f7831370e3c258afa533f81ef7f3df", size = 4589079, upload-time = "2024-07-01T09:47:54.999Z" }, + { url = "https://files.pythonhosted.org/packages/e3/e0/456258c74da1ff5bf8ef1eab06a95ca994d8b9ed44c01d45c3f8cbd1db7e/pillow-10.4.0-cp39-cp39-win32.whl", hash = "sha256:7970285ab628a3779aecc35823296a7869f889b8329c16ad5a71e4901a3dc4ef", size = 2235247, upload-time = "2024-07-01T09:47:57.666Z" }, + { url = "https://files.pythonhosted.org/packages/37/f8/bef952bdb32aa53741f58bf21798642209e994edc3f6598f337f23d5400a/pillow-10.4.0-cp39-cp39-win_amd64.whl", hash = "sha256:961a7293b2457b405967af9c77dcaa43cc1a8cd50d23c532e62d48ab6cdd56f5", size = 2554479, upload-time = "2024-07-01T09:47:59.881Z" }, + { url = "https://files.pythonhosted.org/packages/bb/8e/805201619cad6651eef5fc1fdef913804baf00053461522fabbc5588ea12/pillow-10.4.0-cp39-cp39-win_arm64.whl", hash = "sha256:32cda9e3d601a52baccb2856b8ea1fc213c90b340c542dcef77140dfa3278a9e", size = 2243226, upload-time = "2024-07-01T09:48:02.508Z" }, + { url = "https://files.pythonhosted.org/packages/38/30/095d4f55f3a053392f75e2eae45eba3228452783bab3d9a920b951ac495c/pillow-10.4.0-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:5b4815f2e65b30f5fbae9dfffa8636d992d49705723fe86a3661806e069352d4", size = 3493889, upload-time = "2024-07-01T09:48:04.815Z" }, + { url = "https://files.pythonhosted.org/packages/f3/e8/4ff79788803a5fcd5dc35efdc9386af153569853767bff74540725b45863/pillow-10.4.0-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:8f0aef4ef59694b12cadee839e2ba6afeab89c0f39a3adc02ed51d109117b8da", size = 3346160, upload-time = "2024-07-01T09:48:07.206Z" }, + { url = "https://files.pythonhosted.org/packages/d7/ac/4184edd511b14f760c73f5bb8a5d6fd85c591c8aff7c2229677a355c4179/pillow-10.4.0-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9f4727572e2918acaa9077c919cbbeb73bd2b3ebcfe033b72f858fc9fbef0026", size = 3435020, upload-time = "2024-07-01T09:48:09.66Z" }, + { url = "https://files.pythonhosted.org/packages/da/21/1749cd09160149c0a246a81d646e05f35041619ce76f6493d6a96e8d1103/pillow-10.4.0-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ff25afb18123cea58a591ea0244b92eb1e61a1fd497bf6d6384f09bc3262ec3e", size = 3490539, upload-time = "2024-07-01T09:48:12.529Z" }, + { url = "https://files.pythonhosted.org/packages/b6/f5/f71fe1888b96083b3f6dfa0709101f61fc9e972c0c8d04e9d93ccef2a045/pillow-10.4.0-pp310-pypy310_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:dc3e2db6ba09ffd7d02ae9141cfa0ae23393ee7687248d46a7507b75d610f4f5", size = 3476125, upload-time = "2024-07-01T09:48:14.891Z" }, + { url = "https://files.pythonhosted.org/packages/96/b9/c0362c54290a31866c3526848583a2f45a535aa9d725fd31e25d318c805f/pillow-10.4.0-pp310-pypy310_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:02a2be69f9c9b8c1e97cf2713e789d4e398c751ecfd9967c18d0ce304efbf885", size = 3579373, upload-time = "2024-07-01T09:48:17.601Z" }, + { url = "https://files.pythonhosted.org/packages/52/3b/ce7a01026a7cf46e5452afa86f97a5e88ca97f562cafa76570178ab56d8d/pillow-10.4.0-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:0755ffd4a0c6f267cccbae2e9903d95477ca2f77c4fcf3a3a09570001856c8a5", size = 2554661, upload-time = "2024-07-01T09:48:20.293Z" }, + { url = "https://files.pythonhosted.org/packages/e1/1f/5a9fcd6ced51633c22481417e11b1b47d723f64fb536dfd67c015eb7f0ab/pillow-10.4.0-pp39-pypy39_pp73-macosx_10_15_x86_64.whl", hash = "sha256:a02364621fe369e06200d4a16558e056fe2805d3468350df3aef21e00d26214b", size = 3493850, upload-time = "2024-07-01T09:48:23.03Z" }, + { url = "https://files.pythonhosted.org/packages/cb/e6/3ea4755ed5320cb62aa6be2f6de47b058c6550f752dd050e86f694c59798/pillow-10.4.0-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:1b5dea9831a90e9d0721ec417a80d4cbd7022093ac38a568db2dd78363b00908", size = 3346118, upload-time = "2024-07-01T09:48:25.256Z" }, + { url = "https://files.pythonhosted.org/packages/0a/22/492f9f61e4648422b6ca39268ec8139277a5b34648d28f400faac14e0f48/pillow-10.4.0-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9b885f89040bb8c4a1573566bbb2f44f5c505ef6e74cec7ab9068c900047f04b", size = 3434958, upload-time = "2024-07-01T09:48:28.078Z" }, + { url = "https://files.pythonhosted.org/packages/f9/19/559a48ad4045704bb0547965b9a9345f5cd461347d977a56d178db28819e/pillow-10.4.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:87dd88ded2e6d74d31e1e0a99a726a6765cda32d00ba72dc37f0651f306daaa8", size = 3490340, upload-time = "2024-07-01T09:48:30.734Z" }, + { url = "https://files.pythonhosted.org/packages/d9/de/cebaca6fb79905b3a1aa0281d238769df3fb2ede34fd7c0caa286575915a/pillow-10.4.0-pp39-pypy39_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:2db98790afc70118bd0255c2eeb465e9767ecf1f3c25f9a1abb8ffc8cfd1fe0a", size = 3476048, upload-time = "2024-07-01T09:48:33.292Z" }, + { url = "https://files.pythonhosted.org/packages/71/f0/86d5b2f04693b0116a01d75302b0a307800a90d6c351a8aa4f8ae76cd499/pillow-10.4.0-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:f7baece4ce06bade126fb84b8af1c33439a76d8a6fd818970215e0560ca28c27", size = 3579366, upload-time = "2024-07-01T09:48:36.527Z" }, + { url = "https://files.pythonhosted.org/packages/37/ae/2dbfc38cc4fd14aceea14bc440d5151b21f64c4c3ba3f6f4191610b7ee5d/pillow-10.4.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:cfdd747216947628af7b259d274771d84db2268ca062dd5faf373639d00113a3", size = 2554652, upload-time = "2024-07-01T09:48:38.789Z" }, +] + +[[package]] +name = "pillow" +version = "11.3.0" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version == '3.9.*'", +] +sdist = { url = "https://files.pythonhosted.org/packages/f3/0d/d0d6dea55cd152ce3d6767bb38a8fc10e33796ba4ba210cbab9354b6d238/pillow-11.3.0.tar.gz", hash = "sha256:3828ee7586cd0b2091b6209e5ad53e20d0649bbe87164a459d0676e035e8f523", size = 47113069, upload-time = "2025-07-01T09:16:30.666Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/4c/5d/45a3553a253ac8763f3561371432a90bdbe6000fbdcf1397ffe502aa206c/pillow-11.3.0-cp310-cp310-macosx_10_10_x86_64.whl", hash = "sha256:1b9c17fd4ace828b3003dfd1e30bff24863e0eb59b535e8f80194d9cc7ecf860", size = 5316554, upload-time = "2025-07-01T09:13:39.342Z" }, + { url = "https://files.pythonhosted.org/packages/7c/c8/67c12ab069ef586a25a4a79ced553586748fad100c77c0ce59bb4983ac98/pillow-11.3.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:65dc69160114cdd0ca0f35cb434633c75e8e7fad4cf855177a05bf38678f73ad", size = 4686548, upload-time = "2025-07-01T09:13:41.835Z" }, + { url = "https://files.pythonhosted.org/packages/2f/bd/6741ebd56263390b382ae4c5de02979af7f8bd9807346d068700dd6d5cf9/pillow-11.3.0-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:7107195ddc914f656c7fc8e4a5e1c25f32e9236ea3ea860f257b0436011fddd0", size = 5859742, upload-time = "2025-07-03T13:09:47.439Z" }, + { url = "https://files.pythonhosted.org/packages/ca/0b/c412a9e27e1e6a829e6ab6c2dca52dd563efbedf4c9c6aa453d9a9b77359/pillow-11.3.0-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:cc3e831b563b3114baac7ec2ee86819eb03caa1a2cef0b481a5675b59c4fe23b", size = 7633087, upload-time = "2025-07-03T13:09:51.796Z" }, + { url = "https://files.pythonhosted.org/packages/59/9d/9b7076aaf30f5dd17e5e5589b2d2f5a5d7e30ff67a171eb686e4eecc2adf/pillow-11.3.0-cp310-cp310-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:f1f182ebd2303acf8c380a54f615ec883322593320a9b00438eb842c1f37ae50", size = 5963350, upload-time = "2025-07-01T09:13:43.865Z" }, + { url = "https://files.pythonhosted.org/packages/f0/16/1a6bf01fb622fb9cf5c91683823f073f053005c849b1f52ed613afcf8dae/pillow-11.3.0-cp310-cp310-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:4445fa62e15936a028672fd48c4c11a66d641d2c05726c7ec1f8ba6a572036ae", size = 6631840, upload-time = "2025-07-01T09:13:46.161Z" }, + { url = "https://files.pythonhosted.org/packages/7b/e6/6ff7077077eb47fde78739e7d570bdcd7c10495666b6afcd23ab56b19a43/pillow-11.3.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:71f511f6b3b91dd543282477be45a033e4845a40278fa8dcdbfdb07109bf18f9", size = 6074005, upload-time = "2025-07-01T09:13:47.829Z" }, + { url = "https://files.pythonhosted.org/packages/c3/3a/b13f36832ea6d279a697231658199e0a03cd87ef12048016bdcc84131601/pillow-11.3.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:040a5b691b0713e1f6cbe222e0f4f74cd233421e105850ae3b3c0ceda520f42e", size = 6708372, upload-time = "2025-07-01T09:13:52.145Z" }, + { url = "https://files.pythonhosted.org/packages/6c/e4/61b2e1a7528740efbc70b3d581f33937e38e98ef3d50b05007267a55bcb2/pillow-11.3.0-cp310-cp310-win32.whl", hash = "sha256:89bd777bc6624fe4115e9fac3352c79ed60f3bb18651420635f26e643e3dd1f6", size = 6277090, upload-time = "2025-07-01T09:13:53.915Z" }, + { url = "https://files.pythonhosted.org/packages/a9/d3/60c781c83a785d6afbd6a326ed4d759d141de43aa7365725cbcd65ce5e54/pillow-11.3.0-cp310-cp310-win_amd64.whl", hash = "sha256:19d2ff547c75b8e3ff46f4d9ef969a06c30ab2d4263a9e287733aa8b2429ce8f", size = 6985988, upload-time = "2025-07-01T09:13:55.699Z" }, + { url = "https://files.pythonhosted.org/packages/9f/28/4f4a0203165eefb3763939c6789ba31013a2e90adffb456610f30f613850/pillow-11.3.0-cp310-cp310-win_arm64.whl", hash = "sha256:819931d25e57b513242859ce1876c58c59dc31587847bf74cfe06b2e0cb22d2f", size = 2422899, upload-time = "2025-07-01T09:13:57.497Z" }, + { url = "https://files.pythonhosted.org/packages/db/26/77f8ed17ca4ffd60e1dcd220a6ec6d71210ba398cfa33a13a1cd614c5613/pillow-11.3.0-cp311-cp311-macosx_10_10_x86_64.whl", hash = "sha256:1cd110edf822773368b396281a2293aeb91c90a2db00d78ea43e7e861631b722", size = 5316531, upload-time = "2025-07-01T09:13:59.203Z" }, + { url = "https://files.pythonhosted.org/packages/cb/39/ee475903197ce709322a17a866892efb560f57900d9af2e55f86db51b0a5/pillow-11.3.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:9c412fddd1b77a75aa904615ebaa6001f169b26fd467b4be93aded278266b288", size = 4686560, upload-time = "2025-07-01T09:14:01.101Z" }, + { url = "https://files.pythonhosted.org/packages/d5/90/442068a160fd179938ba55ec8c97050a612426fae5ec0a764e345839f76d/pillow-11.3.0-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:7d1aa4de119a0ecac0a34a9c8bde33f34022e2e8f99104e47a3ca392fd60e37d", size = 5870978, upload-time = "2025-07-03T13:09:55.638Z" }, + { url = "https://files.pythonhosted.org/packages/13/92/dcdd147ab02daf405387f0218dcf792dc6dd5b14d2573d40b4caeef01059/pillow-11.3.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:91da1d88226663594e3f6b4b8c3c8d85bd504117d043740a8e0ec449087cc494", size = 7641168, upload-time = "2025-07-03T13:10:00.37Z" }, + { url = "https://files.pythonhosted.org/packages/6e/db/839d6ba7fd38b51af641aa904e2960e7a5644d60ec754c046b7d2aee00e5/pillow-11.3.0-cp311-cp311-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:643f189248837533073c405ec2f0bb250ba54598cf80e8c1e043381a60632f58", size = 5973053, upload-time = "2025-07-01T09:14:04.491Z" }, + { url = "https://files.pythonhosted.org/packages/f2/2f/d7675ecae6c43e9f12aa8d58b6012683b20b6edfbdac7abcb4e6af7a3784/pillow-11.3.0-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:106064daa23a745510dabce1d84f29137a37224831d88eb4ce94bb187b1d7e5f", size = 6640273, upload-time = "2025-07-01T09:14:06.235Z" }, + { url = "https://files.pythonhosted.org/packages/45/ad/931694675ede172e15b2ff03c8144a0ddaea1d87adb72bb07655eaffb654/pillow-11.3.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:cd8ff254faf15591e724dc7c4ddb6bf4793efcbe13802a4ae3e863cd300b493e", size = 6082043, upload-time = "2025-07-01T09:14:07.978Z" }, + { url = "https://files.pythonhosted.org/packages/3a/04/ba8f2b11fc80d2dd462d7abec16351b45ec99cbbaea4387648a44190351a/pillow-11.3.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:932c754c2d51ad2b2271fd01c3d121daaa35e27efae2a616f77bf164bc0b3e94", size = 6715516, upload-time = "2025-07-01T09:14:10.233Z" }, + { url = "https://files.pythonhosted.org/packages/48/59/8cd06d7f3944cc7d892e8533c56b0acb68399f640786313275faec1e3b6f/pillow-11.3.0-cp311-cp311-win32.whl", hash = "sha256:b4b8f3efc8d530a1544e5962bd6b403d5f7fe8b9e08227c6b255f98ad82b4ba0", size = 6274768, upload-time = "2025-07-01T09:14:11.921Z" }, + { url = "https://files.pythonhosted.org/packages/f1/cc/29c0f5d64ab8eae20f3232da8f8571660aa0ab4b8f1331da5c2f5f9a938e/pillow-11.3.0-cp311-cp311-win_amd64.whl", hash = "sha256:1a992e86b0dd7aeb1f053cd506508c0999d710a8f07b4c791c63843fc6a807ac", size = 6986055, upload-time = "2025-07-01T09:14:13.623Z" }, + { url = "https://files.pythonhosted.org/packages/c6/df/90bd886fabd544c25addd63e5ca6932c86f2b701d5da6c7839387a076b4a/pillow-11.3.0-cp311-cp311-win_arm64.whl", hash = "sha256:30807c931ff7c095620fe04448e2c2fc673fcbb1ffe2a7da3fb39613489b1ddd", size = 2423079, upload-time = "2025-07-01T09:14:15.268Z" }, + { url = "https://files.pythonhosted.org/packages/40/fe/1bc9b3ee13f68487a99ac9529968035cca2f0a51ec36892060edcc51d06a/pillow-11.3.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:fdae223722da47b024b867c1ea0be64e0df702c5e0a60e27daad39bf960dd1e4", size = 5278800, upload-time = "2025-07-01T09:14:17.648Z" }, + { url = "https://files.pythonhosted.org/packages/2c/32/7e2ac19b5713657384cec55f89065fb306b06af008cfd87e572035b27119/pillow-11.3.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:921bd305b10e82b4d1f5e802b6850677f965d8394203d182f078873851dada69", size = 4686296, upload-time = "2025-07-01T09:14:19.828Z" }, + { url = "https://files.pythonhosted.org/packages/8e/1e/b9e12bbe6e4c2220effebc09ea0923a07a6da1e1f1bfbc8d7d29a01ce32b/pillow-11.3.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:eb76541cba2f958032d79d143b98a3a6b3ea87f0959bbe256c0b5e416599fd5d", size = 5871726, upload-time = "2025-07-03T13:10:04.448Z" }, + { url = "https://files.pythonhosted.org/packages/8d/33/e9200d2bd7ba00dc3ddb78df1198a6e80d7669cce6c2bdbeb2530a74ec58/pillow-11.3.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:67172f2944ebba3d4a7b54f2e95c786a3a50c21b88456329314caaa28cda70f6", size = 7644652, upload-time = "2025-07-03T13:10:10.391Z" }, + { url = "https://files.pythonhosted.org/packages/41/f1/6f2427a26fc683e00d985bc391bdd76d8dd4e92fac33d841127eb8fb2313/pillow-11.3.0-cp312-cp312-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:97f07ed9f56a3b9b5f49d3661dc9607484e85c67e27f3e8be2c7d28ca032fec7", size = 5977787, upload-time = "2025-07-01T09:14:21.63Z" }, + { url = "https://files.pythonhosted.org/packages/e4/c9/06dd4a38974e24f932ff5f98ea3c546ce3f8c995d3f0985f8e5ba48bba19/pillow-11.3.0-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:676b2815362456b5b3216b4fd5bd89d362100dc6f4945154ff172e206a22c024", size = 6645236, upload-time = "2025-07-01T09:14:23.321Z" }, + { url = "https://files.pythonhosted.org/packages/40/e7/848f69fb79843b3d91241bad658e9c14f39a32f71a301bcd1d139416d1be/pillow-11.3.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:3e184b2f26ff146363dd07bde8b711833d7b0202e27d13540bfe2e35a323a809", size = 6086950, upload-time = "2025-07-01T09:14:25.237Z" }, + { url = "https://files.pythonhosted.org/packages/0b/1a/7cff92e695a2a29ac1958c2a0fe4c0b2393b60aac13b04a4fe2735cad52d/pillow-11.3.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:6be31e3fc9a621e071bc17bb7de63b85cbe0bfae91bb0363c893cbe67247780d", size = 6723358, upload-time = "2025-07-01T09:14:27.053Z" }, + { url = "https://files.pythonhosted.org/packages/26/7d/73699ad77895f69edff76b0f332acc3d497f22f5d75e5360f78cbcaff248/pillow-11.3.0-cp312-cp312-win32.whl", hash = "sha256:7b161756381f0918e05e7cb8a371fff367e807770f8fe92ecb20d905d0e1c149", size = 6275079, upload-time = "2025-07-01T09:14:30.104Z" }, + { url = "https://files.pythonhosted.org/packages/8c/ce/e7dfc873bdd9828f3b6e5c2bbb74e47a98ec23cc5c74fc4e54462f0d9204/pillow-11.3.0-cp312-cp312-win_amd64.whl", hash = "sha256:a6444696fce635783440b7f7a9fc24b3ad10a9ea3f0ab66c5905be1c19ccf17d", size = 6986324, upload-time = "2025-07-01T09:14:31.899Z" }, + { url = "https://files.pythonhosted.org/packages/16/8f/b13447d1bf0b1f7467ce7d86f6e6edf66c0ad7cf44cf5c87a37f9bed9936/pillow-11.3.0-cp312-cp312-win_arm64.whl", hash = "sha256:2aceea54f957dd4448264f9bf40875da0415c83eb85f55069d89c0ed436e3542", size = 2423067, upload-time = "2025-07-01T09:14:33.709Z" }, + { url = "https://files.pythonhosted.org/packages/1e/93/0952f2ed8db3a5a4c7a11f91965d6184ebc8cd7cbb7941a260d5f018cd2d/pillow-11.3.0-cp313-cp313-ios_13_0_arm64_iphoneos.whl", hash = "sha256:1c627742b539bba4309df89171356fcb3cc5a9178355b2727d1b74a6cf155fbd", size = 2128328, upload-time = "2025-07-01T09:14:35.276Z" }, + { url = "https://files.pythonhosted.org/packages/4b/e8/100c3d114b1a0bf4042f27e0f87d2f25e857e838034e98ca98fe7b8c0a9c/pillow-11.3.0-cp313-cp313-ios_13_0_arm64_iphonesimulator.whl", hash = "sha256:30b7c02f3899d10f13d7a48163c8969e4e653f8b43416d23d13d1bbfdc93b9f8", size = 2170652, upload-time = "2025-07-01T09:14:37.203Z" }, + { url = "https://files.pythonhosted.org/packages/aa/86/3f758a28a6e381758545f7cdb4942e1cb79abd271bea932998fc0db93cb6/pillow-11.3.0-cp313-cp313-ios_13_0_x86_64_iphonesimulator.whl", hash = "sha256:7859a4cc7c9295f5838015d8cc0a9c215b77e43d07a25e460f35cf516df8626f", size = 2227443, upload-time = "2025-07-01T09:14:39.344Z" }, + { url = "https://files.pythonhosted.org/packages/01/f4/91d5b3ffa718df2f53b0dc109877993e511f4fd055d7e9508682e8aba092/pillow-11.3.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:ec1ee50470b0d050984394423d96325b744d55c701a439d2bd66089bff963d3c", size = 5278474, upload-time = "2025-07-01T09:14:41.843Z" }, + { url = "https://files.pythonhosted.org/packages/f9/0e/37d7d3eca6c879fbd9dba21268427dffda1ab00d4eb05b32923d4fbe3b12/pillow-11.3.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:7db51d222548ccfd274e4572fdbf3e810a5e66b00608862f947b163e613b67dd", size = 4686038, upload-time = "2025-07-01T09:14:44.008Z" }, + { url = "https://files.pythonhosted.org/packages/ff/b0/3426e5c7f6565e752d81221af9d3676fdbb4f352317ceafd42899aaf5d8a/pillow-11.3.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:2d6fcc902a24ac74495df63faad1884282239265c6839a0a6416d33faedfae7e", size = 5864407, upload-time = "2025-07-03T13:10:15.628Z" }, + { url = "https://files.pythonhosted.org/packages/fc/c1/c6c423134229f2a221ee53f838d4be9d82bab86f7e2f8e75e47b6bf6cd77/pillow-11.3.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:f0f5d8f4a08090c6d6d578351a2b91acf519a54986c055af27e7a93feae6d3f1", size = 7639094, upload-time = "2025-07-03T13:10:21.857Z" }, + { url = "https://files.pythonhosted.org/packages/ba/c9/09e6746630fe6372c67c648ff9deae52a2bc20897d51fa293571977ceb5d/pillow-11.3.0-cp313-cp313-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c37d8ba9411d6003bba9e518db0db0c58a680ab9fe5179f040b0463644bc9805", size = 5973503, upload-time = "2025-07-01T09:14:45.698Z" }, + { url = "https://files.pythonhosted.org/packages/d5/1c/a2a29649c0b1983d3ef57ee87a66487fdeb45132df66ab30dd37f7dbe162/pillow-11.3.0-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:13f87d581e71d9189ab21fe0efb5a23e9f28552d5be6979e84001d3b8505abe8", size = 6642574, upload-time = "2025-07-01T09:14:47.415Z" }, + { url = "https://files.pythonhosted.org/packages/36/de/d5cc31cc4b055b6c6fd990e3e7f0f8aaf36229a2698501bcb0cdf67c7146/pillow-11.3.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:023f6d2d11784a465f09fd09a34b150ea4672e85fb3d05931d89f373ab14abb2", size = 6084060, upload-time = "2025-07-01T09:14:49.636Z" }, + { url = "https://files.pythonhosted.org/packages/d5/ea/502d938cbaeec836ac28a9b730193716f0114c41325db428e6b280513f09/pillow-11.3.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:45dfc51ac5975b938e9809451c51734124e73b04d0f0ac621649821a63852e7b", size = 6721407, upload-time = "2025-07-01T09:14:51.962Z" }, + { url = "https://files.pythonhosted.org/packages/45/9c/9c5e2a73f125f6cbc59cc7087c8f2d649a7ae453f83bd0362ff7c9e2aee2/pillow-11.3.0-cp313-cp313-win32.whl", hash = "sha256:a4d336baed65d50d37b88ca5b60c0fa9d81e3a87d4a7930d3880d1624d5b31f3", size = 6273841, upload-time = "2025-07-01T09:14:54.142Z" }, + { url = "https://files.pythonhosted.org/packages/23/85/397c73524e0cd212067e0c969aa245b01d50183439550d24d9f55781b776/pillow-11.3.0-cp313-cp313-win_amd64.whl", hash = "sha256:0bce5c4fd0921f99d2e858dc4d4d64193407e1b99478bc5cacecba2311abde51", size = 6978450, upload-time = "2025-07-01T09:14:56.436Z" }, + { url = "https://files.pythonhosted.org/packages/17/d2/622f4547f69cd173955194b78e4d19ca4935a1b0f03a302d655c9f6aae65/pillow-11.3.0-cp313-cp313-win_arm64.whl", hash = "sha256:1904e1264881f682f02b7f8167935cce37bc97db457f8e7849dc3a6a52b99580", size = 2423055, upload-time = "2025-07-01T09:14:58.072Z" }, + { url = "https://files.pythonhosted.org/packages/dd/80/a8a2ac21dda2e82480852978416cfacd439a4b490a501a288ecf4fe2532d/pillow-11.3.0-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:4c834a3921375c48ee6b9624061076bc0a32a60b5532b322cc0ea64e639dd50e", size = 5281110, upload-time = "2025-07-01T09:14:59.79Z" }, + { url = "https://files.pythonhosted.org/packages/44/d6/b79754ca790f315918732e18f82a8146d33bcd7f4494380457ea89eb883d/pillow-11.3.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:5e05688ccef30ea69b9317a9ead994b93975104a677a36a8ed8106be9260aa6d", size = 4689547, upload-time = "2025-07-01T09:15:01.648Z" }, + { url = "https://files.pythonhosted.org/packages/49/20/716b8717d331150cb00f7fdd78169c01e8e0c219732a78b0e59b6bdb2fd6/pillow-11.3.0-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:1019b04af07fc0163e2810167918cb5add8d74674b6267616021ab558dc98ced", size = 5901554, upload-time = "2025-07-03T13:10:27.018Z" }, + { url = "https://files.pythonhosted.org/packages/74/cf/a9f3a2514a65bb071075063a96f0a5cf949c2f2fce683c15ccc83b1c1cab/pillow-11.3.0-cp313-cp313t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:f944255db153ebb2b19c51fe85dd99ef0ce494123f21b9db4877ffdfc5590c7c", size = 7669132, upload-time = "2025-07-03T13:10:33.01Z" }, + { url = "https://files.pythonhosted.org/packages/98/3c/da78805cbdbee9cb43efe8261dd7cc0b4b93f2ac79b676c03159e9db2187/pillow-11.3.0-cp313-cp313t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:1f85acb69adf2aaee8b7da124efebbdb959a104db34d3a2cb0f3793dbae422a8", size = 6005001, upload-time = "2025-07-01T09:15:03.365Z" }, + { url = "https://files.pythonhosted.org/packages/6c/fa/ce044b91faecf30e635321351bba32bab5a7e034c60187fe9698191aef4f/pillow-11.3.0-cp313-cp313t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:05f6ecbeff5005399bb48d198f098a9b4b6bdf27b8487c7f38ca16eeb070cd59", size = 6668814, upload-time = "2025-07-01T09:15:05.655Z" }, + { url = "https://files.pythonhosted.org/packages/7b/51/90f9291406d09bf93686434f9183aba27b831c10c87746ff49f127ee80cb/pillow-11.3.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:a7bc6e6fd0395bc052f16b1a8670859964dbd7003bd0af2ff08342eb6e442cfe", size = 6113124, upload-time = "2025-07-01T09:15:07.358Z" }, + { url = "https://files.pythonhosted.org/packages/cd/5a/6fec59b1dfb619234f7636d4157d11fb4e196caeee220232a8d2ec48488d/pillow-11.3.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:83e1b0161c9d148125083a35c1c5a89db5b7054834fd4387499e06552035236c", size = 6747186, upload-time = "2025-07-01T09:15:09.317Z" }, + { url = "https://files.pythonhosted.org/packages/49/6b/00187a044f98255225f172de653941e61da37104a9ea60e4f6887717e2b5/pillow-11.3.0-cp313-cp313t-win32.whl", hash = "sha256:2a3117c06b8fb646639dce83694f2f9eac405472713fcb1ae887469c0d4f6788", size = 6277546, upload-time = "2025-07-01T09:15:11.311Z" }, + { url = "https://files.pythonhosted.org/packages/e8/5c/6caaba7e261c0d75bab23be79f1d06b5ad2a2ae49f028ccec801b0e853d6/pillow-11.3.0-cp313-cp313t-win_amd64.whl", hash = "sha256:857844335c95bea93fb39e0fa2726b4d9d758850b34075a7e3ff4f4fa3aa3b31", size = 6985102, upload-time = "2025-07-01T09:15:13.164Z" }, + { url = "https://files.pythonhosted.org/packages/f3/7e/b623008460c09a0cb38263c93b828c666493caee2eb34ff67f778b87e58c/pillow-11.3.0-cp313-cp313t-win_arm64.whl", hash = "sha256:8797edc41f3e8536ae4b10897ee2f637235c94f27404cac7297f7b607dd0716e", size = 2424803, upload-time = "2025-07-01T09:15:15.695Z" }, + { url = "https://files.pythonhosted.org/packages/73/f4/04905af42837292ed86cb1b1dabe03dce1edc008ef14c473c5c7e1443c5d/pillow-11.3.0-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:d9da3df5f9ea2a89b81bb6087177fb1f4d1c7146d583a3fe5c672c0d94e55e12", size = 5278520, upload-time = "2025-07-01T09:15:17.429Z" }, + { url = "https://files.pythonhosted.org/packages/41/b0/33d79e377a336247df6348a54e6d2a2b85d644ca202555e3faa0cf811ecc/pillow-11.3.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:0b275ff9b04df7b640c59ec5a3cb113eefd3795a8df80bac69646ef699c6981a", size = 4686116, upload-time = "2025-07-01T09:15:19.423Z" }, + { url = "https://files.pythonhosted.org/packages/49/2d/ed8bc0ab219ae8768f529597d9509d184fe8a6c4741a6864fea334d25f3f/pillow-11.3.0-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:0743841cabd3dba6a83f38a92672cccbd69af56e3e91777b0ee7f4dba4385632", size = 5864597, upload-time = "2025-07-03T13:10:38.404Z" }, + { url = "https://files.pythonhosted.org/packages/b5/3d/b932bb4225c80b58dfadaca9d42d08d0b7064d2d1791b6a237f87f661834/pillow-11.3.0-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:2465a69cf967b8b49ee1b96d76718cd98c4e925414ead59fdf75cf0fd07df673", size = 7638246, upload-time = "2025-07-03T13:10:44.987Z" }, + { url = "https://files.pythonhosted.org/packages/09/b5/0487044b7c096f1b48f0d7ad416472c02e0e4bf6919541b111efd3cae690/pillow-11.3.0-cp314-cp314-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:41742638139424703b4d01665b807c6468e23e699e8e90cffefe291c5832b027", size = 5973336, upload-time = "2025-07-01T09:15:21.237Z" }, + { url = "https://files.pythonhosted.org/packages/a8/2d/524f9318f6cbfcc79fbc004801ea6b607ec3f843977652fdee4857a7568b/pillow-11.3.0-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:93efb0b4de7e340d99057415c749175e24c8864302369e05914682ba642e5d77", size = 6642699, upload-time = "2025-07-01T09:15:23.186Z" }, + { url = "https://files.pythonhosted.org/packages/6f/d2/a9a4f280c6aefedce1e8f615baaa5474e0701d86dd6f1dede66726462bbd/pillow-11.3.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:7966e38dcd0fa11ca390aed7c6f20454443581d758242023cf36fcb319b1a874", size = 6083789, upload-time = "2025-07-01T09:15:25.1Z" }, + { url = "https://files.pythonhosted.org/packages/fe/54/86b0cd9dbb683a9d5e960b66c7379e821a19be4ac5810e2e5a715c09a0c0/pillow-11.3.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:98a9afa7b9007c67ed84c57c9e0ad86a6000da96eaa638e4f8abe5b65ff83f0a", size = 6720386, upload-time = "2025-07-01T09:15:27.378Z" }, + { url = "https://files.pythonhosted.org/packages/e7/95/88efcaf384c3588e24259c4203b909cbe3e3c2d887af9e938c2022c9dd48/pillow-11.3.0-cp314-cp314-win32.whl", hash = "sha256:02a723e6bf909e7cea0dac1b0e0310be9d7650cd66222a5f1c571455c0a45214", size = 6370911, upload-time = "2025-07-01T09:15:29.294Z" }, + { url = "https://files.pythonhosted.org/packages/2e/cc/934e5820850ec5eb107e7b1a72dd278140731c669f396110ebc326f2a503/pillow-11.3.0-cp314-cp314-win_amd64.whl", hash = "sha256:a418486160228f64dd9e9efcd132679b7a02a5f22c982c78b6fc7dab3fefb635", size = 7117383, upload-time = "2025-07-01T09:15:31.128Z" }, + { url = "https://files.pythonhosted.org/packages/d6/e9/9c0a616a71da2a5d163aa37405e8aced9a906d574b4a214bede134e731bc/pillow-11.3.0-cp314-cp314-win_arm64.whl", hash = "sha256:155658efb5e044669c08896c0c44231c5e9abcaadbc5cd3648df2f7c0b96b9a6", size = 2511385, upload-time = "2025-07-01T09:15:33.328Z" }, + { url = "https://files.pythonhosted.org/packages/1a/33/c88376898aff369658b225262cd4f2659b13e8178e7534df9e6e1fa289f6/pillow-11.3.0-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:59a03cdf019efbfeeed910bf79c7c93255c3d54bc45898ac2a4140071b02b4ae", size = 5281129, upload-time = "2025-07-01T09:15:35.194Z" }, + { url = "https://files.pythonhosted.org/packages/1f/70/d376247fb36f1844b42910911c83a02d5544ebd2a8bad9efcc0f707ea774/pillow-11.3.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:f8a5827f84d973d8636e9dc5764af4f0cf2318d26744b3d902931701b0d46653", size = 4689580, upload-time = "2025-07-01T09:15:37.114Z" }, + { url = "https://files.pythonhosted.org/packages/eb/1c/537e930496149fbac69efd2fc4329035bbe2e5475b4165439e3be9cb183b/pillow-11.3.0-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:ee92f2fd10f4adc4b43d07ec5e779932b4eb3dbfbc34790ada5a6669bc095aa6", size = 5902860, upload-time = "2025-07-03T13:10:50.248Z" }, + { url = "https://files.pythonhosted.org/packages/bd/57/80f53264954dcefeebcf9dae6e3eb1daea1b488f0be8b8fef12f79a3eb10/pillow-11.3.0-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:c96d333dcf42d01f47b37e0979b6bd73ec91eae18614864622d9b87bbd5bbf36", size = 7670694, upload-time = "2025-07-03T13:10:56.432Z" }, + { url = "https://files.pythonhosted.org/packages/70/ff/4727d3b71a8578b4587d9c276e90efad2d6fe0335fd76742a6da08132e8c/pillow-11.3.0-cp314-cp314t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:4c96f993ab8c98460cd0c001447bff6194403e8b1d7e149ade5f00594918128b", size = 6005888, upload-time = "2025-07-01T09:15:39.436Z" }, + { url = "https://files.pythonhosted.org/packages/05/ae/716592277934f85d3be51d7256f3636672d7b1abfafdc42cf3f8cbd4b4c8/pillow-11.3.0-cp314-cp314t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:41342b64afeba938edb034d122b2dda5db2139b9a4af999729ba8818e0056477", size = 6670330, upload-time = "2025-07-01T09:15:41.269Z" }, + { url = "https://files.pythonhosted.org/packages/e7/bb/7fe6cddcc8827b01b1a9766f5fdeb7418680744f9082035bdbabecf1d57f/pillow-11.3.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:068d9c39a2d1b358eb9f245ce7ab1b5c3246c7c8c7d9ba58cfa5b43146c06e50", size = 6114089, upload-time = "2025-07-01T09:15:43.13Z" }, + { url = "https://files.pythonhosted.org/packages/8b/f5/06bfaa444c8e80f1a8e4bff98da9c83b37b5be3b1deaa43d27a0db37ef84/pillow-11.3.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:a1bc6ba083b145187f648b667e05a2534ecc4b9f2784c2cbe3089e44868f2b9b", size = 6748206, upload-time = "2025-07-01T09:15:44.937Z" }, + { url = "https://files.pythonhosted.org/packages/f0/77/bc6f92a3e8e6e46c0ca78abfffec0037845800ea38c73483760362804c41/pillow-11.3.0-cp314-cp314t-win32.whl", hash = "sha256:118ca10c0d60b06d006be10a501fd6bbdfef559251ed31b794668ed569c87e12", size = 6377370, upload-time = "2025-07-01T09:15:46.673Z" }, + { url = "https://files.pythonhosted.org/packages/4a/82/3a721f7d69dca802befb8af08b7c79ebcab461007ce1c18bd91a5d5896f9/pillow-11.3.0-cp314-cp314t-win_amd64.whl", hash = "sha256:8924748b688aa210d79883357d102cd64690e56b923a186f35a82cbc10f997db", size = 7121500, upload-time = "2025-07-01T09:15:48.512Z" }, + { url = "https://files.pythonhosted.org/packages/89/c7/5572fa4a3f45740eaab6ae86fcdf7195b55beac1371ac8c619d880cfe948/pillow-11.3.0-cp314-cp314t-win_arm64.whl", hash = "sha256:79ea0d14d3ebad43ec77ad5272e6ff9bba5b679ef73375ea760261207fa8e0aa", size = 2512835, upload-time = "2025-07-01T09:15:50.399Z" }, + { url = "https://files.pythonhosted.org/packages/9e/8e/9c089f01677d1264ab8648352dcb7773f37da6ad002542760c80107da816/pillow-11.3.0-cp39-cp39-macosx_10_10_x86_64.whl", hash = "sha256:48d254f8a4c776de343051023eb61ffe818299eeac478da55227d96e241de53f", size = 5316478, upload-time = "2025-07-01T09:15:52.209Z" }, + { url = "https://files.pythonhosted.org/packages/b5/a9/5749930caf674695867eb56a581e78eb5f524b7583ff10b01b6e5048acb3/pillow-11.3.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:7aee118e30a4cf54fdd873bd3a29de51e29105ab11f9aad8c32123f58c8f8081", size = 4686522, upload-time = "2025-07-01T09:15:54.162Z" }, + { url = "https://files.pythonhosted.org/packages/43/46/0b85b763eb292b691030795f9f6bb6fcaf8948c39413c81696a01c3577f7/pillow-11.3.0-cp39-cp39-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:23cff760a9049c502721bdb743a7cb3e03365fafcdfc2ef9784610714166e5a4", size = 5853376, upload-time = "2025-07-03T13:11:01.066Z" }, + { url = "https://files.pythonhosted.org/packages/5e/c6/1a230ec0067243cbd60bc2dad5dc3ab46a8a41e21c15f5c9b52b26873069/pillow-11.3.0-cp39-cp39-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:6359a3bc43f57d5b375d1ad54a0074318a0844d11b76abccf478c37c986d3cfc", size = 7626020, upload-time = "2025-07-03T13:11:06.479Z" }, + { url = "https://files.pythonhosted.org/packages/63/dd/f296c27ffba447bfad76c6a0c44c1ea97a90cb9472b9304c94a732e8dbfb/pillow-11.3.0-cp39-cp39-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:092c80c76635f5ecb10f3f83d76716165c96f5229addbd1ec2bdbbda7d496e06", size = 5956732, upload-time = "2025-07-01T09:15:56.111Z" }, + { url = "https://files.pythonhosted.org/packages/a5/a0/98a3630f0b57f77bae67716562513d3032ae70414fcaf02750279c389a9e/pillow-11.3.0-cp39-cp39-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:cadc9e0ea0a2431124cde7e1697106471fc4c1da01530e679b2391c37d3fbb3a", size = 6624404, upload-time = "2025-07-01T09:15:58.245Z" }, + { url = "https://files.pythonhosted.org/packages/de/e6/83dfba5646a290edd9a21964da07674409e410579c341fc5b8f7abd81620/pillow-11.3.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:6a418691000f2a418c9135a7cf0d797c1bb7d9a485e61fe8e7722845b95ef978", size = 6067760, upload-time = "2025-07-01T09:16:00.003Z" }, + { url = "https://files.pythonhosted.org/packages/bc/41/15ab268fe6ee9a2bc7391e2bbb20a98d3974304ab1a406a992dcb297a370/pillow-11.3.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:97afb3a00b65cc0804d1c7abddbf090a81eaac02768af58cbdcaaa0a931e0b6d", size = 6700534, upload-time = "2025-07-01T09:16:02.29Z" }, + { url = "https://files.pythonhosted.org/packages/64/79/6d4f638b288300bed727ff29f2a3cb63db054b33518a95f27724915e3fbc/pillow-11.3.0-cp39-cp39-win32.whl", hash = "sha256:ea944117a7974ae78059fcc1800e5d3295172bb97035c0c1d9345fca1419da71", size = 6277091, upload-time = "2025-07-01T09:16:04.4Z" }, + { url = "https://files.pythonhosted.org/packages/46/05/4106422f45a05716fd34ed21763f8ec182e8ea00af6e9cb05b93a247361a/pillow-11.3.0-cp39-cp39-win_amd64.whl", hash = "sha256:e5c5858ad8ec655450a7c7df532e9842cf8df7cc349df7225c60d5d348c8aada", size = 6986091, upload-time = "2025-07-01T09:16:06.342Z" }, + { url = "https://files.pythonhosted.org/packages/63/c6/287fd55c2c12761d0591549d48885187579b7c257bef0c6660755b0b59ae/pillow-11.3.0-cp39-cp39-win_arm64.whl", hash = "sha256:6abdbfd3aea42be05702a8dd98832329c167ee84400a1d1f61ab11437f1717eb", size = 2422632, upload-time = "2025-07-01T09:16:08.142Z" }, + { url = "https://files.pythonhosted.org/packages/6f/8b/209bd6b62ce8367f47e68a218bffac88888fdf2c9fcf1ecadc6c3ec1ebc7/pillow-11.3.0-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:3cee80663f29e3843b68199b9d6f4f54bd1d4a6b59bdd91bceefc51238bcb967", size = 5270556, upload-time = "2025-07-01T09:16:09.961Z" }, + { url = "https://files.pythonhosted.org/packages/2e/e6/231a0b76070c2cfd9e260a7a5b504fb72da0a95279410fa7afd99d9751d6/pillow-11.3.0-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:b5f56c3f344f2ccaf0dd875d3e180f631dc60a51b314295a3e681fe8cf851fbe", size = 4654625, upload-time = "2025-07-01T09:16:11.913Z" }, + { url = "https://files.pythonhosted.org/packages/13/f4/10cf94fda33cb12765f2397fc285fa6d8eb9c29de7f3185165b702fc7386/pillow-11.3.0-pp310-pypy310_pp73-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:e67d793d180c9df62f1f40aee3accca4829d3794c95098887edc18af4b8b780c", size = 4874207, upload-time = "2025-07-03T13:11:10.201Z" }, + { url = "https://files.pythonhosted.org/packages/72/c9/583821097dc691880c92892e8e2d41fe0a5a3d6021f4963371d2f6d57250/pillow-11.3.0-pp310-pypy310_pp73-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:d000f46e2917c705e9fb93a3606ee4a819d1e3aa7a9b442f6444f07e77cf5e25", size = 6583939, upload-time = "2025-07-03T13:11:15.68Z" }, + { url = "https://files.pythonhosted.org/packages/3b/8e/5c9d410f9217b12320efc7c413e72693f48468979a013ad17fd690397b9a/pillow-11.3.0-pp310-pypy310_pp73-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:527b37216b6ac3a12d7838dc3bd75208ec57c1c6d11ef01902266a5a0c14fc27", size = 4957166, upload-time = "2025-07-01T09:16:13.74Z" }, + { url = "https://files.pythonhosted.org/packages/62/bb/78347dbe13219991877ffb3a91bf09da8317fbfcd4b5f9140aeae020ad71/pillow-11.3.0-pp310-pypy310_pp73-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:be5463ac478b623b9dd3937afd7fb7ab3d79dd290a28e2b6df292dc75063eb8a", size = 5581482, upload-time = "2025-07-01T09:16:16.107Z" }, + { url = "https://files.pythonhosted.org/packages/d9/28/1000353d5e61498aaeaaf7f1e4b49ddb05f2c6575f9d4f9f914a3538b6e1/pillow-11.3.0-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:8dc70ca24c110503e16918a658b869019126ecfe03109b754c402daff12b3d9f", size = 6984596, upload-time = "2025-07-01T09:16:18.07Z" }, + { url = "https://files.pythonhosted.org/packages/9e/e3/6fa84033758276fb31da12e5fb66ad747ae83b93c67af17f8c6ff4cc8f34/pillow-11.3.0-pp311-pypy311_pp73-macosx_10_15_x86_64.whl", hash = "sha256:7c8ec7a017ad1bd562f93dbd8505763e688d388cde6e4a010ae1486916e713e6", size = 5270566, upload-time = "2025-07-01T09:16:19.801Z" }, + { url = "https://files.pythonhosted.org/packages/5b/ee/e8d2e1ab4892970b561e1ba96cbd59c0d28cf66737fc44abb2aec3795a4e/pillow-11.3.0-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:9ab6ae226de48019caa8074894544af5b53a117ccb9d3b3dcb2871464c829438", size = 4654618, upload-time = "2025-07-01T09:16:21.818Z" }, + { url = "https://files.pythonhosted.org/packages/f2/6d/17f80f4e1f0761f02160fc433abd4109fa1548dcfdca46cfdadaf9efa565/pillow-11.3.0-pp311-pypy311_pp73-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:fe27fb049cdcca11f11a7bfda64043c37b30e6b91f10cb5bab275806c32f6ab3", size = 4874248, upload-time = "2025-07-03T13:11:20.738Z" }, + { url = "https://files.pythonhosted.org/packages/de/5f/c22340acd61cef960130585bbe2120e2fd8434c214802f07e8c03596b17e/pillow-11.3.0-pp311-pypy311_pp73-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:465b9e8844e3c3519a983d58b80be3f668e2a7a5db97f2784e7079fbc9f9822c", size = 6583963, upload-time = "2025-07-03T13:11:26.283Z" }, + { url = "https://files.pythonhosted.org/packages/31/5e/03966aedfbfcbb4d5f8aa042452d3361f325b963ebbadddac05b122e47dd/pillow-11.3.0-pp311-pypy311_pp73-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:5418b53c0d59b3824d05e029669efa023bbef0f3e92e75ec8428f3799487f361", size = 4957170, upload-time = "2025-07-01T09:16:23.762Z" }, + { url = "https://files.pythonhosted.org/packages/cc/2d/e082982aacc927fc2cab48e1e731bdb1643a1406acace8bed0900a61464e/pillow-11.3.0-pp311-pypy311_pp73-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:504b6f59505f08ae014f724b6207ff6222662aab5cc9542577fb084ed0676ac7", size = 5581505, upload-time = "2025-07-01T09:16:25.593Z" }, + { url = "https://files.pythonhosted.org/packages/34/e7/ae39f538fd6844e982063c3a5e4598b8ced43b9633baa3a85ef33af8c05c/pillow-11.3.0-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:c84d689db21a1c397d001aa08241044aa2069e7587b398c8cc63020390b1c1b8", size = 6984598, upload-time = "2025-07-01T09:16:27.732Z" }, +] + +[[package]] +name = "pillow" +version = "12.0.0" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version >= '3.14'", + "python_full_version >= '3.11' and python_full_version < '3.14'", + "python_full_version == '3.10.*'", +] +sdist = { url = "https://files.pythonhosted.org/packages/5a/b0/cace85a1b0c9775a9f8f5d5423c8261c858760e2466c79b2dd184638b056/pillow-12.0.0.tar.gz", hash = "sha256:87d4f8125c9988bfbed67af47dd7a953e2fc7b0cc1e7800ec6d2080d490bb353", size = 47008828, upload-time = "2025-10-15T18:24:14.008Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/5d/08/26e68b6b5da219c2a2cb7b563af008b53bb8e6b6fcb3fa40715fcdb2523a/pillow-12.0.0-cp310-cp310-macosx_10_10_x86_64.whl", hash = "sha256:3adfb466bbc544b926d50fe8f4a4e6abd8c6bffd28a26177594e6e9b2b76572b", size = 5289809, upload-time = "2025-10-15T18:21:27.791Z" }, + { url = "https://files.pythonhosted.org/packages/cb/e9/4e58fb097fb74c7b4758a680aacd558810a417d1edaa7000142976ef9d2f/pillow-12.0.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:1ac11e8ea4f611c3c0147424eae514028b5e9077dd99ab91e1bd7bc33ff145e1", size = 4650606, upload-time = "2025-10-15T18:21:29.823Z" }, + { url = "https://files.pythonhosted.org/packages/4b/e0/1fa492aa9f77b3bc6d471c468e62bfea1823056bf7e5e4f1914d7ab2565e/pillow-12.0.0-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:d49e2314c373f4c2b39446fb1a45ed333c850e09d0c59ac79b72eb3b95397363", size = 6221023, upload-time = "2025-10-15T18:21:31.415Z" }, + { url = "https://files.pythonhosted.org/packages/c1/09/4de7cd03e33734ccd0c876f0251401f1314e819cbfd89a0fcb6e77927cc6/pillow-12.0.0-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:c7b2a63fd6d5246349f3d3f37b14430d73ee7e8173154461785e43036ffa96ca", size = 8024937, upload-time = "2025-10-15T18:21:33.453Z" }, + { url = "https://files.pythonhosted.org/packages/2e/69/0688e7c1390666592876d9d474f5e135abb4acb39dcb583c4dc5490f1aff/pillow-12.0.0-cp310-cp310-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:d64317d2587c70324b79861babb9c09f71fbb780bad212018874b2c013d8600e", size = 6334139, upload-time = "2025-10-15T18:21:35.395Z" }, + { url = "https://files.pythonhosted.org/packages/ed/1c/880921e98f525b9b44ce747ad1ea8f73fd7e992bafe3ca5e5644bf433dea/pillow-12.0.0-cp310-cp310-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:d77153e14b709fd8b8af6f66a3afbb9ed6e9fc5ccf0b6b7e1ced7b036a228782", size = 7026074, upload-time = "2025-10-15T18:21:37.219Z" }, + { url = "https://files.pythonhosted.org/packages/28/03/96f718331b19b355610ef4ebdbbde3557c726513030665071fd025745671/pillow-12.0.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:32ed80ea8a90ee3e6fa08c21e2e091bba6eda8eccc83dbc34c95169507a91f10", size = 6448852, upload-time = "2025-10-15T18:21:39.168Z" }, + { url = "https://files.pythonhosted.org/packages/3a/a0/6a193b3f0cc9437b122978d2c5cbce59510ccf9a5b48825096ed7472da2f/pillow-12.0.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:c828a1ae702fc712978bda0320ba1b9893d99be0badf2647f693cc01cf0f04fa", size = 7117058, upload-time = "2025-10-15T18:21:40.997Z" }, + { url = "https://files.pythonhosted.org/packages/a7/c4/043192375eaa4463254e8e61f0e2ec9a846b983929a8d0a7122e0a6d6fff/pillow-12.0.0-cp310-cp310-win32.whl", hash = "sha256:bd87e140e45399c818fac4247880b9ce719e4783d767e030a883a970be632275", size = 6295431, upload-time = "2025-10-15T18:21:42.518Z" }, + { url = "https://files.pythonhosted.org/packages/92/c6/c2f2fc7e56301c21827e689bb8b0b465f1b52878b57471a070678c0c33cd/pillow-12.0.0-cp310-cp310-win_amd64.whl", hash = "sha256:455247ac8a4cfb7b9bc45b7e432d10421aea9fc2e74d285ba4072688a74c2e9d", size = 7000412, upload-time = "2025-10-15T18:21:44.404Z" }, + { url = "https://files.pythonhosted.org/packages/b2/d2/5f675067ba82da7a1c238a73b32e3fd78d67f9d9f80fbadd33a40b9c0481/pillow-12.0.0-cp310-cp310-win_arm64.whl", hash = "sha256:6ace95230bfb7cd79ef66caa064bbe2f2a1e63d93471c3a2e1f1348d9f22d6b7", size = 2435903, upload-time = "2025-10-15T18:21:46.29Z" }, + { url = "https://files.pythonhosted.org/packages/0e/5a/a2f6773b64edb921a756eb0729068acad9fc5208a53f4a349396e9436721/pillow-12.0.0-cp311-cp311-macosx_10_10_x86_64.whl", hash = "sha256:0fd00cac9c03256c8b2ff58f162ebcd2587ad3e1f2e397eab718c47e24d231cc", size = 5289798, upload-time = "2025-10-15T18:21:47.763Z" }, + { url = "https://files.pythonhosted.org/packages/2e/05/069b1f8a2e4b5a37493da6c5868531c3f77b85e716ad7a590ef87d58730d/pillow-12.0.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:a3475b96f5908b3b16c47533daaa87380c491357d197564e0ba34ae75c0f3257", size = 4650589, upload-time = "2025-10-15T18:21:49.515Z" }, + { url = "https://files.pythonhosted.org/packages/61/e3/2c820d6e9a36432503ead175ae294f96861b07600a7156154a086ba7111a/pillow-12.0.0-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:110486b79f2d112cf6add83b28b627e369219388f64ef2f960fef9ebaf54c642", size = 6230472, upload-time = "2025-10-15T18:21:51.052Z" }, + { url = "https://files.pythonhosted.org/packages/4f/89/63427f51c64209c5e23d4d52071c8d0f21024d3a8a487737caaf614a5795/pillow-12.0.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:5269cc1caeedb67e6f7269a42014f381f45e2e7cd42d834ede3c703a1d915fe3", size = 8033887, upload-time = "2025-10-15T18:21:52.604Z" }, + { url = "https://files.pythonhosted.org/packages/f6/1b/c9711318d4901093c15840f268ad649459cd81984c9ec9887756cca049a5/pillow-12.0.0-cp311-cp311-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:aa5129de4e174daccbc59d0a3b6d20eaf24417d59851c07ebb37aeb02947987c", size = 6343964, upload-time = "2025-10-15T18:21:54.619Z" }, + { url = "https://files.pythonhosted.org/packages/41/1e/db9470f2d030b4995083044cd8738cdd1bf773106819f6d8ba12597d5352/pillow-12.0.0-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:bee2a6db3a7242ea309aa7ee8e2780726fed67ff4e5b40169f2c940e7eb09227", size = 7034756, upload-time = "2025-10-15T18:21:56.151Z" }, + { url = "https://files.pythonhosted.org/packages/cc/b0/6177a8bdd5ee4ed87cba2de5a3cc1db55ffbbec6176784ce5bb75aa96798/pillow-12.0.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:90387104ee8400a7b4598253b4c406f8958f59fcf983a6cea2b50d59f7d63d0b", size = 6458075, upload-time = "2025-10-15T18:21:57.759Z" }, + { url = "https://files.pythonhosted.org/packages/bc/5e/61537aa6fa977922c6a03253a0e727e6e4a72381a80d63ad8eec350684f2/pillow-12.0.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:bc91a56697869546d1b8f0a3ff35224557ae7f881050e99f615e0119bf934b4e", size = 7125955, upload-time = "2025-10-15T18:21:59.372Z" }, + { url = "https://files.pythonhosted.org/packages/1f/3d/d5033539344ee3cbd9a4d69e12e63ca3a44a739eb2d4c8da350a3d38edd7/pillow-12.0.0-cp311-cp311-win32.whl", hash = "sha256:27f95b12453d165099c84f8a8bfdfd46b9e4bda9e0e4b65f0635430027f55739", size = 6298440, upload-time = "2025-10-15T18:22:00.982Z" }, + { url = "https://files.pythonhosted.org/packages/4d/42/aaca386de5cc8bd8a0254516957c1f265e3521c91515b16e286c662854c4/pillow-12.0.0-cp311-cp311-win_amd64.whl", hash = "sha256:b583dc9070312190192631373c6c8ed277254aa6e6084b74bdd0a6d3b221608e", size = 6999256, upload-time = "2025-10-15T18:22:02.617Z" }, + { url = "https://files.pythonhosted.org/packages/ba/f1/9197c9c2d5708b785f631a6dfbfa8eb3fb9672837cb92ae9af812c13b4ed/pillow-12.0.0-cp311-cp311-win_arm64.whl", hash = "sha256:759de84a33be3b178a64c8ba28ad5c135900359e85fb662bc6e403ad4407791d", size = 2436025, upload-time = "2025-10-15T18:22:04.598Z" }, + { url = "https://files.pythonhosted.org/packages/2c/90/4fcce2c22caf044e660a198d740e7fbc14395619e3cb1abad12192c0826c/pillow-12.0.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:53561a4ddc36facb432fae7a9d8afbfaf94795414f5cdc5fc52f28c1dca90371", size = 5249377, upload-time = "2025-10-15T18:22:05.993Z" }, + { url = "https://files.pythonhosted.org/packages/fd/e0/ed960067543d080691d47d6938ebccbf3976a931c9567ab2fbfab983a5dd/pillow-12.0.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:71db6b4c1653045dacc1585c1b0d184004f0d7e694c7b34ac165ca70c0838082", size = 4650343, upload-time = "2025-10-15T18:22:07.718Z" }, + { url = "https://files.pythonhosted.org/packages/e7/a1/f81fdeddcb99c044bf7d6faa47e12850f13cee0849537a7d27eeab5534d4/pillow-12.0.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:2fa5f0b6716fc88f11380b88b31fe591a06c6315e955c096c35715788b339e3f", size = 6232981, upload-time = "2025-10-15T18:22:09.287Z" }, + { url = "https://files.pythonhosted.org/packages/88/e1/9098d3ce341a8750b55b0e00c03f1630d6178f38ac191c81c97a3b047b44/pillow-12.0.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:82240051c6ca513c616f7f9da06e871f61bfd7805f566275841af15015b8f98d", size = 8041399, upload-time = "2025-10-15T18:22:10.872Z" }, + { url = "https://files.pythonhosted.org/packages/a7/62/a22e8d3b602ae8cc01446d0c57a54e982737f44b6f2e1e019a925143771d/pillow-12.0.0-cp312-cp312-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:55f818bd74fe2f11d4d7cbc65880a843c4075e0ac7226bc1a23261dbea531953", size = 6347740, upload-time = "2025-10-15T18:22:12.769Z" }, + { url = "https://files.pythonhosted.org/packages/4f/87/424511bdcd02c8d7acf9f65caa09f291a519b16bd83c3fb3374b3d4ae951/pillow-12.0.0-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:b87843e225e74576437fd5b6a4c2205d422754f84a06942cfaf1dc32243e45a8", size = 7040201, upload-time = "2025-10-15T18:22:14.813Z" }, + { url = "https://files.pythonhosted.org/packages/dc/4d/435c8ac688c54d11755aedfdd9f29c9eeddf68d150fe42d1d3dbd2365149/pillow-12.0.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:c607c90ba67533e1b2355b821fef6764d1dd2cbe26b8c1005ae84f7aea25ff79", size = 6462334, upload-time = "2025-10-15T18:22:16.375Z" }, + { url = "https://files.pythonhosted.org/packages/2b/f2/ad34167a8059a59b8ad10bc5c72d4d9b35acc6b7c0877af8ac885b5f2044/pillow-12.0.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:21f241bdd5080a15bc86d3466a9f6074a9c2c2b314100dd896ac81ee6db2f1ba", size = 7134162, upload-time = "2025-10-15T18:22:17.996Z" }, + { url = "https://files.pythonhosted.org/packages/0c/b1/a7391df6adacf0a5c2cf6ac1cf1fcc1369e7d439d28f637a847f8803beb3/pillow-12.0.0-cp312-cp312-win32.whl", hash = "sha256:dd333073e0cacdc3089525c7df7d39b211bcdf31fc2824e49d01c6b6187b07d0", size = 6298769, upload-time = "2025-10-15T18:22:19.923Z" }, + { url = "https://files.pythonhosted.org/packages/a2/0b/d87733741526541c909bbf159e338dcace4f982daac6e5a8d6be225ca32d/pillow-12.0.0-cp312-cp312-win_amd64.whl", hash = "sha256:9fe611163f6303d1619bbcb653540a4d60f9e55e622d60a3108be0d5b441017a", size = 7001107, upload-time = "2025-10-15T18:22:21.644Z" }, + { url = "https://files.pythonhosted.org/packages/bc/96/aaa61ce33cc98421fb6088af2a03be4157b1e7e0e87087c888e2370a7f45/pillow-12.0.0-cp312-cp312-win_arm64.whl", hash = "sha256:7dfb439562f234f7d57b1ac6bc8fe7f838a4bd49c79230e0f6a1da93e82f1fad", size = 2436012, upload-time = "2025-10-15T18:22:23.621Z" }, + { url = "https://files.pythonhosted.org/packages/62/f2/de993bb2d21b33a98d031ecf6a978e4b61da207bef02f7b43093774c480d/pillow-12.0.0-cp313-cp313-ios_13_0_arm64_iphoneos.whl", hash = "sha256:0869154a2d0546545cde61d1789a6524319fc1897d9ee31218eae7a60ccc5643", size = 4045493, upload-time = "2025-10-15T18:22:25.758Z" }, + { url = "https://files.pythonhosted.org/packages/0e/b6/bc8d0c4c9f6f111a783d045310945deb769b806d7574764234ffd50bc5ea/pillow-12.0.0-cp313-cp313-ios_13_0_arm64_iphonesimulator.whl", hash = "sha256:a7921c5a6d31b3d756ec980f2f47c0cfdbce0fc48c22a39347a895f41f4a6ea4", size = 4120461, upload-time = "2025-10-15T18:22:27.286Z" }, + { url = "https://files.pythonhosted.org/packages/5d/57/d60d343709366a353dc56adb4ee1e7d8a2cc34e3fbc22905f4167cfec119/pillow-12.0.0-cp313-cp313-ios_13_0_x86_64_iphonesimulator.whl", hash = "sha256:1ee80a59f6ce048ae13cda1abf7fbd2a34ab9ee7d401c46be3ca685d1999a399", size = 3576912, upload-time = "2025-10-15T18:22:28.751Z" }, + { url = "https://files.pythonhosted.org/packages/a4/a4/a0a31467e3f83b94d37568294b01d22b43ae3c5d85f2811769b9c66389dd/pillow-12.0.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:c50f36a62a22d350c96e49ad02d0da41dbd17ddc2e29750dbdba4323f85eb4a5", size = 5249132, upload-time = "2025-10-15T18:22:30.641Z" }, + { url = "https://files.pythonhosted.org/packages/83/06/48eab21dd561de2914242711434c0c0eb992ed08ff3f6107a5f44527f5e9/pillow-12.0.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:5193fde9a5f23c331ea26d0cf171fbf67e3f247585f50c08b3e205c7aeb4589b", size = 4650099, upload-time = "2025-10-15T18:22:32.73Z" }, + { url = "https://files.pythonhosted.org/packages/fc/bd/69ed99fd46a8dba7c1887156d3572fe4484e3f031405fcc5a92e31c04035/pillow-12.0.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:bde737cff1a975b70652b62d626f7785e0480918dece11e8fef3c0cf057351c3", size = 6230808, upload-time = "2025-10-15T18:22:34.337Z" }, + { url = "https://files.pythonhosted.org/packages/ea/94/8fad659bcdbf86ed70099cb60ae40be6acca434bbc8c4c0d4ef356d7e0de/pillow-12.0.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:a6597ff2b61d121172f5844b53f21467f7082f5fb385a9a29c01414463f93b07", size = 8037804, upload-time = "2025-10-15T18:22:36.402Z" }, + { url = "https://files.pythonhosted.org/packages/20/39/c685d05c06deecfd4e2d1950e9a908aa2ca8bc4e6c3b12d93b9cafbd7837/pillow-12.0.0-cp313-cp313-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:0b817e7035ea7f6b942c13aa03bb554fc44fea70838ea21f8eb31c638326584e", size = 6345553, upload-time = "2025-10-15T18:22:38.066Z" }, + { url = "https://files.pythonhosted.org/packages/38/57/755dbd06530a27a5ed74f8cb0a7a44a21722ebf318edbe67ddbd7fb28f88/pillow-12.0.0-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:f4f1231b7dec408e8670264ce63e9c71409d9583dd21d32c163e25213ee2a344", size = 7037729, upload-time = "2025-10-15T18:22:39.769Z" }, + { url = "https://files.pythonhosted.org/packages/ca/b6/7e94f4c41d238615674d06ed677c14883103dce1c52e4af16f000338cfd7/pillow-12.0.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:6e51b71417049ad6ab14c49608b4a24d8fb3fe605e5dfabfe523b58064dc3d27", size = 6459789, upload-time = "2025-10-15T18:22:41.437Z" }, + { url = "https://files.pythonhosted.org/packages/9c/14/4448bb0b5e0f22dd865290536d20ec8a23b64e2d04280b89139f09a36bb6/pillow-12.0.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:d120c38a42c234dc9a8c5de7ceaaf899cf33561956acb4941653f8bdc657aa79", size = 7130917, upload-time = "2025-10-15T18:22:43.152Z" }, + { url = "https://files.pythonhosted.org/packages/dd/ca/16c6926cc1c015845745d5c16c9358e24282f1e588237a4c36d2b30f182f/pillow-12.0.0-cp313-cp313-win32.whl", hash = "sha256:4cc6b3b2efff105c6a1656cfe59da4fdde2cda9af1c5e0b58529b24525d0a098", size = 6302391, upload-time = "2025-10-15T18:22:44.753Z" }, + { url = "https://files.pythonhosted.org/packages/6d/2a/dd43dcfd6dae9b6a49ee28a8eedb98c7d5ff2de94a5d834565164667b97b/pillow-12.0.0-cp313-cp313-win_amd64.whl", hash = "sha256:4cf7fed4b4580601c4345ceb5d4cbf5a980d030fd5ad07c4d2ec589f95f09905", size = 7007477, upload-time = "2025-10-15T18:22:46.838Z" }, + { url = "https://files.pythonhosted.org/packages/77/f0/72ea067f4b5ae5ead653053212af05ce3705807906ba3f3e8f58ddf617e6/pillow-12.0.0-cp313-cp313-win_arm64.whl", hash = "sha256:9f0b04c6b8584c2c193babcccc908b38ed29524b29dd464bc8801bf10d746a3a", size = 2435918, upload-time = "2025-10-15T18:22:48.399Z" }, + { url = "https://files.pythonhosted.org/packages/f5/5e/9046b423735c21f0487ea6cb5b10f89ea8f8dfbe32576fe052b5ba9d4e5b/pillow-12.0.0-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:7fa22993bac7b77b78cae22bad1e2a987ddf0d9015c63358032f84a53f23cdc3", size = 5251406, upload-time = "2025-10-15T18:22:49.905Z" }, + { url = "https://files.pythonhosted.org/packages/12/66/982ceebcdb13c97270ef7a56c3969635b4ee7cd45227fa707c94719229c5/pillow-12.0.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:f135c702ac42262573fe9714dfe99c944b4ba307af5eb507abef1667e2cbbced", size = 4653218, upload-time = "2025-10-15T18:22:51.587Z" }, + { url = "https://files.pythonhosted.org/packages/16/b3/81e625524688c31859450119bf12674619429cab3119eec0e30a7a1029cb/pillow-12.0.0-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:c85de1136429c524e55cfa4e033b4a7940ac5c8ee4d9401cc2d1bf48154bbc7b", size = 6266564, upload-time = "2025-10-15T18:22:53.215Z" }, + { url = "https://files.pythonhosted.org/packages/98/59/dfb38f2a41240d2408096e1a76c671d0a105a4a8471b1871c6902719450c/pillow-12.0.0-cp313-cp313t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:38df9b4bfd3db902c9c2bd369bcacaf9d935b2fff73709429d95cc41554f7b3d", size = 8069260, upload-time = "2025-10-15T18:22:54.933Z" }, + { url = "https://files.pythonhosted.org/packages/dc/3d/378dbea5cd1874b94c312425ca77b0f47776c78e0df2df751b820c8c1d6c/pillow-12.0.0-cp313-cp313t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:7d87ef5795da03d742bf49439f9ca4d027cde49c82c5371ba52464aee266699a", size = 6379248, upload-time = "2025-10-15T18:22:56.605Z" }, + { url = "https://files.pythonhosted.org/packages/84/b0/d525ef47d71590f1621510327acec75ae58c721dc071b17d8d652ca494d8/pillow-12.0.0-cp313-cp313t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:aff9e4d82d082ff9513bdd6acd4f5bd359f5b2c870907d2b0a9c5e10d40c88fe", size = 7066043, upload-time = "2025-10-15T18:22:58.53Z" }, + { url = "https://files.pythonhosted.org/packages/61/2c/aced60e9cf9d0cde341d54bf7932c9ffc33ddb4a1595798b3a5150c7ec4e/pillow-12.0.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:8d8ca2b210ada074d57fcee40c30446c9562e542fc46aedc19baf758a93532ee", size = 6490915, upload-time = "2025-10-15T18:23:00.582Z" }, + { url = "https://files.pythonhosted.org/packages/ef/26/69dcb9b91f4e59f8f34b2332a4a0a951b44f547c4ed39d3e4dcfcff48f89/pillow-12.0.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:99a7f72fb6249302aa62245680754862a44179b545ded638cf1fef59befb57ef", size = 7157998, upload-time = "2025-10-15T18:23:02.627Z" }, + { url = "https://files.pythonhosted.org/packages/61/2b/726235842220ca95fa441ddf55dd2382b52ab5b8d9c0596fe6b3f23dafe8/pillow-12.0.0-cp313-cp313t-win32.whl", hash = "sha256:4078242472387600b2ce8d93ade8899c12bf33fa89e55ec89fe126e9d6d5d9e9", size = 6306201, upload-time = "2025-10-15T18:23:04.709Z" }, + { url = "https://files.pythonhosted.org/packages/c0/3d/2afaf4e840b2df71344ababf2f8edd75a705ce500e5dc1e7227808312ae1/pillow-12.0.0-cp313-cp313t-win_amd64.whl", hash = "sha256:2c54c1a783d6d60595d3514f0efe9b37c8808746a66920315bfd34a938d7994b", size = 7013165, upload-time = "2025-10-15T18:23:06.46Z" }, + { url = "https://files.pythonhosted.org/packages/6f/75/3fa09aa5cf6ed04bee3fa575798ddf1ce0bace8edb47249c798077a81f7f/pillow-12.0.0-cp313-cp313t-win_arm64.whl", hash = "sha256:26d9f7d2b604cd23aba3e9faf795787456ac25634d82cd060556998e39c6fa47", size = 2437834, upload-time = "2025-10-15T18:23:08.194Z" }, + { url = "https://files.pythonhosted.org/packages/54/2a/9a8c6ba2c2c07b71bec92cf63e03370ca5e5f5c5b119b742bcc0cde3f9c5/pillow-12.0.0-cp314-cp314-ios_13_0_arm64_iphoneos.whl", hash = "sha256:beeae3f27f62308f1ddbcfb0690bf44b10732f2ef43758f169d5e9303165d3f9", size = 4045531, upload-time = "2025-10-15T18:23:10.121Z" }, + { url = "https://files.pythonhosted.org/packages/84/54/836fdbf1bfb3d66a59f0189ff0b9f5f666cee09c6188309300df04ad71fa/pillow-12.0.0-cp314-cp314-ios_13_0_arm64_iphonesimulator.whl", hash = "sha256:d4827615da15cd59784ce39d3388275ec093ae3ee8d7f0c089b76fa87af756c2", size = 4120554, upload-time = "2025-10-15T18:23:12.14Z" }, + { url = "https://files.pythonhosted.org/packages/0d/cd/16aec9f0da4793e98e6b54778a5fbce4f375c6646fe662e80600b8797379/pillow-12.0.0-cp314-cp314-ios_13_0_x86_64_iphonesimulator.whl", hash = "sha256:3e42edad50b6909089750e65c91aa09aaf1e0a71310d383f11321b27c224ed8a", size = 3576812, upload-time = "2025-10-15T18:23:13.962Z" }, + { url = "https://files.pythonhosted.org/packages/f6/b7/13957fda356dc46339298b351cae0d327704986337c3c69bb54628c88155/pillow-12.0.0-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:e5d8efac84c9afcb40914ab49ba063d94f5dbdf5066db4482c66a992f47a3a3b", size = 5252689, upload-time = "2025-10-15T18:23:15.562Z" }, + { url = "https://files.pythonhosted.org/packages/fc/f5/eae31a306341d8f331f43edb2e9122c7661b975433de5e447939ae61c5da/pillow-12.0.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:266cd5f2b63ff316d5a1bba46268e603c9caf5606d44f38c2873c380950576ad", size = 4650186, upload-time = "2025-10-15T18:23:17.379Z" }, + { url = "https://files.pythonhosted.org/packages/86/62/2a88339aa40c4c77e79108facbd307d6091e2c0eb5b8d3cf4977cfca2fe6/pillow-12.0.0-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:58eea5ebe51504057dd95c5b77d21700b77615ab0243d8152793dc00eb4faf01", size = 6230308, upload-time = "2025-10-15T18:23:18.971Z" }, + { url = "https://files.pythonhosted.org/packages/c7/33/5425a8992bcb32d1cb9fa3dd39a89e613d09a22f2c8083b7bf43c455f760/pillow-12.0.0-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:f13711b1a5ba512d647a0e4ba79280d3a9a045aaf7e0cc6fbe96b91d4cdf6b0c", size = 8039222, upload-time = "2025-10-15T18:23:20.909Z" }, + { url = "https://files.pythonhosted.org/packages/d8/61/3f5d3b35c5728f37953d3eec5b5f3e77111949523bd2dd7f31a851e50690/pillow-12.0.0-cp314-cp314-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6846bd2d116ff42cba6b646edf5bf61d37e5cbd256425fa089fee4ff5c07a99e", size = 6346657, upload-time = "2025-10-15T18:23:23.077Z" }, + { url = "https://files.pythonhosted.org/packages/3a/be/ee90a3d79271227e0f0a33c453531efd6ed14b2e708596ba5dd9be948da3/pillow-12.0.0-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:c98fa880d695de164b4135a52fd2e9cd7b7c90a9d8ac5e9e443a24a95ef9248e", size = 7038482, upload-time = "2025-10-15T18:23:25.005Z" }, + { url = "https://files.pythonhosted.org/packages/44/34/a16b6a4d1ad727de390e9bd9f19f5f669e079e5826ec0f329010ddea492f/pillow-12.0.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:fa3ed2a29a9e9d2d488b4da81dcb54720ac3104a20bf0bd273f1e4648aff5af9", size = 6461416, upload-time = "2025-10-15T18:23:27.009Z" }, + { url = "https://files.pythonhosted.org/packages/b6/39/1aa5850d2ade7d7ba9f54e4e4c17077244ff7a2d9e25998c38a29749eb3f/pillow-12.0.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:d034140032870024e6b9892c692fe2968493790dd57208b2c37e3fb35f6df3ab", size = 7131584, upload-time = "2025-10-15T18:23:29.752Z" }, + { url = "https://files.pythonhosted.org/packages/bf/db/4fae862f8fad0167073a7733973bfa955f47e2cac3dc3e3e6257d10fab4a/pillow-12.0.0-cp314-cp314-win32.whl", hash = "sha256:1b1b133e6e16105f524a8dec491e0586d072948ce15c9b914e41cdadd209052b", size = 6400621, upload-time = "2025-10-15T18:23:32.06Z" }, + { url = "https://files.pythonhosted.org/packages/2b/24/b350c31543fb0107ab2599464d7e28e6f856027aadda995022e695313d94/pillow-12.0.0-cp314-cp314-win_amd64.whl", hash = "sha256:8dc232e39d409036af549c86f24aed8273a40ffa459981146829a324e0848b4b", size = 7142916, upload-time = "2025-10-15T18:23:34.71Z" }, + { url = "https://files.pythonhosted.org/packages/0f/9b/0ba5a6fd9351793996ef7487c4fdbde8d3f5f75dbedc093bb598648fddf0/pillow-12.0.0-cp314-cp314-win_arm64.whl", hash = "sha256:d52610d51e265a51518692045e372a4c363056130d922a7351429ac9f27e70b0", size = 2523836, upload-time = "2025-10-15T18:23:36.967Z" }, + { url = "https://files.pythonhosted.org/packages/f5/7a/ceee0840aebc579af529b523d530840338ecf63992395842e54edc805987/pillow-12.0.0-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:1979f4566bb96c1e50a62d9831e2ea2d1211761e5662afc545fa766f996632f6", size = 5255092, upload-time = "2025-10-15T18:23:38.573Z" }, + { url = "https://files.pythonhosted.org/packages/44/76/20776057b4bfd1aef4eeca992ebde0f53a4dce874f3ae693d0ec90a4f79b/pillow-12.0.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:b2e4b27a6e15b04832fe9bf292b94b5ca156016bbc1ea9c2c20098a0320d6cf6", size = 4653158, upload-time = "2025-10-15T18:23:40.238Z" }, + { url = "https://files.pythonhosted.org/packages/82/3f/d9ff92ace07be8836b4e7e87e6a4c7a8318d47c2f1463ffcf121fc57d9cb/pillow-12.0.0-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:fb3096c30df99fd01c7bf8e544f392103d0795b9f98ba71a8054bcbf56b255f1", size = 6267882, upload-time = "2025-10-15T18:23:42.434Z" }, + { url = "https://files.pythonhosted.org/packages/9f/7a/4f7ff87f00d3ad33ba21af78bfcd2f032107710baf8280e3722ceec28cda/pillow-12.0.0-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:7438839e9e053ef79f7112c881cef684013855016f928b168b81ed5835f3e75e", size = 8071001, upload-time = "2025-10-15T18:23:44.29Z" }, + { url = "https://files.pythonhosted.org/packages/75/87/fcea108944a52dad8cca0715ae6247e271eb80459364a98518f1e4f480c1/pillow-12.0.0-cp314-cp314t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:5d5c411a8eaa2299322b647cd932586b1427367fd3184ffbb8f7a219ea2041ca", size = 6380146, upload-time = "2025-10-15T18:23:46.065Z" }, + { url = "https://files.pythonhosted.org/packages/91/52/0d31b5e571ef5fd111d2978b84603fce26aba1b6092f28e941cb46570745/pillow-12.0.0-cp314-cp314t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:d7e091d464ac59d2c7ad8e7e08105eaf9dafbc3883fd7265ffccc2baad6ac925", size = 7067344, upload-time = "2025-10-15T18:23:47.898Z" }, + { url = "https://files.pythonhosted.org/packages/7b/f4/2dd3d721f875f928d48e83bb30a434dee75a2531bca839bb996bb0aa5a91/pillow-12.0.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:792a2c0be4dcc18af9d4a2dfd8a11a17d5e25274a1062b0ec1c2d79c76f3e7f8", size = 6491864, upload-time = "2025-10-15T18:23:49.607Z" }, + { url = "https://files.pythonhosted.org/packages/30/4b/667dfcf3d61fc309ba5a15b141845cece5915e39b99c1ceab0f34bf1d124/pillow-12.0.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:afbefa430092f71a9593a99ab6a4e7538bc9eabbf7bf94f91510d3503943edc4", size = 7158911, upload-time = "2025-10-15T18:23:51.351Z" }, + { url = "https://files.pythonhosted.org/packages/a2/2f/16cabcc6426c32218ace36bf0d55955e813f2958afddbf1d391849fee9d1/pillow-12.0.0-cp314-cp314t-win32.whl", hash = "sha256:3830c769decf88f1289680a59d4f4c46c72573446352e2befec9a8512104fa52", size = 6408045, upload-time = "2025-10-15T18:23:53.177Z" }, + { url = "https://files.pythonhosted.org/packages/35/73/e29aa0c9c666cf787628d3f0dcf379f4791fba79f4936d02f8b37165bdf8/pillow-12.0.0-cp314-cp314t-win_amd64.whl", hash = "sha256:905b0365b210c73afb0ebe9101a32572152dfd1c144c7e28968a331b9217b94a", size = 7148282, upload-time = "2025-10-15T18:23:55.316Z" }, + { url = "https://files.pythonhosted.org/packages/c1/70/6b41bdcddf541b437bbb9f47f94d2db5d9ddef6c37ccab8c9107743748a4/pillow-12.0.0-cp314-cp314t-win_arm64.whl", hash = "sha256:99353a06902c2e43b43e8ff74ee65a7d90307d82370604746738a1e0661ccca7", size = 2525630, upload-time = "2025-10-15T18:23:57.149Z" }, + { url = "https://files.pythonhosted.org/packages/1d/b3/582327e6c9f86d037b63beebe981425d6811104cb443e8193824ef1a2f27/pillow-12.0.0-pp311-pypy311_pp73-macosx_10_15_x86_64.whl", hash = "sha256:b22bd8c974942477156be55a768f7aa37c46904c175be4e158b6a86e3a6b7ca8", size = 5215068, upload-time = "2025-10-15T18:23:59.594Z" }, + { url = "https://files.pythonhosted.org/packages/fd/d6/67748211d119f3b6540baf90f92fae73ae51d5217b171b0e8b5f7e5d558f/pillow-12.0.0-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:805ebf596939e48dbb2e4922a1d3852cfc25c38160751ce02da93058b48d252a", size = 4614994, upload-time = "2025-10-15T18:24:01.669Z" }, + { url = "https://files.pythonhosted.org/packages/2d/e1/f8281e5d844c41872b273b9f2c34a4bf64ca08905668c8ae730eedc7c9fa/pillow-12.0.0-pp311-pypy311_pp73-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:cae81479f77420d217def5f54b5b9d279804d17e982e0f2fa19b1d1e14ab5197", size = 5246639, upload-time = "2025-10-15T18:24:03.403Z" }, + { url = "https://files.pythonhosted.org/packages/94/5a/0d8ab8ffe8a102ff5df60d0de5af309015163bf710c7bb3e8311dd3b3ad0/pillow-12.0.0-pp311-pypy311_pp73-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:aeaefa96c768fc66818730b952a862235d68825c178f1b3ffd4efd7ad2edcb7c", size = 6986839, upload-time = "2025-10-15T18:24:05.344Z" }, + { url = "https://files.pythonhosted.org/packages/20/2e/3434380e8110b76cd9eb00a363c484b050f949b4bbe84ba770bb8508a02c/pillow-12.0.0-pp311-pypy311_pp73-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:09f2d0abef9e4e2f349305a4f8cc784a8a6c2f58a8c4892eea13b10a943bd26e", size = 5313505, upload-time = "2025-10-15T18:24:07.137Z" }, + { url = "https://files.pythonhosted.org/packages/57/ca/5a9d38900d9d74785141d6580950fe705de68af735ff6e727cb911b64740/pillow-12.0.0-pp311-pypy311_pp73-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:bdee52571a343d721fb2eb3b090a82d959ff37fc631e3f70422e0c2e029f3e76", size = 5963654, upload-time = "2025-10-15T18:24:09.579Z" }, + { url = "https://files.pythonhosted.org/packages/95/7e/f896623c3c635a90537ac093c6a618ebe1a90d87206e42309cb5d98a1b9e/pillow-12.0.0-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:b290fd8aa38422444d4b50d579de197557f182ef1068b75f5aa8558638b8d0a5", size = 6997850, upload-time = "2025-10-15T18:24:11.495Z" }, +] + +[[package]] +name = "pkgutil-resolve-name" +version = "1.3.10" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/70/f2/f2891a9dc37398696ddd945012b90ef8d0a034f0012e3f83c3f7a70b0f79/pkgutil_resolve_name-1.3.10.tar.gz", hash = "sha256:357d6c9e6a755653cfd78893817c0853af365dd51ec97f3d358a819373bbd174", size = 5054, upload-time = "2021-07-21T08:19:05.096Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/c9/5c/3d4882ba113fd55bdba9326c1e4c62a15e674a2501de4869e6bd6301f87e/pkgutil_resolve_name-1.3.10-py3-none-any.whl", hash = "sha256:ca27cc078d25c5ad71a9de0a7a330146c4e014c2462d9af19c6b828280649c5e", size = 4734, upload-time = "2021-07-21T08:19:03.106Z" }, +] + +[[package]] +name = "platformdirs" +version = "4.3.6" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version < '3.9'", +] +sdist = { url = "https://files.pythonhosted.org/packages/13/fc/128cc9cb8f03208bdbf93d3aa862e16d376844a14f9a0ce5cf4507372de4/platformdirs-4.3.6.tar.gz", hash = "sha256:357fb2acbc885b0419afd3ce3ed34564c13c9b95c89360cd9563f73aa5e2b907", size = 21302, upload-time = "2024-09-17T19:06:50.688Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/3c/a6/bc1012356d8ece4d66dd75c4b9fc6c1f6650ddd5991e421177d9f8f671be/platformdirs-4.3.6-py3-none-any.whl", hash = "sha256:73e575e1408ab8103900836b97580d5307456908a03e92031bab39e4554cc3fb", size = 18439, upload-time = "2024-09-17T19:06:49.212Z" }, +] + +[[package]] +name = "platformdirs" +version = "4.4.0" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version == '3.9.*'", +] +sdist = { url = "https://files.pythonhosted.org/packages/23/e8/21db9c9987b0e728855bd57bff6984f67952bea55d6f75e055c46b5383e8/platformdirs-4.4.0.tar.gz", hash = "sha256:ca753cf4d81dc309bc67b0ea38fd15dc97bc30ce419a7f58d13eb3bf14c4febf", size = 21634, upload-time = "2025-08-26T14:32:04.268Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/40/4b/2028861e724d3bd36227adfa20d3fd24c3fc6d52032f4a93c133be5d17ce/platformdirs-4.4.0-py3-none-any.whl", hash = "sha256:abd01743f24e5287cd7a5db3752faf1a2d65353f38ec26d98e25a6db65958c85", size = 18654, upload-time = "2025-08-26T14:32:02.735Z" }, +] + +[[package]] +name = "platformdirs" +version = "4.5.0" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version >= '3.14'", + "python_full_version >= '3.11' and python_full_version < '3.14'", + "python_full_version == '3.10.*'", +] +sdist = { url = "https://files.pythonhosted.org/packages/61/33/9611380c2bdb1225fdef633e2a9610622310fed35ab11dac9620972ee088/platformdirs-4.5.0.tar.gz", hash = "sha256:70ddccdd7c99fc5942e9fc25636a8b34d04c24b335100223152c2803e4063312", size = 21632, upload-time = "2025-10-08T17:44:48.791Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/73/cb/ac7874b3e5d58441674fb70742e6c374b28b0c7cb988d37d991cde47166c/platformdirs-4.5.0-py3-none-any.whl", hash = "sha256:e578a81bb873cbb89a41fcc904c7ef523cc18284b7e3b3ccf06aca1403b7ebd3", size = 18651, upload-time = "2025-10-08T17:44:47.223Z" }, +] + +[[package]] +name = "pluggy" +version = "1.5.0" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version < '3.9'", +] +sdist = { url = "https://files.pythonhosted.org/packages/96/2d/02d4312c973c6050a18b314a5ad0b3210edb65a906f868e31c111dede4a6/pluggy-1.5.0.tar.gz", hash = "sha256:2cffa88e94fdc978c4c574f15f9e59b7f4201d439195c3715ca9e2486f1d0cf1", size = 67955, upload-time = "2024-04-20T21:34:42.531Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/88/5f/e351af9a41f866ac3f1fac4ca0613908d9a41741cfcf2228f4ad853b697d/pluggy-1.5.0-py3-none-any.whl", hash = "sha256:44e1ad92c8ca002de6377e165f3e0f1be63266ab4d554740532335b9d75ea669", size = 20556, upload-time = "2024-04-20T21:34:40.434Z" }, +] + +[[package]] +name = "pluggy" +version = "1.6.0" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version >= '3.14'", + "python_full_version >= '3.11' and python_full_version < '3.14'", + "python_full_version == '3.10.*'", + "python_full_version == '3.9.*'", +] +sdist = { url = "https://files.pythonhosted.org/packages/f9/e2/3e91f31a7d2b083fe6ef3fa267035b518369d9511ffab804f839851d2779/pluggy-1.6.0.tar.gz", hash = "sha256:7dcc130b76258d33b90f61b658791dede3486c3e6bfb003ee5c9bfb396dd22f3", size = 69412, upload-time = "2025-05-15T12:30:07.975Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/54/20/4d324d65cc6d9205fabedc306948156824eb9f0ee1633355a8f7ec5c66bf/pluggy-1.6.0-py3-none-any.whl", hash = "sha256:e920276dd6813095e9377c0bc5566d94c932c33b27a3e3945d8389c374dd4746", size = 20538, upload-time = "2025-05-15T12:30:06.134Z" }, +] + +[[package]] +name = "pooch" +version = "1.8.2" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "packaging" }, + { name = "platformdirs", version = "4.3.6", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.9'" }, + { name = "platformdirs", version = "4.4.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version == '3.9.*'" }, + { name = "platformdirs", version = "4.5.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.10'" }, + { name = "requests", version = "2.32.4", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.9'" }, + { name = "requests", version = "2.32.5", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.9'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/c6/77/b3d3e00c696c16cf99af81ef7b1f5fe73bd2a307abca41bd7605429fe6e5/pooch-1.8.2.tar.gz", hash = "sha256:76561f0de68a01da4df6af38e9955c4c9d1a5c90da73f7e40276a5728ec83d10", size = 59353, upload-time = "2024-06-06T16:53:46.224Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/a8/87/77cc11c7a9ea9fd05503def69e3d18605852cd0d4b0d3b8f15bbeb3ef1d1/pooch-1.8.2-py3-none-any.whl", hash = "sha256:3529a57096f7198778a5ceefd5ac3ef0e4d06a6ddaf9fc2d609b806f25302c47", size = 64574, upload-time = "2024-06-06T16:53:44.343Z" }, +] + +[[package]] +name = "prometheus-client" +version = "0.21.1" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version < '3.9'", +] +sdist = { url = "https://files.pythonhosted.org/packages/62/14/7d0f567991f3a9af8d1cd4f619040c93b68f09a02b6d0b6ab1b2d1ded5fe/prometheus_client-0.21.1.tar.gz", hash = "sha256:252505a722ac04b0456be05c05f75f45d760c2911ffc45f2a06bcaed9f3ae3fb", size = 78551, upload-time = "2024-12-03T14:59:12.164Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ff/c2/ab7d37426c179ceb9aeb109a85cda8948bb269b7561a0be870cc656eefe4/prometheus_client-0.21.1-py3-none-any.whl", hash = "sha256:594b45c410d6f4f8888940fe80b5cc2521b305a1fafe1c58609ef715a001f301", size = 54682, upload-time = "2024-12-03T14:59:10.935Z" }, +] + +[[package]] +name = "prometheus-client" +version = "0.23.1" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version >= '3.14'", + "python_full_version >= '3.11' and python_full_version < '3.14'", + "python_full_version == '3.10.*'", + "python_full_version == '3.9.*'", +] +sdist = { url = "https://files.pythonhosted.org/packages/23/53/3edb5d68ecf6b38fcbcc1ad28391117d2a322d9a1a3eff04bfdb184d8c3b/prometheus_client-0.23.1.tar.gz", hash = "sha256:6ae8f9081eaaaf153a2e959d2e6c4f4fb57b12ef76c8c7980202f1e57b48b2ce", size = 80481, upload-time = "2025-09-18T20:47:25.043Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/b8/db/14bafcb4af2139e046d03fd00dea7873e48eafe18b7d2797e73d6681f210/prometheus_client-0.23.1-py3-none-any.whl", hash = "sha256:dd1913e6e76b59cfe44e7a4b83e01afc9873c1bdfd2ed8739f1e76aeca115f99", size = 61145, upload-time = "2025-09-18T20:47:23.875Z" }, +] + +[[package]] +name = "prompt-toolkit" +version = "3.0.52" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "wcwidth" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/a1/96/06e01a7b38dce6fe1db213e061a4602dd6032a8a97ef6c1a862537732421/prompt_toolkit-3.0.52.tar.gz", hash = "sha256:28cde192929c8e7321de85de1ddbe736f1375148b02f2e17edd840042b1be855", size = 434198, upload-time = "2025-08-27T15:24:02.057Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/84/03/0d3ce49e2505ae70cf43bc5bb3033955d2fc9f932163e84dc0779cc47f48/prompt_toolkit-3.0.52-py3-none-any.whl", hash = "sha256:9aac639a3bbd33284347de5ad8d68ecc044b91a762dc39b7c21095fcd6a19955", size = 391431, upload-time = "2025-08-27T15:23:59.498Z" }, +] + +[[package]] +name = "propcache" +version = "0.2.0" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version < '3.9'", +] +sdist = { url = "https://files.pythonhosted.org/packages/a9/4d/5e5a60b78dbc1d464f8a7bbaeb30957257afdc8512cbb9dfd5659304f5cd/propcache-0.2.0.tar.gz", hash = "sha256:df81779732feb9d01e5d513fad0122efb3d53bbc75f61b2a4f29a020bc985e70", size = 40951, upload-time = "2024-10-07T12:56:36.896Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/3a/08/1963dfb932b8d74d5b09098507b37e9b96c835ba89ab8aad35aa330f4ff3/propcache-0.2.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:c5869b8fd70b81835a6f187c5fdbe67917a04d7e52b6e7cc4e5fe39d55c39d58", size = 80712, upload-time = "2024-10-07T12:54:02.193Z" }, + { url = "https://files.pythonhosted.org/packages/e6/59/49072aba9bf8a8ed958e576182d46f038e595b17ff7408bc7e8807e721e1/propcache-0.2.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:952e0d9d07609d9c5be361f33b0d6d650cd2bae393aabb11d9b719364521984b", size = 46301, upload-time = "2024-10-07T12:54:03.576Z" }, + { url = "https://files.pythonhosted.org/packages/33/a2/6b1978c2e0d80a678e2c483f45e5443c15fe5d32c483902e92a073314ef1/propcache-0.2.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:33ac8f098df0585c0b53009f039dfd913b38c1d2edafed0cedcc0c32a05aa110", size = 45581, upload-time = "2024-10-07T12:54:05.415Z" }, + { url = "https://files.pythonhosted.org/packages/43/95/55acc9adff8f997c7572f23d41993042290dfb29e404cdadb07039a4386f/propcache-0.2.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:97e48e8875e6c13909c800fa344cd54cc4b2b0db1d5f911f840458a500fde2c2", size = 208659, upload-time = "2024-10-07T12:54:06.742Z" }, + { url = "https://files.pythonhosted.org/packages/bd/2c/ef7371ff715e6cd19ea03fdd5637ecefbaa0752fee5b0f2fe8ea8407ee01/propcache-0.2.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:388f3217649d6d59292b722d940d4d2e1e6a7003259eb835724092a1cca0203a", size = 222613, upload-time = "2024-10-07T12:54:08.204Z" }, + { url = "https://files.pythonhosted.org/packages/5e/1c/fef251f79fd4971a413fa4b1ae369ee07727b4cc2c71e2d90dfcde664fbb/propcache-0.2.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f571aea50ba5623c308aa146eb650eebf7dbe0fd8c5d946e28343cb3b5aad577", size = 221067, upload-time = "2024-10-07T12:54:10.449Z" }, + { url = "https://files.pythonhosted.org/packages/8d/e7/22e76ae6fc5a1708bdce92bdb49de5ebe89a173db87e4ef597d6bbe9145a/propcache-0.2.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3dfafb44f7bb35c0c06eda6b2ab4bfd58f02729e7c4045e179f9a861b07c9850", size = 208920, upload-time = "2024-10-07T12:54:11.903Z" }, + { url = "https://files.pythonhosted.org/packages/04/3e/f10aa562781bcd8a1e0b37683a23bef32bdbe501d9cc7e76969becaac30d/propcache-0.2.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a3ebe9a75be7ab0b7da2464a77bb27febcb4fab46a34f9288f39d74833db7f61", size = 200050, upload-time = "2024-10-07T12:54:13.292Z" }, + { url = "https://files.pythonhosted.org/packages/d0/98/8ac69f638358c5f2a0043809c917802f96f86026e86726b65006830f3dc6/propcache-0.2.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:d2f0d0f976985f85dfb5f3d685697ef769faa6b71993b46b295cdbbd6be8cc37", size = 202346, upload-time = "2024-10-07T12:54:14.644Z" }, + { url = "https://files.pythonhosted.org/packages/ee/78/4acfc5544a5075d8e660af4d4e468d60c418bba93203d1363848444511ad/propcache-0.2.0-cp310-cp310-musllinux_1_2_armv7l.whl", hash = "sha256:a3dc1a4b165283bd865e8f8cb5f0c64c05001e0718ed06250d8cac9bec115b48", size = 199750, upload-time = "2024-10-07T12:54:16.286Z" }, + { url = "https://files.pythonhosted.org/packages/a2/8f/90ada38448ca2e9cf25adc2fe05d08358bda1b9446f54a606ea38f41798b/propcache-0.2.0-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:9e0f07b42d2a50c7dd2d8675d50f7343d998c64008f1da5fef888396b7f84630", size = 201279, upload-time = "2024-10-07T12:54:17.752Z" }, + { url = "https://files.pythonhosted.org/packages/08/31/0e299f650f73903da851f50f576ef09bfffc8e1519e6a2f1e5ed2d19c591/propcache-0.2.0-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:e63e3e1e0271f374ed489ff5ee73d4b6e7c60710e1f76af5f0e1a6117cd26394", size = 211035, upload-time = "2024-10-07T12:54:19.109Z" }, + { url = "https://files.pythonhosted.org/packages/85/3e/e356cc6b09064bff1c06d0b2413593e7c925726f0139bc7acef8a21e87a8/propcache-0.2.0-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:56bb5c98f058a41bb58eead194b4db8c05b088c93d94d5161728515bd52b052b", size = 215565, upload-time = "2024-10-07T12:54:20.578Z" }, + { url = "https://files.pythonhosted.org/packages/8b/54/4ef7236cd657e53098bd05aa59cbc3cbf7018fba37b40eaed112c3921e51/propcache-0.2.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:7665f04d0c7f26ff8bb534e1c65068409bf4687aa2534faf7104d7182debb336", size = 207604, upload-time = "2024-10-07T12:54:22.588Z" }, + { url = "https://files.pythonhosted.org/packages/1f/27/d01d7799c068443ee64002f0655d82fb067496897bf74b632e28ee6a32cf/propcache-0.2.0-cp310-cp310-win32.whl", hash = "sha256:7cf18abf9764746b9c8704774d8b06714bcb0a63641518a3a89c7f85cc02c2ad", size = 40526, upload-time = "2024-10-07T12:54:23.867Z" }, + { url = "https://files.pythonhosted.org/packages/bb/44/6c2add5eeafb7f31ff0d25fbc005d930bea040a1364cf0f5768750ddf4d1/propcache-0.2.0-cp310-cp310-win_amd64.whl", hash = "sha256:cfac69017ef97db2438efb854edf24f5a29fd09a536ff3a992b75990720cdc99", size = 44958, upload-time = "2024-10-07T12:54:24.983Z" }, + { url = "https://files.pythonhosted.org/packages/e0/1c/71eec730e12aec6511e702ad0cd73c2872eccb7cad39de8ba3ba9de693ef/propcache-0.2.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:63f13bf09cc3336eb04a837490b8f332e0db41da66995c9fd1ba04552e516354", size = 80811, upload-time = "2024-10-07T12:54:26.165Z" }, + { url = "https://files.pythonhosted.org/packages/89/c3/7e94009f9a4934c48a371632197406a8860b9f08e3f7f7d922ab69e57a41/propcache-0.2.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:608cce1da6f2672a56b24a015b42db4ac612ee709f3d29f27a00c943d9e851de", size = 46365, upload-time = "2024-10-07T12:54:28.034Z" }, + { url = "https://files.pythonhosted.org/packages/c0/1d/c700d16d1d6903aeab28372fe9999762f074b80b96a0ccc953175b858743/propcache-0.2.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:466c219deee4536fbc83c08d09115249db301550625c7fef1c5563a584c9bc87", size = 45602, upload-time = "2024-10-07T12:54:29.148Z" }, + { url = "https://files.pythonhosted.org/packages/2e/5e/4a3e96380805bf742712e39a4534689f4cddf5fa2d3a93f22e9fd8001b23/propcache-0.2.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fc2db02409338bf36590aa985a461b2c96fce91f8e7e0f14c50c5fcc4f229016", size = 236161, upload-time = "2024-10-07T12:54:31.557Z" }, + { url = "https://files.pythonhosted.org/packages/a5/85/90132481183d1436dff6e29f4fa81b891afb6cb89a7306f32ac500a25932/propcache-0.2.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a6ed8db0a556343d566a5c124ee483ae113acc9a557a807d439bcecc44e7dfbb", size = 244938, upload-time = "2024-10-07T12:54:33.051Z" }, + { url = "https://files.pythonhosted.org/packages/4a/89/c893533cb45c79c970834274e2d0f6d64383ec740be631b6a0a1d2b4ddc0/propcache-0.2.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:91997d9cb4a325b60d4e3f20967f8eb08dfcb32b22554d5ef78e6fd1dda743a2", size = 243576, upload-time = "2024-10-07T12:54:34.497Z" }, + { url = "https://files.pythonhosted.org/packages/8c/56/98c2054c8526331a05f205bf45cbb2cda4e58e56df70e76d6a509e5d6ec6/propcache-0.2.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4c7dde9e533c0a49d802b4f3f218fa9ad0a1ce21f2c2eb80d5216565202acab4", size = 236011, upload-time = "2024-10-07T12:54:35.903Z" }, + { url = "https://files.pythonhosted.org/packages/2d/0c/8b8b9f8a6e1abd869c0fa79b907228e7abb966919047d294ef5df0d136cf/propcache-0.2.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ffcad6c564fe6b9b8916c1aefbb37a362deebf9394bd2974e9d84232e3e08504", size = 224834, upload-time = "2024-10-07T12:54:37.238Z" }, + { url = "https://files.pythonhosted.org/packages/18/bb/397d05a7298b7711b90e13108db697732325cafdcd8484c894885c1bf109/propcache-0.2.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:97a58a28bcf63284e8b4d7b460cbee1edaab24634e82059c7b8c09e65284f178", size = 224946, upload-time = "2024-10-07T12:54:38.72Z" }, + { url = "https://files.pythonhosted.org/packages/25/19/4fc08dac19297ac58135c03770b42377be211622fd0147f015f78d47cd31/propcache-0.2.0-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:945db8ee295d3af9dbdbb698cce9bbc5c59b5c3fe328bbc4387f59a8a35f998d", size = 217280, upload-time = "2024-10-07T12:54:40.089Z" }, + { url = "https://files.pythonhosted.org/packages/7e/76/c79276a43df2096ce2aba07ce47576832b1174c0c480fe6b04bd70120e59/propcache-0.2.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:39e104da444a34830751715f45ef9fc537475ba21b7f1f5b0f4d71a3b60d7fe2", size = 220088, upload-time = "2024-10-07T12:54:41.726Z" }, + { url = "https://files.pythonhosted.org/packages/c3/9a/8a8cf428a91b1336b883f09c8b884e1734c87f724d74b917129a24fe2093/propcache-0.2.0-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:c5ecca8f9bab618340c8e848d340baf68bcd8ad90a8ecd7a4524a81c1764b3db", size = 233008, upload-time = "2024-10-07T12:54:43.742Z" }, + { url = "https://files.pythonhosted.org/packages/25/7b/768a8969abd447d5f0f3333df85c6a5d94982a1bc9a89c53c154bf7a8b11/propcache-0.2.0-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:c436130cc779806bdf5d5fae0d848713105472b8566b75ff70048c47d3961c5b", size = 237719, upload-time = "2024-10-07T12:54:45.065Z" }, + { url = "https://files.pythonhosted.org/packages/ed/0d/e5d68ccc7976ef8b57d80613ac07bbaf0614d43f4750cf953f0168ef114f/propcache-0.2.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:191db28dc6dcd29d1a3e063c3be0b40688ed76434622c53a284e5427565bbd9b", size = 227729, upload-time = "2024-10-07T12:54:46.405Z" }, + { url = "https://files.pythonhosted.org/packages/05/64/17eb2796e2d1c3d0c431dc5f40078d7282f4645af0bb4da9097fbb628c6c/propcache-0.2.0-cp311-cp311-win32.whl", hash = "sha256:5f2564ec89058ee7c7989a7b719115bdfe2a2fb8e7a4543b8d1c0cc4cf6478c1", size = 40473, upload-time = "2024-10-07T12:54:47.694Z" }, + { url = "https://files.pythonhosted.org/packages/83/c5/e89fc428ccdc897ade08cd7605f174c69390147526627a7650fb883e0cd0/propcache-0.2.0-cp311-cp311-win_amd64.whl", hash = "sha256:6e2e54267980349b723cff366d1e29b138b9a60fa376664a157a342689553f71", size = 44921, upload-time = "2024-10-07T12:54:48.935Z" }, + { url = "https://files.pythonhosted.org/packages/7c/46/a41ca1097769fc548fc9216ec4c1471b772cc39720eb47ed7e38ef0006a9/propcache-0.2.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:2ee7606193fb267be4b2e3b32714f2d58cad27217638db98a60f9efb5efeccc2", size = 80800, upload-time = "2024-10-07T12:54:50.409Z" }, + { url = "https://files.pythonhosted.org/packages/75/4f/93df46aab9cc473498ff56be39b5f6ee1e33529223d7a4d8c0a6101a9ba2/propcache-0.2.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:91ee8fc02ca52e24bcb77b234f22afc03288e1dafbb1f88fe24db308910c4ac7", size = 46443, upload-time = "2024-10-07T12:54:51.634Z" }, + { url = "https://files.pythonhosted.org/packages/0b/17/308acc6aee65d0f9a8375e36c4807ac6605d1f38074b1581bd4042b9fb37/propcache-0.2.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:2e900bad2a8456d00a113cad8c13343f3b1f327534e3589acc2219729237a2e8", size = 45676, upload-time = "2024-10-07T12:54:53.454Z" }, + { url = "https://files.pythonhosted.org/packages/65/44/626599d2854d6c1d4530b9a05e7ff2ee22b790358334b475ed7c89f7d625/propcache-0.2.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f52a68c21363c45297aca15561812d542f8fc683c85201df0bebe209e349f793", size = 246191, upload-time = "2024-10-07T12:54:55.438Z" }, + { url = "https://files.pythonhosted.org/packages/f2/df/5d996d7cb18df076debae7d76ac3da085c0575a9f2be6b1f707fe227b54c/propcache-0.2.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1e41d67757ff4fbc8ef2af99b338bfb955010444b92929e9e55a6d4dcc3c4f09", size = 251791, upload-time = "2024-10-07T12:54:57.441Z" }, + { url = "https://files.pythonhosted.org/packages/2e/6d/9f91e5dde8b1f662f6dd4dff36098ed22a1ef4e08e1316f05f4758f1576c/propcache-0.2.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a64e32f8bd94c105cc27f42d3b658902b5bcc947ece3c8fe7bc1b05982f60e89", size = 253434, upload-time = "2024-10-07T12:54:58.857Z" }, + { url = "https://files.pythonhosted.org/packages/3c/e9/1b54b7e26f50b3e0497cd13d3483d781d284452c2c50dd2a615a92a087a3/propcache-0.2.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:55346705687dbd7ef0d77883ab4f6fabc48232f587925bdaf95219bae072491e", size = 248150, upload-time = "2024-10-07T12:55:00.19Z" }, + { url = "https://files.pythonhosted.org/packages/a7/ef/a35bf191c8038fe3ce9a414b907371c81d102384eda5dbafe6f4dce0cf9b/propcache-0.2.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:00181262b17e517df2cd85656fcd6b4e70946fe62cd625b9d74ac9977b64d8d9", size = 233568, upload-time = "2024-10-07T12:55:01.723Z" }, + { url = "https://files.pythonhosted.org/packages/97/d9/d00bb9277a9165a5e6d60f2142cd1a38a750045c9c12e47ae087f686d781/propcache-0.2.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:6994984550eaf25dd7fc7bd1b700ff45c894149341725bb4edc67f0ffa94efa4", size = 229874, upload-time = "2024-10-07T12:55:03.962Z" }, + { url = "https://files.pythonhosted.org/packages/8e/78/c123cf22469bdc4b18efb78893e69c70a8b16de88e6160b69ca6bdd88b5d/propcache-0.2.0-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:56295eb1e5f3aecd516d91b00cfd8bf3a13991de5a479df9e27dd569ea23959c", size = 225857, upload-time = "2024-10-07T12:55:06.439Z" }, + { url = "https://files.pythonhosted.org/packages/31/1b/fd6b2f1f36d028820d35475be78859d8c89c8f091ad30e377ac49fd66359/propcache-0.2.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:439e76255daa0f8151d3cb325f6dd4a3e93043e6403e6491813bcaaaa8733887", size = 227604, upload-time = "2024-10-07T12:55:08.254Z" }, + { url = "https://files.pythonhosted.org/packages/99/36/b07be976edf77a07233ba712e53262937625af02154353171716894a86a6/propcache-0.2.0-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:f6475a1b2ecb310c98c28d271a30df74f9dd436ee46d09236a6b750a7599ce57", size = 238430, upload-time = "2024-10-07T12:55:09.766Z" }, + { url = "https://files.pythonhosted.org/packages/0d/64/5822f496c9010e3966e934a011ac08cac8734561842bc7c1f65586e0683c/propcache-0.2.0-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:3444cdba6628accf384e349014084b1cacd866fbb88433cd9d279d90a54e0b23", size = 244814, upload-time = "2024-10-07T12:55:11.145Z" }, + { url = "https://files.pythonhosted.org/packages/fd/bd/8657918a35d50b18a9e4d78a5df7b6c82a637a311ab20851eef4326305c1/propcache-0.2.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:4a9d9b4d0a9b38d1c391bb4ad24aa65f306c6f01b512e10a8a34a2dc5675d348", size = 235922, upload-time = "2024-10-07T12:55:12.508Z" }, + { url = "https://files.pythonhosted.org/packages/a8/6f/ec0095e1647b4727db945213a9f395b1103c442ef65e54c62e92a72a3f75/propcache-0.2.0-cp312-cp312-win32.whl", hash = "sha256:69d3a98eebae99a420d4b28756c8ce6ea5a29291baf2dc9ff9414b42676f61d5", size = 40177, upload-time = "2024-10-07T12:55:13.814Z" }, + { url = "https://files.pythonhosted.org/packages/20/a2/bd0896fdc4f4c1db46d9bc361c8c79a9bf08ccc08ba054a98e38e7ba1557/propcache-0.2.0-cp312-cp312-win_amd64.whl", hash = "sha256:ad9c9b99b05f163109466638bd30ada1722abb01bbb85c739c50b6dc11f92dc3", size = 44446, upload-time = "2024-10-07T12:55:14.972Z" }, + { url = "https://files.pythonhosted.org/packages/a8/a7/5f37b69197d4f558bfef5b4bceaff7c43cc9b51adf5bd75e9081d7ea80e4/propcache-0.2.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:ecddc221a077a8132cf7c747d5352a15ed763b674c0448d811f408bf803d9ad7", size = 78120, upload-time = "2024-10-07T12:55:16.179Z" }, + { url = "https://files.pythonhosted.org/packages/c8/cd/48ab2b30a6b353ecb95a244915f85756d74f815862eb2ecc7a518d565b48/propcache-0.2.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:0e53cb83fdd61cbd67202735e6a6687a7b491c8742dfc39c9e01e80354956763", size = 45127, upload-time = "2024-10-07T12:55:18.275Z" }, + { url = "https://files.pythonhosted.org/packages/a5/ba/0a1ef94a3412aab057bd996ed5f0ac7458be5bf469e85c70fa9ceb43290b/propcache-0.2.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:92fe151145a990c22cbccf9ae15cae8ae9eddabfc949a219c9f667877e40853d", size = 44419, upload-time = "2024-10-07T12:55:19.487Z" }, + { url = "https://files.pythonhosted.org/packages/b4/6c/ca70bee4f22fa99eacd04f4d2f1699be9d13538ccf22b3169a61c60a27fa/propcache-0.2.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d6a21ef516d36909931a2967621eecb256018aeb11fc48656e3257e73e2e247a", size = 229611, upload-time = "2024-10-07T12:55:21.377Z" }, + { url = "https://files.pythonhosted.org/packages/19/70/47b872a263e8511ca33718d96a10c17d3c853aefadeb86dc26e8421184b9/propcache-0.2.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3f88a4095e913f98988f5b338c1d4d5d07dbb0b6bad19892fd447484e483ba6b", size = 234005, upload-time = "2024-10-07T12:55:22.898Z" }, + { url = "https://files.pythonhosted.org/packages/4f/be/3b0ab8c84a22e4a3224719099c1229ddfdd8a6a1558cf75cb55ee1e35c25/propcache-0.2.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5a5b3bb545ead161be780ee85a2b54fdf7092815995661947812dde94a40f6fb", size = 237270, upload-time = "2024-10-07T12:55:24.354Z" }, + { url = "https://files.pythonhosted.org/packages/04/d8/f071bb000d4b8f851d312c3c75701e586b3f643fe14a2e3409b1b9ab3936/propcache-0.2.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:67aeb72e0f482709991aa91345a831d0b707d16b0257e8ef88a2ad246a7280bf", size = 231877, upload-time = "2024-10-07T12:55:25.774Z" }, + { url = "https://files.pythonhosted.org/packages/93/e7/57a035a1359e542bbb0a7df95aad6b9871ebee6dce2840cb157a415bd1f3/propcache-0.2.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3c997f8c44ec9b9b0bcbf2d422cc00a1d9b9c681f56efa6ca149a941e5560da2", size = 217848, upload-time = "2024-10-07T12:55:27.148Z" }, + { url = "https://files.pythonhosted.org/packages/f0/93/d1dea40f112ec183398fb6c42fde340edd7bab202411c4aa1a8289f461b6/propcache-0.2.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:2a66df3d4992bc1d725b9aa803e8c5a66c010c65c741ad901e260ece77f58d2f", size = 216987, upload-time = "2024-10-07T12:55:29.294Z" }, + { url = "https://files.pythonhosted.org/packages/62/4c/877340871251145d3522c2b5d25c16a1690ad655fbab7bb9ece6b117e39f/propcache-0.2.0-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:3ebbcf2a07621f29638799828b8d8668c421bfb94c6cb04269130d8de4fb7136", size = 212451, upload-time = "2024-10-07T12:55:30.643Z" }, + { url = "https://files.pythonhosted.org/packages/7c/bb/a91b72efeeb42906ef58ccf0cdb87947b54d7475fee3c93425d732f16a61/propcache-0.2.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:1235c01ddaa80da8235741e80815ce381c5267f96cc49b1477fdcf8c047ef325", size = 212879, upload-time = "2024-10-07T12:55:32.024Z" }, + { url = "https://files.pythonhosted.org/packages/9b/7f/ee7fea8faac57b3ec5d91ff47470c6c5d40d7f15d0b1fccac806348fa59e/propcache-0.2.0-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:3947483a381259c06921612550867b37d22e1df6d6d7e8361264b6d037595f44", size = 222288, upload-time = "2024-10-07T12:55:33.401Z" }, + { url = "https://files.pythonhosted.org/packages/ff/d7/acd67901c43d2e6b20a7a973d9d5fd543c6e277af29b1eb0e1f7bd7ca7d2/propcache-0.2.0-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:d5bed7f9805cc29c780f3aee05de3262ee7ce1f47083cfe9f77471e9d6777e83", size = 228257, upload-time = "2024-10-07T12:55:35.381Z" }, + { url = "https://files.pythonhosted.org/packages/8d/6f/6272ecc7a8daad1d0754cfc6c8846076a8cb13f810005c79b15ce0ef0cf2/propcache-0.2.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:e4a91d44379f45f5e540971d41e4626dacd7f01004826a18cb048e7da7e96544", size = 221075, upload-time = "2024-10-07T12:55:36.789Z" }, + { url = "https://files.pythonhosted.org/packages/7c/bd/c7a6a719a6b3dd8b3aeadb3675b5783983529e4a3185946aa444d3e078f6/propcache-0.2.0-cp313-cp313-win32.whl", hash = "sha256:f902804113e032e2cdf8c71015651c97af6418363bea8d78dc0911d56c335032", size = 39654, upload-time = "2024-10-07T12:55:38.762Z" }, + { url = "https://files.pythonhosted.org/packages/88/e7/0eef39eff84fa3e001b44de0bd41c7c0e3432e7648ffd3d64955910f002d/propcache-0.2.0-cp313-cp313-win_amd64.whl", hash = "sha256:8f188cfcc64fb1266f4684206c9de0e80f54622c3f22a910cbd200478aeae61e", size = 43705, upload-time = "2024-10-07T12:55:39.921Z" }, + { url = "https://files.pythonhosted.org/packages/b4/94/2c3d64420fd58ed462e2b416386d48e72dec027cf7bb572066cf3866e939/propcache-0.2.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:53d1bd3f979ed529f0805dd35ddaca330f80a9a6d90bc0121d2ff398f8ed8861", size = 82315, upload-time = "2024-10-07T12:55:41.166Z" }, + { url = "https://files.pythonhosted.org/packages/73/b7/9e2a17d9a126f2012b22ddc5d0979c28ca75104e24945214790c1d787015/propcache-0.2.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:83928404adf8fb3d26793665633ea79b7361efa0287dfbd372a7e74311d51ee6", size = 47188, upload-time = "2024-10-07T12:55:42.316Z" }, + { url = "https://files.pythonhosted.org/packages/80/ef/18af27caaae5589c08bb5a461cfa136b83b7e7983be604f2140d91f92b97/propcache-0.2.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:77a86c261679ea5f3896ec060be9dc8e365788248cc1e049632a1be682442063", size = 46314, upload-time = "2024-10-07T12:55:43.544Z" }, + { url = "https://files.pythonhosted.org/packages/fa/df/8dbd3e472baf73251c0fbb571a3f0a4e3a40c52a1c8c2a6c46ab08736ff9/propcache-0.2.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:218db2a3c297a3768c11a34812e63b3ac1c3234c3a086def9c0fee50d35add1f", size = 212874, upload-time = "2024-10-07T12:55:44.823Z" }, + { url = "https://files.pythonhosted.org/packages/7c/57/5d4d783ac594bd56434679b8643673ae12de1ce758116fd8912a7f2313ec/propcache-0.2.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:7735e82e3498c27bcb2d17cb65d62c14f1100b71723b68362872bca7d0913d90", size = 224578, upload-time = "2024-10-07T12:55:46.253Z" }, + { url = "https://files.pythonhosted.org/packages/66/27/072be8ad434c9a3aa1b561f527984ea0ed4ac072fd18dfaaa2aa2d6e6a2b/propcache-0.2.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:20a617c776f520c3875cf4511e0d1db847a076d720714ae35ffe0df3e440be68", size = 222636, upload-time = "2024-10-07T12:55:47.608Z" }, + { url = "https://files.pythonhosted.org/packages/c3/f1/69a30ff0928d07f50bdc6f0147fd9a08e80904fd3fdb711785e518de1021/propcache-0.2.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:67b69535c870670c9f9b14a75d28baa32221d06f6b6fa6f77a0a13c5a7b0a5b9", size = 213573, upload-time = "2024-10-07T12:55:49.82Z" }, + { url = "https://files.pythonhosted.org/packages/a8/2e/c16716ae113fe0a3219978df3665a6fea049d81d50bd28c4ae72a4c77567/propcache-0.2.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4569158070180c3855e9c0791c56be3ceeb192defa2cdf6a3f39e54319e56b89", size = 205438, upload-time = "2024-10-07T12:55:51.231Z" }, + { url = "https://files.pythonhosted.org/packages/e1/df/80e2c5cd5ed56a7bfb1aa58cedb79617a152ae43de7c0a7e800944a6b2e2/propcache-0.2.0-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:db47514ffdbd91ccdc7e6f8407aac4ee94cc871b15b577c1c324236b013ddd04", size = 202352, upload-time = "2024-10-07T12:55:52.596Z" }, + { url = "https://files.pythonhosted.org/packages/0f/4e/79f665fa04839f30ffb2903211c718b9660fbb938ac7a4df79525af5aeb3/propcache-0.2.0-cp38-cp38-musllinux_1_2_armv7l.whl", hash = "sha256:2a60ad3e2553a74168d275a0ef35e8c0a965448ffbc3b300ab3a5bb9956c2162", size = 200476, upload-time = "2024-10-07T12:55:54.016Z" }, + { url = "https://files.pythonhosted.org/packages/a9/39/b9ea7b011521dd7cfd2f89bb6b8b304f3c789ea6285445bc145bebc83094/propcache-0.2.0-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:662dd62358bdeaca0aee5761de8727cfd6861432e3bb828dc2a693aa0471a563", size = 201581, upload-time = "2024-10-07T12:55:56.246Z" }, + { url = "https://files.pythonhosted.org/packages/e4/81/e8e96c97aa0b675a14e37b12ca9c9713b15cfacf0869e64bf3ab389fabf1/propcache-0.2.0-cp38-cp38-musllinux_1_2_ppc64le.whl", hash = "sha256:25a1f88b471b3bc911d18b935ecb7115dff3a192b6fef46f0bfaf71ff4f12418", size = 225628, upload-time = "2024-10-07T12:55:57.686Z" }, + { url = "https://files.pythonhosted.org/packages/eb/99/15f998c502c214f6c7f51462937605d514a8943a9a6c1fa10f40d2710976/propcache-0.2.0-cp38-cp38-musllinux_1_2_s390x.whl", hash = "sha256:f60f0ac7005b9f5a6091009b09a419ace1610e163fa5deaba5ce3484341840e7", size = 229270, upload-time = "2024-10-07T12:55:59.065Z" }, + { url = "https://files.pythonhosted.org/packages/ff/3a/a9f1a0c0e5b994b8f1a1c71bea56bb3e9eeec821cb4dd61e14051c4ba00b/propcache-0.2.0-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:74acd6e291f885678631b7ebc85d2d4aec458dd849b8c841b57ef04047833bed", size = 207771, upload-time = "2024-10-07T12:56:00.393Z" }, + { url = "https://files.pythonhosted.org/packages/ff/3e/6103906a66d6713f32880cf6a5ba84a1406b4d66e1b9389bb9b8e1789f9e/propcache-0.2.0-cp38-cp38-win32.whl", hash = "sha256:d9b6ddac6408194e934002a69bcaadbc88c10b5f38fb9307779d1c629181815d", size = 41015, upload-time = "2024-10-07T12:56:01.953Z" }, + { url = "https://files.pythonhosted.org/packages/37/23/a30214b4c1f2bea24cc1197ef48d67824fbc41d5cf5472b17c37fef6002c/propcache-0.2.0-cp38-cp38-win_amd64.whl", hash = "sha256:676135dcf3262c9c5081cc8f19ad55c8a64e3f7282a21266d05544450bffc3a5", size = 45749, upload-time = "2024-10-07T12:56:03.095Z" }, + { url = "https://files.pythonhosted.org/packages/38/05/797e6738c9f44ab5039e3ff329540c934eabbe8ad7e63c305c75844bc86f/propcache-0.2.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:25c8d773a62ce0451b020c7b29a35cfbc05de8b291163a7a0f3b7904f27253e6", size = 81903, upload-time = "2024-10-07T12:56:04.651Z" }, + { url = "https://files.pythonhosted.org/packages/9f/84/8d5edb9a73e1a56b24dd8f2adb6aac223109ff0e8002313d52e5518258ba/propcache-0.2.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:375a12d7556d462dc64d70475a9ee5982465fbb3d2b364f16b86ba9135793638", size = 46960, upload-time = "2024-10-07T12:56:06.38Z" }, + { url = "https://files.pythonhosted.org/packages/e7/77/388697bedda984af0d12d68e536b98129b167282da3401965c8450de510e/propcache-0.2.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:1ec43d76b9677637a89d6ab86e1fef70d739217fefa208c65352ecf0282be957", size = 46133, upload-time = "2024-10-07T12:56:07.606Z" }, + { url = "https://files.pythonhosted.org/packages/e2/dc/60d444610bc5b1d7a758534f58362b1bcee736a785473f8a39c91f05aad1/propcache-0.2.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f45eec587dafd4b2d41ac189c2156461ebd0c1082d2fe7013571598abb8505d1", size = 211105, upload-time = "2024-10-07T12:56:08.826Z" }, + { url = "https://files.pythonhosted.org/packages/bc/c6/40eb0dd1de6f8e84f454615ab61f68eb4a58f9d63d6f6eaf04300ac0cc17/propcache-0.2.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:bc092ba439d91df90aea38168e11f75c655880c12782facf5cf9c00f3d42b562", size = 226613, upload-time = "2024-10-07T12:56:11.184Z" }, + { url = "https://files.pythonhosted.org/packages/de/b6/e078b5e9de58e20db12135eb6a206b4b43cb26c6b62ee0fe36ac40763a64/propcache-0.2.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:fa1076244f54bb76e65e22cb6910365779d5c3d71d1f18b275f1dfc7b0d71b4d", size = 225587, upload-time = "2024-10-07T12:56:15.294Z" }, + { url = "https://files.pythonhosted.org/packages/ce/4e/97059dd24494d1c93d1efb98bb24825e1930265b41858dd59c15cb37a975/propcache-0.2.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:682a7c79a2fbf40f5dbb1eb6bfe2cd865376deeac65acf9beb607505dced9e12", size = 211826, upload-time = "2024-10-07T12:56:16.997Z" }, + { url = "https://files.pythonhosted.org/packages/fc/23/4dbf726602a989d2280fe130a9b9dd71faa8d3bb8cd23d3261ff3c23f692/propcache-0.2.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8e40876731f99b6f3c897b66b803c9e1c07a989b366c6b5b475fafd1f7ba3fb8", size = 203140, upload-time = "2024-10-07T12:56:18.368Z" }, + { url = "https://files.pythonhosted.org/packages/5b/ce/f3bff82c885dbd9ae9e43f134d5b02516c3daa52d46f7a50e4f52ef9121f/propcache-0.2.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:363ea8cd3c5cb6679f1c2f5f1f9669587361c062e4899fce56758efa928728f8", size = 208841, upload-time = "2024-10-07T12:56:19.859Z" }, + { url = "https://files.pythonhosted.org/packages/29/d7/19a4d3b4c7e95d08f216da97035d0b103d0c90411c6f739d47088d2da1f0/propcache-0.2.0-cp39-cp39-musllinux_1_2_armv7l.whl", hash = "sha256:140fbf08ab3588b3468932974a9331aff43c0ab8a2ec2c608b6d7d1756dbb6cb", size = 203315, upload-time = "2024-10-07T12:56:21.256Z" }, + { url = "https://files.pythonhosted.org/packages/db/87/5748212a18beb8d4ab46315c55ade8960d1e2cdc190764985b2d229dd3f4/propcache-0.2.0-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:e70fac33e8b4ac63dfc4c956fd7d85a0b1139adcfc0d964ce288b7c527537fea", size = 204724, upload-time = "2024-10-07T12:56:23.644Z" }, + { url = "https://files.pythonhosted.org/packages/84/2a/c3d2f989fc571a5bad0fabcd970669ccb08c8f9b07b037ecddbdab16a040/propcache-0.2.0-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:b33d7a286c0dc1a15f5fc864cc48ae92a846df287ceac2dd499926c3801054a6", size = 215514, upload-time = "2024-10-07T12:56:25.733Z" }, + { url = "https://files.pythonhosted.org/packages/c9/1f/4c44c133b08bc5f776afcb8f0833889c2636b8a83e07ea1d9096c1e401b0/propcache-0.2.0-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:f6d5749fdd33d90e34c2efb174c7e236829147a2713334d708746e94c4bde40d", size = 220063, upload-time = "2024-10-07T12:56:28.497Z" }, + { url = "https://files.pythonhosted.org/packages/2e/25/280d0a3bdaee68db74c0acd9a472e59e64b516735b59cffd3a326ff9058a/propcache-0.2.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:22aa8f2272d81d9317ff5756bb108021a056805ce63dd3630e27d042c8092798", size = 211620, upload-time = "2024-10-07T12:56:29.891Z" }, + { url = "https://files.pythonhosted.org/packages/28/8c/266898981b7883c1563c35954f9ce9ced06019fdcc487a9520150c48dc91/propcache-0.2.0-cp39-cp39-win32.whl", hash = "sha256:73e4b40ea0eda421b115248d7e79b59214411109a5bc47d0d48e4c73e3b8fcf9", size = 41049, upload-time = "2024-10-07T12:56:31.246Z" }, + { url = "https://files.pythonhosted.org/packages/af/53/a3e5b937f58e757a940716b88105ec4c211c42790c1ea17052b46dc16f16/propcache-0.2.0-cp39-cp39-win_amd64.whl", hash = "sha256:9517d5e9e0731957468c29dbfd0f976736a0e55afaea843726e887f36fe017df", size = 45587, upload-time = "2024-10-07T12:56:33.416Z" }, + { url = "https://files.pythonhosted.org/packages/3d/b6/e6d98278f2d49b22b4d033c9f792eda783b9ab2094b041f013fc69bcde87/propcache-0.2.0-py3-none-any.whl", hash = "sha256:2ccc28197af5313706511fab3a8b66dcd6da067a1331372c82ea1cb74285e036", size = 11603, upload-time = "2024-10-07T12:56:35.137Z" }, +] + +[[package]] +name = "propcache" +version = "0.4.1" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version >= '3.14'", + "python_full_version >= '3.11' and python_full_version < '3.14'", + "python_full_version == '3.10.*'", + "python_full_version == '3.9.*'", +] +sdist = { url = "https://files.pythonhosted.org/packages/9e/da/e9fc233cf63743258bff22b3dfa7ea5baef7b5bc324af47a0ad89b8ffc6f/propcache-0.4.1.tar.gz", hash = "sha256:f48107a8c637e80362555f37ecf49abe20370e557cc4ab374f04ec4423c97c3d", size = 46442, upload-time = "2025-10-08T19:49:02.291Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/3c/0e/934b541323035566a9af292dba85a195f7b78179114f2c6ebb24551118a9/propcache-0.4.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:7c2d1fa3201efaf55d730400d945b5b3ab6e672e100ba0f9a409d950ab25d7db", size = 79534, upload-time = "2025-10-08T19:46:02.083Z" }, + { url = "https://files.pythonhosted.org/packages/a1/6b/db0d03d96726d995dc7171286c6ba9d8d14251f37433890f88368951a44e/propcache-0.4.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:1eb2994229cc8ce7fe9b3db88f5465f5fd8651672840b2e426b88cdb1a30aac8", size = 45526, upload-time = "2025-10-08T19:46:03.884Z" }, + { url = "https://files.pythonhosted.org/packages/e4/c3/82728404aea669e1600f304f2609cde9e665c18df5a11cdd57ed73c1dceb/propcache-0.4.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:66c1f011f45a3b33d7bcb22daed4b29c0c9e2224758b6be00686731e1b46f925", size = 47263, upload-time = "2025-10-08T19:46:05.405Z" }, + { url = "https://files.pythonhosted.org/packages/df/1b/39313ddad2bf9187a1432654c38249bab4562ef535ef07f5eb6eb04d0b1b/propcache-0.4.1-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:9a52009f2adffe195d0b605c25ec929d26b36ef986ba85244891dee3b294df21", size = 201012, upload-time = "2025-10-08T19:46:07.165Z" }, + { url = "https://files.pythonhosted.org/packages/5b/01/f1d0b57d136f294a142acf97f4ed58c8e5b974c21e543000968357115011/propcache-0.4.1-cp310-cp310-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:5d4e2366a9c7b837555cf02fb9be2e3167d333aff716332ef1b7c3a142ec40c5", size = 209491, upload-time = "2025-10-08T19:46:08.909Z" }, + { url = "https://files.pythonhosted.org/packages/a1/c8/038d909c61c5bb039070b3fb02ad5cccdb1dde0d714792e251cdb17c9c05/propcache-0.4.1-cp310-cp310-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:9d2b6caef873b4f09e26ea7e33d65f42b944837563a47a94719cc3544319a0db", size = 215319, upload-time = "2025-10-08T19:46:10.7Z" }, + { url = "https://files.pythonhosted.org/packages/08/57/8c87e93142b2c1fa2408e45695205a7ba05fb5db458c0bf5c06ba0e09ea6/propcache-0.4.1-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:2b16ec437a8c8a965ecf95739448dd938b5c7f56e67ea009f4300d8df05f32b7", size = 196856, upload-time = "2025-10-08T19:46:12.003Z" }, + { url = "https://files.pythonhosted.org/packages/42/df/5615fec76aa561987a534759b3686008a288e73107faa49a8ae5795a9f7a/propcache-0.4.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:296f4c8ed03ca7476813fe666c9ea97869a8d7aec972618671b33a38a5182ef4", size = 193241, upload-time = "2025-10-08T19:46:13.495Z" }, + { url = "https://files.pythonhosted.org/packages/d5/21/62949eb3a7a54afe8327011c90aca7e03547787a88fb8bd9726806482fea/propcache-0.4.1-cp310-cp310-musllinux_1_2_armv7l.whl", hash = "sha256:1f0978529a418ebd1f49dad413a2b68af33f85d5c5ca5c6ca2a3bed375a7ac60", size = 190552, upload-time = "2025-10-08T19:46:14.938Z" }, + { url = "https://files.pythonhosted.org/packages/30/ee/ab4d727dd70806e5b4de96a798ae7ac6e4d42516f030ee60522474b6b332/propcache-0.4.1-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:fd138803047fb4c062b1c1dd95462f5209456bfab55c734458f15d11da288f8f", size = 200113, upload-time = "2025-10-08T19:46:16.695Z" }, + { url = "https://files.pythonhosted.org/packages/8a/0b/38b46208e6711b016aa8966a3ac793eee0d05c7159d8342aa27fc0bc365e/propcache-0.4.1-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:8c9b3cbe4584636d72ff556d9036e0c9317fa27b3ac1f0f558e7e84d1c9c5900", size = 200778, upload-time = "2025-10-08T19:46:18.023Z" }, + { url = "https://files.pythonhosted.org/packages/cf/81/5abec54355ed344476bee711e9f04815d4b00a311ab0535599204eecc257/propcache-0.4.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:f93243fdc5657247533273ac4f86ae106cc6445a0efacb9a1bfe982fcfefd90c", size = 193047, upload-time = "2025-10-08T19:46:19.449Z" }, + { url = "https://files.pythonhosted.org/packages/ec/b6/1f237c04e32063cb034acd5f6ef34ef3a394f75502e72703545631ab1ef6/propcache-0.4.1-cp310-cp310-win32.whl", hash = "sha256:a0ee98db9c5f80785b266eb805016e36058ac72c51a064040f2bc43b61101cdb", size = 38093, upload-time = "2025-10-08T19:46:20.643Z" }, + { url = "https://files.pythonhosted.org/packages/a6/67/354aac4e0603a15f76439caf0427781bcd6797f370377f75a642133bc954/propcache-0.4.1-cp310-cp310-win_amd64.whl", hash = "sha256:1cdb7988c4e5ac7f6d175a28a9aa0c94cb6f2ebe52756a3c0cda98d2809a9e37", size = 41638, upload-time = "2025-10-08T19:46:21.935Z" }, + { url = "https://files.pythonhosted.org/packages/e0/e1/74e55b9fd1a4c209ff1a9a824bf6c8b3d1fc5a1ac3eabe23462637466785/propcache-0.4.1-cp310-cp310-win_arm64.whl", hash = "sha256:d82ad62b19645419fe79dd63b3f9253e15b30e955c0170e5cebc350c1844e581", size = 38229, upload-time = "2025-10-08T19:46:23.368Z" }, + { url = "https://files.pythonhosted.org/packages/8c/d4/4e2c9aaf7ac2242b9358f98dccd8f90f2605402f5afeff6c578682c2c491/propcache-0.4.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:60a8fda9644b7dfd5dece8c61d8a85e271cb958075bfc4e01083c148b61a7caf", size = 80208, upload-time = "2025-10-08T19:46:24.597Z" }, + { url = "https://files.pythonhosted.org/packages/c2/21/d7b68e911f9c8e18e4ae43bdbc1e1e9bbd971f8866eb81608947b6f585ff/propcache-0.4.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:c30b53e7e6bda1d547cabb47c825f3843a0a1a42b0496087bb58d8fedf9f41b5", size = 45777, upload-time = "2025-10-08T19:46:25.733Z" }, + { url = "https://files.pythonhosted.org/packages/d3/1d/11605e99ac8ea9435651ee71ab4cb4bf03f0949586246476a25aadfec54a/propcache-0.4.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:6918ecbd897443087a3b7cd978d56546a812517dcaaca51b49526720571fa93e", size = 47647, upload-time = "2025-10-08T19:46:27.304Z" }, + { url = "https://files.pythonhosted.org/packages/58/1a/3c62c127a8466c9c843bccb503d40a273e5cc69838805f322e2826509e0d/propcache-0.4.1-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:3d902a36df4e5989763425a8ab9e98cd8ad5c52c823b34ee7ef307fd50582566", size = 214929, upload-time = "2025-10-08T19:46:28.62Z" }, + { url = "https://files.pythonhosted.org/packages/56/b9/8fa98f850960b367c4b8fe0592e7fc341daa7a9462e925228f10a60cf74f/propcache-0.4.1-cp311-cp311-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:a9695397f85973bb40427dedddf70d8dc4a44b22f1650dd4af9eedf443d45165", size = 221778, upload-time = "2025-10-08T19:46:30.358Z" }, + { url = "https://files.pythonhosted.org/packages/46/a6/0ab4f660eb59649d14b3d3d65c439421cf2f87fe5dd68591cbe3c1e78a89/propcache-0.4.1-cp311-cp311-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:2bb07ffd7eaad486576430c89f9b215f9e4be68c4866a96e97db9e97fead85dc", size = 228144, upload-time = "2025-10-08T19:46:32.607Z" }, + { url = "https://files.pythonhosted.org/packages/52/6a/57f43e054fb3d3a56ac9fc532bc684fc6169a26c75c353e65425b3e56eef/propcache-0.4.1-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:fd6f30fdcf9ae2a70abd34da54f18da086160e4d7d9251f81f3da0ff84fc5a48", size = 210030, upload-time = "2025-10-08T19:46:33.969Z" }, + { url = "https://files.pythonhosted.org/packages/40/e2/27e6feebb5f6b8408fa29f5efbb765cd54c153ac77314d27e457a3e993b7/propcache-0.4.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:fc38cba02d1acba4e2869eef1a57a43dfbd3d49a59bf90dda7444ec2be6a5570", size = 208252, upload-time = "2025-10-08T19:46:35.309Z" }, + { url = "https://files.pythonhosted.org/packages/9e/f8/91c27b22ccda1dbc7967f921c42825564fa5336a01ecd72eb78a9f4f53c2/propcache-0.4.1-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:67fad6162281e80e882fb3ec355398cf72864a54069d060321f6cd0ade95fe85", size = 202064, upload-time = "2025-10-08T19:46:36.993Z" }, + { url = "https://files.pythonhosted.org/packages/f2/26/7f00bd6bd1adba5aafe5f4a66390f243acab58eab24ff1a08bebb2ef9d40/propcache-0.4.1-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:f10207adf04d08bec185bae14d9606a1444715bc99180f9331c9c02093e1959e", size = 212429, upload-time = "2025-10-08T19:46:38.398Z" }, + { url = "https://files.pythonhosted.org/packages/84/89/fd108ba7815c1117ddca79c228f3f8a15fc82a73bca8b142eb5de13b2785/propcache-0.4.1-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:e9b0d8d0845bbc4cfcdcbcdbf5086886bc8157aa963c31c777ceff7846c77757", size = 216727, upload-time = "2025-10-08T19:46:39.732Z" }, + { url = "https://files.pythonhosted.org/packages/79/37/3ec3f7e3173e73f1d600495d8b545b53802cbf35506e5732dd8578db3724/propcache-0.4.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:981333cb2f4c1896a12f4ab92a9cc8f09ea664e9b7dbdc4eff74627af3a11c0f", size = 205097, upload-time = "2025-10-08T19:46:41.025Z" }, + { url = "https://files.pythonhosted.org/packages/61/b0/b2631c19793f869d35f47d5a3a56fb19e9160d3c119f15ac7344fc3ccae7/propcache-0.4.1-cp311-cp311-win32.whl", hash = "sha256:f1d2f90aeec838a52f1c1a32fe9a619fefd5e411721a9117fbf82aea638fe8a1", size = 38084, upload-time = "2025-10-08T19:46:42.693Z" }, + { url = "https://files.pythonhosted.org/packages/f4/78/6cce448e2098e9f3bfc91bb877f06aa24b6ccace872e39c53b2f707c4648/propcache-0.4.1-cp311-cp311-win_amd64.whl", hash = "sha256:364426a62660f3f699949ac8c621aad6977be7126c5807ce48c0aeb8e7333ea6", size = 41637, upload-time = "2025-10-08T19:46:43.778Z" }, + { url = "https://files.pythonhosted.org/packages/9c/e9/754f180cccd7f51a39913782c74717c581b9cc8177ad0e949f4d51812383/propcache-0.4.1-cp311-cp311-win_arm64.whl", hash = "sha256:e53f3a38d3510c11953f3e6a33f205c6d1b001129f972805ca9b42fc308bc239", size = 38064, upload-time = "2025-10-08T19:46:44.872Z" }, + { url = "https://files.pythonhosted.org/packages/a2/0f/f17b1b2b221d5ca28b4b876e8bb046ac40466513960646bda8e1853cdfa2/propcache-0.4.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:e153e9cd40cc8945138822807139367f256f89c6810c2634a4f6902b52d3b4e2", size = 80061, upload-time = "2025-10-08T19:46:46.075Z" }, + { url = "https://files.pythonhosted.org/packages/76/47/8ccf75935f51448ba9a16a71b783eb7ef6b9ee60f5d14c7f8a8a79fbeed7/propcache-0.4.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:cd547953428f7abb73c5ad82cbb32109566204260d98e41e5dfdc682eb7f8403", size = 46037, upload-time = "2025-10-08T19:46:47.23Z" }, + { url = "https://files.pythonhosted.org/packages/0a/b6/5c9a0e42df4d00bfb4a3cbbe5cf9f54260300c88a0e9af1f47ca5ce17ac0/propcache-0.4.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:f048da1b4f243fc44f205dfd320933a951b8d89e0afd4c7cacc762a8b9165207", size = 47324, upload-time = "2025-10-08T19:46:48.384Z" }, + { url = "https://files.pythonhosted.org/packages/9e/d3/6c7ee328b39a81ee877c962469f1e795f9db87f925251efeb0545e0020d0/propcache-0.4.1-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ec17c65562a827bba85e3872ead335f95405ea1674860d96483a02f5c698fa72", size = 225505, upload-time = "2025-10-08T19:46:50.055Z" }, + { url = "https://files.pythonhosted.org/packages/01/5d/1c53f4563490b1d06a684742cc6076ef944bc6457df6051b7d1a877c057b/propcache-0.4.1-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:405aac25c6394ef275dee4c709be43745d36674b223ba4eb7144bf4d691b7367", size = 230242, upload-time = "2025-10-08T19:46:51.815Z" }, + { url = "https://files.pythonhosted.org/packages/20/e1/ce4620633b0e2422207c3cb774a0ee61cac13abc6217763a7b9e2e3f4a12/propcache-0.4.1-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:0013cb6f8dde4b2a2f66903b8ba740bdfe378c943c4377a200551ceb27f379e4", size = 238474, upload-time = "2025-10-08T19:46:53.208Z" }, + { url = "https://files.pythonhosted.org/packages/46/4b/3aae6835b8e5f44ea6a68348ad90f78134047b503765087be2f9912140ea/propcache-0.4.1-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:15932ab57837c3368b024473a525e25d316d8353016e7cc0e5ba9eb343fbb1cf", size = 221575, upload-time = "2025-10-08T19:46:54.511Z" }, + { url = "https://files.pythonhosted.org/packages/6e/a5/8a5e8678bcc9d3a1a15b9a29165640d64762d424a16af543f00629c87338/propcache-0.4.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:031dce78b9dc099f4c29785d9cf5577a3faf9ebf74ecbd3c856a7b92768c3df3", size = 216736, upload-time = "2025-10-08T19:46:56.212Z" }, + { url = "https://files.pythonhosted.org/packages/f1/63/b7b215eddeac83ca1c6b934f89d09a625aa9ee4ba158338854c87210cc36/propcache-0.4.1-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:ab08df6c9a035bee56e31af99be621526bd237bea9f32def431c656b29e41778", size = 213019, upload-time = "2025-10-08T19:46:57.595Z" }, + { url = "https://files.pythonhosted.org/packages/57/74/f580099a58c8af587cac7ba19ee7cb418506342fbbe2d4a4401661cca886/propcache-0.4.1-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:4d7af63f9f93fe593afbf104c21b3b15868efb2c21d07d8732c0c4287e66b6a6", size = 220376, upload-time = "2025-10-08T19:46:59.067Z" }, + { url = "https://files.pythonhosted.org/packages/c4/ee/542f1313aff7eaf19c2bb758c5d0560d2683dac001a1c96d0774af799843/propcache-0.4.1-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:cfc27c945f422e8b5071b6e93169679e4eb5bf73bbcbf1ba3ae3a83d2f78ebd9", size = 226988, upload-time = "2025-10-08T19:47:00.544Z" }, + { url = "https://files.pythonhosted.org/packages/8f/18/9c6b015dd9c6930f6ce2229e1f02fb35298b847f2087ea2b436a5bfa7287/propcache-0.4.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:35c3277624a080cc6ec6f847cbbbb5b49affa3598c4535a0a4682a697aaa5c75", size = 215615, upload-time = "2025-10-08T19:47:01.968Z" }, + { url = "https://files.pythonhosted.org/packages/80/9e/e7b85720b98c45a45e1fca6a177024934dc9bc5f4d5dd04207f216fc33ed/propcache-0.4.1-cp312-cp312-win32.whl", hash = "sha256:671538c2262dadb5ba6395e26c1731e1d52534bfe9ae56d0b5573ce539266aa8", size = 38066, upload-time = "2025-10-08T19:47:03.503Z" }, + { url = "https://files.pythonhosted.org/packages/54/09/d19cff2a5aaac632ec8fc03737b223597b1e347416934c1b3a7df079784c/propcache-0.4.1-cp312-cp312-win_amd64.whl", hash = "sha256:cb2d222e72399fcf5890d1d5cc1060857b9b236adff2792ff48ca2dfd46c81db", size = 41655, upload-time = "2025-10-08T19:47:04.973Z" }, + { url = "https://files.pythonhosted.org/packages/68/ab/6b5c191bb5de08036a8c697b265d4ca76148efb10fa162f14af14fb5f076/propcache-0.4.1-cp312-cp312-win_arm64.whl", hash = "sha256:204483131fb222bdaaeeea9f9e6c6ed0cac32731f75dfc1d4a567fc1926477c1", size = 37789, upload-time = "2025-10-08T19:47:06.077Z" }, + { url = "https://files.pythonhosted.org/packages/bf/df/6d9c1b6ac12b003837dde8a10231a7344512186e87b36e855bef32241942/propcache-0.4.1-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:43eedf29202c08550aac1d14e0ee619b0430aaef78f85864c1a892294fbc28cf", size = 77750, upload-time = "2025-10-08T19:47:07.648Z" }, + { url = "https://files.pythonhosted.org/packages/8b/e8/677a0025e8a2acf07d3418a2e7ba529c9c33caf09d3c1f25513023c1db56/propcache-0.4.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:d62cdfcfd89ccb8de04e0eda998535c406bf5e060ffd56be6c586cbcc05b3311", size = 44780, upload-time = "2025-10-08T19:47:08.851Z" }, + { url = "https://files.pythonhosted.org/packages/89/a4/92380f7ca60f99ebae761936bc48a72a639e8a47b29050615eef757cb2a7/propcache-0.4.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:cae65ad55793da34db5f54e4029b89d3b9b9490d8abe1b4c7ab5d4b8ec7ebf74", size = 46308, upload-time = "2025-10-08T19:47:09.982Z" }, + { url = "https://files.pythonhosted.org/packages/2d/48/c5ac64dee5262044348d1d78a5f85dd1a57464a60d30daee946699963eb3/propcache-0.4.1-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:333ddb9031d2704a301ee3e506dc46b1fe5f294ec198ed6435ad5b6a085facfe", size = 208182, upload-time = "2025-10-08T19:47:11.319Z" }, + { url = "https://files.pythonhosted.org/packages/c6/0c/cd762dd011a9287389a6a3eb43aa30207bde253610cca06824aeabfe9653/propcache-0.4.1-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:fd0858c20f078a32cf55f7e81473d96dcf3b93fd2ccdb3d40fdf54b8573df3af", size = 211215, upload-time = "2025-10-08T19:47:13.146Z" }, + { url = "https://files.pythonhosted.org/packages/30/3e/49861e90233ba36890ae0ca4c660e95df565b2cd15d4a68556ab5865974e/propcache-0.4.1-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:678ae89ebc632c5c204c794f8dab2837c5f159aeb59e6ed0539500400577298c", size = 218112, upload-time = "2025-10-08T19:47:14.913Z" }, + { url = "https://files.pythonhosted.org/packages/f1/8b/544bc867e24e1bd48f3118cecd3b05c694e160a168478fa28770f22fd094/propcache-0.4.1-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:d472aeb4fbf9865e0c6d622d7f4d54a4e101a89715d8904282bb5f9a2f476c3f", size = 204442, upload-time = "2025-10-08T19:47:16.277Z" }, + { url = "https://files.pythonhosted.org/packages/50/a6/4282772fd016a76d3e5c0df58380a5ea64900afd836cec2c2f662d1b9bb3/propcache-0.4.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:4d3df5fa7e36b3225954fba85589da77a0fe6a53e3976de39caf04a0db4c36f1", size = 199398, upload-time = "2025-10-08T19:47:17.962Z" }, + { url = "https://files.pythonhosted.org/packages/3e/ec/d8a7cd406ee1ddb705db2139f8a10a8a427100347bd698e7014351c7af09/propcache-0.4.1-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:ee17f18d2498f2673e432faaa71698032b0127ebf23ae5974eeaf806c279df24", size = 196920, upload-time = "2025-10-08T19:47:19.355Z" }, + { url = "https://files.pythonhosted.org/packages/f6/6c/f38ab64af3764f431e359f8baf9e0a21013e24329e8b85d2da32e8ed07ca/propcache-0.4.1-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:580e97762b950f993ae618e167e7be9256b8353c2dcd8b99ec100eb50f5286aa", size = 203748, upload-time = "2025-10-08T19:47:21.338Z" }, + { url = "https://files.pythonhosted.org/packages/d6/e3/fa846bd70f6534d647886621388f0a265254d30e3ce47e5c8e6e27dbf153/propcache-0.4.1-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:501d20b891688eb8e7aa903021f0b72d5a55db40ffaab27edefd1027caaafa61", size = 205877, upload-time = "2025-10-08T19:47:23.059Z" }, + { url = "https://files.pythonhosted.org/packages/e2/39/8163fc6f3133fea7b5f2827e8eba2029a0277ab2c5beee6c1db7b10fc23d/propcache-0.4.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:9a0bd56e5b100aef69bd8562b74b46254e7c8812918d3baa700c8a8009b0af66", size = 199437, upload-time = "2025-10-08T19:47:24.445Z" }, + { url = "https://files.pythonhosted.org/packages/93/89/caa9089970ca49c7c01662bd0eeedfe85494e863e8043565aeb6472ce8fe/propcache-0.4.1-cp313-cp313-win32.whl", hash = "sha256:bcc9aaa5d80322bc2fb24bb7accb4a30f81e90ab8d6ba187aec0744bc302ad81", size = 37586, upload-time = "2025-10-08T19:47:25.736Z" }, + { url = "https://files.pythonhosted.org/packages/f5/ab/f76ec3c3627c883215b5c8080debb4394ef5a7a29be811f786415fc1e6fd/propcache-0.4.1-cp313-cp313-win_amd64.whl", hash = "sha256:381914df18634f5494334d201e98245c0596067504b9372d8cf93f4bb23e025e", size = 40790, upload-time = "2025-10-08T19:47:26.847Z" }, + { url = "https://files.pythonhosted.org/packages/59/1b/e71ae98235f8e2ba5004d8cb19765a74877abf189bc53fc0c80d799e56c3/propcache-0.4.1-cp313-cp313-win_arm64.whl", hash = "sha256:8873eb4460fd55333ea49b7d189749ecf6e55bf85080f11b1c4530ed3034cba1", size = 37158, upload-time = "2025-10-08T19:47:27.961Z" }, + { url = "https://files.pythonhosted.org/packages/83/ce/a31bbdfc24ee0dcbba458c8175ed26089cf109a55bbe7b7640ed2470cfe9/propcache-0.4.1-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:92d1935ee1f8d7442da9c0c4fa7ac20d07e94064184811b685f5c4fada64553b", size = 81451, upload-time = "2025-10-08T19:47:29.445Z" }, + { url = "https://files.pythonhosted.org/packages/25/9c/442a45a470a68456e710d96cacd3573ef26a1d0a60067e6a7d5e655621ed/propcache-0.4.1-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:473c61b39e1460d386479b9b2f337da492042447c9b685f28be4f74d3529e566", size = 46374, upload-time = "2025-10-08T19:47:30.579Z" }, + { url = "https://files.pythonhosted.org/packages/f4/bf/b1d5e21dbc3b2e889ea4327044fb16312a736d97640fb8b6aa3f9c7b3b65/propcache-0.4.1-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:c0ef0aaafc66fbd87842a3fe3902fd889825646bc21149eafe47be6072725835", size = 48396, upload-time = "2025-10-08T19:47:31.79Z" }, + { url = "https://files.pythonhosted.org/packages/f4/04/5b4c54a103d480e978d3c8a76073502b18db0c4bc17ab91b3cb5092ad949/propcache-0.4.1-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:f95393b4d66bfae908c3ca8d169d5f79cd65636ae15b5e7a4f6e67af675adb0e", size = 275950, upload-time = "2025-10-08T19:47:33.481Z" }, + { url = "https://files.pythonhosted.org/packages/b4/c1/86f846827fb969c4b78b0af79bba1d1ea2156492e1b83dea8b8a6ae27395/propcache-0.4.1-cp313-cp313t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:c07fda85708bc48578467e85099645167a955ba093be0a2dcba962195676e859", size = 273856, upload-time = "2025-10-08T19:47:34.906Z" }, + { url = "https://files.pythonhosted.org/packages/36/1d/fc272a63c8d3bbad6878c336c7a7dea15e8f2d23a544bda43205dfa83ada/propcache-0.4.1-cp313-cp313t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:af223b406d6d000830c6f65f1e6431783fc3f713ba3e6cc8c024d5ee96170a4b", size = 280420, upload-time = "2025-10-08T19:47:36.338Z" }, + { url = "https://files.pythonhosted.org/packages/07/0c/01f2219d39f7e53d52e5173bcb09c976609ba30209912a0680adfb8c593a/propcache-0.4.1-cp313-cp313t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:a78372c932c90ee474559c5ddfffd718238e8673c340dc21fe45c5b8b54559a0", size = 263254, upload-time = "2025-10-08T19:47:37.692Z" }, + { url = "https://files.pythonhosted.org/packages/2d/18/cd28081658ce597898f0c4d174d4d0f3c5b6d4dc27ffafeef835c95eb359/propcache-0.4.1-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:564d9f0d4d9509e1a870c920a89b2fec951b44bf5ba7d537a9e7c1ccec2c18af", size = 261205, upload-time = "2025-10-08T19:47:39.659Z" }, + { url = "https://files.pythonhosted.org/packages/7a/71/1f9e22eb8b8316701c2a19fa1f388c8a3185082607da8e406a803c9b954e/propcache-0.4.1-cp313-cp313t-musllinux_1_2_armv7l.whl", hash = "sha256:17612831fda0138059cc5546f4d12a2aacfb9e47068c06af35c400ba58ba7393", size = 247873, upload-time = "2025-10-08T19:47:41.084Z" }, + { url = "https://files.pythonhosted.org/packages/4a/65/3d4b61f36af2b4eddba9def857959f1016a51066b4f1ce348e0cf7881f58/propcache-0.4.1-cp313-cp313t-musllinux_1_2_ppc64le.whl", hash = "sha256:41a89040cb10bd345b3c1a873b2bf36413d48da1def52f268a055f7398514874", size = 262739, upload-time = "2025-10-08T19:47:42.51Z" }, + { url = "https://files.pythonhosted.org/packages/2a/42/26746ab087faa77c1c68079b228810436ccd9a5ce9ac85e2b7307195fd06/propcache-0.4.1-cp313-cp313t-musllinux_1_2_s390x.whl", hash = "sha256:e35b88984e7fa64aacecea39236cee32dd9bd8c55f57ba8a75cf2399553f9bd7", size = 263514, upload-time = "2025-10-08T19:47:43.927Z" }, + { url = "https://files.pythonhosted.org/packages/94/13/630690fe201f5502d2403dd3cfd451ed8858fe3c738ee88d095ad2ff407b/propcache-0.4.1-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:6f8b465489f927b0df505cbe26ffbeed4d6d8a2bbc61ce90eb074ff129ef0ab1", size = 257781, upload-time = "2025-10-08T19:47:45.448Z" }, + { url = "https://files.pythonhosted.org/packages/92/f7/1d4ec5841505f423469efbfc381d64b7b467438cd5a4bbcbb063f3b73d27/propcache-0.4.1-cp313-cp313t-win32.whl", hash = "sha256:2ad890caa1d928c7c2965b48f3a3815c853180831d0e5503d35cf00c472f4717", size = 41396, upload-time = "2025-10-08T19:47:47.202Z" }, + { url = "https://files.pythonhosted.org/packages/48/f0/615c30622316496d2cbbc29f5985f7777d3ada70f23370608c1d3e081c1f/propcache-0.4.1-cp313-cp313t-win_amd64.whl", hash = "sha256:f7ee0e597f495cf415bcbd3da3caa3bd7e816b74d0d52b8145954c5e6fd3ff37", size = 44897, upload-time = "2025-10-08T19:47:48.336Z" }, + { url = "https://files.pythonhosted.org/packages/fd/ca/6002e46eccbe0e33dcd4069ef32f7f1c9e243736e07adca37ae8c4830ec3/propcache-0.4.1-cp313-cp313t-win_arm64.whl", hash = "sha256:929d7cbe1f01bb7baffb33dc14eb5691c95831450a26354cd210a8155170c93a", size = 39789, upload-time = "2025-10-08T19:47:49.876Z" }, + { url = "https://files.pythonhosted.org/packages/8e/5c/bca52d654a896f831b8256683457ceddd490ec18d9ec50e97dfd8fc726a8/propcache-0.4.1-cp314-cp314-macosx_10_13_universal2.whl", hash = "sha256:3f7124c9d820ba5548d431afb4632301acf965db49e666aa21c305cbe8c6de12", size = 78152, upload-time = "2025-10-08T19:47:51.051Z" }, + { url = "https://files.pythonhosted.org/packages/65/9b/03b04e7d82a5f54fb16113d839f5ea1ede58a61e90edf515f6577c66fa8f/propcache-0.4.1-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:c0d4b719b7da33599dfe3b22d3db1ef789210a0597bc650b7cee9c77c2be8c5c", size = 44869, upload-time = "2025-10-08T19:47:52.594Z" }, + { url = "https://files.pythonhosted.org/packages/b2/fa/89a8ef0468d5833a23fff277b143d0573897cf75bd56670a6d28126c7d68/propcache-0.4.1-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:9f302f4783709a78240ebc311b793f123328716a60911d667e0c036bc5dcbded", size = 46596, upload-time = "2025-10-08T19:47:54.073Z" }, + { url = "https://files.pythonhosted.org/packages/86/bd/47816020d337f4a746edc42fe8d53669965138f39ee117414c7d7a340cfe/propcache-0.4.1-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c80ee5802e3fb9ea37938e7eecc307fb984837091d5fd262bb37238b1ae97641", size = 206981, upload-time = "2025-10-08T19:47:55.715Z" }, + { url = "https://files.pythonhosted.org/packages/df/f6/c5fa1357cc9748510ee55f37173eb31bfde6d94e98ccd9e6f033f2fc06e1/propcache-0.4.1-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:ed5a841e8bb29a55fb8159ed526b26adc5bdd7e8bd7bf793ce647cb08656cdf4", size = 211490, upload-time = "2025-10-08T19:47:57.499Z" }, + { url = "https://files.pythonhosted.org/packages/80/1e/e5889652a7c4a3846683401a48f0f2e5083ce0ec1a8a5221d8058fbd1adf/propcache-0.4.1-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:55c72fd6ea2da4c318e74ffdf93c4fe4e926051133657459131a95c846d16d44", size = 215371, upload-time = "2025-10-08T19:47:59.317Z" }, + { url = "https://files.pythonhosted.org/packages/b2/f2/889ad4b2408f72fe1a4f6a19491177b30ea7bf1a0fd5f17050ca08cfc882/propcache-0.4.1-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:8326e144341460402713f91df60ade3c999d601e7eb5ff8f6f7862d54de0610d", size = 201424, upload-time = "2025-10-08T19:48:00.67Z" }, + { url = "https://files.pythonhosted.org/packages/27/73/033d63069b57b0812c8bd19f311faebeceb6ba31b8f32b73432d12a0b826/propcache-0.4.1-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:060b16ae65bc098da7f6d25bf359f1f31f688384858204fe5d652979e0015e5b", size = 197566, upload-time = "2025-10-08T19:48:02.604Z" }, + { url = "https://files.pythonhosted.org/packages/dc/89/ce24f3dc182630b4e07aa6d15f0ff4b14ed4b9955fae95a0b54c58d66c05/propcache-0.4.1-cp314-cp314-musllinux_1_2_armv7l.whl", hash = "sha256:89eb3fa9524f7bec9de6e83cf3faed9d79bffa560672c118a96a171a6f55831e", size = 193130, upload-time = "2025-10-08T19:48:04.499Z" }, + { url = "https://files.pythonhosted.org/packages/a9/24/ef0d5fd1a811fb5c609278d0209c9f10c35f20581fcc16f818da959fc5b4/propcache-0.4.1-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:dee69d7015dc235f526fe80a9c90d65eb0039103fe565776250881731f06349f", size = 202625, upload-time = "2025-10-08T19:48:06.213Z" }, + { url = "https://files.pythonhosted.org/packages/f5/02/98ec20ff5546f68d673df2f7a69e8c0d076b5abd05ca882dc7ee3a83653d/propcache-0.4.1-cp314-cp314-musllinux_1_2_s390x.whl", hash = "sha256:5558992a00dfd54ccbc64a32726a3357ec93825a418a401f5cc67df0ac5d9e49", size = 204209, upload-time = "2025-10-08T19:48:08.432Z" }, + { url = "https://files.pythonhosted.org/packages/a0/87/492694f76759b15f0467a2a93ab68d32859672b646aa8a04ce4864e7932d/propcache-0.4.1-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:c9b822a577f560fbd9554812526831712c1436d2c046cedee4c3796d3543b144", size = 197797, upload-time = "2025-10-08T19:48:09.968Z" }, + { url = "https://files.pythonhosted.org/packages/ee/36/66367de3575db1d2d3f3d177432bd14ee577a39d3f5d1b3d5df8afe3b6e2/propcache-0.4.1-cp314-cp314-win32.whl", hash = "sha256:ab4c29b49d560fe48b696cdcb127dd36e0bc2472548f3bf56cc5cb3da2b2984f", size = 38140, upload-time = "2025-10-08T19:48:11.232Z" }, + { url = "https://files.pythonhosted.org/packages/0c/2a/a758b47de253636e1b8aef181c0b4f4f204bf0dd964914fb2af90a95b49b/propcache-0.4.1-cp314-cp314-win_amd64.whl", hash = "sha256:5a103c3eb905fcea0ab98be99c3a9a5ab2de60228aa5aceedc614c0281cf6153", size = 41257, upload-time = "2025-10-08T19:48:12.707Z" }, + { url = "https://files.pythonhosted.org/packages/34/5e/63bd5896c3fec12edcbd6f12508d4890d23c265df28c74b175e1ef9f4f3b/propcache-0.4.1-cp314-cp314-win_arm64.whl", hash = "sha256:74c1fb26515153e482e00177a1ad654721bf9207da8a494a0c05e797ad27b992", size = 38097, upload-time = "2025-10-08T19:48:13.923Z" }, + { url = "https://files.pythonhosted.org/packages/99/85/9ff785d787ccf9bbb3f3106f79884a130951436f58392000231b4c737c80/propcache-0.4.1-cp314-cp314t-macosx_10_13_universal2.whl", hash = "sha256:824e908bce90fb2743bd6b59db36eb4f45cd350a39637c9f73b1c1ea66f5b75f", size = 81455, upload-time = "2025-10-08T19:48:15.16Z" }, + { url = "https://files.pythonhosted.org/packages/90/85/2431c10c8e7ddb1445c1f7c4b54d886e8ad20e3c6307e7218f05922cad67/propcache-0.4.1-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:c2b5e7db5328427c57c8e8831abda175421b709672f6cfc3d630c3b7e2146393", size = 46372, upload-time = "2025-10-08T19:48:16.424Z" }, + { url = "https://files.pythonhosted.org/packages/01/20/b0972d902472da9bcb683fa595099911f4d2e86e5683bcc45de60dd05dc3/propcache-0.4.1-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:6f6ff873ed40292cd4969ef5310179afd5db59fdf055897e282485043fc80ad0", size = 48411, upload-time = "2025-10-08T19:48:17.577Z" }, + { url = "https://files.pythonhosted.org/packages/e2/e3/7dc89f4f21e8f99bad3d5ddb3a3389afcf9da4ac69e3deb2dcdc96e74169/propcache-0.4.1-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:49a2dc67c154db2c1463013594c458881a069fcf98940e61a0569016a583020a", size = 275712, upload-time = "2025-10-08T19:48:18.901Z" }, + { url = "https://files.pythonhosted.org/packages/20/67/89800c8352489b21a8047c773067644e3897f02ecbbd610f4d46b7f08612/propcache-0.4.1-cp314-cp314t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:005f08e6a0529984491e37d8dbc3dd86f84bd78a8ceb5fa9a021f4c48d4984be", size = 273557, upload-time = "2025-10-08T19:48:20.762Z" }, + { url = "https://files.pythonhosted.org/packages/e2/a1/b52b055c766a54ce6d9c16d9aca0cad8059acd9637cdf8aa0222f4a026ef/propcache-0.4.1-cp314-cp314t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:5c3310452e0d31390da9035c348633b43d7e7feb2e37be252be6da45abd1abcc", size = 280015, upload-time = "2025-10-08T19:48:22.592Z" }, + { url = "https://files.pythonhosted.org/packages/48/c8/33cee30bd890672c63743049f3c9e4be087e6780906bfc3ec58528be59c1/propcache-0.4.1-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:4c3c70630930447f9ef1caac7728c8ad1c56bc5015338b20fed0d08ea2480b3a", size = 262880, upload-time = "2025-10-08T19:48:23.947Z" }, + { url = "https://files.pythonhosted.org/packages/0c/b1/8f08a143b204b418285c88b83d00edbd61afbc2c6415ffafc8905da7038b/propcache-0.4.1-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:8e57061305815dfc910a3634dcf584f08168a8836e6999983569f51a8544cd89", size = 260938, upload-time = "2025-10-08T19:48:25.656Z" }, + { url = "https://files.pythonhosted.org/packages/cf/12/96e4664c82ca2f31e1c8dff86afb867348979eb78d3cb8546a680287a1e9/propcache-0.4.1-cp314-cp314t-musllinux_1_2_armv7l.whl", hash = "sha256:521a463429ef54143092c11a77e04056dd00636f72e8c45b70aaa3140d639726", size = 247641, upload-time = "2025-10-08T19:48:27.207Z" }, + { url = "https://files.pythonhosted.org/packages/18/ed/e7a9cfca28133386ba52278136d42209d3125db08d0a6395f0cba0c0285c/propcache-0.4.1-cp314-cp314t-musllinux_1_2_ppc64le.whl", hash = "sha256:120c964da3fdc75e3731aa392527136d4ad35868cc556fd09bb6d09172d9a367", size = 262510, upload-time = "2025-10-08T19:48:28.65Z" }, + { url = "https://files.pythonhosted.org/packages/f5/76/16d8bf65e8845dd62b4e2b57444ab81f07f40caa5652b8969b87ddcf2ef6/propcache-0.4.1-cp314-cp314t-musllinux_1_2_s390x.whl", hash = "sha256:d8f353eb14ee3441ee844ade4277d560cdd68288838673273b978e3d6d2c8f36", size = 263161, upload-time = "2025-10-08T19:48:30.133Z" }, + { url = "https://files.pythonhosted.org/packages/e7/70/c99e9edb5d91d5ad8a49fa3c1e8285ba64f1476782fed10ab251ff413ba1/propcache-0.4.1-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:ab2943be7c652f09638800905ee1bab2c544e537edb57d527997a24c13dc1455", size = 257393, upload-time = "2025-10-08T19:48:31.567Z" }, + { url = "https://files.pythonhosted.org/packages/08/02/87b25304249a35c0915d236575bc3574a323f60b47939a2262b77632a3ee/propcache-0.4.1-cp314-cp314t-win32.whl", hash = "sha256:05674a162469f31358c30bcaa8883cb7829fa3110bf9c0991fe27d7896c42d85", size = 42546, upload-time = "2025-10-08T19:48:32.872Z" }, + { url = "https://files.pythonhosted.org/packages/cb/ef/3c6ecf8b317aa982f309835e8f96987466123c6e596646d4e6a1dfcd080f/propcache-0.4.1-cp314-cp314t-win_amd64.whl", hash = "sha256:990f6b3e2a27d683cb7602ed6c86f15ee6b43b1194736f9baaeb93d0016633b1", size = 46259, upload-time = "2025-10-08T19:48:34.226Z" }, + { url = "https://files.pythonhosted.org/packages/c4/2d/346e946d4951f37eca1e4f55be0f0174c52cd70720f84029b02f296f4a38/propcache-0.4.1-cp314-cp314t-win_arm64.whl", hash = "sha256:ecef2343af4cc68e05131e45024ba34f6095821988a9d0a02aa7c73fcc448aa9", size = 40428, upload-time = "2025-10-08T19:48:35.441Z" }, + { url = "https://files.pythonhosted.org/packages/9b/01/0ebaec9003f5d619a7475165961f8e3083cf8644d704b60395df3601632d/propcache-0.4.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:3d233076ccf9e450c8b3bc6720af226b898ef5d051a2d145f7d765e6e9f9bcff", size = 80277, upload-time = "2025-10-08T19:48:36.647Z" }, + { url = "https://files.pythonhosted.org/packages/34/58/04af97ac586b4ef6b9026c3fd36ee7798b737a832f5d3440a4280dcebd3a/propcache-0.4.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:357f5bb5c377a82e105e44bd3d52ba22b616f7b9773714bff93573988ef0a5fb", size = 45865, upload-time = "2025-10-08T19:48:37.859Z" }, + { url = "https://files.pythonhosted.org/packages/7c/19/b65d98ae21384518b291d9939e24a8aeac4fdb5101b732576f8f7540e834/propcache-0.4.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:cbc3b6dfc728105b2a57c06791eb07a94229202ea75c59db644d7d496b698cac", size = 47636, upload-time = "2025-10-08T19:48:39.038Z" }, + { url = "https://files.pythonhosted.org/packages/b3/0f/317048c6d91c356c7154dca5af019e6effeb7ee15fa6a6db327cc19e12b4/propcache-0.4.1-cp39-cp39-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:182b51b421f0501952d938dc0b0eb45246a5b5153c50d42b495ad5fb7517c888", size = 201126, upload-time = "2025-10-08T19:48:40.774Z" }, + { url = "https://files.pythonhosted.org/packages/71/69/0b2a7a5a6ee83292b4b997dbd80549d8ce7d40b6397c1646c0d9495f5a85/propcache-0.4.1-cp39-cp39-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:4b536b39c5199b96fc6245eb5fb796c497381d3942f169e44e8e392b29c9ebcc", size = 209837, upload-time = "2025-10-08T19:48:42.167Z" }, + { url = "https://files.pythonhosted.org/packages/a5/92/c699ac495a6698df6e497fc2de27af4b6ace10d8e76528357ce153722e45/propcache-0.4.1-cp39-cp39-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:db65d2af507bbfbdcedb254a11149f894169d90488dd3e7190f7cdcb2d6cd57a", size = 215578, upload-time = "2025-10-08T19:48:43.56Z" }, + { url = "https://files.pythonhosted.org/packages/b3/ee/14de81c5eb02c0ee4f500b4e39c4e1bd0677c06e72379e6ab18923c773fc/propcache-0.4.1-cp39-cp39-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:fd2dbc472da1f772a4dae4fa24be938a6c544671a912e30529984dd80400cd88", size = 197187, upload-time = "2025-10-08T19:48:45.309Z" }, + { url = "https://files.pythonhosted.org/packages/1d/94/48dce9aaa6d8dd5a0859bad75158ec522546d4ac23f8e2f05fac469477dd/propcache-0.4.1-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:daede9cd44e0f8bdd9e6cc9a607fc81feb80fae7a5fc6cecaff0e0bb32e42d00", size = 193478, upload-time = "2025-10-08T19:48:47.743Z" }, + { url = "https://files.pythonhosted.org/packages/60/b5/0516b563e801e1ace212afde869a0596a0d7115eec0b12d296d75633fb29/propcache-0.4.1-cp39-cp39-musllinux_1_2_armv7l.whl", hash = "sha256:71b749281b816793678ae7f3d0d84bd36e694953822eaad408d682efc5ca18e0", size = 190650, upload-time = "2025-10-08T19:48:49.373Z" }, + { url = "https://files.pythonhosted.org/packages/24/89/e0f7d4a5978cd56f8cd67735f74052f257dc471ec901694e430f0d1572fe/propcache-0.4.1-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:0002004213ee1f36cfb3f9a42b5066100c44276b9b72b4e1504cddd3d692e86e", size = 200251, upload-time = "2025-10-08T19:48:51.4Z" }, + { url = "https://files.pythonhosted.org/packages/06/7d/a1fac863d473876ed4406c914f2e14aa82d2f10dd207c9e16fc383cc5a24/propcache-0.4.1-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:fe49d0a85038f36ba9e3ffafa1103e61170b28e95b16622e11be0a0ea07c6781", size = 200919, upload-time = "2025-10-08T19:48:53.227Z" }, + { url = "https://files.pythonhosted.org/packages/c3/4e/f86a256ff24944cf5743e4e6c6994e3526f6acfcfb55e21694c2424f758c/propcache-0.4.1-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:99d43339c83aaf4d32bda60928231848eee470c6bda8d02599cc4cebe872d183", size = 193211, upload-time = "2025-10-08T19:48:55.027Z" }, + { url = "https://files.pythonhosted.org/packages/6e/3f/3fbad5f4356b068f1b047d300a6ff2c66614d7030f078cd50be3fec04228/propcache-0.4.1-cp39-cp39-win32.whl", hash = "sha256:a129e76735bc792794d5177069691c3217898b9f5cee2b2661471e52ffe13f19", size = 38314, upload-time = "2025-10-08T19:48:56.792Z" }, + { url = "https://files.pythonhosted.org/packages/a4/45/d78d136c3a3d215677abb886785aae744da2c3005bcb99e58640c56529b1/propcache-0.4.1-cp39-cp39-win_amd64.whl", hash = "sha256:948dab269721ae9a87fd16c514a0a2c2a1bdb23a9a61b969b0f9d9ee2968546f", size = 41912, upload-time = "2025-10-08T19:48:57.995Z" }, + { url = "https://files.pythonhosted.org/packages/fc/2a/b0632941f25139f4e58450b307242951f7c2717a5704977c6d5323a800af/propcache-0.4.1-cp39-cp39-win_arm64.whl", hash = "sha256:5fd37c406dd6dc85aa743e214cef35dc54bbdd1419baac4f6ae5e5b1a2976938", size = 38450, upload-time = "2025-10-08T19:48:59.349Z" }, + { url = "https://files.pythonhosted.org/packages/5b/5a/bc7b4a4ef808fa59a816c17b20c4bef6884daebbdf627ff2a161da67da19/propcache-0.4.1-py3-none-any.whl", hash = "sha256:af2a6052aeb6cf17d3e46ee169099044fd8224cbaf75c76a2ef596e8163e2237", size = 13305, upload-time = "2025-10-08T19:49:00.792Z" }, +] + +[[package]] +name = "psutil" +version = "7.1.3" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/e1/88/bdd0a41e5857d5d703287598cbf08dad90aed56774ea52ae071bae9071b6/psutil-7.1.3.tar.gz", hash = "sha256:6c86281738d77335af7aec228328e944b30930899ea760ecf33a4dba66be5e74", size = 489059, upload-time = "2025-11-02T12:25:54.619Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/bd/93/0c49e776b8734fef56ec9c5c57f923922f2cf0497d62e0f419465f28f3d0/psutil-7.1.3-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:0005da714eee687b4b8decd3d6cc7c6db36215c9e74e5ad2264b90c3df7d92dc", size = 239751, upload-time = "2025-11-02T12:25:58.161Z" }, + { url = "https://files.pythonhosted.org/packages/6f/8d/b31e39c769e70780f007969815195a55c81a63efebdd4dbe9e7a113adb2f/psutil-7.1.3-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:19644c85dcb987e35eeeaefdc3915d059dac7bd1167cdcdbf27e0ce2df0c08c0", size = 240368, upload-time = "2025-11-02T12:26:00.491Z" }, + { url = "https://files.pythonhosted.org/packages/62/61/23fd4acc3c9eebbf6b6c78bcd89e5d020cfde4acf0a9233e9d4e3fa698b4/psutil-7.1.3-cp313-cp313t-manylinux2010_x86_64.manylinux_2_12_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:95ef04cf2e5ba0ab9eaafc4a11eaae91b44f4ef5541acd2ee91d9108d00d59a7", size = 287134, upload-time = "2025-11-02T12:26:02.613Z" }, + { url = "https://files.pythonhosted.org/packages/30/1c/f921a009ea9ceb51aa355cb0cc118f68d354db36eae18174bab63affb3e6/psutil-7.1.3-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:1068c303be3a72f8e18e412c5b2a8f6d31750fb152f9cb106b54090296c9d251", size = 289904, upload-time = "2025-11-02T12:26:05.207Z" }, + { url = "https://files.pythonhosted.org/packages/a6/82/62d68066e13e46a5116df187d319d1724b3f437ddd0f958756fc052677f4/psutil-7.1.3-cp313-cp313t-win_amd64.whl", hash = "sha256:18349c5c24b06ac5612c0428ec2a0331c26443d259e2a0144a9b24b4395b58fa", size = 249642, upload-time = "2025-11-02T12:26:07.447Z" }, + { url = "https://files.pythonhosted.org/packages/df/ad/c1cd5fe965c14a0392112f68362cfceb5230819dbb5b1888950d18a11d9f/psutil-7.1.3-cp313-cp313t-win_arm64.whl", hash = "sha256:c525ffa774fe4496282fb0b1187725793de3e7c6b29e41562733cae9ada151ee", size = 245518, upload-time = "2025-11-02T12:26:09.719Z" }, + { url = "https://files.pythonhosted.org/packages/2e/bb/6670bded3e3236eb4287c7bcdc167e9fae6e1e9286e437f7111caed2f909/psutil-7.1.3-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:b403da1df4d6d43973dc004d19cee3b848e998ae3154cc8097d139b77156c353", size = 239843, upload-time = "2025-11-02T12:26:11.968Z" }, + { url = "https://files.pythonhosted.org/packages/b8/66/853d50e75a38c9a7370ddbeefabdd3d3116b9c31ef94dc92c6729bc36bec/psutil-7.1.3-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:ad81425efc5e75da3f39b3e636293360ad8d0b49bed7df824c79764fb4ba9b8b", size = 240369, upload-time = "2025-11-02T12:26:14.358Z" }, + { url = "https://files.pythonhosted.org/packages/41/bd/313aba97cb5bfb26916dc29cf0646cbe4dd6a89ca69e8c6edce654876d39/psutil-7.1.3-cp314-cp314t-manylinux2010_x86_64.manylinux_2_12_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:8f33a3702e167783a9213db10ad29650ebf383946e91bc77f28a5eb083496bc9", size = 288210, upload-time = "2025-11-02T12:26:16.699Z" }, + { url = "https://files.pythonhosted.org/packages/c2/fa/76e3c06e760927a0cfb5705eb38164254de34e9bd86db656d4dbaa228b04/psutil-7.1.3-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:fac9cd332c67f4422504297889da5ab7e05fd11e3c4392140f7370f4208ded1f", size = 291182, upload-time = "2025-11-02T12:26:18.848Z" }, + { url = "https://files.pythonhosted.org/packages/0f/1d/5774a91607035ee5078b8fd747686ebec28a962f178712de100d00b78a32/psutil-7.1.3-cp314-cp314t-win_amd64.whl", hash = "sha256:3792983e23b69843aea49c8f5b8f115572c5ab64c153bada5270086a2123c7e7", size = 250466, upload-time = "2025-11-02T12:26:21.183Z" }, + { url = "https://files.pythonhosted.org/packages/00/ca/e426584bacb43a5cb1ac91fae1937f478cd8fbe5e4ff96574e698a2c77cd/psutil-7.1.3-cp314-cp314t-win_arm64.whl", hash = "sha256:31d77fcedb7529f27bb3a0472bea9334349f9a04160e8e6e5020f22c59893264", size = 245756, upload-time = "2025-11-02T12:26:23.148Z" }, + { url = "https://files.pythonhosted.org/packages/ef/94/46b9154a800253e7ecff5aaacdf8ebf43db99de4a2dfa18575b02548654e/psutil-7.1.3-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:2bdbcd0e58ca14996a42adf3621a6244f1bb2e2e528886959c72cf1e326677ab", size = 238359, upload-time = "2025-11-02T12:26:25.284Z" }, + { url = "https://files.pythonhosted.org/packages/68/3a/9f93cff5c025029a36d9a92fef47220ab4692ee7f2be0fba9f92813d0cb8/psutil-7.1.3-cp36-abi3-macosx_11_0_arm64.whl", hash = "sha256:bc31fa00f1fbc3c3802141eede66f3a2d51d89716a194bf2cd6fc68310a19880", size = 239171, upload-time = "2025-11-02T12:26:27.23Z" }, + { url = "https://files.pythonhosted.org/packages/ce/b1/5f49af514f76431ba4eea935b8ad3725cdeb397e9245ab919dbc1d1dc20f/psutil-7.1.3-cp36-abi3-manylinux2010_x86_64.manylinux_2_12_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:3bb428f9f05c1225a558f53e30ccbad9930b11c3fc206836242de1091d3e7dd3", size = 263261, upload-time = "2025-11-02T12:26:29.48Z" }, + { url = "https://files.pythonhosted.org/packages/e0/95/992c8816a74016eb095e73585d747e0a8ea21a061ed3689474fabb29a395/psutil-7.1.3-cp36-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:56d974e02ca2c8eb4812c3f76c30e28836fffc311d55d979f1465c1feeb2b68b", size = 264635, upload-time = "2025-11-02T12:26:31.74Z" }, + { url = "https://files.pythonhosted.org/packages/55/4c/c3ed1a622b6ae2fd3c945a366e64eb35247a31e4db16cf5095e269e8eb3c/psutil-7.1.3-cp37-abi3-win_amd64.whl", hash = "sha256:f39c2c19fe824b47484b96f9692932248a54c43799a84282cfe58d05a6449efd", size = 247633, upload-time = "2025-11-02T12:26:33.887Z" }, + { url = "https://files.pythonhosted.org/packages/c9/ad/33b2ccec09bf96c2b2ef3f9a6f66baac8253d7565d8839e024a6b905d45d/psutil-7.1.3-cp37-abi3-win_arm64.whl", hash = "sha256:bd0d69cee829226a761e92f28140bec9a5ee9d5b4fb4b0cc589068dbfff559b1", size = 244608, upload-time = "2025-11-02T12:26:36.136Z" }, +] + +[[package]] +name = "ptyprocess" +version = "0.7.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/20/e5/16ff212c1e452235a90aeb09066144d0c5a6a8c0834397e03f5224495c4e/ptyprocess-0.7.0.tar.gz", hash = "sha256:5c5d0a3b48ceee0b48485e0c26037c0acd7d29765ca3fbb5cb3831d347423220", size = 70762, upload-time = "2020-12-28T15:15:30.155Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/22/a6/858897256d0deac81a172289110f31629fc4cee19b6f01283303e18c8db3/ptyprocess-0.7.0-py2.py3-none-any.whl", hash = "sha256:4b41f3967fce3af57cc7e94b888626c18bf37a083e3651ca8feeb66d492fef35", size = 13993, upload-time = "2020-12-28T15:15:28.35Z" }, +] + +[[package]] +name = "pure-eval" +version = "0.2.3" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/cd/05/0a34433a064256a578f1783a10da6df098ceaa4a57bbeaa96a6c0352786b/pure_eval-0.2.3.tar.gz", hash = "sha256:5f4e983f40564c576c7c8635ae88db5956bb2229d7e9237d03b3c0b0190eaf42", size = 19752, upload-time = "2024-07-21T12:58:21.801Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/8e/37/efad0257dc6e593a18957422533ff0f87ede7c9c6ea010a2177d738fb82f/pure_eval-0.2.3-py3-none-any.whl", hash = "sha256:1db8e35b67b3d218d818ae653e27f06c3aa420901fa7b081ca98cbedc874e0d0", size = 11842, upload-time = "2024-07-21T12:58:20.04Z" }, +] + +[[package]] +name = "pycparser" +version = "2.23" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/fe/cf/d2d3b9f5699fb1e4615c8e32ff220203e43b248e1dfcc6736ad9057731ca/pycparser-2.23.tar.gz", hash = "sha256:78816d4f24add8f10a06d6f05b4d424ad9e96cfebf68a4ddc99c65c0720d00c2", size = 173734, upload-time = "2025-09-09T13:23:47.91Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/a0/e3/59cd50310fc9b59512193629e1984c1f95e5c8ae6e5d8c69532ccc65a7fe/pycparser-2.23-py3-none-any.whl", hash = "sha256:e5c6e8d3fbad53479cab09ac03729e0a9faf2bee3db8208a550daf5af81a5934", size = 118140, upload-time = "2025-09-09T13:23:46.651Z" }, +] + +[[package]] +name = "pygments" +version = "2.19.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/b0/77/a5b8c569bf593b0140bde72ea885a803b82086995367bf2037de0159d924/pygments-2.19.2.tar.gz", hash = "sha256:636cb2477cec7f8952536970bc533bc43743542f70392ae026374600add5b887", size = 4968631, upload-time = "2025-06-21T13:39:12.283Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/c7/21/705964c7812476f378728bdf590ca4b771ec72385c533964653c68e86bdc/pygments-2.19.2-py3-none-any.whl", hash = "sha256:86540386c03d588bb81d44bc3928634ff26449851e99741617ecb9037ee5ec0b", size = 1225217, upload-time = "2025-06-21T13:39:07.939Z" }, +] + +[[package]] +name = "pyparsing" +version = "3.1.4" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version < '3.9'", +] +sdist = { url = "https://files.pythonhosted.org/packages/83/08/13f3bce01b2061f2bbd582c9df82723de943784cf719a35ac886c652043a/pyparsing-3.1.4.tar.gz", hash = "sha256:f86ec8d1a83f11977c9a6ea7598e8c27fc5cddfa5b07ea2241edbbde1d7bc032", size = 900231, upload-time = "2024-08-25T15:00:47.416Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/e5/0c/0e3c05b1c87bb6a1c76d281b0f35e78d2d80ac91b5f8f524cebf77f51049/pyparsing-3.1.4-py3-none-any.whl", hash = "sha256:a6a7ee4235a3f944aa1fa2249307708f893fe5717dc603503c6c7969c070fb7c", size = 104100, upload-time = "2024-08-25T15:00:45.361Z" }, +] + +[[package]] +name = "pyparsing" +version = "3.2.5" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version >= '3.14'", + "python_full_version >= '3.11' and python_full_version < '3.14'", + "python_full_version == '3.10.*'", + "python_full_version == '3.9.*'", +] +sdist = { url = "https://files.pythonhosted.org/packages/f2/a5/181488fc2b9d093e3972d2a472855aae8a03f000592dbfce716a512b3359/pyparsing-3.2.5.tar.gz", hash = "sha256:2df8d5b7b2802ef88e8d016a2eb9c7aeaa923529cd251ed0fe4608275d4105b6", size = 1099274, upload-time = "2025-09-21T04:11:06.277Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/10/5e/1aa9a93198c6b64513c9d7752de7422c06402de6600a8767da1524f9570b/pyparsing-3.2.5-py3-none-any.whl", hash = "sha256:e38a4f02064cf41fe6593d328d0512495ad1f3d8a91c4f73fc401b3079a59a5e", size = 113890, upload-time = "2025-09-21T04:11:04.117Z" }, +] + +[[package]] +name = "pyproject-hooks" +version = "1.2.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/e7/82/28175b2414effca1cdac8dc99f76d660e7a4fb0ceefa4b4ab8f5f6742925/pyproject_hooks-1.2.0.tar.gz", hash = "sha256:1e859bd5c40fae9448642dd871adf459e5e2084186e8d2c2a79a824c970da1f8", size = 19228, upload-time = "2024-09-29T09:24:13.293Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/bd/24/12818598c362d7f300f18e74db45963dbcb85150324092410c8b49405e42/pyproject_hooks-1.2.0-py3-none-any.whl", hash = "sha256:9e5c6bfa8dcc30091c74b0cf803c81fdd29d94f01992a7707bc97babb1141913", size = 10216, upload-time = "2024-09-29T09:24:11.978Z" }, +] + +[[package]] +name = "pytest" +version = "8.3.5" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version < '3.9'", +] +dependencies = [ + { name = "colorama", marker = "python_full_version < '3.9' and sys_platform == 'win32'" }, + { name = "exceptiongroup", marker = "python_full_version < '3.9'" }, + { name = "iniconfig", version = "2.1.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.9'" }, + { name = "packaging", marker = "python_full_version < '3.9'" }, + { name = "pluggy", version = "1.5.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.9'" }, + { name = "tomli", marker = "python_full_version < '3.9'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/ae/3c/c9d525a414d506893f0cd8a8d0de7706446213181570cdbd766691164e40/pytest-8.3.5.tar.gz", hash = "sha256:f4efe70cc14e511565ac476b57c279e12a855b11f48f212af1080ef2263d3845", size = 1450891, upload-time = "2025-03-02T12:54:54.503Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/30/3d/64ad57c803f1fa1e963a7946b6e0fea4a70df53c1a7fed304586539c2bac/pytest-8.3.5-py3-none-any.whl", hash = "sha256:c69214aa47deac29fad6c2a4f590b9c4a9fdb16a403176fe154b79c0b4d4d820", size = 343634, upload-time = "2025-03-02T12:54:52.069Z" }, +] + +[[package]] +name = "pytest" +version = "8.4.2" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version == '3.9.*'", +] +dependencies = [ + { name = "colorama", marker = "python_full_version == '3.9.*' and sys_platform == 'win32'" }, + { name = "exceptiongroup", marker = "python_full_version == '3.9.*'" }, + { name = "iniconfig", version = "2.1.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version == '3.9.*'" }, + { name = "packaging", marker = "python_full_version == '3.9.*'" }, + { name = "pluggy", version = "1.6.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version == '3.9.*'" }, + { name = "pygments", marker = "python_full_version == '3.9.*'" }, + { name = "tomli", marker = "python_full_version == '3.9.*'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/a3/5c/00a0e072241553e1a7496d638deababa67c5058571567b92a7eaa258397c/pytest-8.4.2.tar.gz", hash = "sha256:86c0d0b93306b961d58d62a4db4879f27fe25513d4b969df351abdddb3c30e01", size = 1519618, upload-time = "2025-09-04T14:34:22.711Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/a8/a4/20da314d277121d6534b3a980b29035dcd51e6744bd79075a6ce8fa4eb8d/pytest-8.4.2-py3-none-any.whl", hash = "sha256:872f880de3fc3a5bdc88a11b39c9710c3497a547cfa9320bc3c5e62fbf272e79", size = 365750, upload-time = "2025-09-04T14:34:20.226Z" }, +] + +[[package]] +name = "pytest" +version = "9.0.1" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version >= '3.14'", + "python_full_version >= '3.11' and python_full_version < '3.14'", + "python_full_version == '3.10.*'", +] +dependencies = [ + { name = "colorama", marker = "python_full_version >= '3.10' and sys_platform == 'win32'" }, + { name = "exceptiongroup", marker = "python_full_version == '3.10.*'" }, + { name = "iniconfig", version = "2.3.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.10'" }, + { name = "packaging", marker = "python_full_version >= '3.10'" }, + { name = "pluggy", version = "1.6.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.10'" }, + { name = "pygments", marker = "python_full_version >= '3.10'" }, + { name = "tomli", marker = "python_full_version == '3.10.*'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/07/56/f013048ac4bc4c1d9be45afd4ab209ea62822fb1598f40687e6bf45dcea4/pytest-9.0.1.tar.gz", hash = "sha256:3e9c069ea73583e255c3b21cf46b8d3c56f6e3a1a8f6da94ccb0fcf57b9d73c8", size = 1564125, upload-time = "2025-11-12T13:05:09.333Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/0b/8b/6300fb80f858cda1c51ffa17075df5d846757081d11ab4aa35cef9e6258b/pytest-9.0.1-py3-none-any.whl", hash = "sha256:67be0030d194df2dfa7b556f2e56fb3c3315bd5c8822c6951162b92b32ce7dad", size = 373668, upload-time = "2025-11-12T13:05:07.379Z" }, +] + +[[package]] +name = "pytest-cov" +version = "5.0.0" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version < '3.9'", +] +dependencies = [ + { name = "coverage", version = "7.6.1", source = { registry = "https://pypi.org/simple" }, extra = ["toml"], marker = "python_full_version < '3.9'" }, + { name = "pytest", version = "8.3.5", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.9'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/74/67/00efc8d11b630c56f15f4ad9c7f9223f1e5ec275aaae3fa9118c6a223ad2/pytest-cov-5.0.0.tar.gz", hash = "sha256:5837b58e9f6ebd335b0f8060eecce69b662415b16dc503883a02f45dfeb14857", size = 63042, upload-time = "2024-03-24T20:16:34.856Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/78/3a/af5b4fa5961d9a1e6237b530eb87dd04aea6eb83da09d2a4073d81b54ccf/pytest_cov-5.0.0-py3-none-any.whl", hash = "sha256:4f0764a1219df53214206bf1feea4633c3b558a2925c8b59f144f682861ce652", size = 21990, upload-time = "2024-03-24T20:16:32.444Z" }, +] + +[[package]] +name = "pytest-cov" +version = "7.0.0" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version >= '3.14'", + "python_full_version >= '3.11' and python_full_version < '3.14'", + "python_full_version == '3.10.*'", + "python_full_version == '3.9.*'", +] +dependencies = [ + { name = "coverage", version = "7.10.7", source = { registry = "https://pypi.org/simple" }, extra = ["toml"], marker = "python_full_version == '3.9.*'" }, + { name = "coverage", version = "7.12.0", source = { registry = "https://pypi.org/simple" }, extra = ["toml"], marker = "python_full_version >= '3.10'" }, + { name = "pluggy", version = "1.6.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.9'" }, + { name = "pytest", version = "8.4.2", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version == '3.9.*'" }, + { name = "pytest", version = "9.0.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.10'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/5e/f7/c933acc76f5208b3b00089573cf6a2bc26dc80a8aece8f52bb7d6b1855ca/pytest_cov-7.0.0.tar.gz", hash = "sha256:33c97eda2e049a0c5298e91f519302a1334c26ac65c1a483d6206fd458361af1", size = 54328, upload-time = "2025-09-09T10:57:02.113Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ee/49/1377b49de7d0c1ce41292161ea0f721913fa8722c19fb9c1e3aa0367eecb/pytest_cov-7.0.0-py3-none-any.whl", hash = "sha256:3b8e9558b16cc1479da72058bdecf8073661c7f57f7d3c5f22a1c23507f2d861", size = 22424, upload-time = "2025-09-09T10:57:00.695Z" }, +] + +[[package]] +name = "python-dateutil" +version = "2.9.0.post0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "six" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/66/c0/0c8b6ad9f17a802ee498c46e004a0eb49bc148f2fd230864601a86dcf6db/python-dateutil-2.9.0.post0.tar.gz", hash = "sha256:37dd54208da7e1cd875388217d5e00ebd4179249f90fb72437e91a35459a0ad3", size = 342432, upload-time = "2024-03-01T18:36:20.211Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ec/57/56b9bcc3c9c6a792fcbaf139543cee77261f3651ca9da0c93f5c1221264b/python_dateutil-2.9.0.post0-py2.py3-none-any.whl", hash = "sha256:a8b2bc7bffae282281c8140a97d3aa9c14da0b136dfe83f850eea9a5f7470427", size = 229892, upload-time = "2024-03-01T18:36:18.57Z" }, +] + +[[package]] +name = "python-json-logger" +version = "4.0.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "typing-extensions", version = "4.13.2", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.9'" }, + { name = "typing-extensions", version = "4.15.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version == '3.9.*'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/29/bf/eca6a3d43db1dae7070f70e160ab20b807627ba953663ba07928cdd3dc58/python_json_logger-4.0.0.tar.gz", hash = "sha256:f58e68eb46e1faed27e0f574a55a0455eecd7b8a5b88b85a784519ba3cff047f", size = 17683, upload-time = "2025-10-06T04:15:18.984Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/51/e5/fecf13f06e5e5f67e8837d777d1bc43fac0ed2b77a676804df5c34744727/python_json_logger-4.0.0-py3-none-any.whl", hash = "sha256:af09c9daf6a813aa4cc7180395f50f2a9e5fa056034c9953aec92e381c5ba1e2", size = 15548, upload-time = "2025-10-06T04:15:17.553Z" }, +] + +[[package]] +name = "pytz" +version = "2025.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/f8/bf/abbd3cdfb8fbc7fb3d4d38d320f2441b1e7cbe29be4f23797b4a2b5d8aac/pytz-2025.2.tar.gz", hash = "sha256:360b9e3dbb49a209c21ad61809c7fb453643e048b38924c765813546746e81c3", size = 320884, upload-time = "2025-03-25T02:25:00.538Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/81/c4/34e93fe5f5429d7570ec1fa436f1986fb1f00c3e0f43a589fe2bbcd22c3f/pytz-2025.2-py2.py3-none-any.whl", hash = "sha256:5ddf76296dd8c44c26eb8f4b6f35488f3ccbf6fbbd7adee0b7262d43f0ec2f00", size = 509225, upload-time = "2025-03-25T02:24:58.468Z" }, +] + +[[package]] +name = "pyvista" +version = "0.44.2" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version < '3.9'", +] +dependencies = [ + { name = "matplotlib", version = "3.7.5", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.9'" }, + { name = "numpy", version = "1.24.4", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.9'" }, + { name = "pillow", version = "10.4.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.9'" }, + { name = "pooch", marker = "python_full_version < '3.9'" }, + { name = "scooby", marker = "python_full_version < '3.9'" }, + { name = "typing-extensions", version = "4.13.2", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.9'" }, + { name = "vtk", version = "9.3.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.9'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/56/01/a7ebede7d5c0bb3b895a7d6afd4d51f0aa328b50ba93d8bc72eb0fb5856b/pyvista-0.44.2.tar.gz", hash = "sha256:db65943c3c1c9ba49fe16f5a25a5bc23b74bf1ea7a38aae4ef9c4dc5838ccf5e", size = 2192634, upload-time = "2024-11-27T00:06:14.034Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/65/07/699a032f8b5a1b70c9681185541f18523936a76ac5846e93c5eaaa1e2f33/pyvista-0.44.2-py3-none-any.whl", hash = "sha256:8530d35f57cdaa33507ac9aec19e3292be0bc9026b28e4f12df7e8054438d028", size = 2244442, upload-time = "2024-11-27T00:06:11.761Z" }, +] + +[package.optional-dependencies] +jupyter = [ + { name = "ipywidgets", marker = "python_full_version < '3.9'" }, + { name = "jupyter-server-proxy", marker = "python_full_version < '3.9'" }, + { name = "nest-asyncio", marker = "python_full_version < '3.9'" }, + { name = "trame", version = "3.7.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.9'" }, + { name = "trame-client", version = "3.5.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.9'" }, + { name = "trame-server", marker = "python_full_version < '3.9'" }, + { name = "trame-vtk", version = "2.8.13", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.9'" }, + { name = "trame-vuetify", version = "2.7.2", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.9'" }, +] + +[[package]] +name = "pyvista" +version = "0.46.4" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version >= '3.14'", + "python_full_version >= '3.11' and python_full_version < '3.14'", + "python_full_version == '3.10.*'", + "python_full_version == '3.9.*'", +] +dependencies = [ + { name = "matplotlib", version = "3.9.4", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version == '3.9.*'" }, + { name = "matplotlib", version = "3.10.7", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.10'" }, + { name = "numpy", version = "1.26.4", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.9'" }, + { name = "pillow", version = "11.3.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version == '3.9.*'" }, + { name = "pillow", version = "12.0.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.10'" }, + { name = "pooch", marker = "python_full_version >= '3.9'" }, + { name = "scooby", marker = "python_full_version >= '3.9'" }, + { name = "typing-extensions", version = "4.15.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.9'" }, + { name = "vtk", version = "9.5.2", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.9'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/03/3f/701daab844e6f0570d02931b3e4b0b7e04b38f97b9c95d12403645445b23/pyvista-0.46.4.tar.gz", hash = "sha256:37ddd2783a45b552623df293e77ce93ed015244e8d89d1de179d2df594d7c571", size = 2398029, upload-time = "2025-10-30T15:24:13.144Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/4f/e5/41a88ce247c606a12498a9297ef323b441b2be811599033a06ea62af0724/pyvista-0.46.4-py3-none-any.whl", hash = "sha256:f113a8db2f49ae1b2f9eeb477c51a4038a4dfdd02ac097900aa49bf1d77f7b2e", size = 2448669, upload-time = "2025-10-30T15:24:11.112Z" }, +] + +[package.optional-dependencies] +jupyter = [ + { name = "ipywidgets", marker = "python_full_version >= '3.9'" }, + { name = "jupyter-server-proxy", marker = "python_full_version >= '3.9'" }, + { name = "nest-asyncio", marker = "python_full_version >= '3.9'" }, + { name = "trame", version = "3.12.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.9'" }, + { name = "trame-client", version = "3.11.2", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.9'" }, + { name = "trame-server", marker = "python_full_version >= '3.9'" }, + { name = "trame-vtk", version = "2.10.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.9'" }, + { name = "trame-vuetify", version = "3.1.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.9'" }, +] + +[[package]] +name = "pywin32" +version = "311" +source = { registry = "https://pypi.org/simple" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/7b/40/44efbb0dfbd33aca6a6483191dae0716070ed99e2ecb0c53683f400a0b4f/pywin32-311-cp310-cp310-win32.whl", hash = "sha256:d03ff496d2a0cd4a5893504789d4a15399133fe82517455e78bad62efbb7f0a3", size = 8760432, upload-time = "2025-07-14T20:13:05.9Z" }, + { url = "https://files.pythonhosted.org/packages/5e/bf/360243b1e953bd254a82f12653974be395ba880e7ec23e3731d9f73921cc/pywin32-311-cp310-cp310-win_amd64.whl", hash = "sha256:797c2772017851984b97180b0bebe4b620bb86328e8a884bb626156295a63b3b", size = 9590103, upload-time = "2025-07-14T20:13:07.698Z" }, + { url = "https://files.pythonhosted.org/packages/57/38/d290720e6f138086fb3d5ffe0b6caa019a791dd57866940c82e4eeaf2012/pywin32-311-cp310-cp310-win_arm64.whl", hash = "sha256:0502d1facf1fed4839a9a51ccbcc63d952cf318f78ffc00a7e78528ac27d7a2b", size = 8778557, upload-time = "2025-07-14T20:13:11.11Z" }, + { url = "https://files.pythonhosted.org/packages/7c/af/449a6a91e5d6db51420875c54f6aff7c97a86a3b13a0b4f1a5c13b988de3/pywin32-311-cp311-cp311-win32.whl", hash = "sha256:184eb5e436dea364dcd3d2316d577d625c0351bf237c4e9a5fabbcfa5a58b151", size = 8697031, upload-time = "2025-07-14T20:13:13.266Z" }, + { url = "https://files.pythonhosted.org/packages/51/8f/9bb81dd5bb77d22243d33c8397f09377056d5c687aa6d4042bea7fbf8364/pywin32-311-cp311-cp311-win_amd64.whl", hash = "sha256:3ce80b34b22b17ccbd937a6e78e7225d80c52f5ab9940fe0506a1a16f3dab503", size = 9508308, upload-time = "2025-07-14T20:13:15.147Z" }, + { url = "https://files.pythonhosted.org/packages/44/7b/9c2ab54f74a138c491aba1b1cd0795ba61f144c711daea84a88b63dc0f6c/pywin32-311-cp311-cp311-win_arm64.whl", hash = "sha256:a733f1388e1a842abb67ffa8e7aad0e70ac519e09b0f6a784e65a136ec7cefd2", size = 8703930, upload-time = "2025-07-14T20:13:16.945Z" }, + { url = "https://files.pythonhosted.org/packages/e7/ab/01ea1943d4eba0f850c3c61e78e8dd59757ff815ff3ccd0a84de5f541f42/pywin32-311-cp312-cp312-win32.whl", hash = "sha256:750ec6e621af2b948540032557b10a2d43b0cee2ae9758c54154d711cc852d31", size = 8706543, upload-time = "2025-07-14T20:13:20.765Z" }, + { url = "https://files.pythonhosted.org/packages/d1/a8/a0e8d07d4d051ec7502cd58b291ec98dcc0c3fff027caad0470b72cfcc2f/pywin32-311-cp312-cp312-win_amd64.whl", hash = "sha256:b8c095edad5c211ff31c05223658e71bf7116daa0ecf3ad85f3201ea3190d067", size = 9495040, upload-time = "2025-07-14T20:13:22.543Z" }, + { url = "https://files.pythonhosted.org/packages/ba/3a/2ae996277b4b50f17d61f0603efd8253cb2d79cc7ae159468007b586396d/pywin32-311-cp312-cp312-win_arm64.whl", hash = "sha256:e286f46a9a39c4a18b319c28f59b61de793654af2f395c102b4f819e584b5852", size = 8710102, upload-time = "2025-07-14T20:13:24.682Z" }, + { url = "https://files.pythonhosted.org/packages/a5/be/3fd5de0979fcb3994bfee0d65ed8ca9506a8a1260651b86174f6a86f52b3/pywin32-311-cp313-cp313-win32.whl", hash = "sha256:f95ba5a847cba10dd8c4d8fefa9f2a6cf283b8b88ed6178fa8a6c1ab16054d0d", size = 8705700, upload-time = "2025-07-14T20:13:26.471Z" }, + { url = "https://files.pythonhosted.org/packages/e3/28/e0a1909523c6890208295a29e05c2adb2126364e289826c0a8bc7297bd5c/pywin32-311-cp313-cp313-win_amd64.whl", hash = "sha256:718a38f7e5b058e76aee1c56ddd06908116d35147e133427e59a3983f703a20d", size = 9494700, upload-time = "2025-07-14T20:13:28.243Z" }, + { url = "https://files.pythonhosted.org/packages/04/bf/90339ac0f55726dce7d794e6d79a18a91265bdf3aa70b6b9ca52f35e022a/pywin32-311-cp313-cp313-win_arm64.whl", hash = "sha256:7b4075d959648406202d92a2310cb990fea19b535c7f4a78d3f5e10b926eeb8a", size = 8709318, upload-time = "2025-07-14T20:13:30.348Z" }, + { url = "https://files.pythonhosted.org/packages/c9/31/097f2e132c4f16d99a22bfb777e0fd88bd8e1c634304e102f313af69ace5/pywin32-311-cp314-cp314-win32.whl", hash = "sha256:b7a2c10b93f8986666d0c803ee19b5990885872a7de910fc460f9b0c2fbf92ee", size = 8840714, upload-time = "2025-07-14T20:13:32.449Z" }, + { url = "https://files.pythonhosted.org/packages/90/4b/07c77d8ba0e01349358082713400435347df8426208171ce297da32c313d/pywin32-311-cp314-cp314-win_amd64.whl", hash = "sha256:3aca44c046bd2ed8c90de9cb8427f581c479e594e99b5c0bb19b29c10fd6cb87", size = 9656800, upload-time = "2025-07-14T20:13:34.312Z" }, + { url = "https://files.pythonhosted.org/packages/c0/d2/21af5c535501a7233e734b8af901574572da66fcc254cb35d0609c9080dd/pywin32-311-cp314-cp314-win_arm64.whl", hash = "sha256:a508e2d9025764a8270f93111a970e1d0fbfc33f4153b388bb649b7eec4f9b42", size = 8932540, upload-time = "2025-07-14T20:13:36.379Z" }, + { url = "https://files.pythonhosted.org/packages/75/20/6cd04d636a4c83458ecbb7c8220c13786a1a80d3f5fb568df39310e73e98/pywin32-311-cp38-cp38-win32.whl", hash = "sha256:6c6f2969607b5023b0d9ce2541f8d2cbb01c4f46bc87456017cf63b73f1e2d8c", size = 8766775, upload-time = "2025-07-14T20:12:55.029Z" }, + { url = "https://files.pythonhosted.org/packages/ff/6c/94c10268bae5d0d0c6509bdfb5aa08882d11a9ccdf89ff1cde59a6161afb/pywin32-311-cp38-cp38-win_amd64.whl", hash = "sha256:c8015b09fb9a5e188f83b7b04de91ddca4658cee2ae6f3bc483f0b21a77ef6cd", size = 9594743, upload-time = "2025-07-14T20:12:57.59Z" }, + { url = "https://files.pythonhosted.org/packages/59/42/b86689aac0cdaee7ae1c58d464b0ff04ca909c19bb6502d4973cdd9f9544/pywin32-311-cp39-cp39-win32.whl", hash = "sha256:aba8f82d551a942cb20d4a83413ccbac30790b50efb89a75e4f586ac0bb8056b", size = 8760837, upload-time = "2025-07-14T20:12:59.59Z" }, + { url = "https://files.pythonhosted.org/packages/9f/8a/1403d0353f8c5a2f0829d2b1c4becbf9da2f0a4d040886404fc4a5431e4d/pywin32-311-cp39-cp39-win_amd64.whl", hash = "sha256:e0c4cfb0621281fe40387df582097fd796e80430597cb9944f0ae70447bacd91", size = 9590187, upload-time = "2025-07-14T20:13:01.419Z" }, + { url = "https://files.pythonhosted.org/packages/60/22/e0e8d802f124772cec9c75430b01a212f86f9de7546bda715e54140d5aeb/pywin32-311-cp39-cp39-win_arm64.whl", hash = "sha256:62ea666235135fee79bb154e695f3ff67370afefd71bd7fea7512fc70ef31e3d", size = 8778162, upload-time = "2025-07-14T20:13:03.544Z" }, +] + +[[package]] +name = "pywin32-ctypes" +version = "0.2.3" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/85/9f/01a1a99704853cb63f253eea009390c88e7131c67e66a0a02099a8c917cb/pywin32-ctypes-0.2.3.tar.gz", hash = "sha256:d162dc04946d704503b2edc4d55f3dba5c1d539ead017afa00142c38b9885755", size = 29471, upload-time = "2024-08-14T10:15:34.626Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/de/3d/8161f7711c017e01ac9f008dfddd9410dff3674334c233bde66e7ba65bbf/pywin32_ctypes-0.2.3-py3-none-any.whl", hash = "sha256:8a1513379d709975552d202d942d9837758905c8d01eb82b8bcc30918929e7b8", size = 30756, upload-time = "2024-08-14T10:15:33.187Z" }, +] + +[[package]] +name = "pywinpty" +version = "2.0.14" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version < '3.9'", +] +sdist = { url = "https://files.pythonhosted.org/packages/f1/82/90f8750423cba4b9b6c842df227609fb60704482d7abf6dd47e2babc055a/pywinpty-2.0.14.tar.gz", hash = "sha256:18bd9529e4a5daf2d9719aa17788ba6013e594ae94c5a0c27e83df3278b0660e", size = 27769, upload-time = "2024-10-17T16:01:43.197Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/07/09/56376af256eab8cc5f8982a3b138d387136eca27fa1a8a68660e8ed59e4b/pywinpty-2.0.14-cp310-none-win_amd64.whl", hash = "sha256:0b149c2918c7974f575ba79f5a4aad58bd859a52fa9eb1296cc22aa412aa411f", size = 1397115, upload-time = "2024-10-17T16:04:46.736Z" }, + { url = "https://files.pythonhosted.org/packages/be/e2/af1a99c0432e4e58c9ac8e334ee191790ec9793d33559189b9d2069bdc1d/pywinpty-2.0.14-cp311-none-win_amd64.whl", hash = "sha256:cf2a43ac7065b3e0dc8510f8c1f13a75fb8fde805efa3b8cff7599a1ef497bc7", size = 1397223, upload-time = "2024-10-17T16:04:33.08Z" }, + { url = "https://files.pythonhosted.org/packages/ad/79/759ae767a3b78d340446efd54dd1fe4f7dafa4fc7be96ed757e44bcdba54/pywinpty-2.0.14-cp312-none-win_amd64.whl", hash = "sha256:55dad362ef3e9408ade68fd173e4f9032b3ce08f68cfe7eacb2c263ea1179737", size = 1397207, upload-time = "2024-10-17T16:04:14.633Z" }, + { url = "https://files.pythonhosted.org/packages/7d/34/b77b3c209bf2eaa6455390c8d5449241637f5957f41636a2204065d52bfa/pywinpty-2.0.14-cp313-none-win_amd64.whl", hash = "sha256:074fb988a56ec79ca90ed03a896d40707131897cefb8f76f926e3834227f2819", size = 1396698, upload-time = "2024-10-17T16:04:15.172Z" }, + { url = "https://files.pythonhosted.org/packages/d8/ef/85e1b0ef7864fa2c579b1c1efce92c5f6fa238c8e73cf9f53deee08f8605/pywinpty-2.0.14-cp39-none-win_amd64.whl", hash = "sha256:5725fd56f73c0531ec218663bd8c8ff5acc43c78962fab28564871b5fce053fd", size = 1397396, upload-time = "2024-10-17T16:05:30.319Z" }, +] + +[[package]] +name = "pywinpty" +version = "3.0.2" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version >= '3.14'", + "python_full_version >= '3.11' and python_full_version < '3.14'", + "python_full_version == '3.10.*'", + "python_full_version == '3.9.*'", +] +sdist = { url = "https://files.pythonhosted.org/packages/f3/bb/a7cc2967c5c4eceb6cc49cfe39447d4bfc56e6c865e7c2249b6eb978935f/pywinpty-3.0.2.tar.gz", hash = "sha256:1505cc4cb248af42cb6285a65c9c2086ee9e7e574078ee60933d5d7fa86fb004", size = 30669, upload-time = "2025-10-03T21:16:29.205Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/3e/f5/b17ae550841949c217ad557ee445b4a14e9c0b506ae51ee087eff53428a6/pywinpty-3.0.2-cp310-cp310-win_amd64.whl", hash = "sha256:65db57fd3387d71e8372b6a54269cbcd0f6dfa6d4616a29e0af749ec19f5c558", size = 2050330, upload-time = "2025-10-03T21:20:15.656Z" }, + { url = "https://files.pythonhosted.org/packages/a6/a1/409c1651c9f874d598c10f51ff586c416625601df4bca315d08baec4c3e3/pywinpty-3.0.2-cp311-cp311-win_amd64.whl", hash = "sha256:327790d70e4c841ebd9d0f295a780177149aeb405bca44c7115a3de5c2054b23", size = 2050304, upload-time = "2025-10-03T21:19:29.466Z" }, + { url = "https://files.pythonhosted.org/packages/02/4e/1098484e042c9485f56f16eb2b69b43b874bd526044ee401512234cf9e04/pywinpty-3.0.2-cp312-cp312-win_amd64.whl", hash = "sha256:99fdd9b455f0ad6419aba6731a7a0d2f88ced83c3c94a80ff9533d95fa8d8a9e", size = 2050391, upload-time = "2025-10-03T21:19:01.642Z" }, + { url = "https://files.pythonhosted.org/packages/fc/19/b757fe28008236a4a713e813283721b8a40aa60cd7d3f83549f2e25a3155/pywinpty-3.0.2-cp313-cp313-win_amd64.whl", hash = "sha256:18f78b81e4cfee6aabe7ea8688441d30247b73e52cd9657138015c5f4ee13a51", size = 2050057, upload-time = "2025-10-03T21:19:26.732Z" }, + { url = "https://files.pythonhosted.org/packages/cb/44/cbae12ecf6f4fa4129c36871fd09c6bef4f98d5f625ecefb5e2449765508/pywinpty-3.0.2-cp313-cp313t-win_amd64.whl", hash = "sha256:663383ecfab7fc382cc97ea5c4f7f0bb32c2f889259855df6ea34e5df42d305b", size = 2049874, upload-time = "2025-10-03T21:18:53.923Z" }, + { url = "https://files.pythonhosted.org/packages/ca/15/f12c6055e2d7a617d4d5820e8ac4ceaff849da4cb124640ef5116a230771/pywinpty-3.0.2-cp314-cp314-win_amd64.whl", hash = "sha256:28297cecc37bee9f24d8889e47231972d6e9e84f7b668909de54f36ca785029a", size = 2050386, upload-time = "2025-10-03T21:18:50.477Z" }, + { url = "https://files.pythonhosted.org/packages/de/24/c6907c5bb06043df98ad6a0a0ff5db2e0affcecbc3b15c42404393a3f72a/pywinpty-3.0.2-cp314-cp314t-win_amd64.whl", hash = "sha256:34b55ae9a1b671fe3eae071d86618110538e8eaad18fcb1531c0830b91a82767", size = 2049834, upload-time = "2025-10-03T21:19:25.688Z" }, + { url = "https://files.pythonhosted.org/packages/d3/ea/5cc069afc60f6dd5bc99b3e51fb8b219f10bcf5674882fc5d6dd2186d3aa/pywinpty-3.0.2-cp39-cp39-win_amd64.whl", hash = "sha256:3962daf801bc38dd4de872108c424b5338c9a46c6efca5761854cd66370a9022", size = 2052447, upload-time = "2025-10-03T21:18:51.457Z" }, +] + +[[package]] +name = "pyyaml" +version = "6.0.3" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/05/8e/961c0007c59b8dd7729d542c61a4d537767a59645b82a0b521206e1e25c2/pyyaml-6.0.3.tar.gz", hash = "sha256:d76623373421df22fb4cf8817020cbb7ef15c725b9d5e45f17e189bfc384190f", size = 130960, upload-time = "2025-09-25T21:33:16.546Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/0d/a2/09f67a3589cb4320fb5ce90d3fd4c9752636b8b6ad8f34b54d76c5a54693/PyYAML-6.0.3-cp38-cp38-macosx_10_13_x86_64.whl", hash = "sha256:c2514fceb77bc5e7a2f7adfaa1feb2fb311607c9cb518dbc378688ec73d8292f", size = 186824, upload-time = "2025-09-29T20:27:35.918Z" }, + { url = "https://files.pythonhosted.org/packages/02/72/d972384252432d57f248767556ac083793292a4adf4e2d85dfe785ec2659/PyYAML-6.0.3-cp38-cp38-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:9c57bb8c96f6d1808c030b1687b9b5fb476abaa47f0db9c0101f5e9f394e97f4", size = 795069, upload-time = "2025-09-29T20:27:38.15Z" }, + { url = "https://files.pythonhosted.org/packages/a7/3b/6c58ac0fa7c4e1b35e48024eb03d00817438310447f93ef4431673c24138/PyYAML-6.0.3-cp38-cp38-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:efd7b85f94a6f21e4932043973a7ba2613b059c4a000551892ac9f1d11f5baf3", size = 862585, upload-time = "2025-09-29T20:27:39.715Z" }, + { url = "https://files.pythonhosted.org/packages/25/a2/b725b61ac76a75583ae7104b3209f75ea44b13cfd026aa535ece22b7f22e/PyYAML-6.0.3-cp38-cp38-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:22ba7cfcad58ef3ecddc7ed1db3409af68d023b7f940da23c6c2a1890976eda6", size = 806018, upload-time = "2025-09-29T20:27:41.444Z" }, + { url = "https://files.pythonhosted.org/packages/6f/b0/b2227677b2d1036d84f5ee95eb948e7af53d59fe3e4328784e4d290607e0/PyYAML-6.0.3-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:6344df0d5755a2c9a276d4473ae6b90647e216ab4757f8426893b5dd2ac3f369", size = 802822, upload-time = "2025-09-29T20:27:42.885Z" }, + { url = "https://files.pythonhosted.org/packages/99/a5/718a8ea22521e06ef19f91945766a892c5ceb1855df6adbde67d997ea7ed/PyYAML-6.0.3-cp38-cp38-win32.whl", hash = "sha256:3ff07ec89bae51176c0549bc4c63aa6202991da2d9a6129d7aef7f1407d3f295", size = 143744, upload-time = "2025-09-29T20:27:44.487Z" }, + { url = "https://files.pythonhosted.org/packages/76/b2/2b69cee94c9eb215216fc05778675c393e3aa541131dc910df8e52c83776/PyYAML-6.0.3-cp38-cp38-win_amd64.whl", hash = "sha256:5cf4e27da7e3fbed4d6c3d8e797387aaad68102272f8f9752883bc32d61cb87b", size = 160082, upload-time = "2025-09-29T20:27:46.049Z" }, + { url = "https://files.pythonhosted.org/packages/f4/a0/39350dd17dd6d6c6507025c0e53aef67a9293a6d37d3511f23ea510d5800/pyyaml-6.0.3-cp310-cp310-macosx_10_13_x86_64.whl", hash = "sha256:214ed4befebe12df36bcc8bc2b64b396ca31be9304b8f59e25c11cf94a4c033b", size = 184227, upload-time = "2025-09-25T21:31:46.04Z" }, + { url = "https://files.pythonhosted.org/packages/05/14/52d505b5c59ce73244f59c7a50ecf47093ce4765f116cdb98286a71eeca2/pyyaml-6.0.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:02ea2dfa234451bbb8772601d7b8e426c2bfa197136796224e50e35a78777956", size = 174019, upload-time = "2025-09-25T21:31:47.706Z" }, + { url = "https://files.pythonhosted.org/packages/43/f7/0e6a5ae5599c838c696adb4e6330a59f463265bfa1e116cfd1fbb0abaaae/pyyaml-6.0.3-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b30236e45cf30d2b8e7b3e85881719e98507abed1011bf463a8fa23e9c3e98a8", size = 740646, upload-time = "2025-09-25T21:31:49.21Z" }, + { url = "https://files.pythonhosted.org/packages/2f/3a/61b9db1d28f00f8fd0ae760459a5c4bf1b941baf714e207b6eb0657d2578/pyyaml-6.0.3-cp310-cp310-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:66291b10affd76d76f54fad28e22e51719ef9ba22b29e1d7d03d6777a9174198", size = 840793, upload-time = "2025-09-25T21:31:50.735Z" }, + { url = "https://files.pythonhosted.org/packages/7a/1e/7acc4f0e74c4b3d9531e24739e0ab832a5edf40e64fbae1a9c01941cabd7/pyyaml-6.0.3-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:9c7708761fccb9397fe64bbc0395abcae8c4bf7b0eac081e12b809bf47700d0b", size = 770293, upload-time = "2025-09-25T21:31:51.828Z" }, + { url = "https://files.pythonhosted.org/packages/8b/ef/abd085f06853af0cd59fa5f913d61a8eab65d7639ff2a658d18a25d6a89d/pyyaml-6.0.3-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:418cf3f2111bc80e0933b2cd8cd04f286338bb88bdc7bc8e6dd775ebde60b5e0", size = 732872, upload-time = "2025-09-25T21:31:53.282Z" }, + { url = "https://files.pythonhosted.org/packages/1f/15/2bc9c8faf6450a8b3c9fc5448ed869c599c0a74ba2669772b1f3a0040180/pyyaml-6.0.3-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:5e0b74767e5f8c593e8c9b5912019159ed0533c70051e9cce3e8b6aa699fcd69", size = 758828, upload-time = "2025-09-25T21:31:54.807Z" }, + { url = "https://files.pythonhosted.org/packages/a3/00/531e92e88c00f4333ce359e50c19b8d1de9fe8d581b1534e35ccfbc5f393/pyyaml-6.0.3-cp310-cp310-win32.whl", hash = "sha256:28c8d926f98f432f88adc23edf2e6d4921ac26fb084b028c733d01868d19007e", size = 142415, upload-time = "2025-09-25T21:31:55.885Z" }, + { url = "https://files.pythonhosted.org/packages/2a/fa/926c003379b19fca39dd4634818b00dec6c62d87faf628d1394e137354d4/pyyaml-6.0.3-cp310-cp310-win_amd64.whl", hash = "sha256:bdb2c67c6c1390b63c6ff89f210c8fd09d9a1217a465701eac7316313c915e4c", size = 158561, upload-time = "2025-09-25T21:31:57.406Z" }, + { url = "https://files.pythonhosted.org/packages/6d/16/a95b6757765b7b031c9374925bb718d55e0a9ba8a1b6a12d25962ea44347/pyyaml-6.0.3-cp311-cp311-macosx_10_13_x86_64.whl", hash = "sha256:44edc647873928551a01e7a563d7452ccdebee747728c1080d881d68af7b997e", size = 185826, upload-time = "2025-09-25T21:31:58.655Z" }, + { url = "https://files.pythonhosted.org/packages/16/19/13de8e4377ed53079ee996e1ab0a9c33ec2faf808a4647b7b4c0d46dd239/pyyaml-6.0.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:652cb6edd41e718550aad172851962662ff2681490a8a711af6a4d288dd96824", size = 175577, upload-time = "2025-09-25T21:32:00.088Z" }, + { url = "https://files.pythonhosted.org/packages/0c/62/d2eb46264d4b157dae1275b573017abec435397aa59cbcdab6fc978a8af4/pyyaml-6.0.3-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:10892704fc220243f5305762e276552a0395f7beb4dbf9b14ec8fd43b57f126c", size = 775556, upload-time = "2025-09-25T21:32:01.31Z" }, + { url = "https://files.pythonhosted.org/packages/10/cb/16c3f2cf3266edd25aaa00d6c4350381c8b012ed6f5276675b9eba8d9ff4/pyyaml-6.0.3-cp311-cp311-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:850774a7879607d3a6f50d36d04f00ee69e7fc816450e5f7e58d7f17f1ae5c00", size = 882114, upload-time = "2025-09-25T21:32:03.376Z" }, + { url = "https://files.pythonhosted.org/packages/71/60/917329f640924b18ff085ab889a11c763e0b573da888e8404ff486657602/pyyaml-6.0.3-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:b8bb0864c5a28024fac8a632c443c87c5aa6f215c0b126c449ae1a150412f31d", size = 806638, upload-time = "2025-09-25T21:32:04.553Z" }, + { url = "https://files.pythonhosted.org/packages/dd/6f/529b0f316a9fd167281a6c3826b5583e6192dba792dd55e3203d3f8e655a/pyyaml-6.0.3-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:1d37d57ad971609cf3c53ba6a7e365e40660e3be0e5175fa9f2365a379d6095a", size = 767463, upload-time = "2025-09-25T21:32:06.152Z" }, + { url = "https://files.pythonhosted.org/packages/f2/6a/b627b4e0c1dd03718543519ffb2f1deea4a1e6d42fbab8021936a4d22589/pyyaml-6.0.3-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:37503bfbfc9d2c40b344d06b2199cf0e96e97957ab1c1b546fd4f87e53e5d3e4", size = 794986, upload-time = "2025-09-25T21:32:07.367Z" }, + { url = "https://files.pythonhosted.org/packages/45/91/47a6e1c42d9ee337c4839208f30d9f09caa9f720ec7582917b264defc875/pyyaml-6.0.3-cp311-cp311-win32.whl", hash = "sha256:8098f252adfa6c80ab48096053f512f2321f0b998f98150cea9bd23d83e1467b", size = 142543, upload-time = "2025-09-25T21:32:08.95Z" }, + { url = "https://files.pythonhosted.org/packages/da/e3/ea007450a105ae919a72393cb06f122f288ef60bba2dc64b26e2646fa315/pyyaml-6.0.3-cp311-cp311-win_amd64.whl", hash = "sha256:9f3bfb4965eb874431221a3ff3fdcddc7e74e3b07799e0e84ca4a0f867d449bf", size = 158763, upload-time = "2025-09-25T21:32:09.96Z" }, + { url = "https://files.pythonhosted.org/packages/d1/33/422b98d2195232ca1826284a76852ad5a86fe23e31b009c9886b2d0fb8b2/pyyaml-6.0.3-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:7f047e29dcae44602496db43be01ad42fc6f1cc0d8cd6c83d342306c32270196", size = 182063, upload-time = "2025-09-25T21:32:11.445Z" }, + { url = "https://files.pythonhosted.org/packages/89/a0/6cf41a19a1f2f3feab0e9c0b74134aa2ce6849093d5517a0c550fe37a648/pyyaml-6.0.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:fc09d0aa354569bc501d4e787133afc08552722d3ab34836a80547331bb5d4a0", size = 173973, upload-time = "2025-09-25T21:32:12.492Z" }, + { url = "https://files.pythonhosted.org/packages/ed/23/7a778b6bd0b9a8039df8b1b1d80e2e2ad78aa04171592c8a5c43a56a6af4/pyyaml-6.0.3-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:9149cad251584d5fb4981be1ecde53a1ca46c891a79788c0df828d2f166bda28", size = 775116, upload-time = "2025-09-25T21:32:13.652Z" }, + { url = "https://files.pythonhosted.org/packages/65/30/d7353c338e12baef4ecc1b09e877c1970bd3382789c159b4f89d6a70dc09/pyyaml-6.0.3-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:5fdec68f91a0c6739b380c83b951e2c72ac0197ace422360e6d5a959d8d97b2c", size = 844011, upload-time = "2025-09-25T21:32:15.21Z" }, + { url = "https://files.pythonhosted.org/packages/8b/9d/b3589d3877982d4f2329302ef98a8026e7f4443c765c46cfecc8858c6b4b/pyyaml-6.0.3-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:ba1cc08a7ccde2d2ec775841541641e4548226580ab850948cbfda66a1befcdc", size = 807870, upload-time = "2025-09-25T21:32:16.431Z" }, + { url = "https://files.pythonhosted.org/packages/05/c0/b3be26a015601b822b97d9149ff8cb5ead58c66f981e04fedf4e762f4bd4/pyyaml-6.0.3-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:8dc52c23056b9ddd46818a57b78404882310fb473d63f17b07d5c40421e47f8e", size = 761089, upload-time = "2025-09-25T21:32:17.56Z" }, + { url = "https://files.pythonhosted.org/packages/be/8e/98435a21d1d4b46590d5459a22d88128103f8da4c2d4cb8f14f2a96504e1/pyyaml-6.0.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:41715c910c881bc081f1e8872880d3c650acf13dfa8214bad49ed4cede7c34ea", size = 790181, upload-time = "2025-09-25T21:32:18.834Z" }, + { url = "https://files.pythonhosted.org/packages/74/93/7baea19427dcfbe1e5a372d81473250b379f04b1bd3c4c5ff825e2327202/pyyaml-6.0.3-cp312-cp312-win32.whl", hash = "sha256:96b533f0e99f6579b3d4d4995707cf36df9100d67e0c8303a0c55b27b5f99bc5", size = 137658, upload-time = "2025-09-25T21:32:20.209Z" }, + { url = "https://files.pythonhosted.org/packages/86/bf/899e81e4cce32febab4fb42bb97dcdf66bc135272882d1987881a4b519e9/pyyaml-6.0.3-cp312-cp312-win_amd64.whl", hash = "sha256:5fcd34e47f6e0b794d17de1b4ff496c00986e1c83f7ab2fb8fcfe9616ff7477b", size = 154003, upload-time = "2025-09-25T21:32:21.167Z" }, + { url = "https://files.pythonhosted.org/packages/1a/08/67bd04656199bbb51dbed1439b7f27601dfb576fb864099c7ef0c3e55531/pyyaml-6.0.3-cp312-cp312-win_arm64.whl", hash = "sha256:64386e5e707d03a7e172c0701abfb7e10f0fb753ee1d773128192742712a98fd", size = 140344, upload-time = "2025-09-25T21:32:22.617Z" }, + { url = "https://files.pythonhosted.org/packages/d1/11/0fd08f8192109f7169db964b5707a2f1e8b745d4e239b784a5a1dd80d1db/pyyaml-6.0.3-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:8da9669d359f02c0b91ccc01cac4a67f16afec0dac22c2ad09f46bee0697eba8", size = 181669, upload-time = "2025-09-25T21:32:23.673Z" }, + { url = "https://files.pythonhosted.org/packages/b1/16/95309993f1d3748cd644e02e38b75d50cbc0d9561d21f390a76242ce073f/pyyaml-6.0.3-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:2283a07e2c21a2aa78d9c4442724ec1eb15f5e42a723b99cb3d822d48f5f7ad1", size = 173252, upload-time = "2025-09-25T21:32:25.149Z" }, + { url = "https://files.pythonhosted.org/packages/50/31/b20f376d3f810b9b2371e72ef5adb33879b25edb7a6d072cb7ca0c486398/pyyaml-6.0.3-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ee2922902c45ae8ccada2c5b501ab86c36525b883eff4255313a253a3160861c", size = 767081, upload-time = "2025-09-25T21:32:26.575Z" }, + { url = "https://files.pythonhosted.org/packages/49/1e/a55ca81e949270d5d4432fbbd19dfea5321eda7c41a849d443dc92fd1ff7/pyyaml-6.0.3-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:a33284e20b78bd4a18c8c2282d549d10bc8408a2a7ff57653c0cf0b9be0afce5", size = 841159, upload-time = "2025-09-25T21:32:27.727Z" }, + { url = "https://files.pythonhosted.org/packages/74/27/e5b8f34d02d9995b80abcef563ea1f8b56d20134d8f4e5e81733b1feceb2/pyyaml-6.0.3-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:0f29edc409a6392443abf94b9cf89ce99889a1dd5376d94316ae5145dfedd5d6", size = 801626, upload-time = "2025-09-25T21:32:28.878Z" }, + { url = "https://files.pythonhosted.org/packages/f9/11/ba845c23988798f40e52ba45f34849aa8a1f2d4af4b798588010792ebad6/pyyaml-6.0.3-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:f7057c9a337546edc7973c0d3ba84ddcdf0daa14533c2065749c9075001090e6", size = 753613, upload-time = "2025-09-25T21:32:30.178Z" }, + { url = "https://files.pythonhosted.org/packages/3d/e0/7966e1a7bfc0a45bf0a7fb6b98ea03fc9b8d84fa7f2229e9659680b69ee3/pyyaml-6.0.3-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:eda16858a3cab07b80edaf74336ece1f986ba330fdb8ee0d6c0d68fe82bc96be", size = 794115, upload-time = "2025-09-25T21:32:31.353Z" }, + { url = "https://files.pythonhosted.org/packages/de/94/980b50a6531b3019e45ddeada0626d45fa85cbe22300844a7983285bed3b/pyyaml-6.0.3-cp313-cp313-win32.whl", hash = "sha256:d0eae10f8159e8fdad514efdc92d74fd8d682c933a6dd088030f3834bc8e6b26", size = 137427, upload-time = "2025-09-25T21:32:32.58Z" }, + { url = "https://files.pythonhosted.org/packages/97/c9/39d5b874e8b28845e4ec2202b5da735d0199dbe5b8fb85f91398814a9a46/pyyaml-6.0.3-cp313-cp313-win_amd64.whl", hash = "sha256:79005a0d97d5ddabfeeea4cf676af11e647e41d81c9a7722a193022accdb6b7c", size = 154090, upload-time = "2025-09-25T21:32:33.659Z" }, + { url = "https://files.pythonhosted.org/packages/73/e8/2bdf3ca2090f68bb3d75b44da7bbc71843b19c9f2b9cb9b0f4ab7a5a4329/pyyaml-6.0.3-cp313-cp313-win_arm64.whl", hash = "sha256:5498cd1645aa724a7c71c8f378eb29ebe23da2fc0d7a08071d89469bf1d2defb", size = 140246, upload-time = "2025-09-25T21:32:34.663Z" }, + { url = "https://files.pythonhosted.org/packages/9d/8c/f4bd7f6465179953d3ac9bc44ac1a8a3e6122cf8ada906b4f96c60172d43/pyyaml-6.0.3-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:8d1fab6bb153a416f9aeb4b8763bc0f22a5586065f86f7664fc23339fc1c1fac", size = 181814, upload-time = "2025-09-25T21:32:35.712Z" }, + { url = "https://files.pythonhosted.org/packages/bd/9c/4d95bb87eb2063d20db7b60faa3840c1b18025517ae857371c4dd55a6b3a/pyyaml-6.0.3-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:34d5fcd24b8445fadc33f9cf348c1047101756fd760b4dacb5c3e99755703310", size = 173809, upload-time = "2025-09-25T21:32:36.789Z" }, + { url = "https://files.pythonhosted.org/packages/92/b5/47e807c2623074914e29dabd16cbbdd4bf5e9b2db9f8090fa64411fc5382/pyyaml-6.0.3-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:501a031947e3a9025ed4405a168e6ef5ae3126c59f90ce0cd6f2bfc477be31b7", size = 766454, upload-time = "2025-09-25T21:32:37.966Z" }, + { url = "https://files.pythonhosted.org/packages/02/9e/e5e9b168be58564121efb3de6859c452fccde0ab093d8438905899a3a483/pyyaml-6.0.3-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:b3bc83488de33889877a0f2543ade9f70c67d66d9ebb4ac959502e12de895788", size = 836355, upload-time = "2025-09-25T21:32:39.178Z" }, + { url = "https://files.pythonhosted.org/packages/88/f9/16491d7ed2a919954993e48aa941b200f38040928474c9e85ea9e64222c3/pyyaml-6.0.3-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:c458b6d084f9b935061bc36216e8a69a7e293a2f1e68bf956dcd9e6cbcd143f5", size = 794175, upload-time = "2025-09-25T21:32:40.865Z" }, + { url = "https://files.pythonhosted.org/packages/dd/3f/5989debef34dc6397317802b527dbbafb2b4760878a53d4166579111411e/pyyaml-6.0.3-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:7c6610def4f163542a622a73fb39f534f8c101d690126992300bf3207eab9764", size = 755228, upload-time = "2025-09-25T21:32:42.084Z" }, + { url = "https://files.pythonhosted.org/packages/d7/ce/af88a49043cd2e265be63d083fc75b27b6ed062f5f9fd6cdc223ad62f03e/pyyaml-6.0.3-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:5190d403f121660ce8d1d2c1bb2ef1bd05b5f68533fc5c2ea899bd15f4399b35", size = 789194, upload-time = "2025-09-25T21:32:43.362Z" }, + { url = "https://files.pythonhosted.org/packages/23/20/bb6982b26a40bb43951265ba29d4c246ef0ff59c9fdcdf0ed04e0687de4d/pyyaml-6.0.3-cp314-cp314-win_amd64.whl", hash = "sha256:4a2e8cebe2ff6ab7d1050ecd59c25d4c8bd7e6f400f5f82b96557ac0abafd0ac", size = 156429, upload-time = "2025-09-25T21:32:57.844Z" }, + { url = "https://files.pythonhosted.org/packages/f4/f4/a4541072bb9422c8a883ab55255f918fa378ecf083f5b85e87fc2b4eda1b/pyyaml-6.0.3-cp314-cp314-win_arm64.whl", hash = "sha256:93dda82c9c22deb0a405ea4dc5f2d0cda384168e466364dec6255b293923b2f3", size = 143912, upload-time = "2025-09-25T21:32:59.247Z" }, + { url = "https://files.pythonhosted.org/packages/7c/f9/07dd09ae774e4616edf6cda684ee78f97777bdd15847253637a6f052a62f/pyyaml-6.0.3-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:02893d100e99e03eda1c8fd5c441d8c60103fd175728e23e431db1b589cf5ab3", size = 189108, upload-time = "2025-09-25T21:32:44.377Z" }, + { url = "https://files.pythonhosted.org/packages/4e/78/8d08c9fb7ce09ad8c38ad533c1191cf27f7ae1effe5bb9400a46d9437fcf/pyyaml-6.0.3-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:c1ff362665ae507275af2853520967820d9124984e0f7466736aea23d8611fba", size = 183641, upload-time = "2025-09-25T21:32:45.407Z" }, + { url = "https://files.pythonhosted.org/packages/7b/5b/3babb19104a46945cf816d047db2788bcaf8c94527a805610b0289a01c6b/pyyaml-6.0.3-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6adc77889b628398debc7b65c073bcb99c4a0237b248cacaf3fe8a557563ef6c", size = 831901, upload-time = "2025-09-25T21:32:48.83Z" }, + { url = "https://files.pythonhosted.org/packages/8b/cc/dff0684d8dc44da4d22a13f35f073d558c268780ce3c6ba1b87055bb0b87/pyyaml-6.0.3-cp314-cp314t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:a80cb027f6b349846a3bf6d73b5e95e782175e52f22108cfa17876aaeff93702", size = 861132, upload-time = "2025-09-25T21:32:50.149Z" }, + { url = "https://files.pythonhosted.org/packages/b1/5e/f77dc6b9036943e285ba76b49e118d9ea929885becb0a29ba8a7c75e29fe/pyyaml-6.0.3-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:00c4bdeba853cc34e7dd471f16b4114f4162dc03e6b7afcc2128711f0eca823c", size = 839261, upload-time = "2025-09-25T21:32:51.808Z" }, + { url = "https://files.pythonhosted.org/packages/ce/88/a9db1376aa2a228197c58b37302f284b5617f56a5d959fd1763fb1675ce6/pyyaml-6.0.3-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:66e1674c3ef6f541c35191caae2d429b967b99e02040f5ba928632d9a7f0f065", size = 805272, upload-time = "2025-09-25T21:32:52.941Z" }, + { url = "https://files.pythonhosted.org/packages/da/92/1446574745d74df0c92e6aa4a7b0b3130706a4142b2d1a5869f2eaa423c6/pyyaml-6.0.3-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:16249ee61e95f858e83976573de0f5b2893b3677ba71c9dd36b9cf8be9ac6d65", size = 829923, upload-time = "2025-09-25T21:32:54.537Z" }, + { url = "https://files.pythonhosted.org/packages/f0/7a/1c7270340330e575b92f397352af856a8c06f230aa3e76f86b39d01b416a/pyyaml-6.0.3-cp314-cp314t-win_amd64.whl", hash = "sha256:4ad1906908f2f5ae4e5a8ddfce73c320c2a1429ec52eafd27138b7f1cbe341c9", size = 174062, upload-time = "2025-09-25T21:32:55.767Z" }, + { url = "https://files.pythonhosted.org/packages/f1/12/de94a39c2ef588c7e6455cfbe7343d3b2dc9d6b6b2f40c4c6565744c873d/pyyaml-6.0.3-cp314-cp314t-win_arm64.whl", hash = "sha256:ebc55a14a21cb14062aa4162f906cd962b28e2e9ea38f9b4391244cd8de4ae0b", size = 149341, upload-time = "2025-09-25T21:32:56.828Z" }, + { url = "https://files.pythonhosted.org/packages/9f/62/67fc8e68a75f738c9200422bf65693fb79a4cd0dc5b23310e5202e978090/pyyaml-6.0.3-cp39-cp39-macosx_10_13_x86_64.whl", hash = "sha256:b865addae83924361678b652338317d1bd7e79b1f4596f96b96c77a5a34b34da", size = 184450, upload-time = "2025-09-25T21:33:00.618Z" }, + { url = "https://files.pythonhosted.org/packages/ae/92/861f152ce87c452b11b9d0977952259aa7df792d71c1053365cc7b09cc08/pyyaml-6.0.3-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:c3355370a2c156cffb25e876646f149d5d68f5e0a3ce86a5084dd0b64a994917", size = 174319, upload-time = "2025-09-25T21:33:02.086Z" }, + { url = "https://files.pythonhosted.org/packages/d0/cd/f0cfc8c74f8a030017a2b9c771b7f47e5dd702c3e28e5b2071374bda2948/pyyaml-6.0.3-cp39-cp39-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:3c5677e12444c15717b902a5798264fa7909e41153cdf9ef7ad571b704a63dd9", size = 737631, upload-time = "2025-09-25T21:33:03.25Z" }, + { url = "https://files.pythonhosted.org/packages/ef/b2/18f2bd28cd2055a79a46c9b0895c0b3d987ce40ee471cecf58a1a0199805/pyyaml-6.0.3-cp39-cp39-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:5ed875a24292240029e4483f9d4a4b8a1ae08843b9c54f43fcc11e404532a8a5", size = 836795, upload-time = "2025-09-25T21:33:05.014Z" }, + { url = "https://files.pythonhosted.org/packages/73/b9/793686b2d54b531203c160ef12bec60228a0109c79bae6c1277961026770/pyyaml-6.0.3-cp39-cp39-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:0150219816b6a1fa26fb4699fb7daa9caf09eb1999f3b70fb6e786805e80375a", size = 750767, upload-time = "2025-09-25T21:33:06.398Z" }, + { url = "https://files.pythonhosted.org/packages/a9/86/a137b39a611def2ed78b0e66ce2fe13ee701a07c07aebe55c340ed2a050e/pyyaml-6.0.3-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:fa160448684b4e94d80416c0fa4aac48967a969efe22931448d853ada8baf926", size = 727982, upload-time = "2025-09-25T21:33:08.708Z" }, + { url = "https://files.pythonhosted.org/packages/dd/62/71c27c94f457cf4418ef8ccc71735324c549f7e3ea9d34aba50874563561/pyyaml-6.0.3-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:27c0abcb4a5dac13684a37f76e701e054692a9b2d3064b70f5e4eb54810553d7", size = 755677, upload-time = "2025-09-25T21:33:09.876Z" }, + { url = "https://files.pythonhosted.org/packages/29/3d/6f5e0d58bd924fb0d06c3a6bad00effbdae2de5adb5cda5648006ffbd8d3/pyyaml-6.0.3-cp39-cp39-win32.whl", hash = "sha256:1ebe39cb5fc479422b83de611d14e2c0d3bb2a18bbcb01f229ab3cfbd8fee7a0", size = 142592, upload-time = "2025-09-25T21:33:10.983Z" }, + { url = "https://files.pythonhosted.org/packages/f0/0c/25113e0b5e103d7f1490c0e947e303fe4a696c10b501dea7a9f49d4e876c/pyyaml-6.0.3-cp39-cp39-win_amd64.whl", hash = "sha256:2e71d11abed7344e42a8849600193d15b6def118602c4c176f748e4583246007", size = 158777, upload-time = "2025-09-25T21:33:15.55Z" }, +] + +[[package]] +name = "pyzmq" +version = "27.1.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "cffi", version = "1.17.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.9' and implementation_name == 'pypy'" }, + { name = "cffi", version = "2.0.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.9' and implementation_name == 'pypy'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/04/0b/3c9baedbdf613ecaa7aa07027780b8867f57b6293b6ee50de316c9f3222b/pyzmq-27.1.0.tar.gz", hash = "sha256:ac0765e3d44455adb6ddbf4417dcce460fc40a05978c08efdf2948072f6db540", size = 281750, upload-time = "2025-09-08T23:10:18.157Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/67/b9/52aa9ec2867528b54f1e60846728d8b4d84726630874fee3a91e66c7df81/pyzmq-27.1.0-cp310-cp310-macosx_10_15_universal2.whl", hash = "sha256:508e23ec9bc44c0005c4946ea013d9317ae00ac67778bd47519fdf5a0e930ff4", size = 1329850, upload-time = "2025-09-08T23:07:26.274Z" }, + { url = "https://files.pythonhosted.org/packages/99/64/5653e7b7425b169f994835a2b2abf9486264401fdef18df91ddae47ce2cc/pyzmq-27.1.0-cp310-cp310-manylinux2014_i686.manylinux_2_17_i686.whl", hash = "sha256:507b6f430bdcf0ee48c0d30e734ea89ce5567fd7b8a0f0044a369c176aa44556", size = 906380, upload-time = "2025-09-08T23:07:29.78Z" }, + { url = "https://files.pythonhosted.org/packages/73/78/7d713284dbe022f6440e391bd1f3c48d9185673878034cfb3939cdf333b2/pyzmq-27.1.0-cp310-cp310-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:bf7b38f9fd7b81cb6d9391b2946382c8237fd814075c6aa9c3b746d53076023b", size = 666421, upload-time = "2025-09-08T23:07:31.263Z" }, + { url = "https://files.pythonhosted.org/packages/30/76/8f099f9d6482450428b17c4d6b241281af7ce6a9de8149ca8c1c649f6792/pyzmq-27.1.0-cp310-cp310-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:03ff0b279b40d687691a6217c12242ee71f0fba28bf8626ff50e3ef0f4410e1e", size = 854149, upload-time = "2025-09-08T23:07:33.17Z" }, + { url = "https://files.pythonhosted.org/packages/59/f0/37fbfff06c68016019043897e4c969ceab18bde46cd2aca89821fcf4fb2e/pyzmq-27.1.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:677e744fee605753eac48198b15a2124016c009a11056f93807000ab11ce6526", size = 1655070, upload-time = "2025-09-08T23:07:35.205Z" }, + { url = "https://files.pythonhosted.org/packages/47/14/7254be73f7a8edc3587609554fcaa7bfd30649bf89cd260e4487ca70fdaa/pyzmq-27.1.0-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:dd2fec2b13137416a1c5648b7009499bcc8fea78154cd888855fa32514f3dad1", size = 2033441, upload-time = "2025-09-08T23:07:37.432Z" }, + { url = "https://files.pythonhosted.org/packages/22/dc/49f2be26c6f86f347e796a4d99b19167fc94503f0af3fd010ad262158822/pyzmq-27.1.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:08e90bb4b57603b84eab1d0ca05b3bbb10f60c1839dc471fc1c9e1507bef3386", size = 1891529, upload-time = "2025-09-08T23:07:39.047Z" }, + { url = "https://files.pythonhosted.org/packages/a3/3e/154fb963ae25be70c0064ce97776c937ecc7d8b0259f22858154a9999769/pyzmq-27.1.0-cp310-cp310-win32.whl", hash = "sha256:a5b42d7a0658b515319148875fcb782bbf118dd41c671b62dae33666c2213bda", size = 567276, upload-time = "2025-09-08T23:07:40.695Z" }, + { url = "https://files.pythonhosted.org/packages/62/b2/f4ab56c8c595abcb26b2be5fd9fa9e6899c1e5ad54964e93ae8bb35482be/pyzmq-27.1.0-cp310-cp310-win_amd64.whl", hash = "sha256:c0bb87227430ee3aefcc0ade2088100e528d5d3298a0a715a64f3d04c60ba02f", size = 632208, upload-time = "2025-09-08T23:07:42.298Z" }, + { url = "https://files.pythonhosted.org/packages/3b/e3/be2cc7ab8332bdac0522fdb64c17b1b6241a795bee02e0196636ec5beb79/pyzmq-27.1.0-cp310-cp310-win_arm64.whl", hash = "sha256:9a916f76c2ab8d045b19f2286851a38e9ac94ea91faf65bd64735924522a8b32", size = 559766, upload-time = "2025-09-08T23:07:43.869Z" }, + { url = "https://files.pythonhosted.org/packages/06/5d/305323ba86b284e6fcb0d842d6adaa2999035f70f8c38a9b6d21ad28c3d4/pyzmq-27.1.0-cp311-cp311-macosx_10_15_universal2.whl", hash = "sha256:226b091818d461a3bef763805e75685e478ac17e9008f49fce2d3e52b3d58b86", size = 1333328, upload-time = "2025-09-08T23:07:45.946Z" }, + { url = "https://files.pythonhosted.org/packages/bd/a0/fc7e78a23748ad5443ac3275943457e8452da67fda347e05260261108cbc/pyzmq-27.1.0-cp311-cp311-manylinux2014_i686.manylinux_2_17_i686.whl", hash = "sha256:0790a0161c281ca9723f804871b4027f2e8b5a528d357c8952d08cd1a9c15581", size = 908803, upload-time = "2025-09-08T23:07:47.551Z" }, + { url = "https://files.pythonhosted.org/packages/7e/22/37d15eb05f3bdfa4abea6f6d96eb3bb58585fbd3e4e0ded4e743bc650c97/pyzmq-27.1.0-cp311-cp311-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c895a6f35476b0c3a54e3eb6ccf41bf3018de937016e6e18748317f25d4e925f", size = 668836, upload-time = "2025-09-08T23:07:49.436Z" }, + { url = "https://files.pythonhosted.org/packages/b1/c4/2a6fe5111a01005fc7af3878259ce17684fabb8852815eda6225620f3c59/pyzmq-27.1.0-cp311-cp311-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:5bbf8d3630bf96550b3be8e1fc0fea5cbdc8d5466c1192887bd94869da17a63e", size = 857038, upload-time = "2025-09-08T23:07:51.234Z" }, + { url = "https://files.pythonhosted.org/packages/cb/eb/bfdcb41d0db9cd233d6fb22dc131583774135505ada800ebf14dfb0a7c40/pyzmq-27.1.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:15c8bd0fe0dabf808e2d7a681398c4e5ded70a551ab47482067a572c054c8e2e", size = 1657531, upload-time = "2025-09-08T23:07:52.795Z" }, + { url = "https://files.pythonhosted.org/packages/ab/21/e3180ca269ed4a0de5c34417dfe71a8ae80421198be83ee619a8a485b0c7/pyzmq-27.1.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:bafcb3dd171b4ae9f19ee6380dfc71ce0390fefaf26b504c0e5f628d7c8c54f2", size = 2034786, upload-time = "2025-09-08T23:07:55.047Z" }, + { url = "https://files.pythonhosted.org/packages/3b/b1/5e21d0b517434b7f33588ff76c177c5a167858cc38ef740608898cd329f2/pyzmq-27.1.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:e829529fcaa09937189178115c49c504e69289abd39967cd8a4c215761373394", size = 1894220, upload-time = "2025-09-08T23:07:57.172Z" }, + { url = "https://files.pythonhosted.org/packages/03/f2/44913a6ff6941905efc24a1acf3d3cb6146b636c546c7406c38c49c403d4/pyzmq-27.1.0-cp311-cp311-win32.whl", hash = "sha256:6df079c47d5902af6db298ec92151db82ecb557af663098b92f2508c398bb54f", size = 567155, upload-time = "2025-09-08T23:07:59.05Z" }, + { url = "https://files.pythonhosted.org/packages/23/6d/d8d92a0eb270a925c9b4dd039c0b4dc10abc2fcbc48331788824ef113935/pyzmq-27.1.0-cp311-cp311-win_amd64.whl", hash = "sha256:190cbf120fbc0fc4957b56866830def56628934a9d112aec0e2507aa6a032b97", size = 633428, upload-time = "2025-09-08T23:08:00.663Z" }, + { url = "https://files.pythonhosted.org/packages/ae/14/01afebc96c5abbbd713ecfc7469cfb1bc801c819a74ed5c9fad9a48801cb/pyzmq-27.1.0-cp311-cp311-win_arm64.whl", hash = "sha256:eca6b47df11a132d1745eb3b5b5e557a7dae2c303277aa0e69c6ba91b8736e07", size = 559497, upload-time = "2025-09-08T23:08:02.15Z" }, + { url = "https://files.pythonhosted.org/packages/92/e7/038aab64a946d535901103da16b953c8c9cc9c961dadcbf3609ed6428d23/pyzmq-27.1.0-cp312-abi3-macosx_10_15_universal2.whl", hash = "sha256:452631b640340c928fa343801b0d07eb0c3789a5ffa843f6e1a9cee0ba4eb4fc", size = 1306279, upload-time = "2025-09-08T23:08:03.807Z" }, + { url = "https://files.pythonhosted.org/packages/e8/5e/c3c49fdd0f535ef45eefcc16934648e9e59dace4a37ee88fc53f6cd8e641/pyzmq-27.1.0-cp312-abi3-manylinux2014_i686.manylinux_2_17_i686.whl", hash = "sha256:1c179799b118e554b66da67d88ed66cd37a169f1f23b5d9f0a231b4e8d44a113", size = 895645, upload-time = "2025-09-08T23:08:05.301Z" }, + { url = "https://files.pythonhosted.org/packages/f8/e5/b0b2504cb4e903a74dcf1ebae157f9e20ebb6ea76095f6cfffea28c42ecd/pyzmq-27.1.0-cp312-abi3-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:3837439b7f99e60312f0c926a6ad437b067356dc2bc2ec96eb395fd0fe804233", size = 652574, upload-time = "2025-09-08T23:08:06.828Z" }, + { url = "https://files.pythonhosted.org/packages/f8/9b/c108cdb55560eaf253f0cbdb61b29971e9fb34d9c3499b0e96e4e60ed8a5/pyzmq-27.1.0-cp312-abi3-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:43ad9a73e3da1fab5b0e7e13402f0b2fb934ae1c876c51d0afff0e7c052eca31", size = 840995, upload-time = "2025-09-08T23:08:08.396Z" }, + { url = "https://files.pythonhosted.org/packages/c2/bb/b79798ca177b9eb0825b4c9998c6af8cd2a7f15a6a1a4272c1d1a21d382f/pyzmq-27.1.0-cp312-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:0de3028d69d4cdc475bfe47a6128eb38d8bc0e8f4d69646adfbcd840facbac28", size = 1642070, upload-time = "2025-09-08T23:08:09.989Z" }, + { url = "https://files.pythonhosted.org/packages/9c/80/2df2e7977c4ede24c79ae39dcef3899bfc5f34d1ca7a5b24f182c9b7a9ca/pyzmq-27.1.0-cp312-abi3-musllinux_1_2_i686.whl", hash = "sha256:cf44a7763aea9298c0aa7dbf859f87ed7012de8bda0f3977b6fb1d96745df856", size = 2021121, upload-time = "2025-09-08T23:08:11.907Z" }, + { url = "https://files.pythonhosted.org/packages/46/bd/2d45ad24f5f5ae7e8d01525eb76786fa7557136555cac7d929880519e33a/pyzmq-27.1.0-cp312-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:f30f395a9e6fbca195400ce833c731e7b64c3919aa481af4d88c3759e0cb7496", size = 1878550, upload-time = "2025-09-08T23:08:13.513Z" }, + { url = "https://files.pythonhosted.org/packages/e6/2f/104c0a3c778d7c2ab8190e9db4f62f0b6957b53c9d87db77c284b69f33ea/pyzmq-27.1.0-cp312-abi3-win32.whl", hash = "sha256:250e5436a4ba13885494412b3da5d518cd0d3a278a1ae640e113c073a5f88edd", size = 559184, upload-time = "2025-09-08T23:08:15.163Z" }, + { url = "https://files.pythonhosted.org/packages/fc/7f/a21b20d577e4100c6a41795842028235998a643b1ad406a6d4163ea8f53e/pyzmq-27.1.0-cp312-abi3-win_amd64.whl", hash = "sha256:9ce490cf1d2ca2ad84733aa1d69ce6855372cb5ce9223802450c9b2a7cba0ccf", size = 619480, upload-time = "2025-09-08T23:08:17.192Z" }, + { url = "https://files.pythonhosted.org/packages/78/c2/c012beae5f76b72f007a9e91ee9401cb88c51d0f83c6257a03e785c81cc2/pyzmq-27.1.0-cp312-abi3-win_arm64.whl", hash = "sha256:75a2f36223f0d535a0c919e23615fc85a1e23b71f40c7eb43d7b1dedb4d8f15f", size = 552993, upload-time = "2025-09-08T23:08:18.926Z" }, + { url = "https://files.pythonhosted.org/packages/60/cb/84a13459c51da6cec1b7b1dc1a47e6db6da50b77ad7fd9c145842750a011/pyzmq-27.1.0-cp313-cp313-android_24_arm64_v8a.whl", hash = "sha256:93ad4b0855a664229559e45c8d23797ceac03183c7b6f5b4428152a6b06684a5", size = 1122436, upload-time = "2025-09-08T23:08:20.801Z" }, + { url = "https://files.pythonhosted.org/packages/dc/b6/94414759a69a26c3dd674570a81813c46a078767d931a6c70ad29fc585cb/pyzmq-27.1.0-cp313-cp313-android_24_x86_64.whl", hash = "sha256:fbb4f2400bfda24f12f009cba62ad5734148569ff4949b1b6ec3b519444342e6", size = 1156301, upload-time = "2025-09-08T23:08:22.47Z" }, + { url = "https://files.pythonhosted.org/packages/a5/ad/15906493fd40c316377fd8a8f6b1f93104f97a752667763c9b9c1b71d42d/pyzmq-27.1.0-cp313-cp313t-macosx_10_15_universal2.whl", hash = "sha256:e343d067f7b151cfe4eb3bb796a7752c9d369eed007b91231e817071d2c2fec7", size = 1341197, upload-time = "2025-09-08T23:08:24.286Z" }, + { url = "https://files.pythonhosted.org/packages/14/1d/d343f3ce13db53a54cb8946594e567410b2125394dafcc0268d8dda027e0/pyzmq-27.1.0-cp313-cp313t-manylinux2014_i686.manylinux_2_17_i686.whl", hash = "sha256:08363b2011dec81c354d694bdecaef4770e0ae96b9afea70b3f47b973655cc05", size = 897275, upload-time = "2025-09-08T23:08:26.063Z" }, + { url = "https://files.pythonhosted.org/packages/69/2d/d83dd6d7ca929a2fc67d2c3005415cdf322af7751d773524809f9e585129/pyzmq-27.1.0-cp313-cp313t-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:d54530c8c8b5b8ddb3318f481297441af102517602b569146185fa10b63f4fa9", size = 660469, upload-time = "2025-09-08T23:08:27.623Z" }, + { url = "https://files.pythonhosted.org/packages/3e/cd/9822a7af117f4bc0f1952dbe9ef8358eb50a24928efd5edf54210b850259/pyzmq-27.1.0-cp313-cp313t-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:6f3afa12c392f0a44a2414056d730eebc33ec0926aae92b5ad5cf26ebb6cc128", size = 847961, upload-time = "2025-09-08T23:08:29.672Z" }, + { url = "https://files.pythonhosted.org/packages/9a/12/f003e824a19ed73be15542f172fd0ec4ad0b60cf37436652c93b9df7c585/pyzmq-27.1.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:c65047adafe573ff023b3187bb93faa583151627bc9c51fc4fb2c561ed689d39", size = 1650282, upload-time = "2025-09-08T23:08:31.349Z" }, + { url = "https://files.pythonhosted.org/packages/d5/4a/e82d788ed58e9a23995cee70dbc20c9aded3d13a92d30d57ec2291f1e8a3/pyzmq-27.1.0-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:90e6e9441c946a8b0a667356f7078d96411391a3b8f80980315455574177ec97", size = 2024468, upload-time = "2025-09-08T23:08:33.543Z" }, + { url = "https://files.pythonhosted.org/packages/d9/94/2da0a60841f757481e402b34bf4c8bf57fa54a5466b965de791b1e6f747d/pyzmq-27.1.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:add071b2d25f84e8189aaf0882d39a285b42fa3853016ebab234a5e78c7a43db", size = 1885394, upload-time = "2025-09-08T23:08:35.51Z" }, + { url = "https://files.pythonhosted.org/packages/4f/6f/55c10e2e49ad52d080dc24e37adb215e5b0d64990b57598abc2e3f01725b/pyzmq-27.1.0-cp313-cp313t-win32.whl", hash = "sha256:7ccc0700cfdf7bd487bea8d850ec38f204478681ea02a582a8da8171b7f90a1c", size = 574964, upload-time = "2025-09-08T23:08:37.178Z" }, + { url = "https://files.pythonhosted.org/packages/87/4d/2534970ba63dd7c522d8ca80fb92777f362c0f321900667c615e2067cb29/pyzmq-27.1.0-cp313-cp313t-win_amd64.whl", hash = "sha256:8085a9fba668216b9b4323be338ee5437a235fe275b9d1610e422ccc279733e2", size = 641029, upload-time = "2025-09-08T23:08:40.595Z" }, + { url = "https://files.pythonhosted.org/packages/f6/fa/f8aea7a28b0641f31d40dea42d7ef003fded31e184ef47db696bc74cd610/pyzmq-27.1.0-cp313-cp313t-win_arm64.whl", hash = "sha256:6bb54ca21bcfe361e445256c15eedf083f153811c37be87e0514934d6913061e", size = 561541, upload-time = "2025-09-08T23:08:42.668Z" }, + { url = "https://files.pythonhosted.org/packages/87/45/19efbb3000956e82d0331bafca5d9ac19ea2857722fa2caacefb6042f39d/pyzmq-27.1.0-cp314-cp314t-macosx_10_15_universal2.whl", hash = "sha256:ce980af330231615756acd5154f29813d553ea555485ae712c491cd483df6b7a", size = 1341197, upload-time = "2025-09-08T23:08:44.973Z" }, + { url = "https://files.pythonhosted.org/packages/48/43/d72ccdbf0d73d1343936296665826350cb1e825f92f2db9db3e61c2162a2/pyzmq-27.1.0-cp314-cp314t-manylinux2014_i686.manylinux_2_17_i686.whl", hash = "sha256:1779be8c549e54a1c38f805e56d2a2e5c009d26de10921d7d51cfd1c8d4632ea", size = 897175, upload-time = "2025-09-08T23:08:46.601Z" }, + { url = "https://files.pythonhosted.org/packages/2f/2e/a483f73a10b65a9ef0161e817321d39a770b2acf8bcf3004a28d90d14a94/pyzmq-27.1.0-cp314-cp314t-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:7200bb0f03345515df50d99d3db206a0a6bee1955fbb8c453c76f5bf0e08fb96", size = 660427, upload-time = "2025-09-08T23:08:48.187Z" }, + { url = "https://files.pythonhosted.org/packages/f5/d2/5f36552c2d3e5685abe60dfa56f91169f7a2d99bbaf67c5271022ab40863/pyzmq-27.1.0-cp314-cp314t-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:01c0e07d558b06a60773744ea6251f769cd79a41a97d11b8bf4ab8f034b0424d", size = 847929, upload-time = "2025-09-08T23:08:49.76Z" }, + { url = "https://files.pythonhosted.org/packages/c4/2a/404b331f2b7bf3198e9945f75c4c521f0c6a3a23b51f7a4a401b94a13833/pyzmq-27.1.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:80d834abee71f65253c91540445d37c4c561e293ba6e741b992f20a105d69146", size = 1650193, upload-time = "2025-09-08T23:08:51.7Z" }, + { url = "https://files.pythonhosted.org/packages/1c/0b/f4107e33f62a5acf60e3ded67ed33d79b4ce18de432625ce2fc5093d6388/pyzmq-27.1.0-cp314-cp314t-musllinux_1_2_i686.whl", hash = "sha256:544b4e3b7198dde4a62b8ff6685e9802a9a1ebf47e77478a5eb88eca2a82f2fd", size = 2024388, upload-time = "2025-09-08T23:08:53.393Z" }, + { url = "https://files.pythonhosted.org/packages/0d/01/add31fe76512642fd6e40e3a3bd21f4b47e242c8ba33efb6809e37076d9b/pyzmq-27.1.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:cedc4c68178e59a4046f97eca31b148ddcf51e88677de1ef4e78cf06c5376c9a", size = 1885316, upload-time = "2025-09-08T23:08:55.702Z" }, + { url = "https://files.pythonhosted.org/packages/c4/59/a5f38970f9bf07cee96128de79590bb354917914a9be11272cfc7ff26af0/pyzmq-27.1.0-cp314-cp314t-win32.whl", hash = "sha256:1f0b2a577fd770aa6f053211a55d1c47901f4d537389a034c690291485e5fe92", size = 587472, upload-time = "2025-09-08T23:08:58.18Z" }, + { url = "https://files.pythonhosted.org/packages/70/d8/78b1bad170f93fcf5e3536e70e8fadac55030002275c9a29e8f5719185de/pyzmq-27.1.0-cp314-cp314t-win_amd64.whl", hash = "sha256:19c9468ae0437f8074af379e986c5d3d7d7bfe033506af442e8c879732bedbe0", size = 661401, upload-time = "2025-09-08T23:08:59.802Z" }, + { url = "https://files.pythonhosted.org/packages/81/d6/4bfbb40c9a0b42fc53c7cf442f6385db70b40f74a783130c5d0a5aa62228/pyzmq-27.1.0-cp314-cp314t-win_arm64.whl", hash = "sha256:dc5dbf68a7857b59473f7df42650c621d7e8923fb03fa74a526890f4d33cc4d7", size = 575170, upload-time = "2025-09-08T23:09:01.418Z" }, + { url = "https://files.pythonhosted.org/packages/38/f8/946ecde123eaffe933ecf287186495d5f22a8bf444bcb774d9c83dcb2fa5/pyzmq-27.1.0-cp38-cp38-macosx_10_15_universal2.whl", hash = "sha256:18339186c0ed0ce5835f2656cdfb32203125917711af64da64dbaa3d949e5a1b", size = 1332188, upload-time = "2025-09-08T23:09:03.639Z" }, + { url = "https://files.pythonhosted.org/packages/56/08/5960fd162bf1e0e22f251c2f7744101241bc419fbc52abab4108260eb3e0/pyzmq-27.1.0-cp38-cp38-manylinux2014_i686.manylinux_2_17_i686.whl", hash = "sha256:753d56fba8f70962cd8295fb3edb40b9b16deaa882dd2b5a3a2039f9ff7625aa", size = 907319, upload-time = "2025-09-08T23:09:06.079Z" }, + { url = "https://files.pythonhosted.org/packages/7f/62/2d8712aafbd7fcf0e303d67c1d923f64a41aa872f1348e3d5dcec147c909/pyzmq-27.1.0-cp38-cp38-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:b721c05d932e5ad9ff9344f708c96b9e1a485418c6618d765fca95d4daacfbef", size = 864213, upload-time = "2025-09-08T23:09:07.985Z" }, + { url = "https://files.pythonhosted.org/packages/e1/04/e9a1550d2dcb29cd662d88c89e9fe975393dd577e2c8b2c528d0a0bacfac/pyzmq-27.1.0-cp38-cp38-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:7be883ff3d722e6085ee3f4afc057a50f7f2e0c72d289fd54df5706b4e3d3a50", size = 668520, upload-time = "2025-09-08T23:09:10.317Z" }, + { url = "https://files.pythonhosted.org/packages/48/ad/1638518b7554686d17b5fdd0c0381c13656fe4899dc13af0ba10850d56f0/pyzmq-27.1.0-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:b2e592db3a93128daf567de9650a2f3859017b3f7a66bc4ed6e4779d6034976f", size = 1657582, upload-time = "2025-09-08T23:09:12.256Z" }, + { url = "https://files.pythonhosted.org/packages/cc/b7/6cb8123ee217c1efa8e917feabe86425185a7b55504af32bffa057dcd91d/pyzmq-27.1.0-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:ad68808a61cbfbbae7ba26d6233f2a4aa3b221de379ce9ee468aa7a83b9c36b0", size = 2035054, upload-time = "2025-09-08T23:09:14.175Z" }, + { url = "https://files.pythonhosted.org/packages/cb/95/8d6ec87b43e1d8608be461165180fec4744da9edceea4ce48c7bd8c60402/pyzmq-27.1.0-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:e2687c2d230e8d8584fbea433c24382edfeda0c60627aca3446aa5e58d5d1831", size = 1894186, upload-time = "2025-09-08T23:09:15.797Z" }, + { url = "https://files.pythonhosted.org/packages/a7/2a/7806479dd1f1b964d0aa07f1d961fcaa8673ed543c911847fc45e91f103a/pyzmq-27.1.0-cp38-cp38-win32.whl", hash = "sha256:a1aa0ee920fb3825d6c825ae3f6c508403b905b698b6460408ebd5bb04bbb312", size = 567508, upload-time = "2025-09-08T23:09:17.514Z" }, + { url = "https://files.pythonhosted.org/packages/9f/24/70e83d3ff64ef7e3d6666bd30a241be695dad0ef30d5519bf9c5ff174786/pyzmq-27.1.0-cp38-cp38-win_amd64.whl", hash = "sha256:df7cd397ece96cf20a76fae705d40efbab217d217897a5053267cd88a700c266", size = 632740, upload-time = "2025-09-08T23:09:19.352Z" }, + { url = "https://files.pythonhosted.org/packages/ac/4e/782eb6df91b6a9d9afa96c2dcfc5cac62562a68eb62a02210101f886014d/pyzmq-27.1.0-cp39-cp39-macosx_10_15_universal2.whl", hash = "sha256:96c71c32fff75957db6ae33cd961439f386505c6e6b377370af9b24a1ef9eafb", size = 1330426, upload-time = "2025-09-08T23:09:21.03Z" }, + { url = "https://files.pythonhosted.org/packages/8d/ca/2b8693d06b1db4e0c084871e4c9d7842b561d0a6ff9d780640f5e3e9eb55/pyzmq-27.1.0-cp39-cp39-manylinux2014_i686.manylinux_2_17_i686.whl", hash = "sha256:49d3980544447f6bd2968b6ac913ab963a49dcaa2d4a2990041f16057b04c429", size = 906559, upload-time = "2025-09-08T23:09:22.983Z" }, + { url = "https://files.pythonhosted.org/packages/6a/b3/b99b39e2cfdcebd512959780e4d299447fd7f46010b1d88d63324e2481ec/pyzmq-27.1.0-cp39-cp39-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:849ca054d81aa1c175c49484afaaa5db0622092b5eccb2055f9f3bb8f703782d", size = 863816, upload-time = "2025-09-08T23:09:24.556Z" }, + { url = "https://files.pythonhosted.org/packages/61/b2/018fa8e8eefb34a625b1a45e2effcbc9885645b22cdd0a68283f758351e7/pyzmq-27.1.0-cp39-cp39-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:3970778e74cb7f85934d2b926b9900e92bfe597e62267d7499acc39c9c28e345", size = 666735, upload-time = "2025-09-08T23:09:26.297Z" }, + { url = "https://files.pythonhosted.org/packages/01/05/8ae778f7cd7c94030731ae2305e6a38f3a333b6825f56c0c03f2134ccf1b/pyzmq-27.1.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:da96ecdcf7d3919c3be2de91a8c513c186f6762aa6cf7c01087ed74fad7f0968", size = 1655425, upload-time = "2025-09-08T23:09:28.172Z" }, + { url = "https://files.pythonhosted.org/packages/ad/ad/d69478a97a3f3142f9dbbbd9daa4fcf42541913a85567c36d4cfc19b2218/pyzmq-27.1.0-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:9541c444cfe1b1c0156c5c86ece2bb926c7079a18e7b47b0b1b3b1b875e5d098", size = 2033729, upload-time = "2025-09-08T23:09:30.097Z" }, + { url = "https://files.pythonhosted.org/packages/9a/6d/e3c6ad05bc1cddd25094e66cc15ae8924e15c67e231e93ed2955c401007e/pyzmq-27.1.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:e30a74a39b93e2e1591b58eb1acef4902be27c957a8720b0e368f579b82dc22f", size = 1891803, upload-time = "2025-09-08T23:09:31.875Z" }, + { url = "https://files.pythonhosted.org/packages/7f/a7/97e8be0daaca157511563160b67a13d4fe76b195e3fa6873cb554ad46be3/pyzmq-27.1.0-cp39-cp39-win32.whl", hash = "sha256:b1267823d72d1e40701dcba7edc45fd17f71be1285557b7fe668887150a14b78", size = 567627, upload-time = "2025-09-08T23:09:33.98Z" }, + { url = "https://files.pythonhosted.org/packages/5c/91/70bbf3a7c5b04c904261ef5ba224d8a76315f6c23454251bf5f55573a8a1/pyzmq-27.1.0-cp39-cp39-win_amd64.whl", hash = "sha256:0c996ded912812a2fcd7ab6574f4ad3edc27cb6510349431e4930d4196ade7db", size = 632315, upload-time = "2025-09-08T23:09:36.097Z" }, + { url = "https://files.pythonhosted.org/packages/cc/b5/a4173a83c7fd37f6bdb5a800ea338bc25603284e9ef8681377cec006ede4/pyzmq-27.1.0-cp39-cp39-win_arm64.whl", hash = "sha256:346e9ba4198177a07e7706050f35d733e08c1c1f8ceacd5eb6389d653579ffbc", size = 559833, upload-time = "2025-09-08T23:09:38.183Z" }, + { url = "https://files.pythonhosted.org/packages/f3/81/a65e71c1552f74dec9dff91d95bafb6e0d33338a8dfefbc88aa562a20c92/pyzmq-27.1.0-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:c17e03cbc9312bee223864f1a2b13a99522e0dc9f7c5df0177cd45210ac286e6", size = 836266, upload-time = "2025-09-08T23:09:40.048Z" }, + { url = "https://files.pythonhosted.org/packages/58/ed/0202ca350f4f2b69faa95c6d931e3c05c3a397c184cacb84cb4f8f42f287/pyzmq-27.1.0-pp310-pypy310_pp73-manylinux2014_i686.manylinux_2_17_i686.whl", hash = "sha256:f328d01128373cb6763823b2b4e7f73bdf767834268c565151eacb3b7a392f90", size = 800206, upload-time = "2025-09-08T23:09:41.902Z" }, + { url = "https://files.pythonhosted.org/packages/47/42/1ff831fa87fe8f0a840ddb399054ca0009605d820e2b44ea43114f5459f4/pyzmq-27.1.0-pp310-pypy310_pp73-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:9c1790386614232e1b3a40a958454bdd42c6d1811837b15ddbb052a032a43f62", size = 567747, upload-time = "2025-09-08T23:09:43.741Z" }, + { url = "https://files.pythonhosted.org/packages/d1/db/5c4d6807434751e3f21231bee98109aa57b9b9b55e058e450d0aef59b70f/pyzmq-27.1.0-pp310-pypy310_pp73-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:448f9cb54eb0cee4732b46584f2710c8bc178b0e5371d9e4fc8125201e413a74", size = 747371, upload-time = "2025-09-08T23:09:45.575Z" }, + { url = "https://files.pythonhosted.org/packages/26/af/78ce193dbf03567eb8c0dc30e3df2b9e56f12a670bf7eb20f9fb532c7e8a/pyzmq-27.1.0-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:05b12f2d32112bf8c95ef2e74ec4f1d4beb01f8b5e703b38537f8849f92cb9ba", size = 544862, upload-time = "2025-09-08T23:09:47.448Z" }, + { url = "https://files.pythonhosted.org/packages/4c/c6/c4dcdecdbaa70969ee1fdced6d7b8f60cfabe64d25361f27ac4665a70620/pyzmq-27.1.0-pp311-pypy311_pp73-macosx_10_15_x86_64.whl", hash = "sha256:18770c8d3563715387139060d37859c02ce40718d1faf299abddcdcc6a649066", size = 836265, upload-time = "2025-09-08T23:09:49.376Z" }, + { url = "https://files.pythonhosted.org/packages/3e/79/f38c92eeaeb03a2ccc2ba9866f0439593bb08c5e3b714ac1d553e5c96e25/pyzmq-27.1.0-pp311-pypy311_pp73-manylinux2014_i686.manylinux_2_17_i686.whl", hash = "sha256:ac25465d42f92e990f8d8b0546b01c391ad431c3bf447683fdc40565941d0604", size = 800208, upload-time = "2025-09-08T23:09:51.073Z" }, + { url = "https://files.pythonhosted.org/packages/49/0e/3f0d0d335c6b3abb9b7b723776d0b21fa7f3a6c819a0db6097059aada160/pyzmq-27.1.0-pp311-pypy311_pp73-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:53b40f8ae006f2734ee7608d59ed661419f087521edbfc2149c3932e9c14808c", size = 567747, upload-time = "2025-09-08T23:09:52.698Z" }, + { url = "https://files.pythonhosted.org/packages/a1/cf/f2b3784d536250ffd4be70e049f3b60981235d70c6e8ce7e3ef21e1adb25/pyzmq-27.1.0-pp311-pypy311_pp73-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:f605d884e7c8be8fe1aa94e0a783bf3f591b84c24e4bc4f3e7564c82ac25e271", size = 747371, upload-time = "2025-09-08T23:09:54.563Z" }, + { url = "https://files.pythonhosted.org/packages/01/1b/5dbe84eefc86f48473947e2f41711aded97eecef1231f4558f1f02713c12/pyzmq-27.1.0-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:c9f7f6e13dff2e44a6afeaf2cf54cee5929ad64afaf4d40b50f93c58fc687355", size = 544862, upload-time = "2025-09-08T23:09:56.509Z" }, + { url = "https://files.pythonhosted.org/packages/eb/d8/2cf36ee6d037b52640997bde488d046db55bdea05e34229cf9cd3154fd7d/pyzmq-27.1.0-pp38-pypy38_pp73-macosx_10_15_x86_64.whl", hash = "sha256:50081a4e98472ba9f5a02850014b4c9b629da6710f8f14f3b15897c666a28f1b", size = 836250, upload-time = "2025-09-08T23:09:58.313Z" }, + { url = "https://files.pythonhosted.org/packages/e5/40/5ff9acff898558fb54731d4b897d5bf16b3725e0c1778166ac9a234b5297/pyzmq-27.1.0-pp38-pypy38_pp73-manylinux2014_i686.manylinux_2_17_i686.whl", hash = "sha256:510869f9df36ab97f89f4cff9d002a89ac554c7ac9cadd87d444aa4cf66abd27", size = 800201, upload-time = "2025-09-08T23:10:00.131Z" }, + { url = "https://files.pythonhosted.org/packages/2f/58/f941950f64c5e7919c64d36e52991ade7ac8ea4805e9d2cdba47337d9edc/pyzmq-27.1.0-pp38-pypy38_pp73-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:1f8426a01b1c4098a750973c37131cf585f61c7911d735f729935a0c701b68d3", size = 758755, upload-time = "2025-09-08T23:10:01.896Z" }, + { url = "https://files.pythonhosted.org/packages/7b/26/ddd3502658bf85d41ab6d75dcab78a7af5bb32fb5f7ac38bd7cf1bce321d/pyzmq-27.1.0-pp38-pypy38_pp73-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:726b6a502f2e34c6d2ada5e702929586d3ac948a4dbbb7fed9854ec8c0466027", size = 567742, upload-time = "2025-09-08T23:10:03.732Z" }, + { url = "https://files.pythonhosted.org/packages/36/ad/50515db14fb3c19d48a2a05716c7f4d658da51ea2b145c67f003b3f443d2/pyzmq-27.1.0-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:bd67e7c8f4654bef471c0b1ca6614af0b5202a790723a58b79d9584dc8022a78", size = 544859, upload-time = "2025-09-08T23:10:05.491Z" }, + { url = "https://files.pythonhosted.org/packages/57/f4/c2e978cf6b833708bad7d6396c3a20c19750585a1775af3ff13c435e1912/pyzmq-27.1.0-pp39-pypy39_pp73-macosx_10_15_x86_64.whl", hash = "sha256:722ea791aa233ac0a819fc2c475e1292c76930b31f1d828cb61073e2fe5e208f", size = 836257, upload-time = "2025-09-08T23:10:07.635Z" }, + { url = "https://files.pythonhosted.org/packages/5f/5f/4e10c7f57a4c92ab0fbb2396297aa8d618e6f5b9b8f8e9756d56f3e6fc52/pyzmq-27.1.0-pp39-pypy39_pp73-manylinux2014_i686.manylinux_2_17_i686.whl", hash = "sha256:01f9437501886d3a1dd4b02ef59fb8cc384fa718ce066d52f175ee49dd5b7ed8", size = 800203, upload-time = "2025-09-08T23:10:09.436Z" }, + { url = "https://files.pythonhosted.org/packages/19/72/a74a007cd636f903448c6ab66628104b1fc5f2ba018733d5eabb94a0a6fb/pyzmq-27.1.0-pp39-pypy39_pp73-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:4a19387a3dddcc762bfd2f570d14e2395b2c9701329b266f83dd87a2b3cbd381", size = 758756, upload-time = "2025-09-08T23:10:11.733Z" }, + { url = "https://files.pythonhosted.org/packages/a9/d4/30c25b91f2b4786026372f5ef454134d7f576fcf4ac58539ad7dd5de4762/pyzmq-27.1.0-pp39-pypy39_pp73-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:4c618fbcd069e3a29dcd221739cacde52edcc681f041907867e0f5cc7e85f172", size = 567742, upload-time = "2025-09-08T23:10:14.732Z" }, + { url = "https://files.pythonhosted.org/packages/92/aa/ee86edad943438cd0316964020c4b6d09854414f9f945f8e289ea6fcc019/pyzmq-27.1.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:ff8d114d14ac671d88c89b9224c63d6c4e5a613fe8acd5594ce53d752a3aafe9", size = 544857, upload-time = "2025-09-08T23:10:16.431Z" }, +] + +[[package]] +name = "readme-renderer" +version = "43.0" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version < '3.9'", +] +dependencies = [ + { name = "docutils", version = "0.20.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.9'" }, + { name = "nh3", marker = "python_full_version < '3.9'" }, + { name = "pygments", marker = "python_full_version < '3.9'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/fe/b5/536c775084d239df6345dccf9b043419c7e3308bc31be4c7882196abc62e/readme_renderer-43.0.tar.gz", hash = "sha256:1818dd28140813509eeed8d62687f7cd4f7bad90d4db586001c5dc09d4fde311", size = 31768, upload-time = "2024-02-26T16:10:59.415Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/45/be/3ea20dc38b9db08387cf97997a85a7d51527ea2057d71118feb0aa8afa55/readme_renderer-43.0-py3-none-any.whl", hash = "sha256:19db308d86ecd60e5affa3b2a98f017af384678c63c88e5d4556a380e674f3f9", size = 13301, upload-time = "2024-02-26T16:10:57.945Z" }, +] + +[[package]] +name = "readme-renderer" +version = "44.0" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version >= '3.14'", + "python_full_version >= '3.11' and python_full_version < '3.14'", + "python_full_version == '3.10.*'", + "python_full_version == '3.9.*'", +] +dependencies = [ + { name = "docutils", version = "0.21.2", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.9'" }, + { name = "nh3", marker = "python_full_version >= '3.9'" }, + { name = "pygments", marker = "python_full_version >= '3.9'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/5a/a9/104ec9234c8448c4379768221ea6df01260cd6c2ce13182d4eac531c8342/readme_renderer-44.0.tar.gz", hash = "sha256:8712034eabbfa6805cacf1402b4eeb2a73028f72d1166d6f5cb7f9c047c5d1e1", size = 32056, upload-time = "2024-07-08T15:00:57.805Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/e1/67/921ec3024056483db83953ae8e48079ad62b92db7880013ca77632921dd0/readme_renderer-44.0-py3-none-any.whl", hash = "sha256:2fbca89b81a08526aadf1357a8c2ae889ec05fb03f5da67f9769c9a592166151", size = 13310, upload-time = "2024-07-08T15:00:56.577Z" }, +] + +[[package]] +name = "readthedocs-sphinx-search" +version = "0.3.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/8f/96/0c51439e3dbc634cf5328ffb173ff759b7fc9abf3276e78bf71d9fc0aa51/readthedocs-sphinx-search-0.3.2.tar.gz", hash = "sha256:277773bfa28566a86694c08e568d5a648cd80f22826545555a764d6d20c365fb", size = 21949, upload-time = "2024-01-15T16:46:22.565Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/04/3c/41bc9d7d4d936a73e380423f23996bee1691e17598d8a03c062be6aac640/readthedocs_sphinx_search-0.3.2-py3-none-any.whl", hash = "sha256:58716fd21f01581e6e67bf3bc02e79c77e10dc58b5f8e4c7cc1977e013eda173", size = 21379, upload-time = "2024-01-15T16:46:20.552Z" }, +] + +[[package]] +name = "referencing" +version = "0.35.1" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version < '3.9'", +] +dependencies = [ + { name = "attrs", version = "25.3.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.9'" }, + { name = "rpds-py", version = "0.20.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.9'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/99/5b/73ca1f8e72fff6fa52119dbd185f73a907b1989428917b24cff660129b6d/referencing-0.35.1.tar.gz", hash = "sha256:25b42124a6c8b632a425174f24087783efb348a6f1e0008e63cd4466fedf703c", size = 62991, upload-time = "2024-05-01T20:26:04.574Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/b7/59/2056f61236782a2c86b33906c025d4f4a0b17be0161b63b70fd9e8775d36/referencing-0.35.1-py3-none-any.whl", hash = "sha256:eda6d3234d62814d1c64e305c1331c9a3a6132da475ab6382eaa997b21ee75de", size = 26684, upload-time = "2024-05-01T20:26:02.078Z" }, +] + +[[package]] +name = "referencing" +version = "0.36.2" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version == '3.9.*'", +] +dependencies = [ + { name = "attrs", version = "25.4.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version == '3.9.*'" }, + { name = "rpds-py", version = "0.27.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version == '3.9.*'" }, + { name = "typing-extensions", version = "4.15.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version == '3.9.*'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/2f/db/98b5c277be99dd18bfd91dd04e1b759cad18d1a338188c936e92f921c7e2/referencing-0.36.2.tar.gz", hash = "sha256:df2e89862cd09deabbdba16944cc3f10feb6b3e6f18e902f7cc25609a34775aa", size = 74744, upload-time = "2025-01-25T08:48:16.138Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/c1/b1/3baf80dc6d2b7bc27a95a67752d0208e410351e3feb4eb78de5f77454d8d/referencing-0.36.2-py3-none-any.whl", hash = "sha256:e8699adbbf8b5c7de96d8ffa0eb5c158b3beafce084968e2ea8bb08c6794dcd0", size = 26775, upload-time = "2025-01-25T08:48:14.241Z" }, +] + +[[package]] +name = "referencing" +version = "0.37.0" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version >= '3.14'", + "python_full_version >= '3.11' and python_full_version < '3.14'", + "python_full_version == '3.10.*'", +] +dependencies = [ + { name = "attrs", version = "25.4.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.10'" }, + { name = "rpds-py", version = "0.30.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.10'" }, + { name = "typing-extensions", version = "4.15.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.10' and python_full_version < '3.13'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/22/f5/df4e9027acead3ecc63e50fe1e36aca1523e1719559c499951bb4b53188f/referencing-0.37.0.tar.gz", hash = "sha256:44aefc3142c5b842538163acb373e24cce6632bd54bdb01b21ad5863489f50d8", size = 78036, upload-time = "2025-10-13T15:30:48.871Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/2c/58/ca301544e1fa93ed4f80d724bf5b194f6e4b945841c5bfd555878eea9fcb/referencing-0.37.0-py3-none-any.whl", hash = "sha256:381329a9f99628c9069361716891d34ad94af76e461dcb0335825aecc7692231", size = 26766, upload-time = "2025-10-13T15:30:47.625Z" }, +] + +[[package]] +name = "requests" +version = "2.32.4" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version < '3.9'", +] +dependencies = [ + { name = "certifi", marker = "python_full_version < '3.9'" }, + { name = "charset-normalizer", marker = "python_full_version < '3.9'" }, + { name = "idna", marker = "python_full_version < '3.9'" }, + { name = "urllib3", version = "2.2.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.9'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/e1/0a/929373653770d8a0d7ea76c37de6e41f11eb07559b103b1c02cafb3f7cf8/requests-2.32.4.tar.gz", hash = "sha256:27d0316682c8a29834d3264820024b62a36942083d52caf2f14c0591336d3422", size = 135258, upload-time = "2025-06-09T16:43:07.34Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/7c/e4/56027c4a6b4ae70ca9de302488c5ca95ad4a39e190093d6c1a8ace08341b/requests-2.32.4-py3-none-any.whl", hash = "sha256:27babd3cda2a6d50b30443204ee89830707d396671944c998b5975b031ac2b2c", size = 64847, upload-time = "2025-06-09T16:43:05.728Z" }, +] + +[[package]] +name = "requests" +version = "2.32.5" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version >= '3.14'", + "python_full_version >= '3.11' and python_full_version < '3.14'", + "python_full_version == '3.10.*'", + "python_full_version == '3.9.*'", +] +dependencies = [ + { name = "certifi", marker = "python_full_version >= '3.9'" }, + { name = "charset-normalizer", marker = "python_full_version >= '3.9'" }, + { name = "idna", marker = "python_full_version >= '3.9'" }, + { name = "urllib3", version = "2.5.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.9'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/c9/74/b3ff8e6c8446842c3f5c837e9c3dfcfe2018ea6ecef224c710c85ef728f4/requests-2.32.5.tar.gz", hash = "sha256:dbba0bac56e100853db0ea71b82b4dfd5fe2bf6d3754a8893c3af500cec7d7cf", size = 134517, upload-time = "2025-08-18T20:46:02.573Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/1e/db/4254e3eabe8020b458f1a747140d32277ec7a271daf1d235b70dc0b4e6e3/requests-2.32.5-py3-none-any.whl", hash = "sha256:2462f94637a34fd532264295e186976db0f5d453d1cdd31473c85a6a161affb6", size = 64738, upload-time = "2025-08-18T20:46:00.542Z" }, +] + +[[package]] +name = "requests-toolbelt" +version = "1.0.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "requests", version = "2.32.4", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.9'" }, + { name = "requests", version = "2.32.5", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.9'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/f3/61/d7545dafb7ac2230c70d38d31cbfe4cc64f7144dc41f6e4e4b78ecd9f5bb/requests-toolbelt-1.0.0.tar.gz", hash = "sha256:7681a0a3d047012b5bdc0ee37d7f8f07ebe76ab08caeccfc3921ce23c88d5bc6", size = 206888, upload-time = "2023-05-01T04:11:33.229Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/3f/51/d4db610ef29373b879047326cbf6fa98b6c1969d6f6dc423279de2b1be2c/requests_toolbelt-1.0.0-py2.py3-none-any.whl", hash = "sha256:cccfdd665f0a24fcf4726e690f65639d272bb0637b9b92dfd91a5568ccf6bd06", size = 54481, upload-time = "2023-05-01T04:11:28.427Z" }, +] + +[[package]] +name = "rfc3339-validator" +version = "0.1.4" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "six" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/28/ea/a9387748e2d111c3c2b275ba970b735e04e15cdb1eb30693b6b5708c4dbd/rfc3339_validator-0.1.4.tar.gz", hash = "sha256:138a2abdf93304ad60530167e51d2dfb9549521a836871b88d7f4695d0022f6b", size = 5513, upload-time = "2021-05-12T16:37:54.178Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/7b/44/4e421b96b67b2daff264473f7465db72fbdf36a07e05494f50300cc7b0c6/rfc3339_validator-0.1.4-py2.py3-none-any.whl", hash = "sha256:24f6ec1eda14ef823da9e36ec7113124b39c04d50a4d3d3a3c2859577e7791fa", size = 3490, upload-time = "2021-05-12T16:37:52.536Z" }, +] + +[[package]] +name = "rfc3986" +version = "2.0.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/85/40/1520d68bfa07ab5a6f065a186815fb6610c86fe957bc065754e47f7b0840/rfc3986-2.0.0.tar.gz", hash = "sha256:97aacf9dbd4bfd829baad6e6309fa6573aaf1be3f6fa735c8ab05e46cecb261c", size = 49026, upload-time = "2022-01-10T00:52:30.832Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ff/9a/9afaade874b2fa6c752c36f1548f718b5b83af81ed9b76628329dab81c1b/rfc3986-2.0.0-py2.py3-none-any.whl", hash = "sha256:50b1502b60e289cb37883f3dfd34532b8873c7de9f49bb546641ce9cbd256ebd", size = 31326, upload-time = "2022-01-10T00:52:29.594Z" }, +] + +[[package]] +name = "rfc3986-validator" +version = "0.1.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/da/88/f270de456dd7d11dcc808abfa291ecdd3f45ff44e3b549ffa01b126464d0/rfc3986_validator-0.1.1.tar.gz", hash = "sha256:3d44bde7921b3b9ec3ae4e3adca370438eccebc676456449b145d533b240d055", size = 6760, upload-time = "2019-10-28T16:00:19.144Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/9e/51/17023c0f8f1869d8806b979a2bffa3f861f26a3f1a66b094288323fba52f/rfc3986_validator-0.1.1-py2.py3-none-any.whl", hash = "sha256:2f235c432ef459970b4306369336b9d5dbdda31b510ca1e327636e01f528bfa9", size = 4242, upload-time = "2019-10-28T16:00:13.976Z" }, +] + +[[package]] +name = "rfc3987-syntax" +version = "1.1.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "lark", marker = "python_full_version >= '3.9'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/2c/06/37c1a5557acf449e8e406a830a05bf885ac47d33270aec454ef78675008d/rfc3987_syntax-1.1.0.tar.gz", hash = "sha256:717a62cbf33cffdd16dfa3a497d81ce48a660ea691b1ddd7be710c22f00b4a0d", size = 14239, upload-time = "2025-07-18T01:05:05.015Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/7e/71/44ce230e1b7fadd372515a97e32a83011f906ddded8d03e3c6aafbdedbb7/rfc3987_syntax-1.1.0-py3-none-any.whl", hash = "sha256:6c3d97604e4c5ce9f714898e05401a0445a641cfa276432b0a648c80856f6a3f", size = 8046, upload-time = "2025-07-18T01:05:03.843Z" }, +] + +[[package]] +name = "rich" +version = "14.2.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "markdown-it-py" }, + { name = "pygments" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/fb/d2/8920e102050a0de7bfabeb4c4614a49248cf8d5d7a8d01885fbb24dc767a/rich-14.2.0.tar.gz", hash = "sha256:73ff50c7c0c1c77c8243079283f4edb376f0f6442433aecb8ce7e6d0b92d1fe4", size = 219990, upload-time = "2025-10-09T14:16:53.064Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/25/7a/b0178788f8dc6cafce37a212c99565fa1fe7872c70c6c9c1e1a372d9d88f/rich-14.2.0-py3-none-any.whl", hash = "sha256:76bc51fe2e57d2b1be1f96c524b890b816e334ab4c1e45888799bfaab0021edd", size = 243393, upload-time = "2025-10-09T14:16:51.245Z" }, +] + +[[package]] +name = "roman-numerals-py" +version = "3.1.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/30/76/48fd56d17c5bdbdf65609abbc67288728a98ed4c02919428d4f52d23b24b/roman_numerals_py-3.1.0.tar.gz", hash = "sha256:be4bf804f083a4ce001b5eb7e3c0862479d10f94c936f6c4e5f250aa5ff5bd2d", size = 9017, upload-time = "2025-02-22T07:34:54.333Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/53/97/d2cbbaa10c9b826af0e10fdf836e1bf344d9f0abb873ebc34d1f49642d3f/roman_numerals_py-3.1.0-py3-none-any.whl", hash = "sha256:9da2ad2fb670bcf24e81070ceb3be72f6c11c440d73bd579fbeca1e9f330954c", size = 7742, upload-time = "2025-02-22T07:34:52.422Z" }, +] + +[[package]] +name = "rpds-py" +version = "0.20.1" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version < '3.9'", +] +sdist = { url = "https://files.pythonhosted.org/packages/25/cb/8e919951f55d109d658f81c9b49d0cc3b48637c50792c5d2e77032b8c5da/rpds_py-0.20.1.tar.gz", hash = "sha256:e1791c4aabd117653530dccd24108fa03cc6baf21f58b950d0a73c3b3b29a350", size = 25931, upload-time = "2024-10-31T14:30:20.522Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ae/0e/d7e7e9280988a7bc56fd326042baca27f4f55fad27dc8aa64e5e0e894e5d/rpds_py-0.20.1-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:a649dfd735fff086e8a9d0503a9f0c7d01b7912a333c7ae77e1515c08c146dad", size = 327335, upload-time = "2024-10-31T14:26:20.076Z" }, + { url = "https://files.pythonhosted.org/packages/4c/72/027185f213d53ae66765c575229829b202fbacf3d55fe2bd9ff4e29bb157/rpds_py-0.20.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:f16bc1334853e91ddaaa1217045dd7be166170beec337576818461268a3de67f", size = 318250, upload-time = "2024-10-31T14:26:22.17Z" }, + { url = "https://files.pythonhosted.org/packages/2b/e7/b4eb3e6ff541c83d3b46f45f855547e412ab60c45bef64520fafb00b9b42/rpds_py-0.20.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:14511a539afee6f9ab492b543060c7491c99924314977a55c98bfa2ee29ce78c", size = 361206, upload-time = "2024-10-31T14:26:24.746Z" }, + { url = "https://files.pythonhosted.org/packages/e7/80/cb9a4b4cad31bcaa37f38dae7a8be861f767eb2ca4f07a146b5ffcfbee09/rpds_py-0.20.1-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:3ccb8ac2d3c71cda472b75af42818981bdacf48d2e21c36331b50b4f16930163", size = 369921, upload-time = "2024-10-31T14:26:28.137Z" }, + { url = "https://files.pythonhosted.org/packages/95/1b/463b11e7039e18f9e778568dbf7338c29bbc1f8996381115201c668eb8c8/rpds_py-0.20.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c142b88039b92e7e0cb2552e8967077e3179b22359e945574f5e2764c3953dcf", size = 403673, upload-time = "2024-10-31T14:26:31.42Z" }, + { url = "https://files.pythonhosted.org/packages/86/98/1ef4028e9d5b76470bf7f8f2459be07ac5c9621270a2a5e093f8d8a8cc2c/rpds_py-0.20.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f19169781dddae7478a32301b499b2858bc52fc45a112955e798ee307e294977", size = 430267, upload-time = "2024-10-31T14:26:33.148Z" }, + { url = "https://files.pythonhosted.org/packages/25/8e/41d7e3e6d3a4a6c94375020477705a3fbb6515717901ab8f94821cf0a0d9/rpds_py-0.20.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:13c56de6518e14b9bf6edde23c4c39dac5b48dcf04160ea7bce8fca8397cdf86", size = 360569, upload-time = "2024-10-31T14:26:35.151Z" }, + { url = "https://files.pythonhosted.org/packages/4f/6a/8839340464d4e1bbfaf0482e9d9165a2309c2c17427e4dcb72ce3e5cc5d6/rpds_py-0.20.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:925d176a549f4832c6f69fa6026071294ab5910e82a0fe6c6228fce17b0706bd", size = 382584, upload-time = "2024-10-31T14:26:37.444Z" }, + { url = "https://files.pythonhosted.org/packages/64/96/7a7f938d3796a6a3ec08ed0e8a5ecd436fbd516a3684ab1fa22d46d6f6cc/rpds_py-0.20.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:78f0b6877bfce7a3d1ff150391354a410c55d3cdce386f862926a4958ad5ab7e", size = 546560, upload-time = "2024-10-31T14:26:40.679Z" }, + { url = "https://files.pythonhosted.org/packages/15/c7/19fb4f1247a3c90a99eca62909bf76ee988f9b663e47878a673d9854ec5c/rpds_py-0.20.1-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:3dd645e2b0dcb0fd05bf58e2e54c13875847687d0b71941ad2e757e5d89d4356", size = 549359, upload-time = "2024-10-31T14:26:42.71Z" }, + { url = "https://files.pythonhosted.org/packages/d2/4c/445eb597a39a883368ea2f341dd6e48a9d9681b12ebf32f38a827b30529b/rpds_py-0.20.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:4f676e21db2f8c72ff0936f895271e7a700aa1f8d31b40e4e43442ba94973899", size = 527567, upload-time = "2024-10-31T14:26:45.402Z" }, + { url = "https://files.pythonhosted.org/packages/4f/71/4c44643bffbcb37311fc7fe221bcf139c8d660bc78f746dd3a05741372c8/rpds_py-0.20.1-cp310-none-win32.whl", hash = "sha256:648386ddd1e19b4a6abab69139b002bc49ebf065b596119f8f37c38e9ecee8ff", size = 200412, upload-time = "2024-10-31T14:26:49.634Z" }, + { url = "https://files.pythonhosted.org/packages/f4/33/9d0529d74099e090ec9ab15eb0a049c56cca599eaaca71bfedbdbca656a9/rpds_py-0.20.1-cp310-none-win_amd64.whl", hash = "sha256:d9ecb51120de61e4604650666d1f2b68444d46ae18fd492245a08f53ad2b7711", size = 218563, upload-time = "2024-10-31T14:26:51.639Z" }, + { url = "https://files.pythonhosted.org/packages/a0/2e/a6ded84019a05b8f23e0fe6a632f62ae438a8c5e5932d3dfc90c73418414/rpds_py-0.20.1-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:762703bdd2b30983c1d9e62b4c88664df4a8a4d5ec0e9253b0231171f18f6d75", size = 327194, upload-time = "2024-10-31T14:26:54.135Z" }, + { url = "https://files.pythonhosted.org/packages/68/11/d3f84c69de2b2086be3d6bd5e9d172825c096b13842ab7e5f8f39f06035b/rpds_py-0.20.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:0b581f47257a9fce535c4567782a8976002d6b8afa2c39ff616edf87cbeff712", size = 318126, upload-time = "2024-10-31T14:26:56.089Z" }, + { url = "https://files.pythonhosted.org/packages/18/c0/13f1bce9c901511e5e4c0b77a99dbb946bb9a177ca88c6b480e9cb53e304/rpds_py-0.20.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:842c19a6ce894493563c3bd00d81d5100e8e57d70209e84d5491940fdb8b9e3a", size = 361119, upload-time = "2024-10-31T14:26:58.354Z" }, + { url = "https://files.pythonhosted.org/packages/06/31/3bd721575671f22a37476c2d7b9e34bfa5185bdcee09f7fedde3b29f3adb/rpds_py-0.20.1-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:42cbde7789f5c0bcd6816cb29808e36c01b960fb5d29f11e052215aa85497c93", size = 369532, upload-time = "2024-10-31T14:27:00.155Z" }, + { url = "https://files.pythonhosted.org/packages/20/22/3eeb0385f33251b4fd0f728e6a3801dc8acc05e714eb7867cefe635bf4ab/rpds_py-0.20.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:6c8e9340ce5a52f95fa7d3b552b35c7e8f3874d74a03a8a69279fd5fca5dc751", size = 403703, upload-time = "2024-10-31T14:27:02.072Z" }, + { url = "https://files.pythonhosted.org/packages/10/e1/8dde6174e7ac5b9acd3269afca2e17719bc7e5088c68f44874d2ad9e4560/rpds_py-0.20.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8ba6f89cac95c0900d932c9efb7f0fb6ca47f6687feec41abcb1bd5e2bd45535", size = 429868, upload-time = "2024-10-31T14:27:04.453Z" }, + { url = "https://files.pythonhosted.org/packages/19/51/a3cc1a5238acfc2582033e8934d034301f9d4931b9bf7c7ccfabc4ca0880/rpds_py-0.20.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4a916087371afd9648e1962e67403c53f9c49ca47b9680adbeef79da3a7811b0", size = 360539, upload-time = "2024-10-31T14:27:07.048Z" }, + { url = "https://files.pythonhosted.org/packages/cd/8c/3c87471a44bd4114e2b0aec90f298f6caaac4e8db6af904d5dd2279f5c61/rpds_py-0.20.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:200a23239781f46149e6a415f1e870c5ef1e712939fe8fa63035cd053ac2638e", size = 382467, upload-time = "2024-10-31T14:27:08.647Z" }, + { url = "https://files.pythonhosted.org/packages/d0/9b/95073fe3e0f130e6d561e106818b6568ef1f2df3352e7f162ab912da837c/rpds_py-0.20.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:58b1d5dd591973d426cbb2da5e27ba0339209832b2f3315928c9790e13f159e8", size = 546669, upload-time = "2024-10-31T14:27:10.626Z" }, + { url = "https://files.pythonhosted.org/packages/de/4c/7ab3669e02bb06fedebcfd64d361b7168ba39dfdf385e4109440f2e7927b/rpds_py-0.20.1-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:6b73c67850ca7cae0f6c56f71e356d7e9fa25958d3e18a64927c2d930859b8e4", size = 549304, upload-time = "2024-10-31T14:27:14.114Z" }, + { url = "https://files.pythonhosted.org/packages/f1/e8/ad5da336cd42adbdafe0ecd40dcecdae01fd3d703c621c7637615a008d3a/rpds_py-0.20.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:d8761c3c891cc51e90bc9926d6d2f59b27beaf86c74622c8979380a29cc23ac3", size = 527637, upload-time = "2024-10-31T14:27:15.887Z" }, + { url = "https://files.pythonhosted.org/packages/02/f1/1b47b9e5b941c2659c9b7e4ef41b6f07385a6500c638fa10c066e4616ecb/rpds_py-0.20.1-cp311-none-win32.whl", hash = "sha256:cd945871335a639275eee904caef90041568ce3b42f402c6959b460d25ae8732", size = 200488, upload-time = "2024-10-31T14:27:18.666Z" }, + { url = "https://files.pythonhosted.org/packages/85/f6/c751c1adfa31610055acfa1cc667cf2c2d7011a73070679c448cf5856905/rpds_py-0.20.1-cp311-none-win_amd64.whl", hash = "sha256:7e21b7031e17c6b0e445f42ccc77f79a97e2687023c5746bfb7a9e45e0921b84", size = 218475, upload-time = "2024-10-31T14:27:20.13Z" }, + { url = "https://files.pythonhosted.org/packages/e7/10/4e8dcc08b58a548098dbcee67a4888751a25be7a6dde0a83d4300df48bfa/rpds_py-0.20.1-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:36785be22066966a27348444b40389f8444671630063edfb1a2eb04318721e17", size = 329749, upload-time = "2024-10-31T14:27:21.968Z" }, + { url = "https://files.pythonhosted.org/packages/d2/e4/61144f3790e12fd89e6153d77f7915ad26779735fef8ee9c099cba6dfb4a/rpds_py-0.20.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:142c0a5124d9bd0e2976089484af5c74f47bd3298f2ed651ef54ea728d2ea42c", size = 321032, upload-time = "2024-10-31T14:27:24.397Z" }, + { url = "https://files.pythonhosted.org/packages/fa/e0/99205aabbf3be29ef6c58ef9b08feed51ba6532fdd47461245cb58dd9897/rpds_py-0.20.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dbddc10776ca7ebf2a299c41a4dde8ea0d8e3547bfd731cb87af2e8f5bf8962d", size = 363931, upload-time = "2024-10-31T14:27:26.05Z" }, + { url = "https://files.pythonhosted.org/packages/ac/bd/bce2dddb518b13a7e77eed4be234c9af0c9c6d403d01c5e6ae8eb447ab62/rpds_py-0.20.1-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:15a842bb369e00295392e7ce192de9dcbf136954614124a667f9f9f17d6a216f", size = 373343, upload-time = "2024-10-31T14:27:27.864Z" }, + { url = "https://files.pythonhosted.org/packages/43/15/112b7c553066cb91264691ba7fb119579c440a0ae889da222fa6fc0d411a/rpds_py-0.20.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:be5ef2f1fc586a7372bfc355986226484e06d1dc4f9402539872c8bb99e34b01", size = 406304, upload-time = "2024-10-31T14:27:29.776Z" }, + { url = "https://files.pythonhosted.org/packages/af/8d/2da52aef8ae5494a382b0c0025ba5b68f2952db0f2a4c7534580e8ca83cc/rpds_py-0.20.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:dbcf360c9e3399b056a238523146ea77eeb2a596ce263b8814c900263e46031a", size = 423022, upload-time = "2024-10-31T14:27:31.547Z" }, + { url = "https://files.pythonhosted.org/packages/c8/1b/f23015cb293927c93bdb4b94a48bfe77ad9d57359c75db51f0ff0cf482ff/rpds_py-0.20.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ecd27a66740ffd621d20b9a2f2b5ee4129a56e27bfb9458a3bcc2e45794c96cb", size = 364937, upload-time = "2024-10-31T14:27:33.447Z" }, + { url = "https://files.pythonhosted.org/packages/7b/8b/6da8636b2ea2e2f709e56656e663b6a71ecd9a9f9d9dc21488aade122026/rpds_py-0.20.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:d0b937b2a1988f184a3e9e577adaa8aede21ec0b38320d6009e02bd026db04fa", size = 386301, upload-time = "2024-10-31T14:27:35.8Z" }, + { url = "https://files.pythonhosted.org/packages/20/af/2ae192797bffd0d6d558145b5a36e7245346ff3e44f6ddcb82f0eb8512d4/rpds_py-0.20.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:6889469bfdc1eddf489729b471303739bf04555bb151fe8875931f8564309afc", size = 549452, upload-time = "2024-10-31T14:27:38.316Z" }, + { url = "https://files.pythonhosted.org/packages/07/dd/9f6520712a5108cd7d407c9db44a3d59011b385c58e320d58ebf67757a9e/rpds_py-0.20.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:19b73643c802f4eaf13d97f7855d0fb527fbc92ab7013c4ad0e13a6ae0ed23bd", size = 554370, upload-time = "2024-10-31T14:27:40.111Z" }, + { url = "https://files.pythonhosted.org/packages/5e/0e/b1bdc7ea0db0946d640ab8965146099093391bb5d265832994c47461e3c5/rpds_py-0.20.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:3c6afcf2338e7f374e8edc765c79fbcb4061d02b15dd5f8f314a4af2bdc7feb5", size = 530940, upload-time = "2024-10-31T14:27:42.074Z" }, + { url = "https://files.pythonhosted.org/packages/ae/d3/ffe907084299484fab60a7955f7c0e8a295c04249090218c59437010f9f4/rpds_py-0.20.1-cp312-none-win32.whl", hash = "sha256:dc73505153798c6f74854aba69cc75953888cf9866465196889c7cdd351e720c", size = 203164, upload-time = "2024-10-31T14:27:44.578Z" }, + { url = "https://files.pythonhosted.org/packages/1f/ba/9cbb57423c4bfbd81c473913bebaed151ad4158ee2590a4e4b3e70238b48/rpds_py-0.20.1-cp312-none-win_amd64.whl", hash = "sha256:8bbe951244a838a51289ee53a6bae3a07f26d4e179b96fc7ddd3301caf0518eb", size = 220750, upload-time = "2024-10-31T14:27:46.411Z" }, + { url = "https://files.pythonhosted.org/packages/b5/01/fee2e1d1274c92fff04aa47d805a28d62c2aa971d1f49f5baea1c6e670d9/rpds_py-0.20.1-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:6ca91093a4a8da4afae7fe6a222c3b53ee4eef433ebfee4d54978a103435159e", size = 329359, upload-time = "2024-10-31T14:27:48.866Z" }, + { url = "https://files.pythonhosted.org/packages/b0/cf/4aeffb02b7090029d7aeecbffb9a10e1c80f6f56d7e9a30e15481dc4099c/rpds_py-0.20.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:b9c2fe36d1f758b28121bef29ed1dee9b7a2453e997528e7d1ac99b94892527c", size = 320543, upload-time = "2024-10-31T14:27:51.354Z" }, + { url = "https://files.pythonhosted.org/packages/17/69/85cf3429e9ccda684ba63ff36b5866d5f9451e921cc99819341e19880334/rpds_py-0.20.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f009c69bc8c53db5dfab72ac760895dc1f2bc1b62ab7408b253c8d1ec52459fc", size = 363107, upload-time = "2024-10-31T14:27:53.196Z" }, + { url = "https://files.pythonhosted.org/packages/ef/de/7df88dea9c3eeb832196d23b41f0f6fc5f9a2ee9b2080bbb1db8731ead9c/rpds_py-0.20.1-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:6740a3e8d43a32629bb9b009017ea5b9e713b7210ba48ac8d4cb6d99d86c8ee8", size = 372027, upload-time = "2024-10-31T14:27:55.244Z" }, + { url = "https://files.pythonhosted.org/packages/d1/b8/88675399d2038580743c570a809c43a900e7090edc6553f8ffb66b23c965/rpds_py-0.20.1-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:32b922e13d4c0080d03e7b62991ad7f5007d9cd74e239c4b16bc85ae8b70252d", size = 405031, upload-time = "2024-10-31T14:27:57.688Z" }, + { url = "https://files.pythonhosted.org/packages/e1/aa/cca639f6d17caf00bab51bdc70fcc0bdda3063e5662665c4fdf60443c474/rpds_py-0.20.1-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:fe00a9057d100e69b4ae4a094203a708d65b0f345ed546fdef86498bf5390982", size = 422271, upload-time = "2024-10-31T14:27:59.526Z" }, + { url = "https://files.pythonhosted.org/packages/c4/07/bf8a949d2ec4626c285579c9d6b356c692325f1a4126e947736b416e1fc4/rpds_py-0.20.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:49fe9b04b6fa685bd39237d45fad89ba19e9163a1ccaa16611a812e682913496", size = 363625, upload-time = "2024-10-31T14:28:01.915Z" }, + { url = "https://files.pythonhosted.org/packages/11/f0/06675c6a58d6ce34547879138810eb9aab0c10e5607ea6c2e4dc56b703c8/rpds_py-0.20.1-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:aa7ac11e294304e615b43f8c441fee5d40094275ed7311f3420d805fde9b07b4", size = 385906, upload-time = "2024-10-31T14:28:03.796Z" }, + { url = "https://files.pythonhosted.org/packages/bf/ac/2d1f50374eb8e41030fad4e87f81751e1c39e3b5d4bee8c5618830d8a6ac/rpds_py-0.20.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:6aa97af1558a9bef4025f8f5d8c60d712e0a3b13a2fe875511defc6ee77a1ab7", size = 549021, upload-time = "2024-10-31T14:28:05.704Z" }, + { url = "https://files.pythonhosted.org/packages/f7/d4/a7d70a7cc71df772eeadf4bce05e32e780a9fe44a511a5b091c7a85cb767/rpds_py-0.20.1-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:483b29f6f7ffa6af845107d4efe2e3fa8fb2693de8657bc1849f674296ff6a5a", size = 553800, upload-time = "2024-10-31T14:28:07.684Z" }, + { url = "https://files.pythonhosted.org/packages/87/81/dc30bc449ccba63ad23a0f6633486d4e0e6955f45f3715a130dacabd6ad0/rpds_py-0.20.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:37fe0f12aebb6a0e3e17bb4cd356b1286d2d18d2e93b2d39fe647138458b4bcb", size = 531076, upload-time = "2024-10-31T14:28:10.545Z" }, + { url = "https://files.pythonhosted.org/packages/50/80/fb62ab48f3b5cfe704ead6ad372da1922ddaa76397055e02eb507054c979/rpds_py-0.20.1-cp313-none-win32.whl", hash = "sha256:a624cc00ef2158e04188df5e3016385b9353638139a06fb77057b3498f794782", size = 202804, upload-time = "2024-10-31T14:28:12.877Z" }, + { url = "https://files.pythonhosted.org/packages/d9/30/a3391e76d0b3313f33bdedd394a519decae3a953d2943e3dabf80ae32447/rpds_py-0.20.1-cp313-none-win_amd64.whl", hash = "sha256:b71b8666eeea69d6363248822078c075bac6ed135faa9216aa85f295ff009b1e", size = 220502, upload-time = "2024-10-31T14:28:14.597Z" }, + { url = "https://files.pythonhosted.org/packages/53/ef/b1883734ea0cd9996de793cdc38c32a28143b04911d1e570090acd8a9162/rpds_py-0.20.1-cp38-cp38-macosx_10_12_x86_64.whl", hash = "sha256:5b48e790e0355865197ad0aca8cde3d8ede347831e1959e158369eb3493d2191", size = 327757, upload-time = "2024-10-31T14:28:16.323Z" }, + { url = "https://files.pythonhosted.org/packages/54/63/47d34dc4ddb3da73e78e10c9009dcf8edc42d355a221351c05c822c2a50b/rpds_py-0.20.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:3e310838a5801795207c66c73ea903deda321e6146d6f282e85fa7e3e4854804", size = 318785, upload-time = "2024-10-31T14:28:18.381Z" }, + { url = "https://files.pythonhosted.org/packages/f7/e1/d6323be4afbe3013f28725553b7bfa80b3f013f91678af258f579f8ea8f9/rpds_py-0.20.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2249280b870e6a42c0d972339e9cc22ee98730a99cd7f2f727549af80dd5a963", size = 361511, upload-time = "2024-10-31T14:28:20.292Z" }, + { url = "https://files.pythonhosted.org/packages/ab/d3/c40e4d9ecd571f0f50fe69bc53fe608d7b2c49b30738b480044990260838/rpds_py-0.20.1-cp38-cp38-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:e79059d67bea28b53d255c1437b25391653263f0e69cd7dec170d778fdbca95e", size = 370201, upload-time = "2024-10-31T14:28:22.314Z" }, + { url = "https://files.pythonhosted.org/packages/f1/b6/96a4a9977a8a06c2c49d90aa571346aff1642abf15066a39a0b4817bf049/rpds_py-0.20.1-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2b431c777c9653e569986ecf69ff4a5dba281cded16043d348bf9ba505486f36", size = 403866, upload-time = "2024-10-31T14:28:24.135Z" }, + { url = "https://files.pythonhosted.org/packages/cd/8f/702b52287949314b498a311f92b5ee0ba30c702a27e0e6b560e2da43b8d5/rpds_py-0.20.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:da584ff96ec95e97925174eb8237e32f626e7a1a97888cdd27ee2f1f24dd0ad8", size = 430163, upload-time = "2024-10-31T14:28:26.021Z" }, + { url = "https://files.pythonhosted.org/packages/c4/ce/af016c81fda833bf125b20d1677d816f230cad2ab189f46bcbfea3c7a375/rpds_py-0.20.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:02a0629ec053fc013808a85178524e3cb63a61dbc35b22499870194a63578fb9", size = 360776, upload-time = "2024-10-31T14:28:27.852Z" }, + { url = "https://files.pythonhosted.org/packages/08/a7/988e179c9bef55821abe41762228d65077e0570ca75c9efbcd1bc6e263b4/rpds_py-0.20.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:fbf15aff64a163db29a91ed0868af181d6f68ec1a3a7d5afcfe4501252840bad", size = 383008, upload-time = "2024-10-31T14:28:30.029Z" }, + { url = "https://files.pythonhosted.org/packages/96/b0/e4077f7f1b9622112ae83254aedfb691490278793299bc06dcf54ec8c8e4/rpds_py-0.20.1-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:07924c1b938798797d60c6308fa8ad3b3f0201802f82e4a2c41bb3fafb44cc28", size = 546371, upload-time = "2024-10-31T14:28:33.062Z" }, + { url = "https://files.pythonhosted.org/packages/e4/5e/1d4dd08ec0352cfe516ea93ea1993c2f656f893c87dafcd9312bd07f65f7/rpds_py-0.20.1-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:4a5a844f68776a7715ecb30843b453f07ac89bad393431efbf7accca3ef599c1", size = 549809, upload-time = "2024-10-31T14:28:35.285Z" }, + { url = "https://files.pythonhosted.org/packages/57/ac/a716b4729ff23ec034b7d2ff76a86e6f0753c4098401bdfdf55b2efe90e6/rpds_py-0.20.1-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:518d2ca43c358929bf08f9079b617f1c2ca6e8848f83c1225c88caeac46e6cbc", size = 528492, upload-time = "2024-10-31T14:28:37.516Z" }, + { url = "https://files.pythonhosted.org/packages/e0/ed/a0b58a9ecef79918169eacdabd14eb4c5c86ce71184ed56b80c6eb425828/rpds_py-0.20.1-cp38-none-win32.whl", hash = "sha256:3aea7eed3e55119635a74bbeb80b35e776bafccb70d97e8ff838816c124539f1", size = 200512, upload-time = "2024-10-31T14:28:39.484Z" }, + { url = "https://files.pythonhosted.org/packages/5f/c3/222e25124283afc76c473fcd2c547e82ec57683fa31cb4d6c6eb44e5d57a/rpds_py-0.20.1-cp38-none-win_amd64.whl", hash = "sha256:7dca7081e9a0c3b6490a145593f6fe3173a94197f2cb9891183ef75e9d64c425", size = 218627, upload-time = "2024-10-31T14:28:41.479Z" }, + { url = "https://files.pythonhosted.org/packages/d6/87/e7e0fcbfdc0d0e261534bcc885f6ae6253095b972e32f8b8b1278c78a2a9/rpds_py-0.20.1-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:b41b6321805c472f66990c2849e152aff7bc359eb92f781e3f606609eac877ad", size = 327867, upload-time = "2024-10-31T14:28:44.167Z" }, + { url = "https://files.pythonhosted.org/packages/93/a0/17836b7961fc82586e9b818abdee2a27e2e605a602bb8c0d43f02092f8c2/rpds_py-0.20.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:0a90c373ea2975519b58dece25853dbcb9779b05cc46b4819cb1917e3b3215b6", size = 318893, upload-time = "2024-10-31T14:28:46.753Z" }, + { url = "https://files.pythonhosted.org/packages/dc/03/deb81d8ea3a8b974e7b03cfe8c8c26616ef8f4980dd430d8dd0a2f1b4d8e/rpds_py-0.20.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:16d4477bcb9fbbd7b5b0e4a5d9b493e42026c0bf1f06f723a9353f5153e75d30", size = 361664, upload-time = "2024-10-31T14:28:49.782Z" }, + { url = "https://files.pythonhosted.org/packages/16/49/d9938603731745c7b6babff97ca61ff3eb4619e7128b5ab0111ad4e91d6d/rpds_py-0.20.1-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:84b8382a90539910b53a6307f7c35697bc7e6ffb25d9c1d4e998a13e842a5e83", size = 369796, upload-time = "2024-10-31T14:28:52.263Z" }, + { url = "https://files.pythonhosted.org/packages/87/d2/480b36c69cdc373853401b6aab6a281cf60f6d72b1545d82c0d23d9dd77c/rpds_py-0.20.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4888e117dd41b9d34194d9e31631af70d3d526efc363085e3089ab1a62c32ed1", size = 403860, upload-time = "2024-10-31T14:28:54.388Z" }, + { url = "https://files.pythonhosted.org/packages/31/7c/f6d909cb57761293308dbef14f1663d84376f2e231892a10aafc57b42037/rpds_py-0.20.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5265505b3d61a0f56618c9b941dc54dc334dc6e660f1592d112cd103d914a6db", size = 430793, upload-time = "2024-10-31T14:28:56.811Z" }, + { url = "https://files.pythonhosted.org/packages/d4/62/c9bd294c4b5f84d9cc2c387b548ae53096ad7e71ac5b02b6310e9dc85aa4/rpds_py-0.20.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e75ba609dba23f2c95b776efb9dd3f0b78a76a151e96f96cc5b6b1b0004de66f", size = 360927, upload-time = "2024-10-31T14:28:58.868Z" }, + { url = "https://files.pythonhosted.org/packages/c1/a7/15d927d83a44da8307a432b1cac06284b6657706d099a98cc99fec34ad51/rpds_py-0.20.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:1791ff70bc975b098fe6ecf04356a10e9e2bd7dc21fa7351c1742fdeb9b4966f", size = 382660, upload-time = "2024-10-31T14:29:01.261Z" }, + { url = "https://files.pythonhosted.org/packages/4c/28/0630719c18456238bb07d59c4302fed50a13aa8035ec23dbfa80d116f9bc/rpds_py-0.20.1-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:d126b52e4a473d40232ec2052a8b232270ed1f8c9571aaf33f73a14cc298c24f", size = 546888, upload-time = "2024-10-31T14:29:03.923Z" }, + { url = "https://files.pythonhosted.org/packages/b9/75/3c9bda11b9c15d680b315f898af23825159314d4b56568f24b53ace8afcd/rpds_py-0.20.1-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:c14937af98c4cc362a1d4374806204dd51b1e12dded1ae30645c298e5a5c4cb1", size = 550088, upload-time = "2024-10-31T14:29:07.107Z" }, + { url = "https://files.pythonhosted.org/packages/70/f1/8fe7d04c194218171220a412057429defa9e2da785de0777c4d39309337e/rpds_py-0.20.1-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:3d089d0b88996df627693639d123c8158cff41c0651f646cd8fd292c7da90eaf", size = 528270, upload-time = "2024-10-31T14:29:09.933Z" }, + { url = "https://files.pythonhosted.org/packages/d6/62/41b0020f4b00af042b008e679dbe25a2f5bce655139a81f8b812f9068e52/rpds_py-0.20.1-cp39-none-win32.whl", hash = "sha256:653647b8838cf83b2e7e6a0364f49af96deec64d2a6578324db58380cff82aca", size = 200658, upload-time = "2024-10-31T14:29:12.234Z" }, + { url = "https://files.pythonhosted.org/packages/05/01/e64bb8889f2dcc951e53de33d8b8070456397ae4e10edc35e6cb9908f5c8/rpds_py-0.20.1-cp39-none-win_amd64.whl", hash = "sha256:fa41a64ac5b08b292906e248549ab48b69c5428f3987b09689ab2441f267d04d", size = 218883, upload-time = "2024-10-31T14:29:14.846Z" }, + { url = "https://files.pythonhosted.org/packages/b6/fa/7959429e69569d0f6e7d27f80451402da0409349dd2b07f6bcbdd5fad2d3/rpds_py-0.20.1-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:7a07ced2b22f0cf0b55a6a510078174c31b6d8544f3bc00c2bcee52b3d613f74", size = 328209, upload-time = "2024-10-31T14:29:17.44Z" }, + { url = "https://files.pythonhosted.org/packages/25/97/5dfdb091c30267ff404d2fd9e70c7a6d6ffc65ca77fffe9456e13b719066/rpds_py-0.20.1-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:68cb0a499f2c4a088fd2f521453e22ed3527154136a855c62e148b7883b99f9a", size = 319499, upload-time = "2024-10-31T14:29:19.527Z" }, + { url = "https://files.pythonhosted.org/packages/7c/98/cf2608722400f5f9bb4c82aa5ac09026f3ac2ebea9d4059d3533589ed0b6/rpds_py-0.20.1-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fa3060d885657abc549b2a0f8e1b79699290e5d83845141717c6c90c2df38311", size = 361795, upload-time = "2024-10-31T14:29:22.395Z" }, + { url = "https://files.pythonhosted.org/packages/89/de/0e13dd43c785c60e63933e96fbddda0b019df6862f4d3019bb49c3861131/rpds_py-0.20.1-pp310-pypy310_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:95f3b65d2392e1c5cec27cff08fdc0080270d5a1a4b2ea1d51d5f4a2620ff08d", size = 370604, upload-time = "2024-10-31T14:29:25.552Z" }, + { url = "https://files.pythonhosted.org/packages/8a/fc/fe3c83c77f82b8059eeec4e998064913d66212b69b3653df48f58ad33d3d/rpds_py-0.20.1-pp310-pypy310_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2cc3712a4b0b76a1d45a9302dd2f53ff339614b1c29603a911318f2357b04dd2", size = 404177, upload-time = "2024-10-31T14:29:27.82Z" }, + { url = "https://files.pythonhosted.org/packages/94/30/5189518bfb80a41f664daf32b46645c7fbdcc89028a0f1bfa82e806e0fbb/rpds_py-0.20.1-pp310-pypy310_pp73-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5d4eea0761e37485c9b81400437adb11c40e13ef513375bbd6973e34100aeb06", size = 430108, upload-time = "2024-10-31T14:29:30.768Z" }, + { url = "https://files.pythonhosted.org/packages/67/0e/6f069feaff5c298375cd8c55e00ecd9bd79c792ce0893d39448dc0097857/rpds_py-0.20.1-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7f5179583d7a6cdb981151dd349786cbc318bab54963a192692d945dd3f6435d", size = 361184, upload-time = "2024-10-31T14:29:32.993Z" }, + { url = "https://files.pythonhosted.org/packages/27/9f/ce3e2ae36f392c3ef1988c06e9e0b4c74f64267dad7c223003c34da11adb/rpds_py-0.20.1-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:2fbb0ffc754490aff6dabbf28064be47f0f9ca0b9755976f945214965b3ace7e", size = 384140, upload-time = "2024-10-31T14:29:35.356Z" }, + { url = "https://files.pythonhosted.org/packages/5f/d5/89d44504d0bc7a1135062cb520a17903ff002f458371b8d9160af3b71e52/rpds_py-0.20.1-pp310-pypy310_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:a94e52537a0e0a85429eda9e49f272ada715506d3b2431f64b8a3e34eb5f3e75", size = 546589, upload-time = "2024-10-31T14:29:37.711Z" }, + { url = "https://files.pythonhosted.org/packages/8f/8f/e1c2db4fcca3947d9a28ec9553700b4dc8038f0eff575f579e75885b0661/rpds_py-0.20.1-pp310-pypy310_pp73-musllinux_1_2_i686.whl", hash = "sha256:92b68b79c0da2a980b1c4197e56ac3dd0c8a149b4603747c4378914a68706979", size = 550059, upload-time = "2024-10-31T14:29:40.342Z" }, + { url = "https://files.pythonhosted.org/packages/67/29/00a9e986df36721b5def82fff60995c1ee8827a7d909a6ec8929fb4cc668/rpds_py-0.20.1-pp310-pypy310_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:93da1d3db08a827eda74356f9f58884adb254e59b6664f64cc04cdff2cc19b0d", size = 529131, upload-time = "2024-10-31T14:29:42.993Z" }, + { url = "https://files.pythonhosted.org/packages/a3/32/95364440560ec476b19c6a2704259e710c223bf767632ebaa72cc2a1760f/rpds_py-0.20.1-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:754bbed1a4ca48479e9d4182a561d001bbf81543876cdded6f695ec3d465846b", size = 219677, upload-time = "2024-10-31T14:29:45.332Z" }, + { url = "https://files.pythonhosted.org/packages/ed/bf/ad8492e972c90a3d48a38e2b5095c51a8399d5b57e83f2d5d1649490f72b/rpds_py-0.20.1-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:ca449520e7484534a2a44faf629362cae62b660601432d04c482283c47eaebab", size = 328046, upload-time = "2024-10-31T14:29:48.968Z" }, + { url = "https://files.pythonhosted.org/packages/75/fd/84f42386165d6d555acb76c6d39c90b10c9dcf25116daf4f48a0a9d6867a/rpds_py-0.20.1-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:9c4cb04a16b0f199a8c9bf807269b2f63b7b5b11425e4a6bd44bd6961d28282c", size = 319306, upload-time = "2024-10-31T14:29:51.212Z" }, + { url = "https://files.pythonhosted.org/packages/6c/8a/abcd5119a0573f9588ad71a3fde3c07ddd1d1393cfee15a6ba7495c256f1/rpds_py-0.20.1-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bb63804105143c7e24cee7db89e37cb3f3941f8e80c4379a0b355c52a52b6780", size = 362558, upload-time = "2024-10-31T14:29:53.551Z" }, + { url = "https://files.pythonhosted.org/packages/9d/65/1c2bb10afd4bd32800227a658ae9097bc1d08a4e5048a57a9bd2efdf6306/rpds_py-0.20.1-pp39-pypy39_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:55cd1fa4ecfa6d9f14fbd97ac24803e6f73e897c738f771a9fe038f2f11ff07c", size = 370811, upload-time = "2024-10-31T14:29:56.672Z" }, + { url = "https://files.pythonhosted.org/packages/6c/ee/f4bab2b9e51ced30351cfd210647885391463ae682028c79760e7db28e4e/rpds_py-0.20.1-pp39-pypy39_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:0f8f741b6292c86059ed175d80eefa80997125b7c478fb8769fd9ac8943a16c0", size = 404660, upload-time = "2024-10-31T14:29:59.276Z" }, + { url = "https://files.pythonhosted.org/packages/48/0f/9d04d0939682f0c97be827fc51ff986555ffb573e6781bd5132441f0ce25/rpds_py-0.20.1-pp39-pypy39_pp73-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:0fc212779bf8411667234b3cdd34d53de6c2b8b8b958e1e12cb473a5f367c338", size = 430490, upload-time = "2024-10-31T14:30:01.543Z" }, + { url = "https://files.pythonhosted.org/packages/0d/f2/e9b90fd8416d59941b6a12f2c2e1d898b63fd092f5a7a6f98236cb865764/rpds_py-0.20.1-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0ad56edabcdb428c2e33bbf24f255fe2b43253b7d13a2cdbf05de955217313e6", size = 361448, upload-time = "2024-10-31T14:30:04.294Z" }, + { url = "https://files.pythonhosted.org/packages/0b/83/1cc776dce7bedb17d6f4ea62eafccee8a57a4678f4fac414ab69fb9b6b0b/rpds_py-0.20.1-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:0a3a1e9ee9728b2c1734f65d6a1d376c6f2f6fdcc13bb007a08cc4b1ff576dc5", size = 383681, upload-time = "2024-10-31T14:30:07.717Z" }, + { url = "https://files.pythonhosted.org/packages/17/5c/e0cdd6b0a8373fdef3667af2778dd9ff3abf1bbb9c7bd92c603c91440eb0/rpds_py-0.20.1-pp39-pypy39_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:e13de156137b7095442b288e72f33503a469aa1980ed856b43c353ac86390519", size = 546203, upload-time = "2024-10-31T14:30:10.156Z" }, + { url = "https://files.pythonhosted.org/packages/1b/a8/81fc9cbc01e7ef6d10652aedc1de4e8473934773e2808ba49094e03575df/rpds_py-0.20.1-pp39-pypy39_pp73-musllinux_1_2_i686.whl", hash = "sha256:07f59760ef99f31422c49038964b31c4dfcfeb5d2384ebfc71058a7c9adae2d2", size = 549855, upload-time = "2024-10-31T14:30:13.691Z" }, + { url = "https://files.pythonhosted.org/packages/b3/87/99648693d3c1bbce088119bc61ecaab62e5f9c713894edc604ffeca5ae88/rpds_py-0.20.1-pp39-pypy39_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:59240685e7da61fb78f65a9f07f8108e36a83317c53f7b276b4175dc44151684", size = 528625, upload-time = "2024-10-31T14:30:16.191Z" }, + { url = "https://files.pythonhosted.org/packages/05/c3/10c68a08849f1fa45d205e54141fa75d316013e3d701ef01770ee1220bb8/rpds_py-0.20.1-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:83cba698cfb3c2c5a7c3c6bac12fe6c6a51aae69513726be6411076185a8b24a", size = 219991, upload-time = "2024-10-31T14:30:18.49Z" }, +] + +[[package]] +name = "rpds-py" +version = "0.27.1" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version == '3.9.*'", +] +sdist = { url = "https://files.pythonhosted.org/packages/e9/dd/2c0cbe774744272b0ae725f44032c77bdcab6e8bcf544bffa3b6e70c8dba/rpds_py-0.27.1.tar.gz", hash = "sha256:26a1c73171d10b7acccbded82bf6a586ab8203601e565badc74bbbf8bc5a10f8", size = 27479, upload-time = "2025-08-27T12:16:36.024Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/a5/ed/3aef893e2dd30e77e35d20d4ddb45ca459db59cead748cad9796ad479411/rpds_py-0.27.1-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:68afeec26d42ab3b47e541b272166a0b4400313946871cba3ed3a4fc0cab1cef", size = 371606, upload-time = "2025-08-27T12:12:25.189Z" }, + { url = "https://files.pythonhosted.org/packages/6d/82/9818b443e5d3eb4c83c3994561387f116aae9833b35c484474769c4a8faf/rpds_py-0.27.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:74e5b2f7bb6fa38b1b10546d27acbacf2a022a8b5543efb06cfebc72a59c85be", size = 353452, upload-time = "2025-08-27T12:12:27.433Z" }, + { url = "https://files.pythonhosted.org/packages/99/c7/d2a110ffaaa397fc6793a83c7bd3545d9ab22658b7cdff05a24a4535cc45/rpds_py-0.27.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9024de74731df54546fab0bfbcdb49fae19159ecaecfc8f37c18d2c7e2c0bd61", size = 381519, upload-time = "2025-08-27T12:12:28.719Z" }, + { url = "https://files.pythonhosted.org/packages/5a/bc/e89581d1f9d1be7d0247eaef602566869fdc0d084008ba139e27e775366c/rpds_py-0.27.1-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:31d3ebadefcd73b73928ed0b2fd696f7fefda8629229f81929ac9c1854d0cffb", size = 394424, upload-time = "2025-08-27T12:12:30.207Z" }, + { url = "https://files.pythonhosted.org/packages/ac/2e/36a6861f797530e74bb6ed53495f8741f1ef95939eed01d761e73d559067/rpds_py-0.27.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b2e7f8f169d775dd9092a1743768d771f1d1300453ddfe6325ae3ab5332b4657", size = 523467, upload-time = "2025-08-27T12:12:31.808Z" }, + { url = "https://files.pythonhosted.org/packages/c4/59/c1bc2be32564fa499f988f0a5c6505c2f4746ef96e58e4d7de5cf923d77e/rpds_py-0.27.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3d905d16f77eb6ab2e324e09bfa277b4c8e5e6b8a78a3e7ff8f3cdf773b4c013", size = 402660, upload-time = "2025-08-27T12:12:33.444Z" }, + { url = "https://files.pythonhosted.org/packages/0a/ec/ef8bf895f0628dd0a59e54d81caed6891663cb9c54a0f4bb7da918cb88cf/rpds_py-0.27.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:50c946f048209e6362e22576baea09193809f87687a95a8db24e5fbdb307b93a", size = 384062, upload-time = "2025-08-27T12:12:34.857Z" }, + { url = "https://files.pythonhosted.org/packages/69/f7/f47ff154be8d9a5e691c083a920bba89cef88d5247c241c10b9898f595a1/rpds_py-0.27.1-cp310-cp310-manylinux_2_31_riscv64.whl", hash = "sha256:3deab27804d65cd8289eb814c2c0e807c4b9d9916c9225e363cb0cf875eb67c1", size = 401289, upload-time = "2025-08-27T12:12:36.085Z" }, + { url = "https://files.pythonhosted.org/packages/3b/d9/ca410363efd0615814ae579f6829cafb39225cd63e5ea5ed1404cb345293/rpds_py-0.27.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:8b61097f7488de4be8244c89915da8ed212832ccf1e7c7753a25a394bf9b1f10", size = 417718, upload-time = "2025-08-27T12:12:37.401Z" }, + { url = "https://files.pythonhosted.org/packages/e3/a0/8cb5c2ff38340f221cc067cc093d1270e10658ba4e8d263df923daa18e86/rpds_py-0.27.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:8a3f29aba6e2d7d90528d3c792555a93497fe6538aa65eb675b44505be747808", size = 558333, upload-time = "2025-08-27T12:12:38.672Z" }, + { url = "https://files.pythonhosted.org/packages/6f/8c/1b0de79177c5d5103843774ce12b84caa7164dfc6cd66378768d37db11bf/rpds_py-0.27.1-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:dd6cd0485b7d347304067153a6dc1d73f7d4fd995a396ef32a24d24b8ac63ac8", size = 589127, upload-time = "2025-08-27T12:12:41.48Z" }, + { url = "https://files.pythonhosted.org/packages/c8/5e/26abb098d5e01266b0f3a2488d299d19ccc26849735d9d2b95c39397e945/rpds_py-0.27.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:6f4461bf931108c9fa226ffb0e257c1b18dc2d44cd72b125bec50ee0ab1248a9", size = 554899, upload-time = "2025-08-27T12:12:42.925Z" }, + { url = "https://files.pythonhosted.org/packages/de/41/905cc90ced13550db017f8f20c6d8e8470066c5738ba480d7ba63e3d136b/rpds_py-0.27.1-cp310-cp310-win32.whl", hash = "sha256:ee5422d7fb21f6a00c1901bf6559c49fee13a5159d0288320737bbf6585bd3e4", size = 217450, upload-time = "2025-08-27T12:12:44.813Z" }, + { url = "https://files.pythonhosted.org/packages/75/3d/6bef47b0e253616ccdf67c283e25f2d16e18ccddd38f92af81d5a3420206/rpds_py-0.27.1-cp310-cp310-win_amd64.whl", hash = "sha256:3e039aabf6d5f83c745d5f9a0a381d031e9ed871967c0a5c38d201aca41f3ba1", size = 228447, upload-time = "2025-08-27T12:12:46.204Z" }, + { url = "https://files.pythonhosted.org/packages/b5/c1/7907329fbef97cbd49db6f7303893bd1dd5a4a3eae415839ffdfb0762cae/rpds_py-0.27.1-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:be898f271f851f68b318872ce6ebebbc62f303b654e43bf72683dbdc25b7c881", size = 371063, upload-time = "2025-08-27T12:12:47.856Z" }, + { url = "https://files.pythonhosted.org/packages/11/94/2aab4bc86228bcf7c48760990273653a4900de89c7537ffe1b0d6097ed39/rpds_py-0.27.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:62ac3d4e3e07b58ee0ddecd71d6ce3b1637de2d373501412df395a0ec5f9beb5", size = 353210, upload-time = "2025-08-27T12:12:49.187Z" }, + { url = "https://files.pythonhosted.org/packages/3a/57/f5eb3ecf434342f4f1a46009530e93fd201a0b5b83379034ebdb1d7c1a58/rpds_py-0.27.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4708c5c0ceb2d034f9991623631d3d23cb16e65c83736ea020cdbe28d57c0a0e", size = 381636, upload-time = "2025-08-27T12:12:50.492Z" }, + { url = "https://files.pythonhosted.org/packages/ae/f4/ef95c5945e2ceb5119571b184dd5a1cc4b8541bbdf67461998cfeac9cb1e/rpds_py-0.27.1-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:abfa1171a9952d2e0002aba2ad3780820b00cc3d9c98c6630f2e93271501f66c", size = 394341, upload-time = "2025-08-27T12:12:52.024Z" }, + { url = "https://files.pythonhosted.org/packages/5a/7e/4bd610754bf492d398b61725eb9598ddd5eb86b07d7d9483dbcd810e20bc/rpds_py-0.27.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4b507d19f817ebaca79574b16eb2ae412e5c0835542c93fe9983f1e432aca195", size = 523428, upload-time = "2025-08-27T12:12:53.779Z" }, + { url = "https://files.pythonhosted.org/packages/9f/e5/059b9f65a8c9149361a8b75094864ab83b94718344db511fd6117936ed2a/rpds_py-0.27.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:168b025f8fd8d8d10957405f3fdcef3dc20f5982d398f90851f4abc58c566c52", size = 402923, upload-time = "2025-08-27T12:12:55.15Z" }, + { url = "https://files.pythonhosted.org/packages/f5/48/64cabb7daced2968dd08e8a1b7988bf358d7bd5bcd5dc89a652f4668543c/rpds_py-0.27.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cb56c6210ef77caa58e16e8c17d35c63fe3f5b60fd9ba9d424470c3400bcf9ed", size = 384094, upload-time = "2025-08-27T12:12:57.194Z" }, + { url = "https://files.pythonhosted.org/packages/ae/e1/dc9094d6ff566bff87add8a510c89b9e158ad2ecd97ee26e677da29a9e1b/rpds_py-0.27.1-cp311-cp311-manylinux_2_31_riscv64.whl", hash = "sha256:d252f2d8ca0195faa707f8eb9368955760880b2b42a8ee16d382bf5dd807f89a", size = 401093, upload-time = "2025-08-27T12:12:58.985Z" }, + { url = "https://files.pythonhosted.org/packages/37/8e/ac8577e3ecdd5593e283d46907d7011618994e1d7ab992711ae0f78b9937/rpds_py-0.27.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:6e5e54da1e74b91dbc7996b56640f79b195d5925c2b78efaa8c5d53e1d88edde", size = 417969, upload-time = "2025-08-27T12:13:00.367Z" }, + { url = "https://files.pythonhosted.org/packages/66/6d/87507430a8f74a93556fe55c6485ba9c259949a853ce407b1e23fea5ba31/rpds_py-0.27.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:ffce0481cc6e95e5b3f0a47ee17ffbd234399e6d532f394c8dce320c3b089c21", size = 558302, upload-time = "2025-08-27T12:13:01.737Z" }, + { url = "https://files.pythonhosted.org/packages/3a/bb/1db4781ce1dda3eecc735e3152659a27b90a02ca62bfeea17aee45cc0fbc/rpds_py-0.27.1-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:a205fdfe55c90c2cd8e540ca9ceba65cbe6629b443bc05db1f590a3db8189ff9", size = 589259, upload-time = "2025-08-27T12:13:03.127Z" }, + { url = "https://files.pythonhosted.org/packages/7b/0e/ae1c8943d11a814d01b482e1f8da903f88047a962dff9bbdadf3bd6e6fd1/rpds_py-0.27.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:689fb5200a749db0415b092972e8eba85847c23885c8543a8b0f5c009b1a5948", size = 554983, upload-time = "2025-08-27T12:13:04.516Z" }, + { url = "https://files.pythonhosted.org/packages/b2/d5/0b2a55415931db4f112bdab072443ff76131b5ac4f4dc98d10d2d357eb03/rpds_py-0.27.1-cp311-cp311-win32.whl", hash = "sha256:3182af66048c00a075010bc7f4860f33913528a4b6fc09094a6e7598e462fe39", size = 217154, upload-time = "2025-08-27T12:13:06.278Z" }, + { url = "https://files.pythonhosted.org/packages/24/75/3b7ffe0d50dc86a6a964af0d1cc3a4a2cdf437cb7b099a4747bbb96d1819/rpds_py-0.27.1-cp311-cp311-win_amd64.whl", hash = "sha256:b4938466c6b257b2f5c4ff98acd8128ec36b5059e5c8f8372d79316b1c36bb15", size = 228627, upload-time = "2025-08-27T12:13:07.625Z" }, + { url = "https://files.pythonhosted.org/packages/8d/3f/4fd04c32abc02c710f09a72a30c9a55ea3cc154ef8099078fd50a0596f8e/rpds_py-0.27.1-cp311-cp311-win_arm64.whl", hash = "sha256:2f57af9b4d0793e53266ee4325535a31ba48e2f875da81a9177c9926dfa60746", size = 220998, upload-time = "2025-08-27T12:13:08.972Z" }, + { url = "https://files.pythonhosted.org/packages/bd/fe/38de28dee5df58b8198c743fe2bea0c785c6d40941b9950bac4cdb71a014/rpds_py-0.27.1-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:ae2775c1973e3c30316892737b91f9283f9908e3cc7625b9331271eaaed7dc90", size = 361887, upload-time = "2025-08-27T12:13:10.233Z" }, + { url = "https://files.pythonhosted.org/packages/7c/9a/4b6c7eedc7dd90986bf0fab6ea2a091ec11c01b15f8ba0a14d3f80450468/rpds_py-0.27.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:2643400120f55c8a96f7c9d858f7be0c88d383cd4653ae2cf0d0c88f668073e5", size = 345795, upload-time = "2025-08-27T12:13:11.65Z" }, + { url = "https://files.pythonhosted.org/packages/6f/0e/e650e1b81922847a09cca820237b0edee69416a01268b7754d506ade11ad/rpds_py-0.27.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:16323f674c089b0360674a4abd28d5042947d54ba620f72514d69be4ff64845e", size = 385121, upload-time = "2025-08-27T12:13:13.008Z" }, + { url = "https://files.pythonhosted.org/packages/1b/ea/b306067a712988e2bff00dcc7c8f31d26c29b6d5931b461aa4b60a013e33/rpds_py-0.27.1-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:9a1f4814b65eacac94a00fc9a526e3fdafd78e439469644032032d0d63de4881", size = 398976, upload-time = "2025-08-27T12:13:14.368Z" }, + { url = "https://files.pythonhosted.org/packages/2c/0a/26dc43c8840cb8fe239fe12dbc8d8de40f2365e838f3d395835dde72f0e5/rpds_py-0.27.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:7ba32c16b064267b22f1850a34051121d423b6f7338a12b9459550eb2096e7ec", size = 525953, upload-time = "2025-08-27T12:13:15.774Z" }, + { url = "https://files.pythonhosted.org/packages/22/14/c85e8127b573aaf3a0cbd7fbb8c9c99e735a4a02180c84da2a463b766e9e/rpds_py-0.27.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e5c20f33fd10485b80f65e800bbe5f6785af510b9f4056c5a3c612ebc83ba6cb", size = 407915, upload-time = "2025-08-27T12:13:17.379Z" }, + { url = "https://files.pythonhosted.org/packages/ed/7b/8f4fee9ba1fb5ec856eb22d725a4efa3deb47f769597c809e03578b0f9d9/rpds_py-0.27.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:466bfe65bd932da36ff279ddd92de56b042f2266d752719beb97b08526268ec5", size = 386883, upload-time = "2025-08-27T12:13:18.704Z" }, + { url = "https://files.pythonhosted.org/packages/86/47/28fa6d60f8b74fcdceba81b272f8d9836ac0340570f68f5df6b41838547b/rpds_py-0.27.1-cp312-cp312-manylinux_2_31_riscv64.whl", hash = "sha256:41e532bbdcb57c92ba3be62c42e9f096431b4cf478da9bc3bc6ce5c38ab7ba7a", size = 405699, upload-time = "2025-08-27T12:13:20.089Z" }, + { url = "https://files.pythonhosted.org/packages/d0/fd/c5987b5e054548df56953a21fe2ebed51fc1ec7c8f24fd41c067b68c4a0a/rpds_py-0.27.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:f149826d742b406579466283769a8ea448eed82a789af0ed17b0cd5770433444", size = 423713, upload-time = "2025-08-27T12:13:21.436Z" }, + { url = "https://files.pythonhosted.org/packages/ac/ba/3c4978b54a73ed19a7d74531be37a8bcc542d917c770e14d372b8daea186/rpds_py-0.27.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:80c60cfb5310677bd67cb1e85a1e8eb52e12529545441b43e6f14d90b878775a", size = 562324, upload-time = "2025-08-27T12:13:22.789Z" }, + { url = "https://files.pythonhosted.org/packages/b5/6c/6943a91768fec16db09a42b08644b960cff540c66aab89b74be6d4a144ba/rpds_py-0.27.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:7ee6521b9baf06085f62ba9c7a3e5becffbc32480d2f1b351559c001c38ce4c1", size = 593646, upload-time = "2025-08-27T12:13:24.122Z" }, + { url = "https://files.pythonhosted.org/packages/11/73/9d7a8f4be5f4396f011a6bb7a19fe26303a0dac9064462f5651ced2f572f/rpds_py-0.27.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:a512c8263249a9d68cac08b05dd59d2b3f2061d99b322813cbcc14c3c7421998", size = 558137, upload-time = "2025-08-27T12:13:25.557Z" }, + { url = "https://files.pythonhosted.org/packages/6e/96/6772cbfa0e2485bcceef8071de7821f81aeac8bb45fbfd5542a3e8108165/rpds_py-0.27.1-cp312-cp312-win32.whl", hash = "sha256:819064fa048ba01b6dadc5116f3ac48610435ac9a0058bbde98e569f9e785c39", size = 221343, upload-time = "2025-08-27T12:13:26.967Z" }, + { url = "https://files.pythonhosted.org/packages/67/b6/c82f0faa9af1c6a64669f73a17ee0eeef25aff30bb9a1c318509efe45d84/rpds_py-0.27.1-cp312-cp312-win_amd64.whl", hash = "sha256:d9199717881f13c32c4046a15f024971a3b78ad4ea029e8da6b86e5aa9cf4594", size = 232497, upload-time = "2025-08-27T12:13:28.326Z" }, + { url = "https://files.pythonhosted.org/packages/e1/96/2817b44bd2ed11aebacc9251da03689d56109b9aba5e311297b6902136e2/rpds_py-0.27.1-cp312-cp312-win_arm64.whl", hash = "sha256:33aa65b97826a0e885ef6e278fbd934e98cdcfed80b63946025f01e2f5b29502", size = 222790, upload-time = "2025-08-27T12:13:29.71Z" }, + { url = "https://files.pythonhosted.org/packages/cc/77/610aeee8d41e39080c7e14afa5387138e3c9fa9756ab893d09d99e7d8e98/rpds_py-0.27.1-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:e4b9fcfbc021633863a37e92571d6f91851fa656f0180246e84cbd8b3f6b329b", size = 361741, upload-time = "2025-08-27T12:13:31.039Z" }, + { url = "https://files.pythonhosted.org/packages/3a/fc/c43765f201c6a1c60be2043cbdb664013def52460a4c7adace89d6682bf4/rpds_py-0.27.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:1441811a96eadca93c517d08df75de45e5ffe68aa3089924f963c782c4b898cf", size = 345574, upload-time = "2025-08-27T12:13:32.902Z" }, + { url = "https://files.pythonhosted.org/packages/20/42/ee2b2ca114294cd9847d0ef9c26d2b0851b2e7e00bf14cc4c0b581df0fc3/rpds_py-0.27.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:55266dafa22e672f5a4f65019015f90336ed31c6383bd53f5e7826d21a0e0b83", size = 385051, upload-time = "2025-08-27T12:13:34.228Z" }, + { url = "https://files.pythonhosted.org/packages/fd/e8/1e430fe311e4799e02e2d1af7c765f024e95e17d651612425b226705f910/rpds_py-0.27.1-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:d78827d7ac08627ea2c8e02c9e5b41180ea5ea1f747e9db0915e3adf36b62dcf", size = 398395, upload-time = "2025-08-27T12:13:36.132Z" }, + { url = "https://files.pythonhosted.org/packages/82/95/9dc227d441ff2670651c27a739acb2535ccaf8b351a88d78c088965e5996/rpds_py-0.27.1-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ae92443798a40a92dc5f0b01d8a7c93adde0c4dc965310a29ae7c64d72b9fad2", size = 524334, upload-time = "2025-08-27T12:13:37.562Z" }, + { url = "https://files.pythonhosted.org/packages/87/01/a670c232f401d9ad461d9a332aa4080cd3cb1d1df18213dbd0d2a6a7ab51/rpds_py-0.27.1-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c46c9dd2403b66a2a3b9720ec4b74d4ab49d4fabf9f03dfdce2d42af913fe8d0", size = 407691, upload-time = "2025-08-27T12:13:38.94Z" }, + { url = "https://files.pythonhosted.org/packages/03/36/0a14aebbaa26fe7fab4780c76f2239e76cc95a0090bdb25e31d95c492fcd/rpds_py-0.27.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2efe4eb1d01b7f5f1939f4ef30ecea6c6b3521eec451fb93191bf84b2a522418", size = 386868, upload-time = "2025-08-27T12:13:40.192Z" }, + { url = "https://files.pythonhosted.org/packages/3b/03/8c897fb8b5347ff6c1cc31239b9611c5bf79d78c984430887a353e1409a1/rpds_py-0.27.1-cp313-cp313-manylinux_2_31_riscv64.whl", hash = "sha256:15d3b4d83582d10c601f481eca29c3f138d44c92187d197aff663a269197c02d", size = 405469, upload-time = "2025-08-27T12:13:41.496Z" }, + { url = "https://files.pythonhosted.org/packages/da/07/88c60edc2df74850d496d78a1fdcdc7b54360a7f610a4d50008309d41b94/rpds_py-0.27.1-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:4ed2e16abbc982a169d30d1a420274a709949e2cbdef119fe2ec9d870b42f274", size = 422125, upload-time = "2025-08-27T12:13:42.802Z" }, + { url = "https://files.pythonhosted.org/packages/6b/86/5f4c707603e41b05f191a749984f390dabcbc467cf833769b47bf14ba04f/rpds_py-0.27.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:a75f305c9b013289121ec0f1181931975df78738cdf650093e6b86d74aa7d8dd", size = 562341, upload-time = "2025-08-27T12:13:44.472Z" }, + { url = "https://files.pythonhosted.org/packages/b2/92/3c0cb2492094e3cd9baf9e49bbb7befeceb584ea0c1a8b5939dca4da12e5/rpds_py-0.27.1-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:67ce7620704745881a3d4b0ada80ab4d99df390838839921f99e63c474f82cf2", size = 592511, upload-time = "2025-08-27T12:13:45.898Z" }, + { url = "https://files.pythonhosted.org/packages/10/bb/82e64fbb0047c46a168faa28d0d45a7851cd0582f850b966811d30f67ad8/rpds_py-0.27.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:9d992ac10eb86d9b6f369647b6a3f412fc0075cfd5d799530e84d335e440a002", size = 557736, upload-time = "2025-08-27T12:13:47.408Z" }, + { url = "https://files.pythonhosted.org/packages/00/95/3c863973d409210da7fb41958172c6b7dbe7fc34e04d3cc1f10bb85e979f/rpds_py-0.27.1-cp313-cp313-win32.whl", hash = "sha256:4f75e4bd8ab8db624e02c8e2fc4063021b58becdbe6df793a8111d9343aec1e3", size = 221462, upload-time = "2025-08-27T12:13:48.742Z" }, + { url = "https://files.pythonhosted.org/packages/ce/2c/5867b14a81dc217b56d95a9f2a40fdbc56a1ab0181b80132beeecbd4b2d6/rpds_py-0.27.1-cp313-cp313-win_amd64.whl", hash = "sha256:f9025faafc62ed0b75a53e541895ca272815bec18abe2249ff6501c8f2e12b83", size = 232034, upload-time = "2025-08-27T12:13:50.11Z" }, + { url = "https://files.pythonhosted.org/packages/c7/78/3958f3f018c01923823f1e47f1cc338e398814b92d83cd278364446fac66/rpds_py-0.27.1-cp313-cp313-win_arm64.whl", hash = "sha256:ed10dc32829e7d222b7d3b93136d25a406ba9788f6a7ebf6809092da1f4d279d", size = 222392, upload-time = "2025-08-27T12:13:52.587Z" }, + { url = "https://files.pythonhosted.org/packages/01/76/1cdf1f91aed5c3a7bf2eba1f1c4e4d6f57832d73003919a20118870ea659/rpds_py-0.27.1-cp313-cp313t-macosx_10_12_x86_64.whl", hash = "sha256:92022bbbad0d4426e616815b16bc4127f83c9a74940e1ccf3cfe0b387aba0228", size = 358355, upload-time = "2025-08-27T12:13:54.012Z" }, + { url = "https://files.pythonhosted.org/packages/c3/6f/bf142541229374287604caf3bb2a4ae17f0a580798fd72d3b009b532db4e/rpds_py-0.27.1-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:47162fdab9407ec3f160805ac3e154df042e577dd53341745fc7fb3f625e6d92", size = 342138, upload-time = "2025-08-27T12:13:55.791Z" }, + { url = "https://files.pythonhosted.org/packages/1a/77/355b1c041d6be40886c44ff5e798b4e2769e497b790f0f7fd1e78d17e9a8/rpds_py-0.27.1-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fb89bec23fddc489e5d78b550a7b773557c9ab58b7946154a10a6f7a214a48b2", size = 380247, upload-time = "2025-08-27T12:13:57.683Z" }, + { url = "https://files.pythonhosted.org/packages/d6/a4/d9cef5c3946ea271ce2243c51481971cd6e34f21925af2783dd17b26e815/rpds_py-0.27.1-cp313-cp313t-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:e48af21883ded2b3e9eb48cb7880ad8598b31ab752ff3be6457001d78f416723", size = 390699, upload-time = "2025-08-27T12:13:59.137Z" }, + { url = "https://files.pythonhosted.org/packages/3a/06/005106a7b8c6c1a7e91b73169e49870f4af5256119d34a361ae5240a0c1d/rpds_py-0.27.1-cp313-cp313t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:6f5b7bd8e219ed50299e58551a410b64daafb5017d54bbe822e003856f06a802", size = 521852, upload-time = "2025-08-27T12:14:00.583Z" }, + { url = "https://files.pythonhosted.org/packages/e5/3e/50fb1dac0948e17a02eb05c24510a8fe12d5ce8561c6b7b7d1339ab7ab9c/rpds_py-0.27.1-cp313-cp313t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:08f1e20bccf73b08d12d804d6e1c22ca5530e71659e6673bce31a6bb71c1e73f", size = 402582, upload-time = "2025-08-27T12:14:02.034Z" }, + { url = "https://files.pythonhosted.org/packages/cb/b0/f4e224090dc5b0ec15f31a02d746ab24101dd430847c4d99123798661bfc/rpds_py-0.27.1-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0dc5dceeaefcc96dc192e3a80bbe1d6c410c469e97bdd47494a7d930987f18b2", size = 384126, upload-time = "2025-08-27T12:14:03.437Z" }, + { url = "https://files.pythonhosted.org/packages/54/77/ac339d5f82b6afff1df8f0fe0d2145cc827992cb5f8eeb90fc9f31ef7a63/rpds_py-0.27.1-cp313-cp313t-manylinux_2_31_riscv64.whl", hash = "sha256:d76f9cc8665acdc0c9177043746775aa7babbf479b5520b78ae4002d889f5c21", size = 399486, upload-time = "2025-08-27T12:14:05.443Z" }, + { url = "https://files.pythonhosted.org/packages/d6/29/3e1c255eee6ac358c056a57d6d6869baa00a62fa32eea5ee0632039c50a3/rpds_py-0.27.1-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:134fae0e36022edad8290a6661edf40c023562964efea0cc0ec7f5d392d2aaef", size = 414832, upload-time = "2025-08-27T12:14:06.902Z" }, + { url = "https://files.pythonhosted.org/packages/3f/db/6d498b844342deb3fa1d030598db93937a9964fcf5cb4da4feb5f17be34b/rpds_py-0.27.1-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:eb11a4f1b2b63337cfd3b4d110af778a59aae51c81d195768e353d8b52f88081", size = 557249, upload-time = "2025-08-27T12:14:08.37Z" }, + { url = "https://files.pythonhosted.org/packages/60/f3/690dd38e2310b6f68858a331399b4d6dbb9132c3e8ef8b4333b96caf403d/rpds_py-0.27.1-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:13e608ac9f50a0ed4faec0e90ece76ae33b34c0e8656e3dceb9a7db994c692cd", size = 587356, upload-time = "2025-08-27T12:14:10.034Z" }, + { url = "https://files.pythonhosted.org/packages/86/e3/84507781cccd0145f35b1dc32c72675200c5ce8d5b30f813e49424ef68fc/rpds_py-0.27.1-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:dd2135527aa40f061350c3f8f89da2644de26cd73e4de458e79606384f4f68e7", size = 555300, upload-time = "2025-08-27T12:14:11.783Z" }, + { url = "https://files.pythonhosted.org/packages/e5/ee/375469849e6b429b3516206b4580a79e9ef3eb12920ddbd4492b56eaacbe/rpds_py-0.27.1-cp313-cp313t-win32.whl", hash = "sha256:3020724ade63fe320a972e2ffd93b5623227e684315adce194941167fee02688", size = 216714, upload-time = "2025-08-27T12:14:13.629Z" }, + { url = "https://files.pythonhosted.org/packages/21/87/3fc94e47c9bd0742660e84706c311a860dcae4374cf4a03c477e23ce605a/rpds_py-0.27.1-cp313-cp313t-win_amd64.whl", hash = "sha256:8ee50c3e41739886606388ba3ab3ee2aae9f35fb23f833091833255a31740797", size = 228943, upload-time = "2025-08-27T12:14:14.937Z" }, + { url = "https://files.pythonhosted.org/packages/70/36/b6e6066520a07cf029d385de869729a895917b411e777ab1cde878100a1d/rpds_py-0.27.1-cp314-cp314-macosx_10_12_x86_64.whl", hash = "sha256:acb9aafccaae278f449d9c713b64a9e68662e7799dbd5859e2c6b3c67b56d334", size = 362472, upload-time = "2025-08-27T12:14:16.333Z" }, + { url = "https://files.pythonhosted.org/packages/af/07/b4646032e0dcec0df9c73a3bd52f63bc6c5f9cda992f06bd0e73fe3fbebd/rpds_py-0.27.1-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:b7fb801aa7f845ddf601c49630deeeccde7ce10065561d92729bfe81bd21fb33", size = 345676, upload-time = "2025-08-27T12:14:17.764Z" }, + { url = "https://files.pythonhosted.org/packages/b0/16/2f1003ee5d0af4bcb13c0cf894957984c32a6751ed7206db2aee7379a55e/rpds_py-0.27.1-cp314-cp314-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fe0dd05afb46597b9a2e11c351e5e4283c741237e7f617ffb3252780cca9336a", size = 385313, upload-time = "2025-08-27T12:14:19.829Z" }, + { url = "https://files.pythonhosted.org/packages/05/cd/7eb6dd7b232e7f2654d03fa07f1414d7dfc980e82ba71e40a7c46fd95484/rpds_py-0.27.1-cp314-cp314-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:b6dfb0e058adb12d8b1d1b25f686e94ffa65d9995a5157afe99743bf7369d62b", size = 399080, upload-time = "2025-08-27T12:14:21.531Z" }, + { url = "https://files.pythonhosted.org/packages/20/51/5829afd5000ec1cb60f304711f02572d619040aa3ec033d8226817d1e571/rpds_py-0.27.1-cp314-cp314-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ed090ccd235f6fa8bb5861684567f0a83e04f52dfc2e5c05f2e4b1309fcf85e7", size = 523868, upload-time = "2025-08-27T12:14:23.485Z" }, + { url = "https://files.pythonhosted.org/packages/05/2c/30eebca20d5db95720ab4d2faec1b5e4c1025c473f703738c371241476a2/rpds_py-0.27.1-cp314-cp314-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:bf876e79763eecf3e7356f157540d6a093cef395b65514f17a356f62af6cc136", size = 408750, upload-time = "2025-08-27T12:14:24.924Z" }, + { url = "https://files.pythonhosted.org/packages/90/1a/cdb5083f043597c4d4276eae4e4c70c55ab5accec078da8611f24575a367/rpds_py-0.27.1-cp314-cp314-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:12ed005216a51b1d6e2b02a7bd31885fe317e45897de81d86dcce7d74618ffff", size = 387688, upload-time = "2025-08-27T12:14:27.537Z" }, + { url = "https://files.pythonhosted.org/packages/7c/92/cf786a15320e173f945d205ab31585cc43969743bb1a48b6888f7a2b0a2d/rpds_py-0.27.1-cp314-cp314-manylinux_2_31_riscv64.whl", hash = "sha256:ee4308f409a40e50593c7e3bb8cbe0b4d4c66d1674a316324f0c2f5383b486f9", size = 407225, upload-time = "2025-08-27T12:14:28.981Z" }, + { url = "https://files.pythonhosted.org/packages/33/5c/85ee16df5b65063ef26017bef33096557a4c83fbe56218ac7cd8c235f16d/rpds_py-0.27.1-cp314-cp314-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:0b08d152555acf1f455154d498ca855618c1378ec810646fcd7c76416ac6dc60", size = 423361, upload-time = "2025-08-27T12:14:30.469Z" }, + { url = "https://files.pythonhosted.org/packages/4b/8e/1c2741307fcabd1a334ecf008e92c4f47bb6f848712cf15c923becfe82bb/rpds_py-0.27.1-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:dce51c828941973a5684d458214d3a36fcd28da3e1875d659388f4f9f12cc33e", size = 562493, upload-time = "2025-08-27T12:14:31.987Z" }, + { url = "https://files.pythonhosted.org/packages/04/03/5159321baae9b2222442a70c1f988cbbd66b9be0675dd3936461269be360/rpds_py-0.27.1-cp314-cp314-musllinux_1_2_i686.whl", hash = "sha256:c1476d6f29eb81aa4151c9a31219b03f1f798dc43d8af1250a870735516a1212", size = 592623, upload-time = "2025-08-27T12:14:33.543Z" }, + { url = "https://files.pythonhosted.org/packages/ff/39/c09fd1ad28b85bc1d4554a8710233c9f4cefd03d7717a1b8fbfd171d1167/rpds_py-0.27.1-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:3ce0cac322b0d69b63c9cdb895ee1b65805ec9ffad37639f291dd79467bee675", size = 558800, upload-time = "2025-08-27T12:14:35.436Z" }, + { url = "https://files.pythonhosted.org/packages/c5/d6/99228e6bbcf4baa764b18258f519a9035131d91b538d4e0e294313462a98/rpds_py-0.27.1-cp314-cp314-win32.whl", hash = "sha256:dfbfac137d2a3d0725758cd141f878bf4329ba25e34979797c89474a89a8a3a3", size = 221943, upload-time = "2025-08-27T12:14:36.898Z" }, + { url = "https://files.pythonhosted.org/packages/be/07/c802bc6b8e95be83b79bdf23d1aa61d68324cb1006e245d6c58e959e314d/rpds_py-0.27.1-cp314-cp314-win_amd64.whl", hash = "sha256:a6e57b0abfe7cc513450fcf529eb486b6e4d3f8aee83e92eb5f1ef848218d456", size = 233739, upload-time = "2025-08-27T12:14:38.386Z" }, + { url = "https://files.pythonhosted.org/packages/c8/89/3e1b1c16d4c2d547c5717377a8df99aee8099ff050f87c45cb4d5fa70891/rpds_py-0.27.1-cp314-cp314-win_arm64.whl", hash = "sha256:faf8d146f3d476abfee026c4ae3bdd9ca14236ae4e4c310cbd1cf75ba33d24a3", size = 223120, upload-time = "2025-08-27T12:14:39.82Z" }, + { url = "https://files.pythonhosted.org/packages/62/7e/dc7931dc2fa4a6e46b2a4fa744a9fe5c548efd70e0ba74f40b39fa4a8c10/rpds_py-0.27.1-cp314-cp314t-macosx_10_12_x86_64.whl", hash = "sha256:ba81d2b56b6d4911ce735aad0a1d4495e808b8ee4dc58715998741a26874e7c2", size = 358944, upload-time = "2025-08-27T12:14:41.199Z" }, + { url = "https://files.pythonhosted.org/packages/e6/22/4af76ac4e9f336bfb1a5f240d18a33c6b2fcaadb7472ac7680576512b49a/rpds_py-0.27.1-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:84f7d509870098de0e864cad0102711c1e24e9b1a50ee713b65928adb22269e4", size = 342283, upload-time = "2025-08-27T12:14:42.699Z" }, + { url = "https://files.pythonhosted.org/packages/1c/15/2a7c619b3c2272ea9feb9ade67a45c40b3eeb500d503ad4c28c395dc51b4/rpds_py-0.27.1-cp314-cp314t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a9e960fc78fecd1100539f14132425e1d5fe44ecb9239f8f27f079962021523e", size = 380320, upload-time = "2025-08-27T12:14:44.157Z" }, + { url = "https://files.pythonhosted.org/packages/a2/7d/4c6d243ba4a3057e994bb5bedd01b5c963c12fe38dde707a52acdb3849e7/rpds_py-0.27.1-cp314-cp314t-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:62f85b665cedab1a503747617393573995dac4600ff51869d69ad2f39eb5e817", size = 391760, upload-time = "2025-08-27T12:14:45.845Z" }, + { url = "https://files.pythonhosted.org/packages/b4/71/b19401a909b83bcd67f90221330bc1ef11bc486fe4e04c24388d28a618ae/rpds_py-0.27.1-cp314-cp314t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:fed467af29776f6556250c9ed85ea5a4dd121ab56a5f8b206e3e7a4c551e48ec", size = 522476, upload-time = "2025-08-27T12:14:47.364Z" }, + { url = "https://files.pythonhosted.org/packages/e4/44/1a3b9715c0455d2e2f0f6df5ee6d6f5afdc423d0773a8a682ed2b43c566c/rpds_py-0.27.1-cp314-cp314t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f2729615f9d430af0ae6b36cf042cb55c0936408d543fb691e1a9e36648fd35a", size = 403418, upload-time = "2025-08-27T12:14:49.991Z" }, + { url = "https://files.pythonhosted.org/packages/1c/4b/fb6c4f14984eb56673bc868a66536f53417ddb13ed44b391998100a06a96/rpds_py-0.27.1-cp314-cp314t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1b207d881a9aef7ba753d69c123a35d96ca7cb808056998f6b9e8747321f03b8", size = 384771, upload-time = "2025-08-27T12:14:52.159Z" }, + { url = "https://files.pythonhosted.org/packages/c0/56/d5265d2d28b7420d7b4d4d85cad8ef891760f5135102e60d5c970b976e41/rpds_py-0.27.1-cp314-cp314t-manylinux_2_31_riscv64.whl", hash = "sha256:639fd5efec029f99b79ae47e5d7e00ad8a773da899b6309f6786ecaf22948c48", size = 400022, upload-time = "2025-08-27T12:14:53.859Z" }, + { url = "https://files.pythonhosted.org/packages/8f/e9/9f5fc70164a569bdd6ed9046486c3568d6926e3a49bdefeeccfb18655875/rpds_py-0.27.1-cp314-cp314t-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:fecc80cb2a90e28af8a9b366edacf33d7a91cbfe4c2c4544ea1246e949cfebeb", size = 416787, upload-time = "2025-08-27T12:14:55.673Z" }, + { url = "https://files.pythonhosted.org/packages/d4/64/56dd03430ba491db943a81dcdef115a985aac5f44f565cd39a00c766d45c/rpds_py-0.27.1-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:42a89282d711711d0a62d6f57d81aa43a1368686c45bc1c46b7f079d55692734", size = 557538, upload-time = "2025-08-27T12:14:57.245Z" }, + { url = "https://files.pythonhosted.org/packages/3f/36/92cc885a3129993b1d963a2a42ecf64e6a8e129d2c7cc980dbeba84e55fb/rpds_py-0.27.1-cp314-cp314t-musllinux_1_2_i686.whl", hash = "sha256:cf9931f14223de59551ab9d38ed18d92f14f055a5f78c1d8ad6493f735021bbb", size = 588512, upload-time = "2025-08-27T12:14:58.728Z" }, + { url = "https://files.pythonhosted.org/packages/dd/10/6b283707780a81919f71625351182b4f98932ac89a09023cb61865136244/rpds_py-0.27.1-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:f39f58a27cc6e59f432b568ed8429c7e1641324fbe38131de852cd77b2d534b0", size = 555813, upload-time = "2025-08-27T12:15:00.334Z" }, + { url = "https://files.pythonhosted.org/packages/04/2e/30b5ea18c01379da6272a92825dd7e53dc9d15c88a19e97932d35d430ef7/rpds_py-0.27.1-cp314-cp314t-win32.whl", hash = "sha256:d5fa0ee122dc09e23607a28e6d7b150da16c662e66409bbe85230e4c85bb528a", size = 217385, upload-time = "2025-08-27T12:15:01.937Z" }, + { url = "https://files.pythonhosted.org/packages/32/7d/97119da51cb1dd3f2f3c0805f155a3aa4a95fa44fe7d78ae15e69edf4f34/rpds_py-0.27.1-cp314-cp314t-win_amd64.whl", hash = "sha256:6567d2bb951e21232c2f660c24cf3470bb96de56cdcb3f071a83feeaff8a2772", size = 230097, upload-time = "2025-08-27T12:15:03.961Z" }, + { url = "https://files.pythonhosted.org/packages/7f/6c/252e83e1ce7583c81f26d1d884b2074d40a13977e1b6c9c50bbf9a7f1f5a/rpds_py-0.27.1-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:c918c65ec2e42c2a78d19f18c553d77319119bf43aa9e2edf7fb78d624355527", size = 372140, upload-time = "2025-08-27T12:15:05.441Z" }, + { url = "https://files.pythonhosted.org/packages/9d/71/949c195d927c5aeb0d0629d329a20de43a64c423a6aa53836290609ef7ec/rpds_py-0.27.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:1fea2b1a922c47c51fd07d656324531adc787e415c8b116530a1d29c0516c62d", size = 354086, upload-time = "2025-08-27T12:15:07.404Z" }, + { url = "https://files.pythonhosted.org/packages/9f/02/e43e332ad8ce4f6c4342d151a471a7f2900ed1d76901da62eb3762663a71/rpds_py-0.27.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bbf94c58e8e0cd6b6f38d8de67acae41b3a515c26169366ab58bdca4a6883bb8", size = 382117, upload-time = "2025-08-27T12:15:09.275Z" }, + { url = "https://files.pythonhosted.org/packages/d0/05/b0fdeb5b577197ad72812bbdfb72f9a08fa1e64539cc3940b1b781cd3596/rpds_py-0.27.1-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:c2a8fed130ce946d5c585eddc7c8eeef0051f58ac80a8ee43bd17835c144c2cc", size = 394520, upload-time = "2025-08-27T12:15:10.727Z" }, + { url = "https://files.pythonhosted.org/packages/67/1f/4cfef98b2349a7585181e99294fa2a13f0af06902048a5d70f431a66d0b9/rpds_py-0.27.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:037a2361db72ee98d829bc2c5b7cc55598ae0a5e0ec1823a56ea99374cfd73c1", size = 522657, upload-time = "2025-08-27T12:15:12.613Z" }, + { url = "https://files.pythonhosted.org/packages/44/55/ccf37ddc4c6dce7437b335088b5ca18da864b334890e2fe9aa6ddc3f79a9/rpds_py-0.27.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5281ed1cc1d49882f9997981c88df1a22e140ab41df19071222f7e5fc4e72125", size = 402967, upload-time = "2025-08-27T12:15:14.113Z" }, + { url = "https://files.pythonhosted.org/packages/74/e5/5903f92e41e293b07707d5bf00ef39a0eb2af7190aff4beaf581a6591510/rpds_py-0.27.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2fd50659a069c15eef8aa3d64bbef0d69fd27bb4a50c9ab4f17f83a16cbf8905", size = 384372, upload-time = "2025-08-27T12:15:15.842Z" }, + { url = "https://files.pythonhosted.org/packages/8f/e3/fbb409e18aeefc01e49f5922ac63d2d914328430e295c12183ce56ebf76b/rpds_py-0.27.1-cp39-cp39-manylinux_2_31_riscv64.whl", hash = "sha256:c4b676c4ae3921649a15d28ed10025548e9b561ded473aa413af749503c6737e", size = 401264, upload-time = "2025-08-27T12:15:17.388Z" }, + { url = "https://files.pythonhosted.org/packages/55/79/529ad07794e05cb0f38e2f965fc5bb20853d523976719400acecc447ec9d/rpds_py-0.27.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:079bc583a26db831a985c5257797b2b5d3affb0386e7ff886256762f82113b5e", size = 418691, upload-time = "2025-08-27T12:15:19.144Z" }, + { url = "https://files.pythonhosted.org/packages/33/39/6554a7fd6d9906fda2521c6d52f5d723dca123529fb719a5b5e074c15e01/rpds_py-0.27.1-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:4e44099bd522cba71a2c6b97f68e19f40e7d85399de899d66cdb67b32d7cb786", size = 558989, upload-time = "2025-08-27T12:15:21.087Z" }, + { url = "https://files.pythonhosted.org/packages/19/b2/76fa15173b6f9f445e5ef15120871b945fb8dd9044b6b8c7abe87e938416/rpds_py-0.27.1-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:e202e6d4188e53c6661af813b46c37ca2c45e497fc558bacc1a7630ec2695aec", size = 589835, upload-time = "2025-08-27T12:15:22.696Z" }, + { url = "https://files.pythonhosted.org/packages/ee/9e/5560a4b39bab780405bed8a88ee85b30178061d189558a86003548dea045/rpds_py-0.27.1-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:f41f814b8eaa48768d1bb551591f6ba45f87ac76899453e8ccd41dba1289b04b", size = 555227, upload-time = "2025-08-27T12:15:24.278Z" }, + { url = "https://files.pythonhosted.org/packages/52/d7/cd9c36215111aa65724c132bf709c6f35175973e90b32115dedc4ced09cb/rpds_py-0.27.1-cp39-cp39-win32.whl", hash = "sha256:9e71f5a087ead99563c11fdaceee83ee982fd39cf67601f4fd66cb386336ee52", size = 217899, upload-time = "2025-08-27T12:15:25.926Z" }, + { url = "https://files.pythonhosted.org/packages/5b/e0/d75ab7b4dd8ba777f6b365adbdfc7614bbfe7c5f05703031dfa4b61c3d6c/rpds_py-0.27.1-cp39-cp39-win_amd64.whl", hash = "sha256:71108900c9c3c8590697244b9519017a400d9ba26a36c48381b3f64743a44aab", size = 228725, upload-time = "2025-08-27T12:15:27.398Z" }, + { url = "https://files.pythonhosted.org/packages/d5/63/b7cc415c345625d5e62f694ea356c58fb964861409008118f1245f8c3347/rpds_py-0.27.1-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:7ba22cb9693df986033b91ae1d7a979bc399237d45fccf875b76f62bb9e52ddf", size = 371360, upload-time = "2025-08-27T12:15:29.218Z" }, + { url = "https://files.pythonhosted.org/packages/e5/8c/12e1b24b560cf378b8ffbdb9dc73abd529e1adcfcf82727dfd29c4a7b88d/rpds_py-0.27.1-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:5b640501be9288c77738b5492b3fd3abc4ba95c50c2e41273c8a1459f08298d3", size = 353933, upload-time = "2025-08-27T12:15:30.837Z" }, + { url = "https://files.pythonhosted.org/packages/9b/85/1bb2210c1f7a1b99e91fea486b9f0f894aa5da3a5ec7097cbad7dec6d40f/rpds_py-0.27.1-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fb08b65b93e0c6dd70aac7f7890a9c0938d5ec71d5cb32d45cf844fb8ae47636", size = 382962, upload-time = "2025-08-27T12:15:32.348Z" }, + { url = "https://files.pythonhosted.org/packages/cc/c9/a839b9f219cf80ed65f27a7f5ddbb2809c1b85c966020ae2dff490e0b18e/rpds_py-0.27.1-pp310-pypy310_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:d7ff07d696a7a38152ebdb8212ca9e5baab56656749f3d6004b34ab726b550b8", size = 394412, upload-time = "2025-08-27T12:15:33.839Z" }, + { url = "https://files.pythonhosted.org/packages/02/2d/b1d7f928b0b1f4fc2e0133e8051d199b01d7384875adc63b6ddadf3de7e5/rpds_py-0.27.1-pp310-pypy310_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:fb7c72262deae25366e3b6c0c0ba46007967aea15d1eea746e44ddba8ec58dcc", size = 523972, upload-time = "2025-08-27T12:15:35.377Z" }, + { url = "https://files.pythonhosted.org/packages/a9/af/2cbf56edd2d07716df1aec8a726b3159deb47cb5c27e1e42b71d705a7c2f/rpds_py-0.27.1-pp310-pypy310_pp73-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7b002cab05d6339716b03a4a3a2ce26737f6231d7b523f339fa061d53368c9d8", size = 403273, upload-time = "2025-08-27T12:15:37.051Z" }, + { url = "https://files.pythonhosted.org/packages/c0/93/425e32200158d44ff01da5d9612c3b6711fe69f606f06e3895511f17473b/rpds_py-0.27.1-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:23f6b69d1c26c4704fec01311963a41d7de3ee0570a84ebde4d544e5a1859ffc", size = 385278, upload-time = "2025-08-27T12:15:38.571Z" }, + { url = "https://files.pythonhosted.org/packages/eb/1a/1a04a915ecd0551bfa9e77b7672d1937b4b72a0fc204a17deef76001cfb2/rpds_py-0.27.1-pp310-pypy310_pp73-manylinux_2_31_riscv64.whl", hash = "sha256:530064db9146b247351f2a0250b8f00b289accea4596a033e94be2389977de71", size = 402084, upload-time = "2025-08-27T12:15:40.529Z" }, + { url = "https://files.pythonhosted.org/packages/51/f7/66585c0fe5714368b62951d2513b684e5215beaceab2c6629549ddb15036/rpds_py-0.27.1-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:7b90b0496570bd6b0321724a330d8b545827c4df2034b6ddfc5f5275f55da2ad", size = 419041, upload-time = "2025-08-27T12:15:42.191Z" }, + { url = "https://files.pythonhosted.org/packages/8e/7e/83a508f6b8e219bba2d4af077c35ba0e0cdd35a751a3be6a7cba5a55ad71/rpds_py-0.27.1-pp310-pypy310_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:879b0e14a2da6a1102a3fc8af580fc1ead37e6d6692a781bd8c83da37429b5ab", size = 560084, upload-time = "2025-08-27T12:15:43.839Z" }, + { url = "https://files.pythonhosted.org/packages/66/66/bb945683b958a1b19eb0fe715594630d0f36396ebdef4d9b89c2fa09aa56/rpds_py-0.27.1-pp310-pypy310_pp73-musllinux_1_2_i686.whl", hash = "sha256:0d807710df3b5faa66c731afa162ea29717ab3be17bdc15f90f2d9f183da4059", size = 590115, upload-time = "2025-08-27T12:15:46.647Z" }, + { url = "https://files.pythonhosted.org/packages/12/00/ccfaafaf7db7e7adace915e5c2f2c2410e16402561801e9c7f96683002d3/rpds_py-0.27.1-pp310-pypy310_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:3adc388fc3afb6540aec081fa59e6e0d3908722771aa1e37ffe22b220a436f0b", size = 556561, upload-time = "2025-08-27T12:15:48.219Z" }, + { url = "https://files.pythonhosted.org/packages/e1/b7/92b6ed9aad103bfe1c45df98453dfae40969eef2cb6c6239c58d7e96f1b3/rpds_py-0.27.1-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:c796c0c1cc68cb08b0284db4229f5af76168172670c74908fdbd4b7d7f515819", size = 229125, upload-time = "2025-08-27T12:15:49.956Z" }, + { url = "https://files.pythonhosted.org/packages/0c/ed/e1fba02de17f4f76318b834425257c8ea297e415e12c68b4361f63e8ae92/rpds_py-0.27.1-pp311-pypy311_pp73-macosx_10_12_x86_64.whl", hash = "sha256:cdfe4bb2f9fe7458b7453ad3c33e726d6d1c7c0a72960bcc23800d77384e42df", size = 371402, upload-time = "2025-08-27T12:15:51.561Z" }, + { url = "https://files.pythonhosted.org/packages/af/7c/e16b959b316048b55585a697e94add55a4ae0d984434d279ea83442e460d/rpds_py-0.27.1-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:8fabb8fd848a5f75a2324e4a84501ee3a5e3c78d8603f83475441866e60b94a3", size = 354084, upload-time = "2025-08-27T12:15:53.219Z" }, + { url = "https://files.pythonhosted.org/packages/de/c1/ade645f55de76799fdd08682d51ae6724cb46f318573f18be49b1e040428/rpds_py-0.27.1-pp311-pypy311_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:eda8719d598f2f7f3e0f885cba8646644b55a187762bec091fa14a2b819746a9", size = 383090, upload-time = "2025-08-27T12:15:55.158Z" }, + { url = "https://files.pythonhosted.org/packages/1f/27/89070ca9b856e52960da1472efcb6c20ba27cfe902f4f23ed095b9cfc61d/rpds_py-0.27.1-pp311-pypy311_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:3c64d07e95606ec402a0a1c511fe003873fa6af630bda59bac77fac8b4318ebc", size = 394519, upload-time = "2025-08-27T12:15:57.238Z" }, + { url = "https://files.pythonhosted.org/packages/b3/28/be120586874ef906aa5aeeae95ae8df4184bc757e5b6bd1c729ccff45ed5/rpds_py-0.27.1-pp311-pypy311_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:93a2ed40de81bcff59aabebb626562d48332f3d028ca2036f1d23cbb52750be4", size = 523817, upload-time = "2025-08-27T12:15:59.237Z" }, + { url = "https://files.pythonhosted.org/packages/a8/ef/70cc197bc11cfcde02a86f36ac1eed15c56667c2ebddbdb76a47e90306da/rpds_py-0.27.1-pp311-pypy311_pp73-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:387ce8c44ae94e0ec50532d9cb0edce17311024c9794eb196b90e1058aadeb66", size = 403240, upload-time = "2025-08-27T12:16:00.923Z" }, + { url = "https://files.pythonhosted.org/packages/cf/35/46936cca449f7f518f2f4996e0e8344db4b57e2081e752441154089d2a5f/rpds_py-0.27.1-pp311-pypy311_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:aaf94f812c95b5e60ebaf8bfb1898a7d7cb9c1af5744d4a67fa47796e0465d4e", size = 385194, upload-time = "2025-08-27T12:16:02.802Z" }, + { url = "https://files.pythonhosted.org/packages/e1/62/29c0d3e5125c3270b51415af7cbff1ec587379c84f55a5761cc9efa8cd06/rpds_py-0.27.1-pp311-pypy311_pp73-manylinux_2_31_riscv64.whl", hash = "sha256:4848ca84d6ded9b58e474dfdbad4b8bfb450344c0551ddc8d958bf4b36aa837c", size = 402086, upload-time = "2025-08-27T12:16:04.806Z" }, + { url = "https://files.pythonhosted.org/packages/8f/66/03e1087679227785474466fdd04157fb793b3b76e3fcf01cbf4c693c1949/rpds_py-0.27.1-pp311-pypy311_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:2bde09cbcf2248b73c7c323be49b280180ff39fadcfe04e7b6f54a678d02a7cf", size = 419272, upload-time = "2025-08-27T12:16:06.471Z" }, + { url = "https://files.pythonhosted.org/packages/6a/24/e3e72d265121e00b063aef3e3501e5b2473cf1b23511d56e529531acf01e/rpds_py-0.27.1-pp311-pypy311_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:94c44ee01fd21c9058f124d2d4f0c9dc7634bec93cd4b38eefc385dabe71acbf", size = 560003, upload-time = "2025-08-27T12:16:08.06Z" }, + { url = "https://files.pythonhosted.org/packages/26/ca/f5a344c534214cc2d41118c0699fffbdc2c1bc7046f2a2b9609765ab9c92/rpds_py-0.27.1-pp311-pypy311_pp73-musllinux_1_2_i686.whl", hash = "sha256:df8b74962e35c9249425d90144e721eed198e6555a0e22a563d29fe4486b51f6", size = 590482, upload-time = "2025-08-27T12:16:10.137Z" }, + { url = "https://files.pythonhosted.org/packages/ce/08/4349bdd5c64d9d193c360aa9db89adeee6f6682ab8825dca0a3f535f434f/rpds_py-0.27.1-pp311-pypy311_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:dc23e6820e3b40847e2f4a7726462ba0cf53089512abe9ee16318c366494c17a", size = 556523, upload-time = "2025-08-27T12:16:12.188Z" }, + { url = "https://files.pythonhosted.org/packages/4e/ea/5463cd5048a7a2fcdae308b6e96432802132c141bfb9420260142632a0f1/rpds_py-0.27.1-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:aa8933159edc50be265ed22b401125c9eebff3171f570258854dbce3ecd55475", size = 371778, upload-time = "2025-08-27T12:16:13.851Z" }, + { url = "https://files.pythonhosted.org/packages/0d/c8/f38c099db07f5114029c1467649d308543906933eebbc226d4527a5f4693/rpds_py-0.27.1-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:a50431bf02583e21bf273c71b89d710e7a710ad5e39c725b14e685610555926f", size = 354394, upload-time = "2025-08-27T12:16:15.609Z" }, + { url = "https://files.pythonhosted.org/packages/7d/79/b76f97704d9dd8ddbd76fed4c4048153a847c5d6003afe20a6b5c3339065/rpds_py-0.27.1-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:78af06ddc7fe5cc0e967085a9115accee665fb912c22a3f54bad70cc65b05fe6", size = 382348, upload-time = "2025-08-27T12:16:17.251Z" }, + { url = "https://files.pythonhosted.org/packages/8a/3f/ef23d3c1be1b837b648a3016d5bbe7cfe711422ad110b4081c0a90ef5a53/rpds_py-0.27.1-pp39-pypy39_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:70d0738ef8fee13c003b100c2fbd667ec4f133468109b3472d249231108283a3", size = 394159, upload-time = "2025-08-27T12:16:19.251Z" }, + { url = "https://files.pythonhosted.org/packages/74/8a/9e62693af1a34fd28b1a190d463d12407bd7cf561748cb4745845d9548d3/rpds_py-0.27.1-pp39-pypy39_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e2f6fd8a1cea5bbe599b6e78a6e5ee08db434fc8ffea51ff201c8765679698b3", size = 522775, upload-time = "2025-08-27T12:16:20.929Z" }, + { url = "https://files.pythonhosted.org/packages/36/0d/8d5bb122bf7a60976b54c5c99a739a3819f49f02d69df3ea2ca2aff47d5c/rpds_py-0.27.1-pp39-pypy39_pp73-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8177002868d1426305bb5de1e138161c2ec9eb2d939be38291d7c431c4712df8", size = 402633, upload-time = "2025-08-27T12:16:22.548Z" }, + { url = "https://files.pythonhosted.org/packages/0f/0e/237948c1f425e23e0cf5a566d702652a6e55c6f8fbd332a1792eb7043daf/rpds_py-0.27.1-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:008b839781d6c9bf3b6a8984d1d8e56f0ec46dc56df61fd669c49b58ae800400", size = 384867, upload-time = "2025-08-27T12:16:24.29Z" }, + { url = "https://files.pythonhosted.org/packages/d6/0a/da0813efcd998d260cbe876d97f55b0f469ada8ba9cbc47490a132554540/rpds_py-0.27.1-pp39-pypy39_pp73-manylinux_2_31_riscv64.whl", hash = "sha256:a55b9132bb1ade6c734ddd2759c8dc132aa63687d259e725221f106b83a0e485", size = 401791, upload-time = "2025-08-27T12:16:25.954Z" }, + { url = "https://files.pythonhosted.org/packages/51/78/c6c9e8a8aaca416a6f0d1b6b4a6ee35b88fe2c5401d02235d0a056eceed2/rpds_py-0.27.1-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:a46fdec0083a26415f11d5f236b79fa1291c32aaa4a17684d82f7017a1f818b1", size = 419525, upload-time = "2025-08-27T12:16:27.659Z" }, + { url = "https://files.pythonhosted.org/packages/a3/69/5af37e1d71487cf6d56dd1420dc7e0c2732c1b6ff612aa7a88374061c0a8/rpds_py-0.27.1-pp39-pypy39_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:8a63b640a7845f2bdd232eb0d0a4a2dd939bcdd6c57e6bb134526487f3160ec5", size = 559255, upload-time = "2025-08-27T12:16:29.343Z" }, + { url = "https://files.pythonhosted.org/packages/40/7f/8b7b136069ef7ac3960eda25d832639bdb163018a34c960ed042dd1707c8/rpds_py-0.27.1-pp39-pypy39_pp73-musllinux_1_2_i686.whl", hash = "sha256:7e32721e5d4922deaaf963469d795d5bde6093207c52fec719bd22e5d1bedbc4", size = 590384, upload-time = "2025-08-27T12:16:31.005Z" }, + { url = "https://files.pythonhosted.org/packages/d8/06/c316d3f6ff03f43ccb0eba7de61376f8ec4ea850067dddfafe98274ae13c/rpds_py-0.27.1-pp39-pypy39_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:2c426b99a068601b5f4623573df7a7c3d72e87533a2dd2253353a03e7502566c", size = 555959, upload-time = "2025-08-27T12:16:32.73Z" }, + { url = "https://files.pythonhosted.org/packages/60/94/384cf54c430b9dac742bbd2ec26c23feb78ded0d43d6d78563a281aec017/rpds_py-0.27.1-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:4fc9b7fe29478824361ead6e14e4f5aed570d477e06088826537e202d25fe859", size = 228784, upload-time = "2025-08-27T12:16:34.428Z" }, +] + +[[package]] +name = "rpds-py" +version = "0.30.0" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version >= '3.14'", + "python_full_version >= '3.11' and python_full_version < '3.14'", + "python_full_version == '3.10.*'", +] +sdist = { url = "https://files.pythonhosted.org/packages/20/af/3f2f423103f1113b36230496629986e0ef7e199d2aa8392452b484b38ced/rpds_py-0.30.0.tar.gz", hash = "sha256:dd8ff7cf90014af0c0f787eea34794ebf6415242ee1d6fa91eaba725cc441e84", size = 69469, upload-time = "2025-11-30T20:24:38.837Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/06/0c/0c411a0ec64ccb6d104dcabe0e713e05e153a9a2c3c2bd2b32ce412166fe/rpds_py-0.30.0-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:679ae98e00c0e8d68a7fda324e16b90fd5260945b45d3b824c892cec9eea3288", size = 370490, upload-time = "2025-11-30T20:21:33.256Z" }, + { url = "https://files.pythonhosted.org/packages/19/6a/4ba3d0fb7297ebae71171822554abe48d7cab29c28b8f9f2c04b79988c05/rpds_py-0.30.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:4cc2206b76b4f576934f0ed374b10d7ca5f457858b157ca52064bdfc26b9fc00", size = 359751, upload-time = "2025-11-30T20:21:34.591Z" }, + { url = "https://files.pythonhosted.org/packages/cd/7c/e4933565ef7f7a0818985d87c15d9d273f1a649afa6a52ea35ad011195ea/rpds_py-0.30.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:389a2d49eded1896c3d48b0136ead37c48e221b391c052fba3f4055c367f60a6", size = 389696, upload-time = "2025-11-30T20:21:36.122Z" }, + { url = "https://files.pythonhosted.org/packages/5e/01/6271a2511ad0815f00f7ed4390cf2567bec1d4b1da39e2c27a41e6e3b4de/rpds_py-0.30.0-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:32c8528634e1bf7121f3de08fa85b138f4e0dc47657866630611b03967f041d7", size = 403136, upload-time = "2025-11-30T20:21:37.728Z" }, + { url = "https://files.pythonhosted.org/packages/55/64/c857eb7cd7541e9b4eee9d49c196e833128a55b89a9850a9c9ac33ccf897/rpds_py-0.30.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f207f69853edd6f6700b86efb84999651baf3789e78a466431df1331608e5324", size = 524699, upload-time = "2025-11-30T20:21:38.92Z" }, + { url = "https://files.pythonhosted.org/packages/9c/ed/94816543404078af9ab26159c44f9e98e20fe47e2126d5d32c9d9948d10a/rpds_py-0.30.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:67b02ec25ba7a9e8fa74c63b6ca44cf5707f2fbfadae3ee8e7494297d56aa9df", size = 412022, upload-time = "2025-11-30T20:21:40.407Z" }, + { url = "https://files.pythonhosted.org/packages/61/b5/707f6cf0066a6412aacc11d17920ea2e19e5b2f04081c64526eb35b5c6e7/rpds_py-0.30.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0c0e95f6819a19965ff420f65578bacb0b00f251fefe2c8b23347c37174271f3", size = 390522, upload-time = "2025-11-30T20:21:42.17Z" }, + { url = "https://files.pythonhosted.org/packages/13/4e/57a85fda37a229ff4226f8cbcf09f2a455d1ed20e802ce5b2b4a7f5ed053/rpds_py-0.30.0-cp310-cp310-manylinux_2_31_riscv64.whl", hash = "sha256:a452763cc5198f2f98898eb98f7569649fe5da666c2dc6b5ddb10fde5a574221", size = 404579, upload-time = "2025-11-30T20:21:43.769Z" }, + { url = "https://files.pythonhosted.org/packages/f9/da/c9339293513ec680a721e0e16bf2bac3db6e5d7e922488de471308349bba/rpds_py-0.30.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:e0b65193a413ccc930671c55153a03ee57cecb49e6227204b04fae512eb657a7", size = 421305, upload-time = "2025-11-30T20:21:44.994Z" }, + { url = "https://files.pythonhosted.org/packages/f9/be/522cb84751114f4ad9d822ff5a1aa3c98006341895d5f084779b99596e5c/rpds_py-0.30.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:858738e9c32147f78b3ac24dc0edb6610000e56dc0f700fd5f651d0a0f0eb9ff", size = 572503, upload-time = "2025-11-30T20:21:46.91Z" }, + { url = "https://files.pythonhosted.org/packages/a2/9b/de879f7e7ceddc973ea6e4629e9b380213a6938a249e94b0cdbcc325bb66/rpds_py-0.30.0-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:da279aa314f00acbb803da1e76fa18666778e8a8f83484fba94526da5de2cba7", size = 598322, upload-time = "2025-11-30T20:21:48.709Z" }, + { url = "https://files.pythonhosted.org/packages/48/ac/f01fc22efec3f37d8a914fc1b2fb9bcafd56a299edbe96406f3053edea5a/rpds_py-0.30.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:7c64d38fb49b6cdeda16ab49e35fe0da2e1e9b34bc38bd78386530f218b37139", size = 560792, upload-time = "2025-11-30T20:21:50.024Z" }, + { url = "https://files.pythonhosted.org/packages/e2/da/4e2b19d0f131f35b6146425f846563d0ce036763e38913d917187307a671/rpds_py-0.30.0-cp310-cp310-win32.whl", hash = "sha256:6de2a32a1665b93233cde140ff8b3467bdb9e2af2b91079f0333a0974d12d464", size = 221901, upload-time = "2025-11-30T20:21:51.32Z" }, + { url = "https://files.pythonhosted.org/packages/96/cb/156d7a5cf4f78a7cc571465d8aec7a3c447c94f6749c5123f08438bcf7bc/rpds_py-0.30.0-cp310-cp310-win_amd64.whl", hash = "sha256:1726859cd0de969f88dc8673bdd954185b9104e05806be64bcd87badbe313169", size = 235823, upload-time = "2025-11-30T20:21:52.505Z" }, + { url = "https://files.pythonhosted.org/packages/4d/6e/f964e88b3d2abee2a82c1ac8366da848fce1c6d834dc2132c3fda3970290/rpds_py-0.30.0-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:a2bffea6a4ca9f01b3f8e548302470306689684e61602aa3d141e34da06cf425", size = 370157, upload-time = "2025-11-30T20:21:53.789Z" }, + { url = "https://files.pythonhosted.org/packages/94/ba/24e5ebb7c1c82e74c4e4f33b2112a5573ddc703915b13a073737b59b86e0/rpds_py-0.30.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:dc4f992dfe1e2bc3ebc7444f6c7051b4bc13cd8e33e43511e8ffd13bf407010d", size = 359676, upload-time = "2025-11-30T20:21:55.475Z" }, + { url = "https://files.pythonhosted.org/packages/84/86/04dbba1b087227747d64d80c3b74df946b986c57af0a9f0c98726d4d7a3b/rpds_py-0.30.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:422c3cb9856d80b09d30d2eb255d0754b23e090034e1deb4083f8004bd0761e4", size = 389938, upload-time = "2025-11-30T20:21:57.079Z" }, + { url = "https://files.pythonhosted.org/packages/42/bb/1463f0b1722b7f45431bdd468301991d1328b16cffe0b1c2918eba2c4eee/rpds_py-0.30.0-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:07ae8a593e1c3c6b82ca3292efbe73c30b61332fd612e05abee07c79359f292f", size = 402932, upload-time = "2025-11-30T20:21:58.47Z" }, + { url = "https://files.pythonhosted.org/packages/99/ee/2520700a5c1f2d76631f948b0736cdf9b0acb25abd0ca8e889b5c62ac2e3/rpds_py-0.30.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:12f90dd7557b6bd57f40abe7747e81e0c0b119bef015ea7726e69fe550e394a4", size = 525830, upload-time = "2025-11-30T20:21:59.699Z" }, + { url = "https://files.pythonhosted.org/packages/e0/ad/bd0331f740f5705cc555a5e17fdf334671262160270962e69a2bdef3bf76/rpds_py-0.30.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:99b47d6ad9a6da00bec6aabe5a6279ecd3c06a329d4aa4771034a21e335c3a97", size = 412033, upload-time = "2025-11-30T20:22:00.991Z" }, + { url = "https://files.pythonhosted.org/packages/f8/1e/372195d326549bb51f0ba0f2ecb9874579906b97e08880e7a65c3bef1a99/rpds_py-0.30.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:33f559f3104504506a44bb666b93a33f5d33133765b0c216a5bf2f1e1503af89", size = 390828, upload-time = "2025-11-30T20:22:02.723Z" }, + { url = "https://files.pythonhosted.org/packages/ab/2b/d88bb33294e3e0c76bc8f351a3721212713629ffca1700fa94979cb3eae8/rpds_py-0.30.0-cp311-cp311-manylinux_2_31_riscv64.whl", hash = "sha256:946fe926af6e44f3697abbc305ea168c2c31d3e3ef1058cf68f379bf0335a78d", size = 404683, upload-time = "2025-11-30T20:22:04.367Z" }, + { url = "https://files.pythonhosted.org/packages/50/32/c759a8d42bcb5289c1fac697cd92f6fe01a018dd937e62ae77e0e7f15702/rpds_py-0.30.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:495aeca4b93d465efde585977365187149e75383ad2684f81519f504f5c13038", size = 421583, upload-time = "2025-11-30T20:22:05.814Z" }, + { url = "https://files.pythonhosted.org/packages/2b/81/e729761dbd55ddf5d84ec4ff1f47857f4374b0f19bdabfcf929164da3e24/rpds_py-0.30.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:d9a0ca5da0386dee0655b4ccdf46119df60e0f10da268d04fe7cc87886872ba7", size = 572496, upload-time = "2025-11-30T20:22:07.713Z" }, + { url = "https://files.pythonhosted.org/packages/14/f6/69066a924c3557c9c30baa6ec3a0aa07526305684c6f86c696b08860726c/rpds_py-0.30.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:8d6d1cc13664ec13c1b84241204ff3b12f9bb82464b8ad6e7a5d3486975c2eed", size = 598669, upload-time = "2025-11-30T20:22:09.312Z" }, + { url = "https://files.pythonhosted.org/packages/5f/48/905896b1eb8a05630d20333d1d8ffd162394127b74ce0b0784ae04498d32/rpds_py-0.30.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:3896fa1be39912cf0757753826bc8bdc8ca331a28a7c4ae46b7a21280b06bb85", size = 561011, upload-time = "2025-11-30T20:22:11.309Z" }, + { url = "https://files.pythonhosted.org/packages/22/16/cd3027c7e279d22e5eb431dd3c0fbc677bed58797fe7581e148f3f68818b/rpds_py-0.30.0-cp311-cp311-win32.whl", hash = "sha256:55f66022632205940f1827effeff17c4fa7ae1953d2b74a8581baaefb7d16f8c", size = 221406, upload-time = "2025-11-30T20:22:13.101Z" }, + { url = "https://files.pythonhosted.org/packages/fa/5b/e7b7aa136f28462b344e652ee010d4de26ee9fd16f1bfd5811f5153ccf89/rpds_py-0.30.0-cp311-cp311-win_amd64.whl", hash = "sha256:a51033ff701fca756439d641c0ad09a41d9242fa69121c7d8769604a0a629825", size = 236024, upload-time = "2025-11-30T20:22:14.853Z" }, + { url = "https://files.pythonhosted.org/packages/14/a6/364bba985e4c13658edb156640608f2c9e1d3ea3c81b27aa9d889fff0e31/rpds_py-0.30.0-cp311-cp311-win_arm64.whl", hash = "sha256:47b0ef6231c58f506ef0b74d44e330405caa8428e770fec25329ed2cb971a229", size = 229069, upload-time = "2025-11-30T20:22:16.577Z" }, + { url = "https://files.pythonhosted.org/packages/03/e7/98a2f4ac921d82f33e03f3835f5bf3a4a40aa1bfdc57975e74a97b2b4bdd/rpds_py-0.30.0-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:a161f20d9a43006833cd7068375a94d035714d73a172b681d8881820600abfad", size = 375086, upload-time = "2025-11-30T20:22:17.93Z" }, + { url = "https://files.pythonhosted.org/packages/4d/a1/bca7fd3d452b272e13335db8d6b0b3ecde0f90ad6f16f3328c6fb150c889/rpds_py-0.30.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:6abc8880d9d036ecaafe709079969f56e876fcf107f7a8e9920ba6d5a3878d05", size = 359053, upload-time = "2025-11-30T20:22:19.297Z" }, + { url = "https://files.pythonhosted.org/packages/65/1c/ae157e83a6357eceff62ba7e52113e3ec4834a84cfe07fa4b0757a7d105f/rpds_py-0.30.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ca28829ae5f5d569bb62a79512c842a03a12576375d5ece7d2cadf8abe96ec28", size = 390763, upload-time = "2025-11-30T20:22:21.661Z" }, + { url = "https://files.pythonhosted.org/packages/d4/36/eb2eb8515e2ad24c0bd43c3ee9cd74c33f7ca6430755ccdb240fd3144c44/rpds_py-0.30.0-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:a1010ed9524c73b94d15919ca4d41d8780980e1765babf85f9a2f90d247153dd", size = 408951, upload-time = "2025-11-30T20:22:23.408Z" }, + { url = "https://files.pythonhosted.org/packages/d6/65/ad8dc1784a331fabbd740ef6f71ce2198c7ed0890dab595adb9ea2d775a1/rpds_py-0.30.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f8d1736cfb49381ba528cd5baa46f82fdc65c06e843dab24dd70b63d09121b3f", size = 514622, upload-time = "2025-11-30T20:22:25.16Z" }, + { url = "https://files.pythonhosted.org/packages/63/8e/0cfa7ae158e15e143fe03993b5bcd743a59f541f5952e1546b1ac1b5fd45/rpds_py-0.30.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d948b135c4693daff7bc2dcfc4ec57237a29bd37e60c2fabf5aff2bbacf3e2f1", size = 414492, upload-time = "2025-11-30T20:22:26.505Z" }, + { url = "https://files.pythonhosted.org/packages/60/1b/6f8f29f3f995c7ffdde46a626ddccd7c63aefc0efae881dc13b6e5d5bb16/rpds_py-0.30.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:47f236970bccb2233267d89173d3ad2703cd36a0e2a6e92d0560d333871a3d23", size = 394080, upload-time = "2025-11-30T20:22:27.934Z" }, + { url = "https://files.pythonhosted.org/packages/6d/d5/a266341051a7a3ca2f4b750a3aa4abc986378431fc2da508c5034d081b70/rpds_py-0.30.0-cp312-cp312-manylinux_2_31_riscv64.whl", hash = "sha256:2e6ecb5a5bcacf59c3f912155044479af1d0b6681280048b338b28e364aca1f6", size = 408680, upload-time = "2025-11-30T20:22:29.341Z" }, + { url = "https://files.pythonhosted.org/packages/10/3b/71b725851df9ab7a7a4e33cf36d241933da66040d195a84781f49c50490c/rpds_py-0.30.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:a8fa71a2e078c527c3e9dc9fc5a98c9db40bcc8a92b4e8858e36d329f8684b51", size = 423589, upload-time = "2025-11-30T20:22:31.469Z" }, + { url = "https://files.pythonhosted.org/packages/00/2b/e59e58c544dc9bd8bd8384ecdb8ea91f6727f0e37a7131baeff8d6f51661/rpds_py-0.30.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:73c67f2db7bc334e518d097c6d1e6fed021bbc9b7d678d6cc433478365d1d5f5", size = 573289, upload-time = "2025-11-30T20:22:32.997Z" }, + { url = "https://files.pythonhosted.org/packages/da/3e/a18e6f5b460893172a7d6a680e86d3b6bc87a54c1f0b03446a3c8c7b588f/rpds_py-0.30.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:5ba103fb455be00f3b1c2076c9d4264bfcb037c976167a6047ed82f23153f02e", size = 599737, upload-time = "2025-11-30T20:22:34.419Z" }, + { url = "https://files.pythonhosted.org/packages/5c/e2/714694e4b87b85a18e2c243614974413c60aa107fd815b8cbc42b873d1d7/rpds_py-0.30.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:7cee9c752c0364588353e627da8a7e808a66873672bcb5f52890c33fd965b394", size = 563120, upload-time = "2025-11-30T20:22:35.903Z" }, + { url = "https://files.pythonhosted.org/packages/6f/ab/d5d5e3bcedb0a77f4f613706b750e50a5a3ba1c15ccd3665ecc636c968fd/rpds_py-0.30.0-cp312-cp312-win32.whl", hash = "sha256:1ab5b83dbcf55acc8b08fc62b796ef672c457b17dbd7820a11d6c52c06839bdf", size = 223782, upload-time = "2025-11-30T20:22:37.271Z" }, + { url = "https://files.pythonhosted.org/packages/39/3b/f786af9957306fdc38a74cef405b7b93180f481fb48453a114bb6465744a/rpds_py-0.30.0-cp312-cp312-win_amd64.whl", hash = "sha256:a090322ca841abd453d43456ac34db46e8b05fd9b3b4ac0c78bcde8b089f959b", size = 240463, upload-time = "2025-11-30T20:22:39.021Z" }, + { url = "https://files.pythonhosted.org/packages/f3/d2/b91dc748126c1559042cfe41990deb92c4ee3e2b415f6b5234969ffaf0cc/rpds_py-0.30.0-cp312-cp312-win_arm64.whl", hash = "sha256:669b1805bd639dd2989b281be2cfd951c6121b65e729d9b843e9639ef1fd555e", size = 230868, upload-time = "2025-11-30T20:22:40.493Z" }, + { url = "https://files.pythonhosted.org/packages/ed/dc/d61221eb88ff410de3c49143407f6f3147acf2538c86f2ab7ce65ae7d5f9/rpds_py-0.30.0-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:f83424d738204d9770830d35290ff3273fbb02b41f919870479fab14b9d303b2", size = 374887, upload-time = "2025-11-30T20:22:41.812Z" }, + { url = "https://files.pythonhosted.org/packages/fd/32/55fb50ae104061dbc564ef15cc43c013dc4a9f4527a1f4d99baddf56fe5f/rpds_py-0.30.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:e7536cd91353c5273434b4e003cbda89034d67e7710eab8761fd918ec6c69cf8", size = 358904, upload-time = "2025-11-30T20:22:43.479Z" }, + { url = "https://files.pythonhosted.org/packages/58/70/faed8186300e3b9bdd138d0273109784eea2396c68458ed580f885dfe7ad/rpds_py-0.30.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2771c6c15973347f50fece41fc447c054b7ac2ae0502388ce3b6738cd366e3d4", size = 389945, upload-time = "2025-11-30T20:22:44.819Z" }, + { url = "https://files.pythonhosted.org/packages/bd/a8/073cac3ed2c6387df38f71296d002ab43496a96b92c823e76f46b8af0543/rpds_py-0.30.0-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:0a59119fc6e3f460315fe9d08149f8102aa322299deaa5cab5b40092345c2136", size = 407783, upload-time = "2025-11-30T20:22:46.103Z" }, + { url = "https://files.pythonhosted.org/packages/77/57/5999eb8c58671f1c11eba084115e77a8899d6e694d2a18f69f0ba471ec8b/rpds_py-0.30.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:76fec018282b4ead0364022e3c54b60bf368b9d926877957a8624b58419169b7", size = 515021, upload-time = "2025-11-30T20:22:47.458Z" }, + { url = "https://files.pythonhosted.org/packages/e0/af/5ab4833eadc36c0a8ed2bc5c0de0493c04f6c06de223170bd0798ff98ced/rpds_py-0.30.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:692bef75a5525db97318e8cd061542b5a79812d711ea03dbc1f6f8dbb0c5f0d2", size = 414589, upload-time = "2025-11-30T20:22:48.872Z" }, + { url = "https://files.pythonhosted.org/packages/b7/de/f7192e12b21b9e9a68a6d0f249b4af3fdcdff8418be0767a627564afa1f1/rpds_py-0.30.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9027da1ce107104c50c81383cae773ef5c24d296dd11c99e2629dbd7967a20c6", size = 394025, upload-time = "2025-11-30T20:22:50.196Z" }, + { url = "https://files.pythonhosted.org/packages/91/c4/fc70cd0249496493500e7cc2de87504f5aa6509de1e88623431fec76d4b6/rpds_py-0.30.0-cp313-cp313-manylinux_2_31_riscv64.whl", hash = "sha256:9cf69cdda1f5968a30a359aba2f7f9aa648a9ce4b580d6826437f2b291cfc86e", size = 408895, upload-time = "2025-11-30T20:22:51.87Z" }, + { url = "https://files.pythonhosted.org/packages/58/95/d9275b05ab96556fefff73a385813eb66032e4c99f411d0795372d9abcea/rpds_py-0.30.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:a4796a717bf12b9da9d3ad002519a86063dcac8988b030e405704ef7d74d2d9d", size = 422799, upload-time = "2025-11-30T20:22:53.341Z" }, + { url = "https://files.pythonhosted.org/packages/06/c1/3088fc04b6624eb12a57eb814f0d4997a44b0d208d6cace713033ff1a6ba/rpds_py-0.30.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:5d4c2aa7c50ad4728a094ebd5eb46c452e9cb7edbfdb18f9e1221f597a73e1e7", size = 572731, upload-time = "2025-11-30T20:22:54.778Z" }, + { url = "https://files.pythonhosted.org/packages/d8/42/c612a833183b39774e8ac8fecae81263a68b9583ee343db33ab571a7ce55/rpds_py-0.30.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:ba81a9203d07805435eb06f536d95a266c21e5b2dfbf6517748ca40c98d19e31", size = 599027, upload-time = "2025-11-30T20:22:56.212Z" }, + { url = "https://files.pythonhosted.org/packages/5f/60/525a50f45b01d70005403ae0e25f43c0384369ad24ffe46e8d9068b50086/rpds_py-0.30.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:945dccface01af02675628334f7cf49c2af4c1c904748efc5cf7bbdf0b579f95", size = 563020, upload-time = "2025-11-30T20:22:58.2Z" }, + { url = "https://files.pythonhosted.org/packages/0b/5d/47c4655e9bcd5ca907148535c10e7d489044243cc9941c16ed7cd53be91d/rpds_py-0.30.0-cp313-cp313-win32.whl", hash = "sha256:b40fb160a2db369a194cb27943582b38f79fc4887291417685f3ad693c5a1d5d", size = 223139, upload-time = "2025-11-30T20:23:00.209Z" }, + { url = "https://files.pythonhosted.org/packages/f2/e1/485132437d20aa4d3e1d8b3fb5a5e65aa8139f1e097080c2a8443201742c/rpds_py-0.30.0-cp313-cp313-win_amd64.whl", hash = "sha256:806f36b1b605e2d6a72716f321f20036b9489d29c51c91f4dd29a3e3afb73b15", size = 240224, upload-time = "2025-11-30T20:23:02.008Z" }, + { url = "https://files.pythonhosted.org/packages/24/95/ffd128ed1146a153d928617b0ef673960130be0009c77d8fbf0abe306713/rpds_py-0.30.0-cp313-cp313-win_arm64.whl", hash = "sha256:d96c2086587c7c30d44f31f42eae4eac89b60dabbac18c7669be3700f13c3ce1", size = 230645, upload-time = "2025-11-30T20:23:03.43Z" }, + { url = "https://files.pythonhosted.org/packages/ff/1b/b10de890a0def2a319a2626334a7f0ae388215eb60914dbac8a3bae54435/rpds_py-0.30.0-cp313-cp313t-macosx_10_12_x86_64.whl", hash = "sha256:eb0b93f2e5c2189ee831ee43f156ed34e2a89a78a66b98cadad955972548be5a", size = 364443, upload-time = "2025-11-30T20:23:04.878Z" }, + { url = "https://files.pythonhosted.org/packages/0d/bf/27e39f5971dc4f305a4fb9c672ca06f290f7c4e261c568f3dea16a410d47/rpds_py-0.30.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:922e10f31f303c7c920da8981051ff6d8c1a56207dbdf330d9047f6d30b70e5e", size = 353375, upload-time = "2025-11-30T20:23:06.342Z" }, + { url = "https://files.pythonhosted.org/packages/40/58/442ada3bba6e8e6615fc00483135c14a7538d2ffac30e2d933ccf6852232/rpds_py-0.30.0-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cdc62c8286ba9bf7f47befdcea13ea0e26bf294bda99758fd90535cbaf408000", size = 383850, upload-time = "2025-11-30T20:23:07.825Z" }, + { url = "https://files.pythonhosted.org/packages/14/14/f59b0127409a33c6ef6f5c1ebd5ad8e32d7861c9c7adfa9a624fc3889f6c/rpds_py-0.30.0-cp313-cp313t-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:47f9a91efc418b54fb8190a6b4aa7813a23fb79c51f4bb84e418f5476c38b8db", size = 392812, upload-time = "2025-11-30T20:23:09.228Z" }, + { url = "https://files.pythonhosted.org/packages/b3/66/e0be3e162ac299b3a22527e8913767d869e6cc75c46bd844aa43fb81ab62/rpds_py-0.30.0-cp313-cp313t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1f3587eb9b17f3789ad50824084fa6f81921bbf9a795826570bda82cb3ed91f2", size = 517841, upload-time = "2025-11-30T20:23:11.186Z" }, + { url = "https://files.pythonhosted.org/packages/3d/55/fa3b9cf31d0c963ecf1ba777f7cf4b2a2c976795ac430d24a1f43d25a6ba/rpds_py-0.30.0-cp313-cp313t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:39c02563fc592411c2c61d26b6c5fe1e51eaa44a75aa2c8735ca88b0d9599daa", size = 408149, upload-time = "2025-11-30T20:23:12.864Z" }, + { url = "https://files.pythonhosted.org/packages/60/ca/780cf3b1a32b18c0f05c441958d3758f02544f1d613abf9488cd78876378/rpds_py-0.30.0-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:51a1234d8febafdfd33a42d97da7a43f5dcb120c1060e352a3fbc0c6d36e2083", size = 383843, upload-time = "2025-11-30T20:23:14.638Z" }, + { url = "https://files.pythonhosted.org/packages/82/86/d5f2e04f2aa6247c613da0c1dd87fcd08fa17107e858193566048a1e2f0a/rpds_py-0.30.0-cp313-cp313t-manylinux_2_31_riscv64.whl", hash = "sha256:eb2c4071ab598733724c08221091e8d80e89064cd472819285a9ab0f24bcedb9", size = 396507, upload-time = "2025-11-30T20:23:16.105Z" }, + { url = "https://files.pythonhosted.org/packages/4b/9a/453255d2f769fe44e07ea9785c8347edaf867f7026872e76c1ad9f7bed92/rpds_py-0.30.0-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:6bdfdb946967d816e6adf9a3d8201bfad269c67efe6cefd7093ef959683c8de0", size = 414949, upload-time = "2025-11-30T20:23:17.539Z" }, + { url = "https://files.pythonhosted.org/packages/a3/31/622a86cdc0c45d6df0e9ccb6becdba5074735e7033c20e401a6d9d0e2ca0/rpds_py-0.30.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:c77afbd5f5250bf27bf516c7c4a016813eb2d3e116139aed0096940c5982da94", size = 565790, upload-time = "2025-11-30T20:23:19.029Z" }, + { url = "https://files.pythonhosted.org/packages/1c/5d/15bbf0fb4a3f58a3b1c67855ec1efcc4ceaef4e86644665fff03e1b66d8d/rpds_py-0.30.0-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:61046904275472a76c8c90c9ccee9013d70a6d0f73eecefd38c1ae7c39045a08", size = 590217, upload-time = "2025-11-30T20:23:20.885Z" }, + { url = "https://files.pythonhosted.org/packages/6d/61/21b8c41f68e60c8cc3b2e25644f0e3681926020f11d06ab0b78e3c6bbff1/rpds_py-0.30.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:4c5f36a861bc4b7da6516dbdf302c55313afa09b81931e8280361a4f6c9a2d27", size = 555806, upload-time = "2025-11-30T20:23:22.488Z" }, + { url = "https://files.pythonhosted.org/packages/f9/39/7e067bb06c31de48de3eb200f9fc7c58982a4d3db44b07e73963e10d3be9/rpds_py-0.30.0-cp313-cp313t-win32.whl", hash = "sha256:3d4a69de7a3e50ffc214ae16d79d8fbb0922972da0356dcf4d0fdca2878559c6", size = 211341, upload-time = "2025-11-30T20:23:24.449Z" }, + { url = "https://files.pythonhosted.org/packages/0a/4d/222ef0b46443cf4cf46764d9c630f3fe4abaa7245be9417e56e9f52b8f65/rpds_py-0.30.0-cp313-cp313t-win_amd64.whl", hash = "sha256:f14fc5df50a716f7ece6a80b6c78bb35ea2ca47c499e422aa4463455dd96d56d", size = 225768, upload-time = "2025-11-30T20:23:25.908Z" }, + { url = "https://files.pythonhosted.org/packages/86/81/dad16382ebbd3d0e0328776d8fd7ca94220e4fa0798d1dc5e7da48cb3201/rpds_py-0.30.0-cp314-cp314-macosx_10_12_x86_64.whl", hash = "sha256:68f19c879420aa08f61203801423f6cd5ac5f0ac4ac82a2368a9fcd6a9a075e0", size = 362099, upload-time = "2025-11-30T20:23:27.316Z" }, + { url = "https://files.pythonhosted.org/packages/2b/60/19f7884db5d5603edf3c6bce35408f45ad3e97e10007df0e17dd57af18f8/rpds_py-0.30.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:ec7c4490c672c1a0389d319b3a9cfcd098dcdc4783991553c332a15acf7249be", size = 353192, upload-time = "2025-11-30T20:23:29.151Z" }, + { url = "https://files.pythonhosted.org/packages/bf/c4/76eb0e1e72d1a9c4703c69607cec123c29028bff28ce41588792417098ac/rpds_py-0.30.0-cp314-cp314-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f251c812357a3fed308d684a5079ddfb9d933860fc6de89f2b7ab00da481e65f", size = 384080, upload-time = "2025-11-30T20:23:30.785Z" }, + { url = "https://files.pythonhosted.org/packages/72/87/87ea665e92f3298d1b26d78814721dc39ed8d2c74b86e83348d6b48a6f31/rpds_py-0.30.0-cp314-cp314-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:ac98b175585ecf4c0348fd7b29c3864bda53b805c773cbf7bfdaffc8070c976f", size = 394841, upload-time = "2025-11-30T20:23:32.209Z" }, + { url = "https://files.pythonhosted.org/packages/77/ad/7783a89ca0587c15dcbf139b4a8364a872a25f861bdb88ed99f9b0dec985/rpds_py-0.30.0-cp314-cp314-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3e62880792319dbeb7eb866547f2e35973289e7d5696c6e295476448f5b63c87", size = 516670, upload-time = "2025-11-30T20:23:33.742Z" }, + { url = "https://files.pythonhosted.org/packages/5b/3c/2882bdac942bd2172f3da574eab16f309ae10a3925644e969536553cb4ee/rpds_py-0.30.0-cp314-cp314-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4e7fc54e0900ab35d041b0601431b0a0eb495f0851a0639b6ef90f7741b39a18", size = 408005, upload-time = "2025-11-30T20:23:35.253Z" }, + { url = "https://files.pythonhosted.org/packages/ce/81/9a91c0111ce1758c92516a3e44776920b579d9a7c09b2b06b642d4de3f0f/rpds_py-0.30.0-cp314-cp314-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:47e77dc9822d3ad616c3d5759ea5631a75e5809d5a28707744ef79d7a1bcfcad", size = 382112, upload-time = "2025-11-30T20:23:36.842Z" }, + { url = "https://files.pythonhosted.org/packages/cf/8e/1da49d4a107027e5fbc64daeab96a0706361a2918da10cb41769244b805d/rpds_py-0.30.0-cp314-cp314-manylinux_2_31_riscv64.whl", hash = "sha256:b4dc1a6ff022ff85ecafef7979a2c6eb423430e05f1165d6688234e62ba99a07", size = 399049, upload-time = "2025-11-30T20:23:38.343Z" }, + { url = "https://files.pythonhosted.org/packages/df/5a/7ee239b1aa48a127570ec03becbb29c9d5a9eb092febbd1699d567cae859/rpds_py-0.30.0-cp314-cp314-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:4559c972db3a360808309e06a74628b95eaccbf961c335c8fe0d590cf587456f", size = 415661, upload-time = "2025-11-30T20:23:40.263Z" }, + { url = "https://files.pythonhosted.org/packages/70/ea/caa143cf6b772f823bc7929a45da1fa83569ee49b11d18d0ada7f5ee6fd6/rpds_py-0.30.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:0ed177ed9bded28f8deb6ab40c183cd1192aa0de40c12f38be4d59cd33cb5c65", size = 565606, upload-time = "2025-11-30T20:23:42.186Z" }, + { url = "https://files.pythonhosted.org/packages/64/91/ac20ba2d69303f961ad8cf55bf7dbdb4763f627291ba3d0d7d67333cced9/rpds_py-0.30.0-cp314-cp314-musllinux_1_2_i686.whl", hash = "sha256:ad1fa8db769b76ea911cb4e10f049d80bf518c104f15b3edb2371cc65375c46f", size = 591126, upload-time = "2025-11-30T20:23:44.086Z" }, + { url = "https://files.pythonhosted.org/packages/21/20/7ff5f3c8b00c8a95f75985128c26ba44503fb35b8e0259d812766ea966c7/rpds_py-0.30.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:46e83c697b1f1c72b50e5ee5adb4353eef7406fb3f2043d64c33f20ad1c2fc53", size = 553371, upload-time = "2025-11-30T20:23:46.004Z" }, + { url = "https://files.pythonhosted.org/packages/72/c7/81dadd7b27c8ee391c132a6b192111ca58d866577ce2d9b0ca157552cce0/rpds_py-0.30.0-cp314-cp314-win32.whl", hash = "sha256:ee454b2a007d57363c2dfd5b6ca4a5d7e2c518938f8ed3b706e37e5d470801ed", size = 215298, upload-time = "2025-11-30T20:23:47.696Z" }, + { url = "https://files.pythonhosted.org/packages/3e/d2/1aaac33287e8cfb07aab2e6b8ac1deca62f6f65411344f1433c55e6f3eb8/rpds_py-0.30.0-cp314-cp314-win_amd64.whl", hash = "sha256:95f0802447ac2d10bcc69f6dc28fe95fdf17940367b21d34e34c737870758950", size = 228604, upload-time = "2025-11-30T20:23:49.501Z" }, + { url = "https://files.pythonhosted.org/packages/e8/95/ab005315818cc519ad074cb7784dae60d939163108bd2b394e60dc7b5461/rpds_py-0.30.0-cp314-cp314-win_arm64.whl", hash = "sha256:613aa4771c99f03346e54c3f038e4cc574ac09a3ddfb0e8878487335e96dead6", size = 222391, upload-time = "2025-11-30T20:23:50.96Z" }, + { url = "https://files.pythonhosted.org/packages/9e/68/154fe0194d83b973cdedcdcc88947a2752411165930182ae41d983dcefa6/rpds_py-0.30.0-cp314-cp314t-macosx_10_12_x86_64.whl", hash = "sha256:7e6ecfcb62edfd632e56983964e6884851786443739dbfe3582947e87274f7cb", size = 364868, upload-time = "2025-11-30T20:23:52.494Z" }, + { url = "https://files.pythonhosted.org/packages/83/69/8bbc8b07ec854d92a8b75668c24d2abcb1719ebf890f5604c61c9369a16f/rpds_py-0.30.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:a1d0bc22a7cdc173fedebb73ef81e07faef93692b8c1ad3733b67e31e1b6e1b8", size = 353747, upload-time = "2025-11-30T20:23:54.036Z" }, + { url = "https://files.pythonhosted.org/packages/ab/00/ba2e50183dbd9abcce9497fa5149c62b4ff3e22d338a30d690f9af970561/rpds_py-0.30.0-cp314-cp314t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0d08f00679177226c4cb8c5265012eea897c8ca3b93f429e546600c971bcbae7", size = 383795, upload-time = "2025-11-30T20:23:55.556Z" }, + { url = "https://files.pythonhosted.org/packages/05/6f/86f0272b84926bcb0e4c972262f54223e8ecc556b3224d281e6598fc9268/rpds_py-0.30.0-cp314-cp314t-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:5965af57d5848192c13534f90f9dd16464f3c37aaf166cc1da1cae1fd5a34898", size = 393330, upload-time = "2025-11-30T20:23:57.033Z" }, + { url = "https://files.pythonhosted.org/packages/cb/e9/0e02bb2e6dc63d212641da45df2b0bf29699d01715913e0d0f017ee29438/rpds_py-0.30.0-cp314-cp314t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9a4e86e34e9ab6b667c27f3211ca48f73dba7cd3d90f8d5b11be56e5dbc3fb4e", size = 518194, upload-time = "2025-11-30T20:23:58.637Z" }, + { url = "https://files.pythonhosted.org/packages/ee/ca/be7bca14cf21513bdf9c0606aba17d1f389ea2b6987035eb4f62bd923f25/rpds_py-0.30.0-cp314-cp314t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e5d3e6b26f2c785d65cc25ef1e5267ccbe1b069c5c21b8cc724efee290554419", size = 408340, upload-time = "2025-11-30T20:24:00.2Z" }, + { url = "https://files.pythonhosted.org/packages/c2/c7/736e00ebf39ed81d75544c0da6ef7b0998f8201b369acf842f9a90dc8fce/rpds_py-0.30.0-cp314-cp314t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:626a7433c34566535b6e56a1b39a7b17ba961e97ce3b80ec62e6f1312c025551", size = 383765, upload-time = "2025-11-30T20:24:01.759Z" }, + { url = "https://files.pythonhosted.org/packages/4a/3f/da50dfde9956aaf365c4adc9533b100008ed31aea635f2b8d7b627e25b49/rpds_py-0.30.0-cp314-cp314t-manylinux_2_31_riscv64.whl", hash = "sha256:acd7eb3f4471577b9b5a41baf02a978e8bdeb08b4b355273994f8b87032000a8", size = 396834, upload-time = "2025-11-30T20:24:03.687Z" }, + { url = "https://files.pythonhosted.org/packages/4e/00/34bcc2565b6020eab2623349efbdec810676ad571995911f1abdae62a3a0/rpds_py-0.30.0-cp314-cp314t-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:fe5fa731a1fa8a0a56b0977413f8cacac1768dad38d16b3a296712709476fbd5", size = 415470, upload-time = "2025-11-30T20:24:05.232Z" }, + { url = "https://files.pythonhosted.org/packages/8c/28/882e72b5b3e6f718d5453bd4d0d9cf8df36fddeb4ddbbab17869d5868616/rpds_py-0.30.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:74a3243a411126362712ee1524dfc90c650a503502f135d54d1b352bd01f2404", size = 565630, upload-time = "2025-11-30T20:24:06.878Z" }, + { url = "https://files.pythonhosted.org/packages/3b/97/04a65539c17692de5b85c6e293520fd01317fd878ea1995f0367d4532fb1/rpds_py-0.30.0-cp314-cp314t-musllinux_1_2_i686.whl", hash = "sha256:3e8eeb0544f2eb0d2581774be4c3410356eba189529a6b3e36bbbf9696175856", size = 591148, upload-time = "2025-11-30T20:24:08.445Z" }, + { url = "https://files.pythonhosted.org/packages/85/70/92482ccffb96f5441aab93e26c4d66489eb599efdcf96fad90c14bbfb976/rpds_py-0.30.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:dbd936cde57abfee19ab3213cf9c26be06d60750e60a8e4dd85d1ab12c8b1f40", size = 556030, upload-time = "2025-11-30T20:24:10.956Z" }, + { url = "https://files.pythonhosted.org/packages/20/53/7c7e784abfa500a2b6b583b147ee4bb5a2b3747a9166bab52fec4b5b5e7d/rpds_py-0.30.0-cp314-cp314t-win32.whl", hash = "sha256:dc824125c72246d924f7f796b4f63c1e9dc810c7d9e2355864b3c3a73d59ade0", size = 211570, upload-time = "2025-11-30T20:24:12.735Z" }, + { url = "https://files.pythonhosted.org/packages/d0/02/fa464cdfbe6b26e0600b62c528b72d8608f5cc49f96b8d6e38c95d60c676/rpds_py-0.30.0-cp314-cp314t-win_amd64.whl", hash = "sha256:27f4b0e92de5bfbc6f86e43959e6edd1425c33b5e69aab0984a72047f2bcf1e3", size = 226532, upload-time = "2025-11-30T20:24:14.634Z" }, + { url = "https://files.pythonhosted.org/packages/69/71/3f34339ee70521864411f8b6992e7ab13ac30d8e4e3309e07c7361767d91/rpds_py-0.30.0-pp311-pypy311_pp73-macosx_10_12_x86_64.whl", hash = "sha256:c2262bdba0ad4fc6fb5545660673925c2d2a5d9e2e0fb603aad545427be0fc58", size = 372292, upload-time = "2025-11-30T20:24:16.537Z" }, + { url = "https://files.pythonhosted.org/packages/57/09/f183df9b8f2d66720d2ef71075c59f7e1b336bec7ee4c48f0a2b06857653/rpds_py-0.30.0-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:ee6af14263f25eedc3bb918a3c04245106a42dfd4f5c2285ea6f997b1fc3f89a", size = 362128, upload-time = "2025-11-30T20:24:18.086Z" }, + { url = "https://files.pythonhosted.org/packages/7a/68/5c2594e937253457342e078f0cc1ded3dd7b2ad59afdbf2d354869110a02/rpds_py-0.30.0-pp311-pypy311_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3adbb8179ce342d235c31ab8ec511e66c73faa27a47e076ccc92421add53e2bb", size = 391542, upload-time = "2025-11-30T20:24:20.092Z" }, + { url = "https://files.pythonhosted.org/packages/49/5c/31ef1afd70b4b4fbdb2800249f34c57c64beb687495b10aec0365f53dfc4/rpds_py-0.30.0-pp311-pypy311_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:250fa00e9543ac9b97ac258bd37367ff5256666122c2d0f2bc97577c60a1818c", size = 404004, upload-time = "2025-11-30T20:24:22.231Z" }, + { url = "https://files.pythonhosted.org/packages/e3/63/0cfbea38d05756f3440ce6534d51a491d26176ac045e2707adc99bb6e60a/rpds_py-0.30.0-pp311-pypy311_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9854cf4f488b3d57b9aaeb105f06d78e5529d3145b1e4a41750167e8c213c6d3", size = 527063, upload-time = "2025-11-30T20:24:24.302Z" }, + { url = "https://files.pythonhosted.org/packages/42/e6/01e1f72a2456678b0f618fc9a1a13f882061690893c192fcad9f2926553a/rpds_py-0.30.0-pp311-pypy311_pp73-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:993914b8e560023bc0a8bf742c5f303551992dcb85e247b1e5c7f4a7d145bda5", size = 413099, upload-time = "2025-11-30T20:24:25.916Z" }, + { url = "https://files.pythonhosted.org/packages/b8/25/8df56677f209003dcbb180765520c544525e3ef21ea72279c98b9aa7c7fb/rpds_py-0.30.0-pp311-pypy311_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:58edca431fb9b29950807e301826586e5bbf24163677732429770a697ffe6738", size = 392177, upload-time = "2025-11-30T20:24:27.834Z" }, + { url = "https://files.pythonhosted.org/packages/4a/b4/0a771378c5f16f8115f796d1f437950158679bcd2a7c68cf251cfb00ed5b/rpds_py-0.30.0-pp311-pypy311_pp73-manylinux_2_31_riscv64.whl", hash = "sha256:dea5b552272a944763b34394d04577cf0f9bd013207bc32323b5a89a53cf9c2f", size = 406015, upload-time = "2025-11-30T20:24:29.457Z" }, + { url = "https://files.pythonhosted.org/packages/36/d8/456dbba0af75049dc6f63ff295a2f92766b9d521fa00de67a2bd6427d57a/rpds_py-0.30.0-pp311-pypy311_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:ba3af48635eb83d03f6c9735dfb21785303e73d22ad03d489e88adae6eab8877", size = 423736, upload-time = "2025-11-30T20:24:31.22Z" }, + { url = "https://files.pythonhosted.org/packages/13/64/b4d76f227d5c45a7e0b796c674fd81b0a6c4fbd48dc29271857d8219571c/rpds_py-0.30.0-pp311-pypy311_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:dff13836529b921e22f15cb099751209a60009731a68519630a24d61f0b1b30a", size = 573981, upload-time = "2025-11-30T20:24:32.934Z" }, + { url = "https://files.pythonhosted.org/packages/20/91/092bacadeda3edf92bf743cc96a7be133e13a39cdbfd7b5082e7ab638406/rpds_py-0.30.0-pp311-pypy311_pp73-musllinux_1_2_i686.whl", hash = "sha256:1b151685b23929ab7beec71080a8889d4d6d9fa9a983d213f07121205d48e2c4", size = 599782, upload-time = "2025-11-30T20:24:35.169Z" }, + { url = "https://files.pythonhosted.org/packages/d1/b7/b95708304cd49b7b6f82fdd039f1748b66ec2b21d6a45180910802f1abf1/rpds_py-0.30.0-pp311-pypy311_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:ac37f9f516c51e5753f27dfdef11a88330f04de2d564be3991384b2f3535d02e", size = 562191, upload-time = "2025-11-30T20:24:36.853Z" }, +] + +[[package]] +name = "scipy" +version = "1.10.1" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version < '3.9'", +] +dependencies = [ + { name = "numpy", version = "1.24.4", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.9'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/84/a9/2bf119f3f9cff1f376f924e39cfae18dec92a1514784046d185731301281/scipy-1.10.1.tar.gz", hash = "sha256:2cf9dfb80a7b4589ba4c40ce7588986d6d5cebc5457cad2c2880f6bc2d42f3a5", size = 42407997, upload-time = "2023-02-19T21:20:13.395Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/0a/ac/b1f1bbf7b01d96495f35be003b881f10f85bf6559efb6e9578da832c2140/scipy-1.10.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:e7354fd7527a4b0377ce55f286805b34e8c54b91be865bac273f527e1b839019", size = 35093243, upload-time = "2023-02-19T20:33:55.754Z" }, + { url = "https://files.pythonhosted.org/packages/ea/e5/452086ebed676ce4000ceb5eeeb0ee4f8c6f67c7e70fb9323a370ff95c1f/scipy-1.10.1-cp310-cp310-macosx_12_0_arm64.whl", hash = "sha256:4b3f429188c66603a1a5c549fb414e4d3bdc2a24792e061ffbd607d3d75fd84e", size = 28772969, upload-time = "2023-02-19T20:34:39.318Z" }, + { url = "https://files.pythonhosted.org/packages/04/0b/a1b119c869b79a2ab459b7f9fd7e2dea75a9c7d432e64e915e75586bd00b/scipy-1.10.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1553b5dcddd64ba9a0d95355e63fe6c3fc303a8fd77c7bc91e77d61363f7433f", size = 30886961, upload-time = "2023-02-19T20:35:33.724Z" }, + { url = "https://files.pythonhosted.org/packages/1f/4b/3bacad9a166350cb2e518cea80ab891016933cc1653f15c90279512c5fa9/scipy-1.10.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4c0ff64b06b10e35215abce517252b375e580a6125fd5fdf6421b98efbefb2d2", size = 34422544, upload-time = "2023-02-19T20:37:03.859Z" }, + { url = "https://files.pythonhosted.org/packages/ec/e3/b06ac3738bf365e89710205a471abe7dceec672a51c244b469bc5d1291c7/scipy-1.10.1-cp310-cp310-win_amd64.whl", hash = "sha256:fae8a7b898c42dffe3f7361c40d5952b6bf32d10c4569098d276b4c547905ee1", size = 42484848, upload-time = "2023-02-19T20:39:09.467Z" }, + { url = "https://files.pythonhosted.org/packages/e7/53/053cd3669be0d474deae8fe5f757bff4c4f480b8a410231e0631c068873d/scipy-1.10.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:0f1564ea217e82c1bbe75ddf7285ba0709ecd503f048cb1236ae9995f64217bd", size = 35003170, upload-time = "2023-02-19T20:40:53.274Z" }, + { url = "https://files.pythonhosted.org/packages/0d/3e/d05b9de83677195886fb79844fcca19609a538db63b1790fa373155bc3cf/scipy-1.10.1-cp311-cp311-macosx_12_0_arm64.whl", hash = "sha256:d925fa1c81b772882aa55bcc10bf88324dadb66ff85d548c71515f6689c6dac5", size = 28717513, upload-time = "2023-02-19T20:42:20.82Z" }, + { url = "https://files.pythonhosted.org/packages/a5/3d/b69746c50e44893da57a68457da3d7e5bb75f6a37fbace3769b70d017488/scipy-1.10.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:aaea0a6be54462ec027de54fca511540980d1e9eea68b2d5c1dbfe084797be35", size = 30687257, upload-time = "2023-02-19T20:43:48.139Z" }, + { url = "https://files.pythonhosted.org/packages/21/cd/fe2d4af234b80dc08c911ce63fdaee5badcdde3e9bcd9a68884580652ef0/scipy-1.10.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:15a35c4242ec5f292c3dd364a7c71a61be87a3d4ddcc693372813c0b73c9af1d", size = 34124096, upload-time = "2023-02-19T20:45:27.415Z" }, + { url = "https://files.pythonhosted.org/packages/65/76/903324159e4a3566e518c558aeb21571d642f781d842d8dd0fd9c6b0645a/scipy-1.10.1-cp311-cp311-win_amd64.whl", hash = "sha256:43b8e0bcb877faf0abfb613d51026cd5cc78918e9530e375727bf0625c82788f", size = 42238704, upload-time = "2023-02-19T20:47:26.366Z" }, + { url = "https://files.pythonhosted.org/packages/a0/e3/37508a11dae501349d7c16e4dd18c706a023629eedc650ee094593887a89/scipy-1.10.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:5678f88c68ea866ed9ebe3a989091088553ba12c6090244fdae3e467b1139c35", size = 35041063, upload-time = "2023-02-19T20:49:02.296Z" }, + { url = "https://files.pythonhosted.org/packages/93/4a/50c436de1353cce8b66b26e49a687f10b91fe7465bf34e4565d810153003/scipy-1.10.1-cp38-cp38-macosx_12_0_arm64.whl", hash = "sha256:39becb03541f9e58243f4197584286e339029e8908c46f7221abeea4b749fa88", size = 28797694, upload-time = "2023-02-19T20:50:19.381Z" }, + { url = "https://files.pythonhosted.org/packages/d2/b5/ff61b79ad0ebd15d87ade10e0f4e80114dd89fac34a5efade39e99048c91/scipy-1.10.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bce5869c8d68cf383ce240e44c1d9ae7c06078a9396df68ce88a1230f93a30c1", size = 31024657, upload-time = "2023-02-19T20:51:49.175Z" }, + { url = "https://files.pythonhosted.org/packages/69/f0/fb07a9548e48b687b8bf2fa81d71aba9cfc548d365046ca1c791e24db99d/scipy-1.10.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:07c3457ce0b3ad5124f98a86533106b643dd811dd61b548e78cf4c8786652f6f", size = 34540352, upload-time = "2023-02-19T20:53:30.821Z" }, + { url = "https://files.pythonhosted.org/packages/32/8e/7f403535ddf826348c9b8417791e28712019962f7e90ff845896d6325d09/scipy-1.10.1-cp38-cp38-win_amd64.whl", hash = "sha256:049a8bbf0ad95277ffba9b3b7d23e5369cc39e66406d60422c8cfef40ccc8415", size = 42215036, upload-time = "2023-02-19T20:55:09.639Z" }, + { url = "https://files.pythonhosted.org/packages/d9/7d/78b8035bc93c869b9f17261c87aae97a9cdb937f65f0d453c2831aa172fc/scipy-1.10.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:cd9f1027ff30d90618914a64ca9b1a77a431159df0e2a195d8a9e8a04c78abf9", size = 35158611, upload-time = "2023-02-19T20:56:02.715Z" }, + { url = "https://files.pythonhosted.org/packages/e7/f0/55d81813b1a4cb79ce7dc8290eac083bf38bfb36e1ada94ea13b7b1a5f79/scipy-1.10.1-cp39-cp39-macosx_12_0_arm64.whl", hash = "sha256:79c8e5a6c6ffaf3a2262ef1be1e108a035cf4f05c14df56057b64acc5bebffb6", size = 28902591, upload-time = "2023-02-19T20:56:45.728Z" }, + { url = "https://files.pythonhosted.org/packages/77/d1/722c457b319eed1d642e0a14c9be37eb475f0e6ed1f3401fa480d5d6d36e/scipy-1.10.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:51af417a000d2dbe1ec6c372dfe688e041a7084da4fdd350aeb139bd3fb55353", size = 30960654, upload-time = "2023-02-19T20:57:32.091Z" }, + { url = "https://files.pythonhosted.org/packages/5d/30/b2a2a5bf1a3beefb7609fb871dcc6aef7217c69cef19a4631b7ab5622a8a/scipy-1.10.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1b4735d6c28aad3cdcf52117e0e91d6b39acd4272f3f5cd9907c24ee931ad601", size = 34458863, upload-time = "2023-02-19T20:58:23.601Z" }, + { url = "https://files.pythonhosted.org/packages/35/20/0ec6246bbb43d18650c9a7cad6602e1a84fd8f9564a9b84cc5faf1e037d0/scipy-1.10.1-cp39-cp39-win_amd64.whl", hash = "sha256:7ff7f37b1bf4417baca958d254e8e2875d0cc23aaadbe65b3d5b3077b0eb23ea", size = 42509516, upload-time = "2023-02-19T20:59:26.296Z" }, +] + +[[package]] +name = "scipy" +version = "1.13.1" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version == '3.9.*'", +] +dependencies = [ + { name = "numpy", version = "1.26.4", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version == '3.9.*'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/ae/00/48c2f661e2816ccf2ecd77982f6605b2950afe60f60a52b4cbbc2504aa8f/scipy-1.13.1.tar.gz", hash = "sha256:095a87a0312b08dfd6a6155cbbd310a8c51800fc931b8c0b84003014b874ed3c", size = 57210720, upload-time = "2024-05-23T03:29:26.079Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/33/59/41b2529908c002ade869623b87eecff3e11e3ce62e996d0bdcb536984187/scipy-1.13.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:20335853b85e9a49ff7572ab453794298bcf0354d8068c5f6775a0eabf350aca", size = 39328076, upload-time = "2024-05-23T03:19:01.687Z" }, + { url = "https://files.pythonhosted.org/packages/d5/33/f1307601f492f764062ce7dd471a14750f3360e33cd0f8c614dae208492c/scipy-1.13.1-cp310-cp310-macosx_12_0_arm64.whl", hash = "sha256:d605e9c23906d1994f55ace80e0125c587f96c020037ea6aa98d01b4bd2e222f", size = 30306232, upload-time = "2024-05-23T03:19:09.089Z" }, + { url = "https://files.pythonhosted.org/packages/c0/66/9cd4f501dd5ea03e4a4572ecd874936d0da296bd04d1c45ae1a4a75d9c3a/scipy-1.13.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cfa31f1def5c819b19ecc3a8b52d28ffdcc7ed52bb20c9a7589669dd3c250989", size = 33743202, upload-time = "2024-05-23T03:19:15.138Z" }, + { url = "https://files.pythonhosted.org/packages/a3/ba/7255e5dc82a65adbe83771c72f384d99c43063648456796436c9a5585ec3/scipy-1.13.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f26264b282b9da0952a024ae34710c2aff7d27480ee91a2e82b7b7073c24722f", size = 38577335, upload-time = "2024-05-23T03:19:21.984Z" }, + { url = "https://files.pythonhosted.org/packages/49/a5/bb9ded8326e9f0cdfdc412eeda1054b914dfea952bda2097d174f8832cc0/scipy-1.13.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:eccfa1906eacc02de42d70ef4aecea45415f5be17e72b61bafcfd329bdc52e94", size = 38820728, upload-time = "2024-05-23T03:19:28.225Z" }, + { url = "https://files.pythonhosted.org/packages/12/30/df7a8fcc08f9b4a83f5f27cfaaa7d43f9a2d2ad0b6562cced433e5b04e31/scipy-1.13.1-cp310-cp310-win_amd64.whl", hash = "sha256:2831f0dc9c5ea9edd6e51e6e769b655f08ec6db6e2e10f86ef39bd32eb11da54", size = 46210588, upload-time = "2024-05-23T03:19:35.661Z" }, + { url = "https://files.pythonhosted.org/packages/b4/15/4a4bb1b15bbd2cd2786c4f46e76b871b28799b67891f23f455323a0cdcfb/scipy-1.13.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:27e52b09c0d3a1d5b63e1105f24177e544a222b43611aaf5bc44d4a0979e32f9", size = 39333805, upload-time = "2024-05-23T03:19:43.081Z" }, + { url = "https://files.pythonhosted.org/packages/ba/92/42476de1af309c27710004f5cdebc27bec62c204db42e05b23a302cb0c9a/scipy-1.13.1-cp311-cp311-macosx_12_0_arm64.whl", hash = "sha256:54f430b00f0133e2224c3ba42b805bfd0086fe488835effa33fa291561932326", size = 30317687, upload-time = "2024-05-23T03:19:48.799Z" }, + { url = "https://files.pythonhosted.org/packages/80/ba/8be64fe225360a4beb6840f3cbee494c107c0887f33350d0a47d55400b01/scipy-1.13.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e89369d27f9e7b0884ae559a3a956e77c02114cc60a6058b4e5011572eea9299", size = 33694638, upload-time = "2024-05-23T03:19:55.104Z" }, + { url = "https://files.pythonhosted.org/packages/36/07/035d22ff9795129c5a847c64cb43c1fa9188826b59344fee28a3ab02e283/scipy-1.13.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a78b4b3345f1b6f68a763c6e25c0c9a23a9fd0f39f5f3d200efe8feda560a5fa", size = 38569931, upload-time = "2024-05-23T03:20:01.82Z" }, + { url = "https://files.pythonhosted.org/packages/d9/10/f9b43de37e5ed91facc0cfff31d45ed0104f359e4f9a68416cbf4e790241/scipy-1.13.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:45484bee6d65633752c490404513b9ef02475b4284c4cfab0ef946def50b3f59", size = 38838145, upload-time = "2024-05-23T03:20:09.173Z" }, + { url = "https://files.pythonhosted.org/packages/4a/48/4513a1a5623a23e95f94abd675ed91cfb19989c58e9f6f7d03990f6caf3d/scipy-1.13.1-cp311-cp311-win_amd64.whl", hash = "sha256:5713f62f781eebd8d597eb3f88b8bf9274e79eeabf63afb4a737abc6c84ad37b", size = 46196227, upload-time = "2024-05-23T03:20:16.433Z" }, + { url = "https://files.pythonhosted.org/packages/f2/7b/fb6b46fbee30fc7051913068758414f2721003a89dd9a707ad49174e3843/scipy-1.13.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:5d72782f39716b2b3509cd7c33cdc08c96f2f4d2b06d51e52fb45a19ca0c86a1", size = 39357301, upload-time = "2024-05-23T03:20:23.538Z" }, + { url = "https://files.pythonhosted.org/packages/dc/5a/2043a3bde1443d94014aaa41e0b50c39d046dda8360abd3b2a1d3f79907d/scipy-1.13.1-cp312-cp312-macosx_12_0_arm64.whl", hash = "sha256:017367484ce5498445aade74b1d5ab377acdc65e27095155e448c88497755a5d", size = 30363348, upload-time = "2024-05-23T03:20:29.885Z" }, + { url = "https://files.pythonhosted.org/packages/e7/cb/26e4a47364bbfdb3b7fb3363be6d8a1c543bcd70a7753ab397350f5f189a/scipy-1.13.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:949ae67db5fa78a86e8fa644b9a6b07252f449dcf74247108c50e1d20d2b4627", size = 33406062, upload-time = "2024-05-23T03:20:36.012Z" }, + { url = "https://files.pythonhosted.org/packages/88/ab/6ecdc526d509d33814835447bbbeedbebdec7cca46ef495a61b00a35b4bf/scipy-1.13.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:de3ade0e53bc1f21358aa74ff4830235d716211d7d077e340c7349bc3542e884", size = 38218311, upload-time = "2024-05-23T03:20:42.086Z" }, + { url = "https://files.pythonhosted.org/packages/0b/00/9f54554f0f8318100a71515122d8f4f503b1a2c4b4cfab3b4b68c0eb08fa/scipy-1.13.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:2ac65fb503dad64218c228e2dc2d0a0193f7904747db43014645ae139c8fad16", size = 38442493, upload-time = "2024-05-23T03:20:48.292Z" }, + { url = "https://files.pythonhosted.org/packages/3e/df/963384e90733e08eac978cd103c34df181d1fec424de383cdc443f418dd4/scipy-1.13.1-cp312-cp312-win_amd64.whl", hash = "sha256:cdd7dacfb95fea358916410ec61bbc20440f7860333aee6d882bb8046264e949", size = 45910955, upload-time = "2024-05-23T03:20:55.091Z" }, + { url = "https://files.pythonhosted.org/packages/7f/29/c2ea58c9731b9ecb30b6738113a95d147e83922986b34c685b8f6eefde21/scipy-1.13.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:436bbb42a94a8aeef855d755ce5a465479c721e9d684de76bf61a62e7c2b81d5", size = 39352927, upload-time = "2024-05-23T03:21:01.95Z" }, + { url = "https://files.pythonhosted.org/packages/5c/c0/e71b94b20ccf9effb38d7147c0064c08c622309fd487b1b677771a97d18c/scipy-1.13.1-cp39-cp39-macosx_12_0_arm64.whl", hash = "sha256:8335549ebbca860c52bf3d02f80784e91a004b71b059e3eea9678ba994796a24", size = 30324538, upload-time = "2024-05-23T03:21:07.634Z" }, + { url = "https://files.pythonhosted.org/packages/6d/0f/aaa55b06d474817cea311e7b10aab2ea1fd5d43bc6a2861ccc9caec9f418/scipy-1.13.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d533654b7d221a6a97304ab63c41c96473ff04459e404b83275b60aa8f4b7004", size = 33732190, upload-time = "2024-05-23T03:21:14.41Z" }, + { url = "https://files.pythonhosted.org/packages/35/f5/d0ad1a96f80962ba65e2ce1de6a1e59edecd1f0a7b55990ed208848012e0/scipy-1.13.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:637e98dcf185ba7f8e663e122ebf908c4702420477ae52a04f9908707456ba4d", size = 38612244, upload-time = "2024-05-23T03:21:21.827Z" }, + { url = "https://files.pythonhosted.org/packages/8d/02/1165905f14962174e6569076bcc3315809ae1291ed14de6448cc151eedfd/scipy-1.13.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:a014c2b3697bde71724244f63de2476925596c24285c7a637364761f8710891c", size = 38845637, upload-time = "2024-05-23T03:21:28.729Z" }, + { url = "https://files.pythonhosted.org/packages/3e/77/dab54fe647a08ee4253963bcd8f9cf17509c8ca64d6335141422fe2e2114/scipy-1.13.1-cp39-cp39-win_amd64.whl", hash = "sha256:392e4ec766654852c25ebad4f64e4e584cf19820b980bc04960bca0b0cd6eaa2", size = 46227440, upload-time = "2024-05-23T03:21:35.888Z" }, +] + +[[package]] +name = "scipy" +version = "1.15.3" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version == '3.10.*'", +] +dependencies = [ + { name = "numpy", version = "1.26.4", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version == '3.10.*'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/0f/37/6964b830433e654ec7485e45a00fc9a27cf868d622838f6b6d9c5ec0d532/scipy-1.15.3.tar.gz", hash = "sha256:eae3cf522bc7df64b42cad3925c876e1b0b6c35c1337c93e12c0f366f55b0eaf", size = 59419214, upload-time = "2025-05-08T16:13:05.955Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/78/2f/4966032c5f8cc7e6a60f1b2e0ad686293b9474b65246b0c642e3ef3badd0/scipy-1.15.3-cp310-cp310-macosx_10_13_x86_64.whl", hash = "sha256:a345928c86d535060c9c2b25e71e87c39ab2f22fc96e9636bd74d1dbf9de448c", size = 38702770, upload-time = "2025-05-08T16:04:20.849Z" }, + { url = "https://files.pythonhosted.org/packages/a0/6e/0c3bf90fae0e910c274db43304ebe25a6b391327f3f10b5dcc638c090795/scipy-1.15.3-cp310-cp310-macosx_12_0_arm64.whl", hash = "sha256:ad3432cb0f9ed87477a8d97f03b763fd1d57709f1bbde3c9369b1dff5503b253", size = 30094511, upload-time = "2025-05-08T16:04:27.103Z" }, + { url = "https://files.pythonhosted.org/packages/ea/b1/4deb37252311c1acff7f101f6453f0440794f51b6eacb1aad4459a134081/scipy-1.15.3-cp310-cp310-macosx_14_0_arm64.whl", hash = "sha256:aef683a9ae6eb00728a542b796f52a5477b78252edede72b8327a886ab63293f", size = 22368151, upload-time = "2025-05-08T16:04:31.731Z" }, + { url = "https://files.pythonhosted.org/packages/38/7d/f457626e3cd3c29b3a49ca115a304cebb8cc6f31b04678f03b216899d3c6/scipy-1.15.3-cp310-cp310-macosx_14_0_x86_64.whl", hash = "sha256:1c832e1bd78dea67d5c16f786681b28dd695a8cb1fb90af2e27580d3d0967e92", size = 25121732, upload-time = "2025-05-08T16:04:36.596Z" }, + { url = "https://files.pythonhosted.org/packages/db/0a/92b1de4a7adc7a15dcf5bddc6e191f6f29ee663b30511ce20467ef9b82e4/scipy-1.15.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:263961f658ce2165bbd7b99fa5135195c3a12d9bef045345016b8b50c315cb82", size = 35547617, upload-time = "2025-05-08T16:04:43.546Z" }, + { url = "https://files.pythonhosted.org/packages/8e/6d/41991e503e51fc1134502694c5fa7a1671501a17ffa12716a4a9151af3df/scipy-1.15.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9e2abc762b0811e09a0d3258abee2d98e0c703eee49464ce0069590846f31d40", size = 37662964, upload-time = "2025-05-08T16:04:49.431Z" }, + { url = "https://files.pythonhosted.org/packages/25/e1/3df8f83cb15f3500478c889be8fb18700813b95e9e087328230b98d547ff/scipy-1.15.3-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:ed7284b21a7a0c8f1b6e5977ac05396c0d008b89e05498c8b7e8f4a1423bba0e", size = 37238749, upload-time = "2025-05-08T16:04:55.215Z" }, + { url = "https://files.pythonhosted.org/packages/93/3e/b3257cf446f2a3533ed7809757039016b74cd6f38271de91682aa844cfc5/scipy-1.15.3-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:5380741e53df2c566f4d234b100a484b420af85deb39ea35a1cc1be84ff53a5c", size = 40022383, upload-time = "2025-05-08T16:05:01.914Z" }, + { url = "https://files.pythonhosted.org/packages/d1/84/55bc4881973d3f79b479a5a2e2df61c8c9a04fcb986a213ac9c02cfb659b/scipy-1.15.3-cp310-cp310-win_amd64.whl", hash = "sha256:9d61e97b186a57350f6d6fd72640f9e99d5a4a2b8fbf4b9ee9a841eab327dc13", size = 41259201, upload-time = "2025-05-08T16:05:08.166Z" }, + { url = "https://files.pythonhosted.org/packages/96/ab/5cc9f80f28f6a7dff646c5756e559823614a42b1939d86dd0ed550470210/scipy-1.15.3-cp311-cp311-macosx_10_13_x86_64.whl", hash = "sha256:993439ce220d25e3696d1b23b233dd010169b62f6456488567e830654ee37a6b", size = 38714255, upload-time = "2025-05-08T16:05:14.596Z" }, + { url = "https://files.pythonhosted.org/packages/4a/4a/66ba30abe5ad1a3ad15bfb0b59d22174012e8056ff448cb1644deccbfed2/scipy-1.15.3-cp311-cp311-macosx_12_0_arm64.whl", hash = "sha256:34716e281f181a02341ddeaad584205bd2fd3c242063bd3423d61ac259ca7eba", size = 30111035, upload-time = "2025-05-08T16:05:20.152Z" }, + { url = "https://files.pythonhosted.org/packages/4b/fa/a7e5b95afd80d24313307f03624acc65801846fa75599034f8ceb9e2cbf6/scipy-1.15.3-cp311-cp311-macosx_14_0_arm64.whl", hash = "sha256:3b0334816afb8b91dab859281b1b9786934392aa3d527cd847e41bb6f45bee65", size = 22384499, upload-time = "2025-05-08T16:05:24.494Z" }, + { url = "https://files.pythonhosted.org/packages/17/99/f3aaddccf3588bb4aea70ba35328c204cadd89517a1612ecfda5b2dd9d7a/scipy-1.15.3-cp311-cp311-macosx_14_0_x86_64.whl", hash = "sha256:6db907c7368e3092e24919b5e31c76998b0ce1684d51a90943cb0ed1b4ffd6c1", size = 25152602, upload-time = "2025-05-08T16:05:29.313Z" }, + { url = "https://files.pythonhosted.org/packages/56/c5/1032cdb565f146109212153339f9cb8b993701e9fe56b1c97699eee12586/scipy-1.15.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:721d6b4ef5dc82ca8968c25b111e307083d7ca9091bc38163fb89243e85e3889", size = 35503415, upload-time = "2025-05-08T16:05:34.699Z" }, + { url = "https://files.pythonhosted.org/packages/bd/37/89f19c8c05505d0601ed5650156e50eb881ae3918786c8fd7262b4ee66d3/scipy-1.15.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:39cb9c62e471b1bb3750066ecc3a3f3052b37751c7c3dfd0fd7e48900ed52982", size = 37652622, upload-time = "2025-05-08T16:05:40.762Z" }, + { url = "https://files.pythonhosted.org/packages/7e/31/be59513aa9695519b18e1851bb9e487de66f2d31f835201f1b42f5d4d475/scipy-1.15.3-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:795c46999bae845966368a3c013e0e00947932d68e235702b5c3f6ea799aa8c9", size = 37244796, upload-time = "2025-05-08T16:05:48.119Z" }, + { url = "https://files.pythonhosted.org/packages/10/c0/4f5f3eeccc235632aab79b27a74a9130c6c35df358129f7ac8b29f562ac7/scipy-1.15.3-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:18aaacb735ab38b38db42cb01f6b92a2d0d4b6aabefeb07f02849e47f8fb3594", size = 40047684, upload-time = "2025-05-08T16:05:54.22Z" }, + { url = "https://files.pythonhosted.org/packages/ab/a7/0ddaf514ce8a8714f6ed243a2b391b41dbb65251affe21ee3077ec45ea9a/scipy-1.15.3-cp311-cp311-win_amd64.whl", hash = "sha256:ae48a786a28412d744c62fd7816a4118ef97e5be0bee968ce8f0a2fba7acf3bb", size = 41246504, upload-time = "2025-05-08T16:06:00.437Z" }, + { url = "https://files.pythonhosted.org/packages/37/4b/683aa044c4162e10ed7a7ea30527f2cbd92e6999c10a8ed8edb253836e9c/scipy-1.15.3-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:6ac6310fdbfb7aa6612408bd2f07295bcbd3fda00d2d702178434751fe48e019", size = 38766735, upload-time = "2025-05-08T16:06:06.471Z" }, + { url = "https://files.pythonhosted.org/packages/7b/7e/f30be3d03de07f25dc0ec926d1681fed5c732d759ac8f51079708c79e680/scipy-1.15.3-cp312-cp312-macosx_12_0_arm64.whl", hash = "sha256:185cd3d6d05ca4b44a8f1595af87f9c372bb6acf9c808e99aa3e9aa03bd98cf6", size = 30173284, upload-time = "2025-05-08T16:06:11.686Z" }, + { url = "https://files.pythonhosted.org/packages/07/9c/0ddb0d0abdabe0d181c1793db51f02cd59e4901da6f9f7848e1f96759f0d/scipy-1.15.3-cp312-cp312-macosx_14_0_arm64.whl", hash = "sha256:05dc6abcd105e1a29f95eada46d4a3f251743cfd7d3ae8ddb4088047f24ea477", size = 22446958, upload-time = "2025-05-08T16:06:15.97Z" }, + { url = "https://files.pythonhosted.org/packages/af/43/0bce905a965f36c58ff80d8bea33f1f9351b05fad4beaad4eae34699b7a1/scipy-1.15.3-cp312-cp312-macosx_14_0_x86_64.whl", hash = "sha256:06efcba926324df1696931a57a176c80848ccd67ce6ad020c810736bfd58eb1c", size = 25242454, upload-time = "2025-05-08T16:06:20.394Z" }, + { url = "https://files.pythonhosted.org/packages/56/30/a6f08f84ee5b7b28b4c597aca4cbe545535c39fe911845a96414700b64ba/scipy-1.15.3-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c05045d8b9bfd807ee1b9f38761993297b10b245f012b11b13b91ba8945f7e45", size = 35210199, upload-time = "2025-05-08T16:06:26.159Z" }, + { url = "https://files.pythonhosted.org/packages/0b/1f/03f52c282437a168ee2c7c14a1a0d0781a9a4a8962d84ac05c06b4c5b555/scipy-1.15.3-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:271e3713e645149ea5ea3e97b57fdab61ce61333f97cfae392c28ba786f9bb49", size = 37309455, upload-time = "2025-05-08T16:06:32.778Z" }, + { url = "https://files.pythonhosted.org/packages/89/b1/fbb53137f42c4bf630b1ffdfc2151a62d1d1b903b249f030d2b1c0280af8/scipy-1.15.3-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:6cfd56fc1a8e53f6e89ba3a7a7251f7396412d655bca2aa5611c8ec9a6784a1e", size = 36885140, upload-time = "2025-05-08T16:06:39.249Z" }, + { url = "https://files.pythonhosted.org/packages/2e/2e/025e39e339f5090df1ff266d021892694dbb7e63568edcfe43f892fa381d/scipy-1.15.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:0ff17c0bb1cb32952c09217d8d1eed9b53d1463e5f1dd6052c7857f83127d539", size = 39710549, upload-time = "2025-05-08T16:06:45.729Z" }, + { url = "https://files.pythonhosted.org/packages/e6/eb/3bf6ea8ab7f1503dca3a10df2e4b9c3f6b3316df07f6c0ded94b281c7101/scipy-1.15.3-cp312-cp312-win_amd64.whl", hash = "sha256:52092bc0472cfd17df49ff17e70624345efece4e1a12b23783a1ac59a1b728ed", size = 40966184, upload-time = "2025-05-08T16:06:52.623Z" }, + { url = "https://files.pythonhosted.org/packages/73/18/ec27848c9baae6e0d6573eda6e01a602e5649ee72c27c3a8aad673ebecfd/scipy-1.15.3-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:2c620736bcc334782e24d173c0fdbb7590a0a436d2fdf39310a8902505008759", size = 38728256, upload-time = "2025-05-08T16:06:58.696Z" }, + { url = "https://files.pythonhosted.org/packages/74/cd/1aef2184948728b4b6e21267d53b3339762c285a46a274ebb7863c9e4742/scipy-1.15.3-cp313-cp313-macosx_12_0_arm64.whl", hash = "sha256:7e11270a000969409d37ed399585ee530b9ef6aa99d50c019de4cb01e8e54e62", size = 30109540, upload-time = "2025-05-08T16:07:04.209Z" }, + { url = "https://files.pythonhosted.org/packages/5b/d8/59e452c0a255ec352bd0a833537a3bc1bfb679944c4938ab375b0a6b3a3e/scipy-1.15.3-cp313-cp313-macosx_14_0_arm64.whl", hash = "sha256:8c9ed3ba2c8a2ce098163a9bdb26f891746d02136995df25227a20e71c396ebb", size = 22383115, upload-time = "2025-05-08T16:07:08.998Z" }, + { url = "https://files.pythonhosted.org/packages/08/f5/456f56bbbfccf696263b47095291040655e3cbaf05d063bdc7c7517f32ac/scipy-1.15.3-cp313-cp313-macosx_14_0_x86_64.whl", hash = "sha256:0bdd905264c0c9cfa74a4772cdb2070171790381a5c4d312c973382fc6eaf730", size = 25163884, upload-time = "2025-05-08T16:07:14.091Z" }, + { url = "https://files.pythonhosted.org/packages/a2/66/a9618b6a435a0f0c0b8a6d0a2efb32d4ec5a85f023c2b79d39512040355b/scipy-1.15.3-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:79167bba085c31f38603e11a267d862957cbb3ce018d8b38f79ac043bc92d825", size = 35174018, upload-time = "2025-05-08T16:07:19.427Z" }, + { url = "https://files.pythonhosted.org/packages/b5/09/c5b6734a50ad4882432b6bb7c02baf757f5b2f256041da5df242e2d7e6b6/scipy-1.15.3-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c9deabd6d547aee2c9a81dee6cc96c6d7e9a9b1953f74850c179f91fdc729cb7", size = 37269716, upload-time = "2025-05-08T16:07:25.712Z" }, + { url = "https://files.pythonhosted.org/packages/77/0a/eac00ff741f23bcabd352731ed9b8995a0a60ef57f5fd788d611d43d69a1/scipy-1.15.3-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:dde4fc32993071ac0c7dd2d82569e544f0bdaff66269cb475e0f369adad13f11", size = 36872342, upload-time = "2025-05-08T16:07:31.468Z" }, + { url = "https://files.pythonhosted.org/packages/fe/54/4379be86dd74b6ad81551689107360d9a3e18f24d20767a2d5b9253a3f0a/scipy-1.15.3-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:f77f853d584e72e874d87357ad70f44b437331507d1c311457bed8ed2b956126", size = 39670869, upload-time = "2025-05-08T16:07:38.002Z" }, + { url = "https://files.pythonhosted.org/packages/87/2e/892ad2862ba54f084ffe8cc4a22667eaf9c2bcec6d2bff1d15713c6c0703/scipy-1.15.3-cp313-cp313-win_amd64.whl", hash = "sha256:b90ab29d0c37ec9bf55424c064312930ca5f4bde15ee8619ee44e69319aab163", size = 40988851, upload-time = "2025-05-08T16:08:33.671Z" }, + { url = "https://files.pythonhosted.org/packages/1b/e9/7a879c137f7e55b30d75d90ce3eb468197646bc7b443ac036ae3fe109055/scipy-1.15.3-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:3ac07623267feb3ae308487c260ac684b32ea35fd81e12845039952f558047b8", size = 38863011, upload-time = "2025-05-08T16:07:44.039Z" }, + { url = "https://files.pythonhosted.org/packages/51/d1/226a806bbd69f62ce5ef5f3ffadc35286e9fbc802f606a07eb83bf2359de/scipy-1.15.3-cp313-cp313t-macosx_12_0_arm64.whl", hash = "sha256:6487aa99c2a3d509a5227d9a5e889ff05830a06b2ce08ec30df6d79db5fcd5c5", size = 30266407, upload-time = "2025-05-08T16:07:49.891Z" }, + { url = "https://files.pythonhosted.org/packages/e5/9b/f32d1d6093ab9eeabbd839b0f7619c62e46cc4b7b6dbf05b6e615bbd4400/scipy-1.15.3-cp313-cp313t-macosx_14_0_arm64.whl", hash = "sha256:50f9e62461c95d933d5c5ef4a1f2ebf9a2b4e83b0db374cb3f1de104d935922e", size = 22540030, upload-time = "2025-05-08T16:07:54.121Z" }, + { url = "https://files.pythonhosted.org/packages/e7/29/c278f699b095c1a884f29fda126340fcc201461ee8bfea5c8bdb1c7c958b/scipy-1.15.3-cp313-cp313t-macosx_14_0_x86_64.whl", hash = "sha256:14ed70039d182f411ffc74789a16df3835e05dc469b898233a245cdfd7f162cb", size = 25218709, upload-time = "2025-05-08T16:07:58.506Z" }, + { url = "https://files.pythonhosted.org/packages/24/18/9e5374b617aba742a990581373cd6b68a2945d65cc588482749ef2e64467/scipy-1.15.3-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0a769105537aa07a69468a0eefcd121be52006db61cdd8cac8a0e68980bbb723", size = 34809045, upload-time = "2025-05-08T16:08:03.929Z" }, + { url = "https://files.pythonhosted.org/packages/e1/fe/9c4361e7ba2927074360856db6135ef4904d505e9b3afbbcb073c4008328/scipy-1.15.3-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9db984639887e3dffb3928d118145ffe40eff2fa40cb241a306ec57c219ebbbb", size = 36703062, upload-time = "2025-05-08T16:08:09.558Z" }, + { url = "https://files.pythonhosted.org/packages/b7/8e/038ccfe29d272b30086b25a4960f757f97122cb2ec42e62b460d02fe98e9/scipy-1.15.3-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:40e54d5c7e7ebf1aa596c374c49fa3135f04648a0caabcb66c52884b943f02b4", size = 36393132, upload-time = "2025-05-08T16:08:15.34Z" }, + { url = "https://files.pythonhosted.org/packages/10/7e/5c12285452970be5bdbe8352c619250b97ebf7917d7a9a9e96b8a8140f17/scipy-1.15.3-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:5e721fed53187e71d0ccf382b6bf977644c533e506c4d33c3fb24de89f5c3ed5", size = 38979503, upload-time = "2025-05-08T16:08:21.513Z" }, + { url = "https://files.pythonhosted.org/packages/81/06/0a5e5349474e1cbc5757975b21bd4fad0e72ebf138c5592f191646154e06/scipy-1.15.3-cp313-cp313t-win_amd64.whl", hash = "sha256:76ad1fb5f8752eabf0fa02e4cc0336b4e8f021e2d5f061ed37d6d264db35e3ca", size = 40308097, upload-time = "2025-05-08T16:08:27.627Z" }, +] + +[[package]] +name = "scipy" +version = "1.16.3" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version >= '3.14'", + "python_full_version >= '3.11' and python_full_version < '3.14'", +] +dependencies = [ + { name = "numpy", version = "1.26.4", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/0a/ca/d8ace4f98322d01abcd52d381134344bf7b431eba7ed8b42bdea5a3c2ac9/scipy-1.16.3.tar.gz", hash = "sha256:01e87659402762f43bd2fee13370553a17ada367d42e7487800bf2916535aecb", size = 30597883, upload-time = "2025-10-28T17:38:54.068Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/9b/5f/6f37d7439de1455ce9c5a556b8d1db0979f03a796c030bafdf08d35b7bf9/scipy-1.16.3-cp311-cp311-macosx_10_14_x86_64.whl", hash = "sha256:40be6cf99e68b6c4321e9f8782e7d5ff8265af28ef2cd56e9c9b2638fa08ad97", size = 36630881, upload-time = "2025-10-28T17:31:47.104Z" }, + { url = "https://files.pythonhosted.org/packages/7c/89/d70e9f628749b7e4db2aa4cd89735502ff3f08f7b9b27d2e799485987cd9/scipy-1.16.3-cp311-cp311-macosx_12_0_arm64.whl", hash = "sha256:8be1ca9170fcb6223cc7c27f4305d680ded114a1567c0bd2bfcbf947d1b17511", size = 28941012, upload-time = "2025-10-28T17:31:53.411Z" }, + { url = "https://files.pythonhosted.org/packages/a8/a8/0e7a9a6872a923505dbdf6bb93451edcac120363131c19013044a1e7cb0c/scipy-1.16.3-cp311-cp311-macosx_14_0_arm64.whl", hash = "sha256:bea0a62734d20d67608660f69dcda23e7f90fb4ca20974ab80b6ed40df87a005", size = 20931935, upload-time = "2025-10-28T17:31:57.361Z" }, + { url = "https://files.pythonhosted.org/packages/bd/c7/020fb72bd79ad798e4dbe53938543ecb96b3a9ac3fe274b7189e23e27353/scipy-1.16.3-cp311-cp311-macosx_14_0_x86_64.whl", hash = "sha256:2a207a6ce9c24f1951241f4693ede2d393f59c07abc159b2cb2be980820e01fb", size = 23534466, upload-time = "2025-10-28T17:32:01.875Z" }, + { url = "https://files.pythonhosted.org/packages/be/a0/668c4609ce6dbf2f948e167836ccaf897f95fb63fa231c87da7558a374cd/scipy-1.16.3-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:532fb5ad6a87e9e9cd9c959b106b73145a03f04c7d57ea3e6f6bb60b86ab0876", size = 33593618, upload-time = "2025-10-28T17:32:06.902Z" }, + { url = "https://files.pythonhosted.org/packages/ca/6e/8942461cf2636cdae083e3eb72622a7fbbfa5cf559c7d13ab250a5dbdc01/scipy-1.16.3-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:0151a0749efeaaab78711c78422d413c583b8cdd2011a3c1d6c794938ee9fdb2", size = 35899798, upload-time = "2025-10-28T17:32:12.665Z" }, + { url = "https://files.pythonhosted.org/packages/79/e8/d0f33590364cdbd67f28ce79368b373889faa4ee959588beddf6daef9abe/scipy-1.16.3-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:b7180967113560cca57418a7bc719e30366b47959dd845a93206fbed693c867e", size = 36226154, upload-time = "2025-10-28T17:32:17.961Z" }, + { url = "https://files.pythonhosted.org/packages/39/c1/1903de608c0c924a1749c590064e65810f8046e437aba6be365abc4f7557/scipy-1.16.3-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:deb3841c925eeddb6afc1e4e4a45e418d19ec7b87c5df177695224078e8ec733", size = 38878540, upload-time = "2025-10-28T17:32:23.907Z" }, + { url = "https://files.pythonhosted.org/packages/f1/d0/22ec7036ba0b0a35bccb7f25ab407382ed34af0b111475eb301c16f8a2e5/scipy-1.16.3-cp311-cp311-win_amd64.whl", hash = "sha256:53c3844d527213631e886621df5695d35e4f6a75f620dca412bcd292f6b87d78", size = 38722107, upload-time = "2025-10-28T17:32:29.921Z" }, + { url = "https://files.pythonhosted.org/packages/7b/60/8a00e5a524bb3bf8898db1650d350f50e6cffb9d7a491c561dc9826c7515/scipy-1.16.3-cp311-cp311-win_arm64.whl", hash = "sha256:9452781bd879b14b6f055b26643703551320aa8d79ae064a71df55c00286a184", size = 25506272, upload-time = "2025-10-28T17:32:34.577Z" }, + { url = "https://files.pythonhosted.org/packages/40/41/5bf55c3f386b1643812f3a5674edf74b26184378ef0f3e7c7a09a7e2ca7f/scipy-1.16.3-cp312-cp312-macosx_10_14_x86_64.whl", hash = "sha256:81fc5827606858cf71446a5e98715ba0e11f0dbc83d71c7409d05486592a45d6", size = 36659043, upload-time = "2025-10-28T17:32:40.285Z" }, + { url = "https://files.pythonhosted.org/packages/1e/0f/65582071948cfc45d43e9870bf7ca5f0e0684e165d7c9ef4e50d783073eb/scipy-1.16.3-cp312-cp312-macosx_12_0_arm64.whl", hash = "sha256:c97176013d404c7346bf57874eaac5187d969293bf40497140b0a2b2b7482e07", size = 28898986, upload-time = "2025-10-28T17:32:45.325Z" }, + { url = "https://files.pythonhosted.org/packages/96/5e/36bf3f0ac298187d1ceadde9051177d6a4fe4d507e8f59067dc9dd39e650/scipy-1.16.3-cp312-cp312-macosx_14_0_arm64.whl", hash = "sha256:2b71d93c8a9936046866acebc915e2af2e292b883ed6e2cbe5c34beb094b82d9", size = 20889814, upload-time = "2025-10-28T17:32:49.277Z" }, + { url = "https://files.pythonhosted.org/packages/80/35/178d9d0c35394d5d5211bbff7ac4f2986c5488b59506fef9e1de13ea28d3/scipy-1.16.3-cp312-cp312-macosx_14_0_x86_64.whl", hash = "sha256:3d4a07a8e785d80289dfe66b7c27d8634a773020742ec7187b85ccc4b0e7b686", size = 23565795, upload-time = "2025-10-28T17:32:53.337Z" }, + { url = "https://files.pythonhosted.org/packages/fa/46/d1146ff536d034d02f83c8afc3c4bab2eddb634624d6529a8512f3afc9da/scipy-1.16.3-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:0553371015692a898e1aa858fed67a3576c34edefa6b7ebdb4e9dde49ce5c203", size = 33349476, upload-time = "2025-10-28T17:32:58.353Z" }, + { url = "https://files.pythonhosted.org/packages/79/2e/415119c9ab3e62249e18c2b082c07aff907a273741b3f8160414b0e9193c/scipy-1.16.3-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:72d1717fd3b5e6ec747327ce9bda32d5463f472c9dce9f54499e81fbd50245a1", size = 35676692, upload-time = "2025-10-28T17:33:03.88Z" }, + { url = "https://files.pythonhosted.org/packages/27/82/df26e44da78bf8d2aeaf7566082260cfa15955a5a6e96e6a29935b64132f/scipy-1.16.3-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:1fb2472e72e24d1530debe6ae078db70fb1605350c88a3d14bc401d6306dbffe", size = 36019345, upload-time = "2025-10-28T17:33:09.773Z" }, + { url = "https://files.pythonhosted.org/packages/82/31/006cbb4b648ba379a95c87262c2855cd0d09453e500937f78b30f02fa1cd/scipy-1.16.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:c5192722cffe15f9329a3948c4b1db789fbb1f05c97899187dcf009b283aea70", size = 38678975, upload-time = "2025-10-28T17:33:15.809Z" }, + { url = "https://files.pythonhosted.org/packages/c2/7f/acbd28c97e990b421af7d6d6cd416358c9c293fc958b8529e0bd5d2a2a19/scipy-1.16.3-cp312-cp312-win_amd64.whl", hash = "sha256:56edc65510d1331dae01ef9b658d428e33ed48b4f77b1d51caf479a0253f96dc", size = 38555926, upload-time = "2025-10-28T17:33:21.388Z" }, + { url = "https://files.pythonhosted.org/packages/ce/69/c5c7807fd007dad4f48e0a5f2153038dc96e8725d3345b9ee31b2b7bed46/scipy-1.16.3-cp312-cp312-win_arm64.whl", hash = "sha256:a8a26c78ef223d3e30920ef759e25625a0ecdd0d60e5a8818b7513c3e5384cf2", size = 25463014, upload-time = "2025-10-28T17:33:25.975Z" }, + { url = "https://files.pythonhosted.org/packages/72/f1/57e8327ab1508272029e27eeef34f2302ffc156b69e7e233e906c2a5c379/scipy-1.16.3-cp313-cp313-macosx_10_14_x86_64.whl", hash = "sha256:d2ec56337675e61b312179a1ad124f5f570c00f920cc75e1000025451b88241c", size = 36617856, upload-time = "2025-10-28T17:33:31.375Z" }, + { url = "https://files.pythonhosted.org/packages/44/13/7e63cfba8a7452eb756306aa2fd9b37a29a323b672b964b4fdeded9a3f21/scipy-1.16.3-cp313-cp313-macosx_12_0_arm64.whl", hash = "sha256:16b8bc35a4cc24db80a0ec836a9286d0e31b2503cb2fd7ff7fb0e0374a97081d", size = 28874306, upload-time = "2025-10-28T17:33:36.516Z" }, + { url = "https://files.pythonhosted.org/packages/15/65/3a9400efd0228a176e6ec3454b1fa998fbbb5a8defa1672c3f65706987db/scipy-1.16.3-cp313-cp313-macosx_14_0_arm64.whl", hash = "sha256:5803c5fadd29de0cf27fa08ccbfe7a9e5d741bf63e4ab1085437266f12460ff9", size = 20865371, upload-time = "2025-10-28T17:33:42.094Z" }, + { url = "https://files.pythonhosted.org/packages/33/d7/eda09adf009a9fb81827194d4dd02d2e4bc752cef16737cc4ef065234031/scipy-1.16.3-cp313-cp313-macosx_14_0_x86_64.whl", hash = "sha256:b81c27fc41954319a943d43b20e07c40bdcd3ff7cf013f4fb86286faefe546c4", size = 23524877, upload-time = "2025-10-28T17:33:48.483Z" }, + { url = "https://files.pythonhosted.org/packages/7d/6b/3f911e1ebc364cb81320223a3422aab7d26c9c7973109a9cd0f27c64c6c0/scipy-1.16.3-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:0c3b4dd3d9b08dbce0f3440032c52e9e2ab9f96ade2d3943313dfe51a7056959", size = 33342103, upload-time = "2025-10-28T17:33:56.495Z" }, + { url = "https://files.pythonhosted.org/packages/21/f6/4bfb5695d8941e5c570a04d9fcd0d36bce7511b7d78e6e75c8f9791f82d0/scipy-1.16.3-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:7dc1360c06535ea6116a2220f760ae572db9f661aba2d88074fe30ec2aa1ff88", size = 35697297, upload-time = "2025-10-28T17:34:04.722Z" }, + { url = "https://files.pythonhosted.org/packages/04/e1/6496dadbc80d8d896ff72511ecfe2316b50313bfc3ebf07a3f580f08bd8c/scipy-1.16.3-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:663b8d66a8748051c3ee9c96465fb417509315b99c71550fda2591d7dd634234", size = 36021756, upload-time = "2025-10-28T17:34:13.482Z" }, + { url = "https://files.pythonhosted.org/packages/fe/bd/a8c7799e0136b987bda3e1b23d155bcb31aec68a4a472554df5f0937eef7/scipy-1.16.3-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:eab43fae33a0c39006a88096cd7b4f4ef545ea0447d250d5ac18202d40b6611d", size = 38696566, upload-time = "2025-10-28T17:34:22.384Z" }, + { url = "https://files.pythonhosted.org/packages/cd/01/1204382461fcbfeb05b6161b594f4007e78b6eba9b375382f79153172b4d/scipy-1.16.3-cp313-cp313-win_amd64.whl", hash = "sha256:062246acacbe9f8210de8e751b16fc37458213f124bef161a5a02c7a39284304", size = 38529877, upload-time = "2025-10-28T17:35:51.076Z" }, + { url = "https://files.pythonhosted.org/packages/7f/14/9d9fbcaa1260a94f4bb5b64ba9213ceb5d03cd88841fe9fd1ffd47a45b73/scipy-1.16.3-cp313-cp313-win_arm64.whl", hash = "sha256:50a3dbf286dbc7d84f176f9a1574c705f277cb6565069f88f60db9eafdbe3ee2", size = 25455366, upload-time = "2025-10-28T17:35:59.014Z" }, + { url = "https://files.pythonhosted.org/packages/e2/a3/9ec205bd49f42d45d77f1730dbad9ccf146244c1647605cf834b3a8c4f36/scipy-1.16.3-cp313-cp313t-macosx_10_14_x86_64.whl", hash = "sha256:fb4b29f4cf8cc5a8d628bc8d8e26d12d7278cd1f219f22698a378c3d67db5e4b", size = 37027931, upload-time = "2025-10-28T17:34:31.451Z" }, + { url = "https://files.pythonhosted.org/packages/25/06/ca9fd1f3a4589cbd825b1447e5db3a8ebb969c1eaf22c8579bd286f51b6d/scipy-1.16.3-cp313-cp313t-macosx_12_0_arm64.whl", hash = "sha256:8d09d72dc92742988b0e7750bddb8060b0c7079606c0d24a8cc8e9c9c11f9079", size = 29400081, upload-time = "2025-10-28T17:34:39.087Z" }, + { url = "https://files.pythonhosted.org/packages/6a/56/933e68210d92657d93fb0e381683bc0e53a965048d7358ff5fbf9e6a1b17/scipy-1.16.3-cp313-cp313t-macosx_14_0_arm64.whl", hash = "sha256:03192a35e661470197556de24e7cb1330d84b35b94ead65c46ad6f16f6b28f2a", size = 21391244, upload-time = "2025-10-28T17:34:45.234Z" }, + { url = "https://files.pythonhosted.org/packages/a8/7e/779845db03dc1418e215726329674b40576879b91814568757ff0014ad65/scipy-1.16.3-cp313-cp313t-macosx_14_0_x86_64.whl", hash = "sha256:57d01cb6f85e34f0946b33caa66e892aae072b64b034183f3d87c4025802a119", size = 23929753, upload-time = "2025-10-28T17:34:51.793Z" }, + { url = "https://files.pythonhosted.org/packages/4c/4b/f756cf8161d5365dcdef9e5f460ab226c068211030a175d2fc7f3f41ca64/scipy-1.16.3-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:96491a6a54e995f00a28a3c3badfff58fd093bf26cd5fb34a2188c8c756a3a2c", size = 33496912, upload-time = "2025-10-28T17:34:59.8Z" }, + { url = "https://files.pythonhosted.org/packages/09/b5/222b1e49a58668f23839ca1542a6322bb095ab8d6590d4f71723869a6c2c/scipy-1.16.3-cp313-cp313t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:cd13e354df9938598af2be05822c323e97132d5e6306b83a3b4ee6724c6e522e", size = 35802371, upload-time = "2025-10-28T17:35:08.173Z" }, + { url = "https://files.pythonhosted.org/packages/c1/8d/5964ef68bb31829bde27611f8c9deeac13764589fe74a75390242b64ca44/scipy-1.16.3-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:63d3cdacb8a824a295191a723ee5e4ea7768ca5ca5f2838532d9f2e2b3ce2135", size = 36190477, upload-time = "2025-10-28T17:35:16.7Z" }, + { url = "https://files.pythonhosted.org/packages/ab/f2/b31d75cb9b5fa4dd39a0a931ee9b33e7f6f36f23be5ef560bf72e0f92f32/scipy-1.16.3-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:e7efa2681ea410b10dde31a52b18b0154d66f2485328830e45fdf183af5aefc6", size = 38796678, upload-time = "2025-10-28T17:35:26.354Z" }, + { url = "https://files.pythonhosted.org/packages/b4/1e/b3723d8ff64ab548c38d87055483714fefe6ee20e0189b62352b5e015bb1/scipy-1.16.3-cp313-cp313t-win_amd64.whl", hash = "sha256:2d1ae2cf0c350e7705168ff2429962a89ad90c2d49d1dd300686d8b2a5af22fc", size = 38640178, upload-time = "2025-10-28T17:35:35.304Z" }, + { url = "https://files.pythonhosted.org/packages/8e/f3/d854ff38789aca9b0cc23008d607ced9de4f7ab14fa1ca4329f86b3758ca/scipy-1.16.3-cp313-cp313t-win_arm64.whl", hash = "sha256:0c623a54f7b79dd88ef56da19bc2873afec9673a48f3b85b18e4d402bdd29a5a", size = 25803246, upload-time = "2025-10-28T17:35:42.155Z" }, + { url = "https://files.pythonhosted.org/packages/99/f6/99b10fd70f2d864c1e29a28bbcaa0c6340f9d8518396542d9ea3b4aaae15/scipy-1.16.3-cp314-cp314-macosx_10_14_x86_64.whl", hash = "sha256:875555ce62743e1d54f06cdf22c1e0bc47b91130ac40fe5d783b6dfa114beeb6", size = 36606469, upload-time = "2025-10-28T17:36:08.741Z" }, + { url = "https://files.pythonhosted.org/packages/4d/74/043b54f2319f48ea940dd025779fa28ee360e6b95acb7cd188fad4391c6b/scipy-1.16.3-cp314-cp314-macosx_12_0_arm64.whl", hash = "sha256:bb61878c18a470021fb515a843dc7a76961a8daceaaaa8bad1332f1bf4b54657", size = 28872043, upload-time = "2025-10-28T17:36:16.599Z" }, + { url = "https://files.pythonhosted.org/packages/4d/e1/24b7e50cc1c4ee6ffbcb1f27fe9f4c8b40e7911675f6d2d20955f41c6348/scipy-1.16.3-cp314-cp314-macosx_14_0_arm64.whl", hash = "sha256:f2622206f5559784fa5c4b53a950c3c7c1cf3e84ca1b9c4b6c03f062f289ca26", size = 20862952, upload-time = "2025-10-28T17:36:22.966Z" }, + { url = "https://files.pythonhosted.org/packages/dd/3a/3e8c01a4d742b730df368e063787c6808597ccb38636ed821d10b39ca51b/scipy-1.16.3-cp314-cp314-macosx_14_0_x86_64.whl", hash = "sha256:7f68154688c515cdb541a31ef8eb66d8cd1050605be9dcd74199cbd22ac739bc", size = 23508512, upload-time = "2025-10-28T17:36:29.731Z" }, + { url = "https://files.pythonhosted.org/packages/1f/60/c45a12b98ad591536bfe5330cb3cfe1850d7570259303563b1721564d458/scipy-1.16.3-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:8b3c820ddb80029fe9f43d61b81d8b488d3ef8ca010d15122b152db77dc94c22", size = 33413639, upload-time = "2025-10-28T17:36:37.982Z" }, + { url = "https://files.pythonhosted.org/packages/71/bc/35957d88645476307e4839712642896689df442f3e53b0fa016ecf8a3357/scipy-1.16.3-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:d3837938ae715fc0fe3c39c0202de3a8853aff22ca66781ddc2ade7554b7e2cc", size = 35704729, upload-time = "2025-10-28T17:36:46.547Z" }, + { url = "https://files.pythonhosted.org/packages/3b/15/89105e659041b1ca11c386e9995aefacd513a78493656e57789f9d9eab61/scipy-1.16.3-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:aadd23f98f9cb069b3bd64ddc900c4d277778242e961751f77a8cb5c4b946fb0", size = 36086251, upload-time = "2025-10-28T17:36:55.161Z" }, + { url = "https://files.pythonhosted.org/packages/1a/87/c0ea673ac9c6cc50b3da2196d860273bc7389aa69b64efa8493bdd25b093/scipy-1.16.3-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:b7c5f1bda1354d6a19bc6af73a649f8285ca63ac6b52e64e658a5a11d4d69800", size = 38716681, upload-time = "2025-10-28T17:37:04.1Z" }, + { url = "https://files.pythonhosted.org/packages/91/06/837893227b043fb9b0d13e4bd7586982d8136cb249ffb3492930dab905b8/scipy-1.16.3-cp314-cp314-win_amd64.whl", hash = "sha256:e5d42a9472e7579e473879a1990327830493a7047506d58d73fc429b84c1d49d", size = 39358423, upload-time = "2025-10-28T17:38:20.005Z" }, + { url = "https://files.pythonhosted.org/packages/95/03/28bce0355e4d34a7c034727505a02d19548549e190bedd13a721e35380b7/scipy-1.16.3-cp314-cp314-win_arm64.whl", hash = "sha256:6020470b9d00245926f2d5bb93b119ca0340f0d564eb6fbaad843eaebf9d690f", size = 26135027, upload-time = "2025-10-28T17:38:24.966Z" }, + { url = "https://files.pythonhosted.org/packages/b2/6f/69f1e2b682efe9de8fe9f91040f0cd32f13cfccba690512ba4c582b0bc29/scipy-1.16.3-cp314-cp314t-macosx_10_14_x86_64.whl", hash = "sha256:e1d27cbcb4602680a49d787d90664fa4974063ac9d4134813332a8c53dbe667c", size = 37028379, upload-time = "2025-10-28T17:37:14.061Z" }, + { url = "https://files.pythonhosted.org/packages/7c/2d/e826f31624a5ebbab1cd93d30fd74349914753076ed0593e1d56a98c4fb4/scipy-1.16.3-cp314-cp314t-macosx_12_0_arm64.whl", hash = "sha256:9b9c9c07b6d56a35777a1b4cc8966118fb16cfd8daf6743867d17d36cfad2d40", size = 29400052, upload-time = "2025-10-28T17:37:21.709Z" }, + { url = "https://files.pythonhosted.org/packages/69/27/d24feb80155f41fd1f156bf144e7e049b4e2b9dd06261a242905e3bc7a03/scipy-1.16.3-cp314-cp314t-macosx_14_0_arm64.whl", hash = "sha256:3a4c460301fb2cffb7f88528f30b3127742cff583603aa7dc964a52c463b385d", size = 21391183, upload-time = "2025-10-28T17:37:29.559Z" }, + { url = "https://files.pythonhosted.org/packages/f8/d3/1b229e433074c5738a24277eca520a2319aac7465eea7310ea6ae0e98ae2/scipy-1.16.3-cp314-cp314t-macosx_14_0_x86_64.whl", hash = "sha256:f667a4542cc8917af1db06366d3f78a5c8e83badd56409f94d1eac8d8d9133fa", size = 23930174, upload-time = "2025-10-28T17:37:36.306Z" }, + { url = "https://files.pythonhosted.org/packages/16/9d/d9e148b0ec680c0f042581a2be79a28a7ab66c0c4946697f9e7553ead337/scipy-1.16.3-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:f379b54b77a597aa7ee5e697df0d66903e41b9c85a6dd7946159e356319158e8", size = 33497852, upload-time = "2025-10-28T17:37:42.228Z" }, + { url = "https://files.pythonhosted.org/packages/2f/22/4e5f7561e4f98b7bea63cf3fd7934bff1e3182e9f1626b089a679914d5c8/scipy-1.16.3-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:4aff59800a3b7f786b70bfd6ab551001cb553244988d7d6b8299cb1ea653b353", size = 35798595, upload-time = "2025-10-28T17:37:48.102Z" }, + { url = "https://files.pythonhosted.org/packages/83/42/6644d714c179429fc7196857866f219fef25238319b650bb32dde7bf7a48/scipy-1.16.3-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:da7763f55885045036fabcebd80144b757d3db06ab0861415d1c3b7c69042146", size = 36186269, upload-time = "2025-10-28T17:37:53.72Z" }, + { url = "https://files.pythonhosted.org/packages/ac/70/64b4d7ca92f9cf2e6fc6aaa2eecf80bb9b6b985043a9583f32f8177ea122/scipy-1.16.3-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:ffa6eea95283b2b8079b821dc11f50a17d0571c92b43e2b5b12764dc5f9b285d", size = 38802779, upload-time = "2025-10-28T17:37:59.393Z" }, + { url = "https://files.pythonhosted.org/packages/61/82/8d0e39f62764cce5ffd5284131e109f07cf8955aef9ab8ed4e3aa5e30539/scipy-1.16.3-cp314-cp314t-win_amd64.whl", hash = "sha256:d9f48cafc7ce94cf9b15c6bffdc443a81a27bf7075cf2dcd5c8b40f85d10c4e7", size = 39471128, upload-time = "2025-10-28T17:38:05.259Z" }, + { url = "https://files.pythonhosted.org/packages/64/47/a494741db7280eae6dc033510c319e34d42dd41b7ac0c7ead39354d1a2b5/scipy-1.16.3-cp314-cp314t-win_arm64.whl", hash = "sha256:21d9d6b197227a12dcbf9633320a4e34c6b0e51c57268df255a0942983bac562", size = 26464127, upload-time = "2025-10-28T17:38:11.34Z" }, +] + +[[package]] +name = "scooby" +version = "0.11.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/d1/d1/a28f3be1503a9c474a4878424bbeb93a55a2ec7d0cb66559aa258e690aea/scooby-0.11.0.tar.gz", hash = "sha256:3dfacc6becf2d6558efa4b625bae3b844ced5d256f3143ebf774e005367e712a", size = 22102, upload-time = "2025-11-01T19:22:53.894Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/a3/bb/bbae36d06c0fd670e8373da67096cd57058b57c9bad7d92969b5e3b730af/scooby-0.11.0-py3-none-any.whl", hash = "sha256:a79663d1a7711eb104e4b2935988ea1ed5f7be6b7288fad23b4fba7462832f9d", size = 19877, upload-time = "2025-11-01T19:22:53.046Z" }, +] + +[[package]] +name = "secretstorage" +version = "3.3.3" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version == '3.9.*'", + "python_full_version < '3.9'", +] +dependencies = [ + { name = "cryptography", marker = "python_full_version < '3.10'" }, + { name = "jeepney", marker = "python_full_version < '3.10'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/53/a4/f48c9d79cb507ed1373477dbceaba7401fd8a23af63b837fa61f1dcd3691/SecretStorage-3.3.3.tar.gz", hash = "sha256:2403533ef369eca6d2ba81718576c5e0f564d5cca1b58f73a8b23e7d4eeebd77", size = 19739, upload-time = "2022-08-13T16:22:46.976Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/54/24/b4293291fa1dd830f353d2cb163295742fa87f179fcc8a20a306a81978b7/SecretStorage-3.3.3-py3-none-any.whl", hash = "sha256:f356e6628222568e3af06f2eba8df495efa13b3b63081dafd4f7d9a7b7bc9f99", size = 15221, upload-time = "2022-08-13T16:22:44.457Z" }, +] + +[[package]] +name = "secretstorage" +version = "3.5.0" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version >= '3.14'", + "python_full_version >= '3.11' and python_full_version < '3.14'", + "python_full_version == '3.10.*'", +] +dependencies = [ + { name = "cryptography", marker = "python_full_version >= '3.10'" }, + { name = "jeepney", marker = "python_full_version >= '3.10'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/1c/03/e834bcd866f2f8a49a85eaff47340affa3bfa391ee9912a952a1faa68c7b/secretstorage-3.5.0.tar.gz", hash = "sha256:f04b8e4689cbce351744d5537bf6b1329c6fc68f91fa666f60a380edddcd11be", size = 19884, upload-time = "2025-11-23T19:02:53.191Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/b7/46/f5af3402b579fd5e11573ce652019a67074317e18c1935cc0b4ba9b35552/secretstorage-3.5.0-py3-none-any.whl", hash = "sha256:0ce65888c0725fcb2c5bc0fdb8e5438eece02c523557ea40ce0703c266248137", size = 15554, upload-time = "2025-11-23T19:02:51.545Z" }, +] + +[[package]] +name = "send2trash" +version = "1.8.3" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/fd/3a/aec9b02217bb79b87bbc1a21bc6abc51e3d5dcf65c30487ac96c0908c722/Send2Trash-1.8.3.tar.gz", hash = "sha256:b18e7a3966d99871aefeb00cfbcfdced55ce4871194810fc71f4aa484b953abf", size = 17394, upload-time = "2024-04-07T00:01:09.267Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/40/b0/4562db6223154aa4e22f939003cb92514c79f3d4dccca3444253fd17f902/Send2Trash-1.8.3-py3-none-any.whl", hash = "sha256:0c31227e0bd08961c7665474a3d1ef7193929fedda4233843689baa056be46c9", size = 18072, upload-time = "2024-04-07T00:01:07.438Z" }, +] + +[[package]] +name = "setuptools" +version = "75.3.2" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version < '3.9'", +] +sdist = { url = "https://files.pythonhosted.org/packages/5c/01/771ea46cce201dd42cff043a5eea929d1c030fb3d1c2ee2729d02ca7814c/setuptools-75.3.2.tar.gz", hash = "sha256:3c1383e1038b68556a382c1e8ded8887cd20141b0eb5708a6c8d277de49364f5", size = 1354489, upload-time = "2025-03-12T00:02:19.004Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/15/65/3f0dba35760d902849d39d38c0a72767794b1963227b69a587f8a336d08c/setuptools-75.3.2-py3-none-any.whl", hash = "sha256:90ab613b6583fc02d5369cbca13ea26ea0e182d1df2d943ee9cbe81d4c61add9", size = 1251198, upload-time = "2025-03-12T00:02:17.554Z" }, +] + +[[package]] +name = "setuptools" +version = "80.9.0" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version >= '3.14'", + "python_full_version >= '3.11' and python_full_version < '3.14'", + "python_full_version == '3.10.*'", + "python_full_version == '3.9.*'", +] +sdist = { url = "https://files.pythonhosted.org/packages/18/5d/3bf57dcd21979b887f014ea83c24ae194cfcd12b9e0fda66b957c69d1fca/setuptools-80.9.0.tar.gz", hash = "sha256:f36b47402ecde768dbfafc46e8e4207b4360c654f1f3bb84475f0a28628fb19c", size = 1319958, upload-time = "2025-05-27T00:56:51.443Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/a3/dc/17031897dae0efacfea57dfd3a82fdd2a2aeb58e0ff71b77b87e44edc772/setuptools-80.9.0-py3-none-any.whl", hash = "sha256:062d34222ad13e0cc312a4c02d73f059e86a4acbfbdea8f8f76b28c99f306922", size = 1201486, upload-time = "2025-05-27T00:56:49.664Z" }, +] + +[[package]] +name = "simpervisor" +version = "1.0.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/dd/fc/9182a4049036c5de29f84a16c5a33304ffc4dbb06d76d569ded8ad527574/simpervisor-1.0.0.tar.gz", hash = "sha256:7eb87ca86d5e276976f5bb0290975a05d452c6a7b7f58062daea7d8369c823c1", size = 14637, upload-time = "2023-05-18T14:01:27.069Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/9e/65/be223a02df814a3dbd84d8a0c446d21d4860a4f23ec4d81aabea34e7e994/simpervisor-1.0.0-py3-none-any.whl", hash = "sha256:3e313318264559beea3f475ead202bc1cd58a2f1288363abb5657d306c5b8388", size = 8342, upload-time = "2023-05-18T14:01:25.92Z" }, +] + +[[package]] +name = "six" +version = "1.17.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/94/e7/b2c673351809dca68a0e064b6af791aa332cf192da575fd474ed7d6f16a2/six-1.17.0.tar.gz", hash = "sha256:ff70335d468e7eb6ec65b95b99d3a2836546063f63acc5171de367e834932a81", size = 34031, upload-time = "2024-12-04T17:35:28.174Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/b7/ce/149a00dd41f10bc29e5921b496af8b574d8413afcd5e30dfa0ed46c2cc5e/six-1.17.0-py2.py3-none-any.whl", hash = "sha256:4721f391ed90541fddacab5acf947aa0d3dc7d27b2e1e8eda2be8970586c3274", size = 11050, upload-time = "2024-12-04T17:35:26.475Z" }, +] + +[[package]] +name = "sniffio" +version = "1.3.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/a2/87/a6771e1546d97e7e041b6ae58d80074f81b7d5121207425c964ddf5cfdbd/sniffio-1.3.1.tar.gz", hash = "sha256:f4324edc670a0f49750a81b895f35c3adb843cca46f0530f79fc1babb23789dc", size = 20372, upload-time = "2024-02-25T23:20:04.057Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/e9/44/75a9c9421471a6c4805dbf2356f7c181a29c1879239abab1ea2cc8f38b40/sniffio-1.3.1-py3-none-any.whl", hash = "sha256:2f6da418d1f1e0fddd844478f41680e794e6051915791a034ff65e5f100525a2", size = 10235, upload-time = "2024-02-25T23:20:01.196Z" }, +] + +[[package]] +name = "snowballstemmer" +version = "3.0.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/75/a7/9810d872919697c9d01295633f5d574fb416d47e535f258272ca1f01f447/snowballstemmer-3.0.1.tar.gz", hash = "sha256:6d5eeeec8e9f84d4d56b847692bacf79bc2c8e90c7f80ca4444ff8b6f2e52895", size = 105575, upload-time = "2025-05-09T16:34:51.843Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/c8/78/3565d011c61f5a43488987ee32b6f3f656e7f107ac2782dd57bdd7d91d9a/snowballstemmer-3.0.1-py3-none-any.whl", hash = "sha256:6cd7b3897da8d6c9ffb968a6781fa6532dce9c3618a4b127d920dab764a19064", size = 103274, upload-time = "2025-05-09T16:34:50.371Z" }, +] + +[[package]] +name = "soupsieve" +version = "2.7" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version < '3.9'", +] +sdist = { url = "https://files.pythonhosted.org/packages/3f/f4/4a80cd6ef364b2e8b65b15816a843c0980f7a5a2b4dc701fc574952aa19f/soupsieve-2.7.tar.gz", hash = "sha256:ad282f9b6926286d2ead4750552c8a6142bc4c783fd66b0293547c8fe6ae126a", size = 103418, upload-time = "2025-04-20T18:50:08.518Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/e7/9c/0e6afc12c269578be5c0c1c9f4b49a8d32770a080260c333ac04cc1c832d/soupsieve-2.7-py3-none-any.whl", hash = "sha256:6e60cc5c1ffaf1cebcc12e8188320b72071e922c2e897f737cadce79ad5d30c4", size = 36677, upload-time = "2025-04-20T18:50:07.196Z" }, +] + +[[package]] +name = "soupsieve" +version = "2.8" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version >= '3.14'", + "python_full_version >= '3.11' and python_full_version < '3.14'", + "python_full_version == '3.10.*'", + "python_full_version == '3.9.*'", +] +sdist = { url = "https://files.pythonhosted.org/packages/6d/e6/21ccce3262dd4889aa3332e5a119a3491a95e8f60939870a3a035aabac0d/soupsieve-2.8.tar.gz", hash = "sha256:e2dd4a40a628cb5f28f6d4b0db8800b8f581b65bb380b97de22ba5ca8d72572f", size = 103472, upload-time = "2025-08-27T15:39:51.78Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/14/a0/bb38d3b76b8cae341dad93a2dd83ab7462e6dbcdd84d43f54ee60a8dc167/soupsieve-2.8-py3-none-any.whl", hash = "sha256:0cc76456a30e20f5d7f2e14a98a4ae2ee4e5abdc7c5ea0aafe795f344bc7984c", size = 36679, upload-time = "2025-08-27T15:39:50.179Z" }, +] + +[[package]] +name = "sphinx" +version = "7.1.2" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version < '3.9'", +] +dependencies = [ + { name = "alabaster", version = "0.7.13", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.9'" }, + { name = "babel", marker = "python_full_version < '3.9'" }, + { name = "colorama", marker = "python_full_version < '3.9' and sys_platform == 'win32'" }, + { name = "docutils", version = "0.20.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.9'" }, + { name = "imagesize", marker = "python_full_version < '3.9'" }, + { name = "importlib-metadata", version = "8.5.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.9'" }, + { name = "jinja2", marker = "python_full_version < '3.9'" }, + { name = "packaging", marker = "python_full_version < '3.9'" }, + { name = "pygments", marker = "python_full_version < '3.9'" }, + { name = "requests", version = "2.32.4", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.9'" }, + { name = "snowballstemmer", marker = "python_full_version < '3.9'" }, + { name = "sphinxcontrib-applehelp", version = "1.0.4", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.9'" }, + { name = "sphinxcontrib-devhelp", version = "1.0.2", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.9'" }, + { name = "sphinxcontrib-htmlhelp", version = "2.0.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.9'" }, + { name = "sphinxcontrib-jsmath", marker = "python_full_version < '3.9'" }, + { name = "sphinxcontrib-qthelp", version = "1.0.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.9'" }, + { name = "sphinxcontrib-serializinghtml", version = "1.1.5", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.9'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/dc/01/688bdf9282241dca09fe6e3a1110eda399fa9b10d0672db609e37c2e7a39/sphinx-7.1.2.tar.gz", hash = "sha256:780f4d32f1d7d1126576e0e5ecc19dc32ab76cd24e950228dcf7b1f6d3d9e22f", size = 6828258, upload-time = "2023-08-02T02:06:09.375Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/48/17/325cf6a257d84751a48ae90752b3d8fe0be8f9535b6253add61c49d0d9bc/sphinx-7.1.2-py3-none-any.whl", hash = "sha256:d170a81825b2fcacb6dfd5a0d7f578a053e45d3f2b153fecc948c37344eb4cbe", size = 3169543, upload-time = "2023-08-02T02:06:06.816Z" }, +] + +[[package]] +name = "sphinx" +version = "7.4.7" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version == '3.9.*'", +] +dependencies = [ + { name = "alabaster", version = "0.7.16", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version == '3.9.*'" }, + { name = "babel", marker = "python_full_version == '3.9.*'" }, + { name = "colorama", marker = "python_full_version == '3.9.*' and sys_platform == 'win32'" }, + { name = "docutils", version = "0.21.2", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version == '3.9.*'" }, + { name = "imagesize", marker = "python_full_version == '3.9.*'" }, + { name = "importlib-metadata", version = "8.7.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version == '3.9.*'" }, + { name = "jinja2", marker = "python_full_version == '3.9.*'" }, + { name = "packaging", marker = "python_full_version == '3.9.*'" }, + { name = "pygments", marker = "python_full_version == '3.9.*'" }, + { name = "requests", version = "2.32.5", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version == '3.9.*'" }, + { name = "snowballstemmer", marker = "python_full_version == '3.9.*'" }, + { name = "sphinxcontrib-applehelp", version = "2.0.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version == '3.9.*'" }, + { name = "sphinxcontrib-devhelp", version = "2.0.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version == '3.9.*'" }, + { name = "sphinxcontrib-htmlhelp", version = "2.1.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version == '3.9.*'" }, + { name = "sphinxcontrib-jsmath", marker = "python_full_version == '3.9.*'" }, + { name = "sphinxcontrib-qthelp", version = "2.0.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version == '3.9.*'" }, + { name = "sphinxcontrib-serializinghtml", version = "2.0.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version == '3.9.*'" }, + { name = "tomli", marker = "python_full_version == '3.9.*'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/5b/be/50e50cb4f2eff47df05673d361095cafd95521d2a22521b920c67a372dcb/sphinx-7.4.7.tar.gz", hash = "sha256:242f92a7ea7e6c5b406fdc2615413890ba9f699114a9c09192d7dfead2ee9cfe", size = 8067911, upload-time = "2024-07-20T14:46:56.059Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/0d/ef/153f6803c5d5f8917dbb7f7fcf6d34a871ede3296fa89c2c703f5f8a6c8e/sphinx-7.4.7-py3-none-any.whl", hash = "sha256:c2419e2135d11f1951cd994d6eb18a1835bd8fdd8429f9ca375dc1f3281bd239", size = 3401624, upload-time = "2024-07-20T14:46:52.142Z" }, +] + +[[package]] +name = "sphinx" +version = "8.1.3" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version == '3.10.*'", +] +dependencies = [ + { name = "alabaster", version = "1.0.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version == '3.10.*'" }, + { name = "babel", marker = "python_full_version == '3.10.*'" }, + { name = "colorama", marker = "python_full_version == '3.10.*' and sys_platform == 'win32'" }, + { name = "docutils", version = "0.21.2", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version == '3.10.*'" }, + { name = "imagesize", marker = "python_full_version == '3.10.*'" }, + { name = "jinja2", marker = "python_full_version == '3.10.*'" }, + { name = "packaging", marker = "python_full_version == '3.10.*'" }, + { name = "pygments", marker = "python_full_version == '3.10.*'" }, + { name = "requests", version = "2.32.5", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version == '3.10.*'" }, + { name = "snowballstemmer", marker = "python_full_version == '3.10.*'" }, + { name = "sphinxcontrib-applehelp", version = "2.0.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version == '3.10.*'" }, + { name = "sphinxcontrib-devhelp", version = "2.0.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version == '3.10.*'" }, + { name = "sphinxcontrib-htmlhelp", version = "2.1.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version == '3.10.*'" }, + { name = "sphinxcontrib-jsmath", marker = "python_full_version == '3.10.*'" }, + { name = "sphinxcontrib-qthelp", version = "2.0.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version == '3.10.*'" }, + { name = "sphinxcontrib-serializinghtml", version = "2.0.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version == '3.10.*'" }, + { name = "tomli", marker = "python_full_version == '3.10.*'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/6f/6d/be0b61178fe2cdcb67e2a92fc9ebb488e3c51c4f74a36a7824c0adf23425/sphinx-8.1.3.tar.gz", hash = "sha256:43c1911eecb0d3e161ad78611bc905d1ad0e523e4ddc202a58a821773dc4c927", size = 8184611, upload-time = "2024-10-13T20:27:13.93Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/26/60/1ddff83a56d33aaf6f10ec8ce84b4c007d9368b21008876fceda7e7381ef/sphinx-8.1.3-py3-none-any.whl", hash = "sha256:09719015511837b76bf6e03e42eb7595ac8c2e41eeb9c29c5b755c6b677992a2", size = 3487125, upload-time = "2024-10-13T20:27:10.448Z" }, +] + +[[package]] +name = "sphinx" +version = "8.2.3" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version >= '3.14'", + "python_full_version >= '3.11' and python_full_version < '3.14'", +] +dependencies = [ + { name = "alabaster", version = "1.0.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, + { name = "babel", marker = "python_full_version >= '3.11'" }, + { name = "colorama", marker = "python_full_version >= '3.11' and sys_platform == 'win32'" }, + { name = "docutils", version = "0.21.2", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, + { name = "imagesize", marker = "python_full_version >= '3.11'" }, + { name = "jinja2", marker = "python_full_version >= '3.11'" }, + { name = "packaging", marker = "python_full_version >= '3.11'" }, + { name = "pygments", marker = "python_full_version >= '3.11'" }, + { name = "requests", version = "2.32.5", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, + { name = "roman-numerals-py", marker = "python_full_version >= '3.11'" }, + { name = "snowballstemmer", marker = "python_full_version >= '3.11'" }, + { name = "sphinxcontrib-applehelp", version = "2.0.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, + { name = "sphinxcontrib-devhelp", version = "2.0.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, + { name = "sphinxcontrib-htmlhelp", version = "2.1.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, + { name = "sphinxcontrib-jsmath", marker = "python_full_version >= '3.11'" }, + { name = "sphinxcontrib-qthelp", version = "2.0.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, + { name = "sphinxcontrib-serializinghtml", version = "2.0.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/38/ad/4360e50ed56cb483667b8e6dadf2d3fda62359593faabbe749a27c4eaca6/sphinx-8.2.3.tar.gz", hash = "sha256:398ad29dee7f63a75888314e9424d40f52ce5a6a87ae88e7071e80af296ec348", size = 8321876, upload-time = "2025-03-02T22:31:59.658Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/31/53/136e9eca6e0b9dc0e1962e2c908fbea2e5ac000c2a2fbd9a35797958c48b/sphinx-8.2.3-py3-none-any.whl", hash = "sha256:4405915165f13521d875a8c29c8970800a0141c14cc5416a38feca4ea5d9b9c3", size = 3589741, upload-time = "2025-03-02T22:31:56.836Z" }, +] + +[[package]] +name = "sphinx-copybutton" +version = "0.5.2" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "sphinx", version = "7.1.2", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.9'" }, + { name = "sphinx", version = "7.4.7", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version == '3.9.*'" }, + { name = "sphinx", version = "8.1.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version == '3.10.*'" }, + { name = "sphinx", version = "8.2.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/fc/2b/a964715e7f5295f77509e59309959f4125122d648f86b4fe7d70ca1d882c/sphinx-copybutton-0.5.2.tar.gz", hash = "sha256:4cf17c82fb9646d1bc9ca92ac280813a3b605d8c421225fd9913154103ee1fbd", size = 23039, upload-time = "2023-04-14T08:10:22.998Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/9e/48/1ea60e74949eecb12cdd6ac43987f9fd331156388dcc2319b45e2ebb81bf/sphinx_copybutton-0.5.2-py3-none-any.whl", hash = "sha256:fb543fd386d917746c9a2c50360c7905b605726b9355cd26e9974857afeae06e", size = 13343, upload-time = "2023-04-14T08:10:20.844Z" }, +] + +[[package]] +name = "sphinx-design" +version = "0.5.0" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version < '3.9'", +] +dependencies = [ + { name = "sphinx", version = "7.1.2", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.9'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/fd/d0/62a7cee178d30f7217c4badea17eeca020801c0053773098d9ff65636a60/sphinx_design-0.5.0.tar.gz", hash = "sha256:e8e513acea6f92d15c6de3b34e954458f245b8e761b45b63950f65373352ab00", size = 2152330, upload-time = "2023-07-27T12:45:33.302Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/17/52/a1e9d72ecf56047df714a3dd0840a5148e4e83c100e8e0046bcea60a1054/sphinx_design-0.5.0-py3-none-any.whl", hash = "sha256:1af1267b4cea2eedd6724614f19dcc88fe2e15aff65d06b2f6252cee9c4f4c1e", size = 2173865, upload-time = "2023-07-27T12:45:30.249Z" }, +] + +[[package]] +name = "sphinx-design" +version = "0.6.1" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version >= '3.14'", + "python_full_version >= '3.11' and python_full_version < '3.14'", + "python_full_version == '3.10.*'", + "python_full_version == '3.9.*'", +] +dependencies = [ + { name = "sphinx", version = "7.4.7", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version == '3.9.*'" }, + { name = "sphinx", version = "8.1.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version == '3.10.*'" }, + { name = "sphinx", version = "8.2.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/2b/69/b34e0cb5336f09c6866d53b4a19d76c227cdec1bbc7ac4de63ca7d58c9c7/sphinx_design-0.6.1.tar.gz", hash = "sha256:b44eea3719386d04d765c1a8257caca2b3e6f8421d7b3a5e742c0fd45f84e632", size = 2193689, upload-time = "2024-08-02T13:48:44.277Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/c6/43/65c0acbd8cc6f50195a3a1fc195c404988b15c67090e73c7a41a9f57d6bd/sphinx_design-0.6.1-py3-none-any.whl", hash = "sha256:b11f37db1a802a183d61b159d9a202314d4d2fe29c163437001324fe2f19549c", size = 2215338, upload-time = "2024-08-02T13:48:42.106Z" }, +] + +[[package]] +name = "sphinx-last-updated-by-git" +version = "0.3.8" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "sphinx", version = "7.1.2", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.9'" }, + { name = "sphinx", version = "7.4.7", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version == '3.9.*'" }, + { name = "sphinx", version = "8.1.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version == '3.10.*'" }, + { name = "sphinx", version = "8.2.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/03/fd/de1685b6dab173dff31da24e0d3b29f02873fc24a1cdbb7678721ddc8581/sphinx_last_updated_by_git-0.3.8.tar.gz", hash = "sha256:c145011f4609d841805b69a9300099fc02fed8f5bb9e5bcef77d97aea97b7761", size = 10785, upload-time = "2024-08-11T07:15:54.601Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/e1/fb/e496f16fa11fbe2dbdd0b5e306ede153dfed050aae4766fc89d500720dc7/sphinx_last_updated_by_git-0.3.8-py3-none-any.whl", hash = "sha256:6382c8285ac1f222483a58569b78c0371af5e55f7fbf9c01e5e8a72d6fdfa499", size = 8580, upload-time = "2024-08-11T07:15:53.244Z" }, +] + +[[package]] +name = "sphinx-rtd-theme" +version = "3.0.2" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "docutils", version = "0.20.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.9'" }, + { name = "docutils", version = "0.21.2", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.9'" }, + { name = "sphinx", version = "7.1.2", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.9'" }, + { name = "sphinx", version = "7.4.7", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version == '3.9.*'" }, + { name = "sphinx", version = "8.1.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version == '3.10.*'" }, + { name = "sphinx", version = "8.2.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, + { name = "sphinxcontrib-jquery" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/91/44/c97faec644d29a5ceddd3020ae2edffa69e7d00054a8c7a6021e82f20335/sphinx_rtd_theme-3.0.2.tar.gz", hash = "sha256:b7457bc25dda723b20b086a670b9953c859eab60a2a03ee8eb2bb23e176e5f85", size = 7620463, upload-time = "2024-11-13T11:06:04.545Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/85/77/46e3bac77b82b4df5bb5b61f2de98637724f246b4966cfc34bc5895d852a/sphinx_rtd_theme-3.0.2-py2.py3-none-any.whl", hash = "sha256:422ccc750c3a3a311de4ae327e82affdaf59eb695ba4936538552f3b00f4ee13", size = 7655561, upload-time = "2024-11-13T11:06:02.094Z" }, +] + +[[package]] +name = "sphinxcontrib-applehelp" +version = "1.0.4" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version < '3.9'", +] +sdist = { url = "https://files.pythonhosted.org/packages/32/df/45e827f4d7e7fcc84e853bcef1d836effd762d63ccb86f43ede4e98b478c/sphinxcontrib-applehelp-1.0.4.tar.gz", hash = "sha256:828f867945bbe39817c210a1abfd1bc4895c8b73fcaade56d45357a348a07d7e", size = 24766, upload-time = "2023-01-23T09:41:54.435Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/06/c1/5e2cafbd03105ce50d8500f9b4e8a6e8d02e22d0475b574c3b3e9451a15f/sphinxcontrib_applehelp-1.0.4-py3-none-any.whl", hash = "sha256:29d341f67fb0f6f586b23ad80e072c8e6ad0b48417db2bde114a4c9746feb228", size = 120601, upload-time = "2023-01-23T09:41:52.364Z" }, +] + +[[package]] +name = "sphinxcontrib-applehelp" +version = "2.0.0" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version >= '3.14'", + "python_full_version >= '3.11' and python_full_version < '3.14'", + "python_full_version == '3.10.*'", + "python_full_version == '3.9.*'", +] +sdist = { url = "https://files.pythonhosted.org/packages/ba/6e/b837e84a1a704953c62ef8776d45c3e8d759876b4a84fe14eba2859106fe/sphinxcontrib_applehelp-2.0.0.tar.gz", hash = "sha256:2f29ef331735ce958efa4734873f084941970894c6090408b079c61b2e1c06d1", size = 20053, upload-time = "2024-07-29T01:09:00.465Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/5d/85/9ebeae2f76e9e77b952f4b274c27238156eae7979c5421fba91a28f4970d/sphinxcontrib_applehelp-2.0.0-py3-none-any.whl", hash = "sha256:4cd3f0ec4ac5dd9c17ec65e9ab272c9b867ea77425228e68ecf08d6b28ddbdb5", size = 119300, upload-time = "2024-07-29T01:08:58.99Z" }, +] + +[[package]] +name = "sphinxcontrib-devhelp" +version = "1.0.2" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version < '3.9'", +] +sdist = { url = "https://files.pythonhosted.org/packages/98/33/dc28393f16385f722c893cb55539c641c9aaec8d1bc1c15b69ce0ac2dbb3/sphinxcontrib-devhelp-1.0.2.tar.gz", hash = "sha256:ff7f1afa7b9642e7060379360a67e9c41e8f3121f2ce9164266f61b9f4b338e4", size = 17398, upload-time = "2020-02-29T04:14:43.378Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/c5/09/5de5ed43a521387f18bdf5f5af31d099605c992fd25372b2b9b825ce48ee/sphinxcontrib_devhelp-1.0.2-py2.py3-none-any.whl", hash = "sha256:8165223f9a335cc1af7ffe1ed31d2871f325254c0423bc0c4c7cd1c1e4734a2e", size = 84690, upload-time = "2020-02-29T04:14:40.765Z" }, +] + +[[package]] +name = "sphinxcontrib-devhelp" +version = "2.0.0" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version >= '3.14'", + "python_full_version >= '3.11' and python_full_version < '3.14'", + "python_full_version == '3.10.*'", + "python_full_version == '3.9.*'", +] +sdist = { url = "https://files.pythonhosted.org/packages/f6/d2/5beee64d3e4e747f316bae86b55943f51e82bb86ecd325883ef65741e7da/sphinxcontrib_devhelp-2.0.0.tar.gz", hash = "sha256:411f5d96d445d1d73bb5d52133377b4248ec79db5c793ce7dbe59e074b4dd1ad", size = 12967, upload-time = "2024-07-29T01:09:23.417Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/35/7a/987e583882f985fe4d7323774889ec58049171828b58c2217e7f79cdf44e/sphinxcontrib_devhelp-2.0.0-py3-none-any.whl", hash = "sha256:aefb8b83854e4b0998877524d1029fd3e6879210422ee3780459e28a1f03a8a2", size = 82530, upload-time = "2024-07-29T01:09:21.945Z" }, +] + +[[package]] +name = "sphinxcontrib-htmlhelp" +version = "2.0.1" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version < '3.9'", +] +sdist = { url = "https://files.pythonhosted.org/packages/b3/47/64cff68ea3aa450c373301e5bebfbb9fce0a3e70aca245fcadd4af06cd75/sphinxcontrib-htmlhelp-2.0.1.tar.gz", hash = "sha256:0cbdd302815330058422b98a113195c9249825d681e18f11e8b1f78a2f11efff", size = 27967, upload-time = "2023-01-31T17:29:20.935Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/6e/ee/a1f5e39046cbb5f8bc8fba87d1ddf1c6643fbc9194e58d26e606de4b9074/sphinxcontrib_htmlhelp-2.0.1-py3-none-any.whl", hash = "sha256:c38cb46dccf316c79de6e5515e1770414b797162b23cd3d06e67020e1d2a6903", size = 99833, upload-time = "2023-01-31T17:29:18.489Z" }, +] + +[[package]] +name = "sphinxcontrib-htmlhelp" +version = "2.1.0" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version >= '3.14'", + "python_full_version >= '3.11' and python_full_version < '3.14'", + "python_full_version == '3.10.*'", + "python_full_version == '3.9.*'", +] +sdist = { url = "https://files.pythonhosted.org/packages/43/93/983afd9aa001e5201eab16b5a444ed5b9b0a7a010541e0ddfbbfd0b2470c/sphinxcontrib_htmlhelp-2.1.0.tar.gz", hash = "sha256:c9e2916ace8aad64cc13a0d233ee22317f2b9025b9cf3295249fa985cc7082e9", size = 22617, upload-time = "2024-07-29T01:09:37.889Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/0a/7b/18a8c0bcec9182c05a0b3ec2a776bba4ead82750a55ff798e8d406dae604/sphinxcontrib_htmlhelp-2.1.0-py3-none-any.whl", hash = "sha256:166759820b47002d22914d64a075ce08f4c46818e17cfc9470a9786b759b19f8", size = 98705, upload-time = "2024-07-29T01:09:36.407Z" }, +] + +[[package]] +name = "sphinxcontrib-jquery" +version = "4.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "sphinx", version = "7.1.2", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.9'" }, + { name = "sphinx", version = "7.4.7", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version == '3.9.*'" }, + { name = "sphinx", version = "8.1.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version == '3.10.*'" }, + { name = "sphinx", version = "8.2.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/de/f3/aa67467e051df70a6330fe7770894b3e4f09436dea6881ae0b4f3d87cad8/sphinxcontrib-jquery-4.1.tar.gz", hash = "sha256:1620739f04e36a2c779f1a131a2dfd49b2fd07351bf1968ced074365933abc7a", size = 122331, upload-time = "2023-03-14T15:01:01.944Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/76/85/749bd22d1a68db7291c89e2ebca53f4306c3f205853cf31e9de279034c3c/sphinxcontrib_jquery-4.1-py2.py3-none-any.whl", hash = "sha256:f936030d7d0147dd026a4f2b5a57343d233f1fc7b363f68b3d4f1cb0993878ae", size = 121104, upload-time = "2023-03-14T15:01:00.356Z" }, +] + +[[package]] +name = "sphinxcontrib-jsmath" +version = "1.0.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/b2/e8/9ed3830aeed71f17c026a07a5097edcf44b692850ef215b161b8ad875729/sphinxcontrib-jsmath-1.0.1.tar.gz", hash = "sha256:a9925e4a4587247ed2191a22df5f6970656cb8ca2bd6284309578f2153e0c4b8", size = 5787, upload-time = "2019-01-21T16:10:16.347Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/c2/42/4c8646762ee83602e3fb3fbe774c2fac12f317deb0b5dbeeedd2d3ba4b77/sphinxcontrib_jsmath-1.0.1-py2.py3-none-any.whl", hash = "sha256:2ec2eaebfb78f3f2078e73666b1415417a116cc848b72e5172e596c871103178", size = 5071, upload-time = "2019-01-21T16:10:14.333Z" }, +] + +[[package]] +name = "sphinxcontrib-qthelp" +version = "1.0.3" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version < '3.9'", +] +sdist = { url = "https://files.pythonhosted.org/packages/b1/8e/c4846e59f38a5f2b4a0e3b27af38f2fcf904d4bfd82095bf92de0b114ebd/sphinxcontrib-qthelp-1.0.3.tar.gz", hash = "sha256:4c33767ee058b70dba89a6fc5c1892c0d57a54be67ddd3e7875a18d14cba5a72", size = 21658, upload-time = "2020-02-29T04:19:10.026Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/2b/14/05f9206cf4e9cfca1afb5fd224c7cd434dcc3a433d6d9e4e0264d29c6cdb/sphinxcontrib_qthelp-1.0.3-py2.py3-none-any.whl", hash = "sha256:bd9fc24bcb748a8d51fd4ecaade681350aa63009a347a8c14e637895444dfab6", size = 90609, upload-time = "2020-02-29T04:19:08.451Z" }, +] + +[[package]] +name = "sphinxcontrib-qthelp" +version = "2.0.0" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version >= '3.14'", + "python_full_version >= '3.11' and python_full_version < '3.14'", + "python_full_version == '3.10.*'", + "python_full_version == '3.9.*'", +] +sdist = { url = "https://files.pythonhosted.org/packages/68/bc/9104308fc285eb3e0b31b67688235db556cd5b0ef31d96f30e45f2e51cae/sphinxcontrib_qthelp-2.0.0.tar.gz", hash = "sha256:4fe7d0ac8fc171045be623aba3e2a8f613f8682731f9153bb2e40ece16b9bbab", size = 17165, upload-time = "2024-07-29T01:09:56.435Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/27/83/859ecdd180cacc13b1f7e857abf8582a64552ea7a061057a6c716e790fce/sphinxcontrib_qthelp-2.0.0-py3-none-any.whl", hash = "sha256:b18a828cdba941ccd6ee8445dbe72ffa3ef8cbe7505d8cd1fa0d42d3f2d5f3eb", size = 88743, upload-time = "2024-07-29T01:09:54.885Z" }, +] + +[[package]] +name = "sphinxcontrib-serializinghtml" +version = "1.1.5" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version < '3.9'", +] +sdist = { url = "https://files.pythonhosted.org/packages/b5/72/835d6fadb9e5d02304cf39b18f93d227cd93abd3c41ebf58e6853eeb1455/sphinxcontrib-serializinghtml-1.1.5.tar.gz", hash = "sha256:aa5f6de5dfdf809ef505c4895e51ef5c9eac17d0f287933eb49ec495280b6952", size = 21019, upload-time = "2021-05-22T16:07:43.043Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/c6/77/5464ec50dd0f1c1037e3c93249b040c8fc8078fdda97530eeb02424b6eea/sphinxcontrib_serializinghtml-1.1.5-py2.py3-none-any.whl", hash = "sha256:352a9a00ae864471d3a7ead8d7d79f5fc0b57e8b3f95e9867eb9eb28999b92fd", size = 94021, upload-time = "2021-05-22T16:07:41.627Z" }, +] + +[[package]] +name = "sphinxcontrib-serializinghtml" +version = "2.0.0" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version >= '3.14'", + "python_full_version >= '3.11' and python_full_version < '3.14'", + "python_full_version == '3.10.*'", + "python_full_version == '3.9.*'", +] +sdist = { url = "https://files.pythonhosted.org/packages/3b/44/6716b257b0aa6bfd51a1b31665d1c205fb12cb5ad56de752dfa15657de2f/sphinxcontrib_serializinghtml-2.0.0.tar.gz", hash = "sha256:e9d912827f872c029017a53f0ef2180b327c3f7fd23c87229f7a8e8b70031d4d", size = 16080, upload-time = "2024-07-29T01:10:09.332Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/52/a7/d2782e4e3f77c8450f727ba74a8f12756d5ba823d81b941f1b04da9d033a/sphinxcontrib_serializinghtml-2.0.0-py3-none-any.whl", hash = "sha256:6e2cb0eef194e10c27ec0023bfeb25badbbb5868244cf5bc5bdc04e4464bf331", size = 92072, upload-time = "2024-07-29T01:10:08.203Z" }, +] + +[[package]] +name = "stack-data" +version = "0.6.3" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "asttokens" }, + { name = "executing" }, + { name = "pure-eval" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/28/e3/55dcc2cfbc3ca9c29519eb6884dd1415ecb53b0e934862d3559ddcb7e20b/stack_data-0.6.3.tar.gz", hash = "sha256:836a778de4fec4dcd1dcd89ed8abff8a221f58308462e1c4aa2a3cf30148f0b9", size = 44707, upload-time = "2023-09-30T13:58:05.479Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/f1/7b/ce1eafaf1a76852e2ec9b22edecf1daa58175c090266e9f6c64afcd81d91/stack_data-0.6.3-py3-none-any.whl", hash = "sha256:d5558e0c25a4cb0853cddad3d77da9891a08cb85dd9f9f91b9f8cd66e511e695", size = 24521, upload-time = "2023-09-30T13:58:03.53Z" }, +] + +[[package]] +name = "terminado" +version = "0.18.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "ptyprocess", marker = "os_name != 'nt'" }, + { name = "pywinpty", version = "2.0.14", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.9' and os_name == 'nt'" }, + { name = "pywinpty", version = "3.0.2", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.9' and os_name == 'nt'" }, + { name = "tornado", version = "6.4.2", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.9'" }, + { name = "tornado", version = "6.5.2", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.9'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/8a/11/965c6fd8e5cc254f1fe142d547387da17a8ebfd75a3455f637c663fb38a0/terminado-0.18.1.tar.gz", hash = "sha256:de09f2c4b85de4765f7714688fff57d3e75bad1f909b589fde880460c753fd2e", size = 32701, upload-time = "2024-03-12T14:34:39.026Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/6a/9e/2064975477fdc887e47ad42157e214526dcad8f317a948dee17e1659a62f/terminado-0.18.1-py3-none-any.whl", hash = "sha256:a4468e1b37bb318f8a86514f65814e1afc977cf29b3992a4500d9dd305dcceb0", size = 14154, upload-time = "2024-03-12T14:34:36.569Z" }, +] + +[[package]] +name = "tinycss2" +version = "1.2.1" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version < '3.9'", +] +dependencies = [ + { name = "webencodings", marker = "python_full_version < '3.9'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/75/be/24179dfaa1d742c9365cbd0e3f0edc5d3aa3abad415a2327c5a6ff8ca077/tinycss2-1.2.1.tar.gz", hash = "sha256:8cff3a8f066c2ec677c06dbc7b45619804a6938478d9d73c284b29d14ecb0627", size = 65957, upload-time = "2022-10-18T07:04:56.49Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/da/99/fd23634d6962c2791fb8cb6ccae1f05dcbfc39bce36bba8b1c9a8d92eae8/tinycss2-1.2.1-py3-none-any.whl", hash = "sha256:2b80a96d41e7c3914b8cda8bc7f705a4d9c49275616e886103dd839dfc847847", size = 21824, upload-time = "2022-10-18T07:04:54.003Z" }, +] + +[[package]] +name = "tinycss2" +version = "1.4.0" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version >= '3.14'", + "python_full_version >= '3.11' and python_full_version < '3.14'", + "python_full_version == '3.10.*'", + "python_full_version == '3.9.*'", +] +dependencies = [ + { name = "webencodings", marker = "python_full_version >= '3.9'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/7a/fd/7a5ee21fd08ff70d3d33a5781c255cbe779659bd03278feb98b19ee550f4/tinycss2-1.4.0.tar.gz", hash = "sha256:10c0972f6fc0fbee87c3edb76549357415e94548c1ae10ebccdea16fb404a9b7", size = 87085, upload-time = "2024-10-24T14:58:29.895Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/e6/34/ebdc18bae6aa14fbee1a08b63c015c72b64868ff7dae68808ab500c492e2/tinycss2-1.4.0-py3-none-any.whl", hash = "sha256:3a49cf47b7675da0b15d0c6e1df8df4ebd96e9394bb905a5775adb0d884c5289", size = 26610, upload-time = "2024-10-24T14:58:28.029Z" }, +] + +[[package]] +name = "tomli" +version = "2.3.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/52/ed/3f73f72945444548f33eba9a87fc7a6e969915e7b1acc8260b30e1f76a2f/tomli-2.3.0.tar.gz", hash = "sha256:64be704a875d2a59753d80ee8a533c3fe183e3f06807ff7dc2232938ccb01549", size = 17392, upload-time = "2025-10-08T22:01:47.119Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/b3/2e/299f62b401438d5fe1624119c723f5d877acc86a4c2492da405626665f12/tomli-2.3.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:88bd15eb972f3664f5ed4b57c1634a97153b4bac4479dcb6a495f41921eb7f45", size = 153236, upload-time = "2025-10-08T22:01:00.137Z" }, + { url = "https://files.pythonhosted.org/packages/86/7f/d8fffe6a7aefdb61bced88fcb5e280cfd71e08939da5894161bd71bea022/tomli-2.3.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:883b1c0d6398a6a9d29b508c331fa56adbcdff647f6ace4dfca0f50e90dfd0ba", size = 148084, upload-time = "2025-10-08T22:01:01.63Z" }, + { url = "https://files.pythonhosted.org/packages/47/5c/24935fb6a2ee63e86d80e4d3b58b222dafaf438c416752c8b58537c8b89a/tomli-2.3.0-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:d1381caf13ab9f300e30dd8feadb3de072aeb86f1d34a8569453ff32a7dea4bf", size = 234832, upload-time = "2025-10-08T22:01:02.543Z" }, + { url = "https://files.pythonhosted.org/packages/89/da/75dfd804fc11e6612846758a23f13271b76d577e299592b4371a4ca4cd09/tomli-2.3.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:a0e285d2649b78c0d9027570d4da3425bdb49830a6156121360b3f8511ea3441", size = 242052, upload-time = "2025-10-08T22:01:03.836Z" }, + { url = "https://files.pythonhosted.org/packages/70/8c/f48ac899f7b3ca7eb13af73bacbc93aec37f9c954df3c08ad96991c8c373/tomli-2.3.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:0a154a9ae14bfcf5d8917a59b51ffd5a3ac1fd149b71b47a3a104ca4edcfa845", size = 239555, upload-time = "2025-10-08T22:01:04.834Z" }, + { url = "https://files.pythonhosted.org/packages/ba/28/72f8afd73f1d0e7829bfc093f4cb98ce0a40ffc0cc997009ee1ed94ba705/tomli-2.3.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:74bf8464ff93e413514fefd2be591c3b0b23231a77f901db1eb30d6f712fc42c", size = 245128, upload-time = "2025-10-08T22:01:05.84Z" }, + { url = "https://files.pythonhosted.org/packages/b6/eb/a7679c8ac85208706d27436e8d421dfa39d4c914dcf5fa8083a9305f58d9/tomli-2.3.0-cp311-cp311-win32.whl", hash = "sha256:00b5f5d95bbfc7d12f91ad8c593a1659b6387b43f054104cda404be6bda62456", size = 96445, upload-time = "2025-10-08T22:01:06.896Z" }, + { url = "https://files.pythonhosted.org/packages/0a/fe/3d3420c4cb1ad9cb462fb52967080575f15898da97e21cb6f1361d505383/tomli-2.3.0-cp311-cp311-win_amd64.whl", hash = "sha256:4dc4ce8483a5d429ab602f111a93a6ab1ed425eae3122032db7e9acf449451be", size = 107165, upload-time = "2025-10-08T22:01:08.107Z" }, + { url = "https://files.pythonhosted.org/packages/ff/b7/40f36368fcabc518bb11c8f06379a0fd631985046c038aca08c6d6a43c6e/tomli-2.3.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:d7d86942e56ded512a594786a5ba0a5e521d02529b3826e7761a05138341a2ac", size = 154891, upload-time = "2025-10-08T22:01:09.082Z" }, + { url = "https://files.pythonhosted.org/packages/f9/3f/d9dd692199e3b3aab2e4e4dd948abd0f790d9ded8cd10cbaae276a898434/tomli-2.3.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:73ee0b47d4dad1c5e996e3cd33b8a76a50167ae5f96a2607cbe8cc773506ab22", size = 148796, upload-time = "2025-10-08T22:01:10.266Z" }, + { url = "https://files.pythonhosted.org/packages/60/83/59bff4996c2cf9f9387a0f5a3394629c7efa5ef16142076a23a90f1955fa/tomli-2.3.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:792262b94d5d0a466afb5bc63c7daa9d75520110971ee269152083270998316f", size = 242121, upload-time = "2025-10-08T22:01:11.332Z" }, + { url = "https://files.pythonhosted.org/packages/45/e5/7c5119ff39de8693d6baab6c0b6dcb556d192c165596e9fc231ea1052041/tomli-2.3.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:4f195fe57ecceac95a66a75ac24d9d5fbc98ef0962e09b2eddec5d39375aae52", size = 250070, upload-time = "2025-10-08T22:01:12.498Z" }, + { url = "https://files.pythonhosted.org/packages/45/12/ad5126d3a278f27e6701abde51d342aa78d06e27ce2bb596a01f7709a5a2/tomli-2.3.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:e31d432427dcbf4d86958c184b9bfd1e96b5b71f8eb17e6d02531f434fd335b8", size = 245859, upload-time = "2025-10-08T22:01:13.551Z" }, + { url = "https://files.pythonhosted.org/packages/fb/a1/4d6865da6a71c603cfe6ad0e6556c73c76548557a8d658f9e3b142df245f/tomli-2.3.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:7b0882799624980785240ab732537fcfc372601015c00f7fc367c55308c186f6", size = 250296, upload-time = "2025-10-08T22:01:14.614Z" }, + { url = "https://files.pythonhosted.org/packages/a0/b7/a7a7042715d55c9ba6e8b196d65d2cb662578b4d8cd17d882d45322b0d78/tomli-2.3.0-cp312-cp312-win32.whl", hash = "sha256:ff72b71b5d10d22ecb084d345fc26f42b5143c5533db5e2eaba7d2d335358876", size = 97124, upload-time = "2025-10-08T22:01:15.629Z" }, + { url = "https://files.pythonhosted.org/packages/06/1e/f22f100db15a68b520664eb3328fb0ae4e90530887928558112c8d1f4515/tomli-2.3.0-cp312-cp312-win_amd64.whl", hash = "sha256:1cb4ed918939151a03f33d4242ccd0aa5f11b3547d0cf30f7c74a408a5b99878", size = 107698, upload-time = "2025-10-08T22:01:16.51Z" }, + { url = "https://files.pythonhosted.org/packages/89/48/06ee6eabe4fdd9ecd48bf488f4ac783844fd777f547b8d1b61c11939974e/tomli-2.3.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:5192f562738228945d7b13d4930baffda67b69425a7f0da96d360b0a3888136b", size = 154819, upload-time = "2025-10-08T22:01:17.964Z" }, + { url = "https://files.pythonhosted.org/packages/f1/01/88793757d54d8937015c75dcdfb673c65471945f6be98e6a0410fba167ed/tomli-2.3.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:be71c93a63d738597996be9528f4abe628d1adf5e6eb11607bc8fe1a510b5dae", size = 148766, upload-time = "2025-10-08T22:01:18.959Z" }, + { url = "https://files.pythonhosted.org/packages/42/17/5e2c956f0144b812e7e107f94f1cc54af734eb17b5191c0bbfb72de5e93e/tomli-2.3.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c4665508bcbac83a31ff8ab08f424b665200c0e1e645d2bd9ab3d3e557b6185b", size = 240771, upload-time = "2025-10-08T22:01:20.106Z" }, + { url = "https://files.pythonhosted.org/packages/d5/f4/0fbd014909748706c01d16824eadb0307115f9562a15cbb012cd9b3512c5/tomli-2.3.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:4021923f97266babc6ccab9f5068642a0095faa0a51a246a6a02fccbb3514eaf", size = 248586, upload-time = "2025-10-08T22:01:21.164Z" }, + { url = "https://files.pythonhosted.org/packages/30/77/fed85e114bde5e81ecf9bc5da0cc69f2914b38f4708c80ae67d0c10180c5/tomli-2.3.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:a4ea38c40145a357d513bffad0ed869f13c1773716cf71ccaa83b0fa0cc4e42f", size = 244792, upload-time = "2025-10-08T22:01:22.417Z" }, + { url = "https://files.pythonhosted.org/packages/55/92/afed3d497f7c186dc71e6ee6d4fcb0acfa5f7d0a1a2878f8beae379ae0cc/tomli-2.3.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:ad805ea85eda330dbad64c7ea7a4556259665bdf9d2672f5dccc740eb9d3ca05", size = 248909, upload-time = "2025-10-08T22:01:23.859Z" }, + { url = "https://files.pythonhosted.org/packages/f8/84/ef50c51b5a9472e7265ce1ffc7f24cd4023d289e109f669bdb1553f6a7c2/tomli-2.3.0-cp313-cp313-win32.whl", hash = "sha256:97d5eec30149fd3294270e889b4234023f2c69747e555a27bd708828353ab606", size = 96946, upload-time = "2025-10-08T22:01:24.893Z" }, + { url = "https://files.pythonhosted.org/packages/b2/b7/718cd1da0884f281f95ccfa3a6cc572d30053cba64603f79d431d3c9b61b/tomli-2.3.0-cp313-cp313-win_amd64.whl", hash = "sha256:0c95ca56fbe89e065c6ead5b593ee64b84a26fca063b5d71a1122bf26e533999", size = 107705, upload-time = "2025-10-08T22:01:26.153Z" }, + { url = "https://files.pythonhosted.org/packages/19/94/aeafa14a52e16163008060506fcb6aa1949d13548d13752171a755c65611/tomli-2.3.0-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:cebc6fe843e0733ee827a282aca4999b596241195f43b4cc371d64fc6639da9e", size = 154244, upload-time = "2025-10-08T22:01:27.06Z" }, + { url = "https://files.pythonhosted.org/packages/db/e4/1e58409aa78eefa47ccd19779fc6f36787edbe7d4cd330eeeedb33a4515b/tomli-2.3.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:4c2ef0244c75aba9355561272009d934953817c49f47d768070c3c94355c2aa3", size = 148637, upload-time = "2025-10-08T22:01:28.059Z" }, + { url = "https://files.pythonhosted.org/packages/26/b6/d1eccb62f665e44359226811064596dd6a366ea1f985839c566cd61525ae/tomli-2.3.0-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c22a8bf253bacc0cf11f35ad9808b6cb75ada2631c2d97c971122583b129afbc", size = 241925, upload-time = "2025-10-08T22:01:29.066Z" }, + { url = "https://files.pythonhosted.org/packages/70/91/7cdab9a03e6d3d2bb11beae108da5bdc1c34bdeb06e21163482544ddcc90/tomli-2.3.0-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:0eea8cc5c5e9f89c9b90c4896a8deefc74f518db5927d0e0e8d4a80953d774d0", size = 249045, upload-time = "2025-10-08T22:01:31.98Z" }, + { url = "https://files.pythonhosted.org/packages/15/1b/8c26874ed1f6e4f1fcfeb868db8a794cbe9f227299402db58cfcc858766c/tomli-2.3.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:b74a0e59ec5d15127acdabd75ea17726ac4c5178ae51b85bfe39c4f8a278e879", size = 245835, upload-time = "2025-10-08T22:01:32.989Z" }, + { url = "https://files.pythonhosted.org/packages/fd/42/8e3c6a9a4b1a1360c1a2a39f0b972cef2cc9ebd56025168c4137192a9321/tomli-2.3.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:b5870b50c9db823c595983571d1296a6ff3e1b88f734a4c8f6fc6188397de005", size = 253109, upload-time = "2025-10-08T22:01:34.052Z" }, + { url = "https://files.pythonhosted.org/packages/22/0c/b4da635000a71b5f80130937eeac12e686eefb376b8dee113b4a582bba42/tomli-2.3.0-cp314-cp314-win32.whl", hash = "sha256:feb0dacc61170ed7ab602d3d972a58f14ee3ee60494292d384649a3dc38ef463", size = 97930, upload-time = "2025-10-08T22:01:35.082Z" }, + { url = "https://files.pythonhosted.org/packages/b9/74/cb1abc870a418ae99cd5c9547d6bce30701a954e0e721821df483ef7223c/tomli-2.3.0-cp314-cp314-win_amd64.whl", hash = "sha256:b273fcbd7fc64dc3600c098e39136522650c49bca95df2d11cf3b626422392c8", size = 107964, upload-time = "2025-10-08T22:01:36.057Z" }, + { url = "https://files.pythonhosted.org/packages/54/78/5c46fff6432a712af9f792944f4fcd7067d8823157949f4e40c56b8b3c83/tomli-2.3.0-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:940d56ee0410fa17ee1f12b817b37a4d4e4dc4d27340863cc67236c74f582e77", size = 163065, upload-time = "2025-10-08T22:01:37.27Z" }, + { url = "https://files.pythonhosted.org/packages/39/67/f85d9bd23182f45eca8939cd2bc7050e1f90c41f4a2ecbbd5963a1d1c486/tomli-2.3.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:f85209946d1fe94416debbb88d00eb92ce9cd5266775424ff81bc959e001acaf", size = 159088, upload-time = "2025-10-08T22:01:38.235Z" }, + { url = "https://files.pythonhosted.org/packages/26/5a/4b546a0405b9cc0659b399f12b6adb750757baf04250b148d3c5059fc4eb/tomli-2.3.0-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:a56212bdcce682e56b0aaf79e869ba5d15a6163f88d5451cbde388d48b13f530", size = 268193, upload-time = "2025-10-08T22:01:39.712Z" }, + { url = "https://files.pythonhosted.org/packages/42/4f/2c12a72ae22cf7b59a7fe75b3465b7aba40ea9145d026ba41cb382075b0e/tomli-2.3.0-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:c5f3ffd1e098dfc032d4d3af5c0ac64f6d286d98bc148698356847b80fa4de1b", size = 275488, upload-time = "2025-10-08T22:01:40.773Z" }, + { url = "https://files.pythonhosted.org/packages/92/04/a038d65dbe160c3aa5a624e93ad98111090f6804027d474ba9c37c8ae186/tomli-2.3.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:5e01decd096b1530d97d5d85cb4dff4af2d8347bd35686654a004f8dea20fc67", size = 272669, upload-time = "2025-10-08T22:01:41.824Z" }, + { url = "https://files.pythonhosted.org/packages/be/2f/8b7c60a9d1612a7cbc39ffcca4f21a73bf368a80fc25bccf8253e2563267/tomli-2.3.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:8a35dd0e643bb2610f156cca8db95d213a90015c11fee76c946aa62b7ae7e02f", size = 279709, upload-time = "2025-10-08T22:01:43.177Z" }, + { url = "https://files.pythonhosted.org/packages/7e/46/cc36c679f09f27ded940281c38607716c86cf8ba4a518d524e349c8b4874/tomli-2.3.0-cp314-cp314t-win32.whl", hash = "sha256:a1f7f282fe248311650081faafa5f4732bdbfef5d45fe3f2e702fbc6f2d496e0", size = 107563, upload-time = "2025-10-08T22:01:44.233Z" }, + { url = "https://files.pythonhosted.org/packages/84/ff/426ca8683cf7b753614480484f6437f568fd2fda2edbdf57a2d3d8b27a0b/tomli-2.3.0-cp314-cp314t-win_amd64.whl", hash = "sha256:70a251f8d4ba2d9ac2542eecf008b3c8a9fc5c3f9f02c56a9d7952612be2fdba", size = 119756, upload-time = "2025-10-08T22:01:45.234Z" }, + { url = "https://files.pythonhosted.org/packages/77/b8/0135fadc89e73be292b473cb820b4f5a08197779206b33191e801feeae40/tomli-2.3.0-py3-none-any.whl", hash = "sha256:e95b1af3c5b07d9e643909b5abbec77cd9f1217e6d0bca72b0234736b9fb1f1b", size = 14408, upload-time = "2025-10-08T22:01:46.04Z" }, +] + +[[package]] +name = "tomlkit" +version = "0.13.3" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/cc/18/0bbf3884e9eaa38819ebe46a7bd25dcd56b67434402b66a58c4b8e552575/tomlkit-0.13.3.tar.gz", hash = "sha256:430cf247ee57df2b94ee3fbe588e71d362a941ebb545dec29b53961d61add2a1", size = 185207, upload-time = "2025-06-05T07:13:44.947Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/bd/75/8539d011f6be8e29f339c42e633aae3cb73bffa95dd0f9adec09b9c58e85/tomlkit-0.13.3-py3-none-any.whl", hash = "sha256:c89c649d79ee40629a9fda55f8ace8c6a1b42deb912b2a8fd8d942ddadb606b0", size = 38901, upload-time = "2025-06-05T07:13:43.546Z" }, +] + +[[package]] +name = "tomlq" +version = "0.1.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "yq" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/9a/94/0f6009f5fd9693e142d21a860828c5861b1a726b3dbeb22a1aeedbd5d82c/tomlq-0.1.0.tar.gz", hash = "sha256:e775720e90da3e405142b9fe476145e71c0389f787b1ff9933f92a1704d8c6e7", size = 8317, upload-time = "2019-05-31T20:41:30.273Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/a7/08/a409df2a47dcb99a690b94b71eaf081eb24f1e0f0f8b70efa422828178fe/tomlq-0.1.0-py2.py3-none-any.whl", hash = "sha256:4b966fd999ed2bf69081b7c7f5caadbc4c9542d0ed5fcf2e9b7b4d8d7ada3c82", size = 3446, upload-time = "2019-05-31T20:41:28.173Z" }, +] + +[[package]] +name = "tornado" +version = "6.4.2" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version < '3.9'", +] +sdist = { url = "https://files.pythonhosted.org/packages/59/45/a0daf161f7d6f36c3ea5fc0c2de619746cc3dd4c76402e9db545bd920f63/tornado-6.4.2.tar.gz", hash = "sha256:92bad5b4746e9879fd7bf1eb21dce4e3fc5128d71601f80005afa39237ad620b", size = 501135, upload-time = "2024-11-22T03:06:38.036Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/26/7e/71f604d8cea1b58f82ba3590290b66da1e72d840aeb37e0d5f7291bd30db/tornado-6.4.2-cp38-abi3-macosx_10_9_universal2.whl", hash = "sha256:e828cce1123e9e44ae2a50a9de3055497ab1d0aeb440c5ac23064d9e44880da1", size = 436299, upload-time = "2024-11-22T03:06:20.162Z" }, + { url = "https://files.pythonhosted.org/packages/96/44/87543a3b99016d0bf54fdaab30d24bf0af2e848f1d13d34a3a5380aabe16/tornado-6.4.2-cp38-abi3-macosx_10_9_x86_64.whl", hash = "sha256:072ce12ada169c5b00b7d92a99ba089447ccc993ea2143c9ede887e0937aa803", size = 434253, upload-time = "2024-11-22T03:06:22.39Z" }, + { url = "https://files.pythonhosted.org/packages/cb/fb/fdf679b4ce51bcb7210801ef4f11fdac96e9885daa402861751353beea6e/tornado-6.4.2-cp38-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1a017d239bd1bb0919f72af256a970624241f070496635784d9bf0db640d3fec", size = 437602, upload-time = "2024-11-22T03:06:24.214Z" }, + { url = "https://files.pythonhosted.org/packages/4f/3b/e31aeffffc22b475a64dbeb273026a21b5b566f74dee48742817626c47dc/tornado-6.4.2-cp38-abi3-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c36e62ce8f63409301537222faffcef7dfc5284f27eec227389f2ad11b09d946", size = 436972, upload-time = "2024-11-22T03:06:25.559Z" }, + { url = "https://files.pythonhosted.org/packages/22/55/b78a464de78051a30599ceb6983b01d8f732e6f69bf37b4ed07f642ac0fc/tornado-6.4.2-cp38-abi3-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bca9eb02196e789c9cb5c3c7c0f04fb447dc2adffd95265b2c7223a8a615ccbf", size = 437173, upload-time = "2024-11-22T03:06:27.584Z" }, + { url = "https://files.pythonhosted.org/packages/79/5e/be4fb0d1684eb822c9a62fb18a3e44a06188f78aa466b2ad991d2ee31104/tornado-6.4.2-cp38-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:304463bd0772442ff4d0f5149c6f1c2135a1fae045adf070821c6cdc76980634", size = 437892, upload-time = "2024-11-22T03:06:28.933Z" }, + { url = "https://files.pythonhosted.org/packages/f5/33/4f91fdd94ea36e1d796147003b490fe60a0215ac5737b6f9c65e160d4fe0/tornado-6.4.2-cp38-abi3-musllinux_1_2_i686.whl", hash = "sha256:c82c46813ba483a385ab2a99caeaedf92585a1f90defb5693351fa7e4ea0bf73", size = 437334, upload-time = "2024-11-22T03:06:30.428Z" }, + { url = "https://files.pythonhosted.org/packages/2b/ae/c1b22d4524b0e10da2f29a176fb2890386f7bd1f63aacf186444873a88a0/tornado-6.4.2-cp38-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:932d195ca9015956fa502c6b56af9eb06106140d844a335590c1ec7f5277d10c", size = 437261, upload-time = "2024-11-22T03:06:32.458Z" }, + { url = "https://files.pythonhosted.org/packages/b5/25/36dbd49ab6d179bcfc4c6c093a51795a4f3bed380543a8242ac3517a1751/tornado-6.4.2-cp38-abi3-win32.whl", hash = "sha256:2876cef82e6c5978fde1e0d5b1f919d756968d5b4282418f3146b79b58556482", size = 438463, upload-time = "2024-11-22T03:06:34.71Z" }, + { url = "https://files.pythonhosted.org/packages/61/cc/58b1adeb1bb46228442081e746fcdbc4540905c87e8add7c277540934edb/tornado-6.4.2-cp38-abi3-win_amd64.whl", hash = "sha256:908b71bf3ff37d81073356a5fadcc660eb10c1476ee6e2725588626ce7e5ca38", size = 438907, upload-time = "2024-11-22T03:06:36.71Z" }, +] + +[[package]] +name = "tornado" +version = "6.5.2" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version >= '3.14'", + "python_full_version >= '3.11' and python_full_version < '3.14'", + "python_full_version == '3.10.*'", + "python_full_version == '3.9.*'", +] +sdist = { url = "https://files.pythonhosted.org/packages/09/ce/1eb500eae19f4648281bb2186927bb062d2438c2e5093d1360391afd2f90/tornado-6.5.2.tar.gz", hash = "sha256:ab53c8f9a0fa351e2c0741284e06c7a45da86afb544133201c5cc8578eb076a0", size = 510821, upload-time = "2025-08-08T18:27:00.78Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/f6/48/6a7529df2c9cc12efd2e8f5dd219516184d703b34c06786809670df5b3bd/tornado-6.5.2-cp39-abi3-macosx_10_9_universal2.whl", hash = "sha256:2436822940d37cde62771cff8774f4f00b3c8024fe482e16ca8387b8a2724db6", size = 442563, upload-time = "2025-08-08T18:26:42.945Z" }, + { url = "https://files.pythonhosted.org/packages/f2/b5/9b575a0ed3e50b00c40b08cbce82eb618229091d09f6d14bce80fc01cb0b/tornado-6.5.2-cp39-abi3-macosx_10_9_x86_64.whl", hash = "sha256:583a52c7aa94ee046854ba81d9ebb6c81ec0fd30386d96f7640c96dad45a03ef", size = 440729, upload-time = "2025-08-08T18:26:44.473Z" }, + { url = "https://files.pythonhosted.org/packages/1b/4e/619174f52b120efcf23633c817fd3fed867c30bff785e2cd5a53a70e483c/tornado-6.5.2-cp39-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b0fe179f28d597deab2842b86ed4060deec7388f1fd9c1b4a41adf8af058907e", size = 444295, upload-time = "2025-08-08T18:26:46.021Z" }, + { url = "https://files.pythonhosted.org/packages/95/fa/87b41709552bbd393c85dd18e4e3499dcd8983f66e7972926db8d96aa065/tornado-6.5.2-cp39-abi3-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b186e85d1e3536d69583d2298423744740986018e393d0321df7340e71898882", size = 443644, upload-time = "2025-08-08T18:26:47.625Z" }, + { url = "https://files.pythonhosted.org/packages/f9/41/fb15f06e33d7430ca89420283a8762a4e6b8025b800ea51796ab5e6d9559/tornado-6.5.2-cp39-abi3-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e792706668c87709709c18b353da1f7662317b563ff69f00bab83595940c7108", size = 443878, upload-time = "2025-08-08T18:26:50.599Z" }, + { url = "https://files.pythonhosted.org/packages/11/92/fe6d57da897776ad2e01e279170ea8ae726755b045fe5ac73b75357a5a3f/tornado-6.5.2-cp39-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:06ceb1300fd70cb20e43b1ad8aaee0266e69e7ced38fa910ad2e03285009ce7c", size = 444549, upload-time = "2025-08-08T18:26:51.864Z" }, + { url = "https://files.pythonhosted.org/packages/9b/02/c8f4f6c9204526daf3d760f4aa555a7a33ad0e60843eac025ccfd6ff4a93/tornado-6.5.2-cp39-abi3-musllinux_1_2_i686.whl", hash = "sha256:74db443e0f5251be86cbf37929f84d8c20c27a355dd452a5cfa2aada0d001ec4", size = 443973, upload-time = "2025-08-08T18:26:53.625Z" }, + { url = "https://files.pythonhosted.org/packages/ae/2d/f5f5707b655ce2317190183868cd0f6822a1121b4baeae509ceb9590d0bd/tornado-6.5.2-cp39-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:b5e735ab2889d7ed33b32a459cac490eda71a1ba6857b0118de476ab6c366c04", size = 443954, upload-time = "2025-08-08T18:26:55.072Z" }, + { url = "https://files.pythonhosted.org/packages/e8/59/593bd0f40f7355806bf6573b47b8c22f8e1374c9b6fd03114bd6b7a3dcfd/tornado-6.5.2-cp39-abi3-win32.whl", hash = "sha256:c6f29e94d9b37a95013bb669616352ddb82e3bfe8326fccee50583caebc8a5f0", size = 445023, upload-time = "2025-08-08T18:26:56.677Z" }, + { url = "https://files.pythonhosted.org/packages/c7/2a/f609b420c2f564a748a2d80ebfb2ee02a73ca80223af712fca591386cafb/tornado-6.5.2-cp39-abi3-win_amd64.whl", hash = "sha256:e56a5af51cc30dd2cae649429af65ca2f6571da29504a07995175df14c18f35f", size = 445427, upload-time = "2025-08-08T18:26:57.91Z" }, + { url = "https://files.pythonhosted.org/packages/5e/4f/e1f65e8f8c76d73658b33d33b81eed4322fb5085350e4328d5c956f0c8f9/tornado-6.5.2-cp39-abi3-win_arm64.whl", hash = "sha256:d6c33dc3672e3a1f3618eb63b7ef4683a7688e7b9e6e8f0d9aa5726360a004af", size = 444456, upload-time = "2025-08-08T18:26:59.207Z" }, +] + +[[package]] +name = "tqdm" +version = "4.67.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "colorama", marker = "sys_platform == 'win32'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/a8/4b/29b4ef32e036bb34e4ab51796dd745cdba7ed47ad142a9f4a1eb8e0c744d/tqdm-4.67.1.tar.gz", hash = "sha256:f8aef9c52c08c13a65f30ea34f4e5aac3fd1a34959879d7e59e63027286627f2", size = 169737, upload-time = "2024-11-24T20:12:22.481Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/d0/30/dc54f88dd4a2b5dc8a0279bdd7270e735851848b762aeb1c1184ed1f6b14/tqdm-4.67.1-py3-none-any.whl", hash = "sha256:26445eca388f82e72884e0d580d5464cd801a3ea01e63e5601bdff9ba6a48de2", size = 78540, upload-time = "2024-11-24T20:12:19.698Z" }, +] + +[[package]] +name = "traitlets" +version = "5.14.3" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/eb/79/72064e6a701c2183016abbbfedaba506d81e30e232a68c9f0d6f6fcd1574/traitlets-5.14.3.tar.gz", hash = "sha256:9ed0579d3502c94b4b3732ac120375cda96f923114522847de4b3bb98b96b6b7", size = 161621, upload-time = "2024-04-19T11:11:49.746Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/00/c0/8f5d070730d7836adc9c9b6408dec68c6ced86b304a9b26a14df072a6e8c/traitlets-5.14.3-py3-none-any.whl", hash = "sha256:b74e89e397b1ed28cc831db7aea759ba6640cb3de13090ca145426688ff1ac4f", size = 85359, upload-time = "2024-04-19T11:11:46.763Z" }, +] + +[[package]] +name = "trame" +version = "3.7.1" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version < '3.9'", +] +dependencies = [ + { name = "trame-client", version = "3.5.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.9'" }, + { name = "trame-server", marker = "python_full_version < '3.9'" }, + { name = "wslink", marker = "python_full_version < '3.9'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/26/0f/2e2ddde000a0ec496611e3e178325b4f44a69addda9aac12d6a721772e2f/trame-3.7.1.tar.gz", hash = "sha256:2713411107726f9ddf9f5c46afef38ef498b638ceb4c1c937c8e3fb4c2c43b8b", size = 26386, upload-time = "2024-12-05T19:39:40.059Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/13/ba/b6d7a96ba829d2815b04d43bac277c98126d2f84d10d90a2486fb0a0336e/trame-3.7.1-py3-none-any.whl", hash = "sha256:1834e2126e635e39183374c1e34efffa0bfd643a3c0235199c0debe5c83a32ca", size = 31444, upload-time = "2024-12-05T19:39:37.906Z" }, +] + +[[package]] +name = "trame" +version = "3.12.0" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version >= '3.14'", + "python_full_version >= '3.11' and python_full_version < '3.14'", + "python_full_version == '3.10.*'", + "python_full_version == '3.9.*'", +] +dependencies = [ + { name = "pyyaml", marker = "python_full_version >= '3.9'" }, + { name = "trame-client", version = "3.11.2", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.9'" }, + { name = "trame-common", marker = "python_full_version >= '3.9'" }, + { name = "trame-server", marker = "python_full_version >= '3.9'" }, + { name = "wslink", marker = "python_full_version >= '3.9'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/35/ac/ebd44ac237841d131314e41e0b1654926b77517b0553d7a7f4227778db07/trame-3.12.0.tar.gz", hash = "sha256:88b861162cb8b025e84e93f17dcfd43a84d02d2c1608c9f6d58e3cd646a50c05", size = 23493, upload-time = "2025-08-18T20:21:40.655Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/70/15/5869b2c7556fce52306b6b65b06ec7c088f063b865cdfa75ad30bc229b7c/trame-3.12.0-py3-none-any.whl", hash = "sha256:9b33020625e0d1710d060c0fabe7b3be0e31b5e5138439ec9a796faf6fe96915", size = 28516, upload-time = "2025-08-18T20:21:39.037Z" }, +] + +[[package]] +name = "trame-client" +version = "3.5.0" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version < '3.9'", +] +sdist = { url = "https://files.pythonhosted.org/packages/0a/f6/8e5e338e9e553f3986556e59ffa2e794eab7b61e01333fc9f439550166a7/trame-client-3.5.0.tar.gz", hash = "sha256:e472255608e00bbb3683a805b97825e819326abb01ae007c3121606355691c25", size = 230965, upload-time = "2024-11-18T16:38:59.798Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/d1/52/9513bd49e1ff49341f502ca55a33add6248ef1f3c317b27a7c8cf6aae889/trame_client-3.5.0-py3-none-any.whl", hash = "sha256:5eff22c68859f88fe0ff7ad3d814e95f81c105e1296f292a47006571d9f9659f", size = 236471, upload-time = "2024-11-18T16:38:58.236Z" }, +] + +[[package]] +name = "trame-client" +version = "3.11.2" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version >= '3.14'", + "python_full_version >= '3.11' and python_full_version < '3.14'", + "python_full_version == '3.10.*'", + "python_full_version == '3.9.*'", +] +dependencies = [ + { name = "trame-common", marker = "python_full_version >= '3.9'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/ae/a5/febe01d66c7524882c5f4f3e75affbf112896b660a8a53ddc505eeaa57f7/trame_client-3.11.2.tar.gz", hash = "sha256:98b3f09d0fbdb09cd29eac61c945a76dcad4a08cfb4843abce5a148fd6fc7316", size = 240877, upload-time = "2025-10-08T16:09:56.837Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/0f/3b/defac846c42dfaf27090d8294fbda0cbbeeb2e80b4b651841cc0e8f35d34/trame_client-3.11.2-py3-none-any.whl", hash = "sha256:f4d9364ea89cdb9d128fcebe4ab5034e5c20662feb5fee858cfe2eca3dea4771", size = 245066, upload-time = "2025-10-08T16:09:55.25Z" }, +] + +[[package]] +name = "trame-common" +version = "1.0.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/9b/81/fca0fde4ce06d6afafacfe44fc3989a7d89982a4a83c3252fe3679ecaaeb/trame_common-1.0.1.tar.gz", hash = "sha256:9d4af2d9a6d08a7405977f459931cab9d4b53ae120a80264545f679d1f9a94bc", size = 18375, upload-time = "2025-07-27T04:45:24.794Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/4f/9a/e77b16b3f13d87afd2c741dbee0e3affe859f0f2ac5641da8ffe5de8748f/trame_common-1.0.1-py3-none-any.whl", hash = "sha256:b8f568a6f917a511f9e24060e20b8a95860729b10307ac04d2336d6780e3a2e6", size = 21687, upload-time = "2025-07-27T04:45:23.323Z" }, +] + +[[package]] +name = "trame-server" +version = "3.8.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "more-itertools", version = "10.5.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.9'" }, + { name = "more-itertools", version = "10.8.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.9'" }, + { name = "wslink" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/bc/94/7e536b0bada379962268499e2051f5ce49ad1c2b2fd9ac58ae78a63b5f55/trame_server-3.8.1.tar.gz", hash = "sha256:88a2ab18d48664df903f2ef2c93734b96aa0ff51170b93aa3b218be80b70529a", size = 39422, upload-time = "2025-10-30T16:46:01.649Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/8b/14/d99c5a66cef93c4f8f149cd6781dd5c30472bc9350c28a9cee31a1b7d7c8/trame_server-3.8.1-py3-none-any.whl", hash = "sha256:b2a461432c36fcfc0f2d1805a7e766fff59b18155b5c6a1a43e1ab112c5eb2f3", size = 44160, upload-time = "2025-10-30T16:45:59.957Z" }, +] + +[[package]] +name = "trame-vtk" +version = "2.8.13" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version < '3.9'", +] +dependencies = [ + { name = "trame-client", version = "3.5.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.9'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/fe/e8/6bb3b0512ade062fce540e531cc86d91564ac5d779b7f2196fcf08e43e40/trame-vtk-2.8.13.tar.gz", hash = "sha256:b7438744c3a790a1c13c082b887f5abcd5132fe791ff631239a2cdce131dbcca", size = 733929, upload-time = "2025-01-07T18:04:35.215Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/49/52/4aff1c912b389cbf84336853fc8631105fcda1f99056f8c5e8257dfb7bed/trame_vtk-2.8.13-py3-none-any.whl", hash = "sha256:ba2a51c4dfad369e1c31e8a9676c8e9c69ebd677daa2c45dd54f94dfd3c91136", size = 749285, upload-time = "2025-01-07T18:04:32.315Z" }, +] + +[[package]] +name = "trame-vtk" +version = "2.10.0" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version >= '3.14'", + "python_full_version >= '3.11' and python_full_version < '3.14'", + "python_full_version == '3.10.*'", + "python_full_version == '3.9.*'", +] +dependencies = [ + { name = "trame-client", version = "3.11.2", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.9'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/77/2c/8bb4f9f04b43a1343239839f0e4049b981e7e7c278a2ec8fb97037259dfe/trame_vtk-2.10.0.tar.gz", hash = "sha256:0e4cabd78c1e8b67da857ba5c3a404a2195cb3e849a252bae51575291bef01ad", size = 758700, upload-time = "2025-10-02T19:15:11.56Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/1b/e4/c1b50fddaaf546b342f7e8f4cbd78a9e9e5d89249b2d29c55c9cec767347/trame_vtk-2.10.0-py3-none-any.whl", hash = "sha256:455e4b83f401cfe493a1f54fa06844ad53b7f4052123cd4c896e98411db427c8", size = 780831, upload-time = "2025-10-02T19:15:09.648Z" }, +] + +[[package]] +name = "trame-vuetify" +version = "2.7.2" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version < '3.9'", +] +dependencies = [ + { name = "trame-client", version = "3.5.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.9'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/27/b4/cf4c3115cb66a68d17ef77a8c7c4ba19706f896d2ae879859be4fccd0f99/trame-vuetify-2.7.2.tar.gz", hash = "sha256:b1489207c072345250baaea3b9a4b22fdca480bb58b195110eb779b0f60167b3", size = 4332718, upload-time = "2024-11-14T21:17:36.618Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/cb/43/3fd8c3865a04039deef89031ff34f1fcbd12d4f8c34130efb3ced3eda183/trame_vuetify-2.7.2-py3-none-any.whl", hash = "sha256:08d682d6da82b0325e267b0ad7636cf37f4563acf396aafd55a3a0e21b5213b2", size = 4356310, upload-time = "2024-11-14T21:17:34.879Z" }, +] + +[[package]] +name = "trame-vuetify" +version = "3.1.0" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version >= '3.14'", + "python_full_version >= '3.11' and python_full_version < '3.14'", + "python_full_version == '3.10.*'", + "python_full_version == '3.9.*'", +] +dependencies = [ + { name = "trame-client", version = "3.11.2", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.9'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/02/9a/a74decfd43ff7dedc2b3a32417ac88d1f105a2415d13ca85645b66bed144/trame_vuetify-3.1.0.tar.gz", hash = "sha256:be7d53da7fd755ce0bf74ecd52b9dc324c3ceac1a60442f8d371ecf9c9abe046", size = 5070287, upload-time = "2025-09-25T14:59:30.52Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/68/4c/4cc9ab46f231997dbcc6a4f05bb9fe80e842d52ac16ca963fb6747531560/trame_vuetify-3.1.0-py3-none-any.whl", hash = "sha256:1700c993c526aa6095a1bba62431dc5c95f2c302d19a6422a2cd5aab74ec5e77", size = 5097605, upload-time = "2025-09-25T14:59:28.466Z" }, +] + +[[package]] +name = "twine" +version = "6.1.0" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version < '3.9'", +] +dependencies = [ + { name = "id", marker = "python_full_version < '3.9'" }, + { name = "importlib-metadata", version = "8.5.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.9'" }, + { name = "keyring", version = "25.5.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.9' and platform_machine != 'ppc64le' and platform_machine != 's390x'" }, + { name = "packaging", marker = "python_full_version < '3.9'" }, + { name = "readme-renderer", version = "43.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.9'" }, + { name = "requests", version = "2.32.4", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.9'" }, + { name = "requests-toolbelt", marker = "python_full_version < '3.9'" }, + { name = "rfc3986", marker = "python_full_version < '3.9'" }, + { name = "rich", marker = "python_full_version < '3.9'" }, + { name = "urllib3", version = "2.2.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.9'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/c8/a2/6df94fc5c8e2170d21d7134a565c3a8fb84f9797c1dd65a5976aaf714418/twine-6.1.0.tar.gz", hash = "sha256:be324f6272eff91d07ee93f251edf232fc647935dd585ac003539b42404a8dbd", size = 168404, upload-time = "2025-01-21T18:45:26.758Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/7c/b6/74e927715a285743351233f33ea3c684528a0d374d2e43ff9ce9585b73fe/twine-6.1.0-py3-none-any.whl", hash = "sha256:a47f973caf122930bf0fbbf17f80b83bc1602c9ce393c7845f289a3001dc5384", size = 40791, upload-time = "2025-01-21T18:45:24.584Z" }, +] + +[[package]] +name = "twine" +version = "6.2.0" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version >= '3.14'", + "python_full_version >= '3.11' and python_full_version < '3.14'", + "python_full_version == '3.10.*'", + "python_full_version == '3.9.*'", +] +dependencies = [ + { name = "id", marker = "python_full_version >= '3.9'" }, + { name = "importlib-metadata", version = "8.7.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version == '3.9.*'" }, + { name = "keyring", version = "25.7.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.9' and platform_machine != 'ppc64le' and platform_machine != 's390x'" }, + { name = "packaging", marker = "python_full_version >= '3.9'" }, + { name = "readme-renderer", version = "44.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.9'" }, + { name = "requests", version = "2.32.5", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.9'" }, + { name = "requests-toolbelt", marker = "python_full_version >= '3.9'" }, + { name = "rfc3986", marker = "python_full_version >= '3.9'" }, + { name = "rich", marker = "python_full_version >= '3.9'" }, + { name = "urllib3", version = "2.5.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.9'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/e0/a8/949edebe3a82774c1ec34f637f5dd82d1cf22c25e963b7d63771083bbee5/twine-6.2.0.tar.gz", hash = "sha256:e5ed0d2fd70c9959770dce51c8f39c8945c574e18173a7b81802dab51b4b75cf", size = 172262, upload-time = "2025-09-04T15:43:17.255Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/3a/7a/882d99539b19b1490cac5d77c67338d126e4122c8276bf640e411650c830/twine-6.2.0-py3-none-any.whl", hash = "sha256:418ebf08ccda9a8caaebe414433b0ba5e25eb5e4a927667122fbe8f829f985d8", size = 42727, upload-time = "2025-09-04T15:43:15.994Z" }, +] + +[[package]] +name = "typing-extensions" +version = "4.13.2" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version < '3.9'", +] +sdist = { url = "https://files.pythonhosted.org/packages/f6/37/23083fcd6e35492953e8d2aaaa68b860eb422b34627b13f2ce3eb6106061/typing_extensions-4.13.2.tar.gz", hash = "sha256:e6c81219bd689f51865d9e372991c540bda33a0379d5573cddb9a3a23f7caaef", size = 106967, upload-time = "2025-04-10T14:19:05.416Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/8b/54/b1ae86c0973cc6f0210b53d508ca3641fb6d0c56823f288d108bc7ab3cc8/typing_extensions-4.13.2-py3-none-any.whl", hash = "sha256:a439e7c04b49fec3e5d3e2beaa21755cadbbdc391694e28ccdd36ca4a1408f8c", size = 45806, upload-time = "2025-04-10T14:19:03.967Z" }, +] + +[[package]] +name = "typing-extensions" +version = "4.15.0" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version >= '3.14'", + "python_full_version >= '3.11' and python_full_version < '3.14'", + "python_full_version == '3.10.*'", + "python_full_version == '3.9.*'", +] +sdist = { url = "https://files.pythonhosted.org/packages/72/94/1a15dd82efb362ac84269196e94cf00f187f7ed21c242792a923cdb1c61f/typing_extensions-4.15.0.tar.gz", hash = "sha256:0cea48d173cc12fa28ecabc3b837ea3cf6f38c6d1136f85cbaaf598984861466", size = 109391, upload-time = "2025-08-25T13:49:26.313Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/18/67/36e9267722cc04a6b9f15c7f3441c2363321a3ea07da7ae0c0707beb2a9c/typing_extensions-4.15.0-py3-none-any.whl", hash = "sha256:f0fa19c6845758ab08074a0cfa8b7aecb71c999ca73d62883bc25cc018c4e548", size = 44614, upload-time = "2025-08-25T13:49:24.86Z" }, +] + +[[package]] +name = "tzdata" +version = "2025.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/95/32/1a225d6164441be760d75c2c42e2780dc0873fe382da3e98a2e1e48361e5/tzdata-2025.2.tar.gz", hash = "sha256:b60a638fcc0daffadf82fe0f57e53d06bdec2f36c4df66280ae79bce6bd6f2b9", size = 196380, upload-time = "2025-03-23T13:54:43.652Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/5c/23/c7abc0ca0a1526a0774eca151daeb8de62ec457e77262b66b359c3c7679e/tzdata-2025.2-py2.py3-none-any.whl", hash = "sha256:1a403fada01ff9221ca8044d701868fa132215d84beb92242d9acd2147f667a8", size = 347839, upload-time = "2025-03-23T13:54:41.845Z" }, +] + +[[package]] +name = "uri-template" +version = "1.3.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/31/c7/0336f2bd0bcbada6ccef7aaa25e443c118a704f828a0620c6fa0207c1b64/uri-template-1.3.0.tar.gz", hash = "sha256:0e00f8eb65e18c7de20d595a14336e9f337ead580c70934141624b6d1ffdacc7", size = 21678, upload-time = "2023-06-21T01:49:05.374Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/e7/00/3fca040d7cf8a32776d3d81a00c8ee7457e00f80c649f1e4a863c8321ae9/uri_template-1.3.0-py3-none-any.whl", hash = "sha256:a44a133ea12d44a0c0f06d7d42a52d71282e77e2f937d8abd5655b8d56fc1363", size = 11140, upload-time = "2023-06-21T01:49:03.467Z" }, +] + +[[package]] +name = "urllib3" +version = "2.2.3" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version < '3.9'", +] +sdist = { url = "https://files.pythonhosted.org/packages/ed/63/22ba4ebfe7430b76388e7cd448d5478814d3032121827c12a2cc287e2260/urllib3-2.2.3.tar.gz", hash = "sha256:e7d814a81dad81e6caf2ec9fdedb284ecc9c73076b62654547cc64ccdcae26e9", size = 300677, upload-time = "2024-09-12T10:52:18.401Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ce/d9/5f4c13cecde62396b0d3fe530a50ccea91e7dfc1ccf0e09c228841bb5ba8/urllib3-2.2.3-py3-none-any.whl", hash = "sha256:ca899ca043dcb1bafa3e262d73aa25c465bfb49e0bd9dd5d59f1d0acba2f8fac", size = 126338, upload-time = "2024-09-12T10:52:16.589Z" }, +] + +[[package]] +name = "urllib3" +version = "2.5.0" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version >= '3.14'", + "python_full_version >= '3.11' and python_full_version < '3.14'", + "python_full_version == '3.10.*'", + "python_full_version == '3.9.*'", +] +sdist = { url = "https://files.pythonhosted.org/packages/15/22/9ee70a2574a4f4599c47dd506532914ce044817c7752a79b6a51286319bc/urllib3-2.5.0.tar.gz", hash = "sha256:3fc47733c7e419d4bc3f6b3dc2b4f890bb743906a30d56ba4a5bfa4bbff92760", size = 393185, upload-time = "2025-06-18T14:07:41.644Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/a7/c2/fe1e52489ae3122415c51f387e221dd0773709bad6c6cdaa599e8a2c5185/urllib3-2.5.0-py3-none-any.whl", hash = "sha256:e6b01673c0fa6a13e374b50871808eb3bf7046c4b125b216f6bf1cc604cff0dc", size = 129795, upload-time = "2025-06-18T14:07:40.39Z" }, +] + +[[package]] +name = "vtk" +version = "9.3.1" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version < '3.9'", +] +dependencies = [ + { name = "matplotlib", version = "3.7.5", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.9'" }, +] +wheels = [ + { url = "https://files.pythonhosted.org/packages/95/1f/91780093a0cf2afc234063bb9697d1285ccba138c1531700bc2986e65adc/vtk-9.3.1-cp310-cp310-macosx_10_10_x86_64.whl", hash = "sha256:c41ed344b9cc90ee9dcfc5967815de272985647d0c8e0a57f0e8b4229bc1b0b9", size = 76687544, upload-time = "2024-06-29T03:14:20.271Z" }, + { url = "https://files.pythonhosted.org/packages/eb/7c/124cc6047d2b67283c66444e3dd5e7bf8250c782ac22e599b03c4265f0fa/vtk-9.3.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:84c04327becc4c4dfe1fb04248baa4b5c480f188a9d52f4b912b163d33622442", size = 70350341, upload-time = "2024-06-29T03:14:26.052Z" }, + { url = "https://files.pythonhosted.org/packages/3b/d0/eda704215c82810cdb853ad5b8881bf1ea3ee4e963a5366258b30af520dd/vtk-9.3.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:890aee533fc0caca70bd1c8a4026b0d7f877518f237cc976ed4fb509d5f1dd83", size = 92116314, upload-time = "2024-06-29T03:14:35.191Z" }, + { url = "https://files.pythonhosted.org/packages/b5/90/9f2fd4382d29b87404f79a265cf82ff5b4e0c2b42a67dbc3517e16e1a425/vtk-9.3.1-cp310-cp310-win_amd64.whl", hash = "sha256:b8feed5029486703f4f8f81d8544a30d1788de87dc3396e16a281c343e1ac1cc", size = 52527111, upload-time = "2024-06-29T03:14:44.613Z" }, + { url = "https://files.pythonhosted.org/packages/58/08/94e2d38ae35ebb85cad96cb11738208307341cac8b16e162ed95ccb26860/vtk-9.3.1-cp311-cp311-macosx_10_10_x86_64.whl", hash = "sha256:55e2df9e6993b959b482b79a6d68b8d46397b479d69738d41b1501396fcad50c", size = 76687738, upload-time = "2024-06-29T03:14:54.449Z" }, + { url = "https://files.pythonhosted.org/packages/35/36/357ba7a02bc07a4d0df075e5a213a02020d509b312222445a05e354f52ff/vtk-9.3.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:c977486b0e4d87cddb3f2c7c0710d1c86243cdd01286cbd036231143d8eb4f6e", size = 70350272, upload-time = "2024-06-29T03:15:03.845Z" }, + { url = "https://files.pythonhosted.org/packages/d0/f8/1517f4f755233bb77542c222b173c760908f8f8d4330fc72526c295ab1e7/vtk-9.3.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f8edc04e0f8b6719cfc769e575a777267d667f447d1948c62fa97fb756cd75bb", size = 92115989, upload-time = "2024-06-29T03:15:13.337Z" }, + { url = "https://files.pythonhosted.org/packages/7a/44/3797d3367180a38bb41e24a6735860d94d16351fbe12e3f6bf6efb8940c8/vtk-9.3.1-cp311-cp311-win_amd64.whl", hash = "sha256:59cc043f611e3eca2870cc50f27e67852a182857de322415e942bdc133594acd", size = 52526922, upload-time = "2024-06-29T03:15:19.685Z" }, + { url = "https://files.pythonhosted.org/packages/6f/ba/1571d61013f3f5778c11741d5de19db197b437d1a52215560f016662597b/vtk-9.3.1-cp312-cp312-macosx_10_10_x86_64.whl", hash = "sha256:05a4b6e387a906e8c8d6844441f9200116e937069fcf81f43e2600f26eb046de", size = 76832738, upload-time = "2024-06-29T03:15:26.41Z" }, + { url = "https://files.pythonhosted.org/packages/8e/75/c637c620d23ccecb8ddf58fdb80af1dc56ecdd60f3e018c55e041663398b/vtk-9.3.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:bdbefb1aef9599a0a0b8222c9582f26946732a93534e6ec37d4b8e2c524c627e", size = 70385880, upload-time = "2024-06-29T03:15:33.131Z" }, + { url = "https://files.pythonhosted.org/packages/01/ee/730d57c6d7353c1afb919ceedfac387a190ccb92e611c4b14f88e6f39066/vtk-9.3.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f728bb61f43fce850d622ced3b3d51b3116f767685ca4e4e0076f624e2d2307d", size = 92159868, upload-time = "2024-06-29T03:15:39.072Z" }, + { url = "https://files.pythonhosted.org/packages/b1/34/b9b6de4009be2fe90919c4943ae99ae3d465ada73061e928d4744683f915/vtk-9.3.1-cp312-cp312-win_amd64.whl", hash = "sha256:685988e09070e06c8605886591698fd42d8225489509b6537a5046cd034cc93e", size = 52529544, upload-time = "2024-06-29T03:15:43.967Z" }, + { url = "https://files.pythonhosted.org/packages/b3/15/40f8264f1b5379f12caf0e5153006a61c1f808937877c996e907610e8f23/vtk-9.3.1-cp38-cp38-macosx_10_10_x86_64.whl", hash = "sha256:6adf4b812528a4658667602de8f023400c4381b8166f11b0ea8e0ab83c066539", size = 76699386, upload-time = "2024-06-29T03:17:03.169Z" }, + { url = "https://files.pythonhosted.org/packages/5a/36/eafd9073a6f31d808f321d508eb034e579bd21457d6eadd805f4aa0317a6/vtk-9.3.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:eaf90d0a797b5b7ada3fd0100c072dd146e674a2ccd25411036a4aca676f9101", size = 92112382, upload-time = "2024-06-29T03:17:17.251Z" }, + { url = "https://files.pythonhosted.org/packages/18/71/f13b98497f2a60d6fd2ee87f7ac7df048741d1e456a0fa08f08bb3537f97/vtk-9.3.1-cp38-cp38-win_amd64.whl", hash = "sha256:872e964c38dc1d969aaa29d10a5e56fd0324d61392e21dc044c679797fbdf0ef", size = 52791994, upload-time = "2024-06-29T03:17:24.358Z" }, + { url = "https://files.pythonhosted.org/packages/2a/8d/ec320eda9f60f0f48c030f6804d907ca9ce7cdae2839e6792e18f418c519/vtk-9.3.1-cp39-cp39-macosx_10_10_x86_64.whl", hash = "sha256:3ae62397364be3a40f89025fa844cbf38b422633c0dff1065d90eec74ca6facb", size = 76687485, upload-time = "2024-06-29T03:17:30.146Z" }, + { url = "https://files.pythonhosted.org/packages/ec/17/c4805af7f01a84801b01acf399ac1e4cdc3a7728f7d9b5f1a0f53c724fae/vtk-9.3.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:ab96d6923fa37a202874cb8b8b4202d537bd4702bb151638d384e1966d877e3a", size = 70348335, upload-time = "2024-06-29T03:17:35.831Z" }, + { url = "https://files.pythonhosted.org/packages/a0/f4/0fd6ce305b70927a326b2d26de2eaa61404fa71cdbeaf9aa2ac367b94968/vtk-9.3.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:592b303f96b4cf907df7914bbf8c1f374df382c70c1d0b4fa4bd32ac1f4365ce", size = 92115566, upload-time = "2024-06-29T03:17:41.938Z" }, + { url = "https://files.pythonhosted.org/packages/52/c3/a42bec64d8cea04b17e96e40449f52382b90008886e6f3315e355a05443e/vtk-9.3.1-cp39-cp39-win_amd64.whl", hash = "sha256:6dee68abcd15603ad8ef6cef21fb13e2996d520a16880780abc41eb409dbec0c", size = 52533075, upload-time = "2024-06-29T03:17:46.732Z" }, +] + +[[package]] +name = "vtk" +version = "9.5.2" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version >= '3.14'", + "python_full_version >= '3.11' and python_full_version < '3.14'", + "python_full_version == '3.10.*'", + "python_full_version == '3.9.*'", +] +dependencies = [ + { name = "matplotlib", version = "3.9.4", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version == '3.9.*'" }, + { name = "matplotlib", version = "3.10.7", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.10'" }, +] +wheels = [ + { url = "https://files.pythonhosted.org/packages/c1/71/0cc26142f4f5276944c17a8c839b3e06894617627750686e12dab708ade0/vtk-9.5.2-cp310-cp310-macosx_10_10_x86_64.whl", hash = "sha256:9ca87122352cf3c8748fee73c48930efa46fe1a868149a1f760bc17e8fae27ba", size = 86865294, upload-time = "2025-09-18T00:56:08.013Z" }, + { url = "https://files.pythonhosted.org/packages/c0/d2/2b891f70cb2144a9fb9fe30803d5dfdbae4b839bc27318e1e5e93eba181c/vtk-9.5.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:6da02d69dcf2d42472ec8c227e6a8406cedea53d3928af97f8d4e776ff89c95f", size = 80550341, upload-time = "2025-09-18T00:56:14.773Z" }, + { url = "https://files.pythonhosted.org/packages/1e/6a/79ef2fc5fb460d104b48b46215138e54097ea1eb08f2f7ae874372c0890e/vtk-9.5.2-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:c0ba9cc4b5cd463a1984dfac6d0a9eeef888b273208739f8ebc46d392ddabb93", size = 112239919, upload-time = "2025-09-18T00:56:19.058Z" }, + { url = "https://files.pythonhosted.org/packages/7e/b4/8c89d628ec4674fe53d85d8249c1d74c5678554b29f4333ad4f06d3388b5/vtk-9.5.2-cp310-cp310-manylinux_2_28_aarch64.whl", hash = "sha256:c9254f864ebef3d69666a1feedf09cad129e4c91f85ca804c38cf8addedb2748", size = 103718843, upload-time = "2025-09-18T00:56:23.684Z" }, + { url = "https://files.pythonhosted.org/packages/10/64/6a6b8100c8a9e7aac92e38f6625458737f3fc8060b280fa67c30b70253e7/vtk-9.5.2-cp310-cp310-win_amd64.whl", hash = "sha256:7c56dbd02e5b4ec0422886bf9e26059ad2d4622857dbfb90d9ed254104fd9d6c", size = 63915487, upload-time = "2025-09-18T00:56:29.245Z" }, + { url = "https://files.pythonhosted.org/packages/ff/8e/c8a4dee522ad0436c846f0f62444a2699cc0d72b2554aa09bcfcf2c01f29/vtk-9.5.2-cp311-cp311-macosx_10_10_x86_64.whl", hash = "sha256:afcbc6dc122ebba877793940fda8fd2cbe14e1dae590e6872ea74894abdab9be", size = 86865360, upload-time = "2025-09-18T00:56:33.18Z" }, + { url = "https://files.pythonhosted.org/packages/39/d5/ec52c2cea957221d5e41ebe1768c78d79c714f1e0e635cc4a545cab69d31/vtk-9.5.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:005877a568b96cf00ceb5bec268cf102db756bed509cb240fa40ada414a24bf0", size = 80550040, upload-time = "2025-09-18T00:56:37.337Z" }, + { url = "https://files.pythonhosted.org/packages/b9/00/73a2e3548eae8c122569ae40e947166620cf192ec9a46c6be94e04597dc3/vtk-9.5.2-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:2e2fe2535483adb1ba8cc83a0dc296faaffa2505808a3b04f697084f656e5f84", size = 112239648, upload-time = "2025-09-18T00:56:42.591Z" }, + { url = "https://files.pythonhosted.org/packages/4e/fb/9a88a43be9deccdfb04228a059aa6e7e0416b96223436cf040bc627b5a1d/vtk-9.5.2-cp311-cp311-manylinux_2_28_aarch64.whl", hash = "sha256:0248aab2ee51a69fadcdcf74697a045e2d525009a35296100eed2211f0cca2bb", size = 103718432, upload-time = "2025-09-18T00:56:49.733Z" }, + { url = "https://files.pythonhosted.org/packages/3a/f0/2f499af38d5b30f0ee80f644ef16be3be739f475d19fbdf518ab622dfb88/vtk-9.5.2-cp311-cp311-win_amd64.whl", hash = "sha256:f78674fd265022499ea6b7f03d7f11a861e89e1df043592a82e4f5235c537ef5", size = 63914667, upload-time = "2025-09-18T00:56:53.795Z" }, + { url = "https://files.pythonhosted.org/packages/23/43/58f4d2d127fc8e8aa26e4793cf80e901b395de44fb6ac69acd7c7b8856ce/vtk-9.5.2-cp312-cp312-macosx_10_10_x86_64.whl", hash = "sha256:cf5dbc93b6806b08799204430a4fc4bea74290c1c101fa64f1a4703144087fa3", size = 87057834, upload-time = "2025-09-18T00:56:57.737Z" }, + { url = "https://files.pythonhosted.org/packages/e5/1a/a5d5ef2a5a55512158cad83524bab7a4a451f917aee342f117144d53c6eb/vtk-9.5.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:cce212b911d13fb0ca36d339f658c9db1ff27a5a730cdddd5d0c6b2ec24c15b1", size = 80607226, upload-time = "2025-09-18T00:57:01.782Z" }, + { url = "https://files.pythonhosted.org/packages/c5/6c/e5544c77b568bfbcc3592fb5e23a5dee8e84df9ee316230509362fb6d432/vtk-9.5.2-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:454711c51038824ddc75f955e1064c4e214b452c2e67083f01a8b43fc0ed62cb", size = 112292112, upload-time = "2025-09-18T00:57:07.554Z" }, + { url = "https://files.pythonhosted.org/packages/e4/44/55f7832950cde2d3e5e70d3640e26f3f6c97640769ed5079b4db91189e38/vtk-9.5.2-cp312-cp312-manylinux_2_28_aarch64.whl", hash = "sha256:9fce9688f0dede00dc6f3b046037c5fa8378479fa8303a353fd69afae4078d9a", size = 103797602, upload-time = "2025-09-18T00:57:17.783Z" }, + { url = "https://files.pythonhosted.org/packages/78/c2/a292e122cb038c1c2bbc44f3e0588f2ece2bcd44b889631a5c8d82a5f8bd/vtk-9.5.2-cp312-cp312-win_amd64.whl", hash = "sha256:5357bccdf8629373195cab871e45c50383d052d316192aa48f45bd9f87bafccb", size = 64002205, upload-time = "2025-09-18T00:57:23.5Z" }, + { url = "https://files.pythonhosted.org/packages/b8/e0/c1d4baa2d9c32fbf7d36bfa49347168b24136232b6536de433e094482e55/vtk-9.5.2-cp313-cp313-macosx_10_10_x86_64.whl", hash = "sha256:1eae5016620a5fd78f4918256ea65dbe100a7c3ce68f763b64523f06aaaeafbc", size = 87078130, upload-time = "2025-09-18T00:57:31.183Z" }, + { url = "https://files.pythonhosted.org/packages/95/e9/02af96275fd3c4cdf0d55964427c5f70c4a2106c1b6c357726d62e3e6da0/vtk-9.5.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:29ad766e308dcaa23b36261180cd9960215f48815b31c7ac2aa52edc88e21ef7", size = 80618932, upload-time = "2025-09-18T00:57:38.197Z" }, + { url = "https://files.pythonhosted.org/packages/20/d1/c8c4c9b4ff2044fadf4f0d0230a933cc1962e7ba8bca6013737e5773c5c2/vtk-9.5.2-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:11cf870c05539e9f82f4a5adf450384e0be4ee6cc80274f9502715a4139e2777", size = 112292475, upload-time = "2025-09-18T00:57:46.196Z" }, + { url = "https://files.pythonhosted.org/packages/87/6d/b0d404822329d3b7eeccd66cf61480cbb66bf1bf6bd2ef8eabedcec8428f/vtk-9.5.2-cp313-cp313-manylinux_2_28_aarch64.whl", hash = "sha256:3c4b658d61815cb87177f4e94281396c9be5a28798464a2c6fa0897b1bba282f", size = 103798352, upload-time = "2025-09-18T00:57:52.993Z" }, + { url = "https://files.pythonhosted.org/packages/07/8f/400d4e4270bd5da3a19ce465aa288c03435e1f38b0344ac2540615ec5b0b/vtk-9.5.2-cp313-cp313-win_amd64.whl", hash = "sha256:974783b8865e2ddc2818d3090705b6bc6bf8ae40346d67f9a43485fabcfb3a99", size = 64000682, upload-time = "2025-09-18T00:57:57.926Z" }, + { url = "https://files.pythonhosted.org/packages/c6/b5/47f92761b835debc611ac08dcf0545071f72129d54c76f63d35baa55266b/vtk-9.5.2-cp38-cp38-macosx_10_10_x86_64.whl", hash = "sha256:227c5e6e9195aa9d92a64d6d07d09f000576b5df231522b5c156a3c4c4190d69", size = 86872426, upload-time = "2025-09-18T00:58:02.549Z" }, + { url = "https://files.pythonhosted.org/packages/88/ac/6270754fb5f84aa254ab39bd5d8ebf09fe287371cd59dd4ceb3b77a71037/vtk-9.5.2-cp38-cp38-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:b5d0a89e893d9279ba9742d0bbd47d7dfac96fccd8fb9d024bb8aa098fde5637", size = 112236004, upload-time = "2025-09-18T00:58:07.426Z" }, + { url = "https://files.pythonhosted.org/packages/e4/0e/34ea2d9d1069d8676cc01c8d05d9dca02b21a8993c02611156a05a68c43c/vtk-9.5.2-cp38-cp38-manylinux_2_28_aarch64.whl", hash = "sha256:371d9068f5cb25861aa51c1d1792fffce5a44032dbece55412562429c5f257cc", size = 103711938, upload-time = "2025-09-18T00:58:12.537Z" }, + { url = "https://files.pythonhosted.org/packages/3d/6d/b562f33a04d322c40ae046263e8a3c71e847020fa25eda829bf3f0f49477/vtk-9.5.2-cp38-cp38-win_amd64.whl", hash = "sha256:7cf2e2e12184c018388f06fbffcb93ea9e478ca4bf636c3f66bd7503e2230298", size = 64187692, upload-time = "2025-09-18T00:58:16.632Z" }, + { url = "https://files.pythonhosted.org/packages/ac/b7/0d205b6e470211e2e00bc4a22aa176ecced91a7a0177abeb191483094d67/vtk-9.5.2-cp39-cp39-macosx_10_10_x86_64.whl", hash = "sha256:9b148e57837d1fd2a8a72f171a0fb40872837dea191f673f2b7ec397935c754e", size = 86864497, upload-time = "2025-09-18T00:58:22.592Z" }, + { url = "https://files.pythonhosted.org/packages/81/2d/a41f7689492f3a4ba1b71b68ba9659cb002bbcc8c97d44b0d4cb12e1f2c9/vtk-9.5.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:6a3b27f22d7e15f6a2d60510e70d75dac4ed2a53600e31275b67fedc45afbcc0", size = 80552787, upload-time = "2025-09-18T00:58:26.635Z" }, + { url = "https://files.pythonhosted.org/packages/90/36/eeff58a3ca6be8028121bbbfe32fcfe4892a0998afa38186cc2e20a6d7c0/vtk-9.5.2-cp39-cp39-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:b6b91968581132b0d96142a08d50028efa5aa7a876d4aff6de1664e99e006c89", size = 112239302, upload-time = "2025-09-18T00:58:31.582Z" }, + { url = "https://files.pythonhosted.org/packages/fc/b4/a8afde0c0654ac51accb9ff3c89b22dce6358b7a529f6a53bf6096d71775/vtk-9.5.2-cp39-cp39-manylinux_2_28_aarch64.whl", hash = "sha256:2b37670d56de32935eeadee58e1a9a0b5d3847294ca24ea9329101089be5de83", size = 103717798, upload-time = "2025-09-18T00:58:36.067Z" }, + { url = "https://files.pythonhosted.org/packages/55/98/aa9f251050897389738e4b0c9fb0161e84965f93ea606297f24d8f535499/vtk-9.5.2-cp39-cp39-win_amd64.whl", hash = "sha256:1ac9ff528892e585f8f3286b26a90250bd6ea9107c38e6e194939f6f28269ad6", size = 63916440, upload-time = "2025-09-18T00:58:41.398Z" }, +] + +[[package]] +name = "wakis" +source = { editable = "." } +dependencies = [ + { name = "h5py", version = "3.11.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.9'" }, + { name = "h5py", version = "3.14.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version == '3.9.*'" }, + { name = "h5py", version = "3.15.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.10'" }, + { name = "numpy", version = "1.24.4", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.9'" }, + { name = "numpy", version = "1.26.4", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.9'" }, + { name = "pyvista", version = "0.44.2", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.9'" }, + { name = "pyvista", version = "0.46.4", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.9'" }, + { name = "scipy", version = "1.10.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.9'" }, + { name = "scipy", version = "1.13.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version == '3.9.*'" }, + { name = "scipy", version = "1.15.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version == '3.10.*'" }, + { name = "scipy", version = "1.16.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, + { name = "tqdm" }, +] + +[package.optional-dependencies] +dev = [ + { name = "build", version = "1.2.2.post1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.9'" }, + { name = "build", version = "1.3.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.9'" }, + { name = "tomlq" }, + { name = "twine", version = "6.1.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.9'" }, + { name = "twine", version = "6.2.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.9'" }, +] +docs = [ + { name = "matplotlib", version = "3.7.5", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.9'" }, + { name = "matplotlib", version = "3.9.4", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version == '3.9.*'" }, + { name = "matplotlib", version = "3.10.7", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.10'" }, + { name = "myst-parser", version = "3.0.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.10'" }, + { name = "myst-parser", version = "4.0.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.10'" }, + { name = "readthedocs-sphinx-search" }, + { name = "sphinx", version = "7.1.2", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.9'" }, + { name = "sphinx", version = "7.4.7", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version == '3.9.*'" }, + { name = "sphinx", version = "8.1.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version == '3.10.*'" }, + { name = "sphinx", version = "8.2.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, + { name = "sphinx-copybutton" }, + { name = "sphinx-design", version = "0.5.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.9'" }, + { name = "sphinx-design", version = "0.6.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.9'" }, + { name = "sphinx-last-updated-by-git" }, + { name = "sphinx-rtd-theme" }, +] +notebook = [ + { name = "ipykernel", version = "6.29.5", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.9'" }, + { name = "ipykernel", version = "6.31.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version == '3.9.*'" }, + { name = "ipykernel", version = "7.1.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.10'" }, + { name = "ipywidgets" }, + { name = "jupyterlab", version = "4.3.8", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.9'" }, + { name = "jupyterlab", version = "4.5.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.9'" }, + { name = "matplotlib", version = "3.7.5", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.9'" }, + { name = "matplotlib", version = "3.9.4", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version == '3.9.*'" }, + { name = "matplotlib", version = "3.10.7", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.10'" }, + { name = "pyvista", version = "0.44.2", source = { registry = "https://pypi.org/simple" }, extra = ["jupyter"], marker = "python_full_version < '3.9'" }, + { name = "pyvista", version = "0.46.4", source = { registry = "https://pypi.org/simple" }, extra = ["jupyter"], marker = "python_full_version >= '3.9'" }, +] +tests = [ + { name = "pytest", version = "8.3.5", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.9'" }, + { name = "pytest", version = "8.4.2", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version == '3.9.*'" }, + { name = "pytest", version = "9.0.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.10'" }, + { name = "pytest-cov", version = "5.0.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.9'" }, + { name = "pytest-cov", version = "7.0.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.9'" }, +] + +[package.metadata] +requires-dist = [ + { name = "build", marker = "extra == 'dev'" }, + { name = "h5py" }, + { name = "ipykernel", marker = "extra == 'notebook'" }, + { name = "ipywidgets", marker = "extra == 'notebook'" }, + { name = "jupyterlab", marker = "extra == 'notebook'" }, + { name = "matplotlib", marker = "extra == 'docs'", specifier = ">=3.4.0" }, + { name = "matplotlib", marker = "extra == 'notebook'" }, + { name = "myst-parser", marker = "extra == 'docs'", specifier = ">=0.18.1" }, + { name = "numpy", specifier = "<2.0" }, + { name = "pytest", marker = "extra == 'tests'" }, + { name = "pytest-cov", marker = "extra == 'tests'" }, + { name = "pyvista" }, + { name = "pyvista", extras = ["jupyter"], marker = "extra == 'notebook'" }, + { name = "readthedocs-sphinx-search", marker = "extra == 'docs'" }, + { name = "scipy" }, + { name = "sphinx", marker = "extra == 'docs'" }, + { name = "sphinx-copybutton", marker = "extra == 'docs'" }, + { name = "sphinx-design", marker = "extra == 'docs'" }, + { name = "sphinx-last-updated-by-git", marker = "extra == 'docs'" }, + { name = "sphinx-rtd-theme", marker = "extra == 'docs'" }, + { name = "tomlq", marker = "extra == 'dev'" }, + { name = "tqdm" }, + { name = "twine", marker = "extra == 'dev'" }, +] +provides-extras = ["notebook", "tests", "docs", "dev"] + +[[package]] +name = "wcwidth" +version = "0.2.14" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/24/30/6b0809f4510673dc723187aeaf24c7f5459922d01e2f794277a3dfb90345/wcwidth-0.2.14.tar.gz", hash = "sha256:4d478375d31bc5395a3c55c40ccdf3354688364cd61c4f6adacaa9215d0b3605", size = 102293, upload-time = "2025-09-22T16:29:53.023Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/af/b5/123f13c975e9f27ab9c0770f514345bd406d0e8d3b7a0723af9d43f710af/wcwidth-0.2.14-py2.py3-none-any.whl", hash = "sha256:a7bb560c8aee30f9957e5f9895805edd20602f2d7f720186dfd906e82b4982e1", size = 37286, upload-time = "2025-09-22T16:29:51.641Z" }, +] + +[[package]] +name = "webcolors" +version = "24.8.0" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version < '3.9'", +] +sdist = { url = "https://files.pythonhosted.org/packages/fe/f8/53150a5bda7e042840b14f0236e1c0a4819d403658e3d453237983addfac/webcolors-24.8.0.tar.gz", hash = "sha256:08b07af286a01bcd30d583a7acadf629583d1f79bfef27dd2c2c5c263817277d", size = 42392, upload-time = "2024-08-10T08:52:31.226Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/f0/33/12020ba99beaff91682b28dc0bbf0345bbc3244a4afbae7644e4fa348f23/webcolors-24.8.0-py3-none-any.whl", hash = "sha256:fc4c3b59358ada164552084a8ebee637c221e4059267d0f8325b3b560f6c7f0a", size = 15027, upload-time = "2024-08-10T08:52:28.707Z" }, +] + +[[package]] +name = "webcolors" +version = "24.11.1" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version == '3.9.*'", +] +sdist = { url = "https://files.pythonhosted.org/packages/7b/29/061ec845fb58521848f3739e466efd8250b4b7b98c1b6c5bf4d40b419b7e/webcolors-24.11.1.tar.gz", hash = "sha256:ecb3d768f32202af770477b8b65f318fa4f566c22948673a977b00d589dd80f6", size = 45064, upload-time = "2024-11-11T07:43:24.224Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/60/e8/c0e05e4684d13459f93d312077a9a2efbe04d59c393bc2b8802248c908d4/webcolors-24.11.1-py3-none-any.whl", hash = "sha256:515291393b4cdf0eb19c155749a096f779f7d909f7cceea072791cb9095b92e9", size = 14934, upload-time = "2024-11-11T07:43:22.529Z" }, +] + +[[package]] +name = "webcolors" +version = "25.10.0" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version >= '3.14'", + "python_full_version >= '3.11' and python_full_version < '3.14'", + "python_full_version == '3.10.*'", +] +sdist = { url = "https://files.pythonhosted.org/packages/1d/7a/eb316761ec35664ea5174709a68bbd3389de60d4a1ebab8808bfc264ed67/webcolors-25.10.0.tar.gz", hash = "sha256:62abae86504f66d0f6364c2a8520de4a0c47b80c03fc3a5f1815fedbef7c19bf", size = 53491, upload-time = "2025-10-31T07:51:03.977Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/e2/cc/e097523dd85c9cf5d354f78310927f1656c422bd7b2613b2db3e3f9a0f2c/webcolors-25.10.0-py3-none-any.whl", hash = "sha256:032c727334856fc0b968f63daa252a1ac93d33db2f5267756623c210e57a4f1d", size = 14905, upload-time = "2025-10-31T07:51:01.778Z" }, +] + +[[package]] +name = "webencodings" +version = "0.5.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/0b/02/ae6ceac1baeda530866a85075641cec12989bd8d31af6d5ab4a3e8c92f47/webencodings-0.5.1.tar.gz", hash = "sha256:b36a1c245f2d304965eb4e0a82848379241dc04b865afcc4aab16748587e1923", size = 9721, upload-time = "2017-04-05T20:21:34.189Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/f4/24/2a3e3df732393fed8b3ebf2ec078f05546de641fe1b667ee316ec1dcf3b7/webencodings-0.5.1-py2.py3-none-any.whl", hash = "sha256:a0af1213f3c2226497a97e2b3aa01a7e4bee4f403f95be16fc9acd2947514a78", size = 11774, upload-time = "2017-04-05T20:21:32.581Z" }, +] + +[[package]] +name = "websocket-client" +version = "1.8.0" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version < '3.9'", +] +sdist = { url = "https://files.pythonhosted.org/packages/e6/30/fba0d96b4b5fbf5948ed3f4681f7da2f9f64512e1d303f94b4cc174c24a5/websocket_client-1.8.0.tar.gz", hash = "sha256:3239df9f44da632f96012472805d40a23281a991027ce11d2f45a6f24ac4c3da", size = 54648, upload-time = "2024-04-23T22:16:16.976Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/5a/84/44687a29792a70e111c5c477230a72c4b957d88d16141199bf9acb7537a3/websocket_client-1.8.0-py3-none-any.whl", hash = "sha256:17b44cc997f5c498e809b22cdf2d9c7a9e71c02c8cc2b6c56e7c2d1239bfa526", size = 58826, upload-time = "2024-04-23T22:16:14.422Z" }, +] + +[[package]] +name = "websocket-client" +version = "1.9.0" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version >= '3.14'", + "python_full_version >= '3.11' and python_full_version < '3.14'", + "python_full_version == '3.10.*'", + "python_full_version == '3.9.*'", +] +sdist = { url = "https://files.pythonhosted.org/packages/2c/41/aa4bf9664e4cda14c3b39865b12251e8e7d239f4cd0e3cc1b6c2ccde25c1/websocket_client-1.9.0.tar.gz", hash = "sha256:9e813624b6eb619999a97dc7958469217c3176312b3a16a4bd1bc7e08a46ec98", size = 70576, upload-time = "2025-10-07T21:16:36.495Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/34/db/b10e48aa8fff7407e67470363eac595018441cf32d5e1001567a7aeba5d2/websocket_client-1.9.0-py3-none-any.whl", hash = "sha256:af248a825037ef591efbf6ed20cc5faa03d3b47b9e5a2230a529eeee1c1fc3ef", size = 82616, upload-time = "2025-10-07T21:16:34.951Z" }, +] + +[[package]] +name = "widgetsnbextension" +version = "4.0.15" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/bd/f4/c67440c7fb409a71b7404b7aefcd7569a9c0d6bd071299bf4198ae7a5d95/widgetsnbextension-4.0.15.tar.gz", hash = "sha256:de8610639996f1567952d763a5a41af8af37f2575a41f9852a38f947eb82a3b9", size = 1097402, upload-time = "2025-11-01T21:15:55.178Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/3f/0e/fa3b193432cfc60c93b42f3be03365f5f909d2b3ea410295cf36df739e31/widgetsnbextension-4.0.15-py3-none-any.whl", hash = "sha256:8156704e4346a571d9ce73b84bee86a29906c9abfd7223b7228a28899ccf3366", size = 2196503, upload-time = "2025-11-01T21:15:53.565Z" }, +] + +[[package]] +name = "wslink" +version = "2.5.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "aiohttp", version = "3.10.11", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.9'" }, + { name = "aiohttp", version = "3.13.2", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.9'" }, + { name = "msgpack", version = "1.1.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.9'" }, + { name = "msgpack", version = "1.1.2", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.9'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/06/28/7c7cf32d544f464b58f14b8b9da2acfd382729c8c2074abe0dfe671361fc/wslink-2.5.0.tar.gz", hash = "sha256:61f79460affeeeb05284821f5ec5bc927153d587b661d6cfe33cbe260f9cfae3", size = 31996, upload-time = "2025-10-20T15:38:53.161Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/a2/33/44baf508511b036e455693cd874088f622b8f68e61415e92581a3ffdbbee/wslink-2.5.0-py3-none-any.whl", hash = "sha256:e5738958cc6cbe95581108df066be31a9ead0c485d2b27ca3f3f4865fc08b761", size = 36916, upload-time = "2025-10-20T15:38:52.148Z" }, +] + +[[package]] +name = "xmltodict" +version = "0.15.0" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version < '3.9'", +] +sdist = { url = "https://files.pythonhosted.org/packages/51/ee/b30fdb281b39da57053bd7012870989de6f066d6ef1476d78de8fc427324/xmltodict-0.15.0.tar.gz", hash = "sha256:c6d46b4e3413d1e4fc3e5016f0f1c7a5c10f8ce39efaa0cb099af986ecfc9a53", size = 60285, upload-time = "2025-09-05T00:35:45.947Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/d6/56/507a207b96e3aa7365c28bb6702011e7c76c899c1737966b25852eaef3e8/xmltodict-0.15.0-py2.py3-none-any.whl", hash = "sha256:8887783bf1faba1754fc45fdf3fe03fbb3629c811ae57f91c018aace4c58d4ed", size = 10965, upload-time = "2025-09-05T00:35:44.583Z" }, +] + +[[package]] +name = "xmltodict" +version = "1.0.2" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version >= '3.14'", + "python_full_version >= '3.11' and python_full_version < '3.14'", + "python_full_version == '3.10.*'", + "python_full_version == '3.9.*'", +] +sdist = { url = "https://files.pythonhosted.org/packages/6a/aa/917ceeed4dbb80d2f04dbd0c784b7ee7bba8ae5a54837ef0e5e062cd3cfb/xmltodict-1.0.2.tar.gz", hash = "sha256:54306780b7c2175a3967cad1db92f218207e5bc1aba697d887807c0fb68b7649", size = 25725, upload-time = "2025-09-17T21:59:26.459Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/c0/20/69a0e6058bc5ea74892d089d64dfc3a62ba78917ec5e2cfa70f7c92ba3a5/xmltodict-1.0.2-py3-none-any.whl", hash = "sha256:62d0fddb0dcbc9f642745d8bbf4d81fd17d6dfaec5a15b5c1876300aad92af0d", size = 13893, upload-time = "2025-09-17T21:59:24.859Z" }, +] + +[[package]] +name = "yarl" +version = "1.15.2" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version < '3.9'", +] +dependencies = [ + { name = "idna", marker = "python_full_version < '3.9'" }, + { name = "multidict", version = "6.1.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.9'" }, + { name = "propcache", version = "0.2.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.9'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/06/e1/d5427a061819c9f885f58bb0467d02a523f1aec19f9e5f9c82ce950d90d3/yarl-1.15.2.tar.gz", hash = "sha256:a39c36f4218a5bb668b4f06874d676d35a035ee668e6e7e3538835c703634b84", size = 169318, upload-time = "2024-10-13T18:48:04.311Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/61/f8/6b1bbc6f597d8937ad8661c042aa6bdbbe46a3a6e38e2c04214b9c82e804/yarl-1.15.2-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:e4ee8b8639070ff246ad3649294336b06db37a94bdea0d09ea491603e0be73b8", size = 136479, upload-time = "2024-10-13T18:44:32.077Z" }, + { url = "https://files.pythonhosted.org/packages/61/e0/973c0d16b1cb710d318b55bd5d019a1ecd161d28670b07d8d9df9a83f51f/yarl-1.15.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:a7cf963a357c5f00cb55b1955df8bbe68d2f2f65de065160a1c26b85a1e44172", size = 88671, upload-time = "2024-10-13T18:44:35.334Z" }, + { url = "https://files.pythonhosted.org/packages/16/df/241cfa1cf33b96da2c8773b76fe3ee58e04cb09ecfe794986ec436ae97dc/yarl-1.15.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:43ebdcc120e2ca679dba01a779333a8ea76b50547b55e812b8b92818d604662c", size = 86578, upload-time = "2024-10-13T18:44:37.58Z" }, + { url = "https://files.pythonhosted.org/packages/02/a4/ee2941d1f93600d921954a0850e20581159772304e7de49f60588e9128a2/yarl-1.15.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3433da95b51a75692dcf6cc8117a31410447c75a9a8187888f02ad45c0a86c50", size = 307212, upload-time = "2024-10-13T18:44:39.932Z" }, + { url = "https://files.pythonhosted.org/packages/08/64/2e6561af430b092b21c7a867ae3079f62e1532d3e51fee765fd7a74cef6c/yarl-1.15.2-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:38d0124fa992dbacd0c48b1b755d3ee0a9f924f427f95b0ef376556a24debf01", size = 321589, upload-time = "2024-10-13T18:44:42.527Z" }, + { url = "https://files.pythonhosted.org/packages/f8/af/056ab318a7117fa70f6ab502ff880e47af973948d1d123aff397cd68499c/yarl-1.15.2-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:ded1b1803151dd0f20a8945508786d57c2f97a50289b16f2629f85433e546d47", size = 319443, upload-time = "2024-10-13T18:44:45.03Z" }, + { url = "https://files.pythonhosted.org/packages/99/d1/051b0bc2c90c9a2618bab10a9a9a61a96ddb28c7c54161a5c97f9e625205/yarl-1.15.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ace4cad790f3bf872c082366c9edd7f8f8f77afe3992b134cfc810332206884f", size = 310324, upload-time = "2024-10-13T18:44:47.675Z" }, + { url = "https://files.pythonhosted.org/packages/23/1b/16df55016f9ac18457afda165031086bce240d8bcf494501fb1164368617/yarl-1.15.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c77494a2f2282d9bbbbcab7c227a4d1b4bb829875c96251f66fb5f3bae4fb053", size = 300428, upload-time = "2024-10-13T18:44:49.431Z" }, + { url = "https://files.pythonhosted.org/packages/83/a5/5188d1c575139a8dfd90d463d56f831a018f41f833cdf39da6bd8a72ee08/yarl-1.15.2-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:b7f227ca6db5a9fda0a2b935a2ea34a7267589ffc63c8045f0e4edb8d8dcf956", size = 307079, upload-time = "2024-10-13T18:44:51.96Z" }, + { url = "https://files.pythonhosted.org/packages/ba/4e/2497f8f2b34d1a261bebdbe00066242eacc9a7dccd4f02ddf0995014290a/yarl-1.15.2-cp310-cp310-musllinux_1_2_armv7l.whl", hash = "sha256:31561a5b4d8dbef1559b3600b045607cf804bae040f64b5f5bca77da38084a8a", size = 305835, upload-time = "2024-10-13T18:44:53.83Z" }, + { url = "https://files.pythonhosted.org/packages/91/db/40a347e1f8086e287a53c72dc333198816885bc770e3ecafcf5eaeb59311/yarl-1.15.2-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:3e52474256a7db9dcf3c5f4ca0b300fdea6c21cca0148c8891d03a025649d935", size = 311033, upload-time = "2024-10-13T18:44:56.464Z" }, + { url = "https://files.pythonhosted.org/packages/2f/a6/1500e1e694616c25eed6bf8c1aacc0943f124696d2421a07ae5e9ee101a5/yarl-1.15.2-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:0e1af74a9529a1137c67c887ed9cde62cff53aa4d84a3adbec329f9ec47a3936", size = 326317, upload-time = "2024-10-13T18:44:59.015Z" }, + { url = "https://files.pythonhosted.org/packages/37/db/868d4b59cc76932ce880cc9946cd0ae4ab111a718494a94cb50dd5b67d82/yarl-1.15.2-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:15c87339490100c63472a76d87fe7097a0835c705eb5ae79fd96e343473629ed", size = 324196, upload-time = "2024-10-13T18:45:00.772Z" }, + { url = "https://files.pythonhosted.org/packages/bd/41/b6c917c2fde2601ee0b45c82a0c502dc93e746dea469d3a6d1d0a24749e8/yarl-1.15.2-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:74abb8709ea54cc483c4fb57fb17bb66f8e0f04438cff6ded322074dbd17c7ec", size = 317023, upload-time = "2024-10-13T18:45:03.427Z" }, + { url = "https://files.pythonhosted.org/packages/b0/85/2cde6b656fd83c474f19606af3f7a3e94add8988760c87a101ee603e7b8f/yarl-1.15.2-cp310-cp310-win32.whl", hash = "sha256:ffd591e22b22f9cb48e472529db6a47203c41c2c5911ff0a52e85723196c0d75", size = 78136, upload-time = "2024-10-13T18:45:05.173Z" }, + { url = "https://files.pythonhosted.org/packages/ef/3c/4414901b0588427870002b21d790bd1fad142a9a992a22e5037506d0ed9d/yarl-1.15.2-cp310-cp310-win_amd64.whl", hash = "sha256:1695497bb2a02a6de60064c9f077a4ae9c25c73624e0d43e3aa9d16d983073c2", size = 84231, upload-time = "2024-10-13T18:45:07.622Z" }, + { url = "https://files.pythonhosted.org/packages/4a/59/3ae125c97a2a8571ea16fdf59fcbd288bc169e0005d1af9946a90ea831d9/yarl-1.15.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:9fcda20b2de7042cc35cf911702fa3d8311bd40055a14446c1e62403684afdc5", size = 136492, upload-time = "2024-10-13T18:45:09.962Z" }, + { url = "https://files.pythonhosted.org/packages/f9/2b/efa58f36b582db45b94c15e87803b775eb8a4ca0db558121a272e67f3564/yarl-1.15.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:0545de8c688fbbf3088f9e8b801157923be4bf8e7b03e97c2ecd4dfa39e48e0e", size = 88614, upload-time = "2024-10-13T18:45:12.329Z" }, + { url = "https://files.pythonhosted.org/packages/82/69/eb73c0453a2ff53194df485dc7427d54e6cb8d1180fcef53251a8e24d069/yarl-1.15.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:fbda058a9a68bec347962595f50546a8a4a34fd7b0654a7b9697917dc2bf810d", size = 86607, upload-time = "2024-10-13T18:45:13.88Z" }, + { url = "https://files.pythonhosted.org/packages/48/4e/89beaee3a4da0d1c6af1176d738cff415ff2ad3737785ee25382409fe3e3/yarl-1.15.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d1ac2bc069f4a458634c26b101c2341b18da85cb96afe0015990507efec2e417", size = 334077, upload-time = "2024-10-13T18:45:16.217Z" }, + { url = "https://files.pythonhosted.org/packages/da/e8/8fcaa7552093f94c3f327783e2171da0eaa71db0c267510898a575066b0f/yarl-1.15.2-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:cd126498171f752dd85737ab1544329a4520c53eed3997f9b08aefbafb1cc53b", size = 347365, upload-time = "2024-10-13T18:45:18.812Z" }, + { url = "https://files.pythonhosted.org/packages/be/fa/dc2002f82a89feab13a783d3e6b915a3a2e0e83314d9e3f6d845ee31bfcc/yarl-1.15.2-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3db817b4e95eb05c362e3b45dafe7144b18603e1211f4a5b36eb9522ecc62bcf", size = 344823, upload-time = "2024-10-13T18:45:20.644Z" }, + { url = "https://files.pythonhosted.org/packages/ae/c8/c4a00fe7f2aa6970c2651df332a14c88f8baaedb2e32d6c3b8c8a003ea74/yarl-1.15.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:076b1ed2ac819933895b1a000904f62d615fe4533a5cf3e052ff9a1da560575c", size = 337132, upload-time = "2024-10-13T18:45:22.487Z" }, + { url = "https://files.pythonhosted.org/packages/07/bf/84125f85f44bf2af03f3cf64e87214b42cd59dcc8a04960d610a9825f4d4/yarl-1.15.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f8cfd847e6b9ecf9f2f2531c8427035f291ec286c0a4944b0a9fce58c6446046", size = 326258, upload-time = "2024-10-13T18:45:25.049Z" }, + { url = "https://files.pythonhosted.org/packages/00/19/73ad8122b2fa73fe22e32c24b82a6c053cf6c73e2f649b73f7ef97bee8d0/yarl-1.15.2-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:32b66be100ac5739065496c74c4b7f3015cef792c3174982809274d7e51b3e04", size = 336212, upload-time = "2024-10-13T18:45:26.808Z" }, + { url = "https://files.pythonhosted.org/packages/39/1d/2fa4337d11f6587e9b7565f84eba549f2921494bc8b10bfe811079acaa70/yarl-1.15.2-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:34a2d76a1984cac04ff8b1bfc939ec9dc0914821264d4a9c8fd0ed6aa8d4cfd2", size = 330397, upload-time = "2024-10-13T18:45:29.112Z" }, + { url = "https://files.pythonhosted.org/packages/39/ab/dce75e06806bcb4305966471ead03ce639d8230f4f52c32bd614d820c044/yarl-1.15.2-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:0afad2cd484908f472c8fe2e8ef499facee54a0a6978be0e0cff67b1254fd747", size = 334985, upload-time = "2024-10-13T18:45:31.709Z" }, + { url = "https://files.pythonhosted.org/packages/c1/98/3f679149347a5e34c952bf8f71a387bc96b3488fae81399a49f8b1a01134/yarl-1.15.2-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:c68e820879ff39992c7f148113b46efcd6ec765a4865581f2902b3c43a5f4bbb", size = 356033, upload-time = "2024-10-13T18:45:34.325Z" }, + { url = "https://files.pythonhosted.org/packages/f7/8c/96546061c19852d0a4b1b07084a58c2e8911db6bcf7838972cff542e09fb/yarl-1.15.2-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:98f68df80ec6ca3015186b2677c208c096d646ef37bbf8b49764ab4a38183931", size = 357710, upload-time = "2024-10-13T18:45:36.216Z" }, + { url = "https://files.pythonhosted.org/packages/01/45/ade6fb3daf689816ebaddb3175c962731edf300425c3254c559b6d0dcc27/yarl-1.15.2-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:3c56ec1eacd0a5d35b8a29f468659c47f4fe61b2cab948ca756c39b7617f0aa5", size = 345532, upload-time = "2024-10-13T18:45:38.123Z" }, + { url = "https://files.pythonhosted.org/packages/e7/d7/8de800d3aecda0e64c43e8fc844f7effc8731a6099fa0c055738a2247504/yarl-1.15.2-cp311-cp311-win32.whl", hash = "sha256:eedc3f247ee7b3808ea07205f3e7d7879bc19ad3e6222195cd5fbf9988853e4d", size = 78250, upload-time = "2024-10-13T18:45:39.908Z" }, + { url = "https://files.pythonhosted.org/packages/3a/6c/69058bbcfb0164f221aa30e0cd1a250f6babb01221e27c95058c51c498ca/yarl-1.15.2-cp311-cp311-win_amd64.whl", hash = "sha256:0ccaa1bc98751fbfcf53dc8dfdb90d96e98838010fc254180dd6707a6e8bb179", size = 84492, upload-time = "2024-10-13T18:45:42.286Z" }, + { url = "https://files.pythonhosted.org/packages/e0/d1/17ff90e7e5b1a0b4ddad847f9ec6a214b87905e3a59d01bff9207ce2253b/yarl-1.15.2-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:82d5161e8cb8f36ec778fd7ac4d740415d84030f5b9ef8fe4da54784a1f46c94", size = 136721, upload-time = "2024-10-13T18:45:43.876Z" }, + { url = "https://files.pythonhosted.org/packages/44/50/a64ca0577aeb9507f4b672f9c833d46cf8f1e042ce2e80c11753b936457d/yarl-1.15.2-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:fa2bea05ff0a8fb4d8124498e00e02398f06d23cdadd0fe027d84a3f7afde31e", size = 88954, upload-time = "2024-10-13T18:45:46.305Z" }, + { url = "https://files.pythonhosted.org/packages/c9/0a/a30d0b02046d4088c1fd32d85d025bd70ceb55f441213dee14d503694f41/yarl-1.15.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:99e12d2bf587b44deb74e0d6170fec37adb489964dbca656ec41a7cd8f2ff178", size = 86692, upload-time = "2024-10-13T18:45:47.992Z" }, + { url = "https://files.pythonhosted.org/packages/06/0b/7613decb8baa26cba840d7ea2074bd3c5e27684cbcb6d06e7840d6c5226c/yarl-1.15.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:243fbbbf003754fe41b5bdf10ce1e7f80bcc70732b5b54222c124d6b4c2ab31c", size = 325762, upload-time = "2024-10-13T18:45:49.69Z" }, + { url = "https://files.pythonhosted.org/packages/97/f5/b8c389a58d1eb08f89341fc1bbcc23a0341f7372185a0a0704dbdadba53a/yarl-1.15.2-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:856b7f1a7b98a8c31823285786bd566cf06226ac4f38b3ef462f593c608a9bd6", size = 335037, upload-time = "2024-10-13T18:45:51.932Z" }, + { url = "https://files.pythonhosted.org/packages/cb/f9/d89b93a7bb8b66e01bf722dcc6fec15e11946e649e71414fd532b05c4d5d/yarl-1.15.2-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:553dad9af802a9ad1a6525e7528152a015b85fb8dbf764ebfc755c695f488367", size = 334221, upload-time = "2024-10-13T18:45:54.548Z" }, + { url = "https://files.pythonhosted.org/packages/10/77/1db077601998e0831a540a690dcb0f450c31f64c492e993e2eaadfbc7d31/yarl-1.15.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:30c3ff305f6e06650a761c4393666f77384f1cc6c5c0251965d6bfa5fbc88f7f", size = 330167, upload-time = "2024-10-13T18:45:56.675Z" }, + { url = "https://files.pythonhosted.org/packages/3b/c2/e5b7121662fd758656784fffcff2e411c593ec46dc9ec68e0859a2ffaee3/yarl-1.15.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:353665775be69bbfc6d54c8d134bfc533e332149faeddd631b0bc79df0897f46", size = 317472, upload-time = "2024-10-13T18:45:58.815Z" }, + { url = "https://files.pythonhosted.org/packages/c6/f3/41e366c17e50782651b192ba06a71d53500cc351547816bf1928fb043c4f/yarl-1.15.2-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:f4fe99ce44128c71233d0d72152db31ca119711dfc5f2c82385ad611d8d7f897", size = 330896, upload-time = "2024-10-13T18:46:01.126Z" }, + { url = "https://files.pythonhosted.org/packages/79/a2/d72e501bc1e33e68a5a31f584fe4556ab71a50a27bfd607d023f097cc9bb/yarl-1.15.2-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:9c1e3ff4b89cdd2e1a24c214f141e848b9e0451f08d7d4963cb4108d4d798f1f", size = 328787, upload-time = "2024-10-13T18:46:02.991Z" }, + { url = "https://files.pythonhosted.org/packages/9d/ba/890f7e1ea17f3c247748548eee876528ceb939e44566fa7d53baee57e5aa/yarl-1.15.2-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:711bdfae4e699a6d4f371137cbe9e740dc958530cb920eb6f43ff9551e17cfbc", size = 332631, upload-time = "2024-10-13T18:46:04.939Z" }, + { url = "https://files.pythonhosted.org/packages/48/c7/27b34206fd5dfe76b2caa08bf22f9212b2d665d5bb2df8a6dd3af498dcf4/yarl-1.15.2-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:4388c72174868884f76affcdd3656544c426407e0043c89b684d22fb265e04a5", size = 344023, upload-time = "2024-10-13T18:46:06.809Z" }, + { url = "https://files.pythonhosted.org/packages/88/e7/730b130f4f02bd8b00479baf9a57fdea1dc927436ed1d6ba08fa5c36c68e/yarl-1.15.2-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:f0e1844ad47c7bd5d6fa784f1d4accc5f4168b48999303a868fe0f8597bde715", size = 352290, upload-time = "2024-10-13T18:46:08.676Z" }, + { url = "https://files.pythonhosted.org/packages/84/9b/e8dda28f91a0af67098cddd455e6b540d3f682dda4c0de224215a57dee4a/yarl-1.15.2-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:a5cafb02cf097a82d74403f7e0b6b9df3ffbfe8edf9415ea816314711764a27b", size = 343742, upload-time = "2024-10-13T18:46:10.583Z" }, + { url = "https://files.pythonhosted.org/packages/66/47/b1c6bb85f2b66decbe189e27fcc956ab74670a068655df30ef9a2e15c379/yarl-1.15.2-cp312-cp312-win32.whl", hash = "sha256:156ececdf636143f508770bf8a3a0498de64da5abd890c7dbb42ca9e3b6c05b8", size = 78051, upload-time = "2024-10-13T18:46:12.671Z" }, + { url = "https://files.pythonhosted.org/packages/7d/9e/1a897e5248ec53e96e9f15b3e6928efd5e75d322c6cf666f55c1c063e5c9/yarl-1.15.2-cp312-cp312-win_amd64.whl", hash = "sha256:435aca062444a7f0c884861d2e3ea79883bd1cd19d0a381928b69ae1b85bc51d", size = 84313, upload-time = "2024-10-13T18:46:15.237Z" }, + { url = "https://files.pythonhosted.org/packages/46/ab/be3229898d7eb1149e6ba7fe44f873cf054d275a00b326f2a858c9ff7175/yarl-1.15.2-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:416f2e3beaeae81e2f7a45dc711258be5bdc79c940a9a270b266c0bec038fb84", size = 135006, upload-time = "2024-10-13T18:46:16.909Z" }, + { url = "https://files.pythonhosted.org/packages/10/10/b91c186b1b0e63951f80481b3e6879bb9f7179d471fe7c4440c9e900e2a3/yarl-1.15.2-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:173563f3696124372831007e3d4b9821746964a95968628f7075d9231ac6bb33", size = 88121, upload-time = "2024-10-13T18:46:18.702Z" }, + { url = "https://files.pythonhosted.org/packages/bf/1d/4ceaccf836b9591abfde775e84249b847ac4c6c14ee2dd8d15b5b3cede44/yarl-1.15.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:9ce2e0f6123a60bd1a7f5ae3b2c49b240c12c132847f17aa990b841a417598a2", size = 85967, upload-time = "2024-10-13T18:46:20.354Z" }, + { url = "https://files.pythonhosted.org/packages/93/bd/c924f22bdb2c5d0ca03a9e64ecc5e041aace138c2a91afff7e2f01edc3a1/yarl-1.15.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:eaea112aed589131f73d50d570a6864728bd7c0c66ef6c9154ed7b59f24da611", size = 325615, upload-time = "2024-10-13T18:46:22.057Z" }, + { url = "https://files.pythonhosted.org/packages/59/a5/6226accd5c01cafd57af0d249c7cf9dd12569cd9c78fbd93e8198e7a9d84/yarl-1.15.2-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e4ca3b9f370f218cc2a0309542cab8d0acdfd66667e7c37d04d617012485f904", size = 334945, upload-time = "2024-10-13T18:46:24.184Z" }, + { url = "https://files.pythonhosted.org/packages/4c/c1/cc6ccdd2bcd0ff7291602d5831754595260f8d2754642dfd34fef1791059/yarl-1.15.2-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:23ec1d3c31882b2a8a69c801ef58ebf7bae2553211ebbddf04235be275a38548", size = 336701, upload-time = "2024-10-13T18:46:27.038Z" }, + { url = "https://files.pythonhosted.org/packages/ef/ff/39a767ee249444e4b26ea998a526838238f8994c8f274befc1f94dacfb43/yarl-1.15.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:75119badf45f7183e10e348edff5a76a94dc19ba9287d94001ff05e81475967b", size = 330977, upload-time = "2024-10-13T18:46:28.921Z" }, + { url = "https://files.pythonhosted.org/packages/dd/ba/b1fed73f9d39e3e7be8f6786be5a2ab4399c21504c9168c3cadf6e441c2e/yarl-1.15.2-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:78e6fdc976ec966b99e4daa3812fac0274cc28cd2b24b0d92462e2e5ef90d368", size = 317402, upload-time = "2024-10-13T18:46:30.86Z" }, + { url = "https://files.pythonhosted.org/packages/82/e8/03e3ebb7f558374f29c04868b20ca484d7997f80a0a191490790a8c28058/yarl-1.15.2-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:8657d3f37f781d987037f9cc20bbc8b40425fa14380c87da0cb8dfce7c92d0fb", size = 331776, upload-time = "2024-10-13T18:46:33.037Z" }, + { url = "https://files.pythonhosted.org/packages/1f/83/90b0f4fd1ecf2602ba4ac50ad0bbc463122208f52dd13f152bbc0d8417dd/yarl-1.15.2-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:93bed8a8084544c6efe8856c362af08a23e959340c87a95687fdbe9c9f280c8b", size = 331585, upload-time = "2024-10-13T18:46:35.275Z" }, + { url = "https://files.pythonhosted.org/packages/c7/f6/1ed7e7f270ae5f9f1174c1f8597b29658f552fee101c26de8b2eb4ca147a/yarl-1.15.2-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:69d5856d526802cbda768d3e6246cd0d77450fa2a4bc2ea0ea14f0d972c2894b", size = 336395, upload-time = "2024-10-13T18:46:38.003Z" }, + { url = "https://files.pythonhosted.org/packages/e0/3a/4354ed8812909d9ec54a92716a53259b09e6b664209231f2ec5e75f4820d/yarl-1.15.2-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:ccad2800dfdff34392448c4bf834be124f10a5bc102f254521d931c1c53c455a", size = 342810, upload-time = "2024-10-13T18:46:39.952Z" }, + { url = "https://files.pythonhosted.org/packages/de/cc/39e55e16b1415a87f6d300064965d6cfb2ac8571e11339ccb7dada2444d9/yarl-1.15.2-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:a880372e2e5dbb9258a4e8ff43f13888039abb9dd6d515f28611c54361bc5644", size = 351441, upload-time = "2024-10-13T18:46:41.867Z" }, + { url = "https://files.pythonhosted.org/packages/fb/19/5cd4757079dc9d9f3de3e3831719b695f709a8ce029e70b33350c9d082a7/yarl-1.15.2-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:c998d0558805860503bc3a595994895ca0f7835e00668dadc673bbf7f5fbfcbe", size = 345875, upload-time = "2024-10-13T18:46:43.824Z" }, + { url = "https://files.pythonhosted.org/packages/83/a0/ef09b54634f73417f1ea4a746456a4372c1b044f07b26e16fa241bd2d94e/yarl-1.15.2-cp313-cp313-win32.whl", hash = "sha256:533a28754e7f7439f217550a497bb026c54072dbe16402b183fdbca2431935a9", size = 302609, upload-time = "2024-10-13T18:46:45.828Z" }, + { url = "https://files.pythonhosted.org/packages/20/9f/f39c37c17929d3975da84c737b96b606b68c495cc4ee86408f10523a1635/yarl-1.15.2-cp313-cp313-win_amd64.whl", hash = "sha256:5838f2b79dc8f96fdc44077c9e4e2e33d7089b10788464609df788eb97d03aad", size = 308252, upload-time = "2024-10-13T18:46:48.042Z" }, + { url = "https://files.pythonhosted.org/packages/7b/1f/544439ce6b7a498327d57ff40f0cd4f24bf4b1c1daf76c8c962dca022e71/yarl-1.15.2-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:fbbb63bed5fcd70cd3dd23a087cd78e4675fb5a2963b8af53f945cbbca79ae16", size = 138555, upload-time = "2024-10-13T18:46:50.448Z" }, + { url = "https://files.pythonhosted.org/packages/e8/b7/d6f33e7a42832f1e8476d0aabe089be0586a9110b5dfc2cef93444dc7c21/yarl-1.15.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:e2e93b88ecc8f74074012e18d679fb2e9c746f2a56f79cd5e2b1afcf2a8a786b", size = 89844, upload-time = "2024-10-13T18:46:52.297Z" }, + { url = "https://files.pythonhosted.org/packages/93/34/ede8d8ed7350b4b21e33fc4eff71e08de31da697034969b41190132d421f/yarl-1.15.2-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:af8ff8d7dc07ce873f643de6dfbcd45dc3db2c87462e5c387267197f59e6d776", size = 87671, upload-time = "2024-10-13T18:46:54.104Z" }, + { url = "https://files.pythonhosted.org/packages/fa/51/6d71e92bc54b5788b18f3dc29806f9ce37e12b7c610e8073357717f34b78/yarl-1.15.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:66f629632220a4e7858b58e4857927dd01a850a4cef2fb4044c8662787165cf7", size = 314558, upload-time = "2024-10-13T18:46:55.885Z" }, + { url = "https://files.pythonhosted.org/packages/76/0a/f9ffe503b4ef77cd77c9eefd37717c092e26f2c2dbbdd45700f864831292/yarl-1.15.2-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:833547179c31f9bec39b49601d282d6f0ea1633620701288934c5f66d88c3e50", size = 327622, upload-time = "2024-10-13T18:46:58.173Z" }, + { url = "https://files.pythonhosted.org/packages/8b/38/8eb602eeb153de0189d572dce4ed81b9b14f71de7c027d330b601b4fdcdc/yarl-1.15.2-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2aa738e0282be54eede1e3f36b81f1e46aee7ec7602aa563e81e0e8d7b67963f", size = 324447, upload-time = "2024-10-13T18:47:00.263Z" }, + { url = "https://files.pythonhosted.org/packages/c2/1e/1c78c695a4c7b957b5665e46a89ea35df48511dbed301a05c0a8beed0cc3/yarl-1.15.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9a13a07532e8e1c4a5a3afff0ca4553da23409fad65def1b71186fb867eeae8d", size = 319009, upload-time = "2024-10-13T18:47:02.417Z" }, + { url = "https://files.pythonhosted.org/packages/06/a0/7ea93de4ca1991e7f92a8901dcd1585165f547d342f7c6f36f1ea58b75de/yarl-1.15.2-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c45817e3e6972109d1a2c65091504a537e257bc3c885b4e78a95baa96df6a3f8", size = 307760, upload-time = "2024-10-13T18:47:04.553Z" }, + { url = "https://files.pythonhosted.org/packages/f4/b4/ceaa1f35cfb37fe06af3f7404438abf9a1262dc5df74dba37c90b0615e06/yarl-1.15.2-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:670eb11325ed3a6209339974b276811867defe52f4188fe18dc49855774fa9cf", size = 315038, upload-time = "2024-10-13T18:47:06.482Z" }, + { url = "https://files.pythonhosted.org/packages/da/45/a2ca2b547c56550eefc39e45d61e4b42ae6dbb3e913810b5a0eb53e86412/yarl-1.15.2-cp38-cp38-musllinux_1_2_armv7l.whl", hash = "sha256:d417a4f6943112fae3924bae2af7112562285848d9bcee737fc4ff7cbd450e6c", size = 312898, upload-time = "2024-10-13T18:47:09.291Z" }, + { url = "https://files.pythonhosted.org/packages/ea/e0/f692ba36dedc5b0b22084bba558a7ede053841e247b7dd2adbb9d40450be/yarl-1.15.2-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:bc8936d06cd53fddd4892677d65e98af514c8d78c79864f418bbf78a4a2edde4", size = 319370, upload-time = "2024-10-13T18:47:11.647Z" }, + { url = "https://files.pythonhosted.org/packages/b1/3f/0e382caf39958be6ae61d4bb0c82a68a3c45a494fc8cdc6f55c29757970e/yarl-1.15.2-cp38-cp38-musllinux_1_2_ppc64le.whl", hash = "sha256:954dde77c404084c2544e572f342aef384240b3e434e06cecc71597e95fd1ce7", size = 332429, upload-time = "2024-10-13T18:47:13.88Z" }, + { url = "https://files.pythonhosted.org/packages/21/6b/c824a4a1c45d67b15b431d4ab83b63462bfcbc710065902e10fa5c2ffd9e/yarl-1.15.2-cp38-cp38-musllinux_1_2_s390x.whl", hash = "sha256:5bc0df728e4def5e15a754521e8882ba5a5121bd6b5a3a0ff7efda5d6558ab3d", size = 333143, upload-time = "2024-10-13T18:47:16.141Z" }, + { url = "https://files.pythonhosted.org/packages/20/76/8af2a1d93fe95b04e284b5d55daaad33aae6e2f6254a1bcdb40e2752af6c/yarl-1.15.2-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:b71862a652f50babab4a43a487f157d26b464b1dedbcc0afda02fd64f3809d04", size = 326687, upload-time = "2024-10-13T18:47:18.179Z" }, + { url = "https://files.pythonhosted.org/packages/1c/53/490830773f907ef8a311cc5d82e5830f75f7692c1adacbdb731d3f1246fd/yarl-1.15.2-cp38-cp38-win32.whl", hash = "sha256:63eab904f8630aed5a68f2d0aeab565dcfc595dc1bf0b91b71d9ddd43dea3aea", size = 78705, upload-time = "2024-10-13T18:47:20.876Z" }, + { url = "https://files.pythonhosted.org/packages/9c/9d/d944e897abf37f50f4fa2d8d6f5fd0ed9413bc8327d3b4cc25ba9694e1ba/yarl-1.15.2-cp38-cp38-win_amd64.whl", hash = "sha256:2cf441c4b6e538ba0d2591574f95d3fdd33f1efafa864faa077d9636ecc0c4e9", size = 84998, upload-time = "2024-10-13T18:47:23.301Z" }, + { url = "https://files.pythonhosted.org/packages/91/1c/1c9d08c29b10499348eedc038cf61b6d96d5ba0e0d69438975845939ed3c/yarl-1.15.2-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:a32d58f4b521bb98b2c0aa9da407f8bd57ca81f34362bcb090e4a79e9924fefc", size = 138011, upload-time = "2024-10-13T18:47:25.002Z" }, + { url = "https://files.pythonhosted.org/packages/d4/33/2d4a1418bae6d7883c1fcc493be7b6d6fe015919835adc9e8eeba472e9f7/yarl-1.15.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:766dcc00b943c089349d4060b935c76281f6be225e39994c2ccec3a2a36ad627", size = 89618, upload-time = "2024-10-13T18:47:27.587Z" }, + { url = "https://files.pythonhosted.org/packages/78/2e/0024c674a376cfdc722a167a8f308f5779aca615cb7a28d67fbeabf3f697/yarl-1.15.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:bed1b5dbf90bad3bfc19439258c97873eab453c71d8b6869c136346acfe497e7", size = 87347, upload-time = "2024-10-13T18:47:29.671Z" }, + { url = "https://files.pythonhosted.org/packages/c5/08/a01874dabd4ddf475c5c2adc86f7ac329f83a361ee513a97841720ab7b24/yarl-1.15.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ed20a4bdc635f36cb19e630bfc644181dd075839b6fc84cac51c0f381ac472e2", size = 310438, upload-time = "2024-10-13T18:47:31.577Z" }, + { url = "https://files.pythonhosted.org/packages/09/95/691bc6de2c1b0e9c8bbaa5f8f38118d16896ba1a069a09d1fb073d41a093/yarl-1.15.2-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d538df442c0d9665664ab6dd5fccd0110fa3b364914f9c85b3ef9b7b2e157980", size = 325384, upload-time = "2024-10-13T18:47:33.587Z" }, + { url = "https://files.pythonhosted.org/packages/95/fd/fee11eb3337f48c62d39c5676e6a0e4e318e318900a901b609a3c45394df/yarl-1.15.2-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:28c6cf1d92edf936ceedc7afa61b07e9d78a27b15244aa46bbcd534c7458ee1b", size = 321820, upload-time = "2024-10-13T18:47:35.633Z" }, + { url = "https://files.pythonhosted.org/packages/7a/ad/4a2c9bbebaefdce4a69899132f4bf086abbddb738dc6e794a31193bc0854/yarl-1.15.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ce44217ad99ffad8027d2fde0269ae368c86db66ea0571c62a000798d69401fb", size = 314150, upload-time = "2024-10-13T18:47:37.693Z" }, + { url = "https://files.pythonhosted.org/packages/38/7d/552c37bc6c4ae8ea900e44b6c05cb16d50dca72d3782ccd66f53e27e353f/yarl-1.15.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b47a6000a7e833ebfe5886b56a31cb2ff12120b1efd4578a6fcc38df16cc77bd", size = 304202, upload-time = "2024-10-13T18:47:40.411Z" }, + { url = "https://files.pythonhosted.org/packages/2e/f8/c22a158f3337f49775775ecef43fc097a98b20cdce37425b68b9c45a6f94/yarl-1.15.2-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:e52f77a0cd246086afde8815039f3e16f8d2be51786c0a39b57104c563c5cbb0", size = 310311, upload-time = "2024-10-13T18:47:43.236Z" }, + { url = "https://files.pythonhosted.org/packages/ce/e4/ebce06afa25c2a6c8e6c9a5915cbbc7940a37f3ec38e950e8f346ca908da/yarl-1.15.2-cp39-cp39-musllinux_1_2_armv7l.whl", hash = "sha256:f9ca0e6ce7774dc7830dc0cc4bb6b3eec769db667f230e7c770a628c1aa5681b", size = 310645, upload-time = "2024-10-13T18:47:45.24Z" }, + { url = "https://files.pythonhosted.org/packages/0a/34/5504cc8fbd1be959ec0a1e9e9f471fd438c37cb877b0178ce09085b36b51/yarl-1.15.2-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:136f9db0f53c0206db38b8cd0c985c78ded5fd596c9a86ce5c0b92afb91c3a19", size = 313328, upload-time = "2024-10-13T18:47:47.546Z" }, + { url = "https://files.pythonhosted.org/packages/cf/e4/fb3f91a539c6505e347d7d75bc675d291228960ffd6481ced76a15412924/yarl-1.15.2-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:173866d9f7409c0fb514cf6e78952e65816600cb888c68b37b41147349fe0057", size = 330135, upload-time = "2024-10-13T18:47:50.279Z" }, + { url = "https://files.pythonhosted.org/packages/e1/08/a0b27db813f0159e1c8a45f48852afded501de2f527e7613c4dcf436ecf7/yarl-1.15.2-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:6e840553c9c494a35e449a987ca2c4f8372668ee954a03a9a9685075228e5036", size = 327155, upload-time = "2024-10-13T18:47:52.337Z" }, + { url = "https://files.pythonhosted.org/packages/97/4e/b3414dded12d0e2b52eb1964c21a8d8b68495b320004807de770f7b6b53a/yarl-1.15.2-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:458c0c65802d816a6b955cf3603186de79e8fdb46d4f19abaec4ef0a906f50a7", size = 320810, upload-time = "2024-10-13T18:47:55.067Z" }, + { url = "https://files.pythonhosted.org/packages/bb/ca/e5149c55d1c9dcf3d5b48acd7c71ca8622fd2f61322d0386fe63ba106774/yarl-1.15.2-cp39-cp39-win32.whl", hash = "sha256:5b48388ded01f6f2429a8c55012bdbd1c2a0c3735b3e73e221649e524c34a58d", size = 78686, upload-time = "2024-10-13T18:47:57Z" }, + { url = "https://files.pythonhosted.org/packages/b1/87/f56a80a1abaf65dbf138b821357b51b6cc061756bb7d93f08797950b3881/yarl-1.15.2-cp39-cp39-win_amd64.whl", hash = "sha256:81dadafb3aa124f86dc267a2168f71bbd2bfb163663661ab0038f6e4b8edb810", size = 84818, upload-time = "2024-10-13T18:47:58.76Z" }, + { url = "https://files.pythonhosted.org/packages/46/cf/a28c494decc9c8776b0d7b729c68d26fdafefcedd8d2eab5d9cd767376b2/yarl-1.15.2-py3-none-any.whl", hash = "sha256:0d3105efab7c5c091609abacad33afff33bdff0035bece164c98bcf5a85ef90a", size = 38891, upload-time = "2024-10-13T18:48:00.883Z" }, +] + +[[package]] +name = "yarl" +version = "1.22.0" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version >= '3.14'", + "python_full_version >= '3.11' and python_full_version < '3.14'", + "python_full_version == '3.10.*'", + "python_full_version == '3.9.*'", +] +dependencies = [ + { name = "idna", marker = "python_full_version >= '3.9'" }, + { name = "multidict", version = "6.7.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.9'" }, + { name = "propcache", version = "0.4.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.9'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/57/63/0c6ebca57330cd313f6102b16dd57ffaf3ec4c83403dcb45dbd15c6f3ea1/yarl-1.22.0.tar.gz", hash = "sha256:bebf8557577d4401ba8bd9ff33906f1376c877aa78d1fe216ad01b4d6745af71", size = 187169, upload-time = "2025-10-06T14:12:55.963Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/d1/43/a2204825342f37c337f5edb6637040fa14e365b2fcc2346960201d457579/yarl-1.22.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:c7bd6683587567e5a49ee6e336e0612bec8329be1b7d4c8af5687dcdeb67ee1e", size = 140517, upload-time = "2025-10-06T14:08:42.494Z" }, + { url = "https://files.pythonhosted.org/packages/44/6f/674f3e6f02266428c56f704cd2501c22f78e8b2eeb23f153117cc86fb28a/yarl-1.22.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:5cdac20da754f3a723cceea5b3448e1a2074866406adeb4ef35b469d089adb8f", size = 93495, upload-time = "2025-10-06T14:08:46.2Z" }, + { url = "https://files.pythonhosted.org/packages/b8/12/5b274d8a0f30c07b91b2f02cba69152600b47830fcfb465c108880fcee9c/yarl-1.22.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:07a524d84df0c10f41e3ee918846e1974aba4ec017f990dc735aad487a0bdfdf", size = 94400, upload-time = "2025-10-06T14:08:47.855Z" }, + { url = "https://files.pythonhosted.org/packages/e2/7f/df1b6949b1fa1aa9ff6de6e2631876ad4b73c4437822026e85d8acb56bb1/yarl-1.22.0-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:e1b329cb8146d7b736677a2440e422eadd775d1806a81db2d4cded80a48efc1a", size = 347545, upload-time = "2025-10-06T14:08:49.683Z" }, + { url = "https://files.pythonhosted.org/packages/84/09/f92ed93bd6cd77872ab6c3462df45ca45cd058d8f1d0c9b4f54c1704429f/yarl-1.22.0-cp310-cp310-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:75976c6945d85dbb9ee6308cd7ff7b1fb9409380c82d6119bd778d8fcfe2931c", size = 319598, upload-time = "2025-10-06T14:08:51.215Z" }, + { url = "https://files.pythonhosted.org/packages/c3/97/ac3f3feae7d522cf7ccec3d340bb0b2b61c56cb9767923df62a135092c6b/yarl-1.22.0-cp310-cp310-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:80ddf7a5f8c86cb3eb4bc9028b07bbbf1f08a96c5c0bc1244be5e8fefcb94147", size = 363893, upload-time = "2025-10-06T14:08:53.144Z" }, + { url = "https://files.pythonhosted.org/packages/06/49/f3219097403b9c84a4d079b1d7bda62dd9b86d0d6e4428c02d46ab2c77fc/yarl-1.22.0-cp310-cp310-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:d332fc2e3c94dad927f2112395772a4e4fedbcf8f80efc21ed7cdfae4d574fdb", size = 371240, upload-time = "2025-10-06T14:08:55.036Z" }, + { url = "https://files.pythonhosted.org/packages/35/9f/06b765d45c0e44e8ecf0fe15c9eacbbde342bb5b7561c46944f107bfb6c3/yarl-1.22.0-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:0cf71bf877efeac18b38d3930594c0948c82b64547c1cf420ba48722fe5509f6", size = 346965, upload-time = "2025-10-06T14:08:56.722Z" }, + { url = "https://files.pythonhosted.org/packages/c5/69/599e7cea8d0fcb1694323b0db0dda317fa3162f7b90166faddecf532166f/yarl-1.22.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:663e1cadaddae26be034a6ab6072449a8426ddb03d500f43daf952b74553bba0", size = 342026, upload-time = "2025-10-06T14:08:58.563Z" }, + { url = "https://files.pythonhosted.org/packages/95/6f/9dfd12c8bc90fea9eab39832ee32ea48f8e53d1256252a77b710c065c89f/yarl-1.22.0-cp310-cp310-musllinux_1_2_armv7l.whl", hash = "sha256:6dcbb0829c671f305be48a7227918cfcd11276c2d637a8033a99a02b67bf9eda", size = 335637, upload-time = "2025-10-06T14:09:00.506Z" }, + { url = "https://files.pythonhosted.org/packages/57/2e/34c5b4eb9b07e16e873db5b182c71e5f06f9b5af388cdaa97736d79dd9a6/yarl-1.22.0-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:f0d97c18dfd9a9af4490631905a3f131a8e4c9e80a39353919e2cfed8f00aedc", size = 359082, upload-time = "2025-10-06T14:09:01.936Z" }, + { url = "https://files.pythonhosted.org/packages/31/71/fa7e10fb772d273aa1f096ecb8ab8594117822f683bab7d2c5a89914c92a/yarl-1.22.0-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:437840083abe022c978470b942ff832c3940b2ad3734d424b7eaffcd07f76737", size = 357811, upload-time = "2025-10-06T14:09:03.445Z" }, + { url = "https://files.pythonhosted.org/packages/26/da/11374c04e8e1184a6a03cf9c8f5688d3e5cec83ed6f31ad3481b3207f709/yarl-1.22.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:a899cbd98dce6f5d8de1aad31cb712ec0a530abc0a86bd6edaa47c1090138467", size = 351223, upload-time = "2025-10-06T14:09:05.401Z" }, + { url = "https://files.pythonhosted.org/packages/82/8f/e2d01f161b0c034a30410e375e191a5d27608c1f8693bab1a08b089ca096/yarl-1.22.0-cp310-cp310-win32.whl", hash = "sha256:595697f68bd1f0c1c159fcb97b661fc9c3f5db46498043555d04805430e79bea", size = 82118, upload-time = "2025-10-06T14:09:11.148Z" }, + { url = "https://files.pythonhosted.org/packages/62/46/94c76196642dbeae634c7a61ba3da88cd77bed875bf6e4a8bed037505aa6/yarl-1.22.0-cp310-cp310-win_amd64.whl", hash = "sha256:cb95a9b1adaa48e41815a55ae740cfda005758104049a640a398120bf02515ca", size = 86852, upload-time = "2025-10-06T14:09:12.958Z" }, + { url = "https://files.pythonhosted.org/packages/af/af/7df4f179d3b1a6dcb9a4bd2ffbc67642746fcafdb62580e66876ce83fff4/yarl-1.22.0-cp310-cp310-win_arm64.whl", hash = "sha256:b85b982afde6df99ecc996990d4ad7ccbdbb70e2a4ba4de0aecde5922ba98a0b", size = 82012, upload-time = "2025-10-06T14:09:14.664Z" }, + { url = "https://files.pythonhosted.org/packages/4d/27/5ab13fc84c76a0250afd3d26d5936349a35be56ce5785447d6c423b26d92/yarl-1.22.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:1ab72135b1f2db3fed3997d7e7dc1b80573c67138023852b6efb336a5eae6511", size = 141607, upload-time = "2025-10-06T14:09:16.298Z" }, + { url = "https://files.pythonhosted.org/packages/6a/a1/d065d51d02dc02ce81501d476b9ed2229d9a990818332242a882d5d60340/yarl-1.22.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:669930400e375570189492dc8d8341301578e8493aec04aebc20d4717f899dd6", size = 94027, upload-time = "2025-10-06T14:09:17.786Z" }, + { url = "https://files.pythonhosted.org/packages/c1/da/8da9f6a53f67b5106ffe902c6fa0164e10398d4e150d85838b82f424072a/yarl-1.22.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:792a2af6d58177ef7c19cbf0097aba92ca1b9cb3ffdd9c7470e156c8f9b5e028", size = 94963, upload-time = "2025-10-06T14:09:19.662Z" }, + { url = "https://files.pythonhosted.org/packages/68/fe/2c1f674960c376e29cb0bec1249b117d11738db92a6ccc4a530b972648db/yarl-1.22.0-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:3ea66b1c11c9150f1372f69afb6b8116f2dd7286f38e14ea71a44eee9ec51b9d", size = 368406, upload-time = "2025-10-06T14:09:21.402Z" }, + { url = "https://files.pythonhosted.org/packages/95/26/812a540e1c3c6418fec60e9bbd38e871eaba9545e94fa5eff8f4a8e28e1e/yarl-1.22.0-cp311-cp311-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:3e2daa88dc91870215961e96a039ec73e4937da13cf77ce17f9cad0c18df3503", size = 336581, upload-time = "2025-10-06T14:09:22.98Z" }, + { url = "https://files.pythonhosted.org/packages/0b/f5/5777b19e26fdf98563985e481f8be3d8a39f8734147a6ebf459d0dab5a6b/yarl-1.22.0-cp311-cp311-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:ba440ae430c00eee41509353628600212112cd5018d5def7e9b05ea7ac34eb65", size = 388924, upload-time = "2025-10-06T14:09:24.655Z" }, + { url = "https://files.pythonhosted.org/packages/86/08/24bd2477bd59c0bbd994fe1d93b126e0472e4e3df5a96a277b0a55309e89/yarl-1.22.0-cp311-cp311-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:e6438cc8f23a9c1478633d216b16104a586b9761db62bfacb6425bac0a36679e", size = 392890, upload-time = "2025-10-06T14:09:26.617Z" }, + { url = "https://files.pythonhosted.org/packages/46/00/71b90ed48e895667ecfb1eaab27c1523ee2fa217433ed77a73b13205ca4b/yarl-1.22.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:4c52a6e78aef5cf47a98ef8e934755abf53953379b7d53e68b15ff4420e6683d", size = 365819, upload-time = "2025-10-06T14:09:28.544Z" }, + { url = "https://files.pythonhosted.org/packages/30/2d/f715501cae832651d3282387c6a9236cd26bd00d0ff1e404b3dc52447884/yarl-1.22.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:3b06bcadaac49c70f4c88af4ffcfbe3dc155aab3163e75777818092478bcbbe7", size = 363601, upload-time = "2025-10-06T14:09:30.568Z" }, + { url = "https://files.pythonhosted.org/packages/f8/f9/a678c992d78e394e7126ee0b0e4e71bd2775e4334d00a9278c06a6cce96a/yarl-1.22.0-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:6944b2dc72c4d7f7052683487e3677456050ff77fcf5e6204e98caf785ad1967", size = 358072, upload-time = "2025-10-06T14:09:32.528Z" }, + { url = "https://files.pythonhosted.org/packages/2c/d1/b49454411a60edb6fefdcad4f8e6dbba7d8019e3a508a1c5836cba6d0781/yarl-1.22.0-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:d5372ca1df0f91a86b047d1277c2aaf1edb32d78bbcefffc81b40ffd18f027ed", size = 385311, upload-time = "2025-10-06T14:09:34.634Z" }, + { url = "https://files.pythonhosted.org/packages/87/e5/40d7a94debb8448c7771a916d1861d6609dddf7958dc381117e7ba36d9e8/yarl-1.22.0-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:51af598701f5299012b8416486b40fceef8c26fc87dc6d7d1f6fc30609ea0aa6", size = 381094, upload-time = "2025-10-06T14:09:36.268Z" }, + { url = "https://files.pythonhosted.org/packages/35/d8/611cc282502381ad855448643e1ad0538957fc82ae83dfe7762c14069e14/yarl-1.22.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:b266bd01fedeffeeac01a79ae181719ff848a5a13ce10075adbefc8f1daee70e", size = 370944, upload-time = "2025-10-06T14:09:37.872Z" }, + { url = "https://files.pythonhosted.org/packages/2d/df/fadd00fb1c90e1a5a8bd731fa3d3de2e165e5a3666a095b04e31b04d9cb6/yarl-1.22.0-cp311-cp311-win32.whl", hash = "sha256:a9b1ba5610a4e20f655258d5a1fdc7ebe3d837bb0e45b581398b99eb98b1f5ca", size = 81804, upload-time = "2025-10-06T14:09:39.359Z" }, + { url = "https://files.pythonhosted.org/packages/b5/f7/149bb6f45f267cb5c074ac40c01c6b3ea6d8a620d34b337f6321928a1b4d/yarl-1.22.0-cp311-cp311-win_amd64.whl", hash = "sha256:078278b9b0b11568937d9509b589ee83ef98ed6d561dfe2020e24a9fd08eaa2b", size = 86858, upload-time = "2025-10-06T14:09:41.068Z" }, + { url = "https://files.pythonhosted.org/packages/2b/13/88b78b93ad3f2f0b78e13bfaaa24d11cbc746e93fe76d8c06bf139615646/yarl-1.22.0-cp311-cp311-win_arm64.whl", hash = "sha256:b6a6f620cfe13ccec221fa312139135166e47ae169f8253f72a0abc0dae94376", size = 81637, upload-time = "2025-10-06T14:09:42.712Z" }, + { url = "https://files.pythonhosted.org/packages/75/ff/46736024fee3429b80a165a732e38e5d5a238721e634ab41b040d49f8738/yarl-1.22.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:e340382d1afa5d32b892b3ff062436d592ec3d692aeea3bef3a5cfe11bbf8c6f", size = 142000, upload-time = "2025-10-06T14:09:44.631Z" }, + { url = "https://files.pythonhosted.org/packages/5a/9a/b312ed670df903145598914770eb12de1bac44599549b3360acc96878df8/yarl-1.22.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:f1e09112a2c31ffe8d80be1b0988fa6a18c5d5cad92a9ffbb1c04c91bfe52ad2", size = 94338, upload-time = "2025-10-06T14:09:46.372Z" }, + { url = "https://files.pythonhosted.org/packages/ba/f5/0601483296f09c3c65e303d60c070a5c19fcdbc72daa061e96170785bc7d/yarl-1.22.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:939fe60db294c786f6b7c2d2e121576628468f65453d86b0fe36cb52f987bd74", size = 94909, upload-time = "2025-10-06T14:09:48.648Z" }, + { url = "https://files.pythonhosted.org/packages/60/41/9a1fe0b73dbcefce72e46cf149b0e0a67612d60bfc90fb59c2b2efdfbd86/yarl-1.22.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:e1651bf8e0398574646744c1885a41198eba53dc8a9312b954073f845c90a8df", size = 372940, upload-time = "2025-10-06T14:09:50.089Z" }, + { url = "https://files.pythonhosted.org/packages/17/7a/795cb6dfee561961c30b800f0ed616b923a2ec6258b5def2a00bf8231334/yarl-1.22.0-cp312-cp312-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:b8a0588521a26bf92a57a1705b77b8b59044cdceccac7151bd8d229e66b8dedb", size = 345825, upload-time = "2025-10-06T14:09:52.142Z" }, + { url = "https://files.pythonhosted.org/packages/d7/93/a58f4d596d2be2ae7bab1a5846c4d270b894958845753b2c606d666744d3/yarl-1.22.0-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:42188e6a615c1a75bcaa6e150c3fe8f3e8680471a6b10150c5f7e83f47cc34d2", size = 386705, upload-time = "2025-10-06T14:09:54.128Z" }, + { url = "https://files.pythonhosted.org/packages/61/92/682279d0e099d0e14d7fd2e176bd04f48de1484f56546a3e1313cd6c8e7c/yarl-1.22.0-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:f6d2cb59377d99718913ad9a151030d6f83ef420a2b8f521d94609ecc106ee82", size = 396518, upload-time = "2025-10-06T14:09:55.762Z" }, + { url = "https://files.pythonhosted.org/packages/db/0f/0d52c98b8a885aeda831224b78f3be7ec2e1aa4a62091f9f9188c3c65b56/yarl-1.22.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:50678a3b71c751d58d7908edc96d332af328839eea883bb554a43f539101277a", size = 377267, upload-time = "2025-10-06T14:09:57.958Z" }, + { url = "https://files.pythonhosted.org/packages/22/42/d2685e35908cbeaa6532c1fc73e89e7f2efb5d8a7df3959ea8e37177c5a3/yarl-1.22.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:1e8fbaa7cec507aa24ea27a01456e8dd4b6fab829059b69844bd348f2d467124", size = 365797, upload-time = "2025-10-06T14:09:59.527Z" }, + { url = "https://files.pythonhosted.org/packages/a2/83/cf8c7bcc6355631762f7d8bdab920ad09b82efa6b722999dfb05afa6cfac/yarl-1.22.0-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:433885ab5431bc3d3d4f2f9bd15bfa1614c522b0f1405d62c4f926ccd69d04fa", size = 365535, upload-time = "2025-10-06T14:10:01.139Z" }, + { url = "https://files.pythonhosted.org/packages/25/e1/5302ff9b28f0c59cac913b91fe3f16c59a033887e57ce9ca5d41a3a94737/yarl-1.22.0-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:b790b39c7e9a4192dc2e201a282109ed2985a1ddbd5ac08dc56d0e121400a8f7", size = 382324, upload-time = "2025-10-06T14:10:02.756Z" }, + { url = "https://files.pythonhosted.org/packages/bf/cd/4617eb60f032f19ae3a688dc990d8f0d89ee0ea378b61cac81ede3e52fae/yarl-1.22.0-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:31f0b53913220599446872d757257be5898019c85e7971599065bc55065dc99d", size = 383803, upload-time = "2025-10-06T14:10:04.552Z" }, + { url = "https://files.pythonhosted.org/packages/59/65/afc6e62bb506a319ea67b694551dab4a7e6fb7bf604e9bd9f3e11d575fec/yarl-1.22.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:a49370e8f711daec68d09b821a34e1167792ee2d24d405cbc2387be4f158b520", size = 374220, upload-time = "2025-10-06T14:10:06.489Z" }, + { url = "https://files.pythonhosted.org/packages/e7/3d/68bf18d50dc674b942daec86a9ba922d3113d8399b0e52b9897530442da2/yarl-1.22.0-cp312-cp312-win32.whl", hash = "sha256:70dfd4f241c04bd9239d53b17f11e6ab672b9f1420364af63e8531198e3f5fe8", size = 81589, upload-time = "2025-10-06T14:10:09.254Z" }, + { url = "https://files.pythonhosted.org/packages/c8/9a/6ad1a9b37c2f72874f93e691b2e7ecb6137fb2b899983125db4204e47575/yarl-1.22.0-cp312-cp312-win_amd64.whl", hash = "sha256:8884d8b332a5e9b88e23f60bb166890009429391864c685e17bd73a9eda9105c", size = 87213, upload-time = "2025-10-06T14:10:11.369Z" }, + { url = "https://files.pythonhosted.org/packages/44/c5/c21b562d1680a77634d748e30c653c3ca918beb35555cff24986fff54598/yarl-1.22.0-cp312-cp312-win_arm64.whl", hash = "sha256:ea70f61a47f3cc93bdf8b2f368ed359ef02a01ca6393916bc8ff877427181e74", size = 81330, upload-time = "2025-10-06T14:10:13.112Z" }, + { url = "https://files.pythonhosted.org/packages/ea/f3/d67de7260456ee105dc1d162d43a019ecad6b91e2f51809d6cddaa56690e/yarl-1.22.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:8dee9c25c74997f6a750cd317b8ca63545169c098faee42c84aa5e506c819b53", size = 139980, upload-time = "2025-10-06T14:10:14.601Z" }, + { url = "https://files.pythonhosted.org/packages/01/88/04d98af0b47e0ef42597b9b28863b9060bb515524da0a65d5f4db160b2d5/yarl-1.22.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:01e73b85a5434f89fc4fe27dcda2aff08ddf35e4d47bbbea3bdcd25321af538a", size = 93424, upload-time = "2025-10-06T14:10:16.115Z" }, + { url = "https://files.pythonhosted.org/packages/18/91/3274b215fd8442a03975ce6bee5fe6aa57a8326b29b9d3d56234a1dca244/yarl-1.22.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:22965c2af250d20c873cdbee8ff958fb809940aeb2e74ba5f20aaf6b7ac8c70c", size = 93821, upload-time = "2025-10-06T14:10:17.993Z" }, + { url = "https://files.pythonhosted.org/packages/61/3a/caf4e25036db0f2da4ca22a353dfeb3c9d3c95d2761ebe9b14df8fc16eb0/yarl-1.22.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b4f15793aa49793ec8d1c708ab7f9eded1aa72edc5174cae703651555ed1b601", size = 373243, upload-time = "2025-10-06T14:10:19.44Z" }, + { url = "https://files.pythonhosted.org/packages/6e/9e/51a77ac7516e8e7803b06e01f74e78649c24ee1021eca3d6a739cb6ea49c/yarl-1.22.0-cp313-cp313-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:e5542339dcf2747135c5c85f68680353d5cb9ffd741c0f2e8d832d054d41f35a", size = 342361, upload-time = "2025-10-06T14:10:21.124Z" }, + { url = "https://files.pythonhosted.org/packages/d4/f8/33b92454789dde8407f156c00303e9a891f1f51a0330b0fad7c909f87692/yarl-1.22.0-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:5c401e05ad47a75869c3ab3e35137f8468b846770587e70d71e11de797d113df", size = 387036, upload-time = "2025-10-06T14:10:22.902Z" }, + { url = "https://files.pythonhosted.org/packages/d9/9a/c5db84ea024f76838220280f732970aa4ee154015d7f5c1bfb60a267af6f/yarl-1.22.0-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:243dda95d901c733f5b59214d28b0120893d91777cb8aa043e6ef059d3cddfe2", size = 397671, upload-time = "2025-10-06T14:10:24.523Z" }, + { url = "https://files.pythonhosted.org/packages/11/c9/cd8538dc2e7727095e0c1d867bad1e40c98f37763e6d995c1939f5fdc7b1/yarl-1.22.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:bec03d0d388060058f5d291a813f21c011041938a441c593374da6077fe21b1b", size = 377059, upload-time = "2025-10-06T14:10:26.406Z" }, + { url = "https://files.pythonhosted.org/packages/a1/b9/ab437b261702ced75122ed78a876a6dec0a1b0f5e17a4ac7a9a2482d8abe/yarl-1.22.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:b0748275abb8c1e1e09301ee3cf90c8a99678a4e92e4373705f2a2570d581273", size = 365356, upload-time = "2025-10-06T14:10:28.461Z" }, + { url = "https://files.pythonhosted.org/packages/b2/9d/8e1ae6d1d008a9567877b08f0ce4077a29974c04c062dabdb923ed98e6fe/yarl-1.22.0-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:47fdb18187e2a4e18fda2c25c05d8251a9e4a521edaed757fef033e7d8498d9a", size = 361331, upload-time = "2025-10-06T14:10:30.541Z" }, + { url = "https://files.pythonhosted.org/packages/ca/5a/09b7be3905962f145b73beb468cdd53db8aa171cf18c80400a54c5b82846/yarl-1.22.0-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:c7044802eec4524fde550afc28edda0dd5784c4c45f0be151a2d3ba017daca7d", size = 382590, upload-time = "2025-10-06T14:10:33.352Z" }, + { url = "https://files.pythonhosted.org/packages/aa/7f/59ec509abf90eda5048b0bc3e2d7b5099dffdb3e6b127019895ab9d5ef44/yarl-1.22.0-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:139718f35149ff544caba20fce6e8a2f71f1e39b92c700d8438a0b1d2a631a02", size = 385316, upload-time = "2025-10-06T14:10:35.034Z" }, + { url = "https://files.pythonhosted.org/packages/e5/84/891158426bc8036bfdfd862fabd0e0fa25df4176ec793e447f4b85cf1be4/yarl-1.22.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:e1b51bebd221006d3d2f95fbe124b22b247136647ae5dcc8c7acafba66e5ee67", size = 374431, upload-time = "2025-10-06T14:10:37.76Z" }, + { url = "https://files.pythonhosted.org/packages/bb/49/03da1580665baa8bef5e8ed34c6df2c2aca0a2f28bf397ed238cc1bbc6f2/yarl-1.22.0-cp313-cp313-win32.whl", hash = "sha256:d3e32536234a95f513bd374e93d717cf6b2231a791758de6c509e3653f234c95", size = 81555, upload-time = "2025-10-06T14:10:39.649Z" }, + { url = "https://files.pythonhosted.org/packages/9a/ee/450914ae11b419eadd067c6183ae08381cfdfcb9798b90b2b713bbebddda/yarl-1.22.0-cp313-cp313-win_amd64.whl", hash = "sha256:47743b82b76d89a1d20b83e60d5c20314cbd5ba2befc9cda8f28300c4a08ed4d", size = 86965, upload-time = "2025-10-06T14:10:41.313Z" }, + { url = "https://files.pythonhosted.org/packages/98/4d/264a01eae03b6cf629ad69bae94e3b0e5344741e929073678e84bf7a3e3b/yarl-1.22.0-cp313-cp313-win_arm64.whl", hash = "sha256:5d0fcda9608875f7d052eff120c7a5da474a6796fe4d83e152e0e4d42f6d1a9b", size = 81205, upload-time = "2025-10-06T14:10:43.167Z" }, + { url = "https://files.pythonhosted.org/packages/88/fc/6908f062a2f77b5f9f6d69cecb1747260831ff206adcbc5b510aff88df91/yarl-1.22.0-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:719ae08b6972befcba4310e49edb1161a88cdd331e3a694b84466bd938a6ab10", size = 146209, upload-time = "2025-10-06T14:10:44.643Z" }, + { url = "https://files.pythonhosted.org/packages/65/47/76594ae8eab26210b4867be6f49129861ad33da1f1ebdf7051e98492bf62/yarl-1.22.0-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:47d8a5c446df1c4db9d21b49619ffdba90e77c89ec6e283f453856c74b50b9e3", size = 95966, upload-time = "2025-10-06T14:10:46.554Z" }, + { url = "https://files.pythonhosted.org/packages/ab/ce/05e9828a49271ba6b5b038b15b3934e996980dd78abdfeb52a04cfb9467e/yarl-1.22.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:cfebc0ac8333520d2d0423cbbe43ae43c8838862ddb898f5ca68565e395516e9", size = 97312, upload-time = "2025-10-06T14:10:48.007Z" }, + { url = "https://files.pythonhosted.org/packages/d1/c5/7dffad5e4f2265b29c9d7ec869c369e4223166e4f9206fc2243ee9eea727/yarl-1.22.0-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:4398557cbf484207df000309235979c79c4356518fd5c99158c7d38203c4da4f", size = 361967, upload-time = "2025-10-06T14:10:49.997Z" }, + { url = "https://files.pythonhosted.org/packages/50/b2/375b933c93a54bff7fc041e1a6ad2c0f6f733ffb0c6e642ce56ee3b39970/yarl-1.22.0-cp313-cp313t-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:2ca6fd72a8cd803be290d42f2dec5cdcd5299eeb93c2d929bf060ad9efaf5de0", size = 323949, upload-time = "2025-10-06T14:10:52.004Z" }, + { url = "https://files.pythonhosted.org/packages/66/50/bfc2a29a1d78644c5a7220ce2f304f38248dc94124a326794e677634b6cf/yarl-1.22.0-cp313-cp313t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:ca1f59c4e1ab6e72f0a23c13fca5430f889634166be85dbf1013683e49e3278e", size = 361818, upload-time = "2025-10-06T14:10:54.078Z" }, + { url = "https://files.pythonhosted.org/packages/46/96/f3941a46af7d5d0f0498f86d71275696800ddcdd20426298e572b19b91ff/yarl-1.22.0-cp313-cp313t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:6c5010a52015e7c70f86eb967db0f37f3c8bd503a695a49f8d45700144667708", size = 372626, upload-time = "2025-10-06T14:10:55.767Z" }, + { url = "https://files.pythonhosted.org/packages/c1/42/8b27c83bb875cd89448e42cd627e0fb971fa1675c9ec546393d18826cb50/yarl-1.22.0-cp313-cp313t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:9d7672ecf7557476642c88497c2f8d8542f8e36596e928e9bcba0e42e1e7d71f", size = 341129, upload-time = "2025-10-06T14:10:57.985Z" }, + { url = "https://files.pythonhosted.org/packages/49/36/99ca3122201b382a3cf7cc937b95235b0ac944f7e9f2d5331d50821ed352/yarl-1.22.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:3b7c88eeef021579d600e50363e0b6ee4f7f6f728cd3486b9d0f3ee7b946398d", size = 346776, upload-time = "2025-10-06T14:10:59.633Z" }, + { url = "https://files.pythonhosted.org/packages/85/b4/47328bf996acd01a4c16ef9dcd2f59c969f495073616586f78cd5f2efb99/yarl-1.22.0-cp313-cp313t-musllinux_1_2_armv7l.whl", hash = "sha256:f4afb5c34f2c6fecdcc182dfcfc6af6cccf1aa923eed4d6a12e9d96904e1a0d8", size = 334879, upload-time = "2025-10-06T14:11:01.454Z" }, + { url = "https://files.pythonhosted.org/packages/c2/ad/b77d7b3f14a4283bffb8e92c6026496f6de49751c2f97d4352242bba3990/yarl-1.22.0-cp313-cp313t-musllinux_1_2_ppc64le.whl", hash = "sha256:59c189e3e99a59cf8d83cbb31d4db02d66cda5a1a4374e8a012b51255341abf5", size = 350996, upload-time = "2025-10-06T14:11:03.452Z" }, + { url = "https://files.pythonhosted.org/packages/81/c8/06e1d69295792ba54d556f06686cbd6a7ce39c22307100e3fb4a2c0b0a1d/yarl-1.22.0-cp313-cp313t-musllinux_1_2_s390x.whl", hash = "sha256:5a3bf7f62a289fa90f1990422dc8dff5a458469ea71d1624585ec3a4c8d6960f", size = 356047, upload-time = "2025-10-06T14:11:05.115Z" }, + { url = "https://files.pythonhosted.org/packages/4b/b8/4c0e9e9f597074b208d18cef227d83aac36184bfbc6eab204ea55783dbc5/yarl-1.22.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:de6b9a04c606978fdfe72666fa216ffcf2d1a9f6a381058d4378f8d7b1e5de62", size = 342947, upload-time = "2025-10-06T14:11:08.137Z" }, + { url = "https://files.pythonhosted.org/packages/e0/e5/11f140a58bf4c6ad7aca69a892bff0ee638c31bea4206748fc0df4ebcb3a/yarl-1.22.0-cp313-cp313t-win32.whl", hash = "sha256:1834bb90991cc2999f10f97f5f01317f99b143284766d197e43cd5b45eb18d03", size = 86943, upload-time = "2025-10-06T14:11:10.284Z" }, + { url = "https://files.pythonhosted.org/packages/31/74/8b74bae38ed7fe6793d0c15a0c8207bbb819cf287788459e5ed230996cdd/yarl-1.22.0-cp313-cp313t-win_amd64.whl", hash = "sha256:ff86011bd159a9d2dfc89c34cfd8aff12875980e3bd6a39ff097887520e60249", size = 93715, upload-time = "2025-10-06T14:11:11.739Z" }, + { url = "https://files.pythonhosted.org/packages/69/66/991858aa4b5892d57aef7ee1ba6b4d01ec3b7eb3060795d34090a3ca3278/yarl-1.22.0-cp313-cp313t-win_arm64.whl", hash = "sha256:7861058d0582b847bc4e3a4a4c46828a410bca738673f35a29ba3ca5db0b473b", size = 83857, upload-time = "2025-10-06T14:11:13.586Z" }, + { url = "https://files.pythonhosted.org/packages/46/b3/e20ef504049f1a1c54a814b4b9bed96d1ac0e0610c3b4da178f87209db05/yarl-1.22.0-cp314-cp314-macosx_10_13_universal2.whl", hash = "sha256:34b36c2c57124530884d89d50ed2c1478697ad7473efd59cfd479945c95650e4", size = 140520, upload-time = "2025-10-06T14:11:15.465Z" }, + { url = "https://files.pythonhosted.org/packages/e4/04/3532d990fdbab02e5ede063676b5c4260e7f3abea2151099c2aa745acc4c/yarl-1.22.0-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:0dd9a702591ca2e543631c2a017e4a547e38a5c0f29eece37d9097e04a7ac683", size = 93504, upload-time = "2025-10-06T14:11:17.106Z" }, + { url = "https://files.pythonhosted.org/packages/11/63/ff458113c5c2dac9a9719ac68ee7c947cb621432bcf28c9972b1c0e83938/yarl-1.22.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:594fcab1032e2d2cc3321bb2e51271e7cd2b516c7d9aee780ece81b07ff8244b", size = 94282, upload-time = "2025-10-06T14:11:19.064Z" }, + { url = "https://files.pythonhosted.org/packages/a7/bc/315a56aca762d44a6aaaf7ad253f04d996cb6b27bad34410f82d76ea8038/yarl-1.22.0-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:f3d7a87a78d46a2e3d5b72587ac14b4c16952dd0887dbb051451eceac774411e", size = 372080, upload-time = "2025-10-06T14:11:20.996Z" }, + { url = "https://files.pythonhosted.org/packages/3f/3f/08e9b826ec2e099ea6e7c69a61272f4f6da62cb5b1b63590bb80ca2e4a40/yarl-1.22.0-cp314-cp314-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:852863707010316c973162e703bddabec35e8757e67fcb8ad58829de1ebc8590", size = 338696, upload-time = "2025-10-06T14:11:22.847Z" }, + { url = "https://files.pythonhosted.org/packages/e3/9f/90360108e3b32bd76789088e99538febfea24a102380ae73827f62073543/yarl-1.22.0-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:131a085a53bfe839a477c0845acf21efc77457ba2bcf5899618136d64f3303a2", size = 387121, upload-time = "2025-10-06T14:11:24.889Z" }, + { url = "https://files.pythonhosted.org/packages/98/92/ab8d4657bd5b46a38094cfaea498f18bb70ce6b63508fd7e909bd1f93066/yarl-1.22.0-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:078a8aefd263f4d4f923a9677b942b445a2be970ca24548a8102689a3a8ab8da", size = 394080, upload-time = "2025-10-06T14:11:27.307Z" }, + { url = "https://files.pythonhosted.org/packages/f5/e7/d8c5a7752fef68205296201f8ec2bf718f5c805a7a7e9880576c67600658/yarl-1.22.0-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:bca03b91c323036913993ff5c738d0842fc9c60c4648e5c8d98331526df89784", size = 372661, upload-time = "2025-10-06T14:11:29.387Z" }, + { url = "https://files.pythonhosted.org/packages/b6/2e/f4d26183c8db0bb82d491b072f3127fb8c381a6206a3a56332714b79b751/yarl-1.22.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:68986a61557d37bb90d3051a45b91fa3d5c516d177dfc6dd6f2f436a07ff2b6b", size = 364645, upload-time = "2025-10-06T14:11:31.423Z" }, + { url = "https://files.pythonhosted.org/packages/80/7c/428e5812e6b87cd00ee8e898328a62c95825bf37c7fa87f0b6bb2ad31304/yarl-1.22.0-cp314-cp314-musllinux_1_2_armv7l.whl", hash = "sha256:4792b262d585ff0dff6bcb787f8492e40698443ec982a3568c2096433660c694", size = 355361, upload-time = "2025-10-06T14:11:33.055Z" }, + { url = "https://files.pythonhosted.org/packages/ec/2a/249405fd26776f8b13c067378ef4d7dd49c9098d1b6457cdd152a99e96a9/yarl-1.22.0-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:ebd4549b108d732dba1d4ace67614b9545b21ece30937a63a65dd34efa19732d", size = 381451, upload-time = "2025-10-06T14:11:35.136Z" }, + { url = "https://files.pythonhosted.org/packages/67/a8/fb6b1adbe98cf1e2dd9fad71003d3a63a1bc22459c6e15f5714eb9323b93/yarl-1.22.0-cp314-cp314-musllinux_1_2_s390x.whl", hash = "sha256:f87ac53513d22240c7d59203f25cc3beac1e574c6cd681bbfd321987b69f95fd", size = 383814, upload-time = "2025-10-06T14:11:37.094Z" }, + { url = "https://files.pythonhosted.org/packages/d9/f9/3aa2c0e480fb73e872ae2814c43bc1e734740bb0d54e8cb2a95925f98131/yarl-1.22.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:22b029f2881599e2f1b06f8f1db2ee63bd309e2293ba2d566e008ba12778b8da", size = 370799, upload-time = "2025-10-06T14:11:38.83Z" }, + { url = "https://files.pythonhosted.org/packages/50/3c/af9dba3b8b5eeb302f36f16f92791f3ea62e3f47763406abf6d5a4a3333b/yarl-1.22.0-cp314-cp314-win32.whl", hash = "sha256:6a635ea45ba4ea8238463b4f7d0e721bad669f80878b7bfd1f89266e2ae63da2", size = 82990, upload-time = "2025-10-06T14:11:40.624Z" }, + { url = "https://files.pythonhosted.org/packages/ac/30/ac3a0c5bdc1d6efd1b41fa24d4897a4329b3b1e98de9449679dd327af4f0/yarl-1.22.0-cp314-cp314-win_amd64.whl", hash = "sha256:0d6e6885777af0f110b0e5d7e5dda8b704efed3894da26220b7f3d887b839a79", size = 88292, upload-time = "2025-10-06T14:11:42.578Z" }, + { url = "https://files.pythonhosted.org/packages/df/0a/227ab4ff5b998a1b7410abc7b46c9b7a26b0ca9e86c34ba4b8d8bc7c63d5/yarl-1.22.0-cp314-cp314-win_arm64.whl", hash = "sha256:8218f4e98d3c10d683584cb40f0424f4b9fd6e95610232dd75e13743b070ee33", size = 82888, upload-time = "2025-10-06T14:11:44.863Z" }, + { url = "https://files.pythonhosted.org/packages/06/5e/a15eb13db90abd87dfbefb9760c0f3f257ac42a5cac7e75dbc23bed97a9f/yarl-1.22.0-cp314-cp314t-macosx_10_13_universal2.whl", hash = "sha256:45c2842ff0e0d1b35a6bf1cd6c690939dacb617a70827f715232b2e0494d55d1", size = 146223, upload-time = "2025-10-06T14:11:46.796Z" }, + { url = "https://files.pythonhosted.org/packages/18/82/9665c61910d4d84f41a5bf6837597c89e665fa88aa4941080704645932a9/yarl-1.22.0-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:d947071e6ebcf2e2bee8fce76e10faca8f7a14808ca36a910263acaacef08eca", size = 95981, upload-time = "2025-10-06T14:11:48.845Z" }, + { url = "https://files.pythonhosted.org/packages/5d/9a/2f65743589809af4d0a6d3aa749343c4b5f4c380cc24a8e94a3c6625a808/yarl-1.22.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:334b8721303e61b00019474cc103bdac3d7b1f65e91f0bfedeec2d56dfe74b53", size = 97303, upload-time = "2025-10-06T14:11:50.897Z" }, + { url = "https://files.pythonhosted.org/packages/b0/ab/5b13d3e157505c43c3b43b5a776cbf7b24a02bc4cccc40314771197e3508/yarl-1.22.0-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:1e7ce67c34138a058fd092f67d07a72b8e31ff0c9236e751957465a24b28910c", size = 361820, upload-time = "2025-10-06T14:11:52.549Z" }, + { url = "https://files.pythonhosted.org/packages/fb/76/242a5ef4677615cf95330cfc1b4610e78184400699bdda0acb897ef5e49a/yarl-1.22.0-cp314-cp314t-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:d77e1b2c6d04711478cb1c4ab90db07f1609ccf06a287d5607fcd90dc9863acf", size = 323203, upload-time = "2025-10-06T14:11:54.225Z" }, + { url = "https://files.pythonhosted.org/packages/8c/96/475509110d3f0153b43d06164cf4195c64d16999e0c7e2d8a099adcd6907/yarl-1.22.0-cp314-cp314t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:c4647674b6150d2cae088fc07de2738a84b8bcedebef29802cf0b0a82ab6face", size = 363173, upload-time = "2025-10-06T14:11:56.069Z" }, + { url = "https://files.pythonhosted.org/packages/c9/66/59db471aecfbd559a1fd48aedd954435558cd98c7d0da8b03cc6c140a32c/yarl-1.22.0-cp314-cp314t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:efb07073be061c8f79d03d04139a80ba33cbd390ca8f0297aae9cce6411e4c6b", size = 373562, upload-time = "2025-10-06T14:11:58.783Z" }, + { url = "https://files.pythonhosted.org/packages/03/1f/c5d94abc91557384719da10ff166b916107c1b45e4d0423a88457071dd88/yarl-1.22.0-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:e51ac5435758ba97ad69617e13233da53908beccc6cfcd6c34bbed8dcbede486", size = 339828, upload-time = "2025-10-06T14:12:00.686Z" }, + { url = "https://files.pythonhosted.org/packages/5f/97/aa6a143d3afba17b6465733681c70cf175af89f76ec8d9286e08437a7454/yarl-1.22.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:33e32a0dd0c8205efa8e83d04fc9f19313772b78522d1bdc7d9aed706bfd6138", size = 347551, upload-time = "2025-10-06T14:12:02.628Z" }, + { url = "https://files.pythonhosted.org/packages/43/3c/45a2b6d80195959239a7b2a8810506d4eea5487dce61c2a3393e7fc3c52e/yarl-1.22.0-cp314-cp314t-musllinux_1_2_armv7l.whl", hash = "sha256:bf4a21e58b9cde0e401e683ebd00f6ed30a06d14e93f7c8fd059f8b6e8f87b6a", size = 334512, upload-time = "2025-10-06T14:12:04.871Z" }, + { url = "https://files.pythonhosted.org/packages/86/a0/c2ab48d74599c7c84cb104ebd799c5813de252bea0f360ffc29d270c2caa/yarl-1.22.0-cp314-cp314t-musllinux_1_2_ppc64le.whl", hash = "sha256:e4b582bab49ac33c8deb97e058cd67c2c50dac0dd134874106d9c774fd272529", size = 352400, upload-time = "2025-10-06T14:12:06.624Z" }, + { url = "https://files.pythonhosted.org/packages/32/75/f8919b2eafc929567d3d8411f72bdb1a2109c01caaab4ebfa5f8ffadc15b/yarl-1.22.0-cp314-cp314t-musllinux_1_2_s390x.whl", hash = "sha256:0b5bcc1a9c4839e7e30b7b30dd47fe5e7e44fb7054ec29b5bb8d526aa1041093", size = 357140, upload-time = "2025-10-06T14:12:08.362Z" }, + { url = "https://files.pythonhosted.org/packages/cf/72/6a85bba382f22cf78add705d8c3731748397d986e197e53ecc7835e76de7/yarl-1.22.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:c0232bce2170103ec23c454e54a57008a9a72b5d1c3105dc2496750da8cfa47c", size = 341473, upload-time = "2025-10-06T14:12:10.994Z" }, + { url = "https://files.pythonhosted.org/packages/35/18/55e6011f7c044dc80b98893060773cefcfdbf60dfefb8cb2f58b9bacbd83/yarl-1.22.0-cp314-cp314t-win32.whl", hash = "sha256:8009b3173bcd637be650922ac455946197d858b3630b6d8787aa9e5c4564533e", size = 89056, upload-time = "2025-10-06T14:12:13.317Z" }, + { url = "https://files.pythonhosted.org/packages/f9/86/0f0dccb6e59a9e7f122c5afd43568b1d31b8ab7dda5f1b01fb5c7025c9a9/yarl-1.22.0-cp314-cp314t-win_amd64.whl", hash = "sha256:9fb17ea16e972c63d25d4a97f016d235c78dd2344820eb35bc034bc32012ee27", size = 96292, upload-time = "2025-10-06T14:12:15.398Z" }, + { url = "https://files.pythonhosted.org/packages/48/b7/503c98092fb3b344a179579f55814b613c1fbb1c23b3ec14a7b008a66a6e/yarl-1.22.0-cp314-cp314t-win_arm64.whl", hash = "sha256:9f6d73c1436b934e3f01df1e1b21ff765cd1d28c77dfb9ace207f746d4610ee1", size = 85171, upload-time = "2025-10-06T14:12:16.935Z" }, + { url = "https://files.pythonhosted.org/packages/94/fd/6480106702a79bcceda5fd9c63cb19a04a6506bd5ce7fd8d9b63742f0021/yarl-1.22.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:3aa27acb6de7a23785d81557577491f6c38a5209a254d1191519d07d8fe51748", size = 141301, upload-time = "2025-10-06T14:12:19.01Z" }, + { url = "https://files.pythonhosted.org/packages/42/e1/6d95d21b17a93e793e4ec420a925fe1f6a9342338ca7a563ed21129c0990/yarl-1.22.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:af74f05666a5e531289cb1cc9c883d1de2088b8e5b4de48004e5ca8a830ac859", size = 93864, upload-time = "2025-10-06T14:12:21.05Z" }, + { url = "https://files.pythonhosted.org/packages/32/58/b8055273c203968e89808413ea4c984988b6649baabf10f4522e67c22d2f/yarl-1.22.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:62441e55958977b8167b2709c164c91a6363e25da322d87ae6dd9c6019ceecf9", size = 94706, upload-time = "2025-10-06T14:12:23.287Z" }, + { url = "https://files.pythonhosted.org/packages/18/91/d7bfbc28a88c2895ecd0da6a874def0c147de78afc52c773c28e1aa233a3/yarl-1.22.0-cp39-cp39-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b580e71cac3f8113d3135888770903eaf2f507e9421e5697d6ee6d8cd1c7f054", size = 347100, upload-time = "2025-10-06T14:12:28.527Z" }, + { url = "https://files.pythonhosted.org/packages/bd/e8/37a1e7b99721c0564b1fc7b0a4d1f595ef6fb8060d82ca61775b644185f7/yarl-1.22.0-cp39-cp39-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:e81fda2fb4a07eda1a2252b216aa0df23ebcd4d584894e9612e80999a78fd95b", size = 318902, upload-time = "2025-10-06T14:12:30.528Z" }, + { url = "https://files.pythonhosted.org/packages/1c/ef/34724449d7ef2db4f22df644f2dac0b8a275d20f585e526937b3ae47b02d/yarl-1.22.0-cp39-cp39-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:99b6fc1d55782461b78221e95fc357b47ad98b041e8e20f47c1411d0aacddc60", size = 363302, upload-time = "2025-10-06T14:12:32.295Z" }, + { url = "https://files.pythonhosted.org/packages/8a/04/88a39a5dad39889f192cce8d66cc4c58dbeca983e83f9b6bf23822a7ed91/yarl-1.22.0-cp39-cp39-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:088e4e08f033db4be2ccd1f34cf29fe994772fb54cfe004bbf54db320af56890", size = 370816, upload-time = "2025-10-06T14:12:34.01Z" }, + { url = "https://files.pythonhosted.org/packages/6b/1f/5e895e547129413f56c76be2c3ce4b96c797d2d0ff3e16a817d9269b12e6/yarl-1.22.0-cp39-cp39-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:2e4e1f6f0b4da23e61188676e3ed027ef0baa833a2e633c29ff8530800edccba", size = 346465, upload-time = "2025-10-06T14:12:35.977Z" }, + { url = "https://files.pythonhosted.org/packages/11/13/a750e9fd6f9cc9ed3a52a70fe58ffe505322f0efe0d48e1fd9ffe53281f5/yarl-1.22.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:84fc3ec96fce86ce5aa305eb4aa9358279d1aa644b71fab7b8ed33fe3ba1a7ca", size = 341506, upload-time = "2025-10-06T14:12:37.788Z" }, + { url = "https://files.pythonhosted.org/packages/3c/67/bb6024de76e7186611ebe626aec5b71a2d2ecf9453e795f2dbd80614784c/yarl-1.22.0-cp39-cp39-musllinux_1_2_armv7l.whl", hash = "sha256:5dbeefd6ca588b33576a01b0ad58aa934bc1b41ef89dee505bf2932b22ddffba", size = 335030, upload-time = "2025-10-06T14:12:39.775Z" }, + { url = "https://files.pythonhosted.org/packages/a2/be/50b38447fd94a7992996a62b8b463d0579323fcfc08c61bdba949eef8a5d/yarl-1.22.0-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:14291620375b1060613f4aab9ebf21850058b6b1b438f386cc814813d901c60b", size = 358560, upload-time = "2025-10-06T14:12:41.547Z" }, + { url = "https://files.pythonhosted.org/packages/e2/89/c020b6f547578c4e3dbb6335bf918f26e2f34ad0d1e515d72fd33ac0c635/yarl-1.22.0-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:a4fcfc8eb2c34148c118dfa02e6427ca278bfd0f3df7c5f99e33d2c0e81eae3e", size = 357290, upload-time = "2025-10-06T14:12:43.861Z" }, + { url = "https://files.pythonhosted.org/packages/8c/52/c49a619ee35a402fa3a7019a4fa8d26878fec0d1243f6968bbf516789578/yarl-1.22.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:029866bde8d7b0878b9c160e72305bbf0a7342bcd20b9999381704ae03308dc8", size = 350700, upload-time = "2025-10-06T14:12:46.868Z" }, + { url = "https://files.pythonhosted.org/packages/ab/c9/f5042d87777bf6968435f04a2bbb15466b2f142e6e47fa4f34d1a3f32f0c/yarl-1.22.0-cp39-cp39-win32.whl", hash = "sha256:4dcc74149ccc8bba31ce1944acee24813e93cfdee2acda3c172df844948ddf7b", size = 82323, upload-time = "2025-10-06T14:12:48.633Z" }, + { url = "https://files.pythonhosted.org/packages/fd/58/d00f7cad9eba20c4eefac2682f34661d1d1b3a942fc0092eb60e78cfb733/yarl-1.22.0-cp39-cp39-win_amd64.whl", hash = "sha256:10619d9fdee46d20edc49d3479e2f8269d0779f1b031e6f7c2aa1c76be04b7ed", size = 87145, upload-time = "2025-10-06T14:12:50.241Z" }, + { url = "https://files.pythonhosted.org/packages/c2/a3/70904f365080780d38b919edd42d224b8c4ce224a86950d2eaa2a24366ad/yarl-1.22.0-cp39-cp39-win_arm64.whl", hash = "sha256:dd7afd3f8b0bfb4e0d9fc3c31bfe8a4ec7debe124cfd90619305def3c8ca8cd2", size = 82173, upload-time = "2025-10-06T14:12:51.869Z" }, + { url = "https://files.pythonhosted.org/packages/73/ae/b48f95715333080afb75a4504487cbe142cae1268afc482d06692d605ae6/yarl-1.22.0-py3-none-any.whl", hash = "sha256:1380560bdba02b6b6c90de54133c81c9f2a453dee9912fe58c1dcced1edb7cff", size = 46814, upload-time = "2025-10-06T14:12:53.872Z" }, +] + +[[package]] +name = "yq" +version = "3.4.3" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "argcomplete" }, + { name = "pyyaml" }, + { name = "tomlkit" }, + { name = "xmltodict", version = "0.15.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.9'" }, + { name = "xmltodict", version = "1.0.2", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.9'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/38/6a/eb9721ed0929d0f55d167c2222d288b529723afbef0a07ed7aa6cca72380/yq-3.4.3.tar.gz", hash = "sha256:ba586a1a6f30cf705b2f92206712df2281cd320280210e7b7b80adcb8f256e3b", size = 33214, upload-time = "2024-04-27T15:39:43.29Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/f2/ba/d1b21f3e57469030bd6536b91bb28fedd2511d4e68b5a575f2bdb3a3dbb6/yq-3.4.3-py3-none-any.whl", hash = "sha256:547e34bc3caacce83665fd3429bf7c85f8e8b6b9aaee3f953db1ad716ff3434d", size = 18812, upload-time = "2024-04-27T15:39:41.652Z" }, +] + +[[package]] +name = "zipp" +version = "3.20.2" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version < '3.9'", +] +sdist = { url = "https://files.pythonhosted.org/packages/54/bf/5c0000c44ebc80123ecbdddba1f5dcd94a5ada602a9c225d84b5aaa55e86/zipp-3.20.2.tar.gz", hash = "sha256:bc9eb26f4506fda01b81bcde0ca78103b6e62f991b381fec825435c836edbc29", size = 24199, upload-time = "2024-09-13T13:44:16.101Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/62/8b/5ba542fa83c90e09eac972fc9baca7a88e7e7ca4b221a89251954019308b/zipp-3.20.2-py3-none-any.whl", hash = "sha256:a817ac80d6cf4b23bf7f2828b7cabf326f15a001bea8b1f9b49631780ba28350", size = 9200, upload-time = "2024-09-13T13:44:14.38Z" }, +] + +[[package]] +name = "zipp" +version = "3.23.0" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version >= '3.11' and python_full_version < '3.14'", + "python_full_version == '3.10.*'", + "python_full_version == '3.9.*'", +] +sdist = { url = "https://files.pythonhosted.org/packages/e3/02/0f2892c661036d50ede074e376733dca2ae7c6eb617489437771209d4180/zipp-3.23.0.tar.gz", hash = "sha256:a07157588a12518c9d4034df3fbbee09c814741a33ff63c05fa29d26a2404166", size = 25547, upload-time = "2025-06-08T17:06:39.4Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/2e/54/647ade08bf0db230bfea292f893923872fd20be6ac6f53b2b936ba839d75/zipp-3.23.0-py3-none-any.whl", hash = "sha256:071652d6115ed432f5ce1d34c336c0adfd6a884660d1e9712a256d3d3bd4b14e", size = 10276, upload-time = "2025-06-08T17:06:38.034Z" }, +] diff --git a/wakis/__init__.py b/wakis/__init__.py index 57ba37f..7ac4a39 100644 --- a/wakis/__init__.py +++ b/wakis/__init__.py @@ -3,6 +3,28 @@ # Copyright (c) CERN, 2024. # # ########################################### # + +__all__ = [ + # submodules + "field", + "gridFIT3D", + "solverFIT3D", + "sources", + "materials", + "wakeSolver", + "geometry", + "logger", + "field_monitors", + "FieldMonitor", + "Field", + "GridFIT3D", + "SolverFIT3D", + "WakeSolver", + "Logger", + "__version__", +] + + from . import field from . import gridFIT3D from . import solverFIT3D @@ -20,4 +42,4 @@ from .wakeSolver import WakeSolver from .logger import Logger -from ._version import __version__ \ No newline at end of file +from ._version import __version__ diff --git a/wakis/_version.py b/wakis/_version.py index 3966a5f..43c4ab0 100644 --- a/wakis/_version.py +++ b/wakis/_version.py @@ -1 +1 @@ -__version__ = '0.6.1' \ No newline at end of file +__version__ = "0.6.1" diff --git a/wakis/conductors.py b/wakis/conductors.py index 1f02a2d..33389b6 100644 --- a/wakis/conductors.py +++ b/wakis/conductors.py @@ -1,6 +1,7 @@ import numpy as np import scipy.optimize + class OutRect: def __init__(self, Lx, Ly, x_cent, y_cent): self.Lx = Lx @@ -14,7 +15,8 @@ def __init__(self, Lx, Ly, x_cent, y_cent): def out_conductor(self, x, y): # [xx, yy] = np.dot(self.mR, np.array([x, y])) return (-0.5 * self.Lx + self.x_cent < x < 0.5 * self.Lx + self.x_cent) and ( - -0.5 * self.Ly + self.y_cent < y < 0.5 * self.Ly + self.y_cent) + -0.5 * self.Ly + self.y_cent < y < 0.5 * self.Ly + self.y_cent + ) def in_conductor(self, x, y): return not self.out_conductor(x, y) @@ -43,6 +45,7 @@ def intersec_y(self, x, y): # [_, yyy] = np.dot(self.R, np.array([xx, inters])) # return yyy + class ImpFunc: def __init__(self, func): self.func = func @@ -54,15 +57,18 @@ def in_conductor(self, x, y): return self.func(x, y) > 0 def intersec_x(self, x, y): - func_x = lambda t : self.func(t, y) + def func_x(t): + return self.func(t, y) return scipy.optimize.newton_krylov(func_x, x) def intersec_y(self, x, y): - func_y = lambda t : self.func(x, t) + def func_y(t): + return self.func(x, t) return scipy.optimize.newton_krylov(func_y, y) - + + class Plane: def __init__(self, m_plane, q_plane, tol=0, sign=1): self.tol = tol # 1e-16 @@ -76,7 +82,7 @@ def in_conductor(self, x, y): elif self.sign == -1: return y - self.m_plane * x - self.q_plane <= self.tol else: - print('sign must be + or - 1') + print("sign must be + or - 1") def out_conductor(self, x, y): return not self.in_conductor(x, y) @@ -95,15 +101,23 @@ def __init__(self, radius, x_cent, y_cent): self.y_cent = y_cent def in_conductor(self, x, y): - return np.square(x - self.x_cent) + np.square(y - self.y_cent) <= np.square(self.radius) + return np.square(x - self.x_cent) + np.square(y - self.y_cent) <= np.square( + self.radius + ) def out_conductor(self, x, y): return not self.in_conductor(x, y) def intersec_x(self, x, y): if abs(y - self.y_cent) <= self.radius: - inters_1 = np.sqrt(np.square(self.radius) - np.square(y - self.y_cent)) + self.y_cent - inters_2 = -np.sqrt(np.square(self.radius) - np.square(y - self.y_cent)) + self.y_cent + inters_1 = ( + np.sqrt(np.square(self.radius) - np.square(y - self.y_cent)) + + self.y_cent + ) + inters_2 = ( + -np.sqrt(np.square(self.radius) - np.square(y - self.y_cent)) + + self.y_cent + ) if abs(x - inters_1) < abs(x - inters_2): return inters_1 else: @@ -113,8 +127,14 @@ def intersec_x(self, x, y): def intersec_y(self, x, y): if abs(x - self.x_cent) <= self.radius: - inters_1 = np.sqrt(np.square(self.radius) - np.square(x - self.x_cent)) + self.x_cent - inters_2 = -np.sqrt(np.square(self.radius) - np.square(x - self.x_cent)) + self.x_cent + inters_1 = ( + np.sqrt(np.square(self.radius) - np.square(x - self.x_cent)) + + self.x_cent + ) + inters_2 = ( + -np.sqrt(np.square(self.radius) - np.square(x - self.x_cent)) + + self.x_cent + ) if abs(y - inters_1) < abs(y - inters_2): return inters_1 else: @@ -130,15 +150,21 @@ def __init__(self, radius, x_cent, y_cent): self.y_cent = y_cent def in_conductor(self, x, y): - return np.square(x - self.x_cent) + np.square(y - self.y_cent) >= np.square(self.radius) + return np.square(x - self.x_cent) + np.square(y - self.y_cent) >= np.square( + self.radius + ) def out_conductor(self, x, y): return not self.in_conductor(x, y) def intersec_x(self, x, y): # if abs(y - self.y_cent) > self.radius: - inters_1 = np.sqrt(np.square(self.radius) - np.square(y - self.y_cent)) + self.x_cent - inters_2 = -np.sqrt(np.square(self.radius) - np.square(y - self.y_cent)) + self.x_cent + inters_1 = ( + np.sqrt(np.square(self.radius) - np.square(y - self.y_cent)) + self.x_cent + ) + inters_2 = ( + -np.sqrt(np.square(self.radius) - np.square(y - self.y_cent)) + self.x_cent + ) if abs(x - inters_1) < abs(x - inters_2): return inters_1 else: @@ -148,8 +174,12 @@ def intersec_x(self, x, y): def intersec_y(self, x, y): # if abs(x - self.x_cent) > self.radius: - inters_1 = np.sqrt(np.square(self.radius) - np.square(x - self.x_cent)) + self.y_cent - inters_2 = -np.sqrt(np.square(self.radius) - np.square(x - self.x_cent)) + self.y_cent + inters_1 = ( + np.sqrt(np.square(self.radius) - np.square(x - self.x_cent)) + self.y_cent + ) + inters_2 = ( + -np.sqrt(np.square(self.radius) - np.square(x - self.x_cent)) + self.y_cent + ) if abs(y - inters_1) < abs(y - inters_2): return inters_1 else: @@ -201,4 +231,3 @@ def intersec_x(self, x, y): def intersec_y(self, x, y): return 1000 - diff --git a/wakis/conductors3d.py b/wakis/conductors3d.py index cbdaf24..32c87c3 100644 --- a/wakis/conductors3d.py +++ b/wakis/conductors3d.py @@ -41,7 +41,6 @@ def intersec_z(self, x, y, z): class InCube: - def __init__(self, lx, ly, lz, x_cent, y_cent, z_cent): self.lx = lx self.ly = ly @@ -51,9 +50,11 @@ def __init__(self, lx, ly, lz, x_cent, y_cent, z_cent): self.z_cent = z_cent def out_conductor(self, x, y, z): - return (-0.5 * self.lx + self.x_cent < x < 0.5 * self.lx + self.x_cent and - -0.5 * self.ly + self.y_cent < y < 0.5 * self.ly + self.y_cent and - -0.5 * self.lz + self.z_cent < z < 0.5 * self.lz + self.z_cent) + return ( + -0.5 * self.lx + self.x_cent < x < 0.5 * self.lx + self.x_cent + and -0.5 * self.ly + self.y_cent < y < 0.5 * self.ly + self.y_cent + and -0.5 * self.lz + self.z_cent < z < 0.5 * self.lz + self.z_cent + ) def in_conductor(self, x, y, z): return not self.out_conductor(x, y, z) @@ -84,7 +85,6 @@ def intersec_z(self, x, y, z): class InSphere: - def __init__(self, radius, x_cent, y_cent, z_cent): self.radius = radius self.x_cent = x_cent @@ -92,17 +92,30 @@ def __init__(self, radius, x_cent, y_cent, z_cent): self.z_cent = z_cent def in_conductor(self, x, y, z): - return (np.square(x - self.x_cent) + np.square(y - self.y_cent) + np.square(z - self.z_cent) - <= np.square(self.radius)) + return np.square(x - self.x_cent) + np.square(y - self.y_cent) + np.square( + z - self.z_cent + ) <= np.square(self.radius) def out_conductor(self, x, y, z): return not self.out_conductor(x, y, z) def intersec_x(self, x, y, z): - inters_1 = (np.sqrt(np.square(self.radius) - np.square(y - self.y_cent) - - np.square(z - self.z_cent)) + self.x_cent) - inters_2 = -(np.sqrt(np.square(self.radius) - np.square(y - self.y_cent) - - np.square(z - self.z_cent)) + self.x_cent) + inters_1 = ( + np.sqrt( + np.square(self.radius) + - np.square(y - self.y_cent) + - np.square(z - self.z_cent) + ) + + self.x_cent + ) + inters_2 = -( + np.sqrt( + np.square(self.radius) + - np.square(y - self.y_cent) + - np.square(z - self.z_cent) + ) + + self.x_cent + ) if abs(x - inters_1) < abs(x - inters_2): return inters_1 @@ -110,20 +123,44 @@ def intersec_x(self, x, y, z): return inters_2 def intersec_y(self, x, y, z): - inters_1 = (np.sqrt(np.square(self.radius) - np.square(x - self.x_cent) - - np.square(z - self.z_cent)) + self.y_cent) - inters_2 = -(np.sqrt(np.square(self.radius) - np.square(x - self.x_cent) - - np.square(z - self.z_cent)) + self.y_cent) + inters_1 = ( + np.sqrt( + np.square(self.radius) + - np.square(x - self.x_cent) + - np.square(z - self.z_cent) + ) + + self.y_cent + ) + inters_2 = -( + np.sqrt( + np.square(self.radius) + - np.square(x - self.x_cent) + - np.square(z - self.z_cent) + ) + + self.y_cent + ) if abs(y - inters_1) < abs(y - inters_2): return inters_1 else: return inters_2 def intersec_z(self, x, y, z): - inters_1 = (np.sqrt(np.square(self.radius) - np.square(x - self.x_cent) - - np.square(y - self.y_cent)) + self.z_cent) - inters_2 = -(np.sqrt(np.square(self.radius) - np.square(x - self.x_cent) - - np.square(y - self.y_cent)) + self.z_cent) + inters_1 = ( + np.sqrt( + np.square(self.radius) + - np.square(x - self.x_cent) + - np.square(y - self.y_cent) + ) + + self.z_cent + ) + inters_2 = -( + np.sqrt( + np.square(self.radius) + - np.square(x - self.x_cent) + - np.square(y - self.y_cent) + ) + + self.z_cent + ) if abs(z - inters_1) < abs(z - inters_2): return inters_1 else: @@ -153,7 +190,12 @@ def __init__(self, p, n): self.n = n def in_conductor(self, x, y, z): - return self.n[0] * (x - self.p[0]) + self.n[1] * (y - self.p[1]) + self.n[2] * (z - self.p[2]) <= 0 + return ( + self.n[0] * (x - self.p[0]) + + self.n[1] * (y - self.p[1]) + + self.n[2] * (z - self.p[2]) + <= 0 + ) def out_conductor(self, x, y, z): return not self.in_conductor(x, y, z) @@ -162,19 +204,28 @@ def intersec_x(self, x, y, z): if self.n[0] == 0: return 1000 else: - return -(self.n[1] * (y - self.p[1]) + self.n[2] * (z - self.p[2])) / self.n[0] + self.p[0] + return ( + -(self.n[1] * (y - self.p[1]) + self.n[2] * (z - self.p[2])) / self.n[0] + + self.p[0] + ) def intersec_y(self, x, y, z): if self.n[1] == 0: return 1000 else: - return -(self.n[0] * (x - self.p[0]) + self.n[2] * (z - self.p[2])) / self.n[1] + self.p[1] + return ( + -(self.n[0] * (x - self.p[0]) + self.n[2] * (z - self.p[2])) / self.n[1] + + self.p[1] + ) def intersec_z(self, x, y, z): if self.n[2] == 0: return 1000 else: - return -(self.n[0] * (x - self.p[0]) + self.n[1] * (y - self.p[1])) / self.n[2] + self.p[2] + return ( + -(self.n[0] * (x - self.p[0]) + self.n[1] * (y - self.p[1])) / self.n[2] + + self.p[2] + ) class OutSphere: @@ -185,17 +236,30 @@ def __init__(self, radius, x_cent=0, y_cent=0, z_cent=0): self.z_cent = z_cent def in_conductor(self, x, y, z): - return (np.square(x - self.x_cent) + np.square(y - self.y_cent) + np.square(z - self.z_cent) - >= np.square(self.radius)) + return np.square(x - self.x_cent) + np.square(y - self.y_cent) + np.square( + z - self.z_cent + ) >= np.square(self.radius) def out_conductor(self, x, y, z): return not self.in_conductor(x, y, z) def intersec_x(self, x, y, z): - inters_1 = (np.sqrt(np.square(self.radius) - np.square(y - self.y_cent) - - np.square(z - self.z_cent)) + self.x_cent) - inters_2 = -(np.sqrt(np.square(self.radius) - np.square(y - self.y_cent) - - np.square(z - self.z_cent)) + self.x_cent) + inters_1 = ( + np.sqrt( + np.square(self.radius) + - np.square(y - self.y_cent) + - np.square(z - self.z_cent) + ) + + self.x_cent + ) + inters_2 = -( + np.sqrt( + np.square(self.radius) + - np.square(y - self.y_cent) + - np.square(z - self.z_cent) + ) + + self.x_cent + ) if abs(x - inters_1) < abs(x - inters_2): return inters_1 @@ -203,20 +267,44 @@ def intersec_x(self, x, y, z): return inters_2 def intersec_y(self, x, y, z): - inters_1 = (np.sqrt(np.square(self.radius) - np.square(x - self.x_cent) - - np.square(z - self.z_cent)) + self.y_cent) - inters_2 = -(np.sqrt(np.square(self.radius) - np.square(x - self.x_cent) - - np.square(z - self.z_cent)) + self.y_cent) + inters_1 = ( + np.sqrt( + np.square(self.radius) + - np.square(x - self.x_cent) + - np.square(z - self.z_cent) + ) + + self.y_cent + ) + inters_2 = -( + np.sqrt( + np.square(self.radius) + - np.square(x - self.x_cent) + - np.square(z - self.z_cent) + ) + + self.y_cent + ) if abs(y - inters_1) < abs(y - inters_2): return inters_1 else: return inters_2 def intersec_z(self, x, y, z): - inters_1 = (np.sqrt(np.square(self.radius) - np.square(x - self.x_cent) - - np.square(y - self.y_cent)) + self.z_cent) - inters_2 = -(np.sqrt(np.square(self.radius) - np.square(x - self.x_cent) - - np.square(y - self.y_cent)) + self.z_cent) + inters_1 = ( + np.sqrt( + np.square(self.radius) + - np.square(x - self.x_cent) + - np.square(y - self.y_cent) + ) + + self.z_cent + ) + inters_2 = -( + np.sqrt( + np.square(self.radius) + - np.square(x - self.x_cent) + - np.square(y - self.y_cent) + ) + + self.z_cent + ) if abs(z - inters_1) < abs(z - inters_2): return inters_1 else: diff --git a/wakis/field.py b/wakis/field.py index 02e0fad..831b5e3 100644 --- a/wakis/field.py +++ b/wakis/field.py @@ -9,26 +9,27 @@ try: import cupy as xp_gpu + imported_cupy = True except ImportError: imported_cupy = False + class Field: - ''' + """ Class to switch from 3D to collapsed notation by defining the __getitem__ magic method linear numbering: n = 1 + (i-1) + (j-1)*Nx + (k-1)*Nx*Ny len(n) = Nx*Ny*Nz - ''' - def __init__(self, Nx, Ny, Nz, dtype=float, - use_ones=False, use_gpu=False): + """ + def __init__(self, Nx, Ny, Nz, dtype=float, use_ones=False, use_gpu=False): self.Nx = Nx self.Ny = Ny self.Nz = Nz - self.N = Nx*Ny*Nz + self.N = Nx * Ny * Nz self.dtype = dtype self.on_gpu = use_gpu @@ -36,47 +37,47 @@ def __init__(self, Nx, Ny, Nz, dtype=float, if imported_cupy: self.xp = xp_gpu else: - print('*** cupy could not be imported, please CUDA check installation') + print("*** cupy could not be imported, please CUDA check installation") else: self.xp = xp - + if use_ones: - self.array = self.xp.ones(self.N*3, dtype=self.dtype, order='F') + self.array = self.xp.ones(self.N * 3, dtype=self.dtype, order="F") else: - self.array = self.xp.zeros(self.N*3, dtype=self.dtype, order='F') + self.array = self.xp.zeros(self.N * 3, dtype=self.dtype, order="F") @property def field_x(self): - return self.array[0:self.N] + return self.array[0 : self.N] @property def field_y(self): - return self.array[self.N: 2*self.N] - + return self.array[self.N : 2 * self.N] + @property def field_z(self): - return self.array[2*self.N:3*self.N] + return self.array[2 * self.N : 3 * self.N] @field_x.setter def field_x(self, value): if len(value.shape) > 1: - self.from_matrix(value, 'x') + self.from_matrix(value, "x") else: - self.array[0:self.N] = value + self.array[0 : self.N] = value @field_y.setter def field_y(self, value): if len(value.shape) > 1: - self.from_matrix(value, 'y') + self.from_matrix(value, "y") else: - self.array[self.N: 2*self.N] = value + self.array[self.N : 2 * self.N] = value @field_z.setter def field_z(self, value): if len(value.shape) > 1: - self.from_matrix(value, 'z') + self.from_matrix(value, "z") else: - self.array[2*self.N:3*self.N] = value + self.array[2 * self.N : 3 * self.N] = value def toarray(self): return self.array @@ -85,71 +86,100 @@ def fromarray(self, array): self.array[:] = array def to_matrix(self, key): - if key == 0 or key == 'x': - return self.xp.reshape(self.array[0:self.N], (self.Nx, self.Ny, self.Nz), order='F') - if key == 1 or key == 'y': - return self.xp.reshape(self.array[self.N: 2*self.N], (self.Nx, self.Ny, self.Nz), order='F') - if key == 2 or key == 'z': - return self.xp.reshape(self.array[2*self.N:3*self.N], (self.Nx, self.Ny, self.Nz), order='F') + if key == 0 or key == "x": + return self.xp.reshape( + self.array[0 : self.N], (self.Nx, self.Ny, self.Nz), order="F" + ) + if key == 1 or key == "y": + return self.xp.reshape( + self.array[self.N : 2 * self.N], (self.Nx, self.Ny, self.Nz), order="F" + ) + if key == 2 or key == "z": + return self.xp.reshape( + self.array[2 * self.N : 3 * self.N], + (self.Nx, self.Ny, self.Nz), + order="F", + ) def from_matrix(self, mat, key): - if key == 0 or key == 'x': - self.array[0:self.N] = self.xp.reshape(mat, self.N, order='F') - elif key == 1 or key == 'y': - self.array[self.N: 2*self.N] = self.xp.reshape(mat, self.N, order='F') - elif key == 2 or key == 'z': - self.array[2*self.N:3*self.N] = self.xp.reshape(mat, self.N, order='F') + if key == 0 or key == "x": + self.array[0 : self.N] = self.xp.reshape(mat, self.N, order="F") + elif key == 1 or key == "y": + self.array[self.N : 2 * self.N] = self.xp.reshape(mat, self.N, order="F") + elif key == 2 or key == "z": + self.array[2 * self.N : 3 * self.N] = self.xp.reshape( + mat, self.N, order="F" + ) else: - raise IndexError('Component id not valid') - + raise IndexError("Component id not valid") + def to_gpu(self): if imported_cupy: self.xp = xp_gpu - self.array = self.xp.asarray(self.array) # to cupy arr + self.array = self.xp.asarray(self.array) # to cupy arr self.on_gpu = True else: - print('*** CuPy is not imported') + print("*** CuPy is not imported") pass def from_gpu(self): if self.on_gpu: - self.array = self.array.get() # to numpy arr + self.array = self.array.get() # to numpy arr self.on_gpu = False else: - print('*** GPU is not enabled') + print("*** GPU is not enabled") pass def __getitem__(self, key): - if type(key) is tuple: if len(key) != 4: - raise IndexError('Need 3 indexes and component to access the field') - if key[3] == 0 or key[3] == 'x': + raise IndexError("Need 3 indexes and component to access the field") + if key[3] == 0 or key[3] == "x": if self.on_gpu: - field = self.xp.reshape(self.array[0:self.N], (self.Nx, self.Ny, self.Nz), order='F') + field = self.xp.reshape( + self.array[0 : self.N], (self.Nx, self.Ny, self.Nz), order="F" + ) return field[key[0], key[1], key[2]].get() else: - field = self.xp.reshape(self.array[0:self.N], (self.Nx, self.Ny, self.Nz), order='F') + field = self.xp.reshape( + self.array[0 : self.N], (self.Nx, self.Ny, self.Nz), order="F" + ) return field[key[0], key[1], key[2]] - elif key[3] == 1 or key[3] == 'y': + elif key[3] == 1 or key[3] == "y": if self.on_gpu: - field = self.xp.reshape(self.array[self.N: 2*self.N], (self.Nx, self.Ny, self.Nz), order='F') + field = self.xp.reshape( + self.array[self.N : 2 * self.N], + (self.Nx, self.Ny, self.Nz), + order="F", + ) return field[key[0], key[1], key[2]].get() else: - field = self.xp.reshape(self.array[self.N: 2*self.N], (self.Nx, self.Ny, self.Nz), order='F') + field = self.xp.reshape( + self.array[self.N : 2 * self.N], + (self.Nx, self.Ny, self.Nz), + order="F", + ) return field[key[0], key[1], key[2]] - elif key[3] == 2 or key[3] == 'z': + elif key[3] == 2 or key[3] == "z": if self.on_gpu: - field = self.xp.reshape(self.array[2*self.N:3*self.N], (self.Nx, self.Ny, self.Nz), order='F') + field = self.xp.reshape( + self.array[2 * self.N : 3 * self.N], + (self.Nx, self.Ny, self.Nz), + order="F", + ) return field[key[0], key[1], key[2]].get() else: - field = self.xp.reshape(self.array[2*self.N:3*self.N], (self.Nx, self.Ny, self.Nz), order='F') - return field[key[0], key[1], key[2]] - elif type(key[3]) is str and key[3].lower() == 'abs': - field = self.get_abs() + field = self.xp.reshape( + self.array[2 * self.N : 3 * self.N], + (self.Nx, self.Ny, self.Nz), + order="F", + ) return field[key[0], key[1], key[2]] + elif type(key[3]) is str and key[3].lower() == "abs": + field = self.get_abs() + return field[key[0], key[1], key[2]] else: - raise IndexError('Component id not valid') + raise IndexError("Component id not valid") elif type(key) is int: if key <= self.N: @@ -158,8 +188,10 @@ def __getitem__(self, key): else: return self.array[key] else: - raise IndexError('Lexico-graphic index cannot be higher than product of dimensions') - + raise IndexError( + "Lexico-graphic index cannot be higher than product of dimensions" + ) + elif type(key) is slice: if self.on_gpu: return self.array[key].get() @@ -167,16 +199,15 @@ def __getitem__(self, key): return self.array[key] else: - raise ValueError('key must be a 3-tuple or an integer') + raise ValueError("key must be a 3-tuple or an integer") def __setitem__(self, key, value): - if self.on_gpu: value = self.xp.asarray(value) if type(key) is tuple: if len(key) != 4: - raise IndexError('Need 3 indexes and component to access the field') + raise IndexError("Need 3 indexes and component to access the field") else: field = self.to_matrix(key[3]) field[key[0], key[1], key[2]] = value @@ -186,15 +217,16 @@ def __setitem__(self, key, value): if key <= self.N: self.array[key] = value else: - raise IndexError('Lexico-graphic index cannot be higher than product of dimensions') - + raise IndexError( + "Lexico-graphic index cannot be higher than product of dimensions" + ) + elif type(key) is slice: - self.array[key] = value + self.array[key] = value else: - raise IndexError('key must be a 3-tuple or an integer') + raise IndexError("key must be a 3-tuple or an integer") def __mul__(self, other, dtype=None): - if dtype is None: dtype = self.dtype @@ -203,13 +235,13 @@ def __mul__(self, other, dtype=None): mulField = Field(self.Nx, self.Ny, self.Nz, dtype=dtype) mulField.array = self.array * other - # other is matrix + # other is matrix elif len(other.shape) > 1: mulField = Field(self.Nx, self.Ny, self.Nz, dtype=dtype) - for d in ['x', 'y', 'z']: + for d in ["x", "y", "z"]: mulField.from_matrix(self.to_matrix(d) * other, d) - # other is 1d array + # other is 1d array else: mulField = Field(self.Nx, self.Ny, self.Nz, dtype=dtype) mulField.array = self.array * other @@ -217,7 +249,6 @@ def __mul__(self, other, dtype=None): return mulField def __div__(self, other, dtype=None): - if dtype is None: dtype = self.dtype @@ -229,10 +260,10 @@ def __div__(self, other, dtype=None): # other is matrix if len(other.shape) > 1: divField = Field(self.Nx, self.Ny, self.Nz, dtype=dtype) - for d in ['x', 'y', 'z']: + for d in ["x", "y", "z"]: divField.from_matrix(self.to_matrix(d) / other, d) - # other is constant or 1d array + # other is constant or 1d array else: divField = Field(self.Nx, self.Ny, self.Nz, dtype=dtype) divField.array = self.array / other @@ -240,24 +271,22 @@ def __div__(self, other, dtype=None): return divField def __add__(self, other, dtype=None): - if dtype is None: dtype = self.dtype - + if type(other) is Field: - addField = Field(self.Nx, self.Ny, self.Nz, dtype=dtype) addField.field_x = self.field_x + other.field_x addField.field_y = self.field_y + other.field_y - addField.field_z = self.field_z + other.field_z - - # other is matrix + addField.field_z = self.field_z + other.field_z + + # other is matrix elif len(other.shape) > 1: addField = Field(self.Nx, self.Ny, self.Nz, dtype=dtype) - for d in ['x', 'y', 'z']: + for d in ["x", "y", "z"]: addField.from_matrix(self.to_matrix(d) + other, d) - # other is constant or 1d array + # other is constant or 1d array else: addField = Field(self.Nx, self.Ny, self.Nz, dtype=dtype) addField.array = self.array + other @@ -265,24 +294,39 @@ def __add__(self, other, dtype=None): return addField def __repr__(self): - return 'x:\n' + self.field_x.__repr__() + '\n'+ \ - 'y:\n' + self.field_y.__repr__() + '\n'+ \ - 'z:\n' + self.field_z.__repr__() + return ( + "x:\n" + + self.field_x.__repr__() + + "\n" + + "y:\n" + + self.field_y.__repr__() + + "\n" + + "z:\n" + + self.field_z.__repr__() + ) def __str__(self): - return 'x:\n' + self.field_x.__str__() + '\n'+ \ - 'y:\n' + self.field_y.__str__() + '\n'+ \ - 'z:\n' + self.field_z.__str__() - + return ( + "x:\n" + + self.field_x.__str__() + + "\n" + + "y:\n" + + self.field_y.__str__() + + "\n" + + "z:\n" + + self.field_z.__str__() + ) + def copy(self): - import copy obj = type(self).__new__(self.__class__) # Create empty instance for key, value in self.__dict__.items(): if key == "xp": obj.xp = self.xp # Just copy reference, no need for deepcopy elif key == "array" and self.on_gpu: - obj.array = self.xp.array(self.array) # Ensure CuPy array is copied properly + obj.array = self.xp.array( + self.array + ) # Ensure CuPy array is copied properly else: obj.__dict__[key] = copy.deepcopy(value) @@ -290,115 +334,160 @@ def copy(self): def compute_ijk(self, n): if n > (self.N): - raise IndexError('Lexico-graphic index cannot be higher than product of dimensions') + raise IndexError( + "Lexico-graphic index cannot be higher than product of dimensions" + ) - k = n//(self.Nx*self.Ny) - i = (n-k*self.Nx*self.Ny)%self.Nx - j = (n-k*self.Nx*self.Ny)//self.Nx + k = n // (self.Nx * self.Ny) + i = (n - k * self.Nx * self.Ny) % self.Nx + j = (n - k * self.Nx * self.Ny) // self.Nx return i, j, k def get_abs(self, as_matrix=True): - '''Computes the absolute or magnitude + """Computes the absolute or magnitude out of the field components - ''' + """ if as_matrix: if self.on_gpu: - return xp.sqrt(self.to_matrix('x')**2 + - self.to_matrix('y')**2 + - self.to_matrix('z')**2 ).get() + return xp.sqrt( + self.to_matrix("x") ** 2 + + self.to_matrix("y") ** 2 + + self.to_matrix("z") ** 2 + ).get() else: - return xp.sqrt(self.to_matrix('x')**2 + - self.to_matrix('y')**2 + - self.to_matrix('z')**2 ) + return xp.sqrt( + self.to_matrix("x") ** 2 + + self.to_matrix("y") ** 2 + + self.to_matrix("z") ** 2 + ) - else: # 1d array + else: # 1d array if self.on_gpu: return xp.sqrt(self.field_x**2 + self.field_y**2, self.field_z**2).get() else: return xp.sqrt(self.field_x**2 + self.field_y**2, self.field_z**2) - def inspect(self, plane='YZ', cmap='bwr', - dpi=100, figsize=[8,6], - x=None, y=None, z=None, show=True, - handles=False, **kwargs): + def inspect( + self, + plane="YZ", + cmap="bwr", + dpi=100, + figsize=[8, 6], + x=None, + y=None, + z=None, + show=True, + handles=False, + **kwargs, + ): import matplotlib.pyplot as plt from mpl_toolkits.axes_grid1 import make_axes_locatable - if None not in (x,y,z): #custom slice + if None not in (x, y, z): # custom slice transpose = False extent = None - xax, yax = 'No. of cells', 'No. of cells' + xax, yax = "No. of cells", "No. of cells" - elif plane == 'XY': - key=[slice(0,self.Nx), slice(0,self.Ny), int(self.Nz//2)] + elif plane == "XY": + key = [slice(0, self.Nx), slice(0, self.Ny), int(self.Nz // 2)] x, y, z = key[0], key[1], key[2] extent = (0, self.Nx, 0, self.Ny) - xax, yax = 'nx', 'ny' + xax, yax = "nx", "ny" transpose = True - elif plane == 'XZ': - key=[slice(0,self.Nx), int(self.Ny//2), slice(0,self.Nz)] + elif plane == "XZ": + key = [slice(0, self.Nx), int(self.Ny // 2), slice(0, self.Nz)] x, y, z = key[0], key[1], key[2] extent = (0, self.Nz, 0, self.Nx) - xax, yax = 'nz', 'nx' + xax, yax = "nz", "nx" transpose = False - elif plane == 'YZ': - key=[int(self.Nx//2), slice(0,self.Ny), slice(0,self.Nz)] + elif plane == "YZ": + key = [int(self.Nx // 2), slice(0, self.Ny), slice(0, self.Nz)] x, y, z = key[0], key[1], key[2] extent = (0, self.Nz, 0, self.Ny) - xax, yax = 'nz', 'ny' + xax, yax = "nz", "ny" transpose = False fig, axs = plt.subplots(1, 3, tight_layout=True, figsize=figsize, dpi=dpi) - dims = {0:'x', 1:'y', 2:'z'} + dims = {0: "x", 1: "y", 2: "z"} im = {} - for d in [0,1,2]: + for d in [0, 1, 2]: field = self.to_matrix(d) - - if self.on_gpu and hasattr(field, 'get'): + + if self.on_gpu and hasattr(field, "get"): field = field.get() if transpose: - im[d] = axs[d].imshow(field[x,y,z].T, cmap=cmap, vmin=-field.max(), vmax=field.max(), extent=extent, origin='lower', **kwargs) + im[d] = axs[d].imshow( + field[x, y, z].T, + cmap=cmap, + vmin=-field.max(), + vmax=field.max(), + extent=extent, + origin="lower", + **kwargs, + ) else: - im[d] = axs[d].imshow(field[x,y,z], cmap=cmap, vmin=-field.max(), vmax=field.max(), extent=extent, origin='lower', **kwargs) + im[d] = axs[d].imshow( + field[x, y, z], + cmap=cmap, + vmin=-field.max(), + vmax=field.max(), + extent=extent, + origin="lower", + **kwargs, + ) for i, ax in enumerate(axs): - ax.set_title(f'Field {dims[i]}, plane {plane}') - fig.colorbar(im[i], cax=make_axes_locatable(ax).append_axes('right', size='5%', pad=0.1)) + ax.set_title(f"Field {dims[i]}, plane {plane}") + fig.colorbar( + im[i], + cax=make_axes_locatable(ax).append_axes("right", size="5%", pad=0.1), + ) ax.set_xlabel(xax) ax.set_ylabel(yax) if handles: return fig, axs - + if show: plt.show() return None - def inspect3D(self, field='all', backend='pyista', grid=None, - xmax=None, ymax=None, zmax=None, - bounding_box=True, show_grid=True, - cmap='viridis', dpi=100, show=True, handles=False): + def inspect3D( + self, + field="all", + backend="pyista", + grid=None, + xmax=None, + ymax=None, + zmax=None, + bounding_box=True, + show_grid=True, + cmap="viridis", + dpi=100, + show=True, + handles=False, + ): """ Visualize 3D field data on the structured grid using either Matplotlib (voxel rendering) or PyVista (interactive clipping and slicing). This method provides two complementary visualization backends: - - **Matplotlib**: static voxel plots of the field components (x, y, z) + - **Matplotlib**: static voxel plots of the field components (x, y, z) or all combined, useful for quick inspection, but memory intensive. - - **PyVista**: interactive 3D visualization with sliders to dynamically + - **PyVista**: interactive 3D visualization with sliders to dynamically clip the volume along X, Y, and Z, and optional wireframe slices. Parameters ---------- field : {'x', 'y', 'z', 'all'}, default 'all' - Which field component(s) to visualize. + Which field component(s) to visualize. - 'x', 'y', 'z': single component - 'all': shows all three components backend : {'matplotlib', 'pyvista'}, default 'pyvista' @@ -406,16 +495,16 @@ def inspect3D(self, field='all', backend='pyista', grid=None, - 'matplotlib': static voxel rendering - 'pyvista': interactive 3D rendering with clipping sliders grid : GridFIT3D or pyvista.StructuredGrid, optional - Structured grid object to use for visualization. If None, + Structured grid object to use for visualization. If None, a grid is constructed from the solver's internal dimensions. xmax, ymax, zmax : int or float, optional - Maximum extents in each direction for visualization. Defaults + Maximum extents in each direction for visualization. Defaults to the full grid dimensions if not specified. bounding_box : bool, default True - If True, draw a wireframe bounding box of the simulation domain + If True, draw a wireframe bounding box of the simulation domain (only used in PyVista backend). show_grid : bool, default True - If True, show wireframe slice planes of the grid during + If True, show wireframe slice planes of the grid during interactive visualization (PyVista backend). cmap : str, default 'viridis' Colormap to apply to the scalar field. @@ -425,7 +514,7 @@ def inspect3D(self, field='all', backend='pyista', grid=None, Whether to display the figure/plot immediately. - If False in PyVista, exports to `field.html` instead. handles : bool, default False - If True, return figure/axes (Matplotlib) or the Plotter object + If True, return figure/axes (Matplotlib) or the Plotter object (PyVista) for further customization instead of showing directly. Returns @@ -437,10 +526,10 @@ def inspect3D(self, field='all', backend='pyista', grid=None, Notes ----- - - The PyVista backend provides interactive sliders to clip the - volume along each axis independently and inspect internal + - The PyVista backend provides interactive sliders to clip the + volume along each axis independently and inspect internal structures of the 3D field. - - The Matplotlib backend provides a quick static voxel rendering + - The Matplotlib backend provides a quick static voxel rendering but is limited in interactivity and scalability. """ @@ -448,93 +537,106 @@ def inspect3D(self, field='all', backend='pyista', grid=None, field = field.lower() # ---------- matplotlib backend --------------- - if backend.lower() == 'matplotlib': + if backend.lower() == "matplotlib": import matplotlib.pyplot as plt import matplotlib as mpl - from mpl_toolkits.axes_grid1 import make_axes_locatable - fig = plt.figure(tight_layout=True, dpi=dpi, figsize=[12,6]) + fig = plt.figure(tight_layout=True, dpi=dpi, figsize=[12, 6]) plot_x, plot_y, plot_z = False, False, False - if field == 'all': + if field == "all": plot_x = True plot_y = True plot_z = True - elif field.lower() == 'x': plot_x = True - elif field.lower() == 'y': plot_y = True - elif field.lower() == 'z': plot_z = True + elif field.lower() == "x": + plot_x = True + elif field.lower() == "y": + plot_y = True + elif field.lower() == "z": + plot_z = True - if xmax is None: xmax = self.Nx - if ymax is None: ymax = self.Ny - if zmax is None: zmax = self.Nz + if xmax is None: + xmax = self.Nx + if ymax is None: + ymax = self.Ny + if zmax is None: + zmax = self.Nz - x,y,z = self.xp.mgrid[0:xmax+1,0:ymax+1,0:zmax+1] + x, y, z = self.xp.mgrid[0 : xmax + 1, 0 : ymax + 1, 0 : zmax + 1] axs = [] # field x if plot_x: - arr = self.to_matrix('x')[0:int(xmax),0:int(ymax),0:int(zmax)] - if field == 'all': - ax = fig.add_subplot(1, 3, 1, projection='3d') + arr = self.to_matrix("x")[0 : int(xmax), 0 : int(ymax), 0 : int(zmax)] + if field == "all": + ax = fig.add_subplot(1, 3, 1, projection="3d") else: - ax = fig.add_subplot(1, 1, 1, projection='3d') - - vmin, vmax = -self.xp.max(self.xp.abs(arr)), +self.xp.max(self.xp.abs(arr)) + ax = fig.add_subplot(1, 1, 1, projection="3d") + + vmin, vmax = ( + -self.xp.max(self.xp.abs(arr)), + +self.xp.max(self.xp.abs(arr)), + ) norm = mpl.colors.Normalize(vmin=vmin, vmax=vmax) colors = mpl.colormaps[cmap](norm(arr)) - vox = ax.voxels(x, y, z, filled=self.xp.ones_like(arr), facecolors=colors) - + ax.voxels(x, y, z, filled=self.xp.ones_like(arr), facecolors=colors) + m = mpl.cm.ScalarMappable(cmap=cmap, norm=norm) m.set_array([]) fig.colorbar(m, ax=ax, shrink=0.5, aspect=10) - ax.set_title(f'Field x') + ax.set_title("Field x") axs.append(ax) # field y if plot_y: - arr = self.to_matrix('y')[0:int(xmax),0:int(ymax),0:int(zmax)] - if field == 'all': - ax = fig.add_subplot(1, 3, 2, projection='3d') + arr = self.to_matrix("y")[0 : int(xmax), 0 : int(ymax), 0 : int(zmax)] + if field == "all": + ax = fig.add_subplot(1, 3, 2, projection="3d") else: - ax = fig.add_subplot(1, 1, 1, projection='3d') - - vmin, vmax = -self.xp.max(self.xp.abs(arr)), +self.xp.max(self.xp.abs(arr)) + ax = fig.add_subplot(1, 1, 1, projection="3d") + + vmin, vmax = ( + -self.xp.max(self.xp.abs(arr)), + +self.xp.max(self.xp.abs(arr)), + ) norm = mpl.colors.Normalize(vmin=vmin, vmax=vmax) colors = mpl.colormaps[cmap](norm(arr)) - vox = ax.voxels(x, y, z, filled=self.xp.ones_like(arr), facecolors=colors) - + ax.voxels(x, y, z, filled=self.xp.ones_like(arr), facecolors=colors) + m = mpl.cm.ScalarMappable(cmap=cmap, norm=norm) m.set_array([]) fig.colorbar(m, ax=ax, shrink=0.5, aspect=10) - ax.set_title(f'Field y') + ax.set_title("Field y") axs.append(ax) # field z if plot_z: - arr = self.to_matrix('z')[0:int(xmax),0:int(ymax),0:int(zmax)] - if field == 'all': - ax = fig.add_subplot(1, 3, 3, projection='3d') + arr = self.to_matrix("z")[0 : int(xmax), 0 : int(ymax), 0 : int(zmax)] + if field == "all": + ax = fig.add_subplot(1, 3, 3, projection="3d") else: - ax = fig.add_subplot(1, 1, 1, projection='3d') + ax = fig.add_subplot(1, 1, 1, projection="3d") - vmin, vmax = -self.xp.max(self.xp.abs(arr)), +self.xp.max(self.xp.abs(arr)) + vmin, vmax = ( + -self.xp.max(self.xp.abs(arr)), + +self.xp.max(self.xp.abs(arr)), + ) norm = mpl.colors.Normalize(vmin=vmin, vmax=vmax) colors = mpl.colormaps[cmap](norm(arr)) - vox = ax.voxels(x, y, z, filled=self.xp.ones_like(arr), facecolors=colors) - + ax.voxels(x, y, z, filled=self.xp.ones_like(arr), facecolors=colors) + m = mpl.cm.ScalarMappable(cmap=cmap, norm=norm) m.set_array([]) fig.colorbar(m, ax=ax, shrink=0.5, aspect=10) - ax.set_title(f'Field z') + ax.set_title("Field z") axs.append(ax) - dims = {0:'x', 1:'y', 2:'z'} for i, ax in enumerate(axs): - ax.set_xlabel('Nx') - ax.set_ylabel('Ny') - ax.set_zlabel('Nz') + ax.set_xlabel("Nx") + ax.set_ylabel("Ny") + ax.set_zlabel("Nz") ax.xaxis.set_pane_color((1.0, 1.0, 1.0, 0.0)) ax.yaxis.set_pane_color((1.0, 1.0, 1.0, 0.0)) ax.zaxis.set_pane_color((1.0, 1.0, 1.0, 0.0)) @@ -544,63 +646,84 @@ def inspect3D(self, field='all', backend='pyista', grid=None, if handles: return fig, axs - + if show: plt.show() # ----------- pyvista backend --------------- - else: + else: import pyvista as pv - if grid is not None and hasattr(grid, 'grid'): - xlo, xhi, ylo, yhi, zlo, zhi = grid.xmin, grid.xmax, grid.ymin, grid.ymax, grid.zmin, grid.zmax + if grid is not None and hasattr(grid, "grid"): + xlo, xhi, ylo, yhi, zlo, zhi = ( + grid.xmin, + grid.xmax, + grid.ymin, + grid.ymax, + grid.zmin, + grid.zmax, + ) grid = grid.grid - if field == 'x': - scalars = 'Field '+field + if field == "x": + scalars = "Field " + field grid[scalars] = xp.reshape(self.to_matrix(field), self.N) - elif field == 'y': - scalars = 'Field '+field + elif field == "y": + scalars = "Field " + field grid[scalars] = xp.reshape(self.to_matrix(field), self.N) - elif field == 'z': - scalars = 'Field '+field + elif field == "z": + scalars = "Field " + field grid[scalars] = xp.reshape(self.to_matrix(field), self.N) - else: # for all or abs - scalars = 'Field '+'Abs' + else: # for all or abs + scalars = "Field " + "Abs" grid[scalars] = xp.reshape(self.get_abs(), self.N) - if xmax is None: xmax = xhi - if ymax is None: ymax = yhi - if zmax is None: zmax = zhi + if xmax is None: + xmax = xhi + if ymax is None: + ymax = yhi + if zmax is None: + zmax = zhi else: - print('[!] `grid` is not passed or is not a GridFIT3D object -> Using #N cells instead ') - x = xp.linspace(0, self.Nx, self.Nx+1) - y = xp.linspace(0, self.Ny, self.Ny+1) - z = xp.linspace(0, self.Nz, self.Nz+1) - xlo, xhi, ylo, yhi, zlo, zhi = x.min(), x.max(), y.min(), y.max(), z.min(), z.max() - if xmax is None: xmax = self.Nx - if ymax is None: ymax = self.Ny - if zmax is None: zmax = self.Nz - X, Y, Z = xp.meshgrid(x, y, z, indexing='ij') + print( + "[!] `grid` is not passed or is not a GridFIT3D object -> Using #N cells instead " + ) + x = xp.linspace(0, self.Nx, self.Nx + 1) + y = xp.linspace(0, self.Ny, self.Ny + 1) + z = xp.linspace(0, self.Nz, self.Nz + 1) + xlo, xhi, ylo, yhi, zlo, zhi = ( + x.min(), + x.max(), + y.min(), + y.max(), + z.min(), + z.max(), + ) + if xmax is None: + xmax = self.Nx + if ymax is None: + ymax = self.Ny + if zmax is None: + zmax = self.Nz + X, Y, Z = xp.meshgrid(x, y, z, indexing="ij") grid = pv.StructuredGrid(X.transpose(), Y.transpose(), Z.transpose()) - if field == 'x': - scalars = 'Field '+field + if field == "x": + scalars = "Field " + field grid[scalars] = xp.reshape(self.to_matrix(field), self.N) - elif field == 'y': - scalars = 'Field '+field + elif field == "y": + scalars = "Field " + field grid[scalars] = xp.reshape(self.to_matrix(field), self.N) - elif field == 'z': - scalars = 'Field '+field + elif field == "z": + scalars = "Field " + field grid[scalars] = xp.reshape(self.to_matrix(field), self.N) - else: # for all or abs - scalars = 'Field '+'Abs' + else: # for all or abs + scalars = "Field " + "Abs" grid[scalars] = xp.reshape(self.get_abs(), self.N) - pv.global_theme.allow_empty_mesh = True pl = pv.Plotter() - vals = {'x':xmax, 'y':ymax, 'z':zmax} + vals = {"x": xmax, "y": ymax, "z": zmax} # --- Update function --- def update_clip(val, axis="x"): @@ -615,7 +738,10 @@ def update_clip(val, axis="x"): # add clipped volume (scalars) pl.add_mesh( - grid.clip_box(bounds=(xlo, vals['x'], ylo, vals['y'], zlo, vals['z']), invert=False), + grid.clip_box( + bounds=(xlo, vals["x"], ylo, vals["y"], zlo, vals["z"]), + invert=False, + ), scalars=scalars, cmap=cmap, name="clip", @@ -623,52 +749,67 @@ def update_clip(val, axis="x"): # add slice wireframe (grid structure) if show_grid: - pl.add_mesh(slice_obj, style="wireframe", color="grey", name="slice") + pl.add_mesh( + slice_obj, style="wireframe", color="grey", name="slice" + ) # --- Sliders (placed side-by-side vertically) --- pl.add_slider_widget( lambda value: update_clip(value, "x"), [xlo, xhi], - value=xmax, title="X Clip", - pointa=(0.8, 0.8), pointb=(0.95, 0.8), # top-right - style='modern', + value=xmax, + title="X Clip", + pointa=(0.8, 0.8), + pointb=(0.95, 0.8), # top-right + style="modern", ) pl.add_slider_widget( lambda value: update_clip(value, "y"), [ylo, yhi], - value=ymax, title="Y Clip", - pointa=(0.8, 0.6), pointb=(0.95, 0.6), # middle-right - style='modern', + value=ymax, + title="Y Clip", + pointa=(0.8, 0.6), + pointb=(0.95, 0.6), # middle-right + style="modern", ) pl.add_slider_widget( lambda value: update_clip(value, "z"), [zlo, zhi], - value=zmax, title="Z Clip", - pointa=(0.8, 0.4), pointb=(0.95, 0.4), # lower-right - style='modern', + value=zmax, + title="Z Clip", + pointa=(0.8, 0.4), + pointb=(0.95, 0.4), # lower-right + style="modern", ) # Camera orientation - pl.camera_position = 'zx' + pl.camera_position = "zx" pl.camera.azimuth += 30 pl.camera.elevation += 30 - pl.set_background('mistyrose', top='white') - try: pl.add_logo_widget('../docs/img/wakis-logo-pink.png') - except: pass + pl.set_background("mistyrose", top="white") + try: + pl.add_logo_widget("../docs/img/wakis-logo-pink.png") + except (FileNotFoundError, OSError): + pass pl.add_axes() pl.enable_3_lights() pl.enable_anti_aliasing() if bounding_box: - pl.add_mesh(pv.Box(bounds=(xlo, xhi, ylo, yhi, zlo, zhi)), - style="wireframe", color="black", line_width=2, name="domain_box") + pl.add_mesh( + pv.Box(bounds=(xlo, xhi, ylo, yhi, zlo, zhi)), + style="wireframe", + color="black", + line_width=2, + name="domain_box", + ) if handles: return pl if not show: - pl.export_html(f'field.html') + pl.export_html("field.html") else: pl.show() diff --git a/wakis/field_monitors.py b/wakis/field_monitors.py index 39c9849..45da5c5 100644 --- a/wakis/field_monitors.py +++ b/wakis/field_monitors.py @@ -7,11 +7,15 @@ import numpy as np from typing import Sequence from wakis.field import Field +import importlib.util -try: +if importlib.util.find_spec("cupy") is not None: import cupy as xp_gpu + imported_cupy = True -except ImportError: + +else: + xp_gpu = None imported_cupy = False @@ -27,12 +31,13 @@ class FieldMonitor: shape (tuple): Shape of the field (Nx, Ny, Nz). xp (module): Backend array library (NumPy or CuPy). """ + def __init__(self, frequencies: Sequence[float]): """ - Args: - frequencies (Sequence[float]): Frequencies at which to monitor the field (in Hz). - should be pre-computed. - """ + Args: + frequencies (Sequence[float]): Frequencies at which to monitor the field (in Hz). + should be pre-computed. + """ self.frequencies = np.array(frequencies) self.time_index = 0 self.dt = None @@ -42,7 +47,6 @@ def __init__(self, frequencies: Sequence[float]): self.shape = None self.xp = None - def update(self, E: Field, dt: float): """ Updates field accumulators with new field snapshot at the current time. @@ -65,9 +69,9 @@ def update(self, E: Field, dt: float): t = self.time_index * self.dt - Ex = E.to_matrix('x') #E.array[0:E.N] - Ey = E.to_matrix('y') - Ez = E.to_matrix('z') + Ex = E.to_matrix("x") # E.array[0:E.N] + Ey = E.to_matrix("y") + Ez = E.to_matrix("z") for i, f in enumerate(self.frequencies): phase = self.xp.exp(-2j * self.xp.pi * f * t) @@ -81,8 +85,4 @@ def get_components(self): """ Returns the accumulated frequency-domain field components. """ - return { - 'Ex': self.Ex_acc, - 'Ey': self.Ey_acc, - 'Ez': self.Ez_acc - } + return {"Ex": self.Ex_acc, "Ey": self.Ey_acc, "Ez": self.Ez_acc} diff --git a/wakis/geometry.py b/wakis/geometry.py index a691fb0..ea6b04c 100644 --- a/wakis/geometry.py +++ b/wakis/geometry.py @@ -5,6 +5,7 @@ import re + def extract_colors_from_stp(stp_file): """ Extracts a mapping from solid names to RGB color values from a STEP (.stp) file. @@ -23,7 +24,7 @@ def extract_colors_from_stp(stp_file): color_pattern = re.compile(r"#\d+=COLOUR_RGB\('?',([\d.]+),([\d.]+),([\d.]+)\);") # Extract colors - with open(stp_file, 'r', encoding='utf-8', errors='ignore') as f: + with open(stp_file, "r", encoding="utf-8", errors="ignore") as f: for line in f: color_match = color_pattern.search(line) if color_match: @@ -35,11 +36,12 @@ def extract_colors_from_stp(stp_file): # Map solids to colors by order of appearance (colors >=solids) for i in range(len(list(solids.keys()))): solid = solids[list(solids.keys())[i]] - solid_re = re.sub(r'[^a-zA-Z0-9_-]', '-', solid) - stl_colors[f'{str(i).zfill(3)}_{solid_re}'] = colors[i] + solid_re = re.sub(r"[^a-zA-Z0-9_-]", "-", solid) + stl_colors[f"{str(i).zfill(3)}_{solid_re}"] = colors[i] return stl_colors + def extract_materials_from_stp(stp_file): """ Extracts a mapping from solid names to materials from a STEP (.stp) file. @@ -58,27 +60,28 @@ def extract_materials_from_stp(stp_file): try: mat = materials[list(solids.keys())[i]].lower() except KeyError: - print(f'Solid #{list(solids.keys())[i]} has no assigned material') - mat = 'None' + print(f"Solid #{list(solids.keys())[i]} has no assigned material") + mat = "None" # Remove problematic characters - solid_re = re.sub(r'[^a-zA-Z0-9_-]', '-', solid) - mat_re = re.sub(r'[^a-zA-Z0-9_-]', '-', mat) - stl_materials[f'{str(i).zfill(3)}_{solid_re}'] = mat_re + solid_re = re.sub(r"[^a-zA-Z0-9_-]", "-", solid) + mat_re = re.sub(r"[^a-zA-Z0-9_-]", "-", mat) + stl_materials[f"{str(i).zfill(3)}_{solid_re}"] = mat_re return stl_materials + def extract_solids_from_stp(stp_file, path=None): - ''' - Extracts a mapping from solid names to STL file names from a STEP (.stp) file. + """ + Extracts a mapping from solid names to STL file names from a STEP (.stp) file. Args: stp_file (str): Path to the STEP file. path (str) (optional): default: None, path to save the STL (.stl) files Returns: dict[str, str]: A dictionary mapping solid names to STL file names. - ''' - if path is not None and not path.endswith('/'): - path += '/' + """ + if path is not None and not path.endswith("/"): + path += "/" solids, materials = extract_names_from_stp(stp_file) stl_solids = {} for i in range(len(list(solids.keys()))): @@ -86,20 +89,21 @@ def extract_solids_from_stp(stp_file, path=None): try: mat = materials[list(solids.keys())[i]] except KeyError: - print(f'Solid #{list(solids.keys())[i]} has no assigned material') - mat = 'None' + print(f"Solid #{list(solids.keys())[i]} has no assigned material") + mat = "None" # Remove problematic characters - solid_re = re.sub(r'[^a-zA-Z0-9_-]', '-', solid) - mat_re = re.sub(r'[^a-zA-Z0-9_-]', '-', mat) - name = f'{str(i).zfill(3)}_{solid_re}_{mat_re}' + solid_re = re.sub(r"[^a-zA-Z0-9_-]", "-", solid) + mat_re = re.sub(r"[^a-zA-Z0-9_-]", "-", mat) + name = f"{str(i).zfill(3)}_{solid_re}_{mat_re}" if path is not None: - stl_solids[f'{str(i).zfill(3)}_{solid_re}'] = path + name + '.stl' + stl_solids[f"{str(i).zfill(3)}_{solid_re}"] = path + name + ".stl" else: - stl_solids[f'{str(i).zfill(3)}_{solid_re}'] = name + '.stl' + stl_solids[f"{str(i).zfill(3)}_{solid_re}"] = name + ".stl" return stl_solids + def extract_names_from_stp(stp_file): """ Extracts solid names and their corresponding materials from a STEP (.stp) file. @@ -127,33 +131,42 @@ def extract_names_from_stp(stp_file): material_dict = {} # Compile regex patterns - #solid_pattern = re.compile(r"#(\d+)=MANIFOLD_SOLID_BREP\('([^']+)'.*;") - solid_pattern = re.compile(r"#(\d+)=ADVANCED_BREP_SHAPE_REPRESENTATION\('([^']*)',\(([^)]*)\),#\d+\);") - material_pattern = re.compile(r"#(\d+)=PRESENTATION_LAYER_ASSIGNMENT\('([^']+)','[^']+',\(#([\d#,]+)\)\);") + # solid_pattern = re.compile(r"#(\d+)=MANIFOLD_SOLID_BREP\('([^']+)'.*;") + solid_pattern = re.compile( + r"#(\d+)=ADVANCED_BREP_SHAPE_REPRESENTATION\('([^']*)',\(([^)]*)\),#\d+\);" + ) + material_pattern = re.compile( + r"#(\d+)=PRESENTATION_LAYER_ASSIGNMENT\('([^']+)','[^']+',\(#([\d#,]+)\)\);" + ) # First pass: extract solids - with open(stp_file, 'r', encoding='utf-8', errors='ignore') as f: + with open(stp_file, "r", encoding="utf-8", errors="ignore") as f: for line in f: solid_match = solid_pattern.search(line) if solid_match: - #solid_number = int(solid_match.group(1)) #if MANIFOLD - solid_number = int(solid_match.group(3).split(',')[0].strip().lstrip('#')) + # solid_number = int(solid_match.group(1)) #if MANIFOLD + solid_number = int( + solid_match.group(3).split(",")[0].strip().lstrip("#") + ) solid_name = solid_match.group(2) solid_dict[solid_number] = solid_name # Second pass: extract materials - with open(stp_file, 'r', encoding='utf-8', errors='ignore') as f: + with open(stp_file, "r", encoding="utf-8", errors="ignore") as f: for line in f: material_match = material_pattern.search(line) if material_match: material_name = material_match.group(2) - solid_numbers = [int(num.strip("#")) for num in material_match.group(3).split(',')] + solid_numbers = [ + int(num.strip("#")) for num in material_match.group(3).split(",") + ] for solid_number in solid_numbers: if solid_number in solid_dict: material_dict[solid_number] = material_name return solid_dict, material_dict + def get_stp_unit_scale(stp_file): """ Reads the unit definition from a STEP (.stp or .step) file and determines the @@ -174,11 +187,11 @@ def get_stp_unit_scale(stp_file): """ unit_map = { - ".MILLI.": 1e-3, - ".CENTI.": 1e-2, - ".DECI.": 1e-1, - ".KILO.": 1e3, - "$": 1.0, # '$' indicates no prefix, i.e. plain meters + ".MILLI.": 1e-3, + ".CENTI.": 1e-2, + ".DECI.": 1e-1, + ".KILO.": 1e3, + "$": 1.0, # '$' indicates no prefix, i.e. plain meters } try: @@ -206,6 +219,7 @@ def get_stp_unit_scale(stp_file): return 1.0 + def generate_stl_solids_from_stp(stp_file, results_path=None): """ Extracts solid objects from a STEP (.stp) file and exports them as STL files. @@ -233,13 +247,13 @@ def generate_stl_solids_from_stp(stp_file, results_path=None): try: import cadquery as cq except ImportError: - raise Exception('''This function needs the open-source package `cadquery` + raise Exception("""This function needs the open-source package `cadquery` To install it in a conda environment do: `pip install cadquery` [!] We recommend having a dedicated conda environment to avoid version issues - ''') + """) stp = cq.importers.importStep(stp_file) @@ -258,4 +272,3 @@ def generate_stl_solids_from_stp(stp_file, results_path=None): obj.exportStl(name) return solid_dict - diff --git a/wakis/grid2D.py b/wakis/grid2D.py index 6d8e8e8..6c3163e 100644 --- a/wakis/grid2D.py +++ b/wakis/grid2D.py @@ -1,31 +1,31 @@ import numpy as np from numba import jit -import numba + def seg_length(x_1, y_1, x_2, y_2): return np.linalg.norm(np.array([x_1 - x_2, y_1 - y_2])) -@jit('b1(f8, f8)', nopython=True) + +@jit("b1(f8, f8)", nopython=True) def eq(a, b): tol = 1e-8 return abs(a - b) < tol -@jit('b1(f8, f8)', nopython=True) + +@jit("b1(f8, f8)", nopython=True) def neq(a, b): - tol = 1e-8 return not eq(a, b) class Grid2D: - """ - Class holding the grid info and the routines for cell extensions. - Constructor arguments: - - xmin,xmax,ymin,ymax: extent of the domain. - - nx, ny: number of cells per direction - - conductors: conductor object - - sol_type: type of solver. 'FDTD' for staircased FDTD, 'DM' for Conformal Dey-Mittra FDTD, - 'ECT' for Extended Cell Technique conformal FDTD + Class holding the grid info and the routines for cell extensions. + Constructor arguments: + - xmin,xmax,ymin,ymax: extent of the domain. + - nx, ny: number of cells per direction + - conductors: conductor object + - sol_type: type of solver. 'FDTD' for staircased FDTD, 'DM' for Conformal Dey-Mittra FDTD, + 'ECT' for Extended Cell Technique conformal FDTD """ def __init__(self, xmin, xmax, ymin, ymax, nx, ny, conductors, sol_type): @@ -53,38 +53,90 @@ def __init__(self, xmin, xmax, ymin, ymax, nx, ny, conductors, sol_type): self.flag_intr_cell = np.zeros((nx, ny), dtype=bool) self.broken = np.zeros((self.nx, self.ny), dtype=bool) - if (sol_type is not 'FDTD') and (sol_type is not 'DM') and (sol_type is not 'ECT'): - raise ValueError("sol_type must be:\n" + - "\t'FDTD' for standard staircased FDTD\n" + - "\t'DM' for Dey-Mittra conformal FDTD\n" + - "\t'ECT' for Enlarged Cell Technique conformal FDTD") - - if sol_type is 'DM' or sol_type is 'FDTD': - self.compute_edges(in_conductor=self.conductors.in_conductor, - intersec_x=self.conductors.intersec_x, - intersec_y=self.conductors.intersec_y, l_x=self.l_x, l_y=self.l_y, - dx=self.dx, dy=self.dy, nx=self.nx, ny=self.ny, xmin=self.xmin, - ymin=self.ymin) - compute_areas(l_x=self.l_x, l_y=self.l_y, S=self.S, S_red=self.S_red, nx=self.nx, - ny=self.ny, dx=self.dx, dy=self.dy) - mark_cells(l_x=self.l_x, l_y=self.l_y, nx=self.nx, ny=self.ny, dx=self.dx, - dy=self.dy, S=self.S, flag_int_cell=self.flag_int_cell, - S_stab=self.S_stab, flag_unst_cell=self.flag_unst_cell, - flag_bound_cell=self.flag_bound_cell, - flag_avail_cell=self.flag_avail_cell) - elif sol_type is 'ECT': - self.compute_edges(in_conductor=self.conductors.in_conductor, - intersec_x=self.conductors.intersec_x, - intersec_y=self.conductors.intersec_y, l_x=self.l_x, l_y=self.l_y, - dx=self.dx, dy=self.dy, nx=self.nx, ny=self.ny, xmin=self.xmin, - ymin=self.ymin) - compute_areas(l_x=self.l_x, l_y=self.l_y, S=self.S, S_red=self.S_red, nx=self.nx, - ny=self.ny, dx=self.dx, dy=self.dy) - mark_cells(l_x=self.l_x, l_y=self.l_y, nx=self.nx, ny=self.ny, dx=self.dx, - dy=self.dy, S=self.S, flag_int_cell=self.flag_int_cell, - S_stab=self.S_stab, flag_unst_cell=self.flag_unst_cell, - flag_bound_cell=self.flag_bound_cell, - flag_avail_cell=self.flag_avail_cell) + if (sol_type != "FDTD") and (sol_type != "DM") and (sol_type != "ECT"): + raise ValueError( + "sol_type must be:\n" + + "\t'FDTD' for standard staircased FDTD\n" + + "\t'DM' for Dey-Mittra conformal FDTD\n" + + "\t'ECT' for Enlarged Cell Technique conformal FDTD" + ) + + if sol_type == "DM" or sol_type == "FDTD": + self.compute_edges( + in_conductor=self.conductors.in_conductor, + intersec_x=self.conductors.intersec_x, + intersec_y=self.conductors.intersec_y, + l_x=self.l_x, + l_y=self.l_y, + dx=self.dx, + dy=self.dy, + nx=self.nx, + ny=self.ny, + xmin=self.xmin, + ymin=self.ymin, + ) + compute_areas( + l_x=self.l_x, + l_y=self.l_y, + S=self.S, + S_red=self.S_red, + nx=self.nx, + ny=self.ny, + dx=self.dx, + dy=self.dy, + ) + mark_cells( + l_x=self.l_x, + l_y=self.l_y, + nx=self.nx, + ny=self.ny, + dx=self.dx, + dy=self.dy, + S=self.S, + flag_int_cell=self.flag_int_cell, + S_stab=self.S_stab, + flag_unst_cell=self.flag_unst_cell, + flag_bound_cell=self.flag_bound_cell, + flag_avail_cell=self.flag_avail_cell, + ) + elif sol_type == "ECT": + self.compute_edges( + in_conductor=self.conductors.in_conductor, + intersec_x=self.conductors.intersec_x, + intersec_y=self.conductors.intersec_y, + l_x=self.l_x, + l_y=self.l_y, + dx=self.dx, + dy=self.dy, + nx=self.nx, + ny=self.ny, + xmin=self.xmin, + ymin=self.ymin, + ) + compute_areas( + l_x=self.l_x, + l_y=self.l_y, + S=self.S, + S_red=self.S_red, + nx=self.nx, + ny=self.ny, + dx=self.dx, + dy=self.dy, + ) + mark_cells( + l_x=self.l_x, + l_y=self.l_y, + nx=self.nx, + ny=self.ny, + dx=self.dx, + dy=self.dy, + S=self.S, + flag_int_cell=self.flag_int_cell, + S_stab=self.S_stab, + flag_unst_cell=self.flag_unst_cell, + flag_bound_cell=self.flag_bound_cell, + flag_avail_cell=self.flag_avail_cell, + ) # info about intruded cells (i,j,[(i_borrowing,j_borrowing,area_borrowing, )]) self.borrowing = np.empty((nx, ny), dtype=object) @@ -92,13 +144,20 @@ def __init__(self, xmin, xmax, ymin, ymax, nx, ny, conductors, sol_type): for j in range(ny): self.borrowing[i, j] = [] self.flag_ext_cell = self.flag_unst_cell.copy() - self.compute_extensions(nx=nx, ny=ny, S=self.S, flag_int_cell=self.flag_int_cell, - S_stab=self.S_stab, S_enl=self.S_enl, S_red=self.S_red, - flag_unst_cell=self.flag_unst_cell, - flag_avail_cell=self.flag_avail_cell, - flag_ext_cell=self.flag_ext_cell, - flag_intr_cell=self.flag_intr_cell, - borrowing=self.borrowing) + self.compute_extensions( + nx=nx, + ny=ny, + S=self.S, + flag_int_cell=self.flag_int_cell, + S_stab=self.S_stab, + S_enl=self.S_enl, + S_red=self.S_red, + flag_unst_cell=self.flag_unst_cell, + flag_avail_cell=self.flag_avail_cell, + flag_ext_cell=self.flag_ext_cell, + flag_intr_cell=self.flag_intr_cell, + borrowing=self.borrowing, + ) """ Function to compute the length of the edges of the conformal grid. @@ -107,19 +166,31 @@ def __init__(self, xmin, xmax, ymin, ymax, nx, ny, conductors, sol_type): """ @staticmethod - def compute_edges(tol=1e-8, in_conductor=None, intersec_x=None, intersec_y=None, l_x=None, - l_y=None, dx=None, dy=None, nx=None, ny=None, xmin=None, ymin=None): + def compute_edges( + tol=1e-8, + in_conductor=None, + intersec_x=None, + intersec_y=None, + l_x=None, + l_y=None, + dx=None, + dy=None, + nx=None, + ny=None, + xmin=None, + ymin=None, + ): """ - Notation: - - (x_3, y_3)----- l_x[i, j + 1] --------- - | | - | | - l_y[i, j] (i, j) l_y[i + 1, j] - | | - | | - (x_1, y_1)------- l_x[i, j] -------(x_2, y_2) - + Notation: + + (x_3, y_3)----- l_x[i, j + 1] --------- + | | + | | + l_y[i, j] (i, j) l_y[i + 1, j] + | | + | | + (x_1, y_1)------- l_x[i, j] -------(x_2, y_2) + """ for ii in range(nx): for jj in range(ny + 1): @@ -168,19 +239,19 @@ def compute_edges(tol=1e-8, in_conductor=None, intersec_x=None, intersec_y=None, l_y[ii, jj] = dy # set to zero the length of very small cells - if tol > 0.: + if tol > 0.0: l_x /= dx l_y /= dy low_values_flags = abs(l_x) < tol - high_values_flags = abs(l_x - 1.) < tol + high_values_flags = abs(l_x - 1.0) < tol l_x[low_values_flags] = 0 - l_x[high_values_flags] = 1. + l_x[high_values_flags] = 1.0 low_values_flags = abs(l_y) < tol - high_values_flags = abs(l_y - 1.) < tol + high_values_flags = abs(l_y - 1.0) < tol l_y[low_values_flags] = 0 - l_y[high_values_flags] = 1. + l_y[high_values_flags] = 1.0 l_x *= dx l_y *= dy @@ -190,32 +261,46 @@ def compute_edges(tol=1e-8, in_conductor=None, intersec_x=None, intersec_y=None, """ @staticmethod - def compute_extensions(nx=None, ny=None, S=None, flag_int_cell=None, - S_stab=None, S_enl=None, S_red=None, - flag_unst_cell=None, - flag_avail_cell=None, - flag_ext_cell=None, - flag_intr_cell = None, - borrowing=None, l_verbose=True, - kk=0): - + def compute_extensions( + nx=None, + ny=None, + S=None, + flag_int_cell=None, + S_stab=None, + S_enl=None, + S_red=None, + flag_unst_cell=None, + flag_avail_cell=None, + flag_ext_cell=None, + flag_intr_cell=None, + borrowing=None, + l_verbose=True, + kk=0, + ): N = np.sum(flag_ext_cell) if l_verbose: print(kk) - print('ext cells: %d' % N) + print("ext cells: %d" % N) # Do the simple one-cell extension - Grid2D._compute_extensions_one_cell(nx=nx, ny=ny, S=S, S_stab=S_stab, S_enl=S_enl, - S_red=S_red, flag_avail_cell=flag_avail_cell, - flag_ext_cell=flag_ext_cell, - flag_intr_cell=flag_intr_cell, - borrowing=borrowing) - - N_one_cell = (N - np.sum(flag_ext_cell)) + Grid2D._compute_extensions_one_cell( + nx=nx, + ny=ny, + S=S, + S_stab=S_stab, + S_enl=S_enl, + S_red=S_red, + flag_avail_cell=flag_avail_cell, + flag_ext_cell=flag_ext_cell, + flag_intr_cell=flag_intr_cell, + borrowing=borrowing, + ) + + N_one_cell = N - np.sum(flag_ext_cell) if l_verbose: - print('one cell exts: %d' % N_one_cell) + print("one cell exts: %d" % N_one_cell) # If any cell could not be extended do the four-cell extension - ''' + """ if np.sum(flag_ext_cell) > 0: N = np.sum(flag_ext_cell) Grid2D._compute_extensions_four_cells(nx=nx, ny=ny, S=S, flag_int_cell=flag_int_cell, @@ -228,97 +313,137 @@ def compute_extensions(nx=None, ny=None, S=None, flag_int_cell=None, N_four_cells = (N - np.sum(flag_ext_cell)) if 1: #l_verbose: print('four cell exts: %d' % N_four_cells) - ''' + """ # If any cell could not be extended do the eight-cell extension if np.sum(flag_ext_cell) > 0: N = np.sum(flag_ext_cell) - Grid2D._compute_extensions_eight_cells(nx=nx, ny=ny, S=S, flag_int_cell=flag_int_cell, - S_stab=S_stab, S_enl=S_enl, S_red=S_red, - flag_unst_cell=flag_unst_cell, - flag_avail_cell=flag_avail_cell, - flag_ext_cell=flag_ext_cell, - flag_intr_cell=flag_intr_cell, - borrowing=borrowing) - N_eight_cells = (N - np.sum(flag_ext_cell)) - if 1: #l_verbose: - print('eight cell exts: %d' % N_eight_cells) + Grid2D._compute_extensions_eight_cells( + nx=nx, + ny=ny, + S=S, + flag_int_cell=flag_int_cell, + S_stab=S_stab, + S_enl=S_enl, + S_red=S_red, + flag_unst_cell=flag_unst_cell, + flag_avail_cell=flag_avail_cell, + flag_ext_cell=flag_ext_cell, + flag_intr_cell=flag_intr_cell, + borrowing=borrowing, + ) + N_eight_cells = N - np.sum(flag_ext_cell) + if 1: # l_verbose: + print("eight cell exts: %d" % N_eight_cells) # If any cell could not be extended the algorithm failed if np.sum(flag_ext_cell) > 0: - N = (np.sum(flag_ext_cell)) - raise RuntimeError(str(N) + ' cells could not be extended.\n' + - 'Please refine the mesh') + N = np.sum(flag_ext_cell) + raise RuntimeError( + str(N) + " cells could not be extended.\n" + "Please refine the mesh" + ) """ Function to compute the one-cell extension of the unstable cells """ @staticmethod - def _compute_extensions_one_cell(nx=None, ny=None, S=None, - S_stab=None, S_enl=None, S_red=None, flag_avail_cell=None, - flag_ext_cell=None, flag_intr_cell=None, borrowing=None): - + def _compute_extensions_one_cell( + nx=None, + ny=None, + S=None, + S_stab=None, + S_enl=None, + S_red=None, + flag_avail_cell=None, + flag_ext_cell=None, + flag_intr_cell=None, + borrowing=None, + ): for ii in range(0, nx): for jj in range(0, ny): if flag_ext_cell[ii, jj]: S_ext = S_stab[ii, jj] - S[ii, jj] - if (S[ii - 1, jj] > S_ext and flag_avail_cell[ii - 1, jj]): + if S[ii - 1, jj] > S_ext and flag_avail_cell[ii - 1, jj]: denom = S[ii - 1, jj] patch = S_ext * S[ii - 1, jj] / denom if S_red[ii - 1, jj] - patch > 0: S_red[ii - 1, jj] -= patch borrowing[ii, jj].append([ii - 1, jj, patch, None]) - flag_intr_cell[ii-1, jj] = True + flag_intr_cell[ii - 1, jj] = True S_enl[ii, jj] = S[ii, jj] + patch flag_ext_cell[ii, jj] = False - if (S[ii, jj - 1] > S_ext and flag_avail_cell[ii, jj - 1] and flag_ext_cell[ii, jj]): + if ( + S[ii, jj - 1] > S_ext + and flag_avail_cell[ii, jj - 1] + and flag_ext_cell[ii, jj] + ): denom = S[ii, jj - 1] patch = S_ext * S[ii, jj - 1] / denom if S_red[ii, jj - 1] - patch > 0: S_red[ii, jj - 1] -= patch borrowing[ii, jj].append([ii, jj - 1, patch, None]) - flag_intr_cell[ii, jj-1] = True + flag_intr_cell[ii, jj - 1] = True S_enl[ii, jj] = S[ii, jj] + patch flag_ext_cell[ii, jj] = False - if (S[ii, jj + 1] > S_ext and flag_avail_cell[ii, jj + 1] - and flag_ext_cell[ii, jj]): + if ( + S[ii, jj + 1] > S_ext + and flag_avail_cell[ii, jj + 1] + and flag_ext_cell[ii, jj] + ): denom = S[ii, jj + 1] patch = S_ext * S[ii, jj + 1] / denom if S_red[ii, jj + 1] - patch > 0: S_red[ii, jj + 1] -= patch borrowing[ii, jj].append([ii, jj + 1, patch, None]) - flag_intr_cell[ii, jj+1] = True + flag_intr_cell[ii, jj + 1] = True S_enl[ii, jj] = S[ii, jj] + patch flag_ext_cell[ii, jj] = False - if (S[ii + 1, jj] > S_ext and flag_avail_cell[ii + 1, jj] - and flag_ext_cell[ii, jj]): + if ( + S[ii + 1, jj] > S_ext + and flag_avail_cell[ii + 1, jj] + and flag_ext_cell[ii, jj] + ): denom = S[ii + 1, jj] patch = S_ext * S[ii + 1, jj] / denom if S_red[ii + 1, jj] - patch > 0: S_red[ii + 1, jj] -= patch borrowing[ii, jj].append([ii + 1, jj, patch, None]) - flag_intr_cell[ii+1, jj] = True + flag_intr_cell[ii + 1, jj] = True S_enl[ii, jj] = S[ii, jj] + patch flag_ext_cell[ii, jj] = False - """ Function to compute the four-cell extension of the unstable cells """ @staticmethod - def _compute_extensions_four_cells(nx=None, ny=None, S=None, flag_int_cell=None, - S_stab=None, S_enl=None, S_red=None, flag_unst_cell=None, - flag_avail_cell=None, flag_ext_cell=None, - flag_intr_cell=None, borrowing=None): + def _compute_extensions_four_cells( + nx=None, + ny=None, + S=None, + flag_int_cell=None, + S_stab=None, + S_enl=None, + S_red=None, + flag_unst_cell=None, + flag_avail_cell=None, + flag_ext_cell=None, + flag_intr_cell=None, + borrowing=None, + ): for ii in range(0, nx): for jj in range(0, ny): local_avail = flag_avail_cell.copy() - if (flag_unst_cell[ii, jj] and flag_int_cell[ii, jj] - and flag_ext_cell[ii, jj]): - denom = ((flag_avail_cell[ii - 1, jj]) * S[ii - 1, jj] + ( - flag_avail_cell[ii + 1, jj]) * S[ii + 1, jj] + - (flag_avail_cell[ii, jj - 1]) * S[ii, jj - 1] + ( - flag_avail_cell[ii, jj + 1]) * S[ii, jj + 1]) + if ( + flag_unst_cell[ii, jj] + and flag_int_cell[ii, jj] + and flag_ext_cell[ii, jj] + ): + denom = ( + (flag_avail_cell[ii - 1, jj]) * S[ii - 1, jj] + + (flag_avail_cell[ii + 1, jj]) * S[ii + 1, jj] + + (flag_avail_cell[ii, jj - 1]) * S[ii, jj - 1] + + (flag_avail_cell[ii, jj + 1]) * S[ii, jj + 1] + ) S_ext = S_stab[ii, jj] - S[ii, jj] neg_cell = True # idea: if any cell would reach negative area it is locally not available. @@ -346,10 +471,12 @@ def _compute_extensions_four_cells(nx=None, ny=None, S=None, flag_int_cell=None, if S_red[ii, jj + 1] - patch <= 0: neg_cell = True local_avail[ii, jj + 1] = False - denom = ((local_avail[ii - 1, jj]) * S[ii - 1, jj] + - (local_avail[ii + 1, jj]) * S[ii + 1, jj] + - (local_avail[ii, jj - 1]) * S[ii, jj - 1] + - (local_avail[ii, jj + 1]) * S[ii, jj + 1]) + denom = ( + (local_avail[ii - 1, jj]) * S[ii - 1, jj] + + (local_avail[ii + 1, jj]) * S[ii + 1, jj] + + (local_avail[ii, jj - 1]) * S[ii, jj - 1] + + (local_avail[ii, jj + 1]) * S[ii, jj + 1] + ) # If possible, do 4-cell extension if denom >= S_ext: @@ -357,25 +484,25 @@ def _compute_extensions_four_cells(nx=None, ny=None, S=None, flag_int_cell=None, if local_avail[ii - 1, jj]: patch = S_ext * S[ii - 1, jj] / denom borrowing[ii, jj].append([ii - 1, jj, patch, None]) - flag_intr_cell[ii-1, jj] = True + flag_intr_cell[ii - 1, jj] = True S_enl[ii, jj] += patch S_red[ii - 1, jj] -= patch if local_avail[ii + 1, jj]: patch = S_ext * S[ii + 1, jj] / denom borrowing[ii, jj].append([ii + 1, jj, patch, None]) - flag_intr_cell[ii+1, jj] = True + flag_intr_cell[ii + 1, jj] = True S_enl[ii, jj] += patch S_red[ii + 1, jj] -= patch if local_avail[ii, jj - 1]: patch = S_ext * S[ii, jj - 1] / denom borrowing[ii, jj].append([ii, jj - 1, patch, None]) - flag_intr_cell[ii, jj-1] = True + flag_intr_cell[ii, jj - 1] = True S_enl[ii, jj] += patch S_red[ii, jj - 1] -= patch if local_avail[ii, jj + 1]: patch = S_ext * S[ii, jj + 1] / denom borrowing[ii, jj].append([ii, jj + 1, patch, None]) - flag_intr_cell[ii, jj+1] = True + flag_intr_cell[ii, jj + 1] = True S_enl[ii, jj] += patch S_red[ii, jj + 1] -= patch @@ -386,26 +513,41 @@ def _compute_extensions_four_cells(nx=None, ny=None, S=None, flag_int_cell=None, """ @staticmethod - def _compute_extensions_eight_cells(nx=None, ny=None, S=None, flag_int_cell=None, - S_stab=None, S_enl=None, S_red=None, flag_unst_cell=None, - flag_avail_cell=None, flag_ext_cell=None, - flag_intr_cell=None, borrowing=None): + def _compute_extensions_eight_cells( + nx=None, + ny=None, + S=None, + flag_int_cell=None, + S_stab=None, + S_enl=None, + S_red=None, + flag_unst_cell=None, + flag_avail_cell=None, + flag_ext_cell=None, + flag_intr_cell=None, + borrowing=None, + ): for ii in range(0, nx): for jj in range(0, ny): local_avail = flag_avail_cell.copy() - if (flag_unst_cell[ii, jj] and flag_int_cell[ii, jj] - and flag_ext_cell[ii, jj]): + if ( + flag_unst_cell[ii, jj] + and flag_int_cell[ii, jj] + and flag_ext_cell[ii, jj] + ): S_enl[ii, jj] = S[ii, jj] S_ext = S_stab[ii, jj] - S[ii, jj] - denom = ((flag_avail_cell[ii - 1, jj]) * S[ii - 1, jj] + - (flag_avail_cell[ii + 1, jj]) * S[ii + 1, jj] + - (flag_avail_cell[ii, jj - 1]) * S[ii, jj - 1] + - (flag_avail_cell[ii, jj + 1]) * S[ii, jj + 1] + - (flag_avail_cell[ii - 1, jj - 1]) * S[ii - 1, jj - 1] + - (flag_avail_cell[ii + 1, jj - 1]) * S[ii + 1, jj - 1] + - (flag_avail_cell[ii - 1, jj + 1]) * S[ii - 1, jj + 1] + - (flag_avail_cell[ii + 1, jj + 1]) * S[ii + 1, jj + 1]) + denom = ( + (flag_avail_cell[ii - 1, jj]) * S[ii - 1, jj] + + (flag_avail_cell[ii + 1, jj]) * S[ii + 1, jj] + + (flag_avail_cell[ii, jj - 1]) * S[ii, jj - 1] + + (flag_avail_cell[ii, jj + 1]) * S[ii, jj + 1] + + (flag_avail_cell[ii - 1, jj - 1]) * S[ii - 1, jj - 1] + + (flag_avail_cell[ii + 1, jj - 1]) * S[ii + 1, jj - 1] + + (flag_avail_cell[ii - 1, jj + 1]) * S[ii - 1, jj + 1] + + (flag_avail_cell[ii + 1, jj + 1]) * S[ii + 1, jj + 1] + ) neg_cell = True while denom >= S_ext and neg_cell: @@ -451,72 +593,77 @@ def _compute_extensions_eight_cells(nx=None, ny=None, S=None, flag_int_cell=None neg_cell = True local_avail[ii + 1, jj + 1] = False - denom = ((local_avail[ii - 1, jj]) * S[ii - 1, jj] + - (local_avail[ii + 1, jj]) * S[ii + 1, jj] + - (local_avail[ii, jj - 1]) * S[ii, jj - 1] + - (local_avail[ii, jj + 1]) * S[ii, jj + 1] + - (local_avail[ii - 1, jj - 1]) * S[ii - 1, jj - 1] + - (local_avail[ii + 1, jj - 1]) * S[ii + 1, jj - 1] + - (local_avail[ii - 1, jj + 1]) * S[ii - 1, jj + 1] + - (local_avail[ii + 1, jj + 1]) * S[ii + 1, jj + 1]) + denom = ( + (local_avail[ii - 1, jj]) * S[ii - 1, jj] + + (local_avail[ii + 1, jj]) * S[ii + 1, jj] + + (local_avail[ii, jj - 1]) * S[ii, jj - 1] + + (local_avail[ii, jj + 1]) * S[ii, jj + 1] + + (local_avail[ii - 1, jj - 1]) * S[ii - 1, jj - 1] + + (local_avail[ii + 1, jj - 1]) * S[ii + 1, jj - 1] + + (local_avail[ii - 1, jj + 1]) * S[ii - 1, jj + 1] + + (local_avail[ii + 1, jj + 1]) * S[ii + 1, jj + 1] + ) if denom >= S_ext: S_enl[ii, jj] = S[ii, jj] if local_avail[ii - 1, jj]: patch = S_ext * S[ii - 1, jj] / denom borrowing[ii, jj].append([ii - 1, jj, patch, None]) - flag_intr_cell[ii-1, jj] = True + flag_intr_cell[ii - 1, jj] = True S_enl[ii, jj] += patch S_red[ii - 1, jj] -= patch if local_avail[ii + 1, jj]: patch = S_ext * S[ii + 1, jj] / denom borrowing[ii, jj].append([ii + 1, jj, patch, None]) - flag_intr_cell[ii+1, jj] = True + flag_intr_cell[ii + 1, jj] = True S_enl[ii, jj] += patch S_red[ii + 1, jj] -= patch if local_avail[ii, jj - 1]: patch = S_ext * S[ii, jj - 1] / denom borrowing[ii, jj].append([ii, jj - 1, patch, None]) - flag_intr_cell[ii, jj-1] = True + flag_intr_cell[ii, jj - 1] = True S_enl[ii, jj] += patch S_red[ii, jj - 1] -= patch if local_avail[ii, jj + 1]: patch = S_ext * S[ii, jj + 1] / denom borrowing[ii, jj].append([ii, jj + 1, patch, None]) - flag_intr_cell[ii, jj+1] = True + flag_intr_cell[ii, jj + 1] = True S_enl[ii, jj] += patch S_red[ii, jj + 1] -= patch if local_avail[ii - 1, jj - 1]: patch = S_ext * S[ii - 1, jj - 1] / denom borrowing[ii, jj].append([ii - 1, jj - 1, patch, None]) - flag_intr_cell[ii-1, jj-1] = True + flag_intr_cell[ii - 1, jj - 1] = True S_enl[ii, jj] += patch S_red[ii - 1, jj - 1] -= patch if local_avail[ii + 1, jj - 1]: patch = S_ext * S[ii + 1, jj - 1] / denom borrowing[ii, jj].append([ii + 1, jj - 1, patch, None]) - flag_intr_cell[ii+1, jj-1] = True + flag_intr_cell[ii + 1, jj - 1] = True S_enl[ii, jj] += patch S_red[ii + 1, jj - 1] -= patch if local_avail[ii - 1, jj + 1]: patch = S_ext * S[ii - 1, jj + 1] / denom borrowing[ii, jj].append([ii - 1, jj + 1, patch, None]) - flag_intr_cell[ii-1, jj+1] = True + flag_intr_cell[ii - 1, jj + 1] = True S_enl[ii, jj] += patch S_red[ii - 1, jj + 1] -= patch if local_avail[ii + 1, jj + 1]: patch = S_ext * S[ii + 1, jj + 1] / denom borrowing[ii, jj].append([ii + 1, jj + 1, patch, None]) - flag_intr_cell[ii+1, jj+1] = True + flag_intr_cell[ii + 1, jj + 1] = True S_enl[ii, jj] += patch S_red[ii + 1, jj + 1] -= patch flag_ext_cell[ii, jj] = False + """ Function to compute the area of the cells of the conformal grid. """ -@jit('(f8[:,:], f8[:,:], f8[:,:], f8[:,:], i4, i4, f8, f8)', nopython=True) + + +@jit("(f8[:,:], f8[:,:], f8[:,:], f8[:,:], i4, i4, f8, f8)", nopython=True) def compute_areas(l_x, l_y, S, S_red, nx, ny, dx, dy): # Normalize the grid lengths for robustness l_x /= dx @@ -527,69 +674,158 @@ def compute_areas(l_x, l_y, S, S_red, nx, ny, dx, dy): for jj in range(ny): # If at least 3 edges have full length consider the area as full # (this also takes care of the case in which an edge lies exactly on the boundary) - #count_cane = eq(l_x[ii, jj], 1.0) + eq(l_y[ii, jj], 1.0) + eq(l_x[ii, jj + 1], 1.0) + eq(l_y[ii + 1, jj], 1.0) - if (np.sum(np.array([eq(l_x[ii, jj], 1.0), eq(l_y[ii, jj], 1.0), - eq(l_x[ii, jj + 1], 1.0), eq(l_y[ii + 1, jj], 1.0)])) >= 3): - #if count_cane >=3: + # count_cane = eq(l_x[ii, jj], 1.0) + eq(l_y[ii, jj], 1.0) + eq(l_x[ii, jj + 1], 1.0) + eq(l_y[ii + 1, jj], 1.0) + if ( + np.sum( + np.array( + [ + eq(l_x[ii, jj], 1.0), + eq(l_y[ii, jj], 1.0), + eq(l_x[ii, jj + 1], 1.0), + eq(l_y[ii + 1, jj], 1.0), + ] + ) + ) + >= 3 + ): + # if count_cane >=3: S[ii, jj] = 1.0 - elif (eq(l_x[ii, jj], 0.) and neq(l_y[ii, jj], 0.) - and neq(l_x[ii, jj + 1], 0.) and neq(l_y[ii + 1, jj], 0)): + elif ( + eq(l_x[ii, jj], 0.0) + and neq(l_y[ii, jj], 0.0) + and neq(l_x[ii, jj + 1], 0.0) + and neq(l_y[ii + 1, jj], 0) + ): S[ii, jj] = 0.5 * (l_y[ii, jj] + l_y[ii + 1, jj]) * l_x[ii, jj + 1] - elif (eq(l_x[ii, jj + 1], 0.) and neq(l_y[ii, jj], 0.) - and neq(l_x[ii, jj], 0.) and neq(l_y[ii + 1, jj], 0.)): + elif ( + eq(l_x[ii, jj + 1], 0.0) + and neq(l_y[ii, jj], 0.0) + and neq(l_x[ii, jj], 0.0) + and neq(l_y[ii + 1, jj], 0.0) + ): S[ii, jj] = 0.5 * (l_y[ii, jj] + l_y[ii + 1, jj]) * l_x[ii, jj] - elif (eq(l_y[ii, jj], 0.) and neq(l_x[ii, jj], 0.) - and neq(l_x[ii, jj + 1], 0.) and neq(l_y[ii + 1, jj], 0.)): + elif ( + eq(l_y[ii, jj], 0.0) + and neq(l_x[ii, jj], 0.0) + and neq(l_x[ii, jj + 1], 0.0) + and neq(l_y[ii + 1, jj], 0.0) + ): S[ii, jj] = 0.5 * (l_x[ii, jj] + l_x[ii, jj + 1]) * l_y[ii + 1, jj] - elif (eq(l_y[ii + 1, jj], 0.) and neq(l_x[ii, jj], 0.) and neq(l_y[ii, jj], 0.) - and neq(l_x[ii, jj + 1], 0.)): + elif ( + eq(l_y[ii + 1, jj], 0.0) + and neq(l_x[ii, jj], 0.0) + and neq(l_y[ii, jj], 0.0) + and neq(l_x[ii, jj + 1], 0.0) + ): S[ii, jj] = 0.5 * (l_x[ii, jj] + l_x[ii, jj + 1]) * l_y[ii, jj] - elif (eq(l_x[ii, jj], 0.) and eq(l_y[ii, jj], 0.) - and neq(l_x[ii, jj + 1], 0.) and neq(l_y[ii + 1, jj], 0.)): + elif ( + eq(l_x[ii, jj], 0.0) + and eq(l_y[ii, jj], 0.0) + and neq(l_x[ii, jj + 1], 0.0) + and neq(l_y[ii + 1, jj], 0.0) + ): S[ii, jj] = 0.5 * l_x[ii, jj + 1] * l_y[ii + 1, jj] - elif (eq(l_x[ii, jj], 0.) and eq(l_y[ii + 1, jj], 0.) - and neq(l_x[ii, jj + 1], 0.) and neq(l_y[ii, jj], 0.)): + elif ( + eq(l_x[ii, jj], 0.0) + and eq(l_y[ii + 1, jj], 0.0) + and neq(l_x[ii, jj + 1], 0.0) + and neq(l_y[ii, jj], 0.0) + ): S[ii, jj] = 0.5 * l_x[ii, jj + 1] * l_y[ii, jj] - elif (eq(l_x[ii, jj + 1], 0.) and eq(l_y[ii + 1, jj], 0.) - and neq(l_x[ii, jj], 0.) and neq(l_y[ii, jj], 0.)): + elif ( + eq(l_x[ii, jj + 1], 0.0) + and eq(l_y[ii + 1, jj], 0.0) + and neq(l_x[ii, jj], 0.0) + and neq(l_y[ii, jj], 0.0) + ): S[ii, jj] = 0.5 * l_x[ii, jj] * l_y[ii, jj] - elif (eq(l_x[ii, jj + 1], 0.) and eq(l_y[ii, jj], 0.) - and neq(l_x[ii, jj], 0.) and neq(l_y[ii + 1, jj], 0.)): + elif ( + eq(l_x[ii, jj + 1], 0.0) + and eq(l_y[ii, jj], 0.0) + and neq(l_x[ii, jj], 0.0) + and neq(l_y[ii + 1, jj], 0.0) + ): S[ii, jj] = 0.5 * l_x[ii, jj] * l_y[ii + 1, jj] - elif (0. < l_x[ii, jj] <= 1. and 0. < l_y[ii, jj] <= 1. - and eq(l_x[ii, jj + 1], 1.) and eq(l_y[ii + 1, jj], 1.)): - S[ii, jj] = 1. - 0.5 * (1. - l_x[ii, jj]) * (1. - l_y[ii, jj]) - elif (0. < l_x[ii, jj] <= 1. and 0. < l_y[ii + 1, jj] <= 1. - and eq(l_x[ii, jj + 1], 1.) and eq(l_y[ii, jj], 1.)): - S[ii, jj] = 1. - 0.5 * (1. - l_x[ii, jj]) * (1. - l_y[ii + 1, jj]) - elif (0. < l_x[ii, jj + 1] <= 1. and 0. < l_y[ii + 1, jj] <= 1. - and eq(l_x[ii, jj], 1.) and eq(l_y[ii, jj], 1.)): - S[ii, jj] = 1. - 0.5 * (1. - l_x[ii, jj + 1]) * (1. - l_y[ii + 1, jj]) - elif (0. < l_x[ii, jj + 1] <= 1. and 0. < l_y[ii, jj] <= 1. - and eq(l_x[ii, jj], 1.) and eq(l_y[ii + 1, jj], 1.)): - S[ii, jj] = 1. - 0.5 * (1. - l_x[ii, jj + 1]) * (1. - l_y[ii, jj]) + elif ( + 0.0 < l_x[ii, jj] <= 1.0 + and 0.0 < l_y[ii, jj] <= 1.0 + and eq(l_x[ii, jj + 1], 1.0) + and eq(l_y[ii + 1, jj], 1.0) + ): + S[ii, jj] = 1.0 - 0.5 * (1.0 - l_x[ii, jj]) * (1.0 - l_y[ii, jj]) + elif ( + 0.0 < l_x[ii, jj] <= 1.0 + and 0.0 < l_y[ii + 1, jj] <= 1.0 + and eq(l_x[ii, jj + 1], 1.0) + and eq(l_y[ii, jj], 1.0) + ): + S[ii, jj] = 1.0 - 0.5 * (1.0 - l_x[ii, jj]) * (1.0 - l_y[ii + 1, jj]) + elif ( + 0.0 < l_x[ii, jj + 1] <= 1.0 + and 0.0 < l_y[ii + 1, jj] <= 1.0 + and eq(l_x[ii, jj], 1.0) + and eq(l_y[ii, jj], 1.0) + ): + S[ii, jj] = 1.0 - 0.5 * (1.0 - l_x[ii, jj + 1]) * ( + 1.0 - l_y[ii + 1, jj] + ) + elif ( + 0.0 < l_x[ii, jj + 1] <= 1.0 + and 0.0 < l_y[ii, jj] <= 1.0 + and eq(l_x[ii, jj], 1.0) + and eq(l_y[ii + 1, jj], 1.0) + ): + S[ii, jj] = 1.0 - 0.5 * (1.0 - l_x[ii, jj + 1]) * (1.0 - l_y[ii, jj]) l_x *= dx l_y *= dy + """ Function to mark wich cells are interior (int), require extension (unst), are on the boundary(bound), are available for intrusion (avail) """ -@jit('(f8[:,:], f8[:,:], i4, i4, f8, f8, f8[:,:], b1[:,:], f8[:,:], b1[:,:], b1[:,:], b1[:,:])', nopython=True) -def mark_cells(l_x, l_y, nx, ny, dx, dy, S, flag_int_cell, S_stab, - flag_unst_cell, flag_bound_cell, flag_avail_cell): + + +@jit( + "(f8[:,:], f8[:,:], i4, i4, f8, f8, f8[:,:], b1[:,:], f8[:,:], b1[:,:], b1[:,:], b1[:,:])", + nopython=True, +) +def mark_cells( + l_x, + l_y, + nx, + ny, + dx, + dy, + S, + flag_int_cell, + S_stab, + flag_unst_cell, + flag_bound_cell, + flag_avail_cell, +): for ii in range(nx): for jj in range(ny): flag_int_cell[ii, jj] = S[ii, jj] > 0 if flag_int_cell[ii, jj]: S_stab[ii, jj] = 0.5 * np.max( - np.array([l_x[ii, jj] * dy, l_x[ii, jj + 1] * dy, - l_y[ii, jj] * dx, - l_y[ii + 1, jj] * dx])) + np.array( + [ + l_x[ii, jj] * dy, + l_x[ii, jj + 1] * dy, + l_y[ii, jj] * dx, + l_y[ii + 1, jj] * dx, + ] + ) + ) flag_unst_cell[ii, jj] = S[ii, jj] < S_stab[ii, jj] - flag_bound_cell[ii, jj] = ((0 < l_x[ii, jj] < dx) or - (0 < l_y[ii, jj] < dy) or - (0 < l_x[ii, jj + 1] < dx) or - (0 < l_y[ii + 1, jj] < dy)) - flag_avail_cell[ii, jj] = flag_int_cell[ii, jj] and (not flag_unst_cell[ii, jj]) + flag_bound_cell[ii, jj] = ( + (0 < l_x[ii, jj] < dx) + or (0 < l_y[ii, jj] < dy) + or (0 < l_x[ii, jj + 1] < dx) + or (0 < l_y[ii + 1, jj] < dy) + ) + flag_avail_cell[ii, jj] = flag_int_cell[ii, jj] and ( + not flag_unst_cell[ii, jj] + ) diff --git a/wakis/grid3D.py b/wakis/grid3D.py index f08aad4..2149673 100644 --- a/wakis/grid3D.py +++ b/wakis/grid3D.py @@ -4,6 +4,7 @@ from numba import jit from field import Field + def seg_length(x_1, y_1, z_1, x_2, y_2, z_2): return np.linalg.norm(np.array([x_1 - x_2, y_1 - y_2, z_1 - z_2])) @@ -15,25 +16,27 @@ def eq(a, b, tol=1e-8): def neq(a, b, tol=1e-8): return not eq(a, b, tol) - # Undo the normalization - S *= dx * dy - l_x *= dx - l_y *= dy - S_red[:] = S.copy()[:] + # # Undo the normalization + # S *= dx * dy + # l_x *= dx + # l_y *= dy + # S_red[:] = S.copy()[:] + class Grid3D: """ - Class holding the grid info and the routines for cell extensions. - Constructor arguments: - - xmin, xmax, ymin, ymax, zmin, zmax: extent of the domain. - - nx, ny, nz: number of cells per direction - - conductors: conductor object - - sol_type: type of solver. 'FDTD' for staircased FDTD, 'DM' for Conformal Dey-Mittra FDTD, - 'ECT' for Enlarged Cell Technique conformal FDTD + Class holding the grid info and the routines for cell extensions. + Constructor arguments: + - xmin, xmax, ymin, ymax, zmin, zmax: extent of the domain. + - nx, ny, nz: number of cells per direction + - conductors: conductor object + - sol_type: type of solver. 'FDTD' for staircased FDTD, 'DM' for Conformal Dey-Mittra FDTD, + 'ECT' for Enlarged Cell Technique conformal FDTD """ - def __init__(self, xmin, xmax, ymin, ymax, zmin, zmax, nx, ny, nz, conductors, sol_type): - + def __init__( + self, xmin, xmax, ymin, ymax, zmin, zmax, nx, ny, nz, conductors, sol_type + ): self.xmin = xmin self.xmax = xmax self.ymin = ymin @@ -85,32 +88,114 @@ def __init__(self, xmin, xmax, ymin, ymax, zmin, zmax, nx, ny, nz, conductors, s self.broken_yz = np.zeros_like(self.Syz, dtype=bool) self.broken_zx = np.zeros_like(self.Szx, dtype=bool) - if (sol_type is not 'FDTD') and (sol_type is not 'DM') and (sol_type is not 'ECT') and (sol_type is not 'FIT'): - raise ValueError("sol_type must be:\n" + - "\t'FDTD' for standard staircased FDTD\n" + - "\t'DM' for Dey-Mittra conformal FDTD\n" + - "\t'ECT' for Enlarged Cell Technique conformal FDTD") + if ( + (sol_type != "FDTD") + and (sol_type != "DM") + and (sol_type != "ECT") + and (sol_type != "FIT") + ): + raise ValueError( + "sol_type must be:\n" + + "\t'FDTD' for standard staircased FDTD\n" + + "\t'DM' for Dey-Mittra conformal FDTD\n" + + "\t'ECT' for Enlarged Cell Technique conformal FDTD" + ) self.compute_edges() - if sol_type is 'DM' or sol_type is 'FDTD': #or sol_type is 'FIT': - self.compute_areas(self.l_x, self.l_y, self.l_z, self.Sxy, self.Syz, self.Szx, - self.Sxy_red, self.Syz_red, self.Szx_red, - self.nx, self.ny, self.nz, self.dx, self.dy, self.dz) - self.mark_cells(self.l_x, self.l_y, self.l_z, self.nx, self.ny, self.nz, self.dx, self.dy, self.dz, - self.Sxy, self.Syz, self.Szx, self.flag_int_cell_xy, self.flag_int_cell_yz, self.flag_int_cell_zx, - self.Sxy_stab, self.Syz_stab, self.Szx_stab, self.flag_unst_cell_xy, self.flag_unst_cell_yz, - self.flag_unst_cell_zx, self.flag_bound_cell_xy, self.flag_bound_cell_yz, self.flag_bound_cell_zx, - self.flag_avail_cell_xy, self.flag_avail_cell_yz, self.flag_avail_cell_zx) - elif sol_type is 'ECT': - self.compute_areas(self.l_x, self.l_y, self.l_z, self.Sxy, self.Syz, self.Szx, - self.Sxy_red, self.Syz_red, self.Szx_red, - self.nx, self.ny, self.nz, self.dx, self.dy, self.dz) - self.mark_cells(self.l_x, self.l_y, self.l_z, self.nx, self.ny, self.nz, self.dx, self.dy, self.dz, - self.Sxy, self.Syz, self.Szx, self.flag_int_cell_xy, self.flag_int_cell_yz, self.flag_int_cell_zx, - self.Sxy_stab, self.Syz_stab, self.Szx_stab, self.flag_unst_cell_xy, self.flag_unst_cell_yz, - self.flag_unst_cell_zx, self.flag_bound_cell_xy, self.flag_bound_cell_yz, self.flag_bound_cell_zx, - self.flag_avail_cell_xy, self.flag_avail_cell_yz, self.flag_avail_cell_zx) - + if sol_type == "DM" or sol_type == "FDTD": # or sol_type is 'FIT': + self.compute_areas( + self.l_x, + self.l_y, + self.l_z, + self.Sxy, + self.Syz, + self.Szx, + self.Sxy_red, + self.Syz_red, + self.Szx_red, + self.nx, + self.ny, + self.nz, + self.dx, + self.dy, + self.dz, + ) + self.mark_cells( + self.l_x, + self.l_y, + self.l_z, + self.nx, + self.ny, + self.nz, + self.dx, + self.dy, + self.dz, + self.Sxy, + self.Syz, + self.Szx, + self.flag_int_cell_xy, + self.flag_int_cell_yz, + self.flag_int_cell_zx, + self.Sxy_stab, + self.Syz_stab, + self.Szx_stab, + self.flag_unst_cell_xy, + self.flag_unst_cell_yz, + self.flag_unst_cell_zx, + self.flag_bound_cell_xy, + self.flag_bound_cell_yz, + self.flag_bound_cell_zx, + self.flag_avail_cell_xy, + self.flag_avail_cell_yz, + self.flag_avail_cell_zx, + ) + elif sol_type == "ECT": + self.compute_areas( + self.l_x, + self.l_y, + self.l_z, + self.Sxy, + self.Syz, + self.Szx, + self.Sxy_red, + self.Syz_red, + self.Szx_red, + self.nx, + self.ny, + self.nz, + self.dx, + self.dy, + self.dz, + ) + self.mark_cells( + self.l_x, + self.l_y, + self.l_z, + self.nx, + self.ny, + self.nz, + self.dx, + self.dy, + self.dz, + self.Sxy, + self.Syz, + self.Szx, + self.flag_int_cell_xy, + self.flag_int_cell_yz, + self.flag_int_cell_zx, + self.Sxy_stab, + self.Syz_stab, + self.Szx_stab, + self.flag_unst_cell_xy, + self.flag_unst_cell_yz, + self.flag_unst_cell_zx, + self.flag_bound_cell_xy, + self.flag_bound_cell_yz, + self.flag_bound_cell_zx, + self.flag_avail_cell_xy, + self.flag_avail_cell_yz, + self.flag_avail_cell_zx, + ) # info about intruded cells (i,j,[(i_borrowing,j_borrowing,area_borrowing, )]) self.borrowing_xy = np.empty((nx, ny, nz + 1), dtype=object) @@ -133,20 +218,42 @@ def __init__(self, xmin, xmax, ymin, ymax, zmin, zmax, nx, ny, nz, conductors, s self.flag_ext_cell_xy = self.flag_unst_cell_xy.copy() self.flag_ext_cell_yz = self.flag_unst_cell_yz.copy() self.flag_ext_cell_zx = self.flag_unst_cell_zx.copy() - self.mark_cells(self.l_x, self.l_y, self.l_z, self.nx, self.ny, self.nz, self.dx, self.dy, self.dz, - self.Sxy, self.Syz, self.Szx, self.flag_int_cell_xy, self.flag_int_cell_yz, self.flag_int_cell_zx, - self.Sxy_stab, self.Syz_stab, self.Szx_stab, self.flag_unst_cell_xy, self.flag_unst_cell_yz, - self.flag_unst_cell_zx, self.flag_bound_cell_xy, self.flag_bound_cell_yz, self.flag_bound_cell_zx, - self.flag_avail_cell_xy, self.flag_avail_cell_yz, self.flag_avail_cell_zx) + self.mark_cells( + self.l_x, + self.l_y, + self.l_z, + self.nx, + self.ny, + self.nz, + self.dx, + self.dy, + self.dz, + self.Sxy, + self.Syz, + self.Szx, + self.flag_int_cell_xy, + self.flag_int_cell_yz, + self.flag_int_cell_zx, + self.Sxy_stab, + self.Syz_stab, + self.Szx_stab, + self.flag_unst_cell_xy, + self.flag_unst_cell_yz, + self.flag_unst_cell_zx, + self.flag_bound_cell_xy, + self.flag_bound_cell_yz, + self.flag_bound_cell_zx, + self.flag_avail_cell_xy, + self.flag_avail_cell_yz, + self.flag_avail_cell_zx, + ) self.compute_extensions() - - - elif sol_type is 'FIT': + elif sol_type == "FIT": # primal Grid G - self.x = np.linspace(self.xmin, self.xmax, self.nx+1) - self.y = np.linspace(self.ymin, self.ymax, self.ny+1) - self.z = np.linspace(self.zmin, self.zmax, self.nz+1) + self.x = np.linspace(self.xmin, self.xmax, self.nx + 1) + self.y = np.linspace(self.ymin, self.ymax, self.ny + 1) + self.z = np.linspace(self.zmin, self.zmax, self.nz + 1) Y, X, Z = np.meshgrid(self.y, self.x, self.z) @@ -161,12 +268,12 @@ def __init__(self, xmin, xmax, ymin, ymax, zmin, zmax, nx, ny, nz, conductors, s self.iA.field_z = np.divide(1.0, self.L.field_x * self.L.field_y) # tilde grid ~G - #self.itA = self.iA - #self.tL = self.L + # self.itA = self.iA + # self.tL = self.L - self.tx = (self.x[1:]+self.x[:-1])/2 - self.ty = (self.y[1:]+self.y[:-1])/2 - self.tz = (self.z[1:]+self.z[:-1])/2 + self.tx = (self.x[1:] + self.x[:-1]) / 2 + self.ty = (self.y[1:] + self.y[:-1]) / 2 + self.tz = (self.z[1:] + self.z[:-1]) / 2 self.tx = np.append(self.tx, self.tx[-1]) self.ty = np.append(self.ty, self.ty[-1]) @@ -181,22 +288,66 @@ def __init__(self, xmin, xmax, ymin, ymax, zmin, zmax, nx, ny, nz, conductors, s self.itA = Field(self.nx, self.ny, self.nz) aux = self.tL.field_y * self.tL.field_z - self.itA.field_x = np.divide(1.0, aux, out=np.zeros_like(aux), where=aux!=0) + self.itA.field_x = np.divide( + 1.0, aux, out=np.zeros_like(aux), where=aux != 0 + ) aux = self.tL.field_x * self.tL.field_z - self.itA.field_y = np.divide(1.0, aux, out=np.zeros_like(aux), where=aux!=0) + self.itA.field_y = np.divide( + 1.0, aux, out=np.zeros_like(aux), where=aux != 0 + ) aux = self.tL.field_x * self.tL.field_y - self.itA.field_z = np.divide(1.0, aux, out=np.zeros_like(aux), where=aux!=0) + self.itA.field_z = np.divide( + 1.0, aux, out=np.zeros_like(aux), where=aux != 0 + ) del aux - - self.compute_areas(self.l_x, self.l_y, self.l_z, self.Sxy, self.Syz, self.Szx, - self.Sxy_red, self.Syz_red, self.Szx_red, - self.nx, self.ny, self.nz, self.dx, self.dy, self.dz) - self.mark_cells(self.l_x, self.l_y, self.l_z, self.nx, self.ny, self.nz, self.dx, self.dy, self.dz, - self.Sxy, self.Syz, self.Szx, self.flag_int_cell_xy, self.flag_int_cell_yz, self.flag_int_cell_zx, - self.Sxy_stab, self.Syz_stab, self.Szx_stab, self.flag_unst_cell_xy, self.flag_unst_cell_yz, - self.flag_unst_cell_zx, self.flag_bound_cell_xy, self.flag_bound_cell_yz, self.flag_bound_cell_zx, - self.flag_avail_cell_xy, self.flag_avail_cell_yz, self.flag_avail_cell_zx) - + + self.compute_areas( + self.l_x, + self.l_y, + self.l_z, + self.Sxy, + self.Syz, + self.Szx, + self.Sxy_red, + self.Syz_red, + self.Szx_red, + self.nx, + self.ny, + self.nz, + self.dx, + self.dy, + self.dz, + ) + self.mark_cells( + self.l_x, + self.l_y, + self.l_z, + self.nx, + self.ny, + self.nz, + self.dx, + self.dy, + self.dz, + self.Sxy, + self.Syz, + self.Szx, + self.flag_int_cell_xy, + self.flag_int_cell_yz, + self.flag_int_cell_zx, + self.Sxy_stab, + self.Syz_stab, + self.Szx_stab, + self.flag_unst_cell_xy, + self.flag_unst_cell_yz, + self.flag_unst_cell_zx, + self.flag_bound_cell_xy, + self.flag_bound_cell_yz, + self.flag_bound_cell_zx, + self.flag_avail_cell_xy, + self.flag_avail_cell_yz, + self.flag_avail_cell_zx, + ) + """ Function to compute the length of the edges of the conformal grid. Inputs: @@ -221,17 +372,26 @@ def compute_edges(self, tol=1e-8): # if point 2 is not in conductor, length of l_x[i, j] # is the fractional length else: - self.l_x[ii, jj, kk] = seg_length(self.conductors.intersec_x(x_2, - y_2, z), - y_2, z, x_2, y_2, z) + self.l_x[ii, jj, kk] = seg_length( + self.conductors.intersec_x(x_2, y_2, z), + y_2, + z, + x_2, + y_2, + z, + ) # if point 1 is not in conductor else: # if point 2 is in conductor, length of l_x[i, j] is the fractional length if self.conductors.in_conductor(x_2, y_2, z): - self.l_x[ii, jj, kk] = seg_length(x_1, y_1, z, - self.conductors.intersec_x(x_1, y_1, - z), - y_1, z) + self.l_x[ii, jj, kk] = seg_length( + x_1, + y_1, + z, + self.conductors.intersec_x(x_1, y_1, z), + y_1, + z, + ) # if point 2 is not in conductor, length of l_x[i, j] is dx else: self.l_x[ii, jj, kk] = self.dx @@ -252,19 +412,27 @@ def compute_edges(self, tol=1e-8): # if point 3 is not in conductor, length of l_y[i, j] # is the fractional length else: - self.l_y[ii, jj, kk] = seg_length(x_3, - self.conductors.intersec_y(x_3, y_3, - z), - z, x_3, y_3, z) + self.l_y[ii, jj, kk] = seg_length( + x_3, + self.conductors.intersec_y(x_3, y_3, z), + z, + x_3, + y_3, + z, + ) # if point 1 is not in conductor else: # if point 3 is in conductor, length of the l_y[i, j] # is the fractional length if self.conductors.in_conductor(x_3, y_3, z): - self.l_y[ii, jj, kk] = seg_length(x_1, y_1, z, x_1, - self.conductors.intersec_y(x_1, y_1, - z), - z) + self.l_y[ii, jj, kk] = seg_length( + x_1, + y_1, + z, + x_1, + self.conductors.intersec_y(x_1, y_1, z), + z, + ) # if point 3 is not in conductor, length of l_y[i, j] is dy else: self.l_y[ii, jj, kk] = self.dy @@ -272,7 +440,7 @@ def compute_edges(self, tol=1e-8): for jj in range(self.ny + 1): for ii in range(self.nx + 1): for kk in range(self.nz): - y = jj*self.dy + self.ymin + y = jj * self.dy + self.ymin x_1 = ii * self.dx + self.xmin z_1 = kk * self.dz + self.zmin x_3 = ii * self.dx + self.xmin @@ -285,131 +453,248 @@ def compute_edges(self, tol=1e-8): # if point 3 is not in conductor, length of l_y[i, j] # is the fractional length else: - self.l_z[ii, jj, kk] = seg_length(x_3, y, - self.conductors.intersec_z(x_3, - y, z_3), - x_3, y, z_3) + self.l_z[ii, jj, kk] = seg_length( + x_3, + y, + self.conductors.intersec_z(x_3, y, z_3), + x_3, + y, + z_3, + ) # if point 1 is not in conductor else: # if point 3 is in conductor, length of the l_y[i, j] # is the fractional length if self.conductors.in_conductor(x_3, y, z_3): - self.l_z[ii, jj, kk] = seg_length(x_1, y, z_1, x_1, y, - self.conductors.intersec_z(x_1, y, - z_1)) + self.l_z[ii, jj, kk] = seg_length( + x_1, + y, + z_1, + x_1, + y, + self.conductors.intersec_z(x_1, y, z_1), + ) # if point 3 is not in conductor, length of l_y[i, j] is dy else: self.l_z[ii, jj, kk] = self.dz # set to zero the length of very small cells - if tol > 0.: + if tol > 0.0: self.l_x /= self.dx self.l_y /= self.dy self.l_z /= self.dz low_values_flags = abs(self.l_x) < tol - high_values_flags = abs(self.l_x - 1.) < tol + high_values_flags = abs(self.l_x - 1.0) < tol self.l_x[low_values_flags] = 0 - self.l_x[high_values_flags] = 1. + self.l_x[high_values_flags] = 1.0 low_values_flags = abs(self.l_y) < tol - high_values_flags = abs(self.l_y - 1.) < tol + high_values_flags = abs(self.l_y - 1.0) < tol self.l_y[low_values_flags] = 0 - self.l_y[high_values_flags] = 1. + self.l_y[high_values_flags] = 1.0 low_values_flags = abs(self.l_z) < tol - high_values_flags = abs(self.l_z - 1.) < tol + high_values_flags = abs(self.l_z - 1.0) < tol self.l_z[low_values_flags] = 0 - self.l_z[high_values_flags] = 1. + self.l_z[high_values_flags] = 1.0 self.l_x *= self.dx self.l_y *= self.dy self.l_z *= self.dz - """ Function to compute the area of the cells of the conformal grid. """ - @staticmethod - @jit('(f8[:,:,:], f8[:,:,:], f8[:,:,:], f8[:,:,:], f8[:,:,:], f8[:,:,:], f8[:,:,:], f8[:,:,:], f8[:,:,:], i4, i4, i4, f8, f8, f8)', nopython=True) - def compute_areas(l_x, l_y, l_z, Sxy, Syz, Szx, Sxy_red, Syz_red, Szx_red, nx, ny, nz, dx, dy, dz): + @staticmethod + @jit( + "(f8[:,:,:], f8[:,:,:], f8[:,:,:], f8[:,:,:], f8[:,:,:], f8[:,:,:], f8[:,:,:], f8[:,:,:], f8[:,:,:], i4, i4, i4, f8, f8, f8)", + nopython=True, + ) + def compute_areas( + l_x, l_y, l_z, Sxy, Syz, Szx, Sxy_red, Syz_red, Szx_red, nx, ny, nz, dx, dy, dz + ): for kk in range(nz + 1): - compute_areas_2D(l_x[:, :, kk], l_y[:, :, kk], Sxy[:, :, kk], Sxy_red[:, :, kk], - nx, ny, dx, dy) + compute_areas_2D( + l_x[:, :, kk], + l_y[:, :, kk], + Sxy[:, :, kk], + Sxy_red[:, :, kk], + nx, + ny, + dx, + dy, + ) for ii in range(nx + 1): - compute_areas_2D(l_y[ii, :, :], l_z[ii, :, :], Syz[ii, :, :], Syz_red[ii, :, :], - ny, nz, dy, dz) + compute_areas_2D( + l_y[ii, :, :], + l_z[ii, :, :], + Syz[ii, :, :], + Syz_red[ii, :, :], + ny, + nz, + dy, + dz, + ) for jj in range(ny + 1): - compute_areas_2D(l_x[:, jj, :], l_z[:, jj, :], Szx[:, jj, :], Szx_red[:, jj, :], - nx, nz, dx, dz) + compute_areas_2D( + l_x[:, jj, :], + l_z[:, jj, :], + Szx[:, jj, :], + Szx_red[:, jj, :], + nx, + nz, + dx, + dz, + ) """ Function to mark wich cells are interior (int), require extension (unst), are on the boundary(bound), are available for intrusion (avail) """ - @staticmethod - @jit('(f8[:,:,:], f8[:,:,:], f8[:,:,:], i4, i4, i4, f8, f8, f8, f8[:,:,:], f8[:,:,:], f8[:,:,:], b1[:,:,:], b1[:,:,:], b1[:,:,:], f8[:,:,:], f8[:,:,:], f8[:,:,:], b1[:,:,:], b1[:,:,:], b1[:,:,:], b1[:,:,:], b1[:,:,:], b1[:,:,:], b1[:,:,:], b1[:,:,:], b1[:,:,:])', nopython=True) - def mark_cells(l_x, l_y, l_z, nx, ny, nz, dx, dy, dz, Sxy, Syz, Szx, flag_int_cell_xy, flag_int_cell_yz, flag_int_cell_zx, - Sxy_stab, Syz_stab, Szx_stab, flag_unst_cell_xy, flag_unst_cell_yz, flag_unst_cell_zx, flag_bound_cell_xy, - flag_bound_cell_yz, flag_bound_cell_zx, flag_avail_cell_xy, flag_avail_cell_yz, flag_avail_cell_zx): + @staticmethod + @jit( + "(f8[:,:,:], f8[:,:,:], f8[:,:,:], i4, i4, i4, f8, f8, f8, f8[:,:,:], f8[:,:,:], f8[:,:,:], b1[:,:,:], b1[:,:,:], b1[:,:,:], f8[:,:,:], f8[:,:,:], f8[:,:,:], b1[:,:,:], b1[:,:,:], b1[:,:,:], b1[:,:,:], b1[:,:,:], b1[:,:,:], b1[:,:,:], b1[:,:,:], b1[:,:,:])", + nopython=True, + ) + def mark_cells( + l_x, + l_y, + l_z, + nx, + ny, + nz, + dx, + dy, + dz, + Sxy, + Syz, + Szx, + flag_int_cell_xy, + flag_int_cell_yz, + flag_int_cell_zx, + Sxy_stab, + Syz_stab, + Szx_stab, + flag_unst_cell_xy, + flag_unst_cell_yz, + flag_unst_cell_zx, + flag_bound_cell_xy, + flag_bound_cell_yz, + flag_bound_cell_zx, + flag_avail_cell_xy, + flag_avail_cell_yz, + flag_avail_cell_zx, + ): for kk in range(nz + 1): - mark_cells_2D(l_x[:, :, kk], l_y[:, :, kk], nx, ny, dx, dy, Sxy[:, :, kk], - flag_int_cell_xy[:, :, kk], Sxy_stab[:, :, kk], flag_unst_cell_xy[:, :, kk], - flag_bound_cell_xy[:, :, kk], flag_avail_cell_xy[:, :, kk]) + mark_cells_2D( + l_x[:, :, kk], + l_y[:, :, kk], + nx, + ny, + dx, + dy, + Sxy[:, :, kk], + flag_int_cell_xy[:, :, kk], + Sxy_stab[:, :, kk], + flag_unst_cell_xy[:, :, kk], + flag_bound_cell_xy[:, :, kk], + flag_avail_cell_xy[:, :, kk], + ) for ii in range(nx + 1): - mark_cells_2D(l_y[ii, :, :], l_z[ii, :, :], ny, nz, dy, dz, Syz[ii, :, :], - flag_int_cell_yz[ii, :, :], Syz_stab[ii, :, :], flag_unst_cell_yz[ii, :, :], - flag_bound_cell_yz[ii, :, :], flag_avail_cell_yz[ii, :, :]) + mark_cells_2D( + l_y[ii, :, :], + l_z[ii, :, :], + ny, + nz, + dy, + dz, + Syz[ii, :, :], + flag_int_cell_yz[ii, :, :], + Syz_stab[ii, :, :], + flag_unst_cell_yz[ii, :, :], + flag_bound_cell_yz[ii, :, :], + flag_avail_cell_yz[ii, :, :], + ) for jj in range(ny + 1): - mark_cells_2D(l_x[:, jj, :], l_z[:, jj, :], nx, nz, dx, dz, Szx[:, jj, :], - flag_int_cell_zx[:, jj, :], Szx_stab[:, jj, :], flag_unst_cell_zx[:, jj, :], - flag_bound_cell_zx[:, jj, :], flag_avail_cell_zx[:, jj, :]) + mark_cells_2D( + l_x[:, jj, :], + l_z[:, jj, :], + nx, + nz, + dx, + dz, + Szx[:, jj, :], + flag_int_cell_zx[:, jj, :], + Szx_stab[:, jj, :], + flag_unst_cell_zx[:, jj, :], + flag_bound_cell_zx[:, jj, :], + flag_avail_cell_zx[:, jj, :], + ) """ Function to compute the extension of the unstable cells """ def compute_extensions(self): - #breakpoint() + # breakpoint() for kk in range(self.nz + 1): - #breakpoint() - Grid2D.compute_extensions(nx=self.nx, ny=self.ny, S=self.Sxy[:, :, kk], - flag_int_cell=self.flag_int_cell_xy[:, :, kk], - S_stab=self.Sxy_stab[:, :, kk], S_enl=self.Sxy_enl[:, :, kk], - S_red=self.Sxy_red[:, :, kk], - flag_unst_cell=self.flag_unst_cell_xy[:, :, kk], - flag_avail_cell=self.flag_avail_cell_xy[:, :, kk], - flag_ext_cell=self.flag_ext_cell_xy[:, :, kk], - flag_intr_cell=self.flag_intr_cell_xy[:,:,kk], - borrowing=self.borrowing_xy[:, :, kk], - kk=kk, l_verbose=False) + # breakpoint() + Grid2D.compute_extensions( + nx=self.nx, + ny=self.ny, + S=self.Sxy[:, :, kk], + flag_int_cell=self.flag_int_cell_xy[:, :, kk], + S_stab=self.Sxy_stab[:, :, kk], + S_enl=self.Sxy_enl[:, :, kk], + S_red=self.Sxy_red[:, :, kk], + flag_unst_cell=self.flag_unst_cell_xy[:, :, kk], + flag_avail_cell=self.flag_avail_cell_xy[:, :, kk], + flag_ext_cell=self.flag_ext_cell_xy[:, :, kk], + flag_intr_cell=self.flag_intr_cell_xy[:, :, kk], + borrowing=self.borrowing_xy[:, :, kk], + kk=kk, + l_verbose=False, + ) for ii in range(self.nx + 1): - Grid2D.compute_extensions(nx=self.ny, ny=self.nz, S=self.Syz[ii, :, :], - flag_int_cell=self.flag_int_cell_yz[ii, :, :], - S_stab=self.Syz_stab[ii, :, :], S_enl=self.Syz_enl[ii, :, :], - S_red=self.Syz_red[ii, :, :], - flag_unst_cell=self.flag_unst_cell_yz[ii, :, :], - flag_avail_cell=self.flag_avail_cell_yz[ii, :, :], - flag_ext_cell=self.flag_ext_cell_yz[ii, :, :], - borrowing=self.borrowing_yz[ii, :, :], - flag_intr_cell=self.flag_intr_cell_yz[ii,:,:], - kk = ii, l_verbose=False) - + Grid2D.compute_extensions( + nx=self.ny, + ny=self.nz, + S=self.Syz[ii, :, :], + flag_int_cell=self.flag_int_cell_yz[ii, :, :], + S_stab=self.Syz_stab[ii, :, :], + S_enl=self.Syz_enl[ii, :, :], + S_red=self.Syz_red[ii, :, :], + flag_unst_cell=self.flag_unst_cell_yz[ii, :, :], + flag_avail_cell=self.flag_avail_cell_yz[ii, :, :], + flag_ext_cell=self.flag_ext_cell_yz[ii, :, :], + borrowing=self.borrowing_yz[ii, :, :], + flag_intr_cell=self.flag_intr_cell_yz[ii, :, :], + kk=ii, + l_verbose=False, + ) + for jj in range(self.ny + 1): - Grid2D.compute_extensions(nx=self.nx, ny=self.nz, S=self.Szx[:, jj, :], - flag_int_cell=self.flag_int_cell_zx[:, jj, :], - S_stab=self.Szx_stab[:, jj, :], S_enl=self.Szx_enl[:, jj, :], - S_red=self.Szx_red[:, jj, :], - flag_unst_cell=self.flag_unst_cell_zx[:, jj, :], - flag_avail_cell=self.flag_avail_cell_zx[:, jj, :], - flag_ext_cell=self.flag_ext_cell_zx[:, jj, :], - flag_intr_cell=self.flag_intr_cell_zx[:,jj,:], - borrowing=self.borrowing_zx[:, jj, :], - kk = jj, l_verbose=False) + Grid2D.compute_extensions( + nx=self.nx, + ny=self.nz, + S=self.Szx[:, jj, :], + flag_int_cell=self.flag_int_cell_zx[:, jj, :], + S_stab=self.Szx_stab[:, jj, :], + S_enl=self.Szx_enl[:, jj, :], + S_red=self.Szx_red[:, jj, :], + flag_unst_cell=self.flag_unst_cell_zx[:, jj, :], + flag_avail_cell=self.flag_avail_cell_zx[:, jj, :], + flag_ext_cell=self.flag_ext_cell_zx[:, jj, :], + flag_intr_cell=self.flag_intr_cell_zx[:, jj, :], + borrowing=self.borrowing_zx[:, jj, :], + kk=jj, + l_verbose=False, + ) diff --git a/wakis/gridFIT3D.py b/wakis/gridFIT3D.py index f61e796..7f1dc5a 100644 --- a/wakis/gridFIT3D.py +++ b/wakis/gridFIT3D.py @@ -17,10 +17,12 @@ try: from mpi4py import MPI + imported_mpi = True except ImportError: imported_mpi = False + class GridFIT3D: """ Class holding the grid information and @@ -71,19 +73,37 @@ class GridFIT3D: Use `verbose=2` for more detailed output. """ - def __init__(self, xmin=None, xmax=None, - ymin=None, ymax=None, - zmin=None, zmax=None, - Nx=None, Ny=None, Nz=None, - x=None, y=None, z=None, - use_mpi=False, - use_mesh_refinement=False, refinement_method='insert', refinement_tol=1e-8, - snap_points=None, snap_tol=1e-5, snap_solids=None, - stl_solids=None, stl_materials=None, - stl_rotate=[0., 0., 0.], stl_translate=[0., 0., 0.], stl_scale=1.0, - stl_colors=None, stl_tol=1e-3, - load_from_h5=None, verbose=1,): - + def __init__( + self, + xmin=None, + xmax=None, + ymin=None, + ymax=None, + zmin=None, + zmax=None, + Nx=None, + Ny=None, + Nz=None, + x=None, + y=None, + z=None, + use_mpi=False, + use_mesh_refinement=False, + refinement_method="insert", + refinement_tol=1e-8, + snap_points=None, + snap_tol=1e-5, + snap_solids=None, + stl_solids=None, + stl_materials=None, + stl_rotate=[0.0, 0.0, 0.0], + stl_translate=[0.0, 0.0, 0.0], + stl_scale=1.0, + stl_colors=None, + stl_tol=1e-3, + load_from_h5=None, + verbose=1, + ): t0 = time.time() self.logger = Logger() self.verbose = verbose @@ -93,7 +113,7 @@ def __init__(self, xmin=None, xmax=None, # generate from file if load_from_h5 is not None: self.load_from_h5(load_from_h5) - return #TODO: support MPI decomposition + return # TODO: support MPI decomposition # generate from custom x,y,z arrays elif x is not None and y is not None and z is not None: @@ -108,7 +128,9 @@ def __init__(self, xmin=None, xmax=None, self.ymin, self.ymax = self.y[0], self.y[-1] self.zmin, self.zmax = self.z[0], self.z[-1] if self.use_mpi: - raise ValueError("[!] Error: use_mpi=True is not compatible with custom x,y,z arrays.") + raise ValueError( + "[!] Error: use_mpi=True is not compatible with custom x,y,z arrays." + ) # generate from domain extents and number of cells [LEGACY] elif all(v is not None for v in [xmin, xmax, ymin, ymax, zmin, zmax]): @@ -117,9 +139,9 @@ def __init__(self, xmin=None, xmax=None, self.ymin, self.ymax = ymin, ymax self.zmin, self.zmax = zmin, zmax self.Nx, self.Ny, self.Nz = Nx, Ny, Nz - self.x = np.linspace(self.xmin, self.xmax, self.Nx+1) - self.y = np.linspace(self.ymin, self.ymax, self.Ny+1) - self.z = np.linspace(self.zmin, self.zmax, self.Nz+1) + self.x = np.linspace(self.xmin, self.xmax, self.Nx + 1) + self.y = np.linspace(self.ymin, self.ymax, self.Ny + 1) + self.z = np.linspace(self.zmin, self.zmax, self.Nz + 1) else: raise ValueError( @@ -143,13 +165,13 @@ def __init__(self, xmin=None, xmax=None, self.stl_translate = stl_translate self.stl_scale = stl_scale self.stl_colors = stl_colors - self.update_logger(['stl_solids', 'stl_materials']) - if stl_rotate != [0., 0., 0.]: - self.update_logger(['stl_rotate']) - if stl_translate != [0., 0., 0.]: - self.update_logger(['stl_translate']) + self.update_logger(["stl_solids", "stl_materials"]) + if stl_rotate != [0.0, 0.0, 0.0]: + self.update_logger(["stl_rotate"]) + if stl_translate != [0.0, 0.0, 0.0]: + self.update_logger(["stl_translate"]) if stl_scale != 1.0: - self.update_logger(['stl_scale']) + self.update_logger(["stl_scale"]) if stl_solids is not None: self._prepare_stl_dicts() @@ -159,23 +181,25 @@ def __init__(self, xmin=None, xmax=None, self.refinement_method = refinement_method self.snap_points = snap_points self.snap_tol = snap_tol - self.snap_solids = snap_solids # if None, use all stl_solids - self.update_logger(['use_mesh_refinement']) + self.snap_solids = snap_solids # if None, use all stl_solids + self.update_logger(["use_mesh_refinement"]) if self.use_mesh_refinement: if verbose: - print('Applying mesh refinement...') + print("Applying mesh refinement...") if self.snap_points is None and stl_solids is not None: self._compute_snap_points(snap_solids=snap_solids, snap_tol=snap_tol) self._refine_xyz_axis(method=refinement_method, tol=refinement_tol) if verbose: - print(f'Generating grid with {self.Nx*self.Ny*self.Nz} mesh cells...') + print(f"Generating grid with {self.Nx * self.Ny * self.Nz} mesh cells...") if verbose > 1: - print(f' * Simulation domain bounds: \n\ + print( + f" * Simulation domain bounds: \n\ x:[{xmin:.3f}, {xmax:.3f}],\n\ y:[{ymin:.3f}, {ymax:.3f}],\n\ - z:[{zmin:.3f}, {zmax:.3f}]') + z:[{zmin:.3f}, {zmax:.3f}]" + ) # MPI subdivide domain if self.use_mpi: @@ -188,26 +212,28 @@ def __init__(self, xmin=None, xmax=None, if self.verbose: print(f"MPI initialized for {self.rank} of {self.size}") else: - raise ImportError("[!] mpi4py is required when use_mpi=True but was not found") + raise ImportError( + "[!] mpi4py is required when use_mpi=True but was not found" + ) # grid G and tilde grid ~G, lengths and inverse areas self._compute_grid() # tolerance for stl import tol*min(dx,dy,dz) if verbose: - print('Importing STL solids...') + print("Importing STL solids...") self.stl_tol = stl_tol if stl_solids is not None: self._mark_cells_in_stl() if verbose: - print(f'Total grid initialization time: {time.time() - t0} s') + print(f"Total grid initialization time: {time.time() - t0} s") - self.gridInitializationTime = time.time()-t0 - self.update_logger(['gridInitializationTime']) + self.gridInitializationTime = time.time() - t0 + self.update_logger(["gridInitializationTime"]) def _compute_grid(self): - X, Y, Z = np.meshgrid(self.x, self.y, self.z, indexing='ij') + X, Y, Z = np.meshgrid(self.x, self.y, self.z, indexing="ij") self.grid = pv.StructuredGrid(X.transpose(), Y.transpose(), Z.transpose()) self.L = Field(self.Nx, self.Ny, self.Nz) @@ -221,15 +247,15 @@ def _compute_grid(self): self.iA.field_z = np.divide(1.0, self.L.field_x * self.L.field_y) # tilde grid ~G - self.tx = (self.x[1:]+self.x[:-1])/2 - self.ty = (self.y[1:]+self.y[:-1])/2 - self.tz = (self.z[1:]+self.z[:-1])/2 + self.tx = (self.x[1:] + self.x[:-1]) / 2 + self.ty = (self.y[1:] + self.y[:-1]) / 2 + self.tz = (self.z[1:] + self.z[:-1]) / 2 self.tx = np.append(self.tx, self.tx[-1]) self.ty = np.append(self.ty, self.ty[-1]) self.tz = np.append(self.tz, self.tz[-1]) - tX, tY, tZ = np.meshgrid(self.tx, self.ty, self.tz, indexing='ij') + tX, tY, tZ = np.meshgrid(self.tx, self.ty, self.tz, indexing="ij") self.tL = Field(self.Nx, self.Ny, self.Nz) self.tL.field_x = tX[1:, 1:, 1:] - tX[:-1, :-1, :-1] @@ -238,11 +264,11 @@ def _compute_grid(self): self.itA = Field(self.Nx, self.Ny, self.Nz) aux = self.tL.field_y * self.tL.field_z - self.itA.field_x = np.divide(1.0, aux, out=np.zeros_like(aux), where=aux!=0) + self.itA.field_x = np.divide(1.0, aux, out=np.zeros_like(aux), where=aux != 0) aux = self.tL.field_x * self.tL.field_z - self.itA.field_y = np.divide(1.0, aux, out=np.zeros_like(aux), where=aux!=0) + self.itA.field_y = np.divide(1.0, aux, out=np.zeros_like(aux), where=aux != 0) aux = self.tL.field_x * self.tL.field_y - self.itA.field_z = np.divide(1.0, aux, out=np.zeros_like(aux), where=aux!=0) + self.itA.field_z = np.divide(1.0, aux, out=np.zeros_like(aux), where=aux != 0) del aux def _mpi_initialize(self): @@ -253,32 +279,36 @@ def _mpi_initialize(self): # Error handling for Nz < size if self.Nz < self.size: - raise ValueError(f"Nz ({self.Nz}) must be greater than or equal to the number of MPI processes ({self.size}).") + raise ValueError( + f"Nz ({self.Nz}) must be greater than or equal to the number of MPI processes ({self.size})." + ) # global z quantities [ALLCAPS] self.ZMIN = self.zmin self.ZMAX = self.zmax - self.NZ = self.Nz - self.Nz%(self.size) # ensure multiple of MPI size - self.Z = np.linspace(self.ZMIN, self.ZMAX, self.NZ+1)[:-1] + self.dz/2 + self.NZ = self.Nz - self.Nz % (self.size) # ensure multiple of MPI size + self.Z = np.linspace(self.ZMIN, self.ZMAX, self.NZ + 1)[:-1] + self.dz / 2 - if self.verbose and self.rank==0: + if self.verbose and self.rank == 0: print(f" * Global grid ZMIN={self.ZMIN}, ZMAX={self.ZMAX}, NZ={self.NZ}") # MPI subdomain quantities self.Nz = self.NZ // (self.size) self.dz = (self.ZMAX - self.ZMIN) / self.NZ self.zmin = self.rank * self.Nz * self.dz + self.ZMIN - self.zmax = (self.rank+1) * self.Nz * self.dz + self.ZMIN + self.zmax = (self.rank + 1) * self.Nz * self.dz + self.ZMIN if self.verbose: - print(f"MPI rank {self.rank} of {self.size} initialized with \ - zmin={self.zmin}, zmax={self.zmax}, Nz={self.Nz}") + print( + f"MPI rank {self.rank} of {self.size} initialized with \ + zmin={self.zmin}, zmax={self.zmax}, Nz={self.Nz}" + ) # Add ghost cells self.n_ghosts = 1 if self.rank > 0: - self.zmin += - self.n_ghosts * self.dz + self.zmin += -self.n_ghosts * self.dz self.Nz += self.n_ghosts - if self.rank < (self.size-1): + if self.rank < (self.size - 1): self.zmax += self.n_ghosts * self.dz self.Nz += self.n_ghosts @@ -294,28 +324,36 @@ def mpi_gather_asGrid(self): _grid = None if self.rank == 0: print(f"Generating global grid from {self.ZMIN} to {self.ZMAX}") - _grid = GridFIT3D(self.xmin, self.xmax, - self.ymin, self.ymax, - self.ZMIN, self.ZMAX, - self.Nx, self.Ny, self.NZ, - use_mpi=False, - stl_solids=self.stl_solids, - stl_materials=self.stl_materials, - stl_scale=self.stl_scale, - stl_rotate=self.stl_rotate, - stl_translate=self.stl_translate, - stl_colors=self.stl_colors, - verbose=self.verbose, - stl_tol=self.stl_tol, - ) + _grid = GridFIT3D( + self.xmin, + self.xmax, + self.ymin, + self.ymax, + self.ZMIN, + self.ZMAX, + self.Nx, + self.Ny, + self.NZ, + use_mpi=False, + stl_solids=self.stl_solids, + stl_materials=self.stl_materials, + stl_scale=self.stl_scale, + stl_rotate=self.stl_rotate, + stl_translate=self.stl_translate, + stl_colors=self.stl_colors, + verbose=self.verbose, + stl_tol=self.stl_tol, + ) return _grid def _prepare_stl_dicts(self): if type(self.stl_solids) is not dict: if type(self.stl_solids) is str: - self.stl_solids = {'Solid 1' : self.stl_solids} + self.stl_solids = {"Solid 1": self.stl_solids} else: - raise Exception('Attribute `stl_solids` must contain a string or a dictionary') + raise Exception( + "Attribute `stl_solids` must contain a string or a dictionary" + ) if type(self.stl_rotate) is not dict: # if not a dict, the same values will be applied to all solids @@ -341,7 +379,7 @@ def _prepare_stl_dicts(self): if type(self.stl_colors) is not dict: if self.stl_colors is None: self._assign_colors() - elif self.stl_colors is str: # single color for all solids + elif self.stl_colors is str: # single color for all solids stl_colors = {} for key in self.stl_solids.keys(): stl_colors[key] = self.stl_colors @@ -354,35 +392,49 @@ def _prepare_stl_dicts(self): self.stl_colors = stl_colors except IndexError: self._assign_colors() - print('[!] If `stl_colors` is a list, it must have the same length as `stl_solids`.') + print( + "[!] If `stl_colors` is a list, it must have the same length as `stl_solids`." + ) def _mark_cells_in_stl(self): # Obtain masks with grid cells inside each stl solid stl_tolerance = np.min([np.min(self.dx), np.min(self.dy), np.min(self.dz)])*self.stl_tol progress_bar = False - if self.Nx*self.Ny*self.Nz > 5e6 and self.verbose: + if self.Nx * self.Ny * self.Nz > 5e6 and self.verbose: progress_bar = True for key in self.stl_solids.keys(): - surf = self.read_stl(key) # mark cells in stl [True == in stl, False == out stl] try: - select = self.grid.select_enclosed_points(surf, tolerance=stl_tolerance, - progress_bar=progress_bar) + select = self.grid.select_enclosed_points( + surf, tolerance=stl_tolerance, progress_bar=progress_bar + ) except Exception: - select = self.grid.select_enclosed_points(surf, tolerance=stl_tolerance, - check_surface=False, progress_bar=progress_bar) + select = self.grid.select_enclosed_points( + surf, + tolerance=stl_tolerance, + check_surface=False, + progress_bar=progress_bar, + ) if self.verbose > 1: - print(f'[!] Warning: stl solid {key} may have issues with closed surfaces. Consider checking the STL file.') + print( + f"[!] Warning: stl solid {key} may have issues with closed surfaces. Consider checking the STL file." + ) - self.grid[key] = select.point_data_to_cell_data()['SelectedPoints'] > stl_tolerance + self.grid[key] = ( + select.point_data_to_cell_data()["SelectedPoints"] > stl_tolerance + ) if self.verbose and np.sum(self.grid[key]) == 0: - print(f'[!] Warning: no cells were marked inside stl solid {key}. Consider increasing the tolerance factor (currently {self.stl_tol}).') + print( + f"[!] Warning: no cells were marked inside stl solid {key}. Consider increasing the tolerance factor (currently {self.stl_tol})." + ) if self.verbose > 1: - print(f' * STL solid {key}: {np.sum(self.grid[key])} cells marked inside the solid.') + print( + f" * STL solid {key}: {np.sum(self.grid[key])} cells marked inside the solid." + ) def read_stl(self, key): # import stl @@ -403,7 +455,7 @@ def read_stl(self, key): def _compute_snap_points(self, snap_solids=None, snap_tol=1e-8): if self.verbose > 1: - print(' * Calculating snappy points...') + print(" * Calculating snappy points...") # Support for user-defined stl_keys as list if snap_solids is None: snap_solids = self.stl_solids.keys() @@ -470,100 +522,127 @@ def plot_snap_points(self, snap_solids=None, snap_tol=1e-8): xy_cloud = pv.PolyData(xy_plane_points) pl = pv.Plotter() - pl.add_mesh(model, color='white', opacity=0.5, label='base STL') - pl.add_mesh(edges, color='black', line_width=5, opacity=0.8,) - pl.add_mesh(xz_cloud, color='green', point_size=20, render_points_as_spheres=True, label='XZ plane points') - pl.add_mesh(yz_cloud, color='orange', point_size=20, render_points_as_spheres=True, label='YZ plane points') - pl.add_mesh(xy_cloud, color='magenta', point_size=20, render_points_as_spheres=True, label='XY plane points') + pl.add_mesh(model, color="white", opacity=0.5, label="base STL") + pl.add_mesh( + edges, + color="black", + line_width=5, + opacity=0.8, + ) + pl.add_mesh( + xz_cloud, + color="green", + point_size=20, + render_points_as_spheres=True, + label="XZ plane points", + ) + pl.add_mesh( + yz_cloud, + color="orange", + point_size=20, + render_points_as_spheres=True, + label="YZ plane points", + ) + pl.add_mesh( + xy_cloud, + color="magenta", + point_size=20, + render_points_as_spheres=True, + label="XY plane points", + ) pl.add_legend() pl.show() - def refine_axis(self, xmin, xmax, Nx, x_snaps, - method='insert', tol=1e-12): - + def refine_axis(self, xmin, xmax, Nx, x_snaps, method="insert", tol=1e-12): # Loss function to minimize cell size spread def loss_function(x, x0, is_snap): # avoid moving snap points - penalty_snap = np.sum((x[is_snap] - x0[is_snap])**2) * 1000 + penalty_snap = np.sum((x[is_snap] - x0[is_snap]) ** 2) * 1000 # avoid gaps < uniform gap dx = np.diff(x) - threshold = 1/(len(x)-1) # or a hardcoded `min_spacing` - penalty_small_gaps = np.sum((threshold - dx[dx < threshold])**2) + threshold = 1 / (len(x) - 1) # or a hardcoded `min_spacing` + penalty_small_gaps = np.sum((threshold - dx[dx < threshold]) ** 2) # avoid large spread in gap length dx = np.diff(x) penalty_variance = np.std(dx) * 10 - #return penalty_snap + penalty_small_gaps + penalty_variance + # return penalty_snap + penalty_small_gaps + penalty_variance return np.hstack([penalty_snap, penalty_small_gaps, penalty_variance]) # Uniformly distributed points as initial guess - x_snaps = (x_snaps-xmin)/(xmax-xmin) # normalize to [0,1] + x_snaps = (x_snaps - xmin) / (xmax - xmin) # normalize to [0,1] - if method == 'insert': - x0 = np.unique(np.append(x_snaps, np.linspace(0, 1, Nx - len(x_snaps)))) + if method == "insert": + x0 = np.unique(np.append(x_snaps, np.linspace(0, 1, Nx - len(x_snaps)))) - elif method == 'neighbor': + elif method == "neighbor": x = np.linspace(0, 1, Nx) dx = np.diff(x)[0] for s in x_snaps: - m = np.isclose(x, s, rtol=0.0, atol=dx/2) - if np.sum(m)>0: + m = np.isclose(x, s, rtol=0.0, atol=dx / 2) + if np.sum(m) > 0: x[np.argmax(m)] = s x0 = x.copy() - elif method == 'subdivision': + elif method == "subdivision": # x = snaps while len(x) < Nx: - #idx of segments sorted min -> max - idx_max_diffs = np.argsort(np.diff(x))[-1] # take bigger + # idx of segments sorted min -> max + idx_max_diffs = np.argsort(np.diff(x))[-1] # take bigger print(f"Bigger segment starts at {x[idx_max_diffs]}") # compute new point in the middle of the segment val = x[idx_max_diffs] + (x[idx_max_diffs + 1] - x[idx_max_diffs]) / 2 # insert the new point - x = np.insert(x, idx_max_diffs+1, val) + x = np.insert(x, idx_max_diffs + 1, val) x = np.unique(x) print(f"Inserted point {val} at index {idx_max_diffs}") x0 = x.copy() else: - raise ValueError(f"Method {method} not supported. Use 'insert', 'neighbor' or 'subdivision'.") + raise ValueError( + f"Method {method} not supported. Use 'insert', 'neighbor' or 'subdivision'." + ) # minimize segment length spread for the test points is_snap = np.isin(x0, x_snaps) - result = least_squares(loss_function, - x0=x0.copy(), - bounds=(0,1),#(zmin, zmax), - jac='3-point', - method='dogbox', - loss='arctan', - gtol=tol, - ftol=tol, - xtol=tol, - verbose=1, - args=(x0.copy(), is_snap.copy()), - ) + result = least_squares( + loss_function, + x0=x0.copy(), + bounds=(0, 1), # (zmin, zmax), + jac="3-point", + method="dogbox", + loss="arctan", + gtol=tol, + ftol=tol, + xtol=tol, + verbose=1, + args=(x0.copy(), is_snap.copy()), + ) # transform back to [xmin, xmax] - return result.x*(xmax-xmin)+xmin + return result.x * (xmax - xmin) + xmin - def _refine_xyz_axis(self, method='insert', tol=1e-6): - '''Refine the grid in the x, y, z axis + def _refine_xyz_axis(self, method="insert", tol=1e-6): + """Refine the grid in the x, y, z axis using the snap points extracted from the stl solids. - The snap points are used to refine the grid ''' + The snap points are used to refine the grid""" if self.verbose > 1: - print(f' * Refining x axis with {len(self.x_snaps)} snaps...') - self.x = self.refine_axis(self.xmin, self.xmax, self.Nx+1, self.x_snaps, - method=method, tol=tol) + print(f" * Refining x axis with {len(self.x_snaps)} snaps...") + self.x = self.refine_axis( + self.xmin, self.xmax, self.Nx + 1, self.x_snaps, method=method, tol=tol + ) if self.verbose > 1: - print(f' * Refining y axis with {len(self.y_snaps)} snaps...') - self.y = self.refine_axis(self.ymin, self.ymax, self.Ny+1, self.y_snaps, - method=method, tol=tol) + print(f" * Refining y axis with {len(self.y_snaps)} snaps...") + self.y = self.refine_axis( + self.ymin, self.ymax, self.Ny + 1, self.y_snaps, method=method, tol=tol + ) if self.verbose > 1: - print(f' * Refining z axis with {len(self.z_snaps)} snaps...') - self.z = self.refine_axis(self.zmin, self.zmax, self.Nz+1, self.z_snaps, - method=method, tol=tol) + print(f" * Refining z axis with {len(self.z_snaps)} snaps...") + self.z = self.refine_axis( + self.zmin, self.zmax, self.Nz + 1, self.z_snaps, method=method, tol=tol + ) self.Nx = len(self.x) - 1 self.Ny = len(self.y) - 1 @@ -576,49 +655,60 @@ def _refine_xyz_axis(self, method='insert', tol=1e-6): print(f"Refined grid: Nx = {self.Nx}, Ny ={self.Ny}, Nz = {self.Nz}") def _assign_colors(self): - '''Classify colors assigned to each solid + """Classify colors assigned to each solid based on the categories in `material_colors` dict inside `materials.py` - ''' + """ self.stl_colors = {} for key in self.stl_solids: mat = self.stl_materials[key] if type(mat) is str: - _color = material_colors.get(mat, material_colors['other']) + _color = material_colors.get(mat, material_colors["other"]) self.stl_colors[key] = _color elif len(mat) == 2: - if mat[0] is np.inf: #eps_r - self.stl_colors[key] = material_colors['pec'] - elif mat[0] > 1.0: #eps_r - self.stl_colors[key] = material_colors['dielectric'] + if mat[0] is np.inf: # eps_r + self.stl_colors[key] = material_colors["pec"] + elif mat[0] > 1.0: # eps_r + self.stl_colors[key] = material_colors["dielectric"] else: - self.stl_colors[key] = material_colors['vacuum'] + self.stl_colors[key] = material_colors["vacuum"] elif len(mat) == 3: - self.stl_colors[key] = material_colors['lossy metal'] + self.stl_colors[key] = material_colors["lossy metal"] else: - self.stl_colors[key] = material_colors['other'] + self.stl_colors[key] = material_colors["other"] def _add_logo_widget(self, pl): """Add packaged logo via importlib.resources (Python 3.9+).""" try: from importlib import resources + # resource inside the installed package (use current package) - logo_res = resources.files(__package__).joinpath('static', 'img', 'wakis-logo-pink.png') + logo_res = resources.files(__package__).joinpath( + "static", "img", "wakis-logo-pink.png" + ) with resources.as_file(logo_res) as logo_path: pl.add_logo_widget(str(logo_path)) return except Exception as e: # fallback to the legacy relative path for dev installs try: - pl.add_logo_widget('../docs/img/wakis-logo-pink.png') + pl.add_logo_widget("../docs/img/wakis-logo-pink.png") except Exception: if self.verbose > 1: - print(f'[!] Could not add logo widget: {e}') - - def plot_solids(self, bounding_box=False, show_grid=False, anti_aliasing=None, - opacity=1.0, specular=0.5, smooth_shading=False, - off_screen=False, **kwargs): + print(f"[!] Could not add logo widget: {e}") + + def plot_solids( + self, + bounding_box=False, + show_grid=False, + anti_aliasing=None, + opacity=1.0, + specular=0.5, + smooth_shading=False, + off_screen=False, + **kwargs, + ): """ Generates a 3D visualization of the imported STL geometries using PyVista. @@ -654,20 +744,25 @@ def plot_solids(self, bounding_box=False, show_grid=False, anti_aliasing=None, """ pl = pv.Plotter() - pl.add_mesh(self.grid, opacity=0., name='grid', show_scalar_bar=False) + pl.add_mesh(self.grid, opacity=0.0, name="grid", show_scalar_bar=False) for key in self.stl_solids: color = self.stl_colors[key] - if self.stl_materials[key] == 'vacuum': + if self.stl_materials[key] == "vacuum": _opacity = 0.3 else: _opacity = opacity - pl.add_mesh(self.read_stl(key), color=color, - opacity=_opacity, specular=specular, smooth_shading=smooth_shading, - **kwargs) + pl.add_mesh( + self.read_stl(key), + color=color, + opacity=_opacity, + specular=specular, + smooth_shading=smooth_shading, + **kwargs, + ) - pl.set_background('mistyrose', top='white') + pl.set_background("mistyrose", top="white") self._add_logo_widget(pl) - pl.camera_position = 'zx' + pl.camera_position = "zx" pl.camera.azimuth += 30 pl.camera.elevation += 30 pl.add_axes() @@ -679,18 +774,31 @@ def plot_solids(self, bounding_box=False, show_grid=False, anti_aliasing=None, pl.add_bounding_box() if show_grid: - pl.add_mesh(self.grid, style='wireframe', color='grey', opacity=0.3, name='grid') + pl.add_mesh( + self.grid, style="wireframe", color="grey", opacity=0.3, name="grid" + ) if off_screen: - pl.export_html('grid_plot_solids.html') + pl.export_html("grid_plot_solids.html") else: pl.show() - def plot_stl_mask(self, stl_solid, cmap='viridis', bounding_box=True, show_grid=True, - add_stl='all', stl_opacity=0., stl_colors=None, - xmax=None, ymax=None, zmax=None, - anti_aliasing='ssaa', smooth_shading=False, off_screen=False): - + def plot_stl_mask( + self, + stl_solid, + cmap="viridis", + bounding_box=True, + show_grid=True, + add_stl="all", + stl_opacity=0.0, + stl_colors=None, + xmax=None, + ymax=None, + zmax=None, + anti_aliasing="ssaa", + smooth_shading=False, + off_screen=False, + ): """ Interactive 3D visualization of the structured grid mask and imported STL geometries. @@ -758,7 +866,7 @@ def plot_stl_mask(self, stl_solid, cmap='viridis', bounding_box=True, show_grid= pv.global_theme.allow_empty_mesh = True pl = pv.Plotter() - vals = {'x':xmax, 'y':ymax, 'z':zmax} + vals = {"x": xmax, "y": ymax, "z": zmax} # --- Update function --- def update_clip(val, axis="x"): @@ -773,9 +881,17 @@ def update_clip(val, axis="x"): # add clipped volume (scalars) pl.add_mesh( - self.grid.clip_box(bounds=(self.xmin, vals['x'], - self.ymin, vals['y'], - self.zmin, vals['z']), invert=False), + self.grid.clip_box( + bounds=( + self.xmin, + vals["x"], + self.ymin, + vals["y"], + self.zmin, + vals["z"], + ), + invert=False, + ), scalars=stl_solid, cmap=cmap, name="clip", @@ -787,79 +903,147 @@ def update_clip(val, axis="x"): # Plot stl surface(s) if add_stl is not None: - if type(add_stl) is str: #add all stl solids - if add_stl.lower() == 'all': + if type(add_stl) is str: # add all stl solids + if add_stl.lower() == "all": for i, key in enumerate(self.stl_solids): surf = self.read_stl(key) if type(stl_colors) is dict: - pl.add_mesh(surf, color=stl_colors[key], opacity=stl_opacity, silhouette=dict(color=stl_colors[key]), name=key) + pl.add_mesh( + surf, + color=stl_colors[key], + opacity=stl_opacity, + silhouette=dict(color=stl_colors[key]), + name=key, + ) elif type(stl_colors) is list: - pl.add_mesh(surf, color=stl_colors[i], opacity=stl_opacity, silhouette=dict(color=stl_colors[i]), name=key) + pl.add_mesh( + surf, + color=stl_colors[i], + opacity=stl_opacity, + silhouette=dict(color=stl_colors[i]), + name=key, + ) else: - pl.add_mesh(surf, color='white', opacity=stl_opacity, silhouette=True, name=key) - else: #add 1 selected stl solid + pl.add_mesh( + surf, + color="white", + opacity=stl_opacity, + silhouette=True, + name=key, + ) + else: # add 1 selected stl solid key = add_stl surf = self.read_stl(key) - pl.add_mesh(surf, color=stl_colors[key], opacity=stl_opacity, silhouette=dict(color=stl_colors[key]), name=key) - - elif type(add_stl) is list: #add selected list of stl solids + pl.add_mesh( + surf, + color=stl_colors[key], + opacity=stl_opacity, + silhouette=dict(color=stl_colors[key]), + name=key, + ) + + elif type(add_stl) is list: # add selected list of stl solids for i, key in enumerate(add_stl): surf = self.read_stl(key) if type(stl_colors[key]) is dict: - pl.add_mesh(surf, color=stl_colors[key], opacity=stl_opacity, silhouette=dict(color=stl_colors[key]), name=key) + pl.add_mesh( + surf, + color=stl_colors[key], + opacity=stl_opacity, + silhouette=dict(color=stl_colors[key]), + name=key, + ) elif type(stl_colors) is list: - pl.add_mesh(surf, color=stl_colors[i], opacity=stl_opacity, silhouette=dict(color=stl_colors[i]), name=key) + pl.add_mesh( + surf, + color=stl_colors[i], + opacity=stl_opacity, + silhouette=dict(color=stl_colors[i]), + name=key, + ) else: - pl.add_mesh(surf, color='white', opacity=stl_opacity, silhouette=True, name=key) + pl.add_mesh( + surf, + color="white", + opacity=stl_opacity, + silhouette=True, + name=key, + ) # --- Sliders (placed side-by-side vertically) --- pl.add_slider_widget( lambda val: update_clip(val, "x"), [self.xmin, self.xmax], - value=xmax, title="X Clip", - pointa=(0.8, 0.8), pointb=(0.95, 0.8), # top-right - style='modern', + value=xmax, + title="X Clip", + pointa=(0.8, 0.8), + pointb=(0.95, 0.8), # top-right + style="modern", ) pl.add_slider_widget( lambda val: update_clip(val, "y"), [self.ymin, self.ymax], - value=ymax, title="Y Clip", - pointa=(0.8, 0.6), pointb=(0.95, 0.6), # middle-right - style='modern', + value=ymax, + title="Y Clip", + pointa=(0.8, 0.6), + pointb=(0.95, 0.6), # middle-right + style="modern", ) pl.add_slider_widget( lambda val: update_clip(val, "z"), [self.zmin, self.zmax], - value=zmax, title="Z Clip", - pointa=(0.8, 0.4), pointb=(0.95, 0.4), # lower-right - style='modern', + value=zmax, + title="Z Clip", + pointa=(0.8, 0.4), + pointb=(0.95, 0.4), # lower-right + style="modern", ) # Camera orientation - pl.camera_position = 'zx' + pl.camera_position = "zx" pl.camera.azimuth += 30 pl.camera.elevation += 30 - pl.set_background('mistyrose', top='white') + pl.set_background("mistyrose", top="white") self._add_logo_widget(pl) pl.add_axes() pl.enable_3_lights() pl.enable_anti_aliasing(anti_aliasing) if bounding_box: - pl.add_mesh(pv.Box(bounds=(self.xmin, self.xmax, self.ymin, self.ymax, self.zmin, self.zmax)), - style="wireframe", color="black", line_width=2, name="domain_box") + pl.add_mesh( + pv.Box( + bounds=( + self.xmin, + self.xmax, + self.ymin, + self.ymax, + self.zmin, + self.zmax, + ) + ), + style="wireframe", + color="black", + line_width=2, + name="domain_box", + ) if off_screen: - pl.export_html(f'grid_stl_mask_{stl_solid}.html') + pl.export_html(f"grid_stl_mask_{stl_solid}.html") else: pl.show() - def inspect(self, add_stl=None, stl_opacity=0.5, stl_colors=None, - anti_aliasing='ssaa', smooth_shading=True, off_screen=False): - - '''3D plot using pyvista to visualize + def inspect( + self, + add_stl=None, + stl_opacity=0.5, + stl_colors=None, + anti_aliasing="ssaa", + smooth_shading=True, + off_screen=False, + ): + """3D plot using pyvista to visualize the structured grid and the imported stl geometries @@ -871,60 +1055,110 @@ def inspect(self, add_stl=None, stl_opacity=0.5, stl_colors=None, Opacity of the stl surfaces (0 - Transparent, 1 - Opaque) stl_colors: str or list of str, default 'white' Color of the stl surfaces - ''' + """ if stl_colors is None: stl_colors = self.stl_colors pv.global_theme.allow_empty_mesh = True pl = pv.Plotter() - pl.add_mesh(self.grid, show_edges=True, cmap=['white', 'white'], name='grid') + pl.add_mesh(self.grid, show_edges=True, cmap=["white", "white"], name="grid") + def clip(widget): # Plot structured grid b = widget.bounds - x = self.x[np.logical_and(self.x>=b[0], self.x<=b[1])] - y = self.y[np.logical_and(self.y>=b[2], self.y<=b[3])] - z = self.z[np.logical_and(self.z>=b[4], self.z<=b[5])] - X, Y, Z = np.meshgrid(x, y, z, indexing='ij') + x = self.x[np.logical_and(self.x >= b[0], self.x <= b[1])] + y = self.y[np.logical_and(self.y >= b[2], self.y <= b[3])] + z = self.z[np.logical_and(self.z >= b[4], self.z <= b[5])] + X, Y, Z = np.meshgrid(x, y, z, indexing="ij") grid = pv.StructuredGrid(X.transpose(), Y.transpose(), Z.transpose()) - pl.add_mesh(grid, show_edges=True, cmap=['white', 'white'], name='grid') + pl.add_mesh(grid, show_edges=True, cmap=["white", "white"], name="grid") # Plot stl surface(s) - if add_stl is not None: #add 1 selected stl solid + if add_stl is not None: # add 1 selected stl solid if type(add_stl) is str: key = add_stl surf = self.read_stl(key) surf = surf.clip_box(widget.bounds, invert=False) - pl.add_mesh(surf, color=stl_colors[key], opacity=stl_opacity, silhouette=True, smooth_shading=smooth_shading, name=key) - - elif type(add_stl) is list: #add selected list of stl solids + pl.add_mesh( + surf, + color=stl_colors[key], + opacity=stl_opacity, + silhouette=True, + smooth_shading=smooth_shading, + name=key, + ) + + elif type(add_stl) is list: # add selected list of stl solids for i, key in enumerate(add_stl): surf = self.read_stl(key) surf = surf.clip_box(widget.bounds, invert=False) if type(stl_colors) is dict: - pl.add_mesh(surf, color=stl_colors[key], opacity=stl_opacity, silhouette=True, smooth_shading=smooth_shading, name=key) + pl.add_mesh( + surf, + color=stl_colors[key], + opacity=stl_opacity, + silhouette=True, + smooth_shading=smooth_shading, + name=key, + ) elif type(stl_colors) is list: - pl.add_mesh(surf, color=stl_colors[i], opacity=stl_opacity, silhouette=True, smooth_shading=smooth_shading, name=key) + pl.add_mesh( + surf, + color=stl_colors[i], + opacity=stl_opacity, + silhouette=True, + smooth_shading=smooth_shading, + name=key, + ) else: - pl.add_mesh(surf, color='white', opacity=stl_opacity, silhouette=True, smooth_shading=smooth_shading, name=key) + pl.add_mesh( + surf, + color="white", + opacity=stl_opacity, + silhouette=True, + smooth_shading=smooth_shading, + name=key, + ) - else: #add all stl solids + else: # add all stl solids for i, key in enumerate(self.stl_solids): surf = self.read_stl(key) surf = surf.clip_box(widget.bounds, invert=False) if type(stl_colors) is dict: - pl.add_mesh(surf, color=stl_colors[key], opacity=stl_opacity, silhouette=True, smooth_shading=smooth_shading, name=key) + pl.add_mesh( + surf, + color=stl_colors[key], + opacity=stl_opacity, + silhouette=True, + smooth_shading=smooth_shading, + name=key, + ) elif type(stl_colors) is list: - pl.add_mesh(surf, color=stl_colors[i], opacity=stl_opacity, silhouette=True, smooth_shading=smooth_shading, name=key) + pl.add_mesh( + surf, + color=stl_colors[i], + opacity=stl_opacity, + silhouette=True, + smooth_shading=smooth_shading, + name=key, + ) else: - pl.add_mesh(surf, color='white', opacity=stl_opacity, silhouette=True, smooth_shading=smooth_shading, name=key) + pl.add_mesh( + surf, + color="white", + opacity=stl_opacity, + silhouette=True, + smooth_shading=smooth_shading, + name=key, + ) _ = pl.add_box_widget(callback=clip, rotation_enabled=False) # Camera orientation - pl.camera_position = 'zx' + pl.camera_position = "zx" pl.camera.azimuth += 30 pl.camera.elevation += 30 - pl.set_background('mistyrose', top='white') + pl.set_background("mistyrose", top="white") self._add_logo_widget(pl) pl.add_axes() pl.enable_3_lights() @@ -933,13 +1167,13 @@ def clip(widget): if off_screen: pl.off_screen = True return pl - #pl.export_html('grid_inspect.html') + # pl.export_html('grid_inspect.html') else: pl.show() return None - def save_to_h5(self, filename='grid.h5'): - '''Save generated grid to HDF5 file + def save_to_h5(self, filename="grid.h5"): + """Save generated grid to HDF5 file Stored data: ------------ @@ -948,37 +1182,42 @@ def save_to_h5(self, filename='grid.h5'): * All `stl_` related variables: stl_solids, stl_materials, stl_colors, stl_scale, stl_rotate, stl_translate - ''' + """ - if not filename.endswith('.h5'): - filename += '.h5' + if not filename.endswith(".h5"): + filename += ".h5" if self.verbose: - print('Saving grid to HDF5 file:', filename) + print("Saving grid to HDF5 file:", filename) - with h5py.File(filename, 'w') as hf: - hf.create_dataset('x', data=np.array(self.x)) - hf.create_dataset('y', data=np.array(self.y)) - hf.create_dataset('z', data=np.array(self.z)) + with h5py.File(filename, "w") as hf: + hf.create_dataset("x", data=np.array(self.x)) + hf.create_dataset("y", data=np.array(self.y)) + hf.create_dataset("z", data=np.array(self.z)) # Save stl_ variables as groups - for attr in ['stl_solids', 'stl_materials', - 'stl_colors', 'stl_scale', - 'stl_rotate', 'stl_translate']: + for attr in [ + "stl_solids", + "stl_materials", + "stl_colors", + "stl_scale", + "stl_rotate", + "stl_translate", + ]: grp = hf.create_group(attr) dct = getattr(self, attr) for key, val in dct.items(): # Use dtype='S' for strings, otherwise np.array if isinstance(val, str): - grp.create_dataset(str(key), data=np.string_(val)) + grp.create_dataset(str(key), data=np.bytes_(val)) else: grp.create_dataset(str(key), data=np.array(val)) for key in self.stl_solids.keys(): - hf.create_dataset('grid_'+key, data=np.array(self.grid[key])) + hf.create_dataset("grid_" + key, data=np.array(self.grid[key])) def load_from_h5(self, filename): - '''Load grid from HDF5 file + """Load grid from HDF5 file Stored data: ------------ @@ -987,23 +1226,28 @@ def load_from_h5(self, filename): * All `stl_` related variables: stl_solids, stl_materials, stl_colors, stl_scale, stl_rotate, stl_translate - ''' - if not filename.endswith('.h5'): - filename += '.h5' + """ + if not filename.endswith(".h5"): + filename += ".h5" if self.verbose: - print('Loading grid from HDF5 file:', filename) + print("Loading grid from HDF5 file:", filename) - with h5py.File(filename, 'r') as hf: + with h5py.File(filename, "r") as hf: # reconstruct stl dicts - self.x = hf['x'][()] - self.y = hf['y'][()] - self.z = hf['z'][()] + self.x = hf["x"][()] + self.y = hf["y"][()] + self.z = hf["z"][()] # Load stl_ variables from groups - for attr in ['stl_solids', 'stl_materials', - 'stl_colors', 'stl_scale', - 'stl_rotate', 'stl_translate']: + for attr in [ + "stl_solids", + "stl_materials", + "stl_colors", + "stl_scale", + "stl_rotate", + "stl_translate", + ]: dct = {} grp = hf[attr] for key in grp.keys(): @@ -1029,33 +1273,39 @@ def load_from_h5(self, filename): self._compute_grid() # asign masks to grid.cell_data - with h5py.File(filename, 'r') as hf: + with h5py.File(filename, "r") as hf: for key in self.stl_solids.keys(): - self.grid[key] = hf['grid_'+key][()] + self.grid[key] = hf["grid_" + key][()] # add verbosity if self.verbose > 1: - print(f'Loaded grid with {self.Nx*self.Ny*self.Nz} mesh cells:') - print(f' * Number of cells: Nx={self.Nx}, Ny={self.Ny}, Nz={self.Nz}') - print(f' * Simulation domain bounds: \n\ + print(f"Loaded grid with {self.Nx * self.Ny * self.Nz} mesh cells:") + print(f" * Number of cells: Nx={self.Nx}, Ny={self.Ny}, Nz={self.Nz}") + print( + f" * Simulation domain bounds: \n\ x:[{self.xmin:.3f}, {self.xmax:.3f}],\n\ y:[{self.ymin:.3f}, {self.ymax:.3f}],\n\ - z:[{self.zmin:.3f}, {self.zmax:.3f}]') - print(f' * STL solids imported:\n\ - {list(self.stl_solids.keys())}') - print(f' * STL solids assigned materials [eps_r, mu_r, sigma]:\n\ - {list(self.stl_materials.values())}') + z:[{self.zmin:.3f}, {self.zmax:.3f}]" + ) + print( + f" * STL solids imported:\n\ + {list(self.stl_solids.keys())}" + ) + print( + f" * STL solids assigned materials [eps_r, mu_r, sigma]:\n\ + {list(self.stl_materials.values())}" + ) # update logger - self.update_logger(['Nx', 'Ny', 'Nz', 'dx', 'dy', 'dz']) - self.update_logger(['xmin', 'xmax', 'ymin', 'ymax', 'zmin', 'zmax']) - self.update_logger(['stl_solids', 'stl_materials']) - if self.stl_rotate != [0., 0., 0.]: - self.update_logger(['stl_rotate']) - if self.stl_translate != [0., 0., 0.]: - self.update_logger(['stl_translate']) + self.update_logger(["Nx", "Ny", "Nz", "dx", "dy", "dz"]) + self.update_logger(["xmin", "xmax", "ymin", "ymax", "zmin", "zmax"]) + self.update_logger(["stl_solids", "stl_materials"]) + if self.stl_rotate != [0.0, 0.0, 0.0]: + self.update_logger(["stl_rotate"]) + if self.stl_translate != [0.0, 0.0, 0.0]: + self.update_logger(["stl_translate"]) if self.stl_scale != 1.0: - self.update_logger(['stl_scale']) + self.update_logger(["stl_scale"]) def update_logger(self, attrs): """ diff --git a/wakis/logger.py b/wakis/logger.py index c7e9731..b05a8ea 100644 --- a/wakis/logger.py +++ b/wakis/logger.py @@ -3,22 +3,14 @@ # Copyright (c) CERN, 2025. # # ########################################### # -from tqdm import tqdm -import numpy as np -import time -import h5py import os import json -from scipy.constants import c as c_light, epsilon_0 as eps_0, mu_0 as mu_0 -from scipy.sparse import csc_matrix as sparse_mat -from scipy.sparse import diags, hstack, vstack +from scipy.constants import mu_0 as mu_0 - -class Logger(): - +class Logger: def __init__(self): self.grid = {} self.solver = {} @@ -30,13 +22,13 @@ def save_logs(self, results_folder=None): """ if results_folder is not None: self.wakeSolver["results_folder"] = results_folder - + logfile = os.path.join(self.wakeSolver["results_folder"], "wakis.log") # Write sections - if not os.path.exists(self.wakeSolver["results_folder"]): + if not os.path.exists(self.wakeSolver["results_folder"]): os.mkdir(self.wakeSolver["results_folder"]) - + with open(logfile, "w", encoding="utf-8") as fh: fh.write("Simulation Parameters\n") fh.write("""=====================\n\n""") diff --git a/wakis/materials.py b/wakis/materials.py index 039f933..d5d04db 100644 --- a/wakis/materials.py +++ b/wakis/materials.py @@ -3,7 +3,7 @@ # Copyright (c) CERN, 2024. # # ########################################### # -''' +""" Material library dictionary Format (non-conductive): @@ -19,40 +19,27 @@ ! Note: * 'material key' in lower case only * eps = eps_r*eps_0 and mu = mu_r*mu_0 -''' +""" import numpy as np material_lib = { - 'pec' : [np.inf, 1.], - - 'vacuum' : [1.0, 1.0], - - 'dielectric' : [10., 1.0], - - 'lossy metal' : [10, 1.0, 10], - - 'copper' : [5.8e+07, 1.0, 5.8e+07], - - 'berillium' : [2.5e+07, 1.0, 2.5e+07], + "pec": [np.inf, 1.0], + "vacuum": [1.0, 1.0], + "dielectric": [10.0, 1.0], + "lossy metal": [10, 1.0, 10], + "copper": [5.8e07, 1.0, 5.8e07], + "berillium": [2.5e07, 1.0, 2.5e07], } material_colors = { - 'pec' : 'white', - - 'vacuum' : 'tab:blue', - - 'dielectric' : 'tab:green', - - 'lossy metal' : 'tab:orange', - - 'copper' : [0.82745099, 0.698039, 0.49019599], - - 'berillium' : [0.82745099, 0.698039, 0.49019599], - - 'stainless steel' : 'silver', - - 'martensite' : [0.,1.,1.], - - 'other' : 'cyan', -} \ No newline at end of file + "pec": "white", + "vacuum": "tab:blue", + "dielectric": "tab:green", + "lossy metal": "tab:orange", + "copper": [0.82745099, 0.698039, 0.49019599], + "berillium": [0.82745099, 0.698039, 0.49019599], + "stainless steel": "silver", + "martensite": [0.0, 1.0, 1.0], + "other": "cyan", +} diff --git a/wakis/plotting.py b/wakis/plotting.py index f2aefae..92ff053 100644 --- a/wakis/plotting.py +++ b/wakis/plotting.py @@ -7,16 +7,31 @@ import numpy as np import matplotlib.pyplot as plt -class PlotMixin: - def plot3D(self, field='E', component='z', clim=None, hide_solids=None, - show_solids=None, add_stl=None, stl_opacity=0.1, stl_colors='white', - title=None, cmap='jet', - clip_interactive=False, clip_normal='-y', - clip_box=False, clip_bounds=None, - off_screen=False, zoom=0.5, camera_position=None, - nan_opacity=1.0, n=None): - ''' +class PlotMixin: + def plot3D( + self, + field="E", + component="z", + clim=None, + hide_solids=None, + show_solids=None, + add_stl=None, + stl_opacity=0.1, + stl_colors="white", + title=None, + cmap="jet", + clip_interactive=False, + clip_normal="-y", + clip_box=False, + clip_bounds=None, + off_screen=False, + zoom=0.5, + camera_position=None, + nan_opacity=1.0, + n=None, + ): + """ Built-in 3D plotting using PyVista Parameters: @@ -62,23 +77,22 @@ def plot3D(self, field='E', component='z', clim=None, hide_solids=None, Plot will not be rendered if set to True. n: int, optional Timestep number to be added to the plot title and figsave title. - ''' + """ if self.use_mpi: - print('[!] plot3D is not supported when `use_mpi=True`') + print("[!] plot3D is not supported when `use_mpi=True`") return - if len(field) == 2: #support for e.g. field='Ex' + if len(field) == 2: # support for e.g. field='Ex' component = field[1] field = field[0] if title is None: - title = field + component +'3d' + title = field + component + "3d" if self.plotter_active and not off_screen: self.plotter_active = False if not self.plotter_active: - pl = pv.Plotter(off_screen=off_screen) # Plot stl surface(s) @@ -86,28 +100,42 @@ def plot3D(self, field='E', component='z', clim=None, hide_solids=None, if type(add_stl) is str: key = add_stl surf = self.grid.read_stl(key) - pl.add_mesh(surf, color=stl_colors, opacity=stl_opacity, smooth_shading=True) + pl.add_mesh( + surf, color=stl_colors, opacity=stl_opacity, smooth_shading=True + ) elif type(add_stl) is list: for i, key in enumerate(add_stl): surf = self.grid.read_stl(key) if type(stl_colors) is list: - pl.add_mesh(surf, color=stl_colors[i], opacity=stl_opacity, smooth_shading=True) + pl.add_mesh( + surf, + color=stl_colors[i], + opacity=stl_opacity, + smooth_shading=True, + ) else: - pl.add_mesh(surf, color=stl_colors, opacity=stl_opacity, smooth_shading=True) + pl.add_mesh( + surf, + color=stl_colors, + opacity=stl_opacity, + smooth_shading=True, + ) else: key = self.grid.stl_solids.keys()[0] surf = self.grid.read_stl(key) - pl.add_mesh(surf, color=stl_colors, opacity=stl_opacity, smooth_shading=True) + pl.add_mesh( + surf, color=stl_colors, opacity=stl_opacity, smooth_shading=True + ) if camera_position is None: - pl.camera_position = 'zx' + pl.camera_position = "zx" pl.camera.azimuth += 30 pl.camera.elevation += 30 else: pl.camera_position = camera_position - pl.set_background('mistyrose', top='white') + pl.set_background("mistyrose", top="white") self._add_logo_widget(pl) pl.camera.zoom(zoom) pl.add_axes() @@ -118,96 +146,141 @@ def plot3D(self, field='E', component='z', clim=None, hide_solids=None, else: pl = self.pl - # Plot field - if field == 'E': - self.grid.grid.cell_data[field+component] = np.reshape(self.E[:, :, :, component], self.N) - elif field == 'H': - self.grid.grid.cell_data[field+component] = np.reshape(self.H[:, :, :, component], self.N) - elif field == 'J': - self.grid.grid.cell_data[field+component] = np.reshape(self.J[:, :, :, component], self.N) + if field == "E": + self.grid.grid.cell_data[field + component] = np.reshape( + self.E[:, :, :, component], self.N + ) + elif field == "H": + self.grid.grid.cell_data[field + component] = np.reshape( + self.H[:, :, :, component], self.N + ) + elif field == "J": + self.grid.grid.cell_data[field + component] = np.reshape( + self.J[:, :, :, component], self.N + ) else: print("`field` value not valid") - points = self.grid.grid.cell_data_to_point_data() #interpolate + points = self.grid.grid.cell_data_to_point_data() # interpolate # Mask the values inside solid to np.nan if hide_solids is not None: - tol = np.min([self.dx, self.dy, self.dz])*1e-3 + tol = np.min([self.dx, self.dy, self.dz]) * 1e-3 if type(hide_solids) is str: surf = self.grid.read_stl(hide_solids) select = self.grid.grid.select_enclosed_points(surf, tolerance=tol) - mask = select['SelectedPoints'] > 0 + mask = select["SelectedPoints"] > 0 elif type(hide_solids) is list: for i, solid in enumerate(hide_solids): surf = self.grid.read_stl(solid) select = self.grid.grid.select_enclosed_points(surf, tolerance=tol) if i == 0: - mask = select['SelectedPoints'] > 0 + mask = select["SelectedPoints"] > 0 else: - mask += select['SelectedPoints'] > 0 + mask += select["SelectedPoints"] > 0 - points[field+component][mask] = np.nan + points[field + component][mask] = np.nan # Mask the values outside solid to np.nan if show_solids is not None: - tol = np.min([self.dx, self.dy, self.dz])*1e-3 + tol = np.min([self.dx, self.dy, self.dz]) * 1e-3 if type(show_solids) is str: surf = self.grid.read_stl(show_solids) select = self.grid.grid.select_enclosed_points(surf, tolerance=tol) - mask = select['SelectedPoints'] > 0 + mask = select["SelectedPoints"] > 0 elif type(show_solids) is list: for solid in show_solids: surf = self.grid.read_stl(solid) select = self.grid.grid.select_enclosed_points(surf, tolerance=tol) if i == 0: - mask = select['SelectedPoints'] > 0 + mask = select["SelectedPoints"] > 0 else: - mask += select['SelectedPoints'] > 0 + mask += select["SelectedPoints"] > 0 - points[field+component][np.logical_not(mask)] = np.nan + points[field + component][np.logical_not(mask)] = np.nan # Clip a rectangle of the domain if clip_box: if clip_bounds is None: - Lx, Ly = (self.grid.xmax-self.grid.xmin), (self.grid.ymax-self.grid.ymin) - clip_bounds = [self.grid.xmax-Lx/2, self.grid.xmax, - self.grid.ymax-Ly/2, self.grid.ymax, - self.grid.zmin, self.grid.zmax] - - ac1 = pl.add_mesh(points.clip_box(bounds=clip_bounds), opacity=nan_opacity, - scalars=field+component, cmap=cmap, clim=clim) + Lx, Ly = ( + (self.grid.xmax - self.grid.xmin), + (self.grid.ymax - self.grid.ymin), + ) + clip_bounds = [ + self.grid.xmax - Lx / 2, + self.grid.xmax, + self.grid.ymax - Ly / 2, + self.grid.ymax, + self.grid.zmin, + self.grid.zmax, + ] + + ac1 = pl.add_mesh( + points.clip_box(bounds=clip_bounds), + opacity=nan_opacity, + scalars=field + component, + cmap=cmap, + clim=clim, + ) # Enable an interactive widget to clip out part of the domain with a plane, with clip_normal elif clip_interactive: - ac1 = pl.add_mesh_clip_plane(points, normal=clip_normal, opacity=1.0, - scalars=field+component, cmap=cmap, clim=clim, - normal_rotation=False, nan_opacity=nan_opacity) + ac1 = pl.add_mesh_clip_plane( + points, + normal=clip_normal, + opacity=1.0, + scalars=field + component, + cmap=cmap, + clim=clim, + normal_rotation=False, + nan_opacity=nan_opacity, + ) else: - print('Plotting option inconsistent') + print("Plotting option inconsistent") # Save if n is not None: - pl.add_title(field+component+f' field, timestep={n}', font='times', font_size=12) - title += '_'+str(n).zfill(6) + pl.add_title( + field + component + f" field, timestep={n}", font="times", font_size=12 + ) + title += "_" + str(n).zfill(6) if off_screen: - pl.screenshot(title+'.png') + pl.screenshot(title + ".png") pl.remove_actor(ac1) self.pl = pl else: pl.show(full_screen=False) - def plot3DonSTL(self, field='E', component='z', clim=None, cmap='jet', log_scale=False, - stl_with_field=None, field_opacity=1.0, tolerance=None, - stl_transparent=None, stl_opacity=0.1, stl_colors='white', - clip_plane = False, clip_interactive=False, - clip_normal='-x', clip_origin=[0,0,0], - clip_box=False, clip_bounds=None, - title=None, off_screen=False, n=None, - zoom=0.5, camera_position=None, **kwargs): - ''' + def plot3DonSTL( + self, + field="E", + component="z", + clim=None, + cmap="jet", + log_scale=False, + stl_with_field=None, + field_opacity=1.0, + tolerance=None, + stl_transparent=None, + stl_opacity=0.1, + stl_colors="white", + clip_plane=False, + clip_interactive=False, + clip_normal="-x", + clip_origin=[0, 0, 0], + clip_box=False, + clip_bounds=None, + title=None, + off_screen=False, + n=None, + zoom=0.5, + camera_position=None, + **kwargs, + ): + """ Built-in 3D plotting using PyVista Parameters: @@ -259,24 +332,24 @@ def plot3DonSTL(self, field='E', component='z', clim=None, cmap='jet', log_scale **kwargs: optional PyVista's add_mesh optional arguments: https://docs.pyvista.org/api/plotting/_autosummary/pyvista.plotter.add_mesh - ''' + """ if self.use_mpi: - print('[!] plot3D is not supported when `use_mpi=True`') + print("[!] plot3D is not supported when `use_mpi=True`") return - if len(field) == 2: #support for e.g. field='Ex' + if len(field) == 2: # support for e.g. field='Ex' component = field[1] field = field[0] if title is None: - title = field + component +'3d' + title = field + component + "3d" if self.plotter_active and not off_screen: self.plotter_active = False if not self.plotter_active: - pl = pv.Plotter(off_screen=off_screen, lighting='none') - light = pv.Light(light_type='headlight') + pl = pv.Plotter(off_screen=off_screen, lighting="none") + light = pv.Light(light_type="headlight") pl.add_light(light) # Plot stl surface(s) @@ -284,15 +357,27 @@ def plot3DonSTL(self, field='E', component='z', clim=None, cmap='jet', log_scale if type(stl_transparent) is str: key = stl_transparent surf = self.grid.read_stl(key) - pl.add_mesh(surf, color=stl_colors, opacity=stl_opacity, smooth_shading=True) + pl.add_mesh( + surf, color=stl_colors, opacity=stl_opacity, smooth_shading=True + ) elif type(stl_transparent) is list: for i, key in enumerate(stl_transparent): surf = self.grid.read_stl(key) if type(stl_colors) is list: - pl.add_mesh(surf, color=stl_colors[i], opacity=stl_opacity, smooth_shading=True) + pl.add_mesh( + surf, + color=stl_colors[i], + opacity=stl_opacity, + smooth_shading=True, + ) else: - pl.add_mesh(surf, color=stl_colors, opacity=stl_opacity, smooth_shading=True) + pl.add_mesh( + surf, + color=stl_colors, + opacity=stl_opacity, + smooth_shading=True, + ) if off_screen: self.plotter_active = True @@ -300,18 +385,24 @@ def plot3DonSTL(self, field='E', component='z', clim=None, cmap='jet', log_scale pl = self.pl # Plot field - if field == 'E': - self.grid.grid.cell_data[field+component] = np.reshape(self.E[:, :, :, component], self.N) - - elif field == 'H': - self.grid.grid.cell_data[field+component] = np.reshape(self.H[:, :, :, component], self.N) - - elif field == 'J': - self.grid.grid.cell_data[field+component] = np.reshape(self.J[:, :, :, component], self.N) + if field == "E": + self.grid.grid.cell_data[field + component] = np.reshape( + self.E[:, :, :, component], self.N + ) + + elif field == "H": + self.grid.grid.cell_data[field + component] = np.reshape( + self.H[:, :, :, component], self.N + ) + + elif field == "J": + self.grid.grid.cell_data[field + component] = np.reshape( + self.J[:, :, :, component], self.N + ) else: print("`field` value not valid") - points = self.grid.grid.cell_data_to_point_data() #interpolate + points = self.grid.grid.cell_data_to_point_data() # interpolate # Interpolate fields on stl if stl_with_field is not None: @@ -320,97 +411,171 @@ def plot3DonSTL(self, field='E', component='z', clim=None, cmap='jet', log_scale surf = self.grid.read_stl(key) if clip_plane: try: - surf = surf.clip_closed_surface(normal=clip_normal, origin=clip_origin).subdivide_adaptive(max_edge_len=3*self.dz) + surf = surf.clip_closed_surface( + normal=clip_normal, origin=clip_origin + ).subdivide_adaptive(max_edge_len=3 * self.dz) except Exception: print("[!] Surface non-manifold, clip with plane skipped") fieldonsurf = surf.sample(points, tolerance=tolerance) - if clip_interactive: # interactive plotting with a plane - ac1 = pl.add_mesh_clip_plane(fieldonsurf, normal=clip_normal, normal_rotation=False, - scalars=field+component, opacity=field_opacity, - cmap=cmap, clim=clim, log_scale=log_scale, - **kwargs) - - elif clip_box: # Clip a rectangle of the domain + if clip_interactive: # interactive plotting with a plane + ac1 = pl.add_mesh_clip_plane( + fieldonsurf, + normal=clip_normal, + normal_rotation=False, + scalars=field + component, + opacity=field_opacity, + cmap=cmap, + clim=clim, + log_scale=log_scale, + **kwargs, + ) + + elif clip_box: # Clip a rectangle of the domain if clip_bounds is None: - Lx, Ly = (self.grid.xmax-self.grid.xmin), (self.grid.ymax-self.grid.ymin) - clip_bounds = [self.grid.xmax-Lx/2, self.grid.xmax, - self.grid.ymax-Ly/2, self.grid.ymax, - self.grid.zmin, self.grid.zmax] - - ac1 = pl.add_mesh(fieldonsurf.clip_box(bounds=clip_bounds), cmap=cmap, clim=clim, - scalars=field+component, opacity=field_opacity, - log_scale=log_scale, - **kwargs) + Lx, Ly = ( + (self.grid.xmax - self.grid.xmin), + (self.grid.ymax - self.grid.ymin), + ) + clip_bounds = [ + self.grid.xmax - Lx / 2, + self.grid.xmax, + self.grid.ymax - Ly / 2, + self.grid.ymax, + self.grid.zmin, + self.grid.zmax, + ] + + ac1 = pl.add_mesh( + fieldonsurf.clip_box(bounds=clip_bounds), + cmap=cmap, + clim=clim, + scalars=field + component, + opacity=field_opacity, + log_scale=log_scale, + **kwargs, + ) else: - ac1 = pl.add_mesh(fieldonsurf, cmap=cmap, clim=clim, - scalars=field+component, opacity=field_opacity, - log_scale=log_scale, - **kwargs) + ac1 = pl.add_mesh( + fieldonsurf, + cmap=cmap, + clim=clim, + scalars=field + component, + opacity=field_opacity, + log_scale=log_scale, + **kwargs, + ) elif type(stl_with_field) is list: for i, key in enumerate(stl_with_field): surf = self.grid.read_stl(key) if clip_plane: try: - surf = surf.clip_closed_surface(normal=clip_normal, origin=clip_origin) + surf = surf.clip_closed_surface( + normal=clip_normal, origin=clip_origin + ) except Exception: print("Surface non-manifold, clip with plane skipped") fieldonsurf = surf.sample(points, tolerance=tolerance) - if clip_interactive: # interactive plotting with a plane - ac1 = pl.add_mesh_clip_plane(fieldonsurf, normal=clip_normal, normal_rotation=False, - scalars=field+component, opacity=field_opacity, - cmap=cmap, clim=clim, log_scale=log_scale, - **kwargs) - elif clip_box: # Clip a rectangle of the domain + if clip_interactive: # interactive plotting with a plane + ac1 = pl.add_mesh_clip_plane( + fieldonsurf, + normal=clip_normal, + normal_rotation=False, + scalars=field + component, + opacity=field_opacity, + cmap=cmap, + clim=clim, + log_scale=log_scale, + **kwargs, + ) + elif clip_box: # Clip a rectangle of the domain if clip_bounds is None: - Lx, Ly = (self.grid.xmax-self.grid.xmin), (self.grid.ymax-self.grid.ymin) - clip_bounds = [self.grid.xmax-Lx/2, self.grid.xmax, - self.grid.ymax-Ly/2, self.grid.ymax, - self.grid.zmin, self.grid.zmax] - ac1 = pl.add_mesh(fieldonsurf.clip_box(bounds=clip_bounds), cmap=cmap, clim=clim, - scalars=field+component, opacity=field_opacity, - log_scale=log_scale, **kwargs) + Lx, Ly = ( + (self.grid.xmax - self.grid.xmin), + (self.grid.ymax - self.grid.ymin), + ) + clip_bounds = [ + self.grid.xmax - Lx / 2, + self.grid.xmax, + self.grid.ymax - Ly / 2, + self.grid.ymax, + self.grid.zmin, + self.grid.zmax, + ] + ac1 = pl.add_mesh( + fieldonsurf.clip_box(bounds=clip_bounds), + cmap=cmap, + clim=clim, + scalars=field + component, + opacity=field_opacity, + log_scale=log_scale, + **kwargs, + ) else: - ac1 = pl.add_mesh(fieldonsurf, cmap=cmap, clim=clim, - scalars=field+component, opacity=field_opacity, - log_scale=log_scale, - **kwargs) + ac1 = pl.add_mesh( + fieldonsurf, + cmap=cmap, + clim=clim, + scalars=field + component, + opacity=field_opacity, + log_scale=log_scale, + **kwargs, + ) if camera_position is None: - pl.camera_position = 'zx' + pl.camera_position = "zx" pl.camera.azimuth += 30 pl.camera.elevation += 30 else: pl.camera_position = camera_position - pl.set_background('mistyrose', top='white') + pl.set_background("mistyrose", top="white") self._add_logo_widget(pl) pl.camera.zoom(zoom) pl.add_axes() pl.enable_anti_aliasing() - #pl.enable_3_lights() + # pl.enable_3_lights() if n is not None: - pl.add_title(field+component+f' field, timestep={n}', font='times', font_size=12) - title += '_'+str(n).zfill(6) + pl.add_title( + field + component + f" field, timestep={n}", font="times", font_size=12 + ) + title += "_" + str(n).zfill(6) # Save if off_screen: - pl.screenshot(title+'.png') + pl.screenshot(title + ".png") pl.remove_actor(ac1) self.pl = pl else: pl.show(full_screen=False) - def plot2D(self, field='E', component='z', plane='ZY', pos=0.5, norm=None, - vmin=None, vmax=None, figsize=[8,4], cmap='jet', patch_alpha=0.1, - patch_reverse=False, add_patch=False, title=None, off_screen=False, - n=None, interpolation='antialiased', dpi=100, return_handles=False): - ''' + def plot2D( + self, + field="E", + component="z", + plane="ZY", + pos=0.5, + norm=None, + vmin=None, + vmax=None, + figsize=[8, 4], + cmap="jet", + patch_alpha=0.1, + patch_reverse=False, + add_patch=False, + title=None, + off_screen=False, + n=None, + interpolation="antialiased", + dpi=100, + return_handles=False, + ): + """ Built-in 2D plotting of a field slice using matplotlib Parameters: @@ -453,7 +618,7 @@ def plot2D(self, field='E', component='z', plane='ZY', pos=0.5, norm=None, interpolation: str, default 'antialiased' Interpolation method to pass to matplotlib imshow e.g., 'none', 'antialiased', 'nearest', 'bilinear', 'bicubic', 'spline16', 'spline36', - ''' + """ from mpl_toolkits.axes_grid1 import make_axes_locatable Nx, Ny, Nz = self.Nx, self.Ny, self.Nz @@ -468,80 +633,103 @@ def plot2D(self, field='E', component='z', plane='ZY', pos=0.5, norm=None, _z = self.grid.Z if type(field) is str: - if len(field) == 2: #support for e.g. field='Ex' + if len(field) == 2: # support for e.g. field='Ex' component = field[1] field = field[0] - elif len(field) == 4: #support for e.g. field='EAbs' + elif len(field) == 4: # support for e.g. field='EAbs' component = field[1:] field = field[0] if title is None: - title = field + component +'2d' + title = field + component + "2d" if type(plane) is not str and len(plane) == 3: x, y, z = plane[0], plane[1], plane[2] if type(plane[2]) is int: - cut = f'(x,y,a) a={round(self.z[z],3)}' - xax, yax = 'y', 'x' - extent = [self.y[y].min(), self.y[y].max(), - self.x[x].min(), self.x[x].max()] + cut = f"(x,y,a) a={round(self.z[z], 3)}" + xax, yax = "y", "x" + extent = [ + self.y[y].min(), + self.y[y].max(), + self.x[x].min(), + self.x[x].max(), + ] if type(plane[0]) is int: - cut = f'(a,y,z) a={round(self.x[x],3)}' - xax, yax = 'z', 'y' - extent = [_z[z].min(), _z[z].max(), - self.y[y].min(), self.y[y].max()] + cut = f"(a,y,z) a={round(self.x[x], 3)}" + xax, yax = "z", "y" + extent = [_z[z].min(), _z[z].max(), self.y[y].min(), self.y[y].max()] if type(plane[1]) is int: - cut = f'(x,a,z) a={round(self.y[y],3)}' - xax, yax = 'z', 'x' - extent = [_z[z].min(), _z[z].max(), - self.x[x].min(), self.x[x].max()] - - elif plane == 'XY': - x, y, z = slice(0,Nx), slice(0,Ny), int(Nz*pos) #plane XY - cut = f'(x,y,a) a={round(pos*(zmax-zmin)+zmin,3)}' - xax, yax = 'y', 'x' + cut = f"(x,a,z) a={round(self.y[y], 3)}" + xax, yax = "z", "x" + extent = [_z[z].min(), _z[z].max(), self.x[x].min(), self.x[x].max()] + + elif plane == "XY": + x, y, z = slice(0, Nx), slice(0, Ny), int(Nz * pos) # plane XY + cut = f"(x,y,a) a={round(pos * (zmax - zmin) + zmin, 3)}" + xax, yax = "y", "x" extent = [ymin, ymax, xmin, xmax] - elif plane == 'ZY' or plane == 'YZ': - x, y, z = int(Nx*pos), slice(0,Ny), slice(0,Nz) #plane ZY - cut = f'(a,y,z) a={round(pos*(xmax-xmin)+xmin,3)}' - xax, yax = 'z', 'y' + elif plane == "ZY" or plane == "YZ": + x, y, z = int(Nx * pos), slice(0, Ny), slice(0, Nz) # plane ZY + cut = f"(a,y,z) a={round(pos * (xmax - xmin) + xmin, 3)}" + xax, yax = "z", "y" extent = [zmin, zmax, ymin, ymax] - elif plane == 'ZX' or plane == 'XZ': - x, y, z = slice(0,Nx), int(Ny*pos), slice(0,Nz) #plane XZ - cut = f'(x,a,z) a={round(pos*(ymax-ymin)+ymin,3)}' - xax, yax = 'z', 'x' + elif plane == "ZX" or plane == "XZ": + x, y, z = slice(0, Nx), int(Ny * pos), slice(0, Nz) # plane XZ + cut = f"(x,a,z) a={round(pos * (ymax - ymin) + ymin, 3)}" + xax, yax = "z", "x" extent = [zmin, zmax, xmin, xmax] else: - print("Plane needs to be an array of slices [x,y,z] or a str 'XY', 'ZY', 'ZX'") + print( + "Plane needs to be an array of slices [x,y,z] or a str 'XY', 'ZY', 'ZX'" + ) - if self.use_mpi: # only in rank=0 + if self.use_mpi: # only in rank=0 _field = self.mpi_gather(field, x=x, y=y, z=z, component=component) if self.rank == 0: - fig, ax = plt.subplots(1,1, figsize=figsize, dpi=dpi) - im = ax.imshow(_field, cmap=cmap, norm=norm, - extent=extent, origin='lower', vmin=vmin, vmax=vmax, - interpolation=interpolation) - - fig.colorbar(im, cax=make_axes_locatable(ax).append_axes('right', size='5%', pad=0.05)) - ax.set_title(f'Wakis {field}{component}{cut}') + fig, ax = plt.subplots(1, 1, figsize=figsize, dpi=dpi) + im = ax.imshow( + _field, + cmap=cmap, + norm=norm, + extent=extent, + origin="lower", + vmin=vmin, + vmax=vmax, + interpolation=interpolation, + ) + + fig.colorbar( + im, + cax=make_axes_locatable(ax).append_axes( + "right", size="5%", pad=0.05 + ), + ) + ax.set_title(f"Wakis {field}{component}{cut}") ax.set_xlabel(xax) ax.set_ylabel(yax) if n is not None: - fig.suptitle('$'+str(field)+'_{'+str(component)+'}$ field, timestep='+str(n)) - title += '_'+str(n).zfill(6) + fig.suptitle( + "$" + + str(field) + + "_{" + + str(component) + + "}$ field, timestep=" + + str(n) + ) + title += "_" + str(n).zfill(6) fig.tight_layout() if off_screen: - fig.savefig(title+'.png') + fig.savefig(title + ".png") plt.clf() plt.close(fig) elif return_handles: @@ -549,20 +737,30 @@ def plot2D(self, field='E', component='z', plane='ZY', pos=0.5, norm=None, else: plt.show(block=False) else: - fig, ax = plt.subplots(1,1, figsize=figsize, dpi=dpi) - if field == 'E': + fig, ax = plt.subplots(1, 1, figsize=figsize, dpi=dpi) + if field == "E": _field = self.E[x, y, z, component] - if field == 'H': + if field == "H": _field = self.H[x, y, z, component] - if field == 'J': + if field == "J": _field = self.J[x, y, z, component] - im = ax.imshow(_field, cmap=cmap, norm=norm, - extent=extent, origin='lower', vmin=vmin, vmax=vmax, - interpolation=interpolation) - - fig.colorbar(im, cax=make_axes_locatable(ax).append_axes('right', size='5%', pad=0.05)) - ax.set_title(f'Wakis {field}{component}{cut}') + im = ax.imshow( + _field, + cmap=cmap, + norm=norm, + extent=extent, + origin="lower", + vmin=vmin, + vmax=vmax, + interpolation=interpolation, + ) + + fig.colorbar( + im, + cax=make_axes_locatable(ax).append_axes("right", size="5%", pad=0.05), + ) + ax.set_title(f"Wakis {field}{component}{cut}") ax.set_xlabel(xax) ax.set_ylabel(yax) @@ -575,7 +773,13 @@ def plot2D(self, field='E', component='z', plane='ZY', pos=0.5, norm=None, patch[mask] = np.nan else: patch[np.logical_not(mask)] = np.nan - ax.imshow(patch[x,y,z], cmap='Greys', extent=extent, origin='lower', alpha=patch_alpha) + ax.imshow( + patch[x, y, z], + cmap="Greys", + extent=extent, + origin="lower", + alpha=patch_alpha, + ) elif type(add_patch) is list: for solid in add_patch: @@ -585,16 +789,29 @@ def plot2D(self, field='E', component='z', plane='ZY', pos=0.5, norm=None, patch[mask] = np.nan else: patch[np.logical_not(mask)] = np.nan - ax.imshow(patch[x,y,z], cmap='Greys', extent=extent, origin='lower', alpha=patch_alpha) + ax.imshow( + patch[x, y, z], + cmap="Greys", + extent=extent, + origin="lower", + alpha=patch_alpha, + ) if n is not None: - fig.suptitle('$'+str(field)+'_{'+str(component)+'}$ field, timestep='+str(n)) - title += '_'+str(n).zfill(6) + fig.suptitle( + "$" + + str(field) + + "_{" + + str(component) + + "}$ field, timestep=" + + str(n) + ) + title += "_" + str(n).zfill(6) fig.tight_layout() if off_screen: - fig.savefig(title+'.png') + fig.savefig(title + ".png") plt.clf() plt.close(fig) elif return_handles: @@ -602,11 +819,24 @@ def plot2D(self, field='E', component='z', plane='ZY', pos=0.5, norm=None, else: plt.show(block=False) - def plot1D(self, field='E', component='z', line='z', pos=[0.5], - xscale='linear', yscale='linear', xlim=None, ylim=None, - figsize=[8,4], title=None, off_screen=False, n=None, - colors=None, **kwargs): - ''' + def plot1D( + self, + field="E", + component="z", + line="z", + pos=[0.5], + xscale="linear", + yscale="linear", + xlim=None, + ylim=None, + figsize=[8, 4], + title=None, + off_screen=False, + n=None, + colors=None, + **kwargs, + ): + """ Built-in 1D plotting of a field line using matplotlib Parameters: @@ -644,7 +874,7 @@ def plot1D(self, field='E', component='z', line='z', pos=[0.5], Keyword arguments to be passed to the `matplotlib.plot` function. Default kwargs used: kwargs = {'color':'g', 'lw':1.2, 'ls':'-'} - ''' + """ Nx, Ny, Nz = self.Nx, self.Ny, self.Nz xmin, xmax = self.grid.xmin, self.grid.xmax ymin, ymax = self.grid.ymin, self.grid.ymax @@ -656,106 +886,125 @@ def plot1D(self, field='E', component='z', line='z', pos=[0.5], Nz = self.grid.NZ _z = self.grid.Z if self.rank == 0: - fig, ax = plt.subplots(1,1, figsize=figsize) + fig, ax = plt.subplots(1, 1, figsize=figsize) else: - fig, ax = plt.subplots(1,1, figsize=figsize) - + fig, ax = plt.subplots(1, 1, figsize=figsize) - plotkw = {'lw':1.2, 'ls':'-'} + plotkw = {"lw": 1.2, "ls": "-"} if colors is None: - colors = ['k', 'tab:red', 'tab:blue', 'tab:green', - 'tab:orange', 'tab:purple', 'tab:pink'] + colors = [ + "k", + "tab:red", + "tab:blue", + "tab:green", + "tab:orange", + "tab:purple", + "tab:pink", + ] plotkw.update(kwargs) - if len(field) == 2: #support for e.g. field='Ex' + if len(field) == 2: # support for e.g. field='Ex' component = field[1] field = field[0] if title is None: - title = field + component +'1d' + title = field + component + "1d" - if type(pos) is not list: #support for a list of cut positions + if type(pos) is not list: # support for a list of cut positions pos_arr = [pos] else: pos_arr = pos for i, pos in enumerate(pos_arr): - if type(line) is not str and len(line) == 3: x, y, z = line[0], line[1], line[2] - #z-axis + # z-axis if type(line[2]) is slice: - cut = f'(a,b,z) a={round(self.x[x],3)}, b={round(self.y[y],3)}' - xax = 'z' + cut = f"(a,b,z) a={round(self.x[x], 3)}, b={round(self.y[y], 3)}" + xax = "z" xx = _z[z] xlims = (_z[z].min(), _z[z].max()) - #x-axis + # x-axis elif type(line[0]) is slice: - cut = f'(x,a,b) a={round(self.y[y],3)}, b={round(_z[z],3)}' - xax = 'x' + cut = f"(x,a,b) a={round(self.y[y], 3)}, b={round(_z[z], 3)}" + xax = "x" xx = self.x[x] xlims = (self.x[x].min(), self.x[x].max()) - #y-axis + # y-axis elif type(line[1]) is slice: - cut = f'(a,y,b) a={round(self.x[x],3)}, b={round(_z[z],3)}' - xax = 'y' + cut = f"(a,y,b) a={round(self.x[x], 3)}, b={round(_z[z], 3)}" + xax = "y" xx = self.y[y] xlims = (self.y[y].min(), self.y[y].max()) - elif line.lower() == 'x': - x, y, z = slice(0,Nx), int(Ny*pos), int(Nz*pos) #x-axis - cut = f'(x,a,b) a={round(self.y[y],3)}, b={round(_z[z],3)}' - xax = 'x' + elif line.lower() == "x": + x, y, z = slice(0, Nx), int(Ny * pos), int(Nz * pos) # x-axis + cut = f"(x,a,b) a={round(self.y[y], 3)}, b={round(_z[z], 3)}" + xax = "x" xx = self.x[x] xlims = (xmin, xmax) - elif line.lower() == 'y': - x, y, z = int(Nx*pos), slice(0,Ny), int(Nz*pos) #y-axis - cut = f'(a,y,b) a={round(self.x[x],3)}, b={round(_z[z],3)}' - xax = 'y' + elif line.lower() == "y": + x, y, z = int(Nx * pos), slice(0, Ny), int(Nz * pos) # y-axis + cut = f"(a,y,b) a={round(self.x[x], 3)}, b={round(_z[z], 3)}" + xax = "y" xx = self.y[y] xlims = (ymin, ymax) - elif line.lower() == 'z': - x, y, z = int(Nx*pos), int(Ny*pos), slice(0,Nz) #z-axis - cut = f'(a,b,z) a={round(self.x[x],3)}, b={round(self.y[y],3)}' - xax = 'z' + elif line.lower() == "z": + x, y, z = int(Nx * pos), int(Ny * pos), slice(0, Nz) # z-axis + cut = f"(a,b,z) a={round(self.x[x], 3)}, b={round(self.y[y], 3)}" + xax = "z" xx = _z[z] xlims = (zmin, zmax) else: - print("line needs to be an array of slices [x,y,z] or a str 'x', 'y', 'z'") + print( + "line needs to be an array of slices [x,y,z] or a str 'x', 'y', 'z'" + ) - if i == 0: # first one on top + if i == 0: # first one on top zorder = 10 else: zorder = i - if self.use_mpi: # only in rank=0 + if self.use_mpi: # only in rank=0 _field = self.mpi_gather(field, x=x, y=y, z=z, component=component) if self.rank == 0: - ax.plot(xx, _field, color=colors[i], zorder=zorder, - label=f'{field}{component}{cut}', **plotkw) + ax.plot( + xx, + _field, + color=colors[i], + zorder=zorder, + label=f"{field}{component}{cut}", + **plotkw, + ) else: - if field == 'E': + if field == "E": _field = self.E[x, y, z, component] - if field == 'H': + if field == "H": _field = self.H[x, y, z, component] - if field == 'J': + if field == "J": _field = self.J[x, y, z, component] - ax.plot(xx, _field, color=colors[i], zorder=zorder, - label=f'{field}{component}{cut}', **plotkw) + ax.plot( + xx, + _field, + color=colors[i], + zorder=zorder, + label=f"{field}{component}{cut}", + **plotkw, + ) if not self.use_mpi: - yax = f'{field}{component} amplitude' + yax = f"{field}{component} amplitude" - ax.set_title(f'Wakis {field}{component}'+(len(pos_arr)==1)*f'{cut}') + ax.set_title(f"Wakis {field}{component}" + (len(pos_arr) == 1) * f"{cut}") ax.set_xlabel(xax) ax.set_ylabel(yax, color=colors[0]) ax.set_xlim(xlims) @@ -772,13 +1021,15 @@ def plot1D(self, field='E', component='z', line='z', pos=[0.5], ax.set_ylim(ylim) if n is not None: - fig.suptitle('$'+field+'_{'+component+'}$ field, timestep='+str(n)) - title += '_'+str(n).zfill(6) + fig.suptitle( + "$" + field + "_{" + component + "}$ field, timestep=" + str(n) + ) + title += "_" + str(n).zfill(6) fig.tight_layout() if off_screen: - fig.savefig(title+'.png') + fig.savefig(title + ".png") plt.clf() plt.close(fig) @@ -786,9 +1037,9 @@ def plot1D(self, field='E', component='z', line='z', pos=[0.5], plt.show() elif self.use_mpi and self.rank == 0: - yax = f'{field}{component} amplitude' + yax = f"{field}{component} amplitude" - ax.set_title(f'Wakis {field}{component}'+(len(pos_arr)==1)*f'{cut}') + ax.set_title(f"Wakis {field}{component}" + (len(pos_arr) == 1) * f"{cut}") ax.set_xlabel(xax) ax.set_ylabel(yax, color=colors[0]) ax.set_xlim(xlims) @@ -805,25 +1056,34 @@ def plot1D(self, field='E', component='z', line='z', pos=[0.5], ax.set_ylim(ylim) if n is not None: - fig.suptitle('$'+field+'_{'+component+'}$ field, timestep='+str(n)) - title += '_'+str(n).zfill(6) + fig.suptitle( + "$" + field + "_{" + component + "}$ field, timestep=" + str(n) + ) + title += "_" + str(n).zfill(6) fig.tight_layout() if off_screen: - fig.savefig(title+'.png') + fig.savefig(title + ".png") plt.clf() plt.close(fig) else: plt.show() - def inspect(self, wake=None, window_size=None, off_screen=False, - opacity=1.0, inactive_opacity=0.1, add_silhouette=False, - specular=0.5, smooth_shading=False): - + def inspect( + self, + wake=None, + window_size=None, + off_screen=False, + opacity=1.0, + inactive_opacity=0.1, + add_silhouette=False, + specular=0.5, + smooth_shading=False, + ): if self.use_mpi: - print('[!] plot3D is not supported when `use_mpi=True`') + print("[!] plot3D is not supported when `use_mpi=True`") return if wake is not None: self.wake = wake @@ -834,9 +1094,15 @@ def inspect(self, wake=None, window_size=None, off_screen=False, for key, path in self.stl_solids.items(): surf = self.grid.read_stl(key) color = self.stl_colors.get(key, "lightgray") - actor = pl.add_mesh(surf, color=color, name=key, - opacity=inactive_opacity, silhouette=False, - smooth_shading=smooth_shading, specular=specular) + actor = pl.add_mesh( + surf, + color=color, + name=key, + opacity=inactive_opacity, + silhouette=False, + smooth_shading=smooth_shading, + specular=specular, + ) sil = None if add_silhouette: sil = pl.add_silhouette(surf, color="black", line_width=3.0) @@ -863,8 +1129,9 @@ def inspect(self, wake=None, window_size=None, off_screen=False, cy = h // 2 # checkboxes callbacks for solids and master (all On/Off) - color_on = 'green' - color_off = 'white' + color_on = "green" + color_off = "white" + def apply(state): if state["highlight"]: state["actor"].GetProperty().SetOpacity(state["active_opacity"]) @@ -881,9 +1148,11 @@ def _cb(v): s["checked"] = bool(v) s["highlight"] = s["checked"] apply(s) + return _cb master_on = True + def master_cb(v): nonlocal master_on master_on = bool(v) @@ -897,20 +1166,29 @@ def master_cb(v): rep.SetState(1 if master_on else 0) apply(s) - pl.add_checkbox_button_widget(master_cb, value=False, - color_on=color_on, color_off=color_off, - position=(cx, cy), size=box) + pl.add_checkbox_button_widget( + master_cb, + value=False, + color_on=color_on, + color_off=color_off, + position=(cx, cy), + size=box, + ) pl.add_text("All on", position=(cx + box + pad, cy), font_size=font) for i, name in enumerate(solid_state): y = cy - (i + 2) * dy _color_on = self.stl_colors.get(name, color_on) - if str(_color_on) == 'white' or list(_color_on) == [1.0, 1.0, 1.0]: - _color_on = 'gray' - btn = pl.add_checkbox_button_widget(make_cb(name), value=False, - color_on=_color_on, - color_off=color_off, - position=(cx, y), size=box) + if str(_color_on) == "white" or list(_color_on) == [1.0, 1.0, 1.0]: + _color_on = "gray" + btn = pl.add_checkbox_button_widget( + make_cb(name), + value=False, + color_on=_color_on, + color_off=color_off, + position=(cx, y), + size=box, + ) solid_state[name]["button"] = btn pl.add_text(name, position=(cx + box + pad, y), font_size=font) @@ -918,16 +1196,28 @@ def master_cb(v): if self.wake is not None: z_center = 0.5 * (self.grid.zmin + self.grid.zmax) z_height = self.grid.zmax - self.grid.zmin - radius = 0.005 * max(self.grid.xmax-self.grid.xmin, self.grid.ymax-self.grid.ymin) - - beam = pv.Cylinder(center=(self.wake.xsource, self.wake.ysource, z_center), - direction=(0, 0, 1), height=z_height, radius=radius*1.1) - path = pv.Cylinder(center=(self.wake.xtest, self.wake.ytest, z_center), - direction=(0, 0, 1), height=z_height, radius=radius) + radius = 0.005 * max( + self.grid.xmax - self.grid.xmin, self.grid.ymax - self.grid.ymin + ) + + beam = pv.Cylinder( + center=(self.wake.xsource, self.wake.ysource, z_center), + direction=(0, 0, 1), + height=z_height, + radius=radius * 1.1, + ) + path = pv.Cylinder( + center=(self.wake.xtest, self.wake.ytest, z_center), + direction=(0, 0, 1), + height=z_height, + radius=radius, + ) beam_actor = pl.add_mesh(beam, color="orange", name="beam", opacity=1.0) beam_actor.SetVisibility(True) - path_actor = pl.add_mesh(path, color="blue", name="integration_path", opacity=1.0) + path_actor = pl.add_mesh( + path, color="blue", name="integration_path", opacity=1.0 + ) path_actor.SetVisibility(True) bx = int(w - box - 200 * ui) @@ -935,20 +1225,31 @@ def master_cb(v): def beam_cb(v): beam_actor.SetVisibility(bool(v)) + def path_cb(v): path_actor.SetVisibility(bool(v)) - pl.add_checkbox_button_widget(path_cb, value=True, - color_off=color_off, color_on="blue", - position=(bx, cy + dy), size=box) + pl.add_checkbox_button_widget( + path_cb, + value=True, + color_off=color_off, + color_on="blue", + position=(bx, cy + dy), + size=box, + ) pl.add_text("Integration path", position=(bx + to, cy + dy), font_size=font) - pl.add_checkbox_button_widget(beam_cb, value=True, - color_off=color_off, color_on="orange", - position=(bx, cy), size=box) + pl.add_checkbox_button_widget( + beam_cb, + value=True, + color_off=color_off, + color_on="orange", + position=(bx, cy), + size=box, + ) pl.add_text("Beam", position=(bx + to, cy), font_size=font) - pl.set_background('mistyrose', top='white') + pl.set_background("mistyrose", top="white") self._add_logo_widget(pl) pl.add_axes() @@ -964,15 +1265,18 @@ def _add_logo_widget(self, pl): """Add packaged logo via importlib.resources (Python 3.9+).""" try: from importlib import resources + # resource inside the installed package (use current package) - logo_res = resources.files(__package__).joinpath('static', 'img', 'wakis-logo-pink.png') + logo_res = resources.files(__package__).joinpath( + "static", "img", "wakis-logo-pink.png" + ) with resources.as_file(logo_res) as logo_path: pl.add_logo_widget(str(logo_path)) return except Exception as e: # fallback to the legacy relative path for dev installs try: - pl.add_logo_widget('../docs/img/wakis-logo-pink.png') + pl.add_logo_widget("../docs/img/wakis-logo-pink.png") except Exception: if self.verbose > 1: - print(f'[!] Could not add logo widget: {e}') \ No newline at end of file + print(f"[!] Could not add logo widget: {e}") diff --git a/wakis/pmlBlock2D.py b/wakis/pmlBlock2D.py index 073a82d..210d224 100644 --- a/wakis/pmlBlock2D.py +++ b/wakis/pmlBlock2D.py @@ -1,9 +1,20 @@ import numpy as np -from scipy.constants import c as c_light, epsilon_0 as eps_0, mu_0 as mu_0 +from scipy.constants import epsilon_0 as eps_0, mu_0 as mu_0 class PmlBlock2D: - def __init__(self, Nx, Ny, dt, dx, dy, lx_block=None, ly_block=None, rx_block=None, ry_block=None): + def __init__( + self, + Nx, + Ny, + dt, + dx, + dy, + lx_block=None, + ly_block=None, + rx_block=None, + ry_block=None, + ): self.Nx = Nx self.Ny = Ny self.dt = dt @@ -57,79 +68,90 @@ def __init__(self, Nx, Ny, dt, dx, dy, lx_block=None, ly_block=None, rx_block=No self.C6 = self.dt / eps_0 def assemble_coeffs(self): - self.Ax = (2 * eps_0 - self.dt * self.sigma_x) / (2 * eps_0 + self.dt * self.sigma_x) - self.Ay = (2 * eps_0 - self.dt * self.sigma_y) / (2 * eps_0 + self.dt * self.sigma_y) - self.Az = (2 * eps_0 - self.dt * self.sigma_z) / (2 * eps_0 + self.dt * self.sigma_z) + self.Ax = (2 * eps_0 - self.dt * self.sigma_x) / ( + 2 * eps_0 + self.dt * self.sigma_x + ) + self.Ay = (2 * eps_0 - self.dt * self.sigma_y) / ( + 2 * eps_0 + self.dt * self.sigma_y + ) + self.Az = (2 * eps_0 - self.dt * self.sigma_z) / ( + 2 * eps_0 + self.dt * self.sigma_z + ) self.Bx = 2 * self.dt / (2 * eps_0 + self.dt * self.sigma_x) self.By = 2 * self.dt / (2 * eps_0 + self.dt * self.sigma_y) self.Bz = 2 * self.dt / (2 * eps_0 + self.dt * self.sigma_z) - self.Cx = (2 * mu_0 - self.dt * self.sigma_star_x) / (2 * mu_0 + self.dt * self.sigma_star_x) - self.Cy = (2 * mu_0 - self.dt * self.sigma_star_y) / (2 * mu_0 + self.dt * self.sigma_star_y) - self.Cz = (2 * mu_0 - self.dt * self.sigma_star_z) / (2 * mu_0 + self.dt * self.sigma_star_z) + self.Cx = (2 * mu_0 - self.dt * self.sigma_star_x) / ( + 2 * mu_0 + self.dt * self.sigma_star_x + ) + self.Cy = (2 * mu_0 - self.dt * self.sigma_star_y) / ( + 2 * mu_0 + self.dt * self.sigma_star_y + ) + self.Cz = (2 * mu_0 - self.dt * self.sigma_star_z) / ( + 2 * mu_0 + self.dt * self.sigma_star_z + ) self.Dx = 2 * self.dt / (2 * mu_0 + self.dt * self.sigma_star_x) self.Dy = 2 * self.dt / (2 * mu_0 + self.dt * self.sigma_star_y) self.Dz = 2 * self.dt / (2 * mu_0 + self.dt * self.sigma_star_z) def advance_h_fdtd(self): - Hz = self.Hz - Ex = self.Ex - Ey = self.Ey - for ii in range(self.Nx): for jj in range(self.Ny): - self.Hzx[ii, jj] = self.Cx[ii, jj] * self.Hzx[ii, jj] - self.Dx[ii, jj] / self.dx * (self.Ey[ii + 1, jj] - - self.Ey[ii, jj]) - self.Hzy[ii, jj] = self.Cy[ii, jj] * self.Hzy[ii, jj] + self.Dy[ii, jj] / self.dy * (self.Ex[ii, jj + 1] - - self.Ex[ii, jj]) + self.Hzx[ii, jj] = self.Cx[ii, jj] * self.Hzx[ii, jj] - self.Dx[ + ii, jj + ] / self.dx * (self.Ey[ii + 1, jj] - self.Ey[ii, jj]) + self.Hzy[ii, jj] = self.Cy[ii, jj] * self.Hzy[ii, jj] + self.Dy[ + ii, jj + ] / self.dy * (self.Ex[ii, jj + 1] - self.Ex[ii, jj]) self.Hz = self.Hzx + self.Hzy def advance_e_fdtd(self): - Hz = self.Hz - Ex = self.Ex - Ey = self.Ey - for ii in range(self.Nx): for jj in range(1, self.Ny): - self.Exy[ii, jj] = self.Ay[ii, jj] * self.Exy[ii, jj] + self.By[ii, jj] / self.dy * ( - self.Hz[ii, jj] - self.Hz[ii, jj - 1]) + self.Exy[ii, jj] = self.Ay[ii, jj] * self.Exy[ii, jj] + self.By[ + ii, jj + ] / self.dy * (self.Hz[ii, jj] - self.Hz[ii, jj - 1]) self.Exz[ii, jj] = self.Az[ii, jj] * self.Exz[ii, jj] for ii in range(1, self.Nx): for jj in range(self.Ny): self.Eyz[ii, jj] = self.Az[ii, jj] * self.Eyz[ii, jj] - self.Eyx[ii, jj] = self.Ax[ii, jj] * self.Eyx[ii, jj] - self.Bx[ii, jj] / self.dx * ( - self.Hz[ii, jj] - self.Hz[ii - 1, jj]) + self.Eyx[ii, jj] = self.Ax[ii, jj] * self.Eyx[ii, jj] - self.Bx[ + ii, jj + ] / self.dx * (self.Hz[ii, jj] - self.Hz[ii - 1, jj]) self.Ex = self.Exy + self.Exz self.Ey = self.Eyx + self.Eyz def update_e_boundary(self): - if self.lx_block is not None: for jj in range(self.Ny): self.Eyz[0, jj] = self.Az[0, jj] * self.Eyz[0, jj] - self.Eyx[0, jj] = self.Ax[0, jj] * self.Eyx[0, jj] - self.Bx[0, jj] / self.dx * ( - self.Hz[0, jj] - self.lx_block.Hz[-1, jj]) + self.Eyx[0, jj] = self.Ax[0, jj] * self.Eyx[0, jj] - self.Bx[ + 0, jj + ] / self.dx * (self.Hz[0, jj] - self.lx_block.Hz[-1, jj]) if self.rx_block is not None: for jj in range(self.Ny): self.Eyz[-1, jj] = self.Az[-1, jj] * self.Eyz[-1, jj] - self.Eyx[-1, jj] = self.Ax[-1, jj] * self.Eyx[-1, jj] - self.Bx[-1, jj] / self.dx * ( - self.rx_block.Hz[0, jj] - self.Hz[-1, jj]) + self.Eyx[-1, jj] = self.Ax[-1, jj] * self.Eyx[-1, jj] - self.Bx[ + -1, jj + ] / self.dx * (self.rx_block.Hz[0, jj] - self.Hz[-1, jj]) self.Ey = self.Eyx + self.Eyz if self.ly_block is not None: for ii in range(self.Nx): - self.Exy[ii, 0] = self.Ay[ii, 0] * self.Exy[ii, 0] + self.By[ii, 0] / self.dy * ( - self.Hz[ii, 0] - self.ly_block.Hz[ii, - 1]) + self.Exy[ii, 0] = self.Ay[ii, 0] * self.Exy[ii, 0] + self.By[ + ii, 0 + ] / self.dy * (self.Hz[ii, 0] - self.ly_block.Hz[ii, -1]) self.Exz[ii, 0] = self.Az[ii, 0] * self.Exz[ii, 0] if self.ry_block is not None: for ii in range(self.Nx): - self.Exy[ii, -1] = self.Ay[ii, -1] * self.Exy[ii, -1] + self.By[ii, -1] / self.dy * ( - self.ry_block.Hz[ii, 0] - self.Hz[ii, - 1]) + self.Exy[ii, -1] = self.Ay[ii, -1] * self.Exy[ii, -1] + self.By[ + ii, -1 + ] / self.dy * (self.ry_block.Hz[ii, 0] - self.Hz[ii, -1]) self.Exz[ii, -1] = self.Az[ii, -1] * self.Exz[ii, -1] self.Ex = self.Exy + self.Exz diff --git a/wakis/pmlBlock3D.py b/wakis/pmlBlock3D.py index ae98d0b..ec82640 100644 --- a/wakis/pmlBlock3D.py +++ b/wakis/pmlBlock3D.py @@ -1,10 +1,27 @@ import numpy as np -from scipy.constants import c as c_light, epsilon_0 as eps_0, mu_0 as mu_0 +from scipy.constants import epsilon_0 as eps_0, mu_0 as mu_0 class PmlBlock3D: - def __init__(self, Nx, Ny, Nz, dt, dx, dy, dz, i_block, j_block, k_block, lx_block=None, ly_block=None, lz_block=None, rx_block=None, - ry_block=None, rz_block=None): + def __init__( + self, + Nx, + Ny, + Nz, + dt, + dx, + dy, + dz, + i_block, + j_block, + k_block, + lx_block=None, + ly_block=None, + lz_block=None, + rx_block=None, + ry_block=None, + rz_block=None, + ): self.Nx = Nx self.Ny = Ny self.Nz = Nz @@ -79,88 +96,128 @@ def __init__(self, Nx, Ny, Nz, dt, dx, dy, dz, i_block, j_block, k_block, lx_blo self.C6 = self.dt / eps_0 def assemble_coeffs(self): - self.Ax = (2 * eps_0 - self.dt * self.sigma_x) / (2 * eps_0 + self.dt * self.sigma_x) - self.Ay = (2 * eps_0 - self.dt * self.sigma_y) / (2 * eps_0 + self.dt * self.sigma_y) - self.Az = (2 * eps_0 - self.dt * self.sigma_z) / (2 * eps_0 + self.dt * self.sigma_z) + self.Ax = (2 * eps_0 - self.dt * self.sigma_x) / ( + 2 * eps_0 + self.dt * self.sigma_x + ) + self.Ay = (2 * eps_0 - self.dt * self.sigma_y) / ( + 2 * eps_0 + self.dt * self.sigma_y + ) + self.Az = (2 * eps_0 - self.dt * self.sigma_z) / ( + 2 * eps_0 + self.dt * self.sigma_z + ) self.Bx = 2 * self.dt / (2 * eps_0 + self.dt * self.sigma_x) self.By = 2 * self.dt / (2 * eps_0 + self.dt * self.sigma_y) self.Bz = 2 * self.dt / (2 * eps_0 + self.dt * self.sigma_z) - self.Cx = (2 * mu_0 - self.dt * self.sigma_star_x) / (2 * mu_0 + self.dt * self.sigma_star_x) - self.Cy = (2 * mu_0 - self.dt * self.sigma_star_y) / (2 * mu_0 + self.dt * self.sigma_star_y) - self.Cz = (2 * mu_0 - self.dt * self.sigma_star_z) / (2 * mu_0 + self.dt * self.sigma_star_z) + self.Cx = (2 * mu_0 - self.dt * self.sigma_star_x) / ( + 2 * mu_0 + self.dt * self.sigma_star_x + ) + self.Cy = (2 * mu_0 - self.dt * self.sigma_star_y) / ( + 2 * mu_0 + self.dt * self.sigma_star_y + ) + self.Cz = (2 * mu_0 - self.dt * self.sigma_star_z) / ( + 2 * mu_0 + self.dt * self.sigma_star_z + ) self.Dx = 2 * self.dt / (2 * mu_0 + self.dt * self.sigma_star_x) self.Dy = 2 * self.dt / (2 * mu_0 + self.dt * self.sigma_star_y) self.Dz = 2 * self.dt / (2 * mu_0 + self.dt * self.sigma_star_z) def advance_h_fdtd(self): - Hz = self.Hz - Ex = self.Ex - Ey = self.Ey - for ii in range(self.Nx): for jj in range(self.Ny): for kk in range(self.Nz + 1): - self.Hzx[ii, jj, kk] = self.Cx[ii, jj, kk] * self.Hzx[ii, jj, kk] - self.Dx[ii, jj, kk] / self.dx * (self.Ey[ii + 1, jj, kk] - - self.Ey[ii, jj, kk]) - self.Hzy[ii, jj, kk] = self.Cy[ii, jj, kk] * self.Hzy[ii, jj, kk] + self.Dy[ii, jj, kk] / self.dy * (self.Ex[ii, jj + 1, kk] - - self.Ex[ii, jj, kk]) + self.Hzx[ii, jj, kk] = self.Cx[ii, jj, kk] * self.Hzx[ + ii, jj, kk + ] - self.Dx[ii, jj, kk] / self.dx * ( + self.Ey[ii + 1, jj, kk] - self.Ey[ii, jj, kk] + ) + self.Hzy[ii, jj, kk] = self.Cy[ii, jj, kk] * self.Hzy[ + ii, jj, kk + ] + self.Dy[ii, jj, kk] / self.dy * ( + self.Ex[ii, jj + 1, kk] - self.Ex[ii, jj, kk] + ) for ii in range(self.Nx + 1): for jj in range(self.Ny): for kk in range(self.Nz): - self.Hxy[ii, jj, kk] = self.Cy[ii, jj, kk] * self.Hxy[ii, jj, kk] - self.Dy[ii, jj, kk] / self.dy * (self.Ez[ii, jj + 1, kk] - - self.Ez[ii, jj, kk]) - self.Hxz[ii, jj, kk] = self.Cz[ii, jj, kk] * self.Hxz[ii, jj, kk] + self.Dz[ii, jj, kk] / self.dz * (self.Ey[ii, jj, kk + 1] - - self.Ey[ii, jj, kk]) + self.Hxy[ii, jj, kk] = self.Cy[ii, jj, kk] * self.Hxy[ + ii, jj, kk + ] - self.Dy[ii, jj, kk] / self.dy * ( + self.Ez[ii, jj + 1, kk] - self.Ez[ii, jj, kk] + ) + self.Hxz[ii, jj, kk] = self.Cz[ii, jj, kk] * self.Hxz[ + ii, jj, kk + ] + self.Dz[ii, jj, kk] / self.dz * ( + self.Ey[ii, jj, kk + 1] - self.Ey[ii, jj, kk] + ) for ii in range(self.Nx): for jj in range(self.Ny + 1): for kk in range(self.Nz): - self.Hyx[ii, jj, kk] = self.Cx[ii, jj, kk] * self.Hyx[ii, jj, kk] + self.Dx[ii, jj, kk] / self.dx * (self.Ez[ii + 1, jj, kk] - - self.Ez[ii, jj, kk]) - self.Hyz[ii, jj, kk] = self.Cz[ii, jj, kk] * self.Hyz[ii, jj, kk] - self.Dz[ii, jj, kk] / self.dz * (self.Ex[ii, jj, kk + 1] - - self.Ex[ii, jj, kk]) + self.Hyx[ii, jj, kk] = self.Cx[ii, jj, kk] * self.Hyx[ + ii, jj, kk + ] + self.Dx[ii, jj, kk] / self.dx * ( + self.Ez[ii + 1, jj, kk] - self.Ez[ii, jj, kk] + ) + self.Hyz[ii, jj, kk] = self.Cz[ii, jj, kk] * self.Hyz[ + ii, jj, kk + ] - self.Dz[ii, jj, kk] / self.dz * ( + self.Ex[ii, jj, kk + 1] - self.Ex[ii, jj, kk] + ) def advance_e_fdtd(self): - Hz = self.Hz - Ex = self.Ex - Ey = self.Ey - for ii in range(self.Nx): for jj in range(1, self.Ny): for kk in range(self.Nz + 1): - self.Exy[ii, jj, kk] = self.Ay[ii, jj, kk] * self.Exy[ii, jj, kk] + self.By[ii, jj, kk] / self.dy * ( - self.Hz[ii, jj, kk] - self.Hz[ii, jj - 1, kk]) + self.Exy[ii, jj, kk] = self.Ay[ii, jj, kk] * self.Exy[ + ii, jj, kk + ] + self.By[ii, jj, kk] / self.dy * ( + self.Hz[ii, jj, kk] - self.Hz[ii, jj - 1, kk] + ) for ii in range(self.Nx): for jj in range(self.Ny + 1): for kk in range(1, self.Nz): - self.Exz[ii, jj, kk] = self.Az[ii, jj, kk] * self.Exz[ii, jj, kk] - self.Bz[ii, jj, kk] / self.dz * ( - self.Hy[ii, jj, kk] - self.Hy[ii, jj, kk - 1]) + self.Exz[ii, jj, kk] = self.Az[ii, jj, kk] * self.Exz[ + ii, jj, kk + ] - self.Bz[ii, jj, kk] / self.dz * ( + self.Hy[ii, jj, kk] - self.Hy[ii, jj, kk - 1] + ) for ii in range(1, self.Nx): for jj in range(self.Ny): for kk in range(self.Nz + 1): - self.Eyx[ii, jj, kk] = self.Ax[ii, jj, kk] * self.Eyx[ii, jj, kk] - self.Bx[ii, jj, kk] / self.dx * ( - self.Hz[ii, jj, kk] - self.Hz[ii - 1, jj, kk]) + self.Eyx[ii, jj, kk] = self.Ax[ii, jj, kk] * self.Eyx[ + ii, jj, kk + ] - self.Bx[ii, jj, kk] / self.dx * ( + self.Hz[ii, jj, kk] - self.Hz[ii - 1, jj, kk] + ) for ii in range(self.Nx + 1): for jj in range(self.Ny): for kk in range(1, self.Nz): - self.Eyz[ii, jj, kk] = self.Az[ii, jj, kk] * self.Eyz[ii, jj, kk] + self.Bz[ii, jj, kk] / self.dz * ( - self.Hx[ii, jj, kk] - self.Hx[ii, jj, kk - 1]) + self.Eyz[ii, jj, kk] = self.Az[ii, jj, kk] * self.Eyz[ + ii, jj, kk + ] + self.Bz[ii, jj, kk] / self.dz * ( + self.Hx[ii, jj, kk] - self.Hx[ii, jj, kk - 1] + ) for ii in range(1, self.Nx): for jj in range(self.Ny + 1): for kk in range(self.Nz): - self.Ezx[ii, jj, kk] = self.Ax[ii, jj, kk]*self.Ezx[ii, jj, kk] + self.Bx[ii, jj, kk] / self.dx * ( - self.Hy[ii, jj, kk] - self.Hy[ii - 1, jj, kk]) + self.Ezx[ii, jj, kk] = self.Ax[ii, jj, kk] * self.Ezx[ + ii, jj, kk + ] + self.Bx[ii, jj, kk] / self.dx * ( + self.Hy[ii, jj, kk] - self.Hy[ii - 1, jj, kk] + ) for ii in range(self.Nx + 1): for jj in range(1, self.Ny): for kk in range(self.Nz): - self.Ezy[ii, jj, kk] = self.Ay[ii, jj, kk]*self.Ezy[ii, jj, kk] - self.By[ii, jj, kk] / self.dy * ( - self.Hx[ii, jj, kk] - self.Hx[ii, jj - 1, kk]) + self.Ezy[ii, jj, kk] = self.Ay[ii, jj, kk] * self.Ezy[ + ii, jj, kk + ] - self.By[ii, jj, kk] / self.dy * ( + self.Hx[ii, jj, kk] - self.Hx[ii, jj - 1, kk] + ) def sum_e_fields(self): self.Ex = self.Exy + self.Exz @@ -173,7 +230,6 @@ def sum_h_fields(self): self.Hz = self.Hzx + self.Hzy def update_e_boundary(self): - i_block = self.i_block j_block = self.j_block k_block = self.k_block @@ -205,61 +261,108 @@ def update_e_boundary(self): if i_block > 0 and blocks_mat[i_block - 1, j_block, k_block] is not None: for jj in range(Ny): for kk in range(Nz + 1): - Eyx[0, jj, kk] = Ax[0, jj, kk] * Eyx[0, jj, kk] - Bx[0, jj, kk] / dx * (Hz[0, jj, kk] - - blocks_mat[i_block - 1, j_block, k_block].Hz[-1, jj, kk]) + Eyx[0, jj, kk] = Ax[0, jj, kk] * Eyx[0, jj, kk] - Bx[ + 0, jj, kk + ] / dx * ( + Hz[0, jj, kk] + - blocks_mat[i_block - 1, j_block, k_block].Hz[-1, jj, kk] + ) for jj in range(Ny + 1): for kk in range(Nz): - Ezx[0, jj, kk] = Ax[0, jj, kk] * Ezx[0, jj, kk] + Bx[0, jj, kk] / dx * (Hy[0, jj, kk] - - blocks_mat[i_block - 1, j_block, k_block].Hy[-1, jj, kk]) + Ezx[0, jj, kk] = Ax[0, jj, kk] * Ezx[0, jj, kk] + Bx[ + 0, jj, kk + ] / dx * ( + Hy[0, jj, kk] + - blocks_mat[i_block - 1, j_block, k_block].Hy[-1, jj, kk] + ) if j_block > 0 and blocks_mat[i_block, j_block - 1, k_block] is not None: for ii in range(Nx): for kk in range(Nz + 1): - Exy[ii, 0, kk] = Ay[ii, 0, kk] * Exy[ii, 0, kk] + By[ii, 0, kk] / dy * (Hz[ii, 0, kk] - - blocks_mat[i_block, j_block - 1, k_block].Hz[ii, -1, kk]) + Exy[ii, 0, kk] = Ay[ii, 0, kk] * Exy[ii, 0, kk] + By[ + ii, 0, kk + ] / dy * ( + Hz[ii, 0, kk] + - blocks_mat[i_block, j_block - 1, k_block].Hz[ii, -1, kk] + ) for ii in range(Nx + 1): for kk in range(Nz): - Ezy[ii, 0, kk] = Ay[ii, 0, kk] * Ezy[ii, 0, kk] - By[ii, 0, kk] / dy * (Hx[ii, 0, kk] - - blocks_mat[i_block, j_block - 1, k_block].Hx[ii, -1, kk]) + Ezy[ii, 0, kk] = Ay[ii, 0, kk] * Ezy[ii, 0, kk] - By[ + ii, 0, kk + ] / dy * ( + Hx[ii, 0, kk] + - blocks_mat[i_block, j_block - 1, k_block].Hx[ii, -1, kk] + ) if k_block > 0 and blocks_mat[i_block, j_block, k_block - 1] is not None: for ii in range(Nx + 1): for jj in range(Ny): - Eyz[ii, jj, 0] = Az[ii, jj, 0] * Eyz[ii, jj, 0] + Bz[ii, jj, 0] / dz * (Hx[ii, jj, 0] - - blocks_mat[i_block, j_block, k_block - 1].Hx[ii, jj, - 1]) + Eyz[ii, jj, 0] = Az[ii, jj, 0] * Eyz[ii, jj, 0] + Bz[ + ii, jj, 0 + ] / dz * ( + Hx[ii, jj, 0] + - blocks_mat[i_block, j_block, k_block - 1].Hx[ii, jj, -1] + ) for ii in range(Nx): for jj in range(Ny + 1): - Exz[ii, jj, 0] = Az[ii, jj, 0] * Exz[ii, jj, 0] - Bz[ii, jj, 0] / dz * (Hy[ii, jj, 0] - - blocks_mat[i_block, j_block, k_block - 1].Hy[ii, jj, - 1]) + Exz[ii, jj, 0] = Az[ii, jj, 0] * Exz[ii, jj, 0] - Bz[ + ii, jj, 0 + ] / dz * ( + Hy[ii, jj, 0] + - blocks_mat[i_block, j_block, k_block - 1].Hy[ii, jj, -1] + ) # Update E on "upper" faces if i_block < 2 and blocks_mat[i_block + 1, j_block, k_block] is not None: for jj in range(Ny): for kk in range(Nz + 1): - Eyx[Nx, jj, kk] = Ax[Nx, jj, kk] * Eyx[Nx, jj, kk] - Bx[Nx, jj, kk] / dx * ( - blocks_mat[i_block + 1, j_block, k_block].Hz[0, jj, kk] - Hz[-1, jj, kk]) + Eyx[Nx, jj, kk] = Ax[Nx, jj, kk] * Eyx[Nx, jj, kk] - Bx[ + Nx, jj, kk + ] / dx * ( + blocks_mat[i_block + 1, j_block, k_block].Hz[0, jj, kk] + - Hz[-1, jj, kk] + ) for jj in range(Ny + 1): for kk in range(Nz): - Ezx[Nx, jj, kk] = Ax[Nx, jj, kk] * Ezx[Nx, jj, kk] + Bx[Nx, jj, kk] / dx * ( - blocks_mat[i_block + 1, j_block, k_block].Hy[0, jj, kk] - Hy[-1, jj, kk]) + Ezx[Nx, jj, kk] = Ax[Nx, jj, kk] * Ezx[Nx, jj, kk] + Bx[ + Nx, jj, kk + ] / dx * ( + blocks_mat[i_block + 1, j_block, k_block].Hy[0, jj, kk] + - Hy[-1, jj, kk] + ) if j_block < 2 and blocks_mat[i_block, j_block + 1, k_block] is not None: for ii in range(Nx): for kk in range(Nz + 1): - Exy[ii, Ny, kk] = Ay[ii, Ny, kk] * Exy[ii, Ny, kk] + By[ii, Ny, kk] / dy * ( - blocks_mat[i_block, j_block + 1, k_block].Hz[ii, 0, kk] - Hz[ii, -1, kk]) + Exy[ii, Ny, kk] = Ay[ii, Ny, kk] * Exy[ii, Ny, kk] + By[ + ii, Ny, kk + ] / dy * ( + blocks_mat[i_block, j_block + 1, k_block].Hz[ii, 0, kk] + - Hz[ii, -1, kk] + ) for ii in range(Nx + 1): for kk in range(Nz): - Ezy[ii, Ny, kk] = Ay[ii, Ny, kk] * Ezy[ii, Ny, kk] - By[ii, Ny, kk] / dy * ( - blocks_mat[i_block, j_block + 1, k_block].Hx[ii, 0, kk] - Hx[ii, -1, kk]) + Ezy[ii, Ny, kk] = Ay[ii, Ny, kk] * Ezy[ii, Ny, kk] - By[ + ii, Ny, kk + ] / dy * ( + blocks_mat[i_block, j_block + 1, k_block].Hx[ii, 0, kk] + - Hx[ii, -1, kk] + ) if k_block < 2 and blocks_mat[i_block, j_block, k_block + 1] is not None: for ii in range(Nx + 1): for jj in range(Ny): - Eyz[ii, jj, Nz] = Az[ii, jj, Nz] * Eyz[ii, jj, Nz] + Bz[ii, jj, Nz] / dz * ( - blocks_mat[i_block, j_block, k_block + 1].Hx[ii, jj, 0] - Hx[ii, jj, -1]) + Eyz[ii, jj, Nz] = Az[ii, jj, Nz] * Eyz[ii, jj, Nz] + Bz[ + ii, jj, Nz + ] / dz * ( + blocks_mat[i_block, j_block, k_block + 1].Hx[ii, jj, 0] + - Hx[ii, jj, -1] + ) for ii in range(Nx): for jj in range(Ny + 1): - Exz[ii, jj, Nz] = Az[ii, jj, Nz] * Exz[ii, jj, Nz] - Bz[ii, jj, Nz] / dz * ( - blocks_mat[i_block, j_block, k_block + 1].Hy[ii, jj, 0] - Hy[ii, jj, -1]) - + Exz[ii, jj, Nz] = Az[ii, jj, Nz] * Exz[ii, jj, Nz] - Bz[ + ii, jj, Nz + ] / dz * ( + blocks_mat[i_block, j_block, k_block + 1].Hy[ii, jj, 0] + - Hy[ii, jj, -1] + ) diff --git a/wakis/routines.py b/wakis/routines.py index ed70487..6c489b3 100644 --- a/wakis/routines.py +++ b/wakis/routines.py @@ -9,13 +9,25 @@ from tqdm import tqdm from wakis.sources import Beam -class RoutinesMixin(): - def emsolve(self, Nt, source=None, callback=None, - save=False, fields=['E'], components=['Abs'], save_every=1, subdomain=None, - plot=False, plot_every=1, use_etd=False, - plot3d=False, **kwargs): - ''' +class RoutinesMixin: + def emsolve( + self, + Nt, + source=None, + callback=None, + save=False, + fields=["E"], + components=["Abs"], + save_every=1, + subdomain=None, + plot=False, + plot_every=1, + use_etd=False, + plot3d=False, + **kwargs, + ): + """ Run the simulation and save the selected field components in HDF5 files for every timestep. Each field will be saved in a separate HDF5 file 'Xy.h5' where X is the field and y the component. @@ -68,20 +80,21 @@ def emsolve(self, Nt, source=None, callback=None, Dependencies: ------------- h5py - ''' + """ self.Nt = Nt if source is not None: self.source = source if save: - hfs = {} for field in fields: if len(field) == 1: for component in components: - hfs[field+component] = h5py.File(field+component+'.h5', 'w') + hfs[field + component] = h5py.File( + field + component + ".h5", "w" + ) else: - hfs[field] = h5py.File(field+'.h5', 'w') + hfs[field] = h5py.File(field + ".h5", "w") for hf in hfs: hf['x'], hf['y'], hf['z'] = self.x, self.y, self.z @@ -91,21 +104,39 @@ def emsolve(self, Nt, source=None, callback=None, if subdomain is not None: xx, yy, zz = subdomain else: - xx, yy, zz = slice(0,self.Nx), slice(0,self.Ny), slice(0,self.Nz) + xx, yy, zz = slice(0, self.Nx), slice(0, self.Ny), slice(0, self.Nz) if plot: - plotkw = {'field':'E', 'component':'z', - 'plane':'ZY', 'pos':0.5, 'cmap':'rainbow', - 'patch_reverse':True, 'title':'Ez', - 'off_screen': True, 'interpolation':'spline36'} + plotkw = { + "field": "E", + "component": "z", + "plane": "ZY", + "pos": 0.5, + "cmap": "rainbow", + "patch_reverse": True, + "title": "Ez", + "off_screen": True, + "interpolation": "spline36", + } plotkw.update(kwargs) if plot3d: - plotkw = {'field':'E', 'component':'z', - 'add_stl':None, 'stl_opacity':0.0, 'stl_colors':'white', - 'title':'Ez', 'cmap':'jet', 'clip_volume':False, 'clip_normal':'-y', - 'field_on_stl':True, 'field_opacity':1.0, - 'off_screen':True, 'zoom':1.0, 'nan_opacity':1.0} + plotkw = { + "field": "E", + "component": "z", + "add_stl": None, + "stl_opacity": 0.0, + "stl_colors": "white", + "title": "Ez", + "cmap": "jet", + "clip_volume": False, + "clip_normal": "-y", + "field_on_stl": True, + "field_opacity": 1.0, + "off_screen": True, + "zoom": 1.0, + "nan_opacity": 1.0, + } plotkw.update(kwargs) @@ -116,58 +147,65 @@ def emsolve(self, Nt, source=None, callback=None, # Time loop for n in tqdm(range(Nt)): - if source is not None: - source.update(self, n*self.dt) + source.update(self, n * self.dt) - if save and n%save_every == 0: + if save and n % save_every == 0: for field in hfs.keys(): try: - d = getattr(self, field[0])[xx,yy,zz,field[1:]] + d = getattr(self, field[0])[xx, yy, zz, field[1:]] except AttributeError: - raise(f'Component {field} not valid. Input must have a \ - field ["E", "H", "J"] and a component ["x", "y", "z", "Abs"]') + raise ( + f'Component {field} not valid. Input must have a \ + field ["E", "H", "J"] and a component ["x", "y", "z", "Abs"]' + ) # Save timestep in HDF5 - hfs[field]['#'+str(n).zfill(5)] = d + hfs[field]["#" + str(n).zfill(5)] = d # Advance self.one_step() # Plot - if plot and n%plot_every == 0: + if plot and n % plot_every == 0: self.plot2D(n=n, **plotkw) - if plot3d and n%plot_every == 0: + if plot3d and n % plot_every == 0: self.plot3D(n=n, **plotkw) # ABC BCs if self.activate_abc: - self.update_abc(E_abc_2, H_abc_2) # n-2 - E_abc_2, H_abc_2 = E_abc_1, H_abc_1 # n-1 - E_abc_1, H_abc_1 = self.get_abc() # n + self.update_abc(E_abc_2, H_abc_2) # n-2 + E_abc_2, H_abc_2 = E_abc_1, H_abc_1 # n-1 + E_abc_1, H_abc_1 = self.get_abc() # n # Callback func(solver, t) if callback is not None: - callback(self, n*self.dt) + callback(self, n * self.dt) # End if save: for hf in hfs: hf.close() - def wakesolve(self, wakelength, - wake=None, - callback=None, - compute_plane='both', - plot=False, plot_from=None, plot_every=1, plot_until=None, - save_J=False, - add_space=None, #for legacy - use_field_monitor=False, - field_monitor=None, - use_edt=None, #deprecated - **kwargs): - ''' + def wakesolve( + self, + wakelength, + wake=None, + callback=None, + compute_plane="both", + plot=False, + plot_from=None, + plot_every=1, + plot_until=None, + save_J=False, + add_space=None, # for legacy + use_field_monitor=False, + field_monitor=None, + use_edt=None, # deprecated + **kwargs, + ): + """ Run the EM simulation and compute the longitudinal (z) and transverse (x,y) wake potential WP(s) and impedance Z(s). @@ -217,30 +255,42 @@ def wakesolve(self, wakelength, Dependencies: ------------- h5py - ''' + """ if wake is not None: self.wake = wake if self.wake is None: - raise('Wake solver information not passed to the solver instantiation') + raise ("Wake solver information not passed to the solver instantiation") - if add_space is not None: #legacy support + if add_space is not None: # legacy support self.wake.skip_cells = add_space # plot params defaults if plot: - plotkw = {'plane':'ZY', 'pos':0.5, 'title':'Ez', - 'cmap':'rainbow', 'patch_reverse':True, - 'off_screen': True, 'interpolation':'spline36'} + plotkw = { + "plane": "ZY", + "pos": 0.5, + "title": "Ez", + "cmap": "rainbow", + "patch_reverse": True, + "off_screen": True, + "interpolation": "spline36", + } plotkw.update(kwargs) # integration path (test position) self.xtest, self.ytest = self.wake.xtest, self.wake.ytest - self.ixt, self.iyt = np.abs(self.x-self.xtest).argmin(), np.abs(self.y-self.ytest).argmin() - if compute_plane.lower() == 'longitudinal': + self.ixt, self.iyt = ( + np.abs(self.x - self.xtest).argmin(), + np.abs(self.y - self.ytest).argmin(), + ) + if compute_plane.lower() == "longitudinal": xx, yy = self.ixt, self.iyt else: - xx, yy = slice(self.ixt-1, self.ixt+2), slice(self.iyt-1, self.iyt+2) + xx, yy = ( + slice(self.ixt - 1, self.ixt + 2), + slice(self.iyt - 1, self.iyt + 2), + ) # Compute simulation time self.wake.wakelength = wakelength @@ -254,16 +304,18 @@ def wakesolve(self, wakelength, z = self.z zz = slice(0, self.Nz) - tmax = (wakelength + self.ti*self.v + (z.max()-z.min()))/self.v #[s] - Nt = int(tmax/self.dt) + tmax = (wakelength + self.ti * self.v + (z.max() - z.min())) / self.v # [s] + Nt = int(tmax / self.dt) self.tmax, self.Nt = tmax, Nt # Add beam source - beam = Beam(q=self.wake.q, - sigmaz=self.wake.sigmaz, - beta=self.wake.beta, - xsource=self.wake.xsource, ysource=self.wake.ysource, - ) + beam = Beam( + q=self.wake.q, + sigmaz=self.wake.sigmaz, + beta=self.wake.beta, + xsource=self.wake.xsource, + ysource=self.wake.ysource, + ) # hdf5 self.Ez_file = self.wake.Ez_file @@ -296,26 +348,25 @@ def save_to_h5(self, hf, field, x, y, z, comp, n): if self.use_mpi: _field = self.mpi_gather(field, x, y, z, comp) if self.rank == 0: - hf['#'+str(n).zfill(5)] = _field + hf["#" + str(n).zfill(5)] = _field else: - hf['#'+str(n).zfill(5)] = getattr(self, field)[x, y, z, comp] + hf["#" + str(n).zfill(5)] = getattr(self, field)[x, y, z, comp] if plot_until is None: plot_until = Nt if plot_from is None: - plot_from = int(self.ti/self.dt) + plot_from = int(self.ti / self.dt) - print('Running electromagnetic time-domain simulation...') + print("Running electromagnetic time-domain simulation...") t0 = time.time() for n in tqdm(range(Nt)): - # Initial condition - beam.update(self, n*self.dt) + beam.update(self, n * self.dt) # Save - save_to_h5(self, hf, 'E', xx, yy, zz, 'z', n) + save_to_h5(self, hf, "E", xx, yy, zz, "z", n) if save_J: - save_to_h5(self, hfJ, 'J', xx, yy, zz, 'z', n) + save_to_h5(self, hfJ, "J", xx, yy, zz, "z", n) # Advance self.one_step() @@ -325,18 +376,18 @@ def save_to_h5(self, hf, field, x, y, z, comp, n): # Plot if plot: - if n%plot_every == 0 and nplot_from: - self.plot2D(field='E', component='z', n=n, **plotkw) + if n % plot_every == 0 and n < plot_until and n > plot_from: + self.plot2D(field="E", component="z", n=n, **plotkw) else: pass # Callback func(solver, t) if callback is not None: - callback(self, n*self.dt) + callback(self, n * self.dt) # End of time loop if self.use_mpi: - if self.rank==0: + if self.rank == 0: hf.close() if save_J: hfJ.close() @@ -350,9 +401,9 @@ def save_to_h5(self, hf, field, x, y, z, comp, n): # Compute wakefield magnitudes is done inside WakeSolver self.wake.solve(compute_plane=compute_plane) - + # Forward parameters to logger - self.logger.wakeSolver=self.wake.logger.wakeSolver - self.logger.wakeSolver["wakelength"]=wakelength - self.logger.wakeSolver["simulationTime"]=time.time()-t0 + self.logger.wakeSolver = self.wake.logger.wakeSolver + self.logger.wakeSolver["wakelength"] = wakelength + self.logger.wakeSolver["simulationTime"] = time.time() - t0 self.logger.save_logs() diff --git a/wakis/solver2D.py b/wakis/solver2D.py index 2b89458..24ff0b2 100644 --- a/wakis/solver2D.py +++ b/wakis/solver2D.py @@ -12,13 +12,23 @@ def neq(a, b, tol=1e-8): class EMSolver2D: - def __init__(self, grid, sol_type, cfln, i_s, j_s, bc_low, bc_high, - N_pml_low=None, N_pml_high=None): + def __init__( + self, + grid, + sol_type, + cfln, + i_s, + j_s, + bc_low, + bc_high, + N_pml_low=None, + N_pml_high=None, + ): self.grid = grid self.type = type self.cfln = cfln - self.dt = cfln / (c_light * np.sqrt(1 / self.grid.dx ** 2 + 1 / self.grid.dy ** 2)) + self.dt = cfln / (c_light * np.sqrt(1 / self.grid.dx**2 + 1 / self.grid.dy**2)) self.dx = self.grid.dx self.dy = self.grid.dy self.Nx = self.grid.nx @@ -30,13 +40,13 @@ def __init__(self, grid, sol_type, cfln, i_s, j_s, bc_low, bc_high, self.bc_low = bc_low self.bc_high = bc_high - if bc_low[0] == 'pml': + if bc_low[0] == "pml": self.N_pml_low[0] = 10 if N_pml_low is None else N_pml_low[0] - if bc_low[1] == 'pml': + if bc_low[1] == "pml": self.N_pml_low[1] = 10 if N_pml_low is None else N_pml_low[1] - if bc_high[0] == 'pml': + if bc_high[0] == "pml": self.N_pml_high[0] = 10 if N_pml_high is None else N_pml_high[0] - if bc_high[1] == 'pml': + if bc_high[1] == "pml": self.N_pml_high[1] = 10 if N_pml_high is None else N_pml_high[1] self.blocks = [] @@ -49,32 +59,48 @@ def __init__(self, grid, sol_type, cfln, i_s, j_s, bc_low, bc_high, self.pml_lxry = None self.pml_rxry = None - if bc_low[0] is 'pml': - self.pml_lx = PmlBlock2D(self.N_pml_low[0], self.Ny, self.dt, self.dx, self.dy) + if bc_low[0] == "pml": + self.pml_lx = PmlBlock2D( + self.N_pml_low[0], self.Ny, self.dt, self.dx, self.dy + ) self.blocks.append(self.pml_lx) - if bc_low[1] is 'pml': - self.pml_lxly = PmlBlock2D(self.N_pml_low[0], self.N_pml_low[1], self.dt, self.dx, self.dy) + if bc_low[1] == "pml": + self.pml_lxly = PmlBlock2D( + self.N_pml_low[0], self.N_pml_low[1], self.dt, self.dx, self.dy + ) self.blocks.append(self.pml_lxly) - if bc_high[1] is 'pml': - self.pml_lxry = PmlBlock2D(self.N_pml_low[0], self.N_pml_high[1], self.dt, self.dx, self.dy) + if bc_high[1] == "pml": + self.pml_lxry = PmlBlock2D( + self.N_pml_low[0], self.N_pml_high[1], self.dt, self.dx, self.dy + ) self.blocks.append(self.pml_lxry) - if bc_high[0] is 'pml': - self.pml_rx = PmlBlock2D(self.N_pml_high[0], self.Ny, self.dt, self.dx, self.dy) + if bc_high[0] == "pml": + self.pml_rx = PmlBlock2D( + self.N_pml_high[0], self.Ny, self.dt, self.dx, self.dy + ) self.blocks.append(self.pml_rx) - if bc_low[1] is 'pml': - self.pml_rxry = PmlBlock2D(self.N_pml_high[0], self.N_pml_high[1], self.dt, self.dx, self.dy) + if bc_low[1] == "pml": + self.pml_rxry = PmlBlock2D( + self.N_pml_high[0], self.N_pml_high[1], self.dt, self.dx, self.dy + ) self.blocks.append(self.pml_rxry) - if bc_high[1] is 'pml': - self.pml_rxly = PmlBlock2D(self.N_pml_high[0], self.N_pml_low[1], self.dt, self.dx, self.dy) + if bc_high[1] == "pml": + self.pml_rxly = PmlBlock2D( + self.N_pml_high[0], self.N_pml_low[1], self.dt, self.dx, self.dy + ) self.blocks.append(self.pml_rxly) - if bc_low[1] is 'pml': - self.pml_ly = PmlBlock2D(self.Nx, self.N_pml_low[1], self.dt, self.dx, self.dy) + if bc_low[1] == "pml": + self.pml_ly = PmlBlock2D( + self.Nx, self.N_pml_low[1], self.dt, self.dx, self.dy + ) self.blocks.append(self.pml_ly) - if bc_high[1] is 'pml': - self.pml_ry = PmlBlock2D(self.Nx, self.N_pml_high[1], self.dt, self.dx, self.dy) + if bc_high[1] == "pml": + self.pml_ry = PmlBlock2D( + self.Nx, self.N_pml_high[1], self.dt, self.dx, self.dy + ) self.blocks.append(self.pml_ry) self.organize_pmls() @@ -98,26 +124,28 @@ def __init__(self, grid, sol_type, cfln, i_s, j_s, bc_low, bc_high, self.rho = np.zeros((self.Nx, self.Ny)) - if (sol_type is not 'FDTD') and (sol_type is not 'DM') and (sol_type is not 'ECT'): - raise ValueError("sol_type must be:\n" + - "\t'FDTD' for standard staircased FDTD\n" + - "\t'DM' for Dey-Mittra conformal FDTD\n" + - "\t'ECT' for Enlarged Cell Technique conformal FDTD") + if (sol_type != "FDTD") and (sol_type != "DM") and (sol_type != "ECT"): + raise ValueError( + "sol_type must be:\n" + + "\t'FDTD' for standard staircased FDTD\n" + + "\t'DM' for Dey-Mittra conformal FDTD\n" + + "\t'ECT' for Enlarged Cell Technique conformal FDTD" + ) - if sol_type is 'DM' or sol_type is 'ECT': + if sol_type == "DM" or sol_type == "ECT": self.Vxy = np.zeros((self.Nx, self.Ny)) - if sol_type is 'ECT': + if sol_type == "ECT": self.V_enl = np.zeros((self.Nx, self.Ny)) - if sol_type is 'ECT' or sol_type is 'DM': + if sol_type == "ECT" or sol_type == "DM": self.C1 = self.dt / mu_0 self.C4 = self.dt / (eps_0 * self.dy) self.C5 = self.dt / (eps_0 * self.dx) self.C3 = self.dt / eps_0 self.C6 = self.dt / eps_0 - if sol_type is 'FDTD': - Z_0 = np.sqrt(mu_0 / eps_0) + if sol_type == "FDTD": + np.sqrt(mu_0 / eps_0) self.C1 = self.dt / (self.dx * mu_0) self.C2 = self.dt / (self.dy * mu_0) @@ -133,41 +161,40 @@ def __init__(self, grid, sol_type, cfln, i_s, j_s, bc_low, bc_high, self.time = 0 def organize_pmls(self): - if self.bc_low[0] == 'pml': + if self.bc_low[0] == "pml": self.pml_lx.rx_block = self - if self.bc_low[1] is 'pml': + if self.bc_low[1] == "pml": self.pml_lx.ly_block = self.pml_lxly self.pml_lxly.ry_block = self.pml_lx self.pml_lxly.rx_block = self.pml_ly - if self.bc_high[1] is 'pml': + if self.bc_high[1] == "pml": self.pml_lx.ry_block = self.pml_lxry self.pml_lxry.ly_block = self.pml_lx self.pml_lxry.rx_block = self.pml_ry - if self.bc_high[0] is 'pml': + if self.bc_high[0] == "pml": self.pml_rx.lx_block = self - if self.bc_high[1] is 'pml': + if self.bc_high[1] == "pml": self.pml_rx.ry_block = self.pml_rxry self.pml_rxly.lx_block = self.pml_ly self.pml_rxly.ry_block = self.pml_rx - if self.bc_low[1] is 'pml': + if self.bc_low[1] == "pml": self.pml_rx.ly_block = self.pml_rxly self.pml_rxry.lx_block = self.pml_ry self.pml_rxry.ly_block = self.pml_rx - - if self.bc_low[1] is 'pml': + if self.bc_low[1] == "pml": self.pml_ly.ry_block = self - if self.bc_low[0] is 'pml': + if self.bc_low[0] == "pml": self.pml_ly.lx_block = self.pml_lxly - if self.bc_low[0] is 'pml': + if self.bc_low[0] == "pml": self.pml_ly.rx_block = self.pml_rxly - if self.bc_high[1] is 'pml': + if self.bc_high[1] == "pml": self.pml_ry.ly_block = self - if self.bc_low[0] is 'pml': + if self.bc_low[0] == "pml": self.pml_ry.lx_block = self.pml_lxry - if self.bc_high[0] is 'pml': + if self.bc_high[0] == "pml": self.pml_ry.rx_block = self.pml_rxry def assemble_conductivities_pmls(self): @@ -175,50 +202,98 @@ def assemble_conductivities_pmls(self): sigma_m_high_x = 0 sigma_m_low_y = 0 sigma_m_high_y = 0 - if self.bc_low[0] is 'pml': - sigma_m_low_x = -(self.alpha_pml + 1) * eps_0 * c_light / (2 * (self.N_pml_low[0]-1)*self.dx) * np.log(self.R0_pml) - if self.bc_low[1] is 'pml': - sigma_m_low_y = -(self.alpha_pml + 1) * eps_0 * c_light / (2 * (self.N_pml_low[1]-1)*self.dy) * np.log(self.R0_pml) - if self.bc_high[0] is 'pml': - sigma_m_high_x = -(self.alpha_pml + 1) * eps_0 * c_light / (2 * (self.N_pml_high[0]-1)*self.dy) * np.log(self.R0_pml) - if self.bc_high[1] is 'pml': - sigma_m_high_y = -(self.alpha_pml + 1) * eps_0 * c_light / (2 * (self.N_pml_high[1]-1)*self.dy) * np.log(self.R0_pml) - - if self.bc_low[0] is 'pml': + if self.bc_low[0] == "pml": + sigma_m_low_x = ( + -(self.alpha_pml + 1) + * eps_0 + * c_light + / (2 * (self.N_pml_low[0] - 1) * self.dx) + * np.log(self.R0_pml) + ) + if self.bc_low[1] == "pml": + sigma_m_low_y = ( + -(self.alpha_pml + 1) + * eps_0 + * c_light + / (2 * (self.N_pml_low[1] - 1) * self.dy) + * np.log(self.R0_pml) + ) + if self.bc_high[0] == "pml": + sigma_m_high_x = ( + -(self.alpha_pml + 1) + * eps_0 + * c_light + / (2 * (self.N_pml_high[0] - 1) * self.dy) + * np.log(self.R0_pml) + ) + if self.bc_high[1] == "pml": + sigma_m_high_y = ( + -(self.alpha_pml + 1) + * eps_0 + * c_light + / (2 * (self.N_pml_high[1] - 1) * self.dy) + * np.log(self.R0_pml) + ) + + if self.bc_low[0] == "pml": for n in range(self.N_pml_low[0]): - self.pml_lx.sigma_x[-(n+1), :] = sigma_m_low_x * (n / (self.N_pml_low[0])) ** self.alpha_pml - if self.bc_low[1] is 'pml': + self.pml_lx.sigma_x[-(n + 1), :] = ( + sigma_m_low_x * (n / (self.N_pml_low[0])) ** self.alpha_pml + ) + if self.bc_low[1] == "pml": for n in range((self.N_pml_low[1])): - self.pml_lxly.sigma_y[:, -(n+1)] = sigma_m_low_y * (n / (self.N_pml_low[1])) ** self.alpha_pml + self.pml_lxly.sigma_y[:, -(n + 1)] = ( + sigma_m_low_y * (n / (self.N_pml_low[1])) ** self.alpha_pml + ) for n in range((self.N_pml_low[0])): - self.pml_lxly.sigma_x[-(n+1), :] = sigma_m_low_x * (n / (self.N_pml_low[0])) ** self.alpha_pml - if self.bc_high[1] is 'pml': + self.pml_lxly.sigma_x[-(n + 1), :] = ( + sigma_m_low_x * (n / (self.N_pml_low[0])) ** self.alpha_pml + ) + if self.bc_high[1] == "pml": for n in range(self.N_pml_high[1]): - self.pml_lxry.sigma_y[:, n] = sigma_m_high_y * (n / (self.N_pml_high[1])) ** self.alpha_pml + self.pml_lxry.sigma_y[:, n] = ( + sigma_m_high_y * (n / (self.N_pml_high[1])) ** self.alpha_pml + ) for n in range(self.N_pml_low[0]): - self.pml_lxry.sigma_x[-(n+1), :] = sigma_m_low_x * (n / (self.N_pml_low[0])) ** self.alpha_pml + self.pml_lxry.sigma_x[-(n + 1), :] = ( + sigma_m_low_x * (n / (self.N_pml_low[0])) ** self.alpha_pml + ) - if self.bc_high[0] is 'pml': + if self.bc_high[0] == "pml": for n in range(self.N_pml_high[0]): - self.pml_rx.sigma_x[n, :] = sigma_m_high_x * (n / (self.N_pml_high[0])) ** self.alpha_pml - if self.bc_high[1] is 'pml': + self.pml_rx.sigma_x[n, :] = ( + sigma_m_high_x * (n / (self.N_pml_high[0])) ** self.alpha_pml + ) + if self.bc_high[1] == "pml": for n in range(self.N_pml_high[0]): - self.pml_rxry.sigma_x[n, :] = sigma_m_high_x * (n / (self.N_pml_high[0])) ** self.alpha_pml + self.pml_rxry.sigma_x[n, :] = ( + sigma_m_high_x * (n / (self.N_pml_high[0])) ** self.alpha_pml + ) for n in range(self.N_pml_high[1]): - self.pml_rxry.sigma_y[:, n] = sigma_m_high_y * (n / (self.N_pml_high[1])) ** self.alpha_pml - if self.bc_low[1] == 'pml': + self.pml_rxry.sigma_y[:, n] = ( + sigma_m_high_y * (n / (self.N_pml_high[1])) ** self.alpha_pml + ) + if self.bc_low[1] == "pml": for n in range(self.N_pml_low[1]): - self.pml_rxly.sigma_y[:, -(n+1)] = sigma_m_low_y * (n / (self.N_pml_low[1])) ** self.alpha_pml + self.pml_rxly.sigma_y[:, -(n + 1)] = ( + sigma_m_low_y * (n / (self.N_pml_low[1])) ** self.alpha_pml + ) for n in range(self.N_pml_high[0]): - self.pml_rxly.sigma_x[n, :] = sigma_m_high_x * (n / (self.N_pml_high[0])) ** self.alpha_pml + self.pml_rxly.sigma_x[n, :] = ( + sigma_m_high_x * (n / (self.N_pml_high[0])) ** self.alpha_pml + ) - if self.bc_low[1] is 'pml': + if self.bc_low[1] == "pml": for n in range(self.N_pml_low[1]): - self.pml_ly.sigma_y[:, -(n+1)] = sigma_m_low_y * (n / (self.N_pml_low[1])) ** self.alpha_pml + self.pml_ly.sigma_y[:, -(n + 1)] = ( + sigma_m_low_y * (n / (self.N_pml_low[1])) ** self.alpha_pml + ) - if self.bc_high[1] is 'pml': + if self.bc_high[1] == "pml": for n in range(self.N_pml_high[1]): - self.pml_ry.sigma_y[:, n] = sigma_m_high_y * (n / (self.N_pml_high[1])) ** self.alpha_pml + self.pml_ry.sigma_y[:, n] = ( + sigma_m_high_y * (n / (self.N_pml_high[1])) ** self.alpha_pml + ) if self.pml_lx is not None: self.pml_lx.sigma_star_x = self.pml_lx.sigma_x * mu_0 / eps_0 @@ -246,25 +321,25 @@ def assemble_conductivities_pmls(self): self.pml_rxly.sigma_star_y = self.pml_rxly.sigma_y * mu_0 / eps_0 def assemble_coeffs_pmls(self): - if self.bc_low[0] is 'pml': + if self.bc_low[0] == "pml": self.pml_lx.assemble_coeffs() - if self.bc_low[1] is 'pml': + if self.bc_low[1] == "pml": self.pml_lxly.assemble_coeffs() - if self.bc_high[1] is 'pml': + if self.bc_high[1] == "pml": self.pml_lxry.assemble_coeffs() - if self.bc_high[0] is 'pml': + if self.bc_high[0] == "pml": self.pml_rx.assemble_coeffs() - if self.bc_low[0] is 'pml': + if self.bc_low[0] == "pml": self.pml_rxry.assemble_coeffs() - if self.bc_high[1] is 'pml': + if self.bc_high[1] == "pml": self.pml_rxly.assemble_coeffs() - if self.bc_low[1] is 'pml': + if self.bc_low[1] == "pml": self.pml_ly.assemble_coeffs() - if self.bc_high[1] is 'pml': - self.pml_ry.assemble_coeffs() + if self.bc_high[1] == "pml": + self.pml_ry.assemble_coeffs() def update_e_boundary(self): Ex = self.Ex @@ -272,19 +347,35 @@ def update_e_boundary(self): Hz = self.Hz if self.pml_lx is not None: for jj in range(self.Ny): - Ey[0, jj] = Ey[0, jj] - self.C3 * self.Jy[0, jj] - self.C5 * (Hz[0, jj] - self.pml_lx.Hz[-1, jj]) + Ey[0, jj] = ( + Ey[0, jj] + - self.C3 * self.Jy[0, jj] + - self.C5 * (Hz[0, jj] - self.pml_lx.Hz[-1, jj]) + ) if self.pml_rx is not None: for jj in range(self.Ny): - Ey[-1, jj] = Ey[-1, jj] - self.C3 * self.Jy[-1, jj] - self.C5 * (self.pml_rx.Hz[0, jj] - Hz[-1, jj]) + Ey[-1, jj] = ( + Ey[-1, jj] + - self.C3 * self.Jy[-1, jj] + - self.C5 * (self.pml_rx.Hz[0, jj] - Hz[-1, jj]) + ) if self.pml_ly is not None: for ii in range(self.Nx): - Ex[ii, 0] = Ex[ii, 0] - self.C3 * self.Jx[ii, 0] + self.C4 * (Hz[ii, 0] - self.pml_ly.Hz[ii, -1]) + Ex[ii, 0] = ( + Ex[ii, 0] + - self.C3 * self.Jx[ii, 0] + + self.C4 * (Hz[ii, 0] - self.pml_ly.Hz[ii, -1]) + ) if self.pml_ry is not None: for ii in range(self.Nx): - Ex[ii, -1] = Ex[ii, -1] - self.C3 * self.Jx[ii, -1] + self.C4 * (self.pml_ry.Hz[ii, 0] - Hz[ii, -1]) + Ex[ii, -1] = ( + Ex[ii, -1] + - self.C3 * self.Jx[ii, -1] + + self.C4 * (self.pml_ry.Hz[ii, 0] - Hz[ii, -1]) + ) for block in self.blocks: block.update_e_boundary() @@ -292,21 +383,30 @@ def update_e_boundary(self): def gauss(self, t): tau = 10 * self.dt if t < 6 * tau: - return 100 * np.exp(-(t - 3 * tau) ** 2 / tau ** 2) + return 100 * np.exp(-((t - 3 * tau) ** 2) / tau**2) else: - return 0. + return 0.0 def one_step(self): - if self.sol_type == 'ECT': + if self.sol_type == "ECT": self.compute_v_and_rho() - self.one_step_ect(Nx=self.Nx, Ny=self.Ny, V_enl=self.V_enl, - rho=self.rho, Hz=self.Hz, C1=self.C1, - flag_int_cell=self.grid.flag_int_cell, - flag_unst_cell=self.grid.flag_unst_cell, - flag_intr_cell=self.grid.flag_intr_cell, - S=self.grid.S, - borrowing=self.grid.borrowing, S_enl=self.grid.S_enl, - S_red=self.grid.S_red, V_new = self.V_new, dt=self.dt) + self.one_step_ect( + Nx=self.Nx, + Ny=self.Ny, + V_enl=self.V_enl, + rho=self.rho, + Hz=self.Hz, + C1=self.C1, + flag_int_cell=self.grid.flag_int_cell, + flag_unst_cell=self.grid.flag_unst_cell, + flag_intr_cell=self.grid.flag_intr_cell, + S=self.grid.S, + borrowing=self.grid.borrowing, + S_enl=self.grid.S_enl, + S_red=self.grid.S_red, + V_new=self.V_new, + dt=self.dt, + ) for block in self.blocks: block.advance_h_fdtd() @@ -319,16 +419,13 @@ def one_step(self): self.time += self.dt - if self.sol_type == 'FDTD': + if self.sol_type == "FDTD": self.one_step_fdtd() - if self.sol_type == 'DM': + if self.sol_type == "DM": self.one_step_dm() def one_step_fdtd(self): - Z_0 = np.sqrt(mu_0 / eps_0) - Ex = self.Ex - Ey = self.Ey - Hz = self.Hz + np.sqrt(mu_0 / eps_0) self.advance_h_fdtd() for block in self.blocks: @@ -346,7 +443,10 @@ def one_step_dm(self): for i in range(self.Nx): for j in range(self.Ny): if self.grid.flag_int_cell[i, j]: - self.Hz[i, j] = self.Hz[i, j] - self.dt / (mu_0 * self.grid.S[i, j]) * self.Vxy[i, j] + self.Hz[i, j] = ( + self.Hz[i, j] + - self.dt / (mu_0 * self.grid.S[i, j]) * self.Vxy[i, j] + ) for block in self.blocks: block.advance_h_fdtd() @@ -367,11 +467,14 @@ def advance_h_fdtd(self): for ii in range(self.Nx): for jj in range(self.Ny): if self.grid.flag_int_cell[ii, jj]: - Hz[ii, jj] = (Hz[ii, jj] - self.C1 * (Ey[ii + 1, jj] - Ey[ii, jj]) + - self.C2 * (Ex[ii, jj + 1]- Ex[ii, jj])) + Hz[ii, jj] = ( + Hz[ii, jj] + - self.C1 * (Ey[ii + 1, jj] - Ey[ii, jj]) + + self.C2 * (Ex[ii, jj + 1] - Ex[ii, jj]) + ) def advance_e_fdtd(self): - Z_0 = np.sqrt(mu_0 / eps_0) + np.sqrt(mu_0 / eps_0) Ex = self.Ex Ey = self.Ey Hz = self.Hz @@ -379,22 +482,43 @@ def advance_e_fdtd(self): for jj in range(1, self.Ny): if self.grid.flag_int_cell[ii, jj]: if self.grid.l_x[ii, jj] > 0: - Ex[ii, jj] = Ex[ii, jj] - self.C3 * self.Jx[ii, jj] + self.C4 * ( - Hz[ii, jj] - Hz[ii, jj - 1]) + Ex[ii, jj] = ( + Ex[ii, jj] + - self.C3 * self.Jx[ii, jj] + + self.C4 * (Hz[ii, jj] - Hz[ii, jj - 1]) + ) for ii in range(1, self.Nx): for jj in range(self.Ny): if self.grid.flag_int_cell[ii, jj]: if self.grid.l_y[ii, jj] > 0: - Ey[ii, jj] = Ey[ii, jj] - self.C3 * self.Jy[ii, jj] - self.C5 * ( - Hz[ii, jj] - Hz[ii - 1, jj]) + Ey[ii, jj] = ( + Ey[ii, jj] + - self.C3 * self.Jy[ii, jj] + - self.C5 * (Hz[ii, jj] - Hz[ii - 1, jj]) + ) @staticmethod - def one_step_ect(Nx=None, Ny=None, V_enl=None, rho=None, Hz=None, C1=None, flag_int_cell=None, - flag_unst_cell=None, flag_intr_cell=None, S=None, borrowing=None, S_enl=None, - S_red=None, V_new=None, dt = None, comp=None, kk=None): - - #if dt==None: dt = self.dt + def one_step_ect( + Nx=None, + Ny=None, + V_enl=None, + rho=None, + Hz=None, + C1=None, + flag_int_cell=None, + flag_unst_cell=None, + flag_intr_cell=None, + S=None, + borrowing=None, + S_enl=None, + S_red=None, + V_new=None, + dt=None, + comp=None, + kk=None, + ): + # if dt==None: dt = self.dt V_enl = np.zeros((Nx, Ny)) @@ -402,23 +526,20 @@ def one_step_ect(Nx=None, Ny=None, V_enl=None, rho=None, Hz=None, C1=None, flag_ for ii in range(Nx): for jj in range(Ny): if flag_int_cell[ii, jj] and flag_unst_cell[ii, jj]: - V_enl[ii, jj] = rho[ii, jj] * S[ii, jj] if len(borrowing[ii, jj]) == 0: - print('error in one_step_ect') - for (ip, jp, patch, _) in borrowing[ii, jj]: - + print("error in one_step_ect") + for ip, jp, patch, _ in borrowing[ii, jj]: V_enl[ii, jj] += rho[ip, jp] * patch rho_enl = V_enl[ii, jj] / S_enl[ii, jj] # communicate to the intruded cell the intruding rho - for (ip, jp, patch, _) in borrowing[ii, jj]: + for ip, jp, patch, _ in borrowing[ii, jj]: V_enl[ip, jp] += rho_enl * patch - Hz[ii, jj] = Hz[ii, jj] - dt/mu_0 * rho_enl - + Hz[ii, jj] = Hz[ii, jj] - dt / mu_0 * rho_enl # take care of stable cells for ii in range(Nx): @@ -426,12 +547,11 @@ def one_step_ect(Nx=None, Ny=None, V_enl=None, rho=None, Hz=None, C1=None, flag_ if flag_int_cell[ii, jj] and not flag_unst_cell[ii, jj]: # stable cell which hasn't been intruded if not flag_intr_cell[ii, jj]: - Hz[ii, jj] = Hz[ii, jj] - dt/mu_0 * rho[ii, jj] + Hz[ii, jj] = Hz[ii, jj] - dt / mu_0 * rho[ii, jj] # stable cell which has been intruded else: V_enl[ii, jj] += rho[ii, jj] * S_red[ii, jj] - Hz[ii, jj] = Hz[ii, jj] - dt/mu_0 * V_enl[ii, jj] / S[ii, jj] - + Hz[ii, jj] = Hz[ii, jj] - dt / mu_0 * V_enl[ii, jj] / S[ii, jj] def compute_v_and_rho(self): l_y = self.grid.l_y @@ -440,25 +560,36 @@ def compute_v_and_rho(self): for jj in range(self.Ny): if self.grid.flag_int_cell[ii, jj]: self.Vxy[ii, jj] = ( - self.Ey[ii + 1, jj] * l_y[ii + 1, jj] - self.Ey[ii, jj] * l_y[ - ii, jj] - - self.Ex[ii, jj + 1] * l_x[ii, jj + 1] + self.Ex[ii, jj] * l_x[ - ii, jj]) - if self.sol_type != 'DM': + self.Ey[ii + 1, jj] * l_y[ii + 1, jj] + - self.Ey[ii, jj] * l_y[ii, jj] + - self.Ex[ii, jj + 1] * l_x[ii, jj + 1] + + self.Ex[ii, jj] * l_x[ii, jj] + ) + if self.sol_type != "DM": self.rho[ii, jj] = self.Vxy[ii, jj] / self.grid.S[ii, jj] def advance_e_dm(self): for ii in range(self.Nx): for jj in range(1, self.Ny): if self.grid.l_x[ii, jj] > 0: - self.Ex[ii, jj] = self.Ex[ii, jj] + self.dt / (eps_0 * self.dy) * ( - self.Hz[ii, jj] - self.Hz[ii, jj - 1]) - self.C3 * self.Jx[ii, jj] + self.Ex[ii, jj] = ( + self.Ex[ii, jj] + + self.dt + / (eps_0 * self.dy) + * (self.Hz[ii, jj] - self.Hz[ii, jj - 1]) + - self.C3 * self.Jx[ii, jj] + ) for ii in range(1, self.Nx): for jj in range(self.Ny): if self.grid.l_y[ii, jj] > 0: - self.Ey[ii, jj] = self.Ey[ii, jj] - self.dt / (eps_0 * self.dx) * ( - self.Hz[ii, jj] - self.Hz[ii - 1, jj]) - self.C3 * self.Jy[ii, jj] + self.Ey[ii, jj] = ( + self.Ey[ii, jj] + - self.dt + / (eps_0 * self.dx) + * (self.Hz[ii, jj] - self.Hz[ii - 1, jj]) + - self.C3 * self.Jy[ii, jj] + ) def update_e_boundary_dm(self): Ex = self.Ex @@ -466,19 +597,35 @@ def update_e_boundary_dm(self): Hz = self.Hz if self.pml_lx is not None: for jj in range(self.Ny): - Ey[0, jj] = Ey[0, jj] - self.C3 * self.Jy[0, jj] - self.dt / (eps_0 * self.dy) * (Hz[0, jj] - self.pml_lx.Hz[-1, jj]) + Ey[0, jj] = ( + Ey[0, jj] + - self.C3 * self.Jy[0, jj] + - self.dt / (eps_0 * self.dy) * (Hz[0, jj] - self.pml_lx.Hz[-1, jj]) + ) if self.pml_rx is not None: for jj in range(self.Ny): - Ey[-1, jj] = Ey[-1, jj] - self.C3 * self.Jy[-1, jj] - self.dt / (eps_0 * self.dy) * (self.pml_rx.Hz[0, jj] - Hz[-1, jj]) + Ey[-1, jj] = ( + Ey[-1, jj] + - self.C3 * self.Jy[-1, jj] + - self.dt / (eps_0 * self.dy) * (self.pml_rx.Hz[0, jj] - Hz[-1, jj]) + ) if self.pml_ly is not None: for ii in range(self.Nx): - Ex[ii, 0] = Ex[ii, 0] - self.C3 * self.Jx[ii, 0] + self.dt / (eps_0 * self.dy) * (Hz[ii, 0] - self.pml_ly.Hz[ii, -1]) + Ex[ii, 0] = ( + Ex[ii, 0] + - self.C3 * self.Jx[ii, 0] + + self.dt / (eps_0 * self.dy) * (Hz[ii, 0] - self.pml_ly.Hz[ii, -1]) + ) if self.pml_ry is not None: for ii in range(self.Nx): - Ex[ii, -1] = Ex[ii, -1] - self.C3 * self.Jx[ii, -1] + self.dt / (eps_0 * self.dy) * (self.pml_ry.Hz[ii, 0] - Hz[ii, -1]) + Ex[ii, -1] = ( + Ex[ii, -1] + - self.C3 * self.Jx[ii, -1] + + self.dt / (eps_0 * self.dy) * (self.pml_ry.Hz[ii, 0] - Hz[ii, -1]) + ) for block in self.blocks: block.update_e_boundary() diff --git a/wakis/solver3D.py b/wakis/solver3D.py index 1d9e42b..d0729ce 100644 --- a/wakis/solver3D.py +++ b/wakis/solver3D.py @@ -5,6 +5,7 @@ from numba import jit + def eq(a, b, tol=1e-8): return abs(a - b) < tol @@ -14,17 +15,27 @@ def neq(a, b, tol=1e-8): class EMSolver3D: - def __init__(self, grid, sol_type, cfln=0.5, - bc_low=['Dirichlet', 'Dirichlet', 'Dirichlet'], - bc_high=['Dirichlet', 'Dirichlet', 'Dirichlet'], - i_s=0, j_s=0, k_s=0, N_pml_low=None, N_pml_high=None): - + def __init__( + self, + grid, + sol_type, + cfln=0.5, + bc_low=["Dirichlet", "Dirichlet", "Dirichlet"], + bc_high=["Dirichlet", "Dirichlet", "Dirichlet"], + i_s=0, + j_s=0, + k_s=0, + N_pml_low=None, + N_pml_high=None, + ): self.grid = grid self.type = type self.cfln = cfln - self.dt = cfln / (c_light * np.sqrt(1 / self.grid.dx ** 2 + 1 / self.grid.dy ** 2 + - 1 / self.grid.dz ** 2)) + self.dt = cfln / ( + c_light + * np.sqrt(1 / self.grid.dx**2 + 1 / self.grid.dy**2 + 1 / self.grid.dz**2) + ) self.dx = self.grid.dx self.dy = self.grid.dy self.dz = self.grid.dz @@ -49,17 +60,17 @@ def __init__(self, grid, sol_type, cfln=0.5, self.sigma_star_y = np.zeros((Nx + 1, Ny, Nz + 1)) self.sigma_star_z = np.zeros((Nx + 1, Ny + 1, Nz)) - if bc_low[0] == 'pml': + if bc_low[0] == "pml": self.N_pml_low[0] = 10 if N_pml_low is None else N_pml_low[0] - if bc_low[1] == 'pml': + if bc_low[1] == "pml": self.N_pml_low[1] = 10 if N_pml_low is None else N_pml_low[1] - if bc_low[2] == 'pml': + if bc_low[2] == "pml": self.N_pml_low[2] = 10 if N_pml_low is None else N_pml_low[2] - if bc_high[0] == 'pml': + if bc_high[0] == "pml": self.N_pml_high[0] = 10 if N_pml_high is None else N_pml_high[0] - if bc_high[1] == 'pml': + if bc_high[1] == "pml": self.N_pml_high[1] = 10 if N_pml_high is None else N_pml_high[1] - if bc_high[2] == 'pml': + if bc_high[2] == "pml": self.N_pml_high[2] = 10 if N_pml_high is None else N_pml_high[2] self.blocks = [] @@ -88,17 +99,19 @@ def __init__(self, grid, sol_type, cfln=0.5, self.rho_yz = np.zeros((self.Nx + 1, self.Ny, self.Nz)) self.rho_zx = np.zeros((self.Nx, self.Ny + 1, self.Nz)) - if (sol_type is not 'FDTD') and (sol_type is not 'DM') and (sol_type is not 'ECT'): - raise ValueError("sol_type must be:\n" + - "\t'FDTD' for standard staircased FDTD\n" + - "\t'DM' for Dey-Mittra conformal FDTD\n" + - "\t'ECT' for Enlarged Cell Technique conformal FDTD") + if (sol_type != "FDTD") and (sol_type != "DM") and (sol_type != "ECT"): + raise ValueError( + "sol_type must be:\n" + + "\t'FDTD' for standard staircased FDTD\n" + + "\t'DM' for Dey-Mittra conformal FDTD\n" + + "\t'ECT' for Enlarged Cell Technique conformal FDTD" + ) - if sol_type is 'DM' or sol_type is 'ECT': + if sol_type == "DM" or sol_type == "ECT": self.Vxy = np.zeros((self.Nx, self.Ny, self.Nz + 1)) self.Vyz = np.zeros((self.Nx + 1, self.Ny, self.Nz)) self.Vzx = np.zeros((self.Nx, self.Ny + 1, self.Nz)) - if sol_type is 'ECT': + if sol_type == "ECT": self.Vxy_enl = np.zeros((self.Nx, self.Ny, self.Nz + 1)) self.Vyz_enl = np.zeros((self.Nx + 1, self.Ny, self.Nz)) self.Vzx_enl = np.zeros((self.Nx, self.Ny + 1, self.Nz)) @@ -124,226 +137,452 @@ def __init__(self, grid, sol_type, cfln=0.5, def connect_pmls(self): bc_low = self.bc_low bc_high = self.bc_high - if bc_low[0] is 'pml': + if bc_low[0] == "pml": i_block = 0 j_block = 1 k_block = 1 - self.blocks_mat[i_block, j_block, k_block] = PmlBlock3D(self.N_pml_low[0], self.Ny, self.Nz, self.dt, - self.dx, - self.dy, self.dz, i_block, j_block, k_block) + self.blocks_mat[i_block, j_block, k_block] = PmlBlock3D( + self.N_pml_low[0], + self.Ny, + self.Nz, + self.dt, + self.dx, + self.dy, + self.dz, + i_block, + j_block, + k_block, + ) self.blocks.append(self.blocks_mat[i_block, j_block, k_block]) - if bc_low[1] is 'pml': + if bc_low[1] == "pml": i_block = 0 j_block = 0 k_block = 1 - self.blocks_mat[i_block, j_block, k_block] = PmlBlock3D(self.N_pml_low[0], self.N_pml_low[1], self.Nz, - self.dt, self.dx, self.dy, self.dz, i_block, - j_block, k_block) + self.blocks_mat[i_block, j_block, k_block] = PmlBlock3D( + self.N_pml_low[0], + self.N_pml_low[1], + self.Nz, + self.dt, + self.dx, + self.dy, + self.dz, + i_block, + j_block, + k_block, + ) self.blocks.append(self.blocks_mat[i_block, j_block, k_block]) - if bc_low[2] is 'pml': + if bc_low[2] == "pml": i_block = 0 j_block = 0 k_block = 0 - self.blocks_mat[i_block, j_block, k_block] = PmlBlock3D(self.N_pml_low[0], self.N_pml_low[1], - self.N_pml_low[2], self.dt, self.dx, - self.dy, - self.dz, i_block, j_block, k_block) + self.blocks_mat[i_block, j_block, k_block] = PmlBlock3D( + self.N_pml_low[0], + self.N_pml_low[1], + self.N_pml_low[2], + self.dt, + self.dx, + self.dy, + self.dz, + i_block, + j_block, + k_block, + ) self.blocks.append(self.blocks_mat[i_block, j_block, k_block]) - if bc_high[2] is 'pml': + if bc_high[2] == "pml": i_block = 0 j_block = 0 k_block = 2 - self.blocks_mat[i_block, j_block, k_block] = PmlBlock3D(self.N_pml_low[0], self.N_pml_low[1], - self.N_pml_high[2], self.dt, self.dx, - self.dy, - self.dz, i_block, j_block, k_block) + self.blocks_mat[i_block, j_block, k_block] = PmlBlock3D( + self.N_pml_low[0], + self.N_pml_low[1], + self.N_pml_high[2], + self.dt, + self.dx, + self.dy, + self.dz, + i_block, + j_block, + k_block, + ) self.blocks.append(self.blocks_mat[i_block, j_block, k_block]) - if bc_high[1] is 'pml': + if bc_high[1] == "pml": i_block = 0 j_block = 2 k_block = 1 - self.blocks_mat[i_block, j_block, k_block] = PmlBlock3D(self.N_pml_low[0], self.N_pml_high[1], self.Nz, - self.dt, self.dx, self.dy, self.dz, i_block, - j_block, k_block) + self.blocks_mat[i_block, j_block, k_block] = PmlBlock3D( + self.N_pml_low[0], + self.N_pml_high[1], + self.Nz, + self.dt, + self.dx, + self.dy, + self.dz, + i_block, + j_block, + k_block, + ) self.blocks.append(self.blocks_mat[i_block, j_block, k_block]) - if bc_low[2] is 'pml': + if bc_low[2] == "pml": i_block = 0 j_block = 2 k_block = 0 - self.blocks_mat[i_block, j_block, k_block] = PmlBlock3D(self.N_pml_low[0], self.N_pml_high[1], - self.N_pml_low[2], self.dt, self.dx, - self.dy, - self.dz, i_block, j_block, k_block) + self.blocks_mat[i_block, j_block, k_block] = PmlBlock3D( + self.N_pml_low[0], + self.N_pml_high[1], + self.N_pml_low[2], + self.dt, + self.dx, + self.dy, + self.dz, + i_block, + j_block, + k_block, + ) self.blocks.append(self.blocks_mat[i_block, j_block, k_block]) - if bc_high[2] is 'pml': + if bc_high[2] == "pml": i_block = 0 j_block = 2 k_block = 2 - self.blocks_mat[i_block, j_block, k_block] = PmlBlock3D(self.N_pml_low[0], self.N_pml_high[1], - self.N_pml_high[2], self.dt, self.dx, - self.dy, - self.dz, i_block, j_block, k_block) + self.blocks_mat[i_block, j_block, k_block] = PmlBlock3D( + self.N_pml_low[0], + self.N_pml_high[1], + self.N_pml_high[2], + self.dt, + self.dx, + self.dy, + self.dz, + i_block, + j_block, + k_block, + ) self.blocks.append(self.blocks_mat[i_block, j_block, k_block]) - if bc_low[2] is 'pml': + if bc_low[2] == "pml": i_block = 0 j_block = 1 k_block = 0 - self.blocks_mat[i_block, j_block, k_block] = PmlBlock3D(self.N_pml_low[0], self.Ny, self.N_pml_low[2], - self.dt, self.dx, self.dy, self.dz, i_block, - j_block, k_block) + self.blocks_mat[i_block, j_block, k_block] = PmlBlock3D( + self.N_pml_low[0], + self.Ny, + self.N_pml_low[2], + self.dt, + self.dx, + self.dy, + self.dz, + i_block, + j_block, + k_block, + ) self.blocks.append(self.blocks_mat[i_block, j_block, k_block]) - if bc_high[2] is 'pml': + if bc_high[2] == "pml": i_block = 0 j_block = 1 k_block = 2 - self.blocks_mat[i_block, j_block, k_block] = PmlBlock3D(self.N_pml_low[0], self.Ny, self.N_pml_high[2], - self.dt, self.dx, self.dy, self.dz, i_block, - j_block, k_block) + self.blocks_mat[i_block, j_block, k_block] = PmlBlock3D( + self.N_pml_low[0], + self.Ny, + self.N_pml_high[2], + self.dt, + self.dx, + self.dy, + self.dz, + i_block, + j_block, + k_block, + ) self.blocks.append(self.blocks_mat[i_block, j_block, k_block]) - if bc_high[0] is 'pml': + if bc_high[0] == "pml": i_block = 2 j_block = 1 k_block = 1 - self.blocks_mat[i_block, j_block, k_block] = PmlBlock3D(self.N_pml_high[0], self.Ny, self.Nz, self.dt, - self.dx, self.dy, self.dz, i_block, j_block, - k_block) + self.blocks_mat[i_block, j_block, k_block] = PmlBlock3D( + self.N_pml_high[0], + self.Ny, + self.Nz, + self.dt, + self.dx, + self.dy, + self.dz, + i_block, + j_block, + k_block, + ) self.blocks.append(self.blocks_mat[i_block, j_block, k_block]) - if bc_low[1] is 'pml': + if bc_low[1] == "pml": i_block = 2 j_block = 0 k_block = 1 - self.blocks_mat[i_block, j_block, k_block] = PmlBlock3D(self.N_pml_high[0], self.N_pml_low[1], self.Nz, - self.dt, self.dx, self.dy, self.dz, i_block, - j_block, k_block) + self.blocks_mat[i_block, j_block, k_block] = PmlBlock3D( + self.N_pml_high[0], + self.N_pml_low[1], + self.Nz, + self.dt, + self.dx, + self.dy, + self.dz, + i_block, + j_block, + k_block, + ) self.blocks.append(self.blocks_mat[i_block, j_block, k_block]) - if bc_low[2] is 'pml': + if bc_low[2] == "pml": i_block = 2 j_block = 0 k_block = 0 - self.blocks_mat[i_block, j_block, k_block] = PmlBlock3D(self.N_pml_high[0], self.N_pml_low[1], - self.N_pml_low[2], self.dt, self.dx, - self.dy, - self.dz, i_block, j_block, k_block) + self.blocks_mat[i_block, j_block, k_block] = PmlBlock3D( + self.N_pml_high[0], + self.N_pml_low[1], + self.N_pml_low[2], + self.dt, + self.dx, + self.dy, + self.dz, + i_block, + j_block, + k_block, + ) self.blocks.append(self.blocks_mat[i_block, j_block, k_block]) - if bc_high[2] is 'pml': + if bc_high[2] == "pml": i_block = 2 j_block = 0 k_block = 2 - self.blocks_mat[i_block, j_block, k_block] = PmlBlock3D(self.N_pml_high[0], self.N_pml_low[1], - self.N_pml_high[2], self.dt, self.dx, - self.dy, - self.dz, i_block, j_block, k_block) + self.blocks_mat[i_block, j_block, k_block] = PmlBlock3D( + self.N_pml_high[0], + self.N_pml_low[1], + self.N_pml_high[2], + self.dt, + self.dx, + self.dy, + self.dz, + i_block, + j_block, + k_block, + ) self.blocks.append(self.blocks_mat[i_block, j_block, k_block]) - if bc_high[1] is 'pml': + if bc_high[1] == "pml": i_block = 2 j_block = 2 k_block = 1 - self.blocks_mat[i_block, j_block, k_block] = PmlBlock3D(self.N_pml_high[0], self.N_pml_high[1], self.Nz, - self.dt, self.dx, self.dy, self.dz, i_block, - j_block, k_block) + self.blocks_mat[i_block, j_block, k_block] = PmlBlock3D( + self.N_pml_high[0], + self.N_pml_high[1], + self.Nz, + self.dt, + self.dx, + self.dy, + self.dz, + i_block, + j_block, + k_block, + ) self.blocks.append(self.blocks_mat[i_block, j_block, k_block]) - if bc_low[2] is 'pml': + if bc_low[2] == "pml": i_block = 2 j_block = 2 k_block = 0 - self.blocks_mat[i_block, j_block, k_block] = PmlBlock3D(self.N_pml_high[0], self.N_pml_high[1], - self.N_pml_low[2], self.dt, self.dx, - self.dy, - self.dz, i_block, j_block, k_block) + self.blocks_mat[i_block, j_block, k_block] = PmlBlock3D( + self.N_pml_high[0], + self.N_pml_high[1], + self.N_pml_low[2], + self.dt, + self.dx, + self.dy, + self.dz, + i_block, + j_block, + k_block, + ) self.blocks.append(self.blocks_mat[i_block, j_block, k_block]) - if bc_high[2] is 'pml': + if bc_high[2] == "pml": i_block = 2 j_block = 2 k_block = 2 - self.blocks_mat[i_block, j_block, k_block] = PmlBlock3D(self.N_pml_high[0], self.N_pml_high[1], - self.N_pml_high[2], self.dt, self.dx, - self.dy, - self.dz, i_block, j_block, k_block) + self.blocks_mat[i_block, j_block, k_block] = PmlBlock3D( + self.N_pml_high[0], + self.N_pml_high[1], + self.N_pml_high[2], + self.dt, + self.dx, + self.dy, + self.dz, + i_block, + j_block, + k_block, + ) self.blocks.append(self.blocks_mat[i_block, j_block, k_block]) - if bc_low[2] is 'pml': + if bc_low[2] == "pml": i_block = 2 j_block = 1 k_block = 0 - self.blocks_mat[i_block, j_block, k_block] = PmlBlock3D(self.N_pml_high[0], self.Ny, self.N_pml_low[2], - self.dt, self.dx, self.dy, self.dz, i_block, - j_block, k_block) + self.blocks_mat[i_block, j_block, k_block] = PmlBlock3D( + self.N_pml_high[0], + self.Ny, + self.N_pml_low[2], + self.dt, + self.dx, + self.dy, + self.dz, + i_block, + j_block, + k_block, + ) self.blocks.append(self.blocks_mat[i_block, j_block, k_block]) - if bc_high[2] is 'pml': + if bc_high[2] == "pml": i_block = 2 j_block = 1 k_block = 2 - self.blocks_mat[i_block, j_block, k_block] = PmlBlock3D(self.N_pml_high[0], self.Ny, self.N_pml_high[2], - self.dt, self.dx, self.dy, self.dz, i_block, - j_block, k_block) + self.blocks_mat[i_block, j_block, k_block] = PmlBlock3D( + self.N_pml_high[0], + self.Ny, + self.N_pml_high[2], + self.dt, + self.dx, + self.dy, + self.dz, + i_block, + j_block, + k_block, + ) self.blocks.append(self.blocks_mat[i_block, j_block, k_block]) - if bc_low[1] is 'pml': + if bc_low[1] == "pml": i_block = 1 j_block = 0 k_block = 1 - self.blocks_mat[i_block, j_block, k_block] = PmlBlock3D(self.Nx, self.N_pml_low[1], self.Nz, self.dt, - self.dx, - self.dy, self.dz, i_block, j_block, k_block) + self.blocks_mat[i_block, j_block, k_block] = PmlBlock3D( + self.Nx, + self.N_pml_low[1], + self.Nz, + self.dt, + self.dx, + self.dy, + self.dz, + i_block, + j_block, + k_block, + ) self.blocks.append(self.blocks_mat[i_block, j_block, k_block]) - if bc_low[2] is 'pml': + if bc_low[2] == "pml": i_block = 1 j_block = 0 k_block = 0 - self.blocks_mat[i_block, j_block, k_block] = PmlBlock3D(self.Nx, self.N_pml_low[1], self.N_pml_low[2], - self.dt, self.dx, self.dy, self.dz, i_block, - j_block, k_block) + self.blocks_mat[i_block, j_block, k_block] = PmlBlock3D( + self.Nx, + self.N_pml_low[1], + self.N_pml_low[2], + self.dt, + self.dx, + self.dy, + self.dz, + i_block, + j_block, + k_block, + ) self.blocks.append(self.blocks_mat[i_block, j_block, k_block]) - if bc_high[2] is 'pml': + if bc_high[2] == "pml": i_block = 1 j_block = 0 k_block = 2 - self.blocks_mat[i_block, j_block, k_block] = PmlBlock3D(self.Nx, self.N_pml_low[1], self.N_pml_high[2], - self.dt, self.dx, self.dy, self.dz, i_block, - j_block, k_block) + self.blocks_mat[i_block, j_block, k_block] = PmlBlock3D( + self.Nx, + self.N_pml_low[1], + self.N_pml_high[2], + self.dt, + self.dx, + self.dy, + self.dz, + i_block, + j_block, + k_block, + ) self.blocks.append(self.blocks_mat[i_block, j_block, k_block]) - if bc_high[1] is 'pml': + if bc_high[1] == "pml": i_block = 1 j_block = 2 k_block = 1 - self.blocks_mat[i_block, j_block, k_block] = PmlBlock3D(self.Nx, self.N_pml_high[1], self.Nz, self.dt, - self.dx, self.dy, self.dz, i_block, j_block, - k_block) + self.blocks_mat[i_block, j_block, k_block] = PmlBlock3D( + self.Nx, + self.N_pml_high[1], + self.Nz, + self.dt, + self.dx, + self.dy, + self.dz, + i_block, + j_block, + k_block, + ) self.blocks.append(self.blocks_mat[i_block, j_block, k_block]) - if bc_low[2] is 'pml': + if bc_low[2] == "pml": i_block = 1 j_block = 2 k_block = 0 - self.blocks_mat[i_block, j_block, k_block] = PmlBlock3D(self.Nx, self.N_pml_low[1], self.N_pml_low[2], - self.dt, self.dx, self.dy, self.dz, i_block, - j_block, k_block) + self.blocks_mat[i_block, j_block, k_block] = PmlBlock3D( + self.Nx, + self.N_pml_low[1], + self.N_pml_low[2], + self.dt, + self.dx, + self.dy, + self.dz, + i_block, + j_block, + k_block, + ) self.blocks.append(self.blocks_mat[i_block, j_block, k_block]) - if bc_high[2] is 'pml': + if bc_high[2] == "pml": i_block = 1 j_block = 2 k_block = 2 - self.blocks_mat[i_block, j_block, k_block] = PmlBlock3D(self.Nx, self.N_pml_low[1], self.N_pml_high[2], - self.dt, self.dx, self.dy, self.dz, i_block, - j_block, k_block) + self.blocks_mat[i_block, j_block, k_block] = PmlBlock3D( + self.Nx, + self.N_pml_low[1], + self.N_pml_high[2], + self.dt, + self.dx, + self.dy, + self.dz, + i_block, + j_block, + k_block, + ) self.blocks.append(self.blocks_mat[i_block, j_block, k_block]) - if bc_low[2] is 'pml': + if bc_low[2] == "pml": i_block = 1 j_block = 1 k_block = 0 - self.blocks_mat[i_block, j_block, k_block] = PmlBlock3D(self.Nx, self.Ny, self.N_pml_low[2], self.dt, - self.dx, - self.dy, self.dz, i_block, j_block, k_block) + self.blocks_mat[i_block, j_block, k_block] = PmlBlock3D( + self.Nx, + self.Ny, + self.N_pml_low[2], + self.dt, + self.dx, + self.dy, + self.dz, + i_block, + j_block, + k_block, + ) self.blocks.append(self.blocks_mat[i_block, j_block, k_block]) - if bc_high[2] is 'pml': + if bc_high[2] == "pml": i_block = 1 j_block = 1 k_block = 2 - self.blocks_mat[i_block, j_block, k_block] = PmlBlock3D(self.Nx, self.Ny, self.N_pml_high[2], self.dt, - self.dx, self.dy, self.dz, i_block, j_block, - k_block) + self.blocks_mat[i_block, j_block, k_block] = PmlBlock3D( + self.Nx, + self.Ny, + self.N_pml_high[2], + self.dt, + self.dx, + self.dy, + self.dz, + i_block, + j_block, + k_block, + ) self.blocks.append(self.blocks_mat[i_block, j_block, k_block]) for block in self.blocks: @@ -358,350 +597,679 @@ def assemble_conductivities_pmls(self): sigma_m_high_z = 0 Z_0_2 = mu_0 / eps_0 - if self.bc_low[0] is 'pml': - sigma_m_low_x = -(self.alpha_pml + 1) * eps_0 * c_light / (2 * (self.N_pml_low[0] - 1) * self.dx) * np.log(self.R0_pml) - if self.bc_low[1] is 'pml': - sigma_m_low_y = -(self.alpha_pml + 1) * eps_0 * c_light / (2 * (self.N_pml_low[1] - 1) * self.dy) * np.log(self.R0_pml) - if self.bc_low[2] is 'pml': - sigma_m_low_z = -(self.alpha_pml + 1) * eps_0 * c_light / (2 * (self.N_pml_low[2] - 1) * self.dy) * np.log(self.R0_pml) - if self.bc_high[0] is 'pml': - sigma_m_high_x = -(self.alpha_pml + 1) * eps_0 * c_light / (2 * (self.N_pml_high[0] - 1) * self.dy) * np.log(self.R0_pml) - if self.bc_high[1] is 'pml': - sigma_m_high_y = -(self.alpha_pml + 1) * eps_0 * c_light / (2 * (self.N_pml_high[1] - 1) * self.dy) * np.log(self.R0_pml) - if self.bc_high[2] is 'pml': - sigma_m_high_z = -(self.alpha_pml + 1) * eps_0 * c_light / (2 * (self.N_pml_high[2] - 1) * self.dy) * np.log(self.R0_pml) - - - if self.bc_low[0] is 'pml': + if self.bc_low[0] == "pml": + sigma_m_low_x = ( + -(self.alpha_pml + 1) + * eps_0 + * c_light + / (2 * (self.N_pml_low[0] - 1) * self.dx) + * np.log(self.R0_pml) + ) + if self.bc_low[1] == "pml": + sigma_m_low_y = ( + -(self.alpha_pml + 1) + * eps_0 + * c_light + / (2 * (self.N_pml_low[1] - 1) * self.dy) + * np.log(self.R0_pml) + ) + if self.bc_low[2] == "pml": + sigma_m_low_z = ( + -(self.alpha_pml + 1) + * eps_0 + * c_light + / (2 * (self.N_pml_low[2] - 1) * self.dy) + * np.log(self.R0_pml) + ) + if self.bc_high[0] == "pml": + sigma_m_high_x = ( + -(self.alpha_pml + 1) + * eps_0 + * c_light + / (2 * (self.N_pml_high[0] - 1) * self.dy) + * np.log(self.R0_pml) + ) + if self.bc_high[1] == "pml": + sigma_m_high_y = ( + -(self.alpha_pml + 1) + * eps_0 + * c_light + / (2 * (self.N_pml_high[1] - 1) * self.dy) + * np.log(self.R0_pml) + ) + if self.bc_high[2] == "pml": + sigma_m_high_z = ( + -(self.alpha_pml + 1) + * eps_0 + * c_light + / (2 * (self.N_pml_high[2] - 1) * self.dy) + * np.log(self.R0_pml) + ) + + if self.bc_low[0] == "pml": (i_block, j_block, k_block) = (0, 1, 1) for n in range(self.N_pml_low[0]): - self.blocks_mat[i_block, j_block, k_block].sigma_x[-(n + 1), :, :] = sigma_m_low_x * ( - n / (self.N_pml_low[0])) ** self.alpha_pml - self.blocks_mat[i_block, j_block, k_block].sigma_star_x[-(n + 1), :, :] = sigma_m_low_x * ( - n / (self.N_pml_low[0])) ** self.alpha_pml*Z_0_2 - if self.bc_low[1] is 'pml': + self.blocks_mat[i_block, j_block, k_block].sigma_x[-(n + 1), :, :] = ( + sigma_m_low_x * (n / (self.N_pml_low[0])) ** self.alpha_pml + ) + self.blocks_mat[i_block, j_block, k_block].sigma_star_x[ + -(n + 1), :, : + ] = sigma_m_low_x * (n / (self.N_pml_low[0])) ** self.alpha_pml * Z_0_2 + if self.bc_low[1] == "pml": (i_block, j_block, k_block) = (0, 0, 1) for n in range((self.N_pml_low[0])): - self.blocks_mat[i_block, j_block, k_block].sigma_x[-(n + 1), :, :] = sigma_m_low_x * ( - n / (self.N_pml_low[0])) ** self.alpha_pml - self.blocks_mat[i_block, j_block, k_block].sigma_star_x[-(n + 1), :, :] = sigma_m_low_x * ( - n / (self.N_pml_low[0])) ** self.alpha_pml*Z_0_2 + self.blocks_mat[i_block, j_block, k_block].sigma_x[ + -(n + 1), :, : + ] = sigma_m_low_x * (n / (self.N_pml_low[0])) ** self.alpha_pml + self.blocks_mat[i_block, j_block, k_block].sigma_star_x[ + -(n + 1), :, : + ] = ( + sigma_m_low_x + * (n / (self.N_pml_low[0])) ** self.alpha_pml + * Z_0_2 + ) for n in range((self.N_pml_low[1])): - self.blocks_mat[i_block, j_block, k_block].sigma_y[:, -(n + 1), :] = sigma_m_low_y * ( - n / (self.N_pml_low[1])) ** self.alpha_pml - self.blocks_mat[i_block, j_block, k_block].sigma_star_y[:, -(n + 1), :] = sigma_m_low_y * ( - n / (self.N_pml_low[1])) ** self.alpha_pml*Z_0_2 - if self.bc_low[2] is 'pml': + self.blocks_mat[i_block, j_block, k_block].sigma_y[ + :, -(n + 1), : + ] = sigma_m_low_y * (n / (self.N_pml_low[1])) ** self.alpha_pml + self.blocks_mat[i_block, j_block, k_block].sigma_star_y[ + :, -(n + 1), : + ] = ( + sigma_m_low_y + * (n / (self.N_pml_low[1])) ** self.alpha_pml + * Z_0_2 + ) + if self.bc_low[2] == "pml": (i_block, j_block, k_block) = (0, 0, 0) for n in range((self.N_pml_low[0])): - self.blocks_mat[i_block, j_block, k_block].sigma_x[-(n + 1), :, :] = sigma_m_low_x * ( - n / (self.N_pml_low[0])) ** self.alpha_pml - self.blocks_mat[i_block, j_block, k_block].sigma_star_x[-(n + 1), :, :] = sigma_m_low_x * ( - n / (self.N_pml_low[0])) ** self.alpha_pml*Z_0_2 + self.blocks_mat[i_block, j_block, k_block].sigma_x[ + -(n + 1), :, : + ] = sigma_m_low_x * (n / (self.N_pml_low[0])) ** self.alpha_pml + self.blocks_mat[i_block, j_block, k_block].sigma_star_x[ + -(n + 1), :, : + ] = ( + sigma_m_low_x + * (n / (self.N_pml_low[0])) ** self.alpha_pml + * Z_0_2 + ) for n in range((self.N_pml_low[1])): - self.blocks_mat[i_block, j_block, k_block].sigma_y[:, -(n + 1), :] = sigma_m_low_y * ( - n / (self.N_pml_low[1])) ** self.alpha_pml - self.blocks_mat[i_block, j_block, k_block].sigma_star_y[:, -(n + 1), :] = sigma_m_low_y * ( - n / (self.N_pml_low[1])) ** self.alpha_pml*Z_0_2 + self.blocks_mat[i_block, j_block, k_block].sigma_y[ + :, -(n + 1), : + ] = sigma_m_low_y * (n / (self.N_pml_low[1])) ** self.alpha_pml + self.blocks_mat[i_block, j_block, k_block].sigma_star_y[ + :, -(n + 1), : + ] = ( + sigma_m_low_y + * (n / (self.N_pml_low[1])) ** self.alpha_pml + * Z_0_2 + ) for n in range((self.N_pml_low[2])): - self.blocks_mat[i_block, j_block, k_block].sigma_z[:, :, -(n + 1)] = sigma_m_low_z * ( - n / (self.N_pml_low[2])) ** self.alpha_pml - self.blocks_mat[i_block, j_block, k_block].sigma_star_z[:, :, -(n + 1)] = sigma_m_low_z * ( - n / (self.N_pml_low[2])) ** self.alpha_pml*Z_0_2 - if self.bc_low[2] is 'pml': + self.blocks_mat[i_block, j_block, k_block].sigma_z[ + :, :, -(n + 1) + ] = sigma_m_low_z * (n / (self.N_pml_low[2])) ** self.alpha_pml + self.blocks_mat[i_block, j_block, k_block].sigma_star_z[ + :, :, -(n + 1) + ] = ( + sigma_m_low_z + * (n / (self.N_pml_low[2])) ** self.alpha_pml + * Z_0_2 + ) + if self.bc_low[2] == "pml": (i_block, j_block, k_block) = (0, 0, 2) for n in range((self.N_pml_low[0])): - self.blocks_mat[i_block, j_block, k_block].sigma_x[-(n + 1), :, :] = sigma_m_low_x * ( - n / (self.N_pml_low[0])) ** self.alpha_pml - self.blocks_mat[i_block, j_block, k_block].sigma_star_x[-(n + 1), :, :] = sigma_m_low_x * ( - n / (self.N_pml_low[0])) ** self.alpha_pml*Z_0_2 + self.blocks_mat[i_block, j_block, k_block].sigma_x[ + -(n + 1), :, : + ] = sigma_m_low_x * (n / (self.N_pml_low[0])) ** self.alpha_pml + self.blocks_mat[i_block, j_block, k_block].sigma_star_x[ + -(n + 1), :, : + ] = ( + sigma_m_low_x + * (n / (self.N_pml_low[0])) ** self.alpha_pml + * Z_0_2 + ) for n in range((self.N_pml_low[1])): - self.blocks_mat[i_block, j_block, k_block].sigma_y[:, -(n + 1), :] = sigma_m_low_y * ( - n / (self.N_pml_low[1])) ** self.alpha_pml - self.blocks_mat[i_block, j_block, k_block].sigma_star_y[:, -(n + 1), :] = sigma_m_low_y * ( - n / (self.N_pml_low[1])) ** self.alpha_pml*Z_0_2 + self.blocks_mat[i_block, j_block, k_block].sigma_y[ + :, -(n + 1), : + ] = sigma_m_low_y * (n / (self.N_pml_low[1])) ** self.alpha_pml + self.blocks_mat[i_block, j_block, k_block].sigma_star_y[ + :, -(n + 1), : + ] = ( + sigma_m_low_y + * (n / (self.N_pml_low[1])) ** self.alpha_pml + * Z_0_2 + ) for n in range((self.N_pml_high[2])): - self.blocks_mat[i_block, j_block, k_block].sigma_z[:, :, n] = sigma_m_high_z * ( - n / (self.N_pml_high[2])) ** self.alpha_pml - self.blocks_mat[i_block, j_block, k_block].sigma_star_z[:, :, n] = sigma_m_high_z * ( - n / (self.N_pml_high[2])) ** self.alpha_pml*Z_0_2 - if self.bc_high[1] is 'pml': + self.blocks_mat[i_block, j_block, k_block].sigma_z[:, :, n] = ( + sigma_m_high_z + * (n / (self.N_pml_high[2])) ** self.alpha_pml + ) + self.blocks_mat[i_block, j_block, k_block].sigma_star_z[ + :, :, n + ] = ( + sigma_m_high_z + * (n / (self.N_pml_high[2])) ** self.alpha_pml + * Z_0_2 + ) + if self.bc_high[1] == "pml": (i_block, j_block, k_block) = (0, 2, 1) for n in range(self.N_pml_low[0]): - self.blocks_mat[i_block, j_block, k_block].sigma_x[-(n + 1), :, :] = sigma_m_low_x * ( - n / (self.N_pml_low[0])) ** self.alpha_pml - self.blocks_mat[i_block, j_block, k_block].sigma_star_x[-(n + 1), :, :] = sigma_m_low_x * ( - n / (self.N_pml_low[0])) ** self.alpha_pml*Z_0_2 + self.blocks_mat[i_block, j_block, k_block].sigma_x[ + -(n + 1), :, : + ] = sigma_m_low_x * (n / (self.N_pml_low[0])) ** self.alpha_pml + self.blocks_mat[i_block, j_block, k_block].sigma_star_x[ + -(n + 1), :, : + ] = ( + sigma_m_low_x + * (n / (self.N_pml_low[0])) ** self.alpha_pml + * Z_0_2 + ) for n in range(self.N_pml_high[1]): - self.blocks_mat[i_block, j_block, k_block].sigma_y[:, n, :] = sigma_m_high_y * ( - n / (self.N_pml_high[1])) ** self.alpha_pml - self.blocks_mat[i_block, j_block, k_block].sigma_star_y[:, n, :] = sigma_m_high_y * ( - n / (self.N_pml_high[1])) ** self.alpha_pml*Z_0_2 - - if self.bc_low[2] is 'pml': + self.blocks_mat[i_block, j_block, k_block].sigma_y[:, n, :] = ( + sigma_m_high_y * (n / (self.N_pml_high[1])) ** self.alpha_pml + ) + self.blocks_mat[i_block, j_block, k_block].sigma_star_y[:, n, :] = ( + sigma_m_high_y + * (n / (self.N_pml_high[1])) ** self.alpha_pml + * Z_0_2 + ) + + if self.bc_low[2] == "pml": (i_block, j_block, k_block) = (0, 2, 0) for n in range((self.N_pml_low[0])): - self.blocks_mat[i_block, j_block, k_block].sigma_x[-(n + 1), :, :] = sigma_m_low_x * ( - n / (self.N_pml_low[0])) ** self.alpha_pml - self.blocks_mat[i_block, j_block, k_block].sigma_star_x[-(n + 1), :, :] = sigma_m_low_x * ( - n / (self.N_pml_low[0])) ** self.alpha_pml*Z_0_2 + self.blocks_mat[i_block, j_block, k_block].sigma_x[ + -(n + 1), :, : + ] = sigma_m_low_x * (n / (self.N_pml_low[0])) ** self.alpha_pml + self.blocks_mat[i_block, j_block, k_block].sigma_star_x[ + -(n + 1), :, : + ] = ( + sigma_m_low_x + * (n / (self.N_pml_low[0])) ** self.alpha_pml + * Z_0_2 + ) for n in range((self.N_pml_high[1])): - self.blocks_mat[i_block, j_block, k_block].sigma_y[:, n, :] = sigma_m_high_y * ( - n / (self.N_pml_high[1])) ** self.alpha_pml - self.blocks_mat[i_block, j_block, k_block].sigma_star_y[:, n, :] = sigma_m_high_y * ( - n / (self.N_pml_high[1])) ** self.alpha_pml*Z_0_2 + self.blocks_mat[i_block, j_block, k_block].sigma_y[:, n, :] = ( + sigma_m_high_y + * (n / (self.N_pml_high[1])) ** self.alpha_pml + ) + self.blocks_mat[i_block, j_block, k_block].sigma_star_y[ + :, n, : + ] = ( + sigma_m_high_y + * (n / (self.N_pml_high[1])) ** self.alpha_pml + * Z_0_2 + ) for n in range((self.N_pml_low[2])): - self.blocks_mat[i_block, j_block, k_block].sigma_z[:, :, -(n + 1)] = sigma_m_low_z * ( - n / (self.N_pml_low[2])) ** self.alpha_pml - self.blocks_mat[i_block, j_block, k_block].sigma_star_z[:, :, -(n + 1)] = sigma_m_low_z * ( - n / (self.N_pml_low[2])) ** self.alpha_pml*Z_0_2 - if self.bc_low[2] is 'pml': + self.blocks_mat[i_block, j_block, k_block].sigma_z[ + :, :, -(n + 1) + ] = sigma_m_low_z * (n / (self.N_pml_low[2])) ** self.alpha_pml + self.blocks_mat[i_block, j_block, k_block].sigma_star_z[ + :, :, -(n + 1) + ] = ( + sigma_m_low_z + * (n / (self.N_pml_low[2])) ** self.alpha_pml + * Z_0_2 + ) + if self.bc_low[2] == "pml": (i_block, j_block, k_block) = (0, 2, 2) for n in range((self.N_pml_low[0])): - self.blocks_mat[i_block, j_block, k_block].sigma_x[-(n + 1), :, :] = sigma_m_low_x * ( - n / (self.N_pml_low[0])) ** self.alpha_pml - self.blocks_mat[i_block, j_block, k_block].sigma_star_x[-(n + 1), :, :] = sigma_m_low_x * ( - n / (self.N_pml_low[0])) ** self.alpha_pml*Z_0_2 + self.blocks_mat[i_block, j_block, k_block].sigma_x[ + -(n + 1), :, : + ] = sigma_m_low_x * (n / (self.N_pml_low[0])) ** self.alpha_pml + self.blocks_mat[i_block, j_block, k_block].sigma_star_x[ + -(n + 1), :, : + ] = ( + sigma_m_low_x + * (n / (self.N_pml_low[0])) ** self.alpha_pml + * Z_0_2 + ) for n in range((self.N_pml_high[1])): - self.blocks_mat[i_block, j_block, k_block].sigma_y[:, n, :] = sigma_m_high_y * ( - n / (self.N_pml_high[1])) ** self.alpha_pml - self.blocks_mat[i_block, j_block, k_block].sigma_star_y[:, n, :] = sigma_m_high_y * ( - n / (self.N_pml_high[1])) ** self.alpha_pml*Z_0_2 + self.blocks_mat[i_block, j_block, k_block].sigma_y[:, n, :] = ( + sigma_m_high_y + * (n / (self.N_pml_high[1])) ** self.alpha_pml + ) + self.blocks_mat[i_block, j_block, k_block].sigma_star_y[ + :, n, : + ] = ( + sigma_m_high_y + * (n / (self.N_pml_high[1])) ** self.alpha_pml + * Z_0_2 + ) for n in range((self.N_pml_high[2])): - self.blocks_mat[i_block, j_block, k_block].sigma_z[:, :, n] = sigma_m_high_z * ( - n / (self.N_pml_high[2])) ** self.alpha_pml - self.blocks_mat[i_block, j_block, k_block].sigma_star_z[:, :, n] = sigma_m_high_z * ( - n / (self.N_pml_high[2])) ** self.alpha_pml*Z_0_2 - if self.bc_low[2] is 'pml': + self.blocks_mat[i_block, j_block, k_block].sigma_z[:, :, n] = ( + sigma_m_high_z + * (n / (self.N_pml_high[2])) ** self.alpha_pml + ) + self.blocks_mat[i_block, j_block, k_block].sigma_star_z[ + :, :, n + ] = ( + sigma_m_high_z + * (n / (self.N_pml_high[2])) ** self.alpha_pml + * Z_0_2 + ) + if self.bc_low[2] == "pml": (i_block, j_block, k_block) = (0, 1, 0) for n in range((self.N_pml_low[0])): - self.blocks_mat[i_block, j_block, k_block].sigma_x[-(n + 1), :, :] = sigma_m_low_x * ( - n / (self.N_pml_low[0])) ** self.alpha_pml - self.blocks_mat[i_block, j_block, k_block].sigma_star_x[-(n + 1), :, :] = sigma_m_low_x * ( - n / (self.N_pml_low[0])) ** self.alpha_pml*Z_0_2 + self.blocks_mat[i_block, j_block, k_block].sigma_x[ + -(n + 1), :, : + ] = sigma_m_low_x * (n / (self.N_pml_low[0])) ** self.alpha_pml + self.blocks_mat[i_block, j_block, k_block].sigma_star_x[ + -(n + 1), :, : + ] = ( + sigma_m_low_x + * (n / (self.N_pml_low[0])) ** self.alpha_pml + * Z_0_2 + ) for n in range((self.N_pml_low[2])): - self.blocks_mat[i_block, j_block, k_block].sigma_z[:, :, -(n + 1)] = sigma_m_low_z * ( - n / (self.N_pml_low[2])) ** self.alpha_pml - self.blocks_mat[i_block, j_block, k_block].sigma_star_z[:, :, -(n + 1)] = sigma_m_low_z * ( - n / (self.N_pml_low[2])) ** self.alpha_pml*Z_0_2 - if self.bc_high[2] is 'pml': + self.blocks_mat[i_block, j_block, k_block].sigma_z[ + :, :, -(n + 1) + ] = sigma_m_low_z * (n / (self.N_pml_low[2])) ** self.alpha_pml + self.blocks_mat[i_block, j_block, k_block].sigma_star_z[ + :, :, -(n + 1) + ] = ( + sigma_m_low_z + * (n / (self.N_pml_low[2])) ** self.alpha_pml + * Z_0_2 + ) + if self.bc_high[2] == "pml": (i_block, j_block, k_block) = (0, 1, 2) for n in range((self.N_pml_low[0])): - self.blocks_mat[i_block, j_block, k_block].sigma_x[-(n + 1), :, :] = sigma_m_low_x * ( - n / (self.N_pml_low[0])) ** self.alpha_pml - self.blocks_mat[i_block, j_block, k_block].sigma_star_x[-(n + 1), :, :] = sigma_m_low_x * ( - n / (self.N_pml_low[0])) ** self.alpha_pml*Z_0_2 + self.blocks_mat[i_block, j_block, k_block].sigma_x[ + -(n + 1), :, : + ] = sigma_m_low_x * (n / (self.N_pml_low[0])) ** self.alpha_pml + self.blocks_mat[i_block, j_block, k_block].sigma_star_x[ + -(n + 1), :, : + ] = ( + sigma_m_low_x + * (n / (self.N_pml_low[0])) ** self.alpha_pml + * Z_0_2 + ) for n in range((self.N_pml_high[2])): - self.blocks_mat[i_block, j_block, k_block].sigma_z[:, :, n] = sigma_m_high_z * ( - n / (self.N_pml_high[2])) ** self.alpha_pml - self.blocks_mat[i_block, j_block, k_block].sigma_star_z[:, :, n] = sigma_m_high_z * ( - n / (self.N_pml_high[2])) ** self.alpha_pml*Z_0_2 - - if self.bc_high[0] is 'pml': + self.blocks_mat[i_block, j_block, k_block].sigma_z[:, :, n] = ( + sigma_m_high_z * (n / (self.N_pml_high[2])) ** self.alpha_pml + ) + self.blocks_mat[i_block, j_block, k_block].sigma_star_z[:, :, n] = ( + sigma_m_high_z + * (n / (self.N_pml_high[2])) ** self.alpha_pml + * Z_0_2 + ) + + if self.bc_high[0] == "pml": (i_block, j_block, k_block) = (2, 1, 1) for n in range(self.N_pml_high[0]): - self.blocks_mat[i_block, j_block, k_block].sigma_x[n, :, :] = sigma_m_high_x * ( - n / (self.N_pml_high[0])) ** self.alpha_pml - self.blocks_mat[i_block, j_block, k_block].sigma_star_x[n, :, :] = sigma_m_high_x * ( - n / (self.N_pml_high[0])) ** self.alpha_pml*Z_0_2 - if self.bc_low[1] is 'pml': + self.blocks_mat[i_block, j_block, k_block].sigma_x[n, :, :] = ( + sigma_m_high_x * (n / (self.N_pml_high[0])) ** self.alpha_pml + ) + self.blocks_mat[i_block, j_block, k_block].sigma_star_x[n, :, :] = ( + sigma_m_high_x + * (n / (self.N_pml_high[0])) ** self.alpha_pml + * Z_0_2 + ) + if self.bc_low[1] == "pml": (i_block, j_block, k_block) = (2, 0, 1) for n in range(self.N_pml_high[0]): - self.blocks_mat[i_block, j_block, k_block].sigma_x[n, :, :] = sigma_m_high_x * ( - n / (self.N_pml_high[0])) ** self.alpha_pml - self.blocks_mat[i_block, j_block, k_block].sigma_star_x[n, :, :] = sigma_m_high_x * ( - n / (self.N_pml_high[0])) ** self.alpha_pml*Z_0_2 + self.blocks_mat[i_block, j_block, k_block].sigma_x[n, :, :] = ( + sigma_m_high_x * (n / (self.N_pml_high[0])) ** self.alpha_pml + ) + self.blocks_mat[i_block, j_block, k_block].sigma_star_x[n, :, :] = ( + sigma_m_high_x + * (n / (self.N_pml_high[0])) ** self.alpha_pml + * Z_0_2 + ) for n in range((self.N_pml_low[1])): - self.blocks_mat[i_block, j_block, k_block].sigma_y[:, -(n + 1), :] = sigma_m_low_y * ( - n / (self.N_pml_low[1])) ** self.alpha_pml - self.blocks_mat[i_block, j_block, k_block].sigma_star_y[:, -(n + 1), :] = sigma_m_low_y * ( - n / (self.N_pml_low[1])) ** self.alpha_pml*Z_0_2 - if self.bc_low[2] is 'pml': + self.blocks_mat[i_block, j_block, k_block].sigma_y[ + :, -(n + 1), : + ] = sigma_m_low_y * (n / (self.N_pml_low[1])) ** self.alpha_pml + self.blocks_mat[i_block, j_block, k_block].sigma_star_y[ + :, -(n + 1), : + ] = ( + sigma_m_low_y + * (n / (self.N_pml_low[1])) ** self.alpha_pml + * Z_0_2 + ) + if self.bc_low[2] == "pml": (i_block, j_block, k_block) = (2, 0, 0) for n in range(self.N_pml_high[0]): - self.blocks_mat[i_block, j_block, k_block].sigma_x[n, :, :] = sigma_m_high_x * ( - n / (self.N_pml_high[0])) ** self.alpha_pml - self.blocks_mat[i_block, j_block, k_block].sigma_star_x[n, :, :] = sigma_m_high_x * ( - n / (self.N_pml_high[0])) ** self.alpha_pml*Z_0_2 + self.blocks_mat[i_block, j_block, k_block].sigma_x[n, :, :] = ( + sigma_m_high_x + * (n / (self.N_pml_high[0])) ** self.alpha_pml + ) + self.blocks_mat[i_block, j_block, k_block].sigma_star_x[ + n, :, : + ] = ( + sigma_m_high_x + * (n / (self.N_pml_high[0])) ** self.alpha_pml + * Z_0_2 + ) for n in range((self.N_pml_low[1])): - self.blocks_mat[i_block, j_block, k_block].sigma_y[:, -(n + 1), :] = sigma_m_low_y * ( - n / (self.N_pml_low[1])) ** self.alpha_pml - self.blocks_mat[i_block, j_block, k_block].sigma_star_y[:, -(n + 1), :] = sigma_m_low_y * ( - n / (self.N_pml_low[1])) ** self.alpha_pml*Z_0_2 + self.blocks_mat[i_block, j_block, k_block].sigma_y[ + :, -(n + 1), : + ] = sigma_m_low_y * (n / (self.N_pml_low[1])) ** self.alpha_pml + self.blocks_mat[i_block, j_block, k_block].sigma_star_y[ + :, -(n + 1), : + ] = ( + sigma_m_low_y + * (n / (self.N_pml_low[1])) ** self.alpha_pml + * Z_0_2 + ) for n in range((self.N_pml_low[2])): - self.blocks_mat[i_block, j_block, k_block].sigma_z[:, :, -(n + 1)] = sigma_m_low_z * ( - n / (self.N_pml_low[2])) ** self.alpha_pml - self.blocks_mat[i_block, j_block, k_block].sigma_star_z[:, :, -(n + 1)] = sigma_m_low_z * ( - n / (self.N_pml_low[2])) ** self.alpha_pml*Z_0_2 - if self.bc_low[2] is 'pml': + self.blocks_mat[i_block, j_block, k_block].sigma_z[ + :, :, -(n + 1) + ] = sigma_m_low_z * (n / (self.N_pml_low[2])) ** self.alpha_pml + self.blocks_mat[i_block, j_block, k_block].sigma_star_z[ + :, :, -(n + 1) + ] = ( + sigma_m_low_z + * (n / (self.N_pml_low[2])) ** self.alpha_pml + * Z_0_2 + ) + if self.bc_low[2] == "pml": (i_block, j_block, k_block) = (2, 0, 2) for n in range(self.N_pml_high[0]): - self.blocks_mat[i_block, j_block, k_block].sigma_x[n, :, :] = sigma_m_high_x * ( - n / (self.N_pml_high[0])) ** self.alpha_pml - self.blocks_mat[i_block, j_block, k_block].sigma_star_x[n, :, :] = sigma_m_high_x * ( - n / (self.N_pml_high[0])) ** self.alpha_pml*Z_0_2 + self.blocks_mat[i_block, j_block, k_block].sigma_x[n, :, :] = ( + sigma_m_high_x + * (n / (self.N_pml_high[0])) ** self.alpha_pml + ) + self.blocks_mat[i_block, j_block, k_block].sigma_star_x[ + n, :, : + ] = ( + sigma_m_high_x + * (n / (self.N_pml_high[0])) ** self.alpha_pml + * Z_0_2 + ) for n in range((self.N_pml_low[1])): - self.blocks_mat[i_block, j_block, k_block].sigma_y[:, -(n + 1), :] = sigma_m_low_y * ( - n / (self.N_pml_low[1])) ** self.alpha_pml - self.blocks_mat[i_block, j_block, k_block].sigma_star_y[:, -(n + 1), :] = sigma_m_low_y * ( - n / (self.N_pml_low[1])) ** self.alpha_pml*Z_0_2 + self.blocks_mat[i_block, j_block, k_block].sigma_y[ + :, -(n + 1), : + ] = sigma_m_low_y * (n / (self.N_pml_low[1])) ** self.alpha_pml + self.blocks_mat[i_block, j_block, k_block].sigma_star_y[ + :, -(n + 1), : + ] = ( + sigma_m_low_y + * (n / (self.N_pml_low[1])) ** self.alpha_pml + * Z_0_2 + ) for n in range((self.N_pml_high[2])): - self.blocks_mat[i_block, j_block, k_block].sigma_z[:, :, n] = sigma_m_high_z * ( - n / (self.N_pml_high[2])) ** self.alpha_pml - self.blocks_mat[i_block, j_block, k_block].sigma_star_z[:, :, n] = sigma_m_high_z * ( - n / (self.N_pml_high[2])) ** self.alpha_pml*Z_0_2 - if self.bc_high[1] is 'pml': + self.blocks_mat[i_block, j_block, k_block].sigma_z[:, :, n] = ( + sigma_m_high_z + * (n / (self.N_pml_high[2])) ** self.alpha_pml + ) + self.blocks_mat[i_block, j_block, k_block].sigma_star_z[ + :, :, n + ] = ( + sigma_m_high_z + * (n / (self.N_pml_high[2])) ** self.alpha_pml + * Z_0_2 + ) + if self.bc_high[1] == "pml": (i_block, j_block, k_block) = (2, 2, 1) for n in range(self.N_pml_high[0]): - self.blocks_mat[i_block, j_block, k_block].sigma_x[n, :, :] = sigma_m_high_x * ( - n / (self.N_pml_high[0])) ** self.alpha_pml - self.blocks_mat[i_block, j_block, k_block].sigma_star_x[n, :, :] = sigma_m_high_x * ( - n / (self.N_pml_high[0])) ** self.alpha_pml*Z_0_2 + self.blocks_mat[i_block, j_block, k_block].sigma_x[n, :, :] = ( + sigma_m_high_x * (n / (self.N_pml_high[0])) ** self.alpha_pml + ) + self.blocks_mat[i_block, j_block, k_block].sigma_star_x[n, :, :] = ( + sigma_m_high_x + * (n / (self.N_pml_high[0])) ** self.alpha_pml + * Z_0_2 + ) for n in range(self.N_pml_high[1]): - self.blocks_mat[i_block, j_block, k_block].sigma_y[:, n, :] = sigma_m_high_y * ( - n / (self.N_pml_high[1])) ** self.alpha_pml - self.blocks_mat[i_block, j_block, k_block].sigma_star_y[:, n, :] = sigma_m_high_y * ( - n / (self.N_pml_high[1])) ** self.alpha_pml*Z_0_2 - if self.bc_low[2] is 'pml': + self.blocks_mat[i_block, j_block, k_block].sigma_y[:, n, :] = ( + sigma_m_high_y * (n / (self.N_pml_high[1])) ** self.alpha_pml + ) + self.blocks_mat[i_block, j_block, k_block].sigma_star_y[:, n, :] = ( + sigma_m_high_y + * (n / (self.N_pml_high[1])) ** self.alpha_pml + * Z_0_2 + ) + if self.bc_low[2] == "pml": (i_block, j_block, k_block) = (2, 2, 0) for n in range(self.N_pml_high[0]): - self.blocks_mat[i_block, j_block, k_block].sigma_x[n, :, :] = sigma_m_high_x * ( - n / (self.N_pml_high[0])) ** self.alpha_pml - self.blocks_mat[i_block, j_block, k_block].sigma_star_x[n, :, :] = sigma_m_high_x * ( - n / (self.N_pml_high[0])) ** self.alpha_pml*Z_0_2 + self.blocks_mat[i_block, j_block, k_block].sigma_x[n, :, :] = ( + sigma_m_high_x + * (n / (self.N_pml_high[0])) ** self.alpha_pml + ) + self.blocks_mat[i_block, j_block, k_block].sigma_star_x[ + n, :, : + ] = ( + sigma_m_high_x + * (n / (self.N_pml_high[0])) ** self.alpha_pml + * Z_0_2 + ) for n in range((self.N_pml_high[1])): - self.blocks_mat[i_block, j_block, k_block].sigma_y[:, n, :] = sigma_m_high_y * ( - n / (self.N_pml_high[1])) ** self.alpha_pml - self.blocks_mat[i_block, j_block, k_block].sigma_star_y[:, n, :] = sigma_m_high_y * ( - n / (self.N_pml_high[1])) ** self.alpha_pml*Z_0_2 + self.blocks_mat[i_block, j_block, k_block].sigma_y[:, n, :] = ( + sigma_m_high_y + * (n / (self.N_pml_high[1])) ** self.alpha_pml + ) + self.blocks_mat[i_block, j_block, k_block].sigma_star_y[ + :, n, : + ] = ( + sigma_m_high_y + * (n / (self.N_pml_high[1])) ** self.alpha_pml + * Z_0_2 + ) for n in range((self.N_pml_low[2])): - self.blocks_mat[i_block, j_block, k_block].sigma_z[:, :, -(n + 1)] = sigma_m_low_z * ( - n / (self.N_pml_low[2])) ** self.alpha_pml - self.blocks_mat[i_block, j_block, k_block].sigma_star_z[:, :, -(n + 1)] = sigma_m_low_z * ( - n / (self.N_pml_low[2])) ** self.alpha_pml*Z_0_2 - if self.bc_low[2] is 'pml': + self.blocks_mat[i_block, j_block, k_block].sigma_z[ + :, :, -(n + 1) + ] = sigma_m_low_z * (n / (self.N_pml_low[2])) ** self.alpha_pml + self.blocks_mat[i_block, j_block, k_block].sigma_star_z[ + :, :, -(n + 1) + ] = ( + sigma_m_low_z + * (n / (self.N_pml_low[2])) ** self.alpha_pml + * Z_0_2 + ) + if self.bc_low[2] == "pml": (i_block, j_block, k_block) = (2, 2, 2) for n in range(self.N_pml_high[0]): - self.blocks_mat[i_block, j_block, k_block].sigma_x[n, :, :] = sigma_m_high_x * ( - n / (self.N_pml_high[0])) ** self.alpha_pml - self.blocks_mat[i_block, j_block, k_block].sigma_star_x[n, :, :] = sigma_m_high_x * ( - n / (self.N_pml_high[0])) ** self.alpha_pml*Z_0_2 + self.blocks_mat[i_block, j_block, k_block].sigma_x[n, :, :] = ( + sigma_m_high_x + * (n / (self.N_pml_high[0])) ** self.alpha_pml + ) + self.blocks_mat[i_block, j_block, k_block].sigma_star_x[ + n, :, : + ] = ( + sigma_m_high_x + * (n / (self.N_pml_high[0])) ** self.alpha_pml + * Z_0_2 + ) for n in range((self.N_pml_high[1])): - self.blocks_mat[i_block, j_block, k_block].sigma_y[:, n, :] = sigma_m_high_y * ( - n / (self.N_pml_high[1])) ** self.alpha_pml - self.blocks_mat[i_block, j_block, k_block].sigma_star_y[:, n, :] = sigma_m_high_y * ( - n / (self.N_pml_high[1])) ** self.alpha_pml*Z_0_2 + self.blocks_mat[i_block, j_block, k_block].sigma_y[:, n, :] = ( + sigma_m_high_y + * (n / (self.N_pml_high[1])) ** self.alpha_pml + ) + self.blocks_mat[i_block, j_block, k_block].sigma_star_y[ + :, n, : + ] = ( + sigma_m_high_y + * (n / (self.N_pml_high[1])) ** self.alpha_pml + * Z_0_2 + ) for n in range((self.N_pml_high[2])): - self.blocks_mat[i_block, j_block, k_block].sigma_z[:, :, n] = sigma_m_high_z * ( - n / (self.N_pml_high[2])) ** self.alpha_pml - self.blocks_mat[i_block, j_block, k_block].sigma_star_z[:, :, n] = sigma_m_high_z * ( - n / (self.N_pml_high[2])) ** self.alpha_pml*Z_0_2 - if self.bc_low[2] is 'pml': + self.blocks_mat[i_block, j_block, k_block].sigma_z[:, :, n] = ( + sigma_m_high_z + * (n / (self.N_pml_high[2])) ** self.alpha_pml + ) + self.blocks_mat[i_block, j_block, k_block].sigma_star_z[ + :, :, n + ] = ( + sigma_m_high_z + * (n / (self.N_pml_high[2])) ** self.alpha_pml + * Z_0_2 + ) + if self.bc_low[2] == "pml": (i_block, j_block, k_block) = (2, 1, 0) for n in range(self.N_pml_high[0]): - self.blocks_mat[i_block, j_block, k_block].sigma_x[n, :, :] = sigma_m_high_x * ( - n / (self.N_pml_high[0])) ** self.alpha_pml - self.blocks_mat[i_block, j_block, k_block].sigma_star_x[n, :, :] = sigma_m_high_x * ( - n / (self.N_pml_high[0])) ** self.alpha_pml*Z_0_2 + self.blocks_mat[i_block, j_block, k_block].sigma_x[n, :, :] = ( + sigma_m_high_x * (n / (self.N_pml_high[0])) ** self.alpha_pml + ) + self.blocks_mat[i_block, j_block, k_block].sigma_star_x[n, :, :] = ( + sigma_m_high_x + * (n / (self.N_pml_high[0])) ** self.alpha_pml + * Z_0_2 + ) for n in range((self.N_pml_low[2])): - self.blocks_mat[i_block, j_block, k_block].sigma_z[:, :, -(n + 1)] = sigma_m_low_z * ( - n / (self.N_pml_low[2])) ** self.alpha_pml - self.blocks_mat[i_block, j_block, k_block].sigma_star_z[:, :, -(n + 1)] = sigma_m_low_z * ( - n / (self.N_pml_low[2])) ** self.alpha_pml*Z_0_2 - if self.bc_high[2] is 'pml': + self.blocks_mat[i_block, j_block, k_block].sigma_z[ + :, :, -(n + 1) + ] = sigma_m_low_z * (n / (self.N_pml_low[2])) ** self.alpha_pml + self.blocks_mat[i_block, j_block, k_block].sigma_star_z[ + :, :, -(n + 1) + ] = ( + sigma_m_low_z + * (n / (self.N_pml_low[2])) ** self.alpha_pml + * Z_0_2 + ) + if self.bc_high[2] == "pml": (i_block, j_block, k_block) = (2, 1, 2) for n in range(self.N_pml_high[0]): - self.blocks_mat[i_block, j_block, k_block].sigma_x[n, :, :] = sigma_m_high_x * ( - n / (self.N_pml_high[0])) ** self.alpha_pml - self.blocks_mat[i_block, j_block, k_block].sigma_star_x[n, :, :] = sigma_m_high_x * ( - n / (self.N_pml_high[0])) ** self.alpha_pml*Z_0_2 + self.blocks_mat[i_block, j_block, k_block].sigma_x[n, :, :] = ( + sigma_m_high_x * (n / (self.N_pml_high[0])) ** self.alpha_pml + ) + self.blocks_mat[i_block, j_block, k_block].sigma_star_x[n, :, :] = ( + sigma_m_high_x + * (n / (self.N_pml_high[0])) ** self.alpha_pml + * Z_0_2 + ) for n in range((self.N_pml_high[2])): - self.blocks_mat[i_block, j_block, k_block].sigma_z[:, :, n] = sigma_m_high_z * ( - n / (self.N_pml_high[2])) ** self.alpha_pml - self.blocks_mat[i_block, j_block, k_block].sigma_star_z[:, :, n] = sigma_m_high_z * ( - n / (self.N_pml_high[2])) ** self.alpha_pml*Z_0_2 - - if self.bc_low[1] is 'pml': + self.blocks_mat[i_block, j_block, k_block].sigma_z[:, :, n] = ( + sigma_m_high_z * (n / (self.N_pml_high[2])) ** self.alpha_pml + ) + self.blocks_mat[i_block, j_block, k_block].sigma_star_z[:, :, n] = ( + sigma_m_high_z + * (n / (self.N_pml_high[2])) ** self.alpha_pml + * Z_0_2 + ) + + if self.bc_low[1] == "pml": (i_block, j_block, k_block) = (1, 0, 1) for n in range(self.N_pml_low[1]): - self.blocks_mat[i_block, j_block, k_block].sigma_y[:, -(n + 1), :] = sigma_m_low_y * ( - n / (self.N_pml_low[1])) ** self.alpha_pml - self.blocks_mat[i_block, j_block, k_block].sigma_star_y[:, -(n + 1), :] = sigma_m_low_y * ( - n / (self.N_pml_low[1])) ** self.alpha_pml*Z_0_2 - if self.bc_low[2] is 'pml': + self.blocks_mat[i_block, j_block, k_block].sigma_y[:, -(n + 1), :] = ( + sigma_m_low_y * (n / (self.N_pml_low[1])) ** self.alpha_pml + ) + self.blocks_mat[i_block, j_block, k_block].sigma_star_y[ + :, -(n + 1), : + ] = sigma_m_low_y * (n / (self.N_pml_low[1])) ** self.alpha_pml * Z_0_2 + if self.bc_low[2] == "pml": (i_block, j_block, k_block) = (1, 0, 0) for n in range(self.N_pml_low[1]): - self.blocks_mat[i_block, j_block, k_block].sigma_y[:, -(n + 1), :] = sigma_m_low_y * ( - n / (self.N_pml_low[1])) ** self.alpha_pml - self.blocks_mat[i_block, j_block, k_block].sigma_star_y[:, -(n + 1), :] = sigma_m_low_y * ( - n / (self.N_pml_low[1])) ** self.alpha_pml*Z_0_2 + self.blocks_mat[i_block, j_block, k_block].sigma_y[ + :, -(n + 1), : + ] = sigma_m_low_y * (n / (self.N_pml_low[1])) ** self.alpha_pml + self.blocks_mat[i_block, j_block, k_block].sigma_star_y[ + :, -(n + 1), : + ] = ( + sigma_m_low_y + * (n / (self.N_pml_low[1])) ** self.alpha_pml + * Z_0_2 + ) for n in range((self.N_pml_low[2])): - self.blocks_mat[i_block, j_block, k_block].sigma_z[:, :, -(n + 1)] = sigma_m_low_z * ( - n / (self.N_pml_low[2])) ** self.alpha_pml - self.blocks_mat[i_block, j_block, k_block].sigma_star_z[:, :, -(n + 1)] = sigma_m_low_z * ( - n / (self.N_pml_low[2])) ** self.alpha_pml*Z_0_2 - if self.bc_high[2] is 'pml': + self.blocks_mat[i_block, j_block, k_block].sigma_z[ + :, :, -(n + 1) + ] = sigma_m_low_z * (n / (self.N_pml_low[2])) ** self.alpha_pml + self.blocks_mat[i_block, j_block, k_block].sigma_star_z[ + :, :, -(n + 1) + ] = ( + sigma_m_low_z + * (n / (self.N_pml_low[2])) ** self.alpha_pml + * Z_0_2 + ) + if self.bc_high[2] == "pml": (i_block, j_block, k_block) = (1, 0, 2) for n in range(self.N_pml_low[1]): - self.blocks_mat[i_block, j_block, k_block].sigma_y[:, -(n + 1), :] = sigma_m_low_y * ( - n / (self.N_pml_low[1])) ** self.alpha_pml - self.blocks_mat[i_block, j_block, k_block].sigma_star_y[:, -(n + 1), :] = sigma_m_low_y * ( - n / (self.N_pml_low[1])) ** self.alpha_pml*Z_0_2 + self.blocks_mat[i_block, j_block, k_block].sigma_y[ + :, -(n + 1), : + ] = sigma_m_low_y * (n / (self.N_pml_low[1])) ** self.alpha_pml + self.blocks_mat[i_block, j_block, k_block].sigma_star_y[ + :, -(n + 1), : + ] = ( + sigma_m_low_y + * (n / (self.N_pml_low[1])) ** self.alpha_pml + * Z_0_2 + ) for n in range((self.N_pml_high[2])): - self.blocks_mat[i_block, j_block, k_block].sigma_z[:, :, n] = sigma_m_high_z * ( - n / (self.N_pml_high[2])) ** self.alpha_pml - self.blocks_mat[i_block, j_block, k_block].sigma_star_z[:, :, n] = sigma_m_high_z * ( - n / (self.N_pml_high[2])) ** self.alpha_pml*Z_0_2 - - if self.bc_high[1] is 'pml': + self.blocks_mat[i_block, j_block, k_block].sigma_z[:, :, n] = ( + sigma_m_high_z * (n / (self.N_pml_high[2])) ** self.alpha_pml + ) + self.blocks_mat[i_block, j_block, k_block].sigma_star_z[:, :, n] = ( + sigma_m_high_z + * (n / (self.N_pml_high[2])) ** self.alpha_pml + * Z_0_2 + ) + + if self.bc_high[1] == "pml": (i_block, j_block, k_block) = (1, 2, 1) for n in range(self.N_pml_high[1]): - self.blocks_mat[i_block, j_block, k_block].sigma_y[:, n, :] = sigma_m_high_y * ( - n / (self.N_pml_high[1])) ** self.alpha_pml - self.blocks_mat[i_block, j_block, k_block].sigma_star_y[:, n, :] = sigma_m_high_y * ( - n / (self.N_pml_high[1])) ** self.alpha_pml*Z_0_2 - if self.bc_low[2] is 'pml': + self.blocks_mat[i_block, j_block, k_block].sigma_y[:, n, :] = ( + sigma_m_high_y * (n / (self.N_pml_high[1])) ** self.alpha_pml + ) + self.blocks_mat[i_block, j_block, k_block].sigma_star_y[:, n, :] = ( + sigma_m_high_y + * (n / (self.N_pml_high[1])) ** self.alpha_pml + * Z_0_2 + ) + if self.bc_low[2] == "pml": (i_block, j_block, k_block) = (1, 2, 0) for n in range(self.N_pml_high[1]): - self.blocks_mat[i_block, j_block, k_block].sigma_y[:, n, :] = sigma_m_high_y * ( - n / (self.N_pml_high[1])) ** self.alpha_pml - self.blocks_mat[i_block, j_block, k_block].sigma_star_y[:, n, :] = sigma_m_high_y * ( - n / (self.N_pml_high[1])) ** self.alpha_pml*Z_0_2 + self.blocks_mat[i_block, j_block, k_block].sigma_y[:, n, :] = ( + sigma_m_high_y * (n / (self.N_pml_high[1])) ** self.alpha_pml + ) + self.blocks_mat[i_block, j_block, k_block].sigma_star_y[:, n, :] = ( + sigma_m_high_y + * (n / (self.N_pml_high[1])) ** self.alpha_pml + * Z_0_2 + ) for n in range((self.N_pml_low[2])): - self.blocks_mat[i_block, j_block, k_block].sigma_z[:, :, -(n + 1)] = sigma_m_low_z * ( - n / (self.N_pml_low[2])) ** self.alpha_pml - self.blocks_mat[i_block, j_block, k_block].sigma_star_z[:, :, -(n + 1)] = sigma_m_low_z * ( - n / (self.N_pml_low[2])) ** self.alpha_pml*Z_0_2 - if self.bc_high[2] is 'pml': + self.blocks_mat[i_block, j_block, k_block].sigma_z[ + :, :, -(n + 1) + ] = sigma_m_low_z * (n / (self.N_pml_low[2])) ** self.alpha_pml + self.blocks_mat[i_block, j_block, k_block].sigma_star_z[ + :, :, -(n + 1) + ] = ( + sigma_m_low_z + * (n / (self.N_pml_low[2])) ** self.alpha_pml + * Z_0_2 + ) + if self.bc_high[2] == "pml": (i_block, j_block, k_block) = (1, 2, 2) for n in range(self.N_pml_high[1]): - self.blocks_mat[i_block, j_block, k_block].sigma_y[:, n, :] = sigma_m_high_y * ( - n / (self.N_pml_high[1])) ** self.alpha_pml - self.blocks_mat[i_block, j_block, k_block].sigma_star_y[:, n, :] = sigma_m_high_y * ( - n / (self.N_pml_high[1])) ** self.alpha_pml*Z_0_2 + self.blocks_mat[i_block, j_block, k_block].sigma_y[:, n, :] = ( + sigma_m_high_y * (n / (self.N_pml_high[1])) ** self.alpha_pml + ) + self.blocks_mat[i_block, j_block, k_block].sigma_star_y[:, n, :] = ( + sigma_m_high_y + * (n / (self.N_pml_high[1])) ** self.alpha_pml + * Z_0_2 + ) for n in range((self.N_pml_high[2])): - self.blocks_mat[i_block, j_block, k_block].sigma_z[:, :, n] = sigma_m_high_z * ( - n / (self.N_pml_high[2])) ** self.alpha_pml - self.blocks_mat[i_block, j_block, k_block].sigma_star_z[:, :, n] = sigma_m_high_z * ( - n / (self.N_pml_high[2])) ** self.alpha_pml*Z_0_2 - - if self.bc_low[2] is 'pml': + self.blocks_mat[i_block, j_block, k_block].sigma_z[:, :, n] = ( + sigma_m_high_z * (n / (self.N_pml_high[2])) ** self.alpha_pml + ) + self.blocks_mat[i_block, j_block, k_block].sigma_star_z[:, :, n] = ( + sigma_m_high_z + * (n / (self.N_pml_high[2])) ** self.alpha_pml + * Z_0_2 + ) + + if self.bc_low[2] == "pml": (i_block, j_block, k_block) = (1, 1, 0) for n in range((self.N_pml_low[2])): - self.blocks_mat[i_block, j_block, k_block].sigma_z[:, :, -(n + 1)] = sigma_m_low_z * ( - n / (self.N_pml_low[2])) ** self.alpha_pml - self.blocks_mat[i_block, j_block, k_block].sigma_star_z[:, :, -(n + 1)] = sigma_m_low_z * ( - n / (self.N_pml_low[2])) ** self.alpha_pml*Z_0_2 - - if self.bc_high[2] is 'pml': + self.blocks_mat[i_block, j_block, k_block].sigma_z[:, :, -(n + 1)] = ( + sigma_m_low_z * (n / (self.N_pml_low[2])) ** self.alpha_pml + ) + self.blocks_mat[i_block, j_block, k_block].sigma_star_z[ + :, :, -(n + 1) + ] = sigma_m_low_z * (n / (self.N_pml_low[2])) ** self.alpha_pml * Z_0_2 + + if self.bc_high[2] == "pml": (i_block, j_block, k_block) = (1, 1, 2) for n in range((self.N_pml_high[2])): - self.blocks_mat[i_block, j_block, k_block].sigma_z[:, :, n] = sigma_m_high_z * ( - n / (self.N_pml_high[2])) ** self.alpha_pml - self.blocks_mat[i_block, j_block, k_block].sigma_star_z[:, :, n] = sigma_m_high_z * ( - n / (self.N_pml_high[2])) ** self.alpha_pml*Z_0_2 - - #for i_block in range(3): + self.blocks_mat[i_block, j_block, k_block].sigma_z[:, :, n] = ( + sigma_m_high_z * (n / (self.N_pml_high[2])) ** self.alpha_pml + ) + self.blocks_mat[i_block, j_block, k_block].sigma_star_z[:, :, n] = ( + sigma_m_high_z + * (n / (self.N_pml_high[2])) ** self.alpha_pml + * Z_0_2 + ) + + # for i_block in range(3): # for j_block in range(3): # for k_block in range(3): # block = self.blocks_mat[i_block, j_block, k_block] @@ -735,154 +1303,292 @@ def update_e_boundary(self): if self.blocks_mat[0, 1, 1] is not None: for jj in range(self.Ny): for kk in range(1, self.Nz): - Ey[0, jj, kk] = (Ey[0, jj, kk] - self.C3 * self.Jy[0, jj, kk] + - self.C8 * (Hx[0, jj, kk] - Hx[0, jj, kk - 1]) - - self.C5 * (Hz[0, jj, kk] - self.blocks_mat[0, 1, 1].Hz[-1, jj, kk])) + Ey[0, jj, kk] = ( + Ey[0, jj, kk] + - self.C3 * self.Jy[0, jj, kk] + + self.C8 * (Hx[0, jj, kk] - Hx[0, jj, kk - 1]) + - self.C5 + * (Hz[0, jj, kk] - self.blocks_mat[0, 1, 1].Hz[-1, jj, kk]) + ) for jj in range(1, self.Ny): for kk in range(self.Nz): - Ez[0, jj, kk] = (Ez[0, jj, kk] - self.C3 * self.Jz[0, jj, kk] + - self.C5 * (Hy[0, jj, kk] - self.blocks_mat[0, 1, 1].Hy[-1, jj, kk]) - - self.C4 * (Hx[0, jj, kk] - Hx[0, jj - 1, kk])) + Ez[0, jj, kk] = ( + Ez[0, jj, kk] + - self.C3 * self.Jz[0, jj, kk] + + self.C5 + * (Hy[0, jj, kk] - self.blocks_mat[0, 1, 1].Hy[-1, jj, kk]) + - self.C4 * (Hx[0, jj, kk] - Hx[0, jj - 1, kk]) + ) if self.blocks_mat[1, 0, 1] is not None: for ii in range(self.Nx): for kk in range(1, self.Nz): - Ex[ii, 0, kk] = (Ex[ii, 0, kk] - self.C3 * self.Jx[ii, 0, kk] + - self.C4 * (Hz[ii, 0, kk] - self.blocks_mat[1, 0, 1].Hz[ii, -1, kk]) - - self.C8 * (Hy[ii, 0, kk] - Hy[ii, 0, kk - 1])) + Ex[ii, 0, kk] = ( + Ex[ii, 0, kk] + - self.C3 * self.Jx[ii, 0, kk] + + self.C4 + * (Hz[ii, 0, kk] - self.blocks_mat[1, 0, 1].Hz[ii, -1, kk]) + - self.C8 * (Hy[ii, 0, kk] - Hy[ii, 0, kk - 1]) + ) for ii in range(1, self.Nx): for kk in range(self.Nz): - Ez[ii, 0, kk] = (Ez[ii, 0, kk] - self.C3 * self.Jz[ii, 0, kk] + - self.C5 * (Hy[ii, 0, kk] - Hy[ii - 1, 0, kk]) - - self.C4 * (Hx[ii, 0, kk] - self.blocks_mat[1, 0, 1].Hx[ii, -1, kk])) + Ez[ii, 0, kk] = ( + Ez[ii, 0, kk] + - self.C3 * self.Jz[ii, 0, kk] + + self.C5 * (Hy[ii, 0, kk] - Hy[ii - 1, 0, kk]) + - self.C4 + * (Hx[ii, 0, kk] - self.blocks_mat[1, 0, 1].Hx[ii, -1, kk]) + ) if self.blocks_mat[1, 1, 0] is not None: for ii in range(self.Nx): for jj in range(1, self.Ny): - Ex[ii, jj, 0] = (Ex[ii, jj, 0] - self.C3 * self.Jx[ii, jj, 0] + - self.C4 * (Hz[ii, jj, 0] - Hz[ii, jj - 1, 0]) - - self.C8 * (Hy[ii, jj, 0] - self.blocks_mat[1, 1, 0].Hy[ii, jj, -1])) + Ex[ii, jj, 0] = ( + Ex[ii, jj, 0] + - self.C3 * self.Jx[ii, jj, 0] + + self.C4 * (Hz[ii, jj, 0] - Hz[ii, jj - 1, 0]) + - self.C8 + * (Hy[ii, jj, 0] - self.blocks_mat[1, 1, 0].Hy[ii, jj, -1]) + ) for ii in range(1, self.Nx): for jj in range(self.Ny): - Ey[ii, jj, 0] = (Ey[ii, jj, 0] - self.C3 * self.Jy[ii, jj, 0] + - self.C8 * (Hx[ii, jj, 0] - self.blocks_mat[1, 1, 0].Hx[ii, jj, -1]) - - self.C5 * (Hz[ii, jj, 0] - Hz[ii - 1, jj, 0])) + Ey[ii, jj, 0] = ( + Ey[ii, jj, 0] + - self.C3 * self.Jy[ii, jj, 0] + + self.C8 + * (Hx[ii, jj, 0] - self.blocks_mat[1, 1, 0].Hx[ii, jj, -1]) + - self.C5 * (Hz[ii, jj, 0] - Hz[ii - 1, jj, 0]) + ) # Update E on "upper" faces if self.blocks_mat[2, 1, 1] is not None: for jj in range(self.Ny): for kk in range(1, self.Nz): - Ey[Nx, jj, kk] = (Ey[Nx, jj, kk] - self.C3 * self.Jy[Nx, jj, kk] + - self.C8 * (Hx[Nx, jj, kk] - Hx[Nx, jj, kk - 1]) - - self.C5 * (self.blocks_mat[2, 1, 1].Hz[0, jj, kk] - Hz[Nx - 1, jj, kk])) + Ey[Nx, jj, kk] = ( + Ey[Nx, jj, kk] + - self.C3 * self.Jy[Nx, jj, kk] + + self.C8 * (Hx[Nx, jj, kk] - Hx[Nx, jj, kk - 1]) + - self.C5 + * (self.blocks_mat[2, 1, 1].Hz[0, jj, kk] - Hz[Nx - 1, jj, kk]) + ) for jj in range(1, self.Ny): for kk in range(self.Nz): - Ez[Nx, jj, kk] = (Ez[Nx, jj, kk] - self.C3 * self.Jz[Nx, jj, kk] + - self.C5 * (self.blocks_mat[2, 1, 1].Hy[0, jj, kk] - Hy[Nx - 1, jj, kk]) - - self.C4 * (Hx[Nx, jj, kk] - Hx[Nx, jj - 1, kk])) + Ez[Nx, jj, kk] = ( + Ez[Nx, jj, kk] + - self.C3 * self.Jz[Nx, jj, kk] + + self.C5 + * (self.blocks_mat[2, 1, 1].Hy[0, jj, kk] - Hy[Nx - 1, jj, kk]) + - self.C4 * (Hx[Nx, jj, kk] - Hx[Nx, jj - 1, kk]) + ) if self.blocks_mat[1, 2, 1] is not None: for ii in range(self.Nx): for kk in range(1, self.Nz): - Ex[ii, Ny, kk] = (Ex[ii, Ny, kk] - self.C3 * self.Jx[ii, Ny, kk] + - self.C4 * (self.blocks_mat[1, 2, 1].Hz[ii, 0, kk] - Hz[ii, Ny - 1, kk]) - - self.C8 * (Hy[ii, Ny, kk] - Hy[ii, Ny, kk - 1])) + Ex[ii, Ny, kk] = ( + Ex[ii, Ny, kk] + - self.C3 * self.Jx[ii, Ny, kk] + + self.C4 + * (self.blocks_mat[1, 2, 1].Hz[ii, 0, kk] - Hz[ii, Ny - 1, kk]) + - self.C8 * (Hy[ii, Ny, kk] - Hy[ii, Ny, kk - 1]) + ) for ii in range(1, self.Nx): for kk in range(self.Nz): - Ez[ii, Ny, kk] = (Ez[ii, Ny, kk] - self.C3 * self.Jz[ii, Ny, kk] + - self.C5 * (Hy[ii, Ny, kk] - Hy[ii - 1, Ny, kk]) - - self.C4 * (self.blocks_mat[1, 2, 1].Hx[ii, 0, kk] - Hx[ii, Ny - 1, kk])) + Ez[ii, Ny, kk] = ( + Ez[ii, Ny, kk] + - self.C3 * self.Jz[ii, Ny, kk] + + self.C5 * (Hy[ii, Ny, kk] - Hy[ii - 1, Ny, kk]) + - self.C4 + * (self.blocks_mat[1, 2, 1].Hx[ii, 0, kk] - Hx[ii, Ny - 1, kk]) + ) if self.blocks_mat[1, 1, 2] is not None: for ii in range(self.Nx): for jj in range(1, self.Ny): - Ex[ii, jj, Nz] = (Ex[ii, jj, Nz] - self.C3 * self.Jx[ii, jj, Nz] + - self.C4 * (Hz[ii, jj, Nz] - Hz[ii, jj - 1, Nz]) - - self.C8 * (self.blocks_mat[1, 1, 2].Hy[ii, jj, 0] - Hy[ii, jj, Nz - 1])) + Ex[ii, jj, Nz] = ( + Ex[ii, jj, Nz] + - self.C3 * self.Jx[ii, jj, Nz] + + self.C4 * (Hz[ii, jj, Nz] - Hz[ii, jj - 1, Nz]) + - self.C8 + * (self.blocks_mat[1, 1, 2].Hy[ii, jj, 0] - Hy[ii, jj, Nz - 1]) + ) for ii in range(1, self.Nx): for jj in range(self.Ny): - Ey[ii, jj, Nz] = (Ey[ii, jj, Nz] - self.C3 * self.Jy[ii, jj, Nz] + - self.C8 * (self.blocks_mat[1, 1, 2].Hx[ii, jj, 0] - Hx[ii, jj, Nz - 1]) - - self.C5 * (Hz[ii, jj, Nz] - Hz[ii - 1, jj, Nz])) + Ey[ii, jj, Nz] = ( + Ey[ii, jj, Nz] + - self.C3 * self.Jy[ii, jj, Nz] + + self.C8 + * (self.blocks_mat[1, 1, 2].Hx[ii, jj, 0] - Hx[ii, jj, Nz - 1]) + - self.C5 * (Hz[ii, jj, Nz] - Hz[ii - 1, jj, Nz]) + ) # Update Ez on edges (xy) - if self.blocks_mat[0, 1, 1] is not None and self.blocks_mat[1, 0, 1] is not None: + if ( + self.blocks_mat[0, 1, 1] is not None + and self.blocks_mat[1, 0, 1] is not None + ): for kk in range(Nz): - Ez[0, 0, kk] = (Ez[0, 0, kk] - self.C3 * self.Jz[0, 0, kk] + - self.C5 * (Hy[0, 0, kk] - self.blocks_mat[0, 1, 1].Hy[-1, 0, kk]) - - self.C4 * (Hx[0, 0, kk] - self.blocks_mat[1, 0, 1].Hx[0, -1, kk])) - if self.blocks_mat[0, 1, 1] is not None and self.blocks_mat[1, 2, 1] is not None: + Ez[0, 0, kk] = ( + Ez[0, 0, kk] + - self.C3 * self.Jz[0, 0, kk] + + self.C5 * (Hy[0, 0, kk] - self.blocks_mat[0, 1, 1].Hy[-1, 0, kk]) + - self.C4 * (Hx[0, 0, kk] - self.blocks_mat[1, 0, 1].Hx[0, -1, kk]) + ) + if ( + self.blocks_mat[0, 1, 1] is not None + and self.blocks_mat[1, 2, 1] is not None + ): for kk in range(Nz): - Ez[0, Ny, kk] = (Ez[0, Ny, kk] - self.C3 * self.Jz[0, Ny, kk] + - self.C5 * (Hy[0, Ny, kk] - self.blocks_mat[0, 1, 1].Hy[-1, Ny, kk]) - - self.C4 * (self.blocks_mat[1, 2, 1].Hx[0, 0, kk] - Hx[0, Ny - 1, kk])) - if self.blocks_mat[2, 1, 1] is not None and self.blocks_mat[1, 0, 1] is not None: + Ez[0, Ny, kk] = ( + Ez[0, Ny, kk] + - self.C3 * self.Jz[0, Ny, kk] + + self.C5 + * (Hy[0, Ny, kk] - self.blocks_mat[0, 1, 1].Hy[-1, Ny, kk]) + - self.C4 + * (self.blocks_mat[1, 2, 1].Hx[0, 0, kk] - Hx[0, Ny - 1, kk]) + ) + if ( + self.blocks_mat[2, 1, 1] is not None + and self.blocks_mat[1, 0, 1] is not None + ): for kk in range(Nz): - Ez[Nx, 0, kk] = (Ez[Nx, 0, kk] - self.C3 * self.Jz[Nx, 0, kk] + - self.C5 * (self.blocks_mat[2, 1, 1].Hy[0, 0, kk] - Hy[Nx - 1, 0, kk]) - - self.C4 * (Hx[Nx, 0, kk] - self.blocks_mat[1, 0, 1].Hx[Nx, -1, kk])) - if self.blocks_mat[2, 1, 1] is not None and self.blocks_mat[1, 2, 1] is not None: + Ez[Nx, 0, kk] = ( + Ez[Nx, 0, kk] + - self.C3 * self.Jz[Nx, 0, kk] + + self.C5 + * (self.blocks_mat[2, 1, 1].Hy[0, 0, kk] - Hy[Nx - 1, 0, kk]) + - self.C4 + * (Hx[Nx, 0, kk] - self.blocks_mat[1, 0, 1].Hx[Nx, -1, kk]) + ) + if ( + self.blocks_mat[2, 1, 1] is not None + and self.blocks_mat[1, 2, 1] is not None + ): for kk in range(Nz): - Ez[Nx, Ny, kk] = (Ez[Nx, Ny, kk] - self.C3 * self.Jz[Nx, Ny, kk] + - self.C5 * (self.blocks_mat[2, 1, 1].Hy[0, Ny, kk] - Hy[Nx - 1, Ny, kk]) - - self.C4 * (self.blocks_mat[1, 2, 1].Hx[Nx, 0, kk] - Hx[Nx, Ny - 1, kk])) + Ez[Nx, Ny, kk] = ( + Ez[Nx, Ny, kk] + - self.C3 * self.Jz[Nx, Ny, kk] + + self.C5 + * (self.blocks_mat[2, 1, 1].Hy[0, Ny, kk] - Hy[Nx - 1, Ny, kk]) + - self.C4 + * (self.blocks_mat[1, 2, 1].Hx[Nx, 0, kk] - Hx[Nx, Ny - 1, kk]) + ) # Update Ex on edges (yz) - if self.blocks_mat[1, 0, 1] is not None and self.blocks_mat[1, 1, 0] is not None: + if ( + self.blocks_mat[1, 0, 1] is not None + and self.blocks_mat[1, 1, 0] is not None + ): for ii in range(Nx): - Ex[ii, 0, 0] = (Ex[ii, 0, 0] - self.C3 * self.Jx[ii, 0, 0] + - self.C4 * (Hz[ii, 0, 0] - self.blocks_mat[1, 0, 1].Hz[ii, -1, 0]) - - self.C8 * (Hy[ii, 0, 0] - self.blocks_mat[1, 1, 0].Hy[ii, 0, -1])) - if self.blocks_mat[1, 0, 1] is not None and self.blocks_mat[1, 1, 2] is not None: + Ex[ii, 0, 0] = ( + Ex[ii, 0, 0] + - self.C3 * self.Jx[ii, 0, 0] + + self.C4 * (Hz[ii, 0, 0] - self.blocks_mat[1, 0, 1].Hz[ii, -1, 0]) + - self.C8 * (Hy[ii, 0, 0] - self.blocks_mat[1, 1, 0].Hy[ii, 0, -1]) + ) + if ( + self.blocks_mat[1, 0, 1] is not None + and self.blocks_mat[1, 1, 2] is not None + ): for ii in range(Nx): - Ex[ii, 0, Nz] = (Ex[ii, 0, Nz] - self.C3 * self.Jx[ii, 0, Nz] + - self.C4 * (Hz[ii, 0, Nz] - self.blocks_mat[1, 0, 1].Hz[ii, -1, Nz]) - - self.C8 * (self.blocks_mat[1, 1, 2].Hy[ii, 0, 0] - Hy[ii, 0, Nz - 1])) - if self.blocks_mat[1, 2, 1] is not None and self.blocks_mat[1, 1, 0] is not None: + Ex[ii, 0, Nz] = ( + Ex[ii, 0, Nz] + - self.C3 * self.Jx[ii, 0, Nz] + + self.C4 + * (Hz[ii, 0, Nz] - self.blocks_mat[1, 0, 1].Hz[ii, -1, Nz]) + - self.C8 + * (self.blocks_mat[1, 1, 2].Hy[ii, 0, 0] - Hy[ii, 0, Nz - 1]) + ) + if ( + self.blocks_mat[1, 2, 1] is not None + and self.blocks_mat[1, 1, 0] is not None + ): for ii in range(Nx): - Ex[ii, Ny, 0] = (Ex[ii, Ny, 0] - self.C3 * self.Jx[ii, Ny, 0] + - self.C4 * (self.blocks_mat[1, 2, 1].Hz[ii, 0, 0] - Hz[ii, Ny - 1, 0]) - - self.C8 * (Hy[ii, Ny, 0] - self.blocks_mat[1, 1, 0].Hy[ii, Ny, -1])) - if self.blocks_mat[1, 2, 1] is not None and self.blocks_mat[1, 1, 2] is not None: + Ex[ii, Ny, 0] = ( + Ex[ii, Ny, 0] + - self.C3 * self.Jx[ii, Ny, 0] + + self.C4 + * (self.blocks_mat[1, 2, 1].Hz[ii, 0, 0] - Hz[ii, Ny - 1, 0]) + - self.C8 + * (Hy[ii, Ny, 0] - self.blocks_mat[1, 1, 0].Hy[ii, Ny, -1]) + ) + if ( + self.blocks_mat[1, 2, 1] is not None + and self.blocks_mat[1, 1, 2] is not None + ): for ii in range(Nx): - Ex[ii, Ny, Nz] = (Ex[ii, Ny, Nz] - self.C3 * self.Jx[ii, Ny, Nz] + - self.C4 * (self.blocks_mat[1, 2, 1].Hz[ii, 0, Nz] - Hz[ii, Ny - 1, Nz]) - - self.C8 * (self.blocks_mat[1, 1, 2].Hy[ii, Ny, 0] - Hy[ii, Ny, Nz - 1])) + Ex[ii, Ny, Nz] = ( + Ex[ii, Ny, Nz] + - self.C3 * self.Jx[ii, Ny, Nz] + + self.C4 + * (self.blocks_mat[1, 2, 1].Hz[ii, 0, Nz] - Hz[ii, Ny - 1, Nz]) + - self.C8 + * (self.blocks_mat[1, 1, 2].Hy[ii, Ny, 0] - Hy[ii, Ny, Nz - 1]) + ) # Update Ey on edges (xz) - if self.blocks_mat[0, 1, 1] is not None and self.blocks_mat[1, 1, 0] is not None: + if ( + self.blocks_mat[0, 1, 1] is not None + and self.blocks_mat[1, 1, 0] is not None + ): for jj in range(Ny): - Ey[0, jj, 0] = (Ey[0, jj, 0] - self.C3 * self.Jy[0, jj, 0] + - self.C8 * (Hx[0, jj, 0] - self.blocks_mat[1, 1, 0].Hx[0, jj, -1]) - - self.C5 * (Hz[0, jj, 0] - self.blocks_mat[0, 1, 1].Hz[-1, jj, 0])) - if self.blocks_mat[0, 1, 1] is not None and self.blocks_mat[1, 1, 2] is not None: + Ey[0, jj, 0] = ( + Ey[0, jj, 0] + - self.C3 * self.Jy[0, jj, 0] + + self.C8 * (Hx[0, jj, 0] - self.blocks_mat[1, 1, 0].Hx[0, jj, -1]) + - self.C5 * (Hz[0, jj, 0] - self.blocks_mat[0, 1, 1].Hz[-1, jj, 0]) + ) + if ( + self.blocks_mat[0, 1, 1] is not None + and self.blocks_mat[1, 1, 2] is not None + ): for jj in range(Ny): - Ey[0, jj, Nz] = (Ey[0, jj, Nz] - self.C3 * self.Jy[0, jj, Nz] + - self.C8 * (self.blocks_mat[1, 1, 2].Hx[0, jj, 0] - Hx[0, jj, Nz - 1]) - - self.C5 * (Hz[0, jj, Nz] - self.blocks_mat[0, 1, 1].Hz[-1, jj, Nz])) - if self.blocks_mat[2, 1, 1] is not None and self.blocks_mat[1, 1, 0] is not None: + Ey[0, jj, Nz] = ( + Ey[0, jj, Nz] + - self.C3 * self.Jy[0, jj, Nz] + + self.C8 + * (self.blocks_mat[1, 1, 2].Hx[0, jj, 0] - Hx[0, jj, Nz - 1]) + - self.C5 + * (Hz[0, jj, Nz] - self.blocks_mat[0, 1, 1].Hz[-1, jj, Nz]) + ) + if ( + self.blocks_mat[2, 1, 1] is not None + and self.blocks_mat[1, 1, 0] is not None + ): for jj in range(Ny): - Ey[Nx, jj, 0] = (Ey[Nx, jj, 0] - self.C3 * self.Jy[Nx, jj, 0] + - self.C8 * (Hx[Nx, jj, 0] - self.blocks_mat[1, 1, 0].Hx[Nx, jj, -1]) - - self.C5 * (self.blocks_mat[2, 1, 1].Hz[0, jj, 0] - Hz[Nx - 1, jj, 0])) - if self.blocks_mat[2, 1, 1] is not None and self.blocks_mat[1, 1, 2] is not None: + Ey[Nx, jj, 0] = ( + Ey[Nx, jj, 0] + - self.C3 * self.Jy[Nx, jj, 0] + + self.C8 + * (Hx[Nx, jj, 0] - self.blocks_mat[1, 1, 0].Hx[Nx, jj, -1]) + - self.C5 + * (self.blocks_mat[2, 1, 1].Hz[0, jj, 0] - Hz[Nx - 1, jj, 0]) + ) + if ( + self.blocks_mat[2, 1, 1] is not None + and self.blocks_mat[1, 1, 2] is not None + ): for jj in range(Ny): - Ey[Nx, jj, Nz] = (Ey[Nx, jj, Nz] - self.C3 * self.Jy[Nx, jj, Nz] + - self.C8 * (self.blocks_mat[1, 1, 2].Hx[Nx, jj, 0] - Hx[Nx, jj, Nz - 1]) - - self.C5 * (self.blocks_mat[2, 1, 1].Hz[0, jj, Nz] - Hz[Nx - 1, jj, Nz])) + Ey[Nx, jj, Nz] = ( + Ey[Nx, jj, Nz] + - self.C3 * self.Jy[Nx, jj, Nz] + + self.C8 + * (self.blocks_mat[1, 1, 2].Hx[Nx, jj, 0] - Hx[Nx, jj, Nz - 1]) + - self.C5 + * (self.blocks_mat[2, 1, 1].Hz[0, jj, Nz] - Hz[Nx - 1, jj, Nz]) + ) def gauss(self, t): tau = 10 * self.dt if t < 6 * tau: - return 100 * np.exp(-(t - 3 * tau) ** 2 / tau ** 2) + return 100 * np.exp(-((t - 3 * tau) ** 2) / tau**2) else: - return 0. + return 0.0 def one_step(self): - if self.sol_type == 'ECT': + if self.sol_type == "ECT": self.one_step_ect() - if self.sol_type == 'FDTD': + if self.sol_type == "FDTD": self.one_step_fdtd() - if self.sol_type == 'DM': + if self.sol_type == "DM": self.one_step_dm() self.time += self.dt @@ -901,17 +1607,49 @@ def one_step_ect(self): block.sum_e_fields() def one_step_fdtd(self): - self.advance_h_fdtd(self.grid.Sxy, self.grid.Syz, self.grid.Szx, self.Ex, self.Ey, - self.Ez, self.Hx, self.Hy, self.Hz, self.Nx, self.Ny, self.Nz, - self.C1, self.C2, self.C7) + self.advance_h_fdtd( + self.grid.Sxy, + self.grid.Syz, + self.grid.Szx, + self.Ex, + self.Ey, + self.Ez, + self.Hx, + self.Hy, + self.Hz, + self.Nx, + self.Ny, + self.Nz, + self.C1, + self.C2, + self.C7, + ) for block in self.blocks: block.advance_h_fdtd() block.sum_h_fields() - self.advance_e_fdtd(self.grid.l_x, self.grid.l_y, self.grid.l_z, self.Ex, self.Ey, self.Ez, - self.Hx, self.Hy, self.Hz, self.Jx, self.Jy, self.Jz, self.Nx, self.Ny, - self.Nz, self.C3, self.C4, self.C5, self.C8) + self.advance_e_fdtd( + self.grid.l_x, + self.grid.l_y, + self.grid.l_z, + self.Ex, + self.Ey, + self.Ez, + self.Hx, + self.Hy, + self.Hz, + self.Jx, + self.Jy, + self.Jz, + self.Nx, + self.Ny, + self.Nz, + self.C3, + self.C4, + self.C5, + self.C8, + ) self.update_e_boundary() for block in self.blocks: block.advance_e_fdtd() @@ -921,59 +1659,74 @@ def one_step_fdtd(self): @staticmethod @jit(nopython=True) def advance_h_fdtd(Sxy, Syz, Szx, Ex, Ey, Ez, Hx, Hy, Hz, Nx, Ny, Nz, C1, C2, C7): - # Compute cell voltages for ii in range(Nx + 1): for jj in range(Ny): for kk in range(Nz): if Syz[ii, jj, kk] > 0: - Hx[ii, jj, kk] = (Hx[ii, jj, kk] - - C2 * (Ez[ii, jj + 1, kk] - Ez[ii, jj, kk]) + - C7 * (Ey[ii, jj, kk + 1] - Ey[ii, jj, kk])) + Hx[ii, jj, kk] = ( + Hx[ii, jj, kk] + - C2 * (Ez[ii, jj + 1, kk] - Ez[ii, jj, kk]) + + C7 * (Ey[ii, jj, kk + 1] - Ey[ii, jj, kk]) + ) for ii in range(Nx): for jj in range(Ny + 1): for kk in range(Nz): if Szx[ii, jj, kk] > 0: - Hy[ii, jj, kk] = (Hy[ii, jj, kk] - - C7 * (Ex[ii, jj, kk + 1] - Ex[ii, jj, kk]) + - C1 * (Ez[ii + 1, jj, kk] - Ez[ii, jj, kk])) + Hy[ii, jj, kk] = ( + Hy[ii, jj, kk] + - C7 * (Ex[ii, jj, kk + 1] - Ex[ii, jj, kk]) + + C1 * (Ez[ii + 1, jj, kk] - Ez[ii, jj, kk]) + ) for ii in range(Nx): for jj in range(Ny): for kk in range(Nz + 1): if Sxy[ii, jj, kk] > 0: - Hz[ii, jj, kk] = (Hz[ii, jj, kk] - - C1 * (Ey[ii + 1, jj, kk] - Ey[ii, jj, kk]) + - C2 * (Ex[ii, jj + 1, kk] - Ex[ii, jj, kk])) + Hz[ii, jj, kk] = ( + Hz[ii, jj, kk] + - C1 * (Ey[ii + 1, jj, kk] - Ey[ii, jj, kk]) + + C2 * (Ex[ii, jj + 1, kk] - Ex[ii, jj, kk]) + ) @staticmethod @jit(nopython=True) - def advance_e_fdtd(l_x, l_y, l_z, Ex, Ey, Ez, Hx, Hy, Hz, Jx, Jy, Jz, Nx, Ny, Nz, C3, C4, C5, C8): - + def advance_e_fdtd( + l_x, l_y, l_z, Ex, Ey, Ez, Hx, Hy, Hz, Jx, Jy, Jz, Nx, Ny, Nz, C3, C4, C5, C8 + ): for ii in range(Nx): for jj in range(1, Ny): for kk in range(1, Nz): if l_x[ii, jj, kk] > 0: - Ex[ii, jj, kk] = (Ex[ii, jj, kk] - C3 * Jx[ii, jj, kk] + - C4 * (Hz[ii, jj, kk] - Hz[ii, jj - 1, kk]) - - C8 * (Hy[ii, jj, kk] - Hy[ii, jj, kk - 1])) + Ex[ii, jj, kk] = ( + Ex[ii, jj, kk] + - C3 * Jx[ii, jj, kk] + + C4 * (Hz[ii, jj, kk] - Hz[ii, jj - 1, kk]) + - C8 * (Hy[ii, jj, kk] - Hy[ii, jj, kk - 1]) + ) for ii in range(1, Nx): for jj in range(Ny): for kk in range(1, Nz): if l_y[ii, jj, kk] > 0: - Ey[ii, jj, kk] = (Ey[ii, jj, kk] - C3 * Jy[ii, jj, kk] + - C8 * (Hx[ii, jj, kk] - Hx[ii, jj, kk - 1]) - - C5 * (Hz[ii, jj, kk] - Hz[ii - 1, jj, kk])) + Ey[ii, jj, kk] = ( + Ey[ii, jj, kk] + - C3 * Jy[ii, jj, kk] + + C8 * (Hx[ii, jj, kk] - Hx[ii, jj, kk - 1]) + - C5 * (Hz[ii, jj, kk] - Hz[ii - 1, jj, kk]) + ) for ii in range(1, Nx): for jj in range(1, Ny): for kk in range(Nz): if l_z[ii, jj, kk] > 0: - Ez[ii, jj, kk] = (Ez[ii, jj, kk] - C3 * Jz[ii, jj, kk] + - C5 * (Hy[ii, jj, kk] - Hy[ii - 1, jj, kk]) - - C4 * (Hx[ii, jj, kk] - Hx[ii, jj - 1, kk])) + Ez[ii, jj, kk] = ( + Ez[ii, jj, kk] + - C3 * Jz[ii, jj, kk] + + C5 * (Hy[ii, jj, kk] - Hy[ii - 1, jj, kk]) + - C4 * (Hx[ii, jj, kk] - Hx[ii, jj - 1, kk]) + ) def one_step_dm(self): self.compute_v_and_rho() @@ -982,62 +1735,97 @@ def one_step_dm(self): for j in range(self.Ny): for k in range(self.Nz + 1): if self.grid.flag_int_cell_xy[i, j, k]: - self.Hz[i, j, k] = (self.Hz[i, j, k] - - self.dt / (mu_0 * self.grid.Sxy[i, j, k]) * - self.Vxy[i, j, k]) + self.Hz[i, j, k] = ( + self.Hz[i, j, k] + - self.dt + / (mu_0 * self.grid.Sxy[i, j, k]) + * self.Vxy[i, j, k] + ) for i in range(self.Nx + 1): for j in range(self.Ny): for k in range(self.Nz): if self.grid.flag_int_cell_yz[i, j, k]: - self.Hx[i, j, k] = (self.Hx[i, j, k] - - self.dt / (mu_0 * self.grid.Syz[i, j, k]) * - self.Vyz[i, j, k]) + self.Hx[i, j, k] = ( + self.Hx[i, j, k] + - self.dt + / (mu_0 * self.grid.Syz[i, j, k]) + * self.Vyz[i, j, k] + ) for i in range(self.Nx): for j in range(self.Ny + 1): for k in range(self.Nz): if self.grid.flag_int_cell_zx[i, j, k]: - self.Hy[i, j, k] = (self.Hy[i, j, k] - - self.dt / (mu_0 * self.grid.Szx[i, j, k]) * - self.Vzx[i, j, k]) + self.Hy[i, j, k] = ( + self.Hy[i, j, k] + - self.dt + / (mu_0 * self.grid.Szx[i, j, k]) + * self.Vzx[i, j, k] + ) self.advance_e_dm() def advance_h_ect(self, dt=None): - for ii in range(self.Nx + 1): - EMSolver2D.advance_h_ect(Nx=self.Ny, Ny=self.Nz, V_enl=self.Vyz_enl[ii, :, :], - rho=self.rho_yz[ii, :, :], Hz=self.Hx[ii, :, :], C1=self.CN, - flag_int_cell=self.grid.flag_int_cell_yz[ii, :, :], - flag_unst_cell=self.grid.flag_unst_cell_yz[ii, :, :], - flag_intr_cell=self.grid.flag_intr_cell_yz[ii,:,:], - S=self.grid.Syz[ii, :, :], - borrowing=self.grid.borrowing_yz[ii, :, :], - S_enl=self.grid.Syz_enl[ii, :, :], - S_red=self.grid.Syz_red[ii, :, :], dt=dt, comp='x', kk=ii) + EMSolver2D.advance_h_ect( + Nx=self.Ny, + Ny=self.Nz, + V_enl=self.Vyz_enl[ii, :, :], + rho=self.rho_yz[ii, :, :], + Hz=self.Hx[ii, :, :], + C1=self.CN, + flag_int_cell=self.grid.flag_int_cell_yz[ii, :, :], + flag_unst_cell=self.grid.flag_unst_cell_yz[ii, :, :], + flag_intr_cell=self.grid.flag_intr_cell_yz[ii, :, :], + S=self.grid.Syz[ii, :, :], + borrowing=self.grid.borrowing_yz[ii, :, :], + S_enl=self.grid.Syz_enl[ii, :, :], + S_red=self.grid.Syz_red[ii, :, :], + dt=dt, + comp="x", + kk=ii, + ) for jj in range(self.Ny + 1): - EMSolver2D.advance_h_ect(Nx=self.Nx, Ny=self.Nz, V_enl=self.Vzx_enl[:, jj, :], - rho=self.rho_zx[:, jj, :], Hz=self.Hy[:, jj, :], C1=self.CN, - flag_int_cell=self.grid.flag_int_cell_zx[:, jj, :], - flag_unst_cell=self.grid.flag_unst_cell_zx[:, jj, :], - flag_intr_cell=self.grid.flag_intr_cell_zx[:,jj,:], - S=self.grid.Szx[:, jj, :], - borrowing=self.grid.borrowing_zx[:, jj, :], - S_enl=self.grid.Szx_enl[:, jj, :], - S_red=self.grid.Szx_red[:, jj, :], dt=dt, comp='y', kk=jj) + EMSolver2D.advance_h_ect( + Nx=self.Nx, + Ny=self.Nz, + V_enl=self.Vzx_enl[:, jj, :], + rho=self.rho_zx[:, jj, :], + Hz=self.Hy[:, jj, :], + C1=self.CN, + flag_int_cell=self.grid.flag_int_cell_zx[:, jj, :], + flag_unst_cell=self.grid.flag_unst_cell_zx[:, jj, :], + flag_intr_cell=self.grid.flag_intr_cell_zx[:, jj, :], + S=self.grid.Szx[:, jj, :], + borrowing=self.grid.borrowing_zx[:, jj, :], + S_enl=self.grid.Szx_enl[:, jj, :], + S_red=self.grid.Szx_red[:, jj, :], + dt=dt, + comp="y", + kk=jj, + ) for kk in range(self.Nz + 1): - EMSolver2D.advance_h_ect(Nx=self.Nx, Ny=self.Ny, V_enl=self.Vxy_enl[:, :, kk], - rho=self.rho_xy[:, :, kk], Hz=self.Hz[:, :, kk], C1=self.CN, - flag_int_cell=self.grid.flag_int_cell_xy[:, :, kk], - flag_unst_cell=self.grid.flag_unst_cell_xy[:, :, kk], - flag_intr_cell=self.grid.flag_intr_cell_xy[:,:,kk], - S=self.grid.Sxy[:, :, kk], - borrowing=self.grid.borrowing_xy[:, :, kk], - S_enl=self.grid.Sxy_enl[:, :, kk], - S_red=self.grid.Sxy_red[:, :, kk], dt=dt, comp='z', kk=kk) + EMSolver2D.advance_h_ect( + Nx=self.Nx, + Ny=self.Ny, + V_enl=self.Vxy_enl[:, :, kk], + rho=self.rho_xy[:, :, kk], + Hz=self.Hz[:, :, kk], + C1=self.CN, + flag_int_cell=self.grid.flag_int_cell_xy[:, :, kk], + flag_unst_cell=self.grid.flag_unst_cell_xy[:, :, kk], + flag_intr_cell=self.grid.flag_intr_cell_xy[:, :, kk], + S=self.grid.Sxy[:, :, kk], + borrowing=self.grid.borrowing_xy[:, :, kk], + S_enl=self.grid.Sxy_enl[:, :, kk], + S_red=self.grid.Sxy_red[:, :, kk], + dt=dt, + comp="z", + kk=kk, + ) def compute_v_and_rho(self): l_x = self.grid.l_x @@ -1048,46 +1836,53 @@ def compute_v_and_rho(self): for jj in range(self.Ny): for kk in range(self.Nz + 1): if self.grid.flag_int_cell_xy[ii, jj, kk]: - self.Vxy[ii, jj, kk] = (self.Ex[ii, jj, kk] * l_x[ii, jj, kk] - - self.Ex[ii, jj + 1, kk] * l_x[ii, jj + 1, kk] + - self.Ey[ii + 1, jj, kk] * l_y[ii + 1, jj, kk] - - self.Ey[ii, jj, kk] * l_y[ii, jj, kk]) - - if self.sol_type != 'DM': - self.rho_xy[ii, jj, kk] = (self.Vxy[ii, jj, kk] / - self.grid.Sxy[ii, jj, kk]) - + self.Vxy[ii, jj, kk] = ( + self.Ex[ii, jj, kk] * l_x[ii, jj, kk] + - self.Ex[ii, jj + 1, kk] * l_x[ii, jj + 1, kk] + + self.Ey[ii + 1, jj, kk] * l_y[ii + 1, jj, kk] + - self.Ey[ii, jj, kk] * l_y[ii, jj, kk] + ) + + if self.sol_type != "DM": + self.rho_xy[ii, jj, kk] = ( + self.Vxy[ii, jj, kk] / self.grid.Sxy[ii, jj, kk] + ) for ii in range(self.Nx + 1): for jj in range(self.Ny): for kk in range(self.Nz): if self.grid.flag_int_cell_yz[ii, jj, kk]: - self.Vyz[ii, jj, kk] = (self.Ey[ii, jj, kk] * l_y[ii, jj, kk] - - self.Ey[ii, jj, kk + 1] * l_y[ii, jj, kk + 1] + - self.Ez[ii, jj + 1, kk] * l_z[ii, jj + 1, kk] - - self.Ez[ii, jj, kk] * l_z[ii, jj, kk]) - - if self.sol_type != 'DM': - self.rho_yz[ii, jj, kk] = (self.Vyz[ii, jj, kk] / - self.grid.Syz[ii, jj, kk]) - + self.Vyz[ii, jj, kk] = ( + self.Ey[ii, jj, kk] * l_y[ii, jj, kk] + - self.Ey[ii, jj, kk + 1] * l_y[ii, jj, kk + 1] + + self.Ez[ii, jj + 1, kk] * l_z[ii, jj + 1, kk] + - self.Ez[ii, jj, kk] * l_z[ii, jj, kk] + ) + + if self.sol_type != "DM": + self.rho_yz[ii, jj, kk] = ( + self.Vyz[ii, jj, kk] / self.grid.Syz[ii, jj, kk] + ) for ii in range(self.Nx): for jj in range(self.Ny + 1): for kk in range(self.Nz): if self.grid.flag_int_cell_zx[ii, jj, kk]: - self.Vzx[ii, jj, kk] = (self.Ez[ii, jj, kk] * l_z[ii, jj, kk] - - self.Ez[ii + 1, jj, kk] * l_z[ii + 1, jj, kk] + - self.Ex[ii, jj, kk + 1] * l_x[ii, jj, kk + 1] - - self.Ex[ii, jj, kk] * l_x[ii, jj, kk]) - - if self.sol_type != 'DM': - self.rho_zx[ii, jj, kk] = (self.Vzx[ii, jj, kk] / - self.grid.Szx[ii, jj, kk]) + self.Vzx[ii, jj, kk] = ( + self.Ez[ii, jj, kk] * l_z[ii, jj, kk] + - self.Ez[ii + 1, jj, kk] * l_z[ii + 1, jj, kk] + + self.Ex[ii, jj, kk + 1] * l_x[ii, jj, kk + 1] + - self.Ex[ii, jj, kk] * l_x[ii, jj, kk] + ) + + if self.sol_type != "DM": + self.rho_zx[ii, jj, kk] = ( + self.Vzx[ii, jj, kk] / self.grid.Szx[ii, jj, kk] + ) def advance_e_dm(self, dt=None): - - if dt==None: dt = self.dt + if dt is None: + dt = self.dt Ex = self.Ex Ey = self.Ey @@ -1096,31 +1891,40 @@ def advance_e_dm(self, dt=None): Hy = self.Hy Hz = self.Hz - C4 = dt / (self.dy * eps_0) - C5 = dt / (self.dx * eps_0) - C8 = dt / (self.dz * eps_0) - C3 = dt / eps_0 + dt / (self.dy * eps_0) + dt / (self.dx * eps_0) + dt / (self.dz * eps_0) + dt / eps_0 for ii in range(self.Nx): for jj in range(1, self.Ny): for kk in range(1, self.Nz): if self.grid.l_x[ii, jj, kk] > 0: - Ex[ii, jj, kk] = (Ex[ii, jj, kk] - self.C3 * self.Jx[ii, jj, kk] + - self.C4 * (Hz[ii, jj, kk] - Hz[ii, jj - 1, kk]) - - self.C8 * (Hy[ii, jj, kk] - Hy[ii, jj, kk - 1])) + Ex[ii, jj, kk] = ( + Ex[ii, jj, kk] + - self.C3 * self.Jx[ii, jj, kk] + + self.C4 * (Hz[ii, jj, kk] - Hz[ii, jj - 1, kk]) + - self.C8 * (Hy[ii, jj, kk] - Hy[ii, jj, kk - 1]) + ) for ii in range(1, self.Nx): for jj in range(self.Ny): for kk in range(1, self.Nz): if self.grid.l_y[ii, jj, kk] > 0: - Ey[ii, jj, kk] = (Ey[ii, jj, kk] - self.C3 * self.Jy[ii, jj, kk] + - self.C8 * (Hx[ii, jj, kk] - Hx[ii, jj, kk - 1]) - - self.C5 * (Hz[ii, jj, kk] - Hz[ii - 1, jj, kk])) + Ey[ii, jj, kk] = ( + Ey[ii, jj, kk] + - self.C3 * self.Jy[ii, jj, kk] + + self.C8 * (Hx[ii, jj, kk] - Hx[ii, jj, kk - 1]) + - self.C5 * (Hz[ii, jj, kk] - Hz[ii - 1, jj, kk]) + ) for ii in range(1, self.Nx): for jj in range(1, self.Ny): for kk in range(self.Nz): if self.grid.l_z[ii, jj, kk] > 0: - Ez[ii, jj, kk] = (Ez[ii, jj, kk] - self.C3 * self.Jz[ii, jj, kk] + - self.C5 * (Hy[ii, jj, kk] - Hy[ii - 1, jj, kk]) - - self.C4 * (Hx[ii, jj, kk] - Hx[ii, jj - 1, kk])) + Ez[ii, jj, kk] = ( + Ez[ii, jj, kk] + - self.C3 * self.Jz[ii, jj, kk] + + self.C5 * (Hy[ii, jj, kk] - Hy[ii - 1, jj, kk]) + - self.C4 * (Hx[ii, jj, kk] - Hx[ii, jj - 1, kk]) + ) diff --git a/wakis/solverFIT3D.py b/wakis/solverFIT3D.py index 6dd0084..9898619 100644 --- a/wakis/solverFIT3D.py +++ b/wakis/solverFIT3D.py @@ -19,26 +19,38 @@ try: from cupyx.scipy.sparse import csc_matrix as gpu_sparse_mat + imported_cupyx = True except ImportError: imported_cupyx = False try: from sparse_dot_mkl import csr_matrix as mkl_sparse_mat, dot_product_mkl + imported_mkl = True except ImportError: imported_mkl = False class SolverFIT3D(PlotMixin, RoutinesMixin): - - def __init__(self, grid, wake=None, cfln=0.5, dt=None, - bc_low=['Periodic', 'Periodic', 'Periodic'], - bc_high=['Periodic', 'Periodic', 'Periodic'], - use_stl=False, use_conductors=False, - use_gpu=False, use_mpi=False, dtype=np.float64, - n_pml=10, bg=[1.0, 1.0], verbose=1): - ''' + def __init__( + self, + grid, + wake=None, + cfln=0.5, + dt=None, + bc_low=["Periodic", "Periodic", "Periodic"], + bc_high=["Periodic", "Periodic", "Periodic"], + use_stl=False, + use_conductors=False, + use_gpu=False, + use_mpi=False, + dtype=np.float64, + n_pml=10, + bg=[1.0, 1.0], + verbose=1, + ): + """ Class holding the 3D time-domain electromagnetic solver algorithm based on the Finite Integration Technique (FIT) @@ -92,7 +104,7 @@ def __init__(self, grid, wake=None, cfln=0.5, dt=None, Object to access the μ^-1 tensor containing 1/permeability values in the 3 dimensions. sigma: Field object Object to access the condutcity σ tensor in the 3 dimensions. - ''' + """ self.verbose = verbose t0 = time.time() @@ -106,14 +118,16 @@ def __init__(self, grid, wake=None, cfln=0.5, dt=None, self.use_stl = use_stl self.use_gpu = use_gpu self.use_mpi = use_mpi - self.activate_abc = False # Will turn true if abc BCs are chosen - self.activate_pml = False # Will turn true if pml BCs are chosen - self.use_conductivity = False # Will turn true if conductive material or pml is added - self.imported_mkl = imported_mkl # Use MKL backend when available + self.activate_abc = False # Will turn true if abc BCs are chosen + self.activate_pml = False # Will turn true if pml BCs are chosen + self.use_conductivity = ( + False # Will turn true if conductive material or pml is added + ) + self.imported_mkl = imported_mkl # Use MKL backend when available self.one_step = self._one_step if use_stl: self.use_conductors = False - self.update_logger(['use_gpu', 'use_mpi']) + self.update_logger(["use_gpu", "use_mpi"]) # Grid self.grid = grid @@ -121,32 +135,38 @@ def __init__(self, grid, wake=None, cfln=0.5, dt=None, self.Nx = self.grid.Nx self.Ny = self.grid.Ny self.Nz = self.grid.Nz - self.N = self.Nx*self.Ny*self.Nz + self.N = self.Nx * self.Ny * self.Nz self.dx = self.grid.dx self.dy = self.grid.dy self.dz = self.grid.dz - self.x = self.grid.x[:-1]+self.dx/2 - self.y = self.grid.y[:-1]+self.dy/2 - self.z = self.grid.z[:-1]+self.dz/2 + self.x = self.grid.x[:-1] + self.dx / 2 + self.y = self.grid.y[:-1] + self.dy / 2 + self.z = self.grid.z[:-1] + self.dz / 2 self.L = self.grid.L self.iA = self.grid.iA self.tL = self.grid.tL self.itA = self.grid.itA - self.update_logger(['grid','background']) + self.update_logger(["grid", "background"]) # Wake computation self.wake = wake if self.wake is not None: - self.logger.wakeSolver=self.wake.logger.wakeSolver + self.logger.wakeSolver = self.wake.logger.wakeSolver # Fields self.dtype = dtype - self.E = Field(self.Nx, self.Ny, self.Nz, use_gpu=self.use_gpu, dtype=self.dtype) - self.H = Field(self.Nx, self.Ny, self.Nz, use_gpu=self.use_gpu, dtype=self.dtype) - self.J = Field(self.Nx, self.Ny, self.Nz, use_gpu=self.use_gpu, dtype=self.dtype) + self.E = Field( + self.Nx, self.Ny, self.Nz, use_gpu=self.use_gpu, dtype=self.dtype + ) + self.H = Field( + self.Nx, self.Ny, self.Nz, use_gpu=self.use_gpu, dtype=self.dtype + ) + self.J = Field( + self.Nx, self.Ny, self.Nz, use_gpu=self.use_gpu, dtype=self.dtype + ) # MPI init if self.use_mpi: @@ -154,54 +174,66 @@ def __init__(self, grid, wake=None, cfln=0.5, dt=None, self.mpi_initialize() self.one_step = self.mpi_one_step else: - print('[!] Grid not subdivided for MPI, set `use_mpi`=True also in `GridFIT3D` to enable MPI') + print( + "[!] Grid not subdivided for MPI, set `use_mpi`=True also in `GridFIT3D` to enable MPI" + ) # Matrices if verbose: - print('Assembling operator matrices...') + print("Assembling operator matrices...") N = self.N self.Px = diags([-1, 1], [0, 1], shape=(N, N), dtype=np.int8) self.Py = diags([-1, 1], [0, self.Nx], shape=(N, N), dtype=np.int8) - self.Pz = diags([-1, 1], [0, self.Nx*self.Ny], shape=(N, N), dtype=np.int8) + self.Pz = diags([-1, 1], [0, self.Nx * self.Ny], shape=(N, N), dtype=np.int8) # original grid - self.Ds = diags(self.L.toarray(), shape=(3*N, 3*N), dtype=self.dtype) - self.iDa = diags(self.iA.toarray(), shape=(3*N, 3*N), dtype=self.dtype) + self.Ds = diags(self.L.toarray(), shape=(3 * N, 3 * N), dtype=self.dtype) + self.iDa = diags(self.iA.toarray(), shape=(3 * N, 3 * N), dtype=self.dtype) # tilde grid - self.tDs = diags(self.tL.toarray(), shape=(3*N, 3*N), dtype=self.dtype) - self.itDa = diags(self.itA.toarray(), shape=(3*N, 3*N), dtype=self.dtype) + self.tDs = diags(self.tL.toarray(), shape=(3 * N, 3 * N), dtype=self.dtype) + self.itDa = diags(self.itA.toarray(), shape=(3 * N, 3 * N), dtype=self.dtype) # Curl matrix - self.C = vstack([ - hstack([sparse_mat((N,N)), -self.Pz, self.Py]), - hstack([self.Pz, sparse_mat((N,N)), -self.Px]), - hstack([-self.Py, self.Px, sparse_mat((N,N))]) - ], dtype=np.int8) + self.C = vstack( + [ + hstack([sparse_mat((N, N)), -self.Pz, self.Py]), + hstack([self.Pz, sparse_mat((N, N)), -self.Px]), + hstack([-self.Py, self.Px, sparse_mat((N, N))]), + ], + dtype=np.int8, + ) # Boundaries if verbose: - print('Applying boundary conditions...') + print("Applying boundary conditions...") self.bc_low = bc_low self.bc_high = bc_high - self.update_logger(['bc_low', 'bc_high']) + self.update_logger(["bc_low", "bc_high"]) self.apply_bc_to_C() # Materials if verbose: - print('Adding material tensors...') + print("Adding material tensors...") if type(bg) is str: bg = material_lib[bg.lower()] if len(bg) == 3: - self.eps_bg, self.mu_bg, self.sigma_bg = bg[0]*eps_0, bg[1]*mu_0, bg[2] + self.eps_bg, self.mu_bg, self.sigma_bg = bg[0] * eps_0, bg[1] * mu_0, bg[2] self.use_conductivity = True else: - self.eps_bg, self.mu_bg, self.sigma_bg = bg[0]*eps_0, bg[1]*mu_0, 0.0 - - self.ieps = Field(self.Nx, self.Ny, self.Nz, use_ones=True, dtype=self.dtype)*(1./self.eps_bg) - self.imu = Field(self.Nx, self.Ny, self.Nz, use_ones=True, dtype=self.dtype)*(1./self.mu_bg) - self.sigma = Field(self.Nx, self.Ny, self.Nz, use_ones=True, dtype=self.dtype)*self.sigma_bg + self.eps_bg, self.mu_bg, self.sigma_bg = bg[0] * eps_0, bg[1] * mu_0, 0.0 + + self.ieps = Field( + self.Nx, self.Ny, self.Nz, use_ones=True, dtype=self.dtype + ) * (1.0 / self.eps_bg) + self.imu = Field(self.Nx, self.Ny, self.Nz, use_ones=True, dtype=self.dtype) * ( + 1.0 / self.mu_bg + ) + self.sigma = ( + Field(self.Nx, self.Ny, self.Nz, use_ones=True, dtype=self.dtype) + * self.sigma_bg + ) if self.use_stl: self.apply_stl() @@ -209,50 +241,52 @@ def __init__(self, grid, wake=None, cfln=0.5, dt=None, # Fill PML BCs if self.activate_pml: if verbose: - print('Filling PML sigmas...') + print("Filling PML sigmas...") self.n_pml = n_pml self.pml_lo = 5.0e-3 self.pml_hi = 10.0 self.pml_func = np.geomspace self.pml_eps_r = 1.0 self.fill_pml_sigmas() - self.update_logger(['n_pml']) + self.update_logger(["n_pml"]) # Timestep calculation if verbose: - print('Calculating maximal stable timestep...') + print("Calculating maximal stable timestep...") self.cfln = cfln if dt is None: self.dt = cfln / (c_light * np.sqrt(1 / np.min(self.grid.dx) ** 2 + 1 / np.min(self.grid.dy) ** 2 + 1 / np.min(self.grid.dz) ** 2)) else: self.dt = dt self.dt = dtype(self.dt) - self.update_logger(['dt']) + self.update_logger(["dt"]) - if self.use_conductivity: # relaxation time criterion tau + if self.use_conductivity: # relaxation time criterion tau + mask = np.logical_and( + self.sigma.toarray() != 0, # for non-conductive + self.ieps.toarray() != 0, + ) # for PEC eps=inf - mask = np.logical_and(self.sigma.toarray()!=0, #for non-conductive - self.ieps.toarray()!=0) #for PEC eps=inf - - self.tau = (1/self.ieps.toarray()[mask]) / \ - self.sigma.toarray()[mask] + self.tau = (1 / self.ieps.toarray()[mask]) / self.sigma.toarray()[mask] if self.dt > self.tau.min(): self.dt = self.tau.min() # Pre-computing if verbose: - print('Pre-computing...') - self.iDeps = diags(self.ieps.toarray(), shape=(3*N, 3*N), dtype=self.dtype) - self.iDmu = diags(self.imu.toarray(), shape=(3*N, 3*N), dtype=self.dtype) - self.Dsigma = diags(self.sigma.toarray(), shape=(3*N, 3*N), dtype=self.dtype) + print("Pre-computing...") + self.iDeps = diags(self.ieps.toarray(), shape=(3 * N, 3 * N), dtype=self.dtype) + self.iDmu = diags(self.imu.toarray(), shape=(3 * N, 3 * N), dtype=self.dtype) + self.Dsigma = diags( + self.sigma.toarray(), shape=(3 * N, 3 * N), dtype=self.dtype + ) self.tDsiDmuiDaC = self.iDa * self.iDmu * self.C * self.Ds self.itDaiDepsDstC = self.iDeps * self.itDa * self.C.transpose() * self.tDs - if imported_mkl and not self.use_gpu: # MKL backend for CPU + if imported_mkl and not self.use_gpu: # MKL backend for CPU if verbose: - print('Using MKL backend for time-stepping...') + print("Using MKL backend for time-stepping...") self.tDsiDmuiDaC = mkl_sparse_mat(self.tDsiDmuiDaC) self.itDaiDepsDstC = mkl_sparse_mat(self.itDaiDepsDstC) self.one_step = self.one_step_mkl @@ -260,20 +294,22 @@ def __init__(self, grid, wake=None, cfln=0.5, dt=None, # Move to GPU if use_gpu: if verbose: - print('Moving to GPU...') + print("Moving to GPU...") if imported_cupyx: self.tDsiDmuiDaC = gpu_sparse_mat(self.tDsiDmuiDaC) self.itDaiDepsDstC = gpu_sparse_mat(self.itDaiDepsDstC) self.ieps.to_gpu() self.sigma.to_gpu() else: - raise ImportError('[!] cupyx could not be imported, please check CUDA installation') + raise ImportError( + "[!] cupyx could not be imported, please check CUDA installation" + ) if verbose: - print(f'Total solver initialization time: {time.time() - t0} s') + print(f"Total solver initialization time: {time.time() - t0} s") self.solverInitializationTime = time.time() - t0 - self.update_logger(['solverInitializationTime']) + self.update_logger(["solverInitializationTime"]) self.solverInitializationTime = time.time() - t0 self.update_logger(['solverInitializationTime']) @@ -289,20 +325,32 @@ def update_tensors(self, tensor='all'): Name of the tensor to update: 'ieps', 'imu', 'sigma' for permitivity, permeability and conductivity, respectively. If left to default 'all', all thre tensors will be recomputed. - ''' + """ if self.verbose: print(f'Re-computing tensor "{tensor}"...') - if tensor == 'ieps': - self.iDeps = diags(self.ieps.toarray(), shape=(3*self.N, 3*self.N), dtype=self.dtype) - elif tensor =='imu': - self.iDmu = diags(self.imu.toarray(), shape=(3*self.N, 3*self.N), dtype=self.dtype) - elif tensor == 'sigma': - self.Dsigma = diags(self.sigma.toarray(), shape=(3*self.N, 3*self.N), dtype=self.dtype) - elif tensor == 'all': - self.iDeps = diags(self.ieps.toarray(), shape=(3*self.N, 3*self.N), dtype=self.dtype) - self.iDmu = diags(self.imu.toarray(), shape=(3*self.N, 3*self.N), dtype=self.dtype) - self.Dsigma = diags(self.sigma.toarray(), shape=(3*self.N, 3*self.N), dtype=self.dtype) + if tensor == "ieps": + self.iDeps = diags( + self.ieps.toarray(), shape=(3 * self.N, 3 * self.N), dtype=self.dtype + ) + elif tensor == "imu": + self.iDmu = diags( + self.imu.toarray(), shape=(3 * self.N, 3 * self.N), dtype=self.dtype + ) + elif tensor == "sigma": + self.Dsigma = diags( + self.sigma.toarray(), shape=(3 * self.N, 3 * self.N), dtype=self.dtype + ) + elif tensor == "all": + self.iDeps = diags( + self.ieps.toarray(), shape=(3 * self.N, 3 * self.N), dtype=self.dtype + ) + self.iDmu = diags( + self.imu.toarray(), shape=(3 * self.N, 3 * self.N), dtype=self.dtype + ) + self.Dsigma = diags( + self.sigma.toarray(), shape=(3 * self.N, 3 * self.N), dtype=self.dtype + ) if self.verbose: print('Re-Pre-computing ...') @@ -316,17 +364,20 @@ def _one_step(self): self.step_0 = False self.attrcleanup() - self.H.fromarray(self.H.toarray() - - self.dt*self.tDsiDmuiDaC*self.E.toarray() - ) + self.H.fromarray( + self.H.toarray() - self.dt * self.tDsiDmuiDaC * self.E.toarray() + ) - self.E.fromarray(self.E.toarray() + - self.dt*(self.itDaiDepsDstC*self.H.toarray() - - self.ieps.toarray()*self.J.toarray() - ) - ) + self.E.fromarray( + self.E.toarray() + + self.dt + * ( + self.itDaiDepsDstC * self.H.toarray() + - self.ieps.toarray() * self.J.toarray() + ) + ) - #include current computation + # include current computation if self.use_conductivity: self.J.fromarray(self.sigma.toarray()*self.E.toarray() ) @@ -337,19 +388,23 @@ def one_step_mkl(self): self.step_0 = False self.attrcleanup() - self.H.fromarray(self.H.toarray() - - self.dt*dot_product_mkl(self.tDsiDmuiDaC,self.E.toarray()) - ) + self.H.fromarray( + self.H.toarray() + - self.dt * dot_product_mkl(self.tDsiDmuiDaC, self.E.toarray()) + ) - self.E.fromarray(self.E.toarray() + - self.dt*(dot_product_mkl(self.itDaiDepsDstC,self.H.toarray()) - - self.ieps.toarray()*self.J.toarray() - ) - ) + self.E.fromarray( + self.E.toarray() + + self.dt + * ( + dot_product_mkl(self.itDaiDepsDstC, self.H.toarray()) + - self.ieps.toarray() * self.J.toarray() + ) + ) - #include current computation + # include current computation if self.use_conductivity: - self.J.fromarray(self.sigma.toarray()*self.E.toarray()) + self.J.fromarray(self.sigma.toarray() * self.E.toarray()) def mpi_initialize(self): self.comm = self.grid.comm @@ -367,22 +422,25 @@ def mpi_one_step(self): self.step_0 = False self.attrcleanup() - self.H.fromarray(self.H.toarray() - - self.dt*self.tDsiDmuiDaC*self.E.toarray() - ) + self.H.fromarray( + self.H.toarray() - self.dt * self.tDsiDmuiDaC * self.E.toarray() + ) self.mpi_communicate(self.H) self.mpi_communicate(self.J) - self.E.fromarray(self.E.toarray() + - self.dt*(self.itDaiDepsDstC * self.H.toarray() - - self.ieps.toarray()*self.J.toarray() - ) - ) + self.E.fromarray( + self.E.toarray() + + self.dt + * ( + self.itDaiDepsDstC * self.H.toarray() + - self.ieps.toarray() * self.J.toarray() + ) + ) self.mpi_communicate(self.E) # include current computation if self.use_conductivity: - self.J.fromarray(self.sigma.toarray()*self.E.toarray()) + self.J.fromarray(self.sigma.toarray() * self.E.toarray()) def mpi_communicate(self, field): if self.use_gpu: @@ -390,24 +448,32 @@ def mpi_communicate(self, field): # ghosts lo if self.rank > 0: - for d in ['x','y','z']: - self.comm.Sendrecv(field[:, :, 1, d], - recvbuf=field[:, :, 0, d], - dest=self.rank-1, sendtag=0, - source=self.rank-1, recvtag=1) + for d in ["x", "y", "z"]: + self.comm.Sendrecv( + field[:, :, 1, d], + recvbuf=field[:, :, 0, d], + dest=self.rank - 1, + sendtag=0, + source=self.rank - 1, + recvtag=1, + ) # ghosts hi if self.rank < self.size - 1: - for d in ['x','y','z']: - self.comm.Sendrecv(field[:, :, -2, d], - recvbuf=field[:, :, -1, d], - dest=self.rank+1, sendtag=1, - source=self.rank+1, recvtag=0) + for d in ["x", "y", "z"]: + self.comm.Sendrecv( + field[:, :, -2, d], + recvbuf=field[:, :, -1, d], + dest=self.rank + 1, + sendtag=1, + source=self.rank + 1, + recvtag=0, + ) if self.use_gpu: field.to_gpu() def mpi_gather(self, field, x=None, y=None, z=None, component=None): - ''' + """ Gather a specific component or slice of a distributed field from all MPI ranks. This function collects a selected component of a field (E, H, J, or custom) @@ -458,7 +524,7 @@ def mpi_gather(self, field, x=None, y=None, z=None, component=None): >>> # Gather a 2D yz-slice at x=10 of the J field >>> yz_J = solver.mpi_gather('J', x=10) - ''' + """ if x is None: x = slice(0, self.Nx) @@ -468,25 +534,25 @@ def mpi_gather(self, field, x=None, y=None, z=None, component=None): z = slice(0, self.NZ) if type(field) is str: - if len(field) == 2: #support for e.g. field='Ex' + if len(field) == 2: # support for e.g. field='Ex' component = field[1] field = field[0] - elif len(field) == 4: #support for Abs + elif len(field) == 4: # support for Abs component = field[1:] field = field[0] elif component is None: - component = 'z' + component = "z" print("[!] `component` not specified, using default component='z'") - if field == 'E': + if field == "E": local = self.E[x, y, :, component].ravel() - elif field == 'H': + elif field == "H": local = self.H[x, y, :, component].ravel() - elif field == 'J': + elif field == "J": local = self.J[x, y, :, component].ravel() else: if component is None: - component = 'z' + component = "z" print("[!] `component` not specified, using default component='z'") local = field[x, y, :, component].ravel() @@ -495,65 +561,89 @@ def mpi_gather(self, field, x=None, y=None, z=None, component=None): if self.rank == 0: if type(x) is int and type(y) is int: # 1d array at x=a, y=b - nz = self.NZ//self.size + nz = self.NZ // self.size _field = np.zeros((self.NZ)) for r in range(self.size): - zz = np.s_[r*nz:(r+1)*nz] + zz = np.s_[r * nz : (r + 1) * nz] if r == 0: - _field[zz] = np.reshape(buffer[r], (nz+self.grid.n_ghosts))[:-1] - elif r == (self.size-1): - _field[zz] = np.reshape(buffer[r], (nz+self.grid.n_ghosts))[1:] + _field[zz] = np.reshape(buffer[r], (nz + self.grid.n_ghosts))[ + :-1 + ] + elif r == (self.size - 1): + _field[zz] = np.reshape(buffer[r], (nz + self.grid.n_ghosts))[ + 1: + ] else: - _field[zz] = np.reshape(buffer[r], (nz+2*self.grid.n_ghosts))[1:-1] + _field[zz] = np.reshape( + buffer[r], (nz + 2 * self.grid.n_ghosts) + )[1:-1] _field = _field[z] - elif type(x) is int: # 2d slice at x=a - ny = y.stop-y.start - nz = self.NZ//self.size + elif type(x) is int: # 2d slice at x=a + ny = y.stop - y.start + nz = self.NZ // self.size _field = np.zeros((ny, self.NZ)) for r in range(self.size): - zz = np.s_[r*nz:(r+1)*nz] + zz = np.s_[r * nz : (r + 1) * nz] if r == 0: - _field[:, zz] = np.reshape(buffer[r], (ny, nz+self.grid.n_ghosts))[:, :-1] - elif r == (self.size-1): - _field[:, zz] = np.reshape(buffer[r], (ny, nz+self.grid.n_ghosts))[:, 1:] + _field[:, zz] = np.reshape( + buffer[r], (ny, nz + self.grid.n_ghosts) + )[:, :-1] + elif r == (self.size - 1): + _field[:, zz] = np.reshape( + buffer[r], (ny, nz + self.grid.n_ghosts) + )[:, 1:] else: - _field[:, zz] = np.reshape(buffer[r], (ny, nz+2*self.grid.n_ghosts))[:, 1:-1] + _field[:, zz] = np.reshape( + buffer[r], (ny, nz + 2 * self.grid.n_ghosts) + )[:, 1:-1] _field = _field[:, z] elif type(y) is int: # 2d slice at y=a - nx = x.stop-x.start - nz = self.NZ//self.size + nx = x.stop - x.start + nz = self.NZ // self.size _field = np.zeros((nx, self.NZ)) for r in range(self.size): - zz = np.s_[r*nz:(r+1)*nz] + zz = np.s_[r * nz : (r + 1) * nz] if r == 0: - _field[:, zz] = np.reshape(buffer[r], (nx, nz+self.grid.n_ghosts))[:, :-1] - elif r == (self.size-1): - _field[:, zz] = np.reshape(buffer[r], (nx, nz+self.grid.n_ghosts))[:, 1:] + _field[:, zz] = np.reshape( + buffer[r], (nx, nz + self.grid.n_ghosts) + )[:, :-1] + elif r == (self.size - 1): + _field[:, zz] = np.reshape( + buffer[r], (nx, nz + self.grid.n_ghosts) + )[:, 1:] else: - _field[:, zz] = np.reshape(buffer[r], (nx, nz+2*self.grid.n_ghosts))[:, 1:-1] + _field[:, zz] = np.reshape( + buffer[r], (nx, nz + 2 * self.grid.n_ghosts) + )[:, 1:-1] _field = _field[:, z] - else: # both type slice -> 3d array - nx = x.stop-x.start - ny = y.stop-y.start - nz = self.NZ//self.size + else: # both type slice -> 3d array + nx = x.stop - x.start + ny = y.stop - y.start + nz = self.NZ // self.size _field = np.zeros((nx, ny, self.NZ)) for r in range(self.size): - zz = np.s_[r*nz:(r+1)*nz] + zz = np.s_[r * nz : (r + 1) * nz] if r == 0: - _field[:, :, zz] = np.reshape(buffer[r], (nx, ny, nz+self.grid.n_ghosts))[:, :, :-1] - elif r == (self.size-1): - _field[:, :, zz] = np.reshape(buffer[r], (nx, ny, nz+self.grid.n_ghosts))[:, :, 1:] + _field[:, :, zz] = np.reshape( + buffer[r], (nx, ny, nz + self.grid.n_ghosts) + )[:, :, :-1] + elif r == (self.size - 1): + _field[:, :, zz] = np.reshape( + buffer[r], (nx, ny, nz + self.grid.n_ghosts) + )[:, :, 1:] else: - _field[:, :, zz] = np.reshape(buffer[r], (nx, ny, nz+2*self.grid.n_ghosts))[:, :, 1:-1] + _field[:, :, zz] = np.reshape( + buffer[r], (nx, ny, nz + 2 * self.grid.n_ghosts) + )[:, :, 1:-1] _field = _field[:, :, z] return _field def mpi_gather_asField(self, field): - ''' + """ Gather distributed field data from all MPI ranks and return a global Field object. This method collects the specified electromagnetic field data (E, H, or J) @@ -582,183 +672,207 @@ def mpi_gather_asField(self, field): ----- - This method assumes the field is distributed along the `z`-axis. - Ghost cells are removed appropriately when reassembling the global field. - ''' + """ _field = Field(self.Nx, self.Ny, self.NZ) - for d in ['x','y','z']: + for d in ["x", "y", "z"]: if type(field) is str: - if field == 'E': - local = self.E[:, :, :,d].ravel() - elif field == 'H': - local = self.H[:, :, :,d].ravel() - elif field == 'J': - local = self.J[:, :, :,d].ravel() + if field == "E": + local = self.E[:, :, :, d].ravel() + elif field == "H": + local = self.H[:, :, :, d].ravel() + elif field == "J": + local = self.J[:, :, :, d].ravel() else: local = field[:, :, :, d].ravel() buffer = self.comm.gather(local, root=0) if self.rank == 0: - nz = self.NZ//self.size + nz = self.NZ // self.size for r in range(self.size): - zz = np.s_[r*nz:(r+1)*nz] + zz = np.s_[r * nz : (r + 1) * nz] if r == 0: - _field[:, :, zz, d] = np.reshape(buffer[r], (self.Nx, self.Ny, nz+self.grid.n_ghosts))[:, :, :-1] - elif r == (self.size-1): - _field[:, :, zz, d] = np.reshape(buffer[r], (self.Nx, self.Ny, nz+self.grid.n_ghosts))[:, :, 1:] + _field[:, :, zz, d] = np.reshape( + buffer[r], (self.Nx, self.Ny, nz + self.grid.n_ghosts) + )[:, :, :-1] + elif r == (self.size - 1): + _field[:, :, zz, d] = np.reshape( + buffer[r], (self.Nx, self.Ny, nz + self.grid.n_ghosts) + )[:, :, 1:] else: - _field[:, :, zz, d] = np.reshape(buffer[r], (self.Nx, self.Ny, nz+2*self.grid.n_ghosts))[:, :, 1:-1] + _field[:, :, zz, d] = np.reshape( + buffer[r], (self.Nx, self.Ny, nz + 2 * self.grid.n_ghosts) + )[:, :, 1:-1] return _field def apply_bc_to_C(self): - ''' + """ Modifies rows or columns of C and tDs and itDa matrices according to bc_low and bc_high - ''' - xlo, ylo, zlo = 1., 1., 1. - xhi, yhi, zhi = 1., 1., 1. + """ + xlo, ylo, zlo = 1.0, 1.0, 1.0 + xhi, yhi, zhi = 1.0, 1.0, 1.0 # Check BCs for internal MPI subdomains if self.use_mpi and self.grid.use_mpi: if self.rank > 0: - self.bc_low=['pec', 'pec', 'mpi'] + self.bc_low = ["pec", "pec", "mpi"] if self.rank < self.size - 1: - self.bc_high=['pec', 'pec', 'mpi'] + self.bc_high = ["pec", "pec", "mpi"] # Perodic: out == in - if any(True for x in self.bc_low if x.lower() == 'periodic'): - if self.bc_low[0].lower() == 'periodic' and self.bc_high[0].lower() == 'periodic': - self.tL[-1, :, :, 'x'] = self.L[0, :, :, 'x'] - self.itA[-1, :, :, 'y'] = self.iA[0, :, :, 'y'] - self.itA[-1, :, :, 'z'] = self.iA[0, :, :, 'z'] - - if self.bc_low[1].lower() == 'periodic' and self.bc_high[1].lower() == 'periodic': - self.tL[:, -1, :, 'y'] = self.L[:, 0, :, 'y'] - self.itA[:, -1, :, 'x'] = self.iA[:, 0, :, 'x'] - self.itA[:, -1, :, 'z'] = self.iA[:, 0, :, 'z'] - - if self.bc_low[2].lower() == 'periodic' and self.bc_high[2].lower() == 'periodic': - self.tL[:, :, -1, 'z'] = self.L[:, :, 0, 'z'] - self.itA[:, :, -1, 'x'] = self.iA[:, :, 0, 'x'] - self.itA[:, :, -1, 'y'] = self.iA[:, :, 0, 'y'] - - self.tDs = diags(self.tL.toarray(), shape=(3*self.N, 3*self.N), dtype=float) - self.itDa = diags(self.itA.toarray(), shape=(3*self.N, 3*self.N), dtype=float) + if any(True for x in self.bc_low if x.lower() == "periodic"): + if ( + self.bc_low[0].lower() == "periodic" + and self.bc_high[0].lower() == "periodic" + ): + self.tL[-1, :, :, "x"] = self.L[0, :, :, "x"] + self.itA[-1, :, :, "y"] = self.iA[0, :, :, "y"] + self.itA[-1, :, :, "z"] = self.iA[0, :, :, "z"] + + if ( + self.bc_low[1].lower() == "periodic" + and self.bc_high[1].lower() == "periodic" + ): + self.tL[:, -1, :, "y"] = self.L[:, 0, :, "y"] + self.itA[:, -1, :, "x"] = self.iA[:, 0, :, "x"] + self.itA[:, -1, :, "z"] = self.iA[:, 0, :, "z"] + + if ( + self.bc_low[2].lower() == "periodic" + and self.bc_high[2].lower() == "periodic" + ): + self.tL[:, :, -1, "z"] = self.L[:, :, 0, "z"] + self.itA[:, :, -1, "x"] = self.iA[:, :, 0, "x"] + self.itA[:, :, -1, "y"] = self.iA[:, :, 0, "y"] + + self.tDs = diags( + self.tL.toarray(), shape=(3 * self.N, 3 * self.N), dtype=float + ) + self.itDa = diags( + self.itA.toarray(), shape=(3 * self.N, 3 * self.N), dtype=float + ) # Dirichlet PEC: tangential E field = 0 at boundary - if any(True for x in self.bc_low if x.lower() in ('electric','pec','pml')) \ - or any(True for x in self.bc_high if x.lower() in ('electric','pec','pml')): - if self.bc_low[0].lower() in ('electric','pec', 'pml'): + if any( + True for x in self.bc_low if x.lower() in ("electric", "pec", "pml") + ) or any(True for x in self.bc_high if x.lower() in ("electric", "pec", "pml")): + if self.bc_low[0].lower() in ("electric", "pec", "pml"): xlo = 0 - if self.bc_low[1].lower() in ('electric','pec', 'pml'): + if self.bc_low[1].lower() in ("electric", "pec", "pml"): ylo = 0 - if self.bc_low[2].lower() in ('electric','pec', 'pml'): + if self.bc_low[2].lower() in ("electric", "pec", "pml"): zlo = 0 - if self.bc_high[0].lower() in ('electric','pec', 'pml'): + if self.bc_high[0].lower() in ("electric", "pec", "pml"): xhi = 0 - if self.bc_high[1].lower() in ('electric','pec', 'pml'): + if self.bc_high[1].lower() in ("electric", "pec", "pml"): yhi = 0 - if self.bc_high[2].lower() in ('electric','pec', 'pml'): + if self.bc_high[2].lower() in ("electric", "pec", "pml"): zhi = 0 # Assemble matrix self.BC = Field(self.Nx, self.Ny, self.Nz, dtype=np.int8, use_ones=True) - for d in ['x', 'y', 'z']: #tangential to zero - if d != 'x': + for d in ["x", "y", "z"]: # tangential to zero + if d != "x": self.BC[0, :, :, d] = xlo self.BC[-1, :, :, d] = xhi - if d != 'y': + if d != "y": self.BC[:, 0, :, d] = ylo self.BC[:, -1, :, d] = yhi - if d != 'z': + if d != "z": self.BC[:, :, 0, d] = zlo self.BC[:, :, -1, d] = zhi - self.Dbc = diags(self.BC.toarray(), - shape=(3*self.N, 3*self.N), - dtype=np.int8 - ) + self.Dbc = diags( + self.BC.toarray(), shape=(3 * self.N, 3 * self.N), dtype=np.int8 + ) # Update C (columns) - self.C = self.C*self.Dbc - + self.C = self.C * self.Dbc # Dirichlet PMC: tangential H field = 0 at boundary - if any(True for x in self.bc_low if x.lower() in ('magnetic','pmc')) \ - or any(True for x in self.bc_high if x.lower() in ('magnetic','pmc')): - if self.bc_low[0].lower() == 'magnetic' or self.bc_low[0] == 'pmc': + if any(True for x in self.bc_low if x.lower() in ("magnetic", "pmc")) or any( + True for x in self.bc_high if x.lower() in ("magnetic", "pmc") + ): + if self.bc_low[0].lower() == "magnetic" or self.bc_low[0] == "pmc": xlo = 0 - if self.bc_low[1].lower() == 'magnetic' or self.bc_low[1] == 'pmc': + if self.bc_low[1].lower() == "magnetic" or self.bc_low[1] == "pmc": ylo = 0 - if self.bc_low[2].lower() == 'magnetic' or self.bc_low[2] == 'pmc': + if self.bc_low[2].lower() == "magnetic" or self.bc_low[2] == "pmc": zlo = 0 - if self.bc_high[0].lower() == 'magnetic' or self.bc_high[0] == 'pmc': + if self.bc_high[0].lower() == "magnetic" or self.bc_high[0] == "pmc": xhi = 0 - if self.bc_high[1].lower() == 'magnetic' or self.bc_high[1] == 'pmc': + if self.bc_high[1].lower() == "magnetic" or self.bc_high[1] == "pmc": yhi = 0 - if self.bc_high[2].lower() == 'magnetic' or self.bc_high[2] == 'pmc': + if self.bc_high[2].lower() == "magnetic" or self.bc_high[2] == "pmc": zhi = 0 # Assemble matrix self.BC = Field(self.Nx, self.Ny, self.Nz, dtype=np.int8, use_ones=True) - for d in ['x', 'y', 'z']: #tangential to zero - if d != 'x': + for d in ["x", "y", "z"]: # tangential to zero + if d != "x": self.BC[0, :, :, d] = xlo self.BC[-1, :, :, d] = xhi - if d != 'y': + if d != "y": self.BC[:, 0, :, d] = ylo self.BC[:, -1, :, d] = yhi - if d != 'z': + if d != "z": self.BC[:, :, 0, d] = zlo self.BC[:, :, -1, d] = zhi - self.Dbc = diags(self.BC.toarray(), - shape=(3*self.N, 3*self.N), - dtype=np.int8 - ) + self.Dbc = diags( + self.BC.toarray(), shape=(3 * self.N, 3 * self.N), dtype=np.int8 + ) # Update C (rows) - self.C = self.Dbc*self.C + self.C = self.Dbc * self.C # Absorbing boundary conditions ABC - if any(True for x in self.bc_low if x.lower() == 'abc') \ - or any(True for x in self.bc_high if x.lower() == 'abc'): - if self.bc_high[0].lower() == 'abc': - self.tL[-1, :, :, 'x'] = self.L[0, :, :, 'x'] - self.itA[-1, :, :, 'y'] = self.iA[0, :, :, 'y'] - self.itA[-1, :, :, 'z'] = self.iA[0, :, :, 'z'] - - if self.bc_high[1].lower() == 'abc': - self.tL[:, -1, :, 'y'] = self.L[:, 0, :, 'y'] - self.itA[:, -1, :, 'x'] = self.iA[:, 0, :, 'x'] - self.itA[:, -1, :, 'z'] = self.iA[:, 0, :, 'z'] - - if self.bc_high[2].lower() == 'abc': - self.tL[:, :, -1, 'z'] = self.L[:, :, 0, 'z'] - self.itA[:, :, -1, 'x'] = self.iA[:, :, 0, 'x'] - self.itA[:, :, -1, 'y'] = self.iA[:, :, 0, 'y'] - - self.tDs = diags(self.tL.toarray(), shape=(3*self.N, 3*self.N), dtype=float) - self.itDa = diags(self.itA.toarray(), shape=(3*self.N, 3*self.N), dtype=float) + if any(True for x in self.bc_low if x.lower() == "abc") or any( + True for x in self.bc_high if x.lower() == "abc" + ): + if self.bc_high[0].lower() == "abc": + self.tL[-1, :, :, "x"] = self.L[0, :, :, "x"] + self.itA[-1, :, :, "y"] = self.iA[0, :, :, "y"] + self.itA[-1, :, :, "z"] = self.iA[0, :, :, "z"] + + if self.bc_high[1].lower() == "abc": + self.tL[:, -1, :, "y"] = self.L[:, 0, :, "y"] + self.itA[:, -1, :, "x"] = self.iA[:, 0, :, "x"] + self.itA[:, -1, :, "z"] = self.iA[:, 0, :, "z"] + + if self.bc_high[2].lower() == "abc": + self.tL[:, :, -1, "z"] = self.L[:, :, 0, "z"] + self.itA[:, :, -1, "x"] = self.iA[:, :, 0, "x"] + self.itA[:, :, -1, "y"] = self.iA[:, :, 0, "y"] + + self.tDs = diags( + self.tL.toarray(), shape=(3 * self.N, 3 * self.N), dtype=float + ) + self.itDa = diags( + self.itA.toarray(), shape=(3 * self.N, 3 * self.N), dtype=float + ) self.activate_abc = True # Perfect Matching Layers (PML) - if any(True for x in self.bc_low if x.lower() == 'pml') \ - or any(True for x in self.bc_high if x.lower() == 'pml'): + if any(True for x in self.bc_low if x.lower() == "pml") or any( + True for x in self.bc_high if x.lower() == "pml" + ): self.activate_pml = True self.use_conductivity = True def fill_pml_sigmas(self): - ''' + """ Routine to calculate pml sigmas and apply them to the conductivity tensor sigma [IN-PROGRESS] - ''' + """ # Initialize sx, sy, sz = np.zeros(self.Nx), np.zeros(self.Ny), np.zeros(self.Nz) @@ -853,202 +967,205 @@ def fill_pml_sigmas(self): #self.ieps[:, :, -k, d] = 1/(np.mean(sz[-self.n_pml:])*eps_0) def get_abc(self): - ''' + """ Save the n-2 timestep to apply ABC - ''' + """ E_abc, H_abc = {}, {} - if self.bc_low[0].lower() == 'abc': + if self.bc_low[0].lower() == "abc": E_abc[0] = {} H_abc[0] = {} - for d in ['x', 'y', 'z']: - E_abc[0][d+'lo'] = self.E[1, :, :, d] - H_abc[0][d+'lo'] = self.H[1, :, :, d] + for d in ["x", "y", "z"]: + E_abc[0][d + "lo"] = self.E[1, :, :, d] + H_abc[0][d + "lo"] = self.H[1, :, :, d] - if self.bc_low[1].lower() == 'abc': + if self.bc_low[1].lower() == "abc": E_abc[1] = {} H_abc[1] = {} - for d in ['x', 'y', 'z']: - E_abc[1][d+'lo'] = self.E[:, 1, :, d] - H_abc[1][d+'lo'] = self.H[:, 1, :, d] + for d in ["x", "y", "z"]: + E_abc[1][d + "lo"] = self.E[:, 1, :, d] + H_abc[1][d + "lo"] = self.H[:, 1, :, d] - if self.bc_low[2].lower() == 'abc': + if self.bc_low[2].lower() == "abc": E_abc[2] = {} H_abc[2] = {} - for d in ['x', 'y', 'z']: - E_abc[2][d+'lo'] = self.E[:, :, 1, d] - H_abc[2][d+'lo'] = self.H[:, :, 1, d] + for d in ["x", "y", "z"]: + E_abc[2][d + "lo"] = self.E[:, :, 1, d] + H_abc[2][d + "lo"] = self.H[:, :, 1, d] - if self.bc_high[0].lower() == 'abc': + if self.bc_high[0].lower() == "abc": E_abc[0] = {} H_abc[0] = {} - for d in ['x', 'y', 'z']: - E_abc[0][d+'hi'] = self.E[-1, :, :, d] - H_abc[0][d+'hi'] = self.H[-1, :, :, d] + for d in ["x", "y", "z"]: + E_abc[0][d + "hi"] = self.E[-1, :, :, d] + H_abc[0][d + "hi"] = self.H[-1, :, :, d] - if self.bc_high[1].lower() == 'abc': + if self.bc_high[1].lower() == "abc": E_abc[1] = {} H_abc[1] = {} - for d in ['x', 'y', 'z']: - E_abc[1][d+'hi'] = self.E[:, -1, :, d] - H_abc[1][d+'hi'] = self.H[:, -1, :, d] + for d in ["x", "y", "z"]: + E_abc[1][d + "hi"] = self.E[:, -1, :, d] + H_abc[1][d + "hi"] = self.H[:, -1, :, d] - if self.bc_high[2].lower() == 'abc': + if self.bc_high[2].lower() == "abc": E_abc[2] = {} H_abc[2] = {} - for d in ['x', 'y', 'z']: - E_abc[2][d+'hi'] = self.E[:, :, -1, d] - H_abc[2][d+'hi'] = self.H[:, :, -1, d] + for d in ["x", "y", "z"]: + E_abc[2][d + "hi"] = self.E[:, :, -1, d] + H_abc[2][d + "hi"] = self.H[:, :, -1, d] return E_abc, H_abc def update_abc(self, E_abc, H_abc): - ''' + """ Apply ABC algo to the selected BC, to be applied after each timestep - ''' + """ - if self.bc_low[0].lower() == 'abc': - for d in ['x', 'y', 'z']: - self.E[0, :, :, d] = E_abc[0][d+'lo'] - self.H[0, :, :, d] = H_abc[0][d+'lo'] + if self.bc_low[0].lower() == "abc": + for d in ["x", "y", "z"]: + self.E[0, :, :, d] = E_abc[0][d + "lo"] + self.H[0, :, :, d] = H_abc[0][d + "lo"] - if self.bc_low[1].lower() == 'abc': - for d in ['x', 'y', 'z']: - self.E[:, 0, :, d] = E_abc[1][d+'lo'] - self.H[:, 0, :, d] = H_abc[1][d+'lo'] + if self.bc_low[1].lower() == "abc": + for d in ["x", "y", "z"]: + self.E[:, 0, :, d] = E_abc[1][d + "lo"] + self.H[:, 0, :, d] = H_abc[1][d + "lo"] - if self.bc_low[2].lower() == 'abc': - for d in ['x', 'y', 'z']: - self.E[:, :, 0, d] = E_abc[2][d+'lo'] - self.H[:, :, 0, d] = H_abc[2][d+'lo'] + if self.bc_low[2].lower() == "abc": + for d in ["x", "y", "z"]: + self.E[:, :, 0, d] = E_abc[2][d + "lo"] + self.H[:, :, 0, d] = H_abc[2][d + "lo"] - if self.bc_high[0].lower() == 'abc': - for d in ['x', 'y', 'z']: - self.E[-1, :, :, d] = E_abc[0][d+'hi'] - self.H[-1, :, :, d] = H_abc[0][d+'hi'] + if self.bc_high[0].lower() == "abc": + for d in ["x", "y", "z"]: + self.E[-1, :, :, d] = E_abc[0][d + "hi"] + self.H[-1, :, :, d] = H_abc[0][d + "hi"] - if self.bc_high[1].lower() == 'abc': - for d in ['x', 'y', 'z']: - self.E[:, -1, :, d] = E_abc[1][d+'hi'] - self.H[:, -1, :, d] = H_abc[1][d+'hi'] + if self.bc_high[1].lower() == "abc": + for d in ["x", "y", "z"]: + self.E[:, -1, :, d] = E_abc[1][d + "hi"] + self.H[:, -1, :, d] = H_abc[1][d + "hi"] - if self.bc_high[2].lower() == 'abc': - for d in ['x', 'y', 'z']: - self.E[:, :, -1, d] = E_abc[2][d+'hi'] - self.H[:, :, -1, d] = H_abc[2][d+'hi'] + if self.bc_high[2].lower() == "abc": + for d in ["x", "y", "z"]: + self.E[:, :, -1, d] = E_abc[2][d + "hi"] + self.H[:, :, -1, d] = H_abc[2][d + "hi"] def set_ghosts_to_0(self): - ''' + """ Cleanup for initial conditions if they are accidentally applied to the ghost cells - ''' + """ # Set H ghost quantities to 0 - for d in ['x', 'y', 'z']: #tangential to zero - if d != 'x': - self.H[-1, :, :, d] = 0. - if d != 'y': - self.H[:, -1, :, d] = 0. - if d != 'z': - self.H[:, :, -1, d] = 0. + for d in ["x", "y", "z"]: # tangential to zero + if d != "x": + self.H[-1, :, :, d] = 0.0 + if d != "y": + self.H[:, -1, :, d] = 0.0 + if d != "z": + self.H[:, :, -1, d] = 0.0 # Set E ghost quantities to 0 - self.E[-1, :, :, 'x'] = 0. - self.E[:, -1, :, 'y'] = 0. - self.E[:, :, -1, 'z'] = 0. + self.E[-1, :, :, "x"] = 0.0 + self.E[:, -1, :, "y"] = 0.0 + self.E[:, :, -1, "z"] = 0.0 def apply_conductors(self): - ''' + """ Set the 1/epsilon values inside the PEC conductors to zero - ''' - self.flag_in_conductors = self.grid.flag_int_cell_yz[:-1,:,:] \ - + self.grid.flag_int_cell_zx[:,:-1,:] \ - + self.grid.flag_int_cell_xy[:,:,:-1] + """ + self.flag_in_conductors = ( + self.grid.flag_int_cell_yz[:-1, :, :] + + self.grid.flag_int_cell_zx[:, :-1, :] + + self.grid.flag_int_cell_xy[:, :, :-1] + ) self.ieps *= self.flag_in_conductors def set_field_in_conductors_to_0(self): - ''' + """ Cleanup for initial conditions if they are accidentally applied to the conductors - ''' - self.flag_cleanup = self.grid.flag_int_cell_yz[:-1,:,:] \ - + self.grid.flag_int_cell_zx[:,:-1,:] \ - + self.grid.flag_int_cell_xy[:,:,:-1] + """ + self.flag_cleanup = ( + self.grid.flag_int_cell_yz[:-1, :, :] + + self.grid.flag_int_cell_zx[:, :-1, :] + + self.grid.flag_int_cell_xy[:, :, :-1] + ) self.H *= self.flag_cleanup self.E *= self.flag_cleanup def apply_stl(self): - ''' + """ Mask the cells inside the stl and assing the material defined by the user * Note: stl material should contain **relative** epsilon and mu ** Note 2: when assigning the stl material, the default values 1./eps_0 and 1./mu_0 are substracted - ''' + """ grid = self.grid.grid self.stl_solids = self.grid.stl_solids self.stl_materials = self.grid.stl_materials self.stl_colors = self.grid.stl_colors for key in self.stl_solids.keys(): - mask = np.reshape(grid[key], (self.Nx, self.Ny, self.Nz)).astype(int) if type(self.stl_materials[key]) is str: # Retrieve from material library mat_key = self.stl_materials[key].lower() - eps = material_lib[mat_key][0]*eps_0 - mu = material_lib[mat_key][1]*mu_0 + eps = material_lib[mat_key][0] * eps_0 + mu = material_lib[mat_key][1] * mu_0 # Setting to zero - self.ieps += self.ieps * (-1.0*mask) - self.imu += self.imu * (-1.0*mask) + self.ieps += self.ieps * (-1.0 * mask) + self.imu += self.imu * (-1.0 * mask) # Adding new values - self.ieps += mask * 1./eps - self.imu += mask * 1./mu + self.ieps += mask * 1.0 / eps + self.imu += mask * 1.0 / mu # Conductivity if len(material_lib[mat_key]) == 3: sigma = material_lib[mat_key][2] - self.sigma += self.sigma * (-1.0*mask) + self.sigma += self.sigma * (-1.0 * mask) self.sigma += mask * sigma self.use_conductivity = True - elif self.sigma_bg > 0.0: # assumed sigma = 0 - self.sigma += self.sigma * (-1.0*mask) + elif self.sigma_bg > 0.0: # assumed sigma = 0 + self.sigma += self.sigma * (-1.0 * mask) else: # From input - eps = self.stl_materials[key][0]*eps_0 - mu = self.stl_materials[key][1]*mu_0 + eps = self.stl_materials[key][0] * eps_0 + mu = self.stl_materials[key][1] * mu_0 # Setting to zero - self.ieps += self.ieps * (-1.0*mask) - self.imu += self.imu * (-1.0*mask) + self.ieps += self.ieps * (-1.0 * mask) + self.imu += self.imu * (-1.0 * mask) # Adding new values - self.ieps += mask * 1./eps - self.imu += mask * 1./mu + self.ieps += mask * 1.0 / eps + self.imu += mask * 1.0 / mu # Conductivity if len(self.stl_materials[key]) == 3: sigma = self.stl_materials[key][2] - self.sigma += self.sigma * (-1.0*mask) + self.sigma += self.sigma * (-1.0 * mask) self.sigma += mask * sigma self.use_conductivity = True - elif self.sigma_bg > 0.0: # assumed sigma = 0 - self.sigma += self.sigma * (-1.0*mask) + elif self.sigma_bg > 0.0: # assumed sigma = 0 + self.sigma += self.sigma * (-1.0 * mask) def attrcleanup(self): # Fields del self.L, self.tL, self.iA, self.itA - if hasattr(self, 'BC'): + if hasattr(self, "BC"): del self.BC del self.Dbc @@ -1078,25 +1195,25 @@ def save_state(self, filename="solver_state.h5", close=True): - If `close=False`, returns an open `h5py.File` object for further manipulation. """ - if self.use_mpi: # MPI savestate - H = self.mpi_gather_asField('H') - E = self.mpi_gather_asField('E') - J = self.mpi_gather_asField('J') + if self.use_mpi: # MPI savestate + H = self.mpi_gather_asField("H") + E = self.mpi_gather_asField("E") + J = self.mpi_gather_asField("J") if self.rank == 0: - state = h5py.File(filename, "w") - state.create_dataset("H", data=H) - state.create_dataset("E", data=E) - state.create_dataset("J", data=J) + state = h5py.File(filename, "w") + state.create_dataset("H", data=H) + state.create_dataset("E", data=E) + state.create_dataset("J", data=J) # TODO: check for MPI-GPU - elif self.use_gpu: # GPU savestate + elif self.use_gpu: # GPU savestate state = h5py.File(filename, "w") state.create_dataset("H", data=self.H.toarray().get()) state.create_dataset("E", data=self.E.toarray().get()) state.create_dataset("J", data=self.J.toarray().get()) - else: # CPU savestate + else: # CPU savestate state = h5py.File(filename, "w") state.create_dataset("H", data=self.H.toarray()) state.create_dataset("E", data=self.E.toarray()) @@ -1164,7 +1281,7 @@ def reset_fields(self): - This method is useful when reusing an existing simulation object without reinitializing all attributes. """ - for d in ['x', 'y', 'z']: + for d in ["x", "y", "z"]: self.E[:, :, :, d] = 0.0 self.H[:, :, :, d] = 0.0 self.J[:, :, :, d] = 0.0 @@ -1174,7 +1291,7 @@ def update_logger(self, attrs): Assigns the parameters handed via attrs to the logger """ for atr in attrs: - if atr == 'grid': + if atr == "grid": self.logger.grid = self.grid.logger.grid else: self.logger.solver[atr] = getattr(self, atr) diff --git a/wakis/sources.py b/wakis/sources.py index 75f51e7..204fff3 100644 --- a/wakis/sources.py +++ b/wakis/sources.py @@ -3,26 +3,28 @@ # Copyright (c) CERN, 2024. # # ########################################### # -''' +""" The `sources.py` script containts different classes -defining a time-dependent sources to be installed +defining a time-dependent sources to be installed in the electromagnetic simulation. All sources need an update function that will be called every simulation timestep, e.g.: def update(self, t, *args, **kwargs)` -''' +""" import numpy as np import matplotlib.pyplot as plt -from scipy.constants import mu_0, c as c_light +from scipy.constants import mu_0, c as c_light + class Beam: - def __init__(self, xsource=0., ysource=0., beta=1.0, - q=1e-9, sigmaz=None, ti=None): - ''' - Updates the current J every timestep - to introduce a gaussian beam + def __init__( + self, xsource=0.0, ysource=0.0, beta=1.0, q=1e-9, sigmaz=None, ti=None + ): + """ + Updates the current J every timestep + to introduce a gaussian beam moving in +z direction Parameters @@ -37,21 +39,25 @@ def __init__(self, xsource=0., ysource=0., beta=1.0, Beam longitudinal sigma [m] ti: float, default 9.55*sigmaz Injection time [s] - ''' + """ self.xsource, self.ysource = xsource, ysource self.sigmaz = sigmaz self.q = q self.beta = beta - self.v = c_light*beta - if ti is not None: + self.v = c_light * beta + if ti is not None: self.ti = ti - else: self.ti = 8.548921333333334*self.sigmaz/self.v + else: + self.ti = 8.548921333333334 * self.sigmaz / self.v self.is_first_update = True def update(self, solver, t): if self.is_first_update: - self.ixs, self.iys = np.abs(solver.x-self.xsource).argmin(), np.abs(solver.y-self.ysource).argmin() + self.ixs, self.iys = ( + np.abs(solver.x - self.xsource).argmin(), + np.abs(solver.y - self.ysource).argmin(), + ) self.is_first_update = False if hasattr(solver, 'ZMIN'): # support for MPI zminIdx = np.abs(solver.z-solver.ZMIN).argmin() @@ -59,8 +65,8 @@ def update(self, solver, t): else: self.zmin = solver.z.min() # reference shift - s0 = self.zmin - self.v*self.ti - s = solver.z - self.v*t + s0 = self.zmin - self.v * self.ti + s = solver.z - self.v * t # gaussian profile = 1/np.sqrt(2*np.pi*self.sigmaz**2)*np.exp(-(s-s0)**2/(2*self.sigmaz**2)) # update @@ -68,27 +74,41 @@ def update(self, solver, t): def plot(self, t): # reference shift - s0 = - self.v*self.ti - s = - self.v*t + s0 = -self.v * self.ti + s = -self.v * t # gaussian - profile = 1/np.sqrt(2*np.pi*self.sigmaz**2)*np.exp(-(s-s0)**2/(2*self.sigmaz**2)) - source = self.q*self.v*profile + profile = ( + 1 + / np.sqrt(2 * np.pi * self.sigmaz**2) + * np.exp(-((s - s0) ** 2) / (2 * self.sigmaz**2)) + ) + source = self.q * self.v * profile fig, ax = plt.subplots() - ax.plot(t, source, 'darkorange') - ax.set_xlabel('Time [s]') - ax.set_ylabel('Current Jz [Cm/s]', color='darkorange') - ax.set_ylim(0., +np.abs(source).max()*1.3) + ax.plot(t, source, "darkorange") + ax.set_xlabel("Time [s]") + ax.set_ylabel("Current Jz [Cm/s]", color="darkorange") + ax.set_ylim(0.0, +np.abs(source).max() * 1.3) fig.tight_layout() plt.show() + class PlaneWave: - def __init__(self, xs=None, ys=None, zs=0, nodes=None, f=None, - amplitude=1.0, beta=1.0, phase=0): - ''' - Updates the fields E and H every timestep - to introduce a planewave excitation at the given + def __init__( + self, + xs=None, + ys=None, + zs=0, + nodes=None, + f=None, + amplitude=1.0, + beta=1.0, + phase=0, + ): + """ + Updates the fields E and H every timestep + to introduce a planewave excitation at the given xs, ys slice, moving in z+ direction Parameters @@ -96,7 +116,7 @@ def __init__(self, xs=None, ys=None, zs=0, nodes=None, f=None, xs, ys: slice, default 0:N Transverse positions of the source (indexes) zs: int or slice, default 0 - Injection position in z + Injection position in z nodes: float, default 15 Number of nodes between z.min and z.max f: float, default nodes/T @@ -105,7 +125,7 @@ def __init__(self, xs=None, ys=None, zs=0, nodes=None, f=None, Relativistic beta # TODO: support different directions - ''' + """ # Check inputs and update self self.nodes = nodes self.beta = beta @@ -115,14 +135,14 @@ def __init__(self, xs=None, ys=None, zs=0, nodes=None, f=None, self.amplitude = amplitude self.is_first_update = True self.phase = phase - - self.vp = self.beta*c_light # wavefront velocity beta*c - self.w = 2*np.pi*self.f # ang. frequency - self.kz = self.w/c_light # wave number + + self.vp = self.beta * c_light # wavefront velocity beta*c + self.w = 2 * np.pi * self.f # ang. frequency + self.kz = self.w / c_light # wave number self.tmax = np.inf if self.nodes is not None: - self.tmax = self.nodes/self.f + self.tmax = self.nodes / self.f def update(self, solver, t): if self.is_first_update: @@ -134,44 +154,65 @@ def update(self, solver, t): self.is_first_update = False if t <= self.tmax: - solver.H[self.xs,self.ys,self.zs,'y'] = -self.amplitude * np.cos(self.w*t+self.phase) - solver.E[self.xs,self.ys,self.zs,'x'] = self.amplitude * np.cos(self.w*t+self.phase) /(self.kz/(mu_0*self.vp)) + solver.H[self.xs, self.ys, self.zs, "y"] = -self.amplitude * np.cos( + self.w * t + self.phase + ) + solver.E[self.xs, self.ys, self.zs, "x"] = ( + self.amplitude + * np.cos(self.w * t + self.phase) + / (self.kz / (mu_0 * self.vp)) + ) else: - solver.H[self.xs,self.ys,self.zs,'y'] = 0. - solver.E[self.xs,self.ys,self.zs,'x'] = 0. + solver.H[self.xs, self.ys, self.zs, "y"] = 0.0 + solver.E[self.xs, self.ys, self.zs, "x"] = 0.0 def plot(self, t): fig, ax = plt.subplots() - sourceH = -self.amplitude * np.cos(self.w*t+self.phase) - sourceE = self.amplitude * np.cos(self.w*t+self.phase) /(self.kz/(mu_0*self.vp)) - - sourceH[t>self.tmax] = 0. - sourceE[t>self.tmax] = 0. + sourceH = -self.amplitude * np.cos(self.w * t + self.phase) + sourceE = ( + self.amplitude + * np.cos(self.w * t + self.phase) + / (self.kz / (mu_0 * self.vp)) + ) + + sourceH[t > self.tmax] = 0.0 + sourceE[t > self.tmax] = 0.0 - ax.plot(t, sourceH, 'b') - ax.set_xlabel('Time [s]') - ax.set_ylabel('Magnetic field Hy [A/m]', color='b') + ax.plot(t, sourceH, "b") + ax.set_xlabel("Time [s]") + ax.set_ylabel("Magnetic field Hy [A/m]", color="b") ax.set_ylim(-np.abs(sourceH).max(), +np.abs(sourceH).max()) axx = ax.twinx() - axx.plot(t, sourceE, 'r') - axx.set_ylabel('Electric field Ex [V/m]', color='r') + axx.plot(t, sourceE, "r") + axx.set_ylabel("Electric field Ex [V/m]", color="r") axx.set_ylim(-np.abs(sourceE).max(), +np.abs(sourceE).max()) fig.tight_layout() plt.show() + class WavePacket: - def __init__(self, xs=None, ys=None, zs=0, - sigmaz=None, sigmaxy=None, tinj=None, - wavelength=None, f=None, - amplitude=1.0, beta=1.0, phase=0): - ''' + def __init__( + self, + xs=None, + ys=None, + zs=0, + sigmaz=None, + sigmaxy=None, + tinj=None, + wavelength=None, + f=None, + amplitude=1.0, + beta=1.0, + phase=0, + ): + """ Updates E and H fields every timestep to - introduce a 2d gaussian wave packetat the + introduce a 2d gaussian wave packetat the given xs, ys slice travelling in z+ direction - + Parameters ---- xs, ys: slice, default 0:N @@ -190,25 +231,25 @@ def __init__(self, xs=None, ys=None, zs=0, Wave packet frequency [Hz], overrides wavelength beta: float, default 1. Relativistic beta - ''' + """ self.beta = beta self.xs, self.ys = xs, ys self.zs = zs self.f = f self.wavelength = wavelength - self.sigmaxy = sigmaxy + self.sigmaxy = sigmaxy self.sigmaz = sigmaz - self.tinj = tinj - self.amplitude = amplitude + self.tinj = tinj + self.amplitude = amplitude self.phase = phase if self.f is None: - self.f = c_light/self.wavelength - self.w = 2*np.pi*self.f + self.f = c_light / self.wavelength + self.w = 2 * np.pi * self.f if self.tinj is None: - self.tinj = 6*self.sigmaz + self.tinj = 6 * self.sigmaz self.is_first_update = True @@ -223,52 +264,72 @@ def update(self, solver, t): if self.sigmaxy is None: self.sigmaxy = 5*np.mean([np.mean(solver.dx), np.mean(solver.dy)]) if self.tinj is None: - self.tinj = 6*self.sigmaz + self.tinj = 6 * self.sigmaz self.is_first_update = False - + # reference shift - s0 = solver.z.min()-self.tinj - s = solver.z.min()-self.beta*c_light*t - + s0 = solver.z.min() - self.tinj + s = solver.z.min() - self.beta * c_light * t + # 2d gaussian X, Y = np.meshgrid(solver.x[self.xs], solver.y[self.ys]) - gaussxy = np.exp(-(X**2+Y**2)/(2*self.sigmaxy**2)) - gausst = np.exp(-(s-s0)**2/(2*self.sigmaz**2)) + gaussxy = np.exp(-(X**2 + Y**2) / (2 * self.sigmaxy**2)) + gausst = np.exp(-((s - s0) ** 2) / (2 * self.sigmaz**2)) # Update - solver.H[self.xs,self.ys,self.zs,'y'] = -self.amplitude*np.cos(self.w*t+self.phase)*gaussxy*gausst - solver.E[self.xs,self.ys,self.zs,'x'] = self.amplitude*mu_0*c_light*np.cos(self.w*t+self.phase)*gaussxy*gausst - + solver.H[self.xs, self.ys, self.zs, "y"] = ( + -self.amplitude * np.cos(self.w * t + self.phase) * gaussxy * gausst + ) + solver.E[self.xs, self.ys, self.zs, "x"] = ( + self.amplitude + * mu_0 + * c_light + * np.cos(self.w * t + self.phase) + * gaussxy + * gausst + ) + def plot(self, t, zmin=0): fig, ax = plt.subplots() # compute source evolution - s0 = zmin-self.tinj - s = zmin-self.beta*c_light*t - gausst = np.exp(-(s-s0)**2/(2*self.sigmaz**2)) - - sourceH = -self.amplitude*np.cos(self.w*t+self.phase)*gausst - ax.plot(t, sourceH, 'b') - ax.set_xlabel('Time [s]') - ax.set_ylabel('Magnetic field Hy [A/m]', color='b') + s0 = zmin - self.tinj + s = zmin - self.beta * c_light * t + gausst = np.exp(-((s - s0) ** 2) / (2 * self.sigmaz**2)) + + sourceH = -self.amplitude * np.cos(self.w * t + self.phase) * gausst + ax.plot(t, sourceH, "b") + ax.set_xlabel("Time [s]") + ax.set_ylabel("Magnetic field Hy [A/m]", color="b") ax.set_ylim(-np.abs(sourceH).max(), +np.abs(sourceH).max()) - sourceE = self.amplitude*mu_0*c_light*np.cos(self.w*t+self.phase)*gausst + sourceE = ( + self.amplitude * mu_0 * c_light * np.cos(self.w * t + self.phase) * gausst + ) axx = ax.twinx() - axx.plot(t, sourceE, 'r') - axx.set_ylabel('Electric field Ex [V/m]', color='r') + axx.plot(t, sourceE, "r") + axx.set_ylabel("Electric field Ex [V/m]", color="r") axx.set_ylim(-np.abs(sourceE).max(), +np.abs(sourceE).max()) fig.tight_layout() plt.show() + class Dipole: - def __init__(self, field='E', component='z', - xs=None, ys=None, zs=None, - nodes=10, f=None, amplitude=1.0, - phase=0): - ''' + def __init__( + self, + field="E", + component="z", + xs=None, + ys=None, + zs=None, + nodes=10, + f=None, + amplitude=1.0, + phase=0, + ): + """ Updates the given field and component every timestep to introduce a dipole-like sinusoidal excitation @@ -284,7 +345,7 @@ def __init__(self, field='E', component='z', Number of nodes between z.min and z.max f: float, default nodes/T Frequency of the plane wave [Hz]. It overrides nodes param. - ''' + """ # Check inputs and update self self.nodes = nodes self.xs, self.ys, self.zs = xs, ys, zs @@ -294,44 +355,58 @@ def __init__(self, field='E', component='z', self.amplitude = amplitude self.phase = phase - if len(field) == 2: #support for e.g. field='Ex' + if len(field) == 2: # support for e.g. field='Ex' self.component = field[1] self.field = field[0] self.is_first_update = True - def update(self, solver, t): if self.is_first_update: if self.xs is None: - self.xs = int(solver.Nx/2) + self.xs = int(solver.Nx / 2) if self.ys is None: - self.ys = int(solver.Ny/2) + self.ys = int(solver.Ny / 2) if self.zs is None: - self.zs = int(solver.Nz/2) + self.zs = int(solver.Nz / 2) if self.f is None: - T = (solver.z.max()-solver.z.min())/c_light - self.f = self.nodes/T - - self.w = 2*np.pi*self.f + T = (solver.z.max() - solver.z.min()) / c_light + self.f = self.nodes / T + + self.w = 2 * np.pi * self.f self.is_first_update = False - if self.field == 'E': - solver.E[self.xs,self.ys,self.zs,self.component] = self.amplitude*np.sin(self.w*t+self.phase) - elif self.field == 'H': - solver.H[self.xs,self.ys,self.zs,self.component] = self.amplitude*np.sin(self.w*t+self.phase) - elif self.field == 'J': - solver.J[self.xs,self.ys,self.zs,self.component] = self.amplitude*np.sin(self.w*t+self.phase) + if self.field == "E": + solver.E[self.xs, self.ys, self.zs, self.component] = ( + self.amplitude * np.sin(self.w * t + self.phase) + ) + elif self.field == "H": + solver.H[self.xs, self.ys, self.zs, self.component] = ( + self.amplitude * np.sin(self.w * t + self.phase) + ) + elif self.field == "J": + solver.J[self.xs, self.ys, self.zs, self.component] = ( + self.amplitude * np.sin(self.w * t + self.phase) + ) else: print(f'Field "{self.field}" not valid, should be "E", "H" or "J"]') + class Pulse: - def __init__(self, field='E', component='z', - xs=None, ys=None, zs=None, - shape='Harris', L=None, amplitude=1.0, - delay=0.): - ''' - Injects an electromagnetic pulse at the given + def __init__( + self, + field="E", + component="z", + xs=None, + ys=None, + zs=None, + shape="Harris", + L=None, + amplitude=1.0, + delay=0.0, + ): + """ + Injects an electromagnetic pulse at the given source point (xs, ys, zs), with the selected shape, length and amplitude. @@ -349,7 +424,7 @@ def __init__(self, field='E', component='z', width of the pulse (~10*sigma) Note: injection time for the gaussian pulse t0=5*L to ensure smooth derivative. - ''' + """ # Check inputs and update self self.xs, self.ys, self.zs = xs, ys, zs @@ -360,38 +435,48 @@ def __init__(self, field='E', component='z', self.L = L self.delay = delay - if len(field) == 2: #support for e.g. field='Ex' + if len(field) == 2: # support for e.g. field='Ex' self.component = field[1] self.field = field[0] - if shape.lower() == 'harris': + if shape.lower() == "harris": self.tprofile = self.harris_pulse - elif shape.lower() == 'gaussian': + elif shape.lower() == "gaussian": self.tprofile = self.gaussian_pulse - elif shape.lower() == 'rectangular': + elif shape.lower() == "rectangular": self.tprofile = self.rectangular_pulse else: - print('** shape does not, match available types: "Harris", "Gaussian", "Rectangular"') + print( + '** shape does not, match available types: "Harris", "Gaussian", "Rectangular"' + ) self.is_first_update = True def harris_pulse(self, t): - t = t*c_light - self.delay - try: - if t0.: + t = t * c_light - self.delay + if t < self.L and t > 0.0: return 1.0 else: return 0.0 @@ -399,21 +484,27 @@ def rectangular_pulse(self, t): def update(self, solver, t): if self.is_first_update: if self.xs is None: - self.xs = int(solver.Nx/2) + self.xs = int(solver.Nx / 2) if self.ys is None: - self.ys = int(solver.Ny/2) + self.ys = int(solver.Ny / 2) if self.zs is None: - self.zs = int(solver.Nz/2) + self.zs = int(solver.Nz / 2) if self.L is None: - self.L = 50*solver.dt + self.L = 50 * solver.dt self.is_first_update = False - if self.field == 'E': - solver.E[self.xs,self.ys,self.zs,self.component] = self.amplitude*self.tprofile(t) - elif self.field == 'H': - solver.H[self.xs,self.ys,self.zs,self.component] = self.amplitude*self.tprofile(t) - elif self.field == 'J': - solver.J[self.xs,self.ys,self.zs,self.component] = self.amplitude*self.tprofile(t) + if self.field == "E": + solver.E[self.xs, self.ys, self.zs, self.component] = ( + self.amplitude * self.tprofile(t) + ) + elif self.field == "H": + solver.H[self.xs, self.ys, self.zs, self.component] = ( + self.amplitude * self.tprofile(t) + ) + elif self.field == "J": + solver.J[self.xs, self.ys, self.zs, self.component] = ( + self.amplitude * self.tprofile(t) + ) else: - print(f'Field "{self.field}" not valid, should be "E", "H" or "J"]') \ No newline at end of file + print(f'Field "{self.field}" not valid, should be "E", "H" or "J"]') diff --git a/wakis/wakeSolver.py b/wakis/wakeSolver.py index 1a63c93..569822b 100644 --- a/wakis/wakeSolver.py +++ b/wakis/wakeSolver.py @@ -14,8 +14,9 @@ from .logger import Logger -class WakeSolver(): - ''' Class for wake potential and impedance + +class WakeSolver: + """Class for wake potential and impedance calculation from 3D time domain E fields ''' @@ -109,13 +110,13 @@ def __init__(self, wakelength=None, q=1e-9, sigmaz=1e-3, beta=1.0, Number of transverse cells used for the 3d calculation: 2*n+1 This determines de size of the 3d wake potential - ''' + """ - #beam + # beam self.q = q self.sigmaz = sigmaz self.beta = beta - self.v = self.beta*c_light + self.v = self.beta * c_light self.xsource, self.ysource = xsource, ysource self.xtest, self.ytest = xtest, ytest self.chargedist = chargedist @@ -126,26 +127,28 @@ def __init__(self, wakelength=None, q=1e-9, sigmaz=1e-3, beta=1.0, self.counter_moving = counter_moving - if add_space is not None: #legacy support for add_space + if add_space is not None: # legacy support for add_space self.skip_cells = add_space # Injection time if ti is not None: self.ti = ti else: - #ti = 8.548921333333334*self.sigmaz/self.v #injection time as in CST for beta = 1 - ti = 8.548921333333334*self.sigmaz/(np.sqrt(self.beta)*self.v) #injection time as in CST for beta <=1 + # ti = 8.548921333333334*self.sigmaz/self.v #injection time as in CST for beta = 1 + ti = ( + 8.548921333333334 * self.sigmaz / (np.sqrt(self.beta) * self.v) + ) # injection time as in CST for beta <=1 self.ti = ti - #field + # field self.Ez_file = Ez_file self.Ez_hf = None - self.Ezt = None #Ez(x_t, y_t, z, t) + self.Ezt = None # Ez(x_t, y_t, z, t) self.t = None - self.xf, self.yf, self.zf = None, None, None #field subdomain - self.x, self.y, self.z = None, None, None #full simulation domain + self.xf, self.yf, self.zf = None, None, None # field subdomain + self.x, self.y, self.z = None, None, None # full simulation domain - #solver init + # solver init self.wakelength = wakelength self.s = None self.lambdas = None @@ -158,26 +161,26 @@ def __init__(self, wakelength=None, q=1e-9, sigmaz=1e-3, beta=1.0, self.Zx, self.Zy = None, None self.lambdaf = None - #user + # user self.verbose = verbose self.logger = Logger() self.save = save self.folder = results_folder - if not self.folder.endswith('/'): - self.folder+='/' + if not self.folder.endswith("/"): + self.folder += "/" if self.Ez_file is None: - self.Ez_file=self.folder+'Ez.h5' + self.Ez_file = self.folder + "Ez.h5" if self.save: if not os.path.exists(self.folder): os.mkdir(self.folder) - + self.assign_logs() def solve(self, compute_plane=None, **kwargs): - ''' + """ Perform the wake potential and impedance for longitudinal and transverse plane - ''' + """ if compute_plane is None: compute_plane = self.compute_plane @@ -186,53 +189,57 @@ def solve(self, compute_plane=None, **kwargs): t0 = time.time() - if compute_plane.lower() == 'both' or 'transverse': + if compute_plane.lower() == "both" or "transverse": # Obtain longitudinal Wake potential self.calc_long_WP_3d() - #Obtain transverse Wake potential + # Obtain transverse Wake potential self.calc_trans_WP() - #Obtain the longitudinal impedance + # Obtain the longitudinal impedance self.calc_long_Z() - #Obtain transverse impedance + # Obtain transverse impedance self.calc_trans_Z() - elif compute_plane == 'longitudinal': + elif compute_plane == "longitudinal": # Obtain longitudinal Wake potential self.calc_long_WP() - #Obtain the longitudinal impedance + # Obtain the longitudinal impedance self.calc_long_Z() - #Elapsed time + # Elapsed time t1 = time.time() - totalt = t1-t0 - self.log('Calculation terminated in %ds' %totalt) + totalt = t1 - t0 + self.log("Calculation terminated in %ds" % totalt) def update_long_WP(self, t): - '''WIP + """WIP calculation of wake potential on the fly TODO: simplify logic, add transverse WP - ''' + """ - it = int(t/self.dt) + it = int(t / self.dt) if it == 0: # --- setup once before time loop --- # self.s already computed as in your calc_long_WP - self.s = np.arange(-self.ti*self.v, self.wake.wakelength, self.dt*self.v) # 1D array of s-values (m) + self.s = np.arange( + -self.ti * self.v, self.wake.wakelength, self.dt * self.v + ) # 1D array of s-values (m) self.WP = np.zeros_like(self.s, dtype=np.float64) # accumulator # --- inside your time loop, after Ez is updated for current timestep `it` --- # get Ez at the probe (shape nz,) # if you store Ez as Ezt[k, it] style, do: - Ez_curr = self.E[self.Nx//2, self.Ny//2, :, 'z'] # or extract from self.E at (xmid, ymid, :) if not using Ezt + Ez_curr = self.E[ + self.Nx // 2, self.Ny // 2, :, "z" + ] # or extract from self.E at (xmid, ymid, :) if not using Ezt # compute s values for each z where current Ez contributes s_vals = self.v * t - self.v * self.ti + np.min(self.z) - self.z # convert to fractional index in s-array - idxf = (s_vals - self.s[0]) / (self.v*self.dt) # float indices + idxf = (s_vals - self.s[0]) / (self.v * self.dt) # float indices # mask in-range contributions mask = (idxf >= 0.0) & (idxf <= (len(self.s) - 1)) @@ -248,7 +255,7 @@ def update_long_WP(self, t): frac = idxf_m - i0 # handle points that land exactly on last bin: we add all to last bin - last_bin_mask = (i0 >= len(self.s) - 1) + last_bin_mask = i0 >= len(self.s) - 1 if np.any(last_bin_mask): # assign entirely to last bin (no i0+1 available) self.WP[-1] += np.sum(Ez_m[last_bin_mask]) * self.dz @@ -261,15 +268,19 @@ def update_long_WP(self, t): # accumulate with linear interpolation weights if i0.size: # faster: use bincount - left = np.bincount(i0, weights=Ez_m * (1.0 - frac) * self.dz, minlength=len(self.s)) - right = np.bincount(i0 + 1, weights=Ez_m * frac * self.dz, minlength=len(self.s)) + left = np.bincount( + i0, weights=Ez_m * (1.0 - frac) * self.dz, minlength=len(self.s) + ) + right = np.bincount( + i0 + 1, weights=Ez_m * frac * self.dz, minlength=len(self.s) + ) self.WP += left + right - if it == self.Nt-1: - self.WP = self.WP/(self.q*1e12) + if it == self.Nt - 1: + self.WP = self.WP / (self.q * 1e12) - def calc_long_WP(self, Ezt=None,**kwargs): - ''' + def calc_long_WP(self, Ezt=None, **kwargs): + """ Obtains the wake potential from the pre-computed longitudinal Ez(z,t) field from the specified solver. Parameters can be passed as **kwargs. @@ -293,7 +304,7 @@ def calc_long_WP(self, Ezt=None,**kwargs): Ez_file : str, default 'Ez.h5' HDF5 file containing the Ez(x, y, z) field data for every timestep. Needed only if Ezt is not provided. - ''' + """ for key, val in kwargs.items(): setattr(self, key, val) @@ -306,7 +317,7 @@ def calc_long_WP(self, Ezt=None,**kwargs): # time variables nt = len(self.t) - dt = self.t[2]-self.t[1] + dt = self.t[2] - self.t[1] ti = self.ti # longitudinal variables @@ -314,7 +325,7 @@ def calc_long_WP(self, Ezt=None,**kwargs): zmax = np.max(self.zf) #should it be domain's edge instead? zmin = np.min(self.zf) - if self.skip_cells !=0: + if self.skip_cells != 0: zz = slice(self.skip_cells, -self.skip_cells) else: zz = np.s_[:] @@ -325,32 +336,32 @@ def calc_long_WP(self, Ezt=None,**kwargs): if self.wakelength is not None: wakelength = self.wakelength else: - wakelength = nt*dt*self.v - (zmax-zmin) - ti*self.v + wakelength = nt * dt * self.v - (zmax - zmin) - ti * self.v self.wakelength = wakelength - s = np.arange(-self.ti*self.v, wakelength, dt*self.v) + s = np.arange(-self.ti * self.v, wakelength, dt * self.v) - self.log('Max simulated time = '+str(round(self.t[-1]*1.0e9,4))+' ns') - self.log('Wakelength = '+str(round(wakelength,3))+'m') + self.log("Max simulated time = " + str(round(self.t[-1] * 1.0e9, 4)) + " ns") + self.log("Wakelength = " + str(round(wakelength, 3)) + "m") # Initialize WP = np.zeros_like(s) keys = list(self.Ez_hf.keys()) # check for rounding errors - if nt > len(keys)-4: - nt = len(keys)-4 - self.log('*** rounding error in number of timesteps') + if nt > len(keys) - 4: + nt = len(keys) - 4 + self.log("*** rounding error in number of timesteps") # Assembly Ez field - self.log('Assembling Ez field...') - Ezt = np.zeros((nz,nt)) #Assembly Ez field + self.log("Assembling Ez field...") + Ezt = np.zeros((nz, nt)) # Assembly Ez field Ez = self.Ez_hf[keys[0]] if len(Ez.shape) == 3: for n in range(nt): Ez = self.Ez_hf[keys[n]] - Ezt[:, n] = Ez[Ez.shape[0]//2+1,Ez.shape[1]//2+1,zz] + Ezt[:, n] = Ez[Ez.shape[0] // 2 + 1, Ez.shape[1] // 2 + 1, zz] elif len(Ez.shape) == 1: for n in range(nt): @@ -358,26 +369,30 @@ def calc_long_WP(self, Ezt=None,**kwargs): self.Ezt = Ezt # integral of (Ez(xtest, ytest, z, t=(s+z)/c))dz - print('Calculating longitudinal wake potential WP(s)...') - with tqdm(total=len(s)*len(z)) as pbar: + print("Calculating longitudinal wake potential WP(s)...") + with tqdm(total=len(s) * len(z)) as pbar: for n in range(len(s)): for k in range(nz): - ts = (z[k]+s[n])/self.v-zmin/self.v-self.t[0]+ti - it = int(ts/dt) #find index for t + ts = (z[k] + s[n]) / self.v - zmin / self.v - self.t[0] + ti + it = int(ts / dt) # find index for t if it < nt: WP[n] = WP[n]+(Ezt[k, it])*self.dz[k] #compute integral pbar.update(1) - WP = WP/(self.q*1e12) # [V/pC] + WP = WP / (self.q * 1e12) # [V/pC] self.s = s self.WP = WP if self.save: - np.savetxt(self.folder+'WP.txt', np.c_[self.s,self.WP], header=' s [m]'+' '*20+'WP [V/pC]'+'\n'+'-'*48) + np.savetxt( + self.folder + "WP.txt", + np.c_[self.s, self.WP], + header=" s [m]" + " " * 20 + "WP [V/pC]" + "\n" + "-" * 48, + ) def calc_long_WP_3d(self, **kwargs): - ''' + """ Obtains the 3d wake potential from the pre-computed Ez(x,y,z) field from the specified solver. The calculation Parameters can be passed as **kwargs. @@ -395,10 +410,10 @@ def calc_long_WP_3d(self, **kwargs): n_transverse_cells : int, default 1 Number of transverse cells used for the 3d calculation: 2*n+1 This determines de size of the 3d wake potential - ''' - self.log('\n') - self.log('Longitudinal wake potential') - self.log('-'*24) + """ + self.log("\n") + self.log("Longitudinal wake potential") + self.log("-" * 24) for key, val in kwargs.items(): setattr(self, key, val) @@ -409,7 +424,7 @@ def calc_long_WP_3d(self, **kwargs): # time variables nt = len(self.t) - dt = self.t[2]-self.t[1] + dt = self.t[2] - self.t[1] ti = self.ti # longitudinal varianles @@ -417,7 +432,7 @@ def calc_long_WP_3d(self, **kwargs): zmax = np.max(self.zf) zmin = np.min(self.zf) - if self.skip_cells !=0: + if self.skip_cells != 0: zz = slice(self.skip_cells, -self.skip_cells) else: zz = np.s_[:] @@ -428,71 +443,83 @@ def calc_long_WP_3d(self, **kwargs): if self.wakelength is not None: wakelength = self.wakelength else: - wakelength = nt*dt*self.v - (zmax-zmin) - ti*self.v + wakelength = nt * dt * self.v - (zmax - zmin) - ti * self.v self.wakelength = wakelength - s = np.arange(-self.ti*self.v, wakelength, dt*self.v) + s = np.arange(-self.ti * self.v, wakelength, dt * self.v) - self.log(f'* Max simulated time = {np.max(self.t)} s') - self.log(f'* Wakelength = {wakelength} m') + self.log(f"* Max simulated time = {np.max(self.t)} s") + self.log(f"* Wakelength = {wakelength} m") - #field subvolume in No.cells for x, y + # field subvolume in No.cells for x, y i0, j0 = self.n_transverse_cells, self.n_transverse_cells WP = np.zeros_like(s) - WP_3d = np.zeros((i0*2+1,j0*2+1,len(s))) - Ezt = np.zeros((nz,nt)) + WP_3d = np.zeros((i0 * 2 + 1, j0 * 2 + 1, len(s))) + Ezt = np.zeros((nz, nt)) keys = list(self.Ez_hf.keys()) # check for rounding errors - if nt > len(keys)-4: - nt = len(keys)-4 - self.log('*** rounding error in number of timesteps') - - print('Calculating longitudinal wake potential WP(s)') - with tqdm(total=len(s)*(i0*2+1)*(j0*2+1)) as pbar: - for i in range(-i0,i0+1,1): - for j in range(-j0,j0+1,1): - + if nt > len(keys) - 4: + nt = len(keys) - 4 + self.log("*** rounding error in number of timesteps") + + print("Calculating longitudinal wake potential WP(s)") + with tqdm(total=len(s) * (i0 * 2 + 1) * (j0 * 2 + 1)) as pbar: + for i in range(-i0, i0 + 1, 1): + for j in range(-j0, j0 + 1, 1): # Assembly Ez field for n in range(nt): Ez = self.Ez_hf[keys[n]] - Ezt[:, n] = Ez[Ez.shape[0]//2+i,Ez.shape[1]//2+j, zz] + Ezt[:, n] = Ez[Ez.shape[0] // 2 + i, Ez.shape[1] // 2 + j, zz] # integral of (Ez(xtest, ytest, z, t=(s+z)/c))dz if self.counter_moving: for n in range(len(s)): for k in range(nz): - ts = (z[-k - 1] - s[n]) / (-1 * self.v) - zmax / (-1 * self.v) - self.t[0] + ti + ts = ( + (z[-k - 1] - s[n]) / (-1 * self.v) + - zmax / (-1 * self.v) + - self.t[0] + + ti + ) it = int(ts / dt) # find index for t if it < nt: WP[n] = WP[n] + (Ezt[-k - 1, it]) * (-1 * self.dz[k]) # compute integral pbar.update(1) - else: for n in range(len(s)): for k in range(nz): - ts = (z[k]+s[n])/self.v-zmin/self.v-self.t[0]+ti + ts = ( + (z[k] + s[n]) / self.v + - zmin / self.v + - self.t[0] + + ti + ) it = int(ts / dt) # find index for t if it < nt: WP[n] = WP[n] + (Ezt[k, it]) * self.dz[k] # compute integral pbar.update(1) - WP = WP/(self.q*1e12) # [V/pC] - WP_3d[i0+i,j0+j,:] = WP + WP = WP / (self.q * 1e12) # [V/pC] + WP_3d[i0 + i, j0 + j, :] = WP self.s = s - self.WP = WP_3d[i0,j0,:] + self.WP = WP_3d[i0, j0, :] self.WP_3d = WP_3d - self.log(f'Elapsed time {pbar.format_dict["elapsed"]} s') + self.log(f"Elapsed time {pbar.format_dict['elapsed']} s") if self.save: - np.savetxt(self.folder+'WP.txt', np.c_[self.s, self.WP], header=' s [m]'+' '*20+'WP [V/pC]'+'\n'+'-'*48) + np.savetxt( + self.folder + "WP.txt", + np.c_[self.s, self.WP], + header=" s [m]" + " " * 20 + "WP [V/pC]" + "\n" + "-" * 48, + ) def calc_trans_WP(self, **kwargs): - ''' + """ Obtains the transverse wake potential from the longitudinal wake potential in 3d using the Panofsky-Wenzel theorem using a second-order scheme for the gradient calculation @@ -517,15 +544,15 @@ def calc_trans_WP(self, **kwargs): n_transverse_cells : int, default 1 Number of transverse cells used for the 3d calculation: 2*n+1 This determines de size of the 3d wake potential - ''' + """ for key, val in kwargs.items(): setattr(self, key, val) - self.log('\n') - self.log('Transverse wake potential') - self.log('-'*24) - self.log(f'* No. transverse cells = {self.n_transverse_cells}') + self.log("\n") + self.log("Transverse wake potential") + self.log("-" * 24) + self.log(f"* No. transverse cells = {self.n_transverse_cells}") ds = self.s[2]-self.s[1] i0, j0 = self.n_transverse_cells, self.n_transverse_cells @@ -535,14 +562,16 @@ def calc_trans_WP(self, **kwargs): WPy = np.zeros_like(self.s) int_WP = np.zeros_like(self.WP_3d) - print('Calculating transverse wake potential WPx, WPy...') + print("Calculating transverse wake potential WPx, WPy...") # Obtain the transverse wake potential - with tqdm(total=len(self.s)*(i0*2+1)*(j0*2+1)) as pbar: + with tqdm(total=len(self.s) * (i0 * 2 + 1) * (j0 * 2 + 1)) as pbar: for n in range(len(self.s)): - for i in range(-i0,i0+1,1): - for j in range(-j0,j0+1,1): + for i in range(-i0, i0 + 1, 1): + for j in range(-j0, j0 + 1, 1): # Perform the integral - int_WP[i0+i,j0+j,n]=np.sum(self.WP_3d[i0+i,j0+j,0:n])*ds + int_WP[i0 + i, j0 + j, n] = ( + np.sum(self.WP_3d[i0 + i, j0 + j, 0:n]) * ds + ) pbar.update(1) # Perform the gradient (second order scheme) @@ -552,14 +581,22 @@ def calc_trans_WP(self, **kwargs): self.WPx = WPx self.WPy = WPy - self.log(f'Elapsed time {pbar.format_dict["elapsed"]} s') + self.log(f"Elapsed time {pbar.format_dict['elapsed']} s") if self.save: - np.savetxt(self.folder+'WPx.txt', np.c_[self.s,self.WPx], header=' s [m]'+' '*20+'WP [V/pC]'+'\n'+'-'*48) - np.savetxt(self.folder+'WPy.txt', np.c_[self.s,self.WPx], header=' s [m]'+' '*20+'WP [V/pC]'+'\n'+'-'*48) + np.savetxt( + self.folder + "WPx.txt", + np.c_[self.s, self.WPx], + header=" s [m]" + " " * 20 + "WP [V/pC]" + "\n" + "-" * 48, + ) + np.savetxt( + self.folder + "WPy.txt", + np.c_[self.s, self.WPx], + header=" s [m]" + " " * 20 + "WP [V/pC]" + "\n" + "-" * 48, + ) def calc_long_Z(self, samples=1001, fmax=None, **kwargs): - ''' + """ Obtains the longitudinal impedance from the longitudinal wake potential and the beam charge distribution using a single-sided DFT with 1000 samples. @@ -584,16 +621,16 @@ def calc_long_Z(self, samples=1001, fmax=None, **kwargs): sigmaz : float Beam sigma in the longitudinal direction [m]. Used to calculate maximum frequency of interest fmax=c/(3*sigmaz) - ''' - self.log('\n') - self.log('Longitudinal impedance') - self.log('-'*24) + """ + self.log("\n") + self.log("Longitudinal impedance") + self.log("-" * 24) for key, val in kwargs.items(): setattr(self, key, val) - print('Calculating longitudinal impedance Z...') - self.log(f'Single sided DFT with number of samples = {samples}') + print("Calculating longitudinal impedance Z...") + self.log(f"Single sided DFT with number of samples = {samples}") # setup charge distribution in s if self.lambdas is None and self.chargedist is not None: @@ -601,72 +638,92 @@ def calc_long_Z(self, samples=1001, fmax=None, **kwargs): elif self.lambdas is None and self.chargedist is None: self.calc_lambdas_analytic() try: - self.log('! Using analytic charge distribution λ(s) since no data was provided') - except Exception: #ascii encoder error handling - self.log('! Using analytic charge distribution since no data was provided') + self.log( + "! Using analytic charge distribution λ(s) since no data was provided" + ) + except Exception: # ascii encoder error handling + self.log( + "! Using analytic charge distribution since no data was provided" + ) # Set up the DFT computation - ds = np.mean(self.s[1:]-self.s[:-1]) + ds = np.mean(self.s[1:] - self.s[:-1]) if fmax is None: - fmax = self.v/self.sigmaz/3 #max frequency of interest - N = int((self.v/ds)//fmax*samples) #to obtain a 1000 sample single-sided DFT + fmax = self.v / self.sigmaz / 3 # max frequency of interest + N = int( + (self.v / ds) // fmax * samples + ) # to obtain a 1000 sample single-sided DFT # Obtain DFTs - is it v or c? - lambdafft = np.fft.fft(self.lambdas*self.v, n=N) - WPfft = np.fft.fft(self.WP*1e12, n=N) - ffft = np.fft.fftfreq(len(WPfft), ds/self.v) + lambdafft = np.fft.fft(self.lambdas * self.v, n=N) + WPfft = np.fft.fft(self.WP * 1e12, n=N) + ffft = np.fft.fftfreq(len(WPfft), ds / self.v) # Mask invalid frequencies - mask = np.logical_and(ffft >= 0 , ffft < fmax) - WPf = WPfft[mask]*ds - lambdaf = lambdafft[mask]*ds - self.f = ffft[mask] # Positive frequencies + mask = np.logical_and(ffft >= 0, ffft < fmax) + WPf = WPfft[mask] * ds + lambdaf = lambdafft[mask] * ds + self.f = ffft[mask] # Positive frequencies # Compute the impedance - self.Z = - WPf / lambdaf + self.Z = -WPf / lambdaf self.lambdaf = lambdaf if self.save: - np.savetxt(self.folder+'Z.txt', np.c_[self.f, self.Z], header=' f [Hz]'+' '*20+'Z [Ohm]'+'\n'+'-'*48) - np.savetxt(self.folder+'spectrum.txt', np.c_[self.f, self.lambdaf], header=' f [Hz]'+' '*20+'Charge distribution spectrum [C/s]'+'\n'+'-'*48) + np.savetxt( + self.folder + "Z.txt", + np.c_[self.f, self.Z], + header=" f [Hz]" + " " * 20 + "Z [Ohm]" + "\n" + "-" * 48, + ) + np.savetxt( + self.folder + "spectrum.txt", + np.c_[self.f, self.lambdaf], + header=" f [Hz]" + + " " * 20 + + "Charge distribution spectrum [C/s]" + + "\n" + + "-" * 48, + ) def calc_trans_Z(self, samples=1001, fmax=None): - ''' + """ Obtains the transverse impedance from the transverse wake potential and the beam charge distribution using a single-sided DFT with 1000 samples Parameters can be passed as **kwargs - ''' - self.log('\n') - self.log('Transverse impedance') - self.log('-'*24) + """ + self.log("\n") + self.log("Transverse impedance") + self.log("-" * 24) - print('Calculating transverse impedance Zx, Zy...') - self.log(f'Single sided DFT with number of samples = {samples}') + print("Calculating transverse impedance Zx, Zy...") + self.log(f"Single sided DFT with number of samples = {samples}") # Set up the DFT computation - ds = np.mean(self.s[1:]-self.s[:-1]) + ds = np.mean(self.s[1:] - self.s[:-1]) if fmax is None: - fmax = self.v/self.sigmaz/3 #max frequency of interest - N = int((self.v/ds)//fmax*samples) #to obtain a 1000 sample single-sided DFT + fmax = self.v / self.sigmaz / 3 # max frequency of interest + N = int( + (self.v / ds) // fmax * samples + ) # to obtain a 1000 sample single-sided DFT # Obtain DFTs # Normalized charge distribution λ(w) - lambdafft = np.fft.fft(self.lambdas*self.v, n=N) - ffft=np.fft.fftfreq(len(lambdafft), ds/self.v) - mask = np.logical_and(ffft >= 0 , ffft < fmax) - lambdaf = lambdafft[mask]*ds + lambdafft = np.fft.fft(self.lambdas * self.v, n=N) + ffft = np.fft.fftfreq(len(lambdafft), ds / self.v) + mask = np.logical_and(ffft >= 0, ffft < fmax) + lambdaf = lambdafft[mask] * ds # Horizontal impedance Zx⊥(w) - WPxfft = np.fft.fft(self.WPx*1e12, n=N) - WPxf = WPxfft[mask]*ds + WPxfft = np.fft.fft(self.WPx * 1e12, n=N) + WPxf = WPxfft[mask] * ds self.Zx = 1j * WPxf / lambdaf # Vertical impedance Zy⊥(w) - WPyfft = np.fft.fft(self.WPy*1e12, n=N) - WPyf = WPyfft[mask]*ds + WPyfft = np.fft.fft(self.WPy * 1e12, n=N) + WPyf = WPyfft[mask] * ds self.Zy = 1j * WPyf / lambdaf @@ -674,11 +731,19 @@ def calc_trans_Z(self, samples=1001, fmax=None): self.fy = ffft[mask] if self.save: - np.savetxt(self.folder+'Zx.txt', np.c_[self.fx, self.Zx], header=' f [Hz]'+' '*20+'Zx [Ohm]'+'\n'+'-'*48) - np.savetxt(self.folder+'Zy.txt', np.c_[self.fy, self.Zy], header=' f [Hz]'+' '*20+'Zy [Ohm]'+'\n'+'-'*48) + np.savetxt( + self.folder + "Zx.txt", + np.c_[self.fx, self.Zx], + header=" f [Hz]" + " " * 20 + "Zx [Ohm]" + "\n" + "-" * 48, + ) + np.savetxt( + self.folder + "Zy.txt", + np.c_[self.fy, self.Zy], + header=" f [Hz]" + " " * 20 + "Zy [Ohm]" + "\n" + "-" * 48, + ) def calc_lambdas(self, **kwargs): - '''Obtains normalized charge distribution in terms of s + """Obtains normalized charge distribution in terms of s λ(s) to use in the Impedance calculation Parameters @@ -695,7 +760,7 @@ def calc_lambdas(self, **kwargs): vector containing z-coordinates of the domain [m] zf : ndarray, optional vector containing z-coordinates of the field monitor [m]. N - ''' + """ for key, val in kwargs.items(): setattr(self, key, val) @@ -717,15 +782,23 @@ def calc_lambdas(self, **kwargs): elif len(self.zf) == len(self.chargedist): z = self.zf else: - self.log('Dimension error: check input dimensions') + self.log("Dimension error: check input dimensions") - self.lambdas = np.interp(self.s, z, chargedist/self.q) + self.lambdas = np.interp(self.s, z, chargedist / self.q) if self.save: - np.savetxt(self.folder+'lambda.txt', np.c_[self.s, self.lambdas], header=' s [Hz]'+' '*20+'Charge distribution [C/m]'+'\n'+'-'*48) + np.savetxt( + self.folder + "lambda.txt", + np.c_[self.s, self.lambdas], + header=" s [Hz]" + + " " * 20 + + "Charge distribution [C/m]" + + "\n" + + "-" * 48, + ) def calc_lambdas_analytic(self, **kwargs): - '''Obtains normalized charge distribution in s λ(z) + """Obtains normalized charge distribution in s λ(z) as an analytical gaussian centered in s=0 and std equal sigmaz @@ -737,27 +810,52 @@ def calc_lambdas_analytic(self, **kwargs): where sigmat = sigmaz/c and WL is the Wakelength sigmaz : float Beam sigma in the longitudinal direction [m] - ''' + """ for key, val in kwargs.items(): setattr(self, key, val) - self.lambdas = 1/(self.sigmaz*np.sqrt(2*np.pi))*np.exp(-(self.s**2)/(2*self.sigmaz**2)) + self.lambdas = ( + 1 + / (self.sigmaz * np.sqrt(2 * np.pi)) + * np.exp(-(self.s**2) / (2 * self.sigmaz**2)) + ) if self.save: - np.savetxt(self.folder+'lambda.txt', np.c_[self.s, self.lambdas], header=' s [Hz]'+' '*20+'Charge distribution [C/m]'+'\n'+'-'*48) - - def get_SmartBounds(self, freq_data=None, impedance_data=None, - minimum_peak_height=1.0, distance=3, inspect_bounds=True, - Rs_bounds=[0.8, 10], Q_bounds=[0.5, 5], fres_bounds=[-0.01e9, +0.01e9] - ): + np.savetxt( + self.folder + "lambda.txt", + np.c_[self.s, self.lambdas], + header=" s [Hz]" + + " " * 20 + + "Charge distribution [C/m]" + + "\n" + + "-" * 48, + ) + + def get_SmartBounds( + self, + freq_data=None, + impedance_data=None, + minimum_peak_height=1.0, + distance=3, + inspect_bounds=True, + Rs_bounds=[0.8, 10], + Q_bounds=[0.5, 5], + fres_bounds=[-0.01e9, +0.01e9], + ): import iddefix - self.log('\nCalculating bounds using the Smart Bound Determination...') + self.log("\nCalculating bounds using the Smart Bound Determination...") # Smart bounds # Find the main resonators and estimate the bounds -courtesy of Malthe Raschke! - bounds = iddefix.SmartBoundDetermination(freq_data, np.real(impedance_data), minimum_peak_height=minimum_peak_height, - Rs_bounds=Rs_bounds, Q_bounds=Q_bounds, fres_bounds=fres_bounds) + bounds = iddefix.SmartBoundDetermination( + freq_data, + np.real(impedance_data), + minimum_peak_height=minimum_peak_height, + Rs_bounds=Rs_bounds, + Q_bounds=Q_bounds, + fres_bounds=fres_bounds, + ) bounds.find(minimum_peak_height=minimum_peak_height, distance=distance) @@ -769,72 +867,96 @@ def get_SmartBounds(self, freq_data=None, impedance_data=None, bounds.to_table() return bounds - - def get_DEmodel_fitting(self, freq_data=None, impedance_data=None, - plane='longitudinal', dim='z', - parameterBounds=None, N_resonators=None, DE_kernel='DE', - maxiter=1e5, cmaes_sigma=0.01, popsize=150, tol=1e-3, - use_minimization=True, minimization_margin=[0.3, 0.2, 0.01], - minimum_peak_height=1.0, distance=3, inspect_bounds=False, - Rs_bounds=[0.8, 10], Q_bounds=[0.5, 5], fres_bounds=[-0.01e9, +0.01e9], - ): + def get_DEmodel_fitting( + self, + freq_data=None, + impedance_data=None, + plane="longitudinal", + dim="z", + parameterBounds=None, + N_resonators=None, + DE_kernel="DE", + maxiter=1e5, + cmaes_sigma=0.01, + popsize=150, + tol=1e-3, + use_minimization=True, + minimization_margin=[0.3, 0.2, 0.01], + minimum_peak_height=1.0, + distance=3, + inspect_bounds=False, + Rs_bounds=[0.8, 10], + Q_bounds=[0.5, 5], + fres_bounds=[-0.01e9, +0.01e9], + ): import iddefix if freq_data is None or impedance_data is None: - if plane == 'longitudinal' and dim == 'z': + if plane == "longitudinal" and dim == "z": freq_data = self.f impedance_data = self.Z - elif plane == 'transverse': - if dim == 'x': + elif plane == "transverse": + if dim == "x": freq_data = self.fx impedance_data = self.Zx - elif dim == 'y': + elif dim == "y": freq_data = self.fy impedance_data = self.Zy else: raise ValueError('Invalid dimension. Use dim = "x" or "y".') else: - raise ValueError('Invalid plane or dimension. Use plane = "longitudinal" or "transverse" and choose the dimension dim = "z", "x" or "y".') + raise ValueError( + 'Invalid plane or dimension. Use plane = "longitudinal" or "transverse" and choose the dimension dim = "z", "x" or "y".' + ) if parameterBounds is None or N_resonators is None: - bounds = self.get_SmartBounds(parameterBounds=parameterBounds, - N_resonators=N_resonators, - minimum_peak_height=minimum_peak_height, - distance=distance, - inspect_bounds=inspect_bounds, - Rs_bounds=Rs_bounds, Q_bounds=Q_bounds, fres_bounds=fres_bounds) + bounds = self.get_SmartBounds( + parameterBounds=parameterBounds, + N_resonators=N_resonators, + minimum_peak_height=minimum_peak_height, + distance=distance, + inspect_bounds=inspect_bounds, + Rs_bounds=Rs_bounds, + Q_bounds=Q_bounds, + fres_bounds=fres_bounds, + ) N_resonators = bounds.N_resonators parameterBounds = bounds.parameterBounds # Build the differential evolution model - print('Fitting the impedance using Differential Evolution...') - self.log('\nExtrapolating wake potential using Differential Evolution...') - - objectiveFunction=iddefix.ObjectiveFunctions.sumOfSquaredErrorReal - DE_model = iddefix.EvolutionaryAlgorithm(freq_data, - np.real(impedance_data), - N_resonators=N_resonators, - parameterBounds=parameterBounds, - plane=plane, - fitFunction='impedance', - wake_length=self.wakelength, # in [m] - objectiveFunction=objectiveFunction, - ) - - if DE_kernel == 'DE': - DE_model.run_differential_evolution(maxiter=int(maxiter), - popsize=popsize, - tol=tol, - mutation=(0.3, 0.8), - crossover_rate=0.5) - - elif DE_kernel == 'CMAES': #TODO: fix UnboundLocalError - DE_model.run_cmaes(maxiter=int(maxiter), - popsize=popsize, - sigma=cmaes_sigma,) + print("Fitting the impedance using Differential Evolution...") + self.log("\nExtrapolating wake potential using Differential Evolution...") + + objectiveFunction = iddefix.ObjectiveFunctions.sumOfSquaredErrorReal + DE_model = iddefix.EvolutionaryAlgorithm( + freq_data, + np.real(impedance_data), + N_resonators=N_resonators, + parameterBounds=parameterBounds, + plane=plane, + fitFunction="impedance", + wake_length=self.wakelength, # in [m] + objectiveFunction=objectiveFunction, + ) + + if DE_kernel == "DE": + DE_model.run_differential_evolution( + maxiter=int(maxiter), + popsize=popsize, + tol=tol, + mutation=(0.3, 0.8), + crossover_rate=0.5, + ) + + elif DE_kernel == "CMAES": # TODO: fix UnboundLocalError + DE_model.run_cmaes( + maxiter=int(maxiter), + popsize=popsize, + sigma=cmaes_sigma, + ) if use_minimization: - self.log('Running minimization algorithm...') + self.log("Running minimization algorithm...") DE_model.run_minimization_algorithm(minimization_margin) self.DE_model = DE_model @@ -845,97 +967,106 @@ def get_DEmodel_fitting(self, freq_data=None, impedance_data=None, return DE_model def get_extrapolated_wake(self, wakelength, sigma=None, use_minimization=True): - ''' + """ Get the extrapolated wake potential [V/pC] from the DE model - ''' + """ if self.DE_model is None: - raise AttributeError('Run get_DEmodel() first to obtain the DE model') + raise AttributeError("Run get_DEmodel() first to obtain the DE model") if sigma is None: - sigma = self.sigmaz/c_light + sigma = self.sigmaz / c_light # Get the extrapolated wake potential # TODO: add beta - t = np.arange(self.s[0]/c_light, wakelength/c_light, (self.s[2]-self.s[1])/c_light) - wake_potential = self.DE_model.get_wake_potential(t, sigma=sigma, - use_minimization=use_minimization) + t = np.arange( + self.s[0] / c_light, wakelength / c_light, (self.s[2] - self.s[1]) / c_light + ) + wake_potential = self.DE_model.get_wake_potential( + t, sigma=sigma, use_minimization=use_minimization + ) s = t * c_light # Convert time to distance [m] - return s, -wake_potential*1e-12 # in [V/pC] + CST convention + return s, -wake_potential * 1e-12 # in [V/pC] + CST convention def get_extrapolated_wake_function(self, wakelength, use_minimization=True): - ''' + """ Get the extrapolated wake function (a.k.a. Green function) from the DE model - ''' + """ if self.DE_model is None: - raise AttributeError('Run get_DEmodel() first to obtain the DE model') + raise AttributeError("Run get_DEmodel() first to obtain the DE model") - t = np.arange(self.s[0]/c_light, wakelength/c_light, (self.s[2]-self.s[1])/c_light) + t = np.arange( + self.s[0] / c_light, wakelength / c_light, (self.s[2] - self.s[1]) / c_light + ) wake_function = self.DE_model.get_wake(t, use_minimization=use_minimization) return t, wake_function - def get_extrapolated_impedance(self, f=None, use_minimization=True, - wakelength=None): - ''' + def get_extrapolated_impedance( + self, f=None, use_minimization=True, wakelength=None + ): + """ Get the extrapolated impedance [Ohm] from the DE model - ''' + """ if self.DE_model is None: - raise AttributeError('Run get_DEmodel() first to obtain the DE model') + raise AttributeError("Run get_DEmodel() first to obtain the DE model") if f is None: f = self.DE_model.frequency_data - impedance = self.DE_model.get_impedance(frequency_data=f, - use_minimization=use_minimization, - wakelength=wakelength) + impedance = self.DE_model.get_impedance( + frequency_data=f, use_minimization=use_minimization, wakelength=wakelength + ) return f, impedance @staticmethod - def calc_impedance_from_wake(wake, s=None, t=None, fmax=None, - samples=None, verbose=True): + def calc_impedance_from_wake( + wake, s=None, t=None, fmax=None, samples=None, verbose=True + ): if type(wake) is list: t = wake[0] wake = wake[1] if s is not None: - t = s/c_light + t = s / c_light elif s is None and t is None: - raise AttributeError('Provide time data through parameter "t" [s] or "s" [m]') - dt = np.mean(t[1:]-t[:-1]) + raise AttributeError( + 'Provide time data through parameter "t" [s] or "s" [m]' + ) + dt = np.mean(t[1:] - t[:-1]) # Maximum frequency: fmax = 1/dt if fmax is not None: - aux = np.arange(t.min(), t.max(), 1/fmax/2) + aux = np.arange(t.min(), t.max(), 1 / fmax / 2) wake = np.interp(aux, t, wake) - dt = np.mean(aux[1:]-aux[:-1]) + dt = np.mean(aux[1:] - aux[:-1]) del aux else: - fmax = 1/dt + fmax = 1 / dt # Time resolution: fres=(1/len(wake)/dt/2) # Obtain DFTs if samples is not None: - Wfft = np.fft.fft(wake, n=2*samples) + Wfft = np.fft.fft(wake, n=2 * samples) else: Wfft = np.fft.fft(wake) ffft = np.fft.fftfreq(len(Wfft), dt) # Mask invalid frequencies - mask = np.logical_and(ffft >= 0 , ffft < fmax) - Z = Wfft[mask]/len(wake)*2 - f = ffft[mask] # Positive frequencies + mask = np.logical_and(ffft >= 0, ffft < fmax) + Z = Wfft[mask] / len(wake) * 2 + f = ffft[mask] # Positive frequencies if verbose: - print(f'* Number of samples = {len(f)}') - print(f'* Maximum frequency = {f.max()} Hz') - print(f'* Maximum resolution = {np.mean(f[1:]-f[:-1])} Hz') + print(f"* Number of samples = {len(f)}") + print(f"* Maximum frequency = {f.max()} Hz") + print(f"* Maximum resolution = {np.mean(f[1:] - f[:-1])} Hz") return [f, Z] @staticmethod - def calc_wake_from_impedance(impedance, f=None, tmax=None, - samples=None, pad=0, verbose=True): - + def calc_wake_from_impedance( + impedance, f=None, tmax=None, samples=None, pad=0, verbose=True + ): if len(impedance) == 2: f = impedance[0] Z = impedance[1] @@ -943,45 +1074,49 @@ def calc_wake_from_impedance(impedance, f=None, tmax=None, raise AttributeError('Provide frequency data through parameter "f"') else: Z = impedance - df = np.mean(f[1:]-f[:-1]) + df = np.mean(f[1:] - f[:-1]) # Maximum time: tmax = 1/(f[2]-f[1]) if tmax is not None: - aux = np.arange(f.min(), f.max(), 1/tmax) + aux = np.arange(f.min(), f.max(), 1 / tmax) Z = np.interp(aux, f, Z) - df = np.mean(aux[1:]-aux[:-1]) + df = np.mean(aux[1:] - aux[:-1]) del aux else: - tmax = 1/df + tmax = 1 / df # Time resolution: tres=(1/len(Z)/(f[2]-f[1])) # pad = int(1/df/tres - len(Z)) # wake = np.real(np.fft.ifft(np.pad(Z, pad))) - wake = np.real(-1*np.fft.fft(Z, n=samples)) - wake = np.roll(wake,-1) + wake = np.real(-1 * np.fft.fft(Z, n=samples)) + wake = np.roll(wake, -1) # Inverse fourier transform of impedance t = np.linspace(0, tmax, len(wake)) if verbose: - print(f'* Number of samples = {len(t)}') - print(f'* Maximum time = {t.max()} s') - print(f'* Maximum resolution = {np.mean(t[1:]-t[:-1])} s') + print(f"* Number of samples = {len(t)}") + print(f"* Maximum time = {t.max()} s") + print(f"* Maximum resolution = {np.mean(t[1:] - t[:-1])} s") return [t, wake] def read_Ez(self, filename=None, return_value=False): - ''' + """ Read the Ez.h5 file containing the Ez field information - ''' + """ if filename is None: filename = self.Ez_file - hf = h5py.File(filename, 'r') - print(f'Reading h5 file {filename}' ) - self.log('Size of the h5 file: ' + str(round((os.path.getsize(filename)/10**9),2))+' Gb') + hf = h5py.File(filename, "r") + print(f"Reading h5 file {filename}") + self.log( + "Size of the h5 file: " + + str(round((os.path.getsize(filename) / 10**9), 2)) + + " Gb" + ) - #Set attributes + # Set attributes self.Ez_hf = hf self.Ez_file = filename if 'x' in hf.keys(): @@ -1003,42 +1138,51 @@ def read_Ez(self, filename=None, return_value=False): return hf def read_txt(self, txt, skiprows=2, delimiter=None, usecols=None): - ''' + """ Reads txt variables from ascii files and returns data in a dictionary. Header should be the first line. - ''' + """ try: - load = np.loadtxt(txt, skiprows=skiprows, delimiter=delimiter, usecols=usecols) + load = np.loadtxt( + txt, skiprows=skiprows, delimiter=delimiter, usecols=usecols + ) except Exception: if self.verbose: - print(f'[!] Using dtype=np.complex128 to read {txt}') - load = np.loadtxt(txt, skiprows=skiprows, delimiter=delimiter, - usecols=usecols, dtype=np.complex128) - - try: # keys == header names + print(f"[!] Using dtype=np.complex128 to read {txt}") + load = np.loadtxt( + txt, + skiprows=skiprows, + delimiter=delimiter, + usecols=usecols, + dtype=np.complex128, + ) + + try: # keys == header names with open(txt) as f: header = f.readline() - header = header.replace(' ', '') - header = header.replace('#', '') - header = header.replace('\n', '') - header = header.split(']') + header = header.replace(" ", "") + header = header.replace("#", "") + header = header.replace("\n", "") + header = header.split("]") d = {} - for i in range(len(load[0,:])): - d[header[i]+']'] = load[:, i] + for i in range(len(load[0, :])): + d[header[i] + "]"] = load[:, i] - except Exception: #keys == int 0, 1, ... - print('[!] Using integer keys since no header was found') + except Exception: # keys == int 0, 1, ... + print("[!] Using integer keys since no header was found") d = {} - for i in range(len(load[0,:])): + for i in range(len(load[0, :])): d[i] = load[:, i] return d - def save_txt(self, f_name, x_data=None, y_data=None, x_name='X [-]', y_name='Y [-]'): + def save_txt( + self, f_name, x_data=None, y_data=None, x_name="X [-]", y_name="Y [-]" + ): """ Saves x and y data to a text file in a two-column format. @@ -1083,38 +1227,42 @@ def save_txt(self, f_name, x_data=None, y_data=None, x_name='X [-]', y_name='Y [ 10.00 -0.54 """ if x_data is not None and y_data is not None: - np.savetxt(f_name+'.txt', np.c_[x_data, y_data], header=' '+x_name+' '*20+y_name+'\n'+'-'*48) + np.savetxt( + f_name + ".txt", + np.c_[x_data, y_data], + header=" " + x_name + " " * 20 + y_name + "\n" + "-" * 48, + ) else: - print('txt not saved, please provide x_data and y_data') + print("txt not saved, please provide x_data and y_data") def load_results(self, folder=None): - '''Load all txt from a given folder + """Load all txt from a given folder The txt files are generated when the attribute`save = True` is used - ''' + """ if folder is None and self.folder is None: - raise Exception('[!] Please provide a folder path') + raise Exception("[!] Please provide a folder path") elif folder is None: folder = self.folder - if not folder.endswith('/'): - folder = folder + '/' + if not folder.endswith("/"): + folder = folder + "/" - _, self.lambdas = self.read_txt(folder+'lambda.txt').values() - _, self.WPx = self.read_txt(folder+'WPx.txt').values() - _, self.WPy = self.read_txt(folder+'WPy.txt').values() - self.s, self.WP = self.read_txt(folder+'WP.txt').values() + _, self.lambdas = self.read_txt(folder + "lambda.txt").values() + _, self.WPx = self.read_txt(folder + "WPx.txt").values() + _, self.WPy = self.read_txt(folder + "WPy.txt").values() + self.s, self.WP = self.read_txt(folder + "WP.txt").values() - _, self.lambdaf = self.read_txt(folder+'spectrum.txt').values() - _, self.Zx = self.read_txt(folder+'Zx.txt').values() - _, self.Zy = self.read_txt(folder+'Zy.txt').values() - self.f, self.Z = self.read_txt(folder+'Z.txt').values() + _, self.lambdaf = self.read_txt(folder + "spectrum.txt").values() + _, self.Zx = self.read_txt(folder + "Zx.txt").values() + _, self.Zy = self.read_txt(folder + "Zy.txt").values() + self.f, self.Z = self.read_txt(folder + "Z.txt").values() self.f = np.abs(self.f) self.wakelength = self.s[-1] self.folder = folder - self.Ez_file = folder + 'Ez.h5' + self.Ez_file = folder + "Ez.h5" def copy(self): obj = type(self).__new__(self.__class__) @@ -1123,10 +1271,10 @@ def copy(self): def log(self, txt): if self.verbose: - print('\x1b[2;37m'+txt+'\x1b[0m') + print("\x1b[2;37m" + txt + "\x1b[0m") - def read_cst_3d(self, path=None, folder='3d', filename='Ez.h5', units=1e-3): - ''' + def read_cst_3d(self, path=None, folder="3d", filename="Ez.h5", units=1e-3): + """ Read CST 3d exports folder and store the Ez field information into a matrix Ez(x,y,z) for every timestep into a single `.h5` file @@ -1140,147 +1288,159 @@ def read_cst_3d(self, path=None, folder='3d', filename='Ez.h5', units=1e-3): Folder containing the CST field data .txt files filename: str, default 'Ez.h5' Name of the h5 file that will be generated - ''' + """ - self.log('Reading 3d CST field exports') - self.log('-'*24) + self.log("Reading 3d CST field exports") + self.log("-" * 24) if path is None: - path = folder + '/' + path = folder + "/" # Rename files with E-02, E-03 - for file in glob.glob(path +'*E-02.txt'): - file=file.split(path) - title=file[1].split('_') - num=title[1].split('E') - num[0]=float(num[0])/100 - - ntitle=title[0]+'_'+str(num[0])+'.txt' - shutil.copy(path+file[1], path+file[1]+'.old') - os.rename(path+file[1], path+ntitle) - - for file in glob.glob(path +'*E-03.txt'): - file=file.split(path) - title=file[1].split('_') - num=title[1].split('E') - num[0]=float(num[0])/1000 - - ntitle=title[0]+'_'+str(num[0])+'.txt' - shutil.copy(path+file[1], path+file[1]+'.old') - os.rename(path+file[1], path+ntitle) - - for file in glob.glob(path +'*_0.txt'): - file=file.split(path) - title=file[1].split('_') - num=title[1].split('.') - num[0]=float(num[0]) - - ntitle=title[0]+'_'+str(num[0])+'.txt' - shutil.copy(path+file[1], path+file[1]+'.old') - os.rename(path+file[1], path+ntitle) - - #sort + for file in glob.glob(path + "*E-02.txt"): + file = file.split(path) + title = file[1].split("_") + num = title[1].split("E") + num[0] = float(num[0]) / 100 + + ntitle = title[0] + "_" + str(num[0]) + ".txt" + shutil.copy(path + file[1], path + file[1] + ".old") + os.rename(path + file[1], path + ntitle) + + for file in glob.glob(path + "*E-03.txt"): + file = file.split(path) + title = file[1].split("_") + num = title[1].split("E") + num[0] = float(num[0]) / 1000 + + ntitle = title[0] + "_" + str(num[0]) + ".txt" + shutil.copy(path + file[1], path + file[1] + ".old") + os.rename(path + file[1], path + ntitle) + + for file in glob.glob(path + "*_0.txt"): + file = file.split(path) + title = file[1].split("_") + num = title[1].split(".") + num[0] = float(num[0]) + + ntitle = title[0] + "_" + str(num[0]) + ".txt" + shutil.copy(path + file[1], path + file[1] + ".old") + os.rename(path + file[1], path + ntitle) + + # sort try: + def sorter(item): - num=item.split(path)[1].split('_')[1].split('.txt')[0] + num = item.split(path)[1].split("_")[1].split(".txt")[0] return float(num) - fnames = sorted(glob.glob(path+'*.txt'), key=sorter) + + fnames = sorted(glob.glob(path + "*.txt"), key=sorter) except Exception: - print('[!] Using default sorting for the files') - fnames = sorted(glob.glob(path+'*.txt')) + print("[!] Using default sorting for the files") + fnames = sorted(glob.glob(path + "*.txt")) - #Get the number of longitudinal and transverse cells used for Ez - i=0 + # Get the number of longitudinal and transverse cells used for Ez + i = 0 with open(fnames[0]) as f: - lines=f.readlines() - n_rows = len(lines)-3 #n of rows minus the header - x1=lines[3].split()[0] + lines = f.readlines() + n_rows = len(lines) - 3 # n of rows minus the header + x1 = lines[3].split()[0] while True: - i+=1 - x2=lines[i+3].split()[0] - if x1==x2: + i += 1 + x2 = lines[i + 3].split()[0] + if x1 == x2: break - n_transverse_cells=i - n_longitudinal_cells=int(n_rows/(n_transverse_cells**2)) + n_transverse_cells = i + n_longitudinal_cells = int(n_rows / (n_transverse_cells**2)) # Create h5 file - if os.path.exists(path+filename): - os.remove(path+filename) + if os.path.exists(path + filename): + os.remove(path + filename) - hf = h5py.File(path+filename, 'w') + hf = h5py.File(path + filename, "w") # Initialize variables - Ez=np.zeros((n_transverse_cells, n_transverse_cells, n_longitudinal_cells)) - x=np.zeros((n_transverse_cells)) - y=np.zeros((n_transverse_cells)) - z=np.zeros((n_longitudinal_cells)) - t=[] + Ez = np.zeros((n_transverse_cells, n_transverse_cells, n_longitudinal_cells)) + x = np.zeros((n_transverse_cells)) + y = np.zeros((n_transverse_cells)) + z = np.zeros((n_longitudinal_cells)) + t = [] nsteps, i, j, k = 0, 0, 0, 0 - skip=-4 #number of rows to skip - rows=skip + skip = -4 # number of rows to skip + rows = skip # Start scan - self.log(f'Scanning files in {path}:') + self.log(f"Scanning files in {path}:") for file in tqdm(fnames): - #self.log.debug('Scanning file '+ file + '...') - title=file.split(path) - title2=title[1].split('_') + # self.log.debug('Scanning file '+ file + '...') + title = file.split(path) + title2 = title[1].split("_") try: - num=title2[1].split('.txt') - t.append(float(num[0])*1e-9) + num = title2[1].split(".txt") + t.append(float(num[0]) * 1e-9) except Exception: - print('[!] timestep not found, using step number instead') + print("[!] timestep not found, using step number instead") t.append(nsteps) with open(file) as f: for line in f: - rows+=1 + rows += 1 columns = line.split() - if rows>=0 and len(columns)>1: - k=int(rows/n_transverse_cells**2) - j=int(rows/n_transverse_cells-n_transverse_cells*k) - i=int(rows-j*n_transverse_cells-k*n_transverse_cells**2) + if rows >= 0 and len(columns) > 1: + k = int(rows / n_transverse_cells**2) + j = int(rows / n_transverse_cells - n_transverse_cells * k) + i = int( + rows - j * n_transverse_cells - k * n_transverse_cells**2 + ) - if k>= n_longitudinal_cells: - k = int(n_longitudinal_cells-1) + if k >= n_longitudinal_cells: + k = int(n_longitudinal_cells - 1) - Ez[i,j,k]=float(columns[5]) + Ez[i, j, k] = float(columns[5]) - x[i]=float(columns[0])*units - y[j]=float(columns[1])*units - z[k]=float(columns[2])*units + x[i] = float(columns[0]) * units + y[j] = float(columns[1]) * units + z[k] = float(columns[2]) * units if nsteps == 0: - prefix='0'*5 - hf.create_dataset('Ez_'+prefix+str(nsteps), data=Ez) + prefix = "0" * 5 + hf.create_dataset("Ez_" + prefix + str(nsteps), data=Ez) else: - prefix='0'*(5-int(np.log10(nsteps))) - hf.create_dataset('Ez_'+prefix+str(nsteps), data=Ez) + prefix = "0" * (5 - int(np.log10(nsteps))) + hf.create_dataset("Ez_" + prefix + str(nsteps), data=Ez) i, j, k = 0, 0, 0 - rows=skip - nsteps+=1 + rows = skip + nsteps += 1 - #close file + # close file f.close() - hf['x'] = x - hf['y'] = y - hf['z'] = z - hf['t'] = t + hf["x"] = x + hf["y"] = y + hf["z"] = z + hf["t"] = t hf.close() - #set field info - self.log('Ez field is stored in a matrix with shape '+str(Ez.shape)+' in '+str(int(nsteps))+' datasets') - self.log(f'Finished scanning files - hdf5 file {filename} succesfully generated') - - #Update self + # set field info + self.log( + "Ez field is stored in a matrix with shape " + + str(Ez.shape) + + " in " + + str(int(nsteps)) + + " datasets" + ) + self.log( + f"Finished scanning files - hdf5 file {filename} succesfully generated" + ) + + # Update self self.xf = x self.yf = y self.zf = z @@ -1290,14 +1450,14 @@ def assign_logs(self): """ Assigns the parameters of the wake to the logger """ - self.logger.wakeSolver["ti"]=self.ti - self.logger.wakeSolver["q"]=self.q - self.logger.wakeSolver["sigmaz"]=self.sigmaz - self.logger.wakeSolver["beta"]=self.beta - self.logger.wakeSolver["xsource"]=self.xsource - self.logger.wakeSolver["ysource"]=self.ysource - self.logger.wakeSolver["xtest"]=self.xtest - self.logger.wakeSolver["ytest"]=self.ytest - self.logger.wakeSolver["chargedist"]=self.chargedist - self.logger.wakeSolver["skip_cells"]=self.skip_cells - self.logger.wakeSolver["results_folder"]=self.folder + self.logger.wakeSolver["ti"] = self.ti + self.logger.wakeSolver["q"] = self.q + self.logger.wakeSolver["sigmaz"] = self.sigmaz + self.logger.wakeSolver["beta"] = self.beta + self.logger.wakeSolver["xsource"] = self.xsource + self.logger.wakeSolver["ysource"] = self.ysource + self.logger.wakeSolver["xtest"] = self.xtest + self.logger.wakeSolver["ytest"] = self.ytest + self.logger.wakeSolver["chargedist"] = self.chargedist + self.logger.wakeSolver["skip_cells"] = self.skip_cells + self.logger.wakeSolver["results_folder"] = self.folder