From 93ec208fe8a28d38380610dab9a62c543785a45f Mon Sep 17 00:00:00 2001 From: hfoote Date: Fri, 22 May 2026 16:30:21 -0700 Subject: [PATCH 1/4] Setup sphinx docs with index page --- docs/Makefile | 20 ++ docs/make.bat | 35 ++ docs/source/conf.py | 28 ++ docs/source/index.rst | 25 ++ pyproject.toml | 1 + tutorials/2_working_with_simulations.ipynb | 8 +- uv.lock | 394 +++++++++++++++++++++ 7 files changed, 507 insertions(+), 4 deletions(-) create mode 100644 docs/Makefile create mode 100644 docs/make.bat create mode 100644 docs/source/conf.py create mode 100644 docs/source/index.rst diff --git a/docs/Makefile b/docs/Makefile new file mode 100644 index 0000000..d0c3cbf --- /dev/null +++ b/docs/Makefile @@ -0,0 +1,20 @@ +# Minimal makefile for Sphinx documentation +# + +# You can set these variables from the command line, and also +# from the environment for the first two. +SPHINXOPTS ?= +SPHINXBUILD ?= sphinx-build +SOURCEDIR = source +BUILDDIR = build + +# Put it first so that "make" without argument is like "make help". +help: + @$(SPHINXBUILD) -M help "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O) + +.PHONY: help Makefile + +# Catch-all target: route all unknown targets to Sphinx using the new +# "make mode" option. $(O) is meant as a shortcut for $(SPHINXOPTS). +%: Makefile + @$(SPHINXBUILD) -M $@ "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O) diff --git a/docs/make.bat b/docs/make.bat new file mode 100644 index 0000000..747ffb7 --- /dev/null +++ b/docs/make.bat @@ -0,0 +1,35 @@ +@ECHO OFF + +pushd %~dp0 + +REM Command file for Sphinx documentation + +if "%SPHINXBUILD%" == "" ( + set SPHINXBUILD=sphinx-build +) +set SOURCEDIR=source +set BUILDDIR=build + +%SPHINXBUILD% >NUL 2>NUL +if errorlevel 9009 ( + echo. + echo.The 'sphinx-build' command was not found. Make sure you have Sphinx + echo.installed, then set the SPHINXBUILD environment variable to point + echo.to the full path of the 'sphinx-build' executable. Alternatively you + echo.may add the Sphinx directory to PATH. + echo. + echo.If you don't have Sphinx installed, grab it from + echo.https://www.sphinx-doc.org/ + exit /b 1 +) + +if "%1" == "" goto help + +%SPHINXBUILD% -M %1 %SOURCEDIR% %BUILDDIR% %SPHINXOPTS% %O% +goto end + +:help +%SPHINXBUILD% -M help %SOURCEDIR% %BUILDDIR% %SPHINXOPTS% %O% + +:end +popd diff --git a/docs/source/conf.py b/docs/source/conf.py new file mode 100644 index 0000000..73185e2 --- /dev/null +++ b/docs/source/conf.py @@ -0,0 +1,28 @@ +# Configuration file for the Sphinx documentation builder. +# +# For the full list of built-in configuration values, see the documentation: +# https://www.sphinx-doc.org/en/master/usage/configuration.html + +# -- Project information ----------------------------------------------------- +# https://www.sphinx-doc.org/en/master/usage/configuration.html#project-information + +project = 'snapAnalysis' +copyright = '2026, Hayden Foote' +author = 'Hayden Foote' +release = '0.1.0' + +# -- General configuration --------------------------------------------------- +# https://www.sphinx-doc.org/en/master/usage/configuration.html#general-configuration + +extensions = [] + +templates_path = ['_templates'] +exclude_patterns = [] + + + +# -- Options for HTML output ------------------------------------------------- +# https://www.sphinx-doc.org/en/master/usage/configuration.html#options-for-html-output + +html_theme = 'alabaster' +html_static_path = ['_static'] diff --git a/docs/source/index.rst b/docs/source/index.rst new file mode 100644 index 0000000..fd326b9 --- /dev/null +++ b/docs/source/index.rst @@ -0,0 +1,25 @@ +.. snapAnalysis documentation master file, created by + sphinx-quickstart on Fri May 22 16:15:06 2026. + You can adapt this file completely to your liking, but it should at least + contain the root `toctree` directive. + +``snapAnalysis`` documentation +============================== + +``snapAnalysis`` is an N-body simulation snapshot analysis package. ``snapAnalysis`` is designed specifically for working with idealized simulations of at most a few galaxies, rather than cosmological simulations. Currently, it supports any GADGET-format snapshots stored in the hdf5 format, though compatibility with older GADGET binary files is planned for the future. ``snapAnalysis`` can also handle fuzzy dark matter snapshots generated by Arepo's BECDM module. + +``snapAnalysis`` supports many common workflows for handling snapshots, including particle loading, particle filtering, centering, rotations, coordinate transformations, galaxy shape analysis, particle orbit extraction, galaxy center-of-mass orbit extraction, and more. Also included are a few basic visualization functions for plotting density and potential fields, density and anisotropy profiles, and more. Units are detected automatically from snapshot headers and handled using astropy's units module. + +.. note:: + ``snapAnalysis`` is still in early development. We encourage contributions following `our guidelines `__ + +Contents +-------- +.. toctree:: + :maxdepth: 2 + :caption: Contents: + + Installation + Tutorials + API Reference + diff --git a/pyproject.toml b/pyproject.toml index c2e2289..93a00bb 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -28,6 +28,7 @@ dev = [ "pytest-cov>=7.1.0", "pytest-mock>=3.15.1", "ruff>=0.14.5", + "sphinx>=9.0.4", ] [project.urls] diff --git a/tutorials/2_working_with_simulations.ipynb b/tutorials/2_working_with_simulations.ipynb index 0b9f9ce..e6c7f3e 100644 --- a/tutorials/2_working_with_simulations.ipynb +++ b/tutorials/2_working_with_simulations.ipynb @@ -5,7 +5,7 @@ "id": "080cd826", "metadata": {}, "source": [ - "# Working with Simualtions\n", + "# Working with Simulations\n", "\n", "Sometimes, you need to work with many snapshots across an entire simulation instead of a single snapshot at once. This notebook describes the routines included in `snapAnalysis.sim` for extracting useful data from entire simualtions. We'll work with the isolated dark matter halo snapshots included in the test suite. There's only two snapshots in this test simulation (for space reasons), but these recipes translate directly to simulations including thousands of snapshots." ] @@ -224,7 +224,7 @@ "name": "stdout", "output_type": "stream", "text": [ - "{'1193': 0, '1515': 1, '3062': 2, '4822': 3, '5989': 4, '6545': 5, '7744': 6, '7950': 7, '9100': 8, '9973': 9}\n" + "{'1881': 0, '3490': 1, '4334': 2, '4556': 3, '4881': 4, '6363': 5, '6548': 6, '7777': 7, '8855': 8, '9644': 9}\n" ] } ], @@ -244,8 +244,8 @@ "name": "stdout", "output_type": "stream", "text": [ - "[[-18.70143795 -12.80173566 -13.26143816]\n", - " [ -0.50943486 6.15978313 -23.03258062]] kpc\n" + "[[-14.05476249 -11.31392662 -15.47666254]\n", + " [ 11.23177433 2.7399446 -12.70862759]] kpc\n" ] } ], diff --git a/uv.lock b/uv.lock index 6699038..d608f34 100644 --- a/uv.lock +++ b/uv.lock @@ -1,6 +1,19 @@ version = 1 revision = 3 requires-python = ">=3.11" +resolution-markers = [ + "python_full_version >= '3.12'", + "python_full_version < '3.12'", +] + +[[package]] +name = "alabaster" +version = "1.0.0" +source = { registry = "https://pypi.org/simple" } +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 = "astropy" @@ -34,6 +47,113 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/bf/77/992c739399a70c536ec94799ddcf002006e8d64c13ddfe01bb91e24c6fa5/astropy_iers_data-0.2026.5.18.1.11.28-py3-none-any.whl", hash = "sha256:02775200423294f67a27c1a2243a35877ef101d8df7a51fe2bfd01b63864426d", size = 1990878, upload-time = "2026-05-18T01:12:03.575Z" }, ] +[[package]] +name = "babel" +version = "2.18.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/7d/b2/51899539b6ceeeb420d40ed3cd4b7a40519404f9baf3d4ac99dc413a834b/babel-2.18.0.tar.gz", hash = "sha256:b80b99a14bd085fcacfa15c9165f651fbb3406e66cc603abf11c5750937c992d", size = 9959554, upload-time = "2026-02-01T12:30:56.078Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/77/f5/21d2de20e8b8b0408f0681956ca2c69f1320a3848ac50e6e7f39c6159675/babel-2.18.0-py3-none-any.whl", hash = "sha256:e2b422b277c2b9a9630c1d7903c2a00d0830c409c59ac8cae9081c92f1aeba35", size = 10196845, upload-time = "2026-02-01T12:30:53.445Z" }, +] + +[[package]] +name = "certifi" +version = "2026.5.20" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/f3/ce/ee2ecad540810a79593028e88299baeae54d346cc7a0d94b6199988b89b1/certifi-2026.5.20.tar.gz", hash = "sha256:69dea482ab64caa7b9f6aba1c6bf48bb6a5448d1c0f1b17ab42ad8c763a5344d", size = 135422, upload-time = "2026-05-20T11:46:50.073Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/59/8c/57e832b7af6d7c5abe66eb3fbe3a3a32f4d11ea23a1aa7131371035be991/certifi-2026.5.20-py3-none-any.whl", hash = "sha256:3c52e209ba0a4ad7aebe60436a4ab349c39e1e602e8c134221e546902ad25897", size = 134134, upload-time = "2026-05-20T11:46:48.578Z" }, +] + +[[package]] +name = "charset-normalizer" +version = "3.4.7" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/e7/a1/67fe25fac3c7642725500a3f6cfe5821ad557c3abb11c9d20d12c7008d3e/charset_normalizer-3.4.7.tar.gz", hash = "sha256:ae89db9e5f98a11a4bf50407d4363e7b09b31e55bc117b4f7d80aab97ba009e5", size = 144271, upload-time = "2026-04-02T09:28:39.342Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/c2/d7/b5b7020a0565c2e9fa8c09f4b5fa6232feb326b8c20081ccded47ea368fd/charset_normalizer-3.4.7-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:7641bb8895e77f921102f72833904dcd9901df5d6d72a2ab8f31d04b7e51e4e7", size = 309705, upload-time = "2026-04-02T09:26:02.191Z" }, + { url = "https://files.pythonhosted.org/packages/5a/53/58c29116c340e5456724ecd2fff4196d236b98f3da97b404bc5e51ac3493/charset_normalizer-3.4.7-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:202389074300232baeb53ae2569a60901f7efadd4245cf3a3bf0617d60b439d7", size = 206419, upload-time = "2026-04-02T09:26:03.583Z" }, + { url = "https://files.pythonhosted.org/packages/b2/02/e8146dc6591a37a00e5144c63f29fb7c97a734ea8a111190783c0e60ab63/charset_normalizer-3.4.7-cp311-cp311-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:30b8d1d8c52a48c2c5690e152c169b673487a2a58de1ec7393196753063fcd5e", size = 227901, upload-time = "2026-04-02T09:26:04.738Z" }, + { url = "https://files.pythonhosted.org/packages/fb/73/77486c4cd58f1267bf17db420e930c9afa1b3be3fe8c8b8ebbebc9624359/charset_normalizer-3.4.7-cp311-cp311-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:532bc9bf33a68613fd7d65e4b1c71a6a38d7d42604ecf239c77392e9b4e8998c", size = 222742, upload-time = "2026-04-02T09:26:06.36Z" }, + { url = "https://files.pythonhosted.org/packages/a1/fa/f74eb381a7d94ded44739e9d94de18dc5edc9c17fb8c11f0a6890696c0a9/charset_normalizer-3.4.7-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:2fe249cb4651fd12605b7288b24751d8bfd46d35f12a20b1ba33dea122e690df", size = 214061, upload-time = "2026-04-02T09:26:08.347Z" }, + { url = "https://files.pythonhosted.org/packages/dc/92/42bd3cefcf7687253fb86694b45f37b733c97f59af3724f356fa92b8c344/charset_normalizer-3.4.7-cp311-cp311-manylinux_2_31_armv7l.whl", hash = "sha256:65bcd23054beab4d166035cabbc868a09c1a49d1efe458fe8e4361215df40265", size = 199239, upload-time = "2026-04-02T09:26:09.823Z" }, + { url = "https://files.pythonhosted.org/packages/4c/3d/069e7184e2aa3b3cddc700e3dd267413dc259854adc3380421c805c6a17d/charset_normalizer-3.4.7-cp311-cp311-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:08e721811161356f97b4059a9ba7bafb23ea5ee2255402c42881c214e173c6b4", size = 210173, upload-time = "2026-04-02T09:26:10.953Z" }, + { url = "https://files.pythonhosted.org/packages/62/51/9d56feb5f2e7074c46f93e0ebdbe61f0848ee246e2f0d89f8e20b89ebb8f/charset_normalizer-3.4.7-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:e060d01aec0a910bdccb8be71faf34e7799ce36950f8294c8bf612cba65a2c9e", size = 209841, upload-time = "2026-04-02T09:26:12.142Z" }, + { url = "https://files.pythonhosted.org/packages/d2/59/893d8f99cc4c837dda1fe2f1139079703deb9f321aabcb032355de13b6c7/charset_normalizer-3.4.7-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:38c0109396c4cfc574d502df99742a45c72c08eff0a36158b6f04000043dbf38", size = 200304, upload-time = "2026-04-02T09:26:13.711Z" }, + { url = "https://files.pythonhosted.org/packages/7d/1d/ee6f3be3464247578d1ed5c46de545ccc3d3ff933695395c402c21fa6b77/charset_normalizer-3.4.7-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:1c2a768fdd44ee4a9339a9b0b130049139b8ce3c01d2ce09f67f5a68048d477c", size = 229455, upload-time = "2026-04-02T09:26:14.941Z" }, + { url = "https://files.pythonhosted.org/packages/54/bb/8fb0a946296ea96a488928bdce8ef99023998c48e4713af533e9bb98ef07/charset_normalizer-3.4.7-cp311-cp311-musllinux_1_2_riscv64.whl", hash = "sha256:1a87ca9d5df6fe460483d9a5bbf2b18f620cbed41b432e2bddb686228282d10b", size = 210036, upload-time = "2026-04-02T09:26:16.478Z" }, + { url = "https://files.pythonhosted.org/packages/9a/bc/015b2387f913749f82afd4fcba07846d05b6d784dd16123cb66860e0237d/charset_normalizer-3.4.7-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:d635aab80466bc95771bb78d5370e74d36d1fe31467b6b29b8b57b2a3cd7d22c", size = 224739, upload-time = "2026-04-02T09:26:17.751Z" }, + { url = "https://files.pythonhosted.org/packages/17/ab/63133691f56baae417493cba6b7c641571a2130eb7bceba6773367ab9ec5/charset_normalizer-3.4.7-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:ae196f021b5e7c78e918242d217db021ed2a6ace2bc6ae94c0fc596221c7f58d", size = 216277, upload-time = "2026-04-02T09:26:18.981Z" }, + { url = "https://files.pythonhosted.org/packages/06/6d/3be70e827977f20db77c12a97e6a9f973631a45b8d186c084527e53e77a4/charset_normalizer-3.4.7-cp311-cp311-win32.whl", hash = "sha256:adb2597b428735679446b46c8badf467b4ca5f5056aae4d51a19f9570301b1ad", size = 147819, upload-time = "2026-04-02T09:26:20.295Z" }, + { url = "https://files.pythonhosted.org/packages/20/d9/5f67790f06b735d7c7637171bbfd89882ad67201891b7275e51116ed8207/charset_normalizer-3.4.7-cp311-cp311-win_amd64.whl", hash = "sha256:8e385e4267ab76874ae30db04c627faaaf0b509e1ccc11a95b3fc3e83f855c00", size = 159281, upload-time = "2026-04-02T09:26:21.74Z" }, + { url = "https://files.pythonhosted.org/packages/ca/83/6413f36c5a34afead88ce6f66684d943d91f233d76dd083798f9602b75ae/charset_normalizer-3.4.7-cp311-cp311-win_arm64.whl", hash = "sha256:d4a48e5b3c2a489fae013b7589308a40146ee081f6f509e047e0e096084ceca1", size = 147843, upload-time = "2026-04-02T09:26:22.901Z" }, + { url = "https://files.pythonhosted.org/packages/0c/eb/4fc8d0a7110eb5fc9cc161723a34a8a6c200ce3b4fbf681bc86feee22308/charset_normalizer-3.4.7-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:eca9705049ad3c7345d574e3510665cb2cf844c2f2dcfe675332677f081cbd46", size = 311328, upload-time = "2026-04-02T09:26:24.331Z" }, + { url = "https://files.pythonhosted.org/packages/f8/e3/0fadc706008ac9d7b9b5be6dc767c05f9d3e5df51744ce4cc9605de7b9f4/charset_normalizer-3.4.7-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6178f72c5508bfc5fd446a5905e698c6212932f25bcdd4b47a757a50605a90e2", size = 208061, upload-time = "2026-04-02T09:26:25.568Z" }, + { url = "https://files.pythonhosted.org/packages/42/f0/3dd1045c47f4a4604df85ec18ad093912ae1344ac706993aff91d38773a2/charset_normalizer-3.4.7-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:e1421b502d83040e6d7fb2fb18dff63957f720da3d77b2fbd3187ceb63755d7b", size = 229031, upload-time = "2026-04-02T09:26:26.865Z" }, + { url = "https://files.pythonhosted.org/packages/dc/67/675a46eb016118a2fbde5a277a5d15f4f69d5f3f5f338e5ee2f8948fcf43/charset_normalizer-3.4.7-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:edac0f1ab77644605be2cbba52e6b7f630731fc42b34cb0f634be1a6eface56a", size = 225239, upload-time = "2026-04-02T09:26:28.044Z" }, + { url = "https://files.pythonhosted.org/packages/4b/f8/d0118a2f5f23b02cd166fa385c60f9b0d4f9194f574e2b31cef350ad7223/charset_normalizer-3.4.7-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:5649fd1c7bade02f320a462fdefd0b4bd3ce036065836d4f42e0de958038e116", size = 216589, upload-time = "2026-04-02T09:26:29.239Z" }, + { url = "https://files.pythonhosted.org/packages/b1/f1/6d2b0b261b6c4ceef0fcb0d17a01cc5bc53586c2d4796fa04b5c540bc13d/charset_normalizer-3.4.7-cp312-cp312-manylinux_2_31_armv7l.whl", hash = "sha256:203104ed3e428044fd943bc4bf45fa73c0730391f9621e37fe39ecf477b128cb", size = 202733, upload-time = "2026-04-02T09:26:30.5Z" }, + { url = "https://files.pythonhosted.org/packages/6f/c0/7b1f943f7e87cc3db9626ba17807d042c38645f0a1d4415c7a14afb5591f/charset_normalizer-3.4.7-cp312-cp312-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:298930cec56029e05497a76988377cbd7457ba864beeea92ad7e844fe74cd1f1", size = 212652, upload-time = "2026-04-02T09:26:31.709Z" }, + { url = "https://files.pythonhosted.org/packages/38/dd/5a9ab159fe45c6e72079398f277b7d2b523e7f716acc489726115a910097/charset_normalizer-3.4.7-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:708838739abf24b2ceb208d0e22403dd018faeef86ddac04319a62ae884c4f15", size = 211229, upload-time = "2026-04-02T09:26:33.282Z" }, + { url = "https://files.pythonhosted.org/packages/d5/ff/531a1cad5ca855d1c1a8b69cb71abfd6d85c0291580146fda7c82857caa1/charset_normalizer-3.4.7-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:0f7eb884681e3938906ed0434f20c63046eacd0111c4ba96f27b76084cd679f5", size = 203552, upload-time = "2026-04-02T09:26:34.845Z" }, + { url = "https://files.pythonhosted.org/packages/c1/4c/a5fb52d528a8ca41f7598cb619409ece30a169fbdf9cdce592e53b46c3a6/charset_normalizer-3.4.7-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:4dc1e73c36828f982bfe79fadf5919923f8a6f4df2860804db9a98c48824ce8d", size = 230806, upload-time = "2026-04-02T09:26:36.152Z" }, + { url = "https://files.pythonhosted.org/packages/59/7a/071feed8124111a32b316b33ae4de83d36923039ef8cf48120266844285b/charset_normalizer-3.4.7-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:aed52fea0513bac0ccde438c188c8a471c4e0f457c2dd20cdbf6ea7a450046c7", size = 212316, upload-time = "2026-04-02T09:26:37.672Z" }, + { url = "https://files.pythonhosted.org/packages/fd/35/f7dba3994312d7ba508e041eaac39a36b120f32d4c8662b8814dab876431/charset_normalizer-3.4.7-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:fea24543955a6a729c45a73fe90e08c743f0b3334bbf3201e6c4bc1b0c7fa464", size = 227274, upload-time = "2026-04-02T09:26:38.93Z" }, + { url = "https://files.pythonhosted.org/packages/8a/2d/a572df5c9204ab7688ec1edc895a73ebded3b023bb07364710b05dd1c9be/charset_normalizer-3.4.7-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:bb6d88045545b26da47aa879dd4a89a71d1dce0f0e549b1abcb31dfe4a8eac49", size = 218468, upload-time = "2026-04-02T09:26:40.17Z" }, + { url = "https://files.pythonhosted.org/packages/86/eb/890922a8b03a568ca2f336c36585a4713c55d4d67bf0f0c78924be6315ca/charset_normalizer-3.4.7-cp312-cp312-win32.whl", hash = "sha256:2257141f39fe65a3fdf38aeccae4b953e5f3b3324f4ff0daf9f15b8518666a2c", size = 148460, upload-time = "2026-04-02T09:26:41.416Z" }, + { url = "https://files.pythonhosted.org/packages/35/d9/0e7dffa06c5ab081f75b1b786f0aefc88365825dfcd0ac544bdb7b2b6853/charset_normalizer-3.4.7-cp312-cp312-win_amd64.whl", hash = "sha256:5ed6ab538499c8644b8a3e18debabcd7ce684f3fa91cf867521a7a0279cab2d6", size = 159330, upload-time = "2026-04-02T09:26:42.554Z" }, + { url = "https://files.pythonhosted.org/packages/9e/5d/481bcc2a7c88ea6b0878c299547843b2521ccbc40980cb406267088bc701/charset_normalizer-3.4.7-cp312-cp312-win_arm64.whl", hash = "sha256:56be790f86bfb2c98fb742ce566dfb4816e5a83384616ab59c49e0604d49c51d", size = 147828, upload-time = "2026-04-02T09:26:44.075Z" }, + { url = "https://files.pythonhosted.org/packages/c1/3b/66777e39d3ae1ddc77ee606be4ec6d8cbd4c801f65e5a1b6f2b11b8346dd/charset_normalizer-3.4.7-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:f496c9c3cc02230093d8330875c4c3cdfc3b73612a5fd921c65d39cbcef08063", size = 309627, upload-time = "2026-04-02T09:26:45.198Z" }, + { url = "https://files.pythonhosted.org/packages/2e/4e/b7f84e617b4854ade48a1b7915c8ccfadeba444d2a18c291f696e37f0d3b/charset_normalizer-3.4.7-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:0ea948db76d31190bf08bd371623927ee1339d5f2a0b4b1b4a4439a65298703c", size = 207008, upload-time = "2026-04-02T09:26:46.824Z" }, + { url = "https://files.pythonhosted.org/packages/c4/bb/ec73c0257c9e11b268f018f068f5d00aa0ef8c8b09f7753ebd5f2880e248/charset_normalizer-3.4.7-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:a277ab8928b9f299723bc1a2dabb1265911b1a76341f90a510368ca44ad9ab66", size = 228303, upload-time = "2026-04-02T09:26:48.397Z" }, + { url = "https://files.pythonhosted.org/packages/85/fb/32d1f5033484494619f701e719429c69b766bfc4dbc61aa9e9c8c166528b/charset_normalizer-3.4.7-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:3bec022aec2c514d9cf199522a802bd007cd588ab17ab2525f20f9c34d067c18", size = 224282, upload-time = "2026-04-02T09:26:49.684Z" }, + { url = "https://files.pythonhosted.org/packages/fa/07/330e3a0dda4c404d6da83b327270906e9654a24f6c546dc886a0eb0ffb23/charset_normalizer-3.4.7-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:e044c39e41b92c845bc815e5ae4230804e8e7bc29e399b0437d64222d92809dd", size = 215595, upload-time = "2026-04-02T09:26:50.915Z" }, + { url = "https://files.pythonhosted.org/packages/e3/7c/fc890655786e423f02556e0216d4b8c6bcb6bdfa890160dc66bf52dee468/charset_normalizer-3.4.7-cp313-cp313-manylinux_2_31_armv7l.whl", hash = "sha256:f495a1652cf3fbab2eb0639776dad966c2fb874d79d87ca07f9d5f059b8bd215", size = 201986, upload-time = "2026-04-02T09:26:52.197Z" }, + { url = "https://files.pythonhosted.org/packages/d8/97/bfb18b3db2aed3b90cf54dc292ad79fdd5ad65c4eae454099475cbeadd0d/charset_normalizer-3.4.7-cp313-cp313-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:e712b419df8ba5e42b226c510472b37bd57b38e897d3eca5e8cfd410a29fa859", size = 211711, upload-time = "2026-04-02T09:26:53.49Z" }, + { url = "https://files.pythonhosted.org/packages/6f/a5/a581c13798546a7fd557c82614a5c65a13df2157e9ad6373166d2a3e645d/charset_normalizer-3.4.7-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:7804338df6fcc08105c7745f1502ba68d900f45fd770d5bdd5288ddccb8a42d8", size = 210036, upload-time = "2026-04-02T09:26:54.975Z" }, + { url = "https://files.pythonhosted.org/packages/8c/bf/b3ab5bcb478e4193d517644b0fb2bf5497fbceeaa7a1bc0f4d5b50953861/charset_normalizer-3.4.7-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:481551899c856c704d58119b5025793fa6730adda3571971af568f66d2424bb5", size = 202998, upload-time = "2026-04-02T09:26:56.303Z" }, + { url = "https://files.pythonhosted.org/packages/e7/4e/23efd79b65d314fa320ec6017b4b5834d5c12a58ba4610aa353af2e2f577/charset_normalizer-3.4.7-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:f59099f9b66f0d7145115e6f80dd8b1d847176df89b234a5a6b3f00437aa0832", size = 230056, upload-time = "2026-04-02T09:26:57.554Z" }, + { url = "https://files.pythonhosted.org/packages/b9/9f/1e1941bc3f0e01df116e68dc37a55c4d249df5e6fa77f008841aef68264f/charset_normalizer-3.4.7-cp313-cp313-musllinux_1_2_riscv64.whl", hash = "sha256:f59ad4c0e8f6bba240a9bb85504faa1ab438237199d4cce5f622761507b8f6a6", size = 211537, upload-time = "2026-04-02T09:26:58.843Z" }, + { url = "https://files.pythonhosted.org/packages/80/0f/088cbb3020d44428964a6c97fe1edfb1b9550396bf6d278330281e8b709c/charset_normalizer-3.4.7-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:3dedcc22d73ec993f42055eff4fcfed9318d1eeb9a6606c55892a26964964e48", size = 226176, upload-time = "2026-04-02T09:27:00.437Z" }, + { url = "https://files.pythonhosted.org/packages/6a/9f/130394f9bbe06f4f63e22641d32fc9b202b7e251c9aef4db044324dac493/charset_normalizer-3.4.7-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:64f02c6841d7d83f832cd97ccf8eb8a906d06eb95d5276069175c696b024b60a", size = 217723, upload-time = "2026-04-02T09:27:02.021Z" }, + { url = "https://files.pythonhosted.org/packages/73/55/c469897448a06e49f8fa03f6caae97074fde823f432a98f979cc42b90e69/charset_normalizer-3.4.7-cp313-cp313-win32.whl", hash = "sha256:4042d5c8f957e15221d423ba781e85d553722fc4113f523f2feb7b188cc34c5e", size = 148085, upload-time = "2026-04-02T09:27:03.192Z" }, + { url = "https://files.pythonhosted.org/packages/5d/78/1b74c5bbb3f99b77a1715c91b3e0b5bdb6fe302d95ace4f5b1bec37b0167/charset_normalizer-3.4.7-cp313-cp313-win_amd64.whl", hash = "sha256:3946fa46a0cf3e4c8cb1cc52f56bb536310d34f25f01ca9b6c16afa767dab110", size = 158819, upload-time = "2026-04-02T09:27:04.454Z" }, + { url = "https://files.pythonhosted.org/packages/68/86/46bd42279d323deb8687c4a5a811fd548cb7d1de10cf6535d099877a9a9f/charset_normalizer-3.4.7-cp313-cp313-win_arm64.whl", hash = "sha256:80d04837f55fc81da168b98de4f4b797ef007fc8a79ab71c6ec9bc4dd662b15b", size = 147915, upload-time = "2026-04-02T09:27:05.971Z" }, + { url = "https://files.pythonhosted.org/packages/97/c8/c67cb8c70e19ef1960b97b22ed2a1567711de46c4ddf19799923adc836c2/charset_normalizer-3.4.7-cp314-cp314-macosx_10_15_universal2.whl", hash = "sha256:c36c333c39be2dbca264d7803333c896ab8fa7d4d6f0ab7edb7dfd7aea6e98c0", size = 309234, upload-time = "2026-04-02T09:27:07.194Z" }, + { url = "https://files.pythonhosted.org/packages/99/85/c091fdee33f20de70d6c8b522743b6f831a2f1cd3ff86de4c6a827c48a76/charset_normalizer-3.4.7-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:1c2aed2e5e41f24ea8ef1590b8e848a79b56f3a5564a65ceec43c9d692dc7d8a", size = 208042, upload-time = "2026-04-02T09:27:08.749Z" }, + { url = "https://files.pythonhosted.org/packages/87/1c/ab2ce611b984d2fd5d86a5a8a19c1ae26acac6bad967da4967562c75114d/charset_normalizer-3.4.7-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:54523e136b8948060c0fa0bc7b1b50c32c186f2fceee897a495406bb6e311d2b", size = 228706, upload-time = "2026-04-02T09:27:09.951Z" }, + { url = "https://files.pythonhosted.org/packages/a8/29/2b1d2cb00bf085f59d29eb773ce58ec2d325430f8c216804a0a5cd83cbca/charset_normalizer-3.4.7-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:715479b9a2802ecac752a3b0efa2b0b60285cf962ee38414211abdfccc233b41", size = 224727, upload-time = "2026-04-02T09:27:11.175Z" }, + { url = "https://files.pythonhosted.org/packages/47/5c/032c2d5a07fe4d4855fea851209cca2b6f03ebeb6d4e3afdb3358386a684/charset_normalizer-3.4.7-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:bd6c2a1c7573c64738d716488d2cdd3c00e340e4835707d8fdb8dc1a66ef164e", size = 215882, upload-time = "2026-04-02T09:27:12.446Z" }, + { url = "https://files.pythonhosted.org/packages/2c/c2/356065d5a8b78ed04499cae5f339f091946a6a74f91e03476c33f0ab7100/charset_normalizer-3.4.7-cp314-cp314-manylinux_2_31_armv7l.whl", hash = "sha256:c45e9440fb78f8ddabcf714b68f936737a121355bf59f3907f4e17721b9d1aae", size = 200860, upload-time = "2026-04-02T09:27:13.721Z" }, + { url = "https://files.pythonhosted.org/packages/0c/cd/a32a84217ced5039f53b29f460962abb2d4420def55afabe45b1c3c7483d/charset_normalizer-3.4.7-cp314-cp314-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:3534e7dcbdcf757da6b85a0bbf5b6868786d5982dd959b065e65481644817a18", size = 211564, upload-time = "2026-04-02T09:27:15.272Z" }, + { url = "https://files.pythonhosted.org/packages/44/86/58e6f13ce26cc3b8f4a36b94a0f22ae2f00a72534520f4ae6857c4b81f89/charset_normalizer-3.4.7-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:e8ac484bf18ce6975760921bb6148041faa8fef0547200386ea0b52b5d27bf7b", size = 211276, upload-time = "2026-04-02T09:27:16.834Z" }, + { url = "https://files.pythonhosted.org/packages/8f/fe/d17c32dc72e17e155e06883efa84514ca375f8a528ba2546bee73fc4df81/charset_normalizer-3.4.7-cp314-cp314-musllinux_1_2_armv7l.whl", hash = "sha256:a5fe03b42827c13cdccd08e6c0247b6a6d4b5e3cdc53fd1749f5896adcdc2356", size = 201238, upload-time = "2026-04-02T09:27:18.229Z" }, + { url = "https://files.pythonhosted.org/packages/6a/29/f33daa50b06525a237451cdb6c69da366c381a3dadcd833fa5676bc468b3/charset_normalizer-3.4.7-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:2d6eb928e13016cea4f1f21d1e10c1cebd5a421bc57ddf5b1142ae3f86824fab", size = 230189, upload-time = "2026-04-02T09:27:19.445Z" }, + { url = "https://files.pythonhosted.org/packages/b6/6e/52c84015394a6a0bdcd435210a7e944c5f94ea1055f5cc5d56c5fe368e7b/charset_normalizer-3.4.7-cp314-cp314-musllinux_1_2_riscv64.whl", hash = "sha256:e74327fb75de8986940def6e8dee4f127cc9752bee7355bb323cc5b2659b6d46", size = 211352, upload-time = "2026-04-02T09:27:20.79Z" }, + { url = "https://files.pythonhosted.org/packages/8c/d7/4353be581b373033fb9198bf1da3cf8f09c1082561e8e922aa7b39bf9fe8/charset_normalizer-3.4.7-cp314-cp314-musllinux_1_2_s390x.whl", hash = "sha256:d6038d37043bced98a66e68d3aa2b6a35505dc01328cd65217cefe82f25def44", size = 227024, upload-time = "2026-04-02T09:27:22.063Z" }, + { url = "https://files.pythonhosted.org/packages/30/45/99d18aa925bd1740098ccd3060e238e21115fffbfdcb8f3ece837d0ace6c/charset_normalizer-3.4.7-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:7579e913a5339fb8fa133f6bbcfd8e6749696206cf05acdbdca71a1b436d8e72", size = 217869, upload-time = "2026-04-02T09:27:23.486Z" }, + { url = "https://files.pythonhosted.org/packages/5c/05/5ee478aa53f4bb7996482153d4bfe1b89e0f087f0ab6b294fcf92d595873/charset_normalizer-3.4.7-cp314-cp314-win32.whl", hash = "sha256:5b77459df20e08151cd6f8b9ef8ef1f961ef73d85c21a555c7eed5b79410ec10", size = 148541, upload-time = "2026-04-02T09:27:25.146Z" }, + { url = "https://files.pythonhosted.org/packages/48/77/72dcb0921b2ce86420b2d79d454c7022bf5be40202a2a07906b9f2a35c97/charset_normalizer-3.4.7-cp314-cp314-win_amd64.whl", hash = "sha256:92a0a01ead5e668468e952e4238cccd7c537364eb7d851ab144ab6627dbbe12f", size = 159634, upload-time = "2026-04-02T09:27:26.642Z" }, + { url = "https://files.pythonhosted.org/packages/c6/a3/c2369911cd72f02386e4e340770f6e158c7980267da16af8f668217abaa0/charset_normalizer-3.4.7-cp314-cp314-win_arm64.whl", hash = "sha256:67f6279d125ca0046a7fd386d01b311c6363844deac3e5b069b514ba3e63c246", size = 148384, upload-time = "2026-04-02T09:27:28.271Z" }, + { url = "https://files.pythonhosted.org/packages/94/09/7e8a7f73d24dba1f0035fbbf014d2c36828fc1bf9c88f84093e57d315935/charset_normalizer-3.4.7-cp314-cp314t-macosx_10_15_universal2.whl", hash = "sha256:effc3f449787117233702311a1b7d8f59cba9ced946ba727bdc329ec69028e24", size = 330133, upload-time = "2026-04-02T09:27:29.474Z" }, + { url = "https://files.pythonhosted.org/packages/8d/da/96975ddb11f8e977f706f45cddd8540fd8242f71ecdb5d18a80723dcf62c/charset_normalizer-3.4.7-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:fbccdc05410c9ee21bbf16a35f4c1d16123dcdeb8a1d38f33654fa21d0234f79", size = 216257, upload-time = "2026-04-02T09:27:30.793Z" }, + { url = "https://files.pythonhosted.org/packages/e5/e8/1d63bf8ef2d388e95c64b2098f45f84758f6d102a087552da1485912637b/charset_normalizer-3.4.7-cp314-cp314t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:733784b6d6def852c814bce5f318d25da2ee65dd4839a0718641c696e09a2960", size = 234851, upload-time = "2026-04-02T09:27:32.44Z" }, + { url = "https://files.pythonhosted.org/packages/9b/40/e5ff04233e70da2681fa43969ad6f66ca5611d7e669be0246c4c7aaf6dc8/charset_normalizer-3.4.7-cp314-cp314t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:a89c23ef8d2c6b27fd200a42aa4ac72786e7c60d40efdc76e6011260b6e949c4", size = 233393, upload-time = "2026-04-02T09:27:34.03Z" }, + { url = "https://files.pythonhosted.org/packages/be/c1/06c6c49d5a5450f76899992f1ee40b41d076aee9279b49cf9974d2f313d5/charset_normalizer-3.4.7-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:6c114670c45346afedc0d947faf3c7f701051d2518b943679c8ff88befe14f8e", size = 223251, upload-time = "2026-04-02T09:27:35.369Z" }, + { url = "https://files.pythonhosted.org/packages/2b/9f/f2ff16fb050946169e3e1f82134d107e5d4ae72647ec8a1b1446c148480f/charset_normalizer-3.4.7-cp314-cp314t-manylinux_2_31_armv7l.whl", hash = "sha256:a180c5e59792af262bf263b21a3c49353f25945d8d9f70628e73de370d55e1e1", size = 206609, upload-time = "2026-04-02T09:27:36.661Z" }, + { url = "https://files.pythonhosted.org/packages/69/d5/a527c0cd8d64d2eab7459784fb4169a0ac76e5a6fc5237337982fd61347e/charset_normalizer-3.4.7-cp314-cp314t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:3c9a494bc5ec77d43cea229c4f6db1e4d8fe7e1bbffa8b6f0f0032430ff8ab44", size = 220014, upload-time = "2026-04-02T09:27:38.019Z" }, + { url = "https://files.pythonhosted.org/packages/7e/80/8a7b8104a3e203074dc9aa2c613d4b726c0e136bad1cc734594b02867972/charset_normalizer-3.4.7-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:8d828b6667a32a728a1ad1d93957cdf37489c57b97ae6c4de2860fa749b8fc1e", size = 218979, upload-time = "2026-04-02T09:27:39.37Z" }, + { url = "https://files.pythonhosted.org/packages/02/9a/b759b503d507f375b2b5c153e4d2ee0a75aa215b7f2489cf314f4541f2c0/charset_normalizer-3.4.7-cp314-cp314t-musllinux_1_2_armv7l.whl", hash = "sha256:cf1493cd8607bec4d8a7b9b004e699fcf8f9103a9284cc94962cb73d20f9d4a3", size = 209238, upload-time = "2026-04-02T09:27:40.722Z" }, + { url = "https://files.pythonhosted.org/packages/c2/4e/0f3f5d47b86bdb79256e7290b26ac847a2832d9a4033f7eb2cd4bcf4bb5b/charset_normalizer-3.4.7-cp314-cp314t-musllinux_1_2_ppc64le.whl", hash = "sha256:0c96c3b819b5c3e9e165495db84d41914d6894d55181d2d108cc1a69bfc9cce0", size = 236110, upload-time = "2026-04-02T09:27:42.33Z" }, + { url = "https://files.pythonhosted.org/packages/96/23/bce28734eb3ed2c91dcf93abeb8a5cf393a7b2749725030bb630e554fdd8/charset_normalizer-3.4.7-cp314-cp314t-musllinux_1_2_riscv64.whl", hash = "sha256:752a45dc4a6934060b3b0dab47e04edc3326575f82be64bc4fc293914566503e", size = 219824, upload-time = "2026-04-02T09:27:43.924Z" }, + { url = "https://files.pythonhosted.org/packages/2c/6f/6e897c6984cc4d41af319b077f2f600fc8214eb2fe2d6bcb79141b882400/charset_normalizer-3.4.7-cp314-cp314t-musllinux_1_2_s390x.whl", hash = "sha256:8778f0c7a52e56f75d12dae53ae320fae900a8b9b4164b981b9c5ce059cd1fcb", size = 233103, upload-time = "2026-04-02T09:27:45.348Z" }, + { url = "https://files.pythonhosted.org/packages/76/22/ef7bd0fe480a0ae9b656189ec00744b60933f68b4f42a7bb06589f6f576a/charset_normalizer-3.4.7-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:ce3412fbe1e31eb81ea42f4169ed94861c56e643189e1e75f0041f3fe7020abe", size = 225194, upload-time = "2026-04-02T09:27:46.706Z" }, + { url = "https://files.pythonhosted.org/packages/c5/a7/0e0ab3e0b5bc1219bd80a6a0d4d72ca74d9250cb2382b7c699c147e06017/charset_normalizer-3.4.7-cp314-cp314t-win32.whl", hash = "sha256:c03a41a8784091e67a39648f70c5f97b5b6a37f216896d44d2cdcb82615339a0", size = 159827, upload-time = "2026-04-02T09:27:48.053Z" }, + { url = "https://files.pythonhosted.org/packages/7a/1d/29d32e0fb40864b1f878c7f5a0b343ae676c6e2b271a2d55cc3a152391da/charset_normalizer-3.4.7-cp314-cp314t-win_amd64.whl", hash = "sha256:03853ed82eeebbce3c2abfdbc98c96dc205f32a79627688ac9a27370ea61a49c", size = 174168, upload-time = "2026-04-02T09:27:49.795Z" }, + { url = "https://files.pythonhosted.org/packages/de/32/d92444ad05c7a6e41fb2036749777c163baf7a0301a040cb672d6b2b1ae9/charset_normalizer-3.4.7-cp314-cp314t-win_arm64.whl", hash = "sha256:c35abb8bfff0185efac5878da64c45dafd2b37fb0383add1be155a763c1f083d", size = 153018, upload-time = "2026-04-02T09:27:51.116Z" }, + { url = "https://files.pythonhosted.org/packages/db/8f/61959034484a4a7c527811f4721e75d02d653a35afb0b6054474d8185d4c/charset_normalizer-3.4.7-py3-none-any.whl", hash = "sha256:3dce51d0f5e7951f8bb4900c257dad282f49190fdbebecd4ba99bcc41fef404d", size = 61958, upload-time = "2026-04-02T09:28:37.794Z" }, +] + [[package]] name = "colorama" version = "0.4.6" @@ -238,6 +358,15 @@ 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 = "docutils" +version = "0.22.4" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/ae/b6/03bb70946330e88ffec97aefd3ea75ba575cb2e762061e0e62a213befee8/docutils-0.22.4.tar.gz", hash = "sha256:4db53b1fde9abecbb74d91230d32ab626d94f6badfc575d6db9194a49df29968", size = 2291750, upload-time = "2025-12-18T19:00:26.443Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/02/10/5da547df7a391dcde17f59520a231527b8571e6f46fc8efb02ccb370ab12/docutils-0.22.4-py3-none-any.whl", hash = "sha256:d0013f540772d1420576855455d050a2180186c91c15779301ac2ccb3eeb68de", size = 633196, upload-time = "2025-12-18T19:00:18.077Z" }, +] + [[package]] name = "fonttools" version = "4.60.1" @@ -330,6 +459,24 @@ wheels = [ { 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 = "idna" +version = "3.16" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/1a/88/bcf9709822fe69d02c2a6a77956c98ce6ea8ca8767a9aadcedc7eb6a2390/idna-3.16.tar.gz", hash = "sha256:d7a6da03db833450fca25d2358ac9ff06cd624577a4aea3a596d5c0f77b8e03d", size = 203770, upload-time = "2026-05-22T00:16:18.781Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/94/16/70255075a9859a0e3adb789b68ceb0e210dec03934245fd98d248226572f/idna-3.16-py3-none-any.whl", hash = "sha256:cc246e3a3f89580c3a951b5ad298ca4638078b2cdd4f115654332b5c26daded5", size = 74165, upload-time = "2026-05-22T00:16:16.698Z" }, +] + +[[package]] +name = "imagesize" +version = "2.0.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/6c/e6/7bf14eeb8f8b7251141944835abd42eb20a658d89084b7e1f3e5fe394090/imagesize-2.0.0.tar.gz", hash = "sha256:8e8358c4a05c304f1fccf7ff96f036e7243a189e9e42e90851993c558cfe9ee3", size = 1773045, upload-time = "2026-03-03T14:18:29.941Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/5f/53/fb7122b71361a0d121b669dcf3d31244ef75badbbb724af388948de543e2/imagesize-2.0.0-py2.py3-none-any.whl", hash = "sha256:5667c5bbb57ab3f1fa4bc366f4fbc971db3d5ed011fd2715fd8001f782718d96", size = 9441, upload-time = "2026-03-03T14:18:27.892Z" }, +] + [[package]] name = "iniconfig" version = "2.3.0" @@ -339,6 +486,18 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/cb/b1/3846dd7f199d53cb17f49cba7e651e9ce294d8497c8c150530ed11865bb8/iniconfig-2.3.0-py3-none-any.whl", hash = "sha256:f631c04d2c48c52b84d0d0549c99ff3859c98df65b3101406327ecc7d53fbf12", size = 7484, upload-time = "2025-10-18T21:55:41.639Z" }, ] +[[package]] +name = "jinja2" +version = "3.1.6" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "markupsafe" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/df/bf/f7da0350254c0ed7c72f3e33cef02e048281fec7ecec5f032d4aac52226b/jinja2-3.1.6.tar.gz", hash = "sha256:0137fb05990d35f1275a587e9aee6d56da821fc83491a0fb838183be43f66d6d", size = 245115, upload-time = "2025-03-05T20:05:02.478Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/62/a1/3d680cbfd5f4b8f15abc1d571870c5fc3e594bb582bc3b64ea099db13e56/jinja2-3.1.6-py3-none-any.whl", hash = "sha256:85ece4451f492d0c13c5dd7c13a64681a86afae63a5f347908daf103ce6d2f67", size = 134899, upload-time = "2025-03-05T20:05:00.369Z" }, +] + [[package]] name = "kiwisolver" version = "1.4.9" @@ -429,6 +588,80 @@ wheels = [ { 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 = "markupsafe" +version = "3.0.3" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/7e/99/7690b6d4034fffd95959cbe0c02de8deb3098cc577c67bb6a24fe5d7caa7/markupsafe-3.0.3.tar.gz", hash = "sha256:722695808f4b6457b320fdc131280796bdceb04ab50fe1795cd540799ebe1698", size = 80313, upload-time = "2025-09-27T18:37:40.426Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/08/db/fefacb2136439fc8dd20e797950e749aa1f4997ed584c62cfb8ef7c2be0e/markupsafe-3.0.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:1cc7ea17a6824959616c525620e387f6dd30fec8cb44f649e31712db02123dad", size = 11631, upload-time = "2025-09-27T18:36:18.185Z" }, + { url = "https://files.pythonhosted.org/packages/e1/2e/5898933336b61975ce9dc04decbc0a7f2fee78c30353c5efba7f2d6ff27a/markupsafe-3.0.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:4bd4cd07944443f5a265608cc6aab442e4f74dff8088b0dfc8238647b8f6ae9a", size = 12058, upload-time = "2025-09-27T18:36:19.444Z" }, + { url = "https://files.pythonhosted.org/packages/1d/09/adf2df3699d87d1d8184038df46a9c80d78c0148492323f4693df54e17bb/markupsafe-3.0.3-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6b5420a1d9450023228968e7e6a9ce57f65d148ab56d2313fcd589eee96a7a50", size = 24287, upload-time = "2025-09-27T18:36:20.768Z" }, + { url = "https://files.pythonhosted.org/packages/30/ac/0273f6fcb5f42e314c6d8cd99effae6a5354604d461b8d392b5ec9530a54/markupsafe-3.0.3-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:0bf2a864d67e76e5c9a34dc26ec616a66b9888e25e7b9460e1c76d3293bd9dbf", size = 22940, upload-time = "2025-09-27T18:36:22.249Z" }, + { url = "https://files.pythonhosted.org/packages/19/ae/31c1be199ef767124c042c6c3e904da327a2f7f0cd63a0337e1eca2967a8/markupsafe-3.0.3-cp311-cp311-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:bc51efed119bc9cfdf792cdeaa4d67e8f6fcccab66ed4bfdd6bde3e59bfcbb2f", size = 21887, upload-time = "2025-09-27T18:36:23.535Z" }, + { url = "https://files.pythonhosted.org/packages/b2/76/7edcab99d5349a4532a459e1fe64f0b0467a3365056ae550d3bcf3f79e1e/markupsafe-3.0.3-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:068f375c472b3e7acbe2d5318dea141359e6900156b5b2ba06a30b169086b91a", size = 23692, upload-time = "2025-09-27T18:36:24.823Z" }, + { url = "https://files.pythonhosted.org/packages/a4/28/6e74cdd26d7514849143d69f0bf2399f929c37dc2b31e6829fd2045b2765/markupsafe-3.0.3-cp311-cp311-musllinux_1_2_riscv64.whl", hash = "sha256:7be7b61bb172e1ed687f1754f8e7484f1c8019780f6f6b0786e76bb01c2ae115", size = 21471, upload-time = "2025-09-27T18:36:25.95Z" }, + { url = "https://files.pythonhosted.org/packages/62/7e/a145f36a5c2945673e590850a6f8014318d5577ed7e5920a4b3448e0865d/markupsafe-3.0.3-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:f9e130248f4462aaa8e2552d547f36ddadbeaa573879158d721bbd33dfe4743a", size = 22923, upload-time = "2025-09-27T18:36:27.109Z" }, + { url = "https://files.pythonhosted.org/packages/0f/62/d9c46a7f5c9adbeeeda52f5b8d802e1094e9717705a645efc71b0913a0a8/markupsafe-3.0.3-cp311-cp311-win32.whl", hash = "sha256:0db14f5dafddbb6d9208827849fad01f1a2609380add406671a26386cdf15a19", size = 14572, upload-time = "2025-09-27T18:36:28.045Z" }, + { url = "https://files.pythonhosted.org/packages/83/8a/4414c03d3f891739326e1783338e48fb49781cc915b2e0ee052aa490d586/markupsafe-3.0.3-cp311-cp311-win_amd64.whl", hash = "sha256:de8a88e63464af587c950061a5e6a67d3632e36df62b986892331d4620a35c01", size = 15077, upload-time = "2025-09-27T18:36:29.025Z" }, + { url = "https://files.pythonhosted.org/packages/35/73/893072b42e6862f319b5207adc9ae06070f095b358655f077f69a35601f0/markupsafe-3.0.3-cp311-cp311-win_arm64.whl", hash = "sha256:3b562dd9e9ea93f13d53989d23a7e775fdfd1066c33494ff43f5418bc8c58a5c", size = 13876, upload-time = "2025-09-27T18:36:29.954Z" }, + { url = "https://files.pythonhosted.org/packages/5a/72/147da192e38635ada20e0a2e1a51cf8823d2119ce8883f7053879c2199b5/markupsafe-3.0.3-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:d53197da72cc091b024dd97249dfc7794d6a56530370992a5e1a08983ad9230e", size = 11615, upload-time = "2025-09-27T18:36:30.854Z" }, + { url = "https://files.pythonhosted.org/packages/9a/81/7e4e08678a1f98521201c3079f77db69fb552acd56067661f8c2f534a718/markupsafe-3.0.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:1872df69a4de6aead3491198eaf13810b565bdbeec3ae2dc8780f14458ec73ce", size = 12020, upload-time = "2025-09-27T18:36:31.971Z" }, + { url = "https://files.pythonhosted.org/packages/1e/2c/799f4742efc39633a1b54a92eec4082e4f815314869865d876824c257c1e/markupsafe-3.0.3-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:3a7e8ae81ae39e62a41ec302f972ba6ae23a5c5396c8e60113e9066ef893da0d", size = 24332, upload-time = "2025-09-27T18:36:32.813Z" }, + { url = "https://files.pythonhosted.org/packages/3c/2e/8d0c2ab90a8c1d9a24f0399058ab8519a3279d1bd4289511d74e909f060e/markupsafe-3.0.3-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:d6dd0be5b5b189d31db7cda48b91d7e0a9795f31430b7f271219ab30f1d3ac9d", size = 22947, upload-time = "2025-09-27T18:36:33.86Z" }, + { url = "https://files.pythonhosted.org/packages/2c/54/887f3092a85238093a0b2154bd629c89444f395618842e8b0c41783898ea/markupsafe-3.0.3-cp312-cp312-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:94c6f0bb423f739146aec64595853541634bde58b2135f27f61c1ffd1cd4d16a", size = 21962, upload-time = "2025-09-27T18:36:35.099Z" }, + { url = "https://files.pythonhosted.org/packages/c9/2f/336b8c7b6f4a4d95e91119dc8521402461b74a485558d8f238a68312f11c/markupsafe-3.0.3-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:be8813b57049a7dc738189df53d69395eba14fb99345e0a5994914a3864c8a4b", size = 23760, upload-time = "2025-09-27T18:36:36.001Z" }, + { url = "https://files.pythonhosted.org/packages/32/43/67935f2b7e4982ffb50a4d169b724d74b62a3964bc1a9a527f5ac4f1ee2b/markupsafe-3.0.3-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:83891d0e9fb81a825d9a6d61e3f07550ca70a076484292a70fde82c4b807286f", size = 21529, upload-time = "2025-09-27T18:36:36.906Z" }, + { url = "https://files.pythonhosted.org/packages/89/e0/4486f11e51bbba8b0c041098859e869e304d1c261e59244baa3d295d47b7/markupsafe-3.0.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:77f0643abe7495da77fb436f50f8dab76dbc6e5fd25d39589a0f1fe6548bfa2b", size = 23015, upload-time = "2025-09-27T18:36:37.868Z" }, + { url = "https://files.pythonhosted.org/packages/2f/e1/78ee7a023dac597a5825441ebd17170785a9dab23de95d2c7508ade94e0e/markupsafe-3.0.3-cp312-cp312-win32.whl", hash = "sha256:d88b440e37a16e651bda4c7c2b930eb586fd15ca7406cb39e211fcff3bf3017d", size = 14540, upload-time = "2025-09-27T18:36:38.761Z" }, + { url = "https://files.pythonhosted.org/packages/aa/5b/bec5aa9bbbb2c946ca2733ef9c4ca91c91b6a24580193e891b5f7dbe8e1e/markupsafe-3.0.3-cp312-cp312-win_amd64.whl", hash = "sha256:26a5784ded40c9e318cfc2bdb30fe164bdb8665ded9cd64d500a34fb42067b1c", size = 15105, upload-time = "2025-09-27T18:36:39.701Z" }, + { url = "https://files.pythonhosted.org/packages/e5/f1/216fc1bbfd74011693a4fd837e7026152e89c4bcf3e77b6692fba9923123/markupsafe-3.0.3-cp312-cp312-win_arm64.whl", hash = "sha256:35add3b638a5d900e807944a078b51922212fb3dedb01633a8defc4b01a3c85f", size = 13906, upload-time = "2025-09-27T18:36:40.689Z" }, + { url = "https://files.pythonhosted.org/packages/38/2f/907b9c7bbba283e68f20259574b13d005c121a0fa4c175f9bed27c4597ff/markupsafe-3.0.3-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:e1cf1972137e83c5d4c136c43ced9ac51d0e124706ee1c8aa8532c1287fa8795", size = 11622, upload-time = "2025-09-27T18:36:41.777Z" }, + { url = "https://files.pythonhosted.org/packages/9c/d9/5f7756922cdd676869eca1c4e3c0cd0df60ed30199ffd775e319089cb3ed/markupsafe-3.0.3-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:116bb52f642a37c115f517494ea5feb03889e04df47eeff5b130b1808ce7c219", size = 12029, upload-time = "2025-09-27T18:36:43.257Z" }, + { url = "https://files.pythonhosted.org/packages/00/07/575a68c754943058c78f30db02ee03a64b3c638586fba6a6dd56830b30a3/markupsafe-3.0.3-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:133a43e73a802c5562be9bbcd03d090aa5a1fe899db609c29e8c8d815c5f6de6", size = 24374, upload-time = "2025-09-27T18:36:44.508Z" }, + { url = "https://files.pythonhosted.org/packages/a9/21/9b05698b46f218fc0e118e1f8168395c65c8a2c750ae2bab54fc4bd4e0e8/markupsafe-3.0.3-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:ccfcd093f13f0f0b7fdd0f198b90053bf7b2f02a3927a30e63f3ccc9df56b676", size = 22980, upload-time = "2025-09-27T18:36:45.385Z" }, + { url = "https://files.pythonhosted.org/packages/7f/71/544260864f893f18b6827315b988c146b559391e6e7e8f7252839b1b846a/markupsafe-3.0.3-cp313-cp313-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:509fa21c6deb7a7a273d629cf5ec029bc209d1a51178615ddf718f5918992ab9", size = 21990, upload-time = "2025-09-27T18:36:46.916Z" }, + { url = "https://files.pythonhosted.org/packages/c2/28/b50fc2f74d1ad761af2f5dcce7492648b983d00a65b8c0e0cb457c82ebbe/markupsafe-3.0.3-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:a4afe79fb3de0b7097d81da19090f4df4f8d3a2b3adaa8764138aac2e44f3af1", size = 23784, upload-time = "2025-09-27T18:36:47.884Z" }, + { url = "https://files.pythonhosted.org/packages/ed/76/104b2aa106a208da8b17a2fb72e033a5a9d7073c68f7e508b94916ed47a9/markupsafe-3.0.3-cp313-cp313-musllinux_1_2_riscv64.whl", hash = "sha256:795e7751525cae078558e679d646ae45574b47ed6e7771863fcc079a6171a0fc", size = 21588, upload-time = "2025-09-27T18:36:48.82Z" }, + { url = "https://files.pythonhosted.org/packages/b5/99/16a5eb2d140087ebd97180d95249b00a03aa87e29cc224056274f2e45fd6/markupsafe-3.0.3-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:8485f406a96febb5140bfeca44a73e3ce5116b2501ac54fe953e488fb1d03b12", size = 23041, upload-time = "2025-09-27T18:36:49.797Z" }, + { url = "https://files.pythonhosted.org/packages/19/bc/e7140ed90c5d61d77cea142eed9f9c303f4c4806f60a1044c13e3f1471d0/markupsafe-3.0.3-cp313-cp313-win32.whl", hash = "sha256:bdd37121970bfd8be76c5fb069c7751683bdf373db1ed6c010162b2a130248ed", size = 14543, upload-time = "2025-09-27T18:36:51.584Z" }, + { url = "https://files.pythonhosted.org/packages/05/73/c4abe620b841b6b791f2edc248f556900667a5a1cf023a6646967ae98335/markupsafe-3.0.3-cp313-cp313-win_amd64.whl", hash = "sha256:9a1abfdc021a164803f4d485104931fb8f8c1efd55bc6b748d2f5774e78b62c5", size = 15113, upload-time = "2025-09-27T18:36:52.537Z" }, + { url = "https://files.pythonhosted.org/packages/f0/3a/fa34a0f7cfef23cf9500d68cb7c32dd64ffd58a12b09225fb03dd37d5b80/markupsafe-3.0.3-cp313-cp313-win_arm64.whl", hash = "sha256:7e68f88e5b8799aa49c85cd116c932a1ac15caaa3f5db09087854d218359e485", size = 13911, upload-time = "2025-09-27T18:36:53.513Z" }, + { url = "https://files.pythonhosted.org/packages/e4/d7/e05cd7efe43a88a17a37b3ae96e79a19e846f3f456fe79c57ca61356ef01/markupsafe-3.0.3-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:218551f6df4868a8d527e3062d0fb968682fe92054e89978594c28e642c43a73", size = 11658, upload-time = "2025-09-27T18:36:54.819Z" }, + { url = "https://files.pythonhosted.org/packages/99/9e/e412117548182ce2148bdeacdda3bb494260c0b0184360fe0d56389b523b/markupsafe-3.0.3-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:3524b778fe5cfb3452a09d31e7b5adefeea8c5be1d43c4f810ba09f2ceb29d37", size = 12066, upload-time = "2025-09-27T18:36:55.714Z" }, + { url = "https://files.pythonhosted.org/packages/bc/e6/fa0ffcda717ef64a5108eaa7b4f5ed28d56122c9a6d70ab8b72f9f715c80/markupsafe-3.0.3-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:4e885a3d1efa2eadc93c894a21770e4bc67899e3543680313b09f139e149ab19", size = 25639, upload-time = "2025-09-27T18:36:56.908Z" }, + { url = "https://files.pythonhosted.org/packages/96/ec/2102e881fe9d25fc16cb4b25d5f5cde50970967ffa5dddafdb771237062d/markupsafe-3.0.3-cp313-cp313t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:8709b08f4a89aa7586de0aadc8da56180242ee0ada3999749b183aa23df95025", size = 23569, upload-time = "2025-09-27T18:36:57.913Z" }, + { url = "https://files.pythonhosted.org/packages/4b/30/6f2fce1f1f205fc9323255b216ca8a235b15860c34b6798f810f05828e32/markupsafe-3.0.3-cp313-cp313t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:b8512a91625c9b3da6f127803b166b629725e68af71f8184ae7e7d54686a56d6", size = 23284, upload-time = "2025-09-27T18:36:58.833Z" }, + { url = "https://files.pythonhosted.org/packages/58/47/4a0ccea4ab9f5dcb6f79c0236d954acb382202721e704223a8aafa38b5c8/markupsafe-3.0.3-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:9b79b7a16f7fedff2495d684f2b59b0457c3b493778c9eed31111be64d58279f", size = 24801, upload-time = "2025-09-27T18:36:59.739Z" }, + { url = "https://files.pythonhosted.org/packages/6a/70/3780e9b72180b6fecb83a4814d84c3bf4b4ae4bf0b19c27196104149734c/markupsafe-3.0.3-cp313-cp313t-musllinux_1_2_riscv64.whl", hash = "sha256:12c63dfb4a98206f045aa9563db46507995f7ef6d83b2f68eda65c307c6829eb", size = 22769, upload-time = "2025-09-27T18:37:00.719Z" }, + { url = "https://files.pythonhosted.org/packages/98/c5/c03c7f4125180fc215220c035beac6b9cb684bc7a067c84fc69414d315f5/markupsafe-3.0.3-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:8f71bc33915be5186016f675cd83a1e08523649b0e33efdb898db577ef5bb009", size = 23642, upload-time = "2025-09-27T18:37:01.673Z" }, + { url = "https://files.pythonhosted.org/packages/80/d6/2d1b89f6ca4bff1036499b1e29a1d02d282259f3681540e16563f27ebc23/markupsafe-3.0.3-cp313-cp313t-win32.whl", hash = "sha256:69c0b73548bc525c8cb9a251cddf1931d1db4d2258e9599c28c07ef3580ef354", size = 14612, upload-time = "2025-09-27T18:37:02.639Z" }, + { url = "https://files.pythonhosted.org/packages/2b/98/e48a4bfba0a0ffcf9925fe2d69240bfaa19c6f7507b8cd09c70684a53c1e/markupsafe-3.0.3-cp313-cp313t-win_amd64.whl", hash = "sha256:1b4b79e8ebf6b55351f0d91fe80f893b4743f104bff22e90697db1590e47a218", size = 15200, upload-time = "2025-09-27T18:37:03.582Z" }, + { url = "https://files.pythonhosted.org/packages/0e/72/e3cc540f351f316e9ed0f092757459afbc595824ca724cbc5a5d4263713f/markupsafe-3.0.3-cp313-cp313t-win_arm64.whl", hash = "sha256:ad2cf8aa28b8c020ab2fc8287b0f823d0a7d8630784c31e9ee5edea20f406287", size = 13973, upload-time = "2025-09-27T18:37:04.929Z" }, + { url = "https://files.pythonhosted.org/packages/33/8a/8e42d4838cd89b7dde187011e97fe6c3af66d8c044997d2183fbd6d31352/markupsafe-3.0.3-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:eaa9599de571d72e2daf60164784109f19978b327a3910d3e9de8c97b5b70cfe", size = 11619, upload-time = "2025-09-27T18:37:06.342Z" }, + { url = "https://files.pythonhosted.org/packages/b5/64/7660f8a4a8e53c924d0fa05dc3a55c9cee10bbd82b11c5afb27d44b096ce/markupsafe-3.0.3-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:c47a551199eb8eb2121d4f0f15ae0f923d31350ab9280078d1e5f12b249e0026", size = 12029, upload-time = "2025-09-27T18:37:07.213Z" }, + { url = "https://files.pythonhosted.org/packages/da/ef/e648bfd021127bef5fa12e1720ffed0c6cbb8310c8d9bea7266337ff06de/markupsafe-3.0.3-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:f34c41761022dd093b4b6896d4810782ffbabe30f2d443ff5f083e0cbbb8c737", size = 24408, upload-time = "2025-09-27T18:37:09.572Z" }, + { url = "https://files.pythonhosted.org/packages/41/3c/a36c2450754618e62008bf7435ccb0f88053e07592e6028a34776213d877/markupsafe-3.0.3-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:457a69a9577064c05a97c41f4e65148652db078a3a509039e64d3467b9e7ef97", size = 23005, upload-time = "2025-09-27T18:37:10.58Z" }, + { url = "https://files.pythonhosted.org/packages/bc/20/b7fdf89a8456b099837cd1dc21974632a02a999ec9bf7ca3e490aacd98e7/markupsafe-3.0.3-cp314-cp314-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:e8afc3f2ccfa24215f8cb28dcf43f0113ac3c37c2f0f0806d8c70e4228c5cf4d", size = 22048, upload-time = "2025-09-27T18:37:11.547Z" }, + { url = "https://files.pythonhosted.org/packages/9a/a7/591f592afdc734f47db08a75793a55d7fbcc6902a723ae4cfbab61010cc5/markupsafe-3.0.3-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:ec15a59cf5af7be74194f7ab02d0f59a62bdcf1a537677ce67a2537c9b87fcda", size = 23821, upload-time = "2025-09-27T18:37:12.48Z" }, + { url = "https://files.pythonhosted.org/packages/7d/33/45b24e4f44195b26521bc6f1a82197118f74df348556594bd2262bda1038/markupsafe-3.0.3-cp314-cp314-musllinux_1_2_riscv64.whl", hash = "sha256:0eb9ff8191e8498cca014656ae6b8d61f39da5f95b488805da4bb029cccbfbaf", size = 21606, upload-time = "2025-09-27T18:37:13.485Z" }, + { url = "https://files.pythonhosted.org/packages/ff/0e/53dfaca23a69fbfbbf17a4b64072090e70717344c52eaaaa9c5ddff1e5f0/markupsafe-3.0.3-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:2713baf880df847f2bece4230d4d094280f4e67b1e813eec43b4c0e144a34ffe", size = 23043, upload-time = "2025-09-27T18:37:14.408Z" }, + { url = "https://files.pythonhosted.org/packages/46/11/f333a06fc16236d5238bfe74daccbca41459dcd8d1fa952e8fbd5dccfb70/markupsafe-3.0.3-cp314-cp314-win32.whl", hash = "sha256:729586769a26dbceff69f7a7dbbf59ab6572b99d94576a5592625d5b411576b9", size = 14747, upload-time = "2025-09-27T18:37:15.36Z" }, + { url = "https://files.pythonhosted.org/packages/28/52/182836104b33b444e400b14f797212f720cbc9ed6ba34c800639d154e821/markupsafe-3.0.3-cp314-cp314-win_amd64.whl", hash = "sha256:bdc919ead48f234740ad807933cdf545180bfbe9342c2bb451556db2ed958581", size = 15341, upload-time = "2025-09-27T18:37:16.496Z" }, + { url = "https://files.pythonhosted.org/packages/6f/18/acf23e91bd94fd7b3031558b1f013adfa21a8e407a3fdb32745538730382/markupsafe-3.0.3-cp314-cp314-win_arm64.whl", hash = "sha256:5a7d5dc5140555cf21a6fefbdbf8723f06fcd2f63ef108f2854de715e4422cb4", size = 14073, upload-time = "2025-09-27T18:37:17.476Z" }, + { url = "https://files.pythonhosted.org/packages/3c/f0/57689aa4076e1b43b15fdfa646b04653969d50cf30c32a102762be2485da/markupsafe-3.0.3-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:1353ef0c1b138e1907ae78e2f6c63ff67501122006b0f9abad68fda5f4ffc6ab", size = 11661, upload-time = "2025-09-27T18:37:18.453Z" }, + { url = "https://files.pythonhosted.org/packages/89/c3/2e67a7ca217c6912985ec766c6393b636fb0c2344443ff9d91404dc4c79f/markupsafe-3.0.3-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:1085e7fbddd3be5f89cc898938f42c0b3c711fdcb37d75221de2666af647c175", size = 12069, upload-time = "2025-09-27T18:37:19.332Z" }, + { url = "https://files.pythonhosted.org/packages/f0/00/be561dce4e6ca66b15276e184ce4b8aec61fe83662cce2f7d72bd3249d28/markupsafe-3.0.3-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:1b52b4fb9df4eb9ae465f8d0c228a00624de2334f216f178a995ccdcf82c4634", size = 25670, upload-time = "2025-09-27T18:37:20.245Z" }, + { url = "https://files.pythonhosted.org/packages/50/09/c419f6f5a92e5fadde27efd190eca90f05e1261b10dbd8cbcb39cd8ea1dc/markupsafe-3.0.3-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:fed51ac40f757d41b7c48425901843666a6677e3e8eb0abcff09e4ba6e664f50", size = 23598, upload-time = "2025-09-27T18:37:21.177Z" }, + { url = "https://files.pythonhosted.org/packages/22/44/a0681611106e0b2921b3033fc19bc53323e0b50bc70cffdd19f7d679bb66/markupsafe-3.0.3-cp314-cp314t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:f190daf01f13c72eac4efd5c430a8de82489d9cff23c364c3ea822545032993e", size = 23261, upload-time = "2025-09-27T18:37:22.167Z" }, + { url = "https://files.pythonhosted.org/packages/5f/57/1b0b3f100259dc9fffe780cfb60d4be71375510e435efec3d116b6436d43/markupsafe-3.0.3-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:e56b7d45a839a697b5eb268c82a71bd8c7f6c94d6fd50c3d577fa39a9f1409f5", size = 24835, upload-time = "2025-09-27T18:37:23.296Z" }, + { url = "https://files.pythonhosted.org/packages/26/6a/4bf6d0c97c4920f1597cc14dd720705eca0bf7c787aebc6bb4d1bead5388/markupsafe-3.0.3-cp314-cp314t-musllinux_1_2_riscv64.whl", hash = "sha256:f3e98bb3798ead92273dc0e5fd0f31ade220f59a266ffd8a4f6065e0a3ce0523", size = 22733, upload-time = "2025-09-27T18:37:24.237Z" }, + { url = "https://files.pythonhosted.org/packages/14/c7/ca723101509b518797fedc2fdf79ba57f886b4aca8a7d31857ba3ee8281f/markupsafe-3.0.3-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:5678211cb9333a6468fb8d8be0305520aa073f50d17f089b5b4b477ea6e67fdc", size = 23672, upload-time = "2025-09-27T18:37:25.271Z" }, + { url = "https://files.pythonhosted.org/packages/fb/df/5bd7a48c256faecd1d36edc13133e51397e41b73bb77e1a69deab746ebac/markupsafe-3.0.3-cp314-cp314t-win32.whl", hash = "sha256:915c04ba3851909ce68ccc2b8e2cd691618c4dc4c4232fb7982bca3f41fd8c3d", size = 14819, upload-time = "2025-09-27T18:37:26.285Z" }, + { url = "https://files.pythonhosted.org/packages/1a/8a/0402ba61a2f16038b48b39bccca271134be00c5c9f0f623208399333c448/markupsafe-3.0.3-cp314-cp314t-win_amd64.whl", hash = "sha256:4faffd047e07c38848ce017e8725090413cd80cbc23d86e55c587bf979e579c9", size = 15426, upload-time = "2025-09-27T18:37:27.316Z" }, + { url = "https://files.pythonhosted.org/packages/70/bc/6f1c2f612465f5fa89b95bead1f44dcb607670fd42891d8fdcd5d039f4f4/markupsafe-3.0.3-cp314-cp314t-win_arm64.whl", hash = "sha256:32001d6a8fc98c8cb5c947787c5d08b0a50663d139f1305bac5885d98d9b40fa", size = 14146, upload-time = "2025-09-27T18:37:28.327Z" }, +] + [[package]] name = "matplotlib" version = "3.10.7" @@ -822,6 +1055,30 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/f1/12/de94a39c2ef588c7e6455cfbe7343d3b2dc9d6b6b2f40c4c6565744c873d/pyyaml-6.0.3-cp314-cp314t-win_arm64.whl", hash = "sha256:ebc55a14a21cb14062aa4162f906cd962b28e2e9ea38f9b4391244cd8de4ae0b", size = 149341, upload-time = "2025-09-25T21:32:56.828Z" }, ] +[[package]] +name = "requests" +version = "2.34.2" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "certifi" }, + { name = "charset-normalizer" }, + { name = "idna" }, + { name = "urllib3" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/ac/c3/e2a2b89f2d3e2179abd6d00ebd70bff6273f37fb3e0cc209f48b39d00cbf/requests-2.34.2.tar.gz", hash = "sha256:f288924cae4e29463698d6d60bc6a4da69c89185ad1e0bcc4104f584e960b9ed", size = 142856, upload-time = "2026-05-14T19:25:27.735Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/a0/f4/c67b0b3f1b9245e8d266f0f112c500d50e5b4e83cb6f3b71b6528104182a/requests-2.34.2-py3-none-any.whl", hash = "sha256:2a0d60c172f83ac6ab31e4554906c0f3b3588d37b5cb939b1c061f4907e278e0", size = 73075, upload-time = "2026-05-14T19:25:26.443Z" }, +] + +[[package]] +name = "roman-numerals" +version = "4.1.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/ae/f9/41dc953bbeb056c17d5f7a519f50fdf010bd0553be2d630bc69d1e022703/roman_numerals-4.1.0.tar.gz", hash = "sha256:1af8b147eb1405d5839e78aeb93131690495fe9da5c91856cb33ad55a7f1e5b2", size = 9077, upload-time = "2025-12-17T18:25:34.381Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/04/54/6f679c435d28e0a568d8e8a7c0a93a09010818634c3c3907fc98d8983770/roman_numerals-4.1.0-py3-none-any.whl", hash = "sha256:647ba99caddc2cc1e55a51e4360689115551bf4476d90e8162cf8c345fe233c7", size = 7676, upload-time = "2025-12-17T18:25:33.098Z" }, +] + [[package]] name = "ruff" version = "0.14.5" @@ -946,6 +1203,8 @@ dev = [ { name = "pytest-cov" }, { name = "pytest-mock" }, { name = "ruff" }, + { name = "sphinx", version = "9.0.4", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.12'" }, + { name = "sphinx", version = "9.1.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.12'" }, ] [package.metadata] @@ -963,6 +1222,132 @@ dev = [ { name = "pytest-cov", specifier = ">=7.1.0" }, { name = "pytest-mock", specifier = ">=3.15.1" }, { name = "ruff", specifier = ">=0.14.5" }, + { name = "sphinx", specifier = ">=9.0.4" }, +] + +[[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 = "sphinx" +version = "9.0.4" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version < '3.12'", +] +dependencies = [ + { name = "alabaster", marker = "python_full_version < '3.12'" }, + { name = "babel", marker = "python_full_version < '3.12'" }, + { name = "colorama", marker = "python_full_version < '3.12' and sys_platform == 'win32'" }, + { name = "docutils", marker = "python_full_version < '3.12'" }, + { name = "imagesize", marker = "python_full_version < '3.12'" }, + { name = "jinja2", marker = "python_full_version < '3.12'" }, + { name = "packaging", marker = "python_full_version < '3.12'" }, + { name = "pygments", marker = "python_full_version < '3.12'" }, + { name = "requests", marker = "python_full_version < '3.12'" }, + { name = "roman-numerals", marker = "python_full_version < '3.12'" }, + { name = "snowballstemmer", marker = "python_full_version < '3.12'" }, + { name = "sphinxcontrib-applehelp", marker = "python_full_version < '3.12'" }, + { name = "sphinxcontrib-devhelp", marker = "python_full_version < '3.12'" }, + { name = "sphinxcontrib-htmlhelp", marker = "python_full_version < '3.12'" }, + { name = "sphinxcontrib-jsmath", marker = "python_full_version < '3.12'" }, + { name = "sphinxcontrib-qthelp", marker = "python_full_version < '3.12'" }, + { name = "sphinxcontrib-serializinghtml", marker = "python_full_version < '3.12'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/42/50/a8c6ccc36d5eacdfd7913ddccd15a9cee03ecafc5ee2bc40e1f168d85022/sphinx-9.0.4.tar.gz", hash = "sha256:594ef59d042972abbc581d8baa577404abe4e6c3b04ef61bd7fc2acbd51f3fa3", size = 8710502, upload-time = "2025-12-04T07:45:27.343Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/c6/3f/4bbd76424c393caead2e1eb89777f575dee5c8653e2d4b6afd7a564f5974/sphinx-9.0.4-py3-none-any.whl", hash = "sha256:5bebc595a5e943ea248b99c13814c1c5e10b3ece718976824ffa7959ff95fffb", size = 3917713, upload-time = "2025-12-04T07:45:24.944Z" }, +] + +[[package]] +name = "sphinx" +version = "9.1.0" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version >= '3.12'", +] +dependencies = [ + { name = "alabaster", marker = "python_full_version >= '3.12'" }, + { name = "babel", marker = "python_full_version >= '3.12'" }, + { name = "colorama", marker = "python_full_version >= '3.12' and sys_platform == 'win32'" }, + { name = "docutils", marker = "python_full_version >= '3.12'" }, + { name = "imagesize", marker = "python_full_version >= '3.12'" }, + { name = "jinja2", marker = "python_full_version >= '3.12'" }, + { name = "packaging", marker = "python_full_version >= '3.12'" }, + { name = "pygments", marker = "python_full_version >= '3.12'" }, + { name = "requests", marker = "python_full_version >= '3.12'" }, + { name = "roman-numerals", marker = "python_full_version >= '3.12'" }, + { name = "snowballstemmer", marker = "python_full_version >= '3.12'" }, + { name = "sphinxcontrib-applehelp", marker = "python_full_version >= '3.12'" }, + { name = "sphinxcontrib-devhelp", marker = "python_full_version >= '3.12'" }, + { name = "sphinxcontrib-htmlhelp", marker = "python_full_version >= '3.12'" }, + { name = "sphinxcontrib-jsmath", marker = "python_full_version >= '3.12'" }, + { name = "sphinxcontrib-qthelp", marker = "python_full_version >= '3.12'" }, + { name = "sphinxcontrib-serializinghtml", marker = "python_full_version >= '3.12'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/cd/bd/f08eb0f4eed5c83f1ba2a3bd18f7745a2b1525fad70660a1c00224ec468a/sphinx-9.1.0.tar.gz", hash = "sha256:7741722357dd75f8190766926071fed3bdc211c74dd2d7d4df5404da95930ddb", size = 8718324, upload-time = "2025-12-31T15:09:27.646Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/73/f7/b1884cb3188ab181fc81fa00c266699dab600f927a964df02ec3d5d1916a/sphinx-9.1.0-py3-none-any.whl", hash = "sha256:c84fdd4e782504495fe4f2c0b3413d6c2bf388589bb352d439b2a3bb99991978", size = 3921742, upload-time = "2025-12-31T15:09:25.561Z" }, +] + +[[package]] +name = "sphinxcontrib-applehelp" +version = "2.0.0" +source = { registry = "https://pypi.org/simple" } +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 = "2.0.0" +source = { registry = "https://pypi.org/simple" } +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.1.0" +source = { registry = "https://pypi.org/simple" } +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-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 = "2.0.0" +source = { registry = "https://pypi.org/simple" } +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 = "2.0.0" +source = { registry = "https://pypi.org/simple" } +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]] @@ -1018,3 +1403,12 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/5a/cd/e80b62269fc78fc36c9af5a6b89c835baa8af28ff5ad28c7028d60860320/tomli-2.4.1-cp314-cp314t-win_arm64.whl", hash = "sha256:eab21f45c7f66c13f2a9e0e1535309cee140182a9cdae1e041d02e47291e8396", size = 100393, upload-time = "2026-03-25T20:22:02.137Z" }, { url = "https://files.pythonhosted.org/packages/7b/61/cceae43728b7de99d9b847560c262873a1f6c98202171fd5ed62640b494b/tomli-2.4.1-py3-none-any.whl", hash = "sha256:0d85819802132122da43cb86656f8d1f8c6587d54ae7dcaf30e90533028b49fe", size = 14583, upload-time = "2026-03-25T20:22:03.012Z" }, ] + +[[package]] +name = "urllib3" +version = "2.7.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/53/0c/06f8b233b8fd13b9e5ee11424ef85419ba0d8ba0b3138bf360be2ff56953/urllib3-2.7.0.tar.gz", hash = "sha256:231e0ec3b63ceb14667c67be60f2f2c40a518cb38b03af60abc813da26505f4c", size = 433602, upload-time = "2026-05-07T16:13:18.596Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/7f/3e/5db95bcf282c52709639744ca2a8b149baccf648e39c8cc87553df9eae0c/urllib3-2.7.0-py3-none-any.whl", hash = "sha256:9fb4c81ebbb1ce9531cce37674bbc6f1360472bc18ca9a553ede278ef7276897", size = 131087, upload-time = "2026-05-07T16:13:17.151Z" }, +] From bd45ce2376d14e50eacc402e5390b6212def5ff3 Mon Sep 17 00:00:00 2001 From: hfoote Date: Fri, 22 May 2026 20:41:17 -0700 Subject: [PATCH 2/4] Sphinx documentation site --- README.md | 5 + docs/source/api/modules.rst | 7 + docs/source/api/snapanalysis.rst | 53 ++ docs/source/conf.py | 10 +- docs/source/index.rst | 10 +- docs/source/installation.rst | 30 + .../tutorials/1_working_with_snapshots.ipynb | 658 ++++++++++++++++ .../2_working_with_simulations.ipynb | 280 +++++++ docs/source/tutorials/tutorials.rst | 14 + pyproject.toml | 2 + uv.lock | 738 ++++++++++++++++++ 11 files changed, 1802 insertions(+), 5 deletions(-) create mode 100644 docs/source/api/modules.rst create mode 100644 docs/source/api/snapanalysis.rst create mode 100644 docs/source/installation.rst create mode 100644 docs/source/tutorials/1_working_with_snapshots.ipynb create mode 100644 docs/source/tutorials/2_working_with_simulations.ipynb create mode 100644 docs/source/tutorials/tutorials.rst diff --git a/README.md b/README.md index dc8a7b1..1554d25 100644 --- a/README.md +++ b/README.md @@ -19,6 +19,11 @@ and upgrade pip if needed pip install --upgrade pip ``` +### With `pip` via PyPI +```bash +pip install snapanalysis +``` + ### From Source NOTE: If you intend to develop/contribute to `snapAnalysis`, please use the [development install instructions](/CONTRIBUTING.md#contributing-code). 1. Clone this repository: diff --git a/docs/source/api/modules.rst b/docs/source/api/modules.rst new file mode 100644 index 0000000..e8978fb --- /dev/null +++ b/docs/source/api/modules.rst @@ -0,0 +1,7 @@ +src +=== + +.. toctree:: + :maxdepth: 4 + + snapanalysis diff --git a/docs/source/api/snapanalysis.rst b/docs/source/api/snapanalysis.rst new file mode 100644 index 0000000..e9543ef --- /dev/null +++ b/docs/source/api/snapanalysis.rst @@ -0,0 +1,53 @@ +snapanalysis package +==================== + +Submodules +---------- + +snapanalysis.orbit module +------------------------- + +.. automodule:: snapanalysis.orbit + :members: + :show-inheritance: + :undoc-members: + +snapanalysis.sim module +----------------------- + +.. automodule:: snapanalysis.sim + :members: + :show-inheritance: + :undoc-members: + +snapanalysis.snap module +------------------------ + +.. automodule:: snapanalysis.snap + :members: + :show-inheritance: + :undoc-members: + +snapanalysis.utils module +------------------------- + +.. automodule:: snapanalysis.utils + :members: + :show-inheritance: + :undoc-members: + +snapanalysis.vis module +----------------------- + +.. automodule:: snapanalysis.vis + :members: + :show-inheritance: + :undoc-members: + +Module contents +--------------- + +.. automodule:: snapanalysis + :members: + :show-inheritance: + :undoc-members: diff --git a/docs/source/conf.py b/docs/source/conf.py index 73185e2..c6104d1 100644 --- a/docs/source/conf.py +++ b/docs/source/conf.py @@ -3,6 +3,10 @@ # For the full list of built-in configuration values, see the documentation: # https://www.sphinx-doc.org/en/master/usage/configuration.html +import os +import sys +sys.path.insert(0,os.path.abspath('../src/snapAnalysis/')) + # -- Project information ----------------------------------------------------- # https://www.sphinx-doc.org/en/master/usage/configuration.html#project-information @@ -14,7 +18,11 @@ # -- General configuration --------------------------------------------------- # https://www.sphinx-doc.org/en/master/usage/configuration.html#general-configuration -extensions = [] +extensions = [ + "nbsphinx", + "sphinx.ext.autosummary", + "sphinx.ext.napoleon", +] templates_path = ['_templates'] exclude_patterns = [] diff --git a/docs/source/index.rst b/docs/source/index.rst index fd326b9..f16fa53 100644 --- a/docs/source/index.rst +++ b/docs/source/index.rst @@ -1,3 +1,5 @@ +.. _home: + .. snapAnalysis documentation master file, created by sphinx-quickstart on Fri May 22 16:15:06 2026. You can adapt this file completely to your liking, but it should at least @@ -11,7 +13,7 @@ ``snapAnalysis`` supports many common workflows for handling snapshots, including particle loading, particle filtering, centering, rotations, coordinate transformations, galaxy shape analysis, particle orbit extraction, galaxy center-of-mass orbit extraction, and more. Also included are a few basic visualization functions for plotting density and potential fields, density and anisotropy profiles, and more. Units are detected automatically from snapshot headers and handled using astropy's units module. .. note:: - ``snapAnalysis`` is still in early development. We encourage contributions following `our guidelines `__ + ``snapAnalysis`` is still in early development. We encourage contributions following `our guidelines `__. Contents -------- @@ -19,7 +21,7 @@ Contents :maxdepth: 2 :caption: Contents: - Installation - Tutorials - API Reference + Installation + Tutorials + User Guide diff --git a/docs/source/installation.rst b/docs/source/installation.rst new file mode 100644 index 0000000..5b35bfb --- /dev/null +++ b/docs/source/installation.rst @@ -0,0 +1,30 @@ +.. _installation: + +Installing ``snapAnalysis`` +=========================== + +``snapAnalysis`` is available on PyPI, or can also be installed from source. + +To install from PyPI using pip, run + +.. code-block:: bash + + pip install snapanalysis + +Alternatively, to install from source, clone the repository + +.. code-block:: bash + + git clone https://github.com/hfoote/snapAnalysis.git + +and install using pip locally: + +.. code-block:: bash + + cd snapAnalysis + python -m pip install . + +Next Steps +---------- + +Take a look at the :ref:`tutorials` to get started with using ``snapAnalysis``. \ No newline at end of file diff --git a/docs/source/tutorials/1_working_with_snapshots.ipynb b/docs/source/tutorials/1_working_with_snapshots.ipynb new file mode 100644 index 0000000..c68c005 --- /dev/null +++ b/docs/source/tutorials/1_working_with_snapshots.ipynb @@ -0,0 +1,658 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "a9441644", + "metadata": {}, + "source": [ + "# Working with snapshots\n", + "\n", + "The core of `snapAnalysis` is the `snapshot` class, which handles data from one particle type of a single snapshot. In this notebook, we demonstrate a few common workflows for loading and working with simulation particle data. " + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "id": "c69fe406", + "metadata": {}, + "outputs": [], + "source": [ + "from snapanalysis.snap import snapshot\n", + "import astropy.units as u # for unit handling" + ] + }, + { + "cell_type": "markdown", + "id": "3da6552f", + "metadata": {}, + "source": [ + "## The snapshot object\n", + "\n", + "For this tutorial, we'll use one of the small snapshots included with `snapAnalysis`'s test suite, which is a low-resolution isolated dark matter halo. To instantiate a `snapshot` object, provide the filename and the particle type you want to work with:" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "id": "3538f772", + "metadata": {}, + "outputs": [], + "source": [ + "s = snapshot(\"../tests/example_snaps/cdm_snaps/snap_000.hdf5\", 1)" + ] + }, + { + "cell_type": "markdown", + "id": "767e0ace", + "metadata": {}, + "source": [ + "Instantiating a `snapshot` object loads the snapshot's metadata from its header, including time, units (handled via astropy), number of particles, etc. " + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "id": "b9204247", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "0.0 Gyr 0.9777923542981724 Gyr\n", + "43021.931322710916 9.99703e-11 km2 kpc / (solMass s2) 1.000000135629411 kpc 10002967845.365513 solMass 1.0 km / s\n", + "10000\n", + "0.0 kpc\n" + ] + } + ], + "source": [ + "print(s.time, s.time_unit)\n", + "print(s.G, s.length_unit, s.mass_unit, s.vel_unit)\n", + "print(s.N)\n", + "print(s.box_size)" + ] + }, + { + "cell_type": "markdown", + "id": "d477d123", + "metadata": {}, + "source": [ + "There are also convenience methods for printing the entire snapshot structure, or the entire header." + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "id": "3db76b37", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "File structure of ../tests/example_snaps/cdm_snaps/snap_000.hdf5\n", + "\n", + "GROUP: Config\n", + "KEYS:\n", + " ALLOW_HDF5_COMPRESSION\n", + " DOUBLEPRECISION\n", + " DOUBLEPRECISION_FFTW\n", + " EVALPOTENTIAL\n", + " IMPOSE_PINNING\n", + " MAX_NUMBER_OF_RANKS_WITH_SHARED_MEMORY\n", + " NSOFTCLASSES\n", + " NTYPES\n", + " NUMBER_OF_MPI_LISTENERS_PER_NODE\n", + " OUTPUT_ACCELERATION\n", + " OUTPUT_IN_DOUBLEPRECISION\n", + " OUTPUT_POTENTIAL\n", + " OUTPUT_TIMESTEP\n", + " POSITIONS_IN_64BIT\n", + " RANDOMIZE_DOMAINCENTER\n", + " SELFGRAVITY\n", + "DATA SETS:\n", + "\n", + "GROUP: Header\n", + "KEYS:\n", + " BoxSize\n", + " Git_commit\n", + " Git_date\n", + " MassTable\n", + " NumFilesPerSnapshot\n", + " NumPart_ThisFile\n", + " NumPart_Total\n", + " Redshift\n", + " Time\n", + "DATA SETS:\n", + "\n", + "GROUP: Parameters\n", + "KEYS:\n", + " ActivePartFracForNewDomainDecomp\n", + " ArtBulkViscConst\n", + " BoxSize\n", + " ComovingIntegrationOn\n", + " CourantFac\n", + " CpuTimeBetRestartFile\n", + " DesNumNgb\n", + " ErrTolForceAcc\n", + " ErrTolIntAccuracy\n", + " ErrTolTheta\n", + " ErrTolThetaMax\n", + " GravityConstantInternal\n", + " Hubble\n", + " HubbleParam\n", + " ICFormat\n", + " InitCondFile\n", + " InitGasTemp\n", + " MaxFilesWithConcurrentIO\n", + " MaxMemSize\n", + " MaxNumNgbDeviation\n", + " MaxSizeTimestep\n", + " MinEgySpec\n", + " MinSizeTimestep\n", + " NumFilesPerSnapshot\n", + " Omega0\n", + " OmegaBaryon\n", + " OmegaLambda\n", + " OutputDir\n", + " OutputListFilename\n", + " OutputListOn\n", + " SnapFormat\n", + " SnapshotFileBase\n", + " SofteningClassOfPartType0\n", + " SofteningClassOfPartType1\n", + " SofteningClassOfPartType2\n", + " SofteningClassOfPartType3\n", + " SofteningClassOfPartType4\n", + " SofteningClassOfPartType5\n", + " SofteningComovingClass0\n", + " SofteningComovingClass1\n", + " SofteningComovingClass2\n", + " SofteningComovingClass3\n", + " SofteningComovingClass4\n", + " SofteningComovingClass5\n", + " SofteningMaxPhysClass0\n", + " SofteningMaxPhysClass1\n", + " SofteningMaxPhysClass2\n", + " SofteningMaxPhysClass3\n", + " SofteningMaxPhysClass4\n", + " SofteningMaxPhysClass5\n", + " TimeBegin\n", + " TimeBetSnapshot\n", + " TimeBetStatistics\n", + " TimeLimitCPU\n", + " TimeMax\n", + " TimeOfFirstSnapshot\n", + " TopNodeFactor\n", + " TypeOfOpeningCriterion\n", + " UnitLength_in_cm\n", + " UnitMass_in_g\n", + " UnitVelocity_in_cm_per_s\n", + "DATA SETS:\n", + "\n", + "GROUP: PartType1\n", + "KEYS:\n", + "DATA SETS:\n", + " Acceleration\n", + " Coordinates\n", + " ParticleIDs\n", + " Potential\n", + " TimeStep\n", + " Velocities\n", + "\n", + "GROUP: PartType5\n", + "KEYS:\n", + "DATA SETS:\n", + " Acceleration\n", + " Coordinates\n", + " ParticleIDs\n", + " Potential\n", + " TimeStep\n", + " Velocities\n" + ] + } + ], + "source": [ + "s.print_structure()" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "id": "cc54cb0c", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "___________________________________________\n", + "Header of ../tests/example_snaps/cdm_snaps/snap_000.hdf5\n", + "\n", + "KEYS\n", + "--------\n", + "BoxSize: 0.0\n", + "Git_commit: b'01e6b1567c93fe1cfaffd499aa55151db2ed4208'\n", + "Git_date: b'Tue Mar 2 13:22:03 2021 +0100'\n", + "MassTable: [0.00000000e+00 1.79999643e-03 0.00000000e+00 0.00000000e+00\n", + " 0.00000000e+00 1.79999645e-07]\n", + "NumFilesPerSnapshot: 1\n", + "NumPart_ThisFile: [ 0 10000 0 0 0 1]\n", + "NumPart_Total: [ 0 10000 0 0 0 1]\n", + "Redshift: 0.0\n", + "Time: 0.0\n", + "\n", + "DATA SETS\n", + "--------\n" + ] + } + ], + "source": [ + "s.print_header()" + ] + }, + { + "cell_type": "markdown", + "id": "dfd8642d", + "metadata": {}, + "source": [ + "## Loading particle data\n", + "\n", + "`snapshot` objects do NOT automatically load particle data. Instead, the user can specify only which fields they want to work with, to save memory. To load (a) data field(s), use" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "id": "37f335d7", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[[-34.63337414 -66.0694746 172.63700156]\n", + " [-36.79456065 -60.03053335 153.69383798]\n", + " [-30.34222824 -17.90112547 161.11934558]\n", + " ...\n", + " [ 16.34056885 -11.39983141 171.08065064]\n", + " [ 18.99446364 -65.16006591 128.64642553]\n", + " [ 18.09111078 -53.39961967 171.65064279]] kpc\n", + "[18005306.43454713 18005306.43454713 18005306.43454713 ...\n", + " 18005306.43454713 18005306.43454713 18005306.43454713] solMass\n" + ] + } + ], + "source": [ + "s.load_particle_data([\"Coordinates\", \"Velocities\"])\n", + "\n", + "# once loaded, the data is stored in a dictionary, indexed by field:\n", + "print(s.data_fields[\"Coordinates\"])\n", + "\n", + "# you can load masses, positions, and velocities in a single line with\n", + "s.read_all()\n", + "print(s.data_fields[\"Masses\"])" + ] + }, + { + "cell_type": "markdown", + "id": "0bcb4af7", + "metadata": {}, + "source": [ + "Note that the particle loader will only load a field if it is not already loaded and no filters have been applied to the dataset." + ] + }, + { + "cell_type": "markdown", + "id": "0c8a8293", + "metadata": {}, + "source": [ + "## Centering and Rotations\n", + "\n", + "A common need when working with snapshots is to move to the center-of-mass (COM) frame of a galaxy, in which the z-axis is aligned with the galaxy's angular momentum vector. These can be accomplished quickly via" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "id": "693d5531", + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/Users/haydenfoote/Documents/gradschool/research/code/snapAnalysis/src/snapanalysis/snap.py:468: UserWarning: COM: Minimum number of particles reached before COM converged.\n", + " warnings.warn(\n" + ] + } + ], + "source": [ + "s.find_and_apply_center()\n", + "s.align_angular_momentum()" + ] + }, + { + "cell_type": "markdown", + "id": "ec9a0f38", + "metadata": {}, + "source": [ + "You can also obtain the center of mass without applying the transformation with the following. Note these should be close to zero since we've already applied the centering in the previous cell." + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "id": "cedcc6dc", + "metadata": {}, + "outputs": [ + { + "data": { + "text/latex": [ + "$[-2.0729946 \\times 10^{-16},~3.9551695 \\times 10^{-16},~-8.500145 \\times 10^{-16}] \\; \\mathrm{kpc}$" + ], + "text/plain": [ + "" + ] + }, + "execution_count": 8, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "com = s.find_position_center()\n", + "com" + ] + }, + { + "cell_type": "markdown", + "id": "a77f3ec0", + "metadata": {}, + "source": [ + "You'll notice the previous two cells gave a warning that the COM did not converge. The centering uses the shrinking-sphere alogrithm described in [Power et al. 2003](https://ui.adsabs.harvard.edu/abs/2003MNRAS.338...14P), in which the COM is computed using successively smaller spheres, stopping when the postiion converges. The test snapshots include too few particles to effectively apply this method using its default parameters, though you can adjust the shrinking rate of the sphere, initial size of the sphere, and other parameters using the kwargs:" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "id": "99312863", + "metadata": {}, + "outputs": [ + { + "data": { + "text/latex": [ + "$[0.10042075,~0.22558081,~0.12055743] \\; \\mathrm{kpc}$" + ], + "text/plain": [ + "" + ] + }, + "execution_count": 9, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "s.find_position_center(vol_dec=1.1, r_start=15.*u.kpc, guess=[0,0,0]*u.kpc)" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "id": "4133f806", + "metadata": {}, + "outputs": [ + { + "data": { + "text/latex": [ + "$[-3.400058 \\times 10^{-15},~-5.2735594 \\times 10^{-16},~1.3908145 \\times 10^{-15}] \\; \\mathrm{\\frac{km}{s}}$" + ], + "text/plain": [ + "" + ] + }, + "execution_count": 10, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# find velocity center requires the position center, as it finds the average velocity of particles within a small radius of the position center. \n", + "com_v = s.find_velocity_center(com, r_max=15.*u.kpc)\n", + "com_v" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "id": "619e8fce", + "metadata": {}, + "outputs": [ + { + "data": { + "text/latex": [ + "$[5.7378153 \\times 10^{-15},~-1.2200395 \\times 10^{-15},~1] \\; \\mathrm{}$" + ], + "text/plain": [ + "" + ] + }, + "execution_count": 11, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# angular momentum should be close to [0,0,1]\n", + "s.find_angular_momentum_direction()" + ] + }, + { + "cell_type": "markdown", + "id": "ce1770b2", + "metadata": {}, + "source": [ + "## Filtering particles\n", + "\n", + "The `select_particles` method allows one to keep a subset of particles according to various criteria. It supports ID ranges and boolean masks. For example, to keep all particles within 15 kpc of the center, use" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "id": "1972426b", + "metadata": {}, + "outputs": [], + "source": [ + "import numpy as np\n", + "r = np.sqrt(np.sum(s.data_fields[\"Coordinates\"]**2, axis=1)) # radial coordinate of all particles\n", + "s.select_particles(r < 15*u.kpc)" + ] + }, + { + "cell_type": "markdown", + "id": "4a1a2bbe", + "metadata": {}, + "source": [ + "## Plotting\n", + "`snapAnalysis` includes a visualization module with a few basic analysis and plotting tools. If you want to plot something that isn't included out-of-the-box, it should be straightforward to make your own plotting functions using the extracted particle data. If you make your own visualization functions, please consider [contributing them](/CONTRIBUTING.md) through a pull request, or [open an issue](https://github.com/hfoote/snapAnalysis/issues) so that we can implement the plot you want! \n", + "\n", + "Note that by default, the visualization functions will show a rudimentary version of the plot, but will also return the arrays used to make the plot so you can make them pretty in your own style. For example, let's plot the spherically-averaged density profile of the particles we've selected. " + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "id": "472104a2", + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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/17r16/XQw89pNDQUE2ZMsXo8gzxxBNPyG63q3fv3jKbzXI6nXr++ec1efJko0vzG7m5uZKkpKSkWueTkpI8z0EqKyvT448/rkmTJrXp/ZReeuklBQcH66GHHjKsBkJMgJo+fbq2b9+u7777zuhSDJWdna2HH35YS5YsUVhYmNHl+A2Xy6UhQ4bohRdekCQNHDhQ27dv12uvvdZmQ8zHH3+sDz74QAsWLFDfvn2VmZmpGTNmKCUlpc1+Jjh3FRUVuummm+R2uzVv3jyjyzHMxo0b9d///d/atGmTTCaTYXXQnRSAHnjgAS1evFjLly9v1bt0N8bGjRt19OhRDRo0SMHBwQoODtbKlSv1yiuvKDg4WE6n0+gSDdGhQwedd955tc716dNHBw8eNKgi4/3ud7/TE088oVtuuUX9+/fX7bffrt/+9reaNWuW0aX5jeTkZElSXl5erfN5eXme59qy6gDz888/a8mSJW26FWbVqlU6evSo0tPTPb97f/75Z/37v/+7Onfu3GJ10BITQNxutx588EEtWrRIK1asUJcuXYwuyXCjR4/Wtm3bap2bOnWqevfurccff1xms9mgyow1cuTIOtPvd+/erU6dOhlUkfFKSkoUFFT7v9vMZrNcLpdBFfmfLl26KDk5WcuWLdP5558vSbLb7Vq7dq3uu+8+Y4szWHWA2bNnj5YvX674+HijSzLU7bffXmcM4pVXXqnbb79dU6dObbE6CDEBZPr06VqwYIH++c9/Kjo62tNHbbVaFR4ebnB1xoiOjq4zJigyMlLx8fFteqzQb3/7W11wwQV64YUXdNNNN2ndunV644039MYbbxhdmmGuueYaPf/880pPT1ffvn21efNmzZkzR9OmTTO6tBZVVFSkvXv3eh7v379fmZmZiouLU3p6umbMmKGZM2eqR48e6tKli5566imlpKRowoQJxhXdAs70uXTo0EE33nijNm3apMWLF8vpdHp+/8bFxSk0NNSospvV2f6t/DLIhYSEKDk5Wb169Wq5Ilt0LhS8IqneY/78+UaX5leYYl3l888/d/fr189tsVjcvXv3dr/xxhtGl2Qou93ufvjhh93p6enusLAwd9euXd3/7//9P7fD4TC6tBa1fPnyen+PTJkyxe12V02zfuqpp9xJSUlui8XiHj16tDsrK8vYolvAmT6X/fv3N/j7d/ny5UaX3mzO9m/ll4yYYs0u1gAAICAxsBcAAAQkQgwAAAhIhBgAABCQCDEAACAgEWIAAEBAIsQAAICARIgBAAABiRADAAACEiEGgN+48847ZTKZZDKZ9Omnn0qSDhw4IJPJpMzMzGZ733feecfzvjNmzGi29wHgW4QYAH5l7NixysnJ0bhx41rsPW+++Wbl5ORoxIgRLfaeALzHBpAAWlx5eXmDm+ZZLBYlJye3aD3h4eEKDw9vtRv5Aa0VLTEAmt0ll1yiBx54QDNmzFD79u115ZVXNvleTqdT06ZNU+/evXXw4EFJkslk0rx58zRu3DiFh4era9eu+vvf/17rdYcOHdKkSZMUFxenyMhIDRkyRGvXrvXq7wXAWIQYAC3i3XffVWhoqL7//nu99tprTbqHw+HQxIkTlZmZqVWrVik9Pd3z3FNPPaUbbrhBW7Zs0eTJk3XLLbdo586dkqSioiJdfPHFOnz4sD777DNt2bJFjz32mFwul0/+bgCMQXcSgBbRo0cPzZ49u8mvLyoq0vjx4+VwOLR8+XJZrdZaz0+cOFF33323JOm5557TkiVL9Oqrr+qvf/2rFixYoGPHjmn9+vWKi4uTJHXv3r3pfxkAfoGWGAAtYvDgwV69ftKkSSouLtY333xTJ8BIqjMod8SIEZ6WmMzMTA0cONATYAC0DoQYAC0iMjLSq9dfddVV2rp1q1avXn3Orw0PD/fqvQH4J0IMgIBw33336cUXX9Svf/1rrVy5ss7za9asqfO4T58+kqSMjAxlZmYqPz+/RWoF0DIIMQACxoMPPqiZM2fq6quv1nfffVfrub/97W96++23tXv3bj3zzDNat26dHnjgAUlVXVHJycmaMGGCvv/+e+3bt0//+Mc/mtSqA8B/EGIABJQZM2bo2Wef1VVXXaUffvjBc/7ZZ5/VwoULlZGRoffee08ffvihzjvvPElSaGiovvnmGyUmJuqqq65S//799eKLL8psNhv11wDgA8xOAtDsVqxY0eTXdu7cWW63u9a5Rx55RI888kitcykpKfrmm28avE+nTp3qrB0DILDREgPAryxevFhRUVFavHhxi73nBx98oKioKK1atarF3hOA90zuX/4nDgAY5OjRo7Lb7ZKkDh06NHpGk8lk0qJFizRhwoQmvW9hYaHy8vIkSbGxsWrfvn2T7gOgZRFiAABAQKI7CQAABCRCDAAACEiEGAAAEJAIMQAAICARYgAAQEAixAAAgIBEiAEAAAGJEAMAAAISIQYAAASk/w/Gp3mBOJhEcAAAAABJRU5ErkJggg==", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "from snapanalysis import vis\n", + "# this will be noisy since we're working with a small number of particles\n", + "bins, density = vis.density_profile(s, rmin=1., rmax=15., nbins=20, log_bins=True)" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "id": "e00a54e9", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "[None,\n", + " None,\n", + " Text(0.5, 0, 'Radius [kpc]'),\n", + " Text(0, 0.5, 'Density [$M_\\\\odot / kpc^3$]')]" + ] + }, + "execution_count": 14, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAkEAAAG1CAYAAAD+7yA/AAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjkuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8hTgPZAAAACXBIWXMAAA9hAAAPYQGoP6dpAAA+7klEQVR4nO3dd3hVVaKG8fckIXSilAFpgwULKiAYEAsDihQVRRisdMsMo4yI2BEbYkFRHCKjjqDYFRVRRxFQQUXBoSgoMuLYhqrSEQSS3D/WJciACDkn2UnO+3uePDkl2fuLc73nc+2114rl5ubmIkmSlGRSog4gSZIUBUuQJElKSpYgSZKUlCxBkiQpKVmCJElSUrIESZKkpGQJkiRJSckSJEmSklJa1AGKspycHJYsWULFihWJxWJRx5EkSXsgNzeXdevWUbNmTVJSfn28xxK0G0uWLKFOnTpRx5AkSfnw3XffUbt27V993xK0GxUrVgTCP8RKlSpFnEaSJO2JtWvXUqdOnbzP8V9jCdqNbZfAKlWqZAmSJKmY+a2pLE6MliRJSckSJEmSkpIlSJIkJSVLkCRJSkqWoF3IysqiQYMGZGZmRh1FkiQVkFhubm5u1CGKqrVr15KRkcGaNWu8O0ySpGJiTz+/HQmSJElJyRIkSZKSkiVIkiQlJUuQJElKSpYgSZKUlCxBkiQpKVmCtHe+/Rb694c77gBXV5AkFWPuIr8LWVlZZGVlkZ2dHXWUomPFChg6FEaNgs2bw2tlyoRCJElSMeRiibvhYonAmjVw991w772wYUN47fDD4dNPISUFJk6ENm2izShJ0i+4WKLis3EjDBsGBxwAQ4aEApSZCZMmwbx50KsX5OTA2WfDf/4TdVpJkvaaJUg72rIF/v53OOgguOoqWLkSDjsMXngBZswIoz6xWLgs1rx5eP+MM2D9+qiTS5K0VyxBCnJy4KmnQuHp2xeWLIHf/x4efTSM/HTuHMrPNmXKwIsvwn77wfz50LNnOIYkScWEJSjZ5ebCq6/CUUfB+efDl1/C734H998PCxeGcpOauuvfrVkzFKH09PD9ttsKN7skSXGwBCWzqVPh+OOhY0f45BPIyAjzf778Evr1g9Klf/sYxxwTLo0BDB4ML79csJklSUoQS1Aymj0b2reHVq1g+nQoWxauvjpMcL7+eqhQYe+O16dPKE0A3brBZ58lPLIkSYlmCUomn38OXbtC06bh1va0tDD/Z9GisPhh5cr5P/Y990Dr1mGC9BlnwKpVicstSVIBsAQlg2+/hQsuCOv7jBsXJjh36xbm/DzwQJjbE69SpeC558Jk6kWL4NxzwcUmJUlFmCWoJFuxAi6/HOrXh9Gjw91bp58OH38Mjz8e1gBKpKpVYfx4KFcujDRde21ijy9JUgK5bcYuFPi2GQsWwNdfb7/l/JffE/X4jTfCKs/b1u9p1Spse9GiRcH8Tds0bgxjxoRFFIcNC8/PO69gzylJUj64bcZuFNi2GVdcAcOHJ+54u9O0Kdx++/ZFDgvLddeF85YpA++9F3JIklQI9vTz25GgKNSuHdblge07sefm7v3j3b1frRoMHLjzIoeF5dZbw233r70GZ54J//pXWH9IkqQiwpGg3XAD1TitWRO21li4EE44ASZPDgsrSpJUgNxAVdHLyAiLJ1aqBO++C/37R51IkqQ8liAVrEMOCXuSbdt09aGHok4kSRJgCVJhOPXU7fuKXXopvP9+tHkkScISpMJyzTVw1lmwZQt06QLffRd1IklSkrMEqXDEYmHBxkaNYPnycMfYxo1Rp5IkJTFLkApP+fJhRekqVWDWLLj44u239EuSVMgsQSpc9eqF/ctSU+GJJ8Kq1pIkRcASpMLXqtX28nPllfDmm5HGkSQlJ0uQonHppdC7d9jU9Zxz4Msvo04kSUoylqBdyMrKokGDBmRmZkYdpeTatm7QMcfAqlVwxhmwbl3UqSRJScRtM3bDbTMKwZIlcPTRsHQpdOoEL7wAKXZzSVL+uYGqioeaNeGll6Bly3Dn2K23wo03xnfMrVthxYpQsJYuDd9/+Tg3F66/Ho49NiF/giSpeHIkaDccCSpEY8ZAnz7h8UsvhVGh//XLcvPLUvO/RWfFijDXaHfS0+Hhh6FHj4T/KZKkaDkSpOKld2+YOxfuvx+6d4fLLtu58CxfvufrCqWmQvXqYaRpv/3C922PX389FK2ePWHBgrClh5fgJCnpOBK0G44EFbItW6BdO3j77V//mV+Wm18WnP8tOtWqhZ/dlZwcGDx4+35mnTrB449DhQoJ/5MkSYVvTz+/LUG7YQmKwI8/hvk6sOuis7tys7eefBIuuAB+/jls5zFhAtStm5hjS5IiYwlKAEtQEvjggzAStGJFGGEaPz7cti9JKrb29PPbiRBKbi1awMyZ0LBhmHPUqhU8/XTUqSRJhcASJP3+9/Dee9CxY7g0dt55Yc7Qb91hJkkq1ixBEkDFiuGOsSuvDM9vvRXOPht++inaXJKkAmMJkrZJTYW77oLRo6FUqbDbfcuWsHhx1MkkSQXAEiT9r969YcoUqFIFZs2CzEz417+iTiVJSjBLkLQrJ5wQJkw3aBAWamzZEp5/PupUkqQEsgRJv+aAA8It9B06wMaNcNZZYa6Qq0pIUolgCdqFrKwsGjRoQGZmZtRRFLVKleCVV6B///B88OBw99jGjZHGkiTFz8USd8PFErWDhx6CSy4JG7lmZsLLL4dVrCVJRYqLJUqJdvHF8OabsO++8NFH0KwZzJkTdSpJUj5ZgqS90bo1zJgBhxwC//0vHH98WF9IklTsWIKkvVW/Pnz4IZx8clhMsXNnuP12J0xLUjFjCZLyY5994J//DHOEAK67Dnr0gE2bIo0lSdpzliApv9LSYOTI8JWaCk88ASeeGDZilSQVeZYgKV6XXAKvvw4ZGWFdoYYN4dJLYeLEsCGrJKlIsgRJiXDyyWGeUP36sGIFZGVB+/ZQtSp06QKPPgrffx91SknSL7hO0G64TpD22qZNMGlSWGDx1VfDlhvbxGLQogV07Bi+GjQIr0mSEmpPP78tQbthCVJccnJg9myYMCGUorlzd3x///23F6KWLSE9PZKYklTSWIISwBKkhPruuzA69Mor8NZbO84XqlQpXD7r2DHsVValSnQ5JamYswQlgCVIBWb9epg8eftlsxUrtr+XkgLHHRcK0emnh4UZJUl7zBKUAJYgFYqcHJg5MxSiV16BefN2fL9+/e2XzY4/PtyaL0n6VZagBLAEKRJff739stnbb8OWLdvf22cf6NcPbr7ZSdWS9CssQQlgCVLk1q0Lm7ZOmACvvQY//hhev/56GDIk2mySVES5i7xUElSsGNYZeuyxsBL13/4WXr/tNrj//mizSVIxZwmSiovU1LAS9bYRoMsug6eeijaTJBVjlqBdyMrKokGDBmRmZkYdRdrZddeFeUEAPXuG7TkkSXvNOUG74ZwgFVk5OdCtGzz9NJQvD1OmQPPmUaeSpCLBOUFSSZaSEvYja9sWNmyAU0+Fzz+POpUkFSuWIKm4Sk+HF16AZs3CXWNt28J//xt1KkkqNixBUnFWoUK4df6QQ8K2HG3bbr+NXpK0W5YgqbirWjWsJVSrFixYAKedFi6RSZJ2yxIklQR164a7xPbdFz78ELp23XGlaUnSTixBUklx+OHh0ljZsvD669CnT7iLTJK0S5YgqSRp0QLGjQsLKz7xBAwcCK6CIUm7ZAmSSppTToExY8Lje++Fu+6KNo8kFVGWIKkk6t4d7rknPL7mGhg9Oto8klQEWYKkkmrAALj66vD4oovCTvSSpDyWIKkku/126N07TJA++2yYNi3qRJJUZFiCpJIsFoOHHoLTT4dNm8L3Tz6JOpUkFQmWIKmkS0uDZ56B44+HNWugXTv46quoU0lS5CxBUjIoWzbMCTrySFi2LGyvsXx51KkkKVKWIClZ7LsvvPEG1KsHixZBhw6wdm3UqSQpMpYgKZnUrBn2GatWDebMgU6dwlwhSUpCliAp2dSvH7bVqFAB3n4bunWD7OyoU0lSobMEScmoaVMYPx7S0+GFF+CSS9xeQ1LSsQRJyeqkk8L+YrEYPPgg3HRT1IkkqVBZgqRk1rUrZGWFx7fcAiNHRptHkgpRWtQBJEWsb19YsSKMBP31rzBjBmRmhktmjRtD+fJRJ5SkAhHLzXUiwP/KysoiKyuL7Oxs/v3vf7NmzRoqVaoUdSyp4OTmwqWXwgMP7Ph6SgocemgoRNu+GjcOk6olqYhau3YtGRkZv/n5bQnajT39hyiVCLm5MGkSTJ8Os2aFr6VLd/65WGzHYtSkCRx1FFSsWPiZJWkXLEEJYAlS0lu6dHsh2va1ZMnOPxeLwcEH7zhidNRR4L83kiJgCUoAS5C0C8uWwezZOxaj//531z/7y2LUpEn47r9LkgqYJSgBLEHSHlqxYucRo+++2/nnypeHl16Ck08u/IySkoYlKAEsQVIcvv9+xxGjmTPDiFGNGjBvHlStGnVCSSWUJSgBLEFSAm3cCEcfDZ99Bp07w7hxYS6RJCXYnn5+u1iipMJRtmxYobpUKXjxRRg7NupEkpKcJUhS4TnqKLj55vC4Xz/4+utI40hKbpYgSYXrqqvguONg3Tro0cMd7CVFxhIkqXClpoZLYRUqwLvvwj33RJ1IUpKyBEkqfAccACNGhMeDBsHcuZHGkZScLEGSotG7N3TqBFu2QLdusGlT1IkkJRlLkKRoxGLw0EPwu9/Bp5/C9ddHnUhSkrEESYpOtWowenR4PHw4vPVWtHkkJRVLkKRonXoq/OlP4XHPnrB6daRxJCUPS5Ck6N19Nxx0UNhW45JLok4jKUlYgiRFr0KFsJp0aio89RQ880zUiSQlAUuQpKKhefPtk6P79oXFi6PNI6nEswRJKjoGDYLMzDAvqFcvyMmJOpGkEswSJKnoKFUKHn88bLY6eTKMHBl1IkklmCVIUtFyyCFhojTA1VfDZ59Fm0dSiWUJklT09O0L7duHVaS7dYPNm6NOJKkEsgRJKnpisbCIYuXKMGcO3Hxz1IkklUCWIElF0377hW01AO64A95/P9o8kkocS5CkoqtLl7CKdE4OdO8O69ZFnUhSCZKWn1+aMGHCXv/OySefTNmyZfNzOknJbMQIeOcd+Oor6N8fHnkk6kSSSohYbm5u7t7+UkrK3g0gxWIxvvjiCw444IC9PVWk1q5dS0ZGBmvWrKFSpUpRx5GS17Rp0KoV5ObCSy9Bp05RJ5JUhO3p53e+L4ctW7aMnJycPfoqV65cfk8jSdCyJVx5ZXh80UWwfHm0eSSVCPkqQT179tyrS1vdunVzJEVSfG65BRo1gh9+gAsuCKNCkhSHfF0OSxZeDpOKmPnzoWnTsG7Qgw/CxRdHnUhSEVTgl8MkqdAdcQTcfnt4fPnlsGhRtHkkFWt7XYJWrVrFypUrAfj+++958cUX+fTTTxMeTJJ2qX9/aN0afvoprCa9dWvUiSQVU3tVgv7xj3/QtGlTjj76aEaNGsWZZ57JlClTOOecc/jHP/5RUBkLXVZWFg0aNCAzMzPqKJL+V0oKPPooZGTAjBnbR4YkaS/t1Zyghg0bMmPGDDZu3EjdunX56quvqFatGmvWrOEPf/gDc+fOLcCohc85QVIR9uSTYSQoNRU++AD8jxZJ/69A5gSlpaVRtmxZKleuzEEHHUS1atUAyMjIIBaLxZdYkvbGeefBWWdBdnYoQz/9FHUiScXMXpWg1NRUNm3aBMDUqVPzXl+/fn1iU0nSb4nFYNQoqFkT/v1vuOqqqBNJKmb2qgRNnjyZ0qVLA2H0Z5uffvqJh7ZtdChJhaVy5TA/CCArC954I9I4koqXvSpBu7rsNX36dFasWOEkYknROPlk+Otfw+Pu3WHcOBdSlLRH4l4n6JJLLmHGjBk7vf7ll1+yzh2fJRWGO+7Yvpp0167Qti0sWBB1KklFXNwlaOHChbRq1Wqn1ydPnsy5554b7+El6beVLQvTp8PgwVC6NEyeDA0bhnlC/seYpF8RdwmqVKkSq1at2un1E044gQ8//DDew0vSnilXDm6+GT77DDp2DIsoDhsGhx4KTz/tJTJJO4m7BLVv356777575wOnpLB58+Z4Dy9Je+eAA2DCBHj1VTjwQFiyJNxO37p12HtMkv5f3CXo1ltvZerUqXTp0oV58+YBsGnTJu68804aNmwYd0BJypdTTw2l59Zbw+WyqVOhceOw7caaNVGnk1QExF2C6tSpw4cffsjGjRtp1KgRZcuWpWLFirzyyisMGzYsERklKX/KlIFBg8Ik6S5dwsKKI0bAwQfDY49BTk7UCSVFaK+2zfgt3377LXPmzCE9PZ3mzZtTuXLlRB06Em6bIZUwb74ZbqdfuDA8P/bYsL5Q48aRxpKUWHv6+Z2wErR48WIAatWqlYjDFQmWIKkE2rwZ7rsPbrkFNmwIG7L++c8wZAjsu2/U6SQlQIHsHbYr77//Pvvvvz9169albt26VK9enauvvpq1a9fGe2hJSrz09HDr/Oefw9lnh0tiDzwQLpH94x9eIpOSSNwl6E9/+hOHHXYYH330EQsXLmTYsGFMnjyZJk2a5I0OSVKRU7s2PPMMvPUWNGgQFlq86CI45hj46KOo00kqBHFfDitbtiwff/wxBx98cN5rubm5nHXWWQA8//zz8SWMkJfDpCSxZQuMHAk33hgWV4zF4MILYehQqFo16nSS9lKhXQ477LDDWLFixQ6vxWIxbrnlFt5wM0NJxUGpUnD55WE3+u7dw8KKDz8cLpGNGhXuKpNU4sRdgnr16kW/fv347rvvdnjd0RNJxU6NGjB2LLz7bth2Y9Uq+MtfIDMTPvgg6nSSEizuy2EpKaFHpaen07lzZxo3bkx2djZPPPEE1113Heeff35CgkbBy2FSEtu6FR58MKwztHp1eG3AALj77nC5TFKRVWi3yC9fvpy5c+fy8ccfM3fuXObOncsXX3xBLBbjsMMO48gjj6Rhw4Y0bNiQ9u3bx3OqQmcJksSKFXDddfDII+H5TTeFuUOSiqxCK0ErVqzgd7/73Q6vbdq0iXnz5u1QjubPn8/qbf81VUxYgiTl+fvfoW/f8PjBB+Hii6PNI+lXFVoJatmyJW+//Tapqak7vbd161bS0tLiOXykLEGSdjB4cNiLLCUFXnoJTj896kSSdqHQ7g7bZ599+Otf/7rT6z/++CNt2rSJ9/CSVHTcfDNccEFYUPHss2H69KgTSYpD3CVo7NixTJo0idGjR+e9tmDBApo1a0b58uXjPbwkFR2xWLgsdtppsGlT+L5gQdSpJOVTQkaCXnjhBa688kpmzpzJxIkTadGiBZ06deKVV15JREZJKjrS0sJK082bh1vo27cHV8eXiqV8TdjZdiv8tq8jjzySkSNHcsopp7Bp0yb+9re/0bt370RnlaSioXx5ePVVOO64sMBihw4wbRrss0/UySTthXyNBB144IG8++67XHjhhdSrV48qVarw8MMPk5uby3nnnUeTJk3YsmVLorNKUtFRtSpMnBgWWJw3Dzp1CpfIJBUbcd8dtnjx4rz1gbZ9/ec//yEtLY1DDz2Ujz/+OFFZC513h0n6TXPnQsuWYc+xP/4xXCrbxd2ykgpPod0ivyvr16/PWyPokksuSfThC40lSNIeeeutMDdoyxbo1w9GjHBVaSlCBX6L/ODBg5k1a9Yu36tQoQLHH398sS5AkrTHTjwRHn88PP7b3+Cuu6LNI2mP5LsE/fe//6VDhw7Url2bvn378vrrr7N58+ZEZpOk4uPss+Hee8Pja66Bxx6LNo+k35TvEjR69GiWLVvG008/TcWKFenfvz9Vq1alS5cujB07lpUrVyYypyQVff37w5VXhscXXABvvBFpHEm7l9A5QQsWLOCVV17h5ZdfZtasWTRr1ozTTz+dc889l1q1aiXqNIXGOUGS9lpODvToAU8+GW6lf/ttyMyMOpWUVCKdGA3w/fffM2HCBCZMmMAJJ5zAwIEDC+I0BcoSJClfNm8Oq0lPmgTVqsH770P9+lGnkpJG5CWoJLAEScq3deugVSuYPRv23x8++ACqV486lZQUCm0DVUnSLlSsCP/8JxxwAHz1FZxySihGkoqMAitBGzZsYM6cOfzwww8FdQpJKtqqVw+To6tVCyNCXbqES2WSioQCKUFDhw6lc+fOvPjii/zlL3+hT58+bNy4sSBOJUlFW/368NprUK5cmCPUp0+YPC0pcvnaQHV3xowZw8qVK5k4cWLea88//zz9+/fnwQcfTPTpJKnoy8yEF16Ajh3DXWM1a7qgolQEJHwk6Nlnn+Waa64BoE+fPixfvpyuXbvy0UcfJfpUklR8tG8PjzwSHg8bBvfdF2kcSQVQgkqVKpW3cvRxxx1HuXLlAMhx+FdSsuvRA26/PTy+/PKw2aqkyCS8BF144YVcddVVZGdnc8EFF1CxYkXuvfdeOnTokOhTSVLxc/XVYZNVCKXorbeizSMlsYTPCTrjjDPYsGEDJ510Er///e9ZunQpxx57LEOGDEn0qSSp+InFwh5jy5bB889Dp04wbRo0bhx1MinpFOhiiStXrmTfffclFosV1CkKlIslSiowmzaFeUJTp0KNGmExxXr1ok4llQhFYrHEypUrF9sCJEkFqkwZGD8ejjwyjAq1axe+Syo0rhgtSVHZZx94/XWoWxf+/W84+GAYOhR++inqZFJSyHcJGjJkCP/85z9Zvnx5IvNIUnKpVQvefBOaNAnbalx/PRxyCDz2GGRnR51OKtHyPScoJSUl71JXjRo1aNKkCU2bNs37XqtWrYQGjYJzgiQVmpwcePppuO46+Pbb8FqjRmFNoZNPjjabVMwU+C7yzZs3Z+nSpfTu3ZuqVasye/ZsZs2axeeff052djbVqlWjSZMm/POf/8z3HxE1S5CkQrdpE/ztb3DbbbBmTXitffuwwvSRR0abTSomCnxi9IwZM7jlllt4+OGHmTx5MoMGDeKTTz5h3bp1TJ8+nRtvvJHatWvn9/CSlJzKlIErr4Qvv4TLLoNSpcImrI0bwwUXwOLFUSeUSoy4Jkb36tWLf//73xxyyCE0adKEa6+9luzsbJo3b07fvn156KGHEpUzXxYuXEjjxo3zvsqWLcv48eMjzSRJe6RKlbC1xoIF0LVruFw2enTYkPWGG8L8IUlxSdg6QV988QUDBgxg1qxZ3HHHHfTo0SMRh02Y9evXU69ePb755hvKly+/R7/j5TBJRcYHH8DAgTB9enj+u9/BzTfDhRdCWsLXvZWKtUJdJ2jr1q38/PPPnHvuudSuXZvevXuzcuXKRBw6YSZMmMBJJ520xwVIkoqUFi3gvffCbvQHHQQrVkDfvmGe0IQJUHDr3kolVr5L0B133MH5559Pw4YNKVeuHMceeywPPPAAzZo146GHHiIjIyPucNOmTaNjx47UrFmTWCy2y0tZWVlZ1KtXjzJlytC8eXNmzpy5y2M999xznH322XFnkqTIxGLQuTN8+incf3+4ZPb553DGGdC6NfzrX1EnlIqVfJeg6667jg8++IAuXbowf/581q5dy3vvvcfIkSO54IILSE1NjTvchg0baNSoEVlZWbt8/9lnn2XAgAHceOONzJ49m0aNGtGuXTtWrFixw8+tXbuW6dOnc8opp8SdSZIil54eNmH98ku45powmXrqVMjMhPPOg6+/jjqhVCzke07QH/7wB+bOncu6desoX748DRs2pEmTJnlfRxxxREKKUF7QWIyXXnqJTp065b3WvHlzMjMzGTlyJAA5OTnUqVOHfv36cc011+T93OOPP87EiRN54okndnuOn3/+mZ9//jnv+dq1a6lTp45zgiQVbd9+C4MGwRNPhMti6enw17+GNYf23TfqdFKhK/A5QVOnTmXNmjUsXLiQhx9+mOOOO44FCxZwxRVXcNRRR1GhQgWaNWuW38P/ps2bNzNr1izatGmT91pKSgpt2rThgw8+2OFn9/RS2O23305GRkbeV506dRKeW5ISrm5dGDsWZs2Ck06CzZvh7rvhwAPDjvW/+I87SdvFPTG6fv36nHPOOdx1111MnjyZlStX8uWXXzJ27NgdCkqi/fDDD2RnZ1O9evUdXq9evTrLfrEJ4Zo1a5g5cybt2rX7zWNee+21rFmzJu/ru+++S3huSSowRx0FkybBP/8Jhx8Oq1bBgAFw2GHw7LPhNntJefJVgj755BNydvMv0/7770/Xrl0ZOnQoAJ9++ilbt27NX8I4ZWRksHz5ctLT03/zZ0uXLk2lSpV2+JKkYiUWgw4dYO5cePhh2G8/+OorOOecsODi889bhqT/l68SdNRRR/Hjjz/u8c+3aNGCb7fthZMgVatWJTU1dacNXJcvX06NGjUSei5JKnbS0sIaQl98EdYTqlQJ5s2Ds86Chg3DyJAbtCrJ5WuFrdzcXG644QbKlSu3Rz+/efPm/Jxmt9LT02natClTpkzJmyydk5PDlClTuPTSSxN+PkkqlsqXh8GDw91kI0aEVag//TSMDB12WJhQffbZkMAbWaTiIl8lqGXLlixcuHCPf75FixaULVt2r8+zfv16Fi1alPf8q6++Yu7cuVSuXJm6desyYMAAevbsydFHH02zZs2477772LBhA717997rc0lSibbvvnDTTdC/f1hj6N57w5Yc558Pt9wSytA557j6tJJKwrbNKAjvvPMOrVu33un1nj178uijjwIwcuRIhg0bxrJly2jcuDH3338/zZs3T8j53TZDUom1Zk3YrX748DCBGsK+ZIMGhbWGLEMq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dRkwYAA9e/bk6KOPplmzZtx3331s2LCB3r17R5haklSU+FlSNLltxm945513aN269U6v9+zZk0cffRSAkSNHMmzYMJYtW0bjxo25//77ad68eSEnlSQVVX6WFE2WIEmSlJScEyRJkpKSJUiSJCUlS5AkSUpKliBJkpSULEGSJCkpWYIkSVJSsgRJkqSkZAmSJElJyRIkqVhp1aoV/fv3z3ter1497rvvvgI9XywWIxaLMXfuXCCs/huLxVi9enWBnfemm27KO29B/n1SMrMESUq4Xr165X2AlypViv3335+rrrqKTZs2JfxcH330ERdffHHCj/tLF110EUuXLuWII44o0PP80sCBA1m6dCm1a9cutHNKycYNVCUViPbt2zNmzBi2bNnCrFmz6NmzJ7FYjDvvvDOh56lWrVpCj7cr5cqVo0aNGgV+nl+qUKECFSpUIDU1tVDPKyUTR4IkFYjSpUtTo0YN6tSpQ6dOnWjTpg2TJk3Ke//HH3/k3HPPpVatWpQrV44jjzySp59+eodjbNiwgR49elChQgX2228/7rnnnp3O88vLYV9//fUOl60AVq9eTSwW45133gFg1apVnH/++VSrVo2yZctSv359xowZE9ff+tNPP9GhQweOO+44Vq9enZfjmWee4dhjj6VMmTIcccQRTJ06dYff+/TTTznttNOoVKkSFStW5IQTTuDLL7+MK4ukPWcJklTg5s+fz/Tp00lPT897bdOmTTRt2pTXXnuN+fPnc/HFF9O9e3dmzpyZ9zNXXnklU6dO5eWXX+bNN9/knXfeYfbs2XFlueGGG/jss894/fXXWbBgAaNGjaJq1ar5Pt7q1as5+eSTycnJYdKkSeyzzz475L/iiiuYM2cOLVq0oGPHjvz4448ALF68mJYtW1K6dGneeustZs2aRZ8+fdi6dWtcf5+kPeflMEkF4tVXX6VChQps3bqVn3/+mZSUFEaOHJn3fq1atRg4cGDe8379+jFx4kSee+45mjVrxvr163nkkUd44oknOOmkkwB47LHH4p4j8+2333LUUUdx9NFHA2EkKb+WLVvG2WefTf369Xnqqad2KHkAl156KV26dAFg1KhRvPHGGzzyyCNcddVVZGVlkZGRwTPPPEOpUqUAOPjgg/OdRdLeswRJKhCtW7dm1KhRbNiwgXvvvZe0tLS8QgCQnZ3N0KFDee6551i8eDGbN2/m559/ply5cgB8+eWXbN68mebNm+f9TuXKlTnkkEPiytW3b1+6dOnC7Nmzadu2LZ06deLYY4/N17FOPvlkmjVrxrPPPrvLuTstWrTIe5yWlsbRRx/NggULAJg7dy4nnHBCXgGSVPi8HCapQJQvX56DDjqIRo0aMXr0aGbMmMEjjzyS9/6wYcMYMWIEV199NW+//TZz586lXbt2bN68Od/nTEkJ/y8tNzc377UtW7bs8DMdOnTgm2++4fLLL2fJkiWcdNJJO4xI7Y1TTz2VadOm8dlnn+3175YtWzZf55SUOJYgSQUuJSWF6667jkGDBrFx40YA3n//fc444wy6detGo0aNOOCAA/j3v/+d9zsHHnggpUqVYsaMGXmvrVq1aoef+V/b7hRbunRp3mu/nCT9y5/r2bMnTzzxBPfddx8PPfRQvv6uO+64g549e3LSSSftsgh9+OGHeY+3bt3KrFmzOOywwwBo2LAh77777k4lTVLhsQRJKhRdu3YlNTWVrKwsAOrXr8+kSZOYPn06CxYs4E9/+hPLly/P+/kKFSpwwQUXcOWVV/LWW28xf/58evXqlTfasytly5blmGOO4Y477mDBggVMnTqVQYMG7fAzgwcP5uWXX2bRokV8+umnvPrqq3nFJD/uvvtuzj//fE488UQ+//zzHd7LysripZde4vPPP+eSSy5h1apV9OnTBwjzhdauXcs555zDv/71L7744gsef/xxFi5cmO8skvaOJUhSoUhLS+PSSy/lrrvuYsOGDQwaNIgmTZrQrl07WrVqRY0aNejUqdMOvzNs2DBOOOEEOnbsSJs2bTj++ONp2rTpbs8zevRotm7dStOmTenfvz9DhgzZ4f309HSuvfZaGjZsSMuWLUlNTeWZZ56J62+79957OeusszjxxBN3GKm64447uOOOO2jUqBHvvfceEyZMyLsTrUqVKrz11lusX7+eP/zhDzRt2pSHH37YOUJSIYrl/vLiuSRpB61ataJx48Z7tXXF119/zf7778+cOXNo3LhxXOevV68e/fv332GrEEmJ4UiQJP2GBx54gAoVKjBv3rxCO+fQoUOpUKEC3377baGdU0o2jgRJ0m4sXrw4bzJ33bp1d1oLaFcSMRK0cuVKVq5cCYSJ3BkZGfk6jqRfZwmSJElJycthkiQpKVmCJElSUrIESZKkpGQJkiRJSckSJEmSkpIlSJIkJSVLkCRJSkqWIEmSlJQsQZIkKSn9HyHgjM5HOcMxAAAAAElFTkSuQmCC", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "# now, we can make this prettier according to our use-case:\n", + "import matplotlib.pyplot as plt\n", + "fig, ax = plt.subplots()\n", + "ax.plot(bins, density, c='r')\n", + "ax.set(xscale=\"log\", yscale=\"log\", xlabel=\"Radius [kpc]\", ylabel=r\"Density [$M_\\odot / kpc^3$]\")" + ] + }, + { + "cell_type": "markdown", + "id": "e51ae5b7", + "metadata": {}, + "source": [ + "As another example, here's a surface density plot of the particles we selected:" + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "id": "06b3bcdd", + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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e8xf//pXnX766Ynt999/X9OmTdPll1+uuXPnho/SJRaLKRaLJf2+pKSk132RklRcXEzcWdZbYyfu7CLu7MvPT/3ZxdBJbeHChZozZ47vMaNHj078/MEHH2jSpEk6//zz9W//9m+e4yorK9XS0uL53d+3Kysrw4YGADjBhU5q5eXlKi8v79ax77//viZNmqQJEyZo9erVSVm4urpaP//5z9XR0aGCgi8e8nj++ec1duzYTrseAQDwk7Fxau+//74mTpyo4cOH65e//KU+/PBDNTc3q7m5OXHMD3/4Q/Xt21dXX3213nrrLT366KP613/9V0/NLEgsFtNtt93WaZdkLiPu7OutsRN3dhF39qUz9ow90r9mzRpdddVVne5zn/L1119XTU2N/vKXv2jQoEG6/vrrdcstt2QiJACA5bI6Tg0AgExi7kcAgDVIagAAa5DUAADWIKkBAKzRa5Nab17a5s4779T555+voqIilZaWdnpMXl5e0mvdunXZDdTQnbibmpp0ySWXqKioSBUVFfrpT3+qo0ePZjfQbhg5cmTS9V22bFnUYSVZsWKFRo4cqX79+qmqqkqvvPJK1CEFuv3225OurXuGoVzx4osv6tJLL9XQoUOVl5enJ554wrPfcRwtXrxYQ4YMUWFhoSZPnqx33nknmmBdguKeM2dO0vWfNm1aNMG61NfX61vf+pYGDBigiooKzZw5U9u3b/cc8/nnn6umpkannHKK+vfvr1mzZiVN0BGk1yY199I2b731lu677z6tWrVKP/vZzxLH/H1pmxEjRmjr1q1avny5br/99qSZTbKtvb1dl19+uebNm+d73OrVq7Vv377Ea+bMmdkJsAtBcR87dkyXXHKJ2tvbtXnzZq1du1Zr1qzR4sWLsxxp9yxdutRzfa+//vqoQ/J49NFHVVtbq9tuu03/8z//o3Hjxmnq1Knav39/1KEF+sY3vuG5ti+99FLUISU5cuSIxo0bpxUrVnS6/5577tGvf/1rrVq1Si+//LJOPvlkTZ06VZ9//nmWI/UKiluSpk2b5rn+jzzySBYj7NymTZtUU1OjLVu26Pnnn1dHR4emTJmiI0eOJI5ZsGCBnnrqKT322GPatGmTPvjgA1122WXhTuRY5J577nFGjRqV2H7wwQedgQMHOvF4PPG7W265xRk7dmwU4SVZvXq1U1JS0uk+Sc7jjz+e1Xi6q6u4n3nmGSc/P99pbm5O/G7lypVOcXGx5zvIBSNGjHDuu+++qMPwdd555zk1NTWJ7WPHjjlDhw516uvrI4wq2G233eaMGzcu6jBCMf+9HT9+3KmsrHSWL1+e+N2hQ4ecWCzmPPLIIxFE2LnO/jsxe/ZsZ8aMGZHEE8b+/fsdSc6mTZscx/ni+hYUFDiPPfZY4pi//vWvjiSnoaGh2+322ju1znR3aZvt27fr448/jiLEUGpqajRo0CCdd955euihhzyD1nNRQ0ODzjrrrMRKC9IX17utrU1vvfVWhJF1btmyZTrllFM0fvx4LV++PKe6Sdvb27V161ZNnjw58bv8/HxNnjxZDQ0NEUbWPe+8846GDh2q0aNH60c/+pGampqiDimUXbt2qbm52XP9S0pKVFVV1Suu/8aNG1VRUaGxY8dq3rx5OnDgQNQhJWltbZWkxH+zt27dqo6ODs81P/300zV8+PBQ1zyr66llUrqWtskVS5cu1Xe/+10VFRXpueee03XXXafDhw/rhhtuiDq0LjU3N3sSmuS93rnkhhtu0LnnnquysjJt3rxZdXV12rdvn+69996oQ5MkffTRRzp27Fin17OrBXRzRVVVldasWaOxY8dq3759WrJkiS666CK9+eabGjBgQNThdcvf/147u/659rdsmjZtmi677DKNGjVKO3fu1M9+9jNNnz5dDQ0NOumkk6IOT5J0/Phx3Xjjjbrgggt05plnSlJisWizXh/2mufcndqiRYs6fUjC/TL/UadzaZtsxu3n1ltv1QUXXKDx48frlltu0c0336zly5fnfNxRCvNZamtrNXHiRJ199tm69tpr9atf/UoPPPCAZ1V19Mz06dN1+eWX6+yzz9bUqVP1zDNfrGj8xz/+MerQTgjf//739Y//+I8666yzNHPmTD399NP6y1/+oo0bN0YdWkJNTY3efPPNjDz8lnN3ar11aZuwcYdVVVWlO+64Q/F4PK0TlqYz7srKyqSn87K5lFAqn6WqqkpHjx7V7t27NXbs2AxEF86gQYN00kkndfr329uWZSotLdVpp52mHTt2RB1Kt/39Gre0tGjIkCGJ37e0tOicc86JKKqeGT16tAYNGqQdO3bo4osvjjoczZ8/X08//bRefPFFffWrX038vrKyUu3t7Tp06JDnbi3s33zOJbXeurRNmLh7orGxUQMHDkz7DNzpjLu6ulp33nmn9u/fr4qKCklfXO/i4mKdccYZaTmHn1Q+S2Njo/Lz8xNxR61v376aMGGC1q9fn3jq9fjx41q/fr3mz58fbXAhHT58WDt37tSVV14ZdSjdNmrUKFVWVmr9+vWJJNbW1qaXX3458KnlXLN3714dOHDAk5yj4DiOrr/+ej3++OPauHFjUmlowoQJKigo0Pr16zVr1ixJ0vbt29XU1KTq6upQJ+qV9u7d64wZM8a5+OKLnb179zr79u1LvP7u0KFDzuDBg50rr7zSefPNN51169Y5RUVFzm9/+9sII3ec9957z3nttdecJUuWOP3793dee+0157XXXnM++eQTx3Ec5z/+4z+cf//3f3feeOMN55133nEefPBBp6ioyFm8eHFOx3306FHnzDPPdKZMmeI0NjY6zz77rFNeXu7U1dVFGrdp8+bNzn333ec0NjY6O3fudP7whz845eXlzo9//OOoQ/NYt26dE4vFnDVr1jhvv/22c8011zilpaWep0tz0cKFC52NGzc6u3btcv77v//bmTx5sjNo0CBn//79UYfm8cknnyT+hiU59957r/Paa6857733nuM4jrNs2TKntLTUefLJJ53XX3/dmTFjhjNq1Cjns88+y9m4P/nkE+emm25yGhoanF27djkvvPCCc+655zpf+9rXnM8//zzSuOfNm+eUlJQ4Gzdu9Pz3+tNPP00cc+211zrDhw93/vznPzuvvvqqU11d7VRXV4c6T69NaqtXr3Ykdfpy+9///V/nwgsvdGKxmPOVr3zFWbZsWUQRf2n27Nmdxr1hwwbHcRznP//zP51zzjnH6d+/v3PyySc748aNc1atWuUcO3Ysp+N2HMfZvXu3M336dKewsNAZNGiQs3DhQqejoyO6oDuxdetWp6qqyikpKXH69evnfP3rX3fuuuuuyP/Rd+aBBx5whg8f7vTt29c577zznC1btkQdUqArrrjCGTJkiNO3b1/nK1/5inPFFVc4O3bsiDqsJBs2bOj073n27NmO43zxWP+tt97qDB482InFYs7FF1/sbN++PdqgHf+4P/30U2fKlClOeXm5U1BQ4IwYMcKZO3duTvyPUFf/vV69enXimM8++8y57rrrnIEDBzpFRUXO9773Pc+NSnew9AwAwBo59/QjAAA9RVIDAFiDpAYAsAZJDQBgDZIaAMAaJDUAgDVIagAAa5DUAADWIKkBAKxBUgMAWIOkBgCwxv8DEHJB30KqDHQAAAAASUVORK5CYII=", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "xbins, ybins, surf_density = vis.density_projection(s, bins=np.linspace(-20, 20, 100))" + ] + }, + { + "cell_type": "markdown", + "id": "611b13e0", + "metadata": {}, + "source": [ + "## Misc Analyses\n", + "\n", + "Other analyses are outlined here." + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "id": "eb2bd0ba", + "metadata": {}, + "outputs": [ + { + "data": { + "text/latex": [ + "$[15306613] \\; \\mathrm{\\frac{M_{\\odot}}{kpc^{3}}}$" + ], + "text/plain": [ + "" + ] + }, + "execution_count": 16, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# To find the particle density near a given point,\n", + "s.density_points([0,0,0]*u.kpc)" + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "id": "1441075f", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "(array([2.56199069e+12, 2.49863973e+12, 2.52594940e+12]),\n", + " array([[-0.5373118 , 0.72543306, -0.43016614],\n", + " [ 0.77115326, 0.62910866, 0.09769822],\n", + " [-0.34149476, 0.27922962, 0.89744758]]))" + ] + }, + "execution_count": 17, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# To calculate the principal axes (and their directions) of the \n", + "# selected particle distribution by diagonalizing the inertia tensor,\n", + "s.principal_axes()" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "py311", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.11.4" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/docs/source/tutorials/2_working_with_simulations.ipynb b/docs/source/tutorials/2_working_with_simulations.ipynb new file mode 100644 index 0000000..e6c7f3e --- /dev/null +++ b/docs/source/tutorials/2_working_with_simulations.ipynb @@ -0,0 +1,280 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "080cd826", + "metadata": {}, + "source": [ + "# Working with Simulations\n", + "\n", + "Sometimes, you need to work with many snapshots across an entire simulation instead of a single snapshot at once. This notebook describes the routines included in `snapAnalysis.sim` for extracting useful data from entire simualtions. We'll work with the isolated dark matter halo snapshots included in the test suite. There's only two snapshots in this test simulation (for space reasons), but these recipes translate directly to simulations including thousands of snapshots." + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "id": "03e48c8e", + "metadata": {}, + "outputs": [], + "source": [ + "from snapanalysis import sim\n", + "from snapanalysis.snap import snapshot\n", + "import astropy.units as u" + ] + }, + { + "cell_type": "markdown", + "id": "1a58fdf2", + "metadata": {}, + "source": [ + "## Obtaining a list of available snapshots\n", + "\n", + "Sometimes, it's convenient to get a list of all the snapshot files in a particular simulation directory. " + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "id": "de13eeb0", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "['../tests/example_snaps/cdm_snaps/snap_000.hdf5'\n", + " '../tests/example_snaps/cdm_snaps/snap_001.hdf5']\n" + ] + } + ], + "source": [ + "sim_dir = \"../tests/example_snaps/cdm_snaps\"\n", + "snaps = sim.get_snaps(sim_dir)\n", + "print(snaps)" + ] + }, + { + "cell_type": "markdown", + "id": "e2bcb947", + "metadata": {}, + "source": [ + "## Extracting the center-of-mass orbit of a galaxy\n", + "\n", + "To extract the center-of-mass orbit of a galaxy, use the `orbit_com` function. In a simulation that includes multiple galaxies, you must specify the particle ID range that belongs to the galaxy of interest. You can also supply dictionaries of kwargs to the position and velocity center-finding routines. The columns in the output array are time, x, y, z, vx, vy, vz" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "id": "9a6fa20e", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "array([[ 0. , 0.120152, -0.287273, 0.114837, -2.411327, 0.092466,\n", + " -1.306028],\n", + " [ 0.197182, -0.426582, -0.400833, -0.421794, -0.098579, -0.782643,\n", + " -0.2411 ]])" + ] + }, + "execution_count": 3, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "sim.orbit_com(sim_dir, part_type=1, select_IDs=None, com_kwargs={\"vol_dec\": 1.1, \"r_start\":15.0*u.kpc, \"guess\": [0,0,0]*u.kpc})" + ] + }, + { + "cell_type": "markdown", + "id": "3f4e6100", + "metadata": {}, + "source": [] + }, + { + "cell_type": "markdown", + "id": "3ca911f9", + "metadata": {}, + "source": [ + "## Extracting rotations\n", + "\n", + "To extract the rotation matrices needed at each time to align a galaxy's angular momentum to the $z$-axis, use the `get_alignment_rotations` function. Again, you can specify an ID range to select a particular galaxy. By default, `get_alignment_rotations` will center each snapshot before calculating its angular momentum, but you can also specify a file of precomputed centers from `orbit_com` if you have one. The resulting array will be the stacked rotation matrices required to align each snapshot's angular momentum with $z$, of the shape N_snapshots x 3 x 3." + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "id": "0466beaf", + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/Users/haydenfoote/Documents/gradschool/research/code/snapAnalysis/src/snapanalysis/snap.py:468: UserWarning: COM: Minimum number of particles reached before COM converged.\n", + " warnings.warn(\n" + ] + }, + { + "data": { + "text/plain": [ + "array([[[-0.95041252, 0.05663625, -0.30579141],\n", + " [-0.0594857 , -0.99822916, 0. ],\n", + " [-0.3052499 , 0.01819022, 0.95209853]],\n", + "\n", + " [[ 0.53087062, 0.66868122, -0.52061676],\n", + " [-0.78319123, 0.62178091, 0. ],\n", + " [ 0.32370956, 0.40774248, 0.85379048]]])" + ] + }, + "execution_count": 4, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "sim.get_alignment_rotations(sim_dir, part_type=1, r_max=10*u.kpc, select_IDs=None, use_centers=None)" + ] + }, + { + "cell_type": "markdown", + "id": "e310b65b", + "metadata": {}, + "source": [ + "## Extracting particle orbits\n", + "To extract the orbit of a specific particle(s), use `get_particle_orbit`. Again, by default this function will center and align the snapshots for you, but you may specify precomputed centers and rotations. " + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "id": "0ac81e9d", + "metadata": {}, + "outputs": [], + "source": [ + "import numpy as np\n", + "\n", + "# get 10 random particle ID from the first snapshot\n", + "s = snapshot(snaps[0], 1)\n", + "s.load_particle_data([\"ParticleIDs\"])\n", + "rand_ids = np.random.choice(s.data_fields[\"ParticleIDs\"], size=10, replace=False)\n", + "\n", + "# and extract their orbits\n", + "orbits = sim.get_particle_orbit(sim_dir, part_type=1, ids=rand_ids)" + ] + }, + { + "cell_type": "markdown", + "id": "3ebc0416", + "metadata": {}, + "source": [ + "This function returns an `orbit` object, which keeps track of particle orbits. `orbit` objects are designed for ease of use with the the [Gala package](https://gala.adrian.pw/en/latest/index.html) for galactric dynamics. You can access the data as follows." + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "id": "c94bd29e", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[0. 0.19718176] Gyr\n" + ] + } + ], + "source": [ + "# The times of each stored point in the orbit are stored in\n", + "print(orbits.t)" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "id": "95742ca0", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "(2, 3, 10)\n", + "(2, 3, 10)\n" + ] + } + ], + "source": [ + "# positions and velocities of each particle are stored in orbits.pos and orbits.vel.\n", + "# these have shape (N_times, 3, N_particles) for consistency with Gala.\n", + "print(orbits.pos.shape)\n", + "print(orbits.vel.shape)" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "id": "9eea01da", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "{'1881': 0, '3490': 1, '4334': 2, '4556': 3, '4881': 4, '6363': 5, '6548': 6, '7777': 7, '8855': 8, '9644': 9}\n" + ] + } + ], + "source": [ + "# The IDs attribute is a dictionary whose keys are the particle IDs, \n", + "# and whose values are the indices of those particles in the data arrays.\n", + "print(orbits.ids)" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "id": "f50f9d15", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[[-14.05476249 -11.31392662 -15.47666254]\n", + " [ 11.23177433 2.7399446 -12.70862759]] kpc\n" + ] + } + ], + "source": [ + "# Therefore, to access the position of a particular particle at all times, \n", + "id = str(int(rand_ids[0]))\n", + "print(orbits.pos[:, :, orbits.ids[id]])" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "py311", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.11.4" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/docs/source/tutorials/tutorials.rst b/docs/source/tutorials/tutorials.rst new file mode 100644 index 0000000..d9ee8dc --- /dev/null +++ b/docs/source/tutorials/tutorials.rst @@ -0,0 +1,14 @@ +.. _tutorials: + +Tutorials +========= + +Here are some tutorials to get you started with using ``snapAnalysis``. These tutorials are also available as Jupyter notebooks in the `tutorials directory `_ on GitHub if you'd like to run them yourself. + +The first tutorial covers working with individual snapshots using the ``snapshot`` class, while the second tutorial covers working with entire simulations using the ``sim`` module. + +.. toctree:: + :maxdepth: 1 + + Working with snapshots <1_working_with_snapshots.ipynb> + Working with simulations <2_working_with_simulations.ipynb> \ No newline at end of file diff --git a/pyproject.toml b/pyproject.toml index 93a00bb..e5ed989 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -24,6 +24,8 @@ build-backend = "uv_build" [dependency-groups] dev = [ + "ipython>=9.13.0", + "nbsphinx>=0.9.8", "pytest>=9.0.1", "pytest-cov>=7.1.0", "pytest-mock>=3.15.1", diff --git a/uv.lock b/uv.lock index d608f34..0ab36ef 100644 --- a/uv.lock +++ b/uv.lock @@ -47,6 +47,24 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/bf/77/992c739399a70c536ec94799ddcf002006e8d64c13ddfe01bb91e24c6fa5/astropy_iers_data-0.2026.5.18.1.11.28-py3-none-any.whl", hash = "sha256:02775200423294f67a27c1a2243a35877ef101d8df7a51fe2bfd01b63864426d", size = 1990878, upload-time = "2026-05-18T01:12:03.575Z" }, ] +[[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 = "attrs" +version = "26.1.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/9a/8e/82a0fe20a541c03148528be8cac2408564a6c9a0cc7e9171802bc1d26985/attrs-26.1.0.tar.gz", hash = "sha256:d03ceb89cb322a8fd706d4fb91940737b6642aa36998fe130a9bc96c985eff32", size = 952055, upload-time = "2026-03-19T14:22:25.026Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/64/b4/17d4b0b2a2dc85a6df63d1157e028ed19f90d4cd97c36717afef2bc2f395/attrs-26.1.0-py3-none-any.whl", hash = "sha256:c647aa4a12dfbad9333ca4e71fe62ddc36f4e63b2d260a37a8b83d2f043ac309", size = 67548, upload-time = "2026-03-19T14:22:23.645Z" }, +] + [[package]] name = "babel" version = "2.18.0" @@ -56,6 +74,36 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/77/f5/21d2de20e8b8b0408f0681956ca2c69f1320a3848ac50e6e7f39c6159675/babel-2.18.0-py3-none-any.whl", hash = "sha256:e2b422b277c2b9a9630c1d7903c2a00d0830c409c59ac8cae9081c92f1aeba35", size = 10196845, upload-time = "2026-02-01T12:30:53.445Z" }, ] +[[package]] +name = "beautifulsoup4" +version = "4.14.3" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "soupsieve" }, + { name = "typing-extensions" }, +] +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.3.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "webencodings" }, +] +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" }, +] + [[package]] name = "certifi" version = "2026.5.20" @@ -65,6 +113,76 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/59/8c/57e832b7af6d7c5abe66eb3fbe3a3a32f4d11ea23a1aa7131371035be991/certifi-2026.5.20-py3-none-any.whl", hash = "sha256:3c52e209ba0a4ad7aebe60436a4ab349c39e1e602e8c134221e546902ad25897", size = 134134, upload-time = "2026-05-20T11:46:48.578Z" }, ] +[[package]] +name = "cffi" +version = "2.0.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pycparser", marker = "implementation_name != 'PyPy'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/eb/56/b1ba7935a17738ae8453301356628e8147c79dbb825bcbc73dc7401f9846/cffi-2.0.0.tar.gz", hash = "sha256:44d1b5909021139fe36001ae048dbdde8214afa20200eda0f64c068cac5d5529", size = 523588, upload-time = "2025-09-08T23:24:04.541Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/12/4a/3dfd5f7850cbf0d06dc84ba9aa00db766b52ca38d8b86e3a38314d52498c/cffi-2.0.0-cp311-cp311-macosx_10_13_x86_64.whl", hash = "sha256:b4c854ef3adc177950a8dfc81a86f5115d2abd545751a304c5bcf2c2c7283cfe", size = 184344, upload-time = "2025-09-08T23:22:26.456Z" }, + { url = "https://files.pythonhosted.org/packages/4f/8b/f0e4c441227ba756aafbe78f117485b25bb26b1c059d01f137fa6d14896b/cffi-2.0.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:2de9a304e27f7596cd03d16f1b7c72219bd944e99cc52b84d0145aefb07cbd3c", size = 180560, upload-time = "2025-09-08T23:22:28.197Z" }, + { url = "https://files.pythonhosted.org/packages/b1/b7/1200d354378ef52ec227395d95c2576330fd22a869f7a70e88e1447eb234/cffi-2.0.0-cp311-cp311-manylinux1_i686.manylinux2014_i686.manylinux_2_17_i686.manylinux_2_5_i686.whl", hash = "sha256:baf5215e0ab74c16e2dd324e8ec067ef59e41125d3eade2b863d294fd5035c92", size = 209613, upload-time = "2025-09-08T23:22:29.475Z" }, + { url = "https://files.pythonhosted.org/packages/b8/56/6033f5e86e8cc9bb629f0077ba71679508bdf54a9a5e112a3c0b91870332/cffi-2.0.0-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:730cacb21e1bdff3ce90babf007d0a0917cc3e6492f336c2f0134101e0944f93", size = 216476, upload-time = "2025-09-08T23:22:31.063Z" }, + { url = "https://files.pythonhosted.org/packages/dc/7f/55fecd70f7ece178db2f26128ec41430d8720f2d12ca97bf8f0a628207d5/cffi-2.0.0-cp311-cp311-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:6824f87845e3396029f3820c206e459ccc91760e8fa24422f8b0c3d1731cbec5", size = 203374, upload-time = "2025-09-08T23:22:32.507Z" }, + { url = "https://files.pythonhosted.org/packages/84/ef/a7b77c8bdc0f77adc3b46888f1ad54be8f3b7821697a7b89126e829e676a/cffi-2.0.0-cp311-cp311-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:9de40a7b0323d889cf8d23d1ef214f565ab154443c42737dfe52ff82cf857664", size = 202597, upload-time = "2025-09-08T23:22:34.132Z" }, + { url = "https://files.pythonhosted.org/packages/d7/91/500d892b2bf36529a75b77958edfcd5ad8e2ce4064ce2ecfeab2125d72d1/cffi-2.0.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:8941aaadaf67246224cee8c3803777eed332a19d909b47e29c9842ef1e79ac26", size = 215574, upload-time = "2025-09-08T23:22:35.443Z" }, + { url = "https://files.pythonhosted.org/packages/44/64/58f6255b62b101093d5df22dcb752596066c7e89dd725e0afaed242a61be/cffi-2.0.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:a05d0c237b3349096d3981b727493e22147f934b20f6f125a3eba8f994bec4a9", size = 218971, upload-time = "2025-09-08T23:22:36.805Z" }, + { url = "https://files.pythonhosted.org/packages/ab/49/fa72cebe2fd8a55fbe14956f9970fe8eb1ac59e5df042f603ef7c8ba0adc/cffi-2.0.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:94698a9c5f91f9d138526b48fe26a199609544591f859c870d477351dc7b2414", size = 211972, upload-time = "2025-09-08T23:22:38.436Z" }, + { url = "https://files.pythonhosted.org/packages/0b/28/dd0967a76aab36731b6ebfe64dec4e981aff7e0608f60c2d46b46982607d/cffi-2.0.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:5fed36fccc0612a53f1d4d9a816b50a36702c28a2aa880cb8a122b3466638743", size = 217078, upload-time = "2025-09-08T23:22:39.776Z" }, + { url = "https://files.pythonhosted.org/packages/2b/c0/015b25184413d7ab0a410775fdb4a50fca20f5589b5dab1dbbfa3baad8ce/cffi-2.0.0-cp311-cp311-win32.whl", hash = "sha256:c649e3a33450ec82378822b3dad03cc228b8f5963c0c12fc3b1e0ab940f768a5", size = 172076, upload-time = "2025-09-08T23:22:40.95Z" }, + { url = "https://files.pythonhosted.org/packages/ae/8f/dc5531155e7070361eb1b7e4c1a9d896d0cb21c49f807a6c03fd63fc877e/cffi-2.0.0-cp311-cp311-win_amd64.whl", hash = "sha256:66f011380d0e49ed280c789fbd08ff0d40968ee7b665575489afa95c98196ab5", size = 182820, upload-time = "2025-09-08T23:22:42.463Z" }, + { url = "https://files.pythonhosted.org/packages/95/5c/1b493356429f9aecfd56bc171285a4c4ac8697f76e9bbbbb105e537853a1/cffi-2.0.0-cp311-cp311-win_arm64.whl", hash = "sha256:c6638687455baf640e37344fe26d37c404db8b80d037c3d29f58fe8d1c3b194d", size = 177635, upload-time = "2025-09-08T23:22:43.623Z" }, + { url = "https://files.pythonhosted.org/packages/ea/47/4f61023ea636104d4f16ab488e268b93008c3d0bb76893b1b31db1f96802/cffi-2.0.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:6d02d6655b0e54f54c4ef0b94eb6be0607b70853c45ce98bd278dc7de718be5d", size = 185271, upload-time = "2025-09-08T23:22:44.795Z" }, + { url = "https://files.pythonhosted.org/packages/df/a2/781b623f57358e360d62cdd7a8c681f074a71d445418a776eef0aadb4ab4/cffi-2.0.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:8eca2a813c1cb7ad4fb74d368c2ffbbb4789d377ee5bb8df98373c2cc0dee76c", size = 181048, upload-time = "2025-09-08T23:22:45.938Z" }, + { url = "https://files.pythonhosted.org/packages/ff/df/a4f0fbd47331ceeba3d37c2e51e9dfc9722498becbeec2bd8bc856c9538a/cffi-2.0.0-cp312-cp312-manylinux1_i686.manylinux2014_i686.manylinux_2_17_i686.manylinux_2_5_i686.whl", hash = "sha256:21d1152871b019407d8ac3985f6775c079416c282e431a4da6afe7aefd2bccbe", size = 212529, upload-time = "2025-09-08T23:22:47.349Z" }, + { url = "https://files.pythonhosted.org/packages/d5/72/12b5f8d3865bf0f87cf1404d8c374e7487dcf097a1c91c436e72e6badd83/cffi-2.0.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:b21e08af67b8a103c71a250401c78d5e0893beff75e28c53c98f4de42f774062", size = 220097, upload-time = "2025-09-08T23:22:48.677Z" }, + { url = "https://files.pythonhosted.org/packages/c2/95/7a135d52a50dfa7c882ab0ac17e8dc11cec9d55d2c18dda414c051c5e69e/cffi-2.0.0-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:1e3a615586f05fc4065a8b22b8152f0c1b00cdbc60596d187c2a74f9e3036e4e", size = 207983, upload-time = "2025-09-08T23:22:50.06Z" }, + { url = "https://files.pythonhosted.org/packages/3a/c8/15cb9ada8895957ea171c62dc78ff3e99159ee7adb13c0123c001a2546c1/cffi-2.0.0-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:81afed14892743bbe14dacb9e36d9e0e504cd204e0b165062c488942b9718037", size = 206519, upload-time = "2025-09-08T23:22:51.364Z" }, + { url = "https://files.pythonhosted.org/packages/78/2d/7fa73dfa841b5ac06c7b8855cfc18622132e365f5b81d02230333ff26e9e/cffi-2.0.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:3e17ed538242334bf70832644a32a7aae3d83b57567f9fd60a26257e992b79ba", size = 219572, upload-time = "2025-09-08T23:22:52.902Z" }, + { url = "https://files.pythonhosted.org/packages/07/e0/267e57e387b4ca276b90f0434ff88b2c2241ad72b16d31836adddfd6031b/cffi-2.0.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:3925dd22fa2b7699ed2617149842d2e6adde22b262fcbfada50e3d195e4b3a94", size = 222963, upload-time = "2025-09-08T23:22:54.518Z" }, + { url = "https://files.pythonhosted.org/packages/b6/75/1f2747525e06f53efbd878f4d03bac5b859cbc11c633d0fb81432d98a795/cffi-2.0.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:2c8f814d84194c9ea681642fd164267891702542f028a15fc97d4674b6206187", size = 221361, upload-time = "2025-09-08T23:22:55.867Z" }, + { url = "https://files.pythonhosted.org/packages/7b/2b/2b6435f76bfeb6bbf055596976da087377ede68df465419d192acf00c437/cffi-2.0.0-cp312-cp312-win32.whl", hash = "sha256:da902562c3e9c550df360bfa53c035b2f241fed6d9aef119048073680ace4a18", size = 172932, upload-time = "2025-09-08T23:22:57.188Z" }, + { url = "https://files.pythonhosted.org/packages/f8/ed/13bd4418627013bec4ed6e54283b1959cf6db888048c7cf4b4c3b5b36002/cffi-2.0.0-cp312-cp312-win_amd64.whl", hash = "sha256:da68248800ad6320861f129cd9c1bf96ca849a2771a59e0344e88681905916f5", size = 183557, upload-time = "2025-09-08T23:22:58.351Z" }, + { url = "https://files.pythonhosted.org/packages/95/31/9f7f93ad2f8eff1dbc1c3656d7ca5bfd8fb52c9d786b4dcf19b2d02217fa/cffi-2.0.0-cp312-cp312-win_arm64.whl", hash = "sha256:4671d9dd5ec934cb9a73e7ee9676f9362aba54f7f34910956b84d727b0d73fb6", size = 177762, upload-time = "2025-09-08T23:22:59.668Z" }, + { url = "https://files.pythonhosted.org/packages/4b/8d/a0a47a0c9e413a658623d014e91e74a50cdd2c423f7ccfd44086ef767f90/cffi-2.0.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:00bdf7acc5f795150faa6957054fbbca2439db2f775ce831222b66f192f03beb", size = 185230, upload-time = "2025-09-08T23:23:00.879Z" }, + { url = "https://files.pythonhosted.org/packages/4a/d2/a6c0296814556c68ee32009d9c2ad4f85f2707cdecfd7727951ec228005d/cffi-2.0.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:45d5e886156860dc35862657e1494b9bae8dfa63bf56796f2fb56e1679fc0bca", size = 181043, upload-time = "2025-09-08T23:23:02.231Z" }, + { url = "https://files.pythonhosted.org/packages/b0/1e/d22cc63332bd59b06481ceaac49d6c507598642e2230f201649058a7e704/cffi-2.0.0-cp313-cp313-manylinux1_i686.manylinux2014_i686.manylinux_2_17_i686.manylinux_2_5_i686.whl", hash = "sha256:07b271772c100085dd28b74fa0cd81c8fb1a3ba18b21e03d7c27f3436a10606b", size = 212446, upload-time = "2025-09-08T23:23:03.472Z" }, + { url = "https://files.pythonhosted.org/packages/a9/f5/a2c23eb03b61a0b8747f211eb716446c826ad66818ddc7810cc2cc19b3f2/cffi-2.0.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:d48a880098c96020b02d5a1f7d9251308510ce8858940e6fa99ece33f610838b", size = 220101, upload-time = "2025-09-08T23:23:04.792Z" }, + { url = "https://files.pythonhosted.org/packages/f2/7f/e6647792fc5850d634695bc0e6ab4111ae88e89981d35ac269956605feba/cffi-2.0.0-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:f93fd8e5c8c0a4aa1f424d6173f14a892044054871c771f8566e4008eaa359d2", size = 207948, upload-time = "2025-09-08T23:23:06.127Z" }, + { url = "https://files.pythonhosted.org/packages/cb/1e/a5a1bd6f1fb30f22573f76533de12a00bf274abcdc55c8edab639078abb6/cffi-2.0.0-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:dd4f05f54a52fb558f1ba9f528228066954fee3ebe629fc1660d874d040ae5a3", size = 206422, upload-time = "2025-09-08T23:23:07.753Z" }, + { url = "https://files.pythonhosted.org/packages/98/df/0a1755e750013a2081e863e7cd37e0cdd02664372c754e5560099eb7aa44/cffi-2.0.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:c8d3b5532fc71b7a77c09192b4a5a200ea992702734a2e9279a37f2478236f26", size = 219499, upload-time = "2025-09-08T23:23:09.648Z" }, + { url = "https://files.pythonhosted.org/packages/50/e1/a969e687fcf9ea58e6e2a928ad5e2dd88cc12f6f0ab477e9971f2309b57c/cffi-2.0.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:d9b29c1f0ae438d5ee9acb31cadee00a58c46cc9c0b2f9038c6b0b3470877a8c", size = 222928, upload-time = "2025-09-08T23:23:10.928Z" }, + { url = "https://files.pythonhosted.org/packages/36/54/0362578dd2c9e557a28ac77698ed67323ed5b9775ca9d3fe73fe191bb5d8/cffi-2.0.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:6d50360be4546678fc1b79ffe7a66265e28667840010348dd69a314145807a1b", size = 221302, upload-time = "2025-09-08T23:23:12.42Z" }, + { url = "https://files.pythonhosted.org/packages/eb/6d/bf9bda840d5f1dfdbf0feca87fbdb64a918a69bca42cfa0ba7b137c48cb8/cffi-2.0.0-cp313-cp313-win32.whl", hash = "sha256:74a03b9698e198d47562765773b4a8309919089150a0bb17d829ad7b44b60d27", size = 172909, upload-time = "2025-09-08T23:23:14.32Z" }, + { url = "https://files.pythonhosted.org/packages/37/18/6519e1ee6f5a1e579e04b9ddb6f1676c17368a7aba48299c3759bbc3c8b3/cffi-2.0.0-cp313-cp313-win_amd64.whl", hash = "sha256:19f705ada2530c1167abacb171925dd886168931e0a7b78f5bffcae5c6b5be75", size = 183402, upload-time = "2025-09-08T23:23:15.535Z" }, + { url = "https://files.pythonhosted.org/packages/cb/0e/02ceeec9a7d6ee63bb596121c2c8e9b3a9e150936f4fbef6ca1943e6137c/cffi-2.0.0-cp313-cp313-win_arm64.whl", hash = "sha256:256f80b80ca3853f90c21b23ee78cd008713787b1b1e93eae9f3d6a7134abd91", size = 177780, upload-time = "2025-09-08T23:23:16.761Z" }, + { url = "https://files.pythonhosted.org/packages/92/c4/3ce07396253a83250ee98564f8d7e9789fab8e58858f35d07a9a2c78de9f/cffi-2.0.0-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:fc33c5141b55ed366cfaad382df24fe7dcbc686de5be719b207bb248e3053dc5", size = 185320, upload-time = "2025-09-08T23:23:18.087Z" }, + { url = "https://files.pythonhosted.org/packages/59/dd/27e9fa567a23931c838c6b02d0764611c62290062a6d4e8ff7863daf9730/cffi-2.0.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:c654de545946e0db659b3400168c9ad31b5d29593291482c43e3564effbcee13", size = 181487, upload-time = "2025-09-08T23:23:19.622Z" }, + { url = "https://files.pythonhosted.org/packages/d6/43/0e822876f87ea8a4ef95442c3d766a06a51fc5298823f884ef87aaad168c/cffi-2.0.0-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:24b6f81f1983e6df8db3adc38562c83f7d4a0c36162885ec7f7b77c7dcbec97b", size = 220049, upload-time = "2025-09-08T23:23:20.853Z" }, + { url = "https://files.pythonhosted.org/packages/b4/89/76799151d9c2d2d1ead63c2429da9ea9d7aac304603de0c6e8764e6e8e70/cffi-2.0.0-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:12873ca6cb9b0f0d3a0da705d6086fe911591737a59f28b7936bdfed27c0d47c", size = 207793, upload-time = "2025-09-08T23:23:22.08Z" }, + { url = "https://files.pythonhosted.org/packages/bb/dd/3465b14bb9e24ee24cb88c9e3730f6de63111fffe513492bf8c808a3547e/cffi-2.0.0-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:d9b97165e8aed9272a6bb17c01e3cc5871a594a446ebedc996e2397a1c1ea8ef", size = 206300, upload-time = "2025-09-08T23:23:23.314Z" }, + { url = "https://files.pythonhosted.org/packages/47/d9/d83e293854571c877a92da46fdec39158f8d7e68da75bf73581225d28e90/cffi-2.0.0-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:afb8db5439b81cf9c9d0c80404b60c3cc9c3add93e114dcae767f1477cb53775", size = 219244, upload-time = "2025-09-08T23:23:24.541Z" }, + { url = "https://files.pythonhosted.org/packages/2b/0f/1f177e3683aead2bb00f7679a16451d302c436b5cbf2505f0ea8146ef59e/cffi-2.0.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:737fe7d37e1a1bffe70bd5754ea763a62a066dc5913ca57e957824b72a85e205", size = 222828, upload-time = "2025-09-08T23:23:26.143Z" }, + { url = "https://files.pythonhosted.org/packages/c6/0f/cafacebd4b040e3119dcb32fed8bdef8dfe94da653155f9d0b9dc660166e/cffi-2.0.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:38100abb9d1b1435bc4cc340bb4489635dc2f0da7456590877030c9b3d40b0c1", size = 220926, upload-time = "2025-09-08T23:23:27.873Z" }, + { url = "https://files.pythonhosted.org/packages/3e/aa/df335faa45b395396fcbc03de2dfcab242cd61a9900e914fe682a59170b1/cffi-2.0.0-cp314-cp314-win32.whl", hash = "sha256:087067fa8953339c723661eda6b54bc98c5625757ea62e95eb4898ad5e776e9f", size = 175328, upload-time = "2025-09-08T23:23:44.61Z" }, + { url = "https://files.pythonhosted.org/packages/bb/92/882c2d30831744296ce713f0feb4c1cd30f346ef747b530b5318715cc367/cffi-2.0.0-cp314-cp314-win_amd64.whl", hash = "sha256:203a48d1fb583fc7d78a4c6655692963b860a417c0528492a6bc21f1aaefab25", size = 185650, upload-time = "2025-09-08T23:23:45.848Z" }, + { url = "https://files.pythonhosted.org/packages/9f/2c/98ece204b9d35a7366b5b2c6539c350313ca13932143e79dc133ba757104/cffi-2.0.0-cp314-cp314-win_arm64.whl", hash = "sha256:dbd5c7a25a7cb98f5ca55d258b103a2054f859a46ae11aaf23134f9cc0d356ad", size = 180687, upload-time = "2025-09-08T23:23:47.105Z" }, + { url = "https://files.pythonhosted.org/packages/3e/61/c768e4d548bfa607abcda77423448df8c471f25dbe64fb2ef6d555eae006/cffi-2.0.0-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:9a67fc9e8eb39039280526379fb3a70023d77caec1852002b4da7e8b270c4dd9", size = 188773, upload-time = "2025-09-08T23:23:29.347Z" }, + { url = "https://files.pythonhosted.org/packages/2c/ea/5f76bce7cf6fcd0ab1a1058b5af899bfbef198bea4d5686da88471ea0336/cffi-2.0.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:7a66c7204d8869299919db4d5069a82f1561581af12b11b3c9f48c584eb8743d", size = 185013, upload-time = "2025-09-08T23:23:30.63Z" }, + { url = "https://files.pythonhosted.org/packages/be/b4/c56878d0d1755cf9caa54ba71e5d049479c52f9e4afc230f06822162ab2f/cffi-2.0.0-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:7cc09976e8b56f8cebd752f7113ad07752461f48a58cbba644139015ac24954c", size = 221593, upload-time = "2025-09-08T23:23:31.91Z" }, + { url = "https://files.pythonhosted.org/packages/e0/0d/eb704606dfe8033e7128df5e90fee946bbcb64a04fcdaa97321309004000/cffi-2.0.0-cp314-cp314t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:92b68146a71df78564e4ef48af17551a5ddd142e5190cdf2c5624d0c3ff5b2e8", size = 209354, upload-time = "2025-09-08T23:23:33.214Z" }, + { url = "https://files.pythonhosted.org/packages/d8/19/3c435d727b368ca475fb8742ab97c9cb13a0de600ce86f62eab7fa3eea60/cffi-2.0.0-cp314-cp314t-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:b1e74d11748e7e98e2f426ab176d4ed720a64412b6a15054378afdb71e0f37dc", size = 208480, upload-time = "2025-09-08T23:23:34.495Z" }, + { url = "https://files.pythonhosted.org/packages/d0/44/681604464ed9541673e486521497406fadcc15b5217c3e326b061696899a/cffi-2.0.0-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:28a3a209b96630bca57cce802da70c266eb08c6e97e5afd61a75611ee6c64592", size = 221584, upload-time = "2025-09-08T23:23:36.096Z" }, + { url = "https://files.pythonhosted.org/packages/25/8e/342a504ff018a2825d395d44d63a767dd8ebc927ebda557fecdaca3ac33a/cffi-2.0.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:7553fb2090d71822f02c629afe6042c299edf91ba1bf94951165613553984512", size = 224443, upload-time = "2025-09-08T23:23:37.328Z" }, + { url = "https://files.pythonhosted.org/packages/e1/5e/b666bacbbc60fbf415ba9988324a132c9a7a0448a9a8f125074671c0f2c3/cffi-2.0.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:6c6c373cfc5c83a975506110d17457138c8c63016b563cc9ed6e056a82f13ce4", size = 223437, upload-time = "2025-09-08T23:23:38.945Z" }, + { url = "https://files.pythonhosted.org/packages/a0/1d/ec1a60bd1a10daa292d3cd6bb0b359a81607154fb8165f3ec95fe003b85c/cffi-2.0.0-cp314-cp314t-win32.whl", hash = "sha256:1fc9ea04857caf665289b7a75923f2c6ed559b8298a1b8c49e59f7dd95c8481e", size = 180487, upload-time = "2025-09-08T23:23:40.423Z" }, + { url = "https://files.pythonhosted.org/packages/bf/41/4c1168c74fac325c0c8156f04b6749c8b6a8f405bbf91413ba088359f60d/cffi-2.0.0-cp314-cp314t-win_amd64.whl", hash = "sha256:d68b6cef7827e8641e8ef16f4494edda8b36104d79773a334beaa1e3521430f6", size = 191726, upload-time = "2025-09-08T23:23:41.742Z" }, + { url = "https://files.pythonhosted.org/packages/ae/3a/dbeec9d1ee0844c679f6bb5d6ad4e9f198b1224f4e7a32825f47f6192b0c/cffi-2.0.0-cp314-cp314t-win_arm64.whl", hash = "sha256:0a1527a803f0a659de1af2e1fd700213caba79377e27e4693648c2923da066f9", size = 184195, upload-time = "2025-09-08T23:23:43.004Z" }, +] + [[package]] name = "charset-normalizer" version = "3.4.7" @@ -358,6 +476,24 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/e7/05/c19819d5e3d95294a6f5947fb9b9629efb316b96de511b418c53d245aae6/cycler-0.12.1-py3-none-any.whl", hash = "sha256:85cef7cff222d8644161529808465972e51340599459b8ac3ccbac5a854e0d30", size = 8321, upload-time = "2023-10-07T05:32:16.783Z" }, ] +[[package]] +name = "decorator" +version = "5.3.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/60/8b/32f9823da46cde7df2087faa08cd98d01b908f8dcab982cdba9c84e85355/decorator-5.3.1.tar.gz", hash = "sha256:4cbcdd55a6efadb9dbea26b858f4fb3264567b52d69ca0d25b721b553f60ea82", size = 58084, upload-time = "2026-05-18T06:03:28.057Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/05/7f/798705f5296a58ca505d600456748d1be48078eac8a7050d8a98bc9edb89/decorator-5.3.1-py3-none-any.whl", hash = "sha256:f47fe6fdbd2edd623ecfe36875d37aba411624e2670dd395dddae1358689bb3c", size = 10365, upload-time = "2026-05-18T06:03:26.517Z" }, +] + +[[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.22.4" @@ -367,6 +503,24 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/02/10/5da547df7a391dcde17f59520a231527b8571e6f46fc8efb02ccb370ab12/docutils-0.22.4-py3-none-any.whl", hash = "sha256:d0013f540772d1420576855455d050a2180186c91c15779301ac2ccb3eeb68de", size = 633196, upload-time = "2025-12-18T19:00:18.077Z" }, ] +[[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.60.1" @@ -486,6 +640,53 @@ 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 = "ipython" +version = "9.13.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "colorama", marker = "sys_platform == 'win32'" }, + { name = "decorator" }, + { name = "ipython-pygments-lexers" }, + { name = "jedi" }, + { name = "matplotlib-inline" }, + { name = "pexpect", marker = "sys_platform != 'emscripten' and sys_platform != 'win32'" }, + { name = "prompt-toolkit" }, + { name = "psutil" }, + { name = "pygments" }, + { name = "stack-data" }, + { name = "traitlets" }, + { name = "typing-extensions", marker = "python_full_version < '3.12'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/cd/c4/87cda5842cf5c31837c06ddb588e11c3c35d8ece89b7a0108c06b8c9b00a/ipython-9.13.0.tar.gz", hash = "sha256:7e834b6afc99f020e3f05966ced34792f40267d64cb1ea9043886dab0dde5967", size = 4430549, upload-time = "2026-04-24T12:24:55.221Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/b9/86/3060e8029b7cc505cce9a0137431dda81d0a3fde93a8f0f50ee0bf37a795/ipython-9.13.0-py3-none-any.whl", hash = "sha256:57f9d4639e20818d328d287c7b549af3d05f12486ea8f2e7f73e52a36ec4d201", size = 627274, upload-time = "2026-04-24T12:24:53.038Z" }, +] + +[[package]] +name = "ipython-pygments-lexers" +version = "1.1.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pygments" }, +] +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 = "jedi" +version = "0.20.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "parso" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/46/b7/a3635f6a2d7cf5b5dd98064fc1d5fbbafcb25477bcea204a3a92145d158b/jedi-0.20.0.tar.gz", hash = "sha256:c3f4ccbd276696f4b19c54618d4fb18f9fc24b0aef02acf704b23f487daa1011", size = 3119416, upload-time = "2026-05-01T23:38:47.814Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/9a/93/242e2eab5fe682ffcb8b0084bde703a41d51e17ee0f3a31ff0d9d813620a/jedi-0.20.0-py2.py3-none-any.whl", hash = "sha256:7bdd9c2634f56713299976f4cbd59cb3fa92165cc5e05ea811fb253480728b67", size = 4884812, upload-time = "2026-05-01T23:38:43.919Z" }, +] + [[package]] name = "jinja2" version = "3.1.6" @@ -498,6 +699,71 @@ 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 = "jsonschema" +version = "4.26.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "attrs" }, + { name = "jsonschema-specifications" }, + { name = "referencing" }, + { name = "rpds-py" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/b3/fc/e067678238fa451312d4c62bf6e6cf5ec56375422aee02f9cb5f909b3047/jsonschema-4.26.0.tar.gz", hash = "sha256:0c26707e2efad8aa1bfc5b7ce170f3fccc2e4918ff85989ba9ffa9facb2be326", size = 366583, upload-time = "2026-01-07T13:41:07.246Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/69/90/f63fb5873511e014207a475e2bb4e8b2e570d655b00ac19a9a0ca0a385ee/jsonschema-4.26.0-py3-none-any.whl", hash = "sha256:d489f15263b8d200f8387e64b4c3a75f06629559fb73deb8fdfb525f2dab50ce", size = 90630, upload-time = "2026-01-07T13:41:05.306Z" }, +] + +[[package]] +name = "jsonschema-specifications" +version = "2025.9.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "referencing" }, +] +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.8.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "jupyter-core" }, + { name = "python-dateutil" }, + { name = "pyzmq" }, + { name = "tornado" }, + { name = "traitlets" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/05/e4/ba649102a3bc3fbca54e7239fb924fd434c766f855693d86de0b1f2bec81/jupyter_client-8.8.0.tar.gz", hash = "sha256:d556811419a4f2d96c869af34e854e3f059b7cc2d6d01a9cd9c85c267691be3e", size = 348020, upload-time = "2026-01-08T13:55:47.938Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/2d/0b/ceb7694d864abc0a047649aec263878acb9f792e1fec3e676f22dc9015e3/jupyter_client-8.8.0-py3-none-any.whl", hash = "sha256:f93a5b99c5e23a507b773d3a1136bd6e16c67883ccdbd9a829b0bbdb98cd7d7a", size = 107371, upload-time = "2026-01-08T13:55:45.562Z" }, +] + +[[package]] +name = "jupyter-core" +version = "5.9.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "platformdirs" }, + { name = "traitlets" }, +] +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 = "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 = "kiwisolver" version = "1.4.9" @@ -726,6 +992,100 @@ wheels = [ { 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.2.2" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "traitlets" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/bd/c0/9f7c9a46090390368a4d7bcb76bb87a4a36c421e4c0792cdb53486ffac7a/matplotlib_inline-0.2.2.tar.gz", hash = "sha256:72f3fe8fce36b70d4a5b612f899090cd0401deddc4ea90e1572b9f4bfb058c79", size = 8150, upload-time = "2026-05-08T17:33:33.49Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/41/09/5b161152e2d90f7b87f781c2e1267494aef9c32498df793f73ad0a0a494a/matplotlib_inline-0.2.2-py3-none-any.whl", hash = "sha256:3c821cf1c209f59fb2d2d64abbf5b23b67bcb2210d663f9918dd851c6da1fcf6", size = 9534, upload-time = "2026-05-08T17:33:32.055Z" }, +] + +[[package]] +name = "mistune" +version = "3.2.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/ca/84/620cc3f7e3adf6f5067e10f4dbae71295d8f9e16d5d3f9ef97c40f2f592c/mistune-3.2.1.tar.gz", hash = "sha256:7c8e5501d38bac1582e067e46c8343f17d57ea1aaa735823f3aba1fd59c88a28", size = 98003, upload-time = "2026-05-03T14:33:22.312Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/2a/7f/a946aa4f8752b37102b41e64dca18a1976ac705c3a0d1dfe74d820a02552/mistune-3.2.1-py3-none-any.whl", hash = "sha256:78cdb0ba5e938053ccf63651b352508d2efa9411dc8810bfb05f2dc5140c0048", size = 53749, upload-time = "2026-05-03T14:33:20.551Z" }, +] + +[[package]] +name = "nbclient" +version = "0.10.4" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "jupyter-client" }, + { name = "jupyter-core" }, + { name = "nbformat" }, + { name = "traitlets" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/56/91/1c1d5a4b9a9ebba2b4e32b8c852c2975c872aec1fe42ab5e516b2cecd193/nbclient-0.10.4.tar.gz", hash = "sha256:1e54091b16e6da39e297b0ece3e10f6f29f4ac4e8ee515d29f8a7099bd6553c9", size = 62554, upload-time = "2025-12-23T07:45:46.369Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/83/a0/5b0c2f11142ed1dddec842457d3f65eaf71a0080894eb6f018755b319c3a/nbclient-0.10.4-py3-none-any.whl", hash = "sha256:9162df5a7373d70d606527300a95a975a47c137776cd942e52d9c7e29ff83440", size = 25465, upload-time = "2025-12-23T07:45:44.51Z" }, +] + +[[package]] +name = "nbconvert" +version = "7.17.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "beautifulsoup4" }, + { name = "bleach", extra = ["css"] }, + { name = "defusedxml" }, + { name = "jinja2" }, + { name = "jupyter-core" }, + { name = "jupyterlab-pygments" }, + { name = "markupsafe" }, + { name = "mistune" }, + { name = "nbclient" }, + { name = "nbformat" }, + { name = "packaging" }, + { name = "pandocfilters" }, + { name = "pygments" }, + { name = "traitlets" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/01/b1/708e53fe2e429c103c6e6e159106bcf0357ac41aa4c28772bd8402339051/nbconvert-7.17.1.tar.gz", hash = "sha256:34d0d0a7e73ce3cbab6c5aae8f4f468797280b01fd8bd2ca746da8569eddd7d2", size = 865311, upload-time = "2026-04-08T00:44:14.914Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/67/f8/bb0a9d5f46819c821dc1f004aa2cc29b1d91453297dbf5ff20470f00f193/nbconvert-7.17.1-py3-none-any.whl", hash = "sha256:aa85c087b435e7bf1ffd03319f658e285f2b89eccab33bc1ba7025495ab3e7c8", size = 261927, upload-time = "2026-04-08T00:44:12.845Z" }, +] + +[[package]] +name = "nbformat" +version = "5.10.4" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "fastjsonschema" }, + { name = "jsonschema" }, + { name = "jupyter-core" }, + { 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 = "nbsphinx" +version = "0.9.8" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "docutils" }, + { name = "jinja2" }, + { name = "nbconvert" }, + { name = "nbformat" }, + { name = "sphinx", version = "9.0.4", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.12'" }, + { name = "sphinx", version = "9.1.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.12'" }, + { name = "traitlets" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/e7/d1/82081750f8a78ad0399c6ed831d42623b891904e8e7b8a75878225cf1dce/nbsphinx-0.9.8.tar.gz", hash = "sha256:d0765908399a8ee2b57be7ae881cf2ea58d66db3af7bbf33e6eb48f83bea5495", size = 417469, upload-time = "2025-11-28T17:41:02.336Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/03/78/843bcf0cf31f88d2f8a9a063d2d80817b1901657d83d65b89b3aa835732e/nbsphinx-0.9.8-py3-none-any.whl", hash = "sha256:92d95ee91784e56bc633b60b767a6b6f23a0445f891e24641ce3c3f004759ccf", size = 31961, upload-time = "2025-11-28T17:41:00.796Z" }, +] + [[package]] name = "numpy" version = "2.4.6" @@ -814,6 +1174,36 @@ 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.7" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/30/4b/90c937815137d43ce71ba043cd3566221e9df6b9c805f24b5d138c9d40a7/parso-0.8.7.tar.gz", hash = "sha256:eaaac4c9fdd5e9e8852dc778d2d7405897ec510f2a298071453e5e3a07914bb1", size = 401824, upload-time = "2026-05-01T23:13:02.138Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/99/5d/8268b644392ee874ee82a635cd0df1773de230bde356c38de28e298392cc/parso-0.8.7-py2.py3-none-any.whl", hash = "sha256:a8926eb2a1b915486941fdbd31e86a4baf88fe8c210f25f2f35ecec5b574ca1c", size = 107025, upload-time = "2026-05-01T23:12:58.867Z" }, +] + +[[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 = "pillow" version = "12.0.0" @@ -901,6 +1291,15 @@ wheels = [ { 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 = "platformdirs" +version = "4.9.6" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/9f/4a/0883b8e3802965322523f0b200ecf33d31f10991d0401162f4b23c698b42/platformdirs-4.9.6.tar.gz", hash = "sha256:3bfa75b0ad0db84096ae777218481852c0ebc6c727b3168c1b9e0118e458cf0a", size = 29400, upload-time = "2026-04-09T00:04:10.812Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/75/a6/a0a304dc33b49145b21f4808d763822111e67d1c3a32b524a1baf947b6e1/platformdirs-4.9.6-py3-none-any.whl", hash = "sha256:e61adb1d5e5cb3441b4b7710bea7e4c12250ca49439228cc1021c00dcfac0917", size = 21348, upload-time = "2026-04-09T00:04:09.463Z" }, +] + [[package]] name = "pluggy" version = "1.6.0" @@ -910,6 +1309,73 @@ 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 = "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 = "psutil" +version = "7.2.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/aa/c6/d1ddf4abb55e93cebc4f2ed8b5d6dbad109ecb8d63748dd2b20ab5e57ebe/psutil-7.2.2.tar.gz", hash = "sha256:0746f5f8d406af344fd547f1c8daa5f5c33dbc293bb8d6a16d80b4bb88f59372", size = 493740, upload-time = "2026-01-28T18:14:54.428Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/51/08/510cbdb69c25a96f4ae523f733cdc963ae654904e8db864c07585ef99875/psutil-7.2.2-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:2edccc433cbfa046b980b0df0171cd25bcaeb3a68fe9022db0979e7aa74a826b", size = 130595, upload-time = "2026-01-28T18:14:57.293Z" }, + { url = "https://files.pythonhosted.org/packages/d6/f5/97baea3fe7a5a9af7436301f85490905379b1c6f2dd51fe3ecf24b4c5fbf/psutil-7.2.2-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:e78c8603dcd9a04c7364f1a3e670cea95d51ee865e4efb3556a3a63adef958ea", size = 131082, upload-time = "2026-01-28T18:14:59.732Z" }, + { url = "https://files.pythonhosted.org/packages/37/d6/246513fbf9fa174af531f28412297dd05241d97a75911ac8febefa1a53c6/psutil-7.2.2-cp313-cp313t-manylinux2010_x86_64.manylinux_2_12_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:1a571f2330c966c62aeda00dd24620425d4b0cc86881c89861fbc04549e5dc63", size = 181476, upload-time = "2026-01-28T18:15:01.884Z" }, + { url = "https://files.pythonhosted.org/packages/b8/b5/9182c9af3836cca61696dabe4fd1304e17bc56cb62f17439e1154f225dd3/psutil-7.2.2-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:917e891983ca3c1887b4ef36447b1e0873e70c933afc831c6b6da078ba474312", size = 184062, upload-time = "2026-01-28T18:15:04.436Z" }, + { url = "https://files.pythonhosted.org/packages/16/ba/0756dca669f5a9300d0cbcbfae9a4c30e446dfc7440ffe43ded5724bfd93/psutil-7.2.2-cp313-cp313t-win_amd64.whl", hash = "sha256:ab486563df44c17f5173621c7b198955bd6b613fb87c71c161f827d3fb149a9b", size = 139893, upload-time = "2026-01-28T18:15:06.378Z" }, + { url = "https://files.pythonhosted.org/packages/1c/61/8fa0e26f33623b49949346de05ec1ddaad02ed8ba64af45f40a147dbfa97/psutil-7.2.2-cp313-cp313t-win_arm64.whl", hash = "sha256:ae0aefdd8796a7737eccea863f80f81e468a1e4cf14d926bd9b6f5f2d5f90ca9", size = 135589, upload-time = "2026-01-28T18:15:08.03Z" }, + { url = "https://files.pythonhosted.org/packages/81/69/ef179ab5ca24f32acc1dac0c247fd6a13b501fd5534dbae0e05a1c48b66d/psutil-7.2.2-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:eed63d3b4d62449571547b60578c5b2c4bcccc5387148db46e0c2313dad0ee00", size = 130664, upload-time = "2026-01-28T18:15:09.469Z" }, + { url = "https://files.pythonhosted.org/packages/7b/64/665248b557a236d3fa9efc378d60d95ef56dd0a490c2cd37dafc7660d4a9/psutil-7.2.2-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:7b6d09433a10592ce39b13d7be5a54fbac1d1228ed29abc880fb23df7cb694c9", size = 131087, upload-time = "2026-01-28T18:15:11.724Z" }, + { url = "https://files.pythonhosted.org/packages/d5/2e/e6782744700d6759ebce3043dcfa661fb61e2fb752b91cdeae9af12c2178/psutil-7.2.2-cp314-cp314t-manylinux2010_x86_64.manylinux_2_12_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:1fa4ecf83bcdf6e6c8f4449aff98eefb5d0604bf88cb883d7da3d8d2d909546a", size = 182383, upload-time = "2026-01-28T18:15:13.445Z" }, + { url = "https://files.pythonhosted.org/packages/57/49/0a41cefd10cb7505cdc04dab3eacf24c0c2cb158a998b8c7b1d27ee2c1f5/psutil-7.2.2-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:e452c464a02e7dc7822a05d25db4cde564444a67e58539a00f929c51eddda0cf", size = 185210, upload-time = "2026-01-28T18:15:16.002Z" }, + { url = "https://files.pythonhosted.org/packages/dd/2c/ff9bfb544f283ba5f83ba725a3c5fec6d6b10b8f27ac1dc641c473dc390d/psutil-7.2.2-cp314-cp314t-win_amd64.whl", hash = "sha256:c7663d4e37f13e884d13994247449e9f8f574bc4655d509c3b95e9ec9e2b9dc1", size = 141228, upload-time = "2026-01-28T18:15:18.385Z" }, + { url = "https://files.pythonhosted.org/packages/f2/fc/f8d9c31db14fcec13748d373e668bc3bed94d9077dbc17fb0eebc073233c/psutil-7.2.2-cp314-cp314t-win_arm64.whl", hash = "sha256:11fe5a4f613759764e79c65cf11ebdf26e33d6dd34336f8a337aa2996d71c841", size = 136284, upload-time = "2026-01-28T18:15:19.912Z" }, + { url = "https://files.pythonhosted.org/packages/e7/36/5ee6e05c9bd427237b11b3937ad82bb8ad2752d72c6969314590dd0c2f6e/psutil-7.2.2-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:ed0cace939114f62738d808fdcecd4c869222507e266e574799e9c0faa17d486", size = 129090, upload-time = "2026-01-28T18:15:22.168Z" }, + { url = "https://files.pythonhosted.org/packages/80/c4/f5af4c1ca8c1eeb2e92ccca14ce8effdeec651d5ab6053c589b074eda6e1/psutil-7.2.2-cp36-abi3-macosx_11_0_arm64.whl", hash = "sha256:1a7b04c10f32cc88ab39cbf606e117fd74721c831c98a27dc04578deb0c16979", size = 129859, upload-time = "2026-01-28T18:15:23.795Z" }, + { url = "https://files.pythonhosted.org/packages/b5/70/5d8df3b09e25bce090399cf48e452d25c935ab72dad19406c77f4e828045/psutil-7.2.2-cp36-abi3-manylinux2010_x86_64.manylinux_2_12_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:076a2d2f923fd4821644f5ba89f059523da90dc9014e85f8e45a5774ca5bc6f9", size = 155560, upload-time = "2026-01-28T18:15:25.976Z" }, + { url = "https://files.pythonhosted.org/packages/63/65/37648c0c158dc222aba51c089eb3bdfa238e621674dc42d48706e639204f/psutil-7.2.2-cp36-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b0726cecd84f9474419d67252add4ac0cd9811b04d61123054b9fb6f57df6e9e", size = 156997, upload-time = "2026-01-28T18:15:27.794Z" }, + { url = "https://files.pythonhosted.org/packages/8e/13/125093eadae863ce03c6ffdbae9929430d116a246ef69866dad94da3bfbc/psutil-7.2.2-cp36-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:fd04ef36b4a6d599bbdb225dd1d3f51e00105f6d48a28f006da7f9822f2606d8", size = 148972, upload-time = "2026-01-28T18:15:29.342Z" }, + { url = "https://files.pythonhosted.org/packages/04/78/0acd37ca84ce3ddffaa92ef0f571e073faa6d8ff1f0559ab1272188ea2be/psutil-7.2.2-cp36-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:b58fabe35e80b264a4e3bb23e6b96f9e45a3df7fb7eed419ac0e5947c61e47cc", size = 148266, upload-time = "2026-01-28T18:15:31.597Z" }, + { url = "https://files.pythonhosted.org/packages/b4/90/e2159492b5426be0c1fef7acba807a03511f97c5f86b3caeda6ad92351a7/psutil-7.2.2-cp37-abi3-win_amd64.whl", hash = "sha256:eb7e81434c8d223ec4a219b5fc1c47d0417b12be7ea866e24fb5ad6e84b3d988", size = 137737, upload-time = "2026-01-28T18:15:33.849Z" }, + { url = "https://files.pythonhosted.org/packages/8c/c7/7bb2e321574b10df20cbde462a94e2b71d05f9bbda251ef27d104668306a/psutil-7.2.2-cp37-abi3-win_arm64.whl", hash = "sha256:8c233660f575a5a89e6d4cb65d9f938126312bca76d8fe087b947b3a1aaac9ee", size = 134617, upload-time = "2026-01-28T18:15:36.514Z" }, +] + +[[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 = "3.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/1b/7d/92392ff7815c21062bea51aa7b87d45576f649f16458d78b7cf94b9ab2e6/pycparser-3.0.tar.gz", hash = "sha256:600f49d217304a5902ac3c37e1281c9fe94e4d0489de643a9504c5cdfdfc6b29", size = 103492, upload-time = "2026-01-21T14:26:51.89Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/0c/c3/44f3fbbfa403ea2a7c779186dc20772604442dde72947e7d01069cbe98e3/pycparser-3.0-py3-none-any.whl", hash = "sha256:b727414169a36b7d524c1c3e31839a521725078d7b2ff038656844266160a992", size = 48172, upload-time = "2026-01-21T14:26:50.693Z" }, +] + [[package]] name = "pyerfa" version = "2.0.1.5" @@ -1055,6 +1521,78 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/f1/12/de94a39c2ef588c7e6455cfbe7343d3b2dc9d6b6b2f40c4c6565744c873d/pyyaml-6.0.3-cp314-cp314t-win_arm64.whl", hash = "sha256:ebc55a14a21cb14062aa4162f906cd962b28e2e9ea38f9b4391244cd8de4ae0b", size = 149341, upload-time = "2025-09-25T21:32:56.828Z" }, ] +[[package]] +name = "pyzmq" +version = "27.1.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "cffi", marker = "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/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/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" }, +] + +[[package]] +name = "referencing" +version = "0.37.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "attrs" }, + { name = "rpds-py" }, + { name = "typing-extensions", marker = "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.34.2" @@ -1079,6 +1617,114 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/04/54/6f679c435d28e0a568d8e8a7c0a93a09010818634c3c3907fc98d8983770/roman_numerals-4.1.0-py3-none-any.whl", hash = "sha256:647ba99caddc2cc1e55a51e4360689115551bf4476d90e8162cf8c345fe233c7", size = 7676, upload-time = "2025-12-17T18:25:33.098Z" }, ] +[[package]] +name = "rpds-py" +version = "0.30.0" +source = { registry = "https://pypi.org/simple" } +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/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 = "ruff" version = "0.14.5" @@ -1199,6 +1845,8 @@ dependencies = [ [package.dev-dependencies] dev = [ + { name = "ipython" }, + { name = "nbsphinx" }, { name = "pytest" }, { name = "pytest-cov" }, { name = "pytest-mock" }, @@ -1218,6 +1866,8 @@ requires-dist = [ [package.metadata.requires-dev] dev = [ + { name = "ipython", specifier = ">=9.13.0" }, + { name = "nbsphinx", specifier = ">=0.9.8" }, { name = "pytest", specifier = ">=9.0.1" }, { name = "pytest-cov", specifier = ">=7.1.0" }, { name = "pytest-mock", specifier = ">=3.15.1" }, @@ -1234,6 +1884,15 @@ 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.8.3" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/7b/ae/2d9c981590ed9999a0d91755b47fc74f74de286b0f5cee14c9269041e6c4/soupsieve-2.8.3.tar.gz", hash = "sha256:3267f1eeea4251fb42728b6dfb746edc9acaffc4a45b27e19450b676586e8349", size = 118627, upload-time = "2026-01-20T04:27:02.457Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/46/2c/1462b1d0a634697ae9e55b3cecdcb64788e8b7d63f54d923fcd0bb140aed/soupsieve-2.8.3-py3-none-any.whl", hash = "sha256:ed64f2ba4eebeab06cc4962affce381647455978ffc1e36bb79a545b91f45a95", size = 37016, upload-time = "2026-01-20T04:27:01.012Z" }, +] + [[package]] name = "sphinx" version = "9.0.4" @@ -1350,6 +2009,32 @@ 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 = "tinycss2" +version = "1.4.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "webencodings" }, +] +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.4.1" @@ -1404,6 +2089,41 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/7b/61/cceae43728b7de99d9b847560c262873a1f6c98202171fd5ed62640b494b/tomli-2.4.1-py3-none-any.whl", hash = "sha256:0d85819802132122da43cb86656f8d1f8c6587d54ae7dcaf30e90533028b49fe", size = 14583, upload-time = "2026-03-25T20:22:03.012Z" }, ] +[[package]] +name = "tornado" +version = "6.5.5" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/f8/f1/3173dfa4a18db4a9b03e5d55325559dab51ee653763bb8745a75af491286/tornado-6.5.5.tar.gz", hash = "sha256:192b8f3ea91bd7f1f50c06955416ed76c6b72f96779b962f07f911b91e8d30e9", size = 516006, upload-time = "2026-03-10T21:31:02.067Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/59/8c/77f5097695f4dd8255ecbd08b2a1ed8ba8b953d337804dd7080f199e12bf/tornado-6.5.5-cp39-abi3-macosx_10_9_universal2.whl", hash = "sha256:487dc9cc380e29f58c7ab88f9e27cdeef04b2140862e5076a66fb6bb68bb1bfa", size = 445983, upload-time = "2026-03-10T21:30:44.28Z" }, + { url = "https://files.pythonhosted.org/packages/ab/5e/7625b76cd10f98f1516c36ce0346de62061156352353ef2da44e5c21523c/tornado-6.5.5-cp39-abi3-macosx_10_9_x86_64.whl", hash = "sha256:65a7f1d46d4bb41df1ac99f5fcb685fb25c7e61613742d5108b010975a9a6521", size = 444246, upload-time = "2026-03-10T21:30:46.571Z" }, + { url = "https://files.pythonhosted.org/packages/b2/04/7b5705d5b3c0fab088f434f9c83edac1573830ca49ccf29fb83bf7178eec/tornado-6.5.5-cp39-abi3-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:e74c92e8e65086b338fd56333fb9a68b9f6f2fe7ad532645a290a464bcf46be5", size = 447229, upload-time = "2026-03-10T21:30:48.273Z" }, + { url = "https://files.pythonhosted.org/packages/34/01/74e034a30ef59afb4097ef8659515e96a39d910b712a89af76f5e4e1f93c/tornado-6.5.5-cp39-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:435319e9e340276428bbdb4e7fa732c2d399386d1de5686cb331ec8eee754f07", size = 448192, upload-time = "2026-03-10T21:30:51.22Z" }, + { url = "https://files.pythonhosted.org/packages/be/00/fe9e02c5a96429fce1a1d15a517f5d8444f9c412e0bb9eadfbe3b0fc55bf/tornado-6.5.5-cp39-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:3f54aa540bdbfee7b9eb268ead60e7d199de5021facd276819c193c0fb28ea4e", size = 448039, upload-time = "2026-03-10T21:30:53.52Z" }, + { url = "https://files.pythonhosted.org/packages/82/9e/656ee4cec0398b1d18d0f1eb6372c41c6b889722641d84948351ae19556d/tornado-6.5.5-cp39-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:36abed1754faeb80fbd6e64db2758091e1320f6bba74a4cf8c09cd18ccce8aca", size = 447445, upload-time = "2026-03-10T21:30:55.541Z" }, + { url = "https://files.pythonhosted.org/packages/5a/76/4921c00511f88af86a33de770d64141170f1cfd9c00311aea689949e274e/tornado-6.5.5-cp39-abi3-win32.whl", hash = "sha256:dd3eafaaeec1c7f2f8fdcd5f964e8907ad788fe8a5a32c4426fbbdda621223b7", size = 448582, upload-time = "2026-03-10T21:30:57.142Z" }, + { url = "https://files.pythonhosted.org/packages/2c/23/f6c6112a04d28eed765e374435fb1a9198f73e1ec4b4024184f21faeb1ad/tornado-6.5.5-cp39-abi3-win_amd64.whl", hash = "sha256:6443a794ba961a9f619b1ae926a2e900ac20c34483eea67be4ed8f1e58d3ef7b", size = 448990, upload-time = "2026-03-10T21:30:58.857Z" }, + { url = "https://files.pythonhosted.org/packages/b7/c8/876602cbc96469911f0939f703453c1157b0c826ecb05bdd32e023397d4e/tornado-6.5.5-cp39-abi3-win_arm64.whl", hash = "sha256:2c9a876e094109333f888539ddb2de4361743e5d21eece20688e3e351e4990a6", size = 448016, upload-time = "2026-03-10T21:31:00.43Z" }, +] + +[[package]] +name = "traitlets" +version = "5.15.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/1b/22/40f55b26baeab80c2d7b3f1db0682f8954e4617fee7d90ce634022ef05c6/traitlets-5.15.0.tar.gz", hash = "sha256:4fead733f81cf1c4c938e06f8ca4633896833c9d89eff878159457f4d4392971", size = 163197, upload-time = "2026-05-06T08:05:58.016Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/da/98/a9937a969d018a23badfea0b381f66783649d48e0ea6c41923265c3cbeb3/traitlets-5.15.0-py3-none-any.whl", hash = "sha256:fb36a18867a6803deab09f3c5e0fa81bb7b26a5c9e82501c9933f759166eff40", size = 85877, upload-time = "2026-05-06T08:05:55.853Z" }, +] + +[[package]] +name = "typing-extensions" +version = "4.15.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/72/94/1a15dd82efb362ac84269196e94cf00f187f7ed21c242792a923cdb1c61f/typing_extensions-4.15.0.tar.gz", hash = "sha256:0cea48d173cc12fa28ecabc3b837ea3cf6f38c6d1136f85cbaaf598984861466", size = 109391, upload-time = "2025-08-25T13:49:26.313Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/18/67/36e9267722cc04a6b9f15c7f3441c2363321a3ea07da7ae0c0707beb2a9c/typing_extensions-4.15.0-py3-none-any.whl", hash = "sha256:f0fa19c6845758ab08074a0cfa8b7aecb71c999ca73d62883bc25cc018c4e548", size = 44614, upload-time = "2025-08-25T13:49:24.86Z" }, +] + [[package]] name = "urllib3" version = "2.7.0" @@ -1412,3 +2132,21 @@ sdist = { url = "https://files.pythonhosted.org/packages/53/0c/06f8b233b8fd13b9e wheels = [ { url = "https://files.pythonhosted.org/packages/7f/3e/5db95bcf282c52709639744ca2a8b149baccf648e39c8cc87553df9eae0c/urllib3-2.7.0-py3-none-any.whl", hash = "sha256:9fb4c81ebbb1ce9531cce37674bbc6f1360472bc18ca9a553ede278ef7276897", size = 131087, upload-time = "2026-05-07T16:13:17.151Z" }, ] + +[[package]] +name = "wcwidth" +version = "0.7.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/2c/ee/afaf0f85a9a18fe47a67f1e4422ed6cf1fe642f0ae0a2f81166231303c52/wcwidth-0.7.0.tar.gz", hash = "sha256:90e3a7ea092341c44b99562e75d09e4d5160fe7a3974c6fb842a101a95e7eed0", size = 182132, upload-time = "2026-05-02T16:04:12.653Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/41/52/e465037f5375f43533d1a80b6923955201596a99142ed524d77b571a1418/wcwidth-0.7.0-py3-none-any.whl", hash = "sha256:5d69154c429a82910e241c738cd0e2976fac8a2dd47a1a805f4afed1c0f136f2", size = 110825, upload-time = "2026-05-02T16:04:11.033Z" }, +] + +[[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" }, +] From 4d31fc6636ef8fade161b1ae0bf83f1a9f2b64ae Mon Sep 17 00:00:00 2001 From: Hayden Foote <36173127+hfoote@users.noreply.github.com> Date: Fri, 22 May 2026 20:48:37 -0700 Subject: [PATCH 3/4] Exclude tutorial documentation pages from ruff checks --- pyproject.toml | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/pyproject.toml b/pyproject.toml index e5ed989..5c296df 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -39,4 +39,7 @@ Issues = "https://github.com/hfoote/snapAnalysis/issues" [tool.ruff.lint] select = ["E", "F"] -exclude = ["tutorials/*"] +exclude = [ + "tutorials/*", + "docs/source/tutorials/*, +] From 512b9551043a6f5e8c0e5f691d6a13e6695dc6ef Mon Sep 17 00:00:00 2001 From: Hayden Foote <36173127+hfoote@users.noreply.github.com> Date: Fri, 22 May 2026 20:50:41 -0700 Subject: [PATCH 4/4] Fix a typo --- pyproject.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pyproject.toml b/pyproject.toml index 5c296df..3c3494b 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -41,5 +41,5 @@ Issues = "https://github.com/hfoote/snapAnalysis/issues" select = ["E", "F"] exclude = [ "tutorials/*", - "docs/source/tutorials/*, + "docs/source/tutorials/*", ]