Repository: kraina-ai/srai (language: python)

Issue:
Add OSMLoader based on osmnx / overpass



Discussion / hints:
https://taginfo.openstreetmap.org/api/4/tags/popular?qtype=tag tags list with filter on `in_wiki = 1`
https://github.com/gboeing/osmnx-examples/blob/main/notebooks/16-download-osm-geospatial-entities.ipynb example on downloading objects using osmnx

Fix patch:
diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml
index f088c72e..cc72a029 100644
--- a/.pre-commit-config.yaml
+++ b/.pre-commit-config.yaml
@@ -65,7 +65,7 @@ repos:
     hooks:
       - id: refurb
         language: python
-        language_version: python3.10
+        language_version: python3.11
         stages: [manual]
   - repo: https://github.com/FHPythonUtils/LicenseCheck
     rev: "2023.1.1"
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 7d220614..482405d5 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -5,7 +5,7 @@ All notable changes to this project will be documented in this file.
 The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
 and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
 
-## [Unreleased] - 2022-MM-DD
+## [Unreleased] - 2023-MM-DD
 
 ### Added
 
@@ -14,6 +14,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
 - GTFS2Vec Embedder using gtfs2vec model
 - OSMOnlineLoader
 - OSMPbfLoader
+- OSMWayLoader
 - Neighbourhood
 - H3Neighbourhood
 - AdjacencyNeighbourhood
diff --git a/examples/loaders/README.md b/examples/loaders/README.md
index 975bb162..3b249840 100644
--- a/examples/loaders/README.md
+++ b/examples/loaders/README.md
@@ -6,3 +6,4 @@ Examples illustrating the usage of every Loader.
 - [GTFSLoader](gtfs_loader.ipynb)
 - [OSMOnlineLoader](osm_online_loader.ipynb)
 - [OSMPbfLoader](osm_pbf_loader.ipynb)
+- [OSMWayLoader](osm_way_loader.ipynb)
diff --git a/examples/loaders/geoparquet_loader.ipynb b/examples/loaders/geoparquet_loader.ipynb
index d56fbf5e..415002e9 100644
--- a/examples/loaders/geoparquet_loader.ipynb
+++ b/examples/loaders/geoparquet_loader.ipynb
@@ -97,7 +97,7 @@
  ],
  "metadata": {
   "kernelspec": {
-   "display_name": "Python 3.8.10 ('.venv': venv)",
+   "display_name": "Python 3.8.14 ('.venv': venv)",
    "language": "python",
    "name": "python3"
   },
@@ -111,11 +111,11 @@
    "name": "python",
    "nbconvert_exporter": "python",
    "pygments_lexer": "ipython3",
-   "version": "3.8.10"
+   "version": "3.8.14"
   },
   "vscode": {
    "interpreter": {
-    "hash": "27588098aedc4e0690c9f009d86804b277352852ed19dd471efc5e9817d4b199"
+    "hash": "ff171c218963a21ae796a71e1fcf1df45597c5219c663e3cec1d9a9df6951d9c"
    }
   }
  },
diff --git a/examples/loaders/osm_way_loader.ipynb b/examples/loaders/osm_way_loader.ipynb
new file mode 100644
index 00000000..dfdcce94
--- /dev/null
+++ b/examples/loaders/osm_way_loader.ipynb
@@ -0,0 +1,167 @@
+{
+ "cells": [
+  {
+   "attachments": {},
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "# OSMWayLoader"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "import geopandas as gpd\n",
+    "import osmnx as ox\n",
+    "import pandas as pd\n",
+    "from keplergl import KeplerGl\n",
+    "import shapely.geometry as shpg\n",
+    "\n",
+    "from srai.loaders.osm_way_loader import NetworkType, OSMWayLoader\n",
+    "from srai.constants import WGS84_CRS"
+   ]
+  },
+  {
+   "attachments": {},
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "## Small area"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "polygon1 = shpg.Polygon(\n",
+    "    [\n",
+    "        (17.1005309, 51.1100158),\n",
+    "        (17.1020436, 51.1100427),\n",
+    "        (17.1021938, 51.1082509),\n",
+    "        (17.1006274, 51.1081027),\n",
+    "        (17.1005201, 51.1099956),\n",
+    "    ]\n",
+    ")\n",
+    "polygon2 = shpg.Polygon(\n",
+    "    [\n",
+    "        (17.0994473, 51.1084126),\n",
+    "        (17.1023226, 51.1086551),\n",
+    "        (17.1023333, 51.1076312),\n",
+    "        (17.0994473, 51.1083722),\n",
+    "    ]\n",
+    ")\n",
+    "gdf_place = gpd.GeoDataFrame({\"geometry\": [polygon1, polygon2]}, crs=WGS84_CRS)\n",
+    "gdf_place.plot()"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "osmwl = OSMWayLoader(NetworkType.BIKE)\n",
+    "gdf_nodes, gdf_edges = osmwl.load(gdf_place)\n",
+    "ax = gdf_edges.plot(linewidth=1, figsize=(12, 7))\n",
+    "gdf_nodes.plot(ax=ax, markersize=3, color=\"red\")"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "gdf_nodes"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "gdf_edges"
+   ]
+  },
+  {
+   "attachments": {},
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "## Bigger area"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "gdf_place = ox.geocode_to_gdf(\"Wroclaw, Poland\")\n",
+    "gdf_place.plot()"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "osmwl = OSMWayLoader(NetworkType.DRIVE)\n",
+    "gdf_nodes, gdf_edges = osmwl.load(gdf_place)\n",
+    "ax = gdf_edges.plot(linewidth=1, figsize=(12, 7))\n",
+    "gdf_nodes.plot(ax=ax, markersize=3, color=\"red\")"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "gdf_nodes"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "gdf_edges"
+   ]
+  }
+ ],
+ "metadata": {
+  "kernelspec": {
+   "display_name": "Python 3.8.14 ('.venv': venv)",
+   "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.1"
+  },
+  "vscode": {
+   "interpreter": {
+    "hash": "ff171c218963a21ae796a71e1fcf1df45597c5219c663e3cec1d9a9df6951d9c"
+   }
+  }
+ },
+ "nbformat": 4,
+ "nbformat_minor": 2
+}
diff --git a/pdm.lock b/pdm.lock
index b31ea385..73fdd3b4 100644
--- a/pdm.lock
+++ b/pdm.lock
@@ -1,3 +1,6 @@
+# This file is @generated by PDM.
+# It is not intended for manual editing.
+
 [[package]]
 name = "aiohttp"
 version = "3.8.4"
@@ -103,7 +106,7 @@ summary = "Specifications for callback functions passed in to an API"
 
 [[package]]
 name = "beautifulsoup4"
-version = "4.11.2"
+version = "4.12.0"
 requires_python = ">=3.6.0"
 summary = "Screen-scraping library"
 dependencies = [
@@ -375,7 +378,7 @@ summary = "A platform independent file lock."
 
 [[package]]
 name = "fiona"
-version = "1.9.1"
+version = "1.9.2"
 requires_python = ">=3.7"
 summary = "Fiona reads and writes spatial data files"
 dependencies = [
@@ -384,8 +387,8 @@ dependencies = [
     "click-plugins>=1.0",
     "click~=8.0",
     "cligj>=0.5",
+    "importlib-metadata; python_version < \"3.10\"",
     "munch>=2.3.2",
-    "setuptools",
 ]
 
 [[package]]
@@ -545,7 +548,7 @@ summary = "Internationalized Domain Names in Applications (IDNA)"
 
 [[package]]
 name = "importlib-metadata"
-version = "6.0.0"
+version = "6.1.0"
 requires_python = ">=3.7"
 summary = "Read metadata from Python packages"
 dependencies = [
@@ -569,7 +572,7 @@ summary = "brain-dead simple config-ini parsing"
 
 [[package]]
 name = "ipykernel"
-version = "6.21.3"
+version = "6.22.0"
 requires_python = ">=3.8"
 summary = "IPython Kernel for Jupyter"
 dependencies = [
@@ -615,10 +618,9 @@ summary = "Vestigial utilities from IPython"
 
 [[package]]
 name = "ipywidgets"
-version = "7.7.3"
+version = "7.7.4"
 summary = "IPython HTML widgets for Jupyter"
 dependencies = [
-    "ipykernel>=4.5.1",
     "ipython-genutils~=0.2.0",
     "ipython>=4.0.0; python_version >= \"3.3\"",
     "jupyterlab-widgets<3,>=1.0.0; python_version >= \"3.6\"",
@@ -717,7 +719,7 @@ dependencies = [
 
 [[package]]
 name = "jupyter-client"
-version = "8.0.3"
+version = "8.1.0"
 requires_python = ">=3.8"
 summary = "Jupyter protocol implementation and client libraries"
 dependencies = [
@@ -798,7 +800,7 @@ summary = "Pygments theme using JupyterLab CSS variables"
 
 [[package]]
 name = "jupyterlab-widgets"
-version = "1.1.2"
+version = "1.1.3"
 requires_python = ">=3.6"
 summary = "A JupyterLab extension."
 
@@ -870,7 +872,7 @@ dependencies = [
 
 [[package]]
 name = "lit"
-version = "15.0.7"
+version = "16.0.0"
 summary = "A Software Testing Tool"
 
 [[package]]
@@ -1030,7 +1032,7 @@ dependencies = [
 
 [[package]]
 name = "mkdocs-jupyter"
-version = "0.23.1"
+version = "0.24.0"
 requires_python = ">=3.7"
 summary = "Use Jupyter in mkdocs websites"
 dependencies = [
@@ -1220,7 +1222,7 @@ dependencies = [
 
 [[package]]
 name = "nbformat"
-version = "5.7.3"
+version = "5.8.0"
 requires_python = ">=3.7"
 summary = "The Jupyter Notebook format"
 dependencies = [
@@ -1609,11 +1611,11 @@ dependencies = [
 
 [[package]]
 name = "pyerfa"
-version = "2.0.0.1"
+version = "2.0.0.2"
 requires_python = ">=3.7"
 summary = "Python bindings for ERFA"
 dependencies = [
-    "numpy>=1.17",
+    "numpy>=1.21",
 ]
 
 [[package]]
@@ -1706,6 +1708,15 @@ dependencies = [
     "tomli>=1.0.0; python_version < \"3.11\"",
 ]
 
+[[package]]
+name = "pytest-check"
+version = "2.1.4"
+requires_python = ">3.7"
+summary = "A pytest plugin that allows multiple failures per test."
+dependencies = [
+    "pytest",
+]
+
 [[package]]
 name = "pytest-mock"
 version = "3.10.0"
@@ -1715,6 +1726,16 @@ dependencies = [
     "pytest>=5.0",
 ]
 
+[[package]]
+name = "pytest-parametrization"
+version = "2022.2.1"
+requires_python = ">=2.6, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*"
+summary = "Simpler PyTest parametrization"
+dependencies = [
+    "pytest",
+    "six",
+]
+
 [[package]]
 name = "python-dateutil"
 version = "2.8.2"
@@ -1780,7 +1801,7 @@ dependencies = [
 
 [[package]]
 name = "pyzmq"
-version = "25.0.1"
+version = "25.0.2"
 requires_python = ">=3.6"
 summary = "Python bindings for 0MQ"
 dependencies = [
@@ -2147,7 +2168,7 @@ dependencies = [
 
 [[package]]
 name = "types-setuptools"
-version = "67.6.0.3"
+version = "67.6.0.5"
 summary = "Typing stubs for setuptools"
 
 [[package]]
@@ -2196,8 +2217,8 @@ dependencies = [
 
 [[package]]
 name = "watchdog"
-version = "2.3.1"
-requires_python = ">=3.6"
+version = "3.0.0"
+requires_python = ">=3.7"
 summary = "Filesystem events monitoring"
 
 [[package]]
@@ -2239,7 +2260,7 @@ summary = "A built-package format for Python"
 
 [[package]]
 name = "widgetsnbextension"
-version = "3.6.2"
+version = "3.6.3"
 summary = "IPython HTML widgets for Jupyter"
 dependencies = [
     "notebook>=4.4.1",
@@ -2263,7 +2284,7 @@ summary = "Backport of pathlib-compatible object wrapper for zip files"
 
 [metadata]
 lock_version = "4.1"
-content_hash = "sha256:99c295c599a759eb30a17013697c0d8ed645d53982b5587cce407289406f7e85"
+content_hash = "sha256:d5d6cba59560628c3c3126eae1681e9464e6fe7f21e696b32e03ba3643d3a23f"
 
 [metadata.files]
 "aiohttp 3.8.4" = [
@@ -2447,9 +2468,9 @@ content_hash = "sha256:99c295c599a759eb30a17013697c0d8ed645d53982b5587cce4072894
     {url = "https://files.pythonhosted.org/packages/4c/1c/ff6546b6c12603d8dd1070aa3c3d273ad4c07f5771689a7b69a550e8c951/backcall-0.2.0-py2.py3-none-any.whl", hash = "sha256:fbbce6a29f263178a1f7915c1940bde0ec2b2a967566fe1c65c1dfb7422bd255"},
     {url = "https://files.pythonhosted.org/packages/a2/40/764a663805d84deee23043e1426a9175567db89c8b3287b5c2ad9f71aa93/backcall-0.2.0.tar.gz", hash = "sha256:5cbdbf27be5e7cfadb448baf0aa95508f91f2bbc6c6437cd9cd06e2a4c215e1e"},
 ]
-"beautifulsoup4 4.11.2" = [
-    {url = "https://files.pythonhosted.org/packages/75/f8/de84282681c5a8307f3fff67b64641627b2652752d49d9222b77400d02b8/beautifulsoup4-4.11.2.tar.gz", hash = "sha256:bc4bdda6717de5a2987436fb8d72f45dc90dd856bdfd512a1314ce90349a0106"},
-    {url = "https://files.pythonhosted.org/packages/c6/ee/16d6f808f5668317d7c23f942091fbc694bcded6aa39678e5167f61b2ba0/beautifulsoup4-4.11.2-py3-none-any.whl", hash = "sha256:0e79446b10b3ecb499c1556f7e228a53e64a2bfcebd455f370d8927cb5b59e39"},
+"beautifulsoup4 4.12.0" = [
+    {url = "https://files.pythonhosted.org/packages/c5/4c/b5b7d6e1d4406973fb7f4e5df81c6f07890fa82548ac3b945deed1df9d48/beautifulsoup4-4.12.0.tar.gz", hash = "sha256:c5fceeaec29d09c84970e47c65f2f0efe57872f7cff494c9691a26ec0ff13234"},
+    {url = "https://files.pythonhosted.org/packages/ee/a7/06b189a2e280e351adcef25df532af3c59442123187e228b960ab3238687/beautifulsoup4-4.12.0-py3-none-any.whl", hash = "sha256:2130a5ad7f513200fae61a17abb5e338ca980fa28c439c0571014bc0217e9591"},
 ]
 "black 23.1.0" = [
     {url = "https://files.pythonhosted.org/packages/01/8a/065d0a59c1ebe13186b12a2fa3965a41fc1588828709995e2630004d216e/black-23.1.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8178318cb74f98bc571eef19068f6ab5613b3e59d4f47771582f04e175570ed8"},
@@ -2751,27 +2772,23 @@ content_hash = "sha256:99c295c599a759eb30a17013697c0d8ed645d53982b5587cce4072894
     {url = "https://files.pythonhosted.org/packages/4f/1f/6e1b740698069650b245744957a25957d599b953550a959ab2a584a8825b/filelock-3.10.0.tar.gz", hash = "sha256:3199fd0d3faea8b911be52b663dfccceb84c95949dd13179aa21436d1a79c4ce"},
     {url = "https://files.pythonhosted.org/packages/9a/eb/95844b279593fd79c0a4d5eadad029203528509bccb0efe117543e1a1704/filelock-3.10.0-py3-none-any.whl", hash = "sha256:e90b34656470756edf8b19656785c5fea73afa1953f3e1b0d645cef11cab3182"},
 ]
-"fiona 1.9.1" = [
-    {url = "https://files.pythonhosted.org/packages/02/9c/6f8bdaecec1f23c21b8f2a1902f3c7f2cb4f8d4d02741e278dc12761f91d/Fiona-1.9.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c3d7f3286fb59b93cefefb89014b6fa8413126e180e15c576db859ba936cf334"},
-    {url = "https://files.pythonhosted.org/packages/07/c5/c19be72c0cbc2536e4d9468ca17b50e2503aa3fea7c847a0b2a0b400d912/Fiona-1.9.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d7e0f36484757baa8cd1c0602941e029ff992282776f9afae4c5b90f501ff005"},
-    {url = "https://files.pythonhosted.org/packages/0e/36/da9b2ac9abbec6f923a598b94c23bc232bbd073056f43eb440e2883d84cd/Fiona-1.9.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:585a47ec21f2d198abc112158eaf12a6587a272beb7f001162d8c3b262676666"},
-    {url = "https://files.pythonhosted.org/packages/26/16/d7597866ef26c8729ccacb1b854d682adb2f9d980ee716e5068298a41083/Fiona-1.9.1-cp38-cp38-win_amd64.whl", hash = "sha256:839ed0db23198bb754f0d655d4eeaf5f9c141bef734557e77e95e4dc83e42e7f"},
-    {url = "https://files.pythonhosted.org/packages/2f/b9/59fa3d5a777722c599435c4414f83ed4b06c86914843bcd7bdc30ec5b253/Fiona-1.9.1-cp37-cp37m-macosx_10_15_x86_64.whl", hash = "sha256:74f056a84dc52a0b21a2cf024601a69105596f06f28d40b45049948be17b4df2"},
-    {url = "https://files.pythonhosted.org/packages/3b/0c/44f37a6a49d2ad903a1c59d545874cfe7bd7c795ce63441a56b6df879a06/Fiona-1.9.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:cb827fa0030d03d8080723137c74b865ec18dbade87c02ed60215491a315c6be"},
-    {url = "https://files.pythonhosted.org/packages/41/f6/1e8688a3943a7008605f7b0bb009e75113a618c3ae1a822aea1ec59a855b/Fiona-1.9.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5dbb0ae851cd4417104c469335a01f938251a8639317f93d422c5c808150bd27"},
-    {url = "https://files.pythonhosted.org/packages/48/98/484bee305bee83851826a154907e92639896d9290beeaf73c3c239881afd/Fiona-1.9.1-cp311-cp311-win_amd64.whl", hash = "sha256:4a6d8fcbbdafa8af8ac1904628b0267382ed9f9921933d061d7bfc5d3f3daf99"},
-    {url = "https://files.pythonhosted.org/packages/52/9b/f3e71d6239927f398585afa7408aa32666a2d2fadb21f78ee5e70e4ed980/Fiona-1.9.1-cp37-cp37m-win_amd64.whl", hash = "sha256:5d6183189a7e05e2498d38a1df3ab07e1353fa48e977cbc3a31203927bd06bca"},
-    {url = "https://files.pythonhosted.org/packages/5b/46/48793992ebc43a13e1ea814a56f60eb02cb46c231baebb3d09a46d035e7f/Fiona-1.9.1-cp39-cp39-win_amd64.whl", hash = "sha256:f98933b552adf0506799097934a6950de412288e7a50466144d04874d6f63fbc"},
-    {url = "https://files.pythonhosted.org/packages/62/c4/05f25e319e1bffacaf521bf366c31b01acda7d1acf251d3e4f1f0d0270d3/Fiona-1.9.1.tar.gz", hash = "sha256:3a3725e94840a387fef48726d60db6a6791563f366939d22378a4661f8941be7"},
-    {url = "https://files.pythonhosted.org/packages/64/8a/f48a84cdd9170dbfb2d554ea86efff6b046a415add0382a4523595e1dcec/Fiona-1.9.1-cp39-cp39-macosx_10_15_x86_64.whl", hash = "sha256:decca3956032ae2d2c19d2f7fa8a4553c43a6e66eb5abe9a05f6ddadcb1bfe5c"},
-    {url = "https://files.pythonhosted.org/packages/73/64/7549348f1bf9bd03fcc737ef480fa86f4b29720f76fe228032a976220e35/Fiona-1.9.1-cp310-cp310-macosx_10_15_x86_64.whl", hash = "sha256:902b67b2d012c5797b5d7d3cb3b46dcf9a342cf90a7f7e53fb12c83738d19926"},
-    {url = "https://files.pythonhosted.org/packages/a3/1a/ec17cdb2815c0689477cc31a403016668ed0b699266991d58c5b3213a5e6/Fiona-1.9.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:c3b52d49bc379fdcfd1250b38e7e00ab24ee14eb765376c793bbe251ffd09d6a"},
-    {url = "https://files.pythonhosted.org/packages/ae/81/841feaed866aec09b7fa722c8d7b504cf29cc42ee9deffa92b5389f2d99a/Fiona-1.9.1-cp38-cp38-macosx_10_15_x86_64.whl", hash = "sha256:5f2c14beec98a330aee1fd81fa0447a6aa1d5e0a75d000c0052dbe1f23dd6cfd"},
-    {url = "https://files.pythonhosted.org/packages/b8/98/a7c8fb94c2a7564669e9b6a3878c3f16835321a93e7c9067b7ecab69efdc/Fiona-1.9.1-cp37-cp37m-manylinux2014_x86_64.whl", hash = "sha256:5b9f3f6c782bb4ae2c924eefd373cabdeaaa99f86477b9c7c71eb20c052ee7c5"},
-    {url = "https://files.pythonhosted.org/packages/c9/a7/6e0617de244b9f70e76d311b7fe622bc554e0cbd2a5cf5b31a6d403fc4b7/Fiona-1.9.1-cp310-cp310-win_amd64.whl", hash = "sha256:692fe64c0f3a39742d6f7a8e420a8387f6aec3b6818b727d2dfc98a0c40e992d"},
-    {url = "https://files.pythonhosted.org/packages/d3/0b/60d658e9c0da0beccbeabcb3d3b95f2e0a6af4bda10f4b20848c125a1aeb/Fiona-1.9.1-cp311-cp311-macosx_10_15_x86_64.whl", hash = "sha256:a017a39650df0cc541c57cf7de450bb4cee6fd9760eb716323b594c1074634a2"},
-    {url = "https://files.pythonhosted.org/packages/f5/8a/f7de30ee122a7a078bc773b406d75891e5d25bb18622047906b6738482a6/Fiona-1.9.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:e2f4535ae2c8446e6b328745a44567478d5a077ed63c888b8c212dddb1e11925"},
-    {url = "https://files.pythonhosted.org/packages/fa/03/9d6c0b5df4f6ebf9071930cf0ecc809b8ba628a34a118f0fe948a67d0154/Fiona-1.9.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dd4368b4054f21518a19dea54ce9ac445c40418c6331c0c99d1531c3ddff05da"},
+"fiona 1.9.2" = [
+    {url = "https://files.pythonhosted.org/packages/0a/56/19021df73e7d672ba6ae80be8ae9bd629b0e2faa3c48b3f5a8d94e27a797/Fiona-1.9.2-cp38-cp38-win_amd64.whl", hash = "sha256:11174b13abce333929fb609e1f5c4872226398d4e4fb1bfc866ed6a11035a13d"},
+    {url = "https://files.pythonhosted.org/packages/2b/d6/d831832fdd00c99e6c1a88d0eba816ee7091ee0f1bf194745cf2611bdb6e/Fiona-1.9.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2eb7ac43c4e6633d6262cd3d6b46db3fc925de872626b10e162bbefe7fa7157e"},
+    {url = "https://files.pythonhosted.org/packages/32/19/01e35b995271357b3d9d3df7a75aaf9d2b9c30783000cd8078712d49d6db/Fiona-1.9.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:348e2241360863b2e9c476c1444ecc499a9f8a1d499f28568bd4f1e5fd533d1f"},
+    {url = "https://files.pythonhosted.org/packages/33/87/b8851b75858552f0fb21c6318375c3bfb1f7a3ed5887a259e5617b6f6f14/Fiona-1.9.2-cp38-cp38-macosx_10_15_x86_64.whl", hash = "sha256:07c9144c1056d38bfef6b071d9cb25b1ec1c3f40facc55738574ea3f704bbfec"},
+    {url = "https://files.pythonhosted.org/packages/3d/64/ec376c3be69b88203a67e74223971631f02cbe24f38fb06d406ddc89b1c1/Fiona-1.9.2-cp39-cp39-macosx_10_15_x86_64.whl", hash = "sha256:656373f74d10300f472321b0bd96bc0be553bf64bd409b420a2ca02e4fc616f8"},
+    {url = "https://files.pythonhosted.org/packages/3e/7c/dded70df498dbca9aeb826efb82ea62e8b63fe2b641cbb83024bacaa1f96/Fiona-1.9.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2effb6a21ad3ecc4d3c8e39208cf443f3fe42300492226057f2eaccf827bc3b2"},
+    {url = "https://files.pythonhosted.org/packages/5d/91/c99b4adf078c31ad9cfd930ba9f2203d84bb1bc7b83bfb2411df70dc9803/Fiona-1.9.2-cp39-cp39-win_amd64.whl", hash = "sha256:6e4bae3ca74c225d5ab8c99e5c76b55def0132b62bf2447c67a14025de428115"},
+    {url = "https://files.pythonhosted.org/packages/64/c7/d810c57c10718577518db9b15f4d0b6c6cc6674208255f30cb6a6663c38f/Fiona-1.9.2-cp310-cp310-macosx_10_15_x86_64.whl", hash = "sha256:c14a39d6a57eaa50cbf6553e7e464960d9dc7773cf4058409a53cc26034ad947"},
+    {url = "https://files.pythonhosted.org/packages/7c/5e/115d0abb42d4072a66cf725d15f7037d4a9d3798a6fe2d64ef3a8a86f2e1/Fiona-1.9.2-cp37-cp37m-manylinux2014_x86_64.whl", hash = "sha256:5630e29cf25a4381f54a1060df0368d63da833d14fabc5ce4a3650138ba519a5"},
+    {url = "https://files.pythonhosted.org/packages/81/b7/32070d2b40a93bb67b7fbe2c72339f8a44c9e8fbbef3500e244391383bb7/Fiona-1.9.2-cp310-cp310-win_amd64.whl", hash = "sha256:d2ba52ac172193d452cfcecd71fa69212056eb7e5747174d28838c9b95ba47c3"},
+    {url = "https://files.pythonhosted.org/packages/84/46/e4df3132a27f4f85c3fda3ca559547041eee9cdf3c4a06ba2e62e9cb8c0d/Fiona-1.9.2-cp311-cp311-macosx_10_15_x86_64.whl", hash = "sha256:6a7f8830659532b3900ea202b8bb82043c4305fc61f78ffc4ffccd86c079472f"},
+    {url = "https://files.pythonhosted.org/packages/86/8d/36720cf218deb751cbe4c0d77efa0708b32f4ec20cee81f5d8f31209fc48/Fiona-1.9.2-cp37-cp37m-win_amd64.whl", hash = "sha256:8b80d739447e9408abb1abadf198decab01baf266e163705b93bd51f5172be8d"},
+    {url = "https://files.pythonhosted.org/packages/88/f4/25e5a9e5b7d7916dc446d12187ea642a2f6e0501ae5b0405e0f951df483e/Fiona-1.9.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:16576ca4f21f21c19c4306c2ebb503db408eae4e6690972b62acb897ceab0a8d"},
+    {url = "https://files.pythonhosted.org/packages/a6/b4/8280b1dc26f00588cd5d82878f239d6c4bff196e0419d9e63de7f470d045/Fiona-1.9.2-cp37-cp37m-macosx_10_15_x86_64.whl", hash = "sha256:72f332c394e63b70800a04b92e9eb6daafaee4f5f467f8f4b4780aa249da3c37"},
+    {url = "https://files.pythonhosted.org/packages/c3/87/1a3ace1c7d3a0f44feaed4cda678df03209bc07c35c6fe9cf5a7916286f6/Fiona-1.9.2-cp311-cp311-win_amd64.whl", hash = "sha256:509b3bd7e38a041f5ad9dd25f4ecf2ea6d736879b8abb54d987a00138beeb7a1"},
+    {url = "https://files.pythonhosted.org/packages/f1/57/61443cf8b58022cb117c26d8a25c8a1435b24de9dac5d7f848b94a2c584a/Fiona-1.9.2.tar.gz", hash = "sha256:f9263c5f97206bf2eb2c010d52e8ffc54e96886b0e698badde25ff109b32952a"},
 ]
 "flake8 5.0.4" = [
     {url = "https://files.pythonhosted.org/packages/ad/00/9808c62b2d529cefc69ce4e4a1ea42c0f855effa55817b7327ec5b75e60a/flake8-5.0.4.tar.gz", hash = "sha256:6fbe320aad8d6b95cec8b8e47bc933004678dc63095be98528b7bdd2a9f510db"},
@@ -2952,9 +2969,9 @@ content_hash = "sha256:99c295c599a759eb30a17013697c0d8ed645d53982b5587cce4072894
     {url = "https://files.pythonhosted.org/packages/8b/e1/43beb3d38dba6cb420cefa297822eac205a277ab43e5ba5d5c46faf96438/idna-3.4.tar.gz", hash = "sha256:814f528e8dead7d329833b91c5faa87d60bf71824cd12a7530b5526063d02cb4"},
     {url = "https://files.pythonhosted.org/packages/fc/34/3030de6f1370931b9dbb4dad48f6ab1015ab1d32447850b9fc94e60097be/idna-3.4-py3-none-any.whl", hash = "sha256:90b77e79eaa3eba6de819a0c442c0b4ceefc341a7a2ab77d7562bf49f425c5c2"},
 ]
-"importlib-metadata 6.0.0" = [
-    {url = "https://files.pythonhosted.org/packages/26/a7/9da7d5b23fc98ab3d424ac2c65613d63c1f401efb84ad50f2fa27b2caab4/importlib_metadata-6.0.0-py3-none-any.whl", hash = "sha256:7efb448ec9a5e313a57655d35aa54cd3e01b7e1fbcf72dce1bf06119420f5bad"},
-    {url = "https://files.pythonhosted.org/packages/90/07/6397ad02d31bddf1841c9ad3ec30a693a3ff208e09c2ef45c9a8a5f85156/importlib_metadata-6.0.0.tar.gz", hash = "sha256:e354bedeb60efa6affdcc8ae121b73544a7aa74156d047311948f6d711cd378d"},
+"importlib-metadata 6.1.0" = [
+    {url = "https://files.pythonhosted.org/packages/e2/d8/3d431bade4598ad9e33be9da41d15e6607b878008e922d122659ab01b077/importlib_metadata-6.1.0.tar.gz", hash = "sha256:43ce9281e097583d758c2c708c4376371261a02c34682491a8e98352365aad20"},
+    {url = "https://files.pythonhosted.org/packages/f8/7d/e3adad613703c86d62aa991b45d6f090cf59975078a8c8100b50a0c86948/importlib_metadata-6.1.0-py3-none-any.whl", hash = "sha256:ff80f3b5394912eb1b108fcfd444dc78b7f1f3e16b16188054bd01cb9cb86f09"},
 ]
 "importlib-resources 5.12.0" = [
     {url = "https://files.pythonhosted.org/packages/38/71/c13ea695a4393639830bf96baea956538ba7a9d06fcce7cef10bfff20f72/importlib_resources-5.12.0-py3-none-any.whl", hash = "sha256:7b1deeebbf351c7578e09bf2f63fa2ce8b5ffec296e0d349139d43cca061a81a"},
@@ -2964,9 +2981,9 @@ content_hash = "sha256:99c295c599a759eb30a17013697c0d8ed645d53982b5587cce4072894
     {url = "https://files.pythonhosted.org/packages/d7/4b/cbd8e699e64a6f16ca3a8220661b5f83792b3017d0f79807cb8708d33913/iniconfig-2.0.0.tar.gz", hash = "sha256:2d91e135bf72d31a410b17c16da610a82cb55f6b0477d1a902134b24a455b8b3"},
     {url = "https://files.pythonhosted.org/packages/ef/a6/62565a6e1cf69e10f5727360368e451d4b7f58beeac6173dc9db836a5b46/iniconfig-2.0.0-py3-none-any.whl", hash = "sha256:b6a85871a79d2e3b22d2d1b94ac2824226a63c6b741c88f7ae975f18b6778374"},
 ]
-"ipykernel 6.21.3" = [
-    {url = "https://files.pythonhosted.org/packages/a3/a0/647c0f205f9ef730bcb05bb8e1087e0c86d44835fc1f248dd67f01edd6fc/ipykernel-6.21.3-py3-none-any.whl", hash = "sha256:24ebd9715e317c185e37156ab3a87382410185230dde7aeffce389d6c7d4428a"},
-    {url = "https://files.pythonhosted.org/packages/df/04/a9709daeb4ca855f69e162a4fd3b87aabfa7856eb8eb29065f720cceeb4f/ipykernel-6.21.3.tar.gz", hash = "sha256:c8ff581905d70e7299bc1473a2f7c113bec1744fb3746d58e5b4b93bd8ee7001"},
+"ipykernel 6.22.0" = [
+    {url = "https://files.pythonhosted.org/packages/48/1b/260b3e4d2f633c1c9019e25a977a9e82341d0713ad8fb60e01b97b7559a4/ipykernel-6.22.0-py3-none-any.whl", hash = "sha256:1ae6047c1277508933078163721bbb479c3e7292778a04b4bacf0874550977d6"},
+    {url = "https://files.pythonhosted.org/packages/bc/18/a773c8f970269988c56678c7b8739b106c5557e419864481c90949db3754/ipykernel-6.22.0.tar.gz", hash = "sha256:302558b81f1bc22dc259fb2a0c5c7cf2f4c0bdb21b50484348f7bafe7fb71421"},
 ]
 "ipython 8.11.0" = [
     {url = "https://files.pythonhosted.org/packages/a7/e1/7c277c1dd0b0520bf07070c3921ff1986a2eb3db704ad91f0ac46fb42d8f/ipython-8.11.0.tar.gz", hash = "sha256:735cede4099dbc903ee540307b9171fbfef4aa75cfcacc5a273b2cda2f02be04"},
@@ -2976,9 +2993,9 @@ content_hash = "sha256:99c295c599a759eb30a17013697c0d8ed645d53982b5587cce4072894
     {url = "https://files.pythonhosted.org/packages/e8/69/fbeffffc05236398ebfcfb512b6d2511c622871dca1746361006da310399/ipython_genutils-0.2.0.tar.gz", hash = "sha256:eb2e116e75ecef9d4d228fdc66af54269afa26ab4463042e33785b887c628ba8"},
     {url = "https://files.pythonhosted.org/packages/fa/bc/9bd3b5c2b4774d5f33b2d544f1460be9df7df2fe42f352135381c347c69a/ipython_genutils-0.2.0-py2.py3-none-any.whl", hash = "sha256:72dd37233799e619666c9f639a9da83c34013a73e8bbc79a7a6348d93c61fab8"},
 ]
-"ipywidgets 7.7.3" = [
-    {url = "https://files.pythonhosted.org/packages/d3/25/542c1157c03434210780593a19714f42a380b0daee3e1bd366aaa8d7e49b/ipywidgets-7.7.3.tar.gz", hash = "sha256:b41ca84d2742e39f2a730a13ea0dd619fca62e56cfac88c8f08989fb00a54fa8"},
-    {url = "https://files.pythonhosted.org/packages/e4/b4/b35e08aa1580768121157eb04eba14294715d5de87a5ad8405793e49ab0a/ipywidgets-7.7.3-py2.py3-none-any.whl", hash = "sha256:c537a31feb4717d42b2331c9201a5c08e214693ca7439563fd4f1b64705312b9"},
+"ipywidgets 7.7.4" = [
+    {url = "https://files.pythonhosted.org/packages/32/d2/fdef71ee265d3776f234264c57107bf0be54551319b22bcff9c66745532c/ipywidgets-7.7.4-py2.py3-none-any.whl", hash = "sha256:295b7c9ba2c2e9d0c720b15bfe1f7c082db83540864d3ebc5bf57c92ae008bd6"},
+    {url = "https://files.pythonhosted.org/packages/38/b2/7dfccca02767bcf85707fdefd19d79ff4ec72211d0c6f2c26c814c16c874/ipywidgets-7.7.4.tar.gz", hash = "sha256:e2cca1f95b4b8e96e5c2c6ac7cfebacafb924a473df94a243a5e68b7b23172c7"},
 ]
 "isoduration 20.11.0" = [
     {url = "https://files.pythonhosted.org/packages/7b/55/e5326141505c5d5e34c5e0935d2908a74e4561eca44108fbfb9c13d2911a/isoduration-20.11.0-py3-none-any.whl", hash = "sha256:b2904c2a4228c3d44f409c8ae8e2370eb21a26f7ac2ec5446df141dde3452042"},
@@ -3014,9 +3031,9 @@ content_hash = "sha256:99c295c599a759eb30a17013697c0d8ed645d53982b5587cce4072894
     {url = "https://files.pythonhosted.org/packages/36/3d/ca032d5ac064dff543aa13c984737795ac81abc9fb130cd2fcff17cfabc7/jsonschema-4.17.3.tar.gz", hash = "sha256:0f864437ab8b6076ba6707453ef8f98a6a0d512a80e93f8abdb676f737ecb60d"},
     {url = "https://files.pythonhosted.org/packages/c1/97/c698bd9350f307daad79dd740806e1a59becd693bd11443a0f531e3229b3/jsonschema-4.17.3-py3-none-any.whl", hash = "sha256:a870ad254da1a8ca84b6a2905cac29d265f805acc57af304784962a2aa6508f6"},
 ]
-"jupyter-client 8.0.3" = [
-    {url = "https://files.pythonhosted.org/packages/2a/82/3bb00614ba16b4df15896119a34bc6c9b4838cc3fc4e5a09157ca6ee3985/jupyter_client-8.0.3.tar.gz", hash = "sha256:ed65498bea6d876ef9d8da3e0db3dd33c5d129f5b2645f56ae03993782966bd0"},
-    {url = "https://files.pythonhosted.org/packages/78/11/562517956f801607c4f7855ebf8c545e9a9f62ef936f0da1bdec9cd1a7aa/jupyter_client-8.0.3-py3-none-any.whl", hash = "sha256:be48ac6bd659cbbddb7a674cf06b3b8afbf53f228253cf58bde604c03bd487b0"},
+"jupyter-client 8.1.0" = [
+    {url = "https://files.pythonhosted.org/packages/31/6c/96771d6b3ce94da927f7688be821899f169306f16023dd0af5ef55f71a52/jupyter_client-8.1.0-py3-none-any.whl", hash = "sha256:d5b8e739d7816944be50f81121a109788a3d92732ecf1ad1e4dadebc948818fe"},
+    {url = "https://files.pythonhosted.org/packages/bd/3d/a65f5f54ebaa2ad32eec08fc8ba471608dbb4a0cb0e91dc8d58ac3bdc3d4/jupyter_client-8.1.0.tar.gz", hash = "sha256:3fbab64100a0dcac7701b1e0f1a4412f1ccb45546ff2ad9bc4fcbe4e19804811"},
 ]
 "jupyter-core 5.3.0" = [
     {url = "https://files.pythonhosted.org/packages/41/1e/92a67f333b9335f04ce409799c030dcfb291712658b9d9d13997f7c91e5a/jupyter_core-5.3.0-py3-none-any.whl", hash = "sha256:d4201af84559bc8c70cead287e1ab94aeef3c512848dde077b7684b54d67730d"},
@@ -3038,9 +3055,9 @@ content_hash = "sha256:99c295c599a759eb30a17013697c0d8ed645d53982b5587cce4072894
     {url = "https://files.pythonhosted.org/packages/69/8e/8ae01f052013ee578b297499d16fcfafb892927d8e41c1a0054d2f99a569/jupyterlab_pygments-0.2.2.tar.gz", hash = "sha256:7405d7fde60819d905a9fa8ce89e4cd830e318cdad22a0030f7a901da705585d"},
     {url = "https://files.pythonhosted.org/packages/c0/7e/c3d1df3ae9b41686e664051daedbd70eea2e1d2bd9d9c33e7e1455bc9f96/jupyterlab_pygments-0.2.2-py2.py3-none-any.whl", hash = "sha256:2405800db07c9f770863bcf8049a529c3dd4d3e28536638bd7c1c01d2748309f"},
 ]
-"jupyterlab-widgets 1.1.2" = [
-    {url = "https://files.pythonhosted.org/packages/31/28/99a86634451a40f89ebf6b35e24e529fa5829f23784b9bdd5fa8e9386aa6/jupyterlab_widgets-1.1.2-py3-none-any.whl", hash = "sha256:e7562e9d4ecb282f36f69fa4f1d0b23bda12db306b7aa981d47ba2a532e2ebe9"},
-    {url = "https://files.pythonhosted.org/packages/b9/fd/74a440e86d748348433b4e5242969a02b3228c2535055b3415e0be642ca1/jupyterlab_widgets-1.1.2.tar.gz", hash = "sha256:e1cc529afd7d7d7bcce251a591ca32a7d3f6b05d326b9b7a8afa577d2639e29c"},
+"jupyterlab-widgets 1.1.3" = [
+    {url = "https://files.pythonhosted.org/packages/28/fc/9020b1c4e9a9c81a153a6a8cac7924ec4c962b2b653f76a18171940af348/jupyterlab_widgets-1.1.3-py3-none-any.whl", hash = "sha256:93f59c2f848ebdb3c87195c18bc7360eddbc05ddb17f676ea1d8bfba9229b1f5"},
+    {url = "https://files.pythonhosted.org/packages/97/58/1c62baf1a5f09146dfa3d53975159bd0a1899f5c067e8a44c4739668c517/jupyterlab_widgets-1.1.3.tar.gz", hash = "sha256:5285a4316e13f9a6512cb80a0cfec5aafa2c336097ae077a07a60c145f2154fc"},
 ]
 "jupytext 1.14.5" = [
     {url = "https://files.pythonhosted.org/packages/0a/7f/c495114a3814df1d9d41855e939a6a0cb133a1a11a34a22bde934d115ff4/jupytext-1.14.5.tar.gz", hash = "sha256:976e66be8056459a2067e0ec3ff68cc31e00c31895faf9eb893022d319e8f5b4"},
@@ -3139,8 +3156,8 @@ content_hash = "sha256:99c295c599a759eb30a17013697c0d8ed645d53982b5587cce4072894
     {url = "https://files.pythonhosted.org/packages/27/11/869a3de9da0919b8b2179e9b2a6b0d9cd095baa2600f5c1f8744f398c049/lightning-utilities-0.8.0.tar.gz", hash = "sha256:8e5d95c7c57f026cdfed7c154303e88c93a7a5e868c9944cb02cf71f1db29720"},
     {url = "https://files.pythonhosted.org/packages/5d/ec/a20c5d5f26894913da028110310ba55ee254e1b7ff0ff78441e4eeb7291f/lightning_utilities-0.8.0-py3-none-any.whl", hash = "sha256:22aa107b51c8f50ccef54d08885eb370903eb04148cddb2891b9c65c59de2a6e"},
 ]
-"lit 15.0.7" = [
-    {url = "https://files.pythonhosted.org/packages/2f/5e/8b27ba3715becd8ee26f1f0c2ef9d18fa425a9f6bbf535573b90c08171b4/lit-15.0.7.tar.gz", hash = "sha256:ed08ac55afe714a193653df293ae8a6ee6c45d6fb11eeca72ce347d99b88ecc8"},
+"lit 16.0.0" = [
+    {url = "https://files.pythonhosted.org/packages/90/d8/acc8162b58aa44e899f6d4a4607650290624db71564e9b168716900510af/lit-16.0.0.tar.gz", hash = "sha256:3c4ac372122a1de4a88deb277b956f91b7209420a0bef683b1ab2d2b16dabe11"},
 ]
 "mapclassify 2.5.0" = [
     {url = "https://files.pythonhosted.org/packages/a1/63/d5cce1d7deee87721f98c5a72a563d5f5d6e616eaff647b247cdd6538062/mapclassify-2.5.0.tar.gz", hash = "sha256:5eb1f782155b5a90ec93c1dc52b300a2fad33117dcf08b7c858ed96da2a7baa0"},
@@ -3293,9 +3310,9 @@ content_hash = "sha256:99c295c599a759eb30a17013697c0d8ed645d53982b5587cce4072894
     {url = "https://files.pythonhosted.org/packages/19/fa/064b85a1b0d11d77a8458e1bfac50decc8d467ac866e75ccb5a6483c5c1f/mkdocs-gen-files-0.4.0.tar.gz", hash = "sha256:377bff8ee8e93515916689f483d971643f83a94eed7e92318854da8f344f0163"},
     {url = "https://files.pythonhosted.org/packages/6e/e2/f5b9f5b2ff62f2868d475586522d5d286d29c1d4e46aff0fd65037bb78b5/mkdocs_gen_files-0.4.0-py3-none-any.whl", hash = "sha256:3241a4c947ecd11763ca77cc645015305bf71a0e1b9b886801c114fcf9971e71"},
 ]
-"mkdocs-jupyter 0.23.1" = [
-    {url = "https://files.pythonhosted.org/packages/a1/ad/2c2c6c683d3f5f3a78d30e261837f83a933e3a90c8b4b1f9cbb0ab1b26f3/mkdocs_jupyter-0.23.1-py3-none-any.whl", hash = "sha256:0f1f707219af66abb1ead03500fbcb7f7196c6c06d963300ba40b9e8ec8088e8"},
-    {url = "https://files.pythonhosted.org/packages/ed/56/b268b0dcd8c6141a575b231ebbc6f193877bd94998745b0b8b575d03837e/mkdocs_jupyter-0.23.1.tar.gz", hash = "sha256:b2745c1e003ef9ec80d43ac8cc00b4de41810a1160bb133eca5329275106ead6"},
+"mkdocs-jupyter 0.24.0" = [
+    {url = "https://files.pythonhosted.org/packages/76/3b/6841ecbb3cec8a82a8c6cd6470e34bf98e3aabd06fcda4d3ebfaf61a0dc9/mkdocs_jupyter-0.24.0.tar.gz", hash = "sha256:fc2ec9a608609f91080d1fa8183b2ea7e9d2e913dd0e2005979a2c3540fa5cba"},
+    {url = "https://files.pythonhosted.org/packages/bc/80/dad443e6e13747ed1d96cd81c8d70934e5b579cd5b9e22fd6842421e55c2/mkdocs_jupyter-0.24.0-py3-none-any.whl", hash = "sha256:b7ab317d79796c43ac7f15ba8c2bc725b9361011a64300e2b4bb5ba2a73353fa"},
 ]
 "mkdocs-material 9.1.3" = [
     {url = "https://files.pythonhosted.org/packages/82/54/5cd2182ee05c161dec88a6e269e7b188ca18fbd544df36325d9aadbce9d8/mkdocs_material-9.1.3.tar.gz", hash = "sha256:0be1b5d76c00efc9b2ecbd2d71014be950351e710f5947f276264878afc82ca0"},
@@ -3453,9 +3470,9 @@ content_hash = "sha256:99c295c599a759eb30a17013697c0d8ed645d53982b5587cce4072894
     {url = "https://files.pythonhosted.org/packages/3f/53/1e99001bc154bd2d243564275e2b7a0e492b48ae032b1377f35cc9defa16/nbconvert-7.2.10-py3-none-any.whl", hash = "sha256:e41118f81698d3d59b3c7c2887937446048f741aba6c367c1c1a77810b3e2d08"},
     {url = "https://files.pythonhosted.org/packages/b4/2c/dee2905b8e7c8a1b2db6ba7d49cd860e3be1612bd1c96f2b7f97716edfe6/nbconvert-7.2.10.tar.gz", hash = "sha256:8eed67bd8314f3ec87c4351c2f674af3a04e5890ab905d6bd927c05aec1cf27d"},
 ]
-"nbformat 5.7.3" = [
-    {url = "https://files.pythonhosted.org/packages/21/ad/020fed74bfde983a3b70cc95843d6adbe59171aa9a3da5aab403aa722a17/nbformat-5.7.3-py3-none-any.whl", hash = "sha256:22a98a6516ca216002b0a34591af5bcb8072ca6c63910baffc901cfa07fefbf0"},
-    {url = "https://files.pythonhosted.org/packages/ce/42/fae44dfe70960c488e5b9b53c617dedd1c7932aff1962c59b2a923e82bb8/nbformat-5.7.3.tar.gz", hash = "sha256:4b021fca24d3a747bf4e626694033d792d594705829e5e35b14ee3369f9f6477"},
+"nbformat 5.8.0" = [
+    {url = "https://files.pythonhosted.org/packages/08/b7/8b964e977438037b57de31d312d67046e215295899107576e3708b0ea223/nbformat-5.8.0.tar.gz", hash = "sha256:46dac64c781f1c34dfd8acba16547024110348f9fc7eab0f31981c2a3dc48d1f"},
+    {url = "https://files.pythonhosted.org/packages/1d/f6/38f4694b5035306a8c2685e9e6ea7bf46ea344c03422d7131442ac9677c1/nbformat-5.8.0-py3-none-any.whl", hash = "sha256:d910082bd3e0bffcf07eabf3683ed7dda0727a326c446eeb2922abe102e65162"},
 ]
 "nest-asyncio 1.5.6" = [
     {url = "https://files.pythonhosted.org/packages/35/76/64c51c1cbe704ad79ef6ec82f232d1893b9365f2ff194111787dc91b004f/nest_asyncio-1.5.6.tar.gz", hash = "sha256:d267cc1ff794403f7df692964d1d2a3fa9418ffea2a3f6859a439ff482fef290"},
@@ -3811,36 +3828,47 @@ content_hash = "sha256:99c295c599a759eb30a17013697c0d8ed645d53982b5587cce4072894
     {url = "https://files.pythonhosted.org/packages/36/ea/99ddefac41971acad68f14114f38261c1f27dac0b3ec529824ebc739bdaa/pydocstyle-6.3.0-py3-none-any.whl", hash = "sha256:118762d452a49d6b05e194ef344a55822987a462831ade91ec5c06fd2169d019"},
     {url = "https://files.pythonhosted.org/packages/e9/5c/d5385ca59fd065e3c6a5fe19f9bc9d5ea7f2509fa8c9c22fb6b2031dd953/pydocstyle-6.3.0.tar.gz", hash = "sha256:7ce43f0c0ac87b07494eb9c0b462c0b73e6ff276807f204d6b53edc72b7e44e1"},
 ]
-"pyerfa 2.0.0.1" = [
-    {url = "https://files.pythonhosted.org/packages/0e/43/cab7256595bb6618ca8e703fceab5246de48362b52cf600b0402d713695b/pyerfa-2.0.0.1-cp39-cp39-win32.whl", hash = "sha256:7895b7e6f3bc36442d1969bf3bda5a4c3b661be7a5a468798369cbd5d81023d8"},
-    {url = "https://files.pythonhosted.org/packages/14/cb/2d3a09fadaa02713e84fe71273614df326f922d7473f6b24b83722a63914/pyerfa-2.0.0.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:67711a748821c5d91f7a8907b9125094dfc3e5ab6a6b7ad8e207fd6afbe6b37f"},
-    {url = "https://files.pythonhosted.org/packages/1a/1b/d75fad44e1c5f276041519e4448d953e25b4686c6ecd73496450e9f3538b/pyerfa-2.0.0.1-cp310-cp310-win_amd64.whl", hash = "sha256:f00dc4fc48a16eb39fd0121f2f06c03ee762b79a207cc5b0bc17d94191b51302"},
-    {url = "https://files.pythonhosted.org/packages/1b/9b/7cd78b66e81b78ca393f3ea8a0f4805c412a67e152dbb80749612a5059e4/pyerfa-2.0.0.1-cp38-cp38-win_amd64.whl", hash = "sha256:d603f1e8123f98a0593433aa6dad4ba03f0b0ceef4cb3e96f9a69aa7ab8d5c61"},
-    {url = "https://files.pythonhosted.org/packages/20/8c/aee86d91df577f3ee805ebfca4bd9da22f42a9f1cf6714976c7b2cd1032f/pyerfa-2.0.0.1-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:da89304d6b25ac056e470f44f85770b04c9674eced07a7f93b5eb0ce1edaabd9"},
-    {url = "https://files.pythonhosted.org/packages/49/ec/a839dd71a05b735f0164248e54c1a9069ecfd8627db6efa109ca50260805/pyerfa-2.0.0.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c7ca8c98842f1ae10c1fbcea0e03a41ddc13456da88da2dc9b8335a8c414d7a3"},
-    {url = "https://files.pythonhosted.org/packages/5a/9b/dcd9f932362942422b1932f6a4ffa043b1fc74879ff44eb47889916603a6/pyerfa-2.0.0.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:b935fa9d10dfd7206760859236640c835aa652609c0ae8a6584593324eb6f318"},
-    {url = "https://files.pythonhosted.org/packages/60/5b/1a8c9b73d15f90dde169cfbfff2faa327ac18b59b0ad411a2069191dc4b6/pyerfa-2.0.0.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:f76fb4b64a87da2af9d0b6b79cc25e1ecc5b4143b2b3c8c9f10b221748c5db4d"},
-    {url = "https://files.pythonhosted.org/packages/64/1a/d2a09a3c140366e6f382adb6aea8c8b6fb3ec732f3d92c38d4a4bb8168f7/pyerfa-2.0.0.1-cp39-cp39-win_amd64.whl", hash = "sha256:63a83c35cea8c5d50d53c18089f1e625c0ffc59a7a5b8d44e0f1b3ec5288f183"},
-    {url = "https://files.pythonhosted.org/packages/6b/c7/8cca1135e4a8b9b8cc92c45c286a656d3f544c469a5b5c2d51adb0b38713/pyerfa-2.0.0.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:278832de7803f2fb0ef4b14263200f98dfdb3eaa78dc63835d93796fd8fc42c6"},
-    {url = "https://files.pythonhosted.org/packages/78/fd/0148f0e54f0c6f48a141409df65d74a5f1dae2e139f23d50a43c58c16098/pyerfa-2.0.0.1.tar.gz", hash = "sha256:2fd4637ffe2c1e6ede7482c13f583ba7c73119d78bef90175448ce506a0ede30"},
-    {url = "https://files.pythonhosted.org/packages/7a/2f/5ebf229c1e5e95382d4b0097c3a3ee8bfe1e1cd9d734b49d64a1457ef899/pyerfa-2.0.0.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:d2c10838241aaf17279468dcc731cb2c09bfb7dd7b340c0f527fd70c7c9e53d1"},
-    {url = "https://files.pythonhosted.org/packages/8c/10/abc5d4858dc1b0eff55fa4934b48e291eae36f6a76d37809a164b7a0cd59/pyerfa-2.0.0.1-cp38-cp38-win32.whl", hash = "sha256:486e672c52bf58eab61140968660ac7fb3b756116b53c26c334ae95dadd943ee"},
-    {url = "https://files.pythonhosted.org/packages/8e/2c/d559173df84402f56db95e195a33a0ef99481e05ed377362f865fd94f9c9/pyerfa-2.0.0.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b8f08f6e6d75a261bb92b707bea19eba2e46a8fcbfb499b789f3eb0d0352ea00"},
-    {url = "https://files.pythonhosted.org/packages/8f/76/68d862db9bd200776a3fa60d2c07fcee34285e5363adb88fdd8fbc3bce36/pyerfa-2.0.0.1-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:36738ba75e7a69e0ea6a7e96a5d33a852816427e7e94e7089c188ef920b02669"},
-    {url = "https://files.pythonhosted.org/packages/90/7f/8ef8f3e494e39c45bf208f9f6ed9725eacf48683c24578d6dde1ebe304c9/pyerfa-2.0.0.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:ef5590b2075c50395b958f102988e519e339d96509dfdca0360f26dde94c47e7"},
-    {url = "https://files.pythonhosted.org/packages/af/6d/66abea123f1f31d96a00c6f10f2cf57a72986dda343b830b410f846e3516/pyerfa-2.0.0.1-cp37-cp37m-win_amd64.whl", hash = "sha256:e86c08c9c0b75e448818473c6d709e3887a439c05a1aa34042d26774251422b7"},
-    {url = "https://files.pythonhosted.org/packages/b2/cc/59f9617830634ebd257fd1870db7f2e4db7fcc77b395ba14c9b9f2712ff8/pyerfa-2.0.0.1-cp310-cp310-win32.whl", hash = "sha256:f9e149bc3d423ae891f6587c1383fd471ae07744b88152e66b5e9f64a8bc9006"},
-    {url = "https://files.pythonhosted.org/packages/b3/cf/e04248d927d418eb1f9bc22bcea58bf5f22b4f84a4dfe38f8fccdbff4007/pyerfa-2.0.0.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:3285d95dfe398a931a633da961f6f1c0b8690f2a3b1c510a4efe639f784cd9c7"},
-    {url = "https://files.pythonhosted.org/packages/be/56/3bd7b00f9e3348bdb79f769edce2d56b0e26d3c1b7758aa613e6b636d207/pyerfa-2.0.0.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:da5ee24eaf5e5f841f36885ea16461800b7bea11df5b657bcff85d7a7f51d2d8"},
-    {url = "https://files.pythonhosted.org/packages/bf/29/d2ac8f83c88ba2cf9313d0f7e5cd79ed77f0f11826e3d83db28e59f71e98/pyerfa-2.0.0.1-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:37249e1e2b378d1f56e9379e4bb8f2cf87645c160a8a3e92166a1b7bb7ad7ea6"},
-    {url = "https://files.pythonhosted.org/packages/c0/54/daa0a491c89a7bcdd4cde15e27cd1e8a375efcae867242864a74012d7d47/pyerfa-2.0.0.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:041939a7554a98b72885904ffddd8882567191bee62358727679448480174c31"},
-    {url = "https://files.pythonhosted.org/packages/c1/5a/dc6f615d7d331099bf2e96aa52c1c205cd4e8afa951f67d0f87cdcf48a17/pyerfa-2.0.0.1-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:5c077aed4ccd585c1fe2f96ada8edb66e9d27b4ae8ff13ea2783283b298ba0c6"},
-    {url = "https://files.pythonhosted.org/packages/c3/10/11bc370ffbc50ad2ed2a25742f742e5fe8d43f6dd5fbe916a93d6a1e6d8d/pyerfa-2.0.0.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:d3e7dedce1d7e4e044f6f81d192b1f6b373c8ad6716aa8721ec6d3cf4d36f5f3"},
-    {url = "https://files.pythonhosted.org/packages/d3/1a/095209120b81c7fc3921bc7b7b49b0fea9b8e52c153b5ff6e6dbf24e8d9a/pyerfa-2.0.0.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:1ba3668e1e181a678ce788d23a4f8666aabd8518f77fdde5157ba4744bc73d4a"},
-    {url = "https://files.pythonhosted.org/packages/e4/08/2d46d736b5cabaadb56e45ac6a03e355dd4889ffe36ca5133962a27f6627/pyerfa-2.0.0.1-cp37-cp37m-win32.whl", hash = "sha256:0833f8ebba9f84a19a04ee5ca5aa90be75729abfbb8328e7a6d89ed1b04e058c"},
-    {url = "https://files.pythonhosted.org/packages/e5/1f/238cf7fddba34875cafd4e1e6a69404335fe93700079bac344d16f9701da/pyerfa-2.0.0.1-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:690116a6026ee84ce5fec794c9e21bdc8c0ac8345d6722323810181486745068"},
-    {url = "https://files.pythonhosted.org/packages/f1/71/3fc23d108826779bdca44b018b95730d0d6969a52978c1f797a59045904c/pyerfa-2.0.0.1-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:177f50f0e8354f1a7115c2d4784668b365f1cc2f2c7d1e2f4ddf354160559b32"},
-    {url = "https://files.pythonhosted.org/packages/fb/26/601d5717bab5e481b4f8085c66ddbc09c4fd1b134a109825a48987653c66/pyerfa-2.0.0.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:629248cebc8626a52e80f69d4e2f30cc6e751f57803f5ba7ec99edd09785d181"},
+"pyerfa 2.0.0.2" = [
+    {url = "https://files.pythonhosted.org/packages/02/f4/21631a29aa4953feeffc2ccb38370186d6a0210221039eb290cfc58c7564/pyerfa-2.0.0.2-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:6d3b93389657fe133c09dba6d6715d3d79dda637fa3c5a99c77cd262fd923af5"},
+    {url = "https://files.pythonhosted.org/packages/04/f3/6ea28291b528c5030af0982792f74f5777e1fc6d5b414a4d0c713f7239f1/pyerfa-2.0.0.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:d678218d2fdd53d579be471f217b3b9ac5133f302c05760b744cfa797b42eb7c"},
+    {url = "https://files.pythonhosted.org/packages/0a/4c/54091d8b456c006dc0797c31cf7d7bbc1bf9929f79022ff3b480ee4d7764/pyerfa-2.0.0.2.tar.gz", hash = "sha256:05370b7f0b4ca5a0caa845a1b6047259ba14d5608d1a18cd180049fff8c74b12"},
+    {url = "https://files.pythonhosted.org/packages/21/3e/61be8f6e25388a66248145e5b891172d6ad52f34067a7ba97847094429f3/pyerfa-2.0.0.2-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:03535d39a7982731538a41a10d7943eaf452999825700b99abb5a5f8ec88eae6"},
+    {url = "https://files.pythonhosted.org/packages/2d/7c/c769ec5af28568e149b2ae427e8f35f3deb559fbd5483f35f9f6d6eb237c/pyerfa-2.0.0.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:31bd6e736b76aa99589b1d1d8b479e50a3ae980f046d7f06e93146159b4a8325"},
+    {url = "https://files.pythonhosted.org/packages/33/ca/4ad2fe5646dc1289287768f742db5b41e3163ccb387d5b3ca2a5435120fa/pyerfa-2.0.0.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:31870b2b15cc49bd1216e8c12add22b5f8264f7e1a896d9d42ed0d2f6d8f140c"},
+    {url = "https://files.pythonhosted.org/packages/39/0f/c6d4ab438545beb85fb8e2552bcf75f26c4771783750c3f8e90630d45994/pyerfa-2.0.0.2-cp38-cp38-win32.whl", hash = "sha256:ee7bf379d76f02a9c42f885a417d1fa3eb2fb743e5b686deeaf9c1fc69ca3b5e"},
+    {url = "https://files.pythonhosted.org/packages/3f/66/aa309534c6d72cc447757642f616358ad68d3e4bb5ba82cd526032eb0622/pyerfa-2.0.0.2-cp311-cp311-win_amd64.whl", hash = "sha256:d44ddafbb784b872bca8dc4ceb357293c99034b7f134d9aef8c4287d181d4c4e"},
+    {url = "https://files.pythonhosted.org/packages/3f/81/cd6498101c1e51fc3e46d98df97f6aad6e6fdb848161e904c2aa99b471a0/pyerfa-2.0.0.2-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:acaa0d00de9f3d4f9a5a11f3b1b89e2aa970422616882c53b01fc348a51001cd"},
+    {url = "https://files.pythonhosted.org/packages/3f/cf/5ca1f9c6e2828d14e22c955e91d743f7b02575f415f79e842f5992130d73/pyerfa-2.0.0.2-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:b819830ede814db892e463b51492bfdd83a08a7b2953211aa58599865f7c119d"},
+    {url = "https://files.pythonhosted.org/packages/4a/d4/9223c130d63bb1c9fa9be034159cd6311f62ae84ed2c122c09eebfcccca5/pyerfa-2.0.0.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:0f76a89f382d57caae4703194a8ca7f8d99e0d8ee5cc3ab7889725b02f525c36"},
+    {url = "https://files.pythonhosted.org/packages/4b/0e/ba731b1aa60f173622bac98c46773e50ff972fb3cccba00414d73b27f715/pyerfa-2.0.0.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f6974df2305a95d63d6fa53b0f4ed31a161b6888178dd8ecf2fed147b0c0f296"},
+    {url = "https://files.pythonhosted.org/packages/50/28/80a96b3d70b315b9f557cb38bb4d925b8e8cfd67066a02a327eaf884be4f/pyerfa-2.0.0.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d647650e50d478386906723523ee1094255c4e8f38a4f269fced3f03d575903f"},
+    {url = "https://files.pythonhosted.org/packages/55/c1/8ec8b4e19004041bf209ead85b36fbca9b0b196b40913793016a0dba9cd8/pyerfa-2.0.0.2-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:28f7b60aa8924a84402cb35150a2922bc0178b00c6e98e1d1bcb9d4e8d415a96"},
+    {url = "https://files.pythonhosted.org/packages/59/c7/fd12e51064c06b76e5634db29255ea9d05b9c50f374ded2668e33f89eedb/pyerfa-2.0.0.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:85816ddd41e30f922ab00cb519ba39218b904698f8590750a1b69f21b106e2c5"},
+    {url = "https://files.pythonhosted.org/packages/5a/80/45c5361d39fa47b3d312b0cf2678eee8235d5d7da66c829bd9314788f304/pyerfa-2.0.0.2-cp310-cp310-win32.whl", hash = "sha256:975a040e698c07e332a92f3fbb5b1ba45d5c01435f92b7a2e41e2998af70cbfd"},
+    {url = "https://files.pythonhosted.org/packages/68/d2/40f943fa1427dd8818d1684018bc851d3ef95ca98cb591db554f9691e87c/pyerfa-2.0.0.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:014814fb5c8dcaf31328087fd9f86fe72c150d9ffb505f2f274316c0bf91caba"},
+    {url = "https://files.pythonhosted.org/packages/6e/7a/c0fc77b5a321f17800dcf6f83af7d2f9cf274f44333c75332d84e31cd136/pyerfa-2.0.0.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:c3e3058150bc6cdbf02adf2c266000431a7a42e6e98f05d0c98d5d4ff500506f"},
+    {url = "https://files.pythonhosted.org/packages/72/c3/895a2a4d88df0e260de68de51db8cef1ec6b8c34cf858f6759d662152aac/pyerfa-2.0.0.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1d4c7be0627bf2d4d6f66c2ab07bd833c9523d86369321b5edad1e6fac47681b"},
+    {url = "https://files.pythonhosted.org/packages/80/ac/ba5f4c96d38098e7f9e4b2b0e52aad447c6864e0b31b6c3ce6e748f5bbcc/pyerfa-2.0.0.2-cp39-cp39-win32.whl", hash = "sha256:d5b528dc22e42df7738bd0d3216eabf845b39121e3eca8059d43e132dfcaec88"},
+    {url = "https://files.pythonhosted.org/packages/80/d8/03ce4339f2930304877822a0ff91f6016c4bbc5ad747e05cad04ec5e295d/pyerfa-2.0.0.2-cp310-cp310-win_amd64.whl", hash = "sha256:bebab4c389c674e48dd87963323c9bf36a75af1e8192ab4699fdfcfb52b3a5e8"},
+    {url = "https://files.pythonhosted.org/packages/91/52/d77bd63edbbf96f0327a5fb7956596c32963f9276a4c1b219d90402ff92a/pyerfa-2.0.0.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:5b272699c60919f38a97b46fb2ff622f94c36cd7aecb6f6210504e76206e6545"},
+    {url = "https://files.pythonhosted.org/packages/92/37/d9c7889b25df9b7b88e3d266058fae9b4ed2d51b34b62c1dcda85ada6ea4/pyerfa-2.0.0.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2611c8ccc5eb817c309b1629b8430f5f4d029913a531955ef7be6a9ebf2db35d"},
+    {url = "https://files.pythonhosted.org/packages/93/8d/4316f2cd7c0e0046faa81ff442f3677ba70025cd83e3f1a4f4ff52beaf26/pyerfa-2.0.0.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bc37154338ccb19a17951e06cbdd333fb0378a3107c649f7ccb5bfcf71224c3d"},
+    {url = "https://files.pythonhosted.org/packages/98/8c/0269152704beb28f365e290c6ab32b7233e48d0025779a5a7339adf76b1d/pyerfa-2.0.0.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:ad3a3fb98b51bb63a63ddafba83fbb4ee791c2122a7cdaa592faa282838c60c9"},
+    {url = "https://files.pythonhosted.org/packages/a0/0d/5bbe5cc9484b1e4e49d0b55f433d83ed5d61ab4863ec3b5710443580e584/pyerfa-2.0.0.2-cp39-cp39-win_amd64.whl", hash = "sha256:d0001f25f72819c28d6f495624be0fdae66299d658609a40a1765d8a03e6d2a3"},
+    {url = "https://files.pythonhosted.org/packages/a6/15/51711a6146b45e52000adf43910f552fe5995325de462d7ce141f7ce1be6/pyerfa-2.0.0.2-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e5d1aba7dbaad83b9b7bc19c9396f4ebbe7c52fe31bc840a171e0e2887bcd074"},
+    {url = "https://files.pythonhosted.org/packages/a7/f3/20d671300cef2049666510a8b73ea6f3779c696772123ee7f3db80f1291b/pyerfa-2.0.0.2-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:35e747c6bf3894ac31075d4fab9865dc1f8d10de6af9ad831effe31ac17f943c"},
+    {url = "https://files.pythonhosted.org/packages/b6/3e/2c41bd896506d0a03d57189062d2ec067014a569ff2f6557e0f6fcf90c40/pyerfa-2.0.0.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0fcac90692f92d501658743a2d58aebf0d845e68af610d74774eebc1916c3cb5"},
+    {url = "https://files.pythonhosted.org/packages/bd/5d/02e38cdc51cf7c75a2addb3680265eee25394fc5fa5273e40d5d99f5dfb2/pyerfa-2.0.0.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:01e56d53cbf4bb77f487c285c1177c5b69f36b5f5abcc40d4fce86208cca1a93"},
+    {url = "https://files.pythonhosted.org/packages/bd/f2/e34eb34f2749fee17bf3b5b6124fb0229b6a1d803d1c7cbce79e7de55873/pyerfa-2.0.0.2-cp38-cp38-win_amd64.whl", hash = "sha256:fdbc0ad5c0dcb2e425332bf82ab928e9c2e441d2ca9a205972ee5fe1ffd9c5b5"},
+    {url = "https://files.pythonhosted.org/packages/be/91/49e29adfb723b77a2c3fc1ec9bc08b6b0dc6bd9965537b274dd6116ce849/pyerfa-2.0.0.2-cp37-cp37m-win32.whl", hash = "sha256:53faeb44a9e7d8dbb95e07e23dfea3fc9dd2f9b8f9843eb8daa60b9a6234a50d"},
+    {url = "https://files.pythonhosted.org/packages/cc/5c/ddd40160be392c30b2a0350dd70cc9528a08aaba967e31311fc7f56d4395/pyerfa-2.0.0.2-cp37-cp37m-win_amd64.whl", hash = "sha256:97b745c3186a7380a8869b1305410d2b980cd5393f4d94f25b59c0278a54ed83"},
+    {url = "https://files.pythonhosted.org/packages/e5/c8/20381c09b600f4b58274b9d2a35bb1014d58d14671f997a836994483a365/pyerfa-2.0.0.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:efd66c138c7299260215674b42f4969cd34bfee1b4ceaa37b33f2a9d80015e18"},
+    {url = "https://files.pythonhosted.org/packages/e9/27/db739fe572430d05aae516c71e78d861dea2459eb74dfc3cf0b353843f6b/pyerfa-2.0.0.2-cp311-cp311-win32.whl", hash = "sha256:58a104acc67e31769d652b31284813dbf4bfbac1155e5ce0669a5465e6ecea28"},
+    {url = "https://files.pythonhosted.org/packages/f4/51/df71381828b1a8c8f2b5ba7056ad4c27e9957b7270200e037422b30e21a1/pyerfa-2.0.0.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:c43673614b881d1fc5f1f7b287dcfc694461c221bbb653dd9037cc1a0c0845f6"},
+    {url = "https://files.pythonhosted.org/packages/f4/a5/3d000f4c13d5d8e4c0d331bbeadfe5913e135012a537be01a994d61af099/pyerfa-2.0.0.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:704b13d9f59e93705ec625a965263b4ddd70222988f20be3d6f9e556dedcbb0e"},
+    {url = "https://files.pythonhosted.org/packages/f8/18/7f510ccde93902b5cc13740ad72a59a8cb65ea0b19c046e41d90a10e5800/pyerfa-2.0.0.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:f6db8848c8d368b55f0e2f8a74c9bb4293dbfe947b7fa4f6220169f2ae502a44"},
+    {url = "https://files.pythonhosted.org/packages/fb/bc/19dbd7354800302180d844a94edf81a09031de3f4362524d2e24ec1e2c48/pyerfa-2.0.0.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0a9d4f423982c43ed7f25e4e625013c82e1b66e133a438b0a41f46be01938304"},
+    {url = "https://files.pythonhosted.org/packages/fd/d8/47213234e07c5db8546419a30b8f9dcde1ac05780c6a678c3b5bed466388/pyerfa-2.0.0.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cf9bad7409e44b1d6728f4733d73596a48c8f848a7ffb1647ec7fc62c1e81c23"},
 ]
 "pyflakes 2.5.0" = [
     {url = "https://files.pythonhosted.org/packages/07/92/f0cb5381f752e89a598dd2850941e7f570ac3cb8ea4a344854de486db152/pyflakes-2.5.0.tar.gz", hash = "sha256:491feb020dca48ccc562a8c0cbe8df07ee13078df59813b83959cbdada312ea3"},
@@ -3944,10 +3972,17 @@ content_hash = "sha256:99c295c599a759eb30a17013697c0d8ed645d53982b5587cce4072894
     {url = "https://files.pythonhosted.org/packages/b2/68/5321b5793bd506961bd40bdbdd0674e7de4fb873ee7cab33dd27283ad513/pytest-7.2.2-py3-none-any.whl", hash = "sha256:130328f552dcfac0b1cec75c12e3f005619dc5f874f0a06e8ff7263f0ee6225e"},
     {url = "https://files.pythonhosted.org/packages/b9/29/311895d9cd3f003dd58e8fdea36dd895ba2da5c0c90601836f7de79f76fe/pytest-7.2.2.tar.gz", hash = "sha256:c99ab0c73aceb050f68929bc93af19ab6db0558791c6a0715723abe9d0ade9d4"},
 ]
+"pytest-check 2.1.4" = [
+    {url = "https://files.pythonhosted.org/packages/95/ea/ab908bbf7e761ef02ed69c625a027e80180c08454c1d32964bb4345de43b/pytest_check-2.1.4-py3-none-any.whl", hash = "sha256:0c15d8c01ce31a13b73eb875854d060aca6f6c529aa9dd9fa0bd690c744eb171"},
+    {url = "https://files.pythonhosted.org/packages/a0/dc/a0eb5f6b939bef2730588d8dd1f2bcc96e4c032d98750c3126532c7d2c8d/pytest-check-2.1.4.tar.gz", hash = "sha256:01b37fd703da0fa667b7017af1f0460c744a85f1ee87675ee3e0f94acc3df172"},
+]
 "pytest-mock 3.10.0" = [
     {url = "https://files.pythonhosted.org/packages/91/84/c951790e199cd54ddbf1021965b62a5415b81193ebdb4f4af2659fd06a73/pytest_mock-3.10.0-py3-none-any.whl", hash = "sha256:f4c973eeae0282963eb293eb173ce91b091a79c1334455acfac9ddee8a1c784b"},
     {url = "https://files.pythonhosted.org/packages/f6/2b/137a7db414aeaf3d753d415a2bc3b90aba8c5f61dff7a7a736d84b2ec60d/pytest-mock-3.10.0.tar.gz", hash = "sha256:fbbdb085ef7c252a326fd8cdcac0aa3b1333d8811f131bdcc701002e1be7ed4f"},
 ]
+"pytest-parametrization 2022.2.1" = [
+    {url = "https://files.pythonhosted.org/packages/58/43/c3459bd30ffdb9df4b23bdffa7febf141227d0a2b6701f0443f3ed7fcfb5/pytest-parametrization-2022.2.1.tar.gz", hash = "sha256:057229ad7e284fe3435a717a8a58dc5f169b3d1e5aa946d94ec591d31bd78445"},
+]
 "python-dateutil 2.8.2" = [
     {url = "https://files.pythonhosted.org/packages/36/7a/87837f39d0296e723bb9b62bbb257d0355c7f6128853c78955f57342a56d/python_dateutil-2.8.2-py2.py3-none-any.whl", hash = "sha256:961d03dc3453ebbc59dbdea9e4e11c5651520a876d0f4db161e8674aae935da9"},
     {url = "https://files.pythonhosted.org/packages/4c/c4/13b4776ea2d76c115c1d1b84579f3764ee6d57204f6be27119f13a61d0a9/python-dateutil-2.8.2.tar.gz", hash = "sha256:0123cacc1627ae19ddf3c27a5de5bd67ee4586fbdd6440d9748f8abb483d3e86"},
@@ -4034,84 +4069,84 @@ content_hash = "sha256:99c295c599a759eb30a17013697c0d8ed645d53982b5587cce4072894
     {url = "https://files.pythonhosted.org/packages/5a/66/bbb1dd374f5c870f59c5bb1db0e18cbe7fa739415a24cbd95b2d1f5ae0c4/pyyaml_env_tag-0.1-py3-none-any.whl", hash = "sha256:af31106dec8a4d68c60207c1886031cbf839b68aa7abccdb19868200532c2069"},
     {url = "https://files.pythonhosted.org/packages/fb/8e/da1c6c58f751b70f8ceb1eb25bc25d524e8f14fe16edcce3f4e3ba08629c/pyyaml_env_tag-0.1.tar.gz", hash = "sha256:70092675bda14fdec33b31ba77e7543de9ddc88f2e5b99160396572d11525bdb"},
 ]
-"pyzmq 25.0.1" = [
-    {url = "https://files.pythonhosted.org/packages/00/80/def89073b212a9a88aa7336773afa16174f0aa3ccbdc661172faffec5a8f/pyzmq-25.0.1-pp37-pypy37_pp73-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:703ec5f5a8369c09d8f3eb626358bdb590a2b1375bcce8b7da01b3a03f8b8668"},
-    {url = "https://files.pythonhosted.org/packages/05/23/fe913c026596514006440fdaf617f7d081067a1f8f37417e1859d4120f55/pyzmq-25.0.1-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:835da498b71570d56e5526de4d5b36fa10dd9b8a82e2c405f963afeb51ff5bdc"},
-    {url = "https://files.pythonhosted.org/packages/05/42/5d8fed044d1ff11cac18d34a592f72d9b5b4ca8e2b9c14a3a5e2899cc2ea/pyzmq-25.0.1-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:21de2ef6099fa8d6a3c2dc15aaca58e9f9ffdcc7b82a246590aa9564815699d9"},
-    {url = "https://files.pythonhosted.org/packages/0c/87/e1c7c7af2762b0a5ca10e819978756808c500ba374e304c74be22a39bf3f/pyzmq-25.0.1-cp310-cp310-win_amd64.whl", hash = "sha256:e3a721710992cf0e213bbb7be48fb0f32202e8d01f556c196c870373bb9ad4f4"},
-    {url = "https://files.pythonhosted.org/packages/0f/89/34e905d3fc1b973700a3d6565e4db9c95ab8f436681d2518141a4b216aa8/pyzmq-25.0.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:b39847501d229e5fab155d88a565edfb182cdd3f7046f15a7f2df9c77cdc422d"},
-    {url = "https://files.pythonhosted.org/packages/12/40/5842f7ed12ccf953304dfe70d170cf5c48042ef5a06d154006f719201c42/pyzmq-25.0.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:eef93b5574c9ff36b4be376555efd369bd55b99bcc7be72f23bd38102dd9392b"},
-    {url = "https://files.pythonhosted.org/packages/15/f3/ccd17ae5349332fe6e93aeb24bc2a0dae8d21dd94135d5c1f7ef0842b4f5/pyzmq-25.0.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:44bc81099ab33388f6c061c1b194307d877428cb2b18282d0385584d5c73ed72"},
-    {url = "https://files.pythonhosted.org/packages/16/a0/03f970eebeb4936af42a0eed3e68d545eba63fcd9c0499bfe6bd0ea80336/pyzmq-25.0.1-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:d72d69d4bb37c05a446d10bc40b391cf8fb7572654fb73fa69e7d2a395197e65"},
-    {url = "https://files.pythonhosted.org/packages/17/65/5ce1697086426cd0c29a8b6c7017dee5559abd3fd2a886159ada37b55836/pyzmq-25.0.1-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:92f04d63aecbb71d41f7db5f988167ef429f96d8197fd46684688cdb513e8a2e"},
-    {url = "https://files.pythonhosted.org/packages/19/a6/6379fa14aff726381994bc96277b74ae014b3a65171b02e0cd0356cd5309/pyzmq-25.0.1-cp36-cp36m-musllinux_1_1_i686.whl", hash = "sha256:861c37649c75a2ecfc2034a32b9d5ca744e1e0cddcbf65afbd8027cf7d9755be"},
-    {url = "https://files.pythonhosted.org/packages/19/de/d09e9bcbd32aa91a8e7df857b10205ac7359526700663bfc11f7801de342/pyzmq-25.0.1-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:64a2bc72bcad705ee42a8fe877478ddadb7e260e806562833d3d814125e28a44"},
-    {url = "https://files.pythonhosted.org/packages/1b/a0/81e9eb5fcccdd53de7bf5fb8e487ddc51904a28d69981519340ce704aa33/pyzmq-25.0.1-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:f38bf2c60a3f7b87cf5177043eb7a331a4f53bc9305a2452decbd42ad0c98741"},
-    {url = "https://files.pythonhosted.org/packages/1b/ae/3055ea255e57dd5e731303b486436474068748df117304ba33e9c88044e7/pyzmq-25.0.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:c62084f37682e7ee4064e8310078be4f6f7687bf528ae5761e2ba7216c5b8949"},
-    {url = "https://files.pythonhosted.org/packages/1f/d2/4c56c41c2aac2aa73af684404a71226ffffbd68af4dc66bd823e98b6cf13/pyzmq-25.0.1-cp311-cp311-win_amd64.whl", hash = "sha256:0644c0d5c73e4bfeee8148f638ab16ad783df1c4d6c2f968552a26a43fb002a1"},
-    {url = "https://files.pythonhosted.org/packages/2a/e3/3b47cf69f2e8e64ce6146ef0b5a6e05118951c6cf6e80eb5263bf88c46bb/pyzmq-25.0.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0ca66aa24422d7f324acd5cb7fc7df616eb6f0205e059393fb108702e33e90c7"},
-    {url = "https://files.pythonhosted.org/packages/2c/02/8f1509d4af5ce29d86b055e81a40cfb9466e5d80e3b248b53d457e444468/pyzmq-25.0.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:aa56a362066b3a853a64d35693a08046f640961efcc0e7643768916403e72e70"},
-    {url = "https://files.pythonhosted.org/packages/2e/44/7a43f55b5c766bed015eafe75394782457df76037d9c4666f3990ce76b85/pyzmq-25.0.1-cp39-cp39-win32.whl", hash = "sha256:f6b45db9de4c8adbf5fda58e827a32315d282cfb01e54dc74e7c7ccc0988c010"},
-    {url = "https://files.pythonhosted.org/packages/35/30/0d5a8d94eb37422de270ff3faccdbcfa450eac0c53a4df64025cff572deb/pyzmq-25.0.1-cp36-cp36m-win_amd64.whl", hash = "sha256:ec29c880b82cd38a63810a93b77e13f167e05732049101947772eed9ae805097"},
-    {url = "https://files.pythonhosted.org/packages/35/da/dabf30c902b0ef568a859f11c44ec665396e96eb78b62b1020b9032df145/pyzmq-25.0.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f29709b0431668a967d7ff0394b00a865e7b7dde827ee0a47938b705b7c4aec3"},
-    {url = "https://files.pythonhosted.org/packages/38/96/9d14183dcd63c094a83559fb6f8f5527c8cdd8d6146ed7efadc7fb68712d/pyzmq-25.0.1-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:6d988844ed6caa21b0076b64671e83a136d93c57f1ae5a72b915661af55d313b"},
-    {url = "https://files.pythonhosted.org/packages/3e/84/62275af4fb5cc72dcbda524cd7603ca5e9201b89fdbbfc6180aca4c44fd3/pyzmq-25.0.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f3b7032f55b1ed2cd8c349a89e467dca2338b7765fab82cb64c3504e49adaf51"},
-    {url = "https://files.pythonhosted.org/packages/4c/cb/aea08207853213b4b0bd303591a193b4a6c77e9ad23d28f897c24079026d/pyzmq-25.0.1-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:c99fd8d3efc138d6a7fb1e822133f62bb18ffec66dc6d398dcb2ac2ab8eb2cb0"},
-    {url = "https://files.pythonhosted.org/packages/4e/16/baf1379607bd187f52bf44dc8a55cb3afbd9df9381497ed931198e8ab1e9/pyzmq-25.0.1-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:960f98f562ee6a50ecf283bc62479d00f5ee10e9068a21683b9e961cd87c9261"},
-    {url = "https://files.pythonhosted.org/packages/4f/32/b49fdae034eb2aeed310f726a183d75c1c102d70e697e5d400bdbdf2fc8f/pyzmq-25.0.1-cp39-cp39-win_amd64.whl", hash = "sha256:47eeb94b78aa442568b85ad28f85bd37a9c3c34d052cbf8ebf8622c45f23a9cd"},
-    {url = "https://files.pythonhosted.org/packages/57/21/10fa82bd25c47d4a36d93c19d4ab48581405238d81b5c7dc32b53e7af3f7/pyzmq-25.0.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:a1a107e89cdcf799060ba4fa85fd3c942e19df7b24eb2600618b2406cc73c18e"},
-    {url = "https://files.pythonhosted.org/packages/57/ab/cdf4bc522a03b5a01c99687450c8cf883c17df98eee05c821608eaf1edc3/pyzmq-25.0.1-cp310-cp310-manylinux_2_28_x86_64.whl", hash = "sha256:a3309b2c5a5be3d48c9ade77b340361764449aa22854ac65935b1e6c0cdabe2c"},
-    {url = "https://files.pythonhosted.org/packages/59/5b/2e1b7498b4a3118bf03b65c16dba9acbe9112f48415a16ae814894033f6a/pyzmq-25.0.1.tar.gz", hash = "sha256:44a24f7ce44e70d20e2a4c9ba5af70b4611df7a4b920eed2c8e0bdd5a5af225f"},
-    {url = "https://files.pythonhosted.org/packages/59/d4/085b5b955d37026be05c6361e97c201ea359a01db15203b73631be01f3bc/pyzmq-25.0.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:95aff52fc847ea5755d2370f86e379ba2ed6eb67a0a6f90f0e8e99c553693b81"},
-    {url = "https://files.pythonhosted.org/packages/5a/7a/2935bdf6183bc64fac822729eec63451fbca1f941bf6a9eb0da4dcba0209/pyzmq-25.0.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:c5eb4b17d73b1fc208a4faa6b5918983ccc961770aa37741891f61db302dae4e"},
-    {url = "https://files.pythonhosted.org/packages/5b/b3/27c817b447092a685d0f1db87bf6fbb214acd88fa577f2b23310d35637fc/pyzmq-25.0.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:57be375c6bc66b0f685cd298e5c1c3d7ee34a254145b8087aed6e25db372b0f3"},
-    {url = "https://files.pythonhosted.org/packages/63/b0/38493bdaa885bb1508a9fce9a45d6937ecb744c0e87c1e63da19802e8b57/pyzmq-25.0.1-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4fee9420b34c0ab426f105926a701a3d73f878fe77f07a1b92e0b78d1e2c795c"},
-    {url = "https://files.pythonhosted.org/packages/67/4f/6afcf0b93412f4c72734cf11e68cdfdd323e7cd3470702a43ba8e0298d15/pyzmq-25.0.1-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:649dd55948144a108041397f07c1299086ce1c85c2e166831db3a33dac1d0c7f"},
-    {url = "https://files.pythonhosted.org/packages/6a/ba/a27e4e2767c5c680737f9765d04dc2cf5e537482eccafbbb1c0327eba4e3/pyzmq-25.0.1-cp310-cp310-win32.whl", hash = "sha256:c462f70dadbd4649e572ca7cd1e7cf3305a8c2afc53b84214c0a7c0c3af8a657"},
-    {url = "https://files.pythonhosted.org/packages/73/52/7ce183ed0e57ce668e47749bc7fda87cae38348621c048fa99ffb73074c0/pyzmq-25.0.1-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8cff159b21438c24476a49865f3d5700c9cc5833600661bc0e672decec2ff357"},
-    {url = "https://files.pythonhosted.org/packages/73/7a/947a29186f3ef3c2c62ae969df49439664c1d8d0b37fa63b799ac216d292/pyzmq-25.0.1-cp39-cp39-macosx_10_15_universal2.whl", hash = "sha256:58207a6709e53b723105bac6bb3c6795ee134f7e71351f39c09d52ac235c6b0d"},
-    {url = "https://files.pythonhosted.org/packages/74/ed/afb6797e74e61601a5692c85323606806943c93688b7fb149e5fcb59667c/pyzmq-25.0.1-cp38-cp38-macosx_10_15_universal2.whl", hash = "sha256:1003bbae89435eadec03b4fa3bb6516dd1529fb09ae5704284f7400cc77009ba"},
-    {url = "https://files.pythonhosted.org/packages/74/fd/43cd0730968913245dfc449ee3b4ef18f829b1d5cff1ac5e3cd38073b2e1/pyzmq-25.0.1-pp38-pypy38_pp73-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:c3f78fa80780e24d294f9421123cb3bd3b68677953c53da85273a22d1c983298"},
-    {url = "https://files.pythonhosted.org/packages/75/82/c46903774771bc17a0a1cedace935a7a1bdf9da8ed306a204e6c8d9a9753/pyzmq-25.0.1-pp38-pypy38_pp73-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:d78f840d88244272fb7252e47522b1179833aff7ec64583bda3d21259c9c2c20"},
-    {url = "https://files.pythonhosted.org/packages/7c/e2/43a2db0c26fb99704c34e0e83351ed5cf9bc9757543367521a95b134d4d0/pyzmq-25.0.1-cp38-cp38-win_amd64.whl", hash = "sha256:6eca6b90c4fb290efd27582780b5eaf048887a32b2c5fcd6330819192cb07b38"},
-    {url = "https://files.pythonhosted.org/packages/7c/e3/c6a0c3ff813c020fa78104a931dae5be1799c5a01f6b551facabb5b6f537/pyzmq-25.0.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:f0399450d970990705ce47ed65f5efed3e4627dfc80628c3798100e7b72e023b"},
-    {url = "https://files.pythonhosted.org/packages/7d/94/401779dd6705a507b0dd18b918320b06323bd450ca6000825ac00381fbe1/pyzmq-25.0.1-cp310-cp310-macosx_10_15_universal2.whl", hash = "sha256:94f65e13e6df035b0ae90d49adfe7891aa4e7bdeaa65265729fecc04ab3eb0fe"},
-    {url = "https://files.pythonhosted.org/packages/80/c4/a2c8435348d4f57df4f41702df1e7f7bfa5190ecee4d41dd0d2e91149c8c/pyzmq-25.0.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:7574d24579e83ee8c5d3b14769e7ba895161c43a601e911dd89d449e545e00ad"},
-    {url = "https://files.pythonhosted.org/packages/82/28/18a6479a401e3b2a1e259712e6f2fee28b8587d4c01345441d987a463e19/pyzmq-25.0.1-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:9c44e9f04f8ed99c6f2e9e49f29d400d7557dd9e9e3f64e1e8a595aedc4258a2"},
-    {url = "https://files.pythonhosted.org/packages/82/5d/ad663d3b09d7f57f9a6fb1766c02f6e2905caffb30b79fbf8e0a5d48d8f0/pyzmq-25.0.1-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:0ed7475f3adf0c7750d75740b3267947b501a33f4625ceae709fda2e75ec9ed7"},
-    {url = "https://files.pythonhosted.org/packages/83/fc/c3f07df944e4c285aea6d4a2b3c6f4d9dedc8272d1a160c9f30012868355/pyzmq-25.0.1-cp37-cp37m-win_amd64.whl", hash = "sha256:f66ee27a0221771bbaa2cce456e8ca890569c3d18b08b955eb6420c12516537c"},
-    {url = "https://files.pythonhosted.org/packages/84/b7/67f3b2eb596ff232e8bef6146880e061f36f6212952dd349ff1ef348fd7c/pyzmq-25.0.1-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:c4bdf1241886d39d816535d3ef9fc325bbf02470c9fd5f2cb62706eeb834f7f2"},
-    {url = "https://files.pythonhosted.org/packages/85/96/7322813792e1d31d6b95674450d39eda92bbe7f44d4ebe088b38ba0d99b4/pyzmq-25.0.1-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4f6de4305e02560111a5d4555758faa85d44a5bff70cccff58dbf30c81a079f0"},
-    {url = "https://files.pythonhosted.org/packages/8c/9c/3306f2cda3b02cec652d5e173032d96fe757288145d7df68ba8d482443bc/pyzmq-25.0.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b55366e6c11e1ef7403d072b9867b62cf63eebd31dd038ef65bc8d65572854f6"},
-    {url = "https://files.pythonhosted.org/packages/94/a8/8fc28972204ec8c47fb496460d1e9b711a57fb79a1f2a8983c82a44a40b7/pyzmq-25.0.1-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:b1cf4becd15669bc62a41c1b1bb742e22ac25965134e4254cde82a4dc2554b1b"},
-    {url = "https://files.pythonhosted.org/packages/94/f0/305bb6771ec694711c31e78f1eb8f368f35b941d2a757441015cc8c6a585/pyzmq-25.0.1-pp37-pypy37_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:20aea31cc0d1f6c3fb4685db08b4c771545cf3fed3c4b4c8942c0a4e97042ec8"},
-    {url = "https://files.pythonhosted.org/packages/98/d3/477f58095f58c8d5c3a7ee30dc9fbe905380d4efbe92fbb0988aff40a090/pyzmq-25.0.1-cp39-cp39-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:c635d1c40d341835066931a018e378428dfbe0347ed4bb45a6b57f7d8c34196e"},
-    {url = "https://files.pythonhosted.org/packages/a4/60/e25de64de90b29b9da06ee489f05f93dda388a9688cd6b533eeb4ce9db36/pyzmq-25.0.1-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:44db5162a6881f7d740dec65917f38f9bfbc5ad9a10e06d7d5deebb27eb63939"},
-    {url = "https://files.pythonhosted.org/packages/a4/aa/f53cfd11c4197ddccccef7315d23ba501ab0017f7d10bc15bf81fdfb6d47/pyzmq-25.0.1-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:b1c03b942557bb366fd3dc377a15763d5d688de1328228136c75e50f968333cc"},
-    {url = "https://files.pythonhosted.org/packages/ab/43/11c8bb6a7ecfaacc41144106f6b93a3746d7013371652568dbda985b222b/pyzmq-25.0.1-cp38-cp38-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:e37a764cbf91c1ed9a02e4fede79a414284aca2a0b7d92d82a3c7b82d678ec2d"},
-    {url = "https://files.pythonhosted.org/packages/ac/53/bfe3013e69ff305f024f53f1d63195b880333dbde7b1444a031c8fc7c253/pyzmq-25.0.1-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:34a1b1a8ce9b20e01aba71b9279d9b1d4e5980a6a4e42092180e16628a444ca1"},
-    {url = "https://files.pythonhosted.org/packages/ad/24/f6bbde8486448d73c6d2415c046818cbde5294554a4d7fdbc3e7233ae210/pyzmq-25.0.1-cp311-cp311-macosx_10_15_universal2.whl", hash = "sha256:b0a0fcf56279b9f3acc9b36a83feb7640c51b0db444b6870e4406d002be1d514"},
-    {url = "https://files.pythonhosted.org/packages/b0/ad/a045cf505d37455baecd664e02a72e1ca08c35550c0fbda807acec5e6a60/pyzmq-25.0.1-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:3549292d65987e422e2c9f105b1485448381f489d8a6b6b040fc8b8f497bd578"},
-    {url = "https://files.pythonhosted.org/packages/b5/a7/43e6ed24269ae67c77af6ccc698709d3ded7b02e27c5a9c4df2d37f4c6de/pyzmq-25.0.1-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:446acbac24427ef42bff61a807ddcad8d03df78fb976184a4d7d6f4b1e7d8a67"},
-    {url = "https://files.pythonhosted.org/packages/b8/70/c8dd3c4bcd1e3ec5df2b8818817e27986fa7e5df0f3b164b6b97ac49017d/pyzmq-25.0.1-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:041d617091258133e602919b28fdce4d3e2f8aedcd1e8b34c599653bc288d59e"},
-    {url = "https://files.pythonhosted.org/packages/bb/03/de7f1456a11c407fa6318c60b4a88eaba36af5399cca47d45c4ea523a4da/pyzmq-25.0.1-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:4e8a5ced9d92837f52ccdae6351c627b5012669727bc3eede2dc0f581eca1d0e"},
-    {url = "https://files.pythonhosted.org/packages/bd/9e/ed8664561ba71e2c5a2b569c36baa5ebbc129965e89771041d2b2b92c80d/pyzmq-25.0.1-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:036dbf8373aed4ccf56d58c561b23601b8f33919ec1093d8c77b37ac1259702d"},
-    {url = "https://files.pythonhosted.org/packages/be/69/301e250f03983fe8341a510247ca5335db596dea2a944b4176f4374d76c2/pyzmq-25.0.1-cp311-cp311-win32.whl", hash = "sha256:0f22ba4e9041549a5a3f5a545169dda52fa0aa7b5ef46b336cbe6679c4c3c134"},
-    {url = "https://files.pythonhosted.org/packages/c5/8f/7046ac760496caeab44d83380db872a0f87ec636889b1ab464cb3abda34d/pyzmq-25.0.1-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:5b1ca8b0df50d1ac88857ffe9ebd1347e0a5bb5f6e1d99940fdd7df0ffdefb49"},
-    {url = "https://files.pythonhosted.org/packages/ca/41/f8cf6d3174c9843bb3b606e607ed8b7259b511a9bf3ab747574fa5468a36/pyzmq-25.0.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:0241a334e39aa74e4ba0ae5f9e29521f1b48b8d56bf707f25f322c04eb423e99"},
-    {url = "https://files.pythonhosted.org/packages/cf/5d/588d65e743f6aaa4d5978e7c98ae0e4b12876175408af5df383b62f94641/pyzmq-25.0.1-cp37-cp37m-win32.whl", hash = "sha256:6ff37f2b818df25c887fd40bb434569db7ff66b35f5dfff6f40cc476aee92e3f"},
-    {url = "https://files.pythonhosted.org/packages/cf/cd/28f3437c6b6106d0dbb200da97f020e56cb9cf35b2b8c0e735e6fa0a068a/pyzmq-25.0.1-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:40d909bdc8a2d64ad260925154712602ee6a0425ae0b08bce78a19adfdc2f05b"},
-    {url = "https://files.pythonhosted.org/packages/d2/e4/75c103fad61978d72c77b60d9c8d75226f795f6582e12da48c77541fe2d0/pyzmq-25.0.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:dde7a65a8bfa88aa1721add504320f8344272542291ce4e7c77993fa32901567"},
-    {url = "https://files.pythonhosted.org/packages/d9/58/2eeaca9726faf5cf867e97a570c8603bff20796d8ce57f0b4a81b47a25a3/pyzmq-25.0.1-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:20b6155429d3b57e9e7bd11f1680985ef8b5b0868f1a64073fb8c01326c7c80c"},
-    {url = "https://files.pythonhosted.org/packages/da/0b/17fd74c8bd60c3a7f9f37be06a6632384a7510ece925bb5a577312f5296e/pyzmq-25.0.1-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:58d5dfec2e2befd09b04c4683b3c984d2203cf6e054d0f9786be3826737ad612"},
-    {url = "https://files.pythonhosted.org/packages/dd/a0/136cc7fffa5c1dbf67bbd6b60f4771d6127913fa54ec2e4166539cd40603/pyzmq-25.0.1-pp39-pypy39_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4cc47652d990de9ef967c494c526d73920ef064fef0444355a7cebec6fc50542"},
-    {url = "https://files.pythonhosted.org/packages/de/85/4b0979731f4037343bfe9117d96252ea855a1e1254cccad36a7117ddb717/pyzmq-25.0.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:9d5eb6e88ae8a8734f239ffe1ed90559a426cf5b859b8ee66e0cd43fc5daf5c9"},
-    {url = "https://files.pythonhosted.org/packages/e1/69/36548cbc7bcaae06cb7abed7da93639afbcc4fb420f788d5450c769dde9c/pyzmq-25.0.1-pp37-pypy37_pp73-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:6d09c22ed4d0afcc662d17c2429a03fc1fae7fe7e3bc1f413e744bccfeaabdc3"},
-    {url = "https://files.pythonhosted.org/packages/e1/b0/9b049b93c37f0eca8eb78b389d882d8dd6435e8cdeab5c9e4030337c11fa/pyzmq-25.0.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:7897ba8c3fedc6b3023bad676ceb69dbf90c077ff18ae3133ba43db47417cc72"},
-    {url = "https://files.pythonhosted.org/packages/e5/cf/4e7f5a2771bda62382db111f2af56968f775875e0e01ca4d7326a2ce9289/pyzmq-25.0.1-cp38-cp38-win32.whl", hash = "sha256:cba6b81b653d789d76e438c2e77b49f610b23e84b3bb43b99100f08a0a5d637b"},
-    {url = "https://files.pythonhosted.org/packages/ec/99/f47151dcf8d415d610868b7e1f732e298eb1e4ba6be645814edfe5508680/pyzmq-25.0.1-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:625759a0112af7c3fb560de5724d749729f00b901f7625d1a3f3fb38897544b1"},
-    {url = "https://files.pythonhosted.org/packages/fa/b7/5dbb485b163f953247d6fd7d496c77d59da1c06384df243aa99e2027ea7b/pyzmq-25.0.1-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:1e448a5a294958e915a7e1b664e6fbfcd3814989d381fb068673317f6f3ea3f8"},
-    {url = "https://files.pythonhosted.org/packages/fd/ba/93e905e99206253634ced11d083d023a06eca21b8405d6c6b855bd0d8c9e/pyzmq-25.0.1-cp36-cp36m-win32.whl", hash = "sha256:866a4e918f1f4b2f83e9982b817df257910e3e50e456ffa74f141a10adcd11d1"},
+"pyzmq 25.0.2" = [
+    {url = "https://files.pythonhosted.org/packages/00/69/d5a42be832fff110e55b3f245bb70dcdee6c4cd064eeac2492abd452dfc8/pyzmq-25.0.2-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:b164cc3c8acb3d102e311f2eb6f3c305865ecb377e56adc015cb51f721f1dda6"},
+    {url = "https://files.pythonhosted.org/packages/00/a2/72b840106d96cea129d35fcd6474bf8b7b94ae44a77e6e0b13208b9a7dd8/pyzmq-25.0.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:659e62e1cbb063151c52f5b01a38e1df6b54feccfa3e2509d44c35ca6d7962ee"},
+    {url = "https://files.pythonhosted.org/packages/04/f1/feaf5d091173036ddbebbe0657453b122de167fd055e8d94a76aff862e99/pyzmq-25.0.2-cp38-cp38-win_amd64.whl", hash = "sha256:8560756318ec7c4c49d2c341012167e704b5a46d9034905853c3d1ade4f55bee"},
+    {url = "https://files.pythonhosted.org/packages/0e/61/c1411573d0bead3e385c35a93efd359d8a893b7bdc89104b679b83b6cf9d/pyzmq-25.0.2-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:56a94ab1d12af982b55ca96c6853db6ac85505e820d9458ac76364c1998972f4"},
+    {url = "https://files.pythonhosted.org/packages/0e/71/254fa407de7f41e018cd4c594c695bcfcae78ef74ddd854ea7a71acbdd1b/pyzmq-25.0.2-pp37-pypy37_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ffc71111433bd6ec8607a37b9211f4ef42e3d3b271c6d76c813669834764b248"},
+    {url = "https://files.pythonhosted.org/packages/11/be/42b11d891abc376eecd8732b3bba8102a9845528c21326cb7f114bf9b7a2/pyzmq-25.0.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:54a96cf77684a3a537b76acfa7237b1e79a8f8d14e7f00e0171a94b346c5293e"},
+    {url = "https://files.pythonhosted.org/packages/11/c2/4466838ef6920fe7a489a6f292ecfa563b1127125d7a481b56fbdaeaaeee/pyzmq-25.0.2-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:eef2a0b880ab40aca5a878933376cb6c1ec483fba72f7f34e015c0f675c90b20"},
+    {url = "https://files.pythonhosted.org/packages/1a/98/c97a06df9403a2e14f24a420b9b2ee6ba618535bbb1d328f6149788add80/pyzmq-25.0.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:88649b19ede1cab03b96b66c364cbbf17c953615cdbc844f7f6e5f14c5e5261c"},
+    {url = "https://files.pythonhosted.org/packages/1a/e5/2cfa142fa455a9d935a699f45396a9b2a3dff152d272472c1c4f1ef8a302/pyzmq-25.0.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:312b3f0f066b4f1d17383aae509bacf833ccaf591184a1f3c7a1661c085063ae"},
+    {url = "https://files.pythonhosted.org/packages/1b/c4/d4ff0ddfb2a029d1237833f2e1d2d0264c9214da82152db2ed655a71d22f/pyzmq-25.0.2-cp39-cp39-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:5eaeae038c68748082137d6896d5c4db7927e9349237ded08ee1bbd94f7361c9"},
+    {url = "https://files.pythonhosted.org/packages/1c/35/006d8734ff4b15b462da1e7c5f50d5e70d5764dda14894e682ca12172617/pyzmq-25.0.2-cp311-cp311-win_amd64.whl", hash = "sha256:ed15e3a2c3c2398e6ae5ce86d6a31b452dfd6ad4cd5d312596b30929c4b6e182"},
+    {url = "https://files.pythonhosted.org/packages/1d/4d/7f16d65c93c42151cb351c4ecd260885637b21ae44f5fc8aee25e1e7b891/pyzmq-25.0.2-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:1f124cb73f1aa6654d31b183810febc8505fd0c597afa127c4f40076be4574e0"},
+    {url = "https://files.pythonhosted.org/packages/1f/78/6d4ab40ae50981c2d2247042a8f7e02ffc6e6c2d615abd0ddc9de19adb8f/pyzmq-25.0.2-cp38-cp38-win32.whl", hash = "sha256:ad761cfbe477236802a7ab2c080d268c95e784fe30cafa7e055aacd1ca877eb0"},
+    {url = "https://files.pythonhosted.org/packages/1f/fc/1156c99710e255199e1c360dd33caa6df7c39b20af1798baabc47f1d04c7/pyzmq-25.0.2-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b491998ef886662c1f3d49ea2198055a9a536ddf7430b051b21054f2a5831800"},
+    {url = "https://files.pythonhosted.org/packages/25/7d/8ad2871dc8a0d6f698567d9fd0879e777c8eed8cbf79641af27bc0ae6e64/pyzmq-25.0.2-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:85762712b74c7bd18e340c3639d1bf2f23735a998d63f46bb6584d904b5e401d"},
+    {url = "https://files.pythonhosted.org/packages/2c/40/4416c93f5a33ea2b0432435e1f4b4b08779f90ca48fb768b38c85f1059c4/pyzmq-25.0.2-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:77942243ff4d14d90c11b2afd8ee6c039b45a0be4e53fb6fa7f5e4fd0b59da39"},
+    {url = "https://files.pythonhosted.org/packages/30/8c/548bd091bbace5ce0463f74471f8fc5d73cd68df8e77d6114e5f2325e52b/pyzmq-25.0.2-cp310-cp310-macosx_10_15_universal2.whl", hash = "sha256:ac178e666c097c8d3deb5097b58cd1316092fc43e8ef5b5fdb259b51da7e7315"},
+    {url = "https://files.pythonhosted.org/packages/34/2f/d9ff6f3e013b08262a75ba45dceb919a29d717c125cb3bd89f998c107c30/pyzmq-25.0.2-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:d488c5c8630f7e782e800869f82744c3aca4aca62c63232e5d8c490d3d66956a"},
+    {url = "https://files.pythonhosted.org/packages/39/c9/52bb45a31aa8d599ee550ae6d5513eea9bfaf9e5a22059866afc92a436cc/pyzmq-25.0.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:38d9f78d69bcdeec0c11e0feb3bc70f36f9b8c44fc06e5d06d91dc0a21b453c7"},
+    {url = "https://files.pythonhosted.org/packages/3b/7b/ab80936bf784fa47a6c3c1741dd1629da82a6b792ba2364f9c3dfdf2d514/pyzmq-25.0.2-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:abbce982a17c88d2312ec2cf7673985d444f1beaac6e8189424e0a0e0448dbb3"},
+    {url = "https://files.pythonhosted.org/packages/3f/b9/1db5cec9e87a8757eeab755c8495b01cbc0f035dd0ec62bfb7ca31651585/pyzmq-25.0.2-pp37-pypy37_pp73-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:62ec8d979f56c0053a92b2b6a10ff54b9ec8a4f187db2b6ec31ee3dd6d3ca6e2"},
+    {url = "https://files.pythonhosted.org/packages/40/dd/1fe1f11eb03d177a141188c80d1134f64146db3c5cecbcf4054817a2f8af/pyzmq-25.0.2-cp37-cp37m-win_amd64.whl", hash = "sha256:9bdc40efb679b9dcc39c06d25629e55581e4c4f7870a5e88db4f1c51ce25e20d"},
+    {url = "https://files.pythonhosted.org/packages/42/15/08baebe67f802b57d93410a1bf671917cbb4904dc63836b174f4c210bbbc/pyzmq-25.0.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:6a979e59d2184a0c8f2ede4b0810cbdd86b64d99d9cc8a023929e40dce7c86cc"},
+    {url = "https://files.pythonhosted.org/packages/44/60/008c3bbed1b0ddd02ec94a3b87bc7c0d211fe03f9af5041cc903c7e0e30b/pyzmq-25.0.2-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:cb1f69a0a2a2b1aae8412979dd6293cc6bcddd4439bf07e4758d864ddb112354"},
+    {url = "https://files.pythonhosted.org/packages/44/8c/77ea7002cfb3218dfbacb8cc64fa6d97b203dffdfde91e1e269ae8753b7c/pyzmq-25.0.2-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:531e36d9fcd66f18de27434a25b51d137eb546931033f392e85674c7a7cea853"},
+    {url = "https://files.pythonhosted.org/packages/49/0b/a3c5da5348b21016d5bb7a84751094d2b837e2945d73315948c0cd60afda/pyzmq-25.0.2-cp39-cp39-win32.whl", hash = "sha256:83d822e8687621bed87404afc1c03d83fa2ce39733d54c2fd52d8829edb8a7ff"},
+    {url = "https://files.pythonhosted.org/packages/49/90/d355798b0303036e9c085f87fc841db17d175a52238e19e9585b79e70a88/pyzmq-25.0.2-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:a35960c8b2f63e4ef67fd6731851030df68e4b617a6715dd11b4b10312d19fef"},
+    {url = "https://files.pythonhosted.org/packages/4a/8e/5db2324716cb9c7786e69d1289c515d46938ff8e12975945454fbc4c76b2/pyzmq-25.0.2-cp36-cp36m-win_amd64.whl", hash = "sha256:2da6813b7995b6b1d1307329c73d3e3be2fd2d78e19acfc4eff2e27262732388"},
+    {url = "https://files.pythonhosted.org/packages/4f/d8/6fb691b41925281d1c5ad9761320beddaf6fbf716fbe799b2458c1190d6f/pyzmq-25.0.2-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:edbbf06cc2719889470a8d2bf5072bb00f423e12de0eb9ffec946c2c9748e149"},
+    {url = "https://files.pythonhosted.org/packages/51/bc/78d96eb822a3a9798752bebf8a1cfb29a22549bd99861fee467a4d6b6d2c/pyzmq-25.0.2-pp38-pypy38_pp73-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:25e6873a70ad5aa31e4a7c41e5e8c709296edef4a92313e1cd5fc87bbd1874e2"},
+    {url = "https://files.pythonhosted.org/packages/56/81/0186f36a022cb61bf0cd2bd7abee27d2cc293c5aa000c48a3dfff5d96e63/pyzmq-25.0.2-cp36-cp36m-win32.whl", hash = "sha256:c8fedc3ccd62c6b77dfe6f43802057a803a411ee96f14e946f4a76ec4ed0e117"},
+    {url = "https://files.pythonhosted.org/packages/58/6f/2c08c1a7b89cf7b269ef35ab4cbcaed331fb4db042a9cfc2e83e112fcfce/pyzmq-25.0.2-cp311-cp311-macosx_10_15_universal2.whl", hash = "sha256:9af0bb0277e92f41af35e991c242c9c71920169d6aa53ade7e444f338f4c8128"},
+    {url = "https://files.pythonhosted.org/packages/58/cf/389676efe51bcd797e81bba7a9f57a562fd607f12d48019c3169a519bce5/pyzmq-25.0.2-cp310-cp310-manylinux_2_28_x86_64.whl", hash = "sha256:827bf60e749e78acb408a6c5af6688efbc9993e44ecc792b036ec2f4b4acf485"},
+    {url = "https://files.pythonhosted.org/packages/61/3b/264367b8629ae9e1d2f87badaeb48fa1337bc7af2d2332fb378236cda78b/pyzmq-25.0.2-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:374b55516393bfd4d7a7daa6c3b36d6dd6a31ff9d2adad0838cd6a203125e714"},
+    {url = "https://files.pythonhosted.org/packages/62/ec/d08affa2a26627b58245897128e50d744effcf688dd340b372a15e765284/pyzmq-25.0.2-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:26b0358e8933990502f4513c991c9935b6c06af01787a36d133b7c39b1df37fa"},
+    {url = "https://files.pythonhosted.org/packages/64/c6/60014a6b61ecd5b6ba9939925856f5e8b483406b30362860e4f085b3b410/pyzmq-25.0.2-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:cfb9f7eae02d3ac42fbedad30006b7407c984a0eb4189a1322241a20944d61e5"},
+    {url = "https://files.pythonhosted.org/packages/66/7e/d5dcdb2a0917b0fa778f63c39122bf0ccb56bbf1cad6026303a5e15428cb/pyzmq-25.0.2-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b733076ff46e7db5504c5e7284f04a9852c63214c74688bdb6135808531755a3"},
+    {url = "https://files.pythonhosted.org/packages/69/62/281d35f31b14586f058a152ea4252b65bfc9edc582bd49b19c8e96b39668/pyzmq-25.0.2-cp311-cp311-win32.whl", hash = "sha256:5c5fbb229e40a89a2fe73d0c1181916f31e30f253cb2d6d91bea7927c2e18413"},
+    {url = "https://files.pythonhosted.org/packages/6a/ff/948a303123b2384fa937bacc710600ff8302ba0a83a9c0701c09c3a8e95e/pyzmq-25.0.2-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:67da1c213fbd208906ab3470cfff1ee0048838365135a9bddc7b40b11e6d6c89"},
+    {url = "https://files.pythonhosted.org/packages/6b/b4/7f831f659c85c0bb790f3cea429eccfd3c2d4cfbcb151f7bc6de8c8bc98e/pyzmq-25.0.2-pp38-pypy38_pp73-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:f7c8b8368e84381ae7c57f1f5283b029c888504aaf4949c32e6e6fb256ec9bf0"},
+    {url = "https://files.pythonhosted.org/packages/6d/bb/326142f92ea7e1322fcc2ffcb209bd13412175149b7bb6862fb6a6f613be/pyzmq-25.0.2-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:08bfcc21b5997a9be4fefa405341320d8e7f19b4d684fb9c0580255c5bd6d695"},
+    {url = "https://files.pythonhosted.org/packages/74/7a/9599e16f92e5fc943d951755ba5b5c21e469837f7e5149ea68b8a26a9309/pyzmq-25.0.2-cp310-cp310-win32.whl", hash = "sha256:24abbfdbb75ac5039205e72d6c75f10fc39d925f2df8ff21ebc74179488ebfca"},
+    {url = "https://files.pythonhosted.org/packages/74/a8/819195fd76ab510d4aa6dd7f8fbd8d21d78787797b82d6b78b69c9d18cf7/pyzmq-25.0.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a2e92ff20ad5d13266bc999a29ed29a3b5b101c21fdf4b2cf420c09db9fb690e"},
+    {url = "https://files.pythonhosted.org/packages/77/db/9b052bdaa32c17dc71e12c43c9fe07bc5aa1dd703773a3a148e80f75a0f0/pyzmq-25.0.2-cp39-cp39-win_amd64.whl", hash = "sha256:24683285cc6b7bf18ad37d75b9db0e0fefe58404e7001f1d82bf9e721806daa7"},
+    {url = "https://files.pythonhosted.org/packages/78/5f/bb6fe425a603c49c4c72eae1a43747cd60525bc10ec2fb7b4164c21ebc1c/pyzmq-25.0.2-cp37-cp37m-win32.whl", hash = "sha256:dd771a440effa1c36d3523bc6ba4e54ff5d2e54b4adcc1e060d8f3ca3721d228"},
+    {url = "https://files.pythonhosted.org/packages/78/b3/22a3e12d0224055676497f60e353b2914b7296cac3fda0bb04292ebfd1c8/pyzmq-25.0.2-cp38-cp38-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:9e1d2f2d86fc75ed7f8845a992c5f6f1ab5db99747fb0d78b5e4046d041164d2"},
+    {url = "https://files.pythonhosted.org/packages/7e/d0/94367b6680500eafd1417e3b6b9a896e5eb963f5cb26c3d4e5ea29d67ca6/pyzmq-25.0.2-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:3059a6a534c910e1d5d068df42f60d434f79e6cc6285aa469b384fa921f78cf8"},
+    {url = "https://files.pythonhosted.org/packages/8a/95/e5d948d2a21d7941e189b58646c78b23b278333744e251aecd576bf6b5ea/pyzmq-25.0.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:21ec0bf4831988af43c8d66ba3ccd81af2c5e793e1bf6790eb2d50e27b3c570a"},
+    {url = "https://files.pythonhosted.org/packages/8d/8d/f41575d2cbd7322a103bb79b67bf35cc5f3a9d9a51c7375e58c1ba728125/pyzmq-25.0.2-cp310-cp310-win_amd64.whl", hash = "sha256:6a821a506822fac55d2df2085a52530f68ab15ceed12d63539adc32bd4410f6e"},
+    {url = "https://files.pythonhosted.org/packages/8e/ad/bf8bed79cf196d1387247f3f6bf7c9ba6899136d05c4b4166a2cab145d7b/pyzmq-25.0.2-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:1a843d26a8da1b752c74bc019c7b20e6791ee813cd6877449e6a1415589d22ff"},
+    {url = "https://files.pythonhosted.org/packages/8f/aa/89ae1727f702f3d39a63817d5ecfcec1c79708921bf22766bf0a74f2ffe2/pyzmq-25.0.2-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a9b5eeb5278a8a636bb0abdd9ff5076bcbb836cd2302565df53ff1fa7d106d54"},
+    {url = "https://files.pythonhosted.org/packages/94/67/198abec2cf31aa0ad2fad8fb5cd514c38e76bb77ed329878cb9e7bc489f7/pyzmq-25.0.2-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:64812f29d6eee565e129ca14b0c785744bfff679a4727137484101b34602d1a7"},
+    {url = "https://files.pythonhosted.org/packages/94/c4/69bc2d6548592ece02b4a9cedf13d5f5c76938e5e626a3993b28290df663/pyzmq-25.0.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:7b504ae43d37e282301da586529e2ded8b36d4ee2cd5e6db4386724ddeaa6bbc"},
+    {url = "https://files.pythonhosted.org/packages/99/37/b3162a1ead5b457aa1e10c0f9ce851c21259d5509d3035d2225c913ecc5f/pyzmq-25.0.2-pp39-pypy39_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:34a6fddd159ff38aa9497b2e342a559f142ab365576284bc8f77cb3ead1f79c5"},
+    {url = "https://files.pythonhosted.org/packages/a2/8f/b61a9263a90741427e0f187830522236f8c975c0ea07a60f645c380cdf05/pyzmq-25.0.2-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:032f5c8483c85bf9c9ca0593a11c7c749d734ce68d435e38c3f72e759b98b3c9"},
+    {url = "https://files.pythonhosted.org/packages/a4/fe/c72de942ec49e74dc34305d402ca72b66de100a5c7b36f6998f14e26f727/pyzmq-25.0.2-pp37-pypy37_pp73-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:affec1470351178e892121b3414c8ef7803269f207bf9bef85f9a6dd11cde264"},
+    {url = "https://files.pythonhosted.org/packages/a8/98/011f6e194310d9fdfe50ebcd4825cd95c93290a5dbd6bd4d7cb4ebb0d6cb/pyzmq-25.0.2-cp36-cp36m-musllinux_1_1_i686.whl", hash = "sha256:d4427b4a136e3b7f85516c76dd2e0756c22eec4026afb76ca1397152b0ca8145"},
+    {url = "https://files.pythonhosted.org/packages/b7/df/43702a94a2527f6e2767499e4a26a51e2f1171765cb8021a63f22f8fc2c2/pyzmq-25.0.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:ab046e9cb902d1f62c9cc0eca055b1d11108bdc271caf7c2171487298f229b56"},
+    {url = "https://files.pythonhosted.org/packages/b9/39/44e7bc417837e589b2d5fd7382ddb0afdf317cafad9cdf50690e85d8fb35/pyzmq-25.0.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9a2e5fe42dfe6b73ca120b97ac9f34bfa8414feb15e00e37415dbd51cf227ef6"},
+    {url = "https://files.pythonhosted.org/packages/b9/70/1d926d439b5284ba070c7ad9d645737d7ea22e3bee9e3158119f10177d58/pyzmq-25.0.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4a31992a8f8d51663ebf79df0df6a04ffb905063083d682d4380ab8d2c67257c"},
+    {url = "https://files.pythonhosted.org/packages/bb/5e/55c7e055bdbc6a9561d370781da40ab061f96f1b50cfc3b1aca2d591e47e/pyzmq-25.0.2-cp38-cp38-macosx_10_15_universal2.whl", hash = "sha256:1f82906a2d8e4ee310f30487b165e7cc8ed09c009e4502da67178b03083c4ce0"},
+    {url = "https://files.pythonhosted.org/packages/be/39/90ee7e9854f9ac3b8b75d4c05b643a7c412460575ca7aec9776683292d5e/pyzmq-25.0.2-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:b48616a09d7df9dbae2f45a0256eee7b794b903ddc6d8657a9948669b345f220"},
+    {url = "https://files.pythonhosted.org/packages/bf/7f/24a55c3393d54570f26fa8845e8e42e813bf1b7fb668ed5d3de76b71dbe9/pyzmq-25.0.2.tar.gz", hash = "sha256:6b8c1bbb70e868dc88801aa532cae6bd4e3b5233784692b786f17ad2962e5149"},
+    {url = "https://files.pythonhosted.org/packages/c0/4b/f469689fe5f4c84c5f7fc78334853bcc881bc70417cbb00d7bf4b942c15b/pyzmq-25.0.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:cca8524b61c0eaaa3505382dc9b9a3bc8165f1d6c010fdd1452c224225a26689"},
+    {url = "https://files.pythonhosted.org/packages/c2/d5/a7f099bcfb3ddc34be7b3e6184e4888e30f44fd507758c1e7c84e9607f87/pyzmq-25.0.2-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:6fadc60970714d86eff27821f8fb01f8328dd36bebd496b0564a500fe4a9e354"},
+    {url = "https://files.pythonhosted.org/packages/c7/88/8b8dc540b43483cdb7a0b6e095529f9238201b83527b034b97570b78eeaa/pyzmq-25.0.2-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:510d8e55b3a7cd13f8d3e9121edf0a8730b87d925d25298bace29a7e7bc82810"},
+    {url = "https://files.pythonhosted.org/packages/c9/f7/8bf9fcb89bf928301b43b974bdc958ef880eaabfcc45015e5ba6a3a8ed47/pyzmq-25.0.2-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:715cff7644a80a7795953c11b067a75f16eb9fc695a5a53316891ebee7f3c9d5"},
+    {url = "https://files.pythonhosted.org/packages/cb/c3/dd49db945fea3d80320c864db72460b0a3b9148bbf214a92c2b1600b5cf4/pyzmq-25.0.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:2b9c9cc965cdf28381e36da525dcb89fc1571d9c54800fdcd73e3f73a2fc29bd"},
+    {url = "https://files.pythonhosted.org/packages/d0/63/d22d042b276248e0f8d1013a58a65835b48992626a3b327975e7e8a8098b/pyzmq-25.0.2-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:4a4b4261eb8f9ed71f63b9eb0198dd7c934aa3b3972dac586d0ef502ba9ab08b"},
+    {url = "https://files.pythonhosted.org/packages/dc/e9/f08f443681523e4a663831a9cd729339fb8ece39ead61d876cc94ca45f4a/pyzmq-25.0.2-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:5d496815074e3e3d183fe2c7fcea2109ad67b74084c254481f87b64e04e9a471"},
+    {url = "https://files.pythonhosted.org/packages/df/40/309fb581d4500c5b44e0ea4077fc722a160f78b30b2c7153c4bcbc425d18/pyzmq-25.0.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8280ada89010735a12b968ec3ea9a468ac2e04fddcc1cede59cb7f5178783b9c"},
+    {url = "https://files.pythonhosted.org/packages/e6/58/440ee5cd23e35cce9090febede89c934a058becd79874ef5257693024d3a/pyzmq-25.0.2-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:a6f6ae12478fdc26a6d5fdb21f806b08fa5403cd02fd312e4cb5f72df078f96f"},
+    {url = "https://files.pythonhosted.org/packages/e9/73/db392ec0f74043bd50daa7bf26c9cdf4b0359ca59aeb2ee7f677b52cc9dc/pyzmq-25.0.2-cp39-cp39-macosx_10_15_universal2.whl", hash = "sha256:ab2c056ac503f25a63f6c8c6771373e2a711b98b304614151dfb552d3d6c81f6"},
+    {url = "https://files.pythonhosted.org/packages/ec/46/335df4c0f92703886ca0f6670db5291a99813961bf6fab9ea0b1676ca23e/pyzmq-25.0.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:6526d097b75192f228c09d48420854d53dfbc7abbb41b0e26f363ccb26fbc177"},
+    {url = "https://files.pythonhosted.org/packages/f3/e4/47cdac8f73433899e468307ff1a9629a5d4fba4a953592ec3ca83d3016f7/pyzmq-25.0.2-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:269968f2a76c0513490aeb3ba0dc3c77b7c7a11daa894f9d1da88d4a0db09835"},
+    {url = "https://files.pythonhosted.org/packages/f8/ee/4138bfa745cf62ee1d5229bcafca102f15b3e5867cf18645c5bacfb4d7cb/pyzmq-25.0.2-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:28fdb9224a258134784a9cf009b59265a9dde79582fb750d4e88a6bcbc6fa3dc"},
+    {url = "https://files.pythonhosted.org/packages/fe/95/35cab273bd36529dafe7484713be28f1a22a775dc36fa4be7fc1d23eeeb8/pyzmq-25.0.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:65c19a63b4a83ae45d62178b70223adeee5f12f3032726b897431b6553aa25af"},
 ]
 "regex 2022.10.31" = [
     {url = "https://files.pythonhosted.org/packages/00/7e/ab5a54f60e36f4de0610850866b848839a7b02ad4f05755bce429fbc1a5a/regex-2022.10.31-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:763b64853b0a8f4f9cfb41a76a4a85a9bcda7fdda5cb057016e7706fde928e66"},
@@ -4478,6 +4513,7 @@ content_hash = "sha256:99c295c599a759eb30a17013697c0d8ed645d53982b5587cce4072894
     {url = "https://files.pythonhosted.org/packages/65/2b/98e7b76436d8136efcb8ab0976588e553b2a92437b3ea4743c596ef0c65d/topojson-1.5-py2.py3-none-any.whl", hash = "sha256:2fafc9748b15f77c73d6e6a8d4fe3ad2ca7aaf2f316216618baba528412e30c6"},
 ]
 "torch 2.0.0" = [
+    {url = "https://files.pythonhosted.org/packages/21/7a/f43f2f490836dfc2de466dbc86cd75357d9ae3945c084efa290fad15976f/torch-2.0.0-1-cp311-cp311-manylinux2014_aarch64.whl", hash = "sha256:bd42db2a48a20574d2c33489e120e9f32789c4dc13c514b0c44272972d14a2d7"},
     {url = "https://files.pythonhosted.org/packages/25/45/b91c4bf6b4b6325e9c758ef1203978ae5455c71e52054a7aca23befe33df/torch-2.0.0-cp39-cp39-win_amd64.whl", hash = "sha256:c7e67195e1c3e33da53954b026e89a8e1ff3bc1aeb9eb32b677172d4a9b5dcbf"},
     {url = "https://files.pythonhosted.org/packages/36/60/aa7bf18070611e7b019886d34516337ce6a2fe9da60745bc90b448642a10/torch-2.0.0-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:a83b26bd6ae36fbf5fee3d56973d9816e2002e8a3b7d9205531167c28aaa38a7"},
     {url = "https://files.pythonhosted.org/packages/47/1f/0213a42f0e290b3057601bd6f03f54712b1c39bdd014fb4d594455503dfa/torch-2.0.0-cp310-cp310-manylinux2014_aarch64.whl", hash = "sha256:9f01fe1f6263f31bd04e1757946fd63ad531ae37f28bb2dbf66f5c826ee089f4"},
@@ -4492,12 +4528,15 @@ content_hash = "sha256:99c295c599a759eb30a17013697c0d8ed645d53982b5587cce4072894
     {url = "https://files.pythonhosted.org/packages/83/0b/b83dfba34421cfb1fc41583a479fbeaec0733ec9f59465702997d8de5e10/torch-2.0.0-cp311-cp311-manylinux1_x86_64.whl", hash = "sha256:09651bff72e439d004c991f15add0c397c66f98ab36fe60d5514b44e4da722e8"},
     {url = "https://files.pythonhosted.org/packages/87/e2/62dbdfc85d3b8f771bc4b1a979ee6a157dbaa8928981dabbf45afc6d13dc/torch-2.0.0-cp310-cp310-win_amd64.whl", hash = "sha256:527f4ae68df7b8301ee6b1158ca56350282ea633686537b30dbb5d7b4a52622a"},
     {url = "https://files.pythonhosted.org/packages/89/5a/0d017d8d45cc309f9de8e5b8edc9b6b204d8c47936a3f2b84cf01650cf98/torch-2.0.0-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:ec5fff2447663e369682838ff0f82187b4d846057ef4d119a8dea7772a0b17dd"},
+    {url = "https://files.pythonhosted.org/packages/9f/cd/670e5e178db87065ee60f60fb35b040abbb819a1f686a91d9ff799fc5048/torch-2.0.0-1-cp310-cp310-manylinux2014_aarch64.whl", hash = "sha256:c9090bda7d2eeeecd74f51b721420dbeb44f838d4536cc1b284e879417e3064a"},
+    {url = "https://files.pythonhosted.org/packages/ad/b5/449aa2a51b48dc389b50deae7d9260377a5925e63359cd0dd96d7ebc81a9/torch-2.0.0-1-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:8969aa8375bcbc0c2993e7ede0a7f889df9515f18b9b548433f412affed478d9"},
     {url = "https://files.pythonhosted.org/packages/b6/b1/f562cb533751c272d23f605858cd17d6a6c50fa8cd3c1f99539e2acd359f/torch-2.0.0-cp310-cp310-manylinux1_x86_64.whl", hash = "sha256:7a9319a67294ef02459a19738bbfa8727bb5307b822dadd708bc2ccf6c901aca"},
     {url = "https://files.pythonhosted.org/packages/c6/20/8200a1c143aca65c72f820a5e7ba4cb3121ad655ad96c5e88395ba381f1f/torch-2.0.0-cp310-none-macosx_10_9_x86_64.whl", hash = "sha256:ce9b5a49bd513dff7950a5a07d6e26594dd51989cee05ba388b03e8e366fd5d5"},
     {url = "https://files.pythonhosted.org/packages/d7/55/fd0f058d5d7d912a0a360cbb1fbf60940c0589eaa0cc08bcd530cb08b86e/torch-2.0.0-cp39-none-macosx_10_9_x86_64.whl", hash = "sha256:6e0b97beb037a165669c312591f242382e9109a240e20054d5a5782d9236cad0"},
     {url = "https://files.pythonhosted.org/packages/da/c2/cbac2af26537b82c265a4d53330c540e805185ca2272f33a918a3dedc3a0/torch-2.0.0-cp311-cp311-manylinux2014_aarch64.whl", hash = "sha256:d439aec349c98f12819e8564b8c54008e4613dd4428582af0e6e14c24ca85870"},
     {url = "https://files.pythonhosted.org/packages/ee/a9/43610ad590dad7109c3890bf9ffffaea76dab590a0e2cf6d6e957fee4613/torch-2.0.0-cp311-none-macosx_11_0_arm64.whl", hash = "sha256:9a2e53b5783ef5896a6af338b36d782f28e83c8ddfc2ac44b67b066d9d76f498"},
     {url = "https://files.pythonhosted.org/packages/f7/ee/e00f3fab0383fccf8ee1697ba468e0248bd36a9942d00d6c12fb08cb393a/torch-2.0.0-cp38-none-macosx_10_9_x86_64.whl", hash = "sha256:cc788cbbbbc6eb4c90e52c550efd067586c2693092cf367c135b34893a64ae78"},
+    {url = "https://files.pythonhosted.org/packages/fa/f4/c90ede3d6ea4dd0f056c11d9d0bdac2408f51ac7de194539453f3f572a51/torch-2.0.0-1-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:ab2da16567cb55b67ae39e32d520d68ec736191d88ac79526ca5874754c32203"},
 ]
 "torchmetrics 0.11.4" = [
     {url = "https://files.pythonhosted.org/packages/f3/ed/9f76e2d65d2e6d67a0ba097f34f4b618fb7466d731476d3d3440dfe2cb8e/torchmetrics-0.11.4.tar.gz", hash = "sha256:1fe45a14b44dd65d90199017dd5a4b5a128d56a8a311da7916c402c18c671494"},
@@ -4542,14 +4581,23 @@ content_hash = "sha256:99c295c599a759eb30a17013697c0d8ed645d53982b5587cce4072894
     {url = "https://files.pythonhosted.org/packages/4c/31/2de23d4e7849e9e1ec61c8560b362624b4337523845243f23cae7d0a0ffd/triton-2.0.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0117722f8c2b579cd429e0bee80f7731ae05f63fe8e9414acd9a679885fcbf42"},
     {url = "https://files.pythonhosted.org/packages/57/b6/d93645e54a7a7ceba5c8a94cfc843f2c17b47853fc106527afc5562a40e8/triton-2.0.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:75834f27926eab6c7f00ce73aaf1ab5bfb9bec6eb57ab7c0bfc0a23fac803b4c"},
     {url = "https://files.pythonhosted.org/packages/5c/b2/16e5d69b331b4bcfd12db5264eeaba12a47e4f1878610f95809c4c04248e/triton-2.0.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:52c47b72c72693198163ece9d90a721299e4fb3b8e24fd13141e384ad952724f"},
+    {url = "https://files.pythonhosted.org/packages/72/90/91059851af9ffbceb40eeabb2e2522cd8b184b005f4b4ba44f6cba081ef0/triton-2.0.0-1-pp38-pypy38_pp73-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:1aca3303629cd3136375b82cb9921727f804e47ebee27b2677fef23005c3851a"},
+    {url = "https://files.pythonhosted.org/packages/77/ac/28b74ec1177c730d0da8803eaff5e5025bd532bcf07cadb0fcf661abed97/triton-2.0.0-1-cp39-cp39-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:74f118c12b437fb2ca25e1a04759173b517582fcf4c7be11913316c764213656"},
     {url = "https://files.pythonhosted.org/packages/92/84/83e0da09436024ab3118248391949e219bbdee085fb0ae86d64d653b9a33/triton-2.0.0-pp37-pypy37_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bcd9be5d0c2e45d2b7e6ddc6da20112b6862d69741576f9c3dbaf941d745ecae"},
+    {url = "https://files.pythonhosted.org/packages/95/2e/d40c5e21c9b58f569d993b11e2b1022d5858df2ab74238fe95d6d089edc9/triton-2.0.0-1-pp37-pypy37_pp73-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:9618815a8da1d9157514f08f855d9e9ff92e329cd81c0305003eb9ec25cc5add"},
+    {url = "https://files.pythonhosted.org/packages/a6/4b/28142a3c70621cb3398ac626c276268ca87af50a3fa43667a834fa5d13bf/triton-2.0.0-1-cp38-cp38-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:9d4978298b74fcf59a75fe71e535c092b023088933b2f1df933ec32615e4beef"},
+    {url = "https://files.pythonhosted.org/packages/b7/72/31c8a99de642b30c576281486f22aff2d9287d6214160a3a891c4b18e7b4/triton-2.0.0-1-cp37-cp37m-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:d2684b6a60b9f174f447f36f933e9a45f31db96cb723723ecd2dcfd1c57b778b"},
+    {url = "https://files.pythonhosted.org/packages/b7/cd/4aa0179919306f9c2e3e5308f269d20c094b2a4e2963b656e9405172763f/triton-2.0.0-1-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:226941c7b8595219ddef59a1fdb821e8c744289a132415ddd584facedeb475b1"},
+    {url = "https://files.pythonhosted.org/packages/bc/7b/2ab6496b01318708173ad32cff1af023a526e2ea716629819bf8720afe17/triton-2.0.0-1-cp36-cp36m-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:4c9fc8c89874bc48eb7e7b2107a9b8d2c0bf139778637be5bfccb09191685cfd"},
     {url = "https://files.pythonhosted.org/packages/c4/2a/7c7af8113082c78b98f0998201c48b0315c38814ea67526799c5e48b9205/triton-2.0.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8f05a7e64e4ca0565535e3d5d3405d7e49f9d308505bb7773d21fb26a4c008c2"},
+    {url = "https://files.pythonhosted.org/packages/ca/31/ff6be541195daf77aa5c72303b2354661a69e717967d44d91eb4f3fdce32/triton-2.0.0-1-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:38806ee9663f4b0f7cd64790e96c579374089e58f49aac4a6608121aa55e2505"},
+    {url = "https://files.pythonhosted.org/packages/d5/61/f6c3260de70c2b980702f2fde0526690de40432ebfe2f4b9e81a9007cf09/triton-2.0.0-1-pp39-pypy39_pp73-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:e3e13aa8b527c9b642e3a9defcc0fbd8ffbe1c80d8ac8c15a01692478dc64d8a"},
     {url = "https://files.pythonhosted.org/packages/e1/1d/fd57199cf8be37f7e846408cacb0a466ae21cd1612e268ab168bc815b007/triton-2.0.0-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:42a0d2c3fc2eab4ba71384f2e785fbfd47aa41ae05fa58bf12cb31dcbd0aeceb"},
     {url = "https://files.pythonhosted.org/packages/ff/dd/606cb34d8060ab1768cefe0e1f4658c21121f9cae13e8c4444a8dc1665eb/triton-2.0.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bb4b99ca3c6844066e516658541d876c28a5f6e3a852286bbc97ad57134827fd"},
 ]
-"types-setuptools 67.6.0.3" = [
-    {url = "https://files.pythonhosted.org/packages/4f/a1/765f80e3b29563bc3d4ef0c042c952587c31a6f83d0d1c093596b70b618b/types_setuptools-67.6.0.3-py3-none-any.whl", hash = "sha256:1cc0bb0bf356492a0dfa00e9fa73b40039c69703eb5f7b73a57ccc506d850a14"},
-    {url = "https://files.pythonhosted.org/packages/fc/6f/265c82adb6640eb351e80b97216709b279d157db77dcc25244332c1afd13/types-setuptools-67.6.0.3.tar.gz", hash = "sha256:5171c3f06d45a8343901872c11eb01bcdbda2da667d0c346264ab0492f0a37a1"},
+"types-setuptools 67.6.0.5" = [
+    {url = "https://files.pythonhosted.org/packages/52/d9/d655de64223bc1ab4efcf39236ce6945121129bd716bfbc3ba64cda688ff/types-setuptools-67.6.0.5.tar.gz", hash = "sha256:3a708e66c7bdc620e4d0439f344c750c57a4340c895a4c3ed2d0fc4ae8eb9962"},
+    {url = "https://files.pythonhosted.org/packages/d4/d8/5ececf82707d6797808c2cea97e0eab0cddd26549ee5710f425cfa87ae35/types_setuptools-67.6.0.5-py3-none-any.whl", hash = "sha256:dae5a4a659dbb6dba57773440f6e2dbdd8ef282dc136a174a8a59bd33d949945"},
 ]
 "typing-extensions 4.5.0" = [
     {url = "https://files.pythonhosted.org/packages/31/25/5abcd82372d3d4a3932e1fa8c3dbf9efac10cc7c0d16e78467460571b404/typing_extensions-4.5.0-py3-none-any.whl", hash = "sha256:fb33085c39dd998ac16d1431ebc293a8b3eedd00fd4a32de0ff79002c19511b4"},
@@ -4577,35 +4625,34 @@ content_hash = "sha256:99c295c599a759eb30a17013697c0d8ed645d53982b5587cce4072894
     {url = "https://files.pythonhosted.org/packages/86/2f/35a79942c38d4ca89b444085d67900f713f1967446fdcefc8351619d7c65/virtualenv-20.21.0-py3-none-any.whl", hash = "sha256:31712f8f2a17bd06234fa97fdf19609e789dd4e3e4bf108c3da71d710651adbc"},
     {url = "https://files.pythonhosted.org/packages/87/14/ca9890d58cd33d9122eb87ffec2f3c6be0714785f992a0fd3b56a3b6c993/virtualenv-20.21.0.tar.gz", hash = "sha256:f50e3e60f990a0757c9b68333c9fdaa72d7188caa417f96af9e52407831a3b68"},
 ]
-"watchdog 2.3.1" = [
-    {url = "https://files.pythonhosted.org/packages/05/72/b7d506e9a67ade08cc9f5b79f6191e8c2ef8eafcae20b8f6d1f84c65ce8d/watchdog-2.3.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:ea5d86d1bcf4a9d24610aa2f6f25492f441960cf04aed2bd9a97db439b643a7b"},
-    {url = "https://files.pythonhosted.org/packages/15/ab/8fe9a2d0aab954b6669e1c500131782704b2653ece48c9dacb982cc601fe/watchdog-2.3.1-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:03f342a9432fe08107defbe8e405a2cb922c5d00c4c6c168c68b633c64ce6190"},
-    {url = "https://files.pythonhosted.org/packages/1e/68/1efdedc26132a6f65712654c56f09b3c2f98e1b6e9178b94c2ffeed04271/watchdog-2.3.1-py3-none-manylinux2014_i686.whl", hash = "sha256:7a1876f660e32027a1a46f8a0fa5747ad4fcf86cb451860eae61a26e102c8c79"},
-    {url = "https://files.pythonhosted.org/packages/2d/bf/0a52a562812b2e856bee283aa547944d52d4145eee1d55511ccbe3280a5a/watchdog-2.3.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:564e7739abd4bd348aeafbf71cc006b6c0ccda3160c7053c4a53b67d14091d42"},
-    {url = "https://files.pythonhosted.org/packages/4c/0c/9952176a2d8a775be3a2f360bf1be97e9ebc6c82b05592600dff1e53e607/watchdog-2.3.1-py3-none-win_ia64.whl", hash = "sha256:4109cccf214b7e3462e8403ab1e5b17b302ecce6c103eb2fc3afa534a7f27b96"},
-    {url = "https://files.pythonhosted.org/packages/4d/9b/25e1250d65295124d3b0600e578fe5b901d1c626bbcbb33539aee873f95d/watchdog-2.3.1-py3-none-manylinux2014_ppc64.whl", hash = "sha256:2caf77ae137935c1466f8cefd4a3aec7017b6969f425d086e6a528241cba7256"},
-    {url = "https://files.pythonhosted.org/packages/51/45/c030859e146a823ddbd193921459690899c9d99f84ac620b00937c47db86/watchdog-2.3.1-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:3d2dbcf1acd96e7a9c9aefed201c47c8e311075105d94ce5e899f118155709fd"},
-    {url = "https://files.pythonhosted.org/packages/62/21/033cb33d76f00dd3032d5542d6ae79e9d349c67eb7895de48fecda542be2/watchdog-2.3.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:6f5d0f7eac86807275eba40b577c671b306f6f335ba63a5c5a348da151aba0fc"},
-    {url = "https://files.pythonhosted.org/packages/6e/d5/061443b2cc73ca32a533b008df5fb130e5e44e450f7d87b724aac303c720/watchdog-2.3.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:95ad708a9454050a46f741ba5e2f3468655ea22da1114e4c40b8cbdaca572565"},
-    {url = "https://files.pythonhosted.org/packages/72/10/be6189e00e5e2d93bd82703cc0eb07cb4c7037e447e72d2f02f641c9ada4/watchdog-2.3.1-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:85bf2263290591b7c5fa01140601b64c831be88084de41efbcba6ea289874f44"},
-    {url = "https://files.pythonhosted.org/packages/73/fc/c0baded1c537122611aac5fded8a6436af6b1460744cb3fa802678088877/watchdog-2.3.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:efe3252137392a471a2174d721e1037a0e6a5da7beb72a021e662b7000a9903f"},
-    {url = "https://files.pythonhosted.org/packages/74/6e/ba47e5856aaf8df80d689519d1f3097f310976708515a67aa2eccf8ce615/watchdog-2.3.1-py3-none-manylinux2014_ppc64le.whl", hash = "sha256:53f3e95081280898d9e4fc51c5c69017715929e4eea1ab45801d5e903dd518ad"},
-    {url = "https://files.pythonhosted.org/packages/76/11/6651e259e27c10d4ec1c88c5ea4bf641b3782f98764525c425562099a814/watchdog-2.3.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:5b848c71ef2b15d0ef02f69da8cc120d335cec0ed82a3fa7779e27a5a8527225"},
-    {url = "https://files.pythonhosted.org/packages/79/21/ffd41427b724a6468c6c5c7f083f8e59948eabe2538538e3a15ff15c33cb/watchdog-2.3.1-py3-none-manylinux2014_x86_64.whl", hash = "sha256:8a4d484e846dcd75e96b96d80d80445302621be40e293bfdf34a631cab3b33dc"},
-    {url = "https://files.pythonhosted.org/packages/92/2a/cfa6e32f200b304f647374eff1779cd66f7f714d152d3e84f2f813d2ddd9/watchdog-2.3.1-py3-none-win32.whl", hash = "sha256:a74155398434937ac2780fd257c045954de5b11b5c52fc844e2199ce3eecf4cf"},
-    {url = "https://files.pythonhosted.org/packages/a5/17/a31fc6b90ff861a27debd0650bfbca17e074fdc3e037f392872fad76c726/watchdog-2.3.1.tar.gz", hash = "sha256:d9f9ed26ed22a9d331820a8432c3680707ea8b54121ddcc9dc7d9f2ceeb36906"},
-    {url = "https://files.pythonhosted.org/packages/b1/ea/84ea18b982d2c03085b3ca03c08d975afadbe75ef1db015fe8de2e21052b/watchdog-2.3.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:8f2df370cd8e4e18499dd0bfdef476431bcc396108b97195d9448d90924e3131"},
-    {url = "https://files.pythonhosted.org/packages/b2/f1/0aadffdba6ffec3a209c3ebfd81ba0a87b8569147fa974236b4115eb02ac/watchdog-2.3.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:0d9878be36d2b9271e3abaa6f4f051b363ff54dbbe7e7df1af3c920e4311ee43"},
-    {url = "https://files.pythonhosted.org/packages/be/fc/fb45f9d64ec043bd92b2c3e36754d68a09991e670d53ad39060a0be0ae03/watchdog-2.3.1-py3-none-manylinux2014_armv7l.whl", hash = "sha256:0e1dd6d449267cc7d6935d7fe27ee0426af6ee16578eed93bacb1be9ff824d2d"},
-    {url = "https://files.pythonhosted.org/packages/c4/08/ede6b9c674c429f80c79e00ceb457bc3d01f18f4f71e7e7e986604b39c16/watchdog-2.3.1-py3-none-manylinux2014_aarch64.whl", hash = "sha256:7a596f9415a378d0339681efc08d2249e48975daae391d58f2e22a3673b977cf"},
-    {url = "https://files.pythonhosted.org/packages/c6/b4/5b4a76b566d1e55a1b90b183775e8b502fe0aefb076128778843f223e392/watchdog-2.3.1-py3-none-win_amd64.whl", hash = "sha256:5defe4f0918a2a1a4afbe4dbb967f743ac3a93d546ea4674567806375b024adb"},
-    {url = "https://files.pythonhosted.org/packages/c7/1d/052f751f9b8de2a5d7d11954eb533221351300ea810da934defaeacd12c0/watchdog-2.3.1-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:4cd61f98cb37143206818cb1786d2438626aa78d682a8f2ecee239055a9771d5"},
-    {url = "https://files.pythonhosted.org/packages/d1/5b/0451ca41393aab9246294431c0aaab81efa3a53d2e8c1b1596f5f7a8035c/watchdog-2.3.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:a073c91a6ef0dda488087669586768195c3080c66866144880f03445ca23ef16"},
-    {url = "https://files.pythonhosted.org/packages/d6/8d/ebdd845d3cee8ca1802a89b5c7fda18f5b8c85e74e632a53145971514958/watchdog-2.3.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:91fd146d723392b3e6eb1ac21f122fcce149a194a2ba0a82c5e4d0ee29cd954c"},
-    {url = "https://files.pythonhosted.org/packages/dd/5c/4bd82db65cee7287359abc1369a06a40b2e3d100d5e84b97d5019ab9fc27/watchdog-2.3.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:aa8b028750b43e80eea9946d01925168eeadb488dfdef1d82be4b1e28067f375"},
-    {url = "https://files.pythonhosted.org/packages/f4/2d/ad35f33b7bfeac899bc31aaf12f4ee7fa53cc2710ad1274654c1dd63a6f1/watchdog-2.3.1-py3-none-manylinux2014_s390x.whl", hash = "sha256:9da7acb9af7e4a272089bd2af0171d23e0d6271385c51d4d9bde91fe918c53ed"},
-    {url = "https://files.pythonhosted.org/packages/f4/e4/a6270a3c28872d46e53cbae034715ff80c18856167091f548aa93ad2d92b/watchdog-2.3.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:964fd236cd443933268ae49b59706569c8b741073dbfd7ca705492bae9d39aab"},
-    {url = "https://files.pythonhosted.org/packages/fb/3a/ad9bf1927f344bbd161359d22771020748c4c82ea4dd45abcfe46e084655/watchdog-2.3.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:d1f1200d4ec53b88bf04ab636f9133cb703eb19768a39351cee649de21a33697"},
+"watchdog 3.0.0" = [
+    {url = "https://files.pythonhosted.org/packages/00/9e/a9711f35f1ad6571e92dc2e955e7de9dfac21a1b33e9cd212f066a60a387/watchdog-3.0.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:2b57a1e730af3156d13b7fdddfc23dea6487fceca29fc75c5a868beed29177ae"},
+    {url = "https://files.pythonhosted.org/packages/06/fd/58b82550ebe4883bb2a5e1b6c14d8702b5ce0f36c58470bba51dc777df46/watchdog-3.0.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:336adfc6f5cc4e037d52db31194f7581ff744b67382eb6021c868322e32eef41"},
+    {url = "https://files.pythonhosted.org/packages/21/72/46fd174352cd88b9157ade77e3b8835125d4b1e5186fc7f1e8c44664e029/watchdog-3.0.0-py3-none-manylinux2014_i686.whl", hash = "sha256:c07253088265c363d1ddf4b3cdb808d59a0468ecd017770ed716991620b8f77a"},
+    {url = "https://files.pythonhosted.org/packages/2b/f0/456948b865ab259784f774154e7d65844fa9757522fdb11533fbf8ae7aca/watchdog-3.0.0-py3-none-manylinux2014_x86_64.whl", hash = "sha256:d429c2430c93b7903914e4db9a966c7f2b068dd2ebdd2fa9b9ce094c7d459f33"},
+    {url = "https://files.pythonhosted.org/packages/2e/54/48527f3aea4f7ed331072352fee034a7f3d6ec7a2ed873681738b2586498/watchdog-3.0.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:25f70b4aa53bd743729c7475d7ec41093a580528b100e9a8c5b5efe8899592fc"},
+    {url = "https://files.pythonhosted.org/packages/30/65/9e36a3c821d47a22e54a8fc73681586b2d26e82d24ea3af63acf2ef78f97/watchdog-3.0.0-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:c9d8c8ec7efb887333cf71e328e39cffbf771d8f8f95d308ea4125bf5f90ba64"},
+    {url = "https://files.pythonhosted.org/packages/3a/9d/d6586a065968f3e5d89a2565dffa6ea9151ce9d46c541340bfff27b41231/watchdog-3.0.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:9fac43a7466eb73e64a9940ac9ed6369baa39b3bf221ae23493a9ec4d0022674"},
+    {url = "https://files.pythonhosted.org/packages/40/1b/4e6d3e0f587587931f590531b4ed08070d71a9efb35541d792a68d8ee593/watchdog-3.0.0-py3-none-manylinux2014_s390x.whl", hash = "sha256:ba07e92756c97e3aca0912b5cbc4e5ad802f4557212788e72a72a47ff376950d"},
+    {url = "https://files.pythonhosted.org/packages/51/b9/444a984b1667013bac41b31b45d9718e069cc7502a43a924896806605d83/watchdog-3.0.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:233b5817932685d39a7896b1090353fc8efc1ef99c9c054e46c8002561252fb8"},
+    {url = "https://files.pythonhosted.org/packages/55/0d/bfc2a0d425b12444a2dc245a934c065bbb7bd9833fff071cba79c21bb76e/watchdog-3.0.0-py3-none-win32.whl", hash = "sha256:3ed7c71a9dccfe838c2f0b6314ed0d9b22e77d268c67e015450a29036a81f60f"},
+    {url = "https://files.pythonhosted.org/packages/58/db/d419fdbd3051b42b0a8091ddf78f70540b6d9d277a84845f7c5955f9de92/watchdog-3.0.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:7e447d172af52ad204d19982739aa2346245cc5ba6f579d16dac4bfec226d2e7"},
+    {url = "https://files.pythonhosted.org/packages/67/e4/229144d23093436a21a8b84aa5931d70759b81743dc8c10d0e836dbfd752/watchdog-3.0.0-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:13bbbb462ee42ec3c5723e1205be8ced776f05b100e4737518c67c8325cf6100"},
+    {url = "https://files.pythonhosted.org/packages/71/3a/b12740f4f60861240d57b42a2ac6ac0a2821db506c4435f7872c1fad867d/watchdog-3.0.0-py3-none-manylinux2014_ppc64le.whl", hash = "sha256:51f90f73b4697bac9c9a78394c3acbbd331ccd3655c11be1a15ae6fe289a8c83"},
+    {url = "https://files.pythonhosted.org/packages/74/3c/e4b77f4f069aca2b6e35925db7a1aa6cb600dcb52fc3e962284640ca37f3/watchdog-3.0.0-py3-none-manylinux2014_ppc64.whl", hash = "sha256:5113334cf8cf0ac8cd45e1f8309a603291b614191c9add34d33075727a967709"},
+    {url = "https://files.pythonhosted.org/packages/75/fe/d9a37d8df76878853f68dd665ec6d2c7a984645de460164cb880a93ffe6b/watchdog-3.0.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:7c5f84b5194c24dd573fa6472685b2a27cc5a17fe5f7b6fd40345378ca6812e3"},
+    {url = "https://files.pythonhosted.org/packages/7f/6e/7ca8ed16928d7b11da69372f55c64a09dce649d2b24b03f7063cd8683c4b/watchdog-3.0.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:8ae9cda41fa114e28faf86cb137d751a17ffd0316d1c34ccf2235e8a84365c7f"},
+    {url = "https://files.pythonhosted.org/packages/84/ab/67001e62603bf2ea35ace40023f7c74f61e8b047160d6bb078373cec1a67/watchdog-3.0.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:7ade88d0d778b1b222adebcc0927428f883db07017618a5e684fd03b83342bd9"},
+    {url = "https://files.pythonhosted.org/packages/92/28/631872d7fbc45527037060db8c838b47a129a6c09d2297d6dddcfa283cf2/watchdog-3.0.0-py3-none-manylinux2014_aarch64.whl", hash = "sha256:0e06ab8858a76e1219e68c7573dfeba9dd1c0219476c5a44d5333b01d7e1743a"},
+    {url = "https://files.pythonhosted.org/packages/92/dd/42f47ffdfadff4c41b89c54163f323f875eb963bf90088e477c43b8f7b15/watchdog-3.0.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:a70a8dcde91be523c35b2bf96196edc5730edb347e374c7de7cd20c43ed95397"},
+    {url = "https://files.pythonhosted.org/packages/94/ce/70c65a6c4b0330129c402624d42f67ce82d6a0ba2036de67628aeffda3c1/watchdog-3.0.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:3aa7f6a12e831ddfe78cdd4f8996af9cf334fd6346531b16cec61c3b3c0d8da0"},
+    {url = "https://files.pythonhosted.org/packages/95/a6/d6ef450393dac5734c63c40a131f66808d2e6f59f6165ab38c98fbe4e6ec/watchdog-3.0.0.tar.gz", hash = "sha256:4d98a320595da7a7c5a18fc48cb633c2e73cda78f93cac2ef42d42bf609a33f9"},
+    {url = "https://files.pythonhosted.org/packages/9b/39/30bb3c2e4f8e89b5c60e98589acf5c5a001cb0efde249aa05d748d1734a2/watchdog-3.0.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:adfdeab2da79ea2f76f87eb42a3ab1966a5313e5a69a0213a3cc06ef692b0e96"},
+    {url = "https://files.pythonhosted.org/packages/9b/6e/ce8d124d03cd3f2941365d9c81d62e3afe43f2dc7e6e86274fa9c2ec2d5b/watchdog-3.0.0-py3-none-win_amd64.whl", hash = "sha256:4c9956d27be0bb08fc5f30d9d0179a855436e655f046d288e2bcc11adfae893c"},
+    {url = "https://files.pythonhosted.org/packages/ba/0c/cd0337069c468f22ef256e768ece74c78b511092f1004ab260268e1af4a9/watchdog-3.0.0-py3-none-win_ia64.whl", hash = "sha256:5d9f3a10e02d7371cd929b5d8f11e87d4bad890212ed3901f9b4d68767bee759"},
+    {url = "https://files.pythonhosted.org/packages/c0/a2/4e3230bdc1fb878b152a2c66aa941732776f4545bd68135d490591d66713/watchdog-3.0.0-py3-none-manylinux2014_armv7l.whl", hash = "sha256:d00e6be486affb5781468457b21a6cbe848c33ef43f9ea4a73b4882e5f188a44"},
+    {url = "https://files.pythonhosted.org/packages/dc/89/3a3ce6dd01807ff918aec3bbcabc92ed1a7edc5bb2266c720bb39fec1bec/watchdog-3.0.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:4f94069eb16657d2c6faada4624c39464f65c05606af50bb7902e036e3219be3"},
+    {url = "https://files.pythonhosted.org/packages/ea/76/bef1c6f6ac18041234a9f3e8bc995d611e255c44f10433bfaf255968c269/watchdog-3.0.0-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:8f3ceecd20d71067c7fd4c9e832d4e22584318983cabc013dbf3f70ea95de346"},
 ]
 "wcmatch 8.4.1" = [
     {url = "https://files.pythonhosted.org/packages/b4/a7/1875f68c4e39f9c68f5ba3aaf80ed1853903e5119941d514789fbc51a80d/wcmatch-8.4.1-py3-none-any.whl", hash = "sha256:3476cd107aba7b25ba1d59406938a47dc7eec6cfd0ad09ff77193f21a964dee7"},
@@ -4631,9 +4678,9 @@ content_hash = "sha256:99c295c599a759eb30a17013697c0d8ed645d53982b5587cce4072894
     {url = "https://files.pythonhosted.org/packages/61/86/cc8d1ff2ca31a312a25a708c891cf9facbad4eae493b3872638db6785eb5/wheel-0.40.0-py3-none-any.whl", hash = "sha256:d236b20e7cb522daf2390fa84c55eea81c5c30190f90f29ae2ca1ad8355bf247"},
     {url = "https://files.pythonhosted.org/packages/fc/ef/0335f7217dd1e8096a9e8383e1d472aa14717878ffe07c4772e68b6e8735/wheel-0.40.0.tar.gz", hash = "sha256:cd1196f3faee2b31968d626e1731c94f99cbdb67cf5a46e4f5656cbee7738873"},
 ]
-"widgetsnbextension 3.6.2" = [
-    {url = "https://files.pythonhosted.org/packages/69/3f/4fec898c106ecf3c0b8dc474ddf754f58dd87cb8eaa59aeb2c2876508b1b/widgetsnbextension-3.6.2-py2.py3-none-any.whl", hash = "sha256:ddc70ae828b5d5bfdeaa4444f11a2076a0b08216b82322f616439db25e259d22"},
-    {url = "https://files.pythonhosted.org/packages/c0/41/16909493b0832ae6d588abc441131b074a725c63c7ab4fdf943891658e8f/widgetsnbextension-3.6.2.tar.gz", hash = "sha256:401b3b4613acceb392f7b80f03ddaf0346a15f1cfe8c1e05702ff233a0dde26e"},
+"widgetsnbextension 3.6.3" = [
+    {url = "https://files.pythonhosted.org/packages/98/02/4e36d470ea82fa011a80853f9f4f7a189823ee683c0386fc780ff5d6327b/widgetsnbextension-3.6.3-py2.py3-none-any.whl", hash = "sha256:5bf98c679f71cdbff02be832ea542eeb456252aff6448e1eb23089c1dcdd44cf"},
+    {url = "https://files.pythonhosted.org/packages/ad/8a/4d5b4cf5df57f57420147413452049080064ab0b24652c5409547a18b2c6/widgetsnbextension-3.6.3.tar.gz", hash = "sha256:28cb103f3066a6fdd6fd63264dd2a9709266c351a9a5c4a50a0bfd5ae2557b46"},
 ]
 "yarl 1.8.2" = [
     {url = "https://files.pythonhosted.org/packages/02/51/c33498373d2e0ff5d7f3e76038b7057003927d481405780d22f140906b24/yarl-1.8.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:2a1fca9588f360036242f379bfea2b8b44cae2721859b1c56d033adfd5893634"},
diff --git a/pyproject.toml b/pyproject.toml
index 53e622d1..cb68344c 100644
--- a/pyproject.toml
+++ b/pyproject.toml
@@ -80,6 +80,8 @@ test = [
     "tox-pdm>=0.6.0",
     "pytest-mock>=3.0.0",
     "requests-mock>=1.10.0",
+    "pytest-check>=2.1.4",
+    "pytest-parametrization>=2022.2.1",
 ]
 # pdm add -dG visualization <library>
 visualization = [
@@ -107,7 +109,7 @@ license = ["licensecheck>=2023.0.1"]
 
 [tool.black]
 line-length = 100
-target-version = ["py38", "py39", "py310"]
+target-version = ["py38", "py39", "py310", "py311"]
 preview = true
 
 [tool.isort]
diff --git a/srai/exceptions.py b/srai/exceptions.py
index 5f7bbbca..55bff435 100644
--- a/srai/exceptions.py
+++ b/srai/exceptions.py
@@ -11,3 +11,15 @@ class ModelNotFitException(SRAIException):
     """Exception raised when a model is not fit."""
 
     pass
+
+
+class LoadedDataIsEmptyException(SRAIException):
+    """Exception when the loaded data returned by the loader is empty."""
+
+    def __init__(self, message: str):  # noqa: D107
+        super().__init__()
+
+        self.message = message
+
+    def __str__(self) -> str:  # noqa: D105
+        return f"The data returned by the loader is empty. {self.message}"
diff --git a/srai/loaders/__init__.py b/srai/loaders/__init__.py
index 323452c9..146709ad 100644
--- a/srai/loaders/__init__.py
+++ b/srai/loaders/__init__.py
@@ -3,5 +3,6 @@
 from ._base import Loader
 from .geoparquet_loader import GeoparquetLoader
 from .gtfs_loader import GTFSLoader
+from .osm_way_loader import OSMWayLoader
 
-__all__ = ["Loader", "GeoparquetLoader", "GTFSLoader"]
+__all__ = ["Loader", "GeoparquetLoader", "GTFSLoader", "OSMWayLoader"]
diff --git a/srai/loaders/osm_way_loader/__init__.py b/srai/loaders/osm_way_loader/__init__.py
new file mode 100644
index 00000000..ac746501
--- /dev/null
+++ b/srai/loaders/osm_way_loader/__init__.py
@@ -0,0 +1,5 @@
+"""OSMWayloader."""
+
+from .osm_way_loader import NetworkType, OSMWayLoader
+
+__all__ = ["OSMWayLoader", "NetworkType"]
diff --git a/srai/loaders/osm_way_loader/constants.py b/srai/loaders/osm_way_loader/constants.py
new file mode 100644
index 00000000..a8cc817e
--- /dev/null
+++ b/srai/loaders/osm_way_loader/constants.py
@@ -0,0 +1,342 @@
+"""Constants for OSMWayLoader."""
+
+from typing import Dict, List
+
+import numpy as np
+
+MPH_TO_KMH = 1.609344
+INCHES_TO_METERS = 0.0254
+FEET_TO_METERS = 0.3048
+
+OSMNX_TIMEOUT: int = 180
+"""The timeout interval in seconds for HTTP requests."""
+
+OSMNX_WAY_KEYS: List[str] = [
+    "bridge",
+    "tunnel",
+    "oneway",
+    "lanes",
+    "ref",
+    "name",
+    "highway",
+    "maxspeed",
+    "service",
+    "access",
+    "area",
+    "landuse",
+    "width",
+    "est_width",
+    "junction",
+    # missing in the original OSMnx config
+    "surface",
+    "footway",
+    "bicycle",
+    "lit",
+]
+"""Extended OSMnx way tags."""
+
+
+OSM_WAY_TAGS: Dict[str, List[str]] = {
+    "oneway": ["False", "True"],
+    "lanes": list(map(str, range(1, 21))),
+    "highway": [
+        "motorway",
+        "motorway_link",
+        "trunk",
+        "trunk_link",
+        "primary",
+        "primary_link",
+        "secondary",
+        "secondary_link",
+        "tertiary",
+        "tertiary_link",
+        "residential",
+        "unclassified",
+        "living_street",
+        "service",
+        "pedestrian",
+        "track",
+        "bus_guideway",
+        "escape",
+        "raceway",
+        "road",
+        "busway",
+        "footway",
+        "bridleway",
+        "steps",
+        "corridor",
+        "path",
+    ],
+    "maxspeed": [
+        "5",
+        "7",
+        "10",
+        "15",
+        "20",
+        "30",
+        "40",
+        "50",
+        "60",
+        "70",
+        "80",
+        "90",
+        "100",
+        "110",
+        "120",
+        "130",
+        "140",
+    ],
+    "bridge": [
+        "yes",
+        "aqueduct",
+        "boardwalk",
+        "cantilever",
+        "covered",
+        "low_water_crossing",
+        "movable",
+        "trestle",
+        "viaduct",
+        "simple_brunnel",
+    ],
+    "access": [
+        "yes",
+        "no",
+        "private",
+        "public",
+        "permissive",
+        "permit",
+        "destination",
+        "delivery",
+        "customers",
+        "designated",
+        "use_sidepath",
+        "dismount",
+        "agricultural",
+        "forestry",
+        "discouraged",
+        "unknown",
+        "restricted",
+        "official",
+        "students",
+        "licence",
+        "license",
+        "exclusion_zone",
+        "dismount",
+    ],
+    "junction": [
+        "yes",
+        "roundabout",
+        "circular",
+        "spui",
+        "jughandle",
+        "filter",
+        "intersection",
+        "crossing",
+        "uncontrolled",
+    ],
+    "width": list(np.arange(0, 30.5, 0.5).astype("str")),
+    "tunnel": ["building_passage", "yes", "avalanche_protector"],
+    "surface": [
+        "paved",
+        "asphalt",
+        "chipseal",
+        "concrete",
+        "concrete:lanes",
+        "concrete:plates",
+        "paving_stones",
+        "sett",
+        "unhewn_cobblestone",
+        "cobblestone",
+        "metal",
+        "wood",
+        "stepping_stones",
+        "rubber",
+        "unpaved",
+        "compacted",
+        "fine_gravel",
+        "gravel",
+        "rock",
+        "pebblestone",
+        "ground",
+        "dirt",
+        "earth",
+        "grass",
+        "grass_paver",
+        "mud",
+        "sand",
+        "woodchips",
+        "snow",
+        "ice",
+        "salt",
+    ],
+    "bicycle": [
+        "yes",
+        "no",
+        "designated",
+        "use_sidepath",
+        "dismount",
+        "permissive",
+        "private",
+        "customers",
+        "destination",
+        "official",
+    ],
+    "lit": ["yes", "no", "sunset-sunrise", "24/7", "automatic", "disused", "limited", "interval"],
+}
+"""
+Acceptable features assembled based on [1] and [2].
+
+Assembled values that are officially defined in the wiki and are related to the `way` OSM type.
+
+References:
+    [1] https://taginfo.openstreetmap.org/
+    [2] https://wiki.openstreetmap.org/wiki/Main_Page
+"""
+
+
+OSM_IMPLICIT_MAXSPEEDS = {
+    "AR:urban": "40",
+    "AR:rural": "110",
+    "AR:urban:primary": "60",
+    "AR:urban:secondary": "60",
+    "AT:urban": "50",
+    "AT:rural": "100",
+    "AT:bicycle_road": "30",
+    "AT:trunk": "100",
+    "AT:motorway": "130",
+    "AT:zone:30": "30",
+    "AT:walk": "5",
+    "walk": "5",
+    "AU:urban": "None",
+    "AU:rural": "None",
+    "BE:living_street": "20",
+    "BE:cyclestreet": "30",
+    "BE:zone30": "30",
+    "BE:trunk": "120",
+    "BE:motorway": "120",
+    "BG:urban": "50",
+    "BG:rural": "90",
+    "BG:living_street": "20",
+    "BG:trunk": "120",
+    "BG:motorway": "140",
+    "BY:urban": "60",
+    "BY:rural": "90",
+    "BY:living_street": "20",
+    "BY:motorway": "110",
+    "CH:rural": "80",
+    "CH:trunk": "100",
+    "CH:motorway": "120",
+    "CZ:urban": "50",
+    "CZ:rural": "90",
+    "CZ:pedestrian_zone": "20",
+    "CZ:living_street": "20",
+    "CZ:urban_motorway": "80",
+    "CZ:urban_trunk": "80",
+    "CZ:trunk": "110",
+    "CZ:motorway": "130",
+    "DE:urban": "50",
+    "DE:rural": "100",
+    "DE:living_street": "7",
+    "DE:bicycle_road": "30",
+    "DE:motorway": "None",
+    "DK:urban": "50",
+    "DK:rural": "80",
+    "DK:motorway": "130",
+    "EE:urban": "50",
+    "EE:rural": "90",
+    "ES:urban": "50",
+    "ES:rural": "90",
+    "ES:living_street": "20",
+    "ES:zone30": "30",
+    "ES:trunk": "90",
+    "ES:motorway": "120",
+    "FI:urban": "50",
+    "FI:rural": "80",
+    "FI:trunk": "100",
+    "FI:motorway": "120",
+    "FR:urban": "50",
+    "FR:rural": "80",
+    "FR:zone30": "30",
+    "FR:motorway": "None",
+    "GB:nsl_restricted": "30 mph",
+    "GB:motorway": "70 mph",
+    "GB:nsl_dual": "70 mph",
+    "GB:nsl_single": "60 mph",
+    "GR:urban": "50",
+    "GR:rural": "90",
+    "GR:trunk": "110",
+    "GR:motorway": "130",
+    "HU:urban": "50",
+    "HU:rural": "90",
+    "HU:living_street": "20",
+    "HU:trunk": "110",
+    "HU:motorway": "130",
+    "IT:urban": "50",
+    "IT:rural": "90",
+    "IT:trunk": "110",
+    "IT:motorway": "130",
+    "JP:nsl": "60",
+    "JP:express": "100",
+    "LT:urban": "50",
+    "LT:rural": "90",
+    "NO:urban": "50",
+    "NO:rural": "80",
+    "PH:urban": "30",
+    "PH:rural": "80",
+    "PH:express": "100",
+    "PT:urban": "50",
+    "PT:rural": "90",
+    "PT:trunk": "100",
+    "PT:motorway": "120",
+    "RO:urban": "50",
+    "RO:rural": "90",
+    "RO:trunk": "100",
+    "RO:motorway": "130",
+    "RS:urban": "50",
+    "RS:rural": "80",
+    "RS:living_street": "10",
+    "RS:trunk": "100",
+    "RS:motorway": "130",
+    "RU:urban": "60",
+    "RU:rural": "90",
+    "RU:living_street": "20",
+    "RU:motorway": "110",
+    "SE:urban": "50",
+    "SE:rural": "70",
+    "SE:trunk": "90",
+    "SE:motorway": "110",
+    "SI:urban": "50",
+    "SI:rural": "90",
+    "SI:trunk": "110",
+    "SI:motorway": "130",
+    "SK:urban": "50",
+    "SK:rural": "90",
+    "SK:living_street": "20",
+    "SK:trunk": "90",
+    "SK:motorway": "130",
+    "SK:motorway_urban": "90",
+    "UA:urban": "50",
+    "UA:rural": "90",
+    "UA:living_street": "20",
+    "UA:trunk": "110",
+    "UA:motorway": "130",
+    "UK:motorway": "70 mph",
+    "UK:nsl_dual": "70 mph",
+    "UK:nsl_single": "60 mph",
+    "UZ:urban": "70",
+    "UZ:rural": "100",
+    "UZ:living_street": "30",
+    "UZ:motorway": "110",
+}
+"""
+Mapping for implicit maxspeeds.
+
+The mapping is incomplete (see Notes section). Mostly taken from [1].
+
+Notes:
+    Consider using better (full) table in machine readable format available in [2].
+
+References:
+    [1] https://wiki.openstreetmap.org/wiki/Key:maxspeed#Implicit_maxspeed_values
+    [2] https://wiki.openstreetmap.org/wiki/Default_speed_limits
+"""
diff --git a/srai/loaders/osm_way_loader/osm_way_loader.py b/srai/loaders/osm_way_loader/osm_way_loader.py
new file mode 100644
index 00000000..ac6f9343
--- /dev/null
+++ b/srai/loaders/osm_way_loader/osm_way_loader.py
@@ -0,0 +1,373 @@
+"""
+OSM Way loader.
+
+This module contains osm loader implementation for ways based on OSMnx.
+"""
+import logging
+from enum import Enum
+from typing import Any, Dict, List, Optional, Tuple, Union
+
+import geopandas as gpd
+import numpy as np
+import pandas as pd
+import shapely.geometry as shpg
+from functional import seq
+from tqdm.auto import tqdm
+
+from srai.constants import WGS84_CRS
+from srai.exceptions import LoadedDataIsEmptyException
+from srai.utils._optional import import_optional_dependencies
+
+from . import constants
+
+logger = logging.getLogger(__name__)
+
+
+class NetworkType(str, Enum):
+    """
+    Type of the street network.
+
+    See [1] for more details.
+
+    References:
+        [1] https://osmnx.readthedocs.io/en/stable/osmnx.html#osmnx.graph.graph_from_place
+    """
+
+    ALL_PRIVATE = "all_private"
+    ALL = "all"
+    BIKE = "bike"
+    DRIVE = "drive"
+    DRIVE_SERVICE = "drive_service"
+    WALK = "walk"
+
+
+class OSMWayLoader:
+    """
+    OSMWayLoader downloads road infrastructure from OSM.
+
+    OSMWayLoader loader is a wrapper for the `osmnx.graph_from_polygon()`
+    and `osmnx.graph_to_gdfs()` that simplifies obtaining the road infrastructure data
+    from OpenStreetMap. As the OSM data is often noisy, it can also take an opinionated approach
+    to preprocessing it, with standardisation in mind - e.g. unification of units,
+    discarding non-wiki values and rounding them.
+    """
+
+    def __init__(
+        self,
+        network_type: Union[NetworkType, str],
+        contain_within_area: bool = False,
+        preprocess: bool = True,
+        wide: bool = True,
+        osm_way_tags: Dict[str, List[str]] = constants.OSM_WAY_TAGS,
+    ) -> None:
+        """
+        Init OSMWayLoader.
+
+        Args:
+            network_type (Union[NetworkType, str]):
+                Type of the network to download.
+            contain_within_area (bool): defaults to False
+                Whether to remove the roads that have one of their nodes outside of the given area.
+            preprocess (bool): defaults to True
+                Whether to preprocess the data.
+            wide (bool): defaults to True
+                Whether to return the roads in wide format.
+            osm_way_tags (List[str]): defaults to constants.OSM_WAY_TAGS
+                Dict of tags to take into consideration during computing.
+        """
+        import_optional_dependencies(dependency_group="osm", modules=["osmnx"])
+
+        self.network_type = network_type
+        self.contain_within_area = contain_within_area
+        self.preprocess = preprocess
+        self.wide = wide
+        self.osm_keys = list(osm_way_tags.keys())
+        self.osm_tags_flat = (
+            seq(osm_way_tags.items())
+            .flat_map(lambda x: [f"{x[0]}-{v}" if x[0] not in ("oneway") else x[0] for v in x[1]])
+            .distinct()
+            .to_list()
+        )
+
+    def load(self, area: gpd.GeoDataFrame) -> Tuple[gpd.GeoDataFrame, gpd.GeoDataFrame]:
+        """
+        Load road infrastructure for a given GeoDataFrame.
+
+        Args:
+            area (gpd.GeoDataFrame): (Multi)Polygons for which to download road infrastructure data.
+
+        Raises:
+            ValueError: If provided GeoDataFrame has no crs defined.
+            ValueError: If provided GeoDataFrame is empty.
+            TypeError: If provided geometries are not of type Polygon or MultiPolygon.
+            LoadedDataIsEmptyException: If none of the supplied area polygons contains
+                any road infrastructure data.
+
+        Returns:
+            Tuple[gpd.GeoDataFrame, gpd.GeoDataFrame]: Road infrastructure as (intersections, roads)
+        """
+        import osmnx as ox
+
+        ox.settings.useful_tags_way = constants.OSMNX_WAY_KEYS
+        ox.settings.timeout = constants.OSMNX_TIMEOUT
+
+        if area.empty:
+            raise ValueError("Provided `area` GeoDataFrame is empty.")
+
+        gdf_wgs84 = area.to_crs(crs=WGS84_CRS)
+
+        gdf_nodes_raw, gdf_edges_raw = self._graph_from_gdf(gdf_wgs84)
+        if gdf_edges_raw.empty or gdf_edges_raw.empty:
+            raise LoadedDataIsEmptyException(
+                "It can happen when there is no road infrastructure in the given area."
+            )
+
+        gdf_edges = self._explode_cols(gdf_edges_raw)
+
+        if self.preprocess:
+            self._preprocess(gdf_edges, inplace=True)
+
+        if self.wide:
+            gdf_edges = self._to_wide(gdf_edges_raw, gdf_edges)
+
+        return gdf_nodes_raw, gdf_edges
+
+    def _graph_from_gdf(self, gdf: gpd.GeoDataFrame) -> Tuple[gpd.GeoDataFrame, gpd.GeoDataFrame]:
+        """
+        Obtain the raw road infrastructure data from OSM.
+
+        Args:
+            gss (gpd.GeoDataFrame): (Multi)Polygons for which to download road infrastructure data.
+
+        Returns:
+            Tuple[gpd.GeoDataFrame, gpd.GeoDataFrame]: Road infrastructure as (intersections, roads)
+        """
+        nodes = []
+        edges = []
+        for polygon in tqdm(gdf["geometry"], desc="Downloading graphs", leave=False):
+            gdf_n, gdf_e = self._try_graph_from_polygon(polygon)
+
+            if not gdf_e.empty and not self.contain_within_area:
+                # perform cleaning of edges outside of an area that were incorrectly added,
+                # it occures when two nodes outside of an area happen to be connected by an edge
+                gdf_e = gdf_e.sjoin(
+                    gpd.GeoDataFrame(geometry=[polygon], crs=WGS84_CRS),
+                    how="inner",
+                    predicate="intersects",
+                ).drop(columns="index_right")
+
+            nodes.append(gdf_n)
+            edges.append(gdf_e)
+
+        gdf_nodes = pd.concat(nodes, axis=0)
+        gdf_edges = pd.concat(edges, axis=0)
+
+        # remove duplicates, cannot use drop_duplicates()
+        # because some columns contain unhashable type `list`
+        gdf_nodes = gdf_nodes[~gdf_nodes.astype(str).duplicated()]
+        gdf_edges = gdf_edges[~gdf_edges.astype(str).duplicated()]
+
+        return gdf_nodes, gdf_edges
+
+    def _try_graph_from_polygon(
+        self, polygon: Union[shpg.Polygon, shpg.MultiPolygon]
+    ) -> Tuple[gpd.GeoDataFrame, gpd.GeoDataFrame]:
+        """
+        Try obtaining the raw road infrastructure data from OSM for a single polygon using `osmnx`.
+
+        If `osmnx` fails, then just return the empty result.
+
+        Args:
+            polygon (Union[shapely.geometry.Polygon, shapely.geometry.MultiPolygon]):
+                Polygon for which to download road infrastructure data.
+
+        Returns:
+            Tuple[gpd.GeoDataFrame, gpd.GeoDataFrame]: Road infrastructure as (intersections, roads)
+        """
+        import osmnx._errors
+
+        try:
+            return self._graph_from_polygon(polygon)
+        except (osmnx._errors.EmptyOverpassResponse, ValueError):
+            return gpd.GeoDataFrame(), gpd.GeoDataFrame()
+
+    def _graph_from_polygon(
+        self, polygon: Union[shpg.Polygon, shpg.MultiPolygon]
+    ) -> Tuple[gpd.GeoDataFrame, gpd.GeoDataFrame]:
+        """
+        Obtain the raw road infrastructure data from OSM for a single polygon.
+
+        Args:
+            polygon (Union[shapely.geometry.Polygon, shapely.geometry.MultiPolygon]):
+                Polygon for which to download road infrastructure data.
+
+        Notes:
+            * The road infrastructure graph is treated as an undirected graph.
+
+        Returns:
+            Tuple[gpd.GeoDataFrame, gpd.GeoDataFrame]: Road infrastructure as (intersections, roads)
+        """
+        import osmnx as ox
+
+        G_directed = ox.graph_from_polygon(
+            polygon,
+            network_type=self.network_type,
+            retain_all=True,
+            clean_periphery=True,
+            truncate_by_edge=(not self.contain_within_area),
+        )
+
+        G_undirected = ox.utils_graph.get_undirected(G_directed)
+        gdf_n, gdf_e = ox.graph_to_gdfs(G_undirected)
+
+        return gdf_n, gdf_e
+
+    def _explode_cols(self, gdf: gpd.GeoDataFrame) -> gpd.GeoDataFrame:
+        """
+        Explode lists in feature columns.
+
+        Args:
+            gdf (gpd.GeoDataFrame): Edges with columns to explode.
+
+        Returns:
+            gpd.GeoDataFrame: Edges with all of their columns exploded.
+        """
+        for col in self.osm_keys:
+            if col not in gdf.columns:
+                gdf = gdf.assign(**{col: None})
+            gdf = gdf.explode(col)
+
+        gdf["i"] = range(0, len(gdf))
+        gdf.set_index("i", append=True, inplace=True)
+
+        return gdf
+
+    def _preprocess(
+        self, gdf: gpd.GeoDataFrame, inplace: bool = False
+    ) -> Optional[gpd.GeoDataFrame]:
+        """
+        Preprocess edges.
+
+        Args:
+            gdf (gpd.GeoDataFrame): Edges to preprocess.
+            inplace (bool): defaults to False.
+
+        Returns:
+            gpd.GeoDataFrame: Edges with preprocessed features.
+        """
+        if not inplace:
+            gdf = gdf.copy()
+
+        max_osm_keys_str_len = max(map(len, self.osm_keys))
+        for col in (pbar := tqdm(self.osm_keys, leave=False)):
+            pbar.set_description(f"Preprocessing {col:{max_osm_keys_str_len}}")
+            gdf[col] = gdf[col].apply(lambda x, c=col: self._sanitize_and_normalize(x, c))
+
+        return gdf if not inplace else None
+
+    def _sanitize_and_normalize(self, x: Any, column_name: str) -> str:
+        return self._normalize(self._sanitize(str(x), column_name), column_name)
+
+    def _normalize(self, x: Any, column_name: str) -> str:
+        try:
+            if x is None:
+                return "None"
+            elif column_name == "lanes":
+                x = min(x, 15)
+            elif column_name == "maxspeed":
+                if x <= 0:
+                    x = 0
+                elif x <= 5:
+                    x = 5
+                elif x <= 7:
+                    x = 7
+                elif x <= 10:
+                    x = 10
+                elif x <= 15:
+                    x = 15
+                else:
+                    x = min(int(round(x / 10) * 10), 200)
+            elif column_name == "width":
+                x = min(round(x * 2) / 2, 30.0)
+        except Exception as e:
+            logger.warning(
+                f"{OSMWayLoader._normalize.__qualname__} | {column_name}: {x} - {type(x)} | {e}."
+                " Returning 'None'"
+            )
+            return "None"
+
+        return str(x)
+
+    def _sanitize(self, x: Any, column_name: str) -> Any:
+        if x in ("", "none", "None", np.nan, "nan", "NaN", None):
+            return None
+
+        try:
+            if column_name == "lanes":
+                x = int(float(x))
+            elif column_name == "maxspeed":
+                if x in ("signals", "variable"):
+                    return None
+
+                if x in constants.OSM_IMPLICIT_MAXSPEEDS:
+                    x = constants.OSM_IMPLICIT_MAXSPEEDS[x]
+
+                x = x.replace("km/h", "")
+                if "mph" in x:
+                    x = float(x.split("mph")[0].strip())
+                    x = x * constants.MPH_TO_KMH
+                x = float(x)
+            elif column_name == "width":
+                if x.endswith("m") or x.endswith("meter"):
+                    x = x.split("m")[0].strip()
+                elif "'" in x:
+                    x = float(x.split("'")[0].strip())
+                    x = x * constants.INCHES_TO_METERS
+                elif x.endswith("ft"):
+                    x = float(x.split("ft")[0].strip())
+                    x = x * constants.FEET_TO_METERS
+                x = float(x)
+
+        except Exception as e:
+            logger.warning(
+                f"{OSMWayLoader._sanitize.__qualname__} | {column_name}: {x} - {type(x)} | {e}."
+                " Returning None"
+            )
+            return None
+
+        return x
+
+    def _to_wide(self, gdf: gpd.GeoDataFrame, gdf_exploded: gpd.GeoDataFrame) -> gpd.GeoDataFrame:
+        """
+        Convert edges in long format to wide.
+
+        Args:
+            gdf (gpd.GeoDataFrame): original edges.
+            gdf_exploded (gpd.GeoDataFrame): edges with columns after feature explosion.
+
+        Returns:
+            gpd.GeoDataFrame: Edges in wide format.
+        """
+        gdf_edges_wide = (
+            pd.get_dummies(gdf_exploded[self.osm_keys], prefix_sep="-")
+            .droplevel(3)
+            .groupby(level=[0, 1, 2])
+            .max()
+            .astype(np.uint8)
+            .reindex(columns=self.osm_tags_flat, fill_value=0)
+            .astype(np.uint8)
+        )
+
+        osm_keys_to_drop = [k for k in self.osm_keys if k in gdf.columns]
+        gdf_edges_wide = gpd.GeoDataFrame(
+            pd.concat(
+                [
+                    gdf.drop(columns=osm_keys_to_drop),
+                    gdf_edges_wide,
+                ],
+                axis=1,
+            ),
+            crs=WGS84_CRS,
+        )
+
+        return gdf_edges_wide


Test patch:
diff --git a/tests/loaders/osm_way_loader/files/1f0fafc11b7ab7aea5124d2a89c634fc.pkl b/tests/loaders/osm_way_loader/files/1f0fafc11b7ab7aea5124d2a89c634fc.pkl
new file mode 100644
index 00000000..b21a7532
Binary files /dev/null and b/tests/loaders/osm_way_loader/files/1f0fafc11b7ab7aea5124d2a89c634fc.pkl differ
diff --git a/tests/loaders/osm_way_loader/files/20c9119c4dcc233c37382696f483239e.pkl b/tests/loaders/osm_way_loader/files/20c9119c4dcc233c37382696f483239e.pkl
new file mode 100644
index 00000000..f81d89cd
Binary files /dev/null and b/tests/loaders/osm_way_loader/files/20c9119c4dcc233c37382696f483239e.pkl differ
diff --git a/tests/loaders/osm_way_loader/files/4310fe8d3c435f2a83fac55fc79f9166.pkl b/tests/loaders/osm_way_loader/files/4310fe8d3c435f2a83fac55fc79f9166.pkl
new file mode 100644
index 00000000..941064cf
Binary files /dev/null and b/tests/loaders/osm_way_loader/files/4310fe8d3c435f2a83fac55fc79f9166.pkl differ
diff --git a/tests/loaders/osm_way_loader/files/7be5387a594790ea98ef0bd07bfcb58e.pkl b/tests/loaders/osm_way_loader/files/7be5387a594790ea98ef0bd07bfcb58e.pkl
new file mode 100644
index 00000000..4647ba5f
Binary files /dev/null and b/tests/loaders/osm_way_loader/files/7be5387a594790ea98ef0bd07bfcb58e.pkl differ
diff --git a/tests/loaders/osm_way_loader/files/97e1befc51831ce8f8f482077f5042f2.pkl b/tests/loaders/osm_way_loader/files/97e1befc51831ce8f8f482077f5042f2.pkl
new file mode 100644
index 00000000..49bfe7bf
Binary files /dev/null and b/tests/loaders/osm_way_loader/files/97e1befc51831ce8f8f482077f5042f2.pkl differ
diff --git a/tests/loaders/osm_way_loader/files/eebaa127015feec3e21491d4c32e4efe.pkl b/tests/loaders/osm_way_loader/files/eebaa127015feec3e21491d4c32e4efe.pkl
new file mode 100644
index 00000000..61e577ca
Binary files /dev/null and b/tests/loaders/osm_way_loader/files/eebaa127015feec3e21491d4c32e4efe.pkl differ
diff --git a/tests/loaders/osm_way_loader/test_osm_way_loader.py b/tests/loaders/osm_way_loader/test_osm_way_loader.py
new file mode 100644
index 00000000..1253545a
--- /dev/null
+++ b/tests/loaders/osm_way_loader/test_osm_way_loader.py
@@ -0,0 +1,424 @@
+"""Tests for OSMWayLoader."""
+import hashlib
+import pickle as pkl
+from contextlib import nullcontext as does_not_raise
+from pathlib import Path
+from typing import Any, Dict, Optional, Sequence, Tuple, Union
+from unittest import TestCase
+
+import geopandas as gpd
+import numpy as np
+import osmnx
+import pandas as pd
+import pytest
+import shapely.geometry as shpg
+from parametrization import Parametrization as P
+from pytest_check import check
+from pytest_mock import MockerFixture
+
+from srai.constants import WGS84_CRS
+from srai.exceptions import LoadedDataIsEmptyException
+from srai.loaders.osm_way_loader import NetworkType, OSMWayLoader
+
+ut = TestCase()
+
+
+@pytest.fixture  # type: ignore
+def empty_area_gdf() -> gpd.GeoDataFrame:
+    """Get a gdf with no geometry."""
+    return gpd.GeoDataFrame(crs=WGS84_CRS, geometry=[])
+
+
+@pytest.fixture  # type: ignore
+def no_crs_area_gdf() -> gpd.GeoDataFrame:
+    """Get an example area gdf without crs defined."""
+    polygon = shpg.Polygon([(0, 0), (0, 1), (1, 1), (1, 0)])
+    gdf = gpd.GeoDataFrame({"geometry": [polygon]})
+    return gdf
+
+
+@pytest.fixture  # type: ignore
+def bad_geometry_area_gdf() -> gpd.GeoDataFrame:
+    """Get an example area gdf with unsupported geometry (not Polygon or Multipolygon)."""
+    point = shpg.Point(0, 0)
+    gdf = gpd.GeoDataFrame({"geometry": [point]}, crs=WGS84_CRS)
+    return gdf
+
+
+@pytest.fixture  # type: ignore
+def empty_polygon_area_gdf() -> gpd.GeoDataFrame:
+    """Get an example area gdf where there is no road infrastructure."""
+    polygon = shpg.Polygon([(0, 0), (0, 1), (1, 1), (1, 0)])
+    gdf = gpd.GeoDataFrame({"geometry": [polygon]}, crs=WGS84_CRS)
+    return gdf
+
+
+@pytest.fixture  # type: ignore
+def first_polygon_area_gdf() -> gpd.GeoDataFrame:
+    """Get an example area gdf with one polygon."""
+    polygon = shpg.Polygon(
+        [
+            (17.1005309, 51.1100158),
+            (17.1020436, 51.1100427),
+            (17.1021938, 51.1082509),
+            (17.1006274, 51.1081027),
+            (17.1005201, 51.1099956),
+        ]
+    )
+
+    gdf = gpd.GeoDataFrame({"geometry": [polygon]}, crs=WGS84_CRS)
+    return gdf
+
+
+@pytest.fixture  # type: ignore
+def second_polygon_area_gdf() -> gpd.GeoDataFrame:
+    """Get an example area gdf with one polygon."""
+    polygon = shpg.Polygon(
+        [
+            (17.0994473, 51.1084126),
+            (17.1023226, 51.1086551),
+            (17.1023333, 51.1076312),
+            (17.0994473, 51.1083722),
+        ]
+    )
+
+    gdf = gpd.GeoDataFrame({"geometry": [polygon]}, crs=WGS84_CRS)
+    return gdf
+
+
+@pytest.fixture  # type: ignore
+def multiple_polygons_overlaping_area_gdf(
+    first_polygon_area_gdf: gpd.GeoDataFrame, second_polygon_area_gdf: gpd.GeoDataFrame
+) -> gpd.GeoDataFrame:
+    """Get an example area gdf with two polygons."""
+    return pd.concat([first_polygon_area_gdf, second_polygon_area_gdf], axis=0)
+
+
+@pytest.fixture  # type: ignore
+def multipolygons_area_gdf() -> gpd.GeoDataFrame:
+    """Get an example area gdf with a multipolygon."""
+    polygon1 = shpg.Polygon(
+        [
+            (17.1005309, 51.1100158),
+            (17.1020436, 51.1100427),
+            (17.1021938, 51.1082509),
+            (17.1006274, 51.1081027),
+            (17.1005201, 51.1099956),
+        ]
+    )
+    polygon2 = shpg.Polygon(
+        [
+            (17.0997584, 51.1049434),
+            (17.0995009, 51.1044112),
+            (17.1003485, 51.1043910),
+            (17.0997584, 51.1049434),
+        ]
+    )
+    multipolygon = shpg.MultiPolygon([polygon1, polygon2])
+    return gpd.GeoDataFrame(geometry=[multipolygon], crs=WGS84_CRS)
+
+
+@pytest.fixture  # type: ignore
+def valid_and_empty_polygons_area_gdf(
+    first_polygon_area_gdf: gpd.GeoDataFrame, empty_polygon_area_gdf: gpd.GeoDataFrame
+) -> gpd.GeoDataFrame:
+    """Get an example area gdf with one valid polygon and one without road infrastructure."""
+    return pd.concat([first_polygon_area_gdf, empty_polygon_area_gdf], axis=0)
+
+
+@P.parameters("area_gdf_fixture", "expected_result", "loader_params", "expectation")  # type: ignore
+@P.case(  # type: ignore
+    "Raise when no geometry", "empty_area_gdf", None, None, pytest.raises(ValueError)
+)
+@P.case(  # type: ignore
+    "Raise when no CRS",
+    "no_crs_area_gdf",
+    None,
+    None,
+    pytest.raises(ValueError),
+)
+@P.case(  # type: ignore
+    "Raise when invalid geometry",
+    "bad_geometry_area_gdf",
+    None,
+    None,
+    pytest.raises(TypeError),
+)
+@P.case(  # type: ignore
+    "Raise when no road infrastructure",
+    "empty_polygon_area_gdf",
+    None,
+    None,
+    pytest.raises(LoadedDataIsEmptyException),
+)
+@P.case(  # type: ignore
+    "Return infrastructure when single polygon",
+    "first_polygon_area_gdf",
+    (7, 6),
+    None,
+    does_not_raise(),
+)
+@P.case(  # type: ignore
+    "Return infrastructure when multiple overlapping polygons",
+    "multiple_polygons_overlaping_area_gdf",
+    (7, 6),
+    None,
+    does_not_raise(),
+)
+@P.case(  # type: ignore
+    "Return infrastructure when node without any edges",  # FIXME: shouldn't have a node w/o an edge
+    "multiple_polygons_overlaping_area_gdf",
+    (9, 7),
+    {"network_type": NetworkType.BIKE, "contain_within_area": True},
+    does_not_raise(),
+)
+@P.case(  # type: ignore
+    "Return infrastructure when multipolygon",
+    "multipolygons_area_gdf",
+    (11, 9),
+    None,
+    does_not_raise(),
+)
+@P.case(  # type: ignore
+    "Return infrastructure when correct polygon and polygon with no road infrastructure",
+    "valid_and_empty_polygons_area_gdf",
+    (7, 6),
+    None,
+    does_not_raise(),
+)
+@P.case(  # type: ignore
+    "Return infrastructure without preprocessing",
+    "first_polygon_area_gdf",
+    (7, 6),
+    {"network_type": NetworkType.DRIVE, "preprocess": False},
+    does_not_raise(),
+)
+@P.case(  # type: ignore
+    "Return infrastructure in long format",
+    "first_polygon_area_gdf",
+    (7, 6),
+    {"network_type": NetworkType.DRIVE, "wide": False},
+    does_not_raise(),
+)
+@P.case(  # type: ignore
+    "Return infrastructure when network_type supplied as a string",
+    "first_polygon_area_gdf",
+    (7, 6),
+    {"network_type": "drive", "wide": False},
+    does_not_raise(),
+)
+def test_contract(
+    area_gdf_fixture: str,
+    expected_result: Optional[Tuple[int, int]],
+    loader_params: Optional[Dict[str, Any]],
+    expectation,
+    request: pytest.FixtureRequest,
+    mocker: MockerFixture,
+):
+    """Test `OSMWayLoader.load`'s contract."""
+    if not loader_params:
+        loader_params = {"network_type": NetworkType.DRIVE}
+
+    loader = OSMWayLoader(**loader_params)
+
+    area_gdf = request.getfixturevalue(area_gdf_fixture)
+    nodes_expected_len, edges_expected_len = expected_result or (None, None)
+
+    def patched_graph_from_polygon(*args, **kwargs) -> Any:  # type: ignore
+        polygon = args[0]
+
+        name_hashed = hashlib.md5(f"{polygon.wkt}{list(kwargs.values())}".encode()).hexdigest()
+
+        if name_hashed == "785de42ad57bbe33298128212ef9dd71":
+            raise TypeError
+        elif name_hashed == "de17f3ef99794666b8a16931a9df4e49":
+            raise osmnx._errors.EmptyOverpassResponse
+
+        files_path = Path(__file__).parent / "files"
+        file_name = name_hashed + ".pkl"
+        file_path = files_path / file_name
+
+        with file_path.open("rb") as f:
+            res = pkl.load(f)
+
+        return res
+
+    with expectation:
+        mocker.patch("osmnx.graph_from_polygon", wraps=patched_graph_from_polygon)
+        nodes, edges = loader.load(area_gdf)
+
+        check.equal(len(nodes), nodes_expected_len)
+        check.equal(len(edges), edges_expected_len)
+        check.is_in("geometry", nodes.columns)
+        check.is_in("geometry", edges.columns)
+
+
+@P.parameters("column_name", "input", "expected")  # type: ignore
+@P.case(
+    "Return None when `oneway` is missing",
+    "oneway",
+    ("", "none", "None", np.nan, "nan", "NaN", None),
+    None,
+)  # type: ignore
+@P.case(
+    "Return None when `lanes` is missing",
+    "lanes",
+    ("", "none", "None", np.nan, "nan", "NaN", None),
+    None,
+)  # type: ignore
+@P.case(
+    "Return None when `highway` is missing",
+    "highway",
+    ("", "none", "None", np.nan, "nan", "NaN", None),
+    None,
+)  # type: ignore
+@P.case(
+    "Test lanes",
+    "lanes",
+    [-1, 0, 1, 14, 15, 16, 17, 100, 3.7, "a", "2"],
+    [-1, 0, 1, 14, 15, 15, 15, 15, 3, None, 2],
+)  # type: ignore
+@P.case(  # type: ignore
+    "Test maxspeed",
+    "maxspeed",
+    [
+        -1,
+        0,
+        1,
+        4,
+        5,
+        6,
+        7,
+        8,
+        9,
+        10,
+        11,
+        14,
+        15,
+        16,
+        17,
+        44,
+        45,
+        46,
+        199,
+        200,
+        201,
+        300,
+        6.7,
+        "3",
+        "4.5 km/h",
+        "4.5km/h",
+        "3mph",
+        "4 mph",
+        "signals",
+        "variable",
+        "CZ:pedestrian_zone",
+    ],
+    [
+        0,
+        0,
+        5,
+        5,
+        5,
+        7,
+        7,
+        10,
+        10,
+        10,
+        15,
+        15,
+        15,
+        20,
+        20,
+        40,
+        40,
+        50,
+        200,
+        200,
+        200,
+        200,
+        7,
+        5,
+        5,
+        5,
+        5,
+        7,
+        None,
+        None,
+        20,
+    ],
+)
+@P.case(
+    "Test width",
+    "width",
+    [
+        -1.3,
+        -1,
+        0,
+        1,
+        2,
+        1.0,
+        4.4,
+        4.5,
+        4.6,
+        29,
+        30,
+        31,
+        40,
+        100,
+        "4.6",
+        "12m",
+        "12 m",
+        "12meter",
+        "12 meter",
+        "130.4'",
+        "130.4 '",
+        "25.4ft",
+        "25.4 ft",
+    ],
+    [
+        -1.5,
+        -1.0,
+        0.0,
+        1.0,
+        2.0,
+        1.0,
+        4.5,
+        4.5,
+        4.5,
+        29.0,
+        30.0,
+        30.0,
+        30.0,
+        30.0,
+        4.5,
+        12.0,
+        12.0,
+        12.0,
+        12.0,
+        3.5,
+        3.5,
+        7.5,
+        7.5,
+    ],
+)  # type: ignore
+def test_preprocessing(
+    column_name: str, input: Union[Any, Sequence[Any]], expected: Union[Any, Sequence[Any]]
+) -> None:
+    """Test `OSMWayLoader._sanitize_and_normalize()` preprocessing."""
+    loader = OSMWayLoader(network_type=NetworkType.DRIVE)
+
+    input = list(input) if isinstance(input, Sequence) else [input]
+    expected = list(expected) if isinstance(expected, Sequence) else [expected]
+
+    if len(expected) == 1:
+        expected = expected * len(input)
+
+    if len(expected) != len(input):
+        raise ValueError(
+            f"Mismatch in length between input {len(input)} and expected {len(expected)}."
+        )
+
+    for x, y in zip(input, expected):
+        result = loader._sanitize_and_normalize(x, column_name)
+        check.equal(result, str(y))